diff --git a/.github/workflows/chart-lint-publish.yml b/.github/workflows/chart-lint-publish.yml new file mode 100644 index 00000000000..c8d6ba3bd31 --- /dev/null +++ b/.github/workflows/chart-lint-publish.yml @@ -0,0 +1,62 @@ +name: Validate / Publish helm charts + +on: + release: + types: [published] + pull_request: + types: [opened, reopened, synchronize] + paths: + - 'helm/**' + workflow_dispatch: + inputs: + IGNORE_CHARTS: + description: 'Provide list of charts to be ignored separated by pipe(|)' + required: false + default: '""' + type: string + CHART_PUBLISH: + description: 'Chart publishing to gh-pages branch' + required: false + default: 'NO' + type: string + options: + - YES + - NO + INCLUDE_ALL_CHARTS: + description: 'Include all charts for Linting/Publishing (YES/NO)' + required: false + default: 'NO' + type: string + options: + - YES + - NO + push: + branches: + - '!release-branch' + - '!master' + - 1.* + - 0.* + - develop + - release* + paths: + - 'helm/**' + +jobs: + chart-lint-publish: + uses: mosip/kattu/.github/workflows/chart-lint-publish.yml@master + with: + CHARTS_DIR: ./helm + CHARTS_URL: https://mosip.github.io/mosip-helm + REPOSITORY: mosip-helm + BRANCH: gh-pages + INCLUDE_ALL_CHARTS: "${{ inputs.INCLUDE_ALL_CHARTS || 'NO' }}" + IGNORE_CHARTS: "${{ inputs.IGNORE_CHARTS || '\"\"' }}" + CHART_PUBLISH: "${{ inputs.CHART_PUBLISH || 'YES' }}" + LINTING_CHART_SCHEMA_YAML_URL: "https://raw.githubusercontent.com/mosip/kattu/master/.github/helm-lint-configs/chart-schema.yaml" + LINTING_LINTCONF_YAML_URL: "https://raw.githubusercontent.com/mosip/kattu/master/.github/helm-lint-configs/lintconf.yaml" + LINTING_CHART_TESTING_CONFIG_YAML_URL: "https://raw.githubusercontent.com/mosip/kattu/master/.github/helm-lint-configs/chart-testing-config.yaml" + LINTING_HEALTH_CHECK_SCHEMA_YAML_URL: "https://raw.githubusercontent.com/mosip/kattu/master/.github/helm-lint-configs/health-check-schema.yaml" + DEPENDENCIES: "mosip,https://mosip.github.io/mosip-helm;" + secrets: + TOKEN: ${{ secrets.ACTION_PAT }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/db-test.yml b/.github/workflows/db-test.yml new file mode 100644 index 00000000000..d051796d65f --- /dev/null +++ b/.github/workflows/db-test.yml @@ -0,0 +1,37 @@ +name: PostgreSQL Test + +on: + release: + types: [published] + pull_request: + types: [opened, reopened, synchronize] + workflow_dispatch: + inputs: + message: + description: 'Message for manually triggering' + required: false + default: 'Triggered for Updates' + type: string + push: + branches: + - '!release-branch' + - release* + - master + - 1.* + - develop* + - MOSIP* + paths: + - 'db_scripts/**' + +jobs: + build-db-test: + strategy: + matrix: + include: + - DB_LOCATION: 'db_scripts/mosip_resident' + DB_NAME: 'mosip_resident' + fail-fast: false + name: ${{ matrix.DB_NAME }} + uses: mosip/kattu/.github/workflows/db-test.yml@master + with: + DB_LOCATION: ${{ matrix.DB_LOCATION}} diff --git a/.github/workflows/push-trigger.yml b/.github/workflows/push-trigger.yml new file mode 100644 index 00000000000..5c94029f6cd --- /dev/null +++ b/.github/workflows/push-trigger.yml @@ -0,0 +1,180 @@ +name: Maven Package upon a push + +on: + release: + types: [published] + pull_request: + types: [opened, reopened, synchronize] + workflow_dispatch: + inputs: + message: + description: 'Message for manually triggering' + required: false + default: 'Triggered for Updates' + type: string + push: + branches: + - '!release-branch' + - release-1* + - master + - 1.* + - develop + - MOSIP* + +jobs: + build-maven-resident-services: + uses: mosip/kattu/.github/workflows/maven-build.yml@master + with: + SERVICE_LOCATION: ./resident + BUILD_ARTIFACT: resident-services + secrets: + OSSRH_USER: ${{ secrets.OSSRH_USER }} + OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + GPG_SECRET: ${{ secrets.GPG_SECRET }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + publish_to_nexus: + if: "${{ !contains(github.ref, 'master') && github.event_name != 'pull_request' && github.event_name != 'release' && github.event_name != 'prerelease' && github.event_name != 'publish' }}" + needs: build-maven-resident-services + uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master + with: + SERVICE_LOCATION: ./resident + secrets: + OSSRH_USER: ${{ secrets.OSSRH_USER }} + OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} + OSSRH_URL: ${{ secrets.OSSRH_CENTRAL_URL }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + GPG_SECRET: ${{ secrets.GPG_SECRET }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + build-dockers: + needs: build-maven-resident-services + strategy: + matrix: + include: + - SERVICE_LOCATION: 'resident/resident-service' + SERVICE_NAME: 'resident-service' + BUILD_ARTIFACT: 'resident-services' + fail-fast: false + name: ${{ matrix.SERVICE_NAME }} + uses: mosip/kattu/.github/workflows/docker-build.yml@master + with: + SERVICE_LOCATION: ${{ matrix.SERVICE_LOCATION }} + SERVICE_NAME: ${{ matrix.SERVICE_NAME }} + BUILD_ARTIFACT: ${{ matrix.BUILD_ARTIFACT }} + secrets: + DEV_NAMESPACE_DOCKER_HUB: ${{ secrets.DEV_NAMESPACE_DOCKER_HUB }} + ACTOR_DOCKER_HUB: ${{ secrets.ACTOR_DOCKER_HUB }} + RELEASE_DOCKER_HUB: ${{ secrets.RELEASE_DOCKER_HUB }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + sonar_analysis: + needs: build-maven-resident-services + if: "${{ github.event_name != 'pull_request' }}" + uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master + with: + SERVICE_LOCATION: ./resident + secrets: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + ORG_KEY: ${{ secrets.ORG_KEY }} + OSSRH_USER: ${{ secrets.OSSRH_USER }} + OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + GPG_SECRET: ${{ secrets.GPG_SECRET }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + build-maven-apitest-resident: + uses: mosip/kattu/.github/workflows/maven-build.yml@master-java21 + with: + SERVICE_LOCATION: ./api-test + BUILD_ARTIFACT: apitest-resident + secrets: + OSSRH_USER: ${{ secrets.OSSRH_USER }} + OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + GPG_SECRET: ${{ secrets.GPG_SECRET }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + publish_to_nexus_apitest: + if: "${{ !contains(github.ref, 'master') && github.event_name != 'pull_request' && github.event_name != 'release' && github.event_name != 'prerelease' && github.event_name != 'publish' }}" + needs: build-maven-apitest-resident + uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master-java21 + with: + SERVICE_LOCATION: ./api-test + secrets: + OSSRH_USER: ${{ secrets.OSSRH_USER }} + OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} + OSSRH_URL: ${{ secrets.OSSRH_CENTRAL_URL }} + OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} + GPG_SECRET: ${{ secrets.GPG_SECRET }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + + build-apitest-resident-local: + needs: build-maven-apitest-resident + runs-on: ubuntu-latest + env: + NAMESPACE: ${{ secrets.dev_namespace_docker_hub }} + SERVICE_NAME: apitest-resident + SERVICE_LOCATION: api-test + BUILD_ARTIFACT: apitest-resident-local + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 21 + server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + - name: Setup the settings file for ossrh server + run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml + - name: Build Automationtests with Maven + run: | + cd ${{ env.SERVICE_LOCATION}} + mvn clean package -s $GITHUB_WORKSPACE/settings.xml + - name: Copy configuration files to target directory. + run: | + cp -r ${{ env.SERVICE_LOCATION}}/target/classes/config ${{ env.SERVICE_LOCATION}}/target/config + cp -r ${{ env.SERVICE_LOCATION}}/testNgXmlFiles ${{ env.SERVICE_LOCATION}}/target/testNgXmlFiles + - name: Ready the springboot artifacts + if: ${{ !contains(github.ref, 'master') || !contains(github.ref, 'main') }} + run: | + ## FIND JARS & COPY ONLY EXECUTABLE JARs STORED UNDER TARGET DIRECTORY + find ${{ env.SERVICE_LOCATION }} -path '*/target/*' -exec zip ${{ env.BUILD_ARTIFACT }}.zip {} + + - name: Upload the springboot jars + if: ${{ !contains(github.ref, 'master') || !contains(github.ref, 'main') }} + uses: actions/upload-artifact@v4 + with: + name: ${{ env.BUILD_ARTIFACT }} + path: ${{ env.BUILD_ARTIFACT }}.zip + - uses: 8398a7/action-slack@v3 + with: + status: ${{ job.status }} + fields: repo,message,author,commit,workflow,job # selectable (default: repo,message) + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required + if: failure() # Pick up events even if the job fails or is canceled. + + build-dockers_apitest_resident: + needs: build-apitest-resident-local + strategy: + matrix: + include: + - SERVICE_LOCATION: 'api-test' + SERVICE_NAME: 'apitest-resident' + BUILD_ARTIFACT: 'apitest-resident-local' + ONLY_DOCKER: true + fail-fast: false + name: ${{ matrix.SERVICE_NAME }} + uses: mosip/kattu/.github/workflows/docker-build.yml@master-java21 + with: + SERVICE_LOCATION: ${{ matrix.SERVICE_LOCATION }} + SERVICE_NAME: ${{ matrix.SERVICE_NAME }} + BUILD_ARTIFACT: ${{ matrix.BUILD_ARTIFACT }} + ONLY_DOCKER: ${{ matrix.ONLY_DOCKER }} + secrets: + DEV_NAMESPACE_DOCKER_HUB: ${{ secrets.DEV_NAMESPACE_DOCKER_HUB }} + ACTOR_DOCKER_HUB: ${{ secrets.ACTOR_DOCKER_HUB }} + RELEASE_DOCKER_HUB: ${{ secrets.RELEASE_DOCKER_HUB }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} \ No newline at end of file diff --git a/.github/workflows/push_trigger.yml b/.github/workflows/push_trigger.yml deleted file mode 100644 index 5beeb71ea48..00000000000 --- a/.github/workflows/push_trigger.yml +++ /dev/null @@ -1,241 +0,0 @@ - -name: Maven Package upon a push - -on: - push: - branches: - - '!release-branch' - - release-1* - - master - - 1.* - - develop -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd resident - mvn -B package --file pom.xml -s $GITHUB_WORKSPACE/settings.xml - env: - GPG_TTY: $(tty) - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Upload the springboot jars - uses: actions/upload-artifact@v1 - with: - name: release - path: ./release.zip - - - name: Analyze with SonarCloud - run: | - cd resident - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_${{ github.event.repository.name }} -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,workflow,job # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required - if: failure() # Pick up events even if the job fails or is canceled. - - - publish_to_nexus: - if: "!contains(github.ref, 'master')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.RELEASE_USER}} ${{secrets.RELEASE_TOKEN}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Build with Maven - run: cd resident && mvn -B package --file pom.xml -s $GITHUB_WORKSPACE/settings.xml - - - name: Publish the maven package - run: | - cd resident && mvn deploy -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) - - - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,workflow,job # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required - if: failure() # Pick up events even if the job fails or is canceled. - - docker-resident-service: - needs: build - runs-on: ubuntu-latest - env: - NAMESPACE: ${{ secrets.dev_namespace_docker_hub }} - SERVICE_NAME: resident-service - SERVICE_LOCATION: resident/resident-service - steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v1 - with: - name: release - path: ./ - - - name: Setup branch and version - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - - - name: Get version info from pom - id: getPomVersion - uses: mavrosxristoforos/get-xml-info@1.0 - with: - xml-file: ./${{ env.SERVICE_LOCATION }}/pom.xml - xpath: /*[local-name()="project"]/*[local-name()="version"] - - - name: Unzip and extract the resident-service - run: unzip -uj "release.zip" "${{ env.SERVICE_LOCATION }}/target/*" -d "./${{ env.SERVICE_LOCATION }}/target" - - - name: Build image - run: | - cd "./${{env.SERVICE_LOCATION}}" - docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} - - - name: Log into registry - run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin - - - name: Push image - run: | - IMAGE_ID=$NAMESPACE/$SERVICE_NAME - - # Change all uppercase to lowercase - IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - echo "push version ${{steps.getPomVersion.outputs.info}}" - if [[ $BRANCH_NAME == master ]]; then - VERSION=latest - else - VERSION=$BRANCH_NAME - fi - echo IMAGE_ID=$IMAGE_ID - echo VERSION=$VERSION - docker tag $SERVICE_NAME $IMAGE_ID:$VERSION - docker push $IMAGE_ID:$VERSION - - - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,workflow,job # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required - if: failure() # Pick up events even if the job fails or is canceled. - - sonar_analysis: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Analyze with SonarCloud - run: | - cd resident - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_${{ github.event.repository.name }} -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,workflow,job # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEVOPS_WEBHOOK }} # required - if: failure() # Pick up events even if the job fails or is canceled. diff --git a/.github/workflows/release_changes.yml b/.github/workflows/release_changes.yml deleted file mode 100644 index cc9c2956d9e..00000000000 --- a/.github/workflows/release_changes.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: Release/pre-release Preparation. - -on: - workflow_dispatch: - inputs: - message: - description: 'Triggered for release or pe-release' - required: false - default: 'Release Preparation' - releaseTags: - description: 'tag to update' - required: true - snapshotTags: - description: 'tag to be replaced' - required: true - base: - description: 'base branch for PR' - required: true -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Mannualy changing the pom versions - run: find . -type f -name "*pom.xml" -print0 | xargs -0 sed -i "s/${{ github.event.inputs.snapshotTags }}/${{ github.event.inputs.releaseTags }}/g" - - - name: Updating the Release URL in POM - run: | - cd .github/workflows - sed -i 's/OSSRH_SNAPSHOT_URL/RELEASE_URL/g' push_trigger.yml - - - name: Updating libs-snapshot-local to libs-release local for artifactory URL's. - run: find . -type f -name "*Dockerfile" -print0 | xargs -0 sed -i "s/libs-snapshot-local/libs-release-local/g" - - - name: removing -DskipTests - run: find . -type f -name "*push_trigger.yml" -print0 | xargs -0 sed -i "s/"-DskipTests"//g" - -# - name: removing --Dgpg.skip -# run: find . -type f -name "*push_trigger.yml" -print0 | xargs -0 sed -i "s/"-Dgpg.skip"//g" - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.ACTION_PAT }} - commit-message: Updated Pom versions for release changes - title: Release changes - body: Automated PR for ${{ github.event.inputs.releaseTags }} release. - branch: release-branch - delete-branch: true - base: ${{ github.event.inputs.base }} diff --git a/.github/workflows/release_trigger.yml b/.github/workflows/release_trigger.yml deleted file mode 100644 index 13ad7706654..00000000000 --- a/.github/workflows/release_trigger.yml +++ /dev/null @@ -1,166 +0,0 @@ -name: Release maven packages and docker upon a release - -on: - release: - types: [published] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo "::set-env name=BRANCH_NAME::$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" - echo ${{ env.BRANCH_NAME }} - echo "::set-env name=GPG_TTY::$(tty)" - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd resident - mvn -B package --file pom.xml -s $GITHUB_WORKSPACE/settings.xml - - env: - GPG_TTY: $(tty) - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Upload the springboot jars - uses: actions/upload-artifact@v1 - with: - name: release - path: ./release.zip - - publish_to_nexus: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo "::set-env name=BRANCH_NAME::$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" - echo ${{ env.BRANCH_NAME }} - echo "::set-env name=GPG_TTY::$(tty)" - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Build with Maven - run: cd resident && mvn -B package --file pom.xml -s $GITHUB_WORKSPACE/settings.xml - - - name: Publish the maven package - run: | - chmod +x ./deploy.sh - ./deploy.sh resident $GITHUB_WORKSPACE/settings.xml .* - env: - GITHUB_TOKEN: ${{ secrets.access_token }} - GPG_TTY: $(tty) - - name: Analyze with SonarCloud - run: | - cd resident - mvn -B verify sonar:sonar -Dsonar.projectKey=${{ secrets.PROJECT_KEY }} -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - docker-resident-service: - needs: build - - runs-on: ubuntu-latest - env: - NAMESPACE: ${{ secrets.dev_namespace_docker_hub }} - SERVICE_NAME: resident-service - SERVICE_LOCATION: resident/resident-service - - steps: - - uses: actions/checkout@v2 - - uses: actions/download-artifact@v1 - with: - name: release - path: ./ - - - name: Setup branch and version - run: | - echo "::set-env name=BRANCH_NAME::$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" - echo ${{ env.BRANCH_NAME }} - - - name: Get version info from pom - id: getPomVersion - uses: mavrosxristoforos/get-xml-info@1.0 - with: - xml-file: ./${{ env.SERVICE_LOCATION }}/pom.xml - xpath: /*[local-name()="project"]/*[local-name()="version"] - - - name: Unzip and extract the resident-service - run: unzip -uj "release.zip" "${{ env.SERVICE_LOCATION }}/target/*" -d "./${{ env.SERVICE_LOCATION }}/target" - - - name: Build image - run: | - cd "./${{env.SERVICE_LOCATION}}" - docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} - - name: Log into registry - run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin - - - name: Push image - run: | - IMAGE_ID=$NAMESPACE/$SERVICE_NAME - - # Change all uppercase to lowercase - IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - echo "push version ${{steps.getPomVersion.outputs.info}}" - VERSION=$BRANCH_NAME - echo IMAGE_ID=$IMAGE_ID - echo VERSION=$VERSION - docker tag $SERVICE_NAME $IMAGE_ID:$VERSION - docker push $IMAGE_ID:$VERSION diff --git a/README.md b/README.md index 75d73adb9a6..b9b7e533728 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,12 @@ - -[![Maven Package upon a push](https://github.com/mosip/resident-services/actions/workflows/push_trigger.yml/badge.svg?branch=release-1.2.0)](https://github.com/mosip/resident-services/actions/workflows/push_trigger.yml) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mosip_resident-services&id=mosip_resident-services&branch=release-1.2.0&metric=alert_status)](https://sonarcloud.io/dashboard?id=mosip_resident-services&branch=release-1.2.0) +[![Maven Package upon a push](https://github.com/mosip/resident-services/actions/workflows/push-trigger.yml/badge.svg?branch=master)](https://github.com/mosip/resident-services/actions/workflows/push-trigger.yml) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mosip_resident-services&id=mosip_resident-services&branch=master&metric=alert_status)](https://sonarcloud.io/dashboard?id=mosip_resident-services&branch=master) # Resident Services - ## Overview -Refer [here](https://docs.mosip.io/1.2.0/modules/resident-services). +Refer to [Resident Portal Documentation](https://docs.mosip.io/1.2.0/modules/resident-services). ## APIs -API documentation is available [here](https://docs.mosip.io/1.2.0/api). +API documentation is available [here](https://mosip.stoplight.io/docs/resident). ## License This project is licensed under the terms of [Mozilla Public License 2.0](LICENSE). diff --git a/api-docs/API to download the View History Tables as a PDF.yaml b/api-docs/API to download the View History Tables as a PDF.yaml new file mode 100644 index 00000000000..52fd282ba27 --- /dev/null +++ b/api-docs/API to download the View History Tables as a PDF.yaml @@ -0,0 +1,52 @@ +openapi: 3.1.0 +x-stoplight: + id: vp96jr1xx4adx +info: + title: API to download the View History Table as a PDF + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /download/service-history: {} +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-AID-status-and-download-card.yaml b/api-docs/API-AID-status-and-download-card.yaml new file mode 100644 index 00000000000..06418976439 --- /dev/null +++ b/api-docs/API-AID-status-and-download-card.yaml @@ -0,0 +1,254 @@ +openapi: 3.1.0 +x-stoplight: + id: 6oqavuuj1oj15 +info: + title: API-AID status and download card + version: '1.0' + description: description +servers: + - url: 'http://localhost:3000' +paths: + '/status/individualId/{individualId}': + parameters: + - schema: + type: string + name: individualId + in: path + required: true + get: + summary: Get Individual ID status + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.checkstatus + version: '1.0' + responsetime: '2022-06-27T10:09:23.719Z' + metadata: null + response: + transactionStage: UIN generation stage + aidStatus: SUCCESS/FAILURE/IN-PROGRESS + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: + - object + - 'null' + properties: + transactionStage: + type: string + aidStatus: + type: string + errors: + type: 'null' + examples: + success: + value: + id: mosip.resident.checkstatus + version: '1.0' + responsetime: '2022-06-27T10:09:23.719Z' + metadata: null + response: + transactionStage: UIN generation stage + aidStatus: SUCCESS/FAILURE/IN-PROGRESS + errors: null + '404': + description: User Not Found + operationId: get-individual-id-status + description: Get the status of the individual-id + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + transactionStage: + type: string + aidStatus: + type: string + errors: + type: 'null' + x-examples: + Example 1: + id: mosip.resident.checkstatus + version: '1.0' + responsetime: '2022-06-27T10:09:23.719Z' + metadata: null + response: + transactionStage: UIN generation stage + aidStatus: SUCCESS/FAILURE/IN-PROGRESS + errors: null + examples: {} + patch: + summary: Update User Information + operationId: patch-users-userId + responses: + '200': + description: User Updated + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + Updated User Rebecca Baker: + value: + id: 13 + firstName: Rebecca + lastName: Baker + email: rebecca@gmail.com + dateOfBirth: '1985-10-02' + emailVerified: false + createDate: '2019-08-24' + '404': + description: User Not Found + '409': + description: Email Already Taken + description: Update the information of an existing user. + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + description: 'If a new email is given, the user''s email verified property will be set to false.' + dateOfBirth: + type: string + examples: + Update First Name: + value: + firstName: Rebecca + Update Email: + value: + email: rebecca@gmail.com + Update Last Name & Date of Birth: + value: + lastName: Baker + dateOfBirth: '1985-10-02' + description: Patch user properties to update. + /user: + post: + summary: Create New User + operationId: post-user + responses: + '200': + description: User Created + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + New User Bob Fellow: + value: + id: 12 + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + emailVerified: false + createDate: '2020-11-18' + '400': + description: Missing Required Information + '409': + description: Email Already Taken + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + dateOfBirth: + type: string + format: date + required: + - firstName + - lastName + - email + - dateOfBirth + examples: + Create User Bob Fellow: + value: + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + description: Post the necessary fields for the API to create a new user. + description: Create a new user. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-Implementation-for-Payment-Provider.yaml b/api-docs/API-Implementation-for-Payment-Provider.yaml new file mode 100644 index 00000000000..6183f938bbf --- /dev/null +++ b/api-docs/API-Implementation-for-Payment-Provider.yaml @@ -0,0 +1,79 @@ +openapi: 3.1.0 +x-stoplight: + id: kk3nvud8v4l4f +info: + title: API Implementation for Payment Provider + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /check-order-status: + get: + summary: /check-order-status + tags: [] + responses: + '200': + description: OK + '402': + description: Payment Required + operationId: get-check-order-status + requestBody: + content: + application/json: + schema: + type: object + properties: {} + parameters: + - schema: + type: string + in: query + name: individualId + required: true + - schema: + type: string + in: query + name: transactionId + required: true + description: This is a mock API Implementation for Payment Provider to check if payment is made or not. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-Proy-Mastardata-WorkingDays.yaml b/api-docs/API-Proy-Mastardata-WorkingDays.yaml new file mode 100644 index 00000000000..02d09f5e56d --- /dev/null +++ b/api-docs/API-Proy-Mastardata-WorkingDays.yaml @@ -0,0 +1,161 @@ +openapi: 3.1.0 +x-stoplight: + id: u55e1wcz9z9x2 +info: + title: API-Proy-Mastardata-WorkingDays + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/workingdays​/{registrationCenterID}​/{langCode}': + parameters: + - schema: + type: string + name: registrationCenterID + in: path + required: true + - schema: + type: string + name: langCode + in: path + required: true + get: + summary: Get working days from masterdata for the registration center ID + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + workingdays: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + order: + type: integer + languageCode: + type: string + errors: + type: 'null' + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-06-14T06:39:32.529Z' + metadata: null + response: + workingdays: + - code: '102' + name: MON + order: 2 + languageCode: eng + - code: '103' + name: TUE + order: 3 + languageCode: eng + - code: '104' + name: WED + order: 4 + languageCode: eng + - code: '105' + name: THU + order: 5 + languageCode: eng + - code: '106' + name: FRI + order: 6 + languageCode: eng + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: '2022-06-14T06:39:32.529Z' + metadata: null + response: + workingdays: + - code: '102' + name: MON + order: 2 + languageCode: eng + - code: '103' + name: TUE + order: 3 + languageCode: eng + - code: '104' + name: WED + order: 4 + languageCode: eng + - code: '105' + name: THU + order: 5 + languageCode: eng + - code: '106' + name: FRI + order: 6 + languageCode: eng + errors: null + operationId: get-users-userId + description: Get working days from masterdata for the registration center ID and language code. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-Unread-Service-List.yaml b/api-docs/API-Unread-Service-List.yaml new file mode 100644 index 00000000000..070e6c98bcb --- /dev/null +++ b/api-docs/API-Unread-Service-List.yaml @@ -0,0 +1,387 @@ +openapi: 3.1.0 +x-stoplight: + id: nc3d0q3srjmca +info: + title: API-Unread Service List + version: '1.0' + summary: Unread Service Request List + description: This API is to get any updates to the service requests that has not been read in a paginated way. +servers: + - url: 'http://localhost:3000' +paths: + '/notifications/{langCode}': + parameters: + - schema: + type: string + name: langCode + in: path + required: true + get: + summary: Get Notifications + tags: [] + responses: + '200': + description: '' + content: + application/xml: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.service.history.unread + version: '1.0' + responsetime: '2023-01-27T18:19:09.028Z' + metadata: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 116 + totalPages: 12 + data: + - eventId: '1022051156200436' + description: An attempt was made to update data + eventStatus: In Progress + timeStamp: '2023-01-27 10:11:42' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: true + serialNumber: 0 + - eventId: '6007545701099143' + description: Vid Card downloaded successfully. + eventStatus: Success + timeStamp: '2023-01-24 15:02:16' + serviceType: SERVICE_REQUEST + pinnedStatus: false + readStatus: true + serialNumber: 0 + - eventId: '4857207074484418' + description: Vid Card downloaded successfully. + eventStatus: Success + timeStamp: '2023-01-24 15:01:57' + serviceType: SERVICE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '7382955333952740' + description: An attempt was made to update data + eventStatus: In Progress + timeStamp: '2023-01-24 13:48:02' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '4993230417695230' + description: 'Data was updated (E.g.: (name and gender were updated)' + eventStatus: Success + timeStamp: '2023-01-24 13:48:01' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '2334349224132719' + description: An attempt was made to update data + eventStatus: Failed + timeStamp: '2023-01-24 13:47:10' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '3149007627754680' + description: An attempt was made to update data + eventStatus: Failed + timeStamp: '2023-01-24 13:47:10' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '2427899281884083' + description: An attempt was made to update data + eventStatus: Failed + timeStamp: '2023-01-24 13:47:10' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '1339203766621281' + description: An attempt was made to update data + eventStatus: Failed + timeStamp: '2023-01-24 13:47:09' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + - eventId: '8395187272263133' + description: An attempt was made to update data + eventStatus: Failed + timeStamp: '2023-01-24 13:45:56' + serviceType: DATA_UPDATE_REQUEST + pinnedStatus: false + readStatus: false + serialNumber: 0 + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + pageNo: + type: integer + pageSize: + type: integer + totalItems: + type: integer + totalPages: + type: integer + data: + type: + - array + - 'null' + items: {} + errors: + type: 'null' + examples: + Success: + value: |- + { + "id": "mosip.resident.service.history.unread", + "version": "1.0", + "responsetime": "2023-01-27T18:19:09.028Z", + "metadata": null, + "response": { + "pageNo": 0, + "pageSize": 10, + "totalItems": 116, + "totalPages": 12, + "data": [ + { + "eventId": "1022051156200436", + "description": "An attempt was made to update data", + "eventStatus": "In Progress", + "timeStamp": "2023-01-27 10:11:42", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": true, + "serialNumber": 0 + }, + { + "eventId": "6007545701099143", + "description": "Vid Card downloaded successfully.", + "eventStatus": "Success", + "timeStamp": "2023-01-24 15:02:16", + "serviceType": "SERVICE_REQUEST", + "pinnedStatus": false, + "readStatus": true, + "serialNumber": 0 + }, + { + "eventId": "4857207074484418", + "description": "Vid Card downloaded successfully.", + "eventStatus": "Success", + "timeStamp": "2023-01-24 15:01:57", + "serviceType": "SERVICE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "7382955333952740", + "description": "An attempt was made to update data", + "eventStatus": "In Progress", + "timeStamp": "2023-01-24 13:48:02", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "4993230417695230", + "description": "Data was updated (E.g.: (name and gender were updated)", + "eventStatus": "Success", + "timeStamp": "2023-01-24 13:48:01", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "2334349224132719", + "description": "An attempt was made to update data", + "eventStatus": "Failed", + "timeStamp": "2023-01-24 13:47:10", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "3149007627754680", + "description": "An attempt was made to update data", + "eventStatus": "Failed", + "timeStamp": "2023-01-24 13:47:10", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "2427899281884083", + "description": "An attempt was made to update data", + "eventStatus": "Failed", + "timeStamp": "2023-01-24 13:47:10", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "1339203766621281", + "description": "An attempt was made to update data", + "eventStatus": "Failed", + "timeStamp": "2023-01-24 13:47:09", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + }, + { + "eventId": "8395187272263133", + "description": "An attempt was made to update data", + "eventStatus": "Failed", + "timeStamp": "2023-01-24 13:45:56", + "serviceType": "DATA_UPDATE_REQUEST", + "pinnedStatus": false, + "readStatus": false, + "serialNumber": 0 + } + ] + }, + "errors": null + } + 'Error: Invalid Language Code': + value: |- + { + "id": "mosip.service.history.get", + "version": "1.0", + "responsetime": "2022-07-22T15:27:10.605Z", + "response": null, + "errors": { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter - lang code" + } + } + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: unread-service-list + description: This API is to get notifictions to the asyncrhonous service requests in a paginated way. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + - schema: + type: string + in: query + name: langCode + description: The 3 letter language code +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Get-User-Details.yaml b/api-docs/API-to-Get-User-Details.yaml new file mode 100644 index 00000000000..1308dbc2932 --- /dev/null +++ b/api-docs/API-to-Get-User-Details.yaml @@ -0,0 +1,183 @@ +openapi: 3.1.0 +x-stoplight: + id: 2g37zlr9v2plo +info: + title: API to Get User Details + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /profile: + get: + summary: /profile + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + fullName: + type: string + lastLogin: + type: string + photo: + type: object + properties: + mime: + type: string + data: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.profile + version: v1 + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: base64 encoded image bytes + errors: null + examples: + Success: + value: + id: mosip.resident.profile + version: '1.0' + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: base64 encoded image bytes + errors: null + '401': + description: Unauthorized + '': + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.profile + version: '1.0' + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: base64 encoded image bytes + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: + - object + - 'null' + properties: + fullName: + type: string + lastLogin: + type: string + photo: + type: object + properties: + mime: + type: string + data: + type: string + errors: + type: 'null' + operationId: get-user-details + description: |- + This API is to get the following User profile who has logged in to the current session: + + Full name + Photo + Last Login date time + Machine Details such as : ip_address_or_host , machine_type : Linux/Windows/Mobile + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Get-last-date-time-of-user-click-event-on-the-bell-notification.yaml b/api-docs/API-to-Get-last-date-time-of-user-click-event-on-the-bell-notification.yaml new file mode 100644 index 00000000000..d217fd75d1b --- /dev/null +++ b/api-docs/API-to-Get-last-date-time-of-user-click-event-on-the-bell-notification.yaml @@ -0,0 +1,116 @@ +openapi: 3.1.0 +x-stoplight: + id: wpbesa5utcs9m +info: + title: API to Get last date-time of user click event on the bell notification + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /bell/notification-click: + get: + summary: bell/notification-click + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + lastbellnotifclicktime: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-19T11:26:22.045Z' + metadata: null + response: + lastbellnotifclicktime: '2022-09-19T11:24:25.240726' + errors: null + examples: + Success: + value: + id: mosip.resident.get.notification.click.time + version: '1.0' + responsetime: '2022-09-19T11:26:22.045Z' + metadata: null + response: + lastbellnotifclicktime: '2022-09-19T11:24:25.240726' + errors: null + '401': + description: Unauthorized + operationId: get-bell-notification-click + description: |- + API to Get last date-time of user click event on the bell notification icon. + This is an authenticated API. + parameters: + - schema: + type: string + in: cookie + name: Authorization Token + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Transliterate-API-for-Resident-Services.yaml b/api-docs/API-to-Transliterate-API-for-Resident-Services.yaml new file mode 100644 index 00000000000..89e8ccc703f --- /dev/null +++ b/api-docs/API-to-Transliterate-API-for-Resident-Services.yaml @@ -0,0 +1,207 @@ +openapi: 3.1.0 +x-stoplight: + id: yjq9kl8940smk +info: + title: API to Transliterate API for Resident Services + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /transliteration/transliterate: + parameters: [] + post: + summary: Transliterate + operationId: post-transliteration-transliterate + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: object + properties: + from_field_value: + type: string + from_field_lang: + type: string + to_field_value: + type: string + to_field_lang: + type: string + errors: + type: 'null' + x-examples: + Example 1: + id: mosip.resident.transliteration.transliterate + version: '1.0' + responsetime: '2022-09-07T14:02:41.227Z' + response: + from_field_value: j + from_field_lang: eng + to_field_value: ज् + to_field_lang: hin + errors: null + examples: + Success: + value: + id: mosip.resident.transliteration.transliterate + version: '1.0' + responsetime: '2022-09-07T14:02:41.227Z' + response: + from_field_value: j + from_field_lang: eng + to_field_value: ज् + to_field_lang: hin + errors: null + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + description: API to transliterate text from one language to another. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + request: + type: object + properties: + 'from_field_lang ': + type: string + from_field_value: + type: string + to_field_lang: + type: string + version: + type: string + requesttime: + type: string + x-examples: + Example 1: + id: mosip.resident.transliteration.transliterate + request: + 'from_field_lang ': 'eng ' + from_field_value: j + to_field_lang: hin + version: '1.0' + requesttime: '2022-09-07T04:53:07.882Z' + examples: + Example 1: + value: + id: mosip.resident.transliteration.transliterate + request: + 'from_field_lang ': 'eng ' + from_field_value: j + to_field_lang: hin + version: '1.0' + requesttime: '2022-09-07T04:53:07.882Z' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Update-last-date-time-when-user-clicked-on-the-bell-notification.yaml b/api-docs/API-to-Update-last-date-time-when-user-clicked-on-the-bell-notification.yaml new file mode 100644 index 00000000000..1a4c1f98e07 --- /dev/null +++ b/api-docs/API-to-Update-last-date-time-when-user-clicked-on-the-bell-notification.yaml @@ -0,0 +1,76 @@ +openapi: 3.1.0 +x-stoplight: + id: 7h1cgbx9i00i4 +info: + title: API to Update last date-time when user clicked on the bell notification + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /bell/updatedttime: + put: + summary: /bell/updatedttime + operationId: put-bell-updatedttime + responses: + '200': + description: OK + '401': + description: Unauthorized + parameters: + - schema: + type: string + in: cookie + name: Authorization Token + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: |- + API to update last date-time when user clicked on the bell notification. + This is an authenticated API. This will update the last date time with current UTC time. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Upload-a-document-for-A-document-type,-reference-ID-and-transaction-ID.yaml b/api-docs/API-to-Upload-a-document-for-A-document-type,-reference-ID-and-transaction-ID.yaml new file mode 100644 index 00000000000..8ce6dd3942f --- /dev/null +++ b/api-docs/API-to-Upload-a-document-for-A-document-type,-reference-ID-and-transaction-ID.yaml @@ -0,0 +1,222 @@ +openapi: 3.1.0 +x-stoplight: + id: e6pg0zpowv9lp +info: + title: 'API to Upload a document for A document type, reference ID and transaction ID' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/documents​/{transaction-id}': + parameters: + - schema: + type: string + name: transaction-id + in: path + required: true + post: + summary: Upload a document for given transaction-id + operationId: post-documents-transaction-id + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: object + properties: {} + response: + type: object + properties: + transactionId: + type: string + docId: + type: string + docName: + type: string + docCatCode: + type: string + docTypCode: + type: string + docFileFormat: + type: string + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + example-1: + id: string + version: string + responsetime: '2022-06-09T06:40:54.760Z' + metadata: {} + response: + transactionId: string + docId: string + docName: string + docCatCode: string + docTypCode: string + docFileFormat: string + errors: + - errorCode: string + message: string + examples: + Success: + value: + id: mosip.resident.document.upload + version: '1.0' + responsetime: '2022-06-09T06:40:54.760Z' + metadata: {} + response: + transactionId: string + docId: string + docName: string + docCatCode: string + docTypCode: string + docFileFormat: string + errors: null + 'Error: Virus scanning failed for the attachment': + value: + id: mosip.resident.document.upload + version: '1.0' + responsetime: '2022-06-09T06:40:54.760Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-437 + message: Virus scanning failed for attached document + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: {} + description: 'file: The bytes of the file' + parameters: + - schema: + type: string + in: query + name: docCatCode + required: true + description: 'Document type code - like poi,poa' + - schema: + type: string + in: query + name: docTypCode + description: Document type code - like Driving-License/passport + required: true + - schema: + type: string + in: query + name: langCode + description: 3 letter language code + required: true + - schema: + type: string + in: query + name: referenceId + description: Document reference ID (just stored in object store as metadata) + description: This API is to upload a document for a given document type and the given transaction ID +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-Validate-Token-in-the-openidconnect-login-service..yaml b/api-docs/API-to-Validate-Token-in-the-openidconnect-login-service..yaml new file mode 100644 index 00000000000..84f84ddc0db --- /dev/null +++ b/api-docs/API-to-Validate-Token-in-the-openidconnect-login-service..yaml @@ -0,0 +1,68 @@ +openapi: 3.1.0 +x-stoplight: + id: 090mp3cmd71pq +info: + title: API to Validate Token in the openidconnect login service. + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /authorize​/admin​/validateToken: + get: + summary: authorize​/admin​/validateToken + tags: [] + responses: + '200': + description: OK + '401': + description: Unauthorized + operationId: get-authorize-admin-validateToken + parameters: + - schema: + type: string + in: cookie + name: Authorization Token + required: true + description: 'In the UI, whenever a page requires a login, an API is required to validate the access token, which will be used by the UI. This API is used to verify whether the token is present or not and if it is the correct token or not.' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-accept-purpose-attribute-and-put-it-in-resident-transaction-entry-table.yaml b/api-docs/API-to-accept-purpose-attribute-and-put-it-in-resident-transaction-entry-table.yaml new file mode 100644 index 00000000000..7d37dc9f9f6 --- /dev/null +++ b/api-docs/API-to-accept-purpose-attribute-and-put-it-in-resident-transaction-entry-table.yaml @@ -0,0 +1,224 @@ +openapi: 3.1.0 +x-stoplight: + id: om3bhqwoxhp27 +info: + title: API to accept purpose attribute and put it in resident transaction entry table + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /share-credential: + post: + summary: /share-credential + operationId: post-share-credential + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.share.credential + version: '1.0' + responsetime: '2022-06-23T12:00:40.326Z' + metadata: null + response: + status: Success + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: + - object + - 'null' + properties: + status: + type: string + errors: {} + examples: + Success: + value: + id: mosip.resident.share.credential + version: '1.0' + responsetime: '2022-06-23T12:00:40.326Z' + metadata: null + response: + status: Success + errors: null + 'Error: Unable to access API resource': + value: + id: mosip.resident.share.credential + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: Consent not provided': + value: + id: mosip.resident.share.credential + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-472 + message: Accepting the terms and conditions is a mandatory action to proceed further. Please accept the consent to proceed + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.share.credential + request: + partnerId: mpartner-default-print + sharableAttributes: + - attributeName: dateOfBirth + format: YYYY + isMasked: false + purpose: string + consent: Accepted + requesttime: '2021-10-19T17:01:59.538Z' + version: '1.0' + required: + - id + properties: + id: + type: string + request: + type: + - object + - 'null' + properties: + partnerId: + type: string + sharableAttributes: + type: array + items: + type: object + properties: + attributeName: + type: string + format: + type: string + isMasked: + type: boolean + purpose: + type: string + consent: + type: string + requesttime: + type: string + version: + type: string + examples: + example-1: + value: + id: mosip.resident.share.credential + request: + partnerId: mpartner-default-print + sharableAttributes: + - attributeName: dateOfBirth + format: YYYY + isMasked: false + purpose: string + consent: Accepted + requesttime: '2021-10-19T17:01:59.538Z' + version: '1.0' + application/xml: + schema: + type: object + properties: {} + multipart/form-data: + schema: + type: object + properties: {} + description: This API is to share the user specified attributes to selected partner in the selected formats along with a purpose. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-accept-the-reference-ID-of-the-uploaded-document-against-the-document-attribute,-and-transaction-ID.yaml b/api-docs/API-to-accept-the-reference-ID-of-the-uploaded-document-against-the-document-attribute,-and-transaction-ID.yaml new file mode 100644 index 00000000000..f5f7b1c9b60 --- /dev/null +++ b/api-docs/API-to-accept-the-reference-ID-of-the-uploaded-document-against-the-document-attribute,-and-transaction-ID.yaml @@ -0,0 +1,178 @@ +openapi: 3.1.0 +x-stoplight: + id: ydcmp6763s5r8 +info: + title: 'API to accept the reference ID of the uploaded document against the document attribute, and transaction ID' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req​/update-uin: + patch: + summary: /req​/update-uin + operationId: patch-req-update-uin + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: object + properties: {} + response: + type: object + properties: + eventId: + type: string + message: + type: string + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + example-1: + id: string + version: string + responsetime: '2022-06-14T13:12:18.666Z' + metadata: {} + response: + eventId: string + message: string + errors: + - errorCode: string + message: string + examples: + Success: + value: + id: string + version: string + responsetime: '2022-06-14T13:12:18.666Z' + metadata: {} + response: + eventId: string + message: string + errors: + - errorCode: string + message: string + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionID: + type: string + consent: + type: string + identity: + type: object + properties: + IDSchemaVersion: + type: string + addressLine3: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + email: + type: string + x-examples: + example-1: + id: mosip.resident.updateuin + version: v1 + requesttime: '2022-09-02T11:19:54.449Z' + request: + transactionID: '1234567890' + consent: Accepted + identity: + IDSchemaVersion: '0.1' + addressLine3: + - language: eng + value: Sohan + email: abc@gmail.com + examples: + example-1: + value: + id: mosip.resident.updateuin + version: v1 + requesttime: '2022-09-02T11:19:54.449Z' + request: + transactionID: '1234567890' + consent: Accepted + identity: + IDSchemaVersion: '0.1' + addressLine3: + - language: eng + value: Sohan + email: abc@gmail.com + description: This API is for Resident Service to get the RID (AID) from the update response and stores the status in resident_transaction details with a summary on what is got updated. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-accept-the-user-specified-formats-and-masking-requirements,-and-purpose.yaml b/api-docs/API-to-accept-the-user-specified-formats-and-masking-requirements,-and-purpose.yaml new file mode 100644 index 00000000000..c333396eb12 --- /dev/null +++ b/api-docs/API-to-accept-the-user-specified-formats-and-masking-requirements,-and-purpose.yaml @@ -0,0 +1,263 @@ +openapi: 3.1.0 +x-stoplight: + id: 04du081okmkpy +info: + title: 'API to accept the user specified formats and masking requirements, and purpose' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /share-credential: + post: + summary: Your POST endpoint + x-stoplight: + id: 73422249ac323 + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + eventId: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: string + version: v1 + responsetime: '2022-06-23T12:00:40.326Z' + metadata: null + response: + eventId: string + errors: null + examples: + Success: + value: + id: string + version: string + responsetime: string + metadata: null + response: + eventId: string + errors: null + operationId: get-share-credential + requestBody: + content: + application/json: + schema: + type: object + properties: {} + description: |- + { + "id":"8251649601", + "credentialType":"eUIN_with_faceQR", + "issuer":"mpartner-default-print", + "encrypt":false, + "encryptionKey":"abc123", + "sharableAttributes":[ + "firstName", + "middleName", + "lastName", + "dateOfBirth", + "phone", + "email", + "UIN", + "VID" + ], + "additionalData":{ + "formatingAttributes":{ + "attributeName":"dateOfBirth", + "format":"DD/MMM/YYYY" + }, + "maskingAttributes": ["phone", "email", "UIN", "VID"] + } + } + /download/personalized-card: + post: + summary: /download/personalized-card + x-stoplight: + id: 1e727f4dc0f51 + tags: [] + responses: + '200': + description: OK - The PDF bytes + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + content: + application/pdf: + schema: + type: object + properties: {} + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: {} + examples: + 'Error: Invalid html attribute': + value: + id: mosip.resident.download.personalized.card + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-410 + message: Invalid Input Parameter- html + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: post-download-personalized-card + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + html: + type: string + x-examples: + Example 1: + id: mosip.resident.download.personalized.card + version: '1.0' + requesttime: '2021-09-14T12:32:49.483Z' + request: + html: base-64-url-encoded html content + examples: + example-1: + value: + id: mosip.resident.download.personalized.card + version: '1.0' + requesttime: '2021-09-14T12:32:49.483Z' + request: + html: base-64-url-encoded html content + description: This API is to download the personalized PDF card from the preview. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + security: [] + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-apply-data-format-and-masking-from-user-input-by-overriding-policy-format.yaml b/api-docs/API-to-apply-data-format-and-masking-from-user-input-by-overriding-policy-format.yaml new file mode 100644 index 00000000000..730968d3e65 --- /dev/null +++ b/api-docs/API-to-apply-data-format-and-masking-from-user-input-by-overriding-policy-format.yaml @@ -0,0 +1,133 @@ +openapi: 3.1.0 +x-stoplight: + id: jygyosciueetv +info: + title: API to apply data format and masking from user input by overriding policy format + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /issue: + post: + summary: /issue + operationId: post-issue + responses: + '200': + description: OK + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + credentialType: + type: string + issuer: + type: string + encrypt: + type: boolean + encryptionKey: + type: string + sharableAttributes: + type: array + items: + type: string + additionalData: + type: object + properties: + formatingAttributes: + type: object + properties: + attributeName: + type: string + format: + type: string + maskingAttributes: + type: array + items: + type: string + x-examples: + example-1: + id: '8251649601' + credentialType: eUIN_with_faceQR + issuer: mpartner-default-print + encrypt: false + encryptionKey: abc123 + sharableAttributes: + - firstName + - middleName + - lastName + - dateOfBirth + - phone + - email + - UIN + - VID + additionalData: + formatingAttributes: + attributeName: dateOfBirth + format: DD/MMM/YYYY + maskingAttributes: + - phone + - email + - UIN + - VID + examples: + example-1: + value: + id: string + credentialType: string + issuer: string + encrypt: true + encryptionKey: string + sharableAttributes: + - string + additionalData: + formatingAttributes: + attributeName: string + format: string + maskingAttributes: + - string +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-convert-the-List-of-registration-centers-request-as-a-downloadable-PDF.yaml b/api-docs/API-to-convert-the-List-of-registration-centers-request-as-a-downloadable-PDF.yaml new file mode 100644 index 00000000000..c26b17db89b --- /dev/null +++ b/api-docs/API-to-convert-the-List-of-registration-centers-request-as-a-downloadable-PDF.yaml @@ -0,0 +1,332 @@ +openapi: 3.1.0 +x-stoplight: + id: 0wzznkgjgmjj6 +info: + title: API to convert the List of registration centers request as a downloadable PDF + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + download/registration-centers-list: + post: + summary: download/registration-centers-list + operationId: post-download-pdf-registration-centers + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + text/html: + schema: + type: object + properties: {} + examples: + Success: + value: 'Response Body: PDF bytes with application/pdf mime type, and filename as: document/featurename_eventId.pdf' + '400': + description: Bad Request + content: + text/html: + schema: + type: object + properties: {} + examples: + example-1: + value: {} + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + request: + type: object + properties: + registrationCenters: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + centerTypeCode: + type: string + addressLine1: + type: string + addressLine2: + type: string + addressLine3: + type: string + latitude: + type: string + longitude: + type: string + locationCode: + type: string + holidayLocationCode: + type: string + contactPhone: + type: string + workingHours: + type: string + langCode: + type: string + numberOfKiosks: + type: integer + perKioskProcessTime: + type: string + centerStartTime: + type: string + centerEndTime: + type: string + timeZone: + type: string + contactPerson: + type: string + lunchStartTime: + type: string + lunchEndTime: + type: string + isActive: + type: boolean + zoneCode: + type: string + x-examples: + example-1: + id: mosip.resident.download.registration.centers + version: '1.0' + responsetime: '2022-06-14T07:54:26.731Z' + request: + registrationCenters: + - id: '10003' + name: Souk Khemiss Mograne + centerTypeCode: REG + addressLine1: Route N1 + addressLine2: Mograne + addressLine3: MyCountry + latitude: '34.405692' + longitude: '-6.433368' + locationCode: '14023' + holidayLocationCode: KTA + contactPhone: '734239083' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 4 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Mario Speedwagon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: SAL + - id: '10005' + name: Center Mehdia + centerTypeCode: REG + addressLine1: Mehdia Road Amria mehdia + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.256414' + longitude: '-6.675499' + locationCode: '14110' + holidayLocationCode: KTA + contactPhone: '887311749' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 1 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Walter Melon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: BSN + - id: '10006' + name: Center Ouled Oujih + centerTypeCode: REG + addressLine1: Bloc 1 G1 N113 + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.262477' + longitude: '-6.618605' + locationCode: '14080' + holidayLocationCode: KTA + contactPhone: '915790305' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 5 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Barb Ackue + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: NDR + examples: + example-1: + value: + id: string + version: string + responsetime: string + request: + registrationCenters: + - id: string + name: string + centerTypeCode: string + addressLine1: string + addressLine2: string + addressLine3: string + latitude: string + longitude: string + locationCode: string + holidayLocationCode: string + contactPhone: string + workingHours: string + langCode: string + numberOfKiosks: 0 + perKioskProcessTime: string + centerStartTime: string + centerEndTime: string + timeZone: string + contactPerson: string + lunchStartTime: string + lunchEndTime: string + isActive: true + zoneCode: string + example-2: + value: + id: mosip.resident.download.registration.centers + version: '1.0' + responsetime: '2022-06-14T07:54:26.731Z' + request: + registrationCenters: + - id: '10003' + name: Souk Khemiss Mograne + centerTypeCode: REG + addressLine1: Route N1 + addressLine2: Mograne + addressLine3: MyCountry + latitude: '34.405692' + longitude: '-6.433368' + locationCode: '14023' + holidayLocationCode: KTA + contactPhone: '734239083' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 4 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Mario Speedwagon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: SAL + - id: '10005' + name: Center Mehdia + centerTypeCode: REG + addressLine1: Mehdia Road Amria mehdia + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.256414' + longitude: '-6.675499' + locationCode: '14110' + holidayLocationCode: KTA + contactPhone: '887311749' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 1 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Walter Melon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: BSN + - id: '10006' + name: Center Ouled Oujih + centerTypeCode: REG + addressLine1: Bloc 1 G1 N113 + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.262477' + longitude: '-6.618605' + locationCode: '14080' + holidayLocationCode: KTA + contactPhone: '915790305' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 5 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Barb Ackue + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: NDR + description: This API to convert the List of registration centers request as a downloadable PDF. + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-convert-the-List-of-supporting-documents-request-as-a-downloadable-PDF.yaml b/api-docs/API-to-convert-the-List-of-supporting-documents-request-as-a-downloadable-PDF.yaml new file mode 100644 index 00000000000..a5748f9054d --- /dev/null +++ b/api-docs/API-to-convert-the-List-of-supporting-documents-request-as-a-downloadable-PDF.yaml @@ -0,0 +1,99 @@ +openapi: 3.1.0 +x-stoplight: + id: s3tmdl6sco7mi +info: + title: API to convert the List of supporting documents request as a downloadable PDF + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/download/supporting-documents?langcode={language-code}': + parameters: + - schema: + type: string + name: language-code + in: path + required: true + get: + summary: '/download/supporting-documents?langcode={language-code}' + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + examples: + Success: + value: + Byte array of PDF | mime-type: application/pdf + example-1: + value: {} + text/html: + schema: + type: object + properties: {} + application/json: + schema: + type: object + properties: {} + '': + description: OK - Supporting doument PDF bytes + content: + application/pdf: + schema: + type: object + properties: {} + operationId: get-pdf-supporting-documents?langCode=-language-code + parameters: + - schema: + type: string + in: query + name: langCode + required: true + description: 3 letter language code in which the supporting document needs to be returned + description: This API is to convert the List of supporting documents request as a downloadable PDF +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-delete-a-document-based-on-document-ID.yaml b/api-docs/API-to-delete-a-document-based-on-document-ID.yaml new file mode 100644 index 00000000000..7495c9c8673 --- /dev/null +++ b/api-docs/API-to-delete-a-document-based-on-document-ID.yaml @@ -0,0 +1,154 @@ +openapi: 3.1.0 +x-stoplight: + id: jtgnvlps6vbjp +info: + title: API to delete a document based on document ID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/documents/{document-id}': + parameters: + - schema: + type: string + name: document-id + in: path + required: true + get: + summary: Your GET endpoint + tags: [] + responses: {} + operationId: get-DELETE-documents-document-id + delete: + summary: Delete file uploaded with the document-id + operationId: delete-documents-document-id + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + errors: + type: 'null' + response: + type: object + properties: + status: + type: string + message: + type: string + responseTime: + type: string + x-examples: + example-1: + id: mosip.resident.document.delete + version: '1.0' + errors: null + response: + status: SUCCESS + message: Document deleted successfully + responseTime: '2022-07-25T10:21:17.658753' + examples: + Success: + value: + id: mosip.resident.document.delete + version: '1.0' + errors: null + response: + status: SUCCESS + message: Document deleted successfully + responseTime: '2022-07-25T10:21:17.658753' + 'Error: No document found for transaction ID': + value: + id: string + version: string + errors: null + response: + status: string + message: string + responseTime: string + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:05.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + parameters: + - schema: + type: string + in: query + name: transactionId + description: The transaction ID used to upload the document + required: true + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + description: This API to delete an uploaded document based on the document ID. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-download-document-based-on-document-ID.yaml b/api-docs/API-to-download-document-based-on-document-ID.yaml new file mode 100644 index 00000000000..fae3961c58e --- /dev/null +++ b/api-docs/API-to-download-document-based-on-document-ID.yaml @@ -0,0 +1,186 @@ +openapi: 3.1.0 +x-stoplight: + id: e01g8ipbdx5rr +info: + title: API to download document based on document ID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/document/{document-id}': + parameters: + - schema: + type: string + name: document-id + in: path + required: true + get: + summary: Get Document for document-id (encoded bytes) + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + document: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.document.get + version: v1 + responsetime: '2022-08-03T12:18:31.701Z' + metadata: null + response: + document: base64 encoded file + errors: null + examples: + Success: + value: + id: mosip.resident.document.get + version: v1 + responsetime: '2022-08-03T12:18:31.701Z' + metadata: null + response: + document: base64 encoded file + errors: null + 'Error: Document not found for transactionId': + value: + id: mosip.resident.document.get + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-461 + message: 'No document found for transactionID: 1234567890 & documentId: 79baf26e-bcb8-581d-aa7a-fc06336ebcda' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:04.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:05.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-document-document-id + parameters: + - schema: + type: string + in: query + name: transactionId + required: true + description: Transaction ID used while uploading the document + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: | + In “update my data”, when a document is uploaded, we want to preview it in UI, for that to happen it needs to be downloaded by an API which will have document id as input and downloaded file as output (hence enabling the resident to preview it in UI) + + Input of the API=document id + + Output of the API=downloaded file +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-download-the-UIN-card-using-AIDVIDUIN.yaml b/api-docs/API-to-download-the-UIN-card-using-AIDVIDUIN.yaml new file mode 100644 index 00000000000..ccf70ffbed0 --- /dev/null +++ b/api-docs/API-to-download-the-UIN-card-using-AIDVIDUIN.yaml @@ -0,0 +1,204 @@ +openapi: 3.1.0 +x-stoplight: + id: 4nwkph04k4jyf +info: + title: UIN + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /download-card: + post: + summary: download-card + operationId: post-download-card + responses: + '200': + description: OK + content: + application/pdf: + schema: + type: object + properties: {} + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: {} + '401': + description: Unauthorized + requestBody: + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.download.uin.card + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '27847492179376320221124032336' + otp: '111111' + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: + - object + - 'null' + properties: + transactionId: + type: string + individualId: + type: string + otp: + type: string + examples: + Example 1: + value: + id: mosip.resident.download.uin.card + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '27847492179376320221124032336' + otp: '111111' + application/xml: + schema: + type: object + properties: {} + multipart/form-data: + schema: + type: object + properties: {} + text/html: + schema: + type: object + properties: {} + text/plain: + schema: + type: object + properties: {} + application/EDI-X12: + schema: + type: object + properties: {} + application/EDIFACT: + schema: + type: object + properties: {} + application/atom+xml: + schema: + type: object + properties: {} + application/font-woff: + schema: + type: object + properties: {} + application/gzip: + schema: + type: object + properties: {} + application/javascript: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionId: + type: string + individualId: + type: string + otp: + type: string + x-examples: + example-1: + id: mosip.resident.download.uin.card + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '8251649601' + otp: '111111' + examples: + example-1: + value: + id: mosip.resident.download.uin.card + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '8251649601' + otp: '111111' + description: This API is to download the UIN card using AID/VID/UIN. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-download-the-UIN-card-using-a-URL.yaml b/api-docs/API-to-download-the-UIN-card-using-a-URL.yaml new file mode 100644 index 00000000000..aec7a2defb9 --- /dev/null +++ b/api-docs/API-to-download-the-UIN-card-using-a-URL.yaml @@ -0,0 +1,176 @@ +openapi: 3.1.0 +x-stoplight: + id: 1j2m9vsiib2ab +info: + title: API to download the UIN card using a URL + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/download-card/event/{event-id}': + get: + summary: '/download-card/event/{event-id}' + tags: [] + responses: + '200': + description: OK + content: + application/pdf: + schema: + type: object + properties: {} + examples: + Success: + value: PDF bytes in the response with application/pdf mime-type + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: {} + examples: + 'Error: Unable to access API resource': + value: + id: mosip.resident.download.uin.card.eventId + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: EID not available': + value: + id: mosip.resident.download.uin.card.eventId + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-459 + message: EID not available in database + 'Error: EID not belongs to logged in user': + value: + id: mosip.resident.download.uin.card.eventId + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-511 + message: The entered EID is not associated with the UIN/VID used to log in. + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-download-card-event-event-id + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: This API is to download the UIN card using URL sent over email/SMS/track event/notification section. + parameters: + - schema: + type: string + name: event-id + in: path + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-download-the-default-card-with-VID-as-a-downloadable-PDF.yaml b/api-docs/API-to-download-the-default-card-with-VID-as-a-downloadable-PDF.yaml new file mode 100644 index 00000000000..0255575e32f --- /dev/null +++ b/api-docs/API-to-download-the-default-card-with-VID-as-a-downloadable-PDF.yaml @@ -0,0 +1,153 @@ +openapi: 3.1.0 +x-stoplight: + id: 3ql476s1xepe5 +info: + title: API to download the default card with VID as a downloadable PDF + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/request-card/vid/{VID}': + parameters: + - schema: + type: string + name: VID + in: path + required: true + get: + summary: '/request-card/vid/{VID}' + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + eventId: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: mosip.resident.request.vid.card + version: '1.0' + responsetime: '2022-06-20T08:22:17.802Z' + metadata: null + response: + eventId: c758c9e9-1882-49a4-b07b-db98a1942538 + errors: [] + examples: + Success: + value: + id: mosip.resident.request.vid.card + version: '1.0' + responsetime: '2022-06-20T08:22:17.802Z' + metadata: null + response: + status: Success + errors: [] + VID not belonging to the logged in session: + value: + id: mosip.resident.request.vid.card + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-452 + message: Provided individualId does not belong to the logged in session. + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized Access + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-download-card-vid-VID + description: This API is to request the PDF card generation for the given VID. + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Access token + - schema: + type: string + in: cookie + name: id_token + description: ID Token + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-generate-VID-Generate.yaml b/api-docs/API-to-generate-VID-Generate.yaml new file mode 100644 index 00000000000..a7f366fefad --- /dev/null +++ b/api-docs/API-to-generate-VID-Generate.yaml @@ -0,0 +1,219 @@ +openapi: 3.1.0 +x-stoplight: + id: em0n778gyax96 +info: + title: API to generate VID Generate + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /generate-vid: + post: + summary: /generate-vid + operationId: post-generate-vid + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.vid + version: v1 + responsetime: '2022-06-08T15:45:02.052Z' + response: + vid: '3928304862' + message: Notification has been sent to the provided contact detail(s) + maskedPhone: '******0872' + maskedEmail: man*******@gmail.com + errors: [] + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: + - object + - 'null' + properties: + vid: + type: string + message: + type: string + maskedPhone: + type: string + maskedEmail: + type: string + status: + type: string + x-stoplight: + id: 9ou8f969ttg4r + errors: + type: array + items: + type: object + examples: + Success: + value: + id: mosip.resident.vid.generate + version: '1.0' + responsetime: '2022-06-08T15:45:02.052Z' + response: + vid: '3928304862' + message: Notification has been sent to the provided contact detail(s) + maskedPhone: '******0872' + maskedEmail: man*******@gmail.com + status: Success + errors: [] + Maximum limit reached: + value: + id: mosip.resident.vid.generate + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-405 + message: Maximum allowed VIDs are active. Deactivate VID to generate new one. + Exception while creating VID: + value: + id: mosip.resident.vid.generate + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-406 + message: Exception while creating VID + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized Access + requestBody: + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.vid + request: + transactionID: '1234567890' + vidType: Temporary + channels: + - PHONE + - EMAIL + requesttime: '2022-03-22T14:24:30.314Z' + version: v1 + required: + - id + - request + - requesttime + - version + properties: + id: + type: string + request: + type: object + required: + - transactionID + - vidType + - channels + properties: + transactionID: + type: string + description: 'Deprecated: non-empty string. This will be removed in future release.' + vidType: + type: string + channels: + type: array + items: + type: string + requesttime: + type: string + version: + type: string + examples: + example-1: + value: + id: mosip.resident.vid.generate + version: '1.0' + request: + transactionID: '1234567890' + vidType: Temporary + channels: + - PHONE + - EMAIL + requesttime: '2022-03-22T14:24:30.314Z' + description: This API is to generate VID that takes the individual ID. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + - schema: + type: string + in: header + name: locale + description: locale from the client system + - schema: + type: integer + in: header + name: timezoneOffset + description: timezone offset from the client system +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-Identity-Mapping-JSON.yaml b/api-docs/API-to-get-Identity-Mapping-JSON.yaml new file mode 100644 index 00000000000..1f6e4e24da1 --- /dev/null +++ b/api-docs/API-to-get-Identity-Mapping-JSON.yaml @@ -0,0 +1,429 @@ +openapi: 3.1.0 +x-stoplight: + id: vbc0uvvqydhjp +info: + title: API to get Identity Mapping JSON + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + proxy​/config​/identity-mapping: + get: + summary: proxy​/config​/identity-mapping + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + identity: + type: object + properties: + IDSchemaVersion: + type: object + properties: + value: + type: string + name: + type: object + properties: + value: + type: string + gender: + type: object + properties: + value: + type: string + dob: + type: object + properties: + value: + type: string + age: + type: object + properties: + value: + type: string + introducerRID: + type: object + properties: + value: + type: string + introducerUIN: + type: object + properties: + value: + type: string + introducerVID: + type: object + properties: + value: + type: string + introducerName: + type: object + properties: + value: + type: string + phone: + type: object + properties: + value: + type: string + phoneNumber: + type: object + properties: + value: + type: string + email: + type: object + properties: + value: + type: string + emailId: + type: object + properties: + value: + type: string + uin: + type: object + properties: + value: + type: string + individualBiometrics: + type: object + properties: + value: + type: string + introducerBiometrics: + type: object + properties: + value: + type: string + individualAuthBiometrics: + type: object + properties: + value: + type: string + officerBiometricFileName: + type: object + properties: + value: + type: string + supervisorBiometricFileName: + type: object + properties: + value: + type: string + residenceStatus: + type: object + properties: + value: + type: string + preferredLanguage: + type: object + properties: + value: + type: string + locationHierarchyForProfiling: + type: object + properties: + value: + type: string + addressLine1: + type: object + properties: + value: + type: string + addressLine2: + type: object + properties: + value: + type: string + addressLine3: + type: object + properties: + value: + type: string + location1: + type: object + properties: + value: + type: string + location2: + type: object + properties: + value: + type: string + location3: + type: object + properties: + value: + type: string + postalCode: + type: object + properties: + value: + type: string + location4: + type: object + properties: + value: + type: string + fullAddress: + type: object + properties: + value: + type: string + metaInfo: + type: object + properties: + value: + type: string + audits: + type: object + properties: + value: + type: string + documents: + type: object + properties: + poa: + type: object + properties: + value: + type: string + poi: + type: object + properties: + value: + type: string + por: + type: object + properties: + value: + type: string + pob: + type: object + properties: + value: + type: string + poe: + type: object + properties: + value: + type: string + x-examples: + example-1: + identity: + IDSchemaVersion: + value: IDSchemaVersion + name: + value: fullName + gender: + value: gender + dob: + value: dateOfBirth + age: + value: age + introducerRID: + value: introducerRID + introducerUIN: + value: introducerUIN + introducerVID: + value: introducerVID + introducerName: + value: introducerName + phone: + value: phone + phoneNumber: + value: phone + email: + value: email + emailId: + value: email + uin: + value: UIN + individualBiometrics: + value: individualBiometrics + introducerBiometrics: + value: introducerBiometrics + individualAuthBiometrics: + value: individualAuthBiometrics + officerBiometricFileName: + value: officerBiometricFileName + supervisorBiometricFileName: + value: supervisorBiometricFileName + residenceStatus: + value: residenceStatus + preferredLanguage: + value: preferredLang + locationHierarchyForProfiling: + value: 'zone,postalCode' + addressLine1: + value: addressLine1 + addressLine2: + value: addressLine2 + addressLine3: + value: addressLine3 + location1: + value: city + location2: + value: region + location3: + value: province + postalCode: + value: postalCode + location4: + value: zone + fullAddress: + value: 'addressLine1,addressLine2,addressLine3,city,region,province,postalCode' + metaInfo: + value: metaInfo + audits: + value: audits + documents: + poa: + value: proofOfAddress + poi: + value: proofOfIdentity + por: + value: proofOfRelationship + pob: + value: proofOfDateOfBirth + poe: + value: proofOfException + examples: + Success: + value: + identity: + IDSchemaVersion: + value: IDSchemaVersion + name: + value: fullName + gender: + value: gender + dob: + value: dateOfBirth + age: + value: age + introducerRID: + value: introducerRID + introducerUIN: + value: introducerUIN + introducerVID: + value: introducerVID + introducerName: + value: introducerName + phone: + value: phone + phoneNumber: + value: phone + email: + value: email + emailId: + value: email + uin: + value: UIN + individualBiometrics: + value: individualBiometrics + introducerBiometrics: + value: introducerBiometrics + individualAuthBiometrics: + value: individualAuthBiometrics + officerBiometricFileName: + value: officerBiometricFileName + supervisorBiometricFileName: + value: supervisorBiometricFileName + residenceStatus: + value: residenceStatus + preferredLanguage: + value: preferredLang + locationHierarchyForProfiling: + value: 'zone,postalCode' + addressLine1: + value: addressLine1 + addressLine2: + value: addressLine2 + addressLine3: + value: addressLine3 + location1: + value: city + location2: + value: region + location3: + value: province + postalCode: + value: postalCode + location4: + value: zone + fullAddress: + value: 'addressLine1,addressLine2,addressLine3,city,region,province,postalCode' + metaInfo: + value: metaInfo + audits: + value: audits + documents: + poa: + value: proofOfAddress + poi: + value: proofOfIdentity + por: + value: proofOfRelationship + pob: + value: proofOfDateOfBirth + poe: + value: proofOfException + operationId: get-resident-v1-proxy-config-identity-mapping + requestBody: + content: + application/json: + schema: + type: object + properties: {} + description: This API is to get identity-mapping JSON + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-acknowledgement-as-a-downloadable-PDF.yaml b/api-docs/API-to-get-acknowledgement-as-a-downloadable-PDF.yaml new file mode 100644 index 00000000000..c4a73fcea41 --- /dev/null +++ b/api-docs/API-to-get-acknowledgement-as-a-downloadable-PDF.yaml @@ -0,0 +1,145 @@ +openapi: 3.1.0 +x-stoplight: + id: clcxcbv0cvptt +info: + title: API to get acknowledgement as a downloadable PDF + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/ack/download/pdf/event/{eventId}/language/{languageCode}': + get: + summary: '/ack/download/pdf/event/{eventId}/language/{languageCode}' + tags: [] + responses: + '200': + description: |- + OK + PDF of acknowledgement with mime type of application/pdf + content: + application/pdf: + schema: + type: object + properties: {} + examples: {} + application/json: + schema: + type: object + properties: {} + examples: + 'Error: EID not available in database': + value: + id: mosip.resident.event.ack.download + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-459 + message: EID not available in database + 'Error: Acknowledgement Template Property not found': + value: + id: mosip.resident.event.ack.download + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-460 + message: Acknowledgement Template Property not found + '401': + description: |- + Unauthorized + If token is invalid or authentication has failed + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-ack-download-pdf-event-eventId-language-languageCode + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + - schema: + type: number + in: header + name: time-zone-offset + description: 'Default value : 0' + - schema: + type: string + in: header + name: locale + description: Used to get locale based values + description: This API is to convert the acknowledgement of Share credentials with partner Request as a downloadable PDF for a given event ID + parameters: + - schema: + type: string + name: eventId + in: path + required: true + - schema: + type: string + name: languageCode + in: path + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-details-about-a-registration-center.yaml b/api-docs/API-to-get-details-about-a-registration-center.yaml new file mode 100644 index 00000000000..412bb8f5603 --- /dev/null +++ b/api-docs/API-to-get-details-about-a-registration-center.yaml @@ -0,0 +1,267 @@ +openapi: 3.1.0 +x-stoplight: + id: l7vove9atb5b8 +info: + title: API to get details about a registration center + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/registrationcenters​/{langcode}​/{hierarchylevel}​/names': + parameters: + - schema: + type: string + name: langcode + in: path + required: true + - schema: + type: string + name: hierarchylevel + in: path + required: true + get: + summary: '/proxy​/masterdata​/registrationcenters​/{langcode}​/{hierarchylevel}​/names' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + registrationCenters: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + centerTypeCode: + type: string + addressLine1: + type: string + addressLine2: + type: string + addressLine3: + type: string + latitude: + type: string + longitude: + type: string + locationCode: + type: string + holidayLocationCode: + type: string + contactPhone: + type: string + workingHours: + type: string + langCode: + type: string + numberOfKiosks: + type: integer + perKioskProcessTime: + type: string + centerStartTime: + type: string + centerEndTime: + type: string + timeZone: + type: string + contactPerson: + type: string + lunchStartTime: + type: string + lunchEndTime: + type: string + isActive: + type: boolean + zoneCode: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:54:26.731Z' + metadata: null + response: + registrationCenters: + - id: '10003' + name: Souk Khemiss Mograne + centerTypeCode: REG + addressLine1: Route N1 + addressLine2: Mograne + addressLine3: MyCountry + latitude: '34.405692' + longitude: '-6.433368' + locationCode: '14023' + holidayLocationCode: KTA + contactPhone: '734239083' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 4 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Mario Speedwagon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: SAL + - id: '10005' + name: Center Mehdia + centerTypeCode: REG + addressLine1: Mehdia Road Amria mehdia + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.256414' + longitude: '-6.675499' + locationCode: '14110' + holidayLocationCode: KTA + contactPhone: '887311749' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 1 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Walter Melon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: BSN + - id: '10006' + name: Center Ouled Oujih + centerTypeCode: REG + addressLine1: Bloc 1 G1 N113 + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.262477' + longitude: '-6.618605' + locationCode: '14080' + holidayLocationCode: KTA + contactPhone: '915790305' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 5 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Barb Ackue + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: NDR + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + registrationCenters: + - id: string + name: string + centerTypeCode: string + addressLine1: string + addressLine2: string + addressLine3: string + latitude: string + longitude: string + locationCode: string + holidayLocationCode: string + contactPhone: string + workingHours: string + langCode: string + numberOfKiosks: 0 + perKioskProcessTime: string + centerStartTime: string + centerEndTime: string + timeZone: string + contactPerson: string + lunchStartTime: string + lunchEndTime: string + isActive: true + zoneCode: string + errors: null + operationId: get-proxy-masterdata-registrationcenters-langcode-hierarchylevel-names + description: This API is to get details about a registration center. + parameters: + - schema: + type: string + in: header + name: langcode + required: true + - schema: + type: string + in: header + name: hierarchylevel + required: true + - schema: + type: string + in: header + name: name + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-details-of-registration-center.yaml b/api-docs/API-to-get-details-of-registration-center.yaml new file mode 100644 index 00000000000..f8211ddf31e --- /dev/null +++ b/api-docs/API-to-get-details-of-registration-center.yaml @@ -0,0 +1,298 @@ +openapi: 3.1.0 +x-stoplight: + id: xf5nirj5wnfhe +info: + title: API to get details of registration center + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/registrationcenters​/page​/{langcode}​/{hierarchylevel}​/{name}': + parameters: + - schema: + type: string + name: langcode + in: path + required: true + - schema: + type: string + name: hierarchylevel + in: path + required: true + - schema: + type: string + name: name + in: path + required: true + get: + summary: '/proxy​/masterdata​/registrationcenters​/page​/{langcode}​/{hierarchylevel}​/{name}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + pageNo: + type: integer + pageSize: + type: integer + sort: + type: 'null' + totalItems: + type: integer + totalPages: + type: integer + data: + type: array + items: + type: object + properties: + isActive: + type: boolean + createdBy: + type: string + createdDateTime: + type: string + updatedBy: + type: 'null' + updatedDateTime: + type: 'null' + isDeleted: + type: boolean + deletedDateTime: + type: 'null' + id: + type: string + name: + type: string + centerTypeCode: + type: string + addressLine1: + type: string + addressLine2: + type: string + addressLine3: + type: string + latitude: + type: string + longitude: + type: string + locationCode: + type: string + holidayLocationCode: + type: string + contactPhone: + type: string + workingHours: + type: string + langCode: + type: string + numberOfKiosks: + type: integer + perKioskProcessTime: + type: string + centerStartTime: + type: string + centerEndTime: + type: string + timeZone: + type: string + contactPerson: + type: string + lunchStartTime: + type: string + lunchEndTime: + type: string + zoneCode: + type: string + workingNonWorkingDays: + type: 'null' + exceptionalHolidayPutPostDto: + type: 'null' + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:59:55.443Z' + metadata: null + response: + pageNo: 0 + pageSize: 10 + sort: null + totalItems: 1 + totalPages: 1 + data: + - isActive: true + createdBy: sysadmin + createdDateTime: '2022-03-16T08:09:43.412Z' + updatedBy: null + updatedDateTime: null + isDeleted: false + deletedDateTime: null + id: '10005' + name: Center Mehdia + centerTypeCode: REG + addressLine1: Mehdia Road Amria mehdia + addressLine2: Kenitra + addressLine3: Maroc + latitude: '34.256414' + longitude: '-6.675499' + locationCode: '14110' + holidayLocationCode: KTA + contactPhone: '887311749' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 1 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Walter Melon + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + zoneCode: BSN + workingNonWorkingDays: null + exceptionalHolidayPutPostDto: null + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + pageNo: 0 + pageSize: 0 + sort: null + totalItems: 0 + totalPages: 0 + data: + - isActive: true + createdBy: string + createdDateTime: string + updatedBy: null + updatedDateTime: null + isDeleted: true + deletedDateTime: null + id: string + name: string + centerTypeCode: string + addressLine1: string + addressLine2: string + addressLine3: string + latitude: string + longitude: string + locationCode: string + holidayLocationCode: string + contactPhone: string + workingHours: string + langCode: string + numberOfKiosks: 0 + perKioskProcessTime: string + centerStartTime: string + centerEndTime: string + timeZone: string + contactPerson: string + lunchStartTime: string + lunchEndTime: string + zoneCode: string + workingNonWorkingDays: null + exceptionalHolidayPutPostDto: null + errors: null + operationId: get-proxy-masterdata-registrationcenters-page-langcode-hierarchylevel-name + parameters: + - schema: + type: string + in: header + name: langcode + required: true + - schema: + type: integer + in: header + name: hierarchylevel + required: true + - schema: + type: string + in: header + name: name + required: true + - schema: + type: integer + default: 0 + in: query + name: pageNumber + - schema: + type: integer + default: 10 + in: query + name: pageSize + - schema: + type: string + default: createdDateTime + in: query + name: sortBy + - schema: + type: string + default: desc + in: query + name: orderBy + description: This API is to get the details about a registration center. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-details-of-the-print-partner.yaml b/api-docs/API-to-get-details-of-the-print-partner.yaml new file mode 100644 index 00000000000..d97d9b06c70 --- /dev/null +++ b/api-docs/API-to-get-details-of-the-print-partner.yaml @@ -0,0 +1,171 @@ +openapi: 3.1.0 +x-stoplight: + id: 5ywap8zh8hugy +info: + title: API to get details of the print partner + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /partnermanager/partners/new?partnerType=Print_Partner: + get: + summary: partnermanager/partners/new?partnerType=Print_Partner + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + partners: + type: array + items: + type: object + properties: + partnerID: + type: string + status: + type: string + organizationName: + type: string + contactNumber: + type: string + emailId: + type: string + address: + type: string + partnerType: + type: string + logoUrl: + type: string + additionalInfo: + type: object + properties: + test: + type: string + test1: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: mosip.partnermanagement.partners.retrieve + version: '1.0' + responsetime: '2022-08-23T05:14:15.504Z' + metadata: null + response: + partners: + - partnerID: '392' + status: De-active + organizationName: '392' + contactNumber: 438-795-7832 + emailId: Luna.Grant51@example.org + address: mobile + partnerType: Print_Partner + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + errors: [] + examples: + example-1: + value: + id: string + version: string + responsetime: string + metadata: null + response: + partners: + - partnerID: string + status: string + organizationName: string + contactNumber: string + emailId: string + address: string + partnerType: string + logoUrl: string + additionalInfo: + test: string + test1: string + errors: + - {} + example-2: + value: + id: mosip.partnermanagement.partners.retrieve + version: '1.0' + responsetime: '2022-08-23T05:14:15.504Z' + metadata: null + response: + partners: + - partnerID: '392' + status: De-active + organizationName: '392' + contactNumber: 438-795-7832 + emailId: Luna.Grant51@example.org + address: mobile + partnerType: Print_Partner + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + errors: [] + operationId: get-partnermanager-partners-new?partnerType=Print_Partner + description: 'This API in Partner Management Service is to get print partner details such as partner Logo, print order URL and partner check-status URL. It could be a change to the existing get Partners API for the partner type Print_Partner' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-document-details-based-on-applicant-Id.yaml b/api-docs/API-to-get-document-details-based-on-applicant-Id.yaml new file mode 100644 index 00000000000..8202a735ddc --- /dev/null +++ b/api-docs/API-to-get-document-details-based-on-applicant-Id.yaml @@ -0,0 +1,233 @@ +openapi: 3.1.0 +x-stoplight: + id: bqr3fqeb3q897 +info: + title: API to get document details based on applicant Id + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/applicanttype​/{applicantId}​/languages': + parameters: + - schema: + type: string + name: applicantId + in: path + required: true + get: + summary: 'proxy​/masterdata​/applicanttype​/{applicantId}​/languages' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + appTypeCode: + type: string + langCode: + type: string + isActive: + type: boolean + documentCategories: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + description: + type: string + langCode: + type: string + isActive: + type: boolean + documentTypes: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + description: + type: string + langCode: + type: string + isActive: + type: boolean + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:51:45.748Z' + metadata: null + response: + appTypeCode: '002' + langCode: eng + isActive: true + documentCategories: + - code: POI + name: إثبات هوية + description: إثبات الهوية + langCode: ara + isActive: true + documentTypes: + - code: CIN + name: بطاقة الهوية المرجعية + description: بطاقة الهوية المرجعية + langCode: ara + isActive: true + - code: POI + name: Proof of Identity + description: Identity Proof + langCode: eng + isActive: true + documentTypes: + - code: CIN + name: Reference Identity Card + description: Reference Identity Card + langCode: eng + isActive: true + - code: POA + name: Un justificatif de domicile + description: Preuve dadresse + langCode: fra + isActive: true + documentTypes: + - code: RNC + name: Contrat de location + description: Contrat de location dadresse + langCode: fra + isActive: true + - code: POA + name: إثبات العنوان + description: إثبات العنوان + langCode: ara + isActive: true + documentTypes: + - code: RNC + name: عقد ايجار + description: اتفاقية تأجير العنوان + langCode: ara + isActive: true + - code: POA + name: Proof of Address + description: Address Proof + langCode: eng + isActive: true + documentTypes: + - code: RNC + name: Rental contract + description: Rental Agreement of address + langCode: eng + isActive: true + - code: POI + name: Preuve didentité + description: Preuve didentité + langCode: fra + isActive: true + documentTypes: + - code: CIN + name: Carte d'identité de référence + description: Carte d'identité de référence + langCode: fra + isActive: true + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + appTypeCode: string + langCode: string + isActive: true + documentCategories: + - code: string + name: string + description: string + langCode: string + isActive: true + documentTypes: + - code: string + name: string + description: string + langCode: string + isActive: true + errors: null + operationId: get-proxy-masterdata-applicanttype-applicantId-languages + description: This API is to get the details of the uploaded document based on applicant Id. + parameters: + - schema: + type: string + in: header + name: applicantId + required: true + - schema: + type: string + in: header + name: languages + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-information-about-a-location.yaml b/api-docs/API-to-get-information-about-a-location.yaml new file mode 100644 index 00000000000..8f904c8a847 --- /dev/null +++ b/api-docs/API-to-get-information-about-a-location.yaml @@ -0,0 +1,169 @@ +openapi: 3.1.0 +x-stoplight: + id: hbttmtykmso4z +info: + title: API to get information about a location + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/locations​/info​/{locationcode}​/{langcode}': + parameters: + - schema: + type: string + name: locationcode + in: path + required: true + - schema: + type: string + name: langcode + in: path + required: true + get: + summary: 'proxy​/masterdata​/locations​/info​/{locationcode}​/{langcode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + isActive: + type: boolean + createdBy: + type: string + createdDateTime: + type: string + updatedBy: + type: 'null' + updatedDateTime: + type: 'null' + isDeleted: + type: boolean + deletedDateTime: + type: 'null' + code: + type: string + name: + type: string + hierarchyLevel: + type: integer + hierarchyName: + type: string + parentLocCode: + type: 'null' + langCode: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:43:41.399Z' + metadata: null + response: + isActive: true + createdBy: sysadmin + createdDateTime: '2022-03-16T05:50:56.999Z' + updatedBy: null + updatedDateTime: null + isDeleted: false + deletedDateTime: null + code: MOR + name: MyCountry + hierarchyLevel: 0 + hierarchyName: Country + parentLocCode: null + langCode: eng + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + isActive: true + createdBy: string + createdDateTime: string + updatedBy: null + updatedDateTime: null + isDeleted: true + deletedDateTime: null + code: string + name: string + hierarchyLevel: 0 + hierarchyName: string + parentLocCode: null + langCode: string + errors: null + operationId: get-proxy-masterdata-locations-info-locationcode-langcode + parameters: + - schema: + type: string + in: header + name: locationcode + required: true + - schema: + type: string + in: header + name: langcode + required: true + description: This API is to get the information about location. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-latitude,-longitude-and-proximity-distance.yaml b/api-docs/API-to-get-latitude,-longitude-and-proximity-distance.yaml new file mode 100644 index 00000000000..027e65ee64f --- /dev/null +++ b/api-docs/API-to-get-latitude,-longitude-and-proximity-distance.yaml @@ -0,0 +1,250 @@ +openapi: 3.1.0 +x-stoplight: + id: 6rt0saqx9c3vn +info: + title: 'API to get latitude, longitude and proximity distance' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/​proxy​/masterdata​/getcoordinatespecificregistrationcenters​/{langcode}​/{longitude}​/{latitude}​/{proximitydistance}': + parameters: + - schema: + type: string + name: langcode + in: path + required: true + - schema: + type: string + name: longitude + in: path + required: true + - schema: + type: string + name: latitude + in: path + required: true + - schema: + type: string + name: proximitydistance + in: path + required: true + get: + summary: '​/proxy​/masterdata​/getcoordinatespecificregistrationcenters​/{langcode}​/{longitude}​/{latitude}​/{proximitydistance}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + registrationCenters: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + centerTypeCode: + type: string + addressLine1: + type: string + addressLine2: + type: string + addressLine3: + type: string + latitude: + type: string + longitude: + type: string + locationCode: + type: string + holidayLocationCode: + type: string + contactPhone: + type: string + workingHours: + type: string + langCode: + type: string + numberOfKiosks: + type: integer + perKioskProcessTime: + type: string + centerStartTime: + type: string + centerEndTime: + type: string + timeZone: + type: string + contactPerson: + type: string + lunchStartTime: + type: string + lunchEndTime: + type: string + isActive: + type: boolean + zoneCode: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:47:32.036Z' + metadata: null + response: + registrationCenters: + - id: '10004' + name: Center Assam + centerTypeCode: REG + addressLine1: 7 Km Tangier Road + addressLine2: Kenitra + addressLine3: MyCountry + latitude: '34.287879' + longitude: '-6.516428' + locationCode: '14000' + holidayLocationCode: KTA + contactPhone: '937997757' + workingHours: '8:00:00' + langCode: eng + numberOfKiosks: 2 + perKioskProcessTime: '00:15:00' + centerStartTime: '09:00:00' + centerEndTime: '17:00:00' + timeZone: '(GTM+01:00) CENTRAL EUROPEAN TIME' + contactPerson: Paige Turner + lunchStartTime: '13:00:00' + lunchEndTime: '14:00:00' + isActive: true + zoneCode: RBT + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + registrationCenters: + - id: string + name: string + centerTypeCode: string + addressLine1: string + addressLine2: string + addressLine3: string + latitude: string + longitude: string + locationCode: string + holidayLocationCode: string + contactPhone: string + workingHours: string + langCode: string + numberOfKiosks: 0 + perKioskProcessTime: string + centerStartTime: string + centerEndTime: string + timeZone: string + contactPerson: string + lunchStartTime: string + lunchEndTime: string + isActive: true + zoneCode: string + errors: null + operationId: get-proxy-masterdata-getcoordinatespecificregistrationcenters-langcode-longitude-latitude-proximitydistance + requestBody: + content: + application/json: + schema: + type: object + properties: {} + application/xml: + schema: + type: object + properties: {} + multipart/form-data: + schema: + type: object + properties: {} + description: '' + parameters: + - schema: + type: string + in: query + - schema: + type: string + in: header + name: langcode + - schema: + type: number + in: header + name: longitude + - schema: + type: number + in: header + name: latitude + - schema: + type: string + in: header + name: proximitydistance + description: 'This API is to get the longitude, latitude and proximity distance.' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-list-of-documents-for-a-transaction-ID.yaml b/api-docs/API-to-get-list-of-documents-for-a-transaction-ID.yaml new file mode 100644 index 00000000000..241ceebe5e3 --- /dev/null +++ b/api-docs/API-to-get-list-of-documents-for-a-transaction-ID.yaml @@ -0,0 +1,207 @@ +openapi: 3.1.0 +x-stoplight: + id: 3b7qa85tsymu8 +info: + title: API to get list of documents for a transaction ID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/documents​/{transaction-id}': + parameters: + - schema: + type: string + name: transaction-id + in: path + required: true + get: + summary: Get documents for given transaction-id + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: object + properties: {} + response: + type: array + items: + type: object + properties: + transactionId: + type: string + docId: + type: string + docName: + type: string + docCatCode: + type: string + docTypCode: + type: string + docFileFormat: + type: string + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + example-1: + id: string + version: string + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: + - transactionId: string + docId: string + docName: string + docCatCode: string + docTypCode: string + docFileFormat: string + errors: + - errorCode: string + message: string + examples: + Success: + value: + id: mosip.resident.document.list + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: + - transactionId: string + docId: string + docName: string + docCatCode: string + docTypCode: string + docFileFormat: string + errors: null + 'Error: Document not found for the transaction id': + value: + id: mosip.resident.document.list + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-461 + message: 'No document found for transactionID: 1234567890' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:04.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-documents-transaction-id + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: This API is to get the list of documents for a given transaction Id. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-location-hierarchy-level.yaml b/api-docs/API-to-get-location-hierarchy-level.yaml new file mode 100644 index 00000000000..50dd6d4f7bf --- /dev/null +++ b/api-docs/API-to-get-location-hierarchy-level.yaml @@ -0,0 +1,160 @@ +openapi: 3.1.0 +x-stoplight: + id: e8zrr3oxo1145 +info: + title: API to get location hierarchy level + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/locationHierarchyLevels​/{langcode}': + parameters: + - schema: + type: string + name: langcode + in: path + required: true + get: + summary: 'proxy​/masterdata​/locationHierarchyLevels​/{langcode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + locationHierarchyLevels: + type: array + items: + type: object + properties: + hierarchyLevel: + type: integer + hierarchyLevelName: + type: string + langCode: + type: string + isActive: + type: boolean + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:39:47.213Z' + metadata: null + response: + locationHierarchyLevels: + - hierarchyLevel: 0 + hierarchyLevelName: Country + langCode: eng + isActive: true + - hierarchyLevel: 1 + hierarchyLevelName: Region + langCode: eng + isActive: true + - hierarchyLevel: 2 + hierarchyLevelName: Province + langCode: eng + isActive: true + - hierarchyLevel: 3 + hierarchyLevelName: City + langCode: eng + isActive: true + - hierarchyLevel: 4 + hierarchyLevelName: Zone + langCode: eng + isActive: true + - hierarchyLevel: 5 + hierarchyLevelName: Postal Code + langCode: eng + isActive: true + - hierarchyLevel: 6 + hierarchyLevelName: sub-zone + langCode: eng + isActive: true + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + locationHierarchyLevels: + - hierarchyLevel: 0 + hierarchyLevelName: string + langCode: string + isActive: true + errors: null + operationId: get-proxy-masterdata-locationHierarchyLevels-langcode + description: This API is to get the hierarchy level of location. + requestBody: + content: + application/json: + schema: + type: object + properties: {} + parameters: + - schema: + type: string + in: header + name: langcode + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-lockunlock-status.yaml b/api-docs/API-to-get-lockunlock-status.yaml new file mode 100644 index 00000000000..b0ac17c06d5 --- /dev/null +++ b/api-docs/API-to-get-lockunlock-status.yaml @@ -0,0 +1,248 @@ +openapi: 3.1.0 +x-stoplight: + id: 8rqp3mryp6j33 +info: + title: unlock status + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /auth-lock-status: + get: + summary: /auth-lock-status + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + authTypes: + type: array + items: + type: object + properties: + authType: + type: string + authSubType: + type: + - 'null' + - string + locked: + type: boolean + unlockForSeconds: + type: 'null' + requestId: + type: 'null' + metadata: + type: 'null' + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: null + version: null + responsetime: '2022-09-30T04:37:00.466Z' + metadata: null + response: + authTypes: + - authType: otp + authSubType: email + locked: false + unlockForSeconds: null + requestId: null + metadata: null + - authType: bio + authSubType: FACE + locked: false + unlockForSeconds: null + requestId: null + metadata: null + - authType: bio + authSubType: FINGER + locked: false + unlockForSeconds: null + requestId: null + metadata: null + - authType: demo + authSubType: null + locked: true + unlockForSeconds: null + requestId: null + metadata: null + - authType: otp + authSubType: phone + locked: false + unlockForSeconds: null + requestId: null + metadata: null + - authType: bio + authSubType: IRIS + locked: false + unlockForSeconds: null + requestId: null + metadata: null + errors: [] + examples: + Success: + value: + id: mosip.resident.auth.lock.status + version: '1.0' + responsetime: '2022-06-15T02:51:50.278Z' + response: + authTypes: + - authType: bio + authSubType: FACE + locked: false + unlockForSeconds: 30 + - authType: bio + authSubType: FINGER + locked: false + unlockForSeconds: 45 + - authType: bio + authSubType: IRIS + locked: false + unlockForSeconds: null + - authType: demo + authSubType: null + locked: true + unlockForSeconds: null + - authType: otp + authSubType: email + locked: false + unlockForSeconds: null + - authType: otp + authSubType: phone + locked: false + unlockForSeconds: 50 + errors: [] + 'Error: Unable to access the dependent APIs': + value: + id: mosip.resident.auth.lock.status + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-412 + message: Unable to access API resource + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + 'Error: Authentication Failure': + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-auth-lock-status + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + description: This API is to get the status of various authentication types. + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-resident-properties-based-on-the-allowed-configurations-property-keys.yaml b/api-docs/API-to-get-resident-properties-based-on-the-allowed-configurations-property-keys.yaml new file mode 100644 index 00000000000..a781b961bd7 --- /dev/null +++ b/api-docs/API-to-get-resident-properties-based-on-the-allowed-configurations-property-keys.yaml @@ -0,0 +1,171 @@ +openapi: 3.1.0 +x-stoplight: + id: ysrya29nyukbs +info: + title: API to get resident properties based on the allowed configurations property keys + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + proxy​/config​/ui-properties: + get: + summary: proxy​/config​/ui-properties + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + mosip-prereg-ui-url: + type: string + mosip.resident.api.id.auth: + type: string + resident.revokevid.version: + type: string + resident.datetime.pattern: + type: string + resident.vid.id: + type: string + mosip.mandatory-languages: + type: string + resident.authunlock.id: + type: string + resident.vid.version: + type: string + resident.revokevid.id: + type: string + mosip.resident.api.id.otp.request: + type: string + mosip.resident.api.version.otp.request: + type: string + resident.authhistory.id: + type: string + auth.type.status.id: + type: string + mosip.resident.api.version.auth: + type: string + resident.updateuin.id: + type: string + mosip-prereg-host: + type: string + mosip.optional-languages: + type: string + mosip.utc-datetime-pattern: + type: string + mosip.iam.adapter.clientid: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-03T15:10:31.221Z' + metadata: null + response: + mosip-prereg-ui-url: 'https://prereg.dev3.mosip.net/pre-registration-ui/' + mosip.resident.api.id.auth: mosip.identity.auth.internal + resident.revokevid.version: v1 + resident.datetime.pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + resident.vid.id: mosip.resident.vid + mosip.mandatory-languages: eng + resident.authunlock.id: mosip.resident.authunlock + resident.vid.version: v1 + resident.revokevid.id: mosip.resident.vidstatus + mosip.resident.api.id.otp.request: mosip.identity.otp.internal + mosip.resident.api.version.otp.request: '1.0' + resident.authhistory.id: mosip.resident.authhistory + auth.type.status.id: mosip.identity.authtype.status.update + mosip.resident.api.version.auth: '1.0' + resident.updateuin.id: mosip.resident.updateuin + mosip-prereg-host: prereg.dev3.mosip.net + mosip.optional-languages: 'fra,ara' + mosip.utc-datetime-pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + mosip.iam.adapter.clientid: mosip-resident-client + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: '2022-06-03T15:10:31.221Z' + metadata: null + response: + mosip-prereg-ui-url: 'https://prereg.dev3.mosip.net/pre-registration-ui/' + mosip.resident.api.id.auth: mosip.identity.auth.internal + resident.revokevid.version: v1 + resident.datetime.pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + resident.vid.id: mosip.resident.vid + mosip.mandatory-languages: eng + resident.authunlock.id: mosip.resident.authunlock + resident.vid.version: v1 + resident.revokevid.id: mosip.resident.vidstatus + mosip.resident.api.id.otp.request: mosip.identity.otp.internal + mosip.resident.api.version.otp.request: '1.0' + resident.authhistory.id: mosip.resident.authhistory + auth.type.status.id: mosip.identity.authtype.status.update + mosip.resident.api.version.auth: '1.0' + resident.updateuin.id: mosip.resident.updateuin + mosip-prereg-host: prereg.dev3.mosip.net + mosip.optional-languages: 'fra,ara' + mosip.utc-datetime-pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + mosip.iam.adapter.clientid: mosip-resident-client + errors: null + operationId: get-resident-v1-proxy-config-ui-properties + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-response-parameters-of-the-payment-when-ordering-a-physical-card.yaml b/api-docs/API-to-get-response-parameters-of-the-payment-when-ordering-a-physical-card.yaml new file mode 100644 index 00000000000..0a16555bbbd --- /dev/null +++ b/api-docs/API-to-get-response-parameters-of-the-payment-when-ordering-a-physical-card.yaml @@ -0,0 +1,112 @@ +openapi: 3.1.0 +x-stoplight: + id: dgjklrvrn6lox +info: + title: API to get response parameters of the payment when ordering a physical card + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /order/physical-card: + get: + summary: order/physical-card + tags: [] + responses: + '302': + description: |- + #Upon valid request: + 302 redirection to the giver redirect URL (which is Resident Services card/order-redirect API). + + ##Query Params: + + * eventId - The event ID provided by resident service + + * paymentTransactionId - The payment transaction ID for the payment made by the resident + + * residentFullAddress - required- base64-url encoded full address string - full address specified by the user during card ordering in Print Partner’s order-card page. + + + #Upon invalid request: + + ##Query params: + + * error_code: refer to below table + + * error_message: refer to below table + content: + text/plain: + schema: + type: object + properties: {} + examples: + Upon valid request: + value: 302 redirection to Resident Services card/order-redirect API. + operationId: get-order-physical-card + parameters: + - schema: + type: string + in: query + name: redirectUrl + required: true + description: The base64 encoded URL for Resident-Service’s order handling API. + - schema: + type: string + in: query + name: eventId + required: true + description: the event ID to be used to track the status of whole process of order untill the card delivery. + - schema: + type: string + in: query + name: 'residentName ' + required: true + description: resident name - for display purpose in Print Partner’s order-card page + - schema: + type: string + in: query + name: residentDefaultFullAddress + required: true + description: base64-url encoded full address string - for display purpose in Print Partner’s order-card page + description: 'This API is the redirect page on Print partner''s portal, and based on the resident''s action such as order confirmation / order cancellation / payment failure it will redirect with the response parameters.' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-supporting-documents-for-document-type.yaml b/api-docs/API-to-get-supporting-documents-for-document-type.yaml new file mode 100644 index 00000000000..de421e41a7b --- /dev/null +++ b/api-docs/API-to-get-supporting-documents-for-document-type.yaml @@ -0,0 +1,599 @@ +openapi: 3.1.0 +x-stoplight: + id: jsvf9wrhw2xel +info: + title: API to get valid documents details + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/validdocuments​/{langCode}': + parameters: + - schema: + type: string + name: langCode + in: path + required: true + get: + summary: '/proxy​/masterdata​/validdocuments​/{langCode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + documentcategories: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + description: + type: string + langCode: + type: string + isActive: + type: boolean + documenttypes: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + description: + type: string + langCode: + type: string + isActive: + type: boolean + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:30:40.093Z' + metadata: null + response: + documentcategories: + - code: POA + name: Proof of Address + description: Address Proof + langCode: eng + isActive: true + documenttypes: + - code: RNC + name: Rental contract + description: Rental Agreement of address + langCode: eng + isActive: true + - code: COR + name: Certificate of residence + description: Proof of Resident + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: DOC002 + name: PAN card + description: PAN card + langCode: eng + isActive: true + - code: DOC004 + name: Voter Identification card + description: Voter Identification card + langCode: eng + isActive: true + - code: DOC005 + name: Driving licence of the applicant + description: Driving licence of the applicant + langCode: eng + isActive: true + - code: DOC006 + name: Photo identification cards issued by the Government + description: Photo identification cards issued by the Government + langCode: eng + isActive: true + - code: DOC008 + name: Licence of Arms + description: Licence of Arms + langCode: eng + isActive: true + - code: DOC011 + name: Photo card of the Freedom Fighter + description: Photo card of the Freedom Fighter + langCode: eng + isActive: true + - code: DOC013 + name: Passbook or Bank Statement + description: Passbook or Bank Statement + langCode: eng + isActive: true + - code: DOC014 + name: Account statement or passbook of the Post Office + description: Account statement or passbook of the Post Office + langCode: eng + isActive: true + - code: DOC015 + name: Ration Card + description: Ration Card + langCode: eng + isActive: true + - code: DOC016 + name: PSU issued Service photo ID card with address + description: PSU issued Service photo ID card with address + langCode: eng + isActive: true + - code: DOC017 + name: Previous 3 months’ electricity bill + description: Previous 3 months’ electricity bill + langCode: eng + isActive: true + - code: DOC018 + name: Water bill as long as it is not more than 3 months’ old + description: Water bill as long as it is not more than 3 months’ old + langCode: eng + isActive: true + - code: POI + name: Proof of Identity + description: Identity Proof + langCode: eng + isActive: true + documenttypes: + - code: CIN + name: Reference Identity Card + description: Reference Identity Card + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: DOC002 + name: PAN card + description: PAN card + langCode: eng + isActive: true + - code: DOC003 + name: Either Ration or PDS Photo card + description: Either Ration or PDS Photo card + langCode: eng + isActive: true + - code: DOC004 + name: Voter Identification card + description: Voter Identification card + langCode: eng + isActive: true + - code: DOC005 + name: Driving licence of the applicant + description: Driving licence of the applicant + langCode: eng + isActive: true + - code: DOC006 + name: Photo identification cards issued by the Government + description: Photo identification cards issued by the Government + langCode: eng + isActive: true + - code: DOC007 + name: Service photo ID cards that is issued by a PSU + description: Service photo ID cards that is issued by a PSU + langCode: eng + isActive: true + - code: DOC008 + name: Licence of Arms + description: Licence of Arms + langCode: eng + isActive: true + - code: DOC009 + name: Photo Bank ATM card + description: Photo Bank ATM card + langCode: eng + isActive: true + - code: DOC010 + name: Photo Credit card + description: Photo Credit card + langCode: eng + isActive: true + - code: DOC011 + name: Photo card of the Freedom Fighter + description: Photo card of the Freedom Fighter + langCode: eng + isActive: true + - code: DOC012 + name: Certificate of Marriage + description: Certificate of Marriage + langCode: eng + isActive: true + - code: POR + name: Proof of Relationship + description: Proof Relationship of the person + langCode: eng + isActive: true + documenttypes: + - code: CIN + name: Reference Identity Card + description: Reference Identity Card + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: CRN + name: Certificate of Relationship + description: Proof relationship of a person + langCode: eng + isActive: true + - code: DOC024 + name: PDS Card + description: PDS Card + langCode: eng + isActive: true + - code: DOC025 + name: 'Medical card issued by the State Govt, CGHS, ECHS and ESIC' + description: 'Medical card issued by the State Government, CGHS, ECHS and also ESIC' + langCode: eng + isActive: true + - code: DOC026 + name: Canteen card of the Army + description: Canteen card of the Army + langCode: eng + isActive: true + - code: DOC027 + name: Family entitlement document + description: Any family entitlement document issued by any Central or State Government + langCode: eng + isActive: true + - code: DOC028 + name: Birth Certificate + description: Registrar of Birth/municipal Corporation or any local government Birth Certificate + langCode: eng + isActive: true + - code: POE + name: Proof of Biometric Exception + description: Proof of Biometric Exception + langCode: eng + isActive: true + documenttypes: + - code: COE + name: Certification of Exception + description: Certificate of Exception + langCode: eng + isActive: true + - code: EOP + name: Expetion Photo + description: Expetion Photo + langCode: eng + isActive: true + - code: '1246' + name: DocCat + description: some categorized doc + langCode: eng + isActive: true + documenttypes: [] + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + documentcategories: + - code: string + name: string + description: string + langCode: string + isActive: true + documenttypes: + - code: string + name: string + description: string + langCode: string + isActive: true + errors: null + example-1: + value: + id: null + version: null + responsetime: '2022-06-14T07:30:40.093Z' + metadata: null + response: + documentcategories: + - code: POA + name: Proof of Address + description: Address Proof + langCode: eng + isActive: true + documenttypes: + - code: RNC + name: Rental contract + description: Rental Agreement of address + langCode: eng + isActive: true + - code: COR + name: Certificate of residence + description: Proof of Resident + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: DOC002 + name: PAN card + description: PAN card + langCode: eng + isActive: true + - code: DOC004 + name: Voter Identification card + description: Voter Identification card + langCode: eng + isActive: true + - code: DOC005 + name: Driving licence of the applicant + description: Driving licence of the applicant + langCode: eng + isActive: true + - code: DOC006 + name: Photo identification cards issued by the Government + description: Photo identification cards issued by the Government + langCode: eng + isActive: true + - code: DOC008 + name: Licence of Arms + description: Licence of Arms + langCode: eng + isActive: true + - code: DOC011 + name: Photo card of the Freedom Fighter + description: Photo card of the Freedom Fighter + langCode: eng + isActive: true + - code: DOC013 + name: Passbook or Bank Statement + description: Passbook or Bank Statement + langCode: eng + isActive: true + - code: DOC014 + name: Account statement or passbook of the Post Office + description: Account statement or passbook of the Post Office + langCode: eng + isActive: true + - code: DOC015 + name: Ration Card + description: Ration Card + langCode: eng + isActive: true + - code: DOC016 + name: PSU issued Service photo ID card with address + description: PSU issued Service photo ID card with address + langCode: eng + isActive: true + - code: DOC017 + name: Previous 3 months’ electricity bill + description: Previous 3 months’ electricity bill + langCode: eng + isActive: true + - code: DOC018 + name: Water bill as long as it is not more than 3 months’ old + description: Water bill as long as it is not more than 3 months’ old + langCode: eng + isActive: true + - code: POI + name: Proof of Identity + description: Identity Proof + langCode: eng + isActive: true + documenttypes: + - code: CIN + name: Reference Identity Card + description: Reference Identity Card + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: DOC002 + name: PAN card + description: PAN card + langCode: eng + isActive: true + - code: DOC003 + name: Either Ration or PDS Photo card + description: Either Ration or PDS Photo card + langCode: eng + isActive: true + - code: DOC004 + name: Voter Identification card + description: Voter Identification card + langCode: eng + isActive: true + - code: DOC005 + name: Driving licence of the applicant + description: Driving licence of the applicant + langCode: eng + isActive: true + - code: DOC006 + name: Photo identification cards issued by the Government + description: Photo identification cards issued by the Government + langCode: eng + isActive: true + - code: DOC007 + name: Service photo ID cards that is issued by a PSU + description: Service photo ID cards that is issued by a PSU + langCode: eng + isActive: true + - code: DOC008 + name: Licence of Arms + description: Licence of Arms + langCode: eng + isActive: true + - code: DOC009 + name: Photo Bank ATM card + description: Photo Bank ATM card + langCode: eng + isActive: true + - code: DOC010 + name: Photo Credit card + description: Photo Credit card + langCode: eng + isActive: true + - code: DOC011 + name: Photo card of the Freedom Fighter + description: Photo card of the Freedom Fighter + langCode: eng + isActive: true + - code: DOC012 + name: Certificate of Marriage + description: Certificate of Marriage + langCode: eng + isActive: true + - code: POR + name: Proof of Relationship + description: Proof Relationship of the person + langCode: eng + isActive: true + documenttypes: + - code: CIN + name: Reference Identity Card + description: Reference Identity Card + langCode: eng + isActive: true + - code: DOC001 + name: Passport + description: Proof of Idendity + langCode: eng + isActive: true + - code: CRN + name: Certificate of Relationship + description: Proof relationship of a person + langCode: eng + isActive: true + - code: DOC024 + name: PDS Card + description: PDS Card + langCode: eng + isActive: true + - code: DOC025 + name: 'Medical card issued by the State Govt, CGHS, ECHS and ESIC' + description: 'Medical card issued by the State Government, CGHS, ECHS and also ESIC' + langCode: eng + isActive: true + - code: DOC026 + name: Canteen card of the Army + description: Canteen card of the Army + langCode: eng + isActive: true + - code: DOC027 + name: Family entitlement document + description: Any family entitlement document issued by any Central or State Government + langCode: eng + isActive: true + - code: DOC028 + name: Birth Certificate + description: Registrar of Birth/municipal Corporation or any local government Birth Certificate + langCode: eng + isActive: true + - code: POE + name: Proof of Biometric Exception + description: Proof of Biometric Exception + langCode: eng + isActive: true + documenttypes: + - code: COE + name: Certification of Exception + description: Certificate of Exception + langCode: eng + isActive: true + - code: EOP + name: Expetion Photo + description: Expetion Photo + langCode: eng + isActive: true + - code: '1246' + name: DocCat + description: some categorized doc + langCode: eng + isActive: true + documenttypes: [] + errors: null + operationId: get-proxy-masterdata-validdocuments-langCode + parameters: + - schema: + type: string + in: header + name: langCode + required: true + description: This API is to get the list of supporting documents for a particular document type. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-Auth-Transaction-event-in-callback.yaml b/api-docs/API-to-get-the-Auth-Transaction-event-in-callback.yaml new file mode 100644 index 00000000000..27741a290af --- /dev/null +++ b/api-docs/API-to-get-the-Auth-Transaction-event-in-callback.yaml @@ -0,0 +1,181 @@ +openapi: 3.1.0 +x-stoplight: + id: xhljgo1cjk958 +info: + title: API to get the Auth Transaction event in callback + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /callback​/authTransaction: + post: + summary: /callback​/authTransaction + operationId: post-callback-authTransaction + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + example-1: + id: null + version: v1 + responsetime: '2022-06-10T12:00:43.226Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-418 + message: 'KER-WSC-106 --> Error occured while verifing authenticated content :- header for signature is empty or null' + examples: + Success: + value: + id: null + version: v1 + responsetime: '2022-06-10T12:00:43.226Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-418 + message: 'KER-WSC-106 --> Error occured while verifing authenticated content :- header for signature is empty or null' + description: This API is to get the Auth Transaction event in callback for each Online Verification Partner and store it in auth_transactions table along with the Online Verification Partner ID in a new column. + requestBody: + content: + application/json: + schema: + type: object + properties: + publisher: + type: string + topic: + type: string + publishedOn: + type: string + event: + type: object + properties: + id: + type: string + transactionId: + type: string + type: + type: object + properties: + namespace: + type: string + name: + type: string + timestamp: + type: string + dataShareUri: + type: string + data: + type: object + properties: + additionalProp1: + type: object + properties: {} + additionalProp2: + type: object + properties: {} + additionalProp3: + type: object + properties: {} + x-examples: + example-1: + publisher: string + topic: string + publishedOn: string + event: + id: string + transactionId: string + type: + namespace: string + name: string + timestamp: string + dataShareUri: string + data: + additionalProp1: {} + additionalProp2: {} + additionalProp3: {} + examples: + example-1: + value: + publisher: string + topic: string + publishedOn: string + event: + id: string + transactionId: string + type: + namespace: string + name: string + timestamp: string + dataShareUri: string + data: + additionalProp1: {} + additionalProp2: {} + additionalProp3: {} +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-ID-attributes-for-a-session.yaml b/api-docs/API-to-get-the-ID-attributes-for-a-session.yaml new file mode 100644 index 00000000000..4812b35b22f --- /dev/null +++ b/api-docs/API-to-get-the-ID-attributes-for-a-session.yaml @@ -0,0 +1,240 @@ +openapi: 3.1.0 +x-stoplight: + id: mj7f4n76k8s6c +info: + title: API to get the ID attributes for a session + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /identity/info: + get: + summary: /identity/info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + fullName: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + dateOfBirth: + type: string + gender: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + region: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + province: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + city: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + zone: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + postalCode: + type: string + residenceStatus: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + addressLine1: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + phone: + type: string + email: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T08:18:16.563Z' + metadata: null + response: + fullName: + - language: ara + value: Manoj_ara + - language: eng + value: Manoj_eng + dateOfBirth: 1972/05/07 + gender: + - language: eng + value: Male + region: + - language: eng + value: RSK + province: + - language: ara + value: KTA + - language: eng + value: KTA + city: + - language: eng + value: KNT + - language: ara + value: KNT + zone: + - language: eng + value: BNMR + postalCode: '14022' + residenceStatus: + - language: ara + value: Foreigner + - language: eng + value: Foreigner + addressLine1: + - language: ara + value: '#991, 47 Street, 6 block' + - language: eng + value: '#٩٩١، ٤٧ سترِِت، ٦ بلُكك' + phone: '9395910872' + email: manojvsp12@gmail.com + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + fullName: + - language: string + value: string + dateOfBirth: string + gender: + - language: string + value: string + region: + - language: string + value: string + province: + - language: string + value: string + city: + - language: string + value: string + zone: + - language: string + value: string + postalCode: string + residenceStatus: + - language: string + value: string + addressLine1: + - language: string + value: string + phone: string + email: string + errors: null + operationId: get-identity-info +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-Resident-UI-Spec.yaml b/api-docs/API-to-get-the-Resident-UI-Spec.yaml new file mode 100644 index 00000000000..6c38217d9ce --- /dev/null +++ b/api-docs/API-to-get-the-Resident-UI-Spec.yaml @@ -0,0 +1,1602 @@ +openapi: 3.1.0 +x-stoplight: + id: 5hdrjh72wjrd3 +info: + title: API to get the Resident UI Spec + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /proxy​/config​/ui-schema: + get: + summary: /proxy​/config​/ui-schema + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + identity: + type: array + items: + type: object + properties: + id: + type: string + description: + type: string + type: + type: string + controlType: + type: + - 'null' + - string + fieldType: + type: string + inputRequired: + type: boolean + validators: + type: array + items: + type: object + properties: + type: + type: string + validator: + type: string + arguments: + type: array + items: + type: object + properties: {} + required: + type: boolean + labelName: + type: object + properties: + fra: + type: string + ara: + type: string + eng: + type: string + kan: + type: string + hin: + type: string + tam: + type: string + visible: + type: boolean + group: + type: string + preview: + type: boolean + subType: + type: string + locationHierarchy: + type: array + items: + type: string + x-examples: + example-1: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + examples: + example-1: + value: + identity: + - id: string + description: string + type: string + controlType: null + fieldType: string + inputRequired: true + validators: + - type: string + validator: string + arguments: + - {} + required: true + labelName: + fra: string + ara: string + eng: string + kan: string + hin: string + tam: string + visible: true + group: string + preview: true + subType: string + locationHierarchy: + - string + Success: + value: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + operationId: get-proxy-config-ui-schema + description: This API is to get the Resident UI spec. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-immediate-children-in-hierarchy-of-location.yaml b/api-docs/API-to-get-the-immediate-children-in-hierarchy-of-location.yaml new file mode 100644 index 00000000000..8106ea4d8e3 --- /dev/null +++ b/api-docs/API-to-get-the-immediate-children-in-hierarchy-of-location.yaml @@ -0,0 +1,154 @@ +openapi: 3.1.0 +x-stoplight: + id: 3z78qxght4htl +info: + title: API to get the immediate children in hierarchy of location + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/locations​/immediatechildren​/{locationcode}​': + parameters: + - schema: + type: string + name: locationcode + in: path + required: true + - schema: + type: string + name: langcode + in: path + required: true + get: + summary: '/proxy​/masterdata​/locations​/immediatechildren​/{locationcode}​/{langcode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + locations: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + hierarchyLevel: + type: integer + hierarchyName: + type: string + parentLocCode: + type: string + langCode: + type: string + isActive: + type: boolean + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:41:42.091Z' + metadata: null + response: + locations: + - code: RSK + name: Rabat Sale Kenitra + hierarchyLevel: 1 + hierarchyName: Region + parentLocCode: MOR + langCode: eng + isActive: true + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + locations: + - code: string + name: string + hierarchyLevel: 0 + hierarchyName: string + parentLocCode: string + langCode: string + isActive: true + errors: null + operationId: get-proxy-masterdata-locations-immediatechildren-locationcode-langcode + description: This API is to get the immediate children for a location. + parameters: + - schema: + type: string + in: header + name: locationcode + required: true + - schema: + type: string + in: header + name: langcode + required: true + x-stoplight: + id: lfpdy3vdkuoop +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-number-of-unread-service-messages-for-the-user..yaml b/api-docs/API-to-get-the-number-of-unread-service-messages-for-the-user..yaml new file mode 100644 index 00000000000..fe0e270f6b9 --- /dev/null +++ b/api-docs/API-to-get-the-number-of-unread-service-messages-for-the-user..yaml @@ -0,0 +1,123 @@ +openapi: 3.1.0 +x-stoplight: + id: uuyz2vqxjgee3 +info: + title: API to get the number of unread service messages for the user. + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /unread/notification-count: + get: + summary: unread/notification-count + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + unreadCount: + type: integer + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-19T09:31:25.206Z' + metadata: null + response: + unreadCount: 383 + errors: null + examples: + example-1: + value: + id: mosip.resident.event.unread.count + version: '1.0' + responsetime: '2022-09-19T09:31:25.206Z' + metadata: null + response: + unreadCount: 0 + errors: null + example-2: + value: + id: mosip.resident.event.unread.count + version: '1.0' + responsetime: '2022-09-19T09:31:25.206Z' + metadata: null + response: + unreadCount: 383 + errors: null + '401': + description: Unauthorized + operationId: get-unread-notification-count + parameters: + - schema: + type: string + in: cookie + name: Authorization Token + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: API to return the number of unread service notification list after the last click done on the notification section. This is an authenticated API. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-status-for-a-given-AID.yaml b/api-docs/API-to-get-the-status-for-a-given-AID.yaml new file mode 100644 index 00000000000..fe9ed7da7e8 --- /dev/null +++ b/api-docs/API-to-get-the-status-for-a-given-AID.yaml @@ -0,0 +1,501 @@ +openapi: 3.1.0 +x-stoplight: + id: uhtqyu39omreh +info: + title: API to get the status for a given AID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + 'events/{event-id}?langCode={language-code}': + parameters: + - schema: + type: string + name: event-id + in: path + required: true + - schema: + type: string + name: language-code + in: path + required: true + get: + summary: 'events/{event-id}?langCode={language-code}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + response: + type: object + properties: + eventId: + type: string + eventType: + type: string + eventStatus: + type: string + individualId: + type: string + summary: + type: string + timestamp: + type: string + info: + type: object + properties: + purpose: + type: string + applicantName: + type: string + partnerId: + type: string + partnerLogo: + type: string + partnerName: + type: string + paymentStatus: + type: string + partnerTransactionId: + type: string + deliveryAddress: + type: string + authenticationMode: + type: string + vidType: + type: string + vid: + type: string + attributeList: + type: string + downloadCardLink: + type: string + orderTrackingLink: + type: string + trackingId: + type: string + requestTime: + type: string + x-examples: + example-1: + id: mosip.resident.event.status + version: '1.0' + response: + eventId: the event ID + eventType: SHARE_CRED_WITH_PARTNER + eventStatus: failed/success/in-progress + individualId: + summary: string + timestamp: '2022-06-03T06:13:29.330Z' + info: + purpose: string + applicantName: string + partnerId: string + partnerLogo: Base64encoded + partnerName: string + paymentStatus: string + partnerTransactionId: string + deliveryAddress: string + authenticationMode: string + vidType: string + vid: string + attributeList: array + downloadCardLink: string + orderTrackingLink: string + trackingId: string + requestTime: '2022-06-03T06:14:29.330Z' + examples: + Success: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T09:59:03.119Z' + response: + eventId: 86c2ad43-e2a4-4952-bafc-d97ad1e5e453 + eventType: AUTHENTICATION_REQUEST/GENERATE_VID/REVOKE_VID/AUTH_TYPE_LOCK_UNLOCK/UPDATE_MY_UIN/DOWNLOAD_PERSONALIZED_CARD/ORDER_PHYSICAL_CARD/SHARE_CRED_WITH_PARTNER/GET_MY_ID/VERIFY_PHONE_EMAIL + eventStatus: IN_PROGRESS + individualId: '8736474831' + summary: 'Authentication request using demograpihcs, E-Mail OTP, bio-Face Succeeded' + timestamp: '2022-07-22T07:05:35.646Z' + info: + description: 'demo, otp-email, bio-FACE' + partnerName: partnerName + partnerId: string + partnerLogo: Base64encoded image that can be rendered in html + authenticationMode: otp + vid: vid + vidType: vidType + downloadCardLink: downloadCardLink + orderTrackingLink: orderTrackingLink + paymentStatus: failed / success / in-progress + partnerTransactionId: string + deliveryAddress: string + trackingId: trackingId + errors: [] + Authentication Request: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T09:59:03.119Z' + metadata: null + response: + eventId: 86c2ad43-e2a4-4952-bafc-d97ad1e5e453 + eventType: AUTHENTICATION_REQUEST + eventStatus: IN_PROGRESS + individualId: UIN + summary: AUTHENTICATION_REQUEST + timestamp: '2022-07-22T07:05:35.646Z' + info: + purpose: 'demo, otp-email, bio-FACE' + partnerName: partnerName + partnerLogo: partnerLogo + authenticationMode: otp + errors: [] + Manage my VID: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:03:51.903Z' + metadata: null + response: + eventId: 1565214f-c97b-4818-bd48-801e98cce1a2 + eventType: REVOKE_VID + eventStatus: IN_PROGRESS + individualId: UIN + summary: in-progress + timestamp: '2022-09-07T09:48:08.322Z' + info: + vid: vid + purpose: null + authenticationMode: otp + vidType: vidType + errors: [] + Secure my ID: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:05:26.483Z' + metadata: null + response: + eventId: 1b41734e-d888-4bd0-9d72-709c8bd9620c + eventType: AUTH_TYPE_LOCK_UNLOCK + eventStatus: IN_PROGRESS + individualId: UIN + summary: in-progress + timestamp: '2022-08-23T03:42:43.472Z' + info: + purpose: 'demo, otp' + authenticationMode: otp + errors: [] + Update my data: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:13:41.123Z' + metadata: null + response: + eventId: 1a631ecb-e881-46e8-b744-e26f4cea5bd0 + eventType: UPDATE_MY_UIN + eventStatus: FAILED + individualId: UIN + summary: in-progress + timestamp: '2022-09-06T06:03:22.373Z' + info: + downloadCardLink: downloadCardLink + purpose: null + attributeList: attributeList + authenticationMode: otp + errors: [] + Download a personalized card: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:15:23.304Z' + metadata: null + response: + eventId: 4383a19e-83f9-44d0-8d7f-3ed37b4882d4 + eventType: DOWNLOAD_PERSONALIZED_CARD + eventStatus: IN_PROGRESS + individualId: UIN + summary: in-progress + timestamp: '2022-09-01T06:06:39.822Z' + info: + downloadCardLink: downloadCardLink + purpose: 'demo, otp, otp, bio, bio, bio' + attributeList: attributeList + authenticationMode: otp + errors: [] + Order my physical card: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:16:26.360Z' + metadata: null + response: + eventId: 0b0b6809-caae-445c-833c-b13eb6c0f795 + eventType: ORDER_PHYSICAL_CARD + eventStatus: FAILED + individualId: UIN + summary: Ordering a physical card is in progress + timestamp: '2022-08-07T08:31:49.743Z' + info: + purpose: 'demo, otp-email, bio-FACE' + partnerName: partnerName + partnerLogo: partnerLogo + attributeList: attributeList + downloadCardLink: downloadCardLink + orderTrackingLink: orderTrackingLink + authenticationMode: otp + paymentStatus: paymentStatus + trackingId: trackingId + errors: [] + 'Share my credential with a partner ': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:17:20.769Z' + metadata: null + response: + eventId: d9ecb820-130a-4a67-9f30-fce5bbb536c7 + eventType: SHARE_CRED_WITH_PARTNER + eventStatus: IN_PROGRESS + individualId: UIN + summary: in-progress + timestamp: '2022-09-07T14:14:55.809Z' + info: + purpose: null + partnerName: partnerName + partnerLogo: partnerLogo + attributeList: attributeList + orderTrackingLink: orderTrackingLink + authenticationMode: otp + trackingId: trackingId + errors: [] + Get my UIN: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:18:54.966Z' + metadata: null + response: + eventId: 79c5270d-0596-4e5a-8f96-ca627c8f70dd + eventType: GET_MY_ID + eventStatus: IN_PROGRESS + individualId: UIN + summary: OTP Generated + timestamp: '2022-09-07T05:47:43.352Z' + info: + purpose: null + errors: [] + Verify email ID/phone number: + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T10:19:40.014Z' + metadata: null + response: + eventId: c04c473e-c1cf-4a21-bdfd-2f7e4ad53e05 + eventType: VERIFY_PHONE_EMAIL + eventStatus: FAILED + individualId: UIN + summary: in-progress + timestamp: '2022-09-07T06:08:14.154Z' + info: + purpose: null + errors: [] + 'Error: EID not available in database': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-459 + message: EID not available in database + 'Error: Invalid Input Parameter- languageCode': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- languageCode + application/xml: + schema: + type: object + properties: + id: + type: string + version: + type: string + response: + type: object + properties: + eventId: + type: string + eventType: + type: string + eventStatus: + type: string + individualId: + type: string + summary: + type: string + timestamp: + type: string + info: + type: object + properties: + purpose: + type: string + applicantName: + type: string + partnerId: + type: string + partnerLogo: + type: string + partnerName: + type: string + paymentStatus: + type: string + partnerTransactionId: + type: string + deliveryAddress: + type: string + authenticationMode: + type: string + vidType: + type: string + vid: + type: string + attributeList: + type: string + downloadCardLink: + type: string + orderTrackingLink: + type: string + trackingId: + type: string + requestTime: + type: string + x-examples: + example-1: + id: mosip.resident.event.status + version: '1.0' + response: + eventId: the event ID + eventType: SHARE_CRED_WITH_PARTNER + eventStatus: failed/success/in-progress + individualId: + summary: string + timestamp: '2022-06-03T06:13:29.330Z' + info: + purpose: string + applicantName: string + partnerId: string + partnerLogo: Base64encoded + partnerName: string + paymentStatus: string + partnerTransactionId: string + deliveryAddress: string + authenticationMode: string + vidType: string + vid: string + attributeList: array + downloadCardLink: string + orderTrackingLink: string + trackingId: string + requestTime: '2022-06-03T06:14:29.330Z' + examples: + example-1: + value: "{\n\t\"id\": \"mosip.resident.event.status\",\n\t\"version\": \"1.0\",\n\t\"response\": {\n\t\t\"eventId\": \"the event ID\",\n\t\t\"eventType\": \"SHARE_CRED_WITH_PARTNER\",\n\t\t\"eventStatus\": \"failed/success/in-progress\",\n\t\t\"individualId\": \"\",\n\t\t\"summary\": \"string\",\n\t\t\"timestamp\": \"2022-06-03T06:13:29.330Z\",\n\t\t\"info\": {\n\t\t\t\"purpose\": \"string\",\n\t\t\t\"applicantName\": \"string\",\n\t\t\t\"partnerId\": \"string\",\n\t\t\t\"partnerLogo\": \"Base64encoded\",\n\t\t\t\"partnerName\": \"string\",\n\t\t\t\"paymentStatus\": \"string\",\n\t\t\t\"partnerTransactionId\": \"string\",\n\t\t\t\"deliveryAddress\": \"string\",\n\t\t\t\"authenticationMode\": \"string\",\n\t\t\t\"vidType\": \"string\",\n\t\t\t\"vid\": \"string\",\n\t\t\t\"attributeList\": \"array\",\n\t\t\t\"downloadCardLink\": \"string\",\n\t\t\t\"orderTrackingLink\": \"string\",\n\t\t\t\"trackingId\": \"string\"\n\t\t}\n\t},\n\t\"requestTime\": \"2022-06-03T06:14:29.330Z\"\n\n}" + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-events-event-id-?langCode=-language-code + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: query + name: langCode + required: true + description: Language Code + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: This API is to get the Event Status for the given event-id and language-code. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-get-the-terms-and-conditions.yaml b/api-docs/API-to-get-the-terms-and-conditions.yaml new file mode 100644 index 00000000000..381bf933c97 --- /dev/null +++ b/api-docs/API-to-get-the-terms-and-conditions.yaml @@ -0,0 +1,157 @@ +openapi: 3.1.0 +x-stoplight: + id: sroysh0ppi879 +info: + title: API to get the terms and conditions + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/auth-proxy​/masterdata​/templates/{langcode}/{templatetypecode}': + parameters: + - schema: + type: string + name: langcode + in: path + required: true + - schema: + type: string + name: templatetypecode + in: path + required: true + get: + summary: '/auth-proxy​/masterdata​/templates/{langcode}/{templatetypecode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + fileText: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-07-25T12:04:40.669Z' + metadata: null + response: + fileText: |- + 1. Your data will be shared with the chosen third party (credential partner) + 2. You are responsible for any and all costs and fees associated with agreements entered into with the third-party provider. + 3. Under no circumstances will we be liable for loss or misuse of data whatsoever, arising from the usage of data shared with the partner. + 4. If a third-party provider ceases to make its service available or requires MOSIP to suspend or terminate the provision of all or any part of its services to you that part of data or services will be terminated immediately without notice or further obligation to you. + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: '2022-07-25T12:04:40.669Z' + response: + fileText: |- + 1. Your data will be shared with the chosen third party (credential partner) + 2. You are responsible for any and all costs and fees associated with agreements entered into with the third-party provider. + 3. Under no circumstances will we be liable for loss or misuse of data whatsoever, arising from the usage of data shared with the partner. + 4. If a third-party provider ceases to make its service available or requires MOSIP to suspend or terminate the provision of all or any part of its services to you that part of data or services will be terminated immediately without notice or further obligation to you. + errors: null + 'Error: Template exception': + value: + id: null + version: null + responsetime: '2022-07-25T12:04:40.669Z' + response: null + errors: + - errorCode: RES-SER-415 + message: Template exception + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-proxy-masterdata-templates-langcode-templatetypecode + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + description: Id token is used to verify which user has logged in. + name: id_token + required: true + description: 'This API is to return terms and conditions for different use cases for different languages such as eng, fra, and ara. This will be invoked by UI for the specific language. This is a Proxy API of master data service for getting templates for template type code and language code . This should be an authenticated proxy API. ' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-handle-websub-event-for-auth-type-lockunlock-to-store-the-status.yaml b/api-docs/API-to-handle-websub-event-for-auth-type-lockunlock-to-store-the-status.yaml new file mode 100644 index 00000000000..5a81d1b6add --- /dev/null +++ b/api-docs/API-to-handle-websub-event-for-auth-type-lockunlock-to-store-the-status.yaml @@ -0,0 +1,195 @@ +openapi: 3.1.0 +x-stoplight: + id: gt1319oycmfd7 +info: + title: unlock to store the status + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /callback​/authTypeCallback: + post: + summary: Websub callback for Auth Type Lock/Unlock acknowledgement + operationId: post-callback-authTypeCallback + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + requestBody: + content: + application/json: + schema: + type: object + properties: + publisher: + type: string + topic: + type: string + publishedOn: + type: string + event: + type: object + properties: + id: + type: string + transactionId: + type: 'null' + type: + type: object + properties: + namespace: + type: string + name: + type: string + timestamp: + type: string + dataShareUri: + type: 'null' + data: + type: object + properties: + saltedIdHash: + type: 'null' + authTypes: + type: array + items: + type: object + properties: + authType: + type: string + authSubType: + type: + - 'null' + - string + locked: + type: boolean + unlockForSeconds: + type: 'null' + requestId: + type: string + metadata: + type: 'null' + expiryTimestamp: + type: 'null' + tokenId: + type: string + eventType: + type: 'null' + transactionLimit: + type: 'null' + id_hash: + type: 'null' + x-examples: + Example 1: + publisher: ID_REPO + topic: mpartner-default-auth/AUTH_TYPE_STATUS_UPDATE + publishedOn: '2022-10-31T02:08:25.635Z' + event: + id: 10f5a3c4-4f03-43be-af42-0361de59d918 + transactionId: null + type: + namespace: mosip + name: ida + timestamp: '2022-10-31T02:08:25.635Z' + dataShareUri: null + data: + saltedIdHash: null + authTypes: + - authType: bio + authSubType: FACE + locked: true + unlockForSeconds: null + requestId: fc8b0a83-ff80-4f00-aef6-40047a2b1fcc + metadata: null + - authType: demo + authSubType: null + locked: true + unlockForSeconds: null + requestId: 6fefd830-7ba3-493a-bb73-f0ed13b3f346 + metadata: null + expiryTimestamp: null + tokenId: '351975261705119268247340356533475289' + eventType: null + transactionLimit: null + id_hash: null + examples: + Example 1: + value: + publisher: ID_REPO + topic: mpartner-default-auth/AUTH_TYPE_STATUS_UPDATE + publishedOn: '2022-10-31T02:08:25.635Z' + event: + id: 10f5a3c4-4f03-43be-af42-0361de59d918 + transactionId: null + type: + namespace: mosip + name: ida + timestamp: '2022-10-31T02:08:25.635Z' + dataShareUri: null + data: + saltedIdHash: null + authTypes: + - authType: bio + authSubType: FACE + locked: true + unlockForSeconds: null + requestId: fc8b0a83-ff80-4f00-aef6-40047a2b1fcc + metadata: null + - authType: demo + authSubType: null + locked: true + unlockForSeconds: null + requestId: 6fefd830-7ba3-493a-bb73-f0ed13b3f346 + metadata: null + expiryTimestamp: null + tokenId: '351975261705119268247340356533475289' + eventType: null + transactionLimit: null + id_hash: null + description: This is a Websub callback for Auth Type Lock/Unlock acknowledgement from IDA. This is for Resident Service to subscribe to the websub topic and update the Auth type lock/unlock status into resident_transaction Table for the request ID (AID) as COMPLETED/FAILED. The table will have multiple entries in for each online verification Partners with different status based on the websub notification. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-invoke-credential-request-for-the-customized-format-and-masking-for-id-attributes.yaml b/api-docs/API-to-invoke-credential-request-for-the-customized-format-and-masking-for-id-attributes.yaml new file mode 100644 index 00000000000..749cd75150f --- /dev/null +++ b/api-docs/API-to-invoke-credential-request-for-the-customized-format-and-masking-for-id-attributes.yaml @@ -0,0 +1,189 @@ +openapi: 3.1.0 +x-stoplight: + id: lmohj2mxxvd0m +info: + title: API to invoke credential request for the customized format and masking for id attributes + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/credential-generator: + get: + summary: Your GET endpoint + tags: [] + responses: {} + operationId: get-req-credential-generator + post: + summary: /req/credential-generator + operationId: post-req-credential-generator + responses: + '200': + description: OK + '201': + description: Created + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + id: + type: string + requestId: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: string + version: v1 + responsetime: '2022-06-23T12:00:40.326Z' + metadata: null + response: + id: '8251649601' + requestId: 9002d4fe-5580-463c-8507-ad2fa07d19f9 + errors: null + examples: + Success: + value: + id: string + version: string + responsetime: string + metadata: null + response: + id: string + requestId: string + errors: null + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + request: + type: object + properties: + additionalData: + type: object + properties: {} + credentialType: + type: string + encrypt: + type: boolean + encryptionKey: + type: string + individualId: + type: string + issuer: + type: string + recepiant: + type: string + sharableAttributes: + type: array + items: + type: object + properties: + attributeName: + type: string + format: + type: string + isMasked: + type: boolean + user: + type: string + requesttime: + type: string + version: + type: string + x-examples: + example-1: + id: string + request: + additionalData: {} + credentialType: euin + encrypt: true + encryptionKey: abc123 + individualId: '8251649601' + issuer: mpartner-default-print + recepiant: '' + sharableAttributes: + - attributeName: dateOfBirth + format: YYYY + isMasked: false + user: string + requesttime: '2021-10-19T17:01:59.538Z' + version: v1 + examples: + example-1: + value: + id: string + request: + additionalData: {} + credentialType: string + encrypt: true + encryptionKey: string + individualId: string + issuer: string + recepiant: string + sharableAttributes: + - attributeName: string + format: string + isMasked: true + user: string + requesttime: string + version: string + description: This is an authenticated API to request for credentials with the additional input of attribute formats and masking information. This is used in requesting credentials to a selected partner. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-lockunlock-authentication-types.yaml b/api-docs/API-to-lockunlock-authentication-types.yaml new file mode 100644 index 00000000000..5fcaff924f7 --- /dev/null +++ b/api-docs/API-to-lockunlock-authentication-types.yaml @@ -0,0 +1,234 @@ +openapi: 3.1.0 +x-stoplight: + id: u9z0b2ns5qr6h +info: + title: unlock authentication types + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /​auth-lock-unlock: + post: + summary: ​/auth-lock-unlock + operationId: post-auth-lock-unlock + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.auth.lock.unlock + version: v1 + responsetime: '2022-09-23T13:55:57.655Z' + metadata: null + response: + message: Notification has been sent to the provided contact detail(s) + errors: [] + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: + - object + - 'null' + properties: + message: + type: string + status: + type: string + x-stoplight: + id: k6ocq10ieyk1p + errors: + type: + - array + - 'null' + items: {} + examples: + Success: + value: + id: mosip.resident.auth.lock.unlock + version: '1.0' + responsetime: '2022-09-23T13:55:57.655Z' + metadata: null + response: + message: Notification has been sent to the provided contact detail(s) + status: Success + errors: [] + 'Error: Unable to access the dependent APIs': + value: + id: mosip.resident.auth.lock.unlock + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: Invalid input attributes': + value: + id: mosip.resident.auth.lock.unlock + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter - authTypes + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + 'Error: HTTP Status code: 401': + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + description: This API is to lock or unlock various authentication types. + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + authTypes: + type: array + items: + type: object + properties: + authType: + type: string + authSubType: + type: + - 'null' + - string + locked: + type: boolean + unlockForSeconds: + type: + - integer + - 'null' + x-examples: + Example 1: + id: mosip.resident.auth.lock.unlock + version: '1.0' + requesttime: '2022-05-07T08:26:17.944Z' + request: + authTypes: + - authType: demo + authSubType: null + locked: false + unlockForSeconds: 120 + - authType: bio + authSubType: FACE + locked: true + unlockForSeconds: null + - authType: otp + authSubType: email + locked: false + unlockForSeconds: null + examples: + example-1: + value: + id: mosip.resident.auth.lock.unlock + version: '1.0' + requesttime: '2022-05-07T08:26:17.944Z' + request: + authTypes: + - authType: demo + authSubType: null + locked: false + unlockForSeconds: 120 + - authType: bio + authSubType: FACE + locked: true + unlockForSeconds: null + - authType: otp + authSubType: email + locked: false + unlockForSeconds: null + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-order-a-physical-card.yaml b/api-docs/API-to-order-a-physical-card.yaml new file mode 100644 index 00000000000..dd80527d9e7 --- /dev/null +++ b/api-docs/API-to-order-a-physical-card.yaml @@ -0,0 +1,142 @@ +openapi: 3.1.0 +x-stoplight: + id: xq13gtyrp0o9h +info: + title: API to order a physical card + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /resident/v1/sendCard: + post: + summary: /resident/v1/sendCard + operationId: post-resident-v1-sendCard + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + id: + type: string + requestId: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: string + version: v1 + responsetime: '2022-06-23T11:48:10.359Z' + metadata: null + response: + id: '8251649601' + requestId: 7256e703-3e76-4ed3-9d4d-076708605423 + errors: null + examples: + Success: + value: + id: string + version: string + responsetime: string + metadata: null + response: + id: string + requestId: string + errors: null + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + request: + type: object + properties: + individualId: + type: string + transactionID: + type: string + issuer: + type: string + requesttime: + type: string + version: + type: string + x-examples: + example-1: + id: string + request: + individualId: '8251649601' + transactionID: '1234327890' + issuer: mpartner-default-print + requesttime: '2021-10-19T17:01:59.538Z' + version: v1 + examples: + example-1: + value: + id: string + request: + individualId: string + transactionID: string + issuer: string + requesttime: string + version: string + description: 'This API is an authenticated API to send a card to print partner for the individual ID present in logged in session, and the transaction ID.' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-raise-grievance-ticket.yaml b/api-docs/API-to-raise-grievance-ticket.yaml new file mode 100644 index 00000000000..75874762696 --- /dev/null +++ b/api-docs/API-to-raise-grievance-ticket.yaml @@ -0,0 +1,226 @@ +openapi: 3.1.0 +x-stoplight: + id: h9v0vrf6wtv8c +info: + title: API-to-raise-grievance-ticket + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /grievance/ticket: + post: + summary: API to raise grievance ticket + operationId: post-grievance-ticket + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.grievance.ticket.request + version: '1.0' + responseTime: '2022-05-07T08:26:17.944Z' + request: + ticketId: ticket ID + errors: [] + properties: + id: + type: string + version: + type: string + responseTime: + type: string + request: + type: + - object + - 'null' + properties: + ticketId: + type: string + errors: + type: array + items: + type: object + examples: + Success: + value: + id: mosip.resident.grievance.ticket.request + version: '1.0' + responseTime: '2022-05-07T08:26:17.944Z' + request: + ticketId: ticket ID + errors: [] + 'Error: Missing input parameter - eventId': + value: + id: string + version: string + responseTime: string + request: null + errors: + - errorCode: RES-SER-414 + message: Missing input parameter - eventId + 'Error: Missing input parameter - message': + value: + id: string + version: string + responseTime: string + request: null + errors: + - errorCode: RES-SER-414 + message: Missing input parameter - message + 'Error: Invalid input parameter - eventId': + value: + id: string + version: string + responseTime: string + request: null + errors: + - errorCode: RES-SER-410 + message: Invalid input parameter - eventId + 'Error: EID is not associated with the UIN/VID used to log in': + value: + id: string + version: string + responseTime: string + request: null + errors: + - errorCode: RES-SER-511 + message: The entered EID is not associated with the UIN/VID used to log in + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + description: 'API to create a ticket for grievance on any eventId. There could be multiple grievances raised for an event-id, but this API will raise only one ticket at a time. This information passed on this ticket will be stored in the resident_grievance_ticket table.' + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + requestBody: + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.grievance.ticket.request + version: '1.0' + requesttime: '2022-05-07T08:26:17.944Z' + request: + eventId: + name: Full name of the resident + emailId: string + alternateEmailId: string + phoneNo: string + alternatePhoneNo: string + message: string + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: + - object + - 'null' + properties: + eventId: + type: string + name: + type: string + emailId: + type: string + alternateEmailId: + type: string + phoneNo: + type: string + alternatePhoneNo: + type: string + message: + type: string + required: + - eventId + - message + examples: + example: + value: + id: string + version: string + requesttime: string + request: + eventId: string + name: string + emailId: string + alternateEmailId: string + phoneNo: string + alternatePhoneNo: string + message: string +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-re-direct-from-print-partners-order-page-to-resident-portal.yaml b/api-docs/API-to-re-direct-from-print-partners-order-page-to-resident-portal.yaml new file mode 100644 index 00000000000..4f7dcd4dcd8 --- /dev/null +++ b/api-docs/API-to-re-direct-from-print-partners-order-page-to-resident-portal.yaml @@ -0,0 +1,158 @@ +openapi: 3.1.0 +x-stoplight: + id: vdlpmqvv75327 +info: + title: API to re-direct from print partner's order page to resident portal + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /resident/v1/physical-card/order-redirect/: + get: + summary: resident/v1/physical-card/order-redirect/ + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + eventId: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: string + version: v1 + responsetime: '2022-06-23T11:48:10.359Z' + metadata: null + response: + eventId: string + errors: null + examples: + example-1: + value: + id: string + version: string + responsetime: string + metadata: null + response: + eventId: string + errors: null + Success: + value: + id: string + version: v1 + responsetime: '2022-06-23T11:48:10.359Z' + metadata: null + response: + eventId: string + errors: null + '302': + description: Found + content: + application/json: + schema: + type: object + properties: {} + examples: + example-1: + value: redirection to acknowledgement page of Order Physical Card action in Resident-UI + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: {} + examples: + example-1: + value: Redirect to Resident’s Acknowledgement Page with below query params + operationId: get-resident-v1-physical-card-order-redirect + parameters: + - schema: + type: string + in: query + name: redirectUrl + required: true + description: The base64 encoded URL for Resident-UI Acknowledgement page for ordering a physical card. + - schema: + type: string + in: query + name: eventId + required: true + description: the event ID to be used to track the status of whole process of order untill the card delivery. + - schema: + type: string + in: query + name: residentName + required: true + description: for display purpose in acknowledgement Page in Resident UI + - schema: + type: string + in: query + name: residentDefaultFullAddress + required: true + description: base64-url encoded full address string - for display purpose in acknowledgement Page in Resident UI + - schema: + type: string + in: cookie + name: Authorization token + required: true + description: 'This API is a re-direct API from print partner''s order page, that will get response parameters of the payment made back to the resident portal.' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-register-print-partner.yaml b/api-docs/API-to-register-print-partner.yaml new file mode 100644 index 00000000000..21bb744cdca --- /dev/null +++ b/api-docs/API-to-register-print-partner.yaml @@ -0,0 +1,214 @@ +openapi: 3.1.0 +x-stoplight: + id: em6a3xfxmjcm5 +info: + title: API to register print partner + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /v1/partnermanager/partners/new: + post: + summary: /v1/partnermanager/partners/new + operationId: post-v1-partnermanager-partners-new + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + partnerId: + type: string + status: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: string + version: LTS + responsetime: '2022-08-23T04:47:32.851Z' + metadata: null + response: + partnerId: '392' + status: InProgress + errors: [] + examples: + example-1: + value: + id: string + version: string + responsetime: string + metadata: null + response: + partnerId: string + status: string + errors: + - {} + Success: + value: + id: string + version: LTS + responsetime: '2022-08-23T04:47:32.851Z' + metadata: null + response: + partnerId: '392' + status: InProgress + errors: [] + '201': + description: Created + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + metadata: + type: object + properties: {} + request: + type: object + properties: + address: + type: string + contactNumber: + type: string + emailId: + type: string + organizationName: + type: string + partnerId: + type: string + partnerType: + type: string + policyGroup: + type: string + logoUrl: + type: string + additionalInfo: + type: object + properties: + test: + type: string + test1: + type: string + requesttime: + type: string + version: + type: string + x-examples: + example-1: + id: string + metadata: {} + request: + address: mobile + contactNumber: 438-795-7832 + emailId: Luna.Grant51@example.org + organizationName: '392' + partnerId: '392' + partnerType: Print_Partner + policyGroup: '807' + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + requesttime: '2022-08-23T04:47:32.640Z' + version: LTS + examples: + example-1: + value: + id: string + metadata: {} + request: + address: string + contactNumber: string + emailId: string + organizationName: string + partnerId: string + partnerType: string + policyGroup: string + logoUrl: string + additionalInfo: + test: string + test1: string + requesttime: string + version: string + example-2: + value: + id: string + metadata: {} + request: + address: mobile + contactNumber: 438-795-7832 + emailId: Luna.Grant51@example.org + organizationName: '392' + partnerId: '392' + partnerType: Print_Partner + policyGroup: '807' + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + requesttime: '2022-08-23T04:47:32.640Z' + version: LTS + description: This API is to register a print partner. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-retrieve-remaining-update-counts-for-each-id-attribute-for-a-UINVID.yaml b/api-docs/API-to-retrieve-remaining-update-counts-for-each-id-attribute-for-a-UINVID.yaml new file mode 100644 index 00000000000..4a46e0b8e40 --- /dev/null +++ b/api-docs/API-to-retrieve-remaining-update-counts-for-each-id-attribute-for-a-UINVID.yaml @@ -0,0 +1,70 @@ +openapi: 3.0.1 +info: + title: Proxy Masterdata API + description: API for getting document types by document category and language code + version: 1.0.0 +paths: + '/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode}': + get: + summary: getDocumentTypesByDocumentCategoryLangCode + description: getDocumentTypesByDocumentCategoryLangCode + tags: + - proxy-masterdata-controller + parameters: + - name: documentcategorycode + in: path + required: true + schema: + type: string + - name: langcode + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + type: object + additionalProperties: true + message: + type: string + status: + type: string diff --git a/api-docs/API-to-revoke-a-VID.yaml b/api-docs/API-to-revoke-a-VID.yaml new file mode 100644 index 00000000000..e8dc00ed108 --- /dev/null +++ b/api-docs/API-to-revoke-a-VID.yaml @@ -0,0 +1,256 @@ +openapi: 3.1.0 +x-stoplight: + id: 7tdk8zdk8nf78 +info: + title: API to revoke a VID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/revoke-vid​/{vid}': + parameters: + - schema: + type: string + name: vid + in: path + required: true + patch: + summary: '/revoke-vid​/{vid}' + operationId: patch-revoke-vid-vid + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.vid.revoke + version: v1 + responsetime: '2022-06-14T14:15:08.919Z' + response: + message: Notification has been sent to the provided contact detail(s) + errors: [] + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: + - object + - 'null' + properties: + message: + type: string + status: + type: string + x-stoplight: + id: ec0egquigsvjl + errors: + type: + - array + - 'null' + items: {} + examples: + Success: + value: + id: mosip.resident.vid.revoke + version: '1.0' + responsetime: '2022-06-14T14:15:08.919Z' + response: + message: Notification has been sent to the provided contact detail(s) + status: Success + errors: [] + 'Error: Unable to access the dependent APIs': + value: + id: mosip.resident.vid.revoke + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: Revoke a VID that is used to login': + value: + id: mosip.resident.vid.revoke + version: '1.0' + responsetime: '2022-10-10T09:14:33.752Z' + response: null + errors: + - errorCode: RES-SER-471 + message: This VID cannot be revoked since you have logged in using same VID + Invalid VID: + value: + id: mosip.resident.vid.revoke + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-010 + message: Invalid VID + VID revocation failed: + value: + id: mosip.resident.vid.revoke + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-407 + message: VID revocation request failed. Please visit the nearest registration center for assistance + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.vidstatus + version: v1 + requesttime: '2021-09-27T07:44:06.802Z' + request: + transactionID: '1234327890' + vidStatus: REVOKED + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionID: + type: string + description: 'Deprecated: non-empty string. This will be removed in future release.' + vidStatus: + type: string + examples: + Success: + value: + id: mosip.resident.vid.revoke + version: '1.0' + requesttime: '2021-09-27T07:44:06.802Z' + request: + transactionID: '1234567890' + vidStatus: REVOKED + application/xml: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + vidStatus: + type: string + x-examples: + Example 1: + id: mosip.resident.vid.revoke + version: v1 + requesttime: '2021-09-27T07:44:06.802Z' + request: + vidStatus: REVOKED + examples: + example-1: + value: + id: string + version: string + requesttime: string + request: + vidStatus: string + example-2: + value: + id: mosip.resident.vid.revoke + version: v1 + requesttime: '2021-09-27T07:44:06.802Z' + request: + vidStatus: REVOKED + description: This API is to revoke VID. It is an authenticated API with the token of UIN/VID based login. It also needs to verify the individual ID in the request belongs to the same user who has logged in. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-send-OTP-for verifying email Id or phone number.yaml b/api-docs/API-to-send-OTP-for verifying email Id or phone number.yaml new file mode 100644 index 00000000000..f000497e50f --- /dev/null +++ b/api-docs/API-to-send-OTP-for verifying email Id or phone number.yaml @@ -0,0 +1,275 @@ +openapi: 3.1.0 +x-stoplight: + id: ye9p7hp529uxo +info: + title: phone number) + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /contact-details/send-otp: + post: + summary: contact-details/send-otp + operationId: post-contact-details-send-otp + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: object + properties: + status: + type: string + message: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.contact.details.send.otp.id + version: v1 + responsetime: '2022-09-23T08:05:34.374379Z' + response: + status: Email Request submitted + message: success + errors: null + examples: + Success: + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: + status: Email Request submitted + message: success + errors: null + Error Unable to access API resource: + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: Invalid Input Parameter- userid': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- userid + 'Error: Send OTP failed': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-463 + message: Send OTP failed. + 'Error: Innumerous OTP requests received': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES_SER_510 + message: Innumerous OTP requests received + 'Error: Unable to process': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-466 + message: Unable to process + 'Error: OTP is blocked': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-465 + message: OTP is blocked + 'Error: Invalid Input Parameter- id': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- id + 'Error: Invalid Input Parameter- requesttime': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- requesttime + 'Error: Invalid Input Parameter- transactionId': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- transactionId + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + userId: + type: string + transactionId: + type: string + x-examples: + Example 1: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + requesttime: '2022-09-20T13:13:04.159Z' + request: + userId: kameshsr1338@gmail.com + transactionId: '1234567890' + examples: + example-1: + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + requesttime: '2022-09-20T13:13:04.159Z' + request: + userId: kameshsr1338@gmail.com + transactionId: '1234567890' + description: This API is to send OTP to new email Id/phone number. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-send-OTP-for-any-IndividualID.yaml b/api-docs/API-to-send-OTP-for-any-IndividualID.yaml new file mode 100644 index 00000000000..f397dd081b6 --- /dev/null +++ b/api-docs/API-to-send-OTP-for-any-IndividualID.yaml @@ -0,0 +1,164 @@ +openapi: 3.1.0 +x-stoplight: + id: 61qevgt4xvbhy +info: + title: API to send OTP for any IndividualID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /individualId/otp: + post: + summary: Send OTP for an indivdiual-id + operationId: send-otp-individual-id + responses: + '200': + description: OTP Sent to user + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.identity.otp.internal + version: '1.0' + transactionID: '1234567890' + responseTime: '2022-06-14T08:34:29.896Z' + errors: null + response: + maskedMobile: null + maskedEmail: XXnXXvXX1X@gmail.com + metadata: null + properties: + id: + type: string + version: + type: string + transactionID: + type: string + responseTime: + type: string + errors: + type: 'null' + response: + type: + - object + - 'null' + properties: + maskedMobile: + type: 'null' + maskedEmail: + type: string + metadata: + type: 'null' + examples: + Success: + value: + id: mosip.identity.otp.internal + version: '1.0' + transactionID: '1234567890' + responseTime: '2022-06-14T08:34:29.896Z' + errors: null + response: + maskedMobile: null + maskedEmail: XXnXXvXX1X@gmail.com + metadata: null + 'Error: AID is not ready': + value: + id: null + version: '1.0' + responsetime: '2022-06-14T08:33:35.263Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-449 + message: AID is not ready + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + individualId: + type: string + metadata: + type: object + properties: {} + otpChannel: + type: array + items: + type: string + requestTime: + type: string + transactionID: + type: string + version: + type: string + x-examples: + Example 1: + id: mosip.identity.otp.internal + individualId: '10001101230005020220125061502' + metadata: {} + otpChannel: + - EMAIL + requestTime: '2022-05-30T15:18:11.592Z' + transactionID: '1234567890' + version: '1.0' + examples: + Example: + value: + id: mosip.identity.otp.internal + individualId: '10001101230005020220125061502' + metadata: {} + otpChannel: + - EMAIL + requestTime: '2022-05-30T15:18:11.592Z' + transactionID: '1234567890' + version: '1.0' + description: '' + description: Sends OTP to an UIN/VID/AID. For validation of OTP the same transaction ID and Individual ID needs to be used. + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-store-the-authentication-status-as-NEW-when-performing-lockunlock-request.yaml b/api-docs/API-to-store-the-authentication-status-as-NEW-when-performing-lockunlock-request.yaml new file mode 100644 index 00000000000..463fcb975ef --- /dev/null +++ b/api-docs/API-to-store-the-authentication-status-as-NEW-when-performing-lockunlock-request.yaml @@ -0,0 +1,188 @@ +openapi: 3.1.0 +x-stoplight: + id: l42qp4trtkscz +info: + title: unlock request + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req​/auth-type-status: + post: + summary: /req​/auth-type-status + operationId: post-req-auth-type-status + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + status: + type: 'null' + message: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T06:10:11.213Z' + metadata: null + response: + status: null + message: Notification has been sent to the provided contact detail(s) + errors: null + examples: + success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + status: null + message: string + errors: null + Lock authentication types: + value: + id: mosip.resident.authlock + version: v1 + requesttime: '2022-05-07T08:26:17.944Z' + request: + individualId: '8251649601' + authType: + - authType: demo + locked: true + unlockForSeconds: null + Unlock authentication types: + value: + id: mosip.resident.authlock + version: v1 + requesttime: '2022-05-07T08:26:17.944Z' + request: + individualId: '8251649601' + authType: + - authType: otp-email + locked: false + unlockForSeconds: null + Unlock for authentication types (seconds): + value: + id: mosip.resident.authlock + version: v1 + requesttime: '2022-05-07T08:26:17.944Z' + request: + individualId: '8251649601' + authType: + - authType: otp-email + locked: false + unlockForSeconds: 600 + Lock/Unlock for authentication types with or without unlockForSeconds in same request: + value: + id: mosip.resident.authlock + version: v1 + requesttime: '2022-05-07T08:26:17.944Z' + request: + individualId: '8251649601' + authType: + - authType: demo + locked: true + unlockForSeconds: null + - authType: otp-email + locked: false + unlockForSeconds: 600 + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + individualId: + type: string + authType: + type: array + items: + type: object + properties: + authType: + type: string + locked: + type: boolean + unlockForSeconds: + type: integer + x-examples: + example-1: + id: mosip.resident.authlock + version: v1 + requesttime: '2022-05-07T08:26:17.944Z' + request: + individualId: '8251649601' + authType: + - authType: demo + locked: false + unlockForSeconds: 1 + description: This API is to store the Auth type lock/unlock status with status_comment containing summary of what is locked /unlocked having one entry for each online verification partners with ID as 'request ID + Online verification partner ID'. Status should be NEW. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-submit-the-card-order-for-a-partner.yaml b/api-docs/API-to-submit-the-card-order-for-a-partner.yaml new file mode 100644 index 00000000000..db2acd52956 --- /dev/null +++ b/api-docs/API-to-submit-the-card-order-for-a-partner.yaml @@ -0,0 +1,150 @@ +openapi: 3.1.0 +x-stoplight: + id: 73jikb8x65agt +info: + title: API to submit the card order for a partner + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /resident/v1/physical-card/order: + get: + summary: resident/v1/physical-card/order + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + id: + type: string + requestId: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: string + version: v1 + responsetime: '2022-06-23T11:48:10.359Z' + metadata: null + response: + id: '8251649601' + requestId: 7256e703-3e76-4ed3-9d4d-076708605423 + errors: null + examples: + example-1: + value: + id: string + version: string + responsetime: string + metadata: null + response: + id: string + requestId: string + errors: null + Success: + value: + id: string + version: v1 + responsetime: '2022-06-23T11:48:10.359Z' + metadata: null + response: + id: '8251649601' + requestId: 7256e703-3e76-4ed3-9d4d-076708605423 + errors: null + '302': + description: Found + content: + text/plain: + schema: + type: object + properties: {} + examples: + Request valid: + value: redirection to Print Partner’s Order a physical card Page + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: {} + examples: + Bad request: + value: {} + operationId: get-resident-v1-physical-card-order + parameters: + - schema: + type: string + in: header + name: partnerId + required: true + - schema: + type: string + in: query + name: redirectUri + required: true + description: The base64 encoded URL for Resident-UI Acknowledgement page for ordering a physical card. + - schema: + type: string + in: cookie + name: Authorization token + required: true + description: This API is to submit the physical card order to a partner +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-track-my-status.yaml b/api-docs/API-to-track-my-status.yaml new file mode 100644 index 00000000000..e879cb31762 --- /dev/null +++ b/api-docs/API-to-track-my-status.yaml @@ -0,0 +1,255 @@ +openapi: 3.1.0 +x-stoplight: + id: rfxafsd9blcw2 +info: + title: 'API to track-my-status ' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/events/{event-id}/language/{languageCode}': + parameters: + - schema: + type: string + name: event-id + in: path + required: true + - schema: + type: string + name: languageCode + in: path + required: true + get: + summary: '/events/{event-id}/language/{languageCode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T09:59:03.119Z' + metadata: null + response: + eventId: 86c2ad43-e2a4-4952-bafc-d97ad1e5e453 + eventType: AUTHENTICATION_REQUEST + eventStatus: IN_PROGRESS + individualId: '8736474831' + summary: AUTHENTICATION_REQUEST + timestamp: '2022-07-22T07:05:35.646Z' + info: + description: 'demo, otp-email, bio-FACE' + partnerName: partnerName + partnerId: string + partnerLogo: Base64encoded image that can be rendered in html + authenticationMode: otp + vid: vid + vidType: vidType + downloadCardLink: downloadCardLink + orderTrackingLink: orderTrackingLink + paymentStatus: failed / success / in-progress + partnerTransactionId: string + deliveryAddress: string + trackingId: trackingId + errors: [] + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: + - object + - 'null' + properties: + eventId: + type: string + eventType: + type: string + eventStatus: + type: string + individualId: + type: string + summary: + type: string + timestamp: + type: string + info: + type: object + properties: + description: + type: string + partnerName: + type: string + partnerId: + type: string + partnerLogo: + type: string + authenticationMode: + type: string + vid: + type: string + vidType: + type: string + downloadCardLink: + type: string + orderTrackingLink: + type: string + paymentStatus: + type: string + partnerTransactionId: + type: string + deliveryAddress: + type: string + trackingId: + type: string + errors: + type: + - array + - 'null' + items: + type: + - array + - object + examples: + 'Success: Response body structure with All attributes': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-09-08T09:59:03.119Z' + response: + eventId: 86c2ad43-e2a4-4952-bafc-d97ad1e5e453 + eventType: AUTHENTICATION_REQUEST/GENERATE_VID/REVOKE_VID/AUTH_TYPE_LOCK_UNLOCK/UPDATE_MY_UIN/DOWNLOAD_PERSONALIZED_CARD/ORDER_PHYSICAL_CARD/SHARE_CRED_WITH_PARTNER/GET_MY_ID/VERIFY_PHONE_EMAIL + eventStatus: IN_PROGRESS + individualId: '8736474831' + summary: 'Authentication request using demograpihcs, E-Mail OTP, bio-Face Succeeded' + timestamp: '2022-07-22T07:05:35.646Z' + info: + description: 'demo, otp-email, bio-FACE' + partnerName: partnerName + partnerId: string + partnerLogo: Base64encoded image that can be rendered in html + authenticationMode: otp + vid: vid + vidType: vidType + downloadCardLink: downloadCardLink + orderTrackingLink: orderTrackingLink + paymentStatus: failed / success / in-progress + partnerTransactionId: string + deliveryAddress: string + trackingId: trackingId + errors: [] + 'Error: Invalid Event ID': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-459 + message: EID not available in database + 'Error: Invalid language code': + value: + id: mosip.resident.event.status + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- languageCode + application/xml: + schema: + type: object + properties: {} + multipart/form-data: + schema: + type: object + properties: {} + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-events-event-id-language-languageCode + requestBody: + content: + application/json: + schema: + type: object + properties: {} + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: This API is to get the Event Status for the given event-id and language-code. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-update-a-print-partner.yaml b/api-docs/API-to-update-a-print-partner.yaml new file mode 100644 index 00000000000..6368b2fd28f --- /dev/null +++ b/api-docs/API-to-update-a-print-partner.yaml @@ -0,0 +1,194 @@ +openapi: 3.1.0 +x-stoplight: + id: uaznm87u46ezo +info: + title: API to update a print partner + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/partnermanager/partners/new/{partnerid}': + put: + summary: '/partnermanager/partners/new/{partnerid}' + operationId: put-partnermanager-partners-new-partnerid + responses: + '200': + description: OK + '': + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + partnerId: + type: string + status: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: string + version: string + responsetime: '2022-09-19T15:07:42.002Z' + metadata: null + response: + partnerId: mosip-3830 + status: approved + errors: [] + examples: + example-1: + value: + id: string + version: string + responsetime: string + metadata: null + response: + partnerId: string + status: string + errors: + - {} + example-2: + value: + id: string + version: string + responsetime: '2022-09-19T15:07:42.002Z' + metadata: null + response: + partnerId: mosip-3830 + status: approved + errors: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + metadata: + type: object + properties: {} + request: + type: object + properties: + address: + type: string + contactNumber: + type: string + logoUrl: + type: string + additionalInfo: + type: object + properties: + test: + type: string + test1: + type: string + x-examples: + example-1: + id: string + version: string + requesttime: '2022-09-19T14:46:19.779Z' + metadata: {} + request: + address: Bangalore + contactNumber: '9907866554' + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + examples: + example-1: + value: + id: string + version: string + requesttime: string + metadata: {} + request: + address: string + contactNumber: string + logoUrl: string + additionalInfo: + test: string + test1: string + example-2: + value: + id: string + version: string + requesttime: '2022-09-19T14:46:19.779Z' + metadata: {} + request: + address: Bangalore + contactNumber: '9907866554' + logoUrl: 'https://logo.com' + additionalInfo: + test: test + test1: test1 + description: This API is in PMS Services to update a print partner with type "Print_Partner". + parameters: + - schema: + type: string + name: partnerid + in: path + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-update-identityinfo-and-return-attributes-in-the-UI-spec-including-photo.yaml b/api-docs/API-to-update-identityinfo-and-return-attributes-in-the-UI-spec-including-photo.yaml new file mode 100644 index 00000000000..d44dd61f8c2 --- /dev/null +++ b/api-docs/API-to-update-identityinfo-and-return-attributes-in-the-UI-spec-including-photo.yaml @@ -0,0 +1,533 @@ +openapi: 3.1.0 +x-stoplight: + id: znpm3vmzy5cqp +info: + title: info and return attributes in the UI spec including photo + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/identity/info/type/{schemaType}': + parameters: + - schema: + type: string + name: schemaType + in: path + required: true + get: + summary: '/identity/info/type/{schemaType}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + fullName: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + dateOfBirth: + type: string + gender: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + region: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + province: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + city: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + zone: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + postalCode: + type: string + residenceStatus: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + addressLine1: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + phone: + type: string + email: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T08:18:16.563Z' + metadata: null + response: + fullName: + - language: ara + value: Manoj_ara + - language: eng + value: Manoj_eng + dateOfBirth: 1972/05/07 + gender: + - language: eng + value: Male + region: + - language: eng + value: RSK + province: + - language: ara + value: KTA + - language: eng + value: KTA + city: + - language: eng + value: KNT + - language: ara + value: KNT + zone: + - language: eng + value: BNMR + postalCode: '14022' + residenceStatus: + - language: ara + value: Foreigner + - language: eng + value: Foreigner + addressLine1: + - language: ara + value: '#991, 47 Street, 6 block' + - language: eng + value: '#٩٩١، ٤٧ سترِِت، ٦ بلُكك' + phone: '9395910872' + email: manojvsp12@gmail.com + errors: null + examples: + Success: + value: + id: mosip.resident.identity.info + version: '1.0' + responsetime: '2022-06-14T08:18:16.563Z' + metadata: null + response: + fullName: + - language: ara + value: Manoj_ara + - language: eng + value: Manoj_eng + dateOfBirth: 1972/05/07 + gender: + - language: eng + value: Male + region: + - language: eng + value: RSK + province: + - language: ara + value: KTA + - language: eng + value: KTA + city: + - language: eng + value: KNT + - language: ara + value: KNT + zone: + - language: eng + value: BNMR + postalCode: '14022' + residenceStatus: + - language: ara + value: Foreigner + - language: eng + value: Foreigner + addressLine1: + - language: ara + value: '#991, 47 Street, 6 block' + - language: eng + value: '#٩٩١، ٤٧ سترِِت، ٦ بلُكك' + phone: '9395910872' + email: manojvsp12@gmail.com + errors: null + 'Error: Unable to access resource': + value: + id: mosip.resident.identity.info + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-412 + message: Unable to access API resource + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + '': + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.identity.info + version: '1.0' + responsetime: '2022-06-14T08:18:16.563Z' + metadata: null + response: + fullName: + - language: ara + value: Manoj_ara + - language: eng + value: Manoj_eng + dateOfBirth: 1972/05/07 + gender: + - language: eng + value: Male + region: + - language: eng + value: RSK + province: + - language: ara + value: KTA + - language: eng + value: KTA + city: + - language: eng + value: KNT + - language: ara + value: KNT + zone: + - language: eng + value: BNMR + postalCode: '14022' + residenceStatus: + - language: ara + value: Foreigner + - language: eng + value: Foreigner + addressLine1: + - language: ara + value: '#991, 47 Street, 6 block' + - language: eng + value: '#٩٩١، ٤٧ سترِِت، ٦ بلُكك' + phone: '9395910872' + email: manojvsp12@gmail.com + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: + - object + - 'null' + properties: + fullName: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + dateOfBirth: + type: string + gender: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + region: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + province: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + city: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + zone: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + postalCode: + type: string + residenceStatus: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + addressLine1: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + phone: + type: string + email: + type: string + errors: + type: 'null' + examples: + Success: + value: + id: mosip.resident.identity.info + version: '1.0' + responsetime: '2022-06-14T08:18:16.563Z' + metadata: null + response: + fullName: + - language: ara + value: Manoj_ara + - language: eng + value: Manoj_eng + dateOfBirth: 1972/05/07 + gender: + - language: eng + value: Male + region: + - language: eng + value: RSK + province: + - language: ara + value: KTA + - language: eng + value: KTA + city: + - language: eng + value: KNT + - language: ara + value: KNT + zone: + - language: eng + value: BNMR + postalCode: '14022' + residenceStatus: + - language: ara + value: Foreigner + - language: eng + value: Foreigner + addressLine1: + - language: ara + value: '#991, 47 Street, 6 block' + - language: eng + value: '#٩٩١، ٤٧ سترِِت، ٦ بلُكك' + phone: '9395910872' + email: manojvsp12@gmail.com + errors: null + 'Error: Unable to access resource': + value: + id: mosip.resident.identity.info + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + errorCode: RES-SER-412 + message: Unable to access API resource + operationId: get-identity-info-type-update-demographics-personalized-card + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + description: | + This API is to update identity/info to return the attributes in the UI-spec including photo to support preview in Download personalized card page/update demographic page / share credential page. The input is the schema type should be one of below: + 1. update-demographics + 2. personalized-card + 3. share-credential +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/API-to-validate-OTP-for-verifying-email-Id-or-phone-number.yaml b/api-docs/API-to-validate-OTP-for-verifying-email-Id-or-phone-number.yaml new file mode 100644 index 00000000000..02d12d3de37 --- /dev/null +++ b/api-docs/API-to-validate-OTP-for-verifying-email-Id-or-phone-number.yaml @@ -0,0 +1,257 @@ +openapi: 3.1.0 +x-stoplight: + id: 6f04kcjgrafxk +info: + title: API to validate OTP for verifying email Id or phone number + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /contact-details/update-data: + post: + summary: contact-details/update-data + operationId: post-contact-details-update-data + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: object + properties: + status: + type: string + message: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.contact.details.update.id + version: v1 + responsetime: '2022-09-23T08:06:04.802Z' + response: + status: success + message: VALIDATION_SUCCESSFUL + errors: null + examples: + Success: + value: + id: mosip.resident.contact.details.update.id + version: '1.0' + responsetime: '2022-09-23T08:06:04.802Z' + response: + status: success + message: VALIDATION_SUCCESSFUL + errors: null + 'Error: OTP expired - Please send OTP again': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-469 + message: OTP expired - Please send OTP again + 'Error: Invalid Input Parameter- userId': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- userId + 'Error: Invalid Input Parameter- otp': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- otp + 'Error: OTP validation failed': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-468 + message: OTP validation failed + 'Error: Unable to access API resource': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + 'Error: Invalid Input Parameter- transactionId': + value: + id: mosip.resident.contact.details.send.otp.id + version: '1.0' + responsetime: '2022-09-23T08:05:34.374379Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- transactionId + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + userId: + type: string + transactionId: + type: string + otp: + type: string + x-examples: + Example 1: + id: mosip.resident.contact.details.update.id + version: '1.0' + requesttime: '2022-09-20T13:13:04.159Z' + request: + userId: kameshsr1338@gmail.com + transactionId: '1234567890' + otp: '111111' + examples: + example-1: + value: + id: mosip.resident.contact.details.update.id + version: '1.0' + requesttime: '2022-09-20T13:13:04.159Z' + request: + userId: kameshsr1338@gmail.com + transactionId: '1234567890' + otp: '111111' + description: This API is to verify OTP and update the new email/phone number. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Credential-Management.yaml b/api-docs/Credential-Management.yaml new file mode 100644 index 00000000000..9bebe59f299 --- /dev/null +++ b/api-docs/Credential-Management.yaml @@ -0,0 +1,732 @@ +openapi: 3.1.0 +info: + title: Credential Management APIs + description: Credential Management APIs + version: 1.0.0 + contact: + url: 'https://www.govstack.global/' +paths: + /share-credential: + post: + description: Format for sharing identity credentials with an identity partner + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ShareCredentialInfo' + responses: + '200': + description: EventId generated successfully. + headers: + eventId: + description: The eventId for the share credential format + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/ShareCredentialResp' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthorizedError' + '/events/{eventId}?language=LANGCODE': + get: + description: Get the status by eventID + parameters: + - in: path + name: eventId + schema: + type: integer + required: true + description: Event ID to get the status + - in: query + name: language + schema: + type: string + required: true + description: Language Code in 3 letters. Example- eng + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EventResp' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthorizedError' + security: + - Authorization: [] + - ID_token: [] + /download/personalized-card: + post: + description: Download the personalized UIN Card + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadCardInfo' + responses: + '200': + description: OK - The PDF Bytes + headers: + eventId: + description: The eventId for the share credential format + schema: + type: string + maxLength: 16 + minLength: 16 + '400': + description: Bad Request + content: + application/json: + schema: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthorizedError' + security: + - Authorization: [] + - ID_token: [] + /update-uin: + description: This request will authenticate an Individual based on provided OTP and respond with RID after successfully placing update request to Registration Processor. Notification will be sent to phone/email. + post: + description: Update UIN request raised by the resident/citizen + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateUINInfo' + responses: + '200': + description: 'OK, update is successful.' + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapperObject' + security: + - Authentication: [] + '/service-history/{langCode}': + get: + description: Get the status by eventID + parameters: + - in: path + name: langCode + schema: + type: string + required: true + description: Language Code in 3 letters. Example- eng + - in: query + name: fromDate + schema: + type: string + required: true + description: Start date of the request inclusive; the default date will be the 1st of January of that year + - in: query + name: pageFetch + schema: + type: string + description: 'integer greater than 0, default is 10' + - in: query + name: pageStart + schema: + type: string + description: 'integer starting from 0, default is 0' + - in: query + name: searchText + schema: + type: string + description: This will be used to look for Event Id- string greater than 0 but not more than 30; >= 0 characters; <= 30 characters + - in: query + name: serviceType + schema: + type: string + description: 'The service type in general. It can map to different request types. Possible values: AUTHENTICATION_REQUEST, SERVICE_REQUEST,DATA_UPDATE_REQUEST,ID_MANAGEMENT_REQUEST,DATA_SHARE_REQUEST,ALL; default is ALL' + - in: query + name: sortType + schema: + type: string + default: ASC + description: 'ASC/DESC, default is ASC' + - in: query + name: statusFilter + schema: + type: string + description: 'Comma separated service types status code- optional. This can be one of - ALL,SUCCESS,IN_PROGRESS,FAILED' + - in: query + name: toDate + schema: + type: string + description: End date of the request inclusive; the default date will be the date on which this transaction is being done (date today + - in: header + name: locale + schema: + type: string + required: true + description: Locale based on Language and country.Used in date time formatting. Ex. en-US + - in: header + name: time-zone-offset + schema: + type: string + required: true + description: Used in time conversion per the client on any timestamps returned in the response. Ex. -330 - for India + security: + - Authorization: [] + - ID_token: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceHistoryInfo' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthorizedError' + /updateIdentity: + patch: + description: Activate/Deactivate UIN + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateIdentityRequest' + responses: + '200': + description: UIN activation status successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateIdentityResponse' + '204': + description: No content + '401': + description: Unauthorized + '403': + description: Forbidden + /unblock: + post: + description: Command to be used by administrators to unblock UIN + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UINAdminRequest' + responses: + '200': + description: UIN unblocked successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/UINAdminResponse' + /block: + post: + description: Command to be used by administrators to block UIN + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UINAdminRequest' + responses: + '200': + description: UIN blocked successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/UINAdminResponse' +components: + schemas: + ShareCredentialInfo: + type: object + properties: + id: + type: string + default: mosip.resident.share.credential + description: id to hit API + request: + type: object + description: Request body to share credential + properties: + partnerId: + type: string + description: Id to which credentials will be shared + default: mosip.resident.share.credential + sharableAttributes: + type: array + items: + properties: + attributeName: + type: string + description: 'Example: dateOfBirth' + default: dateOfBirth + format: + type: string + description: 'Example: DDMMYYYY' + isMasked: + type: boolean + description: boolean value whether to mask or not + default: true + purpose: + type: string + description: Sharing Credential with Print Partner + pattern: '^[\\r\\nA-Za-z0-9 .,''\\-]+$' + consent: + type: string + description: consent whether Accepted or denied + requesttime: + type: string + description: '2021-10-19T17:01:59.538Z' + version: + type: string + description: 'Example: 1.0' + ShareCredentialResp: + type: object + properties: + id: + type: string + description: 'id to share credential Ex:- resident.share.credential' + version: + type: string + description: version to share credential + default: '1.0' + responsetime: + type: string + description: 'local timestamp Ex:- 2022-06-23T12:00:40.326Z' + metadata: + type: object + response: + type: object + properties: + status: + type: string + description: 'status of share credential API Ex:-Success' + errors: + type: object + description: Errors will be shown with error code and value + EventResp: + type: object + properties: + id: + type: string + description: id of get event status API + version: + type: string + description: version of API + response: + type: object + properties: + eventId: + type: string + description: Randomly generated 16 digit number + minLength: 16 + maxLength: 16 + eventType: + type: string + description: Type of event like Authentication type + eventStatus: + type: string + description: 'Status of request whether succss, failure or in-progress' + individualId: + type: string + description: UIN/Vid of logged in user + summary: + type: string + description: Having short summary about the event id. + timestamp: + type: string + description: local timestamp + info: + type: object + description: Info for multiple attributes + properties: + purpose: + type: string + description: purpose to share credential like sharing to some other parters + applicantName: + type: string + description: name of applicant + partnerId: + type: string + description: parter id to which we want to share credential + partnerLogo: + type: string + description: Logo of partner if any + partnerName: + type: string + description: name of partner + paymentStatus: + type: string + description: status of payment + partnerTransactionId: + type: string + description: unique transaction id of payment if any + deliveryAddress: + type: string + description: delieveryAddress of user in case of order physical card. + authenticationMode: + type: string + description: mode of authentication like OTP + vidType: + type: string + description: 'type of vid like perpetual which means permanent , one-time(which means it can be used only once)' + vid: + type: string + description: virtual id that is created with the help of uin + attributeList: + type: string + description: 'list of attributes like firstName, email' + downloadCardLink: + type: string + description: direct link to download + orderTrackingLink: + type: string + description: direct link to track order status + trackingId: + type: string + description: id to track order + requestTime: + type: string + description: timestamp when API executes + DownloadCardInfo: + type: object + properties: + id: + type: string + description: id for downloading card + version: + type: string + description: version of API + requesttime: + type: string + description: timestamp when we hit API + request: + type: object + properties: + html: + type: string + description: html input of download personalized card which will be later converted to PDF + ResponseWrapperObject: + required: + - response + type: object + properties: + id: + type: string + description: mosip.resident.updateuin + version: + type: string + description: '1.0' + responsetime: + type: string + description: '2024-03-21T09:14:42.537Z' + response: + type: object + description: Give response such as Registration id and 1 message like Notification has been sent to the provided contact detail(s) + errors: + type: array + items: + $ref: '#/components/schemas/ServiceError' + ServiceError: + type: object + properties: + errorCode: + type: string + message: + type: string + UpdateUINInfo: + type: object + properties: + id: + type: string + description: id to hit update uin API. + version: + type: string + description: version of API + requestTime: + type: string + description: timestamp when we get resposne. + request: + type: object + properties: + transactionID: + type: string + description: transactionId will be shown that is used to send otp. + individualId: + type: string + description: uin/vid which is used to send otp for updating uin + individualIdType: + type: string + description: type of individual id like uin/vid + otp: + type: string + description: otp to verify mobile number + identityJson: + type: string + description: base 64 encoded identity value that we want to update. + documents: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + ServiceHistoryInfo: + type: object + properties: + id: + type: string + description: id to get service history API + version: + type: string + description: version of service history API + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + errorMessage: + type: string + response: + type: object + properties: + pageNo: + type: integer + description: starting number of page from where history needs to be fetched. + pageSize: + type: integer + description: number of pages + totalItems: + type: integer + description: total items across all pages + totalPages: + type: integer + description: total number of pages + data: + type: array + items: + properties: + eventId: + type: string + description: Random 16 digits eventId + eventDescription: + type: string + description: details of events + eventStatus: + type: string + description: status of event + timeStamp: + type: string + description: timestamp of response + requestType: + type: string + description: type of request + responseTime: + type: string + UpdateIdentityRequest: + type: object + properties: + id: + type: string + description: Example - govstack.updateIdentity + version: + type: string + description: v1 + requesttime: + type: string + description: timestamp when API executes + metaData: + type: object + request: + type: object + properties: + status: + type: string + description: status of updateIdentity APi + identity: + type: object + description: identity which user wants to update + documents: + type: array + items: + properties: + category: + type: string + description: cateogory like proof of resident + value: + type: string + description: document value like pdf content + verifiedAttributes: + type: array + items: + properties: + attributeString: + type: string + registrationId: + type: string + description: unique id created while registring uin + uin: + type: string + description: unique value for each individual + UpdateIdentityResponse: + type: object + properties: + id: + type: string + description: Example - govstack.updateIdentity + version: + type: string + description: v1 + responsetime: + type: string + description: timestamp + metaData: + type: object + response: + type: object + properties: + status: + type: string + description: status of API + identity: + type: object + description: identity that user wants to update + documents: + type: array + items: + properties: + category: + type: string + description: cateogory like proof of resident + value: + type: string + description: document value like pdf content + verifiedAttributes: + type: array + items: + type: object + properties: + attributeString: + type: string + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + errorMessage: + type: string + UINAdminRequest: + type: object + properties: + id: + type: string + description: id to hit API + version: + type: string + description: version of API + requesttime: + type: string + description: timestamp when API executed + metadata: + type: object + request: + type: object + properties: + id: + type: string + idType: + type: string + status: + type: string + expiryTimestamp: + type: string + UINAdminResponse: + type: object + properties: + id: + type: string + description: id to hit API + version: + type: string + description: version of API + responsetime: + type: string + description: timestamp when API executed + metadata: + type: object + response: + type: object + properties: + id: + type: string + description: unique id + idType: + type: string + description: type of id like uin/vid + status: + type: string + description: status of API + expiryTimestamp: + type: string + description: timestamp when it will expire + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + UnauthorizedError: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: object + response: + type: object + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + errorMessage: + type: string + securitySchemes: + Authorization: + type: http + scheme: string + description: Authorization code received from /token endpoint + ID_token: + type: http + scheme: string + description: ID token received from /token endpoint + Authentication: + type: http + scheme: string + description: ID token received from /token endpoint diff --git a/api-docs/Document.yaml b/api-docs/Document.yaml new file mode 100644 index 00000000000..0ec6b9151bb --- /dev/null +++ b/api-docs/Document.yaml @@ -0,0 +1,455 @@ +openapi: 3.1.0 +info: + title: Document + version: '1.0' + summary: API for to uploading and getting documents to resident portal + description: API for to uploading and getting documents +servers: + - url: 'http://localhost:8099' + - url: 'https://dev.mosip.net' + description: '' +paths: + '/documents/{transaction-id}': + parameters: + - schema: + type: string + name: transaction-id + in: path + required: true + get: + summary: Get documents by transaction-id + tags: [] + responses: + '200': + description: Documents Found + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + id: mosip.pre-registration.document.fetch.metadata + version: '1.0' + responsetime: '2022-04-11T10:09:00.536Z' + response: + documentsMetaData: + - docName: temp.pdf + documentId: 12215bee-b41d-11ec-8584-9950af2dc4f5 + docCatCode: POI + docTypCode: CIN + langCode: eng + refNumber: qq + - docName: temp.pdf + documentId: 185de2df-b41d-11ec-8584-017efff3568d + docCatCode: POA + docTypCode: RNC + langCode: eng + refNumber: '22' + - docName: temp.pdf + documentId: fc36d381-b41f-11ec-8584-81210f13bb39 + docCatCode: POR + docTypCode: CRN + langCode: eng + refNumber: '' + errors: null + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + responsetime: + type: string + minLength: 1 + response: + type: + - object + - 'null' + required: + - documentsMetaData + properties: + documentsMetaData: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + docName: + type: string + minLength: 1 + documentId: + type: string + minLength: 1 + docCatCode: + type: string + minLength: 1 + docTypCode: + type: string + minLength: 1 + langCode: + type: string + minLength: 1 + refNumber: + type: string + minLength: 1 + required: + - docName + - documentId + - docCatCode + - docTypCode + - langCode + - refNumber + errors: + type: + - array + - 'null' + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?deref=bundle' + required: + - id + - version + - responsetime + - response + examples: + Get Documents information uploaded for transaction-id: + value: + id: mosip.resident.document.fetch.metadata + version: '1.0' + responsetime: '2022-04-11T10:09:00.536Z' + response: + documentsMetaData: + - docName: temp0.pdf + documentId: 12215bee-b41d-11ec-8584-9950af2dc4f5 + docCatCode: POI + docTypCode: CIN + langCode: eng + refNumber: qq + - docName: temp1.pdf + documentId: 185de2df-b41d-11ec-8584-017efff3568d + docCatCode: POA + docTypCode: RNC + langCode: eng + refNumber: '22' + - docName: temp2.pdf + documentId: fc36d381-b41f-11ec-8584-81210f13bb39 + docCatCode: POR + docTypCode: CRN + langCode: eng + refNumber: '33' + errors: null + 'Error: Documents not available for transaction ID': + value: + id: mosip.resident.document.fetch.metadata + version: '1.0' + responsetime: '2022-04-11T10:09:00.536Z' + response: null + errors: + - errorCode: RES-UPD-001 + message: Documents not available for transaction ID + application/xml: + schema: + description: '' + type: object + x-examples: + example-1: + id: mosip.pre-registration.document.upload + version: '1.0' + responsetime: '2022-04-11T10:10:19.266Z' + response: + preRegistrationId: '42847563954961' + docId: 12215bee-b41d-11ec-8584-9950af2dc4f5 + docName: temp.pdf + refNumber: null + docCatCode: POI + docTypCode: CIN + docFileFormat: pdf + errors: null + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + responsetime: + type: string + minLength: 1 + response: + type: object + required: + - transactioonId + - docId + - docName + - docCatCode + - docTypCode + - docFileFormat + properties: + transactioonId: + type: string + minLength: 1 + docId: + type: string + minLength: 1 + docName: + type: string + minLength: 1 + refNumber: + type: number + docCatCode: + type: string + minLength: 1 + docTypCode: + type: string + minLength: 1 + docFileFormat: + type: string + minLength: 1 + errors: + type: array + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?mid=5336' + required: + - id + - version + - responsetime + - response + '201': + description: Created + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + id: mosip.pre-registration.document.fetch.metadata + version: '1.0' + responsetime: '2022-04-11T10:09:00.536Z' + response: + documentsMetaData: + - docName: temp.pdf + documentId: 12215bee-b41d-11ec-8584-9950af2dc4f5 + docCatCode: POI + docTypCode: CIN + langCode: eng + refNumber: qq + - docName: temp.pdf + documentId: 185de2df-b41d-11ec-8584-017efff3568d + docCatCode: POA + docTypCode: RNC + langCode: eng + refNumber: '22' + - docName: temp.pdf + documentId: fc36d381-b41f-11ec-8584-81210f13bb39 + docCatCode: POR + docTypCode: CRN + langCode: eng + refNumber: '' + errors: null + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + responsetime: + type: string + minLength: 1 + response: + type: object + required: + - documentsMetaData + properties: + documentsMetaData: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + docName: + type: string + minLength: 1 + documentId: + type: string + minLength: 1 + docCatCode: + type: string + minLength: 1 + docTypCode: + type: string + minLength: 1 + langCode: + type: string + minLength: 1 + refNumber: + type: string + minLength: 1 + '': + type: string + required: + - docName + - documentId + - docCatCode + - docTypCode + - langCode + - refNumber + errors: + type: array + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?mid=5336' + required: + - id + - version + - responsetime + - response + '404': + description: User Not Found + operationId: get-documents-for-transacion-id + description: Retrieve the document information uploaded for the transation-id + parameters: [] + post: + summary: Upload document for the transaction-id + operationId: post-documents-transaction-id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + id: mosip.pre-registration.document.upload + version: '1.0' + responsetime: '2022-04-11T10:10:19.266Z' + response: + preRegistrationId: '42847563954961' + docId: 12215bee-b41d-11ec-8584-9950af2dc4f5 + docName: temp.pdf + refNumber: null + docCatCode: POI + docTypCode: CIN + docFileFormat: pdf + errors: null + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + responsetime: + type: string + minLength: 1 + response: + type: object + required: + - transactionId + - docId + - docName + - docCatCode + - docTypCode + - docFileFormat + properties: + transactionId: + type: string + minLength: 1 + docId: + type: string + minLength: 1 + docName: + type: string + minLength: 1 + refNumber: + type: string + docCatCode: + type: string + minLength: 1 + docTypCode: + type: string + minLength: 1 + docFileFormat: + type: string + minLength: 1 + errors: + type: array + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?mid=5336' + required: + - id + - version + - responsetime + - response + examples: {} + description: Upload a document. + requestBody: + content: + multipart/form-data: + schema: + description: '' + type: object + properties: + id: + type: string + minLength: 1 + request: + type: object + properties: + docCatCode: + type: string + minLength: 1 + docTypCode: + type: string + minLength: 1 + langCode: + type: string + minLength: 1 + refNumber: + type: string + minLength: 1 + required: + - docCatCode + - docTypCode + - langCode + - refNumber + metadata: + type: object + properties: {} + required: [] + version: + type: string + minLength: 1 + requesttime: + type: string + minLength: 1 + required: + - id + - request + - metadata + - version + - requesttime + x-examples: + example-1: + id: mosip.pre-registration.document.upload + request: + docCatCode: POI + docTypCode: CIN + langCode: eng + refNumber: qq + metadata: {} + version: '1.0' + requesttime: '2022-04-11T10:10:18.120Z' + examples: {} + application/pdf: + schema: + type: object + properties: {} + description: 'Document request: document description, file: application/pdf' +components: + schemas: {} diff --git a/api-docs/Get-Channel-Verified-Status.yaml b/api-docs/Get-Channel-Verified-Status.yaml new file mode 100644 index 00000000000..b254fdcabd7 --- /dev/null +++ b/api-docs/Get-Channel-Verified-Status.yaml @@ -0,0 +1,105 @@ +openapi: 3.1.0 +info: + title: Get Channel Verified Status + version: '1.0' + summary: Get the status of mobile/email verified status for a UIN/VID + description: Get Channel Verified Status +servers: + - url: 'http://localhost:3000' + - url: 'https://dev.mosip.net' + description: '' +paths: + /channel/verification-status: + parameters: [] + get: + summary: Get Channel Verified Status + tags: [] + responses: + '200': + description: Channel Verified + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.channel.verification.status + version: v1 + responsetime: '2022-04-26T15:17:42.083Z' + metadata: null + response: + verificationStatus: true + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + verificationStatus: + type: boolean + errors: + type: + - string + - array + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?mid=5336' + examples: + Verified Success: + value: + id: mosip.resident.channel.verification.status + version: '1.0' + responsetime: '2022-04-26T15:17:42.083Z' + metadata: null + response: + verificationStatus: true + Not Verified: + value: + id: mosip.resident.channel.verification.status + version: '1.0' + responsetime: '2022-04-26T15:17:42.083Z' + metadata: null + response: + verificationStatus: false + Invalid OTP channel: + value: + id: mosip.resident.channel.verification.status + version: '1.0' + responsetime: '2022-04-26T15:17:42.083Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-438 + message: Invalid OTP Channel + Invalid individual-Id: + value: + id: mosip.resident.channel.verification.status + version: '1.0' + responsetime: '2022-04-26T15:17:42.083Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter- individualId + '404': + description: User Not Found + operationId: get-channel-verification-status + description: Check if the mobile/email is verified for UIN/VID + parameters: + - schema: + type: string + in: query + name: individualId + description: UIN / VID + - schema: + type: string + in: query + name: channel + description: MOBILE/EMAIL +components: + schemas: {} diff --git a/api-docs/Get-Resident-UI-Spec.yaml b/api-docs/Get-Resident-UI-Spec.yaml new file mode 100644 index 00000000000..4bb424300ad --- /dev/null +++ b/api-docs/Get-Resident-UI-Spec.yaml @@ -0,0 +1,1575 @@ +openapi: 3.1.0 +x-stoplight: + id: hula3pk9utwko +info: + title: Get Resident UI Spec (Pragya) + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /​proxy​/config​/ui-schema: + get: + summary: /​proxy​/config​/ui-schema + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + identity: + type: array + items: + type: object + properties: + id: + type: string + description: + type: string + type: + type: string + controlType: + type: + - 'null' + - string + fieldType: + type: string + inputRequired: + type: boolean + validators: + type: array + items: + type: object + properties: + type: + type: string + validator: + type: string + arguments: + type: array + items: + type: object + properties: {} + required: + type: boolean + labelName: + type: object + properties: + fra: + type: string + ara: + type: string + eng: + type: string + kan: + type: string + hin: + type: string + tam: + type: string + visible: + type: boolean + group: + type: string + preview: + type: boolean + subType: + type: string + locationHierarchy: + type: array + items: + type: string + x-examples: + example-1: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + examples: + Success: + value: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + operationId: get-proxy-config-ui-schema + description: This API is used to get the UI Schema + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Mock-API-to-return-response-parameters-for-the-payment-made-by-the-resident.yaml b/api-docs/Mock-API-to-return-response-parameters-for-the-payment-made-by-the-resident.yaml new file mode 100644 index 00000000000..890aa17f1fe --- /dev/null +++ b/api-docs/Mock-API-to-return-response-parameters-for-the-payment-made-by-the-resident.yaml @@ -0,0 +1,112 @@ +openapi: 3.1.0 +x-stoplight: + id: gqvm2uxqlr4ve +info: + title: Mock API to return response parameters for the payment made by the resident + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /order/physical-card: + get: + summary: /order/physical-card + tags: [] + responses: + '200': + description: OK + '302': + description: Found + content: + text/plain: + schema: + type: object + properties: {} + examples: + Upon valid request: + value: 302 redirection to Resident Services card/order-redirect API. + '402': + description: Payment Required + content: + text/plain: + schema: + type: object + properties: {} + examples: + Payment unsuccessful: + value: + error_code: RES-SER-507 + error_message: Payment failed + operationId: get-order-physical-card + parameters: + - schema: + type: string + in: query + name: redirectUrl + required: true + description: The base64 encoded URL for Resident-Service’s order handling API. + - schema: + type: string + in: query + name: eventId + required: true + description: the event ID to be used to track the status of whole process of order untill the card delivery. + - schema: + type: string + in: query + name: residentName + required: true + description: resident name - for display purpose in Print Partner’s order-card page + - schema: + type: string + in: query + name: residentDefaultFullAddress + required: true + description: base64-url encoded full address string - for display purpose in Print Partner’s order-card page + - schema: + type: string + in: cookie + name: Authorization token + required: true + description: This API is to get response parameters for the payment made by the resident +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/MockDigitalCardService.yaml b/api-docs/MockDigitalCardService.yaml new file mode 100644 index 00000000000..37485e30f19 --- /dev/null +++ b/api-docs/MockDigitalCardService.yaml @@ -0,0 +1,189 @@ +openapi: 3.1.0 +x-stoplight: + id: np2hhlh7i4yzc +info: + title: MockDigitalCardService + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/users/{userId}': + parameters: + - schema: + type: integer + name: userId + in: path + required: true + description: Id of an existing user. + get: + summary: Get User Info by User ID + tags: [] + responses: + '200': + description: User Found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + Get User Alice Smith: + value: + id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + '404': + description: User Not Found + operationId: get-users-userId + description: Retrieve the information of the user with the matching user ID. + patch: + summary: Update User Information + operationId: patch-users-userId + responses: + '200': + description: User Updated + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + Updated User Rebecca Baker: + value: + id: 13 + firstName: Rebecca + lastName: Baker + email: rebecca@gmail.com + dateOfBirth: '1985-10-02' + emailVerified: false + createDate: '2019-08-24' + '404': + description: User Not Found + '409': + description: Email Already Taken + description: Update the information of an existing user. + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + description: 'If a new email is given, the user''s email verified property will be set to false.' + dateOfBirth: + type: string + examples: + Update First Name: + value: + firstName: Rebecca + Update Email: + value: + email: rebecca@gmail.com + Update Last Name & Date of Birth: + value: + lastName: Baker + dateOfBirth: '1985-10-02' + description: Patch user properties to update. + /user: + post: + summary: Create New User + operationId: post-user + responses: + '200': + description: User Created + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + New User Bob Fellow: + value: + id: 12 + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + emailVerified: false + createDate: '2020-11-18' + '400': + description: Missing Required Information + '409': + description: Email Already Taken + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + dateOfBirth: + type: string + format: date + required: + - firstName + - lastName + - email + - dateOfBirth + examples: + Create User Bob Fellow: + value: + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + description: Post the necessary fields for the API to create a new user. + description: Create a new user. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Multi-language-support(Pragya).yaml b/api-docs/Multi-language-support(Pragya).yaml new file mode 100644 index 00000000000..e2a71915eb3 --- /dev/null +++ b/api-docs/Multi-language-support(Pragya).yaml @@ -0,0 +1,1735 @@ +openapi: 3.1.0 +x-stoplight: + id: 4szwibrjjt3m2 +info: + title: Multi-language-support(Pragya) + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/auth-proxy/config/ui-schema/{schemaType}': + get: + summary: UI Schema for the given schema type + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + identity: + type: array + items: + type: object + properties: + id: + type: string + description: + type: string + type: + type: string + controlType: + type: + - 'null' + - string + fieldType: + type: string + inputRequired: + type: boolean + validators: + type: array + items: + type: object + properties: + type: + type: string + validator: + type: string + arguments: + type: array + items: + type: object + properties: {} + required: + type: boolean + labelName: + type: object + properties: + fra: + type: string + ara: + type: string + eng: + type: string + kan: + type: string + hin: + type: string + tam: + type: string + visible: + type: boolean + group: + type: string + preview: + type: boolean + subType: + type: string + locationHierarchy: + type: array + items: + type: string + x-examples: + example-1: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + examples: + Success: + value: + identity: + - id: IDSchemaVersion + description: ID Schema Version + type: number + controlType: null + fieldType: default + inputRequired: false + validators: [] + required: true + - id: title + description: Title + labelName: + eng: Title + ara: عنوان + hin: पशीर्षक + kan: ಶೀರ್ಷಿಕೆ + tam: தலைப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: fullName + description: Enter Full Name + labelName: + eng: Full Name + ara: الاسم الكامل + fra: Nom complet + hin: पूरा नाम + kan: ಪೂರ್ಣ ಹೆಸರು + tam: முழு பெயர் + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?!.*[ ]{4})(?=.{3,50}$).*' + arguments: [] + required: true + transliteration: true + - id: dateOfBirth + description: Enter DOB + labelName: + eng: Date Of Birth + ara: تاريخ الولادة + fra: Date de naissance + hin: जन्म की तारीख + kan: ಹುಟ್ತಿದ ದಿನ + tam: பிறந்த தேதி + controlType: ageDate + inputRequired: true + fieldType: default + type: string + validators: [] + required: true + - id: gender + description: Enter Gender + labelName: + eng: Gender + ara: جنس + fra: Le genre + hin: लिंग + kan: ಲಿಂಗ + tam: பாலினம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + - id: nationality + description: nationality + labelName: + fra: Nationalité + ara: الجنسية + eng: Nationality + hin: राष्ट्रीयता + kan: ರಾಷ್ಟ್ರೀಯತೆ + tam: தேசியம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: flagb + description: Je suis né(e) au maroc + labelName: + fra: Je suis né(e) au maroc + ara: ولدت في المغرب + eng: I was born in Morocco + hin: झंडाब + kan: ಧ್ವಜ + tam: கொடி + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: personal_info + preview: true + - id: placeOfBirth + description: Lieu de naissance + labelName: + fra: Lieu de naissance + ara: مكان الإزدياد + eng: Place of birth + hin: जन्म स्थान + kan: ಹುಟ್ಟಿದ ಸ್ಥಳ + tam: பிறந்த இடம் + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: listCountry + description: Pay de naissance + labelName: + fra: Pay de naissance + ara: بلد الإزدياد + eng: Birth Pay + hin: सूचीदेश + kan: ಪಟ್ಟಿ ದೇಶ + tam: பட்டியல் நாடு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: personal_info + preview: true + - id: region + description: region + labelName: + eng: Region + ara: منطقة + fra: Région + hin: ऊपरी क्षेत्र + kan: ಪ್ರದೇಶ + tam: பிராந்தியம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 1 + parentLocCode: MOR + required: true + - id: province + description: province + labelName: + eng: Province + ara: المحافظة + fra: Province + hin: प्रांत + kan: ಪ್ರಾಂತ್ಯ + tam: மாகாணம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 2 + required: true + - id: city + description: city + labelName: + eng: City + ara: مدينة + fra: Ville + hin: शहर + kan: ನಗರ + tam: நகரம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{3,50}$).*' + arguments: [] + locationHierarchyLevel: 3 + required: true + - id: zone + description: zone + labelName: + eng: Zone + ara: منطقة + fra: Zone + hin: क्षेत्र + kan: ವಲಯ + tam: மண்டலம் + controlType: dropdown + inputRequired: true + fieldType: default + type: simpleType + validators: [] + locationHierarchyLevel: 4 + required: true + - id: postalCode + description: postalCode + labelName: + eng: Postal Code + ara: الكود البريدى + fra: code postal + hin: डाक कोड + kan: ಅಂಚೆ ಕೋಡ್ + tam: அஞ்சல் குறியீடு + controlType: dropdown + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[(?i)A-Z0-9]{5}$|^NA$' + arguments: [] + locationHierarchyLevel: 5 + required: true + - id: residenceStatus + description: Quartier/Résidence/Douar + labelName: + fra: Quartier/Résidence/Douar + ara: الحي / السكن / الدوار + eng: Residence Status + hin: निवास स्थान + kan: ನಿವಾಸ + tam: குடியிருப்பு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + - id: addressType + description: Type d'habitat + labelName: + fra: Type d'habitat + ara: نوع السكن + eng: Habitat type + kan: ವಿಳಾಸದ ವಿಧ + hin: पता मुद्रलेख + tam: முகவரி வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: address_info + preview: true + tooltip: false + - id: portNo + description: N Porte + labelName: + fra: N° Porte + ara: رقم الباب + eng: Port No + kan: ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पोर्ट नंबर + tam: துறை எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: true + group: address_info + preview: true + - id: apptNo + description: N immeuble + labelName: + fra: N° immeuble + ara: رقم المبنى + eng: Appt no + kan: appt ಸಂಖ್ಯೆ + hin: उपयुक्त संख्या + tam: appt எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{0,10}$).*' + arguments: [] + required: false + visible: false + group: address_info + preview: true + - id: addressLine1 + description: Adresse de résidence + labelName: + fra: Adresse de résidence + ara: عنوان السكن + eng: Adresse Line1 + hin: पता पंक्ति 1 + kan: ವಿಳಾಸ 1 + tam: முகவரி வரி 1 + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^(?=.{0,100}$).*' + arguments: [] + required: true + visible: true + group: address_info + preview: true + - id: referenceCNIENumber + description: CNIE + labelName: + fra: CNIE + ara: رقم البطاقة الوطنية + eng: CNIE + kan: ಉಲ್ಲೇಖ CNIE ಸಂಖ್ಯೆ + hin: संदर्भ सीएनआईई नंबर + tam: குறிப்பு CNIE எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)|(^[a-z]{2}[0-9]{1,6}$)|(^[a-z]{1}[0-9]{1,7}$)' + arguments: [] + required: true + visible: true + group: card_info + preview: true + - id: resOuPass + description: Je dispose + labelName: + fra: Je dispose + ara: أملك + eng: I have + kan: resOuPass + hin: resOuPass + tam: resOuPass + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: false + group: card_info + preview: false + tooltip: false + - id: referenceResidencyNumber + description: Numéro d'identité du résident étranger + labelName: + fra: Numéro d'identité du résident étranger + ara: رقم هوية المقيم الأجنبي + eng: Identity number of the foreign resident + kan: ರೆಸಿಡೆನ್ಸಿ ಸಂಖ್ಯೆ ಉಲ್ಲೇಖ + hin: संदर्भ निवास संख्या + tam: குறிப்பு குடியிருப்பு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '[A-Za-z][0-9]{6}[A-Za-z]' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: passportNumber + description: Numéro de passport + labelName: + fra: Numéro de Passeport + ara: رقم جواز السفر + eng: Passport number + kan: ಪಾಸ್ಪೋರ್ಟ್ ಸಂಖ್ಯೆ + hin: पासपोर्ट संख्या + tam: கடவுச்சீட்டு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + tooltip: false + - id: flagidcs + description: Je dispose d'un IDCS + labelName: + fra: Je dispose d'un IDCS + ara: أملك المعرف المدني والاجتماعي الرقمي + eng: I have an IDCS + kan: ಧ್ವಜಗಳು + hin: फ्लैगिड्स + tam: கொடிகள் + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: true + visible: true + group: card_info + preview: true + tooltip: true + - id: birthCertificateNumber + description: Numéro Acte de Naissance + labelName: + fra: Numéro Acte de Naissance + ara: رقم شهادة الميلاد + eng: Birth Certificate Number + kan: ಜನನ ಪ್ರಮಾಣಪತ್ರ ಸಂಖ್ಯೆ + hin: जन्म प्रमाणपत्र संख्या + tam: பிறப்புச் சான்றிதழ் எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^(?=.{1,20}$).*' + arguments: [] + required: true + visible: false + group: card_info + preview: true + - id: civilRegistryNumber + description: Numéro Acte de Naissance digitalisé + labelName: + fra: Numéro Acte de Naissance digitalisé + ara: رقم شهادة الميلاد الرقمي + eng: Digital Birth Certificate Number + kan: ನಾಗರಿಕ ನೋಂದಣಿ ಸಂಖ್ಯೆ + hin: सिविल रजिस्ट्री नंबर + tam: சிவில் பதிவு எண் + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: [] + required: true + visible: false + group: card_info + preview: true + tooltip: true + - id: phone + description: phone + labelName: + eng: Phone + ara: هاتف + fra: Téléphone + hin: फ़ोन + kan: ದೂರವಾಣಿ + tam: தொலைபேசி + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[+]*([0-9]{1})([0-9]{9})$' + arguments: [] + required: true + - id: email + description: email + labelName: + eng: Email + ara: البريد الإلكتروني + fra: Email + hin: ईमेल + kan: ಇಮೇಲ್ + tam: மின்னஞ்சல் + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[\w-\+]+(\.[\w]+)*@[\w-]+(\.[\w]+)*(\.[a-zA-Z]{2,})$' + arguments: [] + required: true + - id: guardianType + description: Type de Tuteur + labelName: + fra: Type de Tuteur + ara: نوع الوصي + eng: Tutor type + kan: ರಕ್ಷಕ ವಿಧ + hin: संरक्षक प्रकार + tam: பாதுகாவலர் வகை + controlType: dropdown + subtype: radio + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: false + - id: introducerName + description: Prénom du tuteur + labelName: + eng: introducer Name + ara: مقدم Name + fra: introducteur Name + kan: ಪರಿಚಯಕಾರ Name + hin: परिचयकर्ता Name + tam: அறிமுகம் Name + controlType: textbox + inputRequired: true + fieldType: default + type: simpleType + validators: + - type: regex + validator: '^[a-zA-ZÀ-ÿء-ي٠-٩ ]{2,47}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: introducerUIN + description: Identifiant digital civil et social du tuteur + labelName: + eng: introducer UIN + ara: مقدم UIN + fra: introducteur UIN + kan: ಪರಿಚಯಕಾರ UIN + hin: परिचयकर्ता UIN + tam: அறிமுகம் UIN + controlType: textbox + inputRequired: true + fieldType: default + type: string + checksum: true + validators: + - type: regex + validator: '^[0-9]{10}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceRID + description: Identifiant RNP RID du tuteur + labelName: + eng: introducer RID + ara: مقدم RID + fra: introducteur RID + kan: ಪರಿಚಯಕಾರ RID + hin: परिचयकर्ता RID + tam: அறிமுகம் RID + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '^[0-9]{29}$' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + tooltip: true + - id: introduceCNIE + description: Numéro d'identité du tuteur + labelName: + eng: introducer CNIE + ara: مقدم CNIE + fra: introducteur CNIE + kan: ಪರಿಚಯಕಾರ CNIE + hin: परिचयकर्ता CNIE + tam: அறிமுகம் CNIE + controlType: textbox + inputRequired: true + fieldType: default + type: string + validators: + - type: regex + validator: '(^[A-Z]{2}[0-9]{1,6}$)|(^[A-Z]{1}[0-9]{1,7}$)' + arguments: [] + required: false + visible: false + group: guardian_info + preview: true + - id: relationWithChild + description: Lien de parenté + labelName: + fra: Lien de parenté + ara: صلة القرابة + eng: Relationship + kan: ಮಗುವಿನೊಂದಿಗೆ ಸಂಬಂಧ + hin: बच्चे के साथ संबंध + tam: குழந்தையுடன் உறவு + controlType: dropdown + inputRequired: true + fieldType: dynamic + type: simpleType + validators: [] + required: false + visible: false + group: guardian_info + preview: true + - id: proofOfAddress + description: proofOfAddress + labelName: + ara: إثبات العنوان + fra: Preuve d'adresse + eng: Address Proof + hin: निवास प्रमाण पत्र + kan: ವಿಳಾಸ ಪುರಾವೆ + tam: முகவரி சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POA + required: false + - id: proofOfIdentity + description: proofOfIdentity + labelName: + ara: إثبات الهوية + fra: Preuve d'identité + eng: Identity Proof + hin: पहचान प्रमाण + kan: ಗುರುತಿನ ಪುರಾವೆ + tam: அடையாள சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POI + required: true + - id: proofOfRelationship + description: proofOfRelationship + labelName: + ara: إثبات العلاقة + fra: Preuve de relation + eng: Relationship Proof + hin: संबंध प्रमाण + kan: ಸಂಬಂಧ ಪುರಾವೆ + tam: உறவு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POR + required: true + - id: proofOfDateOfBirth + description: proofOfDateOfBirth + labelName: + ara: دليل DOB + fra: Preuve de date de naissance + eng: DOB Proof + hin: जन्मतिथि प्रमाण + kan: DOB ಪ್ರೂಫ್ + tam: DOB ஆதாரம் + controlType: fileupload + inputRequired: true + validators: [] + subType: POB + required: true + - id: proofOfException + description: proofOfException + labelName: + ara: إثبات الاستثناء + fra: Preuve d'exception + eng: Exception Proof + kan: ಎಕ್ಸೆಪ್ಶನ್ ಪ್ರೂಫ್ + tam: விதிவிலக்கு சான்று + controlType: fileupload + inputRequired: true + validators: [] + subType: POE + required: true + locationHierarchy: + - region + - province + - city + - zone + - postalCode + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-proxy-config-ui-schema + description: This API is to get the Resident UI Spec for the given schemaType which is one of share-credential/update-demographics/personalized-card. + parameters: + - schema: + type: string + in: query + name: schemaType + description: 'The schema type to which UI Schema needs to be returned: one of share-credential/update-demographics/personalized-card' + required: true + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + parameters: + - schema: + type: string + name: schemaType + in: path + required: true + /proxy​/config​/ui-properties: + get: + summary: /proxy​/config​/ui-properties + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + mosip-prereg-ui-url: + type: string + mosip.resident.api.id.auth: + type: string + resident.revokevid.version: + type: string + resident.datetime.pattern: + type: string + resident.vid.id: + type: string + mosip.mandatory-languages: + type: string + resident.authunlock.id: + type: string + resident.vid.version: + type: string + resident.revokevid.id: + type: string + mosip.resident.api.id.otp.request: + type: string + mosip.resident.api.version.otp.request: + type: string + resident.authhistory.id: + type: string + auth.type.status.id: + type: string + mosip.resident.api.version.auth: + type: string + resident.updateuin.id: + type: string + mosip-prereg-host: + type: string + mosip.optional-languages: + type: string + mosip.utc-datetime-pattern: + type: string + mosip.iam.adapter.clientid: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-03T15:10:31.221Z' + metadata: null + response: + mosip-prereg-ui-url: 'https://prereg.dev3.mosip.net/pre-registration-ui/' + mosip.resident.api.id.auth: mosip.identity.auth.internal + resident.revokevid.version: v1 + resident.datetime.pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + resident.vid.id: mosip.resident.vid + mosip.mandatory-languages: eng + resident.authunlock.id: mosip.resident.authunlock + resident.vid.version: v1 + resident.revokevid.id: mosip.resident.vidstatus + mosip.resident.api.id.otp.request: mosip.identity.otp.internal + mosip.resident.api.version.otp.request: '1.0' + resident.authhistory.id: mosip.resident.authhistory + auth.type.status.id: mosip.identity.authtype.status.update + mosip.resident.api.version.auth: '1.0' + resident.updateuin.id: mosip.resident.updateuin + mosip-prereg-host: prereg.dev3.mosip.net + mosip.optional-languages: 'fra,ara' + mosip.utc-datetime-pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + mosip.iam.adapter.clientid: mosip-resident-client + errors: null + examples: + Success: + value: + id: resident.ui.properties + version: '1.0' + responsetime: '2022-06-03T15:10:31.221Z' + metadata: null + response: + mosip-prereg-ui-url: 'https://prereg.dev3.mosip.net/pre-registration-ui/' + mosip.resident.api.id.auth: mosip.identity.auth.internal + resident.revokevid.version: v1 + resident.datetime.pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + resident.vid.id: mosip.resident.vid + mosip.mandatory-languages: eng + resident.authunlock.id: mosip.resident.authunlock + resident.vid.version: v1 + resident.revokevid.id: mosip.resident.vidstatus + mosip.resident.api.id.otp.request: mosip.identity.otp.internal + mosip.resident.api.version.otp.request: '1.0' + resident.authhistory.id: mosip.resident.authhistory + auth.type.status.id: mosip.identity.authtype.status.update + mosip.resident.api.version.auth: '1.0' + resident.updateuin.id: mosip.resident.updateuin + mosip-prereg-host: prereg.dev3.mosip.net + mosip.optional-languages: 'fra,ara' + mosip.utc-datetime-pattern: 'yyyy-MM-dd''T''HH:mm:ss.SSS''Z''' + mosip.iam.adapter.clientid: mosip-resident-client + errors: null + operationId: get-proxy-config-ui-properties +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/OpenID-GetTokens.yaml b/api-docs/OpenID-GetTokens.yaml new file mode 100644 index 00000000000..8b9c3e053bb --- /dev/null +++ b/api-docs/OpenID-GetTokens.yaml @@ -0,0 +1,46 @@ +openapi: 3.1.0 +info: + title: OpenID-Token API + version: '1.0' + summary: API to get ID Token and Access token for code in for Auth Code flow + description: API to get ID Token and Access token for code in for Auth Code flow +servers: + - url: 'http://localhost:3000' + - url: 'https://dev.mosip.net' + description: '' +paths: + /oidc/token: + parameters: [] + get: + summary: Get ID Token and Access token for Authorization Code + tags: [] + responses: + '200': + description: OK + headers: + Set-Cookie: + schema: + type: string + description: id_token=; access_token= + '404': + description: User Not Found + operationId: get_oidc-tokens-for-code + description: Get the ID Token and Access Token for the given Authorization Code and redirect URI (Authorization Code flow in OIDC) + parameters: + - schema: + type: string + in: query + name: code + description: Authorization Code + - schema: + type: string + in: query + name: redirect_uri + description: The redirect URI used at login to Mosip IdP + - schema: + type: string + in: query + name: state + description: The state used while login using Mosip Idp +components: + schemas: {} diff --git a/api-docs/Print-Partner-Payment-Status.yaml b/api-docs/Print-Partner-Payment-Status.yaml new file mode 100644 index 00000000000..d304b615ff1 --- /dev/null +++ b/api-docs/Print-Partner-Payment-Status.yaml @@ -0,0 +1,188 @@ +openapi: 3.1.0 +x-stoplight: + id: 3rfd604b5po3w +info: + title: Print Partner Payment Status + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /check-order-status: + get: + summary: Your GET endpoint + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: + transactionId: '1234567890' + trackingId: adfs-3435-fdfg-t533 + errors: [] + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + response: + type: object + properties: + transactionId: + type: string + trackingId: + type: string + description: This is returned in case of the card is dispatched + errors: + type: array + items: + type: object + examples: + Order just confirmed: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: + transactionId: '1234567890' + trackingId: adfs-3435-fdfg-t533 + errors: [] + Card dispatched: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: + transactionId: '1234567890' + trackingId: adfs-3435-fdfg-t533 + errors: [] + '402': + description: Payment Required + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-457 + message: Payment has failed + examples: + Payment failed: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-457 + message: Payment has failed + Payment cancelled: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-458 + message: Payment has been cancelled + '500': + description: Internal Server Error + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-459 + message: Technical error has occurred + examples: + Technical error: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-459 + message: Technical error has occurred + Cannot place order at the moment: + value: + id: null + version: null + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-460 + message: Cannot place order at the moment + operationId: get-check-order-status + parameters: + - schema: + type: string + in: query + name: individualId + required: true + description: The UIN/VID of the Individual + - schema: + type: string + in: query + name: transactionId + description: The transaction ID of the payment + required: true + description: Get the card order status +components: + schemas: {} diff --git a/api-docs/Profile-Icon(Pragya).yaml b/api-docs/Profile-Icon(Pragya).yaml new file mode 100644 index 00000000000..b391ef020be --- /dev/null +++ b/api-docs/Profile-Icon(Pragya).yaml @@ -0,0 +1,220 @@ +openapi: 3.1.0 +x-stoplight: + id: 75xp7efiem7gn +info: + title: Profile-Icon + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /profile: + get: + summary: 'Get User Profile full name, photo, last Login date & time' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + fullName: + type: string + lastLogin: + type: string + photo: + type: object + properties: + mime: + type: string + data: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.resident.profile + version: v1 + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: base64 encoded image bytes + errors: null + examples: + Success: + value: + id: mosip.resident.profile + version: v1 + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: base64 encoded image bytes + errors: null + operationId: get-user-details + parameters: + - schema: + type: string + in: cookie + name: 'Authorization: Access token' + description: 'This API is to get the full name, photo, last Login date & time of the resident who has logged in' + parameters: [] + '/login​/{redirectURI}': + parameters: + - schema: + type: string + name: redirectURI + in: path + required: true + get: + summary: '/login​/{redirectURI}' + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-login-redirectURI + parameters: + - schema: + type: string + in: cookie + name: state + - schema: + type: string + in: query + name: state + description: 'Validation happens in IDP (Identity Provider) and not in the resident portal. Using this API, the resident portal will redirect to the IDP URL where the validation is performed and login happens. After the login is successful, the resident will be redirected to the resident portal’s logged-in page.' + '/login-redirect​/{redirectURI}': + parameters: + - schema: + type: string + name: redirectURI + in: path + required: true + get: + summary: Login Redirect + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + application/json: + schema: + type: object + properties: {} + operationId: get-login-redirect-redirectURI + parameters: + - schema: + type: string + in: cookie + name: state + - schema: + type: string + in: query + name: session_state + - schema: + type: string + in: query + name: code + description: 'This API is used to consume the authorization code to get back the token response containing the Access token, ID token, and the seesion_state. The session_state will be validated once we have the token response. Additionally, the signature and expiry of the access token and ID token will also be validated by getting the certificates. Once the token is verified, it will redirect to the page with the cookie with the access token and ID token.' + /​logout​/user: + get: + summary: /​logout​/user + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-logout-user + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + - schema: + type: string + in: query + name: redirecturi + required: true + parameters: [] + '': + get: + summary: Your GET endpoint + tags: [] + responses: {} + operationId: get-Validate-Token-and-extends-session + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-for-Audit-Log-to-be-invoked-by-UI.yaml b/api-docs/Proxy-API-for-Audit-Log-to-be-invoked-by-UI.yaml new file mode 100644 index 00000000000..0c179c14e17 --- /dev/null +++ b/api-docs/Proxy-API-for-Audit-Log-to-be-invoked-by-UI.yaml @@ -0,0 +1,278 @@ +openapi: 3.1.0 +x-stoplight: + id: f8i3uksn754oc +info: + title: Proxy API for Audit Log to be invoked by UI + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /auth-proxy/audit/log: + get: + summary: /auth-proxy/audit/log + tags: [] + responses: + '200': + description: OK + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + operationId: get-auth-proxy-audit-log + parameters: + - schema: + type: string + in: cookie + name: Authorization token + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + auditEventId: + type: string + auditEventName: + type: string + auditEventType: + type: string + actionTimeStamp: + type: string + hostName: + type: string + hostIp: + type: string + applicationId: + type: string + applicationName: + type: string + sessionUserId: + type: string + sessionUserName: + type: string + id: + type: string + idType: + type: string + createdBy: + type: string + moduleName: + type: string + moduleId: + type: string + description: + type: string + x-examples: + example-1: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: '2022-06-09T06:53:09.389Z' + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: Residence service + moduleId: RES-SER + description: string + examples: + example-1: + value: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: string + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: string + moduleId: string + description: string + example-2: + value: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: '2022-06-09T06:53:09.389Z' + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: Residence service + moduleId: RES-SER + description: string + description: This API is for the resident UI to log audits against any action performed by the resident. + /proxy/audit/log: + get: + summary: /proxy/audit/log + tags: [] + responses: + '200': + description: OK + operationId: get-auth-proxy-audit-log + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + auditEventId: + type: string + auditEventName: + type: string + auditEventType: + type: string + actionTimeStamp: + type: string + hostName: + type: string + hostIp: + type: string + applicationId: + type: string + applicationName: + type: string + sessionUserId: + type: string + sessionUserName: + type: string + id: + type: string + idType: + type: string + createdBy: + type: string + moduleName: + type: string + moduleId: + type: string + description: + type: string + x-examples: + example-1: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: '2022-06-09T06:53:09.389Z' + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: Residence service + moduleId: RES-SER + description: string + examples: + example-1: + value: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: string + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: string + moduleId: string + description: string + example-2: + value: + auditEventId: string + auditEventName: string + auditEventType: string + actionTimeStamp: '2022-06-09T06:53:09.389Z' + hostName: string + hostIp: string + applicationId: string + applicationName: string + sessionUserId: string + sessionUserName: string + id: string + idType: string + createdBy: string + moduleName: Residence service + moduleId: RES-SER + description: string + description: This API is for the resident UI to log audits against any action performed by the resident. + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-for-ID-Repos-API-to-retrieve-remaining-update-counts-for-each-ID-attributes-for-a-UINVID.yaml b/api-docs/Proxy-API-for-ID-Repos-API-to-retrieve-remaining-update-counts-for-each-ID-attributes-for-a-UINVID.yaml new file mode 100644 index 00000000000..20e6fda118e --- /dev/null +++ b/api-docs/Proxy-API-for-ID-Repos-API-to-retrieve-remaining-update-counts-for-each-ID-attributes-for-a-UINVID.yaml @@ -0,0 +1,130 @@ +openapi: 3.1.0 +x-stoplight: + id: 7yzzwdaf3s49f +info: + title: VID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /auth-proxy/update-count: + get: + summary: /auth-proxy/update-count + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: array + items: + type: object + properties: + attributeName: + type: string + updateCountLeft: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: null + version: null + responsetime: '2022-09-23T10:41:46.450Z' + metadata: null + response: + - attributeName: fullName + updateCountLeft: '1' + errors: [] + examples: + example-1: + value: + id: null + version: null + responsetime: string + metadata: null + response: + - attributeName: string + updateCountLeft: string + errors: + - {} + Success: + value: + id: null + version: null + responsetime: '2022-09-23T10:41:46.450Z' + metadata: null + response: + - attributeName: fullName + updateCountLeft: '1' + errors: [] + operationId: get-auth-proxy-update-count + parameters: + - schema: + type: string + in: query + name: filter_attribute_list + description: 'Comma separated list of id-attributes list, for example: fullName,email' + - schema: + type: string + in: cookie + name: Needs ID-TOKEN and access token in the Cookie + description: Access token should have “update-demographics-read” scope. + description: This is a proxy API for ID Repo's API to retrieve remaining update counts for each ID attributes for a given UIN/VID +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-for-getting-list-of-partners.yaml b/api-docs/Proxy-API-for-getting-list-of-partners.yaml new file mode 100644 index 00000000000..1f70860edad --- /dev/null +++ b/api-docs/Proxy-API-for-getting-list-of-partners.yaml @@ -0,0 +1,170 @@ +openapi: 3.1.0 +x-stoplight: + id: 06z24tsbkt8fr +info: + title: Proxy API for getting list of partners + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /auth-proxy​/partners: + get: + summary: /auth-proxy​/partners + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + partners: + type: array + items: + type: object + properties: + partnerID: + type: string + status: + type: string + organizationName: + type: string + contactNumber: + type: string + emailId: + type: string + address: + type: string + partnerType: + type: string + errors: + type: 'null' + x-examples: + example-1: + id: mosip.partnermanagement.partners.retrieve + version: '1.0' + responsetime: '2022-06-14T07:11:48.575Z' + metadata: null + response: + partners: + - partnerID: mpartner-default-resident + status: active + organizationName: IITB + contactNumber: '9232121212' + emailId: resident@mosip.io + address: mpartner-default-resident + partnerType: Credential_Partner + - partnerID: mpartner-default-print + status: active + organizationName: IIITB + contactNumber: '9232121212' + emailId: print@mosip.io + address: mpartner-default-print + partnerType: Credential_Partner + errors: null + examples: + Success: + value: + id: mosip.partnermanagement.partners.retrieve + version: '1.0' + responsetime: '2022-06-14T07:11:48.575Z' + metadata: null + response: + partners: + - partnerID: mpartner-default-resident + status: active + organizationName: IITB + contactNumber: '9232121212' + emailId: resident@mosip.io + address: mpartner-default-resident + partnerType: Credential_Partner + - partnerID: mpartner-default-print + status: active + organizationName: IIITB + contactNumber: '9232121212' + emailId: print@mosip.io + address: mpartner-default-print + partnerType: Credential_Partner + errors: null + operationId: get-proxy-partners + requestBody: + content: + application/json: + schema: + type: object + properties: {} + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + - schema: + type: string + in: query + name: partnerType + description: 'Partner Type such as Auth_Partner/Print_Partner ' + required: true + description: This API is to get the list of partners from PMS + parameters: [] +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-for-the-IDA-Internal-OTP-Authentication.yaml b/api-docs/Proxy-API-for-the-IDA-Internal-OTP-Authentication.yaml new file mode 100644 index 00000000000..7b93abfcc2e --- /dev/null +++ b/api-docs/Proxy-API-for-the-IDA-Internal-OTP-Authentication.yaml @@ -0,0 +1,140 @@ +openapi: 3.1.0 +x-stoplight: + id: 0wqzjqqbvp8xb +info: + title: Proxy API for the IDA Internal OTP Authentication + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /resident/v1/validate-otp: + get: + summary: /resident/v1/validate-otp + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + responsetime: + type: string + metadata: + type: object + properties: {} + response: + type: object + properties: + authStatus: + type: boolean + transactionId: + type: string + x-examples: + example-1: + id: mosip.identity.otp.internal + version: '1.0' + responsetime: '2022-06-09T06:43:40.428Z' + metadata: {} + response: + authStatus: true + transactionId: '1234567890' + examples: + Success: + value: + id: mosip.identity.otp.internal + version: '1.0' + responsetime: '2022-06-09T06:43:40.428Z' + metadata: {} + response: + authStatus: true + transactionId: '1234567890' + operationId: get-resident-v1-validate-otp + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionId: + type: string + individualId: + type: string + otp: + type: string + x-examples: + example-1: + id: mosip.identity.auth.internal + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '8251649601' + otp: '111111' + examples: + example-1: + value: + id: mosip.identity.auth.internal + version: '1.0' + requesttime: '2022-04-28T14:14:34.300Z' + request: + transactionId: '1234567890' + individualId: '8251649601' + otp: '111111' + description: This API is a proxy API for the IDA Internal OTP Authentication. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-to-get-the-VID-Policy-JSON.yaml b/api-docs/Proxy-API-to-get-the-VID-Policy-JSON.yaml new file mode 100644 index 00000000000..ddb9423ef7d --- /dev/null +++ b/api-docs/Proxy-API-to-get-the-VID-Policy-JSON.yaml @@ -0,0 +1,156 @@ +openapi: 3.1.0 +x-stoplight: + id: 8qsxmftxeedmp +info: + title: Proxy API to get the VID Policy JSON + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /vid​/policy: + get: + summary: vid​/policy + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: 'null' + response: + type: string + errors: + type: array + items: + type: object + properties: {} + x-examples: + example-1: + id: null + version: null + responsetime: null + response: '{"vidPolicies":[{"vidType":"Perpetual","vidPolicy":{"validForInMinutes":null,"transactionsAllowed":null,"instancesAllowed":1,"autoRestoreAllowed":true,"restoreOnAction":"REVOKED"}},{"vidType":"Temporary","vidPolicy":{"validForInMinutes":30,"transactionsAllowed":1,"instancesAllowed":5,"autoRestoreAllowed":false,"restoreOnAction":"REGENERATE"}},{"vidType":"OneTimeUse","vidPolicy":{"validForInMinutes":null,"transactionsAllowed":1,"instancesAllowed":1,"autoRestoreAllowed":true,"restoreOnAction":"REVOKED"}}]}' + errors: [] + examples: + Success: + value: + id: mosip.resident.vid.policy + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: '{"vidPolicies":[{"vidType":"Perpetual","vidPolicy":{"validForInMinutes":null,"transactionsAllowed":null,"instancesAllowed":1,"autoRestoreAllowed":true,"restoreOnAction":"REVOKED"}},{"vidType":"Temporary","vidPolicy":{"validForInMinutes":30,"transactionsAllowed":1,"instancesAllowed":5,"autoRestoreAllowed":false,"restoreOnAction":"REGENERATE"}},{"vidType":"OneTimeUse","vidPolicy":{"validForInMinutes":null,"transactionsAllowed":1,"instancesAllowed":1,"autoRestoreAllowed":true,"restoreOnAction":"REVOKED"}}]}' + errors: [] + Unable to access policy: + value: + id: mosip.resident.vid.policy + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + '401': + description: Unauthorized + operationId: get-vid-policy + requestBody: + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionID: + type: string + vidType: + type: string + individualId: + type: string + otp: + type: string + x-examples: + example-1: + - id: string + version: string + requesttime: string + request: + transactionID: string + vidType: string + individualId: string + otp: string + examples: {} + description: | + This API is to get the VID policy JSON stored in the mosip-config. + For example, + https://github.com/mosip/mosip-config/blob/master/mosip-vid-policy.json + parameters: + - schema: + type: string + in: cookie + description: Authorization token is used to validate the permissions carried by the user. + name: Authorization + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-API-to-get-the-VIDs-for-a-UINVID.yaml b/api-docs/Proxy-API-to-get-the-VIDs-for-a-UINVID.yaml new file mode 100644 index 00000000000..35bafbf0a48 --- /dev/null +++ b/api-docs/Proxy-API-to-get-the-VIDs-for-a-UINVID.yaml @@ -0,0 +1,213 @@ +openapi: 3.1.0 +x-stoplight: + id: bhlvp26l7nrd9 +info: + title: VID + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /vids: + get: + summary: /vids + tags: [] + responses: + '200': + description: Get VIDs + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: null + version: null + responsetime: null + response: + - vid: '4251852193' + maskedVid: 4XXXXX193 + vidType: ONETIMEUSE + expiryTimestamp: '9999-12-31T23:59:59.1' + transactionLimit: 1 + transactionsLeftCount: 1 + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + - vid: '5251852193' + maskedVid: 5XXXXX193 + vidType: TEMPORARY + expiryTimestamp: '2023-07-22T15:27:10.605Z' + transactionLimit: 1 + transactionsLeftCount: 1 + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + - vid: '3257206750' + maskedVid: 3XXXXX750 + vidType: PERPETUAL + expiryTimestamp: '9999-12-31T23:59:59.1' + transactionLimit: null + transactionsLeftCount: null + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + errors: [] + properties: + id: + type: + - string + - 'null' + version: + type: + - string + - 'null' + responsetime: + type: + - string + - 'null' + response: + type: + - array + - 'null' + items: + type: object + properties: + vid: + type: string + maskedVid: + type: string + vidType: + type: string + expiryTimestamp: + type: string + transactionLimit: + type: + - integer + - 'null' + transactionsLeftCount: + type: + - integer + - 'null' + generatedOnTimestamp: + type: string + errors: + type: + - array + - 'null' + items: {} + examples: + Success: + value: + id: mosip.resident.vid.get + version: '1.0' + responsetime: '2022-11-09T12:34:33.131Z' + response: + - vid: '4251852193' + maskedVid: 4XXXXX193 + vidType: ONETIMEUSE + expiryTimestamp: '9999-12-31T23:59:59.1' + transactionLimit: 1 + transactionsLeftCount: 1 + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + - vid: '5251852193' + maskedVid: 5XXXXX193 + vidType: TEMPORARY + expiryTimestamp: '2023-07-22T15:27:10.605Z' + transactionLimit: 1 + transactionsLeftCount: 1 + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + - vid: '3257206750' + maskedVid: 3XXXXX750 + vidType: PERPETUAL + expiryTimestamp: '9999-12-31T23:59:59.1' + transactionLimit: null + transactionsLeftCount: null + generatedOnTimestamp: '2022-07-22T15:27:10.605Z' + errors: [] + Unable to access: + value: + id: mosip.resident.vid.get + version: '1.0' + responsetime: '2022-11-08T06:49:13.830Z' + response: null + errors: + - errorCode: RES-SER-412 + message: Unable to access API resource + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + 'Error: Authentication Failure': + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-vids + parameters: + - schema: + type: string + in: cookie + name: Authorization token + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + - schema: + type: string + in: header + name: locale + description: Locale based on Language and country. Used in date time formatting. Ex. en-US + - schema: + type: string + in: header + name: time-zone-offset + description: Used in time conversion per the client on any timestamps returned in the response. Ex. -330 - for India + description: This is an authenticated API that will retrieve the list of active VIDs of the UIN/VID of the logged in session. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Proxy-IDA-Auth.yaml b/api-docs/Proxy-IDA-Auth.yaml new file mode 100644 index 00000000000..d6dadf9121f --- /dev/null +++ b/api-docs/Proxy-IDA-Auth.yaml @@ -0,0 +1,198 @@ +openapi: 3.1.0 +info: + title: Proxy IDA Auth + version: '1.0' + summary: Proxy API for IDA Authentication + description: Proxy API for IDA Authentication +servers: + - url: 'http://localhost:8099' + - url: 'https://dev.mosip.net' + description: '' +paths: + /validate-otp: + post: + summary: Validate OTP for given UIN/VID using IDA to verify phone/email + operationId: post-user + responses: + '200': + description: OTP Authentication status success/failure + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + transactionID: '1234567890' + version: '1.0' + id: mosip.identity.auth + errors: + - errorCode: IDA-MLC-007 + errorMessage: Request could not be processed. Please try again + - errorCode: IDA-MLC-009 + errorMessage: Invalid Input Parameter - id + responseTime: '2022-04-08T13:04:33.118Z' + response: + authStatus: false + authToken: null + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + responsetime: + type: string + minLength: 1 + response: + type: object + required: + - authStatus + properties: + authStatus: + type: boolean + transactionID: + type: string + errors: + type: array + uniqueItems: true + minItems: 1 + items: + $ref: 'https://stoplight.io/api/v1/projects/mosip/commons/nodes/models/Error.yaml?deref=bundle' + required: + - id + - version + - responsetime + - response + - errors + examples: + Success Response: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: true + transactionID: '1234567890' + errors: null + OTP Expired: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: false + transactionID: '1234567890' + errors: + - errorCode: RES-OTP-006 + message: OTP has expired + OTP is invalid: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: false + transactionID: '1234567890' + errors: + - errorCode: RES-OTP-006 + message: OTP is invalid + OTP not found for the transaction ID and Individual ID: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: false + transactionID: '1234567890' + errors: + - errorCode: RES-OTP-008 + message: Input transactionID does not match transactionID of OTP Request + SMS OTP Authentication is Locked: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: false + transactionID: '1234567890' + errors: + - errorCode: RES-OTP-010 + message: Your SMS OTP authentication is locked. + Email OTP Authentication is Locked: + value: + id: mosip.resident.identity.auth + version: '1.0' + responsetime: '2022-04-07T14:40:42.043Z' + response: + authStatus: false + transactionID: '1234567890' + errors: + - errorCode: RES-OTP-011 + message: Your email OTP authentication is locked. + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + id: + type: string + minLength: 1 + version: + type: string + minLength: 1 + requesttime: + type: string + minLength: 1 + request: + type: object + properties: + transactionID: + type: string + minLength: 1 + individualId: + type: string + minLength: 1 + otp: + type: string + minLength: 1 + required: + - transactionID + - individualId + - otp + required: + - id + - version + - requesttime + - request + x-examples: + example-1: + id: mosip.resident.otp.auth + version: v1 + requesttime: '2022-04-07T06:40:47.664Z' + request: + transactionID: '1234567890' + individualId: '2352703162' + otp: '111111' + examples: + example-1: + value: + id: mosip.resident.identity.auth + version: '1.0' + requesttime: '2022-04-07T14:40:42.043Z' + request: + individualId: '538504179525' + transactionID: '1234567890' + otp: '528953' + description: '' + description: ' Validate OTP for given UIN/VID using IDA to verify phone or email. This will need a OTP that is requested prior to this API call with same UIN/VID and transaction ID (for either phone or email but not for both). This will make the particular channel channel as verified.' + parameters: [] +components: + schemas: {} + securitySchemes: + resident_id: + type: openIdConnect + openIdConnectUrl: /residentidp/oidc/ diff --git a/api-docs/Regproc callback API.yaml b/api-docs/Regproc callback API.yaml new file mode 100644 index 00000000000..b5cd4807938 --- /dev/null +++ b/api-docs/Regproc callback API.yaml @@ -0,0 +1,45 @@ +openapi: 3.0.0 +x-stoplight: + id: bb7qdoshx4zlt +info: + title: Registration Process Workflow Callback API + version: 1.0.0 +paths: + /callback/regprocworkflow: + post: + summary: Callback for registration process workflow completion + description: Endpoint to receive callbacks when registration process workflow is completed. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowCompletedEventDTO' + responses: + '204': + description: No content + x-stoplight: + id: w6znqxvb4wpwl +components: + schemas: + WorkflowCompletedEventDTO: + type: object + properties: + instanceId: + type: string + description: The ID of the workflow instance + resultCode: + type: string + description: Result code indicating the outcome of the workflow + workflowType: + type: string + description: Type of the workflow + errorCode: + type: string + description: Error code if there was an error during the workflow + required: + - instanceId + - resultCode + - workflowType + x-stoplight: + id: u407eiyc9qhfl diff --git a/api-docs/Resident Service Get service History and Get profile.yaml b/api-docs/Resident Service Get service History and Get profile.yaml new file mode 100644 index 00000000000..7a8dbf4d2b3 --- /dev/null +++ b/api-docs/Resident Service Get service History and Get profile.yaml @@ -0,0 +1,498 @@ +openapi: 3.1.0 +x-stoplight: + id: f870m982qb95o +info: + title: Resident-Service + version: '1.0' +servers: + - url: 'http://localhost:3000' + description: Get service history +paths: + '/service-history/{lang-code}': + parameters: + - schema: + type: string + name: lang-code + in: path + required: true + get: + summary: Get Service History of the resident + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: 93dc9670-c0ab-407b-a6a8-71ffef6f5402 + description: 'Download Card with: Name, Addres, DOB' + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DOWNLOAD_PERSONALIZED_CARD + - eventId: 93dc9670-c0ab-407b-a6a8-71ffef6f5403 + description: 'Order Physical Card: Name, Addres, DOB' + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ORDER_PHYSICAL_CARD + - eventId: 93dc9670-c0ab-407b-a6a8-71ffef6f5405 + description: 'Updated demographics: Name, Addres, DOB' + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: UPDATE_MY_UIN + - eventId: 93dc9670-c0ab-407b-a6a8-71ffef6f5408 + description: PDF CARD IS READY + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: GET_MY_UIN + responseTime: '2022-07-25T16:00:30.476751751' + properties: + id: + type: string + version: + type: string + errors: + type: + - array + - 'null' + response: + type: + - object + - 'null' + properties: + pageNo: + type: integer + pageSize: + type: integer + totalItems: + type: integer + totalPages: + type: integer + data: + type: array + items: + type: object + properties: + eventId: + type: string + description: + type: string + eventStatus: + type: string + timeStamp: + type: string + requestType: + type: string + responseTime: + type: string + examples: + all service types: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: AUTHENTICATION_REQUEST + eventStatus: Failed + timeStamp: '2022-07-22T20:57:26.037669' + requestType: AUTHENTICATION_REQUEST + - eventId: string + description: AUTHENTICATION_REQUEST + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: AUTHENTICATION_REQUEST + - eventId: string + description: BOOK_AN_APPOINTMENT + eventStatus: Failed + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: GET_MY_ID + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: UPDATE_MY_UIN + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_UPDATE_REQUEST + - eventId: string + description: UPDATE_MY_UIN + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_UPDATE_REQUEST + - eventId: string + description: ' SHARE_CRED_WITH_PARTNER' + eventStatus: Failed + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_SHARE_REQUEST + - eventId: string + description: ORDER_PHYSICAL_CARD + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: DOWNLOAD_PERSONALIZED_CARD + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + AUTHENTICATION_REQUEST: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: Biometric Finger Authentication + eventStatus: Failed + timeStamp: '2022-07-22T20:57:26.037669' + requestType: AUTHENTICATION_REQUEST + - eventId: string + description: Demographic Authentication + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: AUTHENTICATION_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + ID_MANAGEMENT_REQUEST: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: GENERATE_VID + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ID_MANAGEMENT_REQUEST + - eventId: string + description: ' REVOKE_VID' + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ID_MANAGEMENT_REQUEST + - eventId: string + description: VERIFY_PHONE_EMAIL + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ID_MANAGEMENT_REQUEST + - eventId: string + description: AUTH_TYPE_LOCK_UNLOCK + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ID_MANAGEMENT_REQUEST + - eventId: string + description: VID Revoked + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: ID_MANAGEMENT_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + SERVICE_REQUEST: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: ' DOWNLOAD_PERSONALIZED_CARD' + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: ORDER_PHYSICAL_CARD + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: BOOK_AN_APPOINTMENT + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + - eventId: string + description: GET_MY_ID + eventStatus: Success + timeStamp: '2022-07-22T20:57:26.037669' + requestType: SERVICE_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + DATA_SHARE_REQUEST: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: SHARE_CRED_WITH_PARTNER + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_SHARE_REQUEST + - eventId: string + description: SHARE_CRED_WITH_PARTNER + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_SHARE_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + DATA_UPDATE_REQUEST: + value: + id: mosip.service.history.get + version: '1.0' + errors: null + response: + pageNo: 0 + pageSize: 10 + totalItems: 55 + totalPages: 6 + data: + - eventId: string + description: UPDATE_MY_UIN + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_UPDATE_REQUEST + - eventId: string + description: UPDATE_MY_UIN + eventStatus: In-Progress + timeStamp: '2022-07-22T20:57:26.037669' + requestType: DATA_UPDATE_REQUEST + responseTime: '2022-07-25T16:00:30.476751751' + 'Error: Invalid fromDate attribute': + value: + id: mosip.service.history.get + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter - fromDate + 'Error: Invalid lang-code attribute': + value: + id: mosip.service.history.get + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-410 + message: Invalid Input Parameter - lang code + 'Error: Invalid page start value': + value: + id: mosip.resident.vid.get + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-446 + message: Invalid page start value + 'Error: Invalid page fetch value': + value: + id: mosip.resident.vid.get + version: '1.0' + responsetime: '2022-07-22T15:27:10.605Z' + response: null + errors: + - errorCode: RES-SER-447 + message: Invalid page fetch value + headers: {} + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + 'Error: Authentication Failure': + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-service-history + description: |- + This API is to get the service history of one or more service types. These entries can be queried for a certain period (start date and end date), and can be paginated. This is an authenticated API. This will return all the different categories of requests. + + The five service types are: + AUTHENTICATION_REQUEST + SERVICE_REQUEST + DATA_UPDATE_REQUEST + ID_MANAGEMENT_REQUEST + DATA_SHARE_REQUEST + parameters: + - schema: + type: string + in: query + name: serviceType + description: 'The service type in general. It can map to different request types. Possible values: AUTHENTICATION_REQUEST, SERVICE_REQUEST,DATA_UPDATE_REQUEST,ID_MANAGEMENT_REQUEST,DATA_SHARE_REQUEST,ALL; default is ALL' + - schema: + type: string + in: query + name: fromDate + description: Start date of the request inclusive; the default date will be the 1st of January of that year + - schema: + type: string + in: query + name: toDate + description: End date of the request inclusive; the default date will be the date on which this transaction is being done (today’s date) + - schema: + type: string + maxLength: 30 + minLength: 0 + in: query + name: searchText + description: This will be used to look for Event Id- string greater than 0 but not more than 30 + - schema: + type: string + in: query + name: sortType + description: 'ASC/DESC, default is ASC' + - schema: + type: string + in: query + name: pageStart + description: 'integer starting from 0, default is 0' + - schema: + type: string + in: query + name: pageFetch + description: 'integer greater than 0, default is 10' + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + - schema: + type: string + in: query + name: statusFilter + description: 'Comma separated service types status code- optional. This can be one of - ALL,SUCCESS,IN_PROGRESS,FAILED' + - schema: + type: string + in: header + description: Locale based on Language and country. Used in date time formatting. Ex. en-US + name: locale + - schema: + type: string + in: header + name: time-zone-offset + description: Used in time conversion per the client on any timestamps returned in the response. Ex. -330 - for India + /profile: + get: + summary: Get Profile for the user from session + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + id: mosip.resident.profile + version: v1 + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + image: + mime: image/jpeg + data: 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 + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: object + properties: + fullName: + type: string + lastLogin: + type: string + photo: + type: object + properties: + mime: + type: string + data: + type: string + '': + type: string + errors: + type: 'null' + examples: + example-1: + value: + id: mosip.resident.profile + version: v1 + responsetime: '2022-08-05T06:49:19.570Z' + metadata: null + response: + fullName: My Full Name + lastLogin: '2022-08-05T06:49:19.570Z' + photo: + mime: image/jpeg + data: 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 + errors: null + operationId: get-profile + description: Get user profile from session + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: access token obtiained by openid-connect login + - schema: + type: string + in: cookie + name: id_token + description: id token obtiained by openid-connect login + x-internal: false diff --git a/api-docs/Resident get pending drafts and discard draft.yaml b/api-docs/Resident get pending drafts and discard draft.yaml new file mode 100644 index 00000000000..0f192690fed --- /dev/null +++ b/api-docs/Resident get pending drafts and discard draft.yaml @@ -0,0 +1,132 @@ +openapi: 3.0.0 +x-stoplight: + id: pjvkjw2mlvglv +info: + title: Discard Pending Draft API + version: 1.0.0 +paths: + '/identity/discardPendingDraft/{eid}': + post: + summary: Discard a pending draft + description: Discard a pending draft associated with the specified enrollment ID (EID). + parameters: + - in: path + name: eid + required: true + schema: + type: string + description: Enrollment ID of the pending draft to discard + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + id: + type: string + example: mosip.resident.discard.pending.drafts + description: Identifier of the response + version: + type: string + example: '1' + description: Version of the response + responsetime: + type: string + format: date-time + example: '2024-03-18T06:49:24.128Z' + description: Response timestamp + metadata: + description: Metadata information (currently null) + response: + type: string + example: DISCARDED + description: Response indicating the draft has been discarded + errors: + type: array + items: + type: string + example: [] + description: Error information (empty array indicates no errors) + x-stoplight: + id: ndgz15ymcnzbz + '/identity/get-pending-drafts/{langCode}': + get: + summary: Get pending drafts for residents + description: Retrieve pending drafts for residents in the specified language. + parameters: + - in: path + name: langCode + required: true + schema: + type: string + description: Language code for response localization + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + id: + type: string + example: mosip.resident.get.pending.drafts + description: Identifier of the response + version: + type: string + example: '1' + description: Version of the response + responsetime: + type: string + format: date-time + example: '2024-03-27T04:28:31.583Z' + description: Response timestamp + metadata: + description: Metadata information (currently null) + response: + type: object + properties: + drafts: + type: array + items: + type: object + properties: + eid: + type: string + example: '1373606406711464' + description: Enrollment ID + aid: + type: string + example: '10007100200012320240319063055' + description: Application ID + createdDTimes: + type: string + format: date-time + example: '2024-03-27T04:23:52.949342' + description: Creation timestamp of the draft + attributes: + type: array + items: + type: string + example: + - fullName + - dateOfBirth + description: Attributes included in the draft + cancellable: + type: boolean + example: true + description: Indicates whether the draft is cancellable + description: + type: string + example: An attempt was made to update data + description: Description of the draft + errors: + type: array + items: + type: string + example: [] + description: Error information (empty array indicates no errors) + x-stoplight: + id: f9lauga5jwpf2 diff --git a/api-docs/Rid-Get-UIN.yaml b/api-docs/Rid-Get-UIN.yaml new file mode 100644 index 00000000000..3b3e8862a32 --- /dev/null +++ b/api-docs/Rid-Get-UIN.yaml @@ -0,0 +1,189 @@ +openapi: 3.1.0 +x-stoplight: + id: dpzhioqvfbob5 +info: + title: Rid-Get-UIN + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/users/{userId}': + parameters: + - schema: + type: integer + name: userId + in: path + required: true + description: Id of an existing user. + get: + summary: Get User Info by User ID + tags: [] + responses: + '200': + description: User Found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + Get User Alice Smith: + value: + id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + '404': + description: User Not Found + operationId: get-users-userId + description: Retrieve the information of the user with the matching user ID. + patch: + summary: Update User Information + operationId: patch-users-userId + responses: + '200': + description: User Updated + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + Updated User Rebecca Baker: + value: + id: 13 + firstName: Rebecca + lastName: Baker + email: rebecca@gmail.com + dateOfBirth: '1985-10-02' + emailVerified: false + createDate: '2019-08-24' + '404': + description: User Not Found + '409': + description: Email Already Taken + description: Update the information of an existing user. + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + description: 'If a new email is given, the user''s email verified property will be set to false.' + dateOfBirth: + type: string + examples: + Update First Name: + value: + firstName: Rebecca + Update Email: + value: + email: rebecca@gmail.com + Update Last Name & Date of Birth: + value: + lastName: Baker + dateOfBirth: '1985-10-02' + description: Patch user properties to update. + /user: + post: + summary: Create New User + operationId: post-user + responses: + '200': + description: User Created + content: + application/json: + schema: + $ref: '#/components/schemas/User' + examples: + New User Bob Fellow: + value: + id: 12 + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + emailVerified: false + createDate: '2020-11-18' + '400': + description: Missing Required Information + '409': + description: Email Already Taken + requestBody: + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + email: + type: string + dateOfBirth: + type: string + format: date + required: + - firstName + - lastName + - email + - dateOfBirth + examples: + Create User Bob Fellow: + value: + firstName: Bob + lastName: Fellow + email: bob.fellow@gmail.com + dateOfBirth: '1996-08-24' + description: Post the necessary fields for the API to create a new user. + description: Create a new user. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/UIN-services-login.yaml b/api-docs/UIN-services-login.yaml new file mode 100644 index 00000000000..991a65c5b59 --- /dev/null +++ b/api-docs/UIN-services-login.yaml @@ -0,0 +1,166 @@ +openapi: 3.1.0 +x-stoplight: + id: 8xlt6teu57cq1 +info: + title: UIN-services-login + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /authorize​/admin​/validateToken: + get: + summary: /authorize​/admin​/validateToken + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-authorize-admin-validateToken + parameters: + - schema: + type: string + in: cookie + name: Authorization Token + '/login​/{redirectURI}': + parameters: + - schema: + type: string + name: redirectURI + in: path + required: true + get: + summary: '/login​/{redirectURI}' + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-login-redirectURI + parameters: + - schema: + type: string + in: cookie + name: state + - schema: + type: string + in: query + name: state + '/login-redirect​/{redirectURI}': + parameters: + - schema: + type: string + name: redirectURI + in: path + required: true + get: + summary: '/login-redirect​/{redirectURI}' + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-login-redirect-redirectURI + parameters: + - schema: + type: string + in: query + name: session_state + - schema: + type: string + in: cookie + name: state + required: true + description: state cookie value to check the state in query param + - schema: + type: string + in: cookie + - schema: + type: string + in: query + name: code + required: true + description: Authorization code + - schema: + type: string + in: query + name: state + required: true + description: 'state value, this should be matching with the state cookie' + /logout​/user: + get: + summary: /logout​/user + tags: [] + responses: + '200': + description: OK + content: + text/plain: + schema: + type: object + properties: {} + operationId: get-logout-user + parameters: + - schema: + type: string + in: cookie + name: Authorization + required: true + - schema: + type: string + in: query + name: redirecturi + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/Update-UIN.yaml b/api-docs/Update-UIN.yaml new file mode 100644 index 00000000000..ad9b84bf597 --- /dev/null +++ b/api-docs/Update-UIN.yaml @@ -0,0 +1,216 @@ +openapi: 3.1.0 +info: + title: Update UIN + version: '1.0' +servers: + - url: 'http://localhost:3000' + - url: 'https://dev.mosip.net' + description: '' +paths: + /update-uin: + parameters: [] + patch: + summary: Update UIN + operationId: patch-update-uin + responses: + '200': + description: OK + headers: + eventId: + schema: + type: string + description: The Event ID generated for this request + content: + application/json: + schema: + type: object + x-examples: + Example 1: + id: mosip.resident.updateuin + version: '1.0' + responsetime: '2022-06-14T13:12:18.666Z' + metadata: {} + response: + message: string + errors: null + properties: + id: + type: string + version: + type: string + responsetime: + type: string + response: + type: + - object + - 'null' + properties: + message: + type: string + status: + type: string + x-stoplight: + id: ifhg1ifwkxpvg + errors: + type: + - array + - 'null' + items: {} + examples: + Success: + value: + id: mosip.resident.updateuin + version: '1.0' + responsetime: '2022-06-14T13:12:18.666Z' + metadata: {} + response: + message: Notification has been sent to the provided contact detail(s) + status: Success + errors: null + 'Error: No document found for transactionId': + value: + id: mosip.resident.updateuin + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-461 + message: 'No document found for transactionID: 1234567890' + 'Error: Consent not accepted': + value: + id: mosip.resident.updateuin + version: '1.0' + responsetime: '2022-06-09T06:34:35.775Z' + metadata: {} + response: null + errors: + - errorCode: RES-SER-472 + message: Accepting the terms and conditions is a mandatory action to proceed further. Please accept the consent to proceed + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + Example 1: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:04.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + description: This API is to update the UIN. Resident Service gets the RID (AID) from the update response and stores the status in resident_transaction details with a summary of what got updated. + parameters: + - schema: + type: string + in: cookie + name: Authorization + description: Authorization token is used to validate the permissions carried by the user. + required: true + - schema: + type: string + in: cookie + name: id_token + description: ID token is used to verify which user has logged in. + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requesttime: + type: string + request: + type: object + properties: + transactionID: + type: string + consent: + type: string + identity: + type: object + properties: + IDSchemaVersion: + type: string + addressLine3: + type: array + items: + type: object + properties: + language: + type: string + value: + type: string + email: + type: string + x-examples: + Example 1: + id: mosip.resident.updateuin + version: '1.0' + requesttime: '2022-09-02T11:19:54.449Z' + request: + transactionID: '1234567890' + consent: Accepted + identity: + IDSchemaVersion: '0.1' + addressLine3: + - language: eng + value: Sohan + email: abc@gmail.com + examples: + Example 1: + value: + id: mosip.resident.updateuin + version: '1.0' + requesttime: '2022-09-02T11:19:54.449Z' + request: + transactionID: '1234567890' + consent: Accepted + identity: + IDSchemaVersion: '0.1' + addressLine3: + - language: eng + value: Sohan + email: abc@gmail.com +components: + schemas: {} diff --git a/api-docs/View-history.yaml b/api-docs/View-history.yaml new file mode 100644 index 00000000000..889d61751d4 --- /dev/null +++ b/api-docs/View-history.yaml @@ -0,0 +1,248 @@ +openapi: 3.1.0 +x-stoplight: + id: 01v9wgu5xwi1q +info: + title: View history + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /callback​/authTransaction: + post: + summary: /callback​/authTransaction + operationId: post-callback-authTransaction + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: string + responsetime: + type: string + metadata: + type: 'null' + response: + type: 'null' + errors: + type: array + items: + type: object + properties: + errorCode: + type: string + message: + type: string + x-examples: + example-1: + id: null + version: v1 + responsetime: '2022-06-10T12:00:43.226Z' + metadata: null + response: null + errors: + - errorCode: RES-SER-418 + message: 'KER-WSC-106 --> Error occured while verifing authenticated content :- header for signature is empty or null' + requestBody: + content: + application/json: + schema: + type: object + properties: + publisher: + type: string + topic: + type: string + publishedOn: + type: string + event: + type: object + properties: + id: + type: string + transactionId: + type: string + type: + type: object + properties: + namespace: + type: string + name: + type: string + timestamp: + type: string + dataShareUri: + type: string + data: + type: object + properties: + additionalProp1: + type: object + properties: {} + additionalProp2: + type: object + properties: {} + additionalProp3: + type: object + properties: {} + x-examples: + example-1: + publisher: string + topic: string + publishedOn: string + event: + id: string + transactionId: string + type: + namespace: string + name: string + timestamp: string + dataShareUri: string + data: + additionalProp1: {} + additionalProp2: {} + additionalProp3: {} + description: Resident Service to get the Auth Transaction event in callback for each Online Verification Partner and store it in auth_transactions table along with the Online Verification Partner ID in a new column. + /download/service-history: + get: + summary: /download/service-history + tags: [] + responses: + '200': + description: OK - PDF Bytes + content: + application/pdf: + schema: + type: object + properties: {} + examples: {} + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: null + version: null + responsetime: '2022-10-07T09:22:03.631Z' + metadata: null + response: null + errors: + - errorCode: KER-ATH-401 + message: Authentication Failed + operationId: get-download-service-history + requestBody: + content: {} + description: '' + parameters: + - schema: + type: string + in: query + name: serviceType + description: 'The service type in general. It can map to different request types. Possible values: AUTHENTICATION_REQUEST, SERVICE_REQUEST,DATA_UPDATE_REQUEST,ID_MANAGEMENT_REQUEST,DATA_SHARE_REQUEST,ALL; default is ALL' + - schema: + type: string + in: query + name: fromDate + description: Start date of the request inclusive; the default date will be the 1st of January of that year + - schema: + type: string + in: query + name: toDate + description: End date of the request inclusive; the default date will be the date on which this transaction is being done (today’s date) + - schema: + type: string + maxLength: 30 + minLength: 0 + in: query + name: searchText + description: This will be used to look for Event Id- string greater than 0 but not more than 30 + - schema: + type: string + in: query + name: sortType + description: 'ASC/DESC, default is ASC' + - schema: + type: string + in: cookie + name: Authorization + required: true + description: Authorization token is used to validate the permissions carried by the user. + - schema: + type: string + in: cookie + name: id_token + description: Id token is used to verify which user has logged in. + required: true + - schema: + type: string + in: header + name: Accept + description: It can be application/pdf or csv etc (in future scope) + - schema: + type: string + in: query + name: statusFilter + description: 'Comma separated service types status code. This can be one of - ALL,SUCCESS,IN_PROGRESS,FAILED' + - schema: + type: string + in: header + name: locale + description: Locale based on Language and country. Used in date time formatting. Ex. en-US + - schema: + type: string + in: header + name: time-zone-offset + description: Used in time conversion per the client on any timestamps returned in the response. Ex. -330 - for India + description: This API is used to download the result of service history search as a PDF. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/_auth-proxy_config_identity-mapping.yaml b/api-docs/_auth-proxy_config_identity-mapping.yaml new file mode 100644 index 00000000000..151158f3511 --- /dev/null +++ b/api-docs/_auth-proxy_config_identity-mapping.yaml @@ -0,0 +1,47 @@ +openapi: 3.0.1 +info: + title: Proxy Config API + description: API for getting the identity mapping configuration + version: 1.0.0 +paths: + /auth-proxy/config/identity-mapping: + get: + summary: getIdentityMapping + description: Get the identity-mapping + tags: + - proxy-config-controller + responses: + '200': + description: OK + content: + application/json: + schema: + type: string + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' diff --git a/api-docs/aid-stage{aid}.yaml b/api-docs/aid-stage{aid}.yaml new file mode 100644 index 00000000000..b341626e556 --- /dev/null +++ b/api-docs/aid-stage{aid}.yaml @@ -0,0 +1,36 @@ +openapi: 3.0.1 +info: + title: Download Card API + description: API for getting AID stage status + version: 1.0.0 +paths: + '/aid-stage/{aid}': + get: + summary: getStatus + description: Get AID stage status + parameters: + - name: aid + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseEntity' + tags: + - download-card-controller +components: + schemas: + ResponseEntity: + type: object + properties: + data: + type: object + message: + type: string + status: + type: string diff --git a/api-docs/aidstatus.yaml b/api-docs/aidstatus.yaml new file mode 100644 index 00000000000..78d7740392e --- /dev/null +++ b/api-docs/aidstatus.yaml @@ -0,0 +1,73 @@ +openapi: 3.0.1 +info: + title: Resident API + description: API for checking AID status + version: 1.0.0 +paths: + /aid/status: + post: + summary: checkAidStatus + description: Get AID Status + tags: + - resident-controller + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RequestWrapper' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + RequestWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/AidStatusRequestDTO' + required: + - data + AidStatusRequestDTO: null + ResponseWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/AidStatusResponseDTO' + message: + type: string + status: + type: string + AidStatusResponseDTO: null diff --git a/api-docs/auth-proxy_masterdata_locations_immediatechildren_{locationcode}_.yaml b/api-docs/auth-proxy_masterdata_locations_immediatechildren_{locationcode}_.yaml new file mode 100644 index 00000000000..042baacf40a --- /dev/null +++ b/api-docs/auth-proxy_masterdata_locations_immediatechildren_{locationcode}_.yaml @@ -0,0 +1,154 @@ +openapi: 3.1.0 +x-stoplight: + id: 3z78qxght4ht +info: + title: API to get the immediate children in hierarchy of location + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/proxy​/masterdata​/locations​/immediatechildren​/{locationcode}': + parameters: + - schema: + type: string + name: locationcode + in: path + required: true + - schema: + type: string + name: langcode + in: path + required: true + get: + summary: '/proxy​/masterdata​/locations​/immediatechildren​/{locationcode}​/{langcode}' + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: 'null' + version: + type: 'null' + responsetime: + type: string + metadata: + type: 'null' + response: + type: object + properties: + locations: + type: array + items: + type: object + properties: + code: + type: string + name: + type: string + hierarchyLevel: + type: integer + hierarchyName: + type: string + parentLocCode: + type: string + langCode: + type: string + isActive: + type: boolean + errors: + type: 'null' + x-examples: + example-1: + id: null + version: null + responsetime: '2022-06-14T07:41:42.091Z' + metadata: null + response: + locations: + - code: RSK + name: Rabat Sale Kenitra + hierarchyLevel: 1 + hierarchyName: Region + parentLocCode: MOR + langCode: eng + isActive: true + errors: null + examples: + Success: + value: + id: null + version: null + responsetime: string + metadata: null + response: + locations: + - code: string + name: string + hierarchyLevel: 0 + hierarchyName: string + parentLocCode: string + langCode: string + isActive: true + errors: null + operationId: get-proxy-masterdata-locations-immediatechildren-locationcode-langcode + description: This API is to get the immediate children for a location. + parameters: + - schema: + type: string + in: header + name: locationcode + required: true + - schema: + type: string + in: header + name: langcode + required: true + x-stoplight: + id: zh26gipx5n88w +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/auth-proxyconfigui-schema{schemaType}.yaml b/api-docs/auth-proxyconfigui-schema{schemaType}.yaml new file mode 100644 index 00000000000..14a372eb6b9 --- /dev/null +++ b/api-docs/auth-proxyconfigui-schema{schemaType}.yaml @@ -0,0 +1,53 @@ +openapi: 3.0.1 +info: + title: Proxy Config API + description: API for getting the Resident-UI Schema + version: 1.0.0 +paths: + '/auth-proxy/config/ui-schema/{schemaType}': + get: + summary: getResidentUISchema + description: Get the Resident-UI Schema + tags: + - proxy-config-controller + parameters: + - name: schemaType + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: string + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' diff --git a/api-docs/callbackauthTransaction.yaml b/api-docs/callbackauthTransaction.yaml new file mode 100644 index 00000000000..4af5f900a43 --- /dev/null +++ b/api-docs/callbackauthTransaction.yaml @@ -0,0 +1,60 @@ +openapi: 3.0.1 +info: + title: AuthTransactionCallback API + description: API for handling authentication transaction callbacks + version: 1.0.0 +paths: + /callback/authTransaction: + post: + summary: AuthTransactionCallbackController + description: AuthTransactionCallbackController + tags: + - AuthTransactionCallbackController + operationId: authTransactionCallback + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + responses: + '200': + description: OK + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + securitySchemes: + PreAuthenticateContentAndVerifyIntent: + type: apiKey + in: header + name: X-Auth-Intent-Secret + description: secret +security: + - PreAuthenticateContentAndVerifyIntent: [] diff --git a/api-docs/callbackcredentialStatusUpdate.yaml b/api-docs/callbackcredentialStatusUpdate.yaml new file mode 100644 index 00000000000..17f661336a3 --- /dev/null +++ b/api-docs/callbackcredentialStatusUpdate.yaml @@ -0,0 +1,62 @@ +openapi: 3.0.1 +info: + title: AuthTransactionCallback API + description: API for handling authentication transaction callbacks + version: 1.0.0 +paths: + callback/credentialStatusUpdate: + post: + summary: AuthTransactionCallbackController + description: AuthTransactionCallbackController + tags: + - AuthTransactionCallbackController + operationId: authTransactionCallback + requestBody: + required: true + content: + application/json: + schema: + type: object + additionalProperties: true + responses: + '200': + description: OK + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' + x-stoplight: + id: krlbq8x2b213w +components: + securitySchemes: + PreAuthenticateContentAndVerifyIntent: + type: apiKey + in: header + name: X-Auth-Intent-Secret + description: secret +security: + - PreAuthenticateContentAndVerifyIntent: [] diff --git a/api-docs/downloadnearestRegistrationcenters.yaml b/api-docs/downloadnearestRegistrationcenters.yaml new file mode 100644 index 00000000000..7c6d3ac47d6 --- /dev/null +++ b/api-docs/downloadnearestRegistrationcenters.yaml @@ -0,0 +1,64 @@ +openapi: 3.0.1 +info: + title: Download Master Data API + description: API for downloading nearest registration centers + version: 1.0.0 +paths: + /download/nearestRegistrationcenters: + get: + summary: downloadNearestRegistrationcenters + description: Download nearest registration centers + parameters: + - name: langcode + in: query + required: true + schema: + type: string + - name: longitude + in: query + required: true + schema: + type: number + format: double + - name: latitude + in: query + required: true + schema: + type: number + format: double + - name: proximitydistance + in: query + required: true + schema: + type: integer + - name: time-zone-offset + in: header + required: false + schema: + type: integer + default: 0 + - name: locale + in: header + required: false + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseEntity' + tags: + - download-master-data-controller +components: + schemas: + ResponseEntity: + type: object + properties: + data: + type: object + message: + type: string + status: + type: string diff --git a/api-docs/downloadregistration-centers-list.yaml b/api-docs/downloadregistration-centers-list.yaml new file mode 100644 index 00000000000..0201123f6f0 --- /dev/null +++ b/api-docs/downloadregistration-centers-list.yaml @@ -0,0 +1,58 @@ +openapi: 3.0.1 +info: + title: Download Master Data API + description: API for downloading registration centers by hierarchy level + version: 1.0.0 +paths: + /download/registration-centers-list: + get: + summary: downloadRegistrationCentersByHierarchyLevel + description: Download registration centers by hierarchy level + parameters: + - name: langcode + in: query + required: true + schema: + type: string + - name: hierarchylevel + in: query + required: true + schema: + type: integer + format: int16 + - name: name + in: query + required: true + schema: + type: string + - name: time-zone-offset + in: header + required: false + schema: + type: integer + default: 0 + - name: locale + in: header + required: false + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseEntity' + tags: + - download-master-data-controller +components: + schemas: + ResponseEntity: + type: object + properties: + data: + type: object + message: + type: string + status: + type: string diff --git a/api-docs/events.yaml b/api-docs/events.yaml new file mode 100644 index 00000000000..93fb28daaad --- /dev/null +++ b/api-docs/events.yaml @@ -0,0 +1,87 @@ +openapi: 3.0.1 +info: + title: Event Status API + description: API for checking the status of an event by event ID + version: 1.0.0 +paths: + '/events/{event-id}': + get: + summary: checkEventIdStatus + description: checkEventIdStatus + tags: + - resident-controller + parameters: + - name: event-id + in: path + required: true + schema: + type: string + - name: langCode + in: query + required: true + schema: + type: string + - name: time-zone-offset + in: header + required: false + schema: + type: integer + default: 0 + - name: locale + in: header + required: false + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/EventStatusResponseDTO' + message: + type: string + status: + type: string + EventStatusResponseDTO: + type: object + properties: + status: + type: string + description: + type: string diff --git a/api-docs/loginv2.yaml b/api-docs/loginv2.yaml new file mode 100644 index 00000000000..ee95bc2d01e --- /dev/null +++ b/api-docs/loginv2.yaml @@ -0,0 +1,43 @@ +openapi: 3.1.0 +x-stoplight: + id: bnbop24sa89dt +info: + title: v2 + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/login/v2/{redirectURI}': + get: + tags: + - login-controller + operationId: '/login/v2/{redirectURI}' + parameters: + - name: state + in: cookie + required: false + schema: + type: string + - name: redirectURI + in: path + required: true + schema: + type: string + - name: ui_locales + in: query + required: false + schema: + type: string + responses: + '200': + description: OK + summary: '/login/v2/{redirectURI}' + x-stoplight: + id: bc805cheiryu6 + parameters: + - schema: + type: string + name: redirectURI + in: path + required: true + description: Redirection URI diff --git a/api-docs/pinned.yaml b/api-docs/pinned.yaml new file mode 100644 index 00000000000..99aedcc9b06 --- /dev/null +++ b/api-docs/pinned.yaml @@ -0,0 +1,72 @@ +openapi: 3.0.1 +info: + title: PinStatus API + description: API for handling pinning status of an event + version: 1.0.0 +paths: + '/pinned/{eventId}': + post: + summary: PinStatusController + description: PinStatusController + tags: + - PinStatusController + parameters: + - name: eventId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/ResponseDTO' + message: + type: string + status: + type: string + ResponseDTO: + type: object + properties: + someField: + type: string + anotherField: + type: string + securitySchemes: + PreAuthorize: + type: apiKey + in: header + name: Authorization + description: Token used for authorizing the scope +security: + - PreAuthorize: [] diff --git a/api-docs/proxymasterdatadynamicfields{fieldName}.yaml b/api-docs/proxymasterdatadynamicfields{fieldName}.yaml new file mode 100644 index 00000000000..934b199bf5e --- /dev/null +++ b/api-docs/proxymasterdatadynamicfields{fieldName}.yaml @@ -0,0 +1,76 @@ +openapi: 3.0.1 +info: + title: Proxy Masterdata API + description: API for fetching dynamic fields based on language code and field name + version: 1.0.0 +paths: + '/auth-proxy/masterdata/dynamicfields/{fieldName}/{langCode}': + get: + summary: getDynamicFieldBasedOnLangCodeAndFieldName + description: Service to fetch dynamic field based on langcode and field name + tags: + - proxy-masterdata-controller + parameters: + - name: fieldName + in: path + required: true + schema: + type: string + - name: langCode + in: path + required: true + schema: + type: string + - name: withValue + in: query + required: false + schema: + type: boolean + default: false + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + type: object + additionalProperties: true + message: + type: string + status: + type: string diff --git a/api-docs/proxymasterdatagendercode{gendertype}{langcode}.yaml b/api-docs/proxymasterdatagendercode{gendertype}{langcode}.yaml new file mode 100644 index 00000000000..7d670c845dd --- /dev/null +++ b/api-docs/proxymasterdatagendercode{gendertype}{langcode}.yaml @@ -0,0 +1,70 @@ +openapi: 3.0.1 +info: + title: Proxy Masterdata API + description: API for getting gender code by gender type and language code + version: 1.0.0 +paths: + '/proxy/masterdata/gendercode/{gendertype}/{langcode}': + get: + summary: getGenderCodeByGenderTypeAndLangCode + description: getGenderCodeByGenderTypeAndLangCode + tags: + - proxy-masterdata-controller + parameters: + - name: gendertype + in: path + required: true + schema: + type: string + - name: langcode + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + type: object + additionalProperties: true + message: + type: string + status: + type: string diff --git a/api-docs/proxymasterdataidschemalatest.yaml b/api-docs/proxymasterdataidschemalatest.yaml new file mode 100644 index 00000000000..5ad281bb9f0 --- /dev/null +++ b/api-docs/proxymasterdataidschemalatest.yaml @@ -0,0 +1,80 @@ +openapi: 3.0.1 +info: + title: Proxy Masterdata API + description: API for getting the latest ID schema + version: 1.0.0 +paths: + /proxy/masterdata/idschema/latest: + get: + summary: getLatestIdSchema + description: getLatestIdSchema + tags: + - proxy-masterdata-controller + parameters: + - name: schemaVersion + in: query + required: false + schema: + type: number + format: double + default: 0 + description: schema version + - name: domain + in: query + required: false + schema: + type: string + description: domain of the ui spec + - name: type + in: query + required: false + schema: + type: string + description: type of the ui spec. Supported comma separated values + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '201': + description: Created + content: + application/json: + schema: + type: string + example: '' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + type: object + additionalProperties: true + message: + type: string + status: + type: string diff --git a/api-docs/reqauth-history.yaml b/api-docs/reqauth-history.yaml new file mode 100644 index 00000000000..a326d3f492f --- /dev/null +++ b/api-docs/reqauth-history.yaml @@ -0,0 +1,110 @@ +openapi: 3.1.0 +x-stoplight: + id: bndrv3ayzr7qr +info: + title: auth-history + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/auth-history: + post: + summary: '' + operationId: post-req-auth-history + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.authhistory + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + authHistory: + - authDetails1: null + - authDetails2: null + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.authhistory + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + description: This request will authenticate an Individual based on provided OTP and respond with auth history. Notification will be sent to phone/email. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.authhistory + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + pageStart: '1' + pageFetch: '1' +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/reqauth-lock.yaml b/api-docs/reqauth-lock.yaml new file mode 100644 index 00000000000..d3378a62144 --- /dev/null +++ b/api-docs/reqauth-lock.yaml @@ -0,0 +1,109 @@ +openapi: 3.1.0 +x-stoplight: + id: pblwqn63calqv +info: + title: auth-lock + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/auth-lock: + post: + summary: '' + operationId: post-req-auth-lock + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.authlock + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + status: success + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.authlock + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + description: This request will authenticate an Individual based on provided OTP and will lock provided authentication types. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.authlock + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + authType: + - bio-FMR + - bio-FACE +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/reqauth-unlock.yaml b/api-docs/reqauth-unlock.yaml new file mode 100644 index 00000000000..9ebadd39d46 --- /dev/null +++ b/api-docs/reqauth-unlock.yaml @@ -0,0 +1,108 @@ +openapi: 3.1.0 +x-stoplight: + id: fqcj6sql00a18 +info: + title: auth-unlock + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/auth-unlock: + post: + summary: '' + operationId: post-req-auth-unlock + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.authunlock + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + status: success + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.authunlock + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + description: This request will authenticate an Individual based on provided OTP and will unlock provided locked authentication types. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.authunlock + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + authType: + - bio-FIR +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/reqeuin.yaml b/api-docs/reqeuin.yaml new file mode 100644 index 00000000000..8f632def8e6 --- /dev/null +++ b/api-docs/reqeuin.yaml @@ -0,0 +1,107 @@ +openapi: 3.1.0 +x-stoplight: + id: wmxn0a2b00vdi +info: + title: euin + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/euin: + post: + summary: '' + operationId: post-req-euin + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.euin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + euin: + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.euin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Request: + value: + id: mosip.resident.euin + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: VID + cardType: MASKED_UIN + otp: '123456' + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + description: This request will authenticate an Individual based on provided OTP and respond with e-UIN. Notification will be sent by phone/email. +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/reqotp.yaml b/api-docs/reqotp.yaml new file mode 100644 index 00000000000..790ec475eaf --- /dev/null +++ b/api-docs/reqotp.yaml @@ -0,0 +1,78 @@ +openapi: 3.0.1 +info: + title: Resident OTP API + description: API for requesting OTP + version: 1.0.0 +paths: + /req/otp: + post: + summary: reqOtp + description: Request OTP + tags: + - resident-otp-controller + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OtpRequestDTO' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OtpResponseDTO' + '201': + description: Created + content: + application/json: + schema: + type: string + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + '403': + description: Forbidden + content: + application/json: + schema: + type: string + '404': + description: Not Found + content: + application/json: + schema: + type: string +components: + schemas: + OtpRequestDTO: + type: object + OtpResponseDTO: + type: object + properties: + id: + type: string + version: + type: string + transactionID: + type: string + responseTime: + type: string + errors: + type: array + items: + $ref: '#/components/schemas/AuthError' + response: + $ref: '#/components/schemas/MaskedResponseDTO' + metadata: + type: object + additionalProperties: + type: object + AuthError: + type: object + MaskedResponseDTO: + type: object diff --git a/api-docs/reqprint-uin.yaml b/api-docs/reqprint-uin.yaml new file mode 100644 index 00000000000..836692bfe7f --- /dev/null +++ b/api-docs/reqprint-uin.yaml @@ -0,0 +1,107 @@ +openapi: 3.1.0 +x-stoplight: + id: 1hrpv6gdybob9 +info: + title: print-uin + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/print-uin: + post: + summary: '' + operationId: post-req-print-uin + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.reprintuin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + rid: '770872690593682' + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.reprintuin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Request body: + value: + id: mosip.resident.reprintuin + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: VID + cardType: MASKED_UIN + otp: '123456' + description: This request will authenticate an Individual based on provided OTP and post a request for UIN re-print to Postal Service. Notification will be sent to phone/email. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/requpdate-uin.yaml b/api-docs/requpdate-uin.yaml new file mode 100644 index 00000000000..821a1a5b8ac --- /dev/null +++ b/api-docs/requpdate-uin.yaml @@ -0,0 +1,200 @@ +openapi: 3.1.0 +x-stoplight: + id: gsblomcfia4rf +info: + title: update-uin + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /req/update-uin: + post: + summary: '' + operationId: post-req-update-uin + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requestTime: + type: string + request: + type: object + properties: + transactionID: + type: string + individualId: + type: string + individualIdType: + type: string + otp: + type: string + identityJson: + type: string + documents: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + x-examples: + Example 1: + id: mosip.resident.updateuin + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + identityJson: + documents: + - name: + value: + - name: + value: + examples: + Success: + value: + id: mosip.resident.updateuin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + rid: '989768897876565' + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.uin + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + description: This request will authenticate an Individual based on provided OTP and respond with RID after successfully placing update request to Registration Processor. Notification will be sent to phone/email. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + version: + type: string + requestTime: + type: string + request: + type: object + properties: + transactionID: + type: string + individualId: + type: string + individualIdType: + type: string + otp: + type: string + identityJson: + type: string + documents: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + x-examples: + Example 1: + id: mosip.resident.updateuin + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + identityJson: + documents: + - name: + value: + - name: + value: + examples: + Example 1: + value: + id: mosip.resident.updateuin + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + identityJson: + documents: + - name: + value: + - name: + value: +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/ridcheck-status.yaml b/api-docs/ridcheck-status.yaml new file mode 100644 index 00000000000..c75165b0123 --- /dev/null +++ b/api-docs/ridcheck-status.yaml @@ -0,0 +1,104 @@ +openapi: 3.1.0 +x-stoplight: + id: pcdtoifc6302b +info: + title: check-status + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /rid/check-status: + post: + summary: /rid/check-status + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.checkstatus + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + ridStatus: PROCESSING + errors: null + Invalid RID: + value: + id: mosip.resident.checkstatus + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: Invalid RID + operationId: post-rid-check-status + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.checkstatus + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + individualId: '9830872690593682' + individualIdType: RID + description: This API is to check the status of RID. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/rid{individual-id}.yaml b/api-docs/rid{individual-id}.yaml new file mode 100644 index 00000000000..23bb46b1b90 --- /dev/null +++ b/api-docs/rid{individual-id}.yaml @@ -0,0 +1,69 @@ +openapi: 3.0.1 +info: + title: ID Repository API + description: API for retrieving RID by IndividualId + version: 1.0.0 +paths: + '/rid/{individualId}': + get: + summary: Get RID by IndividualId Request + description: Get RID by IndividualId Request + tags: + - id-repo-controller + parameters: + - name: individualId + in: path + required: true + schema: + type: string + - name: ID_TYPE + in: query + required: false + schema: + type: string + responses: + '200': + description: Request authenticated successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '400': + description: No Records Found + content: + application/json: + schema: + $ref: '#/components/schemas/IdRepoAppException' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/IdRepoAppException' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/IdRepoAppException' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/IdRepoAppException' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/RidDto' + message: + type: string + status: + type: string + RidDto: + type: object + IdRepoAppException: + type: object diff --git a/api-docs/unpinned.yaml b/api-docs/unpinned.yaml new file mode 100644 index 00000000000..0d47a1a5d39 --- /dev/null +++ b/api-docs/unpinned.yaml @@ -0,0 +1,72 @@ +openapi: 3.0.1 +info: + title: UnPinStatus API + description: API for handling unpinning status of an event + version: 1.0.0 +paths: + '/unpinned/{eventId}': + post: + summary: UnPinStatusController + description: UnPinStatusController + tags: + - UnPinStatusController + parameters: + - name: eventId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResponseWrapper' + '401': + description: Unauthorized + content: + application/json: + schema: + type: string + example: '' + '403': + description: Forbidden + content: + application/json: + schema: + type: string + example: '' + '404': + description: Not Found + content: + application/json: + schema: + type: string + example: '' +components: + schemas: + ResponseWrapper: + type: object + properties: + data: + $ref: '#/components/schemas/ResponseDTO' + message: + type: string + status: + type: string + ResponseDTO: + type: object + properties: + someField: + type: string + anotherField: + type: string + securitySchemes: + PreAuthorize: + type: apiKey + in: header + name: Authorization + description: Token used for authorizing the scope +security: + - PreAuthorize: [] diff --git a/api-docs/vid.yaml b/api-docs/vid.yaml new file mode 100644 index 00000000000..67f7fb87620 --- /dev/null +++ b/api-docs/vid.yaml @@ -0,0 +1,107 @@ +openapi: 3.1.0 +x-stoplight: + id: xftfk0sd2dbht +info: + title: vid + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + /vid: + post: + summary: '' + operationId: post-vid + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.vid + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + vid: '989768897876565' + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.vid + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + description: This request will authenticate an Individual based on provided OTP and will generate VID for the respective UIN. + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.vid + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: UIN + otp: '123456' + vidType: PERPETUAL +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-docs/vid{VID}.yaml b/api-docs/vid{VID}.yaml new file mode 100644 index 00000000000..6ca8b83ff8e --- /dev/null +++ b/api-docs/vid{VID}.yaml @@ -0,0 +1,112 @@ +openapi: 3.1.0 +x-stoplight: + id: 1bsfpp9erag47 +info: + title: '{VID}' + version: '1.0' +servers: + - url: 'http://localhost:3000' +paths: + '/vid/{vid}': + parameters: + - schema: + type: string + name: vid + in: path + required: true + patch: + summary: '' + operationId: patch-vid-vid + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: {} + examples: + Success: + value: + id: mosip.resident.vidstatus + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: + message: Notification has been sent to the provided contact detail(s) + errors: null + OTP Authentication Failed: + value: + id: mosip.resident.vidstatus + version: v1 + responseTime: '2018-12-09T06:39:04.683Z' + response: {} + errors: + - errorCode: XXX-XXX-002 + errorMessage: OTP Authentication Failed + parameters: + - schema: + type: string + in: cookie + name: Authentication + required: true + description: This request will authenticate an Individual based on provided OTP and will revoke respective VID. + requestBody: + content: + application/json: + schema: + type: object + properties: {} + examples: + Example 1: + value: + id: mosip.resident.vidstatus + version: v1 + requestTime: '2018-12-09T06:39:04.683Z' + request: + transactionID: dabed834-974f-11e9-bc42-526af7764f64 + individualId: '9830872690593682' + individualIdType: VID + otp: '123456' + vidStatus: REVOKED +components: + schemas: + User: + title: User + type: object + description: '' + examples: + - id: 142 + firstName: Alice + lastName: Smith + email: alice.smith@gmail.com + dateOfBirth: '1997-10-31' + emailVerified: true + signUpDate: '2019-08-24' + properties: + id: + type: integer + description: Unique identifier for the given user. + firstName: + type: string + lastName: + type: string + email: + type: string + format: email + dateOfBirth: + type: string + format: date + example: '1997-10-31' + emailVerified: + type: boolean + description: Set to true if the user's email has been verified. + createDate: + type: string + format: date + description: The date that the user was created. + required: + - id + - firstName + - lastName + - email + - emailVerified diff --git a/api-test/.gitignore b/api-test/.gitignore new file mode 100644 index 00000000000..defd0502073 --- /dev/null +++ b/api-test/.gitignore @@ -0,0 +1,40 @@ +*.class +.mtj.tmp/ +*.war +*.ear +hs_err_pid* +#ignored files + +.springBeans +.metadata +.factorypath +.classpath +.project +.settings/ +bin/ +tmp/ + +logs/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.loadpath +.DS_Store +test.txt +.idea/ +.settings/ +.sonarlint/ +.recommenders/ +/.recommenders/ + +**/*.iml +*.log +src/logs/mosip-api-test.log +/target/ +target/ +test-output/ +testng-report/ +/reg +./reg diff --git a/api-test/Biometric Devices/Face/DeviceDiscovery.json b/api-test/Biometric Devices/Face/DeviceDiscovery.json new file mode 100644 index 00000000000..b5ca41591e7 --- /dev/null +++ b/api-test/Biometric Devices/Face/DeviceDiscovery.json @@ -0,0 +1,17 @@ +{ + "deviceId":"3", + "deviceStatus":"Ready", + "certification":"L0", + "serviceVersion":"0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId":"", + "deviceCode": "b692b595-3523-face-99fc-bd76e35f190f", + "specVersion":[ + "0.9.5" + ], + "purpose":"", + "error":null +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Face/DeviceInfo.json b/api-test/Biometric Devices/Face/DeviceInfo.json new file mode 100644 index 00000000000..e8e4d59cefe --- /dev/null +++ b/api-test/Biometric Devices/Face/DeviceInfo.json @@ -0,0 +1,18 @@ +{ + "deviceStatus": "Ready", + "deviceId": "3", + "firmware": "MOSIP.FACE.1.0.0.0", + "certification": "L0", + "serviceVersion": "0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId": "", + "deviceCode": "b692b595-3523-face-99fc-bd76e35f190f", + "env": "Staging", + "purpose": "", + "specVersion": [ + "0.9.5" + ] +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Face/DigitalId.json b/api-test/Biometric Devices/Face/DigitalId.json new file mode 100644 index 00000000000..a041adf7363 --- /dev/null +++ b/api-test/Biometric Devices/Face/DigitalId.json @@ -0,0 +1,10 @@ +{ + "serialNo":"2345678901", + "make":"MOSIP", + "model":"FACE01", + "type":"Face", + "deviceSubType":"Full face", + "deviceProvider":"MOSIP", + "deviceProviderId":"MOSIP.PROXY.SBI", + "dateTime":"" +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Face/Keys/mosipface.p12 b/api-test/Biometric Devices/Face/Keys/mosipface.p12 new file mode 100644 index 00000000000..94b2589ade3 Binary files /dev/null and b/api-test/Biometric Devices/Face/Keys/mosipface.p12 differ diff --git a/api-test/Biometric Devices/Face/Keys/mosipfaceftm.p12 b/api-test/Biometric Devices/Face/Keys/mosipfaceftm.p12 new file mode 100644 index 00000000000..3a5cd3d00c8 Binary files /dev/null and b/api-test/Biometric Devices/Face/Keys/mosipfaceftm.p12 differ diff --git a/api-test/Biometric Devices/Face/Stream Image/0.jpeg b/api-test/Biometric Devices/Face/Stream Image/0.jpeg new file mode 100644 index 00000000000..1fa782a7d47 Binary files /dev/null and b/api-test/Biometric Devices/Face/Stream Image/0.jpeg differ diff --git a/api-test/Biometric Devices/Finger/Single/DeviceDiscovery.json b/api-test/Biometric Devices/Finger/Single/DeviceDiscovery.json new file mode 100644 index 00000000000..142a5aaedd5 --- /dev/null +++ b/api-test/Biometric Devices/Finger/Single/DeviceDiscovery.json @@ -0,0 +1,17 @@ +{ + "deviceId":"4", + "deviceStatus":"Ready", + "certification":"L0", + "serviceVersion":"0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId":"", + "deviceCode": "b692b595-3523-slap-99fc-bd76e35f290f", + "specVersion":[ + "0.9.5" + ], + "purpose":"", + "error":null +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Single/DeviceInfo.json b/api-test/Biometric Devices/Finger/Single/DeviceInfo.json new file mode 100644 index 00000000000..70706413458 --- /dev/null +++ b/api-test/Biometric Devices/Finger/Single/DeviceInfo.json @@ -0,0 +1,18 @@ +{ + "deviceStatus": "Ready", + "deviceId": "4", + "firmware": "MOSIP.SINGLE.1.0.0.0", + "certification": "L0", + "serviceVersion": "0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId": "", + "deviceCode": "b692b595-3523-slap-99fc-bd76e35f290f", + "env": "Staging", + "purpose": "", + "specVersion": [ + "0.9.5" + ] +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Single/DigitalId.json b/api-test/Biometric Devices/Finger/Single/DigitalId.json new file mode 100644 index 00000000000..4773012450c --- /dev/null +++ b/api-test/Biometric Devices/Finger/Single/DigitalId.json @@ -0,0 +1,10 @@ +{ + "serialNo":"1234567990", + "make":"MOSIP", + "model":"SINGLE01", + "type":"Finger", + "deviceSubType":"Single", + "deviceProvider":"MOSIP", + "deviceProviderId":"MOSIP.PROXY.SBI", + "dateTime":"" +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingle.p12 b/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingle.p12 new file mode 100644 index 00000000000..b1af929c609 Binary files /dev/null and b/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingle.p12 differ diff --git a/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingleftm.p12 b/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingleftm.p12 new file mode 100644 index 00000000000..e92a0a26ac2 Binary files /dev/null and b/api-test/Biometric Devices/Finger/Single/Keys/mosipfingersingleftm.p12 differ diff --git a/api-test/Biometric Devices/Finger/Slap/DeviceDiscovery.json b/api-test/Biometric Devices/Finger/Slap/DeviceDiscovery.json new file mode 100644 index 00000000000..37664dc9d4a --- /dev/null +++ b/api-test/Biometric Devices/Finger/Slap/DeviceDiscovery.json @@ -0,0 +1,17 @@ +{ + "deviceId":"2", + "deviceStatus":"Ready", + "certification":"L0", + "serviceVersion":"0.9.5", + "deviceSubId":[ + "1", "2", "3" + ], + "callbackId":"", + "digitalId":"", + "deviceCode": "b692b595-3523-slap-99fc-bd76e35f190f", + "specVersion":[ + "0.9.5" + ], + "purpose":"", + "error":null +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Slap/DeviceInfo.json b/api-test/Biometric Devices/Finger/Slap/DeviceInfo.json new file mode 100644 index 00000000000..7d9e3eb3a4b --- /dev/null +++ b/api-test/Biometric Devices/Finger/Slap/DeviceInfo.json @@ -0,0 +1,18 @@ +{ + "deviceStatus": "Ready", + "deviceId": "2", + "firmware": "MOSIP.SLAP.1.0.0.0", + "certification": "L0", + "serviceVersion": "0.9.5", + "deviceSubId":[ + "1", "2", "3" + ], + "callbackId":"", + "digitalId": "", + "deviceCode": "b692b595-3523-slap-99fc-bd76e35f190f", + "env": "Staging", + "purpose": "", + "specVersion": [ + "0.9.5" + ] +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Slap/DigitalId.json b/api-test/Biometric Devices/Finger/Slap/DigitalId.json new file mode 100644 index 00000000000..759794b80fa --- /dev/null +++ b/api-test/Biometric Devices/Finger/Slap/DigitalId.json @@ -0,0 +1,10 @@ +{ + "serialNo":"1234567890", + "make":"MOSIP", + "model":"SLAP01", + "type":"Finger", + "deviceSubType":"Slap", + "deviceProvider":"MOSIP", + "deviceProviderId":"MOSIP.PROXY.SBI", + "dateTime":"" +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslap.p12 b/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslap.p12 new file mode 100644 index 00000000000..59e2d477b12 Binary files /dev/null and b/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslap.p12 differ diff --git a/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslapftm.p12 b/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslapftm.p12 new file mode 100644 index 00000000000..0885eb8f464 Binary files /dev/null and b/api-test/Biometric Devices/Finger/Slap/Keys/mosipfingerslapftm.p12 differ diff --git a/api-test/Biometric Devices/Finger/Slap/Stream Image/1.jpeg b/api-test/Biometric Devices/Finger/Slap/Stream Image/1.jpeg new file mode 100644 index 00000000000..b9d93bc2921 Binary files /dev/null and b/api-test/Biometric Devices/Finger/Slap/Stream Image/1.jpeg differ diff --git a/api-test/Biometric Devices/Finger/Slap/Stream Image/2.jpeg b/api-test/Biometric Devices/Finger/Slap/Stream Image/2.jpeg new file mode 100644 index 00000000000..faf47323f3f Binary files /dev/null and b/api-test/Biometric Devices/Finger/Slap/Stream Image/2.jpeg differ diff --git a/api-test/Biometric Devices/Finger/Slap/Stream Image/3.jpeg b/api-test/Biometric Devices/Finger/Slap/Stream Image/3.jpeg new file mode 100644 index 00000000000..e2d0fb6c9fc Binary files /dev/null and b/api-test/Biometric Devices/Finger/Slap/Stream Image/3.jpeg differ diff --git a/api-test/Biometric Devices/Iris/Double/DeviceDiscovery.json b/api-test/Biometric Devices/Iris/Double/DeviceDiscovery.json new file mode 100644 index 00000000000..3b947d24143 --- /dev/null +++ b/api-test/Biometric Devices/Iris/Double/DeviceDiscovery.json @@ -0,0 +1,17 @@ +{ + "deviceId":"1", + "deviceStatus":"Ready", + "certification":"L0", + "serviceVersion":"0.9.5", + "deviceSubId":[ + "1", "2", "3" + ], + "callbackId":"", + "digitalId":"", + "deviceCode": "b692b595-3523-iris-99fc-bd76e35f190f", + "specVersion":[ + "0.9.5" + ], + "purpose":"", + "error":null +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Double/DeviceInfo.json b/api-test/Biometric Devices/Iris/Double/DeviceInfo.json new file mode 100644 index 00000000000..e7b08d1efad --- /dev/null +++ b/api-test/Biometric Devices/Iris/Double/DeviceInfo.json @@ -0,0 +1,18 @@ +{ + "deviceStatus": "Ready", + "deviceId": "1", + "firmware": "MOSIP.IRIS.1.0.0.0", + "certification": "L0", + "serviceVersion": "0.9.5", + "deviceSubId":[ + "1", "2", "3" + ], + "callbackId":"", + "digitalId": "", + "deviceCode": "b692b595-3523-iris-99fc-bd76e35f190f", + "env": "Staging", + "purpose": "", + "specVersion": [ + "0.9.5" + ] +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Double/DigitalId.json b/api-test/Biometric Devices/Iris/Double/DigitalId.json new file mode 100644 index 00000000000..eb100965e98 --- /dev/null +++ b/api-test/Biometric Devices/Iris/Double/DigitalId.json @@ -0,0 +1,10 @@ +{ + "serialNo":"3456789012", + "make":"MOSIP", + "model":"IRIS01", + "type":"Iris", + "deviceSubType":"Double", + "deviceProvider":"MOSIP", + "deviceProviderId":"MOSIP.PROXY.SBI", + "dateTime":"" +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdouble.p12 b/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdouble.p12 new file mode 100644 index 00000000000..6d0874494d5 Binary files /dev/null and b/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdouble.p12 differ diff --git a/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdoubleftm.p12 b/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdoubleftm.p12 new file mode 100644 index 00000000000..3203fb8efeb Binary files /dev/null and b/api-test/Biometric Devices/Iris/Double/Keys/mosipirisdoubleftm.p12 differ diff --git a/api-test/Biometric Devices/Iris/Double/Stream Image/1.jpeg b/api-test/Biometric Devices/Iris/Double/Stream Image/1.jpeg new file mode 100644 index 00000000000..b4d108386d6 Binary files /dev/null and b/api-test/Biometric Devices/Iris/Double/Stream Image/1.jpeg differ diff --git a/api-test/Biometric Devices/Iris/Double/Stream Image/2.jpeg b/api-test/Biometric Devices/Iris/Double/Stream Image/2.jpeg new file mode 100644 index 00000000000..485712ef4aa Binary files /dev/null and b/api-test/Biometric Devices/Iris/Double/Stream Image/2.jpeg differ diff --git a/api-test/Biometric Devices/Iris/Double/Stream Image/3.jpeg b/api-test/Biometric Devices/Iris/Double/Stream Image/3.jpeg new file mode 100644 index 00000000000..8691a946048 Binary files /dev/null and b/api-test/Biometric Devices/Iris/Double/Stream Image/3.jpeg differ diff --git a/api-test/Biometric Devices/Iris/Single/DeviceDiscovery.json b/api-test/Biometric Devices/Iris/Single/DeviceDiscovery.json new file mode 100644 index 00000000000..93510c8c44a --- /dev/null +++ b/api-test/Biometric Devices/Iris/Single/DeviceDiscovery.json @@ -0,0 +1,17 @@ +{ + "deviceId":"5", + "deviceStatus":"Ready", + "certification":"L0", + "serviceVersion":"0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId":"", + "deviceCode": "b692b595-3523-iris-99fc-bd76e35fff8", + "specVersion":[ + "0.9.5" + ], + "purpose":"", + "error":null +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Single/DeviceInfo.json b/api-test/Biometric Devices/Iris/Single/DeviceInfo.json new file mode 100644 index 00000000000..0fecb5d662d --- /dev/null +++ b/api-test/Biometric Devices/Iris/Single/DeviceInfo.json @@ -0,0 +1,18 @@ +{ + "deviceStatus": "Ready", + "deviceId": "5", + "firmware": "MOSIP.IRIS.2.0.0.0", + "certification": "L0", + "serviceVersion": "0.9.5", + "deviceSubId":[ + "0" + ], + "callbackId":"", + "digitalId": "", + "deviceCode": "b692b595-3523-iris-99fc-bd76e35fff8", + "env": "Staging", + "purpose": "", + "specVersion": [ + "0.9.5" + ] +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Single/DigitalId.json b/api-test/Biometric Devices/Iris/Single/DigitalId.json new file mode 100644 index 00000000000..b2d91c8d8ec --- /dev/null +++ b/api-test/Biometric Devices/Iris/Single/DigitalId.json @@ -0,0 +1,10 @@ +{ + "serialNo":"3456789099", + "make":"MOSIP", + "model":"IRIS02", + "type":"Iris", + "deviceSubType":"Single", + "deviceProvider":"MOSIP", + "deviceProviderId":"MOSIP.PROXY.SBI", + "dateTime":"" +} \ No newline at end of file diff --git a/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingle.p12 b/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingle.p12 new file mode 100644 index 00000000000..c3903f9188a Binary files /dev/null and b/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingle.p12 differ diff --git a/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingleftm.p12 b/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingleftm.p12 new file mode 100644 index 00000000000..0801aa158b0 Binary files /dev/null and b/api-test/Biometric Devices/Iris/Single/Keys/mosipirissingleftm.p12 differ diff --git a/api-test/Biometric Devices/mosiprootca.p12 b/api-test/Biometric Devices/mosiprootca.p12 new file mode 100644 index 00000000000..3f1db48fb40 Binary files /dev/null and b/api-test/Biometric Devices/mosiprootca.p12 differ diff --git a/api-test/Biometric Devices/mosiprootcaftm.p12 b/api-test/Biometric Devices/mosiprootcaftm.p12 new file mode 100644 index 00000000000..ab4c5929aa5 Binary files /dev/null and b/api-test/Biometric Devices/mosiprootcaftm.p12 differ diff --git a/api-test/Biometric Devices/rootca.cer b/api-test/Biometric Devices/rootca.cer new file mode 100644 index 00000000000..dfaf87e47eb --- /dev/null +++ b/api-test/Biometric Devices/rootca.cer @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPzCCAiegAwIBAgIEYCFEgjANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJJ +TjESMBAGA1UECAwJS2FybmF0YWthMQ4wDAYDVQQKDAVNb3NpcDEOMAwGA1UECwwF +TW9zaXAxDzANBgNVBAMMBlJvb3RDQTAeFw0yMTAyMDgxNDAyNDJaFw0zMTAyMDgx +NDAyNDJaMFIxCzAJBgNVBAYTAklOMRIwEAYDVQQIDAlLYXJuYXRha2ExDjAMBgNV +BAoMBU1vc2lwMQ4wDAYDVQQLDAVNb3NpcDEPMA0GA1UEAwwGUm9vdENBMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9kaCs4Yrh2mMFx/wGV42Tn7vM9d +t2au3JOWu/fbeaNk8/TgNEA1GrVerqagcRDDo+6jBDbX7XO9iRHX1wmIcVkH7osa +cMKGfYzZbvkWjGFRCam10xLGyczSeDiIIj+H3eLXzTP0iZBcVyw40EMLWk7BHld+ +eFY1XS+EDPIv6snjIxWDEd+wND1tOvWgPsS7mYy8Mn9QRYZXH9KW8/nW0bf/Z74U +d89PtXl3WSSrrRZSQofGDwM5RPOEzrYcurZowwWLWmgAmvcsATxhOAiKe6e6tvbD +yXTC8+9CRv22zGTcasI5QOYzGaj6wMKr9h2WgAY1LJFBIkEjf1ykWGlTbQIDAQAB +ox0wGzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AQEAzWge0dKje1/opIyiho0e6p6a/M/UD05bNLg7XD6uMqJAT9C1YTwq77OD0nrc +ZpMQoQ4zCFEbGoPvHWzW0Isc7Y3F40YI8bQdmEQtJuiqsCUQ8XW3b4YDTH6VM5go ++VZgoRucIRBwCAss1tMrxjT3lMWwuyA9DaOkryRW/m9QmlLoTWLQabi/pO+FS+oy +WYYxJOzvqC3xUTYHi+DzlLSWR08NE7gdHrD4aAHYLPIyzgVuToztB7PYmbuOnKmS +M9sHlKqgpN7/AgvTOFOEX5mi5BcPGKagryTfipwLVyWaQBDCcVNkAtoLTYPCTEAj +UhONf7GpbeehitYjHQoknr21EA== +-----END CERTIFICATE----- diff --git a/api-test/Biometric Devices/rootcaftm.cer b/api-test/Biometric Devices/rootcaftm.cer new file mode 100644 index 00000000000..ac57e8ba9e0 --- /dev/null +++ b/api-test/Biometric Devices/rootcaftm.cer @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDeTCCAmGgAwIBAgIEYMHynDANBgkqhkiG9w0BAQsFADBvMQswCQYDVQQGEwJJ +TjESMBAGA1UECAwJS2FybmF0YWthMRIwEAYDVQQHDAlCYW5nYWxvcmUxETAPBgNV +BAoMCG1vc2lwLmlvMREwDwYDVQQLDAhtb3NpcC5pbzESMBAGA1UEAwwJUm9vdENB +RlRNMB4XDTIxMDYxMDExMDgxMloXDTIyMDYxMDExMDgxMlowbzELMAkGA1UEBhMC +SU4xEjAQBgNVBAgMCUthcm5hdGFrYTESMBAGA1UEBwwJQmFuZ2Fsb3JlMREwDwYD +VQQKDAhtb3NpcC5pbzERMA8GA1UECwwIbW9zaXAuaW8xEjAQBgNVBAMMCVJvb3RD +QUZUTTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3FfxvirIiPH6YF +X4GR1z7LOI8tiwvfqjAFba6p4vMHs0xNu0TWJ9GS3qlDglmWczm3hgHndWD3rIUQ +V4fMsQDapA0giFVMxushm8u9JYl2HXwtVgrXUeKEdVS3zpWf2qQCXK9vQAOHvhhu +UMWVzL4yxd1RwUGjuSjM/pZqa/Tq0aDfqFVZ/MckxSvieEKEYODtcxXA708SQ07I +aFDZ2gKTD4aYUlCed9fAois+ko06tzqS1kerMiORzZExtUY/hwx2UrLVUBFYTBqW +Wuw0N2VjsaifQAti0JJGYPCBqM2Q7OctIvccAjghHYxCXj+yNRtOm8ooNZTefMJr +fCY9OucCAwEAAaMdMBswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAEQJMIT958jm1e5sCctUcOoHLQVdM9f3NLKicCUCjVMNCDjg +DbkoL72rlktTDbzi4AizaBXwxQdB951SG4Vjbc5tSC3WzB7d8QMiLRwG14Q165Gw +VGuMMOpJn4jlMzJMhhP67vJ4hYI2Op4eDAPH3HCods/Ew4JJ/edwpJ80tLKiB0f6 +fnyPXxPUSMtkLCCpp2/zf1OkXmUT8dIgU27R9+/8x/ZphDVJcc00XrgM4VI1dX+W +8W8Ua6GlQSL83HIqVudnFAmCDF0dRX//ghUOeJwWEMgcm/cUNTZv6hZjmDpVeout +E1o6hXGXWRnaDU9/QGpi2BuiSgREOarAQf62sPI= +-----END CERTIFICATE----- diff --git a/api-test/Dockerfile b/api-test/Dockerfile new file mode 100644 index 00000000000..7d3e79e2d4c --- /dev/null +++ b/api-test/Dockerfile @@ -0,0 +1,60 @@ +FROM mosipid/openjdk-21-jre:21.0.4 + +ARG SOURCE +ARG COMMIT_HASH +ARG COMMIT_ID +ARG BUILD_TIME +LABEL source=${SOURCE} +LABEL commit_hash=${COMMIT_HASH} +LABEL commit_id=${COMMIT_ID} +LABEL build_time=${BUILD_TIME} + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user=mosip + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_group=mosip + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_uid=1001 + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_gid=1001 + +ARG KUBECTL_VERSION=1.22.9 + +# set working directory for the user +WORKDIR /home/${container_user} + +ENV work_dir=/home/${container_user} + +# Combine all necessary files into a single COPY command +COPY ./api-test/target $work_dir/ +COPY application.properties $work_dir/ +COPY ["Biometric Devices", "$work_dir/Biometric Devices"] +COPY ["resource", "$work_dir/resource"] +COPY entrypoint.sh $work_dir + +# install packages and create user +RUN apt-get -y update \ +&& apt-get install -y unzip jq curl \ +&& groupadd -g ${container_user_gid} ${container_user_group} \ +&& useradd -u ${container_user_uid} -g ${container_user_group} -s /bin/bash -m ${container_user} \ +&& curl -LO "https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl" \ +&& mkdir -p /home/${container_user} \ +&& chmod +x kubectl $work_dir/entrypoint.sh \ +&& mv kubectl /usr/local/bin/ \ +&& chown -R ${container_user}:${container_user} /home/${container_user} /etc/ssl/certs/java/cacerts \ +&& chmod 644 /etc/ssl/certs/java/cacerts + +#select container user for all tasks +USER ${container_user_uid}:${container_user_gid} + +EXPOSE 8083 + +ENV MODULES= +ENV ENV_USER= +ENV ENV_ENDPOINT= +ENV ENV_TESTLEVEL=smokeAndRegression + +ENTRYPOINT ["./entrypoint.sh"] diff --git a/api-test/README.md b/api-test/README.md new file mode 100644 index 00000000000..f52129d7c84 --- /dev/null +++ b/api-test/README.md @@ -0,0 +1,194 @@ +# Resident API Test Rig + +## Overview + +The **Resident API Test Rig** is designed for the execution of module-wise automation API tests for the resident services. This test rig utilizes **Java REST Assured** and **TestNG** frameworks to automate testing of the resident-service API functionalities. The key focus is to validate the VID Generation, Auth lock, Auth unlock, Identity Management and related functionalities provided by the resident service module. + +--- + +## Test Categories + +- **Smoke**: Contains only positive test scenarios for quick verification. +- **Regression**: Includes all test scenarios, covering both positive and negative cases. + +--- + +## Coverage + +This test rig covers only **external API endpoints** exposed by the resident services module. + +--- + +## Pre-requisites + +Before running the automation tests, ensure the following software is installed on the machine: + +- **Java 21** ([download here](https://jdk.java.net/)) +- **Maven 3.9.6** or higher ([installation guide](https://maven.apache.org/install.html)) +- **Lombok** (Refer to [Lombok Project](https://projectlombok.org/)) +- **setting.xml** ([download here](https://github.com/mosip/mosip-functional-tests/blob/master/settings.xml)) + +### For Windows + +- **Git Bash 2.18.0** or higher +- Ensure the `settings.xml` file is present in the `.m2` folder. + +### For Linux + +- The `settings.xml` file should be present in two places: + - In the regular Maven configuration folder (`/conf`) + - Under `/usr/local/maven/conf/` + +--- + +## Access Test Automation Code + +You can access the test automation code using either of the following methods: + +### From Browser + +1. Clone or download the repository as a zip file from [GitHub](https://github.com/mosip/resident-services). +2. Unzip the contents to your local machine. +3. Open a terminal (Linux) or command prompt (Windows) and continue with the following steps. + +### From Git Bash + +1. Copy the Git repository URL: `https://github.com/mosip/resident-services` +2. Open **Git Bash** on your local machine. +3. Run the following command to clone the repository: + ```sh + git clone https://github.com/mosip/resident-services + ``` +--- + +## Update the property file +1. Navigate to the resident.properties file located at: + resident-services\api-test\src\main\resources\config\resident.properties +2. Open the file in your preferred editor +3. Update the client secret values and other required credentials as per your environment + +--- + +## Build Test Automation Code + +Once the repository is cloned or downloaded, follow these steps to build and install the test automation code: + +1. Navigate to the project directory: + ```sh + cd api-test + ``` + +2. Build the project using Maven: + ```sh + mvn clean install -Dgpg.skip=true -Dmaven.gitcommitid.skip=true + ``` + +This will download the required dependencies and prepare the test suite for execution. + +--- + +## Execute Test Automation Suite + +You can execute the test automation code using either of the following methods: + +### Using Jar + +To execute the tests using Jar, use the following steps: + +1. Navigate to the `target` directory where the JAR file is generated: + ```sh + cd target/ + ``` + +2. Run the automation test suite JAR file: + ``` + java -jar -Dmodules=resident -Denv.user=api-internal. -Denv.endpoint= -Denv.testLevel=smokeAndRegression -jar apitest-resident-1.2.1.2-jar-with-dependencies.jar + ``` + +# Using Eclipse IDE + +To execute the tests using Eclipse IDE, use the following steps: + +## 1. **Install Eclipse (Latest Version)** + - Download and install the latest version of Eclipse IDE from the [Eclipse Downloads](https://www.eclipse.org/downloads/). + +## 2. **Import the Maven Project** + + After Eclipse is installed, follow these steps to import the Maven project: + + - Open Eclipse IDE. + - Go to `File` > `Import`. + - In the **Import** wizard, select `Maven` > `Existing Maven Projects`, then click **Next**. + - Browse to the location where the `api-test` folder is saved (either from the cloned Git repository or downloaded zip). + - Select the folder, and Eclipse will automatically detect the Maven project. Click **Finish** to import the project. + +## 3. **Build the Project** + + - Right-click on the project in the **Project Explorer** and select `Maven` > `Update Project`. + - This will download the required dependencies as defined in the `pom.xml` and ensure everything is correctly set up. + +## 4. **Run the Tests** + + To execute the test automation suite, you need to configure the run parameters in Eclipse: + + - Go to `Run` > `Run Configurations`. + - In the **Run Configurations** window, create a new configuration for your tests: + - Right-click on **Java Application** and select **New**. + - In the **Main** tab, select the project by browsing the location where the `api-test` folder is saved, and select the **Main class** as `io.mosip.testrig.apirig.resident.testrunner.MosipTestRunner`. + - In the **Arguments** tab, add the necessary **VM arguments**: + - **VM Arguments**: + ``` + -Dmodules=resident -Denv.user=api-internal. -Denv.endpoint= -Denv.testLevel=smokeAndRegression``` + +## 5. **Run the Configuration** + + - Once the configuration is set up, click **Run** to execute the test suite. + - The tests will run, and the results will be shown in the **Console** tab of Eclipse. + + **Note**: You can also run in **Debug Mode** to troubleshoot issues by setting breakpoints in your code and choosing `Debug` instead of `Run`. + +--- + +## 6. **View Test Results** + + - After the tests are executed, you can view the detailed results in the `api-test\testng-report` directory. + - The report will have two sections: + - One section for pre-requisite APIs test cases. + - Another section for core test cases. + +--- + +## Test Report Column Definitions +This section describes the meaning of each column in the test report: +- **Total (T)** + The total number of test cases considered in the report. +- **Passed (P)** + Indicates the number of test cases that executed successfully with the expected results. +- **Failed (F)** + Indicates the number of test cases that failed due to issues such as output validation mismatches or unexpected errors during execution. +- **Skipped (S)** + Represents test cases that were not executed due to missing prerequisites or data dependencies. +- **Ignored (I)** + Represents test cases that were intentionally not executed due to limitations such as unsupported features, incompatibilities, or undeployed services. +- **Known Issues (KI)** + Indicates test cases that failed but are already acknowledged as known issues for the current release, typically linked with a bug or defect ID. + +## Details of Arguments Used + +- **env.user**: Replace `` with the appropriate environment name (e.g., `dev`, `qa`, etc.). +- **env.endpoint**: The environment where the application under test is deployed. Replace `` with the correct base URL for the environment (e.g., `https://api-internal..mosip.net`). +- **env.testLevel**: Set this to `smoke` to run only smoke test cases, or `smokeAndRegression` to run both smoke and regression tests. +- **jar**: Specify the name of the JAR file to execute. The version will change according to the development code version. For example, the current version may look like `apitest-resident-1.2.1.2-jar-with-dependencies.jar`. + +### Build and Run Info + +To run the tests for both **Smoke** and **Regression**: + +1. Ensure the correct environment and test level parameters are set. +2. Execute the tests as shown in the command above to validate resident services API functionalities. + +--- + +## License + +This project is licensed under the terms of the [Mozilla Public License 2.0](https://github.com/mosip/mosip-platform/blob/master/LICENSE) diff --git a/api-test/application.properties b/api-test/application.properties new file mode 100644 index 00000000000..8e2d92cc169 --- /dev/null +++ b/api-test/application.properties @@ -0,0 +1,143 @@ +server.minport=4501 +server.maxport=4600 +server.serveripaddress=127.0.0.1 +cors.headers.allowed.methods="OPTIONS, RCAPTURE, CAPTURE, MOSIPDINFO, MOSIPDISC, STREAM, GET, POST" +cors.headers.allowed.origin="*" + +mosip.mock.sbi.allowed.admin.apis="admin/score, admin/delay, admin/status, admin/profile" +mosip.mock.sbi.quality.score=94 +mosip.mock.sbi.device.purpose.registration=Registration +mosip.mock.sbi.device.purpose.auth=Auth + +mosip.mock.sbi.biometric.type.biometricdevice=Biometric Device +mosip.mock.sbi.biometric.type.finger=Finger +mosip.mock.sbi.biometric.type.face=Face +mosip.mock.sbi.biometric.type.iris=Iris + +mosip.mock.sbi.biometric.subtype.finger.slap=Slap +mosip.mock.sbi.biometric.subtype.finger.single=Single +mosip.mock.sbi.biometric.subtype.finger.touchless=Touchless +mosip.mock.sbi.biometric.subtype.face=Full face +mosip.mock.sbi.biometric.subtype.iris.single=Single +mosip.mock.sbi.biometric.subtype.iris.double=Double + +mosip.mock.sbi.biometric.seed.finger=99 +mosip.mock.sbi.biometric.seed.face=3 +mosip.mock.sbi.biometric.seed.iris=999 + +mosip.mock.sbi.file.face.digitalid.json=/Biometric Devices/Face/DigitalId.json +mosip.mock.sbi.file.face.deviceinfo.json=/Biometric Devices/Face/DeviceInfo.json +mosip.mock.sbi.file.face.devicediscovery.json=/Biometric Devices/Face/DeviceDiscovery.json +mosip.mock.sbi.file.face.streamimage=/Biometric Devices/Face/Stream Image/0.jpeg +mosip.mock.sbi.file.face.keys.keystorefilename=/device-dsk-partner.p12 +mosip.mock.sbi.file.face.keys.keyalias=keyalias +mosip.mock.sbi.file.face.keys.keystorepwd=qwerty@123 +mosip.mock.sbi.file.face.keys.keystorefilename.ftm=/Biometric Devices/Face/Keys/mosipfaceftm.p12 +mosip.mock.sbi.file.face.keys.keyalias.ftm=mosipfaceftm +mosip.mock.sbi.file.face.keys.keystorepwd.ftm=mosipfaceftm +mosip.mock.sbi.file.face.keys.encryption=/Biometric Devices/Face/Keys/mosip-ida.cer + +mosip.mock.sbi.file.finger.slap.digitalid.json=/Biometric Devices/Finger/Slap/DigitalId.json +mosip.mock.sbi.file.finger.slap.deviceinfo.json=/Biometric Devices/Finger/Slap/DeviceInfo.json +mosip.mock.sbi.file.finger.slap.devicediscovery.json=/Biometric Devices/Finger/Slap/DeviceDiscovery.json +mosip.mock.sbi.file.finger.slap.streamimage.left=/Biometric Devices/Finger/Slap/Stream Image/1.jpeg +mosip.mock.sbi.file.finger.slap.streamimage.right=/Biometric Devices/Finger/Slap/Stream Image/2.jpeg +mosip.mock.sbi.file.finger.slap.streamimage.thumb=/Biometric Devices/Finger/Slap/Stream Image/3.jpeg +mosip.mock.sbi.file.finger.slap.keys.keystorefilename=/device-dsk-partner.p12 +mosip.mock.sbi.file.finger.slap.keys.keyalias=keyalias +mosip.mock.sbi.file.finger.slap.keys.keystorepwd=qwerty@123 +mosip.mock.sbi.file.finger.slap.keys.keystorefilename.ftm=/Biometric Devices/Finger/Slap/Keys/mosipfingerslapftm.p12 +mosip.mock.sbi.file.finger.slap.keys.keyalias.ftm=mosipfingerslapftm +mosip.mock.sbi.file.finger.slap.keys.keystorepwd.ftm=mosipfingerslapftm +mosip.mock.sbi.file.finger.slap.keys.encryption=/Biometric Devices/Finger/Slap/Keys/mosip-ida.cer + +mosip.mock.sbi.file.iris.double.digitalid.json=/Biometric Devices/Iris/Double/DigitalId.json +mosip.mock.sbi.file.iris.double.deviceinfo.json=/Biometric Devices/Iris/Double/DeviceInfo.json +mosip.mock.sbi.file.iris.double.devicediscovery.json=/Biometric Devices/Iris/Double/DeviceDiscovery.json +#mosip.mock.sbi.file.iris.double.streamimage.both=/Biometric Devices/Iris/Double/Stream Image/1.jpeg +#mosip.mock.sbi.file.iris.double.streamimage.left=/Biometric Devices/Iris/Double/Stream Image/2.jpeg +#mosip.mock.sbi.file.iris.double.streamimage.right=/Biometric Devices/Iris/Double/Stream Image/3.jpeg +mosip.mock.sbi.file.iris.double.keys.keystorefilename=/device-dsk-partner.p12 +mosip.mock.sbi.file.iris.double.keys.keyalias=keyalias +mosip.mock.sbi.file.iris.double.keys.keystorepwd=qwerty@123 +mosip.mock.sbi.file.iris.double.keys.keystorefilename.ftm=/Biometric Devices/Iris/Double/Keys/mosipirisdoubleftm.p12 +mosip.mock.sbi.file.iris.double.keys.keyalias.ftm=mosipirisdoubleftm +mosip.mock.sbi.file.iris.double.keys.keystorepwd.ftm=mosipirisdoubleftm +mosip.mock.sbi.file.iris.double.keys.encryption=/Biometric Devices/Iris/Double/Keys/mosip-ida.cer + +mosip.mock.sbi.folder.profile=/resource/Profile +mosip.mock.sbi.file.folder.default=/resource/Profile/Default + +mosip.kernel.crypto.sign-algorithm-name=RS256 + +mosip.auth.server.url=https://dev.mosip.net/v1/authmanager/authenticate/clientidsecretkey +mosip.auth.appid=regproc +mosip.auth.clientid=mosip-regproc-client +mosip.auth.secretkey=abc123 + +mosip.ida.server.url=https://extint1.mosip.net/idauthentication/v1/internal/getCertificate?applicationId=IDA&referenceId=IDA-FIR + +mds_ERROR_0_msg_en=Success + +mds_ERROR_100_msg_en=Device not registered +mds_ERROR_101_msg_en=Unable to detect a biometric object +mds_ERROR_102_msg_en=Technical error during extraction +mds_ERROR_103_msg_en=Device tamper detected +mds_ERROR_104_msg_en=Unable to connect to management server +mds_ERROR_105_msg_en=Image orientation error +mds_ERROR_106_msg_en=Device not found +mds_ERROR_107_msg_en=Device public key expired +mds_ERROR_108_msg_en=Domain public key missing +mds_ERROR_109_msg_en=Requested number of biometric (Finger/IRIS) not supported +mds_ERROR_110_msg_en=Device is not ready +mds_ERROR_111_msg_en=Device is busy +mds_ERROR_112_msg_en=Device Type MisMatch for given deviceId +mds_ERROR_113_msg_en=Count MisMatch for given deviceType +mds_ERROR_114_msg_en=Device Type can be only (Finger/Iris/Face) + +mds_ERROR_500_msg_en=Invalid URL +mds_ERROR_501_msg_en=Invalid Type Value in Device Discovery Request +mds_ERROR_502_msg_en=Biometric Type values must be Biometric Device, Finger, Face, Iris +mds_ERROR_503_msg_en=Devices are not Connected, please connect devices +mds_ERROR_504_msg_en=Device Status values must be Ready, Busy, Not Ready, Not Registered +mds_ERROR_505_msg_en=Quality Score can not be empty and greater than 100 or lesser than 0 +mds_ERROR_506_msg_en=Delay can not empty and lesser than 0 milliseconds +mds_ERROR_507_msg_en=Method array can contain values only MOSIPDISC, MOSIPDINFO, CAPTURE, STREAM, RCAPTURE + +mds_ERROR_551_msg_en=Profile Not Set, please check the profile value + +mds_ERROR_601_msg_en=Livestream request can not be done for Auth Devices +mds_ERROR_604_msg_en=Device Id value not present in Livestream request object +mds_ERROR_605_msg_en=Device is not connected or not Registered for the deviceId given in Livestream request object +mds_ERROR_606_msg_en=Device connected purpose should be for Registration only for Livestream +mds_ERROR_607_msg_en=Device Status is Not Ready or Busy +mds_ERROR_608_msg_en=Live Stream Image not present +mds_ERROR_609_msg_en=Live Stream timeout +mds_ERROR_610_msg_en=Live streaming unknown error + +mds_ERROR_700_msg_en=RCapture Failed because Live streaming was stopped +mds_ERROR_701_msg_en=RCapture Failed because Capture Timeout has happened +mds_ERROR_702_msg_en=RCapture Failed because Live streaming DeviceId and DeviceSubId different +mds_ERROR_703_msg_en=RCapture process already in progress, try after sometime +mds_ERROR_704_msg_en=Device Id value not present in RCapture request object +mds_ERROR_705_msg_en=Device is not connected or not Registered for the deviceId given in RCapture request object +mds_ERROR_706_msg_en=Device connected purpose should be for Registration only for RCapture +mds_ERROR_707_msg_en=BioMetric not present for the given bio subtype +mds_ERROR_708_msg_en=No BioMetric information present for the given Biotype and BioSubType Id +mds_ERROR_709_msg_en=RCapture request can not be done for Auth Devices +mds_ERROR_710_msg_en=RCapture unknown error + +mds_ERROR_800_msg_en=Auth Capture Failed +mds_ERROR_801_msg_en=Auth Capture Failed because Capture Timeout has happened +mds_ERROR_803_msg_en=Auth Capture process already in progress, try after sometime +mds_ERROR_804_msg_en=Device Id value not present in Auth Capture request object +mds_ERROR_805_msg_en=Device is not connected or not Registered for the deviceId given in Auth Capture request object +mds_ERROR_806_msg_en=Device connected purpose should be for Auth only for Auth Capture +mds_ERROR_809_msg_en=Auth Capture request can not be done for Registration Devices +mds_ERROR_810_msg_en=Auth Capture unknown error + +mds_ERROR_999_msg_en=Unknown Error + +mosip.mock.sbi.file.iris.double.streamimage.left=/Biometric Devices/Iris/Double/Stream Image/1.jpeg +mosip.mock.sbi.file.iris.double.streamimage.right=/Biometric Devices/Iris/Double/Stream Image/2.jpeg +mosip.mock.sbi.file.iris.double.streamimage.both=/Biometric Devices/Iris/Double/Stream Image/3.jpeg diff --git a/api-test/entrypoint.sh b/api-test/entrypoint.sh new file mode 100644 index 00000000000..9c514d41d86 --- /dev/null +++ b/api-test/entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +## Run automationtests +java -jar -Dmodules="$MODULES" -Denv.user="$ENV_USER" -Denv.endpoint="$ENV_ENDPOINT" -Denv.testLevel="$ENV_TESTLEVEL" apitest-resident-*-jar-with-dependencies.jar; diff --git a/api-test/pom.xml b/api-test/pom.xml new file mode 100644 index 00000000000..a54fc3f8132 --- /dev/null +++ b/api-test/pom.xml @@ -0,0 +1,301 @@ + + 4.0.0 + io.mosip.resident + apitest-resident + jar + apitest-resident + Parent project of MOSIP Resident Services apitests + https://github.com/mosip/resident-services + 1.2.1.2 + + + + MPL 2.0 + https://www.mozilla.org/en-US/MPL/2.0/ + + + + + scm:git:git://github.com/mosip/resident-services.git + scm:git:ssh://github.com:mosip/resident-services.git + https://github.com/mosip/resident-services + HEAD + + + + + Mosip + mosip.emailnotifier@gmail.com + io.mosip + https://github.com/mosip/resident-services + + + + + + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots/ + default + + true + + + + + + UTF-8 + + + 21 + 21 + 3.8.0 + 3.0.2 + 3.1.0 + 3.2.0 + 1.5 + 3.2.4 + 3.0.0 + 2.2.1 + 0.7.0 + + 3.0.1 + apitest-resident-1.2.1.2-jar-with-dependencies + + + + + io.mosip.testrig.apitest.commons + apitest-commons + 1.3.3 + + + + + ossrh + https://central.sonatype.com/repository/maven-snapshots/ + + + ossrh + https://central.sonatype.com/api/v1/publisher + + + + + + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.maven.plugin.version} + true + + ossrh + false + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + none + + + + maven-compiler-plugin + ${maven.compiler.version} + + ${maven.compiler.source} + ${maven.compiler.target} + -Dfile.encoding=UTF-8 + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.version} + + none + + + + pl.project13.maven + git-commit-id-plugin + ${git.commit.id.plugin.version} + + + populate-git-commit-information + + revision + + + true + MM/dd/yyyy HH:mm:ss Z + 8 + true + + ${project.build.outputDirectory}/git.properties + + + + + ${project.basedir}/.git + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven.shade.plugin.version} + + + + shade + + + ${fileName} + + + + + + + io.mosip.testrig.apirig.resident.testrunner.MosipTestRunner + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + true + true + + + ${project.name} + ${project.version} + ${user.name} + ${os.name} + ${maven.build.timestamp} + ${env.BUILD_NUMBER} + ${env.BUILD_ID} + ${env.BUILD_URL} + + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven.war.plugin.version} + + + + true + true + + + ${project.name} + ${project.version} + ${user.name} + ${os.name} + ${maven.build.timestamp} + ${env.BUILD_NUMBER} + ${env.BUILD_ID} + ${env.BUILD_URL} + + + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin.version} + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven.antrun.plugin.version} + + + make-jar-executable + package + + run + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-test/resource/Profile/Automatic/Auth/0001Face.iso b/api-test/resource/Profile/Automatic/Auth/0001Face.iso new file mode 100644 index 00000000000..fbf94babc5c Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Face.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Index.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Index.iso new file mode 100644 index 00000000000..ed8bce5792f Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Index.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Index.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Index.wsq.iso new file mode 100644 index 00000000000..a14b92ba30f Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Index.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Iris.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Iris.iso new file mode 100644 index 00000000000..b36363b6c6a Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Iris.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Little.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Little.iso new file mode 100644 index 00000000000..9f06705f6b0 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Little.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Little.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Little.wsq.iso new file mode 100644 index 00000000000..664d6d1204c Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Little.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.iso new file mode 100644 index 00000000000..3886e5a7907 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.wsq.iso new file mode 100644 index 00000000000..e0952a043e3 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Middle.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.iso new file mode 100644 index 00000000000..e0766785219 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.wsq.iso new file mode 100644 index 00000000000..9c139f53ad3 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Ring.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.iso new file mode 100644 index 00000000000..00d5ad5d4f4 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.wsq.iso new file mode 100644 index 00000000000..722fcef7417 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Left_Thumb.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Index.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Index.iso new file mode 100644 index 00000000000..e45e8d15295 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Index.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Index.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Index.wsq.iso new file mode 100644 index 00000000000..2f082284b5d Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Index.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Iris.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Iris.iso new file mode 100644 index 00000000000..552750cd606 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Iris.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Little.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Little.iso new file mode 100644 index 00000000000..aa801c97dd6 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Little.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Little.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Little.wsq.iso new file mode 100644 index 00000000000..c0fd3e8e12d Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Little.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.iso new file mode 100644 index 00000000000..e6771d02645 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.wsq.iso new file mode 100644 index 00000000000..3ee43b4ffd9 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Middle.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.iso new file mode 100644 index 00000000000..ac8d2b62956 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.wsq.iso new file mode 100644 index 00000000000..5ac7ca4293d Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Ring.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.iso new file mode 100644 index 00000000000..722a5cd9dc4 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.iso differ diff --git a/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.wsq.iso b/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.wsq.iso new file mode 100644 index 00000000000..4f73143e4a3 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Auth/0001Right_Thumb.wsq.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Exception_Photo.iso b/api-test/resource/Profile/Automatic/Registration/0001Exception_Photo.iso new file mode 100644 index 00000000000..80caced4446 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Exception_Photo.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Face.iso b/api-test/resource/Profile/Automatic/Registration/0001Face.iso new file mode 100644 index 00000000000..5e84939bda0 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Face.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Index.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Index.iso new file mode 100644 index 00000000000..46c4112fae5 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Index.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Iris.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Iris.iso new file mode 100644 index 00000000000..fedadc7df94 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Iris.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Little.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Little.iso new file mode 100644 index 00000000000..d2b26846803 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Little.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Middle.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Middle.iso new file mode 100644 index 00000000000..804de92ce9d Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Middle.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Ring.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Ring.iso new file mode 100644 index 00000000000..b401048829b Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Ring.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Left_Thumb.iso b/api-test/resource/Profile/Automatic/Registration/0001Left_Thumb.iso new file mode 100644 index 00000000000..0574ba6c8e1 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Left_Thumb.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Index.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Index.iso new file mode 100644 index 00000000000..bfa1808ccc8 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Index.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Iris.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Iris.iso new file mode 100644 index 00000000000..72bb495bfba Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Iris.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Little.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Little.iso new file mode 100644 index 00000000000..6b3badf299c Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Little.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Middle.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Middle.iso new file mode 100644 index 00000000000..0fa2255975c Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Middle.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Ring.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Ring.iso new file mode 100644 index 00000000000..9aa5dc523bd Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Ring.iso differ diff --git a/api-test/resource/Profile/Automatic/Registration/0001Right_Thumb.iso b/api-test/resource/Profile/Automatic/Registration/0001Right_Thumb.iso new file mode 100644 index 00000000000..0931ac4fd43 Binary files /dev/null and b/api-test/resource/Profile/Automatic/Registration/0001Right_Thumb.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Face.iso b/api-test/resource/Profile/Default/Auth/Face.iso new file mode 100644 index 00000000000..fbf94babc5c Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Face.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Finger_UKNOWN.iso b/api-test/resource/Profile/Default/Auth/Finger_UKNOWN.iso new file mode 100644 index 00000000000..4ee38f986be Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Finger_UKNOWN.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Finger_UKNOWN_wsq.iso b/api-test/resource/Profile/Default/Auth/Finger_UKNOWN_wsq.iso new file mode 100644 index 00000000000..cc5ed30a969 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Finger_UKNOWN_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Iris_UNKNOWN.iso b/api-test/resource/Profile/Default/Auth/Iris_UNKNOWN.iso new file mode 100644 index 00000000000..1764a0e6abd Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Iris_UNKNOWN.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Index.iso b/api-test/resource/Profile/Default/Auth/Left_Index.iso new file mode 100644 index 00000000000..ed8bce5792f Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Index.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Index_wsq.iso b/api-test/resource/Profile/Default/Auth/Left_Index_wsq.iso new file mode 100644 index 00000000000..a14b92ba30f Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Index_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Iris.iso b/api-test/resource/Profile/Default/Auth/Left_Iris.iso new file mode 100644 index 00000000000..8b3aafca11c Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Iris.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Little.iso b/api-test/resource/Profile/Default/Auth/Left_Little.iso new file mode 100644 index 00000000000..9f06705f6b0 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Little.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Little_wsq.iso b/api-test/resource/Profile/Default/Auth/Left_Little_wsq.iso new file mode 100644 index 00000000000..664d6d1204c Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Little_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Middle.iso b/api-test/resource/Profile/Default/Auth/Left_Middle.iso new file mode 100644 index 00000000000..3886e5a7907 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Middle.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Middle_wsq.iso b/api-test/resource/Profile/Default/Auth/Left_Middle_wsq.iso new file mode 100644 index 00000000000..e0952a043e3 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Middle_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Ring.iso b/api-test/resource/Profile/Default/Auth/Left_Ring.iso new file mode 100644 index 00000000000..e0766785219 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Ring.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Ring_wsq.iso b/api-test/resource/Profile/Default/Auth/Left_Ring_wsq.iso new file mode 100644 index 00000000000..9c139f53ad3 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Ring_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Thumb.iso b/api-test/resource/Profile/Default/Auth/Left_Thumb.iso new file mode 100644 index 00000000000..00d5ad5d4f4 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Thumb.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Left_Thumb_wsq.iso b/api-test/resource/Profile/Default/Auth/Left_Thumb_wsq.iso new file mode 100644 index 00000000000..722fcef7417 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Left_Thumb_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Index.iso b/api-test/resource/Profile/Default/Auth/Right_Index.iso new file mode 100644 index 00000000000..e45e8d15295 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Index.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Index_wsq.iso b/api-test/resource/Profile/Default/Auth/Right_Index_wsq.iso new file mode 100644 index 00000000000..2f082284b5d Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Index_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Iris.iso b/api-test/resource/Profile/Default/Auth/Right_Iris.iso new file mode 100644 index 00000000000..3f2d73ad123 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Iris.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Little.iso b/api-test/resource/Profile/Default/Auth/Right_Little.iso new file mode 100644 index 00000000000..aa801c97dd6 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Little.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Little_wsq.iso b/api-test/resource/Profile/Default/Auth/Right_Little_wsq.iso new file mode 100644 index 00000000000..c0fd3e8e12d Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Little_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Middle.iso b/api-test/resource/Profile/Default/Auth/Right_Middle.iso new file mode 100644 index 00000000000..e6771d02645 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Middle.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Middle_wsq.iso b/api-test/resource/Profile/Default/Auth/Right_Middle_wsq.iso new file mode 100644 index 00000000000..3ee43b4ffd9 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Middle_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Ring.iso b/api-test/resource/Profile/Default/Auth/Right_Ring.iso new file mode 100644 index 00000000000..ac8d2b62956 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Ring.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Ring_wsq.iso b/api-test/resource/Profile/Default/Auth/Right_Ring_wsq.iso new file mode 100644 index 00000000000..5ac7ca4293d Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Ring_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Thumb.iso b/api-test/resource/Profile/Default/Auth/Right_Thumb.iso new file mode 100644 index 00000000000..722a5cd9dc4 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Thumb.iso differ diff --git a/api-test/resource/Profile/Default/Auth/Right_Thumb_wsq.iso b/api-test/resource/Profile/Default/Auth/Right_Thumb_wsq.iso new file mode 100644 index 00000000000..4f73143e4a3 Binary files /dev/null and b/api-test/resource/Profile/Default/Auth/Right_Thumb_wsq.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Exception_Photo.iso b/api-test/resource/Profile/Default/Registration/Exception_Photo.iso new file mode 100644 index 00000000000..80caced4446 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Exception_Photo.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Face.iso b/api-test/resource/Profile/Default/Registration/Face.iso new file mode 100644 index 00000000000..5e84939bda0 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Face.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Index.iso b/api-test/resource/Profile/Default/Registration/Left_Index.iso new file mode 100644 index 00000000000..46c4112fae5 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Index.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Iris.iso b/api-test/resource/Profile/Default/Registration/Left_Iris.iso new file mode 100644 index 00000000000..fedadc7df94 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Iris.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Little.iso b/api-test/resource/Profile/Default/Registration/Left_Little.iso new file mode 100644 index 00000000000..d2b26846803 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Little.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Middle.iso b/api-test/resource/Profile/Default/Registration/Left_Middle.iso new file mode 100644 index 00000000000..804de92ce9d Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Middle.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Ring.iso b/api-test/resource/Profile/Default/Registration/Left_Ring.iso new file mode 100644 index 00000000000..b401048829b Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Ring.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Left_Thumb.iso b/api-test/resource/Profile/Default/Registration/Left_Thumb.iso new file mode 100644 index 00000000000..0574ba6c8e1 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Left_Thumb.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Index.iso b/api-test/resource/Profile/Default/Registration/Right_Index.iso new file mode 100644 index 00000000000..bfa1808ccc8 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Index.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Iris.iso b/api-test/resource/Profile/Default/Registration/Right_Iris.iso new file mode 100644 index 00000000000..72bb495bfba Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Iris.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Little.iso b/api-test/resource/Profile/Default/Registration/Right_Little.iso new file mode 100644 index 00000000000..6b3badf299c Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Little.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Middle.iso b/api-test/resource/Profile/Default/Registration/Right_Middle.iso new file mode 100644 index 00000000000..0fa2255975c Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Middle.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Ring.iso b/api-test/resource/Profile/Default/Registration/Right_Ring.iso new file mode 100644 index 00000000000..9aa5dc523bd Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Ring.iso differ diff --git a/api-test/resource/Profile/Default/Registration/Right_Thumb.iso b/api-test/resource/Profile/Default/Registration/Right_Thumb.iso new file mode 100644 index 00000000000..0931ac4fd43 Binary files /dev/null and b/api-test/resource/Profile/Default/Registration/Right_Thumb.iso differ diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testrunner/MosipTestRunner.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testrunner/MosipTestRunner.java new file mode 100644 index 00000000000..e19dbe12ae4 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testrunner/MosipTestRunner.java @@ -0,0 +1,341 @@ +package io.mosip.testrig.apirig.resident.testrunner; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.interfaces.RSAPublicKey; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.bouncycastle.openssl.jcajce.JcaPEMWriter; +import org.testng.TestNG; + +import com.nimbusds.jose.jwk.KeyUse; +import com.nimbusds.jose.jwk.RSAKey; + +import io.mosip.testrig.apirig.dataprovider.BiometricDataProvider; +import io.mosip.testrig.apirig.dbaccess.DBManager; +import io.mosip.testrig.apirig.report.EmailableReport; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.ExtractResource; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.testrunner.OTPListener; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthTestsUtil; +import io.mosip.testrig.apirig.utils.CertsUtil; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.JWKKeyUtil; +import io.mosip.testrig.apirig.utils.KernelAuthentication; +import io.mosip.testrig.apirig.utils.KeyCloakUserAndAPIKeyGeneration; +import io.mosip.testrig.apirig.utils.KeycloakUserManager; +import io.mosip.testrig.apirig.utils.MispPartnerAndLicenseKeyGeneration; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.PartnerRegistration; +import io.mosip.testrig.apirig.utils.SkipTestCaseHandler; +import io.mosip.testrig.apirig.utils.Watchdog; + +/** + * Class to initiate mosip api test execution + * + * @author Vignesh + * + */ +public class MosipTestRunner { + private static final Logger LOGGER = Logger.getLogger(MosipTestRunner.class); + private static String cachedPath = null; + + public static String jarUrl = MosipTestRunner.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + public static List languageList = new ArrayList<>(); + public static boolean skipAll = false; + + /** + * C Main method to start mosip test execution + * + * @param arg + */ + public static void main(String[] arg) { + // Set execution elapse timeout to 1.5 hour + Watchdog watchdog = new Watchdog(90 * 60 * 1000L); + watchdog.start(); + + try { + LOGGER.info("** ------------- API Test Rig Run Started --------------------------------------------- **"); + + BaseTestCase.setRunContext(getRunType(), jarUrl); + + ExtractResource.removeOldMosipTestTestResource(); + if (getRunType().equalsIgnoreCase("JAR")) { + ExtractResource.extractCommonResourceFromJar(); + } else { + ExtractResource.copyCommonResources(); + } + AdminTestUtil.init(); + ResidentConfigManager.init(); + suiteSetup(getRunType()); + SkipTestCaseHandler.loadTestcaseToBeSkippedList("testCaseSkippedList.txt"); + GlobalMethods.setModuleNameAndReCompilePattern(ResidentConfigManager.getproperty("moduleNamePattern")); + setLogLevels(); + + HealthChecker healthcheck = new HealthChecker(); + healthcheck.setCurrentRunningModule(BaseTestCase.currentModule); + Thread trigger = new Thread(healthcheck); + trigger.start(); + + KeycloakUserManager.removeUser(); + KeycloakUserManager.createUsers(); + KeycloakUserManager.closeKeycloakInstance(); + AdminTestUtil.getRequiredField(); + + AdminTestUtil.getRegistrationCenterData(); + AdminTestUtil.getLocationDataWithLocationCode(BaseTestCase.locationCode); + + // Generate device certificates to be consumed by Mock-MDS + PartnerRegistration.deleteCertificates(); + AdminTestUtil.createAndPublishPolicy(); + AdminTestUtil.createEditAndPublishPolicy(); + PartnerRegistration.deviceGeneration(); + + BiometricDataProvider.generateBiometricTestData("Registration"); + + startTestRunner(); + } catch (Exception e) { + LOGGER.error("Exception " + e.getMessage()); + } + + KeycloakUserManager.removeUser(); + KeycloakUserManager.closeKeycloakInstance(); + + OTPListener.bTerminate = true; + + HealthChecker.bTerminate = true; + + // Stop watchdog since task completed successfully + watchdog.stop(); + + System.exit(0); + + } + + public static void suiteSetup(String runType) { + if (ResidentConfigManager.IsDebugEnabled()) + LOGGER.setLevel(Level.ALL); + else + LOGGER.info("Test Framework for Mosip api Initialized"); + BaseTestCase.initialize(); + LOGGER.info("Done with BeforeSuite and test case setup! su TEST EXECUTION!\n\n"); + + if (!runType.equalsIgnoreCase("JAR")) { + AuthTestsUtil.removeOldMosipTempTestResource(); + } + BaseTestCase.currentModule = GlobalConstants.RESIDENT; + BaseTestCase.certsForModule = GlobalConstants.RESIDENT; + DBManager.executeDBQueries(ResidentConfigManager.getKMDbUrl(), ResidentConfigManager.getKMDbUser(), + ResidentConfigManager.getKMDbPass(), ResidentConfigManager.getKMDbSchema(), + getGlobalResourcePath() + "/" + "config/keyManagerCertDataDeleteQueries.txt"); + DBManager.executeDBQueries(ResidentConfigManager.getIdaDbUrl(), ResidentConfigManager.getIdaDbUser(), + ResidentConfigManager.getPMSDbPass(), ResidentConfigManager.getIdaDbSchema(), + getGlobalResourcePath() + "/" + "config/idaCertDataDeleteQueries.txt"); + DBManager.executeDBQueries(ResidentConfigManager.getMASTERDbUrl(), ResidentConfigManager.getMasterDbUser(), + ResidentConfigManager.getMasterDbPass(), ResidentConfigManager.getMasterDbSchema(), + getGlobalResourcePath() + "/" + "config/masterDataCertDataDeleteQueries.txt"); + + DBManager.executeDBQueries(ResidentConfigManager.getIdRepoDbUrl(), ResidentConfigManager.getIdRepoDbUser(), + ResidentConfigManager.getPMSDbPass(), "idrepo", + getGlobalResourcePath() + "/" + "config/idrepoCertDataDeleteQueries.txt"); + AdminTestUtil.copyResidentTestResource(); + BaseTestCase.otpListener = new OTPListener(); + BaseTestCase.otpListener.run(); + } + + private static void setLogLevels() { + AdminTestUtil.setLogLevel(); + OutputValidationUtil.setLogLevel(); + PartnerRegistration.setLogLevel(); + KeyCloakUserAndAPIKeyGeneration.setLogLevel(); + MispPartnerAndLicenseKeyGeneration.setLogLevel(); + JWKKeyUtil.setLogLevel(); + CertsUtil.setLogLevel(); + KernelAuthentication.setLogLevel(); + BaseTestCase.setLogLevel(); + ResidentUtil.setLogLevel(); + KeycloakUserManager.setLogLevel(); + DBManager.setLogLevel(); + BiometricDataProvider.setLogLevel(); + } + + /** + * The method to start mosip testng execution + * + * @throws IOException + */ + public static void startTestRunner() { + File homeDir = null; + String os = System.getProperty("os.name"); + LOGGER.info(os); + if (getRunType().contains("IDE") || os.toLowerCase().contains("windows")) { + homeDir = new File(System.getProperty("user.dir") + "/testNgXmlFiles"); + LOGGER.info("IDE :" + homeDir); + } else { + File dir = new File(System.getProperty("user.dir")); + homeDir = new File(dir.getParent() + "/mosip/testNgXmlFiles"); + LOGGER.info("ELSE :" + homeDir); + } + File[] files = homeDir.listFiles(); + if (files != null) { + + for (File file : files) { + TestNG runner = new TestNG(); + List suitefiles = new ArrayList<>(); + if (file.getName().toLowerCase().contains("mastertestsuite")) { + BaseTestCase.setReportName(GlobalConstants.RESIDENT); + suitefiles.add(file.getAbsolutePath()); + runner.setTestSuites(suitefiles); + System.getProperties().setProperty("testng.outpur.dir", "testng-report"); + runner.setOutputDirectory("testng-report"); + runner.run(); + } + } + } else { + LOGGER.error("No files found in directory: " + homeDir); + } + } + + public static String getGlobalResourcePath() { + if (cachedPath != null) { + return cachedPath; + } + + String path = null; + if (getRunType().equalsIgnoreCase("JAR")) { + path = new File(jarUrl).getParentFile().getAbsolutePath() + "/MosipTestResource/MosipTemporaryTestResource"; + } else if (getRunType().equalsIgnoreCase("IDE")) { + path = new File(MosipTestRunner.class.getClassLoader().getResource("").getPath()).getAbsolutePath() + + "/MosipTestResource/MosipTemporaryTestResource"; + if (path.contains(GlobalConstants.TESTCLASSES)) + path = path.replace(GlobalConstants.TESTCLASSES, "classes"); + } + + if (path != null) { + cachedPath = path; + return path; + } else { + return "Global Resource File Path Not Found"; + } + } + + public static String getResourcePath() { + return getGlobalResourcePath(); + } + + public static String generatePulicKey() { + String publicKey = null; + try { + KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA"); + keyGenerator.initialize(2048, BaseTestCase.secureRandom); + final KeyPair keypair = keyGenerator.generateKeyPair(); + publicKey = java.util.Base64.getEncoder().encodeToString(keypair.getPublic().getEncoded()); + } catch (NoSuchAlgorithmException e) { + LOGGER.error(e.getMessage()); + } + return publicKey; + } + + public static KeyPairGenerator keyPairGen = null; + + public static KeyPairGenerator getKeyPairGeneratorInstance() { + if (keyPairGen != null) + return keyPairGen; + try { + keyPairGen = KeyPairGenerator.getInstance("RSA"); + keyPairGen.initialize(2048); + + } catch (NoSuchAlgorithmException e) { + LOGGER.error(e.getMessage()); + } + + return keyPairGen; + } + + public static String generatePublicKeyForMimoto() { + + String vcString = ""; + try { + KeyPairGenerator keyPairGenerator = getKeyPairGeneratorInstance(); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + PublicKey publicKey = keyPair.getPublic(); + StringWriter stringWriter = new StringWriter(); + try (JcaPEMWriter pemWriter = new JcaPEMWriter(stringWriter)) { + pemWriter.writeObject(publicKey); + pemWriter.flush(); + vcString = stringWriter.toString(); + if (System.getProperty("os.name").toLowerCase().contains("windows")) { + vcString = vcString.replaceAll("\r\n", "\\\\n"); + } else { + vcString = vcString.replaceAll("\n", "\\\\n"); + } + } catch (Exception e) { + throw e; + } + } catch (Exception e) { + LOGGER.error(e.getMessage()); + } + return vcString; + } + + public static String generateJWKPublicKey() { + try { + KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA"); + keyGenerator.initialize(2048, BaseTestCase.secureRandom); + final KeyPair keypair = keyGenerator.generateKeyPair(); + RSAKey jwk = new RSAKey.Builder((RSAPublicKey) keypair.getPublic()).keyID("RSAKeyID") + .keyUse(KeyUse.SIGNATURE).privateKey(keypair.getPrivate()).build(); + + return jwk.toJSONString(); + } catch (NoSuchAlgorithmException e) { + LOGGER.error(e.getMessage()); + return null; + } + } + + public static Properties getproperty(String path) { + Properties prop = new Properties(); + FileInputStream inputStream = null; + try { + File file = new File(path); + inputStream = new FileInputStream(file); + prop.load(inputStream); + } catch (Exception e) { + LOGGER.error(GlobalConstants.EXCEPTION_STRING_2 + e.getMessage()); + } finally { + AdminTestUtil.closeInputStream(inputStream); + } + return prop; + } + + /** + * The method will return mode of application started either from jar or eclipse + * ide + * + * @return + */ + public static String getRunType() { + if (MosipTestRunner.class.getResource("MosipTestRunner.class").getPath().contains(".jar")) + return "JAR"; + else + return "IDE"; + } + +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AddIdentity.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AddIdentity.java new file mode 100644 index 00000000000..5f5c1457def --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AddIdentity.java @@ -0,0 +1,181 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +import javax.ws.rs.core.MediaType; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.testrunner.JsonPrecondtion; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.KernelAuthentication; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.RestClient; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class AddIdentity extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(AddIdentity.class); + protected String testCaseName = ""; + public Response response = null; + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + + } + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + testCaseDTO.setInputTemplate(AdminTestUtil.modifySchemaGenerateHbs(testCaseDTO.isRegenerateHbs())); + String uin = JsonPrecondtion + .getValueFromJson( + RestClient.getRequestWithCookie(ApplnURI + "/v1/idgenerator/uin", MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON, COOKIENAME, + new KernelAuthentication().getTokenByRole(testCaseDTO.getRole())).asString(), + "response.uin"); + DateFormat dateFormatter = new SimpleDateFormat("yyyyMMddHHmmss"); + Calendar cal = Calendar.getInstance(); + String timestampValue = dateFormatter.format(cal.getTime()); + String genRid = "27847" + generateRandomNumberString(10) + timestampValue; + + String jsonInput = testCaseDTO.getInput(); + + String inputJson = getJsonFromTemplate(jsonInput, testCaseDTO.getInputTemplate(), false); + + inputJson = inputJson.replace("$UIN$", uin); + inputJson = inputJson.replace("$RID$", genRid); + String phoneNumber = ""; + String email = testCaseName +"@mosip.net"; + if (inputJson.contains("$PHONENUMBERFORIDENTITY$")) { + + if (!phoneSchemaRegex.isEmpty()) + try { + phoneNumber = genStringAsperRegex(phoneSchemaRegex); + } catch (Exception e) { + logger.error(e.getMessage()); + } + + inputJson = replaceKeywordWithValue(inputJson, "$PHONENUMBERFORIDENTITY$", phoneNumber); + inputJson = replaceKeywordWithValue(inputJson, "$EMAILVALUE$", email); + } + + response = postWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), inputJson, COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + if (testCaseDTO.getTestCaseName().contains("_Pos")) { + writeAutoGeneratedId(testCaseDTO.getTestCaseName(), "UIN", uin); + writeAutoGeneratedId(testCaseDTO.getTestCaseName(), "RID", genRid); + writeAutoGeneratedId(testCaseDTO.getTestCaseName(), "EMAIL", testCaseDTO.getTestCaseName() + "@mosip.net"); + writeAutoGeneratedId(testCaseDTO.getTestCaseName(), "PHONE", phoneNumber); + } + if (!phoneNumber.isEmpty()) + writeAutoGeneratedId(testCaseDTO.getTestCaseName(), "PHONE", phoneNumber); + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } + + @AfterClass(alwaysRun = true) + public void waittime() { + + try { + logger.info( + "waiting for " + properties.getProperty("Delaytime") + " mili secs after UIN Generation In IDREPO"); + Thread.sleep(Long.parseLong(properties.getProperty("Delaytime"))); + } catch (Exception e) { + logger.error("Exception : " + e.getMessage()); + Thread.currentThread().interrupt(); + } + + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AuditValidator.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AuditValidator.java new file mode 100644 index 00000000000..ad842c975b9 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/AuditValidator.java @@ -0,0 +1,127 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dbaccess.DBManager; +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class AuditValidator extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(AuditValidator.class); + protected String testCaseName = ""; + public Response response = null; + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /* + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + String query = testCaseDTO.getEndPoint(); + logger.info(query); + Map response = DBManager.executeQueryAndGetRecord(testCaseDTO.getRole(), query); + + Map> objMap = new HashMap<>(); + List objList = new ArrayList<>(); + OutputValidationDto objOpDto = new OutputValidationDto(); + int BeforeAuditCount = ResidentUtil.ResidentAuditCount; + + if (response.size() > 0) { + ResidentUtil.ResidentAuditCount = ((Number) response.get("count")).intValue(); + + if (ResidentUtil.ResidentAuditCount > BeforeAuditCount) { + objOpDto.setStatus("PASS"); + + } else { + objOpDto.setStatus(GlobalConstants.FAIL_STRING); + } + + } else { + objOpDto.setStatus(GlobalConstants.FAIL_STRING); + } + + objList.add(objOpDto); + objMap.put(GlobalConstants.EXPECTED_VS_ACTUAL, objList); + + if (!OutputValidationUtil.publishOutputResult(objMap)) + throw new AdminTestException("Failed at output validation"); + } + + /* + * The method set current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/DeleteWithParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/DeleteWithParam.java new file mode 100644 index 00000000000..b0469b6307d --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/DeleteWithParam.java @@ -0,0 +1,151 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class DeleteWithParam extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(DeleteWithParam.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + * @throws SecurityXSSException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + + for (int i = 0; i < languageList.size(); i++) { + response = deleteWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + response = deleteWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParam.java new file mode 100644 index 00000000000..e9a80155f17 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParam.java @@ -0,0 +1,177 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class GetWithParam extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(GetWithParam.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + auditLogCheck = testCaseDTO.isAuditLogCheck(); + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getInputTemplate().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setInputTemplate(testCaseDTO.getInputTemplate().replace(GlobalConstants.$PRIMARYLANG$, + BaseTestCase.languageList.get(0))); + if (testCaseDTO.getOutputTemplate().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setOutputTemplate(testCaseDTO.getOutputTemplate().replace(GlobalConstants.$PRIMARYLANG$, + BaseTestCase.languageList.get(0))); + if (testCaseDTO.getInput().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setInput( + testCaseDTO.getInput().replace(GlobalConstants.$PRIMARYLANG$, BaseTestCase.languageList.get(0))); + if (testCaseDTO.getOutput().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setOutput( + testCaseDTO.getOutput().replace(GlobalConstants.$PRIMARYLANG$, BaseTestCase.languageList.get(0))); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = getWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + response = getWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), auditLogCheck, + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForAutoGenId.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForAutoGenId.java new file mode 100644 index 00000000000..bd4775a1ad7 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForAutoGenId.java @@ -0,0 +1,164 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class GetWithParamForAutoGenId extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(GetWithParamForAutoGenId.class); + protected String testCaseName = ""; + public String idKeyName = null; + public Response response = null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + idKeyName = context.getCurrentXmlTest().getLocalParameters().get("idKeyName"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + auditLogCheck = testCaseDTO.isAuditLogCheck(); + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = getWithPathParamAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } else { + response = getWithPathParamAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), auditLogCheck, + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName, sendEsignetToken); + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForDownloadCard.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForDownloadCard.java new file mode 100644 index 00000000000..54a83d9925b --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamForDownloadCard.java @@ -0,0 +1,143 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.lang.reflect.Field; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; + +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class GetWithParamForDownloadCard extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(GetWithParamForDownloadCard.class); + protected String testCaseName = ""; + public Response response = null; + public byte[] pdf=null; + public String pdfAsText =null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: "+ymlFile); + return getYmlTestData(ymlFile); + } + + + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws Exception + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException(GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + auditLogCheck = testCaseDTO.isAuditLogCheck(); + pdf = getWithPathParamAndCookieForPdf(ApplnURI + testCaseDTO.getEndPoint(), getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), auditLogCheck, COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + PdfReader pdfReader = null; + ByteArrayInputStream bIS = null; + try { + bIS = new ByteArrayInputStream(pdf); + pdfReader = new PdfReader(bIS); + pdfAsText = PdfTextExtractor.getTextFromPage(pdfReader, 1); + } catch (IOException e) { + Reporter.log("Exception : " + e.getMessage()); + } finally { + AdminTestUtil.closeByteArrayInputStream(bIS); + AdminTestUtil.closePdfReader(pdfReader); + } + + if(pdf!=null && (new String(pdf).contains("errors")|| pdfAsText == null)) { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), "Not able to download UIN Card"); + } + else { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), pdfAsText); + } + + + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamWithOtpGenerate.java new file mode 100644 index 00000000000..dd807d60fc9 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithParamWithOtpGenerate.java @@ -0,0 +1,225 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class GetWithParamWithOtpGenerate extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(GetWithParamWithOtpGenerate.class); + protected String testCaseName = ""; + public Response response = null; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + JSONObject req = new JSONObject(testCaseDTO.getInput()); + String otpRequest = null; + String sendOtpReqTemplate = null; + String sendOtpEndPoint = null; + if (req.has(GlobalConstants.SENDOTP)) { + otpRequest = req.get(GlobalConstants.SENDOTP).toString(); + req.remove(GlobalConstants.SENDOTP); + } + JSONObject otpReqJson = new JSONObject(otpRequest); + sendOtpReqTemplate = otpReqJson.getString("sendOtpReqTemplate"); + otpReqJson.remove("sendOtpReqTemplate"); + sendOtpEndPoint = otpReqJson.getString("sendOtpEndPoint"); + otpReqJson.remove("sendOtpEndPoint"); + + Response otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, GlobalConstants.RESIDENT, + testCaseDTO.getTestCaseName()); + + JSONObject res = new JSONObject(testCaseDTO.getOutput()); + String sendOtpResp = null; + String sendOtpResTemplate = null; + if (res.has(GlobalConstants.SENDOTPRESP)) { + sendOtpResp = res.get(GlobalConstants.SENDOTPRESP).toString(); + res.remove(GlobalConstants.SENDOTPRESP); + } + JSONObject sendOtpRespJson = new JSONObject(sendOtpResp); + sendOtpResTemplate = sendOtpRespJson.getString("sendOtpResTemplate"); + sendOtpRespJson.remove("sendOtpResTemplate"); + Map> ouputValidOtp = OutputValidationUtil.doJsonOutputValidation( + otpResponse.asString(), getJsonFromTemplate(sendOtpRespJson.toString(), sendOtpResTemplate), + testCaseDTO, otpResponse.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValidOtp)); + + if (!OutputValidationUtil.publishOutputResult(ouputValidOtp)) { + if (otpResponse.asString().contains("IDA-OTA-001")) + throw new AdminTestException( + "Exceeded number of OTP requests in a given time, Increase otp.request.flooding.max-count"); + else + throw new AdminTestException("Failed at otp output validation"); + } + + JSONObject reqvOtp = new JSONObject(testCaseDTO.getInput()); + JSONObject reqvtOtp = (JSONObject) reqvOtp.get(GlobalConstants.SENDOTP); + String otpValidationRequest = null; + String validateOtpReqTemplate = null; + String validateOtpEndPoint = null; + + if (!reqvtOtp.isNull(GlobalConstants.VALIDATEOTP)) { + otpValidationRequest = reqvtOtp.get(GlobalConstants.VALIDATEOTP).toString(); + reqvOtp.remove(GlobalConstants.VALIDATEOTP); + } + JSONObject validateOtpReqJson = new JSONObject(otpValidationRequest); + validateOtpReqTemplate = validateOtpReqJson.getString("validateOtpReqTemplate"); + validateOtpReqJson.remove("validateOtpReqTemplate"); + validateOtpEndPoint = validateOtpReqJson.getString("validateOtpEndPoint"); + validateOtpReqJson.remove("validateOtpEndPoint"); + + Response validateOtpResponse = postWithBodyAndCookie(ApplnURI + validateOtpEndPoint, + getJsonFromTemplate(validateOtpReqJson.toString(), validateOtpReqTemplate), COOKIENAME, + GlobalConstants.RESIDENT, testCaseDTO.getTestCaseName()); + + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getInputTemplate().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setInputTemplate(testCaseDTO.getInputTemplate().replace(GlobalConstants.$PRIMARYLANG$, + BaseTestCase.languageList.get(0))); + if (testCaseDTO.getOutputTemplate().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setOutputTemplate(testCaseDTO.getOutputTemplate().replace(GlobalConstants.$PRIMARYLANG$, + BaseTestCase.languageList.get(0))); + if (testCaseDTO.getInput().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setInput( + testCaseDTO.getInput().replace(GlobalConstants.$PRIMARYLANG$, BaseTestCase.languageList.get(0))); + if (testCaseDTO.getOutput().contains(GlobalConstants.$PRIMARYLANG$)) + testCaseDTO.setOutput( + testCaseDTO.getOutput().replace(GlobalConstants.$PRIMARYLANG$, BaseTestCase.languageList.get(0))); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + languageList = Arrays.asList(System.getProperty("env.langcode").split(",")); + for (int i = 0; i < languageList.size(); i++) { + response = getWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + response = getWithPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithQueryParamForDownloadCard.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithQueryParamForDownloadCard.java new file mode 100644 index 00000000000..5f5ea94982e --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/GetWithQueryParamForDownloadCard.java @@ -0,0 +1,177 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; + +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class GetWithQueryParamForDownloadCard extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(GetWithQueryParamForDownloadCard.class); + protected String testCaseName = ""; + public Response response = null; + public byte[] pdf=null; + public String pdfAsText =null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: "+ymlFile); + return getYmlTestData(ymlFile); + } + + + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws Exception + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws Exception, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException(GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + pdf = getWithQueryParamAndCookieForPdf(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + PdfReader pdfReader = null; + ByteArrayInputStream bIS = null; + + try { + bIS = new ByteArrayInputStream(pdf); + pdfReader = new PdfReader(bIS); + pdfAsText = PdfTextExtractor.getTextFromPage(pdfReader, 1); + } catch (IOException e) { + Reporter.log("Exception : " + e.getMessage()); + } finally { + AdminTestUtil.closeByteArrayInputStream(bIS); + AdminTestUtil.closePdfReader(pdfReader); + } + + if (pdf != null && (new String(pdf).contains("errors") || pdfAsText == null)) { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), "Not able to download"); + } else { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), pdfAsText); + } + } + } + + else { + pdf = getWithQueryParamAndCookieForPdf(ApplnURI + testCaseDTO.getEndPoint(), getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + + PdfReader pdfReader = null; + ByteArrayInputStream bIS = null; + + try { + bIS = new ByteArrayInputStream(pdf); + pdfReader = new PdfReader(bIS); + pdfAsText = PdfTextExtractor.getTextFromPage(pdfReader, 1); + } catch (IOException e) { + Reporter.log("Exception : " + e.getMessage()); + } finally { + AdminTestUtil.closeByteArrayInputStream(bIS); + AdminTestUtil.closePdfReader(pdfReader); + } + + if(pdf!=null && (new String(pdf).contains("errors")|| pdfAsText == null)) { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), "Not able to download"); + } + else { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), pdfAsText); + } + } + + + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log(GlobalConstants.EXCEPTION + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PatchWithBodyWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PatchWithBodyWithOtpGenerate.java new file mode 100644 index 00000000000..966093b2299 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PatchWithBodyWithOtpGenerate.java @@ -0,0 +1,163 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PatchWithBodyWithOtpGenerate extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PatchWithBodyWithOtpGenerate.class); + protected String testCaseName = ""; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + JSONObject req = new JSONObject(testCaseDTO.getInput()); + String otpRequest = null, sendOtpReqTemplate = null, sendOtpEndPoint = null; + if (req.has(GlobalConstants.SENDOTP)) { + otpRequest = req.get(GlobalConstants.SENDOTP).toString(); + req.remove(GlobalConstants.SENDOTP); + } + JSONObject otpReqJson = new JSONObject(otpRequest); + sendOtpReqTemplate = otpReqJson.getString("sendOtpReqTemplate"); + otpReqJson.remove("sendOtpReqTemplate"); + sendOtpEndPoint = otpReqJson.getString("sendOtpEndPoint"); + otpReqJson.remove("sendOtpEndPoint"); + + Response otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, GlobalConstants.RESIDENT, + testCaseDTO.getTestCaseName()); + + JSONObject res = new JSONObject(testCaseDTO.getOutput()); + String sendOtpResp = null, sendOtpResTemplate = null; + if (res.has(GlobalConstants.SENDOTPRESP)) { + sendOtpResp = res.get(GlobalConstants.SENDOTPRESP).toString(); + res.remove(GlobalConstants.SENDOTPRESP); + } + JSONObject sendOtpRespJson = new JSONObject(sendOtpResp); + sendOtpResTemplate = sendOtpRespJson.getString("sendOtpResTemplate"); + sendOtpRespJson.remove("sendOtpResTemplate"); + Map> ouputValidOtp = OutputValidationUtil.doJsonOutputValidation( + otpResponse.asString(), getJsonFromTemplate(sendOtpRespJson.toString(), sendOtpResTemplate), + testCaseDTO, otpResponse.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValidOtp)); + + if (!OutputValidationUtil.publishOutputResult(ouputValidOtp)) { + if (otpResponse.asString().contains("IDA-OTA-001")) + throw new AdminTestException( + "Exceeded number of OTP requests in a given time, Increase otp.request.flooding.max-count"); + else + throw new AdminTestException("Failed at otp output validation"); + } + + Response response = patchRequestWithCookieAndHeader(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(req.toString(), testCaseDTO.getInputTemplate()), COOKIENAME, testCaseDTO.getRole(), + testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(res.toString(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithAutogenIdWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithAutogenIdWithOtpGenerate.java new file mode 100644 index 00000000000..598edaa8579 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithAutogenIdWithOtpGenerate.java @@ -0,0 +1,240 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithAutogenIdWithOtpGenerate extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithAutogenIdWithOtpGenerate.class); + protected String testCaseName = ""; + public String idKeyName = null; + public Response response = null; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + idKeyName = context.getCurrentXmlTest().getLocalParameters().get("idKeyName"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + * @throws InterruptedException + * @throws NumberFormatException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) + throws AuthenticationTestException, AdminTestException, NumberFormatException, InterruptedException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + JSONObject req = new JSONObject(testCaseDTO.getInput()); + + auditLogCheck = testCaseDTO.isAuditLogCheck(); + String otpRequest = null; + String sendOtpReqTemplate = null; + String sendOtpEndPoint = null; + if (req.has(GlobalConstants.SENDOTP)) { + otpRequest = req.get(GlobalConstants.SENDOTP).toString(); + req.remove(GlobalConstants.SENDOTP); + } + JSONObject otpReqJson = new JSONObject(otpRequest); + sendOtpReqTemplate = otpReqJson.getString("sendOtpReqTemplate"); + otpReqJson.remove("sendOtpReqTemplate"); + sendOtpEndPoint = otpReqJson.getString("sendOtpEndPoint"); + otpReqJson.remove("sendOtpEndPoint"); + + Response otpResponse = null; + int maxLoopCount = Integer.parseInt(properties.getProperty("uinGenMaxLoopCount")); + int currLoopCount = 0; + while (currLoopCount < maxLoopCount) { + if (testCaseName.contains(GlobalConstants.ESIGNET_)) { + if (ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) { + throw new SkipException("esignet is not deployed hence skipping the testcase"); + } + String tempUrl = ResidentConfigManager.getEsignetBaseUrl(); + otpResponse = postRequestWithCookieAuthHeaderAndXsrfToken(tempUrl + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, + testCaseDTO.getTestCaseName()); + } else { + otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, + GlobalConstants.RESIDENT, testCaseDTO.getTestCaseName()); + } + + if (otpResponse != null && otpResponse.asString().contains("IDA-MLC-018") + && !(testCaseName.contains("_CheckVidIs_REVOKED_Neg"))) { + logger.info("waiting for: " + properties.getProperty("uinGenDelayTime") + + " as UIN not available in database"); + try { + Thread.sleep(Long.parseLong(properties.getProperty("uinGenDelayTime"))); + } catch (NumberFormatException | InterruptedException e) { + logger.error(e.getMessage()); + Thread.currentThread().interrupt(); + } + } else { + break; + } + + currLoopCount++; + } + + JSONObject res = new JSONObject(testCaseDTO.getOutput()); + String sendOtpResp = null; + String sendOtpResTemplate = null; + if (res.has(GlobalConstants.SENDOTPRESP)) { + sendOtpResp = res.get(GlobalConstants.SENDOTPRESP).toString(); + res.remove(GlobalConstants.SENDOTPRESP); + } + JSONObject sendOtpRespJson = new JSONObject(sendOtpResp); + sendOtpResTemplate = sendOtpRespJson.getString("sendOtpResTemplate"); + sendOtpRespJson.remove("sendOtpResTemplate"); + if (otpResponse != null) { + Map> ouputValidOtp = OutputValidationUtil.doJsonOutputValidation( + otpResponse.asString(), getJsonFromTemplate(sendOtpRespJson.toString(), sendOtpResTemplate), + testCaseDTO, otpResponse.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValidOtp)); + + if (!OutputValidationUtil.publishOutputResult(ouputValidOtp)) { + if (otpResponse.asString().contains("IDA-OTA-001")) { + throw new AdminTestException( + "Exceeded number of OTP requests in a given time, Increase otp.request.flooding.max-count"); + } + + else + throw new AdminTestException("Failed at otp output validation"); + } + + } else { + throw new AdminTestException("Invalid otp response"); + } + + if (testCaseName.contains(GlobalConstants.ESIGNET_)) { + if (ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) { + throw new SkipException("esignet is not deployed hence skipping the testcase"); + } + String tempUrl = ResidentConfigManager.getEsignetBaseUrl(); + response = postRequestWithCookieAuthHeaderAndXsrfTokenForAutoGenId(tempUrl + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getTestCaseName(), idKeyName); + } else { + response = postWithBodyAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), auditLogCheck, + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName); + } + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(res.toString(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } + + @AfterClass(alwaysRun = true) + public void waittime() { + try { + if ((!testCaseName.contains(GlobalConstants.ESIGNET_)) + && (!testCaseName.contains("Resident_CheckAidStatus"))) { + long delayTime = Long.parseLong(properties.getProperty("Delaytime")); + logger.info("waiting for " + delayTime + " mili secs after VID Generation In RESIDENT SERVICES"); + Thread.sleep(delayTime); + } + } catch (Exception e) { + logger.error("Exception : " + e.getMessage()); + Thread.currentThread().interrupt(); + } + + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerate.java new file mode 100644 index 00000000000..581b1c743b6 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerate.java @@ -0,0 +1,210 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithBodyWithOtpGenerate extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithBodyWithOtpGenerate.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + auditLogCheck = testCaseDTO.isAuditLogCheck(); + JSONObject req = new JSONObject(testCaseDTO.getInput()); + String otpRequest = null; + String sendOtpReqTemplate = null; + String sendOtpEndPoint = null; + if (req.has(GlobalConstants.SENDOTP)) { + otpRequest = req.get(GlobalConstants.SENDOTP).toString(); + req.remove(GlobalConstants.SENDOTP); + } + JSONObject otpReqJson = new JSONObject(otpRequest); + sendOtpReqTemplate = otpReqJson.getString("sendOtpReqTemplate"); + otpReqJson.remove("sendOtpReqTemplate"); + sendOtpEndPoint = otpReqJson.getString("sendOtpEndPoint"); + otpReqJson.remove("sendOtpEndPoint"); + Response otpResponse = null; + int maxLoopCount = Integer.parseInt(properties.getProperty("uinGenMaxLoopCount")); + int currLoopCount = 0; + while (currLoopCount < maxLoopCount) { + if (testCaseDTO.getRole().equalsIgnoreCase(GlobalConstants.RESIDENTNEW)) { + otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), auditLogCheck, COOKIENAME, + GlobalConstants.RESIDENTNEW, testCaseDTO.getTestCaseName(), sendEsignetToken); + } else if (testCaseDTO.getRole().equalsIgnoreCase("residentNewVid")) { + otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), auditLogCheck, COOKIENAME, + "residentNewVid", testCaseDTO.getTestCaseName(), sendEsignetToken); + } else { + otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, + GlobalConstants.RESIDENT, testCaseDTO.getTestCaseName()); + } + + if (otpResponse != null && (otpResponse.asString().contains("RES-SER-524") + || otpResponse.asString().contains("RES-SER-525"))) { + logger.info("waiting for: " + properties.getProperty("uinGenDelayTime") + + " to update UIN as previous packet is pending."); + try { + Thread.sleep(Long.parseLong(properties.getProperty("uinGenDelayTime"))); + + } catch (NumberFormatException | InterruptedException e) { + logger.error(e.getMessage()); + Thread.currentThread().interrupt(); + } + } else { + break; + } + + currLoopCount++; + } + + JSONObject res = new JSONObject(testCaseDTO.getOutput()); + String sendOtpResp = null, sendOtpResTemplate = null; + if (res.has(GlobalConstants.SENDOTPRESP)) { + sendOtpResp = res.get(GlobalConstants.SENDOTPRESP).toString(); + res.remove(GlobalConstants.SENDOTPRESP); + } + JSONObject sendOtpRespJson = new JSONObject(sendOtpResp); + sendOtpResTemplate = sendOtpRespJson.getString("sendOtpResTemplate"); + sendOtpRespJson.remove("sendOtpResTemplate"); + Map> ouputValidOtp = OutputValidationUtil.doJsonOutputValidation( + otpResponse.asString(), getJsonFromTemplate(sendOtpRespJson.toString(), sendOtpResTemplate), + testCaseDTO, otpResponse.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValidOtp)); + + if (!OutputValidationUtil.publishOutputResult(ouputValidOtp)) { + if (otpResponse.asString().contains("IDA-OTA-001")) + throw new AdminTestException( + "Exceeded number of OTP requests in a given time, Increase otp.request.flooding.max-count"); + else + throw new AdminTestException("Failed at otp output validation"); + } + + if (testCaseName.contains("_eotp")) { + try { + logger.info("waiting for " + properties.getProperty("expireOtpTime") + + " mili secs to test expire otp case in RESIDENT Service"); + Thread.sleep(Long.parseLong(properties.getProperty("expireOtpTime"))); + } catch (NumberFormatException | InterruptedException e) { + logger.error(e.getMessage()); + Thread.currentThread().interrupt(); + } + } + + response = postRequestWithCookieAndHeader(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(req.toString(), testCaseDTO.getInputTemplate()), COOKIENAME, testCaseDTO.getRole(), + testCaseDTO.getTestCaseName(), sendEsignetToken); + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), getJsonFromTemplate(res.toString(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerateAndPdfDownload.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerateAndPdfDownload.java new file mode 100644 index 00000000000..60ef1693288 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithOtpGenerateAndPdfDownload.java @@ -0,0 +1,181 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithBodyWithOtpGenerateAndPdfDownload extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithBodyWithOtpGenerateAndPdfDownload.class); + protected String testCaseName = ""; + public Response response = null; + public byte[] pdf = null; + public String pdfAsText = null; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + JSONObject req = new JSONObject(testCaseDTO.getInput()); + String otpRequest = null; + String sendOtpReqTemplate = null; + String sendOtpEndPoint = null; + if (req.has(GlobalConstants.SENDOTP)) { + otpRequest = req.get(GlobalConstants.SENDOTP).toString(); + req.remove(GlobalConstants.SENDOTP); + } + JSONObject otpReqJson = new JSONObject(otpRequest); + sendOtpReqTemplate = otpReqJson.getString("sendOtpReqTemplate"); + otpReqJson.remove("sendOtpReqTemplate"); + sendOtpEndPoint = otpReqJson.getString("sendOtpEndPoint"); + otpReqJson.remove("sendOtpEndPoint"); + + Response otpResponse = postWithBodyAndCookie(ApplnURI + sendOtpEndPoint, + getJsonFromTemplate(otpReqJson.toString(), sendOtpReqTemplate), COOKIENAME, GlobalConstants.RESIDENT, + testCaseDTO.getTestCaseName()); + + JSONObject res = new JSONObject(testCaseDTO.getOutput()); + String sendOtpResp = null, sendOtpResTemplate = null; + if (res.has(GlobalConstants.SENDOTPRESP)) { + sendOtpResp = res.get(GlobalConstants.SENDOTPRESP).toString(); + res.remove(GlobalConstants.SENDOTPRESP); + } + JSONObject sendOtpRespJson = new JSONObject(sendOtpResp); + sendOtpResTemplate = sendOtpRespJson.getString("sendOtpResTemplate"); + sendOtpRespJson.remove("sendOtpResTemplate"); + Map> ouputValidOtp = OutputValidationUtil.doJsonOutputValidation( + otpResponse.asString(), getJsonFromTemplate(sendOtpRespJson.toString(), sendOtpResTemplate), + testCaseDTO, otpResponse.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValidOtp)); + + if (!OutputValidationUtil.publishOutputResult(ouputValidOtp)) + throw new AdminTestException("Failed at otp output validation"); + + pdf = postWithBodyAndCookieForPdf(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + PdfReader pdfReader = null; + ByteArrayInputStream bIS = null; + + try { + bIS = new ByteArrayInputStream(pdf); + pdfReader = new PdfReader(bIS); + pdfAsText = PdfTextExtractor.getTextFromPage(pdfReader, 1); + } catch (IOException e) { + Reporter.log("Exception : " + e.getMessage()); + } finally { + AdminTestUtil.closeByteArrayInputStream(bIS); + AdminTestUtil.closePdfReader(pdfReader); + } + + if (pdf != null && (new String(pdf).contains("errors") || pdfAsText == null)) { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), "Not able to download UIN Card"); + } else { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), pdfAsText); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithPdfDownload.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithPdfDownload.java new file mode 100644 index 00000000000..ebc3e6739d9 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithBodyWithPdfDownload.java @@ -0,0 +1,142 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.lang.reflect.Field; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; + +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithBodyWithPdfDownload extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithBodyWithPdfDownload.class); + protected String testCaseName = ""; + public Response response = null; + public byte[] pdf=null; + public String pdfAsText =null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: "+ymlFile); + return getYmlTestData(ymlFile); + } + + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException(GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + pdf = postWithBodyAndCookieForPdf(ApplnURI + testCaseDTO.getEndPoint(), getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + PdfReader pdfReader = null; + ByteArrayInputStream bIS = null; + + try { + bIS = new ByteArrayInputStream(pdf); + pdfReader = new PdfReader(bIS); + pdfAsText = PdfTextExtractor.getTextFromPage(pdfReader, 1); + } catch (IOException e) { + Reporter.log("Exception : " + e.getMessage()); + } finally { + AdminTestUtil.closeByteArrayInputStream(bIS); + AdminTestUtil.closePdfReader(pdfReader); + } + + if(pdf!=null && (new String(pdf).contains("errors")|| pdfAsText == null)) { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), "Not able to download UIN Card"); + } + else { + GlobalMethods.reportResponse(null, ApplnURI + testCaseDTO.getEndPoint(), pdfAsText); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithOnlyPathParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithOnlyPathParam.java new file mode 100644 index 00000000000..7d699071d52 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithOnlyPathParam.java @@ -0,0 +1,164 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithOnlyPathParam extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithOnlyPathParam.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + String[] templateFields = testCaseDTO.getTemplateFields(); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = postWithOnlyPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + response = postWithOnlyPathParamAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithParamAndFile.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithParamAndFile.java new file mode 100644 index 00000000000..ab99b8c7a83 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/PostWithParamAndFile.java @@ -0,0 +1,143 @@ + +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class PostWithParamAndFile extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(PostWithParamAndFile.class); + protected String testCaseName = ""; + public String idKeyName = null; + public Response response = null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + idKeyName = context.getCurrentXmlTest().getLocalParameters().get("idKeyName"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + String inputJson = getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()); + + response = postWithParamAndFile(ApplnURI + testCaseDTO.getEndPoint(), inputJson, testCaseDTO.getRole(), + testCaseDTO.getTestCaseName(), idKeyName, sendEsignetToken); + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePatch.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePatch.java new file mode 100644 index 00000000000..76e8e75f8b6 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePatch.java @@ -0,0 +1,164 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class SimplePatch extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(SimplePatch.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + String[] templateFields = testCaseDTO.getTemplateFields(); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = patchWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + response = patchWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePost.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePost.java new file mode 100644 index 00000000000..37859add9f0 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePost.java @@ -0,0 +1,201 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class SimplePost extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(SimplePost.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AuthenticationTestException, AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + auditLogCheck = testCaseDTO.isAuditLogCheck(); + String[] templateFields = testCaseDTO.getTemplateFields(); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + String inputJson = getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()); + if (testCaseName.contains("CreateIdSchema")) { + inputJson = modifyIdSchemaInputJson(inputJson); + } + + if (inputJson.contains(""")) { + inputJson = inputJson.replace(""", "\""); + } + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = postWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } + + else { + int maxLoopCount = Integer.parseInt(properties.getProperty("uinGenMaxLoopCount")); + int currLoopCount = 0; + while (currLoopCount < maxLoopCount) { + response = postWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), inputJson, auditLogCheck, + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + + if (response != null && (response.asString().contains("RES-SER-524") + || response.asString().contains("RES-SER-525"))) { + logger.info("waiting for: " + properties.getProperty("uinGenDelayTime") + + " to update UIN as previous packet is pending."); + try { + Thread.sleep(Long.parseLong(properties.getProperty("uinGenDelayTime"))); + + } catch (NumberFormatException | InterruptedException e) { + logger.error(e.getMessage()); + Thread.currentThread().interrupt(); + } + } else { + break; + } + + currLoopCount++; + } + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) { + if (response.asString().contains("IDA-OTA-001")) + throw new AdminTestException( + "Exceeded number of OTP requests in a given time, Increase otp.request.flooding.max-count"); + else + throw new AdminTestException("Failed at otp output validation"); + } + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenId.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenId.java new file mode 100644 index 00000000000..d391456ab73 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenId.java @@ -0,0 +1,191 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class SimplePostForAutoGenId extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(SimplePostForAutoGenId.class); + protected String testCaseName = ""; + public String idKeyName = null; + public Response response = null; + public boolean sendEsignetToken = false; + public boolean auditLogCheck = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + idKeyName = context.getCurrentXmlTest().getLocalParameters().get("idKeyName"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + * @throws NoSuchAlgorithmException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) + throws AuthenticationTestException, AdminTestException, NoSuchAlgorithmException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + String[] templateFields = testCaseDTO.getTemplateFields(); + String inputJson = ""; + + inputJson = getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()); + + inputJson = ResidentUtil.inputstringKeyWordHandeler(inputJson, testCaseName); + + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = postWithBodyAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + if (testCaseDTO.getTestCaseName().toLowerCase().contains("dynamic")) { + JSONObject json = new JSONObject(response.asString()); + idField = json.getJSONObject("response").get("id").toString(); + } + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } else { + if (testCaseName.contains("ESignet_")) { + if (ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) { + throw new SkipException("esignet is not deployed hence skipping the testcase"); + } + String tempUrl = ResidentConfigManager.getEsignetBaseUrl(); + if (testCaseName.contains("_AuthorizationCode_")) { + response = postRequestWithCookieAuthHeaderAndXsrfTokenForAutoGenId( + tempUrl + testCaseDTO.getEndPoint(), inputJson, COOKIENAME, testCaseDTO.getTestCaseName(), + idKeyName); + } else { + response = postWithBodyAndBearerTokenForAutoGeneratedId(tempUrl + testCaseDTO.getEndPoint(), + inputJson, COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName); + } + } else { + response = postWithBodyAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), inputJson, + auditLogCheck, COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName, + sendEsignetToken); + } + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenIdForUrlEncoded.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenIdForUrlEncoded.java new file mode 100644 index 00000000000..a1602fcab5a --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePostForAutoGenIdForUrlEncoded.java @@ -0,0 +1,179 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class SimplePostForAutoGenIdForUrlEncoded extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(SimplePostForAutoGenIdForUrlEncoded.class); + protected String testCaseName = ""; + public String idKeyName = null; + public Response response = null; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + idKeyName = context.getCurrentXmlTest().getLocalParameters().get("idKeyName"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + * @throws NoSuchAlgorithmException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) + throws AuthenticationTestException, AdminTestException, NoSuchAlgorithmException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + if (ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) { + throw new SkipException("esignet is not deployed hence skipping the testcase"); + } + String[] templateFields = testCaseDTO.getTemplateFields(); + + String inputJson = getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()); + String outputJson = getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()); + + inputJson = ResidentUtil.inputstringKeyWordHandeler(inputJson, testCaseName); + + String jsonInput = inputJsonKeyWordHandeler(inputJson, testCaseName); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + for (int i = 0; i < languageList.size(); i++) { + response = postWithBodyAndCookieForAutoGeneratedId(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), idKeyName); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + if (testCaseDTO.getTestCaseName().toLowerCase().contains("dynamic")) { + JSONObject json = new JSONObject(response.asString()); + idField = json.getJSONObject("response").get("id").toString(); + } + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } else { + if (testCaseName.contains("ESignet_")) { + String tempUrl = ResidentConfigManager.getEsignetBaseUrl(); + String endPoint = tempUrl + testCaseDTO.getEndPoint(); + if (testCaseDTO.getEndPoint().contains("$GETENDPOINTFROMRESIDENTACTUATOR$") + && BaseTestCase.currentModule.equalsIgnoreCase("resident")) { + endPoint = getValueFromActuator("mosip-config/resident-default.properties", + "mosip.iam.token_endpoint"); + } + response = postWithBodyAndCookieForAutoGeneratedIdForUrlEncoded(endPoint, jsonInput, + testCaseDTO.getTestCaseName(), idKeyName); + + } else { + response = postWithBodyAndCookieForAutoGeneratedIdForUrlEncoded(ApplnURI + testCaseDTO.getEndPoint(), + jsonInput, testCaseDTO.getTestCaseName(), idKeyName); + } + + Map> ouputValid = OutputValidationUtil + .doJsonOutputValidation(response.asString(), outputJson, testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePut.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePut.java new file mode 100644 index 00000000000..24c1f705293 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/testscripts/SimplePut.java @@ -0,0 +1,166 @@ +package io.mosip.testrig.apirig.resident.testscripts; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONObject; +import org.testng.ITest; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.Reporter; +import org.testng.SkipException; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.internal.BaseTestMethod; +import org.testng.internal.TestResult; + +import io.mosip.testrig.apirig.dto.OutputValidationDto; +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.utils.ResidentConfigManager; +import io.mosip.testrig.apirig.resident.utils.ResidentUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.utils.AdminTestException; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthenticationTestException; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.OutputValidationUtil; +import io.mosip.testrig.apirig.utils.ReportUtil; +import io.mosip.testrig.apirig.utils.SecurityXSSException; +import io.restassured.response.Response; + +public class SimplePut extends ResidentUtil implements ITest { + private static final Logger logger = Logger.getLogger(SimplePut.class); + protected String testCaseName = ""; + public Response response = null; + public boolean sendEsignetToken = false; + + @BeforeClass + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + /** + * get current testcaseName + */ + @Override + public String getTestName() { + return testCaseName; + } + + /** + * Data provider class provides test case list + * + * @return object of data provider + */ + @DataProvider(name = "testcaselist") + public Object[] getTestCaseList(ITestContext context) { + String ymlFile = context.getCurrentXmlTest().getLocalParameters().get("ymlFile"); + sendEsignetToken = context.getCurrentXmlTest().getLocalParameters().containsKey("sendEsignetToken"); + logger.info("Started executing yml: " + ymlFile); + return getYmlTestData(ymlFile); + } + + /** + * Test method for OTP Generation execution + * + * @param objTestParameters + * @param testScenario + * @param testcaseName + * @throws AuthenticationTestException + * @throws AdminTestException + */ + @Test(dataProvider = "testcaselist") + public void test(TestCaseDTO testCaseDTO) throws AdminTestException, SecurityXSSException { + testCaseName = testCaseDTO.getTestCaseName(); + testCaseName = ResidentUtil.isTestCaseValidForExecution(testCaseDTO); + if (HealthChecker.signalTerminateExecution) { + throw new SkipException( + GlobalConstants.TARGET_ENV_HEALTH_CHECK_FAILED + HealthChecker.healthCheckFailureMapS); + } + + if (testCaseDTO.getTestCaseName().contains("VID") || testCaseDTO.getTestCaseName().contains("Vid")) { + if (!BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && !BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException(GlobalConstants.VID_FEATURE_NOT_SUPPORTED); + } + } + + String[] templateFields = testCaseDTO.getTemplateFields(); + + if (testCaseDTO.getTemplateFields() != null && templateFields.length > 0) { + ArrayList inputtestCases = AdminTestUtil.getInputTestCase(testCaseDTO); + ArrayList outputtestcase = AdminTestUtil.getOutputTestCase(testCaseDTO); + + languageList = new ArrayList<>(BaseTestCase.languageList); + for (int i = 0; i < languageList.size(); i++) { + response = putWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(inputtestCases.get(i).toString(), testCaseDTO.getInputTemplate()), + COOKIENAME, testCaseDTO.getRole(), testCaseDTO.getTestCaseName()); + + Map> ouputValid = OutputValidationUtil.doJsonOutputValidation( + response.asString(), + getJsonFromTemplate(outputtestcase.get(i).toString(), testCaseDTO.getOutputTemplate()), + testCaseDTO, response.getStatusCode()); + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + } else { + response = putWithBodyAndCookie(ApplnURI + testCaseDTO.getEndPoint(), + getJsonFromTemplate(testCaseDTO.getInput(), testCaseDTO.getInputTemplate()), COOKIENAME, + testCaseDTO.getRole(), testCaseDTO.getTestCaseName(), sendEsignetToken); + + Map> ouputValid = null; + if (testCaseName.contains("_StatusCode")) { + + OutputValidationDto customResponse = customStatusCodeResponse(String.valueOf(response.getStatusCode()), + testCaseDTO.getOutput()); + + ouputValid = new HashMap<>(); + ouputValid.put(GlobalConstants.EXPECTED_VS_ACTUAL, List.of(customResponse)); + } else { + ouputValid = OutputValidationUtil.doJsonOutputValidation(response.asString(), + getJsonFromTemplate(testCaseDTO.getOutput(), testCaseDTO.getOutputTemplate()), testCaseDTO, + response.getStatusCode()); + } + + Reporter.log(ReportUtil.getOutputValidationReport(ouputValid)); + + if (!OutputValidationUtil.publishOutputResult(ouputValid)) + throw new AdminTestException("Failed at output validation"); + } + + } + + /** + * The method ser current test name to result + * + * @param result + */ + @AfterMethod(alwaysRun = true) + public void setResultTestName(ITestResult result) { + try { + Field method = TestResult.class.getDeclaredField("m_method"); + method.setAccessible(true); + method.set(result, result.getMethod().clone()); + BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod(); + Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName"); + f.setAccessible(true); + f.set(baseTestMethod, testCaseName); + } catch (Exception e) { + Reporter.log("Exception : " + e.getMessage()); + } + } +} diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentConfigManager.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentConfigManager.java new file mode 100644 index 00000000000..54300cf4cf2 --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentConfigManager.java @@ -0,0 +1,38 @@ +package io.mosip.testrig.apirig.resident.utils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +import io.mosip.testrig.apirig.resident.testrunner.MosipTestRunner; +import io.mosip.testrig.apirig.utils.ConfigManager; + +public class ResidentConfigManager extends ConfigManager{ + private static final Logger LOGGER = Logger.getLogger(ResidentConfigManager.class); + + public static void init() { + Logger configManagerLogger = Logger.getLogger(ConfigManager.class); + configManagerLogger.setLevel(Level.WARN); + + Map moduleSpecificPropertiesMap = new HashMap<>(); + // Load scope specific properties + try { + String path = MosipTestRunner.getGlobalResourcePath() + "/config/resident.properties"; + Properties props = getproperties(path); + // Convert Properties to Map and add to moduleSpecificPropertiesMap + for (String key : props.stringPropertyNames()) { + moduleSpecificPropertiesMap.put(key, props.getProperty(key)); + } + } catch (Exception e) { + LOGGER.error(e.getMessage()); + } + // Add module specific properties as well. + init(moduleSpecificPropertiesMap); + } + + + +} \ No newline at end of file diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentUtil.java b/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentUtil.java new file mode 100644 index 00000000000..2a53facc49f --- /dev/null +++ b/api-test/src/main/java/io/mosip/testrig/apirig/resident/utils/ResidentUtil.java @@ -0,0 +1,227 @@ +package io.mosip.testrig.apirig.resident.utils; + +import java.time.Instant; +import java.util.Calendar; + +import javax.ws.rs.core.MediaType; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; +import org.testng.SkipException; + +import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.resident.testrunner.MosipTestRunner; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.GlobalMethods; +import io.mosip.testrig.apirig.utils.RestClient; +import io.mosip.testrig.apirig.utils.SkipTestCaseHandler; +import io.restassured.response.Response; + +public class ResidentUtil extends AdminTestUtil { + + private static final Logger logger = Logger.getLogger(ResidentUtil.class); + protected static int ResidentAuditCount = 0; + protected static final String ESIGNET_PAYLOAD = "config/esignetPayload.json"; + + public static void setLogLevel() { + if (ResidentConfigManager.IsDebugEnabled()) + logger.setLevel(Level.ALL); + else + logger.setLevel(Level.ERROR); + } + + public static String isTestCaseValidForExecution(TestCaseDTO testCaseDTO) { + String testCaseName = testCaseDTO.getTestCaseName(); + + int indexof = testCaseName.indexOf("_"); + String modifiedTestCaseName = testCaseName.substring(indexof + 1); + + addTestCaseDetailsToMap(modifiedTestCaseName, testCaseDTO.getUniqueIdentifier()); + + if (MosipTestRunner.skipAll == true) { + throw new SkipException(GlobalConstants.PRE_REQUISITE_FAILED_MESSAGE); + } + + if (SkipTestCaseHandler.isTestCaseInSkippedList(testCaseName)) { + throw new SkipException(GlobalConstants.KNOWN_ISSUES); + } + + if ((ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) + && BaseTestCase.currentModule.equalsIgnoreCase("resident") && testCaseName.contains("_SignJWT_")) { + throw new SkipException("esignet module is not deployed"); + } + + if ((ResidentConfigManager.isInServiceNotDeployedList(GlobalConstants.ESIGNET)) + && BaseTestCase.currentModule.equalsIgnoreCase("resident") + && (testCaseDTO.getRole() != null && (testCaseDTO.getRole().equalsIgnoreCase("residentNew") + || testCaseDTO.getRole().equalsIgnoreCase("residentNewVid")))) { + throw new SkipException("esignet module is not deployed"); + } + if (BaseTestCase.currentModule.equalsIgnoreCase(GlobalConstants.RESIDENT)) { + if (testCaseDTO.getRole() != null && (testCaseDTO.getRole().equalsIgnoreCase(GlobalConstants.RESIDENTNEW) + || testCaseDTO.isValidityCheckRequired())) { + if (testCaseName.contains("uin") || testCaseName.contains("UIN") || testCaseName.contains("Uin")) { + if (BaseTestCase.getSupportedIdTypesValueFromActuator().contains("UIN") + && BaseTestCase.getSupportedIdTypesValueFromActuator().contains("uin")) { + throw new SkipException("Idtype UIN not supported skipping the testcase"); + } + } + } else if (testCaseDTO.getRole() != null && (testCaseDTO.getRole().equalsIgnoreCase("residentNewVid") + || testCaseDTO.isValidityCheckRequired())) { + if (testCaseName.contains("vid") || testCaseName.contains("VID") || testCaseName.contains("Vid")) { + if (BaseTestCase.getSupportedIdTypesValueFromActuator().contains("VID") + && BaseTestCase.getSupportedIdTypesValueFromActuator().contains("vid")) { + throw new SkipException("Idtype VID not supported skipping the testcase"); + } + } + } + } + + return testCaseName; + } + + public static String inputstringKeyWordHandeler(String jsonString, String testCaseName) { + if (jsonString.contains(GlobalConstants.TIMESTAMP)) { + jsonString = replaceKeywordValue(jsonString, GlobalConstants.TIMESTAMP, generateCurrentUTCTimeStamp()); + } + + if (jsonString.contains("$CLAIMSFROMCONFIG$")) { + jsonString = replaceKeywordValue(jsonString, "$CLAIMSFROMCONFIG$", getValueFromConfigActuator()); + } + + if (jsonString.contains("$OIDCCLIENT$")) { + jsonString = replaceKeywordValue(jsonString, "$OIDCCLIENT$", + getValueFromActuator(GlobalConstants.RESIDENT_DEFAULT_PROPERTIES, "mosip.iam.module.clientID")); + } + + if (jsonString.contains("$UNIQUENONCEVALUEFORESIGNET$")) { + jsonString = replaceKeywordValue(jsonString, "$UNIQUENONCEVALUEFORESIGNET$", + String.valueOf(Calendar.getInstance().getTimeInMillis())); + } + + if (jsonString.contains("$IDPCLIENTPAYLOAD$")) { + String clientId = getValueFromActuator(GlobalConstants.RESIDENT_DEFAULT_PROPERTIES, + "mosip.iam.module.clientID"); + String esignetBaseURI = getValueFromActuator(GlobalConstants.RESIDENT_DEFAULT_PROPERTIES, + "mosip.iam.token_endpoint"); + int idTokenExpirySecs = Integer + .parseInt(getValueFromEsignetActuator(ResidentConfigManager.getEsignetActuatorPropertySection(), + GlobalConstants.MOSIP_ESIGNET_ID_TOKEN_EXPIRE_SECONDS)); + + Instant instant = Instant.now(); + + logger.info("Current Instant: " + instant); + + long epochValue = instant.getEpochSecond(); + + org.json.simple.JSONObject payloadBody = getRequestJson(ESIGNET_PAYLOAD); + payloadBody.put("sub", clientId); + payloadBody.put("iss", clientId); + payloadBody.put("aud", esignetBaseURI); + payloadBody.put("exp", epochValue + idTokenExpirySecs); + payloadBody.put("iat", epochValue); + + jsonString = replaceKeywordValue(jsonString, "$IDPCLIENTPAYLOAD$", + encodeBase64(payloadBody.toString())); + } + + + return jsonString; + + } + + public static String replaceKeywordValue(String jsonString, String keyword, String value) { + if (value != null && !value.isEmpty()) + return jsonString.replace(keyword, value); + else + throw new SkipException("Marking testcase as skipped as required fields are empty " + keyword); + } + + public static JSONArray esignetActuatorResponseArray = null; + + public static String getValueFromEsignetActuator(String section, String key) { + String url = ResidentConfigManager.getEsignetBaseUrl() + ResidentConfigManager.getproperty("actuatorEsignetEndpoint"); + String actuatorCacheKey = url + section + key; + String value = actuatorValueCache.get(actuatorCacheKey); + if (value != null && !value.isEmpty()) + return value; + + try { + if (esignetActuatorResponseArray == null) { + Response response = null; + JSONObject responseJson = null; + response = RestClient.getRequest(url, MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON); + responseJson = new JSONObject(response.getBody().asString()); + esignetActuatorResponseArray = responseJson.getJSONArray("propertySources"); + } + + for (int i = 0, size = esignetActuatorResponseArray.length(); i < size; i++) { + JSONObject eachJson = esignetActuatorResponseArray.getJSONObject(i); + if (eachJson.get("name").toString().contains(section)) { + value = eachJson.getJSONObject(GlobalConstants.PROPERTIES).getJSONObject(key) + .get(GlobalConstants.VALUE).toString(); + if (ResidentConfigManager.IsDebugEnabled()) + logger.info("Actuator: " + url + " key: " + key + " value: " + value); + break; + } + } + actuatorValueCache.put(actuatorCacheKey, value); + + return value; + } catch (Exception e) { + logger.error(GlobalConstants.EXCEPTION_STRING_2 + e); + return value; + } + + } + + public static JSONArray configActuatorResponseArray = null; + + public static String getValueFromConfigActuator() { + + String url = ApplnURI + ResidentConfigManager.getproperty("actuatorEndpoint"); + + String actuatorCacheKey = url + "mosip.iam.module.login_flow.claims"; + + String claims = actuatorValueCache.get(actuatorCacheKey); + + if (claims != null && !claims.isEmpty()) + return claims; + + try { + if (configActuatorResponseArray == null) { + Response response = null; + JSONObject responseJson = null; + response = RestClient.getRequest(url, MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON); + GlobalMethods.reportResponse(response.getHeaders().asList().toString(), url, response); + + responseJson = new JSONObject(response.getBody().asString()); + configActuatorResponseArray = responseJson.getJSONArray("propertySources"); + } + + for (int i = 0, size = configActuatorResponseArray.length(); i < size; i++) { + JSONObject eachJson = configActuatorResponseArray.getJSONObject(i); + if (eachJson.get("name").toString().contains(GlobalConstants.RESIDENT_DEFAULT_PROPERTIES)) { + String claimVal = eachJson.getJSONObject(GlobalConstants.PROPERTIES) + .getJSONObject("mosip.iam.module.login_flow.claims").getString(GlobalConstants.VALUE); + JSONObject claimJson = new JSONObject(claimVal); + claims = claimJson.getJSONObject("userinfo").toString(); + break; + } + } + + actuatorValueCache.put(actuatorCacheKey, claims); + + return claims; + } catch (Exception e) { + logger.error(GlobalConstants.EXCEPTION_STRING_2 + e); + return claims; + } + + } + +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy.json b/api-test/src/main/resources/config/AuthPolicy.json new file mode 100644 index 00000000000..3628348c233 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy.json @@ -0,0 +1,7 @@ +{ + "id": "string", + "metadata": {}, + "request": {}, + "requesttime": "2022-09-07T04:23:38.117Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy2.json b/api-test/src/main/resources/config/AuthPolicy2.json new file mode 100644 index 00000000000..525415bb374 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy2.json @@ -0,0 +1,82 @@ +{ + "allowedAuthTypes": [ + { + "authSubType": "IRIS", + "authType": "bio", + "mandatory": false + }, + { + "authSubType": "FINGER", + "authType": "bio", + "mandatory": false + }, + { + "authSubType": "FACE", + "authType": "bio", + "mandatory": false + }, + { + "authSubType": "", + "authType": "otp", + "mandatory": false + }, + { + "authSubType": "", + "authType": "otp-request", + "mandatory": false + }, + { + "authSubType": "", + "authType": "kyc", + "mandatory": false + }, + { + "authSubType": "", + "authType": "demo", + "mandatory": false + } + ], + "kycLanguages": [ + "ara", + "eng" + ], + "allowedKycAttributes": [ + { + "attributeName": "fullName" + }, + { + "attributeName": "gender" + }, + { + "attributeName": "residenceStatus" + }, + { + "attributeName": "dateOfBirth" + }, + { + "attributeName": "photo" + }, + { + "attributeName": "firstName" + }, + { + "attributeName": "province" + }, + { + "attributeName": "city" + }, + { + "attributeName": "zone" + }, + { + "attributeName": "postalCode" + }, + { + "attributeName": "phone" + }, + { + "attributeName": "email" + } + ], + "authTokenType": "partner" + } \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy3.json b/api-test/src/main/resources/config/AuthPolicy3.json new file mode 100644 index 00000000000..d7f53a6ac45 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy3.json @@ -0,0 +1,8 @@ +{ + "desc":"desc mosip auth policy", + "name":"mosip auth policy 2345678", + "policyGroupName":"mosip auth policy group 2345678", + "policyType":"Auth", + "version": "1.0", + "policies": {} + } \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy4.json b/api-test/src/main/resources/config/AuthPolicy4.json new file mode 100644 index 00000000000..3628348c233 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy4.json @@ -0,0 +1,7 @@ +{ + "id": "string", + "metadata": {}, + "request": {}, + "requesttime": "2022-09-07T04:23:38.117Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy5.json b/api-test/src/main/resources/config/AuthPolicy5.json new file mode 100644 index 00000000000..d7f53a6ac45 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy5.json @@ -0,0 +1,8 @@ +{ + "desc":"desc mosip auth policy", + "name":"mosip auth policy 2345678", + "policyGroupName":"mosip auth policy group 2345678", + "policyType":"Auth", + "version": "1.0", + "policies": {} + } \ No newline at end of file diff --git a/api-test/src/main/resources/config/AuthPolicy6.json b/api-test/src/main/resources/config/AuthPolicy6.json new file mode 100644 index 00000000000..fb161e611c1 --- /dev/null +++ b/api-test/src/main/resources/config/AuthPolicy6.json @@ -0,0 +1,41 @@ +{ + "allowedAuthTypes": [ + { + "authSubType": "IRIS", + "authType": "bio", + "mandatory": true + }, + { + "authSubType": "FINGER", + "authType": "bio", + "mandatory": true + }, + { + "authSubType": "FACE", + "authType": "bio", + "mandatory": true + }, + { + "authSubType": "", + "authType": "otp-request", + "mandatory": false + }, + { + "authSubType": "", + "authType": "kyc", + "mandatory": false + }, + { + "authSubType": "", + "authType": "demo", + "mandatory": false + } + ], + "kycLanguages": [ + "ara", + "eng" + ], + "allowedKycAttributes": [ + ], + "authTokenType": "partner" + } \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/OtpGeneration/request.json b/api-test/src/main/resources/config/Authorization/OtpGeneration/request.json new file mode 100644 index 00000000000..7ce05cc511d --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/OtpGeneration/request.json @@ -0,0 +1,16 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "appId": "prereg", + "context": "auth-otp", + "otpChannel": [ + "EMAIL" + ], + "templateVariables": {}, + "userId": "robin.hood@mailinator.com", + "useridtype": "USERID" + }, + "requesttime": "2018-12-10T06:12:52.994Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/OtpValidation/request.json b/api-test/src/main/resources/config/Authorization/OtpValidation/request.json new file mode 100644 index 00000000000..800b94ad6a5 --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/OtpValidation/request.json @@ -0,0 +1,11 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "appId": "prereg", + "otp": "837439", + "userId": "9972388747" + }, + "requesttime": "2018-12-10T06:12:52.994Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/errorUIN.json b/api-test/src/main/resources/config/Authorization/errorUIN.json new file mode 100644 index 00000000000..f54f8c7a8af --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/errorUIN.json @@ -0,0 +1,17 @@ +{ + "transactionID": "$IGNORE$", + "version": "$IGNORE$", + "id": "$IGNORE$", + "errors": [ + { + "errorCode": "IDA-MLC-015", + "errorMessage": "$IGNORE$", + "actionMessage": "$IGNORE$" + } + ], + "responseTime": "$IGNORE$", + "response": { + "authStatus": false, + "authToken": "$IGNORE$" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/internalAuthRequest.json b/api-test/src/main/resources/config/Authorization/internalAuthRequest.json new file mode 100644 index 00000000000..57aa8f2f66a --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/internalAuthRequest.json @@ -0,0 +1,13 @@ +{ + "id": "string", + "version": "string", + "requesttime": "2022-01-13T06:07:20.554Z", + "metadata": {}, + "request": { + "userName": "110005", + "password": "mosip", + "appId": "admin", + "clientId": "mosip-admin-client", + "clientSecret": "xyz123" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/keycloakTokenGeneration.json b/api-test/src/main/resources/config/Authorization/keycloakTokenGeneration.json new file mode 100644 index 00000000000..cb8ffb63149 --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/keycloakTokenGeneration.json @@ -0,0 +1,6 @@ +{ +"grant_type" : "password", +"client_id": "admin-cli", +"username": "keycloakusername", +"password": "keycloakpassword" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/request.json b/api-test/src/main/resources/config/Authorization/request.json new file mode 100644 index 00000000000..57831153bb1 --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/request.json @@ -0,0 +1,11 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "appId": "prereg", + "password": "prereguser", + "userName": "prereguser" + }, + "requesttime": "2019-04-10T10:00:00.000Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/requestIdentity.json b/api-test/src/main/resources/config/Authorization/requestIdentity.json new file mode 100644 index 00000000000..4c6b94e24f0 --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/requestIdentity.json @@ -0,0 +1,12 @@ +{ + "identity": { + "addressLine3": [ + { + "language": "languageValue", + "value": "valueOfAttribute" + } + ], + "IDSchemaVersion": "IDSchemaVersion", + "UIN": "$ID:AddIdentity_Positive_PRE_smoke_UIN$" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/Authorization/zoneMappingRequest.json b/api-test/src/main/resources/config/Authorization/zoneMappingRequest.json new file mode 100644 index 00000000000..c7e5fbce57b --- /dev/null +++ b/api-test/src/main/resources/config/Authorization/zoneMappingRequest.json @@ -0,0 +1,12 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "zoneCode": "CSB", + "userId": "110123", + "isActive": true, + "langCode": "eng" + }, + "requesttime": "2022-05-09T09:52:11.969Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/IDRepo.properties b/api-test/src/main/resources/config/IDRepo.properties new file mode 100644 index 00000000000..361cd04b104 --- /dev/null +++ b/api-test/src/main/resources/config/IDRepo.properties @@ -0,0 +1,86 @@ +# ------------------------------------------------------------------------------------------- +# Properties File that will defined from ID Repo for specific request and Response elements +# which will be used during automation. This is common place for update +# + +req.Documentrequest=Document request +req.notify=NotificationRequestDTO +langCode.key=langCode + +key=value + +#PreRegistration resource uris +#Make sure all resource apis are covered +ui.config.params=preregistration.login.mode,preregistration.workflow.demographic,preregistration.workflow.documentupload,preregistration.workflow.booking,preregistration.booking.offset,preregistration.auto.logout,preregistration.rebook.timespan,preregistration.cancel.timespan,preregistration.book.days,preregistration.max.file.size,preregistration.recommended.centers.locCode,preregistration.nearby.centers,mosip.regex.email,mosip.regex.postalCode,mosip.regex.textField,mosip.regex.phone,mosip.regex.DOB,mosip.regex.CNIE,mosip.supported-languages,mosip.primary-language,mosip.secondary-language,mosip.default.dob,mosip.kernel.otp.expiry-time,mosip.kernel.otp.validation-attempt-threshold,mosip.kernel.otp.default-length,mosip.kernel.sms.number.length,mosip.kernel.pin.length,otpChannel.mobile +private static final String preReg_URI = "/booking/v0.1/preregistration/booking/book" +preReg_CreateApplnURI = /preregistration/v1/applications +preReg_FetchRegistrationDataURI = /preregistration/v1/applications/{preRegistrationId} +preReg_FetchPreRegistrationByDateAndTimeURI=/preregistration/v1/demographic/applications/byDateTime +preReg_FetchStatusOfApplicationURI =/preregistration/v1/applications/status/{preRegistrationId} +preReg_FetchAllApplicationCreatedByUserURI=/preregistration/v1/applications +preReg_DiscardApplnURI = /preregistration/v1/applications/{preRegistrationId} +preReg_UpdateStatusAppURI=/preregistration/v1/applications/{preRegistrationId} +#QRCode Service API related URI's +qrCode_URI=/preregistration/v1/qrCode/generate +preReg_DelAllDocumentByPreIdURI = /preregistration/v1/documents/preregistration/ + +#Document API related URI's +preReg_DocUploadURI = /preregistration/v1/documents/ +preReg_DocumentUploadURI = /preregistration/v1/documents/{preRegistrationId} +preReg_FetchAllDocumentURI = /preregistration/v1/documents/{preRegistrationId} +prereg_DeleteDocumentByDocIdURI = /preregistration/v1/documents/ +preReg_DeleteAllDocumentByPreIdURI = /preregistration/v1/documents/preregistration/ +preReg_CopyDocumentsURI = /preregistration/v1/documents/ +preReg_DeleteAllDocumentByPreIdURI1 = /preregistration/v1/documents/preregistration/ + +preReg_BookingAppointmenturi =/preregistration/v1/appointment/{preRegistrationId} +preReg_BookingAppointmentURI =/preregistration/v1/appointment/ +preReg_CancelAppointmenturi = /preregistration/v1/appointment/{preRegistrationId} +#preReg_CancelAppointmenturi= /preregistration/v1/appointment/ +preReg_FecthAppointmentDetailsuri=/preregistration/v1/appointment/{preRegistrationId} +#preReg_FetchCenterIDURI = /preregistration/v1/appointment/availability/ + + + +preReg_GetDocByDocId = /preregistration/v1/documents/ +preReg_GetDocByPreId = /preregistration/v1/documents/preregistration/ + + +#Booking Service API related URI's +preReg_BookingAppointmentURI =/preregistration/v1/appointment/ +preReg_MultipleBookingAppointmentURI =/preregistration/v1/appointment +preReg_FetchCenterIDURI = /preregistration/v1/appointment/availability/ +preReg_FetchCenterIDuri = /preregistration/v1/appointment/availability/{registrationCenterId} +preReg_FecthAppointmentDetailsURI=/preregistration/v1/appointment/ +preReg_CancelAppointmentURI = /preregistration/v1/appointment/ +preReg_RetriveBookedPreIdsByRegId=/preregistration/v1/appointment/preRegistrationId/ +preReg_SyncMasterDataURI=/preregistration/v1/batch/availability/sync + + + +#Notification Service API related URI's +preReg_NotifyURI=/preregistration/v1/notification/notify + +#Booking Service API related URI's + +preReg_FetchBookedPreIdByRegIdURI = /preregistration/v1/booking/appointment/preIdsByRegId +preReg_DiscardBookingURI=/preregistration/v1/booking/appointment +preReg_SyncMasterDataURI=/preregistration/v1/booking/appointment/availability/sync + + + +preReg_ConsumedPreregistrationURI =/preregistration/v1/sync/reverseDataSync +preReg_FetchAllPreRegistrationIdsURI = /preregistration/v1/sync +preReg_DataSyncnURI = /preregistration/v1/sync/{preRegistrationId} +preReg_ExpiredURI=/preregistration/v1/batch/expiredStatus +preReg_syncAvailability=/preregistration/v1/appointment/availability/sync + +preReg_ReverseDataSyncURI=/preregistration/v1/sync/consumedPreRegIds +preReg_ConsumedURI=/preregistration/v1/batch/consumedStatus +preReg_NotifyURI=/preregistration/v1/notification/notify +invalidateToken_URI=/preregistration/v1/login/invalidateToken +preReg_translitrationRequestURI=/preregistration/v1/transliteration/transliterate +otpSend_URI=/preregistration/v1/login/sendOtp +validateOTP_URI=/preregistration/v1/login/validateOtp +preReg_AdminTokenURI=/v1/authmanager/authenticate/useridPwd +preReg_GetPreRegistrationConfigData=/preregistration/v1/login/config diff --git a/api-test/src/main/resources/config/IDRepo2.properties b/api-test/src/main/resources/config/IDRepo2.properties new file mode 100644 index 00000000000..d2cface22a1 --- /dev/null +++ b/api-test/src/main/resources/config/IDRepo2.properties @@ -0,0 +1,100 @@ +# ------------------------------------------------------------------------------------------- +# Properties File that will defined from ID Repo for specific request and Response elements +# which will be used during automation. This is common place for update +# + +req.Documentrequest=Document request + + +key=value + +#PreRegistration resource uris +#Make sure all resource apis are covered + +private static final String preReg_URI = "/booking/v0.1/pre-registration/booking/book" +preReg_CreateApplnURI = /preregistration/v1/demographic/applications +preReg_FetchRegistrationDataURI = /pre-registration/v1/demographic/applications/details +preReg_FetchPreRegistrationByDateAndTimeURI=/pre-registration/v1/demographic/applications/byDateTime +preReg_FetchStatusOfApplicationURI =/pre-registration/v1/demographic//applications/status +preReg_FetchAllApplicationCreatedByUserURI=/pre-registration/v1/demographic/applications +preReg_DiscardApplnURI = /pre-registration/v1/demographic/applications +preReg_UpdateStatusAppURI=/pre-registration/v1/demographic/applications + + +preReg_DocumentUploadURI = /pre-registration/v1/document/documents +preReg_FetchAllDocumentURI = /pre-registration/v1/document/documents +prereg_DeleteDocumentByDocIdURI = /pre-registration/v1/document/documents +preReg_DeleteAllDocumentByPreIdURI = /pre-registration/v1/document/documents/byPreRegId + +preReg_CopyDocumentsURI = /pre-registration/v1/document/documents/copy +preReg_BookingAppointmentURI =/pre-registration/v1/booking/appointment +preReg_CancelAppointmentURI = /pre-registration/v1/booking/appointment +preReg_FecthAppointmentDetailsURI=/pre-registration/v1/booking/appointment +preReg_FetchCenterIDURI = /pre-registration/v1/booking/appointment/availability +preReg_FetchBookedPreIdByRegIdURI = /pre-registration/v1/booking/appointment/preIdsByRegId +preReg_DiscardBookingURI=/pre-registration/v1/booking/appointment +preReg_SyncMasterDataURI=/pre-registration/v1/booking/appointment/availability/sync +preReg_RetriveBookedPreIdsByRegId=/pre-registration/v1/booking/appointment/preIdsByRegId + + +preReg_ConsumedPreregistrationURI =/pre-registration/v1/sync/reverseDataSync +preReg_FetchAllPreRegistrationIdsURI = /pre-registration/v1/sync/datasync +preReg_DataSyncnURI = /pre-registration/v1/sync/datasync +preReg_ExpiredURI=/pre-registration/v1/batchjob/expiredStatus + +preReg_ReverseDataSyncURI=/pre-registration/v1/sync/datasync/store +preReg_ConsumedURI=/pre-registration/v1/batchjob//consumedStatus +preReg_NotifyURI=/pre-registration/v1/notification/notify +invalidateToken_URI=/pre-registration/v1/login/invalidateToken +preReg_translitrationRequestURI=/pre-registration/v1/transliteration/transliterate +otpSend_URI=/preregistration/v1/login/sendOtp +validateOTP_URI=/pre-registration/v1/login/validateOtp + +private static final String preReg_URI = "/booking/v0.1/preregistration/booking/book" +preReg_CreateApplnURI = /preregistration/v1/applications +preReg_FetchRegistrationDataURI = /preregistration/v1/applications/{preRegistrationId} +preReg_FetchPreRegistrationByDateAndTimeURI=/preregistration/v1/demographic/applications/byDateTime +preReg_FetchStatusOfApplicationURI =/preregistration/v1/applications/status/{preRegistrationId} +preReg_FetchAllApplicationCreatedByUserURI=/preregistration/v1/applications +preReg_DiscardApplnURI = /preregistration/v1/applications/{preRegistrationId} +preReg_UpdateStatusAppURI=/preregistration/v1/applications/{preRegistrationId} + + +preReg_DocumentUploadURI = /preregistration/v1/documents/{preRegistrationId} +preReg_FetchAllDocumentURI = /preregistration/v1/document/documents +prereg_DeleteDocumentByDocIdURI = /preregistration/v1/document/documents +preReg_DeleteAllDocumentByPreIdURI = /preregistration/v1/document/documents/byPreRegId + +preReg_CopyDocumentsURI = /preregistration/v1/document/documents/copy +preReg_BookingAppointmentURI =/preregistration/v1/booking/appointment +preReg_CancelAppointmentURI = /preregistration/v1/booking/appointment +preReg_FecthAppointmentDetailsURI=/preregistration/v1/booking/appointment +preReg_FetchCenterIDURI = /preregistration/v1/appointment/availability/{registrationCenterId} +preReg_FetchBookedPreIdByRegIdURI = /preregistration/v1/booking/appointment/preIdsByRegId +preReg_DiscardBookingURI=/preregistration/v1/booking/appointment +preReg_SyncMasterDataURI=/preregistration/v1/booking/appointment/availability/sync +preReg_RetriveBookedPreIdsByRegId=/preregistration/v1/booking/appointment/preIdsByRegId + + +preReg_ConsumedPreregistrationURI =/preregistration/v1/sync/reverseDataSync +preReg_FetchAllPreRegistrationIdsURI = /preregistration/v1/sync/datasync +preReg_DataSyncnURI = /preregistration/v1/sync/datasync +preReg_ExpiredURI=/preregistration/v1/batchjob/expiredStatus + +preReg_ReverseDataSyncURI=/preregistration/v1/sync/datasync/store +preReg_ConsumedURI=/preregistration/v1/batchjob//consumedStatus +preReg_NotifyURI=/preregistration/v1/notification/notify +invalidateToken_URI=/preregistration/v1/login/invalidateToken +preReg_translitrationRequestURI=/preregistration/v1/transliteration/transliterate +otpSend_URI=/preregistration/v1/login/sendOtp +validateOTP_URI=/preregistration/v1/login/validateOtp +preReg_AdminTokenURI=/authmanager/v1/authenticate/useridPwd + + + + + + + + + diff --git a/api-test/src/main/resources/config/IDjson.properties b/api-test/src/main/resources/config/IDjson.properties new file mode 100644 index 00000000000..b78a17f4335 --- /dev/null +++ b/api-test/src/main/resources/config/IDjson.properties @@ -0,0 +1,2 @@ +dateOfBirthEven=1998/01/01 +dateOfBirthOdd=1993/01/01 \ No newline at end of file diff --git a/api-test/src/main/resources/config/UmcValidationApis.properties b/api-test/src/main/resources/config/UmcValidationApis.properties new file mode 100644 index 00000000000..2f8c62c6c9e --- /dev/null +++ b/api-test/src/main/resources/config/UmcValidationApis.properties @@ -0,0 +1,6 @@ +registrationCentreHistory=/v1/masterdata/registrationcentershistory/ +machineHistory=/v1/masterdata/machineshistories/ +userMachineMapping=/v1/masterdata/getregistrationmachineusermappinghistory/ +valdiateWorkinHour=/v1/masterdata/registrationcenters/validate/ +deviceHistory=/v1/masterdata/deviceshistories/ +centerDeviceHistory=/v1/masterdata/registrationcenterdevicehistory/ \ No newline at end of file diff --git a/api-test/src/main/resources/config/adminQueries.properties b/api-test/src/main/resources/config/adminQueries.properties new file mode 100644 index 00000000000..748b6ad0a98 --- /dev/null +++ b/api-test/src/main/resources/config/adminQueries.properties @@ -0,0 +1,908 @@ +#create RegCenter with ID as teId1, regCenter should be under authUser(cookie) zone, in this these things may +#change: cntrTyp_code, location_code, holiday_loc_code, zone_code, lang_code. update them accordingly. +createRegCenter=INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, \ + longitude, location_code, contact_phone, contact_person, number_of_kiosks, \ + working_hours, per_kiosk_process_time, center_start_time, center_end_time, \ + lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, \ + zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes) \ + VALUES ('Tcntr', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '14022', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'STT', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null); + +#create regcent by replacing the id and zone in upper query wit this regCentID(using this center to map device, machine, user) +regCentId1=Tcnt1 +regCentId2=Tcnt2 +zoneCode=BRK + +#delete created RegCenter with above IDs, here role will be replaced by username of AuthUser. +deleteRegCenter=delete from master.registration_center where id = 'Tcntr' and is_active = false and is_deleted = true and upd_by = 'role' +deleteRegCenter1=delete from master.registration_center where id = 'Tcnt1' or id = 'Tcnt2' +deleteCntrCrtdByApi= delete from master.registration_center where name = 'Test Center' +deleteWorkNonWorkDays=delete from master.reg_working_nonworking where regcntr_id IN (select id from master.registration_center where name = 'Test Center') +deleteExcptnlHolidy=delete from master.reg_exceptional_holiday where regcntr_id IN (select id from master.registration_center where name = 'Test Center') +deleteWorkNonWorkDaysUpdate=delete from master.reg_working_nonworking where regcntr_id IN ('Tcnt1','Tcntr') +deleteExcptnlHolidyUpdate=delete from master.reg_exceptional_holiday where regcntr_id IN ('Tcnt1','Tcntr') + +#map regCenter to device, device and regCenter should be under authUser(cookie) zone. here device_id and lang_code can change, +# update them accordingly +mapRegCentDevice=INSERT INTO master.reg_center_device( \ + regcntr_id, device_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Tcnt1', '3000025', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null); + +deleteMappedRegCentDevice=delete from master.reg_center_device where regcntr_id = 'Tcnt1' + +#map regCenter to machine, machine and regCenter should be under authUser(cookie) zone. here machine_id and lang_code can change, +# update them accordingly +mapRegCentMach=INSERT INTO master.reg_center_machine( \ + regcntr_id, machine_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Tcnt1', '10005', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null); + +deleteMappedRegCentMach=delete from master.reg_center_machine where regcntr_id = 'Tcnt1' + +#map regCenter to user, user and regCenter should be under authUser(cookie) zone. here user_id and lang_code can change, +# update them accordingly +mapRegCentUser=INSERT INTO master.reg_center_user( \ + regcntr_id, usr_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Tcnt1', '110033', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null); + +deleteMappedRegCentUser=delete from master.reg_center_user where regcntr_id = 'Tcnt1' + +#create Device with ID as Tdevice, Device should be under authUser(cookie) zone, in this these things may +#change: dspecId, zone_code, lang_code. update them accordingly. +createDevice=INSERT INTO master.device_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Tdevice', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '165', 'CST', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null); + +#create device by replacing the id and zone in upper query with this deviceID(using this device to map regCenter) +deviceId1=Tdevice1 +deviceId2=Tdevice2 + +#delete created Device with above IDs, here role will be replaced by username of AuthUser. +deleteDevice=delete from master.device_master where id = 'Tdevice' and is_active = false and is_deleted = true and upd_by = 'role' +deleteDevice1=delete from master.device_master where id = 'Tdevice1' or id = 'Tdevice2' + +#create Machine with ID as Tmach, Machine should be under authUser(cookie) zone, in this these things may +#change: mspecId, zone_code, lang_code. update them accordingly. +createMachine=INSERT INTO master.machine_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, mspec_id, public_key, key_index, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Tmach', 'TestMachine', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'Pkey', 'KeyI', 'CST', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null), \ + ('Tmac1', 'TestMachine', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'Pkey', 'KeyI', 'CST', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null), \ + ('Tmac2', 'TestMachine', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'Pkey', 'KeyI', 'BRK', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null); + +machineId1=Tmac1 + +#delete created Machine with above IDs, here role will be replaced by username of AuthUser. +deleteMachine=delete from master.machine_master where id = 'Tmach' and is_active = false and is_deleted = true and upd_by = 'role' +deleteMachine1=delete from master.machine_master where id = 'Tmac1' or id = 'Tmac2' + +#create location data +createLocation=INSERT INTO master.location( \ + code, name, hierarchy_level, hierarchy_level_name, parent_loc_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('TestLoc_code_1','Test_Loc_B_1' , 3, 'City', 'KNT', 'eng', false, '110005', '2019-07-26 12:18:38.523228', null, null, null, null), \ + ('TestLoc_code_2','Test_Loc_B_2' , 2, 'Province', 'TestLoc_code_1', 'eng', true, '110005', '2019-07-26 12:18:38.523228', null, null, null, null), \ + ('TestLoc_code_2','Test_Loc_B_2' , 2, '\u0627\u0644\u0645\u062D\u0627\u0641\u0638\u0629', 'TestLoc_code_1', 'ara', true, '110005', '2019-07-26 12:18:38.523228', null, null, null, null), \ + ('TestLoc_code_3','Test_Loc_B_3' , 2, 'Province', 'TestLoc_code_1', 'eng', false, '110005', '2019-07-26 12:18:38.523228', null, null, null, null); + #delete created locations +deleteCreatedLocations=delete from master.location where cr_by = '110005' + +InsertRegDevice=insert into master.registered_device_master (code,dtype_code,dstype_code,status_code,device_id,device_sub_id,digital_id,serial_number,provider_name,provider_id,purpose,firmware,make,model,expiry_date,certification_level,is_active,cr_by,cr_dtimes) \ +values ('inActive-D1','Face' , 'Full face', 'Registered', 'TestDev1', '[0,1]', '{ \ + "serialNo" "Serial number1", \ + "make" "Microsoft", \ + "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", \ + "type" "Face" \ + "dp" "SYNCBYTE", \ + "dpId" "SYNCBYTE.TCI322", \ + "dateTime" "2025-01-01T00:00:00.000+05:30" \ +}', 'Serial number1', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 \ +', 'L0',False,'superadmin','now()'),('Revoked-D1','Face' , 'Full face', 'Revoked', 'TestDev1', '[0,1]', '{ \ + "serialNo" "Serial number2", \ + "make" "Microsoft", \ + "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", \ + "type" "Face" \ + "dp" "SYNCBYTE", \ + "dpId" "SYNCBYTE.TCI322", \ + "dateTime" "2025-01-01T00:00:00.000+05:30" \ +}', 'Serial number2', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 \ +', 'L0','TRUE','superadmin','now()'),('Retired-D1','Face' , 'Full face', 'Retired', 'TestDev1', '[0,1]', '{ \ + "serialNo" "Serial number3", \ + "make" "Microsoft", \ + "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", \ + "type" "Face" \ + "dp" "SYNCBYTE", \ + "dpId" "SYNCBYTE.TCI322", \ + "dateTime" "2025-01-01T00:00:00.000+05:30" \ +}', 'Serial number3', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 \ +', 'L0','TRUE','superadmin','now()'); + +InsertMDS=INSERT INTO master.mosip_device_service( \ + id, sw_binary_hash, sw_version, dprovider_id, dtype_code, dstype_code, make, model, sw_cr_dtimes, sw_expiry_dtimes, is_active, cr_by, cr_dtimes) \ + VALUES ('inActiveMDS', 'dummy data', 'inActiveMDSsVersion', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', False, '110005', 'now()'), \ + ('diffDtypMDS', 'dummy data', 'MDSsVersionDty', 'SYNCBYTE.TCI322', 'Finger' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()'), \ + ('diffDstypMDS', 'dummy data', 'MDSsVersionDsTyp', 'SYNCBYTE.TCI322', 'Face' , 'Single', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()'), \ + ('difMakeMDS', 'dummy data', 'MDSsVersionMake', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'difMakeThanDev', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()'), \ + ('difModelMDS', 'dummy data', 'MDSsVersionModel', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'Microsoft', 'difModelThanDev', 'now()', 'now()', True, '110005', 'now()'), \ + ('diffDpId', 'dummy data', 'MDSsVersionDpid', 'SYNCBYTE.MC01A', 'Face' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()'); + +DeleteRegDevice=delete from master.registered_device_master where code IN ('inActive-D1','Revoked-D1','Retired-D1','ActiveRegDev1'); +DeleteMDS=delete from master.mosip_device_service where id IN ('inActiveMDS','diffDtypMDS','diffDstypMDS','difMakeMDS','difModelMDS','diffDpId'); +DeleteRegDeviceCreatedByApi=delete from master.registered_device_master where device_id IN ('RegDeviceIdT1','RegDeviceIdT2','RegDeviceIdT3','3000025','3000045'); +validateHistory=select count(*) from master.registered_device_master_h where device_id IN ('RegDeviceIdT1','RegDeviceIdT2','RegDeviceIdT3','3000025','3000045'); +validateDeRegDevHistory=select count(*) from master.registered_device_master_h where device_id IN ('ActiveRegDev1'); + +InsertRegDeviceHistory=insert into master.registered_device_master_h (code,dtype_code,dstype_code,status_code,device_id,device_sub_id,digital_id,serial_number,provider_name,provider_id,purpose,firmware,make,model,expiry_date,certification_level,is_active,cr_by,cr_dtimes,eff_dtimes) values ('inActive-D1','Face' , 'Full face', 'Registered', 'TestDev1', '[0,1]', '{ "serialNo" "Serial number1", "make" "Microsoft", "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", "type" "Face" "dp" "SYNCBYTE", "dpId" "SYNCBYTE.TCI322", "dateTime" "2025-01-01T00:00:00.000+05:30" }', 'Serial number1', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 ', 'L0',False,'superadmin','now()','2019-11-22 10:11:30.854'),('Revoked-D1','Face' , 'Full face', 'Revoked', 'TestDev1', '[0,1]', '{ "serialNo" "Serial number2", "make" "Microsoft", "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", "type" "Face" "dp" "SYNCBYTE", "dpId" "SYNCBYTE.TCI322", "dateTime" "2025-01-01T00:00:00.000+05:30" }', 'Serial number2', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 ', 'L0','TRUE','superadmin','now()','2019-11-22 10:11:30.854'),('Retired-D1','Face' , 'Full face', 'Retired', 'TestDev1', '[0,1]', '{ "serialNo" "Serial number3", "make" "Microsoft", "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", "type" "Face" "dp" "SYNCBYTE", "dpId" "SYNCBYTE.TCI322", "dateTime" "2025-01-01T00:00:00.000+05:30" }', 'Serial number3', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 ', 'L0','TRUE','superadmin','now()','2019-11-22 10:11:30.854'); +InsertMDSHistory=INSERT INTO master.mosip_device_service_h( \ + id, sw_binary_hash, sw_version, dprovider_id, dtype_code, dstype_code, make, model, sw_cr_dtimes, sw_expiry_dtimes, is_active, cr_by, cr_dtimes,eff_dtimes) \ + VALUES ('inActiveMDS', 'dummy data', 'inActiveMDSsVersion', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', False, '110005', 'now()','2019-11-22 10:11:30.854'), \ + ('diffDtypMDS', 'dummy data', 'MDSsVersionDty', 'SYNCBYTE.TCI322', 'Finger' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()','2019-11-22 10:11:30.854'), \ + ('diffDstypMDS', 'dummy data', 'MDSsVersionDsTyp', 'SYNCBYTE.TCI322', 'Face' , 'Single', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()','2019-11-22 10:11:30.854'), \ + ('difMakeMDS', 'dummy data', 'MDSsVersionMake', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'difMakeThanDev', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()','2019-11-22 10:11:30.854'), \ + ('difModelMDS', 'dummy data', 'MDSsVersionModel', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'Microsoft', 'difModelThanDev', 'now()', 'now()', True, '110005', 'now()','2019-11-22 10:11:30.854'), \ + ('diffDpId', 'dummy data', 'MDSsVersionDpid', 'SYNCBYTE.MC01A', 'Face' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', True, '110005', 'now()','2019-11-22 10:11:30.854'); + +InsertSingleRegDeviceValues=('ActiveRegDev1','Face' , 'Full face', 'Registered', 'TestDev1', '[0,1]', '{ \ + "serialNo" "Serial number1", \ + "make" "Microsoft", \ + "model\u201D : "ca3e7ab9-b4c3-4ae6-8251-579ef933890f", \ + "type" "Face" \ + "dp" "SYNCBYTE", \ + "dpId" "SYNCBYTE.TCI322", \ + "dateTime" "2025-01-01T00:00:00.000+05:30" \ +}', 'Serial number4', 'SYNCBYTE', 'SYNCBYTE.TCI322', 'Registration', 'TCI322L1.0', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', '2025-01-01T00:00:00.000+05:30 \ +', 'L0',True,'superadmin','now()'); + +createDevProviderUpdate=INSERT INTO master.device_provider( \ + id, vendor_name, address, email, contact_number, certificate_alias, is_active, cr_by, cr_dtimes) \ + VALUES ('TestDPro1', 'TestVend1', 'testDevPro1', 'testDevProMail', '1234567890','testCerti', true, 110005, '2025-01-01T00:00:00.000+05:30'), ('TestDPro2', 'TestVend2', 'testDevPro2', 'testDevProMail2', '1234567890','testCerti', false, 110005, '2025-01-01T00:00:00.000+05:30'); +deleteDevProCreatedByAPI=delete from master.device_provider where cr_by IN ('110005'); +validateDevProHistory=select count(*) from master.device_provider_h where cr_by IN ('110005'); + +deleteFTPCreatedByAPI=delete from master.foundational_trust_provider where name IN ('TestFTP') +createFTPtoUpdate=INSERT INTO master.foundational_trust_provider( \ + id, name, address, email, contact_number, certificate_alias, is_active, cr_by, cr_dtimes) \ + VALUES ('TestFTP2', 'TestFTP1', 'Test Address', 'testEmail@test.com', '1234567890', 'testAlias', true, '110005', '2019-11-25 11:22:19.799'),('TestFTP1', 'TestFTP2', 'Test Address', 'testEmail@test.com', '1234567890', 'testAlias', true, '110005', '2019-11-25 11:22:19.799'); +deleteFTP=delete from master.foundational_trust_provider where id IN ('TestFTP1','TestFTP2'); +validateFTPHistory=select count(*) from master.foundational_trust_provider_h where name IN ('TestFTP'); + +#create RegCenter with ID as TestUnmap, regCenter should be under authUser(cookie) zone, in this these things may +#change: cntrTyp_code, location_code, holiday_loc_code, zone_code, lang_code. update them accordingly. +createRegCenterForUnmap1=INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, \ + longitude, location_code, contact_phone, contact_person, number_of_kiosks, \ + working_hours, per_kiosk_process_time, center_start_time, center_end_time, \ + lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, \ + zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes) \ + VALUES ('TestUnmap', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CSB', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null), \ + ('TestUnmap1', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CSB', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null), \ + ('TestUnmap2', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'NDR', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null); + +deleteRegCntrForUnmap= delete from master.registration_center where id in ('TestUnmap', 'TestUnmap1', 'TestUnmap2') + + +#create Device with ID as TestDeviceToMapNew, Device should be under authUser(cookie) zone, in this these things may +#change: dspecId, zone_code, lang_code. update them accordingly. +createDeviceForUnmap1=INSERT INTO master.device_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('TestDeviceToMapNew', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '165', 'CST', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null), \ + ('TestDeviceToMapNew1', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '165', 'CST', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null), \ + ('TestDeviceToMapNew2', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '165', 'NDR', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null); + +deleteUnmapDeviceByApi=delete from master.device_master where id in ('TestDeviceToMapNew','TestDeviceToMapNew1','TestDeviceToMapNew2') + + +#map regCenter to device, device and regCenter should be under authUser(cookie) zone. here device_id and lang_code can change, +# update them accordingly +mapRegCentDevice1=INSERT INTO master.reg_center_device( \ + regcntr_id, device_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('TestUnmap', 'TestDeviceToMapNew', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null), \ + ('TestUnmap1', 'TestDeviceToMapNew2', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null), \ + ('TestUnmap2', 'TestDeviceToMapNew1', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null); + +deleteMappedRegCentDevice1=delete from master.reg_center_device where regcntr_id in ('TestUnmap','TestUnmap1','TestUnmap2') + + +#create RegCenter with ID as MapZone1, regCenter should be under authUser(cookie) zone, in this these things may +#change: cntrTyp_code, location_code, holiday_loc_code, zone_code, lang_code. update them accordingly. +createRegCenterForMapMCReg=INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, \ + longitude, location_code, contact_phone, contact_person, number_of_kiosks, \ + working_hours, per_kiosk_process_time, center_start_time, center_end_time, \ + lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, \ + zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes) \ + VALUES ('MapZone1', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '0', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CSB', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null), \ + ('MapDevReg', 'Test Center', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '0', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'MRS', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null); + +deleteRegCntrByApiMac= delete from master.registration_center where id in ('MapZone1', 'MapDevReg'); + + +#create Machine with ID as RegCntrMa, Device should be under authUser(cookie) zone, in this these things may +#change: dspecId, zone_code, lang_code. update them accordingly. +createMachineForMapMCReg=INSERT INTO master.machine_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, mspec_id, public_key, key_index, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('RegCntrMa', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '1001','pkeyI', 'pkeyI', 'CST', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null), \ + ('OutZone', 'TestDevice', '85-BB-97-4B-14-05', 'SZ5912878988', null, null, '1001','pkeyI', 'pkeyI', 'MRS', 'eng', true, 'superadmin', '2019-07-26 12:18:40.718295', null, null, null, null); + +deleteMapMachineByApi=delete from master.machine_master where id in ('RegCntrMa','OutZone'); + + +#map regCenter to machine, machine and regCenter should be under authUser(cookie) zone. here device_id and lang_code can change, +# update them accordingly +mapRegCentMachine1=INSERT INTO master.reg_center_machine( \ + regcntr_id, machine_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('MapZone1', 'RegCntrMa', 'eng', true, 'superadmin', '2019-09-04 12:28:11.553519', null, null, null, null); + +deleteMappedRegCentMachine1=delete from master.reg_center_machine where regcntr_id in ('MapZone1'); + +#return the number of kiosks from registration center table +validateNoOfKiosks= SELECT number_of_kiosks \ + FROM master.registration_center \ + WHERE id in ('MapZone1'); + +createRegCenterWithDifferentData=INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, \ + longitude, location_code, contact_phone, contact_person, number_of_kiosks, \ + working_hours, per_kiosk_process_time, center_start_time, center_end_time, \ + lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, \ + zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes) \ + VALUES ('TRegCntr1', 'TestRegCenter', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('TRegCntr2', 'TestRegCenter2', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'RBT', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('TRegCntr3', 'TestRegCenter3', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('TRegCntr4', 'TestRegCenter3', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'RBT', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + 'true', null),\ + ('TRegCntr5', 'TestRegCenter3', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'BSN', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('TRegCntr6', 'TestRegCenter6', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'RBT', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + 'true', null),\ + ('TRegCntr7', 'TestRegCenter6', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'eng', 'false', '110005', '2019-08-27 12:28:11.553519', null, null, \ + 'true', null); + + +deleteRegCntrByApi= delete from master.registration_center where id in ('TRegCntr1', 'TRegCntr2', 'TRegCntr3','TRegCntr4','TRegCntr5','TRegCntr6','TRegCntr7') + + +createDeviceWithDifferentData=INSERT INTO master.device_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TestDevice1', 'che iris 1', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice2', 'che iris 2', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice3', 'che iris 3', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'NDR', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice4', 'che iris 3', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'BSN', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice5', 'che iris 3', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CSB', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice6', 'che iris 3', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('TestDevice7', 'che iris 3', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'false', '110006', '2019-11-25 11:22:19.799', null, null, 'true', null); + +deleteDeviceByApi= delete from master.device_master where id in ('TestDevice1', 'TestDevice2', 'TestDevice3','TestDevice4','TestDevice5','TestDevice6','TestDevice7') + +deleteDeviceRegCenterMapping = delete from master.reg_center_device where regcntr_id in ('TRegCntr1','TRegCntr3') + +createUser=INSERT INTO master.user_detail(\ + id, uin, name, email, mobile, status_code, lang_code, last_login_dtimes, last_login_method, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('testuser', '7234451333', 'Dummy User', 'Dummy@xyz.com', '818876500', 'ACT', 'eng', null, 'PWD', 'true', 'superadmin', '2019-10-21 06:50:27.696842', null, null, null, null),\ + ('testuserdiffzone', '7234451333', 'Dummy User', 'Dummy@xyz.com', '818876500', 'ACT', 'eng', null, 'PWD', 'true', 'superadmin', '2019-10-21 06:50:27.696842', null, null, null, null),\ + ('testusernewzone', '7234451333', 'Dummy User', 'Dummy@xyz.com', '818876500', 'ACT', 'eng', null, 'PWD', 'true', 'superadmin', '2019-10-21 06:50:27.696842', null, null, null, null),\ + ('testuservalid', '7234451333', 'Dummy User', 'Dummy@xyz.com', '818876500', 'ACT', 'eng', null, 'PWD', 'true', 'superadmin', '2019-10-21 06:50:27.696842', null, null, null, null),\ + ('testusernorole', '7234451333', 'Dummy User', 'Dummy@xyz.com', '818876500', 'ACT', 'eng', null, 'PWD', 'true', 'superadmin', '2019-10-21 06:50:27.696842', null, null, null, null); + +deleteUserdetail= delete from master.user_detail where id in ('testuser', 'testuserdiffzone', 'testusernewzone','testuservalid','testusernorole') + +createZoneUserWithDifferentData=INSERT INTO master.zone_user(\ + zone_code, usr_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('CST', 'testuser', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('NDR', 'testuserdiffzone', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('CSB', 'testusernewzone', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('CST', 'testuservalid', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('CST', 'testusernorole', 'eng', 'true', 'Registration Admin', '2019-10-21 06:50:27.950738', null, null, null, null); + +deleteUser= delete from master.zone_user where usr_id in ('testuser', 'testuserdiffzone', 'testusernewzone','testuservalid','testusernorole') + +deleteUserRegCenterMapping=delete from master.reg_center_user where regcntr_id in ('TRegCntr1') + +mapUserRegCenter=INSERT INTO master.reg_center_user(\ + regcntr_id, usr_id, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TRegCntr1', 'testuser', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('TRegCntr2', 'testuservalid', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('TRegCntr4', 'testuserdiffzone', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('TRegCntr3', 'testuserdiffzone', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('TRegCntr5', 'testusernewzone', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null),\ + ('TRegCntr6', 'testusernorole', 'eng', 'true', 'superadmin', '2019-10-21 06:50:27.950738', null, null, null, null); + +deleteMapUserRegCenter=delete from master.reg_center_user where regcntr_id in ('TRegCntr1','TRegCntr2','TRegCntr3','TRegCntr4','TRegCntr5','TRegCntr6'); + +deleteMDSCreatedByAPI=delete from master.mosip_device_service where cr_by in ('110005'); + +validateMDSHistory=select count(*) from master.mosip_device_service_h where sw_version IN ('TestMDS1','TestMDS2'); + +InsertMDSToUpdate=INSERT INTO master.mosip_device_service( \ + id, sw_binary_hash, sw_version, dprovider_id, dtype_code, dstype_code, make, model, sw_cr_dtimes, sw_expiry_dtimes, is_active, cr_by, cr_dtimes) \ + VALUES ('UpdateTestMDS', 'dummy data', 'TestMDS1', 'SYNCBYTE.TCI322', 'Face' , 'Full face', 'Microsoft', 'ca3e7ab9-b4c3-4ae6-8251-579ef933890f', 'now()', 'now()', true, '110005', 'now()') + + +createMachine2Eng=INSERT INTO master.machine_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, mspec_id, public_key, key_index, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Test', 'Dummy MachineTest', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'pkeyI', 'pkeyI', 'CST', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null),\ + ('TestF', 'Dummy MachineTest', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'pkeyI', 'pkeyI', 'CST', 'eng', false, '110005', '2019-07-26 12:18:40.718295', null, null, null, null); + +deleteMachine2Eng=delete from master.machine_master where cr_by in ('110005'); + +createMachine2EngUpdate=INSERT INTO master.machine_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, mspec_id, public_key, key_index, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('TestSpecNe', 'Test123', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'pkeyI', 'pkeyI', 'CST', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null),\ + ('Test', 'Dummy Machine', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'pkeyI', 'pkeyI', 'CST', 'eng', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null),\ + ('Test', 'Dummy Machine', '8C-16-45-5A-5D-0D', 'NM5328114630', '192.168.0.150', null, '1001', 'pkeyI', 'pkeyI', 'CST', 'ara', true, '110005', '2019-07-26 12:18:40.718295', null, null, null, null); + +deleteMachine2EngUpdate=delete from master.machine_master where cr_by in ('110005'); + +createDocumentType=INSERT INTO master.doc_type( \ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('Act','Activate flag test','Test flag activation','eng','false','superadmin','2019-07-26 12:18:40.718295',null,null,null,null),\ + ('Test','Contrat de location','Contrat de location dadresse','eng','true','superadmin','2019-07-26 12:18:40.718295',null,null,null,null),\ + ('DeAct','Deactivate flag test','Test flag deactivation','eng','true','superadmin','2019-07-26 12:18:40.718295',null,null,null,null); +updateDocumentType=,('Test','Contrat de location','Contrat de location dadresse','ara','false','superadmin','2019-07-26 12:18:40.718295',null,null,null,null); + +deleteDocumentType=delete from master.doc_type where code in ('TestDoc01','TestDoc2','Act','DeAct','Test') or cr_by ='110005'; + +createDeviceForUpdate=INSERT INTO master.device_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TestDevicePro12', 'test dev2', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'true', '110006', '2019-11-25 11:22:19.799', null, null, null, null), \ + ('TestDevicePro12', 'test dev2', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'ara', 'true', '110006', '2019-11-25 11:22:19.799', null, null, null, null), \ + ('TestDevicePro13', 'test dev2', 'D4-3D-7E-C0-8C-4A','ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', \ + '2020-08-07 09:13:22.221', '327', 'CST', 'eng', 'true', '110006', '2019-11-25 11:22:19.799', null, null, null, null); + +deleteDeviceForUpdate=delete from master.device_master where id in ('TestDevicePro12','TestDevicePro13'); + +createDevice2Eng=INSERT INTO master.device_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('id1', 'testdeviceswat1', 'D4-3D-7E-C0-8C-4A', 'ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', '2018-12-10T06:12:52.994Z', '327', \ + 'CST', 'eng', 'false', '110005', '2019-11-25 11:22:19.799', null, null, null, null),\ + ('id2', 'testdeviceswat2', 'D4-3D-7E-C0-8C-4A', 'ceec5f62-77b7-46f3-816b-3e734305a9c8', '172.23.174.113', '2018-12-10T06:12:52.994Z', '327', \ + 'CST', 'eng', 'true', '110005', '2019-11-25 11:22:19.799', null, null, null, null); + + +deleteDevice2Eng=delete from master.device_master where name in ('testdeviceswat1','testdeviceswat2','testDevicedummy','testDevicedummy1', 'testDeviceDummy2'); + +validateDeviceHistory=select count(*) from master.device_master_h where name IN ('testdeviceswat1','testdeviceswat2','testDevicedummy','testDevicedummy1'); +deleteDeviceHistory=delete from master.device_master_h where name in ('testdeviceswat1','testdeviceswat2','testDevicedummy','testDevicedummy1'); + +validateMachineHistory=select count(*) from master.machine_master_h where name IN ('Dummy MachineTest'); + +createRegCenterWorkingNonWorkingDays = INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, \ + longitude, location_code, contact_phone, contact_person, number_of_kiosks, \ + working_hours, per_kiosk_process_time, center_start_time, center_end_time, \ + lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, \ + zone_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes) \ + VALUES ('59395', 'TestRegCenter', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('59396', 'TestRegCenter', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'ara', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + null, null),\ + ('59397', 'TestRegCenter', 'REG', 'addr_line1', 'addr_line2', 'addr_line3', '34.52117', \ + '-6.453275', '10106', '944945765', 'John Doe', '3', \ + '8:00:00', '00:15:00', '09:00:00', '17:00:00', \ + '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'KTA', \ + 'CST', 'eng', true, '110005', '2019-08-27 12:28:11.553519', null, null, \ + 'false', null); + +deleteRegCenterWorkNonWork = delete from master.registration_center where id in ('59395', '59396','59397') + +mapworkingDaysToRegCenter = INSERT INTO master.reg_working_nonworking(\ + regcntr_id, day_code, lang_code, is_working, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, \ + is_deleted, del_dtimes)\ + VALUES ('59395', '101', 'eng', 'false', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '102', 'eng', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '103', 'eng', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '104', 'eng', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '105', 'eng', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '106', 'eng', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59395', '107', 'eng', 'false', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '101', 'ara', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '102', 'ara', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '103', 'ara', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '104', 'ara', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '105', 'ara', 'true', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '106', 'ara', 'false', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null),\ + ('59396', '107', 'ara', 'false', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null,null,null,null); + +deleteRegCenterWorkingdaysMapping = delete from master.reg_working_nonworking where regcntr_id in ('59395', '59396') + +regCntrExceptionalHolidaysMapping = INSERT INTO master.reg_exceptional_holiday(\ + regcntr_id, hol_date, hol_name, hol_reason, lang_code, is_active, cr_by, \ + cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('59395', '2020-01-04', 'Emergency Holiday', 'Emergency Holiday', 'eng', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null),\ + ('59395', '2019-11-26', 'Emergency Holiday', 'Emergency Holiday', 'eng', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null),\ + ('59395', '2019-03-10', 'Emergency Holiday', 'Emergency Holiday', 'eng', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null),\ + ('59395', '2019-09-24', 'Emergency Holiday', 'Emergency Holiday', 'eng', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null),\ + ('59396', '2019-02-28', 'Emergency Holiday', 'Emergency Holiday', 'ara', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null),\ + ('59396', '2019-07-11', 'Emergency Holiday', 'Emergency Holiday', 'ara', 'true', 'superadmin', '2020-01-02 11:59:14.79031', null, null, null, null); + +deleteRegCntrExceptionalHolidaysMapping=delete from master.reg_exceptional_holiday where regcntr_id in ('59395','59396') + +createHoliday= INSERT INTO master.loc_holiday(\ + id, location_code, holiday_date, holiday_name, holiday_desc, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES (20010191,'KTA','2020-07-15','Labour Day','Automation labour Holiday','eng','true','110005','2020-05-07T05:30:46.227Z',null,null,null,null); + +deleteUpdateHoliday= delete from master.loc_holiday where cr_by='110005' ; + + +updateHoliday= INSERT INTO master.loc_holiday(\ + id, location_code, holiday_date, holiday_name, holiday_desc, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES (20000191,'KTA','2020-07-15','Labour Day','Automation labour Holiday','eng','true','110005','2020-05-07T05:30:46.227Z',null,null,null,null); + + +createTitle= INSERT INTO master.title(\ + code, name,descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TEST4','TEST4','TEST4','eng','false','110005','2020-05-18T05:19:53.996Z',null,null,null,null); + +createTitleDelete= delete from master.title where cr_by='110005'; + +checkPrimDataAgainstSecData= select count(*) from master.title where lang_code='ara' and code='TEST5'; + +updateCreatedTitle= INSERT INTO master.title(\ + code, name,descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TEST-auto','Master-auto','MASTER-auto','eng','false','110005','2020-05-26T05:19:53.996Z',null,null,null,null); + +deleteUpdatedTitle= delete from master.title where cr_by='110005'; + +createMachineType= INSERT INTO master.machine_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('Laptop-0002','Laptop-0002 test','Laptop-0002 info','eng','false','110005','2020-05-27T05:19:53.996Z',null,null,null,null); + +deleteMachineType= delete from master.machine_type where cr_by='110005'; +checkPrimDataAgainstSecData_MachineType= select count(*) from master.machine_type where lang_code='ara' and code='Laptop-1'; + +createDeviceSpecification= INSERT INTO master.device_spec(\ + id, name, brand, model, dtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES('744','Cam','Technoforte','2020','CMR','1.0','Test DeviceSpec','eng','false','110005','2020-05-27T05:19:53.996Z',null,null,null,null); +deleteCreatedDeviceSpecification= delete from master.device_spec where cr_by='110005'; + +updateDeviceSpecification= INSERT INTO master.device_spec(\ + id, name, brand, model, dtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES('746','Laptop','Dell','2020','CMR','1.1','Dell DeviceSpec','eng','true','110005','2020-05-28T05:19:53.996Z',null,null,null,null),\ + ('746','Laptop','Dell','2020','CMR','1.1','Dell DeviceSpec','ara','true','110005','2020-05-28T05:19:53.996Z',null,null,null,null); +deleteUpdatedDeviceSpecification= delete from master.device_spec where cr_by='110005'; + + + +validatePrimDataAgnstSecData= select count(*) from master.device_spec where lang_code='ara' and dtyp_code='FP1' and brand='Techno'; + +updateMachineType= INSERT INTO master.machine_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('Laptop','Laptop test','Laptop','eng','true','110005','2020-05-28T05:19:53.996Z',null,null,null,null),\ + ('Laptop','Laptop test','Laptop','ara','true','110005','2020-05-28T05:19:53.996Z',null,null,null,null); + +deleteUpdatedMachineType= delete from master.machine_type where cr_by='110005'; + +createMachineSpecification= INSERT INTO master.machine_spec(\ + id, name, brand, model, mtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES('HP001','HP','HP','1234','DKS','3.2','HP brand','eng','true','110005','2020-05-29T05:19:53.996Z',null,null,null,null); + + deleteMachineSpecification= delete from master.machine_spec where cr_by='110005'; + + validatePrimDataForMachineSpec= select count(*) from master.machine_spec where lang_code='ara' and mtyp_code='DKS' and id='HP-06'; + + updateMachineSpecification= INSERT INTO master.machine_spec(\ + id, name, brand, model, mtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES('HP07','HP','HP','1234','DKS','3.2','HP brand','eng','true','110005','2020-05-30T05:19:53.996Z',null,null,null,null); + + deleteUpdatedMachineSpec= delete from master.machine_spec where cr_by='110005'; + + createRegCenterType=INSERT INTO master.reg_center_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('ALT-2', 'alternate','alternate center' ,'eng', 'true', '110005', '2020-05-30T05:19:53.996Z', null, null, null, null); + +deleteCretedRegCenterType= delete from master.reg_center_type where cr_by='110005'; + +validatePrimDataForRegCenter= select count(*) from master.reg_center_type where lang_code='ara' and code='ALT-13'; + +updateRegCenterType= INSERT INTO master.reg_center_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('ALT-3', 'alternate','alternate center' ,'eng', 'true', '110005', '2020-05-30T05:19:53.996Z', null, null, null, null); + +deleteUpdatedRegCenterType= delete from master.reg_center_type where cr_by='110005'; + +createTemplateFileFormat=INSERT INTO master.template_file_format(\ + code, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('Xaml', 'Xaml Test', 'eng', 'true', '110005','2020-06-02T10:04:43.336Z' ,null, null, null, null); + +deleteCreatedTemplateFileFormat= delete from master.template_file_format where cr_by='110005'; + +updateTemplateFileFormat=INSERT INTO master.template_file_format(\ + code, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('PDF', 'PDF Test', 'eng', 'true', '110005','2020-06-02T10:04:43.336Z' ,null, null, null, null),\ + ('PDF-1', 'PDF-1 Test', 'eng', 'true', '110005','2020-06-02T10:04:43.336Z' ,null, null, null, null); + +deleteUpdatedTemplateFileFormat= delete from master.template_file_format where cr_by='110005'; + +createTemplate= INSERT INTO master.template(\ + id, name, descr, file_format_code, model, file_txt, module_id, module_name, template_typ_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('test-002','Test-template','test template','html','model-1','abc','10001','Pre-Registration','Acknowledgement-email-subject','eng','true','110005','2020-06-03T10:15:27.703Z', null,null,null,null); + + +deleleCreatedTemplate= delete from master.template where cr_by='110005'; + + +createHoliday= INSERT INTO master.loc_holiday(\ + id, location_code, holiday_date, holiday_name, holiday_desc, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES (20010191,'KTA','2020-07-15','Labour Day','Automation labour Holiday','eng','true','110005','2020-05-07T05:30:46.227Z',null,null,null,null); + +deleteCreatedHoliday= delete from master.loc_holiday where cr_by='110005' ; + +createGender= INSERT INTO master.gender(\ + code, name, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('MLE-Auto','Test-Auto','eng','false','110005','2020-05-18T05:19:53.996Z',null,null,null,null); + +deleteGender= delete from master.gender where cr_by='110005' ; + +updateGender= INSERT INTO master.gender(\ + code, name, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('MLE-Auto-1','Test-Auto-1','eng','false','110005','2020-05-18T05:19:53.996Z',null,null,null,null); + +deleteUpdatedGender= delete from master.gender where cr_by='110005' ; + +createDocumentCategory= INSERT INTO master.doc_category(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('DocCat00','DocCat','Testing positive Doc','eng','false','110005','2020-05-19T12:46:15.373Z',null,null,null,null); + + +deleteDocumentCategory= delete from master.doc_category where cr_by='110005'; + +validatePrimDocCatUpdatedBySec = select count(*) from master.doc_category where is_active='true' and code='DocCat00'; +isActiveStatusFalse = select count(*) from master.doc_category where is_active='false' and code='DocTestCode11'; + +createDocumentCategoryForUpdate=INSERT INTO master.doc_category(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes) \ + VALUES ('DocCat002','DocCat002','Testing positive002','eng','true','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat003','DocCat003','Testing positive003','eng','true','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat004','DocCat004','Testing positive004','eng','false','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat005','DocCat005','Testing positive005','eng','false','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat005','DocCat004','Testing positive005','ara','false','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat006','DocCat006','Testing positive006','eng','true','110005','2020-05-19T12:46:15.373Z',null,null,null,null),\ + ('DocCat006','DocCat006','Testing positive006','ara','true','110005','2020-05-19T12:46:15.373Z',null,null,null,null); + +checkPrimDocCatUpdatedBySec = select count(*) from master.doc_category where is_active='true' and code='DocCat004'; + + + +deleteDocumentCategoryForUpdate=delete from master.doc_category where cr_by='110005'; + +updateTemplate= INSERT INTO master.template(\ + id, name, descr, file_format_code, model, file_txt, module_id, module_name, template_typ_code, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('test-01','Test-template','test template','html','model-1','abc','10001','Pre-Registration','Acknowledgement-email-subject','eng','true','110005','2020-06-03T10:15:27.703Z', null,null,null,null); + + +deleteUpdateTemplate= delete from master.template where cr_by='110005'; + +createTemplateType= INSERT INTO master.template_type(\ + code, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('Test-SMS','Test-SMS-info','eng','true','110005', '2020-06-05T10:15:27.703Z', null, null, null, null); + +deleteCreatedTemplateType= delete from master.template_type where cr_by='110005'; + +createDeviceType= INSERT INTO master.device_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('GST0', 'GST', 'Test GST', 'eng', 'false', '110005', '2020-06-06T10:15:27.703Z',null, null, null, null); +deleteCreatedDeviceType= delete from master.device_type where cr_by='110005'; + +checkPrimDataAgnstSecData= select count(*) from master.device_type where lang_code='ara' and code='GST00' and name='GST00'; + + +updateDeviceType= INSERT INTO master.device_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('FPT', 'finger print scanner', 'test 1.0.8', 'eng', 'true', '110005', '2020-06-06T10:15:27.703Z',null, null, null, null),\ + ('GST3', 'GST', 'test 1.0.8', 'eng', 'true', '110005', '2020-06-06T10:15:27.703Z',null, null, null, null),\ + ('GST3', 'GST', 'test 1.0.8', 'ara', 'true', '110005', '2020-06-06T10:15:27.703Z',null, null, null, null); + +deleteUpdatedDeviceType= delete from master.device_type where cr_by='110005'; +deleteIndividualType= delete from master.individual_type where cr_by='110005'; +validatePrimDataForIndividualType= select count(*) from master.individual_type where lang_code='ara' and code='TST2' and name='TestInd'; + + +updateIndividualType=INSERT INTO master.individual_type(\ + code, name, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('TST0', 'TestInd', 'eng','true', '110005', '2020-06-08T06:12:52.994Z', null, null, null, null),\ + ('TST0', 'TestInd', 'ara','true', '110005', '2020-06-08T06:12:52.994Z', null, null, null, null),\ + ('TST1', 'TST1', 'eng','false', '110005', '2020-06-08T06:12:52.994Z', null, null, null, null),\ + ('TST1', 'TST1', 'ara','true', '110005', '2020-06-08T06:12:52.994Z', null, null, null, null),\ + ('TST2', 'TST2', 'eng','true', '110005', '2020-06-08T06:12:52.994Z', null, null, null, null); + +deleteUpdatedIndividualType= delete from master.individual_type where cr_by='110005'; + + +# These data is for Auth devices, used by IDA. +crtDeviceDetails = INSERT INTO authdevice.device_detail(\ +id, dprovider_id, dtype_code, dstype_code, make, model, partner_org_name, approval_status, is_active, cr_by, cr_dtimes)VALUES \ +('devIrisD', '1873299273', 'Iris', 'Double', 'EYECOOL', 'TCI322', 'EYECOOL.com', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devFinger', '1873299273', 'Finger', 'Slap', 'Logitech', '4d36e96c-e325-11ce-bfc1-08002be10316', 'Logitech.com', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devIrisS', '1873299273', 'Iris', 'Single', 'Logitech', '4d36e96c-e325-11ce-bfc1-08002be10317', 'Logitech.com', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devFace', '1873299273', 'Face', 'Full face', 'Logitech', '6bdd1fc6-810f-11d0-bec7-08002be2092f', 'Logitech.com', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'); +dltDeviceDetails = delete from authdevice.device_detail where id IN('devIrisD', 'devFinger', 'devIrisS', 'devFace'); + +crtSBI = INSERT INTO authdevice.secure_biometric_interface(id, sw_binary_hash, sw_version, device_detail_id, sw_cr_dtimes, sw_expiry_dtimes, approval_status, is_active, cr_by, cr_dtimes)VALUES \ +('devIrisD', 'binary data', 'SB.WIN.001', 'devIrisD', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devFinger', 'binary data', 'SB.WIN.001', 'devFinger', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devIrisS', 'binary data', 'SB.WIN.001', 'devIrisS', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('devFace', 'binary data', 'SB.WIN.001', 'devFace', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973'); +dltSBI = delete from authdevice.secure_biometric_interface where id IN('devIrisD', 'devFinger', 'devIrisS', 'devFace'); + +crtSBIHist = INSERT INTO authdevice.secure_biometric_interface_h(id, sw_binary_hash, sw_version, device_detail_id, sw_cr_dtimes, sw_expiry_dtimes, approval_status, is_active, cr_by, cr_dtimes, eff_dtimes)VALUES \ +('devIrisD', 'binary data', 'SB.WIN.001', 'devIrisD', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'),\ +('devFinger', 'binary data', 'SB.WIN.001', 'devFinger', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'),\ +('devIrisS', 'binary data', 'SB.WIN.001', 'devIrisS', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'),\ +('devFace', 'binary data', 'SB.WIN.001', 'devFace', '2020-01-01 07:10:46.072973', '2030-12-31 07:10:46.072973', 'Activated', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'); +dltSBIHist = delete from authdevice.secure_biometric_interface_h where id IN('devIrisD', 'devFinger', 'devIrisS', 'devFace'); + +crtAuthDevices = INSERT INTO authdevice.registered_device_master(code, status_code, device_id, device_sub_id, digital_id, serial_number, device_detail_id, purpose, firmware, expiry_date, certification_level, is_active, cr_by, cr_dtimes)VALUES \ +('2a4af583-da31-4800-8cb9-9340643fd1bf', 'REGISTERED', 'FingerDevice', '1', '', '78467169', 'devFinger', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('9ac2ea4c-6ce5-4558-873d-575d130dfc29', 'REGISTERED', 'IrisDevice', '1', '', '78467170', 'devIrisS', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973'),\ +('097b9460-d3d3-4e14-8ac9-c95a734d5d81', 'REGISTERED', 'FaceDevice', '1', '', '097b9460-d3d3-4e14-8ac9-c95a734d5d81', 'devFace', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973'); +dltAuthDevices = delete from authdevice.registered_device_master where code IN('2a4af583-da31-4800-8cb9-9340643fd1bf', '9ac2ea4c-6ce5-4558-873d-575d130dfc29', '097b9460-d3d3-4e14-8ac9-c95a734d5d81'); + +crtAuthDevicesHist = INSERT INTO authdevice.registered_device_master_h(code, status_code, device_id, device_sub_id, digital_id, serial_number, device_detail_id, purpose, firmware, expiry_date, certification_level, is_active, cr_by, cr_dtimes, eff_dtimes)VALUES \ +('2a4af583-da31-4800-8cb9-9340643fd1bf', 'REGISTERED', 'FingerDevice', '1', '', '78467169', 'devFinger', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'),\ +('9ac2ea4c-6ce5-4558-873d-575d130dfc29', 'REGISTERED', 'IrisDevice', '1', '', '78467170', 'devIrisS', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'),\ +('097b9460-d3d3-4e14-8ac9-c95a734d5d81', 'REGISTERED', 'FaceDevice', '1', '', '097b9460-d3d3-4e14-8ac9-c95a734d5d81', 'devFace', 'AUTH','firmware', '2030-12-31 07:10:46.072973', 'L0', true, 'automation', '2020-10-09 07:10:46.072973', '2020-10-09 07:10:46.072973'); +dltAuthDevicesHist = delete from authdevice.registered_device_master_h where code IN('2a4af583-da31-4800-8cb9-9340643fd1bf', '9ac2ea4c-6ce5-4558-873d-575d130dfc29', '097b9460-d3d3-4e14-8ac9-c95a734d5d81'); + +# list of the query-keywords for the bulk query for device management data +crtAuthDevicesData = crtDeviceDetails,crtSBI,crtSBIHist,crtAuthDevices,crtAuthDevicesHist +dltAuthDevicesData = dltAuthDevicesHist,dltAuthDevices,dltSBIHist,dltSBI,dltDeviceDetails + +# Below data is for search and filter APIs automation, so no dependency on DB data. these data will be inserted just +# before the execution starts and will be deleted at the end of the admin execution. +# below are the only zones we should use for automation +crtAutoZone = INSERT INTO master.zone(\ + code, name, hierarchy_level, hierarchy_level_name, hierarchy_path, parent_zone_code, lang_code, is_active, cr_by, cr_dtimes)VALUES\ + ('TPRNTZ', 'Parent',0,'Parent', 'TPRNTZ', null, 'eng', true, 'mosipautouser', '2019-10-21 06:50:26.445996'),\ + ('TPRNTZ', '\u0627\u0644\u0623\u0628\u0648\u064A\u0646',0,'\u0627\u0644\u0623\u0628\u0648\u064A\u0646', 'TPRNTZ', null, 'ara', true, 'mosipautouser', '2019-10-21 06:50:26.445996'),\ + ('LFZL', 'Child1',1,'Child1', 'TPRNTZ/LFZL', 'TPRNTZ', 'eng', true, 'mosipautouser', '2019-10-21 06:50:26.445996'),\ + ('LFZL', '\u0637\u0641\u06441',1,'\u0637\u0641\u06441', 'TPRNTZ/LFZL', 'TPRNTZ', 'ara', true, 'mosipautouser', '2019-10-21 06:50:26.445996'),\ + ('LFZR', 'Child2',1,'Child2', 'TPRNTZ/LFZR', 'TPRNTZ', 'eng', true, 'mosipautouser', '2019-10-21 06:50:26.445996'),\ + ('LFZR', '\u0637\u0641\u06442',1,'\u0637\u0641\u06442', 'TPRNTZ/LFZR', 'TPRNTZ', 'ara', true, 'mosipautouser', '2019-10-21 06:50:26.445996'); +dltAutoZone = delete from master.zone where cr_by = 'mosipautouser'; + +#status type is used in status list and status list is used in user +crtStatusTyp = INSERT INTO master.status_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES ('TSD', 'Tested', 'Tested', 'eng',true,'mosipautouser', '2019-10-21 06:50:26.054295'); +dltStatusTyp = delete from master.status_type where cr_by = 'mosipautouser'; + +crtStatusList = INSERT INTO master.status_list(\ + code, descr, status_seq, sttyp_code, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES('TST', 'TestON', null, 'TSD', 'eng',true,'mosipautouser', '2019-10-21 06:50:27.193756' ); +dltStatusList = delete from master.status_list where cr_by = 'mosipautouser'; + +# auth method is used in user +crtAuthMethod = INSERT INTO master.authentication_method(\ + code, method_seq, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES('TPWD',1,'eng', true, 'mosipautouser', '2019-10-21 06:50:24.650103'); +dltAuthMethod = delete from master.authentication_method where cr_by = 'mosipautouser'; + +# user to use in whole automation, with zonal admin role and mapped to TprntZ zone +crtAutoUser = INSERT INTO master.user_detail(\ + id, uin, name, email, mobile, status_code, lang_code, last_login_dtimes, last_login_method, is_active, cr_by, cr_dtimes)\ + VALUES ('mosipautouser', '5400020000', 'mosipautouser', 'mosiptestmail@gmail.com', '975366148', 'TST', 'eng', null, 'TPWD', true, 'mosipautouser', '2019-10-21 06:50:27.696842'); +dltAutoUser = delete from master.user_detail where cr_by = 'mosipautouser'; + +crtZoneUserMap = INSERT INTO master.zone_user(\ + zone_code, usr_id, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES ('TPRNTZ', 'mosipautouser', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.950738'); +dltZoneUserMap = delete from master.zone_user where cr_by = 'mosipautouser'; + +# below device type only we will be using for automation +crtDeviceTyp = INSERT INTO master.device_type(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES ('TDtyp', 'Finger test Scanner', 'For test finger', 'eng', true, 'mosipautouser', '2019-10-21 06:50:24.840922'),\ + ('TDtyp', '\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0645\u0627\u0633\u062D \u0627\u0644\u0636\u0648\u0626\u064A', 'For test finger', 'ara', true, 'mosipautouser', '2019-10-21 06:50:24.840922'); +dltDeviceTyp = delete from master.device_type where cr_by = 'mosipautouser'; + +# below device spec only we will be using for automation +crtDeviceSpec = INSERT INTO master.device_spec(\ + id, name, brand, model, dtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES ('TDSpec', 'Finger Test', 'brand', 'model', 'TDtyp', '1.12', 'To scan fingerprint', 'eng', true, 'mosipautouser', '2019-10-21 06:50:26.685205'),\ + ('TDSpec', '\u0627\u062E\u062A\u0628\u0627', '\u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062A\u062C\u0627\u0631\u064A\u0629', '\u0646\u0645\u0648\u0630\u062C', 'TDtyp', '1.12', 'To scan fingerprint', 'ara', true, 'mosipautouser', '2019-10-21 06:50:26.685205'); +dltDeviceSpec = delete from master.device_spec where cr_by = 'mosipautouser'; + +crtDevice = INSERT INTO master.device_master(\ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, dspec_id, zone_code, lang_code, is_active, cr_by, cr_dtimes)\ + VALUES ('TdeviceSF', 'TestDevice', 'test mac', 'test serial', null, null, 'TDSpec', 'TPRNTZ', 'eng', true, 'mosipautouser', '2019-07-26 12:18:40.718295'),\ + ('TdeviceSF', '\u062C\u0647\u0627\u0632 \u0627\u062E\u062A\u0628\u0627\u0631', 'test mac', 'test serial', null, null, 'TDSpec', 'TPRNTZ', 'ara', true, 'mosipautouser', '2019-07-26 12:18:40.718295'),\ + ('TdeviceSF1', 'TestDevice1', 'test mac1', 'test serial1', null, null, 'TDSpec', 'LFZL', 'eng', true, 'mosipautouser', '2019-07-26 12:18:40.718295'),\ + ('TdeviceSF1', '\u062C\u0647\u0627\u0632 \u0627\u062E\u062A\u0628\u0627\u0631 1', 'test mac1', 'test serial1', null, null, 'TDSpec', 'LFZL', 'ara', true, 'mosipautouser', '2019-07-26 12:18:40.718295'); +dltDevice = delete from master.device_master where cr_by = 'mosipautouser'; + +crtLocHier = INSERT INTO master.loc_hierarchy_list(hierarchy_level, hierarchy_level_name, lang_code, is_active, cr_by, cr_dtimes) VALUES \ + (0, 'test parent', 'eng', true, 'mosipautouser','2019-10-21 06:50:25.785225'), \ + (0, '\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0648\u0627\u0644\u062F\u064A\u0646', 'ara', true, 'mosipautouser','2019-10-21 06:50:25.785225'),\ + (1, 'Child', 'eng', true, 'mosipautouser','2019-10-21 06:50:25.785225'),\ + (1, '\u0637\u0641\u0644', 'ara', true, 'mosipautouser','2019-10-21 06:50:25.785225'); +dltLocHier = delete from master.loc_hierarchy_list where cr_by = 'mosipautouser'; + +crtLoacation = INSERT INTO master.location( \ + code, name, hierarchy_level, hierarchy_level_name, parent_loc_code, lang_code, is_active, cr_by, cr_dtimes) VALUES \ + ('TLOC', 'Location test M', 0, 'test parent', null, 'eng', true, 'mosipautouser', '2019-10-21 06:50:25.31645'), \ + ('TLOC', '\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0645\u0648\u0642\u0639', 0, '\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0648\u0627\u0644\u062F\u064A\u0646', null, 'ara', true, 'mosipautouser', '2019-10-21 06:50:25.31645'),\ + ('TCLOC', 'childloctest', 1, 'Child', 'TLOC', 'eng', true, 'mosipautouser', '2019-10-21 06:50:25.31645'),\ + ('TCLOC', '\u0634\u0627\u0630', 1, '\u0637\u0641\u0644', 'TLOC', 'ara', true,'mosipautouser', '2019-10-21 06:50:25.31645'); +dltLoacation = delete from master.location where cr_by = 'mosipautouser'; + +crtRegCentTyp = INSERT INTO master.reg_center_type( \ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TREG', 'Test R cent', 'Center For test', 'eng', true, 'mosipautouser', '2019-10-21 06:50:25.785225'), \ + ('TREG', '\u0627\u062E\u062A\u0628\u0627\u0631 R \u0627\u0644\u0645\u0627\u0626\u0629', '\u0645\u0631\u0643\u0632 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631', 'ara', true, 'mosipautouser', '2019-10-21 06:50:25.785225'); +dltRegCentTyp = delete from master.reg_center_type where cr_by = 'mosipautouser'; + +crtRegCenter = INSERT INTO master.registration_center( \ + id, name, cntrtyp_code, addr_line1, addr_line2, addr_line3, latitude, longitude, location_code, contact_phone, contact_person, number_of_kiosks, working_hours, per_kiosk_process_time, center_start_time, center_end_time, lunch_start_time, lunch_end_time, time_zone, holiday_loc_code, zone_code, lang_code, is_active, cr_by, cr_dtimes) \ + VALUES ('TRCnt', 'map test center', 'TREG', 'address1', 'address2', 'address3', '34.522414', '-6.320471', 'TCLOC', '0000000000', 'owner', 2, '8:00:00', '00:15:00', '09:00:00', '17:00:00', '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'HLOC', 'LFZL', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.012387'), \ + ('TRCnt', '\u0645\u0631\u0643\u0632 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u062E\u0631\u0627\u0626\u0637', 'TREG', '\u0627\u0644\u0639\u0646\u0648\u0627\u0646 1', 'address2', 'address3', '34.522414', '-6.320471', 'TCLOC', '0000000000', '\u0635\u0627\u062D\u0628', 2, '8:00:00', '00:15:00', '09:00:00', '17:00:00', '13:00:00', '14:00:00', '(GTM+01:00) CENTRAL EUROPEAN TIME', 'HLOC', 'LFZL', 'ara', true, 'mosipautouser', '2019-10-21 06:50:27.012387'); +dltRegCenter = delete from master.registration_center where cr_by = 'mosipautouser'; + +crtRegCntrDev = INSERT INTO master.reg_center_device( \ + regcntr_id, device_id, lang_code, is_active, cr_by, cr_dtimes) \ + VALUES ('TRCnt', 'TdeviceSF', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltRegCntrDev = delete from master.reg_center_device where cr_by = 'mosipautouser'; + +crtMachineTyp = INSERT INTO master.machine_type(code, name, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TMTYP', 'Test M Type', 'Test Mach type', 'eng', true, 'mosipautouser', '2019-10-21 06:50:25.446465'), \ + ('TMTYP', '\u0627\u062E\u062A\u0628\u0627\u0631 \u0646\u0648\u0639 M','\u0627\u062E\u062A\u0628\u0627\u0631 \u0646\u0648\u0639 \u0645\u0627\u062E', 'ara', true, 'mosipautouser', '2019-10-21 06:50:25.446465'); +delMachineTyp = delete from master.machine_type where cr_by = 'mosipautouser'; + +crtMachSpec = INSERT INTO master.machine_spec( \ + id, name, brand, model, mtyp_code, min_driver_ver, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TMSPC', 'Testro', 'brand', 'model', 'TMTYP', '1.454', 'To test enrol', 'eng', true,'mosipautouser', '2019-10-21 06:50:26.846071'), \ + ('TMSPC', '\u062A\u0633\u062A\u0631\u0648', '\u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062A\u062C\u0627\u0631\u064A\u0629', '\u0646\u0645\u0648\u0630\u062C', 'TMTYP', '1.454', '\u0644\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u062A\u0633\u062C\u064A\u0644', 'ara', true,'mosipautouser', '2019-10-21 06:50:26.846071'); +delMachSpec = delete from master.machine_spec where cr_by = 'mosipautouser'; + +crtMachine = INSERT INTO master.machine_master( \ + id, name, mac_address, serial_num, ip_address, validity_end_dtimes, mspec_id, public_key, key_index, zone_code, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TMachid', 'test mach', 'test mac', 'test serial', 'test ip','2029-10-21 06:50:27.523105', 'TMSPC','testpublickey', 'testKeyIndex', 'TPRNTZ', 'eng', 'true', 'mosipautouser', '2019-10-21 06:50:27.523105'), \ + ('TMachid', '\u0627\u062E\u062A\u0628\u0627\u0631', 'test mac', 'test serial', 'test ip','2029-10-21 06:50:27.523105', 'TMSPC','testpublickey', 'testKeyIndex', 'TPRNTZ', 'ara', 'true', 'mosipautouser', '2019-10-21 06:50:27.523105'), \ + ('TMachid1', 'test mach1', 'test mac1', 'test serial1', 'test ip1','2029-10-21 06:50:27.523105', 'TMSPC','testpublickey1', 'testKeyIndex1', 'LFZL', 'eng', 'true', 'mosipautouser', '2019-10-21 06:50:27.523105'), \ + ('TMachid1', '\u0627\u062E\u062A\u0628\u0627\u0631 1', 'test mac1', 'test serial1', 'test ip1','2029-10-21 06:50:27.523105', 'TMSPC','testpublickey1', 'testKeyIndex1', 'LFZL', 'ara', 'true', 'mosipautouser', '2019-10-21 06:50:27.523105'); +dltMachine = delete from master.machine_master where cr_by = 'mosipautouser'; + +crtRegCntrMach = INSERT INTO master.reg_center_machine( \ + regcntr_id, machine_id, lang_code, is_active, cr_by, cr_dtimes) \ + VALUES ('TRCnt', 'TMachid1', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltRegCntrMach = delete from master.reg_center_machine where cr_by = 'mosipautouser'; + +crtDocTyp = INSERT INTO master.doc_type( \ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TDTYP', 'Tdoctyp', 'test document', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'),\ + ('TDTYP', '\u062A\u062F\u0648\u0637\u064A', '\u0648\u062B\u064A\u0642\u0629 \u0627\u062E\u062A\u0628\u0627\u0631', 'ara', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltDocTyp = delete from master.doc_type where cr_by = 'mosipautouser'; + +crtDocCat = INSERT INTO master.doc_category(\ + code, name, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TDCAT', 'Tdoccat', 'test document', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'),\ + ('TDCAT', '\u062A\u062F\u0648\u0643\u0627\u062A', '\u0648\u062B\u064A\u0642\u0629 \u0627\u062E\u062A\u0628\u0627\u0631', 'ara', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltDocCat = delete from master.doc_category where cr_by = 'mosipautouser'; + +crtDocCatTyp = INSERT INTO master.valid_document( \ + doctyp_code, doccat_code, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TDTYP', 'TDCAT', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltDocCatTyp = delete from master.valid_document where cr_by = 'mosipautouser'; + +crtTitle = INSERT INTO master.title(code, name, descr, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TTTL', 'test title','title testing', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'),\ + ('TTTL', '\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631','\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0639\u0646\u0648\u0627\u0646', 'ara', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltTitle = delete from master.title where cr_by = 'mosipautouser'; + +crtGender = INSERT INTO master.gender(code, name, lang_code, is_active, cr_by, cr_dtimes)VALUES \ + ('TGDR', 'test gender', 'eng', true, 'mosipautouser', '2019-10-21 06:50:27.732946'),\ + ('TGDR', '\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u062C\u0646\u0633', 'ara', true, 'mosipautouser', '2019-10-21 06:50:27.732946'); +dltGender = delete from master.gender where cr_by = 'mosipautouser'; + +# list of the query-keywords for the bulk query +allAutoCrt = crtAutoZone,crtStatusTyp,crtStatusList,crtAuthMethod,crtAutoUser,crtZoneUserMap,crtDeviceTyp,\ + crtDeviceSpec,crtDevice,crtLocHier,crtLoacation,crtRegCentTyp,crtRegCenter,crtRegCntrDev,crtMachineTyp,\ + crtMachSpec,crtMachine,crtRegCntrMach,crtDocTyp,crtDocCat,crtDocCatTyp +allAutoDlt = dltRegCntrDev,dltRegCntrMach,dltRegCenter,dltRegCentTyp,dltDevice,dltDeviceSpec,dltDeviceTyp,dltMachine,\ + delMachSpec,delMachineTyp,dltZoneUserMap,dltAutoZone,dltAutoUser,dltStatusList,\ + dltStatusTyp,dltAuthMethod,dltLoacation,dltLocHier,dltDocCatTyp,dltDocCat,dltDocTyp + +# temp for test, need to add fields in permanent +#allAutoCrt = crtTitle,crtGender +#allAutoDlt = dltTitle,dltGender + +# verifying the status in DB when create API runs with only one language[i.e when record created in primary language] +createDeviceSpecIsActive= select count(*) from master.device_spec where is_active='false' and id='743' and lang_code='eng'; +createMachineTypeIsActive= select count(*) from master.machine_type where is_active='false' and code='Laptop-2' and lang_code='eng'; +createGenderIsActive= select count(*) from master.gender where is_active='false' and code='Genderdummy-0' and lang_code='eng'; +createTemplateFileFormateIsActive= select count(*) from master.template_file_format where is_active='false' and code='Docx' and lang_code='eng'; +createDeviceTypeIsActive= select count(*) from master.device_type where is_active='false' and code='GST31607' and lang_code='eng'; +createHolidayIsActive= select count(*) from master.loc_holiday where is_active='false' and holiday_name='AutoTest user 16july' and lang_code='eng'; +createMachineSpecIsActive= select count(*) from master.machine_spec where is_active='false' and id='HP04' and lang_code='eng'; +createRegCentrTypeIsActive= select count(*) from master.reg_center_type where is_active='false' and code='RegALT-03' and lang_code='eng'; +createTitleIsActive= select count(*) from master.title where is_active='false' and code='crTEST0011' and lang_code='eng'; +createTemplateIsActive= select count(*) from master.template where is_active='false' and id='crTempTest-03' and lang_code='eng'; +createTemplateTypeIsActive= select count(*) from master.template_type where is_active='false' and code='crTest-info-Template' and lang_code='eng'; +createBlackLstWordIsActive= select count(*) from master.blacklisted_words where is_active='false' and word='asshole' and lang_code='eng'; + + +deleteBlackListedWord=delete from master.blacklisted_words where cr_by='110005' + +deleteDynamicField= delete from master.dynamic_field where cr_by='110005'; +createDynamicFiledData=INSERT INTO master.dynamic_field(\ + id, name, description, data_type, value_json, lang_code, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('DF-001', 'Technology', 'Technology Known', 'String', '[{"code":"Angular","value":"Angular","langCode":"eng","active":true}]', 'eng', 'true', '110005', '2020-08-07 09:08:51.607', null, null, null, null); \ No newline at end of file diff --git a/api-test/src/main/resources/config/adminTokenGeneration.properties b/api-test/src/main/resources/config/adminTokenGeneration.properties new file mode 100644 index 00000000000..0668f397392 --- /dev/null +++ b/api-test/src/main/resources/config/adminTokenGeneration.properties @@ -0,0 +1,5 @@ +token.request.id=mosip.io.userId.pwd +token.request.appid=registrationclient +token.request.username=110005 +token.request.password=mosip +token.request.version=1.0 \ No newline at end of file diff --git a/api-test/src/main/resources/config/application.properties b/api-test/src/main/resources/config/application.properties new file mode 100644 index 00000000000..db5e5d90007 --- /dev/null +++ b/api-test/src/main/resources/config/application.properties @@ -0,0 +1,88 @@ +## End point(s) relative URLs +encryptionPath=v1/identity/encrypt?isInternal=false +internalEncryptionPath=v1/identity/encrypt?isInternal=true +encodePath=v1/identity/encode +decodePath=v1/identity/decode +signRequest=v1/identity/signRequest +decryptPath=/idauthentication/v1/internal/decrypt +decryptkycdataurl = v1/identity/decryptEkycData +encodeFilePath=v1/identity/encodeFile +decodeFilePath=v1/identity/decodeFile/?fileName=cbeff +validateSignaturePath=v1/identity/validateSign?signature=$signature$ +splitEncryptedData=v1/identity/splitEncryptedData +bioValueEncryptionTemplate=config/bioValueEncryptionTemplate.json +idaMappingPath=config/mapping.properties +getIdaCertificateUrl=/idauthentication/v1/internal/getCertificate +getPartnerCertificateUrl=/v1/partnermanager/partners/{partnerId}/certificate +putPartnerRegistrationUrl=/v1/partnermanager/partners +getPartnerCertURL=v1/identity/generatePartnerKeys +uploadCACertificateUrl=/v1/partnermanager/partners/certificate/ca/upload +uploadIntermediateCertificateUrl=/v1/partnermanager/partners/certificate/ca/upload +uploadPartnerCertificateUrl=/v1/partnermanager/partners/certificate/upload +uploadSignedCertificateUrl=v1/identity/updatePartnerCertificate +getKeyCloakTokenUrl = /auth/realms/master/protocol/openid-connect/token +masterSchemaURL=/v1/masterdata/idschema/latest +preregLoginConfigUrl=/preregistration/v1/login/config +uploadIdaFirurl=v1/identity/uploadIDACertificate?certificateType=IDA_FIR&moduleName=$MODULENAME$&certsDir=$CERTSDIR$ +uploadPartnerurl=v1/identity/uploadIDACertificate?certificateType=PARTNER&moduleName=$MODULENAME$&certsDir=$CERTSDIR$ +uploadInternalurl=v1/identity/uploadIDACertificate?certificateType=INTERNAL&moduleName=$MODULENAME$&certsDir=$CERTSDIR$ +authPolicyUrl=/v1/policymanager/policies +policyGroupUrl=/v1/policymanager/policies/group/new +publishPolicyurl=/v1/policymanager/policies/POLICYID/group/POLICYGROUPID/publish +clearCertificateURL=v1/identity/clearKeys?moduleName=$MODULENAME$&certsDir=$CERTSDIR$ +fetchLocationData=/v1/masterdata/locations/all +fetchLocationLevel=/v1/masterdata/locations/level/ +fetchTitle=/v1/masterdata/title +fetchZoneCode=/v1/masterdata/zones/hierarchy/ +fetchZone=/v1/masterdata/zones/zonename +decryptKycUrl=/v1/identity/decryptEkycData +retrieveIdByUin=/idrepository/v1/identity/idvid/ +fetchLocationHierarchyLevels=/v1/masterdata/locationHierarchyLevels/ +fetchLocationHierarchy=/v1/masterdata/locations/locationhierarchy/ +fetchRegCent = /v1/masterdata/registrationcenters +fetchLocationDataWithCode = /v1/masterdata/locations/info/ +generateArgon2HashURL=/v1/keymanager/generateArgon2Hash +appointmentavailabilityurl=/preregistration/v1/appointment/availability/ +validateSignatureUrl=v1/identity/validateSign +vciContextURL=https://www.w3.org/2018/credentials/v1 + +## As below are non changble values, move these out from properties file +appIdForCertificate=IDA +partnerrefId=PARTNER +internalrefId=INTERNAL +idaFirRefId=IDA-FIR +proxyOTP=111111 +wrongOtp=123455 + +## +regcentretobookappointment=10003 +keysToValidateInKYC=phoneNumber,emailId,age,dob,name_eng +#partner certificate refId, used for getting the partner certificate +partner=9998 +signatureheaderKey=response-signature +uinGenMaxLoopCount=20 +uinGenDelayTime=10000 +Delaytime=90000 + + +## Remove this from properties file +picturevalue=iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAABCSURBVChTbYtBEgAgCAL7/6eNhBy09qDi6gpjXZSxUU8o/jrfpDmcmY1QAOWhgTswv6sSm8zVhULlgst++8T51IjYNUHdI+4XZHoAAAAASUVORK5CYII= + + +## Check are we using these properties. If not remove them +zoneCode_to_beMapped=NTH +expireOtpTime=180000 +demoAppVersion=1.2.1-SNAPSHOT +AttributetoBeUpdate:Name +ValuetoBeUpdate:Sohan + +## As these will be based on regEx, move these out from proprties file +passwordForAddIdentity=12341234_Aa +passwordToReset=12341234_AaB + +## Need to revisit these propeties +XSRFTOKEN=7d01b2a8-b89d-41ad-9361-d7f6294021d1 +codeChallenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM +codeVerifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk +policyNumberForSunBirdRC=654321 +challengeValueForSunBirdRC=eyJmdWxsTmFtZSI6IkthaWYgU2lkZGlxdWUiLCJkb2IiOiIyMDAwLTA3LTI2In0= \ No newline at end of file diff --git a/api-test/src/main/resources/config/bioValue.properties b/api-test/src/main/resources/config/bioValue.properties new file mode 100644 index 00000000000..f40dee726e0 --- /dev/null +++ b/api-test/src/main/resources/config/bioValue.properties @@ -0,0 +1,49 @@ +#FaceBiometricValue +FaceBioValue=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 + +# +RightIrisBioValue=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 + +# +LeftIrisBioValue=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 + +# +RightThumbBioValue=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 +# +LeftThumbBioValue=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 + +# +RightLittleFingerBioValue=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 + +# +RightMiddleFinger=RklSADAyMAAAAPnFAAEBAQAA+bUH5gwcDCAsACQAAAAAAAEwAEAADwIAQAIAQAIDAAEB9AH0AfQB9AgFHQDuAWUAAPlEAAAADGpQICANCocKAAAAFGZ0eXBqcDIgAAAAAGpwMiAAAABHanAyaAAAABZpaGRyAAABZQAAAO4AAQcHAAAAAAAPY29scgEAAAAAABEAAAAacmVzIAAAABJyZXNjmcoAAZnKAAEAAAAAAABqcDJj/0//UQApAAAAAADuAAABZQAAAAAAAAAAAAAA7gAAAWUAAAAAAAAAAAABBwEB/2QAIwABQ3JlYXRvcjogSmFzUGVyIFZlcnNpb24gMS45MDAuMf9kABAAAUVuY0lEOkdSQlQwMf9SAAwAAgAJAAUEBAAB/1wAE0BASEhQSEhQSEhQSEhQSEhQ/5AACgAAAAD4TAAB/5PfGxAJVOd3xzcYju1w65VFhKpnvPDf01V1VgNZ+RPmY8F3I/pOxkn9K+GrMqzUdBPfJoBogICA8YBHH+QDw8GEb7RbPyqA8aBrzYJZR7MaKyHgwc5MgPwJgD2rH0ie8sIiVQNHVh01StR61E+hUik+1REE3YkEWJDLTkVXmP91SaOygXaAw1COQbCIoFmvmK5UaRZRAEW+iG9KjAw+X23w7E8eVIUrOpyQMUD8Sq/ZJuS9uOU4ca6uMaq+lFppaK6QhkG1Ow7zbEujAHHkIqYa38SIkBVsY8saVF2xMoD9sBv54Ex5uC3T+pP1BvxkvwnfmUC+RjloRt2zgVgnluK/fPWeeB5KbTWBPAwVB3sLS+EFwFV1jE7PsAJe/bl1LPbIHOsxAHx2JyvKgldgIswcs3T/Rj/6i2D+ypE12HIfri2uJOCuPK6TUsR8xtKvYIPhvG1CALTbQbADXE6PkWgASLBIr5eTbr7N1i+EpWvOVIDFozzUiH/s8Cl/PLi/y/29WiqF+L/dr7Qpozlp1Laohff/DlHn/xfjejiprujjMRxKLtinn1DJkMjo/H5WhPjx0vEutYqA/EWNALkTnSgBjLJvS1Cjkb6copxnVwDm/U5UAeC7OtXGTK8reHFzeuWgRPTcs1GCcb4LrKo0FYDFdy4mjGYV2WRTd+KkEG8ItPX5iP3TjdgphG0EgNQ2pqQHWiRVDAUXHU1TrV91p5uHWB1vimCC5aeJbgPBYv3cUk1wiWSG/MCLubxaSMJPn3tc3GYjg5SivPuEKVvsQ9VLMYN1ASOOILAI1mtknnbNch0HbPNK27P7t9rBv1v0GhsQ3bPyz3v7ej2zeeeoo+E8G4NAU3d60KePgfGzwySlUy460LikcC5zcCgxoIWDAEi+vX3m0B8qlq/bjcTCTAgaoxHQ8A+piBgHx31pWdFnpyeaf9paNkYWoYqTi35zJJ6Bz6sRzwTgZyE8UHrYXypQkm5Ej9A2f4n8pffITXzmMLdcoeb0Z7S2y6tf6Yli31Jzg0Sx1jRFERvCIOFVNtNcmDiajLg3LmSrwW8rW1Ll8JzYy0lylK89kK0AinTkqhnnwaroIrg5icfvUd3BameRzf4QX8Mhs5mnzwlgsLeYVcn4TY2C782TtijvrIuhOSW+QeqzdABSv40deWgqEBeINM/hragdW3Umyw8vclVFC8idZvZHc9T9n4PKt2NMDAjlEfWQKZSlCY5dS7n6VH1tLTsHYDaPQnOS5arTI9J5s97X7VhXRyfpcxG9G986bMWkpwdU7R7SxaR6brtxyb2glJMj6CGyj5Ktyu4rTghC0uRTpCCkxf5FFR5WPkUSlpvi5IgJJiAkBYYbMCfBaYnuTCf3I9HLY5KUWR8q9Gy68u2U36Uun3iG374LSvo6TzCe22jyi5vFmGESvj1l41asykkcSiScq7jgQLJ7e+FmzAh/ND6zbK7Jwu+HEFeQ5hlrRpqQQ3/8p7BaskExnCso+yb4J+p2ufuRUVTctO8qXcsZ8eGEnVcTMuNjB8xwhYFCHxi9Vr7q/oovwNt4fVVKaY4TLdmIvQtGmvj2PxIwQsg7lIovS3Fzj1YxlDP6hNqpAIA7ouf0MdsJiGiwS2wBOqE01OeCKyFHuiKX/kyvDYl5UcAs47llOFGEpY6obZSvAT9ZsSD+QKm3zA0QXjuE4KybYXTVfXAEQtAvRMiCgIE+YikETHuScCeF+DJPy7YAohwbHp75xAASydU19bkjmnzloCLh1g25FOeM+vUnIovr5l0KV5P7QCs5pbzfaAzOSiyEEA/55LDV7TzA2dK8NDUqPwPFIPqMSSnP/uBQcN3E1x+rjzkri3qU21a8aCJ7IgBhZZfAVhFat0h1fyqVGlOe0hiRV+jDO/9gZvjVlsQe/z6nOtCaZU1vt8WiYkh03Kb6yqWpzho9+Loa75rScrn7D6H3gGhAlhqolCZDiI8cTYxj0w19TUgyzBVxBPKnUpT2CgZSv1sTCfTo4zMbjv1Qsx/gEBnMA5j5CX1bFKOqkI82YJ2/zQxpER/SZESyWzIPxNbZ6VxCJcwR0LWoVmQ3ZhPrcG1F6nC50EuYUZxuYXt/lGs9mmnLRSa2YXWirMxeTWrlL8TMRb5Be0Mwk3YTgtHNk7qAHj9hqPvCI0tmaylBwea8mXj5lNowuL1wAVD/AYanUa7I8pqOMcAtRciJO0les7+DDvcDM01YtldSeNvuZ3YXnve8LNmgeGbuYHHAiVNPDdUpcrUMjvaxXYMAGgxNEyn1bvEj11ewE6Zv1A+mnVlGXArXwFN+NwiOFItDobnmMV/dcqS2BNPX2e+aoNjQKz+2GVW8J+4kjDfhodELC04wFzUFmf81yrnvxlNwpEnVYegfLr0YTy2oddDbgCglVtAfh5KPgG/OVdP6eUOQi1P9sUNK9e+S/gqTJtA9FUlQ0oHFMwOYo8unXqijD4oMtxNPj6dAW7UfB8ZOwwl04HWlIysIVRiPbMbMhxcwMR+0lcsql/jtwyAv6EcYJFSjWdr/cbjjKE57WnWPJ/rWeyzamZxHxjlHX1Lt1HSg9d3LHVmjLZyQTPV6sGg1vnRRxw8z30w2D8Qi9RhvwaQ66wA7zCegTgbbsy5jahfX26/2Ze1uBnw/qKPQZfojWHX7tmZu76mS1OwUIyvk4Bbs95mGnjtSTeYLRE5wzd840FDsPLMGJ6jYve72tDNRd3SbAou6jB9dL3T8WtI3LwaQwRUJiKMlro5zWlIbxF4ET+Y3pgRRtTszaKfeLiyKN9nTIcKIy4raMUxQ6sFdScFOKzypymEtB8L3PDZl38/C7T3axkrYW0q+7SVEYzyH0QCtsB4szhZ0noCxYMtoPtXWsfYyibEexNH/NCVoDXJE4bYfVGC+uLmTpBxBz6XhO+So8v9Zy/UE1g7t8rbc/zQ8V5ZR2GwJEIG0T11yERTdeQDZrgZLdyGGim/KdXCzivP1d6dANLrxwxgxMnRJi1Ib1BXfXP92MnwzZVeOjAwBN3C+PC+kGHdx4jBXqqX7nDg57wozv+XAHBdnN/nK9jPMNULlbe6Mo3/QkxYueJWBxjDOWCK9r5nN4jPL+RQu+r3yJpCRMF8EYjAnMRlHSvPGy0Ham6nCEs/dumyA+ovsOKANJzxg2HEhzu6TD1ccwqY90WanjyWhPJkSDkQFAjxXvBmxaRkaaj9KKd4WpcSSv+Os8E14VJ7Rio3sgdlc9XuLZ1rGzJNwPaSDQle+u+JYPW9xnOod7G9sJAYcyytw4uRC4UKUj4NCvt2izNGKEjUzzCshIDqN3zYYZerMwvb60F5aJCWl1WBCd+QZ/zAStO4HTj6TdEbrcGa2ak38HCGw8sKm2of6W3Wud+W9b6U8GMIQz+YOv5aFYtFPmOLSeo2MGpvYiMiR0le/vtNkviq/6Y4DEXqx03g3DimikIO76rAwEXXCFy2vEBZMQ7gLzpgTJlo3/IRG+BVRpxWEhoIrzq9tWbm9CMeZZBG7V2/UwzO4B5sEjLGh/Qwv6GI/WOoA/PnPbXXpEvejDNbLwRumuByhfzYMICDHHwU7A3z1RAnEOKkN0opQSkqYTeF91m1zVXGEL/3bgaSb6Aju/vizHpWw5C+TMgMC0WhDjDEufF9EUgaSLwuiuodaYDdwF1cL5SEI8wYPP5rq0tw43tnkdzSpNyB5bHXIO83HsjkazxP795jjlu421xNJI5IWQ2Hrpa7OTEyax7jp3rIThDt6a4A4+bMjv5qFxfQHRQc1z739Z7rnTgOkRUYICrXvSmXo+Bk2ANxRu/TCNiU4w0kBojI/La45JtpC0qq0hsriFi/6kTgfAUQe+NimyOymOYb0Nxqw8XCrwi56tnv8VAH5qPL5FTRVPzzWgZOaaGf48IOI1GDy8bzuAgk0Mhhr/HRMoGzcsgw3Sgl5Jnc0KWev40EYAvkh8DyQoxegq/PUXvKLeYf7GO7aT1+QDemDD5e+2lS3uUpOI0N+2iuchyHtTT/cAXG1EiqBDpsiioTfA8dFJG+ldF+EQI0BuW1PyRn6I9APxlEN0raSudqiD3YzajCK8JvPciNArBkvUQVKL/m4QmzsxiskDzn6qOSkN8560zPXx8Xy73G1/tXZeF22jhkNm4SFPOD1SztdQAzUj+t7ZZ6pS/EKI5DTJoyPSy+7PtspZsqdTfoGxxanqsQcrdbygHMNp+izuyNW7/jm1GU8vuUSqqiqUXNk2rCR3hP+Fl9Pl9kdMWjDgjo+uTbqDl+bKcXuXv8vz2GgPXQTVbUAg49dkajCv3QRvwq25osgN+o/DMCy3Dyvv1TJ6sAaxekLeawTO2NvJqf0Pi4x5tYLekQrOvy5XO/mqErAb3Vke2UdEKIdCi27YEuHLw229TGuZFgPYT/NLLGfURbYxn7MeQUt5xZeV0X9KHVo3hPvtpNxJ+zVVQNEtnDDEF6M+QKFLIGKWLPRGfhzdAaNWnCBHrkjNUzv9DO2pQHWtThLDfYR0SCbwivI6TPte8gTXYlyLV/nBpnpZ/2dxbzo4TUj5Fmfx+AKfFrcd3/5Eqb2nvipTweUmDTPSb6pCEodsGiQ7qmfA+C8Rc4JFOOoyCHIrrpA8AzCXQLHbuBopu3nwWTLRaDl3DGh4ntdrSrki2tVdKe6dwRD07dVQI1vsDg+WAgWcdPAX4lYe5p7/mpF9sjWgsEP/0GxMkc74IZNquwr/mRewvYPYQ4+sNUuqDlNFe6OjZ3pFCdMtTRjgfpO00LgVnQXr8IfElt3/GWuTp1o01Uq246f/iCMbzvf/vQvKR4FJAh6URinx102hxHCbwmESxZEaqi2H2OebpvR7YlkJTonBRd/e8QS6ONFWbRvSkO4NQu8b4TA475pfbGBX5tp+8JmoaIFqGMA1v1kkRs+N6o50xlbPXhFWO8GFIA9m+Sk7VyPI98j80NgLIzxP4F5mYN0wePtIcusy99JcLg5BnAMcdZ7NUi/ca4jmGL3bWoV/pb+rbaEYQkn3xMXobYNpxjOhsnFKuRnx9rrns1058tqVaAfd8GYIQMuzKw7aJzeww+9Rq4a0S9aPOaekXo4sGk8qNjYk0I24OLPvdhk4jY47H4IeIzXAEJyqYdlfF7JlbnyqQUeQ+/YgTHJLziksgMWVc/AOAkS0qb6TeGjRMXYPlLPaGCMM6WIyMvPKyqtJ0SSYwm8t5FFCS3fesQ8XJJkHZFdfEH3ZeMwLAGCZ3YT0sXtan1mHkYX0G7X0tYIW7Xw43rm/k/nX9Ae8EzSepuZBRsbn8TmkUCbgo1Xscb2lEx/h5CjekI4W8o1lLZ7+22alBmV8+Gr3Uv+kjedQcV0nJSWn6cdKjjG+4bxcpkFGCsG4utNECHpZuc1XMXM6Cbg7ZC7dU/1OSe2zSQQgS55PW1j2tTGxKMsYdjGlCiIMF6weyk3gNypnYQIPY6xWr2EuMFW/phsj04jOUDIQxG59i/0pUU5rROIzLV71CxHtWdD6to6WqTU30DJg3m53lqfeKpNhGSESNooRI45RY/D7onc5TANGhMyThdIQzuKx421E2yxgXiQSNKB4lIqGVS2/aO03cgcl9a3IBaOwMk61c7Hq+g1tEYB9Cq++VfNRo9zeVnEf5OvzclbOyYC3WkmtGKJ9P5mVWsowVU6uHOaIixcWmBAg1NFBk7SOJiK1tCE+BY2iaWP28BsYxYIjqsXrGHEw4pWbuc1RCiGrrs3prI0j9hFyLgkKzIjGOGesZ9t+iC5PhaND9ftP0cUb3PPOvWZJYM4WFP/bJ89Qaj7VSSJtX7PI0o/azIAM/BAcUw9EbsdqQdP4jHPTcakTAyY13k4JNYhUDEswauWprnKbR0R1+TJbup8werXmt3mgHqipU9J6nmX5lEnF9pHRPMgyFg2ie6MZV+OnCAITtUDNxqrhsGmHGQNQz8MIIIXxaW5ecaPdLiEUfUnKJS7sf9QGougWSq/0watEwd7o/j/OST4SoZQewdYEsr3qfKTlU97SK3Crb17msaWQsjwbwtkiGZ5KJJtFO+nlhU/c1KRgENPX1fty3Um6FbvxAYylsbTurwyTGob5kJv5l68LtnXHRcmE5Idhde8BblY00tGfvBe6FbMikng9mKMeF9z7gzOXdK5LNcbNA/9sk5ywK6Hmm814pmNjO9VmPhre5T2bLTyefEbdP5XTmpMzNLJN21sovkZGp2uEE5JrN2CUcFX19xwWjWbsz1YgYEwB+kNbM/u9s5g264231Jx8ZBk6oG0JjsAR+UUg0/d76IyMdNLqoAHyqpZIp1/SEwOzT7FJ887O1Oj41QpM3T6IMDZwcmxN+FNI7KjayhhrM/SEharrm0rYhlSkAjgfOl5Odz/ZovW7Ar6+SvQ6mUtOjLZZ4KgzydXfqKEVfNKcxBFBon0Aym6FgXUxq9THjHMeL5oSUn8JV1sBI5khFPdMXyNyrjLg3P3czLPBX8sqMaoN8jA+99CNR9jaQVAW9q6/beblmwUk92cO/uRhoeybFgyNc9cGezqAsizTsIadVZvtqM7k0U5+KvKt/Yi9appXaJySotxLr7YpK9EAru8aitScBfUTmu4Y+ejOHzfSXpowWbLgUlws6Knzeu4JGU7zLD0hKiBWvzcALerrhJKfO8Awl3xRHi+Pl1x+SQKjBkO0jFzRcm0wIkEjFAil8k6ZiP5jv6J232Sc8/uucQUa7KJR5PgTpkw/Umz5nhH5qb6tuQZjIJKJFETGro/ftrESXZtd2gVd7Y7OGySCKmuYTs0nHjlZK/jQ2qV6fpuwbNkE6OEltdTf5LNWKjOg+P4OHeif1Hhc7L1z1G3J3xNdCfD0cVvTgYV7xpU52tib2NB+qRuCSBrsO93MG47S+/DX4CAgIDnnsoA5WJ8Ms4jY2PrVTXC43GinQ+Mo6VHIqu1fJTzwLuHI6bCMCVU3cwfRW+QOkqzSeONVRpZBtC/x+dxzbft6HGnlP4yWFKiwtsV7q2yPEFF70u8XDWuN5mP+ykyVHdfOEO15LgOU/JwHi9+i6pcIQk+YmSlHtUosBGy4dta8ORZ+XTQ4Xc8rwYnfpQiXEs0uxmcCEsgJvOzg9pYiMW/e5IolWqv39nMnEwOeP1IPKcFWDoQbiq61GK05bFsxV4rC/24G0gDeNwxytCCgpm1gJHlyzK+xfoK0xD0BxndThJnu4uvNI3Wb7ovOjnvRgBO3Mgm74u7g9Z8rEXBIHRGIlcSIaXmiE53ch7pppPFmLBR6IC8p5Ke/0eFuJ35+F3ZX3oE2dpYXE5U4SBlzs+XIgxf7sF4PoMMmIOG0f5BrKLF0vlE4hKv06TBviI0hhI1jLC6uvNfR6GqqFodRWp7kAkGwNe1D/YCMOMUoYdaq8g06SGNlAuaIhOtG4Tto3Ndq18htopXKJ+K/c4cy2TyXW2fPH+hn8OkN+68b539p/gbfOBZBX6DEMdmd2yXPaC/jXfwegTm+u7yciEnuXhyecA9Mm6L1jmbqlI6izoP4Im+3zKOBI2ede2Qa8jPZ/nHsVR4U9WlpOzVECwO4drw2f2PzFUfACr0w8ElcU60O/KgSBNrFhqjaUTkVDKkUqNWqOMI2A2V4/LuOpi6FteF/xV5/ARm6T91dFFm1XhUiyeMhoVWMrDxTlwFgQISqV1w0O4SiHrzmuMP1ueSOEYU4nJM80gOeWuBUvVaEFqw2ebrZG5xX3ZfMnI7MJpCIJkse2Y8BmLyXlq8o4bIOA57u1e+WmgG3GYDUO1pL+OqpHzGHscDJUlyCrToWbZIWvbNzCntSqTS/2e0ATwk1daB7MCTdF3dXkmfgw0DHlOUa7fogalgoJT+IoPuVqdhzjQgDcG+kyZv4+AP8JI3B4Pl/Xk7s6hYvVA3cASgy/Hnz05RwTYH3hI718RyH5TVnbvegURkXUpFzl580PmGJrQhhFrnvCEE6/VVhm3o0W9RBo4tT/h5yVZEFy5kjKE8WTPnxnmmpVdcp87TA32KncZUVP9YIuY0hVGmvbiG89pjtGsJAwi5X/ZzrzCiCsUmtWxWTIeHl1buU21Jx072CgYxouaTk6JGD5vCMhlHet2mtE281AbMHYqq3e2FJYUglUYtL1poTuU2CiXkxxR3KzNErctUhnz0KkHHDNU4tJY3TkCCnwljdHlUYiJuIy0udLlCuUKfJez4h+jmZB6rtO/jn8ykbrk2yx47fYyg1Mu8xQpmwKurN3PXw/2wj6ISiYYYjE1GVm1K+1mdDz1l2nFelpImfLnMFucF2fTVLFcTIAqzal9NrTQhstDwLv9xWARMCBBrYht0M2gP7+w5SnUSuEqWjlHjIgK9v9Y55w2qj1Uon5Y898zd6W5/LCRksLT1eNu0FFatm1qMizl4YiYq0T0IjWp/K8qHeDvuS69qVQxGQLzYoxio9Yyv1oQvW1M6haCumY1Shmv98lDsyNU0eILxJodpwJ8+T1IjeCJTVRbsHrlZTq1eoEsY7xKD454SquQsxlm4Nbwjdymph33/OKfo/LfpUIkFBI85C3zl4DqShNLnrn9bbrhxwclgF6SBjSdmoe74xZvVzeyr5Xtct0eexzjBU3IzCGIRAhrpXWrrM4/Lvly2dli2cVVuqi6qLFMVR00I3Hr5I9/fu3gavoUGyr4X+GH0H5qwRQHqOUDiy5VpnX9qp962yli5K/iRlKH5QAVy5QEBwhTtxokPbAfhevmouP58Ml8avNBHhpLmqcg3WjJWtq7KDlv2uENsJRFYcfxHcyA3grFP0mSr2+VTekWEpnPO188oW/u4yc5xXrNRNQbr9oQq52SWd7mdMhMZ3on13sEqVim5Sqpz+o5gFre37f1k9X16af2LfvrITffszf3+omDIkevZPwG9seEmKXfxFEq9FARSi426Kbesow9kC1L8TY7R5bM4TTXV+dxHXKWVX34cAWkpBifUOzjARrkDniU8jWCeJweqWeex/fIMnkjNF3fI0jMG6oBltg++wIncGYHIjY6q/Gubjg6DZ4BoiXrMAjWx7Elbo6mm1Juo/Pq2dGJ4RPXhQtHuAGt64sydyDdCw8mSAKFioufvO3dqtzE0YbEDkJ+UOF61dKmhZafh0mxRzGVvrlSdnRpLoV5M9nQPJzH4v6jgTLrrjhbRUJLe0sBX+oapcTeayueP4bvGe3SdwocwSDA1IjvpIymGZke+osLvhj//If9JKfqJlIEsIFq82ifF17f4xnNL69JjzqqN2hVXyyqTTBxoykdyxgfH2lnE6EwznBbTsYql6vbkHBn7KBYOHYgsePrvJ3dz/1eJwbpyRwlGYq/8DRJtF/q0e8wBqRNVLoG5VJ/Y1q9n0tjtpSNw7HjfJw8+MjGqwsx9ybvV7oQQWCY6N9CDi25M8vD5Fnr2iR6F53L2/0MW9YkY9B1lCqiMCwgbIo1e6QUnTeyiF9ELmIedBP7h+o1DTq65MarjAPdy2JbpJ63Ssj3Ox3r6/VeA2Mg6pfD7WpmUS43zytaw9pBugwSgxr+m7AudTIpgcuwaKPVJ7SD0Yilpi+CYKJ1uPJzfM7VQqqXnjJSeMNdPUPz5gBp/iOC4+9zZIZ6hLeCV7VFKAcsHkZO64XxNnK8TOU1Ie+XDkM+rmTsQpOpac3cIc/zXIf2F4lBFZNPxue02t+H32db+Uy1nQIoM2Sa5MMa3zWtcjfdUjFGGphCe8zLSKdeSYygTT2Lkvk1Dq4cqKxQYzJH9KUmBIK7nh68arkeehc0QG+YRQuDJ9Pd6yiy45iE42hVov16yNkY8sRd40x1STonXEWC+FOhGSjU9FESZnTKyWfSwh4JSouhueO0EvzpQdWEddS9G0TYroOkS33Lnw4ywPn4gm4cDRNrwRe4EbQa1p5J70RMJycXF4WapoCBkxDIWPqrBmOsDvrPStAWRDL8F8nIsTZ9OmHpJgOwVGO4OrX2CsekovtJTJ3zF9WJUxvEKeYQBhjeWpvYkcp1UBU5PDY4k7zkaGCOueOubl8nrm7Tddz1xrFjFz92ejoECI+Y2JWIlkvCkUDNCPOUBP87V4+ko7HZ/YNqYgSh5f0PJddI8xbk09bHQImNnGJ2d2FId5m7Zzz7urXHZVlwLIc/xQvlxP8R3D3Vfy5DgTeqRaqkrpoRU4vGetSOZXaiyu7dfb32UbkpbGTth0P4KvWyW6fzv8nhpFTCcMjKemLkRie0lj433blfl8N+DqciA4EHOnaM/tcDP4ERVVuYhc8yLBevp7BGKnSMiWLYsDZqO+PC3OVE6wgJ1WX0numN8DW9l/CyOHGa/qtRQU52Xuonqee/TR3hduw3ICLVdPtKQ6iYWGaQSpHv77jhtSLknPhaqSatjy62BmP8SrZPcl1iXyvcN5KEwZbwX8rXYxkIcFeH5U+BGiTsGx59hNcDtkrZDH4xJ8BNQGmt1vYGNknf7eNLKLVYpeia11+3QzPW2qJ6NCv4wQBtA1XWPkTpAUVn8h+wpPLerxv9ef7O+4PoyoIFOA7TBRCQO5baOSusvy9NiYU9P5j8Kg3V/+gRZsOjq1TsmF0uLMJ8Jj/DuAb7kAVlYyFWN+ur5bpNQTnYWWK/Wi1cRtTCSFQ6oo8ICbqCbfaH6UNE7ZQXc1kQBSU4rrcTLtEsCHqFQOCD0NKl/Fuq89qtH0V12o3fIODXQjiGekrOUuzdUDkkFUFL1P+3yW57KsCaLiQPAnIvuD6/BVn4zUrDWRH2IlC7awRRRACc5cmk/ybztdfo8ieiMwXYHGd/YJZAdBxuiI6xeMlcO8aabDoapXQHstlsuecQrWZ7sr/ObQ0Bw8ndy9rkGuVR1YyqGRt0i4CdYglLw3pjXDX6KQzJP+pqBpzhM+OLu0Z8C/GLiC6dIbu06gBXHpYnxUYnqLwibGnkVBu/jnUaMrCmwG5FiC3ktPrNMtR9VfYzdWMHbKh08PR4XaHBDoPwCtyK1CW1BDwaVcNZXNj9cEaLhWmVzYQfgn9MSRXdMTv5aA+pD0Paxpi3BFn+00AJNghJar9ABpwru0/GxoIZ4LUmhYbseCV9Gp/QH+5ysnMLsExAVb38iAtOccqNmwOr91BnQDOsItVjJhrbFKJ7+FnzChu4iJ8KMzK4NYbDbLiPi0o+sgiw9L73X3DBISw0cjitnEcBt9Dv6YpUf6DoA8mjx1SNLL3zwjAn+IMXPXQjE9+qQK6JrPBiNMj6vWaGcjCFG2LWOWtQkd4vvHh5HieUjTkqgaeKRyx8TG3mwzR2svg+L+JUiAWERrMae8bwvkdc7wDWAKuY4PQFCZVhR93F9KcC76FEYifr7Qzan+2M/OT5tEi/1OdO6qLJThL6hvaktxcINMz960tWcdgq4fQ+xfBgq8rCF1AcFYH6BlZ0Z9i+Bt+tNBKEYhgoVPWVnj1KibBdwffI2v0nDdfhX7un9IqrPnnx1436gyd7Pq6ANUXz1/CrlWk6gNxpxrFY32OOnUJNT02NIdEVjGncmlYoc16lOhs6JvEoOteASXiSfBH/QlLdLHMAxygMpzzJwO+9/KXGIzwLgFI8SvXAeqyFNdgeqZhgfab/w1l5pDDLcQ9vAePFNxoXD3MSfVS/HYDPkbEWUMNk1N6V9ugsy2ks064qq/3hP1K5gbFrGnk3nQOtxBw71klMhIrcWuwGml2TITubi40ETDV40bD6lUjXN2KSI7cfMKHMXKXYKVOgIeMRaTGLx9Ds8qt4uXnqSpc/QKm8qF5V1uL1M4PAZ6oUn6MWJMJYPHOiGbykInzmcgKRE+Ijt9bwpzfBxz2GFW1zEn33sEOpPWTB4wZvodOJpa+fzLhGMZaFI53YGhpxjSj6H06vpLBlu7Sa+IZyScnaMQXqxlCkuLX87HnWgwtdL1xGwwDoADOMEAOeNhsEeO1Eh+mqELUSCmGLZANR2p4+0u38mK3i3pNeKW8e1GjmHC2jN855pIWCaHpj47RAZ5tIH3gskQ2vViBy7XjjLFdJSSuTAfTnuirvFrk5jVUp9EIxF6k5z4MgpXFXcCqcDnnoHtzgrDAKJSxj21ZiHUqDpVNeyxP04U0EEyTUubnHGxFz5lRwB/BsyZC13ty+81oGbPm6W8sDTTouk0TPorMeja6CiEK5IBh9ePJoo5KcknkjweB5u+NkzckP6pw3Yr8x/qsD3A3bqv1kNjJGFyRN/BpZcm+ENrVrdB+omab7Jfwf9zAPXVE6tRr+IHkrdBQubzyZowsU4wdaeNzCoNAc0oCOvlGT8CwS3hiOk6BMzELUI4lSHjq9THPH0zXDGvgItikuz9Xt2GqqUkhzSQCRNj+FDIemYNbvCrIIInJaehBKRYw+tT8Z+0z8I68B4wW2sooERU3XZUgtRAkJTKkGocJS+n8CXTUE6x8XWfTfKKTu4ApLtm3czp3YvUYDg8V01XxbQ4q76ntTbGehHB3rvDw61qusUUvOWHnfwZIwiKZBJqoNcuwRcoKLnkNlFqxBbBmtfmmZUr7oeo/3dnd6MwXHQk0bGa7AcPBkGYgnHP2UZZGzAXyxMn1/Ey33n12LiWmX4ItV1M2SV4BTDFJbx+5xnf7EotZhYo4SXS4RG7M0zalo8tC1L15Dzqax+q8khAd0BMevvaQb1A+SYq7etDgDzmx2zGNTrF35dW/d5QlLfgWy0Bfp2ziuZy9RxvtAjhLJAJPFNYt6ePYFeolJbQmiujBfcQP7KHsYXqEuPQSM/Sb4PBAEHxgLeiq5HNtOtE4+8tWZHRyhQmlAkoa+BLJmoEHVQIG8Lavd/v5Q/AebVKkdZ9ZzFommmz11SZcuUsaOjLCTHpMjx7+Qk5Lf+dyEd7kM8jkrRtJ6dt0o/vkChB6oDrVSyCVvOoh6Ix4KTJamC8+pniKRw6ZoJkYcafQfvwei09PrwaiAHdKyD4s7FcTSv8v1aeB4LsuIEz8FzAhFKD/Eo6A96RLZ0Dx0nay0NKjniIUmPJFhXETMrhkOhUCdal1i3Fs6t8Ps/eqXM7vuWMsbZ03k67/mW8YGG3NfwzLK0pyQTwIGbWUpSaXAhvP7DkRnxNIT5SIHR4+o9Ul6LOWkbP2WVRFp6v/JofkmSHb7avf2IIcs12/B9xbm+wqNPYnlJ+YDIObUmz769nikX1Z+I8RIWbath2xULh7hzybbg74IL4/lgMVlPUGBqmT2a1KbiV37vMA7TzIsXgcCURZI8ek8GmzBa82D5SVdYxB9t3fOB9nWv0j4la8b8NEt1tXB3vuGhPiX3XalSpipHzaK9eKDPQqsJ9Cqh2hmKY7BjkU5RpoxpzPdsBmNZon7mVOZBa7k+W4piHPR52LRJ0M+97h0i3klgfucedo9sbqAZo0xBhzlVeGT+zyBFHKNNOerEW9DaG3ngKtSou2F+2YkLM5ihgkrQ2OspYkKY5GgoPUdkptY10ea26rVTtgZYaBEaTCd6gx3PrQF97wLnmXTBXlF/jSUipZKv5OBY7M/6lQrrUDJMhyBkes+XzwxlbKl2+VKid6KeJ8Fo2RQeQYTnDdsBVEV5FgJF9kekZKY6v6tn88Q3bzKc8zv1Ip9zsJvL7aOuub4DvuMnIzM3cc4YaWC+79OuGSu/M74XMz03YZ97bOplafWCUzqpDYyqWK5z/3anMpxe5g45iBmhXXY/RBJWq1hzp/gFt61IogyHKyHVZRjzFaf81COpfZwnkovKEDOu39QHhW9Z/yQyHyScRQaJdlvYqAl5tTutXHfY+T0ryBYFAuOk0chlXDTpEgFcl9BPWZPPexcqtyJIorlxaOF9kQPjrCSO1856yRycCDO8RLivkGUB4YaPBgd8GVr/DhQvqr6mL0X83J86ev7CPy3KhgGbcBUwT73jWwZMjjQ42fiqc7AqN7CDL4s1N3PxsD3rRIPmWoPWj81mBRGbkezDk5/ZS96ljonoL7Q7XQy8v9wUlIi2hhM5ncTII7SLA4fgB+2SfX9lvB6qwocBq0lv96HLRaXDH7R1c6/9mQuO8+AHaOkZOPptml/3dc298SHsaIPEwWXE5NSm6+oSj7pc1uyTWEXldijaVlI06w+4qegnbrlOb8Vr2nBvIuEu4v60lFwmGvc45XyrpsnWlF/RkqgZ+Nk0fFdN6DzwBMn3XuKoxz4NXRajl1lxR4znVGw1MVvLFkMWSAH/aVXSyvfxTL6b2SGJosbkPtlw8NUjsurU4Akiq+Xcqhrh9v4I4xzhzDmJZEq7SaYBy6iHxSAbfWgadFkWKvHXnYhls2aqLFLVDM5drMfl3Ow1nMb1F7ejNgScjqtSSeQ1JY7p2h2TwaqA6a/0EHrB/PldgVYgfHy1i6WX1ERWO4FjE9QKqJUxo2tqWzFhOML6xv9ZE9QEiE4uDVQWkZ/JqUgEk/kF0WxKLLURAV8W1zBWI7vVV/u8swBtQO+dCSz8No+PUsDFIaLYkHHPwp8NVqwnCA1OqlZa4ycVpnAu1sTWiL5lM6vb3udBejht7Hi0gB6Phjt2rohnaGXqdiBwf+gB1nOyMkE+Rmfac68OiFzgrxnCgORQZBFEHtSzwEUYne02rgl0x+wVwZeG/Da4X/RebAK0BSmc8mYYLH7iTc01Z8vf4/DW91K8sq3NCe4oRHunPvIqL0Ha96Yk5Y+KuaOXLzNF/3IqqlMaqHoL9hucdzCbCd/eRrEd8rpfzKCwrixw+Jwqgw2J5Dh+S/5PsSDGzIuZFAmDRmm4KfcUuqA9iQQt3gqgjpLWw8dqKLNN6hGn8rcz7cGNwkwe7RgXRkJAhYXr8eYdJrlIZKXLEY5W0c3sA6zJqXCkmnFq02VMrEY3eXdpWG/2UBwmUEX6XyJ5mZuN3IfgJ5xFQ7agypfbDC4xkRZj+TNKswgoKIDl7Yu4Q6Ug9heAKSbrVK358AyJNyhd9F7c7a0J/TsFshmwhj/azI+WqW3QfxnFwpPZ85rUO3Riypd69xD7GlxkQUsudKgs+BA1VkqbV8YnMnBgRDmOl7ycxSWRMgoOo0bewDmi3VLi/1dmxNLTFpuq1vdsoG+9hxRQ7oAY8l9djKX7elF6GtdYIGrkkoPiZFJOLYQooDhI7vMONYrOkH9fjwEWcTJih8B2jQY9aqHFn/5lyiZOzKMhVZXQmgU6TUvo5VkVZscs19Kra0GRajUdVX18+Nf9iUVj5zqRaD68JenDJwLoYw0umEpQu7u5jiWlvzqYgAzYlwzXWevN5B1dBDP6dcCFydePco67qbhjMOMt7kIgefR11TNdqMhRrOwWbFHHfDUSW6a6++YjgLZ9FXeA36SXSOhhh672ph4UaMC6WfZIptGNLsGQzgGCUzy7rYIu5Objr3+qHPLqqLk1oHGdRYmWLv1vFciMv9Nw4V7Hdrpj+Q+T/hJowUKMqG+e7srR9tQ1vuA8ORoFgpkWB87Bt4yqVhy5OFCh25yFDUqeUgcMWhMAavUqanEaMuo7V3pRv9/JO60LKu73NKRYDgq9BmbNHutFjEKb45AvevgQSk3GQzHuEVImkdKwRM20XnsWJAX+w3mjCzEY9xyu59sTsVsM316hUN4dNE5STZ1uwmgxUVk29NAPg79gQkYuRHku3xIXaAU6RT4NbqHc/kCpFN8XBOXk03vG7Kjegj3bsSodYe5LlvOzn6wjaHPXvcZ4SqinkpcztutkYGJyDJjJeVCaG+g8Qei+oC3MkzrnUSTvE0spkeAYgnr8RBKt2/h8ykgP81b8v66J7zQOG1HPqdTrchrS4KejHcaUE30EAkyy5eJC/0jz7EdsZlxrMIhC5DCHOy2dkttFjCHhBzs+j6hCDYa2sVV0T0XEPL7+RVF2C9QDjQKdIAWRvn4ar3XACnSRYaY3/E+wwnLsJZZ8dCVi0T8UYtJoM0C+JoVWtNicuSIXFNylhDEXcNhH/L8RA9cxMpQkislr0OvDYS+BiX1dW3mSr5G68S7nZkNLGV9DIV4xXgId0QrmLQ/2qyhmUqeBFNzOS+EVGINyQsSyXVe/Igw/Mz4WoNGqKB+Cqr904QdQ9M2TvCUPfhTPNatlw3VAFZpcqM1iRdL2Q1y/JTC12NRZdTOgqk/LoZQIcjWYOTsA9mtmntijCwewsSPRsUbnS5XuBiOQRxfZAgWcFgCEKZ+tcgg+Px5zd2QkkvqZuhnfcDuGIajtCwFUlpv5p2cRkJAtLPkSGOUZyx8mASb9btDt110QtY+E1rMg1LyZrkh5ags23EUeGSFRwXn+wiLqqq57hy75Kl1XPKHL5jkSK5KbAm2/IihJwtuneIVyNLCDMLC0+3kff/KJUMq5uxQcur3l/uybn8l/yW9apt8y8Z2Qq0MVPO1n45nANN0/DcP0TBnTtXcTBqBU0Lb09d5Zx3Gp82gfmnmXzpEZPEgMd2SpF6XYl5zvKJF5NjV/Wm0ccRBzYZ1kCv4UJ6iyowt09PmwFxJpn9A/6igbi2sp3XCgBj2vi5DyNubxH2MXoEdSbP7lJJlE6PTwqvVpkOwwsW7kUgUKXULx62HHQ77Dq9rf8Ys7ATJsUqfYaqQjoqiNAvXBJruzLzKDSmOpjuwh5CB6NYMEzrbRAVe9trK/Iwe92z2h3AxlHRQYVvE4IOg/mPChC345gL5lobfiZbVlkhZ3p7U2vIhZJ2oMDbqo0sOU6r28n3dtVwe9TdAkgUHIcn4AYz10uvYdhx4fYU/tRjf67775CgKvt7pVq9hitqqJbg84E3ubAzgv95Wdu2uGwxBQOti/7ZU5jj9Y4yevuVZ+JYdFQf3dtDvSRjndb7nIKx6U6+QZpfEST2QhNUxOjB+zF/HCKy/wuQK58/ttln5F6elHdFSzurSV/ejYLY5aczrY6G4qugOwS9iSTqZoC7XXUQ1mYd+OgtngZNkFAK15HXGZ2rBM50Gw/2JCxuKzq7M+AB4WZ3JeC/o3/RZSlS6NAOUzKPVhdBhI280KOWoEi5O7uFVoN/HBaVM6vSVA82L2OZjM97Sd/QVYHRaLFEdRvdSM9tEv1/+EkLFp9R4JSU/oWuIQwaAeG+FzS2wCwuOoIVJjaaQMZPknZaFT0haeUIh1KpuYvyb5ThOvajRXniKgQKg1YtGpN/AeQHj9Q775wEwcCGFkRALOSmkhg20mWBKe6ceBGDXtNiZjA96fwYY1Cy9XBF9th0whBWshcbaFZcLlviFf082LuMUnwHqdwIPkAKcdYWXtJs21fAaJ90cih/CrpizTvC1BVIZGJo3CZ68PJSIjH/QkYn/RIHc8d/sS1Soo5JT+dovjuuug1bIjJO8t7YbuEAjz0TYuWQYzTOWeaffIHv1sRrHcAHCVbD5n9ykGFLq2fqBCtHrItppfhe34Uk//ADVtcFSIMc2Xxjd3RuBO7SsLSbzYyqp8AMO79DVYZyD8vaCKNtF0qfXthr5jx4VuhKuTb4bXJ5Dw+pBj0fWizz9oRXYbzyn76TIZhKAJam8elXNjZv9QNa1wrvS5qfYAvcCzDlGLdZt88ketbRyVrliEbhSPo4fCRCf5LN4d6cOodc6kt5/rNDIYWD8xNEBxNCl3mOagqJaMScyk9r2M3uegGF2pSxmIdmpKXoCYtO567AsubNA/a/4vIsAbNHR/ElpL510RCmZz7DZWvaZvSaJkxgcEw2okHqey5OWjxwDm2wW15o44aiy2DiJTn2DNjduLzCyG4r4mqtIp0gQ6/ikbwLVuLPysO1Tb61zDr59gAJ/+dtjoh0XlP3mBCodp2piIY5iYD3XFKWt7OF/Kugaeat03a9mbX7N+Mf4qdEvFX7NX7RJLqjyHYmXp9rYwcWduEKC+v3zkKZgXajVAjeuDzqLI3E8wR2fHs0rgMrvI1Qdw3GoZ4e7IxIFqueFH1RMen1+DbZlg82GznZs0/msfuPboJITIeHgmgnRFN9+Vv1QEGQuDalJZoLWZQLW+em0o5wV7Fu7H7kIZvKfULdyuoP8wFKDz16BvNZA/dohklW4pQFQGFXRNBWYFmoCrTcJKydRF0aUOIdUzPnQ/GjyDlFwpco979LGXue750D5lah9z957+N+qWef83PdaHfui1YMx69sz7bxlWCVg7V55IZ/mGkWHdZhl5OL2fATtK0jZjfrASJMIJoVAu9UybPekf5x8ewk1owk5WTbanDvWN8CQgVqEF6WnVvuDLi8Dk20vHByqFCEYxsidz6ROD+0OuQUh2Gn3Mmj+xhne72tjESQo6+spaaN+ru4PZJzWOVlnp5tXJs8vjsUGDO1Z/YTg9/q1Kh9ZJJaPC6DGDlOklJ7F7FYHC9jTLZLHka1KQNk9NjqfPZnVNPnzp9rbC9M1E4AsMoBbWDXl4m/Z7OynadYoGY3blei4ZVZnzEfUq8D1f9MJYETmWp1XZubfcLUt/f4UHzt3+0QNiQRNy5Vl5lEhAzYUbAHi30VW8DvKx7vU5z2fE0JIOTv6eerGzMo+vzZqZR9W0nco+D2bvElh1URnkwr5LlZwOBj1D7Fw/FTp4QrGA+tqLbg0cBUxyOI/mad4fJjODx6/1WxUGRYAKXpCAHYCe0ohAVDB+BmuBThHAzxWjgrFKZBoYwbOnuI3cPk1vuDtXBUYWpc2am2l2TEoq9okIWzC23SYg08bCydnbgCVqc+u5OMMMN6VTbbbAQ6pHrZI0LBySi6akVeBQA44ViIzE8Qp7969ICGXTuK8JcO7avDiB2bmDaIkkoEbTnOo8F0qCyvVxmCwPliGfuXyjb5+3EWcLIX6bGThv4JgILHxNVa3Aj3L5KcAXqjnluUH0afZkmrOlyr7sVNKH5lERCcVaVHDQAqrATnR0fGWQL4lJOlqbLsISchh+yb4AerUoOO3bv1Gmwxr1sMjLWsUkM5wKNIYDN2QWAp4eONReHj38n/UodAyWHcGBgBk9ZGIvGtViQ7KGgFueaUYnLObl0VTlKy5C99TY6S4TR7ScBvJqbhQumDAt0DdYEBJcTiRzFMyKCXDxx0LH2FqiDMnJOUOsfx6jXobQhRdVO/4yilu1lvsWnpE/vzMYtfq/tEQeGTlol4oZnVrPCeQ9WbQuh8vSx0z/QIvKIjEn0IMbhVp9et1VwhtjcfgCq8k6G3fcbU38fjZEKOa6TTjo6usistBRKIDy1888RmewuL52VeD1IacEb3nrfHihb2IbZHLscjfxf9xQX5/9YcyeDP7CGPMiBzeb7apWxXRrlmcMB7fqe1cyTM4ZJbXyyfESdrnsR35qs4hkhdbTfOJ3k5nowp1wTQ2eLhl1V5GF+PTTsx+FIQj66RxQUwMrtW7/cUMpL1VnsP2yIxbZDuz02sUMB4AbPddtx6yK/zXGVOxNbT6lKpEhqZq+wchoiMYl0Fd1EIFaVm3NgWQDPEXyrP4ed5w4j3/69KFb1/A8ubxGr/0W7Dg4c23y2J3Ir+9Ufz+aENRR+w4i0Nss3/kdkG9AAfBq1mFrpAR9l/ZPBi7UhqbPdPBM815Zf/h3YQiktO5Q/2El5CubJJ+26aK9mnXE0BrvSGpKpUmi5hD7DyatpnzagOnsJ+mpR1Cx/oRfzr52omAY7NLOU9diUM3vOaToYPUjuR2qoA3wW8fDRV5gu7m5KkwjaPBw9Boz68NZpgmwO92BNFpdtzo6bFIJTtqkvJG3nPGWcD2ILCgBx9ebi2zbFqHIGtV+TjPL2t6i/3AIbxcd7oh5imo609yPQ173+h9w2wCzhbYwGvjT2pA0RW4kAy5NeGy1Y6Yg4x+27guOh5s33jh0ppppmaZ0Exoa+25c9KrYsohi63HwfTXZ4uZ0mAk4j8xICTIyW2GOP1skW9VIM0vFh+zfIUwBkN5WNB8wvZ3s2NdqioeYlYMsNdyv2ht8eVTdxIeasa38z9i8XGemoN9hItuY54YNAAnuGpwOur/0GypeRoUp9JTsI5zDi4/hvXzydiJQb4q2TfYnYYB4aakdUjgQ0B8mTSzyXyPJ9PIz0CR8Pcf1wWvfxC13cMANlSITSK7O1N0sGmCjQblydiUUjffn79Qd0gAwIgGPRAKhRTDns9t8eUAkhOYzKAxZJF1I1zMqEEBrdHJdHeRnnAeB84akdlM57+CESvCs0tiYJ/ARvfFuBpsu2dBrM0Zmxoi/QSPcm8qW/XOtlTV2R1qWs0VFQ9NZ8Gm3/Xseb+f2fAye6Mx1UO21LGQXXK1f1dZEQ9Bru+p3+oKOS3/zaaf16So2wHMs7NyR4QHIaUEuXW7a23G8ctYv2Q/Jkok1tSY+cUl8+OoYfH6X3f6aPocIpl7Tq91agwZ9ODNFEvYNlY2FSksMo2oZ16sOIt9h3ZEJ+Cz8urfZ/eAIdCdKRyz3PqYy4wu+ytwAMjZOpFwLJIpGqDq4oA5aaElZearUaEZkVvFkus+Yqbpx/IIj0HzTQ3Z0ifeqtBx17gJRlKlm6JYO9bRw5GOLnHJF5VD2lZOdTF8ze3wv/MpEwioPks3mqJ5ftnh+vjKUYyNIR2hgGtPGWRdiLLG1SmBIR6EnFq0eASQOyHWnjxb1hEj0KNGQ7+ycg+v8VLYuJBSdlsRl7npqmGpGxJdPV1sgjXoJH8E2jE46QjMSp/ixfID7smdhOF5PQCgL7IvtDfctEKjjV8S9OWE6Uug1a6iyNNvolCEakN/ZAXuMYDtx9CIbC6Bmnl3QWuT7zeBZl5JkWFKSa485wO6zZL7hAD6+siOa0/Z3j2WbggDN1lOyQB9/eUlFaopJoasnupTtMP8gJQcNdCVUyb1RqmJRDMl3IGdM1vMljn6yNf82xqhsttEAHFHNW6MDr/Ba9el1Nd16YuPSqCqxc1grPjxILKu5q2C8MbQw1vpWux0E2Rb58K8eXTlTR12iRO6B5qAKL9oQTlAq4RK2UqiFkFSUtk8ePj/eZXs1yfLRmJs1ItjFQnp/CcsC4UcB94h91PHxWWLEBlqY5y2gCuc1C+WCCC6d74EqDS77L9ivtCsHQcRD5R5mYIMhWY7jKwTKqEM8yQrlxj4TXR85B7VyDJQNoCvAMCpZMocS6N85yst58GmKctdnj9HeI4G8VoNmheq3su5i9nDWzU5gVHfv9Rr1HAeUQOlLh1c9c9HusjCiKTq/ZRCdwet+EGXYuyRLbglalfPD5iZSsWBlO5XRo5vZljVtsNtk/kMizmaDp0kvQxL27pEpscMF4DDhDY7rkYI4U2M/2fEN9BvfqcVYfW9idzp6w728FAVauKLs4Teu5gK4LKn15JNu99Q7jLXOkOxJu/nsFDz/MwciaBaoqG+ytnuOmLCDYp4WXE75gaGA90g0AB4m4hz8BCxe769cnTxm93VY1YfZIQMxbbdIByzvk/fIQ5A8nzythJdkfH5sL3MFFuTQIs29NnGkyQGz/HT8x5ttXPgD2flUWGb2iuqh/3j0rv5kNJqERUep+2fTMeRq6F1aVJh2gg9wlSbhaQCWTeoBhUDXPyUmNefM5PBMl1p0PQV/rDpJqy8g5a2h2ooLAiob7Ux8JJSngM9blOnYn5q4cCONe36kkTNIYHccigUvzeU57Mw+0zk3duBaMG0Lg313e0xN0TUh7cZjc9Nxdzh0FonYAyQH/kf+5cFcR4HgFwFuk5XBnf5UJDr6umRMQv5VoRuC4ryIV2k/qvDGnEkscU/1nuA9igidBVH6VfHs1rf7HyM1OsSXK6HzcKBSO+sVHu8GU/HBgi+KNjx/B6RLmufYLLoppwwNdOnSdhy2jN48Hr1KwxekcwgL1S0zG4HKnm0aZtpD+5WB/PO2/Vu/6OtK70rY2H+TLIWWPky1x1WF9SyOYsybxkaAxSbdVKpFkCu0akHRYXGZGA2GI3rjjxpGBsKVTL8fkueedZ0GY5rhZwUuaae70xCCqf7Y7alEHXDy+4BzuGhSltzxaidPWRwwV2M3xq1kJZTfXVDlrgfD5xDae++fcb/AtaWGuDaOZHGrgC/wcKePrKIFOxOkJhrUsuhEV4JM+O6Dy3sWEpWaEgby/H+ilC7mngmjLiwbagR4ckHc9mXSzkmkj2Urmc1LnSMsNCNzoZa7GTD2D/9JbM1WfCEWq6kt6Shhprhifz/LxYpq5UdAkr8rtMfyQYQkqQv19AfbLuIbcxgkIpxu8hm6d/tOdCHZfozQEMxwI2s9+KeHKok4BhhwLkEpuNnPd06gb1G9F5nUJ91+nbtds5UlCDB1tEe4Le5VjjMwHKNpht5PyDCUj6pza69g4Jr0AiDpjqdGsilSb8ME2YvlgMdL0WPOdg2liUe46ad3GpXTB1LUfBv1SIe2IN9SKCR716U33uOsO414llUTeb+LJAKaIEE5G1sdO7KIxtHPFTgEA/PoRp3J4YPtPIhPiJj8mRTpukg3obRCX3nqrFZ7m0ApXRNfaf64eXPooJnVBzikaUe2Km3QVaUfwCLs5XX9vROreT+ChANoeCSg3HZhSxMAYNekhYyPheYm7srv59qGD65WhWnrezPoEoQD8Zp3gU4PLDpbv0uGzNZd9xdPxUV/lG5CNXasv0LYaHEe4/j25sF1KohAQGy9eN0NE5/1qfYnYxtBUTOrc+0sPriwW6b6v5tZR+tvWzaM2OCKo2AyNvxnCgxc1YAoNQQD6kMAnHm7VojowSxL5oHsUv5ADUn4m8MYKylg00FTVtyFlUyTQuvdWZOU4xbW+mXwUE5PO4WbWvHqZDSYk25Nn4x8jc/f9/JlNvr2dS7bVZS8YoAvXr5VNfRMqCIE8dTHstZV0qAF+tFTQFxV1FB8nY4M+pnnDx1Fj4fPHiw3w/GufjtCCLwLvjgZhuUJxjlOKNGZQTiweQj40n3BGIGStzzLXTuJPAjIu2P2dAnQkEF+/U5906BWjyeGLrXToVK5UJ9DQM0RpjuUcdGRgayL9tb7skxhXRczJWaAr55MdA8rT0IHyGIKZhIMx857wHw7hmqw/vy35U5KzOHdY4Ij3uQmJxPpZrb/StHhRD2a+toFYRriHLI31unjp7tyN0LK7C+hwUX4+0S0vrGk3M4UAORj5KSNt9kQRsOXHeQBGU7z6x7QgTMADac0cKGVznGjECFVHEF73IQcPfKGzjbjO5SQnRZLFmJZScATiR6XFpYXtRou0W0ITEZEqsN/rNnl3T+qjbGR60kmvXGhgc0ALEmaM8F1xvUrPwlcVNqgGcYfWnKgQHnN0puIse/+BxUzeeBXfqbkPjLc+Xzui6630D22VLhOD3mXcCIu30rgATnKJZ4mvz0voOQmZ1FMbT8+/0Z0ZuzQ50SrMQn9fw5OYHj/DAM3DR/wl38FMqy1caFsXpvmxq5lRvQSFRZz7SSi0mSIFBooxTEZWkVgi4vTHBpicpuYatSKXa6SrBBm0Zqy/L+8GMFBHee2ZtcbdiuZlDatPMn03BwS8rCXWoujznm5FVAJn9nC3fjuMcacLd175Yoh5d3w4IqdSIaBullGrN6nb4AAtFtqCkrrddvoR2R6iOvhGfdYlql82O9nUrv1bbI310sBeOSWw3tNoItcCK3h2Y67PTFgw4NfdSJjKLx9OmsqsCFN6qtA3qcR4pQrj9XyoxO59bUM8jfVveLPRKH02ktk+3XGgJr2N2QF3CyWpmq+o7MgIQhW1O0qpe4lT+fv+t7MG7OHwM/pzfzhS+IODo3u6lzjEwHznyEfAVZSsi1uRizUtMKPS1983p7pR5NSZusoDthnaHV749FE01ctIP8+7fI6sBNPX+agFaKG5h5Te2APeliB85D265EBVWwnZpSgVfIqlPLRbRvm0WqnYuCTt4ApW1QZA0tH+76p/cwOM9v2GevWJo0lN12KApV7AWLjjRXGJhRGenjRi+rmr5mUBfj6j+EGYR2mSILyD7nk/xlawpxQY312xnAXBJF52CI6Dt2Uj47w2AedSHwhU1F7IlsiIolzIf8TsgGMn8YutuOu/tnhTiLcbgOi6lrEcrpHQnymqhGV9NFqSv9vUHD8GJkQcfmZt1mXVrUMyEg3e/JrUSS4r5saBNEOYq6vl1n9clFUgU78f2bJtDhFsyFHHoIvc3WDZSMPpKG9+RQ8p6R30wf42V2Same8JnZs8JnxQuBjufwYrDTONRvX7VyuB87dtXwVl5GRN1h8/KmJv1X6P6k8nrpu0en+dK3FlQ3vDrOrQCHS9oCI6C702c01LWENEMW15HEsyCyyQzFPfE7H2Kvqu1ug8YOccX5F0czn/ztgN6wdoeoNAUg5ObOn1I6+ybs9WIcsVT/lT8C3/2o12dRgk/nXPyp98rkt4UXUVmTjUiPohBv52Fs3TBV3EVmre+lgS/tDFzKXqLfiXd70Wi0dSYbl2g2LntP2t1Axq+NnV9u9YIXMPClRQx5fCRj0QrakwVhK2z+h+zKi4giFfXM4L84qTiri75f9FsoEw+FO0VEAsS3geg1W3UpMEpqalZkRmnxPHRel18rCcTbAzPudQLNN+ZxwEKHhojEDx5cH3r+k9X3sbpSvD9D/ZehUTXpSCLB761UXXCRSXqkbAdxe8RNPfoZ4l0XgBVz77+pr5MFyg/wkm2VqJNaiPDcuAXUzp15QBT5ZMcG+8yructbIS6+lEoCZHIEF74hlLXkkzf9S+yTL11VWfQUsYk+LGA/RXLbW6AGMvbbbba1SInM/2Y7wXozrts3QQ0B7YrjbEYGs5c4vpXcCDlh+m0Y6KuUTHEooZwUMkTsxCEn5uJ2EPZidszwXm2UA79W6IL4qn/OI43XjFFa/4jG2bagi98+cKHkKm1G+F2Lrq69WMkOgHQCFOcCOBahcxtFsxrNpC3LO6jdCkYkNwmNf8J91SA6oJmOjoQO8oT/tM5yaZdL+xB0SuzQRj+fIKg7h9eBFPfmkcbJskARtqkan4ugu+dhkITMt3w2rBpUZ5puzs3h+ZJDEXjzpgT4WbzY301tpf627dpcui/yC3FeFUG3czxZOpk11XGcY1OqfbRxw4ty9V3KzliSb57ZDPcdGq4bdKPLhEbpcBJijRn+QefUyydyDvuX1yLomtqcQkYY06rKK6+/A34W0ZGf96dayWdII28cbvBK1bUf7QcR80ITRlRJ8s87lOQLq3R7PJkNlrFAX08Px0kSlbFMw9ltHAaXn9IsHGVxUg59aS7bIj821bkXjt+3+Odp+rZvxUUy8tMH5ArJrYIms3AP9fZ4qpiiOs169GFkqrVdH3euXZHZGreht72d03egRiSmYpNbPr6W2FGCEJfLW1Ov4nF8SP634fP79TmvGZWkBXb0JUqraiGkUTDfgKh4W1YMqqj6rjsuCdUdqceAE0Q1WniKoC1GylNyl3eppV+kw5Nw1iILYUAWFUlzGkPlOacO0/fYZsQCIVhCBCmYAftyGbsdCYVYyaw/OTs1G2X+8PorPGOTw8kHjxUTRyO54AeAeAC8ClRucDZwhuyyVdjBvMocj5ZjwR7e27XSjZ7IVRwv13EkWMN/nz7R6L4CAgICAgICA8f2/SB/t+is/Z9ub+z697/b9MH+z3B+b7fpN/0Po3r7ftGr7Prq9+36aD9vu+cP7PoZ/2+/5+37CX9v1OffV9Ef+32Yw6b4Lqh+ppl5qEsFg1gLpGsSElV2CS1ViGZcPEeUKCv9ZhOSDOJP6TibDyIorgL5n0qMXoCVCUoSp+iFNxJaIJaiVKdMoQdQXB1nQTOiLpvLNimN5hMWxJIUX7dxg8OnHogg9MsaT6LU5mxZYlFdIUdrTfdsB8cMV1+ZVXh4MCzkltwqyUhTf2cf7wtDOAMJsb1Pqd2CDIhq70rfjjoiBpOub005aDg4ndevCjPl+o+bOSt/claLx5EeBamR0MyosAL7TcO0QFEcdZGSwEsT7IffNsRvLbw28AlWkFHFwUtVz5PJKCCkJC8m/bLKw7a4k3jegbPUTTkQsk1tUFBt6XTkH4IMj7iJPFbHtixsoVy4/S3dLVC3HqW3B9NuWYburEYWiR9AiQfbxeDdFwGLG5nPBmErzox6IsqL6n3PLMd8qgjE3RqsfUNZOQglasU6fmkkvSjf8E3M/TZTEU45pCD+NzLBeczOXoktLmAwv/DjkIC1ENXpDpsanHZCPXmMoLSaxCWD+i4ZcqhHfkmivtQq/vK9ktUtR1H9rwnm3XO7+xkJG6JhoP3o5GKNizi+UqfMrD7NAyt075NQgNSYusdXr9hd5fCJ6AUxAlumMms94xnK2qcQj1LY2QCfxzKFxkwQl7f8YZHC6uER4oVNL4xiFHQg58jRvUgW5cNzdyQlEVzEOQLdmVxohcafrB1DhSDdpZV1oT3xTN9AaihDPAqSpZjYRFBmyvH9n3LpdgDAX5g4lrAlc9NyI5wBbBZXK0c8+BZK3kpiWi0geA6h8p6/QEWiK8AXWG1RRTtwWWflRs7q8TBXip+4Qsmn/SOzKx2R8IgDFTauihAoVjOFS/1GNcihJwU/VY54wtjL5hKI01nZwGaxFzguYulkhoQIkaYHkKMe2CGwVDAeLVp5XNZZK4Qsq+kHtIpthDhawzQrn1bury28fBTrhMYfMYhAKPPiBah2Xssom73iPSW4YA4Jh0X6F7KZKDvybJstrs4ixxbdA/VFTJG9QW1Q+bUtBFrQwjsfiJ2qMeOsiV9z4Y9X+vrA5Ht3g7BP9AqS1rQFdRX33QTIou2zK0mGpWXnsUIth6dKpBdcTAFhKSlAa+i7glOqEBqL5wprpg+82poTJOGApaIk41jmRwT/WtDbc5L3llMW22NcI6SXuaZmmceXYi1duiuU1EBOeRVA4v1vZA3Al7W1PxAIpIma/6P1nuiJwRIdnrwlanR2F6sWXea2gN+H2Mi7H/OP6tcdAJ+Ey66urMzxJAje55ME44QDCy5/iLYPva2gzxtYFG7NkvHSrtwnX0ihFriHIGaoPgsnX85c8INBwFSK9rYD1ZfNxGbGhHsi/h6Trrk/IMKOp4iB3fJBdAQKypm07+Umi0uSl2iB8bvSosqpMj021Ty7Cd5RgMmX9cFpPjcuGA6pApj9WRA4lIqwGP1F6EtBxvqG8QXC16MMHRNHdNx7JGnAjkpD6IdOMfXwDk/pnowJnCDPlla1ADDKaLyDqJMI6aD9kdBgD7ba5cAmZExKl1Q5K8brxPioq+eriHtXkuX+aCrqf1HQOv07jq8EwDKnPNA8U8hOhsw+xhc4z9TLTrKrSFS0NsTbtd4FW64Zqkjk2kkhFxkI07XBWcDQk4EKKbas8MVqX+Ley0OIIjhrhi9gmIPpRxNTBFdOE9ldBJm/MxgqmaqQEk5Hna0XnDL982PkldJqp1eWCiKrp/UKiWQ3P/1HLfQNoFlsfGzgPTwBJHJ11ZqmcnFOEE8FiPr/pToypkySi7ZwZpcVmjH5+K8qrV2dwPAJXJa7pilxDAS/cmOKa/3JdYrltn7MVv1TiDj2ehBItFo+Yi4A1/ZRLd8I+0rjCe6IV62MkFV+1sJub5eD7GegM2EEVQO1GS4BIoLx+cbWqKlZFUpQ3NWwQ4XNS/1w4+tPuLzUmWKMQhKnk7n8qUspW7TFMdlKmavG4iX6jp75wlhja5siXHDUj6zUdvSfR3bFpUhg4HT0YwGkYA1gmgDuFagoZ+Xk1GBd5RhaeDkHKb8wKSCWGtmBQKZXgcqtfMeCbNguAdjSqJYloZjUgLUUBTPYehmEdh7AWsPw9Qmkq77AmCnqwFWpSfbLXsw74DW4hdkJLxXLUECEoyxGd7AGE3eha0XJgAKx1W8BAKsSbUZwXO1M4xfsXVuMS49oIchZnt5GpheFxPlIqvHdATBrUjnnGtIAAJXnwc7xThLtgCLGgONxwt/tPZX3VjfLjWXIcCRi5Ir5qvmF7r9Geoj0vKlVYAQqqfPwDMlUSHsNDp7DEm5jl5sJjjDAMbXXXjrPrG7+bAqDqrGw7tBb1VFxwBp56aL0hZz/lntwwOzv5Y6FoBsjuVm4Qw19F7HG1uB7WN3O0oWKl0gR4ROLwRiY8NRYtJqnGI7ciKfkarEMMFFzj9zbGlnJKi+l+rYnddjRl5YIlXcvVNLJuIZL96JaowMvl3jzUkRPQKn4OtM1bmJg+0vM6xAlI4VJfy3F0EHVoht8YrUsz5A3Kd1K9vW7aj5mgWJPtbm8Kgr7461Nr8dmpMCFfbRCmSB99KgpDAD4J7KwabrtLBNa3fx41nOAmjYG0o5J+d0do0BibZZGS+wKv0eeBPPvLDb3Wfb+9KR+MFvSIwCj7dQOyYIBy/RlXjvuRaVCzpmWqSYhTW7mCNfIdBme4WuJZQmHIcBLEh7TGMwXoa11tZwVNbzmNiispZpiSkx/YklbhBMh5s0SvbAKKJ0zwSfrDVjgJ8BK6XfnzfSMtWG4eu4q9p0JU3IJxaDka960/X1bFNdsk9UgZCR10b+w5pxq/1dowzHK8YFmNjflh9KpotEqVtvGdtN7UJ+MGzAxqRLci1cCuTP6N7t++4vkkcKHPfENDcv33BDYP5bPsDM8tLQe3LQvDzr6e/cv/fD9cZdGW9EHzJfLxvGKcmFc5Stvt0/iDQctBiD0CsfIW4uvHEKtZ7IWZAF2Kh9KXEET+tvVFfWv2ppCTOwgeBrIChJ/X2JmpoDn4VuY2G+76Hwnu8El/PJ0w+8ioisKhH4UcLS2ZzilwXynl92k/DYkMInQp3NKragfHydbmprmfMN6SZNjeK41Nzy2rcHz7Yx0IRNs5Q9/Gs5rn6ngWATcup/2I1qC0H+dRZRJG8qAZ+VYtelGFXf1wwvTUYKUtoyTOt4PVZL7wtMOdCXOf67d94TtBaSGwk7LMmlL9a9eEMXGoadrjReR85796iEqD6lyPZjonDVvIrZR9fD4GK0RiGEcMGFpm9s8MiXsZ0lvuJBAP5B0JyfosOWSCFKQsUv6jcqWMhDoPW/H2jO8OQOKqc6Q0NE5SxsrLOebOQxyIrSbTMVhjfVkJw/Po1aKQOW0L8LLbrc7hpIj902SGbPANNqhNmwQ2dK2hFPzBcb7oeWlREvk/IB3+Gajb7FTBXBrRT7BWcU03Hb7kNNuNasT7x6/sTwJXutzlZtI2eldmcFU0FhAqw+rBUBkPfGn7uZ/gWuL4EZlD7gaC4D/3bRri51kRpDvxtfPmMLLT1Sr/KR6M3LqSqv1d/rRRYrtlXMJ/SO3P3MnuHmQYMXbAmnlNy0gLWLAqG3JNUw8yTFAOK3jVMOUGmYIG0nI3uwd8VA0mO8wUybebSKgXj9Egel2NQV66nuQ8Fw7a6RB3OLguIt7njlvUI6u81ULcjN+UVFAdAbCljn4wfM0Eko/1NUn1rGogjULaYl1sWWSGh9OTasVJLtHH75K6L6NXT+jryUdR3fs1+emg6mKjAE+soXLpek2FHR4HzgjC0lk8SM4voPVRSUqdJjzs3vdtfaFkKkaXswEA24nmEVCpC4OmKMwiIekpWPON3OaI5z/BNyk2nZaQTJHsx72vLuioMD5kB+r+/PsTlPsQZm3J8+68l/xCVoy0bpXo31eoKf97MetpkyZZy7UXGUuw4d8mElOcHrLUApCc0rOYiyZE2QC2wQobj4pSWqqugEF4PcZiAwwAcYN7LU6cznx/RKZDMWITaOwU6o0WeazucppirBlStki+sxjzr1sqSmIE/SzuDppwUZqBIweZWCMJi6u1Gam+TZ+EYL2+xd09w6H1C6/sqna3yV0Wn2ElOzMqb4ZTZv8MUGCkCwsPzkV27DGqscCWd0ISEGqu3YQHb8x0qedEavi00IYa+WBe618cHNuy5y8hZ16dLFJViwXkPfzpQrACGhBtAXb2hhMWyRtGgCXiAkQJPHbhbS4iQzTmd/JKizAZpuis/1gLjL4B6aVxPwPf02dT8mwcijS36R4c7zkqqny7lvXXZw16SCmYSimrgskoVrGx2T3HiVMe7YiF8ju52TZ8eGeSrehMILKQA+VlqzpDlMOYuT6qqqJeRAqdTRkRoaNA+FKLnML6ZHuWmFMC9pLbp4Bvfocz15ZJH45Qkb3a6sNEILBQlplwpwg905gRLhaLM+Lt05lUh+VAJf0ekAb5uViDhSyidk76/Dva382PihLHJ/qC+7QVUQRiNDAmdF8XMPFQVflwV0GTvuGRZ357bjErkgOU62kZ+YeWOVRpQMcHQ7XlAjExCCdqXUCmnpnN78tOQzgQv5PV1OdbGn9MWkjNjZdxVu7BzNbdTa8pf+x0s85IQKZcrPHqLW20eMgHDdTOJyva4wFtfGP9c9upN4daLwwmPCtttWGSYGNVHcuoBOYXqDWJssRE5P1btoxj57c64Dft/03qops6f8IhN19Nk6I6vQNhejJZ+HV2bI/+mpWUvbWk82Ur0kigLWyrmPAU7nU7w2AHnspUQtlIMpR4vOokpHIMVfA7k9UGtvFJXweog4W2ubE6ljnx5DT2xNibtyT6YY+t08Yw8ZSwu3s4sMhCTWUiMax3Iqdms6h3h0sLDsl/V6wWjQgPdE80ZAhEN3vtcfFGWgMmoqljvxlq5EboZ1b9OZ5tmTnoWoA9G8Ux4bQnq44W4hQ3OTf6RwzfB2s8DHfAHXcS6nh+q1v9iXXZqgQVSJZdRBybj+lU+H9ECPSmYRSXFNaUBkKnPkFMdlFK6gX/D6ns+HGYXG6KoZdKFYFK55C7KDs7v3CtPW17qQi2q9GW7KdJjwe2+Ui5I7d/W82EHtwdbRWMcdUKdga39suo/E4uft75/jE5JC6sEbOab3gFiZjDJtuPcmt0S0sOICQw3azBugKEX3myw+Fldf9IPlukbDLUDmh8B7jyeqTG3ZxnGT1U3ExxtROBkgC8WTmc3oeR4AocfKLgs2BsiJEX5hkH+6EsZN40azezThPNMfD9W1bpkPSrBpvq+DkuyArD6U0vWQMq733g8NQuqh7ANclYDdRV9+I3cj0XHIAsduwL8qcWcOZLmrIKToR20ZLBj66ZQki+PdWUc1MJoaON3Ig6nz1TVe5wRsOC8aUiTJw8zSjeFImSfKA9QnR3jfXygiID7N8Ajqy5U6nFQMnBCz1Oc1ZMq1fhcJw0KBohzweRLiqY2/4Z5IgdNbkcaKyBFaPhwzj2LoQ/ytzHvHJQ/qgpq3oZAbSNzDDOJCuqJqfi/O2ockEpf+rKIBPF1wnATJuOes0NG8UtjPT38GxDrJqzZ7Bt4y/dyr6upzW7bsGTuZSZH0q5LQ8i0uW9YhCygqt22I20lC4UhCgugsFrTbm6VarktfQIbtu0eX8PsZ/qVbWvMC6etziWxJ1i/m5MuwjJDrKBsfCHURIA0wS4xhqctB5g+YYhUqLnDjPILvUa0b5mCAD1qOJ/Kv55IAxGZL8gugLr+cZzMlfQI0gkNknDa4qvfKiOBsl0v1LHvgchSQb4nltW7oqX4RYw3t2YBs7eW9L8NS+xaOEF0mB6lAeB0gT9jRDZjeG0VSdFtTM1GiKrJguJcLgBiqD1gVTol4ElY+NQm/7GAJ9463cNxUFPynKbUkRzC3SmzMgTWZuDBYiVFyjrVVevfkXE1zAhKp++pFYMMEiEktmnTXRn/eiWQN8PbMagdxYPSySWLX1ekdg40B+3oDtqnuq220WoixVvE0tQiLmS56nH9p/yFB1gxsI1D38YJzw26zRz4BFVyFEHagkhZfc/NhILwTALoAAU+chvkAK1pD6cBsgj4VVL/mCOeNi3G4twHNHN+78NWKjEcEUq+vdG27L98jBqrdxnbGRdsan5RCppl/xrxKixRrX8blIhoadCt1pVLd7ni/kGAcL3F0QmIqnqewD39uz1+HwsseM9+jgusB9Q1nd+G4yHUpsO3m+/dHI4DW6FxCQB/niGlva/C/h0ymJd9gSGEl3gd5OK+yJkquByMJSEADohmpxeFZd4r/wMfL6QAsWPPLfdr8KFnQ/IfCs0pb1H8Bi03JFtJWLhPsPnfEU/RO+3/zVsyVDJH6ISKsy03mV9jrDT5b61KGdDN3dS6lmkf38+dEle/IDoW6NIn6aREjZlv7leBtKLl7cOzZF7xV8Gtph51fVSxQGZ/PPS/SXrplS37vz0bb7xtRcjTxN6OFoZVpNSx0BoJiNqP2YmIRF5/yl+mEqaTij+ILVLpXqNlxwee/7xYZC8jkQsGSEdL7hrUhcsz3yrZpoWw88FK2NzoXMGxzPpJ3sQUI9yf+HDSyP38sSwgzbwyhYstX1O+XEy2hMzc1UFo52MP8LeRGw/DytMmHR6iwWV5uTJ4ORXa5lE83+1cBiXUELE8niOcO1JPIdSgFgOc7htLnTqFaowQpFxXkSZ3Pa1S+eGSr0HqZK3THZQNDhOshsWLT5hMVVVd9Gpqb0QIjjZbzhhsiPYoQ5ZFAjKp0jSoO7UfMouCj+UbMtTzsUXqw6ndM0Zc/uG5DIfmGtzoindCq34r+8ZEpcb0/BQOTRrHyEa2BLvOhtk8e859Eerlic4rn2QLE1ESpCmPyHMeNZtpmMd1xsrsUaLQEzLpyMWvRd45KFvj7mcubyCLyqfv2Q1zgfusirTNDD8bWu0OkxXne97eU9VkzSb03DBQfDainRWFekTzs3ArFtGnaQZmGoCaV1KXtU+UHcC0Lq80/8m5kiBQ87tg/TvV+Kl3qJi7Gk0RkrtVQFEwoyxMnbK8J5muF0PcYduk/baRKEczv9NIE/cp9IRGCb6ZUurZoAcxmGnKta7H7VWlNVjPCWfhpFhDqIG28LWiFTxF1qpykzH/3oIlxaYGThuHaltdUATCu7l74xgZgVl9IBMQD1nXXG6JTmI7WoDssrcepnW/f5Q3HmH5TpqzG82nKXk0g20stTZpo4qidT4oim3IAyyaSk5hrOG4FEKjorndqcVmGcQDz8DRuzMuc/w6LaIoTgmPID4blmO8lqoE/Zenf6lh2BE1vP/GvsuXX5pfTIxU/vdeK7AMR5f9vFBPMMbZtVR+85bDBjgcrGCvE0H9yK6le/ge/0zaEJcNSfeL9TiEMRe6QPCfg+3DhXMtEP8MkQEZdEwFFd+pQJaC0xZXQGFU3r9utJLbjBLjzd5e+FvKPMeqZasSwBtjpDqN2cEB4L1vnP17HAjacqb6zwHUH/cqlv2Ah51vvJAiyjR4dxeA5ccZV+4T1Mlb+J5AYT1cuMhYyBQPjrqNoS1zRRhsSN/sIwteCQsfdFmhVdI6wZ8IVOBP4bWadu1DLwBSL0/FZq5740MRS9ypuPWflN4hpjZ8s+NYGDpVNXwPOIzOuWtriKi1tjE8gok4EP4PhVB2vWLNWCZfRCTOhkh1xnHf4KC5AcW2nurzjk9amddbwFgQbOaDjfisZRCt7kCGM7AazWJ1H8bXbCJNhUsuLAQxNlv8K2OfkRLTogPt33u37qEq4tNsngXCp1EeGFQ0Q6/1OYx9fMZYb7wJIKjJHdXMr3GrU4AOlxiLSnMPcY7rsBVef8khlChX7AOms/NnVolbwc14wLd46K6D4oE7bUr9aRWOysPp6Ym9OxIDoMTzU+sZgwq4EA0mJoNnx1bn8MkoYjJiI+/a6kf7WsVCyLhbMl+b5BouDMPB3OVWRCF2JuWymZ+UN4J7jqpt4of9rfXkfuJn2N6q8gnaPAx/QnwXirkIsklUe10NfbYgYiNOUob+AzBfSptTD60rC+FieHan10O+xPc0M52TgPbKEDzTMXIySWw2BjNWRZ32/pKumE+Oo3eB0rP4dCWYDYfe1RBC9gg15dCCL2c98UBYWlbX7R9fkKZ+vhEZmw9Cn1qZnfahS7Dqdr49Tkd4qyf63T2xMMToTduR+Kb7Acftw5j8/Kjra1p03oNi6KEYgeShcIqy0k7ZynDo+Y1K7vrXzRdfQcwbQSPu4j2A1OwKvcnTRtUklHoDjRzS4cUiEy5kfw5/FXdVUtVto2r8UBTh4DDvqGzEf39VPOM8yzXRNSwm/HlX7egRobxIY/uRUofm8jmxb1wfKiFsVP8lTgnJS4ND3bVdWEhsnTwu4yFDPaFBbkTPHGqAUPmyOvZ5lFLoA4XHvXBTVuEChtC2udOXolC/k4XX6P2MoQ5z+g/T6VdBxMd5NSHiJSVtnlwyaP0wYOikLRRB3wEDtYgkFaM0lyoiOPgakIetkKPZc2AwvqIqdV9f3GICNxoowyomYCYvTIq+5gImwonoI/8QzXl1M0kT7vlGf9a/DPSaaj2JK/eoiDdZNxMVfIJ4yFcRb7wg1FvkUUhJHHsPUgEPH4DLYZxIiITIdBs0tHD2zQoOg+zDkA9t8azXYPKn08ouMT5oD3Tnxoeu5LJEbmm5Xc2y5C8QztKXU9EqrMB6+QYCIgIk21v/QKvGUyz/jYibUWLS12be5jUw1DtVWIFNBcAlSNR6m6Zs8JwgJsJrGPAD/Hy3kSHAIFtaGmet57l/PntjkcDn+8K1CZ4aZPfSOeBN/2+UK4B3oLo9MqyjE04Zbvirh4Nsun+9DlRIMKtqIBvUoeAAef/S5CnByoZWvs6nxeFR/ZtaVlQexXC3jQ4sk+y+DK1eQimPCndrrbifinTlNNDAsyBmTADsiOybkjrqNYm2xzaLfsWUbUg1dS+ji+HvxZBuj7w9dul19qSbKBdcjEI1AsnMobwqCNe3mCrKQ9/TNGswp9gLZbCezwyzkKHStVtKtCS775oN2eNRAXgZBZaWZ6EZQl4sSFswVmBAwD89fPfLUPMQci1mQQ7GYCmWzUJI5XBjIPpzO2iP+WYTFQ1cox44nOIJr2duY0WTzzgTABqY8oDfnFiMAl/35x7kNRvawIsFaO9/Bzp1XvbYsehshWVAipXDDUuEAo0gmyCsIoZdQVgpZXL0/q2zJrRaU4kiASV0szO3WpApC1afph/3BcoJ4balMCwzJidvf9mfxYbfIMafB+R6kKTGHy1STSYi1fEP/P7XCLwTGmTGArCaQX5xt5Gs1vtcs/PqIExGpTgBnUK04KiPoQ4aYwAiOd2RcJVxkQKysXr0kcH9MlsGMw/SgZeUXomrsagtaGldr7V8I/nEpQeu3lX/ONZyVt13hTdGgAujG5lz5XUoNMpvj3hWvBdlKfcXvh6GYqwu2hxGEWWRtg6oXvJyQIkVGaEhwwu1c3rn8A4yn6zdUL8GVgmSBATNCehc0dQMyJrKkOKXBhZ1jkpy+7h6Qn3lJSmisJ2kFhuCSHlXPVPpjPzeh4LdkNPc6KYtsFy4a0YHQkWUtzoF5WSbJwlNyLtbI3DUwSK3lR6TZIx66PZKfeF/PulWKDUQQ+0BaacjWWbzt88RBjtIEhFcYs+8/egqN1kLQ8M0fjGPgwjC5DXP8EdbCqEatcoubgK7GmFTZ0P7YXu6E/Ld+9RmYh2B2JYXnDWh8XKSu7kZRav2OLRuNrG3A70ApXblUzk46RwDwzmKJyYP7USkP61lgnkvdJCrjqWWZspF4IW0EADfiBJ/GIJHU5jkcVkR2/q8uzEKJTGDsrbIHr0hTmQg1oxtvBibxxA0lP1BkYv1sLEe1aeaPxXDCiQmz3hb1iL0MYh4MV6dApruNqWLWTcn5djxwp5mMgBWa05lYaDEgtjTeSAuNbzuyMdaeqmRUAJVkCaR71cqSnEbw4icUi1CKw7Ucx+lvVJvhyYErsemNWW+KTV3/FZCGWQluw0iVT3IbSV7hLoh3jqugLKBGSPZHHKKr1dBMFaJEiROiVeYLlSV3U91q0iUCxHbcSTVxTnFSy+ZXmMuv8T/fK+vuyrj5Gg2Ae55UrHomcPUC7M6h2vl1ylulxXAj5X+eUn27pmL4IXDBV3mrbFwVxztpfgP4zhnCa0lES7trNyVbcqIkoG+PKpt7Ury9VYjCcmN1baQghQx/TkIp6kzCg0lVZe0ZiRZoYoyRQmXWYn0klyh9MP8s39nNhllvfj2rS2G9P2UJ8d3EuNWfXybBUFVpHkpmCGb8UXF78FwAKPE3gGFo0lRSa9+N1uqrCfDi8WyJKqHXWwOBudCDgfEXSI+AxP+e6zhEaW8ZywPLwGGwguwi7oPIh8rPepyPoKpMGF7RfPMoHOboQirq5F3f5AlMiesIagd+ktJ1jf3ln07e9kQu1Y+KN8RnupbEK76wbYOAP5MZXNNIY1aQvQn48GPKUrAmhqW6q1YSYXck03yseQy7qGNUHprN9rgYxk8KbvNp2MWL+3GUibBqV//cVdWFhKLBnOP0PgTQLPHlrHIAxm+ncMzM1JDauWL8Ebk4UYr6F+X0xOhb4gqPMCQrWbS4nSyQVeOpnD3IvePw7ybEEtMU2SRophCNir7eB0KfI4Fk1N2wO69pk6uIAx9CjEqvvYUNktNxTYSx3YZGuc5zPaeUFkZ5bEMZMS9yR9c+Rke58/vOO0mk0rXkre4ZSiTp5hpz3USBES4OP1GBYvz+guhSiBRiskEJ80csIC5RE6qx2E8UBw9HBj9dRWae7BsLujvYs+ZjRUn1NwmY+Wy9UXAIEK7cWoMF40Ip7J0YdhdOSoljCKVRKjmtdHmid9HDVWitxzUjLIQNT3YHEjhCz8cqmtE0yqmOOLjFZR9FbjEMjsJiEdQJRA09K7Rs3Z0i6FNNykRjXyTsax1TMrdL/iDcPTh6Pm6rbT9IMPQm8rxNtCQLsp9BA0CWdGLsB1pBAbn7jnRsdJ2bccnR8Wv3sM6DvnJDxgRTP8JWrEGLI6BnrIlnvh/C2Oa392Cza3iMRUrz+aH8wws4GRZqC9LlVXYbZQn4//V87crAyasl1j1dp1UF/JEPkKSCc+ZTIC34UgYvo4mZ0hitD+ZRLvIGjwMP3bA2fMg3wwHtA4uIo5qybaumUDBMIVWCwWQmVSYktH2s8y9yugQ1neX5Kt4Mlfo83ofhqpoMop2xGSv/W4vmE1uMP9OVK2UIF2BKzRfYARsAjz1kOeQU/OPzl/aKg0uehGFxY35TzL8GMTh11vV80iTmL8mTlfGbl20b3dE3NBLc4Xm/9vriRyP1n2L/03HooZeqyDF4Obl4nVKSQjagaJL2ZJKt7uPAKWkr3y1FvEOTgiSxn+vOI66EUKaFJhE7nZreuYYHwTQj+rSuBLZiFzqZDxJW8Zsw+HHreKnWeV9JyOJ5RD6zARQwDzMF6eNgC9KEF3+K23XyYSSZLB5KqWDbJbc9qkuJt2L8GfYd8Z9vgOW0Yo7zLb/WGIgxE9aP0zZSKrSIiL9Xdo96YOV11WPLTbJXbv76hpBrgpqgZQy2j+FCsb+EAN5oA58moN6wI7hQXQDoEfk5X0m/d4MS9w86JhVqgl64FKvyh3JI9Im0cd2+HWlSP/W3GnqG2wy/H/VAc7iTZRmyKsJMwwyirHcU24BuyQtoLsWEHvb3aDn41WABN7ivcCCMAjtWLmadI9r8iip+94zA2ozoBAxPEIFaRw7oKjmy+mF3Q4IfSzU6Z86UXYNwIImBkqR5hm/qoaY9UOhvX3DWf13ElYKB5lEzidEu2J7CTDbiIbJA9ySYn9dix4SGbiaV6MzHYJkDBr3M7nMVNOMyYXYVAT9dvqvZK7hcMMTupln+PKmFthMGQ3FfTFp79drhI1qBCCauZs4DmLW/gN3g69So+XL3vr8nJB1VMF5zyJdBoRGfGfKQCPezIQ7hruwbp8/MWOey+vmesm5QtRV6mX20OlKbbJzpYLoy3DxAGsrosd+WeCehlNhrAodARCbHyIbyzEO7fvXi2oju5MoqOLabSed8Cx0AL4mZRtOGFdqPH54e/cmPEB0qiILIdotzsv8aJ/Y4E35f2zcXToXOnsRY1/VmuucOrpyRzMZBK1aUuiHUMypEAUtsueZertZXMhNJ8NE6YdeqDH5yXOB2+mo+UPlwLTAmip1dPKJQLgVG6gnmw7a+u9ZxwXXDXeYHc985HAVEfoDj4rskVqPj/kXjP9HHv/bCden63NlZ5kjouWAs7ek4OfBE/7HYw1ShV0aQr8S5obpQP4Ii8P9mrP81pi9ERI1tE6pWOKcsaG6D3pVp/uoFbDEuboFGNBRoEYzuC9hZnaGovuv0TtHGLEESVtt95SglUkLsB+mnVfQ0nHfLqFvzQc9kNbg9zbo+JR0SIFJI5nwQIHy4GPjXgARYGJyx2QNo5JoFYjYptGd4g3/RCtPIvbMFH5REJT0bHK1FX8jqV20N9c1o3FLhZ2nf3EHG9aJmK7R9cc72amYr2vgbJyJ+pMCPZdaBBKl3QZEpAkcA6W4IaWWR5eOLj2yu1u78pccrsg9tpdHviDGPvSKOm3idfgLATY8srMvfulurjswNJ+YNWzkV8EosK0mA355iRfiE+fje+XjUF3d94RSgWZjOw4N2Isxcx3Pyj3/BZGeM/SmBBW2aULLeLH+zQci4LDK/FIhMimYjyEbX4xgN86cqjfpjdIzXoheiy3OxrjdKTLI4CsJMjsFrTBq7GZsmkuCApKDmNT1s+FwMGa07A3C/Fn2nDT665foYOrQ0AJYRbT/YTSLtrk1PWX6ctwGXP1ZdNh5NlSHpaTBiU50UrMoTpt6bQx4wSxRzb6HIPPVHGtF22pH1/12aHWVxXK9oamPhjeEzNMtsPFMj2pqJa0aewwvrEzSu46x8O4SkgvXQnXRugulMW77hgYC2cz0kuH012ZS/K96Ey9XS5zAyFWEubDc+oZ2hgoYEL6eZCOW6IDQlGNVjNJy1FBAOWtn6K+m3TT4VgGpu2d/aPNf8F1fqHC4iVU79+iabL7OcJ+JmZZvkV+IQPZ/gtTGEmHELn9Tu1nMVHJGKG8CwzI+AFEl17nxPNefMal1K9ZI0vYJEUfp63mq20eHquevgxBofpoasMM1V8gAJ34OiaiEOlxaTWUnMS5LSfkVkcl4Rtk8HSJW8ei8tMD6U08PK6yKEjHXXZorfuhwp79JwiZXddS0sttVSkg4P9YbtOUVojON24gQ7RhaSLg6vASZGMtBkDvHegaWE4Qe2a4OH9vMjee7xqSow7xafcSAEzJrd5QXFpOS61WnTRUfPxWTyQbjW36QBCCRplJxqr/KyH763DjV1Mt17bWMjcYfbqQEWEpg3Usys1bP/W2aK79gU4nU7FZb3/WZuHyWWkjYxXc1Tcg+9lTgO00jVpt1qrRV4SjiANlcx1wJK4E7KMZKwVsmzEEkfczWtxq994iq6kwL5AWt5JgCQ+MctBZvYOj7J0boimVQRMKKX/4GGVEQU0zbBCQrBARoNpbeLVfmFtxE8fhw9yFUuHtARDuUhvebWdW3x3k1pvT3uzgwPlcRhb9kvCnku+rRa8Yqhe1EFeg5FTmnm6MWQEqJXn6t0OcZVMgukXS/zZtteU8ouu12ahr0S+L3Q25ZW2MzIUefYdfqcwjLrqwY/nO1ugGzaExnD5nm5vjDGuGqjYchmoWHIsYzEKbaXFedivmDv8e8Xlbqdh3z5ygJD9X/ojy8u4qX1X0tsQtcREQzUnyCcW9hKQedGVdQ6uRAbzDM/H71J0G7vOdnrc/17N9P16rWApoL689HR8HyNndgqgrA7Q3ah3GpjAnFdBn/Z1KEFhK4SUtcIo/AwhFiHCVn6Aq4U0dYaNDLP6xeGcW71C7rYrHtDXswC8lp5myDnwTgBEo2m531yR9MiZJCbb53YU+H3/YGlmV9YiZbyIrV8/IlJiDi5n1ViQTDRqiaStQxBYdBOlALF4I5WSyQl/gYGOaYamzzjbYMt7ONim7Q+i5hGKuQ4Zh8UguorGzLZsgG24MMDAzIaXGV2w0oPBrfYl2OoMGtNBm84oFUm1joQGqoqsV8nbx0Zlk2S548y582k58BVwwOvo0Bw4cJIrwRZSLQcKhV3ThWWKKN2IHh280m/aaRvXGVXskWgDrf4kxIh0tfKgZBYRjXKKYclrtdVwZD4uMGkBXuWGn5soUToqkfoChUnyTuw0zcJGZ+PCOior0jzslx2KohoT3ayFumvk0k7mqqwbWMPAVVQPSGX6N/w6Da+/TNtEH5JJnyqgQGS/25C7ma2WmpuhsPD8yaFMMfL6pu7rOTDcb1My7UqI9lsgFwDSJ0LtcGFg+vCECcDnf8tru4sbO3LATLW0glK9aUYUzSfzB9uUlC4DL0CcAezjJgosPhgzT6mjbPiFehx332speIwsCV3tPgLiYd1nxZIVlkajSoZVYUzWUbsELFaNcYlLgVINvd371V7vrTPK3kzgVpymOTjkijCvZ1/BT63y0I5VzKoZI/l+x1h5TLn+Othmu6hOZVWHhA+FA7KL/bdoya5RY++B5el1SCd66hCGnajWnxIlvGE8khMxcn5rNCZvrnKjESOM7Pc57o11U9QdYxdRzxQRs8Oe4koWXeI7MOmCIwKaqcG2YV8aQ2eVl1qLS2+BgdG0OSyg4mRGfehlEPFqDw88C5aHsVJlm4kxRuXBNNdS6pdxmp9DVc9S6LbIQjU1qXhyl+1xtycMVwwZC90u/YaX7Mj0siXs0mfVvNbAtgGmepouXDf3D/z2WOmTbGOfo54pxRaOmozC5hlH4ZxBETuQLzbJzXzWnFGgWT9wfzRhMG4G40RiVoNd2/YbbUQatuxr0WFTS3nZaNjiVinkQ81RxNyDhS7AGIN9efJnZAc0E3YKzM1AtkqsyBCJXYddI6Bh+53FJJmCMqYDv0p+cSPknSVszA/G9cTTMwDkYySPFW9cMcSW/OUsDLICqPjkwo9oQ8dPl+vIsheAGfAM0ognk/GOrqEpqfL/dhoVsqPezNFFnDWRP+4Qxl6ZQqQJBAkpVFkePxuHOOWxWH62HUI2VDIDtc3rt2TSRC4eYor6Nqab5amFRbyyd+HC8l8fUweIOzjbjHDRTaoCGfAW9G2nugt0U3/l2imDBun6t4ad+SuI8nabiJAxCalP8Bs0uh3NqmHZOcegl41LZBC+dM13EAQY3J1oBF0Re0YsxZUIA2WNWwLNvHBzN/10v0uyXrG52V0oggBaTCA3lZxSdrD3LZ/w5/ns10z6c2q4QoAoZFsoFyHkEhRGLgtOV2DU2dtRE3EoKD1j8X4qRErYdchU4ixIwClKd2df9q4hoPZ4AZDoQ3uLOhz6BELnrgDKCbEmUTmVL6YwipX2iD7kmLAKymxoKZmFMvo5kXivttL5s8N+a4hYfW1BbQEQsadOADc6+e0tBHw/Oc3l5hBApJ7P3/VyiJ9ftzjwBt9w2M4o13zPgnmR8x2d4u0ts1zUGDAygxz0U/W040m8tOKvKivy4RL/tvv84WJZIQVDZXAzbtfRN33ivy9xdXjDfOTXAJ54/W0iB/tMo3YjAKbKJXyH13b+pHua5g6i1yreRGf803+W1VXKXPicGO+p//wWPPm6GsCKYn9wowlRJ+AsUy0Z7QvlRiRVrxuq3MkXrb/v40947i++364OcIhNGDyNWFOiHhePgUgOrAWrO7BZg7IG7NtaUNSQadWM7lb7GNHsRqM0v0pQdmOtw790rvcjhdaYenkc8WmBUqXHytPTfM4tAhB/ui2wA1uUTu5anDYRXMB6lqDUgeidxSaqd/zRpjaXC0DzQMQMkpbFkSoW2daGYsHgGwkbJDBPb9QeupXsV688cZvDuxo7JkpAvLkGjaXI5nWWeYf0RKC6ZECIP1dzl9Z6XyvYlbTbO+htvt7YkC72Sh/3qVHBysBfsaWDyUs7iELzpZiDVgJEH3hxUERPx06SadUhuhqWLNDsd1jjtZLv5uS9HJNuBXHRD2kENLrRXYeh0eRcUGVk1AQRwaUItHK4AckURC9t5fqolOYGWtoflwrEIrxQvGl6q/yVJcCygxBoPSbqLVyun2sWV9qAnkXyrxIDkqBjqHU/RsS9iyrbx3swxoFbOexyxkZV2rH5klLbXMNzGzm2QnVLBdTjifQ1IIZDkoxDHBdlMNaGoNKao+/ZUAyVN2H+qW9v/VKxBkuWybNm0IJpgMA2UW+cG1bciCaU+EXV3f1c5VJ9Evf89ej7lTIBKiJl1IX2hXsnZwbl9Nb00zA6FwmLPVn5fdFK0H8DnIUqBs2cMnwfd6oz6MOfZIDGrKcFjQhGH9usxbNGUUCXon3uy6aVGeMALPaIKtw/drjSRiHRSqeqTfCFQXpByMJUqlPBZRbhYstB5jmHlpS7NZoAwGeh46O8MDy0Pc3rEm5/mmkUIewmN3pldjKaj/zJyx45nhkakRaYfjRb3lBnoP95umSvWKTXkk9vDztNDifqJbsDOEjj5z0yvQfL+sx6x3WbMbMHigxZ1C/AihHoFCzgM/S6QAJd0sEWu2uLdZc5gSSSXXtHk69Ea77wJQnWLJR0QB7u/xaIWhgEEjwY3/jNkgp82e4Se64DZyMrowsXZF9RmTaeXQSdPkCTfwglSu3XquMoT8j1vGX1HmaEsGk15DHRGwTOZiTAePHt4TMJ/ZOCisUEJZVpmyy7Kq9DwRZkIpLAzXal78rAVZ9CC7KwVCV3gKsoleZNbwE5c2M4c5UWiiWmc5a5acj8V0ZubLz/JoevfZIq6qRQ6klI1O7CQwykDfDv4XguUjWyZ8m4gEx5acXdW6EwHqCLdk9Hhypov4dsPv8nfRVK/vp2Ya6P9cXcujehv20kjfgCZhBzrwGWrM2pF28TGhGG1tYjsxo2+tiwhsWyh6rJLSvBzJ6dJNmFowHaKv1lVm6LYw6MTlNJxfk79X4WMV4fi2yuJHEhW4Pz0+/wD822HcGyA5Gm1U4Yo/BaNb7/pi8c2etU3WM4toUiAcHScxOG8ixXvpmZ/JkPKXlbLK6aKkrWuf+prLlapCXqvh81s31ZjaeMqVcJtnw2/kV/96FUFyBlx6aQd5A4qqeAGYtYoRLIT18DTThGSkOneUi83ZyPYlPwwg8HotuqPciPZRnbFh9kNNVwsUxjxB335Ub6jfWpqus6W9qL042Lk0/pwXKG/GcsHYui9AgBS7JJr+K5eEIo+dA6YGXYMt39bAHrUI+/bmSpN+sKWUDAhGs0vBcSCx4FsqdtU2xv7cfD+PZlGrY+3My1tCYoL58z/Ac4BDJmXZ7SIxHdHg+F6sMgFhWOyXEhrGvGsCOIMPZgiDG1MBg1U9UlIJJ4UhZFAiBbmstbfaFZPo5i7PvTSZQvE7v92yz/i0XTrpnxUVr5SGjnT9meygt9QJX9eMHNzjbGrzSwSs7YPVrjFMHxiM3Kd2hW6eE9TpcME01M7JOmGONGGlLDy1MooRalzV2+58CnhJKcGxw+97HZqdwnSx1psX+iEUTUwl0cXbFGVRJ7ayIZfyMyzDZnfRjOc13IWe7SaqEuiMzp/iDtwnOi1h/nfcEomp10W87kLzsZKBr6WlAl/Z5zR/VsvRfHUhRcbh7l4u5GBZpB3gk79vZ24oweHSsxLaXIu7nIFWJ1bmdhnNsQ5AVW6gp66ZnOZ5Npsz6Du2S9bk8+iR04mc22V3On+0m8MQT+JcdiHSbPYfWNLC6wRGtQyEV1s5GbPAsiG443L4Q8Ow/8PhrgeatQTI93opj2fNnhidvLLNUV8BVZn0BsDmfSPxnNw+1LznCifroLCuj4ticyjh5ZlWrCsthv5Qxd7A7Xx0x1YJVUH0L3YfDPUNgMY+LK+Y9/PIvjvNl/8oJqEWVKuoEMlRhZ+Z4cU/QyFvITLRRuVPeyZluy+xwzjR2rlzxYXWgqXdgpJ1OKn4lzTyFFqdyuOAg8Rpo1evUR6ObcI/uT+73h6eK+s0WpGf+RQBBZIE5donab5XXthC0sHHCMKC+tS5CyMrraUFGA1Oa0HQaWcjDxcv4t/lQC8XSSwXAVaXUngiGMys45lLE/1Nd+xaB3yqwVfaipwyNpNtCwnfmwq1Y6ukparfvg0Z1KuKBV6a5WkFZTMT7czArsLNtWEBD+5rGVe6Elb3NBhFZNTkZ9DsPncy/vxAZk19ykan4JS/dMc5MVFFieofP96q6dm+sy1TrTmPWqJnYmwUD3sg57s2+ny14A3o9sHh3nzes1NpUKzjb/T+qErksm1h5rBi+RuM2niFodxu3KQXfhetNEHjAa9HY5Y5cCFCiPIgwZrggmjJJQo3Rw+dHwVbV7RQdzZ3i7W8PIvaQ+dUIPlaSSIRpd4ocu34Uh3t3fGsJMB4pGVM1P6yF9Rnc2DCxlilvH++A7rGXeS7hivDYeclSVXXwbM+JtnJpBEthroAdyuH7V5TNmMaPDLbj1dWmvvFwho4nlqXTkGMNtklRH69eyS/Q5mfhjsTUEAMpAE1nBUBm1tWlfkUAdXQLBVykzj5d23cziLElo9LO/agWJH4EamhVWL/BF0FATakINQkxRty3VF/uml2WA0UOEG2381HXxvE5uba49y9JuH20CjFLcsf3Yz17Z8NoF5+KyVtGiK+z0qzizNnR2ofGv3G313XIAQ4u2cRJIXZckQrejoou6W4OagozZ6XrAy2NYI8FzljBhPpKspQdLA56wwRnLdX7Xsxrf5SuypNEMUd2AP76roOTtldI9y0ktm1jycNljO14TMmVuKvXgvTMwMiRtX3ESv1k2jAZlltD1CzRE5BjzoD/Ce+ImWsFQUu5MEyTsASx7u99jFTbURsAofwQbr+JOD0U70quw8i1jTV5HfT9pcjlT/JuxHRv44IhfecwJxxU8hvmAZHXShNtyI2depvYHwFB4olFGXSUrNk0tLkWSZhekg26LIrfAyeTgi5u/eX0AA3wfiNjRfm2DrBKLfDGPvntTmRA8UHlVrbPeu4cirh1WcFLj73s+5AwZ/5ULJ1GPsnDpXdNFFHxMugdL3iXwTbZZtWyznFcT8SjK/wTdu5EY48H+Tym/DmPtdvessgwnK9Flt4VvakZBMDKqRJk0r1spet+23tDyF8arkBM0hjeQ/gpQkAphDu48yVSeHmdTmBO5/ndDT3pYtDlB+2E42/NSS+If7alcwF/oOJhCwuFrtTPMEPGjZ+p8CtfSQsZdn+VX+b3AqXhB2HbT/ONkshyCDO7tGCp1fDwH0qosXMbcn7Ls8+HwIQil2YEL8qwp1pINeG6vdjCncLoxAPP2USneTNVeC0PlFm/Mrll2716iSHhZKaoy79IOBaZoI6gAgnXYfXPjfL7g3vi1KD8Y5j1gBeD7iC1fAz6yK+HbBoQgiwcINUAExEzUf1ON1+PsDjhmBnWHtbS6zRmwMzAn7MWz8gsqKh1G14B8+M5IjuRmbz+Mr1E4/pd0AtRFf+/Whwp0YsX5QN7Ag1BtivF944kdi+uQ0ZcJ/0lvXpgFYFWfzlTOoIzSJrLwhdVCuKIg/IJYjKLoSLHlRl8cOXT+nS68+MpWoiP9SkDs3NreJGpCGedMwd4WA/H1q9h140LiGZ13skMOad5uzwg+QbJXh++QtsuUHhsTjD8crBAGhnXi6g8keB5pd+mYqptJbj099dn4Kwgzl7nRkcGfxXxdLU/ArfVnSPTiRal0cCA7BLTSxveCkqRfGpV1GMlosw7NrVjyHJK8IuomUyzFlJEczP9p3LaBFfmWBwZ+LEEYGi+ayGUBttShYVEhubtxxArM69CQ9K46s2Z1lpejuXnFzDVcCzpQhjr66OM4MeUmc4qnENt1bw3RWLKv9FBJ4fU/v9PMzLLYOWkobfcPW3Eh4n0Z4FgbVOXf2D6BEwYSFVbnkznVC20PQ2LYq7A4RrYZ5VpnLibWEK3RDR6TqdRGkFYNmqrGbBMCwwn0Anq2EYcK/Lw3HhruxFYQQ8Gfx2BPJJCMe/3uuk0NcE1g4wIM54JhvK3LOPxnZcOAfqYBmVbmwHbzJo6FIti0TmUye9ck4Go+agLxHU9n+mO6umGdxOZ7PNOZlKK2XMRDXFmpZVwW8y8gu+rA+QHtFy8raPdFFWDULuhqrEgEhuHY1mOE2wlg0KbfDlZ8uyeplH3PV6Ibw/SqKLYrb3ySDtpASDEckwOD6V+aOtDlg6OSrSUl/iBbLIHbXL9jCloYCJDXfcuxo6CaM59mUITktdim6g7wV4rwqZi2RMnkE/00Sx5zRDrXNYrA1cxiZuog0Rfvxn0rXbu5fjogTwC/WqYO3bBRc74bkLBTBILX+ptFMiAW5hwx1cBNNy+LmIvkvWJf4I4sxVeKMR5dn7r3kFcnMWdCwljpv5x6UsXnsVx4xDsq1QFubfgus/LLvJLWWIkDYPIFcLoH7VU/wZaKK5DFbP9z7CWE0esRMn6tH89ilCxeb7WMclM6uFXwKVlZpxWzXDFCBoHUKf941zW7KfcRuIQHargUMkK5MyzPuifL56PIx0LPmdadTU2WFl34qfml4suPXHT73RCI3UWBleYgtLL2J/LKeHGrUGgW/foP2/0+/XC/O37wJpmuKYirjXiPJOFtQSnBXNrRYHGEq8wlBSZrYP9MsbqUe3enHZnedb7Da+9S6RRaTfa6YdQaDEe0kxd6+2m/23JG5La+kx/MzQuPhPMqatZz0mVozv0HSgAluv9RG7sx9gcMYAgE6L6uc6u2TOjM6ZAnyIdN79UkIhz0VJnjCTC1XunfovpR85cMsSdK1JyekqNgCpz6bzImHoZGKDh+XnrVpeuZPW+/Kx1cTYb/L/3QNrohcLFiT1Iy+cY+LnHKXgB7p7B3mjOrFER4CRaRJED9dbTDQk0tdihicNz9Q/160zgfF7JS4wqiBvGscX5F/udMsOUHlJf8U88TMP6sa3eCb4MfwLwN2rpNuzpnbFD4yFwKIXtDLef87EC5X/onrV/c3/Opt++LDv6JQ6oWxA9HFjpMjVU6d1WQllauI7lknFHDg3/DW48WVmq+vSArlzr/8k9XBKGXSXGgRUTymDHut0lF1/mxjswNj2NF+s/zEdWi60RRXxmsmSFqq892HGUrDLloxoGVXuT3syUeOgsQCtPsiUSHqXprqpnUvdhFrjCu7cG2L6YUlrlj/B+szJXRWjg3dFoXDE38JtjDh2IO7KGQd/AJOzzX27NyJr2LrZSh3+YVf6GlQgLjxSmsK43k0tM7zJK0C/T/c0M52RccWVZIxmNdiW5e3XHVzTFHIza8QVUzx+WgoYQ6WU5aU9ZK8W/MydydsPShpADHD/M6+sp2sBPpKrH1q/HuMFXrAtn4nBhg3441cvwuo7Bu1SNZQSarHoiVqMEXDCbIf/3jLBZ6MKy63emz8GiaInyBHfXIMluMW6ZSJpoVw6G4XdwDgZ6LEKgAjnouw4KyRzIsaa2j0RIIQEVmf5jeGfXKST/UI0IP3/Usa5XMiTJNAS1a2nQwuEs8OGoLTD0TR7VzdnTli3FsF53Z8++Hxn/BRyh8UCK/HXDAMApzv2Elyq6Xr7j5IyLCX9iXp9vAm6eq44ZVQEJZQGZAN9zCXH3NZrM/arIpm5oShNOw4L6xA+cmZGGUdi8dht25cNbFdPJztNSbWmE0EJ/6G3PbXJU0KstGKmrWFlRH5cD4FwYpZevXPcsu3ROgH/JD4iT83oqS+OhqAA8//OJhbqnc+eEyBiN7LWmDBjTdjlp4m1GqKs8SSaUK/bHw2FUQqpGZsbKCn1LrFYyt135J6cv8Yt89KWaTgCkXUZmIxGaqWDk/ZCEymOKuJZ3pYjwFcotOj0oZA1RoGaCi+80yFiKA4zU+mdCfChlc+x5adDOQSfS5JpBtZgMmfNXkbbXoxeGXiF5tJ4WIsBD4VQz+3eRR7ojrtiqp77ln4sxTjA7pk5Rj88mXRHOfoRt4PfJKb9cd3TDbzcr7xSRMRd7aYlnWuYAuM1emZmtgvUGcgRm5GMrNW97WLCawUorvzPH1xlDOZJX0YWEsQDadRNaK4tDkFxUej4hzS1o1ss5VBMRn9LIrZEcp4HiWNSBFPXntEOicQ+s4rNQ/5faB8m809MwO6bVHkFooklsnfscfqDkOLzejaF6D0J7P8uuiW9G/oSfIy+nuVUvJE0TnTLRZs/Co+Y7+rJa9+yIH309hWso2afF76gw2kW0N9dyrCpwhWk2ibTg5kd5ir3YyHTpjbqcO3lH/h3D7R/njji+hsOLO8nmdncQLGaYaTQJ8vgMSxx3QZ0xdeFXzd0DAnqSo4Mcqjwmnf1jykHo1sCYM79iLDSBlFcpm28YJoTPhQmbjtsiUi26snCaU96sEmZZ/63hCxrbbRW9SGng8KeLpH4IX+jU7q80LIJoDuiYjsS/Nl/g1Wp+xUzkHJEtM4ZD9NLoHI7MTB1MQbjrNwpyVwM1w19LtkaMQKsQcY9ffugse0G2I8sMx1oPnjEcaLLUCmfge4EDceYOOHD8ZntQNkIJhhzy/WDkm9+eG5Ygx0m+hgH+DczM439bWtDMNl/fZtg5xQF+5Z0OfTAwSC8Ap0zVHLN0zXm5cnzY9FZPnWcJB4co6NAYAH3IifMGSh2Zqd4+VVN0J716jPEZHwAJl+Bt6CuxcDDeNA1TJ97bteAE0gNKTD7NiAhmfQd+l532Oq9+ZpamcfGSVUXU6yPmCFi64cYhT8rjsynVM0cVGnLaioWCSdpjHUkCHM0y9lI3s12gyDt/qrkaRB+bHKZZ7LTbqzKXbyFmJRTrmMt1VidNbBNCkp7z7jcPVck6t6h+mthpDsC0pmFKY9qlY/33lcSCzDmz67/kikuQ93E8hOLLynNmYQOqVaGfgExQnmblU8xxhLT04jVMTb3/qPyDO2MoQaq8uCSugQUmHxt2PTK7O/CVSmhzPsNoZjbh0vaJv0hT5WlF22VcK9w+X6kotaZT5ZlBBnrBF3HoBWt3OfaKqAI2goolmYs1ijqH+CojZP8PMqce8soqeUzpgAd0usT2TWE2SF+NB3neC1EfsAD8p19Ci8iQf8IbBD5yCz6aduyGsydEeP1GPxjPMKbrGQnrPoWAIFq1+tU38cyurXvqbSbRT2we3Yfpa8PYi12tGx9KgZHUIpVC6rrgerNwwG0AVD3JScNM6Vvwgk58j3G9a6bZ6MyWyJFL3DgxWVsBDUQtVvpvEkqfyOX1Q/WL8Z4TSC8JcXR1JDiZEhvE6o/WYIfq9E3/0+4KcgyRIcKE1mGtkn7fq8r4NJwJ8hvuNkMrtaR+SrrikxINKCD8DNwaJ8u/PU8Zlz3XPzFQibayu9ktPWyJj464hNxgaba8s9tWlh+4D3eX+vmzyyg6qTM92Fix/elrAnBew7GoJAUplxI322T7EEArOPFQzBbRGuwxz96r6MKAhAyTnK5HZl5TyZwzU85DIdy4dD80USAElq0ZAG9x9LGbJApRTRb4FzwyvoHvQxUtIz7mPL/SkTxZwkxEB7qdr48FJjarrUih8eHQUJPvTc8nQYY8rRupqCPrOmw6B+MKVYWo2NveGH7zhr/fOWOmVI6gD2GqV/iNIUgge6Yv8Gxo6/GJ9HxPO3L+1M6b4WpMTsCfyBzh98oGqprcbaj/rn3TjCpEf22dBpzpgMe+RI0TRkfImkOiu/UTJ1OmevyQGCED9B4U6BsHMFuZ8cyH1B2ZaRmiQvFxVIsxrDClSVGB09AmysAGWW9HzvubPS/TL7WZU9tQTycEauTYDNOMPy5xVLTbq3EbnxLbyDjCBIvQdwYf8w4Z2hsp+BFu0rNmT09NP8JjpiyWijgpt1XzkyVrgSlme2Y85NEBUg834piyxbf06cDuk9/dEVRoErnMLSenidQDMHnzd1G6LrRC6lShY0JCK5YkFmf+N42g2IYR7GdYD/BoNTqDdqrHddkm4y9jD/CTqupTEC9D5w6yt/vV4AjK4klMOSDpBR8sVPGKxqvoRYFFFS9oVCQxnYMz6fEHYQ12aPuftApJW9k85qDJdq6yNm6oRLHW48J4D6hDhX2TXGNRizdZJ2ooIuh61o2zrTgxOcimgLz9cJSs0tD2s+pG5mEyQRkHJ0/wEOzxO+Ab1RihD3FPOyJHuxM4ccfbeL2hUHxE75BNBkwZSpaiM3zehH0MQz20gJcNbXS4itBvWyHIWPkG7UOLIF2SVvDVFTCV3W4TOL6GZTQwaHKtEWqJdp+/qY3EZBmoV7+fttn2lv3XoFxZag/bk3cisTRjfD/uoRoyR3r1S75JRxyMtB1b7/FphuC9jy7brb/lboldHkILR+ww/KBXbc9Zr2UqZBCCyPlqkykA3aFv8nqd8LC6YvqgSIhgC4wKhYB17NwcAKjWJwrE5XXg9NqYT1+X0TVKGLBDBhATp4qRVStbm5+xxCrxSPKL83pTC35uzdFpkITiAggJH3vNAWXhQ5NNT+5aJo1v9nU4iPJsCvnD8Y7kN1OgEx401pjt56I48U/nk3JeyttR+1643PakufVAYqjnldFawZ5LQTflR1dGR5DLok3thahgrs5Lwohd4QVFywnH0CUjREaMQB6Y94xKzJFbj/WWQQJcHd04ruTjVQ/dGZCYeF8RWbDAuyGdafGD0v5z2GDbbYy43wmZSeHDpypgXkx8XH8uNGpLgaz+fRrDD95RSQmPi5YA6xsw8wXvPrlnRJ/4LKyCcdVScAjO+Ca4a5DkK0WqAn+q2D56xVepgO/DRwSArrMRLiMelVzvqTbhii1TuB6FI+MoTQ9bzs0lbLOPxDS9lqnxOP3ciKWwht9A7agbjjquYk4lBhMLngN7bvFjzcFNppZW+FeAoAupXXIiU3UqUM67hmaTcOYxrw4FsCFxH8OH33FQTgTh0fKLIyzhlZKhVgm6pvWg5iT3euVaqrl4lL5x3c96JUu3xHtnW0vrFUAzsoQXR4r6HwS8VMEDfW9rXSQgRCEm8Y1cuLlFUFv0v9CqTxVf05Vk05xnWFZZyn+gKReQzs5uwbnl/N3EwVbQrAYy5itbVAWExn+43lwpqOkZk2LR00XZJL0nOIRqBo19mZPawnevX2x/6VSXj580c8cKFYscT9vEFfftSd0iQPNHHnr9DihbEYGUaIvK2ZqeYaZpHVp7l8lGMPevU32rcKl7z06II8HcAJA3bBeIRzkH7IwTDnFY3HUxq7aV9YPEp82t4Er+HjT5i5jPHA+8AU/DSny1yC75F9Yi9lyv2WxJ2R/Xf5vRrdhCyV9ATUpdVA10M0GWv2gAUg8IKXYUI9xYPsHW1lGQtu5AxpzlRK0iLXVev8eGDM6U6aX41BRYL6H8KS6kgqbMvUmNNH+x+Zs1LiiuLS7McCN7R/xfqq4e3mcBtcjMww98GLEleuyt7pkdylEvirocSCriPJrA+CAsYtcCvPkKYNn6eD6DYiSidirYRvunjz5+YI8DU889Ze/kgK67CcemojUG9wiVL7KLjBh+r1BCTRh509UlMRJ423VoBxeRs4FVrNKHgZoCdoYWnHaG7gqnFWDVU/AaoXXQnRbAyuIsB1i3JXol1oHtDvqg/JEXD8hTXr2g8mSJ37IH3cLyoxfGIO8WG0BWe412Pas/48MRcm9gCzGSfqUK6sWgP46OEN58x0ToSNUo7KhKOaHN4om3iAOeDlv2hrVpF3MjjSI1hbE6iR9gz7ya547CofAc/bIbz2psfn+/IwN4/QNkM0cN/Iq/u2eYUArm7CtZpWflmQ9JvVZy2bQh52Ek72+zdGDEzsRIhWGeKyI+fx1mu/cbxrXf8aCrT7t9cpaZBUwjfA6fzVUkieuL/vHGAEvHDrLOzgMa0uOqbcMLqCLC2YvDIqMnKL9d2Jn+pbF1ldxOJj8mgz3lJA8wjG03xMVqSUdhAD8+2IajW/x+Zuogssq83dPAtDkUKajpLVtM24rJ5mCKUPGyXQsdn8gNT2EDojrHPuquhbHJfmy5sNxnc/b+eBcMsq5t7KlYjYAx+S7zRBT8qht97PD7NmyC06n/lnU8hrs+ERttfawZgujpXstpuIHNWZvsoQj2SdeckgxivGMCiiX4pEfitf4VKYWehwy6ustQtjnY7aChhzkn2r+RHPkoIA4hlI1fpOrEKeaRwrCMb0bGoIalOXVo9vOY6QmcgM4z6iow3r/lyIkNvq8EhJZ/PVRmVlCUpQI79Tv2WKKTUzjTZFgnXBYiKtpHOqDqN0KELpQsYI9a2AOgKrVPOKeIDAKSHVNQgbSAV7MDKSNVydkMR3Hwg4Mak02U+rvDRtQBPmLw9BDu1/UJOhDPVHfSOgzf6cLzSydJ4IFMC3L8T0bgXtHOcIpdYppjK1lEbd1LdryEOO/w1E0qcpevCAPrrCSStApL18o0fwkhmL1rCQU8OlN0QP8xl8alPDl6ZdDMPodfpRJueyliTJH65NyNOFryz+ApjatW6dIO5EjHv+exNpNcR9wbeLRpAbZIeoDeqFNyEf3VWZ8p8IcbhatSLe2ZFFRMyGuFXA31HXxFl7khdUFGg+EFZeOVzKeaiIWO8kboNRzvlLjuZzjOBbtGfrn6rt9oQ3GL2/j57wJep+auq/9EWQyATQ/ctZhVuIrYKYTT/eYQMDpfJHR2t9UyQQKTScIW0k2a41vqSci18/QEjLuuXoASffTUu84/c32HyzXaPHX/G+RpkQ/U4G/UJMUBDZDatM4AsfOgWnJMM+GL0/1Jv9yuhEZdjhcHUxmt8xsHeaOTYtEr5549FzYS6hMhmo8zoY/d+nEEZ7K5ZWcT4TV3zSquHchnk4Vn8S/qhv9Yu/cY1/qlToL2udqhrHl6HrTRwrqIquc82EirHHHsDgbdiMYYSBrMvWp4iZEnTfd/52iyWsaUEZBqk4hy/UEuzVzSWGW6YSsAfSJE9CO/0J0hnE0VUpAI0q5yZuOTuNoGDPA00z4GeJvjL8D2w2aHFTocYJMbadwuPZnwzDAA0vo9Id/EP0Bd5ZSek6ZdY2xT1QDdHwxbjaOtqQvz//fvS4xJCDFrnF3o7ZAqwqaTp+mKR63cRelsZII8dKn2P/gk9UvHE8lKuprYrJNyjYDX0voskH1aDr/tL8xinEvRNrqzxeQr7b+q3cDCdn4fVqm7j2WuDgvthg0nJ4rIwj3Nd7RcaXmq8cgWsafXRd5yvwrZ80R9+TYoZvwpq/VTTYPwGTcgRtmZQAJdgmCSjEBCgbL05pVG9Sm3bTbSzvGiiVuT9sNfD3lkoNS0x+mm3Q9QicIDqLTJuUXliCStdd9dn+ItzeEFESebS/mbunDCO3RCnkA+n1q/wUNBM9pN/RBVw+ZLVl1vIEJZFByla8NxNLZJPFOZSKrO5NuY1+Zs/QxSia4mhRHq36JeMycTzE/WRo82v1tRKo+IHa4kS9oCG4WQZooo3my/HsMOTTu/A9hfw8dnrV5vNDMC4ArNaacSm2UwM9dNi+3rNqmhG3p5LLypsJxBmUnWeuo1yUMobjTG09xFMSe6C3fVHa2xvto09mMMHS6hNB+NYihyaMdPqocOx+LJKVDkjLBJOmB5el6wHzU72roLoioxmAkjnHkY5ry82LbbUSR2K8zsLMUbLg51HF+s6lp47I6gkol/C/AcibuUvEtJLrBEq/jO9O9VojNtbl28df/0UbsgTCyzGr+Ig4PwBmtPU+5WES8CjqDVLPxqsW4QSshzDJMS8n0U61Usawc/Tb/VmwJKnerN4V5kDSOrgvjsu/+Y6KIaU3Ms7NCEjAqLG5N04FOnKch4JyzNdiY+Kw/wpvdLPxBVBwDcYfbmEEeLKTklzu3rj99iAJjGVMAfDNSrXUJTU6r4VxFSYoczmA8pXOzBSojvZ9SpVVbNlDg2SbmtK3I7/oguToT4peBapLCBm3xZMzL87btnSUl30mM6TFIn3bgXilcCNuh0Kpsr8HSbcuEJNkscsgOx/UdGrIliFkX1IQblfCNQVVJnoR3OyH2d+mR5Va8RF+1XMpHlowBDzjsAcGm/gWIupweYcvuWD244kxUhQtPiRf9KcwIRJgsEsZIU/WUEkYgQ900KZZzvDIvzbY4qmqb3SntfWknVZ1rWuPKO65e9f4yXe6B/vomL5D5rCLbgUzHHUUyJClbUzN7EFD/WUoo1tJcUjtwJVL1ff/GjooZuEgwbZ6xJ3tYIChlPtCoWh5ARzB9eCuu138I+wHC1f7NpU26Kc4eoI5c0n/Y7ZTSvPFISqgQqQXF/r8XKnWpeQ8ECmg8aEjFNzqoJEmgBVDNFspO7Ql8P1pqFTkxzjsHAZ1DkhueACsMBBNh9GeO1rM24whl5NWy8CGEN83gzXMkSuCxVycrS5nmR36ZV3pF9hk08ou05woUrZuKxUS33/QQ2hzAFkeOuL7TLID8+agV1UvifBR0LL0XKsS7ZEqISppZ9SZ1Ictu2YJI8DW2LZgBHs4SvRwi8ur7aWfYS9FuPIoKewzQlRnzJOdjNVhEkzu/09y6qEBgOUrddFiU/M9umQ3YEGLhvzVyMd1IVZOeJNAtMLuQlca9drEU9iDTpuv1RCWFFHLBdgsUrOOEU6gOojAodBNsxfIeJIcktkMKo4Ko6cqw590aRU/ENrS+muKFh5fk6sL3msSgvpa70vllgSHSPYG0geEAUousUw0TJijlVhbvZRVDm+G109Hi1EjbZ3dZIcCJy58QHQcgANqEu/EiH7DXLKNruW6Ijx2ZsG4FLq5eWIYMNgRGxieFoukVds0RIMDeFR1Rjh1Gji8wH4v/akFNuAiYNhCjHOpnPmF79kcyw31V1+Bs6Nt0XWPOkBKX0YGmGyfO1Jaa4ItIStbMrYf/NfRlotaRPTrr6GqZ/0rOCc24Oh054cGz/ASZrWH+u6aq0WZYPm3fkacMKIVTU/zMumJ2bjs+rgJ89eCpTqS7TDY82p5woDnfJpBvdlgdOKNK+BG2t9ypK33WsUeHD/CJW53inxo7lEI5EudEK1DtmyvEI77jNQfvgDQ1gvcchjkUXjOcKZyZDlXWW7bXD/2GBjom53NZOoZDEdWAOt6C332b3SkT1jo24LF5GefKcWxkqYr0rPZri2x6RmPAPsDHVSWI/vfFXWj/fwIbCqCmjCrWj9HyyohWf1QBMeythdVUYS+a4YPS/x4LsxTe+kfUCovXa0n+OVbp8u2KNL35vaflx5AAt/SEWijbe5BIK3E2xfJT3a/B21awGURb9sIFtJ/ruH5/E7ohBROA/v80yhyKPJkCbUQG6Z515Nze2fy8+XjjRtVDaoxudWxt47hrcys81NfHQMlhiOGc5cipG16LQm8jbM7OccV/TJFvcyQ86GRO3YDjVbQ/19ukYPDqA8c60fvU00AYBIZOxQfn89flMoohHl9aum1iru2iXlXzhejX/JGpvjWi9tIcEsUXUUgISsxY48z/GwzMEFLOPurksLE8lAZU/2FbXzKuqfhLuX+R+shNY/jAHOj1chx8HWxtCPypiVYC8XMvkF2b71vsJ8QepSo0+rTtlmorf6uUXGqbEo1xJJ19YbkAb00hOnbAcFBZ2gpyGCaSu8RZlJL5VPpSxPH/m5R+n7I9SWw8Xj0aOdac2Nw09nXhsLZ25+ezGoB/UZacXt5vrYxqFFnxjupQ19IqMzByzFKpySzhUdJ28UOMe1FnMag3dkuzLnXsTDAwl3qfr7rAge2pgfHa97eFr+8tk8pNIOhqYEg6m4It7gGFiz42PkgIaaLhrPKF/DSTOoUNBewT2PWr9aj/N71E5yvIRk3CjM1xZOCQli8qOgUH/s80C+Sv+X6Zvhrahhn+eRNwF62MCJ2RgwgZsK7lUYi+qefNub7Y39FUWNcsps5LxtVe3Kb6A8fCyUrBJDf/SiSldK2KJJ/FeBC+c9/R/LO+Mtiwukx4Kfpz1oR1GqdUMm9eZO2jKHooiTc0h+33pPuhjiPFFPheZhW0iivA644Ngh0kN/g0cGBtTzNDwatf6GJxe5OuLIBraKO7R71PNlG2TMKfD0xAgOGLZN4Kpr0xdl2pSV1uN5lnaEYoazaH2uSRdYqccWuht5q8BUbUOzkx+2bojcT6SGHxxZ7oGUfVhbcdzuD9J2PiOnGP+V7nILjhAoem/8U9dsxluF1mUlZKJygluueMKhvdr1pIeCFDbRRo0ycsHf9t6namctC+/K8LryDh1RqHLauB4sk9MhXIxJ/1R41tLUquhfmRF4D6x2AOuV0APO2YTc16+J2B/8ft5P+JQIha7TtmCSRTy9XVDk94wNe/Pq5PCDkFOdw4N3XAuCalKJHYCAk6oQTaV3VdwvleZAjNJMvG9s28NZrL6f+qqFkvB84FWDDAev3hsQYSAZG+HmHVT07koh20xGsrAKF1OdTAy0UDJtJzJgz72iunucOKQTcigLLhPn0yv7ZeWx9tuQeYkbPbdKvrvSIWGyP3hwpG7Te9QAIjW3K4bvddgAvmsW8Slj5+3zXqSprwGL/P7pW4tvko3xoGtWT3OZ4uvDwC70Y74dxeP8ulq9NLvHPnTVbUnNEnGM/M2nIxKA8CV2/Mxoo6a7TbuQr2sQ35KJ2Uw0VEUMITyCFgNV1v573fD4Ii4mJKuwocI9kKOGgAzTjCeUjJx7GmGPRGU3VDwYaA77XtKogO4VdSwltcwcTsuA9lUxZstR05jwvxUtGn5+0syNhT+fadRiQChTQ/1kuW5sp3hVr4Enz6RRKyzJxXYrBgJV0IniRUSA45Hce2b0ZYWAeWWle7iUf7+1s0/Dut2zIDdUUdVKV+Kfn1jVEn4MY07zYOLOISx3PC3n/BPJ9xTp0/QlFsQ/cBd6tN9A5w+TSU6oisZAHFEg5yFb+2k7HsR2dM8OVLP96+g1ZMPaL6oc1dMwKdYyI4xmU/hNDudFTHBKwgju9uoB+NvZvk/5vyvhfCFbpwNUIKV0ILgCF3WgqZ0tCMriCg82uRP8tPZcxrn9iPDfh6LpxK6nCGBtBe1Ur7seiSiWh9nMJ7hIke2NAdguvqEA5UQSdOt1HQvDX3JcvAHAdFHEJwThlP2QXFJJKIzApt8eEgm1lnUhybs2Sw2PJa2LvbZz/d7AuLE2IGb00ul5Gf0nlwF3weKE1dHGrZHDTRteiC8S6HRZYZY4pHpU+2N1Ir3WHKJj8VNQxBd8/asIbT9LS0+pquDTjuf50BE27O2QqDK/KIUmtiK5fy4ihULGUv62L2gziEeI281zAW79j5FxpwEXgHqNrd4WcGcy6BRPaaUEJ/CInvPMi5gFxYpIaaLBkP/ps9QnAhP4ZmMsXUUzjIZcouZ+7ltnP7u8v5hjC75QSQgXuAxuvzDbnTOaXQX1k/m8kdWW4VPQX/Tycogf8vTodC0ORpBeMXP77PuYDSlX2UpavGCLNg7wI/3nYSqBhaNhkzPspWl5CBAJ8HcMkOcWtGOLka8UTYtbWbYo1mfHyVhMWhvNZD90vjdxJ5JuXBgyf26p6nHrilm0IhpExWkoPfhVGIJ27Qnbi/Lk3ijJXyJFvW/8sphuvjP2fsUt1cJbYWex+RfCMzKQpNSLOwg220OfcvzcNUDcoidQ9zWRI7rvmcRMmm20Ty0JqC7uSOQwFw/I5/D0z0lbop+lxI2EGvi/eUXO6Hh8PGD381EWhmEf8a/ifDbcRjfncJKLeJvfMyTHOP24fg3lFTIxHCC/Dp7rbsekPbDAIyof8/QfA5cdbbsQeWicfDOHBYZdcU7MXyUDmlEkSvf3vV/QeuGS+nEJpWYXkKECx0aZ615OFXLRDOaEasl/WWvyw5e/MmOy20+7YJamtRBK0EfLUBNlhyCG1YQ0/whcwNJoMVgGeLXc0V7rGWjLt8SLKhITL7DrK5Mfp3s3KJzsk/XB6kNdA69Pv74OaBbrZKiUF2Yh6Kv8XJq0twnyBI6FSQ1IY4lJfJmAsbl9wmbaQh9tzWYKDh2VOIdBaMBmQ0prkwP5AbDGimbkMO/d5ZCv9HsRtgSoBLPCKHhJnuKg8+P9eGeJUWd3866lNgscYz6odt2Qqv5VpCV6+DiXK3bwC19g/CUmE8IK7nuY8dwAHspMB0gdLZ9agXnXCod9vUH6IF6fIU9wL6IhSuSghqoxKrqlpm+93aL0MX4Jzwy9jcr+IVcVgENN3UFKE/lIDJ2Bdpy4n5q2U9N3vY6vV+JGiwVk8oUzVdAVCx8SaUpqCU/j2mzoFvLA750aK/B4zXdkXQ7KID9YlVGJn/Zg0rek3JJpsIBNo3MrQs4mvBbhfmBcoc9t4i4+eDQgWfolk+k3bQRyaaWLohZoLacxe65eRY9c09fghfryWqrvsGqr9PTYEv4Dc7PMA55iStZsrsL1xNg9SE3S+g84W6cAbnSHhnxghsL7CDUNg3lz1bO/Hy8w1/pS5JznHZGxNCSb5oeGtZ7wBHGGSwW61a9uKdxDLMadcdqIDWmDz1WgGIGUVDmLM9WIGt183RbGPt6Wr1ULIEuybpTLFZURXfrgDDBuvDIBMMnS9lY5TgDEMdR1efRhtEk6hYXGcFTuDiRqg2b5VocrnXNZNMlbvgV5jWxHEOT7KudAxQcBC1eJmLZKyEk75gFokI99kgeYKO3xJNFyA2qxoiXEAjg92FS5P4E7A7m/3pVb2A8SPvqPUGo2Y+jhgIV6zmB0oOD/XZ23pcAOQV3w3xwNj5mX2PIeNidDTRexCsu/TeEOeJero5ZU/YpBd4KC7Nm207HempSWiM1DS/gIfWYrnYfzDVgZ8RoMyYeLusuyCrwhB9xRP+b3EEm0C5pMew6YVw67ZY20c/S/iv07jHg6C7yR8xy/pOIYxDlpSfGOPUuk+Nm2kd50Ky0AFC5X/cm6LTuNBc8fi0H2xLhe29wFnpLvmgmtRY/xSQrskpmI+K9vymZPf1+mD0rOZ6db23pNoGQinm3hc4XqKsgKhkMU4p5j3R5bsXrWn4Sgv39JYfZfSZ0F8nNzyQ8RW6rrrobuJCOjbdrIV/iQNnU1ezgjBUeNYiSJJT0J03OH+MU7y/14LW+yHXdPD+zK07bxSwLEFZtgpC9/khzJwuB+37J+kRjD3FT9couVbEWO4l87BYWqbO+6pUyvZQe3Y2eYRcHpszsFv8AyaTkMC8s9Z53wfxdYkBVgTJ8Xc4Qa+KDWjlZ0F+n4OnCGs4ragOa888CpNmDPCGattAIQXAZMrlRtzfYZkyh1RBf8N0UdH8qsBiOFCBsqYbxAQZOK3on+YaAp69ZPFleLODT5Mf5ifnYYBRduDmIdU9H1WNzFGTVsp3J9sbg0w3B8Gwcs4m3XxOd25lW2DArCCcEN+fQWuXPM+1E6pWCnhRTdpUa7j1VgS2OzCZJ2f7OGP836bzVd+d8m229EDafDXtdPPPwaDAU+NdxFv6hxYKaltBITIaewObjsaQ5piq7zvRv+A6ujquuooPImY+DHmcW/ozunklW8J74aV++BPlhkUSGuJDTBbvt4yVs/HNf2iXFMWFDbe/XpEmNhLhl9z8tJxTvL2geu5CvLGAPBIr7tLKuHryjssUrvNIJeUs+XSb022frxXsyfflnGPi3HKjQeMbpRrx1phA3qa/xDQkUN87cb2yGB8Dxw77N1sjfwitkXlri0eU0pUYuGX3BfZa4+yNkg9ExP2495BrwGV6PP4bP2xg+5tzgXK6smWqmnczzNndJnN+BUkB39X6YVUX1vvoLQYtYBWi7nD2yIf8NUG3Ubvh6jai7iFYyOjNQStHdwh6uWGNETVI62RMx0MBs6suXlnMFXNW55Ela/BeC8wJefhiwbR6zY2GY36ZTxQEqe4gus1Mslxk13Bqi4sGPBhzC8fivLBorkdcuvmq+0gRT7rbxJfzntTfsUlyj2eF4VZ7L/+pOuFVsQGQfmgSDKetmcJ/4MzJ2cWV+4ahaEqcg/HDvzgcplH42Hsa2R+MgkkytR4hSXTngLLUuEjYGPK7oFADhXDraOLEbbMH2WWGaDx/1i75rAxPFb0dlH49SY65Ffb1SbTOwRJGz6g6Jctm2BMtPVRo2XzZU13WqyTAbpdwrbYr2N4UgdRw5zdg5orrm/jVPGljpg3V3cyyE4A4kBvFh6o+B+VooFOgZ5r2WyZEdGtmlCiuqHAiIvxLT0RgRqx8y3XqYSQMQp+Udl++NFt8nYGkSrPfqQZKrb72eG/+QCnVBYJtgWh7Z74sw5vm6EsqGQfdVHutC1mE7cBQE1eqBoSuSkKH9PKenA+HwxkX9tvqP1gr8CQec/7CcBlByeuOi4sPSD23kP5vVZgWU081NN+PBymefJ0yVS7n3J6KwRe/Abs4eVLz6vAYmGUJdBbdpL0xP9QNEPfNhZWSK5Ur1tez9rITqbmqawmRc1lsMs1hv85JpuEkpBnIuDFwJZ398X+yO6bpl3YtbUtAtIJkanxFf2vrHdX2VPVhZcu7hyWMl+df8G3h6Nx0fGsnA0p/PP1p7ZXB/L91/9fAxg8ahOZAOMO+Szl0OLduXok1Kb+gwN54C/9In1+1JNWorYBYOHFw95FixSlS6ul/VDqYFWsQ1AzRdGWFKa95+m7STcYnT2xXrip1rCwp7+G+t1vgkSCzLQR1MT51LwIFv1oxoHkvPbWRe5NCcEDohh7GQRIXS8s4/zrpkhHxsrcGiPuvoCagIrMxvVrxn8hC0tZRnumb9c4euk39c+jtRikpfzd2oX1X9RiDG9f9RJ20fuwPOEQlV96h/STcfTEOG4kCFqs4LNjCGxO8Dso20//M/ANXCZ4vFyUbIqXL/0fB8q9+vlgh0vguWqLM5j7NK6c/ugJXPzhdC5jn092fbvnAu5y3eMHCxtaRhHLuV87gmkZADfkdHZR1ZxKjjKQHEKuV8qQGEbUK0UmCnymMo5rqgGkJ9G8zmhAxrakU7HTE4bZqgn4CE8Wf8ZM/M96t1C/M6W7R8Qdf0e28P8XwCOPx2mpab3fce+HVDVY424H0ZVwB0l+aaHTgg1PFZc35YlbZdYzNOHT2yi36AQVlKw46GZwhKAQlX8QcyQOmo2n957NTGpkPVoVU1i/4/cvv9mBSfkqmwmLeQKA32sqomo55kqtg4+7GAYwsC9p5POEbfYbFLm0M8D/U96R2bbwc2rVBfIC+LgrQ1n8BXn3qdRVvSrjoH0git6TtznS4znQCSwGMknAQeccSh+UDr3pbDSB/rOai7YQXc2Den8KtV40lh33+208t6l8NHRaCKw7Pb3D0T0w8ZZq/J7420mzjPazDZKZOEYH0wf6lXpgQlCtLCThvAfiklqsE3bk9htEmKL7Hi0k2RhBttKmzaQLZPfFV1BXM40NPgqqVD0IO1YDeRBkWp228ed/2bbI8EcXDw+1iPgVemVLhtizJDzHjgNip5E9SbyQPRzwuvjh9GlveSkKaKfMv/c3gynjFRrModwSqIRdk9GlcFWYeiTt48W3Lhi3Ajw2zo1Qo86PTFQu5bOVqMjbMH5Au7OomJGuja1tOBY3EgP9C58V3zdYT7cbYFAva4+98DY+P0HE8RI+pOedaK0tGlUtw43cZMsM4EoJsE0Qo/8aU1KZxbRJWx3yy6mHhwCjP1r9Lb8YsjeFE0wJgPGyev1AQnG0oGHdKAYzF5ydGcX5gADtd3Ab5ZvGogsNXsbeuKAMhHKefdfJLY2wPFUbR94p83U8a7ryMjugXBhNaEZvYckBDwMf/T+ZhaU4JIHaNysykQtjhcQOC0m3WT9DSUo/S7CfzUg1AauHXyU+ZXcNt5BPeEvFH0J9jjGin4XhkuMILuF3adpyTw5Z6kwal/6VePuI0Z7/Pzh4zE8kIsLheaN+SkuSSpYPsps1b8FsMSxAVMhHcExG+eMuNeO7m+9YnjrLySNprW044AgAPEDLxRDbGYT4EMGGXfe2+bGFBhMOk8iBM+zWHY0pMHhx4W9xEZnZ9moougBzat+LABgQhsffOng+237XpzcteEblORsHPGvOTbRbdYtO7TMEecy1EqDQkOg6USmOFLiWOklGRjoLNp71oeFG5b0c7Dnl9lMb75zMHdWfRmbxLQeLnBFiaLTiGQpc7yvQTuYq0RcPy5Hv+O4hQIuw0IEfu2QOiu05q3cP+e0q/M0PgmTGRBZReY1Rvs+vmK1mQfx+mJ8s6hvIgPcQy7t/+hqRThPLOQ0qKf9qjXSiEP8eSuLQYah1QZl8HnU0a6RexYMemoGT3vhNTwSOyc74av8PtOuGWsbC+i6Pf4vUZ5svuf8dUJCcEzWa1UrC/TZ/oGSyzmxrbzp71uhWaEh4U6e26dzwX4Xa82gZp0t9ozHeReCdFamC8FH6jMdIxEs/vLw5BVAwPBLT41QS/FbivwazFWPBcnUdM+YSMe/IMQBGkkDPSYKR5x39tn2teXMJtc3gkJ9vDkr3yPquze5sle1NQQtnWMKRk934Q6yfn5uWslAuimI1xerLuwrs1/7mvXP30rrdzlI5NbZmnQHQxSKU8+LQnc9Swe9y6i3WdCjomAQtLJttkq/d/1zJ7x/EhfMXoxURBZkP36Jc2xUWJBmrjKjMDcBz/AsYvzwTxAsOkUOf1Y3WmqXHoMloAp3UJF8C7mp+oiPzuDh5L1A9C2XFxNOnUlMXa8PVMeOk9HaMX0q2I5xQ0FxRBhRt5fk1azdXwXW+ubIXc1t81oiMAF87aslsOjBUD2GdPGDAx2HD5TcN76LIsGGf/iMxshHzotXTBbga+vanZk9Xsmgdkx4VLxk8Rj21IJGgHAGCPBN8Vms80RObQjWYHyEtFUZUiFEdl8xbyv8HAmR3fcWgj+rpMoKvQawV6Iw16YQb7pxrVZasbrAIh4WxOkWCZo5uZFgRo2h7GXRJIhqgJVLi+FcnvHFkXGIoqtvAPvtjbVWX1xfuSSTTFJ+ILIPURN3u6BBYUDounxGsD3+9Tq5AZLO+YWsxzRhQUGHDlfprWg5UC4BWfNZlXvXNJRiO1IfAzh6VJfAjiaCR2hoRzpJCwvUUIkJRKtCHooSnJpoYq3LVQ2mCNVL++erMDg497Gx+Jm+iTGuiZlyl3RvuumL6JwTYr58dgs/+YhmYsdaQNSAfEEGAwO2ctJdZyBx//zDx/H9AXdr6mlCiRZRU4T+iijtMOXWHo5JL4CEnhqQUdLJ8FdkdmFTuIRZDH6sfyxADzsKQmajewUih8zT8OiIn58T/J1SvhFgyX9pAANQceHSGP+7va1fHV775o/YYyodXFoOmBQfvdMXfAxhB46oq+X4nbsW3m9U2gveUuwLEKnQ9/T1ctZC02TRUkYtJJRbb3cyuKyVqKC/+fapCxTxZC1r5Wpf8eYmEXJH/KFgFJn+R2HRp9bKJdtwJEb/RWfKJGQJJT9SWgcskM2liBdysyJx+NofPqMUuQ54ets8GLffNwLB/3fEK147QiHHwNRBuDNEWOhJEhRo7oAW+BwRTJZ7uK80KnYXO/XSn09jImQmrX6UIXC81MtlorZk2CRErqfLk16bIM/JPjrhZxame0Y43+46BKYwegMOTIAhwaePIa1FTLmPhqj0xqPlZDTjPpvzGrPRFtRl1aOwrJWpRv/uo7JQZfeNVBIQ+eGpim1VXNRzSU8tvj7ISF/QfdMihLq6oMSZEbBW1kDFj2yDRF4u71JCSnccw3pY5ys4OkeqxW81MlLjg+s1W4/0GW9bnogOoiMY3RzpkCiELHmAiG3yrUoeK/UDGxMsFScUdOvI0CFM54CbzRoSF+r1M+xS9vuLY4/CJrl0uCf2FSDEFPh3Lo9kQFLu16hAv/Yv/AsI5xTu+akqMVVt5dOPa8FB8uDpzRxBeTPRoeE2k+okRnxXJxq//VHpetKnSBYIiVZxmPt8lQLknciIuYCP0XEsaHu2Cqt8HeC2ZkDBrCDoFvLSx4JcG5YRBHBScp51DySusoG/Mm0a7IJDs9cbR0jDtIs60qlE96nsklwlkjBIw9m7I9EH2iZr0lEkvKNu53ZRVCiWlP6cVaYodTrTRVYV/okt67JcIde2QDcXyCY9ePybdsTZtZujKFIjPS9ENgLnDzBfJgi9bVSrZb6s9CeR7xw+Vtm0CGDREeJL6S42dkrtu6LiXmr5P150aR9eO+tO6xt38SxebSiDQ/pEbpyepNxJjQX8JOlXyBdmjBgJymZ14t9bipqNYzuFJPO0qBK9QhtsCo1lic7X8LKpBn51y7AT1tnvvA8xTWw2zPpAJH/l8eZWzZikQxYY1GqK3T2909dVr/xvJvH3UIx1JVV4GM8agb90P4fW5w3wQcVoJRK2plBUt9GSnA0xiIYT7WKfzwv1MRVqinhupAXEQexOB8yYK1XT4ZqTChR0HEKByc7wZEqqwhh1KG7ARuK3YJBBvw4l2jHBYgKTRD9ZfP+HYR75PSRF977yK3Vj+CbAtNHEufz3P/AHB+fXu7f7UleR0usRF4NXf+KrY+UJyZ6/ycfkyNcfyxj9EAaNBTyHCY22LEj3pjzuluaTUs/5bnrWfyZYHe1zkIhBja/TgJ+AtZg2Mdf3CamNqwlbWB8Bsd3uvJkGjzqOhUq2+vGy4oiwJMQBD/ZAVwuRXELjcEXiodrVx42eYwvGarBPsAlfBSPtIRt2VFpgA15eUnhxbXv79emRUuTeYJIxPc77gYCL6PLKhC6sZIrrfilJw+4FJu+myLYkO6rKGlvUK/WStwVUsqtQSKlvQj8VWpn8JNEVI4tc72HEtSb6DG7N3BbzetlJJxjmLA0sgGSMNZvbLK34UXX6EJYi4Bwg1p73q6f7pset7PYrxnvgeXbvnjNG7QA+bp3zWq/wQBDKl1ByQ33slY7pJUpTrowWEVylpolEDsojfZ+qc1nDa6VlpUUkgE8cU9v9/z49MUey7LDT0bRHcb0g9lj8uNimGIioOh2mtK134HENfRSD6EZOAJpskWpHWdIeAY/g8XPw5D0rVwdyCvFp1BSPlluMKuFPJ8fuklZ/DIsSjmm3s9vu2Z3LwQYCygPtmyOfj7SJUZYKWJLc1qz64BxGV4FgopkCWdCMP8XFhYxXr4yz+I8hXqo1nukg2RXWjW+FGl9cYPRXAKMIV/yXdbs4OIYFCpzwCHdqnAhJEjTqBTWxWZ+PAddCoKJqWsumVg5Gd2bMt9SJ6y6+5EDv6G3ao3JJDhNOsGOKmOGLUwmxqR34oyDB19/QnL3opeqgY6yfEQLx/u7pmYJgwSn1z2LFXJ8D93ZEtL9D0OXb04VRbZqRRc7yd7vl+RcRvO3T2b4Di26rMY+Rsrmkbpq5SXgYkuMy0akVS032++Y1kY1tw8xXSDQ2KmKgdLUTaIOSUtKVpe/MCvA5Q9PrjKkVg2FWbYiEeFhpY8atBkqJzt/8PJ/T/I99ILmCXAke8BqRCZe7NvwLQpZiHIHrcW05Vd79tSCAjFX0aPOvzhWPl+lVU1De+3CdBrdxvQGKgzlXtC7E/Sodohy4ZYRdQYT8Ghia7zF8IIIkVz6syahmQImFW5pYu96EDhKW6xu97DB2mzMNzfOrEfFSpCmEpYWbgqFLubWd+9GDX9kXEwoLHnL0nuDTfbFHfFdluQvAwYXS4pvcx30PQyu2ld6C46fa94t8wIu5RYUsL9eRIybgKnKWttvcpmdhRDPvKnW0j8LNX5RSTdxHSrCG+j0hOUcN+p9FWixmxGRUsgHzv31R5mIDuXRFi1VVMqfE1BZE8fJLeqj5D51JNDcQ+6UUMWRYC9MRpoL8mNzTZLDksbwpiieSO1jTNC/UGHvgcKVOAHYqq7ZtEI+fsTaiOIBgFbp4QRK8FTo+8+EbhcYj/RLkj692WHt6c84g/13ejkrphkOAlt2g7TRHMIaYWHH1sNgQ5sTrhuEDxhR94T7U42FK+q+c1qG7S82uHcuom7bgusfBKtKkbH1ihjp0ulLd/F+UQqshcyEkLnT0OOVj2xcIQOhBQR8vJYUxOMdXdiv9rg3f97bP1ISCdkRetfEPIpFhCdL9E23564jpsMnR8OCfD4cl71Ppila+jGFwT+DFVw9DYk6b0SbFkrV2eijXPKEqDJwCNkICsQECB9BrjGVbuRAOM7GPqr325aqfd9Mu7VlFeLhk2J2eOOLZmew0Tz21Ok0rlKg6STTAD4BIW5/HRdQKVWCuaLLeJWFQutA5AvoTDkfszJULx3EWP4ATzPlTWrTOtNaQnZ1EcyCTelzwhWW0UEEfNpBYFLyHJ0sISzCJVW6YIWVkGXuSs7dgeiTBWD7aYSfoYz4D/ALz/PxULQ/LwD2v34+ztlUhwuII4mcPC8GEVXZSikRcTqPoiGG5YbYu4rX5s4OSCmArz4Vu29UtvL+WXSB5t/ieHTpPZdNKFSDRf22DXPF0CmpRfBvcyaIEOzYpJbdCg0/9dMyYGY/HeGhqO6Hk96oP6eDCkonMmBDEqyPdb3jRbBXavAtVr/BdrVbObhh8UYYdDOH7ZsFMysEnQJu9StpBfo1Ny/EhhzQThdDAQoF3KNIpO0x9OsVrhYq/EN5dAmPyV8/Byjmb5PoqCqlB7d5Slxv4NDU3MZv1mcyzsWR208/eSva2AyFVV2e3FGydwldHz4qHQ2YQxfOpwqDfqdm6lkSpoM0cfoTP9EBLl6Swt1/h8lwl1xyAlGfe2j+TxSqk/DqRvVUNm9sq07VjCstljgK1MpTg/ya7RHgYgVyIBIXW/XNsxqHHSgmHxD1ke6nmm36WliVa9NcjtbxrARoejwtjdueb4smNjnE62ql8rEoSsART3d0rkoI4qL+kDGb7gXCcdoCryXYwi15DoAkGT/0/ya4i+t1t/LFcHlsI21JRMzB4vrOrxNfQyRiTRbbHeTv4YjU1RxtZO53aCB1MVc36b8T64pbNEhyKPPWi2gob6GK9JuTPs9WYGBDQ4kZ91aHHR8AHU99srmSvCUQWzLjVaWftqyUpl1azuIcDlj4zrpLJ2YRgTskbirGiETi+rqS2+RyRZDHcgR/ZHSEEZutPTJUB+TLvhGV87SFoUHsHZfmU0a0SG+z1mfpdQpYFCeE/9f8iGGbybeFRbWnintCCrNaoDmWuwLyLoKxUw5SIj/u5Kzg8o0ZYqLlP7Dd4nzSYFXODUM8vnXbbWTYNs6rkCCGLuszE/YkrvY+cC2qyxJDdHWi9irQPMznrIQcSFnRaFd2OjWQqpgkaLjrJfFjxEMM6uasbSSR64tWJcjmgre+YZ5ZRm0KwuSUTiVTlSoCVBTJqC/xm4wtDJAqey4OHFa32Vhn2T3ZrURqHD/yAHOC8z5yQRCvftBmCgFi/DS/PXoROJL8FBzRkQSlCJwWo+pQGlqTEbZd1ByxAjUbcFQe0NEuMEonKkh7TlmH4SqWPULRURoeDcrKKAJ1tUadoX0vlS+2qnom9C5TsiF2igU4Lto0Q0ek2IXnPIEf2vIGVnJ2plMCFrC062txXjTPnXxSZoC2Hr5vKAbRsEqc4ijBod3YsVElWInL8GRNpzAPynko4rKD/YaHt480QkqKrpBweMaMuqaKsGIUk+1sqNikPifqZ73i/J80zE2OEYu+6iWCZTGEXpuru2NBSZQNEJLDJbqcqiw12uZSMt3Q2CVRcYF4dsGyOIhvVMomEOxcLyZarqR5RTrMlu6RrOqx+H9DRXvlrN895YnmqOtGOm6t6hPG6D2UAdMQLC3nOZKHJBxffSgZYBi5jEskjtogfl0ScLijkje1gNz4JbvexNm4bMx5cEElcM4WTDj7MO/yKSGXbFpio+MLMOgiZ6jqlnX1CzCtM9lUEfb2WGkeAsjXCzs+Q2NGowBI+hiv8PQV6AMPWr+SNPWnu/3GdmjL2FVzx8OllNUo+jpwHpF1QjruqxxNdg8eD/RT6ybbPU/N0zDrmP7Ij9YHmUbdcahv3PF+qaxLFcjsMKQ5IAfLoxuJ7zrvFh35quPzqdgp5wC1jtvCcjRAlB3uqwpZY8V+I8QPLPXs9RAjg/dyaf33e3iqEYk7jTG0xBmIYB8HAflPWlHHV5p3R1NrHmArq5Mc1+0A2qfl4UdZFpP9Nbm41m5/9+ZS3SvkdNnkul8qUhdBRHYFL+CNuYsaIhyngxkeCDMcUVfmlgIB4IF1nj7zoGMhOHp/PVKeMwmU4iOmsiTb8kap+nQQPDfj73sJsdD1BaeZaasHV7zMriUA1eLJQpYLSO0S6WntyBDs9AJM87DJkP6XS/xGe+qe9AMlgH5KyUk/mJ3HV2JdpEkPiPdA9EfVC+2NI7X9Mn2/hD6Z+Q8n86tR/Bk8LVV0J33zAwWsFP+qRpThErb7SAV5+FrkhwgJaU93uRpsv5pN3bDPPoTHca0PwwSKi1egQpc0W35eKKQUhETbEkHKHYrdlu/2lLEOOqUeZ2R3gwTUN3ODGUy73kfOvIYUhztGP/IMlSVOLuv1j6sCwshOMCjVcyduKqFclvDsfBarG+QyEqAxJu7IMjDNvZI2UtN80gUN9T7SbVtrB9bmcESUCWMUgrI71Jsy2rTxL+JtOHAVPjcym7rmDqzReT71Kz98R4hX9Zuln34I32NLBFjZRSxlCUgSRi8236Sgz/BmVdXL7fZaWXqqiWppgXHlcorEPhEf0YRa2D7FqoHyE4VrPUL3h+fBUP4ZkS8GEc7s39c1kA5Kr39t2TWhR68DalG4QW593m67VO81ncWfM4Zx2jNbD0ecPnuEVXc+Gx+aupokjOjZu0mEYBxyxdj8/hQOI1EUhJBFB+vhqDTXDJDQmiUuwg1gmDnpJy8zpuP3I63MpeQynBFM5LUfP7X7IrmbIYNLugWSxK/ncCU3LwHBZrJAoU+kp/eUIgODg7n7Uzg9v4CFNPAG3ZmEMcJd53UaQH56OaEPdQ4kgVXpFYIkUxHvXMZaFqiC1FWOqj3J76LqJF4ahh9KO1u5b64nWN81yWqJJrejgTe02cKHar0epS/SFInWX82MRc1OuNL2eWlYi24jRX4kb8ZZf0tfHNpv9Ip+y3w2oo3RPjEU4RAiBZoLtGkZe/MkEPkSoofcIEhaOw4bWutGGRqFXFaHoF8qoytUP1xVbONuFJpH0k+i9353Aycis0CyW/DqRE0k5jstL6iYO19uqG2ZPsw7Rn4Mq11Lk1ctvo/zVLhEF5Ftubhno6G9NMI8bUBowvJflQlT7g1qDnyE9OBInMdtejCxDZERE38/nG3SKwUoM6DjFX2NH5KqyFfmYkdrPBAIz5nWaN83yDBs1aO3h/ldYa5u885Ut0egfd+JU2dk7q387QJONWJFJ/Z1ZhKR+QsxgAvf0bGBeFUuZv4i9f6jAHibxmypee9tpnsThVgXKhjthDrjrGyGmErfVc/wnq+vde3skYlT3S4rh5FkFtRDO7J9kEjczxvt3wTZ998CmhsxcJlS5fH8NEIP3q3BfVwn43N3xthUw6L9fNtMADmbSVBG194TAPDTeyy5akVxbkUMBGHL0zpKgT/1VorkIeNHvHsk3x+k4Oib4xcY9jBxwSeJ2psGsOkYI+SBakJPOQj88nH5Ly2lthp3yVRsfHBVMSqTg5LiVRwpagsJY+JPmpTYEnDwV8LctgSHPt4BROVKh9EDUCEQRcFjVIcH0gGQ4hzsLJtNRXiepHCFlorm80ezEp2W6BpX3/UBkJi+I8LDc8SwyUOWMcjNEl07T90RgoiXN3VuJ4EDrwpElE/HjCffyCpu2CLCM78UMc1gFhuJbq0kO0cbwEDXTDFKB3ELezOmC1tKAANMOry5mC6BQN9UTPl3Eo+Rlf4KI4Ql0TdsfKTnNgz61XhNK3YWBfgMeQ6QkDx/862RNB8yj7MFKRD9h9Gbnm/Tu8N0mMdBOWWUgUDxTc8FluVjaOpGpc3iaQzptBSOiK7GWxijPngqQg3reEdJ+qbcHyqPawbQl6e/Fm0a29WIlQXVe4falMsglP0OJ3+DEol2V+7T/zLaEOyqGlpG/eAMZl5kzMk6JrjnbxL0WpjnX20KDNUHyr+Zc4jg9j6p4QDvRfDiye9rQIDAO9OjyandrBVHKddG5JSVf4E53oQsyrsTKr7sPO7wXnfPCVuNs0nodrIJZvQGfSnUEwYqX2pbSterBDStORHDqqChDcqeYa7IUElF2PyiGFtus8KiffCrQmEd0XVgwus/8s0EHnA8HNS9pv2f5f35Iz+wIsWtL/YBOTu4Eg7KZbHNTC6q8IYJiSgD27X1K/AX5U4aXZAVYAfqdZalnSaaETqFPdB844+StpabFI5YdrAvpPn5oWLIwbQ8ajm8j+FZdl0yv6bMn0iMj/ExIzKXVSSfFPw/9ZMKUItPRxiQ8r17TvTYXPGRMDeYONAR66abFORE1rY2yYmdQF3cjFkuWsPt5QuZRcq03u/TrHDxfpgF/AhjNMGF49vqHYpyBw1ZUrQyGJX5EIFTShCbE2ZdTKS272nInF/wLnnhwIE9kgeEDqB+kp/W6R2IvrPp9p5mn0T8rLpwH+eE+2VD+nEF8tm+A4X5WDON+jy6sCkvx4Ge1NS9D91BdHoAbFXqhw7zUh4QYnvYiwQCY47ZNmoX34zP10Qm5SDODRcLMwAYmxPGwBs/YPSg1ER9SCy4BNIzQQ/wRy7rssSdKI1YYRViH3Z3QTIho6lZjlBe3Ziocnpd5QQcK2dXd8pz5x+DPizbfh5HJU/BR43ldRRAotOQKhCNU0slEsxn5qYRyz6dzjj493QUOrPitJcbp1yITTp+qyhikL6OFxF/cJFl7BhDwQgMCp81W96bC1s8SH7BRB3KsBQxKYcgeYXTjT2alH5H/1KxuXVN++hQ/AYoN11j+7wbXHOgimvgrOybPurjJVGLnpq4wsSqaAD6eiMB+b3QXYDk1LD2lrPducCwELh/LfZFNbO7lP0JI0SofPQgcNHsvJOjIw3xYVERD6Sf1OksgJUaOq09vstvijuybll5LsJ1ebitgsyUaYghkx03VDg3dwmXbMxnD+c+RPrpLl+6d40ppwPq0QFomeSmMCrkXAY2ZrYroWaNFcnPyzuCAL8reuThK9xNwgHzoXiyOuSECyAKe2DtZ/9aUp89SiONhAybA+r7tbx2BZKuHrP3BHCE3hITtwDaksFjzraJVJGwc/uZMny1kbHspd9E8pqX82ngNyHwQbzOUuVeSxIGNohKCdMc2nACE+FlBpNuszSJLyTi1jMVeq90L2UU1OzdiJ6JQlyoHksBITQQdCN0vCe+EDfHoJK6FJYxoPyJbEtlgCBioLY2IljMYOc7iCqLdf5H82WE+XhIqF3+Xxns7edFlOZFz72HCaKRY9VhAo8BJuORdfp3XtZrlXY3L9XEBcrGH3Kcy+Zv7liH5DA97+xtyJVwwpefMgsdJLCBe5jkCBEKy829wMwqJGAvYOLyoyuqqzkiKf9smmwVtbHmhESODdI8OJcEAkeDj4kBCzzACIHLJCEC61hHnkYLm7Zb3bPz/PtfeBl0BhCe2wkcPMGW98ad57uzTkfOcgqrw9gpjUmMp4SNID8hiISLO+nr40hjmo7we9buQ9U3rKoBTpaeWC5LK+VJApLzJVGyNXLZytcHok1hhcMVwuojHLSQz6F3xYUrrmEBzj2AFA72KvRe8YZzNTNAZAb80h3sSP5iX4xt7/WswKes0MGkYJraeca7e98ZhPzN0LXB2l+ym9GWLB6u63vq2kCfo5Ao4WutlUhkmusxJSlu+UR+mzFTbYF6pqm1iPqHvzgTk3WlSMCEmOkl5Pa0W/Xr9jd071xY3LD0ZxG60rrxU2MONRmIA7D8u7FzITGt8A148582bxq5rEQxp6Ueo/lfGY2cPlYJbq16eLL+TnLwNtK9lU9WiGT1tceVR/YatZmhrmP94pWlCA5bb/EhBq5rxUQQuyg22pzQicGltyEuUzPkB9Yo5y9JovTkE054j2kue+cDaE+9x4+TL7vSSt26LeMWQwaBe8SkYTU6aGdxfaYd4NiLuff9goebDTwOzmpBIOKM61+dRkkhcKYGXODR6MiWJZtm58JZGoa98ky5/+ab4ecdIhQBunVXIun05nOfvum2LU/Nsotstp9Uc4Fnr6EUWhJcWx2rR5qi/VccAZ6IKDkGznpc/GxPJS0pD6nlhsnwcJkd9zoN7mHOE7fqA1P3HXUKaCRsrfUwjKP4rB4CmyZTB9m/Q9UaQe57cZsjwrJ/9aUUrwi1MgusT2H3Swa46lo3fhUyrLy4YovNsmlxHfDxfG+1b3sBJ8ZJaNCoGUoCS20QwdG1OJxxCeXR/zgBKp+yXfzEfN6IOsQwEzq5usj9JOf+XR+xvcG5PgxA9++m98uNnhNq+vxTj5PL07ZZ8m5f77pUcabZnmDpkEaSx32Qg8DCeQSZdsIuiNc0pdNeMehZR/MroyA76pER1tXR262Sb8sEacUkFx5iJaXkDmPy2I4RJMC4n2QVSbW22ajaPy3kN14+wpnnilsmgWptIdjhBXdMkmBBKn5WKF3y8Gli6pKXqElopJF9KLzEpsoTpFCG/hPeDLpBwNzWzpoYsta3bLBtJKCTBlvu5HG1YBN34MxFNF+16r5bw/Nv7+g/cr70v7cxkwUgMsY/GOs7gbP7wbR6MU0PzaBJvM8W+jYwx16cZZEWnLd/48M9k0G51Rb9XNfqPyycnglZiCZNPXoucuV3X38n+mpZsPwHnAUPFe4jRBoS5glq8+fh6jn6izGGXRYaGxjs1lx8JPr22bxZw7k/gFu95Wez1ZcUwnz+XZRs4mbr54klS2t8lEJvhb0H0Vy/WlSOwGzIz3BWEyd+1ne6YDlZlgTU7Y61qQbD2eC8gG+SE/E5n+miGSRBw/O2NQgiuNFc4rhvaV+EwSwZH5tzkBM0azIQNoCvyTvcdQTz0wjpBfxt9qXhQipPkS9/QklpuEkzx0O2aTnRn2vHk1sLIvGQlEuNYp7WHLo5ciGTIqYr+dp/vMISK6HLDrFxkRUfXYSELvXIpOoWqPysX7/ULA/malAvUGD8Cis2mS6kNvjam87TaBYHXnFOwMOnHYrm2qaDbhQXNMXcTZYg4KlacGFu9HYEcmn5wVrxdSZ73fCwS85IYWFIKiEieSGJNrv+mi6f4wcmZfgyshFTZpvVTIGzNP1HWUZ3a3Lz9OaeOnZyt5g1Vz/QOGyj/Pmklx64H/BHpXxike+cWqRE0FwQxB5nldYrZrYUhl6aIBJ8EfmfcWFQDjAjqrJ8jStZ1UeslIFssiltkumLw7+vbVJlWEl5XxkS5wQYt1pg6hlwur7IKZly8aDd2+iJMnoVhFpwx338/QEPFmVWsIHioB3Hl6kv9Rbsbt5ODdV5pH4cmxCgYxQ3m/03QWq4fB1kRAp2gqu9B6eVuINS61fQZ5YHrCmW9Xviz8GkKpHaDxp4v/RwTzRa2ICSX3XTaLRplqqhQ537VBepoUlndMFUkYCRyPGN3nUQxxBGhO3tdkDfqjuEuzC4kCjm0ncxpC5I1PE3UeYTOtjLzyKWm0IVXPmS+38MJntU3/B+vQpGmkIQ2A+sxhStSvJZhOuKB3GvLT3NbY6BHMxhXmY8DVaORu0uLyKNoYCsdTQYtYm3DbjxAPYzl2Tz73TJnhuIABT5Hfx7MwBlZnzUi/1FdoZwwL/yU00DcJwiodCSOQz/KjLOVSzUyY7C+wsFlET771TxgB6G44SHjdQj+gT3JxRdRJZQG7ORQyacKQiFFQfkALPGH02DVQ8cHdf9KC4h527QnL5TlQqO2GMNtXGSp7WGcRcqPkuRJdVOLzA8gj1zw8/2p1tHayTUVL/ZBBaxajooE/jsJmNqqj5YUC7Gv7qTQT1baNkzKva6KxlKpVgiwIiBF1EQRlYnNaoI7C6uqIbx9yqtGOhwRlUDV9tyMUDbF8NgXgFd8Q82rxOxUBxi6iUwEgrzYs8iq31eKcs2XGfAzYG4yWh5ax4UBxeo6Su3eVogZNUpzLfLHZKmuDTjMlQSompXdmW8D4/n6iprvaYJq6agtQP7HpCowLdPDsyNMvvtnJZ8SlsjSvz7rakltHdRfdS/6C8tj28cD9Pj4PdjYhg6LQPgnBKnVwa4nHV289lQyKnMPzyXim9n4c3co9mf9clvpwjckOWjzHRf3pZ8TX0MHMMK3Q4joONRj/Wk+XxfDZQ7IjWpD9IEJUUt0M8RC/eD9VQjESJ7LrWo9GeJIAgSeXXuC+HPomwPqVLFa3GnOQ4jCialu2wlckw1FfZAQYbj0JoU2J+SxsX4eSQSexx+u0dhF3ZGD1fvznNpISR2+SNTVV7+ZdoWPrvvyuiGWIZVPWDycJWc+QnRr8xKYBLXdlpGQFQAynJe+jCslko8gdJ4Qiv/ilGSU8Op5rC6nU7WcrG4PvqoNMCBGvsAZv+x5beDoT+OM830Zgtpif3PQE9ReR9Yq8G+t8hjuFYbPQ2TrFEKrsdhBV3NHTD1+7oWKeWS/Yk/Njh/3i3dM7BhAEXPP2DH7boXZ7NX25fJAVXW8yic/V/pDW+od2XF/IvuGVHZ+2xuY2+Emt0nsUVXJIVKJxF7lMcglBQGJOKg6LKMt9Fdo4+uZcTiBnRSGDEY/LzbpPYgVJYU2fz2S7LFP5Dq9oXq7BGliptqhpgnf2lgNKrm6JHjeHOvIvJ9b5koCl/vJRwzTR5bp3HQ50dpU9BgLgsfR9B2nZP60fhEieFBPGheXhFFedW8tvzWHtbW0OmBnoBY2Yssb6j7bSHThSYmuWJhGnVCCmurJCa2jTAp1v6pLpGg+cH7fCt8yj/nPc2EczgEAFItjNa9g7301XBDra6paUWnenM34Yfqragq9nlx+iJYndVwTEGnDv9RkSbFvLrz7J9MmarfOfAOIfr+DBU3IzbAu6+WfTvSLaXv7+Jje5fho1ovCMephigTF41838Bl/wQNCzoFmUJ2OsaY1BlJ7OODBM05yJFtrGv1PP3YZHbpyHrYh21MCKARl7sGZZYfpGAmOFkpc84IZI5RlgGNJ3u47IhrXyBHuoqgy4LibShq/9rsVHzJzBCgLe6OX/RdZ9ZRMo6EoxOTyH+hIQh/P2z40/KgY9DnKJJWWC3FlMAdxMIXhcLF3akXT5siLqlHSi7U7PgRGlBFzvS4F5Zafp6CMj8WYl8fiJU8c1N9O+rKEjAjccRBguzjk3cM4v2KgrPpCZ6OWkRL3KTsb9p3LBO9N28FRlZ9B76viyEmPGpA2BCkQkUrGpG47EkGWnvJ5IHpoZ62WKhEZQBht1xLtuvKOEtMuDoB/ZP3C/mMxMg/5B3XNDN9uiFDFi1gxbXOPiR1SLreucocvowEL00Waww19xnMqh7HmceQOrOctxrarkCCapyNRDTm77u2KimCEiFPr500uTwBw6fuQ1eK8SWrHRLvs1UUZ1Zrd2EOulpRW9fhpDzGdbhsY6OIQ5oVyzLSQiprXQ2RYmVT3+GVKFC9hhoKO5sks9DFx2sEMxV8zGOc9WkrGmRKFype68JLKGPkx7QgV+LU/Ctt9iuzvtc18ZRGIh1OUm53BvS5mg3foaEsEy9w+S1gCjU8KHMyjFpJf1JpMjnDo8Xsbyn3FJ1nXyiThN55TkJLZjZo/tXGFEe7MkjNslkRLQYzIV1eiS9bH05LDCYSHX9vb73veR3qUKY0djRDPXflmQFT9w5RYNhc6zKgNRQVx65zbSlwxw8TLE3+wYe0UokevSogv2xTA7nDmujKwyehAWdW+j0YImUIwHkuzv8goJF3aQ+Pw4xxUXjF23TGfwGK6akOqdHE8GApAHI3wXZFA8qCMKgOn+IYKlsJcH+BkeeFzGYorKzQpdGJKRjlg+HguTvLVeGIz1UKiQse4EgLR2ENwaHzo0OtR1jTouRoUtKiIBEHnQ7qMavF6hoDEz0DP7JnqW+GRcuj7eiLPYrNlVuwuwftGIzu/9kwIcfrhZDAWPFzwALQ4MTZR9I9VhPHRumisNX1KM0w7Bgb2ukTOOaQojmBhKo+E+fc9/UfIXngXxY+XHmn99R/bb5qC61t+WPFmMJ6t0cO7JFRT5TEfIWQ5sl9SXM2rt0liOx9QQd4J3g6s0CtynO2c/O6tmpbjHZ/O4GuaepyJfeZPJ/rKJv5f+5UsUoQTKMX5S90a1vXq6AT3yeJW1E2Kmu5xwDiltma/1c6oRmD9VzpKUUQk0CpW9lUoCPWFOnK55Fpq/2YiTtDgxWw8pYMooi9rrMk/gVa9xqTZ+AZVWyEWQcJaJEEm7gAJ7HpPNSnDUzjE6kPcDVSoX11MGAcjKSF0QW0MOil3+DbnWY6wPMllT/Brl6A2hXjEnYn69kbWfYcIHjm29YyOeuUnUGp+MZkobZqyNXgIU7q0F4T5moRXqJzAeg7tdT3zAx/xk0x8SZkhJs8CI6rjoT13amRWqz4BS1sc3r8gmiQAHOWrAMbffPWqpgCIXxkQtLLqW0VvKm/1Yv3PBarWPwxSi3glcS+HHcsVAmk2+OCETHXiK/pDj2fz/DOr8FRmgOL+iPeFHD/dkJH/3xqWodEN3wv268XdHVh9Cb+DRPkwZTy4DTjI+4JCWLa3OCiNLcf8W5i5P3imYgCTrTENTFaocOy0tvrCvNhbw8bTy/ybccDlenqSrLtxTMkLp/EPRGKh9BQdJtmaCal0ndU/zqPeCFCQbKvNlbECHfF1IwAerdq/BzRNRaD3iqKu0rMWxfH+pa2tFhyMQcCN9Upy+HYQTlpNggddJXA3k+JwCuBKIVKzi8So847I5QT5nzKH2oghgvAA+BElBmjRLrxy5B5G2IeIrZu2RnfJ9QMdpAoFqiZpCzyifYhanF7bEYe9xfdlfI4uTORywuqTbLh+3eMLWrrdfx7ZRPQ1XH61BLNogma6ZkkMN0Ma+rKP9k3CDrpdqQNjJ4L+uQt7ys5dAZl0dzJ2HC7GDPQhlS108Uf42iD2yYPsUv6ggOCJU0STFCduYo0eGx2ur6BOt8sEzfPj0VFPqxDmRr/i1dsa9HyEPlI3oWQEG7d3dmTSYFm1n7isFl8j8xs1dkA48fQFzDtp49O2TYeAp25PfhP4EBC4I5GtQbJInY8Cc4rCToOXo/DYk46GJknA4xmxXaVJNJFxiwBFuBzhqUh5LZG7KJ1kK1d+GHdWryC/HxcMRBGJtkc/kVTVk/0YoK7kIruIKzLqgTw55hOch6ZS8jGw9T9kJmeYl/HLz0bD8MPmnM3OZPO+TvhXk3762E/BTLVPhDP7EHnaHUOLrRGdwlUXdWEp0sJudnwTsyR/Nq7Hu+Q9ROpuWoTeb98kVGXRuTpSAMooliautCYbXExc9z386cI4eoUYSX65L/xfzczkxtRo3UXF/OKW324NG11wiCXTqr4mviU48tNXEY3lHlzbpRrCtO8jbl102pJaScyvdTFHHBdb1Is3UWHSyjQThIzybY+TiTvcWh89dlTWgCe3XGNzP+kofIoF6BMjOGI/x4uk01Hah6ItN59HIMAMrSt1f4zKnLL7c0UaDC4L3h2tZra1q/NeYEGWlMPSqx+VR0pxFStLyYvXm08s3wZw1Vj+Rp/i/aXeESSvsf0NT86ruxwX6khxM7/VxqGQ3lRO/UDL2pQS4WTTtoBwNkjZ0LRxZhgvJQrqDTYQKJYSCLfjUcDoDdrFR/KJ5Dm+ua6kdlFEB187kGX2uEMTUSs2YevaGdBGZ5MCEfAAu1sT7n0B44KZaWX9CXA4nVg8tjJVn6Ksdam0S662SJr3NhYvMuh7r+ypYXThaPkQQ8tw1nDY3IUbd0qhIa5PQ/STt3p1VPZd+54YOeHNqQHGJe3JOnc7Nzwvk773ubDGY/hZSSEB1C1dPvIe0zF9EGjvI09ThYqVyHnA53jV+MrsPUhgSKKVyOIinbWUhIpMMEzXv2QjPP2gYPwGdX0oEuo7Bfk0qJceqM80jFcWE4HRrkI6i7wzP1PZTDL+oytETi3UWnV0nG9MRjAUpiQhRncmqS0Xx8V/EFhNftlIFcZFFUePIyvKkis5/5A4RYGhwTkXkkwum2/ZV4gxTTLBGuPOvA6e2X75pddxEVlim7sEw3z1cA0dI4h8XMHeM6lQvdxzl8KRMQfPJ6ltWR9KJUbZJcqdz71q/JWUEhW+LZoe0T6m72Z6SwH66IxH2taFub0MO1jbV2dYBiJalDHq5Ub7IerO9m86nejWp+jiHRMonzfabzJiFdImOl5q5Xy7wQUx07fAiBBLdGsjpXfQJp7ialFzNdc7CP2XXWyZuqQjoo8xEOpRU2tgpG2pmBjVHsdR0TJnbXfLQGJMUJ/bt60x+4pnUnv0Ntj1TZeiyWRhi5fZlAQtKzdER0C5eSqsSLwwbJeKsv+5S74gKWQVQfSf/Jy6gJvl2fA+Xx9p4bc3wucGXTo7er/893xazAJE+2Y1BeKUeC300SsewxEx3NTxaoBhoyPbnGZ3j/3Z3g5JbbglbNYGRuzQPXex/keb0ywfAc1Xcu35/i5Uz5pxKIIemr+DzHuJDGAOENuIUPCmJdyKlaopBALOzlY22elI6PFP3xbhgaG7vzqEokGmZiVpzA5cv8H6DptLMi74JX9zfEFnmDP914RhRyrLzq9hpC8YedHEfuk7UCKTo0egiPan0S3r3YFBat4A3DZ+6mw4lsdsGqiYhFLuMi+0LYQcq9bXQqYi/TsFMGibhKpdeZLYmU5QiGS5C5VIN0QSp0kn5/gajAJ4qYFJ6sQLCVUGvfRBRarES0TYqAMq6R5eqY+62F/bqzZoPHvfsDa3CVfdXUrisgrllF7pfsd/DU0u58bzqcGq0ydFhfYihGgvBiIfDrsHGdzE9RBFIjeCItwouMMFrQv5VM6ZH+3+2nm6z6tdBeKsNhtaJjSXin/HQJ29RZJMn9cjXJ7aO77I5QFS8FNxr9FcHWIaGHlt4ZBbmp4RDjrTW/z4ZFLx8JyKilStqMSl0nS1HRVWJiNHMXwx4UVHnZMH94GAuDhw9zezPXTCNEFxIHM1JRrLM1XyoilR7V0KRqpcIeh2h5NhjdkDNo9wnEArUSI2UyzlDyU7tVTddTy5NxnWe3xKnCsr5HdG25ksKU0oEAVxsZUSBKoSENSmK9+MuP/suqmII+VLh6dVLDm5+/yc0GM0q+8yfINaWFSmDzEgrfWdY71Lb1cmyTge1Pp//He2afuiRlxkHgu1jthJylpTxReBLAbB5VWKnvg2eY7ybmxQao/WOxmjjLhVoavJX/Qa+lIz+JRAUUnBjM2uPTr6TByfop+zOWJYbPJdXRD1Pxa75BFxCD8OH9bKbXOB7IpjVuLHxPwSNVAsGbmjvIOR47vVnViNYavqlO3IHqRRqRhf/IgVR/HJUMEm5Q92zFyaYopQ4jZMHPo+d2N7KtCSppWzUVFNNUvb/Ltk3UmPkxkt8dIJFr4bVrZULdC56/AbKICQCqKPhCW/FItVP+XNMQuMpmzCsfSw5+uVMUZEA515eRXxm7WEeSq6vC978rZp3IYTkfDEJGGXcx8oxx1bpU2Om4XbNjc++dP7nmSpWhlHYo2oOzPFeeOL4q0/xq/YPZSjE+H+G6LQFeh7U19eGfsYLV7BdR66FKSyPHEnkd+zNl3qpgflQ0wz7J4RcdU3Yp4945B/BeSwOi6e+I/X36iK6m5FR7H050D3wkDF4+vJWIVxXnl9Eopc8DLGrds2t242nrJBycuIJ0BpafUH2b6N2PGdbLw1XVFsRNcnFHIt2o7cug6zwnfR6QAJzAEhW+nwvVha6MsHyvePa2d6vIcuM8xVvZ+/W9tiCv76mcwge2aFLwNpHVzxfZr7vGVW7daY1KuHvx0LCxep+IZ6/y2zdpZ9sDU/GGmdXH7S5OqrAe8Wis4Mb1L2JliM7a5jJqz2U/sTb0yyxixhvURTmfxDMcGpSlM/ynSUqsVgBR3LQPUa5FAdnXt5HfBSuBqIJyN/MoBq2s9tWZbYG37WGLJ80Ls4VVn8UR+A8vsVm2l/k4YmvGtv/FYjbCG2c/q+egBSqHMQ0nWbBfibY9Q+UlAMXa3/ePIHNc0Y4IKvD4I6txoZtuqkkG/8po1AHd/ZVUrtW09FFTK8ZMLuwJIvSd6djTWc8Dgwdon5Ls4oa7svNMaMeXPEDTaMAkK4vsDDyqna331yA2hMXTu4ZToO4zXvGra+uUtupxf3YI4kGWol++dFxfxBoF3wqNG4DdVS56tXllNqYqyvIULZAapVAG0qRwPwnW+vlaBRj6DKXsvyXwl3nFIYb3C2pBx4r6YIuceIK7G8+ur5vXzBQiq0fnTE04COJCDCtLw9RAmuWad59uCtBAEYuQgxgw/uMzE5/4ZeoL7o9R+q91lJZuSfE64mEsA9e788X+w87ad9BZmmf+SXWyQUcDvXOh4AmFNDOqgDxB1cET1rWSLNAL0luWkIv4/cP72qZVTVrIHe+URQRlfM9qqkm06s/PriJfe7uGCQ/72JVk7VJEZEiKvzzH7Ce+ahWUsvIoAUS6iQPFt2SMa8pMdOc3Saiy27jCNP4BAUKi3/SXuWthr8P1DFlRP7OG3AoSVDqyHMVF4kNUHSlbZSsy+03GPCM6M2fymFjfMlGzcEz0um4J983wmVKsDMCm/DUiuJArnghmTkn0uu8fNz4kBVlP2E2Bu+iF/U5JluPR7hEhzvZN133aRhLhvmnrTqLTpicadzxylS9m3OnZ4SJMipTzJf4nbH+Dduj1Lp4xK00G/MobR0CRn9VltSwz/GWicpLgf1cAna4oOdJDtXyplQqYDdDhAqeK6PpNheOacbgOnP8AIwC0HUWi+VUP1NHkvk7Eukf5UtwaAdeXXoBWr51U+SuPXsHaXk79E7va+jlmu+H5zHtC5moDPxNoG1anAZGDSVVoydbEIvFpBp10aRu7HYsM5gcTQrx7yKk/Qg5IVfh1qyz4RO2yIGaN5+hL1lNJerhJ9TPNilGAQU0X3hctYEzq1iyllP+8FCmtRhGjBx/ZVvWKv47KqUBPcXCZESGNmcyTpkZPwIgkMeEveF7oaPQOmVw9QNmmfa3tSKlgrUBDPpUCMCVaP8jdeCFaXXbI7vEbIRvasfUN3EcTlWy9swxxGL3nof5/F83mcx/r99s9IEwTAyn3F1gIcZrxqRbF81TSCSPOVOi4ON1ygTnpmeEYeCZzjfrRCyYcMUAuWxZWqPqSQmYDbwWcSHS1i3vP4sztc25/yiB00geJkTrz9RocMnHC4XVca7Ivd1vYoUi0pKfwkW9EHfhZXorTohXBxOR+R28wVtC/bwCeLkmcA3GniiEtR/YYiJhU7Dd318BSuo+uwEHgwvr18tr7G9IYpn4eDJl8mBzZnBmsO3IGSUf2TXnDOZ51gjOn/q6fKkSt+fm96MVHh9fdCBQyh8n6uS+taWvZl2phulGIH73MVjhUz19ac7FYdwdJT2Ny1AAR3oU5SN2VrzJyvn8vsQdTlzDqA+BEC71LJRBM8cCoGrhcYNGmm7aMFS3aMRvX+L1YhsjD8Aa1mjRsPS9U9oz/xkpmjCK/y6A1Ap6SpWbeZgNPsqlmpmJ733wTsI2ZGCfxEbr1Mq/oEdOmhST/hLWBoSlVE+nhrYHLWK2XC1Cxgwnml1zoq0zE4wVOftbz9yGEYd4oXqsrfqC581NItfn5SsFrT62td9K2KKljPoBiQreHX0y36uMHuMv7u8VOniAN1piKQ6I6Xph1PqjL/zhM+ZmA0/G56fGdjKVJCnIh/MjXy7+6lOadJxp4Kpla6tTEMVze7Juw2MFxLpNMWJMJWpYh+jBWUIJx2DSeJEh0cMkbcQoDO7RwSmx420H8NCJlTHnw6eHRGYjH5DLZ2RO+RrPZ1c5w0b3m3zWtCIMpGG/4B3UExAZefUG7KUa8qYmN/hCEcvd7wu0N3WY0mVXb6nUXQb/K+k9eKHQRGf0JtvUz+/h4uEZEBrc1GxLjzh6bIapZFi1UnIdbvwxlDHKbKg3peUpOSZjcuaYZPypoP8i/u2rXXkTK9uWpwqfFPZMp4Nmwd8kOMZ17y1Fo7APqVEmOJ4c1Rmcpaxr7uBu8kPXuZNVC8cF7N4x1eafVMTNlv54kO8vI6v+74tou51n3mGSYXPoftYs779uSfX/cJqDTZROm1aEWD4Wb1cVBkxa7H5LlygtasGWKjJGoVXrlTtb3O9DbDDQknW2AVMIh+YuolXMpyqJ+xuRNUdWgiU4DsymtwWNhR1Upzc/VCopsCoptIWHXq+avIy4xuOdvrMaskutEBG+e2eXMmSSZu9fpb9COddE7W+s6m8woFphcTOBjblPgpYJ5rpP2pW6WVMkZBExWiZbmdqridzs3vANmlqLePPdjFro2oPidB85lkZq+Q/sAHYPdVk3Bs6n1GLZ3FAJb7g/K4Oa/V8XE9pMTpk/IVarKgObRdYflyOyM/ykGBadnn52Pot15jJRHRoVbHOdIh+gZqBW7d+apMqBSeywDikik1dPRhHjNtOomoLwqHc4wkQ6QCyBbJHu/F/qw4kD54vxIFA3SrYfLfBhLEk37EL73A5cyOdt8CCgYxnQ/xAIv/GaDrr3klhS3UX4P4lZ9SVxcFYmUTjQihuALKsyas+JI9duok4SFX6OzLJsmGl6A1N3zN4hAley8qYMHaBdzKoPYxQOHb54sgdk8sjSG7snP8kCUNml61OuQ6fBTNaN99d1S4gJkEWiXAhMlSECmZuy32FUlkFcp48Be7P+jYm4dRcpSnXtolPD85doQ6M/kx0bsDE0E7dY2KvhVf6C3cb1yheiLxsxHmQWWwRMtOLp6CYKc9kK3zq9sXr0mzHLqJpEs4hlJjqqkKI0s06t+Hi5w+Tm2f9om4l2t4iDHcWr/mqTYV79TBgtg11AAiIhTv0dgkhp7HvLiIz3u706A8/qv8MWsW0Apr5J2pm+UopAsRnFkWm+GVQdQHzvurna0QnsflH/Uz6uLVWafoMHFE0OmACb9A+oY+Z1glAaGdtvL1CS3T/lhfvOIcota0O/0fPvLUXmSLUGs+3Ykx2oQYQ7PJareAEyXNQF3VmWWMiu6wTSAjsmrTv5lSt4KJZZlYTjiU5fQk0zhjXPuvCFzRP8H0L2oBFXt2BEaW5L15En2Mafhlhv1OhKaC2DFMrh3b/1U1YP/tnYKQXma5Yep9FCpIOjwzk198zZMS+dHOILtp4EZ4zI2/G3zU1PxdlxeM9Z/KLOE9HFQhT1RD8iW7uvrIEQK9r1Xfsho/RScI4plJZvOHHCuw8tPt82Of5bMO7CEdlG/N5P3Dr9N8TpBkDytBNpH756eH0tAZknXn/o4An7syPBMHNx2uDJHpEjyaVuG1IHvcbFGOKAvS3rUwiRki0VReMZ8HrTYPCzrEoGz9iPjtORu6nmERPxLffJ/Qn0iMx2CeoewVvgD/diKWgtZQWXjAODjehUiXLfhzagg9VJ5VsK42+5VbEv0q3wEInfVwmiweeQzZSQL+jYFCIZu0RRRzHPIqGPtIb884XrsEKmubh4Qs/WsjhCl3dP4Fw96SMSEVAjpm2u++iargofmK5Pvi5ucYeXzp7ZtqAZUn0Ty+fk2chpoilhGm1dJbG+uSXUVII4QC+HotB4TZXwJK5iVIgWFA9QXDWSD2+H7Fwb95agK2uemo0KqhEzJYVv8gbDlH/w1DBbFugfhwn/gdg2vARwQQCT01Oq8OZZGxm+Yhb0qIAW3QbzQED58OEVMyq46dICQqVo/z3b+Sg+43hGTfpHYBaXv7aM5ufozz0/cwXA3u4gEewmP3thYSjiW+hC/eGPbkGRtGQVHrtMI7gdmyBGbwQZimsvGdzUJnzGm595InCixb1koFtTx8CyvvWGacmu20TaECmuvkaSEtOS+pLWCF8vJNyZOS8eyH06KHek8sQ4WAmkLcBLPZMEmxry9aeFdRiX2J4ilF+8LQPhOu79Kb4AiMOGeCQ0Gd7hc8DwMWM8JCnfmpK6n4BRNrN3mHP/Z4eImIl+PxAQ+RnXXDMxLbRmSp5Wpu1IDABPCZxf1Z+LxP8pdCk0A2Y3yVmV25ir01pqca5uDVZbQ7J4wR1WK8z4RaOyX9PpgBCfteOJ91e/S+ush1mlWW/OW6hHPAWeX8zW8Ly3u3wmmnlh90LOeC50+eCCOSRc199OsVnZLCtHUjX8ar5geD7XqbLUuMXc8sFebOF9txYLOC+U1S0RQ2wmIu+I/EMsFR8gc6/mAsU04wIM4tX+3P45JEdMbobzsGW+iV6VMzIZMFt8g179Tpi+IOxG6hI0JWjT8To24A99B0vnw5g5+j3Q2ZluMqj33UwXN6qNemslAej8JQ2gia23qqhg+H7n5Otf72p+JarfvOXikZ1rq7A4K9IE0MpSNVa8Zii6LV/Uk8eGc7XAKDrcMEXS8Hnf9og2E5jk9G+CVm7OhskDAcx8MTjKvl6LyA0c5uUSND6MRRS8Ouvg1K6lfen/eAbUeCfmNrMmKcshTDoP+VZu5psuJQ4vxNq2dgJqmJVGTp428v5TXbVQpl6LBrq8omxyrh7DdqvY3dKR5lLJv4sjeSQBAC+NC3UFCVsPdRpe8HOBHj3UhaZetlrwXSJ880iemNk4ZUYB5Oy79/yyPDYUuZnNnf6kAKEwm1oRFWg7VNGZm2Sqx6Wi/zOMluntZkOlue4m29Xwqh3cwQQLBprLL8V3OLjNiUQpZFql6iLOCbD8lr5La1PU/FtNIwrVGiBDNpvlaUzIuRxlXnF4BSTmCQEj4o2zTpU9dRrypTwrlHNTqEHLSDjtGZviGZIOWdjKZFQ2S0jQr0yF71+06rbJOU0bWkWoToAx0ljKGMsus5F4Elw9EtNtY5vOW3vMArje/uiZL4hnAXOrZlulTpSbkCuJLgEWQEttsSbSKE5lhvf+Vhs6L/qQgLsLZM5R1kVZq7ZdQjbHpPAV4UuzgdTLmxyOvqoTyCxRo5C6Uelm4qYrxjvmKXrjafxGrf7ElSKzPArbn3b6/JakwOup0OxPufLFn86Bq890PNRoLYonVT5Hdgtc31LVbB4mjNCq4/1jDLOHoJctyykcyGv+0KsndSgZdUmyqUzDBLl+6gC0QN7Q24sMOJy9IOCWh7b/Vk081aasWUKTQiSjc7iQ0DM2Hwzr9EJsEXP/al5YOHHn0HbPTiOIpXwNz2T+M2WFvG4PJFL/XZ3wH2KuK8kMsFtoK1qbJAhTYnbbnYYDVTtiwwT9DvWXn/0KOr+xi6p8+ULXxiBVXlzLjN/ydpthjdMRjqwmYvuzQaJMk5MrjckBBzotw2Ja/NsTbiy/BN7mTdN4sH3ijmG6xcgqDsMt6MIZcT2kSCXVyqQfbREJbqcK5xuBzbL7C1jQE1D6JnIXhktK2uj9ZItMP1aFTwbKkrVvxhqRJyMTp8t2OmCL4KNf4GO3j1XWYwDwG4ZsoL02jM8e6EPQiVwSE+JJQqrChvKS6FlEsb/PQZ4Jqg9a7Ng3QPty6cTYenotDex+2zpmN7H9T8Rbs3y1t2YNUxjel+9R3EUeRN20nWxlu2BX98/IhhHHYkx+1BE9EgqbGaveopJR4FAGDZ+Zcl/P/9kAAQAaAEAAATAAQAAPAQMwAgAAAAAA7gFlQAACAAkCAQEKAgADABlUaGlzIGlzIG9mIEZpbmdlciAoMyk= + +# +RightRingFingerBioValue=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 + +# +RightIndexFingerBioValue=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 + +# +LeftLittleFingerBioValue=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 + +# +LeftIndexFingerBioValue=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 +# +LeftMiddleFingerBioValue=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 + +# +LeftRingFingerBioValue=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 + +#BioValueUsedInYamls +BioValue=PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8QklSIHhtbG5zPSJodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLWllYy8xOTc4NS8tMy9lZC0yLyI-CiAgICA8QklSSW5mbz4KICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk-CiAgICA8L0JJUkluZm8-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MFo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IFJpbmdGaW5nZXI8L1N1YnR5cGU-CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U-CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0-CiAgICAgICAgICAgICAgICA8U2NvcmU-NjQ8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk-CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI-UmtsU0FEQXlNQUFBQVdEYkFBRUJBUUFCWU1zSDVnd2NEQjRQQVZrQUFBQUFBQUV4QUVBQUR3SUFRQUlBUUFJSkFBRUI5QUgwQWZRQjlBZ0ZIUUQ4QWM0QUFXQmFBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQnpnQUFBUHdBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFEOEFBQUJ6Z0FBQUFBQUFBQUFBQUFBL0FBQUFjNEFBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUZmWWdBQi81UGZHeEFPelpINllyNnU5bisrbEtwZ3ZleUxHR3piZjlocHNZSGlHTlNCK3htTWVqV09yS2d3S2dXTDJTbXc2ejZ3SU5oZGdJQ0E4b2pleEZBQ1dON0tOLzBhM2tNS3Fnd3VLNENBOFFBMVBJQldRZkE1bTN3RmxrNzZTaTg4L0FlQUwxWmFNSnlhRmt3Q05wY0xCOVJxbnBNZGw3Qld3ZGJMdXZHdGpRcS9nTWRVQURnZ3FnSWNIZEwrSGxqeXpId1hzcVZ0MzM0ZW84eENxQ2E2SG9qb29ZdnZQeDdOZXIxNnA1azFCMnN6VmovblJoNXZkeTFIU3A0Mi9BSFZKZ0M5M1huWW1yS1cwY3NZVE9sRzBVWm4wMnVZWC9vSThTeWNRSzczNVhTaTJ5ZnhuTHJNNEV0NExGNHZtOUZuZFFad2szSkxCSmdnOStyTHN3WUNxdWNBaWNrcFArcFEyUWMxWmFZRlhoNnU4ZlZLUUFncVdoT0FYc1lBNE9Yd3dyOFM0bUpHdFZ1azBXTEZUSXJ3VGlGOUJXWjlPRkp0MlB3cXZqTGZtUENRUG0xYkRZenVlNThtU0VmdWk1bU9GYXVZQmNuMnkyQ3Nac3UxdkUvdVdRMmpVa05RUmpGZHRyOExwV3RVSDlhaWpISkVtQnZxMXdReGVIcDZoSEhqaHBUaGNhcXEzU0RicVF0MUZUVzQvZUx6U1ZGQ09qRnpBclFpYTA0VlcwR0lORVBlS3BBOFJpZEZKNStnTjh4MUhpU2VYYkRqdWlJV3BPYjZuWXlYbi9IM2Q4eHBvdzhaM2pkMEVpaFQ5dlZJbWRlbXRSYlF1b2RhdkxLTG10UnladDZTYlNwWVBBQ3pSL2RLQ2t0QTBIWSthL0wrWWIvOFV4WTV2UXlvZ1QycFlwY1B2OVpqQ1pOdFNiS0F1bW1EeG5zeUUyS0d2RHVBT00wVVRObCsvdXJPMFlCdE5teG9QMWsxbERpRlBmMS9yVkIwbjdnU2hncHhnSndtQ0o0VE5sMFI4c0s5VXEwRlFtWjBLTExCdkJremZuUWVUSnhIaFFrVUdLMjBZbkMxdjZRRWpjajVUSEdMcnZjd1Q5Qlh3STZ2Nllsc29KN1lxSUxZVGR6VDhja1I4TXNtNGkzZkhINE04dmNOWWRCOTJVVmI0NHVDb2RoREIyVTYxcmpZNll3SzlaczBhcksydG1XeVVvL0FCN2tsMWpTZFZobHpEcGxGdUc4dThNQnFQb0xXdU9Cd1d5T0o4WVFOWmZya1FEaGF5c1k0YTEycjVSTmgyakF3VWJ4UU16bEhYU3kwcm05cHdHMG9OeCtJaEdQRkRHZEJLeVU1YkpJZENWeCtNYnZicWRicGlQb2hKTHRDeVBjNHpSNDJZTlVYN29qQWN3VjVUcDJ5eWlyYldoQWJDV2FjeGJBYzl3bTQ1ZEI4d0ZNK3hmakFEa25kTk91SXh3eHRnM1llTzl0ZmtTWWlQLzE1UVJXRkU1NnB1cVBST1FvZ1dpcUcvcHRMOHc4YWpGb3BzOVAzTXp3L2ZlWlJ5WllLdytWZ3RiNTBVdkVEOFl6S055Zk80ZnhLbVZWd2I2L3pzUDZCOE5ia2tobEVCd09qNUpORkRYdklWakVZNFZhUXk4YjNqc3FtcDRGSFpCamlWZUlNTmNOd0RIUUQrR0RzZi9aSXhKeC9mSHB1OTFpdkFFT1h2UTVaQUhPYmM0MXFpZ0RudUpLOGNOQjVFQ3luT2pqRnBXdDFNQjhpM0FsdFFHZHpQQnViUmViNDhNVkZGNzgvY0ZlcDR6K2FYQlhaV0xDOXo0cW1kcFNnTXFJYjQwRmNtd3k3VDFuNHJEaHc4Y29OeDU0THNNRmhuQlA4aHQvS2Yvem8yTTVpRFI2TGlJRTBTeGo1bnVlYmRkUkplbWxRbE1DbGFGbDlvN3VyZWdRZTBzMC9ieGNzaitjUFFyNWQzRnoxQ0JtNk1GVmhoejV4V1NXV2UvOVNUVFpPNkx1NVZZWi9LVTA3Q05NRTErcWxaejN1YldQRWpjWWxTL0VXdkFLOGJGYmZuQ3VVYjdhbjZPZjF0OVVKYWlRSkVBbWV6aVREVUozRnE1YXZ1TVBTZm1SKy8ycWw4QkZZRTBlek5ObmZlTEpmTytySHFkT3lqeEIvUXE5V01WQVd0T1VjRm5HYkNHdDRsWlJJRHEvZmZ1WHVWdk0xcTVKL3hPdWt2YUxuaHdkOXhBMVcrL2x4MnNFL1JnTnVzV01tMjVPdmlON0o5Tm1MTDR1UzNiem91VU9XNDVwaUx0cGxidDJIS3JKTTF0ekh5eWR6ODJ2TVRvZ01qYW1KMDBSY3RabFV6RDJ0SmRJM1hEOEdueWdIMUNTaWhSdHVvUWNOSWVrenlma2htd0Nnc1dudjRjbEZ4NzMzbVBZUVZBMEtXRFlyeHE4aHg4ZkRNZ0lvQk15V0xmU3VuOFE5T3ZBdE13NmdDS0N3RGVuRzhUZUZVK3R3MGZPNGR2dSs1TG5MU2lvYk5lbTZ1bTdhYzNLaE4rMUpONVVXV2dxNFdQOHFBYnYzQVpjMFJOSFRYcWoxYWhWekZNbG1YWEVkU3daUEFQWFRFOFVNNTlDVFVOdE91VkJyY0RSZEEvYmpRc0hJM2VOczVKSzRHVHF2a1Vud0p2b1YxSGVYcFlHdjFaSkNsaUNCWVVJOXFydGcvU2NCVlhZVDZXY1h0STRWdVYzR3g0Um9aR0JrMk91SVg2azQrcDh0UVc5L29aV2JzSUJQelA0cWo4SHhCeENUWGJocFRzb25BbjEwK0VsTlAweDhLOG9TbEcvd0dyVjFIdVRzYW0xZnRqSjZoWWwyWnhvckxmQ1d5OU13SEZ1eDNSTjI5YjBCTTYvVEwrUUUxSWpmbjdGTUlGaGQ1Q21JckJHeFZlTFFCNDllUDRnMWYvQXQxelRpRlh4MXJlVVVFVk1UcTE2VkFlMlkxWEF1NEpBZHhUUjZWc0FYZEU2Z29SYlI5N3Z6SllIbm5oQlFoQWtHYm54UlhWaWxFN1J6bStwOWoxNlRQUW1aU2F5Z0xJc0FXdy85R0kvanp2TWhzV2F0QWxvZjhjY1JOUzdteHZwcVJYMS80UkJoM1BnTXlMTVpOVXlHdFh0SkJmVnFpMElJa25uUUt6KzZyN1ZNNDg1b0QrWWNkU2pzcUlvM0x0cjYwRkF4Uzdxa1c3MGpuajcxYjIvYTNibTA3cE9BeTk0QWdldzU3c1B0SnpQT2h3QVZMdW0xTkdrdkQwenkxN3lTL0ZZSXdlVkM2VU5HM2cvYlVyVDZMVUhZL3ZpaXNPRTB3clZYTnJCNC9yQVFxakRYYVZOZENMSFY5MlVQaE4wOEZxR2dYSUFtODltNmM3Y0EwdHdmaHVxR2xDamoxQU8vWWRkRTdYNEpCaHlKRHh0bnNQY1FwVnl5RkJuZGUvOWl6ZkwwWUpnNzFoK0dlcC9ScTBZVDZjWUhjZ3QzWjRzc3NiMUtzL1pMbVZjbnkxQm5QSDNjU2JQL0tUMUIyT1Z0SGkxZG91RkJBUDhJTlBuQ21jY3pIdWVoNldmcHNHSDdYNUlWUWVKdm9lemMwL2lzbEdGZ2loRFpTQ2gyS0diNkR6M1g4R0pIcE1oWWd6K1pkT2JvK25zZERVMnhZdm5qRjhhV0Nzbnhxc2diZG81WDV6Tzc4VjNDVDhjSGI4Y2pxYzgzdUg5TTRuL3dZZmd1UXBjaEQ4c1RDeFJ5MG12bGxEMXZGUFNrWVJaelJnSS9NTGthM2x2QitOczJ0QzZ4NXA3SEorWUlDbmlBNm10YWRpY08rVzBWcldRTE56ZmtCanhIV2MxUGpyeSs1d3dQc001OExCeEdxaFNiWmdybXRtS2c1VlpUNVhxNStMSzNQNjhDYms0Sk84RFBPQUZ3aTFWbEhYdnNMMkUycUNEd3VOYTRzMDZvTzdvSVlOd0ltL1dLN2c5SWxEcmtvMkVJMnFwbUpQQ2ZNRFNXTVI0c1poVjdrUkdVblA4N2NMWXQzdlFjaXZDYy9yRFR1a3BoMVhYcVlMcDZKTUdoamxSaGxjUlMwblNHSzlGSFduaklzeDZyZ0RRa2N3NjB4dzc1QkJOSTBRSU9OUnE3THdpRkM1QzVTWHN4NGltYmNPdFFWL2lBRHlMSkxOUnF3UG0vbHJxb0NMMFVvVnNyK01MUjl6cmJyV3FmVm1NbDZvMEpyVElqaDl0TGh3ZkREQWlpVEdzUUpVZVM1TCtIZERHN1I2MlRBWHJCUVVRbXNlbVEvZGJPMXNpOTJNU1V6eEV4bm5UaStjQkpEVGlwWURvUENkeGlqaHFEOGZ2R0lJS3kvTmJ5YjdnNndBUm9WS0xJNlJ5MzJFamxjdENKZDVNejU5RDRBa2hDa1RRS2tuSjQxdTBFMUE4WUxvTVlGU1NGWldJOFUxUjlRSG5waFFhdUNQS0w2MnduK01uRlZjK1RucDNGcWVGU0Y0WkJuSWlpaXp2NTlsbTBhcytGb0dnOFZ4anY5bTNkLzNzempmaVREUWcyNHlteWc2clFjNDhSeGZZUUFURjBZV2EwTUF4dmlkMndMZTlpT1lqUjdISysyeEhvemNaRU5PUmFXMlV0VjRGZVgwc3JPaWF0Y0NpSGROd0plY1BYL3MvaTFLNlJqdCtxZmtvUnhtYURvZWdmTnhlUmZXVmEvQUNIOG52bVNEY1lUN1hKL2xMWXBkTEtNbWVJYkhvWkdacE0wZE1FT2FCam9IdVdFeWxSMjUzS0kxeDNRSXJEZEhnK0VNMHphTUNLbFgybDVZbEp6SGlpejh1bzJWQTJpS0ZsYSsrZjI1dHVidWxOVVpzaWY3R2JvZXdVMkpZUk9yWUExTHVXOE4xSjlaVk5QNnpKTDZpeVBONG14dHl2ZC80WjBWOTcya2lQdFE4NHErWHNSMk9LUFBlK0MxVzliU0RsdklmSEw1YW1lbFUvTkZjOUlEQ2Nyc0NQZDlrRFdVL1ZyYVJSTDQ0eEM3aDNIaUlWTllwMVhkejBDRnIwUW9LWFFidmhuckV1cHBXb3NHOUhFdjVTbDZkemRjNklrUXFKTGtmMjVDNGNZV0N0VDgzbnJOc1JoZDIwWXNBS2N1TTE2U0E3bVo0UTRyZ3lIeXRIRlNES3VUbnpUNG9ucGFqR0JpR1JER0QvZEd3bG5HNDY4WjBURUxCcEd2VERXbWlrOW4xTGtVaSsyOU5yTFVVUmJZNHNoNERZbGIvd1dveGhTRFNXdXQwZ0ljajZyb1Z3TTl2UjVEZGNnV0xqNjhxZE9uZWhoNmJaOGFpdFlkYUR0NGRWRG1oc2JNWEQyNkhGSnVIL1ZDSENyMHZEZHBrbDhmR1JVYzJ5ZC9QcHl5QkVnRDRpZnIwd0FLL09odFJpR1I0aGFQZVROa0p1ZXNUeU1CWFlROVJLMlIzWlB0WU9aemxOMUVFQ0FtYnRDMlIveUY3MkUvcFVSVXdKUkJITEpFcEZnaUFrNGI4YnFjbWhZRnpSTVI0R091VE1xUHg3eE82RHNYM3cyY0t0WUlBd1huSmFrSVZCWmdudHlhcTFjYUlwWTRQVzVRZEpIcG42WjRXdnRrTDhmdkxhVUltbDdPQXVEKzJERnVHTCtWalh0L0pBaHJTTVNzMXN2eG5PWkU2ZWdSVkdlQTcyTFNtOVZkL1NNNElWQlIzbUJyRDE0c0cwTTd6SjBaWjY4elpySE1qL2NwMkRNTllUT0FHL1c2NldJay9rQkdkaDE3S29SL1hBNlEwMDRPbFREcEhNNUs4OTB5ZGVscm5BbkU0U00yQ1IrT1lJdkZrL3U1WFQzTkc3UGw1aklQeVR2ZDYrZ0NJYk12WmhjSVdHZTJhQlZSMjdSR0RVQkRXQWR1YnUrRUpmcElqeEs2d2FCZjk1NHhadTAyWENTZk9oQWJSU1hVZXZMc3dpMjlHQVh0d0x5NFhHZURjYW9nVzFCd2dpMENhTHlibWJFMGdLSGZyRTNTVUhFQVI3MnpKYXFqTTdnWEg3VFdQZ3V5QWRHUWEzbm5sYThEOFJtaXEvcHZMOHZ4Nmw3eG84TjJQbUQyZkVOZDlkTGJCS0hHYkZtd2JFaGlPc1p6YS9PWi9OMFFTWklqOU8wL0luR2twQjJYMWlDYzk2bHNoYnJwRlY3UG9Kc1RjME54aEhvaUxzYXFwMXNSdUp4SUpxek1rVmlQWjBCaG16OEx3K1ZNaWhaZDBsd0t1QUFDUVFNQ2ZxeXlyNWFMVUk2WjRZak9McWNiaktwL1RwaDZ6K1c1S2RjWXhSdU5RR3UrTzR6N0Q2d2dyc3ppakpUS2t4a3N2Ymk0aktwOWpnTzh2SVdRNWdDVVpOaXo0UW92RUxZN0dyQkh5dW5hbFBhNklPWXFRaXpWMzV5M1IvNDVJRHlUZ2RueG1BYnd2OUNFZjBKbGZXVHdDandDUEEwSVM0a2JtTDgzbnJ6S0c5L0MrSTJOQkR2MjF0NGovUXc1VE01ZWhNcHA5bTFkYUNyWlMzS05wMVNObVk1Sjc2bk5ZdUVHREpEblZSOW4xY095TWtCVTNiM0RqdGtEbGtsTEVtY1lKbnpoczZzaGJWK1A3YlF3TXdVcllDdkVHdDBIbXFsY2syMDVEd2lTektCT1NwMDRwQkY2MFRXK2szOXcrRnJvbTk4U2FTMEppaHpwM2ZIMDYvTC9TSXJ3NWRMOGhvNTcxZVNkS1d4emRLRzJPemx0TXczTDFJR0RPbGFueW9pUnVmWEpwc1hncVBhRmZyWEZ1VmJFYVNlVVg3UUNNb2xOTUpTd082OFV3MHVhMkZyZEIvWFpWZ3g2UjRITEtIZTE1UnNzdUd5ekEzQjlhOUVleGJNdWFydzJiRE04Sk1ETUtjMnVmaFducys5dDlnYXdQOURHc3MrbjFCVnRYMGtKbWZneDgzWjgybGUrS2dwUXppU24zaU9YamtTSVZDdmlFTnpQZXpMWDZoZk5DbUtVaU1wUzltMG45ZExRanpDT2pOTWRZeXBDOGMreWRTVndTRThpYVBTNGpJeWRJL1ZBbGUwOTV0Vm5DTHZIVmwrN1JFanFxM1Jvb1dIKzFHRm5hazcrcDNIL0d6VlF0UEU1aFBoNk5Vb2I5WHNxdnA3LzZXNW9PMzBNY241UDVLUy9qbENiNTllQTlCSnRqcnZwaU01VWJQSVk4cEFxclE3YTNQSjY2WDRTUUVBYTYyREhYS2xBQXRSczIwRG9FejF0QlF3NVI3aVYyWjYvMlNwSU45SEQzSWZIaEhZK1hMNG1DOEdsQXByKyt4VXFkcTdRUFhBR2pJWmJKdFR4a0M5MmUrUHByTm8vbE9VSysrSUNSVS9IT3lOMnEyOUZ3OVMrUnlFM3FCa3lhR21pV2U0cjZpOHl3WktwaGdwQ1duU1AzL1h0TVR4SUtXRVFJRGNyS0xYeEUvTExmUWs5TElQTXJSZzYzNlVBcHdSK1RIZTlKSkhZZUg0QWpXQ252QWNtZHRmWnQ5TXJsNFFxRVd3TjcrZXdqeE9SZXlFcjllRjhscEtaaWQ5NmZvZ3kwaWZybHlxTmtscndCUFFzbk13RnpEbldEVHd5TWlFVHovR3lzN0NxZ3gyWldFUVhFNkdubFdHMUcrL09sVzlZeVdUbFE4QkI1eHdUdXRURHljaVlrWmxIcjdvL1FyVHpZMWg0YkY2UVNydGFqTHNDallTSHhhTDJ4T0hXY25lamJpSmRBc1orY0c0MlBNbjBybzFWZVh3NXNEYWoxOHpMS0ZYUW1ZM0tSVGxtK2xYbyt6cDRCUEJYN3pVYjZ6LzNTUDZVVlV0dExSVkR1dkNaN0MyQkZTc2V1YktuK0Nia2lUU0xUMFZray9IOVBiYXRya1JnS3pncjdjT3J4TVU2eDgxb2dsRGoyZS9wWjE4NkdlZEQzeUhiZkcxaUdtdWpqcFFvTEZXOURxWGs4eld6aFFObFBLZDBhdDN6OHh3eFBKTVNkU0VWTHl0WkdodURsbzZKdW56U21CQW5mWjNzTjN6REhjQmZiOFlyS2x4S2xNL3cveHhjRmhaa1FCaXNSSG9KRDZxN2Y4ZGtNOGJKcjAwME93MngxbTIvWUdKUDBtWTN2S3JlQitLblcveS8zTDc5WTA0UW9ybVh1NDdtSURsM1ZRUFVpNVI5NGFNZEQzK2wvSEFYQk1hT2V5QWlvNkpHTG95R1dGdDRSOEZHL0krblFwUHh2NnlWQXdzWThFWlhHYVV1S3EzTy9iUG5nSHh1TkQyNkpOTkVEN3R0UmQyNktSTVNpUkxEZlV4WHJ6bHY5YzhJMHdHV3RUTEhwbGRXMXMzWjdHdldTcGpzbUV0RjZFZGN1Y2ZLdEJZUTd4NHNlMWhPSm1vWUY0eEVyK3k4aEFSWmVIQnVNdTJmUTRaNTZTMHEzbHg4MzE3UGxDVlcxUUkzSXFDZVMzQUFpVTFDaEJ0WXZpbldoQy94S3BwZXp6eG5YRTlBWkd5eWhoZHpsVFBrcWZWbWw4RVBVUitPMVc0cEZmOUVWeDBjNmhxSEVGZ0FCN29JYldSTWpKWndxYllJRGY2TG8rVy84aEVpOUQzU1dJVmx2SXdCTWdMOEI3TlI3ZG8rY2o3V05HeWRzL0lEdjEvalZJUTVVYzAwcVJLaUpZaEpjYVU1UFd1VGhWbVJFWmhYa0I3cDU1cUNOUXNycTZ3QmNPemFlcHNkWVhFODRsL3NqZnJiOUp2dGU4QnVDaW1NOWR2LzJyOUp0eVkrRWI0Mm4yVk1ncTlKOTVCTkVZWVcxYnNtTjdLNDZjSkp3MUcwNXFXOHBhSVN2NTBkZW51Ky95NVdCZitDbjA2ZmtTaXhwdng3b2J3KzVZTjVVNzYydGNGV2x2Z1BsUGdXNVhTMUlsaWFNZU1OaVVZUkJ5YllURGxDOUNvZS85RjYyUkE3aVB2akxEQ0ZiNEVBUGhUbitVSW5HRnkybzhwbzkxUkFTK1hEa0U1QlkvSFhyWFBaRmgwcHVYMTd2NHRjNldOc090VEhSRmp1MllyZGE1SFo1c0ozNTh3cjlVL2M5eHdkMHhnSlFlS3hnSnNuOHlSRlkweUNja0lnREhxV2JWSWtVU2g5TWFlQWhlYmN1Zkc2YlRudGFNekFGOWlqMmhTeWFpU3pGQk1GMFRMT1ZXMGdYVjJIWmM0WElxemJOWVErRHVmSjRQWTR5d3RGRkJUOVV2NThVK0M3aDR5TGYxTTVFWCtPT1h5cjRhTEs5WUM5aTU4aCtCM3d3ekY2U2FRdGxPalBaK2s1WHVxV3hvcm1PK3hMRzlWbXNySHRIdlczV2lpS3RDeWJGQlNKUFJDWWlkM1BaNjJydENkeE5qNUZTem5WSG85djBENCtzWDhJbEd2cXE0T2xMV3ROdFFwZHJIL3pETGlua0ZOMHRTajBSM0I2b0FKMm0yNUNrTkFMY2xIK1Vuam9tRmgwWGdnY2thVkpwYWt6aVZhTGVJcmNLbEpsZlZITHFaeTYza3AybER4cjRRUnhMejdNMmtmYmR1eVZ2QmJLSFhLTUc0K1psT01hYXdzTnI1YWl4dnJmTEZITWV1b2xJQXpUNHQ2ZVFPckFYWWozZnFDR1ZXUTV5dEsyTmFzemJMbXZtYTFoRjVTOXJ3SGthV2pSdU5WenFic2d5MCs3b2IvMmZTQkpzU25BUHFmSmhsbUZaMzUxcjBjdEJQSWRUOGR2TUo0eS9xNnlJSkdzdlQ4aVpDcXMreDJvU0tXNm5zM1VtVzUyODVwOG13aHNENTFtZC9SSXc1QUFzTkJCL2VwQTl6MWhEU05wNjhtL3JhN0MxQ3ZsR1lNNVVXaWpkb2tUYzA2Y1ZsaGljZnhROXM1ak1JRUNXWDFCdnY0eDR4OG1oVWYrbG1SaC9rUTY3WVlmMWNOOGRPREMxbk5aSjBZM3JpQ1MrakJ2M3gveU9KUGwzVUNzb3FoVzgyeGpaK01UVU1sSHh4WmNKS1N2ejF4bmMzQ1pIMm9vYitJQkVaQ0FjRlh6bGJYQ1JtRHl2REhnbE5kM0dvbjBRamNzL3gwYlhCR0hBYVUrU2poNERHa1hPcVducisycE5rSlhrZG9UTDhaWkp0Uit5bC9ZdXBhWXhtQ3UvbGtmRVV1all6ZXBNN2FrU1FoQkVldnFRVDlYK3JVL2ltWkRxUHZ4Qy9XakZmZmVERnVVTkZuNU9IN0UybEl5RXBZVjRBelpYQmFLckhYMTVLU0h6dHBDVFpFeVdIUWtYd2VjQnFQamR1T0o1SEZaMzdsazRoOHVubVZBTERrSndyYk5vNnRtQ3hyQ2FmK2FvTVQybUthajZuQ0ZYQXFhZHo0Y1BkVkhqeTlHZENaRmppMEJYUTQ4YnoyWDZ5N3hUOEpEbU9YNVZWV2VFcUdEZ2tnMW5lNTZua09RK1JZd29KOTNsclhsODdUeVhUd3E0NWJIUHQrTWtTaDdlbVhIQmxkbmtOb3FaV0hhc0tydGpsSDRLNi9MYWduZVlHdEpsRU5BcXhxZG8yVUFMNE5kdXAxM1pmdytubnMwWmdSUFc4L3pXbW9wWVg3aG5xQXBLZ2I2ZVgzanFFaVZWZ1FUZGhJSnBRMUN3NmgvUm1MKzhwQlo0Z3drVHBWM0p3aVdNY3RjYlpaQlRkc3cydHBhdjFrUjNzQU83aDAwNDMvQ1hwL3RwVkRaZDZtT0ZJcjVmb3QxK0FndThzREFHUWljTzgwWTB6Mk1aaEZwN1RVQ3VhM1JQL0Jobk43aHhJaERGcDBhQzZ0SFJqQ0tEeEdqV3N4NnM0Rk83NHdGd09lYmF4cVdudmZ6RlRUaTk0Z2VpK3ZDZHA1bmh4N0drRzNMQ2hRVUVTM1h2TW9TZldFSTlaT1VGZEVKUzE5VmZGTzBXeE5wVmdPdjhvWWJpUVNTTTZ4N0gvUUpuQjhtalQxLzlzZWhmS3dRUGk3WnpYRFJyU01LaDRTYU1yVzc2WW9rTjhNeHkwTEVZbjVOQ0FpNktGa0VvYlBDYUhPNkVZdlY2RWVUZW15dEdTbHdEVmZicklxck51VTdNWng1ZjUwOFUwUUVlOG8vU1RsdkJjT0RpenlnQXZKK0FVQTBoY3JmZjh0TWYwU2Q4b0RNQXhqemNOZm80aVY4dU1jeFZaSUY2OEpTVXhQa1liZ3JYOVZpa084Vmcyb09rMFJpZlRPUGcvUEVmQ05OS2w2R2p3dW9zTkpwQ0tMOUhOdkRpcWtObmhGc04yK1RoZ1Y0dG1KMGhuOUpQdVJ6RWg0andPaDRzL2F5WjBiZjlaWmlocUNYVDBkd21ObzZvZDRnSjNuZXhvMWVOTWE3VUo5MHhZVFN1M2dvNHZPS04rallMNkJMMUpTbHF0RlJVUGF5bXRuRklYTEh5TU41QUxsVjByY01hTjVCc2crVjRFYTlsRUltZVcyZ3ZBT3MxT1NTYzNwcDhjeUlZbHE3MEY3WnBVTGtQbTBQQnZ2N25FUjhHai8zczdScXUzc3NFMDJRVmZITXlMZlVIZmZ3WmVhTWZqNmoxWmlYZWNtdGRFNFd2ZkFnbmhPSXVWN2h0U0Y5UkZiVlozTnhIQzk4Nkk3MWhrSlBqTW9BNE9CaXZoSU8rRGxhTHNJbWYxWUVTTnE0VVZENVd5R1pwTEcrMXhXMjgveGhjR3oyZTh0U21vOHFWTDFMbkdNRkx3V013em1hMVpNQmd3SFY4SkNKekcrVEJ6Qzg3TTNTRVl6dlBqWUsreDBkQnhBWEFBSFc2VDdva0Z5U0NRWnZ5TWlmcWxqWmVmTHVTQWRCVmFBTVV4UFBvaTlPUmoxSnVjK3l2MXVaeEpzZTFFTEtnaDJQOUV4UHlweUIvbWdCYUpGOGpXSjdSWXRSKzA0SnBqVzVmdmxYZXhEb0tXMUtmZ2JPYnlrT3NlWUwzT0kxVEF5NnFiSHdZZXUwdDk4dzVrSmUxQmw4RzlHMW0yZWpsWTgwcDl4b1JRL0dTV2lUWSsrMWFBbGNLZ21jRStkOVNlNFhQS3h0ZEV4Q1BLRCtML0s5ZVNaaEgyNTd3NURoWWFTVVg2cFJrVnYxK2VuTkQwcEJQOTd3Q2JrS0hLRUV0NU8rYy9abWRHa29OcWFhUXc2UjFnWXU1WGc1WG83Y1VlUGJlQ0tEMEhHL0loVm1HSU11Njl5UXo3Z1pyV0lyYTNiVVlCNnlGTFhtQmxJUmhTU1BYRmdaTVArUHpkczdpUFphZ3dRRmpYN3IvZy9YN25XM2lVTVRUc3Jlb3hjdzgzbmorWUJQdmFuYVQ4clF1ZUxtQVdNclI1WFJ0SlgxbFRiZzd1dm9wZnVDRWh4Q2VPSG1RNWlJTTMyTUp6cVNUZEVJaEdMU25uMVNVYlBtOWQ2MFRSbTFTM0NhR2FuTTVOSVo0YUVUd3JxaDdrSG9NS1VGNHJqOWpoWmRvbVppTXYyYUk2VzNPUThzbW5VNmFPbWcraElRbnNBZ0V1QytTQ1liWWVrYS9wQWd2Y0xzQlpsMjMrTWs2enlQMG01N1dQWTdLZHBqT0JTcDJ1S1NrQkhjZ2w5Q1Q5YWxQYTdaYkJzejc0UURleFJHS09TZE8xbk9jQVZrQVJOSEIxdVlCSFBCKzBvS1lHeDVGTFI3N01IeEdwNXVzYTFXWm9xSUtRZkNGaXhUZmUySGgyVlBlempzd2JWR3NLMnl5bVNCcEFTdXRxV1RyTkI0MWdYeURlU1lwYUVDNUtKU29aU1k2VmJhK0FnSUNBNXZlR2JzalpYOEhwZ2RhcmVqelF1akIwcHg3dVpsNmpWTklvVlFVOVdjM3FwdlFpS3NNY0dSV1ltS3d1eis4RDhxSkdML0JML0dWVlNTYUlqTlRCdmhvNVFSdDltc01rdS9yZXN0cjBoRUlxNUF2WDRmOWt6aFkyNEZTUnZXVW9wemZMZXpveWhTOGM1UnhFYytpTXh4K29jRGxoemZZekl2eksrakNIT25nOHkzQnEyOUJkWGpjMXJzL2QrTXh5dktsc2YvcGF4dVFMV295Q0RMZGtjM3NRRml1dlgwQ3pZR3VHdTlDd1Zlbyt4NkFDNkxBYzFLMTFqMzVGdytFVUVtdE5sNFpwd0ZqNlZMc2VkeVMyRytrd0IxTUpnZUhLYWoxa3lMUUFpcFFnSFNwenM5YnJkejZIQ1lHdWdTcXJtU3I1MGFURVJHQzVFSFlub3BDTlFKUnZkM2VnQStDYk5ZNVBRUnpTbDBTRDFROW1YT0pWWno2Uk9mNEJqRnBnMkhwdHJtMGdDQVdMZEQyVkJrRVpvQkdzenhZK0tWMU43MXVzMHVab05Obzg4RzlnK1JkaElGekl5aHRmZDBvZWNJam1RYTNGU0RoekFTamVEdWpRK3FLa0pQdEgvcGZXUXJsUGJsdDhQMGlRRExXNDNZSXhtRENOS0tQdmhYWWFFVkdtK1hhZ0gvNHVxWEpRTkZ0QWdQU0xKOSthRnoveVZtbzN6NVRpbDZVaWtMSlRiT29QVFdOb2kyTTllb1BRcGpFUmZ6bVNFNlVCa01KWGU2Sk5lNUIwSlI4aVRqU1Q0SEFlNDk1M0VpMHNVc1dNTFRDVXZXRDg2Mmp6TFNoRGZLUDRRMWFJYlY0MStrTTRZMWVYSXV2NnJsa0FYT3lDWEdnVkVyTVpnOCtqaDZQaWdoaTE5QWxqS09SdHlZN016MzBDZSsyUUhvdlVyWG5tMHBydnBJME5HNnFpOGE4Y0hsZEpadWpzNVdtWU5VWUozVGpKbkpoeVV6U3BrNnJ0VitqUWdWU0RtSTIxNGpkVVNSdWRpOHk0dTB2bjJkWFRmbzZxRjRFU1F5MjhCUmZkNW0veEFLNCtlQmFsbHVaSEw5c3V4b1c1NkViaWR1OEFSa21zRTU0REF2VmRXdXlEUkZpZWdQY0NzanBqZE1BQS9VQTVWU0RhYXlsSHkrbWhaTzN5MkNZMjBXT2dlNDNZbUswVTNISDBrZDJPZER6SzA0TThqNVVUV1JXZVZaWTJ4T0RFUlk1UFcvTytBbVhvTFJma1ZkZ3ZVQWhpeE9qRDFkeURmb2dqT1VxZm4xWnE2dFBHTTN6SEpBNSsxT0QrZlRveUMvSHhUaG1DRmFLcmtwVTIrTHRja1dhY1NuNm83N3RBYk0yaHZBczI1Qzk4QWMvZ3o1MExzbEhEejEvdzhqaFljQlc4U1l0OER1dW1DOHZXeVE5R0ZOeDVqR05QeW5KOGJKbGNRQkRyMzJvcEt6NnRqRndjY295NHJPdlE1ckhibkIyRjg3U2ViVzVNSUxuZFFPekRNVmpZMEpGaFlKckNaekxFR2Q0Zm12ZWRrQ3dCTG9UaUZyVlRlZ3VUUmxJL0orblNqaCtvUmlrZG9RVDhMcWlHeFVDcGZSMkdYYlpHeVd4dWRZUERPM3hyVmg5Zm03YklKSU9EY3NkS1gwRzdZVXg2UTBrS25QTE1xWlpYdnJRLzJrUHVFeWcxTjIyZjU5MVhMQkQ5QXRjSlNTdGs4Y1RpemM3TGZuYU9NUGlYY280Nk5VYkZwTnJMUEthMUh5MFlhZXlEM1BlaXRSM2pEMkFwT09hQ3cySUw3bEZNTituVjlha09rMFlZQmVTMW1TOHE0eEVFQzNSNzRQUktzaWU5U3dWV0VENWY1a2x4dnRYOHYwdmZWb0QyVHViRW1Qd0l2cWN5enMrdzY5K3Q1ZkRNYWgxemxEOUR1aDF1SjZBUkI3RlIxRTMybDBseFl2Mkd0Yk9lVDFrODVLcGxSR2FseFRRWXpncVBsaW5RNjFuaUo5L0tZUWZnenV4ckNPSVN0aXhFSkZRcjk1eC9EaWplYUNXZWVXNjlFbjdmQ2NWUEJ0TGNHYk1odmRKOUx5UGNsRVJ1S3VkMGlGbTdzMjdGZm5ROERkN21IcVdyb2xsU2NRRXdJVGpxL1FBTEVsNVJvU2s0MDdJM2tmbGQ0UnpRdnljOXhhd0RSTzhLRHJVc2ZCVWtZdjl6VGJsNld0eDhNSzNQa21Sbm9oMTJJRU1GS1o3MmY2Vk9hOWJIbkNEbk5NazRsUkRCUWFMY0N2VnorMkgzN0JnQ09yTitvVGwwN1NmakxGUlFDQTN3TzBaVjVoemxiZkZZMlJYc2NJTU1FcmRXdllSVWkxSVZVNzZNR0FabzVEN21RcUFwOEt6MXNubzJCRWZjVmIxYmhjcmVZMFZlVkFFNk9odlNhOWVGbnZ2YXlBdHgzMWg0VzQ0OFpDb1JKKzUvOFV0Tjh4WXNhWWI3YkIwdWxqVEx6akpwc0NOT0s5VnoveGJWbVd2N1lBRHhLRlFzdGdZRHU1aktaL1U1aW0wSUFPVU50UjFOQk13YUpwYmw0OE1WYXBaVXhXWlU1Sm51M0ZDVU83NjYvTE84cmVnQi9wdG5zV3c0Y3FjSmNvcFEzNFlHWHVyTkRwTG9NTEpKVk03Ri9PREh5cm9ySjBFcGNPTEdSY2xjNmRIUDNFUURSeEFjempja3hrRlJMQUF1dXNYbEsyZ25tckFDTDdwNkJTM09nTjJCWUZFbG0wS1BuckZrd3c4Y3lLeWoyZlRmdHJDeDdVQlNpdERQaDY1M3pmT0VHS1Vack4yanJmd1hNdHBwMGdLYzB2bk1wSGpaTTVIYzlTUis1VUhXcUFCZ3psU3poUHBMOUkzMEFTRUd0OWpVU1dEa2F3azk0WHZKZkhzSGRURHF3b0ZJT25Jdmx2RzcwM1lBUy9DK0NmeGtCNUFkZ2lac284UXIzSXBRdEJrY1V5aDVSRDRHbm9lRjhnZWw4RFZwSmZHL29kcDZDREVLVTlld3pYUG5XN21Hb0FOR1R0ck1PVkZXV0ROVGVaa1U1eTZwQ2krZjZseUhaZWlqNmd5REtjWGsrKzV3c1FVSDZpOXhOWk5EZVpyendOYkl6WkhEeUp2NFgzc2hYNWtpc09xK1BEc1JwUU1CYmxzTkJVRjY2Ylg3bW93U09xZFdOSm5wOVNYTFhHMWZxSC91U2orOWJiV1prMFdmTUVtdFpDZUlUOVFyTGp2TjIwcWVkT3BUR01KM05mUTNjczBUYVRtYW1pMFZZYWM0ejE0a2tBc1g2WTFvU2NNdEFxYVExd1p1bXI2QnRkWThaNklKOUhDRENFZDNGbTZhajNyY0NxczZDRitMb2hwMmFkS3FXUlcxdm9oQ1NoaElqLzhSTCt3UlJFUFlpemdzdmJxZXR4WEtXTVNKYVdVa3BWanlEc0FMVURIUWRTb3BvTStGaGFFTkRnRkZ1SlZZUGtpOGtvVEFoSlY4QmY0MzhLbHVFNDJLQ2xpTnNUQTR6aHNnTTBYQmZRaFJpMmlha01jZEsrS1hIS3Z0cWJvUEVKejFnWUZaejVIdFo0WlR0bEFTRE0wNE80WnBjSE9uWVh6NHcva1JqM0xHWWN4RWowT2hGeVcyYm5HYlZWM1ZKdXFraFJJMnBPM2pVeUxFTTdyQnVlRVYvMjhkWkM5RVhsY2d3TytZa1NQMVBhd1JNaUVmM1V4Tnd6Tll1K3E1WlV5SkxsNVlYSElQZ1FmZVNobk10NEFLcnhyeXZaT3Y5aEdNek42Zm43KzZ5WUtFVHFLS3g5UWhXbDUxY0xXOEVITXJxSGc5NWZjSEpkTHUzdWRaZERzZCtFZndoQWo3MXpxSVdpYVZ5VmZhdVlxZ2Y5TTRyOE9jUDZPbldKUjBHbE10SlF2ZlJxcUM3QlBzdzdibFZ2TlNuTlBzNFdYdXdwaXQwT0R0alpNTmc1dmZQTEhWS0RzRWdvMmVMQ05GNXA0eXpwbUxBektuWWIraEp3VHozZUJXcjk3ellBY2lCTFNjbU90K2k5ZGlpV1Uwa0tHdnJMRkNjcTNVVDI5OHl1cU85ek1tWVliVVI0WjFqWEVmWmlaRHhGUDR6Qk45d1Vlb0lvV1RaQTF6S0lXaWpGaVB1eEMvZC9MMGZPRFJsUUhOazkzOVpQcjlsVnQ5aTZUNnlPbkg4UHRTZjRmWHZpeGM5ZnpMNzJLVVBpYzltazh0b1Z0Z3RWNUNVTVg3M3g4anhSV2I1LzAwS2xSb0s5S29sQ1B4YjNDMXJzK2xoN01DS0VQZWZBT1ZlNkl3SEk5dFZLdUZVVjBhenptWFZGMWFxK1d0azY1U0NwaHlKWGRpYVMwNEwreFZrcWNGQ2VocGxFcFRlemRiTjRjbm1SNE8zYUNwVmJvYlY5V3pnZzlpWFFXMlRpd1FuaTlGd2taUE5aTTZqUS90L2owZXNpS2VxcXhnSnREWjVvSmVqeHI0YUxvTTF2M1RQTjZISXFMeStndlB1Wk5BR3hUL0w4cXVPRDBxdXlOa3NNZGlTWisrS0N4MzdrS1V5R2RiODExc1FwbzR6cTZOeVJSaklUVUJUTDRqeHlLR2JUbjFkYnZoMmF0RU5vRmMwQVVqMGlMWlo5U05NVHhOdHJ2Tkxsci9KQ2xSbHhIbTJXWTUrWlZEQXhMazlic1VtM1A0TysrY0pkdG5DWnRicVhZYitQTk5oN05xUkI3dzVFeTR5L240R3lPa0paZytEQlNPdjlYR3E5ak5tYWd3VjVaUzZVM2c2bnZsSUYyMjhGVDB5eUZucHJ0cFpoYkNGTG9PT2U1ZmR4VkIvVWRjTkRQdllFdjRVbnhkT3ZLSXYveDJNMklEZjY4YXZySmozcTJxUThFbW1uc25aVEFGaXdGSmh0N3YyMkt6Nk1mdkprR3l6eEJzRWlvc25naWNsdW9ldzB5UElvLytoSWIxbG9nenlzaFcwd2VsLzBGU0ZHQUNDb2lPMHVqL0hBSFd5ZUhqUS9xVnRNUlU3UjJJZjI0NlZCdU0wM3ZuR3ZtQTFGd2Z1NDBLd1Y3UnhjdGtQUjVFaVF5NnFRMFZ5YWwzK0tjS3NtL1JiRE9PczAyT0NIU3pjM0JOOElNTXVVQkhKZ05LTVRJbkJuWXhPOElVL011S0EzbHpmVUJsb3BaeDAzdnNnZGU3WEtEb1BKSGlSdlR4SFZGYjRkdFRscFN2dFpHQTNLcmRCblA0MTJaekNtM1o2Z3AyczhNaFFkaUU4amlMbE1sQU9LbGJ4SlNaZWJ5aEhzd2k1UDdwVlpBSEs0M2hwSzUvZjZ2b1FLUEZaa2U1M1hUQjhPU3hUTEpyVXBCVTR0cG1NcHFNWG83MkZVWkp2cEhLNzBTaTVnN2szT29IKzE4ck9iWVBuT0FGMmhhRFN0Titnb1pBcGxYbm40bEh6MGRTVjdLTE1xNlAwalV2RlIwWWlLVmRNV2tZK3NqSzdVaTJGWnprUG9RQld2TkFQWUNJZGJQRUl0OVN1Y3ozSU1EQkJIemJ2Tm1wWWQrY2Q1OExJODg4Zkg5R2FoaTNJUnhia05KYitUTzZ0WjZVQ1hvR1RsVmFhUHNFUWh0SThva0N4QWNVeXpFUlhEYXg4TDNnTEtiNURlNndubi91S2JvTUpHM1dkS2dXVXNpUzVsdHduSE9OODZkbUpCTU5EdzZRZGQ4RUV3dVhqS3FJZDU5VUs2MVoxdEgzckpSWTkyb2s5SEtmNEVlOHgrWncrMDNjY2FkMHFjeXhkaUVLQVpxYm9kR3RocDhRMmFNbFQ0THpYVjd1RWkzd2M4UkFPSldneExzRldMV1FaRG9HQkJmZ3QwQ3dZZ0U2R1pvR09YaDhFdVJFT3ZyeFJTYWNCZTBPTmNKQ2VHQjI2c1QxUjY4TmxNdTJFZEVoZzZ5U3ExME0veXNYcHA0dmJobEFBQy9kck84Sm5ROUFINjdvQ2FyOEdncTlOSm1vaDdRaW52Y2ZqS1JFK01kN0xSNVRPVFM1KzB0bVo2S2dGR0toYlJCeFp2OFVxemhvVlF2c1dWazkxR2ZIWGRUQXJRWEhIWEkxcmdCYUU0c0pRRU02MXh4Mm1qY3dEdlhTQnIvaVdYeTVnTkFJeGd0WUZjY0YwSEMycXZqMmk5T2hlVXNOeW1YZFpXSFZBMldKclFPQ04vVWFzWS9lUXQwOU9lWXYxT0YrU2ZLdmNLM3o2eDh2dEhZamduS28xYXhHMmNVS1VsWHg2aHdSMGpaenl6NWFlbmxpQW9sTFltMkgzQWtMWFZFNWU0dVdkKzRKb21QZllyRkVzamRyYlRFZm1LaStXeWJGVHorTkI0Y2hVQUV5K0xFa0pRT3lMenFHMFMydTNyMCs3Rk1kSXZDTmw1UTY3NWlDcWo0ZlVPNzZrUnVBdzNaV0J1Y1c0ZkhNRjIvaEtpM1FwZ3pST3BGOUFiU0oyOWVtd2RMNTJ1WWJIdnlyQjQ1Z2xEd0x0L1RYTEc3NEdiVlpwZVM2Nys3dDJTQnhydEIwUDBhc0RSOUdLODFyNlhsdWRETnNadEY1S0FZWnROUVpyTk9vbno4M2EzTUEyeVNDUWlCb1BVVlFRQUFNUDJLam12ZFhnRjliZEFqZTRXbmxXQ1pETzUyTTNtQ0t5eW1hSzJTdEpCWmpxdTlPYWJKTFVRRmF0VThHN1REZ2hOdndsYzJuZzVBSXdsSEEwUktXWHZtallwcHY4Zks4TVA5ZE95cWxHMWpPcmY3ZWRNTWYxaWdZdUtMaU9IZExaQjNxZHpIRFNoWWZwRDc3dzFYZFBoOWVGSUw5MkRjckJ2M0JrMDNWdnY3V0FiVXVPSzVENWM4ZEFHMWRZS1pGeEQwNjAra1V0NHgzR0dCMUlmMUtBS05xcy9Vc0JHY3FoMXYwdWdTTE01SGx3N1duUW44ZXd5OW1IZnNaZEkrOTRZSlgwZ2lwNjBrcUNEMU9CcnNBT2pJeGVwRzlZNGFjcFlLdW1POWlMY2YyL0xRenJGakVXa3pBM3g3VmZ3MkNnMGtiOXZzLzJQN0ZEUnZSV29uMTN1dDJ3cjViK1ZBaU1BcnJNWEFsdGxDWWgzalNtZUhtWHRoOXpwM2I2N0ZCc2d5aHV6YS9Ua21PbjlsN29ELzlrb3FHMTF4dVJjalVlWk5GNG5LZDQ2OVNPTTVHeFc0Y1hiOTk5dnNoV1MvdGsrcmdLM1RleElBQkZjd0ZuRzZGMktyZVRQeFgyakZEL2dRTmV6RjBFY1Z2eEtrcmJXTEJyVm9sUkFibkQzeXRkeE9ibUg0RWdJRGo1TXBMbVhSS2c0OXM3VjZnT2xLblB5UWhkRm5COFgrU3gxRzh2Ui9OdzI2ZnZQY0ZBVVVOOVZVYnBtSzh5RVpZdjNTQUNBUEdvSzMxUFMvcmRUV3ZUclROM0w4VVc5Sks3N1BSdVNCS1YrSVN6R0kzN1RJZ01tTnZGWnJlMGZaYkRIaWFiamNuTWI5Vk1uL20zOHRORkFxL3Z4R2N0Q0tyajFPRkxRd3o1MmZGMFFWL3UwUWQzdVlEWFp5NTZ6TEtIOEpDOHIrQXNQeE1QUUwxVmc1TjJRc3ZrbzFIWUk0OVFWQVZacDJhTzFhWmVkZG9jenlIK0F3RTZDNW54UlRYUGhmd1ZTbmVwZzg0OWx1K1dxMjBRdzRCb2F0dERTNWQ1NG5lenhrU3FtQllHeG5iYWF1NzdzSjZ4VlRRYThKdGFEQitrTmR1ZlVUcmkzVE95elBOWkdNUCtOTmM3MU8rbGlqK0g3eVM5MmhxTEQ4TWlRbEFqajVhM0hIT3FZZ2I3blh1N2tOdG43NmRMZENLTEZJcEpVdXdQdWJOaEU4blVIU3pjRHFhMmpwakd0V2t6eW81QmhCanFoWjc2b2FFT29IekRXbmZMbloxT2VKcDBPcytQVExiWkNoZnAyTU1hZW9RSjRIQVgvOGFlbGw5MDdpeHI1SW5xZ1dLSTVzOFEzek53TzNnNWh0VWlRejNHOGQ4ZTlPNU52YTVDekNNQXVwL1NweXI5QTRTMUNCQnZJb3dtM3o5cFkrSk4rYkdkKzZLSmFIWnJBdmt5bjByL3RlM3cwVEJtRXRyOVYzSTljcldvRWQzL1g5aUZYdXVHd3c3blNjdFFWaFNZRE1RYzMzbFp5ZlR3VjVuUWxzVWRNSmV1TjEraTR5aEFzWmN2VUtPUGxadDljNEsrN1NMSStBemRBWmZlWHBLZWl5dkEyWHFscmxJWVdnTGV3cWtwOHkzVi9pcVEwZTZMNk55N2hBSnIxZHdzSjBkUmdUNndsWVJ1WndHRjFlRURHeDhmcU5nSGVDMmc0eGlGUkwxek0wRkpQWHB0Vm9pV2Y3RU9uKzR5RlFCc2ZGdDZpNm16MnlCWU1Dd2RmeHg3cTl4aHNEL2RPRUJEWFhubS96ZUR2Y0s4azFqM1JrSlZpUlRwTUM4b0plKy90cmVtWkRKY25SckZTSzNsR0sreDRhbnZmY25aL0l0NXJNN1NncTlvenJNZ0hsREZkUGFJT2RQTU9Hc2xUd2l3TWZ5WnlaZ1Y4VXdwQ05RVUoxck5JbFBSaTJCb2ZETnh5MFJWYzl1S0ZmMlAzWVZLMzViVEdlQWlINjd6bVZXNVFEWm9ydlBXenF4bUJOZmJiTDQzc3ZpZEhib1JFa01qNUhuVWRobzVFKzdYVVM2MHlZdkxORHE5RGZqTjYyVGhTMmp4ZWZ5YWx1UnpJWFlTRHpPaHdWeXpuZUhtd0J3L0QxR1E4VUpNa1QvSWhTY2l1U202SVJ1SlU5MWdCY2lNZkVFU1hiZ0tmWk9hY1ZBUTg4SytYRjRGYW04RGluS2JhdGE2cFZNMGtmK3lCd1h1a0JQWG1rS1gyK0I5Q3kwbit0dG1QR3ZDcWE4SHhsWjNoS3k0N2ZIUHBwNjhHa3pjdURVWi9EdUUvZFdNQ2VCQVBENnZPa0g3Umk4Qy9wWVN4bnlCN1dHOFpHamZaUTJvOVMxY0VLdXNzWGlGK0VmOG1leFdmcXJ0U3JIZGdLNmlyTE9nT25PaVhUcEpQaWNrRU5US2Fla2E0V2ZIdzREVlNDOVh3Vjd4eW1KaXI5N004a3UvWUF3MUtQNTFoM2tpZmZEbWQzRTB3cUNacXNGTk91d1M0emFJS3RtZkdocjVKdzV2OVdkcUxqWnF3bzEyWkFROWZrZGdhU3pWSWtlTVRGeXNuRWpqQUEyZ3lkZSt4dkVuOVg3UkRGUDVPclFGaGNVQWdNSlBIZW5iOUk1Qytab3IwdXFSdGNiNHBUSEhsYWdVUStsbXIwNDBoWVNiL3NMOHdVS2tTOUEzeUlWNUQ3ajUzRDNDYWNyT0RiekYvZmF6Y1U0R3EzL0d4SDRIMldPZ29tZ1ZwTnhmZ1RDa1Fpc0lnb0pMYXRKUjloS1FURUxlaUFzK1JjaHROaEFTMjJoRWdFdXpQWnlWNTBtVzhGVk05ZWlKRGt1L093YklweWc1RVI2SU5WYUh6emdpN2VnZ2RabFFnSHBtdDA5WVA4OGZEZ01GVmphOHNucElLck1ZbDQ1M3g2R3NFQUZJMCswYlFCSjdUengvVkZZTE9KSDJtTUVQVmZmY0Q2clA0QW5GSzBPQ2pOcEx0UDBiSElUb1Vndjd4aU5iRXQ3R0x1UG1ScjVYRXo3ZWFVWFR2VlBIZVh0Sk0vOTd4OERnNVlzSDVSOWNCa2VVeWsyY0R2dzlOSmlQN0pXazVIcXBmUGRFV1Q5eVEwUlRaRzdaZG9adDNhRitCOFpNSnVNb3hvOHdHNkdrVDVjRFNTdlluUmpqdzVSZFFYaWYzaTVLbDF0NVc5dktWRzRHczdzaTl4aFhZbTJyZ3pmZ2hDT1RieExYelFERHdXZktIK3F6TUhZTWpRejM1ZXVCTjYyWnU1SXIrTVdGeWZ4QUQrSTB0VGFxendCakdEakYyd0tmbHhGWWRyRkxFR3FKY0lsM1pqVHRnSjRwMktoRmFFWkV6N1BCQUJhM0kyQXluR0xPQ0ZPRDRjbGdrWm43UytDVlpCaUYrODE0MTcyT3JNWVVSRHN5SVl2Y1Y3YnYwdnpFSEExcFNtdnVmY2xjQTFBU1NZcjlSOUViSFE3MEs1WFRZaHk1bWJWVmQwMHIrem1yeFByeGx3WjlITXZOS1NQU2IwREVZYldLd3AreDRQT25OdFl3dUdMQm9HcGE5S2xHTWxYVjJVaSs2QXNydjdIUWlaRnlJakIyb08zcW1sclhWbHcrQ0oyRmdiL0J4b0NmakdEbkZvUFJwUEo5QVlFdnl2SGFBTTNUb1Y5RGZnNHZ1ZEE0cnB4VGJBZm50THJsU2dUbXVVYUt6QzVVNWg5YTRacnptK21ndC9jMXUyUDJEOTYvb0tWQ0xZZ256QTRhanFFZjBMOEZRUUtsamNuaFY3WDJqWnNiVUlBVzhSM2VBRktKMDZqekY2QjFicmFRZWRZRUd2Ylo2OWk4aVJIY0xBWFNzRzI0ZWhRcm91V1ZpRTlRamU4dStrN0I3N1c0U0JJSGpmbytnQ0ViQWFJdjlTelNmU2hTNVN1VmNYRHpLZmlRV1ViT1JmTjhLZ2E4Mlo0RlVkckwxVUxNM251aEQyVXptcjdxTkJPNThEbWJuTDRQU2hFT0d6Y0NVTE9CSXg0Q255ZFIraThtcVBDUjMxUkVRWVdITldWRjA0KzFUNC9sOVd4N1p0T0EvUXZxeGhMaUE4YmptdzFKUlFuWFV6Q1pVSFRHSE0yakdLY0JlUFVIb0Q1UjNMWTJBNHNPSk02YTZNdndPM0lWOHRXbVlkSGI3RzVJb004NVRrQmdOVWRBU3U2S0VLVjRYa3JVR2ptZGVTaGRmMWF0aHhmQ1BlY1lIK1prbE5jZ1JSdkdyZG84MndWUUJSa25menNwSUEyeGE5NXJOQW91VUxibGoxeFlvYTM2Q1RIMEl5NmV4aFI1Q0xXNlkvOVdpMzdkTGt2ZitLUnllUTVDS0ZqZmx1Y1ZxL0lMNjVrb0J5N1g3RzQzakNta3phUHBra2ozNTRxU1NXV1RteCt2dDVuY1BwbEF0ZmFnb1VwRm1hK1JPU1l6a0VSdUNJdWwvSnpHZE1OcGpDT2pLWlFFUno2d2JhV2tFeHUvSVZUdTF4WXlTMS9MQ29zdUZhcmlkUWprMXZIUmJCd2V1aWtSU295RnNqQlEzOWhkMEhIeDkrSkpXckx0STI5NTVRa1BOdzU2T0RINHBuYm1NQ0J5Uis0cHc5cDVGOFlnZytGRllYUlYzVjhlb3ZURWwrWGdzSUhnbDZpQ1JrVjg4NTFzdWUxRmU0WVpLYmU0eHc3Q3lZZ0NzYjRSNzZSTitOK09wYkM5TWs5NHVRS0JSUXN5Z2JnUm9VcllLYVlhNnh5WDJ4VDZMODZURDliZS8xaFRReFdobEhqbFhOUVAzamYvY3lyb3hkbzQ1MU5DMnF0VVA3N2pOMkZPVzVQdisybG0xcDdPMTk3Tkd5eGVBd2VhVmNZL0FLSlRyWS9uVnVZY2hzS3dpZEdGNkxCVEtJcDUwSWwvd2lXTmNTSzhCREdxR3JlUTcwckV0cjRDamJmcXVEaDc3YjRRbXdoajhWQ0VKTU8vMUVEcnpTU1ZqWmgvZnBwTWtIUXJOOTc5ekp5OUY3SVdWVEdKNk9SU01rTUlTSzRKcDk2L0lVRE0xVnVrNGhZSFd2Smc5bUxuKzhndm52aGt2aFVrZGtPNkpTNVdYY0c3RWtvU3lyRjIrVDZlb3ZqMXNIM3NtUEorK3VPejlRMmRuVFlDTStDdjVLZHAvbUlmN2dvVnBlc0V4NmNETFlIelhseUdHZmNYbk4wdjBjMCtmaWE4aXl0ZGhVQjkxVkx4TlI4cjkweU90MngvQmdtWXVHVmx4MUtFWEd1MGFEaVh5bklUYk5wT0xQOVBTKzkwWGp0NktLd1B3MnpBRFZ1Y1NoR2daem84VCtpekNsNE5hWjMzU2VpM0Rxei9yOS85YTBuMlluRmJCSDNZYVluSFF0dTgyM3psYzZqOFhzSUxEK0ErdlNwWURhWXFSRGpnejNlTzM3djZzYitLQWY3ME9yZmtYalZhWk51YjEzYWZvM2N0SjZmckYxMVdtTDAyaHVpUno4SlN0RzAwNldLVGE3WmZ0Rm41UzJtQ2N0eDNHem0wUk1TUGpIY0FGVTZsZzk3UzNwaGtvRUxXQjZTeGxHalphdW5ybGZJaTFFOWl1WGd5b1dwLzM1d3prUlZWS0JBTlVHM2VsOWlWR1dVSU9vYVhYcGJlUG1nZG1FbEwzRVlkTjRTbkh5SUdZS3RzWEVCa3QxaTFuUDlzUktMMlcza3NvUVFDSllZTVpoUTZ3TGhUYmNxWlFGeDRBUkVLK3dDQ1RWNC9QSU9RQTBKL1pLU2xrVHY1S0JNOE1qRTkxRTB3ZnpyTytYMEw2cnBmUVhrWkw5ajBvRE91Nkg5UkpLQ2VNSkhLK3FIdWhkb0NPZ0JDdTFFQVV2TUkwOWxEOFhiVEcvVXdxR3Mwb3BtLzFEc0RkOHVYQjVOWkVZS1VhejNPb0ZsUzg2M2NnUlFHV2h5RE5KNFd6ZS8xYlIyV0VScnNaalpMc1JUR3BUWXV4NmRzMnpmQXpuazVxL1MyQ0dZMThYcFdESThYUDJ6OHkxSFNteVAvVU1VWjdXNVJpSFQxbkR3WDVPYnFKTXVyZzVLRVpiMHYyaFR2YU81YzRvTlN5QWN5MkdRaHVOMG1xQ3NnYVZVK3hyR0hxQjRJVGh6dkNMMEY5MWlZRngyQ0Q3Tk9ZNGFOYXlUSklDZ1FXUHJHS2xPTGxPdGVVemJhVndFYzRsM0xqdDhlbnhveTBodW5tV1VOcGZwdFlFek5oTHdmWUNxYkpKUzJlMGtRUlZmODl3a1Vscm85NS9ZYS90NkI5Y3NOcEdld1lTWUttM2ttZkhvZExaMGtNVlRCMlZaY2NIU1pKbnA1OWx2c2lldlpKZ2M0YlJrVjVDWE9sU1B1QmFCaUVjelhoREd0THZ1bkJXL2I5a0xGWWdkWVl4cnVPYTI1Ym1IWTNWYTltZVcvMnY2QWJZcWFKQXdXM2ZyRlBsbWkzUnBud3o5bzEzNTBFUmhBODZhbmFUMkFkOHdmMCtTaW9kWjRNdWNyQk1iY09ZdjZRKysxMDBDN0NKZUNSaFNCRm1QNFlQcHJ6YVlTeVlhVzMvSFFIdlZlc1lOL01ib3RvTXBRSFQzRlNhbi93dVNPT2N2clNySkg4a2tadldhclljTnZZSG1HUEV1c20rdlFtMkpmSkJrc3JROUJQMVFvY0JBZTlRcFZITFJ3U0ZDbU9HbkFpNzZiTlRaRlBzTzVzNHpEMkIzZC9IeFJGcURObnhOZG5pT2c4aUhsc0sxNVlCaWx6cmU1bDVQUld2WnA4S3ZLZXFNNHZDVnR6Z0lGTlR2ejZsblBlT3loWWhXTVVzWFNNK1k2TVNaUWxxOG83b3BIOE1wWm9lYzhzT0VEVVdHV3hheFRaL0p6ZmY1TjJLS05adXhOZlQyMHVNdzFpQnVoQ2d0enVHZ3Bjc3pqYWswdFU2RitmdVQyZVJTNG1MUG00ZlZOVzltS1FMUStNSzVQSE1UQXhRMGpBQWoybWpnUjNOSXFoMFVZNEFEb2JNbDYwOTVqSU5LRHVLRjY4WmFPQ1VRTjVqWXVuY2R2SWwyWktTQmM4ODc1OVVJOElhWXNWUk5GSDJRemg5WVNjbWt1ZkFybGhRRVcxekNIeW1rWEFaQjk0WUlMK1owelNpL2dJbEpwOGdNcXRHaXZ4bUdUSCtIRHRxOVgyNVQ5OHBzbHR4NGZtNko5M3FyWlhJcnJhTDJoRXZiTTloSWkyWGErVlhacWhtMVVJVkdDdHMrOXpsRXplQmI4WXhqaENDVlJZZUdCaGZaYjJjMHBhb2d2aE5IMGIzRVB6OWcvMnFGaXZTRXdZdDY3aGNRdTBkRkdSYmlUSnljRUZYaml4Y3dZTHYzblEyeEE2SzlFdkkyRURobUkyZGxRajN0Zm1DSE5QdlQzY2p0R2RZVWtxNVVCYVBSZ29EbWh3K1p5VWRPRjF5WmhteHA4bWJnWi9WYkRCc21tS2ErMFdxZTF5NVMxNTFMekVJNHBrL1kzNkx0RWk5WE5ZWVdMT2tmaVBxTFkrRmg5VmVaaE9CdHFTOXo2WTdKOGc4RG5aT2piK3N1eWVsR2RJc3ZzQytuMXB6Qis2bmd3MG92blRXWi9XaXBMM05nb214b0EvdWdmRnFTRS81QnBVZ0QzenhlU3ZCUjB1T2NSWExBSHAzNkZHTTVSUUVsSkFFbXlLUmt3b2pnbVVXKzlUenJIMzZWWWhSb3AvcFBsaXQxWG5uR1VERGFaKzhxdTUvNDdtUS9jSnJVSFpyenh1T1JCUmJiODV6Wmx5QVVWZDdjVGdTNUJITXY0aWRCbVdCWm8xZFdTaW9kcm02VXE2RnJKa3FGTkRQeU5Zd1lkeDMyUmErT21jcFhuLzhrVEUzdHB1VjJEd2JhRmxwbGUxZmtCQy8yZFJhT1NSaUJZUFFMQ3ovVWZjaXpoUTlXUm5JS0s1czRjV3IvZ01ld2h1aFByZ2ZGYkdKY3NpUU1BNC82NTR4UzdXYWo0aHh0UzB6cUlJYk5VZjBUbWdZdWVSUVBhSGdxRk5RWlh5SzkvdHV6MWJWUm1WMS94cUxtNFFVYkh3eEtoSVR3TlduVVNJQXVvYlBaSmkxVlNMa1c0T25kSXJUWHFaSzBXMUtLaDArckZyZjVFVW00K1RvdnFuMmYwMmJuVVp0ZEoyVkxnU1R5eFdseUJHTjN0NE9SbW43bmVjMTF5VDI5bzZTWXp2c01MUVZGN0dOQXMvYzRWMElGV3ZEMkFIOVlSS1Z0dDlLME5qcGZLWXRlYXJ0NjhiVk9VZFpvV0JXMFNHdFN6Z2U5QjgyZCtEamoycHlqcUZwSDJxQTR2QnlEdGEvcGNPaW95R09uczR2Q1VPM2dITVpQZFJZZUo0a2k2ZHVuU0xSMWhLU2Y0SzBOYlo5SXZFU05wa3hEM0pGbEhXZEoxT1hFNFJWbEt1OGZvcTVENll3Um8zWXdiNitrckM5amtmV3dyUjM1ZXo3U1EvczlHQTlHOW5McGNaaFROSFh6T2RHY0UwNlJkM1hMcS9wRStSbHBMQmZzZkxrODZuK3UzMVlhTm9mNmZqVm83cGdGb0xxbGVXRHFxei9jaUlyMmp2RVNIcUw4WGUwU0FaMG81WkxtSjhzSjRtQjloMURwVlpmaUJnTy9YcG5KMVljeHc4NEIwcU9obUY4a05kVlRKMjBMOXk0aG4yTXZFd0VoSTliOVhOeVdXZG1jQmp0ZXhDWld3Z2t0bENRcnlYcklEUWlmaUFQN042dlplYlhRY0JZcmw0a1pDTEZVZjVzK0FjQkRMUng1eG84VG9scmgzKzBwaUhxV2svazdLbmNFZnU1Kyt6Unp5WWt5WVIxTHZMRHc1S2ZpMXQyWS9EZkY4RlBEdHdXci9CT1ArOWZ3d0owV3pkSk5acUdTenN5RTZKZFNvSEZNOXpIcWJQbERETHljZTh2UmlnU0RYd1pJbjBJekU0azkxVkFUYS9pRVNQcnp2SXlTcVAzMmhHMjQ5M3dTY2hsaWl2SWhIZTh0VFVUVndJazdoTkxBRTc1QTlBNGRJYnFCcGI4QnVMNzdGcFhrUkFJRXdWR3VVdXVEcDNHVjJNQ3Bob05aWC9QaXRib0ovVHhDVngwUWVpUXA4bHVKRzgvSU4wTlA0U0RBakw3dk1MMUt6YXpzVENxV2FvUEtycFRLeHErVzlSTDBVaDBsWWFaZ0FkWHhESFNqUDlMVkVIVTgvYTB2UktxdGEyTDYxcklUQ0VCL0FwVWwzd2JxbU1hRk9xdE9kRThrYnM0UkhDS3JVNmxHQnpCd1MvS2gxbzBFRm16L1JHQktsRjR1UlZ0RW03akxXQVRZYlQ0SUlRSkxwZkVqbmIrOWRGcUNuMVc1dXpEYSt1NFRaZmsvN3VBZk5GMXJwYTBWV2ZPcVRuamxIMEtDVW5UdVhuLzlpT1FQUGZvczVweC9qL1dpdzdrSC9BK0VtVFRIemxocnRTZkxncEZOK243ZklNSStMVFB3dkNhOXphbWlhYXZNWkZiU1JFM1E4dDZhSktyb2JQZmFnVnRUcTFyczBPdkhYTjAzN1NBS0Zsc1NWSTErRVllUnR0WXNJU1hYTVVIUUNzVDYyRzcxMlRNUEMxZ21SZjhxUUFhK0dlSncwRnptM0RrUnRVVEhZTm9DRy8wWU1TMmFhMzlOVjJtS1NyTC9JVHRmbXArY3pWNG1jNDZHN0IzSmlvanBlYWI4L3dMbUpkSVNiMUFZT0kyRG1XSHBPSnJ2Z01zYnJDeUxWeTEzWm9OaHlTbWtJaWZUUTk5NlBEY1B4SUdRT2ZWOXF3QVcwOStadExxSmZ1ZWZaQW85MG9aYngrMlkwTFZ2Wmdwc1pJb2lXZUs2OW9FdnlWMTg3NDVOdXBWcjFtNkh6bWgzdGtURzNTT0EzMGtGTVJNYTljc2xoZVNuK3YzSDBtS1o3OXFkSElDblNxempHelRjY05kYm1hL3FsdU1ZcFBZMml2VWRMYTREa1hlOElnRzd6M1dvcklzVmhpS25sUGFPeHhpc0N3anhua2U0V0ZTcVQycnQ2Vy9sdEp2QzNTcElnT1VETUpyWkhoUWRReVg0SGJ0VzhWTnVTdENrZmVjQkRjRkd1WFVCb1AwdVpDZzd2UEhXZFZiNGhSVW4zQnpKckFlV2xod0FqSnFIZGhVWlM4UlJpM2xuY2w2NUZlSjQ1NytBZ2JYSC9VZTJyL3VscDlQbXdMNDM3YjdVUU5VU25LTSt5UStMd29NMnp4dTlMKzVnMlEzakNmdzR4VmNVQ01pRm91QmdHQUMxNUR6U1NmQWtSUlR1ZW1oRWgvRGM1RlUwa3RoWTl1aHI5a0N2cWhOUTJFUDFpemxVZUhONzluRmlnckdwbjF3eHIvSldoa2pONnRHS2kyaG91d1FyTnVwWSt2cW9NZnJ2b0JtU2FVSWlIZHBna0ZjN3ZEQWJGdGhyRUlqUW5FVEN0OFhZc1dQYityNVdzaGJYbFgxZUoxV2pQeXJJcXI5bm95bmpHUUFTYTJuQTZyRkdtMnJLRWxwRWhBakN2Y2Job0cxQk55NmlzY0JUdC9QZnE3dGNjNVBFQlQ0bXBLaEpmMTJuZXZBRmUzUEx0eWhyYUc2NnN5NDZzdzNkVXJlVG9qalhFc2laeXUwbEF3aXFsREtjTDRQbXhwNnV6Ym1UWTU0Z2ZoeCtBSkU2bjdhMmFEU3Zoa0JrTjUybFF0OWxlN3ZqcHE3MHptN3JteUJ6SzA4SlRJa0ZoSEZXOW1LM0JKRWcwQ0hvOVd5Rk4wVTloY3hRdGMwLy9Pc05HMmFDc3Y4ZTU3S2hkV0JOenprVUtSV0t5dWhvRjRXQ3ZKTlp6NDlrVWZOZDFZcDNxVFZBTU1ucjdXd1F0MzdDL0ZUUjN5YjMrbEJiRHZaWUE2ZzhRMDEyV2xma2JEY0M2NGxaTmdmQU50QnFab1k4VU80U2JLcnFadGg0bVNjTys4azM5cmxSVnc2Nm1FN0tMdWhHZUZZM3ZXWjJvWnBnNG5mSy9nTE16ZVJ2cFloM1Z5c29OcitYRVdURCtNdm8ycWVhN3V5Tk5YVDJiR2ZhdmwxbGRNdnllcXFMRWxldW5lZy9rbkYySTRnelpmZlZJTHA1VzAzc3BNZlBTZ3Z5MHBzbHZ3R3MvSU5lUCtBYkhKeEM1VTkvdXF5alkxbVR3bTFocjRJVEkxaUttcDNrbjQrREZMQ3hOdWYyMHNMbGdGMFgzekE1TVpUQXhDT1NacklxZVNpOHVGR1Y2VFE3WTJvOTVndnBXMy9hdzhOSHl1Q29qSUFicDJ1U2lBbEZPMXRTdk9mNmcxejVpRVJROE1odzRRb1R2Y3R5dEE5RUprVHRuUXJ5MWQwb0U0ejJUZWpBWVZ2MWtNRUgycVRZUmc3WHcwY3lHM25FNytSYjd4czBCVlhkckJibTdqb29Za2c5V29HSE1JU0VSRkFNNmhpOURiYlZMVXJ5UlRmUWdaZHlyMWxIOFI5NUlSNjNobFRKWkc4OTBzMEtiRHo0TFNIY1R6RGN5dmxzMG02M1V2YXU1MFdQT2t6MDdDNzk4MEgvSU1mVjQxMCs4Qk5HUmhHcitWVlJ1eUNBWnExVmE1bEp1ZURBYkQxNUlUa01ZNzVTcllyVktOaUZCL0pqNkNGSzFLOXZtZnk1MGV3eHAyTE4rVUNNQ2VKaUdvdWpNYjBPcmhnZFRRa1BZNU1ScmwxK3dsWm9lSkdaY09BTVhQd041ZjBjR3psRWhZWjBNMkdUY1VQcjFBYUsrcGttWkJjTTFwOHNTZTh1ZGtkSUsyS0xwQ1c3dzNlWTFaVXgrM3dQcTRMK0dOODFJbkVIcXQ3cnEzNWRlYUNRUHZDN3VpeU5aRWlzK3pVamVkQ010d0FzNVN4LzZQSjdod2RBU1NId0l4SDZseFh0MTEzVWFBWXBKNkVvMDVXaUI0R0grRFlEZUd5SzUzZmpYbTlGV3RFbjVjK0c1anV0TVdaV05MUnl1aUwvSTRCazhCZm1KY0ltWkdOK0YxajUvVW1YcmxyeWlZZzR2eUllaDREQktGUmVTS2Q3dVhubVJsTTc5eVRJYUxvNHJlSC9ldkNaTEVPaHYrcElybkJjaXVwU0JTU25pMlhOY2N5SnNrN1pXSHJvNXJNWk5HN2hIRUVEcEo3SFB3SXZJdmxycllaMkdUb1FzaUxWYjBwNFlab2duU2xCelp4MGhQTk5sUno3cEk3L2Y3TnlLTWlsTkRZSDAvMURNL0tKb1B2MWdjTWZONVFTMXEyN3Y3aUFSMTVXM0JCVWRCQXFma0lZZGxZUEl6ZXhBRUQrb3hqcUozZ2ZhUkhoUmR2eGszRys4bUg4OHlnRzdoZFNuVkFFbEhQajBmS2NnR3lIVnZLU3laYVFxckRKVndYTkZ3SWEwZDNxWlp3c0xyZGJYL3dOZDVoSjhaZHF5clo5RWZlUXl4ZWFzNjNNUm5kMm15YnBRUnlvZ1pJais2R2pZdU1ubFJnVjRQRG1CZEhsQjVaTjlMTFhlQVJZb1k3bkorMnpRY21xNXUwUm14cm0wdFJPNDV1SmdPQzh1dHZ2SUpFVXZxMjYxZWk4ZmNvUDEvaGR5UDM5eDNoM1VNWVJHTUtsYlI0MzFPZDNnZGpsUmtPOEtVWG1aREhnNVBhTC9ZVmRCNVFXOHArQXl0RU1oSW8zTzZ1Q0dRY0o5RHVyRkMwVGVMazZTaFAwTG5COG5xbkhVMkVqWUx2eW93ekhZYXMxUXVpQUZSa2ptT0ZtTEEvUWF6UnNudks2MW5qNnVvRzg4bVljeU0xNnhINjFsNEllR1d4S0NrUHVJRFF4UUl6NFZlVVJKbmhmbzBEamJqTHRTM2EvZ3F5T05QYlJrblZvaS9SZm5hSThjbU10QWZra05wQTd4QjV3VnJDUVBSNTljbGVCdUFmSEpwVnpFYzI0SkRUR3IySHphd1FnQkRjcjBqdmxwakZxcktXeGEvOVN3KzlNTndzMFN6N3Y4U1ZHOWlPem1QVjJnNldLTENIUi9UYTlRL3VqdmF4ZmZMOVpENDh2bE1DT2c4YmorK2xLbCswY2FZZDhlcFlldlZPMTB1MXFhWCtMREhSRDZJRXQxTm1vNEsxR21hTEM1NUpKdWxMZTUvM0NmZnJIZTVrVHNRd0ZiWldyYmV4cWtIRXJYeVM2NmJwZ3Z2UWdnRHZTSnl6RDdaamdLSUdsNXovVFoxYkJ5NkRqclUxQXM5L0Evem1Yc0xxdkpDZjVOY2o3TnMyMkowMk01T1BSTEs3VzAwNUtBMGFZbE1nYVkwRkVDMENTNTFFVVpnWWNaU2F5cjBBbHdHVjN0eWpockpIZkRXcks3N0hoMU1GOVd0czJtTnp3MEEzMUZTdGpHQXZpNXdQSEsraVpCNlIwY09PeTlWYlVTNFVFS21UNm5iY2J0K2hFczdPbmpKaTJmQ3dVZTZtblZBNm56Q2c5dkwyQXlHeWdrRUxIY25NQWtleG5kTFF4dkx6V2JSYWpkODY3OEdHK0lMblZOcU5uZkV3b3VCbGxCU3ZYOW9uNVdRSWVUSlpIVXd4UmtPQkkxVCtoODdVZWErRUZTWjkwL0Q5N0lTWDhyRUxrSGlaa2NrcUQvVVkyNExEVHVmWitiOUhGcXZOWUJhdnp5djhWRWJqZEg0RVhGRk1XMk52UFRFd0wyRXBOQVRtZGlvSjhMZ2ZENEtGbUFHeUJnanNpSEhRbW1jQlk5dkZTUDdHeGl6MzFDUlV1RiszSkRvaEc4bWxzKzVQVWR0OXhQRHN0MVZvYWVYTEdacGs1VVZzU3FHcmZMTnpiYjlUSXF5d1JVQUlodmxRd3VzOVRpVlkxUjBOanJFQXk4dnJCTEVLZHk2OFh2aWZudnVhVlptOGs2aHYvY3dkK1lmY2wrQ0VEL0xENUYxUjRITitoS3pYTzZPSm5UUEdFSjU0SmljeDVLRnl6dzNoL3hVYm1qZWpqVERncVN5c3FBRXJwMFhZWUd6bS9IbXJ0OXJRZlphRjUyRSsyTWI2VGJjVngzL0xXOGtsdmhsRWxhRnRJaVZkVjF0Zjh1TngrQUI4cVFVRERlTnpoeE1HRnc4ckpHVGQ5K1Q4WXRtQytqSm50TkdLK0JFNzFBNmJPVGdudUtyWjUydEt6SkZTZDVtcnNsMk5zc0RpWkdjTmFnTXlrRUhHLzY3ZEhQYUgvYjJoNkhhZzl1MW1Mc1J3MzdiUDk1dEFtZUEvTDFkdUhRU21tK3hLMWtNUUhUb2w0MHZmaDk4UmVSUFBaeEZQTmdSMStLdStIc0dMWlZPYnpKT1AzbkQ0Mjh1WkRsWGlJUDRBYk5yS0NQSE1EQ3JVOFhqKzF2L2xaQU9oeWJyMkZ3L1FqYVcrdUc1Q25Gb2Y0blJwYzM5cTNydFhTWHgyYUtvNFd5Tm1HcC9MT3VjdCt4VEIrVlY3ZjlwbXVJc3ozNDU1Q1ptOVFKbVhiYnFxRFBtWHZEazdINVFoeEQwUUIwR05uZDFDMHgzTFYyVk5pQ3YzUkRzYjZWUUdsd3FnLzZiR3A3K3gwd1E5dEh5MjFlVEZYU2VvQ0FzeVNQRmdYUEx3SjJpQnZScTZJNXNCL3M0S0RiQnJLVTh3UzN0Z3UvY3Q3VURXWThtdmpzd0F5YTFjYitVMElzMHFoMEp5NURDSSt0OFRFY0Y2UXI0Vmg1VEZNdElnVkRlOWk4Ylo4eE9GTnRHczVSZ05XWTc5amVaeUlDamN4TUM2Z0lwdWJtdExZSjA4elZLdG5CVVBFcXNhaXltL21PSi9NTk1iT1pFT2k2Zk1UTHdlMGVIK0Jta3FPMXMxdzRONmtocHpnM3lIRzBHck1NQi83TzI4Wnc0T1pJc1p3TnU4QmVCeEVCeVJObnRyR3FYc1ZZTkNDZGp4ZUhteDAyZzZJVUhYVTg4SmxlTDIwZWgyT0haTjlqbTdLTDI0ZFV1UjZIL1k3K2RPWEV0dlY0WGMvZm1ZZlNXcjBEdXV6aHppYVdHbjdHRUFRTzFZd2dQSEU0dWIxaUVab1JqODZEVDM3c1htWVd2OFc3bmhiZFpLV2xhZjQxaE1JeGRrTzl5Yk1haE9DQ3A5cU8rOHlOeldnMDkySWVBaGZ4L1Q3VVNndkhQdktUb25DTkF1K1RNZnRMZ3pCeDZzbDJiNmR3czQ0akpIRmkzSlE5aUZPMVV0MFltTWY3bVZxTzFOOHBOc0poTXZQazBvR0t1aHBTS01NbG1BSllCR2x5bmhzVDFnVnBvK1RDZzFHekFjNlBkZ2hGV3NmUnBob28vMUVHZWFqWmQvVWVYenViQmVSWW9rSnExS1l1b0F5NHpicHNsMUlXVkJTSUdVaUY1SUtpVG1veE1CQUQyc1lqU2hxcVdHK2hGODJFdTdLZ1ZJM05UeExjeHpWMmVzVVh5Sm9kWVlPK1ZRd0tyTTlFak0wVFhOc0EwOFMyekwxYm5hK3VIRlZVWmFzWW1zWVVvR2Ntc1l6cmRrQW5VQ296WWllaXdNeklQck1FOXpTSmZnZUgrR3JxVi9BNWpjM0ZjenI3RmhaNjQyc3ZSbHIwTWJic2J6OHM0cFF3cXRrMzliUmV1NHMyeDl2a1BMZkVJTEhYVlJzeTlqME9hTTM2RlA1WlVxbm5RcmJmVG4vZXA5c0N3VENYckZPU3JrTlVnek5zSldLUmJpZDdGc2RvYjdQWm1ncEZZdGx1ZGNhR3A2alZFd0FlMjBhTlBKa3U1bFpVL3Nralc4R1hJWE1hRFh1M21reVNwdHVubWNNUWEySHJTeHNaR0hZbXR4RXZqM2UvWWVnc0owRXlzNHYrcmw2ajlka0hTUXJ6SDZMVkY2NTZTZkVzQUxFN0ROeWNWUjhRN1pSNnRjbkhtc3VNeWs2d0FvQnlpUjVsOW43T21nWHBqTmphNUJpc2RMZW9DeWRuRzIzQzF5MEw3Wm5JY2lNRjJBaTNzbWQ3c1BpOXlBTWxmTlNzNllXRUhOandNK240ejE5c0VYbHA2Z1cvWVd2cE5OcWYwOWRDelE4NGZBb3ZuNWxrdUhyQjJlSGxlWlp4MU9FTERoVnN0Q1FVSC80WG9BR1hEYlJqak1PM3dYYUFxbHJvWWQwMDVXTDVxbHNKRUdQR3hDeUZPMGYyTUtQNERZcnhRZDZrdldnTDc1YUR6eXJPaElwaGJUT3NHTGZTZW1TN0h2blBHdW5xOUpEQUE0N29uNW5QQy82OUJ1cmpBbWswNjFxNE9yV29zRTlacFhPcnFwWUtPbVh2UHVKZEJUK1p1c05UZWx5TDQ0UlNEMlFySlJGeWZuNzgybEpNR245SHJnZi9ITVVsbzlkR0UzY1ZVL3dWdStxTGdZNTlEM0J5VS9ZU05JMnBHRFV5eUZ3QWFsUmJLWWRhZ3hsTWdHem1zV1ZBelc1K05IRXliVFE0S3RoUGNvd0dUUkppMmZsUE04MVA5b0c2WWVDSThxcGdpSEx6WXo3RnJ1eWNnV1pKaVpHemtHMU8zN0VnMlI2UDRQd3paRExDeUprNlhIWjRUdE5VRy9NYUh3cGIxUmRIS2dpcGg3MnNwbzFzaTFybXZWd0l1WTRqM1RSOW41RVR6a0dIR2xTcGZQTDFEVzFzWjJ2VEc4bklVbWlxME5tQmJxaUk2UDRoRHpDR3NtY2wycE1aTlRnQjFXWmszdWE3WjhyUzJEN0xaeHJnS3BFbVhNOG9hS0x5OGdJbUIyYlRDa1dBVnA3Rzdsa1kwVXo3Tkx0YU5IeWx6YUV0VXA0Z2dXdnQ2Sjl6RCtBU0E5eEZnYzJFdkZhdkl3MWxxc0lKYWUzNTA0RzFUV1BvMmkwamVPWEI5djd3cjNSalZkSnJuNTRsa05iYUltdnJsU0N3TURGSjNMNzV0ekRqWW1Cay84STdJRW1nVGgvTVZNYndRbW0zbEZJblVHNW9PVWxtSjRyc2tLSUxkd3k5ZDlVazdibjVUZENRT0IwZkg1Q0tzbzRjT1RBWUZQMEFMUzhsN2s5Y2JjZXp6TlhZU0QxNXpiVHB6aEFvMURrbnlZN0lRamNpU284amNyTU90TTFhUjF0NSttODhRVm9PZTFwd0xtUFJyanZiQ1Q3M0NDRjJScExoSnNZa1FNeUFadW9xcmhjYm43ckdPbkxEcFRWcDdqZFVjSUR1Mkx0WVZROWFocWFjUzRpNm9oRU9WVDhhM1lxYXBFOE5rZlZWMjlyMkxWOEdDcjA3dXh2QTFjYUJqY1M0eEZqazJYZEROT0J0MmNJNVRRKzZpMmgvTkZDVmdCUVRQempQeUtBNkw3NlNVMkRiem9pa3lwOWttWUdmN1UzRGJFNFk4UiswMWRhNXp4aVBPVHkzNVQ2VTlTclRsVlJ5UWhkbU1paitUcW9RWHdicTFqVEpNTEtWMjVIaXMxdDkyd1p3bDJ2dlUxQmgvYUtUT29VdlZ2eDVaK0pkVHFYNmRodWdLNWdsMWxvbG1haTNlbjZCY08wUVMwdlZ1c1ZaQXViNVU4dnltUFd5MWh5azNja3h5Q3FhSW9XSVJOK3c4ZDk0V2tLR3NmS2RSL0xnQi8wemxkSmN1VmE0MDEzVFlGNDZKS1RvUEtna3BpQmNha3hXcDQ1YVpDNUY0RXorbTZ0dVVxT0Zza2tDVUY3YW53VkNCMWxSYlc0UTd4azEzOFJ5bE12Z1NXYkFLeUdvTm1keUpoZ3BDTWlpSkhEZmU1T1RKMDJRM1BFajMrTGhrbm1rbGh3VVpIN2swZWpZejFuaDA2dTJPb1c5SHBSTFBzOXVBcjljckhYY3dQVHJ1bi9XMnJsVk1jMDdySEt6WXk1bUkyZzlFcG94SmJxWmRmSytVOHZqRHZwR2xVMnhFQ2RrRHk1cVkyMjhMenRScmhQdVNzZDkrTUY2eTdDY3F1RjhLV0VidlV0VDk3dHBPVUM1elBSRG5lRk1pMXF1dDZRbGlPMHE1My9YdUZsbmRMVGFybG85YzlWS0hEeDBNRlFldy9GZDdQaWNQVGsrWjNHUUVhUGR4VjcxY2s2enFRTDhGQU9ZS1JaRk44dFBFY3BMSjBObExWWmRkaEJobUJrRUdwcmw3TVM2bWtNYmFCbkkrbnNtRFhjUGNpalFFOHNobjFSeTJHTDNwTE5BaWdUL2lDa3crdWRKL2kvdDE2SmRnZ1BjSERFbVB1TlZZUVcvZTBVd1hkaEUzSXFET3ZyMktUMzdOeFMzRUtHdjBuekZUbGdlcmoxNzVGSkZuNkUyUUJ0NEhGTEJjdVZ3Nk1mY3FNOFhTWlp0RTQvOHlyWCtGaXFiQ053U1ljaHJXVVNtK3AxOEJsOHVDNHZzaVBkL0w2VzE3MHphRUZMMC9iUm9qVE8vdEtweVlISXd6UW5qSnQ0YWFxTjh0RGswSVVSWXJ4VzcxeCtaRHVMYzZRUFl2VVZwTDRna2U5RFNzeDZOMUVrTWoxMWxsRmlTeWhJR0NKMnROQWtMOFJwNlBwNnpML003bG5UeEtvVk12TFZ4dm9JZ2t0NWY1dit1NnJUT3N0SEtMNHZUdFpYblZTdnhic1dSSkttSHVNelpuM3gzN1VlMXJSMjZhdzRPcVd1M0xDSFNUZ3RhWWI2YzRnbXBNakR5TUVpdlE3Z3B0Y3FTelJhc0x4aDhGVGFFeEo1alBIMmNtREFFRW92VTNBc0g4VjdaS2p2WkplNjdWWTdJNkxmZ1I1NS9GRmgvRzVtVVVZM3V1dUhQVjBZYmU1SU9PTHR3Rit2VU9jNjNJS0FyMzJ6L25iMWQzdWIyMWJTNWVZd3J2Ym5QeldqRElKenVWbStsVG1yVklsTzVONHhpMnJaMDI4MW1ydTlrV3l2ZC9EWXR4TWl4cEdlZ1FCTVhyek0zN2lNVjBsOFRWVWswQ3oraElSMmVMTlV2TlRwTWhzM2RxdVBuMWZPempLbGRhNEpyTko5elpQdHdrSWkvbk8vNmlEY0VFMktkUmsxUzlnc3BUVFFLZjI1eGR5ZVlOQnNFZDdxa2RlUlNYN0pKVXNZcUNIeEdqcThhM1VnM0hvUk9XT2M4QkxtVGU0M1lNbUZoSm1sOFg1bUdkVmxrK0o1Q2Y4UWpKTGJWK0twSmRPUUE4cFZFbURhVVJEWlhObVRYZTFhdXhvUXhoQ0UvdWo4Tkl0UlVQT2RCRi9RS3hvam9UVzM4WEZBVXNFNEZITE9LQmIzbExFQTBETThtVUcrT3ZzbG5QOGtORUp3NCtqb1FhSThRZGhsTGJ3dzEyeHMxNk14dkhqTVNiYVY4eUtzRmVNUnRnMGhMczFkWER0U0dxUUt1cUtLSlZSM3NjSmVWZ1d6NmFQbDY4N1lsbmkrMUZOMWFLME14YWhoSWw3akpYd3N6dWhyRkRHbmNoR0hzYUQyR3JqbTlqai9RMmtkeVhpQWs3ZG9xYk1uanowcWxhZEtuckdyRTJrM1NGRVYxWkwrWXY3ZnpiTlFIK0dKOUxZL1dwMHNVUkY3YU4xZEZiMjRqME9vcloyblYrQUFrT002TlNnRjBIVVBqclZrY1h0Qzc3aDREQ01BTkZQTDBROWtudzIwNlNONlowV0oveVZZa2dGWm40cHJYR1dNUWxUQk9HLzFLS0p2eFBhdDJpaWM2VlZKNDVVZFVLUXNmSnFoa0hKUmRySmVmK2plUDAvNW50UElTQ1F1TVFYcnVrSFBZcUJpTnB6L016RTlUZ28vRzJ3d0tKTXpUZmI5TE9WTmVIWE10VmhWbXlqcUpZUGQzQ1JvMCtKcGp1SmdqdXNYWVRKRU9DYlZNTnhKRUF5UGMyeHBYSks3UitUdU1mNzY5OXk5eGdkajdnM3h1MUNqMVhHdTlveGd5Q3ZNYUdwZW14SmtFS21oSDdxQ0NLay9iYmRLM3E2TUFjNmVpOGNWakpqRi9RaGJwMUM3Vks4b1VpVnpiV3dQR09MSkJ3ckpYeEt5bSs0aXorZUNMUWMyTTIydVVvVCsxQS9ybkpaN3pkdWloUUZOVldFa29udVlCUUR3cjhLQk9lVTllZ2ExSnBRMVpQTnkyY1JmdjdleS8xVStDUmVOZW1sdHE3bVBIbWJpUnM2cVNNMkZzUVdGcUtoQnVWbGN6QithNE56aVNrNVRybEpqc0V6RzN4T2FSV2VSNnY1ZWZodm0rbmVZeTJ1SnRJdXRmeUt3OUVDWDBCeWJFRk12NXFyS0xPMjUwbE9jTkl2S0I4Qjh2WGZXK0FtWHZFT3dOR29BbGM5QkxKdk5VZWw4NTRubE5VM0ttbStIM0RZMXJRcnB3cTlzZnJZMEk5NklpZFBGdW1aWkZZbnd5OG43NFFjdXpWSHJORk5ROUF4Q3h0a0J5YWdsY1VBZ1hHTHI5WEwxSHh5MWlmV01aSDcrS2UrcU1tREJhcE9IN2JTTG5SRm1uV2ptNFZCc1k2S0JKOWx6cS8zb3BMVm1xdkt1VlFIeDVvL2xCQjJ6SWpnWjRDaW44M0VuZ2tESjJTMm4vTUJhbWg5ejFWcjQyU1VJRU82ZnlaQ2doSGhqSkx3NTZsZllVcE1KcmVMOHI5b2dKUU5RYno2SFdHaUp5RTNOcFZhWWF3RFNKeVdwb0p3UXVUVWpneDdJN0JpQ3lmMzhPNkhDOFV1dStKQ0xwWnhlUGk4U3REa1JqSXBMSlc5b2drU25iUERsYjcycGJUV2s0RFdobnpWUW1VaDFJU1B3VUc5ekplS3d2WTF5eFRIdWMxK1ZSdEhtTjU1T29lLzFhOVBMMzdwanJ4UlYyQUJTeW5SRXBlSU8zdjcyRkZnS2xvS0I4L2t5cjBmU2lUZDVBeUZrMkZTYXUzUGxMdmY4T0lRTnBJaVZKbk4yVkl2TzZieEpLMEFabTBqNkxLOStHaXJ2cVU3UUtZWEMzMnBYUGwrekVidzRBZ21aZ2RrVkhCUWI3OTA0K2FXekRiY3duSEVsYUNEY2JieTNtdVI3MEh0bmFuREFTSnpJVFg3UzFSZ3p2bVcvQmVPaHArb24xKzlWSlQ2NFA1UGloRVRCWExCZ2lYbkdIOTFWeTJmd1JXZ1d1NG91RTg3NWh2VFVYa1RSV0pqKzRUMVRLanI2SXdLZzc1dmUxR0FPbHBnOWxQeEZySHFhQ0E3ZVZWTTdwVlNrNCtzWDYxemdDd0VwUTA1VzRQVUo3OWgrVGdwWG54WmdQMkNjV0hRRGFwREVTTU9qK2JiN0xRZ29RaEQ3NUpMYUVxbi9aUG9kRGFFM1k3RS9xcEszQ0dqTHJkeHh4c04zSUtZY0hNcHFvd0NuK2Nsd0xNMVUxdU9udHA5ZVNhWXFzK0xHVHhxN1RHRWoxL1htdjBRVmtLWW9raElneXAzeFM2amRPYlkyNFZOM3BsZTdoSzljTDZtUE5iNFhsRm1NT2dvYkJWSnJaUWVUNGNSZCtqcjdKbjRpUkFFVnlBbit4NXRVRUpIOXUzK0srUlhDZlBKbXQwZW0vd1ZQRGQ4YXZDU0M2Ym50U0J0ckRoQU9BU2NYMEJGeURDR0NTMkNuWWp0c0dQQURIQkdqR25MYkFqRTJBQ3djUVgwckFxRE5GczdacXZxa2w1SGV1Qm1xc0pZQTA2REhZQ2VWR2g0Kyt0T3duWTZoQ0EwdDRYWlBEd2dIa09kL2hxWTNNUjBUTFJWL0dkWE9UZlc1bndUb1BLMGtQU2pzd2F6SXc4a0o2Y2V3VC9JZDRjSUNpM3pHQm9FUk54ZENEblZaNXRxUnpYWUZia0dkbis5ZGhkWVU0Q2Q0YU9vK0tiZGtUVm9jbGExUmQ3N3Qzbnl5VTFYRnVUMFZnRnBXMlREbFY5TW9sZEFzaWxaSDB0UEZjam1UUHFzQ0U2NGRpakovVW9rZG9sUkNqZ2ZmNGlVR2dsUTVUN05rbTFlTE83K2FyVWVtTFBqVWJCdEVIb05Cd2dkWk1vMHFkdS9KQUJ6ekhGUVgyamVtRnFBTTlXa2ExQTRhWHJuUlU4b00rOHhacWF0RjZMb2lFQ0VVQTdVWTVNODJyd25UZksvemRza1lJSDRsUmJTc2FqQzJZVmN2ekRaYk1pMkJUbTFncCtweW5FVzdZcDRxa1ZaTFd0NmNKM0EyaXkvNjFJUWRibXdsQlNQRStpcGRrS0dzYlpKNytBWkN2R3lkM1liSU50U1FSNzRBd3AxOWhzOHdURkRFNlJNNXV1TFpJSlh1YVBrT1dYMUd0VmpOWityZlBRdDhJeG9rYXRFNU5pelVtTTIyRlU3RndwYzFTOWZqK292RU5RR3pUMnljdG9PWk5sQWJleXpVZ3VteWNBdHFnc2FXRXY1enpvcGl6ekpEUXord3VDbEdFaC80QUpCOUJhalkzNVJ0WmlUN1ZGb0JKeEd2ZDlYVndJY0FXRVJ1UzMrK1NtQklWWWZhNDFPamRtV05qSitQUDhhQ1gzbVNrYnpMeXVkYzVzZEZDbEtHRmQ3Y3A5MC9XWWNaVUpuTkYzcy80cWxhTUFhOHNsK2FxS3lNMndHa3M4MTlQTURkZDRwaWMraElrZUlEMFVrOGVJY0YxcisvbFBna2VIc3BwUkxQaEh5VzNaOVE3SzlXTzJVSGxLSmpTeGt6Ylh4NzR6K3ZLK2djRDB3ajVzOVpPaHlQcGlpa2dCWEpuMUJ0ZFJCSW12ZmRTcGpsL0V5MFFLeWZHT3RpRjFXYy9lS21MK29CQVA3bDZ5RFhFQlhtdU5rNmhvdi9FZnorZEkydUF5QVZLcnJLSU1GZDV4OHRZcUpyTWdFeDBIcDRYd2dERG8rYWNUb00yRlFFUU1PandmU2gwS082b0kwUDhwR0pocm9wTWVMaFdwS3piRklMQjAyVEdQWkRtTGNCeGRmQjBjZ043OU9qaDR1My9TMkQ3V3R4YktOS3g5dmZLaVlwMFE2N2QzOXE1NXp4azVSUzcyODJ2ZE9jMm1QS1U0MnFuVFhyb0UxNk9vOFdaWVhEdU1DR3NXbVlHa0d3QzROaE9kU0oxUVVINkVOZjVjWkR5ZWRTOGpRUHRHMjBQTXA1OGdmQjlud3N2YTJBcTQvVkFvZlY1czlhOHJ2aGtZKzF5S2puUkJiWWY5T2NIbktrSlAxc3V1NVJvWUVNT3FOVDAwblR5RG9hSzczWloxMlFWc0JMVERvWStwWWoxSTNHQkpMeWdOQUE4KzlRZHBMdWxKeGxnQmM2SHB1TTZZV3RWdHljd3VOb0c1WERqcnU5c0RLVnRCcXh2WTlvbEJNN0hFZk10SHg0Wm1tUXRZSjBOOWUwZC9JU1ZEdlB0bCsvQWlHSEtweWNCY3MveU9SU20zTVQ3TjVBYzA2ZkN3SkV0bjkwV1RKUERNcFp5UTBwWER1ZkZZcHRyM1BBaDlKVDRyYWwxeWNVL2ZxMEJZQVJMdUNySStuTWc0bHVJdWJtU1BnYjY3N1lYOVhUNmtobTVnOC9WSHQrMEk2RVk1enBZUVhqUGdaaUFWR3ZQYzRvbEtYMzVMMDU1TlQrUjRsbHZjL0Y2WkFWVGZDbDhVSGhYTWNxbk9FcFFZVEVlTzNwMXFvWkhBYTB0eEUyWE43eTJkRk83dXU2WnNrSnNhc1JBb3YrRFFHVWh5eVFGbENEbmpYMFdqZm1xZTk1YmJvV256eFJVeDk5N2FISkEvUTQ1WUZEYTczckIvRmRhc1JpVlVJWGJzUjJEQ2FqRkJVc2Q4ZkRZcmZmRU9VTXQ5ZDd1SVRGSzNuRGVOL1RyZ3F3dVhxTUJUWlpObUZ3U0RwWkxvMVY5TnQrVUg2cWVZekx1YndOUCtabmJBZTFTZzdIOVRiL1ZBdU5ua09hR3l2NVZrMncwZDJGNjVmQlQ5dTRmclAzeWh4SmYyU1QxSUMzWjBMV3VqbU9QUmN0aTNEdDdBL21BcE5ZUk9uWjJCemFvZGxKaVZGUjhLL2VUZFlNMjFtcTQ0VXBmZTdwRFpOelk0WTVmc3QzbktpTUpiQXZES0I0SW1UczFjY1FaTXhISmRTSEJRQldEek81aWNzbG9ORk9BQlR2VHdaUm5RSzNMb2RUWmc0TTdpRWE1QWh6b1FZMnNpemM4dTFhVExxbU4vMmxqVW5KblFGY3BKMU8rVEFHNm5IaU1Xc1NaTlNZekNvNlhWV1Bpd2Q5UTZneW1xQmg4U3hGUjU2QXNVa1FncWU2eE5KZFVDT0c4ellTN0hHL1h3STNOK3ZHMEx3RGZJRW5vUHN6SkR2UjVLZnlFSTJ5SlV3azByeEliclJmaEZsTjREYm9tZFFBOTkzS3I1N1JNNTI5dXd1NWF4Zk9CeTR2cFo5QjlKMzRORVY1bGU2RXN6OGtkeHZ1RzZDc0ErVWdGdFlzNCtQUkF1eitJRFNQaEI1NGFqUTVCaitiMU92b0hvS3VBcmI4eUh5ZEtTOXozd0o5Ylp2aVN3SDhTVmNrSW5lbXoxN25WYWQ3N2dDVlJyOEJsbVBCUk5ycUQraW5LdE9WZGtGTVc2TldGak9KeVFuUjI0VUFITW5LUFEzQnhxZ3M5V0dIRnlaYmkwZWt5d2Z6M3pxVG9jQ1ZCdmJtcldBVkw1NnRCcVR5VThZYlRpdCtZZVptVTNrR0ZYK2o5bUx5Y0VNQWJ4ZThxL2txU0k5YTYwWmN0R2VBcnRxZHliaWFyZjVMeFY5NUNldjkvci9hSmlOMyt3dnJZSEJjbkc4dXRrZ3YwOEtFVmF6OVR3ekRsMWh4b3Fvc0RMZkVMbi83eEFOUGtJU0VGaEpmQ3ZtQkhJdUUwaE93eHBzNG03M3A3d2ZUK09LSXVveWpNMHlZVG9aaDMvdnczeVFxRzY0WGRQaDhjTWZyK2dlNFhBc0l4STlLaXo1UG93OTUyWVIrUDhtYjhSVjJ4eSswdDlkenl0WnhsUDloYVRFK2MwYVcxdmFjeWRWMGEwWGNYTnRJVkU2dVlvb2lQRnFBdFp2bnhVaEtYU2tJZXArRitNL2NsOHo3OVZsTHZnYkFDSzNxT0NrSi9jNVpsV1NTMHdkRVhIcGFUVzVpOHZidmJyN2hrMDlKVm9Td0NWRVplVDVVSTdSNnZmZmszSFpTVmNqdUtvUkd5UVdPNGNDMGRtdWNSRHp6MmF4cll5QnNONkxUc3A0V3ArVjY0K280VFpSbkhkNTQrR2Z4bks1TUdLdEU5Yzd2bkd4cVpoOEJ2YmdCeUxKVGFZdUR3ZVJ4RjNMc2NRNGxMRmJDV2xRV0lMcjNGOUtjaksxdisySXUrNUV3NU93ZTNzZERnMEgwZ2swcnpyNDNLT2RTK212L2NOdFNEcGtwcHV2aE5zM3dFaUlRQ05qdUhUcjNObEJIT0tpL3NLMXZZM1pwajk4WURjNGcyVU5BS3czQnFKN0lZc0E3QzVDUUFpVi9BekVSMGFVcFRjUkhzVWpSeGtGMEMyNFZyckxtMDVhQTFPMTFVTk54V1NmS0RNU2xIY1d6QjlYZkpMR01qRjNxRU1jSjFHNWZUSXRMREtSZGk1L2Fvd1BIVHczcXBLU3RiWWRZY1RRLzVWSndlWldEOFpWeVp0ai9RZ0Rra1lOckhhVHIxQW1tSHFRRThNWGNQYW1ndTRaTlo5M1FEb2tBbW03RG8yN1g2RXhJb3Y2ajVJQzZIQ2NMY0oxUWdXY1pHSDJibVRIZS92M2lNS21Cc3Uyc2xUb0dUTGU3SnNiY283Zkl0Qys1ek95a3QyTGJIOVY5QWhBNlFFTEttUmk2L3I5bGRnRU5QbEc5aHZQMzVWNmhLdDBVMTMyV1pKendjbEdsWnIrMko1cHpDaDZ4aWNBTFVFUjdxU3VOUGhCSXZ3cXVsVGdHaVJTVWFSMHpqSVFtWC9qcVFaSEpNQUx3SFh5cE5VeXVWNkgxdTZPNnV3MW1pQkM1cUh6VHZsZnBiaHBlTmJ3TGRtcmNTN09CdTJmL2Z1WVY1KzRNOTFLZ1M4M3FZdFlNd1gwY01FUG1TTlRVRGl4UHdIblZUUU5CQmxVeXF3VVhQaVFWTEhscXZpdzR4RnlBaTFVTzg2cjQwWEdaaDlIQkdXUFFwSjdmOTBleHY5TzhoaU92K05xRXFaeUlUZmRDVGkrK1RZa0RVYkcyakRseTl4TEMxaVVXU2lGUEdwQzM0S01OL0ZYWHNyRkF2amtoTWh2d29nUFYvT01vUUhUaDRIeTI0cmlNSTE4YkNveDFuUW1ab0wwRUNqOWpMUkVLTy9QeG84cnZPWVF6Y3pKdXhSQlJwRnNRZVk0U09Sa3h1WGxQTHN5TFZpb3FwcG4rTUVMV1ZqUFBaTG4wMEtRSHRSSVlhei80cmo4MVBjWGUyMCtIRnZ0K0FZei9UY2ZzbHA2U2NqQm5CMVdwTTRjcVJwNGM2Z3lvS2tvcFpqdU8xRFRzQkVxdW1uQXZSRDlQYVZNS2JqUWdTSEdFMGRqQlF1Tk5IQy9yR0o2MlBqeE9tMzdqRkNYL2hjRHdJNEtHUDJwWW13bVFkK3N4L2xBY1pvQmZXQVBXVjRCajNLNEM3dlRqOUxtdFhQV0dOczl6YktoY2ZEQWlyVXRPWkxHQm9NUWdKMU1UNGlKMy9ET3g2d0VTaERwQVlrdkR4bGszRFBXVjFWLzFwYVc1ZGpvR084N3NWQk11aHhUYms2NTdSTXRuckZtcW5PQTFzd2Z3aDFocDlQQUpWTkFaK3RrWHVFc3UvenVFS3E2WlltamNQL0tDT3M2UTRpdXhseFpzUVZZbXJzTVdNcjBVWHNLaWVxakVLQ2FKQW0vdFVxVXRQTVpISDhUTkU4MTVRZGQ5eVZIdkJISm5BeW5GbW9BR0dwbjdqRGFUNzM2bzAyRXpkTlFXb01HMmdENVlwK09pY2wwb05taC9BbVQ4Zmw2YkY2OXJjd0NXRm00V0ZXZU5xbVJNWklVY3FtaHhlTWVWNS9MRUliVzlQR1dtb09tTkZYU2hYTzdKZEpJd2V4eC8rb1gvaFROVjI0bTFyQ3R2SGx6d1JySG9HeHNFN21wcE5ZTk8wV09XQW15NzVkL2FPaUZ6M05abUc0N3ZnYlNQTURLYjNqcktCQzUydEdjdnNwU0lLZ01nVmhlTmV0RUFGWG5HYm9KS0xRcmRzQTFXY2FwT2N1ckxRZmFVTnl6NWNVUUR3V1FFRHNZVUlnYWsxSkl0YjNYeXp5NHcvTld1cGtPU1BCZVo3dWp6OHhlY1h5alRPRHFidkdPTU50L0toTk9xeHpkbktYcUxiWFVVdFZnUWlwblVzZTU2Q0tvQUorQkIxcFJ4TVdHRFUva3hNT1NXS2lldlF2SmNxV3NtUDUyTk9iRlZWOG9KdWphb3UybU93K3lrQndCV1ZvYnVCUlA4Y1JQd2dBbUFjYUorZG9JMlNzUkovYWZZQzR5c1VMRmVXdzJYV2E3Y01nR3FXdm5FNkg0MStJNitRR2szbDRITVRZS2JveGtGSFFWRmVoMlVNSkxCWmFIQi9Dc3M1T0dRTDRkWnlHdHlkOFcrRUc0ZFp3UGpJWlRNbFBtajFhZEV2TThjZDR1ck9WY05VUHkvOUk4Z3BMMHRwd1cva0VNaUpBUmVmOHR0T2piQ0h4ZSszdzlENENiaVZteGt2QTFWUXpOZXV0U0R2b0VMTkhueXZ6b0s1YUdWck9Kd2JpVWxlQThqV21FTDNpTnVKYlJ1UTNxNVlPeWRkVHNqWUpYQ1IwYzI5bUZYdms2NFNEMm5FS3V0bXBZTXZ3WFNUSXVJTEtJekg0Q0FnSUNBZ0lDQTgzMi9RNzMyL1ZTWDIvYUQvdjliOC84SDJGZDl2MlMvNy9mSC9oNzcvTjl2MFN2OFBxWHI3ZnI1YjdQc3o5KzM3RDc5bjJoSDdmZjQvWjcvVGgvWjd6WDdmcGJyNnZySnYyZlh6NzlYMVZQNnZySmYxZTNiK3IyOWdOaUF0TTZRb1BxenRkQlB5ejB1T3QwWjZRVjVLM2szTmRkS0Q1ejRvc094dkMrYjRsaWVXbkR2cGJ2cCt5RzdmUVcvTXo4R1l1djY4aE92SjJJL1JYNkk2UkczZDIrdzVoaE45MUtnR0lxNTZISFErTU13d3RhNy9HR2pQTzloNWtEdkJ3N0pUSGxrMlpCejl4TVJBaDh6MGpyMTFuL1JVR0hJL3lVV0VCVjBvbVNYM1JWQVhrZnZkYjVGMDZoNkMxSmYrcHhvVEREbjJuaS9IYUZTWVdwRmJtSDRDbWF2ZElsOVN6TmxZR2hlVkFTdDQrY3ZEdHQwMTc2NDVYNkZ2cHpYekU3UDF1N3Y0Q0ZwaHRNVVhSa0FTRzBBMVNoa3N0ZTI1bjJPZ2ZTalhQZHpVNis1RHFxdkYyNXpBaFpFWktYamc2TjZWQjJZNVlrZWt4OTVBVnRWSERudTdDUDJmTjVzZnIxcTI2RkFaVHpMdmE1bUtiTHpFMzVsYzBWcnNJaGNqVEZoeVB0cFRPYmsrS1lpZlNram1uR0lCa0xzQTM5N0Mzek1SME80ckxSVEVodGNOdHU2VnZWOE8vaGRPTWdCQmFjY2t1d3RDQmx0STE1RTBRQitPZlhaTUZ6cVIzNCt0N3pvSG1IRDZUZWViOUxpcWZrd3RtVXY5R2U2Um90czliK2d5ZFlrSzdpR2VHNVE3Sk1nTFJhZWltYlRaZkVlKzdaeXdTc28rQ1F4ZkxSL003VmtEczNHQ0tSaUpRS0hvM3ppczdFM2tPcjVMWFhBRGtBVW56UHhCVktiUDNMWDIxZnlTNU4zdXJqMXhTZElJZWxZRXRnaEl6TnBwYnBQQ0VDdnFkekFoUjE3bGVzLzZpUW1CeXlneE5wRmt1d0hhUzA5dXVJU242U1p6cDlrZ1pqbjg1R2dkTUkxV0FUWURhblZWNDFrbktRTzVodzErVndMNTM2N21sTXQzQ09UdUpaOUFjekIzbjMyWXhKbVNTZXdyNW51V2JGVGtrcWUwRXpJNk4rQTUvSSswNmwrREMrNUFxTjU4WTI3eWVBeFJJTGhlU0krVzd6Rk5Rd2FaZVlQN0RlL0RIVjFlYldPMFQvUC80UzhEV1BwQmF1M2NTeDM3elN4Mk1SZnIxNVVrQkI2U0YzaGdIQ0pFVlhFaUVabDByRzQ4ZzhKRENUczllZnFRaWgzSzVVZ29kMDY4cnJZVHJvZURwSkQ0TEo4TGpTTzBpd0tpQjh3c2lsbDkyMElkZFNPaktTUEt0TGpMTjRsNGhpYTRBVC9lNS9VNW1YN3hSa1M5WXBicTlFcjdRcE8ydWpxUVV3cXNmUGxrYXBBUEU3WWRNWjJMNldubUl0dzRCY2hQTWU0b04xQS94ZGFWbjJIbjdCT3Q0R25OZTRVN0RXV094M0tiWFJua0RrTWFuRzRXVWN3bmxka1VMMFdsNzRNSUR3NTh0MHJqOHJLRVBMdzVmK0M3VHdxcXEyYVZYSmg5YWthN0FUUXVsU1hYN0tYTnZ0R1JORGFERnpPSmxjYStkUzAvMitZeWhtV0IyL3MzQ25pYnVET2FmSjE5eCtsVnp5QUdHcUZvUVFFNzRWcTlJaFh0eUJZcmpOcXRRR0xIaGg0eTJjTmZvUXJlMzYwVnhEcHg2amJrd0FobFpzOXRjVnFhaXh1OG1zSTBKZE40VldMMjlMYi9xUnFST1ZiZ20zMWdEamdBOHArWmx3eUpBbGR0ZVh0YjhPZStyZUgwNkZNQW4rWld0dlVRb0Rpa2cyRHhTSElpMFNxMFRaUFQvcURZK3FSNFhUcHlYWkN2WEllMjZJZ0tvMUVubHZaM0doZjlhdHdQZkt6RUdWeUMvWU12QWVZSDBwbTl1TjAxeFpkYUsvWWFqTGJOL2lvcnNWRE9aazJmNHd0cmliM3YvTytoWVMvdW52U0o4LzJQbmxPNnZLRXBmb1EySWE3Y2pCcFBDckxxTzJtbTZiOE9hczdqSncxeHVkSnlrdElNZU9mQXEvdzh6TCt5Rkd1YlF3UkRtUGJuSkxqbVI5UnJqTitydHJNcGhQdVZlNWVkUzhPNEZPN0tDQ0VLbVNUSWZhUk8xT1Rob2hBT0pGUGV1SE9wTGNDVTE5UjluQWJoQWQvT0w0YmptYkZyeHp0ZDYvYnkrUDRsNWhDbWlTY3lmdUJSeUxWK01lemR3MzJsSnBMR1BodzZraUx2dUhJNFZEZW93TEJqZnZYSTRmcTBiSXY1cFJrb2VNOEtDb2tsK3pnUkYvQ3dLdXZSNjl4U3g0NGpyWDlBWSthR0lKMURJMlZDOW4yU0tWTnl5V3NzSFhPdTVLQzQvczllRGt5TXVHejFnNE9Jc2h4NmttYzFqdlRoa2EwdmxLRC9ycVFNWnJPellQVXVhWTRxZC8wQmZPU2ZlOENwVzVoVkdNM3ArTVVPdVY3OGF6Rm1PTTJnU2VqcE0rZnhSeStWMnFCMERIdkwzWEFOcnNaKzk5ZFkrY0dwU1pVR3hUNE5kK2s1dk43blcyTVZjUWhZMUFNb1Q5Zk4wV1BZaVhDZStaU1dnRGthdnNWZWd2NEVZL0VoZTdkMmpqVjV3eVNKOFVwM296YThYS3ZKVnRSd3RjeXlSNkptS0RyTDFDcCtJK2d5aWJEM2MzMGJpZVlzNDExcytkNjF6ZTZxTHVwSStMbWZTdGl4bkZoNzQ4U3RxRVorTVdvNy9WQVZSMHErNGJOTGpFd0llMEJRWGt0L3J2NC9saWdkWjhob0Z2Qzd3cDh4SVZSUEhPaTUyNHR6WVBZcTUzenpiODhYTGxBcmdlbEd6aFhtUS9KampTclhKYmFCMWFIZyt2dWNYeGs4ak1tTUVOeVBWNFFnWFpCRHhZTWxsWW0vb0pBdkk5VmFNSU1jenNTN3puMExaMzh6VkY4RWtqY3F1MUsrenhDWStEaWZ6aDVnUGdYeC9ndk1hc2tuTXVURklxaWFYbkw3L2d1WUhib09kZml4MTAwNmZ5RmJ2dzlBZWJGUGpWeWlEMnZGYkl0NU9uS0pmeXZ3djdpci9CZ3Bmai9WT1BTSTViRGw3dEFuKzEvamJWR1JNTWV2cGovTW1mTUNUY2E3RmR5R0crSWJOciswUnFHWUdlYWRucHJGNk1ZdmI4QlQ1NUVydVJwQ093d1dqK1EveThCNFFyWUorWE93VkVSZm9RMm1ZMVEzYmg4bWJmYU1ScTNqMTVKNFJ4U092OHFXQ0o3SXBvRWFaZkloRG5raXUvT1ZjcGtqOFFUcGdONTFXRmJEeFM3TmNwN2dJQ3hTQTRTUnBTeW1NYm5tSEZvWno0VlgrRnlXcFl0eGlua3BBb3VGZ3QzTlBUMUtwYWhOaEk4eFBkbDc3RFZjSFBCZVBtaVBwaVVlTXFVeFlFYW1yWC9MVi9XOXo2a3p3aTMwdVIrbzZ6TEtWa1VFMDhBODhjanNyL290YW1OaXpkY0x5cnZDS0N3QTVpd2dpVTg3WmV4WkQreDI2TUFsNG02Mmd2SjhyMHRMTzBFRjg4RXZBdTNPVGM0ajhLSzNhaUdPM0VnNEFTRTJyU3dGNkl1dllyU2VSdjVrWC9SUHorc2Vtenhhc0x2cFptZFR3RTVSVURKaXVtY054bUJzdDg2T0FTT09hOGlpOWdwSEx6MU9hQXJKbHBQbVliellEUEhEZEZna09iWWhFeXFaVVBMSzhZdksxbjljZlhveWl4OHdKbTVQdXJtWGdxeUcvb3hwWG1QNlEreVViQnI0L0pwdS9GU3FTWkczMk16MmM2VzBSZkpvZGR4WjlXOXdaZ0ZxYklSZWI5V2kwZkEzVTlhcFgvQXVpakltUFpnMHI1MmxXS1QrRlhVT0xtWnRKOW5RL05DcStYY1RVV0ZYcS9MMDhpcnlCWXA1QzRzVGFUdTE2R2dUeGpEcjRPUy9pQU1sM080N1hIaDRDODhwU0luRUlZcXQrZ29FN0lNSlFEa1pvd3pmYUxsZGZBYWkxVElSSng4SzNyVkUyanZGcTJzMFNzZmpVNTJqUldsR2ovQzNIN25ZWUlRL3cybHFWYmVyTGNOMmpiZjhzaGdvQ2tDTlB5SGJxa1MraG54QVNmb0NOOVpOUFEzRTRUa0dzV09GS0RZVDZmV2NKNkl2eUhabUF2OUlXeFFZU2NIVmZJeEZydVQ5b3RZVFZlaGtzSDFrMllqeG85RC90eU0wSkpZOXlmNzVnTkZrWi9keUo0bmh2ZE1mbW9CMnM5aGU0WmVwZk9DcHlid2ltRFdFd0ZxMVkwbEhaMmt1c2ZhdjRzbTBTTDB4NDhDa1NHRXNmZG9xTVhJTTlJUkwvUWk3SVcveEJiQ0VOSSt4eTZWdjcydXF2Nll3SXJncVU5OGl4cGJveTBwZXhseW51SEZwMklORmtBcUVCTy9pU2lPYnhQemtrTjlwUkthN0VWbmU4VUFuMVpoRHlQK2I2UUdkc1BXdkVpYUlmcWkrVHBrUnlvM09vSXljQzArVVA4aWVoR2J6SjVzM3NLejBGeit1ZGNUNDYwTFZxZnVSMVZYTEJoODExL0NHb0Z3S2pzSmNzMmltVko0NUI5OWQ1dWc2SC9iclVSdUFibWU1NGFET2N3Mld6eTBvZGlYcXlzTzIrUDhXTXBVV0RPSWZKdmpOc1pPZVk4TTFBRjFib2xtOS9md00vbnFFQ0ZEWS82TU90YVo2MGRoS2x4dllrVk5RVTg1Ti9VWmNmVzVvZUdzYmRmUmVTYzhnajNlaWVBbElYVmZ0VVZQRkc2RTlxVTczLzUrWkhoZTk4bWw1dGtrQmVpUXN1dmdyaUN4c2RnZ0tYTkRWazZFdXNmdWJMZG9UQzg4NXc2aUZXQ0JaaVB3ZWwvZ0dqVHhHd1pRN29NaXI2a3NmY1F2VERGOXNSOFZ4OFdiQlkvejBkcW9ncEhkK0RWZzlSYjRYY0NCQmhyUEF3RGFoY3lxZ0pVM0NDQUNDOFR1OGVzSElqYnZ4aXdVTUl2VzNsUU9oRDJBbGdhMG40R1kvVFFaR3ZocGZuWHgwbGNiMTEramFrOU53ZGQzQzI4K3hFYUxydFBrRDRYMzRlVE02YWQ5T1lCZStBSDVXaEp4WnpzQ0Z2bktyVCtySzM4RCsrdkdrNXl5N01raVJTUmYrUlgrbG5OWi9KV0NXNnJwbWtEVzBzTXVISGVScmVsd2NxMFV4cVZIS1h3WlJESVBWZzhHQlE5eXRSd2NsQTA5Q1FyWGtTYjQwKzVhWGI0SXpvZ3F2NTE5YUxOUHh2amNCSzRQdzFYaGxmNjhQb2RUNFpEQTFYVWRPaE1tRmY0anBWTzlCenJqT2ZsS3QwQU9GeTFIMjZXM0lVc1VQTjFJQ0NoYjdwVllzeGUxR2MySHFXSjJNSGUyUC9oRnIzaHVBUkE0cWo1dllTQ0pORGFVQm5pZTg0RHpBT28za3FzK0VoRk84L2c3b2VXcmpaSU81anB5MndxYXU0MFg1V0kvN3B2cHZMS2wyQkNWbFRNSUJ6aGJ0dzNUc3JGeUpIUUcrTWdaSXlHNWhkcmwrMG83RGl6djdsVU1XVnJkbUR0NnJVUEZhb2JWNG9RRUQzc01IMXJRMVd6MUUrWWE2NkZEWXE3UWVPcU1PeUdKSlg5UE56SlNYVTBNT2IwSHF2Mi92cEpDblB0cTI4ZCtJZUw3ZUFCbjREZENZb0pEejd0YVNpTlJXVXYvUVRKWFhVdWRXaTY5VGw5MHpzZm9Ob1RqUWg4bWtBdStiNWtibHF5MkR3MXk0aTA4TWxwY1lOeDd0LzhiWStsS3cyR1JBd3hHem5rRTdQRG5Fell3d3FicUZOQVFyRllKQ0dwYUVuS00yeS8xbWdFd0s4akN0MklWZmdWc3A3UzVMK0pyUzg1Q2lwZ0xtNVpjREtWYXNIWVRVRExRU3ZnUXFZM2Jpd0V2UTlseFhzWnZWdnpSUTNwWXFQcjcxT01iQUpGSjBhWUQ3bVhzZWMwcTZWWTQ5Yk40eHd1ZGFqcWpCSnVtd3hLdCtnS2k1OEFOalU4b2pDUy9qL004elF4TUpvdi9NamVyYXdUL0RCR1ExVUU2c0tTdTc1NDk2aG8wRmc2NDRYbVhkUU1jOVhYOEtuVEZKdlhPMG81bVQyU3NzTGNkWXJTakZLckhLM3pST2xBTDRWblE2MFBZNmZMUjF1VDNSSXcwcDVYTTF5aUJxY09MR0o2U1hBRzdTOUhsM3BiR2RBZUF3YkdCWDVrb0F2UWNqY2YyTTMrakRxZG01czZDRHpxT21OcEczWXZDWkNtbHJLZmZvYi83eEFkK0kwSE51Smt6R2ZaY3Y0cFVCQjZ3YTdoMm9kdXdBaG12S0RoY3VscER6MUhpbjFkOE9UM0psNEVKN0x2aEwrUWdCeGlpNHhxeG1MZHMrc1d1UmJjSy94NXIwaEovczJabHcvTzZZL0VJaExLVVI0TXhtYXJjMDV4Tk1XYWphNlMzbUdhTXFwaExpZnZFczkvdmNnV2VESXI3SzFYUWIyVUw0ejhBelpuU2dvb1k3cDVTMGFoaUNwd010WVk3UUJKNm5RMFltYVhhM3NLRWVNRUp6VzAzcWROazFGYXQveW5iZ2RKcnZwVk5tUGZpR2VCUEQxbEoxay94dkJxdGIzYzQ1TG1Qa3B4Q2VISjJ3ZnAvVU5PK0dNMU5oak1DQlg2aGFCV2ozMlFzdUtqREc0R2Ftb0RVOXc1c3ZFK251VVk4d3pIWnZ3QWJvSExLdVRRL0FiZlZJVitlUlNiTW5xaFdZajBqZXlaMUhsRW9EMnhvWFFVaWtMZjFJOUFuYlcwMkZYR20xYlZkb1hKZ2ZKNWZ0TnRRbDFjM005K0RMMWxDYTVMNlVkUDZRTytabDRjbG4yczUxNFIvdFJHQ05QSm05QUVjMzVrQjV0OUMxblZmL3ZlaVY0Y1g3Y0s3SFV0TUF6NThnZHUxaFZaZldvZW9VM25qbHdmbmlEUHpCR0x0QUF4eXlDUDBuYmViSkdWcXlaL29qTWpzV3l3SXE3a2Jwa0ZVd2duemtuOXpzRlZpTGkzekpZNFhUMXQvRTFna2V6Z0x3c0QwalhYUkFjUkZnZkt1R2xpNkxNa1JaVG56OG56N29UY0JiWlJEWnM3OHdITktucmhRa0htd0YwekZvVDYvRkRZSE9mcVNEbThoNkZVUjQrTzNZTnF1cVYyVzNNZHBDVC9QbnJvaWhxL25NdmVnT3FNWjJKOXFvbHF6ZnoyTjYzNGtoSjVNTnRxa2FGdFhmZnllR0toV21TT1k2MlJhbGRzRnkrNWNYeGEvQ3VFMDQ0YXA2TTUxenVuQVdDYTRNaDgwb1dQeFV0cUowTEVXWXhJOUhMdEs2cytOLzNhODBNQTZVUWRBbUg0eFZaVnJEa1VTME9aV2g0QUNoK1dpbE9BRnFkTFhGdzVrNFlyc2trY25KRTNVYmt3UHNMTXF1cnFpNTFOaWNyQytXUldRRkV0OFdaUGlwVUxQWENQK2g1Z3EzZzlwS0pBZTFvbzM1UUJjMVFwb0RQWHBWSlNjU0VqOVgvWC9IZUo4b0Jkd0pYYk1xanVSNUdUSlZaWkxBb1NuVEtJZHZQckNvbjlxTFNmcmVFR0pmM2hoaG5PZ0NvN0lya0ZpNitjV2s3RFdSbnBWK0VDVE9HS2hVSjVrQ29teUMxTTIva2hwUnlxZDlmZEs3TkxWc0F6dTVoNnlFSExyeFhPNGxLNFgxS1Z4NGtNNWhiL1Z2UFJldUg2MUxzSjlOaG83S3VDUXdjOVZOeWZxZkNjYm1tcUozWUwrWWhwWlVKSWRqdk9hWEpRQkxyMHZ1OHplZ2NDZHN0VEUrM3kzU1ZnZlp2d0hpTHk0d3kycGh1M0NQdFFsaVVDM0tDMlpUMlhacmxDV0Z4M0dTS2pKNjZNZzV3cnVkQ2pnNTQ0djhmYVFibFUwZ2NOOUZocE0xT1I0V1l1d1lDaGozMW51eFVJdXFUZzhGdytQWXNPc0xYU2kyc09XNHdnWm1XQ1FTejJaaHhxQjJLQzVJYXhTZldLMVJHaVdpNWg0QmtDUEpIaVRVb1BCaEhCeGRvT29qNEpaUEZuK1g0bXpBT0dmL2VTRUF1RXNObHNFZ2w0b05aSTNlSm5nV3FZZ3AydVdJTDYrSGNWc0t6MllmSzRWNEJVUXprLzNEQzlWSDZSK3gvV2xPQzVHT05qRUFaRUV6SnpGMmkrRFBSRkNadHAwbzQwbmRBb01mVTlPZm5jVm1qNGc2NHIreW1mWm9NSlFMMHhKOHBGcXlhc1UyNnptYUpOSUZmUUhRWkE5WTNZVkUvbGZXZWkyOGo3Q2RNc3FDR0QxeFNtQnpUVEViZWhFenliUzUyN3Vja3kzTG1Uc093d29CajN3TmRxRUJOcGQzK1dDbXNndW03b0tiR1REM0l4VEtXTWlSMTYzRkxmNzNnMEFoRTEvQUtDV1lHTDloZkRGWWUreGtFV2xiRGZHeTNlRHNhUjNiYkFNeFl1UXBKdXptbXhvM3F3eTBtdGp1Q2RCRkltVUJoeHNnRUQ1ZEI0ZlZjT1c5ZjFjVUU3OEp5dFBiUVJrYUZjMWwxSHc1Um1tVmJPZEdpNUxtSzYvUmVNMlBTRHd3YnJ3NTU2VjRFb0RNWmZBVjQ4SGh3Y3ZxVjVSSFNUQVdVRmlUVjJSeXZOd1hzV0RzMnJFYVBaaWZWUFBIVUFocEZWclRVbEJMRDgwUnk2SU9uV1hDWFlDZ1VCVmhZdUkxcHVjcm9La1dtbzI3ZVNoZk5UUkUrdXpYd0NMVTBIUFBSZ3R6YkVTVmFON2RzbXU4ZjJVeFg1TVJZTC9hdTdBUkNad045RVFXQmJQdGFER2V2ci9ZYjBOeC9acis5NTRDd0cwWVQ3Q1pHZVF4WiszeHFDVTdrcGhDOEpubXBSQ3gyRnNBOEkvUllrbHNOOTYyMnZoZEVyTEFUZUdOc3FoaWhYNXlLMmVyY2hUTEoyQmVmWGZiM0dpMUZuaU1sM0gzMngyY1lHNm9LN1IyaVFxMXFyRXhnRzJOUTZ3bnlNWXVEQ1dWVytOeThsMG5NS2NQTzVETk82Sk1hcWx4eXFUTFUvK01mSG80Um5NbldnZ2h1YXBDMDNaVkEyN2tBMGcvUjFoS091R0FWL1FadDZ0MUthRFBnVnY2eW80WnZMYngyN3FTYjN6V3FXMUNBbHlKS0wrbUZJMHp3K0NEZ3hVeElaSUdEQnhlY2dMM0NRdUE0VE5qUUdoRDc1VWxoYkFob3UyOTJMWHlwSkZYR2FoL3c0czNENzJtLzU0ZXppSmxTemNrbkJCdVV5NlhRUUpKeGxVWURRZmFZN3ZhZmd4eVAzeDZzWXpxWkdOcEMzdUpmTE9tWW5NY3NEWFRodG9KaDRSYlhFS2x5Tkl1RGZkay9iVVNteEFuZjJJMGFyS3NtNEhQam9rcjMzcVVwZW11aGxrZzVxMGtzdkU5MkhZZnBPeVgveUVQelQyR2d2K2h6TGxRZCtCTFF1U2txZHVrTTlPeFFEejhsYmUvMXp6TFFqT1dnOHZMUWJOczB2WGJsSmx2T1dDQzdncXhIbWRXaEZROGVjQ2xTUHJVVHMyblh2d3NyVTc4YTdTUHo5cnhxRXprZ3lvZ3NyN25OUGdpNTZrWSswWHJJWkwyOWV0NXVETHAzd2VOODhTQjdoVXBIcUhab0owT3FzRXBFSkc2UnJmd3d3eGNSVzBwUFFQSThLTWsxUEplRE9KNG51Sk9UYXNpMGNmZ3JRSlArak11YTZabDR5cy9YMm5VNXhHRjlLS1lrQ01CbTdzWlpWbEY1ZFdoQnZsaUdXYVl0Mms3ZG5iOHVZVHlZS0pXSlptYzhxcFZQcTFWTkhWTGVUSm1OMFlSamtmTU9RMU1JZ2wxVS9DZnhoWDZPNXBlSFQ2NS9xWmhvdVBkRTdIV09RUm53bEtYSDVJdHR3UWsxVUZoR3ZOZkNiWmY5dmFpdTVKMjhselA2Z2RxNkNqY1FrWXhjUkNsRURiZVlWYU94Sm1EOVBrcVgzQjZMblM1bStYbldvdFg4Y3hUQ1JSckpCYTArMzJYZzZMUGsxNXlYWjNtR1YrTTVENCtwOVRHNTQzSkxQQi9td2lsS0dJdkhZRFdNOXN6M3VDcEI3QUpSUmJNck96enBuZ2xIRTAzbHNIampYS1BBcjJRTkl5MExWTG5BR3FmaWFqb3JqVFRNYVRCMjJNak5rWVh0NmdTaEd5dFpZQ3o0T2MrbzRUa0ZHNkNwQkpOMU96U1dVNTFPODk2aTA1bUVDUG1zbktoQnZUQUdkck5sdnlFY1c3Qk53UVp0WWFkYmYySnArT0RMNGVNeTZrZERVUUlmcElheVNIbUx5SHNQT0FndFhsdFlWdGZyUElVOFBNaDMrK21QTEhCeUkzd1plREhQcGVSMUh3UkdSWUt3OTRwbW11a0JwRkk2YUdkSUsrNHZUekVOSDdLV2FKTmdySGpuKy9OR2ZJSkMwS2pGaG1QZEdWY2NwNVdrekZkYUFxeUg4V00zcGZMUGZpd2hNN05GUGZqVDMyUFZUaWFxTkIySFJnWEpEWFMwdTJVMk83TnpHMXVLNnI1RmFKZ1cremZwd1dBaC9IV0s0ZUI3eXlDYi9VK2g4d3R1NUNWSCs0SDQ3QWw4eldXSXZQMFFhTU4zNWRGNmJRa3V1TGM2Rng3TXJqZDQrY3JReUM0N0krUHNhSktjTXkxelNFQld4Z1pwWlM0MWlURFRBTVRqTXNUYkVUMTI4a3QxNmNnY2swY2R4eWk1WlRRZ3dGZ1dFQW1Oc1VoOHA3TllXclZoL2ZFb1ZMOHA1Z0ZBYStOYllCUWY0emI3ZGRla3ZUbFR4bWlFVlcvcmRORUhIbDBDY2ZsaDFqK2tVb090NG12NlMvVC9Gd3g4TWZSQ0llYUovbFJPei9ScE1OSkRNZXBhMGEyKy9TS2pJKzNzZ1p5T3pEWndMSDkxNnMzU2ZxU20vaGg1Njh2WVBJdlBEV25xYWZsd0hyeDN5Nm5uTVJWdDF0bjN4dDZNMGhaUFN5V3BEYm5OSzg1aUFVc2VVR1pTbEpRTTV2ZFc4WE83THV1NUxsUzdHeU8yTjBpeVk5UjlIdEMzWmszSXI5Q1lQOWdSRkhoOWFKUVVTSDh3VmZGQk80UGZzVXRrQ1ljQy94YldZSTNBYS9DSnNWSmcydGh4dGdZaEJZYSt2ZDJUSmlvQUFPb3h2SHRTakU2Zld0R2FsZ2VlckxKVHlETmdLSGZ2Y0l5NG9xZWlhR29yNWhseUhDcjRYUkdJYmhNSkh6V2V1WnFvMzBqSlByYmpMdW81ZThJQ1dFa2lxYmV4Z3ozWnpQekJ5NVpHQWE3M1cxQndpbDZXbHl5aDZpcDloWVNWRHArcFVuZHhzRUhSMWpIdlpzZmpyd1hzMVY5M2oycDlXd2pSejBVdCtobDN5b2lWanFydnZNeklTKzQ0Wk1kb2xxUXBmdnltVjFoejRKN0llcTcrcDdQelA2OVcwcWVEb2E0VWJZNStJcms2dERNMnptMGZNQ0MxV1RzN2N2SHVVd09MWlUzUHlicTZ1T3p4M1oyTGdDbDZ3SC9MZGdjdm84aUswNXJHMHNLOFlZWmd3YkhhWk1FbElicTJLUVpNd2VnczFVdTZ5TjVJRHZTL0c2d05uZ2U1K0UxZ3Y4V3dpUzRqWVAyM3BrMThDZUE1OVkzSGlFL0pHWDlDcEhNcnRiOWd4RXpVWmF2SmRjV2lQQXFFdTlHL1p4dkhWZDBPU3dBeS9ReTAyTFJaUTFIbWRNb005Wnhpa2NBd0QwdDNBbFYycXgvVVp6SHRZWXEwOFdydVY5dUVCS2FTNXFYeE9pOTRYZHZkRDVJNU5oZmdCN2srT09GanRBelRyY3d3QlRUT2djU0Qyci9YYzZZclRiRnRNU0pGcU9BZ1V1RkVXK0tDNmhVbWNpUVZXckl5RlRHcUpXcjFTN1RiTmtYZERFV1AxdDF3ME5rS1lWS3N0bldUMTJ6Q1k5L2Exc2hFeUVvOUhkaG5pdkN2R0VvY2Y0VnRQNm1rNkJKL1FwbnhLRkVzWEtRMEM5ZkZHc0sxMnVlNUtVUE9GYyt3K1BaYks5c2VoNFBSVUF4ekozMll0QXBVVENuN1hDdDU1bDRnU1V1QlYzS01qY3BwUFg2ejZ2TnJ0R2FzZjNEQ3BTUDNRZ1lsZFRSakNsWWdsK3g0azN2cFV1YVU0QVJzd1orZWU2Y2hPUE9SekRlY2ZyZUNRNnJWcjRjUjNIU3oyNkVqaDJ0OCtDTmdoRWZMc1ViQ0d6WnV5NFgzL2toMFNheWFxNFU0U1VpVE5GTTBWVzJWbkNBZDRBVFhkWWwxb1ZwQWYzbGRMd3VQV1Nmb2x6OXZRM1hNMGt4WTN6Z2tjSy9GdThCaXh4Rzc2VTVDbGdWS2FoUG5MYUVyNzk5bFpGMUwrbytCSEhGWDdSZ0NnYldiNngvaWkyM1JmR0Fra3B0L1dWWjU1MjUrU1ZjenBLYWNRZHFDdlpiQUJCbEJkdkp2aysvazlGcE5VUmZ2NmxNNzlIemdYQ2tQaE5XNzFJbGlqUXRvcDF1VHFZMU4vVkFmaWNVUlUyNEo5WDhVY1o5OEM0M0Vqc2VSZjduQ3ZtVTF6cktNek5sL0x0Q2IxbXF5RkE3VVkvRWtZbjNORTYwbzJxY0I2eVV1OTF6aUpVcVlsS3p6RE8vUnFId0Jpem1XNHpBTkhKamZ2Z001WFoxenBJRlFTdU5xaEFQSTlhQWhhUUp0TVpyOXBEc3U0eWEzLzdrQzVnRktmbkkyOGt0YTdaSVhXVHpMazFIKzdjRjZYNUxHNDNONG1hcWJkdEpnRjV3ZTQ4bitiVS9vQXUvWENEY25RV1RRQng5bUpHTHA2ZHFzNFJGT1d2U3pRalRlaEEvMHBjUnJvYXpIcFRUb05uSzhwVWdGd21SL0syTndXRTg4WitISVN1VXNhM1o4eDB5S1p6empuOGo1OHlQdVhXenorZDltdUJ5YmxJVks4cHdKN3J5MFA1dSt0Vy9WSGNDR25aR1BLOUtEbFpYNWpKdFpMRWxFbGVoS2Fsa3hlRHNMZnd1N25QMWY0YlNOcXlNcGtQQnFYMFJmYXdyTmxCTCtZZGRZS1RuYUVQYVAyVk4zbTJTZ0l1bmNmY2g4dUxGQlh0cGRaS0pESVFINUFnai8xNzFWSTdUcGh4WUhBUG96a0FlZjdmR3FKaDFESmdXWXJZMVlCNkhvWTgyQUd0TFNROFpZejd0V2FjL25mVWdUSDlFZXJIUW9hdFE4a2ZqZDlEVW9jUXhibzRKYWZCR2Rubjk1QXFHUTBFUEkzTmVKNFpyREVJS2tyQmRkV1ZkdjhJL3Z2eTA3TTVZWC9zVkVFendIZDRZanNaRU11akdPaEF1MDdtcUpYQWdSV3ZaVkNUK1hlMHNLRWhmL1dEb3pRUkFPV3NuaFdwTFBoSDl2akViQ1N3ZDNQa09YK0NkK2Zxd1RLRml5cHEvQXNuZXIzNlBKeG5JYy9QU1dKME5aeFZGdGEreTFoZU04ZUlqM1pGT0dveGN0Ty9KdFMzTUUrR2JrUnU1bmRncUYzNmhGYzIydTBmUkhXRVFyRzFGMkJ1SkZlbWN3ZDhqallwVVJzMnBSbUdBZHA5UHlvK1p2NkkrZ1dReDJoZC9kRjNLUEM5bzdERTZ6QUd3c0pETXhMQ3E0Qk9DaEhEN3lHdG5mU0pKS1loL0xkdzRjSWluL1J1TjR2VzVCaWJUdTliVXQxRWUwc1ZGeEgwdzl2UHhheHNHUmhVQmFuRTU5NTZTeS91S3JzVGpwODR4SDZheDNWakpvNG5DeGU0V1E3YWVmVW52NnpSQkhCWnIrNXlVR0traEdzb1ZUTzZYNDFDOUNXazVCa21udUF4YWhkU2psdHRzQjhxZDVLUXVqRHZkUElGS25ob0U0OG1qWDkzWGpFSXROV3Jkam5zbytoVS9mN09VcE9XZWx2alBMalBHdVRlUVFoVGRqOEtRUnlmcnlYWDAzTk5lTkZLMGVWVkNGSFJuQ3p0TytPOVlhNFVyQnVseThiUi80WE1EamE2SjNHZXBJQUp1ZjkyZE82ekR3VXo5UVpxaVkzVWdqZGljMElPNTFGNUxpY0k1RERFNUxKSkI1WWI3Wk5rNG12NFFpbjBlKzUyYUtQUkowa2Ixb3BsMkxkODI3aGVqamM1T1MwaUVBUFhlVGI1Zk1xMXcrNkV2N2NKN1VEOHduTDZKT0lMbUp6cjAvdzJQUlY3VFRjcmx5RXM3ckkxbERqRVNTbFJkNHJ5cHI3VUVJWUV1NkVCdllLQU5zU1NpbFBvQ1ZKMktIVW1oSWw3aGNTT1l3SU03QkNodTF5aXBWckRqUldUYWcrNUZSUmxQWVBQQ09ibFdERHZMdmZ1YmUvMHNpVi8yQnRBL3hEYTVNeitLYm9jRGhBZHZxVE1WVUlEeEJrRW5XMHVoYStlVHpWcTFteGowTFdha2EyRDREVTU4SEgxaUVoWUJoYkRiUlR3c05yWExxVUhHK050SlRJOTZlc1hLcHVlSm5nNXRuYjV6R0UwbnZvRlgzNVU3TjZUeC8rQllzMFZNRjgzdGl0TjRvK3VHNzg1cElJQW5xd1lmK2hkWjR2VnN1Rm9zMjFQZHRzM0tQZXBUN2t6STBtaGU5WWF1OG11bWh1a2V2eU85b244TG94dENFQU5lcmcyTmlKVDY5QTJJUHBYWmpQaHpuYWxpSnVvSkhOd3NFd1ROS08wcjNxR0ljTWM5RzI0eVdZOGI1QVczbkljb0d5NGZZdGdkRTRra0lpMG12eUlIZWRrbWJBMy8wSDVvbXJDZTZtanNWQ01TbWNmd2E0M1ozTGYvMUhQU2xCODFibG5tdzk5ZDNqWW5xSXVvN1RTaHlpaW5LRzAxMnVxdC9uWTRrSFVTMHZyM0RpdXEwUUI0YmNMMWZhS3NoSm9RNkRNdVp1QU9qZDFWSnhQbmlETmtGQkpIbVptaXpNbVZsSlFKMnI0SWxsOU9tbnMwczBKZUVhNmNINDQyNVBoRjd4dmdPTmQ1a1gxQmxVY0VLd1R4eWdUQm1vRXFCOHdFWXJOcG9UTDZKK3VpaTdmWmZBMlgyQk54a25ETGtwK09WSWFtQzZXNlNucEc2Q1hJSDJGN0dSdVFaSDUwanJES29mU00xbzZmcy96SFRyK0xOVmpLeVVnZDk0UVorQUh0MFdqdU1uaWl5SDJLcXgxbkc3QWdSNU9FenUyZTRadFVPUEw0UGt4NG4xeUxsOGY0Z3ZxbGp2SmF4amNOWFdacW80QUk4QnFoUjFWNGtTOThYUCtlQnRoQnZGdnFGTUR0a2JSemJnNzFSOGpMM1lEOHU5QWRnZVdmcGp6ZW42QzRPbkg0Vm00MDZ0ajBNcW9CaW9UUEF2UFJSREYvVTBndG15QVd3eDJ2TXAvdHJQdWhPakNibDB2MEZueExwTW1KeFZQSDBwOGYwcnZtR0lOc1hQUFZBQkw0bWxLRFlvSEhVUmN3eVUwb1dHVElGdW1VbWNoVGNOZ2hOcDBLVTRxVjZiMVBTT3ZtbWsyVEx5N2hSREhQdU9VL0VKRmRwVjdwQlZwSmN3R0VRbW54RzFLZ09LV24vTGt4VldpQlJsTTZZMXhrbXNTVWVUQ09HSXdldkh4akdHbWtHWUdUUnVSK3Myei9wZjhRS0VKVm93OElqdy9oMlR3UXY4TFJjRks0ejVueGx0NXhYMGI5WVpjZjBrMHRuazhVZEozSGFlc1dhZjNCRmMxVitUcFgrYTBORFVCdmRhWGljWk01Vm1xY1B5NUdpTE1DQm00NllQUG9obFJXd0Q1VG02dEdMT1J5aEp1d2xaWkVFQkFORnNUNzBaQ1phRldQQmFMNG05WnZSK0lNMFZNVEZaT3B1MFVYL3I3cVoyNHNuSlQycUo4UlZYSlJTMC9OSmIyczVuMTJqUlRvOUtPUE40Znc2WS91RmlER09xVkhFalRVRGZvaGpxS2JVYUNNU2QrUWdsUHZPZEFFM2Z0UlNGSGRTZGxjVnJ0Ti9haVJnZlA1VkxTeVhtSVFkZEZxcVI2RGttSThDL2o5TFkwd1lpTTNkdjJVcXBqVndDYjVRREdLY0JyR3VycDgvaWVEcFNWdzcrU24rS0p6STJocGRUenpqbmZnbHo4UWdRTWZsRnc4cmVRYkZKcldiWkNEZzcxMUU3RG1Zd3BUK2lQTWNUSnowendiSkNCVnBFRHgvZFVwRnFDNFRIRzlvMzZTbFIxTmN1VU5LUmxyWVZPZFMyb2RMeW5LU0VnZXZWbWFoUVd4ZG1BamRERUJSaVhQajFjMHZTSTA1VWVyd3NQNWN3VXdkZ2JKR2xITC9ST3RxTjJCYnN0czVYTHpvNWdWUTRHY2R6ZkNNTHlpWkNMVDhGb1JESEJJNWtlbS9nTzI4ZGQzbW5tbU45OTdOc25rWFpKalhwNjhXNFF1N0F6YjdobVdFQ3NiT2lIbmgxZHB5YmNOOVJ3U3RkV0RJOXBOTGNod3dPQVRiSFZzYnBGcnNSSmdGeWs1MzYrV0xHWWNXUm5LWk9lSDJwVktLMFV0U3E2c1hoRmtXK09RcVNHQThpbHA4clo1Nk10VVVqZng1RjZPY1lPQU90TzBRQTJhN1NJWG9qQ1lCQk1LUmJ1ZXRPTTVwWE0rUDhOM0M2eE4wSXNKanRDbUdpK3hnRVZhdHVNN0QzR3gwSHZtaHRjNzlpYWJMN0FFc3RaMitEVXNQRkk4cXBtWVkrL0FHS1A2OFN0M3d6Tm8xN2x3MHJRMXpqbmZDendTV1c3TG4rQSs4Nk9qdmlOUFJyMW96bzd6OVlYY3pjK0hVaXJNbzBMNG9kRWo0YnROakhFMDJDV1ovVU5zZjdUMVByZUxmaTRtSDNFbkhmd01mZjcxS2JNWjRaUnFGdU5DZVZTUndTZFUySFArRDRTSzd6ZG5aUkZFOGphZEJ5ZWVaZFJxazZLRUhIZDNkQm9yQnRDOGRlLyswYnZFOW5PR0VLZGJZM0hxL2ZlSUNyYzNiUHY0Q2dRaWJOQkxZdXdUcGtiWHo2TkZOaVQ2RW5CRVhSczRYNVRrTmROYzd4TjJGTjhjaWdoYVJNSjI0MFlSY0dYS0lKWVc1bWJmMkM3ckV0VXNxaSs3cG1GOVp3NVRnM2tkNHlFS3A2QStrMW5DRC9PaEVqUTFrU2ZWdW9wNXl5bGtpRXc2aDVpSUdUTVQ0dVJJSVJTZmowUW1ueGF5d2MwT0Y5dzFMYlQ4MXNtWEhjcVV6OVRweGtMVlhpblVVQW1pdFYrbGwwMWRxVEhTSmp4MjBJc3N5UkVoU0FIU3VFWlNRN1l5Z25SdzBEdklraDZObHZadWkwZHFIZHZpSFdiNVdBWW03MGxTVXRzcmNtYlpIbTc0cUs3YXRKdjBTZHZZUHBlRThzTzByWm9qRWM4WDF5QU9WVU1GNTVBZDhXSndnOUdMQWYxV2JyTUIrTUhUOTBqdUFQYnMrbHM0dDdHeENyVVl1dW4rSUJ4R1VVOVpHak1DVlFvbVhwMFo4cHNhdXFkbHJEL09tOWJPd1Vub09XQmZOQ2dQTC9tTFJyc0tHakZEb2c2ak4zcU9MVnV0YXhwL0ducVo4UEFuWGpFTldjUXEvU01QM1U0RmgrRitzeGdNK2dWWUVkeGlsYit5MnhBeVRCM25TQlYzYStwc0pqbFFGZk1TQm5pRlN1cFVPNXlkOUlrSTlTWGNHS0N0ekxGOUplM2M1d1NzOFdUeUZPaWpqTG1rOUxDdXgxV3lhT2UvclUranNwK2V5bDdFNk5BL090cjBUbjNJeVN1SlRsSE9CV2dwdnQ5bm9xcDV6bWlYazVLc1VocXhWdnhJRm1DLzE0aWNIRkNQbkp5dno0N1h4Z3hUb1phVUJTUUdqUzV6VGxzVWRBUzNPc3lzY3QvVWRkUjZGdTE1OU5aeU4wYnlkM2Q5bVRHeEI1TEhBZmxXazdPQlhxK3NjYkZyYlRxb29Dd0xITGt5eUVWWHpDaXhYT0NTak9WYlpwTENsa3hOZUpuaDdHZGJsV3BqMloyZGlqQTJYSyt1WFZQa3pKM3U4RVFYa1dCa1NXMFIxeGoyYkJWM2g1NmUzdi9IMlhzY1BVWkN6RFZ6L0J6alk5YXVWbE84dHkyKzhqNHFBYVhyVmhZdUVjdkF5eGJaY0taZnV1ZUczYTd6akJEamcyWjRwMHlVclFmZDUwY1JReVg1K3NTaXNuRE9jZnZzU0Q4UVlRUWZOSmpvcTdza1d0U2pXaVdFUmdPcjM1MmUyUG9uazFGWk9yUzhjTit1d1hycWU5bjVIS1dsRW0rRHlPUXNLcVdxc2dNVC9HdW1FeURZTnJ5eHVCSnJCb1VzbWlUVXZqSXlnNFZWWVZLSDZKRUNiL1Y0OTRuVVM4WS9FVDNDZE1FZ0dtbkpTTmI4bUdham54U25yenR5MlpwdzNaTWNmems3dmJsMmtZTmtkZDNud1hlZ0hEREU3TzZ2cVVqZ295cTIzZWJ4anB4M2ZKVDFsUUNNaWtuK2pIZmRUSGVqcWdjQWUzY0ZPSUlpR2lpMHdYL2RWM05OeTRVcFBZTjFBVXZZdklIY0s2VnZPanlMSktzS2JBZmdVVkdiNGphOUhDQXJSNDNSSzVLNGJCbEh6Q3VTY3VvclFuREVaM1JiZTJzT0l5WXdDMmRGZkN3SUJyNTR1L3c1L0pMODU0QkVKRUJHUDhhbmJZeGsyejMwMm5mbDNTR1YvUGZTelp6SXlXYXVsdW1tMml2VEgzK1ozUlMwU0lHM2o5emk4SDBsbjI0RmVXMzNFc1dvcXRaa0NOS1kzeDRMTGZsdGlUeU01VU1TdlJWY0ZJQkFGdU5pWUwxOEF1cGU2RnVLbGRsbVhQWFlDUnpqR0syOXNRaWI1N1hVVnFzK3NGamVOZVVLS1Ewb0dsaVVvSUlCbnM1SzNodWdya3hXT2czY3JadFdxbDNqUEl0ZkRpbEQxRDVyS0xZU0FjRTc1SnFhR3V5VUFidnp3TEhqcHFpbXZXaTlsMENHOVZRWFBUR0E3VHF3L0ZNaTAwYW5udnlrUzdoYkZ6eVhBWFFocXdSUVU1Qk15emtJRFhQbUZrUi9mTlVEWHhyT1JaeFczMEhoOVhUcFNBRnhuRkNITCtmdWJiUWFoK3dOMVZNNzJ6cGNFRXBQVmFLdFhmTVRJOEJCbmE0S212bm1RQ0s1TW94VDBjSjYzcXF2WHROUzgxQUJna2dkdWhEVFFuNUdRWWJBTmhHNXBLaFZtMHFXL3JRbHdoRGdVTCtWOFlDNXR6M1VvN2oyTDBoK0J1M2xpMTBoSU9aWXVCUUpLZm84NHNIUENvOTVnd0NCUnBqbGFua0FDc2ZpMGNkckp3V2h6UnBWKzdBM1ZleVBoZExvRTc4Rjh5QUFyaE1pL016U04zcU5sT2VscnRzSndieDVmOWJvL0pQeW10bUF6V05mMWhra2JlSW1JSUFGcXdlZW5xZTJ5WnZVSFZSaUs5alNobGtWbDFXUFVUL2NrQmZkMXlFS0JzZVlvbTJWMnJhck5aODVwQkNpeG9XNmtaaitmc2QrODRIbDlGMENFWnJhL0dmeEdrbTdONVZDTmY5b1RDWlE0eVpCQkZ0dER0VzhQNkowNmdDcXZuOHFvY0dodGZ5RTlFMGNRa0lGVWk0TXRSdFNmdW8reThWK3hFQlcvcHlDaGlBaUZGRFhOa3I3QTdSNWQ1SzREMWZiVmtabnZJWWRTaDZ4V21DMDk0Zll4Skdkd0g0WjJYaGI0ZEk5M1RrVHJZa3hLL3FSZytFV1N5NXhkZUJOQXlpMm5GS1JTQWV2R0x6L01UaW4rVUNyQUNQbzRqWkRkTi8wWWtlN3k4d25heWdFS0dIeXFUeWpFUlVGRnFQYTR4Vm01RVdLcDJxQ2J0ZURCSlFhMzVxaEQvSnBKaGdOazQ4NndTQjR6Ym10Z1hjYW5rUEcyQzVVN1FWYjhkdGxjMTVqQUVNREt3TVdUMTU3T3V6T0U5c3M0VUdWR0dsS1hYMktHTXcvSHZGOVZ2dG1OV282Z1E2eldVZ1JvY1dzSnpaWHh6MGZWTHB1MUxOQUI4K2tYVENSeDkyVzBGT0dvRUdGM0ZQVmxSTUdEalZjLzYxUDVIUEV3VWxBS0xreisxVjN2OWd5T2NRU09qUnRjN2w0OFU1c2RvdWY1RHRoaEJMQ1owb2xqOFJDSFlnNDVGRUs1TVRMVmZJS3JWaW5SdmZWa216aWJEaE5CZkluYm9EWWlzQ1BGbkRVclcveHY0RTY0K0RyRFR4aGhRTWFpMFdMa29rQ08wUFBJeHNBSmNZTzJCYkJDS2VnNTVCcW9nRThWdUlRMDE3dDF6VHhSMitSclk0Z0ZDMjN2NVJFTi9tcVdqUGx2UFRyNWZveGxxbWF3U2FyNW5MQnJCcHVNN2VOalkvQ296MUdrTVp0TjU3SW8xMVhDZi9COTFOclZLWWwzMWtENTI2OHRuZHRyNEpscENtU2Nsdm1pWFF2ck1yNEtwem9lS2R2d3FpWDJjSHhNOU9SRnJZblJmdFoydmJRU1lKeHdxdmpoRzJFRWYvVk5vbDU5S01LdjkwNENTSzh3NkhVaWF4cVZPRi9QaWFHdzlYdXp5Kys2ZFRtcXd2YmQzTjNwTXlGRG9NVGg1ZzVaMTFqRGVNUFUrOXB6clVBRkpuUy9yNXFwR1lBMG9uMmxFOGEvQVQySGo0ZytIUjZtUmIvRUg5TUpqay93OC9NUUxzNlc4OFo1U1RjYnN5UnV3SkplTndHYzBPQkFKRitJVW53SW5ncHdXY3RZL01xZnpFUCtMR0lncDVaTTRaNWxTWHhGQk5lbEQwMHVzaGRqbjBYbG1WZlVXUTI4VmV5b3BtRVNiRm5Idk1PSlJ3N1g0Q1V1U0lGOTg3RzhqVTRubFNRbkYwU1NLREowVmlmRTc3cXNLdklwMDVxa09RTm5TYjUwTkRRR2taQ1pkWjBoMXhoRE83ZHZ0d0F4QzRlelZYRm1jUE5YOFZwTkNkMUkzRmQzOHFVQjJMckpBWTdnWnZ4YjE1MXJ6Z3kxMjRNV3JNSEpKblo5MEYwTXNxRmVQWkZ4am5FN2FhNElPVmdVM2dqVnpNY2ltT0lLc096N3VJYWlPSHdkNDJCaEZ1L3JtRTRpNjFrV0lQZEdDUGdudjNJL1JWQjFjL3lTTDh4OTUrQzY4V3lPckwzeGRWdUVHRk9yczVzZ0R4c0tyOFl4ODgrTFR4TWQ5SGNuRjlyTm9FdlNKV1Q0UnNSckRrNVNRbU5FeDNOZjlnTmhVdlZEVlBSNFA3L3kxeFZkYXhhb21adDFhNzlBTGtYUXFhT01aWlJ4MDJzcTRlemVIMkhOL3BWeCtwbU9FSlhMNVBmczNXRU41R2ZEdHowQ2RzaWZUMkZFR1hteE5COXZqUERiVDJIaHRldHI5bDRtQXhBVHhmd1k5Wk9LNVJTU1A5aVZIMVJRZC9lT0JSUEtrSk1FTDNYaFowL216ZTRwU3F5NXR1NTU0anNRcG9TUXFEc2ZVYzh1NmZXNVhZelZWNTdyZ3lQZFhwZFUzQ2UrVzB4MVF0bWhCVnVCaHNiWUtENTVQRDExRmExb09OSUdDelBkYTJkVHgxbUxramZhZFpjdlA0OTY1RjFoNnEyNVpSRHJkc3JrR0pTckFQWEswUVFzcmQ3R24zdDBxMW1mWi93VmxzTExmaHpESkcwZTNpdEh3TFZaaDlTNlNjQmErU2JndjRsL2pYN3lYQVhaSTNNTHhFUWdPL1hzNlgvRmRpUGZiRlFzTnBYL01DbnFGWkVrTTgvQ3lYVDRxL2w5SzdKL3N5VndCdFArRG8yQ3VUVFNQYmVtVzl0OFBwaHdNMDhvNWdmU1dvSmNQV0lLcWwxUXFxWmJxK3lDUTdsK2JsenNodGhoUVNzUmUvRHlWdHNNRlg1Zlhqd052NjluSHB6NFgxY2NSV05DOEg1S212SVNMdndtaEVXZkRmYVJtSmVpZVpzR2ovVHY5VVhNMHpDQlhzcU1nZFJHWkg2OWQxRlBrdHo5cFY1aFhEUTA5V0tUZUFZdEpieFc2NTJ4S3ZOWkdpS3FNMFBaRG94U0FVZ1Y4YlZoeW9yR2FvV1lkYVROWjNZeS9PTU44NFkvNWxjcVF5WjZ3SmxPMWdjNTlOYTNLVEhDbWQwYzNCRjNrUnRvYjhHSDJPTjBKSHp0K2lSSGdTWGc5V3Q3OFk4djBCSjh1WDAxWW03UDlmVE5aZWplMUdZTmpPTGxlMFIyUDh6dG9lVG1aOUxqOXRBb2QxZjlra3NsTmxoRkRCT2Q1VVdkK2lvdkk0bG9IeStDd1k3NXlmTFZOT3JYNHJGeWFJUCszOHFYRlAwQkpDYVF6UUdTTFdvN053cTI2OE1iWGpCQmJ1dnZMUnVpZ1MrVC92SEIrSk5UU1RMUUJ3ZzBBcm56RDMyd0NhWWlLWWdhaTlUakJZcDlzTVNpaUFRUFpqdEE1ak80eDR1ZWl3d0tqVUlWelRHRFVmKzB2cHZZTUhLaFlPajFQL1BJd2d6RTIxQ0pLaDQvUjQ3SjRJMEwvdjZMaG1ha3hvcmRYcEk2WDZXekR1NlpKVWhyVVJuTGxrMVNzaXQrME5CcFBtWkJNRi9aSHZtL25lZ2xENCtwYTNnWGs2d0EzcUR0VXRtZ3lQRkREeEw3TnVqazVQRXJaV09FK3YyRGpaUU1rek9PMU02N0JST3hBYk52OWhmMTJMYzFZR0g0VHU3Uy8reGlMTFBtVGNPUE9NdUlMS0VEcktTQVZ6aE5zNFpaMktqeVoxRlFkUzhiNTdWU3FheWk4SnNhUDdzTzFINWtWMWxaVk9Ia3lGMVRxRzZwdHQ5MHdxaHlYeWF6SjJ1djhuS1FRL1lLWmJoc0NQaUJiN0k5R1ZrZlpNa0dTejFBWGRaMVZoQ1JuUlg2QlE4NnRReDFoTU5mWjVGUi9uaEpaK3FodVVOWXJtNy85Nm44Yk5UUzZ3SnlSNlRoN2svZEdWRnYwS01xMUptVmp5MmZhVTZzWjZNMnRIekg1S0tGOXdoMnNRSkorVlNwT0dma0NpdHdKZS9VUGF5enBiZkFwZmxWb1E5ak5MdjRqMGFGdVBJUmlGd010ZVdna3R6WDdrWktLSU1Ea2M1ZzFwbzlWSWZMa0U1ZWxwKzZIR3dDOWJqUDhoOW93dmwxei9iVkVFVkppM1Y0SEZQa25wRWVRVEcxaENzQzl1QXZDYXlLOVVXajhWZVE0V0ZvazlpME15SVpWN0V0VS9scENhbC9zNGMrWStycXFuVjAxVWQ3b3FjNFZjdldvTDU0QnNTdy8zaGNkZ1hvcDJxVzNSRTRKYnhLNGlOWU5FdzZLZHUxUlphdml2VEowMSsxVXgrRUU2MG13bzJpRnd3RFZWbVNnQzRuSW1KMC9McVFUemtYbU81MklISE41NDRoajlrNG5rTHhnWEkzT3NQa3p5elkyWUtOOXNtMk5tR1dHS3JNSVRuUStHVjBSNFJMSlBtRVBrRkE2a3ltTDY1QTdSL2dBaHlRdWhxRnBpVVJkcnhYSTBrbXRKNE50MXdZV1YvaTgyVmRIRGJUZWRwaFRBM2FOelZ6VkNZTjV6Nk80WGdxRHIrVE1IcmdBZllWbGlkK3BCKzZRU0xzTERuaXBMZlRXMVkwbUI1aG1Mc0pTQnFCWlNaTDFCZnpjMm0zL1JsdkIwbGlnNmdwTVdENFlIV0cwTDFNMnBFYXVxN00rSXpaMC83dmkvSzBjQmNuR3lFZlF2Q3RFZnBPWlF6MG9lNVBMWFZrekdHTTJaVS9Lc3pnMHJlcXQwWkdTYlpaM0g5R2xpdDVpbnJHaTNhdGJJa2loUFNEYllMMFRiZ1RScjVRSkNyVmlvT1lpbjJNUGNncXpiQUtmeW9VQ3JEOEZDUkhUYjEvUkx2WHFaRXpRVXpucFE0S244NGMyaXdmQjJ6ZHNTNTNBS1RZZGZLcXh0RmxhQlBRK2RaRDNzajJpaUIzOFh1Qm9aWWNDMXM5bEFlZ3ZPZlNUaC8ybmZpMzN6WTBqVkVDOFNrNTVoUFo2VGpxZnJtQlRwZjU2TmdCZnFRcDVpbERyUHJlY1B5VThNVnJCeVpGdmRuU0N5ZUROVCtIWnZ1MzJlSStqNThDd2hRNjN1aVhyOGJkY3pmcGRkOTNDMjNYaWJzU2VOQmwrdkg0QjlqWHFKL25SdlRGc1JEWGFjSVRyZ1J2S2dmaU81NlZkaVRPaHJzOGlGSW0zQkpXUCtRQ1FJYnZ0ajIwV3FjMFl5bHUxTkVNUzVpUmE1Wnk3a3ZoQVhKVVRCQktBN3dCb3Y3RlhsL1JtOHBmRmxaNXNXUUJ2U2xFaitLWmtLVVhESDRDdWVKelhVcnhlTGFiNVVFMW5WYjVNRlR2Q3dmVmdQYUVzWUpGYU1kVkQvYUFML1kvNUxmWThFNGJJRWdNYnl5MFpMSERGMHRkOHRNanFZMjNic2l0ZWhkTEJ6d0pyUzZOOXNTZDkyQUo5d29hQ0JXaXg4YjU3bFQvUVR1K05wc0k2YVMxd1BIOHRqMlhDcHFlVGdLbkhvR2srNGprUCsvR0FEZWM4bmM2WDdJK3NnQWhFM2M4bitGUkVqZUtBWmd0MldHcm1XTTl6VEZYbDNicXdaMFQwUUVKT1RLZllUWFFMc3l3NVRFZjZrRVdZVUpSaVRBWml5WkdLVVVPb1VVZjhxQm5sMFBsc1BldHhLSHVmUmgwRnVhd084NGQzQ00xN3RpWUl3MDVOM2N6NEtMNW9peExwd044aDRob3JTUHdidFBNcGRLTjBFNlg1SUVtSU5udEVRZWtHMXYwM29lWkcxV3RVcmVoaHBGdFloNlk3VFoxMDZlS1M5RFh0TlIxb2Y3dnY5eENRMHNrSitsRVdvU0ltODBFVUJMT0JoVTB3ekJqd1dRNmtZT3RsMEI0ZGVYeGFmZEF2cFRVdGRlZ2IyaUhDdzNRVzFJSnVtanJEL1pNUFY3VU4wWTBnQzJtdmRUOXhkY1FrUzEzTm83WVp1REpENi9FUi9zTGlPRCsya1lIc1g0dDFEdmlJU0VML3B4ZnlPbmV1K1E0MmYvT3V1YzlLS3lHa2o5MlZZU3BjRjhQNHZXNHF0bHJsZjFjUWxnYUwzM3NsQWVXaEc5bG5xMWJaRi9CcklOeERWM29KL0t4NUVOUkxqNFJJWjNMc0RnZGFRb2VBWDZTMTh1bS93Yy9UYU81QlcwME85Rk9sUjhWUE1ZL0ZKNXVCVDBvNTVNVW9WQU5ndTJRanJoSWV3L21KUmd2REVpb29nUVBzaXNja09JQkMwRzljZitVbjFPai9YbFRITCt0dmhiZHByQkxQd3V0VGR1MWNsMmdnL2UvaFI4UmN4WkdXWTdYTlJNSWdveng3RmthWldRL3RUemRIajVCbWFhdjhOb0JwZ011UVZXOXhkb3h5VlRuV2JpM3pIc21ZOGpSMVhMUHA4aW5QbGlZck9jQ1FDemw1NThldDhyMXpTc3ZaSzNKa2p1YjY1cXdrMUNIbGF3Z01YdzRMdTFxODFrUzBuMDNackNhRFhzN0VpVzZSNG0vYkhMaHVyQkZSY1pnVDRGNlZneEdWcWRZYUVSeTFJMTg1UGtEaitZN2dBaFU3SUpvSjNYMWp5Ti9ybnF1d1R5QjNSRFF2dk5ENzJDNWhHRHdnOW5uUUxqZ25BNEMydXFYSTB0K0g5MjZYa3FZdEcwcC9iTGZHN0dxUVV2U29QQWZNcFpabVhhTUZyZldzNGRYTEh4Q3FtcU1DNU5xcUpuc0JtNmZ0Y3dnTkhLUG1RU2dBTGRiMnEyS1J5M2V4am90RUk4Q1pYaTRaVi9wYlpERGdBb2lVbmFsNHlmVE1QSHErcE1WNjNmT2JsQnlNdjczRSt5ZkwyMkw4bmdibHlQVzZ1WW01bVBRSmZqaTh2TXZzNnBNY1pFQWp3eUZ4NlA3RmEwVnNYWkUrdk1yaWhqV3JoeWJxZUl5VHJ2dURIdnl5MUhGTWtkdHlRbXVPcUhJWDRxN0hMOElFWkxtaU9yMW1XK0tSNWlYZFJGWFdIeXNiVTFyRWtjSFNCRU8yOVo1Ni9lRnhRRFdiRVQrOGN2YURwSWRDS0h3bys4dGNPcnNpRzhOdzcyWGxsWktnZGJEZUxFMDNraHNzdG0vaWZHSzJOcFJjTnRrYUx2R1RmUHozRTRSQ203OSs4UEs2RklpSERuTDQwL2dGRXBMQ3R4ekIwbDV6ZW1hQUJ4b1VLUStxd1N3cEJSa0pRSy9sUllvME1IbmdoeFR0eGl1dG9uMTdCNENEOGhBUkhSTk5vbEtlaEZKVjcvMUt1anFnQmFBTEJtN24zaWdOSW90ZEFodjN2NitTTVM0ZWN3L1A5aHBsNUozQzFSTkZnY1F5c0gwcXBQUWYrMmxzMm1BVENoYWZrNVVrTGxnOEdZN0c0NUtXV0d6QjZ2OFdvRWFoODBQUGhaakphamhYQ0ZQbVRPaVpMMzJZYUNVeVdYdmlZVTVmdFAvQUlEWjNiRENSNUZna2hCUU1tVk1vQXprc3Voc2o4ajdGL0MrZmprWUlFVWlTa1ZHODdRaTBwTWM1S2RyUzVCczJpbTMrdFE5anBaSGNTc3VqMGRHbkM2VUtla0c3SlVQRjVKQkN2MkwzTTdaMERqMlZHdmoreklXcHY2VXBhOFRXbnY2TlpLbG9HL3dla1pGd2dKQzdjVWczNld5N3B1R3NvaWRhNmpGTmZkM1dvS0pjM3VsY1VIMVA4RmNJU3RjYjJjcUdaWTZENkxhbzlreTNTWXJUdWNQaTN1ejFoRTJKaTdJRGtKRFdsZzY4ckNrWnNiYlUweFlSbzFKdFFFN1k3b3d4NHlzcXc1WXg1eFRpNVhzUW9lRFJ0QXU2UUR4MnBqYnJBN2k1TEhwTTBOQ1dyak41V2NxMldtSnF3VFdtSk9LanpHTkRMcEJGY2F5eEhwbUVoMStLdkdFR0hCQXFnRlRIV3p4ZE5OOW91SjJNZHdGRFNjbzFzZnpVREpIZkhpMGpCRk92YUJOQjJKR0dqcVJ0WGtIU3RrUkRQQzhxRjRlbHdjSFUyRjE2ckI5ZFJjY3ErdUxyczNhK0VHazcrYzk0MGw3NzNCZDliZG03WUMzVnRxc1VDWXpHcjhmUnJQbEQzVTc2eUYxM2hkVksvbzZWNlpUdklRNGVUSlZHMExJc05tMmcwWXlOMWRGb0s4S0IrSlgxUFFxdkhBWjlrOGFNUUJvSUV5QldYdHNGNitOdXdYUHVGdHhkZndUaHVJZTBDcGZScDFNY0xrNjZiNW1CYkdUaUxNNDFtM0VwWXhpRDNyellzZHpibmRBVTRjUkI4TEg1dzF6QkZ6M2k3R0o2OEJaams0bS9kMVh5dDlMNzVNRU91a3h4dW9HWFZUWHkxaHR4dUtDU2hBRzZLOWpWSnR4d0dwL1pERzVTc0JCZXdCTC96ZnZkSFYzZ2d1STIvV29HOXBrSjhVckxyYjFDc0NrTGlXYm56a2JsVUc3YkQrbXVXaXlnMXZvWSsrdTB2NU1VMFZPNW1YNk00OEpwWGRNd3djMjY3YWdKY0RLV2ZabENCUWpkajRZWE9qRitlRTk3ZFNxTW1wNURZSk5rNDRXRGd3Z0pvK0R1SW9GZGlvaW5XdUZOamdrdGtFU0FDeFVxd2VqaCsyUkt3Qk9GaGZWRjgyN0c2Q1B5UmNPcmhyQnRJVXp2em1sOGdBUzArMjlHMS9TWDc2MDVYcHdjYnRGcXBaZ0VsWlNVb3Q1M09PNnFXMzJaRVRuQ0FCdmt4RStWUmxrZkliZzRwWTV5eU9tQ1ZFenM2ODVDT0dhVGlhMFNUTTZLbFp0RktIb2p3WjFGcEprblBZMDJlV2djTUU4NmVzUUR6ck1HNFdQcVRBa2lLOFdSRmtjSnQ3c0lmZnNWN3djNHluRW96eUsxTlNibGoyams1Zm5DdG55RXhIeFN2NGZaRWkzRm44ZndEN09vbFhjeUQ2ZjliZHpDWE5QblBXREtqOEpxZFdnZnpYTExTZ1MwOUgyb0djM0N3cEJkQ3pCUVQ4Nk1Fc01QQWpaUzlhVzdZSmtPb0JmZ09nSHJCZEs2VTRFS2lnU0F0L1V6RGFJNkRmaXk3YVVKcVluNXNHbzhwMG1OdHNtMkxORlpCSWEvUDErYU9lSG5FZkJBdlZTV2VpWk5sVEE0SlRVQTNZUGcwQlZxenFWTytYb1VTaUw1K1h6ZXV6cHdmK3orZ0FPK3VwdXNIQ29MaTJWRmx3dU42NjNka2k0eFdQa0I2UG9SYSs5UlBjTnMxN0ZlTU9hcXhhYld1QVMva3hOeDMySE15Y3dhdDZOVEZQNmladTBwWXRqbnYyQm5ONnJwYXRiVDh1cWx1NmVXSDJkUno4bWNEd25FbWVteTg4TyszK1luSEZEME5lMHhVWDhkNEFhTTlPOGc0Y2E2eWpvWUpHc2YrUFpGeUNsSVNCQ05pTGcvdWs0SWF4WG5Wd2Y4alRZYlErUFVqd1JGOG5CdEd4bW5nNzdjRkhTa2F4VWk4SVEvMmFMUitHU05GMTdxdzlPeU9JUzRyY3UxTDAweXhrSTh0emlaQk0xbGMwQUw4bkpOUGJVK2FkbnNEeHBsOGZic0o5eG9TS25TSnplUUVXcTdIWTFjNTNPMkc0c2RFMFlTWm9tb0Qwam1oYVJCL1hzVEZLd3dxc2JCbG5NdTJ1MnNlVC9xbExld1d6azhWZzF0SjdnQjROOGMxaEdpaWFGUVZkQzQ4R08xWDByd29yZW9IcmVwSFRYV3EwbzdzMVlka0JueGJwRTJWZktveCtaOHhrWkFMNHR1QWFiOE1penZiVU1IWHRVNXV2dkI0cnRZcU1zRkxkNXBSQjJleHIzaTJqc3ZxSGp0M3czZDFiSVZOdExBZ3BGNlo1bkQrcml6ZzlacVF4M05uZ3FZbGdYVERXRUVMOENqRXRhVFBnVjRoR3V5UG5ya2lERUkzNWxCTUUrbHV2d2w0eGxSZzJxeldQRlZPc3c3aUJJdTJXcUYzNCsxeXZVZHJNS3FWRTdoQk91MGN2RVU5UzVaRjVUaGdrYlRJRDdHenFiRHhvVXM1eHBRei9ONklKSElVS1BobGpKUlI5RHgyaEhXemtwL0pEelZLb0Z5bEt3YTBqRWtxaE5UaVJWeTFFaTRSTGQvL0pjVytxYUNKb253Z2lmRnFGZEZQcW9lTnJXNTFiS1h2d0xMc2hpNGNhRXQvM0xBMWViSThCWisrQWxxSGJYZlI3SUJCWXdlaXdYRk02UjMraEt2M3A0blovMGIzOG52cTQ3M3FMUlo1UXdpYS9HbUZYeThxZVRqT1Nidlcvb245REE1N25ZK25kRERsbUFnQzQzTjcwYmtTNzA3S0JGc21rMlpjUlNZdkRUVUdyZkN5SFdYSUxDSEw3M3RuTnVNNjRiTmQ4d2wxSlg2Y0tQODdycTFOM1FHcG9CeVdtRHFvbEswMSsxYTNsVGh1Y2ZFVm5HeUw5NCtnOUsrc2NFTGE2TS9LQVBYL0pWcWtRYkpOelhISjFqTDk1eUJoRm51bEdXamVLYjBKejRKakNRenNES0lmY2x6Z1YzSHlsRVc2NVRyeldFNTdPRjlsYmFhbGthZzgwa0FLaHRMbWJFaTlITWN3NWVuSSthQlArTDBLR2h4dUd6OFZMakhVVktjTU5QOHRlaURFVmFFU2pLZXUxdU9pVDE2bEdVeE9XL2xVRDRGWm5DYld3V2RlcG1GbW1xTVJQZXFQL1d6a2FLdWhOUVFYaFhyNlBUazJrYzZEWGlhNGZxTmY3dGpPWjR5L0hiZG9jNGE2aldPTEdVaXlxb3lxNlNPR05NRmZvaFBaaWlrdjhoc3VNd29SRVUxZjJlMFBOVnV4d2Q5Wko2WisrRFVRNmZhWmh6bWFwTm1IdTQrNGpZQVJIZTY3N2NuSkZ5bnozZG5IRXBwekRNNFdaZExDb0F3NVMwN3hMUk5aRjNrOHVmT2lCTnB1M1FBYmRicDV2T1huZTd4REhybkhhQU5vNDdBMFFHT1pNc2t6cHB0bE5ObTIzYVYra0UxYisrR0VITGp5QnNqZzV5QzRrS21zVGZUZlZSNUluMGlaWjZYZHNBcVZhenhCSG9zUkZhVUdXeXlGUXJSRnFTNExuaEQwTk9vZkw5b2xiVTV6blRKK2R6VU1makZzbGhnQVpIZnNLVFhlUUVPR2RkRzRmZUdtbmYxMVltRVZsbFJnY3g2NmxNOHhmblJiUU9Eb3pJSkRHU1A0SW5lS3MvVDBMSkYvOEp1b2RjUDQ5K1hLMXMxd2lMQlNMbWl2am9aZnUzMCtzNFdRcE5iSzFCZmFMRVdqNXFqY3JxMnB0V0dBMWFGK1BjTUpzK3NJY1ZJVzRaMFpHaVBVdnJKRkRxUmVWaFZQYWFQUGh2V1lUdU1OeHRWenJTWmQvZExJZnczMC9mcjJ5Mkd3dEdtVXlEUnRscHdva01UNmN4RnF3SnFuOGZNZnI4c2lMdkhFdFJsTWRNbWt4cThPVGd2WGRNT0tETnlOVnNxMUdPYUpHV1JqRGJ0Vm9UcXoySFVwUGpvNWhHOGQ4VGNkVUNLajU3NW5MaG1lU2lnQnNBcHNyTEl6ZTJEVXRCOXpPVEdrRWp3THVWQ0o2OVpoaVg5MDczQmdXcllISU5jN0J2UndXK0R4RTRNbVF2b0JXMENFN3JJdGNCeFVtYlRJZGhaUjJVMW55UDhTMC9qWVNYQ2ZUbXZZcmdRMFlROXNla0ozOXpVTDNvQ0hSbklDdzQ1d3NjckIwN2szdHpFeUpBTDR6WHBQdFZpNUlWNXNPRmpJTkQ3MzZGcTBvV2lFcUNRL2RMYkJubEZ0cW8ybGd5NkhUdWUyVjlEYjZhNytQUXFLNWdhWnB5cm1pbmlvdEpWa3N1cUhaNzJWSXlpME9MRDBYbkdjT3NzMUQ5ZEJQNGhQRVdNZE1sU3lyall1TkZKSEFDU2JDM0QxcmdPbWJBK2k4cFpNRmRQYThxT2lwckpPenZNZVpORXF3R3A3TTVJaGxaT1hGVi85Ry85RE9lVzlacktVK3pBd1dHakhwS290TlN6Y3YxcmtibVRsNnJkT3p6WFUyejBzZnR4dERpN2ZxcmlyVUhuMXA3ZWxPakhhSGk3bXlmb3cyWmlpSWlYY0tab2h2WUF4NEFxYUJaSHhrZUtwK3RZMWtRUG41MC90Z01PNVR2VmE1MlpJR0xzUkRoTlR4dUFPQU9vb1k0a0NsdzBjRGNWMTVUYTlpMmhGam9NT3FTRE1sd0w4VnpiTlJzd1RpempSWU9xaXljZ2dIZjQrKzRvNHZnUGJxT3hkZWZ2N0ZZbXdZWFNDMEwrV2RDeGxVdGJFMXpEZGVnN1VXZnM3cE9KQ2RRak5FQmorZVdhZHdpcjhYYldyTGJsUmZQbkt3cmhpUDdzNjZmaktsK05CdlMvZ3lFQmJhMlVMYndTdGZUazk5emZ5ajR4MmV0RWJ5MkFKaWlDcHFGSWtoK2lMUUkrdllsNWxiVjUyTVZwbTRyS1NhenlFM1d4VVdyOTFMbXBwa3paQXpqT2drdHQxdEVJYUZ1UHJsVHhVN0FTM3RzRnlOakdZU3ZRRjR0K2ZNdkc1NjZWaUVqZ3Y2enVZU2o5Y3RUNkhFaDRLSU95djgyYlpkUDBYN1NNa3EyZFV1WGNTYURZZ2ZaTmRWeHZ1dHFzL0w2UFlrZWUzUVZXajdTRXBlanQ3OHc4V3pEcWFyQ1VCMHJzZ0NONDFCUzcrdUZwNGR6NzVLalFwWStBK2Jzd2NlbGQvRDRxZmhxUU9OOVUxRERMcUtuSVRpNExBK1VvMEhmWGRHNnBtdkZiZmtpckZIZlFXN291eDRpMHRydzVRQ3krMG9icEJDaS9sU0dTQkllQkZwN0VQRktNVXlDeUQybkVvMEMyUnpGeWQ5SEc4WWVQaFpTUlRIZW0zMmgrd21GWEJreUdGclVJVWtIRGt5dFdKODBxQWd2dll2ZitJWkZpM0dZb0dCNDNuS0NLU0E0ZGJlV3pVZmZGSzVjekxFVlRsWEF1T3BLdHZYQ0pOSU1UV0hwbXR6eVJXME80SVBxS3hDL3hJRkZ6aWNaZ0VtVHNlQzlDUkxnYjQxczMvWitDNm9xN1I1NXhzSE5kTWN0M05OVkVuY0V6V1BmSTdoV0ZwYjRGMjgxcDd6ekhIM1FIcytTSmJadEJBRjZxVjJTeGVESE9SVTJIZjlTL1lEMnpYODArSlhiOU4zQmNyQkhOY0pETFh4UjZ5REkxN1FJbjV1emhyNE9oK1JIOHVTRUtWTHZNWksvb3U3K1poeGlKUjJiUzljR3Y3L2tJZ0ZtVEpNVHpHWUl0RjhjbnBBZkp6Wno0Tk1WMytqLzZJSlF6blZoRy9PNHRBZDBjaElieVZhVzhlQjEvK2Y2YkE5VE51N0lyZnBRWm54UzZRNVdIRGJ4emNjaU9MeDliVGFYTDFtVVJOK25LVWh5OGlydmoxOTZJQy9VcHlkRjZZU3laZWV2ZmI0aHZyeGlYb3RvTTQrNVY0bnY5SEtjN3VVNVk4cnBwV3lQdE9UU2FlRkxjTzQ0TzAwb3NYQkJrVW5SRytQUzBSK3d4UTdMTnhvUk9PVUhhRE9hZDNyK3dQY2cxM215T1VOYk9CUGRJclh4Szl5dHNGeDNpWTFGeURSMnJKenR6M1NhaGZIRmZ4dmJHMDdyTGlEcHN6RTBQUndtdERrc0lJYzVHYU5DcUhkdjU5OGEyWDZXNStMa0VQVnA3QjhMV245aFphU2ZIL1NJZEthdUkxKzY1V2R4L1dKeStyVFBSeEJaQjZDNC9FdlBSSUFQTFhlNGNSb0dsU3FhSi9pSlY1NEpucmVmaGhwUnY2Z0xkd29MVEJ2ZDBsUnc2TnYzUEZoMjFDdWtKZjBIcnZnODBGak5icE9TbmJuWVoyT2NrenVpVlZydEkxb3Q3UWlBdEl4aSsrUjNpY3pQYWxHNTlqTG5zeFFZR29DV3pZYTJuZUZFdkVBWUdQYmJaU2J2UHN3dVNBdWpidEZkalU5QnN0MDAxR0QwZE5iejN1b1ZPRkVDaVNvOGw5RGEzdDJCOWR4WDhKOHBaSXpKRDZ4WVJJaGxVcnlkVzYyYXVEMEtHZ1pCQldRV2ExRFVPbExmQ2grNmhzZkhqNnFyKzk1MGQraEEyYldYQ0toaWdQeDhZL1pER2hBTUY4NzBPQ2l6eUJXR29LU0dHaDRFUFJQRnFSU3FZZHVCOTdsWnBTQ2F6RENEOXBRRkRnaVhqR2E2RzBTYW1LU3F3RGtzZHgxUWJFMWp1T21scG5INThFNWFLOVFhaDZGdVdRWS9jNHpsSklMemZFc0ZJTzN1U2hNVUJPTWhVM01QdDhoMS9MQVBsRlpkaWN1dlFMdzdJekdORG9rc0dMREFPVXMwbWlMcTZWSGZGT2JGWkRGY3NxK0ZjaUNFRmY2ancveDFsSlV6UGUvVDBheUtXTmZxL0IxNWxYVG5mZzFRcXNOSkxtOHhQcThKdWE0akZIMnp6SGJCaEI0dGNEMUtKMjZnU0d1MEVVMDRndFRtVERWL0dCOWRIR0hzRVZUQlpoUE5MZnI1dGQvME44cmUyUmtQMDF4TGc1N2h2T1hBZXBrclpWRDJIUlcxdW94ZlAxSG5NN09ISUlKN1o1VWc1Rmw2aEs5WHpSTVd0VnBscmc3b0gwMGQ5cHQyQjZQSkhGN0tVeVZ6bFovYTRqNzlKZ3dhVkJRVmhkd1lOdDk0bFovZFQxSm02ajFncVhjK0p5NHA0aDZhWndFOFcva1lxbnBEMDAwcFZBMzFHeVJ6VDJMTjYzQS95TWQrWDd3OFBjUXJNYzhkTjFXenBPNWhMUGpENXJBbTJhSHlQUjZEWlM1Z1F3b1hmeVd6UnRnSDBoKzMzWmNOenlkLzhidWh0S014L3FZVlVMVUFIOTZIbEZTK0xiSWdnRlVXYk1SQkxLbk0xbGhGSVQ2TUEvSmVlVE5tU0U4ai9DTXQ2QlRpV3U0MEt0b1YrZUg5d2hMcE5Td2ZZWEo1dVF4NXNFWVp5cGVRWFBqR2dYb2NORnU1NVU1R1ZLTnJUcTJVQXVLNTYrMUhKRGEraHptY2tCWWFsY1Z3ckJjY3NQL2JMM2pleXU1MmYxUTNMd1l0dElWSEhJa0VXSzFLcnE2blpxVndFMDVPNFcyS1pJNnQrTSt0dG5CUW1kWksvb3kvektNakV2L3RpNFVEUzlqUXBuakRJb3FjV1MvRHAvMXBlUDFsSnhna2p2RVVTSTVidXpTeEYwRDExMGY5NnB6QzV3WUVkVjJJM3ZOK2I1dTR3UTNjUDRta1dNd2ZCSy8yYzhUZnlNQ0pvM21QemQ0Y0pibm1xUkNwV010R0krQ25jNi9CZ3lnNjdmVHZDRUNmNW5KL01xMXMxbTJxNXIrQjQ2QVI3TmRiWGM3MlpJdEp3cmVyL2JxYnpjbHp3cGVzSUFVMGlLRzFWeVBDMmZxYjZKSDd3SC9GdzdJaVNxU3YydThiaHpyWExoUGpyWDluQW56MUxLbjNEL0Q0Z2ViWTVwMFdWdEE4RDJhNC9mNWdscUZ5RkdUTms3T01BY1l1WHVsYWcrVDJzS1JvQ0F3ekk0RU8xR1BoZnUwNEMyS2xEanN5MTkyVHRQVnhmd0Q3ZlJWcXc4ZkhZWjJNWm9qcjFjL1FhRFhCaDROOHpoMitDL2dTUW9MYWdJTnVTTjVBWkRiVmdxS244dkxxdzNBcFRUTDdsMGM5LzJDYUppV2pmbGNEdmNiZ2VIVTA2VkFqWER3SXV2T0RVTFJUZHNyY1cxWExubjBXdmRpUDVON1Q5QjhVR1BGd3o0MG0xTWk0WjBXMnp3K1RMckp5NHBpTDZObGhGZ2hBZ21ob0pFU056c25DelpTdXljaG1GNlY2ekplOUNGK2FXMzM1S1lHZHFxVGdJMHJlWkoycXhUMXdWRHBoYStnbnlNd3I0TU9XR2FZM0JvdUlZUXFDYkp4RG9CSjJ0cjFVSW9hMnFEZUpaSU9kL3hjRHRhdDh5VEU4MkxQUXJ2Ykg0TGxOQWRWMHgvdWU2SVRMTlJWMzA0TFAwME5UYzFpck81NVFudk9XdnRXVWdnTE9rdWRPMDI3MGMzRjdBTERXR2RUMTFCZUJyTHJsL0lTVTE1TjNnUFVxOWNWaWRTNkhxK3NhZFVxdjl5VWxnejVOZ09KSVZQQ1hnaE5GaVIxa2ZYckl4TnZ5UnJJRU10Q3ZyY3JnVE92TDJsZW1VTGJkVERwc09EckkvSmZzS2ZKcEdhY1hFSStyMTlDaW5mYldxa0h5aXVMVFNsek0zN3dwQWpHUnFNWkR0Z0NETGVBN1JBUUI0eEUzTVN5c1FrU0wzeDVjaFp5YkFhOWRWN2IxZGtwNGZYdktyQW5FQ2JJb3Z0T3dpNEtRV1p0eG5xYVMvVzFYUkJPZUFrY3VkUDRNem9MRjNaK3lkNjdFSk1jSllBN1pMcG91M2NsZWZtQUVTMndtVnQzNDlEM3UrTEI4VnJUUXNqajRzUmVMRkVtVTE4V2tXcjhmOUJNMG5IR1A4eE9UK05mYmkwcGxwZUpCRXZkWkltYmZucjhyMzMrZDA2UHdMQXZncmJHWXVjWTNLejlUYnp3Yk9USTlib2w4RU9HbXc2NFlEd2tWczFucnZ5U0xiZ0FNdHFINUpQWXlteEx6TS9namFHczJ1d1N5NE1aaXFnUE5lczgxWGJWeWVSdlBKU3RqMVNPM21OWDlaNXJhUEFCR2hLWmJ3RlhFcTA2VnJQTnNmRVM0cDczZmhyZ203SDdtOXlXL2h4d0FWeWx6TGJBbTR3Qzg5UUxub1VJVnpoYlp3Qk1Ra1RIalNLZ1JWUEtyblNVUklNeFAyYnkrcHdtY0tXVFF0dWF4cDlOc3NiWmFMMFd5TitIdk1lZHduL1p3bXpVWUt5ZGJiUG5ZeEVTTjJCWXZUald4TWtCUDhnQ3FSVFFTdXdUbkU5WUZpOGJFcFEzRElZenJZR3lCLzBNOHN4UENKYTB6a3hud01wWXhtNjFKazVLcWF2THF4YkNrbjhHQjJlNkhJcngyZVc3V2hoZ2tlcEJ6VGlySlM5S2VLWWY3UTJTckZTZFh6aW5rVEM3VGdQdkxEL1NGUGRseGNrMkxURnFoZkVCNGVxOTJQdncxRW83dzl2NHF2TUZxeDY1TktMSHV3Z2ZUUDBmdlRtMCtHYUl1czlETEwwQmpKd2R6TTB0cUQwMGtsUE5CempHcG9DaTFRd0xka2xVWHRpRG8yM3dPaU9HNUo3eHFxbzk3anRma1kyUjFhaVRkWjd0WWhLYVlQQXlqbnVETmtRRmtFdG1IUWluSmJrNnBDS0ExTTM0SnMyenBHSzJEcnVnWEFkaVdlYXNRRDZnVHpYRGRQWFR3NzJnRjF2Uk50bWl1YUZkWlFkTjBPYy9zQ1NYNFUvRm5pUFBrd3hOenhlYmJodWhXeWkxSmRObC9lNzJNY3h2YTRqcE5qNVZZRkpRSDdPWkV1VXZ2aUR4akdLQzZlMkJpOVh0bHNaalkxSUtxMFNDM0ZwaUJhTjNnSnFPT1IrUlJGYmNROERHL3VVSitheGpyTTczVXRvOWFGRTJyNWc1Nkt4MStDNDRuTVY2cWU3ZzRNTWJwckp4TDR1Q24xdExGa2czUGpaQnBCNnlBV3FqWDByelBoMWQxSk9PQ0tYb3c0SVU0aUlRL00zM211WEhvejhFVndld01GeUhOVEF0NTRhd2xVejZ4R0MwNjBHUlhiSDEzT2puQ3VvbnVOYXRDVzduSlhxbUFlalczaWs4TTNjOUpiK3dlb1QwSklSMUxrQ3MzYlJ4eXBGSVZXNTJVajQ3clBBalpDaFVJaitMWUhaaDRSWkRaZFJDTmNLN25iVlp4NzgvbUM5QWI1OXhXaExxOVZicWV0VHFFdnEwclBXTVJneTR2QXJlN1I4Y2s2QkRSK0owTlQydnkySDNMYmZNWVd4Y212MlRYUTRDQ3I0YWdxRU9FMVBGaW8vQ1pqSjJpWkF0YTBvVE81UFJ5RTk1SnJ0UENZdUg5QlBEaWJXeG03WDEvOG5wTHhWZC9WM2JCamw3VEN2R2VIWDFtaWhKNndGOXl5bSttcU92MGlMcVM2OTM1WFpMYzJ3Ui9VWWExM1dSZHBoVm93OUh1M2g3Y1hubFVtNXB2bVY0NHRMNnN3OHR6endWNm4yZlEvTEY5bnovUDhKSnZYeEdCdzlqWk1HeGF3M2IxZUtHb1JkZTZIOEhPUmxlaFZVaEsrNHY4VnBZbXJYMXlvZ2lONGJocDgrZ2VkeVlXY1dZMGVzS2JQc2JpeDdUM2FyYy92SzhFZEZPK1FPZGRHMGxra2lQMzFFVk5Oek9oMnBPQUttNkV5QmhzLzVnc0k3c0hkVFIxY0l0SkdjN2pkUXVWR0g2aCtPRGJFdFZsWWphSUFhSDNLc0FnODE3cTlSVU5zdzhMSmxaMzY2VTFGRFBYcm8vWGJrbHZnYTF1RFZqb2RjVnBhUTlsYnlPem1MeDlLcmlaQnh4dTk3U2ptMmFiUGdHdjlJSm1PalUyOWdxTEpmbTVtaENpV3FmU2NPSldyVVE3WnUycmxndTJkc3l3Tk9TSVR3SHRYTVh0a1BYS1pJNEpBcU5veVJCUVdqVjBPWVFtVFNwemg0Sys2d0NFMjBZSFlRZUlrYWdVWE5oV2g3bG1wcUFDWmc4VUlneTYxa2UwYzROUk5JTGR1c1MwS1hrYnVvR21LUWs2bUZRUDkvUy84K1YxQmlmOXZwVVd4aktMODYyenNmR08vL2VKbERpTitEVkNxMmtaemRiUHZOTmxYRndxdmVxdnRtM21RQUxxSXpXMnR2bHNZSWEwVW5oUlpiemp4aXNMUm9sOHhzVnBUWUZsc25GbFhmQ2VsdUtMQ2tVb2lOSFM0MDdsTlliN1Z1L0tBbVRyWXZyNnNQSVhRQ0hpK0NZUVRjeU1aUXpHdW53QllEVGNNc1FheEVFSC9WM1R5cTZsUmovakhEQU5KMk5yWnp6QitzWVo3RzFNcnRJUmp0MXNRZmY3c0hxL1hrMEp1SGNUbW4yLzVVMTdCRktrdGV0ZjJ5Y1EwbHNOME0vWEJxQVB4and5OXBId2VMblJCN1hKYWJOY2lSeGRvREFiSVhSdG5Yd0VYSkpjZk1uSVNJaGt2cGZXWW45bzVpTEhWVXQ0czlqcEJJNXYwMng0VmJ2RTQxcHFPY3RaMUZhbGptc2VSLzI2cmxBbmpwNTNxNXlCaDFrQVlBYXNFL3ZsMzNjbHIycnNDSzZ6Y1F5ZmgvTE0vVmZoaVQ5UzViemV4Q2ZodUNBNDU1Mk1OZmZpVXdXOWpvOTdhcEZjU1QrdllGbGswRW9Gc0liSmp2RUpid21YU3NRWG95RXJoZzBWNTh2Y2pFUTRWL1JiMkhRR1AwNjluMlV3ZHc4TGpnSE5iUjlDbGdaY0VUdDNEK2RHN3RIRHRLLzFsaU5xeW8zdjlIU1ZxMkRnU0JTU0xwcGQrQnduQS9WczE4RWxmNUZleDVrYVNDMGF5anI1RDJiYjlzWTdUZm56bjlWSGY2WHkvU2REcnVCUjN2aENYZUU0NU1FeThDY1lGZ1NhRnhqNXE4UGZDSzlYcGFUUmNuQnd6M3pQNENGUnZTTys0ZEoyR054SDFaenh1SGNPNEhYL2ZpQnhtMHVldFh1d2sxRDlPamhnYjIwK05KaVpwbFRYeXJ6NTg4UTh2akJvaTFiOFFSZCtobUliZTkyeUJhaHhtbC96bklmSDA1VzVFZ1ZKWERPYjZUUTdROUliMnpmUWlNZmZVQmRMelBtL0dKYVVzQmsyUVFoQU41RGpKUThmWFV3R3BoUGhiUkdLVzIwYlJHL2krdGE1YWN5ZnBJZUJWRXdPMDcrRVZDc29pMGRuMVp1Rng5Z0lqMTlneWdUTEpsOUM2cGVHMlJuc1pzKzY1OHJ6Vm1nQ2dTRmNTZjBlTlgyblAyR1FOV3kzb0owbW1YZTBzS1NJYXZobnNrUmtwd3VzRkJDV2hZbGREd05RSWE3dlV3NWg1THVvZVU2dVQvT1VVMzFRQXZFYXI0bGIvaFdXVnYxcnlOK1pmSWVsR2lXV1dxZWE0dmVTV1lXUDhXL0U0YzJFS0I1Y0E4aHQ1WHFIM2NrQ2hEdnFOcEQ2S1Y3bC8zZm10STlEL0dCbDF4SVczMUNFSzZGdmhPSDg5UTYvRFNndVJ6cHczN2RXM1JqODZpYTdKakF6S1cweVA4SUQ0VGFXR3J4REhTWWd2eVZCMkhsT2ljb1NCNUFqYkh0amk3b3M5cU9MWUpTRFB3dG45cXdKTllaNzVDMnNSSHZzNUY4RGp4YnJZNHdra0JsWGNsMm5BS2gxOGJaQ1RyWDRMQ2xWUXRQK3JkSVlhQnMrd0tsSXFITHNGVll3TUV2TDJ5M1lYU0g0dndUcm1QQzRCMWNFR1NTSnlnV2RxeEZQbUo3enY3TTUvS0R5S3dlZ1ljOTJxYUl6RWlMekx2dXV1RTZCOFBqN3dDWlo0UUhyUUVDcHNIQTVQa29Va3p1ek9SODQxdjNkR0pVRXowQllxYVN1VFJQSk1WTXh3Wmc3enZpNG5SWlIvU05RMWRncFN3RjQ1QkdxU2pWekQ5dzVKT0pxSkZGTzg2dGVxMnFBUmMycUJIbXEydit6M1AxeVVQSG9rNTdNL0IraFNtMXkwby9OS0ZQa05iYlBrRVkyT05Odjd0SjI0KzhZZktZQjJ1S1JBU2o2ejBCQ3JOWWwrOFhPeS9tZzBKUWNGWGhUZm9NeU13QVA1RUtSNU81QVBxejVCVXRNbmRjTG1hN2sraExHRHM5Wm1jZWtFVGFqdkRMa3E5K2FkTHIzZ3JxeEY4MWNzcDlpMkQ5R2JlNW94QXdqREc5dXpsUmwyNkl3dXpYM28yclRKTUQ2MCtBK2JsTWtUckxpcGRMeVp3NzM5SjBtcjV6R2NzUVNsM0lwNFdueFlwdVdtSHNDaWVKekJPQjNob211MjZjQzdtK1lqQmxKblA3SVoyUmM2bTZSbFZTMzdYNTJBWi8wUmdZd1RHWlRBaEFzLy9SQ0xGb3VQQ2F1dUw3WXpocUZ6Y2JpQVA5VVNPYW4vZERpQmZNcEZ5RmxQSnh3aXJCWVppbnhLOERTMGp5cFNvRnZ2dVFOTWo2czR5eUxjSElZcEd1Z0Z2ZGlJcm9GZGExM09KZ0Z0WGVobFp6QjduS2pmbmF6RThJdFIvemNDNU9sMWpraVR2Z1Z1YzJPK0o3dlFkekFCYTIwdVh4M1piYU5LWXpLREVjejNhWWpTODNuVkhYUzhXb2lHam0rSEszNDAvZnVuVzNaKzFTNE9rV0lLbm1EczVZQ2ZpYWl5SDFqVm1POUVOejB5SXdPRldkdVd6V0RDazhjNENkVTdyS2o5WDJuYitqQWdKRHJaanlHbmY0MFdBSVNEdG1DbE5GeU9ZN09mOGc1TFozNDdhU3FFZDgzREcwZ1g4QmM3WnFDYUF3RlVvWGpFSm5ndEhoNk04UmI3MUlvaWwyU0dqcWxGMnV5dXVrbEprajBqS0FBdHJVcHE4cUJveG9WUVJ2USsyZ3pFWjlESUNPZXVGZkhrWXNkK1k2K3F4d2RVNXNXcVlta2V4LzN5VVhoc2trbEpYM0xjY0RFakZoZXRIV0tyL1pXc2Njam1ZK3c1NlBPZEdGdUhzYkdTZWN5TC9QL3ZMMFVMMWpRVFgvaCtXM3k2cnJqejRHNDlFblZ0SWdEUkJza1dXd2NOaTgzY05CVzVYaFhtR2ltTVh5WStkb010NlFmcFZCQjNNVnN0aE9CZlE0NmliV0p3WDV1WjJCcEJEZXlJZzBPWWVQeU8rY01Ka1dLdWlHWWlLMW41WFQwblQ4SW0ydGhjeUV1VjZjN2NYVXNteEpSWFg3YXppSGV5aDBGOW9KRmJOUExVZTV5bkw3bHRqV0RLMzJqSDZ5bmtGKzBPbmdsMnVQWURSbDZ5Z3BWTkFkNitKMTl0MEovTE1pNG1PMTloZHc2cTkwazBxU3BaKy9TeGxNMFE5VzY1MTJtRlhZRUZnWUNxYlRzSy8wYlBxa0hCQlBtVSs4ckRjWllaVlZiY2dHWjFyZGZId2FxYXd3V0VmeU81SUw0WVNtNXZLVmtpUXI3WnJUZmRaNTFYTndFSDlxdDZ0cEZhYzFOYjZUcHlJV1M4dXJuSDNNMzNFNHdoeWxzM0g5dVhhbkJVczJLaGhZYjFjeHdnZnIvWG8yR2swdWgwSGQyNkx1cWlYVHREcTM1LzVBRlI5OE1EVGFrUFVpVXhBZjZVaU5IVU16Si80WVpZOE1PS0tKMnY3Witqa3FDaFBqM2ZCSzdMUjRLYWNVdGFCZkhJSjdSYit5NmUrQzVKVHdvZkI1eVhlbkNSU01pTzZ2ek1DNVFIa3NXZWxYa09PTmQyeFFmVExXVHNxRkpGWFpLeDE2QXFocktWcml5Yyt2U2lyK0dhN1R3NXVMaGlVZDZqT3ZNeXBhK01CSWM5M0tvRkQyK2RpVlF3ZmFmVFRZMXcvUk82dTBiWitrTHpPSnFTTktUODhPcHd5VmpnWlcwVGVRYUNqM042Q2NueTBqUk1EcVhRWGxXU0l3SkNRS0NjUWFpMnlNM3ZoNTdObk1KSDQzMjJ3RlV5eWIzVCtKaTlZNWJxUWh4cGRUK1YxWGh2ekoxU0FoNmRzdXFLL3VHUGRSdVRaMGkxL3pHT3V1ZE1wdXFJSFBGaEV2anpJbHNUYkx0ZTJqOFk1VkgyR1hKRlpYTjhWWkxCbTA2OHBhRjVINzNTSHd3V1VQUEw1SVJ1aWZrSmhyWjJRRksybTlzRlllZ1FSMW5yR2dic2RUNllldE5hQ2VWZUdTMWN3MjMrOFhYMUR2SXVsTkFaVExnVmRybWRmQnp1azBKN1VURUtkaEk1azhFWXViVFdvV1V3dXg1WVEzejRkQzhkVDczbHE4anFwOWNNU2lFTzgrN2oxNGFFelpiN2xEZVkweXBLR2xqcG1pSmRuS0Y5bUllSW9MS215UHZBVnBDSFlZbE5jZWlrUkl0dTJZYnc1bXpVU0tjMm40b01GMzQ5N2JyWlI2L1NOR0tNT0IxSVM5RlA1VS9iNWJRNVJrOWp4bVdDODh4TnF3VHVlVmZXYS9TdWxnWm0yaW5CMUEzMjNVYzZUanB1UTZocnA2YzludGpkVEREdkZ1WXJCUjR5NlRuWkY4RVhuTE4rUk11YTdrWFhIaGpIbVVkU2N5eW13cFZ5bjRzUlFkNjJwSXRIdFRpL1B3M1VlUjdYWWNqdzh5SWdBekFlbVlITWh3d3FQSlh5MnI1MmVpbmpxWmZQNklPVVRmaENTQkxzeHNVZzdTdVJnTW8yaGR4RmhCR0xxbFBrTHgvQk9oME5UUjNWbC92STZzUGNwQ1V4VDFMTktYTUpTak9DNStFQWdQNk1BT1llbUlxeW1BazUxTlVJRlptbTdRaS9kdHh4Z3MyVThFZ1Q2d1YxMWp2Ymw3S0xXRGFYblI0OUgwenJoQ1YrNWFFekJ1UVo5M1VqdHpnQ3J6QVpvSVJMcHpKZzJpUVZ5cUM3Mkw3VDVsYndvOTRXRjQrQ1R4YTZZOStGcmJGVzBDbUVPTDF2RnhXVXNXR2JTanRHL013MXV3ckU1TUp2eTNhcUZmZ3RhcG9ydXplRnZZSkJoVTZIT2F4RUw2UlAvQjVObFliUXQ4RVIxU0Z0MTNIdmVVQkp4SUlzYnJlTDBkNTUzYTZYck1ydmI2YkQxcUdlWVN3Z2J1UHQ3N1hsb3l4Tm1vWGFucFZTVW1RV2xFa1hsb1dZVGQyV3ZsSGJDTUYxbWdwT3o2SDRBemw0WDRIa1BzR2trOG8yM25zOURKTHZNQkZ4dFNIQ1V5d1E0N3hPTGxkejJEam4xSkdGNjRKbFZwOHk1dHNlQkJXNXg0cE53OSsrWGVYYjRUU0psMXZPY3FKSWllUTJMS0dHZjNqZXVrbmZkR2wzQldBa1pHLzFYaTVHeEdKc1RZZnFGVGVIRzFsNDI3UklYWXNCWEZac2Q0aEJpd1F3RTZOQ2NqajdYY3FEK2pWNkZZNnA2WDJtYmRJdGRBcVk0MEJRcjhkUVQrMU02RFFNU3lnY3pZVEo3SVVwN1pUaXBPNklkQjdXcHRnUFFmazgxYWpINW4waGRUdXVYZ01pbVY3Z2c0Z1FkTWtLQWpDUTF0L1lLbFNCSjlUN1BzWjBmN0oyOFVlV2pMN21hSXdWdWVVUm4xWHlIdW9nYWJHdis5SVNEQnFnaldKQWJ2ZXJKemo4cjh3d014OWs2RkQwWmtaRW82bkJoNFpKUldDVUcydTJYOXFBN2RJeHQ5Mm5UWkwrZTdNd05sRnRuME4yd0U1dmJsNktDTzJFVXMzV2FLSWlHaW5TQ2Roa3k1S0RYdG12VDNRTHZDczM0dDFyM0NOVk15alNGRDE5MVBaQUdJaTBYdUhsTUd3enFTTmtZRjRTM0NNRVRVTjM1Z2xjdVdwU0pkREVzcXRUM2ROcUJnbjgrT3dFWWM2OW5qSTZPbG95N2ZhSkV0VWtWcEZrQnp0S1BLZUFhZU56OEdrei9hZXpEL3hJYmFPK0dKajZxc2g0cGUvVDJicDBtb3VVSUg3ZlhDa0dOdjZ6eGdsMFBaRlVsRHN3YWlGUytUc09aQzRhbWt3S2FITHBjQncxeC9Ncmg2ODNQc2VzQ3Y1TWw5ZFFZRHVwamJpbDZCOGRhcUJLWGI3SmVqRjZOS1prbjVoem82cmVISW14Umd5akRNVUw2QmFyNmtaZHI3K1ZZVVl6WngxZk5ZdUZybGl2VWp4dWc4K2g5eUtBVWNyUllYMXl3VzBpbzZMQjdteFJSZy8wZjdubnNjQzJkM0tFdnVFRXA4dXhOd2g2d2N1K0ZlM0wwS1E5cXNKUU82NElrUVFxU1VBTHdsT3hMdGVUeVVzY0VjdTUycEF4WndjZ0RrNVpyVG9WNHJ6TTNMVEo3aXE4Znd5LzZBTVNsSGtLaDhCYkRVM3k4bVZ1czZjRTRSQ3BzZFZZVG4vQUR0ZFhzbEo1TDVvT0R1VjFSdGliVDhSYzQ2YXZWbVBHQmgxRzVjckFlbTRqc3FJbnZ1eEt3bU56TTJSQ3VDbmxPK0JqUGRZai9VNndIek5KakRKelRHbUhtV25uTlZySkJxOXhkd3k5Q0NBRjlkazVKbFRlWkZwNmoraTB1T1RVbDJqdmJ2RzdYSE40cVhsRHNFRkh4bjY3VXlOZUYzUVFUWnU3L0g3WWloSUJzaE5wdHI5Rm81UFV3cTZJV0E5dmgwWTNSOTVOMDNadUxWdFhrTnZEditPd0xkTWc2NGp2NUtjRWxhVFdvK2tkVU1IWkd6NlkyRmxScDVWWFVqZHBhSmY5RFB5QVJxN3dNZzJBODVNRHNVZ2JtdmNHRk1tQkRQOWZKSGhqcUI3VkpqTy9NQ1FPTlBlOGhsQnRYL0lKcFRXOGhCRFJyOHlBRUtqSUcxZm9OT3JLZm5MYTFaRHltd3lMWDdwVlV4V0RaVE42RytweGRXUHlVK2dkTkN1aEpxbkppOG8yYXVrTk1lbUVPMVQxNGtiL1VRcGNrUmkxbFd1anNvaUNXcVA5TVc0amUwblpWNnhoZ0JlNkJTanU0ZW51c0g5Q1FZWlhLZ0JUVVVQZmM0TWRSdDlmOWRqaWdxVDdWUjBKR3hXVWNLcUYxZG9mL2VtUCtaZ21ibzVrUE5id29SZnpQcUIrbzczZERiU3JxTDJRU2ZwMFBFaE1EMkxmVzdOOFlIT283a2x1blZ5VlZHYzdLZnE4N2h4MlZBb1JpNW5qd3VCWE1KQkZoL0lydlh0T2pkUklWTThick9FSTVYNnI4S2lPQTRWK3NjUFA3d0toNHBPalE0YURTbWRDYUtHeUNnM2xsWm9aVVM5eUp3NHhkeWxoZXA0THNPL3p6cGpkVlJuK0lIbGR4R0JRdzB4MXpTMGdVeHVyY1pjTXFMMW54WXlYK3BaWDdkZmE0clg0c3IzZ0tTS1VTRHNoK0NxSlNxbHN4bGRjZmhTSlJNWUJjdUtZa3BVeThkbm9KZERLVDV1QXNLV0lmaEdhdnVxTXhGckYyd25ySUl0TzRDL1ZPMEtQSUpWRkI1VE1ITmlrQWFXZmd5bWxXaFVMd3JERXIra3g3YXhaZ1pCTVdzcHN5bUh2ejRnRHYvZkZJTGgzTGE0TlhwZ04xZ1dGMExwSWVXVWpvMElOVXJMTHRUbVpMU2wyanpXRUdUR0xTTVpJSjlPUW9FcXFmTjlab21tRjFQQVdFUGV2WDVIKzFiSTIzV3hacXNDY2Y3UXpTSENNZmdpNGZvcG5tRGIrd3NxVTJOT1pCdS9lUGdXMWxlTm1mYWRnK3FwK3VKUlo3WjQ0blpnRWhpQm12TjYzd1FiaE9wbGQzZHpTbGxCZDlkeFlUNlVHRktrbmNLR2hBWEJOVEZCWlJFcEhieWdRaWR5bGF2d05NaWRBdHF6U3JiNWJLRit3UG5YNVZ0Y2E0cGkrMksyZmRlbWpBUjR0dEM5K0V4K3A0aDFSV2FEc2tmbyt0YVFpOC9RK1pPbCtGdU5IbkRmMjlLM09iRlpqaTNQeEM1a3B0RnVkcytOWEg1WTU4bnJJN0JTMnFaeGR0M2NoR3FCcW93NXo4MDc4VDFHclpRbVl1VXd1NFU1Q1BrbVF2Vnk1UGtmY1NUOVJLaWZEK08wTGl2NzBTZW9pSXpJSE5qYmFvNWlwUlAvUnNGZjVQMzk1M2cxY3BWNStmMlRjQnlJcUFZc3RDM2hpdVFmbkd5TElRdHFiYXIzQ3ZYRC8rbXJEQnduZVg3UmtCTmt3L0IzejM1djJNc1E0TDNkaHpHQ0NRM1ZpeG1hM0VvWXk3dmVZdmdNRGVqNXRBdkUzMXhyclBKTG9kUlJQYUZoWVFzWUVqUml6Q3N6U3BaSkpQcFlQb29uRjFmUE54eWdBZURQeU4rQlY3bFh6dE1YVy92WW5DMHcveGhvZ3NlL3UwVE51QkdONXgwUytRbHRtcEtyUFVyWUNoZWFpbGw4TzlEMW1BWjUzTlcwa25va1ZQaUg2N24raXdIYnN1T1g3d0xTN3ZLNTVNUDdxNytUVXQ0V1JOUGpxUmI1bk05WlI5NzlYdlFjcjF4eGNyblR0YmpKTzRiRGYyRTVuZzBveGFPcmQ2VzlyQzJvOEQyd1BLMXFYRHU2UGN1dVhBd0UxeU5JUzVVU0pvSjlqSTZYVG5LSmNqVnNZMVpTK2UrTVEvNGpvdHNkdkFlT3FvUWYxUmFEa3ZnTndDUTc0RUZzY21XaC9SK1g4NWJnR1I2WitocWpGTGNRaUh0YklvRlZRdEt0ay9ESCszV0J3dEE5QWlxTC9sK09mbHRSZ0Y2SGdxU09tVjVwOG1rNkxuV2kvWWl2NUFoZ0dxSHM4ZmlhcXVuNmFGU0lINzI4dzRDczlFL0ZiK1R1Qzl1ME5Ldk91WnU3aFZtSk9lRFB6eDgzZEpnd3pTZXdsaFVnVitHLzNvMlQvRU1UcVZzNVZZK2RHVmN3cXFnZlRqMFNOUVZpZGpqYnltQUY0TjhjNWNHb2J1ck92WjArUnZveGE0RURLdCtBNEh4dXBWbGw0S1dwYndkMmdWR3Y0R3l6OGRBZnQvUVNOYWgvSE5zV29UelFrVDVQVWVQNzEyaTkxa2I1VDkrV2YvSWNGV0JsUFhUTFViU2FTU1NPZVB6YjZOQ1BxWFUzWEZPRXBjSnNlNzlaOVFPS1BYbU9kcm02eEc2cUx1TnZJeU1pVnJYRkFNOUdWbTM3VjJpczFXdytXNStIWlErc1pXM2FERmpDT0o2ZUpBNXRoTGg4bmJUZC9JRzJDWE9rTXltakhabmlvK09qMW9hVGRPNEorZGR5Rks2MCtwQm5ESFJpWExNcjlyWVE0OUVGN1J4Y1NwWURaTDFqWTBxdWkzc3YxUVV3WnlKREhGYlB1N1BpK1BhSnN5NDRJdEN2SDdsYlJnVlpBWWRyeC9PcGl0L05tQzlLL0xpQmpvekxCSnZpV0lRYmFxQUpRNWl0KzJjdVQrc3hVQjYyWXphQW10YVNpZFBmZ1c5eHQrZmJqWUhzRnhaMG50eGYzbjd5a283bUhmZmFKMm9WRUZxckRvNTY5NlpyRkkxTXZOZGNRdHBYbHplWWRJT2FQVk0wTjJ0NFZkMXJ5NzgxbjZqVGRHOW51eDhsSEM1RnpSTWhQK3c5MTNHOUYwWWNEU0cxUEEvQ21jTW4rTGtyYW1SMDRlV2NCMk1HdFhabnZHSVFPa1ZSMnFtSTh6QTRSZlY4UkluWTNCTHF3UTcrVFp4NkI0eWNqM3pOME1KVzRlS2k1M09WdWNndU1TNGdOY1RRWjZFRVVrcld3SlltR2F3SWhNaWFZZTBNaXZxaXJkV0ZCSml2Y1NWY2ZsZW1CVldudUVSa2w5UHFiY05WWWpRYjhDR0lJQjJRVVFFYUI0elVtNysrZENjUFlTcVJpM1l2cTdvczlXQjgrYVUyQ0h5L0ovNmFFTVd1ZGF1VUtFcXI0TGZwejBCVEg0dkJNU0N1NzQ3QXEyb1VvL2oxTmJaVElFdFhER2lubTVmQWE4UVpML2NoenZXNlNOMGdPTDlhWGtxdWtNV0t2VE1QWDEwajR0UzhORmVSeVpSRHo4T1BkWldrTmlBWVMrYWtQSjVER2NFMk1raGk0dVVCc1pvaVVjczFLd1ZScTZBdWFyeGZhMnFjMXV4SW80QWMxLzRGZzhmcmE2djIyOU1iZjJDcm1qRFFCcXRlRERvNnpIMTN0cnd1bFlrZ3ErU3oybFNKelFWdmZMVlF2Z01tNjA2MHlVWnlrRmprZFhJclM1SXNvZFROY2Q1bENnc0Zobit4SmxMSjV4VEVYeE8wNzlCMUFXRk1Xa0J3QWh3dDlvUEFaZUhRUW5qSmhWblJ6SFpnTmdpcll3SkhTSU9wS05wUStYdEJXZGF1Z3B0K2thWTBNbkkwMGlka3k5cnBjd0VaQVRRWkxjZHpKVHhTd09EaXhIeTZUTUhzQUhzTXQvVWJHZkE4RWtVbWR3a3g5cllOS2tJR0VEQmlIbHA4Qkp1L0puN0xCUlhMcUlTbk5uUjdWSHQzbGNwVWt6TlFGc0cxQkI5NlZodFVINFM2TytYeHZSWWRpVmhSWUNHYm9NTkdPdE82dXZsbmgyK1JBMnVCT3dNOFNUaXRKb3lodmhycnVRcmNDZjIzcXBGSzd6QklMcStvNlluL3R6bGtsUmF5c1RwTCtYNWE5RjlQNWdtSGV6RGt6bnZ5SVdRNGFSaDNHWmhzY1V6RDZlM0tkcGhLT1NnUWhiN28yWWh1YlZwL3FHcUNmalpQYXpsNzZwUXRZTExSNUdsbmUvdUo0YWsrKys3VUlra3pUejgydUtLbE1qaitnY3U1RVFPUnRtWllTV05Wa2lnUzJsckl1eHUxM0p1YW4vSm9XQzJWRWVaemU2SVBIQ2E2SUlaa214U2hWSC9vdUhVS0FXMG5VR1VSVzFNblM4eU9PSW9lOFlUSWZJSjVRU2FJaFdqSXhqOEhGVlVOb1MxZ3dzU1o5dzJySTBKUFJ5VTZLaGxHNm1YZSt0Znp5NWVjV0IrazlCa0xDYmI5TGIwMnVCU3c2OXRwUGZhVXU5MWhRd2dheHVUQ096U2h6TThsdFF4bTZQU29FNTlQNVBEdnkwZ3EwQWV0VEJCWjFZMGRSbEwxdlpXamtNc0gzWmJ3UGdiMHBOdjJPM1RJdmtkRnpDaTh5UDUyUXV0bUlxakJONDc1ZUFMMjN4OGhYSFB3dVg3MUpZajdkY0F6U0FpMC83ckFwdERHaVVQekM0YmluM0ZlUmlpTnM3RkxiTUZaZzc1QUlWSmVaVzc2UFh0Ymo1QzdlbmlwTysyRFVPNVhFSXJVWGxTK0RHSEJ3RUFYNjNkaWtzbjlsWEp1cks5aTMvYmxMVnJURVNDR2V4bGZOWmZteE01MnZUeW9va3QxZnQ2eUxqNnFWNUZnY0NYZVpsWjBsSisyS1MwcFV4Z1ltcWIyNUI5WmhYVmNHRGVkSjZxZ0psSjJncDkza1EwU1UzUUo1YzQwM1NqbXYvRld6TFNtbXI3dTkwTGhpN3hTMHVPZkhNd1QxWlNlQk53blpjWHZoYTFVV01kMmVzQy9DOUVlRHI1UmNlV3dySlFyU2hPU0pBZFU3NlZYOHlha0IxaFo5TjVicnN0cDFPdUxsZGdmeVlVT256eXNoQ0ViMGZaY1NrK3ZRZzlITk1qRHJobjZvQ0xNNUF0aU9nQ29tWGZhSXpyU1ExQjhyVXVuU1RKV0NpY0pPL0sxMjNMYkNnakZRdi9yZ21IQTAycFNZU0FhcWNrbUVhQXdWRDBWVUFKZ3J3RmRDZWxISmJUZVkvQ205WWFYblM4ZEZ6dTN1dU96UkpEQ01ZVzlrb1B5ckJCZ0R6TEFoZUxXRlFPYTljb3Z3cWt5SU1QNnR6VXJBclZlRTVLNURrblZHNDJsd21EYjBTRnFBNDQ4TjAzTmJOVU1EZGZRTXZ5WWt5OFVhVU5XTHRhdjk3REllTGl5TDJqT2NqQzlBT2Y3RU5rME4wczE1dUFuRkwySitscjZCWjk2cktESEJjd0RhSlhVc3FhU1IwZDBRS3c1N1k4QU1OYWpmdlhDMlQwYVNYQ3pYMm5iSko1VkVhQVpMWW5QaHFnNE1yeDRndFJXSWdaMDN0eElnWGU1YkJHTnR3eGpKdU40S1hkRmROd2ttS0w2eXVwSjhMRERuVlN1a3RnY1lGaVBqL1lNRENxR1ZseTJ2VmZ3NmU3UjBtbWxmdTBJN202RlFWUDJucGkwNXFCOSt2RUc2ekxhVDllbTd0M0dMK2VsVHBqZXFETCtGdmtwdVd1MUtZTnNoT3owZzJLSi9ZNWlTWEpGWnkyWWkrd1pBMVBMcEN5UnFwVDB3UGRReElkN1F5L1E4ZW1aOUlKVGRzRzZ5bHoxWXJpZnJ2ZTd3eFRqUmFsT3pvVjNDdXFMREJDWWViRFVOaXY1UW5Nam5BU2FzL1Vac05QUXZFdVg2YmZJVXJYZ0ZiV25FZzcyTWZzM0tZS1F2S0czUEVCVGJEeU5UcUxWcytmS2syeE5DS2RhcTlNcGVXWjZiYkNqblNWc2dHeXVPZXFhdURTa0hqbWxhbUhXYzhvRkF2bTVnRnVZZHY3MUhPQUx0RW90NjVJNHgrZXltSEtLVGRZTVViUzhKRncrb2h3WFdVNWNudUVkNm9nMEZ4SGpRYlpGQ00zb0VMT3hUZDFTRS9zalpXaHhQdXlwSU94SGhSQVFXdjZxWW1oZVY4TEtQc1pkOVo4QUoxTXE5bmg0ZEV1OERoZGRrTWJRb3RxeHVUUm9KV0c4NXZJMjFNVFN3Q09vN1B0MGROQ2NtdmJYUUxRajEzNzJhSEtXUGRNU0xReFAxaXFBdzlZdENiT2VOek5XR2JBOEpPWWRMQ2pqM0pPWVhLcU4xeUlGNytMMS9DOEVsTk02T0ZzSnZzYmM5VHBES3daVzdkQ1J3OUhFK1FTVElxakZmM21MdTlaK05PZlRObElUWStIK2ZJY2RCcjhlRlVUVlFMaEZxMTE0Zm9yVlVadU9DdXh3RkhDb1M1RzBvSXZ6aEpla3RLVjUwRllLQk4zLzVBVHJpczZLcVBETjRqYXFxWVZUNDNtSitqRDg4dUROZGx0VmluY24xMzRyUG9vQ1lzWnoyOHpoK1A4ZkQ2Q3ZtTk5zTmpBSE16UUJ0c05NVUo4dGxRZnhlVnVoMEFOajJOc2xjek9TejdWcFZnOERZSm85alFZdzFZNGcrS2E5K0phdUJSeHVNVlAzSnlNalZyOFAweG1XOVJETkFDQlZvWkFKblE0M0xBNmtSelh0NGNOM0orTENFVEFyZVM1T3lQVDJvendFTnMwYjgwdGNTZnQ3Wkx3bVM5elVKMXhFdWdiRmRmSUxRYXl5N1lrV0l5dm1PWExtSWRYeFpCczIwZTI2a1FsUHFzL3pScW0wMG1IdDZNeWRaOUh1LytOZncvTkt0UlFCM29FOWU2K2RkQUV1SmJLZFdWdERwMzhVaVlITWtZTW8yc1ZncDlHVVgzSFFNL2hYLzNjZy9CcjI3UndkWlE3Y1ZvRkNPQnpnTTI5MlZsM3NmcFlKb0loamF0SGc2c2cxeTFTaGNORDhtdkRRbmR6cXZNQ2xsNURuVjJpVlFVUWs4S0ZpOUVwNDJ5aE9NdUttOTNrckNqVktEUlNla0lrWTg4elNjLzNuOXRCaDNEcjJuZ205VlZCN1RHNm5TUUR6Z29TUlZtVk5LdE4rY2wxZnFCT1g4TDFNVEdOcU1zN2JObncwY2xHSzA1Z2ZCTTk4MzRnUGNTZm5qNEhqS1VMV2JTblk4TVlKNytmaFNXcFNjZXQ2Q2VVaGticmFyRDM3cVNNQzVlUXBsdE9ubEUxeVlrdk51OC9DcXlFMVZORitWbzgzRnAwaE5DWHRiVnZzYnc4SFZORFVwR0duUDh4ekYxZ1lUV1JsZkpTZk01YnYyTnRRT0JSWjlYMUZzcEdJcVVxNXM2THBucG9FYThlTE9ocWtXUkRmak9ibjhHQ3dBeW5oK1RJcmNkUUtBU2JUOXNXRU52SWFuM1RDSVViMXgxWGd0b01FVkEzU0N2SVNLZUZ3bU9HbFdpMVY4NEJ5NEJhQUkyVTU4YmdjbGNza05RVTRycUpFM0ZHUDIzUjBNMnMrSnhlQS9xQjEzc3dlNWRZbVU5bWgzQWsxQnEzczZjUFR2L0kyTXJtZGpzT1B6MVpOb2UxR2ViS2xRM1NFcVJGL1MzdE1mM2g5YiswRGw1a0FWd2cyUVBjTG1JTUdRMEhndlZ2VVlYU2RHQTJYN3ZSTHU0Zi95UitCd2t2eUdjcnRNUjcwVXlsK0pDSXBsbGN5b1FvSlZGUG9JT1Fkc0wwSmRnaU9iWUs2Q1lKT0lPYStqUFZRQXVneXkwalh0YjlKbmQvRlNQTlpRbXZicjB4ak5tRElONm1RazlXTGV3YTJGOVVaeFRqODF0b0FCRVVmd3prbUhVWGx1amQrb1lleUxMT3NlOXpIczVlR3ZWczlQNzNOMEQ1VkdxS2pJTk1uUDBsMmxFRkh2ZG96MlRYVGlFVlZVanVMWE8rRmtlaGh2QXR3RDFib3RnR0xlSTZENkxHdXNwQ2hkaTdiSGlUSDRDM0lldXZCaEFFQ1lOOXp2SllSNXVibkVnUGNVNmVMNEdNY3IwRThHY2hXYWVRbkxxTTJUUTNsZFJlOEZva2l1Z2ZyWCt4MWtiaXVhRWVHYi9GVmpPZkprd2FCcHE2U3NUSXE0VDBMY3ZJdGFmTS8zenRXT2pRZm9VSzAxNENiQTBUQlRZdlAzVkRQQjM4bXUwNUFRSGZ0M2NtQmU3M1JlenM4Y0pscFJCaEU4Qm1hY1Z1bzhmaTloQkdLNmFqYUpiUTFjT3ZjSzZqOTJVVit3cFFLYjRkQnluRFRBSnBVNVRwQlVSZzFTeVpDeTdWWi9iTGkyMHc4K1dydlFuQTlNbVZ6emR5VExxWkcyWUlLT2lBTHVOdnhTUXNWekRubjN1TGZPa0JhYnJtdUVCSWRDMGtCT0hmY3ZJQ3VycDd6MUNjTDBSTE91STdkNUlIUXI3eEtUbVcvT1ZocUJYMVpGWmNKdUwxSTl6bnlEZ1NPa24rOVVIc3JQOXp6d1daNFJxQUdtRGJ4Q3RHRzZ4WXJDdlFFMWQxK3VZYU1KQ0xpRXlUWlNxSHIzdzJrUnViaHdpN2FTd1dVQ2VJaFdBUHJEWnMvdXZoZXhxc2lONXpVbFBpYWd3T0hKenh0cmJKZ3B6NmFjWjMzK2E0S1lSeS9hNGVLNDJyWFJwUHRQTzVaK0F5MUFBYkI1dExTcVBmNE9vMk9nRnJPVWt2Qld5VVpLN2xpUEdINm4waElpY29MUFR1K1BuSjRDNmNmc1owRjlHdTJSN3N5dEt5eldFUTd4Ti93QlFoT3BHNlFBMXNQbStEejgyYVluTng4TThoSVhsNCt6Q3RWNXZ1ODhSRWdCelpaK2ZUeldHTWM3UllWeWtOc1JqVHFXeFI2UCtLVVAzWHlFL25EQ2U2ZWtYUTg4NmJiTGlQZTlUZWZxdDQ2TVUwcmszNkJRcm8zcHlyTjRCZUpaTGx4blNYYWYzWXpaT2g2R3BiMThtZlBQY1lBN24weS9sZjNIbGpBZjhCWXNLOS9kK1NOODFGelN0K1l0RkV3MnNyUHVNZXVITXQrSGRvdktsaTRobTFGeWd1L3I3NWMyQWN2TE9OT1hNL0tvaW9SYjB2dXFDREV5MXVtUnhzSmZpOU95NEVBd1hNZ2ZuYXhqa1FiMFdmejB5WFBub0tVSDArSUdPekd4ZUxITFloT3REa0pRTXEvMkZRSjRRdVBuRzBndTZIU2p2SGNKYW5lck1mREpVYlAxbjU0YkhsZ0V5U2E5ZE54bVV6TVdWMC96U3grMy9ESFVpczBzcmhNYjV2NUxIU3Erdmw4UXVhbVFQeDBrdnhYS3ByOXlwa1Z5VThWUmNwZmpBVnpCM0FNa3kzNGM5K1NrNEErVmtUNlBEYlhDSklVdkgzUkduSFB4amRqdDBJdzNvbHg2dUVOS2tsZmdNdU9OSkV2SXltRGhFcWx0SnZwQjJ1bWZzVVl5Kzh0K2Jva3hXOElQSnRSRllCdXNLMjVORktIcE5xdXRhVlF6dFFSWm5idEVhenQwYVoxbUZZMjZXNlQxQVovaytobi8ycEZjN2lrU2VzK2Zoc2dCZVhHa0ZkQVFlOEN6QnUwZnlIWXBXSWFaWXJYVlNJczN5V2lNY0dIZ0I4YVhEeU9EVlc5VTJ2YVhvY0RJa1FzUEpVeUlNU1lmWHZtd1JaUDc1Qm1Xd1hNdDA3dmlGM29xT3FPNlA3U1ZGKzFLOFU1eWNQaXAxN2ZZdW5VSHA0Z2RPNSt5RGpEZjJUcW9MRUpIWTZ2UFRZWnNOanBRR1FHTXZYTnJma0V6NmxTSnBFUGtiN1RNV1dPWFdVamIrbHhjSTF1MHJCRXFYMmE1M0kwNkcvMVdwOXN5YThtVWlyNDgwQW1iV1VUTEhqWFpOSXNMNXpMWkg3M3V3bHJsS1lMMEQ0L3RTWVhHa0psbWRZMnZ1N1d5SFl4T1dMSmt2dzFHWm5lZi9iOUJNbk1VUWlNYkQ4djdkSFNNZHVMYTM5QkdjT0tocWNwdHpUWXNjQW9XMlRtMWQza3pXN29lMW82NzM4TTh2SnBBOTMybmwzelpkZHEyVGUrM1VGaEU2R0xndGNNUnQxL1I4NEJrcDErWXQ0UlBFM0Jibml0L0t2aGVkLzJwTWNzMnlmSFN3NGNNQlNyK0dLREJCcGV2SStqTzVyeXN4TFZEckRjZ3lxTHpwTGJ5S3RCOStzcE0rK1NMY0F2RUZ6QVp3VHNNNU41QVhld1RIeG1yMXM4MWFHVHZ5bDh6Snpna1pqQlZ0NmRtWkJlMUY3d0JGcUI2aTI1cmZ3Q3g4Z056czV5Ry9FYUw4UlBVZ05GSi9Jbit0MWlVUHordENza3lKdFl6TzNvQUdJSlRXdDBZN3dJVUEzMGFoYVY5TS9zY1IwZkNSZEdOZ2JxV2xSdVlLT01nS1BQQ2hucVJUQkRUdXpVb2FWQldHTWtzcXI1bHJzU1MzSVc1K3JZYU5zTUdZdHZrUHU4MnIzY3E0WUREck1yWU4vSStJU0gxVUVudlZDQitzSWZ2NzRZU1pXbnlVdkw3b1ZOSjNWV2xBMlBCa01BeHM3cVJWNjJXTEZlaGpqazhWcFdYMHhnWWY5UTBsWE00OU55WlRtY3VTcko1bUwvejd4Z3N4cTAxdWYySVpxLzNEZkpidlpBeDlGbFNFSHlwQVlYd2dZSDJ4a1hmNVF6cDJQb205UytET0k1WHdsc0hXYVZzd1h4a3NhZVUvaURpVmt4bmRWVHNiWUdleE5vMG1yRFJyVmFWMzRCQkNxWGcrMlRxeC8xNEt6TmtsTmk1M2VJeHVhZ09UWnZleS9aVGpOZFFwNVZTeURMMU80RVR5TDNPcHc4citJWi9BNE9aNGJxdytpc3VDNzJBTUZBRmgvQkZ5ZCtVMk90K2tWV1E1ekJ6VnVnMEs5MkNMa0JzazBEbkQzWWFSeTJaclpwUm9QRTBMWjhvc1YvaUVZTmR6VytFV1BvalJReWRiOU41SXk5VGl1UnF2Nk5PNEtWazFnUm1TT2s4V3JnMWZ1eEdadVhidzl3UHpVbkZmRGtjRXg5dktxZzRuQkNUSW5TWEozZkE0ZjB3c3VsQTMvMW50a3hUYU1CTWtoWndLTmdtRlhCMTg5Z3JpZmNxNGMwZDlMenpNYjZ0dmlwNEhoRk9sM3h5RHRVT3NZL3plMlRqZDRtT0dKWmVtNktyZFZYSFhFMlRmbEYvem9EQW0vbU5tS0lnUGU3YzRzMnovZmRCK25DdWxxY2tGTDhNSUg2aHVONWh0Q1l0TlFTZzZqZE4rNS9FTGFzd2JOelo4aEYwbTZTdjVWMENkcTR1cUlUUWg0Z2dENjV6VkhFQU1JMW9XcExoZmkvOE1LOEZLbXBMdDdaMldiWFRVSVpYMGwydXA0anJ2TDRXYjZDZEMvS1VkTnJsRGtmS1N3NXVGY1ZkcUpuYWFJdTFTUjRTbzVXWEM4SERTWC9UVVlCOUw4cU85WHJKK1pvaFR3RGZiREZOaUFtdXVaVEIzV29ud2V6WkpNOHFnbm1qTG94Q1FDV29nOW1ZL0hSUFYvbzM5VTFKakNMYWZNTWJyeFRvY2NuQ2U4Nngzbml5dDA5Ti9oNjZYZWRtRDJsWTRJRHlkUjcxNDRnc1cyQ2daWHoxSlJUZjRTdGZ3ZHRwMkt0WFBwdmp6UWlFNUhQS0RVOXY2TTdJTFV1QUtxMWd4NmZBZGxnU3JSc1JFMHF6WjAvWDdzQlpaSUtpOG96TzE5K1ZmK1ZXRTd1c2IrS3lOam1BOGVJZGZVV1ZQc2dreHhsTU5MSjVxZmJFYlN1NUxYeE5RWjVEVGh4OG1ndTJTbGw4MVRaaHF2dzlQOGVLUjBqa04vUzdSdmgxN1BGNThvUk9qSHFOdEpZcDVmM3JvQU1IeVk2bG5lQ3ZZZXJBYjY4MjlEcTFlZVJzUEJJWFZJbTVaZmV4ZGJzRWpLUzNScVovZWozL2xCbzNCanZCeDR2WlB3WnJsdCtDRFRKblNpWExzVFlEbHVNL3ZrZjE1L2VxZkZIa1cyMVlMVDRzYW4zWnBkSFM1RHBzZklVTS9OV21kWWRKY1gyRng4b01ob1h0VHdHWDFLcUxNUEtQN1BETkdxaUxvWkV2MjFDK0VpRnh6aUVPQk9KZjMyT05QbmdiL01FcE1LakRFZ1hUbzNDZTBzV2lxNjVWQlRtUjY0YlB4SElHb2g5ZnYxYWQ4bGFmWkdqNHJWaGZjQkdiRVgwQzYxQ1NIdE1XbGxrTTRvOHhPS3NPQ0MwUEZVaG9YOEFwV2NpSjdoNjhPMURQamMwbWI3NVBEQnVZa2JFak1RMllvMXNqNjdOdU54TTh5NnJ5ai96eTBnT0hVMXdkN0lEY3dIdjduSUVqN0U1eGQwTzdhMm9nV3ZRRU9kamJPMDMvR25OdUpUTThJMVl5S05vcWw5T0tVQnBnUVp5OHpUaDM2aWZZZDJSRGlKRWZXKzUybnNWTXBLTkJkcllOaWRYMFgzTXpKSmxwNHVjdjJvWWRhTkZiVHNIM2w1WGxleWVEMmxyK2NCcFBIQW1VL1BVOFdTQWNET3QvZ1IzZDBhS3pFRmZIRC90c3htL2ZTSk5KdzB3bnNtWjEwU2lROWlHbG5BZklXUjBsaEZDR20rRjhuV0JoTEljZEZWMTJaZllGUWdjY2grTlNaYnVpM3lKODl2eHVaV0tXcnd3NkEvaE1vU1dsVzRHdzFOeXhFeXVKQWp1OG9TU1Vzd0hKTmxyRkFPMG1tcHg2Nmd1K1o2cDR4N3JxOTRPcUQ2Sll6SURhSVhQc2pDUDhyTjNqOE5kSkIrY0JYWjlDdlViNDZ3VEFSM1I0UVdqYjI1QUlNeTdtd0RjZEUxcDkrcmVKbjFDY0FMYk55N1B4eGk5cVJSVnBSSTNyTFRLR0VtLzlrUTdSckNWb0dmOWhKa1d1bVhNTDloTDB2bnhwTTkzbmliMlRPV3BUL1U5ZUcrUXh0ZHdOVm5NSHA3bzhrMmR0WnBsbFoxWkJTb294ZzhUSDZKZXFST2s2NGpNZzN0RDFZYVNrbXRZQ2RuaVVycGRtaStQRmk3dUpWR2dVRzZybTNYZ2xNT3ZJYmJzZ3VadmhSSnNRa1BONjlWc3VQRms3akdLanMxWlNhUnJkOThtcDFPbzJ6M0FzQjZxbW1tTCsyaGx2WGFFcXVKSWhpOXgwS0ZBMm5mdHRXL2o3QnJnN3R3MG43bUZqMm1mVE4yNzFtaUtUSCtIU0pvRkxMdnd6WXRqTEdDaXhuWTZZOFdma2VQYzZ2SEw1VUZFRkVXR1pCcHZCWE0zeXBlMkJrSVRwRlRJSFkyRjBPbnFqZ2Z6YnVOQXhIQ05OV3JkRDA1aHhOa2xGMitkZEc3cE1CYllIYThqZUdZU25sZGVPRnRqOG4xYmhidVJVYmRtckROM2VWQnoxcmpPeDZsaU51a21lYXJRN1RKeGNvUjB4dXVaSVNNUk8rK1N1SFRYYktnU1VVYUo2OUFEQThoOWFTOHg5NXVtQkl5UklRKzBJVkZHWnpyY3plMjU0Q2VqMVRYMjJKMU9rSGR5Q0szQktYZ2lSM0dqaGVYdlppdDFmOVZOcUtYUjJvcWMyRExva0ZqUXZoVjlKVFl4aUQyckZOSUp5eWdWMVBFSjFLenNBbURZcFVSUzE3ZmlPV3M0VllJb0VIVUwxbS93amRHbTFZL3hzL0hEZCtoOUVSbi92OXlsQjc1Zm01SUFwaDViRlZyWWluTkoveGQwMHgxUWVCUk5PSkwvR1RqVkpicmNJR2lWaVA1ZlpQYTVraWNPUW1XNEVLNncxUC96YjFMbDc5dlIyQ0VSdVZxTHQ0cnJOSzFNQmxRUUgwUm9VUHpUOWN6eWlHalQ3ZERxbTN5d2xSQlV0SFphdDdzWWFSTlJNRTJyZ1Z3V2pTeFJtRFlMVTJkanJ1QlMzUGlCeGE4ZlNTdmlDY2hMRWhkNGxZa3d1NFpQVkhxRnVqQVZzdmNlZXFNdDZmNysybUducHI3T0pTRTNmR2FrUkRTVGViRGIrazg1VHcyeUtWeFFocnM3eWdIeWtadEpSdEZyOFBEUFd6Y1pscXMveStIV0xiNVpCRjZoeXREd3lacWZXVVV0Z1dJamdTN0VpL0NDM29Fb3BYWGgwbDU4MElyM1BZcTNhY2Q1MkpxeGV3eXBuZVNBaVU1bisrbkpYRThFWlpKNklIUXRGSjF5cG5SdzNabmJIY3VVazVXeXRFOHQyN2xKV201bGFnMStIQStGR3l0UjMzb1NPMVN5UTVhY2dOdTFjaDlzaGJ5SnpnOHhtZ3VrSjRoTCtsRW1Ua25GbEZZS0VCSjF0MitqaThlMy9McU9sZkhvOVRRODArdUFlL2ZIcGl4aVpHZlMza291bngzMWdHeWZaYnpsOGQ5dGE1NVNjd3pWQlJ4RmNPRFNWbk8yV1NYeE9xUTJnTnIxWFFZemVSRE05aGY1S1UwWHVyNjVIdms1blF6WlFlWHV3dmRsb3B1M1l0YldZRldvYU5hUSsrbkFrYnVtMWdFOERWUWUvQXRTM2F2emRTSEdCUUh6UUZhYzc4UFkxWDdHc0hCT240d1hFbFVyUG85MzQyN01LQnNPaUhBZkFTUTVOYlJWS2l4U0lNc2wvM003dGhjQTlxRnE4SExUMVNQN2l2YWhLbXFicGl4eE5HM043NGRVWGgwRDdvZWdqS2dqNWcwbkVtT1BOOXhXNkhLQys4bnBBWmMyU01VSSs4NU5aeWpWeXNQajdNUVE5dW1nRFh2Z0NsZVVuclhMN3dCblBOZ3ZGNkJJVXBJbUZ6NGxFWi9mOUdySE9HSy84NlZldlV4bFIrVkI0aFRzQkplRFRweXVLazlRL3QwaG03djBNWlN1bHgwWERuRzBTQm51RXUrWEllTmlkRFJXV0cxU016N1JkSFYyUW90TXpYYkFqUEdRU2dpNjJ1YmVnblpYbXArYW9aRVIvRU9JRThZL2VVWWp4dE5HWHJVNURsakJZQkJocTFlRDVRamlrWWpOZHRFdFgvWFlaY0NoRHJ6MFVIV1ZEOWhFdE8vZVpvY3o2dFZ2OFppSjRUR29yZzdUWHhaTWQrYWVJamFuQ3ZGRDBSTU54eXlRSlhRZU84dktNVmJkdzBmRXpQRWk4NElxT3RpRUlMTmNZemN5OGhqUlFEakRPSXpKelFnYzlYejFTMnR5WnBSOW1TNkdibkdHQmwvVk5PTitYRmhFSFpFVzJJTXozbk1DTE9ybmdqb0RYOFg3Ty9DZkhTVHhwampJRFNxeSsrLzBvcnU3dW5JbUtmTmlWK3BQWE5xSGU2eXF1bWFOcXBjaDJhUlVyN3g5M2VkZmdDMm9XejVYaHVwN09QMnQ3b1BPU1kzVVVzdEJaUy80Q1RJeGJGTmR0V1VNRmppYmhOQUlEMDI0eEw0cEFaWWJPMXQxSkYwTHNLUmw4dGJQRldSdEhuQ1JFUmF6bzVNTEkzaTNNQ0JGNVNoN1ZCZDJ6N2ZXY3l2RzFQUFZ5MUx3OU51QUJzcDlMNmxiMnRPTExaTkUrczFBKzBXUTBGSURmZXgyK0ROQWpjS1VGSjVJT2I1UUdqUzRJcE1Uc0FHQTVvcmFpdUVlNHkxS3JaM3J5bHJQQkNNK1FvaG1sV3NPVjh3WkNlOFgzV1Q4UFNxQ0VEb3dxWEl1NTNObFZ1aE0rQnExUWVMTzI5R3FzSE5VWndEZkpuNWx6R2FLZFhVU3dNaUlCVTRYeWtOVTVoUkhRS0J4M2VXSlEyYTFxZlg1YXRKYTd0ZjhlRGpwcnR3VnJLT3FkNjZMZnpYdXBLT2U1aklrTW9lQWdCZ1RvZkRSRGlVTXBVQUhNdmtXN0JRaFZhbEh2RnpSVUI0OGhtOUNXVUIxSnIyUWI2M1REVUgyWUhyeFd3TEl1NTh6SnhmanpnVUN4Q2dZQk03ZWxjT2M2MlFhQ1djWG9CcEdPR0FScS9iVHB6eHZUOWs3MkgwU243YnZ5ZWt2aWJrUXE4U1V5U1hqamltWm9XMW5EM1RLU3pzRlFPZ0JoNWh4d3FtZkYrU1hybmJoUXFhamUvWTMyMGRpSUpaVUJyT0tWOGR0Y3FnWUJHUklOTUhSSWZyYUt3UEtQOCtLSFp3V1Z5OVBuQ2lOcFJZa0VZTm1zaUF0SDl2VTZDRzFjamdxalFxL010Mlg1VEttamU1OTB3dHhnT3pFVll5VlVKaGUzSjltNUE3TXNsK1VoTmRrMDc4UFg5VFB3aEpPaGxBV21ZOGI3ZWlIMmR0aDRxMS9xRXJRc2FFZXNGWkpBU042cmRLcnRmbWtiNFhsMDNVWHpTZlhSdmk1NXZZTzFoNk1wUjJSTDgxRm4xQkdiTVpxRkZVdmNrd21va25SN0dZWldObSt6QjU1N3JGUDFEUVZsZ0ZDbFlRNHhLaTNlUGlBMDRodDNqcVhkd1VzNmlGWnVKbGtOZG00WitFRGZ0T0lNVkFKVW03aXdTdkdLcVhXWk9HR0FjSVg5bm1NdmFWcThhRSs1SUN3ZEpJVnpGdVdHZzE4akZOQ3BSNG51WjZkaXdFQlIrd0lNOXJkenBYemJZZVdZVXFoSzMvTGQ3NWRocnFuR2dFejFCM01hNWw0VmV1ajNQeENzMkhWcUdvQzFlU21vMGI5b01LeWJXdzdtWmg0Ukg0ZnE2bk5LRXh2ZFR4QVp4VjJEbFpQWTh2bkhZL0pEV0l4RmNqL0owY3pCejgyVld3eG05REtyeW4wb1BwR250Ulh5NHd6ejV3R3hmdzRldlBCUktrL2RFQmpGK1N0RzZWMFYrZk9PWnlJeHhxWFYrSHhyQ1BVY0ppQ2Q4OURjRVVtblM2YWRrMzFqNzhXL3JRWXRBZDF6Z3RzQkpLWHBkMTV1QzQ3Ulh5SzJyWTU1MnE0VTFwVCtid1o5ZG9id3REeXBndE5QWHBQcjZSR0VJSFZiYm9taHprVjEveExVOURrWWdsdk5NdFdpZ1J1VHUxeVY1TnZIT1Vtenc2UER6UHNDalJlSmdaeTFyZ25EMFd1ZWZCSmc1Unc3TllyVjBlWnpRZWJPWHVPZFlMejFZOU95aUNkVEpMOU9pV216ZCsxeDNvcHJsRXYxbjU2RVVsWE5IcnhJSFphNW1FYlVzaVhHUmhkUzA5ZUNka2RqeHBMb1hyVlZ5UGpvL3BaRTFrQXc3TWhqVHFZUkVrZUhkYkQ1NXNzNkxpSXViWWJqeVF5WTAvaklzdmwrc3lIYXNVNGdwYXpxYi9vSGxJRUlMK0g4WFdHQUZOM1h6L2E5c0MxRkJpcTZxVzdnUTRqMlVETnVnejA4c2kxSXVFZ1VhVkR4ckljMURXQVNEVGNDblhFdXdwVG1aZjBSY3hiTVhld1ZHV3YzWVJEL1UrVy91WEpGM1M1R2pLZDNyN2ZpeTFVQ0N6NHEvTHNkaUNZT3RrK1FKNFErbHZVNEZRcVhYeFFjemZUbUVXYUE1VFlvMmQ2dWl4WktPLzB0aWtHNmkvb05ZbnNZcmhMRTd6NElrUDVxSWhRWU0wek1SQSszZ3Z1V3pHS3pwVHlhRFVPV1BYMmljQ1VTMHZock55NDBqekF0MlQzajR5aVBSUDBBNDF5a3U1bE9ycXQ5ZG4rNGNhbnJXY0RkL2FFN016YjVTY3ZzMkRKRGhmUVlvdWNHcXB4UnZrUXYwN2MyY1ZCNHUxRzNSV1l6elNBbHdSSFN0WWthemRqY3VKdUtwcFpRTEc4QTNDR0Vnay9CVmx0UGJVTys5TWpFYTRJZE1NSTZscmFFL2RjOU1NNVV6NnhTUjJuUVErdzBCWlFEWUJnUGF6cDNPeXZET1N4cyswVXdhMkt2eThWalB3eVQ5TlFNd3VWd3d2Z1RYTWY2aFIxSmw1UVdMU2EySWhHM0FKd3ZsMEVFbkZleTlyYXVleXhjZUtXZHQ1QlRVWjdIN2tsb05TL1lkTHpUUXVyTnNsclI2eWJaY2p0QVVtRDBXV0hwTmJJNEV2MmsvelQ4UzB5QSsxNGRTdWhFcnpsM1VTSTN0U0Myb0VINzZITnVWdlcvcXNxOXo4dE5wOWtwUFRPYnZKR2JxOVJPWGx1SUVocWFobStpeDg2VDY3NFJiMFpPUW1zNk5wa2ZYamZRQnRxbTdDUWhPejZ5dmpRNzdBdUx4SWJVYW5GV0VSSjBobVhEKzFqMktSVGpWby9FUVBFaEpOdFJNN1RmenVQMG81UnMyVlRRNG9QV21WWE1GQVA5QllBc25xai83Ym9pSTIxQVJkYkdwWXRRTXEvQ0RqWHc1ZEF3ZFR3ekZyRHpoME5Fb2VHanVIVWVBckpyZFp6YllmajJXRjFHbjE5UHdlL0h4YmVVTm00SlZERlVHeUtESDFJZk9FZlJGdkxVNnJCSzFCWHY3U2ZGb01ZWFJrWkRjejdKcFJGVmJ1VTZmWGhKY0hHWjhhSWxPTnJJZVhTVjhTSWVZYmNWWmVNZXlHWk5mUjVEbGI1OWFkdTdTclNKS3ZiQmVUQ1hzdlRwMTJpTjFqZUM3V2RzTmNiWHVkUWtaOEhLMG9kVVp1L0tyNEZqT3YyZUFGdkJiaXUrQTZZMlpkSEtXbTdOTGQvVkcxMXRtUGdnVS9zMUVUNGYyTTFOK3l5elprUlp2TERmaVQwSjBTWnh0MkMvRENicSt3Q2N5bTE1elR4VlZqdXR4c0RWOFY4UGdzdDhJZ1JDTEEwMnpsSm12ZEwzL2hnbmtXS29SNEd4dEMxcityQnhBQXIyc2lrblhRRHFQdzNzWWluS2hEZFVENmxlU0owMHFqV1kyWHpiallhVHhUbUQwQTBoVGlNZVEzWkpqZFZ2Q2FLTWJNRUNIZkF0MzFTeTAwVVhSbmJqQ3FZMGowNDArQWZ1Tk92c1hhREVicXR6RUVSQkowSjF3Vm1taFE1VTJzc3RKc2p1ckZaVGtvbGJNdFk4RjZiNHd6VWtKYktHYWRIazU3cnkzN1R0Zm4vYUhzaFNBS3NZekpZUElZMzJkdXNBY29ubXlJcGttNzhFWXhiOXhSOTkyZW9NRDFZRHJPMWozeVdnNElDVzdYSUdHb1l4SUo4SjJ2USsxazhmTEI2K25PVWdXRlZhU3VVRG9VSXU0a3RGR3hUeUwvd00vb3NqY25HMk81aUQ5NWlmZ1hzcS9KemtwZkFjY1ZRc2wreCs3a096SGtjaFoyUWlDazJxMld5YUkyUDh6UlMyQVN3YVBoalZjd3NGODg0dzR4Y2FNemcwTW4vZTJuL3hYUkU1SFM3aHdWZWhkcjRzV0dNT0RSbks2TjVUNW9nRjVuNFNQcGxoZ1BsU3VPR2RMK1JRdDhoZ0dRZG5wUGpYRGk1TEhOUGNJN2RsMUI0TXM0UFRUdm9YMER4OUtLRVFtTitoYUZDN1ZIYjNESlBLMWU4aHVYRmgwSnVUcDAwVFFlQnlIWko5ZzQ1S3MwZjVmczZIZUNFUnA5OXlVSjV2SWxmMEJFanZTMkZ1dWdkNTBYbzFKbjQvV2hiaUlYSmU4d2JpMzg1TnRqaU44OFYwWVRGcnloeVg0bGwzMEhsMk85YlVXUFlQZU45dzFFQmd1UGd3S0hIMGpjVjdWWjJpdG9hc1FvUEdGb2l0VzRyN1dwRTBaZWtsMGQ0aHM4Wjd6c1ZHdk1uQXJEdm83NXNqUExGcFp4ckgyZWZWTUpRTEU2MzlFbUM3YnpGdGVMNVFwWlQ1K1pua0cxNGk1QlAwQ1Q1NmFZc1U5a1AzR0FUSkFBYUxJVkM1V2lCcTdUM0cwUkpPbXEyT1EzR3puVUtMbWtXSDE2MyswOHhkdzg4ckNrazE4U3V0YjlVNHdRdXJ2S1dLdndBc1FDY2NvNDhEcnROM2xRU3JTNytwSGs0ZzBFRjJMTGoxTS8wWW5BZ0JhWGNmanI3U3JldDdoZ2s2ZnRqbUY5T3BLT0VycmIrd2FHK21kbmE1R1lROGJMTzFzSGtLajk1eHlXdm9Fc0IwUWZXaytkZERGTVAzRHBDVTBUVm9XU1U2blpVbGFmNmdIeTVQRExLRmc3OE9JUWFackJsUEFRODlDQTJZTDdlKzNzL3dib3NCcnk2Q1pyRTBWZ1ZZWldNZHQ1cXg5bVRDNDVOWFFLQUhIbHN5bDJpQWVLc0diL2Jpay9zRUVlZ29rMlJZS2tJVGpCdE9pdUd1cDR3amwxSys5WmdmbEV6WjdYa2w4bnp2OU8yZWQ1NGxjd3YzSzZVRVQ3MllSWGhrdE9LQjJrOVJIMVRDdjBPakVDSXY1UHFVbndNN3ZkUUZKRGxlazB3VXRuQ0NOdWs3QTJiOTdOWmhTU2pmZzhEeUw3M2JwRGV2OGZOeEhhY3NUTHUvWG13UmdvUXllSWRvU2cvQVByRlo0RkZWOGRJT2NxZk9EZmhKT21uY0xuTEcycUFvR005b21nVFlLKzE4SVdxUFY3ejNKeWlYM2Q0bnZDeTlsU1JrTWRDdSttYnVRa0xYNnkwMWhvTVUvbjR1WnlNN05jcHM2bEZaOWlZbytCZnE5aWwvVlZLczRZZ055TVFxK1lQNitOUlZrMGwraW9jRVREa3Z5dlJOZ0hCR251OU9jeVV6MzhSeEFuTE9qYkM0WDl6KzNZRzJQV1RsSmxKeEdyWFQxSWdzb2ptZVBDRndsY1JSVFdncWFnRTNTOU1tMGkxTzJtVVVqYUVwYVNZajI1NTlDTFN2OVFhdlRWYmVQcmJkajZqWEVLc3RVWnp1Y3JqSm1BOXQ2S0RTNFBMWUpZSFRITWt6clpncHZ2SnhuaENHbnl2QlJNVWwrZVNTOXFidDJZd0o4dHpFVGpqK0JsdmdvVCsyOHdRY3Rldm4xRk9BbVBFWFh3dlltM0tYSHl4cDhUR1ZnR2h4UFNLZk14NWNST3dJNTRuSlNYTW90dEhLTWx2VG0xU1dEdkxRa0VOQnJwUDJoZ0VmWVBMWmNJWlZDVmRVS2dLZ0xzbWVDdU1lSFlNVGZvN2FvcWhvQzJXZTN3d2lnZXdNTEp0Q1dYOHFhdzU4ZHluV3IrTlcwckhrSEIyZzBCd3JxNHZ3Wk5IVHJXa0d0Zk1DSDhrU1FwRXdpaFp4VnEzT0lSL3RRY21LTmNvL3VKYkc2Ym5IdkhpSUNPN2VhZm1zK21pcEE1K2lQalJaVkpjN3ZFZkhTZFJuOUNkSWdQZVRiaGhyMUsrQ3lGK2VreWU5M2ZSK2V0VjBBSS85T3YxazdnSHN2U3l2aG9rNmFjVFJYM2I1YkRJQlRPN1RLUys5cm5IUXNhYVBSNjVjSk9qdzNSWlo3VzBBTEUrQUNkcWxSS0lYUk10dGZ0Q05tQWRqZUQvNWMrYWFuMTBkOWplQXFaOE5WeS84eUxjUWZnQlF5UEV5M2duTmFWVk1mU3hjOENGcXlaM1JGSHlNVXk1UElQV0tPQjlVeVZIczhqK3llMkwrZ0dmclRod2Rpall3cUtkRTErMDZsbFFCRnJiQ2ZqVE85STVsQTF0NUFacVlGbENUQ2dNSSsycjFBN3ovdy8yVmRxZkY3M2RZZ3R0eUl6S2w1M3RtV2hRWkRSRXNJMnNHWFEyUDU2ZnYvWXFuektxT0MwR0lqdkFJYzU5YXc2endNQjBjN0tuT2pnd2M3K0IxUDFvcytvOG9NWDVqSmtHMWh4YmZZc1dNRjFzK01GRkduNU8yOSswcHcxZzBhbkpMdjNuUW0vVDFrbzQ0QWRicUw3eERLYzRZUUhlRldWNkVDdTBVd3BKTFRzTTRWM0pZVG8zQWNoTWhncnB4b3lsd1lLR1hmMGtTVTF4NGJEd1FVRzVxaFA3Zk1jNkFsdWZGTDFUYllhclZNSDAzZEtwQXZabDgweEpjT1I2b0Z2cXVkVEYxaExHNVc1S2RnV05mSVBpNEVwZTB6V0s0YjhRV0dGL2xHbDBqUTJpZXZ6SWtzcGhSM0ZOZFdpc1o3eUNVSEVMWHNaOHl4cXp0THpzemF4dW4xT1I4dnJXUVcwM3dQLzNmQjdwT28zK3lwdFFEdlFFNnIvajBRdXJiS2VTZTJqREJQdUYxREJYYVlEWlpUTEp6R0ZSOUI5Y3FqY0w4RklJSFNaR29vQVh2QWFTem5NMjVmQzFnY0s3aGxFYm1Jb1IzdXRDejJOOXFGemNSV0VrTnlid2dLSExzMmxhR2RkWnJhS2ZFdGJQRUVjREVVMkJrLzVCNEgyVjg5SU9vUFduMy9UK1dPdkVFT0dycDM2azQ4Zno2elpyWnJNZk4rZ3lub0dSbzNoQW1mK3BYbnh4a0Z2bjZhSDRhNzVVejNpMk5ycG9heW1BR0VuRVRrRlgxM1l4U1N1YjJPVzFmdlFyZ0ZDQjlIbjk3MUs0WnRPQXd6VVNubWtQRVdqZG0yNWVvOHg1OHhJek5wVzNpWGoraW4rVlBVUzVYajRLRUpyWCthcVZ3S015Y21yMjVPMVU1OUtEbzBMdzFTdTAzeVh6bldYN04xR2VqcUIwRmx6WjBCMWZ4QTB5ZVlmOTFTUFgvYmpNN1hOMWdMalVqWWF4eWpNWEhzbGlJNXdHak52eDVJMWdSZXRjVmxLMEtaeUVFbUozeFgrcUtiaWROUXZrdW4rU0l5c1B5c0hoSUhIWTlFZmhUaFN1OFlRR1RxNFhSZ01DL28rUmZESnVMTGZtdHJFOEFIVHE1enlFcTNYd3dqdy82TzB0bHVKSE5lUWpWeGhlSUl1U2p4MVlzbmJXZ09ScTcxODA1YStpeEZraEJ1S2ZiL1JreWtZMzlNcGdXSE5mU1NTelg2ZkRxSVlQSzlwQ2ZBRC9zMU96WG9FNkMycjhady9rdG5WcUJ1UW5OOXl1eUx1Slg0Q051dzNtcmhXRUcrbWtDWk1pZUMyTDhvc0dNWktBNGZDZFF3YVNxZDdKSk9tZncySmNMbG5QSEw5dTVCUmFoM3I2YS8xeDRRbzdnSk1Qc3A4VGFEL1YxL3d0b01OMjNDT3VJUVFadkxEUzVTWXFnWTY3UUpTMzVRQ28zbUpOdENWVGRSNDQzVHpBZnhFcm5oc2xKc0NQa3NuTUx4SjNoU1RWZG0wMkJZbG9BaVc5bC9KUTc3aGlBaVprMks0NUUvRXdycGRFaTlqY1Arak5SSkUzckYwd016ZFJ6QmpSZStPY0xOMUFXdFFQaU9hNXQyelVWUnNQTHVrSUJONzNnZERieUE3WFNrTnVleUhjM0JzZ0wza3NLOFczVVNqcDVMMFRHNThMcEEzS1VLYm05S2FmTUROR0txWWRDZnY1OHZselVCN0RWRlRJdmtGOCtkUldmalAvZWNueU9laFRRalVkNVJXT1M4eGNmNHArMmFBdDF1MFpEeTE0ZVBOWHNjYWZGVnFBekVSYnV5bjBWTS9oYnJNNmhPVGE0b1QwZk9RM3VHN2xxYXJvYzJmR1oxN2xIYUhEbjdLSXlZeDl5ZlJoQjFVbzY1QnFhb0QxcTV1K0lhZzZKQjdZb2pBV21veis5TUVKTENYMFBCN29sd1FkTTNRUHVGVnZiRmRXN2ZvVElpcEdUckI0c0UrQzcxQ2x6MXhlUmpLVnFvUTA3NnRlcmFZVkNBQi9ZcFl6QTE1dHRkMk53cWRBSmUvaXF3cngyeUlncTNnOEMvbVM2bjZhVGtCY2dMODR0bDlHby96UzQybTg3emo2bGpDM3MyQTNtdU01djZaMmNoWmp0VFBiMVppRVVLM2RoUlRhSmFaRkhPYk1ucm9QMWJaQU1jSUpqNkhmWDBxR3lLTzhtUlpGNFlRbElzVjlYVUpzSjNsNnNaK0Z2dE1maE1uSUdRNU9TNTlPVHZMUkxjbi8yYVU4MVo4QUk3ZDUybG9jaHRkem5QYkRIZExGc05zU1k3Tldka29vWi8yTG1lMjI2RWdFNHA3UWhsdnZ2U3ByT2tFbE51MU9acXo3eTNSa3lrVTg1RkNZRm5ybHgreVU0WHFyOGVnQlNxOHpySDlYQVV1R3JVcjN1VlJNWDJjMnNNZTkzVGlVSEljREFtNFlBSS9wYTArZTJHeFc4T0dHRG90N0l2ZXh6eHZOdkcwTmorTElmS0xPZ09iT2xmVjBGR0JZZlIzQzJEVXk4dlRaMlRQSVdxUG5uaHJTVk1Lak9JYVhLclhJS2pld2hHOVVXRUpNSUJPYUpCbDFYTWZSNXkvTS9ZTjY1VHJVNm1uSjRiM0tTc1FrK0tSZ2hhYVBWaUp3YzczRG5mb040M1dka2U3UjlibGY3UTBKZE41OGtoZ1c2WG1hOGUwb1NGZk5ZRy9uaC9SOVNZbGVvZzNVL3IvZTY1Y1RaNVhzOWlad3RHM2l2UExIN0wzMml0S2F1Sk5xWDBGK0t0dDdEVVE3ZkhoSGs3WExMdlRnSFNGUE9sRGRQUVFZVG9QbFdlZlJxVUEzb2V2SWZpM1BheVltV0JpTzBBd3J3dzJaSEhHQk1OdGl3eGV4RTJXYVhuVGZ4WEo5R1VGUG5kWkw0OWpEOXBXSXdJWjE1MFVIaU52YWd0WmpQL0ZHam1xZEc0Q2xLYW1OVHkrNlIxd2lEM09BL3VSdTJTUmNkdlVBWXZhUWtyTDZFeVZJM21uOEhxWm9qN1JZMWE1N1FVcmN0cXpnNVltRXI1KzRJcUtCTmZMOGhaNExMTDc5ZjcyMmU0WEd1OHdkWTI0YnpKZVFLOXpFR1ZpTzJPbG9VelRyVFV4eUM5RG9wUS9ORkVzd1hLeVNrSnBPL0RvYmlVS2pEQUVaamJWMGxydmp3KzJsdWpDL2s1S2VTTjFoTGprbG94UFVDcEkraEtaTCt4UmV6cUFhMkRXd2pHd3NrR0ZreUFydXZ2YU4rcTRFL21iMG1YdG01dHVEajFoNmkyWjYrbUJHRUZGdXFqZE5XVEJUeHhxcVpRbEdEY0d2T09qMGpuaWpOT3hMWE16V1VpUjdBbWhqcDgwQU53U3JsSEI0L3VINzFRQ0pnYjFXYTlmVjBXdWlDOEsvOFNUeTBkVVZ1RFJ4bVp5aTNxTk1pV1VvcG5xYWVqUG15emdOMlY5YktJOW9zL0JRMzVQcGxDNDFDQS96WHRqR290aEdQd1ByOEJnajkwOEdkQXUzcEs0WmhwWnlwRWMwQkJtdCt6YjMySFlIZmR4QzNBR1c4d3NFaUtwZlRyVVl6WnZ2ZTg1dUYxUlI1dWNGcXIySjZadXgrWVNxMEtaV1hiV0FzQmlDcnBQUWxnd3NKOFlhdDdvOUF2bm5jblRyTms1SXF5SzJpQWhYZkhWcmxuU0xUdS9xWXFxQjhrSC8yTWVIdGJ0OG5vWUdSaDlzSmlDUGwxdFBGMTZEelNYQ2xMWkdzdVBTWEp0ejdSMjJiN0tHUll2eXdzcTZaNFdvR3RaSTB0dXBLRU1CcUROZXZZaVdXQ1l0KzZIZ1c3UjRJNGlhSzF0dkRuTWFqaXZ0Z1Nrc3NFSnVIbGNXRi9DVlc1OTJ0d0pEL3F4UE5ya2RZdzNIYUhoaGN4WlRxVmZOdzg5ckpTdmxyenJINUlGUHM1SWQ0VHAxYS82elFzQUlHNDBuLzVCb0hCbDFlbkhBUEJ3R3NlQUorRkQzbGY3K216dUFnSy9DbG50QVpJeHo1Yi8wcHp1QkxZWW9uVUVJRXdVUGxLTHJ3VjVDNTZKVDNLQm9sUkdoUDhOSVR1UVhqaUZYNVBoSXdYS0REcnVaZWxFR3VZSUJ4ZjR4SGR4SDAvaHZ4NUI0UjRaMTUwVXRmSlMxZnFXd01Fd24yc0ZDVnB4YTQ0NngxUEUvcGh5RzVIV21Vc3V1cFd4R3diQmgrMDNEaHB6cnh0amxXdTdkalZhMGdJM0VqcGVOTHhveDhyeFdZekhnaXNFd0wrWGlvdGVSRjFySDFUQnUxcEFXNXhXMXFGcGUxWDQrbWlTT1ZSRGs5dFhCZ3d5VHh3L0kwTm9TWnFIbUl1SHh0ekVESVdwYU9YZUFIN1pkbGdVQjBJRzB2R2FWa3hJU3RpbzgvUkQ2L05WaXIyM09rVEpxSXlQbVJnYzdOTStSVExxV2htYzlxMXJYSkJUaGN2MVBucFVLQlpsYWhCNjRRV3FGY2hGSk9Xd0RCb2tXeW5pYmhjZW5nRXJrczUyY0wrUGkzVnNCdVExM3ZsejI5UW5YU1h2M1JWOTlCeDdmeHIrVlROWjJCS2d6WW9wNDczdDRnR3Zqb09hTHpONHB1Q3h1V092YUJDQkc2L1dWalBuZ3ZJM3hxeHlMYTY1bjBlcGFJajcwMUh6TG1BVUkvWXRnQ25zckswazZjL2xienBjeTV4Ym5lSHQ3NTBGRnpSdk5ZUVVBak5YSjlqS3NjQjl4bG1nbkNKZDNJeE9IMGs1dWN2b1FZRURIMzc4SytXMUQxQmM0aisySkpLaEZxNmZZNlVURENIUGIxNDJoZDBxczV4QXBhemZXYTJPRGNKN2ZJNUxYSUFUWTVSQVcweER3MTVQMTBrNXEvc3dYRmFlUHBIblRrbklCZml0Vjd3eDdxTU5jdzd5V1VXbElxQlowRkU5bllDNXdZTEorVkwxclN2K0ZLZG45NmpJaHdhWi9Gb01lWHFUNm1pOUFMSkFZTmFHNlduLzNUZk11MDR6N1FHTnF3WXU5dTdKa2xIZnpoaUhQdGdxZXNkbUYvTnZTOUtkK0JRS1NIdVRmRHUwa0lXSm4rTFBUSjZ2L2RNZWVxRTNXNFFJVjA0WFFLQUoxcWFYNTJ2Z2p4Qm5WK1BzK1Q1UVgwbEpySi9DVHBTL0FYVU9RazJLN1BKa25tUzdNSkdFOXd5TFYyRC9GUUEydFQ2dDlMamp3djlNVXZWcXZBNTh4MjhkS0QyVys3U3JEMi9VTitMTGJQbGwvbHIrY3RGVmdzSllVb0RjM1NvVS9kM2VVeTRxNkU2NkIyQ1ZObVRoWDY5TWlub0dlcFdUOXgwMWxHQmp6TlJDSUZSL29tZXcxMStQai9JeW1WWnpOU0ZsSTRjbjJxYVVNbFhqQlVhQ3RnMkk5amtIWndMNjE2SUs4M3VNQXRGR2tRd05Ob3hQK09jUyt3R2ZVUzVLWUNPRWJhRVNvUGc2VE1nMldQUTNwVDhaTXl5QUs1b3pZV1ZRN2ZwYUs0YnprZmVEV1B4TFBZcE9zdnhka05VYXdpcWxSZmxQVko3a05LZnJlVVZTVkRCSkRqaHRsL24xV0pYZ1gzVXBvOUhkWUlXbU9aeUFKcm9Pb000Z2wzNzhJcThYMjJScTNMdkRqMDR0WlJaRGtqTTN4Zk5jZ0tjT2NVY3dCaTQrMCtWWnhhZnJTbFVaK1R4TkdMZVNqRXRBV05IUTBMWkxuUWg5ZjgxMXZWckorcVhKMzBrTTNTTmNsRDk3bEtrc2FidThQS1hCUkNMZ0NSdVlOeU51dGNLM3FNUStOL3hpRlpQZk5kTkRueG1OaU5haE1mRzZmVkorQkZHWEIzQVFnMnhxQklPQXZ0REk1SmE3UVpzOVJENUFHU1FPME5JR3BNYzJRTVY5MDM3bE1XUXMxSURRQzVMTlJQbFlBdDdpU3FSRk5OdjhZWHNOYTBQT1c5QXh5NkFWcjk3aVpKVHdRVG9mQU53cHRaVzQ0eldjeEthbEtVdkN5bHNxdDY3bXpBL3A1dWlBZjg0b0hRNmkyOXFXejVVYUR2VHptRll2cDFvM2tEOHUwOWgvV29yVVB0UzZrVVRwOE05REVJaVV1YXhYN1NxYk85VVhCQlpQcG5rMkdaT0E1bUNDdEI3UGEvWGF2Y2FwYllnWjZ2VzJRcE9nekx0b0ZjUUwybE5QMC9tbUJLNnhMVzA1OURwazgwUFpCdms2TmZVeFVkemlRc0EwWkZlZTE1RVg3bjVFdjNFQkt1N1dpYnZobEdiaGhQb3ozMGZVdzFiSndwR29McmkrMlpacTM5c0R3eldESVNTOWw3R2dmU0tBSkVta2IxeHc4S2dCMXJxdG9kNldYYW1pdWx4ZzZvM25JcmdXUTV5MWUwNndjVitnbnVwTTMrTXhRd3JYVWFGUmhsQ0pCOWZhTno0ZXhjOUFZZm9OeGRMOUhxcWVQTGZDWUpOSGNDNHN1eitzR0t2bnF3ckxLc2tWRTNaV1hERjAySFhrb0xCeDlYRWZKSnBCeko2aDBNYlljQnQ5ZmRuMXNLaUxyWUV4V2g5d3dsajh5NGFDY2dxL1dLTnArTGNtSTM3YWttbG5XTk51RTFRKzNCd3FJYlRsZTU0MW0xa3lzSENxcndUSlZxZERzTFFiejlpazRYZEMzVlNZS2dUalVrdVJjY3drS3dQU2xGbGtnbm5aOGJ2bk5mNzlCajdXMSsyM2M5UFhYamtDV0VuR0ZxNXlvd1RqRU5zV0NSNFpkYnBnZnpMOVdSYTZnS3B4VGtlNVN2dE9lV0dlaVVpZGM1MldXNWFHYmNSNThBcWs3M28rc28ySnpReWQ4VDJmdHFSd3J4UjAyZHVEZ05DZXNtWitNWkpDN2ZodWlDTnVUczBqcmJMZSs3aGZ0ZmVYOEx6eG00UEdGNVFna3p3bnkzOUNoNnNRMlRhQit2cHcxUmIyTmRHTC92eURnNzJ4TzhsME9YcXVjdGczQ3VBSnZQbm55cll1eTI4Ry9KS1dkcmdOZTgzSHNrYmEzamwyUlgyby9PM2JrZDJxdTluL1dwN3ozdzF3NXBHWGdUQmhmU1h0bnFMNWthdmMySzgzSGhpRExGSDBBNmgwUjVYNm0xem1GYmZrQTlvVXdPUEt1aFBKSzArV0xqTXA5NlUyV1ArWHU4eEZ3VGNQRWlpdEMyWWxqSW1RTEI0VjlaWkQzWG0zc3JDS1dzVmtkUUQzVTd1aGRPMGZjVnI4cnJVeFplNDRSdm1TeFl3YkVKR1A0SDlpUzVMQkplSnU0VGJhMHdaM01iWStXTCtzRVcyT1lqODFMM3AwdC82SEJORmRkNEtBNzN6YjVOSll6VWU5V0RtM05vTHcyUkxtUGFud1hqYkl4TkRwdnN2bEsvdWRHbGVpZVBocklNVjQyUjVIVVJOVFRESUVGTUN2akVBUk5Rb250MjZHdVJRcGR6NXRlbTJENHFLdlVVNVBwWFo1WWtvUDRtN2doMjVQdW5malBXbmtxK1NOYmlJUHBuWDdpVnl2bGZSTTJPN2dDZ3VKYWlJRUpvMXgwNVB0TDUrUEVJQ21rTmovZjdvdTlyd3diTFN1ZlJUQldMVkI0UC9aeUw0bk56cWVacXNVSkFhdE5Ma1RqUVBUTzZreUtlSTQ4WDNNZkZDU3J0dWVRSUtxUGtzcldEREttU2RYUzVNajc0NEx2MGt1T3c1TWh0TzVyWVMyTFdBeVhnWWcwd1FIYUZaaVlHZnlMeVlxMUV6N1F1UkFsSS9sVktUcXM1cDM0SHgyWG9OOG4zdWlBREdkNU10bHNwTncrWUgzTUFVdVJyUGh0bWdWTVhkV0d4YjdPSHlTWkhRSDVhYTlha3R2NmpodUZHN3JxalcrSm9lU2tnd0plYi9mdmR1WW0yakFHYWppNjI5dmc5dDdoZzJDZkhnTFdoMXRTOGU2YzUyckNCbzdOa0tnbDJub1BIbTlXM0RJUWJYai9ta0tKWFRlRUN1a3dhYzhJZm50ZzJYODFHamx3VThHcVErdHE1OFArL1AvbGd5eTZ0dzRZa0RjaURMSkpuV3F2dmM2MUg0Y3hTb0xEaTAyTnBScEtBTklDVjNYcmhUV2Zjb0I2ck43dVNjelU3d0hidW43cVk2VVJpNnNhVTNDR1JUMUVESExacmdpQWE2dnJ6L0RGTWZZTW92WlhJU2M4VTZPWjI2bGlxTjFwTzYzRDFBODh0dXcvdlAyaDZYZldoOVZGNWR6cjdNclBNdWFrYWxaSEdEWFZQMDRzNjVHSG8zY1MzbXZOdTRUR2pZNXQ1bEswVFBuSXJjMCtCcEFrY2NaYlY5QlZJU1EzSUNDYUVVS0xJaFNXTis4YkExaTZZeU1sMW9XRXhNNS9GNjhlSDBGTDR4STBsWUZ2OUovTEU0cGFBeEVoZHFSZXJxZEVvZk1yQU9HeEY3WktMaHkrMVM0VmUxNkdTMS9DU2w1VlFTR3RWeFc3REdtVDJpRHlkQVZsSjhVNnJCMXJLMnhINGo1Vm5tWGZhK3l6elVRT1NSbUl2L1RWRUpvWHJYek9LdDZFcXFyTFp5NjFvRnZvME5YVUVudUFMa21hc2dPNlI1MlhZTWU1RGN0Z1BsSXBKSkFxZkY2cFZRSUVpM1drSEljdG45anAwVGJkaktQdkJDRXBwdWpkRGVuclA4QUI1QjFBdmN0Qm9vRlY2NmZiUkFOaTl1ZjlHY3FBb3E4L1NGRExPenJkRjM3Y3B6eXRXUHhaN2hVSGtQcGRkdytCemJBWmhTeXJ1TEhyOHBhZytIWEM0TWZGdXgxcFU3V0dVWmpBK0wxaSt3V2VkL3dXcGZOUk56T3d3Rzkrc1p0ejRGQjc5aktZWk1yd3VEbkJSeEVhc01VRnRQRE1kVW0yTGtjM0Q5MS9vTEorUU1OZldwUWt1cW9YY1AveDlrR3c0a0dRbFlnMWZ0dUVHY2x5N3dabFRRbTUwQ05oVm01Myt6Wk05QzdQcWFYWngwNmlyZmlTbmNETlRDRjQ5akRHRFlZVGNRWUh4cmR1TzJ5QW9BMWFCZk1lZnY0TlVTa3JrSjNYbkFsN1JXdDR0bGFRcURqY2duYk9Cck5qSDhWQlhrM0tJeXdBSEZwc2I4Z1k5cENxQy9OMHZURFVkZ3lZS1Fic1lmQ1E4N0F6NHQwREFEU01JNHFrWGoyQkZENzN4c01tRGtRaGFaMkVTcHhqSGdmMUF5Q0EvOU1UR1ppa0lPRjdvS1pmUENETDlQV09pNEJkU3lzcFNmZE5rSkhJREt6SWdSTEdQdGZadTlLQjRBUmo2NVNUYUlqUkhLTE1Ja05KL2VSZkFJaXlPSTh2Mk83Z1NVRDNmQ3R6dGs0amZEZ2t2a0w4Qmw5UWtvSnNLbEhOVmpnOGE1K2tMOTRQcForQis0Z3UweHFjeVFNVm1Vc3ZXMUZSdndQOEJYOUQ0STFZaDViL050WDBIRmZ0QUt0Und3MHlWRUFTcFpaeEtkc0JYQ200dFBPQkVLYnBQM2l4dUpGaDJrQ3BSRmxsajVpQzhiZHFab0Yrb3NzUWVjTUxPNk9oN2lBcGlHSEs3cS9YVkpXVHVDZW1mSjRtZmEvWU5FSE16ekFPK1AyYWhYcE9nRTNSdnZ2cExlZzJNRERyK1JVOGkveENuTU52MUFIWnBvT2wxWnlockovMmNMS1NUdU5FQTRHRCtXRitod1lLOFJPUXZIeThjNVg3cTRyejNwWE0wSmlCRjJxTGFBakpMTGI3enowK05iREcvUWpKQ1h6ZGxnZ0xnalo4L3FGSVpmUFRwTnVJQVZEaU42RlgreTBwYTBmVTdwa2dhVzlyVjJOYUdtak9wZDJZZDlTdU1BZE5MS2xBbWlwM0RVSG9mcWIyMGk2Ry9zQ1l2Y05YS2M3ajNuYmJOOVo1bGY0Z0U1NThYUjFHUFB5REF3N3BtdTRTMHhScmhvejZuUmZncndhT3FPdnhtOFFFVjFlVnJSSHlVK09JOG8wV0pDZllOWk9SS1FoK3htdjBKbkhNNWdHZzJydHg0cUpscnZEMmMwOGc2V25aQWwzWTUvZXVqMzlrN1dNTG1iT0Mrb0tLUlRlRE9OS1BiZndReEdNbjdoSC91ckEvVkdCRGFLSWRHWUQrdkw3dW1sZ21PbldnM2VPd2dUL0lNdXM5REVoaW9jRncvN0Y5a3dyaWFFK2ZEdEJSMmRQQm5Uek9OWXhkRWt3Zm1HS0QwSEpRaFFSVW5HWjZ2SUlyV3NBdUZ0dncxK1NvMmRCRW1kd2EwQTcvd0V4L0ZkMi9YOUhVaXJXWlozaHhkTEVlcndvS3Y0d2RzbmZab2hmdGtvWkptU3VlaXVHVlRjYllWejBoYkcxTUJSeFpXMzZ1b2hDSXlGenJ6K1lBZlBCa0dPRjluZm1KVUZQc2JBNWw1d0dGdVcwbjFEUS81M1JpK0x5VnBIYURvY1craUp2SGQ1a2xhSE5meDNvdlFCN3RnZ1didWUwWm8reFA5NFVqdDk0bGFIT3R4Z1FmU1JJUy9kaDBTNTZyNS9FSkZIU1NjNGN4TVVnZktFOUVvc1J1YVB3ZlFZN21uNmo3dFB5TnNQVEdUbHJNQ1h6R1pWOWhtL013SGY4QmZHd043bTY3UmoxM3FoSGFZZWpvQ1JUclFab05mRDlBbHZTS1U1RllGYzNnejVaOFEveTV2OXJxWkhnSmpMUFdkeXg4L01Ca2RLUEFsNWJiRis2cmZIS2FKS0VwS3E4S3dCMkVSTGlSTTVpa2N2OHJtREVpRlBUTVlwOWZvdGJkOGIrbTU0MnlReWNkeTZXU0hrc2xlekhVSjljT0NjWjBTNS9xWjdpSkdFWFRXbmdheFJ2cTFxdDFPZDVwTUpKU0pPdmljeXQxM2xQWVFYZG9hazUxTHdHM2YzMFAyVlQvaHdsZ2RuUVVXVkdmWHFYTGZvNk1HdWVFUTFDekZCeUVxVzAzNkoxeW1aRnEreWdzUklYRnJTRXdTckpCZHJOS3piVTlKaEo3eVZ6NmIvWFdBOGxsOFl4SUxQaUZ4SklMUlBGZGI3WGw0NWNscHJkZmh1V2FSZFozQ28zZ0dPTmFxSndOSTdSaEZ4S3Y2YVdCZjhkR2JWaGJqZ1B0cTFrS0FkTGZYMVhWZmhHcjA2bHFyK0didTJPQlFVTmN1WjdpQVl6ZldURWkyU2QxcjNxWXNLRFFYRnpXUS9pd09PZldhRlNyQUM5V0k0MDl0Tkdsb3o0ODR0ZmlhSnNRSWlTc1pqS3dzQ1NxZFpvNEl6ZXd2RjBteTFQejhFRFl2QXR4U2FCTjhwQVhacXBITlBjTURTZW1iYlZrNFNCd1lyM0hhTkRGZkZOa1FNNmZuVHNRQ2FQRDNpTitJZy9rZ1hpdGw1ZG9HWlZ5L2Zza00xTTVsWk9KeFF5ZXhvUnBSNFNDa3E1UW1EVHZLZi9jaE1OOWtmS3AxRVlmZUY5RUhoY2h5OXdQTlJyNGwzbStLR1NUTHE4aW90dFV3Ny9OaE5PSGNoS2ttUkFxWjd3QTNlNUdhYXdtaU11ZEZsdkRGNjVBZ0hNMElVSEp0M0NWbnJ4ZS9ZOGoweUJjd0dRbFpCckdnRE9wYm9ta0pZVFovMzZ3T0dXYXNaOHFkSDl3UXZxSEtCT0REcVFPa3ZNS3JpWUlCRnU0K081Y3hiRzJmUUQ4ZHA4QzdYVk50VEY2M0pnbzd1alMyNWlCRjdlSjdOYlQ4NG5uczJIQlRWM2hrZ2Z5cFhHNlYvVlNldkQwVWQ2d0U0SU5Rc0RaZkpqSnlGbGFKbDNrMitGelhLOVFTSFdHSmQrVXpJK2ZMQ0dYa2NOWnNpNXRqcTNyMElxYnQ5bTVPb05GQXRKZ3hwZnVRMC95VDdpU1J1RlFjK05PY1pKVnNxYlJiWENUbFJhNCt6bnUyN3JOUzI5R1E0RFl5VmE0Z2F2NWk0UThYdFUycyszREh6bVVWcmdZckhhSGlUVmJYYVY3dFFjNzhlMXBvU0ZSejdXN1phM3ZjbE5xZXFqbDJML1p1Sm1MOTJJZUtxb2ZtZHhYLzVmem5xZm5YRElKbFFIZEMrUkFOYnZhVjFlaVIwdkM1OHZBWVhzNEZIT1pFN1ppVXdZbVpDWmloWTdjWkgrdXMxbWlyMm1vUXk0dWdYSDRLNVdXU1I2ays5YnJFWStsZ2FNU05sdzJXSTFUSFViMS9WUnRnZWdBRjZGTWZ4T2JWeWJTOWFZM3hVcmNrV0JxUmRXU0w5aSt0cW45LzBOMmJHL1lNWTNvS29oaUx5YTJTcXFhbGNpVmdXYXEyd2NFOFdIc3dQOWlKSzFNaUtsaW43R3RqMGRTYlBHK2tMdVNQT1VkM0hObEU1Q1VWMjQvRHhPVDlyWUZXUEIxZnhnUEpvajdDbSttUTZ5dFNhRFZsZFlLL3hlQndsbVVJS3RBMEdCTHZLUkdkc2VwM2lncFNEbHlxS3Fpc2taaDJrY1BTME9nKzJFc2JqYU1XR3VTeFl1amtERGxUbXJnMDd4WGVuL3liaDFUY2N0YXhDdzNWUklqMXdxMkRlYng5MmJNYjZyODlzOTVNZ3hBYWJ1NllJT3lmNGtDeGlGbWN5c0JFMWNhY2hNZ1FsWnY5NDhsMnJwRU95Rk4xMTJpU09EWjhQNnpHb0hBbWdMYzN3SVA4ZVhUMDQ2bjdYbDIzUzRsK1NUb1N5U2lEdFRNb2xRWG1qVExlUHBobnNBMFZ6aDBZcjEwNCtMNHdIM2k5bVlQd2dvcmloak1PMFZnSnlRcHZmbFdGZmM2b0hWeGw3MTVVczJlNktPbWN6VUsvWjU1QW55TEw2RGU5NkNaeERpRE5kcnNDUUJIUU4xSWJJOWFReDMxbG1jVURQUHQ4L1JQUjVyNXFvUzdCNllwbS9XVmttU25vZ1BoWXJGSlRKaTA4bm1CTm40RVBJVWYzWlR0MWY0TnhoMDFEREJ2bkp2MHRXa1ZYNXBJdkRvTURlVTBzVExyL3MvMm1tNmYwVHJ4cDBQRWNKK0xUTHpxT0xreFlhcEdMdW9GY3d5N0JheGtGUzdYSUduNktRcDROcGswSnIzNGgzRG9Dc2VPajhuaDdiS2ErMExRQWlvbFp3RDNZbGFBRU9XRmtrcnZROW9yRm5KaXBmUm5TL2QxenllL05UZFRNS3lnK2xhTnNzTmpnTGZ3VENuMUpTeUNpeEtRbXFuVS9CNFErdVdseElUYzdPbHpMSGhqYWYvWEtWU2tqcG0yMDg1a0huK3dLOXp2QUdka3I4dkVvdkZCSmtzbFdGVkZXY0NVQWRMUmFLL2wwL2ZZT1g4Z2N2aXRKVkVRT0c0bi9DWEJtTmpqaVQvMlYvRk92QXZRcUtEVHU0RFJHT05BQTNKenNvTGdlMGJocDNDcEJZN0ZnWGpuTkl0ME10VitkVk96R2NVSjF6SU1sdDFQOHJnOVJaQW42ay9XanRDc1VOVDRIUkhvUXE3YUhqTXMwUzRxdTVXVjgvSU5aQ2tyaGdMdWtDSkxlS1pRajR6NHNwaDdJMlZHRVVvTXN3b1o5allkMERtY21LU05HOXMvcEl6N3NqamdSd2JjWVZVdHpNUGFNNmtOYUdiV1k5SjAwQis1eGxWdWQzVmtUTGtXRTdqbERPMHBqSiszYVBTbEdhaXF4ZlgrRXhBbkVOa0dpSW8xQ2lYeHJ1U0liR2FiZGpHTlo3QU9jWFcyVnNsbUFwZ2w0MnFrTHhzRzRPV203R0lkZjdrNlpEZVdibFdGdUl5TU15V3B3UHhzdUJqTDUyYmNybmthaGFrT2U3Q1cydXM3WGRHVzNOaUVzOVhYbm5yemhxem9LS0ZtK1RBTEFPbjBVK3o4bjBoWGN2M0JxVSt4RmduUW14Rk45eG5pbjBsR2RxNmpxRmhCZDRySEI0MWFnMCt6cEdhSGNnalcvOGhvZkZCS2U2SG9COFErbUVTK3drNEN6NEMrZUJDTnBjQ1JtdDlxOVlkeHFpVnZlUDIzWVo3RlZZMEtyMWNxTkhma3dLelJOYVg0UkdTL0JOb3loUVo0SzA2cllzbnJFZU5tQUlYQ1d0ZmFCT3loNnFLOERYY1NzQWxtcWt6aXpOUTFuNGJENGhyandkUDNkMi9MRjZWbHZXTTNJdHRjRmQxdkhVa1NMUzl0TkdQTkhqQzJaajNRMXpTRkloK1dJRndoM0tqVVR6eVBQVmZFK0t0cnVxdGhySmo2TkI2Q0FEcUcxdUY3dWtHQTgzS1kzODhoVFAwYmwycnZNT3dMQ2JSdXl0MlptY3Y3QW9CUVdvU0FpaWZXOEphREN4WURIZXZabCtUOGVYbDNOdkhNaUJqMURaaGZhZk11NDEzeHpMeTQ5Z3J0T01IdlRwbEQrclJXbCtrc3NWK1g0MjBxRGxqYzh2dlZ0ZlNrT1RCMEN0ME9aV0NBdHNzV0dBbWYyYy9IbXFQYmFVeUVmSGhiUk5zd3BRNTVsb2NCTmUzczRuVmcyZFdoVE9oOHZDZFJtMHF4NHcxTTlsSGZlc09WOEJmTkR1M1czUTUweUc3WGorYkFJQmdCdmNFcVVINDZ6cmE2Q3BNa3Y0K2kvSHdHMDVFNGhsNGhTK3NtdE5kdFJicHdFRFIzdTZlUG9oNUNFZUJGT1l1MnVnaFNJSjg0bjJkckl6K0FlUG5HTE1PWUJmMHhBRmpOc1g2UGZDbS85Ry9VWnBPd1d5MTkvRWdBUk5ib25YaVJaN2UvbnIzcnBFQjRZbVI2dTc2cFRJdGV0MTZvZTlmTmNnVWlpVWJYVnRwR2tJUUFKSE5DSnJqSGJxOEFPUERGZkJuLzJoNWpmaEU0VDhJVGhHZ0FPL29kaGxDQUZvK0dpVzhUNElzNlFmbEFmTGxpd3RHQXZLK3FEc05vV3ZuT2RnajVTSHRFdHhsTjNXb0VkZlNydWJ1ZW9Najc2UW9jVThKRHVTVE5ZWnU1Z2J6b1RHUTlpNVZyTzFYMHBxTE9HaG9vOExKSE11cG9KSGFZYnRYRWprZW5qZE1PbGN4OTBncUh3UEh5Qm1vWDR5bUhSZXBuZ0Z0NUk2L01xbEZKTmVYSzBYVS93Y1BwMXd6Q0FGQkNCVmJRZldSR25PZWhzSGF6SFFYSE5HK21jSUd6NmltOVI1eWdpMzBWQlRMYXg3UUxRYUZmOVhySzdnT2w2RFRkMkoxRUk5N2dxN0x1T1NyVzRySlJCM2V0cjQycGpldDMzaDk2RGNLZlMweWxwWVRmR3dZT2JidU0wMVZqZlhjbkxKZU8yT09VSEFUcERaN2c2TU5zeENnaXdPdjlRTHo0TnJTTzlhR0E4d2JkbTJVa1VvVUNlUWpVeWpqb3phbTI5RVpDQllteWNJcUNYZWJNcXNGcWhZZmhCSG9mMXdacjJPV0hCRDd6Q3daZ01URUluVVlOSURVTDlrQ0pvWUF2cTF3akhjR2dNVTlJVXFBTVdPdWxRRXlxc21SQW9oU0loREJtS1NKUm91NlFxY1Y3djBzNDBWRDNpR2J6eVZwL0VXdTRad3lpR2VWWlhxTjNqSzZodVFyN21ZRkE1S091OHdSZjR0UmRwYVhxMUxpQzJBc2ZWYUdtemt2Tlp6Z1cyWG1JMXV4V2RUTTRhMEh5ZFlJK2U5ck93RTd5ZFhlTDlRb3pralhtRllqQlJnNHdqTi9qZHVJWnBLL29HQkJkN3V1SDUydURqN2g0bTgyb2R5OGJyZWNodjRvWENaeFVZWHhObEo3dFg0cHR3RE5hVTNJQktiNWgxY01NS3EwUE1wY3JPc0gvbzNPY1p0L1RGMzY4YzhCMGlZYXgxS3NyQ0R5YXBMelRpcEszb01EbnlpOUFmT0ovYUx4TmJLblhKT0tBSHQxekh1aVh3V0VPTC9iYUd6b25QYWE3dnU1SkNBUkhxaUROLytGb25aUld1TE5KYUUrTkVHY3dyZHYvc2ZxZWZGcWFGQ3Q0L200cUFySTU1a0owZkh5R003SzFEN1RYRTJqdjdWMkgzL1pBK0RGRThDUlpZK1VPSW9RakN3N3poSnhsTzNMUE5LVERDTXM0YklVeFFSZlN5Q1pTbnEyMG5aUisyUWI3VWJpRXpnbkQvUjgzYW03bFphUzZnS0MvaXFlZlpnSnJ6WHl5OUtteEVNKzRMMFA4TDQ1K0lhaUp1OXRiaGFTOHBsNWdSTnp3NU9rYldoTmJaWDZwZlJLanp6UDB1Y1ljT3luUjh0L2EzY2wzTUh0a0NVUm00NmRXUHV0aVZDdHo2RXZHOHhZVFhVN0ozeUR4ZTIrT0xDNXd6ODErck5taEtwdDNLUEdnbTlNTVhNSnpmbVNwY01qS1h5dk5VdmlxelJOOFhEYlRnSXYwTHB0ajJQVC9YTXRiWVorTEZVTFdmR1VyL3pNcHFKSDYzQ05Ta1NQazY2NUpCd2xwOXR5ajlkOEpZS1hhaWY3NlBybmNJYVY5cENvaWhOUzBEbERRSVMxbllIVDJtQzJ2eFNNZjgwemVEOGYvbmRlczF4QURIRUNzZmlqOGtZT1NvK3A4ZFFjOHhzNDBTTXo2M1Zza00xakVkYkdjczBSbFlzbVRWeHFSUmtuR3JzVTVxZVdYNnF4ZUVqY3cxcG1LMk1lRmRrTzY3ZHZxK25samRQbysxMTczVnUxZy9QcnRvQm5wMTVFK3k1L1VlNmxpMGxSL0FYZGp1a3FxakRod0w4eUl6SVYxWkRSRnF0UzEzNWM5SnB6SWFQRE82aEJoQk16UnowaG9JMVhabjBrVUk5eUhpOWlQNG1jWkU0elZ6OE8vdWdJcVN6cVBKQWRTQWI4LzVwV0dDUHliNGY0S1dxYU9tMjBTS2w1bmFZWUNPMUR4VW0vS0Fyak1oZGk2cUVYZnYyTWJxTUE1Y1dNdHpRR2FnYnNZTmhwSEFkVHY3TUZEK0dPQnZIa3pnZHpOOVUwek56bVpUVU83TEs3MEJnc0NNQmNuZ0FKU09vWnFUaFk1STk3c0FwNXN5UUVsTHhSMWFqOXVVbXNjTU5qaVJJUnp3Y1dtdE9UREdBbGJaMy9oSERBOEVZMEdheUo5RFQ1SU1sL2ltam9oK0gwS2Z4L25YMVFOQ3E2aTNicnFVYmVyUENteE9CNkFidTQycnZQMmszOEpZWTlZUFpYSnV3MXp2Q0NIQ0V3TkZ0eUVKeTl6SklNSlVHVWNvV1RrcndSVFo2Q0VpRWJ6MlQvMjMyYTBrK2hoSkc5akhoa2RLWnVDanNrdkM1cGxTU0RuMVlHWFRjSkhneExkWHcyZDZOY1BuVlVZV3EvMm9pMGNYNCszWnVUZFZObmZybGw4a2JtRVlpTndqK3pGRENUVWNuVFBiZU9PbUx5ZWxsMDFFdktnSy96a3R3MWdXSGJRUlNoNm1TTVR2L0VMcHRaYTNwL3FmdE15c1BEdC9tak1kRkR2YTI3M050dnlNZit0NjNxM2I3VUx3ZzAxL0pobVV5VlhtQVJWU0w4bDFBUlpjTFlpSHFueWJXTzVNaWc1WnBkaitRTFRzbHMxdmdrY0tzLzB3OS9uQ3lSaUE1eGVqOFJPM3F4Tm5FVktkMDV2NUUwZEgrZ09GSjlQcG0wU0MybjJSZ1hESnhacWZBR3Z2WUZOOVVCbVJBTVZXbUFXOWNZeXh5ak15L2FCUHdqUEo5ODBYV1NaTTlTdU5HR2QweFduWFhHTXg0UEZhZXBrbTFmNEVXSG1iZEZJWmhMSzFwMklFeXYzTmhmV0oybWQxc3NTcWVNT2JjVjN1d0NkQ01qcjBVek0zMnJRRDJzU0xNZGNGeVJnV0FLbkN5MGdQNEpDbEZ1Y1FYZy9KbWlUL0s0UlBiQkFXMzlIVlhvYVVnQ3hFZjVtVk1zNzFoeWJQQzJDMTNoR2VwbktJMjllN2lvTWZCaGFMSlhKRVk5RE83MXVpT2tpWXpEN1ZIdk51aXo1SC9ORFBhZENCR2ZtUW5PMi9FU0dsVXFONXQ3VDBrZ3hCK3pDRm9McWVpT05yc3NKZHZ2Mnd4Q2VJNEw3M1ltMkkxVVV3WERCTXpidTZCV2ZCbkxtU2hQazhmR1hSV2N1dm5KdGdTcVVFMnpHTU5DMU9KL08wUlhrYnJRNElzQnI3b3IrQ2xUUU9oZm81K3B2Rkg1TStKa0oyaGxrbzMvSzF4TWVjUEthaTZSRHhKQWFaYlpyeUY1S0QvZE1GVzlPWm8rSmhKamVmYTIxc1FGUGpBb2FTWnh5WmRWWlB4QWxRUmpPRlJ0OEdUdjhEQjQ3WnJuYXpEbTJ5UjVaTVRrSWtkSXc0ZU5zYzg3YTBHVldnVVl2QnEyNG5uMTVLeTJVNlFrb3dxYlBqMVdVMXg5YlZQNDc0WkhqeXFHM3BkSUJTUGVselhtUUtRTVc4TSsyak5aZ1lrS1MycG9oa2tIbm5qVVRmUW56YmMwSlFHbFZCY1htRW8zTmo5bGlaTml1NzNVbTJXeE8zMjBBSnViL1ErY1hiV1RKekdhM3N4b0szeU9HYmM5aElnMHduMlBpOUdrVVlXWHY5aG4rR3A1Tlp0QTVrZHFDTXF2NDF4TzNFZFR4S2tlZ2MxejBNYjFFenlvNGJ2L3cvMnQvc3FwTEZOYVVUQVBQdURYa2JWYVNBUEhoY0JGeVJwSWw1NzdHREhsT2dMNEx2bXkrdzFKdVBVSmtHdUVscHE5dlVoR2k3VjNxVktpTVNuSzVQUWdYQkVySGUwR01NelNoWmtPWFpWNWZLVzZSMWR0cHVkdzFneWhQN0Y5NytKUEdyY0htbmRtVlo0R1NXSGdPUEV6WFplQjU0NW1MbStjUk81MlNSeHhIWGJJTDA4VXFoSGk3NjErbXZ6VTQrNzJWYzAvcDVCNHVnZ2hIaklmQ0tpTWlBVFdPdWZMTmV4Tjg0U2M2UDR0K2RFdmh5eTVoZGJaU0lTL0wza0V4ZUZadE9KMmtnVVk3aUZWMjdFa0diTi91MlRieHZCaUlZQjVwRnpuYyttcitPNFZKdkE3QjAwbjVib0tNMDArbUhYNDRLRlBJd1kwalFEUUlUYjhqQ082d1pDS0NOWkdPazBCSVVCbTNhM2hCdHFXS3VRS2J4UHdTbGZORTBtajhiOXo3UU9kYUw1ei83c296ZnVhT3hWN0xkRDZJL3RXbzkwemVzYnBBWkw2Q2ovQ01FSlUvSWFLb2wyN2FJNG5sSGtjbE9SYjZCTFNrV0psMkgwamJvU1dDd0h6VXBmOGtzcFBzZ3A3VFdRY2RVY1JIUXdsOFdZYlpQRzVEUnp2SVJEWHMzbklmdGZzRjBFcWt2K3dtOVhQWFd5ZzFON1ZrYjdiV2VXN1VUKzFFOEJ5UkxzMmlzRG9zeXAyUnEvRmxYaTdsaHZPRUdCenZpM1dSM3ArbVdhUlpONlJIUVFaZDVnQzc0bEx6MEtRSjRIeG1FL3JSV2MweWZvWDkrTVlxbXZYMGEwRGdFWDdacEgybUprbnkwa3k5OTF3K2VXQmlHdXhEUnEzTWFlVnhHeE0wKzRVZCszVkRYclJGZnVOVEIrdCtIVWxlNXdGWGxleUE4MUwwZW1ONzVMNjZvcEVCNlNqMkJBTXY5aEhEMGFaYXVLazJPbHcwR0YxbmRZbHJxZ2JEZmpMSWovRXNOWTFmaW5tb3E5aHI2ZGt2cGJXZGJXY1hLU0dwQS9ZVUtDeEFPWnUxaDhnWmpwQ1VJcWJEbW9iWElUM1lGcFo0enNncmtDOWtHT0hZNEVwR2dRZTBpa29IdE5XRGV5ekNIWlBWNFhsYUFCTHdEZFE0N0tscXVHYmlZUm1lMUM4Z3dvRFp2dGZnYjlINUtrQVVLR0JxZFJmSHBvVVBkbCtERWpWQTVzek51dHFlaE1qZS8zemtEM21GRGZvYTRMallPbXpGNmdzd3RlQ1JUamVOdWdKbWhiOTJ3NUJuSkZMTld6MXpSTlN0ZzhwRlNWakdHNFN4dWJOcDAwdDNXZU5kSnNUUzlpd3hrSUwyN2U1OTRWT3RwaGxTREFnS3ZHVXovSVpiRXUzcFh6NWdkeGRsNHdUWjAvQXFiVnpRbXMyeXp4bGJZNXZQdDhZOWpMa0kyaTZRNlUvMHhPc1cwKzg4b2hObmlpZXkwZ0YxTG9LSmdBM2lLUTFzS04xR3pubkJIN2FTSXp6UForbGJRaldsdUxtb0lZVndwYUcwSmVBMGc2SUV3V1VVanpaTnlRemFmWDhpZ2dPUnoxS1RGUk9LVzdtZ2hNd3Y5WVlpcldHYS8wb0hiVmFyQVloeWk3UVI4WTdTaWlIRHAwa2F5NU5LSXM2SC92aG10MU9wV252VS9kbjUyWC9ucUEyWUxmZlVmOTBHa1U2ZHRjK0VyZlVNMWtCdXVlZWRLOTBrYlF0QmpyWjZoOVVYRlpsSCtCUXIrUWtGV244QlptRnhmZzJFL1QwSE1SQi9idDdqSXl5bEJRQ1lsYVo5aXVkazV5d2tqd2JZT040WGxsNUc4RXhobU9uL0NvbHg1L2JuOURhR3lvWXpnOUd6Tmw0V243OGRWY3VDYnAyYjlMeWZFb2k4QUZTSFJCMGY5YzNQcVhmWjNSTUsvQW9lWUxGK1JTcFVCMC9DOXlCVG1rMFlBdHVRZHFmZEFZZmdIKzg0RXhWMUZLWEZONHRLRWhjTmZjSndUaWpIN29lMVVwME9vdE5QUXFTWmttZ2YwQVR3SUg3QlVnUGpWS05JbTFsdG92SEZsRVB2TVEzMnNMUnp5QkEwOVAyZTE2QXR2UmxTVGdKaDFiVUZhMmVITXlKeEEzSjFFNlo2eENrTW1rQVVYTVFRQUo4MzNxbTlNZVFKa2xUYUt5RGpBY0hUemRxcThEZWQrbGlsL2ZRYUR0N1pQMStUV0RPSnd6SDNQV2FWY3pSUXZWczBQYTJTYnhnSXoxOG51ZXc5WndDd3JQZjVZWm5QY2ExaGV0UFEvRVVYa0JFZDAwc3lPdHp2UGszMERoODNmYmRnZTMxeVVQNkpVbENQRXhEWkhTMmF1MG81U1MwRFVNT1pSNGxVa0daUVpFSjFvNTZ3WXErY2ZoWDE4ZnRvZzU5UGtad21ZNFdCWThOSTd1TmhOekl6VWIzbGtwTnRKdjVtTndOU0NBK3UyMFJNRExob3gwNk50WGt1UHZPeUFvTGZFTTdocGhyYldGSTlVemQ3ZVVIVThObEtzd21PSWxXZEdObS9HUFZjS3BzV0Nkek4rdU9Lem5SRmFmVW9UOGlDU040MnJHT0xHTDJrRWpDS1F3ZmRtNmhrVWIySzFHajFlQ2VzNmpxWjYyd1lUenkzVFlIQU1TV0REQ3BrYlNuTVdkdFhYVkpwTWx6ZVptTkhVZXhJU0JXMkVCWDdkUy9JdE5CT2N4S2ZJWGVZQlduTEh1aTduMXVnZS85VkxqdllsS09HSjkxWHJPUng1aUw1UFJza05USTBqV28zTXptdDA5V2ZBZU9wT0ZoZTREdjdNckJ3NG8ySDlWRWsyeXFGMStOc0NjbUtCL3kycEVoWndLc3cyMjZHamR2b1FBdnRPVEo2QVFHWkpVSnJkdmdRTVNzRDdpRi9mUDQ2Z2g2NWpQNGw2VzBGaUZNWkVaK0FkQmNXeExtYkpRMnlUelZtRXlwWnlKQWhGWi9VbDUva1c5ZFRBV08rYTJvUDVMRGNjSURMRndmZ3RQa0h3T0xLWVdVNHFpNStyRjIyUHAraklKZTlLOUdRQ205eEhLd1VLRU1QbHJqWU1KTTFhc0xOSkFkbHBTMm11eUR0RlpZcTRIZW9raExHTGFqK2xveFhqajdDajI3SE91TzRvY2VFZmp5b0tpeG1mRzZtSytLLzErOUxJeFhaK01Mdk9iZ1J6elJ6MjZvR3VSNWtGaGJEelVSM1FseDBUdXVJVnUrbWlYeDV2U05CRG9Pa1ZLdXhlNkNVcjFtODlGTTQvS1dPL0RqRUp0MlcwYmRGdE4wOHhWVEYxdDZtQkpFdjhxMFYyM3g3cktpck9rdkNnRFcrRnV1Tlloa1lFVkE4QnNTVFBWNjc0eEhwek5FdnJ5VWV6R2V5OTh6N0VrUGFvZkM5c20rZ3ZxL0pDaldiRVZGaWpIOGpOdkhsVlRkY2xHaW5wYjBpYUJOZ05FajBTY2dmOUxCeUNPc2ZhQkI2TGxPbldKMkxMeWRYd2J0UzNpaFlZMXg0ek80dDZNWnhSWHovUytyVUdQZmE0SFo5cHZPUGRXcGwvVVRGT2VFeGFlVE9lcUg5SitUQjFxWWdlblNPUmJweEFrQS9wN2dDS2QwNi9tT1BuYkZOUjZpQWhoWTVESUY4WVViREpZZHVoSjZlS1ZzYitFMWx1UVlLdHg3ejZEZUFPNCt5WCtkYnZjS3FpOEFZNlF6Snl4N25pbWduNCtDZnlIUVMrYlcyemNRS1ZnYkRwTDJhNzdOdkdyUldXQzJ5Rzc4bkN2N2R4OHl4alRRUWJqbVp2bXg5aisyZ1YyU2dRNWQ0MzhtSUZoOHljaXhWODFiOXZ3N1JVN3F4UUNFUjRZMkNBbWhZUHpRZGs2V1ducGtyUWRwSDZPcHVhYUhnUCtOL1dMdk5vOXpCYzZVWHNuWEJUbWJ6eEMrcW5XVStDdkJNNVVOdndnck44NTgvSkttejV2VUdnLzE3bE8zSVJ5d01lMEJ2UEdoMHJoTG9PSnBqZzR2ZVFPdmFkYXZ1Zk5QT1RROUdyRURZdHhDeXViSnljQ0dTbWVDZHludG9BSDQyZVZIZVhmYjR5a2VsWDBGSzYxTDNFTWRFMDM0RHo2cDB4cnlPSE5aazNWYTk5WkdwV2hLRXJ2UEhUYkpiNmdGTHJCRlBmNkdRUVY2bTQ1MVdpMEg1ejVaWXVtSGZtQ3hLQ0NvVjNVb2M3VExuanZBeDkwcUx2TE1UWFBIYisxYUhBMHZsMGxBaTRJR2hlT3ZMcjFTZllCSjIvZXlPTHB4V1RmNUlWY3NIOEpTb1I4RjF2eDg1bjc5Q3NXTkhoVnUySXMxeno0cmpLZHJvN0hObDZaVlpHK1prbGRSOS9lR1JQb0EwV2Jic3ZCdnA5bXdtRHZ1VmRBcWdNamdFbG1NWmg1QnNLV3hKdUVoUW52Qnk5Z0I5QjE5Y3RVc3FCbFhBMi9BcnB6T29YT1JQZ0FGZWFCWU1hc2lXazlLNnRKZ2RPdDJ4SkxyTmpNT0kybTNsL2UwbThnbXRSdFRvN1NORmI3RTRQVWFiWXhmR0trWTFiOXhkYmo0T0srT29TYnBzKzc0QjE0M2pnK3I5ektnZnBCRVI5di9tM2dTWVNwU0FTYm5iMGRubGNUSHN1QTJZZzV3K00wWE5MU2syZHdZUERZOEdSMjVzZmRQcEgzb0RPZ2F2SmxEQkZJYTZHWEFJWEs0VnVtanE2L3U2bHR6ZU4rYUtRa3hNVk9wWHRkclgvdWtBTkNLS2hWbG5PdFpsTjB1b1ZnMXhiMlU0QUZkaXEvU3o1MFVjY1BORFUwc1grREZEQ0RmN1Zpd2d2TnVub0k3T3AzQjdHaGtsbjZORFBSNE9zV1ovYWZXRTh0REJjTUVHeFdWVGQxQUM3SWJWY2c3eWdSWGtCcEVTclRybjZERVBlRmNjRU1nTHJTQ2NET1hHaGs5aEVGUE9kMlJBS3BJem1sb05VWkc5UW96b0hxTHZBdFQ1Y2ZIRzZTUWtoK1J1MElyU0V0R3ZsQVJ5WERTVlZaZURzam5yS1FXY3VSNnQ5V1VDU3JXeFdFN3NGU3ZXNk9JcUlEMXBUTk5wT25jcWIyOXd6YWhhVm1lOGlTM0toL3l3M2tSS3V3YW5aYzJlem1ST0JYcXltdDFZQnpBWnpMTnJrRDZJeDhlajBhc0I3Z2VQaE9wTDBEajUrUm1jWGJMT1grMzl4OHNpb1NmMXN0MG9pNFNnMlUwZDE1Z1c5c09ncS94R3hXb1hMbWR5c2FURm1kQU9vZ0dueXZscXJvckhMeTIvTndSc3ozUSsxeFZTa2tiUVpleTU4dWszK3JZK1RkL0pKZUdtaG1aMlZzTk1YZzFpZWdlYmg4NnY4ZXJOMm5GYmNLQUliTFN5cnpDcWNIOEdiRXY1elkxT1RmZkVmTTQ3Q2RTTWRiSkQzMGRwWEFaRThLZzY2cFhQd3ExdzlHWjZLWFE3WmN3VW5wbWFtNk9ONzlxN3ZvZmpXaEtyczZUZE5iWFBBdmNmV3hoRVJvWHpwNDNDeVJBeEJnZ0ZaMXgzdENjby9YUFFFV0ltZy9qZ3NoM1IyQlB3eEFZQ3drYytCcTQyVDB6cXdISk9pSFdWbndRSjZZYzE0SXdpdWlsUWhZcnZwVHFkNllGa3k4SFhkVHI4cHozRE90ZWE4a25xY1pEYzN5QzBBWkxlZDZ3RDUyMGd5bVpTaUMzS3c0YWdBY3owRFRTMjA4ZzRjSm9SUTZ5TTBBczhmdTVma20xRERVSWFqL0NSZjNBT2QveWJiZTNacnZKTUh4ek5IcVlQMHkwOW84bERXRWl5TkZsU2luMXVGckdKSk5ZVHNaaHNNNFg3Z1orMTZQbFZwMlRjQUZvRENBVXZYb0VTQ2IvRGVQdG9kb3AyY1Z3M3dyai9RMFo0ekhKL3BoN3RQVjBKNFU3UEsrRkd5Q2k0NFJySlQ0QUxKemduTW4vTDBwN0ErS2NRYTZBc1hKM0VFTkhvR0txVVY0cjA3dGVwc09xOUMrczhZVEgrbCtUSGtpekpNZ2gyaTVUV1gwMTlpYitCTU1YdDhPM0drYlAzV25nM3ZFRnBmREsraE9nRFRQZkxOVnJHRmx1dGlQQWJTM0w4NnBjenRXbElHdktySEwzK21jNlY3U3RCc1RjM2ZvaVQwdDhrQ0Eya2kxQXRxL1Z4bFhudzlGWTR5S3g4L3RMMUFvaEs2bUYwOC9hNVdnbUlONkZMRWRrQzJ2ejJaMVlqNERJY2x1TURIUmxoL2VXb1ozSHNwSmEvOXk5cWEzM1BJWW1sVXBQYm5sM2RsdC9BTlp2WjE2OURUZjFUUWFFem9BTCsyS1lRaUVnWWxlL0ZVRG03UXNPYjdoRGFjRWh2YUdFRFpQdWZzOVF6MUFFeUZNY0hwaTVQdFRxaXRaZUN1UzdNTmZsOWRJbmFLOGE2QmROS3R3aG9RMDlHM2tUK2pnSTJlNi90UnBUOU1tYXZKMTZXRDd6dHVVYm9nR0RGblRXblUvVWVmb0k3K2cvWGludlYya0RDaDBWUS9CbXZsQmE3VHkyZmNHaWZIVkhXU1ZCTzEyYUVrUUw2MUJwZEgweEprL1FJcjVqb3RiT0k4QnJ5VXduS1Y3U3NqTVBWcTVTZThldWJQZlJKalZOTXBPbm40MDVLMUxpVWdCODlNeERaNmFWSXkyMjBVa2RIb211L045QjFWUS9lLzdBekF6N2VHQld6cW9KbjlNUC81R3BueUY0UDhGOVgvNENBaVlIVGg3Rm9HYm80dDlmckFLMnU1THZkd0dXRk1EN1hRV3Z5QjBTVDZqQm9seWNUVUhPZG1lQzM0ZkRaZVJMUnh0YWIrdEJhUWloY24zUDhiSVd4d3NGVlM1WDBhZ0pHVWN3RlU5clBnMDZEV1QzemFUQzhMbDJrQWU3Z3k3eVB6ZmlCcEtCNE9URUk1cURVemhrV295SGtnbG9ZbnF1YSszUmwwaTVtYmZlQUovUDUvdHlHbTBsa1FySnZZcWpiUTl0TjBFbWxzdjBQejc1b2ZRMER2WXdTalc0VFRFWElFNm9hYjFlazhXYmV0WGdwMm9PamlSQk4wdm1hWGt0US9TVm9oc2NxVVVXNUFoRDBrc0xZYjlUR3JLTE84ZzNyUmNIbDFNQU1kcmdHN2dJYURCYUJCdGpUUGxyYlNEc1ZhcXN1N29SdTdldWRyYXhyRTdyUDVRU0RRYTE5aXAvSUk1K1J2dkdSSlBsWnB2azRlM0dPRnJXdDhRT3pxSzNvSjFUUDlSVWptaFludm1WNjJIODZFSTg0TU9QRXRNKzErZVV1WnFIRjF4UWd1d0FFeFdRZDBjOWM1RnJqWWJIcXZWV2JTaHNBRXpsSS9OM3BHYmFLZ2M4QVN1aHZFL3hTdlEvcmdPbUVGZHM2RWVZeWVnY1hNd2JaQ0YrellIRDNwNTB0WHp4cFFrQkpjQm5CcFR2N3N1T3dxWVNsSkRuQ3A1OFNRdGlNdVdiSUdFZFpXaU1aNHU4N2xUSXJrYTdMYm5Ib0xKT3F4VkI2SU01WjcxMVMzVmNoUndBUmp0MU05aG1KMlZJSlY3NDErRk1PY1NhSTFyUmlUMDRBTndCQ0NacEs0V0MwaGMzWTRweDh2ZzVKQ2wvWnFsU0g5VEdtR2xMR2haWmV2elpEZXJvcFhvM1REbkcvalRlRVRwVVlCMzBVWi9lejFUS01jTnkrK1F1OEZTK3NrVm9GcnFaYjhad0RGc1pqVGxNV1N3bXJMODBxbHpkK3ZnMlhITm8wTUVBS2czOTg2Q3Y1dVp4b2JzeTIvZWprMFp2RElEWVMzOS9vK2xFRUNhejNWNHpaeUdKT1A1YWl5VkVlMTNCS3ZlMWN1dW1rU2ZuV29VUzdnY3FMdVdtd0tGSzcxTG1IcGxxcyt2M3FrMjBKZGNSRXZNa0ZuaGZJU1F4SjIzYWYxak5FeTBjMjZLSUFZQXZWWUtvT0lpbmFMUnJqZkw5MURrV28xcWUwMEkyam9TWklvclBwbVgweDVJWlY5Qm1nNkFvV0orUTZWMEdHRFA2OVYxRnpZTzhaZzRUU3NYa3NMeW8raURtVnAxRk1PY3VlazNyQ0daNGY5NG40Qm1maUd1V2pnSVRIQmhZNTgwMmk4WlFrcHErS3U0NGpNOFduWWlLWmJlZmpGMjdaS3JLbE9PUFJHK1lTU1hTRjlFQ2N5cnFRS2dFYnlGNVQyeVFJczdNVUhiMG9lbGxGQ1dXanc5RmNUME50SElGbjRzY1c4cGNQOCtGVkhPcnhsby9FU1dUaDN5NSthbGphQlNyeHpBRWVUSFJBeko3bWUxYjhDbzMxSnZMTExmODJDRUJIdEwvcTM1SWQ3WlVsY1ZhU21KMXRrTVlJdnp0QjFhelpwd3RpcVlwcGhTMXRENlVobWtFS05vVXhXYVJMUGtXQjBKd2hIaVZ5MmphZmRaMEdCUVBWODY2eXpYZE1UdFd2c2srNWhJNHF6RkhjVWVJWU5JUmNMMUVtSVJQMWxFQmFuZ1l2b3VjVk5aOTNqUnM1TlVpcTNZV3hwaFdiU0JCQmU4cGpTUldpRkZLd3N0WXpFWVFxSlZpYUFGdUZKQXljaHJORE1lcnIxWG43Mzl2QWRsVzJHRmg0YklLRG1DQkFGU1B6YUFZSnhhNjRCbE54QUN3NllvbVFqZGFFSytOMHFyNW0zeFd1QUZYYUlQeGxZMHlrT2UwWW11cXdkMytBeHBXb1dtWHF3V3djNHBzYU9SVFN0YVlsdmpxS2l6YU9LQTYrSUswYi9OdWFDLzhNa0NkVHlEL3RjNlVwcWVubGxvUHZ6cyt5TTk3ek5NZEFXSFVVYVJjNUROSFhQWEVqSDdITUhWQXNtRGpQc0ErNDkrRWswa3VwS2o1TVB2b1I2TXpqMGd4WnNYOTdsWjlPazFtaEoxYW85KzNjUitycmtuL2R5cnpnWG5qUE1QVTh0Y3h0ZDFtUkJmSzFxenZJOG5uVkdyZVh6NjVObVRDQ1MwRDhkcHdrOEhwWC9UT2Y1Ym12eEMveC9UNVBiai9SS2xVYnpZMFQ2RnU0YTFWTFNJbXlZVTNKK2dDNWVvY1pKV08vZEJRTkJRRU41VHVpcDViazhidW9XbkN6WG1oQUYxc3lJMXo1d3hYd2dmQ1Baa3U0KzFoeThyZFNta0l4aTJIWXVnUWQyS3lRaXF6R09DRlFVRVhWNmN6L09mMTNDNDNJRzNLcDQzMjlPREx3OWJPZkVqbGRUeVNuRlkrU1dBSWxyUml0WXoxMVkvTzV2Zm0zRXFaNHBtekZYaU1mVzRoRUJzRksvejFidDNLY3RmV3ZMY21TKytTeUs4VThlVGZ5N1dPL0p0NVhXWUV6RDE5SDQ4cmVub091SnIyNndjcGwrMHNXbncwUlA0MW9tMDdBM0NhZ1pRSUlnN1NQSklBWkFIS1MwSjJSVmpnbm5MQ2NNQ3ZrSmtLa21RTDBvNFdaZDhIcG1LaTVmVFdHam5tb0xOdnVnREZaeFpGWEZWTUtuaDcxVHFFNHNGS1JBZXFaNWoxcm5EYlNHMWV0dkIxRUVHMDVsT2FqVVJZeTgzVmJVQW1WelM5ZjVmYzVUTUJWQnJrZ2hNc2ladXR6cVZTbzNrdDQ5TkE4cE82ckpZVTVpYm02aitFVVdBU1N4YUtGV0I0bmJYRDJiR0pzdE9ZYjJTUTNZR25ZZ3dVNTkrOEdhcUx2a0MxcVBMWjNaY2MvQWlCbXdubldKTTNqWW1PQ1RhaEdJWmZvbmt3VmlJNit1OUdsQkVGYXc0U29NeWJwekdOL25MNDgrenRoMXNXbWhHektyWGROeC9FdEFVMFIwd1N3eDVBYjV4ZUdQdDd2YXFnR01FbGc0VTIvaUc2SzQwRnlLdjlQZC82NmloMS9sekhqZ0dKbUtZWVYvcGRwcHBpN3d0NzVHSi90RnY3VXMvMEUxR1pZcHJtVFQ0dkMxMU42bnBzYWtJOHF4OUFmV1dMSmJ5TkRiUjlYb3JHZDh2Ynd6TnFia1FFVHRuTjBaamtzNGs4bTAveFNhK25zKzA4NHE2V092T1V6M0ttc0ttRjh5TUdneHFxZCtoVDVyMndldEhDZm9QSGZtNTFtd1hEV0JManBkdGNMNnJiRzN1WnJxSzBxenpCUEV2cnlyZU00TFdiREtpUzluTXpxdTRpVVNrWUpkcy94dm01TlFJaTBCN1Q3NVZzT0hpM09RWVpqMURkM3NIOS9NdDh0a0o3VWZiUUtDVEtWR3lZYjBjK0VldEkyYTFDSVFxWFlGbDVpWXp0cUJKVXZYcEk0YWNBV3BwemVNbjlzWk83VUxIZHB1NXBnQ1BOelB0aTR3OHcrNnB4MlVmZkZCSGFpY29MS2NjeHFvMXFuT2hUbVdkamw2YTRJSHpFakxzVmNuenk5ZDFiWFRabTVGUjNPL3BISkhxc2xpR2FKVUw3Q2lraWtjajVOdmRjZXpiL3ptWGpqMFE1WUxWTmI1Yk4rNnRWUHRwS3llUGVEYWt3a1J3cXU1dkU3RGFUOTZCb25UK2svQmsrM21vQVlCWUhCRnRzYU5sbmYzQXEvVHdDRjFhaU1YaVJMcG1PVC9JajAwVzNoQ0ZBbnBPWmh1cUN0enNEc2ZIOXpYU1B2MTNEWExjQ25QUnNjZjR3VjR1RTFUaENGOExHKzl1NGFRMmdTSG9ZSEhYdVg5eklCdThsV05aS0hiY1R2MVFoTWhtZFFkS090V0twL05oUzRVTWFRSHovUm1aSDhkN000a0VmM0VMeStRUGUvOVFMOFdKMnNGNWdIZTZRQmtmWUc0Mkl5WTUrazlUdmZ5N2ZPemNsMkZWZmQrS244MFlFZ0M1QTN3S1lQai9QbXllektBa3NYV2dyZTE3cndSbnNuU1dvbGRWTFFaVVRpYlBOMG95K2U4MXBmTlJSa2FUbHVJVE1ZV3g2bi9rcjFzeEh1dTRFWTNqNXhvcDQ5ZjlYVVlaWWFCbnJmOVQ0NmQyY0lRM3QyZmxsZEJmY3lnRUljdUFIVkdxTlJOQmFwZlEwOVpBcll4VlFhbktRQzBiM3hCSmJ6dkczdVZaUlU4c29YR1lxRXh2MU84Vis0ZS9zYSt6WitkVjltbUtDbDZwZmZhTDIyQWh3WGtPV0pzY0h4WnZKVzJyTDVQSzh3MUJBVUNoK21oMlovTGZvTTdrL3Q3M2haRWtIYW00ampOaW13Zkl2WHVRRGczZUVPczNyaDVRd3p1eW1MRnRUdFE1ZEFabklMTE9VamVwRytnbkhRTngrMCt4dnRsbjFrVi9UK01SdGxSUStKNVR2RktzUFYrZ1YxSkhieXJJdm5zR2g1Tlg4Si9YaFNEVHNFWGs4WWVpS3drU1dKRkFmdnFwUmkzQ1pUaHZLSkt4b2h4NmdkNE1yRUd3bUxSN2taUzJpRXdXR29VYVljQXMyWjFMOXJRbW9kMUI2bGgxNmFJSTdGZC9SUFFCNEx1R2xkT0p5WGlSdkJnRFFMbHdVY0laREtnOXVwNkJmMHdGczA5ZXZ6b0o5TFdvUTZkOXQzNUJHeDQ4alFYL1kwYktjMnlEUGFya3dMVzFUcWJnYlVWRmRtQzdjeldWd1JldXZjUXdzVlh2Vmw1VkhwZ1NLUzZISDBEMjBQczI0dFhnQUVYNmxhL2ptL3NDbW5OZ20yRmhSb2NmVy8yclAwY3FNSnVoc3EvS0pmRGFGSVVzdkdyNjd3VFAxK0hBeUhENU1wdjZkYnozMUg1dzhVUHRSRDJ4b0VnM2RVRVIrcmYvWVZ3aU14c09WNkJNUS94NXBycWhBb3pzeUpDYW43THpqNFZ0RTdIelI0SVE1Rk1SYWpsVFpaVXh1MlVNY0RUcE9VdUJUUUZoMDVhY3owekNIbldHRWZDb2g2QkJadEFFN0cyUU85ck9CTkluRG9GL1RIU21qUXhLcnZZQTdsM2llWHNIUERlYkhWWGxLTEYvcmJ6VndqNEp3aCttN3hBck1BS3RlQVRUVTBKT2ZDaEl6Q041aXpnU2RGWXc3OE5uYVROeGlCTFp4L3ZoZy9jaGpTMkk1aFJ1dE80WEV2WThHeG9FOVVtV2VqTzRDZUZjTzBPRjJsTG1FQ2QxMmNCL0hCbzkrYmVrbk93RC9Db0ZrSlZIamNvN2FFQkxvWDV3Z3cvOUZ0d1hEeFJzc2lhdHpLOEJRVXk2RGNkcGZQRmFuRUtJVGdxUWFvVWdtLzIzNEwyVVQzMVZpb3ZqVFJuK3hZMHp2Z3JJR3pvcFJhdnhILzkxRU5CY1FvK3Z4dDlZRjY3TlF4bzJuTUVmUmlWRGZmUmdxMW9yZXQwWkxTY1FuNmExVldPYTZBeEI1MHRsTHB0KzRDSHZHQnI2cTBhckVaZ3A5NzlHK2t2cG9EUDg0R2MxZXdtbitCUlg1UGtjbGp6ZzRRWWY2dHBYYms2Qkw4NThtUk1xSkJZWHlXU0FyYkpvN3dycTBlOFZOWGZFL2hHUE81aHdCa3BYbUNRaEpBNUUvTnpBMS9aZWRoT0luOGt0TGJkMHQxT0diUGQ3UDRzN3J0cEo5dlpSNS9ORlk5S3ZZeXVNNm1SWm9QeUt6OTFiN0hpTjR3ZXJPdFBlL21pdE5lYWhwQWhYcVFuWk1zREZwc0pFNFpYVGU5RGpRalo3bHhJbm4xdUs4L21RZmRMaHBlNVNTNjU4dkpucE84NFJINnlSOXA4aFA0M2VKMDJ4OUlvUmpTZ21jRUVDMjlyTnJzejF0VitWbEhsK0lySkZwdjRrbXlwTTNoWEpXbEF6ZlpRb1lBRjd2NTBKbjg3bE03eVViTkg5ajdHcS9XZlNnSFBPekJvazRzaFhkK21OdExIYWdrUE5YQ2hlRVJSVmJ6Wjdad2twL1hqTzE0TllSQm5SQ2tWaGpmUlM1RXpkOWUzWVJEMFYvRU9QdU1BZmJDMEgwRlh2V3BZMlJ1d1Nqb08yTzg5Snh5bWdwMjdRUk1KakxLck5EeG10NHV1VXJkVFYyc1llUzhja0IwM3ZobllwOSsvYUxNOGVoaE45TFpHVUszQlV3Y2ZnbE41Q0ZkcUxYWktLYnBwelJhZ0tNWHlSbUtCRk54U3JBZzVBNUtoNU91M2Y0N2tCVkRCWkRndEdBOGk5dUpGTkpQWkxXZXJwbHp2T1JTSW5VTXJScW5wRHg4NDFiZjlsa092YzBxWUx6eWQ0cWIrc1IvcHBkSGs0TGJGRkI5V2lhaE4wYkpmVkFtWDJzR283UW1UNXNIYnFnWnNBTkVxYjdPVmtUb2I0S0k2UVUzcUNUVG1zUEU1UE9mOWRvMW1zcWtjSjZyZkgwdVBSVDVwTGVVcWVkamwxZ21OY3lwam5CRldJcHNZK3VjaXVaZzZObTE1c1hhVXVFTFVxUktEcmxyeHJIZW9tZCtPOTRGbldIVGZBL21lSVE5Z2YzSVVSZXpsVFR5ekY3L3Q3a3dmOHg2RmFKanVFNHlkVEZXa3o5MXpBSExzc09CRTFaNWIvVUxqc2d1RFlKNC85YW9yUFQxUEFmN1V6T0JpTlpBeEZnZ1h1K1h6cjdqcG1MTWpvVHF0ZGNSRS9GRUMwSktKZUJoYmx6cStiN0RVdnFTY2pLZ1pGd2FRTVExRDdWN0RFM0E0cUl6a0haWDZkU1k4YnZHd2NaVjlOZTJxRFZDMVZMSEt0YkJWdWV3NFZsYTdtSE5iR3lWNmYwYzEzbXRVZE1HeDNWQ3MxeVlqd1ozYWdlcTFSK3JlWEN6T3pMNVpaZlBYam00ZEJkU05Lc0liakhFT0xjTEZ1WHBtZkx4ZzdSTVBJZUNxZkhlTWlEZE9Gbjh6UjIyRUZEeUI2QUJMcHdPOW1yNVhTd09Mb0FOa3VrQ1hYUTNWQTkxK2JmL25lcUpqZS9pTGN2SDF1Wm0yaUt1d3NwTTBBaFZZZmhrVzF4ank0YVc1S2tqcEJuWFFqWitjSUZFVWJ3R1JZMzhML0NiczJhbHBQdjJ1TjJ5bVlzTGNpRDRJZ1ZPREZqTUhUWkw4UGVHNms1TC96UnB5bVlrNE83eXF5cDUrM3pjdnlnTWVJeVp4VGtxVzVPOWV1c093Q2VMdE9DUm5EU0FpZlRtQktoUW9HdCsvMjVYMG1FcTJzR050dWZZMnRsVmtGc0hvRFdTWFlWUGZkTnBUNjEwU2pmZHYvZEZlVXhXbTFaeHRLaXZjVnE1M0hnSVhQRVBubGRVQlZBa2hPYU5PWTlkR1FxUmhlaEdEcWNzVDJnbHpHZXRYZVlBQTV2VjJ4a3Q3V0JkQkp3ZTBJT3pBSTgrNGQyUStaM0JVZlBHN2VVSk12U05BRnUxU1owUkZOWUlmbkhyY0ZCeXQ1WXNPNEV6d2dTSVlnOFBJdVJPSVltMEgxL282Nmd1eVp0SVJlYzN1MkxuSEVtZXREb1NZdlBZZnJLdDBPMndEZkxxeVBUUG95d2U5Q29jdzVZMFNHWVNnUVdxSGVJVzBYMk5oa09BemVqZDNrVzBMRWg1bE1UeUZmVWwvSml6OG5pdW9VWjFNRDlZK0F5SnVwcHVndis3UlJQSlExQ3JOZE1ueXQ0eVE1Qi9XWTFTZlR0UUhGajVjZ3Z5STg5TkVLaTlOSTA4VXRGdzZRNEZkcWZZdEV4emNFZE5lcXFSUmhzd2dOS0dWcVgyYXdSc0ZnQkxQY1ZzUXhxSWp2QVhwUGVPVXVZcENLNkc0alZjQy9zRjg3WWtjUXZZQ1l2MHFOODI0UHIvMVBTcmhvNmgvUEtycmZpSEtBTyt6RHJDVnpCYThCblpnMVY1cjVwZTJBNFY1NitKTXI3OHRlTWpZcGE0YUVEWmRqamdNaXp0VVhIL0huckFoSWljMm9uUFBtVHRLQm9vWHFLdlVnRncrWFZsWCtqeGo4VFI5bmlWcVVValVQcWN6cUd6S0o1NmQ2Sy9DV0R6M3NoRjFxYUF4YWhPaldtdHkyNE1mYjNDanhJNW1aYktDZ3BlWnI2dG5ibkE2Slg5UjNMbnZnRDJ2Q0x2QnhFNVJmUmZYR0x0U2NRMjdBdEN0QkpSQ2Z3aFhtUmdjL01mUHJWZ2FCT0UyeFlLS2tNZXlwSGx1bitzMmRLL1FtRElvTmdISzFBMUdRY1c3VGFIVndZZWRWRnJDME9oanBGa0xpUU1kUEdpZXNhVGxpTTVUL0VJUmVDQ3VBRDQxc2k5NTBSYVRMTnJqSnRFU0UrRm43UG5YRGhxd0ZJNlVXUnRzaGZZY1hTZE1TYnAwNzBpRUNFSGZ2UFNGVmV6WFUzZXR3dUVzTjNLSWVlbE5HNjBjZElBdElEUVdwaytKbFA4N0d6Lzd3cmZyeENiMUN5TmxyemFXNkhJemYvbm50NVZhRWtXa0dMcHViQXdNTmxZb2FXaE9reVcxdTl2Rjk4VXZMc3MxSkwrVWZDUlFaMm53MVFaYm95ZHo5aGlJMWZRN0lmdTM2TTJJbkkvTi9xcVg3cFdTNkNRbFFpRmtEQmxBeGQ5OEJEL3lFQzh0UTVGTy9EaDJ1bk9pZlNUeU8rdUxWZkRNUG9rdS9UYStBb3ozZ2ZnalFVTkI4NysvWGM0VHRWTXZEcTZQamRDcHJHUE44S3NuRitwaHdSMmdjWW9jM1Q3V1lIL3BKc1lsS2RMWWViUDNZN0pQYUlZeGE5Qlp1RGpaZWxZdGZMYk5uRVhuWjVnU24vRU9wbHozOFFGK0dOZWFsZDU4RHBJMTNFQSttczhkSmJEZW5jZVk5NzJ2TGhIblFaUWtDengzVnBuakNEWEJrOTgreW5EQ005cnltR09RbkE0TEp4cjQwRzJ0RWtjRyt6Z1ZMeHZBczZWSXN5Z2VmMGNvb3Q0RDhkRGNDV3V4YWEzK0czbnlUcE03d0psZFZDSWdFSzFzWUVEcy8xQzdNV3NPT2hCWnpPQXNQL1VVcjJQSDJmbzljVU5ZN0d2N1RBN2JhN0k4dk91YXdpMktEMVd3RXFYcTVpYUduNWdUbU1sVG9WeG1xd2FobXJOZnA1blQ4c2Q0NkJIN1Fsb2UwNW9qZG11c21KOUV5UXVKVmpkTW0zSll6UG4xK1cxREZaT0NRaTY0WkNNUTl0bkdOVEk3cjBKZlBvNHNqU0pPT1pvU0hzOEFxZDNoVktXUmhibitDd2RmWXRNWE53Zm1zU1k3RjRTaWkwOFpibTc0WFpld3JoQStLdzRzV2xhVk1COFI4SFY0QmR0ZHVyNEdWZFdjOFZSUmY4cUlNbzJGRW5VVHpPUDNoajBUUzNoY3JmSFI2N2xPV1Jvc0w2WHR5Tm1ZMlFzaFNZNFRSMHBzNUhIZ1JYaHcySUxYQWZtVUFqOGtVTU53MTRJVEFqY0NwazlXOUdDT0ZYVWJ6VG00aVV0NXJBaHZ0NElva08zdzJzaWdGYlNUWWVuSmU1OXV1dlNISEQxY1lROEF4ZSt0c1dxdlpCMjhjUjNZSnc5VlJOa0pnNlhuaWk1dHZUTzc1NENvcDFwVXRhUGR4S0UvY0xkMFY4bDI4V2ZCUElkRStPc1ZkNjdoTEJkMlhJelg0Mno4RUxwcFZtOU1FZllhYzhCRnExQWhRRC82dENRY1I0M2F2d2RlYytqSDRYT2Z1ak5vVCtoWU53d2Q2L1hLSHQ5YjV1OHVWaDJsMVJjUlhNT3NHVlBXYWNSSVUxcm4zWnNzcDZydUFITXZBRUNsV0c1aU0wM3I5Mk9RNGFFM2dIVjVRdlpwMUJXTDh0OUgwcjBzQkdieVc2S0QrK1Y0WUkzRGtISzZmWit2dmJsK0J5M3RpaGV0eXVwNHlSZ0dmQUtaTENHelNMVXA3bDZBbGJscU9uUTBOSkdIb1ZLNlpnL0t6ZUJ0TXNhK1cxeU84K3pFdHdSNkVBc3hJdWVkVXpzM2JSRVZaMXpOcnJFekpIQ2Q2WVhTZDZHVFVtK3VzNmtkY1A3cjhoR283UnU0eWs5NWdWa3kxYzVYZml0MmpmMzJqTk04NEI3dm5lYngwVzBjOGZHcUZPeTJ4ZExIZmJDRXk5a2NGR2x4SXJpNGFvK1p4eExhL0VGNkRBV2lVbmh6SUlMMnN1RjA3VUUrUFF0eWpvNTUxbTBnZGpwU0hkQ05zOTQrZnhlM2VnRkd1RllwMUVORVVnSjRHelU4eGtZZGdyT1ZkVDJEQiswb09icERFRjVpUWRXcjZGNWtTNXVocXVkV2lLNUlMTkhMM3hESENISUVPUDhFZnhRWkN3TGluZmdXNFZqUDdzckorTTBzb0hmQUh3M2tCSjRkRlZjZTBmYWw2RTRBa2lDREd6RHVZZnpYbHBObXk3cjBPaFdLZm9CTHRXUXhxVmliaXZOTDA1Z3dIakNsaHhXT3EydnF1Qk9nNFBNMTdLSGpzQzdWVnpPTjh4SzRmVzZNMDd6cVZOUVZPQlhIbDFkbHJCTlNVcytIVS9vZTZlQ0NLS1RVbEd0SmtmWW1QdEVxL0Z4UDJsTmRrVHhZcUY3YnQ0cTc2cjNJNWREb2NqdTVTMjhqTlZNNitIclB4N0VyajRlM25DdGVuSjc0ZWh2TUNPZkFRbkxZN0NiditSKzBTMlNQd0RqMGRUd1RMMG1ZSm5zeXdEaXloZUlqaGhDK0xWL3AvV1I3K2hlaDZ4THZrb0tUbE93bFRUS0ZJSDRoUnYwSDR3dXBlVHV6a2lGVDEwTU9EUkEwZ3JscGJEQ1pZMVdIOExYZHZYU1d4bVBvcnViMDhwL3BXaWRVZkFta25JUER2ZUcxclJ0blc1bmZLOWFTR0ZtbFdMR0RSNk1DQ2ZyMSttS29PWG81dmZSYWRHTEFLL0h5YnFDMjZ1a2Q3T2daYkNPbnU2L2ZTZkFjSWVja3REYlBzMi9teDZHVnBxb3FDOWZmV1hWVEdXK2hpam9HTzdpSWlSaXh6Z3JxbWRDakh6cDgzOFUwbjRsSGZ6L0hvZy9SZ01mcTdEbEZ2TzQvdGN3dXo4ZW5CbytvMEJvdHNNNXVqVzhjVUgxWTl0SHRoZU43NlVBdUFVcFNoVFBDN2Q0bTNwMEFPK1hIZnlYUmpyTFJHNTZXN2NqR09CVG9jUXN2cStVUm9Na284bXcwQ0tZQmxrWVRIamlJMjVpeE1xYXFrTkxPZmE3Rk82UXNENnBrM2NXQmJhT1h2UzJNdmRZVmVmK3BFT3lrTnZXclRDSUNCaDF6VFhjMmE4aDkrdUMzTXJjbFVuSC9IMlAxWUhSL2IwaHl2RklrUG1OMlZKWFNvcllNUFVRM0R6eHFGdTkzbmxVSGJKOXZNU0R2RGtZWVhQMUpEZnRvWWt3cDllUnh1SUo3SDd0VmJCUEREMjhWeERSTzBteFgrclFKLzZrVnhpQTVFU0h0Z2hJRkpnTzdpMmZ5Z1R3K1hRemRHeHZkNll5eHVJUG9hM1VXSThVbHdUcVVaRDNnUUlSUXNFUUwycm5oWGx3WVY0bWtyWTBZU3V6d25xQjhLblNoSTk2RExmYmlybFAxSXRoMFJPOEJqbExJd0pnbExpTmJhV05oNXlwL0dpTWMwc2lYWjZ0RitXY0NhN0R0WVpVRTNtZSs3aDZmT0JOVlFkNnIxZ3kvWWEzWGs3Y0VSeVZ4N0kyMnZaNWFLSWxldC9va0NyTWJ2NVN0bGgvRjBlaDc5MzNKMDBsbk5MRWo0ajNLQXV1YXoyOEd6NXc2SHVPVVhJbkhaK001WUgyMCtrZko2ajFVVnpYejhsQklIeUpXZkRzbkN1YWs5cDAreWVNSUh1NzFnOExHbk9QWlptTTg1aTFvM3JUVGE3QitreDdYWnNwUmQ5eE94azY3RE42MzdxSlVKQVNoemtUWkRtNTEwb3pSZVRjdGl2eTJHcm5rSk1xdGw1bmRpdjd6bnhOcWVTdFAxa0tnNndKYWdhTmp6amQ0QVdhTGl3ZUFlZnhwTmtESWJ6TXp3T2RNZyt0R29rZzV4cGp2b3NaZzQzbm9JYkI2YndrS3JYQVJxNm0xMEZhM0dSb2N5aFRPS29hMCtValdwSGczM0hJZ2RVaEU1SGFQaXhSUDJkL2xicEdMM0VSQ3hNRWlkMllEUXVJWVpoR1JOMjNQSUZrQ2hoY3ZIZ3B4ZzRlaU9iTEJrZ3RMU3UzdCs3STRmcXlyNDFPREkzODhpWDJLZ2hHVGhnRTNyMEk1MmxMamU5K0ZuU2NTWm0xSzRuSlBOZkQ0R3VyR2RaeGhSeXRCTVNCV2ZYL3k5YXF2UEpYSXNNVjRjOTh3TVZ6MzhJTEwwZ3NyY1lYWnppaEdFNXZBWFJvcE1XN2d5MXpoWllrVytRT2EzUmNFd2ltc0I2dmxLTFFRcVVEcmZ1TTBpSTd5VzhIZTB2aDB0RDBQV3llVWdITkpBMVQ4VmsvV2wrQ3RQb3M1ZjBKY3FudENESEpDc2h4MGcvU3V3QStUaGtlMnl3dlBLcGVRSFNXaTg2eGFzV0xHUFo5aXRSS0V1TFB5dE84NjVBZzJCYzFrcllqcHZvZ2VlK1NyWkNtVWI4T2lWQVFaa1lrUEEyWjcwRDh5Q3NHQ2M0RzRuNVFJdUZhTmI4UVdLQXFSNHh4WDFQQVQyNXVHYUE1NmxFV1JsZDQxQzcyamw1cTlCUkVUcGVROGdSTktjWTN6ck1zcE9tc09RRm1ybDhtZlh6eWNNQWU4QkhMVmNuY1F6clRITHRzTElVeHFya2QxVnpKVDF4NUJJVHF5VVZmNDBvZXRMd1hFQkltMDl1ajVHSmQzUEU5YTIxT1A4Z21BRDNOMTE2YjA4MElqeXNyWC9CZy83bzJmU29Ia0RIcjZJdC9RMnA3b1BJV0dWNWQ5WDZFTVpSdmFldUdsdXhUOEl4U09xNWRvK0dFNFAweElNSDdwR1J1b0R1eUZjZStNMXJUYTNDTFMzdnBPb0ErUzhwV0paa0t2QjI5S3M4YmdoQkgrc3J4Q3c5T1h2MERwdEFobkJUYmdESUYySkpzeVNaQ2NGcmVSbFZOOVVLcUp2Z2FKdTRWR25IemIvQlNKK2dLT3U2dnhxWmpCWkdsSitHRTVaVnZmVUtBVGtpL0wwQk5MaTZCbnk2eW1JRnNjN0owQ0gzUzFmOGZJTE9CdlFuWE1NMWtadklvRzNuSHhtS1FCUVVQODJBazZaRWhmYWtkTjRpbmsydUU1Y2lCWjZtWWFCS09udEd3QWg1UzU5V0thVlZ0VS9tZGYxaDNjTnlSZDMxN01jdXNQRjFsWDFIMFRjVkV6aldLUi84NUt0RXBOREhHVE5BbTQ5MlMwdDY1WmhtVk9oMjkyclE4THlOUnh2aWZ5TlB2TUd0S24yS3hqM1g1N0dMcVhEQXA4clRzVUFRZGg5N1p5MUFVMVZ0SDFJNGN4VVl1MEhYem5iRFBQVDhPTDBzUlNUbTBNcVp3QzF0RzM5MFRrR2NXckZUM0llS0dBQ2JQRWpwcjRMcWdKZm9oTW1CZ1BXeDJIZmtXRUtSOWp6Q1J6cjZwWkZGdjZCaFBWV0hsQTFTcG52V2hEejZ3eUVWc2JIREdnMzBVR3BYOWFOSjBpRGFtVk9sU01heHVsY2Z1ZHRjdTR6c3I3N0xRdzdHb051MnJnSjUzYTZ3QlU4VzlVckpLTVBlRENRQi9LbHMxWlBEd2h3OWJLMWM2SG52TUF2c0VGUWRlNlVUb1BVRkNmUDBIa3BRYUROY1NFYkYwU3dzcFdXRXhUUGNIVERmN1hXN2R1ckNrVm1qOERuNEVyaURZT1lxSmFibGgvckJ6eW0zVlExZ2V3dnFMS1VQOGhvUVQzUW1jODFWK2EwY3d2Z1o1Y1NTU29oaUZhdnBvazRGYjFRT3J3NmtPeVNKQVJNWXZqYktubWN5TjZMR3pHcGhkWGRDbnFoVllmUmR4ekg2NXZrR2pyR3VGVXRhL2NSL0NaS2Vkb2QyT0l0RDloTTJyZ1Z0a1dUaVpuY1FsaU9ndkZPR1didHVEcjhwSktrYTA1ZERFVWowWFFYUUd0Wi9nQjJxenVjNXhnS1FkamVsYlA3YTZEMFF6aS94ZlVVbThJRUp3ZDQzZ0dTaUZwM0ZXcGxmeTVuTU1kbnY2VkdCUDNEalNqd0lqbENITDQvRFhTZkxrMXVzWS9KZ0xWUDY3Ukx0dFpHMUJpT2xIY1Rxejc1ckZjZjVEQWF5Zjd6eHVzZmllVTVtSzh3MWRtNWRSMUF4VVAydnZ4Zm5XdHBSeXNJR3lEc0dIN3kxczl5VlJXOUFaOTZORHhPZ3JnbFVTbDhQS01YNXQrbkUyeEQyUjJ1QitxbXRJdDNHVWNEUWxyK09uR1ZiSWtOYklST0kwR2Zyemk5RjJ1RzRQdHBIT0RaNFJKd2k4SHAveWg3RzRwb1kvaUVjMi9YTTVyUXNrYVR0V3JFd2ZoTkJETG1BL0JmdGdyWSsva0xORmR3bUJzNkNnWWFDM2kxUjVqaTVkZUV5SFVWMGp4T2FQdjdPQlBXVUFmZVU2dEhFS1FwZ3RJNzVtZXVCZnZPdmNwMWxFaEZNcENacXNhakoza042dlI1TWIzZG9ZVGdHZzIxcXBnT09KMm5Fd3REUG53dFhOUkFSdlc5VmJrRGlPN25PTVFKNHQ5U2ZTa0dVQmQrRjZ4OFhGTjhwWGFCM2t0RUI1elppdlRFS0FKZnNHeFY1SWVYOVdvK2NlNVlUeHJFUHJzQWZrVEgzUW8xNFFpSnRRS1dEeGt0Rml3QkVoNndmcERwOVRDbWZwQTVKbE1ONEVaZEwyaDZ4RElqd1cybHlSK01OKzRkL1pUNHl5V3ZXci8wRTZRQzMxWFBUMHQzNGREQWVLZGVaY2EyYnNQWHE1eWFSSUhScDR3c25vbTFiWHlHSC8zbGxjTStHNlRPMWpVMmwzcHQyaktIT1RkSlBkWjd4MEZMclhMcmN5eHd5MlJXSnpHMGZWbEJaZVNZaXl2V3Mrb3J2NWxFaXBlb0YrU09pZ0x3V1FNZ3YvZlZITTNCWTFKOUZrOWg3UXd3VkZ5elZOK2w3UloxVlhCMmV2OGY3U0xJdUs2WVFkeEoyMWJZYmFFdXp0VlIxTGFmdCtSQm9DUHVkZ2l4M2xwMlhHQjdYa2pqV3JkQWZkZUJ2WnVSSHBNWXR6Unc5UUY1eGpIbTdRekRyTjhOa0xDYi9KaXFDajZEcWdkOVE3bmNiNTNEMjlBWE94OVNwTEVVZVdjS3dxdG5oL2lxQ2hiczVlbVdkc3JZY1ErSjEyM2Eydy94aGpCNlI1elBDb0tjVi9rNjQ2dng0U0UxQWRVVjZrZ1hlYURiY0ErMERWeDdrdENPazhpSkhHMTdkc09CaXRsVDRxS2tPY2ZRdEZUTVo4d2FqcTgxY1paWDBaWE9GV0luZ1lMUkViZ2ZsL05ZTmN6a05lL3Y2N1A1UXg5aUJkV0I3anZiN1U2bXpZNTNZRm02TXpOa3gwT21Rd0ZrTkZVR0ZJSjNLb0Q2RzZMbEs5VVNERWswMUx0Y1h4VWpPck5WcVJ5NzZ0eFpSbW5ia1Iyc2dZVTNmNG5DaVgrOGlqVE9SMXdzQm44YVY3UktKWVJINURiRXk4Zm9wNk04NzV3RTFYQU5RRWlaZS95bk9HK0Q2elRLSnVCZHluTDMvNEl5Q1VyNmF1czl3d1RXVElXNUZEcCs1MFAxeUFpd0tnZnpacExFcE5BU1FsbDU1U0lSY1c4UFJUdG5SZWZYLzEzUDEzZWYveERGVkI3OHJ0Nk40SmJhcGN5aGpFaFZYeWJWWjRoMktxZDVRRExIY2ZKejlpY0k1aXNjamJQdWJZanI3L1BXMnFMMmwrRzRIVUlSU3pIS1VuTWdKOW1nd2dEeklUaXVDOXkvQ3BPY0J0ZGhEMVJEU2lPeTY3Q3JDdEFSYzE0TW90OTRpZTVnZnZFOGNZUWliNXZ5cUtGRkJqa3pFSkNBaHdXVVFpYi9ZcE5KUUpxd3llbHIrSDBKcDNuaEZ3SkVnL2lBK2JCYUl5d2tYbkJmVlVrTGkvSUV2ZE80TllRNFc1REM3RVdDNzExVmJnQ1VLSFNlRXFveUVVZTJDSTZPZWp0STQvMTF0UGx1bTJ1elJSb3RId01nN1dMUmd3R3FhZ0FzLzRZWStMUmlEaDhqWjc0NVRkcDFpSGJPY0N0ZURRdE1JSUE4NkxBckxPeGJ4b1VSNDEvMFRQT2JRejJyaDhMR1g0ZkJLVXNJaXFJT2lYU0VQTVdjYUhsUUJ3Tlp5bURYYU5IS1dVNTFYa2p4TlZNTFhtaUxLVUFzbXdYdmVuNTlOL0E4WCt1WHdTZWRsclh6NFpVOE0yUTJYMmtHa2hZUTUwT0tuQ3k2YWpPUXB1bXBjZWRuY3Z3OURNRHJDL3NUOU5SNFJEMTRvU21FOGlZTnA3QjJEZVBtckQ1a0hWL2VHQzhjWmlxOUtML0hzM2svSHZIKzdoNW5yWHNPenFNZUZ2QXAvemdZSHExRUhlMkErYjkxV2E4OFZ6Tkl4UTE1VHl5TkdIV3ZFaWpJWVIzd0Ywa1ZURFhyWFZXU0tCVC9aTkNjY01jS0xkazFlRTR3V0hTNW1aS1lVYnFWcVZrdXZYbm95dGhXSlNuWGQ5aWh4Q0dRWVFGaW9abWxVMWxBaFd5L0psY0VCZ3krWlhKVm5zaVZLaXB0VUtWZU85L01RV1RUL1VVSEEyQ2x4cU82NXZQNlRGT20yb0xFMTJBTTl4QzZpRUFtTTF0aGlvdjA4VjBtZTZKVTNKM3dOL3UyR3Z1YWx2cGRlNGI3bi9yM1hjWGRZRjA1UVd6MjZUQzl4OENHRithbFEzMVoraUdSM3F5bU1Td0N0cWRvak5KY25sR2ttQ05IWGVsdzI1dkFKVmFodzRkdEp6Zk51TFVZcmhCbGp4UmVmbHBTMkxLWk1aZnpwbkFzaG1oSEVRS0c0UFBLYnZaZFdUYkhlaDRmc3lOemxOUFdXd21GTHNEdi8zRUN6Sm9aZjBzdTFqS1NhYnV0b080anFFbHJaQXhWcCsxcGhFMERWUG9veDhLRUxRTW1aQjJHVzBjbjg1ODdLNFNZbnlpTXBkSHdpUTA2VVRvcnQzb2J4UmE0cGh2emZIaGd2bGRDSU9zZllRWTJ4MVlVK2w4RlYzc3Roa2RtKzVtamVwTDJJczlhTVRyenJLanhzbW10UkpDQ1hrNnl2K2k0Z1ZyQVFYZFBCVE0remFkLzFKR1Y1c0xZaVdlS2pxM0p6LzB1aytCYnFnMzQvbXI5MnREcGE3WXpLdmdRb1NCb1hvbG04eTJqc251S3NodThFMWlqWVI5L0RGMTRoNThkVnpPTjBFeEZkdXJHK1Q2NDRqSmdMMFlYK3lkSUNzMmNoL0F0OTF3S1JVOUNQbGRsWW05c0cvR2ZJYThZTVBqYWJPRW11SEJUcytyVzZmcmhIdWt6dE5IZ1dHZnFEbmFONjhtODl4blpTMXNIYWU5NForSExYQS83N0YxVTFsR1lDK1l4ZEtacTBQTklVSmM1SjZMMlE3TWlBREhwMTJkbXhmV0J5VHAwYlBnMzUxajIyVytrd0pOZGRrQXgrV1N2ZUFWeVlocTRHUExlNlBYL0Q5K0tIbkN0Ykh5bE9BZDY5OEYzWm9ZRksvTmJORmo1SlRKbE5Hc3hWWkVWUG5QU3NzOHE5cVdpZ1FVcUpxNVBGYWJjbXBxdThKR0pDc3hmUlZCV0dZMUhMdEVTRERZeTM5WFFuZmdsY25BdEI1KzZaWEZFRkJHUk5qUWtST0NoQnFTWk9lMHAxNjlqVkJmK2xra2tnWjNHZkdkYmczQmZVb3QrMWVtOFc4SWt0dk1mZFJwOTVTWkM4L2pOdzBpTmhwTWJDV0pJSUlCNDRjSDJvRHVFbnR5N2JQaFpsV0hiZ2ovMHZ4Vm5ySlE2djIzS25LeE9SeTFzZC9sdThvZm1BeDR1L3NjcjE5MTRqb1lFVlcwaXRESmRlUzFPb3k4K1o4M0dDZVdIdGNleEk2K2N5ckRIc1ltekZlUy9GV3FyOUU0UGlkZ1NkKzVGUmdpZlU2Q1A0UG5OWFp2eFJ3Yms2cDdNNFBsRXV4RWNSRGtyRWlnR0dwOWF0aXk0S1JJSlVTdHFISzM1YitKayt5SVJWZG9KVWRUREk2S0JhVmgvbmovdWtwSXE5WVh6cGFiTG1RdUFPOVlqTTc0TSt6R3VlUk5ESkZ2bmt5WWxPWGJzbVhmNllwSE0yRk5FVnkwQVhwYWthTGE5UHpDZlJTUFlwQnBDTTV4VnE5R2FIMkdsM0ZzT0ZOM2xybiszcnREZlFoc2JxMzNpb1o2MW5hTnI4Y0JuaEJFTUdXS1JrWkZ6SnczbXBNSGlUZTlnTHhGTmtsb1M0SlpOaDlYSU9WaHJjQXMzYkhpelN3bmJqWFJvcUlEeHlBRDFHT3NkbitSU3FVTnlObFlpbGJiSWJDdGZCbk1uRkNwVjJlN1dSNU9WRmhyZXdCUGk0V2VsOTFudVZWY2F3MVpMbjhVRXpheWIwV1VucktIRU5DcjBXcFJ2LzMxemM3N2pROG5uUnJoTkZKRmtsdVZVUUl1L24vclRDL3dKTzFiSWt2WDBHY0d5SkNWVXgwaGwxbHB6aFFNZGJZc2lVbGsxVjE3QzZDT3RQeWswcENqZzAvRytNUXlYVGZYNW5xMFluejF3bzVuZVp0WkJ5MW9IcVV0Rmc5VS9tdFl0R0dTekROWWpNZVpWSko0V1ovcy83anFNMFlsTnpMamppMytyWWYzRHB5MHMydEJXRWZONXZWSFN4THJPVk5NV1NaT2x2Z09zQUNrTW04K2ExdjZPeGFRM0J2OWRrcFhRUmFjVjhnNlo0Nk1CMzcvTWl3YXY1bnZMQVl3MW1OV3BXdEJOTm92YXo1TE4rZFJGSW5TNFJxUDV6V0htN0NoU3dLT3g3dzJSYVM5eEFrbHlmZzUxMkYyQjdBNlk1amhTQ3BGQXcxakwrRnBQUHRQbnVQVTFCRnhkSUlrWkhZQ0NCY01ONDkyWmNrSUVUVlpHRnorSnRnVDUyNEpVSWM5M0Jxdktnb0xOeldkTHg1OEYrNHNldzlKUVUrdTVyeldVVSt0V1EyYWlKVldQNjQxU3ZmRFZFV2VPNXRkVG9VLy9Qb2NDd2FnbTIyMnJWWE9Db2Q1SCtCdVRoSE13d05tdXhlT1IwSXFZNGVodFF3a0VaV2hoVzlVV250WU5kb05zQmROSjErWTVQdzRCYUZBM2hOK1BxV0FFdEhWaXNIckdkZnJPQUY5eXkwUlV2TjhKeTg4MUoxWi8rZCtNMG42YnoyVmltSjBsbHQ0cDZQNFJ2WHlEZG9TVWFRNmpTc3dmdHU0WDRLN3pFb3hBa1dzZ2F6ZXl1TzFxa3BjdFNsK0FUTHNRakRpWmRJRnptZW5tTk14UmFKaFBpMmtndGxvSjFXc3krdDh1b2IvNDlmVVVXUi9sZ3FSSStkRlpTNEVxdnppQVpueWZiVlU5VlhyNkxXVU9wY3R3ZXl0K0Fsd3ZsS1phVTY2Q1RRWm1ZRDhNTmJtOWpTVnVaVWRiKzFnV1hlS1ZmRHRqS0dDSUxFajNBcVlYMDM0ZktlSElLQ04wcTA4d1ZmOGR0OGNOcDNhL3NwanR3cUxaM3U4WWJBbWNOZ1hoaEhwT3NNbFh3REowWUhxSFliLy9VQ0ZQWmJIYS95OEZyRnoyWWNPRHU5c2hXc0VUQ2RxTnE2bHYzZXgvdmRReDZPNGlOZVNocU8rNjd2ODMrYVo4OEdZNXpVcHpwQXlxKzZZV0hyaTRhdkNsV3NlMlJvUkk5UnJRaWlHM1I3UllueE85OXVxMjIyQS9KMG5vZ0k0Sk5vTHphOGxIUE1ndU1WRWdUb0t5OVB4cXI5Mjg3YVVYRC95UGJYUlBUeEdjQjZqRE50L3JyVitoU2t3MklXMWJUelhsaTlOblR0ODBLQzh1cGRUaGI0emdKaDBJa2FVcXY0WUZRVnBJY1h1bjZ4dHc3T01UOTR2TWE1alRYTTZneFBKYXJSdVBIWHBucS9wRjNzcUNwYS8zbytOaEd2Z1lVVVBtcW9jNDdCYjJoNXhmL3UzYi9DYWYzRFBxZDVhaTBCQzdoUENWRXZCaGM0c2NyVmc1SjRXaUduUjhHVWNoN0RTTUZrR2ZwTXcyOVcvbzBhMzNOdjlacThYbmR0bWsrWEVvOXliT0hvZ0I5ZHdHN212bWlReHJKUk52ODlndmNqZ095eEdmdGRPUEJ6Mmo1MWM4TkJQSXJtam5URE9XcHZHbXg5RWZZZFFrc2Q2RUZHSEFKWm1VdHkvbEVOVENjcUlYZEEyY24va0dBZkdTYk8wSHJGZnU2R3pXS1oxRHhOOTJxV0ExODVqZy90d0RvRE9reGNBRGJkbVA4dFh0eEFyR1lkV1NpYnd0YWRGRERwM1VkeDhmc2k1aS9oaDRtdjd6dUR5NmI4L2Q4NmxpbDliOHhUSmpoWWtPR2c0Y0tYUHVzdDhmVVhhWmpudU9xVC8rcXM3SkNMdm5mN2FWd0lIcHlENkpVZytCZ3JqUlV5TTUzMXYvMlFBQkFCb0FRQUFCTVFCQUFBOEJDVEVDQUFBQUFBRDhBYzVBQUFJQUNRSUJBUW9DQUFNQUdWUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZzVLUT09PC9CREI-CiAgICA8L0JJUj4KICAgIDxCSVI-CiAgICAgICAgPFZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU-CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU-CiAgICAgICAgICAgIDxTdWJ0eXBlPkxlZnQgTWlkZGxlRmluZ2VyPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw-UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U-RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0-CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICAgICAgPFR5cGU-U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjY0PC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFYNUVBQUVCQVFBQmZqUUg1Z3djREI0UUFQRUFBQUFBQUFFNUFFQUFEd0lBUUFJQVFBSUlBQUVCOUFIMEFmUUI5QWdGSFFFZkFiSUFBWDNEQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJzZ0FBQVI4QUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRWZBQUFCc2dBQUFBQUFBQUFBQUFBQkh3QUFBYklBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFGOHl3QUIvNVBmR3dBVGZON1VUZWdzTForL0RQakRqTXp0bGtmeWtvT1Zza09PNnFhR1JlSWpaZDFJc2xJZ0s5RENqTzVpQUFlRzg3MkE1SUE2RVJkLzdTcEdmaW1BZ05TQUFaZC9qOW1pekJDaDRnQjVEMVoyQ3VheEtzemJZdFdXRGx0amJ6aXFNOC84Q0lBOW4zVXBSb0hKYWg3eEYyUTlJQWYwdGV3RlV2dVdQQVNGODd2QU13TVJhZWgveFVSbGdFT1NvWWhacGtNaklqMWkxbFNLVTNZYzFEUHcwT1BFcGRoTVU5Z2Y5UzE2V29HeVk2aUE3ZHhnTjlEVHdRMzRQd25yUmh0SXNVNklJVVB5aUEybEdtR0E4VjFIbElEczJrWmJhZklnVDJqTUhTQmp6M01Tdm14cVIxMW55ZUE4SkhrZy8wSXZhMWZMTWFzak5KQm1mWEwrTURlSWxWZjFOc3JTck5BMnJzdE5teHRMWlVaNUkwSmFaYXFsRTMwVnNlV1ppekd5ZDM2Z3NnQThMUFFKSFhmWWRxMUR4VDFDeEtON3g0L0RnQ1VvQzZ0amlDelRTWmoyTXFVc0lkZjc2TDM0dmRMWWlDODN2elA4Wm44WnA4aDQyVTZWOHFxQVFRV3FaZWgvS2wySzhVNlhKYnltc05yQnJVZFJ6Y2xKc1kwbWJqekhBU3dheC9adGlJVG54MmJpSHM2NzRUc0NseGlhWlBZVUtzZk5HNDhqdW5zeFNWeWlmTWFNV3BOQUpVWS9MK3NXeXJ4NjZ0U3VlM2dDNnRMbFBKRzJ4UkxsdWl1OThYWHZOV1owVmZPekFXZXhoLzhBbjEzNkhUZHZlSklDbGNYY0EycHdEOUE4bld4Rk1McmlGeWlDRE9lQlNJUE9pN2RuVlpOQnYwNTdqNENtU09BK0pmdTlBUXBQZk03VDY1RnZBS0w0ZzRHYUMvNG5uYUwrcTNISmxDQjFMaFlzVFVtZTdUTEFVN3gyZm05ZGhtaXFzcjVtdHZscjJMNkpKaldmMGNrR1ZYTWhlODJER010U240NG9jdUcvZWZBa25hUHJ1OUJ6bUR4MXkyVE5abDVFcVZQYUwvbHZHaGRwWW5RenExYXRHSnB6cHFSSHQwUldoZjlWTnhqVUNXZXpBK285enNLNVUxcGRUSzYwcjNJL0ttdkM4djhIZU9oSmhQQlVYWUZFa21SdVRKNHZsUmdwY3JMSFZsM0N4czdjTWRlZy9nZXpqaFJjVmZPZGx6UFd0Vm1ZaW9KZVFSbzRQOTBCSHpORG9MTmhwVW5XQytuVWpENmFTTjFUcC9pVHBoSmVCNWpidHY4SERWMnVFbXlnSjJHVHo5RWVlWG82dnFGUjR0UEpjbThQMlQ3ZzJ0bDZMdWNRVUlwV0xOY29URmpuWGRyUmxuYk81aTZsTVMxVUs3eURicDZNREt6ZkpHZHdYYkdWdUpkYVUvOWViSUt6Qkh5Z3pVVTVqbjB6MGwyVHpzckljMnQxdUxxOXQ4UTBCQkJzNmMzazNuczdqRnVCQkxpakwzL2FpVlAxNU52WFUxaDQ1eVlJNUkxS05yUTNtUTFIckorZTZPNUZJOHEyUW1uVFFnUUtGVnk1NzRGTVVYbHo1V2dZMEJRUFRjVG4xaHliWTZXRGFYNTFrbmZqK3hNQzJrOVNTdFZCRmlHM0NzVStPeVpyVFVGT1JpaUczbDI1eE54d1JyRGhqWEZ5VnE2T2x6eGRrdDNYZTAzc0ZkNGQvdUg5aFZWTzg2UGNXdkwyQTduaVRnQy94U0tndUFETmtveW02dTZvYTZyY09KUWVRSG10VWs5TTcxamxTY0JhalhpQXJNUUNrMzQ0ckN1bG9Uejg2TmZPaVAwcXFGRkI3bkY1bS80M00xZWdvR1JzdFBWMFV4WndSVEp6elNSVS8xTmJoUkE4N0Q1Q3BrQlluL2xHalR5OXNPRG5vdFJGV3ZNL1k0OEgrU05UdXQ4UVA0YnM0N1dnb3dJL1EvVEd3UHJGanprSlpPYkY2QWRCQUgzc0xFdGZ0MHlqMDVPazFHemQxZDdKeTRHYXlDK3VIc25LRWJzUVJaMklvR0Q2MVgwamljUE92ZHRiSHNEeGNJVHJoQTZBTXNId0tFVnBXb3FVRmtrOTlvZmhhbm9hd2JKQVV6Y085MTlkKys3YkxUVEdEQjZqbmhKNDFYTzMwYzc3dWZRNzZSNlAwR1JLN2kzM3JBKzY3VUNYN25VWjhKN0VBem1PNnd0T2JRcDd0R1JXY3BHeGNCKzZWRHRlRit0eE9GZGlXaDFCcDhWRFM0SmVRaDNxcG5raVNSdWcyUTNBTUhOR21iTXgxdEdSUUVRaFJWS280dlYvWFJwN1JRVUJmd09CRkdMdTZaOVh3MG9SMmlrYUJVQ05RTnpNaHNOcFl2dlZkci9BblFsVjloRzdoNjJETUJFTGFNMTdiNVlLckFCTFVGL0NTMW1FMHJONjczMksvekJ1M1Foazg1UVM1Vk1hL0pJK21TbzJjM2RTbjc5NStjS1lWdDNBYjUzMjdrdVArbVk0WjB0c3lDZDBEZjdiUGdxdCtJQ2x0SDV0bmpSRzNJSnBzTitaeGh1OWFoUnF6OWlMZlMxMWhXN05ONkZoRDVacWkvYVZ3MUhDOWFhNXEza1Z6UHlmMGZhdEk3MU5lVXdWMitnL1ZpNlhYRmZpbmh6b3BmNUhuK281MDBFZ2hXcFR2T3o4eEdLdXUvS2ozL1FPQ1Q1RW1sSzJ6V0p6MFduNEhvTCtwTU1xbXg4emh4b0ZycU9JVEFkVGRnejlGbTJlcXRJZjV0TUN3L1dGMHpqUzBwak1xbElKZTdsVkF2ZjZrNS90SDArWlBGbjZJMm9NQVErak14ZEYrYUNYcTFYYTBjc2ZHQnh5UzNIYnVjTXpsQWZFK0JXVG56Mnh4bFlUdHdvVnRxeEFveFVBcVlUUlp0Qk1JWlNTbVhNN21vVk9VaGlFMlhtV05MNlpCR2w4UElHb0wydm56N0YrSG9qQXczYk5UUTY1c0psazdWZUI4c2RJSjc2VVFqanppMlJjc080S1gzUzM2TG52Sis5SWh1QUQzSnFtS3JEdUlNOWFGUTVmYXVkMEpXMjFuOHdZYjNVSnJIUHc1djAyVGsyUmFZL3NsZmcvOS9VM01PRWN3aXZmR2NucWowczNiZ1FOczRKR0JmdVk0R0p2WWpLWHVxbDh6OXZ3SVNOMDZzQkk0WDFoSlUzUWhuNXJoTlE5UVozVTlDeXdOU2dGYmVFcXZEVTJzOEFPVWdsMjFScm05SEY3TzJ4ODVhbFZyRUE2VnRVZmN1TWhZdmljQU0vMVNwc3B1L2tUazRXc0JvekVSSVZxL09Ta0lSWUVoR01TVUlpd3FncHk5ZldHL0hPV0NObnlra1U4TXFFUWdieHBxV211QTJ1TUEwYkFtTU04S0ZDNmp5Q2VlcG5QZ04zcGNOSkNvbi9rT0Z0T3FUSUZuSjVBM0FnNHBqSzRMZFRkQzdFODd5UmhvNHpRaFJqNWdiZzhPM1o3UVkyeS96MWVGVmU0NmFoVU1WcTdpYmZsWmh4NnBPNjdWd1lPNHgzUEg5bFdUL05MOVZsTlM4Qno4M2JHWE9sVlpibzNrK0E0Rklxenc3aUExamh2RWo0YTNGc0JVQWdoTTg5M2RzMk0vMXpENWorY1NHeHNvZHprSkIxWXU1cW1ydGJ5TGEreE13V3VVQUE1QzV5dTdTRHVSWDV1c1AxZTk2S1UvanpOMEZhM2pEakxyUXlYdWRNRDNHa3ptZGVIaG53VnYxMjVPU0R4M1VmVTVRTFlVemd0VlFybDFaS2ptdHNuVmp2WXdkV2t1bHFJZFlUWWRVZThiZ0h3VU04RDIyVG0rbkx5M0NvUU0yWkYrYjU5YTN5SFc1Wmxab0p3SVhyWHJhSG02R0FFMENnQWlDTlRKVmpMUiswODlocXkzQ3NEeFlrK0dLZ3NJNU4yeThzTEF0YW5lemdSQ3FhaXhKTjkzZDJZYm1OMFFtRENhUGlsb1hxRGJjYmhzTXczNVJHcHNRTjZJd3VjRHIvTFpOMm4yNjJya21tWFlqMTQzUFZwaUFsUisrandNUkdlTHIxdEl4T0ViY3JHLzNvUlFsREhwcEpoN1VrNXFXVE1CeERnak9nUVUwWTBPVDhnbk5ianhOdTkyUGZNZEVPa2VNUitodEVrN05ORUttL21tYy9tZ0dSRXRwWlQ1bEtQU0JDbkIxK0pDTks5dko4cmpKTkxsTm5ibXcvMGVMbHE1SW1hT21LQlI0SnMvUk1RME9malRqenoxMncvT25ZajJGVklsWW9seFJyaDUzL2o0SGdBQ0hjL1ZCT2tUem5rcU9uY3A5bGU5NzFPRzJlci9renBLWml5N2lidkpncmh4VVNsRWpGTmg0ak51YTF3RnZrdlZHQU9Ja29aN2ZNYzlkRVdpenR1TkQybVhudFVnUW9JSU1GcmZ3eGQ2RDFWS05aMDltNTRBR0RpWklXYWdGN1dJSkNSM0QzaHB2MEJKek9xL3Q4a1RvZjNJeHhJdWtZajVQMkxyWG9NTTJRb2xrL1NJeGpjSW1EZGZncUdkMEIrcjI5U2NPOGpxVUR3VGlyVUJKamVPWUtUMzRyTkF4K1FDaGYvQVZ4cXNSakk0cUFtYkJpWWQ5OWJpVlNwNmJQSE9EQlFSeUtjM2pCNkRvY015TUN3ZjFndmh1SlZ3bXhzcEc2VWxDNzVTQU5Tak1qWGZLS2huNGdvRzRIQnNrbG80RXJJMGJPdnBIOFFyMFh6d3lmWHhORzBPdENxTGNxZUplQndlZ2laTU9mL1Q2eGZzU0VpRUlld3RYTFkycmlkUnJVOU5UUWNoaEsxdzRKZ2JkZTVSQnp2WWw3aFhQVFowR3JKRmFtMmFVaUVjZFJMc0VpSkRIU05YMWc1STNEUjljYzB2K3BibHBVbjgwekg1S0h4OGxvRENyMEk1UnYwL3BoQzhQOHRhUVpQTk50d1I3ai9MTVh0YXd2VU0xQ1VQbnBacDM0WldJeFJGZnFzV1J4TkRjTGZxRGZ1YklZNXZSWmRjV3kvYUJ6Rndla2hJTVJ1RUQ4L1hFWjB2ZzNaNVJScXRpNzF4b3E3VU5NS1g4MHl4OG94dGs1M1VjdXJJcElWbTNaRzQrb2hSeWQ3WGpSZU0xMFpzTHRFd2ZjYkZ2NGZmOVpmSUs0cnBFMHZMdFN0VE9GNHF6YWVjcG9QNmJMK0ZPR2JrSm9GMnJsWDFwNWwzL0pSV1o0SEdmTzV2VE9RTkNvZUt6ci9MdlluNnlHWUI0endObS82U2tUM2VBVDhEdXNYL1RlZmF5bEpNcFdMR0kxMlJFZWw0dkhtOTgzYlVudFFaMGZDdGp6YTZ3QVN4ZEFhdHJFVXUrSldKdk1pTkNZNXZPUWZLMUorb1lGV0RTMXNlVEw2ckhva2p4RWpqcit4Zi9QQy8wL0E0OTN2TEJxWTFlbmVvaVZrUFNjaHNRN1pCN3h4Y01LQURGZjFBWlFpaTkxaXJnWmdseDgwazdkOCtQbjM5cWFhUGxCM3JZZWtiNGNUOVFicnNJc2pVeGxydkFkNDMwYWRkc245b01RZHlCdUhJSENCZkxwbld3STdBTDFwcWVSbFVPV05xbk5CakpnUTFYbVlGdEhVUU8yc2JqK2RWWUcwSTZOelZFdlR1cDJqRVlZTG9nQkhlS3ZWeVhJWjM4ZnB5REVmVEVuVmw5VzhFMzRBUXBHOWlzVDFSR05IYzZVVDBWd29Nb2tlakp6dkJLNGpIK0ZjQmdCU3JsZkpKekdjTU9MQkJZaDJSWkdHMEduRWNwTXVHTERualorMEhUbXhORG9WQW5hN0pWWDdzMjZDUUw2RTk4MFAyS2hNSGhDOXkxOTdQY21KVUJlUFhncWFRdDZMVVlpVDRkOE5jc2dkT2tuZDhHcC9JWDFidEc2L2xIVldNTCtwaEJNTnFWNjdIVUZUUUZZTUFrbHluUVROajgzeHU5NkI1VHh3cVNXOE1jS1BRb3lrWjRKVVZIdXNWRTJlcDFNa3hCVWFlM0h5YkNXb2RlaWtDZXpIa1A2VUYvcDF1NHd1WklOT0JValEyWkUvOGhTS3BVRllRZFlLYmE1MEVvaVcrWFpxSVhvWXFmd3JNS0RuWDhtWTV6eWlWV3dOa2lIb215U2NGU3ovSUNUV0cya2ZTbWdXSk4vb0hjdFhiMkdwQUdLdVM1Y0R1ME9zVzFSRlZKbHZVZ1lEZkhESzNCVDFwcXJNWFhjNjkwUEFHVXB1U2JyWWdlcm5DcndBUlVTMnFQYW9vTWtpL1dIaTVWVHdPaW5QQ3MvSk5pYlZjVDNyTDhOSjBSV25mbjJiTkROWE91S0pkSDhicGFUT09WcDlVbGdTY2I1TWN0Ly9BZ3dVdUlWWWVCKzBzSVh5N3htTktSNUpEcllsVHJoZ051T0JZOWk0OTZ6Wi80VkY5TDZRSVcrM0tjOXdWVi8raUtiSFcrNzBqdkR3VE54cmUxazJtb3dEdU5vc0ttUUpBSFlDZC9aUHhCYnhhOXZrOFdueFpPUCtCa2F0SXl4bTFFdUVwVW5UbnExRWlqUW02aHdVckhGSjZoZi9GOXRITDY3bWdwWVd0dXNyZTc0Q2hSaUUwdjBLWWZTcFI5UlgwSDA4dUtvZzI3VXdBSFEwYitCNFNYaUQ5ZDNveVp3Z3RTNlhKUHNScUhVNTRQY2xMbnJSRU9BUEJpbDVEZVZNU1Z2bUllWEdPUWRqVUxnUzJzWFJmSW9YNThFc0g1cUk3OElqVWNib2FyTVRnUEkxYWZ3dzdvTUh4MHFMWmZseXZzYU5STFVhb3cwY2NtKzlWaDJvMVJmS0RxUzlXdG1VS1hLSjNMMTcveXNzSmd6UCt5NEQ4OW9ZK2psbmJQS2hJb3Vlakoxb1NlS2hvYWJCWHlBSWVmWmQ5ZzFFTGpjcUdlNEN6WjBKSTJaYktSTTJDdG5RQ0Z4RmorY3pUVEw4UHBjeWtGQTFKZ0l3NnB3QVRzbi9lVUJ0K3FHWjJWeXJBZHhRems2SFlDVFEwODVPQkcvbmhmZzlUcU90U2NQRmVkUEJTV3MvNE05bVBkcmVFcjdFZ2M2SCswamNQUEQ0SXJTRE03djhYZTc3RVZWWncyaHJnMm5FUWJtaW9nbGFtUGdPTllpMFltU2UvbmR0T0RMQ01nZjF3TTZuNVNzUkQzZmhORVhYYTRaNllkMC90VmFtYTNvWk9PWWZkcDZRT012K2MxYVlsRzNtT0I0dkY2Uzh2RXE0UEFoNUtWWm44MmlzWXBEZkVnZzBkMG1iQllIa3FXbmhha3FVL0ZNN2tWaVhMdUJ4UjI4a0hwY1EwQWVUVlMwUk0rQ2lleHlnd0lPczErVUJrQWw4dDd0Y3dXb1FVK0trWTJtVkxBRDNrM0xLNXliMHc3bDFmRjZ0alM1Sm9XQlJQMlY0c293b01ZdzQ5QXdsTXNpY3FBZVZtUis3Wmc2NDZ0V0lhNmFwS3NXUDRSeFZnWklRMHpJRUgrYlZlZU9nTzEzSk1KUTVqT2lNMjRReU1aTzNlc2lVZmp1eTF4WXBzbFVpVnZ0cXp1MEVwMXFrMHdpNDZJOUxqTkFxbDgyTlMzMGUrTGhNYzl4SjdzdnBFVzY5MmFHUVRWUyt2Tm5sMHczSG85ckpzbVFPOEUzeGt2c0NIQnE0Mzh1cUo4Q1lWZnJEQm1zRStMbkZzd0NMQkhJTWswWXpGbG9wMW5tNC9SeS91OEJMaTlvd2tVT1BXS3dMUXNLZkpUODBRNEtQYnFvVnhBekpnd21rc1FxVnJiRzVnVmJIQlVlVjdNSDVUdHdsZmtYUlYrZWtmczJuSzhpeS9ISktGaTI4Y2xPZktjYUZLU1ZEQTBnbXl1Sk9zS1VQcHZDUnF2TUREZmRzeUF6dlIrVjIrd21VYlpEWkdpb2x6UlFZVnZNYkt2dnp4OVdTSTRjLzBObEFSdnFOZ0NNQnV2OXJlRDB5amx3RzAwMENwcmpXbXM5bXNtLzhHL2t5Y2NoSkE1enVsdTRjOU5VcXBtU09aOGtVMWJ4Z2pMRzl3OUtBYitRLzJZbkwzdWF0bTNNR1VWNWdnVWNRblVpQ3lGeUtkTjZleHhhdzltU1phTFdnam03ajQvZ0RZUU11UHNpL0VWQWc3M2tTcGxqSEFuL0FBS3hIcWVmb2pHN3orYTRzanlmRVo5a3A1cWdXQmtiek1BRmFXR29ZV3EwL0xqNjRNYU5rYWw1T0MrMXRmbHgvTzJHMFJvaEdqQnJ5NVVYUFdmTEhJc3ZuRXY2MStnWm5JbHN3dURSK2tpaTB2dkZuQS93UEJxbjJ6S0ZPazVmN1dNbjN5VnJROHFlY0huRUIvWUE1bFdZWnpNc3dsUzJzU2M4Z2d2ekNYc3NQOGtHcWozSzhCdmFCNWx1amJNN2hTeVhDbW85WmpHRnczWjJZZGNycGNEUTJVQURMamU0MDI4M0pRQUM1d2o3eXR2Y2QxK2RhcUxncUJhSm01bkpoM280d2lqL1p6cDBnYldjWjZiT1R0RHVyVkJKSmRubjBTQ2tQOW81YVc2ZzNlTlVzNzVzdFJ0aDBwOSttMnhZNE1Kc00wV3BJbmpaZXNzVGFVdU81c1dQaTdpRTVvc3Jzcmt2NHZqdjMvdW9ndVA0VFhsQTZrbE8ybzB2NVQ4MDVCQVVkYjdPVklNaDRrNUVXWklKMFNaTjk0NVJHVU5UeWFaS1FBY21EcDRUK0hNd1RaeXBlN0ZTUmkzTVIwNTJ0azVWRlFuVnUwdXJYalVuTC9kTEJZaHZkMkt5RW12Y0Z6ZUIrWW1SYlJ4ejIwZjNwOTFBUmw0eUJBQjBkZ0hHcjBZRDFNQy9PbWFqWnp5WjEzU01JNFRuK1YxMzZjbWJac25MTXpHNlgwVk1KSjVMdkNxaHNWVkl2eDR0R0pIeklONG5xdk8wUVRGd25xR1FNQnY5UWVqeVFHMy91TUZiOUl4ZVp5Y0Zab0J2SCtHZTFsejRnV1ZSVDNXalRVY2ppOCtYZ3VFY0h2ckx1VFc1YzlPODlEUkxlSitJaElMQmt2dE5TclE3bnpHWVdVWXdMTTNnZlhqSkdRUVRWb2VIc3F3bUJTUEtjaSt5RE9Kc1Q5aEtQMUhWZkFTcHhmVnR4dUlqbFNxZDdFK2x1R2thc3RxeE0zcHRqWmZ6aC9wSCsyRWlQOHlHS0lnbzA3K1RReEgzdHRtTUFWYUV4N0FVT1UwQXp1M2tpS1UveXh2b0Z4NXFUU3lNOWF5OFRscS9FdE5idU1lQ3M4aDFRb05rZW50RXF3YmM5dk42Tld6dUxyeEZENHYzZmluWDFtNTl6bzJOaTZ1cHBnOEpwcjY2UmMvNDlVUlJQUmpNaWZWVXlpaVo2Wkw3RElacVdYYk5pK2RoV20yVTlkY2cwcndRSnZqb3duL1hOaFE0dkNJZGt3aHVOSWpJUUVmVmlwSkNnU3dMc1N0d0RKdUJvTllvUE1ERFozSnIrc3Q1RC9PRmRTYXZnc0pKUlE0QURDdkx6V1FXMkVwOXVGMHBZamh2ckxHcWFYdHh2OTZZQllSWEZqc01ocWFXWk1VZEJUU1p2Y1dYdDQ0UjlFdnZjYThDQ21yME1STUxrbVpwazJRYWRuTjVlSTNOKzRRNE9HODAxSWZJbXFiNzFjZzFYcEtFdXR5Y1prVWJLU1ZNNk96RTBpK3BRTDBtajhGcUdIMHV6RW1oaU9FYXh4TWJlR1poRXdxYVlxdytYeVQvWWg1dThXblFWV3Z0TDRrNDdnb1ZLUTZIUVBvNGM0aWx5ejU0MHBRZCtYb3FwN0NFTHdQTVc3Ny9MUHUxaEYzYWYxaFN2MllIOVZBRDEvdnlISWUvT24yZnMwdDk5R1JUdklka3NxNFF1NzV4LzJsbDY2L2lZaGFNNEFkaE9DdC9QNGIwUHREbDF3dHY4ZzgvVVBsT3dQRm00U0pJc1NOUzVtWUI4RzM1VzZrZ0wrcFM5WGFNVUNVY1VFN1RwU0dwWGZMcnNhQ2xkRy9mUDlYakVCRE51M3dFQnZvQnllVDdhemhzUCtvcW14V2dGWWtIWWtLbUZNNG45TmR5UFV1WDN3VkFtcGcwSmFaczZVeDhxYjg5SjZrRDVzS0tKT245dFExRXBHakpIMVRKTlpTb0dQelhKZExuRUZTR2NTRG5WTnB1eThmUTJnUVFseFBjc2NiajhWbDU1emtIWlllUHdWTjA1WnQ5SkFVcWtYdXZySHN6d01kWjFib002U1MrZGsxd2tvUG1xbTNvUk50WXZTV29STmNhQzBCSzZidENqYmtZSkYvd1UydFZadGQ4NnU2SGRGZ1lrSzAwNHZBMUlkRW0zMTlHMjVkb1Erayt6RFo4WWZNbStyam1IREs2MUh6VFNneDNTNkdrakxZL1lhU1JQbDNjMVVEUjM4Vm9KMUJOd3NJZWEyRGJ1WjRWd1YzNjQvc3d2L0N6dXVFQ3pMMExucnVzOWxmcGZ4VlJ3VDJoQmwwRUdWZVNJREp1YlZEYkIrUHBjY2xqYlFSOHFYemFmdGVlZG5SbUhJSDZqcnpWSVNDdEkzNFJUOEllbUxWRFVFV2prZXBRQmNzVVNRN3lnVHBNS1dzbWNkbVBydjNvak9MZWY2Uit0SHFwVFNvU3VqRFRIZ3EyQ3BZY04wS1ZFUDdIdGFOMjI3Y1hJNHNWUFZRM2JhLzg1YmtRT2Nucm1HQjdMM3VxVjRZeDVyZDdOTUtEcm93TWdMTDZSU1VOYTFiSmsxU2kvMnBRc0dNOXVrMkNTbWZla0xIVGFBWTNJaFUrV2RQUm9QYTlqNS85eUxXdEpBQy9SMVNzUzN5K0EvZXh6UUJCaWhIMUc2Zkwza092TnA0UWJuRzZROFdiL0NHK2NSNTFnREthNVVXbnZTbjc4OUVCVERFQlBMa01BOEd4MVY2UWpjZklESmRSZnlUR3dIMXQ0NXFBRTRJZ085MER0bTdxK3BGUDNvazhiR003MkNtS0ttcVF5emhFdXV5YnZ5NDFiVVUvS3VkYjB3c0RBbm0zQXZlNFJDVUpiK3o0cTJFaVErSzMxdGdMT01SQWpsaEJURzAvYlF4eEJ0M2t1ZnQwSUFabnpTZEZzVU9NcXRmRkROSXZrVDc3ZGlVWnNKallYQlR6MWh2czNxeitCbDFwZUdOckR0SHZsL0grNStHaEdJMUd0OGJlNDhOWkFhSit3b1JXcE9FQllBVmtJK25YRExVUGpTVUkvc2s2VVM4TklmcS9iTlN2SmIxSGRYSHFvSmtDUXptcGc0MHF4dG9ET3RIelVoZG40QzVsVDQrMEZIZ3NUNGlNVUhSOFZFZENwRVNtSHlhSHdCR1pNUjRQYkVYTXVac24yTkEycFZHLzRHYmZMdzg4ZE0wQlhNQm11U0NjM3JpOUdJL3p0MEpqbkRVSDJscDlGSnFzNWVmblBqdk80WEJvRkRiMi9IT0J2R0QwWS93U0VXcno2L2xwbzZzczNRQkc1ckJWYWJnNXdMVzh5WktaYXlwZUxaK3VuR1VZVU9YRDFQWWpENXdVMk55dVM3bFRqd092b0NUOHBFOGZuVFc4VW8wUE5mRFBvU3kwQVJpWmpPVi8zN1BDNitrWG4wbzFtM1RtWUZPV2ZXYzROWUQzc3lvMVlrazU4SSt5S002TFVVRHIycmJwRE9NWElZK1NQR0JMMGVxbWIraVNqYTNwQWhXMG1icll1ZlN5Y0NWdnM1V0VqQlNRQTEvTEY3ampTUmFmQ0tiTkVpOHNyWFgzQ1VSS0lxeUhtSWptb3Mwdk8rY0licUNvTFFjKzlYMUZsZHpXQ0lJVGFZSEtaQ3hBdEV2b01OdWQrZmJzR0kramgySDY5MFNneVlkcWdJQU5HT2dxRXB0Z3V6cDNxUWJrK3paWnRTTjlVU2x1V0hUNzg3QUZEU0dXNzRyZ2NHWGlQcWI4bWdQVjlKaUttVndwKzJaWnhBZm5EbFhPNUpFRDVkYUs2WmxBVnNpVXZzaE05eDdCZ3RzZ1JGUlFVN1hrc2Nadlk3dDFvQ0RJK1NHNEpPUnpRdzZxWWhFMkI0ZXoyT1FaQ1lBMGdGczZLOEU2M1QzQWdveDN4V2k1cmJ0NlBRd2tpZEUzY0s5cjV5YmpHSnVxM01Tb2hOZWVqMlVtNWJHRmkvUW9wSDRKV21Vemk4OEFkUkl4aURLMmp5RisyNlJGZWhLNXZSNEZWbUhrbHhzR3ZURmR0WEFNU085b0tpbzBSYWVWYytaa1pmRmdDelN6dDBxNTNVQ0hPRjljWlVNdTQrckhZc1l1NEZTUDdrbitqYmF5ZzhzS3RMQnloa28wa3Y2cHhJZ2pEN1V0Z3NFT0sxVy9HV1lwbVRKeHRpa3JJbGtLUTRTSjlzbWhxMjZESXNLZjRzWkd4L2ZGMEhReUZ4TG1nb0M2Q2NycGpwZTNPMldZbk83WkZCdll1T3hRUTdkNTYrNkxCc0FtYnZWck1CamxQaWFSMERsclU5MUw2UnYwZUNqUGNtMEp2ZTl0dFVuMUdoTU14Q2VwRXJyZjN6d0gvWWRVV25HRUtCN0l1Um0yZklHVExJRG1KNjcxc2NPbkd3V2RnL3dpUlFIYkdYWkluMk96RmI5TG8rbmxHRFZaYXg4MTM4bW5MaXRHY1l3TnlWR2JzTm50b21FVFI2a1lOWHZ5cEFBaHdjU2FUNkZEWVBCTlcrMXZGRDlLbXloMktGV3A3YVJYcTV3VmhmUEdKZkZNRFo3S2hPOWNtQndwZ2w3SnpHb3Rkb0hwQnY3Z3NESUk0UjE2d3lSQzhURFk0ZTFjN1lMRi9FcWZGZk40RG1aRjAvM0hQcUQ2SnNLY3BDVmEwTUNWSHZ3eGRhUDBKaGdZYVI1RGxDQm5lenFlc0tYVzFHd3VycVQ3a2hmcHJ3NUQxMldqbW9FRklmM255d2o4Nm8yNUw2R1ZlQnQ0QUVBVk15d1k2ajNZME81NG5ISk01RmJoY3NBVXBKUkdUVThKRGIvaU1yVDFWKzg4S2s4NXg1amlTMU5qOUdpaVIzTTdBMzNuNG5VRkl2akpCMURYY3ozZHNwbTNsdXVVWjlsNVNiNGxhT2w2RXpUUElubHBiUWtZVm9UcnJUY1lyVmtpOGRVamV0R2ttYUludVRtRmR4eVQwaFZrNWY5bzRvWS84eGVlNlBEakQvUWhqeGNQQlUrY0ppMWNoZmtCaGNqYkRkQjJmd3AvUVdjVk4wNy9tdFZGWEhyK0tzUVNyVmM0ZFhOOXpSMitOZkZjK2xnTEluTW00VkdyejFvZUlmTFpXZ1VnSVI4TkF6YTVYWlBWNDQvTjNCd2dlSTNtMFBRVURicWxtSFl6ZTA5SVlURG5UVTZmQzVtd0hzRyszNi9SKzdnRkQ0dEo2ZjF0YmF3T1NSUWJQbFl3amVCSnYxVHdvOFdrT0tHODRnRjFrRTloeThraDd0NFNaYlViWkZmTG5jNjYwdGd1NTQyczNseGJaOUt6eUFsc1dPMzhrOVQzNHFrRDlXcEFxYU5KYWRibU96czNJYUFKYUJQYk16a05Gb0RibjQ2NmdUMVllZEdMcStXTy9BVU9UeTlDTmhOaUUrbUp4MkljT29FQmdjTWlkRkh3UjZvY0NGdDdvazlxRXZmSTBSRTdWbjVxRFhxbnFocUkvcXhWOG1KVUtBTVBvM0VEbTB1QnJYaXFsMFF6MWNpbjNJdzU4UVlrVlc2ZEsyUjgyK3J0U3UvT3NZRnNRM2w3ZkpQQVpBWm5yUjRUbGNrNzFzVWo1VXZEMGtJNDNRNFc1bVJURDJna2kyL3FuaElDQWdJRG0rclFBNUxGVVhzNXY2R0lNeTROYzAyZ0lEVlA4TEJKVE03M1lDMk8zUnNETzIxbFg4bzUrZ0tYUlMxU1J6SG1SREVMaG0ra3cvZkw4K3BpVW8yUEhQN2RaU3RQbldSbTBxSG1BSEZSRDZpWlNCRFBIeXQ3K0lZcVBoKzlyWkF0aUhlOVlidEhEdURNcHB1YWMxUkxBa25vYzEwTE1ZVzdlMG9NT045YlVXOVJtQ3NwU1dZckIvSDFBTUFQMExOK2h5ZDB4NDA5andlVlNFNDVMT0U4ZUJ4NnV6eXM5SVVTeDdkRVlLZE5kZWZqbEdicVdidjI5UkxmbnJNUHFyM1NmaURIQXJkTTVScHVnK04raVVpeVQ3VGpoUFV1Y1hsRmFRRE5kcHFCdkNRcXJsNHg2WGhwNzlrVkpYeXNBSGdxdGljNjhhYXFneEl4M3BDWkpVV1NVOGJCQUwyVFlEZ1IvM3BIYllIQXRTaHZGSEtWYXc1U3RTaDdMblhjTWVZZkIyYkVoSHJOckFYWEdxbzk1UGdDdER5UzdaWlo0TVNpeWlPVHdrOHFJTXUzQ1dtMGNpRmxLSisvSXlYZHJ3Q0MzTjBDeUZTVTlBdXBpaUZ6QzdIWUI4dTBUbC9pVFoyZ1pKc0JZNEtrZitiRkhHTVdSWCs5Mzg2UUF6WWdqNmhLVXkrM1FnUFlDZFlHd1QycEE4c0t4cHJyTFJWMmxrQmhZcEgvbUw3bWt4L1dvYStMcHF4enMrbDE5SCs3M0VVeGVwY0pXTUJMRFVlVHFnUzhjTkIrS1hxNzViMDZvb05ldTE0THp4d29hWVhxQzlrTWZVMTBLL01YZWJIeFczUVo3UTFtSnhuazBsamlRUWhGOG92dnZJRGpLU3lGUWVCUHRBNUQrN2pGZUpCTVI4NnM1SkQ5c2swY1RUczZPcjI4Sm5DSXhjNUU4RHQ1d0J6RkprUzBCQWY5RXNxZ3JyMmFPeFhWa01KaW5JVEQ3bjRibFRreWRwdHdFSDZvTTJYcWRjNHMweFB3RVc2eWlaTitSMkZFZ0tQaC9oOE84OS9pSkVxYUZXWFM1ay81ZlIxcUM1b2drSGYxTDQyOVVTS1RsbzFIRDl6bkZ0OXBVSHVsbWw3eE9WLzZFaG5ReU5iWkZLU2JGSXdiOUdTU29IODJYbExXUVlTMG9WNXpuRkN2ZmZteklPQVdhdXdocms5NHIxMDR0UXdxeGx3QzFvMGpLZjJ1NWR6TWpsU3ZYd0FZUEdTNHJSTXJMWms5elVNeWhNcEkvMlJTZW51SlZrWk9XekoySTNralFTTVhqbmdVRE5sRk9xbHBzOTRaT3krTWs3OEFUTWplUjdzeUJqelBuNzFUOHAzMnlrUG5rT0JjeTYrTDBrc2xPOE9VaW5jajI5ckJhRmplVmszVlBGL3I4T3ljc2ZlSXo0YjVEMFFWZnE4Ky94b0ljd2ZFY3pnSEhKcmRVNXUyRndCbE9WRG9JOUxTa3VoWmFyKzhvQ3lpUnp1eFpJZGlETzJTSlV2c2MrS0pkQTZTUnpZaDFxRUFuOTVoYml5NjVQOU5qSndVR21XQlA0aExaUGM4WGZkT0hmK29MQ0VMdWdRNXl0ZEVFZTh3UjZjU2JXT3FuUUVTUTFaeFhYcW56T0pnSzZMU1B2SGxaVVk1Q0dVc3E0dWgvS08rVUJkcFZ6Q01rRUowVGFxRHhDRXp4Y2xiTU5sK0I3WU5kUVlKbjVIZTUzbkZOVUd1dXkyTUNueENSaSsvL0pHdkRVRld4T25hN3I5c1IzYk5HaU9Tei94RE4zSnF3NnEzdlprZ1MwNEY0SVJ5dDFzV3F5eXpWcURmQjYxQlNxaWUwSGVmK0RQMnRhY1ZvOE4vRkRYcHhLR0VKcFNMS2pvU0I4SnVVNWJ2VDYzc3NqY1JSZTF0ZzU1dUtCbGNTUjUrMXEvOXo2NmF4TnlUcTdjeSt0TTFORFBtYWhqRDI5TVJseE83bVN1cERvc1dKQUI2S1I5TFoxNC9CbkUwK250MmMwcTFBMjZPZG0rVU1RblduejM2Q2hwTnJOMmd0UWROeExLMkR2dGJkYmh4aHpsTkkxdGhraldKZ1lIWkhVdjhZL052cTlIY09jQzZpaXV5UXM3SVNVekU4bk5qT3RpdmZXNnE3TTJmK1lXSXAzUFRjbk9RajB6OVVuM0ZGcWhwK0gyRDI1eURYbnR0QXVmMmgxRDVZZ2lRaWw0MDM3a01MYWZGeEk4M1k5RmNoeGlaWjlMTTBhaTc5bjhwZ1EzbGtkYUVuR0xrb2d1N3kyUkVzWCtRck1lUW1nVUl4K2c0YnZONHZjTzAvRUxvZ1dPTThpUU4wWWl4bWJrYk5kTzVjL3k1VGdkVG9YcVdMbm9PRWtxV2R6ZG5penJPOE9FY1Uwa1R0bW5sVDQrY1pNeFNPanI2S2pTNXd0WkdVUGhOZEY0eTRmQzJRWDBLQis4YVZSWG1aZ2VvYmRnU3hjeE5pQXJTWmM0eHB1OGIwRzh2Tm9iSWc3UUlIdjRZa3ZqbVo5ZWk3L3dZcFpvTko1TzJBWFlCVHBKcHlmUElRTUpaanVaQXp3OWp5STBUdWpoTWptV0N6VEJIRGh4NGtmV3daLzFmcVlRbEkrak9NT0lCUUdCYjhITmk4czRQL2JuUzdVTjFld0lycmplN2dtMm12amhHMWxLaUIwbExwZDA4SGlqZWorRG9XZFpZbitWcjZrcU5CbmVEMGZNQUZ5RmRJWndZUE1XUkdXcEFQRnE5RCtFVWgxdloydGM4UzVJazI2ZC9Sems0UlRPa3N3N2pNU2ZDNHJiNHVYa1lwTG94SzVIMllXd3hTL1hsWHowblRGaWFXa2NQcy9kWGF0SzByWGRhNjA4ZWVvVzZrZEE5ZUVyWjR5R25NSFpvbVBVNk1hYmIwVlhCaXl0bGZHT2oxK25NZm5QcXBuRmp0TjdDcnpKMnhNYkFiN0Y5S0VCTHkwaUZ4Y2hiZEZ1QUhaelcrZDJ6bGZ6S0FIL0U2UWF3bFR3ZkpKMFVoRDZuRm5ZejJ5aEtTVTdPL0FCakhZaTNwMGtvZTdGTitFeWN5cVB1aUljSTZOd3N1QlBmaXNRQzRBd3lFWEE0eGNGM3RGdUQ0RzNZZ0R1NzRmWmtqR0FOUzdrRkxGQ0E4dnVPL0FKZ3hjR0pLV3F3NUUwZ0psVDhmQWg2MkhoNzNMRDBkWXVEcVZkdTZsQTA4N082UE9MMzZTcHlDYWVaS0lKWGpvZFF0a2F3b1U0VkxrWGVrU2hKWTV0OE5naWdlSnVWVzNrVUNyMmRoamNreHE5Z0lFR3Bja05pYzhVbEFPWmJoaFhkS0ZjeGo5emxxTVNaK1RHenRnNHJQV3YyUkNjbG9iQkN4R0hGTzRWRzhudTd2eHIyYmwveXRpY3BpREYwTm5MSFJndFRZSkc0Vk00ZStVVlRRbjB2WHBMQ2JSTnlvVWJSU1BRQWZEWUJSWDk4RHp4enZJd0cvR1pXZGNuS2crRmwwV0w0QW4wWjRWNzlFV2ljd2JSQ1pBanVKUkZ4L2ExQnEvUkFFQjhsYzhHNDlnN2NuMFFNRW9ybGwyTFRzY0NaOFRSU3R0WUtST2NJQWdkbUJqTCtXUWJXRWZTVndVbFIyaVZFN2d3TDFiM0ZsbkdpRUtqTWcyTG1rR1Z4UzlzUGNabG1LeC9nNG4rSGhWSDFvRXVxR3JrRmRSSksrcnMySGdvYXJEbWJBR0ZMYVRTaHVrUWc4Z2FPY0F2ZlRBdm5yZ0k5R3RRdVdleTBySUNwdkpBYmVSRjZlMDk0MkdFVVF0MEFoQm9YQlh6cHd3emFJME5IT1IwaU1neGFUaUU2ZUt4ZGQrNXJVU2x0S3FHRTVZckMwTnlHMG9FNHpBT2xtdDY2cE93OHNPMEFsWC9ScU1lTjdzV2ZMTllQZU5FeFM0QVRUNXZjRExiQ2xpL212YlVLTVVDSVY4OVdpcmlUNTUycStBRmJSNUExcVVyczJRYW5zMTlpZ0RsOVNpeERJemF6SjIrV05pdGFNcCsvQTVxR3U0dFdabE9WMEZvZm9OanE4dFlmRnFuM2d5R2dwbGZlRy9GZTArWTlTajBPNjlJVWF2UG9ESkhJc0dEYmpEc2hSY0JRRVB3SkdBTnZSVlh6bFVXSnJqLzNYRnhXcDZQWGxlNjhqVGVPV3hDME5RRmhhTkVqWGhRZlJLVXd3WXVGcHlUYzFzWCtMMnlMOWVmNzFzblNNNjZ2WWNzMUVRTTRYVlNDSlNwSWRQbGJkeG93VjBNeC90emw0NjVFcnpvK21XWU9sUE5kWW1NS2h6VjNJTEhmbWovVGZiMVVDS1ltamxaY2l5OWxZbWVmeWl2alhTdHNPTWh0SDJCVXR5VEh1TDh2SS9XV0QvV2VYMlV3UDJHSjlqTUQ2MHY5V2xFK3NxL3R1RS80YWVmZnFmUDRXdUhoZ2pzSmZxd2pKck0rdEdoYUIvenU3ZEFoRHRoZW5vUWl2MzVJdXVZcXRmUFMybVJBdmthSkJnbmZma2dpZ3d2bG10MTJGWXMzTHpIczBFNkdMcFEzSHVrQWFQMnN5WU5NOVJ0cjhVaTB3UEFTaFE0L1dQZFNweHRiREZJT212Wkc1NlVYMnpvNmhWd0puR1VOMFBIanVIS1RoeS85dDhqRWxoRzV1T2NtWFJNOWRnSG9CRTJKTmo3QmNrOXk2Y2dLUEtPYi9Vdm9MUFhiMkRWczdSL3YxekxoWWJDNGJKWmM1WGZQbzFsQVNrUDV5ZEhXQzRrc3BZckM1c3BhRVFGeXNnSXBnVzU3K2Q1MWoxWGNUYlNybE9XSm5LYVBVUHJhNm9aV3ZkalJPREpjbTh1OTNXQytuOFF1RnptMDhmby9vcWF3WithTlRvZDMzWDlzdHQrYjRYKzk2dFhEaGdySWpobzNGR21udEFNVzVXVTIyck5lYko2SG03OHFkQm40MkhJbDFEQnVZdTllM1JOTkpWaGUwdmFFNGFTSVVFc05WV2ZwMTl0cE4wek5ybFJxaEY2R3pBOVpFUTBrQXMvaU03TEdkaUxIc3hjVElTM2IvSVRKYWp0eVR5VUJYcXVqRVprUjB1UWVsYWpscXhDd1NXaXJDeC9ueWpBK0lNNHZoZXQrUSt0S1hZdTVCSE12WWxLZ2hqRncvRFJJOXluWndqNWk2WTQ2Z1QyNklabVNHcVhleEgxMXlTNkx6QlJDNDJBaVRkUEN6WElnYUhYTDRjVkhEZzl3TlRpd1ZZLzFKQUlGaDdiTmtrdkkvUDlTQUlKNkpKWHBZS1daaTdXQlJzVmt6R0l6NEZQTVA4M1ZRYVQybXVnSjhjc2drM0s1NlUvVE00NmF0U2xvVk03YkE1dW1QTURzTEIySzZBaDF6Qy9RaDlsQUt2b1dBQk4xOEtKTTBWUTY3MjR0eUlNeEFnUGNQREthdHZ4Z1RRSEZpQkpnajk2M1h2MUlGc3lsQzlMT1UrMFNBeERQOUNsLzA0WkRHeW9UWXNQSHREZWpKNWVQaVd4QS9EQkd5VEJad05qQlpXSXFwSTFkRFpJRDdYaXlSZGQ4MU1sLzdkNHpxS2E0SDNxN2orMm9reDUrb201OEtpSTUxM0Fldm5xb201ZWliUFk0dlNVSEN4YnJ0czRDZ2NKNzExS0FkSXRWaVZIUGVEbXE2SU5uaThjYnZaU0RuOG9VSTg2bGx6K2RINDdZeHYvcmZuT2dCUFBtazZLUTUxZ2p3RU9LY1phNUl0VTNWZnJrOGZKYzBMQ2pCV2t5M0hFZ0hLTFlZdk5hWUdxOFJhbVpoRGFRSjVpN2tSS2ZveFIyRHk5S0p4Sm9EMHp5b25Bb2JlMGlVamF6T25LeE9LNzI0M2NqNDFTR3ZHUkV0djIveFF0YTNMcHFFMWNPYkUvNnhlcXh0emJid2x1MGJsK1cwRmJqNmlRUzRnUkNFdFNjVVJwK1YwbVRpelNCaEUrQlZTSTFWY2NLN0lBNjFZME9UbWZoeE9KUEk4Vm9jQXVhNmkvZWtXdE5mb2o1RlNnVlQ3d3g1T1hINWczYnYveEJGamFRQlV3eXI1SmEreW9WelduMmdNNXk5YlBHMW5QWWRVQXo5WHNuMGZLZnNQcXcyaDFQSlMzaEdwbkhoSXBsTks3emNqM1RWVUV2elFCY1FxSFhMQ2dBNDE3empTTVRzVHpzU0JibHpKRU5ISVFiVGwxU1FRelR3NFBsUnQ5MW1RZFVvNjJqdFREZUdFZkNnckVtbEIvSHBEc2ppbkt3aGJsL3lkd3paZ1htaHZmc0UvblN1SEtBcGVYTUtnRDNaSU4raWtuYmtQWmtFcTE5Qk9UMzV2bHRDcjlqK0RDcnFYYTF2a3RCaTFic254MmV6OWh2enZ4eHRvUWQ5OElwTWFJMzVJZlQwQUtYbDZYYkpOVXg5UFhvMGo1MzFDOHFWMjVBa2h6MklEOGdBcnE3YUhZVFkzcTFwd3Z5NWhkREZneS9YTzVwZGhzTnQ5UjNhcEZkOXVqa0t1UHJKQmVxaDMzSEROZW10bzhTdDgvU2Y1VWE5eHdONWRGZFJlMnQ3clNGbnJ2a1RYa1dCVlhNV3A1Qm8zMnhFa0hwRWJYeW1kcW9HVU9GWTNJdE15Qzhydm84SnplMksyQ1A4dXRmTkxaMThVUExMOWgzVXo0TW1PQVIvUENsLzZWemVqclVycnRtb0IvOEtRa1d3Qld1YVRRNWx6Y1FpQ0FwNkYrdENYbk1sdXhocHNBd0hiSXZqcjRDVXltalM5eWNvcHJIZFM5YmpZVmVVTWI2S1V2S3ZQM0hDRXFTSmZrZjh3Z1cydjdQYk9zeVVmUXJNcW53dkFlNENyTVJqY3RLNWxuUmhEK1VXbm4zUlE5V1cySkFhOUxYdWVzOHpITTFVaWJCMkJWM3VRNVMrZ2g2RDdGK3pzVnM3SXVhSDg2UHZTK3lxT0pJZzZOb0VUZGYzY3dFWVlTVWIweXBpTHo0MEpYYjNYQUZVMFNHYnBEQ25xUkRkbjFGVS9ya0k4Q04rOFhsZjJhbklPMW1BOFZTc1FibkJrdjZ0cTRMV0RISXB1dVBxNXJEN0RLYkVrbU1yYkNJa1R6bmEvMWJxN0g1K0tYOEd5dTlERDhneHJHbHBUZUhsSjhoYTJSeDBvY0lXV2tQTlE2UmFVcFVxN2QwM2hrRXJCS0c4R2h3RitmOWpLek80bUIrUG4xUCt2clVkeFp1RENCWGNSMlVIWjcydy9TdExNY2x5SFc2clBVMlp3OWJ3QlM3R0ROOGtvTDRUY2hJVHh5em5FMVRKdGlGWDdSajZJZmEyTFNJY1JBRUVuVkZsL3kyZXlSUGVzcU5OOEZFenRwQW9SSkhhU3F5VTkvRHc3bzM5M3luVGhsYUZQdktEc1YvWmpwOGdOSkNSZlF6bW9VVEFxYi84SHRrS01YVlhLQm83ak0xa2wra28xUlgzYTZiU0kxNnVoNVdOTWdwai9JMzdVam03TTlQdFhCdVNCdGNYa3FhV1FxbUQxS25ab3hwOGQ1Z0F2WDRUMVFHa254TTVFWGRGQU9FMEEzOW41bjVjOUVhTUJyMFRvYWZiNUZCVmx4eVNpTjhxQU95VXAwVUYydWVaTkFLMUZNRmhjRFN2d1dqem9hQnhDeVQ0YU5KVndTM0tWS0xFdEpWN0tRRHU3ODRPby9SaEk5Ly9mQWQ0dGZlUEJ5aTZNajdPYlcxNUkrV0xOK25iWStIRytMdkFvRW4yZmRjRlNJczQvMUg3MUphS1REbGVZMER0STM0d1grcS9OTzJlQ29uMGR1M2pRdDk2NW9HNXpTUVBSN1JZRDZqQUkvQ1ovSnYxWDkxSUlJbDZCOWJpN3Q1RGpzSjZrQ1pWQjA1aisrc1VSc3FrVFJxYWcyWnZFY0JWT2lDMGZVN1BIVys4SEJ3TzlYWFpzVFVpN3JieWErMkZ0cFRuLzM1MWNsZWFVYXI5MWl6RERJRW8vWGkvQlNNbXMvWEJJamRMeHlyV0g5UHJVc0pFc1ZzU0wvTEU2T3R1STQrdXVEMWIvQUtoMWhad2lWTm5xMnk2ZVJYVCt5SEFaVmxpN3dWcjZlSmEweG85Z1NacjhiK0FIOFJJa3Y1WVRTK3hCTzJKN3BWL0VZNUkwK3lnNEsybkdaOVc4enUxT0UvQS9Ea1diWjFHRkg1LzZqa3lwcHNrVzVmaUZyMG1mVnlaMFF4SCs4VXJVYnk4dHNlN3VkT3NoSGdkVHFMbHdyOVA0SGM0MEJCWkdwNmdpYjUyUERYcW1KU2hYa1ZTdDdpMDBEUDMwTnFEUGJkSEdvNDlaUTZmdjVOTVE0YndwTUV6OWFPQWhWaUxTbXdDV0VRUG00TGdUek9BVnQxSzM0dHlwQ054NFBXYjJ2WkNqdXJhNG52N090TVBGdUtFM1E2Mmg4T3VwdzJlTm1sUG9NYTF3ckQ3WUFCL25OUnhjcHZLczVMWHVEYnFSRmtLSmVTdTJMbFc2djh3OVY0a2VVSjMrZkdtRXQ2MGFBT0d6S1kvZm5NL0RsZU0yMmNVRDlpbmI4YUFvUGtZV1NBS0dqUGM2Q0hVQVYyR3E3ZUxYblFIRXp2MW05RktuQWk3eTUyYXFyK09pTFZ5SHI3d01SMjNscUVia0ZTeFkzVkNROEYwb2UzaThlelBDNzNmSnk2a0Y5Zk5OYlZxYmJoWjFuTTRaVmtHMTNCWFlZdVc2emJ5YUNxeU5xaHlHZWozUVlFcitEVkRvNWlUVWZpWXBhTUJQOVowdG9sNHBjNk5OZlAwWkVzbTllRllHWDVNWTFEQWxQRjRWbHpiYzBZN1RzbEx3QmswbUZUd1hSVFBLeTNYeHBMWmc0WklXTXo5dTYrcThmRExXVzMyRFBHNzdzYzJJemMxVzZqaHREdkdTWTh0bkdySWNZSktmVmFQbUxESzVJNEJYNTdpYVJqSmU2cDRQdlNVdzBwTlg1K2d4c0dMMmh3aHJaMWZRYXlDeGlYUS9PdG5FQ1V4TTBxSkQxa2poYVhEYmRTUUhNRTVOZlNpSmNjR2NGOVNBUjg3dHdSRzh0Sm9CQUI2WVFGRFRRVUpnUWZ5cUgycnQwcU4vZUtNQnJ0MDFhNFFJSDBwcjNvRmdlZzgxVndiWlE0NEJPZEhaL3dSVG1zYjFOM2plWGdhQ0dyUlMvSEw0cEpXdmovVzhEQk5FWTU4azdJS0M0SWxld1pPV1BQY3J1RmRYNDNRcERnN21xQ0dYSkZad1ptdnFaaUZ4d01YUFMrSVdtTFl0bGVHSEZWU1laVUIzNEl0TVo5REwrNy9MZGQ0S0ROalNkNTNjM1JDNElxd0xuOEswMXlxdnhab0xqYkNzenowQW1BUWxRbVVIMndnQ2VHUzM0WmpiRG9tUHhzNHNkeUlidFAvTTNXZ2F5L3BWUlNud1NTeWs5bUtvaXFkaGxhNlhPc2hyemMyMVREeTFldVUvMzBPaHlwQkhDUTZyWnZLRVg0cEtWMDkycFV5bkZadldObUNKZjgzWnNZckl4NTVBNlhkWnV6NGNDaFBTd0hlOGNxbVRlWFBWQmVSSTVaTXFHTXVuUktQV2xlbUE5bUQrM3FESHozbm5yVDFSZGFVbmNrVTBBbktnbGowNGIrakJZWUdWNDBLWkorczQvZEsxNytZRDA3N1hBcGpCRnhZMlM0WkRkZm0zOXYwRkJ6NTd3N0NrRVV6eStVRzNqMU9KaE5FL2kya1pqM0ZsQ2U1VU12MkFVSi81c0dKbnoyN3FUakp2d1ZzVU4vMzJnQnB0dUxqeFhTMVVVbFNTajMxYVhCbVQvMjZhMUc2MWRuUm92c1pRUnFlTWlQMVZuZWhKZGlkS3U5c0kyRlBGRktDVElld24yZC9rM3o3OVJ3YURhMDBJVXdyUU5KbmQ2dHZtZk92eENHZ3M4NzYrYWo5QnNlZzNtZ1ZxQ3Vwb3d6cEN0OGJuRmdUTWs0NEpicW8zQVdwams5NlcwcU5sQjMxZCt4YW1oU3B3V041Mk54ZXlySnllVnA4YVlCeG5EVkczZkE5UVNoVjloTW8xRHpwS3JURjQ4VEZtMEN2a2FuYXlISkZ2VThBLzNLalF3cEEzSXloU2hNUStLZVAzN0p2S09Rb2hQcmxhKzBQNi93S3pEUWUwanpEWTBjVVJxQVBlZms0WC9kWXRnb2VtemVrK0xxVEdob1UzRkRkODQydzYySGg1Y3dTMmlOdzV4RUw2UXdVODFwMi8ycTA1RWJJOTliaTd5dHVyYlp1VzJjS0tuUWxqU01tZUMxT0tyR29VdVhTRWQydTZQZHhTTHpWOURjV0dWK0xnd2Z1aFYzTXBySk9mTHFJODhtbGtjZE9MaHowZWdSUW9XYVhvYUZnbFJMWE5JaDdCMDFVYVcveTZ1eDNvN2pEOGpDdG85RFRuZkE4aFdvR3ByTiswYVVqV0F5cG5YVXRJWGRwbUVhanc5MkptQlBYNXliRElxOXBHZ2VBK3VTc0MxQllpQmkwTkZBSnQ4bmF2NTVKMlNVUnJvRytGdHRXYWRuQzJlMWowbzQyQ0pndEYrVnB5SkZ4OGlTRHgwNmM4VFpkSElpYlRLRTBXWXp6ampOSjBNRDRiWmtHbGZKVlN3czhUanp6ZXdmMkNaZXFXT3JxaDNzKzdEWjdCRWl4VlloeDkxWTNGR0dvODJZN09DbU5nYUZ3eU1Wd1Q4WDFtRjZqWTBua0pCWFdaVFN0cEdBMGJJdUZYZnczSmZsSWdKODlJNXFTdHpOTzBPMTV0TUxkZDlXZDlWRW11MFR3WmppNzgxRE95WkN2bG1STmNjcFowN0wxOElnY29lSlNSZ3hZcFlpZDJzNnFhNTBYQSt2K2l1YVVTQ1duZ0syOGlmQU00ekhrOVIrZDRzd2U0QnpCUWs1NkNBaEdRdDRjQjZhVi9mNloxVWtUUm9JTGV3NlhDbFJpY0YxSDJTRnhpaDl2SCs2M0dDcDZySGx5REhDZU40bFY1alNnUC8zblg1cDdXUncrTTk5MzhiWGtyMVNDZ3F1Qitxa2FZQ2wzdHNUdjRQMk93YittcDVSajNpMStmOEhVSVRRVG5MbG9WWHFEZWozRFIrMmw2TU1LNWorWnJ6WkN3SnVTYThxa1NHTlNaWlAwTHJSaEJndkxIdnR3cldVNmZBVDlSRFNuUXh3MXhJVmhTUXVSYlNJb0hHc1RGTTBFekpGZ1FRd0NLU0NPTEtUaHBEam9ZekpHQ1NUTWJsb2tsenk5THhndUxXeGRYTEpjVEJrTWJxSFA4ZzdTeXY4TGxyRzBtbUVjMjUwd1lOUmMrekxNdTIrTUpVREx2dVB6TkF3T1JnN0JDVnlMTnRLTzVXUit6d2RnZVNkU1Bja201VThIelN5eXVDTEluTlhpY1IvK0V6NmtYTGhwemREMVFCK2dBYk9YcGxCc2JKcGVTUExDNjhIeTQ4M00xZkR5Y0c2OXE2QUlHWXlaUUhRandkdE5Zak5aRGZ2RkdaUlRoZnNobFpDaFZ2YTA1Q1hWUWtXVkhjb2lrM1pIMnlhSHJQMkIvREVaUjBXNER1aCticHVqTTZnbEpxbklKVjlNZDZkdGZ2UnpiQWZ1UkF1Y1hiTWVCN0V5UWRYMlVDSkpBbnYwdll1dndnbVpvdE1RK1VORUNlc01adjJDWDNDYWZyTVRveVBiTHhxc01UcFdnc0thWEJhS3N2TmdiemhlUzVpVHBKSXdXNlczTE0vWWpxN25pMXY3cjNMNlgwR1lDWUIvNTZwaUZ5b2ZhRXl4cnd3eTFlREI2MEo2dEhmaWJZQlkvZ0w5azFoZFM2dW5RcndBM0JxTDBJNTJRRCtKRG5QQUh1Mk1hcFVBa2RsS3RJR2JtZlFxQzN4dFMvbS9JamNPVHBjY3g2a3RpeU9lQVJZRzJDRjVKUThlQmtQbVpOdm9BMmtZNmk3bVJYMUVqeVhTWEZqby9xTCtqRDdyem8wY2x6MDljQVNBdUlsNGdPWGxTaGFCbUZoRXNRcTVFcWppaFpxQ09yUitQWXpQRTBWOHVWRmw0TERGYmgrQVVIZmt1bElpRXg5QlZQdUwyTm9ScVhoYWJWNWRQMnBQcThQYUhwUTNzRm5IcS9xWU1hQjF2U1drUGVEbnpwMERhVWxnSXc1OWRiT3FKK1k1L3lNd3UzL1JMNGJpR2k3UHZuK1JNeWd4MytkMXV0VURvRGFKZU1ucW51U0puSVVjNmkxLzZOT1ZOWXAvWFF5eFZWRTZJMlZJbUlnWVJhd1ZMSHJtMmZwSU4zZkg0QUk2QSszKzZ4NmduNkFNTEZlTnNON1V1ZVFHZEJHOE9vemVaNFR2UmdmeFYvMkxJVXU3RzR4OHl6Q1ZVa2dkZ1VPV3poNXZXN1RHeXpBWTE3NzA1VzVtMDBZMWMvZFRMdFBwNW5yVDEyQmo5M0RwM3VuUjBuSmhXaWw3OGpCTWVuMlU4MFA1VCsrOTRxM3ErOVdDZVZYSnc3RXVOZjlDUTcrdzdHMnBJMU9NcWlBSUhwZEJVOVpyQlEzRkM4OWs4OVlMRmxOQkVkSWtMajc3VThOSnh4QWNKR3ZhSXlmVTJRSzJnNk1BTENqQnZuK2poYlM3RmlkRHArbGZiUXdJUENmaVBZU29yZVdnc3dHNEN2R2hTQ0p3NDh0L1JtRFJPU0hsSGE5M0pLMTgwUTkzTCtiZW1KVU51MUpOMkF6RldmNWJENFl0cll4aEJraGE3Rm8wRXRFSkt0N3Fqcm1NbWcrWW52d3FkM0Q0bFdjTzI3eUpkemNXN3Z0eHJVeEJxaFh6cklIdVo1YlhqaU5nTWJFRlZGVmxNaTFpRGo3ZE1WMEdLYkwrQnQ4VXVFSS9kNy9iMW8zUDdPbFo1MEcxZWowYXpEZ3hrV25WM1grNHFueVk1Tld5blhrM21jdTgwMjlkVlMzRFkrOWY0T1lEOUVzTXdSbjc3TkZiMVNSS2NIdEZXeVBYMURYL0FTU05vMlN1N29YYVdCdkI5TC90UmhXdm42WGQ1anAyQ1Q3YkZSdzFpY05jSVdmeWFsbWZVOWY5T1NMNTlsSkhJcm5NSHEyTjVjMU9RcCtOeTBoMmRJSTB2NHhlMEZwZlBIc1VFN0pvZmV1cmxLTG5SWktZZjlUMkcrUDU0YklncTgwbWQ0QkYwdUdZVUE4S2Z2ODdNWG5yZFV6MEora25GUU56RXNNekpCVENuZFhLaUwzbUFMTVg3WHZCZzdUVFNvMnhHeTVoTzF1ZGhINlJLcTRYRC9OcEVlTFlRVkdMRmpoL016bEFaK1BwZ2JzaDJEVXdOSW9GTHhhL1hCUlU5ZG9wUDU3d084QVhsQ2hVTjRUQTRwVXVSRzhRZm43TlNQdWUweGhuVlpPc0V1N0x2ZVpCL0txOWFFUjV1UktzeXMvTlFnOStSR2RabXdEdHlRWE9BRTFaOXZWRkU4Z25lKzNiRGppb2k2bW12RFRqMFpDblUrenhadEovMWlKbU16S1pYYm1SdmUzeW1YdklFdld3RGlMakw3VXdwbGtsczl6TUhRbFJDTFgzYzJxYk16V2J0T3pRNzF3ZlRzWE5hWEhmR1BBRkZCZ200Z2hwZXdjV2pjc2FxL0grZzhGK3ZpaXR4YTlBSjRCR1hrdWJDZlY0dlZoYmk3VmFnWHBSWUVpV3R6aFZKQTlySHVZU1VlMnBIMGNVZ0dhc3BTZDNVNGJDQVlzMkdwb0FXcFcwYzlHQWZ6YW4vandsUVQ4TmpDczExWmhpUndPN3J4SS9QNzJhRlFXd2luY1hJVzB2eG4wSkxCbytCY0c4SC91MWllSnl3ckV1RHU2bXBkMmpUTmU2QWhjelU1ZGE3d2U1T0xSdUdkUnZ2UjV6S0krWERRVU52aFhRN1ZGQ1RkcXoyd09EQ0FRSUlwL29HbFVyd1ZRKzl2ZTIrSDVOK1hNQ0tjcVhHWXVuOEdWWCs1anlIVkQrKzdlK2R5YjdkSUpROTJPM2hGT0dKZGJINzloMERBcWVVcjhJVEtaNkpqNktYVU5ONlN5UHNuNTJPb2c1bEh6dkM5RVBwOS9RKzhrUG02cHFTcHhhUEd0R1lhTDdNMEpBb3BvSFI2QmhoRWlLd1NjRnVMcTY4UDJmZjNzNitabUlXcEdpUUpEdHpJMHYvU0JUNnVMM1pTbXVtSkplVmhvRU1VeVJYS3BUQUhmenY1NS9vQXNEMFhzR212YUdKT0xLa2RzWERiWmZPWXBuR0FHdEYzMWtMUDhPUkdiQmJvOXFhdjNVNXVsbWZhOGliWGRKdmE2NHlmaFNqdG85Y1RPSlRvNUR6L3FZWFBVelJxWDQvZUlkejlHa3p5ZEVPbjBmbTRxNWhWY3pGT2N2Zm1lUUY3TFJtYzdlSDhReENralF4Nk9YdmpNbENRVGdKdXBKejR0WHA4VUZOb0NCYnVVeElOanh5N1h3MWJzVXpJeTNNcUlHWGtFcGlLNmZsa1dpQVRiWWRVb1Q2alU0TFlUcGpXd2FianpwS0dFK2o3TlVDWWFpOTM2c0JrYkJmejVJRFU5VUUzZUdaN040NFNOVUlYeFUrb01WZkUwZHMxSmZWakxtdytpMkR1aDdGYnV2NHJSdmpDSXVqTVFVb3R2TGg3QXZ6WllHR2NucVpWeStwazdZdTlVK0hnbUxyc0Zkdmx3eGcvdU5zS0k5NG1KaHYyOVpHa0xUdXRyWGsyYktoMGkwUnpCSmZyVzR0VXRBSnFkNWo3cnoyc3h1andVek83SjZRTE5oWm8vSGpRdUZoQUgyQnhsUGRJakhaL04rRlBIb2dmN1M4K0xUL1loay9wTERweGhaWUQ3QXJPYUdBdzludDJmWjAzSzlrU0FtQkQxRDF1dHF1SGg0NWtzWWZSK21CL3N1eFJXN2N1bGV4VjhDeUFXblY2VnB2alhNRWF6WGQ2NmUxNk1xZlRpQ3ZSUlVMUHBrbndONXRLU0E4VjZabnlCMGEzdUVEUHNJUXhkYlI2ZG9sdkhPRi9mU2JLQjBVUHV6eHQxbDdTUkRNOWpIbFdaQk1RMGhRQVhCWDBLRlFaczBMRGltMW14K2tnR0Nnc0lwUTh4cGM2VHZ3NHB2YjRFNVE5dklSQ0ZRNUNmbTR2MklHR2NsbzUrb1hubzhJMjZkWW9aTTRtVXU0dlV1blR0bXJNNEZMbW1PejM0dlZGNUpHOFUrVi9zcGM4SUxyUlJtazJDdVIvNEoyTHBUMU5ia2lyUUlCZWgzYWY1NGJRRkJuNVc5Z0pDaFkrTGlJbWdNS1J2dUR2M3crK1kvVE41alFBcWQ5aCtGTHNaejZ5NE1lWm5vaFhiZDBhNW4zMldNb3ZlVkh5WG5KTnZEb3VYZm91ZjJUK1JyMkp1RHQ2TGIxOS8wNEhHc2ZjQUFMODVoY3BqTGRWTmhSYTNXMlNhWjliam84aWFXU2lpYU54MnVnMGFNWnFGeE9RMEczTURweGRSblJmSU4xNG54RmowdUorWmpNRWw4Y28rVTJiVUE1bGxUT1pOa2lXRXV4MmVoTndQUys0ejlFYjhsZEN2YWJMQ2FlcmVOUkJCb1ljaEt6WmZGREtSb2lvNzY1cTV4eWNBbjA4R0pqUk8xeC84ZGFkRyt3dXBBb2tMVTNZd1RDS1pNakNHekpJSUdqOEFoR0NDTURseHhxUXl5azhuZTBFRWxlRkNxK0JYU3BzWHdoODd1MS9ydHNEVXFnV1V1S1NYenJsV3JkOTYzMS9xcVVucjlKaTBkeHNSVWxMY3lrNUJ2ZkIwa2RqRjBra2lNOEFmejF3Z21mTCtNSElndGNPazR1V1JubS9PdzRNSm1lVGtDTFJiSThWVWZWT1EyZDlPZEx0MGdZMXVKSEVNOUlDK2pwR3hERTM0aGYwaHdHbVcvWjR1YjRqNWJBMG9KakpXTklQbCtqMmo2VXBTZVNHbUZiQlorNnV4VWNxYTdKQm5lUmJQTzVSTWdZRWhGTGFzOWdaWkJsbit3VlVUdGJFRU1CVi91dVpZMHVLQ3RkZjNoWFVHeFgveDhZVm5SREQ1N2lqNFlSVTNKbFhWemVFd2J5bm41NXVuRHZ2Y1BzVkw1UXBaMWlZMXQwQmpqTzIzRnFxdy9nNmRVelNMdUc0RndkM216bDdwR0VINGkyNXZaNkI0NjlaeEdRSnNiQzdrTXA3cDlKcWpmNGNWazhBTmFsQ2RvZGFwcDV1L2gvSHZoUXVPQnNLMGZ1am84TnB3cEpvZ1U4dkdtQ0Y2cnNUMUxOSjkrUFNQOElSWTdTMnkxckhweXZlYzhrQnRNTzFyNmozYTVISmF5c0xqL2ZDVzIrVXlVbjBaRTFsUFQvbjBnL1FDSDVmZDQ3cHppYTV4bEUxNzBuek5ydFo0ZjFrbnBsU2c4WXBka2RKbkhxeUhZUlI1VUI4MkhMRFBZN2hUWjB0cDBDN2E4RHRKRm9mb1lRMCszZmhDRlpSWTMwTVRWeG5ZYXRtZ2gra2JyclZkV21adko3QWJOeHF2NWx4ckl0Vm85azZWbllEWHdGbCtTc1J5RWo2OUUwTG1hY2s3emFYVmZrNEVnWTFoTnJCMWYvd0NZbm5RdzZ1anpmVFY5NHVpeDlXUmY1M2Qxc0JFNW9qcWNNSi9xeWZVaGpLMUdiT29wdXJKdmhLNG5kNm1CVEQxTjdVdWgram11MFlobCtndHJsRHl0Q3Zkb0JXamRqbUFzU2x0cWlFanNaQld0OVRHLzJSRzlhQ25xdVB4aHc0WXBxWE5NZm03TlZ5dk82UTR4cjhDd0FuWXR4RnRidGd5TDhxQlJ1TnkrbjBxSXBDdjZidVJDRkxMaHhaT2IxUERHUlB4SXdXeWVENTdkNEtZQzN3eHlsMG5ycS9KcUU0MkdBY3dkTVBpZ0o2VDkwMW1qTVNlYW9QdUZUdjNZWCtNMXBKdnBjU3RWMXpjVVFDQytjVVkrV1FPTkxUNWREZjNMNTgxYmtMVGJKMlJDbFF2TkU5MWlvREhPbkN1dDhiUzZINGdKT0VkeUxpNi9nUUxhdU5POWgzYWpGUk4xVTQ0UlJVc21SSmEwODJMTHd3c3JkU08veTVPY0tCN2JRT3lOcGZLUHNVQlZUVE92dEF4MTVwaE9vRVhHeUNndk51K2lCNnlHeTdZczZWUW1wUGRLRDhjeGY2QmU0aUZtOWNWRmN6MHQwaGtTRVp3ZU96UVVuTFVoQTBqbGtud3hqQVprbGVvWm14VGUyTUgxVkl0U1VacExScnY1YmYydEY1VmNIVHo2UDZsQ2ZsMHM4Q2xZTjdrK2RPVGUxOGhseG1ib1lMNkRaeU43L3hNNGNlenh4Y3V6M1IyblFlRk5wMThVRmVyaEhKTW05N1lqRHEwaWY1N1Yvd2ZxaVZnaWdPTHV4OTZVL2FCNFA1aTE4RytKZldaclFqL1doRTZEa2podzhGdHRINmJKMHorQlNLY05ZYkFTZ1pjcHR4ZFMwMjN6dUZFUk5EcHkyWmZYTm1zVVZZc0FIakFVTWU3U25BcDg4UVUwYkRkaGhkRFZJNHJrWlZGV2ZEVldnZFY3dTI0NnlrVzVUSUJZVlRYWnJ1aEFaRCtWdThNRGhpS0R3Z1JUeGdYTGpjR2pLYjlNRXlmK05CNFY5aWsxSGw4VWNZTjhmbG52dTROM3JHL3U1bVpySnMxdTBoTVVlK1loc2hmTFNlWDN4Y01UZmFOMDBNS2oxMnU4aVRkY0ZlN1NBNDY1ZXo4aGNkYnBkSEx5aWNPaEdLSk4wdUQwVkNzaXVhYWdKa3RKTVFkSHJxeW5QK3g5Wmx5R0dyUVBJeW16ZHk0ZGdrZXplWU9EdWMya3ZYYlIxUUhtZ2VvamZ3Qm1JNUI4STM4cS9JVVU1RXJ1VVdiYmU3TDdmc3ZqQ3RCNkJpTVdTaTc3OHoyYmluSkdZY3FjdWd0aWhvV2JQeTdLSU50K2VWYWZkb0U4cXBIMzBmWkZEcDBRcXhuMWpDUFVLcmlpOGpNdVE4dURVejBieDJOdHVDeHY4ZGl1RFJsWDdWb1VPd0FNbTBROUdmSHBzeTZ5Qy9WSWpNSi91c1E2eGFoRWNTMW4yU3RvOGRrYUV5N05IdFBlS0drN1kyYmFjNEZkcytIUjlCTTU0WVpuZ2RTcWxJYVRIdVFwU3p5ZDRDckVoSkpxSkhhbjV3VGNwZElvZ0IwV2ZxbjJVbWQzRjdpQXJEblJFLzZNWmg1YlAxVVJ1OTJERlRHc1RmRU9YNGNyOFRqb05Tc1dGSkljUTdtOXIzY00rUEV0QjZ5MEUxTVJjK0pjc0d5OEJUSUN6a0REdmRtZ1ZXUTkzNjFrQm1Cd0RyRnRmTzlHSFJ6elR3emFQSzB1YXBnQVpVV2RUdTZwT094MGFPVThSYWh0WHhROFN6UktRUVNuYU1LZVUrTXQzRytDYVh5MzZWb3I0bE05eEVWWm5mTER1aU95RG4zSmZEc0hkWHVvTFlLeTduamNzU1IyZnlTRGNaVU92USt3cWRGODBSV1BneC9VUnZRMDhKSk9hdDNpVXlpS05USXRqaU1SeXNMK2Z4bFJBTzRpc2JaVW1TVkc5T3RPTS85a2FhZTliTDdwTjBiTGYvSkpMamhkemVnN1RSaVNuREd2U2VmSXc1T2tGSy9vTU9uR2lDeDQzcW5rTVJLZ0c4cGI4ZXVFK3dvby9ncWFTc0xVVGErY29RSlB6cUtzOTNvZDZNTzAyNndiWlV2TFhXbHE0QUJQZDBmT2pFUXdrYWZtSTA5Q3o0S2lXNDhBSURhOFpQNDBVUDkzd3JIWWZ5U1VlYTNHSkppWEFJNmdDd3Y4TUhGUUhzeXZLSjJSc29iYVFjK3hWdDJ6L0dxakpXVzFROGUySm9CbVRyd3M1UmJnOHJoT2pIa0R4V2JPamlWb0dDSitaYjlLKy91amhRNGdRWUIzWkxRMmJUK1dJdUJxOHlmVURKeVl0cDZGQkMzUW5nVFdnQU9rNnBtaHFqYVpSeTliTGJiUEw5U1FocjdqYlZEZFR1bGRUU2c5cVhzeHJHL1VwZy9WQ2pXelVuV3d3YXN1THlETnVyT3QzV05ySUY1M1EzT2k2NnJuSFVqcmYyMVE3UGNXOC9RZGc2eWtrVDhwb0VWYTBIZGRUdnQyZVZPZDdaU1BGVWx5VXZyK2NrM3VPTUg0TFdHNWwyRTdVamhtb3BVME5BMXVoT1prN0hubXZ4bHdSbTlNd1dEa2JjU0RBT3ZaaVNIZmcwcFNLY0hLeElGd2lkZ2hFWjVEa1dCOU80d3FsTDNlakZ5TGNNL3FqMitHSzVkK29XaEJGWUdwYXlaQ1dpcW1KbktRQkNBMXJoS2ROc1Fub2lPQVRHR2tQdjk0K2dlc3ZMM2JId2hNM3JJc3JaeXpGd2k1RG95WEYzU0RUSktXRGptR0hzYXFUM2s3dkNzSm4vSGRZZm1yeG14SC9Gc0hSRjBJVG40N3ZtM0Z5V0I3RTVrMXV4MXFibmpMU0x1QTQwOXFQR0kxNnNxSmRBZWdrMU13QklRSHlGb0RFMGlBY0hJRk9tc0grSklkdHE2dWtmUTdza1JCNFBuZHVsQUdIWktTQWF0akloYkZ2R29xeGUyMnhINlNVMWNmZThXY2Vac2RzaFhscTJQbnp2UXBGbExCRUdYdnJSalFOMjR6blRjWnhSQ243elByNjlseFdUUEpRaFNkbDNTNDdBdzJTdmhWbzAwK3hQT3g2MUczNUxmazlBaWdUR01IQzJuV1JtTDdESnpTbmR0cG9NKzZlMkxFUUhrbzBTUzhYTEp4VkVKb2VEWW4wT0htakdLSzNrdGtIRitHclJXQWdmNHZDbE1HQ09OaWpMM1R1ZXExaGptQWR6WlJ6cFlaeVpiODk3NGFRa05DNWI3cVJvRWM0b2puSktCblBaMVl0ODd0ZGJrb1BYUm5XaEcxRWtsWGc4MHl1L2ZNL05TbHlIY2owdzVXQWZvelU4K2NTZHduSFNNUURDQmJqMGRwc2VDUXpzYmFBTXRINWZXelo4YWNVM2xSWDZUUWljUE1uZFczUFRLWHBvTWdJYk83Znl2d2FCU0x1OTVjZkhWQWovdHptSVd2YTJKd1dYK082Sm9Bd2VJeExBZTVxOGJqYnc0eGNkdWdVZzByMFdYamRGWVFra1RQYi9jc0FHZ1p6NHVsS09Pb21vRXhBS2QvVFd1OVI4aFg0VVQ4N2tzb2VDMkFtMVVnSGZqOE00N3JXNUZEY0hMaHFqaUdydTBlOGVuQmpRTWdtOWJaYmFtYVNrRkZDMXBIais3S3ZNcHpNS1QraUV1YUZiQzd5eS9IY0NzL0QvVjRHcHUyT3FMcWtYbTR6aVJWQ3BNTFNoRVpyeklESTlVcHB4RDc5TjY3MkxKWjBURWlUZmJNYnpKRmNWTDhWRnlhVHczOTVKbFV1Y1htaTA3TnF5OVI4RzQ1ZTBwMHA2a1JZYzdJRExxSjM1OWxzcTY4U1l6aDRsbW51N2p0bFJkdCtFdTF1VWZsYVo2by9ydmE2YlRiNTBWT1JqVGtMWStCUThVSENSSEdRUDRvTDNiY3FyeG9vTEdQWFRsY2l3SXA5RXNvd3FxYUM2SHJIWjJCRXY0RGZTZ2pMNnhEZEduQ2pjWDF2eS9hRFFvSThhejYvUmJpWWpsWE9HTDVXaTR3aGwxdk4yYUErUHdqNlBqWFRZSXhyUDZIRnBxYkRob2RhM3dGQWJqOE00ZEVxakRmVzM4ckdhRitkZFN5T2FrKzJxcjdMdWYrWFE2N0taK3pOWVZnUHRUa1BKdElrdGg0ZkNqL2JVWTJqV2UrNmNpbGF1c0JkQXFES2pkMFp6eW1kRG92cjhLUUIySXlYSEQ3WE1JWlI5OW9kRlI3TFpZRWJJejRxanlGTjNRSTNvblB4SlFsa0pxSXdacG9OeStkYkhCQ0tTbWNNVU05eHpjR3kxS3ZWS0M1ditEMmQ1Q2VkRE4wbFZIV2xYM0daNGE1VmJJR1FibHdyM0ZEV3J4RG83MDB5OUNCM3pyUFRQeCs1S0JVNGJVbmJsUWY1dnBBb0ptd0dtck1QN21aeTdMRnFyRUw4c1h6ZmhGOVR0QnY0V2NubjNBN0dJVVE5cHVNRFVWLy8xdFRpRzMzbEF3bmZTVGl6UFRubUFMcEw5VzBia2lWc2d6YlB2TUhabU84d2k3ZnhKM2t3eVhZRzNlTWhUcnROUFpwSG9lUisxMmM5YVRiTVBKd3NBOFRjVms0RnQ3TUZIRDNoWHpDZVFnK20za1p0VzNRUGQza1dndmlzd2lMdmEwak1hOENVUTlqMmRFRUtUOC9MWm9WclFWeXA0N0R1SDE2T1g0MGZiQWVYYW5GTDFTUFpPUEpCS0hkNWFnNlpHM0NjZHROMVZLaDdrSWFUTVNvaDB3QVkzUWMwTU1zazdBdlVEcDgzbjMvWDNOS25nUFRoYVFldGtHRGNPekphMHFiUHNpUXdiaDY5V3RmL0luM0NpVEdSWmwzZndLYW1nOC9aRGRFQk1lUDM2em81ZGc2OWxlSFZ6U2ZLMVpTYi80T1dlanJPYjVMd1NtZXoyUW9UMmNGVHN0VW1yYmthdUY5RVQ2ODUzT0FqRzA5dVJiUzhNU0k2ZVN2d1dtcDVwKzJPbkc4UmsxdlowZnF6QVQ5RjRPdXBlRmF4cGk5bERTa0ptU1VqTkRKOXJmSnRDOXdLV1l4ZVNreEV4eCs0ajllZVpXTkw5d1VqdmdlZHBMaXQ0TndCRFVyMjBFOS9lMm9pVW9VWm5VNzBnNEhNdEFRRHFsRFI2QXN5cjZybm5Ra05odVBoTFlwSC82M1VFaTR3OFRGUHUrQVZabG0rdXFweFJzaXJCTlgzWFRNTE9hL1pVMkRLV2dYbkZaeEl5R3I2SjQ3YU5SRFQwdkR0ZVk3S1lxaFZrdzh2eCs4S2VITUIzcDd5cDkwandXanFnNjJ2NVd3eEg5TUluOGxpbkNhUEU4bTRJS3VDSE1acTUzbFI4RWV6Qmt0VWR0QlhpSTNUTXkvUVZBVjl5UjVvUzQ1MWVEUDRNVERYeWVJRGMxNTlQdUVia2E0aHBOTVRLb3lpRnY4dnhUbWRzdVB0ZUxGdlNYeXd2NXpWL3V0cjNjaGdRSjlnK29SbGpGVjlxdlA1bHRmaElrMngzNk5QNk1yUFg3enkwQ1RKaFdXMHo2RnM4anBXK1RpVGU2cWFHVU9WVC8wNENRc0F3cGtTU0FYNDl6TnROMFlVd016bTl4bUpEZDMvcjBreWdmeUZkakJOTlVla3FQam1HUEhFQ2E0aFdaYnlQTzJPTWp4eDNDN0ZNZC9sT29nKzcwcjI0UGRQSktvZWZrSm1iSWY5Mm11d2JjdktVMDlxOWlzby9lSFJRcGZ1OUlxVndFNkZWVjdCeWJnQVU3ZWpURjRXbGh2K1dBTHh5ZGd0M25xaHNidElZNCtEWTJNdlljN3FveVpqOW5wcS9MUmRod3F0clEyREhFRVBxUmdERTl6cnZYNDRvUTlwYkFsQ0V6SVNEemdXL2ttMXpyYkJpYW9pK3FMUUhKaVF0UTZrZkd4ZWFPclJVREZwcVVWdWtkcXl1WTN6V1lvUDdYeXpGZ2RRUiswV2JnVXhrZGpQMHpwWEdQbEd6dmZtais0L0ZmVjRtNWNtd0M0OXFNeGErbFpYNDJEMjE1TStaVFpzS0JBMjBkQUZIWXVWMVEzUEZ5cTZDM0JWaGhLT0RmTzNEb01mY1dWSTlrN0loZitNanlwSUhpWFk4d0t5ZnJLZCtjM00yU1piNEpEY3BFQkxyQmV4eTlFSVNweHo3STdEWHZvYlBEelNWVVEwSXQrcmRqeEpKSGUxelNSd0xIN09WWk9MZ2FIaWpyTWtlY01ZYzZ2bkhBcTU1eC9MZ2s5NzJVQWtoVnorbFJMT3plbDdodDAwZW5nUVcwanp0Njh5RU11ZGNsK1I4bHczM09taU1XMGlsSUcxRXJJTnNJUW12bjRDREdrNkdOR3k3dFA5K0F3aWVyN3B2VlNGeld6NUZBa0RVQlpOQ1E1eThVaTZKUHZjNGJvR0dMWGhybm5QZHp3SXdrYnlzblJOMnZna29BZWtERXo4UENkRjJTVUoyaGc1ZitBVEk4eWZBRnYzYWlMK0xpU29hRCtnaVVyV3JGVVdVNjRpaDlwamV5aVlIS2hnaWZwVDFSdFRESjR3bjBaSFRJQzM1QVd0eDVLb0krVmtzaVU1RHVudHJKdWtGTlQ3d1M4cDFhY29aemlkYWgyNVQ4SzRKbzN3VXhaMFprWnpYUXpoTmM4bTBhSFJSY0h1Y1B5YnZUQk1pbWZRQ1RIZngra09NVWsyQllaelVXWmkvbUtKWHBIRXB6V2wrVnZNaUZ2TERERC9tT3JqMVBjelI1WER0ZnRoM3h0eTdzbU1nWEQ5aWFVN21CUGpYYlE0aCtjUXdKZi9RUGlzak9iVVoydXlaNi9UU0R2bFJ0LzZ2S0NJQ3R6ZmlCTXFRNmtKK3dxamhuTENvSXdqa3VYdEwzTXg4QnZTSVdXeWVwOFdrZzRUdjltUjhwaE04bkNOWWhnWERiZlJFMGhaSVpZS2F1UGdlMlNNTzd5bVZBOFRoUVBPdDRwM3RqVlI1SjVIOUQxczAvU2xRTCt1ZzdFVUduRkNld0Rhc2o4eXlYbEx3WDNPNSsrcXJDU0s5alRsLzRhTEttdG4zQW9uVkh4QTl2Z25VeElWT2RqWkZNZjF2c2p4SUhKMysvZlBQWVZSVDZ6TS9Bc1lLRll5N3RFZXJ6V1BXOXpOVFVFWW42WHJUM2l0RTlkMEFkY0p4dW5HRkZSOGxGZ0NLYkZBYjlYTnlqcDVCa2xMZkdSQlVwOFYyeW85b3dhcWx3QzJhQmRjVHNJanJXTFVzdmFrOUx0YzFwc3FzOE8rY0s5YVZMcVc0OHc0T21Da0NOdDFxc3NPK0J1bWhlcW1lTW1SL2puVnhjdXF4a3oySWdoRk1uUW1OSmJtTlpuVFdyQmF5YWwzWHp0KzdhWUVHcHgrTFFUVzJkTm1GZDhOUVZYd0QwTWZUbURwYm1Xc2VKWndBMHhHRTFYODRLVzRWcGMzYmFKbkVlR2djditsWHBGZzZSMnFGS0pMQlR1bzdoTEJhUWR0TXNZemxraVU1QkJWN01sTHlMeTE0VndONWdhbW41UnBTWWRud1dGdk5YdGpQQmgyOXR6SXNtZGxZTHpFNDYwTzhCbmxHdmRsYU5uT3BKVUtLTUxTT2JaUjlsRnZFTUxZVXB6WTVnbFc4V3g5V2lYQUR1aFhFbittNVJOcklaRDNBVkF2aWVaWlFJVXhOWGduNVdTQ2ZDbDdXL3poNHRlRFZ1Q2NiREVqQWJZQ2Y4eU8rNGR1VnRrb2hsTk9XNU5JeWZnQzJPZGUrQzFpSXZnY0p2QlRiZ0hPMDF4L2pJejhROFN3alpnQ1hRUDZoMnlHRjRLN1lOWDI3aCt4c2ZUZGc2OTJ4ZENrbnRrcnEvM1VtVlY2RWNXMk1OQWhVZEcyRDhNZVZhNUwyVGVsdFphL3lXN05yQ3JmVGx3VWtDOHE0YjhzSXczeHMxN3FNd2l1aktIT25rRHFNdGhRT2V5RGRWVDNLQk95UTBZUXhLa2pRalcwOUVraFVBb0NMcFNuejBoRGtFVmVQODgxU1pWMGZHMXVKckNXb2ZZSkpvbkIxd0lsUzN0L2VZUGhsTmduQVRrelBWL05sNnRYREpSanRFNGIwckgzQUk3eGVUcHBwaHZuMFVJWmJpTDB2ZWJXVlFrSW5adGxFMHdPdGFmWUkraGMvY0ZwcGF1SjFPVTlFUnM0bTZPNUl5VUdzSEdnRmhyS1gvRGoxYytKZWVwQkxJOEdWYmxjQnVmZ2NQYXh2WW9aWFVMbTkraFQxUXVxaXo3Sk9LUUEvQXZZSk0yYytGQ1ZaN0p2NXhrc2pqMkpOMmRpa1VKNWZJY3hRZm1pNnRzMHdMTGlucFdwZndidkZGRUpjU3B2enBoSmtqQXdreGUva1U4a3FYZ2RieEVDRmdQajhjbGJOdTBUTE0wVHZQN3RTVWYxTTN1cUNUSXdkNjk4c1l5dzlxdFJqaHNyWVV1OVBqdzNHR2FVU0tOOTkwQ2cvaWRYQzhpUTNXWnZlM290ZVIzeGJmTWduMzc3bzVJNGpWNVZCVFVoUmgvUFlMbEcybWU4VTgwZ1AwTno2dWxmN3NIbU0zT1ZWQUE3M0todDBYeFQxTjFEN3hKa3NoWW9jeU9IdVNidVg1Q2xsUmhJMS8xM2NXb3BNNHFsYzlCaXl1V2dRbkszZ3VOcE9tUTRtSHJWTWRyTVJnVDdOc2dRSzhnallDcjdTc0ZKeWpoTEhpM09XejJqSUhhRTFTbUNEaVFycSs0eE13S20xd0tQQ05iVy9vRzJEOFVDSit6SnVBTG9kTHRwRG5oRmRPTWxKRktvVHJKQVNkdUZVUHpUNHVlcFI2ZEp6NjVzeTBKbFZLa3h6QnVwemw5TUdUbGZ3czNqMU5uSDhJYmpzaW5XNjhhdlQ4bXMyMTBmU0E2bGFFZjFDSjNENjR5SFh4a2t2d0swRTNvSmdRZzAxbU1YWjVxbUlNSmYzaE5lajRUUHhjSWhXZUN4Vi9NdFc3bTNNNnB1enFqYjJUT01wbll5WkxEa2lLY2hidFpNMjZVWGFObEV6emVObnZzTzFZUEIvcTZWSVFWbUpMYjUzRUNxRmRncUZWVzNUamxKSzREeTBUZkZOMnlLT1hnNFo1dytmZGN3NldYM1FqN0x5am9BcGlIdHY5Y3c5MzRoNzUzaFhFd1V6TldPNmpFSGF2U3JDMElTejd3c054alA3R1F2aGl1cmZrUHNIaHVqNmtPL0lWdmI2SUlZWnkyYS9DZUZIWnhuUEtndWxqWVNUZmRrU1U5UEdoSDdyVCtZcnJ5V2d6N0gwalE0dW5oSmNzM0VLaTYya0g4RkhpSmlZcG9qSWJtSGJjMnNSMCtPVUtmRFBXSVAra3N3eURGcVBiQXVlSUg2UVpZSy9HbGowc0VmbVIvZXVNN3NycmN4RUU4RFhjeHNDUUk5RmpobDUvOGNRRXljTEduTWI1Rk85bndaT2d2WTRRbWRlYXZVQlBLbFVDUlhWd0RYZjdrWUE3N1lyRFE1djl3N2VoVEdOMmNraWM3MTlqeW1CR1ViR2xjMDE0cHFrUjRoV2dnZmlHWVk3aVMzV0FYcU1wUERJZnkzb016cW9kclh1dEg2U0RiRkQ3NDVJb3lkd2xPcWhYc21Ka2hyRHhNcGI1a1V1N0Y1ZTdEaHZ1cWVaTVRoT1V3SnJKT2ZzMWtGSmg5QXQ1S3Q1d1lKUitaZy9TTFNpeEVWUUdnOTVQVE1kaERsWFdkK3N5eUtpbWJpK0E1SEJRVjh3YmVXOUY0MHFrM29oQmlIMVFUS0ZVaGJidmFTU2M0ckxYRnMwSDlxZ0c2elFSeTJYalhSOVI3TkJPbUxldWdOSU1lVnNkWldTZmVlUlV2bnVIcGd5T0k4TVlrNWZ5b2tlVmY3M29ybThhZngxd3o5S0hGSjc3VG9BTEhoN0VrV2tlWUlWOXF3QVcxQ0wrNWp3VllKR1hRV0xBUFVRSDhlVzdhTE1kckNqUDVUVkMxYkJpaUhLY1k5SWg1MzRWLzVtbm4vVTVET3A4THV4VmdyaWFPSGJ5aC93TGVVSkg4N2VBTElMeFdrWHI4L1ZPb3NFY2g5S3JtbmdUa2k5ZzcxQWtvdkVzdTdQMWJnaHNwdlo1bEJ4S3VIUVJLM0wyNnhaZ2UzaXNTSnJsWmpLbkhQNTNwSDRjcWJsV1dpNXE0SGhkT2YyUzB1MnVkdWhVM3hPeE5PMkhRQ1UrTkdxZlZtRTJUajh1TGJwN2Z5TGcwYzV4TTlGRXVqZnM3UUVkYVJUak5hQjZjZC9NekUwR24xRlpYOVBIdUcweFNUN2hScFhxbzExRGZsNkNrQm1LRWpsYzZNeVJxWXhSeUJuTGhJbHBjUTZMa2RMaENDd2JwNkxId01kUmNJNUo1SGVCME02VVBua0xrNDNLbG1ZZnVXQU9UbXprSy9rWFNGYjhKRC9PaGV1REQ1WlBreHhrOUI0NnNibFJYYk5RS0M0YmR2MlhXSkdrcEJ5VWFoNGhlUjZIVW9TN05wVjlGaCt2bUg4WUZPZFlQbXBTTjFHUE1Pc2xBbHdwMmZXczIxcEw1enFIUXpneHVPbnJrVWpoMXNZTzlyMFlHVUtZZElES3hPS1RUVm9vNnZIMm1oT0h0Z0NFbVhMSHlNaE51S3BTMzRRU2M4c1hwaGw2V3Yvb0h5VW43SVl2akQvYmFvdm5QTlRsV0pOK0tEZ3ByZ2Q4RVc4aVVDS1MzN2pmcERwcjUxUWMreEt5RmxOV2tCU1g4dXgyL28zQWtzWTNHOXl6cEhSVk8rTjIwTGJYRys2ODZSUzF1NDBScXJQZzczZ2JCa0hlZlBNRndmclVLdlVMOW9jMS9ZWHp6d2JVL09UeElyYUtCSkRzUGhodm9lem01dFFKaUJVVlBMUXJpS3pjZEpwQWt1Tkd5VzdBMHBQOUtmT2dId0pLR2xxK1BWZ3kzVEFTUHRUQWpjZ0xWaGRIQ3AycEtuSlpTdGdVWHJNQllZYTM5WnlEMXpIUWtLUUo2Z3dSSElldWxGbjZERW9TUUtiM0JXWnBwV0NncWMxZmNhaENrMEZWWTBrRHViNTgyQkVYUHZKTHd2dzRnbE0zUXNiYkR2SVZvMlRUVWFlZFJ6SHcyVEhpZnZRWUxydm1wZU9UVnNGYzRYcGFYSlh4NmZqOUNTU1lzcWRRNzF5aGRPSGQ0b1pGZllKZndmNHNVMysrWTIrZVdwdGhTeTVaUUxMK1BYQ0dNVGhBMm9BZHdReW8zdDRqVk41YmpuejhqUjUxZ0V0VWJ2UTltazdMSFd6dnRVLzgrZHB0b3NRMmNiV3FTOVBVMGxtV0Eya3RReWg2VmZWdTlXM00zUWdETEtNQXozQStQMkZ1am5MN3N3NjB1dnQ0R0JuV2FGSnpnZlByNXdpbk5NVk13ekQ1UGQwZXE1RTZHbUxHWGNHWEE0SUQvYTdmQUpmU0R6cUxVUktET09scVhWUmNob3VkWktYU0pNb2ZqRDkzYkxUVVdmZTVUcDdkc25DRmlYYkEzbWJ2emx4VkVEUm4wQndDZDBNTXU3WThHa3Jzek5STDR5cVR4RFBoWW14Q3BYRlRxOHhNZDhGY3dPSnZneEprNUc5eTVIM2tlbDY4UUNNY1ljWFhQUnlhTHA4cnFYK1IzZFc0RExSeENpVkF0alFrSVEwODdmenBCZnZQOXBBVS9rNzk5MlJUK3Y5T0NIMWFXYXQ4REdwOGo5SURPVFc4Z0V2SGc4RTRHbkgrY3lDeGFFOC9nTjE1cTQxcktpNzZPM2psRDZQMWpUaGljRW5UK3l0Z1l4OGRqWjA3M1dTYXVLN2t0OFR0TEJNTktvR013QWVxV3lkSHg4aUZVaXhvZFFaZ3VmOWpBMU1WS295L3Q5QUJpZzc4YjhLcFZ3YjdETlVqU3h1T0RMZ0dOalA4Tnl5dzNmeVRiQzI0K0lwNXVmUlQrQ2Znb2hYSVRWNXJzQWhvbndQWUpkZFlhcGVMNVptM3Vodyt6ZnhYTUY0eE1MbDhXcmhWM1YzWitFR3RWRDNOeVZ0SUhCa0ZJcXNBS3ZmUWs1aENDVk9XUDRTT3AzMzl0dVo0bVYyMGJieG8vOXFHRVpYbGN5VWJuOFRoN0JJdnZEaUFjejd2ZDZPOE1vU2NlNjZOdVQ0WHY2cUQ1QnBseWdzY3p6T0l6RkhzdnJkQXNKbTMvSVpKUDRWUXpmcTVMQzByM21QOHQreHVLSmtTNEpES051Z0JrSy9wK3RXbktiVGMwMnkvOFJPRDRsYU5CSElPd2J0a1BDaHdFbFRYM3EvU3RkdWtyMDdVQ0RkVmoyZTVxeGJBQkZESmNoVW1UQzJzcGdmd2I0UDlkVVNTam9vMWdkT0JVM3k3czA2bjhyMXl3WnB5MVVaWXpoYU0vcTVmMlhhU3hidzU3MnhNTmYxTjVvZy84RGpmZGpJODRyTC96SFpCODdoWjhYR2hUVThCL2QvVzVoNjZXRzhmaVlJNndlWGtncTBvWVVWamYvMyt3V0MrRTgycXlnVWwxQTVnZmlKVVdKbldNaktTSmhiY05PcUNoSUhkQlB5K0l5UVNGdWkyclJWalQwYzFGcitxRGhjVW9wQXlGK3hBaEJITVRlSDhwak5XWCt2cDN6eWpmM3dqSFpCNGdXZnNURFpMM2pGN2pubmEwOTVrd203RThUTTQ2Q2JmNDJ2RVZDcUdWKzNieU9GeVpWQ0FiSHpDVjdUSyt3QmVscGx4ai9zNFZycGpNM0VsaTVnV3JnaklTMHhDTEh6QVl3NzNDbDdOK3FYbDhyOEJlbkpXbXprc09YSkRjbGEzeU9TOVZIcVNFTjhGSm9sdC9mMmJLM09QSGt2NEg1VVpEMFRidnloaXE2T1p6bk9XYzUweDZvbVF2WHJqaXg5czdyRXhNcDEvcG1tYmxEbnM3aHAxWi8zRkovbDNmbk4xcFJSUWVrUFB6YnVIQVFDRGp1dXV1eG94R0J6L3BvZUd1R3FhWW1ST1FlQXZwZ2h1ZngzOHBQSzlFV3Y3T3dWVTR6U2ZsQ0JJVGRuWitldS9KNWNNMU9LSWxteE0zanFKTjk1TCtpTEJjcVQ5bkJaaDZUYkdRVk8xTVdzNFNuai9RTGJlY0hHYmpJZUR3WWhRdjB3dEEydmo1UkJ3MTZoK1NBYUlSc3RQVHlqTlFPaEtrc3VXQWNGdjR4eGdocElEVHk5UGJQRXBPZ0FOK1FDK0ZvTEZpR1FPUlk0S21nb2ZiSFNydVluL0FOZ0FmWEgrcjJvdmViWmZicUFZeC96VXhaMGwxczdLY3pldVhRMzR4bnIxdDNBU0lBK0I0SXNqaWcvUGUrd2pGRVlMbWVFWDNUNndYY0RHcVBnVTc5M2sweUx4TnRCRGgyMFNhcUZDNHIrN2taVGhpY3N3QmV6QXAxOGMxYXpNRU5LQWF0QkRsZnJKRkZ4NzN0Y1owUHBSdjNKYUw0ckM0bU00Yi8zK1VtbkpwMTdUTFY3clM0V1ZQSUZRejFDaTQxVDVySzlDYkRIMmdrWUhJSnFtOExkWDhJcmFjNjlLTGpVME41ODBLUWtGdW1DUlIyZURsZWJnNk5ad29VaVh5ZUZzUG1lbVJiUkw0RlMvS3UwVWlxbzNqWjZvdTYvUDNyWUp0STZBVW5BTU1pRE9xRmIwQkFQaGViY3BZRGt3dENvL1BFdWo5Tng5SmZ4MHlteTVpWWlXRW1xb04xdjhDbm9yM0lOWGRIbVk2aVdCYzJGVDYxSzNRTzU3bnNKcnVQU3FsN3lJaUZYVStlYkxaNnJMa25TeFJ5SDZ3TEwrbGd3c0NLbGRhZ2dBVWRRYlREa3BXaXBubytiRDZ3Yy9XcXBGeGU2bUI3RTFabjBDY09NNDlneGh5azlMaVRuQ1Z5SDhKREgrYTJ3VzR5SzhaSHBuaDZ0Nmo1M3ljRFdtU0JTWmtBU280OXZ5UTFVQ2NMY1NBQUk2WTlVY1IyQVJ3b083VkNLNlhkYk9pV3I3REpKV1Y3SVVISTVpeEQ2MVpaVEdqNHFHZVh5S2ltZGIrL0NWY3ZqdlNEUGoyMVV2TmozLzBETm1ieFUyMnJxYnQ2blhUdFV6REZDWWVGMDdVZWUxUmtIQXhGcXFPOThRclFEcE93RFR2b1FWdXZDNnRpN1NEMExQVjIwN3ZxZDdKcnVOYWxKa3ZZMUJxRFRmekJReXNjaVU1U05WYVNucS9aU0UvRHVKaHJkTXpKNE13eG5tWnV6UEZXL3FBRm1zbG42bElZV3FKVHV3c0dZUm1pMStkVHpLMFpVcFh5Z3FrdGpreVM1QWY3M2hzNG9paE8ybG10bjMyeFo2RWxXUmZKOHByZW5EczVvRldMSFdlbTNsV1RtM2FhWE5wNGwzSE9ITi9rUTJWWkdEV3N4UWJ5eGhpeEZqYUE0c2YrclFGL2piOU5CSW5nQTN0QlZDUzZTeVVkVDhjTHNGeHB0VjhJSzFBMERxWEdqOFBuOHdHNkJJSkc1ZHhMRXh1SU84MUw5c1FMVkRzL2hoRmdVeE1BNEd6UTVuZWFXRGg4VW5HeWxoQUNpaWxmUG0zaHdaVUNndnpFVllkeXZ4dGw1cWhZY0VnVlM3WG1PUFFBVmN4ZzV4MHRDaVM5dGtmTVRiaHZxZXRSeVFRQVZQa3FjNGMvRjdCT0ROZU5jYkorZDlrTE5VSFM5cFZoa2xybHJXb3FYT0hZSHgrakErbXRkSU9KM0hEOG53QTdWbENUM2R2SlhFZnBLZE1hTUpuR092OHNxNHVzbmpOektkbmhRV1BycjU0eVdENkl0aUo0c0VrSVkxeHdtVmtkVnFOVWtMZW1YSXNUd0lPMitRZFpOYTJlNkVQL0dxSkhzS3JrMVVnS2tITVJBWllvbVhTTnBUejRsQ2ZpSXd0cUJXYWllaGVnV1I5TE9GaG9CL1FNU3FrS0VUNUxCS0ExYTZwWlRzOTNFT0VIUmNyZE96aGVUTkVSdUFpcUVlTTdXY1BtdnY0cytGRjZobzlwSFdRci9WbDF2TzUwcjhndHIyVnEvbXNxdkRjSXQ0c3o5M1MzaFVtM2R6WjdWSWJudFZadGpva2MvWVdyYi9uNFRoYWhoUHE4djJ2d2srVCs2eUhJUU92R0FpaEN2OGNBNGZuY2hXcjNTNGU0ZVhxb3NuSkNQWGtqYVFEdVZsZnp5dTNvbldpZVhFOUNUV0pWSGM5ckt0RnFNWWl6ekhtY2hMb2s3NlJyUEprRm92bUcvT1ZHZ2NLNmJkWlE0aFl3ZUZvenZ0MllDWXB3YjJCMVg2emh2M1dOMmI3dDhNS0ZGS2dzK2V0UG1MV09NR0hxRUI0dGx1cXVyb3V4dE4wV29pekF0TytOVmw4ZHI3VXlPekVQcVZHaWxjeDNEbWZPUHdkcFVUckplMmxXcmdIempmUmxDR2xNNGpPMHVxb0ttcktUMzdhMm5ob0ltWm9DN2NuVjdyNWVCLzkrL05IdXU4WEdGZE9TcFJFU2VkQm0xUTZweG9hN2E2dEV1Q29tRkJtdEMxQ1dXWExSOVBRcVBBS20rbGxnMXRHTXBYclozbkViTGp0MmF6b2owMWxEMTR2OXpSNEpHQTdtaTc0cCtVSFJEUEpzbEZvT3lDV0pDOVU0ejNGcGdWeUlZREFieEN1djZaQ3Q5a3Z1T0oxYVhVRU1DK1lhMjZlT0JEQTlCd3ZSNVMrUEhaZzFVVFNES3FldURSOUJzdFE5REJISnhFN0x5SHRRL2tzckpicVhhUnVFR2FFTUF5Y1I3UkVOVzAvYzVHMElYSCt2Vkc3T2dyc0hlT0hDZUtycURCaEhUVGQ1RUtoWUNFejZLZjE0WTNQYmJ5SDd5a1JTa1ljVUYxMTFOYWpxaDVQdkFMcnJ6ZW5tVm9pWUgwQzB0cTdHNk1tUU5qOTVOL28rckM1ZDA0eXZkREJYcTI2aERuYW1QOGhTbTRlOWRXUEo3OW9lU2psK1pOM005RGFWREk4dEFRLzk4WjVPeVNFTk1xcUlXdm9zdWYvTThSeG55NmZMQytuTENlOU1FTUlMc24yVzhScUo0RlhCSm1IdGJIWHVkUDk0THdQMHVhSTZhUzBzcnRRQ0EzUUNKeEdFcmk5NWRaZ2ovcjZveUZCbkJtS0RURlI3b1FQZHJyOWpWUEF6TzlzZCtmWmdCYzlidldRajJLRDN6TklNalEyVmhUa1JtRUY2djBqbU1aV1piZER1dVRBWnVPUU82bk43bHc4VHRqMExyVENDTEcrMGx1MGRlY0pNRnlBbHpIM2FBazFXOVVQbEI1eGNlcGV5VEhPakFnbDhtWkJDRlpnVXJTVG1WY0tTQ1lrWXI3SzFyZVVza1d0YXZvdlAzbGdTRTE2SGRHeGl6VzI3cThZLzNjTnRHUG1HK2E1RkJJdG91YnVQeC9yME01cVQyV2trNS92QlMvSTUyRkRHSmJ0RXBmZjN6VytWWkZDZ0VEMW9EZEhrTVVlOVFqVDZBWHEwNWJGbFhLRTlaM3AvZ1pYNlRBZ0FuM29aTDJsMFA1ckQxQmQ0YmR3U2VNQ3NXNFkwK3ZscVFwbi9aNS9XWjdoQWozRDM2RWMyUURnWENTdE1Gem11VHU5WnN5M2EvcC9PbVNFUDA2TG9ESVlNVHBnaTZxQ0hycXV5RnVxM3hOaWczRzZnRlUzZ0srTTlEUk1uWXRWNWh0b1JONTZEekRkVzM5OWUydThOelpBVFA5WjVaSEROOHFrZFY2b2FZWGJXYlZ1b0V6OE1CM01RWmUrSkVRa0JXdUNPUmZsMHlRb2ZCQzd6aHpDQ2VpUUN6d0VJM3JGUU5UYlBManB2MHBySm5QYVJyOG1vRUJMbHRVK2NtTUpxeXRMZGpSaUNKL3c0SWlBL1g5WHJzUDZxK0lrWm1HQVdMN0s0S01UdjJSbzR1bUZhODRaazhlb2IveUN5Qjl1dkdvazAxTW5qUTNLK1JETEFjNkd0Q0JISkl0Wnp1bFJJd0RXd1hOVXh4Vit4RkVrZllYNDVXY0ZuV0xzY3dxVVRlN2lEWitsQzNiRlZHWUxvYllXblZQc0RFNk1USVJtdTBwRHl5R2dkcEc3QmNNbnFBTTdLbEQ4TjdQeDZITFRlRjg4WHpGeEppcGthbHN4Qkl4bWg3OGxWRVRjdlp1TzEzaTNNZTFDVjh5MDZ3b2s2RENCaFpkS3JKREFEZUdtaUgxME9EYml0Q2M2bkxxZjZGYjNBSUhWK2Fvc2hsTnFOdzdubmJmVG4rVmprd0svSURzZlliY1lCd0hFR0pVNnpnWnVTQU11TmEzSTJuRDhuUEVrZ3o3UHgwS1E5d3NFdDNUZzFDbUpINmZLRUFuODhPSk16R1E1dkV3WkhwcHFWOFEycDA2UXBUNXR3eEFBZnZtL2ZxUkp3WjhDRmxta3dQTG9RSWFzdFNEUWZ6cU0wSjNWQ2Y1bWxNUFZyRmR4RDJwVWdDeVdJVVE5UGVuSzRHL29kczJydVl0N3Y1RmFuWUpsc1hLR0s0d3d1UDhqLzJxaGpiT0creW1sTVlLbmxyNmUvV0NrQTQ2SWVTcjZXZ204dE53Q1J6ckZINUZicHFudWE3N3plRU5FSExodGJHdThqUXBJREdrRUdMNlJOQUhvQ3VGcnpCY2REMHBTYmltM0JBUnp5VjBXNHdIRG9kdXZtNERsN3NEVGNnWTNUSjVLZEx2U28wRXBBbG12TDhteDNhK1hRYUhRRUZhaVJKdUlRVHpvZjdLTDU3dTIyQ2RoZ0xkcENzcDF3M2FtVmh1bm1wYndHUTg0ZVVBWXJZdWROK3NlMmV2aGxwZkVITXFTMXRWTWRuQnJCdFUwTjdxM2k0bEFHVkN3WHpUMG5EK0N4YU93bzlIUEwweHEyWVYrc2RoM3RoZE9WTkVyMjBUR081WEtzSDhjK1JDeHBTQ01QNkt3cTI1WklSYmVNZ0tDNDNpOU9kUVVaODdwNEg3d09SL1hhczBUWWp6RVRvNTg0SGoxaURHbDJnVkJJU0RwZHlGaUtrTzllMGw4bjJ4Z0s2N2g0UUVKemwvNDFjWExvQVNOSCtLMEduYVFaeVJhODFRY0ZJWXdTUTZoMkZLZHZxUHMwTE83dStpRjl3UkhaZldOVmVVWG50Qld1Q3JENzg0NUtxKzZYK01YKzFWL2Vic2NONWpYNjdCcWh5OG1lbEovVUJwK09vVG9xUVpxUXVVVlJ1b3pHTlAvT0hNbUhrSHkxK1R0dFhzWVhyWElvR2tSOXFVQk1NV1hjRDMxcmY5MGNNUTVlekRIZkxzM2RHc2JZZ0UweWxMdDdUYU10TmhRYktlUGRWMXl5Z1VHdDF5ZFBvaXZHSm9NSjhPTG9GZnZVWHBicCs4cFZoZEhhdHNZUkhQNWN0ZTJhZFN6RkhITVR4Q0pBejROR0ZjaE5RNGJpbUhDM0R6aVdLbytKbWpPMlIyZ043RTdSdEthWEhveVBLS3FScDhVVWhrMG9xNVM5N3BHWm0ycHRKeDVET29TYXlMTUNOTkZDWTc1UGNOSURWUnFaYlJQRjBvRnVTdm95T0ltZXRvOXRTVkZLQ2QwaCtiZDlSM2VkaUYxZUFiOXdtRXRRb1pYSW1qdlpsaVJ2NElIWGt1aFcvclpIRGRtVmdwMDViQVdMNW5DK2VwOFlldWprTmdac0JteUFVRTVlMFdBTGpVT2VxOXpSVlExeEM3WnJ4Z0c0RkRvWkU3cFhCNlVieUJJZ1BLSUU5dEpVQzlKbTFtQTIveFpkS2M4T3lxcTIxRWJFeEhPbDlYODdiM0IzdVI3Ni85UGtRZ2lpVGNxMFZISTNsWXlTbHNvMFdhcHJlZjllb0dDcFV6MTdGbFJNVkEyekhiUXJLNExjSXhjcjA3Q0ZEYUduMlBOMGFyVmFKck84N3FBSEN5OHhVK0ZhMC9Ld0pYQy9rbm1Sekd0c05nbWN2QWI3dytHL2M2ZTd6YTdKdDd2Q0xOUGVrRGZLNE8yS21hMm1hK3FwWmZ5d1ozcjViSW52WkEralFJNWxUSjNQQjY2SXl6M2VDaG8vM1NPU0pLOUVwOUxpQ202RzRETWF0N1NITFBxV1dPWXdvM3lGNzFETHNnbVhUQWd1SmFIeHV3THVOQll2WW1HTllMODY5clk4WnQyR1FwK291VHdaNVJuaklsWFBYYUVoc0p4b1N0eXgva3U2UERhcXAxbWVxZjNpR21GOFNOSzUwbUFrRk1JTnZYcGdtL2tlbjlJeTRvMVI4d3p1L21xZ0ltUWJOanY5alc2UTRIL0ZCOG9ZVjNkd2c3SGFoZzRqR2dUYzVOTEpSTEFlcWFwV20rcTRUUllaQWlPb3lDWjZ6djRnY1g3SW90MGxaTXBKdTRZamN3a1FEbkVKQ3paQnlXNGY3UElObDQ3SkM3MkZBQXk2RzNJQ3NBRFR6ZVJpZXhEb0R3RDlaYjd2bUdPOHVydWEzYXBldTVoL0ppeEM3akdSS25wUHpqMUdyVkp5QzM2L0dNOXhya3JQTGRVbFlwSFFrM2RveWpjbEthYXd2RGtGbEFCYTFyM1pxL1QxUnZKZGlNbk11V1V0eXdHWi9iMmRacVVySUJUUXJINU9Vd25BYlY1TXA4VUVjWXRYMDNqd3lLS2RMaUNhM1JqVTBMaGVDYW9PTHhES2FScVphMTZKTlBDSHFKZWloYS9jOERmbkxUT2VKVDJmWFdaSnl1dnJ5UUl1YW5tejRrMDd4VHY0eXJXYUtNSXNoaVkvclJ4clo4TTNTT3haay9jN0tWQ3l2SnNhbGszQ3dQd1BBdStWMHVRYk4vNmhqbXFwYThmWjc1RllJTmU3SDNZWnVWdDcwWTNXT20xTS9BM2J6OGlTcExRaFdxZFlRTUdlRkFnbTNNUkVxY1pCZVdLWlpWN3RIcWwwNFoxak12dTJwVkVCRXBkSjUxTXArWjFIYzJ0aklEZnd6YktxMXdQWnRiNjYzUEVKeWVFd1pubHlMT05MM1ZlYTdUTk82aFVpMnE0N3huR3BZUXM2cTAyWUUvenhGOXUxbEVrMzJYcDF0Uk1WTTh5UHFITG5uWDVNaHYyRjdnZmFVK0U5VnlscFlYbUJEYVo1ckhqQzROTVI1ZWE5VlBrTTZHQlJxemNVKzM1ZTlONGJJbG05dzRVYmxDZXhSSVdjdEEzVzNZcU9YU1NwaTMrOXhwNlJIdFBGNW00ZTB3cHIyUklMWlkrZERoalh3Q1Uwek5NM1ZXSVNKa1o3alRBejJyYWxkLzdKZFlnbUdubDk4KzY2UHRka1lOOG53d0FOUW8xbHZRL3JNMEkxUzBrdUJYV1krNjByTlZ5SUx6NGc2MWpZZG1yVTJtMmpEaG5Xa2FBZ3MrVTZ6N2FncEdtZHdBaGQyMHNMb2dLRTE5VythdnZrWm9mVENOYTVyV1RpY3p6WWdmZkdLejZYV2FGelpsRm9JNHVHRFE0bThFemZtaVprbnNVeTI4THpUazBEWDJqUnJ3dFZIdzdsZDQ2UVFNY3Q1RXpDa0JXR1EvOFRJeE1QSmZOOFVkMlRmd25HZjljYzVTa1FySlhxTjRURU5EZ0tmREtTZWVPN1BUWHhZWk5Fa2c0ZmpDWUovdXpmaGZkQ0VRdTdIaU16OG9FNE5mZWtGa09YNFd4cmljSXpIVWxDSmduL0VWY1JTUGxxRmVNSitQVzdSYjQ3SkRTSzJ5a3lnMGtjbFlWQXd5NzZkdW53S2Jrek5PK2hIUGV6dzBPRFFFWHl6eDVQdjZFRTBvWlRLUnEvMm5CeSszQzk5SldlS0M0eitWb3hscExtdm8wdE0yQWdJQ0FnSUNBZ1BQOFBwcTc3ZnNjdCsyN2Y0ZmNEL3YrNnAvWjFSOTl2MldmNy91SDkrM29pdnQ5TW0rMzA4cjZpWG0rMzZZYitIMmt1L2JmVjl2MmU5OW4ybTM3ZXFIdnQrMUd2cyszbDM3ZWsvOUQwOS80ZW94UG5XY1A3Zm9mL3pmckhOK25aLzdmc0Z2MmZZLy9WZExmKzM2MUMrbjlpTHYxYjMvdDlGQytyMFo3NTBiMDhOVXFxTERvMTNwK05RNzlIVm9OM0dxR1FBc1FRR0tMMnhaODFyeHhOUFlDOEhmY1NtTDZTYlFoZDBBd0pQeElqM1RPc0tmbzZQZFBtRkJhakIvTjdkdzRTKzZyd3dGc1lWZ1pvaE5mNVZ2WEdpcDBWKzRvcDN6T3hmYnQ1amFncjBENjFyQllOK01lUkFuNGN1UncxVG5uYkRoWWx4cllDRG9sajloV1NaTGYvSG9zcE5lcW9zY2FqTTFWNG9DVGwxK1pJc3NQb0tneHVKMmZIaVlaSWRnRmllRStyeUxFMmRsbFVZVkV0dWdkcXorTGozTmFpenllZnk5MTcxSHA4QjNDaEMxblhFRS95bE9ObFo5bWpzMXlOY2wrR0lDellBUDJ2cFVhdklrdSt5UjllbTQ1bTlVdXhZcXZTYStjNjFNNHA4N0VONFpDWnVSYkZtd0JUSWsydm5VSkVvQkMxQXFWYTZYVkFyMjRSTFFuVXI4Wllpd2x6aXNZQmg1aTZPK3R2ZEJNby9ROXh6WXcreGx1TDQrWC9pVEVUd3Z5WjVlbXA0cWNIcDlkcWlaaUhHU1lOZ2x0bDg4ZTA3NEIwY0tOcCtvOVM4dVFQNFpydzgzQm9SKy8velN0cHdTLzEyc3RmTDY5SDNZTm1EYTg4a1IweDA4VEFocTR1SFZJNFN1Tmh1Z1FZYkFSUXVkc2VHWnNHRTJyTkxoOFZXV3ZkOENOWTFhNktEejZ3N2pibFBQTmVzYmJXNXZaY0cvSkswMUlzSFdlVVN3Mng3ZkVmdEd0SzlIMEl1dVkvWVlTQnVHSnhCOE1QT21DRmFUUk5KY0d2UlpoVmdLZWJUZTRQY3FyOFIzdWoxUU5URDdtMjROM21FcEJaTHJ5WEM0UjI1WnZPWWk1d2tQVjVUcXJtRTZSSlBkNllEdHFZSmRkQzhYUG5ld2c2elkxbEpLRnpzaHVrditCUFNnRnZrVTdNL2FCZllhL3lHSVg4Y0F5ZEhFYnR3QitDd1FUQzFoajRVdUR5K2REKzZWb1FFVzQwb0FVZUh3S1dHTGxxZ0FQZkh3VGxrVHhuOGJvcWV5dzN3dDZpN2dFYUNSc0xNeTkyYWxBcUs3cm5uR0w2eTM3OFdzNnlFRmc2ZU9RaU5uTHplOHVqM3F1ZkI0MVlWNkU4ZWxaQVJxY1pxNitsNGtXTWlUcEtiaExFclV3L3EwZm9Sa01TQlRIbkhtVFYzbWs5bHFGQUdWQUxZcGY5LzdhbGprc1J6TTVEVDZUSUdEcisvVGRLeDRpVWFPYUF3VXlnMWZER1pXUnh5QVA1L3FENkVOZ1VFS0NXNlZiVnpVSm5OOVNidk4vQWtjNERoTWZnR1Jnb2xucnc1ZUp3SXZKcm1tZ2hKL3dpRG5LNXo3M2JtaHdQcmNmZWw1Vjh4QzUrVldneGYxK003c09kay93clF6d2ZjeDRINnRVV2gxa09BNHVVNS9odGhMYTdFQjUwNTVHZmdkaWhCb2FxUFpFbHBvbFFQaTRDdHlvT0tpVHBDRUJGYUlpbk1qOHpSaWRaZjlCK2hIcXdSTWhoeHA0cUUwRnRDR2hBQmxBSlBtWjZLYThkVXpMdGNlN2J1STAxWmw5bmxENkwyRXErR1crOXZtanpaK3laQWhnZmVPVnkwTk1JZ3RlQ3hsMTBFR1BQZWpWVXU1bHpqSXFPdGd0cFJvSzArWGlMeDZRbVZyOHhlNDdsTndIYk4wZ1JRYTNHR0I1MjllcjlLcHIxVzk3dVY1N1JqbFRvaXZYQ05pUUxWWFpOQXIwbkxoM3QyaDl3ZGpIQlJvU0lGelY2TFNjYmY3MWZOa296eFg1OGU3enE4eTBSa3ZQV0lCTkVOcE5DUjU1dXh5K0FNd2VwSEZJTHFvYks5RW5LWmh3a1k2K2xQeWZrYXVzWk82UTN0RmRqWmZ2QUZMbVhPMnpnNWpESDVaeEFuSXFRaWxaY1RSN3RsT2V4OXBodXJ0RVhyNDZuT0phdFE5NWZOVmVuM1BqOExMSG5ZZ2htL1dFL1BZZlF3WXE0ZEZTYjh6NlR3RTJ1N2o4bW5kZm9PL2ZmMmFzSjVTeFVCRjg1b2NRVkw5MVVVRG9lV0FFNTlXc0JORjZBSjJLNzU3eGdNMXdqWGlVemFiMGFaNzZRbG9PUVpSdWN0Y1QzcnpJbkM0N2J6aVNrN3VLWW5GRllselpSNXMxWThkQjc5U2F6Ui9sUy9raHFVbkY5WTkyL0pYQU9CTWpkZE5ndDZnRGVlNndoMVFFaWtmUUN1bEs0bzQvWWJkbSt3TDYxWUF2M2tzeklrZ0pvNVkvL0xZQU05NzdxSEd4NkI2UGFIWlIxLzZFZ1NjRDdOTmg3eEljcFo1dW1sUTZQOXNrakgxa29GRDhXNEpEZzErSWdCRUlYU1hBRXNkRjBtYWJFdW0xTGVJWlJRdEFibWgraFlCaG1lZ2pmcTBHbnNmWVp3NGxZUTU0b3htUHdZK0xKUHNkU2xBcFVZMG5ZaGRuT0sxSlEwRElha3htK3BmMlk0NFlHT2p6WXVvRFFIV0lWenFXWmhiSkRQd2JMREt3NjFKVllPQm9acFF3Q1VUdE9VbDc3K2p4aVlsNnhIck14WHAwU2dTcy8yNEVJb2FOVTlwVElBRDBhRVQremRGTEtRT1hKNXQxNTdTam5COURBL0tNYlJjWlVVYWRlWC9YZ0cwSEJKYlpuTGVWc0g1T25jencwc3FhNmxTVGg5aWFoYmJ4VkJCQ1YxVG4zNGk0bytsaXhTZWsybWIwc2RzUExiQVVrWlpKTDNZVEZtSE03Q2R3VVZEczlnbHF2dXhvamVKL0R5UkplOWw5MWN3N1BjTVlwK0t4UUhqb3cyWDJRWllKTjBScCt2NDJNOFphaW1Edkl0UktsR3E2RzZXYUZtcmpXRzhNWkh1aTdSVE5vRGNaU2dhWGpFVmJ0TFlxY1J5dkJobnd2a2E5NTdGTW5ucCtlZnBvVVROZU5WMnpFVXhnNmlEMHpRdG5jQ2x3NWlqWUlndE9YYytSVVNCbWxVOWl5ZEYycXROZW50VWFWQ1NrNDNpdzRFMG53bzdKQWtMSkkwVk5TU2NPeE40ZTh6VnVUUjdNZnduZXFMcWQzN0owNktNMGZUM0dYL3Q3T2JrNEVEOTNRdHNDK3A4NHFKelJXelZOVUhIcUh1Z2hZV0JMTXo0RGMvd0w0N3Q2Ukcxb05WWURSNXIxTndQTUdmNExOWm8vL0NSVWpGZVVCVVhUTXZZcTNPYlBkamUzRFFtcGVZOU45UFZFMHpUOStONHcxejNabFE0bnJXWHd1NDNyTU11VllRUkpwMUNZSXRaZFNzWVRiZmZ5UjZqR1VVMFhSZWxyYW81V2UzTTl1TCtzOGdwNS90U3hqR2l2OE5XOE9DSWliMjYwVzZjbjJpYUVCbUk3OXBEOVhtb3FyckM4TGFVeVdlZmYwSzZ2VUFMUFk5YzlXVlRoNVcwVGF3b01aTEVhaS9rTnI4WlBPalhBMEJiNGpUakR5NW1hOFF6OFVPR2F0R0Mxdlg0Q1krS25IS1d2WmFhb056MDNIaGxQL21jbmc4RWp5TjdERDB6YVJOY1lCTnZMOEs2eG9Wdm9jOFo2SG1GcExwR0FrUFlyTm1xTTcxa1dURUNqRG1nSVY2aVRnSWl3cGcyVkhyZEw1RlJ0My9QMGdpTlR4dDdwNzRPTGpYQ0ZjeWF3c1QyUDJCRkVxdkIxZGxUZ3pJVXdFUWpMUVhJT1NZMTEvUlRFcGJ4c3V5SGRDZ2xwZ1pYa3J0V0xKRGVUVnVpSmdpOFRodHNzZjRnc0xIMEV4dmQrbWRiZ0tiWjVyclc1UUo1c1BKNVZ0N25wYktFU09VditLQTFqODhaSjl1VUFsMHgzYndGVFMxekdyTE84c3ZqTFQ1VVZ2bmRrQkZLclFVc3RKbUhyRE1UdUpqdWpmRDhuTmZ0QUZYRWFJaDh3Y2JIQUNwWXdvMmQrdXBSRGtoSGFEcDczVlFxM3d1ZFpZQlNLNERCSUJGMks2ZXJnL2NGcjBXSFBDL0JlcGxldWNNTmloVm9nSWlKckYxd05zRDhVSGNmVzFqZEYxTjhDdXNiNzBDQ2pzYWcwaVZsQWRsYlJqa0wzWDhPWko4b3BxVDlJOFR1bUorL05CNmdVMjlUTS9RcHBMQ0tHNitnNUJIMDlIWE1mNnR3QXVOVUV2a1NrTk96d1k5UjVudjlCcURVa3RNZzErT1hHTjVROWFiQVhXNFJEaFcrdzdZVkxUTFUvT2FNY1Q0K1hwclZTcUx5cWJMNGtuWGlBbWRjdEE4YXIySHhuS01nUmtkUWNGSlAxZWFTWHhZNWhrVGZJSmtqcHJlOXMzazY0enhEU0RuVlRvSkRDTHNoZlZjclZIVE4xYnd2UFhLZTFYdmd5eXdFN0E2QVBGaWRDeDQ5am9QQk9ueXU2SVNycVcyUlhDbnFEWHhsWXJ4VlgrRURRa0xHdkQ0eVJaTVNlT3VvYjZCUStiSm9pTlppMlJ3T0tlNlJadWtCNVZqdm5zMk9nb1M3Rm9ITlp0bkFyOHRLZ0hQOHdHakFpRXJMeUc2U2JDZEd4RXlmbTN1NXhxdUZ1Y2JVRUxhTkZNdURNRmFnUVVqTWpnWTlBcXpLOHdPN21BSExxUm1uVkl3b2JzdU5QVGZCSjdOU3NkL3JRUkF5N3pLSjUvcHg2cHNHdlFWbGdlYkdFQUltOERPcVJaRVJaMnhFYXVhSEt4R1hja3NTN3hmb1g0TGhwZy9uQjZLUXZuOVpnV2VJN1V3N0xqeVNqR2VEYkRaMGtaV050UFdFNENUOUZ3ZEJHcStYL0VHZlRNZ0R4Ujdla3p3Wjl3anVpczFiYjhWSnRFWkMxR3psaU1oZWN1UzZDTm1xeVM1SEthTnU0VTNIa0t1dzgwQWZOMFJZNHR0Z0xpdFFyWGpPaGV0N0lUcTc1Q0VnOWFXNytvNVFxanJCcHdpbWplcU9Dcyt4cTdPWDlCMHRiZWxheTdsd1JJNjBueGovTHRiN3NvWFJvSEJwVGtuZE12R3JlNkphZmVRNk9WV2dhWVI1Y2Erb2pXUDYyOGFrb1FMa1JVejFXamI3akZESUxERzIvMWhVSGxmVkJScUlGaThSMHlqaFJsQW03bStPVW9qSVAxSnl0dlpsNGZCa3JrQ2NyU244MjJUaEZraXN2aHBiK2VFNXNhd3hwdWs5T1ozeWpGNDNKTWJhc3BNemUxeVc3Y1FubHIrTmZHN1FaQi9maVVhTHFPU3I2SFZhMXEvd3ZEQlNGbFVhbjAxc0FsWjdBRXZ1bng1d3RqZ2M3clZ3eXVGdTA5UXNIaG5vcHJuajEyL2tpMEVUSXBkWTNtNWxtQVo4aTVObUJqNnRGNUlXVTBjSENldUlBYXBCem5WNDFTOURzemVldE42VlhEeHdqODR6QUdJNUtSVzBremRCaFhGQmw1QzloNU5JNjAwRTdNTS9sSzl0RmxkQlVqMm8zUDJZd1JsRlhXQ3pyajAwdnFla0tEUEorZUFKYkRYcU9CWmRYMlFrM2VNWklaTVJJaHJOK2UyS2hDYXBaSEdVbW9DNmFnQzNrU3J3WGNTWENOSFF0eHNZb0loZTR0UWF5b3R2UnVYWTlrb3lZbTJCb1BodUVKY1pMZTl3S09BSi9uSjNweTBGczI1dnZldEF3SG04REV0VGxNYkN5cytnM1MrZVZwOEdPY0lGb1NGNGFCUjdzWXVoQVN4RzJPaTFDY0RhazE2Y1RLenI4OUUzZ3FmZ2R0bXk5MCsrTmxvaU1wbFIzd1pVc1lQOHN5N3Zoc1QzYlZZWkFKMzNKaVRUY0NMNzNuSmlzck1TdGc0U251ODZ4OEdIT3lzYjZWM0lCbmZsSW1uQzE0OFpYNGdDUGF0TmswT3BySjJCeldRQTVwS0NORktmcHA5djVuNytIV2FoZzNzV1ltZE5yalJVQmFlYVBZSktxRXhHVFZMSmRBenFDdFNuK0U3N1JXSWprVDN5UjhVNjcxNUpYS1I2cUZRRis4UUppNXhrMGs3Ny9hMkhqcTl5N1ZmN0FqbE9jOEZIb3ZUekJpNDhFcXFsQjYxditqRkZRZFkwNitjNCtoWVEzVDFCSWRRcUltaXZnV0hYWUZhbzRzMXk1cStRTUg3NFZ2N2EzYUg2emxrcmR2QzB6UDJXeUZGN1VsSSs4Y0huRDVIUmZLZ3Fra2hZT2hNNGl0ajJKQU1EZkgrOTBXUElRWHJUOXBpVlFCajlqZXFHQ1ltMVRvSlduNWhmcjJWN0YybVpkNFZqMUhxT3FPTFlsaDUxN25qWWFwRU1PTUYrenFqOE1QRHhqSUw3SDBLcUJNcldxVVhYaGM4SFRuSnp0Y1pua3RkZXV0aFNXZkg5ZkRITlc3RklXTTdodkxpOHY3THZBaWR2K2hmTFRTZGk0TnNzZDZ4RklBZEJ5c1dMQ0xub3R2NmZpYXVUL2lSVk9OU0FSTjlwNlRXR3BKcm9KYWsvamsvVHR4ODdmbmFBSXN2M3hYT3hrUXNmY3RBckk2aUtxSDg4Z28vcEJENEJoSEY5OFJlK1doZ3ZHVUR6OGo1a0ZiTTVaWTFPUktXUktOVWpYdnlkYjVMOWJMcGRaVTVjMzROS1NqeUYySnJCM254MVpCRXM5cnNoZzVsK3pFQkZpRE04MTQ5amY3TnppaDhxTndndkkzcVFiSkZMRDBlQ2tyZUsrV2t6QW5SMG40ZzVUcWhrQ0xTK2dmcjQ4Z1F6cG1sTGhqUzJ6Njd0SktKYTZmK1crSkIyODhyK2YrSFpWRGxzeUNtNkYrS25MOExWa2VvV1k1YXFJanFHeHVzbDIwWGdINHlCczljZFlpNldDNUdxSlFaVFRVZXBndy9MR3h3anE0VEZQMzVucE5TbkdtdVE4YkpyeFJkWjBmbEhMQU93djllK0pvSU1NOW1qWHdFTEtWQTdDZkJoTXJMM1hBYTQ0dkw3RklpS095VkF4SklJelpoOFVRZGtJTlRQSm5iRmFBUTl3cnk1T3pjRUdlQTErNyt0L2E1Q1dsL3FuRGFvMzZwR0FLc3R0aC9NdkNSWXVVUG5BcWlSbG5SalF4NFNnRytwVThEa0xFQldWMHEvdDRpV0d6K3haaTFvQjdPUlluZm4zSjR3bVh4aHdwczVVTnNuYStYb0phek42WDBKOGF5MUpZbFhiVXFmY3ZUcllrWWNULzFIZkZHaitKWlRNdzZwSE5pem1hTEtLN0NXNGltTXphN2xhTktKQkFIUmh0SkxCK1BkZWpXNmc5MnpzRlhJOWZzY0gvQkZuTDdkL3FNM0tzclBPNjQyZ0xpUU8rN3lTT2JNN09uNHU4VDRmWENEMUEvYVZzS2tSOU5SUkRMelpNRitsNTdOb2xnSlIvdEw0dlhLVTlmaVlGaWl6TjhQb3BkYnRNTzAvSTRYMUJqbHlRQUxPTjdCZmxGWlNZOWp6c0lBdE5jN1hNRk1idHNaM3ljeHFEYmdZUDdoamIxSW5vK0p1WTdZb1U1REhxREI2ZjJzbjhNeHFRYytyR3Z0Q3NqelBQd3I0bjN4dTJCd2tHS0MxMkhqc0tUa1NEREQ3TGRobDFzVGFRM3NTMDVINXExYTZJTDFEbjgxblNDTTk3V1NURS9UNkgremUzYXV0eUNIMmZkNVN0U2ZUSmJNV0ZmbjhkcmRhekZUQnUzWDlGeEozRGhrTElWeG1UZ1lpcUJLd3ZuVmRYSXdBSCtJbXBnK203ZEl6YVRYMDlSeVI4OXNhRERBYzkvV2kvYmJpbVMzTG1iaGxtV0pvU291WmhZTUgzZFlMTVNmRTByemtEZktuQXVGUDhMdVhUcWpVTVZYbUx0TzlKdEp6UHdLSDI4bXBTOVRmUy9lVHN5Y2RnRzVKUlBJaG9OMHg1WHJwZFh1cXczUVh2d3FSZTgwaVJET1BBSWxOTWx2MUZDd0dSV2xwaGRhdy9yK0ZzaEc5RE10dGVPRHJ3eHdkaXVZVWxUbldpbVYvQ2FIVEpiblFCYWJKMEJUSUZuY0l0bHppL2E3Qm4reDJmRnZ1bnZWTTUrcXJTbUNvNzRVZnAvTVhOdXVmYytsbHR6TFdOZFhqUlZkdnRwUkN5K2xEdTlZV1JQOXJ4T3I1YXMzekgrd0kxWEtiWXdjckEvODI4R3kvL1BqaUF5Z1JQZjhzTEZmVGV2UUNJN2hJaEhwWW41R1dudWR1VzZMek9DNGQwNk9uMVlVVUZVM0hyOVNOM0tHMTdvaDVNclZ4N2lkQkcwWGZLcXZzc3ZkY0g0UDVZQW52YUluS1lOb0luRTUxK3Jia3NBZDBOUllvcnNYZ1JGQ1ZYT1FiajFKczlhTkxQVXFTOGkwY0ZVUGt5blRZR2Evbk9vRzlCZDB5em82Tnora3NCb3UxMHdKYUlmQUlyN0w4cjROaXpZanRxdWhPcHFMWWlkUlR0c1hBUUNkT2NqK2tCVVFsQWI2Tk90bHd2Y2RmL0JXSmlzRmZmdVNjVFdmbUgwMlF6WXJWNkgvZG9OOFpleHN1YzVYYVJXSnZYZDd2UzluQkl1RWRZbThtQkw2TUpOVnduZE8zV3dPekhOUmlPa2cvbUNOOXVveDFETFo5OTIxeUlPUWZiZTBOYVJidVRnd2ZjcFFPSlpHbnVOSjNuVDVCbzh3MG5CVXBOMGthM1NwcGZDWGNVOWZHT3FvanlqRTVTZWJENVN5UDRQenprTGtkaUxjTGx4eVhKbURtSVN0VGxuZkcrV2lYYzZINThSaFlqckc3V2U4U0lPRGZwSWsrZS9Mbkh3SW5DYjYvUVJkWmJYUmw4eG8yTjFlQVJaekpoVUplMWJYSjY3OXF3SGhpSGJjbmZqU3pLVkRsenVSaDVaZXVyOTBWT1lLcDF0bTZsdlA2QWdyMWtOK1hvSXV4aWdENlVnaTJzL0FDbG96Szc1Vk5ESjNEdDlEUFlqRE1ndnJyaEN2VlFXUXdHUGd3dC82L0pGdHdjbnI4VDJVOWhFVC9HMzFLQThHLzhkeVZ0VlZWNE9JL0hQbVV0aGpPTHM0VktYTldPNTFCUzJSV2VkTEd1cVU4S1lSWmFTaWc1TmpqWWtudE9TcDF0TkhaOU5SV3dJajBjNmtPL0p2ZW9HMXNhUlJ1RWE1Y1ljSUUzQWhsZWNxcElRR3dkWUw4SXVHd1Z1Y0xNUXVqbmMwY0hGUHE3dVRMTmUxRlh3VGhuTUg1VGFRdWpVTXhGYzc2OTdkS1ZFbUJQM1J3QlQ0WHJ3U25vajcrMUdjcWJ4VjU3dkN5cTl3cWNtRlZpdGsrUWtXZDhlSUhoTk5XQnRQeWYvTGdSek8yWjVKYi9uTjBDUEI2aGtHanBXamRQWndNTEFZQ2lQTExzSTIvcFZIRUdJcldqdzdtbGtBY3hhSTZ1VTFCWml2dUQ3a0NKRnJKWkMyWDZaR2RKM0htUk15SmhEN3dkVDVVdHpJVHBmYUFqcmc0ZEtPRnhuVHJMZnRvRFFBUjdjTUEwemdJdDZIVWNXcXZQd0pPbUY5d3FYVkZCcVhtd01pOFE3Tm54NVNIQnZJbFVtOW9WZm1LQTJMNXFEZis3RXYvZWthTEordnhaV1BtcHRZTXMxNWhHUkxlenloRmJXQU9ocENGTXlJYU5LOFBRQkNadjErQnYxVERhWFBmM0tkY1gxell2eXE4eDFhTUo0VXpIZGZZWFZaei95WXR3NG4zeC82MDNvaTAyeWRQMjdPODlRT3ZJWlY4TUJVQ01jczNxVTN5NTY5ZUsyU0djN202M1lIa04rTWxoeXR2ZGVSL0QvdUVxZnIwaGl2Y0NYMXdLaEVJR1NaWTMza1MrMC8yTWxqSnpObDZpeXJKMjEvZmtHdEZyZHZKckYrbm80ekU4U3plTzhXK2VIYzZmK0dmaWhGcU9DYStoekV6eENRbjlDMDZzNnFyMDJ3NCs3ZlkwVzBwVDBHTFVyeDdYZ3FCK2h2SG92dU5adC93U3lyUnRZSlA0S0VMV2ErUkJWTitEWWdaeHJLWEJidm5LV3VlcnFaSHpiRVUyVlNXQXN5N0xCSllCcTN5UElXSGZ0QzNRYnNQZmJqMlhzQ0YrbjMrQ282S0ZvMGJJY3NDaC9RLzRlUlUwb0pJMG1CVys2alR0SWR4STBTUnR6VkxaZEdwaXYyM3JyNTNXQUlhNUpIcFBtMmxLRWx6dTZaVlBuMHc0NHNPeDVBQXZQaWdKZ3AzN085N1RkOEZSY093T3F2WmZ5WG5vd0hKcWpFR3dyU0RVQWVkeVA1ZmFwZGEvb1drVEJJbWVIRFhlUy9DbFpFbzBSZVFYS25FbEdLVlZkTXdxTnlybVY5eFFaczJkZ1FtNlpoOWRwN0tmNWZWTmJUUEViY1lsaFdhVjNFWWE1TkxFbm5nbmdBb1U3eTZxbEszQ2lSZnpCdm0xZmpVQzRhb25XSHFyUDFDbVZTSEg5eUpVK1NQYXc5QVdPTDY2YUd0bkdqbEgyNVVnQjVpQnN3cnZhblROYlFLVU53UUdlQWcxWTZvREh5Mk1VZUJaN3ByY3NKYkZqVHBlQzNrSDVTeTQ4cjRjZk5XNHpNWkxEN0UwWEgwTmNxNGFjLzBCN2hyRFZOTzVvME5iYVd5RFhMVjczQ1hkNG5rRlhhZmtRb2FLWEIrOHVkckpHTkg0SDcyL1YwL29oVnBvb3pnM3lCWGhvRlE1dXA5WXVqWExHdHpZZkw4dWt1bFZERHJrOGVaQzFZRTJha0d6czdzYmNzMEQ4OWFCWXRYYjlPOVJtSW91bDJTajRaWTMrM0FHcVg3ZlpTczdnY0NNVjdnSE9YRGJaMjNFS21Namw1N1VqRmNSQTg4NncxZk1ZMGlBNkI2aWF0U0JmOFl4SlFWaWh4QWFsVDg0ZXhHSVROK1ZLdGUyOFB6VVRVRURPbmZZME5jN1RWWlFpVjlpemdNcHk5bmgzYURET0pFb0VyM08yRXgwRGVhVFMrdW40RW1sdVFVWk9tNTZjbG1ZM0NHeWU1ck43V3pLNXRKZHAxMm80RjMrQU96bCs2VVh4VFZHdjdOenllSmxPRkVrY0ovQTVFSXpWYnJNN3Z1SFk2L0J5WUFjcWpSWk1vcnJLNEcxOXRyQmRUTUczbnNrbWZUUnpGRmRrMCtkbDNEektLU1pyZzhQNXVHdVZJQVp4cVl2YmgwdXpUUm9GVmNVSTFzbVZId0s0VTFwSDAzK01YZWoyNitNZXRTcFQwOUZFYWgrZUJNUXdYbVVSU3l5dHJMN3RGdHFLTmQrTDVBa3cyQUN1NGVDT0Mrb0pseFVWMnlYZEdaZ1N2Qi9VaXJ2azhta1pQejhUTXJHcFBpbG5NRUxDZk9lSmdSUTBXQ2R6enFRbmViMXZwWW56UWxQaHYxa0ZXbUdsKzY1Nkp5MmlackxTVHdCZnI4Zks5eFc3QWRMY0dIS3RIVzh5YWVuc2RSQ3QzNm9vTlNwMFNzUEdLZDZaVDVNaXFkeDczVXpKMFBRNGVMNFQ4UEFZSjdhb1h5WjFxdkJZMk83eENka3VQYjNxdW9nMUNWL21oV3V5bW5Lc05FZmVJelFqeSt2c0psRlQ5STFRRlRZK0pza3dVVDJKaUMyVTN2d1RPSHgxMWN4dDd0akhIcnZydEFaYlVWa0F6eUxybWJOS0ExcjFPM3pGMWlzWWxJTEF4THdkMjZzL1h0ZllVSDMyVjNqNUY5QmR1c0ZtV3RlY0RQU2VUS3AzL1dTRnZXZUN3NU9iZEoydU5IZXJ4NllRYll3Ty9XYTd6WHFHS1Y2VGNnRisxbXhtTDJ5S2FjbTBES1pBaGpyc0dBZ2ErV3BpZGV4aGRzd2hBbys0dDlPKzFGcy9qZ2Q3b0xmUFgyVjQvNWY5MXhWbnVSYWlzaFAvTklUclo1TndTMVdWNGp3OEdmMXRndFhPQVR5VlhtVWxEeUxDRFZlbTRDelZ5SkdwUDNxRE9CY3h0N0lFQTM3ZW9GeUZKSTZqNHBVMGZtQVZ1WTVwaEhUNTJQcVNyQTdoUEZjY00zeHpCdFN2NzUrU0dRMUdBbUh0TFlSZEtIdUJHY3dlWGpXOXlDeU5sWHo1Y01pdWdETnhDN3FrVk51d21JbzN1WUtYUi8rSkhVUkZOVk1YU1BrNHZYWmE3bFZkQWwreDV2VElVenpXQ2FTYjNIWXhLdG8vbzJvM3NDQW83OGZyVDB5KzUxb1NjQmF2NTk3NjdDcVJyaTNZT0Z2U2hMcHJGOGpoMEF0aE1STXl5cUZHVE45amQ3Y21RTUVtSGxwMEtHQzk5OU9ydW1JY2tuL1NWWGFJU0liQlRiZ2pxdUdVZnhWT2hqbTZ5bno4dlI2cHRMdFowMy80TndlYmVreDk4cVhkSWlIL09udEdySXBuK0Evcmw4cEdkSHkxTGtGQitWSlhnYUk4N3hVU29od3lhUUU2b3I2OGhzd3RoMWd6VHo1aVM5d1MwM0NiQ3NwTkViSHpWSmtMeG1ia1U4SHdETUJRSDRKU2NBbTlmamFBbXh2QXpGTThBb1dScStPV1drM2FrNnhGTWlONGluVVl1OTJ3ZU1EaHg4akRZb1didUZoR3lKeHdCUE9QdnNJQWRROHZ1NHVYclB1bUpxcUxRZmtobEtKc3UrTDh4Q0tVQ1NtUFhqZkIzRkpTclRzMzFTdWV6bGFlVXRiNmF4Uy96L1lmTElsRW5UN0lTWVc4Zm9MRmJOVnYxZnVLZkEzQjh4bTM2ZXJUMG5pb3NxWFZ4SG5nUUowZzBhWk4wYkloeEZmUTB2VTN2TjJuRWtXRGsvMVdRZU8vTkI2aFQ2RFpiS3Zybmllak53Vi9xMDRrSlhlNWZjVGpZK3ViMzRuQ2FyYXVPQ1dDMmN0SUt2MFFuV3RKdWt5S1ZvYmtkT1lwMWZpM0NVN2wydHY0bDFZYTVRVlB1a0tPTnhnNVVxbklOT0poZDlsSWJlVktYOVp2TDdWczBRVk9FdXFCZ0ZMNWptNG50QURNRTBxVlBxb25ETm5pVlRMM3RrRC84SE9hM2VMRFJyUW5wNldnaUNNb0RsYU5uTW14dkFJMjJtNFc0TVd1cEljTEJpK3o2eEZWajJqRDJzaGttQS9aZDJsbEdZemg0WGpKck5vQkFHY2psa2lmRXdOQmtCM0lLVXJPbUVaOUk1REZ5SWVkb1RuSHhUK0tqdVNNaXduam5ReFllekRueE9BSStSdEZldU1PYW5VZDdOMDBEbFg3d3BJMnBDYVhyeG9mUHpPZHh1QXNIcjM4aGNObHhwTXk2L1NuL3BvenZiaHA2NXR5YTFTMGNuMXdGWjdmNjFDNE93bi8zb1p0VE8yQnNUTkR4dzY0WUtqbTJNN1pBRkRvbFdpQmRmanlHSnZjaGkxM2RQUmh4Z1haYWthYTNxQjgzYnJDS2hCNit3K0VkKzNFbkxXU0loVG5DT3NwcmVJSWJYYXpJY2NPaUp0U3pzaENGT1EwQ3FhTXJHeUYrQWV6TythbWVSc2g0UDF2OHZrOFBWVjNtcFJVNmJjcE1EMlhvZ2JFSklQamphbUQ0ZTJuZkd6NStvTWYwL2REb0ZIZEZuKzE1SzdjVG5sOXZKOTN6cTVUaG00aG1NakZpMFBmUnJjNjR2SWFOWnlSa0p6VGxMMW5DWlJkUkl0aWcyTVA4Y2hzSnM4dXVDODdXSnZ3SXlSWDZ3TlhJakhhdlBzeDZ5Yk96cTVUblduWHo1akpaK0VYa00waE1ReVdKclROZWcwSFJuQ2wxeldBNkEzZHZvMTBWUWJRMGlQYUpwaU51OVozb0RPMHd5MnVZdURncERmUjQxM0MrbWpZVWJLY2NhakVVQ0NPazZRaisrZ1VSTHRZb0N3MC9mQzJiYVg4bHRWbTF4ZnBVeVF2Y2hHcjhmc1dxYUs4eFdtbC9hbytDaTZuSlJtcGxxaSt1czhVRnhLbzlRbDBrSmdEcWt4RDhxbzFlNVRDQStNcExQV25GUUxESFJpbCsvaVNuTUZBRGVvWE9VdGYzUGFMQVVhT1lOdUdXVUhjQ3FqQU5yWkRyRCtLRHRRQW9uNFpRRFlrUTFBd0VGRk9oWTR5aXcwci92Uk1qRVBlTlMrS3RXay9wdkVRQ1VEc0dIT1Zoc3djdFcxdTU5UTd3bDd0ZHAwa2NNa0RhQ1dkZ0xKWDN0L3JCcG1VTElFeDlPaFRTYkd0Z1E2cjFKRzdoQXVvcGNRdExFRGhJZmxBU2luMklOTUxHUkh6b0xwV01qWFAydXNMdjNMSy9Xb211RFd4RWp6eGgrS1doZmVaVVYwR2ZOY21RZHZrQTc0b0NzQ2ZmQStjbTJuS1V3ME1uWEMxY0ptYlBncFhwbkR2dXRBeERwU0JHV0NCT2NScllsOVNkK25HWWZvSU9zT3Q5dUk3MkFWMG9nNVl2MnJUTVNMUUdXSWFxblMyQTZYWGpSU0tweFkxWDZWU2twVnZ2L1NBWmVIUXVCMTRvREE4Snl6VjVYTU9NUFVxZ0N1Q1lveDVEb2tIL1RUeEJiaGJrSmk2ekNsNmZvb3FETnFoQmNreVNvbWVRVE5OVjlxR2hrOUVVUXd6L1VGODZ4OW1Pd3c1dzhEYnBzeUpremVhVlhKUmRndW1sVFNLbGxwcXJObHZrSGMzZUtpWmVlNXNnMHp2YnA5a0VYUlpLVjExdzZvY0NNVGJlM1RQWExUN1FpSUtXZnZUWTU3Vnp3WC9GMEs4WlUxaW5JcDNodW5WQ3dZdlUzSzBZaERpZC9qS2xRM3BocXR2aTRpUHNERUlsZFNkQTNWSWxiMURCbDZSRW5PNHEzZFhRanRDUm42eUNhL1JjQkxTeXQ3T0gvRXpwZktzTkdsWTNuUGpqN1MyMFdHajFEV3hTRk9oNWJtS2t0ME5oY0Z0SnQ4TFJtS0RJNUhkYlZ6Q2VqYzRDL1hMUk5ZbGlJc3hKZEkvWXkydVE1cDlpa21KcFFhQ2o3bkxnUGFraFlXSEZGYnVyYWVVWlc0Uk4rcHVOM3hJSTZRMjJtdk1SNi9mRG1ReVBYNWh1WGdYYXhJWHdtaTRpbjNzUkEySXZzNlpyQ1QyOEljbDhYcnFHaC9MdjF1OFZsWWpORmxBZnRQbW5MNlNGNFNWSmp5cHpYMkR4SldvVzV5QThrUWVIVFVab3VINXR4aDFRYmV4VWpuaXI4YkJLZGlubkNWZ0VNbEpKaURRc1ZJZ3pIdkhZSG9nc0kvREZJTkc4VWthWFFXMG9nTVdTRkRFQVp2cFBKQVRTSTVXUFAwa0V4R1NwTzVJalVGdEszZEY4dnI5cHRUa3NkVnlHOG11dzd0TWUvM1BvZkFvRmJhMjExMnlyVC9xR0JQcnZaMDhDSU9OMW1DeHU2b3lKQzFucXRlcVcwSlg5c1R1RVl3R1NqQU5PT01XcEl5QmQ1eklDb3FFU2Z6WDk4bE1EUWlzaFlGRXllQ2VkNDIwRmsyVFpWUnhvdXlncWlrTHhPUEdKSHFlL0xjVlc0ZVhVbnJVUnVhN21mU0QzUVBhK0EzWlIwU2lzTEZGdzRObmlPTFBVTkRHSEcrWUk3VGZlc09Pbk5tcDFDd1pkeHpVM2RvYmlOcUl4Ny95VkEyTUJXZTN1VnZ5MXZqL2MrajVpdkxaVU5EQXBKN1RmcUFzT1phVWZOa2FGbGp0dFhvVkxNTWdRYnpJMHUySGUwaE9aUTRXMXFWa0ZWejBxeVRqbXNXUlVwSDBYZnZuODVPSEhWVmZlWmdTRm5PSDVGbit6dlZkYjF2ZzdublM1ZERWZlliWjhybXljUmlHczhzSEFxRzI0Zm1qRGxiMlVSZVdRN0Fna2RaeE5GZ3hUYnRmZ0YzdXkwUVdHSEVuWEtGQ3hsOFRhTEthTHJtYzUxWHFiS291c3lnK2E5dVozL2RPaEdJbFRyS0llSWJWT0l1aUpZd0w4N243MjM4cXh4VWhLTE5NRncxWVBPclZKcGx6YkFDTHdMSkN4RWRjb3hTY25FVjlCWFVCKzYxcHFIaTB6TTc1U1pHNVZ1YlpLWWlVR1RvbkI0SGtnbFA3VFd4aVVWRm1ySnJBalNYaXN4a3BJZUxDaUc3a05ua0ozY0dRR2JudHZ4MVlKZy9VYTZrRkJqQmJlcVdoOGJWMmFSaXBrMWFpditFK2FjMnRxK0t4ZGw1dnU3L3hOWWFwM00yc1dJZk9xRFBjaEF3NzNuSlJORzV2aVZoWExTZE5ZWUJ2UFg2Zm01N3BiUjIxbWtxMWRaMXNLZk5xYnRyT0ZjQjgvaDExSDFNdWFaTzdLR0ljM0xwajRQV2pZQWdLRTVCTHo1SmVvVUtxYVYvcExyUWdPc3lYT1QvTzV1dkMwT1VHcEdROHV3V21FNVZrQndwOFRqclJKL1VCMEd5alhXd1Z4UDcvc3NwYWl5NzA4SnZJQ0dVMFN1M202R0FPU1RxZVJabVptVUI0WjFTdFplR1Z5UzZCN2F2enhKRWhESHBrZVNEb05VNGhBTmcxcE9EUmEwdDB5c3c2TE5nVHUvWjhDU2dna0dpeHlEOW5kMzlRVkdFRHE5bWNQZ2RsMkpSOFlwbDU3ZGR0NWphYnphVHhsUWRNTVdiWUR0cWd4YmV2SStubkp0Um0yLzBPeFplSFptMk1QN3FYL29iOVRKNDA3OXZjQ0RBNUpLblNRQzBlcDdpcG9BUFNCb1dzMWxYRFZ2MkluYnJHbnpJeU5lSmd5OGlVRk1yUjZINnpBMzhMNGYzMytxSjFqb0JHdFRNRlVHcGdXaHI3ejN0Lzc1bDhIbXE1bzdkMGpMNDhyc3dDL2dvaXhhbEdsN1Y2NzZSdG15NUZQeittdy9PRXpIN1FIUkU1K0J3Q3dWVVk5TlZxVEFGcXk0cWlmVFZIdEJGSUliZUtHeDJEMmQwSFlZNmdPb1NrdUE4cmJoLzA1UnVOaXU0Nm9talNwYVZQVUM1VXZPMTBLUGpZL0JxcU91UDRTbVhEVXlkVVFDV3h5KzZyTEFsdUhxWVdaSnIvREY3aEN2Skx2N3JpKytnNzUwdEJXUjZKMEs2YURNd3o4T2g3V2hGNmIrQjlvdHBOME5vQ2h2Mk5lVEpVbXlhbGFqVDRqS3Ayc3V5SXRRMmNORXhJYUk5cGRLMW81aXo4SmFWN09hK1ZyR1FZNzdYdlU2cTdySkJ2ZktNL1p3Q1RvVXJPQ25IL215c1BNYmJ5eHdXTXhscUJuOCtQcmlCMkFZYkpxVmRPV0hHcy9NZURmMHY1VWwvVXhDQy9JRTB1bkllNkk3UklOM05WUmtiUFpGODNrK2oyanRxUkU1M3dQQ21NdFljbzczM01vVWh6UktwV01wYVVPcFIrUXZqRk9hM3M5bDhnZ2pBYTQ3alU1ZnZRbWUrMHNBKzVIN0dOamdpYkNzazZIQVVaTmhIQUZPdkdDaTlPeUNHWHA5R0J2cTRYdENJZDVuQjRwVDZFZlFmY1VIQXRjaENVUkpYcnRXWjdpcWp6ZnkwNWtPbkJMb1ZCbUxGOXJnVXRoWjU0VWcvSTBmaFJCekQ0dUNIczdxOFlmaXlVNjBvOXB4RFdVR0hOZkREcGxydHNhNk5nZlpGMkQ1RWhJb28wcWNJaUJScVFxRUhEdTZjbUE1MFpKcEZuVml3TFVSTUxxQWF6VStua1Zya3BGUUJFYzVIN0NrVVRWMlZOTXFHYlpReEVpOGlDRS93RDhZQUhUelZIRGlhQUJzYlg3YnFZdEFyYTQ4Nmo4bGlKT0Jlc015MnpOdE1MNUZXWWcrei9DVmNUakVKaU9DS0d6cTAzdzRKeXBCY1UxZ1IzNlQ1NUFmUzNic25hdmhIUFVyY29ZRGxFSks0QXkzSGFkYUdwWmlyVHJFYlFiU2krQlczQjhjUE04TWtONmhsQVVXWmp1MkdjNFc2cHpKLzFKK1dReUM3K3JSSkpRRXVLZ3MvUlRlQXZGbjZwbzFFcGN5TDVzUm1SMzRNUlZZL3o2bjZraWxUZlhqeTlwMDR1UDlVMldmVVJTMEg2Tk1wK0Fqa09GdUEvVlhHeGJrUmh1TFdrdjZyUGR5dXg3R0RwMnJ2bHpleFNJTHRIclN3R05LQ1lNc1I2QnV5aithNnd2L0wxQktVZjlsT1VNOXdGY1JsKzg4UUNRaFRTRGhndHBxdlFZaVczbmJlMmhyb1lDaHpGL3Z1Y0JJOHEyMzNuQ085T0FHbUJqclFPZ3VzbmdYY2JycXA2SGp1N2daQjRybzd2UlU2eHdWd29NUk5JWWx2a2UvaWZ6cTFKZlEwa3hLSTdXblJVVjFnejNoZkFORG1oblpDdGRUK3luTHIyRTBwbUtRcllGR0tHU3ZQNExFbkdUY05VbndvaDFOSUgzbXJKN1RRb1kzbHhBZFVNbHhaaEFFR1FIZVRrbE12dTBrd01wM3pjOHRmazVHdXgxN0ZacFZhL2thWlZzTGo1b2JrWHpMWk5Dcmg5YmNKNnhpeEk0cTgzdUgvbDFJaU95YzFhWFFyQlFWWTlmOXdWWk9wTnpqbWNXeVdZRXN3bG9ZNHV1ZmlkOUEvUFppbTBYcFRvY1JibVJLTWlKcjdYb3pjNlZZNjRQMnpOK3JRSndkc0NhRlZHRGpOVVNsenh3WjhlVDU3MVplN2RFZXRGTHR5TXNwM2s2YUZqMFlSYWI4NXlseGVGNUVTQmtqQ3VIRTZJZmo0dlBGSWNOT0phWWZqbkNkSWtMcWNndjN4azJEcmlpMTk4L3pmV1FyakJid0NpZUl6dHFWUFdDRTdsamV5OEFoSVZVN292cnZkakVZNGYwVVVtOWdPSjg5K044VXhJWWZpRXdiZFJLVUlyMXQySENGQ2o1SEZHY1BocXppZnV5U1pjZ2JhWC9ldis3TUpiSS9ZQ1hGUEFubGxSaUJ1U0trWVk2Tk5SQ2t2a282SE04QU41OUl0V0FTckxVSjFVYU9ZM0N1R1pzc0g4WFI3M2xBL0k0dnJISFJab2p4ZlR4ZXFKc1RHMGYxYlpkNUlzbzNyVElQMjlLbmNJYUNPTEduVzJYaXA5Vzl2QktoRm56am1jOTEwdGxUN3YwOXFHZ0kvR3hNMWRwUzJxSkVyS3VUbzV1dXBoeU9jTXpSbVBVVXRKbEI2VTVPRWtOK0dJQmlCeVBJVzQ2ZTNmVjl5T0RRMVZyVmtxRnFaQlpwWXd4eTlKQ0hQWGgrZmhoaE5TV2lZWnQ1YXVUT0FFUHBvanYrc09YS3VQOTF5b3gxT0pRTzBUNmJKTGhVY1pOZWYxUHA4MG10K3c1K0EyVWZvcm9XVGowbWJkaVB0OWFsSGtiT2hENGhOM3BOQ0o4WEFyUlM2S0ZKUzArR1ArNXdVaTBVL0p1WEtybGdhaWFjUklOMFJzaFo3S1U0TS9MZTNZYjRrT1pDdVFkd1hxRGh1emNpVkFDYUpYOUdlSVNubWRySVcyOVN2SHgvdTBML04vWXI1UEI4UkVYZjR4Tk5hUUx4UW0ra2lvWUVYdlZkRis3cW9pNThvcjc5TXZaS01aYmdEMk5NYmUrdXVEVlc5V3BYRTcrVWFlWWlIV2dLdW91QXhSY0ZxMFJZdVJWcGVsVEJxUFJoeCtidnFTZ0syMUFZeTRRcExDR1R2YTRUakhiYVFUUndFS2JFb1lEMjdiUU45MWcvNGl4d3FwZW9YM0F1V2NtbEFFUnBwcDcrU2hxVXRDRUlTbTREdEtNV1NMQUZDcDJmM3A3UlU4MGVrWXhSREhyc01DQlBGQWVyWmJiUnZtdnNkenZpbVF4cFcwc0RENGR2WkZzeXQyREJmbXlpVURRV0Eyam1xaG9pVU52MU15dVQ3T281VG1SaUtJZVl0RGF6c1gwUHBRK0hmYW5FY1B4eURoQ3pqaW44Q0p1dE12cHF2OWl3QVBHUmNaVXVZTHhheFRZVmZ2ZlBlNW9mdDkvNFZSbWM0MnV2RGVZYitrNjg0UXljWG4yMlo5MjBoQmw0SHFyUXA5NWpYaXJoYWxiRk14TVA5WHE5bXd0WndVTVpCdkpGTWZlMnhpUDQrMk5ReGFYcGl2ZWRHMzhSTVdUVHRZWHpFN0c2UlBjNWc0RU52N1VYbnExNjZDdll4L05ZcDBzdTNubDZzQ3ZsRTJXU3V4TVcweXhIMzlaMU5RUlZFNzdEcDI3U1VRRWo1c3FWVGpzeklBTmpROXVDN2VXQ2RGUHErdVZ5YTRjSWdRS2FyNFovRS9NSkhlTU5HR0xpUWNiNk5jdkwyNmZXTVJDZWo3UzN2WllRdk1FTHQxTHhXMytTWHZRZHpXWUE1TVBiNHgyU1EzV0tlRW4zdmxSazFXUEQ3bUltNFhrcjRrbnh5ZURyNGZIY3ZVNnZRZGsvbzIzSnFzcXFlRWRucjhGVFUxMXh2bFZGMFFJOUx1TG1pbVNDWkpvQ0xtaWFVK0YxdmoveUFNOE9ncENCTDZPT2hMa1NlZ1V0Q2ErbXk5Z2wrVnorOVBmd3lZb2diRVdSbEtlVC9QMjN1Qk5sOWxmNTV5MXVVc3JlOEFxQVdCai9KNmtzWnJVeWxWSGVnTndHbXlmbzNJZlBmdTBnQzE4cnptdVUrck9LbWJ4ZXVnYWNRNHIzb2hxdmVQOU9pT1JHQWlmMWVlWjdFeFZ4T0NjU0VWUmRWSW02WnJtY3V6d1l3TWp6dXZlY3VxTWw4UUkxdzJuY0lKcDBSTTZFdDd6N05Dd00walorMWlxdTh4ejdPS2Z5ODV4VzJBWUtOWGFGcUJRRzBEQ25tclBwSlBSM2JiTXlkUHpFZ21DSkpoSG9ScmFMcVM4UnBoYmc0bzE3THczN0VONUE1b2MraUdOeDVFRzBBdmdTM0ovNGVRd0R2Y3hPMkkzaXl1MGtpeUZ6NUk4RVJjZzRIR0wwRU9YaytDN3RkU3N2d21JTkNzZUVaaHRWMlFhSzRHODBvRVF6U09jWGIrZXU1SmZqS2V2YlFOY3U2UzIybW9vOEtWaGR6QVVscTI4dlY5OXJBMWM3N1cvaGhGK3lKdzVXZzg0dXlLS3dpZGtLSVRjYzd1NkxFVXFZQzNVdXlPN1l2Kzg3bnhUb01wSDlqY3FXNTlVU1RjeGRhYjFOK21NbUFIVS9qNG1rWDAzU2dzcUR0Y0lHeXpYY0UyVUhvQ1FLRGNWbDVVM1ZDR2NtdnFLUk43VTE1Q2ZrTVlJSjhwVUZJRXdiZ1h4aHV2YmV6bjRtMCtWVHEyeDNRU1ptekxOc2tMbUIvSzV0ckJCTUR4MmhDeWFlNmtGK0JTamRNOWUrOXhoYmJIRTIwQW5oRlJVZVpXLyt2bDEram5YT0JzcVpvL3BKV0xBSkI4bVVxaEZ0b3pQNVlzbnFCUGZWNnBkZXd6RVRaTHBkeTdWOGNHSXoxNHBtU0RRY2NrWlVqTkVHa2Z0MWlhckwwb3RxWTJBc2c2eDBrem5UcEE4OVNDbzFCMUVJM2M1Y0tLZzN3blJlanJNR0c3ZDh6SFBraWw4WFBIS0F1dHhwdW81UEZKbG1VdVN3RGwrbWtmS1Rva0ZoMXBFRmc3ZHJLLzBkRG9rYVg1RGsrZmJlSzhydGp5cnFmNWl0SDd2Z1NZZmhCcEV6eVhkaWlCY2FGWEpaYlIyWnBMekdlRzBoUWc1MW1kNTMzNVlmVVc0SVJVSklxTmVndGRhamZHMnhKTWRtN3hkbEg1dFI3ZDhnWFVtQjluQmlldmsyNWJ6K1pCcis0QndHUm9iZmtobTl2ckpQRmRPRVJPbVZVdEF1c0c1YVVJMFRyWkNnZCtzb1UyeTVib2lCeG9xVDAyK0szZ3pTcmZXaElGb2ZJVmpMbXRYbDFWc04yalYySlRTa1BQVWVPbFVCSWEvUVByTW5VLzhFeWNxdFNCc1NqN3prcG1jbko1RGNXc1VTS2g1NkorMXlSU3FXenlDclBZZG5QVllSVlZQSThlUkVmTkhqL1JtWFJzUmVoaWZKVi85dzJyTDZmWnVPYjdnNFpUemZJbHluRHBKWk9IdXg1NE5LNnlDTlBGUUZXYlBSUzBWQ3d4WmwrNXozQlNJT3dRVDM4WWluQTZidE00aFkyNjUvQi9zR014dW85K0VjUjlJdDJPL0lzSllYSWNLdU1qK3VKM3dHYzQ2SC8xR0ZqVlJQZU4rTCszS2ZmSjQzTDRkS0NiYjJMdkZxblBvNldNQnlwVWJtV1ltS3hDeFp2S3Eyd3BKQndZZEltUWZIZU51d0RSa0VaMHF0Y09samNqUUNsWGkrMXVKZWRqcGgrYzhXZlpsdUI2Q1doSzdPTU1Fb2V6VHZSZFp3ZTVYa3d4ZStmcmNSaVlRVWtXWFpwQklwcSsrbHBiNGoybXJhVkI1NTliTmUvVmgvYVY5NVJsTmNpVVZzVlN4ZDl6ZzRlT0FYQmxvN2FyaUp3dUo4ZHdJb1lnaWNFZ0FTUEdrYlFyZHNjNUM5UFVHYUs4Snkzc25ldldtd1I3djhxSnRLK3B1bEVyODRoT04zWWs4WjhuVjNFaUJZTVVKZTd1K0QrdTRYb05KOW93TVNqZFJJOUplMXB2cmdWRnBlSCt5U3cwazhOMU5JVEltWVAyaVFRblJ0NTRDci9KSDJFanNUTEUvWlRpUllIT3dUOXVkaHgwUDQ1ZHExV2hRb3IwUDhlTTZKMDNtRVcwSVo0NlVjQmZQVm5IbS9oVmtnL0hoRVZHcVEyVEN1Z003UW1hK3VkQlYyT2l1MkdVQ3VWcnhjc1J2NnRab3VRWjlheUEwR3ZoWUJFQ1NmdlVjUDI1TUttMU5idmU1ZGNzVm5IdUhjTTFHc00wQUVoUitpRUlTZnl0R0JZZGc2b2ZuL2R2ei9NYXBtcTlCSEJqUnB6eWhSSU9vZEVNRFFRL2ZBR09XZllmRFptU0ljVXN5aGdidjhTNFpXQkF0c1RCQnF5Y0l2UFIyNjZ2R3BJa3JIdUUyOXNGZk1pdDkxTWM2YmQrbUFDWjVRdmtOOHhLd2hiUGNOc05DZ3lrTGtneGpTbThQVHhTWEc1YTFwK2RsUmxiMHQ3VUcwTGdldlViNEkreXVJTjZ1bURoTVVtUlZ4clZmL1ZWNlo0UWE2UENLWVdzbHNPcnZneVBpdkhoNFN2cVhvNG9zenRTQlkyUUNscXVIL0RwazlTQVE1WjZMUTdnUmZocFNjaGZDZFVDdWNJNGgxWFJIUDA2NjBLNWt2YUI3N1JTWGNiU3RVWEFvTlVKNUpCWU1XMiswUnJwcGVMejdTdXQ2UHhJbWNRWDlFVGQ2SUhuZmNnMm04QVR1UEVObXRodzdveURvbEl3OTRyS3R6NndxU0JBaklZemFtbGZScnV5ZnI3WGJ0M1lIVTlEZjN0Qm1jczdCUllGYnpqTGt5TVZZTDVsSDAxUGFxaFdZRXl1YUdCMmllZWZxelVYK24wOE5mR0hXaEYxbHprdlNzaENodEpCTWhld1JFWWY3TFpCcjcrN1B4NzZyRDNsSUVEMmVuREhIOWRpY215RERoRGxQZ0FudWQvYVNpL0Q4N3FwNGEwWkFoMlk2REJpQ2xOSUNtZWNlYW1FWFczVy90dU1jNEx4VERYbHBRc3RlUEUrODhKMElCRmlYaVlhMVN4NERDeU5JUUEyai9ibU9LeUN6UzNzKzdCTGxodkVLTE9YNE5oUEp4QWtrdEExMmFJRUtmUUpHZDFDM2w1ZjdDQkFES2VPNUZhWWVxbFpWak93bUFFWGUvNU5SOXkzNmxLVFkrK053cUVTY2xLL1k1V3N1QmRBWHF1R2Z4cHVPT0RHaUNROHU5eS9rRHV6RExQT2wrbFBhTldlZU9uR0NzcVdBOFdiblFETzZDMng5MGZqZTFTMU91eVNKNERsSVpWaDZZY3hXeURsT3d3Nmt4Q1p4WVNBd09oVVU4aFJuRnA3RzdqeXlSQ3RoM3NTRnU4bFA1ZklDNXJnZVpnbkVhc2dneUlaVVRscFI4dC9PbHpOc3RLZVNMenI5SWpXbnN3V1RBL3VrQkZnaVBDZGxxb20veHJmNktGdm54WTlFTmpZYmUxenhodWlZUWd2TUh2U29FR25MRHJrVkNNMTZCeWlkbkZBbFBia01jWGpHdnpXcFBBS3lTVWhZVGQyUXVwZWt2SGFSazR1MllhMlNVcU4xN2FUWjUrMGRiREhFQUV6WmhTZ1J1QW9pZDhyaEZYS2RhM3MxSkdWbWpXclpRMlBwZFNQWnBueHdJL2VJbzExcjdpTkZyRndmQ094em9IVTJlSXFmNE9mZWZDWkZZMHBqMnh0U21XUEpETkRHRnJ3dVpVNC8xNmU4V29OL1llMUJzNnZIblVhdHhDUXM5WDk2dnRHTm5PaEdFKzd5T21tTm9XbEFRbGNwZHRZSHNRNm1TeWdaTnh5b2ZPdjI2SjB0S01MWXFKRUlUNVNlMU90TldSd2NMQTJpMWhIUUU1TTJjalhuYlV5b2xOMUp4clE1MVdOeUdwT1JkRmRmSEl1aTN5NUh1MThva1NVak9heFlKVTNDNG1ac1oybFJyRG95U0VmMTJDeVo3eld3NHpnelJpeUl1dW1nV2tyODlzZXN5SDJFQXR4VnNraHNablVmdnhNb3Z5S2VrOUNZS0hFTFZ5TXVuWUtOUDV5NVFUVjFDaEdIUlVCMFVsZW1LRURMSENZYXorUnpmSmoycEhxT1BWZFB3cDY4YXNac2RrTVJuZjBRckJvOTZ5SStzck55cHU2OG1ZNDRZL3lCSk9SK1RxY1JmbXNxTllYeUlqelFkQXFTZm5HWUNKQzBrWEdlYkVBcFRQY1JxaHo1TDB0M3ZpM2NVclg2NkdxUVlXSU9sUFFPRkZQd0xnVll6Z20yK2VveVpPck1CdkNlYlQ3Z2p2OVJlMXRlYzZhbS93UG4rYUtXL3h0bzQwMDRrR0pZM0JsbXdtM2lGSnl5RWVKN3YrbldZZWtrL3U3OEFqcGdMUFQ1NTFqaC82VG94NjdUQ3ZkTEw1ZGRlOUNBeldzWWZpRmIybHhZUTd2UitSLzVtNWdlcGt0WU11NkVqRTlRbmUwaVVwRCtaWk5aT0duTm5PeVNMWXYyS1FmS2xjbHBmSzhCM2l4WHU3M3NoWllwb21TUVgrMUxhSG1SSUVWcVJIeHc0ZVFjd0wrQjJmclVkVnNrRnFvY2g5dVRRWGViQWdvRExEQ1J1TndIQVNLQUxmR1R3MmdmTmFLWHhPMVMyVkxSdGV0cWgvVEVaeklXZEhLc1hkY0ZoK0F0eGEwMjV5T1NVcUY1dGk1N2I0S04raGY1MW1VS29RSEJlZmI2ZVFrVG8yOGZNbGtDaTQ0bEdxMDF0T1p0czV6YW5yVXVQcllGOFRFRDJBZjk1R0FicTcveW1RQ0JzTytCK1dMTFVyaERsa1EvZXBZZVgrUVdMMGNMdWVPTHR4ekZoNi9TdVhMWTFMSzF1U0pnQmc0emc3a0p5bnk5Yk82YXRpTC9QMjB2eGxhRWYvZjcwY3Bqb1l3L1pwN0VYL3Q5NlNWWjRiL3FVTWNzL1lvZWdGL0hsaHRGM2hUbHhpUWxUbzdoWDRPRkJPQnJIOE1JS0swVjNEOG1NdDdQMElWZGJJd0UrWXBYOHFnVG5hblo2TS9nN2QrOCtxWkxhUDdQdXZkUTlrNkRKU0hENGFnYStFK2xBeHlZVm01NUdSSTl5VUJHc0ZYVGE3Tm5mNTlFendPLzl4dnBUbmpObWp3cThDN203Nmh2L1kzdm9mS1NhMDdvTk55V1liSC90cWlpWnJaYVNzd1phemhYMHh4TC9HRmtYcFFQYnJxb1FOZEk4bHZJWG5MejZxQ3hIakxKRG1tWXlCMEhtc0dPcUpDT1ZFT2dGK1U5SDNyQ2JWcFBWZW4xYk9TUWdGTThKMmcremZHU3NmdDcrMDRlUW1HbTZEd1hZeXkzcTZYbnJuN2o3T21XUjlUQ2s1a3FhQkRuYk9nR3FZNHoyUmVQMW5GNDkyVVR0c2RVaWt3MVJ4TFVvcWhhT3M2NXEzM1lzK2gzY3RsbG9XVmczZ1hmYkdWUHladGVHNUFVbWhVVWgvdU9BYy9FNGhvaXBsa3NuQTRkVUJDaDBzK0Nhd203OHNwWTF6S3ZnRHQ0VTA2SEtteEdqUmRFcWlhZDgzekNyRy9xcHNEcE01KzhldWZEZTNtTWd2YXBUNmtGUnN5VDRGS3FxdHVBRngxVHNZOUxzK2dlTytyQ2RZcFViRklyeVZTdjhVMlFkdjlwUjBjQm5ncDhnb3N5UTd1WlkrckFRQzgvT3lRQW41NmV0S1NMMWR2bmJ3VVc5eG5wcEppeStINTNVRnhESUpCWWRYVFMzRW4rbXFTNTcvd0w5bHZoQmdFY0FQU09tV3Y1Rzk4V3daLzMzSHpqbWU3anZOVjVXZWcvQ2o2QUVMMXR5Z3AvRVN0aW91TWtndytaZ08rdVp1MXFoR0duVUM4WW5CVmVsay9HdkMycTJNZGxTYlBWUTNCWDBWOE9qUnh6ZHR4S3NUMEdsUGNoa3VEWE1IakxlYnlLWmdQdU9wUVByZVRCbU5ud1NVSjUwKytFbXBFSkFSOWZJSlpaMk15MnR1ZU0zM0MzNklNcHVGeFJaaDFuNDlCWTNYVllSaFZsYlJyTUNsTkhtS0RUTDZubktKZDRIVi9GWityYmplNVE2dk1OR0hCK0NQVUlIblFIb0Rlb20vaXNldDBmOWxFbVB4SXVjSVpnZXNaejJad1M2VTZJdi8zL09KN1lpY2VIc3hob0xqeUVXT2RHdkowVkI4YVZmamJJM0pZYWxXbUVRUHZwa1FSdWg3S2kyVEtQUFBic1hSeklvMitBSTNiU3hKVkk0MUtyRHZiS2RMeTlrb0cyeWM2R25nV1NlN20wVjlDVVBnY3doS3lsMGQ2K2Z2cHltbUpPTTZSd0VoS0tyUm5PcUlDUXRrdjArTVpYZTZrbDBUTHJvM1kwMGxwNk5RbXJLcVZGdjlWZXdEVEE3NW1KcldZc1F4TFluZ2ZLQXZzUkI2N3VyaGtvTXF0REJHSzhyQ0Z3blhyeVVZdVd2Q3pWY3JEazNBTEJJaUlCaVpmRzJhSkRBb0lSdW9Sd2RVdnFsZ2lxNStxbDVWZ2VtTERYRFIrUFNTK0Z0cFk3eTlERktLMGdtbkZSN0FoS25FN21oQkV5RjBRQUs0Q2FUMVJ5WWhFcXVjY3N0UnFXbHY0TUNaQVVpeUxpWllOckE4WGtuMGw0OHk1bWhoOGpIMlhRWlVrcG9oQUlkOVo4N2lkS0VJSVEwUkhjeDZnakZ5UE1PQ0p2ZXg4anFPV2J4UU9yRTFtVko4eDNVZ3Y0YUg2ZU5uUDRMamdRWnNhQ1FCLzNUa3prNXRFSUY5OFRUYmlZRmswUUd1S3kxUmR4aGdJQzl0Q3RJb3F0Y3JIaWhhMmdJcjdaMlFXRFZheHpYVXFNMXhzTnVKYVBvakdrK3RvSkJQRXRRTGtMa09mR0ZKNTI3WENwMzIrd0kyOEVXaE1QZ1g2OXdVd0x3ZnRzWWpQSGpwdzUwS082Ujh1Wk90WlB2WDBNenV2eERWUkRKYnhwN2F4UnE3TzBRalNFTnhxOXkweERlaThQcWJKUDVpYzQwVlgrbWg0Vkkzdmlzc1RjWExuRzNZbFY4a2xIQ0IrcEVDbDBRd3FzMEpqUi84MHN6bXhjOVBXaWlhbUhteS96ZDcxTnpaZXRRV3dPT085QkJLVm5VYmdSUnhRVndnc2N2Y0JER0V2WGkzazRGT1hDRXdOQ04wU0lpZnBLWTZUUFV4VmRjdndndWd5TTFVUUlMcEpSL1BLWWdHOVQyaTRJNWhpQnZEbzNvTStZKy9kYTZ4TGJ6dk04b0psdmhUeldKM002SXBxbDRMT3NlSmNKZDdZZUs4ZjFpcWlTMU1VQW50ZTVPckZpQmF5SUpzNUVHeUdoekZtaXJwRVUvNEI0SFRHYlo4R2ZDaDU4TUN6cGFoVHNCZmpjRVZheXdnYzRYUVFkWGJIWlJLVjdhdUx6bDVBOVBoMldZV3BRaVd3blM4U24rcFlUU2lYMXRzSlJheTg1a3RqWFNGVGxuU2dscDltNGZSQXBhYnU5VzlFUFZLWk9zbE9SZnlGYnlqRndoVmZhZVJmakJIWTd5eUNxMW9QNGx1WmhHcWpkcmk0Q0ZxNTRCVmNrQWpoOXJDU2libVNLdi95SXR5YW1Xa3h4ditQOThWNm9wREhxVnhwOVYxTXVlZHhvWm1IWlk5RTQrUkdBYkNLa3F0YnBidys1ZUVMZ2x0MjVzajVZY0czNWExWi91dTdyanlsTXVldWg5Znd2ODJiczE1eVd6dkhSUHpoMjdlTUxGdWp2ZWlGUm4zQUZ0aWFSQ0gwYkZ0N0VGVlBWUzJjRTRkMUdZQjBaZUV5Qm12aGUzREU1TFlycEpBU2ZMV0VwYW9CbGRJaTV4ZFB3YWxsMTJTNW1lbzV1UnVpZ05reVl1U2JEQjh0QTEzL2V6NTNPRGM5RlBGUDZhVVljc0Z3RkFFb050YndaMDNyeHlvMmpHWVc4cFpWeHQxWDV0a1RTRmRrWWhCTjJLVTdXSWpGSWNyUUl5dlliMFQ1U0tDb1REWm9OclI2aUVyWW55YmNxV0ttdE5oenNHS3cxM1l0YjZqL2FUY3RKU2F1NGs5SFBVazUvZmxPT2RNSXltcStWeFpaUmQrTEZlUDZpK3Q1RVlZS2tmYURmKzdPdWs2TzlRZFhqVlo2NThUaFo0VzFic2paZlQzbzFrMG1BOE1WeUpyMmMxN1N2SEFMOG56M3lZbkxVZ3doemZzR09iYUEraEJHSDAwYTc1dG5GbUJKOU1wYTNjYXZlYjdXRkFLSkRnWHlwTzhJZjNVekh3RE83dUpzaU5IajZMRUI0QlNRMUh4RGVKUXFld0s1NGpBUTdjN1dxM3Y0M0grdTdQaURBR0Z6THNMK3NIeW0xODA1cTdLdkJIcHFVU2FxMEZ1U1k5TlFSTEhqUERqOVpaQWpVdTQvdUhlR3kyaGsrdnkyNVkzeVA5c1NiNzRPZzIrMUljSHoyTzNrMkQ3N0pTR0owbUV6V1RBZndJRjdjNUswdzkwQi8vZ01wYnV5SXplL2JzYWtUbUI5VVkwTUwvQXlBWktWQlRZMGNucmtPaTVBSWNkZlV5b0h6SHBsdTRaM2hlZW1qWTRsODNwak80S043T1RkeTZFbjI4M3dibU5aNm1Nd0NHaGc0eHBzTldDa3h0UGxhU3Z2RXVTSXpnVEs0S2kzQ3JuZSs5UlpFd3RUVHpWckVLaGlac3RkSTQ3K3FpNCtad3FQYjR4SWNSYUwyMVoxV0NHOE9NeUJ5amp0MGJLQjJUTVFzcDRtaXFhM09hU2NWVTgzV1BBVmRHbGU2MS9FVlI5d2RoUWJFK0JvWUhQSTE3SHVKQ2JTbEtPYmF4TFR4aWFvRkVLZ0I5TElXUnQvSE9iZkJPWEpwbnk1Y0tGdkpiaDA3alJmOHVuam05aC9zaWtKNHNrZ1VnTHU0enF3ajFTTjZxOHVZNEtKRUluNkZ6RVFnQzhDQ3BFYnVTUndldFVmRzBmR2prNmt1UGUwQzhxVHBLL1E3UmlkdndPY1F5eDF0V3JWaWpya3hNTzhQZnNVdEVsdUQ3VjdUUzUxNExQcDdzYmZaWWdycjY3Vjg5UnN2ZWN1UHdKbUVRZ0tLa2RFQXVSRFlqbUM1WGtmYnI3M0xTNTA5U2FGNWdPeWNtY01vb1hNcnZCQnR0eU1Zd0VVaE9QNUxZd2s0WXZ0QVd4RWp0NUVlYjFLU2JTeGY2WXRBMW1zWG9KVGhFVzBqNW5OMzRwTy95eEhoSHorUEpwNWx2T3FqbnNQaERBWDhwWVk5WUQzYWNOSVFDTHVNOUxVMEViQlB3WHc0UjlHMHF4TkV2MTZDclRHTHkvanp2NVdKVXhTVkZoSUhMaE1xb3AxbDNpZmx1cDkvRTF5dDNBRXJYRU1jRXArNWgvZ0d3a3ZVNmlocHhCc2R3cWNpek1KdSt1cExoQ0RlL2pUREpsaUNKa0dNTjJWbHZvYlV1WDRFM1dsSzJDZnA3N0E0bUJNYWZKTnM4TnRmaHNYckFqMUxGenZHZlJZMGtmSXhFRXNNU0YrNDA0U3NicUlZTUFsRjJBTDJaY25pMzd0b2RkQ1kvMFJxd3hLOHNTRWdwUGROY3pWSFIvbWFycytrekhyWXUzakxraUtWK091MklKc011RlZWZWliSWI0dFFmK3diTTBNRFIxV2JNc1g5a3JDM1VVOE90aGxQQlF3ZEZVM21xT1VBeXpnY0hUa0J0L2djTzNkTzh2UkkwczlnT29nVjl6SzNmdFJpMnRNUGdaNDJPS1FmaFo3c0NYN2s2bnVvaVNTRVFFa1lZSmVnL1V0eDQwbkoyelNSMldkejJ6RzBIQ1N0bmdJZmthSStaQU8vdDRaSldSL0gyUHlkallJVjd2WDlWZ1VoUEZ6bXNlQnhXY3JhelNnaUJQOHZ6VnJWc0R3N2VnMHNOSVBkNFlpK09mUDkyNnE5MzdMMFdEUStYQXVpZ3FrbmpwTS9XT2ZRd2pxQTJaNXdXM1RlWUNCVEl1K1U5YU1HTDdWMlRqQ0p3Z2VXQmlCeGEzZTI4MjZJd3hsQ0VVT0lNa3lVYk83VGovUDhUZmpsVlcxcTJSalJjV3k5bFhCVTVTcnJLK21QbGpVcU45ZjFNUnpLQjZRa2VRL3ZYQkFpdVhpbHpGb2l1TExyV2l0b1hLY2p0c213RVNmWDdjdGVBT3JOT0RuTXliS1pWWFIwbUgreS9uUHZZYm9tOGxWVUlIWldURkFBR1ljR1YwYWRFeVV6bGVMb3BodG1POTRYVW1GdEJwZTFzUmo1Y25BaDBQWndKUCtBRkV1T2U3SjNFZGkxU1dpcXBIdzVMN2hDd242Y2VTQUlLOU4rcWdMdTNOdXB6U0d4ZkE3eUhlWUo5R28wK0IvMnBNUG9zemc3MkRkM0t2VUJQVGdiMi9hMlF2SWd3eWlObzB1T0VVTjdPRGpOWlBSK1hVclBLZXpXZXFIY1lEUHJ2K3d4cGFqeDgrbDFWS1V5Uk1MQ1kzcVZXNy9LeXZEVERRamNTZ3NJdjdSVG0veHRxTnNmK0V0UldkenhxamVKZkhDQjJQWjdveldhcHpWeXhtM3pFbVRZUGhSTmtBWG4rdWV2L0VWaUdFdDB2VGRrYXhpODN1UGdCU2VaQ0h5a2g0VUN6N3V2VVhkVXBvbEVSUTRjVTVseWNLRFAydzBwU1poS1crNEJmRzdXZHUvM3laNkVrZDQ4dWYrN3owYm9ETmF4VmxGR2pJbE84cDhGOFM2cnhJOCtsVmdmZU1wVk1jd1lvZ2F0QXVnaDdQRmxUMXpxaHRZMXVpekM0dG9TbzAvck9lbXN5b09USlNBSFhKcVgyYU9ZcFBSNlFWcDdVQXpRWmV4OXc2TFh1aFJqRld4VnIySmUxUVZpMWZuL1RlUks3aHBscG8xNXhocXAyRXJwQ2FHLzRqQ0hEcU5XdW5xUDdLOHhSeXVZekJSei9OU1pvU2h3NWo5UysxRUI2RVdCSUU4RFRvSytxMEFudk1jZGJnT0c4UFpFWWNlOWVHYWMyWVU4RXlyV0ZpTzF0bmcrZ1lMNHFoZWNvNzNUQ1JCTFl6Yy9yKzBIeHN3R29lem44c2g2c29LWll6ZjAyV0xZeVdoQW9BRGtGL3JQTmgwV1JaUGhyTDJ6VEtNbTJveExIM3ZQTkVWQW5lOHZJWWRQaHU5Rkx5Vi9jQ3lKakxlSXNvMG5SV3hublRMTDBmRFRRVjVBMk9JVkFlWUtqUWYzOTdMWC9IdFc5bnhzTnVzcGhKYlkrY1E4eFZua2pMS1lkRFMzYkxnOHZUTXJEcVNJZnFKeEkrNkpSSjM5MklTektITmlvRHpYQWVDRFhVNFM1YzRkYVlreGtZNkY0VHNLbjJFMjVPNVZBanFTZ2VtMlNvVEdidWQ5bGUyL3RGY0VCb0NteXRjK2dDUjEvWk91eHpPejRtWlFHUjg5WEpPaGE5WXkrNHZXemRPaUU3Z2RNa0JnRExPa1ZHV013UExCbWdvNmJHaUZHRWo0U1hoS1Z5Q1B4OHdzRlNVVm9IUVI2bFVyaE5RaHM4RThYMm9JTUZWRDUwVVEvNG1zODY1emZoejEzQWRBV2RtZGh3OHpUaGl0RlRqcFlBbEZoRWZjREdjdzBVQmpxT1h4Kyt6a0xtdFBTSmVySno2TEZyckNkajByVVl5UWZGS0RkT3JaNEdUMlJ4OG1SUGhVbmlsMTlvclU0Vk1UNklSVVNkUEhLUmVyQy93eFZDTTVSdDVHZ1NPbUxTRmpHNWx2RXdhSXE5VVZLSm50bHNONTQ1K1V4N0ZXcjBoTTVxL2Fyc3NENnNaYzZzZTNzZ0paeHRQUmcxWnJ4dEUzc0RKeEtkSUZlcnVWWnVobGxTeWVLMkFOWFZueXBjK2xESUhlNG92Rlk3VDd0eGI2MWZzL1pUVnFCK3RVelhxK1NjUlhYL1IwekUyNWdQQTducjI2clRYVFUyOVRNRHNBU0h2SDZwZy8vUkhGTlAxZTRMOWlzS2FnSzF2ZjEwNklUQ0xPNjBHSjU3MUcwcTc0WWZUNDM3ZTJaMUpxTlFsRWlzc1hUSFhkU3QvWVhUQTRFanBTS1NVYXZZNlBVNkloWkR1bUZjRWFuMVJXMzFaSDZ6VnRNN051R2w2dnFqSjdTVVh3SHBaV1RlS1hZZDRBazZ1bkUxTDRkckZPOXpJNW5sZkRBVGRYOVRpOWd3ekdWSjAwdG41TTc3OVVTVUtURzhicFQ3bGYrcm05OTk0L2FlN3BXc3NUTmlsN2FzalFmZjIydGFkcXZYcGlPWkxpUzU2R2xycTQ2M1crcFQ0YzY5MTZ0R2EwT2NkL2loamxuak9Jblc2SkUxdVg0ZEdYY1l0bkNFRDROcjVzbzIzcUZUZmFFOG5yK0V2akpNSUNmMERTY09yaGtRWkxPZXhqNWRjSzN2MDErYzB3NHJhRDdpQmZRN2hLY21QUXhIUjE2c1RjSnIzSVdYMFpTV1FPbmlJUS9vcEt6Y3NkaDVhanJEZE8zRXBlMWhiMnFlY3lSYmdCRXNleE1XZzJYZVBoZ1dHdlBCZ2pMS2xGU3BoMGdqSFJLZjZtL0djeFRyRnQ0dmVPUnl6N0xFTkl3Z2lad1FRM2M3cldJKzJ6aEhINm4vc1QxcEp2TXZSZWtNdkFLTW1NRCtUMEt6VHUwa1hIdy80RGtNU2pQTjBIRGhuT3BHUTlkR0ZGTWhtSmJxMTEyeUJWRWQ3WTAwcldrK2RUaHc5SFJmcm1XSFYvOVV4VFBjM04yZ3BONHlseHhCa0czVkJKMXVLUFVpdUtaK1BOTi9xTWp5RXEvQzhqbm1BRUVZMFhuNzc0bmJaMFRzWkgxdjZtMk5uYkFvQ1ptcnY5UmRHelBXbWZndUl3RjErM1psanZXeWk2NVUxM25NbndIekdkbzdEK3VBWVRyUHN2cHhuK3pNSy9wUUNXVnFqSmJ4SFRNTVpkalRQemg1TmdzMSt0cFJjR1k5NWk4Ym5XeE9nYWtWVERBTTRqbEFJM095WlFYUE1tcWNaUVpZWnQ4ZjNBejRtcnJVMVMwTnM1UFZoc0ZWUWF4eFRlY2UrNXBOa0M2dFlKWWJIVk1rWWM0a1FmN1IwazJpc2ErTzJGKzB5L3B3c2pqejFwN1VKeDQ1NDlMMVV4b3ZWU3BnOXYxSGxEK1pUYWJSMS9yMnVQb29LUzRDWHBYTTJlVk5LU0g5VXJpdWZJdVZ1cUhSY1B2RHpNaUEvZmN3Wi9BUEsydXBNczdaWnpHU2cyQTJlQnZudlNhY3NsamE4VkhQa2hQa0VteFFJY0tQSnplNzhGTE13dEFxbDNQSGl0ZjI0M0lRcndOcTd0ZER0dTFONkpFTzJtZ01OZnRZYVdFcWc4N0xXaFNXaWRGTWo4SWQ3M1oxZDdVOU1PTTk3UDBqNEVmSFFPNHlZSVFqczJGRitOaGI1TjAvVlVZZTVKVVRYdlJXZTJwaU5WNE9uV3FYcVpSNFltQ1k5Smxpa3UyUG40RS9vVW5GNlp1SU03NHJzaFVKSXFKQzhWcXVKTHVEZEJSMWMvQVZ0Rk9kZkVhTUJKalNaQ2lMWU9nL29WYkVISE43eWRRQkF2b29FTUQyUU44endWMzV3TnFsQThtTzB3NXZaNktndER3SzMzL1dVVFlVZlNwVTFmRk5HaXdJYmZKeEtlWGV4VFh5RC9WL0c1Z21KS3lpb0p6Z2liSFZRK0hkeEZZQTdNUGZzYWs2SmE0VnRJZ3RJVUZFdUVPdzRTdnQ3Y3o5eDFIeDM4aFozbXNSZERCdkplWWx1OXFrUkxSMEl1bERUUzVzNm8zM29SQUtEai9CK1VxUExOeEM5WGg5SU9QbG5wSnpYSlJpekRrck9Rd3orOW4zaGlmUGJISWJmWnJ6S0VaYk9hRUpCdHpHS2VoUTM5ZDJiNGdaWHpTQmlocnM0ZTVWTXBmTUxpbiswaU1qbTdEb084b2xEUFY0aEpjY3pGZDJqTlByRUNjT0lEVk9RZjAwME92R20zNWYrUktJMlJPS1M5bTZ2WVpPejMwSUVvdjdTRGY1U2EvbGNZZnJIeTYzeWduYUh5SEtqMndwNmlhOWhScldDc0xuV3N4ckxpTmhKZytNaHI1aDdDTHg2R3VKWkM2UXloYWYrVzl2eWlGVGEzRlhvMTV5cjl4NC9LOGpja3FRL0k2NDdyUi9vYnFpVTlvRWdWWkJDc0NIR2tkRnlKVG9qTnRUek5neElTS3NjMVViMExLV2R6M3hldzJzWk1aRUJiNzhmZEJOK3NLNG1STTA1a25xOG5DUnE3Z2ZOcWR0dk1Gc1lEMW9GSm4rZDM2eUhQUkRUV3lVNHMvTTVncG1QMjlpdFliVmtrVTBReXQyK1EvSnBwRnM5UGJ1eEpQVWp4TnVia1oyeGhFVDlsZkc1dXAraWpFVGU2ZUpNVWtvTEhSQmNtc2RtKzRqK1FjbFVXeXFGQUp3TVpVWWNCdktkQ2IvaEYwRWxoMUxzbmRUcFZrd2VhV29vZTVrMEhUam1SVlFZV1VMWmRUZUlBbWxrKzNaQlNMVXdyekpIeEtLN2d0ZGVNdHJxdVJjOTA1YmZhUUlxMDNCMWNRdmRsaUVTRTU5bTYraDlyalZUVmdXZ2pYTmVqRDFNNnVGU0RVVWl2clFwamJIVVZXQkhkdlYxYzg2djVZdmMrcTlDbmVxN1NVY1BhLzkxYlNpUVN3RTVOQ0U0UUlWbjJ2aHZiU3pQOUQydncvcFkwV2hVYjc2a3M2WmhWOXVEaXlSUjVWekYxUDBvMldRN3BWMmRxbEtMTHFZNjgxM0h5T3NFdG1QRHRaQWRIODUxU0Y4QXo2V25HUkVHbTVSQXlNeTNqWkZISXF4R2h6NTdoRHZuQmxVY3hGekJQR0RXcXEyVEZ6M1JSMFBIczRiYTRxckVKdkhFSktyN0J2OUNLbFdrT3dWR2JsU1p2R1d3QldqMDZHOGhWVXFZRlZ1Mnc3N3pmb2I3aThqR2RhdVlYOE9iU3loamk0ckdoTmhMVjY0T3FsOC84cnlHZWhabXNhbTA4b3FZMVN3UXRYWmxIVXVoNTRWQW14ZFpOdWFCUjlFYzMvUGI4WWtXbEUyWjRScFBnajJxaTl5czl3bVBlUm1KamsyZXVJa2VLbUxBQUdZckpYZzNGUy9yQ3lCL1ZYQkJjSFpWUWpySWxPTUExeFNyTzZJMFJBdUd1YlJEbkRUY3FlR05PaGY4VktselRMSHJEYjRTYk9NQzdsM0w0WlMwM3k2Z3ZBb09MZnA0djR0MnhOV0I3YStrMGhKUitYNG4zT014cXRPbFpLVWZRdU8zQmZVRDJBblR0a2lYbllQdFJ1bnNOVFVjTGJZd0dVb2ZzM2tRaW5Xa2VwNERSVGt5Q2dZaUNBSUR4NFUyV2kyWVVyOWFGdG5XWWRTWHF6RHdaeUZCNW53SmdObVk0NFJ2NGdFOHFvTXNuVjlPSklNTzBseFNEalF4enNtRWlHZXRFQU9Uckt0SVE2eTRJRVhoQ25WY1hmYWt0eXdTNTZNdHRjMnpDVlFmOE9XVHRQWWRhMFFOeUNjMklNRGdicnRTM1hwWFdRcCtlRE5DSCtGd3dlemhKL1o3UnhHR0VQRnZOWkx2TjNEcGQ2MXd1NjlwSU5IZFJMU01mUHZGbUhNbU9TZTBaMHRadkNHQ2l5WDRvQk5mNUpkeGJjRURkY2hwNG1MY0FpSXI2ak1iSXNZTjhucWk4aGRFOGkyY1plWTNGMzNtTDdRMkpRbmcvclFwM2cvUHgxKzZpMjI4SUVDZzhxenorVGJSVS9uelJYTFZSYjRoWHcvd3ljdEJNVkRIWFhqdk0yZHlRZXpuSmpWaExTbzBCY1BFbXJ0bWFsTVoxeTNCZjZrWFNIaHVtZ29kZisrSzJGa29KR29sY2VnVVpTLzNHcmdWcmNvd3o0U3BScWM0TXh2alJPenRrUEhFKzBMUFRUbHFITFp3Tlh4YnpGUkU5cG02dWtWdEZaM054ay9qM0JJOElHSmcrSDBjWDBCblE4SVQ2WERZOVRJZW9NVkhVWWc1d1BVaTlZTWZVWXVtSDFNZGxHSUcvSUdOTUliSHUrbGQzQWswNGlDMDZEQndNMnVJcmxBWU9CYnVNUTBNMWtuN3ZRaGxxK2xjZitVVDZyTWtxOWliNTM5WEd1cGs0aUhxRG1KZlVGMFkvb1VzaGxRaU80MzFDaTJKSGkwaWpPdW9TK3piMmNuMWxCdTRudDBPeTRJRTAwNTkraGZ5YTB1VFdJb1I5TU5yT2ZScTVyNGNEUlc5K3l0ZW9zZWhDT3BtaXcxbWtOT2lTeHNISkgzWUNTOGRoV2UvVUUxb1JHSEFFQjlUZ05XcE1jSG9yK290Z0N1SkpSK2JVNzk2S3I5ZTNHWDEwZW5rRFk0eGxJaS9LT3F1LzYzNHVPR2FmZ2Nud1A0ak13U1FpN3JjTWxCMU54RXdVM3hIdmI3NVV6KzNtQTBTM1gyeTBtaStxSmI1cXVpaTk1dWhEMFE3YmpyZktiL3lRbXRtSkJxdjZVVkIyTjk0V3NjUmdJdjhHaFpoRjhTRjY3WHA2a2xWSWxnMW1Fb2N6bE54YmxDeWhWaCtqczl3QkVhb0ExRzlHb0VFYm9EMXRkaHlubnRQZ1RRYVlPbUEvcFRUMFlOaGFtQUtVMlBPRGF4UlFHQ2FrTWhIMUd4bzhxNWxhT0l0d2kzYmY3L2hZR3FYZzcveUsyN1grMGo5ekpDMVNpc0MvYjQ2OFExcEFmNGxDQVNMTGFtaGZaYVA0enBoMkthUFQ4Vjhzd3B3OWdFR0Z0ZWRjamV1YlVaeXVCdXA1MmJ4TnliWlpqb3dyb1IxN3pNZEMxYkhsejBPOWdGZXIrS3M0L2NyVGQ2aFhMMTNDdkhFSnNXaVVsbVNIWUZiSTRlRUQ3c1VRaWgzVlQ2bWxCOHZMVUQvQVFJQndhRVQydUphdW4vcTEvbzhyYlByVjVmb2I0eldIM2VubllSbzd3U0xNN25zNWZ4NWptNGViU3FBTEtaeW1yQTJ4ZWdrZWoycHRtbzFaQjZFbTEvZE1uVFNBeUE1N2VhNEpXY094N2E1QVloNGRHalVISmg1Sm9DZ0krODN4NDZBTUZwRWQ0UWtKNmorVWcyRDFyY1RTSU1rRi9RUnRId2JyZWUwUUdyRC9UOFpwRHpnZnY5bVk1WmNXc0pNVnBpZ1IzbVVRT1JKb3pNSDlnZjQzaSsrSFZCT3VZeUpIVzFlSEFFWXBzRDVlV3ZISG1SWUFtY3paS0NQMW9ra1VpZER4SlQ1UHl6YzRZVlFGam14R2FNUWEyMHRJQzg0TGl0WkZIU3VwUXdGM3UvaWdXbkg3dEQ5R25zUGNpU2E3SE14NFNjL2dtMHE5MGhoUVlyODNmOTJLTG0xakNUUEVVTzQ2MGRSZTEydldDdWV1aDJlVHVUc0V6RVJnRGJUUGJSYzIwRmwwL21XVU1OdUNXdFlwTDgzTXY5OC9Pd0tpNVk4Q2xrQTFhNmVocGlXQzN1cDdVUStuZDh6SXF0ckh1emxHUllEdkdDRDdEVmI5by96Z0hNMW52MmJzb0JkbURSOUhSSEdONzR0QkM5YWg3NWEwTFZQVEFYR1pZUjZDYWI2ZVpzYTd6TWI2UWtmaHhPbTFOT3UzTkVoM29qYzNmRzZaQzhMVk9VUDFnUWRjQWp1ZkhJOXBkWlBTMlpacnJmdVZyVy9ZalRhWFFKbjBiVzRqRmI1OGR3YXNRTVh2L0M2ZkZvWTlQMTNId3E3RElyYmFCc3huQlRFQ2FFNmVFRXI3bmxKNVFRUWhnOTN6ZmREZzQ0a0xrWjFRaTQyY1BiSWluYTJFdm9pdmNETHlZZ2FoWG5LRlA1aFdGaWE5NUJmSFhNNkV6aGdDckc5WCtBbTJucTFzUzBWMnp3Q09QS2tHdWpzbXppbkQwRWNRbzJGei9TTTlQak02ZS9FK1dEQWxHZ2RLRS95RmowckMyU3I0QVFJSjV6WlE1S29LTnh5S050L1liNnRlYVYrM3MxVE1qaFZQRk0wcXdLQ0dVY0FwaWF3ZGV3YTh6MEJxUjZnd3lwUHVwc2RJZDViZ21TMUEvTHBYRENYcGpSRnZIZzdKdHBFLzF4SStZRmY0VFdXd1VBOU50S2dqYU0zWmRkRFVOTDB6clhZT1loeEtXMXVNdnZvTGFmWVZwSWx1Rm1uVGNaWldXZkMvU25NMzNTQ01Cb0d0L0NyUGFhMnhxRXNqaDRnTkFJUTlHaFp2YXZxZkpRVm1vT3B6SDlvUVh0dmtMdDZOWjNsMTV3VHVDN3dwV3Yrdkl1bG9rdmo4N3RUZTdTWW53Zi9OMHVEbUN1Zzl5MTlVQ1hselVzanhBcDltRzMzamQ4RzlxMWx6bW1OKzd2TUUxUmMrNEpBVzJzbUIzL09FT2pYa2luNGVjanprSkFrNnVsT2ZIZEZnKzNqWHdVMEY4NXNQd2pibFJNWGI2MHRITUV4UDJzamFhczhwc0xQOTJjd0NaVE12MmVBWGxYUGE4S1BhaU54YzJQa1dBcmszYys1Y2xoMTVXMndod1B5eCtBVVM5aGxnUDdxeGJuazNUaVBVTG8xdGNoQlZvamFtVFowMnR0dnlVQmtNb3JSaVI5S3NxQmpYR3NrRllaMDdGbEo5cTdsUjVyVGZacXB6Zmt0YXdXKzFmMm1pYWZYODBMdWJidnpSVHRWOGF0QVFvdkk1QURBdmZ3bXluTkI0enVVSnIxOERLS1lDTC94Y1Q0aWd2dURZbkVuRVhZZDhKNzB4b3pRMi9yL3hOR21QaFpnUzRQOFJsaDd1NmIyaWNFenNGc2ZTaDZXc2k5c1loM0VoVVRyR2kxLzFRRTIvRDJOT3QxSldqY2VHZk10eFBaeTlBWjB4WTdxYzI0VUhWOWhrQUh1WUF1K2ZxTUdDNWc4TWprOHo2TytRWU5mYjJ0UVJIOHpZM1VNaWsxWlQybHJSMnhvV1plOHJ4TE9kUXZYRllIV0xGSDdWeW92QmRUaUltbFZOTFNHTHFzTTBlS2hGM2UzNyt4ZXBUd2dNUVpYRU5Ib3UwQlk2c3V4TUdpamR3NkJsVnJjbHZMc2ttMEJjY0lNMi9NQ3RJN0lVVHFuS2Z0cWNOQlhjTG1XbVJVRk41N21vUVYvd3h2cE5UWkovNVpkUUc1eWxFUENRQzExMzRQdXVOTndRNU8yRS9FSXI3cG1uVjRabHkvZUR6NzM3aGt2dUVxZFgyM3FnK21YemoxOTdkWGJ4b2ZlUzNxSE5IU2crZVNsVThIR2ZlNFB0akk2V0RBa0dZZFFJODR4UVBhS0NSTHcvdUduTGMwS3dxanVUdm9pVlpDZjkxWmNubGVyRitMcURDSGttWHM0SW5DNzlzaGd0Y0RmWTRBZngzSCthN2dNNXBadkltK1VJcENPTWM0Q2VlMmNteHpwQ0xIbWJSRHFqMkxTTWQ3NUg1aWNHUmxXcGo2TU9INU1tM3NHTkRqQVBPOFJYZjRoMmRrTXVxbDJYcXFWV1BNVERNbVIyNjV0dXJ3Vjl1WWtVN20zTjY2UFg0RGxkTUlCdXNiemZrdHZPam5xVVNQOStjVWhxdlR0TzRxQUJScFI4Y3VLWmZNTlZuMkQrOWtMMHZldnFieENFMTR1dGp0aEx2M1QrWVpIdHdmSUxOWVVLN2J0dnVSNmxUTHlGK24vaEpjSmJuYjZkTWdJSTdxcDFxZVdLZGN3djJJRUdIckM5U2o3MDJjRDFsRXZLMmU3aEJvMDVjYVkwRFR6aUFZNVBCSnVpOHowUUFKOE9YRk1LaGdJeXdIclBWTGNoK045YWU2b1pUOHhTa0twUWN6NE9VZHhqTXJJUW14bkZaeGxvTnFzc1FUNXZFRGhVTWY4bUpmZTg3c2orSy8wN0NoWHRLM2dDbmhCdWFpamdPYlJocG9mM0Qzc21lVG1YVmpsdGxiTmVCajBhR2N0Rkg5VUowRThGNTBIc0xvZHl5bVlLVWMxT2hIM01GY05qUmpaWWZzT0NGWmJiNDEwNVltZ2tJVDltTyt0bm5OQmY0Sjh0eUhDbUpKYzd6cWk0VlZsdnc5YW92Tjk3R2d1U3IwQzh0aXZiZ1BTZldqZ2Y1cEU5QXJmM2tEb0pDdCtSQnJ4amU5OGt2bVQxSGxkY3cxMCtkZHFJNTRRVjhURnhaYndSU1cyQlRjYll0S0EvNjZmcHhKMmNKejBYUXcrUWVGVnpmUlcxQXV0NXhxQURHcWd5MEZuZmZiOUtzcllpODJJZFg0Nm9USTBjVUdPb2NURlpaenROZG1DcHoycWs2QlVVSmpwb09UUHd4ZDNsdGxvVHVVSmtsaFZ6ckpzbGZWb3RkUFBaNUFHQnA2RGx1bE1QQ1MrUmNhdlNES1dTaVpDaGtLREtOMkVJMkFwV2hTSFpGUkV4a0VGeU1QeWhyV1Y2dGVxOUZFV01qSzNYVGVFaFhpbHlaN3BxMVYza0ZrRlJ5STNBYVlUN3RCeVdwc1NrWnVjM1hJczFVM0k3THRPbGluWVhqbGdIVzZGaVk0bWRmQmZDRWZoTXpPYmVrU29iNkFLTk1SVFh0YlpOQlZiKzN2aC9VejAzdFBwVWhCaXJqcFVxNGlKL2VjTmRHZ0dzTzZqUXF0QldsMFV4R0xNTjJ0NnRab1pjeUNZVTZEbVNIL1Bsa2V5VGJGeGJac1lrblN4WXJPcER1MWtoZU9XOHQ0OVhkY1AzQ25HbkZpb3BUODY2dkFVODJ0eEUzc2N3RU5oQ2pFeHlYTExXMUtaMFZMV1o5RHVMK0c5bDAwQnZ6TDl0UFA0Z252cmlnRnBjc0dEMC94eWtmQksrUXMrdE51b3dudzRBQU83SUlld29CVXh6L0tLbVMvV0Z4RzQ1YmQzZzEybkRsZXY4eEdGSVF5K1hpNFFRanIrVU04NE1rRkRLa3pXUmc2aTZUYXFmTk9waUowWitGUnU1N001dGE5eXBEcE03Y1dUVnA4eTVEeDUzSWg3dG9XRjJDbXVKckRKczd4K2RsUDNHbDk5MDlFU0RrNlJnaGxWUkdVeGl6RElyNHphdWI5cTVQdDZuV0t5VXVmdDFtZEJZNnEzVlZoUE96OXdGS1dmek4rMndKd1B1SlN0bWl2QTI2MzZYV013VFl4REJIYWprVUVVY1FrNDd4c2UydThZWm9vaDY0eS9iN3dPZGV2RFVqbVkwcXYxZVdJOVhnYVFPdHM3ZGRKa25VeG9yanRnakFUNHMwVTlKYnR0U0ZJTFFlLzFZdDNxVnZZQVZucExBYW5DQ1ZWYks4OFVuMitmdE1YVGUvVTJRT2pyRHNLWDRyT1l6RE9PQXJTb3hLVmJEVmxoOHgwd2F3Z0lXR1RsU1BDbExGN25oM24vOUZ1THpGdUxWay8zdFBsalB2bCtxeGpMOEp0UEpQUmgrakMrZ0twNUdSdWVOMzJhRklXRXBta2sxbll2aW0wbVQzQ1ExRDVtUHowNUZueUQ1a3Bzb0dYdjkrQU5FbDZZWGFSUGdiYW04TDh6VW9ySElaeVBnb2lUUFZhQmpqR2xQS2ZFditWQ2ZFeElXbGZ3aWNSZ2ZwM3VscUQwZlFNTkdqL2syRGxyZUFWZ3pFRTl4TmNjMVdzVCt3dzYxNytPa3k0MDFDMCtNUHd3TWduclVtY2JxcnBlYkY3VTRST2MyWkFtbkZqVWI2M0IvUnRuQ2Y5VFU4WXBqNVg5dTlsajcvWlc2SjkveWJVMkhmeSsxd3QyOXJOMEZja0VJREorKzJpb0dheHlGc0hEWTdWZTVEajlEMTh5Zmo4L1NXYS84c3gwbVJMMnlaRHZ4VDI2elo0cG0vTUFzcmJLdktDajBYYkRFRDRiNmcydzd1Zzl2QW9udjc5ZXhIdUFZRHlEMU5mcytDaXlpNWMwRVgzcnEreE1VckpGem5hc0NpelRCcDA4U0svMGtsd25aVDZsaDhKVmZmYWpRdDR0MUlTc0pLaG5jWjlrVzc0S2x1SVRERXNXbHRUdGNlTVVxV3NxNUM4amFERUFOZlRkWXBxWlZKdlZNdDBNNmVzNzRDdkQwWFBKQ0E1SG82WlVkeFJVVGF2RzNPc0lncFNidEZZN2NlVEtVNWVqNlgyQ1gyRlNXM1RCY2FRTkVsMFhnQ0RVMUtvWFdROEoyeTdKcGxLa2crWjhhTUx1b3p0K2NoZDBEMkZNY2IwdWtFY3NPcjhHRzRxaGJYV01CQ0FET1dNSHpzNHFpRzhUWE52Y3FJbmtocXZvc0pjZm9sb2FlSTdPR1RiOThoN3lRQWFCNlVwUE94YWpJTTRLZGtNZUF3S3dzTDNxNE16MDNwWGk1czRiSE9GOGlRVXhwZ2ErUFYzN1h0R05ja2VyN0RUMWZVODlGR3lZa3N1eGlhTG9pZUhTS01hRDhXVEFuUmFxWjVDQ3VuM0l0dnhQY2UrZExMWUp4Rkp0WHVoYU5tY2ducEY1VmxVRUhkUXRTRVBicFlJb3EwQzBETlF2aFRHRXpoV0gycEQ1VWlZR2NGSnFMYWRrK2FIbk54czlwZWlnWFkwSEVGUU9aODNuZ3g5Y2lzdUxwUFhyNVNhd0c5TE1OL1BrSFZRdDUwdHIvaWI3aVl3VEFyY3BBV1hPTmF2S2ZueUg2QWg1T2lRa0NKeVJyaFIvWXFTYW9rcDVITnVZb3FBeXE2aCtQeHhzYmxsZUx5ZVZTdE1WSEJxb1NPbkFSS0g2c2hSMERBbmIvTWpsRTVLTi9LbEI0eXR3bmtTMkVsOExRUEhKZythejBwTVJ6ZlY2WXdnUHdSejlGRzFTRWRTZHUwQTJxSUdUUm9keXJiVk8wNFBPM0YvZjBuTmxaV3QwMFQzSkJtVDZha0VUMWxZWVduUnZlZGlxdFl3RWFaajc0WXpISUtjM1RiUG1ETUQvdXRpR1BuUkxLOFVaNllDVmkwL216d0V5QmhNQjBOb3VjUjAxYWNnOENLa0pGNVFWTFpnVEp1ci84QmhIYTBWckZEc3NndDUzc0FJdVc4RHJhR0VySkcxN3BpRFc2YzBwRVBYd2VZWDVWcVUyY2xsQStRdGNUU1I2RVorek9SV2FUTjJoTXh6SjlMR1hnb3pKUldlNkxGazRrelA1Q3pmbkZBNkJ4ZkRlZ3Y1MzRoU0d0OG1WQ0Z5Q3kzOW5KQ3hGamtmTy9kd3BsL1R6SnpBdkhhVHFJUTFCNVFaREFNV09qMTFtRUNkS1FqcCtNdEtSU0p1amtmRnh0MXVqUXdzVTZBWTh4YmY4V3JtcFJTQk5UWW1RZERBNGQrbTZGRDYvNzBQcSt3eWNaNXg5Sm9McE0zaGRvcjBsa1QzQmJhZE5VblVGMGtwNUhFMFh4L2h1Q1l6SnBrU0trcW1FbHpZdWZyUlRLQ0szWUhDamZhZW94Uk5PcnhtUXdJb2hLUzJmc3ZXMjFYOGc5eWo1RHFlRHhrMjhocFQ4MzQ1S3VNcHNTa3V5aU1pSnhSaXJKMU1jNVJkUnpBS1dzZkxLOTNjaHRyekI5OHB2a09lS2luclNvM3BWblNoRDBoVTVmK1BNcDV2dTRTMEU5Z1VEbDEwbEhITVlkQjhjSnlvQS9qTUFwMG9oam1mVW93WkQ2MERmei9SODlaMzlaTFdEKy9hc0t0VHBnOWNhVHJTbjdsbUlyMDBMZ2VMNUl4MmllMGtzd1loSld4Z2tMSG5BT2IwSHNaQUxEQ1BIYnVIZzVXUXJFbG4vRFMyTmczeko0ekVZdVMySUpaMFAwNlI5VmlqeVQ5Qmgxbysxb0d3Q0hyQ0QzOWo0eUJZZlhteE9WTk5tS3laZmp5N3JiTnJKd0xTbW14d1dEN291NnhaZDV6Q1RlSXI5aXExUVBmVDR3OW5vMWJObVBuM0dNU0RFQk9aRUtaclorc1hodVk5ZFYwanRRMWVVcHhoY0p0ZnpBc29CSHVncWhPNkxuWGNoZG9FeW13Y0hVQnhJV0tzdlBOMDV2ZVdsM3Z0ZVJTOVd3Mlp5NGMzeThZUXVkVDhiR1I4VStsck8xdkVyektuYURUL2pNbWRuRis0a1prZTh6Sy8welorOHdSSmhNNXhjS250dVFaSW4xczdEOHU3ZjlyZlFzTUY1K2ZSc2RsYmR6WXNjL2liY3hsUGRvU1lkWGtyTy9SWk4rUUVNSUJWc01tZEFtbDRpdXp4Q3dkL2F6QnVzM2IyMFVwUi91UlMwUW5aLzQ1N2NsZUV4a2FWa1g5aTFKOWl4WFVraEFWRGJuNk9hOExHSkFvQzMya3R1OVZGdEhZbEV6L0xtTmhVTTNVbW5NVzZSS1c0ZFJhTHkzNXhJSU9jb1JmNWdQYjd2amJ6UUcyalVDQVJUcnp0ZVpQanNjbmp5ZGJITWdWMmJpc2FrNDNXcFBuTkhtYk84VEViTmdBUkxXZTVrSG5kbEtCZkwzWDVETS9WVnl2WkJyMUhxZGhVcjVCOXZMMHdyRHd5WExFWUwzR0tXd0NMWFJDa0NGZmFuNUl1TXg1NTY5QzFrTVEyb0ZqaGl1QTlRa2J2dVB5OXlkY0c1elo2UVVkVmcxR3liaFFaNHk3QWhpRGZLZGNnbWlNdWFaR01QUEZKcDUwS3JnanFIQVhLSGl5QVgzZUVDS004TkNIQ0tyKzdLa1liMHdMWDNUczc2Q2I4bWkwN2F3Nkc0Z293UEdIaUVCV2lvaFlxa1VnRWM4dkN4VDFhMmFaZHc2cXIrTGs0dnJ6OE9XOE1OcDJuZ21pQWVqVkdST0FIN1g3cWl3UFlJVmw2cXJnc0p0MnQ0MVJnS3A2V0YxWFp6eDZlcTdhUTQ1c3FsQzZ5TWhUZWtQREhMS1d1cUxiUzczMGZCQ1hnVGRsNmxPckUxN204VEhzaldxS3NuNzR0S2o3NVpWSHdWMUg1NUJWaCttWDZuRTgzV3d1VDg5S3djemsyYVNXcHNDNHdnNDlYVlVaR09BQ0RKN1FUelpXaUJYSDBlRnZ2aVIrUUxMRHZJU2NjS0t6MXA0dGtnamJ2YnNiVXc3MlV4Ymc0b2lwdXFhUHZXR25oQ1gwa21lR0ZtdjNycWtQaXptTno2WTVWK1psblp5ZFBQWWtPYlFQZkZEVll2WUM2SVRhNS9FWStBbzBscEV0STQ2ZEk0ZWdRRWNiTWtwZ0daeFRLSURLZ2p1d2lqL3RPNnNGbnZtUUFhRmZuNGhkZXZTcWpwOTN5c3d3VVdoekZxSUtoZ04zWktZUFZrZHVZWkJ0cmdOQlpvdjJvV2J5UFF3aHVjcWRPTDBPOG5WRlN3Z3ArYWFSdjlQL1d1cXoxQUtHQ09HSTgxMWhiWHFpbmJ0M1R5eVd2QlQzTGNmZUtvMnN3Tjh6UVViUFFTa09UYkJDb3FxWTZoZXVEVk9tQ1pBSDBMU1VSeXVSUjUwTDZmZTVCMTgwdS9mRm9MNzhIMnNYUk55UFo0cnE1L0RJK1BrTUdKNEhkM2tLdGVKRzd5NjFJZmZuZnN4UlZFSituc0ZCY3RuUHNqckdaRmdIZHkzU0RxMWcxbmNOWXQzcHBaLzJsNnl3WElTT0gzRVJrMU5LcnZTd2FWV096Tk1BQlB4SVZLR25yeVFIY1AyQXRKNkJIb25xWDB6eiswTmxPdTMreUFSajdrQzFURjd4TkpHMHlzNCtVMTFDK0ZweXJkVjg2cHJ4blEwQnMxU01Oc3lnMmhjcDVYZkl6RzNRRmxmalhHQzY2UDUydk5oMm9aRFhQNU5oVEw2QW1IUjIyR2dhbjNLYVl5RTE0L3NPU04vUVdjbjRuN0krWUl5TkJTVitoTHh0VTdBZmxLTVhGa3ErcW5BNVRuUHkyVE11eWZia3kycEdsZDNjUzJONDNKUVZRSExSMjNwTWRTZmo4NTQyNFdLcmlOWW1LU3g5Y3gwS1dvWkZzTGZ5elpLMGZmU0h4MDNlUkU4eUVzZVFGTGRGWWxFdmZ1dXR1clpZR2J2YlhEVWdqRmFXQm5aSEI3NHVKRERySFVpNEZFRkEzeWM3VEFOeVZub2Qvd2prNWdIcWExc00rQjVzNnRJem5sUzlxb3VYMmlxMUZNakpWdlp1Y1JnZjVvZ2ZOUlpZREQwS2IzNmJzd3VrTzYrVzUrYXIvdFFUSjAwdzNDdU1DTmwxUnQ2b0RqdkNaejJRakR3NVFvMHZBNnVRSlR0TnVKNkhVRm5ubjcvRVZqNm5na3lJQk9Eb0hEbXVuWnlDd1BCNFBrWkFUUDFqWXVRanRBcnJVcWc4dmxuOVh2TTlVM3RoSG82UE02UlpPSFVSMG5iSGNQQUtJaXArMmN6K0VOOUJXTzBqbGJuK2NsbkJBdDlZRXh3cXN4NmYzeWppVmoxU2VITE1XbUNKOXpVL2FEOVc5alZRTEZ3c2ZISXphQ0s0Vy9FSnd6Rll3REVjcHh1RjBpSEpsUUNubXgrTHdvY1BrWjdteHorelYySlJ5QnU4VDc3aU1nNGJDUWw5T0U2aTg5SktRMlMyNWxiNVNyT3FibkFTTWhDaHphc1JiRkN1cnBUbXlSWUN1TVpTSGZScnpHd1BkTnpYTDAvdE5VNmRPTXRqQm1zR3JIQ2w0L0xwN0VrV09zeDUyQ0hkRWgwRll4c3NDOTNQdGJZRVRZR3EzeWlZd0hPTi9DMEtpTkNHR1pqbENVb0lXSURLbzBLVlFWZEhZTmduMC9LYmdJcmgxaURGRUFwQmdZODNTRVZDZGtGK3JPcGYwSE5GTmtxa0NLb0Erb1plSWxaeUkvd0Q2dldIbXlUbW45Z3ZZK0V1UTNEUkJ6MU8vaWZGNVQ4SkpiVlE1bm5RNENFMDNaeUJ0QjRMcU5JRzlDT3gremN3Mm1IbTk1T1M4RGlJUFg0ODZ0UnUvaG5KRHVUemxaRGUycjdXZ0xNbTFQTHFRbzlSa21CdFFiaWY1QlpvY2JIS3VVVlRyK0ZTSTZpTndBTTVzNjdGbHNPQ3Vmd3BuMWxRa1Z1YThjRk9obnFPZktqYThNd1FHeTROTDBGMUNTWS8yTUFPMk1DSmF4YnpMc2h5TmtXY3Z2YlhWSVp6OCtabncxdCtKc0Q4YWlFWitmMS91Y3pNemt0VGo1OTY3cGdkczd6VUkxSTYvaXQwVVRzT0lnNnNGM3lINUNQSjRnZ0RpQzM0dDJxQUZZQWdRVExBMzhHUnpQOEV0SEcxSS9pOXc1MVc5TXU2NlNMbHV4M0t5M0tYMFJzQW5NVkdITEhpeDZGYnlRajBDVWdYcWpvYnVFUUh6UzJlYnN5OVNWUkorQVJxQUFSVnM3YmZXYjcvQnV3cEtJYm8wQ2V0SXJiYTlhV1h6dUhpeGRSQUlzM0xXSVd3SUtZSWcrcS9OMHdRMXpBaUxRZjJST1VYQnNBWE15ZHJpc3RTdlhHaUgxdWVTODB0dHFkcGlMYyswaFN0L0ZNalNpbStaM3VFZG9aL2VIbXplTGxzVk0vUzZqRncxMU5PSlptZzQvSHpPclRPVjE5NlBMK1h0YWNCNkhYb1c0T1NBaW83REZyMzVuSnNrWDBrQVB2WG1idTRTSVc0THBsR2NkdXhhTlJGMUx6ZHljcTVRaTR6a2RjTGp0UjhVTXZDK01xRGY0ZjloWUFhTXZ5ZExqRytwU2o2VEg1SGlIeDZpTkNYdUliWjVrTmRDSTN6OW1kYTNrNmJIRW80amJtR05aZHQzdVMyci9jRUc3NWlFRHQ5d2NxOHFHdmQxY3dnaWhtZk9DbEdQSW5FNWdtS3VkamtjV1h5ZFhxd0ROd3I1MVUxSkYyV01TVExESHplZ0Qwbm93TlR0V1dpTWZiaG1RVDFiL2lMVWcvZGc4ZTBJZnRMdEF6OTBEbzNFUFlYYkJsUFl4aWZjSE43dzhodUQwaHZ4eGtjNml4Tm1Kajg4RlpMdXY0SFNLMHprVTloNDlvbjd2aktudmJMdk1pa082Uk1xMjJkbjdadnN2SWprOFozZU01OU1BQ3hZdDk5RWRCL0p5eVdobVRVMitxRUN3SS9haU9Jc0pqbEdpNUdCMnVPNDN0MDloY3pLSWVqaFhUbit2UmJxUXI5NmxLeWZ1b1BQZm9Ub1UwSmZsek9sZnN1SW5VZ0t3cHNxdThVbTNRdUllZVd3OTlKNDgxN3dUTEcyVzIxcmh4MWlSRURTd1VnVVUyU1lGSy9KM05PaHp0SFc0bEFvREhCejJKU2hoMW51QjVrQ3hFUVpLYUhJSzZ6VHRhRFllRFFyRVczYVk0UjBkR2ZzRlppVGY5VDlPemtaR1kvSCs2NXp6S1c3ZzRadGVJVkFGT1Q4bnZyWTNuNVJTRHBZazZob3FJUWJoZEhwTVNzTXBxb3hVMVh5STd3OVgzSmZkTUtwdkdSU1JmNnphbkNuL0NUNXRxZy8xVVA0Z01FM1IrMG1VUC9nbGdqdXB2ZzdnRmRHbUtVdUZKK3Q0VkxXZ3BFWVZnNUlFUTNrNVhDRlRvSVRRYmJQaVVGL3p2bDZrK1Buby9XMktqK1Q2czJGRDhuY0I0THlXKzJGeGhuMnpmaUxIVjFTNmxaZFhaS0tPaWpncHdNQWh5Q0RPVU1jNGFZRm5oOHNjYTdKbjVKVkQwTXNlS3lRcEJwTWh5VkpzSWZrSWNUVXBCd21rakxMbm1zZlUrcy8xdFExZm1YNHlUeHpyeGZYUFZZNnJJelkzWWRhMDFGVzBqNk5GMmZneVhZQ29WUUxlUHZUMUJPVStiVmpBUldmNlZEYTdGaVVWZGs2ZDdFajJ1dTIyMlNVc3V3NE4xSnc4cU9VeWVKaVBmUmx3Q2hEeDJQOGViemhtUkZaREJwa3V3alRHMHN2eXpKdjFxbGtKWWxoajN2cEEyb1BaMW1NZVdHeVBuRnU2dWhkRTBLQjNqdEE1eHJjOUNrc3kzeUJmVFFuTVNLVmkxaEZUM1o3Y1dhWGtVNTc2elRNNUJXVmNJaGJxalBVMU54R0crSzVXNm9Ea0VSMHRsMU4yRFl1UmxqUjA1c1RVYVdjZGpKTUdjaFZwRUN5UE55VVR1dDJ6cGtlRHk5NENOVHFhczBOUXkyaDBvNzVPcHNyWmpGTXBnUlczZ09vKy9QdWg1M2Jacm1rVjlWQmpaK0NNZVlXK0p3NGdXQWJYaU9hOEVSRHBSRnZWMTRMU1JCUXg1bCtEVXJBTWE5Q1FKV3dnWC9RbGNHZ2d2aVBDRjFCa01ESG1lbGU1NklWWlZaYzdYcURRTDZoU0JUTE5WTG5lWmxjcmlhb2lDWDVBTjBhS21Xbkh4bXJtbjh5TU9yaHhVSUgvMmZmVzUxczlzbk4yaHRwT1FlY3BNSnAvYWhJMVNHdGlMUEZYMnhpcVBiWVhTdHNpZHpGZVUrUTZmaCtIaWo1YklLRGxYbklKa0lQTW1pQWVkL3N3cXZCL1cwQ0lsczdNV2F4aDMrTnVwcURNSVp2V3BobUs4cHlucHlKNHB4VS8xRUxtOGtLUVFGMXF6VWJ2MWV1K292aUV1VjBQM0R3RCs2YVJrTERtOXJqSEFqaDVWbndVM0t0TmN4MVVSd1B1b2ZsQ2M5RmtVaWFwdHFXUyt1MGsrZDN6MEdlcWpOYUZCdjArMUVxaDEyU2lkYzhKOFY1ek5qZThHTjFLZUFGWm5udmdXdFRUSndmVVpUMWNPVWs2eGEwRzAxZGlQRURFK2RBZ3NDcUFZOVRUMFNnc0U3Wk02ZSs5Z1JidENSY2ozRW5WODhNVVRBSnR0QmFpQk5mK1MxVGlDcEsxMnkwY0VibVB5bDZzSEh5OFJKUDlXUlBpc2YvaTlqcXRXd09HeGdwaGFUN1UrTFJiaWR6ZC9qOGRJcjE1MkFtZGNiKy85VER5Q0YvMGExTmdNOVRvbVBVam5ISk54ZStDYU1mbG5NNjJ6ZEUvWHhvaGZ0UWp5Y09WcG9Hd3RNYzY1ZUJYU1VkRVN2a2VoaVBZbDhXODdYRFlVeit4Si9jS3ViVEFrZXZoODZaRGNtOHJVbkNRTVQ5UHgvRnZYRE9LUUhRc0YzWlRaZ0FGVEtzVWJya2tsNXAwZXFRSXRoSWFUdzc4cXd1RlYvRXlZRGQ3UTRZQVhnR0N4MWxMSlVSL0IyY3UrcGN5OVZJQTRRaERWdHF1ZzZJb1A0dDk1V05PZHg0ZkhIZUJ2OU1WRGQrVWM1QkpEWTB0NU1QdEQ2U1N6RGcxeEkrdm1zQVdlZS9ucU44M1JGZDVVOVVJTHMwMitXL2ZuRkJnWkxPUGJWc0JqUXI4MVdtZEpvdjBoTE1jM1NxMlNZOHRNdzhrZ0xHcXU2bmRGVTM3SytIVzNETTVuNmtvRDk1dlp2QVJJYmVyajZFNUllL3hUQTk0c1JqSVFLQWRyeUdpNDZnV244YS91UUgyN2l1YzRCMEdOb1BEWXJvTjVjcUJJWG0wVVNFNms0R1BpU0hMeG50ZHFDVFY5Z01oQi83WnNTeTZ1UGJsQWNnS2VwK0l4bDIvY2RNUzdzeVVkOURHSEtSaFpRMkkyQVpWaVFoeFZSa1YxSUZKK3pvdExYL1NaVDMyOGhVa3J6RUxvNlpLOGlRTUFBWTBCVm9ES0o3NGFoSTFXRFVVUXUvWVF0d3BsTXdadmlwQTZEZlM2S3YwQS9CZGVMS0xDSTduRXd3RFVlRXNUSnpHSzlOa2xUZGpUd1FqR3lSdzBRQXN3SmhSbW0vYVVWOFJYTDltczROWU5seDd3ZmgrZks2Z09OY0FZdXBtQzZFRVhrd2FnbkZaSGJkeDBtclRUNzFyaXFHZHBhODMvK24vZ1JlU3puWTJVL1c3a2FXN2RXQTBtRm9pdVBBZzFDUVl1Tyt0WkR1YXE0RHRyQUgyclQ0ZG1YSHZYTnVvdTNMV1RiMW9rcXI0VG0wZWJCTGplQkx6cXNlY3F5RjZ1VmJJVzJSZEJkeGRrei9WTnUvTHFDM3NzS0FHU0RGVjB6dnVjVW5DbE80VmdXS1RHZk4wc2RaWmsyeDVyS2pVM2NYZ2NCMFp5UVBKVTFyWitxcDB2NWpUYTRmWDcySUNuamRhWDVPVFBxek9aYzVFdHBsN1c1N2lCVDR0Ry9FOTQ1aFJjS1pSMlBjd1Z3ZzQyK2o0R1pjcEVzT1VRRTkyeVJVTjBuTmg5NWRzdlI3UXdRWWpFY0F3TmRBTjljdFYwbUlwOG01b3E5a3J4aGJsYmtiaU5ZT0Q2M1dQb1ZpMEMzU3NncTE0VENRRVRTci9CTmJkcFdTZjhzSEcyOXcxcTdyb041aG1JVEEydXpKZVR0d0d0N1BDUXVtbVFlSEVjVmtjR0JQbGN1WlRxWEZsNFdKMlRWQ1FVVnEwWFFydWdUakk2MDhtN1Bhd2d1MXZLS1pEQkRtZnlnMDM2OFNvaGZCUEVnNnBBcHZnZDhXenF4Vy9tZ0xNVmRlNmIxbTRaYXBnSFI4TEVQeVV1MytYWU44dVdHam5XVThXa2N4WFIrYjdCTWxBalowUjF2dXo5d3VnWlNyRmtSdDNETUtqZ2JtcjJxMXB2YkRwQ0tHbW5wQ2ZkWThkb01Hd3hYN0dkU0lyWlNRMGt0eFlFaWE1Q1lxbnBsSzlmaXcwM1Jld0s3MUFqT1F5KzdDdkhNWWFGVjFlYlJyRTVReVlxVG5iZTgvS0RLUjJWVGI5aDY0RFJQQXBuM3hsWGRHVXlYQU1NdFVweW12cWUyS3lrTEpmd2NHcllXMVdudFdXMGVSQ2hOckhlR1B4UnJ1VmVsak4vMFVZUWNvbHFKd0p4emJuMWdMZW5MVWZMVVhpSVM1dElCalpqNGNqMlFDY09ZRkkwNlU1NkNlWGlLVDZuazZ2ZTZBR1Y1Yk1SSEJORURjZm83aG1ZMEphZ2tqMmxsTU1Wb3djU28zV3JzMmk4RTJGL3VmL1RQVnRiK3RnN3hEcHJEUFVWbWJkZE5vY2w1VU5aYlRZMFJ4dzRtbVlJSDg2QWJzUHhMdkFUNVVIS3FtVzBvbFBYckNhQmF6MHNYSEdXZzJmWVpTUmlqcFY5VDhLejl2OUtqVUtQSXdTSHZlaHpYb00xeU40am0ya2RudVV3Nyt2OC9VU2FkRko3UXdkK3JvNTQ0ejNNRWJ4OHVLaGEvL0p3NDNWbzdKWm9GNUVBSmNNYmFWczVvWlNaajVpbUdTTld6S1N1MmtIOVhyZzFOVENaMEx1VjMzTU12SEQrYWYyanlncVltMnhkUEJuZ3NQeUtod21DN1Rab1Q3ZXR0eDh5L1RvcjNZWHFZNFBQSnBMZ0Y2TXNEVUFjc01zbXhYZU94Y0FqcitEVTcveU9UQ2ZLekNMN0p6VnZuTmFycmh5MUpWWkt4NVFRUlhLWndIWTVlOXNVQmlRdTBnU1pBNmcyR29DaVV4Nm0vTkN1RUsyb204WDk1UnBxeUZmYWxPQm5wK2h2dTRPbGtxZXdrV2l0RGR4OXRTOWxLRDdvQkN4T0xpck5YVDRuT3RvZUFYN2RnYkE0SmtzdnRGM01pTE9SOVFNQXM4ZEdoQU4rcFJWOTZYR1hCUk8yUTZLb1VwTVJ2QVF1WndVbEVzVTBpT3BtVXdQTnErS0ZvMEVsc2t4NXYzalE0aXV0c2tMb2JUVjVFaGFCUkxUVkxFMHBERDdaUlB3T2JxUEFjaDNHMGErSGhlbWNhcW82Z0kvYm90UWU5S1BoaVpORXBIM2NTTHFkZ0hwLzlTWU4zWERVeWJEWXN0OS9SV01OL1BkMm1QN05CNUdTS2hRZzJtdFl5SHRETmcxMUpwYy9PZ2dHNWdRdFg2N3JTQlNtM2pKYnREUnpiaTQ0S0pQM1d2eFJVcElFVUJCbkRqZTRHbnR3UGRCOTFGSC9jbm9CSkZUVnBOSHFyU0o3WkFUZS9PY05ka0Q4T2pQTjhsNS9KakFqeWkwNWRVamVnNHVhZDU2blROM1JwYWRNT3NhaWprQStxalRHbE9Wa1N4RWtpblRyMnhNOE1ycGJRN2xLdzJKbmkwR3hzck50MXY4TkpBamUzYnZCOHFyWW1lQVc2VUpCUFZnN3RFNGdwTk1nTnFYTnBaR0FtTVpKQkNMTS9rVGNJZGN0Zk0xYnVDYzBZcFJUbjROYzNKSWdMcWgrdHlSNE9sSGp1RTZLSmVaOEkrWlJsekxmOFlvM2dldGUxakFOb0tFRU13Z2QyVDF2aldsdEZQOVBlUjNuMW9jM3ZmclNPbks0USsrODJoWWdlMFdMc2xtMGc0eFJUa1liUEFIUHp2R1VwVTd0LzhQOUR2UHk4ZDZwUUJ2d25qeU9oWGE2TVdkUFZpSS8yR2R4d2RodkVJUFoyMFI1UEhmSjE3MmNWUDJ2NDdaOThWVGVGcTNqZmtwc25jWndZbHI4dVlzeEpLdzRZME9UL0pMa1dQTTNFN0kramVBTlp4d2d4RzdoQm9iL2NMVzVHbTZlUEI4dTVJUjNwMEtHUjZKSE4rcDlVSjlNZmtSMnRFaTdodGU2OFk3UE9ieWZjQ2FjVEpENzZWZlh1TEsvWWhVMm5tSVF1SDVNem51YmhRbEhWQm1RZkFTZW1XM2R6b1FkbHdjZURmUnMrSjFkOGJ2ZFlpdUVObEtFYmZpZElHeDBZZjUzUmx3NVRxRVNydzY4b1gyNmxwTzNxQWpheE5sdSt6OEN3QS9mdzFXZ21QZEFsMTdCcndWNzJtbHpieGJxaG4wYWE3MmRMSTMyZXBrcFRHZnRmY0IvT1ZSNE5IMnpHSklud0ZVSnVtQkFsdElxSkV5TEYxL3g3UmQvVGhSOTRCL3U2RWZ5Ym14WXdyZjl1S0ZBOEkvRzlsaUtQeTdZU3Brd3ZjM3NOSjh6YjRZcXdtNUMxSUhIMmhPT2RKRDMrTjdDWUs5MUF1c2lJSXJhcGVPK1JST2NDWVVSbi9iWkZRVEloRDFBRnkzM0FrRnpSejY1aUF1UXdVbmw3WWt1UGlmVkZ3bm9zU0d6NXRLS1B2emFVT24rb3Baek1EUExFZElhNkxuRklOQWRzc0xxKzJvbXJpUHJzejlBUjVueVFoVStORTNzWVUwZW9tUEFpOUs0VnNLUzBvMVB2Ukw2RHl1RlZKOGp5YjNGdjhFUStXbERLZk5vTHMrUUxlelR0ejI5OVljemYxejFiWmdHd1UwbzlyK0tjdGlPLzZZRDFPQXk2b09zS0RaU2tGVHJtU1pWbjQyN2hhQ1VIWUZpZ2FIUEIvUW9aRzBvTU42UW9Za05QTXhNbUhXMU53bEhUUkRNaDRsOC9BS0ErWE5ZVTkvS0tpUmFtQy95V0syNE1YYWZlTmF4OWNVT1M2YXkxNWc2Z0xQVTdNYlVvZ3dyNUxtdU1hcCs4c0c2cmYzV1lFZ1ovR1RLTGZqTER2Q1VHa2d5eDFMbGovUHBwWVprdVc4QkY3R2ZzcWxvZW5LaUZjWjFKY3FnMGdOU2pRQnowUW9UQ2J2YlJyNU9aNVpyVjJxWmVwSExOT2d5d0pScmtCNUJXcWlqN3RBNVJ5QWZtQ05wNUlVelVZbjY1S2dIcUFXbktva2M4RkdvWnh3OFhtOTJzKzBHb2pLRERTVFNaYk1uUHd2OUMyamxMZ0hxdUEyWnR6Z0NNOG1nTTNVY1BHalZFNndaSG5jSTFhcGx1VzFqdWJubEo0dWRiSDhWSXRzUENxWHQ2MURtTVNiR3VLZkxjYTBKUXV6V014V0dHdzNMWllGUXBHZ3F5Q3A0OWxuTFZHcG5rQmJoTGNGbzYrd0Y1ZlVKU1RieWZmTVJCOGxRemlKRGxLUWhuYS93ZmJKU1BENzZMOGFqS1d6NEJhWndiQUV1ZVhmbUFNV2Y0M3E2aGdtZUZaY1dQUk1qckwzbUs0QmlZZTQ3R3k5M21MeWZFZlM5S3ZjSnZTbFV4Ny9MQVY0Mk4rbUI5cW16ZGJwVWRVUWtvZlhwTzMyTjYvM3oyZFQ4bXFsWlZhOVlrMUFhNHpMbElZeklkczU4TFduNy9Ca1RlNG16YXB1TjJ3MWY4SkpvTnhEd0cyVVJxZlVma1ROZklBdHFPRlJUUzZ5UUJPclJMSzVSV3BBRzVkU2R6cHdxVXdjelkzRDhPZ3BTNndDOFFDNVRNVHZzeG9ycGpuZWp2UzIza2dBekxlMDJnN0p5akh6YUIrSjRxZmNVdHB5TWVRY2xadXJocXpobHg1cTNtNXgzMkJDdWNFUlJ4cHNHSEI3OXZnTENUd282aHV1MmcxVW8zWG9kUk5Fd1p0RjhmazNOeGlMWDVkZTVBUkZIMExmckFsRGxJd3AzUmNEMGxkM1hoYU9Id0sxYnp5SWdUZFJVSUxDV3RMbEh6Qnk0K09tRW9wbTVLM0dNeVJFV0RQVmxzNkV6OXllcVhNSS9NVXYxcmJwTWVGalAvSjU3emlJbi9KemlxaEZsM0NNeWJJY2ZTRFdCNG15ellVbDFycGswcjI0b2xEcXpYbUJPZ3BQMUtHcTd3eTJiYlBoZ3Vvd0hnWm0xaUdTbjF6b05NK0h1c04wbmZtaUtla1hHTGMyNmk2bU9tc0Uxa0ttTHNMZjhORnRiRnlIMUx0TythMUVZcE9NaXlDNWZoKzNOd3VYWUh3R3VZZnVJVkFlSEZ5N3hyQUFrRWF4RERXbHU3c3RSclNkMnp2a0o1V0s1NzRNdE1qU1czS2RNd1RSVFFGaEs2dTJpaldpcGx3Si9jU3FOdWZqQ0NuWG1PNDZ3U2t5MmtibnNRU0RGT3d4ZzA3NmR6WWxNTDZUbkN2bGNHcTV6SjMwT0g1VldGYVI1RHFuUUlKck9WbzBvMUh2dHpwdHoxbHlXZlVNbW1FS2pRdnMrajBaa09scDFWL0ZsVEl5NHNucmlhWUFpcis0NFIzSnkwaExoN0tabC80NzRyZVMwNFhuc001VEl6VDEzdUdFWVB1NHN3eVRUNXNRTFpHWC90eitRTkRiRWVXTzNtbTZhSU5vQkw5c3UyWWh3VG8rdFBCTndjMFNqZjJ1MzI0N1FHSzBnL1VhakVKZkZzQjlSTWs1QjhMK1ptOWZKVjJCdjhDbitBWEF2bXZrNXg1R085aVlUcVpqbHZhY1ZUZEdMVFdPMmZ5UW9XK3BST2dybzFzMFB0TGFwazVaS0xub1g2ZjdGMVl2SEI4SUpvNjhUMnRBVXdpaHhiT3crMHh1QlpEUVlkaHdiNzhDQnhEQi9vYnVWME1hY0JEenVFbUVXMVdqMk9vK2J0VkE2cjVKczEzZU03WUVCNHVGZmRiZHMxVk9sWDVkZ0dYcUtCV2dNRlVNdzZCTlNGS2dQY3EvVVdmQksxT3NXcHIzOThubDVwZU9yK0YwZGNZV0w3RXovTUVtckpkS2tsS1VSUVFiakc2bHF2L0l0ajNwU1JoWVpkT05xMmJDSVI0Z0lxU2k2VSsybHEvaHpZazZFMTZGTzI0TmZMY1Y0SUhGcjlscXhoTDRzNlA0eVFCc0JlOCtjRTdUOVRsOTJia0JzN3VNdUZ1dGVtelBBZzR1YnBGVlRCYmlzMEZFM3VRMis5bUJ3M0o4RG5ZYzNtL3FWV2llcmpBM28zcHJ1dFhZTENhQTFSYnJJUjFkMGFtYlVGWGV2ZCtPWUZNV0FQblFPMTB2UGVtMVZHKzFDYytmWWRMWkpmNUY0MnU4U1BOa3NTNnZuMUhyMmhVeFluMThSSFNBUERLcFFZOVk3NUhRT2VxcjVFd0hDQ09JODVneFVlclAwM0hzbndRV0ZUWEt1OUFsdHJNYzNaanJjOFMvaEtrSXVIT2ZDdnBNdTdhQkdpWUpOQkNzaEVONXVxS1FpcGE4WWFzblZML1FrM2NXSGtuN2JYckQ3THQrNFhUa0RMSktzZkxFZzJlbk9JQUJRbGZkMlpMbEVmektvZTdZOHJ2M09Na2duSThlSEJ1SDAvT1B5SEU4ajVBTTJCcUJDZXRPNkdaZ1k4aGg5QmVZWUtZeldoMnh5bkVvMkptTWNlS2hBeTkvTjJoQm5GUDczempKL1RXS2VKMlpBUzdIVTRBY0tzNWtWTDNNODFKMnNSTEVrenRUM3RkK2ZBalhWc0prQWFocGJFb1F6Zks0QTNQWE5xdzRxUUJwQ25ZWWNzVmt0SlpnVXFndmRrUzRVRldwR2dHaGJmUk5QQThJSkNGRVJDMGdvWk5nbHZ0M1JIN1pwSzVrVmgvU3FvQmRoZjlQMjc3cHovRnVxa0lCUDEwNU9aYWxiTHM1cnFyR05zMjRZLy9pYnM4RXRpZ2k2ZXl4amdsZDl6LzBCZTN0Z2RYejQ5TEJKQ1JQNi9semdaSFlrRm9jOFo0a094MnNhUVBjUmRVZjRTZVgzKzBsbTVSVHZSQ2EreVVWZnJpNUZuOGZSR3BualFkNGZGaGlKUGorOTRONVRyc3hEa3liSDJFZ2M2SFMxOGVoc1ZPYW9zNkM1MDJKcEc2YnJmem9lajQvV3k4YXROeTFwRmJSN0lHckRqc3Z4L1JzWWhlUS9NQWNOcEFBeG1qbGppUjFOZmlZWUc4STYvSXJDNXVjT2JISTgvdTdWVjVpMG5Pb2pQRmtNZmhhSjJwVWFOUlQyQ1Y4dHQxelh0anA0a1hmZUFoYTlvYTRnbU1QUEs4T3RsMllQd2tNc1hQaDQvcW9VSFp4dWZjcmQwUHR0dTEwU3NSVGpOMVQ4M1FNS0VoMXNoOGJybWFzY1lkcTFRbTBSaVVSK29PVkxxb3F0RkxnbmNNQks1djVGaktpWkoxMmhlT1BPcm9QWTg2MGk3UG9lTXRMRlljWmk4OTBYU3A0c0J3OWdHRUVINFRpWXJFMEdHL09JZm4wdXN0cUdYdFhtWXFZZzJ5UDg0eElJKzNRdVJKNUhXQ3V5UUl6blR6T3FFTXFPTmJSYjFNQWdPY3dIOWtwVjdSelo1UGxCZURnM1F5RitUTjIrM2F1bUo1MUZsOU1zQkhxaDNaUWlJVlJyYnlXMDlUaDcvRFJDSzlua2RaZzIwVnJleVZQZDRicDVQZWpSQnhVdEpNZzE3WXNKK3RsMnhpWXczL1dWNGNhbkxESnZMakF3bUVOWE9RTktwczNUUzZlQVhVaGtBNTdEanhtWG9CRFBsdER3VE56TkhnV0FET0NXeGpZaDMwNC9wWDFOMThJLzdSVVhtN2l1bHR1RFZCam81UHBsUmlOOGNOTFFkL0RkeDFyejZWOVRtYkZIRmhJR3hpRC9FNFNaSTlOaW9Ka2VGSmFaK3VZTkM3Uk10UWgxN290QlhzUWJsQThwYW01T1BzNWhmcUl5UFhEcUNTSGdycHhwRnlPQUNxRHVmTlR5cFhYUVFlVFhzTTQ0cGJ0Q21WTklTVk15L1o4S2F3RkZ6d0d0dDdUZDhNMTZsbkVOei9SNEkwTXd4dVdzZk1hSm41RVd4aTNZTXhYYTY2VEJPMENlNzVVWEcwbjBoSTdxQUhJUXV6S1ZnTnp3WjVMQ21Yb2pQVkNPaDVBb3VBQkwwR0l0Q2lmVnI0dVRRa0JqS2JqeG03YWZLdjhOWTZua1dpZ2hKekRHQmpobU9xSjJHNkw3UkpKa3FuSHRGaVZ3Ni8wNXB6aFE4SVQ4aEdJMVN1UDZtdWVlVVNwandJTXd3QWpzRFhSWlhhRjBDRWlqS0tRYzgvSHFpa1V3SysyQlpIb1djUGd6UnorN2M4UjVxSFR4UW1ZRlN0b3Q0U3NDYktBTjZvMDN0UU5teXJCNG8xSjZQdjRsN0htblNwLzUxaWNPUHZlbVVyRC8wdDRsbFBFemNRdWZxeDlWWkpHM25pcDRoV3JZdmE5SFpURVhEeDlMUE9QZVhzVy94MnY2aFJLdlF6SHpZZkpvMTU5TUZvN3VLZVdKdWZsZm5OclNqYUxlZlllZm1QSkk1c3VvMFh0S0U2VlhIQVczSjRpVVAzTTBJZ2RJcm4wNGhaUnhYMGswZjVHTE51T3JJdDhaU3JKUFlyWGs3RlluT3A2UXp1U1Z3WWZ4OHZVSVV2cHRoaWZXcTFuY0FhNkpCZVlaQ2dqMFhWd3VXU3lJUktkTVR4WVcrOUk3bmhheTRaTjJiSExpR3dHYWZjeC9yazNaTE9uL09QM05tak1Wbld5RlZUa1BXNUJTVk1Ub2RYTWxCRUkrSDcwNnAxLzVvM2RQODJYRGFOa3MvSElQV3pCVHZFUURka3FGTEovUkZpNEpiWmF2c2lLdnpaVVdVYUVyVHJhaHFhTm1NRVRwNmxRaUVMQmVhbzFzN2ZKWUhSNmNlMWNIQVYyNFF3OXY3L09qOTBQSWE1amJqajRhVHB2eWgrK2RYeUJ1aUEwaU1WVjU4RUI4TFhhMXpiKzZzVUtSUUYyYnV2ektZeUNnWHE3cE9TeUtyN0dXZWNqbWhsdjZyZUh3SXhuTzcvc0pGa3FCMU14UHh4bDQ4bkFYbEtsbXNET0Z5d0R0VElxdnlMa1FnREZhS0kxektrSkVnMTlvOEdoRStqZVJFc1BsM1RkbEhNTTI4NC9tYVlsaS91NE1xK0YwUE5KUXdQMTZBQXpBRU5vdUdOSEg4amt1cTZ6NjJkSTNQWVlNYzJrSExnYTJ2SkFnK1l3bWVMWU5WYy96UThZdlVGZUNZK0JaYWs1VVUwNnpiTXpNQ25TNE9CaE1CWFFINWUxeFJFbDVhbHB5c2lxM1A3Zlg2N0Q2ZmFDd21PVVRMM2lqYkVOY3pFbzFod1NvL1dXTjFMZVV2aXZsaGx5c3EwSVU2SSt6OGI1bUNXWmpKeVN0Tkx5NE43OFZBSGVyWjFJRmJmajErMW00akQ1dTFGYUN1a3BvWXBJa3VQWmExVjQrdFVFVTVQRjlPU1hLUVZUT3piZHQ0R3BrU2txS3dRTGhQZjV5RlVuY2V3RVRoa2s1NUROdUJXVHoxcW4yK2lZdmdibzB3RTZxYzRCT00xby9ra3Yyc0VUZWtCRlYwVWlpV1dGYzkwcGVhVE1vaWoxOEQyZ25wcThDdnlvSStKYk1RbnJicEhyWjdCQlVhVFNhekZub2g4Y3dsWHpOcU5EcDJvQ2ZpYmNMSlpKZllsWFNIcDdscXV1cDh6WHpialJaNDJQclBwMm9yM0JqL1JnLzVKUW9IRXJPdVE1VGtGYkxqaHFBeGF0N25aNXhUcUdINzFNSDNlUm9OcTYxOWpMSEhEZ2kvOHRXRi91NGVLcXV0a0dCbGRFeTN5ekNUbmE5YTlrb1ZvL3NaTHNvYmlYcmxTcjNTNjNCWGRVZ0RyU0pPSjZvUTVoT2RCbmRSZFZGck1WRzBmUkhTM0xSdm16MWJVVk1wQ0ZJMFg5eDdBaXRibnFiT24zbDZWcyt2b2plVmdZZGU0cGxoZEJMOWZyeDBpeW9vdFUvcHNnZ0JMeGEwS1ZTc0lIS1MvTE9EM3J6MFN3L2FxSjhxVStCdmlwcUF5VFJXVWttcWNtTFdpZEY4WVYveVBEYWVoWUwvT1JtNllXa1Q4OThWTTI5N283aDdjWG8vcjlxTEVQRUt1Zy9GMXpka2VVNWlDaVk5RmJJSmtMUEhNVCtMbVp0eHh0MCtMTE5SdStIdkt4TjVNVXUxdkVpZTJTbVJkdlEwYjMvUlVSNGdqWjRHdWVvUlJucUZ6VVBvRDBJSDhyaVMvTWs3cVdtSDlFNGE3VnAxUVdPekY5WFA0bGNuYmV6TkxpNU5aeUQ1MEVETm8vd0RqRHRFL2IvZFY5WG9wWTZleUpaYVB1R0xuUy9KT3dXWDh1N2hiWW9Kb1FJRVZnNUZoZ2o1QVdBK0NGN1ZJMmFCLzNubEVQVXBzRGdLVUt4dkVWOEFpSjFoazF3S2crdWRpSXlueVRXYUV3eWp5ZWIyczI2bUtINGZxeVpiT0ZWRVNmU1ppemVlREdBSHFaUk9kRlBDSFhLVlVOWmtvMTROQUd2N3VpU1Vsd0s1SURURkxYSTN4N3NUSkJuMnRDNWoxYUloNzhtR3ArUFNzcFpBMmlhalZuRUhvaWkrU2JJMVdIYTliTzlIeU9TcjB3QjZUazN6VFZaM0RkK3hqdU1pVVFaR3ZLQlpMQWVFeWtpd3NUTm1oUUI5cmIzcHdkOXh1ajR3bmh6VE94QW9wUUhrc3FsRGtkWUtFYmluVnFMZ0JRekRNMU1SUkJWdk80Q3pPeVAxOXVHT0hNUGdpWXYvQStjUlNpcHZzeG84WThVS3lIVG44WnFSb1JVVWw5clZvMTVoVWVBeXFpd2N0aXp6ZEpzYkdoNUpuZHgzMlpJbURWQjNUR0lsYTkyS0hLK01WdjhJNElHS3BvNWtLRWhkMDNrUkNqRU05czE5VGZ5Ui9NZGxBYnZiSkI5MGJEK2g5ZXAxSzA3Ry9yL0tybzB5dytBWEpjMmlSWm5uL29Cd3BvQkdxNDFrODBOMGpJVGZMN1JpQnh3MUU5aHN5bkpZa290MTdjeWtsclM3Z3pXQ3pub2pLajM5TGZvaXppQnRHZ0xzSkk3cEZpS1JHajBQTFBFWDRzWkJKSUFMTHlEdVVHMFlkMi9UUUZpYUNyL0xScVlEelFLYTgvd2wyT0FOWjViMGI4dHIyZnVkRkIwUTEzR3ZHM2t6MkU1c3JPN284OUhuRXJKazcxcDRlSERxYTlFbmcvZHNaSUhwVTRYcnNzOVFXaU81R0JPK1lYc0NYemJWb3hUTVAwSGRJZGVVem9tQnRaSXc4OEtyL0F5Z3VJZnFPWUJ4bmNGcHFFbkpVN0JtNmVpQUp6MnJvc1hvc2lIdGlvc0NZSGltMXRiTzgvT2ZEV2FMeUF2MFhtdGg5cFNRN2I5NlJqRXgwTjlOMGw4L1ZwT01LZzVSd2FFMEpOUTkvdDVOL3lRVVlGZC8xSmlQcG5hMy94RmpPUFdheStPZjRlQ2lMVkY5ZUttYS9uTXdrejdmNG90S1FuV3o0ZFFwY3hRbWJ5cGh4aGUvVXpEL1QzWnY3SGg1YmRpMXZqYmVab1B2VDh0L284b0l2eTBqLzJUdm5HNDd1T0Ztbm9ITEpzK3FOYlJIY3M5My9uLzlCcDAwWC9BVU1oSGZraUx4dktLajBsMEhBaXVCbWozRmxxcVJVSVQ1YzdwL3ZDTGJwaUN6YmUzemFicXo5WCtYclhkWEpCZnZpRFBOWkZ5ZkJNNEdtVWZTT2JIYkYyb2EwaDY3VGRybTZudGtjaVZOTmJKck5uTVZONXo5cmU2NTdyQTdzUFFEbExZTHpkQ2FOSkVWM3VhK0l0R2IxVlF0SkdleVZXaWh1M3hacFZ4QWpURDRLbmtLcDlaU0M5MlNjdVFuQ3dYTTl5VUNkT2R5U3hkR2ZmY2VtMkM0TnduV3U1Q3EyNTJiY0tNOUNUSktaVVhGalVGSk5qWFducEorYkhlcDE3aUJlQkFQSWxaM3Roa0VUMmxia2RoMnFEZDdSYmduOTl2d01CZGozSFdJTVNmTkhiN2hEUThGQVREVWhTak1PZkxBV2lkSXVyQ1cyb2ZJTGlwNTFFcDFRck5YN0h3VUtLbVlYMjZmaHVxWGNnTWNkd2RMaUdXY25YWlE4azRhSlpzQlpPOEhWVHFYTGRIdGZLeGRKVmdIZDVRTmNha05hKzVIVDdNdDhNTFZjZE9xYVhUY3R2dlZVaGNvUVJ4VHVSNFQxU1JadWllSnoyajc0Y29UUDZWQUpINGcwNlk3Q1FHd0ZVK3lHWUd3elA5bVg3Nzd0V2dmcmJ6NEptK0FTMjN3T05pamZCRzV3dUxTdnhvQ2lNTlZuR1ZIWlNTcjdBVHZyYnlVNGRnVGJUaDRsWFQwOTdWM3BFVVF2UkJzaGYzK29TSENXVUlFUHNGV0JBSXNuUXRGT0pZVnhoYkxzZCt4SVFrMm1KckFiS1JvZmpoRDJhcnBOWmRPaERnMFZrdDkwbmtRTCt3VlllWHducUVOY21NM3p5TkFjR0RMaG1GaGwxWTU4NVdxWFRqRHN6WVFpUHQ0TzNQUWJXaTI2Q2l2bW5PVmNmNGY0L1FzRzZsd2UvY1JVVDZXa3hwVEs0S28wQzhlR1M0Q2l0SEZNRGpSc05rK0pTMHJVOEE2NmtHTFRWK2xZR3JrNU1nRGp5WTcxUW1jczZ1SGJkUU5ua0Q5dElJanpaUjlTclUzNVMyQjBhbC9mZzZxNnF6TmdqUHdWSDdmdVl1eW5iUjdEQlpkQXFMREJLYjcrUHNWQVMyb3RQU3E2UlJhVE9YdlJLWUgyekRDVDcrSS9uRklaRThQUUVQelFJbGp3cUU0ZnJhbWoxUENFWjR3TjZNb0x3ZEFkTHViRWp1aUpialVwLzloMmNvRStJNGJRZnZtYm96TUY2TUgySzVEcHAwaGxvUWo3c2NKVjNXZVIyK0swT1ZhZEhNL2EydjcyYnY0SGdSUGhrZFR1QklnNHhpNkJJc2R2UjBML2FPV0xxNk9XbWJjbnM2WXR4ZUdxbkNGa0hUakdPUlplSUhBUlVzZkZPVTdqSlUxenJuN3JXaFVHa2ZITlcyN3Z1UEduaU12VFF0S2NHdVVXMENhTDBITG15QlpjcTdEV2J1bVprWFhGT3hCaGlUZmo2UzZqNkpGY2tXaTNpMjJQNlFOT09UaVV6MjFzbmlMaXhlOStGbWZtdGU3d0t2RXowNDQvbXNzSERqc1cwVkF5UEZzNkh2ZU5XK1h1TGNvVU1tWmlqLzkvMko2TEFZMFdPZm1iUExCallSTnZaTU9oYmYrZ2MvdmlJV2ZwOW4xa3M1aFN5dk1FSzlkcmFhRWtYRWh5clZFTmRmemQvclgwL0syejBIMTlwaXBuVkl0SlpDQ0h1ZER3ZnZ1dXNaa0JqL21PeHBJNVBBNFNNRU5WOTMxQ2RaUyttL0ZBSXgzN1ZZOE82YWxwQnRFSS9Ob2RNZmxiN045Yy9DQnJrT0ZYOWYyTEN6dXJRTU5LSlM0VFNJcGQyc1ZsRXZJTjFHTnZTR3pmVzllVi96aUtRcjVQaFJLeFU5RG4zaGF1blorditBelBaV2JlZ3NyS20xNytUNGtrQkk2S3RjalJQcjk3VGhrUlBZVVdGWTVFR2hiZXFGVXcrN0RUZVBRUTcwdlBZTVNjYU9CQXZxWTNETDdlRmI1Y0ZzbHoxYzg2ZXZESlJZU2p1d3loWm5wYXgvYndvVzRKejNEUEYwVE9XS21iSHo5ejBRYjFGaDcxRWlneERLbUFCMFd3SlRMZXExcCtOTVdUM2ptRHNGL2VKOXZubjJkbS80aTRidVNOb1V3bmJneGgwNE5CcU0xdksyK2VlY0NGRng1d0trN0hSMThmVjJrN1BQNCtEd2ZHWnFEL1VrRTBvYllyWjVzWEZGQ1dBZ0ZvKytTaHM1bXJKWHY2dmtqRGlScFVncWFLTlhkZzFVd1NEeGo3NjdCd01vcnowdEsxVUtGRWxFUG5ISXoyQUxraTNyUC9PR3VheUlxenAzc3RYWEE1czFreVpMcmdoRkhzVzlwL2NSZnU4VXptamNYSktaSm5TVTBiZnRzL0NmT1VQNmgwbDQxYThpVjRra1JReVRQd1Q2OTQvWFI0MDFscTVNZkxVZFpHcmRTbElEQkQ1Mk05cFkzd2k0M0FnV3QweGE4SUkybVpJQUYzWXRPQmlOdDJGVGU5OWdyL3ZhTnJWcnBBMkxneWcyT0U1MFhydytSektJWndVa3RIU0VEa1V6OTVSUHhkb0hpR1NoV3RoSXVZem0wVDZzQ2YwWmZRWjI0MTdINzJENE5xbXhodUZtNGQwa1licTFXVmhyNUFTNlgxMEVXdm9SUFpIbHJ1aXZ4Tlk2Ullucm1TbEJMM1orVkxwZHNRTjAwK3BSa2xvRXhBd0NrazZHVTIxM0dEV2lVc1pQd0J4OE5YcFJsbkZqZE4rNlYvb2E3d3pFY3cwZ1ZGQmhOWVdQNTVacUNDTWtNL09XT01OQy9Wbko5K1kxWE1jclBoNmlYYkdnNWdVVU9hWlVZM0dRdk83LzRkVXYyRGNmTk1NY1BTZXN1c1ErRGpRYlhRTmlqM2gvRmQvbitTQ0F3RU9JNTZ0YlpReDB4ZjIrdG9VcTNieHhING41QWowZXhKWHM2d2Y3dXRoRWs0VWdubEIrc2t2cVBqalB1WEp3V0tRWlo5aEZ5RDRtNXVzUHdoUFBaa1Yyclk5QmprbW5Ta3ErT1Vrd2JhbnNjV2dMWG91b0xLM25rSitVUEEzOVVEYWFuZklMVklqeEtldXI5TExaNnFseGdNNytDMm1uZFE3MHozd0Z5ZXV5dGhWcHdHRGZ6azJEck9xSXlYK3ViTUkyaEdpREFUdnkyY0FSbEtlR3hZb2ZWLzBiZURVbC9MQUFiMStxTWVvY3N4N09UcEhKekpGNjNRV1hiVTBWSk1CTE9nQUI5bkZURFZMTFJoMW9vR2VPVkZPcW14dUNUcThsRDNwdEVHTDRQeXVGbTNhaWZPYlkyVGlLT1licStXRDUrRW5jZ1ZEc3FvRnk0dFA0ZlpTQXg0UFpYZllJOGVrbGxoeE15bkVmQndPczA3RUlJWm5pTExJMFJ2Rm5pckswcWYrSVZRYit3SjNJMEVqZ2ZSNk81K2pFRThFT3RZMURLT3cxZm1ubFlna3BBb3NHeXViVC9VY2N6aWRvYjc2ZEpwY2J1d2Nsdys4TFhNQXhZTGNUVW9iSzNPTUNPdzZMYk8zSTlpQVRHNElhc1FOZ1ltcFdkalNkbmxQWHd5aGIvY3VKQVd5cmdiZWhVZHpjRHhvdUx5VVM0blEvMmwwcm5nS1hUVU43ZG8weGZhWFV2eHZERnB3SjROMzJaMm91RGNOWG15L0F4Z3NBcmdxRVJVWkM4RysxUXR0WVJZazFwWDZPVW9Ga3JjMlpRWTZsY2NPeUhiejN4YTlnSVhGa3NSeFU0Nm1ETWpnZ0R0R096b0xlL1NIS1NFNWJFT21rdWNlTlJDVVNLUkVoLytJbGQvQ24vTE84VWRMNWV6QWw3VWN3dE9iN3dtWFVDUk0ybGJMbW9rVlhCK2wwV3FRZHI2Q0NUT1p4SU5xQ1Yrb0czVXpHT3JrY2hrb3oyUlpseDdhSEc3RCs2c2pjWFJZa2hjckNHZk9pano4OTZhRkU1aDEraWl0clF6anlMQ2lBWGd3YnNTVUh4UUp4cTFra2dZZmU2VmgyRlFTbjkwQ3d5ZU9ZTU1vRGdNUGxURGNKTTFVbTlYMll0eGtTRkdXaTgwOEpMS2ZSZkcvbmFlOFA4djBUUEkvSHlzL1pGUHV4aS9OMjA2NjdrbXpCSkNKVC9jaXJCWGVCSXM0SlhrWjlJK21BUFAybTcycHpwQzVscDgzYUJCOTBpb1JDTUowV3RSUk41RFlHYmsxTDk0T2IrNzNSWkhhc3MwOXdkM2IyWm56ZDRIUlU4V1dQYjIyTXk1Mzk3cmxpL2tiRDBQNlRwKzNXRUxHc3hUcEFTRVZldzEwUlJIU05NZTVUWEozVUFJaDlCSms3a085UFArb1VpVWNNQTBla1grS1JaRC9qcVFIWGE4N3V1OGNOc2pkYzUxNUlGb0VvWlBFZHIrdjdGM1A5NGZsc2kxOTBPb0NjNXQ4aFZtaWJRYmlrT3VVOW5rSVpDVDIwUnBMdFIxUVBGeUNGMDE0L2FyVi9IdlNIUmJid3dJWThQaXpCSnRmOXdBaHVhVERMWGZzNnhWYVFoeElUUTQwVlhKcFJFd01GSTlCNmdZYXYrQWw2NUtUM2dDVnRRSUEyRWhhamdWcjZWNFR6ZWhpZzdNVnlGV0ZoZWlaQk1MQzZqdG9LTnFIUTUwMG9wZE9reE1VZGZwM3k2bkhvNGpCS1NwRjB5cWFtUXRSMnJ1SlZ2Z0EyaEtZZjkwemFwTENjVGduSzZDK1FFWFlCOVJ1c1pSakJ2RkhqZWdrTFpMZndLeUNiOW1CTGNkelBMUjZsVHI1aFR5NlJwRnE5WkllbFR4SG5TOGdqWWgyNXpnVWdBeGw5M1prZk0reU1RY3E0aXNhNDFWREY2Z2lpZWh2c2tKMFRRMXEyaFJVbkV0VTlNYjB1RmNCd2NWNUdIeXd1RlM1UzNBVHhrQWQvdFRwN3hnWHMxVHBSQmdrQ1dRdUR0TnQzWnFJaWxvaStjZHlxYUxwTE5XdXh3cTJUU2c2RDhLUjJqSmNxOW9VK0pYUVFub0l5eTU3VDZRUW1VR09sMzdkWHkxYk9oTEo5TVhFZ0tsdjFlMFBCUnRTbVMvSVRPTy85dFVoc3hxajBZMUtOWWNVQlh2RDd6V1VEbEQ2YkpFZlp2bjd1Nkx1clUzcTFqK2QvMDJFcFpYalg1Ym9zTUt4R3dKQmd6QUR4T2pWR3FWVUx0MlgrWE85eUlzMmxoMzlpMjhCRmFZWEVPay9mSmIzOURjT3B2WWwrWThPanlCRVhYOFFsRUZqeDV3dytuTVVOcFVQeEh4dzc0L1NjMzJ5S3BMQW4zY1hRWTJWdG9mZlk1aFQxb0tVZEdFSWZVRTNKWnNORVY4aERaUmtRNFRoR1VTQWw1SzUyRmhmT0JtaUY3Q24zRVAwNEpLSDZ6RXZ5NUpRQzhBN29sWmJ4bzJlZVdUK3M2a1FPV1l1bkJIc0V6WEx0SEJ6WWVpbFNmYlgxWXNMbms2TlQ2OFRYa0h3Sm95NXhjVlNTR21EMDRBcmd5U3luK0ZVdWMvQ3RQcGRiN2ZTeTdsS3c5YmY4cWxFWi9QTWVPTjhDZkk1TFBySUlPOFd0cFAwQ09nb2hWYkIrZGRsTjJ6TXZkZTdqYjhPSFRDbFBhT1d5T2VrTEJVTU5zQXBVSjZvdlpGRlU0ZE4vaGYrQTMxRnlseXp4d1VSeFN4Qkw5M256dGlXbWNGYUpXamtGWXR2Z2MzT1JyNXFKK1VVVUZMQUorcFgvY2MwVmR5ZGVwT2dGQXNqNUhTbUZlVW5WWHd6ZE54Rm5yeS9GMi94Y1l3ZDBNY0c3aVVVUUFqU0VFYVJNamd0NVYzUGQ0OGowb1gyYXk3Szd2bWxvcm5HTnR1a01Kb2xyUXNzVm1LMmhpczYrcHpmYXQrUEljT3VIUndpUDF6ZDVnVis5c3Z4QUJxSnF1SmlyL2RTSEY2RnJPa0dxdFlFZUlwMUhCU0YyZU9rT2pFVGVqQkhhQjFoT2tRdHJRRk1XdnhLSXo2MmNPOUQ0QXVOKyt2VFdnengxNHhFdVBvd2U1a2kvczNSVVdJWXVjWnY2S0hST3F5dzcxVldmbDVpUUwwdHZvcGQxa29obWM3YWc4QW9XL0kzdmJFQmR3OFZkKzlqaVFPaG1IRmROc2ROVGtKTTdUeVFONVl5OXVDSUdTdWNMaGd2QVpQUFhkaFdOaTZmckRBbWFTSXM3SXBGN3VML0ZzczdjRDBnWkRtMjRRUEFlS3NabGVPM2lyZ0FJNGJNbzVseGM3dm1kbkdabEFYKy91c3I4ZU94eEc2LzBzM013WDlKWjNTUnVaVm1yWk0rVksxdVBURmtKWUJTM2ZLSitoMVZnR2V0QnF3ei9SNy9FL3pRcjRvSGRRSDQvNU1Mb1FnTi9NcDIyVUQ2c0tpSWY1eU9jYko3R2wwbVRDcnhYZkZsbDBTbDZoa2hudmMrZnBaZDZJaW96RE9pV0x0bzZMZUNyZEJ4OEFVL0ZrcnV2NnovTC9TY1B2VjdxdFFaUXVMZnBwSFU0ZXZRUHRXdnRnYWxHdzFmWndCSkFzdzM4QTF1eGVaWTVYbWxuTncreklZZWFiSzgyVnpSQnRPcWZDdW5mb2x2aDFyRng5cHM3QWhZaDdFcTNuUnc4WDBtN1BhdHFhRHJHejl3b3hmL0tMcklTQnczUEtCQVk0NmJUdXUyUzFOb3hPTmV0VktUSG9XRUFtUHlxcTJmMmJOUDhoTUw0blhmU09sY0FHUFNhTVJGUzkxRWo2UFh3RWJvdkx5Z09IanlraVZTTS9SQTF2L2NwWSsyUlZhNjMxMGlvaVNvMVpNU1I5MHVGMnRmNlJCUERCTnFHUXJ1bVNzM1poS0YzZjJIVFdkNThWd1IyTjRPNHpPQXFPSkZBUXNTUWRWeXNMRzRMRG0wYkJaLzlSOVJNN1MvU21nVGJTQlJLTVF5WWY2WEl6K0Z5dWp0aEprdlpmWGUrOTd4SSswRnJ4dHFXMC9jcTRjSUpnU1NGSlZHRDFHZm0vV3l2KzhOOXRSNUhCZ1RNQ2YrMDBkM2hhYytxampXRW1ZV3lIeGs5UHFQczhiTDVYUGUrZWtJQVVsSHRPR2JJQ09UMW5tbHFvMmdmNytkakhpUHd6Q3BDUkM3TGVYa3oza1RZWHpTb3F5c1BTNEp1ekhBM2ZxaEFJRzJWTWV3VWQ2TTVKQ3ZFeTNyWkNwdXYwOXB0T2xPb3k4RHYycWg4R2pWMktpdmk2S1RGQzBwVFM3YTNCbGNEY1BjL0Y3U2RJbDR1VUxTMTNWZ2xKc1hXTlRVMExTN1dwQ2l5MG1uSkk5dy8weUdJcXZMMFBlakRmQ2RoSVkwaVM4NkxlN2I3NURrV0JuRFdFV29vUzJmZ3NWQ3J4aHk3Umx3NGV5OHBZQnlaUzAxdndibHNHRW9QdkdPcTVKSmNpRUNZajFFVHN6b1pxcjQvZm5pVFBCc3JYd29tOFlnZXFmR25QUFA3L2YxQm1RaklWcENtak1DczVBaXFxV3dhbmxKVnMvemhBWFlzVTQ4WnFyZGhCVEw2Q1ZHWURSRk9iT3J1WlJqZ1BoakVyMTFyQ2J3L2p2aEt2TG5sZUtqVFRqMXp3N29XZk4xM1BFRXpTRGwvaElhbzFrcDJDTEpBNXhKeW9rN21qZnp6cUJXMEhBNGN2d0VkUkdTUVNoM09kUG9sMDEwZlRKRFE5RzRnL2poRUxreFVJQWpWS0F6bmcySUM2dG9vTVRqSFJaaW5ZajQ5dGM4dHFqU2tlTlA4QWNZK2M4UzM3dGswV09qY1c0eitxMGxxNVE1MzJubGhCRlVKMTNVZHJaKzl3SlVoNjh1ZjBMZDZCWEF4czh6cWozaHIwWUsxZXMyc1lrQytYemszK3FISmF5TXdRNjJYdFhPOHlHaGZoUHZqeTI3clp3Y2ZEVWNmbGoxeDhwb3dSQ0IwZ3VSQ2FoL21aWVpIanRmdmxtM3ZDMUd3R0dxbFNvVGZLeVErRGpnblozeXYrc09YNEtYanBQMlpXM1l5eHJLUnV0Wmlja1ZGQXlVNGlzbkJGSHdiTmdxYmVjWmh3WUZXT2RnQVI1aVp1NXlLa3hKYkF2c0RyWk9DMXRNTDhSNGJvTGYwVnRKcVNNZTNJRUJod0pPaGl1Znp2OVd5UmJZbHNYUTdoOTJHR3gvdEkrL3BGMzN5Sm1GUHNUTk9SRW01WFZDL2dpbVJDZVlyL1hua3dWRFdSTUdRQzE2a01XN0ZSY2FPZDh5bzJQTkMyRU4vOWdWdGtZU3lNZis5ekdXTHk3OE11M3N4cVFUQzIveXpRNXFwUjdIelB5VER0cDlhRFNKK0MySU5ZZE1zcnZVdmZqWG15U0phWU02UXFySEF6UE1hcXk4dnducml2QVVzNnhtSkVDMGtoaTlubTIrdXZ1UHVaTHMyK0F0T0tjbVFxV095TjVJMVVyQWZXQmZFS2U4VldNb0lHTkNkSzN4ajNGUWVCN3Vyc0YyWElTTVBHZzdMYk5mbGRoME5ZL0F0VVBHSVduczlpS3diT1BiQnh6WTAyTk1kK3d6U2c2bWo2eXhQbVNxUUFjanFhSktyY09kamxkbVRORHdQd3YyeGtPcDlva1MrNGpXS1F5MVd1dGt5ZHJXKzlMbVlaUWcydllETUg5U2tPQkY5WW9qUTFWcW00R1JtcmJXSjVKR3hqUUhIanV1cDJuWWVKOFJITGdLRTV0bVpkdTdHbStuVEd3cXN5ZzJkeHBEaDYwYzYrdVZ1UVpQU2o1aThyNXM3aGxnU2JvdXJBdXRUWUhadnlQU0pTQ1JIQkcwK0Y5d1JUZXR3bzk5OFNhNkt0Z3A2Sk8xMnpwMmlwVEY0T3ZiNk4xaWxNNXVKbGpKVHVCL0psUFd1NXZENVdYelVaNFdEMGpNb1VMa0MzbUhtbjM0SFNqVnk5ZEI0S2JDYkhYSTJ4VUlXUDVKZ3oxV0ZQanl2NFpuQ3l0QXdDNlVmRTVZcS9ZWXBrTGxWZTVFdVovSWQ0dGh1a3d0eXUwUlVXREp0NDBtUURWNmpaUyt0Qlc2UGtwQlFuK29oYWhxSmJkT2lMUUpGUlV2RkNEVkpBM2V3TGFYN2FPS2lXMEg1WnVaMDYvVGZ3azI5QnlnL3dYTkN4Wi8xUXptK1ZacjYvN0Q4K29UUXAwem1IcTJBWlFyMzk5OCs2NldacVVsc0hIenFucG1YN2grMnJFb0IySmRNM3BzN2x1MFc1Y01TcUtiNCtsSDlidUovY1pwNWxURjRXVlJsSm5rbHloamhuaFUwWHZkbjdkeUZicnJFYWVIVU5EK2lwMWRkRm5hQzFTeGVSVDBsSmdGeWVNbGM5QkRpWGd5bUlqRUFkZTE0RVJRbVluOEZ0NUtkL29zUm5JZzRTU0E4L1hsNnM4c05HaXdiU3ExYVNLWUJOSVlNTlJhQ1ArUkJBdE5pSXpRVjlmZm4wRExrclhvY0xkZTFvZkV6eFhPa3lDU2NMVEhDajFsRWRwdHFiL0lJbGlNc2YyUnN0VHZmM3N0eXB3eWExd0h0Ny94K0RYakZJbXVHWHFNdVpaZnN1N1VOQVBoT2NoVXdod01LSm9XMGwwaHgyTS9wdVcrb3dXVmZ5cFB5OWpjRCtLcXRjekZzRzlTV2lrNVpQbkdPdzR1QTEwZ1V0NDg4YVJhQmtiSG05WHpPZ0xqVTdiT2x1YVl5UEhMeVUyTTkrV1JxVlVBSnJTNVNIVnJvMWhkbGc2ZGdmWGxGZkFlZjM1cXQxRWwvTkVGWXVGZEtWUGtzbGFPZmdDRnB3Q05yS0RHSGdyL2hMTUMwQ3JLaWZJaTc0QThpUENsdFZvd2VlWi9Ld1cxRTA2RnE0b3V6QTMyRjN2ZDM4MzAxRjJYeG93TmF6ODg5Vkl3WHY1STlBc1dDTE1TYXRNcUVDcno3dXQxUjU1K1ludjRpU2tVR0dENlpBUWZGSTVPaEZIQnZmSzNOVEk5QjlIMzhka0NiVWFTMm5oeFV3Z2huWENsb1VRSHIxVDFaWUVJWklTQkU0SE5KdFJHc014Q3VUOTlMWjl5MUcrQll4MWMyR1JHUElEL2xtWWJ5QVlEbXlCY003RUpEaWd4SlVoYUFBTm1PMFdTRFJaK3haWnQvK3h6UlNJNlU0Njg1L3kxZEF2dlNyL0xxc2ZPSS9zOXVRYk1YQXhSSFZWYVNTY1VaK1N2TXhST1pra1NTa0wyajF4WFhOaW9VUHYvVStvMjIwYkV0amlkV1Q5dFp1VG5EMnRTdk1iN0dibnJNVkNOaUJnK3JiTWJwVURYREZFampudmh6SVhKWmEvcm1VZjVEeXhid1lrNk9wclJxQ28zajFOWFBkOGpjWDVSMk5kWGtkSEhrbm9kb1N5aWlqYTdDOVRWSTdPeDd1dU9rbXQrNEo2OGlEMm1VK2oxdEZ0Z1FySWlaVjYyOFkrZmwzYlpjUDYzMWNGbFVtYUIrRnIzaHdMOWFENXZzdFhZS3c2NmFMbEFBZlVtM2xKeW01TWVxc0ZKV1pOR1Q3RldaczFOMFpTRDRJQWxDdmZHbzZ6QzZ3c3A1M3FiM1lSRUJNK3hzUXVIZ1d0OWY1d1JyUXcrcnF5MFVyM0E5TWVHMUlsNkZOallWK3VUNWt3aENSalYrc3U4UWZCS0I2eVVuS0p5czdMNmtZYjgrOUN2ZHUzazJuSm5lN1BVcnY2ZHhlVlNON0JOUUpEY2d5Zis0QWo3azEzZE54SlY1aWUrZTZlQklhR2hmSDF2M0dRdmZxODZWYXp3NmVMV1pkdCtnZUMxSU1teVJQT2luN2F2aWUzbWVtdSszTjhXZHlQVlg0SkJ3YS9CMG5lWFZEcUxGeGw2Z21BWnVnSlVXTC91RDZCWHFDWGVTZHpKOHA2ejRkb2lDdGxNRjBIZjJiM1hWdm9KQ2tJZUM2dWVCVlRPaWk2MlVCNHd0a00yN0NMZVFNeHNDZTVlcjFjdU1RQTRHQktmeU84RkZsV1RrZnFOenMvT1gxT2ZQUFJVclB3VWF2dVdNeDRDV3RBZEoyYTIyNE5EUlQvSndWWFE0SEg5azVqR0grazFUNDFtaEFQVnlLK1hSYXE3Y3l1eDdpTjQrMmV0VlpwZ0FCMlFNR1JET0k5K3p1MHpHRmsrZDZ0Rk5neW5xM1E3VlI3RjA2MUJuUFY3aVgwSGFzekRxa2ZNTkEzNnA0a2xxUHlsbjhaczdqSXgzakJrRlRtZmpEdFBETkt3KzU4R3J2ZWV3T0w0V0l2U1dFc0t0L2RJZ2tPSGhEVGUzeEtlZmI4RFVqUGdHRnBFOGxsVWZUUFpDNXFpaUxoT0VuRForT282RU5OZXZSUmE1ZzhjcE8rZXNlTENjNWNZa0JwV0UxSWRBeTBXdEpDWU9yT2gzYVhTd1JHSjNQOHRSeFlaV0FZUiszM1pGNkpyUC9RT0I5VFVBV1l2bW54b2NrdHNKR3lwMFlJWnZIYjlXalhOcklkdHBOY3pwUEpGVEV2eUtObmFJY3pldCtoMWQ4c01Ub2VXRDc4cGxCZ0xueEdVYTIzSHA5YmlDK2w0WGw1YXVXcjVQNUgxalN2MVdyaFlwa3BvU2NSRUQ5SzZaSlplVUtZSHRIODBUbWZWc0VRaHlzS21uUGVCZFZ1dmVpOHQrcDZwdzZJcS9hVWVZb2IzN2svUU1Oa1VVQ2pyQ3JpbXZnUWxYVDNZMnkyWkNnYk5EN0l3MHpYUklKdW9IdnpwT2J5akM5UVZkWUFWNnZVTUxybytYZERySHZPTy9LcmQ0MUN6eUVBVkNjUmU4cjNmY1NINFdSWDRjWmVWeUUvUTRVV2RyTU1IdzVDTWhsVXNudDlZWWVoWXN1alVmRkdMOWJ2SjZxL3pkQ1NXbGpna0M3NmpJMmY1WmpFbTU2dG56MnM3dzkvZXdwaHZQc0FUWVZhSUUzODlValFBZjFZajdFWE5FOTNVNDcwNlFET0o1dlVMZXRTckFtNlkycjI1NG8vR1BxdDhhc2tab1NRdUVIU2Q4OGxwWEZZWExrMVJTbXJRWFkzTktDRzFEUk0wd0MzaVpKTExERW84MzgxM0pUNnJXbkMzTUd2Z0JtbDJLejZUU3dkMXY0cUF2SWZXVEhCV2dtaVdyWEJjOGQ4UElZd3p5a2R0Q3pjMUdFUTdhWFNEbmZ4cFdERXZNY1hjb2lPVG5FcjFHNi9idkVhVVdoclByekVFZUdjTllxY1ZiaHl4L1UxRnBVVnpSSVl5QzI3MnRocW1ieDZnQ2lHQWxmNmJoQkdrRnAyOERDbXlIQWQ2a1BDZWNSRWVqTXRIT3pORHB0VThNWDFLZHg5amZKTDJjWHR1eEZoZ0Z1UmNHT0Z0TjJabTNqKzYyaDRLQ1RDMjRmSUlFRGdDZDNzRGd5a29FbTl6SVByU1V5ajlCMU56SGMzMkQwV3A1aEsxMFhHSjRiZGNKWEpSREJHeFQzcFBtNW1aWjk4RkFWNmI1MmZSYWlSQmk3cjhUbng5WEdLTFl1aUptTmRJNkw0VkFNRjVoMTZZZ1R0Zlc2eTJhM1JhV3VST1dmeHFxcEVCZDR4bXIwN2xyWjZQd0lyTXd0T0tXMVFxQ1VyVUJqb3UxMjE5OVZ1L0RzYzg5am9GRVUwZ1JENE1PRDNucmh6VHhUdWFtU3dQWS9hdUtvWTJJVzJzOUt5SlZkNXFHMmppN3VRZkt5TkNIWTBoV1RTWit5K09LV0tLdFYvTGlZSHJlcXJySDg0Ri9PSTNnakZ5eGMrMzVOVmNpeVNBUzFDa24rYnNIWVI2YzZxTVBiR3JxYXY0SXNYM21kZGJ5RFBDUi9oeUdMbzB3VHBIbUFVdVhmVXJ2ME05SDZyRXJBdHkwL0VlQXVKNElRVmpWRFlHTDBaMWR4cHExb2hjWU1iODdEdi9sZjR0ZTIyRnA2NnRvM2RsTGJIY2N0M1VPZVlubGhZYTNLWW11WVVuaGw3VE9RMzgzaklGd3RRWHpXejJuTmJvN3FsZ05PZlprYUcyN0FnY2tIT3Qvck9hOFJMdlpaSWJwb2RuTXZJc2RQcnArMDR3RG1zQXE1YXR0ai9JYjc3TkNuaTNyNmtZM0kzVGhPQ0pXSFBYS1NlemMyZ0JwbjE0a0QzUTRRZlBCOHVpbEFVRWF3U0htR0JvN2JUb2s1WXVxSmhJLzk4ZHRqSW9hb3pRVjNFNmhXdFJCdHdqZGN2RlkwRWFlVXBSZThwdWlER002QjY0bFZSUHE2Q21NeDdaa1g3M25GM1NuTFkxN05XMmpoUUNpdENDanhTc3l1SnRIaS9SMllCVzBNME5QTWx0dzk2aEdaOWRiYXNzenhZWDNDM0k3dlFjNWwzNTNuVDVRdUV3TGJQVEpkeDhvcmdlamY0MVExVzFUSjVyRzhvdEJKZzRqcmEzL1ZsWTN1anJwODVJOThpVWkxQWxZbXY5TEVSRjRrNXNFYk5aaE5uSitVajBPV1lrYWk5eE9lTUlvUk5FOG5pN3lDWHVzcUxzeEE4LzFiSi83NE50Q2RoQnhMWTdVeWkvTWRUU0gwdmZ4UEVaK1FQU3BpQ0hWcE1VTUY5M2dhYm83azU1TkkwN1BOaGlqcmtmVTNzcmc0c2FLZk1QWkFobGdVdWErMTNxdXpBZXhIVmlMTXFJZHNqSTQ3ckRZSElXd2tVUEJJV2Rab3VhQlV5VGx5V2IxZEZBWEFLa1kvMDloYXpESFZkRHVlbStWVnNRQnVyMW5MUWpGejBlK292bTlEallFdjhXY2VMYVhNRFpTMGRWRTIzOEE0djUyazJPVTluaWcvZWp6UUNaNFZPZTRhck8xaGxsS2Z6NHNjY1Z5NjhjUmh5MzlkRWxEZXNwYUhQZndlY2VXWDVKa1QvTko5d2ZWd1praWRFdWhEaGh5NTREMTV3aW1jTGFzaDJhRHVweUVqQnliZk5EOWN1VGtZeGZ6ZmIxbmljZTRLS1Q4ZVJ0VXppVFFzRjJYM3ZSeTEveU9HM2RvcEwvckRleFNYMEhQYUNXS2pVOUpKUXM0dnBsOUJ1Kzg0d3N1VkFTYzlOT3p0OEU5L3JlS0RreVVjd2dYTnNmdTVSbmplZk5KaHY0ckVRMldyNElHdWtyMUxLU3VyR2t0eSs3MVNnNmtsdUJmalp0R2Eva2cxekxNc3VaR093Nlk5V3krUlVDTmRlYTluVVJMbERBanhpTTZIa2h0UHVDOEJRQ3ErNjBHYmJrdGpCcnFpbkN2RUpveDJOSkVHY3I5OXdyNnpuWnRlUGVRZFZtTTNYeHY0ZWY3WGR5dkRNKzBxSC9NTzlIUmJsVzFOTHJRM0c3NHhFVzBuRnFRNThGY1U3VE1KYkVRNjdaZ1dac0lRek8zb3NFYkovc2hjR3hCc3F2bXVCWUsvM3RxVWt3NkNTUDVrS2JtMHFpT1IzYU1uR0ZoK244dGc4bTNYQ0N0bWd5WndnRDhhSVpNY3N5b1YzUi9hb2pDMi92eXphdXBKVUduNWZrdG9HcWFUbEtGNjd1OFZQd2xZb09DMkx0Nm1mcnJJL3k0NG1uKzdtTXB2YWdITTllbEdSUGJTbGtMbnF1eXh4UzIvdHA0M3cza2xwNlBYTUlhVGJWbm5COE9UT1l6cjBoQTFlSUlqZzJ5Tk5rQmplSk1ySHc4dUNUemZGU2tNTmY4WHJtTU9XeWVpSFN6T0VGRWxCSlZ4ZG5UVDc2ZzJyMU40VS90cU9LZ3NTUklDSjArSVBLOVJYZ1JxSFkzdnpnUU5DYmtjaUtITzh1UjhVWW1RNmgwVTNsYkMxL1Q2czJ0UlZhc2EveWdyU1lHdGlRNnJQREFFVEdZeEZ3WWtIUFdKZXhUcktVVEY2d0s4ZEtwcTQrQm9MakpnWGFUMDNIMnMvbHJ2TmdGcGc1MzJ1VSswZExyL1VKaWhrZUlYVHcvQjVUdEN0ZnhGZHdYcklTelNsd3dtTS94MnN4b01TS0JCTjFZenhHR1A3b2M0akYwdUpMNVlVWWM5NGJPMDdhK3JLWW0zclpIcGFxd3dqV3F3MTNpekhZbHExa0poS1dhQzRSbVRBM0U2bHAycW80WEUxNlo1aUhaRWFiSWpiL2FhWFdUQXk1TkNRVVdRSS94ejRFSC9WbWttSVg2QlNmbUpEaE1OMDRIYnJRMzhrcFVrMVBncWZTMmpJNUpMczhKb1BzUXlTcGlqdGZ1K3g5S3UyNW5JS2N2ZlN5eENVdklHM3F6WkRKanA0TzBrNXFiM0N6RFVPaGMzcVVpVXhiY3hjU0dvemFyejNVQUJ0b3hRcXZ4OC9IRVQ0cWFERE54UWRuMXdHa0Fnck5INWtaZTlOa1JxbzNRaGVKVFY0N2lPRWQ0TDdLQmN4aldXTDJYT2YwOVBIRGJXdWw4MDdkSlpTOGVUeFIvc3ZSSWZxcG0zOUJ6QVkwNVdja3VuRFJYUUIzaStSVHVnMTVoYXhzalNwOFoxcHRlWkc4VjY5eUtQTnVROFplYXVjRllBL2ZzTUxwZ2ZBNUxWcEV6QnZCbzZRUkJweWdZUFpHWGN5M2NuMGRpVjRXcmlZNGw4UXlSUFR3YlhwMFVKZXpnOGFiRkU2NmtTbXhyK2ZHRDVSQlgwY0dKYXRuN0Q1cGIvVm9PSXJyTjBWRzE2R3lzdHBzSU5pWW0wV1dCY09NMW43aUE2c3NLWkRQcEJHUXNBenZXVEgwYWtsOVpXV28vQUF0L2xHekF2OWpoQlF3T0hYdG5FR3VNbDFKTTJ0UUVkMVpYRHRjVFhSUE9xS244RVVBM0FmbjJXUXNPbHZDcGpaUkkvK3RhaEg3TW9WSHN0REhtU3FoRERoMitFRXNHQm10NmNaWFluMjUyVGxyZXRJL1JuWVlRNURyTFYyQ0FkOHF2STVLcGMxU3Y1cXFEYWFqOU8wWnJvOGtnR3FzZnhqSk5KUDZzRHlPZnZGQ2hCWmZOaW9DTzJWZmxBVTNoZHNyN05ITWJrQ3d1T2JTQTlqUG1GYTFTOWlRaXlKOVNDS3lua2lIVkFGRFlNaW50TjVEKytlaUtEN3lTbU91ZU9iKzZBQUJPdExheDVHSk1BcEkxUFJCTjVFcUN2OUdLUHZscXc0TWoxaEZIWUJZcjdHY1ZVZGhWa0wrUk9XcFpZYlhIdm4vWkhjMUhnRHk2QmxPQU1sSk9xMEl5bmQxY0FNN0g0clg5Rit4Lys3TzVhc2JjUGVSdll0Z200VUxCZGsyMjBVd09vVWYyYmsraVh1WlNxajNMS2tpUDc2SGh5RmhRNFNRTjlmaE9ScGdFUkkrMzVnTHU1eGtLSjFXOG4xb1AyNnZWdExja0VsVzR3ZTFxTFZVTzBCaWUyM0cvWGlyb0d3a2l0RDJ4cEhYUWRtWS9HdzQrZGNpM3JpSzhaR0M0Y2pwQ1JZUVIzZHkvSDcxYjMrU3llUFl6cEUvcDI5aGZKbjcvd3psc2VxMWc0ckZlMGp2REVSRjRsU1lOR29KeDAxbURRRStGc09FS2x2MXlZbTdxdzU1R0NZTUV1STZmZmJCUzNvLzRrN3o3cHlSVjU5M0MrVTAxVzdoa3FVMkJaUXlUM1JuWGM2NXd2d1hMSHBFRTU3VVJMcTByZEE0aFIyUzczVHBNcFpTbE1aTC9CaUYxMFYyMXZDaVd0TmJFOG13Y09KNlZHczdEbnZXK1ZSYnk5bTlXdTJ0QXAxRTVXWi8zOHQzYWpNQzRIVE55RkRGWjd1blVYek9WZEJRblZGUWxldzJhT0hCL2lad2pLdmtmc05iTUFNOHFLd3NwQkM5bUZSNmJFNEVGMzd4RWdYTkNyMnprT2t6WFVxU2x6a1JtV3FKcW5UU0JyQTNMaGhkVkpuWEZhK2RROUVUb0xRNmdZbnM5MzgySUlCaUdDZUl0Um9PL2gveTFZN1QzL1RXck9BbnlSY3ZuT01tOVpqVHI1bkZPYWs4R1BiU1MzanNrMDlualN2SFM4Q2NJNHcxbnRkdmg2cm5ITmZsK3Nka1VNQS9DQUZscmdEWEhZZWtUZGV4RFZkcmgzajN6SGhuWk84R0dSRnd3TFVEWjFrYjZzQWwxWnBvUzN5NGxmbTlLM0VLcE5tRDJBZHhqMHAvUWtwaGozY0RpRXZSRjdHZWs5UXBjbXZ1bDBLS2hoSEZ6YTNyNFQrY0s3M3ZrakVHYkFUMmlJcVRJV09PUGtSNmdMTzJrTWpWTjdOR3hubXo1aXdRNXgrbmxiQnNvSnFlTlU2UFh6NEJjMXY2Z1BrZkNxemNVZ1A0WkNuMDlsL3pLNXNybmh2ZWIrcm05b09najZqUXZncGczUmxXTlk3UEI5NUFIOTRpbHZyZ25FMWpFeXdmUEFCcVMwK2Z6N1JWcUJsYWJRSm1hUy9NWndrd2pJOUxhOWpSWGo1QlNmVXRVWkhzbXp1MVFPbjhBWmlqVGlVQm92TDcvajRNNmNXY0Z2QkNBV001Q2hybEkycmlqV3VOSUdPc1JuTldvZ3NRNEgvcGtwTG9QM0ZHY2UrSFlTV2hvVWRBekJzRUE2MVA4ZUtPSXlqdTdDL1AwM1p1Q2lXdndDSW1xanMwQXRjelJzV1dnalBmbXNWQTNJemdzaUNHeG9naWpoRXgxeTJpcXM2NitCVzczSGJuaVhGK0tyWi81ZVdROWpZb2RMMXZRQ0RVR0NJU09lZDNIQXNBMlNaYU42eTdVN2k5RC9YNllNRWE2UHdENnpjazdVZCt4SXI0REljeDJkQUpnSTU4d3hxQk90Slk4MnVyV0lnTzQ2cWRyZFFmQVBVbVFtdmUwdERIVFhQaEpUMkMxQllyZExlblJFUFllcDRudXBWUXVqNjZxTkRQaSt6cTZxdnNKanFOcThwZlVpMkVCNG40N050SEpsRDR6bVdyMUpSYmUxRkoxZnVlTmV1aTZRSjRrd1ZBd3NBZGw5UmFQek45eWszY2hudWtiT2RUWm05ZXlxQ0JSUWJJM05LeitiemJrRHNvcVFydDhMSHRTSHN2MmVaQVhIUVhMbUdXWU93MWlaN2xxZDk1MnBhTVFVTXc5YWpSNmhYc3VPZ0U5U1F1VW53Wk13blUvWnA0RmFpNVc2YnRzdFN3bU9HRTJtLzFBSjdyZkZjWDdZTk10ZHRNc1RWeGhSQ3BxekVKZ2tkZE1zSytzdElvTjJHTEh5b3RJTnRYWUwydks1YVQxSzQyN0pxNHY2bXVZU1lmenJ5NEtzaUxTOEx3UmpJRDU3LzEzcTZkMEZmSXlZaWdGMkFPbEIwNStkWHZ1MmROQk1ydnNTZG1WbkdOMjZMaGdHcUI4ZDJwb2hVcnQ3eGI1YTlxSDZGZUtydlNYZ1ZtNmlDakRPdDROVXNyQWwxT2JqVGgzNlQ0alIramJOWFVvdEsxd29zb2JyRTlLeXJhVEw0QVFYZDExT3p6c3E3dTh4WTBaem15MnpERWJnNjgvSUgyZm1ObVNPTmpGWTlHVEU4bVRMK3lKRCs5aTJxbnpBU20zeUsrN3FkY1JOd3g4OU9tNmc4UGpDaW9HcStYM1p1ZU9XYkozL0M5WVA1Y1ZJQkZFeUcwQWV1RW5DRFUyQksyTmJhK21XaVFOcWxJQzN3U1l2N3VzOEFMb1p6bDdHUVI3bkxyamlVTmxQcndGTmJLSTgyWFI5R214WjdYQ25VcWhTSzkwb0FVb3RaM3RQcWxOQ1Y3dTA2eFNYdTdBL2F5WmsxbW5nN1JoUTR5dG5BamQrQmx3Vy9nU1ZxVkJJN2plZ2tlaEw2M1h4d2JpdmN6NEFZSmtWVlRNOVFnZkRYZS9hcDFNNm9jZ0VUdjBKd01RenZ4K25Pd3pmVUNINTdxdDBsR1ErdmU0MzBUN0V2S0JKZ0RiditmQ2JRdE9wQjhUMzkxUHl0TEhYbHlWcjZ0b0JGUk5aK25USXltaWxody9mekJ6Qmt5ZFBXaTZmdWVENzV1ZzdDb0ZocWRML1diZmJHTStJQzc3bTZORmNMUnQ0c1VSSUtwTkZpZlJYRmcydjB5dmtTRXU1RG1DVWIzUEsyVWsvZk1FdFdXUllmU2tXaG05SXJNODdmWFZscjF3SjZ1T3VGZ1U5ZnZSekovMDNIZEFJSm9QNTRCZkVoQUg4UXI3anNyOVl2VkVLRE5BbXNYL3grUTZQVHRGS1RNUnFMeXdxY2dIMEkrNHpKalhEZ01HQkxjWG8zeHNOYjgxRGIvcmNvRjN3OGR3UmlqbGF3ZVovVDBKMGRUQ3NZUXZqM2p3OS9mRkJURmxha0RUbWwvNzlPSW5lTURUSitWWFpRUThDczU5R2hNR25uVnRIMjZqYU0rQlF5M0NHVGFQcnhDTG1IZHpxNkhkblEwQkRpcmdPazlHaDByclg3aHJ2NkxtcGFNTUpjb0xYR1JHQk1WT3FjajhocjlZekw4bnVmVDAwamNuT0w1RGwrWTNueXI1UEszYTJkaS80RUN0bjRYbFJFTDBiQjlIK0RuL3VCM25zT204YmorUmc0b0preEtRWHpEWDlEWWxaSzRpOTBlNGwyT28vZGhrclp0NStyRlFheTRVZzU5NmZaREZ2UnRHZkV3Sm5VYlNrTll2bDd0RzM0cUt3d3FicEZSdmdkZEhZN0JwN0xxOWR3SXVjczEyZDBjUCtWNE0yQW1ONVJ5VXcrVDcxODhwNHE0QUlTZHVWa3Z6REI5dUVNTEJlTGJHbGFHQ3d3NEQwMjYxcm9hL2t6d0laTEpUM1pJYzRHNEErUVVmMmw0cVRXY1I2NlBQbEM0MFhwS0tHZllpMHl4Y2lUaEFKbHJZbmM5b1picFEvNXhUb3hmOTJwK0xaU2hKQng0ZE9pMnQ1ZnNxQ1lPQnQzTVd0RmhLcG9sL2tUR2hZR0VHY0Q3R2wwRTl4WUdGTWt4RWF4d0VpbVFrOVZYcjVnT2tGMk9adWgwTW4yVHU4NTZvL1dYeUNjVUlZWEliOHVHY2N0Tkl0ZWVvSFczRGd6MG5xbUNCbEIwUC9VSWYzUlRxbTNHTlFoVFRZekV5NXVWQVlyTmJYTHoxNVUrUGZ0cTJYb3RaOHR3dUxpUVQ1aUE0UEhYeTZBQnY2R2VhMlRKM2pVSTd5Nmk5VWhobUNocWhieVdla0RldVB3OXcxRDhxaGJNZVRCRDM4QTBSaWxoelVlcXI5QkRZTytvU3VkeUFxTUhEUWg3UmdoQ1Azd2N5SFpVWXY2V092MS81Y0h5WC9YY2RIWlpLQkxrUHBBODYyWDJ0aGJ5c0NlWWhhZlc1VEZoSUIwRXc0MTlnUXpzVHk2VGdlVSt5cHg1ek9iNlNzK0xRUlNwNWEvMXpTQkhvSHpuWWlZbVJhcVljamtCWU90ejdwQ0xNUzBJSEUvdDJGVEtyVm5mU3JPRmtBM2IxeEYveW5sZDZPUldxUUlWK2Uxam9OQWpDVDA5RHlMSzJTaDBlb2ZhTzhiQ3ZjcDZIUGhqRVV6KzBIS1AzS3BsT0FQcS9RdDFNNlZ0TVpzNWFrWkFxMFZiWEdsaFp2dVR2VzFaM1NGWlp0MWtPMnpaNnhHeUxZblNMMUpPdE1KR05tYlczZDRwWUxCZlFjcXQ3R25aUmNSU0F0aTc3aDVQRGs4ejlzV0JEVWFISUdCZmJQR3VndHZtZFF2dVRHZGx0OVdIVkZOVFgrdU1PRks2VGlhNTl4TDRWYUFueHdKdXNJcG9ybGd1WWRMelBRZjY1WUoyOUdEaDkwSHZyb3hRaXpSSjMyallqZUkvdStLaWNxaHZKcUdyQkN2YXlFZzBkWTl3WTh4RzlqT3dOSk5TYm9aeXBDcEpWVUEyYjRKc2tTRVg1dEJlRTFta3dmaUg4dzBEZGU5OEFUQUtPRk9qWWhEUnVzSWtFR1BrNFBYNnFONmpvZy9jWEI2NnBGbDdsd0pCZ0FIcU95SDdPb0tvbGJFYVJmNE5qblRKZ21ZTDhZTmczRXZjMTdiTWpGUnV1aTgzSjJkK2F1QVRqZGo5OGFNeFFyYmgrWS92dno3NkVwdURRWmw1K2NvN1NKY21BeUFJSTBQeG85R2pEWjdDN0lpbVZWL2kwVkVnSVVwMjhuUlBEM1BmZisyYit0VmU1akRYU3dXQ2FMS0NXV3JFTGUzQUhROHQ5dklqZEpqMTU4LzE4b0tvZkZObFMyWFZ5Qm1aN3RtcXZSemVSM25xSTFtUkZrS0ZLSXdvelIrSmpwWWpKVnM0Q29Oa045Tmk5ckF2UjRUcjNaVFk3aVIrNVMrQ3g3NFNhWEI2RElmdkV6akJLamYwOW1jOE9qbmU0ZWtzaUVodTVmZmNNWjZDdjQyUDZ6eTBZM0lTQ0xicWNzRW1WZmtUMUxMMnhmTjFUV0tER21SMEJ5UUpNdkVNVXpmK0EzbXNtdjNSalBXR21Xbm9raytLalNQenN3Z1pUK3BmYy96eGJnSko3dFJ1WjBRelp6WmtMRWhyaEEwZXErd1gzVHY3VmJXWXUrcWNRbnd3d1BhRGV0TnQxTFZLeE42L1B6VU94dVlpYzFkSHNaU1p5N3IzOG1pWWVIV1lpUDlnU1ZTTkp4MXVYcUkybnBqMFAxQWdFZkJiUWcvbTJvdFdQV2lnU0I2WlFrSVdPaFVnNGZoQk55dVd2NU0yOHAreHp6VGViemw4a0U4QXhCRHpLeXYwaldHSStiWExQclVvSVc0VUNRWkQ5N3hwaHdUdktpMHo2bEp2amRTemxOd3NjZVJlbzdFSWJGcTBxNTljTWlxWE9pcXNWQml4QnNVdWU5ZmFpZE1oRENvdGdQcG9xYU4rTnZicXY4UkhKREpmcFErS2w1SWpZcDJuSDZyUHhMY2l1VWx1bEtxWjBZaExyTEVoMHJETWNnNnkwQVp6TXRQbFZjOVFZcE1keVhlOHRtcnFJRThpT2ZjV2Z1UzQ2ZWVwbXFjVGNySG02b3RsMktaZVc4ak80czRTZjM3LzJ4d0pITGo1eWFnSjREUGJNQVNacmFWMzk0aFIwVTJPY2grVGN6QlEwa1dqU3h3UXQxSmY1andiL3JkRDVqWUwycE8wR0JOV0RYbnV0TjdhcnQ5TGtxU3FtRFA0Nm9weHJISzZha081YVQyVUlmeXkxWjgxZE95K1J0c0RCTFdXejd5eFJheWZxcnd0c01PVk1hQmduWjgrVjVGYzROQVZVYUcxYXVzRngrZDIrNFBvN1hLR3V5QVlUWHpIVXVxODB1T1JKTGpSZkdzUWJWeXVXdlpFZUVuT1Mya0VnbTZ3NXIwOUViYmI2djRGUFJxK3RWWTJkN0t6ejFoa0ZIbW1heGNNMXRteXVNaEZBSm43VnYxVEJGMlRHVmh5dkI2elozKzdIT3N5V1lwZUM4WllTT1pGRC9EWFZIOTJaVWEyR015WHpHUU5NNnZkdlBLN1dNSTBWMlJiaTVPUDZCcWx4SldsejZ4K3dza1JDTVFSUzJrb3RjWWZqRnZOQXp3ODFuL0FaQW9FK3Z1ZVpqd2JiZk13R1RiL3dkbFNPOEZEQVRObXFkdlNLUWtjVVZiakhuQW1IVFBmOS9UazZRbWluOGY4QkEvMlpRWXdNVEJuQTZtOG9FclNDMERRYzJPMmtuODV1T0ovTkNXWXppcVVFNE9PNWtURkNTenVsNGlaSXZnYU5IeW4rbmg2MWNNbCtIT2lMQUp5VWozVDh1em9RWUNzUTA5YWJoeFREZkxqRGFCQlNCMkNVNnljM0FUY2dONWEyRmpBRWdtUEppRmVCRlhwTmxTYkczSHVoQktVOEx4VDBBUFBlOWN4VFUwMEhDNmpPcm8vVGg1S3l0SUFpTVF5dWFFa1prOTRWeTcwWjMzK21oYzVGVzRvTjhSOENJQm9ZYnI5RlZuS1pldlVvaVAzRmYrSlV2V2VRMXA5ZFBRYXNjTkI5Q1lrcXhKdlFpb0xXZDkzUW1hR2cvRCtyYmxaanZUdHlPOW5wYkZQOWVpTEFybFgzSUZJOVB0aHp3bklZc0E2aHVjT3oyOG4vTmJ5Q0RKdjFwRks2eHQ5eFpaUDZKZ0tQL0Y4NUJSZlFyY2xpY3hUVmRMSE9hb2xJY1VBT2NRSjB2WHA5YWlOUEc2RmJ2a2tLakdHMUQ4SlE5ZmZoQnRDRzZEVlRReUR2dExVVWhpSFdIandMNDVOak5tTkVxTlFLM0RyV0FZb3RvNUdTMEtCalN4a3JCQXdpd2RYUDExZGU2WU9EWVZWWllQc3ExV0VlSVBHWlJpbFo0OHlHUkZQRkNBN1I1ekZUcjU3TlZZWGVMK21NWFBFb2dVakl0ZlNNTUxlNjczblpBWk91WTl4ak1ZeFhpZXY4di9uQ3NGVjVraC91dkhIR1FmRjEyL2hheXgvcmdNL0pTTHZmVS9FVENvUjZzb29OYjFOanFCZFd6eXpPWTFyQzZGaHh4bENWR2diaU9WK2J3Myt1MExEdkEyNzMzc3lDb21PcFVUZ3JNMjBYVFNJNWhHWDlHdUpER2thdnpqNkd3UVVzQXlJY0tRTHJ1WHRYSzR4VW5BSEQvTHU0RDl1N21CV2NBNjV0UmhXeGE1M1lKZ2ZxbklCalFWWjRqVkgvWDRNYXp3bmQzQWJXRnVQa1B3dW1nbFVaK2dMNFEyR1pHOGNmVEtBZFF6V0pIMkM3SGNXOHErUWFHSzIzeVA3QnRTQVkrWWwxd3lYYmVRYW1IR3dKK1k2Tll4SDVVc1ZnMW9NSXppK0RVcFpHNU5LK1pPZ296RGFJU0NaVHg5SWFlTjdoTERqT0ozUGFhb0dhQnlIcGhQc0R0QjBGR05TQTZOc2p3THBoemhGOXU3eW01d0UzOEwzYS9ZcXE4NHNyZkFuYUx0MGFEeWIyQ3l4aHZab0pXMmpUbVp4ZVJsam9jMExQdWdJNjBlKy9EcHBSK1Nvc1pVMXUvalpmVGpzRHM2NXprQ0F1K1NuL0VSa3ZTYjFvbXYxRnA4RTBsUEkrWG5KL2htTytCU0ZMaHJQUjh2UDBDb3AwRGJhU3JCKyt1ekJOSjE2VmdVRnRkZXZKNmoxTlA1Y0o1a2hJdE5RR3E1SldHemtDUENwSjd1b25VcmdXenVKQjBzS3F2S3hQSmM2VFg4RFpDU2l0M0pwblptOUZmZFYwRUFOaVc2QUJKOTM2MkU1ZGRKZjN5K0UzaTJTZFIzQWliWnJreDJrVW9ZU21pcXdWTERaS2ZvdTJaaktuNE91K3pqaUY4Z0R1Wk55L2NwQUhIRGpoL1UzUGk4TmlWUm95cDY0UXFZOXh4RmNOMEN0NS9Sb0NpMXBrR2JlZVZrSnVsdm9ObUxXT0thbENzRktEUGJrMkRYKzFIODFFZ0JLVk1UQ2pzRHBHRmpiRXREWng1eE9QVEhJaGFHazY4aXFKZlV3Y3BMbXhuVzhrTGUzdjhEL0Y5dm1aNkQyTmdSSkwrMjZUSEdTNndCbTkrdmVwdHdlOEFhYkN3dUUraHFYSXJKNVRrTXU2MHVrb1FWNXZmSDQzaHZnS0RIQmljY2ZkVm1rYzhpa3hFajErTkxLZXVWME1uUUpQdGd5QmFUem1YQUNFc2ZoSTJEUnp4ZFJJWE5SQnNTYzA2OTZ1V1p4c1I5VU5Wb1daV3BBSFhLZmtXRnNPNXlubnlNbUNRWENHL3ROUXJhUXQ4Tk9VU29RYktwZ3paR0c0cktnQ0xCbzhXMXBkSnBIeWphclZmWDU4eVY3S1orVmxLZUloYXJLdit5YkJYZ0FHNHJ3eGxuYkQ1aVdadkg2QWFTa3dhakZsU2NhMmdiSnFSaExnV2RzNU1ySEF2eFhjM3ZyeWovaEhOVEVjUmIzWDdEMWc3bXVqb2R2UXFFTThrQisvNk95ZXU4MmFFWlU2UVF4MFNNcDZMTDlDU0NTdCtGRXhvT1ptTHgvYlh6WjZ1YWpPU1VjMGFVV1pSd2tlTzZmVTU0Q0FLRTdTQXhYaXJzUHd4cTAzeDdjckRyd0M4R0tBaXJOaGZ5dkkxTHBHRWthakRCOE1QL3BxdWoxQThFT1hoc0NjK3BiTDFzamNHUGxtcUdTaFlNZ1pma1FZTmJmTWVDOEJRbTRrUE41VVpJQ1UxN2xJamhvQ0VxNnNSQnV4OTBQNFZDeTZ2V0lqVjBjR0tLZ2lOMVEyeTVhSlZtTWRuR3NQek5rVXQ5VFB1ZDlDc3hiN0UrcmpMVjNFY1NOeDI1RWRIU3U4M0t3cEU5cC8yM3lCQkFSUlNtckxSUUNGdSs2Y0tOdWNQZUpySVV3TU02V0p3eWpTSWxpaU5RTFRLMmxqOE8xRzlrZUJ0TTdtdjZ5NEVyeDk2NUpRQzZFVmdrUnFjWThYNm9CTHNQQmdIZnBUaG5nTUY2SzFIdDRiMVRXNnJEUnhDem9PQjNlY0R3MTBpSTlmMmR4Q2o4cm1uWEhmVzVvVE00U2FNNWt6c1FXbFhzaTlEWXZGaDRrYkhUR1ozdkNiRjVGVTdOT3dVUitaWjlZWWxtdmtsTzdYV21iWUdoSXF0MVlUSGdEa0J0dExxZDE2QTRpQVI1Z3ZWN29ZRmVGY1dUSU55ajU2cFdJbGFSbVNIdmdhQUZ1ZnVyekhmcDkzV2VoMm1meEtGTWgrRExkRUdwUGVGMlhZSVVvUjBWVlgwQWF5Rm9TaCs1b2lQQ29NZFh5cjNaWStDSTNqeGhTMmNWaU5GdUV1ZE9MY2RSMWtaMGZsUDFzZXp4ZmJoMmFkbWpBMDVlNm92ZndobmZIOXEzRWZESThMdjFGbE9BeitZZFZwUGFlNVdZUUZUL2YwYlMzR0N1WkdBZ1ByaXcyK3hwYlNVTjRSRVdBUmtpZ1YrRmZSQkovZWlLVEVTdm41d2RNRUt6cWdlR1paUzl4OVM3OW9YUkhBblRLQUpYN1VXZ0tteUdhS1ZpTTZKRFFISVl1RGMrUk5rZjh5c3pNdXJnN1VPSlNSSlZFYTJ6cTh2SHdrb0tIcWhLSGZCUU45SFNWbFBmRDlha1RQa0RLNlRyK0wxQkJBS1E4akRTNC9waXZBVCs5WFpCd1lSa2RLTEFzcTRwaDRKY0tkZis4aHZ0RERRWGt6MmlFRHhZTWR1V3JiK0Q2OUJCMEJoYng4MW5iR29IajBVQnpQSVRQRVJpR0VQU296eXJKS0xweTk0VS8xR3dXWjBzVVVxWjRYV3I2cG5WUFhVNXRYRWpFQVRNTk9PUmtCOEJrMzJUSGFtUlNoUWxrOGNPQTltTkNrOFhzVzdPcWo3V3hQYXdSTDhNVnk4WkVWU2FuMGRPL05IeGZ6WjNxM21HK1JiN2cvekUxRVpTSFpBRjlvQTN3MmtGbnpXQ1BXVGY4N2RGN29mZVA4MnozUUQyQjdSbjZRcmo4a3FTcTJVK1BYWFpHbWdscitjSjBsY3psM0t2QWcrYThETVNDMkhSRzg2eGpqYTRyOTUva29zZzZLMXNMREZUMW5MTUhhMDhlUW9rd0kxdFVTYkUvV3hBaUhZV2Z4YUFsT2JZUGZaMys2a2hCNndRcVZkQmQzeTZZcDF3aWYxdUZYK3o0dStSdW5wWDl4eWdudGZnYkgwOVgrR0xVR0E4aTlXaDFwVVpsUHJENGhKMnRKMmVnMTZ6bkdJaXhXTklMY0kya0ZpRFhxQm94NWY2eklXdUl5MnVrNFF5MGhWZDNEZWk5UzB3UE13dGRqNDJzNUwvM1EvdlJBK2tTUHBkaFloWlc2MWF3akZiVEZWMXdoNm5aRFoyQ1F1bmNSdlQ1VTNZQlBZOW04MlFtNVVSenVSVDE1UGN2RGd1TjI4OUxHT3BySFArRDF5dkh1NldTYXpkdVhiVnRTTC90dEROU0lzdHQyMVdMbHkwaWZtS2E1RDc3R0h6SzR1TnduTkRLd1A4M2plbVN1Q2xETGZwdjkyREhWd1dTb1pOTjJnMWNSWVBSeXhIRWg0dzlnVzh2T3RVME5EdmlSUVBNMkZZSzVUYTJ2VjczYXA5SkRCcjhTZXNuVlFrL3lUeDRGK3RNV3g1dFI3Ty83dzBST0FvVllvYWlpTk9oaWx0QkhWRk96a3FmcjlkQVNiSGNqQ0prVGIrNDZ0ZjU1SkYyMVFIbDdwNW4zNktMdVVyUkplcE5mUXYxaFZ2SWdVQ1R0Y25BdW5nZUNiRktzVXJKeUdyWVZYZWFNSERZT2ZzS21hWSt4a3dNZnJsbzJCYldJbGd6dm9PaWpKS3Nac29oVWVXTFFoeWJiSXRtT3FSek1ITzdGNWJRVjRycnBqbzUwN0JqMWJ2UHA4VHVSL0xIL3hGWnZqNkoyb0taMVZuc2g2WE4wVmVLbnc4eThlWnZRZUVJQXF1Nm5WRjA5MFJkdVF0WitzVlExNDlwRXZkMlBuNDJWR3dNcmhocEovaEtjUGpueDZWQTFxcU9HcjRiNTR0RUhFZnFpcHNqc3IxRU5DanUzc1NNUWNwQ21neE5yWWpXczZDVEF6cHpxMUdwRjB0Z3BneG05QytoMVZlVVV3QnZjQUZnbzJsa1hmc3Z5MzhjQklkcEtnRHkvQzA2QkhIQnpIbkpuQnhocWkzTEdoMm1XYnBpN0x2QXJVcHJ4cmpKUXhhZWtSRHBZcEE1TWxqWDhETVlVTHpxV0xCak00elBNUzFkVXhJajdwK0cxQ3ppTXhlcXl4bmtTZHNZaEZrV1JLTnV4OEdTWGMrY1Z3aVo4aGV2Yk1lM3pFSG1ETFdndTRxajNRbFI3VnN0OENoNlYxZzBqeXcwR3BDRWpOcHpNWFRjaXRlN0RmeFg5VXM0ZVpGT3BJTGdBeEQ5NVdXMm00dVAwZm1rS3Q5WVpJa2o1M0ozQkNiL1lXR0plaTdXZHl1em1sbWVHTnE3Ukl5RDBrSjk2TklCMGhRQW9uUkN4ejk4UjFTZEFHVHFUUDZVSjJKSyt6R3B6NTlja3U3UU9hbEdlV0pIUE5HbUg4Sjd1Ti9vTThwNFM3YUJVK2d5REd3VWdHSUxlYUpOVERiN1REN0JyMk95UjA3cFBhd0ZuUnhUSjZjWmRMOHA5Vk5zUkw2V0MrOURNL0RuWEFtc3ArZTF4TVIzM29reGJSN1o3em9TQk0vMld2S3NjblJBVTlLVjczVjNjL3lMTVcxejFkY0VhejYwRXdmU1YwU1dMTWdHM084a0FSOFMvOElzSWc2eEFCM050dStvaWI1Z3k5SHdETlZnODJrYkdueXIwbWw5THo3SCt5TDZucjEzSEdOQko0TGVyeHh0K0taVnVTdUlyblZuRitaMjFKNldPdnJydFZVR2FsclJ5aVRoWW1aYWZjaUpQRlNjams0c3BDc0NiOGhwLzY4N3ZWOS9xUkZ3ZDNoYzhXQVdrSHgrajg4dHl3dVUxajQ0ZmtPOVo5dUI5UDg0dG1HU0lMTnNReUpLZlNqbTJueU5LRmo4NjQwaGF5MDlzRXpYNm4zUFVKT1FXSnFPVWxYWVpYbzlDSFNLcWIzL3FpVjF3anQrZlFhMjRtVnZzdWtDZXh3TnVCdlZzcDFoa0tjajBSL3liUGdIeGo1RHdOaXYxVm5sWkVaZ0JWbzRYVERyWXdJYzFnaGRFRzBsekxWMllFUnZiK1hNVENWRHNYazd4QXBPYitRcE50M2k4dEdXVUxhVVk2Y0JvaGRpSG9KSm5TTTQ0Ti9OeS95dzdaTldZQUpNNWNtQXRJenpOSWxMY0lyQ1BnNU91ZGdlUXhoR2k0NFlNOTN2QUNuOWJDY3h0OTMzZ0t1bHdGQnRER3hmcFFTS3E2SldSeUNpUkduWkRubmhIVmhjUXo0L1krbEd5ZEtYb3N6QzcvZDlFSkxxUnNLU1djbVNJa1pMOU9nelhOZ0wwRTJXaXBRc2VKMDFwK0tEWWtlOExudTIzSXozNi9RcjVaM2tJYW41Qm5yWGppM0hXTjVKK3dzYkl4V3M5bmxXamNqaEpHcFhGcnZnMnB5Q2hwNStPb2E5UllrdTBwMG9ucHhRQVpScmw0QlpoYmRRYU5EekZHeXQyTks5d3p3UStGeGhOQ01NazI5R3hHVnlhaldubjB1OVJqQzJBZzhpcFdjMExyajFSaDI0OGFSWVJFbHJRR2dROW9LQ2xqZWowK29Zb0ZrVHBKWTNYemZQOUk1bTVSalNyZ1ZDb1lIcDBZTWdoT2lLQ2xKNGdwanNIYS92VFBYNmNGaXFpOGt1RFNydGZjenNlVXloSE9OR3lXSCt5ZHZ1WDMrMjJhanJYelJITEFZOVBMZlFyblN1VXhCa3UydVlCNm5vV3VjWDVJbFBTcURuc0M5NmlaQm9Gb0w0YlRram5rbTNlSld1NEY0MjgweE9HVExPNWRUeXl3dmJmWDk1eTJhc3FjU0R3UklVbEV0TnFiN0Jqd2RzNUdvWHBEZ2kxV2JIYjk3RjhFY3JzNXhGUWtPTjZSNkUwOFB4SVZYRkI1ay9JeVk1WmQ4TG1BYWVwWGltMytNbExYMDNlQXlsbUNOS0dQaGgwSlJSVUpBSUk5dnR2ay9uY013b0d0a1VCRGRYQWpPdEo5Y2Zuc2hHenVHTnBzQ2d5aU1YcGc3LzBkT1JhaEZWZzFnVml5aTRkMTc1K3grY0xxVG0wZFhxRlN2bVhWNjh4a2xEUWZlNDlVbHZWbGs0RnAxN3ZZNVBMYjdTQ1lzcnZuMnF0VXJxVWYxU3BCYmpVa0FNeElOeTFNTTJyejNFeGFFTGY5TnVXQXFhcXVVV1BEYjl3d2I0dTMzc21rN3U4dFNnQnhPUGN3RDRHRGF1TS9CZSs3RytNUkRoZy9WM0ZkZ2t1dlNwY0NMcE9jd1pjS3FtNHBiZ1RVazdBSUVaY2RVR2VLaXpQNG9UbVpQRjlyM2RhMWNiOXI3S0VldE1oY0ZBZ3diN2NVZFhNbjMvbXZOUkJZOVh0VlUxY1g1YmF3dGFjcGJ6VWlEVTRZSWtBQi9WMkdwSlpYU2RyRU5xOTNjdjVxS25udDhLZ2tJMDFNcXNuTG9DbTlOblROb280cEhJUDFXb29BVGp0RWJva1dhUHMwa014K0JWZmF6WnJuais3ZjZ2WG5xTmlXUHJyWHVxNjRjSGZjQzMwTzQ3aUhyUVNPMFJDTzdXZlZIbUpNRmpnNHBoK2V0UXQ5Qk12UUd5c0NUcWdTckQvcUdnUERCNldSa1B4VzV4ZUl4eWNWK000SkVxQ2xKK3NmSHZIbWIvbXlETVc3SkZMR1MyQTFtQmZ5VENtWERqZmZGS3ppS1p6dlF5eWxMMzdtNTQ0L0Z4eE9UdDlja0cwUVNRSEljQWtQeDFaTDBkYU9lVzRrUUdjR1FDaVVpMzNENzNtbWhUTEdTcU1vOXYwMHFuWlZNLzY2ZmwxUkZncGp0aHpaRW1mRmpXaDJONGoxWk5JandGWGRjRTJDN1VyelBpM2gxODRUTjV2TFFmZExEZEJxZjJBTjZwK1Z1ZG1CSUpONFZMU3hldFgxdnoySnJjS01weGVJTVh6SXplUkRDZng5ei9pbEtsM0l1Zk8rZ21hN1BFTHpmektZSWxET3ErUStpWUhKN2VJNSsxQzFFdSs2Wlh4bjhUWktuOENnWS9MZU9rOVB3eTR1N1RNZFh3VDJyVDVDOGxUMHNoSytxTm1MTXBvbEFPd0FrSVZBYysweHJUZHQvZUFZSTR2UzNNMXNId1N5L2xSQXpqQ1NoNVBBQzlQejM5QkVlS3RweitZNzBUcEJjVnJMWTdmQmkyclpmRmNMUm1tVHpzZWdBVTJWR3dpZ0YrQ1lUNThjaUhPaC9nV1QrTjUrNXhyemxDU2dhYkxDVWVoTENJZi9HQ0lzM2ErMDlOeWo2MzVDQ0M4NzdPTWpKNlhUM0NNdTZQaHk3SjRZeHh4WkFHTlltemFNN09UdDQ1UUJvYXVMb2J6aTQwckJMRjZRbEVSTXVkaHZ3OUgwM3NSMjBTaVRLczlvMXpyKytpZnA5eVBjeUFRLzU0R3JQRkg2SitZcVFLVHBYZTJGT3grSVRBRzJYeURNNUJ2S0hqSm1zWlV3T2o3U3c4bHRYSCtxN2VvWlhoZDNVT043UXlEZVhveUdHWlRMbTJzR2tQeEFyV00vTXl6dHpQZE44SEN6WW1JR1ZZTGZZWE1MU2hJMFh2cTF6bnNkUkIyMWVvNkVtU1lMY1VTNGFDanhkRDRtNDM2b201dWpiam5USXhDV2ZEYllyVWc3M3lsK0ZKdGxhcm9hSlBObFZiMEtYUVlLdW9CZkZEMDNmTmNlL3JHSUo3ZVZLTVFtYUJLK0FVTzdmWitRVzlNWnIyWW9jTVNneGIxT3htNi9Bay9teVFWNWtQQ29CbG03YXRiekFMZktINjZEZUxuakZyeHZCOEpoMExCY2F5WDEvMGc5bVNVaGI2RGpzVXBWMkFPMStWelNBVFNNVmQvOHg0RUtkcE5TV0FkM2cydm96cmJyUUJmQWxValY3WVIwK0wyWnNtQ0FYamY5UjJEMytTdkxmOU15QkdqdkFVNFR0Z1plTDd0UVpldVJOQ1diL3pEdjBzQ0d4SDRjZVVUL04vTzQ2cHM2OGxUVW56QzMzbmwzRHNmYmlPVW5PL3lmV3N3TFVLSVBFc1BKR3BjRndTem8vMkowd3NTcHlqS1psZ0ZOeVQyUE5oZU8wRWZqamVaOHE2Y2o2OFM2UURRU1NNbmpBZEZiMHdWeE9KTHJFUjlrSUpNUjloSW8yOUVnSkxSVXIvNTJjVzlwWmxIVzZ0ZHVwUnB2NHZKbUFISzRDNUlrUUh2aG4zcjVsY3V1UUREUWtHMEFkRml0Sys5Vkt3Qy9FSTRNbCtSbitmc2YrMXhWK0ZKNlBoVmgxNndpRXFOc04vT3Q1MGFlTU9BZmt1L3liYnlIZW4yLzJ6YUlCYmRFeXd5TEhlSVZnUzFWbW05aUhmVklRVDVFdnhocWI2MFRRNitLWVM4UWR6S215WEtDNHBGSlZrNWFkNmpnS05XazRtbGdCbVNJcDlOV294S04za1VXdEtUVGE3S3MxT3pNUnliMmFCT1IwN3JFSm9nRmhzazFwTzRNQVJKQmlDWUI0VWZFWlRXaHFhZVFGcEYxdXg5K1NLWktwcUxhY0VwSEEyU2VpVS9OT1ppNEhiVzRkYUJyc3dGOG1iRnBLaTF4b1ljVVpxVXJSVU4xMy9tcnNaZTZzQ0I2MHFDVWtCVTN0WVlUa0xKaVBHMVpoa2oyQ2RPK3MrMGpTTHRURVVRR3NyZUhvVDJRbG9yVkx6YmFQUlhYM0RiNG5TUENwQnM3cklId2JQOWpTZ3g2bW9uR3R4NmMyYTRSL3hCMVlycnpNdktialVOSlpBdTlVb2gyazRLTWxUcitDQ1pxdElMbUFWUXRUekZQYnN0RlZHdkNDZlJEYmNYRDlYVi9XWC9WRXowMkdqY2Z1NUpJc24vNHRnR0xObTdwSnhxeUptZ1BuUUhJRkl2R3JZMHBVc21ScjdSUkRvRllSZkxVR2xvY2JUdU14Q2pFWTFtM2hEZXI0R05uakNoV3dIQ0thaEo4a2tibjZ2SDVJUWxucmZQaEdWL0g2Q1pvMHBaMXowU0VqcTdFaFJuMjR5dDYxM0U2QzVTdm9qWkxPUi9TeWpYS1Nha0xCUWEyMmUzMzhuOE5Ea1pkdGJIZmZRMHd5V3RlTUs4dnNENjNNMTRJTW8xYXdGZWlteElMNWVUL0ZNVjBpNmdlVmtidXY3R24xSGd1eENESk5YZGpGeStmVnY3NVBPVWlGWWZsME85amdiT1ZCb3ZSejZGU2hBT21qcG5FTXRXSWhiNEEwYlhVa3ZFY1lUY1NOTmJGOUdCUUliTzhtdjhjZmVSL1Fpa0ZtRHZEaGYzVkJZU1FPQ1ppTDdXYkJzS1VIZjFLUWFzYTRMdjlNNHdCVjJ3RnJOdVR2dDNaK0lRRXhGaDlhYWpVaElDNGhNMzhRN2liZTRTcFhBbUUyOXVFTGRvbkZqczc4V01wZy82bTdpZkhVUGJzODlkMkxoK2hJdkpvdkRBd0k5bDhlNlNZbVUzMkZNUjYvakdQMU5xVDBOckdyNk9aTldlT0ZjWWJvdWw2WGE4SytLbmtBbUl4bTlaemtYTVNORHE2TFZLcXBiUmxzcThiWXRLbjc3SDRqZ09EQk5PTUJDWG1ickh2dVY2aUhValVkSlhVZE5Qck51RFdCcUYrNXczRGpocElIRHQrMk1sNVIxREVnRHlka2xIWG5nL2JxT1JXSHpqYmtmS3kvVXFNRWh6ODBHTFg1OVRDQWZJMXhpTi9Tb2txdUQydGNZR3A3aFRPbThaeVpkK2lHU2pIQ0UzNk0zbWhPM3d5OXY4UkVFL3JybVUwRm9iaFlZMXRTM2lsT0xDcFZVTi9MQUQ3d3FLYTB6blVFejFKMnlSTmFGQjdRMmI4dkM4aEhIS3p1MnJxNE5VcVMxV1kvRTZiUllBcWx6VlFqcUlZdGUrd0Q5azhkb2tFcWtERnRoWmEzZnJ3Z1dHZTR4ZGJSVHYxYzIwU1dZV3FVNFIzU1FLRVpsQ3dOcVpvVGZKVDhuQVVQbE9uYURqRnlOdGpiclR1QTFsQ1dCelBFSDhMNURKYmJnYlVYektXTGV5VmtmQThaWVQyVFpTL1Rwa1YwSGdDMkl5MjRTMXZIVzZTNktaV0x5VTk1UkQ4R1gwQllRMkRPaGxDbURoSFRnanl4NmVOdTg2eGVkRnhYVG5LQlpvcGRUUkJ6YWZLdkRIeE43aEdyWVBsMGVyZjh0MFVwUzZpWW9SZmNDaEdJbHI3djFLd0p4QjJIMHBBc2NxTXVGWmNYRE54Rkg2Y0l0TXJDTjZCcVgwMklMeXczOS9jbGRLR083WGhXOWNlZWFVbTE1VEtZbUEzakxwbGF3Rmt0WlB3ejFCaWRNU0d4OUl1VnRNaXdvbXg5ZE04a0VnMmN2bU01QzZYdFZJRnNMNmdDMlJhblBENUlqRldxYUVDWXJlbm1yaFp3dTZxb0pxNkpkZDdYdW42R3JuR2k4U0czNHV1dHlMV0lseERaODNCblV6RXpTbzFkZUhXVTBVUUhUWDQyL2VJakNDSmNuNWZLNzZtaUJyVHkrR1BxWHRwTWwrcXpKM3M2OWUvVVhZT2hSSVZqRlJLNVdqVXd4KzN1V2lrWGVrWmQzU203MUJSQ2tWL0FNZ0VodFQwaWg1dHB3dFVSU3FmMkhiNlNsckhsVUZ2WjRsays5RmcwMUFDWnZ5Y2paNXVySk5GWmUwOUtXejJ5Ym11bm5pRi9QOTBjTnM5Z1U1WmN2NXlVYVIvMVZQd1F1Q3ZhVHhlTFVXKzBxRUlNd1dDNGlPR0w2MWJUT0FQNzREbUEwcVJ1TlRVTEJRaXNkOEFOaGRoOXN5VFpUa2ZCWnJKakRaRmQ5bGF1ZnpkbTdMTmdscDViZGxLRU1GSnBEQkMzazhUZzNkTUNvT3BMdzFHcDA2YjgzSVNJQ1M5ZUN6eE1SZU43WXYzYVR0REZUSWJXSWlXMjBqNmJ5VnlkNEtSdE5rVXQwb2Y1VllueTYyTjlUd0RsOEJkWmwvcGpUVytRVGhYdGdVTnlKZ2hXdno5a3NNOFUxWFlyNWliOEJleVpVTEZTMVBJTnlIMnd2OVk4Ry9CdmIvYk1PYWtCSE0rVnE1aWFMeTNiZW16cEg3Z3lLdFUvbXJ1MldydE5waXpjdll0ZHNtaHpoZDV5QXFGbVhveGxQQnQyaXM4U1dtR1R0NUh3by9XVEJJUEdJR21ySjB3L3M4Q1pRbGxFRFVRV0k5WFMzUE5vbENlMVoyNEp1RUdZYktDQVA2TjBSQkx5TTl2OEhSSXh0SGhVNzd0cjJRWkxjT2Z5amptRkxVZk9Xelk1eWpxSGtRZzBucHQwUm9MSzhrRlgxRXRzQ3JKUUdnbmdmRnV4YWRDeU9jblk3UHkvekk1dmxjYndTR01yYU5vQ1ZXTmE5K1NhUjZtV0RNeUE5UC9mbVp0bGRUTEZ1MlJTVzllY1FLL29PeHRQa2RPSmh0RW5xaGdlTk9jZFhQQ3E5OG91dm9FNDRCdTdDTjR6b3BYR2lpaGpuK0U4OUhNNGJMcDA2SjYwZlpxVnFlNVIyZWVpbWF1UGNXVVA2ajlhbHN5UWw1MTdDK0MzcjNycWhsR2plQkxiVkw4aEhSZThjUUpKUHJJVmE2YTRQODA4TkJTY2xJWGlpeVBGaFFXc3JNRmRLVXE4YUJYSnJRMUNYenBIODN0dm9IRnBvMUcxKzNOT2UySGtpK1N4c3djTEJUVHIwMmwxUGJNRERoOUlraXhrM05tWUZBQ1RUQnl0SFI2Y2tQTU0xQVltTERxZEtEK2E2THd5aHBGSy9QTENHK3VXNkRXWmg1c0JCWEZaZ3BqK2svdTVkTTF2cWEvd3Z5cXVRSTFZMWlzTXBjRUM4RC9LMDYzdCt3YWJnbmpFZ3ZMdW9SalY2N09YeU9nRlJTWkM5NFVsbnR0dmlKYllBaXVTZ01DaWRwbW5BOXp1TzdmTXhZUmFhM25ZRDhFb0VFZTNzNUdXL3M3bmlzS3oxMExpY2g3ZTdJM0lrY0MydHRQYWVUNDBiYVZDaG5tSE5VZFBLRjlsZjY1SjhmcC96YkZRajcrZUFSSVlvcmdYWVc4VjlwMUkrZ0pIU0xkK0pQTVFKZWNjNWlNNHNGeWJUWHMvR2hDeFdYdXpKd3ltK3ZlSFlQc205M1dTZnpiVmpUeFR4ejJpTzRwb0p1cEFNekRZK1Nac08waTRJd2ljQ0g4SXEyVFZmdzNwc05yZDZnOERzLy9XYUNnMnFxeVJyS2REd1p0aU1ObzZla2JrR1B2ZWduYXpUa0JUYWRnc04wVllBOFdpNmhZTkQ0WDVmN1hVL21YdHRFTVF4eExaaHo1SlBDSTJrS2dJRlBZYjYwV2pIMDRaTTZ4Q0dMdVBqRTZVU0tDbGJBYmZIenZFc0xVckx0MDlIWGw3RUZpTmxCSm9ydVZMZmN0bnNDbWdYaTB6dFpHR2lBNHE4MSsya1BlZXV5NDVWRWtrUktMc3JZOEFjYTBtcm1NSllJK0EyVy9EY0tIU2lCQ0ZicWsxOXNqcUNQV2ptTmhlNUZ6NEEwcmM0MGpwUXl6ZzREVzVTUERudzYyYlZKc2ZyNFJyWWZNRXBKcDI0bW9uQWpObG05OWJGS1hkUHdjd0pRdDNJS3lZdGhTbXpGODYzeHJDSTFVaUtxTnFYN2tlOFljVGxVN080c0NNdGhpR0IzL0VzbFRVdUJYQldLNkdjazFobVJwT3VtTVF2Rk1kTmV3UXNNVFkyWDNOOUdOc2I2Y0VucE50ZFVvNjBPNUV6YjFGaTBHTFMyMXRSSVRpRXlvTmRqNWJ4WGt2L0o2amJvS0pMVWw0L2xYRkFuaS9BUEtvYWxBeUlEbTlMeDd1QytBcExVYU53U0RzOThXVTAxNXZnQ1M4aGRsOE9CNEYvV3NqTDZHNlZXOEVtRUw0M21MbDdEVGNOWVFaOE5vSlpJeTcvbTJuQVFod1VjZWYzb2IwS3dmdGdPdU9FcDlFQ1FrMENJSkhDSDd1UGFuMFdLTFVYSittbnZwOHpXL0Y1Tm9NNFYrdVZGMXZpMXAwYUxuUHlaMlZNY2hWcEJ4ZEVET0lPV1Jlb0lMeEpiZk5tSWlvYlpqWGxsWjlxWDNPdEtqb3JZWDB6VTlkUVJ1MmFaa2FNaFR1RzZOaHJQOVJTOXZEeHlBWG9XMlBJUFpGSmNycDR6V2t1dTN4QUJxcWV0UEZ1ZWcrRWp4UEZLVFNRNjdhVHRsY0l6Z1B5S3F1QlRYOFBPU2R3eWVmeWhzdHdNTStkQlhlOXRCK1l0YlB2UE1CV09HU0ZKWDlWek80OFFSVUNERFF3R1lUbGtuV3haeVhvaTRnVVZwUXprSXBybTFOdjh6dGRGYmUzM01PaEZIaU5FaDFwMjhZNzNxeDhLYU5pZ1JtY2RkL1pWckFxZGtVWkNIQlloUVkvOUFWT3BPcEZLYTR1TVZXUmw3aFUxbE8vOThRc2I3Ulk2eHowZlNvMHpzTldaMElxUWt6ZGg2RXYwZHZva3RiVUlPWWFsYm0zN0xVblQxUDBSZG9wamgwZjdBd28vM29aWTNUaUNHTkp3RHlGTEZwZGk3U3h0MzFsUWtoSDBxaGx6SHIySDBQUWp0dEZFaTBXcTlLaW9ET1BKWTFJUjVUSjBkSjU0NDhUUTdOam5Wa043SVhRZzBEU0V1Q21kODNLRUxNQ2hFUTFxSnJXL0NCWkRoTFhJQlJLakNxbkkzVkQ5R0Y3cG41cXNoU3hBWFJhQmMraURwOU1sYlJiUnExa1ZneU8yNzJOMEhpNml1Y1lvMVpGd3NnTlNNYlpQNmZ0SVpTTytEdGx1V2E0b3pYL1AwTVd5TEFzbDVJWmNoT1JNYWtUanUzejhCdWZPL2hTMlFUUExVYi9oSFM5UWVLM0xsS1VMeW1FZEg2cE5BdlU1MitIeHZtU1VYZkFiM2grOTJUeE5VL0hsdFF5NkZuTkJQbi85Sjc1Y1NqbTRROS9VOWppcGtTUTVnMERENGhHZG5HdjI5T3FRUVk3eis0UVN3alJpZnNONUY1c1dHcnVsQnd5N00raHdsQ2xlY0lLTWF1SDl5UGsrUWZQQkV1NUJXNHNpNWdPVTRWc0tRMXV1YytBeUNjazUxQkd6c0RxNmZPbDdoYmJjV2xSOWg1c0U0U0FPZTFiTm8zN0lQa0hnYzFMK1pjTzZ2dCsyYVgxeEIrRjlYUE1OOEdPekMxeHlDb21DRWU2OTJUMklIdVlsU0F4QWpQMVVSeUFMNC9HQzJzTDgrUHAvQm5udTlhaUdWV2p6WFJFR0FwKzZGTjhEQ3hBb3UvTG0xcjRCemcza0c1U2dYcGdKQmU0d1hLM1NuRFdKaE4yV25Nc0NsMEFKc3lMeVgwUmJualA1dk5IdEVuQ2ZJTGRibkhLQTBhQi9GS29FcWV0NlZBWXduRUFRUFV6ZTQwV0k2SWRFcnJoNXRleXZDQnd1R2p3YzYxZzJOTDBnVnpXSG9GU09YSTlhV3lCMFljNmFuYjZUWGF6d2pGeEVrSGdKZVdVQVlLYmhzT1lMMFZ6dDZqYzZOTFIwYW5KYVRueEUrT0Q1WU4rNDJhQUd4WFdVQkx4Wk5uODZiQ1ZjVFF6L0FZWnhsUi9wTGMxbEZvemNGYnk0QTVQVDV4VFg1TlU2WFFNajhlMVIvVGI3YlAya3lXYUVpNy9BRHh6aVU5UW82ZFYzMzRaUW0vekdvcjdmSURFRmFiMEJuNFR1YTI3KzJYdWpUckdxSFBnWlBUaTRZMDdsR1R5UXNFeGk5cXRpUUxhUCtMdmxMSzlKR3ltUjZ0SUNQTE93MGd6SEFieUNTbWJnZjVmTnNhRE50b2c0QjdoM2hjVjhLdHFWN2R3NXczSXFjOTJoQk5FUDBPcVFpZEFWbTdkSWZPSG1zRmpHaWZseUdLUXdLVFhsdXU0YzRBd0RBR2QyTm05SXpGakN5Z0VQREpiaXRPaWpxN0JRUDBVYXRCWVI2b25NMnZZNUw3bzA0Z093MVo2Y3RUVkhrSDZ0N2ZGeGxCZm51d0xMY1llZTZLYWVJZ2dybW4rYzljMGszZ05IckRKV0dmYnpXTXJ2V3l2WnBpNXU3UjB2TVVaeWt2VUh2dEp2NG9TZSt2MXFCMWl6QTRTSHYyQXpHOXM4bFVrYnByZEJyUGpxUnI2QW5mZHpmb2NyK3pLRDYvSERQUTBDaHdzZm1rQzA2WmtKT2VzQzlnWEVLaFRRU3RWWmJiS3ZGcUhjNm9mdzZ4Z0dYWHRocVUycGZiMlRiTWJLb0lPNGp2TUU3TStCN3EreFh2YVg4OHBSN0NQRUx1cE5oTldFa05BaUZlckh5ZkpEcWZBQzRZUG84cFFMeDhhR09jczJRc2ZDSmR0WTN6ZEFjVTA0c0FPb093QWxKcGFxSFVSdFhuNjZwR0VObS9HQ0lTTmFnTWxXdzc3QjRSL1dOLzFCYVFtSUl1K1NyNEYreGFwaHFKMW1pNVcvdERMVVZQZTk2NXdxMEd0TXpOcFI5TTNZK0JjYUhUd0N5Tm5XM3dqUFhLV05Oa0l4dnhxVkVKaW81V25MVmhxV25mRUJnYVFsQXJIUHllQXZ1MnJKS3B2elVBQWp0ZE9CTXpOTHk3K29uZW0yT0pjTEhXOUFsbnVKZVp2R0s5Mlp6R2toQzBENE5Ca0htY0hXKzdFbFZrMHZPN09aNmZubXBFYzBiUjEzMWc4TTc4K2dBYTBaQ3dyLzZpeDJpMTBKV0EyNkFWOGVaODhvT21FYnVsR0ZXaWdHcWhIMkNCS0prR2dhQzV1WW56YTczSFB5UEZQYjNyWXpZTlE4Q3FNWWRyY3NDWXFxRGZTUkkzV0dHUmFXa0E1d2FsbXd0NDNWZ0ZrUVZLallZdVYwangzR0U3OHdXa1EzMElsWGZZUFBwRGlIZ2RVa0lsazJ4aldzbTVTZUZtVmsvRTd4VG5BNFVEVnFacWpZZXlheEdaMUd2dXlXMVJGdTJkdk9xSWQ0ZFpiTUV2QjFnR2txWUtyL2sxemIyTWJkZHl2d05VTWMyeXNReVJ1VzRpQll6UHBsMWQ4ZnJlSWZYRURGY05QYW5DMERrMVZzZWUxakdua0xqRWJFTU1DNDZMRFg4RkFveU9Fb1FKejVnWnV1R0N5cjgxRG5hMlcrN0Z6Zmp5Uy9EWlVubk12ODYrSE1hckc4MU96Ym9EL25uOXRRWmtsbGNVNWVpcytTRGJZRURYYjNRRjFuYlMydmJPdW9zdURQVGRoSVJGQld0SndNSmdGKzlJZ0lTVWg5WE53aWNjOUhHNk9MUFl0NUtNM1RmSHd2SkhneHdtM01EUzlRYjBZeWxYcWtrZ3BGM2d3MUE1ekhBaXVEY0Q1WVVFanJnUzB6N2U5bERWRmkxMUxiVUhZSnp3Q3BXbUVPMERKejJtZjRwd0owVi9nYmVpUk5YQmlDc3JDSWJuSnprVzBkUFk5blJKNXNHUmlDa2h2dHc5eVE2RHVobjhmbUNxZ0hoK3Z2RUhtSW56cGY2REdnVm9yWHlrSE5aTzdJSzBZbUFPWGhMWDV6YnVPTkYwdUh4cC93OGxPa3FpVUV4TkxTa1NYOWVnaDdzODAzbUorNElla3Y4bEpmTUZtcjZLRXFhWjBXYkp6dzdTZU1RdWJSZDFQa3JzKzQvRWU4WjJGdjVvaDlnczEvdE1ocVloMmNYeXVJcDRPWGt3WkZsR0lCaTFoeHV1aFBER0lMOUV0OXZpK0gwbDU4N0ZmVmVkZ1dHK0ZKREZMM1ZPZ25wZWs3WlkrSXVPY2w2dXBwRTZDTHA4MzdsQXh4c1hJOTdENTFsRWhrdjk2YmpBZno0aG9HM0haTFpUNnRjdUNDRVZRL2kzdElqYk1aQ3RIL0NyK0syUytETTlzMWFmS0dsNmFzZ3JzQzZlQVRiMGVuakJYeGVuZWpsbjV1a3h6VDRrOWVlVUhwVDRmd3hhWXRoRS85OHhuMDZCRXZKLzJpRGUveHRiRG85aU1iZzBzei9SSHVRSUd2d2ErblVFUk9yZWpCSmU5V0NIOWZTNm4vYUdWZTIyRjROU2tyZ0xYM1FsYURhcHA2Y3o1TWhJTGs2ZE9EOVdoZHZ2SXpkeWRBY3BHbjE0VUFvdTFBWHlzNXU4TUIvYlYycnFVck54cHVuRXlWNS9Yd3MwYWluYmJjdWE0UGVac25yVk11UDZ5Q0V2TGIyRk9tQ205NnNzUkhnSjZzanVaZG1kdndaMWpBenNiczFCYkFJaSszdld2OVFDdllyVkQ1QWlua1dtUzNpS2xLUVhsQWV0eXdRRm9QUjM2dWdmTXJSZ1dpVnFaNUNObjZsdzB6WFlpUVZCS3NIQjJTWjNJa2YyYjRIOUFGYjdyanBaSStJR0YxMVdGU2MxOUw2dHFEK3dEenpFWERBK0Nma3dLMlVUWUtBZkpaSW9GMGtaQWdvb2ZjMGZqS3loS0NaNTNrZVpxV3kyMUtzNHVvaTBEQlhPREpjNFlkVzl4UGVQQzNCaGVHaGE5L1hXYnk1aVVkaWNTdVZPY0RHdDY5RVBUYytMSFZWcldzRGN6T0ZwalY4TGU5YzlqVTk4bzBCZzZRSW1paStVdzZ4aW9IYXV6MUJmajJRL1A2SFJZTmxZa05MK2F3cGdzd3Y3SjV2MEgvcnY2dUtETDNhTnhVWU1QUFFMSERRaTR6cWs1b0Q0aDg3cHZUV2VGc2dPV2h4bjhxTFVucDg0emUzKzdocDRKWFFsOGtMSzYvQysvaGx2Wk1LV0t0dkl1V3RHTTU0dmxvRXY1TFpLN1JaS1Nod2VyL3ZxQXBxNUUrenkvelRUclc2TDJtdWE3d3FzeVgxUENpNXpEQzZ0TVpCOVFpY2VvYmN3QzZmMzZKT2ExZGk0ZlpGYjhQNmlPRlBXMzM5cUU4bTZxK2RqaVphYXdyWWZZSFM0NmJYL0ZqTGY3SGZaSllySEZiL0ovallVY0xwZnlsWFBoS3lMdUVIMGJPaXVQSzdVT3Y2cDRMNHZGeVpYSExma1c0QzBhdEpjWmJKdlluTGFaTitLS0h5bzE4TWQrZk9HTXJkeE4xdUJNR3VYZ0J4b092bjF3TVUzdElrRFRCUk8zN0sxS0c3bU42VDJOREk1REtUeGNmTGRrNFBPM0d4NHlkcWRjUTFLREZoRis5MFVINzRTYS9IcjhSY1h2cjg2YlR6dGxmN0dhK2YySTN5cFdNSmhhdnEzS1dOWVNGamkyZ1QyU3VXOXZ2d3NOZE5zdmlWczdIajVlS1B0bEc2RUtHMThqbGxXaFhhM0lsZDlxcHd4bzl5N01vcE0wVjFydmxYQUk4ZENLM3d5ZGQ2dDhCaE1pVTdzcFR3NVJZUzF6MmU2QVNLOXJzK1BEMmRIcDViL3Bpdm5nNXFvL014TFpZc09lNElwNkhiM3VtNWRJdkxad0lhSUxadHU0aWMxeThJNlBNSmgzbVMwL1hjMkJ4UnY0TXhBY1ZJNDc4Snp5cytqcTlMNE1LcFM0enZKS3E5R2ZkaS9PUlM5T1hQdHFFdENKSXl6dEY5bG00Snc1aEJMcUhRWUM5NStKZUhHVHRtMVc3eWtGY2poQ0Vuc2pKWTgybm1ONitaYW9vWDRTbkcxMlQ4VWFuV1lpbjVHT0ZOMGJlTnB5NVRLc1F5QWM1UWs4QUlsWUJzR2lMdG16SDc3NWxXTTBBeTZTYXRwV2FONHd5ZlhKeU1ONHM5RDgxc3NwaXIvV3Q5QTZnSU55ay9KaVJTU2FKaEd0SmdOQVdBSGo1d0ZiVUNoT0RiV3pSUlJzNzRmamhCbE9yMDdwNVpjbVBRdXVFVE1GTjJSN3U5azVENk1OQXJ6dFV4QVo2WEpKQkh1RjZWUmplZjc3ZS8zaUZLU2RSRUN5MEs4NjZSbFVERTU5ZnFZUDREdmxCMFFMRE80UEpGYnBJQXFKVjhjMXpPUDAyYkExQ1JYTm9vQTVyeFlFblhpYVZTMVhpbGVydmtORGQzTXd0SU5pck5JNG9WaG5nTWVqZ0JOeTVaUkQrVXRrN3FQSlk0by94YnFWYnVucFNVRmhZM090Q0d4TjF5T3NNRUF2U3lSTEJJVHYxNW5CcDZPNEc4NThoTVNHbTFSVWhWcXpDbmNDTE9ZQ3U3d2EzbUpvWS91R25rWTdzYmdPbktDUS9vTEs5SXA4dCtzclV1VitLblFORTl1VTRFRTY1Nyt3NlR6ak9pSUthQ0FDZ2VOaHllWncxTWlLS2NBTnlvWUpUVUEvSS94dmU0cmU0ME5CeVBCSXhQbFZhaHFWMStXK3VEeWNzQW9WSWw0WXRUQmlDSWxYQlhNOWdpZHVhMjNXN2dFekNCQkRRVkxaWndwWHE0UXJQbHpMbHhUMFV5ZE9hZEI1QzRYU2JpNWVsL3pLY3VYcGEyTlNFeHlId2I0bnArSmxqL0JaSkZNMjVadzQ0U0V1RFlRMDFReitEL1M0L1dyZWVxNlBLQ0l6dEZ2K3BUa09sa3N1aS9ad2RpaUJadzlOS3lLSWZpZjJzM21iVkE0QjJ2c2NmQVE0eUZnNXdmdjUvajhyc2hRaUJSNTd1bGttbm5KOTN2VzE4bmtTMGpyZlhqWmtJVGlFT2lzVVhYU3YwWVRHbzgyL1JpbU9YZFNiOEJTRzhDcndZVTlLZGhrQVdkMGZkTDlzN2pZY3FmTk5CZFBORmREZ1JzeS9RMEFXQXhLWmNtWGhDbGU3b2oxSU5yZjd6THcyNldIVnAxdWxLeGRuOWFWMURHd2JOMzlQZnZQRUtVM1lmZlROMFNSWkJ1V0x0eUJPNVpPUTVmQzdWUWVCUklqUTJac0N5U2FabDBaUVlVeExwZTZac1d2QVdqd2tKempaRFhBOW5XejZBcFFnS0twL2ZobE80cVE1R0J3K2llRUdQMkVEZWtVVURTdTA5WXhjZ0drOWZ1K0RaZUluaVE1VWt6L0xLaFhrL3VCd0ZHZVhMOXVpd2tNVzJsRSt5Mk1kYzFNK1RhdVpRblpjNlpQclhubHZmUTBxVkZpTzNSeUxJTzRZYTJsYWNOUW1BNmlDTXJTV2F4aWdsOEtVZ0x6eWJoTXRtR2x3RUtKM2pNV3NtNldkejBVR0tPOHFLZjFtNEsrLzRQQ3VoQWxSbWJ2Y0xlN2dTamZhT3FZb1FzQUpHVURFUWl3Z1Q3MWUrZ2pmS3ROcElOM1BIcU1BazM4SGszS21yY3FxNS9rL29JeG41Y0k2aWh4RnEzYkZBZEpCMlM0VzJiU2RTeXNCZHhkUXg4VlFVM0xvVzBTbTErdEdKNWtjRU5yTlJzQVVxelUrRWxLNFJxRllpWGhTQnhhUVE4WW9VcmpyalhhNjA0Zy9mdVNuT0NHT2N0MTJqZlhObERIOFdnV3NjZWd0WW5ZS2tTNkxjcWkyWG1MQzNDZ29OWitxV3dkdDFpRGJYdW1zMzM0V3JyZGJBeVF1VDhEQkx1YStCSjhqd0ovZ2NFZXBsRytpNUNrNitGTFlTSGdDYkMveFNHcWtYRTlwQ1VkUGJGUjM1aExDbkNDTlJMYWZBRTl5a2VNN1pOYmo2bmQ0QVNXOU5XUFV2ZlVYelJCbEdObDFESVV0dlJKelIzTzFtZjJqVkJRNmpvNXpBL25OdEtpZklVUS9SOU14Q1JROHpQR1lFb2h4VWZWejh1RHBQcGxLZFpVVERldWJDS21vcGtVbU5saUNOUFpEWisvdjVGR003V2JTMlU5VkJCUkY5WUtHS0sxay8xa2ZZV2ZJTlJpSkZoYlNxOWxMSzhqdDZ3QnRZUi95OVhTWDB3bW5GRytvRzkwNFFmSnBWaEFCaGVWSmhaQzdHbTJza1E3WlJ1U1doajhkM2tuRFZpei9GajRPbzRpM25ZaXlFWTRnUG1ZMmlRN2JPVUlnby9HNERITG51K0NRYTBwdjNJYUxIUlYrZ3FyUjJMbG9XakxUbTBsV0d0Vy92NFk5NndQR0s1V1dEMFpxalJwMDZtbElranVtdmhoZkxIanZPaUl0c2VneXVWcjF4RHFYait6L0JId2hCUnB3RGF4YkkyQTdCdlAxQnIwQWNTbXJhZ1VLWlpPY0c3T2wxUDBFM201a1R3c2ZGSTRac3VVZTFZczUxblJ0cVNPVU9lNFhvU2hmM2hjS25FR3ZDdm14UFRQdGxkNGRaK2RDWDU4MlRoQUJnekpTWEtIYndQTStCU053Y0pTUjREMlJldFl6M2d6Vkh3M0dub3E4MUo1b2g2eUgvaVF5T0ZHQ1lqWHIwR1ZoVytoYmdiNzVwWUI5Wm1XZlY0Z3R2SlFFeEhoMWVuY2t5VUhPUzY5L0lxSlExTmlOKzA4K3BxdGVmdzlNWDd3K05RZ2pMMTBVODhHYVh0OU1uUGIvZWdSckVnY1JRckxFaWxjdldTN09FNjhVSlRFTXBjSXBDaFZTT290eFhDc09CMktaTDVOQ0xRZmk1NUpVYmxPNUZ5dlZuS0NMRklvL0syZkZPcnJMWExodlJkdG5oSHZhUExIRndYNnJ2MWZSd3RuZmxneEZlSVpBMW9jdkU3bm15ckRldE5zVzZRMTFWdXd0Y2U2U3pyRmNGekhRaU1DQWVRUTFIUnFieHhiQmVGUmV5eTF5RmdRWDg3SmZOS0poNXROZWNNYm0zZ3kzSkhKeGlNcHFaZ0crelhVRHJIQ3Z4eDdhcmxOT2FJZzhzZGw3NFdnMnBRclFuZGg2Q3lqR3NZdFNPdGZOMkVJQWlnL2N1MWxSb2pZMGhtSVFiUHJJZ0xLQzN6UUw3ZjBrRWpmeWZwd1cxL0ZBU0t6UlVCVC9uNTloWEhlOWR0cFF4QWtTMzRScHhqUS80K09hVm1IUWZqdG9WcE12S1JoUHBBbk9hdVpZdy9LT2xWcHZtUWVMNHhhcWlSVy8rQjdIK0phQkFEYmwxbmpJRUlZQ0pCL05IdW9hWDR5cUlPek9taXBXWWJwNnNKWVA4bWg3VEFpdXdqTDFYbm9RN3piN1BZQUpTOUNaMm5COWMreTVZQk9xVE9JZjZkMjNoQUhYbmZnYkVwd3ZBdnBUcEdrTFFNUWl3Y1VEQ1R5a3hIZk5uZk1CYWdNL2Q2YTZJSWxGUE1Wc0t5U2NzaHVNOStXeFQxakx6b013a3JvUGFUL2U0TVdsY3dOcTJ1UE1tODFaM1BrNGdjN0h5UFluQURscmd0NVYvcllhY3ZMWmtVQmFSeE0xMnNpQXRVaGo2SHJJei9NR2s5TGZqaXFITzl1dEU3THQwS1J3NVl2T0FiRWVVOFBwdm1YK1hScml1TW9ZdXkrUlBHbEI4dmNLWDlxTUkyMGxqeHBiWW95aFdaeVJ3a3NUNGFGMWVwQkV2MWVDOWtabXB5d2pOdGZ1NWkzNVJIeEcxenhRWElkbS9ZV21EVmF3T2lCMzkrbk5LM2kxQllrMTVkUDRvOTk2eUlzL0N5QXlxYUVGTUErMjBOZWJwNit0Mk9xdU9KY2Fwc1gycU9yTFp2ME15RDhabytmTnBXTTR4c0k4UE9wUDJsVHZUV29CU2VXNytxbWZ1Y1dkeXZsY1NOYU4veVdjUkQwSUdaY2NFNlhuNVNnbTVmaFlzamlpQ2xTYXppQ1dtaXZFNlJRV3hWRzgvQ1R3MXhVc2duN0VTaExIUmRXcmVqdldVVjdUTEh5bFBSUFpSTCtMNVJRSTloTVpHVlVDelBneGRKOGRNK3VzWDQxRkdrNE5SeXkzTnR5dE1oL3V2MzAwQUM4WXNEZG9WaGkrM0tBb3lrS3VweW4yQTR4ejM5dExXS3NjQTRlMUN5QjVnQ2VsSVc2Zm9aak1LZWNJNjNVWk13YjBYc0h1UGlKWmpXeUU0aXQrWmpjVkMyR09ZQ1liVlc3akhXWFVES1ViVTZzazBsS2luckdDYUlyNzI0c2RpZ3dPeWVzS25DNG5hdnFHVllGWU9GM0RGVUhrQXg0UnlrVW50WnF1RS94VXh3L0ttT3ZhN3pHUnR1UG5mbnljcUFQaDdzSGVVTWVraS9zRUFGWTFZaGhMdnV2dHVkbjFSTW56b2NGK3RZSjJaZ2JCb2RGbHkzWi94L0xOaDR0WDlHYWpjZEVPQ05JTnRXTFNXODZoUzRIRE1Bb002ZjlvT0pzdVFEeXhDaVNXcEgxTG83UDlUSkExa21ncHpaRXU4YXhWQTBBVUdXZXp0ZUlFeUFKOFlvQVNFZ0N6TGszaEwvTXpnUDNnZXoxWHZhbWcvakU2aUoyZ1l0T3FxQkxuTlVDeTVYWU5BUHBpejkvd0xsUVZsNXFGU0NDenJydDZJNXFscExrTTZacFQ5WTBvUTRncThEalh3R0pwblk3VzV1bzVJV0tLcitxZ3ltUlg5UjcxNzN6RmUwM3ZERm4vRXJES3pTN1hYSWthWkxmS0d3bGwrNHlGUTFON01VV1BOYnZDYnZhbTZRM2wzemt6MVpQbEtWSGFGVTRHQ1RRaFhOYnBMY0V6T0Q3RnJJbFdzblcvaWJ1eW1qQnBaUU1mTEJsQis2YkRQVFphalJRdUY4cnBid21OM0Jaei9pekdHYy9BVHliSlFCZ2g2UkxUMm1jSGhqY1d1U3pkT2ZieXl2UVJweXdPZzRPMENBdXh4ckRMR0VCZTJ4bHA1WkVBaWxQckV5aUdzZUNORzMwTERlRGdEbkNJNnRIeUVzdkFLMkFtenRhaVlzWTJBUk54Ri9acndYS3FiNVB0bitlSFZycFdLN3JRU1lKc1pseU00SjluTjR4VTVjNy9NcGxUcFpud0VrRWVCTGpNMXZQNS9TTGczOFE5S2lJd3V5dnQ2dzBTcm9IdEJRTnVyS3V0VkFmeUZVZForNU1XSi9YQUIvMEZsZEkyZzRrZ0V2VXRsVVQzOFVReGVxdHVRaHJuNDF6RnBQeDF6bkx4RDNOMHExbElGVkdzbnkveUNFR2M3dWVIZFhZSGZxcU1GQ2dscHlJREFEOURpbHVzeHZpNS9aTnM3L1VnZkV4SEZveHJKeVl3NHZGRVFGdXc0UGJkTXpVWkUxeTZKT2RyZHlwWXdYOXE3QldGb1RWYWhWSno4UTRIN2JJWldTS3JYZERQdzhxVW01NklZNDNUcm53WnU5VmFLWmptTGR4STNmZDBvaHFIY2pid1VxajdEMkQ3ckUzVmUyaU80aWVta3pOQ0l2Tlo5RUdVek9mQk42akowa1J3OXdwdTlDcmVQcDN6a3NacDVEYmR1dUlkRGVUei93cTVXY2R0WDR4VWQ5YmxGUWpyT2c0b1JiRVFxakhBdzJkZ1VXUkgyaTREQXVpU2V1aHAzNE1HVEtoTVRYT0tFSHRFZ3IrQ1NydEJqb3krcUJpZXZzTkxaaVdtQWVVUmEwayt0eVN0NndnTUluV1hiZG4zRXZURDhzaEhZUTYyeWYyLzljdG5qc29UNzA5dVl0QnJOYjFBdVFQZ2JlOTlRK2JrOEI5MWErS09LZFZZQ2p2a21MYzUrYkdmY3FlbDgwNWIvUFlLdWpyTzVYcmN3Vnc3MzZiYXNTcWNzTy9nOGNuNVNBcEs0M0oyeFVtclF4Mlg2L2NMbkdhZUdTMEdDSzJ6V3hhQUJWd0N4Q2xQWVVsVmZZMlQzTHd4c1lSejJscm9wUThDN045SEE5dVZGMFJtbjRIbjZ0RjFBMFAwS0U1a2sxcHpPUUtCcXkrb2pnVGkyQ3cyWUFVaTgva2ZnbGpoeDMyT1gzbFN6TlRTcGJDWXo0VzR3Q1dndThXZll0ZkFudTdvR2I3dW1jYnlnbkJQZ1Z4cCtINU9zQkViYnFuMkZQdTlidnljZXNFWEwzNUZZY0N1a3VoU1plTEpLRFQvaHVCanJveStjRjZQeitSTzU4dUFJV25hUE5YRlhvcm55Ri9LdHFzVkJ3REJibjhIR2tIcVpaZHlsUTNCS1AyUzYxK1VPSUNpclhKNFpxcHZqbnJxbHIvQTN2UGlUUm1OMjRLZG1vd0tyYTZBeCtTUVRyUGNKMzZkeTdDQkR2RmY5b3hhWm91Z0RaRUFWUksrdjFYYjdUbUhtZlFtMVkwZnl3WlBROEoxSEVLYjhIVlZCelZ4dXllMXdzRTErSkxBOGxQekQxNjM1VWdkZGZkMlN6RUhmNWs1VUdIS2JaYjRlS3ZlME5WQVZtV25VR0FzMUZmVFZvOWlOZFMzOUcxd0NHUlN3VjdFY0dQdzJuYlpObGtObWRzdlhqVDlLWTNxeTFJSHViK0JpRysyNkhqdytON2s0RVJGTzhEZEx4TXQ5bG0yTnpNSTVIc1RkYk1zdW1sNDVES1pMOTA1elBQWG1WSWRKUW9UNEcwbUFmanAraGo4MFRqQmlZVUpoSWhWMzVmbFl1azZPdXFNMUpOYmVadkt6dklka2RQblFaYkFRcG9WSkg2VkZOdXBLbFZnWkFXaTExU2R6bXEvVFBVV1dWYlQvYUxNZ0dPRk9KSXI1SWVNb0VjZ0hnTXJOcWVkL01BaU0yZEJTOEFLZndubjNlR2xFaWN5ZnQxL0JmbE9FZEoxQkh6VVJidmZWZVRrWk14Zkh5cW1NT0lqNnBBMVBvOS9TdkdLWnlHMmQvbGRsN0hRZ2xOQTZVd0J0MXFBNGVqL0dTZnZhUnU3RTlYMFllendCSDF5VU5sR3BsWlQzbEZycmZhbDIzdEtOd0NXUmNxYzR2S2RCZTNtbTh4czU2Y2gzbWNWT1pBKzgwZndoaWhmTlcxOGJndGt6cmdVellIRzRBeDlxbmxka1I1NWNSUDN6SkxTTXdWdFNOaTlocUxpelRnZ0dFdGVMY29ucnpmeE4xQk41V0dqNWw3TVFpVFZNdFR6YmFYbkJ6WExTV0RBUnQrSjJ0cEVneGpNZ0lpdXJlSHRZc2RWN2h2bDFqcjZNb1NueVNpRWNSUmd4aStkTHZtYk5LV3BKcnJzZ2N2R2pnS2RPZVptRTJGb3YvRWZuSWVPTTYzM2ZTUUMyYktBemU3THJmSXo0M3E2YTZFTlR5NFNPYWdqbzFGTlVkaHJpMDRtTlhDME10NHlReno2NHNHZFJxSit6SnUrRVUvdmpZWVJlWmtLVHI3bDVqc2ZMR21UNlVWbHpKRTQ0STMrZndpeXBXMG45bmxIc013UTMyeTQvZnFNT1ZNSDlra0xMZVBmSEJQVHFTaGdrczQ5WUtDVnZGSUxaYjlKREZYZVlXTjRIL0ZlOUtuZnNtSlZlNmRMbkdYb3k1VVMzaVhtTzhVeTFlSjhLT29BUGVEejR0b1M3dmFKNmdadWhsREpKRXoyZ2pBQzBoYnpjMHArMlVtMmpFTStrbklSV1pqK01WSlp6R2lxMmxySDRVeUhOaE1oaDd5eFlUYi9jeUd0eVVZQTIxTVF0OU1oMkNwOVVsaXlDMlE5ZlZLUzhZZkthYTQxdHc3WUJXaEhqNXNMT0lRdndNNnZXbVh3ZVNQMUNwMno4b2M3MXc4MTFncHNmMUJzSkl6UnlCR2NmYmVoRVkrTGVNeWFZSzR6Q2pPUG8wcktyM0ljTXkyaG1ldENIUnNGUVNuSTY3R3UrK3hZZDFQYllOT0hRM1FOaWRrK01MQlBGdzFTSW02RnA1di84WURCMEpwMG1UVTNmWTh3Zk9QZnZGTWN3S3Q2b3dBbGFLaGVXQ2xwN2VZRDFYY09wYTJXbE52R0VWL3hxRXMrKzZLOFlYSWdZeUQwb0IwUUxEalEzVkZqWE0rUFRxQ0RWL3ZtanJmbWtsYjgxRk83U1BKSHRWd3UrbWt2Q04vdFdiOU5lL1h1QklUN2VIck9PbjNzK1BnVXFWRDRteWRZb3MzcDdZK2xSSlAzdXJxTHR5WENXUWd0QUloZDBtQ3ZRczdaeHVMK1c3MFFyenZZdGlMWVN4T0JoVWlwNnRWSWJuaE9rUlZKYmlGTFU3UkhJMkExTFFETUhlRkpXbmJhcTdPU2ZPNm1EcTBHZGpnZ1ZUTTNlb0ZGM2sxOUcvWURESHFXc2EyWW5IZzNIdWJ4aDlGM0tJSXBTd0JQalB1NG9mR0lTNUxCSy8yakJjTlA3UHd5YlJucUJZUm9vaHFRUDNMY1JXTkc1bUZaWFVKNDY2djNxOUNzbnlHRlRDQ2hKL0dnWDBvSmZtM1RCUzFWbHhCU0VJTE5uSXZVUCtOVjNPZldFNEZCTkhsUG1sS0FMaU5aU0ZJVndEeUxUeUtjczY1QTVSOGQrQ3kvVkNjaTNIR0xzQndXSmVZM0ppMk1GRWNNWTdUdGcxc3UzRDRBTUhsaU40L0YyOTJwdjVpTEhHRDFXTmFxM0hEdmNjMFU2RjVGSFJockUwb2RmSCtZck9xWFM1RTFvWkFNVmQycmx1RFBIUERZcjNEL1FnMWNnRE4xRUFqb01nUmdob0h4aTdNc0ZueUxUUmpQQjZNVUZWc1liWTJuK0tLbXBBMGJDRW5Fakcwc3g1NnNNdFFPeWtlN0Y2VHV1c21HVFo5VjFncytXY3lVSmxUcGdUbkg5ZktFZnd6TEJPVUZTV3RsT0llTXZxVmJIMTA0MXdPRVhCbzdRUS8xclVNbWFHL1poMi8zdVBiNE9xQWIxcEpNWXp0bXFseWpqakt2Q0Rxd2gvYVYrNUdnMDVXQmJNZzdHbTJFbnFueTJHUjk4blJCbjY4eTFqQU9NUjY0bkQxd2h1TFJvK3BWRXV6TXI0K21TS0RjOVpyNnpjN1ZYU2tiWHhSaXEzeU04ZVplYUFsSXh6cktqd2toWURjY2VCY3dCbUpVUWVuK1h2VlFnSjRJVTd6a3FJN1luRDBMcFk5UWFZcHQwdHlhVW9pUzlkQzRSVmRodnN4ckEzN3dEenB2dDlwdkFXTUpjTmh6OTF5anZvSy9leVJiRzJlSkdBR3FFbTF3bnd6Sk9TMC9OZ2pyeDQ0M0c0Z3NUZnNzYnpUSzlObGJEYzVFdUpPNnBrbzVHK2wvbGZOTjdSTnYyc01qYXRtNE92UjlRT3QrYzUvTTNwQk16L2NoRGJVbVpEb2VkN01hRytrMUhIWkhjNW1yWXN4THdscmtuSW05MlBLMWk5dm56SDg1UnBCVDRmVjJic3FrM0JCSHlaYWtkNFZzTU44aktkL1dhc0RNLzVSb1c0dEhieElzY0RSblh4M0pwWlZTb1h2MXVzOFJ4RW5EdjU0VHpZTzNrR2hRQXBqTXd1WDlzdU9maFlMQk05V2huUUlUUlNnQVV6OFl4aG00d0FKNk5kNTFTSzhGaVJpenFKcFdjYWZmSHF4Uk5QcmEvY1d6QWgrTmVLVEs5eWdnSDQySkdzcmNNTnNiSFZFVmlONlFGQURnL3ZhaHJ3bWtTV1htQ3NKZnh6QldaQXF1a3FmYUtUN25hYkVMem51TmRsNGpUbEY4SFp6cWlQUUl0bm1UOHB5UjVYOWZ1Q3dpUDZ2L0VHVy80SG5sVFJWcUVJU3k5RGMvYzUrZnJQUVRjQVNJSUJaTTNEWFFGd2JWS0cyaEN4Z3RuOFNKSC9lTXZnY0wrNENxSlJrMnJzWlVqTUFZTTJZM2xLZGpZSkdDRVluaEFtY3EyTmN5enFXc05BMUxlTFNZNE50VFg1R09GOVJFL29Pd3FSN3dZT2VmMkdDYUVUSWFzRVpMMStKd3ZmaUh5VUJTQlNlYUZ4ZlN5Y29ZVExJVTRaVlduNGJENFU2ckwxTnpDL2dYZ0VuR3hhMUg4bjhZNld2bGg3TWpGMzd4U1RjNHNZTE02NURJUlA0OUFBMWVVVUhYa1NNRG0yQTdjN04wUW56eEtNdjY3bk1WMU9YNm1kN29UOXZKL0xHUUpNd3pXV2ZHUzFHYXhHZkNhQzU1TTE1S0ZGZ2lNcFlEOGEwRjZjbzhIdytnQU1wMjVYWTRVUG5xRUdrTXdHSDluQlBxT3NnaUFoOVkzTkR0ZE9rWkFVN29CTFM2MzBBdy9vd0NBN1lneGNIYTI1VWdwYjE3YkZYWC8zbkR0S2ExeGl1Vml4OXdTT1Fxd0N0bnVGNTJ2bEdoNTNURENDMm5yRE1pcFBuSmZaUjdKdG93WGZPZUFRc3llUFNNWXdNWkcrd0YxWWtycVdkYnV3b0lKaFlzWVl2QVRpWFc3dktBb0Q0N2lKb1NIQzFIRzVSa3Ewc2NuYVgvMHdtY3Zsbm9kNWRlZHJxSGIwT3RYV2NaS1drWkZqS2YzYWh5d3gyeUhwQU01L3BsdEE1MDQ4bFNEd0JwOXFPZndKL3pCbU94K0RLeHowcmJhd1dtZEZsWW95WkhscXhBTC9LS3NFbmFrWEw4b0dIdEp1RTJGdGM2REFLNlhTV1FuVmZxQXE5QmRsRnFGSFowcFV5TkdUaVY0dEVNUkdwZ2I1c1VGcjNDcUdkblJLNGdYbGxvQWhUZjhBendlYXFBT3M1SzhPOE9TdE9ISzhqbE5ubWIxa2VGU2x0Sk5ONHYzUGNYVTlpS3ZyVzlKV3JBMGhiK1hLY04wS05aQ0ZDdU8wRkE2bXdzRVE2M1NkMTZzSGpRVGRYNVdzSHJiU0FxdVFiUXIzVnFHVm8wbXE4Q29EandHbUs3QjI5OWhMZFdkWGs2N0FLME51ZVNJbnM1cERoY3YyQmFaOTdDNXVDOURUU0NQdVNYTXh1c3lQTTJyTms2bHNIcEJVZlEyYVM2d1k3MDFGcmtsWXN2RnpoSlZVTmpwVHhwM0REeTRzS1R3dUFqOTlXWFB5MUJtOFp6SHpXdk5aNi9LMHVMY2VUcWZZMkVUbmM0YndONWRCWTZRMGxlUUsrT0lVczZLcExRVzJlU0NhelV5S1NnVmZWMHpBdXNNc2tHM3IvRGYralVqN0E4Qk1pb2xNWTM4SzQ1T1N5RnIxVG1QV3ltd1pseFhpcm1HV1ZjWlZzb2JRZGVPSzVKZkRXNGdzQklNYXJvV0RJdWhreGlWenRNUFdnSlljdTdxcHR4REhWZjlod1VNaHloTzZJRWVML2paS2NMdzgvMzZka1hHdmN4dkxIRUFGWmJkZHRlZHJHZ3pBd3l5d3dEWWtyUVFhUE13a0t6SmtFWkYvNkwxcnBnOVNmd01OUDRCUENKMmxoVjBLM2YyRHFJT0k1NG1LcTVxSXNWRlRpMVRTUHV3ZE1PUzVIWHEvelIrYkVEbXIveWk1MGJnNmFFSW5TQTd3MncxNG5jTVlXV2dXZENucjNydUdWdmRpTDdSelRHT3lvOUVpWHl6V1R1RERzSVpVWWFmSCttV0oxMWp1T3pQTXUvNERFN2dnS3pHbmNFN3lFemhGTVllS2JTeDBjU05VSUhZN09aLzhtTGEvTzFzaWtSd2RRUWRpcHptNHlxbTRJTSs2MkdYNmx1aysxK1JidVdFditTMTdMN2paU2loVkdRdm5QZUVnQmVyazR6N2hzUGZUc1Eya2czUCtzaXEzZFFpR1ZuNng1TE1SaDBoRXRhbVdhZFRLcDk2ckFid1dKemhaYjlvSkFWQ09FQTdHejhjdjA4SkRkU01TUnJNY0hjUDdzcjJYUDdzWnQvczl3VjVRQlJDQlc1dUlFTVpJU2xIYTRyaW51L3QvTVR4V1ZzWHVhVUd0M3BMTTl6RG82V2dXTEVuY0tGOGk5bWM0YWpnWlZPNmpoaExzKzlOS0N5VXZvNzBhSWd1MU9IclVQMFpTRU5oMlZrbkZ3SFRmTWg1MTRTdC9mMWxjRTUyNDFLNGYvM3MrTVFBbkpRNks2cGV2NVJ6dklOalRsUnpXSmFyZGdhSVdXTUY0MUg1NEdkZ1p4bGpBT1hkVkt0VGxkVjd2MnFoaUkxem9uNTVWOUMwYk1EbVFvcy83VW9odU0yUUlQR21FT0tIcnd2cnV4UU9Ua3p2bE92VFVGNkFVVkRnUTlYSTRiWUgvS284ZUdDcndEam96WkhVZm1Kemsvc3NTUnNRQkdXK3Ivd1E0b0FubVloQms0QTVKUHNEL1Y1ZDFmTzdiWWpHajg2amtJQzR3RG9vOEl4OC9MTjNzcXAxbE9oYzNQbUs3Z0xoNkNrcjdDTGw3ekFYcXJxZktOTE9tbTBNTWc1bkQ0eHh4K0l6bmdvUjRoaFNSTXdRNHVsRE1TY2ROUFM5OEd1R2pWcC9NYnVNU09NRmJESUxmMHozZFdLbVpUV015d3dxM1ZkUmR5Y2IyVGovbW5UalVVbU5ZQ0VmK2E1czAreXc1Nmc0MzVvaU1EZ1pnTUdmNjRVYTAvUTgwdE9QVUFKSWdlNmd0aHV1UW9DMitSamdiWENJMGFUYS8zekFOeTVkdE5HNHBXTTErT2Q0cGNHZE92cElVVmRsekdNVEhGcmVNblVXaXdRcHN0MEhYS09TTUNQNGlsZDkyaHY0L3IxNk9HR095c2ZXN2dPSzFwVTNuNUI5TnMxL0trYkM3eENIU0MzL2ZsbnkyZmZSVThQa0tleEQ0Q2I3WnAyQTBuMVphbDRYRE1kbTRmMU92RGVzUFBTdmZzUXZpUkVTNWdWeVVhaVV3Z01lUzVWWDVkRFBPSmhvQ3VXMFU5ZmJlaTRLK2ZIUnAwbWcwRjZKMW9XeVptdUtpY3FLWjF0MlZFYzBDbDhYSmVkUnZ3ck9RVWt5ZVkrdSsxNWpqeklSQmR4cmozM3hoSWZnd2pVL3BSZVB2VWViNXBQT0dadXF4REp4dVMxTjc1emJOcnFyL2FVK05lTlZOUU5DZGVxRVJXNjA3Kzl4cVpIMnB1a25YZ3dxNm1UUHJoaTBSMmNTVHJOZjk4c2xsLzE2bTRhUUlSMzJDREFuMDhlSUUyVG1BbHNTSDVhTXRFM0FETEN4YlloTHVSakVuT3V2eXJ0ZWxjeEZGUjdINFlHYTQxZEQrSTJrTXQvWG4xb2xvWjhpL01ZRitqWXNDVlRpb0tudHNYdUhrWHlNOGszWmVrckxZNlVmS0RaUmQvQzV6bEppczNESVplb09xaXBxNHI4cE13VFhDL3k5R3FiS0prOXlrTXptN21BQ09IRzVxWDVLMTdPMkRRRGVpMGMvK2RiUUNLTnVXbnRBRXZRb3oxYTdXNE1rR1Z1V0NhMXVrV2FpRS9pSDdwd3Z4QVlMTFVJQTlHQkxoM0pvRDNGUU5qN3JWOHlOSU9BbTZKaUpYNFloVUJZR2lsaXJzMWI0c0ZzOHAvYkRTR2ZjQXFDWDMyQmZFOFQxclpnRnVQaEdoRXVQVXN6dFFZOEFISG5ZQUp2RWNKMzFjcnhmUkRTNWFEVnJQQ2txUlJyc0lxMFVaNnlraVdlMmluekQ4TEZmVFhET1JHeiszOTJoUDJYRVRkajBPOEZ0NEcxY2hXaW5HWVdKMXQ5NUIvY24vYmhnZjAzL3dqVnptOGVVVFJxdnpDSmN4dVVPQ2crd0Z0VVA2emRRb0NVTDJOek1MYUxBMWt0d0lvTS9mVFlGOWd6NFc0eEpGWCtiaC8yWU9sWjhEU3lsMFVXRG9QU1JKY0d2bms2MjJ4VUE0QnJJK2hmdzhDS2MzU1h3ZUJYTkVXQVhtUHBqaWkvdGRmUlB1MVRSN2tDeHhEL2lrdk1CSFB0S3o3NGwrbFhDMHJqenZGLzBJKzdNaEQrdDZxWGhTVFZndUxmOWJUaG9WRjhaem5SY3RXRG9JU2hCdGlQOUFNdWFoWCtBVnhPU3hBRERXbGJFTFpxNi8vdzJabmx1SjltbVl0Y0RYOWorR2dVZEx5RURId29zSWQrWGVXT1dNWHVBY2pwYWRQY0xEWnhBMHpkUFIvVENXUmFBZk5TN1AvdlJCa3loaThtNEdwaVN3WHUxcC9aWmdhZXlJdjdpRUhyUzlyclZBeXdqYjVuWjhrQktJUUxVMzJmOHliS0gyQVlPcTNOOXQ0b3UyQVFCQ0dMTkl6NFc1Y1JiMkR6ODNQWnRPRjNWOEVWRkZrVE9hMXNJMnNLUnBXUm1GczV6cVhqZUJscnQrSEhka1FzZTJpUGgwa3JRcXpFcTJFVlV0dGl6V1cxbnNZc1RtcFVMWUpmdldDK0ZYaWsrWGsxVm5rbGREWmpoS1RRb203OXhESSt3SWZGaTJ5Uy9tblhJczQwRmhwTndmaE1uZWJoYXdsTXY0azM5QVAybHYyNVNEakpvNGE3QnJqaGQ2MERoUVlicGlhU2lkZ1RMZHBWNmZic21XOFd3ZzVXVFBYQUphUi8wc3NNRU8wbWlOcXZGVDd6K1MvaW44c1BtdlA1cjQ3dk9PMXV4UTBHSFZrSlByeSt0aUs1UFJoWk5XZmNyRyt5N3RaU1ZRRE9XOE9CTVJzaGZlUkEyQ08rT1Z2S3I0ZGZndkR6N013ekJkeVhMa3ZTUmlmUzhwN3dOUXp0L0dwSGlvT0VFUkpDd2w3ZGFNMXdSN2NucWxNbUFtZ1Rnb2dxSVVBL2xGNkg5b3lGODZMdW5LbUUxaUpMa0dISFRHWit3T05hN01LRWRJREJzeHRja0pEZFlIcTBNZ0JydkVCUVVHeTFvOHBEbWVuaXM4TWlzbTMxYXZzV2N0RUEvS1JiZXlUelMrREZORDl5aXloTno3VEMvcGNhOUFwY2lXSDVuaE8wQklmcVhzRGMzbXlmNEdCL0ZtSlorL0I1ZEZXVEFlcDFmVDRwNFBSMGhpRHF6c1lDNXV3REVLVmlZQ1lDUS9nQm51M2p0enpab29jWVpQNXZNOFArL1NGRHZRMG1ZVUptWU14N0xZbkhSNm1abHlTQlJZWW92Rmp2ZjhuMURiakUwbWI2T0UvdDQyOVVFYTNLK2lFcXp3TkV0SEhIMjVzOXpTaUcrSG5PVnpaK1R4VDR0VWxsRVlVZzIxbnhzeDZjbjlLdDkwTzVFc2p3WTVvUFBxODFxVFFyNVJvYUtlT0g4a1dETWwrT1A1azJtVU1RSGMydEtZVFFDNXEyZkRlT2hDUHhFdzdCMnY4cURlMnBNc3B4ajV3d3dQOUNIdER0QWdPMFhKUDV1clZoT09CNTJSeC9kSDZEajluRkdkZDNCWmFKaVQrVHgycDdpUzczNHlNMGxzekdWQ0FtNGxIdEthUHBKWWlyaGNoYnJmWXMyWU1sc1pxeDNPUFJEdmg0Q2JGQ29HeTN4QkRoRkQ4d2RKYkpCMGVYdzFnbVA0cm40L3Q0MUwwZzB2UG1pbTRUNmVEblJ5RWlTT1A5RE9pZGxDdDZtamFseS9uZC9vbXJaM1FKTDRubmw5WFB1VjlXK2Y3Nmw1dWNxcWNxbjc4U0J2U1JodkxqeW5yU3VidjJUa0VkdmdnTlpIeFdMM1BuOVhjYXFET0F0UVNYVmd0VURwRG1lTVRJOE9ERExVM2ZTOGtKbEMxZEFtUVVlWUJhcWZTM3RDWi9DRHZudXExeHc1aHkvU0t0L2FaKzd1NDlQcDFwVXhDMFYybkxaYXRGSm9wZk9BcXVWbnpqTWVSVlUvR21oQWZ1cGtvcWQvMW1SZ0F0WmZmNFo0Y2M2dFdjN0NwRndLSHFvdzJ2WDhJVjB0OC83THprUC9IYVB5UjlFRzNmMDU0anZZS3dwYWczTHM4dU9jNnZKYUpxd3pOSWI5bE9zT0lXZXN3aVJIMlpjUExnZWhUbk02OWRMZE5NVTlvQzRaZFExTW9oVnBncmZqSE1sSm1kN3pDSVc0a1JuSVVGclg2VE9vUnA1L2t2V2tWVytmRUNRckZrRENPUyszS1YzSjJOZzVlV0E1QmJ0TzA1ODhIZDNyQjFLcEdha2tKMDY5aXAwaTFERGFNc3MvM3lEdHE5ZHl5czIxWDRiTlZRQnBTMlZicjkxOHNDUWNZK2FjY3V6ZEYwSFhtc0FIcjc4TGxEUHpKNmQrcHdENEtueG5WUGsvMk9TSUx1RU5FcC9uaUt4L09DeUxLK0RwdDZrbDZPbjd0eGZPdm5Bc3duMS9RS0JZRzBWeVphWXBFaDVlUkJXUDdMbFRFaU5YTkdjcGo3RE56SGlaWlhRNWk4WGRQT1NWRnBTRG5tcGZJMVh6VmJPQklEMGV4YUtjRTJML0RPU3NwL3dOeTl3Sy9lZ3BZa0x3cGI2d2xPVWdqVmxGcUlDQWcreStjMnhnMmZsYzB4bngwRi93UTR0Z3ZLc1ZNalpJYk9qb3N3NmxkR1gvR3RKdmZodkhLWXMvS0g2RG4vQzFkSDB6Y3VOaFdtMHFJZERkU25JaUdBdjByZU5OTTREcUNmQmdyU2FZci9BbUlHZmo5dmhGOUM4WXpPdzhsM09ZNkRuVmVXRlRpZi9aQUFFQUdnQkFBQUU1QUVBQUR3RUlPUUlBQUFBQUFSOEJza0FBQWdBSkFnRUJDZ0lBQXdBWlZHaHBjeUJwY3lCdlppQkdhVzVuWlhJZ0tEZ3A8L0JEQj4KICAgIDwvQklSPgogICAgPEJJUj4KICAgICAgICA8VmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9WZXJzaW9uPgogICAgICAgIDxDQkVGRlZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvQ0JFRkZWZXJzaW9uPgogICAgICAgIDxCSVJJbmZvPgogICAgICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk-CiAgICAgICAgPC9CSVJJbmZvPgogICAgICAgIDxCREJJbmZvPgogICAgICAgICAgICA8Rm9ybWF0PgogICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5Nb3NpcDwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPFR5cGU-NzwvVHlwZT4KICAgICAgICAgICAgPC9Gb3JtYXQ-CiAgICAgICAgICAgIDxDcmVhdGlvbkRhdGU-MjAyMC0wMS0wN1QwMjozODo1Mi42NzFaPC9DcmVhdGlvbkRhdGU-CiAgICAgICAgICAgIDxUeXBlPkZpbmdlcjwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU-TGVmdCBJbmRleEZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw-CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk-CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU-CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT42MDwvU2NvcmU-CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8-CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBWUhiQUFFQkFRQUJnY3NINWd3Y0RCNFBBOUFBQUFBQUFBRTVBRUFBRHdJQVFBSUFRQUlIQUFFQjlBSDBBZlFCOUFnRkhRRVlBY0FBQVlGYUFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCd0FBQUFSZ0FBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUVZQUFBQndBQUFBQUFBQUFBQUFBQUJHQUFBQWNBQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBR0FZZ0FCLzVQZkV2QVVPNjhJZE5rMmtDMVduUW5pOS9Ga09aQ1NzTVJBK011MUxYWHAwNVhFSysvaUtaSkpHTXZ4L0k5SktOUkZLWURVQU0zWDdiV2x0a0VuZ09JQXVaRTVhcGs2cnIzTGlPdDhtRTZtR2d0Y1hDcUE4U0FqNkg3UVRLK3ZGWW5yemY4bHJKREh1UG44Q0FBTE5xSTFBSm5pRzRMVWlqQnI2THRubHNOVXBPdCtPWGRIREx3ZWJnLy9BOFpzWndCRGtwcVRJRDI1M3lSaExCeG1KcStvcFNicGxCVFFnTTFiYThia2dOVXBwOTFQcWE4NCs1Q3ZBNmVWbTdtRzlhaDkvYTBoNThhRnVVQzdURThFV3FMQ3V0RXZQY2NkaHFXZjhwNG5xRUNsREx2eFR6ZnlCemRyWC9TZFdVbmUzVG1IeGsxSDdNb1l6ZHhROVpOV2VJR1QzeGNDemhrUzVlZmhjNkdYZmFrd2orUGhZUmUyNWs5b2haenhnTXllbzhVSVdTbDNLcE00czFpM3JxYTZzRXBJS2RQa1ZGTythSWR5eUlzY1JINVM2ZDMxby9nYm5HeXV1MTNhcWhOTmdRTDhabDhacDh5Q0pDeHJsM293TnBwYTdEQllJV2FTcXVmZ0x0WjFJUkFlSmp0M0V2aXNrNnNlL0VUTGpkSlErTmgrZ1ZIRVZRSUZVYVpHSW9oYjZkUzVUekVaQnIzMFgyaElRSW1wcTYwd1JEcXBPWFgvTU9FT1NjNHYzdGJUWXJIbWIwYWpGNlQ3am9jbUpwcXpKOGtpSHNDTXcvdUxRWnlyK3NUK0FrenJ2T0J4VnY4TnRBMWcvMzUzTU5yR3VySmZSZTBzUzdCRWcrZkhqNkNhTnBqUW52WUp6RjRKZW1GOElWNHF6czZUVUM4VjU3bjlodC8wN2N0RHZ6YUthdUNaSVA5NjZwdHFHQzhuVml6NGFPSVg5WFdjTTg2ckYxU2d5MjR2aTA4ZVZyd1JmclhQem1OaXQzRHprajRkR3FqN2lQRjZVV2NVR3E5ZDVaVDJlUnVBOEQ3NVM1dFlWL3JpUkhrNUV3dG0wdkp6cTk1MlcrV2xJQmdUUlB4Z3RjQXpmOVJxaVRURW0xOGtyQmNYcTR4UWFyQ1ZCVEZDV1BVa2l5RG5yZmNvWmsrRDgzR0dPV3A4bGtYTC8yTUVIUnlvdVpjd3UzUmw2L0NvUmxKNDlOc1ZTTGRadkRQWmdjbFNHcVJPU2I4Nm9rY0Q0dGs3V05ISENIZXVsOEtZdmZINUJXeDg0QU9OdzZXWDFwVnllQ1FzN0JhZnNiVXA1cU1GSndTNkZSWXlia2xKRnZ4ZUhONC9ISm84T3VaVGorcTNuTjI4SFJCZkRiNUhHNlUvVklKRml3bWxmcUpMNmRZcFFZa1ZnTmJTeXN5d3pBdDI4cmF5NHZ1emtYb2w1ZndDdlN6TmNjNTFOWFE2M0R3UkFxU3FjdjJ2L3BqTGZWb0RwaGdzbFJoSzA0b0hLeEhmZ1ZDZVJwdWNQdmE2U2s0Tm5IdnpMclJZM3MxaFc0VkFleGlwNDJNR0I4eGxER2VveEtwbFo4dmhYSjJWY29aQW5wTzR0U3dFZlpMcEtiUXJabUR0K1BnclFyTjlpV25HVVFldEVrdEhYMFQ3QUNtZ0JvYWg4ekJUMGs5YU1TZk5yK0U0MWhTRDUyeUQ5MUpvbjYyeTNEQWFXVWZWeXJJeVVsQnJ0ZjNkMm1xNGZaL3dLejNqYkttTnhLRGFXSUJOdTFhcld2Y1BldzBrTHpQZDRHMHlmV1V4NVdCMVlQeW9WOHlOZlFwUVVtN3NPejg1ajdXZ2w2SjdYU1JQNk9IWTZ3cjlKL0luckpab0Uxb0Q2TDQ0Qm9TRllUemJ3R1hFNTNVTEt0MVpUM3pjaStqdVVDbis0NjhJaXNYbEhyUW5CTnk1OExCeHB3YmV3aVJDazNaR2ZWTzh4OG01bnBPOHVhTUhPc1YybmV6cjgwejFyVDlDazBZRkNTWWdpaUVTK0dOc21EUmV6QWtpVUc5bFNQUWJ6V0U1bUU2cmpLM0FWSjFMMnZiVU92T3puSXV0YjNoSWtLU0Z4MUh1TE4zUGV1K24vV2RVVEpUdjA0elVqK0ZpODRkVHFaSjh1OFpDS3ViZmgvZi9LRC9MQVpUeWhtajR2RU9JU29qOTU2WUsvZ0J3UDBJM05XVzA4QU80VjUySDRMdWliQ3g4LzFYTytlWjYvM1hOdGd0ZlRDS0R4SDhMd3BqODFBdHpvbUFuREZKbTYwcDhJeitWUlI1eVBJc1lPaWNHNGx1UVVSU1dUZ1M5aDdHekVpekVranovQ0d4S1RIcGtyM1NneXo4amFlQ0M2aFVuenl6MUtoL0g5Ri9KVGN1RTlsSjgremJySmNQZzNSZGFsWXlHTjJUNUp1Yjl5ODBMMkQ2d0xuVUwxbnFjb2R3OW1kZk1LM2N1NHNnNDlsS0RtZkhrc29rQ01nMUp4Z0RjQ1NzcktzSGpGSnk0cE9QM1dtQTVHdFFrRDNOTzd6VzJ5cWJ6L0ZhSExQZE9WUkJTMzViMzNkbm5OR1NLZ1YveGl4OVJpTTZnRDNWZFZyek9vNWxSVmNXMjFSVHNhQ2p1ZEhFVnhZaFZlR2s1N0g5R0lRQ3d1ZXJZMCtvYXNra081dkJJZDgvbmQzSTRuQjMvUnVEMktub25nV0MxcXRwUjJjUjJ2ZUdpUlJxZSt4eVhFcjJCU1BzVDB0Wk5zbkcvQU1Ka0JheGJxSkdhbktmbWh0aTh0dGVVZmtiUHQzUlVzTW9GTVRNekxsdVhFZFExYndheDhXTTNPd3pKcmVkL0pPNXRsM21wTDNmOXZjQi9tYjdtK0ZUcE91Vm05eDlpVTVjYkJjb240SG1aaWJTY2RROGcvU0hWbnNsL0dNeHhRMXhvdG04UEF6aWlXcWxEdDNtNG5ocis0dXBuRnRWbjBLemJhZ3ZrMEJReU1UMTJIc0RHVGl6UDJMZXI2QnRwVnlacVh3NTMyMVhqU0hjRU11SGE3NmpiRWpUR2lJT01XdUNIZUkvbmJKcE5jQWJKSEJLSEI0OHZVd1BuK2pPV2tTdVBlRDdXS3ROc0Nzcjh5eFZKUk9rUEtWYnI0VUNROXJ1VUlMWjFpSC80TzlWWlZuZkRrWUxCeW9Rc2orRk1XS2ZBakttNGdpV3p4b1dCYUZUWlRVVDJqODlmbkpQdk1xRi9VZEpkeE85alpDWE5YOHNBd0ZvRFNySzV3MzhiL3l0YU9tRVp3dlhteDVRT1MyUHVSNEdLa0IycHdnb0w2Y1BQMnhZT0c1bkJsVFE3Smx5SS9zVDBIcEVLVm0yV2FKTXB4M041ZWF4c3h2YWFpU3VBeTlUbDlEaWNIYUtndWJvcTY3TDdQRUJwZkI1Y3VaSDdhdHFrZU1aNUhHQ3NMSG1WSTQvREpQV3FMd1hTcTBTWDJHeGpvbmFKRWN4bXVraWptT1hCN29NOElFV2dUM0h2ZGs1MGFiNXBmUVhDUEpwTWYxUURWa2JSOTJvRm1LSDY3TmFLd09kWHdnSDVKcFZUdnBkdUkxZmtkTFU5amY4N2lEWnFUK1dMMUduZ3JCTmxIVk1SemJEUG9NTFFRYzlRZ0tGZmdPZFQ1NmZvNDlXNW9EdUc2S2RBTVhrRzQ3YmxXdUZienR0bnRzdHBZTy9aUnBLby8wN3lxY3F4cXZybkhRWkVaREJKYUdKdmJJV0U1UlpMZE0xeVR1YVpnWHN5MGJrSnlTMlNzcExzUUZic2JlYWNtNTdpbDdjQjEyeElKNVZ5Wm1qQVlickRMTWU5UFd4bnpKN0QvajVTc1p4Z2RXemJEaW5jamdEWlFZYk5rbGNsQVBYckEzK2pieHZWZlRXZXpibHRndmJYVkVPUVNDdElZUk0vNVlLTUlGN3VqVmdaN0Jrd29aK2tObk11REVTdXk5SkY1TUtNdmduaXFFM216dmRvRnlhUjRPclhWczdKTXRWWWZBN0JnN1FIOWpHR1FmS1JHSUFsZndrd0dKcjIwWkFLQm5jTUJCTUtGb3dhMDdxSzlVQXNhMGgyQ2xQdlBQZVVXNHNuNnZydkFOVWdoZk9XMFJPZXpoYlNwUkN6RlRSNFlUMjF1OU5vZ2JRaFdQUS83ZnBiZjhaQ3dBMHZ1SzV3K0lmTjZ4Y3JRa3k1YkxHVlRPcnVRNktkUGRLM2N1dlhiRzhDWnBUVWdjL2tqcFZ6Q2xXWndDZUF2eUxyL1NvRVBHSUFKWDduUGFnU0hOYnkzZ0JNcXVOWmRiME9WRGdGdngvUGJKMi8vbkxrbDhSUjNobTFPQjRRSlovRUNiY3BoSVRPeG9XK1lsajlXSDhmREUvYkJvQzcrOTlxdzhvU3p6ekFBY3NEUGQvd29RbVBQOVhDREozQzdIZmdNcCtiK21iK1hvNk9BUFlWb3diT3dzSUsveWJpbmhHcW9Cc1hsR25VUnBjSVNQbkRBTlFSeXpuU3F6VEhNRHNHdFdaWERkVGpBUXIyRU1GUTRPbDZnNjQydDcvK0pRWmtMUmlOTGRJVnVTVjJFNWlqeWo4b2lpMWZDWHJNV1M0WnI2ck1zV2Y4MTQzc0Q0UytJaXhFSklobVVMb1Jpd1RLcGhCa1NtUVFoY1ljN3A4a2ttNExYTGdzVWlxWmtNL1JCMVZid0U1UkhpM3NiOFZXL1ZOQVNBdkRqdFRJWktRbVFaTXVJL2hNUXp2enppSjhnWEdrZ2xhWkJJeHNRS1VubUh2c0ovYk1kb1A1YXQvcHVDd3M3NjNwKy9YOHE4UDd5MlBocHFOellHT0lWU2pTemJlY3VuT1h2WFowMmpJbWw1R2tsYTBYQUJpMVlncitSZVhPWTJxY3BvOGxMSURWbEpianhKVmp6OXVydTZjREtrRk9FK2s2VEF0Q08zaEVVek9NM0ZscEJ0bE1zaFlxMitnUVVyeHZSbHpqK0Vyb1N4NDRNaUppWG5uckhzM2xSemVaaExnZlpBRWtFSTBKc2ZBc093dFprSEdPM0tUaWhyQm5PQTNnL2RIVGZnVWUvTWZrUkVqVW5iUkNUQ1V4UzdEL1NJcTR4QVBvN2lDT0s2QzdFUndnbjV1K240K0syWTRrdGZXRHdEUk9XZnZoTE5kTUZ1UzRTcjhIMzczZElpUE80T3k4bW9WS09POFEvaVA2cGh5dkJocSt5Z2p1ZnRReE5vYXh2clVpbW5UeDh0aVRCdmVtVS9qVFcvOVhRM28wbzhRSis2TVo5c3E2L2FxRExaOXZTNy9RTCtvMG94aWsyS1loK3dwSk9FMTQ1Z2dXbWZGSjYwS0pWVkUwQUh2REpJeHR5RmRJMmdoYUJNcnBHVVgvWEttQXZiZUw3TnNyWmxwejU0bUpWNmswR2pDZGVZRkJIQ2ZRSUpid1ZLa1U2L2VLSW9RWVJoajBwWHJzcm1qdTBlM0FUVWNPZmFKenJDS2FYTHE2WkVpR2ZOcm1CdVZISGgrQzZvYTBXQ1dJa3loclV2aEpKNXJYakN6VDJhV0tRVDZoc2V1aWV2U1pKSUtuUWVwMXlWNWlIZEVpK1N3NmdJQ2RtQVFWZG44VmRuMGNGOFBIMUp5R3AzTGNmTzZBVlN1cWl6b2lhdzhUaXplenZIUUZkN0JtT1U3dG1ETHVYRkZGVjFFa1NiYUZMOEFaMFlNVFJYaCswaEZLU2JSK0NRbmwweU5FQU1lSGpoL2ZIcWhwdGdVREREOWxmT0hqNW1DQ0ZSSWNqWFd6VHpML1ozL082cUx4MEYrTi91TmRNSjI2TFdZK0t0emxpRFVkb2N0ZnpNVG92cVpWVTAxalMyeWNTYzFmZXlrQUd6Z0tybnYrSDN3eU9JMmxGNVZOSVdIcjFtNk1SbjQrOGNJekRZSFA0WXNOWUhMZ3pqZE1rNk9sckZHT1FsTHdFNTVOdVpYanl5ZkhEOTQ5SjlYVTdJUDRqS3RHeTNPVHZ4TWF5eWNUZ2YwSnNEVDRWUUtQWjZwMVV6c3FUYmNuZkFjV3d0NERXRmZTSWNoOWlGcCtreGxERis5UUtFY3J5YXRjZlg3M3JpUUU5NHNuY0MzUGk1M3R1b3p3OWtqbDVPT1h0SHRQa09xRW1XRWdWQ0R4R1o1c2lPQlFhWWNxS3c5N0toV2FBZGYxVVRzL0YySXVKUUJXNndNYUs5SHFMRXRoSnduUHg3dEZjaW5KRkJyTnlnMFIrbzBscVRZSEttSERPQkhPZG9rc2Fnd2lPblRuTFA5QmZNTzJOOC85Q2puMEtRL1d4Y0E0YTB0QzNuR1F4VmgzQWcweTlpT1lZVUpVMzB4YkUxaFBJT0hiRUE5NStMenhwbDZjS0ZBTldmNUtPbmdERTJGWmFhbHNkM0VFeHF1Z2tQbHZCV2JpdTFPcE9VTm1lQnBDRFluRnZEUDVJNlBTV3A3cnlYM29SUFdvS2NudXoyQzdUcGhadUNrcVk0VXB2alRpdzV4NnAwY2F5SkJKL1hCYVBCWng2ZFZGaThtUzAycUlzQjkvRzVWTnE1c3lkNldjOUZ4WUdvbnlvTk9VRTJLeHgzaGQ3QVV1Wm5hY0JDRDY5amM5aEVSSWs1b2lPWE9LMklXdHR5Z3lhT1UwRzFoTEQ3YzdieVdRdUFGMkVESWJDU3dPRTY0VzMyL0FLQjNVRU1DLzFQS1c1YU9rOTk4b1QrRUxjbGE4Z1dhTC95anBxb29FejVuZUU1R251emF1d2NOcjFkTmhOYzRnNkRCVXlXbHVFTGYvTHpVeVRKVFppZHA0dUdnUnNVc3N4QWxIc3NEVUZPUmgyMzgwSnBkL2FZWVlQNEEzSzBrTHBIU3lwOTQ5cGN1RU85QUVXejdna2ZHVUxqc1g5Yzg1QlhsRVdTaEJONHczNU1WWlZhYUlFNWFSTWlPZ3YzSk85QnJ6c3NPeFJSRC9QYzJmVzlieThVaXhmQ0JmMk16Z3dEdHp2YUhTR0hxM3NFVkl6UWRSclVKMXFaeTM2U2luQTlKb25IS2VEaDlZYlNYNkdxMzM1RjBCYXpNbUJnb3FIZ3dQakkzbisyR1pIVVpORkdjUmVSTk9BazVTdk1sZjVlQmVWNTR0SERWSkI3RGRwbXBMNXgrUmRDQzZWQ3Vla1lValU4VDJKOWsybnJVRlAzYVRLNkZYRXgvQTRscURyYVFlM1BkSG9YL25kanVvdit0ODQzUDl5Wmo2Vy81VUdGZURvTHgzQ0pvdWhUeUtLQWhhZHhLME1uUDVSazFIRVJkK2hPa0JNOFBpVmJZWXBnd1JwSUZRTC9SamYvbC9NVlhzT08zeW1HVm5BN3N2S2xMYUx3VEJSZTB4MWtyczhZNklEYU1UOUNmY2pyN3U3NUdsbmtld05Od2NlVzZ3Z3poU3Q1MVJZK09rYUtjbmhQWVJLeGVlOStqMk9oRjBKUHFKUUlzQ2ZoYUYxR0lmRWpQbDlBMHIvWHNnanBDYkl2eFg0OHRaTEEyZStMVTB1bEcxQWlQT0UvYll6MmJDeStZcGdxUmdKejNGd3hob0FaNWlvazd6UWVFYjZUWlFlM2lGNis4QlF6ZGZqQzlPbEZyR2w3ZDB1VEhKQ1ZxbGFhVk5Ea0doZGg1RGowTHc3d2xBOGw5bks5R1AyT0Q1UGMxbWRVQkh3MmFYd1UvekdSVmdnNDJnbHRsOHBvOXcxWGV5WXlhSGFSemhqMisvMndOL1R4bDF2TWtjMFRWdUt5YnZ3ejlYZW0xMCtDRTBLUVBERUh4c0pqZ00xdml2QUV5Y1R5Yy9TLzhOTG5VTzdVcHd0QW0xaVY3Wm5TMWw5Unl3RUV3cVU1dFB2Um5YNjJMVzBRUnBKR09Bb3g1bTRFRkV6N21Id1ZtaEgyZXZVb2VOc2hzV2ttNW52a01kSGVZekxyRjR4N3paVDdid1ZTck9QdXYweWcrdW0yWVQxWXBJa1BTVGhWd0NhaFEyYmxTVnNLZXR2NlQrVlVJSXlFcmZBSStlcDdIN0xaNkl6TlNaZ3hoVUZiOVZldGtxRlRySENnYlZuTzJhTUIrdkdsL1JsNzM5djl3TVlNNTVkcm84RSt1YUtKR1RRRkdzOEtTMUhIZHVXaE1tcEU4cVBwc29KMlQzWjkvVzdVTmd1eWQzclVyVEJPaW1ISnd5Vms1MVozR1NudkFtd3Nra040Q3hlZHQ4SFNNZUt0cmh0L08zYnRPOGhlMksvNFFlZ0JlcndOR01wZGpFb1NlV0lYQnZQZVBKS0lqUUQxQXZuRUFuUStaMGFMQVhSd1pJeVBxbE9kK3BlL2dnNExjRWVMcGNKNjhTR0NTYTlqbFhjdzFOaXg1TXdTT01Md0tEUzhaczIxVmJzbWpMNEJ5czZoVFZkK2c2UDFNcHBTV3hhUUw1SnBsZzlOSVI3YmhLVmtWdUtzTVhJekcwVDhkUEJMYVBvRG13ZjB5cDgvR0FBWEdCWTJncHMyQnB0STJtSVFuRTdpK1F2aU1wbXNzQXFtWmtDR0Rmd0dKVnAyZWEwRnJJaFFBUFVRM3Z0eEQ2Z0ltZXpJY2VjbERVdkc4QitFWmtrN0ExVDluNjBpZWhDN2VFMEltby8zaU02cldtMUJlekJGZlh6d2RyUlBrNlFlb1BucjZGMlNyZDI5N00vcy9pYzRNSDJGVHM4eGF3L0w1cFFkaExiNlNHUFE0cVpLbGpsOWZKOW1ETTlsQXNBMHZRMElIT0RZY0t1SXM0dndycXZiUlhyaWZ1OUhJdUUrR1gyeXlqOVVQSmhValVhOE9ORTJNNmxyamtGcjNBSDdVWng1b2NPSEpVdGVCaWh2a1VPZHREbEdMbDdscVMxRVlPdlZBeC9GWjA3RDI2bkJaY1l6aVZ3RWlqb1FSdHJqNVVOSm1CZVVGZXVHdmltMnFLSklYWllReXJUMzB2ZnNwQStHdTRPa1huRmlCYUMwTnVqK3lteit4Y0U4VDBLYmQ0dGlGcnh2ZmhMdEIxSHI5bDAzTHJIUUxvazdCRFlGQ3hRQnRPUm5UeUFqZGQzT2w2ZXo5YVhtc3FDaGdGeFJuWHBkQWZDV3hRVzM2bmdkWHBjTnM2azMrWGRwOGE3d25Ydi9tcFNrL29kaUN2WEtiUUFFYndNQllUd3Y1b3Y2N2I0UWY0b25vMnRKeDkyRVUwaDlPcnR6YjRQZCt2L2o5R05WSklsL2RUSm13OWRUeUJXdzdOdGRuYzQ3VXhMbVVpbWpCb21jQWp1Y1ZhYjdQRWtzN0JFUktBZ3lmMm1XL2h0endNKzlIN1Bsc1FTZW5QQkYzUW5PV3FRQmZLSWFibEJxN085d040MFREQjJmRytFMnlISDgyMWI0bnIvVEdWSC94aFpSWmErNHYxMGV4dktvYnZieXlnc1FPbmRhSWI4NTUwRXRLdVZiQi9pRFhKcFBLZlc1WmRJb0ZYa3paZDdYZGdnNmRadHpDazgwTitJMHNUQUl0TXo0Y09PQkFNYkF2bDFWaXo4RHBXOCsvNDFHUnFKeXR2L1BXRVg4bEtkZUVFVjhLNTJTZ21ZTDBzenc5L0R0OFpFQ1pXdExmaVhiQzROb0FldFdad2xUQ2IraHVHVml0VlN3LzcyTTdPNnRrdVlGOUtldnFjNHdxRk1UR0pheDhKRWhIUFd6RlNXb2kxQ1JYSEw1WFhRa3U1QkxXT1pralkzZGowbHV1amFiZlo3enJDNW1LUUlraHJEMW9yWmo2M3J6ZUJwK0ovT29vdXZUM25SMVd1T2hucEh6MFg3ZWJLbHNvb2NGalprUWZqRWRzanRQbk1NTkdrYXpzbGFqSEZFSmc1YmM5WXg4dTVlMXhUWEF3M1ZLWU5MWG9MZldSSUVxeThjUEdOallYTkFxS2xCTWhmMTBtVWtJb1dsVXJMWmh1SU8yN3FJYXBMUVN5eWxwOTFPUEtpOW9IckhOQm5BemN1bTdzZ3lsZmN1RlZrVU5kN2g0V2N1STVhVkdBRlVFS3ZSSU12cUdTNlpadlJkQTMwa3pCRjM1bThHKzdWNWhBRjlrN3ZKb2hDTE1FVXVSSXBiaFN6SHU4V0FWNlQ4M3M3S2pBTWVtZUh1am1CZUtLWXZzcGxDdC9JUTQyZzlQbjFZUGROaTNQVFNYTGRRZXFSdU5UVVFwUHhXcjN0YnhZMW91NGNUZzltV0FHNHp0Wkp1YlR5dVZ3a01FTm8vd1FVUmZ6QWdaS3lrMHJyeEhEZjQrK0lLVGRDMDJMN0dmWkYyYUJ5Vkd4Tm5MczZoODNhdFMrRjJUZHJzd0lBZkRkeGZEQTFBWWtubGF5M0tEOWhhZ3RMTFg3d2tuZnFSR1NSbm42cTZVNWhrV2FXK0U5ME5vQVJ6NUtzMEJvM1FVaFc2MjVpVzBOQ2NmVUtIcWI3TFVSSnRYZlRRTUtheG1mK0VDWDZBdDM2NnREYTJHR3NCUy9nc1BuVkE4RkVSeExQQTN6aXI3R3NkcVRkUXVudzhncUZhdWhoUWhRa2RpVmd2MUNGN25QQnVFSTQySWRpa2tFSFNvU28rRENoODNJZXhOMVlyZGhXQWVBTWNZWFZyRlJmRjBLSHh1ZzQ2RFU4Vno5Wmw5K3dOc0dVenkxbk9XcHhUUmZTTlF3ZXRKY3AwV1FUbTR5WXpjVkdZbTZLdGhtYVMxNWQ2Ym9LcWQ3WEs3WGt1YVFsOVQzbHg4Y3pMMWFQRG9RSnlkVXhNRDRNSGhsb1YxWm5UT21WMW5zZTE0WFZiayt3Mnl1VUZxeldmZndNeXFwbTJOVm1BV0ZMakRHN3AvdU5lakQ5L1k4SEZIdW1nN0dEUUg5NUZYTzB5amFSTGlvVlBDNEViYTNHR0dqOGl4b3dmWGg5RWhxS1cvZWgrb0s0UWJWblhjYU5JdHRZZWZWRlZnVFJTV3Evend4YjQ3VlpWdXc2cDVoSHBqMUJSMlIyYnk5U3pyaVBWeXZjbytqNUdmOEc3bjNibGhXN3FjM0l0Si9Dc1dHTkpqbHdlZ0ZLbWlwdVh2bTBDYjVmYW9qYUVUUXBqcVkxTlpGVnJ0Nm4xVnFuOTJ4ZlppTVlmeWNSYWVPbk55c0FxRTI2L1NYcHhaY2FTRDlhdVVYcExBNS9MRXlzanFzSXZZSlRjV2FLbHFGSyswd0RQVjJabnJid2VwZGhRMWdCTVI1dGI4NXA1OXE0OVNYRXIzTWxvMzVWU3lBendKYkhlMEJvU3RRTUIyRW1jZnRUUTE3N1ZoK3Y0Tk1Qd0taVWU0N3JTSlNTTFhPdGwwTnd0azN1dTVGdGM1UWNxRkZTdWFIRUNLOFRWb2JlWHRiK04rcWpMM1dib3BKRDAzZHhZeWo0RVNtcVVlS3dKVXN6KzVrQ3p5RHNBM3lFYkpLdTg2bW5DZ0JYbFFrQ2o2M1RHMEdkVjgzSS9aL3lZS3VERUlabXVZQ2dkM01tMkh4WmFMYmNmRmg3YlNNZzZ3alJzWG1qYnVJdmlMWWdsVGhJQm85SjAwQkhrUlZ5M1Jmb25YUWYzSjFWbWc4Y3NWaUljdWdrbUtuUFVLMVhZN1hyUkpHYVByRGxwY2hDaTFxTGpZUERlMmtTb2VQOUcvTkFLT2ZpamtVUjRPUC9iTjFmVUx6a3QzdEFleHE1YVBpbitPSG1HcjJJMFpUQ1Q0TnNJcXVmTFl0TTZuWTZQNnpRTWVDYm1INDRnVzNaazBnYm5MbXpqY3k2WlUzZmswaUlXRTJnNnV6UHNhbEtUdHp5QzZtK2tNVHJQZHpqV0ovUTJibkdSQ1pVaVA3WmdVMU5rUStpU0phYitkRG9FWVFieFFwL1pzU0ltM3YwbHhLWTg2MytpNzV2Y0dDZ0lqRUJxSGNvRFF6UGd1bzhMTWNHVEUzY2YzZDRvaXF1dzI2S1lpc1VmV3hOZFY2dDEwdFNMcXdteFgrMXJXK1U3azExdkhrbFBJNE5jTWgrSkxXNGFZdUp3QWhIMXYxMmtkSVU3c1hERm5mTEZJMVU2dTlGYjNMaG43VHY0Mm1Mc0t1V3BXRXQwd3hCeW1qek9WSlZXUmx1OWtHZzlxWjkydGNLbWluTFkvUTJiTUVOR0tTTDhCbEk2bHBDV2x3QzBPS3h2VFE2eTVpdHlIL21iZXg5Yk5Bb29KMkJvaURnQzF3WllaQ2NleTNPYytiYVViR1Y3eTdIRU9NTFQwNitReDVWVFIwNUhXSkZpRm5DSTlEQ3U4MGtTL243UW1RbVhNNTBVZDJhVy9uVUdjU2svd295OWNvU2lEQzhDSUxIVGQ3NWNudGcxbjduTXM2UW12WjVvUEszYlpPbEVkd1RqQWZaRE1aWDMvZjFMR0kzR1dEMmhoNVQzZXJicEhoc2FBbzErWUlsUjQyR3lGb2NVZWV1TURjWk9lVkRMNW4vWTZTb2xDcFo1N2lMUHV3U1liQm1pWWcwcVJCOXVUREU0SG0rYUVxc3NBVGlBZExqaFdaYVpPa09pdHpDbmJvMUg5SVhhMlYyR2UyZ1NNMmpicExsWkVEK0JFaHg0MGVEQzZ4RUJ0YWtSRzcwM3gyNGxxVEozc1g3dVFtd0NLTDhVNGNlaFJ0ckRoYlduTkFXTzE0a2lsRlg4TVkxV1Jzdk1ENWtXU2ZidlZMak1YOXFKelUyelZVMnFHNk9xMGdKeG1PeEFlZ3E2YVZjdHhrUWp4MVd2RnFFOGdoWk9iZmZ4MVFtMTMrRmMrYWdFaFoxQ0hpbytRbmozbnZ6MzBXUUhmSHhzaVVNUlBNWC91N3owM014WlNLcnZCVGxJZ1M0OFJpdkJqR1Y2TnlaUVd3Qmt3aVhRV3dTYU9vOFV3U1BTSDkybDloeFJSZEJ0bnNZSWRLc2lXOVVsakZxZ1IrVjN6elZiTnIyR1JFbWkzWlBmT1FtbWFla1o5ejhLS2EwM0dXbjdZQzJ4Q3N3TWhybmtvMmJUUnBMMlA2U2h1TFhQU2poMDduNzBXbDJscXF6RWN2YmpwNGQxSUN1b2xnS2I1SWs1eEF0TmJRbFFJSVlxbm9FMnR5MmIraHhNRnB1RGN6RFhkZG9uamxaKzJjTkhhS1F4cGJOT094WjhaZC9BRjVlOTMvdDZFdzNMd0hWd1ljWGJzS2NmdlVMUUtidmYxOEVlWG55SlA1eEcwNHA4UzNiSkdSQ0tNRUNmeXIvU3c3WnhWUkVSMFRPSkRuTGkyWTVzTysvTHRBL0VlMk5nMkFLazgrUHVDWmxyZkFJbmgzVkI4ZjBaR2UxVVBrbWZHY2NsbmE5M2hqazhUWDZ3R21idTI0YTRFb2FsaHdiYUNDZEdHQWhGaGF2eHBsb0sxeG9sMWdKbDdpbktURzByeHF1dzVFbU1nTFZIdGpmRzFaZXRuOXJUc1R4Z2tzZXYrb1U2OXF3dEJ6RUVNd2EybVZsZmtOOExQOGx6clowMWl3Zks5OUxVb0JQazJQcFZqdGhmMGF4ZVVML2JSY1lReGdhOGZqaVRBZVJEcU9HK1NMUlFaNVJ5MXZRaEFKTGNBUncyei9DYXdJdjljQjI0SitUSWRDWVZMVE96WTYvb3RzOHFQN24xRlJyY2dPOFlnUjRQUkd3Mm5SQWZCaWhxTUt1Q29aN0tWcE05VnRMRVBubnVaK3dvREdTd1dZdG82Rnowc3JqVTc0WTRRN2MvUU9xdkpNWElybGd3TXN3UGFuNVlmc0pzakRNVnhvWm85UlI3SDJqRmF6RjVHeXdqVDJ5NHMwSnRObEFyZGJZTXFZZ1VLcHpPT0dBZ0lDQTV2cGtBT0RranhQWkV2WGlZUXZqREhxTDVqRVEraTBicTh6KzRRQjk5YnZDTFFUUmpuTjNJQ0gvYW9CVld1ZVpZSU5vZ3F1MGc2UmxjcUJTR0tleWJ5OVN2Ny94cUhIcEc4c2NlRjdrcEI0dlJKdzY4b3N0Um15aVZiL0NscExPYm1OVUVMd3htdUpQRlEraXh5eTFqelFtNmxnQWFBUWxwdkNZeG13RmxsVUIxU2t3a2FLRmZybWg5TUJ2cVFwd3FoYWdwb3pwZitWMlhvSGR5WnU0WjU5bjI5cEFKSHRDWEdZV1RLQjNDRDgrMkEvY1NKbmdMeDRRYUI1NklHVHVzakhiQ0pvSkMwNW1STXB6eEZ3OTJZSitBMkplMEV1ZlFwSmhOYjZVQmNNTUhwYXZiTHFackVNZHhkVURaWjVuSEJQTUVoSGdXSTFXWHVXeENGRGxHc0pHMEVSYkFBb1l2T2hFNk8vUEZZbnBRQVlPd1kwMWNwUk83RC81RVdpbEIyNlJrK3hrSWZraGM3V3V0OGM1dWdvV0lkWXZDaUJ6czhndmJLT3RWbURYVDc1Qkw1MnAxSVd4bzNDTVFnZFhwQkpmSDFybVhOUEJNVEg2bjRNcEhXeVNMc2J0ZXZLMTdxQUxpQTg0ZjZmSGM0UEhNVDYydzVBVzFadGNlcXlGRlpNSVhyMGRwdkJGRlp2ZDU1amN1alBoeXlSWEFlTDQ5bkMrNkNpcTNMZFJtOGRLeHhnSmVhTzZCbWNQZDdjQ1dTbzlBSkpYejBnazE4SkpwMEd0R0FWNGJXQmRKNnoxdVRITVVua3U1Uy9CU2tIVmZUeGZlc3RoN3VsL1Jwa28wNENobktPNnNySU12MlFqcHFUM0ZVZERTYVVkZE5wM1NCRnQveFJIeGZPdmlMczBRSCtkUFJ3UWxST09lRDFmNjFjT3E3OXIzWE1KeS9JK1JDNjBIZmVlajA3a1dIb1lxZHN0N0Q2Sk4wT2MvcDRsWVYwT3NsOTB5T25OblpjWGFjR3p4djluNjl6RXN3VjV1SFFJQXUxdlFvMUN5TnVXaUF0SkJTZmxaV2crcTlMNTZzeHpEbHlkdURaNkdsaVZVVC9FMk9IU3Fld0FwNldQajZyVTlYQnUxQjhMUWlja1Q3T2ZEMWhPRnA0Mm4wcGVjcG0vczZXTGlZV0ZQamxSWjl1ZDFNUVE1QnU4RlF4QnpocTF5ZW1rN0hQeTFKT2ZhODJabm96NVpsWDJrSTVvYk9hZk5KdzBpVUoxQXNnZWMwVHlEbkNvQ2t0Smk2YktkQjBMSWhyRWhCaGc0Lzl0SmxMcXNsWEt5KzFnVXVabUFnaDFxZ3loVkJycWkvQWYzaVBNeFlXeURPRTdqckV1b3BHNVBPR1QvcFNvdGxCZjh1dlczRlF4V3E5eVVEWG5PWUZjMzhjRTFqS0xsU1Ryc205TlJiUWtQQUNNd3RCbzhKc3pOOGJDVDc1bjBadytPbmpOMnJ4MHRwWkpNYitjT1JhQXdvM0NVTWtqWGxuOW9SaFFFYzZwL3duU05wc3Y5cktpbHNBVzkxYjVjZnplZ2tvL3NVMVpzSnZmQ21QbnBqWDVBY0I1dG9kNC9RUFNvdmMvcVBublZyU1k1Ukc2ZTIvTEVUZEx6cWVOR3FNMjJPZDdYclJRU1BCRm1CNWZGdHoralJ0ZDVEd2RXY0pUYk9TQUc2aFBNSjVYd3A3Z0l3czd4L00zMzA4dmpGaFFFRWViM1E2c2ZWR1BTTzkyeE4xYkpPcUlVNGcyZHhIdHVsaFl4ZzRpS0VORWNpZEI4bzUvUFpPTVI0ZElUU3prb3pRemN3MHRXTG9ha3A5eDhVUGVuN1duTzZYTUltdG1CM3IxZnFhdnhTOFBpVmN0NlhlMUl3aXlCUXpRUi9DUTdJNnVjallVU2N2c3FGdUd5aHlCNWhJdGNvbHh5NU9oZy85anJzODcyNHVGU04rV3BzYUFsL0p0RGdJVXlqYWtTTWhaYXhSUVN5a3RUeHgwOXhkVjJkOW1rVUlnb0xTRnNnWVV5bnNxa2ZWMmxEL0FzSDFPdnhxQnhTbTZmamxFaVQwMFg4VjVoS2FEdHk2Z2RvWTVZSHYycE9qWUdXMm9VbThvanpuQytFYTdVMkdzRVNXbTA5OEtvbFFLUElrTHEyajlaRnRIM1BPcHhub0paQWExTndzUHYyOFAveDBmVURlVTBSQnZGOWJ4VjJLWDRjclZwaEV1dklESlhYVVBZekRqL2pUODNWWDB0YkEyZUdabGRGaEQ5ZExMWS9QV2JucmZXK2FBbzhlZVdObTJZRE1DalpxUnllYzlxV3FtQkx3UWpYeXZsVnROa1BsR3NROUtWelJDQnlIMWxrTEhxak03M3lVR3Y4bDZCSUprVG5KRW5KU3N4a1RMbTlSdVMzMDZ0OG5iakozNE5MQkJmTHltekNZUXBoYTdkeVFuZ0RRcUV1QmF6b1AxVVBsbHB3N3pUYXNzUWJGV2h2SFI0WGN3cGdlenkwVGJUYmFTVUJNOXc3K1pqV1V5Tyt6cmN2b01RWGFPdDN4MnVGd3hJTmVlRGFiYzFqbDNwQTlONm1kSHFkNUdxUVV3dTZNNUd6UGNTb29tUzBFVGV2ellaUkEyOTRTZmF5dktNbWllTTR3SE44aWJPWWZJT2lKcjlFdUFQS1Q0clFFQ1JsKy9CZ1B1OWc0QjBQUmdQeUhVNHlsUlg3aGd6eXZaOUhlbjh3d2djK3dwczlqVUFEV2tGcGg3MUdNT2tTMG1zcFdIcUxnbzk5YnhDd2pCNVdqdG4zbUxvQjhwS1pQanZyMzh6MEhCV2hVQWRsa2ppdEcycmVEd3kwTUZib0xLc0I1cHhEUGpXSkFDMFZOMkZzV1IxNnhHREJsQk03WE91aGJZOUI1aWhwU1dyNit6VWk1bFkyZjVhWEdvdVZ0eEtlWkcwejBtZGlvN0NzbFhiZ3JqOUlsV242N0Izc3c1NVptR0RGZmZWaXZKOWEveWF0WlhzL0I2MVB3ZDFFVUM2bnYxN2ZXNlNLWmkwdndJZ2UzNloxbWx0M3JXNEZKRGYxZlk0V1g4WU9BeFRrczNjZEFmK0E3dDVRLzE0MkpKazRWaEh4aWJKZUg5czVUQTVIbmUyM20zTlltWHh6NUI3RHB2eFA2QTRoV1pRQ0NqYXVuMDRxM3ZmMGYrcVJneTdRVVZURUs1NUJjaElaYUxiS2ZZWEE5azI0enNTT2tHNjc4d0EyK3p1VjF3ZE9rckJZMEdVSEt5OXdXb3JpM1NlcjJZSlo3RlFYcm9HTzl4amJjMXk4dE5zemg5ZzZGR29ieW9ObmU3SnU0QlNkbFVzNTY2MWtTakc3MHF0dG42SmcyeEpTdXJjeDBPVXhSdU1uVTBLQysvSUM2OVgvcElxaFQ3VENPQW04TUt4dDJpaUZjVThNTHlXeGJaMHBRaEJlZlpvM2JUVEJPVENhOUFpWE40L3dnM21HTWp2Z2hacVl3TERQS1djcitCRHRhZXgxTE5zR0EvWDNWbzlOdGhNdjVGMHZTYXVUVnNkVlBjM2JQWnpkZWU3YjNFZTRGcTVrUW9ET3JaNlpGT1RpRy9DSFl1UjJlMnJLYTM4YTM4K0t2eGEvcmgzamNNaHVya1JCdFk1RVl1NWVnUS93dUpWSVRrNXpGQkxsYnJJR21ZTXRmMWltV2ZxUGpmSHMyY1ptK2Z1bEJZeUV4ME5pWEtBTktvc1lKUUI3L3ZzQ1pvdVhyTHZqaHdwc0duZXVqeGw1OGowMkJnWlRpZ256U2ZqcGJHWUNiS0J6c0pnN05jaEp5bHpyMS94VEhmcmlOajJvd0NEWGlLN0dWMzVYM3YxMlhTRHNIakxWZ2g5b29hT1RNR21iajN5RFlHVk1ZT1plNWpRMU9URkovNElhK2k1R1N5RS92bXFGZEZCV3JyQU92bVdSSEQvWndyZG5PMnpFY0JYL0dFbXBMQzRiV1ZoTUUxZmZSME94WkNXM3FPQTJIK3hTb1Noc2Z5QlFqU0phREFsUVErbzRZVHBrK2dPM29Ia1RwN2VpUWRKdW8wTlFVOXh6THJwdzJ5RDJyZVdGVUtPRWhUd2RNQmpReDdpL3RLcytMU2lkTElBYXZDclF5VVI4SWdUK0gzZ29QZldZY2wycmxKQWIzYmhnRG44bnF2a25vOVZsdHpTKzZkbVJkRmxCZUF2c3BhaXpLWDg4RlhjOVkxcld6Y2ptUWJnUmZ3S2dEM0xPcHR0MEg5ejZUajlsOXZmV01jZHNaanhEQ0FXSURFTHJwRFREMjA0d0lEWXFyR0lCb1gzcTFmbXZmVU5rME96UWU4K2wyWkppOWwvZDEzNm5Qc2ZSS0JSMmoxVzlzdy93QklRYk9OcEFIR2xqZG9HVHZ6VGRUMFNjTGlYM1JzY0dOSzZ2MWpnU09EOVo2MzVmalBiVFJQN2MxMnhaVHduVktzSjVVdGwrR09WMytaMkZBYURjMWpOQ1dtenQyRkZucloyUHYwYVZTVHRvVmx5S0h2b2RUL1h6WHdmcVc4RUxXYjJTcWJpSVFJZ1Azc0VvN1hWU0JoWnNZZXd1cUxxZ3VVNEFOR1MzTnFmZFZoMzFxY3VVTmJVRTdGcGI4RnVZSkFvSjQ1TDZJL2tpWDR1OTFJK0N1VW5PWFdhK3ViY3cvVC9hZkVadGpudHBCV1gvc0xmWG9oeWpDZ1dkOXEwMzVQUFN1dGV6WGNjaGMya1cybTUraW1FU1NnbVl5ZWNUVmJEdTNCZVIxNkNjRjdNL2ZaRTNpc1ExckJkK2pEV2RQaUVML3NRdzM5Zmx0RTFQMk1KZnJhUDFxRS9yYVAyTUQvVm5SOWllVDZpKysyMHV2dnZ2N2RYUGZmZlFERzB5Q2k5MmNmMXh4cGZweHNYL0RSTU5lNlhVU2wrcS9waG9HQVh3cXgwNVhmNS9ieHMzTUlBMVlmMzRFOTIwWXYreXNySUZmblpWNGsyQndFc0tNbXFpNDBvSVdxQnljeTlLNzJyZmtDOGtlTkkrTTFnakIzdkxKc0lKN0NkUEpuem40YTVzbmtGdXExbkZoLzdhbEp1cG1HVFlSSjVWaDdBVHVFQUFsNzhNd25DMVkzQngvSk9ReHMzcVpGVGdMQkxmQXBkOUdNaVNQZElRckxzZzZBRVZJTHVlcDNQS2tGd0p6QXFmRk9oczRvdVBvQ3hwdnhGbUgvQjF1K1hiV0FpRHNNdXhLZnlIdkxGNE8xUng0aHg2dVlyTDFRbUNPSjRFNW5IVU1UNVRqUWdqSks4eFhLait1elVTV0NlaDRXY3k2YkVBYnVHRWRqbmNZNDQ4ZU5EYWE0OThEeHhGTWRlN1pzOThvb1BUa0ZJSDY2MzFUR0VPc2VHQXkyZzNIMlBkNWJvWTEzUHI5akZHS2FPUE9QQjlnWXRPaHpCV01kWm9HUk9RWE0yMVphL3N6VzNLRDVIOHZJUlE1RHlCUTFTeEFUSHlGa0FYMjZLbnovRWhiUzY3ZFVoN0tnRi94NVp0V3paVkJubnpoSURNVWZYcSs3UWhYaDZabFJrR3pRdnRaMFRFeHVNSjdGK2NlTkZOaUMvYnVXbzkzOU1LdC8wd2pGOFh5Um9RREt1TXcxemkwVy9PbHNpaktyeGY4OUFiY3dZMkdQQk5XNXNKbU52TEhpTGRUTGlnV3dRdVBxRDhWeEJOeitlT0xzTWFldUJkZ3k4VzJLbDBLRmZQUXV0S0Fob1JwUkFqMStldkRTWVBLTU0zazRvTkFmajJCcGozc1VEdVNhdmdHNjNEMDkydDl5c05zaVFxZXMzUTYzc0IzR0VzTlZUTXdpUUhMaE9ZVmZwM1dwVGo3bi9zZWg3NlpTeXNXbkRLMmxuOGN1dm13TjUvNXFOQ0U1ZDN0ZUgzNjZOdmd4NllSNHVJei9HRHIraC8ycFBZaVRSMHZBejB6K0FCSEMzRVhVTSs4dVRuZ3hEWkVsWVNUeFJrYjNNY2dPbVlnZU5wTjhSN1NvNWlDczl2dDFxRnZYaW9ZSjV3ZzRTbk5aMDNtS0NSWXRIaTZHa250K09iZE92dGRNRDVWZ28xbWtiUmNNdjhLWHBDOG56d2U0ZGJZdklYU1FaSjIrTERDc200L3VpQ011NktoODhiMzlvZ1lkdmY2V3I5Ung3MjFBTm1KTTFyZVcxOVg2M2g3ckp1d2J0cWk0dCtnRHpIUk1CQXRSN0g5V3VEaGIyUGpQNkE5QUFvd3Z4cmY4NjJiaGhzSS9Yc2wyOGRrVGU4cCsvWXNNMnZvSGh1NlJUWUFGNzYyb0lWSkI5M3E4UXUrK0NEMGw2SkRIVnp6ZDl1YkIyTG1tV1B6WWNEYUI3UnVJT3MreUdMSWZQQnV1MElZV3Fna2lhQ1U3U29hclZLeUppSmZZQjd4K053Ym1Uc25RV0FZQVZpRU5LVnFRU1M2TWxLSTlmRmUyN3pKR3grL2pEV0dIYitrVFpzWDNXSWluRmUxV0E0TlNkeTZRZWs5Q2p3UFY5ZEFDVkdWQ25wQjBtNThwY0FZK0RoNVJmOGliUHZqdkgwSEwyZExMS2hsTTFxV2greTRlUlpRSWVhbmZTVFIwbVV3bXVkcTl5NzFScTlLTWxaajVMa3NyUWgzV2FmRitpSFllcHZ6dUsrRFVxckRvb0ZXWUFvaDJVa0NxOExkWjlNdi9VNElHa0R2Y1JVcUtYVG1lYWtLYnU4SjgyOExUQUJJbmZ0aWtNeTNJSW5yOXNJQWUxWFY0ZDBPWC9BYmt3RXZRUVlFOUIyYmVvWVp4Q2lWTHR4cHU3cFN5Tk1GTVNkdDQvUm8vb2NYTTJRRm9WL1BxVjBUL0JXaFdXNFN1b1NTd3Jkcy9JbklObHlKbFJoZ1RQemk1c3ZJNGhFNnpSNlh2UjhXSEpIT0wvaHg1VTNFVXJiNC9ZZy9LUzdxLzA5QnBNQ1NvTit2WmZiWUpzZHMrVkRJVjBRajczUFlaMzAxWGVRdGN4MVdpcHdPOHo5Uk5vaGhjdU9PbCtWcTRHOHg1L2VlU1FRYWpvSkVHNmE2OG54dUdjOExWdFFLTHJGRTVZeGthZXB2S1hvWm9iaW8xRk9zM3Q5Vk1Wdy9maXZZbmdkL2toSE9hZytsSElrcEkxaS9tMGJraUZNSWN6ZWVsaXhUd05MYzlSZ3U5aDdIZFMxa1BrdWFnUWF1cnlmOFppSkhMcERMQVhqZWRNamMzWHJsMEYreHJIRW0rU09TWDR3WnZpTEEva3Avd0U5UXFXOWxTOWVhZVBDczlMdytEWklpeTdVRjM0cTAxRDQ1OFA1L1ZrZXl3anJtZmltVWNrNXNlRjJLSkFMMFlvemU1UVdkUCtiUWNjSzZCd2JzS3FwSjZpVUZBQk9DU3RQMXliOUk3cGp4TDAyeExhclFPbzQrYVFjTVJ2alNOMDFaRURiRkFHMUhrUlppK2RUbDliUUhyb2w2UlFUbk1IM2xoUEE0NzZuUnAzZjd0Umc4OFZJQ0dpWXpzeThPOUplZUJPeHhTS0VYNE43T0V4ZFlkd0JMOUNoZnRlL0J1dHVnZ3ZCR2dxV1E2SnA2UmEyYTFBbXp0QjM3bDlpYm1DWUUwa1VwSU1OT29OcVJMS3pvUkV4MlhnMUhjd1NUZUpPaUEveFMraWVCK2gySVMranphV0kzWnZqQXNYbzEzR2JRRHBpN1Yvd2ZKQ3dJL1czOGNOdEVTdWFFV2MvaUh2UHBnY055RnBUN1hmQXlhM3FOY2RHRlorZm5TWitpNk5rSWhlV2FmcHFiMnBpSi83eXBSRWxBdnBta0x2dkpEcXRQSzRLa3ZqZFR6LzF1UHIwSTN0TlBYcFVlK2V1SWZ4M2V4TFQxSklpN3Z0dzdQbHJlT1hwRk1hNkhKN2ZpbWpDeUlqcisyYkw0M0J5ZVNjTHVhY2FMbnJSWkFIc2Y4emd6bWxnWUVVRHU5bmlFdzFpUDRtWjZyWW84UGxuVVBIWUcvRTg4K3ZvbDY1TUtkR1BOMHVVREdkMWtHN2F0M3lncDV0N2Noa1Y5TVhYV1pLVDBUZ2JyL0ZJdW9HNVZVV0RHb05tWnBQd3V5eFRpeERKK3o1Q3dwNnNKS1VUeXJ1RlFUbEZVOUJBcnBaL29BcjNTd3lEWWF5bFp4citnazdDSG1BNml3RmQ4dXVNS3pIeFFrZkh0dk5RSElZZEtLVnBmU2QwcGk4cUo1eUdlbVJVVm1YdkxUZzErZHZsYjdCeE0rSDlIb0tVcmlSZUxVSXdsZ0hiVHJ2dE9yeXNXdXZIMmNsK0ZaV1drV1ZDRzhseWEweWRoMklsK2Q3eGRqcDVXMy9VVlNValV1bDhnNXMzS2NvS3dzMjd4bTBnUElEY01ERXBSM1dNUmFKR0ZRbzZDaXgxT3JJcnUzM241dzZ2ek9jdUpFUm11MHEvVWFrRzE4L2x5bXlNQXAyT0lPMHZIVWYvcVdUTEdMNy9yRGIyMW1Sd2VPNjlDc0xzTVdhNzlaMFFBeUduaU9laVJXajFlcHV0Qmg5U05sTlZwblhUb0lWWHJHc0FMQ1ZITGw1NmJmd2Y2K0xMbUlQdW41YXBLR1BPTXgxS0h2eURiYVdaSkQ4bmMwWm1UQkNzd0xCYjVwQWY0VS9pZWJucnZVekp6TjZtSnJxTk9PNTJGRUVyUGsya2hHQm0wQXYwSWhrRjZFa21Ndit2bmRFSlo4dnhKWDNBUmtKazR1MXhPWXlmOHRRb3NJa0pOWXhTZlhxM29iOWFZOXYwb3dOR0FNdHBXejBmdzl5Y0c3Yk1GL0JBV1JIWlZyWGdDY01FWFZ2TU1reVVmQW51R2NZVmE2VVlYbHdlekdsTHJSaVZwK3J2aXlhZUNHMjU0eUR6WnEveStkZThXOU9PSEh0c1Y4Y0dpNmR4Mjd3QldEUmtvRU41TFFjWnMxelBEalNQcDRCdmJKcFVvMUdSVGNUZVhYTGs0NUliV3lwMWZlL2tVRlliemhDRWNKQXNkbXJVS3JpRE9xOEJHMTkza1pQa0ZmVHBxM0dRckxzU0JwTGJVT1FEbVUrMG1lakh5MXg5K29FNC8rRWQyRXdtb3FBSkd1RE9yMGJWTERUc0IvQ3gwdW5OSFhObGRIeG5obThOa2Y0MDJCQ3ZFekU2MWpiRHpOSFR3UmViMUkyajRJMUFrcTA4ZGNEN0xyY2d2NEIva09udmxJWWNWcHUzMU1jb2dwRmNqMnBXUjB4SlI3MzM4cnZKQ0lvdVZIUHNta0U5ZWxxbFlRdytKRng1THZMMEN5UU5KZFA3bmV5N3g1cERqVXp3dmtWVFFNZCtIM1Zub1V0Q0s0Yk0zZXlSdmw5bUNxNUxZUGV0QUNBcWhqNUxyQlNtNzQvZmtoUmx1NkFneDJJOEFBTldpSXBkY3dsT2hiOXRkeTlYSldBM1pUVDNOSkowcXBGVVZwVEx0K00zTE9GaUlha1loWks2bnlUVWhyM1pJajA0ME9ickptNWo0UzRCRFlRbmpxWFBxbEc1bGFyeE10WVAyWXVaQmRoQmhlWWRsNk1WS01WeXlZd3FNK0h5VGQxVjlscjFGTjVVWklzWWI3djJXenFRQXR4L2tYUTlzUzgzQmZYRHdkMWQyM29XWmRud3A1YmlKZGt6a25GNXNUOUhtQkh3WlRjR1F4d1N0aURxOGEycExkOGRHeUkvTEMrTDBSMnB5WEV1THRDZURxc3gyejRJZXhjYzVpOGJYRWo5OGdWMnFxVXVWWmRuZWtmK1M0dXV1eEFoMHNORy9QWUJMeGZZMmRUcHg1VldJWjVuTkZOTitvWHppSFBzWmJ2d05ndnJySWxCZWtHQmpjWWF6VEh5U0k4VVNudE5RZm1tbm9jWTRPdjh6QmQvSkQrcDk3NENHQWRmSnFzaHlSZ2RkMWh3WlhIaFp3RWdNK1NhK3BJcExDdEg0bkhuOTJLbW1CakhTclgwRjdOdmRvTVRxdmZGZ1FxeFNyVDBzWTVHWEFrNm1YaGZIUnZFdTlMblNzeWt5RlFadmpyVFVBdGVTSzFnYXNLVS9ZNmozeTRrWDFVS2ZoSzdDcTN6MW8ySUREcnVLYnZmUFl6WWVBN3JKQmZwTGVvOVdFNG4vNFV5MGdUR2F4UXAxSjZiWG9vS0Iwc1lqdWRCRWJlNWlqNkFERG9lcm9pNkxkZ29TRyt5OG5mQUJuYnR6ZzBRZnhSa2x0YXhSNDlOK0ROeW9ndjQ0YTZEMmNRZGhLbElRUUZhcEtENml4THRYb2ZGZmw1M2tFZjgrNW5VOU04R1ErQWlqS0dpN0NYY1BhTG1GbENuMlB4MVFOUTE1a29LUm9CL0E1Q3lyM3VJMFdQQWUwQ1dwaTRVQXBkZGJCbDVaTUtzUk5HVFAxQXY4SjZkOXpnRkQySjk4eFJpUHFJWk1IakpqZVMzTEpsMFlGNTRXSE9PYStUeitqTEwxTHRaRmR2c2MrRDZSaS80S3F4VklHQUI2TWJZRFRVbGpnU2J1d2pxVHFBN3Q5ZUhDbzROTlgzVWdBNkYzN1JobjdOSHZ6VjBMZzhXbGZ6bHFlc0ZvekpMd0ZRWVF5eUY0SjNuWndON2t2S1dEVGYvcndWSmJlWFpJNCt4MUErZWRKRUJQZTVHTldsbFZOb2dZL2lDMzJhQU1malI2S2gxQytFSlQzZWJRajZpdGYvQVpvR3NrZk5SdlZLTGQrZk5uYjRYb2FzNzhRbTRGTktKUWtPNi95UDc5Z3FDRjVoaEV3OSs4eE5idUdWbmNrSlNpbWJNdGZiaWNTWUJVRkdudytNQmNWazFvbTdLc2dEaDZLT01LT1hFNSt0OHNYLzNPMEZnbEcxbXBjOHIrQjdsUS9Nemg1Uisrc1prSXRGNmtqUFQrZHdtczhjU2hkV2xGeU5rRWlzZUdScmlIbEM4ekRsekNIblNEZm1Gbk5MaWVnR2t1anVTWm9iN0pvWTd4K3F3Yi9hUkRnZVNEQVcxWVpveFcxTEUvZWoyTm9ReG1UNXpUSElGY1ZyeVlHOW05azR5QXh4NUsvYlgyS3Jzak01V3BZdjBCSTI0RnJsWVprR2xUbHpYYU5QVTlmY3ZrOWNFTVRSWEptSCs1THRMaFk4UUllNmFGY3NvalZGZ25DdEdJRk5rNEZkVzFzd1VieE5vUUlWQ3cxU056OTUydysyVk1qb3kwRzVJUHF2TmlSNHlQL2Y0Q1JkYkt3OEtISDRManJBejlZT0tpVDloa3BFR2xRUXVmM2o3SjcyS2VSYTQrZ1c3T1RKTEJIQnhwSVZGWkYyK0lCZUhjKzNwWlA5VHBmYUY4QzVheHpDNVVaLzFlR2xDZTMrTTdrc01hdVFiekNvRUtDcXNpKzFnSjhoMng1VHAzNFVVV1hNdGVEbnJtTHVJaVVnV2xjZmZVUVA5K3E0c04reGxZajZicE1RcXE4Q1hoYzVZU2twdDIyTm02Y1UxbldsaEFPS0JraTVOTm9sN1JZNkNTVXRuV281UjRjNlpLU0NPbXVqZkVIemxWUytTVXFwWkVDK1FiNGoybUVwaTJ0V0ZDSXZnaWtmaDM1eXNmNlRYYjZDNlZqR2oxTExVZDdyRW5MYjZES2ZsM2NEbjJXalRHNGpDVWdDQnJMR1BKWEJjWTUrMGl5SHE3YUJ6TFVUODdEbXFuMFgyQW1Nak9Nby83cksvekhrNWRieUhZZ2EwRXNlRUl0WWdXa053Q09JOUIzZi9VcmFBVDFDVXhwMjBQNmk0TmNCQUNLcFdPUGNOeGVXOUNDc1BvZU1UTWxhS1IxTEJ0YzltZW04bUpNL3N4OEVrU3YrdGdFUDlkcy9ta2VIdTAzQzlKKzJyNmlySGhrV0JBaHQ2WmF5SU1GVXV6MDgraTVWRENZeVZoTVNVcGp4SFZZQUo2YUFGTVpjWU93eU14djNNZy9hVS9TbXo0cWx3S3A1YWxndmJDTkJqYmxDS0tuY0JLL1BDUHNlTDVsbjVFb3R5SnFZbUJHakR4cEp5TStGbE92M0RiWDJyY2NIeG9PZVhRVlZQTWJIb2E3SXB4M1ZpcW1nWUhMT2lFZ2h1UW13bjZ3bHA2bVU2bWRWdjE2cTRDYTB5R1dIL0pGTFhWSzJRWW0yNThzdUppRk9LWHIzVDI1eVU4dVpNSjVtbWh1QkN3MExjUFZBM1p4ODB4Vmc5OHJXeFlQT1dLRWlXL0NWY2dHbVB0VEExeTAxeGszcGxNTU9HOXdWT2xJNm1LempDYVFDVGxaMjFlWnZmUlpCcVVFNGRFb1JuRmxEaFZiWjNjZmdybE5MV0VVSVFFUjg0Szl2YlpqM2NPWi95L01YSXRnTVpIV0R0NjVYSmhFb29PNTFQeUt6WmEvaEIrSlJ1NFNEM3FlbDVZdEg4QXp3RVNDaW9nUFlQbXRDVU9naWs3VWNWVmd2YXd0cStaTW00M2hXS3F6KzRRUExQOHFVVG1oZjJRNmtmODA0c0VoZ1BXakdOc2lBMzFaY1hKNEhPT29tTC9hRmNZMnJYeFY0WDJHMWxNL1RNYmJwSGNNTTF3QkxpVzNhOG5rOWh1bFRDYW1KS3JzeXVTRzE3MWRNT3JNK2JPRlRZd1FDY2hsdFBRR3E4ZjUwOEtwanE2R3JRdENrbjg5QldHOHBtZlBBRW1xQkZtRTVkM2U4b3BJSGo5OXBYamFxdlNKd1QyT3d4ZHR2MG1FdmFSYlkwUGcvdEk1Q3lRL0xQSTE1SmUyczVkNHpYYi9kNkpXT2VCVVJ0V2tBck1FVDBWLzdhR3lnaWVBbkx5WUora2l1aVZVUzhxNFdHS1lGRWRzL2N0TkdTZDdKS3lRL1FZd0ZGQ01sejlYL05OdWs0WnRYSUpsR29RWVQwc0ZWQTRNTy9odjhwV1pQb0I5MG5LVnRQS0plMGxUd0ZVVWE2RzY3WkRMU3NNeGJMa1NMQkl4dEk0ZExKZVZPbVVGdEU1MjZGWG4zU0c5ejNmNkN4ZEFUU1NITGRiY1lkaE85SGhoMXU1alo5QkJwYlZlMFQ4ZzBDNzNnaWxacHU0YkkvMk1waU9wSzMraUdWckZIRnYxVm1xaDJoZlBTTGpyQWhaZ2dMR3lDWUtJTXdKejNkWUNQWWpDZVJIaW84Mll3UmZtNUZuT3IzTUdJWjlwUmwvekl1dHNuZEZ0YWs0bkNQdHlFbXNjaFdLQy9sbDFGbjBaRWxhb3dWcVJBQi9WMXJYUkM4Tk9kU0UrTGlnSWJSSnI0L0xZU21ET01hYmtOY0EwZGVCbjBJY0Q0aEN6UzZ3bGtFbm9tSnNBSk9pZjZhUUh4RDJRaXNBbGEvNDB5UFlDVHNkRVV0SEtWTG8vSW9lcUVtWHVBSldpMmU2U2Nlb1c5SHlGV3g3c1RYYWk4WW9yNU84QTVzcGgwWGxtZml3K0dpeFErV28ydkJiZWVNSlpsYVVpOVRzSHdESEx1YmpaL0FOcS9yTE9aMlhVSnpQTkEwZjkwb0R2TVBqaEFRNGxvZGpMNW5VR0FHZ3QyUmlWTkp0VVZQSVFJT0FWNG1sd0M1V0lxeWZMYUFQOWR4b3krVUM1bEhMbHlUKy9SRW54WXlBYm5aa1hwazh2dkQ5UUQrRkZiRDQ2TFZpdE1xb2pRVmFTYUp1SDNKVitEb3BQeWZGVWRBMXZXblIydGdhY0VGRjNMaVZHL1hWeHU3Y3hLaXcvTFFJRHlJSWNkeWdhS01MYUNpdXVUYkFJclNLSE9kYzZXZ1piSTNOaVJPRnJucjUydDdTcElsSEFvcHBmSVQyREl2RHZKVUpHeTZWRTIyWHlSVzlVSGVwRUk3b1dpeWs5N2FBMytlMkdFT2svUVRxRUxsNUZyRndBbHVqeWZMbVNGeU9BZHpNTlM5MC85NWh3VFJ6RWgxbHhUL3h4ZUpQb3c5WkI1MGo0QjN6aUhzSmlJRGFvVThLZjQ0YlRTc0p2bGdyS1FaQnJIMlB3MHNWNkV2UHdWR3JCZzMzTmZKZ2h1aWplSGo4VVZuMEFnZjJQVEpsMDczbW5TNGtXYjVDKy9zQ2Rxd0V6dFZYaDVIbHFkVUdwbDhmSWNhb2RnRHM5N2ZDZ0R0bFBoMGxIRzZSSmdCaVdSV0Z1RnFHZTBBa2NjZDRDem10d1Ztemh1a1dwdEZ5clBvRTJEVmRHdVJLbWlGY2VOVVhOMTI0UzhxS2lHSDFiSkJvcUlJOFQxYUpVbnNDbWdnamFkOHlhZkYrMHBHUmV6VUgwY202OFBlK011NHVzVnNEbG5GYmF1VE5rWEl6MkhDdDcyaWpqWUpmRmh6emo3ZFV0aEFnTEUva2RKMU5uK1diUEdOajZBMnN1UFg3SW1iRnBKVWVoQzNDek5tSlpNbWYvV1J6blV4cTI1bmNxRzFJejQrcmhndkhUcU1ydzJZN201TVc0UnpHdGZpODI2UlowOWRGMU9NaUdlb0ZxRjNjZFpMd2NsR0dTV0lUL0dsb01JRnJKOTMvSzVJRC9Xc3NBNFFoa3FoQnV1dk1sV3ljRXhwNU0rRkNBSThzZTFaQ3h2RW5WZm8ySFMxYndQS1lNM3F2T2JWUnBSd3Jta29rNUR3RXhsUWFRRWR6dEp6ZTVCZDhwNVcwaVhLTWc4WWZwZ0FNSFMxYzZSVXJndWt3MEg1SnJKRFF3Y1VOMWhuOTN0cmdzb2hKdTEwdTNnYXNkUkdSTHNTU20rdWNtalNNdGhTT2FSTEh2MWd2dTJXOGVpVTFwOUZGaUpLckovdk1SOEthYlVWZmg0MUF4RlpEVWd4ZGs5cGhPbkNvVE4wZ3hPQTNLOFN0VUprLzBTL3Mwc0VldHVkQlBDdzBlTkNLbkdLcHBhTlVYejUzWHk5K3VqNi9QZkNlREpucWVUUVRrV2VBNjEvaEE1M1g1akVZZmtBMHpSMm1Cb1ZvUWlMQmR6aXpaOTdHTVdrNnhrdWZsWVBUTUdiSngyd1NtbFllTXRsU0NIc2JvT1ltcXpHTHlPMTlnZFJ3NVBXREZrZ2QyQjlkS1ZiMitPWFBpaXlhRDRVV2hIdWM1SVh4OUFKTWkxWklZMnozZnEvYmZLbVo4ZlFwWmNqRk11MkdtWjVaUXhWM1UwWS92RHF2UjhmYVVOdElGUTFGYVFlRGRpSzlMM3hNWTROa2xvNnRpekUxMURFNXhvRnZnMUlnVUpBRUptSDZMb0ROZ210MS8wQURXYmYydlovSDBjaEtzWTBzZlRwMGdpcHRPK3lTMnlDcHFLd0xGVy85MUQ0Wi9uNUZqNHFVSUJpNmxvMko1UlU3YkpwaWZpSFlocm1JLzZDQ1RHSW9ZZGdGVk1rRVJOZHloNFVTM2Q4Ni9LV0NHMDNDemYvcFE3UU9adnNqWUdwSE52L1VwRm95bHJjV1paREtlZDdsbWpndkpQNlZUYWZ3NVZ0a1JsN1JEcEwyTFhCZ3BtOGs1QTB2Nk9VanJqYWVHcFJmd0FnM29NKzJWdVh6VnJxbkFXYUUyUjBQZ3QwZXpzQWlLU2FDditLL2VhVzhkaXJCRmZSSnJzb2JKN1VYNGoyOURtdzVQdDMrMTFsckVuNkYrcDA5RWxpY01tSkt1WmtXdzJyZzBZeGJOQklqWUQyV3BvZ0R1Y1FTM1p1VW1NUmd6QkRSbFF2SE1WdkllRitaMHFWRXVTTldNYjJrbllZcjRJa3lIRm9ielpTUGQyZFhyaGdoa05DUGxCYTcyMUl0cGlNaGZBd04rR25SdnBzZ1YwSmdWUkYrNVhNTHA2eThxZzVpL3h2TW94MFlodlVWODdWTXl4QmtZc3NRUXRPdTNCOWg3UGM2ZzRnN1lnZjV3OEx4T2Q2Z1h4dlM4enBXbkZwbXY0VERLbXVCS2l3ZzFzM2FzNzcxWStIb09mdzZrb1FTVWVSYkVWdklPWHNQeFllNS9nR2JSeHkxcXp2clFBOHhVU0lUVGxhNCtlWkUyaGZLTjNHK0Q0Z28zaVQzMVh0ZGxmbHJKUkxnVjdyaURXQU5UU1p2eSsvQXE2bkVsZUFrVXNUMU5Idzh6T2o5VGNNdzFodVRIU3diNm1IV3ppOE0vZ0VtQ3Q4alZmL1NSelZXSEQzQmJLQWp5VGJRTGpNSllGbmRkVzBYMEFrTGhUVTRMWmxWUktYZHRmd0xFVEVxaC9KS1BySW4xMk44N3dVMzNjVUFGTUh5UHN3cVVrMDBlZStNNUQ5cjVkQTY4YzNIZE1OZmY3OExtbTJLenB4WVFJSi9XKzBqVmREak4yZHV2dlEwR1AySkZmMUtYby9wS3dqS29zSWw2NzUrY2dlVjMxOVRtWUVhTW9NQmsxZUk3bjBHd1Y2c3NXWkI2SEhrM3V1WkxyN243VUFlbWFjNlAwZzFmQmxleHlDdkg0SytReUx0SUpVK0xsandXR0JqT1BvaElybmJTUlpGZWphRTViTWhMczI5OGxSZGdOaHh3cTZod29qbXVFakFoYUQzb1NrdERWQW9PS1k1ZDkrYVBxNVVwL0pmTEtGY0xTeXNDY05HMlJMd29naHNTeFc2aUhHc2dObVlIY0VRTFl4THJSZU14WU0rbVRQZk4yazhEU2RSSUxSM3ZCWFBGNHFZZEczTGFlLzh0b0VPbVhKd0ZGQjBNTDAwcHNWanlUdlYvOHk1Q051WFZlQnJRNjNhelprT2lQMkY1dFloWVZPZUU4QzVvcGJNdHAxSzlXVE4zbUF3RUgyaWF1NlZnQTR0R3Q5R2JyaElpSHZwbGlIeEd2aXJESWhKV0MrdUlOWnFORlMxNVA0dGVib01KcS9LMmJNa09IUWROU0hoaG95YjlUbHdldDJVeXRWbkd0eWtnNDdOR2NwMEpNSWx3Si9GRnFGOEpCYkdDcG9VdFVsMTZSOVEyem1WMWZUVWMwOCtKd3dtNm9zTFovemNXRnVuWlNRaDNEcTZSZ2RqUWlnSHFYQ2pldnNyVThRWjljWTJGWmtsK1g4R0VTRGUvTktDVE02MXhpZU9rVytxZitMbktUTk16NWxGK1E5bHdGMUw0VXFibFBacnRtaWs5cTlVZHpTa2M4R1hRRnRaUjd6UzBDd2tYbTU5S0wwcG1lVTNWQjdjbENvM01VbWN1OGpKUkZxcU4vZGZ2YnZQRnpFVk1WZUNIdDl5c0ttSGRvalprbVFhV1JuSWluYmorYUs5ZFR5TUFSNEg5Nno1MTRPdXd1bHJWUGJuS0F2TzdLRDU0ZXJkUUpEekluU0tZMjhwVTZNdTVJNC8zbk1VSU9wcURONjBDN3JHb2xzeU1zQlFlMEtDMmh6U1pGSHJLN05VdVlvVUZ1Z1JoWkxaSThDWG02cm1OSk10S1FqZHZkOHNDVU9QT1pVY0MyTVk3OVNqTGNxT2F6NFY3eWg1TnpFeEFvRDBZZUZQdmlZWXVCNjIzdEZWYVN0MkJ0WTRaalhpamNKMGFuZlYrQVpMeXM1ckEyM216Q1ZDTmN5V2hiQ1BxVU93bzJGcW5ZUlhtWEJZZG9zSEtLZGRrckZYL0dqMG1SSHBCNWpkR2pmeSszdVRScW9TTnZTbXh1cEVLUDltMTkwNVFUcWJUNmxxQkRwS3k4WTdzTFY4eDB3SEVpQUJsTTVYR2VOeUlWc0xlcW9RZU9ZOUFheG1mdnQ5Sm1NVFR4MlBpSGVzemdSc0VwOTNqR0VRYjFhMjZscUlxOFA4SkIwUmd2MmpYdFd1aGFyVmlRaE1CQ1Z3ZFJPZ3NpTTVLQ21GbFRIT1RZaVU5eVp0Y01SbGdESVQ3eFlpaU4zYkFUSDVyMkpZdjNpWlpGNG9aN3duSEtIdm1ZV1hTU3VhS1NDTExFaGNybk96OXZpaHZVRFFrUVUzNEtULzQvMFczSFZzRCtHNG1tbkZrejFwL2QvZy9oTUlXSzhzWWowR3Fma0F5MXNFUUY2enFNV3ljV2RQVkN4aWxsbS8rSWFQTmhMOGtSbTFLL2xkTnRtVHh1Q0EwcUIzS0VKQ1dEU0lBeit2UHhqMUZITzZmNTQyTUlodWxWRUdoSEhVSEd6UGd5VjBHMzBxdjNGZUlxVU1FTGR5eXd6UURqV2F0cXFEbzQzRmJwai9JNmJLVk9QeHQxQ0p5VEF5MVB1WFdMNzdLeXVLWlFjYU9nTWhEYWFTL212T1gyVi9peEZDUWFLcmUrM0Q1RVN6VFFaRWZIbzFXZjhZR3lQYU5KVW1jOWt2bmtpOFAzMFUwdzlWOVVMOThzUHR0T0x2TkFaaTkwNy8yTW1yc2ZVZDZtZUJhMm15U0VaQUYrQ1FMTk96ZEFUc09vdDBDdWpnSTFkZWVzRGpwa0Y5RnRrMmhRZ1JxYnVkeEZPdWZsUWtteC9rRHRJbDk3dUo0bXJ1bkhLR1lxQXNSWnRSY3JjTWxxNVVQbnZwcjVHTmUwQmlCVTg5M2JqSXFUQzdXUWtBcWZiSmM5WTFrcHRPZkZ4ZjVVcUhUSjJBUVpqazRQaU95a2JYcmltbm1KN0dqbHl1OE1vN0pScVh0SG1kTTVva0c3bDlUbmY1UGN6UlYrNUprODl0azhQenp0SUMwbHVqdEhHZS9FOEtPbEZpTkQzR1Z3djg5RWJvQ2hZR2hRdFMxYmoxYWdiRjdpUXRPZHpUbHRRRWcvbklMbHhYZUlFeVN6SGNsek5DeUM5b3M1LzZQMWJsOXBDT2hlSVhZbGNoZW5IWVY1L0ZFN3M4TWVpcUw4a0JySkI5M05BMXNGS3BBaDNzTjhzaWlxNlF5Tk0zTzBoU0RzRUxOS0tjeUN4TXVydWMrcStBSXhhc1p1WVg4SnBYNTluTXJxNDczUlhxdFN0VGptR1E1VWhmekRzNWJTSzVVNTdYWXRxYW5sV3ZmZmhCT0h1ZVJwNXVVOWh0M2FEN0twM1VwWEk1SnB3OXJBRFlMeEhBbitRS2htOCtIZVp3UFQwMm14ZnFiQUUyNktZMlk5OVI2M2pET3lzU1BPSjZHOGlXMDR6VHYxcVJHKzBiREdpZnRQOTlMaHhod2xLVE80Z3Z4NmViTXplanhFT1NpdlVERTNpdzBiQkJYaTNiMi9JZkd2cjhmYlZjSGcvWUZUTUU2SUF1RnJmaytvRHN1QVRTM2UvQ2JDSk1ZeTBpOXEzdTVOTmViUVpUYi9LKzV6VTZkZGtCWnpNWHozMVR6bUsyNC8wbktsMklxd2tFWFF2eXlwbmpoQzEwRVlCTENNYjZyeUVUdEV0aDhjZEVLVW91cjYyRnhKbE1xZGtFWGplZnRiYUlBSVJrSUtldXRQSmtuUHk1NnlRRGxjc3c3dTFmNzdRNUVIeEtGU3FIUW1TSTF5bmhpc1pqWXFTZTNMdzBtTVRpbUYzbWo1VDdhRkp1dUtuQVRVTm1oT1J0VktZUmIraXpTem5ZV1JrR1JGWEg3bnZ2YmZKUFc3b25UMzlxQmx5bFpkTmcySmtPYXc1cGs2OXQ2a1JxV1lYVzlnMHY1WVExTnRxY0VnMlZKRVd6NzE1ajZ4eERaMCtvN1RtWENWRllnUmhqL0tBSE1kejBhZGxBTW9VZzluaUcxWlEzMWx1SkRrRGxuSXdwYzNnSWxjQllQR3o3K1E2ZGc0WVBJc3Bzd3hDRG0vRjBhY3JMSDcrTTlUMlhub0RCWG9zNmdsakZSZnlGVVV1Y05tNzNiUjNEays4TTd3NEhsYndBRzZmNGdyVE5keGs4NlQzMXJWNVpabVJLZy9yWnJBTSttc3cydnVXYzNrQnhzaGVOdXlzNU9xaS9ENmJkeWpWWmYzeHY2VGRybVpKYmtnY05yRnZWZXJQbXZkMVlvbzRLVDdIdHhOSUhzbVpHWkxZdGJweGdTZ0dISnk2THk5a3lvQW9MR1hvRm1Iejl1Yi96eDRyK0dsRDBPRE9RaXBreGRhMDlrc0NmYzkreDF3U001Y01zNmZJdzVHMGZiUjFiRlJLMS9iU3FxN0dOSjJKdHFzMkIydjA0emd1U3VsSTlFbytnMHNQZFpLeHVoWlhZN3QrWU16b2tYZ3NhWlJEUFZ6SXAwNndiSllYL29lRVdUTXhlY084ZmxKdWl6Nm5LbnQ5SzZ6THgzT2dlYUhud3JLekZ4UHlhbEo5ZUFJSDRFM0ZYbGFtVHdrbDR2a1ZjZ3AvNGV3dHpRUlo4N2ZuWlp0MlozT2lROStQZlRIVEpvS0QrZmRETzByUTgrOGFVTy9ES1pmN1B5SENnbnNLbFVlRHN5SFVadFNMVTU5bXU5cXdhMjY5OFd3NWRRMkFvZStVb2cyYWFVL3VwV0lIUnJyZnNCSmRzS0U3cWZLTDA5V2tpaFAvQ1hRWmMyNHJTNndJUE5wcGhwTkp0MmhoU1UrTlV4aWRvNDlZWGh0ZHkyYkUxTW9vWHFCVzFiRzBTODlnNGx1eXlSRVB2YXMrZmJEMlZicTlrVVRKTlhSZkx2OEpKdDJRUzVqaS8vRVd2SDhmZXFvMVMrY0ZmTE1zZ01TNHpabWhoQVI1NmNZMGFJQ2dZQzluNGNsbXJOQytVSjA1eHBZN0M2NUlkclBaMWhSaWFXMzA0YkZnT05VNTJtS1R4QnhmWk5mVWRsRGxYVU5yaVdMekh5anEwWlBydW90aTMxQ2toMTNvby9vSy9RdUY0a0IrUDNpMmZxSVdybHJWb3Y0QkpoRDBxK0x0OUR2TkgyNDJJeHBQRlhST283VGxubWNlTFdDd2paQVBFUUlDMExCM0w5UklFT29oVVMzN3JWdFhhZjN3a2YwV3lHU1l5QnFmNEpMNTJqbHhQQmlDUjJSWjJuaU1aTDFRckhoVVpHQW5vTHhVREsxbFBNMEd5MFpJdUc4bVpia3ZOUUJQNnNzL0xUUzY3cFBIR2lOTU9hVGo0eFZadEVTQUx5OGN2ZUg5VnRWbjY2d3ZQQmpwU1hpMWdCa3pzM2lJVkxrSnRFU2JGVGhKNU4zOVhRc0dORG1DQWh3bFk2QzVjWXRhVnRaYWEyak9mZDFnRFVYdWJkWlpIbTFkMmxUOVl1ZWxqZ1JLSXphK1VJQ3FLMXl1c2hsT0kwMEpyVmhBdUJtWVJLSXVFMVYvNmRlYTY2WlVHR1Zad25pcVl6K2VEUitzRHl3VnFBYmtYTGhBempEalFGN0ROS3ZFd1MrWXN4TldDRy9ldklCaGVQaVpISHJDV1FPdzg4eE9DS092RzgzTExsUktySnR5S1l0ZkZmRGpMVnFVM0VyeU5lWEQwTlJncjNzS3lJM0liNTBLVko3SExHSEJsVVNzVU9NY3I0RG5ZbS9NcS9sTG1iUjR6WFVQTDNleDAwZWQ3cDAySjJNOGVFZXEvY21wNGJ3M1NIcUlnQWl1WE54QldnMzYzbkpXd3dkOHFRUmNqTW1aSlQvY2J0OVhqQWxYTTlhYlBhUlh6Z3NzKzdqeTdkKzk0UUpPNTlHRVVWYUxIMnNrSFVhNzRsd1RMNnliRGRVRlpBMDYxalBpeDFMUTI4c1RNK2NROFBZZWkzMGZIMisvRVFyL0k0U1VQU0pMSkZRazFrekJqSDUxNWtacFVFVXJ0bTRZdjd2Vit1MTkrVDhaS1NpWDdFdUttVis1OU96ZnpLMG0wSHNOcmZpM0ZhOWFVdkxFUG53M29zSzN4OWxJUEE1aVZoam9ISXI1LzNIQ0dUWGdzbDlrL0FoT241enJpd3RldURjdlhwZ0IyZElha0ZGT3MyTHIzUjlzc093cTY3dUx6cmd0SFNwWnFwWk85UTJEOFRSWU9ZN0huY1k4TDVXdFNNc1crTnhpZGRMSUpRdDExYnhKRThrZ1hCVGd3ajB0VTdLRzJhYVJUOTY4YTJvcmJMM2hXTXh2OFhtaFB5ZlZUSDE4cnV1QjlwcTUvOEpBczZ1WXBYUW9iYUIxOGhCZnJvODhsS3lpUVJ1ckRKcDZ2UGpjMzZjMUhVNERCMDdNZW5GZlpLazNCUDRPdGM5VU5wYlNvNzRNcnZ6MmlXakJuaDZEa0F0TFlKNjh4OEVUbURVZFBha3F4cnN1Q3RablR3KzhqZzhNTWx5Q0F1QlloeFRqZ1VNV2daYSsvaEI4MHRhZm5DMGFsQWFhNVNCci90bGlML0FweWxGbE10d0duMFdHSDczN3U0R1MrK09zS2dpZTB5TU50M0FwZmxRcDBJVDIyM2crTnZxOTl4NXhTVTZWR1lkUWk5WlFUYy9yVERkNEZNZW1CUDAvVXFnMG1wUGtteDBNejZOajhETjFUUmF0ejgrbmxORzZwZEJjMlVBUDhMU2x3bFBwNlBLYVo5Y0pkaWFQSDFLbno5MmdOd2hUekkxempkd2Y5cU5rMndtaDFPMVJ3RTQ5ZVZuVGFYZFJ4bmZhd1haU0tNcHdLM04zeVkzZ3hZamRleUhLQnJYUTk2bWRRUGFYbVN1WmtXRDFLckY2V3pTT3JYL1lTMm9JblpXZWcwVEJ4ZW5kS28xWDkvSHJUR0pUQWE1RnF1L05UTklUYXhRU2ZmVmNEaC8wTWdWR1dzZFhWRTNBV1lzYlVjQWQrWjJ3MkdhL1N5ZzM1bVA1aG9NZDFjb0s0Rm4rRS9qd3ZidEUzalUwSGdqUytnZFZhRXhPN05JdzFUdm5QNE8vay9TSWwxbm1RdWlpdEMvMkYvaytzMG5ib3dYcWljbmpsMHBvK0puSTQyM1RpdDFHQjVnZUhnTDVqU1g1eEEyKzhnQzV1QkdYY2Q4eEQxT3VwVlVFNmNsZmtLQXR4QWRMRDN6c1Nxazgwb3VhbzR5VTR2TkovbXZNbGVWOWllSThMYVBPcEltcFRJVUZ0UE14YmJuOHV6cnRKTW41RFNNcVJJSDJodi9yMkdhb3pwL3N3RXZrZVJlT3ZQTVJnayt4SG5mK1FXMXNMUWFCL1V3ZkpPbVV3MEVmN0pUcURvUUc3M0VoYTlBVVFXbHdHVG92Y2xXVE5FdVc1Y3psK2o1RTIzVTJtYUxUNmF0bjF3dEZtdW5RWnR6eGpyZnlCLzl4TE8xSUQ0UGlUWm0rc1R3UWhtbGtrbmJqN3k4K2hmSm5ZUm84b2VpL01HKzNyWVEwdlZsMW41VGo1VWpMMlZjeWtVazNsK1J0UW5RcjlYellEcHNiMmUyMlJGV3lJNWRURTR0VkRJK0RCbExCWDFhTjdUSVR4dTFFY001VlRzeGFSb3BDREg2WWRkbFFVTzlkZ0JVRTlvVjNySGJlYzNOWjlxN0VPeVBqZ1FwSWFGWlRzV09TZlFucmZwakdQanpGK3JxWlBQbzJFN3JUU1Z0UUhFWUcwWk9HdUd5OFZta0d5WDdka2hSZ0VUNytsL2Z2Ynh4KzVtQUYxSmtqSHN3b3pkcUtmczlqd2xMYWlCdnRBUmJpa2szbDhFTi8yYUJ2UEdEa3RyTnZvalYrTkgwQmQ0WUNqMTJ4alZGcEZva25uaTF2UlpzcDlSNG5PU2haZmRnb29nc2R0S0VVYVB0ak5pcFdMeEEwa21SUjd0V1VOeTJKYW9ORjRWcS95Q2hzNW8yTk1UYUVSUjZ0bElaVmticlY4Q0xtdm52b3VsNm5kVGlEdEdScEdveDBqOFJOYVByR3B6VmIwSVc0d29xb1JmdE5TMXNNOXI4aVc0WjRjVG16aEZkZXUyblcyRHJJS2F2Z0ZkR2xCUTNqdjVYdER3SWhCWkhXMUk4SjlyaXhoeld1SEtNMXJmRXY1TkExNTMvZUJIdWYyZ0QzNm5sMzFtRjk2WVA3dW9LNnFhQUFYODVFbzJURmgzOXFpK3FYcGxERVB6bG9VWDNvMkdyNDk1VjN5K2orTnFFa0JhOWx0bWxRd2piSWZ4ZnVwOXlyelEzUWg4bjEzbHU0WHZSa0VRNENFNWdQOVljbklsNS9VRUtQTS9KSk5YbDRUMjcxZXA3ZW1BSlI0WkdWajM1L0xEU0tLRWt5VnR3aVhXQmZsVlhWckxLeTBQVi9nNlVoanFmOElqU2U4OHJXYU1lSHhkOTBUQk1yV1VZWWhTVFNaVENhcTVxZHJsNHJFdHZTRCszMDMxOFlBTXhBeW5NcEdJQTlmQ1JDZXR3NzN4ZnhlRmd3cVRqaHJFRFNZdmdtc0lwb0JPRHMxZnQ0R2h1b3BDSURKckh2dnlZczZCRThXdDMxZDFGTHM0b3RHL3BwT2hubzk4eHNFY0FsUGkxT3ZCWFJPVEtud3krb0x5dFVHK2dFSG5NZEQ4blVSL1FIMC9kZUlUdFBQeGlMU0U1azI5OVJQMXhWdEsrdVJtZ1grUHFXV3pNbFRLZ3pEY2hVeHRnRDVNWk4yQUpkenpaTzAvVkhIUlV6eEZ2bEgvRVJTUzdwQ0tydjhGMzJnbzQ3N1dDc0hWY0ZKWlRIYWJrcDFqekhibWNIL202NURQMnFrUFJxM2lSOWdRZFB2ZWNuaDdlaDNxak4wei92Nk4yb0RRbzI1ckYyTHY0dUk0WER1clBaYWFBZFRqUUdoUnczdnhvK3dCcGJUc1l3eVkvQXVoTEFzcUxQZ3kzM0J6a1RNWW9zOWJPcjIveGJ6ekFlS1pnT2lHWkRBbVlYQkxKQ1h4eTdHK3JhQjg0dlFJTmJPdDJlSFF3M1F3bS9oOFNkaVcvMXI5eXJVcWROemZ1dDdER05JczlSN2Y1QWRmQUh4UGkwRTZxdE1wRE5lclhuSVFXZHY4RkFUT2dxM29SZ0VPWW5tV3FiWG5POFhuZ1lFeklDSVFpZGJRVmwxUnBBQlltc2t3OUd0M1gvUTVpMXJyS21XQ2VPZE94bVMrK0x5ZzYzc0gyQlJwYVlwSVpocnh0K3Qrd05Zc2p4bHZtdjhrUHdqQlNvTmdQSEtwaWJXUG5rR2ZYMytsM0g4WS9Ma0toVnVjZkpFWEk1UVdQbmJsalJKN3ZIM2dWTmZVb3p0S2xIU1F4NGJqSHJWbFRaa3lTc1pJNUFvRHhRVzF0SFByclA4TTlVZjJPcC8wcVRDVVFIUWJTQkRFRjlzcjBibVI0MzNFYzV2Nzl1TnBPeDdtV1Fwa2lxZFJlTTllbnpXWnQra25iRmFuSWk5cWcvaVlXTit5bjFwY3pUMThGUDQrUkt4Y1ZncjdMWnlrN01ZY3ZkUzJSZUZWdCtOZHFkelRDSGVSbXlIdXBvZVBzbXBNQkpqUS9OY1lUdExJZnVMR1FxTkFCTDRwWFVBVUVQZTMxU25XY0E4cjZKOGIrK0xUQ0U5eTY1bktQeDRDdzB3SElVemFGdEhLYlNlUVE0NzFqRlFRVmZJRmZUamNIei8yLzErSWx0ak5yTjhGVWRGaWIwNE8rcno3Y05FdHp4aTkvZkQxR2tOZ01pZUtabmxSOG1yaFdlRlBDQzJJM2pKR1VjeGVZdGxuSWo5anVBUFp0SVdzaFR1SGRjdCt4RG9qTGxpY2JIbTBsb2xURjYxREJSaTlnWmxIMHc5Qk4yRHY3bERLc3BHeGN5UzFGWlVIY3ZzMld5T1dsNlNTRWN6bVI4aFVSVnYzZmpFTUc1cE5aVUVVVXMrcko5Tksvb1FPczFwZHZ6ZFFnSUw3dEtibXlhMHdBRmZOck83MTdQUFAzbVpWMklYaDk5ZjV2ZVNVeTZxVml3bXdaUW00TExBQkR4b3hrcVFWYnAwakZDK0hRdTB3aTB0QWRpbTJ1akFnTXNoeWFMR2taaldaLzFDVTEyeEZ6NUJmcjNjcUhTeks3UGdUUmFnbnpleWFzTmcvVm9pRTAxMEt2WEUxSE80RGtaT1BEc1N0ekp5RWRXaVVGUUxvZWxzZlJJbkVTWXFZa0lHRnEzRS8zMXc4RGpQeksxNEtVbUhqYVVYS1FEWTkvM3JIQ0JZK2JtNG9vaFU4d0pPRnVwU2lORTlVVEN4aDhmdnoyTDlpN0xpRm41eFB6dTJCeVlzTVhPa25reWU0TjNUQ2FwYWxrUnd6Vzduc3dVL1YvZ05GZXdXZ211ZStIYjdJYmh0VHVHUDNPN05zbUNUUkhVaWE0WUE1cnMwWm4zaHF1d1pIWnJaTjYwcU9BNEJobUJNMW5PVTJkWUFsQ0VZQVpzVWNaRVZpcXJ5YTYvYlJnY2xuS0tBLzMvTkl5WUhERFUzWWhkZEhRSndaQ05WZ3A1OEU3N3F2bzVtOW52eXFRMWE4bHJNb2pHRW56SkoxVmtCK09nbWdmK214ek5kaXk1QUZqR0llY3IraHRNZkR5UmpUVjhwcFJzTkthZlFSTk1aNDIvSzh5OXRqMU83NFd4NXYxQWFnQ0FSWVVVTC9iRzdrTVJSeUFrZlpZMHFTMENCYUtjbjhZRjcxNnIzZHU5QitZdkNWbWhBelJhWGJVd2Z3NGtGRllDUVdqQWlPcC9HdnEzU3EvdkZiVDN6K2hNZzZqN0lPekY3L0JYa3IxSm5heXRWWUVvK2hjaGtEa1ZObVk2Qm9BT2JwZmFSUUNqRGJnTzNDaUdJQzNqMS9RT3RhNjFwRGk4WHBEQ0grVWtueDNzVXIyRGRkcHV3c294bHFuUjlmMUxWdWJoQzFQSW81dUFIc1M2MmY4VDlDNzA2NVBCbWNzaEpaZkpjVEZockVPRFQ2MWNEQlc3Y0poc21iRVhBbzhYanBaQjVBUEoyUDBtVVF1OGM1N2sybXgvU2gySmVaY3I5WXBNWVBRN0QvQXFla0luOGd2ejg5WlNDNm9LZGx4cUhGQVBUWDY0eEVFOU1Ja0tZU1VObHMvV3VZTGxyVStTbXNISkhGMnZWRnVCYUNoVTJUT2lQUnk0bW41UWlCQWVBWWdFVkhUZUdHd2Z4V2lBTTFoNnFHOEplcU43M21WYjkybG5LVitENm4xUStiek1hZmhDZ2NqMXAyN1pTb3BJN3BVajhrUkxSU0pwb0VmYVpGTDdmeTBNYWtQM1BHbTRNdWxqZGVjZHpsMTZEc3lsMDVTNjJwYkxoR2RXZUVWVHNlYngrR3FsaHdBbHdhK0NTRnZEelhtZk84SmZOTXhPOStIWnJsc25VU2w5VFgrYmpQRUpOQkpNSVpTcE9iNFhXa3ZmV0ZCWThNMlVxdlZHclpxTER3OUthd3hCOFhubmFjVEZOMzZCUUIxWFM3QjliUXNqeEtDSzF2a21UbFlIYUppYmRCU0x6d0dJYnFWaThONUc5cFZVOG03a28xMzZUMS9RZjhibTluU0NSMm1Obldya2s0QmF5VlMwQjE0VG95OU1TcTVVQWFTVytNcCtUZEpsQ0c1ZlBUbG1QZWx1cUVwRU5hRjJRaWZDTkhwb2hxVERPK1N4NHZYTWVVY0FyVG5wUjJzcUs4dlhKVnllbUhDT0FGSWI3MHdZaDNQZk5YY1c4cUxRMUs1MEExTzYzUjVPcEUwaUVPbW9ndVpwQUFVQmgvenpkSURPTnNBWGt1WXlZbjdISTlQeFQyMnE5WjFoam4xTlkyVUMzdFp0NGNONXZ2UlNDcjNBMUkzaWo4ZGZ3Mi9JUVJxaFN6Q0l2NXV6dGlMa1hDdm4rZk9idFROY29yOXA3V2FDeGZnUlNTZDZXVUlER2lLeVZOeTJWbmRrZElFTDNxODhGcmZrSlN0SUFlNHRJSlRSUnNSVHNPYlVGSUwvMmNhL2RGeS9CQzJBWEMzR0xuZVZaSlJGZnZ0Nk1XMGV3Z1ZlYTF6Q2ZHaUYrWmxUeE1pQ2JCVStZc3Q0YmRsTWVsdlc4WWNnWDRUcjhtQStiRzJQZHIzQjE1bWJtbmlRb3pjbWhoc2toa1BCT2t2OXdhSEp4OXpXUUdQQmtReVg2QWlGTVpCbVl1Z1kreU9ZcXA1anZ2c2tPVXpYQ0tCS2NwU0c0MUdIRCtieGxYRDJxY21EdWRsOXNqQlBZa0dFY0QwR0s0NEdSQ2oyUHJ5czliWUhDdnBQY04wVjNSMzVWQXp6NzU2S2ZVakdZMnJYOENzRktvdEt6anJUZkJVQkZ5dERBdzUrTWtuM0lQNEprcnl2ZUZ1QVR5ZmN1NUE2Yzl4TW5iYjlQTHM1OUpRS0YrZVN5NzRwY3pKa2NPS1BVNHlmOEhQaEdnVVc1MTErYVBxZWtnZW1FOWo2dnNrc3ZQR3BDVG5CTzJWdjhESnJXSnQrNnZqNjVrSlhhS2RFODVtYitzU20wcmc1dGtrR1prK1FRWDN0MHZKTm1hRzB4bURhR1JNV2dxaEUzbGczY0xFMVNtNjZMOEJIMUxMZUMzV1pjeXNCd2hDNGRsc044akpGYlZyb1M5VDZtSENRcTBhREd3dTFtQUE2emFxV0pnSHkzak42UFYxeHBLemRaTFY3cHZNQ2JFTTMwQ0U0L3kyQzFBN1ZzVFJ6ZGdDU00rN3Y0L2pJdzFPaVVad2xrMU9vWEY4MUxFVElWL2plLy9mNmptUG5BNGJWVjU5eU9mRnJuYUkwdFFrclNqYi9MUG0zZ3VZN3kxNEt1VE9USnVBZmlPeUplVnplSjJDNUY1STVYRW5BZE9YTFdoM3U0aVFENFBqWVVYYmJjMHduMG5QS2ZtRktFTkdYVW9HMGxKSy8xNThJUTZOWEFUd0EvaG05R0tnSjlrWjZwbGZrRXVZWnhDWW1tdW1DK1NVWXlhd3YzNWxJMjNzOU40QmNpbTRjQTJXYnJQNi82N0dWTGNuZXdFUU9JNklxM2RhNWpnWHphQ3A5bDFNRkI2UHNIWHBZNlM5ZzNpV25CNGZRK0pIaHJvS1RQamdMMWRHWUtKL25WU0xxNWx6QTFiWk1vVVdEZ1dtOXQrVUNEajlNSXZjQVI0N05hMmprbUpVNTVnNDljOFVvSmhxOHV6bUdvZHlIdWFWL1ROMEd1RDNkVU0rNnd4MEpyTnBTNitIUFp5VHNvaDBCYTJielZteWVMbWw0RXA0V1VCNmszTmVjUGtFc2lud1dYdnpobm44YTh0aG40SFRLU0tjTnpuVFBOM0VmeXIzVFdzSm9rZ2x2TnFLNDgxK3ZDTEFZWDZ1VXlGV0FKUTVvKytacUxvOTZPd24yTmZPUGFXNG9BQ3g3ZUs5d3RpS0tEL1AwY210anFnSlZybG5oYTZvVVBYbHdhQUpqZExTRTlqVUtlWDFDNlk2RS9vYnZrTm9iM2pzWU1aaEUwRFQ3dlVtTUVrdGNzVmRjSXFUb3pFUkFud0h2bUlhd1BVbE8vMmpNYk5rZjlPOGhSSjdFbEwxQTg4amVsa1c0SDM1NktQTkREaS8yaC9HRlZGQUEyWFdsWHkzLzN6TWxWUitwaWl5WVVpVWVEVGVHUCsvSFZmZklCaVh0dHphZ2RCa1lSWGNBZ1RPWXMyeFo5Ty9tQnhlWGZmMXREREE5WDJqQnFPbmRET1FEZzJBeld5NHpFUHVQOWhWTTQ0cEJzUnIyTTFuYUJ5UWdGODZCeTN5NjdvakVKTHpjRlY5RzN0WEFKc2VDU0xJLzZSbnpoalBtd2J5b0V2aWhXb3F6MjIraWhBeldsUXdWU2Z4dXN2WE1rajl4MFFHeG1wUTRHZEFINlRzZGtsbW16a3dhT3BIcFRuV0hVMVhSbUxIVG1kdGFUV1B5VUc2L0tSVDRjWXQ1YTI1aHpud05KdzgwYUJIcUl5dXNnai8wYWpOY3k3L3lZY0daUDlLWE1DVDlQMGkwMDAwUjZtSWxLQVpvbG4wVzM4Y3dJZzZ1NVpOT0N1U3FsZGlURlRhbG5JZHFWUU5XNEFvZkFqbnVwelFxRC9kRTJpdmJzalpqZ1R0NnZIUWc3WWZTZFltT3N1THl3SjFPclF2T2doQnJ3UTBRK1QzT2I5NjhtSmtXcjJ1OSs2a3FsTFgwL2ZDLzJZTnhwT0QwSmlkaEpmRUI2ZVV4L3gya2hzNUhvaml3SjBCTkh4OGlUUWZDQVZzc1YrWkd1S3g5eXZBUGJTUFpTbE5NWVFYR3J0Z0pTcUFJcGxaZ0NoR0s2MUFIR0F6WldpdzVWZ2xORXdZOUpUeU1TQUN5Y1g5alg1NlVzQU5nWks3L2VidlhpYVdHV2dWVU1sV0JLcUg0SnlJOE40TjZxUWNiR01LcFZOVmpxN0J4c2oycjZHOUU3QW1kZVkwWVJZK0FCMGk2ekVBQm1OWmRwUUVCNzlPRzR6U0toNFVSUGl4ZXVla0ZCb0dwc0YrQkpXbjd1ems4REowT3cydHJQRDNXL3VHVU90aldsSUx4OGtBc3VqZTVzenRtK1RxQnZHWDl0VzBPZ3FHVGwyMzVXNHNuL3Y4UEU0UXBUQzhPZ1lBOG8rcEMwM3BuUVVOdEFVZmdaRVlkdHExUnFBdHZSVjlXdldHNjdFNUIyVlJMMjdSc2ZFTWEvT0pVaWdwU1RrcmNrRG9USzJYZ0FWUkFtSXlYODRzaWVYSDB2Mnk1U0loUWlUbDVhN0gzclRQZHlBYnFwZGluOG9sbThSa21GS2NnajJzZk1mM3JOcWpSeUlnYWYwNUVHSjgzNExoWEdIWVVTeCt0NGtDdjV0bkZYU2JIcnZ3Z3RNMVRCS1p5czlVamFsSW9yeG41cHRjQlBOU0xqR2l0MEZ0cFd1eXdrdDdDWCtMclQ2ems4bjM4NDBJWjIzTVkxYTFiVkczVWZUaWhyMlljMC96UDdSVVpmSEFzOXU4anhza044LzZEOEl4eUhIT2c1cVJWQjVGbUJhdHJJRGY0NnVadG9FSWxRTGJpWnpZajh6YUplZmpqQnFSdkR3aW9TY1REY2FsUlhRNEhJS1diR21WREU4ZXcwbktSR1Z2MzlweGlQbk94anJBZU5HUU9wZTVLL3p2TEpSVmphNUExanRad0M0citZVUR3Vll2Q3R6endEeUFrYU9PWGtWb2ZGamQ4cW1yQjBrblZHekNoMEJMb3BtQ0RHQTNhS2pyWndtQ0VZYlJTcHIzd1MrV0tJbFc1Ymh1ZE9jTUZqS0laN1RqWU5ZNURFRzBoUWEyQWhnRG43RlRkeEh1YW43amNYdzNYem5lVkxlTTdEcW5VRnIvUURnbWJiU2NiSDRXZ2ppTGFkTXBhSE50V1p5d2h6OC94NDRBdk40blFkdGNaWTJZZk5ldkNCbmQzTDl6T2NiTkZQVW9Zc2Y4YXU3cHBvT0NGMzRNcHc5OEg2aXF3UVpOeXBGYWxPMU5DTC9QTXZCMzdhU1RNSHd4MHFLMTUyZjcyV1VGVjBRaXJrUy9qOU43UG1PSHEwcHdvZG1aUTFGc3o3TDlFUnBRVUlEdFd5VE1zSHQ5a1pNTXVjbXhPK0JURU5hRVdyUWZyMDhiVUF1WXNzWFFWK0M5QnFneC9pT0l2NnI5VFFiV25ac1dhbmRHYXNHS0dvWTNFZVFGNVU1aU9ZT1hDdmhNcFRONHJJNVpjbHVFVUNWcU02anRoUGJ2SGdQNWZEUXRmZHJOSGl4ZUR4RDEwdkVjNmJUZXFKUmxCcDlUdjIwRnJheWNtL2FzZHhHbWlnUGJ3MGljd05VY08vZWo4NFp4Z0xYY2ZoL3JRY3A3L1plWGtjNWhIMUc2K1loWHZVaHcyRjZ1dm1nNzVRSDgzenord2NTUmVGemtub2pzRGZ3VHdEZ2E5ZEgrK3hBRWdpWHpRL1lZQ1dGbVZpODkxZUxkNGd1MlJEbXlFWmZsV2pBWDkxY0d1QnlTT010VVNIa3ZoUC9aVFRhYzY1M05qalR5dy84dzZlelYwamU1M3g3ZEVuZnZrT3dPR3pSOWtuUEFFeGM3ajAxVW1LcWp1dEt5cm1RdEhtSjl0WEZWMXZQWndERkdjZlJHQ0tsUHdmT3pGQllzdk9zOUsxanV2bmU1ZjRMV04vRTBGMkM0RzQvU3k5K0g0eUFtS3pmbUVEdEdEOHlpQTh3K0VIVjVVTENNMlljOHQ0NlQxVXBDNThiK2xFN3EyQnpEUVc4U0ZWQnJzbkNPWEpZR1RjWHNxaSt2ZlN5M0liZW5nUlZwOWliQStsbWl6WnhEU2R4RHlYYjFpSUdaZm1vOGN5MkVwRWMwbHh3d1JVZEFoak96MjhSZ1packdHQ0ZXeXd1Q2JJVlNRUzJVMnhFUGJ1YjZtOHlzc3dPbHR0K2o3cDF6Mjk4M3JyUmU2VndFTGpWMkNrSUkxRCszVU5EZHdpZzkvUXdFZ1FtdmI4UTM5Vmp1MllrbTYrdkdwNXh4TUg3K3MwV0RSZTByMGpGTk04YUExNEx0L053WWtkM1BuNWJNaGRzODBUZ1B3T1o1R0RWUmZ0WDVRM0NkdzB5ZUJ5aFJHT2ZFOEFQL2pKY1BuOS9YM3p4Z2g4eFFjdnFUUktZdDZvSnRzNnVZblo4bTRGa1BMdlJjc3JIaVNPMFlCOWJna2VOSHlZTTUrWE12ejc3bllFYVEyc241NEY2MWhuamNTSGVWOUFDZTl6ZjZGQnR4dTkrVHR0djZrYldNMi9HMmtFRkc5Wkg1dTJzR0JpeTVEOVhPMlUxM3p5SGQvMzY4Uzl0OXd1djRUOUNtN29iSFlYUTF4dUpXTzRYb0Rwc0tEcFBFb0taeFBCamtxU05hUTl4aDVKOEIvUUo3MHJpbFlCSXZKWVZrN0pOTnJJMWtXU3hGakdFTjBvTmhQcTd6R0JzWUxEUThZOGU3MTNGcEhXNUhSZ1d4bXU5U0ZoblIyZ2JOYnNJQVpFRkN5dEQrNjhzQmlGVVo0WVVCVGRtQU1VRDNaQUZQQWJacERobmpNS3puUlZnWXlSK29yT2VqYXo2L1A5TWZkYjBmd1BnSHc3Y3VORHNSNVI4Zjg4OFZ0N3pQTDhybjY0eGZ0cnA3b3RTaXk1Q1pxSE8wSHpGUGNDdENiRHF3SW1SRzRibnJNVytqTzNoOWhyakdGTnJwMnllbjFyQjVDcEF1NjM5UERqUnpyMHNOc2p4Ny9OUmpJbTNlZ2ZvOUdlOUFmYXpVMmNQbTZITkpYVTJoWXJUOG0rYWJ2SWdtcjBDR1ZUb25INSt6dEFxR0ZIZjRoNUE1d2t5NDVrNmF4MWRoU2Y4emc3RVpSWUdKdnR3MEt6NmxqQUJ3NFdCTUxIcWhtNGcveVVRVHJoU1grRXVPeW5WNGVMaVJBRVkxUDl2RUdBbjcrdUl5TExwVXBTTlpXWTcraHNCUGJKR2RqZFZKMzRLZDJmaGFjQWlhbnVPVWlXY2pXN3FNRWpwK2xvTW9Yb0IyMkY5RXcweVBoSlBDS0RtNUtSMUcrV0ViZngzMVM1S2Z5dVBPRHhZSWNrQmM4a01CUHU5T2k3Mm9JZVBDOUI2NUMxMFVnR2t5dkJyYU1oUFpCQkxRMTlRNlNvYm9Ba08vUUU0a2NlelNhakFUNWZLUUlYSW5OWmoydnpDVTg4Y3F6TUY3MWl2L3RwS0VCN0hyOUVLb2ZmNWJQM2pmVDN1cktKMk0wQVY1TktGQjVEN2h3dy9HWU15OG9xR1UzVStFZHk4Z0hoNWp5VGJIZm1qdmt2dEdvWXpDMXUxVTEwZW13VGZocUVDYzZsaFZoL1FISTFhMytCK2dnd1pMTnBFMEZvWFV3S0ZxdGVCQ2pRZ1ptVVBwOWw2Yyt3a2hnSHVka2c5L3hPc0gxb3Q3SHdCUmY3RnpqWlExLzZYWW9EdmxRV0JtRnRTZjhreUViYkJRMk1VQmNMY1ozYWlNclJoakg3R2NTR0w1VlBmbGdWekx3OGNHbDZYRzdIaUh1NWI2WGxnMS92YkQzdEFPeGV1S3BLb1BZbW9MaTRmRUlmYWFOMGJBc3QvMVkyYlR4NmJGdmJkZjFnYlBSSFBSa1pON0RheDFhUXRSRUR6UC8xSjZhYWhJVnVHMFRZbmpjRDRzWVIvMjlKcThwbW84Z1F2YkdKWGo5L2RLZ29UR3RNWDY2QnRnbDJabmVRbTIxWTcvVm1zdC93RGl4OFlLdTROT25UZDIvWG9yUmFyUit2NXp2M0VpVTZTNFZYZDN6VlBiVEM4MDNwMW9MaTlFUmRKZkQzdDVlbTV2WVBUVWIzUXJocEdTQk4ycEp3Qi9Tem9aQWU1WjhtdUZwK0N6U0grVll1Q0R6bXZyK2wyUlBueHFRNnJtMTczdEtvOTVNb24xcmcyZUNJY0o2S0g1ODhjRzF1RWhDRGdLSmdRQml0WnFtd0Z5NzZNY1lyOUtleE1xTG1Nd2k0L0w3aHRaTWpXOUlMUDZreXVKN2hwdlZBK3RldTNUUUhtTEFFUTV2a3hWSDI5eVJabTBlaURwUjdjRFl5ZnJ0UFIvTFpqbWp3UGUyR0ZnbEREOUxTUUcwaGx0QVM5c0dGSlB3OW5DSStXRmJEYjlROEFuNnR3TDVGU1k0SFRuRWtWVnNCaHV0MlcxOXZvMFdjM2NNTHo2TXJWTjVaK2hKR0o1N1lqNDVBSUoxdWxHaHMybHJEN2d2SEpsYWZNZVdzN3ZCdStGVm5zWEZ6K1NHcDRYYjFlbmJBNndRZjNha0dDVVJCcDhSV1RSekUzZ3Z6TmV2dnVxTnBxWmVIbCtCeEk5Z0tiSUlJODRNMW9vOHF1YnlhWEJSQVdGY2xJeE9kNkNaVnQxVnA4WktCUWZ3OTR1T1IxT0lsNTBKZmFYYStNN1Q3c2I3YkVWWDdrYnA0clV2OGhYcGhnY1FkakZqUGVLRGN4OE9MVUtQbUN5QU0zZnBKR2ZqUEtzNno3a3oxM2hrOGdvdGVNUjZuL0NtL1FWNFpURmR4RGhYL2cyK2JJQ0NsaHNMRTJrdDc5ZmtGUDFJTzVha0M1ZnBwaUVoQkVDaEZJeEJmaW9EeDh6VlpLSWpHWjlhY3R0bm44YzNSOXpaelJNdzl6WnJpWThaUXZTWXF1dFJZSzMyTThHSHlnUllyR0I3U3NING1PNVVzeExndWRURGlDY3ArT20vZUQ5WnFwVW41K0xPTDlYUDI3RnJieE11VndoTlZzSDVTL1pCUUhPZkhweEd0eE43dDdWOTJwNDZsQVVIQTN4MWN3bGN1MkpnMFI0ZWVKUXgyOXdTNHpjS2UrL3oxV3I3L2MySHdZdld0dE4zVk5pbFhyQWVyWHh1QXdzQy9zeXRLOXFBbjRySE5GUVVzbkRnOFRudUVKaUl1eU45ZDcrcEV0cHFXTWlKbHhHa1Y2RTkxSkpiOTlINWF0Tno3Z0pZKzFHMk1nT0JEUUhTK2VrRlU4OFpIM0dkRm1ncy9BL1o5NUdSTE02SFcxYzl1ZjNGTmZmeFRaNkJhOGZPMEhCRkpuMjdaOGFGdFlMYUZZVEsxSUJMekh3VHdDYjlaaG1pZ0VTQ3M1bzBjQXJBVHRXNUNoV2RtSm85UlJPTmx5TmlBRncyZDVaNWpSclFRVzk2MWh6cmovZllQZjhUbThOYVorVWtsd3k4a2Rzem5mcXVZZFNSeW9ueE5aR2M0cVZGdndWNElKOXdLN3A5Nm5tWUM0UXdrbzlpdVRETUhzZ3ZKS3VaMnkyUjBOdFFmamJKWVB4TytkeGFDMzRSVUk1eW8yS1R6VGUxMWtEaytxN08zMXJxVnRiaERRaFVPbTBkb0hPUEFKM0hIQVVDWFpFQ1laMURwVE9mN3dESWlqRWVRTW45R2FTZjRWN3FjSVVkM2xJR3lWU2FpdUx3WGh0M0VOT1ZXd2tXRm9XWnd3NkxIU3IxaTJPdE9jUklPemN4QUg3R2VsWmY4RG9FcGo3OGtDOEZCOHhnL2oyU3B1SjJzNENTcDgzZFBKenNkNXVsMW1yOUZHRjhFZm9DWUVscVJ1anRGSWJCb1Z4MTV6Q3ptc2p4ODVKSlFQYW4vUkcwYzZKWVdzcVlsVGIwNTZOYjJid2hwRU83UWFEb1J6UVBTYVZ0QXlKVG1LaGphN05mTmlSdURVemROTnJQWGc3ejU5UVlXY0JkbU9XcElWSGdWM0xpbCtGSUtiMTdmaGhERkczclBUKzR5SVlkNWhMK0tDd2R2QnhNRHBKdGc5K1JtK1dxejBNeEFYaG4xeXlJcFdjb0l4YXZRZHNmbVJycXNZTW82MHpDS2dJZW9oQ1dZMmp1eUJUN0NjUmpVa3kvR1k0Vy82RWhsWkQxVjZRemtqQVRRMElZZzdFc3BoS3Y4TVBuY0pBK0hTbDNmaE1MQlpMRWFoOVBrK0NCU0tzQlZ1am96M3lrZlpoN0YwS1JxaW8ySVNUN3I5eWdOSjZjZjFhb1F2WWV0SnhPeDlLZzBLRWdRamFEVEhrcWZGRE9XQW5YdjFsMk5XcWIzb1BzZnRqZkZneVdFdnZFS251U2QzRU9XZUhaQjJTNzhlRWFYOEZpalZON2tjSzhQYXpTT0w4Y0Ixb0g2ekpXYmhXYnRhRFdEaVpYYUxwV2lGcWVvWmJ2TzlWdWdvcy9XZ0JKQnA5c3F5c1J4S0E5R1JuNlVQWUZFM0VJK05meTJ0QkFHck8zSWVqaytrWjRtYU9FY3RtUzNFM2syVTIxNkxXbVh4ZFd2Qks1ajNYazFvSlRzZnlpcGlhbWUxdFR0c0hDSXpOeE9kZmJ1bXBKck13MXlYZUJPQzFDVCtiemFOZlR2QURRZnN6ZkhrTmdzRDF0S1BpUzRvalJJNUNBS1RvNmR1N0liMENSSEdkRisyRXF3djgyZGtLTnF2eFFhR0tYUjMwOERIV0txenZrdFFzblZvS1pxblUzTmR0U05XNUZJYmNvYnpPVnlqSlBZOXZudnFhM01XZWRtNmdNS0x6eGp4REpPbmd0WGVRRHoyekovOUZUa3ZoNlkvbTJZcVUzMENWMllONW02SlVKeTNlR21MMUI4MFovY2N2NWlIZUxWeEVybEFuWDBxa3g2S1hpaFVNRHoyc2hNcWNLQTZvVDFyOWxGbjVoeDE1TUcrYmtyYnN0dzJyeGdrbVB2cEtKbmFydHRObGVKaDhWVjYydjVTWWNpbE1qeXZzSVhITGFZQU5jU2p5NlU0bmlEbDRDZ2hNMitWSmt5YWEvRFZTVDdVNGVweHV0ZlFNY1RsUDBYR1JIVjdYYklMSm96ck5MRDFLeGh0WWpEbzJSajNiVDZqdUVGNnJySmxyRmpqMmhsMDh5SEdCcmdwOVl1eldLbGZ2WG9JNGJITHZhQmJYdkV1QU1wMWdRUjYyOE9hN0ErSGxxNEV4dG9MMTB5L3NIRTR4Vlh0amUwRkhOZDhlemx5UDJqVXhxQWJHOVBlR3NOMnE1YnNTek84Tk4wSkdJU0RsblhGaVQzWDVLR09GMUZiaW9hZVo3emh2eC93TjZCYWR6aWgvcEZ0NXkrYXVoOENvWUZodzBhajU0VnltQUJnS2dXNzVHYVp3cjZHWTdjR05SdEhwSmMrZDNTRXluUE5yZ2RpTjRnVWxjQktvT2xlZkFjalpBYkNlZmhTUm5UU2lZSlMxMVdpaG1rcmlOM3dTNEw3bDJ2MlpyVUJzVmhyOWYwNUx5V0h5WVA0ZUlMK0VqNkJ2N2haQWtnS3hrdUlMZGdvVjR1U2ZNd1l6ekxmT0trS1VJWUZZNS9hM2x3ejQzczM2S09NeTlFRmN5WjlzUmlHU1hHelJMK002VWdUMWIwWFRweU5VZ1NRVWlXR04wN2FRSnZPZStGVjNSdnQ2dkpzU3NZOGlWUXhnQVJNN0NZbkF6V0ZGclRTaGtSOW5ESU8vSFZheC9idms1OUExRU1pR2liTi9FNWRnc1BnVllRQlhOeGlCNlZ4ZWppcjl4R2lZNXRUZ0N3UG9vTTAzWUpRSmlKRnZEKzVHNko0d1VtNjcxeXRRSGVYaHg1T1dzR1pZOTB0ZkhEdjI4UFJzeUJheWE2dUFHR1prQzFYZEJGWkJ0Zm85T2tCY0tEbDJ1cnNZZWlURXNIeXIzNWlJM3V2ZkRDUWEyZ1J1bTVQTEZqTEZ5K3BPYllhVW9qY2lRYzBFZVNldmNoTndjRlNkWTJWNFZNU0RsK056Zk1td1Nic05HSjZhSnNiYVBPbnpoMkxRQU9VRzhuTjN0L202SWNPS2FsUjdRRUdxZGIvYS81UXVQME9mWXBTeER6NE5GU2FHY0dJaTVTRUtuMFZLdXBCMVdRMlBMdDBVbVgyZHlYelZBQlRwUENGRjduOFdrMzArc3BiaEZqWFBrZlFSZm5zaXBkVFpPdStiQmYwdEZXVExLTENyUStjM0VQUVNPT1Q5d2ZNUkd1clJmbVNtZWxXaWxhS2YvWEtOeEFpVFRVbHhERGpNcFVaWVlkbFhPNTc5V2NTZjN6RGlFQW5OOUgrb3JHTGxJSW1DdXlja0ZaUkNyNW8xTW5OMFNuc0xqcEhKQnluU0lwcGk1dUJZRmZMN1JEWElJQUN3c25Tbm5pYTQ3d2tMZ1puaHdJS29IOEpFTzVZN0V4bDNOdSszcDdNYVJ6aUY2SWl6cnh4R29BVVVFb0NQbmNsVTI3K0MwQmRCWHhRd2VjYSthQytXcFVSMmhGbFNqNCtUdGQwSkJnU0E1K0FnSUNBZ0lDQTRuenNiNndBa29xcjJMSktnVTlyVForaWhoQ3ZQYnUxbWFNSTZlYk1GR0dtVUFSS0Vnek0reHNqZzN2MTRyREZVL2tyT2RZQTRsajdJeHdHNkRFQ05yQmxkUFcvS2ZEL0tGTU0vakRIUUovSTFreDh1NXJTSkErMG1nSmszWU9IeUVUYnhKeHdLVzI1aVhlb0Nja1h3eVRWeHUyOE9SRWltUkFhNGFBZHBUOVkzMi9UQVgyL1R6YStxeWZzMit2Ny91VFAyZEVIM2UwdS9mODIxLzM5UGw5dnEzL3Y5ck9mVlJmUDhQcDhQNGZXaWI5dHJYMmZaby92KzNoL2IwUWY4UHNyZjMvY1c3OXZVbC9EMW83N1BjZS9iVFBEK3o2Smo5djBxbS9WWFA3UHNSUDJmWTIvcTNoLzIvWEMvcyt3UzM2ZlJiKzMwNzc2ZnNGL3FvYlhQZ2sxcnM5bG5hTmZ3am1iU29MOWNQU3NxOWtHRjBzaU10aEREdlpZb2x5MDFXd2JZVDZkRnB4U1JMMUJVdTVGdVBLRUZoR0lkaCtrTFJBUmxXMkRjTGh1M1Axd01yZ00wWk1XaGxuYWw1bWFjSE5ZWFNld1p4cUYydjQ0NzFyVXZ1OU1nbm5tWUF3bVNCcmszOENIaTB1bU02ajVHaGRrSG94eCtZMHFFT1AyL052SGdFOXVuSGFYazRjd2ZJT2UranQ2aEpsWUZ0anRwcDcyYzczNzdLNHU5Yk5RcE90aGRsVmhhVXpNQnBTYWFuQng0aFlOZ1k4SWd5NEhETm1mbzhNeXRkZS9lb25NUnA3RytkYjFYaFh6OTllU3pIcE00aWVXRzhUQ0dLWmZ0eVA0eG0rblZ6MVhkSUFvUURPYWNpb2JzR2NVTlpPMDZPZGtDWGpab09Zd2ZSY2Fxb0k0MnowTGlyVFhSODlQQjRpQlBjQkFmVTUzTDE4bkFsSkRjT2VveXRtZkRCaGVkWlcvc3pqaHNkTnNSbmNuWHJZZmlQOHN4MVRTMnZVZFFFQzFKYTY2b2NObGNwUXZDRnV1aHRXYWJLSVJoUXRVL2kyOEJUZlMyVUViSEhxWFVKWWRDdTQ3TUZIbDEvbnljUXF6Ukc2U0c5V250bm1yWlZpOUg3S1JrTVdTdlpPdTFXM1M4MDU4VEJKT1F3Z2lyZk9CVzFaekQ4dkZKQy92QzdUVVpTc3gyMzlwek9xWDF3eDQ2RGY0YmNvS0h6SnJSMStDdG0xZ0wzNEpZN0VhVTJMd29IR1UxdDhNNC9ubkJnbk04Zmg3U1Fldm1rejhVT290Vi83NXZ1MGpqWFNiUkdDSy9lMnRMY2t1LzB6MWZkelhjc0R0N2htSU9IZ3JnTlMyczZudGtKM1RucHBvbVIxaG42R0lSR2FVQnc5eHA5aFBTU3pTbEFKM09GOUhMd3Ixc0RicU5OdGh3OEgrUDhNWnhXd1VwNWZzdHpxZUpQNlZuMTQvSWt6bTBFUzZjZFdJMVRQY3kya1l0U0NxdCtoZlF4UXRGU0JEeTJaeHdQTVVjSTBTMi9LNUZlVWd6Wnh5NEVqeFU0bjdyUEtBZVhFSTM2Y3dHOGFqOG9iODByMTBhb3F3SmtuOW92b0JLd011dlZOK0tmOWh3Smx4VDNjMThqVDhCU0YrcGxJWkhXbVdlUGpQNkpMdjdvRmtqbTJZU2xlSjh6T0pvVTNNSTNEWWhXTmxWaFFUYVc4S1NwVE1WMmdEVmJheUZENVF0Ri91ZWpxbU1HbHZKZ1p5U1Qzc1pLdjJ4ZXprRDdzUDQxakpTcHNuL3IvL2Uzd2w0bnBRTzV5Q3Jsa1lsNTFQcDlDbWE5S21sdU40OWdMeUJ6bGpYTm5iRjIzTWVRM0FaVzRPdm5QbERtNlBoOU5pamUvYVFPRnNUZDlibUZpWm1ERDBKaWVGN3pFbUZERjJqVHkyeWMyRCs4NVhDMksyZlVMems1OS8xRjUwTTVsMmhLR04zWEkra2g0Q2NDSGFTTGdqayt4QXVzNU5PcERTNEVpK0NKUzhzTURWc0Z2WC9Eb0RkK1BkaG1IeEU4Y1RQdmNQUU44QnZ4ZFFnU2NBYWtET1ZzcHM5QTdDbXhJQWRSUEc3MU9LWUhBUHZpTG9Hd3BPN2dSTkNPS0dQZ0hpbHIxaVNpWTBlS25HZHBoUldhdjNyejViNXV2aXEwSlVJdVdqc1pldDByWldtTEh1TVp6bDJycTk5VzlXVTNLRGRlek5ycnh4MTJUeWQrYlUrRXdsbjVCVjdEK3h4NVdnRWwyMTV2eWsxTDVLSEh3YzVBZklnd2FFVzNrM3JOaXhqNWtXUk5XU2I1azVqeE54NkNBdlZvMmF1b3BhK1cyU3BoTHVhMzNOaDBLZERNR1RMNkZoaGFVUnZsWHhQcTV2UkF6MURJUUNJQ2twWkZQWXQzTUEwR3RMZURqRUkxenAxZXk2bnIyQXVxZkFzbkVleVVFK0dkSHFLM29vSUJQUHJESzVmak5ueHpsc1VQdkQxS3h0ZlhBd1A4VUdtWVM0WUk4MW9BVE9kbWx6TTh0T0pzejhOYUhOMi90MGI2aFhEVDhVK0VQdEQrSWVqdCthS3RXSVNTeVBxdEN1OXJlQTlYMjRvR0laZ0pGajh1cUxlQzBHQ1Z2ZW5HTHVKMHNjQ2pwRUJkekxHTHJLb0FmZ1pRbm1Zb2UvVjBVZjZNM09QUTlNd0xGcWZzMVR2Q010d2psbHQ0OFp3WnRrSmFrcjRqU0duMUdoaGJzVmVCenMzc1dvcldrcytWUndCS0JFeVFvM21jcG5zNzF4L2ZLcXdXQjBjS0ptL2wxck1jcFZnMHZ2NXJEOU5xbjM0eXJsZ3VyZ295KzZqL0VJamQyazdoQUhDckd1TEVrV1hlOVVIVWNiYmZ6MlZnLzdJMGRKMWFOZkpqNGJPc0Z2Mis4VmQ4Nml1WlIrQ1RmMlpyTXN3U1RURS9SZ2pXQ28vdFlscFdJL1VVaERlcUtCVXFpeGt3YTB4Qy9lMVpOL3B4Z0NwYlVpRTNQdDJLTXpwd3ZTcG9RMEdKaVRoYTBlS083UldGVDlzSkxWYWZMWGZTbUdyTG05R01KV1JWR2pNRDNaY2VPRGtDdDZDM043VW9oODBVRS9sU0lUUk91ck4rbGwyWDd2VWhMaHZSSUNIb1Bmbko2Zk5DNDJOV3lYbTVadk45cUh0S1pVT0Z3RzBNOTVWbDdORlV0VkpDWGxmSHZpd1NGNkFlSXZKaEtoRnJzUzJYbXMyTGVGN2Nya1hUZ05qbVpxdU9lNE00STAydnI5bG12Q1NxTlE1Nmc0YStEOEhaK0xwcStKdUpOYkRTSlNEWjhQNENrdzRaRFpQU1NNdExWdG5qdWxtOGRCMzVNZ1kvSUVnOXluS0l6aWFCL2xBeXhkZDh5cWc2TE9uOUxISnVNYUkzb3MvMWpuWFdldmtOQlR4UTJTNUtLUFh3VkdyU3Y4dDFFTmREUnp4c0ppRjB0aklhMHlXZEtMSFhOWTUwUFUyOFRLd3RNelhNK1lTYWJJYlpMTlBlSVlRV1dMOUZ3QjE1aFBBZkg2dVZjRWk4U3M3dzJsUE5rMFd3Z3A4M3RjSWtTZitJZGl3VEN2ME1zR1hUN0pNRzFYMVFiaGN5Z2FDZlhjQ3pyTWQ5TStDU212MzRhY285Z3FaY3VRdEhORVdzVkZjK09vTmVFZWdBYklEaVA3NEVWL05Cbi9mWmRTUHZ0MnA2SXVoSXR1dk9aVk9PUmVRZUJuSmJTYUVCbGJOK3oxUTJjQXMzWUEwN3d5M0NOdStiNVhCQktUMGIvWk9LL0VQQ2kwcUZHdHNkMzRXM3IwTnZRc2lyaFRLbVlRSDVYbVQ2NUpVZzlWWkt0R29HN1BNTW5iL3VZMzBucW9ZUUd3TVZQY0FlN0k0WWdOdHVSQUdSR01uUW9qWTBjaXd3Um5EYXdhUWZiUGF6SlFHWitTU2dpMGx2WElGbkZsc0kyQ1dIWVlxZUV0bHdCeWxCME1iREl4K0w0MUY5bmkrMFJXRmNnYUpaUUMvVzF1ak80UU1teWNXQU5rcXFNSWw3M2lXcE1yL29EdjkxYUNxTmtkeUo3S3B3bjlXWmxQT3lBZlZkdk9NdTVHVzFDS2kwdUVNWE11ZTd0QlJhaUpFdXpTQWprWkt3WGVQVlFXWnpwTU91SzVIaG5VaUc2enpzVURyS3ZnZGdJNTBjZ3R2UW5aTkpwYzNuQnlXTlRIb1dyY2YwNThpbUJrcGpwL3A5YUtaUVYvSFNqRkJSV3k5UjJZVkdLR1NUblNqUXFwUGZkWGFzU2RRc29SeEN5dWc2L0F6eGhCSjJRVzR0Nk4yTG9RbncxaENLWVg0M09wRUJ2cmpuU1NLNW1LTHRFdDZoWTgvUEpWK1EvMkU4dzE2NTRrU0FldFFnMms0VnJrUjYzcVBCaTNIK3I4aGxuUTY5ZFRFM1BQc2xwU2IrVGIwRHlGVXY5T1FFWDI5ZUI2NEhOa0NPQVk3SFVJVUVFZVF4ZjV1eWZvVlg3cEs0SUtDSTdXSCtibGh3TVQ0TVYvckFCa2VUWUtzNUErS1k2SnRUdmkyUDZkTHY3TEJadTVqcWlVMjU3SWhEVGU1L3hSZ0dsV3JMSS9CbEhmUStIa0dtSE5PU0pzWXVqbUJEZjdTeGI5UW1PeHlYNGxjbzNqbVpZbXJMZDFSMDdyQkxIZ2R2VUd4Z0g0VmdiTDg3R0dMUXZNa1U5K0lRUTdZYVFJd3J4V1FneHh3SXRDTlFXc29TejNmdmFPM0hiNWx2NnhNZnRSOW43VDJSWTVnNEFPYmp0ZmRiWnV5aVU3MUJJalBvWVFNcVI5VndzOHFYSzdUOXhjZHhZRGdvaFB2dGs5c0VTeUc0Y0RiaEdsZ0p5TVNjTU1seE1ZekVIdll0L3RhZ2dWVGcxY2NkUDJBUHpwZ1Q3KysvVDBhYk0xb0lwSERIQWlXSzdqYy9YWFlIajhVL3J2VEE4MExSZDJITlczSjdPUld6NzZYZFpsZk9DcmlaQ0tSb0JsallpbGtVYVU5K3FtYnRuaDNxQVFUaWtTSFBycWpXRmVuRnpCVGlwMTZrd0pqeUdCQVJmcys3eXdlL2w5MWFHaTNZdVdVZWNaSTNpN1pLNzJzSmdlNWNLbDNvYW4yZU1LVGhXUC96d291clNwWGc0Uzl4L3VNQ1F0Wm1EdGJyb0JYamVaUkFxWEh6dmJUOVdMMU51VDhPVTF4blJrZTFvZ0kyMkVTNFVVbnhQUUtIcEZtR2JnVnNwUi9JQVNna282REIrTU5oQmNTYXVvWDU2VVBsM0plRFBjVFU2UlB1aW01ejhBdFNKMEpQRm5YK0hxUDlnYjBkbzFMSlcrR1p2RXBDS3VuZnkvbDJpZDF3a1c2YU8vMzdvRlJPcGw4ZGphNk9IeVB4WnEwdmpWNVQ4NGVBcVlqL3ZpeERqSnN1RDV0TU14bFo3TTNFZnNucjNJZkxuemxzTFdxWFV1MWJyMlVqTWprNFpJQWFvN2gvQmY1ZTZrb2hkME1pdU55c08zZW9yKzhqL2hVbi9DYUFUTHJnK2xhREdrMXFwRXhibFFERlRCZW90TUtOcVd5RFZlQVNVUFlOSEdycjE5WENOYWdpMDg0WW1IMVVqQ3huSEpjb1U3TlhGYTduNmJtVDVzVFZERjhHZ21pLzhzVno2anNBQTdvbGpidDJGY3BSSW1jREtmeTNMWnlYMVh3cXVxdjliNHJUUkE1Mm45cWVCNDdSeFoxWURiRC9abEdCaldFUElqSVBTbkRDL0F0SElaMnRXM0c2TDNwWUZlcVNTTmk1Z3FrSS9qZDNTTGM0ZW9nZ3ROMWRBT1pmeEhOb2tWMHRmR3ZDQWdTVXdMVzZIaVpxdW5nVTFwOExZTFpDdGpPaVRkZ09LK2VBK1FYZk43aXJsUm44Y1k3VTQzQnNCYTlQMVJPOTBVb2lBUk1zWTRic20xK3BFTjRrOGF5VEZicEFUMzBtaDl3YVFYNmdEV3dsU1JSdXdXTUFielJONXQvWklaNDNaRlJNUllJcWRGRUxuWUpSWEtWb0dhQ0wwNnRrQmpzNGNubE5hSVZFcXF4andRQ1dVUUw5aW01NUYreEx0U1Rld2VkdGxSKzhVd1ZzYTRCTGg3ZEhVczJtc3R2a0Y1Q0UrbUVhTkpRYTNtZmJNejJmTlhGZXBMeTIzN2hpWTRCaUtRNDR0MWhxbzh6UUwxZlpRZ21tcGNLUWF1MTM3cDhScFdkVEY4aWlCL2czYU5IcmdMc2FDYXVOMGRZT01lRHdNOERHeGNpUUl0VGtsSVZwYkRkWG1EZWdpVElGQWZVODVNT2h0RHdLV2JuSGR2NWgvQWNOQy9ZZUVvd3NPdllteXNYU2R2SW1yREtsank1L0tSalMxMWY4OS9aVDFibUFYdUgxendmUlJxNHJJOFNPSTBlUEZqQWs5L2VDdC94WHZrZTRvVGkwcnFkUll0MzhmbTdzeXdrbEdmdWErMlp6c0ptTHhsREs5b3RwRU9OcWNZS1dxYVAydEZMTnVHN3hEUVUvYzFIbUZCZTBIQmZ2WTFsTXVDa3pBODNhMUljbS9veGMxWTd0emhiRTltS3lzZXg0dFUrV1ZkMDlnWmkyRlVnRVUxSWJzN1FzVWR5ZXd6REVvcUpDNjU3b0dna0JiNzJLWE1IU1hrYWVXRkZ3cTRZVWJ4WVVDMjlSbFZ1dXNXeTZoL24rTVo1anFqOThaWEsrdmF3SExHM25Oa3ZzdlFQRHRkUzhuTkRsNDBrSWNKOUNaZGcrODJzU0FOWmsvSUdXaW42c3FBNHhsRXRBYmFsQkFYc01xN2tEdDA2ekppY1QvSFNoNGZhUWtRTEJLY1JJNnVJVUFGbDA1SGpLNDVwSlk1aUxXREVUd0FLZzlnckNsVnkxMXQ4QTgycEwyczRKZDVjYmdMeHdvMTV0MWpOeUM4UXJFb0NYWnZRYVZ0cDVxaUhmNzRsZkhxaXltdjJ3QjRkbUFJRXJPaGtxQzh2VzRVSmRIUjAzQ1FQSUphSjAzSzZ3L25kTW8xQzZsSGZabmJJaHNXei9tVUVWOFpKNGl0VVc3dG1kLzRlWjlYQXFzUCsrQTRHQjUwdHJSM2FtZ0FGVFNpN2F4UWJDM3g2RWpwdzlQTlB1K2dOQ2Evajl2S1U1SEt2NStRMVdwWHQ1dFFHK0dSNmg1cVFpL1JQNGY4QnpuYlAxSDdNZHBGTVI2Q3BGTUN6U3JoMDFPQm9ra3krS1BkNXlKZ1E2RnFxUEV4aWtxbVlIaDFONVpueWpmZE81Uk92ZWZnTmwweXh5eTljZmI1UDV1LzBBdDFzbTllQzNHeUJuY1JnNm41cVVtb3R5eFlseld1UTN6cGljMHZEOFpqa0lTeFN0ZVNaemFMZlc5SFFKdjZsbm9oVnpVV0Uvd1NzWlE0eS9qZ1NQM0dyQTBsTnJqRWpFYUNoTzEwTno5TUcyQzhsL0Y0UDhuUnlJaUVremZZVEVnMk5zZXBqaVQxU0J6SlJFNXRIeXlzOXlqUitDUiszenNVcjlueVhLdXQ2Y1VKaytzYTJCMmwzcUpWVkUwWmtUb0VjZ0pjWGhBcTlvSG1ramczQmc0VTlMaWRDZjBUMHVVcTBPNFgzdWJwYzR5MzZSWlVLOEZEd0tMeUhudElwL2lJai9sWUZWZk9wZXdmTDZRaFlVdnhiYnZTaTFQc1VVbm9FcVNEcThlR1BJUE9QTUhQSnJoMEJKRHVDMWlVVWZlbDdzcDNpZmxFbVFmek1qNmYxTitTSWhuU00rZUJ5NFJGaU1KWW9SMkJZM0NPR2ZlZk42MmlkTnFtOTB3MXlOSUY4aERxRk1GUmVvMUJYdk9BYVdwd2FzdUdEcWJ2NllpTzRrTnpteGJlWm5kZDlEOURReW5sZFRQQWFLTFc5VDFrcHBsOE1PMWNPcGNlZ3RaWlpjM0pvcFA0dURSU1hNb2pQbmpqempWOFdtVUFmeWtCTFdJeEl3ZkUxOHYrOTlwK0E4cGxOdzFVamQ3Tnh5MHhCK0RHRGkvYm5nQmtzVmJGbEd1QUcvaCtHNVZNYkhVSkIwY0F0TnBUT2JRSHZKY2VOczIxTmFMZ1FsbU10K2NEQVJSb2YreXVOTzU0NS84bkpFQlRrczR5T3J0TXhoeEdlYk54R01VK2FlN2NIZXZ2dkRYT21Pd2pVKzBXWlZqQ0hPUzNFM0hjYk5yQmhva2hNU1NxSWhiU0lFaTFWRnJVUWVJS3JvQ1daeHZmaU43T2xCNVJueTgwRCswSnVxa1liQ2pWeEpuS3plVXFGalNuWWRmVXVaU1o0YjFsVDBOamFwWGE1Y3dIZkZXZlhQbUk5WWNBMUZhcDRLQUZUOExyaGt1MUg1YnM3V3ZGdXlaVFpSSUNyUzJNRHp0bnN2eHNXNm9sa0REUVA1ei9GUGtNTlN3WXlTN0g2NVdrMStsWWVJd2xSMjdtZk5zQThyS3oyMm5iUkJXQWNWc3p1UkJOWlo1Tk91RnEvWGNuYVdJbmdJS1VGdW1QbXJsUEJFSHNWODUzRlBOKzU3cFpMdFJ0VW5DMU1RUDg4QWtidlAwUHNYQ0xxd1FxRzFsZ2oxK0hJSlpKdk5CaDU3RmhYbGNXVmgwMTNibmkvamtmZFFSWTlFZEo0YkRxVzk0WXlQcTM3emdCb1F2ZGVYSmVvWklIckZyTWxUYWxpV01EbGowTWVGeDJHRzgxM3ZJU1JHRytXbi9nY003NHRXMXk5NjNaK28zOVZ6Uzh6R1dvWXpjbjRLdXNEa1B5bXJ0Szd5SkQwUUEzNkNuZHArcGZtMmM3b3Bmbzg1clZ0bHp6NWN3LzNDSjBIbi9GUGE3enNxbU5MMWF4cEVZb1RHU3pCYU8rYU9aSVc0Zi9EanhjN0ZZd2VLTW41V21teUc3dDg1VTNSQjc1Z2g2SnM3WGs4aC84SkdtY0Z6eHNPRHRNNG50dHEzMEpZTE1zbHFjZEpzaVBQRytRVHRCbEJqTVVoeW9Gb1BQUVBkNHpuUUR0VXhISE9oSmFFNCtUODN3TU8xTUdzaGxqL2oxNHpiT3ZhRlJ4VWN2NWZBZnhVL2dKeFVySkRtVzQ4Q2pNaVNKQkw0QmU3YnBtMnVZU3JEME04d01rdXhTY3NPWmNVZDR0TXBnUFRyTTJaNlFoNytETmE4eDgvalVuYmwydDIvQXl5WmxSeGx4NmI4SlJjSnRId2RORjNNV2JBTDBnZmkxL3E1L04wUVpJZ2wwYkRuSmYwckE3NUNUNGc5UlBUbCsxYnZtSzVTdEE3dFpDRHQ5ZUszQ3hXS0VBSzVWQlBuOWdMckMxeTNheG0yZVNRQlRjYTYxUUZHemg4V1hnQmxUOEQrNlBhVjcwbUZjZithb0xpbW12TXNFUnpjR2U5d2hYbEhyUXB6NUhhOXJ4UUtNOVR0bUpGZWJTNlNzQnRaSzBvcFQ2WlhkT0gyZ2pjQ1hjSHNnZ2w5c3Z4bFhUR1ZuWGdQdGZKK1RDVnpaRFZUbVkwUzYvZ2lYQVBGaktjSjZzY3FlKzM1ZjJ3dXdUQnQ2c2JjSzVSb1hRV3Y0NU5qRDBibXdtcDVhS3lXMVAybmdpNy9wY3pXREM1UDJQNWtwNVZnbFlSMklGekJINXpSajVsY0x5K0JPNC9YTkJ6Vk85ZmVMTittb2lXY1M0QlNzODZDS3BqQTFCVnMwYXNkOUNleE5zdE0yWVFGREt5c1FITmY2Ry8wN0tyY1Y4MU5NQXdqVGRSNFhhOFNFWVdBdXRHM09wSkhzMmhqMUpYTFV5OE5vRlByTUI2UFJMY2FuWitZRUZsTUhhYVZUMHl2R1FYamVxQUVIMUV2RmsvSU11WGp0U1BuQ2g5MW4zQ2tBQndHSzZib2UvQ2dDaGRBVXF5S2xLV2NsSncvZ1hiREo1VkEzcWNzMlJEUEsyb0YxdThJRWZKdWhnUDk4V0tUaXBRWGs1dHo4WEdBa0lPLzhiYml4aVFmd05SSjJyeng3aE1JVytUZm1zUU5NQ1VJcytEbTkvTlJ0R0xNa2dFU2VxSG5BY2hxOXpVR1dvQnY1TFNCV3V3QVF6MmlTc1ZaaFcrTHNRM3BIanZPNUVCVHV3MHpyTlBHa1pmb284eTF5M2xPdXZkb0RNZzg4RVVpSUFWd25NSUFVbCtOUFFMcUNFWUtsb2I1REpTRmFvWDdDL0cybTJrUmNWSTBIZG9hZFdtS0hGZlRsWU11UEhoUUp1cThLb0JpcTlPUk9rNTMrc3dEQ1NERnU3RmoyWXFoNVJEUVJpWjk4aENZcUxPWkVxUFhYM0RsSGVaR3VKN0ozc0FVcDBucmc3YU9DYWhlZkx1QkdhWENrMjR4N3hCWlZLVDd4NGZ4ZUI5OGNoWEkxKy9Ta3RHdDh1Q0x1TDVFaENZNTh6Z1hTZkszZEFUSUZEY2NGNnU5eG1HV1BtRk5wNGVSOGZ4NEdPQmhpOWdUUklWWm9wdFdUVGpIdEpFNHB2M2lhU2FOek5NcUxLWXFuei9hYjNxUG1IZVUwY3YwV1hxNWR1cUg0UHRoc3EzM2pSVjlQRjRrQ3RGMFJPUU9CYnczcGFTZjhRMjhmRUhRbTVnN2JEbjJCV2Y1TjhPQjFBNnl0REZqL2JTSFJDVVBKOUV3S2hRM1ZPcGtBeDN1aXRuOXgrZnpLYWhMZVY0VEp0NFdvTG83dytUenliL1lMT1BreFN2VE5QMkh6MEl5SnJiNDF3cHV0U0JQbTRqMWE3WnhlRDZNWS9GTVhFYTV4SDJoRVdFREdKbmdyU0EyZE5jdnlNNDlKaWVVYWpUNHlLYVl2ektmeVNLbDBHdHh2d1pTYWMzSFFRYWZKbld5c3NKUXJHYTVudGRsRFE0TGVaczlZTUpGVkt4enhBKzBzSW5BL0VqTWdlR1Bvak9VdCtYeUcwcHZ5NG80eXNweWVVN2V6SmVVT09QSmk1dk83RGRTRmJxNkU3R0NrVC9heHVmRVR0eDdKTlAwUkc1TDl2T0plL2UrL0VnUWoweG01bnNZYVljZXFtN09YbHBkcGN2MThOaHYyNUt0UFNRYkFzbHhCRWNvcEpxV20vbkhKMTkvbnFSU0V3S1dsVjlvaDFBelhXdit1VDVCTG00OHlGdW9ZNjRUczJQUkxhRFVEK1NzRXdWUTBLOHRGRTVPaVRFS0NLeVo2UFFtQ1FPNE92L2FCMFNRYWl2Y2g3OXlhU0UvM21KT0l6YkEyR1dPZEw1b0dzTkxzQ0dzR09HNnBjNFVQUCtydXkwUEhPNm9HSlFDWnNmdlh2NklEaUNBMG8yQ1JZQVVnbzYxU1dBRk0vdVRydTF2c2FxVmxTOG5VVmkrRkpJVCtmR1g3aHhJYzRkb3gvTE1nVmFPdEZBUlBRVjJqTC9hZGtBMmwzblFyYU9teVR1d1BLZkU4eXhOQ0VYeStrUHBQN1VoWlllYlJNZC92bmJBZHpoOGdsUlNyMFhpcVJKYm1STStTNWs5WllobDltUm5lTDZxaHFSMy9DK2w5NU1DZkQvaUlmTXQrU0pkOTRGLzkwUWh4ejlpZGJpNDhGcjc2MlNMNnNlQ3V1bllVaCtPRXRta0FNREpBU3RxR2tIcFVyN3phS09Tc1gzWW1ERlAzNHJEQnR3dUoxTnhBZzZoZVR4MkV3d3gwYlBsSmx0SHpVdm9wL0c1QlNuVkt2OHUwdk9sOGF5U09BQ3BBS0VteFUrUkdNVDNxY1BYc29LZCsya2szN21tMlpqN2JFUzVuQ29PT0hNNE93VmxIWHVWWFEyYUNlczNWcXV5dUhreUNrZ0FFcFU0K2VKQjM4WXJLNE9OaG4xY1pjeEVpalVLVURITE1iQkRLc09rV3FPTFd1WXVUM0REakpQRlN0NytVemZ5Y0hPS1lTbmsxZ0VWYS9wbXY5L2hpWlFuS1hVUFhJWm9zci9WSklLUEtWNmROOVpReGgxNEtDaUROQnhGc1Rma09CbnlyWHdTTXlOVTBwMHlrWVc1RUU0OVNoOC85VlhJUGJrMmU3TlBWQ1FwbXBVK1VyK3JBNm1BMXlpK2ZrNklPUlNRcVZHZ3RpTUZsbkRsS05IU0FrNDlSd284ejZUNHVrVEd0WFp2R1dUT2h6dGgrMzVRbG5DdUp3ZUxNdnJJMGQxY2drblBITWE0OUw1OUFJT3JhSU9FRWFyRGFheGFxRDFPeGdISVNoSTJPZjBmeDFoVWdkSUdNMUZmSWFwT3hNdS9jdXprZzR4aERzY2ZMbTlZSThhN2JDYmhlbHRZNzFIZ05DYy9DbEdVVFNMVE9GTlNMbFdjUzhZd0dETG1sSGFhTFNKaWdZak5TT2JFakVJWFdTNjAzMHl6N3pFalUxQldTUk1SbW1GSHZLRW4vT29WdzI0TWxKT1ZHSkpVcTBPV1JMbkhRL1BiTGNnTzNqS3h1NXVLUlFuSWJsQTFaZjI4YVRYbnFzNGtyODA1YnlXZ082U25Ed05pVWlHMWh6cDFaNmFxc2tjUFIvdjliSTNDdlZ2S3ZuNFdRZGovMFRwZHRpNWZLYTdPeFJmMUdQMTQ0SHl6Nmlpa1hvWlkwcEkwTCt3ZG4vTVhuY1FrUFlhdVoxZVZHVkZ5TmJpajBJWnByQ2UzcTBLeWxVSERXN3BDOWRYR0pEQkhtajQ5NXhWMGhHWFl6czhWUlJlRWpPbURNRzAvMGpXSGhYSThvZ2J5SnNDeTFJQjNTYm9XN0NweW02ZXo0aTNIMHlxWE9ISnVUWVdnaE9EY0JlWU52TVBISGQ3R3FTQ2UvSUd3M3JuVkN6T3RBcjJEYmhHY3llU0w5OCsrdDZTYm5VazZsTFN3ZS9DL3FucjJDWWVxR0h4RFRjU2c3TUhZZ3ZRcmJxUkJvQ3ZBZWxCTUVXNHl0c1cwVVRyd2M3U2VKc2VPNndoVituYzFGV3NtNC81aUdDZXlnNHA3NE9haEdtTDhKbjZ5ZUhTLzJKWGlLT2N5OTB3aTBtTzNUUEZhOXpLUXJVbFMrRlAzUlBRYlloYWZQVHFOekZxbG04Rzd3d1VvWE5ja1o5RE42NWtVWlVvMWxsdjNvL1ZMVThHR2FJSW1ONTRCa3FCM2ZNZ2dsMXNTU3Z0YlhkelBmVkxNNCs0M0NVa1RUc0RWUDNwUFVCa2R1L3doeE5UUG52VStLdmp3V1o4aG5Tc3BFTitFc2FwVHhwYjJnODBXTm5la1QzMmFwZnphRzZ5Q2g3RmFiSFVQK0NjOWd1SzYyelVuQUpBaEVZaU5KWlB3Njc3a1RhQjMyakhDVzBUVEgzczRwWGlNVEdPR0M1M00zYUM2U29FL25SZ0FJMjJvRHIyZWhiMWJueVVNd05TNXM3cjduUVdobXpERDBoQTkwT0ZPazVGbkVaaXRJVkY1L2RrR2FTb1JMSWl5OGdhTVZtbUFnRk1aNXgreFBEVmxMQlN2cmtYdHJFT2t5N3dKTXNkVWhOVG81NStwS3hlWXVOYVNNL1AzMjFGK3hEdWc0NC95cmE4R0k0ZWNDbVZldE9UUHlDYzZjTFphdjk2M3JGbXpDTnVaMC9jWUNzYXliN2pHOWNDenhTT0o3djk3K1pla3BmOGVxcW5ZWEJsdkgxYjBVaWMzR2lXcXBsamlkYTZNWkttdElvN2o5cDBPQzBuZnEvZFhNUUR6dVltMkVRdWpXSy8zMzZscXBhM00rbThtVFUvWVVzZzExSDlnWXpVZC9vWDJjb2RiY2RXRkpxeGVpSnNVcWRNb284NGVLSUUwSWRucG1GMmk4R1NiaCtLNHF3MmVxdTRCWSs0dkpSY0FRcGF3WEhTMG5uTmcyRGU5NzczZHdhSEtjL0s4a0hqSVYwdDdiclg2K3VScjFOZUUrRUJ6T0pvMUFwVkRscjlJdUtyTThuT1plVFNXaXQvVGVhMFhDTU5uODlsWEpXc0piNWxMNnViZEZpN2o3SzNXNW0yTFBaVC9QUXcrUCtJRXJuM1JYRkZkTmRhcWc0QmpzeGY0YTcxTWlrUWNoVDF1L1I3NHVuVXNpNzQ3WXB4U1E2bGN0QU5KbndPWno3Q1c5S3NadS9PcFJ6aTVLZFAxMElub3BwcUNuaW9xRW9KM2pOaCtRbmt5aVdYbWNUcy92ZFRveGcvNEFWc21VUFRZcWVSSXJhVGowM2hRdllQZ1kzdEhadEtsSG5WWVZrZFFnV0NhTTdXRjFLVGZmclR4bU83TVVmaGcwZEpLbmx0cDF2VlcyZ2dDSnlkSTI3WWNycGtGRi9zVDVoTGxJeGExeVBuVVN0YzhUdlROazY3a05ZVEhYcjVnV2x2VU5YTDBEWE91TEJlUFRSUEh6T0RLL1hsdEZPRWlSYmtQTGFxWUlPQVI3MUxTVDEzQWRmME45elNmRll1cmg0b2s2NlNpS2tab21NMnZpU2VzTzVWbm04TkM4aytHSS8xanlUYndpcUV2R0xuQkFOaGR5RGtWbm9QR2d0UlRKaVk3cUlZWjVNeXRqdFUxa0djRUJKTWRkcnJveFZEdExvcGlWRlNEdm1tU0hwdHlYZEFGUWpxZEZoRnFPNkovWmJscEpBRGpHQnI2VENDc3R5bEc5VDZhekViajArNGhMUlpwY0hiYUxrQWlzV2xOejM1THhOL3BmSmR4bDMzTVFwelNHVHp1RlBHWkp3T2Y4dHBsbzZ3M2VtOTFYSXZ6N2JHMFFGMnFqRXBOQ3hxbXY3RXFUR3lPZmdUZktUNmVsL0wwTUdOVjRtY3N5bHpVMFdTNWU5emRSaWhPTFM2b2Vnc0c0eGx0ZHlHMUtFb1M0VWJLRHduR21pc2hoM3JxeGxlQUx0Tkx2emQySXFiQnBETUU1T0Vkd1p3aTBvcHB5NzNXcTdSTmFFM1NIRkVTQURJTG9BZSsreE42bkV6VVdseHBFeDRTd1BZMTk5eWswSTdKUm15NHByWTBJUEJxVjEveDBVUUZPOEtCc0ZxbEhrczZmbEFNOWl3eTZvd1IyVzBncE9WSGdXeThycXBUcGsySEU5SkVpTTFpcFMyVkdRQnVXT2pmcnYzMmd4MkVJWkxGT2ZOdW9IcFNXbnVWTTRSMStEVXEzUGVHdFFDaVo0MkJqTGNtT3dHNzB3TVdRR2swR0tUWHJlMXdoK3hkTERoNUNSN1hxaitINlpSdkpFN1dWK29xVElvSVZJQjd3V2I0cUlDL0xxMDlLRWZ0eUFxTEZMOUlVT0hkMjFrVDV1ckc1Y2JDMWg5c1dnVFgzNGtDRXN5ZnpuNVl6aS9KVDhmaHUrdGE5Qy9wQ2JqdVVNM0l0RjNFeHFmZExRTm94WGRZd2xIY2cxV2E1cWlkd1lsS0p1YloxRnY0dWJHWlBpZzcxV04xRllzNy9hNm5rVTFqUEtKRjZoU3Y4alJFL0d2bzFMTUlnNEgwSzBwaFVhV3JpeUlJK2t6SU1JWlo1eGJVaC96Zm5EczNkU0xPQ2tXN2VKTTZ4TzZhQUR3cU9DRndkR1ZEQk41bXBmekR2OUt3ZEM1UHM4a01lZTB1MmE1b05jTXZWcjNxYWdtdzlrWVdRQnJGRGozcFk1UlJ4R2IrbklsSWtqZVlud3ZMbEFsRVZjaTA5bmpocGVoWEtJa2hsbmZwbHo5Q0FmUTdNTEU4TVZGYVpDR1B4VHoxWmpGR2JZNVRzNmJVcS9mVlhrUzZwb093Nzd0aDNOTGJsRW1XTzJMcWFBYTdlYWJsNE9PQUg2YkNEOGw4YWVJbkVLdjNnL2VzY1d3NmRPV2cwMTByQ1dpWjVYdEpyUEY1c0lvY2s5NkIzanBLRlFETGhQV2taMUpyamVZZ3dFODFPTlI1Z1pETDdRdVliMXpabXRoSGNNL09xakRXOXZzZmlNMTJOcm1PRXBlbXovVjBudWJ5clA0cDNhYTVHUmViOXQrcEYraU9RVkx1MmtQYWg3TnRMQjk1aFU4Nnd5Uk93a2h1eko1aWJDMDE4TXM0ZkcxaWFRR1g4aUUyckhkTEVLTWR0ZnpOV1RPQnVtdGlvSFRFcFpsY1pPbGdJdFNBaWl6d1RBdGpMZWdzdmRrdEtGTkQwckNIR21CQkFyQ1B0VEZoYlp6dTFUTTVIUFRoVnpEVmdvVEl4WGxITlFnejJENWNQbm5IMFY3Yk9idjlnZG1DTmhnVnp2V0laSjdlT1JwVE13eFB1WlZSeHlrYXJISEd2U3hSNCtzZE10QkhBakpJNWNHQlI1RmxhQ2QydjdNMFVEZ0JJQnUvaUN1SG5NVWRER3NuWEJYMTBFalB1ZHNseGcyc0lMSWJUVElVenNTdnlHa0tzOGV0TEVjVWlVWnNkN2hSY2ZvUThQNVltZENvMjJ6Tzl0VGtZOCtoNlB5ZTlNZXBmZTl5R2wzTS9kT2hoTGVERlkwMFJXTFEvYVNhZ1ZRL0RNWldnekRFOTc5T0ZiRXQ0MnhXTkdJSS9FQWNBeUVWR1J0YS9PR2RkNkJrcktIbVpjNyt2T1FDQ1N2bHA0YVhrN3FnVWFLVUoyWXE3TGl4cHV6blFXTXl6QzJtL0RkSWc3L01xNXRJejRjVFNadE9CU0FKWnBHZk41THB2VjVQUXhSWGVoS3EweHRsU0VFOGlMUmtMU1ZZRGMyME5jNkg0ZnV2SDdudkpTdzdBOEMwYVcyZHRDbHpnM2F3Ym9GdVdMd1FLNzRnQTdpblBINmh1Z1lFcUhFcUt0S2lwb3dOb1BRTU0zZzMrRk5aTjhoM0w1enJzb2hUSHpIWlhvVlZsLzMzeGhsQ0FMMHB4dzFab3JabEp5Z2JaTC9DWHFrL1ZwcnZ3WmlJeHlzV09PSXkzU2liT1B2S1JUellhTGlyblBKa0RWQ3cvamZ2YW5CdDAycWp0dEVnYzdqK3BvUEFpTDFxTWZqL1hjb2pCMnFySUMyNjFKU3FhSnA4TDZiQUptTUtMVGhQcXkreWNHZVhqWlAyeHZrUDFwTk1CMFpKYVNudHpRREt3MUcwNkRYSHdRT3A5d0Q0UlVtaGpDUm9xT2FtRVc1Y0ZiTDZUM29pdTVtMHowWk9hZFJOU3hWd3VRcmxZYlRzckN1TUdBRVY5VnVsZHh6ZEFuMzlCMkppb1U1Tkc0eElZRTNzYzRvYzFmZ1VQRFFEb3d6WU56RzgvNkFNdFVtQzh6T2F4RENRKyswdjJwZG9ZbFppRDFvbFhDWnlRUHkvM2RnUkhhbnBaUWxLdFl1djVRbTNyR2dFUEhBM2xUekVxbUlCT0lybEZRM0tkVEg1djlMY0V5QURhSzRTL28yMWk0N2gyMHJKdXI0djVUanh2djVTMlZzMkNZTlcxUEh3UnpERjZKT0l4YlFXU3UyWGJ3bS9sU09DTHpHUVkzNWJxWmk1MmtUdThvbVNKRGF1ZDZEcjh5MUFIUks5KzJYblY5bWJoSGJZek9VYWt2ZGgvR0FIZmxtYTZRZVZkc25kNVJkWTRtMlhaRkpCbmgzdWIydXJYOGkydC9TM1NBRUJ1UXhzdHJmcnFqV2lWMGs3cTR1TEZEWG9tb3FvcDd3NUVpV1d6N1BmcFUyQzJDRGhvWmVsTHZqMXBsZGorL0VxbDdJNVE3U1B0Rmw0akRzbCtaRnNvcHI0NUw3TXZDKzRNMmZWMkc3RXAwNzJORGk2SjNsRDdobTdvL29DM1p5a3pXelBDcml2OVcxeWlDRUdlN3N6akRMQlZCM1l4dXI3U2lURXdBSTB6YkthQllhQnRlT0t2WXlsanQ5MFNBUGt1aUhNYVNsMTRmU3ZOc1Zzbnd0bEhSb25BUm5Wc28vTGVVVFFaR1FzTFJHOXZnUmo0bE9Zd0xnaHd0VmZpWWZVMkp3c1gyZzVCK2xpTkM3WGRiUTVoc201OFdsQnBHejhyRDFlaFUwSXVTM1ZjMU42YThRdmF1M0xzcDY0TE5UZWVBOHZXWDE2YTcvQ2VNV0grUkJOdGdiQTZ3ZGxKTlc0RTE1Slhoekw3WFJ6Ym1HM0s5YzYwaWhuZTVnSlRTMm9xcGx1dXRoN3VuTjl6NFlydUN2MmE3NC9IZjFxcHFDalVCTVZjbG0wM0RUTWVVNnBWYzd3WFJRdlBNTEVIU3gyYThsSk1TbW1aNjJNdDNHNVFuTzVMT1U0TUFNZkd3TUIvTjZlbmFRMGM0Y1dVWUJFNEp5bTduWlp1bVhPQWdBM1NUeDZlRGdVblhXWXlIU1Q3L013VFRHKzFrZlpIVVBVWGpnRmJURWdBVTVLbEVKSDhBVlZZbG9wVDhRKzVPd0RyUWlFRGlHZDM1bEpJV3NteS9sSHBzeUxaTG5pcjByekdVdnBpdUt2Q1htRjNnZUtZSXdsK3haajVIalNmcklvUDFjaXhEQm4veGQ0OXN1MHBsb3M1L2pUR1NNaS9Jekk4VG5JTmFIbTR4K0gvdFYrRHdUUVEvckhCcnVyV3dRdW9oOXo3RmNIMVc3UU1YejB3UUNBRTlHYi9POC9Ld2U3VTIySzJOc3dVWnRCQmNaVzVLeTlsM01qZ3ZHYVBuYkJGM3dOcXBuOEtqck1CM3pSNVdSTkVCc0c0MVJQZXBjVE96UCs3S2pQMWNDVm1ZcXJmOTk1UlBOS1RMRnhyaTBuTE1wRFlxSXBENG1Ha1lzbnJWckh2NElkd0diRFp0Wnk4amJuSGxkdjljRTJCTlhQV29tM1kyemhtdmtuWjZ2RnU3K0taSGFOS2VuYVg0cDBRdlpQUk9XdjhJWDVOZmwzcmZpa0NVYjViS1FjbWxtWjkxenhQQWg2bjViaDJFdUZWaTFjandybXVXUnlmRmgzZm9zM1RFUnh2MEdUSjhxMUxKSThYRmU1dDJ1MGUrZnc1VTBFb1lESlpRcUVKcDBlU0E3UWR5NE5CRG1wUTBFUDNGSi9NSzR2WEIyRUFnT0tMYWt5Vnh1bXFxSVdSSDNVY1lYek1KYVVKc2hJdzZEdCtmMHlkWU1acFRPRGxXeGsyTWdSZU9SeU90N1dsYXlhc2FwaVdhckJPMjBPdFJ5eE9EOTg4RG9DaXJzYjFGUk11dTFwcFpnQzh0N0syb0VQTjVPYVJrTzBXaUNQRnh1Szl3eHdZQ2kzNGdJWnQ0Rk9kaUtwUFlZVWhIMkxUSldrdlRMaVZ0UE1iVjJ3Y2NSU3RIRmkyRVk5TTgzaG00ODQydWd3K3lLTDlIdEh0YzBLL3hST3RBcnlKTHJtVVdnUTB4S1dZeTBJQStjaG41YS9jUUR6cmVPVUpJQTdiR1F6b3RaclZ6bTcvdGorUnNVU3NVVWluWUZPZDVPWkhCeHZiWmc2UWdjcGdwdFU4TUhzazRLekNBOVRpM0lhOC9JQzR0RmFwZGNLeTNqZ0U3U2thWWovOHBRamRTaSsvdHkxcGZsb3U4TEI2YjlHb1FKa0hjbWtkczFCTUN2a2twSURSbU85MnNQVXVnUFpsWjczM01JQ29xcmZIakNNTmpmQ21UWi9VNG9keTRvK2pLT01SeXdXYXRwTVNzY0xXeXVGTjBLV0lVc1BiMlZsTENFOVZBbFVWaTBuOXRDYmsrSkZBcHVUd2tpRW9KQ3VqVzV2TndiTkN3dUZOMURvakF6dnkyVjNTeTZHaklOTnJBYmRTYlF1N2FYeG5LUjA1RDdHZVZXVDZRaytxQ0pWV01Mam80Zzl4T21TbGhiWnFDT21oem5pUVA3S1J4YTFBUjArK2kwdStEWjVxbjYwUTBXTkNlc3k5K1ZPeHJNM1phTkc0UE1oVWdaenhRYmZpMno1Z0txYnhLVFFkaXZRTVF2UUUrNzhkMTRobW5IRzRTRFFjS1k1bFpHeTFLbTJWeU8wU0RockVvZjdYaEJnU1ZjZDdqdDd4TXJvSzg1VHVBS3lneGhvUE1VZUM5aDB3Q2F2S2FTTnRRU3BoVUJGWmtqZUVpNGcyWkwyaXR2WG9RSnUwMFZseFE1VmVVcmVXS2dTM09jSTE0bDJ6VG1ZZ1BvaTh6VGNPRlYreHAzYnRqNHlidmoyTS9pdDJtN29sdjFsQlZBYTJWVXBoY2xXN1RGUVFjQ0Njbmg3ZkZNVko2Z2JzbG5VNEFydEtFcG1Jb00yd01oYjUwVlFnYThnU3k0M2E5UTZNSGFZdXMxTjJObGZNMWd2TzBWOHBpbGdmVlNnUVpZTkJ6T0dRUVlxVXMrL0ZmZkwwUFNlN1FUaVB5UDBwUnVsN0N1MFFYU2ZmQWhpRWI2elN3UlBoRnhMR3crOHFSdWFhZVNJVUJtTEkycC9yeHR6a0tJaC9qTkkxL09wbmxSa3Q4NERZSWhXZ3JwUTdKdHdhd2JWMDNiRkJpTXYxbytWQi93MEQwWjM5dVovOG0wYkxFK0h4dDZCZ0pXNk5TQzA1ZTVsUGFGcWUwdnQ3d3p0QWVQays1YVdYaWFoZUtIbFl3Nkt6WS9sejRjbEpnNEJHVEhVczJveWN6dGRWWTN3c3hzdC9YWjB5M0J0ME56bXhycVBmZTNvOG9ZUXN2Qm0zNTZjR3ZMN1JKcGcyakdrTHBxVGluRmVBMGc0ZE1ObDhYMjJVSDhyTWJBZXJzZDRMVFZ2bXhMaFVTNnZSbGI4bVJXeWIvUnFybDZPUnhCQ1dZUnRtU096cFJwY0I2ZjlXbyt0Ny9DR1UxTVNkczNnMXF5VXlzQlRpK2t0K2s5N2dTc3FnSGJzRitYYzVBOVpubGdtMFNtUmIxWEl5MDhBSDFsUkgwekt0N0d1RCtoRnZOaVRveTA4WncxUEpsdEZRaEJIemNpQ0dCVjJaZ0YvMlVZVlhYL1hBVVM4YURaZVRET2UzdkdMVmYrcGlsUEF2aXlrM3liK1pNR0JGUndGUWx5eTUzcytFWVd0UGFxaTAra09oMXdWWWgwYmh3UmE4Zm90L3N4UzRreTZJL1VmYS9sUENKS0pUSFFLY3hCM3Vnc3FnZDZQR1BoTytIUzd4cCtJRDZIcmpJUmx0b2dnOHU3N2ZpVnNlQ2xMTytCcUN3RmxVODJ5YmxxL0lGOEdxWVEzVWthQS9vVGhDVTZoTTJ4UWdvRXlTd0xLMUgrUzRKcGVMZjZqZkNLMnNFU0lxN3A1ZVBlVVA5dzNJL0gzaU41bXpJUlpvb0gycTVTbEF2MC9BdlUrc0R0bmJTOEhkYVFEMFI1NjZlc3ZmWGhxRUloTUplTWlBNjkwdFlkc1dCa2xvc3E0ckNyVXoxWHhWQlcreFdUTWI0bXpCaWppcTZwMG9lelg2ZkJUK0o0QVBwOThnYnNJQ1NqbXJkaUtvYVZZaFVnWG9xTkdHdXVkUDlqL1FmU1pPVGxLSDBCbGhnQzViWWZ5RzMvaVhQUWIvd2hqcXJva1dXRjNLeDY0Y1hUcHVGVGtyTnlhRlhxelArRmd3SVV0Y3VhTzJMMks1K3Zta3BONzFUd2VSbHlwZ01VQ2x6aFZtM3RKa3ZOQ1k4TXhDUGszN1BPWXF3N1NCZmVObVRNRHdYUTl6NW0zTmZ1MERiU0MzRGQ0aTBGVU1TbVNuMHNsYnNKZ3g2NG9LQ2NvU0lRbGhEWHNSR1hPTXZPSlFZREhHNEYrMXk1RGd2bUUyNkpmcWxOak9oWUEzdnkvRktwNHE2aVJpeXJvVXUyeFo3WkpxNWxES055TEFJa1M1RlRuSUt6NXJyUFRYVlkyalh5TWVwNUQvWGN3MGV1WEY4My9rZkJRdmZsK3Z4YWoybnlLV0xuTlI3NHhYeFMwd1QyK2F3OUhjLy8xcE1WRk1oUzI0aWF4dEY2Q3F2VitYNkxSbTBrbjU5VGVYR25qZy9JRDNTSHVONFFpdFFtK0xzTjUzdTdvcUxPYXdoS2xQaDcyc0E0bVVOR0VHdmtvTFhBeUYveFd6UTJyUjA3SHBJaTlUd3JTRkxQbHRzK2pSTHA0WjVibkxnRUhBc1huVStsQ1ZUNVFOQnhYKzdiQjZBWnNiR2NtbEhQVzUyajVFaW80N1VCOTZVOHdqQWNRcWtNakV3QXpEV3RqNEdGSmVEOTdrMEZ3NUVzTENvRFE3TXRpL1pkZ0hjRlVWejZoWTlNQ21laTlNUFZXMjFDbW1Ja0c0SFF3YkFHaXRVRURld2dTR0tRek9lWmpEQ1kxbDllblFyNGlqV0tIb010WmJkbHV0WkZnbnI4TTFCRkkzWXlqNytxVzBHcFJxM3FHVHg2QzhqSVdmSGEyKy9UWGd0SktLbXNvQTdlT1ZFNXROWExwVXhjUkQraDhvWXZjZmVOUmlySXFNalF4MTlzVENVQXpDWGFPTFRPd3FrRThKMi9DNmpDTEhoM2QwbVp6MS9mWkNMMk0wTzF0RjhTbUJBNnJwZVUxNERsYWxRZEpDd2E1QlZGWnJRREJkeXVYWlhjQ0p2S3ZMc0tKUEttcTFIUlBuMi9kR0xsK2w0cU9MdFVMZzVnZnQwQ0VnZ2NOWnAwWEFjSDl1MWhLNEZrRFkxUTNBZEZSN2V5c1J4cFVSNUNoMGJTMEtkN1NQNHpDZUZub1ZYSHJreHVGazhib0hlakVYQ0NobzYrK3BzTTM4bnVuNExUTGpTQ2dkS0lpSlBsWTV1dkZZNFUrM3JwOE95UzI3WVF4M083U2ZxT0pOMWxHN01OQktLV3NhTjJDc2MyRzN5YmJkeFhNQ3doRzFmV203TzN5MlJHYkZ4SktNK2hpaUIvM3BYVUZ1TDZIS1I0TEJDem5sVTRaQ2ZyTkZsdVNzdUcvcVNLRG0vRlN2Z1g2d1ZuWFpvOUN3ZVhXcmNrdXl6d2tVcFZEbXBlWHVlSTFIWDZWbWtrOHRSN3lZanVVK0llbWNmQVR0ekVVQVdzSWtUdUNHOStFeDZhVUlrZjA4c3pEckowNDVsQzdWZ0YwWG54ZDJFREk0ektpbGRoVTBGaEd0MkVUWlRBdmJvYXZKNVMyMXNPQ0FrV2tLSlFFTndXOHNIZDIwSDMySnRJM014K3hSK1hvSjh3d3JmMlZ1MXVTZ1IyWVdYM1ZhUmlmdkNBMUZHRGdUdWtoT2tDcU12cDNJWWE3WmJBaW1vL25zOGduTWJpVkVjZVM2VUU3dzRsWjJiR0hCTUZ3ZjNBQ3psbjNha2hRd24zTSttdXdROEQvVXFqbERaMm5nVDN5cHVFWCt4NlUvQnlieFlDSWMwWUdlUFZNYmtoYUpwWUM4cFJieTVySGdaM3hrc0VlNmpHd3FtOEhmWkptU2FWdUpDKzZLaHdvT3NJTGhNM2w1bE1lT2UxQnpUTmwxUENUN25UMk50aFVETmEyamtEa3RXZ3JFU2JESWwvWTNMNjFkdjdUR0lWVEhYWEpVS0swa21HbE5HZ1ZUODNFMkQrZ3ZvV1NjMUFudkVkWEJQMWpnLzc4emd6cW1lc2M4SjVyS0lIYUdmK2lTSjBRQjBNUkpKMjVJR3U3OU9tME5YQjFod0ZuZXRLUGVPZDdvUGllWTdmMnF2Q0kyQkJrV1V4SFR0OGx0a2syeThLQ0o2UE0rYW9qSm1lakJYcmlxdzMzOFNSTVlibVd3UjVtTUpqcFpuWW4rNFJzb1hsTExDL3g3TllQTnZ2QWZNSFFXVXdHakVJUDFHc3gzc1VVY2x4YjQ0Yy95SFk1Y3V4UVEvY0p3eTNuTG42SEJhK0NYZ2JaTnk0SThZRWJxSlUzWnpmV21RamNqZnFtcXRBT1dNdDU1WTZqSjNFSTIxbS91TnVUTmJMeTV0MDJSMkQ0U0VOY2VsYlN4TENCRGRxTWZjVHkxNW9ROGdWcHJsaFg4OVhSdnBKSFNIK1dkcGpMNmQxcTR3V2ttaEtvdnpYdWcxK1ZoemRHR2JjZ09xd3RpeTd3MzV0eWRDQmcyZlNENkx2YzMzSC8wbWc4emlqT2NISzNWSnpLZFlnYmRXWlpzOWdjSktLZkR5ZFRuUDROc1h6Ym9XK0JJaTVRWHJUaHdFMThIdGlhVHZXdUhXeUdOUGVGWjZEOCtMaE05a2dmOXdpZmNsUjl1YzI2S050YzlzekZIeC9McTNvY0oyc1RzRGliT3NqMDBUSzY2dHZ3U1NoeTZpcWcwb3hBOGh5NGlYZGMxeHpUcUR6V0g2UHByMWt4UmU4N2ticFdCQzRIS0QwTm5ESEZhMWRmOGtuclNPVXpLbS9lZUYyY2wreFJLbW1kWHFwSHVqMmlNd0c1d2VVTU44UXRHUEhWKzNrR1JjVCt6VGI1MHdDN0ZzU3FFNm9jTjdBQ1VJc0Q5UmJLZSthTE5mcXVoT0xWWkIvRy9wOENLVUFNNmxaKzNZUGRRVFc0TDBhbXhkUndSczM5OS9LT0FrRjhWOGpaTzQyQm1pdzREbGs0Q3RWZTNVNVZPRXU5dXIwYjZpaitKRWU1YWZERUhaS0d0SFVWdDQwVGs1ZWJTRjVZWUNPTm91SFdvM3paNFNQdmMvb2FhZzE1a1loMVMrUXMwcnNGMU5VMlZYc0dDRnJ0WjUrcUw2Y01FYU0wTjlEZ1BUdG42Vjg2NXJ5N2FrWGFFSjlwKyswdE41S1UxOHlrVEZhNCtmT0E3VTU3OXZjVitBcXMrcXltb3daS3dudzVIOVo1YTIzVUw0elA5MmhtUjBWRHlSaGMrdFkyWmkxS0l6czdPMVNWTEJOc0dDdVlUYjNZbUFKSjkrQU9CMTB0MnlnWDZOOEhJQjZUa0RSNnh2cjJCdmYrZVl3djlUelcxVytpQXV0TGoyZldlZGRDTko2anJWZ0V5YjBrcVVJbXVlRHRYbXpPUFBibkIwTHpNdzlEQmt5WGkxYkh5QmJhckJrWnBaSUhSWUxab3NiTnJPdzNyRWhmOExGU3FobEkvejNhR1o5NkdjOWRQVlBkSXpMZFJBeXMyZks5SmZ4aEJKTmljL0lkV216d1k1WEQzKzBvMFhHQVZhZkZZVkdrcXBQTVdjOXBnNStaU2NzamxLV3Y1UjNzQ0lyMzlVSHZTRGNBeEtHdGxxdHRiamNscDRQSU8wUkxwOUtkaDRYckxqQ1FoNEYzZlREU21mb0hyQ1FMTllyOVFHaVFHU0hLeEI4RWE0MG9keVFxZHJmTkJiaURDT1p0VUx0Qng2a2M5MmhNVjVyUWlCOUp6WlI0YXMyWlA4OE1yb3M4QkpnNis1MmEwS2hxb2dLUExjZlZJQWordVJnTXdQTmtia3pDMjREYW9ZYVNzUmtZS2g4Sms3a1RwMEszcmcvcURKcStFL2xxY0NodU1FRjZQTnpVWE5ZNEdrUUxXYUZGSDZVVzIza29DOFJaM1RRWkV5cnpiVGRTYkI3cnZiNlEvOGNLR05kYlJwUnA3dHVHanhncHFDMS9EOCtGYnJPWUlVWm9yNFlsNUdjR00xYTZQYWc2Qk9YUDhzV25IN1JDWEl0TnN5eFVQcGdrcmphVUQ5ckIyQmp6WE1UYUZqWTBVNEIzT3dzcEdhMDMzQndxaHdaYjlNQnNzMFdPOXoyN3JKTjNUQVpxdUVwazJ1YThVMDBvcUFkR204VWJNcGhtKzBGenl4emVXU1hudU50cUxVUnNKWHJBdEd1Z3pZZkM2d212Ylk1S3l1RGhSOWZvY2YrZW02dVI4dVZGcHJ0bFRJVDdYaUJ6Z2lybHUxZ2pmRkhEcWs3WEhvS2g4VlJtQkxteGZ1UkJxU0ZvY0FZRzN5R0lXcFAwK2hGa2tyV2RCb21CRWNsV3JUVkJHUzFic0QzN1RYSnFadE54RGFzTU1NdTMyWndzLzdvd1dIb1VFWmErTkUxaFd1bVRoU290V0VmTUtjd05qcGw1eVozMDR4WVQrdDFPenZXMnV2ODVaZFFtRHhSWlpPUWl3VEdCNGYvcmZCcjlsclZ2bGp0NFowWUxJVkI0T2dPc3NxUlkrYktYZ3ZaMHVFaUZVc0JmWktuL1ZtVkx0b3dKS0RNMXBZdjN0ZUloK2JDWnZWTk9MZ0gvMkNWd0VKM1lJYmNPMFdJRUlDdVJqa3VoQXpMUmlBdzFCcGE0TGJCMXpWdzllV1ZmdDFwSmRCWnUxaXdIYlhDNy9oQ3FFeW5IK3grZElFNGNONWI5M2d5UTBjckR2QzI0cDJwS2YwWU9OSklkNFRLNzNhWW9mT3dLTWxoOXBoL1puKy9mbVIwWkM0ampkZEZValhXUmxMRUY0ellSS0c1RVFpTmN6Zlh0Z2tmdmttaUdYZGN5akRqM1RGNzdoWGMvTXNBclZVY1ljbU1SWXJxR084aXFGdy9wUndONnplSXJZMERyRHZlWE41TkZUbXlxM0NXcU9SL3lJY1ZkcUs0V2FsNW41bWFTTGx3L2Rva1ZFRkxWK3FLVXRPem1PMzZ1b2xoei83aUNBdXpoVDV3Mi9zd0IzaithYVpCY2tHcloxdkh4T0hGNTZIYnEyL0tOdFRJTjBzV3Q5MGZkdlJJcVdjcWNRb0VXZ2lFcTJZb3NXZ0hYSmM3UEJuUXRWQ2E3OENtM3F6Y0ZmNUhScmF3UVdvaHVBTTdKWHhXUFo2dVl6T0cvOTYxSEhPenJFbkcvNDRxVzNyZEExUnJSTytHOUV6YlhEb3VYSHdoekFJYjM2VndnZTAwRExCeDFaTkJ5SXl5NUNIZzdwcC9CYVpmSVBwNlNYb2Fzd3g5S1ZxdUw4a0l6RjJ2TTI5RTdaQXBoTUpraGtkVkR2Sm1RbndtQ2NIL3pDSFBtYWx6NFU1QTVIOThJb0NscmRVRkMwRFJiNmsxREc0YVVtaUVPMDJRMHlDNldnN2dFTTdwcDZjV29GM3lrT3YxZmpDZFRpaSszOE9KVFRjL1pYc09qRUNITlNDNGVnOXN5MURuVG9WMFNKd0VvNmJNeTNQc1pkSlJSMm0rQ3hueG1vMzFIOU5xc09qaWp2RWtFSjFTUXppMklHbnBDcmk1Y0diUTFVSXlteXdMOEZzV3QyaEdUeVdJSjA0RlZuM3l2akJVWE9JQXBxdklVd3ozQ2hxdjF3UklZd1Bjc3NaR1l6VzNid25XVG9ZT1pCbFUzVXVKbXYzMURxTWl4cU41aWpKTC9FSGJiMEtNczVHYmFUS0VtVnVtQ0pSNUpuUTN5MW1VOXRJQW9VaDdmUE9EQk1QMHQ0cVp0cUQveXpHSDNlYUVVOUJXUjFCT3BSVzVsc2JXZGNUcCs0TXVPdVh4Vkd1ZGt1V05SU1BVRFpPVUlnTzIrTTRDUmJOWFBTakhtQnRhVGZmS2xIcGluVXhqQUVybndjcWtXMTBncGljZmttM3YyNXpNeWxwSDkvbWF5UmZWbmtqNFF6NXpqaHdqTXoxZ1piSmtMenVFMk5Oa0g2MWlCZkloR1NLL21LWE1relBkYzVQaUcxbFZkL3R6NWZPK2Nma21qcUZzQzdYYVpUVmh3a2hhRXFDMk5LNHBsTURQV1RBTldvZnBwOC9sVTNrbFlUcStXNzdyNU9NRDlBOG45VitnbEJCYzhnN2ZTRkF4U29wN2lIWllheWdQdkVVTXhZclVTZG5jK0IyV3pRMXpmRzI5cUZnQVYyQThoOVZVaWxSUU1yWXY5bzR2YUZObEpQKy9NNmdqaFllWDNsQU1veFA2M1Y5K0NDb3g4MEk1WVJ6VDMxbmw0empQYkNzVklZMHVWMnprbFh5bGhiSkVUMGl6TGthS1JkRmYyS1BpTHdYaHJhcG9vd2p1S1ZjSzNtQ2hyK1A3U1NpUHh3TTBCc0srV2g3eVRpNmIzc2kzQTd1bVRWZ1hYOFJaNHQ5Z0dlODJWS1Vlc1Mvb2pnZHhkMnljMVl0T0s1TXBKdUh6NVlhcnZ3amF1UHlkRzAyTHJneXQ3My9aYzFJWVMxTkh1eDluMzBNRDdLMVhROTYwY29lU253WUo0ck5RbXhyNlVWNkt1SzVPK2hzOTFOKytza3VzdlRhaE9kZnlxWFFjUlVRMjZDeWpDeE1HQ0g3VnJwRmVtZzN0bkR6RlRVSE1WSW9uVUdzU3JGTUoxdzFwSGtqY25SRTYranV0eWRWbW0zUW8wSFh1WVkyazlWdGJkRGhBNXRhZXp4MDk5b0ZqKzAya0Y0V3NSTENKeThxSThzUHBzMFpkRzRDOUp4SlFRd3ArVGVxbk84NHA5Q3FpYldsUmFwOGMxMGpJUEJvSmxMWFBBOHY1cVdmcHlnek9VOFpGU2RBY2VBUFREcDMwK3MySmVhMkcxR3ZrVDh0THNNalFLUjRmWm5ybVdPTWlmc1RnOEtxYnBFMytpWDdLNzJ1Z05pdlBaTEx2RHZ3OUVoU3N1enpyM0ZMZFBFemNQZmVtdUZyQUNZcUY4LzQvMWMwd1RaUDc3a3pPcHR2amU3WkZwU3M0NThtOG1XSzB5cW1xeXBKSGFRV2NHNjBOWDhleE5VVHNQbU5ZTjB5TTRUdDQzMWRoalRVQUI4Zk5VbWVCSkxiZERGdEw3V1M1cFhBS09DTEN4bUM5elRQWE4zTlBibzIzb3NTUE5LK3pSaDdzcTZjRW85UW9ranNRaEZBRWYxT25tdFMwb3Z3YXQ2RGdwazZJT3N6U2JsbUlCczQzN1gxbGhpQWZMWGN5WUNTMG1NYWNQOEJPOHZSRXBQY3Bmb2tzRG5pWTZ4a1FKTWdLVWNlOWcyc2xSc24wcThkcCszN2I5SU5Mck84bys4NVZqelZtRjVoN25vRWhzSnpEbjltUFdjVzZlZFozMWMzSytXZHV1SzNUQWV0ZTJ5OHdqdHlxNzJKcTVyMFMwYzJETllIdDR3UjY4M2lmZmFHdmx0eTJ1ejBnVXpFWWtxVU9NY1RjMVNuOXBaTGVrQlFJdWlEUWJIeTg1Uk9pSWJsNGFFMG1MdkJ5RFdVK3ozQ0t1RHEvbVlWM2lST2ZKSjdpRlgwYzZyQlBNbFFLZ2ZHbXdYMEFyazlZaG5Ib0p1TU9LaWI1Um9PdnNiTEw2a1YzUUcvOXR4Q1MzR0loTE45dVZmTmZ2Wm1iM2Y0UEIxQ2pwSmhkWFUyL3VvYzdWc0ZuNkJWR3I2NEFhcGdoK2JCTC9GR0tFM0lLSzdONEE1U1hQZVBkUWxJY3hyUHJ2UXhheHJZWmFDSXkyb3RMbjV6QUk1TlBNV2RKTWd3elZLUVV5V0ZFUmtQWnBQL0daRUw1b2FkNit0a1h2NURzQ09rdmNBN0I2ZHRmcUNTZGJOVy9LemFTdVhiK2ZkZnJUcUkxbm5kUDVJZXo0emE3WDdFZnpubUVmVG5qUExDU0xsTTlHWnEzUmo5Zm5zNnhqNFR4VmF2dnljaW1GbjgxTWtlcHVXMWxTV2ZnV01iYm56TGczZnMydjRiVGxHdG9sWUJ3RVBOZm9UVzN1UDdnTE1FeHhBWW9KREhrcHZJU01rYU8rTHQrS1NNVnEyOXhUQTJJczF1YjB5ZDJCb3RsVzJLQmh5VWI5S0IzUUl2dFZwWjhUQ2ZPZks1TkkwSW5HaGJ2Y1lodUMzSXo2U3h5VDZqeEp5eWhaWHFuTzJGZnY5RjhaRkRtVVNKSXpKT3FIUWZHRGNPcHZJc3h6bE00cGNPMk9yTmtYQS9ieW9GbXdEZEg0UmVad0x0WkNtZ0VFLzdjc29IU3c4blFWbnYzS0EzakQwZnlPek5PTGY4aXJwbVByMnR6RFJ6bVRBVFcyanlxZG5nSm10aW5FM2ZYdW0yODVRc2ZrdXN1c2VFRHd0WjJpQ0RaNFd5U2k5amswdHZyeWhKbW1TT0lxMXlGdUFPYUxOVGUxNU05SWFPNDAzdDJmeHVPWUY5VHB6dVRsdndINU1uc1JrZ1ZEa2hvVWd6N1dZMG9hZC9nUFg4RFNwTWxKdlJDenAvak43Szd3ZFNhT1hkY3h0NlBDK2tNaVJoeVlJei96ck5zK3Uva3FOTWVSSGYzK1lqSTNTUlZYT050N3loK0tIUCtXdHhqdmg1d1hXcTg1TmF4Y3hyQzYrMHRYN1QvZGlva3U0ODlHSzJodXFUUWpxaHRTVmZyZ1J3K1ZNUHRVWVRBMEMvQ3Q0cW5wQ0NvMDZreUl5OGt2ZllCajRNYUdsV0hzbXllNERqenpKQk1BRnVNNmFLdDBzVVYzdURpWCtGOWdOU3NDd0w4dTFFWVl0S1BkOTNPaDBhcjcwYnVTbTBBZ3JxSDlsUmpWaXl6aVc2L3pjR3pERXQzT214azZpdnR0aG5DdUkxaExvaVVTRy92bTBvVDlGcUxWMXFaTFFUM09FeGwwd2VvdENtYVA3VUhIUTIrRnQvdnc4TU5kZENWalhVelZiVm96WmFXdGEzbUFBTW1BZGR5TzQ0VURLWEJBQklPQWNEalBVVm5uc05BMWNTSnBNWW5uQitlelFLdjdSdGt5MGtqM1dVQ3gzTmZPcmM5emFEVUhlMWNSOFhEZmFCZW9Ga25JWGVFZzY5eHNmNlBJWU56OXh4QlVmSUNldjhhNjJRTFJESVhQdmN5UzdWSHlOMWE0M0RPU0lSdTQ5OUpJbk1wdmFQM0kyYlNwT1ZTNEhkNDlYSENMTnhqVnh2WTV2NU0xMCtkcVM5aENidUdEVnpsT3ZWUXdYbHdubG0zR2I1K28zS0xxN3JSdVo3enVVblY0RXZxMkJDQ09lOFhiVXk3eXJIY0doVythQzduZ0llMThsQ1JuRHVydXBIVnE0V245bzRkendiV09KUnBGUzdxMDE1UDZzRlBVMTdEYzh3WmEwczdZQjJ5UUp1K1o4TFpHUkFpYTl0TS92bHBvTkRQYWJsQXFNMWNkN3pIUHJJaUdHSXFYckRQcjduQ0QvVXE5Y0ZoTFNLK0NXMUd0YTZNK3dPbUp4Vks2NHBBTXlnZ2RuU2hUbUhrTjV3TlIvT3V1andUSXdzUE9mT2VhNDlWRXZacFNQSTBsc3lSdmNRanc5S2VKcVQzR3R4eFBPN3E0YTRjREczTE1QS1NObEVicytVbVd6ZVFaeG5ldEQzemk5K1BtNTI3dlc2QXAxMkFUdWJQSzJvZ0gyalpuaGhzT0d1VW44UkxUVG51MUw0S2YrQlYvODlmNFA4Q2Y4bU5mOW1hYXpMRWZsY0tFczJsMUxVU1lHL1dwS250TXlEbHZJZHBqaklaZTVoejFVekhDS2RWckYxcGVpQUd6aGJWM0hpRFlMeEY3NllqMTE5cWh1T2tNS0hWUldBbE40Ly9yYW9kZmVtQnpnRHJXdE5DYXR4ZmJuVndLRHJQL0tZeTkzcEZoU2FYWmQ1SlVESEFwWThjR1hwSWJ6Z08wVnVNcVRRUmR3KzJxbHF2Vlk3eXZ1NEE1elF4UTNuRVM3TmdRM1laRXdxNURlbEpEZnFuVGlMb0NQR0dPOFJxM2JxMUhYOHkvVkdpRGpwOFo1bDJja29iaW9Fem43OGh1L3ViU0JQekRyajhGSlVaNjNYakRsSEkwVHBuQklDUEVYeXppMGZZRFJvUDRSVGp5MTk0ZUNjc1R6bWc0VTBZNG5oSTZkb1Q3cjQwUmV0SFBTSEF2TTFod1VXMlhvaFNvbk54QndlRzVWTXJ4Y0Fqa1hyUUNLM2p6M3VtdDFRSy9XZ0tNcmVTZjVPbGF4QU9kK0hGNTJZdWJBL0xkU3ZwNmhLbFlhVzUyY2VmMXovZC9zbk10bGNEQUpiU2tHWEZXZkQwaVBWNE1tS0tEbEc5cEtDUXdmSUNOZG1FM0VQK1FBMjMvMG9LRWxHQnRtYU1VanJ2dEFEQm5oVXptbUV1U011dHVVaEkwS2lVT3pBMnBmcmdkb2g1ZHc4NXNlQXM0Zzk5T0JaVy9VdGtQVVIyNUcxTFpyQmtxMzJxdnQxWlEwZVFNdjF6YWtBTmRrQStTRGtIQmVveWJWdVdDbDFwTDZNeWw2Y1dBSE9uNzNIbTk1QWMxVUMyMjlTOWJ3bDZteGgyWGNaYldLMHc4NmJVaFNaSCtJajRQY0JvTUJldE9kWUVFZnhiVktoN3M3bS9vWmZ5SGdNbXpkbURCa3F6cldsZXFBZ1Bhb21hbU13T0hnSkRTRHlZRjlOSWhEblRDVWhlK2E0bEFua2NhQlQxMFJWT0poZGsvdy84QTVtOGkwWjY2Q3VOWkNjbUlLUEpOUUdVTUREUkgycFM0QVk2dkdzM25KUXp1MTVrU3Y1UkVxeGRuNWpiM1NubFk0aUdlWXpIbnVjVjhmYVRVYVg4Z0RyV001VUI1YmZBSHEwTjNZNndrMENoeFRQN1RhdjNPY2JsemFYTjhDL3RCT1ZRMDl3eGFKUGZqcWEyMVFxQmtsM3ZEejd5YVdiUWJYU0szY29uNEdjTUlmRkJacDlFQS9RYXROVFFqREgrRSswV0JIRmQ2ZFRUY2o3elBQQ2NKWkJWbGE0WHA0K0U2ZndINmQxY3NFM0NoUEdEZWtyc2gwUzVxb1d5Y2xMbGVqWXQxV1Byd21uYUJJUDFaT2wrL2Y5ZEZXbEtpZHJqUDJWS0RzOUUvUWw1SkpIWFZnNXd5amJLd0k0amFjNE55a25LZmdkZlA4SndpU29MZFNWa29SUlZvMnlxZmJFL05BL0ZJSDRVMnA3dGRHMVcyRGxkRGMwU1lZS0JWTng0bnpjbFJaV09GY0cvZGQ4Ymw0WWxka0k2ZTNaZy9ISVR2VGc0alRRNzZBS0xSYVdKVTlJOVozMFZEM25BSW9RQy90RExEMGxtcFpTS2ZsNXZzbTdreGsrL1lLR1lFR2FRUURrdVpCSUI1NGVBNVBWSUR0bVYyU20rTnZ2TVNVTnJaUGhUQmlibnF0N29TcWR3aG9TbTZEWVBMSVNyK2RBOTAya0RnUjJPM2ZDdkowa0ZxVWM0eUhkSTN0RVJvcFpkY3RYMUozVWhlZE14a00vd042TzRueUp5eUNDYzVwbU5MSGR3QUg0Q2lZVkovSDZXbnhVTkUvdVpoVDlzaW0xWEVKdWVlcllkWW5iTjhOaTlmN01udlRFbFJHQVBRUDQ1UDNjUG8vV3k4eC9aM2luOFNHWGo4NXlyK0pHb0dHWkFIQTQ0YlgrdzMxN21rbEhwMUdVSzk2ZlMrbEF2TDhjUEhrdVZONVFhNnpKRzB0RHJHUVdQdjIzV1FlaVZhQmFYSGJBNTJ1aWIrdlpNcjRKZUtweHVBV2dGeUwvZnh0WFhtYjg4MWdJTS9RMDdZTUJXQUtpVEthalZ2YUZmYlo0Ym5UelNsTXplZDZRSEJLWGNuZ2h2dUlXZXhOcWZkUEFlY3pMYno0bGlOT2ZkRHNrM0RJeDJVRE45aGZyTDB3TU5UaFAzV3c4bFRycXFVSVIvZDh6UHFTUXhkQnZRYk1neHlXNmdnM00waVNXYWdScnQzbmRxRUt3eGM0L1BIdi9WWU9ITUtwanAvY2RBTEtqdXlFMGVpK2hGbk9raDhkZGtWSEdtNTBod0Y3QWl6YS80V1hBekhJL3hPRi85S2pDY0poVTdpS3JLZHhiNXZqZHJzWlJVNm1SMytPaEpTVUV4bW5pSkRPQjRCbkJ5czlxTUNkNUdHdDhpb1NwOGJBUVRuMVZCZ1M0M2t3WDc2RmVoRWx1a3ZNWlRTNDZpRUlUTkl0OFl2Zyt2YmlZMDgrZENYamhtUDltbks4Mks5MlVLS3RhUis2OFBZNlJxQTRsb0FUZStmVlVlZkc5M1V1L2g2bTFKNHBvY2xGN3NOWHI4VWVjb1JyZUNzQ2o0U0w3a0pvWG1NUGZFZWprNlppeFBWMG43c0d5Z2IzZTFoU3A5L0NMdHlPU2l0T0d0WkVCTENrMXJPUVFGK0VvRmNma05hbnYrajQ1SDd2c0hoRkZZM21EMW1iM0xibjA5ZFpFWjNLeUJvWWVwOG5MQTBWTTl3VlB6akpHdWM4MkhuNmVxeG5MMmRJUmxoZkx0RENWN3ZEeHlRanZvVmFXWUxXOU42dHdXYW45ditDKzRPYjk3Ni80cWFYTkVhVUFmb2YxcXh4MEV2NVVjOTd5SWpFZlk3YXA1WVB6bUU2SXZaSkhES3JNQWNHNS9QWHJiRHJFNHQwUXBuLzhpSDZWSWp3bkY2aVFDRkQ2dGg1djZkVEFWZmFLZGErTnpEWWU4L0RUQzc4NWtoMUZsN1JqNmViU3VFMkJCZXFlWFNIdlNmSms5bUxlNlpya1hRcExsK0N3ckRRRUJLQjZ3MmlWdjljTFJTSjlnT0RnMlV6cWRWdWhMOUhReWlXSVZwVDBLYnBYbmJtemlPdjlEOS9ldjhGM3NkUDE2UmlTbWxFaklzWWJ5VkxvNXpoNDVtU0h4MytWcHRrSTRwMjZtY3FtdTF2azZKUTJQUlBqQXlnT2xmM2lhN0FUWXdLb1BGQnFYd2wxWVBKaDVnakdTMXRIbklKNUk1Y1BoRTQwanJSQWloeFdQblNzb21DNjJ3OEtxYXJNUE9VL2xFWU9GY1F2dFZSRWliREdzd2JuY3o4Q0sySld3OGhjWFdoZWxRKzF6OGl2cWFGVVZBQkxlKzBlWjl2VTBaNVBSbm45OWRzSlVUbUEzRHVadEZuMTBibllDWHQvZ2xSTy94MGJJVjA2ejVQTmhxZ2FhcE5YbzFGei9HWUR3V3ZLUTdtcTg0bitMd2ZMZUlTMWJtelF2MFpSSDNlT2JVWVkrRjdrRXp0MUk0MnZvaEtLb1k0WHFzekdYTWZZSzF4TWhTYWs5S0J5VXlPckdBdlVXVUJmb1pUTzJ0RVlsb0RJZCtaUnlYSlNyWjJ0R0Y5RVdPSDFQdnRLcVhrQmJkYWdOR0VyN0FlMUs3aloza01BcklqUFRnS0FqdnBRdWp2UEkxbEV2ZStJa2phd0FwU3ZNc0ZJY0tNOTg2NERyTFBVdUg1SUNOZkFPSXpFb3k4dHRvWnRJUHlnVkhnMXN3OXBXeElINFoyL0h5eVd3WVN5ZG0wNW8zVDBNcE54OFRvQ3IzZ0lTU0htenJsNW54Y1RZSk1WSDQxbTBDS1V5bTFsVjdudi9mZ1J3K3ZZTGRuQVBJWDhkZ2JFcmFEa21peWNTWUFCL2Z2UGZlWUY4YnkxWXVKNFlmOTdEU1AvZ3hwdGtVdENHTUhRbmFLOFZhOXk4c1d5aTZQTnYxbm5IMHNqOEtsY0FXMlpNZWlBSXFtK2orUGc3dFEvTWVzNUxaZEhMM3drYUdMQldLbVk2dzZ6NklQMzZUUFppTHRGd09MSnFaRUlpZVpGYWkvdkdKM3VFVFdqOGZ4MUl4Q2g3RHRrWmRaYmZHNDZDOENjQzRkbTR5VjBqd0JZd2xBU3dlVVhNd0RlNEtmRTZ4R2xoSitYSGI0ajlzQ29PclRHNzRNRGFxK1lEMSt0QTdqblFVNWQzc293MHpsd0RiT1Y0NHZkbXpiMStDeXNLeGd4cjVrK1ZUQTVoekM2bG1IQmxXd2xPRmVwSXBwdm5nODkxc0JNR0VHVE55TFFFSnNSZ3M1NkhIUDRVbXczUTJmRW1kVjhld1lVZGRpSDZTZzRpQi9pS00rYUdWL0NkRDQ4VFhERlUvaU1EanAxc08wakVFSTFpVFZwNnJ5Z3lvNUlvSDRibUpoNTFUYzJEdVE3UnptLzErWkwvcjdGR2ZYdlpLZTNvcWd1UHZRQjBCSTk3d2RPT2E4QVEvT1E5b2dCL0FKNC9icEd6OTVMRHlUWW5tM3NybURrbTdpVmRUSnhhKzhDemZSRGVGdWRvOHc0bEMyQnVHdGVOM0lIaHMvYmh4MmtJc21LbGtBRm5KRHV5aTZwbHlkaWl0ME4rVkczN0JXS214aWlmNkhtYmZnODVqdVBZb3JJUUxsRlU2WmdZekMwQ0VZaHNBbGV2S0JPVVRHdW0zYktqTStUNUdXanU0eEh6enkyN3lXd1k0cW40WTRCQkJ5NEQ3bFBlaFdOK1czU29raWhRMXNRcVNjVGZFNjM3elhYeCtHdlVnQlFzN1IrdEUwSHN4dXdBUGg0eXBNZlo0dG5STWtwWWJkeVZYR2trNXZyQ3AxU3ZkRFQwTGtGdHVxcGRQT2NRbnJTQUtxeFpNSHF4NDFqTTZVWWVHS05tNUxRM3J6dkFPbTZ6YTRUdlJRNE5KakhOeHl0WUxldGVobnZObmZIZWFOb0Y2WEkvMVVIYXV6dzBqR3NGdTdEWTdjTmVPVVJlTmJVTHB4cnhLZEpBQ1NBb1FJVkxvMzB1dzNmbHBZOVlWVzIzNGRQL05CTFk3clBDWWswa1RXSjU5ZEYvRWRqYUVMa3NyaFh6T1lxTVdvdnI2d3MzbE9TTndsUmxDYktFUHJwOCtKQU14ZlFsa1Nxa3BmeWVqVWdxRnBsWWMybkZ6eEcxN2NFVzI2MEkwMEw5bGZHU2lwVmsya2lFL0VFZ3d5d3lFUnZlSzBGVW01SWhOVDNDVzkvejZQbVc0WUZ2QkxkRVowMEM3OEJ4K2pjR2pQeWdZRnlBenlYNldKMXRjSWptQUxHa0M4anlmNzBVRU41OXluYklpN0FmOHdLNkREc2JsaHZ5ZjlHeUltUmhZL0tON0w4elg4OGVNclp6eXc1YlhKdTFkcGpuYnNvcWhFd2xIdTVSSEVNZDZsaG10R1BzMFlFNENCVDRaQVJHYWV3Z01KOUw1RS9laFQ1UE1adjZKQnhXWjdUNWRicEdSSG5LTUVYSElaTGRDazh3eWRtUGZ5d0N4V3lPVklzQWxPSi9tRzdRR0l0clZMSzdhQzgwOTBodDdDQ2tyelY2TVNCa1IyMlBkSks5SGt1bGgzOEZPbHZTMVgwSnd3bjR2UlNmU3FKM3VITG96SzZ5b29FNEN1Y2JYdEhXdTJmcDdDaXJtSU5vcmlGblRkenc5OVZXSXYyY2xDQTlnWUFWTVkrakJFdTVCaWhuMkZKR0VXK3dHcGI4MjJZZEdYcFdhcVU5QmVxdG5XUEU3ejR4MWhtbVE2RG9sVHRZUElzaVdPRldYZlpyaFQwSGZGK1VJdTh5elh1NDlYWEFNV3FST3NlOVBEMGV3MzVETVJQU2JzdTUxSjBWOUVrMEpMK3RqWndtY2poTWJQbE1jaExqYTJRdEIxaEliVk44ZWxoWTFPcEY1SFBwZ0xkZk5ITTNEV3laRGtJMEo2U2Q3Q1NtY2JEWUpPRE9IY3FibmJLQWtrTzJaOXVSTGN4cm42UzBlRGF0ZGVaNkJ4SnArRlRxR2ZWMi92K1BrWDhjZUM1R3N3VFZ4eWx3aHpBN1hEOG1iay9nb0FjWEkzT3ZGQTdxUHRwOFBMZHdEbk1mSTdrYmNKQ1hFS0xwYis5RDNoRmNub3IrWnpHRlhzZFp5bklPZUxReE1aQnc4T1JHc1BDV1ByNTllOHg2UzRGa1AxS0l3MVp1akozajJ3WEwvQnZrVm43L2Q1bGhBc3VBY1lSZm5zTnMySlV3MVBrSTVMWit4S3JNSlEzRXJzZnluQW5NMllMV0RyUEkyOFFMRTJFb0IxMW5tSWlwQzNEb1Q3eE95cU1VYklja1d5dXVQeWxKZGVGVHRCRWtWYml1d1JVQkJXL043RlNHbGUxMG1zUXUzZXI3ejRGd09SeDNQdFVDL2FKOVAxNHk2d0NIcGVTVDhtNmJVbWxvaXdaNGpLV1lIRW9HUzJSYWRZSXdnQVgxUlNLWWtUSGpiNC9PTmxpR25EWDlIWEFUR3NKcHp5YUFyM25vNmR4RVVMQlB2NjFsY21QeWprSno5WUFsaXFBMEh4NHprSTd3TDB0Tkp0RDlnTmppMGk1azdWajlIUUc0NmdrSi9HT0J4WDVoR2hNcE5EQjBsbUZ3VEpCeFpoQnJWQ2FWUTcyNlo3bDhPbEJ3QlBjd3RHL3BEelZoVXcvcWswaStRREZmVXZ2WnE5YXNETG9lVXBJbEx3OFMydFFWa1FZZWc3ZGpOaFhwVldqQVRyS3ZmOUZTeWtIMnpqTmYwS0d0anQ2RWNpSXQ5djJPYWVVa0xHUkVZZjJRY2dRZkZ0Q2YyNDlrTDMzM0Q0elh1TklPUmVtb0tTSkRxbmFIb0ovVm8rUC96MVdrUnlGRVZtTHhPVU5WTHA1U0ZZdlpoSXRzUGNOVGpyeVFnTnBjaXM4U0hSV3J6c3lOaUhqWU82WGtSemlyb0JDVi9UMVk2a3VWRXBUYkpqM2VUZFVFOHUxcytqQ0lLcENneEoydStRYWIzVk4yT0xjblpmRy9XSURZRGRWRi9LU0N6MlgvRkd2dG1PQTdPTUR2SEphWkh5L1pwSlUvajhsUnF3bHc0TVlPcDRBamNINUJnbElxL3RLRU1WSk1nWldsc21BQVl5RDBnS044dVN5RVVMUW5BWjA2dDkrZmNGME5jRHBaamVqWDV3djZReW96SDgzTnVTYmxNRmJjYmtYTUNuc2l4VUc3ZmJzaFdqakpvQlk0UlliRy81NllrUHltYVhQeU8rMUdJcXpIdnlFVm1BQ1FjY0xFNVJIendBb21GRkNJVWpuM292MFZFZ2x5T2xzWGEzQXJJY29Rbk40UWxYSXRxd1AwVnN4TTZ4Z3ZHR29IWDVlazNMTFVSZWExMUZZTlhyeUROSUNuY3BMTGhTc2E3ek41RWNWanNpdzBpc1d1Wk1BVU5aUmYvbGJJbUxmNEpnTE1yZmF4UWdaSlREMVh1bnBRVFM5U3VpN0crS2p4bmdIMlhxWmRRM0pjcVhzaDhQZzFIM2ZqdDVhTVk2bVV3eXQwN29xM0tscE5zbW1ZMFZZMWZiZHpaMVVCRytleGxLZWx2VytaejNuRHd6cXBTUkswQWJHQ3g3RE82ek5TMUlOVllHVEJoSklScXora0N4T0F3b3R3bXJBMXJIVDY0aVMwamtseURYRkxCQUpLeG5XYVFnMUp3Uk9jT2Q1eEYwdmhWQ0ZqVjEyVXRua04wNUZ4R3ZZUUJPRHZ2eGZ4cGxuN05VUXlQUVc2V2xITWxNZzlXUmIxMnB0TkN1YUVEZGZWTTV1NC9kdlJiaXhTaUk1eUJyS1lPUXg2OVVZNkU5d0NkK3pnQ3JuYi9zQzF3dkppVUp4cExRc1JYbkNJa0xZOTZNNlhIQXEvQldWdEo5MUFVL202Mit4QUNVSkZkdFV6VVlaSVJzSVBld3c3M2ZPbmRIellaVVNIcW1KeFhJUSs2YUpWSG9mT0RjTnlZdjVVaVMvdU5LK2lJWHVtcUkyQTNncUtxMm5IRjd2QlBvcEVOM052bmYvTkhEQTBjREZ0U2RTYmdxSlBZQVJKYXlsZ1dqQlBCNlA2NzlKVWtpVjNYU3E3UEZWNXdtWmJwR2hFWkRJcDgwaW5hT0t1am5XN1A5MHlpUU5xYlByTTdDNVN3Ums1eXp6SG9MWDlWSEVDUExMKytCVG0zYTdKdlVlM1BqcEpxNVdMOUtDcG9BRWZ1OWhiaE9wdlFnRk0rdWJvMkczd0p6aExPTlhjSkl2TzBoTEYwYmRxQ2c5ZUZqWTd3YWdGY05TdlN1WnZKaUEwU0I0dEd2bHZrNkt5RDZTTnpLT1c5Z0JaM1pGZ3E1V2liL2tXamtPSGV1K0lhVjVsSWxBeTZidmdrdi9lOE5LWXJEMnFESlFBbXlkbkUzUzlVZno1VDRiMXVJNWsrWjRwM05mc3ZuSElVZnp3U05TOGhoSVdVRFpqdXQ3VVllcWxiRXhTVWhPSTZSR08reWZWVFFUZjNiRWQ0d0poQ0czckJNM3FsSzQvUWU4ZzByV1VhdHRDa0xXT1pTWnpNelhGclJ1eGJGMEVpSWJCdWdORTBzS0pVa3RqVWtQbUk3bUdLUVUzam1yUytabWFkQUdORkxZMStVcnVONjVnV0E1RFV4TEluckxPRHMzS09uM0gwMjk5eTQ1MGhvY05kUG13ZWF2RXRCZmRKa3hXNlhxSlkzWi9oWGdQZE5sRmpwd2tDR2VyNXk1L3hnVEIwR1FTalptdUJpTWhIa3VrTm14UldoM3gxMlVHZ1F0UllQeVRuZ1BQZVErZ3djNWRjd3hsZy8xc05UdGp6eDV1ZUN1SmlJTFErZW8zMFc2cnFyaGlYR0psWGhRV3p5dHZPZ3NEa0xaY1BERE9uOWtTTk9KWVJOZUhPdHl0TmV2MG5ZRmV0NGpIc0dRN24zL0N4b2cwNEFqNFd3MDAzVnNKNk9xTmY2dkEwTmtNVVRrMkQwTzIrOHAwMkYrNGlndDVOK3dQaFQ4VXdCU1RiYVpmOFNjMEZxekYwOVQ1YkFUY3o4c0FUcTNuVmlyT0R4SzJHUDZWUjYwMlNkVkNncWRYRkl6R2lHUUEvdlFHZlZFbFE0cVd4S0M1RTQvOFlBQ2pkZ0pxZW85WE9uVjJqOGdXZ3Z6WnA5akxkQWIrMDlsUkhsMjd1WW1CNzZoWE4xNXRVUElHd0VuY1FrY0xydWFUeGFnb3o2RkM2cU0rZko1UnlGN3VuQy9Ic0xrQmYwRXRZZ1EzNHhLSVpoM0hQSUtTTzRzRTZJcXp5MGtXa0IyUmJpNEczVElpUGg1NS8wbEFpNG91K3ByMkFYaWt0TkNSOHErS1hFWlhrZnZVZFU3K2ZVb0pvcmg0UGFMV09WZHJTS3ovWGdUZ21XbWs3NzNJMERNUWdMYTZ5dlVHQkM2WDRGL0dvSXZ3S3hxbndFZEF6QnVmYjZQUHBjY0o4bExGV2I0NmMxRWpOWXpJakUwTTVxM0RQRjYweXQ2VmUwS3V6YkFtYldiWGdlZDluNUZRZ3laNXNicDc0dngxamVBVTJlbmJCOGRQSG1FSVdPNDM0T0VjVnE3Q2FaT3E5OCtBanM4ZVhUODF6UzRaTFJ0MWM4N0J2UHNJb1Zvd3h3OVhidDdnVElEbFNzRkMySEZ1OHFoQVY3SUpqMG9nZy9tQStDejRJdnFXdmVsNnRCTi9pWXVwcmo2bzViUGFQSStEUHlUdWJnTEVoYzV4d3dJZTVCL1AxV0N1UWptVlR1Vm9NWTU2RzIxRjBYVU53UkVjKy9MUlcrVHliZHBOVTA2aE50WDBVRFU3bDJ1Y2JYVjl1eEM2d29ZSmVPNnpqc0NoN21WN09teVB5TlJjVGRtK21DOU8zRE5rT04reFhuUllrZFVRVXFMZ1FpNEpSMUFMMXE4RVdsWUYzY3gzRisrOTIyQUtsb1lCOTlOQUhvQ21zVXNxanFOVVBGb2pkZk4zL2VFZjdURWJsNjgzYTB0NDZqVXhIYi9LMFhVamFzSXNQcEJKenY0bDExbmxDay9xUVBxM0lVa2RFcmxlSHZsc2lrc21pZDgyWGtZUzA2WWFGL1d0MFJBT0FLdkFwZmxnN2UzOW54REgvTFdzSWx2VGkwWWtEbGVXUnlVSVFHeHdUUWNsc0Fvc2h6M05UbTBGM0tLeWkvOFFRYjFSOEkxd1VPanA4d29ONnFlOTlNNis0cFVKRWpCZ0huUVR2Q09wQmgwNXlwbEIyckw5TXJEdnNOa2dhZHJmY0ZubWVqbkt2YllBdGZoU3Azb2JtWm40cjBKOUxLbzJ0L0FFZFVORHpmSVZkMXY2SURjeERsdFI3bnlJeCtQSk1sUWpJNGh3aGdFalI2SFNWYnM0MlFXbU91RllkWDFsbkhySHVValllbWV6ZzhQOGp0eHhid0RaOVc4Wnd6cXBiZHVaUktIT3dPQzNZYUNLVVlXOEhscDdCNXVTTVEzM3F2eDY1T3FHMVRHdVRYQ21USVRPcmFYSHVRVWFEMHBBRnFZTENzOVZrOWsvQ1M5elhyT1pLZVFmTVB2Wm1CNGFXWEdjTTZ4bUxLckloNmVSYXpBOVkrdGZSV2tvd2VCMldZSHIvc3k1OSsrd29jVkoxNEczUURiUzNWM2VsaysvY2xGQ090aURaMGJiQ1psd0t0aWYxcWJ4dnRUTnRBNEhvY1VuOWcrRllzUHlkcDk4czRUL1VBL1hsajBtOXNlcTJuSzJpbWdGeE80cnNIWHNQaStzUloyeXRiTGlnWVZrMEZmcnovTnBHenRjSDIydTM4U1BMdFE2WkViZ1JKeFFRMGxVbHF4czFOTjk4ODRxV2liemNZcnBTV2FFeDRmNXljRkQ4N09wUWc1RWtQL0VnZTA0REk3SFgyYzRud0R4WThNUENyWFpEZHdNRXZLS0RDQTNXVnVnSWYxN2l3Ym1VRFJFak9IekEvRUhFayt3YVBSZ08xT1kreDNqaTg5Z0lwMUlLR0xoMlhYYU9YMWg2dWlWOUlGT1NCQXJYc3VVbjJYcmEvcGlQOUtmRHBEeFhmcFlTTGhkcHhnQUZTWlQyOGc0Rm82U0Z1TTNlT0c0Sm9CTTZWZUVyRnFBWjRldXRoWjVUQnZ0MC9sSlRRSUY5RFRDN1lTNjVQcnhpRXR1UHVXTUhHcXlPb2ozK1M1YnIwVzZKcFd5bE1mNFNsdUVlZkl2MUM0VE9DdmJtZGVqay8rZStmUTY4dC9MM2pBdzZQSFVBaXhGQ2JhY2lPZjBUQzhtY2xmSEdtUEhQOWNLeHV1ckh4Yyt5QmlETUl6R2JiYzhnUzFBQnNtMmlkRml0S1grRFc1YmIwWE5YL29BT3VIM2hBeUc5OWsvRkVaME53WWpzYytJenV3SjJIZkNsRitUNEUyWXVaYXkyNkVsc1J2b1BMeXp1dFdmYnUzOWJpQWJXV0dvSmxWSUNmeW1NQWxUNWdaQkNoeGM4dWpsZEVIUGZBQ2xVQzNRU3NUMm02SEhGYnI2VUsvbk5wM2VsZHFIL1JOUW5mMk9IQkJZU01HNXdyYjR4RVdKb2hpcC93TVpNWXd0a1lIdHo1VDdRZzJESTVpN1gwQ2h0elBvZDdycURNV3J6OWhRdkZvZExQT1FSR28ydjc3VUgrcXNiWmJOQ2w1RUdZS2xON2p6NWZxd2wxOU05ck9kNU9jU2hZSHNZNzVCaWVoZENzWC9pZTJiR0EvRG9PcUx2MndrS21TRzh1NXhMUDJPOVEybkdDZmxVbkJrdWNPWjltWFk0ekJjcEpOU3pJTWlsUU9yMmlrWnpHQ0RxS1pDNmRwVklMSDJKd1ZSWTdjZnhTekkvZmpxSzNubmNwd3JydFZsb3V0QXVMVnZCMWJJK3JyRFRZZDExVVNISjE1cXdSOVJVa2Y5RVVIbURjemQwK1ZFVjYvc29ZbVhyMENBalZibEd4VlZjVzV3OVl0a24xRTFOYXFQWkc2ZUxRcVFJNTdOY1FNdzh0Q0krQUUvZWRVUHFmRmxHZ0hSK3libEdPS0dubUtBdGhza2hKWlRvaEQrZG9KSTdFcU5TRFo4RVk3M2YyMFd1eGVzUExvVjJOdzFqWDBRcGlDZTdBM0xIR1NxS0E1MXdMdzhuSHU4M2ZqTkNUWUhXM0hsZnVkdUNmYjVXKzdtVFdScmN5aEs2b3V5UnBxTUVyUFJDclJIZ3F4VEpWWEV5Q0xmc01zaGY5Ynp0eVJxenJzcG5CemJtcHZoTE1qNll5WDQ1b2pVQ2hkUTRlblVNbFpxVmNJdWpZQWpVQ2h0NTdHNDRJUTBGUTBoOVB5Z0pmb1IreWhSQVNxTnY2VUZuUlExSmYvTjBSNWFyRlZNQ2c3THE4WXN3Nk9uZ1lYYW5Sd0VJelpkQTJ3UEZPcVJGL3NXSjVVaTAyRnNLMzFxbTlhRElXWDFKc3BsNEJpMjFudjdhTzd0NlVqUlBqWEdaYldRS1BVYmZlVlppdTdLcVo1YmNXUEh0OUNRVlZtQmZlWjc3VHgrc2Jvalo4OWxVdld2RlNYZ085ZXZURDl4UGVrL1piTHdrb3Q3WTZUQ3JYUXpKV3F0aElaUi92MklrUWRERjFUQ041RmxWMFlNZS8vY0g0a0dLejlyM2tTRzR1VE83Q2RSTGRFMTBQNTh1UTVBWHk1cmlIbmU3aDF6WDVDUksyRjlSNEt2b3FHaE03UWErMDNsbHFFQXBadytxN3A1L0NMNHVIS0cwUEhrZGxLMit0VzRSelBqSXBXVnI4ZWhQY08reWNnU2ZDMWx1bEhuTDlac25nVlMzcE1JaXFFbE4vN25qeklrdGtZTll1dzF2NTdPTVdTRmFGR29oVEcvU09DTEcwUEFTTGR6WUZGa05WeVhTa21iQkNTbURlZ1FCSXZLZUpWSG50TUgzTU94VDR4VEJWWk9BNzVzdkJrTHlxTnJuUmdnYjNHVGdMVGNDYlZYRDRxUWxib2FmWkNBamUxR3pRMzlrb3MxVitwQWV6Nk9maHVseFVteWlweG03VTNZc2NEbXB3MjdES1V1TG1HU05Kc2lLT01qWEpvRE5ESVhkVVVPQnBlNTczbUxxV1VpN0QxMW5ZQmx2SVlidU1KZFB5UXZTMFFzeGhtK2JYd1NsdVFTajNXL2dDdzRhMTRkMVBvQktZWVgvY0E3NkRoM3FUa3Z2aHZyemRIc1luUmYxby91RU5NQmhZQWkrb09KeTkzYklrbkZURGtoOHRKMWVvZENJSTBkemxmMS9JTUNYZDVLRkdjSTUrYW9DZHFTK1lhQlRxcU9IK2o0aUhoZE1xcFBDeC85UThobHkxWnNZWm13VU8vek8yRzM2MTRRK09IM1V2KzZ2TVZ6SzFuSnRUZVJSNWhNeFFZTkgxYjF2eURmR3E1T3Z1N0E0SmlXZXBFUW1kNElWaHhQcGpxRzVsT1VyS2Iya0EraFVIR1g0MGpFbVQrbXc3SmdOOUVyc3BRdmxyTGpJT0crVUpVdDVsclBlTk9tWjFNajlmcXh4SHpDQmx1N3FqNnpPTFNCaEQvUFFXd2NzejUvSk1VNGdsS2M3YnFWU21QMVZlMnVRaVNXeHJOWVcvTXJsVlhkOERROExYMDMzcmFlanhIUW5zOFJoNDZ4eUx6aGlMS2trekZrOGV1ZjZ1UE9jYWdHQTZrMnJrdExPNCtGdUkzOHl6dW85TUM4djh6TE50b1ZXKzZCbWFXYUpSZlVIOHVYSWZ0citMQ1JDSzZBN2oyQ1VLSDZqR0dyZzFvaEh6bC9aUWwzREErT1UvMTJpNWtIdUdrN1hkVWRVejBGVU5vcTF6aTRRMGUyU3p4K0RsRmxVL1ZmdDVaUjArYkVYTldjM0g0VHBiUGQrdFM1K3ZFcFpqMExNRUYvM3YyVkFTQmhTdG9walltUEhaMzllaU40UjZCM1p3WlBDVDdYa3krQzlPMVRnck10T01aK0V5K0lnZEkwOEVaT1UrbDR5Z2E5V3dUVmxvMzJiZHU3OWdQeHFyMG54RnNnUTlwSkdRS3BjMWVIVCt1dFU2b2VJZG5zYjF1dWVSVVc0WFI3blczZ2tyc09rcGVhbDQrQy9tbVJBaTdUTkJNbTQwZWppeCt1S3JtTE5sTXRET3hQWnZocVJSYmY3cnVKM1c2RzdmT1lEbFE0eXlJQ1NaKzBxZzl0aTZPdFJvNmFBdWJDS3UwcHQ4a3J2b3pBUUR0bHJvSXpLaEEva245RzhJdmh5U2RsNldGTGhtVzVYOURXNlVLbk43S1BPZExkaXFUUlFiTGJqTWlrZFJQR25tNzYwR1V5VEliMjVjcU5qU0lqZTBIOWIzNTVkQ1ZrNzNQK0xtNFRrYVF0dU02M2xkUkRHNjQ1ZDJSWjVBYTRTN2MwRFlWQ1I4V0N6a2dtNFhjaEtvN1BZUlhLUis4dHNqVVp3SlpSbzNFUmNGVy9sQndzOEt6RWcwdlFpSjk2aTBLbDMwL3dwcnhIbnV6cDc4MEora2VneGhPQmN3enpJeU1IVG9EalFvS1BlQ0V4czdEOWRmdVI1bjBHdXU1VU55Z290dDl3TnJTWUkyZ3pIbGN6U0xNRnhtKy8yd3JxdFkrWFYrSWNXRHZ3WDQvazB3ZjJTckt2ejBRVC9NSE12aG5OS2xQQ20wdFpsWXV4QVd5dzBxdnNkMHRPdXBDMUtiUUF5MTdmbjBFaW1PYlU5QmZTSUZlbldIQjJyVlNuT0F6OVZzc3FKeTJsWkdvYk9EenhyeXh6NGhSTHJ5akRuOEZSSTNjQWxUM2cxVktwK3dPZGRqMEcvdENpNkxiT1A2ZlBvRDVKNXpRNjZBUHF1aHdudHJTc2NqdFpjd21LSEJENGR3VTZTUURKQXBOMmNUdCt1aDRDVzAvUEdLRDdSdFhhZWU2MEh1WlozYnRRK1YwYlBEVjl1R2gyTXliNFp5WXhIZ2ZLbFZNMnZYZ0VkQzBiZ3QzQ2pTdTR4RDdZbnEyZFI1V25HbXpGZXVsakdwWVNsK2RoazdjTzhjTGM5azNjbWxsanpkZ1M3YU41TWtqUkRDUnlGampaenFlTk5lbDY3Z1Fybk9jc29BdkZrQ2ZRZVpTRW5wZ0h3QXNNeEFxV1IvdDhVdHJ2MW5WZlo3eDEyS2l0MU5VaTM2VXJycGg5WW5YVVk0c0x2RVZCNUtQZ2JDN0Vwb1FERVlrTVV5T1BKQXJLeGthUERDeG1ONUEwZGtXbzBuVU0zbTBGRU10aEJEQmMrcHJ0TWN4UDd3eFVURXFDRktCWmozcmFkcnZOWEZNR3l6bllWZE5qb0NUamhPMlEybmxRbmJvbTFmYnp0dUt0eWJEblBPcGswRFZPTjNBTmFXVHZraUgyMzEyTUlFREQzRm8xSDdkOFRHSXhFMlZGQkNsUWpCZDFkOUROcDZFYS9nOExqL0pJZ3ZUOXJSYlh2TzZsOVByOHNaeXZ5K1N0QjB4bWFvNnBaQjdXcE5XVTYzNXk2RWxwVGZLNDF2ellWbFZlWVlFYVVpU0graFlOMjd3WDVrUWpTaWttODhBM2FsQzFFYjMyTFd4SHJRbnk4WmVXdmQzeFZzcVIvU2d4YUR3QXlJZjR0RWthMVdKdWZBR0lYcVV5VnozZXo1UnlLdER2RFpoVmhNSXFWK2xRSUpwZWdmSTc2SkI3VkZLbWYwL2xyUTdzUnhRUVN5Tk8yOGtRc0tiRUhpeTR1TXArdjlvQ0o5ckJDbU80UDRsRzhidzNEdnF1Z0oxUHZHbHgxT2NTQnlBWEEzT29MT2N5N2paNGFidXlya2p0ZEVDUjBaRllrUFpTY1p5RjVlQmgrTUQrSUZIQnlxSktZZmxENnhJdW5RYUVGKzFMS3hBUFRHZDRic3hGdDhMdGZlbDhKYlZEdEd3cnJsdnlVTE1xN1dyTkV1WlE4MUlEcnQ0bXNqZkx4TEZXYjBxeXZLTThra1JZYjlMWjBBUUpLd2pWRk5hN0ttM1E1V3lHMnpka2tnRVY5MWduNmlpRXJvZVpsaHJCZ0d4WVIwdWNrZWVnd25MUUxRdGQ5SHBhRFIzYUZCMEhmZWo3Yy9HaFp2dmxzbkcrUHJDR01pdm1xL0oxOUJNT2g0SXlnQkJ4MzRXNEZleUJhL1dGMWNBcjUySHk1aEE3aFQxd0F5VjRvbGVSUGpRcENjaGM2TGJFY21UQWordjR3Q2d4bGlaYkJVMkpvQnNwc0x0R2p1VFZaa2FuZlgrRFhSQ1Z2SHlOcmJZM0FrellOajNWbzhvSDBWM3l1RzA5RW5ibjcxeTVtNzdlK04xaFhla3ZUM2dqNzNhQ01zMWErTGNYdVd4d0xMSkZrK3FGOHpvdTV2WFJJQ1dwS0FISVpvUHBsMlBvMFJyMmEvYWhVQk5EeHk0NjdValR2bElnejdNdUlsOXZYNDJpdWFCS3FneVdVenBlN3FicHlFM2lvQkpSUHcvYWl5STBWbXJWM0d4enZDQVVXUWtaTGRqT05JUmZEK2NLbDBCdk90dVFjdFRhcnYwOUlzbDF2MU5RRzgvRWErbm9WRmx3OXBwOStYTUNoWmE5QUM3ejQ2SWJIR3d1NjZUdVM3eXptaFJvZTQvMVY4RFJ6M0VycjdZN2FqbnpEdUt1WVFoRll3aWNyZi9HNHBFY09TK3JjZUR4bDhaRzhkZkZwT0dvL1lhQjIxUTFmSDdoM0JtbHpjaXNOdUlxQUFVNXJwdldVdW9ZcGM5cGVMa1hMSUhUZjF0bjFiQy9ic2Z3WW50TnNOc2ovSW9odGVPMktrTHQyNDg3cWUrSmJCZWNRQ2JjSkIxVURGK1FpdE5NUlhyY3M1NEY2UFV5Mys3YllEc1Ewd2krVXJGaHkvS1kxSEdqV2I4bmt5RFZrN2pBRjRxQzVOcGJyVzdvMTdwWERkRkkwNGR3R0FBS2d1NldYdlVhUiswTElOWlVMLzhhWFZ4RjhzeEZOTGZIV2lVRjM2cVlWd1dabmpZanNPYkYxUTF6THB5Y3lQRFg5SDlnczBxSWc1K2dzVmNjdVhocGJLRExNbGFrSHVGMUZKV3Axd3N5djFnYmlnV0lvOHRwNmNMTkduK2dDTzlCWlVHUm1XUGEwaUwwbXhodDdScnRsTUhiU1gzSzJSUHdTSzRHZDFtclFEWEVjMTE2aUFoMjB3ZGFoN0lYRmhPZS9DOUdlLzYydDRVaTRVemJYTGIyckY5K1lEYkx0U2o0OGR5Rlkwck9WaW1IQ3NUTWk3ajhKaHN0ZkpEVndhTDlDU01ndjl4bmZXeGg5ZVdHditKT3I2SXF6TTArZTNEaU1QdkZzSHRQT0pYS3NIYzZ3RmU4QTNYMEsyK3FLYjhYL214YVlBQkloRkwreVJIbnpZV2xrQVI5MHVHVDNpMHZzTi85M1JoMGlmeDZ3T1VMNGNNci9PS0dEL3Z3TUdGUll0NFB6NEh0THkxTkNlbFhkb29hYVRvejdZWkZsdWl4VmdLemZjL2w4TFEyVmJ3RWFwQmd4eWMwVnRjSGE3Z2xpOUcyNTQ2R0FNUXd0R25qYk9DZ3ZVSlN3UWdWc3NvSnVoZjZFSEx6QjhNWmNBa0RKbGZsV2NnUHVPV2YzTFJzQ1BBTk03V0thRlJWczhzRXpBV3FCWWJxWWRjM0xONVBKaGpTOUJYbVpkR3h3RElOYXF4eDJBYWZOWXVNU2xrbllkMVpFa2lwL1cvU3VQM0NYSHFCd1A4bDhyZFJUUWFFTFZ5VVBIUjh3UWxXd3JueVQxaVltREUrT0ZkMW1ZVG53ZGlIbUMxL2xMQTU5MFBkUnhyUjFFbUpNZUhJMVJtZmVPOXpKYkd2WkpDc2R0emVOYmVHV3JBOW9FQ2VlalZuUEdyNWhUMER6WE5kVjh2YkhGaXNYWksxV3k3ZUxxUkxjWkliMlZNVEFnQkFvL2g1S29mMmlaUmVTelJWN0w3TU9Ta1g0ZVp5Y1JWY2llQUdnTWdNZWg4dUdIVjhhb2l5R25IZnlSTkJaUk1uNlhMdjRsUjNNMjVBV21zWEQ5YXVyc29mbFR3aUtLaFdTY0VwaHZUdVBSSlhJdUFvU1J0ZGZ0SmJvcitncmJOaEFoY2VseVpYVExZQm1idDlzWWZERW8yYnMxWkk4c00zQTZhZjZFQzB5UVQ0K3FhM0J3VDhIM0x5Q1dwMXpldEFRMjhxK3JFcFdLZG14VkVtM1h0QWErWUlyazQyREY4ZWZnNEtTSVFZTVlxWVlNdnl0N3V5SUgxWk1lL1hKWVk4SjhGbHdCQUdQMVNROTR5VUxWNE5acndLWFFBYUJsZkVlZWV6TjhzeTBBNmFrbS9rMzJmcDl5T01aT0dPbGxUOUNVR3krcWlPUDZZSnFTMi9SbkhneHljOWhEbXR3LzN1Tmk0dGh1dThsZTFLQ1ZDaU1mY3pDTGxXeHl2c01YVlpscWM0VEt0M3liTFdta1ZxaDErZXBzS0FTL3o2MU1YaVZwem9QRkZ2cWQzdGh2aENpNk82dExNd2ZRYlFvMHdjeWtNcGN2Z2pNaGNrNWMvWVV6QUNkdXdhWUp1NFVKMVhtKzdPVy9Yd01kLzhGb1grOFN5SWNkTjQ3bDJFeGdRbHp4dVBTOVFPOHJuc2lRT1ZlaFlRdFpvTjhxOXBvdTZqenVIREtJekk3cTRISHNhNkFQUUxoalBWRUx3NzZkQjQ4cFdNaVB1bzE0eGVvd0JhSjc2czljZlE3ajh6STJNZzZpRjJmRC9BY0RJdWcrU1k1ZFBTVXBxOFFLYVI3R3E2V3dmVzREUVhoTHN3cnlveFl4eVdkdWU4VFFKZUNsR0JRR051K0d1NFV4SDFwL21LK3FCK2c2VnZkbHdyZGR4bUt2amZVTXUySlBWR0FYMEJJd3dFNXdyTDRBOHdCelVxYU4xaktNRjFOemlEdjA4TGhZc0MreUtGanRDQnhIKzJvVDA3OWMrL3FDZVFWWEtscFZaU0IrZkU4cDFpbGo4TUlWbTEwV3NWQzRlY0ZBQVhoVWRCeTEyREdvY0RuZVB1ZC95bGZsRkxPcXFMSStRaFhzZkhjKzNRN0pOM0pXN3lLVmtCalpwWG5Za3hrQURnVWhaNm9MaS9qNnhNT0VKTWgxaHl2NXlWUHlnb1dOZE9uME4wMGI2K1gyV29Sb1lNT3A1dnVPQzl3Sm1BZTFDekxlQjlpZUk5YS84Y3hzSjhHZy8yVUtZQ1lHbE84RDY4MWpWeW42elhiSCt6MGVCSVhBMmFaWlJHcDE2ZEZEcmJsSjNzWis3ekc0bk45YzFubVBuUUZCL2FMNEE0bTV6Z3VUaDRiZTFPNHc1czMvMENoRHZQVkZmMGdpeUlxUThYQ3U4NmhnOW5DelVYMExZS2pvZXp6YStzVnFXTGVXZWtNWVY5ZDdTT2xRQ3FuL1dqRk9ER09TcXVrZVBzWTMxVW1pa2I4ZTdzbWZRdDE4QWx3OG5oMEh0eUExbWZmbmZIemxkYXFreGFhZVhxNm1yUURPME1zbHVkVHppVFhUdSthUCtVdlVIeWhqQUZrK2xvM3BtVXRWalVLaGN1WHdFQjgzQy9JckpMVDFPYTM2dGdaNmhtWFJFbzVxMy9NT2RzT2VOSlpKZXpCbXJRakFDS1FHVWxxUXRvM3pIVmtxOWpvMlZXUUZybmFWMk55VGRCVytzeHJKSXRzd2RsK3NCZEp2M1loaElhdkJ3a0lDUWpGd25mcnN5bmh0U1prbWJRQTVYaXBWb3V6bVpsS29IV3paU3BkNnkyL0oxcGs4M0EvVlVHcVBTM0N0UXFiT1RzcUhjRWkwc0tCK0pidEdCTXVPMkhpVko4a3JSMnRoUlZZQ1NkamhrbHRoK1BIRzVJODB1aHFUNmZRMXJvUjh3UjF2WkpUT0xsb094VjA0bFhnZTZGMWtVaHd5K2VIWllBOElpRFZCR3g1SDVsYTRJbW12VkFVNnU5RllRZVM4R0JUQk05Mlk1a1cwelRoRTBxNHdsb1NaM1lPTThyYkRJK0Q2dkg4VUFUSVJQd0lIdklTSGYwazB5N2FWVUtiSVJNbU9SOUEyY01mUCtqdk5UeVh2M1JPQ3hEeExJZ2hOdEpDb2pzaUExaW5ZSStXazB1b2thOHIwaXRYWW53QVJ5VmpINEhOVFNXWG8vZE9PWFhKOG9CbHhRY2J3UjFGTnZGbEI4VDgzbzlQOENlR3JyeEx1cHdad1VuS3l5dWJoWFc5Vldoa3NnMHZwUkUrbFdtekhSQ0x5SmUybjJwdTRpYno2a044eU9ITDQvUk9TWjJqZk9ETndWc3JZRk0zbkROYVZHamJVbGhFSVRFYzdBVXMwK3dYUksvWkxubE9COXZrLy9XcjVENEk3a2paQWErWkhHQVlEUS8zODdVZ0Y3SXlXUDN2QkY4eUVJVnB1WEN6Z3QyZmpyejNvVnc1VlVEZWFmMEptNm5DRE5FaElSSmk4MHllNzBtMmZJVTVwY215OU1Ia05tSXpLVjBUNkk5cEdUS3NlV3hTTytzWHJkLzBqcXMzTXd5aU8reUdhd3dhb0xaWEZxQXpRRTV6Z3NtZXdMYXdzRWhYNVZQMFlHT00rUlpjNFIrY3RQeUZxL2RGOTR5VnpKbFJRcldMTFpLTFhKMzVHUjZhN2RuQys1cWZJeitEM0lFMkUzN1hkcFJrV3VqNThNNkNsT2doazd6clhMaWpXTkQ1ZXhEc0l4TjlNVGR1UFN5NEljVm4zQ1g3R2wzNlZpNUhNSTZ0alVRVVkxT0lLNWhGSUZ0ZThGYmdSVDgvd2ZIZjhIVUxrUVRCbFc1UVNsc2NjR1I4Uy9hQmRRQ1VueTJEZDB5TWtzN1gvOCtKWWhscXdoa0NmOHQ5L213WDc5MUlUdHAvUWZ1ZTdIbUFEMmUwZGxKSnQ2SlR3aDVlclFtMEhpN1BCU2piWHJZWXVXZWtHR09EejMxMUZ0WUJYdEM2eFZ5OTVZaU1uRlFXWkVyKy9YY1FiRmZoWnRYSmZ3R1BneVBGVXM0NFcyVEtmSktJRmJVMGdYTDJzWTJIWWJhYU5jMU5RY3VYUE96dnZDb3h5cVNUU2hPazVabXNYWWVvbzRmd05qVWR1UndlVktGcE5tYWVPRE5PNjlzcXlXQ3lsUkYzTVhPdFVYNkh1c2Z1amt5ekRINys3Vy95V0MvMy9LeTRpanE2TDhsdEI1a28rMmcwaVVLSjZMWUVhVlZQZGpQUnREMFlnb2M3NUJwbm8vT3JzYlJyZFJaazA5K0lIQk5mRnZUVDFoTWMyNUU3T09zMlJPTnVscTc1NEJ3Z2Z6WWM5dHk0OE5ETWZJd0ZOSlAvTFN4enp2bzg4ZHBFTHhqZ01KQUpPa1JxRDcrT0FnMGN6QUJmM0l1RUh0YTFvVkMrTHdZNmZyR1pqdmJEaTB3UzlMSmI4eXovWkluNVF5cFRPTXJNMVh0NVdmVHhIckw1VEczdnJMZ0J2SktsUjdyaG9GMlp4dWc0U2V3ZzBtNWVBSTdKU1h6ZmE5aUZkYkNRaVU5OUxCQUE3QmRLUXg5NFRqWjZtcHlCcUhOMmNBWDdyODQ0MjR1Zlk1eEJ0KzMxQTNWc0VRWlAxZ1RUUjhDUTJPMitNUEVWSVRsSnpQNm9WUm9VdVArWkxtUUtjRG1UNVF6VkNXK1dqdzFHQnJaOUxmWHZ6RFJYdlJMY05lMXFmUzNuUDFDL3JWdUtXL2pBVGpGMlNuV1RLOEY0T2FlbXBGbnlBWnBCWDE3SlVjMmIzeE14Wmo5ZGI0QmorcFZYWlFCdEd5cisydHVCSEdVTzdmblFzR1RtRnBKT2ExTURKSFF5Qlp4aFNUd3kzQ1FwRGZmNmw4aWJkNmJWdDlXZ085TmFTOWNZSzIrQS83YWtXMmxybDNSMDY4ZVJYZ3FiWGd6VzFpMythdUZJN1ZUWVR0a2gxTlFiVW4xUzliOEM2M1k1WG4xS1dHUUJwRDJESnlmWEZVbXV1WDJaNHZIQXFuOGZMazcrVzBpNFFBMjlUbGxhOHlsMkY4N1piT1gwTjFmRWl1aDRQQUN3TjZUdUxUYnpuTW1YSWR1Z3pPWTU0RFcwSUcrQitYODhtRzhwdE9nVkFxMlkxVGF6QUNpK3hmU1FML05hK0R2M1hoQi9vdHRJMlVsYUVubEp3clkzVUV4ZWJNbGthak9TZ1VWZlZoeGl2SmNhamZIakdtZHh6Mm9URWM2SU0yaWx5MDZMUWtLT0R6SVdIQ0RVdTczUmw0RXBBaGRXQ3dCbktOb1Zkb0lQQnU2Mk54ZDd2TWVwekFuQjdUZmJBR3I0Rlh5ZHVDQlpXc0RqMzJhWlA1WmV6cHFpV2ZWV3Vybkh2dWxxM2hRTEFxM3lmanhFUkJkQzVoaHkyMWo2ZzNKMjBQencxTVE1ZTk4d3RZUlY5U1FZWEFyeGRKY0l2dVppb0kxaGFIemNTRWwrZGx1bHFacjNhQ3pzMTl0QjZJMnRIN1prQ0ZZNDNrVUwzL1hGZUMxK2k4RXlpdlRPRFlCeVV6RU9zbUNUVHdNRmhzSHpCcExqVkhSUlI3L1NPbkJ0bW5QL0hobkF6UGhRYXJhdHhBVjNxdmF1TEI4K0YyazhhTkRQclhodEFyaXBoQjdFbTBiRUxIeTZsQ2x0czExRnNzODhMNitHMWdYbnZtM2Zia0V6d2tSdjlmOVdFQVlUL0JBcHdCK0M2d3Joa1ZpNXdRdzZISFFJOFhQOXNiTGlGY01sN2QyUUlOT213dWNsSUY2c1hUWXRwUlJwUTIzN0dycWJrWTBWZit3WFRpWVZ0b3NNMkRidklOU1Jjejkzb3dVc2pnMURCNVhvYmNIRTBPbGZXVGtyZUg4VXAwcWxpL3E0V0ptUEpMLzNkS3krR2dLeGVMSDQ4MkxkRVdxdFAvZHY4NjBVNUYveFRKMWx0RU0vcC9YRWRHWGMrbDduWDByaTM0TlhiWEhORU83bmpwMWJiS2Y3K3RWNW4rYVBEUFU5VDEzaStqbkg3cWxSZlBGOTZsMTJzSnJwVGRkLzhoVG5Ici9TZk1zRGRtVXNMcjdxL3hwbWNUSzlBd01JeDZ1NzloYXd1MnptN1loK1RSbDZUU2hOSmdhaDlIQ0RkL0pNWE9zWU9MMWRKVTVnMS9LS3AxYk5uc0puck1rdEVYTXhxaVc0cVM4R250S1hpdXRJYWorUE4zS3diNVV1dzRpc2htRjFOZTVkbWE3QWl1YW9NMDhSLzZBL05qZ2txaEp4TlZqMVlNTTBRSzZMTDhvdUFFYWRNRWZQdEpoWWRkWlg5VnhnczVIM2RyQ2dlbDBuUXhDV0FNclpZWWNhR01tbEIyMHhBNGpRRlhBQkM3aWVRN3VhUTUya0VGUjBxVHJ3cW1ocERMQlNCOEZ3cGxtaEpOM2Z1dlROclhsRWU1MjVvVEhQQ0todVFlR2tVRzJEWW4zUGlOQTZnTWhuVHhIZy85TzJqRm90SzR3aTdGN0hUbTA2OXdqVnFJTTUrZUNyMW90dFlEcXArN1VQT05qSTU3eFR3Y3d3S0VocGY0SHM4NDdodDB0QkZEV3o2bE16d1NtU0xURHhIMkQ2UGdweVNLemJDOXdIUzJ0bUF1WXFJdWFrWktMb2VFZC9KN28weW45OTVxM0RzQ3lVY2FLSUlBUjdveDJqdUdNTE1MZkQwT1FQSnp3NmMraHVWekxPWWJsQ0xlVlIxRDdQWktvbGtVVmFFdjN1Um9WeHdHaE5SMnEzcFhSei9RK2tId1hLTFFYbXBGczZpOU9zYS9veStmdkhQbk1IL3BmYzZveFExUDVoNHBCSGhHQlY2U0tWaUE5VlJGcmp0VTRXZ2UyZXYvVng2cDBUTElZcE5BR2NTcU9NbDdITCszL0g0dXI1NFYzWWVZb3RnRkh2ZWZ6ZEFBN2F4dXMwaFJPWkVJMXlYMkN2ZDRvWHU1bzRYaW54Yk9QNTBJR3JHdG1xZGxQaUhUTVdqTDlJK0JuOVdrTUtaWUUyQmlOSDFqQzNPNEFFTGR5QVc2YTA0WXRqNll2elc5TGhHNGplcGNRWnFScytDOHFhK05BK3hUUWxxWStyTHNXQnFua2paV3JQMjhUYzJ1VEN1VFBaRytwazZ5UjJxRlVSMExpY1JTclI1LzN1dGVXR3JPcC90ME9zYXU0VTVJYzAvcGxWY05seFY5WXpXZHJNRjJ0TUVGK1dBeXU0Z0xrRGZQeUUwUVpiUnV4V2V2QlNvTHRWQ29GRDNqczBVWFN4L2c5NzdpQTNXM3doVUwzQ1dtSTljcFZCOGVqWllyVkhRaWdiUnFsTDFMVm5LZTA2YVJ0VnphZDNFU1dMRTNCc3F0T3V1WnBOM1JsRUVZTlNzYnJsSGNoSjNKUE9EcG45Rk9Hb2V2M3NETXVGbzRxUkJIcjhPVW5UVXAxL3M1T0RlYlg3V1BaSW1qU2NKamVnVllnV2NyTnZDblFIN2lLUlRHR21lMVhudjd4Nk13aUJnZE9TV0Rrdld3Ti9wQkNxMDdVR2lwSWxQNkp4ZU9Pc2JLbzJ6cUtOVUd4MElWN2F6VVltYWRWbXloOHJZeDc3ZjN5bGtRY2JiTXlveld2Ni9zRTY4ejYvUU5XWnVzbGlGYmRIbXNGaDFXVGhKeGlSRjA2d1lDMHQ0OUpMcnV2akJoRFduWHJrNGVDTnRIMmwvY1BNMm82SXkyWU9FNzRzRkhqVEZtRDVYRFFzNTJZWkNVSFdJLzVWZHZXWWZzNzE4ZHpDUFhRZFRVMzgwUGdJcXpmSGJ2Q3hZNHp2OEVDc2djd3NqMy9zZHFUbSthNUNoUkZHT0tlcFVZdlhBNjZkQTJFS2dYTldVZXpuYmtNYzFEdWVwZDdQeHBhSGg4cHcxNkxGNXNhcmVZamFHclI2YnJ6UHdwd3BXancrOThkd3FsV09BbDRZV0prZHJkSGIzeCtabEh5UjErclF6N2NMaXZCOCtmRmkrU2dDU1hvZlRsSnl0dGJvOEVrbUdvai9Rb2dkclkwM3NMK2hEWWN3a0dVKy9CditjRUNQWjFucmpVR2I2d2dxZlVSaXF3Q3hyem4vYUY0cXB1U3dqbXI2ai9TaEVDaDc4V0laWksrVnlBTDRKa1FkM3FWWnQ3dmZGRCtWdG9YMGFxdGxwRVhJb3VQL2hta3VyZkhZZ1U4OW5zM2dueXdnZjdUTDJtUkl3OXJuQkpZMU5aRmlpU1VhOW1hOXd0VEQyV09Zck55Q0NMR1IzV3RTVklSY1NmK244QjBRMzA2bnBRdk5nOVVjSWs5WXJUMEdGVVFJV1pualNwcFZreEw4N09aMTFseU9pa3l6RFdlcDREcnlWTnlyZDE4MUx0OHJ2UU1tamRlVGdvQkgramdTWWFrcWdPVDBCcmhTNE1JMUMzQVBYVnpsazhaTUVnRGg3WEVFOEg4U2Q0RGhBTlcvUFFpVDB3ODcvMzMxdlA3R0ZwZVljZWhxMmYyNEdMc2hxYkFTekVMVjQ0UVNNOEJNcVNmWWsyV2FWY2VKM1lRSllNc1FNcEt6Yks2Q2ZQcGZveWpVdmtsNG05SWZxanZBOGtmOTJWSW5DTTIwMjFvcXNLVHNDa0xmcnlBd2hERnRIK3hyUE1ibjBneHdVUGRKYVNhZEFSOWFzbHlsOEZ6WGxwbmFhRysyZFE4SXlpcWM2WGFoUncxMHJra3diUEowcFFXTk5LaHM0amFqNjN5QXB1cDkxcjR6K3pTSHNwTFBMektwdTNkUDZDd2VEWUVyRjdpUDRObTNZT1RuNFBhcU5aVEoyUzVnNk1zelhGTEZXQTVxSUs0Z2dQenExUHVQdGl0dVU0d3BHMVRoOFFpVEFPeDhXNmZVUEFERlN3V3ZwSTBJSFhSYnVtSldsRWFJd1BPV1E2T1huNHpVZThzeFMvL0VpcExxbDlMVEZRc3Jyak9wWXQ3ZXZ0ditqd01XVnNHQVZ5aEFKOUlmbFBOUU9OK1I4STZWa25FcFk1ZFh6NzRnTW00eVhiRHNwZlpNM1NwNUU0WHV4RzBBREJGZFVxdVNBaS94eG9lSXoybDJmanJpOVRST05TYWVXN3Q2R0RsYzBwRDl0NkJhaG5EMmtINmdLWW8yVzlnMVN1SjRXNXRVNWtnNXF0N055ZEpzVk56WVNhcmdSMHQ2NG5sbW9nVDRab2duN2h6MkEvSHFMUUp0cnlDT0FEeGplOXFQaWxaSWErcDJGNHplMnFpanpHTFFCbWFvNzVIV0JDZmowQzV4ZXlISHlacUdmcjlXc0hXN01wSDVMWllSNmlia1VOSGxHejF3NVVlQndadU00bHp2YTlWTElaNTNsek1XWWdMbVRocmppWXZOcVUrTStWNDFjMVFYczVjcmp0NitrbzZRMCtudlFyWDRhS1R6UVF5Y0hkMEdRWS9ieGRCZkVGZ3Y3UFB3OUVGcFY2QUppeWxTTkRsNWpLWithY1JhWDhCUElJbG1LSVVoMlBTUUdESjE5NFgxdWVNWmk0bmJiL0dKY0tEYWlnNisvNHlNUFl4MWQ5K0dHMk5LY0VwNTF1WEkxSTA3S25LZlorT05IdzIyMW03OWdaaGl1ZVBYSkxvT3A3RkN5UTdqK1cwTjBMV05TbmRhUlB6anUwVFdiUjczY2d1WGQvZ205cmdrOGVyU0F5VHVsMEQvYk0venhlZmFjWTBYM2g3eCtsZ0ZpVXNzWkd6enN1YkJ3K0J1eXlMKzQyVDZRbkV2U0ExeDhDUDhmNUoxemRtUjREcWgyTisvclc3THVtL0pvRmtpK0w1SER6eXBsY1g3aGN3QXFBS2orTlNka2NpdWhsaWw4WUkwWHNoNlRmb3JpTVdZQnJQMDZhZzhKTzlvanBxekJpbk1oUGdhbHFyV1pneXNObWNyeVJpOE1zRHJIK2tKNTJwWS9pcEFoeXgrUlI2SWc5RXJhVnVuc2t2ckhKMzNHYklqT0dRb1ExYkxnMUF1SlFEUmU0OTBRbGlLejZjZ0o3TkkreWxyREdOcm1CWFhzd2tHbFErRmROOEcybnJwNElDK3FnWSttZGJjOGI3b29ndDNWbVFJQzJpUTZhV0k3ODB1K1RpbHdpaldsRG1MbEZ3Qk5jbDdlTlptQjFQOW1UOEwxbDRTUFF0YVlSMWJ1MHFUMTEzVmsvSFYySCszaTVuRUx1OEVlUUFtbHBUcWlYZDlzU3pNUU5hVzZyOEFlNGNBamVuckpjc3Q0TUxXZXpLdVBqUmoxODg5WUQzTlp1Y2NMQUdlQ3ZGRHlJMDZteUUzeUNRUUMrVHpyNGhucnlZczNRVHRmOVA5VkoxRHhlVHBJbnh5MEsvdDVQeVZ0UDM4M2tZclMzRTJadXdIRlVMYzkyUXRTSHlBZzNNTTF2c1Q4V3NaTTJYRkpNcHEyQ2ZrUHhKWmZJcEdIVXVkTG43Yld0Tlh4VlNPOVBoWFZ0SjRJRU5NeEZoTEpvaU80THZ5a3c0RlZ3WmJsY2pDK0lxeGNZcGV5NlRvMTFEQVBDYUwxVzBjQ0xNYVlQTnphbFMzT2VJcGxPNHJnOW1QNHhSMFk0UTNqcjNseUJOUkl2SGcvajcvOUErajZsV2tkMFV3TG1JWE0weUVjMXZPVjN4VGRVWXQwSDVrNzMvcFlNNmszK0liSFRva3B0MWpYc3ZXSVVJN1cyUVZlMm9KS1duL2JYQW9keFFTVnUvZUl5bzVRZFVuZGJ1Q2hjeE5waHJuaVcxSXk5WGY3aTYzdFVPSXRYUllGU1lITThSdHpTdVNUdG1PNjVpWXlnK2dxNHVxN0VsYzBGeHQrckdqa1NVakVrRWlXVEpXZzMvVmtPVjU4NWZZK24zOVd1d3JtS3MzRDhIVFFGK2tZenFlVWZCV2ZjbFZXdEhxMjZZdEpLdnBVdDBreDcyTnNPVUNHSThBTnU5Q1BPZmR0SW1HYks0UEJLNkp4bFpwdXBKMlY1Z1FyUTBtVXRseTVWN0srOVlZT1YrU04zeThIWUFpS3pTdWNJZ0lQOHB3M2luTlU3cndVVHBUdzZMMlN2d2U0VXJFRS9YUWtSQ1NnTEw2bmRSSVpxLzJ6aGREajZZcDFTbkVYR2tBSEMwMUREdnE2ZVhPV2VMK2dCZjBrdzhLVjI1eGhiK0FZT0Y2Ky90Rlc1aHRhdE94aEI2UGZoNVNKMkU3UnZkT2xWT1ZlaHk2dktsK3JrZGZTVmx0WngrZnhMTkVQRUtGdFpPTjliME45ZnlBZDVwbmlmaWc0TDJjWkpMMTQ0UVYxZmw3Tlo2ZnVTN0ZHTHNvLzN1eDV6UUw4NDE1OWFJT2t3UUJwRm80bjJYK0ZxRXQrN2YzekxZSThSdXROWTNYSDJuRkNENnR4TXBIeVFEWGdMVmhKdkRKbFM3Wk1mUzFpenZ5NUQ1TW5UMzlvbWlDNUYxc016VEFhOVJTVkRnbzJaZGhzZkZ1cmNPekRqcE5mSk9nUEZvLzg1OGZHWGZMMjR4bXh1ZENMSy9UQzg3TDJWTlRUT0p1QlBZcHNMM2xPL0JkWXBWYkszb3pDZGxvTVVobEphNVdWcGJSTFRvQ29mNGUwTUMveng4QjB6Z0NQWWNaWHZ2ZFQ3V0hKMUxveHZWUGwzWEJJNDBybjR3bTR1Y2pBUGJDUmdPdWZ5Nkt0YU9nTmhtS21CK2V3QU1ETi9yTmdEd25EcmJRcnY1NFpaL1M0WHlMdnJSUDhQN1pQbzJDY1liVzVIdG81elRxbEZQSXR1K1hxVFBiTmhqcXF6VlZXL2FjTWtiTmFYeXBJRnl6Yy9WaGRGTnI4L0MvNzZsRFBHMVlsZ295ZUZCUkpxQVlXNDIwVmpaRlZVV2gzbDAvUUFvT29xLzJ6YitiNVNMckliYUFwOXVVV09XTkc4QzZZSnBqRFlDelZHZXZUem14UkNVb3kyOExjc0crN2RoWC9vSnplc216Vzg4bzJRTlJCSlhtZmxuUkdjYmcrSElmMTBlSzg0ZS9vSktVMkNLR01NTmlHSVFTM3REdVRKT2tRRTB6QlFTejM3RXZkcmhGWnFJNTVQc0VJdHkvRW5Id1RJR2Y1WU41Qm05ZEViUXg2KzIrUHd4a2cxa3pHQ1hUQVZMWDhuU0JUdUJsNEZsUHN0ODZzcDRtd0dPYzU4UGltMkg0R083VFNaaC92bDNWOTVNeHFnT1RnYTRRSTJNQ2cwelZLSHVaM0lIaWNDU2hvbXVqRE9vYlZDeDFVS053dGZhYnB3NGdhY1NYckROTGpzakNOa1ljL0VST2trTnJ3YnVDYW4wZEQzNUdNWHVIUUZsMCs0SDBONC9QanNhMzlyTkNOcHAzU29kSHhMa1ZoZ3VyYnFqVStEVThSTGxkcFRaRmJDQ0dla0RUUytrUnpReDhjZEQ1Qllzcm82K01pV3pvQkRxTjFGZDV1WnZxWXRlQ3VYS1RsNTNTdVV3UmlscmIzNkNtd3pYOWhvUHN6RGRVUVRxOEpNVEo5QlRmQzZ2U1VZWmx3QXlpUEhZanpHVmMwK0RCMTVaK3E2Vk9nMk5UV0VRUGkvN0JLWEtFNy9GMU1yYlE5cmxRdjQrZWkxcEt0NjZ0Q05oYVFUT0srZzVLajdsSGFjRVdYMmNZMkNLWSs0MmQycGZxNThaQUdHL3UvNW1EVE5xcDNldzdpY2FHQit2dHFyUG1CR0ZiMnF5Z09tbElMdDhoMGZGVlFhWFRhZW9TMUhoZ3Zuc2NCWHpaZ2Z1VWpQbkRyS1oyV1AyRS83TDY5bHVCYkxEaWVPcEJRanZOMkVUVWtnYm9oeUttUVA5dkVwalRUZXJXM2g5SWFOMklxd0J6MDFNbWtEVFowNkc0UWVPbXNwU2J6c0wraXVPTWluT1AzTWRMam9lV0ZiUXp4NVM2YzFWemZVaGdYNU9QTlN4ZkkrUS9ld1FnaW5lYUdBVG90QVZaczlwSkxGRnI5RHNMRHFYdUlWZWg4cXgrQnd1T1hQUU9oeDlHSVA5OHJSSVJqV3pOdzNSRXRpRURQMEV0Sy9ZMVRvSlp5bk5UdFdmZDZGT3l5ekJsY3FCNWNHSnhtbVdrV0hRbWhpWENTVmwyTnVMVVdlVEtWeDRxaUxhV0VDU0NxOHQ1ZCtEWWc3anhrUUo5VDJ3NWE2eHR2bGlHMUszbmhRVUhaVkJGNC9HbHMvUjdXa3dXdm9QYjFtdU5GM1cwY3lrcUs1a2J5YTcyQ1ZaeEJERDVjeTYyazNmZ3RHZXpvS3hnazU5N1ZobjEvclJ1Q2pNOVNpK2tSVkNxNnExTEptWXlJSjNpRGxuR2VSWHp4MHdZQlJibnF3TnRBTG5HSUt3a2NiTlgrczd3MjIrQVdGeVdndkJpMml2VTNndXJxS3pHVVhrZ3E5enlnN0MvMGtJQ3UxK2NadnAzMUFlcnlzUVRsSzhEd0VvL0g1K0x3bnN3MUxoVlJTT0dnZDRYOTRvenNQbXVOQ0xwNjhDaWtKdm5hajQ5bHRMcitNb1JLVjRnV0RPdDRQd0phMktnZXdnY3JEVEJPV1ZUVDhmTVRERlpDdXY0eXRLdCtMdU12cUFLLzBjS1dBb25hNjg0R04rdmd2WEluYm1vbnQxQWw3b1dnNmU0UFVqcEJwbktnWFRPNWQ0TFJ5c0xLWkp0cTQ5VDdHb2hFa0k0ZVBjTnNXcG5iSjc2YjFIZnFTNW1ESHVKTGJXd3dqN2oycEdXeGlmdUoyVEJnb3h3Ulh0ZERzWDFudUdlbk9DZFlBenhuZk9uRlRVaE9SNVVSalFyMDlibTRGbDhxaTd0ZkZEQTVnbkppVzBmME5VL1dtc2xnUXM1eTB0Ym10VUxHaUFQWHFUVUJPN3QwMHhNYXFmV1JUWEJ0UWc3NjA1Y2h1V211U2U3WEpONzc2OTg0dTMrcUxCNEI0YjRVYzcva2pNRWsrVWhsUnlFQTRWcmxuVkg5Zk9oeXVlMVlWdExiWC96NFpETkhyR3VpdVAvTU14Vkh4aE5HUUpZN2YxWjRETktqNitlNE1GVC9zQWtxcGZzQnRWd0ZsOElLVDJJUWF5OTNVakRjaFhWNG1tMytIRkMwbTUyUzFraVhJWkFGRUlQOE1MTUF5VXJxYlNxTWRvZU5VZ212YTFLU0Y2djJtV0p0YVhnQTJkcm03azhhcE1yL1ZMUkNSRUF6RGJIUjVRQ1JTZHdLcFp6L3hsNVRINHNZSXQyOTZ5L3ZwYUovTjU3RUw0LzRwRmY0YWtzbTFvRDgvL2pneUV3R3lYUDNmNkNzT3h5WTB6MXhrNXpVdXZzb2UvQndqV2dnZG9WR0ErYmNVSnZxRkZMZ2xIclQvUDFTc0lETkN1ZWQ2Y0R1Z0xyRFFzVXVWcmlVWExMcnlGc21YMWFCeE9VdndDd3UrOFNVWlpzQk1GNENnNk9RM0M4ZGdVR3RXbURpMURldjFXRDhNL3pmeFJyd2MycmY5MzhZeEhsRS9FdnBPZkQ5QUgyRjZQNVREamNsV2lOTjFCb2tyMG1MSE40aHdvcVkzbG5Kek9hNGxDcVArNnVudWQ4VUIzbk5hOW52RTZwYjZReWdMU3RMZ2dhRk1JWEkwcmdGdFpkbzdRZnQvTVF0Rm9ud2QyKy91ZEFwaThuQ0pubDdsMEVYTHkwWlBUOGl2Mm4yN1hnc1JJQTE4WTFSUFFKU2FtN2hadnByemNudHdkekRsNDB2RDNDazBQeDY1QlFUYTZUUElOaUljVGMyenpwTGVCWStXWTJmYTZmb3BIVGw4YUF5UUM1VWhEMWptTk04TW85R1JQVzZSM3hibDJiZWRiWjZIUnVhc3VwU0tnRVM1NGdvdmY3Y0FrSlBqbVA2YWxpKzhDS0hJY1BoWCt3QkU3YXRpejdRSDFxRUxrU2VueFpoR0JpUTZHWXE1WllVbU0ra2kyOENGaG4wV2xPa2swdWRkdnFiZlZDZWowYk44T1duWnJiYS90bndhZEJKMVhFM0FVM3FVRTZXSzVTQ0doRDFDSUVMckdLclRjYU5sWUI0NjFjZUE1Wk84Rzl3dFlIOU5ub0pDejFlckdWWVNVYWJ2MUh5RFBxd2NhZ1RHMmRneStOV1VtY0czYllkNFVWSUlRQlNhc2pudncyblNteUhxUGY0TEdwUjRpQ0tZRnVIdEk5Yk1aUW82VDFReW5yakRHZHRlNFhabHNmSmNDNThKelJtUnplYm4wQjVrZmV1WVErQmY1dHdDc1pNNjhVNzJWOG1GMzJ4WG1uSi8zTzRHcGZmckZWWlJZSUhtb1M3Q0U5VXFoR09lUXByQ3B6WHVXNmZ1OW83aFlzblpRb0JsUFJVbVp5NzlsKzN5Qi9ZT1ZmZkJ1MnVsbTM4cjVmeGo0NW96UGhXZVJneGZJZW05VUcycEVnUU5BSS85RWNxdDNxc0R6TytvcTR6MGxENkF2UVlBN1JZN1Q5V2UrQXhFZllrQnk2MnkxTW1iMzdlMFlWNTRlRk1lM3hLQm9UOG5SQjhXdHJQbDZpTVhxUE5EZkkrTUt1V01CTXNGdG5JSnQ5clBoRWtiUEowYXBBQUpkb3h0akh5NnF4c1pSSC8vYnJCTGlYYkpDbTJTelVZeitGNERta1NNcE1icEdpbTVLd1VRbE83QzROeE9GS3ZQOXJqK1FSRFpPNGl1T1A3ZFBNY1M3cndaY2tEWWlJTHN0aHRuRE1pRkErZ1dHRnBJM0wwWmpOZjFEVWd1OGZlQWFZMTVCcmo4NE10Wmk1d2RJalNsNHZPcDRXZmgzVXZSVm8xNXk5UWsrQkRhRW5qWDQ4SlFwMTZaRVcvR2RpZGtQMXMxbzFaWmp4OHZWNElSNVZocnhMU3dQOEs4a1IzNHNYcUtqZzR4NENxajUrbW9kYnJQMCtrNlpNRDVUMDArZVV1Q2luSFF1Yjd6TW9FWmtIUUxQd2R6blJWUVBuZ1ZoaE5KSnFScVJSRmhLWkNzclJqWVRsMGJJZm83U0JjOHJDVGhSM3NqWnNDQzJPNC9abTJKcXlCWjRoV21ucDJrSTVvdllYYXY5ekZVbWxOMnBwbHVHR3RNWE14NDFhMkhKcThxeVZtdDZxZm8zcVlTcG0wN0xSNk5GNXF4bSt1VHZmUzNZVndnb2M3eXdVQ3l6SW1zNTlaYlpNUE9idXUrNGpKcldQY2dXNHoyeVdlMlB5UHByZkJhR0lPaVlyUWRyZDBUT2piRCttOHM5TWJnNm9NdjEwTEs1SGFUTFRMbDVUR3BpekpNa3FnWm82VUJxRlhDSGJ0Q29mVTM1VkIrcGZqeEErNzhIRURYeHFPTnBWUGlOOHZBTmUxTldtY2JwNUpVZkt3VkpyeG9DTjlxS2toWjFTb0VkdTBPeHRjQUtPUUVpU0dmRFFlNnFQeFNYZ1JDVTZuU3hzL29hLzF4SHI4Sml5ZnlkUzRJTTlKa0tOODM1dk1QZGZyaUtIRDRoNHBuanVBMDFsQk11Mms0eVpxd1QvemVKTnlndWpwMlpMRjN4TVUvaVh5UjJmVzg3K3ArNi9wZjRtRU8rMVhuZlhDR2hyeUFmUTNYeEJEd2NoQTJZQ0lNVDRQM0ZoaGZJdW54RFJKUDl6ZDR1ZVpDbjh5YzdqVjdONi9nVUZwRjRsTHZkQXJtS3ZIK2RyL09DRE8vbEdmTGVtQ1dnTmxMOStieGxXMVBNTGJKMTBEclpJM21ocW4wZkFyekZqNmNTei92aDI5ZWh5WDFNczEzRk5OcENzODVlODNHaHArTWRpdmF4UUtQMHpmeGt6SWNmaUJ5azJSUXhSRGw1VGFWcUhRQXVRaTZ6MmFDbkczV25YN1JIWnRvc2FiRXhYaWtJd01qY0dHWGlORXFFRjFwWGxJZFRhQXgzdFlkMjArR0Q3U2JoQUEvQkpOUTlGdXFCdW1nOEo2Y1psRzBLUGtBMzlEaDNxcjVESHdGaHlkbVg5cEUzVWlTWERnN3hoZWFXZXpyQkYwOWFzOWREbGQvdDdEZkVFSWtsVjVpVytyWFJ0QXNCSmJySFpsUDVuSTdFd1B2aG1QT1RYRW5uWElwb1ViZEVoYTR4dmJRMWZWenQrOFZkRDd5SWptVmI3VmpOL2dtdEdTeUF2ejcyeXZHSDRyT1RobHBldjZkbzZjQVRMejNYVWRLWGVsRjg2ZW5GcEhMZUlmZ1FqdUxuSlE3ZGFaeHZiZFArRTkwUmIrRTI2aENyUE11MlFHOTZuT21NMEtzdXBWZ3NFZFZnMlFoYkZxZ1R1TUp3TGxCd3JBcG5VYmVLNmR1K3ZNZzVpbkNGNHpWa0dWTml3QjJKbXdHdnJQWThZTVU1U3Q5alVnR0hwUkplZmMxUFRYQjh1c3dtOU53bC9pTG1JVFJ4VFpFd2ppZnphYnFSNkR2Unk3eVZSU2tkbTB2OUxrUFpKelpSV0hEcVU4eXBqMU1pM1dybVVpeG42ejREYVFLMHJVMkw4M1NLYi83aXE1aG0rZ0Y3WXZTQjhaN3dCbXZ3VEEwK1pVYzZsckJIUE5jSkorNE5renRvcmtvVUg1OHB1UTJSUTgvNldYS2VnRUltdHZzS3ZVYkdWTFJjeDVmVTNqUXJoUUs3N0s1R0F6Z056MUFHeHI3czRyWldscjlWNkJYbkw1MU52MTFaeEg1S2RIZlgyU1RpWXFaWm1FK09SYzkyTld2TVVWVWovVU9KY1h6b0ZQSXRCdnAyZGxMUDd4VHBkMnRHWm1iSUtPTEV3bU1nRjFTZmZBV2Zacnk3a2xmbjFqMTRDcGtRRjhTQ2x5ZForV2NsaE9wN2R6K0FRbmkwNWVvVU90ZmJOVGZxYUtqekU1Q2V5TnN1eWFkbGc1bDZHcHQzWDVpNUpDQjZWbjhWb3JOaCtoQU1KS1dsUE1YYmQxVDVnWFE5bXFha1VlaUQrbGExUUxRaHlXV0paMVhUb2ZNTnRjRDQ0UHYxaFZkZEljaktCb044ZThleGRBc3A3ZE9kUlQ4NU40dlVubENmY0cyaml4TTR3TUU0dS9keHFaRWlyWWxKNFkyWlcyQ3pSV2VjazMzWDZPNDQ2eW4yTnhwVzNRbnc5NG95QTZ0TGhuWWk3OHNEVFpPRDJTanVxVnRpY05LVnRKWGQ5b0lmRkJBcEhWUE5Kd2swZ3Q4aXFrTGlNcytIcE9TdzlsWmVNZzQ2YkZrdWZRbFB1R3hGejNFejVWTkZsN3pJWkZ3ckZtd2h0NkxaQUl1QkZqaTc3dDRXbFNrQ0xDSDRzN3Q0RkZrb3d1cTk5SXVzSWM4TkpSUy9oRGx5ZFJ2czM3NjNBR0VXNEFKZDFwZzR6S2xDdnJ6RU13TTJoUW5wUzlvVGc5VllldTVFUHQ3QTVhVk1EK3dvTERYR0hFVWZTN2hoZ3JXMDV1YTZlRFZBeEJva1VOWDhQR0RCby9UVVBwWG9nM2FiNjhNS0MwQUhLd01DOEVsNm1ENW5RT2F1ODBpbjFHMVhnNWpqVmhFcWRDeHM4T2wwSnEwYkZoNE5IZ1RiWTBzc3ZpZTJHMnFQLzhvNTlJWGR1QlQxMVROYlhpdE0wRkZNN1dUTzFpUTRUa1VaMml3M0FrV0lieW1BZFhQUm5CT1pwci9heVN6U0JlN2lVa2dpNU5pODRlS0EyaHp4WXRYUVRUZFU4WWpGZnRiRmdCaXNVcEJuOEFHRThqM0hxM2t0V2hJYktzeFNHaEZsQ1g4ZlA1a3lBd0ljd3lzQWhGbytwSU92d05TYjhXaVNTeWRzWGdaVEUvZ215VVg0Vzg2eXU3N0hFcXJHWmMxYUdveDFGVndiNXlybEgwSG5GM0RLVkJMS09BdklYR3pGWnQ5VTNYMWR6S1VzYUU0UjlrUjR3eGdoeGNiT0c5NDVxalNKVXZSNXVtc1VHTmVCK3JUNFc4V2laNGUxeEl5MzVma0VBRWZtQnNla3NEdTBENG1yaVJ0WUVpVmgrczVveDB2aW1nSm5WQ0hlZ1ZUdEcrMWJBUE5tbnd0Q2pPVU9tMzg4MmM1M204dU5Ma29RWXVvY3dNanJLRkx6amp3bnEzeVpZdjlvMFlTTzdWTU10Slh2OVFDOFFUc3N1VHUvMm1MbWVUMzYvVXJmSVMyVURIRnBQN0dwVUhtZHBWZ2N6QjIzUld1MTZjS0ZJUG1DMyt2K3BsVjAySmJvZmRENStOc3dvZW1OTTNzU3E3c1pOZlVSQWlJZzRvb3lLajYrSHVmd0tVZzRXUXF3MG1vL2lDd09udWFKM0RyZUZtdnVPalBqZnVUY0dyRjZKNDZ3M1VpWGVlVFhMV1BPYTJYaloxTCtPdzNXMXBhOXdHUGovZE52WWJtaG5kbkJ5ZXhXS2lRbDZuRFMvQUkyaFpmOURMSnhIRU5wMmEwZmVZejJRVkFlS1NDK1gzd3VRa0UxMUh0OXhoWGpNMUI5aERjRHd2SUNGT1pJMCs0SGppTUhRUXoySm9GRVhCR1NvRzhqelZyQlRkdGdQaVkybTRjd3RkY3p5VW14d09QM29saHFEdzRwSjFKdmRVMEdCM0JRWnVrU0VBWHAyZlQ0djdPbUt0OUFHZ0V0SFFVT1VWSHlpT1JEZ0pvRTd0KytLd2VodHoxNXE1SWxqdkdtbkVDVzlkampXMEpxbjFLVFhHc0FQMFN2eFg0ekthTVRtY1dPYmR6T0JtTUY5VGFNcGJUOUdMV2l3SHNJU2c0eEVXUlFtUXlKWXlGTGZveEFUSFRUQUNvRVgyRGRGeHI0NGZDc2JtRG1idTI4YWhkd1BZcHVUWkdBRGoyd25iYTI5QUI0aXRibCtHNTdwdWIxc1F6cW5ucVJDK2NRb1lmOGZwY3NONDdyeENWYmhEV0dGd2FmS1RydkVqRGF4RUNWYXVHenY0SWlzT3lqR3d6N3ErNTBtbmJLMHhXY1Y2UHE0TjNaSGF1Z0NYTmpUcDZBSjI2WmdjaHdrL2R6SWdLbkZIb1B1QStQemhIT2FwQ3JzV2dKL2pSOUpYVS9NeWczcndwNG15bHpjOTJqaFRnWVM0RmZHVmFXcDQ4VHdwZVhFNzgzbEZ3RHRXdVJ6YTMrOC9TeFVZWHNGRGRTb2FwTmp2M1J1Sk42WnJ5RFF5d3ltbDR0anc4UXZPVStVK000cHY4MWRhOTFESHZLZDIxa1c2UmZCOEF5SmxsdHlqWG0xTXhDRUsxWjJwMzAyVVN4aUkwQUg1NGp5OUFFSkM0aXMzcHJWZ25vMzZtK3E1dUpFRjhub0o0cTBFdVM5MGZ5L0p6aWp6THk0U1RsT0RpYjd2UnRXSkRTMUUzNU5BRFpuUkR2RmdjZWdaY2lCTG53M1pmMWZyN3AyUC9IWnpyM1o1VHJWOXNHTHU5VmRPd1prdzc2anlOeGwzZVpQSk9neittN0M2aTNaQ3ViVU84N1JhN2R1Z2w4N1R0TE5LZFdnQm9IY1BSRjFqOGRjU2ltbm85dVFsd1ZDNS9vN2VhbzVzZnhibEtUMjdOSUxUS1UxeDVQM1dLeFUwRjJ3WlI1YW95UU5oRUk0T1NMTGQ0U0RxeXoxeWtYZng1bXYxMSsyVmF2Mk0xenZXTW1rdVdTU21mU2hPNXppbjVTOVMxRmN0eDdOMEZoSkdiczdVa1FKaURKa1dMNWxmcGFzQ05aMGtiSjRGY0RxT1JmQkcyYWR5THdyVnp3L0VneFFIT1hxTFBSSnBTMnorSkk3OS9ZVzBOZHRybmFvSDFFNjd5MnZhZGJsY2tjUmsrYTFCSU4xeG5qeUNUNEs5VC9xUUU3U1VvRFFSNnhqT0hFMWpVQUtFK2Y0SGlzSEwyTiswSUJGYlNsYWszKzlBQ21NY2JneDdsaS9ENk50UDh0K1Z5QmNWMkh5U0xTN01CT3piS3BwZjRqOVY0QlRFM1FBUmhSeEVCVkMyTy9SWGs4ZWttUzBkUHRTS3dtc0ZLdjhMVWJLaUx6cDRtU0YzWURFNHNtQUsxK0U4c2hrS2tqanJhTU1FaXJLUXFERVF3V2JVMDJGSW5TTEI0eW02M01VUW03Z1d0bFIzeHYxOTBkeTMvYW41MXVwZGp0eXJkWXppclhjK1NadG1Nbmhaa21PQnFwQ1lSbmZzcSsvVlpWU3I5ZTVQQitqZ3lkUzU5NTdEbXQyWDZLaG8zMklLa0tPb0o3UTVrWS9ZTHVyYms1LzNNc0Y2Wm1lNGhLRit6YVNHeE1nUkJoNFFEZEFVMlg5V1Z4eUVORXVyK2RWcWErdTFxdGQ0UFFXdVk1MGhleXRNbHZBUzJHOUpQdGo5cFBMQTZHSllscTMyOG8wMWtlaFJXWU1RbVdPV0svcGpoZmJRaVdrMno3d1RsazR4bjNPVjFCZm0xbE81c1VSZFlyaThzNWNOOGVnZ2VENG55eUJ1czM3cU9JcVRJbWZqTUI3VWcrQjc5V1JDSVdPMk9kaDVoYXM5K0pDcVR3ZmZ1c20xbnlhT1lhbkp2WVhTY3NsbHdSNHFId0E3ZXB1YWF3NHRISHhXSkFXa0lIQm9mdjk5UjFCRGNSb3gvRi92anBrQ1hmOGdHTm9paDJ6dklsUDh0TzJNdGxsYUZDT1FNaXpKUENsN0pmZG9mSVpxM1hmZG5pSHBTRjlHaC9CeDJteVRjUmpuZU4ydldub1VFZU03c2IzQTUwaGVCTWxXNStXQ1B0VUd1aVJjR3hBc0NXMHk3eEY4eWVCeWNKZ205c3NCeWxuV1ZLZlVjN2dVOExTb1dXaTFqd0tVdGhjL2JLSVlsUlc2U21PZ1hyWjVNM3dFZERjY3dNS3pDZkxTcnY0MkJGcTc0Z1p5N2J6aStZajEzaEV0QWJoQlFJUDNwc0NBV2F0ckhLTXpXTzJ3NWt0cEViUjZYSzZsNEdpUjRNYzk1NnBpUUViTmY0ZlNsc045dzlFQXBGSGFQd3V5eHNMUUhrd05BdkMycnNkVGVZV0h1NEQrYkk3ZHhRY2VjcC9iQVpsMHhQd1VsYVVjUU5OaFZOMXhOMkZmeWZWdUFNTjRBSVMzTXZ5b3o2dmc2MVYvYnF1alVlVlVhbTZBNko4dTZGU2FXMUY2YVFvNWdlZlZwZTNRbzUyM1NDbG1ObVViQms5QWlObmtUdm8rWXczMDh2WmlXN2t5ZDdDcFErQ1U5RnBhQ3BzOW9XMG1abGdXTUFrN3VSS3ZQNlo1NFFZeEs5YmkrUno0SCtrZkZvOC9Dc2M3TGdkSWNSUjdiSUZ3U2xueUZFazE2MEdoNC9nZVdtcEt5RXVKbjVNNCtkVzJ2ZUdhZFBIWUxKZWhOdmF1R0I0Z1RLWmRPUWFERU95WjVjOVRjTTAzT1UvOVAxdVV5SnBrVWpMaDNpMGxabE1aemRVVlNaQjFQOVkyUUl4UU1yNGowMHRjdEJxMHliWSswSEg1YmtQSTRQYS9BcXZDa1hkY1RtSTg3VkhFTW1xRWoxQXhhNytiSVRRbnZQVnNSVWE3VkgvZnhDcUZ6RlNDVFVKVUZmb1dqOVYyajdxTzN4YUl5N2Y4OGQ3QTRPSlJBTEU5ZWcwYy8vTTdBNVgvNStwNEZZU0NFRFhtV25oWVZzZjVhRWFPcHBrNnhUZXR2WmM3aElQTlN0R05HbXdHSjRVNUluVjBWcTRzK3VoeDJYTlBPaHk0ZXJQRXBqNWYvUmJpMS9ISnpsREJDaW9aLzZNays2dUNFaUxoQkd5QjFpbWoyYm5oVGRrQUZ5K3FDRnlDTmpJcXBOa3RFeUQrVXkyZENveG1za0Z2dGozZmVpNmpLamNqa0JleVBGWUlmM0dFMitQOG9PempyVGwvbkcxaXcvMmZneDhEVVpEcllHbWpmZTlwaXZ1TWxGWmhYdlZJOHBxc1UxU0hiUWhJeEd0WlJubG5YOE0zUEhSSnVQZUJkWFV2MFo2eGwxOHBhbzM5R3h2OWhwZU90bWZ6OE9VVWZsWDRyOVprVG1sYVhQMnlVUHJ0dTdiY3d4SVIxNnNieUVVSm80eXlNZncwYnJsWXpoTkRLNiszNXY0V2cwa0dEdGRkL2tzOWVZRmlXcEpXeXByR1ltYnp6ZHlUbVkyMEtXWEU0WVMwUWUwZ0Y0NG1pYVNOeWNDZWhZdGFjbzkzR1FvTEJjMGl6SitqV0tIU1hEZXR0SWVFWXljd05WVEJhaE14NjE1MWRvRm9id1FndmlneG5CdmpkZXZTV2NHR2k3ajVPWW12NFFVRURSRG5jbDlMM2lIb0hPbzc2RU5WYmRxaW1BcXZRWHpvcHdHUnc1TGZ0MDlOT3dFYmFSMUZRbytnNllwWnJ3djF1RElKc0M2VjZGZTZhWnZ6ME1jZGhZQ0Q4c3h5US94b3JjNnljbUYrVHBvQVFVa0lwaXpOR1Y0eWl6QXZNdktiTFlBeVpDMmt0M29SQkVkdzYrSDIwalpiK01iU1lsMUtaK0o1M2FWU3lqUE1CNkZCTUNwRUNnTlFXb3dWSkVaZ1k3LzkvNUpzQ3JXS3VMZnlxWU0rOXhZa2poL1NyRCsrUWh2azFOejIzZGNiNmFVLzd4cTZxYWNyRjZwQmsvYk5vSXRqYlJud1RWdGFkaHhRc3YzdWJPQmtnZTFweTM4VzNvMGRZaTlJNDFxMnppazJTbkliTlA3alJZSklMUVZTdVMwMXdPSUVzM0Jralo1VExHeFZwR3Raa0Q5UGFMZDdiajlrbFNXVlByQ01DSDRQR1RtR210N3kxS0oyV2RxQkdhdmVRRVhFNjZ2T0N0QXlXZVZtRkUzcU9DdzdITnhhNDg0VERhZDJ1Vzd2eWVsWWc4cDVjMmRTVzdzMHBpYVVVMThGalA2Q2NsUHdWM28rSEcva3htMUJJbUU2T2loQVdVVFZHRXBGVzZuL1FiSDRBN1J4Qlk0RGxKN1MraHBMakpnQjV2NkVvMzlnMFhWenJzcU9Oc1RhcThEU21kRVg3cHhidzhIVStkdk9mUERvbDdKU3ZkM0hPK3ZpT1B6QjZZM2tBeDBTQXVWOGJOeGFSS1ErNHBESjdubzhOS0I5VCtINmk5UWpPUEZtY081ZmZGS2hRUXR4SDIyekxXTHFWa01mbXZLL2RzblNOc3RqMnltbXplZ1NvWWpWdWJZSW9SSHFidmxHelNac0VIRnFkbm1HYkwvQy92dEduM3E0TzNYOVhEL25FWXBjeUEyNHNocTFrQzRzWDh5ZW55dEE0aWlmRHRwN2Y0a0Vzem8xay9KTDNDS3BnQWhwSGVNVVNibmU0YnlkTHhBZGx6UTZ1bmRLYmtTSjEwR3BEdHdXV1NvQndWOEVUdERSaS93a3BGSzRyMW5pNHFXREEyUkE5UlVUbDhqbkFrTnZqTy9WaTYwd2NxcTUyRkUxdlFtWFVOd2VpMVpITWZNdUw4TjFacGZDY09wQ0d5M3M1b20vSGVsMmo5bGlyV0tHRmg2bEZXdVBCeVNzS1lEdHZVeENkOGE1QVk2T0NRaFB1cTNDV2k3SmR3dDBvdC9WWFR5WE54QnEwS092ZG12dm5SWWVzS2w1a2hYQ3RlUDlBRkxaNndKT0tydjVsKzJ3SUpPcVBGY2hFekFVUlcyNUg4a1dmU3RKanpFV09XTlJDVGUwRXpNMHBxSUZkbW15UmpRSHR4YUVvQzZtb2twQ0t6Q3pQRDlBazRkbVZNQmt0TS9hUENrcmJpNDJJVjZHUVRSWWtIOUNxblFKbWtSVkJnNEF6NWdCR0JEOUIwNGJKSmtjL3JsRDdMVTVjbXpsVXpnTDh0Uk5vZUlPZ1k0T2NZTEp0TUlzZ3E3b0pDR1JRT0hSOTk5RWVLYldXZVJ4cXcwNGdLS0laNU40Nmt4NFlUc2xaZnVsdXN6TGZURkVoM2pEZS9xeHhPazdvcjJTYTlqVEV1aEpZZ1IyVkdOWmNnMjR2RjhyRFVxZEgyWGZyWGdrbENoVG1VekdBQVdRU1BOZjJHUE1SQ3dNMUZGeDJQRHFHT1A5K0NISkQ5dEIxM0NUTXlRNU5CYUlybXVVREFaRVo4RER2ZDhGbyttTUlObFZDeFViMXRKRVRrcGl5R25hTmpwZ2FjREZ2RjZVSjhjaXljT3BrSnZoRVA2b1dRUU1qYmVab3daa25jenBrL3hCOW9kTXdsdVdRNEdxSjN1NEdPeUJvMnA4M0xrYTBQMFliOXVHUFEwQlU3RVlGRzNoRFlQVThEc2xydkI3SUt6VERmN3ZtSUpJbWYwdWtIRURGeVovSXZUVmkrZXIxWnFCUXZxSDh1ZnEzTUNnaVQ1dWVsaTdzeDRqdVBtZzFiNHJITlQ1dk9td1BlL0pTbXRkZVNEWm5kK0ttT3BNSWxNTHl0OFlTemQ0UW1nQTJNZTVYRVJWeTVBNFRsazVZcFpLeHp0OTRxRDFRTGRMakNzL1B4RU5ZUWtPSFFCNVkvanVSc05rR25rQ0pUTDRtYmM1Nk5VUE42ZUhrR003STc3eW9GMndKSnR0UTNmdXZZdmliUHVDbGJuQnBJUGVYNmJHQldSd1JWWHdvWTFwMXU1TEk5cE1kSDNsZUZMeEFzZzlVTWNkdEJjVm15ZTlNT014Q2c5Wk5aRGFaTTQ2dVZFK2d3VU9WZXhuRm9VcG9Ya01JNklJaXpWTUZ0RmRJaDY5Q090MlZ4SnpBejZHcFZvYkowWVFSbkZVTlpOcHRtdnZoVXVuNFVrV0VYWkxzSjdFZFV3WVdGMHpHL3dQWkkzSHppaXhqODZkbTBnV2I2ZGdwaWpLaFozT0xTY0lSNmRvYS9Pbm03b0NQUHlpejE5UzFLNkthSlNGNjBLbTlTcm9aelJkNmh5ZzN3M0xlZUp2V1VBS0Jmd1IxZnZIUlVyZW1laU42b3lSbVo2WGxPZSt0YVQ5cS9JSlNhQnZhRGFMaS91RWFXaUxWNHJGTzJlMi9TSlJpTlM0SWx1ZFdZTVBsd0lpVytWZ082R1Y4TXFacjZKZC9NdHYzdnpYa1VSWFZVakRFdkhoa1JMSGIyYlJFWWU2SWJveWVXcVJ2Ui9mMitsa2k0ZExRR1pWTVhobEc4c3grNTN6N2t6U1ZaUmxtditIalMrNEswZ3JWcnBKOENGTkNGWnVlYVV6RnJoSElKWUZxMVpLeFQwekwxZjAyMmZxTW80azlweEk2ZFk5U1BlcUhYZnd4SEZRL1lKaTYySE9Rd1hlVmE0ejdUUVdFeHVIREhtYlErNEdid2kzaUZwVUpweEVYUmdqSkhwM3J3UmliWDhtaEY3QVFMVmJCZ2ZaVFNkY3FxMlJDSUpZWFZnTEJxRFI1bnJkajliMmt3WlRSaDdtRHdKZklOT1JPTGo1bFpJQVFxajRNdVlQanJJRTRxazdVQmNBbkNXWHRuTEI4bnVaZTNDenpwMG1HYThxOHBuMXhGOHdHcXJNYmxwb3lnM21NMGdRZFo0TlM3d0cyMVNMU3NoK0hGNHpTS3dXTjNHVFZHR0ZEUVZBdVZ1OFpMVmgzZnNNcnBNcy9aMXR6T3VPMUphNm1XNWxpNGxBSjFFT0hqNzZYa1dzSWFvTHFuQk16V093R05tMzdaVHZZRjQzeVYrNm5MOHdtMjNGclNNNjhsQWFSS1RDa1VnUDd4RmVQb3NGYy95dnZ6Nldra2JUU3EycXZ0WCt0MmJ2dGhnQ0JwR0J1NndmUWZCc0Q2QXA1MDRnTDRPcnJLNGM5RDRML09sanQrV2trZ1UrWFdldHZsbmt5eFBnL21UVkZtck1CbUtmUERKTGZuMXRBaG1RMzYzNGNocUNtajJWUDZ3cmdWaWVpRnVUNGhHS2Q4MldKTHFJVk9zMjdLNFJsWk5URnNvdFZseEVrQVhNbnpzcE1LZloraFgvSnBoZy9icE4xemsrNFMzQWVXUkJoanVMR1gydzA2OGdJdDMveVorRmQxYlJaM2M1VjVlS29PdlpZNFlXaGRRaEhoNXhydDk5VWJiM2ZRWm5MUkpuVCtSSGNGSW1mZTA5VlVCSDBQT21BelFYK1NFUzUrVWxxM1BGVVI2WlVJUkM2MFp6enByQlRZQmZNVVNzQWtDK2hPNWhxVllZQ0VMeWpnZUhDbWRIWXh1azhHbmIxT0dGSHBFMWtuVWVWNjlUOUExd1RnZ3h0OWVWOWZVcER5WmlQaVJNcjNERXAxZFhjVDJsVlJRWlFUMEJMUVJPUUkvVnNOaXZqcUlDdytKM21aaW5MYUlieXNvcUpCM1RZTE9FbHlrNWN3emJLQnZqYU1aTUdBYnIvTUdEeEg5N1NjNTZTbnZtUDlHZ1BVRjdMQTVZWXc1SUVVT1I1SmM5ZTdMTURsMjRTcGNwUURXcjhDdGRTbS9KRFJLNk5OcmhVV0FxRzFMQkF0SXlnOVdxRWZOTW55RG9aOWpWR05ZWjFmK3VBMVV2WDA5MU8xMW1ha256YitvNDR1cCtER2JiVFhoczlqczlzT2JwNEc5bE9rWHZ2bEZBS1lzNTF4MTFFbHhVVVNZS2ovek42eXZMY2JXS3JpTW9LMUs1eUVYTVJqN3hJQXYwY1B0eGJSL2RJVnRnRWhEcDY0K1VER2pseWZlYzFpTzhVNUhyaTQyNU5kc2RaaXZkRjhzdDJBMVRJMDFJQ201ZmtFZW1oZmRZemR0QTNqclIreGt0ZGFxbTZ5a2FsVU5oMVQ4U3ZUVURDRWFOUk1uV3FzK3licXlsYVVEcWxrSFJnOFVyNmsyRlJSV05LZWcvVmpyR3dLbzVKQnBNb0Y4cmF4aFU3U1hSSHFaTVRyTFdVR2RoNGdQaVZtQ2xxdGhhaUxKb05tbTdnM25wOThhZm0vTFpMNFFkL3JxL0orbkt3OFM5d20zREN0cERxd2szVlRWajVHdEs0MU5QWFRWVTJ2UHNhelVQdUVlU1M5UkVRbWh5Ny93MEI3d1lwRGNmZkt1QnFIc1I0dlhncUE1RUxTM2drTEIyNnBPY3hweHpEQkZONTVDZHp1WUwrS2tCQUY4NjQ4M0kvaWQ1RWJUYjdWUzlkaHVTRi9MOUY0Nm5GVVNzUlgrcnZMMnBqZXFXc1JrODhuZVVpSmlzL015MloxYnZmRkliOWVUeWVONEU0L1FUNnp5c2xVWUpPYmU0U2lRaWV1ZHpFNVlGa2EvWkJmMysyUnlpQXlYN3UwUVJDdytYNSt5OFZlWGxuZ2lnSUN6ZEE4L3d0KzBTK0kvaUVVTG9wNXlPeitJNnlPQzdjUEVoR0NSZ0s2RHhQbEUrYkl4aEFJcGVCV3RMRTFLZElHaEQ1ckxRQ3diQ0x4UVYrbFozc0hSVkpQcmF5SURQRGVXZzgzUURmaE5uMmgxMkpCL0dWS1NpY2xCd0dqa1J2S2ZvYXRraVZyQzFMN2xEdFZ5WjJFYnhsdGlmTytXV0E1SCt0T3RQeHQ0dll1ajZUVEtZL05pZ3QvTk5kaG9nbmtOcm84SGxaYjJtRmF4MllSNmYyNUxES2svY3pQdldTaXN3em1jV0hjU3A2enJsN0pXTzNwUVE4VEVhUUN0bUpVTWNiN3hjMmU3dVgrNlFUUmVOaUo0a21ISzgxNDdMMUFFNktraUk0aHBaNWVZclJoWjJxeGxqUXIzWW1nNFEvODhOdUEyNVpqM0h5MXFBeWxaSDgzVzcyMUZPbnhUZXhmTWcvdUN0VXozZ0c3ak1Fc0xCZ3N2MG1yK0hCSXVqSVpPalhpaTRkN1BKcDJhYUdsSm10eU1GQlg2dGpoWHA0SEFjWXArUUFrM0o2MEQreTFBNk9ZUXFkMElibTdlL3FZNG5pYUZmeUdrSjNyMmJ5WjRwRzRDK0ZLS3lKTmVhREJ4clJsSlBUSlFhQm1HcGt6MXJUbXQ0cmNvSCtHckoycG14Z1JrKytvOWxvQ2hFTVdTaHc5MXNvNmNRRmw2RHJZbUNjUFVNZml3Um9IblhpaUNmWDduSEZML29vL2FkSFgrNnp4dHBhMFQ5UVVpYktEeUdPRmlyaEFtc0ZDWnNNbXY5blhrRlZlOU0xVFk2NmMybE1CWW9EUFVTaGIxcTU4Q0ZVZ3FDZW10VDJFbmdBS3Q5MHVqUDlYQms4T3ZPbSttYndQSWNyTXVxWEhpUGxKNmNoRWFCTXFUaEJnN3ArS21pQzE0dFVzNUIybmlwVzMxTE1JbTVkTFN0ZVQwdW1RSHczNytuSmxRWnFvSWJUTnZpNVpoSk9HSjVOU3Y4YXBjeVBjTDlML3I0TU5DeFlHQnArUlNOalpnR0pkWWR2OTFNY1VIUTFLRUdBNFdmTEtKN2l4MUhObXJ6VkhINkEvMFFXcTQwSGZjYm5BZm1NWVIrcGxuZ2Vnb0wrOXNkdk54VnRzMEZjditaRkViWmdDM1VXdWV1blVPb2d6NHBPQURjeXZIN3dPK0hrQzErVTRVK2gyekd3T3N6QXl6OXFKb2wxZUx5UEVRVFFFdUo0alIxUWltWEV0ek12Y3RKUzB2ZWtMU0xtTFBpcDJkZTRiOHZrQUhlYUFjaFFSbVVia24rRTFjdGI0cm13cVlkZ3p1RDZHRVZocXY4eExBNXB6UTIzQVJSMlZoUzEvdFBzQ3VXdnVCQ1BWMVJrdngyR0FkN0ZuT3hLcW9VaXBJRC9CcjJtVmdqQStTU1FISjFVQyt5UVFwQzdrRkpoeDFwbW51YU9UN3JBU1NVdGE4MDZFOEl2a3ZjWlMzemFRMDRqRG5nWEg2S1M1MmtObFo3OW9PNElKVEdUbkE5aVZjODQ2VVJtYXN5SytNcWVYVGowZHFsaHhyQTRyREZjTHVtM05HZUZsNTN2am9ZOGxzb0Z6ZC82aTl2S1ZDU3hJSS9QTmhqYWU1NXBHMW15RlNqVXF0enhSMEdIbVBlRGZuRFFON25ERlpUQStPeks1V2dkakd4akVCWjAvTktlTG1CNW1WNklFOU9neGprWSswODRKZVRTYVU0Wkh1akZRRTdNWFI5L1IvY0dIMHozajBNMTVHQWw0YWNSMHpuZmd6VEFtOGNlL3N0eUd3b0dXOGpob1lYMzVndEYybEpjdk44b2Z0eHlsK2pXV2JlSHNxRjBrL1JNU3RhNEl5aWp3MWJFZk0xNVNtQ2ZPTGxsN1pLTVNhTExtTWVXSGpjZzlkcDRPVVd3bDVmclB3ek43OW52TEVsTXgveitYTWRtWVVyeUhRWU94WFBpZTJ0VU9CSjN1SWtFMlNaOCt1R2Y1YXd6c1hjSWdXaHkxWTN5cFlVWUV3OExPcXB0T2ltcE1mb3REeHBYMHNhWFMyVjBFVWc5WEl3RGJ5VnQ1ejZsdDR6MzE5ZHRIbTJybjRrWEhjQXhqZUFaMHE2aEpDbm5nNkIya21KdE5LNlRSampuYnNCK2x6cy9iV0dxV1F4a0RJeTBaYm5zSnd2cFVoSUVlbmpVbmxZUURVZncyUmpGRVBYNEtGSXRZaGRCa0ZSc3JIYnBMcGtFb0k3eC9LbktzcjVqQlpQMk9qQjNBbDh3RE1vUU5XV09OR01jRE5wNFNXNWpQUkxoMnNFUlE3cGZzb05xNm0zaW1ZMHVkVVNuWWdIWGlkdWVpRlM3NGdsVytGNkJMV0hOZFZaZUN1OGJvM0RocDhrYXVwOXJZV1d2WkNyTEV6aUlydmgzOXE4VTFhQjBEUWdNWTBQZlNSUHZsS0I3eFptVzFWTkhpWk5ZWDFxSGFvR0M4ZGtPcGFRQXo1RnkyVVRXQU1Uc20vemxZNlljTEU1eC9WbWI5bGdCMEFleGwxL1hNZm1meXRPL1ZGNjAyc1U2NmEyelNuRUtrK3JObk10ZzhYeVFzaFAreFJKNk8vQWJmNnNZUUVUbWRmODlwRG1ZM0VmdUhUVnBHKzAvMkw4dWhkVzg4bXFIZmovQW9TY1pqa1NRRHQzSnZTMWlIQjBzNGZrNWl0RnIxbDFKQXlEZ1Q1ZHNxQ0x6MFh6MDhBRitSTno4aTJhNVQyZzQ4cWdna3I2bkt3bDhhREZOeEhiQndMRW9RZDgxcFlSRDlqYmJnMk5KVU8vc2ZqdTR1Tk9pc0JJTWdLTHpXeDNHejVDY3JHNjZuN0FLWXErKzF5WmhHQkc0V1d6NER2dHdYaU95QVFkKys0VVgzRS8zVEEyazkweVpsdG1ZdFV6ZjZ4YmRoWGtEeTRZR3VZV0Y1VjV5VlkzNWhmMUlhcmt4OTYvdGZqN0RETytlYlVZYzIyUzFNYjNBWTNDTFdSeURyaUdjQXpIWllPaWxFVkszQit2VXBicnVqUEJCWmhBS1JXWXhTdWFFRklpeG1HVnZ0WE42WWtnRkNCRVRMUnVlL2s0SDk1OEN4aU9NZnd4UTBlV2FIQUx4bUNUa1BwcUlBNzJDK2RZM0gwVkZGVW9FaW02M2c1blJ1bldGdDREMGNka054VWZubzdmbDNlQW5SY0hIQk5NVm52UWFibUFkYldxemptaUlBY2YxRzR2d2RGTUtHUXNQOVhVUFVrbUJBTGxZSmc5SC9IMlNGdVZFMjlDZmVWazA3OG41bXhvMGJkZmFyOG5vRWx2YlA3SzBnSjdGNzNMOUVDQmxCTUZIaG5haUJFd3h6M1lqWUtkODhQYWwzQVRoZVRRVG1aUCtnQmxtNmJGVE5TaHZtY1VwK283SXNmZElWYXYzc1RudjYydmZpWHpqSUJuUkJSanJsZzRsVlVWbTdNdlJDVXFvQmFtUjFtUEVFemdXd2hkVnNhNlFUWDdpek5xL3BUMytkeVpWR21BUEdQbDlJNStwVGZOQUo5eDRicFErNEdDZWpFZERNMTd3WURqQlAwWUxxckpSejltU2x6Y3poQm1wS0xMUE1JenpLQ0tPMFFWQ0JXSUcxRGVpTldhc1RFUTFDYlRVTk1IWUhVZ0Zzc0JFdEh3clVoSjNEaCtqT3V2UTFLV3c0QlJ0ZlY4cmM4SEJMak0zMXRMU3RNYlhNL21TRDNsbmQ3RDhSaFBQbFRQOUtWVXQ2d0piM3VUWkJKckZ0ZFBJd1VRd3hhSlFDUGdqcEpHRXc2RW9sWmY3eW0yRk5NdEZFMnR0UE84RzF0cUdabnpZL0RoZC9GQUNrT1M3N3VUOThlQ0VFMGEvTFN1aTZMd29WdUNtSFlHc3BLTXNEeURwOTZuTnVERU1GbTJXU2hrbEp4dnEweDZVa0VPcTFPZGErRzlJSXJYKzY5VEtaajlkTmxVWHM4OElsS0xCRWlmeTdreU5kRXRxSUpqOHZ1dEJpN0hKNFpNdDdraW1qWHpZeGpMSkd3ay9YVTUvTHd2Tk8wYlNQNmtFSTVXL0JvU2NJSWp2cForZ3k5MTJDUlRVdmJpSTlsc1dpVHoweFAyc05VelV3MjNPc1Y0WEFJVnBQNXRxdnY5Uk1vRWdZUDhKYVNLeDRPa1d3UkpSd3dYbEpTVXRBYWhycmtGelZTTGlPUmh0emMvZEpUVE5pUk8zMjIyLzVKdkFHeS9sbzAwZlBXeVBNOVFyQ2VnbXhwVVRyWFlmWE9LY1FTajM1TzRUajdYaHVQMy9hOHQ3Skg3OXZXK3JyWnJtN01ndGlKQXkyQ2p6cU1XZ3VTalNVVythdDhMRzZPTzBIZ20xL3hmZ0VBOHk0SS9wS0FGSFh0bXlwYkZpVkFIdDlSeW8rZFJ0ZnJjaWc1cUg4OGxzcllBRGJOeW51N3ZwMzQ0dTdITGx6bWROVGdaVkJ5SVhwdFJIS1pmcjVEblhEcFV3NkNOYmpMRXBrc0o5dWs3R2ZtVi9PUmxiRitvUGw2dDdXSjA0ZnZNZHFCUkFqaEdHZmNoeXJZdW9TYUdiTXZacjE1aWFTNGxSdndrekJtcUZ5Sk13REF1WDVzUmZyRWt3MmFNbGlGdUJUYjFhR1lqeHM3aWhHajdZbGgwdngxY2J1ckg0NXBrWFQyaWxDM1JKekovMkhQYTlldWtNQ3dkSjhpckxJbzhlQVRjWXlwVEI5S1dpVGF5VmcveVROcDBia0JOSmhBS3RsWWFSTFlBWGNZbEJoMEFVNHUxMjJua0JSTkUrSU9pTThqR3V0N3doUFpKclF1NmNwYTV0eW5LN3JPVFRJNldzRUJVaHFMOVJ1cHJBbEdhQm1aTmtBRGliUkRhUjZaazR4YzA0b3RNdmYvNnc3cnc2eDRaUDNiVHVSQW1kZm4yN0VlemI3S2Z0SnRlQkNWRi9xcGRHS1BHNGpkYS9CNnJaMlZBZjlPSFR5QXBEb3UzcFM5VWNiZXVkZjFUc1diZFlzaGhsa2pOSWVHekxXK1RxR2hmaEtNSWdmSjNqdDk4VE5UbUFaTDFrZ01tbWx5RWdXUDZ0SFJNOHBXMFd3Q3FMNnErSklFalVZckdJbDFBbVEwL1NjV2NiM0pOVU9nci9JYU9waW5RaHJTMVU3N3pkL3RiWXErYVRsTkZSVFhNNEduQURqbkVLUmhaSEFEZ3FRR3BubTh3NjJjb0o1bENCSmZlQ01mZjJodXh5UGtPN0NRVnZSVmJYWTNoZ0s0QlpxVVV4V0RNMmNYRXdONjhQc1hGSFArNktpb0lieHBudzR0ZWkwMktqb3VpdVVYc2c2T0lNRXlkTzVndlpoSitUV3RhUFpnOXJhUFgvQnBCMEhjVVMxa2E5YUd5MXVSK0Y2Qmc5VkJDS0RUcmJLMFcwenNCWlZkSmVKNUhQYUtzdTI5ZGpkSGtqNkZzTnpsSVM2UUF1Tjk4dTI3UnlEMm1EYkg2dmo0V1VlZ3U0SjJZREkyNWVvK09DNUJ5VHB4dytHeVJvSHFnNnpjTzlsZUNUK2pWeHdnV1lBS3hQSG56OFRUK2FiU1IwaDlETTZWbFJPUllZSWNVSXZuMnRTdkR0c0NNb1Y5a0Z4akl4RmRvdVNHMjVBQ3NLMUxZMElVYldiSlFCWjRUR2lnV2FjUnlEWTk4WHdRSjUxL2tUVDZvRnJzK2RYZ3pXRTRkWjl1NGM4d0pXRm12dFg5NzFnRkNtZGlWQ2ZUUDlYRDREb1ZsR09FTittcXUyV0l0Z1J3emFLUU42Q1ZqelI1RUxPZGhNTkxBaUFKV1NtbTFCTGlUakpqRUNyN0RHaEQ3cFN3Rko4NFlTelZwWnh6ZUxWOXd0bUh3ZDhBUzF2M1Z4bEtIVU1lWm1jQ2s5VWtIMXFQSS94ZS85cW4yd2R3ekZyY0QraWlGRFVHMGhyQkV2bVRYOWxldXhienZ1NHFEb3dCaFcyUG9QZks3L2ZIcUlzSWY4M3Nya1Jqbk1wVWxReHhaZzNXelkyZUFaTWdrRmMrZmZxbXFLVnpES0VGb09rNXNqN240Y3JUOFJaTzJWQnVnTm5DQml6L1JsZndGTTZJcG1lcDk3S1BOalFqSnYveDNpZDhlNkMrL3QvcUwrTzd5algyQUVjRlF1MVZpRmY3cXltWkh4TGJNdTJTSDFIZ0VtNm9jaE1NSWZERWdBcEd1OVVNUm1EdWxINCs4TXZwblpTS1VBc3Z3OWhHKytuSEVMMCs4RjRjZ3NnL1RqbkxJdXVWRnhxOGJVek42eDNvQitmUzRnd2hva21uM2lJdEFhdFBiRlU2dTBBQjhNVmV0SjV0QkxaaHRQL0szemlnWlJEY0ZsTXNVVFIxUlFZZExhQXBvazl4VmtZTUorQ05Kak5IMW1wdktUT2s3eXNjbTJxcmIvUlJ1bkx2OHl6TGRWRFRQbTY5ZEdJZmlWSFZFSWZGaTJLMGJkRnZkeTF6R3BsN1VNM0Y3a2RoY0tZUFNjRVZXSG95Wk54c2N4V1cydHB2am0vekgwTmhtYS9MZFRSY1hMVWpTTk5DWFRaNnNSbldwZjVaKzBibi9aeEVaS1hhUzEyeithb0d4anI2N3J1SmpjWXkrZ3E3Nk1PUHBVM2xlWXB6Rmo1b0ZCWXFaSjErZjJPbGNDS3JyZjJja0duZGF2dml0QnZFTmQ5YllqN2NuUmRlOVpiSTNWWk5oN2RVOTMxVWlDYUtTVmd4dndrcWpoMUtqSnBDYkJWc2tMSU5qdEVNQ3ZubkRVNmlsdjlleC9TRTFTOERHOWl4azNPbVJXaXhmUUpVdDRteDRhdjlpYlVUMGFnZklPNUZ2ZTNhNXVMNU9helZsc3NGZUdXRWJmdTVLSEVLRXpJQ3M2Nk4yRzBHU29pSStIV0NQeEFUcWZ0VVd2aG1hM1VMVHAzMDI4SmsrbFdqYXpXbEJOUmJXSTJmVU9sY3g1eFg2M2JxaEpZd3J4ZjZKN2lhQlo5L3E5WXBINEl1VVgybXExeE10dy9lN251Z3QyZ1JCd2dlR0JHSjVDWHRSTDRlcDNFTkw5MnpvRWZuVC9NVnRuZUtyMGRza3JnbXNuQThLZEUvMUJVNlpOeVVhdUJJMUs1QlhTUjh4L1BXWWRhMWFBSGdwMXJveDF2OE5wSkRldlBKVXJHRGtqQmt6STVpaHJPVUg3Uk1YeG1qbGR5SW5YcmhDS284TXdwdHE0NFhUVnhzdC9aRHVWYlc1eCtFdVdLeVA5aFhkRmNZVkk1eHZuUk1OeG5UTG12Y3hpNkxaVTM1VC9Rd3pmaVZWd0tJOVVreUswZWpHYVkzcjFiR2ZiNG8xUW1XMUp4Wk4xL29VeXh6SkRDQUJxVy9maFVxMG1XNWIyc2JJZFBQVy94K0hRTVNzN3FLYlZkc3FZYUJkRjVFTzUvUXYrR2VTZ1J5ZGlLOVZwdStGV3VCaDcrNnZqdWFMQnozdUhFSDlwOEpKZkVMYVAzNWRXdHNlTVBCejk2RW5hM2lQcXQvaDdpQnJsY1BmZDV2bHZIYVErYXVNdmcxYmhrd0R2YU9nZEcxdGxpMUFBTmM4cUZGTFVpdXpTeDZrc2pvUkdqWkhiQkN4b1RoK2l3RHRsNkt5QzFDMFU3Vm11cnJicHdMT0JrbnhUQmFiVWdQRUwvZkRNbmZYMDBDekxobUtjMjEwR2p1NUthaVdKcnZuSnBpbk44VUlZUmVkN00vZW5Pb3U0Q1Uvb2J4a0llOStWWHM5SjI0bCs5NGQ0VGJNUzFaNmY3NlFBZ1hKL2QzQkIrR1BMSThZeXh5enVGTEdYbGowWGRqZkd4dzdQa2NWaHlzenVwR01TMkkzaGRmMGpCTTAzMzFkYTJTSGtZeUZsTFE2N2VqU0F6N3NCMXhHQ21RZ0tod1lhSXEvckZiUThKWm9nR2tIZHN3bTR0dTM3UEFtT2ovRjI0WDZTalZBK0ZDM3BLa05Tczc0cG4xNUMyWFh3MHBmNThrSVNrOHR2azhIMytiYmtoNXZyWnE2NWlPUG8yS3lKYmg2VGNucjR2MFBrY2pqYzUxeklaTTFOVmRHd3oyUlc5M3VKdXc0M1RDMlhxOXJCTU1NdUhVSlVFNENFNHFjWXdlcTJUWXdCU1ZOVHNzMnhOdHlHTVAyVXpGcHZVY0xQSUM3ZCt3OGR1MDFPcTVKNjEzem9nSEFWSlB5Y3ZPR0lqYnNraUh4RDJoL2FBNUhoQis0M3lFM3pZbm16SDY5ZEJldi9FLzVMRUQ4dWVCcFpsVmVtZmo2Q0NWZU1qT1lpUUVyVE1DSkZqRzdYSXZTaHRhdDV5czVFV0wzTjlsQlFyOTlKd3B0R0JLUzc0Q3Zubng5ODFrMHBDY2ZkdHNYL05xek11SThZZ0QwcmIzanhwa3JsRU5OTEc0bGNNeDdYSGVzSm4vTURhQXA2MG5jd0V3Tlp1a1AraUlJRjJxVjZXaHo5THA0RkE3RkkxOVhPZzk2Qjh5WTFGZFo5OVRRcndTUUF6V2RRY3dzcTE4ZzRhWVBJaVludEdyVWR0Y3ZZL3QzVzdPQnRNUUVYaWVnU0pFQVJsN0FZUnpPSTBrSEJrUzZLOGdyOVNhVHA0Y0ZOZllGM24vTEVYWVhUYno5QkZjTlFBMUdFTHdmQkQvUDFCOHVoWHNpVDNDellBN0xwNndwTFRtRHpXVmMycHZrdHJPUlZLTE4zYnlMYkR4MmlzVXQ1a3VoaDhwWFhDK2I3OWZkZitBcEI2VHZ4ZC9JRWw0TVY5WnRNSCtPNjNHTVpPLzg0eVY3WERDS3ZLdjZCZkRjRmZZQ2pFWS9mRlR4ems2a3JrazYwVXVZam5IZmNnK2Q1Z3VjeHVpY0NNODhyOVpOa0Y3NTU5TG5SejBzZ2NCRVVtcnh2ZHliaHRYbHJMb1VSN29pa2hPT0NoZHVHOUxaeG1rU01TR2paa2h2MXh6Q3c0ZVRmWXF1cWgzRUl4ZlF3VmZSN0JrK09WM3pLMVYvSXgwZW5SVUtJYVBHZkpPNWVKRUpxM1VsZ0kvUi9QdVFoaCs0MzlOcmM5bHZrWDJuWWtFRytleTdTTTdhNFA0MjJhVkdyVWo5Yk9YVWkvUG5QMitxNGgyL2ZYR1c2M3MraVk2a3BzTjJWVXZKbjVKU1g1OU9FdHFmNlNpd29nLzhTbjVHd2hWTllLQWM1dEJneStSQkcrREt4TExZcHIyV0RFQnl5NG1DTjlZSWpYM3JEV3JXWDZFSU1NS1FFS09wdUpneDc5K2d0cjhkZjRtV3ArTFFtRVVXeUQ2aTdHNVJtT001Q3ZJdFcwT2h0K0JGQzBhVjhDR3ZCVjgwczd6MDF6cTlDMlordU1VeGlub2JDSnVpSUNQYVdtbWhqdGs2QUNlNVBkL3BxYloxVmRGU0hVNXFPV3QxSnJESFBvRjZTcG9leXdUTUg4UmQxSGxNamFLV1FwZkJnS0pBeFJ2TlpUanFTckMrbll4azVBME1FdXppVDROMTZFQ0Q2Qjdqd3FkQ3M2SkNva25YZVA1dzBUOXg2dml3a0JuK0lsQXUwNGg2dnl6NmhxOFNsWHNHWUdXT1o4aUtnOGh4Y2hzWmJFWUtHbDZZUlNWT1NFVE40TGg2Nm43Zmhka25pNkFmcmx4ZFVzMUIzOU9HMElDZ3BZdjljRUxGQkpFUVlzd0NxVzZ1TytNNGdrWk56SkJSdmltT1hQNnBNbVdCVTErMTJKc0cvdmUxOExxRjkvVmlrTCsrSzhnWlQ0U0gyQnZQL2JWc2ZCVzkrKzEyeERnNHhZdXJTYmlXQW1GMGVwTWZpZm1qNjNORW5tNE5CMVdzMTVXRWtyRjdOVCtTc2JZaWtkWGJKeXhmbmxRL1g4cnJKYlA5MEIxZlI1bVY1ZmdzMDNIN1BYZW9pQ0FuSXhkTFNxSU9TUUlZTW1zS3ZDazJ2eTBNSVVncXZvZDh2bHQ3M2I5TlMwcjdNT0FaS0p1MmpBNjdqQlZKVGljYlJGZTlVOHVKU05jaENKSU1MMm10SzgyM1RwSEh6MmdWQlJBWWRkN1oyNE9vWGdaWXRmcHF3ZG9TcVIwMWFYYlltMnY0cllCRmx1L2lEczg4cDBkdllUMHUyRWI2ZmhYTm1FL0xCcmtKcllFVFFTSTR4MlIyWXlRUWVzNWU0L2x4b0FFbEFpQmpETjFNU0NUeEtkVWg3b3lCaWdWZG1jdmtNTG1xa3B2NEFQZ3Y2TWZYWkR4dEZlWE9Bb1JhZ1NsR1dubnhPWDlqWUI2RE9LK0J2U0pSL3p0MTkyLzFmc0k4akY4dVhaTC9kOFVVam0zVkpnMzNlVDZ3dENTUE15Nm9LbWY2T0NuR2VmYityRzZqZ25ickIxVk5EbWNsMFF4R2xwVVBoTXZlMU4zY242NDVpMGUrRUtma3Y1blI0Vk11L0tYV3luSVVaS05GWDUzR2VyWmtsRXlURStLY3ZWdXpnVFhnNUNTdXY5UFBONFRTRXhNYWRaaU40alVTNTFsUlFxM25lcm52UzkzYnJ2YmtUTjliOUdEeFpSYVd6VUlFR2E3RkU1ZUM0U1F2c0lxMjcwTGQxY0oxT2VBa1I2UGZURWpqM0JPL0dzei91WXowdGF4YXdzbjlCcVROaHNLZDlZOU1JMHM1RVFmdDVESzlaY1N3TkNGYnlzaEs0UVRvN1hPTk9CeHhDem9DVFVEakRjNS9JSklDaVN4enVtQXdkOXBxeHVsRnJpL0tHZm9DT3lUb3NVT3YrclVPNXIvOU95aUd3Q2h5OENpMzVsNVNBS3UrS1h4ZXVQR0F5b0lrQ2tJVGpDZ292K2F5cS8yL3JZK3N4M0RzdGs1cXMwVGRHY2FUaWZOQWZEWUMxTnpkaGluekpLYW03RG51V28vYS82d0RXODhEM2V5NjV5N1BBaWQxLy9wbkJtaUZ5MFR2WCtTTUlsV01vTUVTUUV1ZmZtRGswNGFKWGJZYmNsWW9BZzFlNStUYXNEc2pzYS9EQTZaZlNyWExWQTc5NkIrOXF0aGVlMi9xbmdDQ3BYTS9yMC9KK3E1WFMvR3QwRmVEbzk3V1VsazE2YWFuK0gzQnY0WFY2RHk5cG9JLzFMT3hNUmFOVktNbzdNZ3p3UzgzVjlkT216M3I3N0JhZzVDOUR1bk8wUUd0dmlxNVE5WGc4amZ4TlJWYkl4RFRCNTcyT1dlRGErT1VTeFBoTTQ2ODJ3azFoaEM0TzRsODI4aUIxbmNWUzJaeHlVRXdYK2w0YnI3ZmtWVERoTVVrTVFubVVJdm9QQ3FRSU5xaVJPV3I4TEZsdUlLMjVaODBXeVVXaVRKblFTZHFNOFRIMCtHb2JoM2lLaDlMVXpJR3hWcmRQb1RkY09UVUJPSXpvS0dWRnptVHVsTjJ2aEw0WDY4YUZjSlFheU5jR0ZQaDY2WW5ncjRSNDRmd20yRUlVYzBzUTVjb05VaHBibWN0Sy9Vb2ZFWXdxL2lvMFhUdnkwSmd0dzYwYTJiUWRjZlVMUjhqZ1p2bWlmZEpkYTZYamhndFJ4aDFzUVM2SGwrNVRFWkt3M2NHV2luWHgyUG5rV2VhUHErSWRickR6dElzVmxQUlZSd2p6Q0taZ2J4cGdjY3pRbnFSTWlnc3ZoRlFtVW52ZG9mT1M3UThubzd6SFExV1RDNjVDQkFEUVE5VW41aTlkVUtwNjF6Qlc4OThuSUZPbG9MMXZ5UWxzU1NOTVpKM3Z3dUdmYU5jd2Z2cmI2ZTF5N3k0alNFSWhOajRTK2N2eXlvMTYya0JhY3FiTWVOQ1RydllxNWhwbml6eXkvR0tORGZHL1VBZWpHNVcvcVhMeDA5eDJsZE9HL3p0NllrVGtNay9iSGFXUmVIdTJzUTlCMm1ZbXhxeGhQOVZXK1NLZXIwU3BHSDFVazZQenQ2SXV4SGJTcWxra3A3ckI4dHduM21SWnkrc3lMLzhtcWpRWW5lMU5xN0ZrL251TStLRmhscDdKNk1nT2ticWVrQXl3YkxoK1F3bkNIa3REMWtIdUxRMXBMcDd5Qm50ZnBTU2Q4S1BPK0E3aUJhVWszV0JzV2UydmlCOHJ3NzlvdjdBTHkyR1YraUNWVE1SeGs2WklSTk1aTzBVZmx2SkdMdmhWcHViUGNXY29PTWF2bmxFM2s3SlNsYVpOMEZCak1Yb0xQaGtpNXF0ZU9xamxuWEFmOEt1VXhpMysvYnlkQ1JSNzIrZDUwQjFPYjd6eGZvcmx6aHdJVWsySjg3VlFPM2ExRk96YjJMSEFCR2JQb0ZaNTdzZS9CRTR1UmhGYUhMc0Y4Uy85L1ZNRUN3eGF1REdxR2NFcXBtcEx3NUdDbjE0bUUrUkRQRUk2V0lyYlNMcHcycmxRODFqeHJicVp0TXVoZk43VEhiZHAzSmt2dGplNTl6MXFKcFlHeG5CcDJiZGgweGwxc0FKUWt6RVRJRGh2TEsxN2UvNU9ySVVUV2htN3pYV3lHKzNGM2pYWkN2TElQWm5pamtQYkI0aXkzNVpuUHpvUHZ3aU1WcUMzWkFxcjNoWkYrMFl4TVJ0RDVzOXRqWXlvck40ZCt0Ylh0RGNvNnlKUEo4eTk2VVBmUk1wblpYTmwyVW11cHBiVU82cHhmRk55UnhhQ05VSGJFbVZUZ20vZkhLdlNMTW85cnhVdUYwTHJoU3pqbnAvQmVWS2FvZlpjNHB4MVJvamxYUDRyU0lBWURFQWZmalFZMkxGVkpwRzZHQkhrOUpzZUhZbXpOMTJWcFVEdEN3ZHZGVnRnUkxRWVNRZmdRV1hzWUtwNG5sMG1URTFTSHhvTzA4YTV2dGxlNXc1bjNzdTVtbGs0cU9WcU9TTk9NSGZETTh0dnVoREZETHMrOVcrZ1B3dGZXSmpCUWxwL3ZBblFDazBRcTBPLy9mVXZBY29YNUpDLzJFTS80VFZweTRLSUMzN2VIdDkvbkZVKzdpbExGdm5mQjYzNE94M3k5dnRmd0lPSERIRlFHSnpodUJwcVAwVENEZW42ZEo2MmFVSUJ4enhzOUtlckU1SWUxVVFQUEl4OThMMTFNRERoK3VNYzJhWWlvSjdEOGFiQzFSOE9HVTVYREhmd0QxNVlZamM3OE9Wc3IyVlZLUTlNTlRlVDZacGFsb3hXc3MvVHh0RnE1WDNhbkZ5dlRaa0NWL3RqbE1LdkYrQW9Lc21NWHV2aWY2MkFZbGxBUUpNbGdLMnVjd0d2SWNMUFBWcmxtaExtY1pOSmVQRmhHb0RGRGQ1Y0wwczhxall5dDFKZE1PRyt4dS8ybmdoaGlNWjlyUnpPN2trSyswWUdLQ0ZDRFkwNHVKN29lOWxvSE9RajAyNUk5N2dpQjMvTld1WElyRk81S09SMndsbWFIalpBREo4Zk9mdERGRUtiSmFPZFlyQ1Z4eCt3TjBmUU9qYTAzOEVzV2dIOW96d1VTUHRKZ1MvQXVNVmxvOGpCYmJaaFk0aUtScmxPL0Q1QzRoY0hMdk9CUExNK0tEQUxsUGQ3akZ3aDEyWWhBUi9OMWFVYXhTZkVOYUIzeXVWbG5BN1ZvbUpTZVBaUWtHS2syMW56TEFIdDFjTDFZQURFVG5hZm95ZllnL1YzOEhGWG10bFBKSFpjZ0Rkdi9tZ2pzM0l6N2w5cHBSQU10RUtXK3lsQmpSZmExMDV6U2d2aHZPVUdYOVozakxOcnF1WFhRTERGWG1CU2VUVCt6QVdRL2FsRVBMTldPU3ZWTDJPOE9FRm0ydTdxTGpRZ2ZLZE5ua1F1ejF3SVBxdit5MkRHVFB5eFpxOTlodUNaSGUzKzUySUYwVzJrU1E1bGtpZSs5MnlvandiVjBUVmZKczNIL1cyQ05OczJvaG81REVlUy93eFhiaTZiajBMYVVNa0w1SW4wZVFSUWkvVXkwYmE4WURqOW94SjI0N2RIOG9rN0ZqMHZvSE0ydVUxeHVoR1MyaHd2K21ycnJYNHJPa1VhcmFoWU5teHlleHNGc0xCenNPUktEM0phOElIdkxlTk1pdXl5SkVOUHVBSlVQWDZDeEIxQ0V6Vjl3Q2hwUVBINFpZaWZDRmhMRjFJUXQ4NlpQeDYyZkdpMUVkMHI3dDBuZnNWeUMxKzJ3bGVtUE0vYUlrNGdoamx0VEtPRkhmVkkybmNiU2RBUWVDMVRPOXZxNnBUUDZvSjR6WEJkS2picTRzczkzbzVRaXNQTDBaeTVDVnN4b3lNaUIzV0lRb29UUk1xckZRSTFoaXlIb3RzMkZ6eXk4NFk3V3dZTFg5ek1JVHJZbjdLTWpwQWk5QkNGYThkZFZhOE1WQnNtOEcxOVlBZmtlQ0o1RC9OUkNFOEFsRVhITWtNZWk5TVdEVTdZSWp0UnQ0Q0ZTYy9hTnhjRmpsYmh2K1pRaEZ0S2p6ZG9LK3ZDRjgybEM2NnNoeHBFK3R1VkoxWkhtUDUwN1pta01sQ0NhaUlQcU1DcWNJWlVXUnhnVkxxVi9CUktLdEc2Mnk0Y2tqdnBNNkRIWWF5eS9RNGJUbUpFOGFpQ0RCa3NHaXJ4QmJRSjJQZXRYR1ZTWTBaSnozWW5GWmhiYndDaW01eVMvdXJGcnFEYm51d0pDRWF1Yk13Zk8vWWc1VDNYYythN3d3S2RuZURjTEc3UWFTK0hCWlZ5ZExUN0pVY2JQUnF1ZnBQR2xKTER2czUrY1lzVVBDVDdBWUlaa21NTXNyYVB1aVFoMVBJVHlJd0JDNTVXQU5ZREI3anRxa2huWFVTWDUvc3Q4UU1pK3NJZmxEZkVtYjFpQWhXZ1RlNE8xckFQZ01CNFJtR1VtR3plVWhRVlVxZEl3RWRCdVUvekVSbWEyWk9KVmhQNWFjd3RvMUtwY0VweWdyOTFOeTgrOXhtUytHSElmWHEzWnBFQUwvdWtkUnYrS2YxSWdNcXdETzhpdXRHSnNvRXFNSHFOUXJHNThkeGlyRmRXN0h4dWcrL1BNVkpRb3NVbmh3YWdYVVJKZC84aTRFYk1xcDluWFBoZGJyZ1NOeUdycVErKzlpbXBzMXUvTGdqcDRSUVJlRXZacWFGWnczLzJJVkxuSW11V2x3azhWci9RKzNaaTdrbnJrMnZNaXg2Tk9CNjR1Y215QzJTTU51b0NmZmdUWXpTaGovRWNBVW1BTVRmaGxNS1phOVdMeC90MmNNWGdROTA2dlNKcGFqb2tqSGc0cE4veU8ramhlZHh1WGZ6eS91bHdaMHdOcm1vcGt3SGlHUWFyZTJ5MmhCTkNpQjZVYmR5dlNOaUZLcXkybXZmZk5OSEFLTmcwd3ZaOUhMbGZZd1p3TUJQWlUycHUvM050cE9pbUYvaVg5cEQ3MUxSTlV1ZFVCY2c1ZDFTRnpHdUJWMVNsZVozRHc5UE01WngwUUdIak5xd0VTdTVBVm9jTzVYaitsRWxBQUtaajhaSEdGZ3VSSXhMVkhzZXlweVpRMC85NFAvRGtvTHloWGhkb2puOHYrMTBMNkNwQVViRkpvd1N6ZGRCWVRQZ1YvT1VyTWQxT0VHVmxIdlV2d0RGU2M1Uk9iSmlvTU01dkhEYWlhbDdaUlZTT3c2R1cwb2ZiYjJTTUNFZEkyOHRYM0lNUnZveGp4UVhKRndzcGRTL291STdxakdUZjVnVGtaTHVNaTJRSXYzZHdXSXlwQ05LMEFPS0p2WXNZYkVYaDl6Tm04aEhLWTlqTUR5VzNFclRONFhiRGFpKzYxbFZTdmNDM3EwYnM2NXF1NXE3TXJuU0toaEg2VUdOVW1yTitJTWtwYlltZjlGWWpVcytKSjM4Q2t0dnJiT1BPbjRpMUIvU1lvcElsdk8wMjRSU0NkTFdlakpZMm1NZTFBbGlNNFlvcGphY3FyOUZhb3hQL0tzT205N01ScUdaSGJYenlSZEhXS3Y5ZWgwK2ZDcS9UcDAyR3FwS2Y5MklFK25UQjhFYVA4anFRdlVSWjdDcWI4a2Vtd2VIcnI5WEhxWEJ3ODVITXl5K2dxd1VocXUyUzNJOHVMM1l3cVpneXRxc1F1YVlvOURPeXhaK29XLzZXQmlwVHM3eHhpTnExL0NIYzVGOXFBOXp5QWtNSWl0bGdUelg1dVBjZ01PWlpiZ01pa0w0Nm83aEVTWEIvMkdkZmROV3hWUzF2MXQxU2gyWUlVSTJPOHBaakJIVDAxclBrTDdTeE5UYUxBcTVzdXhtV0xlc3JOZXBtb1crcWUvUmJHU1BOQmtobG5CcExpTHN5emJLVER5UkZRUEtLM0xIN0RZVmJhZlJQRXFqL1ExakFYMG1TQk95cEFhUXZ2VXNyYjNoWXNUaFhEQWtKQnJ6dHBmM2tTaVAyeXVFVVB1dDNybkc1M3pUTGR4SW9IeC93ZFZlMlNpOE04VjZUcGl6WG0rNmVRUHdBcjFvbitGZkVuZ0hkVldFMUJybEhqZ0dFeUlsaVFGSlB4YUVSTzkyMzd0eEc3WDZJNWZsVUlubnR6WWRxenJ4bEhrZ0ZMeWQ2QWh3amp0bGd0TEJGKzNlM1V3YlRDNjlvMExvU0RTdWhsK0VWQ213M2ZlZnBqckFrcU1RNTc2bFRvMWZ2WWlnUUdjVDUzd3NueFVNck5VWDA1eGtONG5FSU81TFB2TDdWS0k5NzBiRFlRQVZjMDdNUTdQc0ZqS2VmKzVkR2toUGdsWnd3MGVHalQyYnU5YTluY2x0TDIrZkRlNUhpWTNiTHhuUTNmS1d2UDhFUzdiS2pEOXJuNTZsRUFGbG5VTHNPQndlOEtSZndLb2Q5UFhKYW5FOEtMM2V4RXFYNFU2WlZQVi9URzY5ck9hUEVBV1NxKzlJcnNLdXJEenlqZ01LTmI3L0VGV2o3N3RVK1dkTkFJQnJQSHYxNW9LWHphNTk5M0VBUmtEcnZCcTUzdnV1Rk9HelhjS2lEb0tLK3JRMHVZNFBza0ZkTzJBMUtFZGg1RUFrU0duaUYraDNjMkVTRElDbDZUNGZ4ckROM3JWVnBjUVFsb1NraDBES2t5QjRNODVXWVFPelp1ZzZYOUUwN2ZidkwwZVJBcHNoc1Q3U0FtSm5XU1FtZHZ5a3kreEdzNXU2eFQrQWwza2tSbS94VWtCQVNJZmh2Rkk2VmxwRkw2YzA0ZlByYzdpOG9FS3VxVlF0Y2h3U1B6SmFzRnBWWXY0L2l6Z2JFQjNBV3VmMmlGcGMrQng1Uk9takt2Q3UyblZkdUJPMmR3QmlXWTBVMXd1T05PQVNaaTZ3OW1INGVGL2NRVlBGeDlIM21meUJQdnZhd2xuenorSHpHbXU1eTNwU01MdDU0M1FYbnFhQkFoeHJUUExXcFgwUGwvSEU2czQyTzVNdFluYVlOd1pFTEJCREkzSUZ6cEwzaUNORldlWGcyMlgrSnFnSTdMcWVlQThvSWpBMjJ4cnBJQkhJZnlSMjRLTnNVNjhtU0hYQUFZS0xvb2pQYnFtMHk5VjBsN3l0Z3QvQUVMdDRjYmk0a2Y0d25pY1dscDVVN1NmSkdYdGVXRDJKWVVRNEdzVXdtbFVWTEVhN2tnendrcnJBSjA0M0dJOWQ0RmFwUTdZb1grNDA3RWlYaDh2RUdhWHZjUk9vbjI5ZXZPanZITHNjY1A0bDdvdkppRVRRYnhhNHg4SUZ2YTMxV3FNelZYa3VuVHl6MUpiTHZDcE1Zd3N4VHlXemQ2bnFkbjJ1Y000aitRYzBtQ0FUZTVuL2ZFM3ZNVko4emdvdEUrclZzeW9nQlJWOGRWTisvU2s5ZCswYWcvWGxOcW5Fd3lWa1h0NHRSRExqa0psZmVmajBzWnBpMnVENHFoeVRxOUVXQ1JrTytYeW9lQ1RBZXZ5MkxuR2EzcW9sN1dHZC9yVXVDbDByeFVSK25jeUp5S2VVc3VZY0p1MmJkYzQwV05XNG91M0VwSitBOXg0U3NQMWk2WWpUY2NYRFhQL0I0OTdyaXJaY0pQVzlvV1pLald3aC9QUERTenI1ajNCSGx6TUFnRVhxbTcyTE9sbjR6VStBY3RCTDh6bUhhcnVCbWhiTWFSWHdlSTR6dWFBYXpENmFUclNJeGl4RmdZYUVaU2VZNG9NT3RCejMzRFprZ1pGZnl3OVZFUGFTdzRtNWs0SEw3Tzg4RXNtSWRGdW1ZMVJCWUNsZk9jOTRwTHY0VjFSSjVZTTNaVmZXUE5qYUVFL2x4ODZQSlBCU0JCQytKMGdZNmFseFZYOXpRWkRnZWd0TG13T0IwcUJhNkl1L3V4TisvRW9FTFFTL1Z6OVBqU1dDbTJ1WENqYzg5SWI0eHRDcjlBcG5wZ2lzVlZCRS96K0Z0N2JuZjRFNno3b0xuRXRWWW9Qa25YclUvb1FBM21HOTFwZW5ranA0clZmMlpGRWp1WDIyN2U3VEh3TzFNL1Rhc2pvQml5YkdZUkJ4Ym5IdXZxZ3NoVTJwTDA2b3ZZYVlicVc2OWYxMUU3Vi9kcVQ4QmQrcExpaytId3VNK3NmYldvSGxMUTlCMlNMR0pNUUNLSjJPYjVTcENEN3RWMjRNUTFBc0tlQ29DZGQ3c2xCRENTajF0bGp2Sk92eXAxUGV2bk5DcFpoUWxtQWVXT3B1a1l6bnVQbVpPOWgwS3dMd3p6QVJSL0FWRzJNaXRRQlFIR1N4bFFCVGlKdHkrSTZXL2pYY25jNHZaeVJ0SElpWTJmTElseXJDRldCOFlha2xjNm8vNDFYZkdQb0tJRDJIOEdSaXdVMEpxY0JXYUthanE3bGNwUFl6c2pqVUhLZnVDbkI0NlZURnZLdUd6OXRNTmxOekFJckdTNnFDNGJLUkF4LzZPMHNDYkJsS1BtbDZiZnhVZHZ3TEVsRlV4c0hYV1ppQ1pEKzgxOGtPb04wbDZkSjB1ZTJTQzNPRyt4K3ZuVXJ5RzZVMTRlWmdlaE84Y1dadk1FMThXREs2YjdDVSt0QnBzYUZ6VGcrSUpFWFYxVVZHMmhMUjVYWFFzMXlZVmZDdUpPVmpZYUsxb1dNcWlJNmhDZTkxVFNaaE9Od1ZSbVR1WmpLZ1RpUWVZSEYwRkNLcnQrUmMxM09BVU5DelhvSlpkOGVWaG1FdVA1TWYyUm9oVUIreXlaaCttWXRrSkh3MTBoR3gvNi9Dc3dTTEk1MUNtSE14bnhicU5XdjhGdzVadUNOc2MwY1ZmTUxMYmR3Y09VSE1kR1cxZGk0YTk5b3M4ZmZsV1cwcUYvVWhtcElob0NBNDU4VGxVWnBWWU1Mb1VPcmNqWmhYOVIwMFlUWk11eEFFbThReEJPVk9iZkNaVVNtN3RnQ1pYbVhkb2ROWXB3TnFVZHd1Lys1T3dETmZqNzN0bXJXcnVQZHBvVjVkN21Od2s0RkRzM3RidHZpOTYrSnhSTW1xTXFJQ0kveUczR0pnMEd0KzMwM1NadndManpXa0JpcVFrSVdTYmhQYmhhcUVSOHd1V3FyWGI3Umo4RWliVTVkbjArZFpHSDBhak55bkltU0FhTnlReDF2a0JZMW9Id3k3WkY5RGd2clphdFJtOXRBSXNrSG9EMkN1em1odllpVEpyQlczL0RPUkJYeWpkaXQ1THZObWxuU2VZRTU2VjIwQ3VkVXhRaDFpbkg2TWZsbGdwbHlKZDJYb0dFakp3cy8waHpnWERmZ21YQ3AyUU5MdlhNdDEzM1lOL0JVTlovY0pYNUZUdjNRRytld2Q4cmVhQjZOc3puZDNzVEhlL0d0d1YzaVRFcjZRc3o2N3FPMnl3V3ZrOHNDL3Baa0FyZkZBZGRDaUFaay9mTTlEYkYzV2hRd0NQQVV5R1NuMVhxWHZ4Q1lndEp1VlNFOG9kSlJjZE92UXlXTkFtWGE3NXpkVHJFcXp6dUZpVXpQdGZXRTlZMGtmMUdGcXlydXFpYm9OTHl0TjJ0Uld4QXV4clU4aURuQThNMmNJYVRsekdvWUlBalpZN1lVcHlSZHk5Y3pZM1BPaWVmbm9OdDlXMkg1L3BTMUs2K3RVQzZyUmYyby9vNjZmdmRZbHp0a2JsbEFyVUtxRmNNOUpEQjQza1ErL2xvS3pINDVTU3g3aHptcDZ6NjAyUjF0d0YvMWN4Z04vNDFXeXp3aDVYenVFWlJ4UEtlaHN6L2NuZW85Ym52RU5UcXRXUnlRbWlKa2RaVGgxTHJ3OEZkSnpKZHB5R1NleEpLa0EwSVJJL3lQOFFVWndqQXp2ODRGNnUyaGtrS251NGcxbktmam5vUkVsR3VRR2pDU05DdXVENVQvSTNtWC9SNXF1T3M2RHJUam9PUnBFWkN3NzRIK0JnclQ1Mlp2aWNaeXRreldsdVFGQ2c1aGdBcEVzRFJLeitna3F5TTR3ZXlVamJrSkdoTnNLb2ZBcmhoaWIxb0lTUklBU0N1QmFTRDFPN0VEWFZrTFNxc2VjdzRuYkVzRG5ZdGZEYTZDbzBOTlJxNk9xQktMVEU5S2RFdWhUbU5tMWp3WDFLVU5sanRVMW5vM09vd3dMMXRpNGkvR2pHK0xQUjc4b0g3VjRqeFpJK3cyd1oxelVQNjFER2g2QkJKMS9FT21QcXVoaFNDY1lXY0dBTjZSWHZGVzg0UzNqS0pjVHFoT3lwV0Q5c0dBZjhNK0NZVUllVkxBQnpwblczeXhPNXpQOWxsSk1DanBlTS9SK1RRei93MmNJY0R1bHIveG4rMHNKQnJraG8wZm9Xam9CdVhwYll3NFVNT2l3dTlZRkYyd0lPVlVGdHY5ZlE4M1pYV0gyNmVsNnBaaElsNDc3T2VFbWsza1U1NGpMQ0QxZG81dDduYjZEOFVFc21Sd3pNc3NicHIzcjE2TFNjY0RNTzJ4TFB3THlWaXg1bHNpclBobnBvSldFeUpkUEJNTzdpSU1wRjJFa3A1QXNGVjJwMjJ6TGk5bU9jeVdMSG90YzAvdHEwdFlRS3dKVHQzUy9qblkwd3F4c1hab1NFT1R0Qnd2ODQvM1RDMXdIaElKSmlnV0RrRUNQOHdzOXlqcXp2eVlRSU82R2o0QXZDdmU4VjdSbDBVOG5FZm1uRUNRc3VjSmpyQzNURDhpektJUGdPZkZ5bHdWdllWWU8wcTBoeGJ2eEl2OWx1YnVraWo1Y294RitsOXFjNlkxbk5WcUpQL0NQblpmeEtaZEc0MURUT2s1d2hOVHl3KzdmZzhZV0VXUFcvUlBWdXRZdUNDNGVoYzJlNmVwM3VVbnU3Yi9tY1VuMk1uK2JmZ0lVTmVIdEJ2ZDZNQXBPT00xak1tUWs5U2N1eDh5d2sycldPR1NtazBNZ0creDBvUjRPTEwvNzc2SjAxRWxGeU5WZWQvdkZqazVvM3REbUU2cS9zWFZGVDJmaWNXUUZxWjAyQjBpenlzZHgySVBRRFBtUjMyb2JOeUdxRWFhQzJjd3BwSm90QmRoLzE2VTBVd1pzWlpLWnJjSzhmTTJZN3lFbDM3TzEzcUsyc0lzak1WdFpiOW5lZE1leW9wSlBHVlB1QkFwSWN0MDZpYnhDeml5MFA2QURwYVdPVFVhaE53QU1KWGhPRUkxNkowQ2xYc1N1aTV0dnV3UlJKVmFHQytmZlZTeEZHUDN1WVYyZG12eG8yWXZnTEc3TWJsU1NNNC9telUrUWRjcEU3a3U0V0JoUlRpczZhYjdtYUg3dFVIS3hCak5YYitIOEgvMk01VUtGSnJHeU54ZDhUaUtRT3VMakxNTk5kU0hEYnYxdGRHWmVwTTA0UVExb2V5TjBaU0ZzWnZxTFRiNTBxR1ZLQ1J4OTk4cEFFb1M4akxRMkV2aFhKVDN2RmFwVnNjSW84cFR6bGsrQVRUOXAxVnBBZzFpUk4zVkdkQlB2TWcvVlBxRlFHcWpkNjNvZnVmY1VsbEd2Qk11QzRKMjZUd0lKUmdSY2xCU2FwZFdGSThSbzVVYjVPT2tIRmtHZ1FPYTBZdWVKZ2J6QXd5M2Z0U3Vlc3FHSG4zQURtQkEzOHVHY2tCYkNQK3hjbnMyRW5sUU5zdWkrVkhJNHpPU3R4UkRINnNjc3pzeVpha2M0aUp3aGJOYWQ5dndSNi8zQ0p0dDZPRmpDMEVSQlFZMGVjTy9MR0tYR1dJYzFHRVBNM2xCVlhoNXlyVzRpSTBTMitwWWQ3bDBLaUErVEZENTl3M1psVnNnell2UEs1Rm5vdmw3M1hkaWxRbE9KQUQ4VWpUTTdsV3UxOEd6a0xMeTZMUG4zYjZZdEs3b2dnV0RhSkVOOVBPS1lkK2tZSU1DRSszVnhEbnB5RndMQ3pHRjRPRWJVRVFSSUg1dTRqNDI2alV4WFJSaUNjOHVwWkdRNi96bFdsd1IwaEVEdUFDWm8xMW1WanMyaGt6b1gvVjRsZWlYcU1Jczd4OW1jd2dpcjJwdVY2UzByc0NuYTk2MTltcnpBN2JtMXU3azdzTXg3Z0ZuTEppV0RoZTBtTGx3c2N0YWFYcWxsdFg3SVM4S2J6N1JTenpzdGx4SExrMWEwN25kaHlFMk55SlJqSVRWdDE1dUJ4U0dSNjNqdFppQnFrTUFnUm0wbzhTclhaNTRDeDJTNHd0eGVQS3RCTUVPT2dXUXdjL2pjNkNXZFRKbHkranorNXRRUlZTVDJJSXBTenVDcFd0aXZJTVlwc1lxUDZEVW5QdHd4VHczdXhCTW9CTUE3ODZRbUJrSFdNQzlBMVFreTBuM1I3RlhOUmxlVkNCRjdtUlBtbS91bzZqYlU3Sk5XZVNpMWdYa050dHBqVkd1cW05T3lRY1ErZS9PaGJZcjZNQzRyYjdyVnczK1EzQUNnSW5PaEtub05FblJvaVV5cCsvMGU5YmNIVHgwdVVEZTAyZENBdTlCSUYya3NqVXRzR1AvZXYxZE1BblNPcXAwa2x2NWJOalE0WjE1VGhTNy9yMkozQkluNVEzOEs5bTBPNjV6SG1FZG5YeHpOTGtoQXVTWDU1dVB1RzFZczRiQ2ZEa3FhQUs3QUtEbm9qTHVsYTE5OFRzYjhCSE9UK0lEaFJoaDdtTm1lcWtMTlcweldjR3BVeldZeUNiSmF3ZmhSUXV2Q29qOXpFelhSd1NMUGNXSG5KQzYyUjJTQXhzd3VEdjlPLzZKOVhQYVREU0hiUkRlZUpJSVg0ejczY0R3NUQ3UnJ4K0diMEpjTmVQVjRaZFZZM2dSd0tzM3JUbjdMczJkdEVJWkw2UXNsZUs5WEM1TkRrbGpIQjNLRzJGOW12MFNGMllVUEdSeHY4eWovRi9kM00rRHVrL3VWaHJQRDF0dWNnVGFobFRXWlNYSmlST0V2WTVyaXY4c1BsWHdaQ29tMERZNGhwNDNSeTczcCtIMFhBdnRRYjdTVG8yRVhQWjJicERjb25OTWdxR21DN2JRYlY1dysrZUhleUZXd0NjWU5Ga1BVWGFUWTFxYlBJc1MxQzJML1ZjOENrUkJYb3VYNGVZbDVwWFNOengvMVkzZG9JWlUrbUd6SGhmR3NlNVd0a3E4K3BMM2F2bHJoMXBVTEpWendrVVlvZitOSlBDbXFNMnllREgvR2cvWXdGaWFTWjBQeUpMYm0vOFB0dXJ6ZGZVV2h6Tkk3VExCL1FFTUUyM1AzcENMMTJkSUd0SW5iUERmalkxbUZzMTk3ODVLMFdxdkZER0NJOTF6YXl3YllEVDRaWmNRYzJ3dGloYUdRTThIRnpOMGZiaGRtNXlNZit3TStNbnhhbUxPQ2tlTkJXbEZvUmw0cXY2T1NPUEp1cXlBQ01TQXprSi9BZllGK3hYZjV6RFpid3l1K0EzSXN2S2JPZlJldnViZGN1UWRNRTBpTVAxUVhaUFJrRnRzZEJvcXRrUHNYajR1dUZzamZJbVlCbDhTUFVzTlFyZVBFOThKTS8vR0F6WDJyNnYxS0JhNFVQTy93UGhUQlFPSXNZdnpzRWxkV0I1STVFdWs4R21EempHSm9iN2hOVnd6N1FMZnBiSUtKTStzTUpJMWh3bzljODVDTnVpeGFVRlZzRWVHNDBVVUhJQXFuZ29qamxocXlhKzdvMmd0dHVVaGhYOU5oRkFSLzJnakRhNkd2WkhMYURxbnJDWkx1bldOL25mQW9vazlUSkZ2N3JHMjZRc1h3bndJejJ3cTV2dFcyT0MwTDU4NUcwd2Q0VVo5bEliSlRya0VFVi90d2dpd2tpOCtlY1VNK0x0VHlZQndiWlM0ZDlLUFdZRnY4ZTA5WUZkV2VYTXh3TEVZaGdnTXRwcG9RbEtzVWR3YWE5V3VZcmgyS2dLUUtIK2VPSWE5UzJPVmtCcC94SDRKeURLZkVLRW9TUmZOZDZwa1Bvd0hsTGx2ZDRoRjhFbzZNTGhrVnZ4cFlvSVNwUWkzN3Flc3d3QlhjNEFMd0NUMVp5QjQ0b1dZeTNxREYyRFhWdzhKY2RYdXNqd0FnZHRyZ3ljU2YxYktIU1htdm1JVzc2TVp6RXg3azBFTGVPRHBML01tVnRZMFRTMG1pczREcTNyOFllZ0x2TE9JS2oxMU16SDMwTkE3djB1eUQrMGJ4WXFOcW9SQmtwQTdIbWx1bnNtSE1NN1ZwU2JmWXN5eEV0MGsraytOMDlSck1IRWJoVFU1cjlqaHhiYVNNMFltZVJhK2pmQTRSQkY4RWVLS3BtTUllUUQrT2JHZHAxNlFtTDNFZmxHWnlsbnVZd3BqVjc4YTM1SlJVK1RkUyt3K09lOTQvMCtJQ0IvaThQdml2bW80TklFODhtNHFQWE1MR3FaQnhTVFBvbjVMTk91M3Npbkwvdk5JL3FMVndUTWFaUm5EbmZYQmViVDB4UXlxQ040NE4vTkZWbHRVL3d5UUwremtocGlZRWZMMk8rUWZ3N01vSWpGbjlyMWFUaTdWZ0ZBd3lKSXdHUFVybUNOL0tQZVFxQXRpQ3cxSllSdVRLcVk2M0dGbEk4SU5wWlVKM2toSmZLeE5yTFcwajB1bjV4VUVmOUdLcXE1NzhoTURjcExMSStKL3Jzck0xSFJJdHdIVjFwM2gySDkwaUFhb3FNMHhHWjd0NW1QaUpCV1VUeVA1UzdYYlhqL1dHNHlIT24za2tHZkorYkRhTW1jYVE3QWRmaUoxN2dXTUYxRHFaUVA3RE1TN3NjYVdFWnhSZC9CTm9Ua085SUhDcC9ZZWFsSUFlWFV1bUpMWjZ0OXNrQjVRR2FUWXJXV0NzazRvdnB0VHZXSUhacWY5dUM5NWFPaXdiN0NJcmgyVUVUcXRnUlk3VkN4UGFURUN3U3JuVWN0ZXpwY2IvbGg5NWMzNnhCNW9IS0V5TmNxSEU2N0Q0cU9EVkpiZ2d0ZHhtUi9Wd3FoV3JTZ00rNWFFbjFuaXVicjRldXdqMXFTWEtHVWhWVjdtQ0pGUkxaY0UvTjhXOXI4ZkcvNjNxRUZTa3IrZ2pQdzJUWkxGNVM1N1RYZ3RyQWwvdDZncXdVR3lKTmc1SVZNa3c1UDlBQUxrWDBLaXFFdk4vTDJRcWFMSUJCeXlUd0NMYXRQV24wOUMrZTdFL0JIMTJacUJHZ3hKc3g2SE50WFVoSUxWUzNqaVBkQjlSZm1GQ0IrWEZ2bTAxMDhua1YycTAyUUFZaW01R0YxOEVhK1FpVEpqQXhPb0VFRVdLb1VIYTRKdk4zMlNlTWJGemhjdVFwQ0tpUXl3MlIybnRTbld2SFhqd2hPa0t0SWtuTENPTG9pT0tabHlRb1RJRWZVMDRzMnRjTEhLTTJoQnJacTJpSG55cXNnL0RCV2UyT2Q3Mldia2JVd0p1TGwvV2N1ZzZyTDlzVFlzV1Z6em9zR0tkakhVaWFpaEpTcVNGTjV0aHJNWkNNMW1LbU9qMG80Q09MbkRSekpQa20xdFlmajh0LyszbUZOcmxRQkNBZnozTTJONWJKSU9IR3QwaUhTbCt6bVFwNS9KdUdPRFJCSUZuSU9VVVRyVytURmVlcko4S3REUTdYQjBxYmlMNllOWmJ0MFRxbW83TnZ0VFVDMGMvT1FsbGZEK2F4am05TEVkUzA4ZWxDankvUmtWYVRLRFpWZDVNaXBwd09YOVc4OWNubHBCUnpFTm9rcjA1NGRsSTNDTmtOWkFwdURtZDJVMkUyajBncFZqbDlWdmRnbytpK3lDSkJham5CU2VLUHhudUFaTUdkUkh6aTBHYWUvdzN1YzdEcWtXTDFhVng4dUFWZWhTbEF5MWxSQnZZR0orUDhQbndXUUZUSWVoazErT01KaWRabjZkYVg0K3I5Q2RjMi94QUdJSDh2cFV1d082blZZU3pBWVFyWWhwQUEydjhjVG45Qi9ha1lhTDhrcjhTZTVySmZsRy9SVjk3MXVibklnTmp3NWZ4aUYwR1NrU2VwVHpNQnlWZ00vc29jVmZ0RmU5SmNvaG1KV0ttNkQrS2dvQVQ3TG1lRnBhYnNQbTVtYytWRjN5dk4ydUdIc3VjTW8zNFFTRHpNb2F4U0IyUGJCUk9tREE5UVE1a3B2QUZCMTJxOUYydG5VMzMrRFFBcVBjOXIrdHVTM1NhOTBVTjUzUFhTbndTbnNScFdOMG9kS3k2ZFFOSnNRYXRkVXFiUmlsbnllS0dWN1RDNC95NXlORDZiNnp5d2xicTcybEhZTFc0V1BYUEtzWFU1eFZDU2JtV0E1NmtJaVhIYlUrMmVQVG5CZVBrSXF2amF4QXpnTHlnN0JwQVUrUnNzcGxCK3lEdFVNM3d3cnU5UjZQbDI5U29aWnZrZFlXNUtQdzIzR2FHM2ppZkJaenNTOE56dTZqRUZLeitzK0xkN3lmQzRsL2RtNDZsTkVmYTVDdklxMWVtOVJRR0VYQlA3Uk1McXV1UVlNZDJJeC9kVjVRMEp6T2VRc2toVXFqQjBNNXc1dTZzK2RQWG9lSTNOaE1qOVYxQ2tHZ2E5Y0diOEVMZWRSQTlhMmpWKzY0QWl6Ni96M3REV1NRSXRiVHVMcnFXNjdUVzhscWpBaE1od0g3dFVaeGRPZmtNb2JabzFyL0NuMXdQOE5ISFhQSFRPendPY0g1Y3lYYmNnVnplcmtkRzFkZmZ3QUxrWWxpNW0yOHpSRzAvd3ZJOVpWU3ZZTFkyajFDYUxtM05BQTU2L0MvcDZsQlk1UGM5Ni9Ld1pqS0VOVkRFUDV0Y1lUYWJsZDQwWjlZbFhCamNaTFQ0UU5tdE5rZ1ZGMkNZTEc3WlBQMzMzRk9FZHlMc1NyVzhES25JK3Q1WFZoSUliOVBRbk9wT2lncVNNaU93eE5vZUZiNEFLRWIrRkZYK0NaTGpkTHQxTitkUHVrcGkvQUxVWWFnbEZFTXR3blV3TXIzLzdJaXNqOHpGSG9nendlY2N3TDNOYVVCMUtrOUM0TklnY3Z5dGdaK2duekJLdHNrSVBHdFNGTmR1VDRrUFZTaFZSYjViNUo3alRvUHRuMk5FUlhOUW5VM0ttQ3hvUzA3WDhMdk5SM0d1cUJpelEwdUZxVGNZUTVsV1Q3VmZYd3NNaWRJcEJWV3FoaDBmeUZvVVlkOFhLRlJNcE54YnEvUFVOT3NuaHU0dTRBdTFLVi9PaGxqSkViSDhzVHg4ZXRMdEVGMnhKNXlkZE9qN3ZKSWh0T3I1Z0tYdWs4RTBzTFdNcmtWa2gzM0VGSURnWVM0SlZ0aW9FYUEvNWJZM2VxMy9rbC9TRkh5Sm1Ic0lqNGxLbWhORjk0ZWp1MVBSZXQ1YWI5ZENROUFUeCtXWWVBRVUzR1pKemQwMmlMUFZ0bW5mMGJhVnU3ZjVEaUp2bUc2aDlEN05ScFBKQnRQaWtPRkdFdktSUTZpRkk2QkhIdHZzcjBpZ3c3MzJOV0J4TEpmOXFKVmVmWXk2bUZmdEhKejZMREY4NVJIdXZlQVJhL1paMENaWFdjMlcycEd0TFRXMWV3STVzN1puMTFPWjdNR3kzUGk4Q0hzUldtZTcwWVBlUnlpbFFnSnhkbjNudk0reFJBbWc0aTNIQzVoYjkrRitCR1NYUFplSXpzZEJtN0xTc3QzUWxiVWVRdTUrY3R5ZUtSVEJ0U1B4eUtud1F1Q0VwQmlwcE5rcTlUWmwzOCtZdWk5amVoZTgwVGVSYmZKaUFsemZubEk5cWxYTjlxOSs0WUlUbzg2aExUeHBLRkdZM0RqVm5YcDVoTTZYaDlpaUdGU09IOEhPZ1R6VjRpTEljd2VBelMxZEY4ZUFYWXR5Z3pHWC9DN3dmbjlUYThGQ1FHWWFVcXFoSEp1cmlCRWt6K3piVFo2Y3BJSGE4NlZHN2V5L3pHSGYvRTRBSkhmcVBXaEpydklKV0swbmNaWnY5NmJNbDVJWVpFSi9XN3BMT2tkT2dvbnpLMVFsWk1qQ0dzWnZRWGZZTmt5VFQ0NzBHWEQxdTFaeDVxRkQ2NG1RR1pCLzM0UGl3TkZybVVIZGNxUklGcHdsaml1c01VaFFtWklnTTZ5Q01lZlM0ZGNjbVBEUFhYS0cyUzZmSVAvdC9aRnI5MmRuc1cxUGtNTUpjc3cwS1BlSGwvelZlV1RDeHc2WFZHc3IwNUdKNk5BOFpVL0RLdUZKcEdNay82bmNGSWFneDh5bE8xRGtUNkcrUmFsZXovMVZET1A4Q0tIZlkzOWNJWmowVWZpTEMwOHBUK01NbG5WTHVCMEF4b0JYTURPMnVPMzAwZDd2QytwaHNjMnBNNlRaaXpwOTMzeUlrN2FrbmQ5cmNVU1poMVJ4cTRIRWFzNlBDU2FMakdLWG1TQmRvVmttWVVEenllUFVjaGFyaDltRXBkT3dNd1lVMHZiS1JFMHdJb1dNS2hnczI0QkVKTStvU0luWktSdVhUR2paeElSQU9SSVNYYjl1WGJ1WWp6MytVdTJGRWhRbVhhTThrVk5XVTd5NmxKRGxDLzFKUUFhSHFMRUlGdE9hRk4yNFh3a2lycFN4ZlcvTDdMZWFYNldjSk5pOTZqUVVHWVcyS0M1QXBsMm8vV25CUkx1YzFPeXp5YUg3eW5ZUnJ6UEsyUE5QOVRuOGlHU0dKeGJXeEJlYWZVdjQveXhuMy80RmNpRHhpemlxbzJvZDR1Y1c4Nml5NlhIb0UwRGdOdkNLYXVBdHR2N1lVRml1bGRDcnhIZTNtUkgzL0phZURBdWtDUFRPQlE5VXBlV3loWnpUN2E1SXRCajFxR0FMUngxckRxL3g2MHdNd1NyQUYzd1NSS2FlRlJPTDZCcU05N3RoNnpKYytpRVZwRDZIM2gvRGk2aUN5bnFmZ3Q3dy9ZWnNiWSsxb002QWpwNEMyWTl0TjBkRENjNUFHUlgwdDFZVWRRQ1hqWHA0MlZwM1pneHBRR2tBUXhrUU51MjU2QnZQRDU3ZzhVSzhXQWxxMFZHZ3c5OGlvbGdXRDIvNG5SSUJFVzU5Y3NhNHRxWmRpV0dKMC9yb2lzbGhwRlRuNVZTekFZYTVwU3lTWU9kZnV5TmQ3WjhSUXRSNkxtcDkxQW9QdlQzeUFCQ3Q4UzVHQm5SSGcvcFIwd3NRTW5XV3NBS1B1RCtVWC9IcUx2d0xQRFI5bkRMTzYyUDVKMjU2VmQxYlZCakdtaWVhcmsya2RtVmZtUDVjNXIrblBSeWltd0tRVllhWURNMGZUS2N5c1NwdHlyUkJqN2NibnhLNDBlby9FMW8vZzVWbkNTL2YxbkN0ZEh0UllTT1AxYU94aVZvaXNJNlhFc1gySjhvWHFEQUorNGh5czRxRzVMZ01QM0cydUY2Uk5SbEZXYjIvOXo2UWxzdG1YTUhwekdlQkVjMmxTT3B1N0M1L2tPWmxuK1J2OXQrVmdqTkFtaXhxTytjRllhSWw1TXBxcC93cHhaTW8xbndNTVdTWW80a09FRldaaFBWL0tMVDVRU2svU09qQ3dIei9jTm9nekd2d3VPK0JjY25QVzcycUF4azE1UUVqbStpNlh6QkxKZlpUcmFmdW1mYXowVnk3RzJocjJpeVdCdnh2SktxZE5nRC83M2xlbUJoNDBXd0NJellESFh6M0ptZHlTRnpBUnFOZmd4MzB6Vk9sVlpOaUJLTkVkTE5hVmZYYTZzaGxiUDVyNFZ6aDBuT1c4SmJsbVpXV0JOQVJsRVE2YzlvOW12TFhYcHJQUDlYbklDT3NOREhFVGZVMzhxSGxvRlVDc1pCWnVLTWJkaXQ4Zk91KzVSTkN1bEZjRkQvOHUva3IrQ3IzQmNROGY2M2tHVmQ1eVdyaTBFV1Bjam8vN012ejFnL3g0bCswNGJzMGVMZVp0QnkyUFhBYTNYY1ordXQwS3hybkFhbEVtQVFsRmlYKzNneld0UGVjY0xreUsyM0YzMG9xYlJLOTkwSWlsVlN6RW9CNmFPMmVEOW5Ha3A0MXdqTytPSEU5Q2hxT3dtZWlSVUZFNnBBQk1hcDJmbjFuTmdnQ21PazRLd2tldW9nTU54SUJwdUQ1T21reVJTYUI2Mk1oSk84ZTU2ejJUWWo1TC92V2hhS3g0Y1VVbDVQQ1k2dXQ2SVR5Qytkek9oQk5PNWlGdlVlWCthTURQZi9LT204bWZyTTRROGF6THJvTnQ4NFV6ZHlDdG9PYlVGNXhZbStGOUxBTXFzeXEzcE9wb3ljMTl4UUxROGE3bTBTb3RxWDE3SGdsOEk0byt0UmJINE82R2JrQlV3ZGtkQytPQm5sR21GMWphMlFOUThRRUt0OG1tZkt2Z05HQTBiek5MRE5GV3orRjBnZmVQbUM0Q05sdzlXalhVVTh5SERXakVjbjdxeXlUSm0xSzh1TUttbWVPeHZPdTR2MkR0YkcrWkcrYWY0WDk5Ull2TWh0THMyb2QyaHVLSzc1czVRbk4xMzMzR3RibktmR0FmUnNQL0REUHJtMWw4M0tTdHJ4RDZrNWZOQWxicXB2WnA4U0pZNFg5MmpWMU9FSWRON2pGL01lQTNrRWdHNXJ4SjE1d0g5OWtBMUFRY1RCVDNmOEU1TTRZNjNJMSs1TktGK1hhUGp5dWVzYTlFU0xSY2RnNytWT1pYK01FMnlDdFVaQ1lsdkpmWjlHRjlwV2Y2SXVlT0JtTFVJdEFwSXhYbHJTM00zd0ZzTitpWE1NV3dycUpyWVVzN1B4NEFOWVlSNmZJVmRZVDlBNlYzZjFrYjFaREpyV2FxRWZFaEpQT2o4c0ZwWEUyT1gyR2ZlQVJ4dG9uZU1MNzhtQVk4ZVBYc0lzMTR4aFdzMGNuK2JlWGpCdVV1SWkzVDRnelpZMWVDamZkZXBFZFp4YmFUdFNrRzJBQlh6WDEzaTJBNnZMZ3BCU3dLNU5kSkZIVlgzcnJUcWVCQlB1dWx2WjU5VEtMSDRmbG4zK0lNZW1pY0tZUmJwKzVyOFMxKzliK3ZTK1piNHM0dkFSUTJWVGdHWWNYSDQ3Z3lWT0FMZ2JIK3BwUWhPYnJzTVNTb3A3dnVBVnljYVZwbHN1c0N0YWthQ283Z1VVYzJGK0gvRUsxTmRZVlUvZTIyUE9xNmhGZXlvaFZETUJyZFJvaXdiUm9RWDV1WEMvRkRodXp6ZjhhNnBJWXpHMklTWFhiNE81Qkc1Q2ZEYjZmV2xzSkRaa1g0NDJzc2xNd2F6WVo3MzYwaVpqajZlMFNrOGFuRGhUYlo4dzJoN1dFSjVTWWR2UEVmdi9MeEFvR2pMa2NCcjdwaVpTNTRRRnl2d1l6N0tJQWkvZXljbEplWDRsRGVZZ3FLR2YwVGVDVHRaM291cG5HSVkzRWdRRDRYMWNES0g1dDVwZVhYZFZ1d3FDekIvemMzejVIYWQvc0I4NnVQRm8xZlpsWmNpeXlCTWdzaDRGUkNBekdYNjhmbXlueVVka2xSdjUvZWlHbGZNN2dLcFlBSy9VYjdHUnRsdmRESlJ3blVwc2w3bmRjNHlOQ2ZYUHpuYnlaRjZWYTFuTkJmY2lrYzlrZEVESENYckppaEVnYmdwOTZtY2FOS1loVVozanp1N05hQWpjMytUdVQxRWk3cEhJNDRqY1dGdUg2alJobmppZFRXeEMxcG16N3RKMEhtSWhiWThXcUhROWxZays2d2pVamZEZEt3c1E3VzUvOGd3cVRZR2FJVXRQaXVCQ1NjSEs3MTNpazRFRFBSa2w2YThYMHFPYzZ4YnFybjV3OTdzOS9ma0xpSUpGdXo3QWliYnNUMTFjVllnTXVaZnpyMmhKVG5LUy9QWElzSWJEYlhVcCtlNzgzWk1mYVMzV0NJdzZDVXlNUTdWOUdzYlZQK2EyR3RlWmJUWmw0cDdoZ0NCTFEvSTh0cjFybmJYWjRibkxTcDFVUHVBUlVwb242dXduM3plRmtFN21mNHRTdDhrSTRscVl6VVBveXpPZWNpYmIzTFB5KzViSUEzdHppd3NwelJqSG9DaXBUaGx5RXcwelArWkl6bERtK0ZBWTVpVmJReTY0NUhxYkFXajJYZTlGUlZDQkUxZmd1TDBYbDY3NzRPQ09sVDJDdHZwL2pqZE8yRVhXRml1dkhKRHhhai91djcvQkpFdUtBbGNhNC9OamhBdEtvNlFjbG4vYUh4dEswLy9QVTg5dk12OVlUdFNZVnBDS0pteXRYSjJYOXZGODBMV2NCMUMzM3I4UFpxeDhxRXV4WXQyTXJOc3VPcHE3a2FIdTVTQnBRdldoZHBkTDhOS0M0NlIybzA5aEJqRWNab2N6Z3paY1l5RHZtT2hPeVdrZVQwM2VrZWlBdjdtenZDMkVCbFYxMW8wQVhoMXpVNTJGcWFQaVIxWTU1M25VenhEUURNMmhxZFNnVTk3NkVuUmxCbUUrbmVpNmcwT3NjMjlGYmphQjVGRkc2QlVpbEQ1RGhyK2JnU3lJNzZsNE9rN0x2cjk5SytnbzJIQkFZVTBtMHE0ekY5c1hBaExjR1VDUlFRZEJqNEt1MXN6Z2p0azE0VUFPdDdGaFlYY01PZ1BKVWl2K2Q0VERJZm1GOXVBWHpYUmNabklLYm81ejkyRlY3V2d3OXB2OVE5TDZrY0R4NkZsZXh5N0drWm1CM2RXbkJrS0pEbXFEZGZZdVE4MkhiUTNzdnJJbmlETjFqSkNsSEFKa0R6ZUQxcmFOWTVkQXhFcTBSeWRiY3kwMFA3NlZmZUpkOHJtSjhqUkhKWjhFenNLdTBqdDFESTVmMWJYWkVtSUlRaWVkbi9TdXNaaHBBRHMxd2NCaHdUYTc5M1FYMEJ1UFd0R29hcmx0Q05KU1NnOVhMV3VEZ1pHVGp3UnM1cDVPemN1WEU2bUxPSlA5ZzJFWmc4RXE2ekt6U0JXU3pENEhONnZwMFR2b0E1TlBETWp0b1Vlb3k5eGdFV2owYUtzL0NCaEFrc3YxV0ZsU0hGUERINVNrWW5GdExoY3BXTnFpSzByVE5QU2dhRnZPUEgyK28rbEIraHRJd2lVd000NFpYblo5djNWbXBJYjVVT0Rjak01Y0dNR2hrNThNWDdDeHZiNHRHaHByQVZBS0l2OGlvUUlTQlI1enFZOW9rSnlxSWZPZGNya0NPbTRXUytWeStPMWFlQnEzZ3hsMFNFWlp6MEtIczBwMktJQUlTbkNiSUNWeUo3QnBCWEo2Z21RM3UxQ29odTdQdWRhRXFGc09icUhLaG1KaHVTaGxZbTRwM3NEYXNpZmJ0ZTBJQTUyK3ltNVRSbElCTEx1OTBDaEswbStGYUgzcEg0NWVKZVJmTHIzTzcvVmpFeDJRQjNIVFBuQjRXdEVEeHlEL242ak4xMUhqcURNTUlkR2NKemVJcEwxcDB1Z3grbDB6ZG9HRVNmZmZNbzUwZkZHQjFxb3grdTdQbUVzR3pGTHJKbGdLMXJySE5PdEp1ckt0K01ZNEt5a3l6NlhkY09SQWpxYXZ5ZEV1T3RZWEwvRG5vbXU0WXgwMkMyd2NXRHByeVFrUG9hellVZk9rby9GeFZEeWlpK1VnTFpYOVF2bENDaXpEU24veXprUkcxUDE1R3RZOUZJRjhqaVd0Vk1jeTRhYlozZVRGaTB4S3BpSzB5TkJZRy90cVJWMVl4ODU2bFp2NnFGam1TdWRBMmMwUThJb1FxT1RSM3lQUThJL2Raa2Uzbzk2Yjl5VEhHc2RLTFc5OW5sNDRRNFM1UU0rV0dwdmRsOTFMQXROWm9DWWVtbG9mZEwvVWlmVW1WSENwb3ZmQlhRa1BIZWNRUVBrcnFTV0VjMHlKbDVuMk1HSDJybkdqZG9GREVRb3RWL05nc3BXaSs3bkw1MEtKMkNaSmY0TWZWeXMxdFZZRkEwbms5aDZNSHB2L0M0Y2VNL1lsTzM4bFp3T2RhbUJDalZDMlFzUExtb1I4Qnl5YzN6amNKbGpXMkdzc1lRQ1UvclNrMzNnN0pCSzluczNZdERJMkJHMzZ5bFVxa1I5S1hqbGFKaHA1aUxqVHJMeGpCMTNBYThSemRUVWVGMmVWcXlON1ZyZWc4MzBpdU5UMS9hMUo1ZDVZL0VNa3lselJCSy9ac1B3MzVTZ2hFNkpTZ3I1bnFaODVVeUdPdzVvNlZCYjBENUtjaFpsOGJJWFlyL2FCRjg1bFpKaC92TDhEN3hXUGcvRUJ1MTFKZXdyRldFQ29aRzM5VlpMbEx3N1BlSG5qNEZ2K1ZScXBjKy9qcHRGOGVZb0FINzYvWHVTdGRZY1pQaEFPWDFWbEZwRVNhZXdRek9qWkpabVVNc3NwZ1Arb1hGRVNadUl3c0piTmRhVDdCTWNqWWpqYkludnlQSmllYW5DeTJBU0poaHlRcjJZZjlZaE5zWkk4WE1yZGJWTHVzUmY0QXI5WElOcGZ4dTZoeDNIeVNRYTFjSU81aWJSVk0zanNTbVJiV1pHcXlvTGNiaFJOaWxLSUE5NVVUM0ZPeTJvaWtQaEpUZ2ZZdHNoeUI5c1dsSW1nOTVlSTk5WmFxb0hvR2wxeU9aaVcxZ3N3cW42blF5ZUZmcUNMWVFSVUJBQWV2REVydnZncTRucWZmY3ZIeTFYaGpwRGxWQk13WmdKa01LQlBwejR6SWNOemV4ZlI2YzYzZisyeEIrRlIxNEZBekFBVlowREV1b0J4STY5REl5cG16YkxPRDBCUHJnRkw2MlNIWjhFQVd2eDFDR2YyQkE4MTZuY1N5ei9HdkRpZzcyVmxZU3R5UVJNUWlySlR3dXdNMklEL2lqbC85bDU2OS9FRytmNmhnUXFTMVJFb1YyNzZzYlhmUUZ5Zno2dXhkL0p3VzRpSDloY2FyZDFiK0tOajdQWEY0SmZ6MWZ1NFNCbm8yQi9EVE1YTjIzQzJvdXptaHBTcmEwRmdvS1NIZDVwcWtaaGxKd21HMFpTY211QS92Q243cmtRM1Jwc1U3Ukl6aTRmU3ZSZlpvcmhkWHZ1UERVclNvRW9JT3YrRVpmczllSzAxeGpBZ0VUU1dXaDNERVREYnR5eGljYU02WXdlMEtMZXcrZDRXNFMxOU9RWld1Qkk2V2Z6US80RDd2S0dYdVVEMGZzMHNPayt6Y3ZUa1ByaUpsOWpjeUVKN1pJbVZobmJVaG1Ocy92WG9ITUNyNmUxU0lFblNaTFRaZE1aekgyc25iMmpRZDFXd202aWR2aXJaejFhYW9ZdHRFWVdRaG9EUFl1Y1JDUjdsZ2owajl1MUMwWDM2ZFpyVmo5ZDRxbDdaQ3NvUTVZUmprRG9PbGY2WjJCRkk4cnd1eHdOMk5hcE5MN0VPM3lNTk9ET3BMaWV2bGI0RFdDTCs1dDRJNEprbEc3eURyRzQ2aHNsRDhrSmZkOXJhRS91WUxmazFSeUc0UFh5cGEvdVFQWHVPRC9GWGtFWjA4RmFpS2xTL2VaSnVxMytVdEtKM054WmdBZGluNEFFQ3FaaDV3M3hNZUU2ZHlWeTEzOGw2aE1JSkZmU1NIVzZJbW5IZVY2Yno4OWdoSWg4ckxIb2xvYXJBeHdKaEtpaFJ6TkZnRWw5MzBabnRnZEg4SlRPM3RPZ2lYeFZkOXQ2eHdqMGtKMzR1QU5td2p2RGVjZWhrOFRHR1hxSXVPdDVhWXp0Ync3Q0drMlhKa3VnK3I1eVNtTzYycG5JY0lOWWRYV1ZJRW5oN3p0ckoxbGJybnVUYSsyVlBxWnorVjJLaVNBY2dxRFAyV1ZwVDBJMlo0QXZWNGsySVJMMnVvSHVleCtyc1NKQzFaQ3dIcmRSQUF1b09uSGM0N1paYnNQUHdHWXFZZG82MkVSWEt4aFEvRTZIYmdlMlpUMENBdWV2MHpjclR0b3F3TEFnekZ3Y25NMkEvUk5weEpORmQ3RWQyMUp4RW15azQwOWExOEErOWRBTS84SUhXVU9oa25qdENrOC9wZ0VYVDNWNUc5ZWhaMnd3ajlLcGxzM1o4MFZLNHFjdEkwY0ZWUDVxNkcrVDBsa0Q4VjRVTkd3WWxtenA2M0pEdUxoMWRaY2Q4WVFMWDdvMXl5ZjhtdzBabEdPbnJ6UFRpdUVvMWo0THpGTFQ5a1BnV0JXOUg3a0xtZkZDb1kvZmxXeU93K3p3VzZEaWtZbk9nQi9Pc2ZmMXY0Tm9vN1QxYzhFcTFxZWJEMW9BbTVidE90UTlsWDJERE9jY2lZNHd2YTdXWTN3UTMvWjFydzBSZVl3WExBNFV5YXlrUHQvMzZ4WVRBUk9Vak5wc2IraTZpdll3OGw5cm5IeUdFdlQ4dG9jb0h0QmgwTUdhWnRTNC9KSWdIUmloY1liU2ZDaHdSemZGd1R2RkFSbWl4YTFMRkxva3JrTldiMCs3Yk1ZNzk3NGVFMEhEMGgrd2NSSnJlWGMwdzYyMTJiUW9Zamc0Q1lyQjFnQk5KbXpKanFuQkZINDVBSTIzMzU3TlU4OFRqMVZXWnFpdE50VHBTMCtZNEttZkxoV0Nqb3VGQWdzcG1FZ2ZnMENoK2pScUpHN3FscHBiQXRTSGpVaXlmMmN2Y2RrYWNLQnVlK00xNndZVi9uSnRzcGlubjVRZFFPdzkyZWpjdGJzN1ZWcTM3ckdkYkhkTWxyQVVSRlFtanpTSEFoMDlZYXltWGE4amQxSElYTG03bnVaT0p0KyttSVl4dmw0blVHbDZMRzdua2JZbzRWUGwwOUJicFFtN3piTUdybVVoTUV6NE5pT29jQ0JNWC9sa3FOQkhvcGx6SlNETFNSZVQ2dHJDUkpxV3R3Zy9oTDArcXB5bCs2OTE1MW0zY1BiNWR1bTkxMms4Q25JMUV3WHdqQXFwL283NHJRTDhWVm5uNmN3YWtqcTVuN3dkelZRRThOZVp2ditOTXRBSVRSR0YxR3BRb0l4UCtvalp3aXB4WXJCQmFQR0pRVnlzUy9BRmF2ZUYyaGxUdERpVUV6Y3RxcXdjWE9TcUgrUEYyaGFUQ3JEM1A2OFB1bitrMVVWL25CN01YN29VT0tINSs1UXBicnFXZStBZThOWGZNQVlyck1SM3F1THNVYklBV3dOT1JEdmFkRW9hVWlieUNYc2tDUnAvZnlEOXJDRnNlOWsxOEVaZHNqdzNza1VTODl1WFA2aVMzTkY0T3hWNE0wekhTUDBPK2tLSHV4cXlzUDlmMXZFb0tMSExndUlRRWowZmtDYlBVYlE2QWR0NnNGL3JRd056dGkzdm5qY0tIelloQVdCM2ZrZDZsR3ZJaU5zWlAwRmpzK2crVCtQaGx6MnVJMkNkcVZmT3RFbENTM0k3bzRiWlpMMFg1bTJSMVh6S2U4VlpOODh2dFJPcWhrQWdEWmFmRWJwTDdLTmJEbTd6b0NaMHc0Vy8zYzUrODBnRXNTUDdXT0lMd0c5Q1hxQ2xEQXlBU281ZDFlT0grcXJBa1lyQ1pwRlBpTlN1UjBlS2daeDByN1Z3Mms3SG1LOW4yRHA3NWdydUFWK3VlSzlNcHo0ZGM2RFFTRUJaQy9lNkdzS2ZjV0NVczlOVE50RkcxWlZBUkVYRXhoRTdzNGFTbWJZZW1kYzVaV1ArcU9rNFdRKyt0ZVhCcDljTnE3TllkOGVjR1hJN0V6NUxCNmlTUzBuZnZDNFdzV2d2RWhmMnU5RTRXWjByd3FCTEVjNEwvbWhSaDREcEF6OGovTmJzYVlaYkVzQ2NyaTMwdU9SRWU4bTUraWhseDlmZXAwVTl6MU1FZFJHaFFKMUcwendGNlhCMy9lRFExN1Bnb3FDcnFCSjNsczhLM2p3VTdsSnB4VmsrZnFKVVAxY3JLNSthMkxEQ244dUpjc3M3YytKNWM4Wmo5VWlUL0Z3RG1YcC93RWtoN1JaRTVsREtZQWh0L0ZKMWh1QXZJUXR3Y3lIKzRINVlNQzhvYkxheDY1VExUYnNiMGJjRzc4bUljbkxDOEJKZjZ4YVRwOFVmeVNXQ01pdkhNNTB2TFVvaTZOako4elE0MW1ORnA2RWN2ZUorcnJFMU83eDI3QVEzV1hZNTBqdkEwcmc1OUpaRjgvUGhDR2xFbG5mYUl3SnlvTHFUWFQzSWhyVHo0SW1hZ09CejRxeElZaDRvWVdDdHR6RE90SXZNRkxZdW0vTHNUR0Fhc1Q4V3FEVXFSWkkvVFNYSG5hbmNnMHJOS0UvV2QrL0JMVFdpOXd4djFMZzVlUUxueGNMT1hIcklOWVc4eWtLZDZVdi9SZUZoQkFkdHVyVzlwV1ZqVFFHb1BGNDNEcWdyMWxjanJjMWFNRWt2YzU4VGZjdVk4UDZzc1BzbUNrZG11WFNJUzA3V1B2dXRQVUE2L1ZaTDN1NGUrRW1tc09ucmN5UlUxTUtkSlRXTnI3RG5GQmZJaVJWS2VZTk9Db2RtRXI5b3dtRmRRK1psNU1uU2JSOVNMeFpPUUg5VmQvUHJhSEJMaDRNUDFaK05kckN0ZTlHWHNQOHBEWWgyT0FNWUwzcUpTaGtCS1Z5dU02WUptay9mMyt6MmtVOHhWM295Q2tEU1JmMk9zZmkrQ1ByeFpQV3ZIaVFkREJRNEVTUWs0c3M1WHFBQzVtZ0xacjZaNWVWbGtXaHVjVVgrNVNzQzFYL0FVMGliTStGUGQ1RlM5VGV3N3lHZE4yVldCS2xUcmlhSXdJWHJ2ellkVWpmbjJiUGROOTk0K0tZNWl3dFRpKzNiV01ERVEvZXZZQzBUazljTm1neHNMZ1VSRGJOWkx3OEVpMVBBa21GSGIzMTJqZXkwSXBMTTc1dElTNU5MQ1VSZ2xUcnRvZWRSSDQ0b24vWHlpMExiU0dUTU5ybXRRTE1FRmRSdDVMbEt2bGZiTGUrOElac21QS1NHQmFNODhGcUIwdWliNy9WOTNjYXNOeHdZR1IxR2lQNEh0b1YxUkRGbmhYOVlJVEpNSVRXbC9CZ1doeXpIUHlZeEp6UjNmT2wyRXB5Umg4blFDZkVPWVNRTS9pRjZzblptTHprVmlPZUtRa25OQVRPODl3T0NrNjBCQWJjYnY2VmVPVVNaWGxJbzBGM1hlc2FPcFZPV1lBVmNpL0JuTWd1ZGNjOEl2cU10QlFadHovQlN4R1ROc1hNVDJlMHFYdTQ3VExBdzNOVXZYM2QzS05ucGRYR25WSWVOZXk3ZERFU2lWb1NvcUZlam1BdjR3NTcrSEJaZnlLQlgwK1o1WE4rTWthNi9FN3YrYTlzNmxPUUVHelo5TFRydzFrOXc3RWlqc3dZMWFYcGtDcU00Y1FaclFicVBtNWNXQTdKZDVESkZocDZERmd6b0JaN0hnN2E3VkVleGxxZHNqYk9VL0t4dGR4dnlHUWlPSFliQ1hmaWxiY1U4M1JncG5UVHJKRll0cnMrV1hnOXBEVjVjempGNFhRMGdPNktVUDlzaHFPL0ZoOUtKdmJYcWFZSDNWZ1pYVjlrSXY4NGZaVXpLTEhUMUVmZ3NRM2tRTnl1NW1hREgwUEJYdURmSndYR0N5SnhtVi9ZMUZFWUtub2psbi93WVRnZzBWM0NUWWZ4cnVBSW1kV3l5NkdIR1NGek93ak1xK2RVTXBLRThTSHp2cS9ocG9nK0xPc3dLblEvcVRoSlVxcWxkemhUcEttTm1nRTZLRjNJaXFJbWt4UlRLSTNCbE83cTlrRE1nd05KZ09VTHV0RlprdVNmTjR1OUQrZ2l1WURieklUWmZIV2VXK09rRkJnNUltdzliMW5rSWU4M2l4MmxKbU1mUWsxVFNWUjJzSWRNYnpUWjZ1ZHJSaGhDZHdFbXBVb1FWQXROa3RkTk42RFduVmRIZ0dzUUR2ZE9ULzIrRERzSXFhSHVBUGc1aDFJRkhLRlFpNG9OZzJBNU9XaTh6K2xiak05U2kvUzNLTi95RzJ3L1Y3cGRsdjYxeG5GWGVZUlVXVWdvbkJCMUVYV3JwQytYZldVTzc2dllxTE9Jdm9nQ0lWQzA5elNZVHF0V3dGQk1XemVCT29hUjM2K1JSbUY3bVN6OEh6ekhLdThTWTN6b080SDdyZSt1Y3Y2QWNlQitlalpYbFQ4ZE44SXJaYlJ4ZHU0OXhuRmtQUkZZRHpTU1FsUGkxc0o1b1djSndQZ2xzQkdiWklBeXYxK01wUEFtbDQ5R0hydjhGMDI1NjFoRHFySDVGaVIwTnhmWTMyMWlMUmJ4bHdVVW5pcjU1RzdpTkNqaDRTa1VRd05LanQ0VktFUzRwMWZTK0lITFhiMktZaFlETWxpb3B1SXhxb1dlRFRmQ0lmS2lIRFIrOXB2Q01mSzErblNzb1VKK3RPQjg1K2RXVk5GUVJUMHovdVNablR6UXlMeVA2VllnbC92dHJjeXVXYndBdEtTeFovcXJOZmRRVXZGWjIwQStveWNhUGFOTGtYR3lOVDNjMSs1MVFwZVRlalYrYXV6ZVpwNk5XRzZDaFA4Z2NNb0FxTkJ3QnlzNXoxL0JJZytNYXd0bUVTK05qQVJnUHZtTWtCd1JSTndMaDUycGQ1MFZjWTdIWGdYWGQ3WjY1UE9ESmNyajJMMCtKUDhhbHhSNjNuU2tnQUdnZHpjSFVvbHFBT09rR29WNDkvZis2OW83L3FnQVRZM0x4L3hvZkY0eGR4dUtmVWlqWSt3elM4d204bndQWW1oNUhFdTQzeG80dE43aEk0NHRvZnQ0NjQ3L2MvYkYxSVVnUUdLVUZpYTcxdndEVk5XT1YyVW1pM0FzMVpYeTFMeWFpS0cvNE1MamI3YXRmRGwvTElzM3dSd0l3Z2RheGxjWVBPZTFEd0VMZitpQTZKNGowWW12OVRzVDhrZGZGOHQvTGJ5ZUtwaDRuQTlBSzBkYnBVTkc3bnJZYTFBYzhsVEY3MDBWNVJhcjdlaC82dnBCRVM5djA2clIydlJPUHRZSkdxWUdRYkxWLzNBd2U4VUNETHhDVkNBazNiU29KbDVXMjRaOHBXV01ubDhVbG1GbnpXV3VOSHEzVUhnQkd5emR1L01NLzJrTHNHVHpQUXJ5TTB0UXZiTEd5d2ZyUGtLdFlSd004NTNFdisvNGNseTN1dXdtZXJkeVhTREtqeit6RzdHdnhmays0MmwyOVFaazNBZDRHSndlejBKaHk2dU94c0FFbDlXc2JXdE9ZdGgwUFZEWUNCS0orbXJoTTJNZWhHNTE4MFpvNlNjTmJsUEdjZWJiYTExNjQ2K1REcS91RU1rWE9JZTNFNVlDRzVON1lpTmJ4WGQ3MzljUS9vQzFlQzQvcURwNTVmSWp5aU1EdEpDdWJIMVA4SlYwV21TVkluOFYwRFdPY2pkYldycUxJNWFEWTFqYk1xaFpQNy9lMldJcGxubjdqNEJQcnJTZXdSMkxoa3gwMjBmNG1Zd1VneC9DYkxnVjY2RmN3eWpzRHlrdWEvbHVNZXNSWVl6dlAwN2lUc3hCSkp2d1VVQS9ZVmdRZFhxcHcvQ3RCZnU0Q3Y5ZmVmZVQvTHpCcFJ5UGZ1M011alpoUnMrSjFWZzBTc21sWmpZOGZZSEh5MzJ0YVlwMUdLMFpaWDdBeldpQm9TVXg0TjlRa1BPbEhrTjFOV3p2d2luQmdrMmdvUEN2MVZLNU41cDA1QnQxYUFFZzFPRGtJQitwakxXaURlQnMvMDU5NGI5ZE9aK3JnZzUvR3ZBNjJiMCtSOGN1UzhTQnZSeWlOa0Zqb2VsZjRGam1ORnUyYWZoVnBnWkEyQ2ZNek5LT29wck5TZVhxRkNjQjQwb28rQkpvZGFnU0p6Ym1Jb0dkMnNvdTY2ODlqSlRiWEY3MXIzUUI0SUZqSkxiMjN0N3AwWkY2S0xxSnh0VEdNRFRwY280UjZ5QmZ3TU96ZTJ0NGszdWI4TTRJS01PakVYdDdJZGxieDBNYjVxREFib2o0bVpMKzhjVHh4YTl4RjF1V3hidjNjUFBwSk5YR3UxTDY5VnNBdzY0WFZ3OWRiYnhFeXYwa1hUTTBXUFVoMmwrd3lJNVFIY1MyckgrajZYVnBDdmgrbVdCdWtTTTRMbEljWC80SUk1SHJWTnRHczgySHlDUjdOQUloOGpZUWwyMHJFNXN5OWMxQ0ZTbzNkdytaQmJsc0QrSGxmNXdNdTFCYXFWeDMxb2NySnR3OFlMNzJIbXFNYUR0WHg2NndoQm03Ymp3WjRESjVTcXh5S0Yza3BOVEM2aVpNWFVCUWtvRStKcFBnRXpYYkpjWjkzWVhaTlUxTlBQOUJoVzFMdkFzYkpYVTdDbXRHNVZ4L3B2c3BESzNucnZ5OWhSZ2RkYy9CQnRVazJBRlpHV1RzTkhMR0Y4SWpDYTVtRlNXa1F0SnJ2ZEpaSHVuSVFjdXc0Umt6dVF0bFVtRmZtc0J1QXI2aElwVDVaSm93dHJjajIvdmIvdG1hbHRJSkg3NXc2aDBvRUlWeG83RUJWRHcrLzFMdWtHbGkzcldESndKeDlVZk9mRENXMkdaWFEvWVlqNjBwRmpqRkNzSkRXSnRhc2ZzQWR5WnhMVm1VUmhSYTRGNXJseTJoWlVrNkdQUDZOai9JM2FrRGhSS0FBMUlxK1pjcHpuM3F5a1RrL3Z3Qlo4b3FpUUt1eXpoY1B2QXl6eitIckxlZDR2UnRUVE9zODNtVUwydzh2L3A0VjhTOWJVVkRYU0RmdS80eDhYNitDYU5WSXkzdXVGdmtRL3BEMWZGSmlvWERPay94b0pvTlhJWkVONGlFSFJ2OWFQY2dNWk9UN1pueTQvSXlhaUxJZTRoWG1iYytVbll2bHFmNGpBd2M2cXFOOHMxU2dMVDNyQmxKYkw3dmxiOGZvQXRFbSs4UkVlVHNIYXFyZmtDb1ZVWWN0RHhoUGxMYmZwK2VNNVpibmdWMHJwbCs5a3pacmJnK0REWmo4ckFrNnJKbUN5UHBxYXNVTDJGbzZVWUJBZWFBaE5IVytiVG5oWEkxS2x2SUpHRWpBOVZzTXNWbXEvWDlxTTJTdjJmUGUwRWEwUDhBaDdtd0VtNXBlbU5ER1hLU0Q5anJkY1A0ZlZpV1AzV1QySHFQM3ozZUVQWDF4R2grUVFWSWZTd0RoU2pnanBJcjIxbkZtcWVNaFF2azhNdWJWN0Fuam1SSWlNTVZwbEovMnk1SWtGblVPclphL0I0UzhpL0Y5Z05IWVNFMmVDL0dmazUwSGl1TWZOZ0tTdlpKS0Q5QTd3SHFOV3dtWStiVE5sdXk2MVNMSGRVS0JqejJ4V1Vqd1IvYnZXNFUvVGI1UzMwNW4wQXhSY1J0LzFnWmdzcVZobzZ3U1oyZ21aK01COHIzcm8xNGZRUEFqUlZzbVNPTUNUbEZucTVmclBrbGZFQzR0WFNWcm5pYnpRUHRPVnBTcjh1T1c0TXdTY0hEdTJCNE5yRDcyaEh2cnVpZFFIZlA0SkFNOGcwY1dHcURNekZXSlpuc3A3QlFmQmIrTmcwQ2dheGUvV3BiM0UvSGFCNWQzMGprUnNkeU9ySEdwWWFtVmN4SnFoTjBsbllRcG1udXFxcFZQWGpNc2VodktHZUpJQ04vNHllUStYY1JKYUx0R3h3Z3FueENqQlRRcUt1Z05VSytVckVqcUJZSUFuSzcva3ByeVBtekhxNUxSampzZ2ZadGhCK0MyV2xGVDhQdnJVa2p3ajFrVUVYK2VnTVdnVmo4bnk4Z0pyR09KV3ZyUkVHbzhkQlAvemFjVkt6bmNhQ3NZdjgzZldiR2pBT3FEVEUzQ3ZpM0JLak4vYlRXK0FxRWorbDJMSWpYMDRLMXc4UjRuU2xXMEx3RHVJYjlmaW9id1BEZEpGdSt2MTVzRHFSdEcwRmN5b1hqQ3Y0L3pYRE5aeVl1WVpsQjJEQkZZS3lCcW9mUjNQem83WjlQUU9NT2ZHbjA1aElNcHF2Q3J0OWpObXJIWHhBQlIwQTFZamdWNkRoUy9PbkJvMGZrREh1ZUxlR2pPUnNyUW5jK2tJZG1JYmd6ampIRjlsYmt5VWpxNHNpVWFyWUNuWU52dkdMYkRmRk1ZeUlPcUJNYmN1eEJvSStUc2RiNlJqa0hvRDVzWkovRXdKckViRWs1WnkrbDR0Z3BGalFjS0VqS0V3U0ovb01jejNDbEtMZGtDWjZnZGlLRWQ0cjN4QVBLVjNLZnROY1BjQkI0Z0F3a2F6cnFXdkVoZ0FGcGpNNVlHU05CV0dXUUQxVndIQ1RYVkJiYjcwcm42a1V5aEpENEtmNklQZm9RN1EyTk9jNW16dU53VGdDb01xWkp4OVBNOUVHcGdTUEY5MFBEWDZSOFl4NWUyRFVCb0xPakNXNU40cmpMOC90a2ZwM0ZWQ0JCQnlhdWdzQTNseFdhMHV2WmsySWJVWWIvTUVGdGFEbElZMTdvZTdOWlBweUJjV25aL3hwWCs2VFBub0hPRXdHcmdSVGVHc0N1S3MvZVdpVm1zRkZSd2x0WHU4SXhHcmVubTRxRmtLaEJqYlFrY254MlBUZDArQkF6VjZzS01kRWRCN0lDcVBLeU5iaS94M3ozazduT0dHc29xb01oaUcwMkFBemU1bzVSb0Y4UWZVamFaRk96ZEYwWklzUUE0c01IdkVoUmlWckE0N2gyY0o1V1pucGJtSDA2TGxzT1kvRmcrVU1ES0ZtTURDQ3BSTkk4d3RkajczNWtFUzBBbkRDVll5ZmRNeURQRTBVSWlxeHZzL25kdkt6ZFBza2tOd2k2WE1laGs2MWVsKy9ZRlM4TENaTWR0WkNUSlQvNWFkWTR6eE9PZ1phWE44Q0xNdkhuWVdoYW9vNThEYnl1TCtQU0ZBTUw1Nm5NbTl0Nmg0UUNYTjFsTXRyVkxheng3b3dyaWkySmVKUVI5UDdHaWlORnNDVGsrdTg1RU80N0dPd2xzMmNoQmRRaXVzekNoTmtjZXJ6RW1pUEhnQUM2OUkyNFhRcGdseGJ2dFhCZW45VHpVVWI3THc2b1BwWUx1bTJYcGtOWlczYStpUDFEUEVER3pSRFRyVndLaW5uV3FwYkpsdjJZMWZ4ZFV5WGcrZmVEeEt4Vm9JSXprNUFtL2h3ZnlUTlVybEVCUGNncWNCNzdXUkwrNlN0VVdqM20rRmt5VmxnUFo5QkZIRTBBNEd0cmtlVUlsM0t6VnJhQXdwVmxHb0psMlUvT0RqNVJIZUNKUnhzZmtjcm15UDZFY3BLQjVneDB1SWNRQU56NXF0cXB6ek9jVHRiUGE4SjJjTnRKVnFIbmFYbWZtMTE2WEc1aHpjalUxZGw0eVBVTVRickIvcDJZNXpHODVPRDB1cEFLckFrcitVanJ5Z1Y3WXVRUUQ0bUxTb1NXZVdFaGxodk5pcDI3ZURvSTVITW92eWtqL1hXeHVxV2E4U1F5RlJkYkJkeis4T2hidjNEMXk3Ty9SYkJRcEU4YXlRMFJnS040aUpYVFVmdFk1YUppaFN1N1VtTk1vVkxmemhFOFBzRDZlK3BmUWd6TGM5TnIwNGFhUXlmYitheHNhMWY2LzBXUzN3eWt0UVZHM1lpRGUwam9uYjBETU4zVnNYZEZjQ29GaGlsNVAyZEJ5eHZJL0ZBL3IzS3I2OVhwTmhvT2JIWWk0OTdqWFJvWVN1ZEJZTzBWUDhyQjRIb2tiS0NHR0hxOVQ5Zkk0VDdiNTU0emtkTFVUZjhsb21ubUNzUXlYT3F4Q3pVQ0JOT3VDb0lBNE1PRnMwZ2VlK0dhV09sQmNzUWwrcCtZN2x4NGtQa2kxUVB6NjVVMTFBTlhvR2Rsa2l3SGgwUEhHUEhQZXhSRWhlNlp2TzRQTkJGQkFqZW5HL3NBcFhKbVhYSmIyNHZoWkd1V2QyRTdVU0IwODk1Yk4yZlNsVzQxSkdNYTEvS2lWMGpNUmVuK0xhRnNrTElrNFhNczJibEc1ZXBQVkhobXVsWi9zVER4SUZuYjFlQUoyNTBmKy9zVWtiNndyWDh5MGxWOTAwV3Z6SEZJTlRqeGIwN3ZPZVppdlFmQWdUM2djZGJOaTA3ZFNDNjl0aW1TYWlMTm5GZWZacWZqUE9CdUVBWE5qU3pHaGtwaEV4UDMrVWtjbWE0eEx3UHFvVi9IMVZtUlR0eXl3SDZzNjkrVmtybllQYUtqMXNMQWhIbmhtb3duRnF4ZGZhLzV1MmxERkNEMno4WFgwdFY0NmhZeDBSMndBZUdrTVV6QVpLclRhaGloSkVsT2dSYVY4Rm4weEgyZWlGT3locGFSYUtMMDExVE9LNXZuaEFyY0txM2lZaVZLREwrai9lbmYxcEdma3U0N01hODhHUUF2Mk5KQlc3SytTWlAzNkYvLzJRQUJBQm9BUUFBQk9RQkFBQThCQnprQ0FBQUFBQUVZQWNCQUFBSUFDUUlCQVFvQ0FBTUFHVlJvYVhNZ2FYTWdiMllnUm1sdVoyVnlJQ2czS1E9PTwvQkRCPgogICAgPC9CSVI-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IExpdHRsZUZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw-CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk-CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU-CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT42ODwvU2NvcmU-CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8-CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBVWZwQUFFQkFRQUJSOWtINWd3Y0RCNFFBZ1FBQUFBQUFBRTdBRUFBRHdJQVFBSUFRQUlLQUFFQjlBSDBBZlFCOUFnRkhRRURBYmtBQVVkbkFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCdVFBQUFRTUFBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUVEQUFBQnVRQUFBQUFBQUFBQUFBQUJBd0FBQWJrQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBRkdid0FCLzVQZkczQVVONHo5RTlsc0hEbXZXMGJGemNhbmVoV3dQVUp6aDNSeExodVBBejJsckpVRnRZeHNmNnlmOHJtT2RSOWFsSTVieXY0aDFaYTlnSUNBOHBneWJJdlJsUTdjS0VGcTZkbDNVWndhdkxKZWdQRVE1VmdHeDJZQ1I0SlhhSE9vUXRVWDYrdUEvQWhBeUtMVEljblovMjZ3OC9oMjFYZHhQT3dNSmNWaGJYOTlEQlVyM1pBWnl2emZ4MVFBT2VlbmVUUE9BOFBURXFxZjFQbU9GMkpuRi91QW9WMEs4QnBUQUxhUmVQOGhJS0g2MWJvMElrWGxZeHZnenViUVV1NWtwSnhnMTgrVUVpb0laZGRBK21nQkh5U2c2T1VwanVPTkdKQ0c3M3hlcmdjUWt1STdNREorL2Q4NzZwSGpzb0RFNGp4SW9zT0cxKytaNDJ3NVdaeHhtZWQ1ZmgzUHoxT1dDRDdtU3JMWko3VzVpeTRLajVjVWdGUmw0bEVBend3QnV3S1NQWSszOGk3K2xjaU1hOU9jRFl3cHFlU3lkQ1VZZ0FQOFpaOFp0OHlBQXh1MncyYXlnWjgxeXFKRzRKaTk0TmxZWGp3ektRRktTaWxuK3FjOFB5ak5xS2o0SWFnQ2xPMGFWdU9MeEdCQTNPQlg2a3VCLzRmSUlrNmhNYzNXUmNlb1ZFNUpIMlZSYmJERzNCYTFkaVQreWNOYmZ5VkRaaE04RG43QUpmZmVzSk41WkVHL1BRRTVURTlkY29oRkw2RVBZZTVwYTlkeENWdTlVZFBxOWNPQjFSVTJRSEFJeGtibmcwOHR2em1MT1BQcFhGUFZycXVBZ2ZjM0JaaTk1VmgveVZPMUlKMlZPVkVWVGVabmhnZlI0NFBHNkxINWZyekdFVzFOcS9ZTFhRWEw5UEJqR2kvb2Z6Q1RCUUZLVGNsMjFXeUE4cnhib0g3N1ovRWFJR1hiZmVzR0VmUjJFTEtDVjZkRDlTbUFPZUFZd0FScnNwSGpneS9DWU1vUTZqWXZoaVNxQkVVb0dCci9HR1RhU3BLMmR3YUllb1FMUk8rRFJzZVpvSE9lNkdCMThmODRSSE5OR0tWQnpDck0wV2xwZzFWNTdkS2FaMkNqV0ttbGE4bVhDYlhOWUVnTkUwRmlQakZnTmM4UGg2UUkrbU1JVkRmSUI1YnA1ZTNqZDdNS0VNNFp4SGp0V2U0aThscEZVSklITVp4dzRUd3Bpd0RIc0tMZUloL1NiMkdCbVdqV2N6eVdFMVZtYnNxNEorWGpMcVNFR1JkTWd6NTBqUDhwMTF0T0NRWWpBeFRSTC81U0dXTG5TZ0piV2FVSHJYOWR6T1lWY1BOTGZTZ1UxUldJK2JpanZESmxNU21Dd0JCWTJWNVNvUXNLZVRkN1FGbnA1ak1sWjZ0OWU3U0ZYNDI0MFAxNEdiZ1pSNjJlaGVpclphaEVpQVdqay9jaUM4Q3Z6alVJYTZiNStuZmp2em0xQndiVFM5cFRlTTVVd25HamNhOXAyZ0pvUVJuQ1pRY0loWFN4b1o2aiszemdRZnIrZmVGdzZkYmRZUUZYV1EyZElDcCt4N3V4UlY5Mk9rOVRUcU5Rc2h1QXhHSWNNeEtVbXViTGEyODBqTXdkRGtkaStYTDN5QjVLUmZDQjB3YkZCRm9BUWlsMlV1cEVkY2k3YjlQSDhoNFZtc0VCRmNJeHV3bnREM2MrRDAvbWFhYmdkOThUQ05qUHVnbjQ2aVFSdEJjMTlrbnJsQ000VlB6bmw4NkEvUWg0dzlZS0VCanZYS3JQTkp5ODRwRDhOeWxob21jUGFDdGd4WTJPeFo3M3lDbGdMckgrSTk4MWRMTkkxSk5UM3pDbys4QnlYeU9OUmxROU5hRnpiMEV6MlBpUFNCMi9vN2FoQk1QdUxMWTUwS2dWdG5YR0xRN2RXUVI4ZG1MaE0rS2tEUVBLdE5tNGdOd2FPVHFWOTBXOEFJTzdabGlSaDF3bTVZK09WbDR2SDQ0M0ZaYmJyckNyWlEzVGdYWDdIUnVtTGdJbnE0QVVYcmtnTWdYd3h0QnZmMldHNXMzSHE3R1R5bUtobnNXSmlMRHk5NFBWYXZzYWo2QTFQd01xQmNYczJsZGVYOFRTM25XOHJrbDV4TXVvR3RXbmppeUtOQVB5K1RrUFhBT1pBUEM3ZS9yQUUwbFRDOHo1dlZIQU5lZWZFcitSRWd2OGpka1FHdWs0cncrREs2c1VNL2lRbDh1bmtubDUrbHIrQzdVeXV4NFJ2a2VwM1lFOHBJY2lVeE1vb3pzTFJzd01UUitMOE5zU0x0cHJBVzZ4T0ZlaDhyVVdneXFiaFQ1UE5QcUR6YTB3TVJuaGJRdHU0bTNqbHJPTnhOMmp5ZEY5VjQya2ExUXZjaFRPRDRUUXVxY2d4Uko0My8ybE1Td0xQbzFPZ1JkZEZXNndXajgyalBtVUFOMzBleDlDaThBUHNRY0RmMjBSQU1OVWNQaFI4VFpHMHdrMzNJMGgvd3l2Wko2ZXphU2JtOWtRWUFwYi9NbFdLeHVGT3hDTTJpUEtYMHVSdXpWeWc1TjZFcHJ2Z3laN2JCNjIxZDZqZk5YVGNvaU8yc28yZEVmMVQ2UHlBSURuNUhRQ1lUTGZyQkdOSTB6c1FoNXZ5aVl4SkxMWlQ3cHZUcGswOG5xdG5CY1M3eEt5aXpFdG9LSFYweHZETGl6eERtVWgxcGJhb29mOVBQWlhPMnRQemlodDZRTzhyV3dtUzBJTTgySFRDR2k2b0d1bDVWeXlMSGxSQ0IzRENWdXA5dGpiQkJjR1pJRGxjUXVjeVVTdHZtWTlTOWJOdG5KQk5UVnlmcW1ScG9yamVrZU5IbjdIVjk5MVdOMDBSVVVDQTZ2ZDgwL3hpYytKZUJXNDZKcHhuZkFFcks3amZ6Z0hmemlxOW96WC9GQkhIYzZ3TEo1WUJDKzFzSVFNUU15Ukt0T2M2M01SS1cwajRDdTVwSHN3cXdFdEg1V1BOVXhHaUtNT0R5ejFOVytRQzArcjN4Qy9QR0NSVW9YSzJ0dng1NTltbDlua2VLWDRjNTlRdmxwS3lOSUVzTlF2U0E1TW5ZU0pHUVU2NC91bE03WFRJdTZKRXF3b1p0N0N6UWR1a21pNzJKK3NzSHdVS1Jnd2d1eGlpcmRveTlmM1RBREhjRld6MnB6ejU1bnlNNzVsQ2NVcVU1dmk1RW1QOXRTVXBGZjgzYW5qM2tjTWREYzN0MTM5Wjdpdkc3U0dqbjVGZlpVencxUk9TbE9lR3ZRNncwbURaczcxcDFXRlZTaFFHUmxpSGgvTHd3bjIxOFhTeXM4a0NvUHlwcVpzNjlSUVNYUlRYSVQwa0dmd2tMazdyWEo1VDhWY25pRGxpVUh0YUZ4eUQ1RFU2c2xUd2VVdWs4NUc3aXR3MSthd1JvdCtqMldqc3ZZRDNRd2RXZHE4QmxKd0c5cVNxWGdKOG9CNm14WGpXS2dKS1dQdDBiMHNjZ3Rid2hud0ova09hWlF6SlV5YUVBaGVhYWVERzM3SGtpSHlqT3VBRWxPWlNXaHhmVWNMdUEvSCt3d3VPeHptcmo5djFGVzFYNXZqOElTZTUvSmlzWEw3aWdYelhIVjF4Rm9NTGVlMWFtYjJ5NHBQaGtuSUprZVQwSkhyNmVlZWFnMzJzdVRiSUVqR1RYRWc3eVJUZ05Xa1hsZWg3SkY2NVQ5RTNmd005TTZ5aDRiUExIRm1JVjRDa1BMU3hIWG9NbXVzeVlGTnMxemxzQ09ERHMxMWtjMnVjbkxSL3hBSGorc1dFVEFLVi9kZ25PdDFqZVhNWERoLzdab2RPeVNDTXBXVnBhM2dZbDc0clMxelBIQ3laTWtMa0FkTXhJQ252R3k1ZmxBcFV5MmVWc3lJYjgvdnEydTd1RnU3dy9KbDdyd21LbERLTlN0YmdDdmlFamFMeFZJR2JOdmhwMGJtSGlTS08xWGJ3eDVodEdmdSt0Tmg0NkZITXR4b1gxOTVLbHIxd3ExUEYxdHFTS2ppVS8ydm1kZEpzd3pST2s4YlpwN3R2bVBiYVBIZTR5ejVnZ2hURWY3WXp5eWZxcHptbDBkZnlxS3RXSHYzOFMraUtNRkladHNNWG1RdkJEaXVJYjFXdS9YRjBUd3JNemVZSmR1NDR5TnBpdGh4NXRMV0lZSDM2ajIzcVRkQmo3ajJtQ2N3TVZsS1B6L2FTanVmMmd6T0ZUeE01YU1odm01ckNzbENPdFNicU9ndlc5cERZZExreXNSZEdLNWplZDYveEFuWnRKd0R4T3Z3ZVZ2bVhWTFZYQSsrUGZnWVZnUEVDdzJWaGNTTGptNnBnSWI1OTRYTTZFYUpXbmJoSFFBd3pCMlFYbTRzbkI5S0hKa3VmRUhOM3RqTFZwOWEwSGpVa3RQZ0l2bE9xYXI2OGNRWDBZK01IN1R6VU9WcTRuelo0cFp3bmg1TlZKU3U1VE9pZWhZS0l6eG1MTk50TnNYMWhOUkMzUndTVndpSzhxek0zaGxRNkk4TC9CNFpsM2tjbVJ5Qm45NVRINkY5aUpsTkIzS1cxclNCRlJDT0owaDZHcjhKYjlTejkxckRSTThjNFRGYlF5M0psSHM2U094OTI4c1JLM2ptRFZzMXRvSDR3L1BOciszRGJ0bzZKK2ZwQzI5UC9ienlEWlh4d2Npem9zMmNyaTRkRzB2aG1uTWV0djNCOERDZmZ5RHkxbHFuUURVZlpxanNUTkZxcDJHRFZmT1VEbXhRajBVUFJZRkxmekZ1TmEyZWZiRHorcGFvVW9nNzdydCs1WUh0ekE1d2tQR0VaTks0dTI1TEZnM0lWTWNpRm1PSlowd3ZjVE8yTUtLS1d0dGdmNDNtTzVaeDBXVnRaM0VyTC9WQzdRMHJGdy9rbGNSNnl4QVZWbHNkR01OOUxsT2hEQ2FERCtmcnVycTZ5eVNqN1BhcVZ3ZGdsbnp5RUZZUEZsR0I0bjRkTVgyZUgyWi9SUVdVWW9vTmxucUVGNHRpL080dzRIdHRWeXBXVEVEVmdSaVM1SDl0Y1ZkcDMyOXlpYVdkM2JCRXkvdTR6WEd1czBmaG5PTXZSSTJtVGx0TDJlM1daUXBNbzZSeGJsTVBiSEZZNFZoS2xvLytSMGhHUzJsU2txeFNSSUtsaTBVbkUvMG53WmdManlTc0NDK0ZUYWkwY25FNDExY25aK01HVVpuYlQ2REwvTlA1Q2JKbm5BRWlTYjFDbzl0RGg3MnZ2YXIvYXlFb2tMWFQ3Q09kUFVnZHVFY2hWRk1JTUxSblhzaVgyV3gyaExVWmdPVWQ4bWY2SGhPakZOeXJ3dUZEQ3JJNC9WOXYyNGJBRlpobUxpSlRuNURpMVhoRmkyemt0RnM3cXR4ZTJNbjN1MjRlVmlBc3M2S0djc1dka3hsd2Vkb2pWcFhlTjN4anV0WnBpSTAzdmFzTStVSzJvUUxNa3RKNFBKZ2VPc2FxT2xhOVBTakhjWkpuRkNOVWpFb3JlZFMwNTVHT3R1bm9EUU42bVhuV1ppcHp0NXBKb243bTU1eWVTekxuOVoyQTl6UnR6UERENUdMaGZnZVMvR2Y0Z0NldHI3OXdQY3FlWVlNRlJURkJiVDA3WUNFRDl6L3VTWjR5dG4raUpjY2ZBWXJJQVB1anpYS0RUTmxYSFlzUUZMS09scTlDS0oyZlFrMXhVcjQ3ZXFseEhlSEFFU3RueXUxOW5ybVVTZDhpQTYyU1BZVE53dXBKUCtjVzJPczYreWRLMVlxeUJ2VkRUR1E0SklidGNUM2JIZVB1VmtYai9Dc0xVVXgrMzFUTzNxaWs3d2F5K2hwbkRPZmVqUFM2RGE0cUI2OHJrNzM3NWRrcjUrbklwdE9LVHhVc2svMG83ZlNrMzlaTklBRVJnMTVWbkxoN1NhMGtLcEZ4TGx2WEtaVTFvWDZTd29mTmxnK1A4SEJDQ09nYU1DWDFQbjBKblYwLzZtWlpzZ1prazc5a0JVamdVUG40bnQ5MzdKbFRkeEVYc0dNUnk5VlBFdjFFUHJ5QWRSYnJEbmY5MUg1OE1ZQWtKSUpTNjBibEJDb2FxTThQRWNtTjVMQ1hWK3pGWDVVcFJxdzdianFEWG9YT0hqNUc5WTFyRDRIUWl3Mlg5ckNkK2wwbzBvTzhtOGU1b2xqQ1d1WTM5TlArWXMrTExlejhTV0xJdFhsYzArTk5rNngyME5jZzk4VWxFM00rQ3RQQXk1OUV6bk1YWkNnOHpWKzRlWno1Q3hwaWlVMVJRRnN0OG1ialpscnJEbExjWTNxVjlKa3lWenZNV1N6eGZ5SFNmTEVhS2pzRmM3a0dORWppWk9Lcy96MVV4Y0hQN3Rodm0vZUQwT040UlB2QnpnNGhRR05VT3huYUZjRjUvSkVLUXJiNUxFcFpGaHZnNlBxRXRMUTFCOGc5eHNDc1d3UWc5d1ROYWFBbXBKZnM3RGFpajIrSjNKSi80TVJWNlR5UFlVUjVYT0dPeFV3UHhiUHJnb254QmZBMDlWd200ZHh1Qkk1OHVhNk5OUkxkNmxabThSSnY4ekpRZkZCdExGZ3ZmaXg0MzVIUE1XdmYzU016VnNyeEMyNW5hVjEyc0hxNmx5UVpBNTlTd255SDB3RGtQWXdOM3dLM2lDQmVSVzhSYjFDNTJQb1ZObElROStGWmI5Z0RLVmx6aFN1RkU3NU9DRVV5VmRPTGg2bkE3S3QyTXlIQ2Z5UFU1Q2xHblFRMVBJQW00VHBTczBaR29YU0RlQkxtd1FrZitOeDcxNEJYY29rRUZXZ3ZoVTZEN05VSzdwR2FrT3pncTZyck80VFN0dVJUbDIydDJwQnUvMmxpUmMwRkNQODk0MDVRTWtMR1hYMjNEVzN6eVplak90bVJiVnh1Nmo0ZmZlZ0xhcVhINXFLT2xacUt4SXNCZm50RU5GRkwxazRuQjdjdU1taE1UUXNtMWpsZy9RdUZtby9YQW52RjV6dUlINkhURUpjUnlBNXBZN2pDREVhWHU1WU9zejE5Qm1hUVVpRDFmVm01eWdRWTA2dnQ3d0dQV2VDUyt1Rll4cnVJeTNJYXpNSURWY2NJdzk0V2t6eDlUS0IvbUtQc0xtaGxhend5NVhXMExjVU1FT20ydks0SXlCN2N6TUNQOGtVM1JVSEExbGtibFBGV2tpOXVkUWRaYnljVGZvMGFoZHFYQjUwYzdES01TZU9ZRWFOMXNrdlJScW1DT1dQemRmam9BUlF1UHZoVlhYVXFHVCs5dFNBT05QTlVXNE9MWW9Vd1hKdlJWanI2YXlLUEkvbU4yZ0hPNGlRRFdkLzlsSkhDRVRLLzhXd1g2ZzJIOS9PZnBDU2tJVWl1cndsTTlsNmFqOUZ1OTN5d0thVm1RM2Z0NUxJVjB1Z0hiZ1RwMWEwVU5iOTRtakNWUFl6UmRPcGhGbE1uakdJSmIzM0xMcGloTDhVQlgxbUx5OTZBbW96RzRSZVpsMlhrZUdXVStVbmxkVzhMRm8vWmptUjhQNzFucWVHK0xrQmcwd08wMllNdjh2K0NiOVhZWXh0U1NhRmNqKzYwYUpwN25xSGJ0dTliNmFlV3NoL3JCQzhpWllmdEhSMUVzb3JjK05KV2tsRlRwTUZJc2JGMm5iMkZoVDdOTFppTEhQOUVZZ0V5Vk1Eby94dkhzVkt2TkdhZU1Ec043OXdza0hkZTBlL2lzeUlPQjFiUTJMVG1XMHZnalFTMHpKN0czRWVjSWlYUkFRZTJzWWtpM0VjNGdrNit1OU9MdCtTTzM4WEphRzltNTFnMlNEMWNGakZKSUltWjQra01OTzRMc200QlN5QlJLSy9jK0Z6S29mb3dNeGNNQzc0aXdyaEdJSkRRbW16RWx6bXo3T3VvdEo2S3JUeWhFWk8reG9wRGFUZ1I2c1VkQVltN0ZscmZPRFlSZ0dtdkRDOWtNcE90N29SbzloamlxU05kUHFaa0NoQmRiOS82VmtGK2FvdFlEZ2I0b2ZHRW1WVTVMdnVXVkdYaHNDOXlPejBuRVBFQmtIYWZPNERwei80YkZsM2VSR1hzRmJaSXRyUks0NkRnUUkwb2ZOZm83ZjNCeG1hcEsxdmdsQSt2ZlhlV1FBL1VkRGJvcVR0U0hmTlkvTE9panU3RGRna3pSU1Qxc2dXdE5xelc2Sys3SUtLZkxwNzFFMUpYUDh6VWw4VHQxN2JYVmEvOGJLbU9xcTdYLzRFeXBaVm5CbVNSNm5tbkM3SzU5TVNma0ZIK3k1eUpJRzRTYjAxdnpmbjJKMU9mdWVud3F5VjVKK2JOcU1IWHlLWTRObU9MSFhOc0pqRHFzLzhxZXRwQXZpdk0xVCtMdms2VjV4Q0M0SVc2Zk93UnA1MC84QUwrT1F2R3ZJdHJQSEQ2SnZvZGVRNStjaTBHdHRTblAxTnRCYko2a2Rhb2RSZmZWVEE1UDgzZmgzQ3U2MkZuMDhLQkFmc1lpaTM5WDl4QitXdGsvTzNVZmtPcE5aTjRjdXhQbitmNlhOcnBYQVNDZDlRM2lwWWFwSHBzekNWVUhSaWtkTGQ1QWNNdHRyaXJiWEFubzMxbk5rK25ReHpJRld0MlFKbkExc3VSOWpreFo3eHV1TXlTZFEyNHEwV3ZXZFpHS2NZanhQRTcxd0NjcGt1VjVJTE50S2RWRWdXaVAreCszM1lKVVczQjFsc0VncFBEQXZjZklObzcrMVJOcGk5TjBXRG9nR0lLOTlFOUt0UmdDOE9ReWFXdDVBS2xBODJzVFByNXl1R25wV1FaQm81T3FVblhlbVJmSXNqQzFUSmx0ZkVxVTcvVXhaUnNYMU5EVWFNZDRaMDJNZHI5WXEzd3d6NzNWbzJlNWp2bmNnY09aa3NrQ3NLLzV4VWpBcmRSa2xXL09idXgxRVBpQXU5Wi95Y25paFVQWnN1SGU1WlJTYVZlNUNVZTlaVk5JTldiZ3VXRUNGeFlCcHFyMjhOdGhDQjFYMVROMDlUS1M2c2ExOHhSSkVFZXdjam1lQWl0SGlBdUZyZUEwak1jdHFtSUc4YzRrdlhNWlFJc2NUcWliUitpc2JVQ01SdGRFMmpDZiszZ01MdUFnV1ZVY1dVOFV3U0pDV2VFcGNzT2xRS2tNcDBrdzMxYkJOWHEwUE9RY2lEQ1VTWS9aakMvbklQRmcrcGw3REFYUk9lektxTVYvUWRLdzVWTjRPajJ4V2xRV2NtTHVLeUFEVUh1bHhSem01SVFZQzZuVnczRDIvR3djbFRJVjgrSlExSVBWQjJmTnphdExrREgvTzlRRGlQSmhBYXg3YzNibHhzcG5TdldUTWowUnByOTVsVzhValZzODEyc1FBLy9YcFpqUGVXZWRZSlRIcUZ1Z3FzT1l5WXJJY0dBaWs0VU0wNGtGQWttRWFMQ1ZFWHl4TzVxRldXN3pIRmYyeXhHa3RsM3lFOS9PV3ZGdU9RSnI4UlFqWE92bHN4ejVDTDJuOUFUWUpkZlFjejlLdjlNazR4dm9vNFJrUEtQV3dIeHVVb0pEK2JVamk1VGM3a0FwczIyQ1ZuWEtEamxQZ3dBV2swbXFLUmxsTEhkalp3QU1lTlpYOW8yZnAydTFlWCs0V053aTVyUXZQajR3cGF0aXRFOExBb1BMb09POEt1Y3pqMnlsb2dDMlVqS3ZmcGx5U2lGbnVsKzZmam1IRGhlVWpic2ZDL3lTam1CQkpVNVM5ME5vU0pZdzZUQ2ZBZUxXU1ZjZnhLeU9nMmVOUGI1RlJOVUp2UTR2MEgraTdmdEc4S0xZaG55akU4cWd5aGpqcmVCMnR3Wnc0aHB5ZTNIbVp5OHBzNUlrT00wV01qS2NpamdnNjZFMTgrWE9wdjd0U2crcDFsTi94RG9qYmtia0JPaVg4OGVMQjZFUjRoMWZkNXVlWElQQWFCWDRPNlEzQ3drM1BSMlBBU1F1d2p1ZGNaUkdaS2k0cDNnQ2F6dHNVZnpqLzdKREpFbGhWR0NRTlVZbm1aQXVDNnUxTEpqRmRGL0ljRmpxcXJRK2h1cFVwUW9FamQrczRKU3ByNE1sTnoyMTlad0gwVE0yN2RzN2xCcjVMejR4V3I1aXc3aGNReFJDMnNkZFRjZStCSC9ia2svTEtWRUNuSkhKcVlzc2FoRnJ2emM2L2FRNS92NG9YOG8ybmxuNCtpRG1tQXYrOXRDellIc1FwUkhaVTg3N1JFK0hzQU9RbGlLWnFDVHJyTENkRjArN3NhRVVlcE5ubTdFajRCM2lOQ1g4OWNOL1BUZGcwS3dPQzBjQWtndTFubU5jY0xhRUxJbFRtRzJFVW0xdmtjUDVubk1iVGlYdHM1eVhNWTFHRWJiaHJZR3VPYzBFM1dIeENMMFQ5NlVSM2MyZ0xNRG80Y3Y3Q2t1MW4xdFNPNEQ3dWV3aHhZTjZuUVRieFUzNXNqVjNKU0NqODgvck9ZMXRBYi9mNnRMR2NyS2hBRXBBeE5PVlZyYkNBQ3krakhXUG54OGNkVUgzd2trdFJOYkJNYzNJK3MvVG4rRFVSVkQyYm1uelcrT29WZE9kdzlTUFE4dGx3Y2JFMkE1bDFqVndjL1NDbGduY1hYTGhCNS82cnh1ZTAyb2cvYlZ0YWdzeGt4QURnOHdYcEJReEVadjMreGN3dmw0L3lMSGtmN1VhNlpDYlRaQS9aRzN2V094VlpFcElDZzd6SkZIdjR6bHV1RmlXZXNNdDRmVHFwZDhtTzhWaXVPU0pqcVRNOThOaVpXT3pKY0dSNTAxc0dxTllqQnZuS0pOemt0bzdDTURJWDVOeDFoVGJJZDl6UVNuTDZlZDlGY096WnZyZXZMNlBGMkZ3UHJWeGZnTWpETjM1MjNZWlBOT2VpNlppalcvL1JqeC9zWFVOZ0I1OTh1Z3BwY0ozVVVQQnZReVZRUGxHYmJXQVp5OFh2eDNubndDM2RBbXMrazJSMTVGNWs1UmprTWFwRHNNSXZhaHRwZGRLRDBoL3lvZGg3V3RlOWQ4N0RsTHYxZjdGMmI2MTVOMnA2d0VzUjB1ME5NdTVKR2t6NUdoRGU2M0lOVVB3M1V6dU9xcjNqY245c3NmMG5qbUQya3BNb2FlMUdVaHc5ZktZNk4vWVQ5MzY0OWROaTNodVZXTllwK3hGbW5weXdIbmZPWnptRzBuVkF1U2Y5MTV5VHY2bGt1WG02OFB3aGVlOUN0REhOLzRUaWZTQVhtQmRxMXdzYjdYcXIzNmVYL1J5bXlQS0tXMlpNVmJPTUs2TkFVZ3lLVTFzRHhLL0xTMDU5SjFQcENRcy91SFZiZEkvMDBreXRXcDc1Ny9kcGhDVGlQenRCcFNlbWkrT1lBQmdtT1NUVTg5TTR3b2EwYzM5b2NhZUdEV3pGd3dPeTlMb0xTR2QxZDhGRnJVRU5rOEYya3ZqMExUQnltbXlCSk5YMUZBYjJJMmowQVlxVWtKem9BNnFvMVhkajVWdURRb1J4b21PeWJpYThLdjNmakk4RDlyb3Z0WG9jMkJqRm1FWTZvN0dreVZPek5md0llVTdhRDZvbWhzSk03ZXhsaTdtdERkU3ZuY3FQdHFqZUNPZC9rSWhhcWVFVnIxQk9taWQ4d2lRVmh4UmV4SmdQMmFrQWtNSm0yMXRnTk0vSzJyREpDVWR1R0FqN016Nkx4QTNlTjU1NVJrWFlmRGtVY1JQdDlQMTNJK2ZRMmkyTXFlQ0p5SXFvVVlrVm43S3FEOWNKdlZ0WWtZRHh2MEk2cVhVV1dhd0VPUjErMWg5cmlmdmVSQlkvb3JNS2xvQTVFWVhXN0hHYm5raTJualh4a2YydTdmTXpPVU11NGR6Nm8vckNZS09GVDgzVDU1bWxlQjFaS08zSFlhK1Z3d2x2TldaTUdRdThtOHJyMEF5bjc4eGh0Q1IxWXR0UUNxdy9OU2o1ZHM4ZjJrang0MForVDNzZ2trU2N2UEt2Vml4MkFWVm0wbEJlbWh1SnNpQUZyYjYxVVF1UE9OWHlHa0ZWUFVWbFB2dmF0WE1YbVBIR3l4Tkd1NldZd0NBM2pMRWFPMTBiT2lpd2Z4aXZscDRDZEVOUy81RXEvSXN3UkpKRlFjZGltMlJKbzh0OUZyMHRaZXRwcEJYNHVEWXh3UGJGK3V0RXV5QUxHd2VYRXR0M0VmY2dUSHN1OTNuOUdQVEs4TitGaHh0TWM0Y1ptbGhSMW5NMi9sMUFoR1A0Q0FnSURtOVdidlFKdjBWK0Y2NDZZVnJlb3ZFdVR6Mlp6bDFqOFcwbGZHTVlUUW5BWTBpS25semVKUXp0cWJHMXpyTjExcGpVNEtzK080c2tTMEx5UmNTTCtWSWxPcmkyeGxvNjFOTzMraHZNdjVxeVhiSm1WdCtIKyt6SXJpUnRaamhRSVNhTlZ1Y3ZVMHo5S3dZK21MYmNGQ0dxc1J1NVdRWFdyTkZHdlA1L3MyR2x5bEdVc3o5TGM1d3RiUW9aLzJOUHYxbWpLa3p0d050dVVZemV5ZzFScHdVcERSU1hTS0xVZTlxamFsZzlta01xeWVnT1lUeVdPSXFkVFhINkdPOXlrYjI2ZFhMd2UyYWZrUWora01hSGMzVjJRZlBreFJJaEhZTlc5MllrZ1ZHNmoxa0wvektYWGVTalRXVGFhT0tRaG1aY3BTSDFOZzZaK0tscnNMNTRQRmlkVlprUEVBa0JvRUxEdGNyNWRNVFUybnZSb1JLRnBsUmpPYzZyV2x2SUtMV0NMbWxOaHRFMzZmYnpJZFBpb0xjRlo2ajYzdjN1UXd0ZnQxODQ5djJNUU9KT3l0aGtZVTZROE1IYTIxUzgxNTJSYWIzanZhcUZibG90aUpMU3lrSXNYQVRyUVJPeWtUTjRGS1FKb0crczJDeTZuWlBjNnRWT2FIckREY08wcXRGN005YzFwNTFETGRRbjUxWW5Yc1BvR1JOU3ZMWnkxaWhtdnp3U29SU1A0MHlmR1Qxd1plYUR1VnFlK2l3RmdTSldTNnhDNk9rK1hCMjdwazhIcEw3dzNKWUxhaHJwQjhzd0tEc2ppN2pjNDBsSTJhZEZZaG41SUpCZU5CcFZWUHQ0UFQzV1plUjF2a3hMY1U1NVNiMmpIMWU5cENhTjVETkN4dDBaWEdlaGg0R216ZUxHbEdubVpHa2c5MzEvemhjWlBPV3BqWGhLTUdDL1pLcWc3K3o2Y3AxZGwvV3Vpa0QxTVFITGlBU1JsWHVPUFRsTUd2Rjl1cm1pMG5EaTArc0hBUC8wUHJrTk5aU1N1bjZTQThBREpzYXM3VjVkcWNFU1NYYmJWTXZmOHJ2UTNlNnRDN1VoZC8zVmhCNVV2SW5tK1Y4SzFhTEg0dGh3WVpFekJrakVSeC9SSmhCVDRSYjdUbFJ6RmhUSDh0cmN4T2dPK3RMTU80eFhxa0hFbDBTTE8wN3AyRy96cG9XbTVPc1dNdllwV2xuMks2cHdOT3pmOWdYZDFXL0U5d1k0amh3a0dSajhoKzJSdHh5aEtSMDJqK2tweHo2VTRkdHNnMysrTng0Q0w0UncyT3dDMlBtVGM5YjZmVmY4eW1nVFhOWEJHZi9LNVhHVFdYQ3NjZW1odDFaUTAzaGttTVJFNjl6U0xZOWVwTlE4YzBSZnREVHNtMW8wTStIZjhLaS9wMENBWS9CMUtKM0pZcnJkc1lyanlsdGM3bmxhL3U5cXNwZjhXU0E4TzAycjRmV2lxUXg0eVNqVjRJTzB6YUhmMHVqZ0E5NlZ5Wk1WRjUybGNGVU9IcFVmREthQVVkcE1ZaUN1bm9mcGxxR1JqR1JnTHphcTBVempwSFRhTjljZXE2OVVxeU5DTU5Wa0xwUDRBY1o5K1NvNDAvUHZHWnQ5eHp2Z2o0L0U0bFNxNWNvUTZGWEd5QU9scXJ2R1N4dWJDalNGUHRPZy9qREVDR2FOajFackltczhuU3J4NzNqMmZ5VEwvOVJ5QUNDTVpXQklNanVjd0VUeWJYaXZLUm0ySUFFTkh6dGlWenFiN09MSnBlQzlsaHpPL28wMWQ3c0lrRVJYZThPaVR3QmZTZjZNc0FyMzcwd0JvaUVybVltMWZJY0Y0UDJmRnF6dFpyc3BUckN3OGIvbjNVUWZnUFM0N28wc2twcjNNM2tMSTV0VkhjZXZpK3plWGl0bjRjaUFrU1ViMjNrOEFqMllBMnNYb3lmZk5QZndrMVYyeHA5VEsva1ZRbTg4TjV4U2VDdnkxVmtZNFoySUtzS29WeFZTYlMxWUs4ZUFlT1k2WUZVdTY2Rmxua0lRU2Y1eWNkRW9kSjlBZHpkWWQyTVBnL256TTFFZm1FTlg0MjdhSzgwT0pMT0l3QllJWG9QWTBGUWZpbkJya2pvblY2aU5MSVZzYmVrU29NbllzS1YrSVM2S1lhaXptYmg3azhOTnhLTEJ5ODdzQ0NES1p3Z0lEbjhoNW4xQUlnamUvbkNTSjNlZm4wYmhYWXo5Wmp2bkRWdHQ3akh1bFhFSytoVnVSZVdaZmh6TmgwM3oxVm5LMGt6TDgvSktVSnd5MC90ZmFXQjVFSnZZQy9mODFSQ0hnNVU4Y2JwVWlURjdhSDlrMjZ2NGFWK0htNUcxMUZ6TzhZMVhtTXhmYy9aRnlab1RLZmlWZEZCU3lkZUtpSE81OHlDZnVWWXArc2RPc0FTUjlpdUF6ckVTd2dnRlZlL0I0Y3h0N3pmelhjYVlkWXRhN01qLzhyNlppcjVGRXJ0ZTdGZVBncXJUam1ZU1N3QmUxeWFzSEcxdFdoM3dNQkJsMzlQR2RiYXZ1ZXBhYnF1NmpiZ1JzNUlmQURCRm9kRnNFc3Awa1dkYkR0T2RpNTB3cG1JbXZWZDcxNDJZYlBVYmVlMk41Qzc0YU5sU0ZMT0VGZlVVVUpQRk5Gank5RUxNeCtlVXRUejJCZDJrQzhEM0pTR2VrTHBBZUYvMWR3TnhHdDN4dnY1OWM1RmQwbXI5aDF2T29qdTYrNHVBRUJJUDJ1N0s1V0VoZlZ2VCtWVXhqZHdKTHFMbG9ZV3piMGNYMER5NHFmNzBWRzhEcjliMG9UZWZyS0FXK1JSOUp3WEFCKzNDc05SVWVUTFZPdWIxdXduektaSFRzdmJPRmh4T0hPQ1RXS2JNOWttbmFscUREYmxWUWU3SFpISzkrU0tXZHpIL2ZoM0FhUEFEekdCRm0wRnRWdnE1bVZzTXNZT25xN1VWTUpuSWd1NDVBVm1VZ3lOWVA0T3d6cFY3SHU5bUVSSk5Zb0NvZWxhUVZ2Y0tTVExPaE02VUU2RXFDL1IwQ1dFdlJ1M2l6SXRjelhUK25CVUI3TmZtZEJYUElaMjJ2WUpuT3RwUWxmNmlwcmN0SVBlN2xrR29uWitIZWxMVU11UXE0TFp6RzJCZXB6aWRqVGIzME5WTHMzNHpPYXBmVTVRQU1Jbnh5RFhSUDl1LzlHcjBsTHlxNER2QzhwYTd1Rkk1U2thMGZxczlSdnVWZ1EySjUzM2M5RjNOdnY2TmtJVmpCTzVvdU4xNVpPeUk0TG1RcVloMWZ2ZVl4V2cxN2Y3eEExRHl1VXJ2cDNiVythOHBPTjM2aXQ0STFXNjJIQzVidmVSQzZGVGdWeEVDd1hqMTRHSEJLTGNBYVJsejEzMG94anZGeVdXazBvOVg0eHJzRkVxMGF5VHRNWW9NeHpwY1NzdFFiZzU0WlN3REtycDR5Zm1wQVZmTWFXZWFRV1J2dkwwY09mM1l4RmY2TnJwTUhHNlU1TTVaZzl2d04yeklPbzRrRW41SjNzZDZNTWxJM1R3V2Fla1lhZWtXdUpnTTNVZHUxZk16MFhrNmYxQmZodXgyVVFpRHBqc1FleUU0NEgvMjBrVmt2MTJBS2tQZllFS2NwdlRwaXg2OGRtMmxaRU43ZmZaaGxBOCs5U2lrSnNjWThhMFVFSDA3TitadVZGS21vRlBHK0x6dnF1ekE2ZlFzOEtINkM3cklSaGl3ZWN6OWVUR2lWT0gxRkRqMmI1UUVOMUszcjBvTkJybVMrM3NwYmQxSWw0cStNeGl1MmN5SU1UaCtrcEhPVU1OWW5BVjMvT3NtYnJpaDFlckxzUEQ1VEY0NzVqTlFXbnpMZ1dyYThrVkt4eUZIREhOaCtDRU96bVRqaHl4L2RhTnBKZ3RKdjJVZzZKU1RYZDhXZ1FRL3VSODBFSm1KcmVSN3cwdkphWHZ1NDlOSUxjMGpTakkyQ2JkaEljdU5VNXFuL3ZYTHBnUTY4TmVudytjQlN2RDZGbGg1Wnl2am9odVNYb0xBVGdsU25seUJNM3cwclpoQ3F4ajU4TEZraHNWYUluKzAraUdLN0NodXpDMHUyV21zTWc0ZTRqbjBlSEtXc05pMFp0RS83b2NLRTZ0cXVlKy9qOE1QejFJNUxRVWFnelFhOS9IM2g1WXhsQ01kWHFjTjcwMk1TTzV1TEVneFU1cVlBckhEVjBudDZDZzBteWVBRzAxL3A5bmFFSnJZUDJrRFJjd2QzMnA3TldOMW05bnRURVdraTJjYitpU3dxQWNvSUlaR1NJNnEyYk1mVzZ2bXJjanExVGtTK0wyOUFJbkN4NnlLRWpHSnRKRm02SVE1dkc2d1YxeEg0VjdNT0ZzNGZneHpnSmkxTFNGelNyWDVKYTllRkJ2bGlkL2hVRnRQdWRwN3o4YWZ1M2lzOWRWNElZUnQrMnE0NjU0RkdLNlhmY1ZYRHZocC9oL09FTDFLZGVZQjRUNm1uaGJTZjFUbEdoSUk3M1FpdElyMlZwcWdJd1pSU2pPcmRuVTcwYzd5dWgxbzVNS0F6V2t3eWQzNU9lUW0rTC9XVm0vZVAvTFBJUU9pZldWM3o2aWI3S0hXRDRTZnYyK045cEovRDZaQ0Q0UkdJb3ZraWd0RXE5V01aOG9NcldBUjFyWEhKcW9td3NlQjRVRmVoVGVnQkkxTE5kd0JrMUs2MWYvSmZIclVjSit3akR3dVpqVnpkMTZqanN1NjBNRUhyeWx6YUpSMGFZOFM0eDROQjVRUTdhNDU4MnlUMU4rZjFDRk5lSCtpeFNhdnl1VnBlWDcrVmU0TkpMTjZYZGthSmdveTgrRW56MnBBZWdGcEZUVFFUOTU1akxIMi9qUGRiS2JtTFVQekVHcUt0eUZoTEw4WjRvd3gyZFhIcXBhcC9TYXhCQkNyS0VrMkczTWdyMEpDZFdIbVJZRVd3R1V2SWFJRmx2bHdEd01qR29oSjNlelhvazdaZ0N5aS9VQ1hiUklVN0oxbWw5TGo5NHFKbllZK08ra0xBZXl4OTYvTE12OXVpVVY4cWJhS0h4K0VKT2s4T0lBb2lickxiY01zNXZ2T1ZINGRzTnMycWpYYi9LamUrVHk0TEtDZ09rdHVyS2ZqZ00yT1NVREd3RUhueGd0MzlEd0NxNm5RRnR4KythQXJzeTVaZ2VhU1Z0T0UyYklxaVpGY1oyRkdUbUdEc3Z0bm1UTzJpR0Y2d24vM1NrRTFPQUpnVUI3aUthTFNGOThiTURtQ2pZOTVWNGcya0NhVVF3QTJ3WlowNzBkOXBTNlpheHd4QXcrUzJOd0dNejJvYXBFdnhWR3RUb1FHWnF5ek8rUmdvMld6L1l2a3pDMkNTbnZlaEVjU2ZXa1hDZDBGOUxTTHRSQ1lqanB4VHdOcld4Y3Jya3pQZEVCNUoyZnE1Z0VISWNROFhZV2FFWjlaNUtmOTRXaDk2SVpvR251enhKRSs3WitkY3JzR09mOUxWbTRjSlh6ZEdnOU83ZnQ0VlBKTkVXOGpzanFWOHFNbERiUEljSHVMMnhjR25pc2lhUTRwbWsxUUs0b1BnSEYzRkNnRnB3Ui9sUGtwR1pKMzJkSE1BMGVha2pmRm1PaWxyd0tTVjU0ellzMC9GUDI0RXlSUDlUY09aNHQrVVdRNmNtTG8rY0xqSjZNSnBlMjg3YzM0VEpXaXA1RVFtWFBZQUFQamF4TE9sYml4bmUrRHpQSWlTY2IxWllVUnBFbU41Unh6VU50N1pFMzlEWHhTZTBXanJEbHBkNkZKWmRNZjVnZUVnSXJ5NWtEcDBzUHd4Mmx6ZWpZWkgzSk5acTFLS3V6VjQ1SmpsUktncVJoV294Kyt4citKODdycFA4OElPdHJhSW5MeWU4R0pSSk1aSldnUmVGTE5XS2FJQlVRVGpCMUI4Z25NZ0JqNkx0WEwvTVdCN0FzdngyQ2R5VHBCcU5oTlpqWDlMdG82c2FHL0ZPMHdLZytRelhlb3NxTmQxRGIvOWFIMkxHMkZiVzJZK1doRDgzVitPZ3hPUVpVUFphKy84OFZGaVpBVHljODVicVhpVGhIMmRtdDFsT1Vkc2FmSnNoMU1HbUpmT1RHRCtWekg0OUNNK0RVeWF4bDVLWEdWbG1SOXJYcStuamtTRlRnbG1qL2VDRGpSVzN4U2t0NDVmQ2ZUYmMrcnRvWC9DUmNuWkhDRTlVbVEyajdDWTZEM1B1dFhGd3JSSGQrTVdxalFBVjl3N1RwNXpjZktPSDVpeFp6NG9pbFBIY0gzMVdIdHYwelJiL2ZRNW1zSGcxMEZxTzdpbEV0UkNiUGFVN3liZ1krdmxtMGdsWXVWY1JNc040cVVjdGpFa0c1bjFFQi9BL2w1dWF0Y2tIRUJNbUVKWUJWMDBZVDZBRzVtWHphL1RMYTRrWExYWU9IaTRSSThOc3NwQW4xZElraFAxbGVtRW05d21laDBlNUFmNGpUUGYyQm1lalQ0Q3ZvdVdVbE15UlRrRGRoN1NSTm5sKzJMaEJ6bUQ4dE1PNThTVjZKYWhXdVhqNGgrNlUwc0s0RG1WYnhrTFBzamxIRGhRQkc0d1hRQkxjRGpGa21PY1BuUHliTitDQXQzejBGcVlmWGg2SWpDSFVraU9hMTgrcmxyRkt3c0RpOWtacXpRejYzQXB6VU40RHRlQ0R3ZExIcFFZcDVOSDF6T0sxSlZaZDZmbW5kSmQzcThNT3FVWWRsQkpRZUlsSlBRL1hLR2ZIUGdSa0FheUJhN054djRienZHQUJwcXlSZWdiYXVDUGJEdXhYdGQ2STQ4bzh6OHpHYVVIVUFTTmdYdjFhOWZWOGZ4SzR2SGFWcDJZUHlXZFduSW9CejE5TWIwUC9VU0llbFZPL3Fjb1paSmFTVXAya1crZU52Y084bDBnTEdtVjZONlEvRDQzV0h4RjhuMzI2VWZnTjcvN1RRR1A0ZFcvNjB6UnJwaTVGYVFXanhNL0wvTHFPUjJmT0NPWUlrSTdWMjMzY2JOZzdhSHVCbGcyYkVJbGdub3NhckNBQ3RCMVdzODRST3Q2RWxnSCtZN1dJNHNLcCs2WVRGL0t3U3RlRU8waCs3bEtNbWRuRlJoUUtvZGxLRVljNlY3NlRucDdDK0Rjb2E1Y2VFdlM0a2VyY2xvSVczSmlSaEZOeXdKbVZNeCtqZzB0ajhmRHREUWNrL0E0S2ZPcUQrNUVLVU1paVBpQUQzeUpjZDJvZXZDVmNvd0J1TER5K0d1blY4OE1tZUtqSWt4d3JIMTREVzlzMTY1USsxN0ZmZzdXdnRMcVdMU09YS2c4amNIdlM5Q28wZHJ2UjdIWUZGUHk5REI2Q3VwRitYRkdRUERQc0IyMEMwK2t6dEdJVDViYkJ6R0RhMGJTUXNTNE1KNmc3eDVrZlZ6eTNZYWhGa3RyRmtKdUpyRHltNGlkOUNLcDNQWndkM08wdXRndXdmbDVqWXlYZHlxWFdTSW5heWJjamIrNXNaTW9uSmRiV1F0eGJ6eUVTWncwMXQxVXdjZnkrQ2VJa2hzY0tCck1EbElBeVJod3EwVVVTNmdoc2ZhNmE0UHowYU9DNVp1MkNodVNGbDk1RzVsMS9WYTZrN0lIT1FnVUNxYjNpMzR0M2FhZE5WMmhYSlJyWWR6NFh2ajVxQTdtTlJkR3Z2M1pJc3dzU0M1MUt0SE1SdEEyLzh5SkxEMTRiZHlKQWFlZnkwaWpYTUltK1pvTzR6Q3cyUkorZUd4S3IxUmRiMHBob2ZZaFlnWS9CNTZPeXpwcTExbHB6M2orRUs2VGlsNURPR3VKVGxUNEtML0oyMEZKUnlDdmpPZXhWMWUyV0NBQmR6M3NMS1FxWVBaeGJDeE14UjhnckRDajMyZ0ExTVd5S1h3V2RwUVV0OUwvNnh3NGsvTXFacUxSeHEvVkxtN0VEWXY0bjIvSDVUdGJ3YlJ3bldWbjBkd2lpVnB2L0w1bjlHMS9va21yeU9USVpSSmZ4bCtLbHB6blZYTHdhYWF6V2ZYa3FueEwxWVZqRytHR3U5LzZBK201dWdyRVBQQ21CejBaZHdRRVN4WEJKOFNNc3BvQWYyRXdjQ0xYaThZNyszNnVxcG15bUJqQmtabkVKUFB2U1RwWGIwRlhUU21pNzZ2bTBnQ1lPQnNCdS80Uk9YVnNZbWNiR1RTVkxuL1NaOE1BM0hHNkNodkk3Zml2WitSWVlYOUFMVEkvUUYwaXJrVDBFL3pqWVJEekp0S3l1a3RWcjg4ZmUxSmZ6cXFjLzF2V3VubFJFUk9aV2ZvZGZHcDVybXcxOWZ3WWY2OEIwNEMyWG0rd2xiU09oWXV0Y24xK2Jmdy8xbzJsamM2WVgyU1RaSXZEcGhqenZxTzZHZGlQU05YdG5sK090Y2lPUCs0WW5RK3Q3ckEweWhhNm04V2FhWG1BVFVkdmgrSFkvRldjdHBuMlpON010REdyYmlLa09vTGpadFFPdXZhd3l6Lzg5Nm9xY0pNWmZpempabEkyVTJMRityTC9yWHFvYVBIc3lJR1duN0hZRGc4RHBOQVlUWG1kYUdZZk1XTlh1L3JWUkljUWp2eUdnZ2JxL2kreTBPOVdUYnM4c2dzV3Fvc3Nod3lpWkxSeXJQZ3F0cUVvV0drRjVoMktzYm9wUDR2YWZXOXdIaGg4RkpDaGFybVFxL3JxOXhEV0FvcW02Y0VUc3puejBwY21Sai84dUJWeFI5U25HM1I2YW5yYkZteVA3OXlEdnF5eHVHTUMyT0x4RHEybEoyUVdwK1NwN1hWMDBKZUZ6T0JteWZMQkkrWUw2S0VOaElwVFFiZFh4OFFFTUlpVzZMbk5wMWt6VllMWDFNamlEc2tMTm14WnJXWlFxQ1F0UTEyNGUwbVV5WEttRCtQdmo1ZktkQTZvc0gwUThEN3dWdCt6aXU2ZTNFZHlNWTI2dTA0dTVkaVpGT2g5c2pUUy9IYUt1cGNubmdSQ3Z4dEpHL3luVS9hUG5xNnlOSFZjK3VWLzRiTzRGU2xoemhpcnpLRUZqNFVDLytwMzlGNXlmNldTZFI1a2hEdHRYbG9QamZCZjNMd0ZmWVJrL0lQOGdzU0gzb3BmRzczL2RnS1h2cHpCU3lvWktvd3RjcVpFZEdlclJxTnZJYW9FLzZnK2IweS9xbXA5WkhwRCtma1c3ZkRKWm1UVTZKejBzMmY1VzR3bjdPYVpEVGlHU01qTEx2Sk1hZTZqVGUyU0ZhcUNSL3p3TFRVNUtkc2h2TnpiWGxMQ0hGOWsyMVhidTJYMmxCYThqK2VHeFNGMU5qSFJyUEE0bTJIQ2ZSbVo5bzJjd295UmFvM2E3T0lpK3BDRDBsREsyYzkvTkxJZlZYbVVGNlh6eG1hTjVsa0V5emJaOHgzcGZ4MXJWSHZldTBXL21zK09LMEV4VFFEYW94YkwvRFhsVHNnSDBzU2owRDdxL0Z2eTNRYXcrdGxLdzVXV0FYTkNRTEMyRWhvNmM2b3pVY2FXRk02R3JFTzZVd2ZhZmpIaFluK3ZJb2FIS05LVWRDOWRZZnVON1F5b1JMT3JoY1JvajhGZ1NNazJtOXBqL2VYS2tYeWZkTnhiUmdTYVFtSDJXVTBSdW80akVUSEZ2YndRTkdjajFQRHdEM1VrdUYxdnZUMk1ycmEyNUVPSGJZemhQZ1pZRkQrNUlabU81Tk1PeVozZlYvTSt3WVVibmU5SzViNDRJR3FCclJjTHNRb1FLaGRrdTV3SEFpenFOeGhLNnpJZk82d0srNzAyYmlPajM4VFBzOHNpMm5kcG4wOHo0S0xmS0xMTHdtNm9GN01BUi9iS0NGamc2QUdjc3hGVjJ1amtKMlZ1RXVZUkRiYXAvUmtRTnIvZkpqb3BUcCtEVEVYV2pNMHAvVHIvN2ZmRFBUTmkzNFRLS25HUmN4QU1rbWtRSmxvRHNMRktzN1ZmVjJjTGNXZ0xZYllSQmxZZDB4c3BWaWwvbUhzSGhPWGZuMWVnRHRITkI2T2g4aGV6c0FqU0VLU0VyeUExTlFjenJDYm1hU3M5U0pmWVczU2tHelF6NHJSSkxoMkRDYUNrc3g4YmIxc2JtbzlFN1h2aFc3aHJ3S2RWbmJCd0JNS284NzFFNWZ0d1htcE1xNGRpVmRaSEEyekZJa3AxdkJZMEZ0TjVOWENoUWlkY1Bja0ZYWGhtdmhWdyt5N3V6M3lQNExNUU1xREkzejltajBiS3ZJdFFKVVpvM0RzaUIrdTVxSnpHNTd3c3pIR3JpR0ltV2VINVc0bThmNFgwSDZCMEtZbWFNeWx1ZnpjTUMvbUtzRDhjV2xKb1RISXd4elpONFRhUDU5dHNaSHRGZ2F0TjhYdDVpZUV3M2NDUnpJZHdwcUpUT0lMejYxRlNaL1A5S2RyWnFyWi9vRVppU3dKMXdBMUJ1eE4yRWZvOVI4M3ZjU2Y1czhnbzRZTGpWbXBqWVlKaDhJc1Z2UWQrb2VGcHoyenhLN3I5aGpTVUhhcXFEazhkcEZqaUxubHBsQzl3VWtIUTI0clN2VGtpOS9HUDNkcUx2YkFVUjNhclVHUzBaTU1iZ3ErSFlUSUJKTnVZd3NzUi9EN1gvRzcwNDc2TStqQlNONC80Z2lvcnhWUUtJaVBVNVlyMkE5UUxqYkwzNnpJSDlUcGdHM25NMDFiMUxxZEY0RXU4WTREZVpTUDBXTk5YTGpreGw1dmZVNklNVmNseXFiby9zdFF4aVRnNkQ2QktjUFA2VFdpek5lWFk0UG1Ia0MzL2xpT3ozWHA1RmtLNzdSOVFhNk1yUkJpSHNSdzN5TGkzQVBZdlAyZ0JVeW9iRmFkOGtzK0doOFF6MngyK2dybk4yK0JzMEJTR2J5V3A1TEdQOTRiQjZVQm5EUENsTmY1WG0xUmNLeENxTzVZYjJVNkRpTXhkRHU0OUsyQXFGTkpCTDNTR096a3UzeERVT0d0bXpxMTNrbmd1YVk0RVBudXFhcXd6ZUt1a0lBSldlYlBMNUI0cTNtdFJTa1pzUk1hQXFUaEpUY3N2c3hyMTE2ZFJ6L1U4Zyt2SmxSN0x5ZEthNldEdVNNOXJoNWEzV3M2bXRaZ3NXdjB0SlQweENscE5idnpNV2FHZlJLUFRUamZOU1FTdnQ4dHFBa29raWRYUDJrblkvbHh2Q3Q2R2Zkenp0OUUvUGxqVCtRVm5ETW96ZnhNL0tTU2dlMDdwZnErU1pBR0JBUjFoWUJ5Qk11R2N2RHp4VDA3NXBoUS83cXRVaWZlVE9HTXBXVitBZE5xczZ1REt1YnRkUytTL1puODZsM1JXVXdmUlhZWFZ5NWsvcUhHOWF5WUtWbEVEckw3SzVUeEl3L3p6bUE5elNJbENyVG9tK0puMlJpUzNIdTFneXl5SUMzMVU2UlFBWDI0cG5keDdFaU0zaTJVRWxKVFpUenMwWS9uekp0R2ViM3ZvaUN6d0ZxTlZXUWhTa0NQT2ZDNXd5ZC9xY3BoajJkK0dodkxBTGVmQmNnMGdKVVFrbVc0WGVBVlZlcDhqTWxmSFB2WVU0ZS9VNjhxNmpiZnJKL0NVNk5heHp4R0tnemovWWpWbHM3VmhWVm1hQVluVjIrb1FPQ1JFUHJLaktLdURWZ2NLdStKK08wa25rMkZnTytrbHA2VVdnTEIzaWl4UU1ZTVVUa0l3Uld2amZMNUpkVWc2V0V0cGlPVEl2MGVIYm1tcEtab0RrLzFDNmMwa3JITTZTcmdzZklLUXZaNXdsUGszV3dwRTBWMzAraEhLRkQ5WUYvSjFYVTdHRlpCYlNiTFZiekxTT1NxaVoxTXlSWTdiaUQ1QUtFbEU2c3dIa3dHOEV3R2JSTWhqQnZ5RjJKcHM2TFd0cm1vQUJDbGE0U3hUMSs1ZVBxQ0h1bUc2andpMEIwMHNlOE5ZWjc1c2RTWXlIZ01BWVB0SGRUUDRiMFltNzNFQzgyajNPZm81NEZOU3kyTzFWYWRNN2JxYzZJeTFUWFJRdU5WNm1VcWl5djZ3S3N4ZDVSaCtlQVJpRWpkNUFvUkNEY1dvZkpOVGlZQnZUMnFITnBNd0IzZ2l1UTlUdHRvUVVaL0ttS2JrR2VETFJKL1RrdDNqMTJIUnNzK3Q3WUxXTC95NHh1RElzRmwvcllMcFhKREFQQUpZc1c5UTZidXNiWDQvS1gzSldvcGtXbFV5a2VDQmZIeHBmeVZ3d3oxU054czRDT2hEbFRLNmgxSUJoVVJFZ2IwZkxPbHJ4dDg0bkF5Z3p5ZmZqR0JuU0JUWmZiWE42RU5OalUrb2xDbmRtOEx2S2Via0lhMUc4R3dKQWdBSHcrUS8zUVIxazZPSXpRUzdzcUN1SVU4K2wwWGFLQjcvS2dGc2lDT3JzMnpXektyaGtGemhubUs5SVprSzE3eEcxdHJWZnpPcjlZak9CZTgzd1R3SndRT2RET0orMW1KaHQ1S2k3STRaRnVUd01qYjlxMFRvcW0xMzBtTWlkUnY4YjNYbFBWV1Z1SXBaQVNvdjAzVFNxL2M2UkxtUk0wdk5YZWcrQkdQSUtabWxvTDRTdlRXUUVtSGFwNHB3bmRuKy9XOWd4c1R5MXRzeVY1NE9wazNTU2JIQ3VXckdpbytHaElNRTFHVjdRR1hCZEhJR2dxOTRoSlpJWTJpS2tsUzRoU25pSzJ2WnlOcEFGbHJqU0JXZnE5ZzA3ZUtYdWtUOVp5U01pdS9rRHVCQ2poV0RTSEp4QjFJSjN6N05vbmo3Nmd6Y3lXbVM4YXNRZTZLellPZUxESkM1QVVhKytvUUhnK2lCV0tCb0pWRFd6WnFGSnJ4Z2FHSjI5a2tOd2VJWVFVTWhoUGFwdU5HSkpWNDN4dEFaY3l5ejV2ZEpCL3BDVFhJMklkS1pjM1FWdG9KRUZ0SkpMK3NmQTJTWk0yL0lNTkRKZ0ZhamtTWXNmbkFiTlFJeHMrODl1QXRKUVNKV1dFMDNVVkxoN2hLUWhiRHBqMlRUQngwK3k4RXVJZjFrSThqamhkSWw0MFpqMVVSWTUzMjhlTk91UFRoNEtKWlV0ZU5oYjhVem9CZ29PWGNNN0dJOWJNNDdtMU9yVnNuOTY5SVRnTUlMQWZodW9iZFdTY242eGR6RDFPSGZob0JKMlozNHlTWS9peXZIVlFaS0VqenR4YVlVdHFJaEh5Z29BODh5Vy9EOVpHaXZsMDJrZWN6OU4xSC90NndvOENtQ2UwVXg3TVl2NW5ScmlsdHNhcnZoWFA5aXdaL2lSaDk1QXRPajRZNjl4ZXJGWE5aTjlVdUU4VEQvUnBaRllXc0t3cXk4cHp1Z3NyaWVFQlpXTmh3RDB3RFE2TUhyT3N0M1Yxd2phbjkyZzJSUVJjdHY0SXlsbkhZSC9hRnJZNk9iZTdvY0dtMjFIYmYyQVhjSnZrRE0rU2k1bkZxM3BZbXpzcXI4Q2N2cDU2NHB0ajhRTkg3cGl0S1Q3NTgrMzhpakQwOGtCeCtnVHZnK1plU2o3dm0xUGZsZTJ3TURKZlBWYVE4M1JQWWI0SXhrWmRrMWZSazVKaXEwVmcrZzNydHJJR2pxcS9YWVFCZU54Wks3WE1PK2NPYjVjSVRudWkzWHV6OUEwdUtWTkkzODJTekVUdmRMeEo2MVJLVVQ0aWxZemRWUitGaGZGak9hS0lVUERpNjBsbWVCcGJ3Rk8zbHBMbFIyZTFWY1JNemNiOElWK1BsNVV1ZlhBaFcrSW82eTM3SExKQVBFb2d4cHZ0MEFWc1FpYkZ3VHE3QTJJN2pzMXZMVmRrS2Rtd0JrMjVGem9zYk1KYk1LcFUzTHJ2eFJMZmpWM2gvRkc3VFRFTXNReW5JcVJRdEJsdHBsSERVUTNkbTVLNHdoK3BxZ0pGV3FsNWZzOStSZ1VFS0duMFZhMU9GVzFvWjhmMGhXRmVkNzkyVGJUdDViZWp4amc5ejRoeGgrVkwvRVpYdHZ3QXl2a1htTld3dzNMNXhHV3BTTHlaT2c1OEJmY0RDUld1cG1KUE4vckFZSE5yNDhqdzZDUFp0TlJ4aDhBTTB2Mzg4ajBZUVdVcURpb2tuYnRNdG9wV1pVeWNpOXl0a1c2cUdwaXhkeDVEU2p4QUptdk1HSnJxM080K2hNOHRra1cxSXZoME1yWkFWSTUwT2NVQUx0b0JKa1FvVGtNeHFyZlAzNVRGMVJsNG96NS9sN0dKOWY1cHhOVlZXdVJLaUdTVkpTdGRKa3lxN1VEbkJwUytiK3czekdBVTNCRWlheDdLMVpLRVY3MHV3d0xKeThWQTlPUTZ1dGxaclJ3WEdJcGZSZTN5VmVJSEJjVmtIVmVwQnhIL3BaTHRUeHRhbUM5TThZUFQ4cng1Tkc2MURlVTBCdzdmam15VDYzUjVrdHQ2STR6Tk1MWmdPSHZsWVk5UTdhOS9Cekc5QktOWTJUV1g2M1ZEd0lZTGIvVFQrMDB2N1VVZEpiMHlYQi8vVXVSeElTQ3FYWklsV0l1RUxFZzdpck5PcWRUUGJETUtYS21nbDBXOHUwL3FqQTBMaWJ5UlJhNm4zM1VBaTBYYTRueHJuUElZd2dJN2FadWF0UkhqOGtxMXF0WW00ZnVXV1hDWHlOekNGamtITlpNRzBPNmdjM2R4S3RCK01SRDdRelJvT2pKOUtOckxzN0d4SUVydDBKQ05kbHlBVWkzYlQzZ2RudWFJdzM1eU5DUWd3YXNqdGlwWk0xWkNXbEliOE1lMVFTaTJ6T1hockh2OXVCREh5S3VEV3NpRGV3OU9ONEMwTlJJQ2NCR1NYK0hid2srUW8yOW9sS2VIN3gzYWpCT3pGSWZ5L1Y2M2x3S3RxNkQxUElrc1pMK0orak9HaGZCTlJlQmdnVlcvRkRLYkpxUXhVazdQaHExL3k4Zk9zV3J3amY1eTdoSmtYbzRMQW41bWlTOTBsOU1rbDZCbklBUHNIOU5wVUg1UThxVVFvdTB0OWdQaUZqVHlxNTd6aTY0TlBKR1ZiLzRCTk9laVFZaFNxWWpJNXd0S2xSUHhQM3NkYkpWNHNucUJCc3lmUEJDd21uUHp2amtacWc5UkNFUmFCdk9GbzFjTmF4T0FTV2wxajFGb25VWTk2N0o3em5GMGtTL1I3RUVNdng2c1JGajBnbkNUQWFRNkFpVm1pWFV0VXNBcUVkM2tnejRzUFI2SWpVZnJOMnl3bWlEN0tMaHN2Mkp4Mm1nQmRvZHJCVXBMZjg5ZklnMXBaN1p0T0VpbGJsUVRmQVg2aTlpbk5tMlQwRzQ4UEJUOEJjVzRzK2lrTHArTUJ4NC9BcXpXNFRrbzNPdWdhRmsrVGpxWDBwanRxR3JVRUUvdHZsdFRWVlVDUlppejllZS9FNWgrdkdHMTZJSFVFRUI0UWhnYU41aHJ2THVSK2F5a3ZzQnQrOEg1d0hrd0dsVXJab2YxMWdpdm5kWUFFYVNlV1NoNXU1Nnp6U0dLU295RnNjV2hYcHNDcDcvSDF0U2pOakZHWWNXS3Npdm50QTFqMzFyTEliSlFxcGRqWUwwNloxU3ZpeWRJKzhhZHpidlVnR2krMVlOcnB5NXRKN0NzOEFiNEdWcndsdHFQNXpPS0tHZldJNUhXTnRZRnN4R1RaQzNnNlJnZHIrSmVlRDJnNmc4eGFkQ2RQOHkvSHoyTlJXY1NrRnlWZ1BRMWpkRDJJLzlhYk5OanowRmlWQkUwTncvTCsxb0FlWnVYSG1xR3dlU1QwdXpCUXplb0N3VmREWTVRR011QlRjQXJENWx5VlZ1UWZqZGhLL3draksyYTI2U1BMeWI4Q1pMZVA1ejVYaWNxQ0ZyeUQzbktiMG91MTQyWTFQeTBBVVQ2WEF3V1VscWFuZ0lpRytQZW41T1FNNWdaVG00ZERCbDY3ejBJR093WXlXcHdXV3E2ZVNsMGFvZzQ4Y2g1Mk85QmliT2dwbmVWTU93Z0pYQUZOSEJLbWF2aFJzeWM4b3EzWThXZGNIUHQ2OGZSWW1aNHpoWjZHbGhtTFdLSXArNGY2SWVrL3VCSWRCYkhxSWJLa3NIcFFtL25MTVo4SE85bmdyN0VaTThEWjZnaUFKSjcxVGY3RGtEQkxDYkxXSGpYdWRoZGF1bTJ5ZlJVU2RFeHpJUWU4UUNjamZRRkFjOHF3OTFUSFhacVp2eUluNngzWmRmdkkydUZDcDJiUVRCSVZ1MDdsdTJZU0FLb0FyY0F4R1A3RU5DaDZscndSbmRqKzN1b3pMOVQ3VjdOZDRWSTJINmpVMHh3cEtoNlgrYWdOelRpbHdPWEtEZDBIeVlJQTV3dkliNUxPek9jayt3cmZ6WU5FQmwxYWQrUmJaa1hVMWp2ejNKVHEwSVJ1dEtRMTdmNEswMEQzZWppNHdpTlVwcjFrMmh2YVdhQkFkMnB6VGJLckkrN1BTN3hyK1o3UGd6cDJ5QnM5anJtOE0rL29hbGxrdkViNldXWEJVSjFlZTZGS044Z1B3bG9LaWc0T3lVenFxYmpOWEdyamFSR2ZtZmk3ZEdNeWY5NkVCYXRaY1greVE4bmpwOVJZemo5bmVlTEN1QjVJbWJ0bi9FZDBnbXhFVzg1elMvN1RrdENoNWwwQXl3U1pJS084VlpER1JFUU9TNng1WDdnbUlIWllNWmEwSnF5c05WV0E1WGo4SlBzYzV5MEgrd3RYNjZUdnluY3pzZGV2dVZERmsrdFBvcHI4Szd6NmNkd1JiOU9Ldmc0Q3BFaXRNR0FWU3d2TTVhbWdsaEpnZTdRdmVHRzNTZmgzMHpBcWhXV1F1bkNXcDVnZURGZGE2RUdtdUFIZG5LNThxZ2ZWcUJMWURrY2srNU5TMUpKQ3BocDhZMEdjUUVPbGh2WU4vTHo1R0ZBS1lPQ3NlRmNzbng2anQ2OUIwSXpKblVBWDVIZzR1RTZsWHpydXB1Y2xGWG1HRnVIWTBDZnRJTVAzQ1VMa3lkTG04bDF2M0oxVUNFdlIwMThhSklHZys0L3hHM1ZtWW1ERWtjTFdvQ0NCTUdZZDNaVmlpQUZJK0wveDdiRjBnWGdLeUkycm9DTnVpM3pZcFd1ZUIwb01rRkE4TmFZWmxpTnpXMzcrZE9qUnlGVHJsQUQyYnplTm5FNzFnRS94YkQycC9zZVlES0ZnTE1Ea2FKOTZUM2NCQ0dWeVovcXlmNVIxenpHZ2FTU0YxSU1NU2JVR01jK3pNUVBWa0V4MFJIeVVHMlltSDJzd1RNZmJtbmZ2dkZjMnhoRTA3eWtPQ3RrV2hpQm5GSVBpVVVCNW8wdjVCVEQ5M3dtTS8zVGEwYUtKcThEbitFQ0FUekgyekhma25aKzN6ck9hWG9XM2hqaVpVWUM2UXA4ak9rNUptM2JNUmIzUTcwWG96S0VmRGVmUGV3ZzhSVUN6TFZmTXhoZFppUkdvSlcxRU1GcHhORzMvYTcwQmUvTGgxL3dlb3RxNDN0bEYvZjRqUmpsb1E1SkpmWHFSWDhheWRyZmtoZzE1ZWdrQmxaeU00cmNaSkxjMmNibnhUeXdJTkNqa0hjVkZ2YTV5eHhJbVptcXBqSy9FKzVpbFBZaitvZk5Oazd2Tk95ai9uU1BtQVVPbHk4dGF1RGJ5dEFXUXNNU3VRNGxtNGpJUUlmTmh4b0VHTFlLd01UMFgycWk4a2drZUZxUG5YTHhoRlFvb250Q3hleU9zRVR2cFNJNE9MeGtselY5VzhhNEpuMnZ1Ni82ZzVTNHoycXRTNzRaL1ExOHVpdW42YzFLTGtwb2hyV1dYWnNqd1hnWFhHcFVJdkZNWnowQlNoOVZKRHRyNkVHSkdJSStsOVYrMzVEUXpTdElRbVVsdFZybGtHRnFKNC8vcDJFdWxFU1VnVlpDK0lpbmdTT1JaZGs1U1ZJemE3a2hMbEIxWUpNaGFaMUY1THFxMEYzZmhPOFZ6SzFYWXN6bUVkSjhZNlJXalExMDBFZlZ3U0JIRmtKUzlnM3JSdm5BajJiMjlyU09LM0k0eWNOSGVuQWowbXFLVDczRkExN1EybDB6ZFpJd2daQ0ErNDVqc2E2ZzdUemZGSE1Zc0hKdThkaDdkemd4cHpCUis3YlhWZGsyOUFZL0lQVVJGZXlPTkQweFpaTWx0VllOR1p4Yk9CZXNFUHB2ZmVUN3Jna3R3KzVnamp0Zkp4TlRsN2lKaWZXVTRwVENiZ2dmY0M0cW9oV0FYOUNleFgwWU4zbUFVK1NJdDJPa2NLREkzSGpSbnVPTWdaTWg2eDIyUEdvQmtIaVgzaGtvaUFkNlg4aTV6WVRDTGFXdndWMWhsNjM3TFJkdnRqSHVYKyt3Mkx3UDlUekRORFBYRFpmOHdWOTBLUjA5VUY3b2FZN2dzaGY5MzdkSnVPMnI0UENRL3h0S3BjL1NyKzVHNDIwcEFzQW83T0RkQmRDOWhIWGhWRWU5U3lHTWVwb2lqUE5hRlRrQTdPaUV6RzJOb09xNUE3WHpyb0FHbXhUait0N25qOElKdERoT2h2dmFiSHVQd1Q3aythL1pleFVMZTFlRWRPNzFjeldDRTROS2RpUVVjTm5NSjVEdDhtNit1MzV1UmRKcDJZUDF2UlZZT0JVcGpBUVFDa2tHc0xYUmFQNTdHNlNmY1dtSEVpREZjS0RuOXpvZlVvdHB2SDVtU2E0Z1B0akhneTNhakd3WGwyS0t3b0xIbTRCTFJJL0VtcEl6ankvYW4yZkticHJHb1BhMi84dytHMFBWZ1BXdjNraVN4UTB0NHBMMEpnZU05anU3bzRoZnMzRC8wc243TkQrU3kzdUdvQm9adGlZWlBmdFBPRGZabTJwQ2pLQ3ZhaEtTTWxJOUdtMTltQ3NNQVpNdCtOaFVZZWhxYWRGUkY4OUhvV0tHeXNqcmNjV3oyMFZvdWFJdGpsOFdEK3o3ZTNReEx5SVhwM2NiNFFBa1k1WkdtZk94d3FiL1RaN0VrNnFxQVRpb1l2cjkvaGpTd3djcjZtNmgyOXYrenloK2ZCTEhqLzhDOVJJalBIK3pBdDJWc2pabW41bTJjYlZPQlJTTUVUVldLbkRhN0IzaGNKWDF5dXRLTUJrTk9GN3dMVFZVTitxd3NjS20rVlY4U25xWG1LTDM3OW81Y1hRT0Y5NzFWSUp2OVRlR29tL2xWcXpQNk4xVWVJK0dyUm1XL3RaOEJUeDlZOWVML0JTdk1CUlJoNXVJdk5UTFNUTTg1aHBzZ0dkNEM3Tm5lNVlQLzYxbXJpOTdOVnZLMWUvVXFUdXJNdlVRemZZZ09GcGJ3TGFqdDBYMkdGN2dJNTRySUYraVBOdHlqQlcyRDlQQ2ZUSEJSN3E0L0tpVysrNHpjZDBJSUR3SFhCaHpKVE1tcnNPQ29qVGNVcVRZVWxuZGV5YVdVbUt1bFdRb2Z5Qk1HRko5SzZUbUpkZTkvK0FUSG90MVZ4U2hVcDRuRmtOK3NBMnZ0NjhheEpNa1BYbk9JM0lUeGhGT2RQaVFLUGpCaEg1d0R5bkxnN2N2dVRaMHJyUG9NTkZHcGg5VHlhakpWQ29nZ3RadjJXN3F5MjhSMEFhemhYaHJmbGh2aVBzeEdqV2ZYU0xBU1hzbDNVNkZmbTA0NGVKc0wwZDFROG50ZzZKNWpkWFB2RFpxMG9jZEo5L1VOM0FpeHNjcnVidzMyRkFMV0pZUDNudE5BR09tZGxmdlc0YmZ0cWl3aUJtRXJsT09wS09VQXNJTndBNGMzZERuRldKQzhXNkJYdmtBV3JXb0JITW1yU1o3V1FZVDU5cW5BcE12Sm9lYm96ZUJ5L1ZVRVgwcmg4MlFYNHgydEU1R0UrTkE4WHh3UFdnNHE3SjFzZnl0Zk92S0l5ZXd0UzZiVitrNXNvMGdTV0paaTV1WjZ1bUs3NWtLOFJJUTVJU0c5SzlYKzJxZVQvam5QenpyczNjWUtnOG4ySUl6MHplRndWSU9PcFVaUDl5cEFqTEZFbTVOQ3lUSXczckphQlNISC8yU0dRbTZsOStoRlp1b2JHTnpGYStzV2NLdG1jL1ZhN3Z2WFVUdnhYeDJ1a0pVMm1mRWRlWCtzVHdCdWZGWmRxQ0w5K0Y1QW83a1h4cWI2Ymsya3cyLzFjUlFaVlhJaDJ4d3hEam5iUm1Ua05FQ2NMTEtrd09vaEM4UEd5eE91ZGlRZkVwR3lhNG1aeG5NWi9JZTZmc0dKeHk4RDI3OFVYSE9ab2RDSzNpbUd1eExUWXZJODB1eXNmNGJhcnBiR1BqU3lDeGxscFZWdzdlYmpoNmk1MFp3SlJFM3lnZ01zL1hiV1Z3ZVdybXMxcXlyNURJSTVkTWk4WnF6ZHRtTzJEamQ4UFEvV0ErNDBXWDNoQ1hYeG1ZdUlUWTZESmVaL28wNjRWZEc2dTRtRkdxSGpsZzgvRFFKZm0xbkF3a2NCMWxZS1ZpZUFkRWNTdVJYd1NDQ29IODhvOGdUTndOL0ZQUnF4bXhUOTgyaU5BNWJvZmlnbmdoTHZlbDBGMDBjZFVEUGZBSGtKNEVBU2JvV0FYMkN4VnRkWlJya0JVNWdqcGkySmtWbjdzUE5kYk1FRkdzd0N5T3VXWTYxS3hiMEVQaVpLdmg1bmY0QzlKSHNlOHJjbndYeGNkQVBPb0E2OER3UmZCVUJ6bHd0N0dyUXg5RUhWMGNrcnhmVDc5bTBoVkJxZXRjNVluRGg1VzRGOHA1RkYvMHI1eEpOajBudXFEcU5EWjBCRDFmMGp1MEFsMkdjMGJxQzlqZTBTZ25rek9kQ0d3cUpWV0FhS2Zrc0NXZDFIT3pJVU9xTDNKSGN4a1hyeDdoRVR3cXJUSCsvZ3JLdCtwaHhJN2lESTJCdFRiU2ViekJpRmoxV1hXTEZWMHJkendEbzlvVEZrVmtpN3FpU2ttK3RrL0M4YWNXazkwd1BWSEJLVTdkRHc4WXVCQ0JBL2JpYUx4UDE1VkEvcncxSTZ0aEZ1eTJDeU50TkpzYTNWWklrdC9sb3NIVmM3dmN1bWxDSTBScUJEYStVSXRPa01oaWVVMTcvM1RSOFJBYjhXWStuNmRkZlhjazFraldtZmpDVkJYblpXQzMrZDUvSERyWE05c29mZFhQSzNXWDd3WXp0bVNWMnNTa2lvYmtyNndWVUhMdU9OSys2VEpFWFZVYzJaanpuQlYxZTJjTHNHMWxsalYxdFRRMGMvWS9JSGc2a2t5VDZOdEswSC9qTTh1bW1WcE04bU1IUmtIYzJabnBLNlhFWk1ldnpXTnE0T25RUEkydmNDRFlEQVRZdFVNam1OWGw5cjIvN0NiQzhUanZBSlVacTQwcm5zQnFRdDNzMDErVVhlajdEUm5qbCt4bjFFOGt5NU5Za0V5OUNLdWg4VDNmQ2JqUFduUHJ2ZEFJU1N2OG5DdjNHcWRWMmNhTkpCL21XYlJRNTVIbG83TDlyaWQ2UDU0VEpMUFN5K3dydUdpVmJHZURCbE0wSDg5OHhQYW9GNkdjVjRGWUpjeGw1Q0RrUUhuMVlveW4xYkZhTGRjNnhwUUpaS2tZZy9oTCtIcy9pbFFFYXU3V2lCRXkzaGNuZWJGckJjZHA3UnVEWlZEUHFLZzFFamkvL0hkT0tsYW0rV0ZWMmVhZXdiTkI2WVpvWjlPdDA1eVFGK0xXTU0wMVFGTVUvQ3dINVJjT2hWR2d4OXl2dkpiWllKTU9HN3dhV1RFdklqTWpQcXFZeVM5T1lWbUoweEJ5T2VaUCt5TFhPN1ZhOHNwSTR1TW0zTm1CdytIVXovWDYxQVFBZmxyMkhabkJSblcwVFZRaHdZSDdRcVZ6d0tya0JNWm02d25DRy9idU4xb2dJendROW0rSXQvNDBmekp5aVlSazNJSWU5SVYzWVpqV0wrc29vb0svVWNycUR0dDhtdEUydzFoaGJpTjNqWHQzV0RVMExCQTBqUWZSTE96WlpnTDVYaWlPanhRdHpjT1VQVkpxNzlZZDhMVmFEdmNySjIvZkozSmRSa2NRWDhUZjI5bUpVZjV2ZEJOYUVCWFZTcUtTYmlZWjN3aytIbzUyMmdvNFg5TjdEMkN6WGlxSElLK1BMYXgxODdjQUtGeDk5S3VjNlJEMjFkQ2hFbW42WXlvblUvOVROU2tzV2hmYVJZTm5keWVhL2VYcnR0bjhvbjRrY0VJNGFnbnhiY1ZYNEZkS0VlTzZ2cUdFZDVmdWIyMkdjcHpuaHYxWm1CRjJoZ3d0UFRObEFEY3AxcEhyQlB5ZXhVY3hIYUQvZGUvZTEvSVNpc1RYRCtNK0xGcE5kYktSUlBuSlhqSmp3REQ2N2FmOThmTTlGZGEyZlI2c2ZQRWtrM3RQZ1UzVEZ3eGpsRmZPc3JUckhSVFlGVktyMW1kOHlmUlg2dmJjc0RSYmRjRDM1YUVFSlMydzlabGdXb212TmdwakpKWWFqZmZ2MHpCcXAycGVsT1NIQUIreDE0cTR6Z2IwMFZ1Y21kRXRyQUp6TC82LzlRbWtIa1JSMVY5dzVQbjFsZFVOUGFyejcrV0lMYkdBRkpuc3JESUI5bThrbzNlVDNTaEFtZjVMd2RjZjB2TTI2bGpnT0JtTnA5Y09IRVM3VGViZEtodU5KWTh4eEw4b2tWSzF0Umt6NFE2WmNjYWx1eUJ2cnhHUHQrSTdEU0o1amorK3I1eVlvSHNYeFpxMC9wZkJjMlYzNngrQlphTGRLQ0VrY2hFVDdXL2VJWDFTbG1jbkUrYXB0NUxFYTRhR1BnbzlsQXJEZTl0Q29TcG9sVDBBWHJRVTRXZFNRdm8vNmlycm9TbWlkek1qWkF4Qnk0dG16YkVTM01zSTVZNmUrdGlzK1A4Y2wzQVcxWi81NEVSY2ZkSFRwZnY1c1k2L1MxR1pTZVZseGh3YllJQ01KbUdRWENjbWw4aXRvdTQ5VnlRYjE5b2MvRE8raFFUNWVnODZuL3FlczVMVkhtMDhtdUpTQ291azEwT1JJRDdET2dmZ3FERDNXNVllcjhXMmkvcDdpMnlOUG5vekk0S3hQU1lkamhXSFB3VUxMeFZXWHlqS2h1WXVrR0IweEpkc1VVcVh4YkEvQnB5b0hmckpxaytpN0JzVWl3T0pwODBUMmlUeDdBM293T2JlNXE2dWhRWFFnc3RzVkpCME5tMlh0K2JQTlowdGdYaDc3aW1nMkxTQTZnbTZQMjlGeFVuRWxLQjNaTGwreElWTTVTNUJFZDh2WlRVZWlKSjIvMHgyc0c5V2Rrc0V5TDVaaEc2N1ZvcUdKd3hxOW1nOTNVMFNNWGtmakkxVk1qeXM3dXR2UEt2d1dCVlI2MXhQUnNUb3hMNVNKdjlRN1BoMnlvSzVwcEoxWHpwcUNwZmEwbVREZ0g4QjNTNzR4MVg3ZzdqNlRwRTZ1RU82cjIwTXJsZ2ZEdVFpVG5DaEgrSHlQYkkyM0dHVkMvQ202eEo3bVFLZ0MxWW9vVnVGYmtJdi9MZW9GbHMwT3ZLbDE1bi9EL0JBaEtPT0JSWElJaENrOEpOV21iUVIyQmVJcGF5SkhhRGw2UHcyZ3Z0YnV4YitjdDRJanVSMFhWUXZ0L3gxV1h2YjJrcDVQcHV0bVJ0WmsyaERBOHRsQ3oyZTJqNHNOR2paUjlaT1lZY2FuOWtyWEZaZHlZcTVHTE03WnF3WHo3UlBZRTdsU2JiKzZBUkVIdFZIR3pFWHo0eDFaam5laXdKVHBLSHhwQ1Q4NWVEN0xSLzFjZlpwTEhHWStZaUcxQzk2amc0N3NxZ21rc3lPZHE3NFpDOGZGVjhNSkFhbnc4UHlUOUJoUW5YWU5IMmVlbVB5am52M3FWRWxncnFsUTdNWFppdlpIQlhiNnloWHRkdkJsVzd1bGtNS0VMbFAxTzFtdjFvL09MYkJUN01kQTBYMk51cmE3amNGU2EwOG5WVEprK3ZudXpsdmdsVklzYWRTMHlLUVdaNGZNZTRYSnpxWnVoTnQrNHltQVZBbkl0Uk81U3dMck5XYzdZSjFmdVA1b1hRUGpSVmxGQkhMRHYwbU9zZDVKektqMTlBQW9UcnpxR3JNSmlBdkVtL3BQdkt0WlNyc1k0dXI0bkU1eDJuNGxlUnl1Y1VrbmVvQmp1YnYzVHBBY0RrS0NSTDR5YTRJdStwWFgxRjRZOVB6aTU2NzRjQmZ5UkRCZU1IQ3BOWVRsUldPb2FBWElGcE5HQlBDcnY3QnpVSWRadDB6UGdYWmFVeFhMTTdQQXBKVXcyUW9aa2JtNWtTcDBYY2JCMUZUK2JkL1lRUUdDUVdCZUtQMkpwcThDb1lheUpFVytWd3FKczZyanl4OWdIWW5YYlVKeG9INVIzU0E2SUpnZVAzSng2MVhoWGxiUFY5NnVHbWZkaDBLQnl5QkZ0MkNEMTJMRURIWWo4L2xpZzV0Zk1IaENBamNNYWNob0pqaXVhRFkySVZsblFXZHVDbmxyMmpmcnQzSVl1TGNtRTNQRHFBRndpVHoxQmt6d05RbDd3WFRQdWI3aWtqc3JxdVFmOUg4OUJIUHFmOUdFSk5Kc0FpVEZZajRTMllYUjlQVW13MDFwQ1pOWE42OXdQZitUa3R5RmhKQm80YjBQVm94THpURnJvdFQxR3pVN3l4M2pEOVpSSng2TTVBY3JXVnFWWkJJUHYwWUFxRG5kb2daRmtGTGdLV3lkM1BRMkJEU2ttUk81am9KK2svVFlBTy93OVh1VFllNmJYSW1vbGllZkxDQk9SenB4eXlvV3lZd1Uwby9aLzdPbWgySEV4SVFyRGtXc2htL1VPTDlnK2hmelRSc2JwNTlIbDNPaExraEdqNW5FRnRFSFhXcUJHNVdhVzc1MmRGQno4UWw2WFZJUFZLY29MYUxNTXIwV0dQb21yVStPRE1sU24xOE9ubE9keWZhUmZtV2tlTEJwZEZhcGpHVFZ5M2U3azNGMkdiM1dSdVlTbWVMeGRYM2g5ai9jcWJlS1c5bHpma3RLVHBXdDZqbFlCZ1M5YnBCWGg3cWNBSU9vVmhwbjFEYS9QdnkvYXVjM0NGMEZ1MEluM0VDdlRCelRZMmwyUnZaWWs4cGw2VnFaclV0R2djRDhVL2xtTytsVDgxcDB4V20vS0dOeWI2THVpK2RHZDFaaVZkNGtQdHJoUkNZckpkUGVGVnVaMDR3TFFsVlhrMTZzTHNyK1ZnL29DckdZLytCVFR0bkJvRURKNXV2WWZ0SGw5VnBhZGwvem9UamlUdmYvUVpUcnV4TGlxNnhqVmpnTzZuSFJxemttSGhBYktZRlc3SGtxY3A3WVZQM2d6ckNySi9PQWt2K1FuRTBVYmpwZFFxcUd1bHJiM2dhT2JXM1RxZWJFNVNKTEVESHczanNDbVdOdFNQQVhXVDhtZGlIWjdyOXF1NE5VL0ZRTnFUTEoxOW9LdGVsL3kxM2RkMGRZakQyRms0YTlmVE1KZVhhazlwYk8wSXVwV1NGSG83U0c1SVV2VmVBWnRPR2RvNXMrVTIzWWJSKzRZOUI0d3NSSzIraDJjRTg0QmducnZQMDh4RkgreDdlVUtFS0paZHhDcjdNckVwZ2xHTUE0eU8wWU95NGo1RjFjS1RpM2I2eTFQU3hqanB2OWkrVDBlakhuR3FlbFFMMW51ZU50MnlmdmFYc3NTbVprNEpvZkd3WStNTEcxejQvTHhyejBMMGd6MlNrd21hUm8wVS96RWVzdkxneU5nWUhCMUdaUU92RW5McXVUb0xYT0FVV3ZqaUxLMGp0TnZTMzkzdmNSY3J0OEowUjZ3UEE0bFFrMzBZVmZQQnZSOWZQeWFIanpmRGgvbS9YbS93dTZMWEdDSk16QThZN0E1VmVXakk3c2N5d0M4MGJSREpPSnpMMTVaaU02Q1QrK3BzNWhucFI5bXc0cFBmWEtwVFJQNTc0a2wyU2M0OThHaUo5c2w4dmdBL1owK2ZiODlOYlhBbkhOZS9KbmZGUVZOaUlSREY1ODFJc2RjMTYvWFRDOFhvV0pmOGRUMU1vV0M4OGh0OWhzZ0h6dnM3K0Y2Z0tvOGU3ZUlwS1VoUmZUUlJnUml5VzhzSk54cG1YVTYyWnJGdjJ4YjJWdVNaSU9nVFJVbmEya21xcFZRZGREbS9DS3poV0MrMWF0V1Q0RjNRSWxQT0hvR0padDR3UzJIUUpjK3ZJbVZRKzE3allGNE0xdmhNOFNUdTd1Z3hmUFFjYWRMUDhrQmtKNUhFeEpWeGtad1NUUDdobm1ldFBQbktlaVJ5RGRudi9IZGM2QUpWZXFFc2pZNFJxT1p6S0FLajJqY2E5YjB4b3locEtwRXE1emhEaUM5bTRJSitFQk14dHdrVXk3cmR3RzhBUFFZWFpmVFgyR3F4R2s0cEJ0Zm1IaGNTMXAva3E5cUZuWXA3MlpWMk1LSW5Mekp3MmlRVTJXWkQ2dVF5ZzlXREROVTFLc1pkMHFhTyt3djh3U0VHSGhWUnVrWldXZnN2diszNEFlbkRzWldLYmQvWWdRMEVFTGhFV2MycUNiWm4wTGhlLys0UUNYL1FEMU5sdERUZXhuc1UySXpnMEsxQjFWSmpmQVpzYnJFWjJZQnMvdGdNcjlyaUZMd2h4NTQvK0xWNHpDODhZYWF6eEh6WTZQalY4RDBZdzArV0xwUEJXYmFMbWVnYXoxRWVIZ3ViYkhpNDAvWGdiakR0dUhBSFpmaG9nQU43OWpTd1RZNnNITytBcE92cUtDT2c2TGd0NXJmTloyOGptUmJJVTJxbTNod0pIai9WaEdOL3FWMFNVbTRFeEN3ZkVLSWgzTGttelBDVmxiMmJFRnBnc3NPdG9EUVU5cU1CWnFrdmFtN2JVS3hmL2RSak0yZ0xUeVhPK2w2OXYvenBLUXQrT25GK1BLU0NwcUNWZi9xMzBPRkJVOTJWZEI1a2JwcVpwalpZS0E4Q1NLY2JXWVRxNE1xaGh0YVNJMCt3Q0ZoWUVJbklWRWV4RHhQTnk5TFdJMEExZVBlSy9oSm1IblVtS3JIV05WVmFRWkJWTlg3c3h3VnNEL2VZNEM0Mm5TWi9rRW1qNE5XT1lJZzJVMVRXZHMrYXZ2VG5Tb011WkpRbU4vM1Y3MzRxdVdvWTZtVXIrOVlNWWdNK0gxNmhlMEtQSWpObU83TDBwT0VjTWRXWm9jSnRNMUc3SXNWa1BGMCtkZjFkak1yZnd5MXVINENEUXZpTkFKWmE2UVo4U1YrYzhnV0xNME1VZFRXZ2hRYzhNckRsOE5ZV2lGQ3VxNzEyMWF3OGJaWmdGdldTZXpmeFQ5aHhpc25KblFzWHVKQm1TRnNsL0VZb0N2ZG11K3NkSHNhSHVnNy9CWFpHWG1wRXNuUUtnUTFtd2h0bHM3TUZIRllMOUhkWVluS1RocStyeCtpRFl6NFNSeU5RVWVZYkdNbENKS0ljdDByaGhWaEJJNW1DaVBzd0N4Zjk3YXkydWI2TzlCMVJzbVh3U1FYK1JCMUZ4d1NONXp2YWRWQUVESnhzSnVZZWh2dXJUSzIva0YweHQra0ZJbVh2UHQvNlFMaFdUNDUwSGxGemV3VjFJVEdDQlkwMVIvRW0vWGFpclBrR2dVZnBtdFpwWWZDdldxbzhrSDd2Ym5tQTdsTVdUZTZjaXA4VE9HQzFWVVpFNGtwdWtDbm1EU05JYlRnbkdSS0M1VVNXNlJMM0NQV25sRFd5cTJuRlNrUFkzTGJGKzU2dzlWMGV2TkRiZkRYRjIvMkoyT2crdGU5MDlIQ3JJUzdreHFPWVc5S2VDWmptZWdsMFBqVnE0Z044UjZpYnI3L3Vqdnd5M0RCSlZMVVFyeitxZWFucHZDRTNJNFdOc3pzSFl4WlZjZDdZc1hQTUc1RjY4b0pjSU0wcWo1S0o4TXZjVGU4bG53UVpiVTlOdkxpTlh4b3JKbGxaQXBxaVFCeHYyKzFvVEZwOWtMUEFOMGNTZ0lLREJCZmd1L3hiY21FUTR3S1d6QU9qMi9Zb1JtYzhTVVppLzR0WG03ZW1OMWpINGV2bGVmLzVpcFRMU0w1Y0M2Yk9qRk8zeXBMSGNqaStBOEVjTDhSZ1ExMk9aMjlEWElHM2htcDNWcjF4QlB3WUZPdGY2NWpVelcycjFSc0pMTzV1ME9ubVNKVXhnajhxZ1drUndXNWI3enNsWGJoazllWE1Kb3VyT1BRU04xZ3hTaTJGSFBkcDViS1FoWDJkVmZUaGxkaExOSjdWUEJIUDJpUityeHljZXN4cGZpcFo4WDFWNmJUSEZVSzUyNHJ2YjJXQ2xhK2p3WDlEYjFHM0NsNWFYZXpSNTFqSUwzYU9QVGFPZFZmOS9SVjhPMHcxS3JLSElIVDIyM2IwK2JxcGFWNHpJSVJiS3pUOWpzOGo1ZnB3ejRaZlh0bGFYUjFGODBFdTUwT3hZcU1ocW9rOFQvanJWZ0tveTVrMWhqakwza3Z6aHpCZThBVk11NHgyVm9kQm9sYzFZVzlETzgySURXNUlHSkJLd2tQQTZmMDBLQldBS2I5UGlwZDltYkV2aFZvVy80b0JFWGlEYTNKTkkzOTgwSDFvaVgxbXEyclFIUXJCYmZaWVMvTVdiNk53cGhuTHo5Qld1TEpBVFhiV3ZDeEtXZmRrVDVWYUFPOHVWRVZtQkYxQlJJYmRBTk5wN2Flc2Z6UnpuT2J1RkJGYUsxRWlzNTM0TlFhRDI2WlExZ05jNmI4K3ZlaXpGWTMxckNyTGRacWxwZHA5bWFKRUN0UnlrU3ZZRlM1SHZLT1RzNkFLQjBsRGtTeDhwMkd2M1kvWlhHUzJaZEtqTkp1S3VnajRQYlNNdXJBMDBYVG50Zk1yRG5Lc2dJNGpyZnd3aGdnMEpZeG10bkFFUjFoUFR6U1pUVUkzMmQ0MGw4T0d6c3FRaVpFcDNNL3hydXNQRkNzMHFUdzZMSmdyRXU1cW9mbUhSTTFBNk9WWkZ6MmdNYVBFekdIZ3NSV0I5NkJ1ZEQ4TGhrK1FuemI5UzhoMGZyQWkzN3NRaWtEcm0wWjBpSWJmalpNQmkvaDF5YlZhMjJOYklZSzA1SW5pU1BCU2hmWi9KMUZyYU8xMy9YU3BhSXFrNTBYZWY4YTBHWHZxQ2tjbW1VcTVmUm9LSzRudXh1dzEzTktRZUFnWlNtQjh6VWNSWGRTa1FHYllJWmtkTzVhNUVBeGtwV0FnRTFHQzkxWHdlTk8yRVdYS0tUSGpkY0JJV092d2paMnZQU2FVVkF5V2tpaUdab0xvQUR2b3ozbjRXTm1FaVdEMkw3SktmSXZIRDB6NWtJZ2JhalhHYm0xeXpzQmY3WWwvNEV2MnpuZ3VGcUZTWjIrbmtsTXN3Wnk3bVB0aklXN1pJSENtQVVqRTNhUkRzNVgvRnFJZ1laRjFZZXBaVmtBc0VweElNR1JLZURZSWV6VWZCQWx1ZkNMWFdsZ3c4eThQZi93SzRZL2dmdC9sODJsZUtad2ZOMUZQTlVpUlJPSVFuYWpJZVlmcFFSSjhUL3ROZTJucUVjaEY1aVhLdjZHcTB3RFRpeUhZSTZBRUZGa0dnMldOaWRjUXlNUHBNdVZYSzEzcENwWDZ0WXYxQXZOcmtmVjRwMXhhNTNQQ2prbVpkU29GeUdUYU1jbnRCVmtHS2hrNURjODBuWVlERWRUbHlUZnRxK2Z3b3FIZ1FhRXlaUFE3M0VGay8wWmF2c0NOTU4wM25PU1VlZng1bzI2SGtTYnllM29EQ2JIdm9Va3NISUI3U3VjWnVGWktjclNTeDNKV2VBckF5Mkk4K3ZUMFBMdVNMVTdiYm82RmtneHd4WjlyTFZoYmkrb1ZQVTZPdU56cm1ITGI5TkkxUnd5VVVhcmhPalBjeFF5SkthQ3piV2dHdlZGR05KN0RicDhkMGo2Y1paZURqQjM0SDVtSjI4bVA3U0FKeEozYXQwR3NRRVJCZUMvMTZjTGg1VWhpc2lZU1NiVmp5ZFNtTUFtNFlZbjdVSktzL0tLeFVTMDVIV2pkemt0RG5nbzN0ZkRSRFh3bEwyZmorbXhwbi9CbnlxcGdYZTE3NkNTWDVhbS9uT0FyVWQ0aXpEQlRVaURuU2Q1d0N4R1dLU1htVjU3T2x6dWROeTkvSWc3L3Q4TXUvTGh2ZWdoSE42TisxblB4bUcxUmpHOFRIVUF3a0lHTmZNNW1XT0tsWCtON1BLall3bHVkTGdmeGxMTThWYnp4STBDWko4aWU2TFY4ZEZMT244OE8vVDkxN25JN2d6U3ZVNzVkQUo4Z0RkOXVoMTlDWG1BR2d5L2RoTGlKTktXS1F1ZllLek91UmVvZmxuU1R6aXh1eGxHdGlXRmQ2NCt1NGxkNk9VV2o2d1FyY3BncFBCVDVJUi9qVTJja1RBOHBQYXBiYWVHZVZsVUxjV3dOMWpDaDVucHFONFdJR3dabWYzRGZzOFVCNHFPMnhsV3FlWUl1OGEyUUoyZDNXdzdKYldaOWNta2xMUUxiQVdETEkrcjVIZjlSQk5IT2h0NFplSkkrVUl1MDl4UnR2NmJJT0I5L2pIUkdOVHlhcDdXZVBBOE1zMVRTem9Dck8wUW43ZzBxQ3IwRWI4M1lrR3lxK0pJTkg4TjZnZzgyamZqUDNJdnpTUHltbHpXSEl1RVVMMU13d3VsRmowakw3NHZOK1hxbkY2OWllUHBFS2dUQVE1MUh6RVRoNHZvUWxMc3hvYXhpSXhRMGFQWlJVbDJGNFNMNFd3eFNhc296RjhpSENaNkx5TjBZNklNU01IckYvaEk2QXdRdG50NnJwTDJJLzRHeXJNVkRvMzRiNnZ0OHdjc0l1eUUvVFFTbnVOd0U1UWNjbEtYNmR3SjlFNldIanFGUWVwZzl5U1NhanZEUTh1WHRFb0haUktRMGMwNWNuL3Z4bzRjUFZ4eDJaOUExeW9GM0lRZDRFeUtpTXFmSUtzZGdPbmlTVjlvOEwzOGF6MG5qMFVRZ05aS2lScTZtT2tEeXVxMW1OQ3EzQ2x5K1BYdnU4WGhJUksxb3VMR2IyZGRwTEUxanVUL3Azb1VMRWNDZklUb01oTHBxRVhOY0x6VytCK1V2aDIwUUhhV0g5ajIxM3RiTzFBQXA1WU9vcFpUVUFvaVNvU2hFSkIzVnNWTHRHaUd3OVludmcxQ3N5NnZoRytuWllma3FRdEVTYWN1ZmUvdk56aVNnd3hwSjRjQWZ5VzhrcGJBVkltRGdqY1kvSkx0dXorbysxbW5iTkRxeStTY2xzWlNOUEZmSEJKRkl2eGtvTFVaMDlUckRqZExzb0lTTCtxbjUzL1J1bnNTOXM4aHo4UG91SWozcExlRXFlRC8wcWZsSWt0Ny9VcW53ZEd5dGhFVmhzeGVyVFZHWkNyWjBDa3VGdERHYTBkUDZMWFlGYTdNbEVZVUlMdUdLUWYycmN0b0laMHN0RkpHUkluQWZVUjJOMW9PeDBZaVZ0NXdibldObHJHU1o5QmJEUHZOUm5iUFFqTExyMDYwcStMOHg2VDlUZSsyUFZWc1JMZHc0cjM0TkVHYVVGRGFCRFpFL3BNUnBBMXQyODNQZ2JOdWJTMC84SjdpTEl5VmRYVVhMYm05NDNVMWtwUFpOREhLN0tPc0RGd0xTVkx6S01FSUE0N3ZlejNDdFZneldNaVNhN2RlTUY0aXgwaHpjaklGbVI0UHRLR2IxeGlhN0lCSTFFMFliQVVkU2NMTmtDQWx0NGxueVptQ2NzbG1BdkdqMVJ3ejBQMjdtekFnb25lR2Jvb2h1RkRqRlVHNFZGTFNxYk1zeFE1bzFmRGhmdnl4WHloYWlwZUFsU1paT1JicElZWE4xczZ0ZXFKY2kwZnU3aTlZUGJMOG1zcFEyaXZ0eUNyYTkrelZENWVPc1VCaEc2S0FyTHpzdjk1bEtPYWhadks2bkVuQ1NhTFNxSG12WkJNUzgvc3crWWRMQVVWbkZZRVFBSmxXR3JmcDF3QlQwYytINlZmZnlUNW5sQndkUDZSQ0ptaVVMdUNLNVFnakhXdWorZWx2V1R3QUcra2VqM3RmVnRuSWlOMUViQW1lTGpJOUppK203Ui9hYWhsenJndVJkNGJ6bHdXTklqZHFTb3NUaTR3Wk80ViswZGNOUVVyM0sxMG5IOXdqMURBci9qVnpYKzVjUGF5OG56cDFMOVl2bjZMb1Jpd2hFVUY1eXBsYi9HR3QyR3prYWJ2VmhBZlVuZHk0bUc3VXlkaExQU252MnVlK2xvcUZHeW12dE5vYTVCd1ZVdk9hMUVkaTJZZCtGYkRmQWhqOVJhSUNITjcrTEplR0Q0YXJ1dUJiT3lYM3pSSjg3RkJsOU9HeXB3VDlaRzBYQkpjbTJBYjY4ekJacTJnR0xkenM4QjNDY3BVcW41QllyTlZHMU5nOE5lL2ovVEs0bDhabW51MWdWRjljbHBCdnpzN3hNbXBYY3hIcmJwSHNEcTFzRGl2VFQrZXJpNndmR2RLMkpoQkpwL1JaRmxSWGlBNVRGUGtpSDI4SERmK0kreHNwbkJUa3NiSDhLdWhHV1ByYmlOSXhUbkFtQ05XWXNjdG8rM1dsNzQxdzY1TWZrTnByOHpoZGY3NjVrUHZSMWx6UUxJVXZCQkxsWmM2TXRXQkphTE1ESDh1NWxZYm9RWkVxTzZPVG5oT3NVeUJydU1MY2pkR2lxL3VLQ3ZWSGlRbVNuQ0l0MFZKSzZueVFHRmhBTkduamc5dWdUZ3NhVXVGSUw3V0RVbk1qaC9IcHc0eklDQWdJQ0FnSUNBOHYyL1JVZnQrbTIxOVFWKzM3Yzc5bjNOWDdTci9oOW54ZmI5ampnZWkzMjlnTjl2Y1E1ZnQrbEkvYjlXRG42Zy8yMzdaUDh6N1VyOVNoMzJmWlQzMi9ZZDRIcGY4TzBDKzN1cGNOOVgwQUY5WDBmR3ZuRDMxZlh6ZnMrd3EvVVRmN2ZyUjc2dnEwMTlYVjNmVjJRQTlBQldvZGVMRFc2OHdURUlYMnhZVjc2dWtsbUdnUWJOK3JTOGlKL0xwWmhoZVBaTFk2dVZHWG12VlZiRmg3dzdPNVU2bi9FWVZuMlRQRUxTQ1hPSkxuN2l4dllxdGtZRUZMT3NkNnVab1Mwd09mbDNnZFJCTFc1MUo5SFUwaGVMb3AzZ3hudGtmRXB0bmdpVnVneWkrMUkrdXVRTyt4aUV3NDloZjdOekxaOEJaUDc4NWxMY090d2FvWk5IOC92eDhjL09qampOZXBUU1lqT3o3TTIvbFVoTlJhQlVsUFp5VWJFVllVd0FiTFVMMGt6N2s2bVJVVzkxQWVvMjkybU02SVNHM0N1S3V0ckhhSDVCZXAxWExSZks2NURjVVdPRVVYVUtIdVVSOUlobDRTRUdzVFFDdlRjV0dETzNpajRaeHo1NW1mMGJNTW5lWWxNaFRqeGtPQWpydzNVdVk1M1Q3bzNXcWFQNnpWd20vWGdXaVZQTzJDc2ljWm1TSXc0eWRoVTFmeTNsdDVTRWVwWDhMVHBLSzhNWEs2ZzU3VUxQeXlyUHFCcTRQUUpYa21LdHJZRVE4WXF5bCtqUXBTN2IyV0l3S2J0ci8weG94SHBvZ1k3RnpKOGVGWjhwYm1IaUdBVENZMGliSkxwaC8zdStuN3FyVkdwU3FOclFSdmlUbWEySVpMUDg2YlZUeTdHazBsRzlGQWJKc29xeHJ2OGpLZmNjSXpBTlAwMGx3TTZ4aFJveWJ6R200b1I1T3JIbDVtdlc5MjVvdEJZbnFLVVhhWHZmYXdvSmRYeXo4NS9TT3JFb09WNlhpMm5ETXYwSk45eTFkUUtaczRYdm5sbHV5TVFHbnVTN0d4T2g0djhFRUZlVnltWmM4c3J5dXdISVc1SHhnaFU4bStxSENHN3pmdWRwd21ZVjlZMFErZDlham85T1JNQklybzl4blV3eXAzbHlrQnZwZ3pNWGpBVkhORGlCYS9wTGJKUlM0dCtpUDlGVWI1a241QWFNTG01dnAxODFDR0J0ZjR0VTN0RWtpSWl4WmlDT0l6WTBacW9nSzRDYXhuVGYvZmNoOC9UYmtYTHNUNnVhMnQ4MUR4L1ZSUzdYcHJrWUZMRGpzKzRHdUwvSGE5SzZ0cG1qcDExemhDSGttTFRSempIZStMMnlQM1U1MWhDelladi9mSUNHT0RFdWlOTk9jY2lXRTlnZjBIV0VZTDR1UUhuM2E4V2FzVUF4MDVFS2hmN1BnTjA4Q2FCLzNCZHlsZzF0VW1LNWpIWnRDTnlPeTBiSFRNT1NTaGJnSWJKTUFJL2s2aXRTUmxKeUJZMUhsQ1VnUzQ3QmlyZHd6MlpnQnRYaEY2NzlIcUc1V21MNnZtMEVpd3ZWNkwzbXVVdi9Xdm9WMTljRnQwb3RObDhTSU5KbjJBTmRFWVdMRVlzUzdQajdXc1BqdEhqR2RUbmNEWUt2T0dWS0xuV1NoUTNOV3hJVFJlNEVqYXNFMytPS3BpZHQ5eUdVYzF6Qzc0LzFYdjhBNHlMMFJ6cmRBSmFOSFZFbk9BOWZ1dEdGOHdTcGpjMHdpVm1GdHFxd3Y3SG81Y2VGRjRJTllrUmpSTEpobDNJc3UrMDlCSkhja3dEbmlsaHZNdFZ0bWJxTklsamhHazhUZGwrNVZNSEFIaVcyZTBPNnN6eE1tSm5wMGROOW4weWxRVG52Q3VXbit6RFAybmdwUTJxMk55elJxZHF3UFFET09VdDUxZDdnUGc3dGQ1bHNJSEIvK2puVnppbC84Z0hFcnRTclhJTVZBK1UzTHk3V01nN0YzajNLa2FCWCthREdNY2x2V0h5cUpNNlVVK0t4Wi9KTWpNT2k4T3JXdTBMVENiMTJ3S3hLajZPZm1RU21TZFFwRmp1YzdPY3AyblBkUDFwaWVEdTRUMWRKZTh2Z0F5M1BFSHlHY0N3TXg0UUtBWnF6SkovZDFHVXo5TnVtV0RBN2o5UHBWSit6Wk5VbXJxWTF2K05VdHRrdFlFZ1RUZGJadnRzRHB0OG4zdmtnMDBMRkpMa0Z2Ukx0c3RoR2RJMGw3SXFaRFZNM1dZa1VPVG05cDFabVhtQTdrY0ZmanJtb1dVcm9QL01NejErbmw3K1JjWWRnMC9XNWdQY2w0bzN1cGx5aGNhQ1ZrTFZBTnVzazZWM3hLek1WY1dOclI1WHBjODZBMTBodU5zZldmdzBLRlZxQUZwalFzVUI3RFlySE9jY1RWWldKRmZhbENRTVloQzBaU0tEZ2ZFVis5U0RGN0NlTTJtTE5xZ1NpdlZ3cEIzbmdjVGlnS1IrZ2paT05OejRRdEhOSCtMRlBhRU1TQzQ4c0lYSVRKV2p5SVVlMkNCRnFMZjcrQm9ROWo3Qjg1RkEvZHhvTlR4b1l1dWJEQ0pxckdNTmdLMnpmc2NzVUExT3MwVjUzd01HVCtOUnZ2NHBsQjQvc3FOd0FYcWdTQlBWZGNqZURudWw1a3hUYVhDOWJiVDMvVXE3RlBVVUJCdGh4SkdPcVFMaWFGUlBhaHZPc1NFcEtMVUhsSWxQT1ZQbWZxZExaUXhjNkl6VzlwdTVEWFRpQzhZQkVUTU1XR1JLK0J5cXkrdlU0QTJkU0VhaUVXd2RqREZ3ZnhUOURwZWxGaUw4M0hNNUFNRG1LRkQ1Y2VjWVFjTmIzdzdSNVczOWhETlNqU21JamJqUVBpVHdaQUZRNmIvRGhoNXc3bUl3MlkrNTVkbjRMU2JhZkZxZFQ2Mlp0RjBDNHVIdlRlcHpQUnRqNFVpSmNWcnNMam1ndzJRYk03NXNvSW9SNFpOcktlZkw4R0ZKQVcyb3pWeDM4K1JJMzdsVmdNNldjTEgvbkhqODQwVVgyU3VEUEZrVEh0N2p3cjJheFUvMDFWblpseFdvRGU4KzVEMEE4UndLc2RQNGY1NEUyM2taK0xGMWNrT2UyNTFJZWFVYTF5b2tvOGVWUlp4MG1rSUVZejJzNWVoQjQwSG9oSEE4emlDNGNVZmJwMkJYVEpCTkRLYVBpVmk2OXNHZkQxcktuQ1c5clR6cUFQVGJFekF3Yll6SjRmMU1rNm1MMDBJQnZoSmFCMUZJQXFpazBNMnFqY2RydGNHeUdLSnhtUkdSRzJNR0RLamZqTEZnWVA0ZVgwN0FtK21PNFVUMXo4MSt0aFJBd3ArMmM4QTFFaW1uOTdQWUVRa1dUL09VV3BwWnpNQ2JHL2MxRmZhMHZhczZYUzdiRDI3SWNRd2lMVldROVZHdFNxWmRUTVlFSDlINVBRZnEvRVJ6Qlo3YVhaOUpuN0pjMTBJOEtzdVg5RTRMUTFkaWpsNG83eXNMTWFMOUtqYVRnWnZWM1daNVFzTkZxUzZIb3c0NDlVMDRmZWZuVWxWREFUTmI3eGtLcFJZUC9SYnUyNzFsTWEyRzErNHhjUkh5WTMrRDZidGxSMThmVEZiOWJvd1djYS9hbWlmVEJlWEJiQ2NDL3pDUUpVLzZ5Ym9peGhGcTZBUWlhTEJxN1E2NEJ3KzFOczZDU0FJRWp0U3lRN1EyK2FnOE1CeDFJMVhuUENDamxTRWYvUExIOXFNYmlGVi9JWDRKY3RLK3dIMVhpcStUdDFnR3o0U01kUnRoMVpzRnBQdFF2UjlJT1F5bWJ3c0hJN3pramNtZDA2QWNrNldITzRmc3RjRW9vQUNQT0JEc2RKVlpLYzhGM3QzbUhRUlZ3RldLRnBmcjZuVmNQNDNsRzA2ZUh3QTlpSENnTFNSRGo2SmE0QWFzOXpScDF0Tm1VcmVQakFzcmpXRkRmcGEwOU14UzJYS1BqK1lZWFlOTkNXVm1RaDdCUk9FdldscU1ObHArTXVONEM2YkZZYklXR2FGMjRxWXJ2ZURnVEp2dGluaVJtQ0N6WFV4WFlwYXZJTzQxUXIrekJsdys4MjhWaTV4L3BsYmhWeEZ2a3ZVNmswS2RtN2h3WVJzRlZ0S3BlNFlXVTlKMUVicTZZdVhwQlRnNUdaV2taWk5TeWxiQy9PMG42SjEyR3V4Tkwyc3A4N24zdWZHVnVQVThBTkhlUWFhSzFjKzkyZ00xWTc4MW9oZjBCaThvS3RpNS9CWFBqbWlES3d1U0RxclVxVU5mUkRtRU1NblczY0YwN2FrbWVzNHQ0V1QvaGFSQ0tRWnFqV3BXM0R1Ly9PV2tBQ3pHUHhydkRpZlp5YjEzcUFHS0ZvVWNVT3hYWHlEcUNZN1JSN1pZZjZrRVAwdnlRZmxQdDhoYTJKa2N5Rzl1QnVOWkd2d3A3ckRpeTg3S0pKR0RGdjRldHFhbGlDV3lKeHVUN0sySG4vQUlucjdwb3hUU0JCY1c5SlE5dHp2WlRvZXg5bUs4dVhaOTU2TmZRNG5iZjNkRHZUNCtydUpaMjFKUjNmdmUyMWRSQUt0aEEweGhkMnRmdVYxY1Q4QWs4Z3hRUmFEZE5XVCsxaUw2WTcyaGYzU3dWd241UXhIK01ja0h0RkkvcWtYSGxIYzJrbm1KeEZ0bkt0Tms3NmF2a1hyckJzMEw3d28wdE9ON2dQVGRMZU9pSnJ2UGx2RWllV2thRk1VVzNsa21veW1RVC9saG1NeURnYndHYU0xaVJyZGxHM1E2dTRaVnM0ak93NXB3QmZSdXZZRnJlTkEvYm43cFU5Q3p4SE5YZkFzejU2MnBLUlNHekNiOGlVN3JZa2NOQUtUSXNHWnRveTlVRHJNWFhRZ2RRSEt6VG9nUUdYT1BYamovd2szSXhFK0lGdkFnYU5JcENqT3R0ZVJlOUhsVkJMcUhWT0R0cm13N2lWRlFhK2t4Tnl4dVE5T3dPTW1IU2VKc1d5OW05RFh4MmNvejB3MG9iMkp2WEtnTkd2UzRnd3pvQVNJbTBsMWtFQ0c0Y25GUU1LQkxBYmtwaXhWV21DQzBSYkEzYzg3ZTllWnZxTzVxOUlTYitXclF3TW42VEZmdkVlejl4aTdNazBIQ2QxS2dkT3pmVWZzd1krcDJlRnZaajZIZzVJVzE1SWN5Y3RLTzNkaW9VOUlQeG94ZUJuWXZ4cVNlUi9NZytNVGh6U09qeUJObmxaV0s2RmZHWFRMWEZCbjVUenltMXlVWmdkdjY3NEU5a09zWEc1a3BQWHc2a2RMVVMvTmNtcm1idHJoZWVzTmh5Y0h1M0FJYVVsUUtNOENHQm1ZVE8zci9lNG9iVXZTUUxFM09Ha0YySEFtbnB5QkZNbFp2WVFxbFA4ZVRyOVMrU0pSVHcxOGZHdVp5V0hSNmJkOWF4T1hraWkwYXNnREk3WDZWMWlZWmZaWVJjcW9wM2tHditxL0tSWW9ScXVKdjRkbkVPUkNqbTRtTWRGMlR2MHNUZkRIS2xoSldEbjFEaEhSWkw0dTlrMDdxSFpJaWxrOWZ3ZDhqcGdyT1MwRVhDcFdEVXFDR0NQV2o4MUxObXFkcTh4QTRCZEpIbkxoaElXV3ZueUZ4VFFNOVNSY0c4TlNVeFlWcnNBQmxUM1I4a1V2azBSYlpxSUFTYU1lakt4WEREUkZBMFhpZTBBWVRJak15bU9LYVMxNGxvaTZpdkNoVHBqNVVjYlRTdW85MFJnc3MxTCtGK1B1TVllVU1MLzFtS3ZoOEZJcGxlalkvRTRkaFlROEZtMDhMSXRIZzJxZmVKVU5SRVpaM0ZCTW53WmRKMmpDeWQ2b2U3V0pTNzh4cm9CK2RkUG5aNUcxd1I5VGhpWG5zRm9uK3pqTUdCTlJYTnEvb2grVTZnbTBxbG9TVXc5Z3pqa09NN3dHdTlJUithWEpOZHZxRks1WFFpQWwxTWpEckpBcWF6R2VYTnJNYmRtMWtZZUVaRVNMb3M3aGRTQ0NNZmdWM1cxYjcxbitCTjZkNlNMaTNnVEQwa2ZwOXdVbmZqTExUMG5Jd3E1ZTJlWVdMdGZoVEZDYklzb2ZoUURZczFSTkVwQzdReGw5NDhwazF3bjdTRGF6VEJuVjFnS3c5VGtvNnYzR1pwMEJ1TURtMmN2VEw0NFZRSUZXUUpmR0g2V0tsM1FrNDVWWW1tMkN0WWY1V0RXaGdzdC9kajA4VnRldnlad2JLVkZNOXltUnN4RXB5WXVoTk5wMm0yRTJ5TTJrT01ldGsydVlINTJRb0xIMEZ3bHFJM3A0T1ljUGk0NE5KZ0d4ZTV2L01zRGRkMGVOSHN1UURCQ2RHK2hsQ0FRSXVibWgzSUtRajJUV2J5SlNkdjF5cWJ0bnFiWGxHcmxUNnQ0bXUrZWxMRGNrMlAwUDg5TUg4VDhnQ0JteUVFN0xBc1FMaUtSTzE4T2NTR3ptQWhQU3ROODNHVGp1TnRseEVSNkk4MytTUlBDVFlsckZHTzBJaW9BRGtrS1h1UlFxcmluMENhR0dUdUpWbzNHSXM3RU5Uc082V0VPbjIxNDd2eThjUEZoZGZYSzNnaVY1NksxR3RTQVRwbWdQRU9ZaXkyL3QwT1JvNWVaYkl6TVJ6THJ6WEpHdDVoQ0NET0pyQjVROWhQZGtCU3pWc0VSOU1LbWZjODQybWtoL3djcXZRbmJtbDBvYVZ1NHJjTUQ0S04vaS80TXYyVHMvbmxMMkljSlF5UHpRNEs1NTNybXc2enhpMGVmenl0WTduSm4xSkp1UW82UW5WYmk4ZFpYcGEzL1g2RDNVR0dLK1lPWDR2YlQ5aS92NjlGbldHMHkvSXIrdUROMnM5QzJBMFh5SHF3R3ljdmZVRDRRM29UdkVuUmFzQWthUXhUYlNVL0FGZ1JtWkpsa1Iyd1FaOWtGNE9MVzNkRFBJNHJaOHBuTlJYTFFFVmZmVUVCSlFqb0hVZG5vTk1kbTV2Y09xYUZtNmpRR3RxRzVQcEsvWnpXQXVwVk56bzYxSmtiZFhrR3QrNyt0aFBHYVRmbkhmRjVsSnlWdm9xdW9vWHJZZlZvcWhSQi9WK0VOcEswTDU2WUplRWNOR0lQOHpybmJ6Si81bTRFaWZ0aytwNlRLMHoweEUyeU1wMyt4ditFM05RQlFQeFAzT3oreklrTHFYaWhsemwwZ1FmYXdRRVhISjg1TTcvYlVUZUpOYkVWZE9pYW50Q2ZpcEZ3U3FEWnNrQ3owa3VSUnlmK3BWQko1TEFnZmFSd0dGcjdPRDBQUzFReFJnRVl1VEVnaGtCci9HSUMxTzVZeTlVcnVMdGRlSEMycy9jSkFXaDBnSFFKWlUrVWVIVWl6TWxJNkxER3FRSkJ0ckNzR0t0YURUTFh4bkZweWk4RFpvbU1HQnJRY3pkS1pkMXJhT0dmRmFvczhONjF2a0pvUlJWQ0xDTmw2SXdlQWtCdDZQOFh3ZTZGRW1sVXppRWZNSmNaVUowNG41bWdJWC9Mb1FSTHNtNm5zd0duNzR1S00vUlE4R2Z5VmJERUFCZUJzV2xoZ1draUhodzkvYlNUU2lOcTEyYmM2VjBTRTl2L0I5UlJuVnRjd1ltdHdXOXh0MWJNcEVWOUJNMDc2ZFpkakRhNGYxOW1TdXdBRDBxeUVaTy92dXpQSURoV3lRRUswS2VhZXZhUnlnMVpwRFlSb0U3aVpBN2lja3JsbkJabWh3WHZvZXNLVDBid1NRWGZMdnhuNU9yL2V5SWNoQ3BIS2YyQWNZbHJjOG1QZ2FnOVM2ajQxaUlhQmtMS2lOeTVtSUJ5NzJYWkFmQTduOU1qc1lybTBSYnEwMHg2aEJabm4rQ1ZYbHZsNmNORHZwOTd1dTkyUzArRXZFcXBRc3RaV0Y4T1E5YnpBT3pXQnV0eDdHbWg2OTMyaUpDdlh5SXV6QjJPZUZlL0VXR0V1OHR4cTU0YTY0MmxwZ0VoUGtuSlZSNTFXOUFMRkpuWjBlQklqZEg1WjF1UXhqMEtUS3RJNi9nQlBNdytYdk1aMFlMTjFLTjYySTh5bG9oUDJZVzd0UGxPL3k1SVQ5TVQrcXlLb3hGdFNkejFjcjB5UWNielpyRWZDSy9Yc2JqUVNsb0tnWXJJK29DZlVWc3U0S0VzdnRzQTF1VDZIODI4REJPSW44R29MK2ZqNkNjY2pyVHE4RUR1UXNJUVdMQm5zR1FWUDFNTXpBbXBOK1FoamRRaC9xM3YvcWNqbndWaHhHOHp3LzhRVkpna3hHUFNROEFKdEFoQWJlMDlZZk5ycTliWnRsanA3dTFqM001aURWaXBrOXdHUk5FVVZxNEc5Z2hycWx3Y2RXd3VyVi8zUDJzZnVETTlRRmcvb0ZWVytodlRaMGNvaTZOMGxkVW0wRmhibjh6TUl3K0JsSExHcHEzWFZwd3hZTWQ5d1FBNGJYOUlpeEhzam5ZU2syd1VMOWVTbEtYaFdUaXFWM2wwWENBSjhTbEtWOWFoRmNmbTlUZE1mekp1RUdyeWc5NnpXbDk5OHdpV1E4NW1LZmZxeXE5SGFHYnVzcTZTVzdNWkJuVEFtYThWS1ZNMGliY1lycXBvSHBPb2dmWlA5THE0cFliTnZFdE5SS3VnKzJlS0lEY05LbjJDQ05wWG12bGszR3FZSmVQN21CZkxNZ2FjRzFtU1lCenh2bUJzSm92b0ZGb1Z1Y3J0V0ZnbFJGTllPUzRVM1BNMWJrVElweVJEa1hQcDJwNE4xOXNtUnhIOUJkZ3JBYnpIYU5tRktyZEptNHhuVFdPeGtRVnZDK0U0OHQrZzBFbkd2UWVQSnluYWFBWlk1S2F5dEFlcmJzMWRBTldnQm9PcmVkNVhRZWQrbEFzdW0rV01BZXgrK1EzSUlnd0NxUUxMK3V3cVF4bEFaR3VqYVN2eUI2ZFNldlNEeklRblhnRDBSVk5aZEdlTzhlM0RZVTBsamo2SzNZRTltK1EvVkwxeHUyTGRwWTQ0MFF5V281N3Z6REwyS2VkdlRPLzBPT29zWENHcVh6QnRDaUNhQVpZc0Z1cStMSDJuL3pnd0FIMjdXWmt2ZXFyWEVaRnhuZDA1dUI4V3JFdk1KTEJwbkdiVC96MTJSRlJnTG5sd3lXczhpaVNsNm1oTE9zQ1JKS25QU2JIVDhJTU84WmN1b1JvQXNRVGxCaWlzOFVQZFZ3Rm9JYUxZV09idC9sQkxaeW5SRWo3cEhvSllWNldTMktacVFKSnRFL3BsYTB4L3czUnhJQyt1YVRUVkl5YjhacnlvOVZMMEtiR3NvNzc2cVlINWVvMmpUWi9tQWdHVW1TUTJQMjFiZjNoQzZTVXk4VytpTlpwZ0VFajN1dFJKVUNKWXRPcXBjY25MVzhPWEdzWm04MWVOS2owMzdOTjVhNTlvYm1iUzN5RUFhS0VlRFhPbis1Vkxwek1adjJ1L214WEhoQ3hXZVRmY2ZtOVJDRlhrVWR6Wm92NXJ1OUtlMWFCR2pnNkVuZzd3ajI3NnBaQkZJOXAvZXpoZkNicXMxNm82RWRYekRrdGhhN29TdlRtZXhobldJbktjYmNKTUs5T2tZeWptS3dPM0l6enVkM0I0WHh3T0Z5eHlSbFhHS1hiVU9La0liZXdEYU8yWEliUnNVaU12OGJ3MEcwL3M2ZGRpai9rbmVzS0lHblJEdExRWit6a0lQZU1ubysxUnV0U2o2aXVSOHQwTEtwN0hMTERaNXU3U2Yrb09UVmFJVGJ3bjEwYU1ueWtJU3JPWnVWZkc4dEVCRTNHaHpoSGtsWXNMcDR1QUpTY1Bsc1oycTYrM2c2Y2FOTFBwK0dIVlpqUWNZU04zSkZlVkphTFlHTlNRTWNydmpidnZYOEZ6TDU5cDNWdXF1cHZwdC82V3JwWmNBWHcrNjNnbEY2Yi9NQjc3ZjFhMUJ4TFdCb1lYRXhHckZOdU1SdWFxRU9QbGhYcTJWTWRzWU41Tk9tS0kvTEVYYmxLM2FIazU1L1poN1M0Z2ZWYkxFWDBnckpzMkE4aEhaZVFhTWFlY0JibGFKRENiT0lUVll3cXppRkNuNTlXeDQzU2g2ZmtGcDJLMC8xMG4rSHI0SUNiMk82ejVoRTgzV3ZhaEl6RWdVNnB1OFF0c2Nwc0FsMzYzTG0zemIwOUdJaFhHd1lySnpnUUtrWWVJT0FlbHpCdFU2bUtPMHVRTEg3TENxNFEwOCtZNWVsdzBadWljbUUxTTVLQ3g2dzBDQVRwR1ZFZVg4dE8vRHVvOFJBVTZOY1F2M1dacUhNa1gwWTJVOHZvL2JJdjVqYmJDK2QwbXh3RnlmTlZIMWdSdTl5Y3hLZjgxNXBEcUd1WWs0RmQyTTd2RmtDNU5XN09ydHM1UUhsMmdab1hqYUFOOUlJMTBESW5vUDdqcE03T2tjNElGditMeEVwNVZRZDMrTXhGWXRSekI0eitVWWhTMzdia3lJVXUxVjh4Zlp3SWxFSTFCT3dTTzZiWHhZRjlYUlpnbFhTV0dUUTNvelFtNmRaaWZlUWJjRnd0MlhER3VXbUQ5RlRvbmttQ1NIeXBaOFRaNlVIK1JHNm5FQ0VaNVRBU2ZhUUNCblBhZmcwWk40bzFNdllROUpva2UySDloWnR3TXRhNS9Zb21EQUxZZ3hEOFhFeDRZSlIwRy91bWN3VFUydXVvZ3JxdkkrbDB3K1JPTk9UZWlzUnZNZTFnWVRWKzRtSkNhdzdsN2NtV3VVRFAxaFpEcmdEdmM2SW5vaFdjVUQrWmE3c01WVVJLVVUyclBEckwyazVSbHIrb09PMndKN092TUt3cVNsRkVOYmxaeEdiMGJEWDFVRTBEV1RzeWdGTGtyd0hOQjQ4MHpXanJYVVQvcWMwTnd4M0tIOWlldldwODFXcFNPWE5SdjJTODN4aC9XMFVOd3hzcHl1aEZuZXZEZ3pXb3UyelpmRkNCOGd4cDlwdmE2RkVtd2VReENwcXVYV0tmNXVIbXBhUzRpa0lKQjA1bERVUmQ0c0RNMTBDQ2NrUVRKM1gxNzVLeFE1RXFDQVBvZFYrOHpaaXVUQ1YvNk5mR3F5ZWZqZkhqeW1RWGszUkdvelZ5L3REeXJpa2V5cFhoS0tDOG94eVBGRDVLUnB3Sm1oTTNVUktVY1Q2R3YwK0lpKzZKY2tOblJMRWo5QlQ5c3J4VnpFSDZyNTcxQkd6UENTWC80M3JYQ3Fldk5JM2NiL2UySkFDRW9SVDFibVdsWlJyL2hXdHNmZXZzVFdFTG5nNnVKTzRETk1OcitlRzJIR1lOM1g1dURwSEdjb3FUcXlZbWtMZ3dObTRtakkzKzFYZW94dHdJak9XSGdxZ1ArNnRXeEJ2N1krREVxcWRTalJqVXBrT0FjcG8zNTRBVFZmRjlFVjBDRUUrbUQ5dS9Bb0RtcGQwMzhOVm9xQ25sMEpjVmJjMHRrZ0h5OE0yZzFpNDdFMTBpQ1VhWnE3S2QzMU5xcXNqaUFwc25weEkzUGU5cEtUNVJGMHMxV1pkb0hsWlFTcHZ2NEJQdnAvdXo2bnVLNms3TTNTU2gyMUJZNUkvOGdMRCtDRFFCMFhUYlBTMmFnNElnTE55eXpac0NXY1VjbC9aMmFyRGV0N0ZFTXlIQWprd25WSFdySmVLd0hTQU5kQjY0L2x4VGJQS24vQWg1Zm9ZaFgvRkhZemo4L1VJV0pBR3FBOTRReWsxbVVuNmdZelN0UkJKd0RKS2E0dnhTZVZ0U2grUkdPdVJseGUrZ256MlpTRGU4VWc1TmdOckI4c3lSS0dCQndYclJJNERxLzg5T1ROTkhGVkVqYzdZZ2U1VlFnTmJ6ZnJ6TU14dFRUcVV4dHlsaFNyTjdWbXg2TVk0YmVVcEtzVlQwRitIZzgwelkvRUpjalVrWldFSm4zOGczd21lcVVlZm9UT05Da1FPYklsUGlPTjhFVlJUWHJ5VGdPZzg5NTI5N0w4WlQyaHJzZjI5N0R1TXBweng1T2YzSzVOR2FyUlNYa0FNR3NnOWY1NlhYN0NlcjFpbzUzY0g3Rll0OHpsSlJmUEQ0M3FQNzZpNmcwRnJUWGlqUjZRMnY0ZjZoV0RoYXFsRGZjQW9hZzdkeEIvTzVtYm1xUWlCVmRXUFdaUSt5SHZ0aVVzYkplZm96cUJLN1BsNTBvZWRxUndlS2dqYVBRUmh5ZmRJakpRZlVPcENuL1BGT21TVlF5dE5YYXFGS0FFUlVnZ2FjQm5GSnR4YUxiUzFIdlY4RG04U3lzRGNwVnIwaTF3UklLeVFKUTlpVHZHYThRR0R6eGQ5N3JlZk93UDc1bjYrdXNuMDNEYXpDaHBzU0VHKzZRQjRRUGpqZ3pHL2NQeFB3ZUgwMVA1bDZ0OFkxc0xBSGhVTTM5dzhMWm53ZTNCQWlmdmFXSXdIVTlEY0tSRkN5SmdzeEFTTTVvMWY5M3FzN1Q1RUVDMkV2ckdZdk9jbWEvQjF4czZFSEQxM3VlbTgyRW9UT0h4L0hrcW1LdjlCSUxyZXByRHVoUlY1VjIwWGJiK1dRaStsMllVdk1kb2RTRzV6bUNoRGNtTWtGY29mNXZlUVZJZXVyaTE1OTYzTkxkS0M0Q29hMUNWWUo5MmVjNkVXUTd5VlVNblhKaWwvS0o0a3NySU1WZWh4ci9mM2lKMC9DMkpvTXQ2aWJRanQvVVRvWWJSTXNtd0QwMDk1VnB4eWV5QmVDM1NabkhGelZZbWZWaGFkanVvZ1FEOUJ2cUZTY21tVlJIYkI4QytTK3UzTngzZmVUMXhPWDF3NXZuVVJHT1kvVEo4QXd4RHVTS1hXZVJkdThxRzNjRWVTWDhOU1RTTU96NGhNSFlCcWxRb3c3N2hTL0gwdHgwNGF0VmdmZkFKK05QeHBVa25jZWh3SnAxcTBLaytXQmwxak53eG8vTDBHOThqRVgyTlNnZE9WWEZlNWVxNDNjbUx0bmZRY3gzV2JKRTJZNjdra2xxWG9PZEhlKzBoU3BWRmFIdC8zOXRxUXRLZDVVN2Ztb0ZKNEhEQzNZUEJNbGhhdnliVnVwMURQUW1pdnV6b3RUSis3VklGOWNIK2ZMN2tTVDRTVXdtWnZ2emxkL1o4a3RDdmFQOE9odDNuWkt2UGgwZXYwbkxwd1RsZkRaOFRONEcrMjdrNlNtRk9Fb0lCVE45TUJDSU1hQm1EV3VqM1NIMmtLa0R0ZGVZeS9mb0NOWXZSNmNaL0hGWHU2cFZZVTJYbnpVVC9xbmlMdFVOTW5hWXM1eXp1cVYzbHFkME9mWXNlZC9jYklKOTlNKytRWi9zZjV2eHZ6TXVaQVp3cjJxT0FwWnlnR1lmaXBJdWg2OWFRSlFFTUJnVjFHdFpFUFd4c3pzaU1ESXVlaVNCUXhjTkJrUGlaRkovbzhVSStuem9uY0F2MzJpNEIxT09xaGFmMXhoZlh2Szg4R1c4aUt6VkZlRzIrdzNIb2FwNzcwMHRCM3E3TkdZSll5VGVjQjg1bnlvRzRkblFDSThNZThEZ1hIMVhZTDN2cnUxQXZsSHlwamtYV1ZJZXFkMzRlTHVRUFZIa3lUQjRobldrNy8zalhXbjQ1ZlloRGVuREdzeXc4VmhhSVlDZGlTRWdJVU4rclI0cWtzbjVZMTNFZkFzbExvaGFLZWFHbFA4Y0YrWUU5NjZDVGZ1QmFDenJCZ0NtWnNuWEdlYmpNVVdwSmd3UCtVV2w0OXFhNFNJN3dvQTlyNVhvZWFaTC9GMTU3MHNkaUxNUFdGQnVWSEJONUt0Zzd2emRwZDFPS3ZrQmY2N0tIQlphVFpmcTRZbXZ3SU9KeExaM2FzcktaeUxiSU1OZnA4TkIwOEdHQ2xmaE9yOXF6RnMzQ3dLZ2QxSGY0cmVEVExZRzFvUkVpc29tQ3lnV2k4TzgwY0NvSEI0VUdFNjcyTnpscjFlbGxUd3kxT3N5WFRGR0xwZjN0OTd1bzBDMmgrbkNudWoxaUJJVXhtVnZYNFlsNVFWUXlqR2ErdmZwbk9wTzJsd0ZuaHhhUVh5SUVqaDNvUE8zOWQ1bGJEMmQweHRlWWV6VzI5R29QcGtFMmJnemR3MzRzTHhNTXdUUjEvVitvb3Q0djhhNVN2OCtPRXZ2K2hxUWQ1OXBvYzB2L3puR09xN053MDc2bGwxZDNKT0hadGVmdlVBQlZmVDJidzMwenhBUzltYURGSHNuZVlxd2lKeXJoZ0NwK0NoK0g3SDVWcGcrUDB4Q1FkVExEczdlakU1OHFFN1d6VldoT3UxZFlNNjdxbi90b29haWtLWTBSTW9HY0hhemhibUNldThBbEJUQm93QkxZWHVITDFna24ybzBCeXdKNnl0dFNsamRDcFNJbS9ZZWhaL01ZVmdTekFOdzI0MWFoYzB0QXpYU01BUHlhRkFSMUxLamRuc28zdE9QcFh1SVl0UmR1WGFOejh3VjhRS2N6ampQTlhYRHcxYnlpT1pYc3haS2pPZWdTQkkvLzN0cVZKalZsWDF1b2FhYzZzNzN2NU5PanVPblBGK2dZRk1VS1FWOXBaWnpnT2F1b3VrQVd0ckRMaXBsWUhINytEK3N4K2V1ejNpRFR3RGFMZUFzZ0R3SkdMZ1ZMNENETFo1eENZYTdySVUySEF2bytTRHMvaEVVUTQ4YXBuQll6bHVjMkI3SzZETHVWNEpnYTN6dDRmMFFsTjBLaE4vQ3FHNEhlOXYyY2duVmwyc3NwWHpFMTF6aVBsOFpqbmNvWXlzMzRiQ016SFB2Y0FzTm5jSEtuVFlOSlBPaW9TcHZLNkhxWFV4NGVQVUsxQmErZ3QzRnZoK00wV0lHaEhZdWt1SHo3cFFsaDV1RTJidUE4SkcyM2Q5eGZENzRxS3FVS01sOUZCK0c4SjJRT1lxLzJYR0NPd01RbFd2NXBaa1RDTThwWUs0TTFxZldwYXhRTjZYQzlVdTFEUDRMcU0zaDNnRzJob2VZYThlUitQM3RiMERTd1lKcXF6ZzBZM2VqUi9qU3N0azVaWFhyMFdPTWNySE8rRElBUllMUE45ckU3Q0F3Q1FtaFlCYlJwZzBwaFU5bnpuYU81Qld5enZpUmdkRnZWazJNWWxrQVhwb2EzbFRoL1lZVkRSU1J0b2hMWnVBbUpCMmlMOEsvZkhEMCtpeHFNbTBpNVhRdGNLbEorUFNkZDBkQUtVcFhlM3o4L3pYcDZrZnJQWkpHS3grMnZ0b2x5MFljb05mQ3k2ZEJteFVTcElxL3BTS2FVQklQVjB0bFE1RkVJb3ZMMUhER1NKc21NNTRodGtudDdpZnBiamJjUTV3U1ZPaU4raS9FaTlLbmRvSER4NGxYcjZDbUc2Skord1NhTDM2SlFBc3V4Wnk4SDlXZUdVb2U4Y245UVp5YWMxdlRMcktEMGtaZG5pdFRxd1dzdmU0MXFaMnpwT0xFd3FNMEFJU2NXQzhZeWdyT3dSYkJlOGFGQ0ZhS21RZmRvcWJuVHQ0cVpoeTFOczRxUEtLV1FrVDNjRHA2bDZQWmg4SlRmV2p4ZkVTYnFQMW5zMlAyQmlOT1B4OUd2VVRvSXM0ek9VYUVRR2xDa2o0TWZiVmxESk4xMXQvTjZXeUttMzFTVjhJUkV3TlRtZVBjQXphUTBJUml2Y21ycUxiR29XajdTbDNoWnJ1NytmYXBwaWpyV3Y2aGlXNFlaVTB6ZFBoTlpvbVplNSt5bmEvMGVQdXNYdkIrLzA1bXhSaEJWR0tMZWVzbk9hVGxMd1Z5ZmlHYnBlU2dzQnAwRHNWMmw4TTVxS2tsUHo4RzNDNGRRK0UxV201WkNVUVA1RldDblNNQmFaeUQzRUwzc0p6eGx1L3BGVVpYSHVPck00azhzMUhCeHo5eXVKR1I0M2J5ODZTNzBoNnpKMi9oNUVjTVAwcjgrM2srdWJnU0NUcDM4cmpCSGozdHA2K056UjVERFVlMjVOVEFiQXRzaGZBeGpHRDlFTHkyV1VJMFEvVTl4S2VxbGFXZXd1L29XNnhhR3JlVzNDUGJkYjc3RUhKTzBrcnJKeGJlRzVBTnpGa2NWVGR4bzhOZTVNMjI3UGF4c2xBRlJ4eDZVVk1CdHhvbURmVldmNUpqWTlwRnVTd3FPVlBWdlNwbWVNcGYwYVFGNlRDSWdUanBUVlNLZVU2TWxKU1NlTkNhYTNYeWVMZE1rMzZjVTNvS3dERG9GWVdWMzNlTlQzMGNMa3FTQmZCZFArT1JZWXdBKzVvcnlvbWZsbzNjY0FqdXltRXU3a1JPMk5LWThZWnlHZXR5YTFPSkJlVUhIeTRHaFZ4Q2d1eTczZFp3UDVkR29lTzB6UUZCT0QwNGlFR1JmNisxdFo2RDJWUVc0cXl0M3ViRllNeGEyNytnNVhvWi9wa2hUNU13NWR4aTVpMmxRNlhydFRmRmd1blVvVitnMmovNXdDa1JyY3VzSkNXbGcxUHhMMDVsTGNGNU93OEhEL0JZU2xoNlVESkpPSjk0M0NOUlR4MjBWaHdiQVlydkJhbEg4UW12WmphOUh2a1M3cUsrU1JWK3NiNVF1L05TdTB3RldjM2pTblFTK29iQXlJTkc4SGd2TnhuWTFjSCtSekl4ZlFrbXhzMkVaN0cwNVBOc2dsVUJuWXBUMkZYL1U4bzdvRE1vSUVzdVBIenBVRituRmt0aGdmNUw4bVo5QUlHT3o1MkRNbmpmK2lQQ3FZY1RYQ0xOWTM2VmtYRHFCMWR2aW51cnFTZEJzbjlobWJxdzNIa0hQMU54MGhqTnpyMWYwSmYzcUVDRUgzMWxDdGlsNjJRSHl6WTFMTnJjTW5GbFZ0RTZsa3NnblhUL1pYMzAxZlBFVHRrbzBOd1YxU3hpV2hpL0liRVNSRTRIWWJDbTh6VStuNzlqb2loa3BGekFwTktrYjdtaWMvb3htM1MyZ05GYm1XclhsU1FoL0o3NTFGbEUwWDk5SW1mSUlsSjFrUjZPa202dkZOaDllRkJZL2g2WmJZYkovZWlXdGJmbTdJU295MzdCTWhua0tRL3B3WmNNaHdxTGIyTTV5WWtKZnNvaCtnU0pmMlNkUjhGMGpxSTVyK0ZaQWlCVG5CdHZTMFFhY1dkK0o4cmZzYVUrdlNESUNIbS9xVk5RSi9BRWVHNnUxYnQ3WEYzemoyRk5hQ1p3dUR2MDVLYTJkUTJ1b1FCUndXb2dmZ0hFdkQyU0I1aWdYL1NlQmV4cW5YUnR0SGNudVpYNElHYTFrS0EzZGpDM0NTcVJDYjExbkpLWjRRRERSQzd5OGRWeUViU2FRTmVQWUlYV01JR2Z5STZxUFIxOWF2dXlRSno4ZGdhd2h6WFpwdU1VVU1RdDlQNTZkWU5RaVhQMG9TZHQyN2ZTWThpcHBJTzB0VURGWmtLK3FGdk0zcWgyTGpnb3R6T0daYUp3Tkc4V2E2a1luZkUzL3NaTis5YlNRMUVwRzc5cVVUQ24rc2J6RXNsUngrYWFaWkhiZ0x5NU5RUDl0UTJtNHFaZnZmZ05xaDJ4Ykc1Z01QdlVZQUtCaWZ5SXE2OGhHeVVYU3RQblA5Slo5UWNFTlJTU3l1cFJrOW5RZnBKdWdZbXB2bTU1MVFVbTRXWjh1bDRKRWtkRjVDU3g4RGY1eU43RjBLSkl0alJxRXdOd0F6enhrRlE3cEVHY3VXTjB2Vzc4MUdTbERYK2E2NSt4YnJGdTU5Nm9jOUxzRCtDYWJFVEI1SkNNVjdLcklBZHprcGFOYU96QzJhODU3WFRwZys4OEhWYjZpNStxb1dTR2dOZFM5RlVRcjRRTysyU2JHTlpERDcxVHpvR0o1NlZ4emN2UGJOUWRBSDRmUVBHbkUzMUE5QWxjNWk3TStwTHVJUDNyVkJ1Z2lMRnNMNHlKMkJzQVZ3ZHE4aGVEMVl5T1NmYVB2alpCRThOb0luc2JPa0Q3WUJDWXhhZEJkS0NicFpSaEZYK3dpUjhQNlhHSTZQdjdTWWpxMSt3U1p5SlQ0QzdDNzN1eHl1WEVrNW54VllUM0IrdUxQQmFoOFpFS1h1NVFvdVc2bGd0a2NhTC9Ockh2c0c3T3JaYWZYTEdSeE9YWE9jRDYwTkFQczdKeUc1R0VTRXFJYUU4YjduNjJmU0lxWEVEVnJTUVVRUTJqejZkb2xsbDMzZlhvaHRlNDBrTktIaFF3VnZnWkQwUGU5YVJmV2VzOENnWmVLbFZPbndBMWh3WFRxZllRbGR3Qmd6UFV0S3J6RmhIMzAyeUFQQkdVeVdWdndzWVNYU2l6RHZEVzZybjBJdGIydHVOZnl4WWMvZXE2THdEbVVYWkY0UkJhRU92YWVUYmpuNUh6bFhqTUcwNnIzckNEUkRFbzA4aWwxNVpuS2g4TXFBVVVjUWZQL1lQOUpBNTQ3Y3BaeS82UjNsRC9NOG96UjdMdnRYelZjdm1rbHhHNXVteWYwS1JibzlOc0VrdmNwaHE5U1FMcFBaam5oUFRrbGlZQUdjcmk1cDQya2M3b0lrbGc2YVNoQXQ2bUNSeG5XNm5aS1hIV2F0WWFQdklnYmFDUHhGV0RvcnlGZWNvbndQRFVkRFkxbXdKRGl0MUNHeEJnL3lIa25maXQrYWlCMjVpZlA1UXdpSkpVelVJL2hLNEJYSnRRN3FSUVdhRVh2WmFhREVXQU1hQ2xIS1p0Zm55SkFuaWk0NkR4UHlqZFhHZmg0WHVQblRVMGw0QWF2dDk1Tm1OZmVVeXZseXNiVm9hY2VFNnlSL1RZWDUycStDczFqTDlKaDNiNXhwMkt3OHppVUZQVlpOVXkwMEZtalY1ZFpudkU5RVkwL0UrbGhUMGp4Y3FPb3BLL2g5bUxhTWFGOGsxbWM2dkE0dnQwS0YxRUNVcE1jdTZyZGdrMi9SdFl1VjJvblZuWlg1TG1Ha3o1ZzRYeUR2dm05UW9iMFRhMFNzdWo3bERrWEFSdmg5NzN5eFFRTEJ6eVVZKzBML3RON3NucWt6MXF0TUZROThpRlJzUlc0QStyNndidTZjSFJlUWNlVTZxZTRySFRQbG5HaEg1blBkWWpraUFERVl6a0xReWhCN2hxK2dCTHFYODV4SkxFWHA3Vlh3RmdhNmNNa0E2cEphRUduOG1FOWVIYmRNYWg4YXVWenJsUXVzdnZEcHpTVHpQV1BwYk1CamNuYXczTTY3OUNVcGd0RUo3REFOYkVPNFV3RkM3RmZrb3FiUzh2U1ZiWGJVaUJja056R2JLQnZJWlRxelVsdEp3cXo0RGhVZ0l6RTYyYzlGNTlsNU9mT2ZmWlNqdU1mdVRnQWxwRnYybEFiZ1cyLzFyendrSldkL2lZbUQrU0VuOGVnT1BITmtIYnlmNDRWQ20yZ29sTmo2blRXWVB1ZDZZTWlteml0akNrUW55L3FXNlNiTnVCaSs5cW96dlpCZW9ES2I3SlNEN2dTaHpaaWxwTlhvOVgrSm4xZHFqVlBpYXZvM0lnaGNTaTU1dXQ3YWlraDZncUFkSk5OUXdCRXV5WDFIaWZSczVralRzL2h6WGpLN1p3ZDZubmVBUjFtNFpJWlA3andNQ1NIQVpTU3QwamxQSGE1Vy9URS9BSVFMTWlZcUppSHpjam1NTlRoWkxqSDVlaTFxNzVBaTZPYVpWQ0N1OUlBanFRWW1xS2ExL2FxdjhvZzRmS2k3ZVBKZW1UWGRyc29WQStFa2o0VktjNGFiMko2dzZJMkZxWWo3VW0rek9BQWE3NW1zbnRwN3JzTnhLZDVuUmhMZ29ORFdFcm9lWi9SQWhiWjFieDZqUTRoU2tPTXU2dVd1b3pGYnRaanU3cTNTVmM3U0NTWE9YelkvRGpISUxTNm9ydFhqU0ZsZnVnSWJBM3RqWEJ0cklsb0czdUNDVGUva2hiUGRJbWl2MEdXN2VxdGF4Y2Q1cTR6dWdhS2l3TmJnaW4wVFViU0huR2tBNHJ3UG1PRWMySGxmMlNQaHY0SUJNaVZaOWg3bVNqclUyOHc0aFVtOUJiMktjbnVIUlNGdEthek1TVGN3RmtTVEZ3ekVJRG5iSWJBSWlCR3VNclQ1TmJDREhGUWRDVVI0WlFLQW11eHN3eHBXY1NJdW5seS9rTUJPL0lON3JrUnR4STJXaTlVWW1kdEcwczAvU2VXbHRpT1pOUnpROXFZa2gxQndIWnlVY1BHZmpwbUhyYTRyU2JvM0JSdlFKTjFIRFRXN0I1YjcxdnpMbDN3N2gyN3NTQ0lMdG56K3JZUTFUeDVHeEtLYVBBd291Wm5Pd3NDVTduQU5LL2gxR0FrUnR6Um9SVWFUSzhmcUxMWjhYa0lMaHBmVm1WMitJRXhPN0xDaDN5ZzdrMXhqQzNaTUJudjRVZTg5UDRoclYrNjVNY1BwVXFGc0FVdTY3K082SXdkcjlaYnVtRENOaFRvWFZMelBMRCtCb0tud1V0SkQ1b1ZOUjc0QXpxU0I2M0tCWkZHcHgzYVUwM0JpN1lYblpxdEhkMU1QUTNMd0w0RmptWkJhYTlNdWI3ZWZyeTZWMWdLK0tHTVkyNG9pd2JDbTNqdlV6SzJIV0FwUHo5ME5od05qRW04MTNRRW5UdkIrNm9kWHFrdkR5dGNDWEpMb1l6TnBTaHBveXl2clJ6RW01aThheU55SUJqVk52UnFvTWd2ZlAvVzB4eGFKbVJ0NEh3Ukl2ZkJTbHFtd2NzUWQxRkl6Njd2SVVrOTFvWXVCeWlXNUMxUW9KQ0VhNTNyc3J2NG5FR2txb3BHVGIydnBVQXZxY0VVZVRsdDVPQTJwalhxQ3F6c05aWXFEVnNQSmJEci80eEx5d0k4cHo5aG54M3gvTHBsRVZsUW10NzNHYVpianowWks3dHNaL2F0T1ZTWTFzUE53TkZzc1N4eXJnQjRJOUk4K1J0TVRNTWxCNUNHN2lZUndNa0ZVK210anM5UDZrdmgrckdCeCtUd3NoMHRUWlVVRjFUNjRoSXdqRC9BcU5aRzZkL09QbUcxc1V4K25JRXR0V09JSklXbTBZMVl4N0pqVWZqRkp0K01SZ2xNc3VIWk5kenN6ZzhaU3QvYkI2RzVyUFhHN3QvNHE3ZUFPaEYyNzhKNHpGc2ZMTGFKSkFicGprMFpNaHBySzZoVHhwR1Jqb3h2U1o4c05USW12bkwvQXNOSU8yaURkdmVYTXFUTi90UmIzb2c2VG1zb05HWFZuZUk5d09wUmErRUtwVFBWMkh4YUoyV2RNMCtaTjlRZDA0SUNoQ3N6ZEZFSitWN0hkLzRQalRWQ1pwVHhBSFhsUUtvSXU1bXFhYjRKRmZ2UHZWV1RjN2J3a2lEVHhRcVNTazhZQzN4Zmt6Q3lOMU4walpwVW5oV0FaY1pxSE9qOEFHd2Ezcmo0SG1hbk9xTmlvY29CTEMxRGZNRmxTWTBRVkZHZEx6Z0pCYmNra3hadXY1TE1VZkpJRlBXSURhZTBsdDJYZDBFMzZiMy93ZEh2NzdpZnJOekhVUjVuQ0pRM2k4UExTMWNaNTRVbDhqa2RoKzlLRkxFekZkRkRHZFl3QWFCelBnY0NCeFprSVRMTjAya0JUL280Tk9NMnhSMU5lREFNeFNOWDlVMHUyYVNwZVY1TTdIK01YZU9ocXZaYjhQQ0NVbUI4d2krZXZLQ2poOTNUUGRDSlQ1NXRjNVlTOVZmUXVqbGVaQTV6U3IwUzNUS3BkSEo5VEhybVBqdXZXUVZNUzY4OWlMNDVVSUJxTmdsb3FnT1pRN2MzUlN4VHVuV1FpNm52RHA4YUwwSktndjhBNkdqVUdKUDdoYWhKeGp2dHRPQ3ZZN0oxdUlId2txTTBwbkVVYU84bTd2VVorWDg2Y21sM3hHa25jZzVxSVhXc1VPMUI2YlhKQmplRVJ6RWR3N1c0aW81bnRvbmVWbVVodThVdW5xR3J5a0tHdnpHcW5qVkUvOVczRHNGM2RHMzBKbHVqYkgvWDRBTGE1WGZrVy9OT2xoNzBRSlhvQWllb3RRL2xvZmo2dkF0S0RUMFV3UXMycko4MXJrNmo0bTFGSDdUMm92ZmhFb0t3NU9paGlNMncxTk9MTE1URWduWjlyVkRTZnc4NU52RHluQjlQTHR2eFp3UUNPbTk0dnl3QmVzVThzaUpSTlBHazcxNzE0cDBla1FvT3FoU0tndnlxMmI2cUJzS2w3c2R5V2Vyb3RjQUxUWmI4T3I5a2FVOUNFbUszRmJnZElldU5CbHdEa1QvWWNHVUFvcW8zUjR6YVEveEJ2Wk9xNmR1M01wMGttZXpRNkY1QlErUHBGOEgzcVFZTE5oTVVzY21BTkNpbHJhaTZlcGRvMmY1MWpDOG96dDNGUnB4YkVKUmg4dzltZjNRWmxIczF1RGJnS0ZtYU12SS9LSE5HTGNiQUpvZndvS0Z2THFNbjArMm1CbUJrdHBWczdOTW5Lck1ldGtHU2h1TkQzMWdwOXN5THBiRmM5RVE0N0dpek1tcGdCTUlZdUZkR2ZOWXZ6M2wyQ0Z2cmN4Ync3UGtDNlg0L3hKa0dKUjZ6WnNBb0k1QkprdTFMSGFnY0s1bUMyVUwveHJzSEhueVJEbTMzbTBvNFJ6T01QbUdSTnRPUjRDQ1RvMmc3YUpuZlRLeERnU0hKcUw3aWp5VExwWGZVL2VEU1V4WEc3V0R2RUtoZjZFUjBJbHZQeE0vMEpTaGtCZFA5L1o3OHRBYnVRb0lMVFd4bFRSQkd1QjRERC9QNUlrKzNpQm56TUl2K0RXdDlzK1pJcXlJQW9nKzRqK1l6SjNwZ1VycFdTQU5aNEhjbHVYMzVhVXJrdFJOMHdsdkwwcm9STTZKYnVsYWJqSmxDMkFndVBQN2FSYlM4bXhNbWxRWmhGMVNsWTd0Nk1UaXVkRXNpYjlxN2VBZFR2cnFQNGhsTVp1WVhDSUhPamlFMnVSZGczd2txVEd1ZGVxbkxGNmxqZ3FYWDNXMGhKZ1U2bUVibjlxejRPZXBZMENham5WUlpzL1A4eFdQZE5hTDc1UXRnSWhRRytJQ0NZcWZxakpEMkp2T2JLekhsQWtjamppVnVEdWxjU1FtejAraTdnRFVtZkxSRXZMUk9wVU5MS2VRazNlajFmbjRBcGxVcjFydlFJOEZ1bWZyMDBOek50Z21zZ09TZ01OV2dlcTJmZmdoRFpHc2xSeWl6K3daUmIxazR0cEVlaTFtb25icVFwaVc3QzQ4bGRMeEJtdkZVSWRUdVVtQk02REJZREhlZ1IrVFp6NG9yb3BpNVZqYWpIUm5LL1hnSDlqM0ZGSCs5WnZIMHJidGZxVVgrYTAxVEtzNW8wT2F3WTlpMFFXL3dKK2V6ZWJVSzZjc2plYWk4OXF0YmU5RGpTY1E1d2IzaWMzL1BET2IrNC9mNThHOXVSQjNsLzMyYjZHSXVTOUZjSVdHQWtkTEVhQ293Q2FPR1psUFZWVVMvbnAvZU5KMnFUOWlydXVVdWpaOTdONHJWYUowRUpnU2lkYktaTGs4bDYzQXV2M0tvZjFHb2pzbFkvUG16c1dGVE55Z2JRNkdvMGplVDFiRUM4bmEwSTRyZnc2cHVGY2ZLSEkxclJKd2RLUEVHa2drbVFrNE44aURoTzFiZHdyYzZTVHkyRTh5MUJ4M2RrVVgrS0xldENyUEkzRlF5bkNjWUdQMEtnUEhydXN4Z3B1djBwam45aWFFK1ZXejRuN1FzRmUyOGhOM2hQR1BSU3REUmp5L3p5eklYclkvd1RjS0hYOXEvbkVTRTBBM0pYUmdyUVdLTzN3bFJHSmVQWXRXRENCS0dlL3BUd0s2R2F1NG44TnRqTU9TSFpIdXBCeWEyVHRQN0pJdUlVUTROY2FCVFJqU0hnRFlGVC9ZK210TXFxclVPZkFhRzd1aElsNU1wVHZNaFkzSWxJYkhmNytPSFVWbjl4cjhtUitmRCs2MnhZdWhHOXM2cHlXUDBSblQ1VXpiY2o0NWp3dUxtb0VSNVQvbktBQ0RDK2FxRnExbGo5SXlpZ2FZbDUxVGlVa0NKb0g2Vk4yTVFzWldWbm5ERnR3RDB0ZDZBK1htQktpOGo2OHBLRDFCd2xCWXRrY3Q4UThqZ3RPWGxFdDVJcUdjdFQwSmEvOHliSi9VMlZYV3pNM1hPS3d1Kzh1N3NJZjlWcVNnSWx4bHNKcFp0N0JsZDFUT3lOT25WYTduOUZYVVpjWXRwSlppcGFJMFNXeFRWMHNiclkwaythMFV3eERzUEJUbWtIMU4xVDJSYklReVBPdlF6aHMwT0xtbHFjdXJEV2pKVUNTWW5TSWdHOXRhRFcvVzI2UnZVK0cxZyt1Q3orWjdtcnRWTUlUYk9LeFVnd0Y4d3laQ2tsdE5sbnAwNWpIT2NNUTA1Ti81UldGSW54ZWZnd3FtbzlYNVB1WUZnbTJwSjQvSjhkTFlwdmkvQU9NUlZvMU54VlZnTWZoS1ppRUpKbVFJVGNXUE1IUHZXOWlaejM5QXFQbmF1cFF0Y3NZMUdqWnhjVjBKb1V0dXZJeDZyNUdBMmw4dWJaQ2gvWHlvdERwUE16cFFNYXpTQlN6NXRmMUxlOWVrTmJEVXhMQnJQOTJqMFRBRXc1VW9HWkFYRGlKbEhYeDJKOFQ2VzZaM1ROaW1tMHdZWXBvM2s1S0JNWm4rZGIwMS94TXZJOUkzY1ZWOVZqVlBmMnQ3alE2SkpVcEhUSFdaRXU1SkRhZ0Y0N096bWl0SFBYYkhJeDAyTnI2Z1RmeC84VWYyR1pPTG1aNVBpOFlBUmlSVkxNTThQb25pa3JYa1JQaW8vM1I1bHkycjAxY1VVVDdVdG1vRXRnRjlKd2pQMWZsaUlPaitENkk1VjlrLzZqeDZBcjVyNStsS3lIdkovMElmSzBiWk9saDNFL2U2d05BaVI4Q1ZpNTFEL3hnR3krS2VLNHhkV1g0dXpjMTJ1dXM0WFgvVVZRVEI2K1MvR2EvWlZ1dzdnUzRucEhuWDE0M1p3NTM3OFhRUm0zNTNhbTRVdldFcHRTMDZPVTBnZDFEWUFTaWFEWWsxbTMwWjdIZStPWEZKcjMxUDVFeXQwaVBkd2UxaHY0bkl2WFF6NnhZN1c0dndudE9PMkZkMUIzbTU0UFh5Nk1WWVVjVjdhSHZERm1laU5uRGgrekhxanZCK3Nza24wa0ZTNlFrZkVSSVFxQ2RyWW5QUUZudjZHamdSTjlnM2hLZ1YzeW9nL3pJei93ZjRsWjhZUUxCWUZpdEh0YU1RMmZRQ044cDhFdUgyeURpK21ZWjlJVnc1cTdjL1lHd0N4SHp1Q1RUKzJrSUVLMUdvbTNWNWZMbmdqUDJqNmk4bnYxemNHZk5rTUdPYmErcmQvRDlMZ29NK0NFVGZXMmhHbkZFS3daKzZPL3B5alBrWU5Teko0QlQ1V1MrTTYyTjE0a0lybGs4b1oxTWprTE9LVWRuc1kzT01VcDRjVy9Ua2c5Q0E2QVlObUZaWmsvb2xXS093OFRDbDU0NHZFeVlOQTNweHRRcU44WUxjL3Y0T0NrdStlNUc1a3JGdFFtSDJQWkFpN2NnTkhNZUhGK2t4bnlMQ1VMTWR1NXNwajV4cmw3c1BocElzODRLZ1VzYmdaTk9HSVd0WHdMUVNxaTc2Z0NBKzBEdHpSeTBBakpEREV4MUxhdE83OEtlSEtvZGVOWU1ScU5HcmlOL0tKMjJ4cFEyQ2g5ZFBnbklKb3VSMEh4a1ZFa2l3UVFrTXk0OThJb09LNEwzOXdKaWRVNkhlWnhVRi9xN04yNFlvaFZNS0dTRnZzajArYURIK3JSMjdUc3ZKcjZwK3JvczJCZmFjdmN3em1vajk4bHY1d3hRWTJEOTZVaTVaYVdmcHR2NmxNRi9vZGpYNTdCeUV5UmRBbU9tMHFyaHZuWEtyMnFPWlc0Z2p5QnZLeWN2ODluT0FJdGZSUGpBVXVFODdlc2JqNUZZL0t4b1JDVmRzUnk2YkpVRFZjbVJMZ3VMd2pmd0JzVnNodEN0T3NHUnpmeDk4a2lRbFhQSWFsTWVWVWx1cE1IQ09yWXd4M25WTDBwRUtHTldJMDAzMlZLN0hrWWdDR0ZUNzhtdTY3RUlDdFdHaDdPajlVM0RuSGY4Q0kwd3ZVVzJaVi9hbFQ5VWlzaXpQSjVsWlR4Y3ROSTJBZ0hkSUljYURBUHJ3ZzgzeVBNeENxbldseUk5ZTlKdms0Y0prWHNSUzRpOVFxbjE1T2Vja0ltbTZ5c2h4S29jUXBwNk43QjgyZWtNczh5NVdZeFhBQk50SzBqNW1RTXhnR3VTNWlnckx5T0IrWStXZjg5RlBHSG9kYkRQVUJjbVRtUEZySWNMRUZuY2Fmb0NtWnVZRGdtajV1Umo5NU45c3hvYldWUmRDSVFtR1BDUEVoUk9hTitzY1ZmcldrbXV3OUEvamF3Y0VWd1NzbXhNdzNiQlV6SGowOFhUdGNZcno3dHc0QWRRYXkxNW5CVG5ueXJNWlVVSVpERjhsMHo0dGk5WktvdnRmUG5Pb011M0ZYS0dmTTNYRC8yclJXajRtd3l2NEx4SUVKd2NNN0luOFJKNjN0dVhqSDZ1S1p3OFNhY3NPUUlCRHRRQ1FPblh1QzR3a1MvNk1ZK1BTTzdzd25NUHhZbWltN2pHcHJxZHBJY1NETmhTOFdpcEM2enUrRHRCbzBHdGhJMkRRKzIrdzlqSmp3Z1hDUmdCc2hCRWZ0OXNadTVEWFBSUXFLZFlMUklmMklXRkhxbFh2dVRuVWlFTjNoVmRpUEljN3hYN1p4K1lXdjhiN0svOUZqYkljRDJpTERqWkZhbnd4UUkzYlVuYzY3R0ZlYk5SUnRwUUh0dnRIWEhkaXRLVm83RmtWSzlmVWNwMEZKaExjMkVPNDIzOS9ndmFYVFN4YVE3M1F5SHlzTzlhSUNuSkZmRTVodTFZeStBblpXTGlGbEJYODBldWZBU3RLaE96RGNEQWMva1JPM1c4OWZobnhmbFB6eGtzbUxOejYzMGNMNTJzc0d2Wko4QVlmdXJFU0J2SktpMWJXM010bVROUnIvdFJwcktnUmREU3ZQS1BJV29FMFBqa3NWTE9paFl5Wkc1VkZ2dUhDeDNJck80LzYzTWdJY2hIUXBPVTE3cXVWVXVLY3FteHJ5WGFCUTRFMS9JUWVma0ZqbTBpdjJwcnZJVGpwZ1ZGS1NrTzUvVE5qbGZvMjVQZzh3T0FvanRpZm9PMnBPaWkxRFd2dm5UeVBCeXV0bmRSeTZiSzFxRUJCV3U0M0FFTHE0dE5KaHhrc3k2R3ZPbmNkTDN1aWtYMW93aTZsUWxGMWZLYzRsWmJUOGlXcHN4aDRiWGk2Q2dzcUk4eEFWa2NuZmtrMlREQVZDS3ZTZng3M252QWFOZE93RXFDd0xzYUhaMTM2VVh2N2JZV2U0OGtRcjExRGc3VUlvc1lCNGNIb1djMUREanlqWE9uckxRZk9pM1hFSmZpUDl6cTFDQ2d2ajNiMEpLcWRoMmxmZS8yWFVYbGNMNEJKQ1FLTTRjWkhPV1AyK2tjanFVU2lTWEIwT05nRU13QjVTbHdGUlBhR0lPUjZHdkFyQkpjWDZYOTFTODFBcmhrQWhtZFpNU1B4NnJhdVVrVEozVHBvemw0MEpMWE81R2tOY1E1YTZQWVBiYnBuRTV4bXFBVHAyeTlhQ3hKQnZ1cWJneEc2UU9RZHptNERIZ3c4clhpVENVMHVBWUh5bmhndkhIZkMveWdvTHRtSVYyNTBKalcvQUMzTFJiakErU3lZRU9RK1lJcXNKYmtmYWpqbHlzNlh1bDFLYXJJcHJlZGdVOFZoRjNLSlNhMU1iNzJ6TnlIUDNMeFE3ajN3dWJOMkFOdXNSSlRlL1JCMTc2dkJSOU5mZ2VuN0FWTm5OQ0trVXAreE1ZblQ3ZlIzWllDeG5VMnNwdTFmZTZZc0lHUG5aeEc0OFlRRVVuYlhRU0NOZzdONmtNWWxsay8vTUJFTWFYZDdLM0g3VzhtUEpHdXNob3NnM3F6MnI2c2dZT3liaG1Fak1BTnRUVUtkUzN3bFpLRitBZEtySENYZHBZUkFQV2x2amt6VVFtNDZLN2xCNUtUelAzVnR4RUc5MThrbStNbVJxajVJdExNQ0ZKT01GQlp6QjFpOW9nVGNDbkJyeU51T25yTEVKZzQ4MVhIdEpRd1doajBmdTZPak1wWmVaZFJlVG9CTDZoRGUwdHhWOWc5OHdVamFCY3phaDR3WFRta0N2N2VQVzg1RXNZY00zQXltTUhtbE1RMUZKMFhld2x1ZlozM0Jmc0EyREF3VmUrRjhpQ3JTbjR3K0VBTjB3eFg0THNiQ2RsbXRvSks1TEREczJuaWw2K3VTOGxia3hDbWdyTkR0NVM2T1BrS1FPak4vcWtPOHdsMzBTYTNxZ1RSSk9TTlRTUG94aDFWdEhjWnh0aTBFVkpjNEFEeUxKUWdxTXFqbzFoemoyTURZTWJZSXU0N1BHQUttME5xU2ZTYTlETkwzTjNDWGVzbFFsWnZvUU9XODlOTUJsZnpZZTg4Q1hQRnYrMDk4NFYrTTFyQWhRNGpVSkVUamgvS2I3T2pjTG53TkdieHRXWlVqYVBqOHkxSW9KN1poNTE1cGZ3dXJzL1VWNTVNbHRONHpwcjZIeHZYR3VPbnBXMlVDQnFnMkNiYXNIVmg4Rm13aGpjQ000RldGWThyL09UUGhtY0JVbVhqN1lkc2RHNXp0S0lPKzFtVEZqVXNhREhpUjBHaFdLV2U2NERmMWVZM1N1SS9KdUJ6bFEvVnJBVmY5ajBvN0JrN1E3NHVEb2QxS0VoWEJrK0hzZzRMYXFTNHdGL1RUSGY4dWNIWHBkQmQzZThSVXREYlRiR2orT2U0S1BQaXNoS25yVHJQeUR2MXRVVzNiZUNyL0VOV2kzVkFYZlFsb3h3alhDSTAweVZPRy9Zb0dadU1SRjRTaU9MWkJQWEkwdHVVQWZwR1Y0VWVVSlVpSWNGVWVOcDR4Y2lGYTZURCtmcnhEOHFvY0o0TjJJTDM2T3BMNTlPM1RTeXV0aDgzU1k4Wkw1azBBd3RsWXFnK2pjRUdRQ0h3UjlscTh0cFlmT3ZOUVpaOVZwcktYeGlDVDR0YmdjR09sZFlWa20wYisrZWtYbjJjRk9lOHM1RnlwL0JoQjJONGxiSFoyUkRXZUpnQ080VDZnSjNlbk5sOXUrZWpxeGw0ZUhNaHk4NXlTeFcrTjBrUHNDN0MxTGppaFBrVzE4bkRnTUpWNEZFWVcvYTY0T3RSZ2Q3cW9RTzloSE9sRFBtd0s0blQrcnJFTitYbUdTREw1UzRQSjMveUNCMWxYYzBWbHE3WnVmM1VSQ2kyRjZQOEJjRmtRMy9wei9pUHhGNHk1THFEOTgweFhtMGNqUHVNS2FaMm9rMHhvckpoSlpGNGlRUW12bnJGUTd3TU9aaEtiM05zSGpDVUZtVTEyQ3oyTXYwdFAxQ1IyR2d0OFUyTkdZenp5MWIvckRiZm91aDJwYmV3QlpSV1pkVDAycHhTc0Q0RHdET2VndXgwU1BMSkxxU0pjU1p4dG9QQzNuYzJMZ0cwa3dXS0s1NGVlL0U4UkFMNEpqYWoyZmNoeUpmakkycmxpTW02QWlTeWxZMUNNVnRFRVRWRXFIS1RaM1BUMFVVeWFOVmpuakY0eDRZUEF0aVdwK0pNT1BSQzJiM0JYN2M4NWVDcFNJVzlkMzBhb2VtSlpaaGY5SDRkOVZPTHVsQ2V2ZGc2NHVYR3RqNzNHY2N5NXBEcVVFSitWZ2tHZXpNTk1oaHFMbXRBVUxpZlA5eFJmT3JMZG14Rm5JTUo3TktTNmpkelF2R1lWeGxpbHAyNGsyNlROTk40bUVFeFJOdjRtck5LeUc1SlJyMmY5SXpjdXRyZDlGQU1uaUlEc0MwVnU4VzBqbGdOUnhmRTk0eURMZE8wV2JCNnd2RTVabnd1akxIN1duMEpjSmM2UHNCRFZVZmYreFJZcjgyR0xsclZzYytFaFcwTU82ZFR2bWgydll1SDhnVnlFbE1qMmoxbFpnV1ZFZThKNXZUZTVYZTZzQUpsb20vQkQrVUMwR3Z1OVJ4eUVBNWtCb1k0R0JEQlNRZGN2VmlGVE5CU3BQUXo0QXMyMWdvQWJYWmxnYWg0bGtlSkpuMzVKZmJuQWowT29WaHNtRC9qZTk0QnI1QVFkaWQ2MUpaekVaRllZbmJST3Nla0s1RTYreUxiQXdaVkdxRTcrMHlKSjM2WVhKZEloSkgxZnBFdjRwL0FiVEV6R2txK29mcW9YcGExOGhuaDVHL1NManBRMmFOR2xTVDlOZzFGMEpFK1lTd3RCbnhXMGhOSkhkemIwbXFhSFdZRjBWZGhUdDZ5cmplRlJvRUlyaHljSmUxWkEvcFlZeDQvbFVHSW1LNnFIaGlCVUY4WXg4SDNwdnErcE5vN3lDTXN3cUdTbWVPYXFiMlh1dWZmdjhVbnRpcDRLWnNYZ0VtUFF3NWdReGlKLzlMeG1IaDNHMFpYSUJxYkVJZXg1OG51MzRXbTZnTnRjaFMvbXNHUW1wSk8rUFlVUHFDNjF5N1laZmdFb3AvQzFCb3BTZzBkQytKRVJtZ29mV2hqMSt3ckN4Kzd2WDZBUWpvSjJQWDdWOTQwVUNjeHNkUTBYbVZkdDFsdjJDU0E0OU9KR1piM2ZHeEtJQ3Rkdk5MUXdaZXJaZmhNVDlXc2w2NlNCdXNJNjRKbkJtaXpQcjN6V0RYNXZPM3g0MHowQWxpbVdwQ0ZQMTZKY2dPRmRvWmZUYTZGbk5tb054eUdZMzZiV1JSeEQ3aTh5bVI3NFJCQTZ4K2FGdlhaSTExdy9DWjRKVWdsZU04aDBiNHpMTnRvOHoyOGZuTnFWYUtxK1NrUGM2cUp2RHNTYUVJZ2xDTzdTZ1B6MHpZakFrZE92bTdhVGFMLzAyQmdxYm54TmJTODZidUcvVlkzamt6UnJ5TWtMWlFralhUcnF3NlVOak94WksvOWh6dGFUb3NhK25Xa3dDVjduV1FXNXJXWGtyRUdWcjYreG5Da3hxTkk1QmtZS2Y5U2kyY2dxTGRZM1ZOLzltcldmcUUxQWxubDdmcis1SmxFNUU1UWdnM1JRTmY0UDZVVUp1ZnRtbkpXdU9ST21paDFISHBQdVE1VjFuN05ud3NyM2VxL29YM2Joa292eExta21xVXcrM2s4N3BLNUlpakZ2ZXV4Tm5CODIxQVdkYkdnRWR1TXJCTXNuczc2MjVvZ05jUGs2QUx0SnVBUG5NMFNJTWdyZ0RidEkyNDB2VkgxT1JmMGk3Umh0YW1ZUmt0NVpNaTdXbGgxb2ZoWCtXT2JmbG1xOFRiT2M1dElDYnVYSDdIakF0YkNzYy83cXA3YmYwdURURFB5b2JNZFQvZFovc0tQQlU2OG5aeXQ0RnYyam1sNGNlcFpOTnIybnA1aGhaRU4reXlvWkhNaEwvck9ZSTNpM1dTR3dRNFZsdkYxOW0veW8zc3F0OU95N0dOdEErWHhMOWc4U0cxN01IbGZRNTdrV294Wkx1bmM0TGpaNW9WRjZDeXUwZXNxa3M1TjF1RzRTVFNNcHJGZS9wbFMyN3ExNTFHMVJjbENtNndzdHd0U2ZMTGQ3WEFPSDJVV2N5eW9UYkZoUVRUa1llaWRIaWIrekFEckdyM05PRE05VTdrbmZQZmZjY3IwNlFRTmgwOVFGb3NTM1JrT3lqUjRUSmppQWxVK1gwQjIyNm5vMFdqS1RidGxwUlBYSi9LMU9qTTN1RTF0M1RlbnV1b2pwRDEvVGh5ZEJnN3MwbjQreTlJZXhpdy95V2Jvdk1ZZFkzV0NjQVYvQ1cxb3pyNk9pc0xTd2pzU2pNN2UvMDJSZkkvdEl0QTNWZndRNUtDM3N6UW5Zam1PQWc4TnozYTQrUnVxWlNweFM0SGhabXcxUWRCZysrMFdhNW80QmJwVTBVUFpSbk5PdVNuM3ZjbkZodys0UFBVYzFKY2prNXdIN0xjRzYzaTVxQ2hkcU9Bc0lqczgxc2NEaWJnMHoyR3hpRVRBY1dJbzRPZWVZOWdYSW9MblBKUEdwVGFhZGVlcmZ5Q3gzY2JMeWdRajNQL1RnUk1UMTRHdC90c292SFhFVEtueWhhQXdCdkQ4OElpSU5GZVo0MjlzSGxiaEN3cU02U0srSHlGOU5rQnlkQVJxWjRJbmlQS2JUZ3U2K3lZeGthU1o4ZW9jTXlsTUNZYTF3aCtoclpmRXJsU3ZwR1BvejV6QVVNa3BGQjRDT3BtVkdsRC9sRlYxelB0cWNKTFVFc0N4OThCVHl0bVFzeGxNMzJqNjl1VU43QzJZbzdZUmpzUU1CY0Myb3Z4S3RIeGFoKzhXSXQ0MTdqc2tLalBKR2paZE1NbHJyeXlGZUhvRUx5V0pabWVtUFR1NUdOUTF6RVltck11QVNsWGFPY3pSM0xVR3o2YUdkbXBTcVdzdngyWEhCcG83T2M3YktwWFo5dmVsd05FdEpwNHpRMTYwWTMxL3dhWVVCa1BJa0pjV1BEeldxVERiL0NWeGNxZExTRVkvMFBlZllGRGFTNjNyRFQwdUhXTXQ2bjd2c3hnV1dpQjBORWMyRGs1emEzai9STXhha3FVSjFSQjc0M3hhSWM2dVMzRkttWklVZ3hRcFdFZTZKd3VSZllhZW5xblFNdTNKTkt0dE14UlovSERSc3hkSkZpMU1OVFNvSExaVVBPVmFZQ2RSMk1oNGozZVNENW5MTE9neXJQNlUyemYzNXg3amoxNU5PNGFXZm5wOTkxbjdzNlJqck5SZzZxN1hwTHFqN3Q3ajBSa3pMb0tYb1AyTnd1ZFh2SHVyMmRrWXRHTWEyWndCbFZSUHZFOWNwMnlvWStOUnJRVjV5NFdCbXZsSnNNcHdaMU1GZmwyMkVFdVEza3g2TWZySnVhSmFBTFl3Uk8wc1FZdXZsTkRveUN3SytLek9hb09NbDRCWjZyMzVWZ0hxTUhTM2tsWkhpVmhjT1EyMS9WenV2TEVFdGtyK2o1NzFqOUVSMlJOdG1aNDArcXRXSHQ0YytNTVU0TXA5dFFscUxwUVNnZUtTV2x6YVdxOXdGSDlaUE52YWk1RndUbEVmUlBkL2ZvMUN3WUdhajI5SGRHdTVrNHorc1hjTmlJS2d4L1BDUDMraGI3VTRzeWJGOHRNODNIeFlrTnN2d2ZMSzFxbWN6aldDa2x2c0dvUEovZ3VzZTNReThyOFZ1SzY5UVdMSFlQNlRYWlpOUC9kaER5OE9MM3hsZ2VqZk4rQ2xYMHZBZndMZGx5dGR5K3lQNjhCbXVjNm45V2lWSFdRb3ZQdExOZUEyUk1SQnJITWpQd1hIUElNd25QeXpPdFplT1FxbDVFNzVZMGM4SC9XVW5wK3F2NE1MVjhnTTVGQkJ1aXJGUVYraDNmemhYV1VtL24yeUdWNFdRa25wQVNydUd1SStQSlYrL2ZyY1lBbXFWSEVKQUFqYUExUm14NUxjTXcxYmQ4aWFBd2VMdng2c1NSdXNTWkpCQllrYlkrZU5vcHZBTk1Qc05DbnV0c1diOGVSeFE0NTZEMjA3M0luQXFLSWNqWXRqdmk4V0oxTlJGTEIwQlkvcllDMUMzcm5nNVpQWUVNS1ZPTk9GbkNXZnAzNHppZW90YzUyVVhDcktKQ1psZFJsLzdna0xSS2s4Rk9zKzZ2Wld6cXV2UWh2OXNqV1VtUFhSSXBOdE9BQ2pQMEFoL29LOXFhK1J4Z3JWekMwbnpkVEtwOEpPVm1JejRTZEJGMHNjeERGUXJOVzRLcS9jTFh6aU9RbXMxSTF2TnlWTUlhVnFIbVI4Qk0rNTlZMVNqWjVKTm1Ba2Y5aUd5T2ZpZ3dGNEc2V1B6MWd6Q3FvWEtEVlVSNUorNmQ2RVc1N1BlK3BCTjdjUHlzOFZJcGRjWWVjcmRSOTVzTEFSK3Y4RVhVZHNKV084Q21uNlVoNkw2T01WL3lmSm0xampDUm44NzFRdjlDb3B5UUZNeVdwcktaSTYrRXlrU3J0TldETEVZSExYTTRsZlhoYm0yMmpVVWVSa2xoYmdPTEcrN1B5bWV3VElaTU9CVWF6dXByT1drZ0FmZkdjcURWMTlzcUd3M2dMMnl1VWF2WHgySmNLMVpoeGZWZHZyUjRWeFlWaHVnV0I1dEdjQjQ1ZUE5SWRIbmpteFhYb0t4S2Z3dTNMQi81RU9uaFlHbmxrWnhmNkZBVEp4ZHduRXlIVzBnd284YU5TOENjcHRuVGRKWVdJNnFhYzFCdG95b3VNNFJJK2tCdUI5Vms5SUdvVFRxdE9jc2dxZXRnZ3FCaXlJMVNscGgvY095OVB0NVdLNkpwTkdKczVrK1FaQlJQWVlpakxXYld3U3Z2THQvaDdsZm4zNEtrS3hUMFJQZWtSRVFqRlY1Rmp6KzhKY3RZNUovakRhQmRlcjhXQVZLS3A0bHAvVEpQeCsxWHk5K3YxSExlUW1NZ0lNaTk2WGFOTWRiZi9xbHhUZFB3YlA4N1lXOTFsaFFVU0J1WEJiZ0lpaVpBV0NlSFExYlFvWTQwaE5naXZLVlBybDhWNG9Vb2o5cXFNVWRabWM0SG9YaXk5WFZFeUFSTGNKemZodVpYNFEzdkJBdjRoZ0l2ZXZSaEdCZERQcENoejRKbEg0Wngyam5oMHdqY3ZkOHVmYXY1eWpyKy9XMFdiaFVVaXlrcVM1bm1XdlM0QkI1VjJnd2hWaDFJYjZhaWZNMFhndzF0YWh2SkJZcjAwdllZdFhuVGJKdS9LQnJTbXVIQU9KS05FcEh0RW5mdmhKZ3NvV1hhK2dhNUxRQndvbk1MSU9mNWtsN25vUnRQUldTN2puZWt4S3J2L09sNXB1UHpKSU9ZUUtUdHh4QjFXaDVNN3VuRkdrQkh2eVF2K3Y2TWxTZ1RkblBORThYZWROREgrREVYc3YwZG02MEhCdWd4ZEowbHJaeXdQQUVwWTlPZEtDMTRJMnNFcTlweklTUi93TEJrZkgrbjZVTHJaVlJSRHVaOHpEQVNVcHF1TmtBcjNpTDYyUDhZbDE1ZTdrdDNqVWkzR1BwUEFadCtiQVlqbklBc1Q0YTJqTTBCUkxNbGxmWll3cUVoNzFWT1VoNTA3ZEIrTTVhdUw4RDJYRk5iN0NEZk5xQktTV0tLTjhSNkJ5YjJ2bkYvcUNsdVA5VEZTbnVhQkVsODBIZUU2MHM0ejR0d1dqeDF3SGFGMklpTk01QTVMaXhsSUxPMWo3Q3VWYkI1TEJXRTBCb0ZCMFc5cDZDN01RRE5CdnE4V3hONTVxT08vajArZnRsZDBQTXFqaVlsUzJMcTYxUGJNWnVUV1lpdXE2RkVXc3IvQk0raUZ1L1ZNc2o4M1JWZ0VvREJ4bXU0L3greEpHaStLZTVVM2YxYXp2RjlNQTJVOXFzRTBrSG12VnZtRlhrK21FemhxRHplM1U2ZHZiR0hDTVVmQWdiaUI2dGxGNmc0NjEwVXN2bDd5QStwanNPSCtFNTB4NnlRdFJuSFd0UkFFaEdNUERCREUvV3BRbzMyOFc4dlMrQ3h3Z2t6ZDkvS25iSUFacFUrMmg3dVZVaEVkRXdqTDlPUzZ6alJTWkExZkZwZ3hYamE4YlJvQkVEYTRqT3VheWZBOE51bWdsN09JNGlYc0VXbkN1UnM3UlRrb0JZOHVoeTNvL0xwS3lRWEIycytPZnRYWlJoYmtkbFFrdWFnTGFMM1FPT1hIRDMvMXdlZ3VwS3RsUmZoSGxyV3ZuMzdmb1lnL01zVjZ2WXB2RDBVUjZJZFhNQlVWVzhJcDhJdThNeFlFWHBuK0ZlakJwc1JrNElrckVwcUUxZXAvQTNzc1JyZWlkNEtudnUwcjlYa0RKbHZlLy9KdTlTMmRYNUR3amhjc281SSs3U3o5dmdlazlwWExrdmNzK3lTZEtOSG9ySGtmZlRyV0g4QWJ4Ymo0RnJTZjVzQXJKbjF3OElOeUtYdVh1OGo3OFNFTW5PWUtzQWpKanJxOGZLcXRRUWZDMmQ1SU45ZUJWOUxxdlNmWERrZmxqWGhDY00wS28zQ3pMS01makcwUmdGTm9PTkMrZGxKUTgrQzl0NmxFVkR3UXZpa01pQzNDcXdMcDQzdk1tNmliRkdLVE16R0dERk50ZUVBWHo2SWhGMDJmNW1ORmhjV2xVVXNNQjlLT290WWE2TTdrck1NWEpBYjBpcmMzN3dIYVFWYjhhUzJkS1M4bURtQ081UlByT3Jha0VJSElqcENITUtSRmxUMHd6T0dXZU55emtwOHJHZnBpNzdUaEZsTUtOQ05kWUNQeXJYbXlGRVZTck5MVW53bk1PaVpvUEUzTTZQcElnRHNNamxHbkFDUFJ1UkVQOG8wN2wvOEJNcnYyL2JOc3lVZk83Y1dlUnVaOGl6aHNCRytqbVU1UzY0clBzTFdnTXN2eUdTa21tV0VzeDQxR3pUNERpaUc4SVlsbWVLWWt3SWZFemYxQzM4Vzd6a0RhRlJmbTdWc0RmclE4NWNhS3k0dGJZbXl5WlJ6NjV2OGYzRDhjcjVSSWJSWnJRNTYwaUtzNVJDSm12U08wQnh0SnMwUmZ5cDRYQk5mYkl0dVBsdG5xaHV4aEFlenkzeElieXRDVkJjeG4wVmVkdWtQRURhNnBoTGpibEhuS05aRDNkMFpRSHZJWjNVS2MraHE1R2c4TDVqN0N1TU9FUFc2OFRub2o5LzEzRkxwUllXdzhPWWJ0K3BzVGJ1UVBlbVNnblFHNFM4N2FtcWpEdjFCSUNkSURYMkJyUXRpaGNwNDJQTmhlREhSM09yM1dONFRCNnZ4RHh3QURrZkUyR1hnUEgrQkoySFZPb2RTK3ZDcFFXdG5xTHltbHFHb1BUZTB1b0dmck5xeVRPcnllbDhWTW9DVmo2T3NZcmE2QUF6Z213WDlrYTVlaTJvZkd6Y2ZKczJEajU5dmRMM2IzRzd2NlczbW9zM1hMSVNXOGxGOXVWYXNpS01oTGJzV0VtYnNjTGJLaW5ZNi9QdHA5WXozeVNIYnlTS0JiSnQ4bWpaTzhCcnRBYzFqZWI4ckJKM0tlUEJlSmJqNjF6UjRWa2F4LzQwTnJEUm1LVHdxTU5TWVhZazJnWnJwRlp0TlcrZ0krZEJWbVVObWU5S2RuKzdMUVNOaWVGOG1rYW9IUlV1eFIwZWRFUmdqSUFiQWoxdHhkTzh1ajlVcWRwbUVHa2JyQXJzdnJIbWloRE1GNXpjRzFOM0FiUzJ2QWdmUmloTjh4OFhIUUVEbDRMTXVVY3NId2RrVXRzYklDQ0dBa3l6bVdocVV3OXU1czliREIyZUhkSVV5TnpidzhFSHViekcvVlpQVktaRnNKelV6d2NNZ0ltQ3FzY0lLTGIwV21OWU1Dc1RYRVJxLzFrNG5YMGFVcS9rMEdrR1BHaGxuZ3RLSldETTg3TW1YMi9XVnE3NzZ4WGZHcGZXYzNqSElkZUcyM1U0SEN6ZFZCWXlzdWVJVTY2ZnRWZFRJQTd3RUF5V1BsUFk2TUwxQmxKU1dtbWVFVFdJZzdsdXFIVFM4bU85ZFVITldJbnludEZNOW9tUEFjR3hqOXpsNUc5NHp2ZkIxMkN4c2swSlMrcm9DUnJyREI4SE5mbkRZSWZWTXd6Q2RVYjJNN3ErTXpTYTJuRnhxMExNNWNXaXlocFZwclZNU1RGN1BYcUpjaGFCajM4MGpDVWViK3lMdGFWZnVOTUJ3dUhmYVpoYzdLcExXUEErNW9UWm1rWW92cmlJTWhRcG1rOWpFcmpsNEJpSVp3NXFnelpVdTNqcjFpVlBDc0hDcTJSbGNnTnNoMGFwMUI0Y0VZNTU5bFRSU3hmd3JLdUtLWTVTUHpud3lkZXdHakVxUDR5MTdaenVOWTllMjFQUXRlT2ZmUDBTajIwSnpMRUdKWUhYZEJlR1NVTy9PWVhyZXBZSks5VVdWYnQ1bkJROEs3NzlxN1h6d3dUK1JubjhlZy9LTXdGUDNjTGNlOTdEZ05xOExyV1hwVGJmNnI2bjBlN0N3K3NuSU42STUxUWhHSGNhbnAxZFE0aHNjNjdjUDdmbkszSTRKTXpsTFllMXJUdzNFdzd6VEdEdU16WE1NZy9xWjFsSWFTcEY2SVR6Yy9jRjgrQjdBaE9waG9YYnhRSGFiZkRkS084UWJxTTRsT1BnUU5tc1JoQUlUNHJ4WExvWmFNK1V3aTd2bEdScWdxa0V0bHZMTGxHUHpTSGFadEg1VEZJV3FIdGtobnlybGRGZ2JnbjYxamZyZHRPa2pUcUpXOUVSTDdwWVdLU2NRSTRNSW43VHBIUTBDYW4wd252a2hjOXNxMUI0T0M0bWtIcFM1TkN1eURkUHNBQ0k0aCtTNXVIMWk4eCtRc3NuaWJUY3FWc0JzY2JhYURuenhQd0NYcTZiVHpBNEdRSU91RXpJR3JFL2xCemprcE1ybnAxclJUcVJGNWJQV3ZiTUNoWXY0TUpIeDhTeHhuc0ZxUjJGNXpDQkVERk5kNTE4bVpzcHhsSlZZY1dyNTZ4TGFVRXlndE9md0FiQVhHcFRDRjRUR2lNOGNJUDVGSmdzVGJBaUhMRzFIZjZzQlNsY2dYa21FK0Vub1FyZEFlOTRzV3dxTUJSRVRRUTdrTVAvVGVwVHpra2RuakkrNWkrWnNpaFFwRitkVXBLZTMrK3ZMVy82cTY3cXdRWWI2b2grTHFneHZqUERQZDFyS1p5ZjZCZk9rT3ZLVjRaenhxeTJPTVl3RWhVZXEyMkxkTVYxeHZhNVJyNG1Wd1NpdzE0enEveFRlMTJlZnE5TDhtM3dvTVNLZG5pRDlWbkQzVXozRUNVQldURnN4eTBha3RwYzRNdmdIU0ZGTXJjNjJVbyswdXVCY0E0Z1NJQVZqRXZxUnhnd0ZxZ2lKZnpMeEdVbTdWYmhRWWd0VDMrbnRUV1JRZ3JpclVtQWtrK0lQMm1oYzZwbmhZbUVjdVNBN3BZMUNTQ0dzTklRR3YyQ1luUUpKVDNWeVFFMXhoNTZnMkNtS0FCMWRxTnM5YlJDdHRIQ0h3a0pjcm9ZbG5sNGF2VEJuK1llWDN3aFBTTTdZQmNDaEpxUmlCZzdHZ0hEU01iOUpOZ2o2ay9lM0VWQUQ2OFZKZ2JsZzNuZ204YTFGS2lZL2ZVTGFBTHZYWUlTOWdkOXlCVGtqTzhKWmttSDVQaVVUWW1zWEptWEFQVzRYMWRRM0Q2cFlXc3lnZSt4c0hPYmoyR2VBMEkvd3R4dnUrYWc2TzN6cGk5WGpzRnhOaUtrWDZhL1FBaFZQYURDM3dZNmJpV3JmTW56M0lZYXNuSkZzVHFuUnBLd0JvWUVlVG9kbmxEN0dXb2M4N1VzOXNFT1lLbkRrYytRdzgxbXZqQVArZExlSmhOek0vbDY5akVEbjQySjB2SExlNVVwZDU4cjB1UFI2b2Q2b2tVcFdpTGtuclZBdjQ1L0RhSTB5RUFZMHRFTndpOWpqVVhaU3MxSTIxN1huc1VNdzM1VG1ReEVJODZFQVNncHZUQ296bjBSSm1yeVBDazRlTWRNMlJpL0RBVkxkaG5IcTZmTEltOVZPMmhaV0tDRVhvc0RsUmhCQld1R2c1ZmlXVVNvZFJ0Y1dBZWh0VG1ER3dCOHpEY2hEQ0V5YXNPVVJucktxNG5uaHdVencxdUJBY3l5ODlvQnF1YUxwbjhCWnR1Ymh2QXpVVGl4YmtvWlJrQStweDFqWFRpQUtDZHFlUmFwMlFENXJtaEJhVnlqUy9hWmtFMklzaERnc09IblYvSDBWdXYrajIwS0RSQko5VHRGRldvZ2VqMFFuMWdiT1V2SWIyeEdkaWlQVjFNY2JoVjhETGNiY3FndHlUbUNCVk1CVlhuMkNxMmQwalRlQW83MVE4OEJMY3hESGFRZkRyR1RLOE9sMWZrejNvUGozcytobnVnVUVDL3ZHb2J3OEZRdGtFMkZaNzMrVTBBcHB0aERoTU1RMi9mVEI5c0lYQ0RqeDJnVjJOL2hsWG9naS9VZVozSGJhbUw3aU5ZUzEydEdWTnFDSWY4dkdBNDA2cWdlQXF5cnFzdkRIRUI2dWI3dUNqU0V1K3k1Vlc4ejhvQXE1M1NWVmFJbWlVbFN1ei96Mlc5YWxmZEtnZzdtMi9hUG53Z0F3Y2RteG1XL1VXclRXYWxTN0EvY2lSdFlDRElYeVhJQTA3bEhZdHhPTHJRcmlVWEFUcU80T2xqdjZWeXpSQ2xzZzlOZFdTa0pEeUtkOWIyWkI1S1BLVis0Tys1NzFCNkZROXFmWDd4dFVZY0hJemZGMTFUbUpoL0JWSUk0NjRSU01ZWFhjOXdjNFhiaUMyUHpjSFk1Z00xcUtSSU5kUkVJTFYvUlVqdnRvbThzemlPYTVGMkJiamJUMjNGRDJJbDZMOVFKVmZ2aXJVL1VBL3V2cm9VTU01S25NbDcyTW5MYjN6alV1THZPMFh4elVKeHRuZy81ekJ6WnowSmg0ODg0WFlmM3FFYldyQTBYNzY0UjdSbFdWT0drZnBxZkJyOWZiVk5wVHNrN3B2dHQzTC95VDZDTWhIcFdiMDkwVUV6VnZ0Qk5zZmpqYUpGMnRqVUdjUkpHaWUrbkV5ODNoamk2L0I2SC95aVBTdHlZNVlXSEJuMFlYbFdXdEZvQ2JtcXJKOUQ0V2wvaHdiZmtBcTQ0L3Jhdi96MHRRZWYzbC9Sc05iVEpzV2ZUd0dXbWp0ZE1Rc0l2OFkrbG5Bb3k2YkRScml4RHNleW1BMnpsd1k4REppSzJqWWtBRFlNT3V4dHFpczdPMWcvSCtDUDcxcTI4ZlIwTU11RXRBd1RodnM0Z1NJVmQ3SlZ4enR5U1VSNFpVUlBXaWN1RmpJaFBES1ZCMmdzMFpuZVFxdkVOOW12YmpEd2FxdjF2UitWMVByUEMrZlNPUDZ6bWd6d0xqL01uV0R2UTdKUHBVcU1HOGlialk4VGlib0RtLzJiQmlhdUN5ZTMzNjlPNWROQ1Z5b1BveW8xa1hhN2RuRFZTU0JDV2xZSlc3OWpwNE5hNEhqWjB4M0VOaWFrY29rYUlrbUZNQURXWTlqL2lwK2J2MmpEcmRiVE4vSUVGVzdNTEY5NGROVmtkaUZFQ1VkK1pmU2pWeis1MHFDenFOYjYrSktwcTdqWU1Eelhmdjh0cjdXZmdiSE0wcWNWck9xbWpVYUwyK3JwVW1DK3BlSEVsVXJNRXFBV3oycWRnaWIrZzBxZWFmVXRVaWVEaWlNWGl1UDlyMFp6enJxdlk5YXRoN1EzZjB1eUFVZlZFRFFRTEllQ3RkV1hVWjBXTVpCLzVDa08yd1dlQmZWK3JiQjdyV3hQaHVGZDJDcHB2cktKem00NHgxd3pHNjg0VWxsSHREcm1tV3VXU3NhWVJZd20zdHBTZGJpbldaZUU0S0JENnZxU2hJZ0lCeDNzOG01Z3h6OW5YaFFRTDNRZXo4K0orZklyam8xTGJyRWEyL0hnNi9wZ2l5azZOdUpTNFJMQm9xQlNaR2FOQjBFVVdoWWFyQXJOUDNVZTkvQ1VtdjRFdFJDWVV1Q0EyR0FNL3ZPMERGNDVQbHEwT0hiNHBtdDNSU2VUQ1VlaDB3bGZCVzV5OVU1SG85Zk1FQWUxZkUzSS84dHFzZUh6YmNOZEp5WFIyZVQySUE5NE1iVU56a2ZBSVJqRmo0Y0ZjanVQeE12eENOZ05uRXJ1V2RTUC9jakVpSDZLVGdXSXRRcGM4T29ubXl3aDB6QUVCSHZuT2NMWWM2SThGYWF1dXl4MEh3YUZUWUxkSVBMOG1PUGM5V2RtaWtPWHNLK25udlZVRlltbXhNRDhobzQyV1hLRmVOanp4Y1duWEpkbGFJeVpoaVhteFlJY0E2SS9WOU5pMXI2ZitKL0VtVWxBOW1RemE2a2l5eUI1QjhaRGFZSmxWQ240SlZDOFoyV0Z1eE5tZ1ZQV0hFblR5aGpucEhUWGFab2MzQzdSajlENGI4YVZiNlFFcThJQi96NkhZSVZXNGRQVzNuU2dxam5SMjhGWWpMT3MraUVtRXNKZ2tsMmVOQ1BhcTdrbzNnTUNFeEwxeitqVDZUU3FhZW1HRXpUQStha1hPakNhWHdXMjQwOXJyaUlza3lCcUExN3d6Q2phRFVlSkNtdHYrSVJKdG9ITGJzbHhreGJzUWo1NElNeVZyTjh6Tm9NZHB4eC9ydjl6RStkeUNLTkY5cmhpbmlzNWFscE13MDN5aWpXcGRsa0hCQXczUlp3b0lqUWNJYkJMdFRzTW1ya1VpL3ZGV1JGK2NEVjhzTkN6K09WS052b0lzUkNzN1NERm9NSDM1UlFlU25QMTUrWHp3eFJOZ1BUQ1h1WnVyQWNyc1diK2hpVnEwd3ZGcGx2RmI2dlFwRHN3eU81eTRoa1ZWRlBTSkFzMGJ6Y2ZKMEJUS1oxNDFqVjd1Q3ZCM0svWFFoUzRVZEpXL0xYS2J0aCtZcVczdlVJRHlnU1N1L3FId1pQZit1dENTSDl3YTJOSTJMZnZ0a2RRLzVOalBCRXkyeUdtK3ZXdlRDMUpxVURtaWJENUh4TjdZZml3U0txdE1lMlo3YnFPWmMvWFArOUVqMnBBaTErVmpoZlVBb0NKWCs4cnRxdVpVZlRQbjF2ZWFkSGx3M3FXZ1VOVlhLeVo4S1lFKzhyNU45WTl6S1JTcE9Ua0VmVmJlTG9FS1lUSGk0NzBIZ2pIb2hjTzhOUE03ZlZHT0xkZy9XWUhyeVpTNHpKRUxVbWkyN2xKY1FaSGRzOUVqZmNLL0szU1VtZTZXcGhMUTZEUmdSSUZTdTI0WU1YS1JnaTJrR3M0YlBFSVkxZENNTjRvQ0hYSVQwMEZoYXdjaGVhd1VQQlJEVFpSNGhlVHgzRTJQZDZWQ2FyOWIrbE9oZ2NqRVN4U0d2cVZta3Ftei9TUXVTRWc4dTRqbEMrb0FGSzdzUHpVYU81WGlGUHRrdEZLUDZDZ0JGeVdIUXdwTlFBMFo5VDhoQ3VVbDFxSmZKSzA1WW9DcGxGSFc0REpiVmR2RHZyNHQxT2tLSUxyNFI5c0hlSzE0TW5rMjZQR0svdTB6ZUtNVm4vai9JcGhobXBxVzVDR2trZXo2dVZrN1h3YkQyQnRGSjJKUmJXK2ZNZzBUOENibHFNQTJDYUhGL0J6OUNRaFd4QlR2OUtPVjd0T2NveThURHZteGZTcGFyOVUyVU9RbFJZQzNFZUlFOEVwWHM0NDVuZzdUd0NvZW92R1N6b1VMeFJRaWhWUW9LS1hROWpWMlM2Wk9HQWI4d0s5c2hFb28vd240eCt6N3o0cXNFalpkT1ZHbEFxanphM2VINWY1S3pETUFTSThDSzhKekFsRGRJeTNrR0Q0d3VqNHVQMHhwK203WDREcXkwbHBiZmNIcm5VelYrT0I0ZitYaTJPVk90S0tpejBxaUxjTXlSbjdCcFJYM2RKYlhSN1FvWm9ieHNiZVJsS09TSDhWQnNHQUc5YzRJT0hxQ05McHJzV01qYllYanF6ZmcxU0IzV29LUVdIZmZ1WW1QOG1JQnEzUGpPYjNnMnFXVEpDeWROWnM1S2NCWC9TV2Rna3hnZ2EyMUY5bmRPS01LdGRucnc5T3BXdGdvUUZIL2UwVktveTlTa01wcWNnYUpmdnptYmJraVRBMUt3UjlFSDdTMXRrNmNRZ2RreVZycXZJQzR5bWN0TnFFcWZxeGlHOFh4VkxxUm5SazJKb0hIODNEczR2U3lhSG5BblJCK210VXEzM1dMRkdFL0tZWWZQbE03djRWS1FlNFB1UmxWTjk4UGsvYy96cU1BcmVYNERRYmtrRDdmOUhEZS9NNm4vWUJiOFQ1aWM4Q3J1YnMyWTljMDMrU1gzak5tS2JUT0VuTDFpT3pSVXhXNzZVZGxXZElHcFpjVjhvdzdwVzEvL1c5Q2pteG9XT3lxaWxSaTZIKzhsNS95d1I0RzlCbnpzbC8zWDBMc2VZdXZldWJNRUFBaEpFTmxFSDB3SGFQYmhOZzhtc0tyV2VKMXE5T2NZMXA5eFZuQWdKcVo2QjZUZWY3U2diVUdpTHRHNmwydGdiYk8wRW1PVG9uL0c5RHVCR1AxcXdnZ3psMzUyL0oweHcyM2gvZ2ZqUllndmN0M0I2bDlJcXdEMVFlV2hVSXh0blZ6N3FWTGlTclY2N0xrbGVwQkJHTWFFNHlzd3p1VktzNndxd3M1TjNhVHIwbjErdVA4UCtpOGpHOExxbFBCdmR4cXdNOCtScG1ZZk1Hc0cyNlgxTEF2eG9razVGUjhaZVlJM1NtM0dyem0vVFM0anhCcU1WUWhxNnFNRXljdHBLc09nN0ZMY3FJRU9pamdjQjU2VCtZWS9vcUxtRDVsaGlBUFhpWlFRc1IyNWhIU2JPcDR6TFdqWm1kYmRDa1BETThiY2JJcFZlbnJyUE5vZit1UDB2ZWdQSEQ4Zjd0OUdBRVNScTQvNllOOHNnMlNnVU1VbXFFaWpXN3BFY08yTWg0NERoMG5hWG81U1dZNkY4eHBVN1VFYVNTWWI5Q1JDNGpUWGJ5VFJVUlZ1WGp1N0lXMnBFSnBjMldkb1hCSGJ4SjJldW5iWDdWUDdVcE5FcDd4ZUViQUthaXFjYWJQRFE0N3Nnd0ZxaHlNMVZwdW1FZVRzYjVDMXFSKzhNNDRNMHExZmlPQUJCOGVTZHZ2UWg0U2hoK0FLWCt5aTJOS0tDREs0Ny9XdzBpQkIzQTZvWXZxWWNQY1Z3d055bzA4NTd3QWIzbGdZa09HYVcrTTh5cjVtbTB5cjAxTkxIZFplWHlYZnBhaTRUY2RiZG0xSW1MVzlNbDdtSzI0NVlSUi9CR2xKbjliMWlPeCtWejU1ZjR0eFJ1c3RhWXF6c3dzTnYwQkxyREhyNzIyQm11TXVHZ0xwVXRyS050WVN5aGFsWlNuRVliRWppRVhjMlRRMWFpRFVHcjVLTmVsdER3ekdERUUzQ3hpU3JjTTB6T0hKUWlhb2o0b1FSd0ZGVjVBOFJwR2VGTXZqc0x1QXJLNnIvQ1NnNDAzcmZoR0NjV0pLdk00ekFqN1dpelVhNy8xYkc3bVRuVit4ODhyVW1OcVlCN3h3SHUvbEJoSGJ1RHAzTGdjZVI0dG1kRW1jMzFycmRVSGJMWXZoVnFyYjFSdWVNYUljOCtTRUt6emFOTzVHeVVaRGRrMWdwVkxhTWRNQlZGem10UDB4dTR2NlVCNkdZQS83d1IyWTNnSjRBZ2VCa2RPWGVxYlFKNEQyYXJqWE04ampBV3RZQ0FuQ01sU29BelNBK0ZnY01pOVhSTVQyMitDUUcrU2doRHBSTEhQV0hWWjAyRDZEczltUFYxaWllUDZJRncyalpiYlVIei9MeXJKWFhNaWZDYktobm5BY01haEZTb3dwMmRCZzBkR0lMZWtiTUJDSEVBSGg3RnVVYXowRUp2c1h1RW5INllIZXY4eTl6bE9kRmtGQXB5U1NPbnRwRVNaZmVGRUlIcmRjcU9wemxvYW9nT0w4QzNBeEZuMWdDTVJVOGFoM1hJZk41M0JNTmp6M3hUWXZ2UGdpWE5oeWM3WVFOWHZZSW5XakR2b0pRb1FyY1NkQUtZcFdqeWdmYU9OaWpBQVJmb0wzVW1JVE9zTUFzZTdyakFyY3FGZTJaMUpEdGVPcGIrcGMzdU51YjdGWkRodUozTWlKUjRUUklLanJWbWdKa3hQdUdXMVoyL1VNNnNaaDF0WGc2MmVsNkJiRUxYQzFOblZ5bUFoK0hhQlhnOWxmVVZNalRxeWNEb1BESHlFM2xtZFJkU2lEUWNxVnMvRUI5d29kTTZ2V1AwZ3Uwei9jUUZVek5DZjhabTlZZDZLOHdRcXRuWDVIbDgyRitVVlRSUnBrWHpFcVdHNG9RZUFJdXFNSVMrNlBCMTN2OWFvMzlqU0Zvb0ZORzd0NnY1Mk05QXFaQWJEUGlRVnYxLzdYV3VBcGhIdjFjSHJhTGJoQ2liNUxReVlpbENvbTZjK1F0UHpOWE9Pd0wyRS9pblNyMFFacnlSQXJrTHZXU0VBaExLNHVEQ2dQSVRKcFczRkZnZnVwWkFxU2Jna1JLUDJnSklaVSszdUpPUmljdm5IZkthdGQ5dmd6Zmd0ZWRIVkVvRmg4ZkhXaFIxQUJ0SS9xcWUvcEJNRExJd1dFT0FhTmdQTTZRdmlaWjBPa2NEUHR3eTlkcHhtZUxHc1Voemg2UjRMWkI2WTkvOE43bkJlMFJGTUFqTk9LQ0NZRE5nTmFrWDVnQTYyeTdWcXo3VkRjQUx4bWI1ekJoN2NweHV1ai9wN1o0TERmdVRDOFN2aUsvY1ludzV0SDNaanBvRFg4bVdUZEFlbU1PNjFZN2k1ZDNtRkdlOHQ5a1B4a1FFQnVGMWVxbjJxbEc3aEVyRDZlYVJwS1VUYk02czlXbmxyZUtWS1UveWZsSEUwTEVhdDZiZko2K1pBY1FWRWtIMkxUbHRKSTBXb25WTTIxcFpETzBaaW9zSHJNeXcvSnBqS2wvcE9BTERuYTZKWFZzU0NCcndoZHJWZEFFTFV4NStEaXBSVE9wRDlTcGVkaDNsZWM4SStHcWZhcUFiZmhIWnBsWjFIRTRBODAwTGdYN2JXblhTbHVIOXRROVVJWk9rNGZBdTlqdlE2OS9Rc1FTY1dQRUV5TGNGejAzeDVEUHZaeVlHR2pOZHBISytIcnE3cWpwNE5ONW1CcHovTEpOTUtxMXNWSStBTEZNbGc5cG55aEdSRmZLSjdGS05aRjhYOUJDRzVCNnVLUkRFSXNRRGRkTDU4YXhjSGdjVnhxa0hBNk1iN3V5RHJiMnB1bFRaeVRLOTA5ME9MUXJndXhJYW9qNzYweER2dkhicDNhZEU2T2dNWGlqY3R1UFM2UmNCSm1FT1hMMWNMY0NockVCaFRSMnpCZXNaaTdtNFc0UFYvZm8rMUM3dFZuVmY4WVNxUHJONGVrRWZVRzZuNVRUcVgwVlFRalMxVkFYamZWek1DS1gremRpYktJWFoxbXhQdUVxcG53RlNxVmd6b0pQdFNrNjZYdTdjUkZoMnJOcTFFbDJreGFxQ0oweWdlQjQ5SDcxN1kvcDg5eUY4Wjk3RisrdExwT3M1cU1ORWhRS3d2cUtZM0F1Q1NmNGEzMnNHanFvMkwyaFA5VHN2WUVteHJQa21iZTgvQ24za1FBTENjRzdPaVUvc0F2SjR6Q1lvTmJpRW9hTFFQVGtTSG1IWlh0ay8xYW9GYmF4S2R1WmwyalIwdExNWm00T2dpZythVE9PaVB0UGNoMk9OYlVLSURxZHdlcWJOZENySzZwc1kxOVZ1aVM5d1p1aUtZYkEzL1dvT2tuOEhXTzQ3dUtIeGhhWEc1TjVNaExpNHcrTVlyNTl4NVFLTXhuODNBQUJCWWorMFRHR3laRG9tOTlFVGlyamRVTDZuUFJ4aHVDenlMeUZucHJWN3ZINjR1aW9uUkJyRDdtYnVFMG9tVXJkY2JzWFZ6cUtiei9TRHB1NXJTY3pEc2dLeVFmWEdsK1Z1M040ekNDR1NBNzE4MnFpVjBmcnNnL2hYdmNUaHVRNGxIcTNLZGVGcnBJNUpOTWR4ZHMyYWx3ckNqdUN0Uk9YM1pvWGxVbG9QcTZSbHlWRjEwUjd5TytNemxGL3V0T0NJK2lzQkpiOUZwdjVWZEFLWG9Gd3M4Sm1NQmxJeVFvV0FpNTFyeU9PaHBjTGJLUFZrNWU5OW14NUxoNi9NejhpVlYveURGMEt1Q3dwZVJ6RTQ5MDh6K2U0Qy8zcmVudUVEOVlUM1A5S1FmbGVMUHNNQXVSUHRUcHBqSXJwYTdpV2xJSy9JY2RpOG5iekczbFJMT0hFS0xPV0ppVlFNdGJFei9FbGdsMEZWMjRKUHE0Ym5Fa0Z6dk1LaHRQdTFkWTg4c2xPbGoyUUJ1cDhnKzc1ZmowK1JlbmZUek8vWmI3V2VSbHZNTjVOMzdyNmJ1T0dsOGJmSGpZMDhyNS82TCtoUENZRE9yWkFVaFJSNTd0N1lOamlZa252Q2l2RVkxVVh0TTN3Mmk0Rks5RjQxczAxaHBTSzRmNlNjTWl3N3lEVzJoNC91RkJpNW1nTVFxWmY4SmdjdG55UEo4UU4rUWNEdnRaZmFaTzJIWDAydXlPcjRXdXdNb0hocWFRMTFFTUJla2Z6RDJFd3VxbVRiMnpBNnVzdVJyZFZ2bU1jLy9GUmpzNWZCdzl2Z2JDYUozMGw4UUY5Tnk0R3FQN1hIS3VhbXdIQjV2MXVWQ2w0VkphQkdLbkczRjRyUDJLc1Q5eDFiZHJiL0RDNDM0UmxhWWU3RERCa3kvQWdSL205VWZuTGhoYmM3R3dzaWVlR0MxaC9ISG96VnZKbk1XWU1lc3VkTTR6VkVqMmcyLzh2bnFLdm1OVzIvMG5NWGhYMjZLTTZPeDhJeTVGMnBSRURWZDVxZlhWOEpwSGkvVzIzUkoyekI4UlFEN093ajBLeG9OSUoycDFjY3FsRnJsbzRFNk5aNU1pbnlERWlqSjJ6RktBZjg0NDBjdlNLSGZLY2lIRTlVS1pCWUdBTGVzY0tuNDJqVjVqS2MvNk5OWnNJYWFRQkRpVXpkUUYxZmdVUHhNcEhVWExDaWtES3FtWmFnRlZKUFZjQmFUMEhtaG1vaURNWnNXU0srYmhJZDNvejRqOWg1SGZvSUNnckliZzVwTjh6aERodWVsSUUxalJGTjBONVRNY3dRVEhMM25neENuYWFvOVNhUXNYRnl6QjRmN2dMQzBydTlsaTg1ck9PdGxQcEt3bzZvUVFiR3MrWWo0YWR2TEoyaG9zQ2lpN2ltYS96VElQeTYweEtHZUhOWkQ5M0daRkM4UGowYmIydUpZMFJiT0pxc1VIWjNRakcvV1ZiQk4ydjhLVzNTaG1oOWRYZUt4VVFuQWx0Z1IzUDR0YnQzbDdqc1VFc3pwUU50aWRuRE53VkN6ekVUYVdON1pPQ1VsbEpSK0ovaVZOVytDNDF1Smx6MndEQ1BvUTFWZEczRmdXNENKdG9tNnZCaUF5U01vSmhvYU1NMThxSmE0TStpU0gya0gxVlgwd2pkclZWKzQwUTVodmFwaEt0M2phMVdMc0NkU21MaEk0Vm4rZkVEdzZnSG5BMVNhUWJlc0czdG5tb2RUeXRZeW5iVzRTa21Kd21KU2JTYXp5cUo0WTAzbEN0d0dXa1hTODkrR2kyUmRXaUpXdkl2MmxVMDNteEVGVTZXU21LUUZydTkyLzBaRlRxQ21oQUxMNzZ0dGZjQVpPZ2g3Y3JOYXVnajhtSnBHV3E0L29aai9OTk1uVzNpa0pXNHlTN2E5eU9rNDA0ZDFWd3RRTXFrQXo1aEY5d0ZvYUY5Z0Q0OENKWlYxZzg0UERDdGNJVzlwQWZPd3R3NGVMcStEeHBkN1ZHaE4yWjlzSlhHdmlhOFF6RjF2UnphanZySFRmN0N4Qm1JdFhjaHlUK0pqZFgzb3BubTFhR3c0ZmxyWkl1REFsRlhLSU5HUko5Tm9XRFk3YUdyQUhlNWZ3ckVxbVV2VFRNYWJZeFpDNHFWcnIwMm9QM1hrZElaNm5uclZrZEZuZnhsS1FXNFVxNktKOGs4ckdwM0dCMXUvZkU2UHdSaVFDT04xNTk2ck9meDg1K0s5Y2p5K2h2MEtkbTdJWVgveG9EeXp5NzJ4T1A2MmJUcldsY3dJb0oxMHN4RXpIeFBqSkVpMldwOSs0OU5BYnplRTVqb3Jzd2NZczQxNCtFSytwT2ZBeHR1R0lkaU5OUXozR01Gcm1xdlgvZzVCUHZaYmlOK0c5SFFuWko2cEN6UGxldGZqdmlRWFcwUDVBTzh6c1h6ajBlMVlFek9mQWxEYUNnc001bkdYWW9xVi9RSkoyUGxFTitpc0FnSUE0eVkwcFc3SnZzekx3WGxGd2kvTmtnVnllVVJjVnFPS24yY2NWelljYmtFYXoyTWNLOWw2MUVaSjc2V2tuZDIzVmxzeExMVFEza0NUWXI5S1lBMWhTdldsK0JUMk8vZStuY3JwKzZDQUFEeXlsYWs0UktqcTRLRExHVm80eTUxU1pwMW92djRWQzdnZXVmOWtsUGZoMjFmVEl5Q1dSaHRidDV2RUFaYk9NbjV1bnhITTZGZ0FSeVRCRGlMSkhNNGh2NXB1eUdHZmJkSkEvV0FXemlieXkrNTRXNTJUVlFib2VFdFk3bUsxM3V5Y0JWM0dFWURIZmZZcHc0VzJIT2hROGZmZVo0WldlV0pvUTdMVis1VVl1U0g4NVJtN3JwVTQ2aysyT0RvVjR3a2hoVmRNTDA4ZDArV1hqUzRlNzVITU5zV0NQNnVLUnVSWmxNMytuQytTTU92Qk0wM3oxWG56c1U2RVk4MjJnakNSQm9Bay9oSFN1UUNnZ200Qkd1Y01XamJzRE9YYlB2VzYvRnQ0Um5oQVdIbjFFQjZHRzJET1IyYUE2UmdLeFk2NnE3WlAzY2ZzY0xwTDhJWXBIdjY0ZitEM2g1MGlDNVBoMklhUmZrYmVOUVova21xaVAwQTBzSmQrNHJkU2lMclJXVitEdW5jbGhWb3paWnRTWnlFVElvK2FKazQrRTYyM1d3UGE1VXo2eVIyeHlTM1RjbFlha1lBVnBVTzdMODg1cXZsa0ZQeTJ1aG4xY3k1dThZSDRkTWhDbUltSlJpdjhGeUdzb2swSWJvc1Z4K2RXSFJOc091dkVjbWZJSnFIckYwaXZEMEVyUktwdkNNWVh6bE0zUjZ6U1ZoMFZuRmo0UUxJS3pNVElYR3BjUDRLSkdrcFpGTTJMOURncGRabW41WUU4OStFa21ZZFA0TCs5N0V3d3YrM1RsNmI4NnEwbGkrSFB6eTZpcEtFV0pqdS8vcVcxZ3ZpSTJKaWc4WGg5MkZlMlY4SW8wM2tQTFpITkMyQ1EyK1A1M3BScW5zK1Bmc0tvdzRvd2dnVXJNWlBHY1g3TlRTUms5dXBYRVNGLzNGdENkOEFMbnZZSlhURnQ4bVJkWjZ0OWJJNXNLQ0l1RVFRL3FFNzhkSjZsWUhrNEswQ1lWS0pxVGJma0JTa2ZRN2x4dVVZY0RYK0JJSk51MWtPOEhNbjBrTW1wNm5ZNjIyZlNwUkd4M0RRY2xCMnphdDV0czJEb3JFelVmV3h3NjNJL29qczVYQ0ttNWp2MzJLQWFxVWEvTU9DY0FuMU1qMCs1TmhoQ2hsWC9DUWlUblZyWDF3RmZmcEI4SElmbTBjWDUxaGJQdXNvb1gxVjdnYTZ6RzRYdW9ZdnMrMHhIQVFqeDdEWVJENW0vUzJFNXVqUDlrNkRPTFZYemp3Unpvazl6bjBlWWVFeXBDUEFqTWdXM20yeUFGMTA3VmNBcWNEaWFBRDFWU05oQ0tMdjA0TWN2cWxCa05Gck5QWCtjZkhidzB6QTZwbE0yR08xcTRpY05GbGlHM3UwZ09mNFV0ek5xZ3VzUUtHK1BTZ3NjZFRUb0dyZXpOcVA1dFpxRnVhZzNKSXJyOFVPZ01VajZVOS8vWWUwK2YzL2hBUXVqRVUrT0pNUDFCMmNsMHNvM1pxZVNjckNoMkg1VFlKOVdVQklSOUtram9STGFQMm1JdGJiSy80QVNsMVB5UElPbStEczVXSUlnL3p0ekVQbDVHMG1FdW5tQXNKdUZmR1dQRENhNEpZeXpoU0NaNFcxTVNJT0JvQUF4RHRiRUdKTlVVN0FQSndzUDlseFUrUlRzZUlpTWI5OWxVQkRWdG5DdGFkNDBrSGdDOTAyY2JaSU5NY1BEUWg5NzhBZnZFY2VBcU1OTm5VZFl1cmFkeDBWRzZTWDRZMStmQ29PMlhTVkhmMU9uRDdMOXhPSm85MTJOdlBscENYUkcxTWovVHJDZ0FKRUNobFhDQ0w2ZjNrRHBlQ3dqVUZtaE5JVkhPQ1pZV2MwOWNENG81WGhOT09GdGpRb0N3M201aTJkbWJ3cXVaaDd5aWxZU2E2Q2lSblFkQzhYSXZQMm81MFVpbnlsZHR4Z0VxUXk5dHRKUlZjbE5aTlNSTzBWU2lFQnlXb3F3WUxjUDVxSzYycDFNc1ZUbkErNG5vZnBWdmRzc0RmSitMZ2c5aHZINUwyUEtEL3RmZWZUdURGUllqdVlpMWpMZVZKaElHUjRUOW51MEMzY2JJUUt3cEN6dCtEZU5FNlEyakFQclRmUG1ONmsremdVS2JEY3VadGlyaHF4Y1I1T0NGdzI5d01xYTJtVXFINlhvOCtpYnYxT0R0L1lKYUN0UVMzVWhMN09DNGYyTDIyTFVaR2JZKzl0NnZnUVUyY0dHUU5uaFZLSG9GWkd1QmJGZ09uSi80RDVISjlzdG9EaytuQTA5QUxsSk9LOWJlVDF1V2FmS2ZOOEtHbXJUdFJNMG56NnJTb3pBUjJOTmhmN3RoQkZvYTlrcTMwQ0g0YnlibFl5YUxJN2N0TURrQlk4dmRFdGxXb3Zwa0ZYVmthemF5d1BXUTJVVnZ1aW51Q0FiL1I4bWwvUzRydzJJTlJrVG9oZTVqTkVsaXo5UDUyWDF3dEFTbkFrZ1lXK3Q3WjlYL3lMcVhnU2RiWHdHdFVnbmtWczlzNmIrSlpGU1cyRm9KazFQOHdoQ1BLLzFzVG4zVkxJMWNtQjlleXZCaXBZMjNNYjUrbWViY0c0UzRQTUtScTQvaUNrUXZ4UDM0UDhlUFk5R3lrczNFRHpkZGx0MWNaT3M1cHp3ODNnNDd1YUFjeTBhYUNoMnY3NkVQWDZSRTdBUTJuRTFOeldiVEQyZk1vUHRhdU5GOGc0TDR5b2tGdjRpQzlUSmlkM09tNjZtdXpTYjc2Z3ZEYVZVOU1VQVFyYjh0QjZLaVJNUUNLZ21ULzc5SUlmSFgvTGpLeWU4bVk3ajZzSGg5R0VIMnlEY3N6RVlTczBFczUyWGxGR2ptM0hIMUJpSm0zVk40Z3RjNnBWSXRJT0V0aXhMNkw2N0RGYkdkbnU0WHdRMWJwN3YwRHpuTk9JSEZiV2o0djlBOFpQdXZCS1pOUnNBVzlVMkVBN0pHWE1ZcTRVc0kwUi9OZmZnSzF4N0tDZ2ppQSsrOXd4OUdSQ0RYY1NkWDZ2R0ZlbGRhR2lyOGt2WTc5ODk0dDc5YlE3aVJzaWhXVVduT1p1M0JxN2xtN2xDdHJoWnB0SzZoRUFZekFKK1FpSjJRT0FockhNNzlKb2JKV2lXZ2VmN0RnT0lZUmhQL25rTUE1cmdJeTVsdG1SWEZYdGtpejZRdzBPWVVkV0F0NXplLzFEUllaVDd1cllSYVUxeE9XUUFkSjhXYzRpSzV4aUpMM244aGNReW5XZFM0UFBUUm9JbE92OGRkdWE1elZaanJMcm1wNGlYVlh2WUY1bmxuTVhXUVdMYmY0aHV5Z2hqZC85RExQc1Zlb2JwcE5kZEp2WHFMYUh4eEpnNEpjSTFCTFYzcEtrWWpWYzRNeU50Q0t6UjlHa1JIbHE5QTQvZVg1NVhsNjUwS1cxaEJsOTBnbXRQN3RLdE03ZUpLbUo5VEpidjBuNkQ3bEg1U0UyVWpRNkhvK0ZvQjE1TzZQQ0RQYXlycXAzYkJ6aHgrVFV6QXY4MVNuamtDNEg3MjIwakg1SWFRSG5nbGJMRGRxd3Z2WUtFbHhPWVoxL1VoeElFOGF1VVBQblFiaHIxeDRlNnhsSGNrb2RIOGc2QU1LeGw3YnoyYkVJMGxXMTRDcTlGb3dBazFQYVJta3dvNmlITFF5SWxmNTNFeW9TRFVyQmV4UmRYL3ZMYTFDdGtZQTdKcnZwT3VrS0x2U2Q2TERUT1pCQlNqYnhkQkd1QktuQ0l2cVplV2VXNWpsWUVYbjAvR0syaHRjTTNpNjV4VGIySWFCVlFlYTZVTTVRdkxMWVhvc1QwdmZ6N2UreTVRZWxFbisyT3lCTnVxSTJKSUZKbUFjK29Dazk5SU1tZXlXb0I2WUZFSzFPSW9sZ1ZJNE9qSHlZNVhkbkdFSmZGY3gydk9EaEFWU2d2T1ZEZUROT1hxb0hweWlSSjZOYjdPZnNZTEh4YTFib25EaG9acW84dTZGWjNiVCtMb28zaWFpZmN1VytMeTdsaytkQTd5bXZoaGt5SmZRdXRKcmcrb0xZUFRNcmpHY2s1VVZSWjg2UkszMlhrVnFNcW9aRk9nakw0YmoxeEM5d0pCdGowMndFMlpsNFVSR3E3WmRtUlBZNmRKS3NLNGtnQTEyY1FqUDlBbjhlRXZvamxJN29qOWFPakhXZjVTNUt3Q0pPM1E1RThzcXRmNWJ0a3JLQU1hakk2eGw0NmNXWWdNYmZzWU5yNXJibVhNUHZQQmV6bkN2OW80VmFOR3NDd2tjWlIvbW9NNWJMZEpiRHYwbVUzdmUwcWpwbzhRVElZamgyVmQ2ajJCWHp4SytCMlZTZXQyZXlmRTR3bDNjRHBsM3FxbjJWRDVJaGw1S2FISlJGdzlBWEMzNTVFWVFLQk1GZERyOGdWWnRPak1GK05PeWhOZGlVaXRBcGJqdUU0eDFTc3FUM3lFL3dyVmRINXcvV1lvUUtleFc2UUpBRWJUSEVhSEluNjFmR0hJMkcxZW96cmhibWZHRUZuMS84TDhIZVNJRmQxWG5JME5wbEhhZkFZR1E3WlF6dVdQUUMzbTIxcTRSVmNtb1pwRGlxR3N6c2J2SmVkUjN1Y3JMMnJ2bFVTcFhqYXVoMFJtelkrTnlkNmZJMHBmdUN0RzNZNmdUN0dZVTZjcDRZcmExYUNXQzZIOEwzZStMOTI5VUhFd3NlZTFEVDdtdjZqd2FGakxXTURDMURFdmdTcFBVTjNoMldDYlJVQU1GR2YxVFNYYmxaOWxmOUFydk1SbUNyaWhBdktPRnVkZ1NCQXYyYjZXS05YQ2tieUZ4ZUJ2RjZHOC9KWUpqM0l4M0pMSkZuU1lXVHkzZVZDbk1ZYjdKcm5neFc1d2NPYjE4bDk2dUVmMThkaUxPaGhUUlZIZG0rMWFWanBGMXdyZFgxb2pnNHh4RmxBQkhqL2VTc3pkdkNUbGd0Zk1zR3FHbmJTV2FVNkVwTDd1YmVKRUlvTUhQMnpPVnA2V3NMRUNrcUpEWWN5ZllyVG1wSy96VXp4VTc1VHZIUXFUc0hxVlR4NXkxNmp4STd5cit6dkk3WVN1WHdhZ0IzVVdOUm0vSTB5aDBpWW9RVDRLaXVQb2FnTEpRcVZtM0lMUnB0ZFFoRXhOSVpLZDl3aCt0V09rbGhkZERDRlFJeDU1VWcvUGdsSkNOVXROMWxNVWI2U21kNkd2L2g1Y0xGdlpqMDUwei9jMU9MaWJzaDVoK1phSDFONjI5dnBmS1d0eDNFVld3SE5rMEZ0RUJyV09PNTdmZW03VTlzWHB3TG5qcFpJSEhRdE50azhVV09WbGVMQmlCOEZ2eDQ0VFRIcXdEUTBuYWpLMDZxYkkyUHMwZS9nSmhvRTJUbE94czV3VGZncFRLT29zL2dsTFp4dGJkUjFMU3prUnMvUmRqOFdMNUNRbnpUblRLQUZFT3ZIWWpnVWZQRFo1SmhZTEI1aTlJQkNObVY2cXRqZUE0M294RVlHTXROUVNyUXFPSllTUUVZYlZWQVVYR2hLT25URFAycm8zSTV4Y0VkbGtHZ0JYQ1NUN24rUVVINTNhbGpydXR5bm5uMzV0UUJIZ3JJTW44VUdMeWZvS29TZGJFelNMeFMyUUgyRXZwQUZ6YTlNNWJ4RVJQY1N5bHpVNVJWL3R5TWFZYjRnRmRQdkRPQTFRSTBMSzRSVUxRVzlzTGgwemtJdjBrNjR1TWc4aTFFRy8zWGxQd0dYeG8yTVc2bjJTdFVkeGxXR1VDbzZreWhzb2ZaY3RGbk5NRk5UQjJHSXNralVBOXlhVEJzNXYwanZrRnIyTlBtMi9JVmJlZ01CNmQvOGNWNGtObVhlT1hpK0RGL3U2Q2NMbzltUitFQWJyRjhZeHZNcDBaVHRIVWJJVUkxb0ltMFhOTExRejIwUnNmbnFoZnRDYzVFZzQ0NktBaW4xTFRPS0c3ME5MNDlyT09QK2hqNjhrZEw1QTJIajBNT2RSN1BSRzBiY0xIWHZWekJvVWJzUm4xcWN2R3IxaWMzVit5eGc0V3picFp3U0JiTjNrQmIyY21TUGlFdjZOcUduZzRpd0RLSjEvaWpKNWxLc1ZBUVhORHV4aFp0Tkc5MFBIQjBFaFJQTlZjeTZ5a3lUT0tZSzBXYjlLRXFheW5RcnRrYzVTdkd5eGNOdkZFZ3VKNmNnSk9RZDY3L2gyaFY1YW44M1M0WDcrTWNaYkdDMG0wbkZUSUswSDFBNXNHMkxiL3JWVnZPVW9vdHBWUmp3T0I1OWZ0WDVieXdYeldBQzVUR1JIdVhCRy9UM21FNXJHSE84eVBhYitUN09tR3A4ejI5MjE4Z0FTTXpzZ0tzUEFlYzF3TzJvVWt4MGQyZU5ZUWZJNHN3eDlIREpCSHRwL2trbDZ2MFR4S3krdEk5b0wwaHZ1ZC9kVElvU3pPczdqNXI2eU5neUVTVGpVYVovSFUzMjhyNWxRVmdxYTRodytUVGtVdWNxVEp0QU01M1RMdHgxcjhlTWU0cHBUWEZFdThuZmVmOG1xNlU1L0V5dWJzdXBhY3BrNUtoTjdCUEdjd0pIYU5HTXBWSnI3VTVDcXNiaFFhcTB5UnB6WWI2dmhLQ1pKQnkwUUFneTgwRDhOQkpWbUc1SUh3L2JQWUFSMncxaGsvMHhsVHI5SnN3bklYQjk1dGU2bGk5RXYvakx5YlU5KzFPcEFCSC9CeGJmckV0MVJWN3dGT3I1cUsveHZ4MkFtT0ZwMEVidjcvdVNoYjIrSkJLMUUyakx6RzRQRHZzK3NEZXdudEtYc3IvUHByUFdlQTRPRWtyek04eXI5K0YvSjlMSTZRNysxVnErUkJ2WkFWanYrV2ZqWFIwNU9pcVVnZHlxbFdoN1VSN1RKUDB0aDZoUHZFblpZVFhCRFBDUUdndTRtaHRBVFBRSDJkSWN4MW5xc3h0M2QwT0x5L0xIY0g2NmJuVC9nUGNBZXVEaDhuUHNUemFGQ1FoNmg2WXZFM09SYkRMcHJQK0QyNlRjWmxuRnRCSGk0MGNzZGJjY0JVeDBYVWEzOHdQdW96cmp6RTR1Z0lXMTBhQlRxS0c5Zk5mNHhBSGR2azVUYkhCb291WjBHY1V5Sjk1MytNTVZ4NjFmTy8xSVlwV2g4djlYN0kxUzlTNE5URXY5VDErV0h6N2NTaTdMamJNWnJ3LzhpTVR2L1ZzekQyWm9aT3FpYnBidnpjQSttTXBSMmZIWmJOV055YU9peno3MEMySVJIT1pvTUYzS3lkSEdPU0dMbHdqcWR1a2NSOVRGV1VsVHFYcUxibjBjZ3RSZmNmSnF0WEZEWGV5dFp2aHBkUi9pOHJvb1Z4RW1UVC9tTzFUbVNKVS9HM2lVNE1COVRlZDQ3UXNQTHlYcll3TUlxQ2tWaGY1STZDdExQQ3llRXlpWmtudkJrdzlSR3gxbFI5c3Q5VXp5NExVSVFKeVoyZFZvTFNMNjAzTkM1M3h6bWgzaUJSNnl4WWZTS213ZmkxREdIQUxUZlRvblNCbTRWeHZpNHpwalpKaXRLTHJpYytpY2ZXMGx6Qjh2NnpaVnpvUHUyNWNHTzlacjlKSTFOamNnanZPalcyNEduWlNQeTAweVZvcnRSeXZZK2p6aitRZldldmx4Yjg3bUFna1pRT0YrZ25vRXNPak0wVFpSRjlOeFNVaXc1bHJEdjN2UlVQZ2xyem96TE4wZDVTaXRkbUlIS0lGL0VPWGxXdGhLcUVHNllCQVhweldCZUFMUWx6SE1VSFkxdWdERFNzeS9FRmMwTVErVXJkZkloOWNQMDVEYjJHOTVVUm8rSlhHNEpsOU1UU2dkUDR6WVBJMkRhWkhQbG1ZWHprakFHODJhaE1uMXdRRVhVaXcydE1LMVJQVk5RVStsV3V0aklYWDhDcU1aMHhVRWsrREw5MGNmQWpuN1pLU1Q5S0hOZWFCaWJoaCtUcjByNTBCRUthdkd0K01aVHRQZnpTWWFRa3VHZGQwR2Rienh6T0dvVGMrTVdZOVF6VlBFMHovQllidGJOYUVMdXdXdmhjZFlUZnlNWVkvelBHU09WTGp3d2oyUHZKQzU2M1hrdTBFWW03bk5oUVUxTGtyNnNCODNHNEdXL3FRKzZ6VDNsbmR0bCtYUkVETGVKVGpsUWdnNXQ1MXAwM3YvTkZPeWNjV0s3b2MyZHB1c3dER0w5bkhqbkdrSXBKOU5zcllZbXU5RnhlcGZBRnRML2NKbW0yRk1kUjdLSEJDNDhvVkFWNXVOWXFYdWJMaG1QRW9vQkhNRmMrWWtmazBCYlhlTmlObmRCdERXb082NHcvVGUrV0l5T1JVNzJUSFNPNEw1QklHdjZ5WU9wcitpR3g3bjNOVDF0czk3VElOVTUyWFJMRktxVDBzTDhXcjNKVktLa3NXQWRTanZidWlWT2l6VU1QM3VCYXhZNGFnYXBzYjd0eUloOVUvVHpwMzJ4Rzg0U1gwNG5iSlpZNGo5ck03TG1iNDJOK093Q3A1ZUNsN2xNbTFDdlM4ZjhQdm9hdkJ0VFNKcnAxKzcrSFN5bWdQS1Jid2RvcCtGSDlFV0k2bSswWDMvS0xTVVhYVEg0N1RtbHlsTExKQ2FFUVpMSXBuL2dPTzNKK1BhcEpMNWtYKzdjakxWTW5lR202WmJvVGtRQUZDU3JBUVdWNFMrU1ZFaE5Kbk1tVVk3UWZ1eFNLYmpyVVlMWVFYeE9HVld2bUh0dlM5ZEtJZ2drY3BLR0hLZWZJd2NpUTMwOHZSRWhuRDVnU0YwZkhYOC9UMWFkK2QySjdpK3VnbE41dFJleVFZOTJOVzFsU1BaNnhqNE01WHk4UGg5NXI0UHVQb1ZsbW5GMjhVaTVqblFqU0twWlFLMi9nK2kybDR6MGNML0VUV1lnTFZXQW1Idk5iUVR5dFoyQkh2ZGNDTnBZQzdiZWIyOUpFS1JDTzJ6OFd4Z2JDWWpoZGZNUUU0R0dFVkliNDE2eElDbmNCT25QeWxyVE91QkM5ZHNrdmRIeUU3TDFxandKalZhMkQ5enhZTmRZZXlreDR1am9oYW4rd1VCcGZNVkhOZmk2UmdPbEVFSjl2a25hWDVhZlMrY0FlL21wWkpHd0NwQjdWWGZhUnVIKzZPcEdrYjZNYk96b2FIMlRoOC9LUWxwS3czS0NPb3NHUW4xMEZ2aHZ1QVJFOVBXd1A5Wjlqa21LUWZCbUFwMnlOYTM3NERPVzd4RTB3SUkzdmNTNmJkNGUwVE13emltVE1iVDZUVUVZamc3YWpobC9tV0FlUXovZEs4VW1xSURxZTYvOUgrUFlpbFY2ZTJVeUJqeHJVYkFxalJyU3R5eWFYd0xRdDBPbmxtMzNmZ2Q0Ull2VTNndjlOejF5cDd0QWNYSXAxR2lPUStOOTA0Vkp3L1k4a2hFeEZYVjdEWXlIV1pkRGExUmY3dmZzTFBLekRjZXF6bEZLMVdINFd2aSsvWXFaZjV3Nmg4KzRINWM4VnY2bXV1K1pUYlUwdzF4SnJUSmtoSkc4RmxoTFJmajJjbGFUMnhPdG5xTnNadkx2N3l1WS84Q1hzQU9yYjRwbUhxSHNqZ0lyS3RxRlI1eTY2aW5pOHNlOHRuNHJSc2ZxNW1ORDVPVmhyYnJwbmlweFR6bjV3K0hsU2RMU0hhWGpZTnRnVlNOMFBmWm5tc2t5TURUVnU5TE1ZMmtxTEl3c2doZ3cxMThTc1dNSFpVWVZiUmlWRjFDNkQ2a1kxbXkzeDdteGRocFlQM3FKbVFqU3ZTZkU3ak5QZnVLRGI4MnhBM25DNXk4SVdQbzQ3QkJFdmtCOHlwcDBWY1pSdElaUjc2b0RaUzdxRFcxUFlpa01wM3hYaWZSYzloWVNzeitaTk5lT2NhWTU1eUdtSDAxbVN6V3YwbmNTWkVranRhTHF6ak1yd0NtZlhHa1EyK0hpTGVPTWhkSGZ3R3BxRnJhM3lkdVVyU2dWMmhWZ25nSjhGaU0wQiszWGpVTm41Q1BFSThZcitkYU5DS1h0c3FzaXF4MUw2UjRZc2txM1NiN2M3amVXU1gxSFhkeHZ4dlZDVGxrTm5UTnBqK0ZhSktoMGJPR3dqaktWMXBCOE1CYzEvc1owUnFzTHFKdDVsN1drSXh0MWtEeGVWQU9tYjFUcTFXa2hIbUVPUDdZQVIreW5ZYzlpaXdYdGZseDJBU2FhZUx1SU0xOEd3SWNrVk5ob0RJa3VnNlhEVGJvY0VhZkZDbkl2TkRKbFY4SksvS0p1anowV3IyWXNEN3ZybHVxSytGN3UyTU42QXgyeTZsWU5TVzNnblpwYVFNZkFOaVlmRk1xSjM1WUQxTGswSVBSRThFTmtsMUlrMEFuVk1mQ0tjNmYraXMxc0t1RVN1d2luUmdhU3JmR2RLRGQxVDFkelg3N1E2K3FyY1d2Z0NjY3d3NytiaURHZFdZcmtvNGw4MDBjZ1pvQy9VaHM2T0huYXB2WGM1QTNRcTF3eVgvMUE4WWRzK2d1eXR0SitGcHU0S01vdFhJYzVjYzNSK2doSDJNMXNydzJZQmRlUzNCMXFYemFseTRNa0wwblFlclJyYWNyOW5LYTdtQUd2QWxiU3Fsc1lvWXh5dkF6cVRVN2YxODNWbVV5a3B1UGVvdVA4S2RhSS9nTGd5bUVJV2JDV2IycDhKQ3NwMHdTeE5iUVBFMk1xM2c1VG41ZlQyZnpaTzlUbE03NHNPQXl2N0NNVjU4aXIyaVpyYlFPRXJ6djJSRUJMa1dhWWdtRytuOUpRaFlaVEhSL0puN1Z2R3RwbkF3MDhuUkowd0Y5SXRNUGZVVVZMeXFORWJJYjhKdTFiVE05cXVPL1k3enEzamRMT1BHTGVqdmMwWkRVeGxuTFpvU1dsWWJEbW5xMXlSREhLb2d5NGJpeTJCaFVDSDQ1Z0Y1aUxwd3pxdEtZYUZzSHp2SjkxSlVaWElNL2dGS3VXRkFqL3pzMlF1bjZYTGNRbXdaSzhIWnlUYzhrTnZ1Wmh1ZFpsYy8zMU9zWVBBT2hMbUY0dVEzeTFXTXZYVXZ4V2lPN3AzSDZWQlVRcUplb1FCSDZ2UzRoZjYraElnMElDbVFIMm5nVmxobG1YbU5OZXQ2dHRMcW5PTFgxVnBnaXZLVnh2aGtoalMyNVNrOXhVNk9NblVZU3VpSWhudFJydXBEamdRWnl3M21yaHRKclJuNXB6TENob3pSOEpUMnEreDVTenVaUllnLzJoUDlCNEs2MFVPVHFvY1d4NWllOWJhZE41WnlzVkZsUXVVUzNXMVpEV1B6RC9ZcS8yRENhRnBKQ29jOE9wMExZTHFodXNMMzQrVk5ZS0tVbGJRek13R3pRUFRta0txaGRxMmlLUG53OHV1Q2l5NDZ5Z0NTOGlWVWEwT293UEVodzNKczJuR0R1NWZHdGJSWkRvU1ZESjlXclZwV0gxZHVUS3U5VmNwK2lzbkw2V2dzTWkwaHV5dUJ1eDBoOEc5d2tDUTFwTzVZK2VKS3Z4dmVKU1B5SXlZSHNuMlhOcTVtRlBuVVFHZDQxakVyczhvQ0x0TFFpVEtuTkE3RW5wSlFNSmN3S3FieWV5Z0NqWjFFOWc2enZ1eTV1Q25SSTVOcG5acjdGTExhOTZYdUdmTzE3SHNoTHlCSjVkOWlSaHl5YVplckJFYldzZ1lYcUd1c1czUVVlc1Q2UXM4UVJSTk40bHB0MHZucDNJckk5anM0Y0NsKzQrZ3lMY2s0cktnSXBCMENMNTcxTnI1emI3VERSYmNkWjZnMExtY2RrWTN3bXBrNGVCeW04LzFOWHdZL1p3dVhKS3RBb3Nid2lMTWt1TGJzSnNVMEx5YWo3a2J0bU5TNlc3aWM0ZFdMK2l4UllWbGtQTzFQMTdrTDRNQU56SzZYb0Z1a1JnRStDK0tnUExxcnFBZmdIV2JsM2twYWZ3eXIzMm1GbkI3VkhVNHlmUkRQZHVoMXUzQVV6WmtkbkZvWlFYS3Fla00ybHI4eW9Lb3VUNXBxdmgyQ256MHFMSFJxVkdRYkMwazdRZDJBSlJSZ3pveUZkTWErQU5KUHFJOUlBY3Z5ejhLWU85ZTgrWEg2MUdONTN5enFuOWdiUDFMQTErVjhBZUpLa2tRbS9LeXZzUzFJbE96VW9nWXdTeTVaWTJPYmdPS3FRc043dGJ4NU5ad1hhdTZLN1BvL0R2M0J6dzV3T2VsNkFSZEpjQ1ZhUzJYRVMwOHUycHBxVVFPSlh2Y3RnTk94YXB4eU5pM2NPWUtRREYrR0hBeE1rL3dRMWpwTEhseldJUndSR1hkUjVnUzVKYm1ZSHQ0dWc5T0tkUk1iYXFjMFBrdVhYME9UODRUbGs5R3FzY3dsSkJwUERiWm9GQlRyaXB2d2hJNmVKZnZZWnk1LzJqUmFKc1JmNzl4cHM1UG9uNHFJNHR4RFplQWxxYzFHT0dhSC9ZN21sc0ZKTHl0WG4yTmZ5QUtIRUxNY08vaDh5SjAxOXJGT2Urbng3ZGtQNnBuQ2ZJbGhzS2cyQWdqd25EWXB2bE1lVDlIa3duMmY3SGkyQUsyYlFKdkhqMUJ2QXUraWYwblQ3K2ROdFpJM1k5T1NuRHZoSVNFMHkxWDAyMm96SVNIQkdyVmI1elBuN0NiUHFtOGsvcEFlTnBqMjdKL2d3MkRUdHJOTXM4a3BlTEpHVlRHNm92bUI2VFNHL1ZVMFdiUnY2QXQ1V3h2WXpKdE9PYVFzdEVDNXBBSVF2M2RPVHRmQU5HMXFBZUMxRjlyYjVuWCtQejNyQnAzYy9DZkZjclNnWjJQSGFjSE9NOWtueks4U09xcWxQRkNvSmN1S3IyWkRMbDBCQzhqL3NCYVVuMTdZbWRPRCtHVUR5NGt1ZDRiVTIvTXNRY0l2eE5uQVM0aW1pTmNpd2w5TzhlQ1RlUlpHWi9WRTg0WHh4ZkQxQkMrNDMrQWYxK2xuUk1xVjBtOWhkeDY4TnFOWU9udyt0R3pvK3ZQdW9hMTRPN2tqY2UxZWFFd2ZsdVhOaGEzMUdIR0Njbk9DbVllZDdwSWQ4ZDdSRSszQ3R0cGk0UkJWcFo3b0F4T1lsS1lCUGJKUFp1NWVEdHFSMThqN1B4ZHVBK3l6ZWhrSXdCTzFpWVJVQXE3VnhrWC9ITUJDd3crMmdzM25URm14V1NQM2RaazZGRU1vRzZpSDRSM0tGL1V0QWk2RVVqRVVGTjhIYjRaalh5RmY2L056VktibkVtd0thbXJ6OGRjdjlPenI5ckZnMG82QjRHalBTRGZTVEpxdHBPa1NNYWtYNE5JeHo1c2Q0dFZKdzBvSis3cXBUdHE4T2ZyLzFUa0wvTlBrQmJLTkdzbEpSd252U0ZNbDFpeFBDMm9QZzFVRGtzaHMxTTVCSlpNbDJqUlp3bU9WNEpMV3ZFaUJBL2NuMDJJUHpLNGw1ZUJKWGF0MDZDcHMrcFhMdW5YcTlLbzVIRFRkK1BVM2dJc3Q2KzJxUXVZQTdVODYyc0h5NEp4ZnR0NWRFTDh6ZlpLam9YMVVtQ2k2UFRBYjhNZG83UHcvaE5QbDVqWnYyTEc5Nm5HeUltRkpTaForMWM0c1Q2TTdNaldqRHpnVHlyMnRjakFMODhrQzJFTlRDSnVNUjl5ZUlXOUt3RExTUlRYYmdoY2N5N2NVTkl3SHlHZEo0U1pmQ2wxbFJKZ1J1dnVuc1FOUjRSUzVUMkVodmp6TW5xZTNrVWtsY0F2N0xCNXByai9IZXBoSm94OEtNa1JRbXNlU2wzQjZZUENyU1puaHNwM215OVN3U1F0MEgzS1hPdEpLU0dkdDFlQ2VoZUg4UkczWTIveTRKaXhJb2VDcWN4RUcvNDVob29oUG1FOFVoR1l1UmJIRWxLbXA2cEs5eHNqZk9GNGdabDRKSmJ6YzNnSUNxdGpEMEY3dy9TSGJwVndIYTgxMWxDKzUyYVZxalJ3UVRYVEF2eHc0STNSbEtQUlplUnp3VGhJajd0Nkh1S2ZEbTdVaTczeWxQWFVZNitMak5GM2JRckxFMmttMlZLUXc4NFByUmlRN0k3WEh5cXNUWW5NdG5ZSDQzYVJFMDJrbXI1b3RFR05vb1luV01aUVRISWNiME9ZTU9qY1JUMzI3TDNwNlhwc1h6NmVTdzlmOXU3N256Qk12L09raFcvZ0F0VTFBTjZ3WmgyVkY4R09UZ3hCbW1qVjZoSzE1T0l4QTZ2ZkZXRzBLSGxLdmpBQW5VRXd0ZDFwV1lXRGM5K3RrTTlHMjJEQzd5emZsVXFKVFNJVWNhSjNtcTZ1ZXEydHUzSmJ3ZXo0eEI0ZWRRdlFGZ1J1K2w1VTk2Y2RtM1Jhb0dyQTZZVk5lK3VEaGJ0cUk1bklXRS8zay9HUGdPTmpoVjlZZW9wYkEzWEl5T0VtZXRwVU9ZQkdDcUR4VDZzdWhtWXJRcjVwTlFnV2VMNXJvNi9qQyt1alJJWDRaZENSTlpvWHV2OGtVVDRYNW5QVU1DamVYb2pzYVBzaEdMVWxXZWtuTm9pWkhXZGtOZ2lFVm50TkZSek5sOXJlQ3llUlVZWTRDQTZhTC9ZVEE0MEs4eDd3aXhFK0FLcGlmSHRqQU1uN2pCL0xyMGFxZ1pzV1lYajk4SVFLUFo4cUhKRTd1RGFNRTJGWFVRRFp1K0czbkdlMFJBaUdlT0hlbXZaRktQTzFUcVNiSmUvRjVsbkE4Y1RETE0xSFVyTGJHc2loSUtEUFRPeTM4cE9EcmdNVFNaKzJra2lmcjQ4dFZBeFNWbmFUT2dwYmloS0czOUppMmxLNThJUFY1LzBpNXRRQzZQbi9rVXlXVnJwTEluVW5IbkJucWhvMGhRaWc0TTFJdHJzSXpmcDZGenhTWHRDYXBDY1BCMTBJN3hRSldVb3BZR3haUnF5bzhFRXFmcWZJZWpFbDUxcTh5SE9saU1uUEZwOC9ZSkVMVG5ILzJ6c2FkNTA0TFoyTEcwTkljR3p1Qm01anlYTWJqMFdubEZtaytGQkVMN0Q3QmhLWHVlVWdBN0NBWEt0YXp1ekF2QXpSQlNCRmVvUE9GbWovOFE1bmErWFUwY0NsVTlOMi81ekhsWmlkN2wyMG9uc05ETnRNQXlBanBEZnpxMG9iYm9INy9pZ1RIMDBBdHRuYnJYTHpSSjVhS2xnL3QzUllPNUZjWEpPNVpIOERXVWYvOFByTFF4TkVqQ1ZnelRUMURNVFV1aGV6bXJIVkQ3L1dYaVlQR2E2SGZWZ0p2WlM3S1A5d2JaR1lFZS95RC9MYWZNTlZ5akRaOURZNmdFS2lYWVhjNUxaUXBJMU5XWVY0cElJa2xOVDRtZHdFNG8yNHNmaHBEeFNMekIySnVPU203dk51a1RhSzRVM3ZiVGNNMys3c2RVckRPUklNZ253TUVGVVFmelNadXFFUVFBTm5teGZCYmJrVHdXM0h1YmJ5SnZSUEJtNkNtb0w1R1ZsOERzSFhvV29raWIzcVNUSE9rOEljWlVnVjhkZEQ2aS9URVJGSzlnalRHMThMOGRqdSs0eDgxVkdpY05Kb0tGcXY5ekNSTUdVRU9WVkNaa0FwdTBrOEovVG82Sm5BbzI4UXoxclpCd2s3R0xuRUVEcEZEQS94ckx4NEVjS1pGN29ZSlhCTGN3NFpJRVAxNW5icVBnZm9ueHE2ZGZsZm5OQktrZkJMZWNoa1d3cWZFK3dVZnltbW1WS1BLRVV2c3NyZU5QdVdGUXZxODh3Y1ROQnlCdGM0M0ViZWFOYi9OUlpya2Z0elRBbHgxc05QdllsaU1qNWowTDk3VkVHNitVZTF4YUtWYVZLblV6NzkzVTBocFpmRVFBWVpKS1hlb0dSbkxNWWtvMDNWVGtnRU5zVkoyWkw5WHlpd0dUS2JYSkZieEJqdGVmcFVSUE9WSkU4bi9wNnBQZmhqeTdWWjFDSU1CYjFtald4RUIyWVgreVB4L29qQWY0Sk4xcS9rZ1h0R2xRbWtDZW9STm1oUlFEWmlGcUJsZDUzMkEzaDdWUGUybURaa0tXSmxlV2d1WEg1bDgzNFZJcXkyRXJTUElkZ1Zva1B0aEdxalJZejRnYzlPVVp1cjR2NWk4NFViRUREVU9vRm5lVW53Y1dld1RMVDU4VUJIZ1dPY1NLK2pKZWhpYWc2aHJTSXZxdG1OVjduUm5TL2lOcWl4Sk1JdWtpR01VVTFyMkhFYlVFSVBpdDhFM1VlVVdxRE1OY0hSYjBDWE9PdGRZUFhNYmtZZHY2d2IwWUx0clU3dDR2R1dMUFcyWVhobWR0YkhtQWw0S3dRYUZaaGxsdnc2OHovVG5VN25DRzFUdGtDQzdna0FCVVBCRTZJODBmbkRrM3kyLzk4c2oxc3dqTUR1Z1VjR2NFeVVxeTdBZ1JLcythcEpiNHE4MXNySFNGd0JXZElYdlhDVTZtNkVub0JvSFM3NjBIT1dsTlNnbXNpSzl0OGJsMVpWdlRQM3RZSkhXNW9ndk90eFk2aCtkRFlPajQ1WkFNYXY1RFd2WWlIMEZwblhRR3dZUGt4ZU9KSERLdG03OGhXMTFrMDVKbDBtK242RGoyT3BjWEQ3aExBOHVZMEk4MjVIOVJ0Qnk4NEVCMVplZExab0hVQVF3elBLakw5NiswbU5ncmJCcW16VDVqOXdCTDJPWlhiNlFGRFcxSHZReGRxTno1ZG9HZ0ZuRGFJdys1VGV4REFGWWxSdG1Qc3BaampSWXhCWFVNRUFReEZpcFpTRVYwMEE5TUZRaGJJdTNxNS9ITmxNUVpWOUZHaTltcS9hZm9UMldLY25TWEZ6aEpmbmlZWmI1Snpkc3cxSnFEWTVoNTZpSnoya2VhaEQvUTdTZVVDclJCUHB6a1BMTU93L3hMOGdvNWdoWTlkampGa0ROZEJiSjNMN1p4Q2JyenNZS2UzMXM3Z1QvNW1Iay9sSU9hejR1ZEFZY0U5Rkk5TjF0d1JUSjlXTWdXMlMyZkNzZUxqbTNlZGxEeWdFR1UxTi92QTJscG1sbWFON0J6d0toYjRmQncwNW9RUkY1Y3h3RjAweXRMMEdpblJQTjFJcXBBVkdoa1BpZ2J0VEJpeTh6RWJwcXQ1N2V6cUZtZFVXTEh2aVJ0NDlOdnc2OFNQalZTL3pjY2dvcHZUU05Ca1JKOUJiaHRFZGpDNUd3cGkxOVVBV2RjUEl3SjVqSGpNZnR1VWVHMFV5bFVBV3hFdy9HK21uMTREUmZCUTRZNG9PQkhvVndFdkN3TmpPVnZVRXJUOStZaElsaUIvRWxKMi9iZjlBcEcreVFMUUMyTE4wME1FeE5Xa3JtWjBYSjVPODFoSHdkMDJkTGhTNGx6QUtCdWJDMS9kYitaTXpyUDNXL3IxN3VWd2lpL2UrS01Kb2JublN3OTA0WDYvWGt4VURuNVVieFRVZ3hWYTI5Q0ZlaFhiNitpT2RxWnJQd21UbW94WkQrSGMwN3BCblBJczhRMjd0MUFrSWlORTNSSndhY2MrbkNkak1PZWNxL0tGZHYzSTVNbDBtUGhQUUZyU1d5SW1kTXhSclZWSlZhQlJ4Vlc2Slk1M244eXdJZmVhRk40RVo1UWpTN1p3bStzSThKY3NGSm9BbTFCb0kzUDg0Z1F4ZGhiU3ZHT3cydjNCMWMzUE55U0srVFR5VW5BUGpKdHpZTjBtcFBZUmRQT0lEZHp4MVN3VSsvUTZnUUpaTTA0aU1wS25ncThEUGd2U3FicWQxRm9hdnRoWXVUYUk5d2tqSE5MRUlQdWhtdjdBcjhyaCszdkxOSFlUWmtWRmRuY2luSHhoaUZWYzdzQ1BZNko0TGFLRmJxOEw0OWY5M1pRd3BwSWh2NnF6SUl0MG94a0pkTzZ1bThCYk1DVXpRcDUvY0g0c3pGRDRUUjMyOEtXR1RkR1Ayd3N3MVNuSXNiMHErUUtreWdEOGI5bVlwZmZQRzUxUjd1NGZha1BjUjNLZyt6Z1ZOc2hoTW16VUVDL3gvNCs1L1lZdXBzR2owMnFtVVo2MnlsUkJ6am00eFpBZnU3UUxBR3hheHpZdzVwNW94bks3Z2lKREcydC9VTWsyemg3Sk55a3lOTGc0NGZrYUlJd21waFZzM3hBUG02cVNOL2RtZlN5S0krVWVqUDlBZVQ1RisrandKL0EvaHJsc0hSK3pNbGdyemRMQ1NRSjVYSFdHZkhNTzVWckdXc2pWQzhVRk5nazRmZ2tvSXpxU3gxS3oxOFRkd3Z5WXhTZStUZWw0LzZsK1JYTFp5bVB0eVlWbUxmaUFKOU52djR5QkhSN1VKU2FZREQxaUNUWFUvdHBvcWlMTXRqTVltQk5tc29hTlc0RWtxaGMzVlp3MnVuemJhVjZjRmdscVVDcU9IMDZ0bWZ2RW1hbG4weDJVUzlTU1M1UENDemhyelkxMXFWdml0T1YrSkhld1NlM21LbDN1SjJ0eGc2emt6V1hrU1lSWFZJelNCMU81TXBWZmpQZFFsOExWdVZ5R3ViZUI0dXZ2TFhCUi9zYVkzWFlmNDFnUUtrVkQzQTVsZldVNldYZTlMUVVLUEFnNVYxZExDWGZYSE5ZNWlaNE1tM3JDdHVkMXR4eHdPNHV6Q0pVb2VGTHRNaDlFQSsrZUVaQ0N3OVNEem9DakhpWlllOGZzc0dLRWc5MVFuZkd4aFdGN3FaVWdTZDN6N3lDVUJWa1BYL0V3aGNYRGFPN0VUbDV2eEliUXBaRm1yQUJxOVYvMWxNT0tlZC9MRWtsc3VRR0xKZ004c2F5VzQvRytrYkQ1SzczYi9Ka0thREVRcE4zZVRIaVBZaHJiNHYxNEdSUE11N3F1WW1ReE1JSEpEeHNvbzV6b0x0WHdrQnM5TFhqK2IrZWZ5a1JVc2ZuMCtVYitKQUlEeW9pM0cvbXhCSHZUOGhrN0h4RUlyU1I1UzBFUm5rR3RGYnJTWHlkVjlIbjNXdUxDcHhQVFpCeCtRVVU0QW9CdnJsakt2ek5vQXRzNGNvYXhQMDhsNEljbEpjZW94ejkxQit1dDliRHBBUUoyNDI2K1dzOUplb0U4ZmY3QzkxbndRbHpaa0w3a0REQlBBTEJRMlEwZ2pNSXhsS1ArT2JFOU9rNW0zZE1mWnZ3ZmRhZ1VTV1RSNitGazNhMlZ3Q2RCRXhhTEpWNk1Sa1BPNnBhTVJDUUQ2UEhaRHdLMXVnZHhBTGFlNzJHb0VMT3paamR2akd2YjZnMVU3dHhxK2E2Nk1iaTBsWWE3RmlIQXNSRjM0WmFGL0lNYTE2TGZpaUNhODhSbnhNZEtiNTZobzNwSXk4c0hUalZDRGlYMlh6WGJ1NnN4MWZsb0c0cGt4dk1YVGZwMXNCQ3psQ1g0ampLZndNaHJqV3crTXBCU2YxaFpVMTBIZU1JbHBZeHRNclJNY0NzSTMxd0RvcmpIMitTY0JNeXU0Vi9oRUMwZEg3SmpESCtxSmZMd3NzbHpkMjdBVEFrNE0yYnkyc3hJU3NxZk9mT2hUMUJSdzdCUDhNS3RoMW13bzZFUDFTMFJWMXNFY2JaeThlVDE4RWExVVRLb2hlQ0VIZVp4bE1uR0dUYmlKaXJ4OEw3c3EybXk1cTlDMGtTdEcycHA5a2ZZQmxFRGpDMzBNbUFTUHR0N0pPL0MzejlxSHRWck5KZVVRYlR6S3ZyVzVPb2VReEZ0WXYzeXRBNW9JN0VnWmNWa0RpYW54cGt3TStRSlBRTHBpTlprRUpUWnYyZ3JqZVVHWC9iRTlUaXpEaXJ3dUpKbFdLVGk1aGo5Z0g2YmlxakQ5S0w0TWFuN3M5alRjNDIyekNaMnZTTGwrNG4xNGIzMy9oMUdNOTBHMlRPU0kwVXJKSFZRaHBPYVZhMHNUNnZITkplQ3ZvV1duVlBwdXVZYndqbEY2U2I3c0JLYUVERTkxbXdsMlAyV1ZOWjN5V2Z4MDZZZk1XaC92SHJrYmlpcmRibGFnU0N0dUxMMHlvVUs1QTFsNUlpQVBtaG5hTnZ0RG10VlJieXlOWExIVXJsZzlUZnl6ZmxiZFJzeXZFM29OVTJ3c1l3dDAxbnJ5VHVlbTBQQzgrUGlXemVFNXJnRFVuV29mVS9mWWVTVHB2czViMXdSL1dvWjlwOWx5NlNlSkZwUUM3TVMxSFhuQmgrQ0pYOXdaK0d2UnU4Zzh3dFU2R29peTRITEdIaTUvUmJEK3BaQzBhZmdlTHk0Qll5L3R1RWZ3UUpWRHlVWGFhLzl6a1pKR2NhcnFtSTQ5TFptZFlVNlpwUU9jeGxlbzl6VjQ0SkV0anFUOEducHBIM240SmRmOVRGRStjeXBkL01QRk9LUzZ6TkFiZUwwNlo2TEdrOU9KL3dtSFRPVS85QVVYMlA1aHlqdHVsV2FreTlsOHJ5N0ZJZWxyMFVSV082RDFXTnBQcm5Nd3g5T25lak9IUC9LK0R1aXNWZkZMRG1JTjJIQmtZV2lOWFVoYzZEcW5wSHFhZGtaVE1WV3RpTUk4aDJRZzByZkZQamdjdHBYV3FVeVNFVmcrTC9hL2NWS0ZyTjREbHphTkdrdElQRE1JcWdibFF2dTU2NDhmOWFyWTcya3dUOGo5di9XVWMweU50ZUU0a2t4akdMLzFiYkcvRVlaaEluNU9keGpUR2NpcmViNC8xcVROLzVZVGRTQkkzRks4ZHRIUk9hL0g5eHhDdnRQWHB0a29BUFlYVWNGZ1pEcmdkQUFtajZqZHFiVy9kQzh0ZmZmbGtUWlVoQmNGWm84MnRVQ04rZnN6a1lFNFRDTXp2UFFTN21RNUI3YjF6U2FSRWw2M2dHZXZ3L1hyVnU4eFlYT3J3dTRXdi9PQ2N0Y2R2ZUM4ME1jOGxMMU9yUHE0RmdKVWgrRmJIejdoNkVjTVExaFg2Z1liajY1dno2cGk5Z3Iya3pYM1MrUklZOXNrNFlXYURxZHJqdE52b2JCbnhhZ0NObW1uRDRYeDRsTklJbmlDUU01dUJjK0xwWnc1aEZ5N3EwaG5DdmgyeVpwQ3Y1a0NPSDdWaXFySkY0ZDluY3Uvb1hzRUhZU1BCQTg3MlRWRWpveFJ1VWVqcHZGQXNjMGhCVEpjejNITmdLNnVKOTljSFFyRDJPV2xZTERranBFemM0d1NjdFRJZ2RnMUVoUVFlc1g0MmhJQm9yL0RtRHNMU29WZ1E4cDI2YUovWUMvMittNWt0QXpUTWg5bFo5cDJ5RytpcGpQNmJZSGFQNEd2OUtpSXcvaXc0SlF1NGZJcGZkSG91WHhZYzNJaUhCWmZOWnlQaEJHdWtHOU1hNVhKVHlwTGg4eGg3RFVkd09kaURjeEx3a1FVN3FXSnFqTDFRVTZkWnZTM1ZXQ3NDNkpRNGVmY2xmdkNGTi8ySWhQQUdTcDlFczNoNWRISDNYRmFnMEZHUzEzRTU0SC9wOExwRDgxcXRPUSsxbkVPRGs3Y2RsalQ2aStHSFV6bnFuZnI0dS9TYStGRkhueUZndTB6TGFYQ1NnVTZMOXMvOXZzM0RNR2Q4bE1Dc0ViTW1uOXhMOTdRNGNhNXZ6emIreEFwaXpWVTdGcENudnRZMkduVFNGUDYwa1l2Rk1meCtJSlJ3V1k3eVNWM3MrSHY1R3NYQmhMNkhoVHJKZXFVdGJmR25mT1UyV2VUemtSbG1aNW8yYVg2TkZHN09EUkd4dmxlSm5GUjErWFJ6Smt1bDlaLzh6UTdNdURzMUZkSFVPd3FQcXhjNVo1ajZIM2NYNHZIdTV1d0VpSWgwUW9wUmVjNmFEVjUyN0Y1ekJzRUE5MEcxM3piWGdOMkNnK2d1SythYnMycjhxbFVpRXhPUVVGQ3ZGZ3hjWWNLTXg3VEdaZWJDZGhvL3VwRDgyNU94TTBOK2p6N1pQSmVMZnJIL0U4R1Q2UkRVWVduK1hNUURlczZQVlpqN3Q2dmpQUWNiRWhTSVBFZHVlSFI0bG14WFFQME8zWTloYmV5STcyQ0V6L0xQT084a1krWGh4V0VRZmRLRkI3R0k2c1RvVzRxTHFGTHJaTklOMCtUUitJYWoxZkxLM3d1b2RLOUphRi93MFczekkxczR0aElKUzBIRm1kVFFzNC81K0ZlMzVvTDhBSWlsSVdwSGJrMk9reE5KQUpkRU5weGlFOVlwaHVNblkwYjNaWHlkZnhhc1ZRbjhXL0Q2aWFUN1ZiTlBkR0FnL2taNUJlaS93ZGE2N1FLY01ISEpXams2TVBpN2Eyb0NWUmtBV2xzci9KdjVvZWwyTnM1R3Nhc0pJZU8zT1d1dFlMM3lWYnowdzFiTE1IUjRUK1gzbXNOL2ZreWNEb1p3WWZRVkRJYXJIVTZ1dGV6U29tZERjZEhSbUxxN1BnSDIremtPVVdWaVFQcVJUbFhqODF5cnVvL2ljSDFnNnFWdDlEc1c3TS93RUZDSWZCQjJQNGZ2VWU3YWNwS3ZwaHJ1MmJhT1poaWNqOW5CWUtRUTl1VGx6Z01CdmJXUnFUdUQ3bGZKK0FJYnNKNEF5cjh6OG14dE9EMjc0bVg3aE9qUDdmRTJta2x0ZHhzME1uUitjMzdPUXdmcHJuRmZGb2duZi8xTzcvUTFpM0s4VXdWbHBzUDhVbXYzcVhBZTZFRnRNSG1wUEtDVWVWWEhveVVZMEd6cnZXTkpqUk9CZVpXNUFFdjUyQjlWdlpSOGtFaGhrVXhTRkRkTGlVRGhrcVZPcU5acGdWdXFEREhnbSt5aE1hMjl0dFlIaktUZ0hNY2ttd0x0ZzU0UkR2LzhHQTNIOVBKZk8rRVBFYkt2M3BsTEZQNlY2UUFNMjVRcWIvMFdVTVY5TFR6VmVoUlduOG4xZUpQMEFkcUpEYXJTM0RjUmd6bGErRnkrVncvTlhNZjlUTmdSS0pyUVJxdVl1cWVGY084WmhLT05oQmtwdW9Nd2lOaC9BSzJSQkNObzJmMjFWbmdhUHFEQk02NGVMWGtGemhLREdyZ0VLSDA0V1Y1Y3R1aHp4S29WRTdqQnZOQU0zQ1N2dnZ3My9SK3FScys2VkpGcE93OGZXRXE1aTg1MWo3b0tLWGtFcURHQnU2ZENLVUd5QTUvQVd6QTdjbWMvV0dMV2NSUzNiS2ZsdFY5MmhNc1EvWkJTRlZadk1mT2dZNndmU3hVa3FOcG9ML2kvdWJrdERUejljOVQ2bmQ0aEdzQnp3dkxPRXJMWnB1OWtqT3JPcFVlK01GRzJsTCtBcmliWFd6bmpxZzBYRjQwUHlQZTBwaFk0d0ZHVW9YNy9GN3N3a1QwL0tHc2N4cHp6d0hJR3F6Skh1a1VKeWlzOEpuRU5FbllLNDBldE5QTU5MbkprakZSWmlCNG10aEIxNnJiYS9oTTdBYWwxalkvTXZNdnVTbFNIVFNkRVRiYU9kTWRXdzhkd2FhQ3J1cmg0cVFaNzNYN0VzL3gxMWJ0YVBuMFdNa2dZWmdYQTA5M1U4VUhUMk5qU2xJQStOcXl6UmpjZk9rUGJlWm8ybi8wNXBPTjVWNGlJWGNXTUgwSmNFUmZDTURHejRaa2tWVHZROHpZTnhqMEZneXIzbHVURllkMEd3NThQRllKYWl5cm5ONnBrWVhvVURzQy94WHJ1MWhYanlsdW1kWnM3b1ZPWTBEZWhXeWdua0p3UHFZcFdLQ3RZTnp5eEZySEtYRXFXOWdqZ3p2cnkwdHg0eEtteHJrYWF1NE1iUnRqN29GRkp5SWNRMWVjZ3I4ZHNtWEZZZlNGcks1OTYrOExaZWc5L2pWT0hBVGZyZDF5N3puRU5QNUNGWTdXVEd6RUdFUWxUL2crS3dYaHVKa3dWMWsyZ2M5eGdxay9SRldmek55TzhHbVlVQ1BTNXZwOTRrcGpTY05rM3hrYjExQlFVL2V6V0pyOUVHdEpDdHMvdkpqUHBWR0UxaGVERWlBZnE1elVVL3k3eHdRcXk3cXEvdjFjVFJ6eFF0SnhaeW13ZVBDUVIwMHAwUGI5NmZyK05XTS93aHFzMGkwZGZOSVd6S2NnUS80WjlCWTVIbTFUK3RvZUI5dWdtdDh6OFd2TGRSZXFZcHJ0dWs0T2hoTUo1aFVteThIN3FHa0ZkeER4clgwcDUzKzBieTBlSjFCTUlzMDExNG1NYkUzdGNxc0NTWVlwNUVDQ0IzY0tMemZoaU1qa1RWMlBDenV0czVsVE9INkt5ZzNibnF1cVB4ZEgyWnFaNHk3UUtuOUlYbjE3eFZpTHR4RTZ3TWZYMFVQQUlIQ3c3M0huTnRuY1M3UFZxdzRkOEdnY21rTExhL0JRVDdQazU2OGhQZ0l0dGF0RTI4MmU0ZmwxT2tyNmdGVW9kR21yNTltcHJRbEp6TGhJTlladURZa2RpbFZqdW53SnVPVFR1WWFaalU2NGF3dHRiMDlLZmVxdGJjREsrdGdQUmJSQUNsaUwxWm5DemcrUlh6Z1hsenZFbTlWWXNPMWxGYVdsbjJXWXUyNFBJZzZhVk1ZTGdtSnNmbHp4NTB1Yll4dXBWSmtqWDl4SExESks5QmZkT29vYnYxMk1RMUhsOGpodndBU0xzRGVGS2JDY2UyTDZnbzJVeUcyM3pWeXRNeDAyVUhBeXdMdXVreGZCRk9PdWlxQS8zV093TkZGY3gvdDhPZVlnM2FOTGgrWXpvV25sZ2haRkZ5RHZKWEo5U040Qy9TVnQycThPZUhJelFVUm02ZUNVTC9TUVl1blVLV1E3MDZhRkxONVlNMGIwRVA4YXE5Nm45ZjRNYWhFblh5b0FzeTZvYVl3bW9zVVUrT2RaYWgvWnRXR2pNblBpelZWVmV4Y3p0QVB4VC9GTjFVRmUvSVZNaGYrR1NiTGdQTnRUbWxmUlZKNVR6SjZPRGQrZ21EQ0ZaYTlEYXRqS0YxTmlDOEtxTFNvZ2VKNkRyMG9YSWN0V3FXK1BsemFVaFA5c05MbDFSNkROOTcrN3NFSzJ0S3g5VENqS0Y4Q2ZlRHpma0tnejY0eCs0em1DQnIxbW1YK1VwZFZSSVVLVGRnbUk4Q2J2TW1oVncyVWJYaFQvS2NMQkxFRE1vK0ZTVDcyOTQ5NUJlNEdVaVpzUGdlTU5WekcrRXlPZEd6ZE5iRU4vcUlRbmt0ZGQySWY1QzJtc2NndmxvcHFrcGtBUnVRNWwybStFbFk5QkttSGU4TmFCMVdlUTAzSlZnMTdSa0o3TW5peUlJcUYwc3c3Mmd4YzJsL3JVTDFuUlEzZW10NVBNZkx3cHJiMld2ZXlUckxVeHp5OXBLMnZZN1FKVXQxRHp0TDRVUkpFeTl2VFBUYlpjTlNLc3lEekx1R2FJYTlJSFBtZjdiU244MHVyS3F1S0F3UWgrMVcwWTUwczFraUFhOVZyRzB2VFVoWWh3R0FnV3paU2hVd1FFWGdJSWxKS1BPbVZWeEdoNzdmRTdxemFsKzB5dzFWaGpUd2x6eDAzZ2kvZm50c2pEbHo1Qm5yRWFBdUc5cGxRa0RlYjJYbmwyT0k4eTg5d2prcGgxZDN3a2hZZVpsOVhGMHU4UmNkYVMrUHJRekkyUmt5Zjg2ZSswZDZLK1d0RXpRZ2ZnL3BHOXA0Tm00akw2RjZwZzZzUW54S3E3MDZBVHp4N2ZRUnNIekRwSzN4MnAwWXBJNTVMeUt3OWF3UzNhSG8rOU1yMmRMNkpNL3YzclRpTDJjRkRuQlduMnVxVnczN3BEMEtmNElkdmlqYWt2RmxDdzBYaUJFdEZvZHhFSGF4ZzBSS1Y0TmxUNVBzenJ4aXZYR2UrSC9PV010eEtwVExpWWIwV0o1N2RPOGtOdlBRbE1uRmtsTzJiRFlmQWppZUFKbW45MVN1aU1weXVueVpCanl4cDFoOElvdmVpTWkxbVBPWW93MHFGQjFPb3RNRzIrejZibmg2V0p5cXdhSXR0TnpaMFQreTYzRWovdTIzczlRRnpNdTRHS0RtV3dFelAxZE92Slc3S0RwaGVVNXZMZkpjaEU3THNJdEF6TTF4QWZGVVRRZFVMeXQxSWtrcGs4U25KZ0dxbkJuM0J1TXljeFRNMW5vbFZmN2NWbnNwUnBNTEtEMXFzR204ZUp4RFJPZjVkWSt5QjlKQ29zc3Q4dUVxcVhIaHYzTWdHN291UDJuNDBBeXBHYWdpNzZTRXhVclpoOEtvU2pqRVFEc2VuMTNrd3hKNzNaMG9ob2xXSnIzMEszTlhnalVYMUxZUHM3N2Y3WU9jNXNwZUZ2cko5dHRLYnJQSFhxVmRkYTM3WUNsTEt0NVA0VVZDTzRsdmtQUUpFcHdvOG5FQWh2OHAzN0R4MUxucThtclV0NjN4YlJ5Y2g4dlZzYU52SERFUHYvNFBhd1JvZEZkMjgzTlNYdTFROVh6WVNlb3JpcENCdnp1UG5WOUFOTVlrZUd6Z3JodnNDY29jL3l0ZU1uWFJCcWJYczY5ejVzcUFMUEVodkpXUFhKNUcvMGM3Y1B5alVVS2ZBeVVHR1diZFk4TzZFais4OGp1WTZhR2RWeW41VTRYbW0xZjZMWVhtcHRBNDFtQjdhajhISEExSEo5OWR6YW95S01nR01tbkg1OUEyUlg1WjhvQWF4YVR5Q2ZkbmR3U3pEV2NVOFdvRjFZMDJ2bmVjSFA4YXY3VVVNUUFkRXZuTjVxNVBmcUU4K21GT1JBMkdibmpFNWE1NHphZEhFUXF0cGxscXB6dy91WHBKdGVKV0FRUzJJU2JBV2tScHViM1EzUVZEYkRYNkVBaDRVTi80cGF0RnRtRDhTTnRrNTU2bVR5a0tKMjI1YnhpbmcxNEZkN3JnNk42MGVLbGZOMVhhZUcvU0dLR0o5NERVR3d2b2txcDFiQ1NpNC9Zd0dxRDRMc05UOFVvTGdpWXlQQzN2OG9PQnBocHlaMDJRNlIvZ2dJRCtVb3JKcjMyUE1ZYVpTZjJuQkZDMFBhdEkrRFM0UXBXTHgwcElMOU9JYzdJM3VJVm00RE00UGR4RHJtOWc2UWd0MG02LzJlZGQ1cWJ1aEREOU5vakM4cmpocWFqWlY0dFlhSDhKZWdCb08zRjZDRHlkWEh2c0JmSEoyV2oyUkZlcnlaQ0g3eVBobFdHejhqVEVHd21RR1MwTGRyOFdtRmVHYU5Dc21zN0t0T0szdmprL0xscmJPV0hlMkRTNjBETHpIZkZVYm5JUmNwRUF6VGJ0RGxiZzhlMlpQSDlMTTJ2V29iWmVPZkwyc3hGYThJSjJyR1dBR2FVUXkyTVBJcUJsdm5PbS94N2xqODZoQjU5LzI2WHIwRUswamZ0SHMvcy9QR3g0akVxaUU3cGoxY0FwYVdzR3piMjFOZ2ZkSkVvd1FUSWh5OU9qNVdEV3pvNWNIZUNoSkF2WHluMlhDOGtjc0RUTWJIWUJuNmltU3Z5c3YvWFdpZkc4eC80L1hOcTlJdUxkQ1M0MVIvcVJlaTYvRkZDUTdqL0V2YUFsNFBtVXFEdVUvMTVDd3BiUDFtYlNpTUltdkkyZERBdis2TnQ0dXFzR2R6Y2J1MVJtemlucWZvdE82RXVIalZPeENrQVh0MkZrMWlHZmJRS0llVGsrKzFia1hNRlRwOFdrQWt0dXB2OGJvNXdRZmpxVWtJYjYwL2JvQ0k0WndIZzlid0dieVpLTEFRR0o5N0V1L0t3aGdTbFNidTQwUzJUUnpyNUVzV1pUN2lpR0VIQlpsVzZPUVpqcGVSVUJYTS95RTkxcGlDMnQrSXBZT2pDSVZEaFUrOGlzcXpKZDR5ZXhXNzBXQUc4RzZTMFBvVlBiMHZzWVF3K0NkR1lRb2g3b001c3VsSlZ4aDBEcGx6M3pDY0tkZUZodEU0Mk9zN1FaQkpjbExNOGRUOFdnUVZYbGh2NzRKTlBXUnZrNlpNbW8zREhQakpnSTBMcnlSaDlkREdkcDhwOHRvSk0zbUZBZ2xqRnN3dExHNk1kY3pOMm83bnJQRWo3bHkzczZLaUs5d3cvbmRGVHFVQmNLbTROdE0rZEhRMzZlT0ZFcWMvRm51UExPbUF3emtwYVBQZzJ2QUsxZURyNzRnajJJZm9ZWndkclJVdFErbVFqUjI2dFdiVnBIbC9La25vTXNRSDdQNXhTcTNlVkxnYTNDSFZjck5kWlRhN2lrL2V1bFhVazNDUi9WZ1RxRDZZaFBhZTN5S1N1ZktxL1dxN3F5Z04yUC96WW0rdXNQTklzaGFVWTRvRnBHVW96bUdDY25mUjRQNVBzeFFEZ1dBVGpHN1g1Vm5PMHNWUVVCUGZDTEM2UGgvMmRDRGhKbkM1YWxKbllaOTN5SHVzTDBRR0piRUFLcGFQVnQ2WVNIYW9MWE4rZllyY3lzbjN2V0MzQ3VZRENheC9qTVRHMTA3WUZ6Zlk2b0tMUVdIUERqWktXeEZrbGJQSlhkT2VwVE12V3R0aEEwNSs3RTFHUk5lN0lxRithSTVtTzVnQ0VCWXgyYktyR2RWbmlzcmJ0N0lwZTlRbGpvWjIyQmRoY0oyL3RTUVJhYjZ0dG5YekU2VVVrVTVYKzM3NTVYbVVzcVcxWUFNMnZXR1A3dVNhbThFZDd4SVZkVFVCTlJwMDAyNUdkcytoWGZKamRQZzRsejZGb0hNZTdoQTgxWjlSTVZ1T2pJU25ZVWtlcWwwaUUvbEIvR1VuK0Y0aHNaRlJmbjVXQjdHZzU2TFBiVzZMdDBRMWdkRzBVbHNWekxJQXg1RkwzNFVESUd6MHRQQVptL2lxVVkrY3g3UHM0b1d4QVYyTTRYQkdWc0RsZjVTNU5pL3pURUQ4MGp4cm1Ia1hjbXU4ZC9vdjgvaW9qWEdWdjNFYVlKcjNIOFFobkdLeHZSa1pIT2dHYThuUzc4NkJVb2pYMzJaNDRDcmg4OVhTZlRGc2FDRXhRd29NRFlzVUo1dFhxdlNDR05ISlFyVDdUMmVCbDIrb1hxdTl6M1N3NmVIcC9ONGVSZVdmQURxZVlwc0F1cmRxaWxiOW13NDRGbXpmdG9YYUtybXhhUms2ZWhpZVZNU2lDamhhTEszNzYwWm5CR3NrS3ZjNGU1b3dGNTdQU29BTGU4YTQ3NW9HZFNZK2hoaXIwTlJRaEJoTXZEWFUxM1NBMEVESmo0Y2xFZ0hWc0ZsT2lCNThUWU9GbFVUeDVQK04yUVZQNHB6dXF2TDdxRjNJbmF1U284dXBSLzl3M2hDWml5MlptLzJzUGVRK1p2YVBJa2FJajF6dUhSVDI0WnRTbDdSTm9yVHdkbHM1ZUlYRjg3bXpkdzJ0Q3RCOExoNnE1RzdNci9laGpadlNuZ1oxd2VmVU95SmpHanEyWFYyQXozelh5eWx3WG8wcjhuYUNWTkNTd3Q0TEtGN1N0NUlJMGV0N1ZHTVo0ajY1WWsvS3A4KzdkZVQ0eld4VHZiV2VhKzNUcllmYkZ1UVg1ZXVKRjE5TThBN09pT0hwWFBNY2txbmJDMXdJNVQvWkY1YmhrYkFhWDlsaThTZk9IVTBSS1hNVnRoQXRBUzZMTFhXcEQ3TzN0Q005ZlFNUjYraVA5VDkrNFJGZWNSWjVqMHlHNjBWQkhXYzJCSVBzZEdlTjMvSk9aUUpubnlVbzI0UVBxOGlRaHlsL3RUdjhsLzZKNDVDWmlwY1R6ZGFWS0Rlem56Y3JjekJuTDljTzBiV2hmc01sSFFoQi9maUFHazNnVm5VQ2JwT2cwZ2VKZ3FrdUFaa0FReU5CTUE3MjdveVhqSFdkaEZLRzB2Wnp5SGhQdVFXUjBHRkVDUU1zNHpRQmt3dWdWVTc5cmNzOVZaYkZGNXB3T01vRTFPR0JRZEM4ZFdZNktQYTM0LzRCaFpIRzVmUndRM3QxamJUMlNEa091Szh1djFrZmt3akNNTGxPUE1wdWsyS2cyVkZFSC9YMWEvbXpQRGdZZ01KNWJGS0sxYW13SXdzT21PUTdBTXRyMWFLRGVzSWJkekZlOHZrQ2ZYamNvRSt6NUNOQzhyZXhtZXl1ME12Rms0ODFtT3kzazU4czRTOVBCc3lWc0duRGpKbGZZSHpPbVIxM2t1TTVZbnJRMWtVMHdrZWF4VzlTRG0xdEw0TWU3OGIrR3IxUzJVeExqZDdCQ1AvdkpJK290bmxHM0tIUGxDaEFYU2xsMElaVWJudXFUd1FaVWRWZE5yVEcvZUFVcU9mNENoVCs1dWMwb2xTVzhRazNHY0lRRXhwVHZmaTJmUXR3bU8reUg2ZVR3V1JEa3BSVXNxTzFLTm5XRzNMU2hqa3RMZkZDRktpMk9laTdicU9PeHdELzdwcCs2SjNLMGJXL2M1OXd0Wnd6WllrdldDeDh5ZUpmNVNxcVJMUFNRZFVRbWF0d2VNSTVXN1RkV1ovT1JpVE5LVUtaVGtneE9iNzdudGJtcEVIbzRjYVc1Q25BekFCeGdDNVBRdWxhNXJNZXE0aVg4Uk9DZ2RsNFlYSW4yZWltelRNdlBPcEtZTlJTRTM5bjI4UGxERDcrSlArUUt0Z0NzdCtmbzQ4Vm9XcU84QmUxQ25PbStRaFMwUEZNenh5dHpXNFdjMG1rbmt2cmdCcnJWOXBUS1BBTDBZLzFNUHVYMDYvRHlhbXdVTzVNQnE4SS9XRldKTXhpWXdxREhSUzJSaXhDTjh3U2Z1WUxiR3EyajFmYUY3Y0xVajBDUU9aWHVTT0t6aGFYc2YvUWVmQTBSaUNDQ25XWG5iSWpQcVozUWlZckpMSkFZY1NtTDNEaHJMZm5uZU5FTWt4MnlrajJIaFhpanQxRzBIWW8zajFJMk9Qdk1RMDBsZzRNTktNMzl6YnVvdStFUjNuMWxUU2QrUVNWTUJ1c3NyTnhvQ0RMTE1oVUxlM3VBUmdSaUlqMk12THRBajdJek4zRDI5ZCtJZUNNM1NQT09NOEw1cTdzSC9McTk5OXh6V0MvZjRFMi9zREs4eTJIY1g5SDQvMU1OQTVXRE56c1QzYUNuYlZrMDZFUFJWUFc1WnN0SFdZamhGUjRKRjVuMGhvZVJpZ3pUdU1jZUFRNE5EeVpTVy8xLzJWU0ZSL2ZiUVlxaFNHMlNaUHV3c2VCZmNYUHhUSGxmYWhlckk5SU8rV3RQVzcrZk5BTmxEbDE2RnJyeFhFNmhmNjV6QVlGMkVBTmViWmY2ZWpjcE1SWUkrck5qMk00dFlnaDVSZ2NVSE45OWNLMWxibno4eUJ5eE96VnVzZG9lL0tDakkweXVLZGcrOTVYd2FTbDJkZWFoeVVlUDhlelZJYTNGYm0vY2tMeEwrN0JoRkRrTjNvR0FNeDd6VElad2VrRFZZb1p0d0taeFE1Zmdpek45MHRMc01FUERWZmVjUlVCM2hGRW96OFFVQVhGeVFjdEVOc09hTXNYYkNLVWpNVmNvS3QvZm9sR0xlaVoyL2RhMUxHOGllQ0drb0p2NVYzdUV0ZkV6ZkJWZWlidElxcEZWYXlKdm1JK0ZQb1dYVjJPc0hWVVlxN0NaY1RVL2lMZ3RNQVh2WllDWmFKWXVodEZsWDJGWGFqUEhIN1F5bDg2VHlRZWZzSmdibWd6Z3RnSUQ4S2lpdi9pQkJ3MXRhTkZkSGxpQ2xlNThKUTlDZ3cwTEk2TDNtNVF0dkgzSFNaSGU4bnFmYTlXSS9xZHJsRXoreUVPRXhiR3BNVTZZSE1wNDlYMjcwV3VsQXlBamZQVzArK2U4d2VGSTVpU0l4K3ZWcmU0alFJVmtNdkYwNmZMemlUUFBzQzNEYk93R2dIMzVrT0E0eWZkMUhMZS8vRnN0aVJob09CUlY3S0d6K0tRK1pIK1A2SlBaeXBDOThVUFI5dmNub2tSL3NIamh6V1pXWTJZM0ZBbjF1R3h5aGMydUkxTUhuWTJNci9mT3dWTjhoL0RMMTRqUktRa2xXdHl1Wjc5eXV6Zmpndmxrb0dLeDJNOUlocmVHZjlRVUNRME5VRi9aSmlnR25ucHcwdE0rTzdmZHd2eVU0emR5dHFmdTRjdG9DcGVUVTFoYVRXaWVsRjFsTWtBTXFlZDVYSG1CRlo3WVgvUTdZdU94TmM2UjlJLzhYZmwwbkF5VTI1QmVkMXJtV2lwSkVnMHV2Ri9SVTZQaFcxR01LNTEwQi9VWGJFUEdTL2xleU42eVduR0xDQUtiN2d6cXJkaHlwUTlHVXI0RE9BKzRETE9WNkNYVzgvQjhmSCttVW9OT0JLNlQ5ay9WSVRmSkNudDVaNXEwRTdja0l1bEpIWG1IU1pEeXFiemJ2SW1TOUJuV1JkRE0rVkg2dElwdTRqeTN0K0JLUXdSRFdBU3pUVTZsb2t3S1lWbHhyWjRhRGxmVEZub2lROFU5eGtUbkozY0QvS01GbXFWWmJQRXByLzFrUGxVZUh6eTFIS244VDVxRVVMb2ZQbkY3a3E0UjZwWXpIMnoyYnZMZlRSTHZZWEthWG12OEp3WDdXL1lqb2NrNmZTeGtyemRXbUF5b0RIdXJBb0pBcnQ5Q0dvQmpHYTFVdGUxeDNLdGpKVy9BdHI1NUs4M2FXYythUkE1RjFqL2VpVmMvbFlzbTN1SXNVUUhLQmhBcEphQ0JpMkszL0thWUo1UVRUUy93ZjdOQVhKTVEvMUdYcU1keXZaODRtcU5JRXNoVkJwWjE3dzAxbWdDZ3JnWXNQWTBORlM0WGpzTmF3OExnOGJtMW1sS1gzZ2NTdEZDWUdTcHgzdGtqZFdGZWFQdGVlaE9GVXlya3hnZ2lBd0hwWkdYVmNIVW9rRVNsSmQ0dmhINTY2eS9veGx4bGEwWktOZTdoN1gxa0dCTWc3RC9FYTM1d3ZKdEtzYTFTUzU1b1VWUGZLQjdNSEl4alB4NDRic2xoZ2VGRzJDSHkyam1QanRIMUcyZEpGbmxjS3FYRnk2Z2FzSlhJSGJhZFhIc1NsUU5ycHZwRVBpYUkyTGxKNy93b0lDSUdBeXZCMWx1NlZNUGVCTWsvdWFuRFJFaERPYksvVnEwUFZDYys2TldQbGU3R1pGT1I4R0Q1eC9FbjlaS2RUWUJTU0RPTUVLemsxdWVseEJ2V3JHQ0xnWUN0QzNwVGwycDJkMnJ6b0x6U1JSMlc2cWZmaXpqTUF6NkJqWkgxOTJaWEhwWFE2MGVHUGVJSVI3QjFKeVU5akorem5CRDY1NWFDSGIzcmFVd3hzYlN2VEdPNEswSHFtM1d0ckJpbGNGZ3B2SzhaY29Md09ESnFXNFp3b0Q2V1VPdUtEOE4rT1dZbDg2UVdLbE5xbC9xOVlwbWhUcDNhOUM5M1I3clhucFplNnFhc1AvcnNWcHRMSzUwUWJKVW5RZWFtZ0htLzBiR0c4aCszUzZvVFF3SXVlYVJjSGwrK2hBOWI2TGNkdTJqaDdCUEtKWE9QMElqaTY1SnNXby82aENVc3R1YXo5OStuL1NrdTJDbTdCcEpWVTZoK3p2OXNjTGJDcVVPdTg2U2NHcnRpeERLSDBuL2NucVFSU3hIdythaURGYk9CdVBLZXBzRU9xK09NYWZpU0I0aEJMbkNCc2hvU1g4VkJpMzNwcHZyQ1VYdVpSZjZTM2oyWFpmRHpIeVBZWXNTU2FBUE5pTFNaUkdLaURVaXFlQUNKSzJSQ2J5TzUyQld1ZzJLZExTbzJKOUJpejV0bW5QaWNmR2hsSmt3UkJwUHVDMU1XWGIxanZhMkxTK24yb0dFZnpaR0xNaU4zaHdURUMyU2dzQXFzOXZMSFVnMHJWbnhPdmNsaEpJMjdxQ20rSFZTTE5nS1dDWEROL2hoenpJS3BmTWgyL1V1VlZhdFFSeWRKc3lRbWJoaTdUTG4zdHFqZVpjc1kvaEJYRlpHNmp4SUNxOUs5R0dDeFFLUDh3OVd2R0ZVTyt2K2xoRHl5SUVveGJTZWRmR05kMDJqelB5WUJUeFdvZjVrVklLSDl1Qi85YlIxZEJnR3puZmJ5bm1TS0lsSWVIZTBnTEg1YnlvMkFLaVhPaFNBZFFFSDdyYmc2V20xNUFBK0ZJK2RXbkVEZFB0MVU5QWcxaHhCTGFCUXJLcEdlNDdCRjg3OWpadzdHY1I3TE8zaDBDMVRoV21pcUZsTW1kK0RwdVhRbWFSWGpNSjlqTHZramdESGpvVTNNYmlwU2I5VkM0SkpBWUJMcE82NkhzWVpXN3NjOVhsMWozdWJXRTgxSkd6NUt5emYzK1BxemthbmFZSGNUTzVxS0hnWmx0d2NHTWM3RkJJQ3NucTBQY3ZyOTU4K2UxZFR6V0twZmFoeUlzWlVJVXFoZ3NXQ1lqRGJYVlFHYWxybTJCSFZ6OXJrKzlvRTNUNkozcWJwaHVBQ0luRk5JSjNNY1EvTmJmYjhkQ3ZMVnY0WmFrVmN6d1ExZzhLbFBzc0dhMGp6VHVxSk15ejJYWnRoWUJQalV6VmRvVlpPYVc1VUFXMDN1Z3hxcnc5Yll2djZoR203ZFBHRlFjREhyUjV3bEZEbmlDUG5hT1lxQldLSUNPWkEwT0w5Y0JkL2lPOVkwQVZZemFqYzlxT21YR1ZjVmd5cUVOZ0JIZENka0Y4bU80TGFUaEdWa3NSdkpNLzJ4Nnp2cWRreWNrU0ZnWkg4bXRVZWZwRHZWcU11UnY1VmJtc044VjZNeTRXKzNBWGp4cGZjSlNJYlR3Njc0TVNZdWRRbDY5d1REL0p1TUhMWkhmQm9nQmYvSndoZmh1dS9GNC9jRmRSNUJGT0J3V3ZCNXZQcFNEZU1XYWhTdHlGa1BXay9UNitPc0Z6a3djejY4bHlKKzVXTkpFbHowdjRJUk15aGFmZkhTcEl1YjI5dFY1aUtJSmFDME1yYXVobll6eWUwVTJwYkppYUE3NllqVzJGZHBkcXVyQlRxcXdLL2RENStMYzdaV0lqN0dGS3JFMytBdVpNVGh2K1VQUUp5dTcxZ3JjNzNKQS9wbHU0NkIreTJKb1dIRVpwRC93aUNJS1Y2bHJGVXBEQzUvUWRrODRyNzMvY3BWOUxZMmsxcUxvNmhqemNtMnQ4djhkWGhoUlpIN2NoNFBSZ2FKWGxpbEVZUlFrczNUZ1JmQjMzckYxNG0wcllrUTlTLzVqZlo4SDI1SzR4Ukt0OWc1NlgrNFJpTGVQRm9mRHhMOStrZFRFcG94VjQ4MlV5S2FkMzd6Wjl4MmE3OHkwUWtQWlFsTXFXdjBWc0g5eGwvOFU4NFJOdTNxdmtxM2xmT0g2VFNhY2IvSzM5UzRZK291Wm56bFFZRUxheXFjQlB3THlSejg4OFMydWpXVEUya3VVVHU1a0NGSmczWDRFSWo0NGI2SFF1b01KV0l3YkxacEUrTUFUbVQrenRlRkNUT0I5WUI1ZWFKYWh4am1DWEI1VDZBMnhjbGZ2UE5abkgzdUVtOU5vNHZvbFhBQXJ6dUlzOHdEeDE2Nm80MktGZW5NbC9lU29yaHpBYU1qQWprU1ZKbVFmd2lhdXhXS2JNV3dFVDJiQXl0KzhxcmxJVEtxZGsyQ3hEYTVsdmhBRmYyZHY5alZ5UnAxQU85cmVmKzZHaEtHYkpYa2NndXRsRVMrMWdld010blE5bHNzV1dlNzcvMGlza1I0djJPTVVwUEhDbzRheXNOSS8xdHRwaXFxY3MvdHM2TVN5d3V6REhILzdaeWVlMlVteUg3dDhqMWhScVVVY3M5MmQ3YXRBVE5rS20wY29oamRCaDl4ZWpvVTh6THk1RnZlWlNXeHZ1U3pqQ0dOODRkVDJZQitWUFZBNzcwSnVqeERZeElnR3ZKZkVnVXkzZDEvdjZ4UXpLSmtEOWtXSi9HZjRuU3p2ei96eG5TdHM2ZlpCL1JJYlVCbkZ4MDRYcUZoRE5PTWwyb2hRUDJTTG96TlZyZTQ0RVZ1Ris4ZGxTQmJIaU8ybkNCRnRkTVFNeDVMRU5oYjJhSUx2dmlNbTZ3ZTBaZTU2bXRhUGlPbTQ0VTVPYWpQbytLQ1IydFNrVFhzWHZpKzh1TGJSMllydVlIaG1xSVZiK2dGeWJ0ckFqTHdoTCtpejRLNGtkM3Y1aGxjLzkrbWpaazNFQXFTdElmQjJDdTYxc0dLejFqazFRQXZ6NUhqbDlwQUQwZDl3dUhtN3FMcUllQlQxUzJiZlN4STZyNVlpS3I1azJwQ2VoZHFoSUx4RVd4QjlZcktneG93cC9OODBNWmg2L3dWTUppd2NxY2d0ZDVDL1Vuam1CNVpjVkp0bGVQa0EzRGlLVm5UVElMZ2VCaFlkVE9jVU1DSmVnZHhIVEQvVnU5RnlkNEhFb2JLTVlDZi9aR1FQdmV0aEhCQU5xUUV0UzN1a3hZRXJjM3IxVGtRWUp6bUFzdkN3VlFmK2lvYVdaUGhRWHM2eVVocENtUDA5Y1k3cVkza09GaUp6TTlHeCsxMFNIVEpUUXNYOThNQS9UTDNxaDVtOXVhK25rdGxGL2hNK3VNNThWalBSaitaYzRTNjgrVEZ0RjhiclZuQTJWc3BVM2d1LzJuK2tMeDZ2UktkY1JVcEorMnBOd2dFUDdPdHJUaTNRRXI3U3J5SFpFcGFKRzJlYjNsRmJDVVE2ekIvWTE5MUt3djh2QTQvU1o5ZUhvOExDdGIzRGY4T0htUTJnbEtTOUJSbkU2a2FGVFpmdUw1Q3VLV1NXZDhEMWZlRG1rTWdMMzV1TEx0NEIvS25Bd3hOakRRYWlGMnBkUlRNNFVsekVJcWJGYk5NREFHNFRLSzkrOWQxZG1TY0lWWXVNRnRkczJuL2IxdDNaYUdNL2k2aUJueHdqeG1mNDB3SjdoNDlFWEJSQnA4bmVSNmFhQStqY0djc2hudVpnUUZwSzEvRDZOb0xPT3RwaUl2MW9yWUtUK0phQnpWUTNFa2hoUHQ1cG1DTVJ1TFoweVNMTjN3dThacXpDR1ozV3JXNGpleWFUeXVuREhJc0twbmxMM1dKcnJJeVFzemtpRVlEckVhQzlVNVI1ZDV4Zk96dm9PNG54ckRSbUdpT0YvSEpGM29tN2FJYXdUWExTNDRwemVVT1JCd3I1RlRURHpKeVdZRnVwQ0pqSWo2ckVRMlllR2FSNVIwSzlkT1NrREsrUnBod1cxckEwODhUWUNNL2FzTkplVTgvTE9DWG0wZWZiV3dYUHNhRGc4WTFtWW45RVVYQVY4RkhpY2R5cVFNNXp1aUZtR09IQ29pZkNaQ1NHM2FybmprSCtxUUxjbUh1WGl4U1dtWXNHZi9GZjhxdmZtL081cnRjUU55WGJpZGtPM1FSUGpPOEl2NXZ4QWR6UU5PQWNwbHcwQzd0TWJYd3pKS1N2Sk5RcWpJWGc0YU9XaTBjbzNpYkRoMjByc2c0dEZpTjQ2RlVHTFgrdlIrUW10N2p3VHpLdlc1bUd6SytGaXQxTUtDeG1jNWZSUVpQV0JjMC9jbXJ5UWhmZTJJMWdDR3ZUL1BLU2FiZ2F4ZjREMERrTkNKbS9WT3NOUkMxUlNyUlBCY0dmb0RmcVlsWWg1REQxQWhuWTI0LzBwQUNzVUFiUlpBeEVBVzFXTlh6SXNrMGNyTzVQUDRYN0JHWGdtOFQrWHZmN1lHMDRWakE0Y1pHc2JsY1VkSUJBaE0wWFdidFBaemJRK3llMmtyb3pIZFE2bDVLVFdHSUwrblpNRWR0WkJlWmgvRUFId2hKU0JzUlRCY0g3WURrRlcrbEw5M01JM0tpZFFVQmdhRVF2V0pqNitDU0NvMlV6MGRVVW9KZVhNdk1vSzlDc1dyY0FGMklhaVEyUm83OHNZMTQ2VE1Pa21SS1RUcXU5Yk1SS1d0RE52OFVRaVMxa2pXcHZCcm5UemVnaEJKUTl2NWl4OUJmekJ4ZkpHQ3h5Sy85am5aZTN1RVNZalVhTUFEL05ONlVxcUJLSFg4VE1VUGJKL3pDRFpyOUtZbjlDbGE1RlJGdHY5RFlEV25nSG9kTVQ5ZGN5TXMxbG1FZkdacTNhekM4SnhIdXU0Q0NRYlZqZ0pybDZtTzlxdG9Rd2NsQTh5Uk1YUnhzODdPditCSWFpSjJ3M0pFTEFVRGJRb3FxN0JXNnpIWm5seHBZSWtDOG45QW5iNldOOEtIbkhUOXgyVG4zNjcrc1NLSjFxU3JKSUl5b3o0MFdSQ1g2WGVQaG82Q29wVlZYMExkdlZiZDRwTG5FL3BzZ2l1ajJOMWVENHFDYlU3SkRoaHZVYkRKcFhLU0o5M3gzdENBT09xeHpVRHYrQzREejU0bzMrV3hoZ2I3dE1qUnphbDduUE5DQmlCSXVhNGprb096Q09TRVZCTWxIcGxsdVJSR1ZPK0dGQ2p5NlFDejh0K0dVQ3hKajdpQUt0ZG03SHFyc2EwSXorekVsamNNNys5WXU5WmNyN1dGM09TQmVXeFFwMXJvVzM0YmNlbUw3dlgxb25ZRjFjeVNyVSt4d0FqaE1zNEtJTTZzczhreHo2WlpIYTBFbEQyaHFYY05HNEd0UWQyZUNWZkErUEdVaXp6TFA4WlE1MDZ2dG14NmMrM3FuRVpaWFozYjM2QzVzamVrTWx5WVNFVTZWVDFmNzljU0ZNUG5aQ01FNk1zWmd4YWNoTEZpckZuWFZIMEsrYmtNcy91NzU4bWJPSjZwZTJvWTBIQ2RLbEphbXZUcTJjWHgrUndLTXorZFIvbFlQMjNhRUkxbi9iZWpJM20vekd4eTN4SzJ1RVdWMCtmc3oyWDJYaWlmTDNWWkJMSmk1STNLVkRrT0I5ZGE3b0M4Q1M3QnZyYzlSbVlXUWc3bDZ4VHp6WXVvK2QxTkhlNXNMdUVWSTh6V29ONDh5U0JDSFdaTi8zelFkdUdxWW9EVEN3Rit1bE9GK3MzMW8wbU4zL0ZBVkU1a3dvOTc4M2tMNW5ZT0hqWWFVd1VGZ3BqdEhxdGRXa1hNck9DTktkS1dERnp6djV2ZVd2NkEvYXBuUER5WUhMOVZTZjlEYVVRejNCaUs3elVVUWcwOVRJVWdLQ1RVNTAxVkMwbjlicFJmbS91ZlhMYTc1T2F4L0lGUWRIalV0WEFvUXAzaFJOcHBGOHFsc1JNWEc4a3A4QWNOUk5WMGNsb3lsTi9MRWhLc1JtNGs5TG9xcDRlYnE2WnFQT0NpNkNRZEdKTHJsZmhFVjNTc1FCdE9Cdk5FZ1pWTGtyT29XS0prcUVndDFMOFNDaDJ5STlqTFNxM1JSTUNqbzhsVTJxdGovcUpqenJpQWI5VGRIa2NoMTBPV1dIVy8xYWdreHVRV0dNcldHYURqcURvYjd3bGdFMlo1c2tlK3VTeHQ1NDRyUlIvcEVjT2tRWHNLaklSN1U1Z3kxT1FteVZGNGlxelhnczBSNUhXK1RPTGRyVTlrREFGdFR6MDBGYVlMWHhNakV5dW9IcE90T2d4elYza25NQnhoaGpFeVdKRy9DOTJia3VscFZJd0FjODBxRUt0OEkwa2ZvZUVlMEdOcHJtREUwRGtGTWI1cDE3Y0tQcmNmUE9qRW4zMTZnMzZ2Zy9WK0RpMWNlWEZXcTJubFpwQ1NvVUNDaElqNHFuSWo0Zlo1elJuS1BGUHN0K3VaUTJDQmI3cEJ3MHNHR0FVT2w0YkxLWjJuVUhSbHk4SktsVzlvZkRDM2pyMkZjaHNlQWdRTDkveVJxSEVyMHR4OGkwR2hQZXU1UXdGbjlEV25wbU1uZGliS3RxS3hVdkprWEdRVW9sd3hra0JyNUNPVzlROWx1UGx2c2hrWFdKSGRKcnk1R3Z6VUQ2TXU1dk92d1NDOENDODdpSTlZK1hQNHVvSWtJWWdvYXA1WXhQRm1xS1dSUFN1N05vRk8vV2Y0Q2lYM0RjUXNjTDJYVXZWQmZjNUJFS2ozSG14K2VOUVloTGNpK05wSUJIMU9nSXhuaGthdlRYWWlQNkwrOGh4Zkt0Zi9LWFZqM3lobWtYYVpkc3ptZDh4bzBqSUE0RWtRN3pycUhLY0VyRjRMQ0t4S0Y0YXBFZjVYanJ0S0prcU1ZWUlSRGdldWRkZURjL0ErSzFtQ3RpSy9zdjQ4VVpYWGdlVEVaYmJrS3k4UkFtcUowZTZheDRsb2J0c3BqYVJqYkpmQ1RVZ0xVbi9WNkxhdDBKUHdzR3lsWDJrcmxEMUxZbERLREkybnROQUZxL25kNzZyb3N3TVoycHVvME16RmlETEZ3aHhIc2F5UXRGckpkZjhkWDZXemI0V20yZHFyVDFaMG1rOXJiT1lGb01IY3F2SExuYWVUckMwNktaWURzQlNrcEhNeFdVS2JxOUY4OVNpT2NwaE9YWFQ3bUtTSkJUdXl5ZVp0ekJTRU5nbk45SURnYWZXQ2E1QkREL0FaUVdSVUlXRUVwZElsUjBBTzNhbUZvQnF6RkZtNU1FOE5IZTdSSXZldEg2S1ZBWlZTcXdOYnplaTlMSkU1eFJkaE0vRVBXN3pTVDMzeTExV3VSN01xTXJNNTh5eEUxOWhqQ2syUmlueXpPNzgrR0FLWGhtV0FBVDl0djU1aWNhUDRBYlVJTHlGQVJuQWppNjViVnNqdkkyb3RVTzBOcVRNeG8zbUtXczNXdGFTR2daK0JGR2pKMDlmMFlZOG04Y2Z5TFZSOExrQnRpeEF5L3FXQUdSS3lBeFREU3JDV0ZTY0ZvUUUwNDd3RXdGVndiblprTFdDdnc5ZkNTQ1B5Z2tYU3I1blVZYVBDaDl6cHkvZllGR2dNWVFZNHNTS3JOVGQzU1BSQmZmaW1kV2dnejlyeDBmRitNRTVBMTJmK3VOSE81SWRVUDNrOFZrWGNjczcxbGpqVHdQS2lnQzA3QWxJT3hOb3VGakZiTWd4VU8yTmNiYkxiMlMvQ2ZGemZDeHBTenZvY0J2OFdJVHllWG9WZGlpcEtnRVZkcTZKelVDZVhqRHlqcDkxWjVpVVhRaC9wY2ZQQWJVQkl4SGlOek9oaW5HQ21UajY5ZDNnRmFEZXVmTHpuY1dEQXF5bHd2TkV4Y0hqdFVuUlo0T0tyaVRVSnh0bzlLNWF3ZTlWSmQwYU1hamgrUktRS1liZkQvVmtoVHg5ell3K2RTN0VXdk0vMW5hV0g4eVZHUTlGZlZvWTN6TWxJSkFOeEFwZjVYZXJMRHp4TDNhSU13NE15WlpXWEtzL2NpaTFBUnVsS2hIVFMvZE15MURPMVhGcWVqcU11U0k2QzFvZ0ozOEFGTEwrd2JkRzgvd0Y3Ry83cHFYREhoZDVkV21tSmQxeFNKVVYrSGV3Ni9XRklCK3JPSHFpdG0zZjJwWDVWc0FlUUUvMWRTLzhoK0JEOTBYRWVQR1dDUnVSYXU2UUp1YWZiYk1WQkN6Y1BWdkExT3YwL0hLZXFUMitobUNEWTBtT2YwR1ZNMmh4bnNNZU9kZEx4eDl4V01oRFRGUDZoakNDbDVxbEVGUndieVpxRVp6dktGS0xzKzdybURod1BIbjYwRkxPVjBrVHczZXVNUGdTN0pjakxMcFRNVENIbllBMW5FVkFuZThSY0ZpQ1FzSGxVVjZBdlBxQ21RMzJjNnVsWGh6R3FleVk3dEdtV0ZCYWdkUjFhTlA3aGtBWWp0UDMxeXRwd3gxZVozOXp2YVNpeWRRSEJWdWxjY2tuN1ZXTXAvSFRjWWRReHBKaUNZRFZxbXhOYkR0b05RL04wWXBVdVpjRSszL042eElXM20vRGRock4zSUFYZkxZUVg1T2VrQlpjc2VmUENNSWtNWWNKalZxU0VlR3ZHRUVWMi9HWDdFMitCa2c1ZE1iQ3luRDdXaVFHSE9LUVJHZm1MOTZyanlBYWxMMFpVbDBVbUVWU1QxanNWYzFrd1VseS9nUSsyMkFIeENtU1BCOXFqNkJjZzFIWTY0bC9kaFVMQ1krVlRoaGt0bVFINkpQY1RJeUtiRHp6TFUybU9PS2Y4U3ZwZHJIMGRQZmwvdk5ITVpjMmFqZVNwVkhXWk16SWljVkR6Q2I2eHlQV25USFFxNTd2T3Z4RUMrM3ZzTmJjYVNUS1ZNMzhONFVNSm50TmNtdkRUSWVMZTZQSWNGNGE4NmQwYktrM3Q1d0xwMXRmWHM3SjBDU0VkNEdDbEtDSVorRis1aVg1RG9iT2hYcWJTN3JyYmdLSTF6d3JPVmZqSGw2dEhHNkNMQWNmN2ljUHVrMDRTWTFtUXJvNnJoQ1RIVW1jV0YxUzdDWTBUNHp0b2ZHVFRQVVFPUVJPODRsVkRlb2ovNEhKTXY4U1NaVFIxYVVMZTZwM2sxSGd6UmExSndwWVl6RUk4dVc2N1lnYitsZ3Y5bHRqWFlXcjRWRUNUTTlNZXg5eFJWT3AvNkxHU3luR1BFcFFqbFVrNWh4Nk5icjB0SmRQY2VmWkhheFRDUG05Y0NIZFVldiswYllDRHQrdzdnVVlxZmRVV3AvbERFRk1WRU1JbWRLRlIxN054by9Bak5jcTdGNzJhSTRGRWEwWllDbDJrWEtBS2xvaGdIQzRVbWV5Rlc5bFZqTUVWY3RjK2pyNFByeU9WZkIyWmdmQ3hIQXo2QlpueUVHV1YrUU51Mk9nYUlYTUdyV2JmQmlYcWhqLzBUMyt3THRqeGxMd3FmMXhsa1BLZDFTVUdpMXFGQ0FXZGpCZWVTSDB4WXNZaGwzTDE2WSszd2llVWMyUGEzNUVHZXM1YksyNUxUMDVnL1NKUHIwNnFkU0k2ek5FWU9XSGp4L0J0UkxUZ1NGVHN4QzloSlpDeDBWVzAwU2h4eittbDllUXZTMzRNZE84YkpLWmlzbGFKakM0KzFpWmFqbVhRVlU1QTBSeTF3bytXbldrZ0dsNHRwSmZOSGdwdzFsaTlwR1lSckorOWNDK1ZrYWhCQXU1UStiY0dHRlQvS3BrV3dsVFVMZy9naG5VQ09ISVgyaFdvZnpMTkdFZHZqY1F2MnprZ1ptUldlc1oyak4xYjVrcDFCN1c1MlM4bDZHY2dOckNxUUdHOFJlQXBxVlIxN2pjTTU1U1hTYVk4TjRiUnpFZSttSG5TNGtxWHdCdXJ0RlpyYXBnUUNzajZxSTExZTlqbUJTZkpmMzAxek91VFhqM0NyMDlTYjFZZ1A5ODNPNzh1NHhVSXhnMmNTdFJZWlRzN2VvYTlUVXJGVkhwQWZBL25BNC95NGJLQ2RyTlhLMXhKZFBOMXVqVE1TQVBmVCtTQW9PTkIxNGtFMGp5cjNPQlpESWdTMFNtRHpuR2k2cW01Y01CVnRab3RPYm5RNWtmalJ4dkh5V1lLbUQ1MzZYQVNWUGRtTzd5a0c4YkI5amRnV0RSTVZwaTRob1NJUUtLTVkzajlJbmQxc3ZDTHNITmZwM08wTW5JeHF1RXlWa3Q0UTNremtZWERyUWtTdE5kNEgwYTNOYXRHUGdheUx5NXVrM3AvYVhnWkRnaVUwaFRiUnd5OFBBR1EreGR5d0ZRc0tTYURvMythS1d0MkhhSkFEbm9XWnRIdkZFdnB5T2o0QmFkUXZUVkhnMkdESjlSMTlmVzdJZW9scHpCQlgyaEJ4RzY5a0w5dXF3R1FMSFV2M2E4WUVNVkptdFVOS1YydUJ5eGI4a0FSMG8zVVVlc1BtZUU0aEsxM1RqeHNvOUdremVtelo2VkVOWHhDTlZoazBIOUlCaXp6elJYNm9vOHZTOGc1SW9odzJmUkIxKzFHUzUrdmUwOUhIZjF5QXM3bFpJSkpKVXdmRG5lZzFvZWVWaGQzWndzMUlqa3N4c1dVTk51dmpyOHFHNXllT054UG55QnJJQXFWZGloNnlwWVd2UTljZzVPZjVxVmYzWUhWRjhxa3Y1c09JNGVmbnlGVGRXY0FlM1ZzdVMxM2xxNE5qSjBxanNnUmMrVGQxT3BnZFdSK095NUpLMC8xRUt4QnJweUxqQnlrZzg0NVI0WU1PcER0SzJ0WXlXNTloTmlzazNoQ2ZQS0E3MjRuakhaelMxWlUxYXhxK0JWdzVtdmhiYVB5ZlZtMmpTMkduTWo2SEQveFQ4dkFqUmRWMDRydTUyVlVmRFdRRFVmbXlNM1Mzd21BTHVDNVpIT0NkZW1vODU5VUFBNnQzUzlWRy9Fa3RhbXZPK3BaTUNCRU5WUjh0eDVxWWJCbkVVaUxDWmZkZHlGMXFNaE1VekFlZFk2ZVNKanVTRm56ZldHNUdpU2hQOUpuaGpOc0pTR1BiM1pQZlpBYkJFUks4YTc4TUxESXFiR0tyVDBiWDN1TW1uSW16ZWlKa2NNNVo2NXUvNGVHZTEzcVVmbjFNM1JSd2dGNWRoaks1SHZxZGxEelZIaEdpdXVkeTNpS0w1YUpoN2MvdmplSWJ2SFZ3Qmpyd2F0dGxvMGF4ZUowb1lNcUFKL1lzYlV4R3dBUk85aVpDUC9MMWM5eWJZdUpiOU5sSEVyczNWcVZPY2dKdmVqckJPbmRTbXVFcG83V3lMTVNNVG5nNEphbHlyU2pQRVh1bURFTyttb2VmWlZ1eXMwbEZBQmllOC96RWJMRGh3UlQzdG5CYU5mbFUwYzQ2WDQza3REbUxxZzZkcGNTTG9iTGIwME53czNFWHR1K2p0U095d2tXVk9WUERXTkgyd20vVXVwSm1JUFFMSktoQ1pmL0pUbWtlOVUzNlIyeVp4SFowU29iMHZNZ0NSV2UvbjNiVFZPNENmQUVZN05Ba3Fzemd0RnVqTS9vT0Jab1k1N2RUZFBHRmkwSXZWcE9PZFhQQWd2ODNORnFsU25XYS8zUkxUOFBVR2I4b1dvWkJGdXVmd0pBTE5RdXZPVHdlMHVUU2IzYmJwNFFQeERycGFGVzNUbFRoajBtekNWN0tJWG1oVy9JYkdZOGgxaENoRm0xeEo1U1BIcVZ0U3VLcmRXOVUzTVE2MVh1Y1ovR3Uzc2cvNEQ5WnZJUHBYZnJCbzVjZWxhcEs0NUtteXNwb2htS3M0WEI5YzE2TFgzaUp0RG00c1ppY2Urc2hGL3l5WUdaVm5teW4yTDlBSno5blVLQW9BMnZJZ1dSSXh1bTUwQ0pGUnVzS0tVajloSkw0V05YV3U3VVJUSEVyR0JYTmhRK2c1c0x0YUk0TDVKM0dhYmtHU21RdEZSdExnQTc2YTR5eU1hamZUV20xako5S3FYeWpWcEs2eWF2N2p0Z29tVlhpdTZPUm1TMVNFWXBVNmJnZGtiOHBlczhPcDhWaFJaekxMTjd2aEt6ZnFuUllVUWZOVFBKVDMzTTdOc1pZUFZZMUR2RU9aK0o1TU1CemFhbHZ1SGNma2cwWStHaFNnWWh6d0xUQUpqd043K2N6aElZb3VyaUloUEJUMW0rbU1nSGdVNHBoWUVDcHhrT0NueE1TLzIrSHpreGY0MFNuQ3RjT2pOaVFpUDR1TktEMEM5SW9DM0dCRUtkWFlBQmZxdThLVkFqWDIxZEVJblBIYXNhWjFrZnhacndTMWg2TnRhVnV0czB3Mmphcy9CVHFtQjZQN0x2eXZ6c09LWFRydlhEdVJIdzZvSDk3K1hPRG9NV0RpVk0zM3BXRkxrZ1k4dXpaL3FoSXc3ZGFSMXJiSHREcTdvSnZ2OU0waEh3WGtuRWVPM1crQmEyUS95SVJIa2wvdFJQTTJjNm9UUmpwN1RaT3RiU3JJTXBqQjdFNVpOL1JzRktJMVBha2VZWmpqcTZ3c3lWQWJLZXVUQ2t6T0RIRS9wYVIvNzlmWkZhMDN2aDdMUzlVMi95Nkk1cGl0eW55ai9MRnVIZjZrdnZPTnpwWUd4UEs1QklsRUtoejVQZ2w0NEJQMElxeDV4TmZKdkM1aTYyZ2FNWk50aVo4emVJRWx2SVFpZ0hoRWtWOWVCbzVjU3dUdldKd25IQ0Z3Uitrbi9meWdaK1U4QWprSGZiQm1CbTJIZ3U0VTJaYWFZQzZ2YTFiQXAxcHE3SllJUURYS1lwQ0U2d2JYTE9pajVqdWVOVG9WUE5ESUJsMXY1RmNPanJOalpkemIyMGZuN0FEVFZ3VE9uRzI2UDlJRjVmWUJidFM5TllBZ3lSdUd0emhySjF0SWhocTVYamlWU25CTnY3eDVxSHh4c043U0JsMklIZ3RFa1BxMWJDY3dzN0IxUktCLzEreVVzY1lRMHc1M2JoUW1ZSk5DaTBTeXFjdHo2SmZIZ3hqS3FudENuZWVJNXp6ZDhZZmJLUVFZY2NoOHNTWWNtVTB4SHl2RTF6d3QrMGJtQVBmYjE2b2x2RiswQy94UmpzWjZHaFZRU0JMNEsvdk9hOWE0MWZSS2x3eHZqYkxxS2hUSXpxN3ZwaWNDcUdxSmxhK1lrQnlmUG9vaW1tMjRYR2NOeW9rSzlsMDN1dUJjZzFoclZzTUJZK0RxYXBTaUVhRFR2M3paWFhoZ2I3RDVUUzZFbXViRURabVJ6MEgzKzA3RnM2UmZ5QXd5RHVSVmlzNGFUU0dXWEgzR0QyMjMrQWZWbW1EMCs2RUxHdXMvekpZdTdhNnpCWlN4SUhLSVFUdk53SzlqTXpPRjgweERML3hIVUhnOVY1YUQ1NnJGVDlWSUhGY0FqNjhSZ1R4cTFlc2FTMERIcUppbFNrbnBwRlIycmoxSnM3UXVjQzVzNzErNko4NVBlUUxFdFFGRXg2MlJraWs3NWFpYWZkVG9HTkF1L1o5bnFPaWd0NHowMFh1S0V1bGwwMUU0VUlBWWtoZm5BNmE4RmsxZGxocmNvL2grckl2VFh3OUN3cm1Yc1RqRHRDeGFGVzI2TjR2L1pQK0k4YkNENjdWQ092VGNmMjBvOGtMU3hsOFNNVDcxUFVGTHR4SWNtSitsQUxBRE5mSjFMa0hMR1ZlbldCY1ExcExmRWpwZUFPSjVXekh5WEZydGhpRFdmcnEvUldOb3NWWHVjY1E1TmJIRUc3WkFnRGs2dE5oS0NZcHo5L2hDTG9ScmVKRFNNN09wbU1jTDhhNC9MR2FUaENITnlPSmFDSk9NbFdOUGFGTzhDb2wrMDJvSW5wdUFmZENRWFlQS0tWREZFVU53eVM0VHAySWtoQzVHaVFtcWdMUUYvb3V0Y01xbmxWT2k5WWNNQXdqdlpiRklDNVpnTktkOWxiRkhlNE1lVXgrRzg2WkpqczNOUDRsNlRYZE8wUVFsakFRamNZTnZRN3djMU5LTVE0SS9XNlpEdGNaQjZ0ZSsrRUVaZTFucG1nd010azNhOGF0alUzdmR5am96N00vSkhYbDlrdlQ4SUxyYndhSVkySjV4SXZDb3VnTGl2ZzZjSXA4bzVUTWI0Q2tNdmpxSThDR0UvVlZYM2xQbWk4MkptQlRhc2FOVFl3UE5tNVdMOTZHT3dIendqZ3dBOUs5ZFhSOGhmN01zbDVUUWxBdmtmSlFrcnZVbjhVZzlUa3RGOUl0aW5UaTJsb3htdW1TemV5LzFFOVEzK1VyWHd5OHIzQTFHRC9pVkRBVS9Jck1iZGRYNTN2c04xaElQVWRiN3FEVkZHSGtNUkd3b25Ba1pocGxnOGZNUHF2b0EwTXYrQWxLcU1POVJidnBFeWpzV2hqNnh6NTZmWDlnbDhGN0ZMM0VRU3pBcmhaRDdDM25EcEFldktUUTBQR3IwQkFNS2l0cys0UUQwdVI3ZlRmV1hHSGY4NkFENldZSGEwUUtQMGM0M1NqdnhzVXRGUTdxQUJvbjF6QTdFQlBaS2ROeFd6UkdUYmFWQ1BqeXhsNXJISVc4bG9qNWo2NFZxUzE4dEp2emhBMDhJSDZ0UENKTlJBTlpaV1BYOEE0RFRueFBDb29tay9uRWJ6aExKWWRQb2prQmhrN1JNNXBOVzdLSUdhdERodzRzRUpxYy9DNGE0QmQ2YTRzcGZ1NWVtajBOUE4rNlBKTTFydllIT2R6WFpubjcyQTNTcjRGbjVhN21xdDZOQW1uSEpEcDMvY0k4cHl1YkJXZExNV2ZYSHFvRkZoSnBlTjJkdlBXYnd1ejVIU0UzMWNHOEVTRjljVzgxRVdTMU1xMlFSTkRBdEpIV1hRNFdtSWJldDBYU3FNTjdYY1RUSmZzNnVJenpvOXFGRWY5TlpZK1MwdHhjVXdMQUthZFpMMktONE9UYjJiT3AwZE1EOExPQVphU1FGZ1BlOUdyb2kwZllUSEdOVndrSXZqUlRWZG5hTkdSeWY3K3hRQ3g2VnRGMGx5Z0g3SnNXdGY2YWtocFRYbFVZb1l6d2Z3STVSRDhjV1RkUjd2V001WWVrVmZEdktCRXZqOVhYcmVhT2hNalE1dXZDZVc1Y3VzMmNNOUFGZTRkaEZqc0dodFZiSTAyYnZuYkh6V1JOcDcybjNKMjM5elNYcnU0cWxOTDVjVndZSDZ6K0hueTAwUlRVblc3Y2tDZjZzUEl1cjB4SXZpQWI3dWQ5ZElKOGRtTEVrdmRMaTdqSlA3TEZaNXJBcXFpNUZrNW5nZERqMW1pTVpHWG8vWWdZdEphKytiZElzNjZsYUNCQlFJY3d2MTV2Nzlna3RUN1lmK1NoSDZveWFocEVGZDM0cVpPVy9sYmdmKzZ6Sm8xY3lOdFRQOTNhUkdhamxGUzhodzRDanc5VnV4UldnbytKT2F0TERIanlmSlhlZjVsMXNzaU8yUWp0UDhzL0xFNWZuTm1TcHJxWXlqdDFzQUNiQWk0NE9PZDllanV1bGdJY2lPcGFERjZDdURsSDFsaUJFbXlOUVlVZm9Wb0t1c0RaZGw0Y2lBYlBtcytSdnd1TmZxZHYyNjQ3ZHphc3RyRVdHMjZWMHloY1FQbXJXM0g1QmRJU3NlRjh5YUJEQi9Fc0tTR0RCcDM4SHhpYWpSOHJOUEZNYy9pbUpBdmRCRjJBZEJmenowK05sZUlZaElPN3VqckpwT2w5MXFnTitSNjM5enpUTDJ2SzJ6K2RSV1ZGTFVaTWVvWVJZYkE4YUUzYUtkV3JodWxsNS9xUHRyKzNGdm4zK1FEYzRoVDZWbkNwSHBzaUwrdDA5QXUyeFBzbWEydklDazlRTis3c3hGTHMrS2ZmUWdWTEdHRG1RcDA1UVJLSllKNXkraVBPUVZENG1tZkVSNWtwZE1UbS9tNEgydFBrajRZUDJyZGVvV3FZZ2gxZHcrNFQ0U2t5YUdISTNrWFM5M3dlc1QrWFppbFJqQVBTYlo0cTNFNmVXUVJ4U0dabi9TYlFwai9wVmJMc28zbGZmVTFwSmwxYUFTZEZudnlLdS94cGZDYUQwWHVDaHRSVVpzb2ppN3hFV0JTZ1FQR2N3U3pLdTRidHM0LzVhYmhyY3p1YWJSRld3V0VJVjM5b0lqVkNhYUgvMTUzN2kySi8xallDMHg5c1NGWlRDVVMxYW01V29WRmZmaklvSDFGSk5Lc3RMK3F2OGRFdDNXVDhubzh3VFBJWFVlVCt3elRXZXQwSjB1akNLSVgybTEyc2FXdHM5MmtlUkF5TGxDVFpKcXczTmZlWlp4QlpjM3lMQ252OHhvZ3JkWWN6dWRkRXNad1loS1J0ZE0vcGtremljUzVaeGF5T3VIakYvcGhLeVA4dkxUdGsrYk45LzFNNm50L2wrdTR1aGlvV3NGbGZWa0xpblBkZm54NFB3a1FWWnBUVjVNL2JqMVhQdFczckJVamRIOUd3dDlya0w3SE1vUWowU0Y4YUNsVTU4dG11TUFtc05BRTZRcTViS3gyQk4vMjhob3ZaemJXL2lNYTQzenRtakFuVVg0bm5OaFIxU3RDeWN0OFRwZ29INzNFZHQ1dlZDVnhnb1VXenF0Sk1USkFPZEF3YzU5N3hJTWYxR3FLNmprMTFtajhXWFY5TW5IUWIya1J0dUk5eTd0dUNLZEZTcmp6SkttUFJBNnZBeDFJU2RwSGNDU0RldjF6SXRVOHBNcXFodVQ5b3J5ME9PbnUxU0RZUDhsVWlQNnBQU1JMcHp4S1ZROVB2NEJZbnB5ZHVOTHZXRkVXbkdFVVpPNEg4RzFuQUpUT3djRVJObC9TeFY3R0kxWGkxVU5Tc0hlaExPV2RER3dCK1lEbk9xQXFJY1FtK2pITFRWbGw1b1ZZbkxTU29NWktvTUJxbmxibHp0QmN4YURMVlMxczhCbStLcHhrcllLMlhqM05xTmpibXVXRG5YWXY4T0FCYktNVTRBWG5qV3kyeEd4TEVnOXNxU1dtY1JRM0ZTTndFeitEZVNtOEE5cjA5aE8rdnNJeWFCRjliUWJHRDBKWTZSRkJFMS95WjI2OCtJNW42ZGxRQ2F2eHR0ejBsaCt1ZUFlazFaWTlsK0xGVVoxYlU0ODRhVWdaamFrNndtcHl5Nm5zRy9yNWt0d3JCaDk3eW81WnFXWVZjRUIreUR4SHoxd3c2cW9lbFRXbU8wdmxDZVB2N2V1Q2RHZE9uVHZPczJjQ0xubyszTWNaZEtGU1lleHJGc0l3Q05Rd3VTVkZaQWpiRlRxMURlaXJFZHJlSFM1cGZRY096c0sweUhmQjlIRVZCdXErb1Erd1ZsdjZDYzd1bG43cTZDck5lRnNiLzlkNkF0TFpZb1dqeFVXZE1QVUtyd0t0SW14cVVGWkNyaHcxSkticUZaeExmMnI4aHZubnpzZU9HR1dKdTE1eW1LMTEvT3NWRXNaTWExaGsyTHdzV2FtZXhvWUdPa3VIbU02RDlvS3hCd3BCRGQ5d05XY0VETEJneU5LbmdFb0FrSEM0Rm5CY0xnQkxKQVM2QUtqVUlKYmxha3Z3Tlp6ZUl6MUNiTW9EcVBicHk1U3QvL0IvMHpYOFNLZmlac21TemQveTNoZzRVOGlQNlJYVmVGdm1vUS9PS2g1OVNVRnR0aVVOSWllanBNNjA5NnlsRFlQbXlnVDdkaEgxbTlpLzdTWHZSUHdqZ3FoNE43QVBWc2RKLys2YStmQjRYa1ZSK3Q5V0V3N1J2VkxkRW5mRlIxZERZSHJDdHlRYWlhMGxjR0xHVGEvejlxTGdTVjY3QVZJTVdJTC9KTm9rRGc5Wkg0WS9oV3RQeTFUTURRbkN5TXcvbTY0cytYQnl2SDAxZktUdk1aczdiMUNKcUE2djA3cThiUFh3UDR0cUIrRmhxU29yYy9TcEpjRUp6bFloQWtUbmdkU01scDB1aHBZVnJ2MFc1LzA4emcrYWhKWTkwOGlFMGdaVWNVT28wWGpKcEg3N3hhSmJzdEV6dFZlQk1oN0ozU1ZtK3hUcFUxQWE3YUQ3YnVabGpMQ3V1T2w2SWpyVW5vRlprbXBXbTRWWWRyT1B4Nk1BVGRxZEpQNzZMNG42NnhSZG1XSWNMR0N1b2ptZWs5cXBoMGYrbHJlRDJxTjluYXgyenpGTDF6S29wR1p1dTMyZGkzZ3hsYzNaUmd3aGJMZkxoWS9qREh1a2V1RExITUR4NWVUYlVkeXd1bXQ0Rm9raE4rOGFwVTJSRGk3d1YvMEFkejRKNjluMmRtdUs0Y3owZjJNSVN3T1orN2IwN00vQ2taL1ZWa2Z4amFvRUl1Q3hDT3V5SXJFbEV1YWxuUkw3OFRLZys2Z3kyOEJ3QTZMUDZPSGRyMVdZRzEyK2RWWWtFU0JHdEdoQjVoNFl2bm5nWENycUdnU0FYM2pvNXZwUFdONGl0WlQ3aFp2NGRSQ1BVdkkxNmtPMXVhNnFCb1VGWFBIMzQrRlk3Uk52R2NMSFNPSWtMWkh6UXZCd0JLNG40cnkzR1pNWWFCVlRtNExLVi81dzJzbFI5bDQxNzNCbHBtK0xEbkFON0ZXZWcxWEgyNS94NEt3ajYrTFA4T0ppZEFtMGQrVXdIRWI1czBocGZzcERVaVYwaTBDcU1MaFFLT2RrNnNrSDI1YjdnYlBkME5Ham5DMGliZGRzSXVMN2k3cTdDbFVkVWpFNnNJdlczaStEcXBRTlRZVEVycS9vdkVwbWhsRHFMVjdhUlMrd2dNUzVvc3hrbm0wenljRVRwYkRxVWNqKzVzeERzMTVJbkYxQ2FYTFp1ZXJaNy9hRUMzblJkRHgzenVvWnJNbzIxZTBmOVlMK1FyV3pCUmlKK0U0aURrQWJObzlpdy9oZlFlczhtN1Q2WWxvTWE4em5QQ0toMVI4WTh5NnV3UDFvc1A5aWZwSjZZcWZSMTRtTWtsR0k5RzdUUjU2MEk2djY5R1lGL29NTC95WXcxc285anhBeU9EZzFDZmhEaDZBNmt5OHdJb2FBV3JsSkZzSk5GQUp0ZHRDcjVJbWRVOVNpY1N0VzBXZWVFT2dwaEpCUUhweUFvZVhaQ1F4Q3RySWlXQlU1WTFJRjhyeXpVZy95WWZOdmlPM0YxNkk5dCtVUndybWx4Lys2OGprVjVHanU3cWxJd0tKODdZRzZVK0NpbEs4ajZ5TldidGRpZkplNnF1Z0RMRXVuM3BteHFnbzNaNGdQWGVpS2UwU3FIRy9GWnNQN0NlUGtUemhkZ3NlM1AvUm1zcm8vSnpYMm4yS044ZmdSYzZlSHgwQXU2ZkNOUjBsc0FWWEoyOG4rbXkwVVpPRTNweWptTWN6OXUzeHJJVHZnQ0p5VnJwRVptMDBhNmxQRFo3bFNna3J1bmUzcFhFdk1SbTdIdEFqK0FHNngzZVlBbllMWUlnSkxHMHROb094RjM4ZXIxYUgySjBERnBMS2hNaTNZamhyQlJGUTdmcFZxZDZ6TThOMVFXNUFxeXhkQUcrR2pZV2ZWeTJudlFwaWh0Y0dzeEV4ck8wNTlQNDlsb0s0WW9IM2lPRi9zS0RlYitEVEtUd0hmdTVGcXEyTDdLZnhpVmJzK043ZVlNOVNVZ29rdnkrZmRQOVR3N3ppSGxFQ0Z2SWpUZE1YTFdXaUM3UlBwNnFlUTJwbmxyREoxdlQ1dVFTWFc2TE9VZHE3bm1pTDVjUHErdHZ4YUt4bG5MWEY0UTkreUZ2eHB2dG9sVG1qeU5xcFpnRDNTWGFsQTg0REZPQ2h3N20wcE14a3UydHNvSzB4TjdPNU1sVUIzejBxeVRqYXF0KzRKOUgwbWNPVzhqSmdEWGhVaUthcVNpQzRCazNNZ0RLNVNTWVNQVGM4V2cvdDJKOFdHU2UyS1N1K3hKTDBiZGZQR2J1UUo2YWxoVnYxQUZTTHkzb0VnZ0lzL3Y1U0hzVmNub2NacDNFRDUrK00zL0pTd0ZvUk81M0VJYkZqVDc3VFBqb0RyNWlRLzFzQ2o4dUpSdjVmbHFGZUo5ekEvbzE5QlhKTGh4T0kvNmw5aXlZb0J4UzM5Y0tpUGlsVjN6c0xPdkh3VGJEdnVYMmkrODBXbG90RnhXVU9QZjIxMEFXeUxkYnhGUHlBb0hNY1ZIYVRqVHFyUTkxamhtNDBZZW4rSTJ0OWNwY25OZ1RTU0dlN2ZtY0dlS3pNcjlERkZ5RFJSdFVzWTRLUHNpUVdRbU1GaUdQYW45a05USnR0WkpBWnYzNHBuZUVCNVBnbUVCVkVEaklTN01mMzFNWWFkTml3QWZwSTZxZ0pSUlRrc09xWDFvSDNtR1Z3SDhrT2x0TDNXYWJObWRUam43UDNWQVBzQ2pJVUxmdXB4dEhQV2YvMlFBQkFCb0FRQUFCT3dCQUFBOEJDanNDQUFBQUFBRURBYmxBQUFJQUNRSUJBUW9DQUFNQUdsUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZ3hNQ2s9PC9CREI-CiAgICA8L0JJUj4KICAgIDxCSVI-CiAgICAgICAgPFZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU-CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU-CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IEluZGV4RmluZ2VyPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw-UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U-RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0-CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICAgICAgPFR5cGU-U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjcyPC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFXN1dBQUVCQVFBQmJzWUg1Z3djRENBcEFVY0FBQUFBQUFFM0FFQUFEd0lBUUFJQVFBSUNBQUVCOUFIMEFmUUI5QWdGSFFFMEFaMEFBVzVWQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJuUUFBQVRRQUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRTBBQUFCblFBQUFBQUFBQUFBQUFBQk5BQUFBWjBBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFGdFhRQUIvNVBmRzZBVHppTEU4bkJvL1o3cURGOEpubUVua3ZsTVpzK280N3RLK29hdG5OdDdQSjBWQWMranNkSU5jQnRHbjgvT3BFNWtlUkFUMHc0MVF0OExnSUNBOHBCd05EanN1bzhZRGROV2VoVXJpVnlkN3k2QThTRFpLWlBYOUZyalJVbmMxalp6OGlOdDJodUEvQWhBT0Y5NUpHNW9Samtnd0tHM2lTbGtIemVwMHBGRGFjTExCSGEzRjFueWRYRi96cWNUQUhMU05zZjJmYkYwQU1pbUJFMlNYYjk3MHNFblhBbFlTbi8xTGpvVlFKK2U1TU92MC8yZ2NEQmUya3JGdGoyR0Z1UnhkM2JpUXkzK3RyV25pME9tRzcyNXhEZ3ZXSW5tTzZZQTdJdmdwWlk1bkV4L3RUbDR5V2JtU2FCWm5SRHVjektpb1VvVzhkbEFQdnZZczFrTTVKU2ZKN2FsRnhOcW1LUnV3SkhWNERHTWxRQ280RFJYN0JLbklZS09lalBxNkJzY3RWaGd0dHVKdmxvWG5wekxsTFlTaUg0SkxmczI3K2ROdTJlTkF2R0R6TUpBMVJoUFZrNXdQOWlUL2xHK3JkS3EvRzMrTTErUWVuOG8vUklsZUdIWUU5cnlucXdOb1BvSzVXVXB1c0lUcW01MlpLRUZWeVowYjFmenZjNkM1M3VRMXdaeGsvOFhhaWpnT2c4M2I1K2J0c2Yyc2djUzNwZUY3YVZIdXdPS0FKN3dYZ3RDekVQei9EWG5ydFVxdEJwaFFXRTJHMU9KeHM4QmRUcWxtcXByYTdvNkgwbk96Zjc5REZlSU1QajI5OS9QSk1ZMVdNWmNGNWhXY1RpcEhzenpjNXRzczZudW9hZVJHU3pEMjkrcGxuYzdSWFpWZjRPZTNGVjk3c1BxSXArQXpxaWRwTWhsMDc3cFlxMHVvclpQWXpPdHZ4elVSRW03anFGeHkrQy9yZjV2K0FXeXRRd1kvQ29qa05INHZhSEQ0QTNzUXl0T2tSei9YZWFScDFtdWdHQ0RmeWdIZllUWWx1Y0d3RitjYXNmVUVuNktsMnorajUxbE9yN0hIWkJZTHNuVkJ4c0I2c0hxcDdsVVFqMmtlNkZWVzJldFE5cjgya0lBTXdsQllhcXVKMnhETDd2bzBXSkYvUGdTMWNZNUo1TnRBWHVrZGNIazg1V2Q3QndwVnBEYm5naGs1Smx0aTJsVUVjQlZDRzZCVy9WUHY2UjR0Tmh3aEMwNDVXUmc5eUppdjNFdGJNTWhXK1RwTUkranRrNEpDNWpuYms1eU56YUpNY20xR1J0SGoyMUhPUmFKbUtQaDNXdXo2clVUQnhLZC9OS2ZlV2R2TkY2ZElPek1EQlgvZGQxSlAyeVZhRmJuZUs3MFh0MnVoSVR4VitGU2ErWXY0UHI4ZXMzb0tiZDlRTElrck56dEtjYVZVbUxmN01udmNmenZZL0tUeW1ZVXBnZkwvTmtyTnFZcVkzTitOSTNmY1Z4N0E2NnZ3ejNoSjhETHBUODNCU0xzTm45NEcvVEtNY0c0NTZTVXRIazRpN005T2I3eVBzT2ZvRzI1R3hLV1ZMdmJ5UFNjVVNDV1NJa1dMdjI0UWlyaG1hdmwyVEF4bnpSQ3k4MDZFZ2Era2paRzV6RDhnemFaVXZiZHdaN0dlZ0R5eVlld3JZejBleVRZU1N4bm81cVRqTjBua1VWSUpLblYySjdmQXRBdGp3TjVmUWRENUF6THlxdm5pSHdpa2lSU0hsRGhaZjZmeDREOHlJZktrWDBxZ05RbkY5aG5ON01keU1aa1dmcFNCN2FrOTF6eStoNldhOHBucUdBVWdPZEVaOWw4VTd5TE1wSEo4OTZqdXVyNDB0N0VjUFJYZldYNStlckVWYVd4T3kvalBaZ2xDakRPL0Jadk01K3ViWDFZYlV2Q0g4WUJ5ZjBLenY1Q2hMejJJNjA0WWVnS2FJRWtBZXg3aG5XZ2pSdExnZVpOcDFvZzZ0QW5xOEN1T210dUFPTVNUN1dEQWxvdnNPWXZiblhDdzNydEtmQ3ROWUZDdlI1c3IrOVVFM0x2RWVXVjJOY0w3Q01QRDc2ZDd1YmZxTXdnRHNob0VqUlgyL29VSk9kQ2ZHTC9XSCswMkRYUHVmeFdwdkhXdDlUckcvSnFoZmhnUERSNDFTTm5tblc2aThuM1FMTUNHbEZ5VDQwTGdQeDc2WUFNVDd5NTZPRDM5aldOSXZsZkNiM2tzc3JCcng4bFM1dVdyVEJwK1VpVjV0NHdxWlU3ejZhWUJMY0NudlFmb3A2QjdJT3VucFZtQ3FSNmJSNk8zN1lVVXpuWlcvdWhhQ2VKaE55TjNHMURSdHRmUE1oNkxpWWd1TlRwUVpzT3BiL2JDaTlCKzRHLy9tVlpUMEpVdGdGcDlQeS9tcGhYMnZLWUhmd2daUUhRVnZwV2JweHRRWEw2UHA3R285a0NKZ3NFSlhJQmZoQWFWSDVCMGQxWXVvSWFKOWFEQ1RkRW5MNXk5MCs1MFlDaXB1cU1KVTEwV0lKK1ZWUHB1S0VseC9STUtLSkdvWm5JS2FsMGlGWUlGRXljYkg1TUNYd1RXWkNxNjhLb2VoNTBLcWpQdjA5RGRIejNUM1hyZWhKVmJnb242SzBDOUhpbmdtVFd3QVpyV3pwVVVFQUFGWWJKSzVQek1SeXoyUElSd3FkN2R4d3JMYWk2SGhkaVhCc3JRQlAwaGJPUkhMQ2lpT2Y2d3p1MnBRcXBsUGJPamNaa3p2OWhLd0NNWWNuajA3K0J3REI0bm9wRjYxQ2t6UEhvMU9XWkhKT2lKVHA2RFFjSUZlS3NaMUd6ZXJWbmZIaWd6SjF2L2ZaeXg5aG90N2dyMGl3TDgxcFprRVd0a241aGNwRy9icVk3NXBkcGoyZjgyUHhQblNjZDFRbytqUlBYOU4rcHQzV2RDQzNjZTEyT2M2eTdsVXJ3NnVYSVF0VnozVmdkVDI5TzBDbGgydS9Sc2xaVHNTWmh5KzNFell5eFlySm1DQWNxRHM3bVRzamZJcFNtUitCeTE0UEEyM2lJK2dGa1AvQkVtWlo0REdGU1RrUTZYN0ZISnorTjFQN0dBNjVIejBLVUMwaFNYRzRrZTBiQTdXcW5vRENVQUZjMTJJV281NDhnUU56MUV0MU5nbkdNanJIaXM2QW12L1ZiQTllamhSNHVMbkczZmlndDFkU0ExbnJVRjNNVGQ5NnFQUm9hS2w3ODEvT2pmWjZmWjg1anEyc1RoYnJQMEVGQU9iaVlWSTBFSDNHS1BrNG80VWprTzVKaktyelNVUDlsUHpoa2FGZHhOSUZZQjYvSjI5RDZJc0pmS3QyUElVQW5JMW51dW5uZXlGQlhlZnl1NjhDZjdISk8wSFVNbDVIMFFqaEVOTmFhc24zSlNDOTBKS3Bqc2FVTXVVS2FyMmRUOVlwajVyMjlQRmdWQnVXYnBTNVdRd0VkU21lRFVKMFp3M1lyMU1NUEFUcndWRi9KS3h4clk5WGFRWUJiZTlrdlNQMHlwemgrSUdyZ2w2UEp5N2dBZTBJVWVjR1FyRk8rZlY5aDFmNnZiZjMzTEdydUlmTHFJcGlRV3JoQTRNdWI5c2I3UTN1bTdkMXJzTjFZMkRwYUlXNXk2WFRkMTB5MXpQZStIMCtIQktFMWVPeGRzcndUajg0MjB0MVNXcEVhSEVtcnFhTXhyc1Jjb3hMa1NPTktoK1lJSUUrWlFiNlZUUm1FYmg1Yks2dVQ1bjZUUmYyRWd0UVV2VjhqSEpsdllqbmRKR0lWYWZzV2NkcjFva2VvZ2c0aElJZVNzSG4ydU5DSm0vcFBoL2JVUFhRTnNBQXdzYi9WSWQ3eTBFMjNKNzFqSHZXckxKQXRYUDlWS3VwTjExZ2F2VnNROU5IOUxaYXcyVDJ1U2RRMnVKSHJ3QUN2YllMUGZpR2VDTjNFZDZneE1menBsZ2dBdWtjMVlkUGh3ekFmMk1aazhZTSs4N2drWDVMTC9sd2hocnUydXBjWHkyMUNtRm1PN1lSbTdRZlFtUkMxYit0ekFaNzBXcktTOFlHYkVWYWozSWRFckIwUU8zU01SL1QrYmRDbjlqZ3JBZEN6YlJxR2VEUVZ5OUJkejg0RUpaL0wyQjN2Rkl3bm95YU1FU3gxV0ZyallXb3V0NjRsQlpxOW5kazFMVTFuWVMrNi9qUkxJOThVczFsWUtuUzBGamNER2x4UEZXRkpGS3BkSjR5VkowSjRQSVMzMWdDdUF3eDh5RzA2QjFQUVFxbHVxT3BHRzBRZCt3bXZzb1pST3JwTElKSjBaZ1JybkMrVk11WVBZYlNxRHJBQVROOG5hNHJEQTJJRlR5Y3BiZDBhTG5sYk5aYTI0WE5PT24ramVGVE82ZGkzV0liYWhJNzdDNzRONzU5bjdhRStpUTRsQXlkNHc4Wi90OHpQeTNFT0RNTmkva3VNdTRYSHdFZ3JtNzFSdHFjSW9hZi9TQ0VkL2FGQ3NFc09NUHRxMmdOQ2lveTB3RlFkUzJGZUczMDA5WlBiTTEzV3BxTzk0MUEwRExqNlMvbU90RmF6TllXVnd5OXNBNmRjbWpseE84VTZ3R1IyZmRkVENsVDQwT3RlUm1iVlpVaGFQSmxUMEtYRlJVRzNSOUF5MUkrWERSYWpneWN2SnNmNnRvRVhha3FTNEhwYzd0T1AyRnhZNU55K2JqRVpyTTU4aUtXYlNoNmtKbmExbmZpT2ZzZFJwTC9tek5mRXNyVisyUU5NQ2o4Yk1Ia2FXK1J4d2pjSk9HTjBNaWlzWVdLK2Q2S1d4T1M4MWw3VG1QZnc1RlFWT1hBWGRHYjNlRnRNTFZyMEpVcEtsbzN4UFFOdU1RaEs2Y1ZPaE5FRmpWbi9MS0xHNFNER3E1bGFXS1RJVC85bG5HenF4QTd3M3RCMk44Y00yY0laU3NlUlVjYjBjQkp4Z25Ma0MydUxSL2RxQ2hJdzdIdGc1MXpSNFh6Z1NRS3YwVzcrL1A2ZGRJd1Y4eXZrQlBLWkdFbUFPTmVRd210WnVjNW5xbHRtakxGZGpSQVZLS2FqUnZzOUNubXpUQlllU2Q4ZGUwYmtVU1VPMmFpSGtCQXBQVy9SVDA0U1lEa3FmMmtScGRGYXZwK005YU5DWmxhSFFJTDhYWlZPbTlGV1p4ZTkvdGZaYnIrUExybWcxcnZuQ1A4cWJrOVJ3M0MzSnRkYU1tSW4wNnRPOWJSbURuY2NEVHYrczVyOGd2T0NsUU10QzhIcHBIMVBCdTh6WGtVTUFGd2poRkNFaFBib2VHTkNWek5LUHQ0b2ZSUkdURFpjRW1BNFFMOHdUcWZtcFFyMGo1QUFqMnpEZVdDUEM5eTNRa3ArKzhmVVFzeS9SeFBKMm8xU055d1lWY3E4WTExdTYwNDZ3d3dVZlF3WjR4a2dmN0FRaXBKT1h2MDlYK0ZMRFRoVmpMUjlyQ0wxN2pYY2Q0Q2M4WGJGbG5ia3E2Z2ZCY3JVRE9PSmwzUXY4aUNHNVF0c1JBS2pOU3NVREQ1L1kvMEdpNzhjSmhYOUNBSUZTd2xHeHN4bGpmMllRMDlSVzloSWlhcWpuU1BXc1N6ZHZXNzIvc0hZdnQzNEI5bjZBZHBKczEyK0dwL3ZzYmx6aTFFOUdScURxeFV6cHV4ZkoyOEYvZk9uSFNuRGZoTDZtWDF1RW1MeWRxdEFJN2dvWXN2b09QZktvZU1kcXA0LzR0TXVUTkZzYTJNTmJybHl2Wk5nbWVrTnpjWDM5UnVDdWhReFpsOFU2OGVMZGJmNy9vUzJXa3dEZzdiNXlteklBNmNRaFZrSlp4bG5xOHVFVEJlWXZibzZzeWNzVkloc1ZnSVFxVVAyTldwSlg1dWFPcXhsalEyeC9wdHZSYnNQK0QxQUx2QlZSSmhzWS85RXVTbzd4Zm1hVEVSVkEvMlN1RTVvcmdORTRjd0tXeG44M2tYN2ZRQWkrek5Gc2cvM09aNys2MjNTT0wyN2gxRDVWQmNvU2ViMjN5bHNCT1hVSE40UHM4MmttTk90Rmpmd1FoYXlYS1orRUNlME9yT21YR3lUcnVuTS8yelR3cDg3a3BvWnZqODg4T29sRHVST20yQVRyRUlIR3NhcGZhNzh2M0NLZU1XNTYwdVhpMVA1YmR4NjdGRkhtK1Rjbm1JRkFvckluSWhHYVFMTDdubUpldjQ1eHpMQkN5QVdqaXJhNVZPckxTaURDYXo5WTFOeFdiOTExbm12RnYwcVAvU3FIOVpZUUtkUUkxN1padS9LSmFKeUlXMzVNdmdrcW83REh3QUw0MXNOZWF2d2IvcHk4T0lBY2JjU3lRN3dPR1NyYmcvNnBJcWpTUVU5YVdiZjBIRHFBbFMvQTV5VW9FSEJzK1hBVElaMGZQOEc0bndhNy80QWUxSlpPaGxFMU1XUmIrc3VEaGxqSGNyVXdMekRXUGdwb0pPYVN3QlhwS1lUU2JUZkJTQm00b1RrZ1JTcnpyeW0xak9MeUlvdUU5bTZIcXl3MUJ2KzRlckFMbC9IQ25POWhVYXJ5TXdaZkc4KzJRMnlZYUVoRTVoaVNwWW93ZlFEOFZqbmxIT1RyQkUwTTZnT1MxcW9KSGtaT1ZZYTJZZURmOXBiaEpUdFp4UTZJZTJlR1g1dEVPN0R5OXZEd3VJZHR2YnZMUVZMREd1K3htZVVNaVh2ZTRCaUptbURKN1BUdGZGMDNIeW5vclNoWHpLc0NFd1VGUWFldEUzM2Z0a3Y5THdobERPb2JRSnNCMVBrbm5GU2thM0RxaTJuTDFhcERZS3lhNmdQaU9RTUdVdU82eFJxWmNTbkNuem0wRUhYME0vOUtCMTBPSmZtcCtnR1FZSlErUGVHTEE1UW9JRVUxMUhqNUtSeURaREJEVzdSUldnemVsRlF0aDBoS3dTcjQrT0syNHk5ZGpjZUNRaWhGa1JUWlMybk91VG5ybXRlOXo1NHRQMm1CTjdLVlhQUUQ0V2YyWCtvaWVqeHhqL2lwQm1Paml2Mkl4NVBVa1d6MEpBSXlvN1dJbUdIbmpkTUtSZG5lampmZjRnVUxtOEZnUzBqKzlZaUlnQXFTbFpkTEMySWxkWXIyL1ZMSkh3bW9FMnF6a3hWS0tSdzJNQ1RXcElLMUprb2pLc1RmZ281bTladElzR1o3bHlDSHEreXErOFdMSURnUmp5R3NWa0ZXbmpuTDMrNmNWeWVWVzg4WmZhUjdMcTB0ZlpYVndLMTRqcjZrajFDUnB3T0s2TUhVb1VFVW42N1pyeUU4QnFTU2dKLzZvL2hmOXc5YmRQSHF2cjF3MStFdFFVYVJnNHJzSTk5R09UZmNJN0FtNWhTemlXeXdQcEhxSDBhbldRNlRaUytHWm9tdzJ5aDZCdHkxd3RPNGxyL2QyNm9ZNDY3d2V0Q2syNWZ6ZHZReU5TZllCOTRiZTJ5c3F1eHZ6cTRaU1NGMGliL0tiaXk2cTU5aUtPaWg3VnlUcXN3UkQvdHBGU0JEdElvbk1ZVFM1SExGbnJMLzJHejBRd0ZWZ2w5WVdBVzcxZ25zR0dFQlJvN0dzQ2RXK083Y3oxWENrd0J2L0o5VXNmWis2bkZpWHovTjlkNjhmWTJjZS90dkN2UnBXdnZrRGZkZ0tMRmxoaFhDa0JYZ1JLOXEyeDZqaXlXTXJFY1N0UTVKeElpbnVqbTJ2Vm04VnNOYzNFUUVOMERtcE42WnMyN3VVZjFnL2NRR2NoYjQ3ZmZmNnBHTWJLME9mclJlbjlpbWtBK25XNkFQL282UXUvNFBRVXlzUmNIakROcVNRSENpbDMyc3lQQUF2YklsRzNQdngvVWVxQ2RRVXljZ1N2UDVCWlFJMGZlRUJWaS9JTlIrZ0doWlRTaDY4dHU1ZGdlZXRhYkhzSVhVSlpRbmNXUVV5Y09lcTNtcms1REJPc0hVblBPckNhbmIzdDd6QkNUR2NTZzJwamJYVFllK2FSUnRlVkhxWklOZm9hUFhBRlFHNXdRc2VKL1dHVXcvam85bHdVd1VydHlzSjVFeWRIaDRyUXlxVjd5NDJGTDNRcDBWSzhrcjNncDZ0YmtCZW5KQXZFZHU1bit1T2htY3ZPcE1rR3F1bWdXQmhOSWJqcVpKUHZ1aWUxdVVJY0cwU1RTYzlVZEMvdlN2SkNnTnd2V1h1UWtmR2NqU1hmQTJlMUlyNWJlaW8yVElPcFhjVXVaMmRSSXhDNDg2MUk5R3BrMUE4MnpOWXBrSDV0SjM4LzNlY0lhUXRtTnNjSzBUemZEOHJYQkwvSjhTbU9JUEFQcjZ3V0FGbzFTcTF3K3doa21qUFMvdXNiQ2xsVXZHcGYwQXlWdU1Ldys4eENNM3BBemhDRkxmR1BISlRTWEJOaWFkcmdpNDV2L2Q5SHRkbFlwT1pKdkhkd0dmKzZ4N0VFUm13d3BiL1ZsR3hLM3BsdU1INDUrUFpZYm80ZmppenRRcUoxVFVPQ3FWZXVBUEgyM1NWaFkvd0MxcEJoSjJYeWhTOCtHZnI1bGZHVnM3bUk5Z3NZTVdzNVpJYWlCSis4S0NERVJCSnYxQkpRWEJUNGhNL1R1M0Q0aEpndUVHYktTTW1WYzJ0R3Z3bm5RY25KQ2FqM3Y1MWY0YzFKcHk4SEp1eEQ4VjlEL0cvbW1sQ3ZOS3I0U2ZtSmtNYlJkK1Z0VEI3ZDRnZnlRUXgwV0VjcXRqS1dVcFhLWDBwcnNFQ0x4Ri9QdS9aQ2NYMEpjbFRVZVdtc0xMd20wd2UzOUl5YklmakFqNnRMMHBIL3pyNytSK1JPZEdHd21DTEN3angxQnkrU0czNVU1RGdmNU40ZnhBUW1UMFIwTUlFaldFWHVhY0lVWjJzNDRkTDR3Vk9KYlNqVE4zNm5mNXlkdEVzMytYbUErVmJMREhYaXVzZGZrTFozTnVCaTBSZm92a3I2QUhBa1dFYmFEcStteG40SWExTU5MM3JDWTM1OTJXTW5yZFQ5T01sRHc3b21TZ0VHRjZoSjR6WHZHVVNlU2FEdVo2TEMvY0pVWTFUNDRsYUtNd2hUZWR5UGkwaEtnT0k1V0lhdkZMenQ0RkcvenJRMms1OUxVTllQRmliWG0rdFI0OU56SWlYZzJJejdhUnhzRW1zWHVXd2srYjloam1YMU9MZ2o5NzJPbDZPTVlIRXFyWTdZcmU1Y2Q5bnV1N09kNFlSNUJMR2JuL2sxYTBvZ29ZUDZqakUwOUlJYU5zdm1nd3lmM201TTd5RElEdmx5MmkrYXl5Y1VQYm9tYmtWRnJ0WkxkLzBCazJRMThLSzU3eno5SWNNandQODZIbmszT2lFbDJLdm43ZFJwWGVHbzlEZFRZanVoR3JHMTFydHFEREREaHJLUkJVUDRXbVhwQWZPczJ3bUcvdU45Ni9SajZOK1UzRi9Cdmk5cEVHM3JaSzZTRCsza1NQMURrMVFGM2FTVjZOTGNOVnhGTlB6d3cyUGppSGsyYWJ4RTB3VHlIaVZkV1NOZnd1ZFVJMTJoV1B2NEFYMktoNjBnVFB6ZTFQWlBJNUlNaDFYVzMrT2J6WHNIV3NyZjFCM2FoZlA4bWRzRC9ONzlOZ1lUdDNBMzFDN0Nua0NsWTgvOFlXUllYUStQM3kzUlp4N2llWXBtbGlnSUhMb1hGL3lRNlBqR2U3cjRIK29sSDgyK25IOWtRMG9DUVhVTURuUHczSm5BMXFXZFh5ZHphR2lVUDI1V0VxN3lYNkd6N2N1Vld6QW1lWWJreDF0REdmMnJmajRacVdlbW02SzE5N3QrMXl0RWJvNzcvYWErTGVRRC9TUzMrQ1RHZzk1c3JSTytIVkZWTHZzY0hSVDQ4RVo2T25XSFZMbC91bFJXdVVxVjloVFpMQm8vNDE0SVl0d1Y1cHd4NFFMU2xYd0NwR0IxVyt0MXFTc3JiVzE5SzM0VHE2dU1CbHhhVTk5Vm5KNWRxSWNFc1lHd0JKb2dJL1V2amdHalZDSFArVGtLNzlNWStnZmk4SWJndGJVN3dtNnFUY3NDQ214dVZPWEQzcGxvcDhISHkzQVIxeW9aZWh0Y2RIdEhqZDJVT3JHQWZ4N2VOSytmN3V0eHFPdHFCTU1PZTYvVDNtSU0xRDQzak5QODVSY3lLLzE2cjk1ZXR1NUlBNzVORVlialUwbXJ6VU9VQTkxNlJRUTB3bk5GS3RhUUo2TmN6SFRycEpYTW82cWduendzaGJpY3VCM2lsZTltUXRyZ0FWS20rb1BlRTY2QUNSK1VidUlaWUFiVkc3YmRWR1RhVTh1bE5KVy91ZWZPanRQUVBuQWlmRFY0bGpaZmNBTEhPaEo2L2FyTWNIemVuRWVYYkl1RzdwL3dsU2ZsUEs4emREZENnbC9MTC9HWjAzeUVKOGFkek8rSG1sa1lLMC9sMzFXeUhOQ25KUUwzNngzbXZDRXRWMHVvbVk5Yi9PYVZPNURVYUM3SFBkWi9HUnV5M2R4c1lKZlVxMElsTExwMW1uNnVoc0ZGS1l1Vm8wNkpPblNxV1RMbXQ5L2cvK3Y1Q1JlNWNDR0R2eXNxZmlYdzlkb0ZsVVNpemljaFZNZjhTcjNkWUl1L2JOTWtsT3Fzb1g1UzFlS0YzQlM1OFMvUnZvK3kyTWk4YnV0bWJFdXVHSEhoVVVNaTJ0S3JsRHlBUExVTE5rcmxid1FwKzJRMWZmcENBNTEwQ25kWkhGRUNDR1JualBjQmFsVjYzbkI4Ull6YWkyb2RPeS9XcFE1YlZuYVZsTk1NUGdRR0tCN1FYVnFGeDkyMUN6UDVwckwvR2NubzlxT28xb0VSVU1xOXRMSkt4TDdnQWVBSUZVSy9lUUtDZURIVVFGUVdHM0J1WGVxQWVsTXM5NytnQmFib1RwamRyelJBRlh1NWlpcVduVjYwUHBnc1hxNFBtWnhVL3ZBSUtUSEdoa3FLMXRXS0hzVXM5TG9aVWFmYjQ4ekp6VFJFUkFVYTNsTWEzb3YyQjMrbWd5bithb0lZTEZYYkcrS3Z3bG9RTThFZ05wN3RFclA4ZWRGT29XcnVpTkxxcEdwdUVmWlNwb3NML1YwU2lHWk16eE9QT2NFNGlvNHp4aWlxbGhXOEFwSnp3M1hiT3JsTjVyUFlUeUNseVZoakQ1ZE1aUVNiT0l0TStCclArMkl0OGlteW85aW15ZzZWYy9ZSUt3bFZZNFg5Yy9IbXhoWUxmWDY3MTBYcHNUVFhGa1Z2bDN2cGZxMDFSNVRYcnpjaUZjRGF1ZWJ5VE9DSXBTazhmYTRjVmpWOUxldlpWQlFvbmx1WTRqTVlwNFNReW80SDRXS3YrRWFhMEpuYzU2eEFQV2tuUmFtb0RUSWVVdGo1V2srL2xyNUJGNC8wZTdkK21iRzZyOGV1RVVaZnZicmFSZXlUSTRoZHduY0w1SVF5M3c0ZnhhRkVjUXZhV3BYcXVIZG1haGFiVUF2OXBDbDhMVjBaVzVoeEROVHphYVpJZlhIMzlleUZYT0N5ekplK0FJeUdMeWQwK2d3bXh5MU80aVphQjhRZ3lEbVRKSXJzMm14S0xnMFgwNVN3WW9GY2tYeHJHMkMyYVFpb1pWc2kzbDF6MlcrY1pZZjhtWXBtOGVUTHhaSjhvUXg5b0ltdHdUV3NtWm5uMURWWHQ4UjVjTGhabHhoQzN0VEFkWWxNNGp5Y1BaVHpJeU5PcE9pQ1BRU0RUTzhzQXVHSFI2ZWhQbWdlSmhNN05NQTYvMHU1Q2RhTTBUMUhxK015Q2Y2WGpjMlMvK0VUU3lDOXVXUFdza3hJc0llaW0zZ2VGZzViYXgwNEptenU4VGt1QlRkT2NubFZkT3FIVE5QOHdPN3NsNFk5NVZJWXdCOTRhRGthL3FGanZ2aXFJSDdUM3BaU2h3YUx6bDgyNE1Wc2I0UmRkYUJKdlZZK0FHa2RLZmdlcWhRZjdic01SeEd0TjR5WGZLTzZPZEJlNFlsR01USnladkF6VnJqNWhObndKYnQ5bzV3cEVGMDhWM2JNeC8xTmtBb0RmdEFvQmpDUnRIN2FXYitTL056TWxOZkhqSFA2K0hPNE8wUGJJSVg0a2RZWGpWaGdseUxhczA3ckZCc3M5M0JCYTIyK3E2ekF1VGtVMXM4UTg4dTN6WDhwbVJSK2UyUEZ5NTJXZ1BUNDl3VlhwU0tYNjBHa2N1RW8vdFYyZXhHa2dYb1hFN3gzU0I2SjNnNGRRTlRzQWlmN2J1T2FCRWRPaTJabGdxMXByc2dNNi9DbWpkbXZPRWVSdXlDdVpQN0Y0T1F6aWpCSHg3Y3ZmYnNpcEsvOHBnbWdaMHdJbmZvU2JabGx3Tno5RGlIWWRjSm1xY2RjSmpGUUI3U01OZmFqRGtsYnl6dURJc1lLUDI4YmNwcW9zVVBzTWsrWDVDWTlheTYzdzdOcFlhdDBOT3J1M2R0SVNkMC9tN3prTXlPWjArckhoYWg0RE5Lb1VlaGVlVGRDN1ZOOEVYa1ZvcDUvVU9YVitZeldOYjhLWlFENzhHV3d3SVRNanBOVG5iM01YeGhLb2NxYTNVS25uOHltRFFROFBkbUNpN0FWK3FvNW01MDcvSVYvbmJzVnFoWkxiek0rTWhlanZqejdENU04eDcvNnplc1BRa0ZlbHVqYjV5OFJmQU41V3EzeVROemxBRllXYk1RY0pwd2xVMkUzOTBYUVJ6aXhKbkNPalZRT0I1QjFEZDBGUGFKWTVIN0J4cnpaSC9VbElFRVpGOVhtenppKzRRbTN6YXUzUjVSL2lkcHpna3VJb2dWZW4vUjNVTUZWaTFUNlYwT250T2JWNHJyTnRRaVgzdGdmMUUvUUNKNXA1czB1Y1JQaU9KZFlzZFV2MytBYWJIUzhFS3NwUmFmSi9VRnVnOWxDUUNNRXZCcXgrNXZaWHdFQmZuL2JuS0RaN1ZWMlpYeUlPb1l6eTRoUzhuOFlqREJNYkdvWEsyVGhFY1BOaDNwcGtvemN3bjRoNUcvYWdScFZPdG85WnJXVGgyMEdXZkR1V0hNdnBPWWNHWEFmU3lVU1BNYzYrbTYzSG93aEk0bmoxNFdsR1Y2WDFDT29wTmxrQlNSQVRBb1NrT0hQUmZXL0d5NkQzejJuNHlkaVdEcmxWZ3dzRzJoMGZDeTBvMzRYRnNOTXRkTzZ4YjZqVkFPdlNGWkZXYTRoQXhVVDIwaFMzMUhkZERhNHBkdW5lNDl4amVlQnVDZDRUZ3ZudEo0NmF4cEx0ekx3N2tXcysxUnBBNnVsVklwQWY4eGxNTU1BWHlObDNnV05pR3V6RUFLWUxzM01OcENrZmMzaUhRMnIweU1KdnR2aFpkSERiWWlHYjNONnJvWm1YcjdSNW9YbFhyb3RmbjRkYWJ2bzVpMStqZVNodDdtV0h3bk1kYVltTFMyT1ZDV1Y4d3p4dXJTSUxLL2ZPSnQ2aVFQOGRUTU15bkhnWGJON1ViR1BzYzNRZjAyWjQ5OHZFZmpjUjI0YzArOTNwWFBwL2dJQ0FnT2IwZmJyYU9iMzhBTnRJd2ZoMlhpOTExL3pXNlZWRGtldlFDTEEzZmU1UlROdzF4L2JaYmdpeDNHRVNqUjEycUt5TW1ZU2g2TEZjaEc5SzAwVWZjZXhrOUhwVXdqSEI1VDJhT3grZnBrYm1zdVVyS1BNY3pSNlNSVW9DVGFWcGtIZEV3dC91OElCQW9vZmk2WEl3U0dPdW9mV0xqRFY3UXMxZVVwZzJwcE1LNHVXQXJBZ0tQUStuZHo4Ykx1WFdHVkdFWE1XZXNteTI5ODVhOXB5Y0ZZSysrc2tHMllzd0xhL1NKUjhyZml4Z3FHOUlQMnZjaCt2QTBpN2J0Ty8vUjdXVFNBUnlzd0hrazJPMWJqMW9TWUdpcUsyekw3R3Z5ZW5hMFRFSmt1NmZQVWlMOEE3WFlTMko2N3N1clp5aXZTSGEzZmlMZWJwcnQ0K053d0hrVzI0ekRBQVVOWWdZb0lFTkRTZE1aSDBrY2Rla0F2NDRMUjJYYTRHOTBQWEdUeEVaamtVUnRvUEEzaGtveVh0Uk1zZkV6cW51eStadjJVamdNellZTHZ6M3FRSHk1UHFSR0haRjhaenNVQUVDM2V2UHFTd01wTEs4NmNzWDMwUGh0eklVZkM4TS90bWh2cHgxYXhjRzQwaEUwN1pEQmlOUXl5SXhHWUdOcEVJbzNSemIybFY1N0V2Wm14TFRsZ2cwbGJpejNGWEpYeEdDZGhtV2dFY2p1a0NMUEFsVElGV3h5dVJRc2ZORUJ0SGtjY2FCay9oSnhWcFNzUVlkNDdOWXJtMlMzckZzalFHMTRuWUhQckJyL3JLdmlWZjN1RG5uRStYQUpKaVpHVWV5aWZqU3h4VkNKMVVBaUtldm9Yc05LR3U5RHF0VHQ4TWFqOTJMSGRGNE9RMEUvem01aDVMd2I4T0VkTzdOWGhPMFhwTUQxTHZuRDUzMk5Pak1sRUU3MXd4U1I4STROZ3pQU1dVQVdXZk5aUnF3S09GMldSWGd6dXVpU1dUbTl5Ly9MVnlkTDFCaitSV1EzM2ZlOE9RdDdod1F4eElPSUQzajlhV2RXczNaQ1I3Rkl6MGFwaUFjbGhZcWZEOWhNTmUzS2h6WHZFbFFQdGI3MjM2L2plbkEvVTFXZmc5TUZsK2R1RWRJUmpBdUM1Z2NUTVRhZTJrSkFWektXOTFSZTFHY2xaMm5IV1ltVTVibStVa3NNUXAyYWVuMW5JeEM4RDc5dFBvL0xubnlSMWFoTktSdkhrYmxrVDRVQk5QbUp4bHMxbEZPa3VjL3c3c0JraEdzei82ZUFFZUxuSm5vS2NGU1ZveU9na2hJbHkrMUxISG1seklBRGhEK3dadnAwTVRFeE9nUlRXTCtkcDJlcjhuM3JncHRnMUw5OFpldFNLSHducEJVSjdOTUEvY1FhNkRqM041aWxQWUV4NXlvZ1RPQk9mSjIraUpnb2xUN1c0UzFDOVpyK3Nuc1hMUy9OdG1DaHJwQ1dsSGFOWGgxL1ZibmhJOUVRVy9KMnh3cXR0dnJ1SnZoeGZhRC9tblVIUndtdUF4R3AxMWZqZ0tUMFYrdElWRExGeVZzVktoWTg0OVZ4VVlweXdxdTJLSll4RWlFSmpaNjRSRGxscEtWYm1sK084bWo3TWJnODdvT213bzBzdXp0NjhlVnR0dWl3ekphbnp0dS9RdXhuaWdadHhoeVVxSGdhK2RQV1ZrUmsyeUhFSS81eHQ1TWQwZXdNanNkZmhXZFZ2OTdYUlVwcEN5M3lYRStBWkNJZlEzQmNwcll1WXNnV2hCRk5UVy8zbmkybmVDdll1UkcvRGh2L2s4aGlJOUU2QXl0eDFhM1RBeE9TemNJV3lJeTI4S0dZRzNIcW5rY3NIaGE0b1NuNWd4ZE00RnZpam1IRkhWdzFFT1RHcTBiNHRwdDlJN3RpakhXejVyRlFobGRBcTlvR3lMc29pQWVNNFMvZUlrcVN5a2FRMjRTZjZhcTRDR29mL2haMGNwckdiKzVTUE9zSGN2VGpHSXhTa0tBMHNLakN4SHNodDg3MXlHbEUwb3pwWXJuWkEzSHY1cklWNVhLTWpZRDRXWHltRUFUM0U1TzRTbDRmU1c4VHFWS0hEU0RnNGhBaWlXRjlOR2RrZkNRNENIVkt4K016WGRKSXQ5azIxQVVMZm5XRDJ3dUV6TUs0OFJ4VWVORnA0cSsyUDRFZ1M4Q0JnNy9UQllwblVQOVdQbXZjcy9EQlI5bGl1Mi9PeGJhM0xFK2MrcGc0VVlkS1RpWEVnSzFLbnZRTEtQOVl5OE5UK29XS2xWRjZoTHhZZWx1YUsxSE5XNkRUaHdKQkdhaXFuNFRXU29CdE9WYzVxWFZNMkFlRjRuS3kzQk5yTG1LZG1yS3BMaUJhSElVRDdKUzFUUTlGWnJFMXF3SFpDSmtrRHdMU2dJZDA5bXhjdDlKR2RPbDNJNVI3VUJSc08yTHRDK3R1dGpKNytnOW90M01FKzFEa3Bid0JIUlBraTQ0UVZPdFB5YmlreHhoVXZacndXWkhvVWNqeWpDZC9CWDNqRU1zYXpKYzEwWVR5QjluQmptN0tPZWRCeVh0c2pSUFlPRTFFdmZ1N25saTJVd2RhaUhNN0dCYmZ4THltd1NOdVdWS0dXZk0wcXo4MG9LLzFrMmdrNkpSdVdQYkJCSXVHUnNZUUhPNGdUU0pPL1kvMnRVQlQ3dDd2Tk9nbiswdjNkZG4yQmxmendLMUFEYVd4eWFRZWM3TXV0VW1pZjFORWlGci9rVk5CaURoZGZxUGwyZTE3NGRrZjAyRm9DV0pvbUJlL1UwRGN1OHByQmZxMVVzV0tGaWZiNXRRZERqdHdrNmZGdW13eHBjeE42czQ2THJmZ2RXaStFejdOOWhVVDMxcDFQQVJjWFhRUTFCZzVta0FsSVE4VVlreTNock1rZERpdGVObW96UVRtZDN3QnZNUmhOODI2dUk1bXM5SFZDbE14djNzTXZkSTYvc0QxY3BxVDlHTlhWTzYyT2FJdzY2aVJ0dThIK3JjdUtocG9yRVRyV0I2ZnBMRFBFQnJZakl2am1RYURGZjArbnArcmxodk9ZQ1BTeCsvQjlOMDdtY21UL09PT3orREJ0YVYzY1o2aTJTc1NRU3NTaWNvaWNtZzIxUHN1bUcvU3NQUG9xWVE2YXVyUFVMTCsvNEhsVjIxSUdUOHlrSzByWE4zRHBHUCsrR3A3OGF1UXpRN0tqNXBzeVFRM1BnT1o2bWgybno2d2lNV0F6UzdYTjU5Rk53aE1ZMzBnQXQ3c0JRRGk2bUJUdHlLejBOU2VacVp5YXBBZytmUVhoZys4cUJZaEJPME5qd3d5LzJCNUlpTkQ0UENlT3BybjZERkM1VzNOdGRhOEpUMkdoSU1UNndUZk9OTEFnbUQvMGxtTTFpblgxaWh6RENwR2hGMUJyT1F2MzQ2ZHJMNGQ1M2l2M3pTOWlEM21Hb0djOEJmR3ZuOHdpZ2JnWFAvT0RMa0htT290dWVZZ21PMWZsZXRVMzJxWGRhWlRsZHY0NDI5K2xLMFl4UFpJZ3UrQWQ3aFFZamo4MFpKeE9DMERDR2lXU1BVbGJtRklrUEowcytmd3hYZk96V3ZzVkkvTU9JaFFiWDFkT2d6L2NlbnM2dnhZbGpJVFdrNXk2VlpvanovZFM5NmlCOVZlUkMrb3VWcFR0M2JYdmdTUFNkY21Ib0JUZ283RnF0VURwTThTdWNoV1JQUCtld240RjdPdFkyRmxtdjNMMmN6TGUxcGdtbEViMXcySjlSQUwwWmdsckpvaGwvQWJxWCtIUkxlT09IUkZ5UVpQbVgyUFQvMExSRWxHeVhwZTFnaWhTTGk4blB5RUJpUk5uUkU1cXFSYjdwUmppTnQyd2E2aGFIdmVDVHV6VkNFaXhsQk5aUFRpaHM3VW1yTGxOdVc2aWZqWS9UMFY4LzVLbCt2RFhjeWxSN2NxSGVESHlDK3UvZW1jT2RER0Q5UENIUnZTTUZ3ejZJcmhBMW10WHhmaVc3UXJMY0RDeVZnWnJ3R0Z3QitPdENuKzlSajRSUkFiR3VydUlvZE5SOWMrc3UvMDRORmNDblBTOGNKaXJub1VtaExGVkd0cC84enplenZnOXlZZ1BrN1pjR2NXNW5WUDFCcE02b2ZBMVEySGkyY0ErYmV0WEpGRWVoN2ZId3dmdlYyclM0dDFwNzBEeGZFUUtFQWY1TnBqRWpSeGZ0d25mQWhUbEpEajlCamRDakFRUDVCV1BNZlVRUk14WWtNNlVXcmV6LzV3TXJ6dm9wTWJVeS9CVDhCaURJZWFoMU1XZTZGZjRwV0lOelU5aGtHRndkYmZMVnpzOE83ZjFua2RFSUZXZUZ6US9RclYrb3pNNkx3QlRIMjc2M0V2N3lmelNablNHaTFKYkIwT2xXWWVoTkJTVDJGOHZhVGxaNzNJVks2dEhEQ1hnajdzOG03UVJTNWhOUlFqY0VJRUh5M013ZzRVTjQ2c2ptdHZsNkYzbkZTNExGUmw0MjNmeUpOcHB1VGE5V1dTR2F3d0ZXQ2doMFJ0WVg0aWg0ZGZXUFpZeEVpaEpWTFpUSGQxWGJ3L1dWYy9XZTc3S0hyNno2K3RZTjllanY3TkJuOWVobjIyb24zYWR2dTBmSDc5SGhRbmp5QnpFYWMvRTlxZkFJRldpR3UxQ0RwNldreVdvRHlFRWlZNzRhVis1d1BZVm9lR2hWY05STUlKOStrWkxNdTQ2bCtEbnFnT085Qjk2Unh3Zng1UlVQRzVUbjNnb002Vng4YXF6SzRGVjdHSklsaEhPSDkrbWlTbEZBODFxNzl0SVhjVXM5Yk9scXdlWUV1R0owMkt6NVUwTTlRbXlvRDZDM3AxZGFIKzlQWXNUODhIZ3JnSTFvVGIvNmtJTk1MZzMxV3VMS0gvcHhmVlJ6YzdtRmdyYU9HM0lNNk9ScVhIMVJhdGlHZU5oK0ZYNWNhbElzdnJQQjdQNS92K0NTcHdDc011RjVsUkpLcVpkSXQwdHFzZHVKcHlOMDBFV2gyN3dwT3BEUDdWOWZYNlkrODI2VVZPY1BSdi9SQlRCZnYzWFQ2a3FGMlQ3ODVhempjYitlMUVMV2ZuVlZiYkNwQnJSYkJseXo2dFJibTVCaVNkYkhYZ3JPUW1kei9RbXJ2cVNGTGN5N2RZTkpSQ3FxWnBnQXkzNnMvbVBReFZIN05WVEJ0eVZIcDloeTdmMEh4ZCtMc2ZYeHE5S1AwcmR3RU9xVVR3YjNzSUhYdlBHQnNBbzI3aEFKWFZYR0ZiTmZqRzVEY0JwV051NDFZVy9wb21CWkQzdUY0UzVoeXNoWEN5bkhjK29sL3FoL3ZxNFYvMXpFdnV5UjUrc2JoUXliczRMZkl3V24zb1hESWMzUHVlbHZhQ2Y1a1lyMklkMVJiQU9zMmM5aEozSHNsNjArS3pZaVNDcVgzLzFwNHJGMmhVT1dNbXl0ZHpPNHdOZ2hrV1lsdFlDU0sxL29YOXgyS3ZMSmZOeVVGZjQ5dXhPOWl0ekFJTTR2ZzlBS3ovejlWemk4dFlCRnNiY0grUitRcHRCMlQzOC9OTWVhTHB0UG5uOFU3VVZnYWRmc056MnJpa09IT2ltZWFkNndpUm9KV2dIY3pPQ29tbC9DeTRaci9NTmdQR290MVpuSGJNWi82QjFEeE5ULzU2dWpoNjZHLzFnT0lrT0FVcGsvYTRvNUpDckpXNm9UWE53L1VwR1BaV0ZtRy96dVVXck9IUEEwczJVNkJDNE9rWlo5TFhqUEJic045S1ozNml6S1VBVXVhOUdESU9aeXN6eStYV2JJZCtrZmtWeDVLdk5lNjFBN1dtVWdJQVZwVUoxeElPc1M5aVUyeWRnQUdMeDNCcCtaMXlFNldsOVBlQ2QzdDRmSnJmVXhlNElKRzFJNHN0a0JVd2loZGZibk0wMyt3NmMrbTZaTFF4VEFhakYzQXZsSTZLdGNnR1RrclVYSXBXNkpKdXVrTHQxM2tZekE2L21IWUN1UGNaU2ZLcC96YW0vZDNsaUc2YVFkWFJUdUJjSjFQQTc2ZHpTaHdyeno4aTBmdEk0cjRDSkZBOXZGcHNWeWN0Ulh4ODNZalh2VlNiRnpQb2VTSFA0aUdZYnhuQVlXM0lQb3ptb3M4U2h6N3h2QXZTaXdVNjArYWl0WXp3MHVTV1Zaem15YWNhM3R0VlZLSkFsWXMxUjJEMUY1NnlHZ1AvVnJ2M3p0UGQzcjZSRWhNalNvZzZSbWFrTmZsTUpFbmw2ODlzZUMwbE5NcVFkRlZaNXlNdFc5TjlBTThmcWJJL0U2cm4yMGw3L21NaXFiZG9uMXpOK1o1WEh0blhmWnIrRDF2d2NWS3ROaUVsRjI2Z1c0RXovb0tTTVdjWGI2dlcrekp0aUpkZXdKVStnRHJybXRVYjYvSTNZQ0l0czEvbE9rTG1icWpiS1g0Ynd1MVdkMVlZb1hiMWV5M0poVDNOUUYzRm4zNW5rOVkvQnQ4Z3MwajdYVGIxZ3NHVStUT2dEK1ZWcGRCWlJSak1iN3BjT290S2dYdXFMenZZc0NIUkNPN21oc0o4YkZnd21TY1R4MGY1eHEyVEdYZStTTFhvbmZXdkxGOTRjMFhWaEpNUFhLdWZEaEZtWVFkbHU0WWJqYWpaMG1HTTJ0QlhGbU1VcGpLL1pQUS96MmVlZ3l0REFtd1NpSXpaY1FnYm16Mk9hTnJrem10QzB0ZlA2NFA1aTgrdHZtcmRyVVdiVmx3ZHhUMm9qL3E4YXk4YStKcjJsN0RuYmw2TnROUHV2WDFuS1JyNzR4bG1PeWdhVE8rWERMMHlHdVF2T280aTZhdHR2aE03QjdadmN4WEhzKzhWMk1QQ205S3NVRHZjamgyQUR3TG9LQTRYSkpsZWp4cGIvOU8vM1F1dmZTSzhraTRrVVplSGduVFNOTzlmejVocG4vMzAxU0JndzVGc2NNWmhuQkE3SzRTRENuQ2N4WGlNM09XbWJkWVJRWWR1YndCUStRVTVtTmM0UTlMNXZ6SmhBQ25sa055R2k5Q1cxcm9veFhtZS9WRXpFYWxmM3R4NnJpVjlHdy9iVWtoc1VLeDFEMnBNNTNwS1RKYVdzYWRicUhTVHhVc2R0UFBIQVpyUXpKckdNdjVrZEJVeGd1RlpZV0Y3V3NWaXVvaXc1U3duQW9sanRpL0xQRmxoYk1pd1ZxTXFtaG5aMXBzeXNUQUw1SjdvTk1JdlpsUnFULzIvVndreDAxR3loTGFBWUs2eFhsb1E5eHQ1MnRmYy95UWZyYnFkK1BOZHBGQlFOYlFvclA0VXltRVg4VndCWC82U0hVVC9lemhkQUZYQ0RZSEhNazVpY0ZYcjFCL21nZ3NtQzJlTjlVTEhXNFYyWHlFb0pRUmc5c1Fyb1RxcnE5TE0vV3IvVHMvUVR6VmdaTU9YYU4zSFhkcTZzcCs1VndCd0s4RHhLZ0YraHRBQWJyYzltOWxRQTNtbXdhbldMY1ovVzdsV0h1WkxiUkFlQlNGekdJSTBORWNhSVpWU3lCU3JZOGVLbUxkY2d4L0lwMUk1UStRb01LejcwRWM4UENWQ1FzVUhLUVh2UHVFSkNxeG04VGQ2RGFaUW82TnFObzNiSURlVlFtREJPOXJKQjBQWkFXV2ZTb21SZXVyanJ6dUx2ZjdOTm5vZWgwd21wQktFT0lXeUVQNzBNb3V2MVRpMDhOUk10Q2ZEQ2xpSWpDOUVhMWR5L2ZFZEJwQVhGQ0FxNnl5U0hTUUcwenRFd3NpZjZsdFJiNkgyKzRyWTdyUjhkT01EWWRsdFdDdWd4aHdGQVJLb211RlZzSVQyUW10aytmYWhpU05tZTl5S0NOeVhwdkUvUDZ4ZWVKRm5nU3FuVDhQd3B4eVNqTXorWU5kTFA5b09rM3ZHWkxzUjg3NEpaNEU4dzN2QW1pZTZsczFaL1FqY3NISnZIWlU4Tjg4ZEJBdSs1NnpRZ0hKcDhmT2Z3U0l4dkpGVEFhdkxLeHZHMkE1WEJJdlZsWUtIUlhINm9UYXhtZ1NXM2xOZUdHMmlaanJOM0R5NXlSNFd3UGJTYXJ0ZzBLam9ZZmF1RFVYQlZuVHJRNDdPUjB5ejRjMVh2MEVkcFVBa3phZE9Tc3NnT3ZacERwSXZ5Q3ZyN1hZeWJYTDV3eW42MXRxVitKamt6UmVHR3g4VS9LYWtHcWo1Wi9MdVk2SXpPTUNSbmlwSXdiU1drSXZPNnc0NExURDkxeHlRQnRIbGkzaXo0QUxSR1BhbXVzUWtxdHZTVkdaNjZwNUNxRTNtcERwb1d0YlNyZTB2eUFjVmhBbkt4T3FrdWxJSzJianBrakxYUFdlMUJrck5kVzVVMmFoODJYRWtaWjB3VTA4ZCtuZEt4aGM2U1lEenB0MTU0ZlFJRjBsUm1zRE9tZzF4bjVKMHVYRVliTmw0cHBHemtycUZ4OVNDTElDSUZ4SFFxdHFiekdwNGNmUktnOW1kMEVrRjVTVDVRK3Fld0IyN1JjZkpFWXVKckJZSVhObFNsd3VZemFneHYwVGxHUVlVTy9LSWVXc1dZRUxIMExha0EzRFRESjh4MDNpdnk1NEJRNTIzR0FUMndrWUVUMWhOVzdVU2RLT2NOckc5dWRxL0NvVjRNZEF5R2tRRmpsVW1wdUs4ZThwaEoybGtrNFkwNGg3dHN4OHJGYjVKOU1PU0RwZGF3WVZ0UGtKOWphQ1hDbUJMaEdKYll2NGFxVkRpVlNRR08rVDN2QUlVL0VxSWxEa1VrVzhkenM0T2xvbWh3cVZ3WUJJN29XWnhpYzBOcUgxSWMrckJEYm9yWnA5S0hZZHQrcjU5cWpwU2JvTnNET21RTzZRYzNYVXNwYXBYTWJHWHh3M2hzY0hTYzFDbmV5Rm5xekpKaXRwWkZReFFTNVFPdGg0YVU5QmE5cXRYM2t2UkVySEFhamRMSUV4emF2bTJJM2t2MDJTb1U4VTBLV1hBUkJWVWtKa0xrT2djelI1QjR5ams0SGZpN2RZY1djNUd5N0JDeHpJOXBjaDNUcExYUmRuVEVDUWphMG1lUnZjSFYzdVN5MDFsR2U5a1E3d0dGdDdyZjVpNHIzWldrS2NBOE1xMmZac3JnODRqYjBQWXhDdVh2aGx2Ky9wcUFiTzdNT3l5R21nSk5WYWppMkh0czR0OFBxb0Z3OHhNd1llRS84MHRrcmdQWTJndWdTemYrVVZxYVZlMzg0bVBPRFk0TE9PL1hwalNXWGF5MHNsK055WjV4M1oxVHdudU5pL3VOb1oxVkVpUVNyM3BzZCtSdDZmTjRFaXQwb3Jkc0E5UlpPbnpSUm4vTks1aEZ2ODFBZzBGN2J3ZnBuYUEwT1N1bTJuVy9PMmVyMGFMSDlpcmRzWGU1QU5lVmp4Q1llZzdyUE9MUm4yYStveDg2YmdRQ0dOVkZtRmxIbWxrNkcyUnhYYmU3eUFhNUd4eE1VK3lBUEJURmtEcEdyS3ZuanlRVy9vZVZTMHlZZUtlVHNubmRQc3ptUE5RamliNFJxbWlHbXZ0R3hLbW9DUmM4MTZpRnlJRVA5Q2ZUUTcwdjdJUEM2d1dnTk9LVG82a1gzTk92ZXpON0ZwdjhzTk1OR3JMZTAvZDR5bW83WjVjSy9QMlh5M1BIcFVqREp4NGZMdnU0S214bmNEeVdwL3pUTFhJRzF3ZnY5bXFMZ0JHYUJ2SVpxM29Jd0VMRjJZMDgyMkdjRmwwcDVzb1NvbElYcGFPUUlWSGRWcS9aKzNhbmdjTnprQW85bzBGVVRtRnp2WktidFU3bkZSbklSUWM3SUlLUWZ3S3oxL3psekNKbHhSSEVOS011Q1JmNjZyQWVpRzBYNmpXSG5kTVFzWEtFb1o2YkdpWGpsS3Z4OXdQSWk5eU1MNklNZ0ZGcDdDZHQwTjRiUi84NUg2dXdCME9wYzFZaS9PemZ3a05GRUN6QlpaaHJUNWFnaVJ3cUFkeTMzcUovdnFuNGtxaEJja3FHSU1KcDQwUGVIM1E1RUxjN3ZuK3BTTzQrd2RnWmE4U0F4ZHdqMnBaOHZTeUQ2bE0wUXZKNng1dFoxcGE0SCtlT0tTUUF3T3BnRHRhWld2WkVzQnYrTmlkRm5jOFFJQlZkcGtqVS9Md1BkMHBlQmkvRDJYeStrUHJqUEJpa2FBQm5LRzhKNHdMR21YWjdSTHpJL3MvVmgySkVwQmwxTnBzb3cvelIzTEpzWW8xRXgvNHBuc0hnSHVCSEp4YzVyZmNGdWhWaTZwZXFKTEtWMG1YZkdYRnZOTENSSERYRDVXM29XT1F2dys5YjFkMGdjNnova1NyZlV6dG5uSTNTV0ZnRFFyU0tzMVdGR1ViQ245NmVYQmlpS3pqTjhGdmFqbXgvcDAzNjZrY0lYczZ4a205Q3I0VklnQTdHTXNsK3NhVHo4L3kyWUhxNTRha0d1TllWakZlY2dUUE16WG10aXlkUm1QY3hZOWpiWmVORFFJTitjUkJRb1pqR09UZ2hZMDlSRGZ0elo3bklmbkU5UTZ5RzJ1TXRkU3FLNVZySEdMZk9PZDJpSFFIRGxLR3N2UnVuc1c4S3hZd2FiZjlSdVkxZE1FQWdXUmp5OFVheC9pV3ZFaU9waWtXRnIrTGZZZ1IwbXBXRFpocndTeU1EVlNWQ0w1NGpNSjVXTFVieXVOandublU2U0p2VGJjYUpVR21ReSthT05lbG9pcmkrUHVoaG1GTUFaU1VZaHE3L1o1alIxZDdUZ2hvdTRDbHhuTStRQUZ1Y2ZvMnBBRFlDVU4zSXhGZ0k4a1BDTVdacFNKYVRiSTQ5Z3pDTTJ1Q3p4cHBjcUxkVzkzOEFKNlNuWWR0UUFkUGVST1YzaUtBRFpKTTl6NmF2cGhJNUZCZlhFNFVpcDZuelVyMkpXaFp5cXEvUE8zNWFxclNob0MzUGVIQzJpZnVNQlFBU0pqdjRnVzhjRS9udnRVdGVRSjg4ek5IMGtNNllpeDhHdUZ3RXA5ZmdZRE9vK01RREJRVGFKSTlNei9XRnZmOFlGLzVHNEgvQnhqQmxFOUZGRXNQTHVodyswbUFLREJPV2ZqZFJPWVN4OEJLMzdRWDZJVCtCTEZJTnJCaDhrcHJBTktXTDBUMEJpWjRYcHRILzA0S1E4U0xiRXY3THJFZm0vWjVvaks3VE1wU3FKeG5xeWcvclkwRERhbjhBbXFZWTVqcmphcjRvWG5MWUZ5V2p3bkZORk5PTjFuOEpXQk00emk0L2ptTy9zZ2dKWmJmRlVSV3lOQXU1ZGExWEdPZ1NIV0pROWIxek5vR25TNlN3b3dOcVl3NC9Kc3Y4RmMrK3A4eHR4VitvSzVVd1VPWkFFa3ZCZ0tXallhTlBxckQ1Tzc2cnlCZ0c5aXFxT25HWTJwL3ErM1pEN1ovQi9ZbFY2VFY0dmtTN04yRTI3WndNQkF4cFZFZllMNy8wclBhbEdCRFd0Qk1YbFFJMWtuWHNvSEtFOGQycmg0U0N4RXI5MTJVT1V1bGRnbXNxVnh6R3JHOW4ranhGcER0c2JOSXNoQmEvalZhaTk2eG1nRWZ6QTRHMkk1OUZHRUl0N2pUTmZXOElaRWRydlhFenBEQ2FkQ0lMSzdERGFGb0pOdytVNlo4VjMvVk1rUklzUWZXcU9qR2I5U0J0L1BFcy9qQTYvVmhGM2xPQjlUbG5raGl0K0l4UXd6TitBOTkraHF6eHFPK01NOFhZU21VR1ljdDBCbGozcmRZTnNmRE01THp5cnFCeWlyU0hpSHl2U2FpamhQQjVWTVovS0cyeWVkR01OUExLbVk1UThVV29wdjZXZ1NFNm5VT1JJeFZMMDJPZUo5Q1RVcDVybWtwVWJVbHJ5elBrZlY1WnZTV25WOGh0MU1ERnFWR3lNU1R3WjNTWWY5YXdEWXBGVHpOOUlYMUhCUFJRM04xV3lXK0tNNlhsMDB5aWxNWGVCUUxDVU83RHdUc2NiNXNyM2xRYWtudXg3YUhkbEhWQVVxd0dYVVRLdXJuTGdVSk40aDlPSVdOcEVCYy9CVHVqS3FtUWpsMTl5R0hpZXl1eWdhYXJ1TDlJaUM5QUlOeXVRempDK0VESkJ6RVA0ODAzTzZ3WjMrUm0vbWY1V1crNWw2RWVvL0huY24xSG5hUzRQY2t0aTkwSjdyVGVSSldPbWxZVnNwdjhUVnlEMkRzai9IZ1crWkFhaFRGQVNLanBZS3NjQVBMd21BUmNMVWQvUExnR0FRRFl5YkVac1IxdDE5QnprTGJZV3pRUkEzNDUxaUoyWnE5TG9pZkRBdHFQazc0SzdCdGhDVDJyZzFMWS85Yzh0SjZaRmt5UnQwNWdmdFkxWU1KVks2Mjh4RUxxR2k1TWFYcHJnMVFGTHlSaWpSUnF2cEJtSk5GSkpEWEpmU2pmVHYrNmhzTGcvN0RZM3gzM1RxNFUvMXBMS2NpdEx5eWdlakh1THo5eTZ3YkdKNUkxMFk4REF6WDNtYzBXYStsLzdtNUtTaXZaZzI0eDEzQndRS0JIdFU5NnFoeDg5TjBSSjdScWkzT0g3MnVqc01qUXB5Qi91Q3dmVGk0TlNUNFdzS3NrVHI1TVhvZXZRcXM4NGdIdm9aUDdUVmdxN0EzVG1BVVdaSWVrVGNPWHpYdXEwb2NQaGs4Y3FsZWZRV1dkS01KZkZ3K1Y3bmxtVm1LbVI4aEExR2o5bWFSVFdPTkVyZyt1b0tONVRzUUR6WkdkSGg3cXIzNEFUenlBbzZtNHZieUdMTks4WGtFZkdKY09ScVNwZ1R4WHloTGxKQVNHZ2EzNzVLVFZEVnBWekQxUm9OazZEaGZwbFNtZlZob3M3aEJVYVQ1MjZEaW1odjNhLzVzRzBJUExNRDNTVTYzTzNFT0xEa1BrQWtoWk94VFFxQUt2bS9NVDA2ZzIzQTBnRTlpT1o1bzlMUkRrUmkrSkJIMzdhVmFoTFNBajdWVVA4NjNLaTJsVC9xbVE5bzF6K0JRRjZNWEg2em96QW1UU0QwYkJVYktoNWxEaThJR3dBd1RDUWluVm9ZOTlxOEdTcG5oUnI4QkFZaElwRkk2MjhrMHRGV28zMGREZVBFZjR0bERqelg1TVhHNyt4blJ6ZGRYU3hMd3JXRmErYlplZnozUEE4RzNJUFFMdDl5RXNNMjRkNktwdVk1WWFUSDBuU2JrZnVjZjdTeDBzMzBuKzlxK2hKK0ZqM2NWRDRWOWRGNDM5UW1wR3lXTVhrTi90YlY0ckdIelZpKzF2Q0NuK0h6dzcxbGM3ZUZFWTdSbDhMMVVZRDdmTVg4MGFlYUwyakl2L1pnaUNGMW5NRmMzRm9IbzlEQTFkOW9jY0txazdHZUtRbnhMMHgrSU5HandnUlgwSlA5R1IxbG1oaUV4RDhqdXZoREVtU3EyRFBlVXliMnkySXhpWWQxZWhIV0hCQlczWUpXQ0lwbXFNYXExQlFoQktBRmkwaFExY2YwSnRaRWp6amFyY0lwL0hYb0NaM3BVaGg4ejI1czhWVkNaT3N5RmpZemJycFpHMkdrb1Z4R1NuTVYvSXhIb1ZFV2xST2xHNll4VTArVy8zYTdyMFlpOHVtbGVJZXBITXR4VDA3b1RlS01GUEZsM0hSUWUyN2I1YmhYWElNN2I5ZkJWQXVYRGQ5WTdDVHlPV2hJYm5kSGtBU0FUOVBlRWU5aVZoYTl1MzFKOXFsU245Yit4MDlUNWk5a3JoOGluWWROdHFUcmQ5KzJ6MG9nNis3c204dTUvQmpLSTVob2hpeVhWMyttTFNuTWl4RmhmaE9abXBSaGVMVG1zeDl1U0RXV252QW56ZUtLR1BXeUJYb2tZVzd6ZU9CUjZneHZhcVN6akNpVC9VOUN6RTE0WjhrczZQWW5ocVVyQ1RhS0FtbEVlMEkvZ2o0cHUwY2d6dE9sZmRubGZ1WXlsWUJHaVlUK2dKc0ZQUWQ2ZUcwSGFYY1lyNVFlU0tjNGhoRmNEMzI0WXkrdDVoQjg4UVROREFSb1NNck5pUGJVRmpsclVPMllXTkpaYTJvR2FSczdYUVpQK0xkaDhmVVQ0cVNKQmVtR1lpVEdHck1vS2lUaXNheFJ3a0VyMmxaTlE0QXdrdFF6bXI0c1NhTWk2KzJZUXN1T21tY1EvdnlOQXlaOUxLQ1NjYXBUUkcwRzRiZGlobXF6N09vdm9xc0FGRFFJSTgzL0JwVHhsWWprRmNZZHhSWTBtdVI2NFMzQTZDandrRC8xeUU0Y21nZG5vNDV2dnR3Q2ROeC9OeG1jZmNWYmkvNTVCTVRzS3VLejExT1UrZ0RQL25yZWx2b0tMT0IzZGZxOWNSdFhSdXlVbmZpcEhNbVJQbi9KOVIvSlQvSDlhS3NuMzhWMmFzVmlaaEExS3VHNzg5N1I4bElhVGtLait4eGhrL0I3eTZ1dGFWS3EzNFA3ZnlidHFQWkhRbkVjUzFldnJkbXlUREp5Qmc1YXZ0dksvdjNHN3NSMUR5Um44VERTTTREUVIwdGpFbW5OWmxtVUFvSkNrbDBXd1h1azVzcnlBZ3Rxb1B2TFZTdkIwUFh0WVA0aHRmbUtSQWpjZU43T1NScXYzR0Uxa3VTdkN2TzJVdmQyWW0rZVBVQm9LY0Mva3psdlVNNHQreFd1NW5kVHIzWUZFb1NkeENjdFhZR1BMQUgvR3dZNFJ4U3QvUDhsb0UwRkJyZG5tOGlaZ1lzOTJLRGptbmd5SjNwd1RtR1pqaEhXVGVOWTNZNlhzaUhxMm4xSFZuN0RVdFRxQ3U0dDdlOXRXSGl2K0V4ZmVDZmtHRDFvZ1NTKzRiL25Lek9uVWtmNkorbkhGUENFT1V1OWxndWZzUjJNQjZvN1orUlZ4bjI3Wjc3cE9uQzVXdkJ1eWZNUFhNQlVSSnBPakg5cjZRR0VqaEhkTWg5OXNuSk1WdzRkc2ZQN3FybVFSRGVOQ1BVS3dNZkFRa1RJdFhveGR2MWt1TGJCVW1QalR6NTByQjFrYVJLRkR6R1Y5TE5sdjNRVzZNUE9GbnlKSkNGQkpVVDhTNE9rQlE4SGVjdkgycjB2YXpSclJKanBjcVZCRnZ5enFkRVRTVFVGZkRuWHorZWVIY3pSTzg0dmdTQVNTa2h4NDN5Tm84bDAyWXZzdkhjNFZjSzZERmE4dmNpVWVTUzcxa1dzR2tVYm5Vd3VnT1c4QzdpVXJOR2tiZldDK0RKdVJLY2QwQkZGVzVMblNzYmU1TERZOW5oclhtMlEwbHQ5WWgzaVpqbkUyVHRYU0p4S3BtQVAvVXZOcXNwSXErUmYwaFduTHBFZXVqczkyWStlVlFrNC90ZlY4WlprYzdESGdONTRYWkZDaXl4OGNUYlZib2p0UU9kRE5kZUVKeUhkM3hZa0laZmhCU0dVczgwYm1nWUV2NW9uL3pDc01WMnp2WUFWLzJlWkk2V2FmUkRoWEJrNWVjdlNBVVB6alhxRGRmMWJrWjRxblpaNUpWVGFIRGZEa0tOM3FWb3R5YnNIdFZIQXo5aUVvSUlCQUVaeEJtZmEzOFpLaWliL1Z3aTNJSjdpckxpWXV0bllNNnQrazBFU09CbWR4ZldPOW1DNHNVT0huK1FmTnlvTXRIeTBaYW02NkFOR3NsU1JoNGsrbzkyWjF1WUxwM0U0UjVRK3ZtbWtjYjhvb08vS1NaaWVTZUZIYXZ6UmVHa3h1K2hwNm5LZ0hCZnc2T0ljVkJvM0ZSUzdYSmlGQVY3dTR1WURWY2VSYzVsb1Z0c0lBRDNIalBJd3p5QVcwMjVBemhWSXlOUlRPamJxQ3VsTWZkOWRSR1I4TDd6NXpLSVdtYVhlZlNjTjNlWEpBZ1JmWnR6MmcwTTVaQVBZVllEYTBPVDEwK09HK0pPZHRsWDNjMFVvNVBGUkNhcytOTTYzUTVubzFFS3JLRlcvN0FyUWRSRW9zUGRrVjQwK21XZkRFZytWUnlxSzVSV3NMalZIWm9OTmJ4dEFOR2RDSzJ3MVR5YXcwMTF4eWhFc2o5SHZRaE8zYTRWNEdiMkZoaHYybkhCd0FiVmRVV1cyNWhNS2kzUXdRdFpUNFVZWG1aYlhWN2tJN0VkRnIvM3V4YnExZ1BvV3J3S095eTBEVUh5djUyeVhHdzRlc0dqQ2RBY2ZuM1kwTVgyTHoxaklzUlJZZ21SRlVHSXdUa2Yrd1lsamRFeDBqSlIwUStVV092Nkp6bGFxdEZyeG9xOEVJZE1lT29neWpCdmphckhOYWtkQnZtUUZwY2xRdjM1ZTI4OE42anV3WitEalNOeWFid2tqcncyVlNRN3lod3ppL3FtSjh0dkMvem4yY0Z2a29WU2huY0pZUkJlczNnNnB2NndUSnNZY25BTGYyNFkvN0FjSHNmMUFrcEM4c3VxRG5hbC9oeEFJR1hXTWNUMnFpZUdmNm4ybnd6MG1hd283OXNUSDRyUjFKaVdBblpWVyt2Q0pxcDIwYy9Fc25Hd2hlSWZJRUJqNjN0U1dQWWNsTE5RSEZpM213RFZMSWlYWVdXSTVJQU1aRHVVNmpTaURtQUwzTTFmeWh3R0QxMzhQZktoOUw5R2xmSlZlV3pzbGxWS0c0MUpUWktCb0d6UnpCV2t6NTVUcnZFcUNURzFVR3pvY1hKV1VteDg2MGlXVE1tZjR2Wjd4VHBrZFdpT25DOWU3Rm9uYkVFTTZDSDV2THZSV1lpdFcwWWRRdG1NM3hvZEpnUlY5QU5vbzN6azEvMHlzUlFTVGtvMHFEWWZuUTNIS1NvekIwQUtXTVQ3SU5wUW1OZytqbUw1Z0R3c1J4cGxvdkRjYzFxcjVJdSt1QWFTdTh3VktHYTlpOTZhZGNsellpN2ZibzJhbzFwd0pDK3V2UXFyNnRUcExNdS9hcEp0VmpDOTljRjAzckl1Umd3VmMvemhjK0hFcHlqZUtMME5wbEVVbkJud0NPbkRZMUVGVWVlNk5YamtIb1FsN0FLT1oyT1ZqVkd5TlpwOHJxVG9Cb3J0b2tobmgyZDF2M1g4OUNyR1J2TXdsUkVDTWxqeTR0Skh6V25jN0pkYWVxaHJqOE9oQUduRVJYLzhGc0Q5YWZXRjdHSDV4M3hMSkZTUHdlU2NVYTVPdFBWY1B2WDdoN1NGZG5QTGpUMnNpRURMa2ZzaXlvZVZsQWJEdFdEcS80VnVES0RZNWVHSmsxQ1NRcDUyRXRSeDcrM3VaZHF5ak9yQ1dzZzVYMXFEb3hTUE9vK2tkYTRxZHVnZlFUcWZtWWErQ3U0TUxpL013LzBPYkZvWTFpN0NwU1IwSWVXcEFvWldUUDAxK1dJQzVNSHN6ZHBnNGRsOU9nbHNkWWsyemlRTTVqc1FSY2c1dk5NOFZGUW9FMFBMMWNSeU9IQ1NlTThzT2g1UEx1d0wxTzkwMFhGNi9LdjFNMDM0RTdIZ0hQZWdpSmdLMHMzTFo2bVE0bU05a0lhTWloK0lWZWs5RUo0L3gzaGoyWnp1U0E1Y2w4M1JwQ3F0SXpnK281T1FnUVpORFNRVFBUeVZDS0UwVnA1ckt2UFhtTENYajBpbFFhWklBcVhXY2c5YldhclExVk9XUDBpRnZqTkZqeUJVQm5penVnTVhWMUIxbmtHOWhhUWg0enhXMlVOU1did2p4cXIvUnVyMlBTd3QvcWlycXlXZTNxbTM2VGJVTjhYZUl0MUUrWFRHc3NmZ2laZm9FT3BydFo3dlZsTG45dVJiTGNuNklWT2dLc1BSSGNicGMvejRGcG9sVUlsNURGaXVsVXFWSkFLNkw2K0sweVBIUzZxbkNrcWRQZ0ZON2VJSDdaUmdWaDljcmZlczBBTUNPOGJsZ0FwbEV6SkVXNXgwbXlMbFQ4c3ZXNW5VYVVsM1NFVU5iZytndmN5ZTNXSEQrcGtReHRJOS9HQVdRYk16a1pWeStCTis1UkNtRld3QjBNRDZEdHNZVHRXVVN1UjNFMmJvSCs3blkyY1RsZlNYTUFZVE5OWjFIVEZIRmNwbkJsSHo4K09CNkl2amhDcERPUlhDUHpoNVZoUEtmQytEa0NVcFVtY2sycWRlVjNrR3lGaVR5dmhNbjFmdVd3cDNEVW4yZXlDZll2MDVTYUhSRXk5MmpNWVc0Ylo5MDZjWlFHVkFCMU1sNGErZGdEMTFXWThUWElaUkhEaHl5OFhSdUJhUDNzY2hSL3hxR3hEbFZWbHlIbmhsdnRJd0h3aUpNZ0MwZVVudy9ZbStFdVpSbUZvNGFiUGdkVEswR1QycXlodmlHT3RxbHF2NlJCRUE1dnJDYkRBbFBHNkxpWHNhUmQwQWlqMmt5VUM5UjI3YkVsZCtweHFVVUd5NlZUSEVzeE85QzU0blhtSHM5Z0xKbkxINWpIdTZ6a0NRVnppcGF5NVpzbHVTbWR6K0xWdnJQemUwOFp6Rmw1UWZEZ0xQVHdtMWFWQTVhWkdVQnJBMzVkaG9UZUtxZlpraU14elBaa1FXQ0piSFdIQ09ZNGF3NmJNdC90UUdSOWxnVUhVVThVbUt2aTlUYkVobEY3WTY0K0J6ZGFkV3M1ZVFJTlNxMFRyNC9GWkt6bzhVb1Qydk5oYUdhV3J2bGpmQ2NjZVR4MXZIVkw4NER6ZE8zc0poRnp5c0ZuY0V0SHo0cmY3RVNaUThyWGZIVUJyWmcxcjcybDJ4VU1QUTJsWkJTU0lWVTg2ZG9DNUpFYVNNeXNrSi9BK3B5VUlHQW9FYks2M0lHTHlpUlFvS3crUzFhZzA2K3Y1V2VJbUNlTzZPdlFvMFpwbHpRMFlUdVhqN29NQUxyaGRxV1NQRXI2bUg1WlVuZWszYWJMWXN2S3BleDMrcTExTHJHSjBSQWltQkRJZEVEdHprWGJnUEY0bktOazlnQXhGcXlqa0hsc0w2YkpNbUpudXpMY29BN3hOQVppUjRra2VpdjkvRkpZNG9HUG1acGtZaW1jSld4cmpIQmxhTXQ0TkxaQU10NEI2N0l2bnJ3bWM3akRqcFhHbzQwWnZ5eHVZTUV4ZHQralBqcFhpbWUydGE4YkNTaTFvUHpsZlloZmFHbjR5TkFwUENVc1NnMkxZaldHblUza0V1cS9TUURobWVDQWxlNHZiT24rY0RVU1lJdFVnSmVNamxrMm1YcmF3WDd1Y1VUYlBzOUlrbU9YZGVUWFNGU21EZ0REMnFoTmdGUFFlNldYUTZaYjJwYTlJdzVpQ0g2V2grMDhNVW0yb3RmSVlidVpGUHVzZkdTMzg4UVhOUTJGL3JCdlM3Sm4zYk1uUlprVWFFc01PL1VFMWRqbHNFMmFnaXJ0dDJaSXZBeHJkakpOMlYza3BML05Bb3NDOG1zdDVxUmtCaHdVN0xXWU9EQzh3aStMNm1uUThpOG50c2RpY21Ya2NVTWI0TUR4SjFQMGtVRGdUVGFWeldsR1NzYk9YenBNbWJ4SVhlZjNyVjI4dHprU28xTUVLY0ZqN25BNXQvWjhvK2tWRFV0L2ZqRTVjNjNhUi9RZWNva0IzVkFWeUdpWndKTGFCVjdhTngrYjZ5bmVtL2NjK05IMG1wejExQThGbUcrRld2VUhQdktFdSt5a0RlcEZtM3ZrSE16OS9UR2dNcVlwNWgzV21wUGF6MzdqV281RFkzbUZUckM3SzU5QnJHYm4yWnBaTi9kLzBnMGR3UmgvMkp5R0Z2K3JjZldEOTVCd0J4NFlnN0hma0dXZHo4bUZVdDZ2K25tWUJoZVRyY3VKZVI4dVh6NTJQVWh2YVlOSi9BekU4cUdWeThoK2lWY0ZTc0hReE9Zb040VzlpT09mdkIxdmR1RWg3MnJoK3o0d3BEN2xleWl6RWVWS3JKMnRYdXA1aktvUnRZMzEzVndpaWZ1WEsyL2hYNnBsTjBKM2tuUm1Ic3AxRmpKZGoraURKTlQ5K0lORHN4ZjJpdjdoN1JJUGYxdWFBMWl5SFo1OGkxSmdSamQwWm1vRUI1L0RkaGtVSjU0dGJCejlDS3E2Uis0QytoNzgrdmlRcDhta1NnVU1zdWlVVnVqU3NpeGR6UkIzVXE2WlVUT1NmTmtaZElUWUFvNlZDWDFTeDg3aGxNdURJWWcvVVpqYWI5RGFGa1pIeVNsMzMwN2RXeTVPSWdMdmI1cm1pWWs4cTF3d0N0SWRGY1dza0VpNE1DT2dCam5mZFhwOXFvTjBvSktQQlVETHJrYjZ1bFVidm9xVXlNWmRnZVRhYUpMbXhiMllFNFZnMTdvYzVuZE54LzBpV0l2MS9RMElVa3UrZGtGRUh0b0c0YkpxWVhKNG95SjR2SnMrOUkwQm42SDlLdEpGSGFHWVdOZFRsdDRMcG1UcWs4RzhtS1BsaERUeE91cmkxcHNrZzZ6SjhDZVdFNmNjMVFWMlRTODBsMHBUWXNEVlU3U0t4MUdPb0dqdE1WYldiZ0RSWmd6Q1VOMkdja3lnZzFIZGUrb3MrNXJrOUN1dVJqU1BVMFYrbkZ0UG5wQ2MyeGRDVis3NEhOZHlpdnJTektDSTVqeDNPQ1E5dnpsSjVQOFBTWTlibk8zWUtPdFlNbGRMTmpUaUxHU0ljWElKckNZL0Z3T3B6VlRWeFFTbjBybllkYUExNkMvOXlYVXYvOEdoZmtMbVZmOVpITWF3WEVYeTNFTWdKUEsxUnhJYThLeUdIdzJwenI1c0ZwUzFDNm9hM3BnQ1F6WVcxbE5lNXJLWWhLSnBSdVk3TVA4OVV3WEFBK25TNWF2ZEFZTkREK2x6RkFIb2lOV0g1aDNrNnpaK29NVWZsenlTYk93UkNOUkRKVzVrNnp5V0pUU0RVK0NHQ3hBa3ZpMjJnZjFSc0NmbEM4cWVoWHV5MEpqZGRhRjRrYktoRzhxdnEvZ09HYXhJUUpYbnJ1QTNSVXNZU05sM09XWktRVzEycHkwbDNMNmdmdjZQbDNHWUp6ZUNMVSt4bkh1RlNIaU9LNThFVmJoMlJXNXhhdzgxVXgyUXM4N2ozQTc5VDdDb09vUDkvNWZUZmgzUTluVzRvNmtMeG13L1ovYnRuTlBPYTZkOG14RUN2YnVhVWIwWWw1SEJUYkw2RWF5akJLd2JkQnlFaGNRL0hWZ0YvQ1NSb2NGZnpKTStHUVJKcnp2T3ZXaHpWak0rYzdIV1lZb2l3ZmZxbHJJS2c2aituL05weWVhbEZSZTFLeWQ5Zk9hbmlqSjhvZDdNRzZYVm9CR1RDbnQvYTVNaU00NmE3M0tqTlN5L1VOT0hRaDltWWlDUFVPZXI2UjVieXZQYncwUXJRUzRSR2wxOXNQd0EvWlR4U0puMGcydW8zY1ZuVkV4VUxPNHJiK0s4a1pOViszaGJkbG1jYVJuajlEcU1xeFovRUN5N0NsOG9OQitSQUpkOU0zM0ZOMGxTMGN3K1piRUIySzRENzJqbDZESlo1UjdTWlNzZU13YUhsbG51cTRQQWZTclEwclRGTTd5SW00VkZWcW9wMjZGZGh6Q0dzMmp4YkNsN1hoOWIzN0ZSY2VmTWY4YVdRVHlNTU1aVzVCOU54NGF3bFZKTGJkVllIUFhmYUdQL2VjMXVjTloyazl1RHlrUzN0cU9TOWdVaEl2MTM5UlVQaEovQ0NHZ2J4V25lYlZwVzZjL2htNlNVS2RkTEszdnBhQThjNUJMU2wrREEyOExHNHNldzVtOHRSVFExczRMNVlWWlRYd2hqK0NXK25yUnMvaENrWnMrN3hISkNWeVBYY3VTTGZwdHBNSUtDNHVGMVJQVzA5eEJxZ0xtQUZ3aDA2bkR4ZVhrcmFwZUhzMVFiRk5IQTd0WXV6L1pxN3pwUWc3N3ZYMjZMaURLYi9SUjN6UEJyd0pVV0ZEb3E5S3BURlZFQWd3WjhFUkgzSjMxd1ZFZ2l2YlRwV3ExZWtHeUtNOS9zTlJGL3l2c1JXR3ZIdkUvalozczM0N0ttRUR4RWVUTVFZUzZMRzhXWkRrdGRPQVRHWEovRTNxUWhXQWlENTJVc215eEtDSVhTOFhPdEVrWWp0S3R0RWhkYWU2cmVuaXNxbi9pMC9LZTNQeG9ZK1YvcWVsL1hrOW9qMmFKdDBnN3JEblloN2kzWVZobE10UHUycjlOUFR2Qmg2VWoyN2ZYa0FjODdmZzNzSzZwWjZpN1RreUl5SWgvY3ZPNVFNSENOZmVWWHI0d1JaS0sxNTk5aXF2K1NZMDNWSkRpdEg5Ui9PWW1JNlMweUtQZlJpSXZTVDVJN2lvTEZOTnZFLzJaaU4zWDZ4MUtiblkxN3BOemV1R2NUb2dLeTRFdGIzNm1KTXNZeHZqY0FFNmlIaHN5Z3BWclVkVnlxWkUzOS93MEdiSWZ3bkxIQ2dzbUZCbE14VGtEUzRkaGEzM0NDbUtNcDB1em1xZGxBdkVqeWdNcGRMYkxsVFZTNTFrVXNoczRpWWozREdtTThnaHc5NXNSdWJFa3ZETXdPQjVFYzB5blJ1Skl0dm05UzVPODBXclVTTmJHSTBVRFZ5SlNORS9GWlJKMnJXcWFDUmJ5OW00a1FjRUNTL3l4UUQxTithaXZFR1BuNTJzK1dhdnFXdHI1TDJYMnFQN0xQS0VJb21TOVYxdW91ZDZGT3lHa01HY0hiZk5WcHJaTDk3RGVvMVJ0R3NrYWFSSzFoenQ3MC8wNXRVM2dFTXltRjVXQXlzdGtmM09HZ0ZGcUtKek1CMHB5eWRQQVZsR0M4dzJoYnJiRTlVSGxjM1dCV2lXMnUwblJzY3l1bzcrVytWR2ZHd28xUmlPUGJ4bzBQMG1oUm9oU29PNlpvbzJRUTZvUnRPRmFLMzJqMnZhV0Z5eEhBallCeFJXa003YndjcEJpbjdiZHk3aTRxUXZTZVJUZUowSjdIOEoyWVBXdEFhVHBFVEE5RlY5blVxbVp1UW51M004bDdIR3ZKV3N3WGdJbWFnZjRTWUdRNXI2SXVXUE0xTkNjTk9DSmJRRFR2OGdUNTNWRTNRSVdHRGZ0VlVhRnNjaTBwa29LSXE5N2JlVXBZeHhHK1RjZjc1azBFUENQbi92My9YeVh1SG1ENlYwOGsyZG1aWDRhbW9UL0dyWGJnd2hBVUh5elUwbEtkbi9HcGZMUFczcHhDb29yenlSUVFKdUxUQ2dSWWRlYmhBY3RaMHUzV0sweUJETE1EMm92aVhWb2xHYlFGZ0FvM3dseUVtaWJjakpxQTl3cmJReWVRa2ptVXk1VFh1T2RxaklSV3hGSDFraS8rZmNxZ0tPaFllZFdVRFNKanFxVDYxTnhmWldsNURqUXlhOGlOMGZWVnl1cldCRmp0cGV5MGw3dHIycnhVQXgxRGlaNjIwUEtDOHRnNjFCVG1Cd0R5YWhFT2h3UDR6Y0tkVGRoVDlGQVNla2dDMEorcUlwMnpLeTZ1bGd3bHpCVzBSMVdTcmZQNFNmc0J2ZGt2Z09YVUd3SEo5MUMwd2dpRldrZW5Fd1pobFcySVB2Z3RjRGY0Y3MrSnBSSjJXQzVGQ2NyRjZVUUYyMVFEbWFhciszaktkMmlVWnZjc0Z4L2c5UDFSRHNVU3E2ZTYwZlphMHFSOGdqTmhZTm1CQTlCNUhLMG9YdU5tM1h5dTNaNE1qc1BucTFKT1pwR2czUVZWSnpYTnBSRzBaYU5BUEZJMUNmdTNNQ0Z4TVdTVGFQSS9FK3JFZ211WHNmU0pzek9HbEdIelBqR3pGU1FEdCtzbHMxNU9PR1hvZG1xcy9VSEo3ZE1CU2dKZFgyZW1MbWJSNG9KTjBHT3IzeG9zdVBvZE56bUt1eFBoV2FxNDc3MUZsSGcrbHRQU0RVL3RETTBTcHBrSEh1UG91NkZNZFFYNW40U0RQVVpaV2VIWHN6bGx6QWNrM0YwY2I1ajhHak83WmZGL3ExL01oNytBcHNvNnlJNXArVkFqUEFURjJESmNkYjV0Kzd5N1NQTk80U0pDUG5DQmcxNFRrUVhVVE5Lcnk3THhNQ1RiZUY5SFY1OThVNDJ0OGRraU1keHJncXl3UmZ5U01zdWpFZ0dOWm9yWjRUQ2V5Y0ZBKzZkNVF4WHpiOHliU3UyY01CekFXRUlPTUsvNC83a2FXeHBoNTk4eGY5MmpjK2FsQnBnbDhTaXFqS0JxZXdxd0VaRS9ucThucmh5QllSaGRJUnFrZTFOOVI1bDc3NGY5S01YZjBaam0xNEZDdkVQTmFqU0NPaDhnL2ZjbHFhZHFKY1dJb3Zya1VKN1hMQjQ2d0IzcVIreXNPK1k0M21lMjJGNDRHd2FoQnZTYWppWlBEWE93ZGl4N3MyN085RlovMzNEcng2S0ZsZUIxcWhPMUVXNThzSXc3NFB1RVd4NTFuZ2ZYeUNHQ1NIU0duNlVhWHduOGdabGNOc2xjQUdHZW5hQUpvSHg1OWtMeG5jNDdaUnVNQTRJTitVeUVjMXlUN1FPY3hxKzZOSXNmblRzLzFXTEswWUpIYVdzUzdheFBVRndYVCs2MCtwMGJDWlVJYUJBV2h5RVRjTWthQkNDMStHK3dvTHRJSXRJZmtSK2M0bmRyeEc5WUJ6SFpIQTFJWitxMmRhdDFGa1dHOFdrMXR2bTRMV09PY21XZWloS1d2MW94N1pRaHFnWTUwN21uY1JrNEo4NGd2RkViTEhoZFFFbVNYNlA1RmZjVU9JeEVDYllWNFh3dVJPVG5zMDdwdFZ4SXI3UkpQcTRrUTB3OG1OekZ4b1BTOGZlKzVabUhaamhIdkVxYk9XN3VTdG0vQmdGVFRSUXgvN3NkWEJUWWdlclpFVzRRejhLdWZLV0tmRnlUR1h1cU5pT0UwN2hJYUhNWXhvelJsR2lvZEpnVS94ZjUraHpVcGV5eE1BRkEraFZKUTU3ak5LdE5VZ1NJemduV0xPaFNLRVBic2F0YTBoUDBQYktKeXRmWU5GMHBocWx4d0owaThnb1lmR3BnNlRzeGRHR0t2WVBJMVhtTXkwYkRjQTVuTkxMeEQxc0VHbENMNDZ0SWZWajh2MkpNWkwyc0F3VklRUXprWEkxTDBsaHdyTlppeVdHNVBGWU5jVnJtN1h4aXhBWnVha1kwMUpQYjhLMmZLWnlrUnNQU05icTNDK0FIdVpJWElENXkycUpySnVkcVdqQWVYekZnRUtrZnA4Yy9uOUJ2VWxJKzBEVWxqM0FiYm5ROHpJdU9SMzRhK2Foam1QTVZTdXhIMEdMeXRjUkNodkErNkJKR05HV29WNFVtTVNqUTdZcWNlbkJKWFZUdTQ2T0ZrYlJaOTIrMEhSY1RjZSthS0VBSkkwSy9ycDFXczNvWCtpRTdKdm1ZTEZIRVRyQ2NTNGM2M3JkUXlUaHV0V3FEWGsvNFBnT05iSW1NWkRvL3ErM0JoK2RZb3czaU5PZFM5NXQ4V05IOWtXVlBtSytyR0xBVVUzZnNUR050OHgwOXM2ZURpNzQ4Mjc1RWN1ZzBKaTJXa2ZtMHdvdy9zNW4zOHd3eitvQ0tmRzBWc1ErOGp2VnNYQ2JiNll5aXhGK0UyaG9BZ005NUNoWk5FSU9mcnBrY2t1aFpTYThZTU1NMTd0aWlGVHJYQVJYMjFSb3g4aUNqSTFUaU5xaHYySEVRelpqY05jWEV3MEcvaHFmS2FsTGJxU0ZCY0NBakhocW1IUTFmclRVZkMwNExFbjNLZlRjdjRobUFuTzBLT0dMaWlqdjhNQWJISlMwK1loU1REM05KWllOc1dhTjBmTVJtZUIyQWU4NlFPc2hITFVDTldzN000eUdzUDl4MlptQmVxeGxoaWMvSk83V2liS2Y4TjhmYTN6dkZqQm9JNEZuUTl5QytLSHhCNTQzNndpNS9EcTlFbkM4M2ZwU0FBMndET0R1RUxZTDR1a1RsNGkvWUcyWXl1eU02aDB1cllTVUtGcDV4djJSRXFCWFp1ZmtIZFhGMytWejY0anZhUHdtekhoczlRZURoSWl4b21idHpQZTI2NUp2SGVWcmFTNFk5cUZVQndDbGtqNU9FbWxhek5yKzhUa1lPczFKUTJYTnZxNzg2MUt6T3Y5R1ByeGQwWEt5R1JvdTJ4K2l3NzJYcTBzUmhhY2RtaEhpbWNoQXhDTjc5Rmo3dHdmNWt4OGxKUkJKeDFZbU5vbHV0ckcrY0EvcVlPT1BwbDJVaFdiWnIzZUh3SW1qbVJHejdQeXFibkZCVUVCcE45UXptWVh3U3Q2WFhZQkx2TGJsVmZ5U3EzdnVuNmJqdkJyVUxONVMvT2N5Wk9NTlp2ZTMvMC9lZ3JLN0pVYVZmcHZHWlRqcEhOMFc0NWpmVzdoVEpCbmt1Mk5YRzhlRGxvSlBHVVdmS2dxWitpV0xQVi9YKytEcnJJSytVTDRUQ3c2c1NJNXV5cDBSY0JXWVdjQUlJREFwTHFkeUdET20wcFR3bWd0bmZnYlpZaUJ3T0lTUmNjTlRGVGVEM0t3bDNXOWRYTCt3UFNaOUdrU0FvWUJNQ1lpTlRGWVdVdFFtZVVIYXEwNzdSbkJCeU56endXTWNic0QwSnZMREt5c2FSR2IzNXRCUXpFQ2FMZG45bkR4U3MwZ3NXc1VTWDhLUUFYbGE5c1ZEb0x0QXp3VllWcDgwb3UrdTFObHc5Vk9Hc2ZvQ09Zb3c1azNHbkVtRVU0Tk11RjJVV09YK05mOTVYcUUxRmlVRTZBZTMreHBVU0FWbjJCRHAxRUdJV09XaS9QTjNhcmNsY1JZUkdZZkYrUzBiQ2c0N2tncWs3enpvM0hPL2ZNNjlEbXZ3WEZhMmlKNTNrcTFwUU5LYmlVdCtpbFV2ZXFPK1JHZ3RGM2xKK0V5S1FZMG1qKzRZRHRDWWo0empGMGwrNHFNZHgxVVVieVR3SE5SaEhSeThnd2xqNXJ1RGRKNkcvc0thMTY1Zk1ZbW1NTXhNR0xJTVRleGsvaC8rV2ZhdHJMV3Zrc1lQWVN4bytPclZMdGQzVFBwcEJHd0hFb1J6ME4rRXpNWmtDZkdmV2NRKzdlWis5ZFJLeFAza0ZkZDlxbGNaRlZHbDVFNFIvVThFZzQxMEFoSlNLVCtZSWpQWFFYN0liV2FMcmdPRVZoNzlOYmd1MWsyNEkrMWNVemFsL1F4SXVMQmd3czU0YVNJN3ltc2pkVTdxcUVjalVMMmM0aDUwWlZreDBOdGtIVURTVVltMkZjcFJZM2pjSEx6bk5QTHFvY0pQbWV3NkQ5blRnWGs4NG9ReXR5SDhFcCtHNVZ1b25hZStnVTB5ZjRzSDI2bk9hN1RhVlZKZlpjcmFsODE5MkpaOWxMVndkRjlHNVlhZUM4WVBubjFCM3V0QWZuK0M5WmY0Mnh5dVF2VFc3RTZiSTBYSGRvQ3JBWlJRTDd2aUdsYXdIMnU4T00vbXVwa3owV3pXQWw2clVrZWhwczAxZGJmVVdybnJWTHRNVTFIWWlGRWJHUDFNejhXMDBwQUxUZlhtSDZzakljRlJzaVJLM3FVRmxONGlpUUlrVktvUk5WcXVEbXpQNzl5N1d0L2llK015WWttWEpsdUg0Z3FOK2ZNR2lLdDI5WjJQVG04K0lRQnBRd2k1bk9JZXV1blE0dDJoaHN0YUwrcUduc1NEMjdGVmtMTTY2YmkvMzgreWFLOTRaMmhUUStaRWhuazFld1A0WTNrYzFJUUJVbXNZSXZvUzJ5UzZUWU42bkFJWmloL3FUb0l1ekF0OGpFVE0xY3QrM2hEWm5KU1ZUanhySnI4dFVranNaUzkzTzlFL0xYMmViTm5oeXdXMVVKdHhTYnhFNUFrQVhMQ0VYVkgzbU5KYnp4K2VmTkxYWi9YNXMxVjdpTWhlQUlVamp2YXlOT21nckt0aHpEU0xYdTlVTUhQRDlOcUNlVUpJYy9FVm5qR05QeTBrOWlxZXc5cDRwVFVhU1dHcTdaK0FtQlZhMnFkM2dwZTNrMU9PRXI5TEw3TlNkNGExemNXMC8wdmdEZ0JhLzFGdU9EK21JMmY1MFdLWWdtZ2F6L3ltNG1KTVVxNDVMMnQ5dCtQS1ZhQ0Y1UXBWeFBlV2J3elB6YS9ibzVGU0xuYkhqU0FMUDl3U1g4OGg1WmNERTRaSG5jRUE5bmRxSTdWemNNM2ExcTA5UHBORmVvQjludUlaUGV1Z25IeVVWT0M3MnBiR3pzYVI0TjRBeUhjZGxUYk5ZRzIrZWxtWUNKcW81YlltYW9wT3RDb2tPYzg3MU5va2RwcWp1ZzZDY2g2dzhEZEVjN3FjV0Z6M3ZCNkxIMDNpbEdnSHI4Z3RpazR4Mk1PZ0Z5L3ozYi85dndEdjNlZGxremR5NE1oWWdGazlZcGZTQ21YSzdFY0szTmZ0bFBYRzg1YWZNT25BUDc3UGZXdVBXRlpqM055VVFuK1UrTVVnWElKb1U3OVVWMkdQYzRiTWNxaTdKWk90QmdQbXJ5SCtJUDJCL3ZERVpvNkJCNk8rYjBtUzQxdHVWOGluYURwRmY4bjh5OVovTFpBSWtWN2tNc3pJN1AzbFhvUG5wVFRmK0NVaUxMNld5d1N1TmN6VUxYdlZIV0NYb2J4SU9wdEtXTkgxZXlCZ0hNd2VCTTlhWnl3RGp5aHp0YWJuZlIreHgvSExuVkd4cnhTSVdQYTFjZ1RpWHFPZDhyOUNkUnJFaGdrKytxZVlnVitkQzVveDdkaXBKVFNKQXlBSWsrUXloMVo1QURuSklubDY0QjREVUtKSFVHL2loODNPTFkvbk8yVTI1YUhXZzBiMCtOTDREb0VKMjRNd0o1Q0JQd2g4bEQvUXVQelA0TG1QdEJwRWVJenFoZWpUdDFBamZLRmpvQ1JkbWhpQzNINCtBbE1RMkhkUVZyVEJqREJGcmQvWFd2czZHL2J3V1B6aWVOeGpOWktwS1ZkZUpKQUVWL25hNHBYNXlEK0dzRHp3RG1QK1VmWlRDb0tkZlJhN0R3V25FNDdSbXdiejdmUFl6aGZYU05vTndRd0RVN0NrRDZiNjh2OHJpYUE3cEdSUWYwTFFsOTlpRWVKUzRENk5Eb1d4QUJQQ3lrdEtNMlozeW1od3NWYURlWWt2d1pMeHNMeXdBQkYvKzJuK3Z0VnFRYXVuNEl1MUtHSGVmR2xnT1BSRlZ1bS80QVFzL2FwT0FnMFZMZFhacDJydzR4SE1teDlNeXZTWEhtMURRWXg4WWcrRnVQOE1lNFloTTR5SzlicGFUTWZwV3MzNjBVdHVscHhIT2dTL3grR3RIWkdnTWJqSXQ5Z0tPWnNkZjk2Y2s2N3VWYjVleWZHamd2SU9VdDgwanNhSFdERnJFQXpsQXdXa2NsYWNkRklLZUxHR1JGdUlKV1lxNGFwYWQvb2RFb1k4TVpRSEdycitLT3o2K01hMUI5b3lWNW0zaDNua3BvVDI0UkM3ZUlVSHBITzBpR2h1bzFPYzhNcUloYkVEOEFJbVNoL3p6NjFPMHU3U1ZXbmxXbXdnaEJ4N2J2eVBRZGl4L2txWDBlTGdvZnorTnJCbVZoVk0yZFpLN2VUQWx1T0xxZWt2cU5UZ0VMUi9wTnJNL3hhb2xMaWZ3MGFQRkRZMDBaZThyaDVYaldmTFhGZGFvNkdEbEoybjVsRmxpb3JrQUo4U0cvM1FubCt6Y0JlOTBDWnFlMUFIMVIxNDIxbEt4YVNHZW8yTUo4WDgrZWlxRWsxNDUwemk5UnlnWlAxSi9rV3NGZGtNRS9FTzBUV2JyODlSZ3BrbVlzRDd0ZWV5NXczSjlTeDZtOVdmdWN3V1Q1M0w0NVJUWnpQS3QrOS9SZ0FLM1dLeHZhV1p5RXU5M1g0ZXF1aUtCYm11dGY3KzQydVRYdGE4dUdMN1FvbVV4WXFRMDVxcTg1YnY1S2xJbS9WNTB4SzI0THlFaEptR2o0M2VTNWdSb1lrQWZFbXp3eDkvMGpUT0ZCT3VvZHJxUnNMT1U3TURPcER6Z29CdHU2QzRVZ2tYM2pHMzIvS3RGdkpka091RlNqZGdhSVNYVXNNUU8zbnZ3ODhwdzUyMTh3dUFqWThOdE44MmxYUTF1Qjh3YWtQZlhnN2VJdDJVSjhmK2JZOUY2a2FxZmVUL2Y5YWprTDZTU1dDWFAvQjFKNUpNQkQzNDJNOFhjTG1SeXloNHU4dGppZVJidC9QSkhVMEZqSngwbzJySnBOKzJGdWJERGFrL01RV2w3MTVWRHNuc0txanNTTStob0VIZHJlR0ExK2hCZ1lrMmsyUFZYRzhwSFVDejQzcHhaR3VjaTMzaU9HMng4NzFwQ252SGI3TGpwbUZRQkN2V1h5Y0xaREJJMTB5S2s2b09iL2pqUXkwT3ptM3RWVDlwNGJFc3VEV3JCN2VQQkhYUjVJa0VtenJrRjR6RlhuTENXOXVDMW85ZmxsczJ6QlJsTDNwMmlzNDU5Nk5YdjdKdWtxN3o3WDBleTdOSjlpRGtXaXNSWFpZUUtDOG15SmtzZFU0N01EVE5MT0I4VE9EMHlvZzR5eFFkMkN1clhsVUE2ajRQREtIZ29wZVgyWHppTXp5aVQxT1Nib2lKWmZQUFA0RlhxOTg1TXFyZElOajVQZzY4TmlWRENVcmpzRitBQ29yNk5rNTRGYzcxcDEvL0FOT3F5R1Y2cVlGS0I4Nk1BbE9ITk9zUnRMZGt2dll5aE5XZGQrcGY2ejVReWVESDZXR2Y2d3Jka2dNaWlLRG54cjFFRDM3ajdqL0RuNlZIaUxVTythY3psSUp1MWpYaU05QnY2Q0IzenZQUFdqbGtVZDlBNnplUXBlNVlHMUh5R252WnE4Sy9UWGcwN1RNOUhxbEU0TjR6emRxdHdhZHl3dlJMeGlua2ZseEJkZFBvQjlDazhwdENKN3pzUjhhZEliR3JJWjZpM1ZOUklIaG81cm1maGdXVVMrVzg5S2pPNEROWHZNM2FxTU1nU3JxOHBKUDByUEgvSk85SDQyMEtCZ3lBMGNkSWJkTU5yWWt2bTZiVnJJUzY4d1AxTGN6NWx2U3A5djhHUVc3eExOQnh4eVovRzZBRVVrdVc3VDFuZG1kMXB0V2RQejZteTdIVlZIR0YvMlZOcVpTbWRUcXpyTkRxMkVIYnUwZ2VEdytJM0xzdkFHeWJxUzBkY0pzZENnMit4TXk1UGtreGJCL01Zd3Vldk9sUFRNOFQ0RGpQWm5DZmk0SEdCbTNiSDJjWUhRZHR2RzBmNWpXMERmREcrWkVJZDdVRC9vTCs1eUowKytib3hES2JMN1RNbm9la0crV0FkS0lWWUxrQjNaK3JUeUJmYnBscjJycnBxTW1kM0RvdkpMeGJMSnEvL1BCZERMeDZaOFVDSG44S1RLWTY2dkRvenlvd3JzZldEZWh3SE1qOTFmSmdJSGJYMFhKNHgwa2QvV0pjd2djQXdCZ29GMjRYbzJBc01NL0U3VEhQVTh3TU1BaWNwQVJvamd3WGxiU2M2UzAxVlVCUjU4L2NQQmVSUXFoUGhqczFkMi9MU0RqT1ltTm9PVEMybWJONk9YTWNxVmRXdUFiTWs5enVveVl1QmNkM3pmZFcwbzNtYWNUTnJoT0JSR3ErRjJPenB0L1lMWERCaUl1OTVzVHhOK3p3UVl4YmtIVk1kdDhuekh2OTViMW4vSHdRTEVMd2psWU5NSkF0WkQ0Q0JKYmpsMFpvTk5nZW5LUmZ3Y1dxM3hvRUxUMGVSYUpJWTYzdW9CZFE5SW8zUER0ODl3ekdvNVUvYjlOQy9ya1BpSFdaMysxRXVmb2tybWRSU2xXTHpJaVEwV2cwbktGcTZEb1VaSEI1dG9NLytPcldvODFqMzdnczk3V0l4WGdzQkV4cXVFZ0ZkMk5MWEJIZ1h0eDExT1ZWejVGRGFpVExnMkxtVDcvS2ZWVHdVNVV5S0lKc09vaHl4U0ZnSXVXMkxVR0xudElJQmdoWmo1WWRjckluS201SFVsbDBUbFpKbTVNZjBrd0hUR3Fyenpub1FMeVV6bnpGTk1GREdHQnpNbmxaWVdmb1FsRjhRcmMrWXFYSlhQMjJaNEgxYWExL2ErVlpMSUVZWEdDaVlYTit4eUFmWHFJZzZBREx1aUE2Z2FncFVMOWdQdEtLVnBqb2E1cmIvY3RvTUVUb3BIME5maHU5L29zbHZPUkkybCtmWFBNSUVwenFDajhieUhFN0VKYTBaYlNwekdSSVEraXJidzUyMTgwbnRZWnFpOS9ZcVBMMisyU0VrcFhqRitnaHZNVXlCOVV4d1p2dzRWcDJWTWhiUFA5eWRESFZ5Q0VsWjdTNTJPSDlxN0lWYVBYZkprUk1aQmxjT3N5NlNVUDg5TVBNTlRJVlFZN0ROM01KYmN4OUV1TER2TEZqZTdheHZsL1lMc3g3dWRlcXNYTk1HWFcveTNXc1doTzR0TWNCL2Y4dThRT3VUcXIrVEZxY2FoYXU2NnUzR1JDak5na3EyNUVQQ3ByZWxjaWFtQUV1Ulg5MFNuc0dUUCtGN0MyUG5YWHZrcTdxTG1ycmZpay94MERKL3hxenVZUktxbWpTZm5TRk9GSDJrU1BNQ3ZZOERyeXlYTW1pcnMxMy91V0I1WHhxYXh6dHV3eURjMy9aTitKRzRYNFR2b2tla1lZaVY5NGs5K3NYWUtHWFBjZ05jVEp1Y3R2WE9Eam45dUdNOVZKa0hNSUxLeEFqbzAxZ1RUbXNEWmxlWmpMb1h2SjIxTHEzbGx3ZWJUbWxaWjh5YUNxNG1RY3RUaVFwazRJcmxaSXBvQ3FmdWF2TkZ0dWN0TWNZcGlybUpicHlrOWZOdWdkK2RHT2lNVnRQVHpLM0FCKzQ5RUNDcDg0M2ZkNkxIei8wOUp4cVlJZHlmVVlXMENPZGF5M2ZaKzVxMVpabzIxQXp2N1AvTDdyTHljZGpvMW0wd3plbkpNN21sYUp0NUJldFRVb3Jya3E4U242aFhwa1c0YVEvWjkycWMxTG5MRE02RHB2eVk5aVJudWNMcDhZZUJmWTNDMzFmb2lIbGRkRzVDL093c3dKMU9HcWxxbWFpWFUxclVNdU5NcTliVS91dFIxSXVyTlVQWExUdHQzWXU0VXFxb1NOQXZGY3MxQUdjYlMraUtpOHo1UTYyVk9QdUs2L1VPVWlvK2tlbEowcFUwbVczSm4rWWZWaEJTQ0x2S2RtMjZqZC80eGk3SWdMTXM2b0NaRmJWWGxwTzBvdDYxK3lrWEhZeHpsVnlxYWFlRnlDVzlNdXZJY2oyOFFjRm1GbG9yb0drWHBSQTVab1oxM01PbUdKNktIT3NNUWduT1BkZGc2c29JNnlJekZ0eXlQS3NON2drOGlKQmVWZ0hkcXd2ZWVzWlh0a05FSkN3Rk5vcThSQy9kRFJpM0hqaEdubEJtSjdKMkw5bmYxTEp2eHBSWXRJdHZSREFQd2ovV0R5eGdKT2o4aWxweTVYZ0NpRHhqWUFjYlEyYkphckdTVldjUDFhbmE5c3F1dWZtYzhaTGZMZ08rbWorKytYclJKaytscU5xS1FmYThuMzQvVEpEZFd3ck1iMExFN084c1BYZTB1WDYvMkc5VjMrY1VBTi9aK0hnUjJjckVxVnh6Z3Y0dWY5ZTF5T3dLTW12azdKUzBCUmNjdHpmQVp3Z2Ivek9JbHl4akZHME5DK29lMG9YWnN3dWkyRVoxVXdnQ3VHK1dYVFdHZUNYdVJIdVVoRERYRE1Falp2RWJRdHREU0NwS1k1TzQ5NDYvYXRlc0xGS1pIenh2ODZ2dHdIaURnZTBHZ1pLRHNORmtrd2pITnRBQlBGRzN6bm55UlduMnlrUjkvNGs2NWxORWR4SFYxT1NRQXkrV2FyL0NsZXQ0Y0FEc0FGTHMvOEJxTWtpRmM1ZGhJcThFUzd2aVA4bEZGVFNVcHhHMzhTZXV1dEFmVk54R3FDTEVHRzNjOHdub1JCdFRybGUzV3hiUW1LSnljMitGY3l6SzFjbC9PanhCcndqU0o2YS80RUF2cHZCYnVsQ0xTalVETUJNaU1haEZXWmw0OVl4b25OSThrcWpxTWJiN1VtSEcwRDJsQjd5TGVlWmZZUVpSMFNXSXlUeldkazdRNEloaU1lN1VLazd6QWN6cTcyOEx6OGhyc2VhS25sVmxvanlxK3R2cHQ5UmwwMzcyU1hUYko0RWpCWXRWOUJDa2NGRVRqeHNORE5zQzNGcHFra1RQVEttNmtKay9zOFBJOG9wQmRZRlcwNUpFOE9MNEthaEFtR25hMGQyNkNwdENCeFFBdm8vVE9HUE4zbEdGMjZGOXBHVzlidEtsZTZ1S0hJRVFLNG5LYk94ZWRkcUk2RVRBbmJEUTl0K1RPZ1RJQ0Q0UGZDMUpwRnppSVBQM0Nta3BnK2xUWTlURkdXbld0Zm1UcnVYTDFBamdVN3dvQ09pMHVKRjc2blNmQjVEb0lLMnNJVkF5cG14d3dsSkswWTZQdkRkYUlaU29LdWZWOTgydGk0NnEzZkFnMkZZZXRtN2NWRW9ROXJtMmpHUE03cGVJRUlNaVZKeXlWUFpmK1RWbjRDa3lBNUVDZE1RRG5vay9OSGY0dGZCMzZnd0ZOMGYxRXAyYmNNYWplbUN6SzlvN254dWdTZGJEMWtKVFhodWYzNUJHZW1pWFg0WjlxblJscHA0K3JOUzFJQ1lzZlpaRWpXODg4aWF6aWVjSGFpcEw4T0taazJVbWI0djgwU1hyQkZWNjY2REgya2NEb1l4ZWZKZE1oVXp1MTdXWUZmZ2swRllaWi9jSkxCOS93bTRjazhSVExhS09ReUNsMWpsOXNmOUpPUzNTQ1l5VytOYUZSZXFVMzJQaFNvRXpRZmpPcmYyTURJb2RLcDhwM1dFeW1UQVB1Mnd6YU05Rk5zcjROYUJmU3pBcDY3RWNjSU4vdnh2RnhoakVGUkJkbUNkaldKM2xQNjluOUlJRVhoVStHNjR1bFlZUlEyL0lDUFAzb1RQdERsRy91SFRKZUxmcU5XTzRFVWpGQmhna3p1SVFnM2JKanROakZ6SGF6bUQ2Sk42Q2ZLWitubjRIMStRRVhIeDllQ2F6anM4ZWFndEtPRnpYejBEbGZid3p5NWJMNjNMTjRQZjRCUE45ZjRVWXJ2cUJPWXMzbVNrVklPejlFbk9uSnFnT1cvQUdwS2ZWejY1WHphL210TUFHTUt6b01PbXZPcktCemNxelJSS3VOcGFnbE1IQ216bTdZbFo3RWlOWXlFT1RMYTkrUi9GWldDeUhYQ1o1U012V0JJcHhkTHErS0x5dEV4elo5OE16NTBpSjVQZHRVaUZIUFIrQmZjYTlEN2czZ1lXQW9ZaE11VnRQK0grTFZqT0hzL3dWVkhTbjR0SVNyeW9hU0J6MnBDcUN6MU11S0R3R1dSTFVnUEtldUtOeXV4Z09zMTY0TGpZYUxnRWlCY3lPL0wzV1ZQeElGSlNXeFlyMnBRTDVOeFlTVi9TZytvVTFrUU5lMzBNMlFLZE8wMldvTlYvT1F4ZDRwVlMwTWdLZTkreXNROTVueDdobkVGV2x2b3dYcFZTTzRsL1ZjTXhHSjI4MDU5aUtKdW96YXJEYU1EUFhnTnZoMzh0cjhoY2c2dEVia0FHUDdDK0crbnI5YlJKNS85ajRrRjJJYjFJdGhQWEZra21vT21zb2w5SGFON3I1WTV3eUJxZXlseUpIcVVZK1UwL0JSa3pMMmdpNUxka3pjTW1waGJoVmZ2YjdlTmNnS3ZqcW5KbjBId3UreFFiVHNIUWxPNFpOclhKZUtHRTM0MTdNdGptb25QR1BlL3JNTVh6RW9HRE0rSVJGODArY2Robm8yY0dMdXdLUUJSTk95VXU3MW1sbU5Jd3M2ZHdUTDZ2eDlvd2pKZmFGcEVhL3p5aSsxNFNhU2JVUXRnOUdIYXJRN0NabU91VjFwNklraU8yYUM5VVUzMVpMdkRxSE5DVjI3UkgyYVNURVlSZ3pUclE2WkVla0plaDk2NkVXR01IUWczcTlEbjQvT2JjUDJ0Q28yU01HTmJqcy9MdGhSNEpJTXhzTjJkNmxaRVpkUTlIdFJkcU9EWFp5SE03a3RXd0hUZHNVR2w2dGpNK1RNVmJMVlVoYnUrbFhsZTVHUTQvakN2WWxRN0hYNGx2bGZ1RVEwMDdIVjhkZ09KWU9CLzhjUkoxc2YxbSt3RFdqZTdFZXVCWlh5aDQvcE1KaVQxVWNQMHQySXBob1dpVjc5SnNCaWFkejNna2ZkVDFLR1BwNktRUTZJU2NzelRMTlJHdk9KWFQ5S1lIOStPNVUyODZSWVF5Y2FhTFZhRXhjbzJEWTRRTkJKbWJDa1c1djk0UFRSc3ZpVW9yd1Y3eTFtQjd3WG5qVGNTSVNSV3VETUQ4WU81dlNzUzJNK1BkRnVOY3FlZ0FpMDg1SkVoazFOSjIyQlRJVG41M3N5bUt6cFE3T2F0bVA4TTNDNDViblFMcVBMb0pvRnprTU8vNjBNRnR4c2t3WlN6dzlMRkFQbHJmT0RPeGJJR2N6aE1CRzVLd2tONTM0dDlranlTa3J6d0FLN2t5Tm16Z2VhMHh4ZlFQenVzNUswVGRoc291cTVCeUxJZHJKK2dnUDRub3Q2dGV3L0tDNmFlRmJuM1JtQ1h1dXpHRlY2QWVuOFBLZkp2Yzd5S2wrVU9UWGVpajZmM0VsMVpGNVd5M2dpSkt2UXhoaGVoUWlUREZNWjNtYnExb1Uzd1EvVUMwV1dzcXMvOTdkZ3VBZ0lDQWdJQ0E0VDc2UGdDbEpONFJBNHBxN1d3Y0pxcTR1OXF1eG9jd1dxazdsSVk4VG10UGM2MlEwZjFIcDE0Uit0QVc4QXdGRjdjZTM5ZWxsaVNSV2wydlVtaEZmRnEzMFZkV3B1czVaTXBUY25wTmNya0pwODNrNEY4alV2akdaZXlRQjJ6Z3pPWDZ0WEtWdEFIKzdqbTB6Ulg0UVN5ZGRLNHFjWUg5M3pyK0hpejgvTHQyVHZDUW55N2VhRlJmUnh1QnYzZVBFaUo3S0cyYnJDaDNiMUdObVFtcXJIdXB6cmh4Kzltdk04dXZQS0JyR2luaVIyQUJXKzU1bVYyQ0xYdkwrZU9uTXJRL2wwN2F5MkVLY3AzSldSbUJJWnZWbGVxWm5yVzZCRUJoazZwbHl4SFUzQ2Y3VXQ0NVREMTl1Sk9NVjc4N0Q1bkV5TjZ5OGNxRGN0dHVObnNGbEFhUitBK2ZSSytoTUpUL1dEclBtTHdzNlpud0JLNmdBenBnME9xMVZJVGNlVkJick45dnRUWDIvWWlmOE9zbSszN1JINjdWZitIcUVkOXYySS83L3R1UCtIYjVmYjBuMzJkZk1mT2c1L2g3c1g4UHRaTiszcksvaDlsamZaOWp4KzMwbzkrMzdNcjluMmhHL1oyNC90NkdmMmRaZjdDdmgvWjY5bjdmclFkK3JxSC9OK3RTL1o5ZzMrcjBVZStyNnVqOW4xM1cvVjEvWDFiMVgwK212OUo4NTFWQ2RXYmVjc1Y2RThyaUE3ZGVBbzZlcXFNTnozVDRIRjJ6SktuRXk5RmxJN1RCTkt1SXZlYVV1T2E5TDVaLzZNVEc5QS9sVlFXeHI2VXZWYkljekhISXNMei9SREZBbnVva3BpUjE0aENDK0t4M2hEWTRRdXM0bVVuNVRzU2xSRVdGNVo5aTFTejcwdThnbC9XYXBaU0gzc3dRajFsS1JUTjRkRCtXUEZWd1I4c0xucGw3bTBQaUgzNUViVTh6cytDVzd6TnI0ZUd3U25mNUtpVTdqUmt4anZkUmFyc3h3bU9pQzc1N01nMzVNTXM5aUhQNmZRUkptNFV3Q01YWEtIUGI2VHJIcUVBM2w3RG1LUHZLUmRROHM1N210VVorZ09YT28vUncvRFNkS0tsdFFJK3BxS0poNC9BdktzWHJveXVuRHAyd0RmRDB0M0tySGVza05wZEg0ak93UnRMYnBTbU1ESTIwZDB2MXRxc3EvbEdNRTRaRE5xcUcxY1pIVTU4dHBNOTZ0bkxOMWtTeFJxQmVJYm85WGlWa1c1N2R0Y2haRHplZzgyYi9XbGZZajI2S1lmdVg0dXFBckVDb1Q4Y1kvZ1kzQzNuT1E2YVUwTVpiZkVhb2V6c2NRWjlSajlVZ0REVHluOEJiOHdOL1hqcG9iaDVoOFBLRmdEQmFSZlJRZXBHMkFsYzJjNTNtaGJHNE9USDV3SkEwVDZZeEl2V3JONXlxaTliZXduTDRWdjRKYmpSRGFNck5FMzZIN3J0N0VUOFkvU1IvdEJRam1Td0lEcHRiaXV5V0I5ZHVTVTFiREVDOHRycUJ1ZWVQTDEzZ29kbEdHdmlYNmZQWlZXRzlaZjhpNVdKTFdBWHIwZHBwNkJMVDBBQ29JdDhPWUVJMGROWTg3YUEveklDaWFTVVlTMmozM3pDRmhtaTh5TkI2eXgrZU5TVHMvMW9HVU1WaHNsRUlCSytQV0U1dmxjd1d4bzJNMERWMDZ0NEdVcEhTaFF6UHhHanVpZGkxYW5nQUpUSVJnVVpsODlacUxzd2JxRjE1SjhtM2dVZW5OR00xNGNxMGd5eFQzV29PU3dYMDFQOVdXZys3cnhwNStCN1dKcG9mdWFKaXpoNUNmUGhzU1I3UTlzRHlJSDliZmxqemp4L3pTa0g5a2YzOGtvcTBsTmNGdkdpZzBFckFNNkY2VzYyZzg0RklScTJhVndtaFFzNlc0cEYyL21DeDBTZ2EzUzVLc2VXa1FTNjNxTFhYWkhyak9CRXBpWVFBeGtuYWV6a2hSeW5FMU0zcEtDUzVDWk5YblQzVnlZMWxZN3Z4aHpEcXRCSTFBVVNhVnNUa25kNU84VndyNmtzMERsdmJwNDE2YXlUVzlzU09TbXBSOE0xREo3QjJuZ2hlZWJWb2RodlN2QVdvM1Ruc1VwejNueEQvUTNwU1BXU0xMd1Z3MUt6czNVM0hJMkhsbENyajUvMWc5R0pJV1lkUWZCaUdlZ1pCVEZFc3FISy9NSjBGbzduOVJna0tXcmZXcW81VXA2UzdCTFVHc0E1WS9SZEdVRGJWT2tZRW5GZGJuL1ZTSnpJa3g1WHpKZkUxdTVyWmFWc3FiZ2FJYzNaVEg2OGVHdnpidmc2ZDdhbGdreWJiQVdzQ0ttTDc1UU4wS3NBK29ZTy9wMEpFbThxVFBVNWdZQ0xSZmhrcGlHaEtUUW1TdGExQm4vS29sNmpYb25wcUsvTmZzcXdlRFJEVmdFM2FlOFA0YkZ1TkJTWU9UUHBOdkxhUnpQMjNob2RPVEowZkhubDV3bVd6RXdzYk53SGc5UGcxZXdXM0FydDJEb3dZKzB2cThjSzlWR0NHcjZ2ajJlTXp1RHNWRTlyTmR1dEMrQUxrSzhLNks4cFN0MXVjazVUc3NjZFRzTW9YMEdtSjZIc2xHUUozV1NLZlJwNVFRV1MzT3BYNXNhSzZaR2pmRVkvczd2bENHSWgxK2Uzd01XRXluNUticGlVYXBOMi9hR1U2WEJOVmVoeFBUcytqRUhaL01QOFZqZTlFdldSNXhPNlBxR2ZmZU0rMVE4cE9KclNBTkNpbWw2VVFacHRRZFQ3ZFN0a1JUY0pZU2FwMWZkNFg5OGdZd0V1ekZ4WUlVcjhoSkJtTjR4d0xkeDJJaFJjbU9uTDg4RDQ3cUFkRzlsSTRIN1J0Skx4eElDSUgrVnk2blRyYTExL1dxSHJMWXVQRVdLZ0JiWjMyZkpzYVhQVDRreTF6d3ordkNCTy8ySUp4SkZ6YTB6ZnRtRzNQcnQ1Vm5IRXNINXVRWjJmWERNV09GdjkvVk5ZR25sYVpDM04wQXEyZi8zNDJFdzhSUEp6UHMzZVRoRGpneUVvMURpd0JXdENBMEFQRDZiRjlhS2xZZkZmcVNvUURQVkNqYjRWeno3ZHdyWVNObjBYbVBvSjZ1em80SHNwY0RFSVlwN245OU45RVpnVmtjR0docXNQOGJsTEdaR25pL1MzSVlUVUNrK1NQZmd4eS9IQ1lPalovR1RJZExLclJUVmNXZUxMc2FEdlB6dDZiU0tzQmZzaEZlSXlKalVVRzRObVAySDNUSFRHejk2aHBxaVlrZDIxdWFLZGZ5SGt3cFRRTGxxYUZFVFhRc1RaYnZYeHZSL1dqelk5b0t1S1NyQUd2YllCNEtPaHhqM1YzSkh0TjRJencxWDFnOEsrbms1bXpiUTRrOG83bDZtbkE1R0pheEFYcnVndTQ1VFF4T2lzRkU0bWFUUloyb09oR3Z3bjg2SGt3NENIditxZCtWc0NnRE43MEJ6d1Q2TXhSazZOaGtoS0xvYzNESVE2QUxURmFVRXNzL3pZamVZL2VnYmhzd01GSFB2V1ZsaFNpZVBtb2kySm8xWXJzL3lsYjNMNEdyVnliTWlMTmptZVZjemFUamVMR2kyNFV6cSs1SFV0SFBZM2RvYmFWbGpxT204elAyaitkQ3h2NFdNanV1TnZzbjNvY0lUV3VKUnNJTXdtYUUvY2dva2cxMTlMS3c5cVpBZDlod29IeUk4N3FhanIxRGI2ZnhFTWYwVWtwK2VDUkllWWswcjBHVTdQcW1rcldNSVk5N1VCRDlBSG0wbWNuZEFJejQvY3V6NFBCK3lmTXlEaWtiaS9mZ3NuYjAzTy9oclorMmRySHkrK2FyV1hUT1dWcDRvanY1ZkFGREh2Q2JaVFVETFZMLzBVZUVPcTZ3UUlhZVdNdnVrVXlXM0YyK3dHd1lPa2Y5NkFjRnNOOUovZG9TMnc1Y1NHODQ4S0JBMDcwbDJMcDJpSVZZeFkzN1ZHcHdhU2x3NnpmUlFKRnpYcGhoWkJ3OE9PZnJXQnRDajQ1VXdSSjNTTUoySWEvTldiQzU5TXFyM0pTam5jdytsUS9sN3g4a1R5Skx4dkQxU1k2RU9HMjFsVXNVUWlraVR4V3AxamRsS0l6SS9ZZElFUlQvcTlJamxuUU1uUXNpZFNtS0QzYWRDaFdUM21UeWFhQ1dyZjJmUmRvSkZuY3JnZHU5UnhMbkphTWVNcDJZVkVzWGZkbTlQQkRzaDdKT1RSOVdsOEFKemNQeSs0RnlZczI2VjdSWnkwRFYzNHFlTUhab1J4dktuT1VlMkNLUEs1enFFd0lzZVltS1FVVjJaRkVrT3dPN1hFT1FyVDZXaU5VMVU5U1JYM3M0a0drUGExaTRVSEpMT3BqYU1xZGVKYnhIZm9aY3gwSzlTL0NMUDZiV1hOYlQ3VEZ5MC96UzV0S0xpRlk0YTFOVHhNQXc0dnFRM0lWWVQzRkJGaU16Qi9UcVVKNElpVWFOQmtCb3JDd1ZQRWt6Zktyd0pvc2lwYnpweXo3RVJ3dXRtYXJWTGpoSkM3Z3AySW9uTGdSdHNqbFFZZUNLV3dqazBhNlBJRGUzVTZxQTZNV1RRZ2kxV3RscEIyaWJ5UmExRlYySE44TkhPTW9LMk5SQ0N4cGdpQncyUk5mNTF6YWhnaFk5UDlQT3d3SksyVGFwSU9FS1gySWVNck1DRFIwZW94M2o1S0thekVyMTFRNFBMMUpMYkNNektMOVIzKzZiMU56L3hqekREdTBTVENiUVpBTDE5NjZvb29Pd2lXeVR3bUtjNmpoRGYzVjJJN3ZVRnFvbTl4ZExQcmpNWGRrVW1zdDY4WDRuNVFIbmxmS1dwRFFlVlF6eFJvVFFxUWpIdTd1WG1xYkNmRXRzc0FvSVBjTXdzMmxMckk4ZUF1dUUyTWh4ZU1mUXlTazQ2dFJPTnUwM2Z1VTJjVTJTbTZ2NDBPUnhtanZGbG5WaDV0blBwV01vcDd4UWNWWGNWZjJ2Ynd4ZWovWTlZbytmbHNtZm5BWm1CTjk4UTQ3cDdpTmJnc3dhQ2FhQzBYYXdRSE5DZVpQUVFjTWZHdlkxRlJVaXh6TmliTExQU2Y1ZmZsWllNaGZrWW53UGIxbTVEenBEeVVtclF3bEpvZzR1aTBjdk45dU1JdzNNQVVSei9DVWUwc3QvMjZ3TlhRaVJaNEloSUVGd3I0ZkZKamFqa0RvQXJLd3c5NG1RN3FnL3lpbHFQQWVTeERnd3hhYnZOK2pqYUU4S0VJSFlTMGQ1dkI3VEg5OFpIK1N1L05mV3BGYjFtTENIZHdPdlhBQ29FV2poK0hodTVPd1E4Vi8zRDF5cnZLc2lqMG5QTnZvSGlRYTFNK1c4NzdBTTRBRnAyL2lMVXpHWjlVMmk2MUJWYXhCK2dhekhIeXpnb0xnall4M0lWTk8rNVhpM2owVGFyS0NvVTVENGE1UDdOWVBKZm9Udm4xQ3ppemZMdGNuOFJneGd6ZHErYS9QWVlQT3lCZjY0RjlNeG9nSFlEdUxJT2xSa2lZTTFSdityN0ZLekxrZGtTeURHbDRRd2ZmMkh3a08zbkh3ejNnOEhVQ3FqcVVqdkg4eTg0MisxNExKZW0xSmhhVVl3M0I1R2Q2d0NnNWZJbTl0VCtzMGZ6WmJYeGM2ajZSUUx6TW13RXJiNUtKb0hWczJodjNMNDREWmxMeVhLQlhXRmZ0M3paZUVKcGdMVmxTMzJ6dnYvcnFJNE1NMEhNMkNFTnV6SmZuSE9nK0xpWFJmQlM3MkYrUVYxREFFTkRaSFpXQmk4RndUY0JXSDN0MkdVaHY1NTVlcHlEZm4rWmxDK2dVbTB1dWQ0dzdmekZ5T3dKOEdKNno0RTdtSGNVNlhYZlJibkJTRjVmSGJUeGxnWnFhQk85Y0ZleDBndmNsNE9lb21ETldGNG5GaWZZbzJJUzBBaHpONmhNWWVmOXRMUzRhRUFNSmFVRFl4ZjRUdlZIc2s4V2ZhRGZwOW81blJ1OTl6WFkyalZ5UytPS1h4cUNEVVVuZDR1cVNCMTZqYXY2elUzTWJ1NUpna1czNFRLMHFhYXk1V1d5QWk1aU83WHVva0F3T1prV3g2WjJqd0xUeXZmVCtibnRiSnVqV3RvZGk4S1VVcTlNdys4MUN6SEIzMldqYks1UG5PK3JOVTNrNWgzSzZEVlJSeDFPWmRNVDhwOWZHSUl1MDU3eHUrT0cvaDY1RlBRa1hSTnBrbGRUaUVXMjhLSEJ6UitEeGlUYjczY0FYcEluQUZwZU1qaVZQam0xRW5yQzlnQm9OdWtzWmlBRWQwdGxTeDZHOHR2ZTNieDFUZFVRQlo5VXlzbVZIak14bkl0UlJkNy84S2hrbnpoWUNpU3pxZ0FtR204MGdUaXl4RVE3OHpmcUdxYTFnWjIrNkF1MFJqM200SWhsVlZ6MlU0TytjaTd4M2Z4NmZ5TjkrK0VtcFdZQTYxOUJ3NitJWC9aaVRYL0xYWDg1NVhwME5lTWVYdGYzdlJYVlMwd0FHUkt2M3pGWnZRa0wrak4rc2IyQ2FiZHlDeGI2TGIzUVZ3ZjZER3UwUkxUNSt4bkhOMzFpVjMyZUFEa1A0V3RtY1dDdWVhWW9Fc3BLS055MkxMN3E1R3ZXcGtFK2JicGxHQUJielp2bVdzNCtqNWxVWFF2SGVTZEFZWHZUeUI3NkhuTnFxZU53cGVGZW04NUxuYUFkalJUK1NINFhiYmRjL0ZnbVpVOTlVQUgrUzJtclREUU42cnI2WEZXN3g4bGdFU1pkWWt3dFd1WUhUQ1JWSGFSNFZpL3dQUUVYbkd5YnVhMng3S3Y5VGs5TG9PZTI3NWlUWHkyT2NpV3dzSXZQTS8zZkpFVVcvT0ZKU2orcG1saUxnQ0FURUJONEtESjVOTjN1UW50YzJuYlRIMXN4RUFkcTh1aW94b01yTDF3ZFdVdWF0L0FwS0JXdmR1dnJ6THV4YzRVZGhXbmhMZGdLSmpnWW5LbWs2T3lKWGVmNGwyaDFyektMSHk2cDJqY1c4dDhWWE8zR2RtU2YwUGdKbWVsa1NDQ1UxbzBtUlpSVm5zWWVZODRCb29wZnhiaEozaTB3Y0pRS0dlTEtVTzVhbjhSVEZRS3dESlVoL1p5aDlCRDQ2Y0M4dnZpQ2FIWmVuelpPTUxDY3pxelhOMW5ITGpUbUtSYzR2aUtYeWp4UGhpWGFyeTNMakk4MWwwUTRSTTQ3TVcrU3pvYVBuZldJKzY1aWsyUUlhNmRLbWFETUlkSVdHaU02TlllbktlYU5NMXNhbzZhYTQyK2JKRmcyeWFEL3owd1puL2JSczVUdWlvUWJBS25LdlVmUXB4cERCRGk5TkhrS3dQQk1WMHVmZkVralhjWXV3KzBFOWJ5dGhGNzFsOURrYnloOW1aOFhLclN3ckRyYlR6Ylltbk1ZeEZrQWxmK2Nva2hGZmhtc3JuSGx5c3VueHJxMlNOU01ad1B1UkVrVjYyWFhvNEF0RnVMVE5BTEphcnJ1SVNDdC9nMEk0ekNvemxtTjBIMEJDMDAySE5WRFh1ZStlMFoyeUJJdTdleUVtc2UyMVZiN3JkODJENkx3WlFGdVBDemE2Z3VSQ0NxRWp1cVVoK09xNjlGUHNmQXRCeDM1S1A4V2FnRzUrd0twbGtQTzB2S0MrdGZuOHlpdVlXVHEycllVUlZOQ1RhbDRtMFJQbkJMUnFncy84Z3kwZXlVUHR0V05NUkQ5Z2lTUmYvUkU5TUthcm14UmREZUdnNWcyTFdBQ29nVnFQZExyV3NUQ3NjVGQ3YnhCU24xeHBPZnVDQnl5QnRjTzhRUWEwTmcwU210QWh1Tk85cHpkRXBKb0pJWmxjWTc3UEtjL203WURONzVrNTl1aXhGbmtDa21wSEpDaUc3NnVwU0ZPaVB6WmpReE9LTWwxTUIxTzN1SEJBb3o1OXFKTkwwSFdNM2U0VWpIalNTVVhIVWZicFdPSTlaVjNBaHNITEk2a3dLRk5aZ2xzSzNnS1VRYWVFcW5XUE5ISUJvK1d6RXdOckZIQ0hHS0lONVBVbm12Y0k3YnFPaExncVlxSjlRUmRwNmlERENmY3QrNmQ2V3I2VVN3Vko0bW5Xb09Kd29rYU9vaHRTN3AzWXJ3YWswM2dDakhOazdPdEJOUTh4amNxYTNkQ2lOc0dhU2dkMlBrSXFrR2cxazd6bHd3czVDU0srVmovbmVCWWIrR2tYN084TkNwWHJ3b0FtRzFQODV5VjRIeHpCS0wyTHFyc3lBRUM1bVA2UTZ2QWh3QXlLQmZxbjhaME9KV2crdUNZMW9WZmV1NlRiSmd0SnBYU1BMRkxrOVhtTEtSL29SQ1YwT0NxZmwwSWtUSlRSS1RrejdVeWNMdndHcVFTcVBPWnM0RlpmV1F0N0Zhbjk3VloxSE9STTIyTGFQbUFoa1hVaUt0QUIzMDlxTk9jTEFUUTZCOTlaS2tlaktWYTd2UXVBTnNPSzZzWGgxTENVbEYwam53NG91NnZiT1NTZ2lrYkk3eGg5TlpFbXNROFROajRoQ255UnpwZnVlT2JVQlVOeHBNamowRVEzd2l5M29DSk1DMzJkdnZwMlpxdklBcklhVUUzRWxhUEtBbDB6U1lIdGdGa3ltQTZPcmJWazRIL21ZeWh1MlcyZldIVWQ4V0Z3SVdHQmdxNGlYaEpHUUJWZ1hFbU9ubkU5cmFDS3gzQkZMdWxtY1k5K0hHQVdISDMrRk9ndzk3VkFGMXZSTUZYZGpMTWl0d1NacnNHdlZvZVhkYS93dFFpNUgzQU1YYm9US2l6ZzNGd25UZ3FOYXBqZC9KRTZ1NFJYZHV6OTk5SFhraG50VUF5VHlXZURyMzBjV1NXSkMranN5Y2ZaSThHblE0aGI1M2w0TTZSMyt3VTcvWXpYaHlLU3lXaGFCOWwzUmJnMXozaXFqamhWRHBDaEg3cFIrMTFlV1k4QzhhZkJhOG9Sd1dubnk5SFFVVlZFalY5VC9ENDFLL1kyS1ZNZmZGWEdhNVdmRnJpTUtUTHduaVAzUlI0a1pKOVN1SVVFZFdIOUdxUnhLTXN6OFFXNkpiWFRTSU5KcVRVN1M2VnFyMUpORlFwSHdLVGZ5eFFEanM2RWVQSExrM29hUWpFZk5iMVFPN05uK3lyS1U2aEpOb0Z0QTgzd2hOaXJicXBWbm9WUjFkY1hETFNxTEVoSEFYVXRXRkNjYUFMRk44UlpLVlozOEpmbmJOOGttODZIYlo5R1AzdWVzNlpNZGhSOTRzZldjcGFFRU41a2VianB0SGZXdVB5dk9meVFXMmFqaG1MOEl6WXoyWEVsYUtlWHBoMEM5SW1kRTdiMUNRNjlmQ3RTZk1jb1RCdElwNFlxWmJEUk9OK05rVnZxWCtxbzFEQ1hhbkt0dm83YmVsWDhSMWpjdzlvcVBSdCtqWmorQVlwUnRGSmRGVm96V3ptZzJkaDJnN2lNYVF4blJKUGROQW1sN0hSWG5yTkZ0UHlGRGNQY0dZOEVzcnFVdVh5MUZxM2pVZWk4MmZBdTMvMEZUeHJEMGlnVk5CcTlYR2kzcC9BeVplUjZUT2ZOTzQrenJGUVROVThuTFlyYjFhcEZvcmk3WUNMcUhSNUpoNCtQVE1aYUl6bHJkczZKK3phSGxwdHhmOXN0dm1TSVVjWEs3VlAzTzhZT3ZrMXl2R2s5ZStjN1NGNURZR2F2Y1VMdmpwVjdCTlFyVmU0WFNUK0ljUzVyalBCSEZSK29MYWpjN2ZaYkoxS3NlazFLQUpRbzJLc1VjaWY5TkVRcEQ1YUtsdUZ0dmg2NW5MQTI4S1pzeWZXZFZjVjZ1dFFCS2luYS83aHFOdWg3L1ppbUN0YzFSYm1CYXk0Y0o2V3lLWE9ycUU2bEpnY3QvOUVCaVhXWStNblMzeWE4cVpmajlxSERXS3dJbmZNbWlDU2lMcFFWSG1sTHNPbGtuMGtuK2MyUitxdDFnVktENWhXZjdlejNHbGlYZ2NZM1lCS1ZyekVBNEFpUTdhbEtaZ3RCOXdFam9vaHJhTW9UYU8xWVhwck5RZTA1THZIZGNUY1pOekk5bG9sZWdKbFNGSzlLSmF1azBVd1JyWW5zUnJmNUVJZ0U1bC9WazcxV0p1UVNMTVF4RWRBckVhMVpQajVCS21IMkRpT2hoZVczTUpGSkFWQkloNjMrRlQ2SjFydkRPcGU2Rzl6M1c5NEt0d3p3OGIwZUcwVm1Hc3hDdEp4aVpZeGZxcStTd000YVQ0OHNrcUloQjhLWHFTWFJJV2N3SnozYVJRMEJZVHIxanBPTm9DWEJEYjF1YmJocFl6WDJYQzYxUUhRa0M1K3pKMUhmSzkvTEo2TlE0Y1pwVUJNWjhkVm52cGNnc0hrOFJGcnF0ODB5dERJblVsWm9odXpPUG5lTklybEx5L0QvTUV1NGxGRFBLWmJkdG5oZWdxRUJveFhOMU5pTjQyaHU5WHJ1OUNpQTVwQ0VGTFAxL3RHbzU2cGY5Sll3OGEwbEVQNDF4KzErc2JSV25IZy9tT2lrVkJDdEYwTktWL3VnMkFvTHZrQ0M5eVdqOTN6bXgybHNiMU9MbzhjSmlYOEFFb0V3NTVlK1ovaXhNY1FhdGg2cW9hY2xGT01BRDNrbFR0cG00R0tCQ2ltTnUxd0RaTHBBdFVCclUvRlh1emI5a3dHNXF2SWswV09NSi9CSWwwc0pNaWw5TzByb1J5cXBFRWl0eU9CcFpmOXk0UTg3MEZzZEgwVnlqQXZrZG45MkZ1TUVuZGhNVlRUeXBWTC8wbHV4S0d0eGxMUTQ4U3lGRXRsaXh5T3AyNUxqU2NYMTlHN3Q3bDI2SkxrMGFsUXN2ZHAzcmVGbnphaHZSaFJFbjlaNDVTQ0drVllMZzR6cVd5cDZjVjAxc2pSRUx6Q3JTeG5OSFh4aGxpL3c5enBReEc5WnVPMW04OTM3ZkZvUHBQcXNraXdCZUZ6ZTNVSUJBNjEzT1dKS0RYWDNIYWVZcDNEbURuazBKSlllVXlPb0NmM2NSZDR5RW5BY0NBeWYxNVNlUTc2dWRHOWdNSFA0WFdQR01NVnZBNjdaM1NTUEE3V1VhVzRoSlI2QmlPbnMwU0hEWTFnVzZqMytBQUc0YTNESEJSZXU2d2o5U0VYWDE1N1J4RVcxUEQ4OHFrUGsya2xmcmRWaHZ4Q2VWU1NjVVlnWEhSMEl3WTY3WjhOaTFxRDRTQXR3d094L0dTSlIvQTY1S3ZTZ0Q3RHR5cnVpenBDcGpYcmE4c2hMa2JXVGo3NjZtU3JZQkVCd3hndG54SHF1VmVNcWVBNmsxcCtrVnBZMUJWNTBXQ3NwaEs1eXM2enVLZzMya2YxK0MrWVNOVXFjZWZ5QTVuZUNTYlVRVDNtYnFHMTVNVkVPbDQ1a2l3UWtuRVU1YVh1aVY1alBrb3c3YkhBdkdKdDhiNDg3QVJ3QU9VRC9GV2NSQnQ1VlhLODRpby9aUEc1S2IvT21DdVZsODVpNU1lOWJ3RnQ5WmxsdHpRZHVhU0NmODhVcXFIUlp3SjIrL0YzcnZzOUVuQ2kweERPMkNUTUVBSXVzWEZscllBN1hhZzBEUUpybU1sUVg2aG5ibXZUVmZNNDZud3VIUHpYZEJPZmFzUVdseDJRcnduSkdoOVp0cWJyaDJTdFl3cHR2dHdLcjk5elVlVkd4SzZUd2phZWZ5Umg0ZjhCbUtVbHVVZ0gyQXJDc2FKazZWVlFJL1pjMEpUWThDLzNpNDNIYlVHaHhiMCtkWCtyN0JNVnZvRHJVbXZ4ZDBTemVhejQ0WWsyNHc0L3pSWnRSYUxUVVBpWkFOc0JHZTNCL2hIY1NHeUNsZ1pXZ0RyMEMvcEJDaGppOXhoTnRCTDJiQUFaWUY2WVQ0Z1NhVHZIcVJQeThXdmhzWXJVNUZ0cGRTWVZwemVMOEdkSGpqL0tKRlR2UlZkKzUwUjNVZmg3VFFBYTBaY2RucjR4ellPSUwxQkdheTE2MnQ0U3pUWVlxcTRTemxGVXk2RzhxQXpVWlozUTJUYlE2L0xvTVY5cGJnUXVqeHp2RmVGYTFYbVI0VWFpTUs1Vm55cDNYNTEzcmJmcHNPUkhaSGJzVkNsZUo2b3dVWXNaMVErdysxd0JVRzRSTGhQZXV4Q0lhL2lxMEZtZXdDek5zREdxM2s3d2UxVWlyb0syb2VrY0lESFpBTDB5Z3kweDlhYjBNVnJ2SkpCYjBWZVpmblh3eVNGTmFUbERaQkY0ZmFhbUEvODZVcktmeTdGMklub0ZpWGE1VXdKNURUSEFGUU1CZkU5YlZMVjd0Rm9YOExOWHVhdW92QTZHVTBveG1VdDkrbGtObTk5NGpJSjZBNXBBN3hWQzl6M0hDN1dKbmtxZHdVQ3VaVXVCNWpScTN6dndiVEliNHIya2t0TXVjTndIb3hGeGZKOWtyZWo1N05icFMvUkdENlpKTEJuWms1cmdOTUdnV0ZnSU9EZ014aWM2WTkvcFNYejVrTHFzZEhBZEpHYVRpQWVGNXg1dDNqeHZyRVZ5YjZQNEh5cGFqaEtsTGtBdCtlOXJ5OUZELzh3RFZ5Q2tIdHcwbklMY004UkFDOUJjT3hHV29sR1Yvczk3SDE3b0xuUjJJY2VpK256UnVLTE9iU2ExM0NlL2oyak0xS1BJVG5Dc2ZqRDN3MTlqekV6WFk2c0tTVjhlKzV3MzdGaFR4L3VUZmVnODhJeVYxbEpScDVCeWJLVnE5TWFhVjg5VGQzMi9IN1Z0dDdKRFd3VDNPZCtGTitneGFLN2hqMmhzWlhwa0tWWmtTbjlIb2lTNnZDV0VOSklrNHN0ZjBreTBURkc3RDBJbDNibGVYZGNMVGxuLzZjSHhkazU4eEpPYUtuZHlTbklXWGsxU3krOENlUFQ2SUN0eEVjZXZ4d2NMMXFsbjVDQWVzdzllOWk0dTZKVk5YdTdTR1gvZW5LN3o1REFiYS9ZTjJ6a1ViTXM0ZldsK0p6VVhXS0dTOGk4QzFDYk45V1BmZW5LUGMxUDQ4WmxWMjRnN1NoWWJHUU9oWWRmZzcvQ1laVklVVVFCK0g3OG92Vll5VkMxQkFYWllWQ1R5Z290NUREUXZxZ21SdkliV2UzcWZrdnRPaU5JSEpRU0t1SSs0TFpmU1lYQ0lzR3dFb1VKWGl5NXF5U3Bua2NTaE5QeUhqZ0IvYmZDQzdaQWI0VmI5ZTdMVEtYd3M5b1F0alFoRGsxNDJtdnNITVFhN1c4M25MdWhUanhBLzAyZ2VzMWZkOGFIV1AyQ2tTeE5rQnA4amJ6Q3ZDMnZFNXNGYUhvZFRZSE1tN2c5UXcrU0hzVVgyWWsyRDFCUnNpK1NHcmQyRzE1SjFPMzc2ZFZvZWdYSEhZUjdZNnlkZHpwVklkSVVBcmlTL3ZHMmJlMzhxUXlNbWdWRDNlTlRPQUJiZ1A3d0VPZFpaVUpieXZ2dXZYU0ZmYm40SThwQXF1MVFIeFhKZUtIUmYxTFJiNTJXa2RYV0M0STk4NEZrK0JzbnY5TnF6amg0S05CS3UvcjBCMFY2SnUvVnFISWdWSzcxZVkvYmxsR2JVMVh3K3NYTE1VTWFlZUJRN205NkRsV2JIY3RjZ3RGZ2ZPV2dCb3M4N0RZUytFV25hNnh3NUFUMHlnUVh5d3lSK3FqTFFZelFIczZtdlRINnpFR0s4OVF5aEVsMFNxU3J0V2hOYlJpTmNxcytEY2x4UFFsd3M1cHpjVjRVM1ZHV042eUhHMnd6bFpJTmR6NG1IR3ArQm9sUUdSemV6NE0rUnhHUysvS2FkSUxUN0syMmR4OUxhTFdmRFdBUjZGbjFiT3BEcm9rZUU2N1htVHRTdnh6VTZRSXdVZXlsMUoyUjVYSk9WNkZDQ3B1cXdTcG4wYnRDNmNrMjYyVHR0WFRxNVh1MC9xaEZNdmh3eU81N0c4ejJGS2dPekhCQmZ6Y2FNR3J6R0FnbDAzMWxLU0xiWjFkQ0xMNzdhVlBFbm1aWi9MNGJCZVZWRFg2djlpVUl0RTkzT1JtbUN3WnB2NDdzR0lmMlI1QjFmbWVQdjB0R1p6RTRuQWUrazJmWFh2elpLdVBZWGZjNXdnbkpySFlLdDFaL2l6U1JKZldtWDhhMVRkMDlDMW55MGh5QWgrWk5NTllVeGIwNFp0UWhYQjI1cnRXTFlVYThwelREcFhSNGFFZWFYZE44RzJHYllndmJUTThuWGNQU1pON3FFdlFGdlc3TlRHb0hnK3BPcTRPRXQ2MWNzOUlvam1rdXIwNTRQZ2lGRElMZktMRDczQjVaOUdWQ1FuTjlOVUpsSnY1cU9iMStiVXkxNGVBekViUmJrR3lLRmNFRDB1Y2RhaEcrck5RWWc2N05rMEEvM0pMbFJoUFByaDdaSnZ3NHE5YXdiRVhHK0t3T0QwWExuQlc3M0dwNFdSYUp6enkvMS9QQVhqdmZ1NmNOT3piUDRNQ2lZaTZ0djZKWkdWalUvM3FnQWJOWFkyUHBTRm9PR0ZQMjZZK0VhRTdiamR3L3U1M29LM1BKTDlKbGx3QnFFR2QxZ3dVWlhCN00zZkpYSTlibDFxdVVZQU9mM1JtWEh4c2doQVNMZGRhQncvckNhaUMxNXV5UFBFRlZEZVNuWVdOK1lkbzkvYkFuYitZeUcweDVqd2RXWHFJbkNrSldsZFBBZld3bS9zQzRRaytSY2tLUDc4RVRmTlgybEZpaGxta1ZsMzlKWmM5YUpkSGNvT2FhY2VDci91TGJNU2NYdjl4czJRek5YS2lzcEs2ZGpIVDVVakhGWjZqQW1QVXdWNWRncXZLSjZmTVpUNmhQT3dBa1NleVZvSUI0SVBLWlphc2hocFk0VXJBamY5U1p6ZWgwcEFXc1JPcXcxNmtLRWJpWVQ5bzV3ek9HNnpwTmI5dGoxUzJ2R2FNNTBoMC94TEM5TUlOb0xIczZFbWF5aDk3bmRrc1dTdkVaWTJReXUwRnorZW9nY0Fpbmpaa3NqbCs1elVCSHBQRFdVSmJhSnY0dzl4R3ROT3U1bWdRZUExcG9Ha2xYTWNpVkFaL1Uyd1dEd09taWRjUkV0dVU1SkJzVUFOMTBQaER1Y0VlcHl1Yjc5aTY3VllXU1ZKUTMrTTNGbi9DN3dScTIyZzFYRFlXR0grdW5zT29zVjV4N05xSnkyeEZLRWtRSStNQUMwRzlZRmN1N2JZellIRjc2NHV2WUt6VUl3T3Y5alI4K1A2ZWx6TE5OUlFQWkZ6SWlxRm5JNnRibFY2VDZJdHNEak9OSWd5VkNqNXFkZlh1Z2s4UzhVeDBKTDZjc2x5TzdTL1pvVnhYZXFDRko4eGJpS3h6dE4wNnBjSEpBNEFWN01mcVdJcmc4dlRuT3V0Y1NwMWJqYUYxakcrNUNRMW1YMVJWWTBsZERubkh4RlhjczNBRnlESE81SS9raEhFS0ZrQ0R1c3JLS3hXSzdiYm4xb21zY2ZuTjBMUjhnVmpOTnVEMW5MbUoyM3Z3aUd1QU94Y1UrTCtVN1dKU0d3NE16UDhUdWh1eDhhamFVaGxyZHl6RWplQlNZMFZUbXNXNHhNNWc1R0V6M2E0elg2R1pwUDl0aGthUndFbEZsdHBRdjNZR3BvYnF0Q3Nxem1VM0dqNXpDcDc2c0xRNm1oTVpXQ0l5SlI0TTY5b0RlczlzcHZKZXZTdktJTS9BL1NETExTU09MVjhKSytLOFp5bW05cHlvZDhCQm50SkxaVmUwMHNQay9EQjdBNDFJSk9oT0NDcEgrZXp2dmErWmFVb3VaSkhxTS9IZE83VXlybGZLaVJpUG5Hc2IxZVhjQVZkRGI0WWVYNDlMRTNLZDZRZGtwNVRMdnBZQVFHT25rTnFIOUxUSTdiMXNmZTZCbit6VC9KdDdjSC9lTlJSTjJxZzA5TklmSTZwZW1wTE16V0RhTUtEaEdGbUh6LzRxbEl3VU5VUy9xSFNhREErNzNwVUNCMUhsM01STm04TkNOOFN0Q0RYR2tsZTBZdUJrdDVjYlljd0krcXd5TUlkajBGUVIvdDFTa2N4U2ZqMHlsWjZzZjFkWTBsRTZXS20rRWF5UHdqY09QUDZsakNNbUlnNWlZZFo2eGVTcHhzelhNWUF4cTZtbTlNcm9Nb21HbzVSZTZJVmIrZHdPVjhkUHo2UktESFhRS3B6NmVMaGpSTEdUai9LTy9DZllHTUU3LzJOLzZpejJmQW5Yb3kxaHlCMmhjYmsvRFdraHVMaDIwN1dmQ051TWtwcXB5TFI5c0hMQ0hWcWwxRGxYcEVQSTNLS0UyWmlTc3Y4Zk9IbjA3a0pKWjVyRzV0VTVEd3lLWTVZU3VaM1NST2psanBxclg3NnltcGp1eDdScmhYT0hoNk91U3Z4VjZ1aERoSERGM21OSlVKbG1JaGZqTlZ5NE1zM1hRbzlqbVdNcXJzNWtmNXZBR2s2MWFoa21FNCt0SnZRbE5obUFVcTluSTlLa3lNdklWZ2d3RXJGZ0Fqd0J5VGh5N2QyUzJ3RFBLYnNqR29nZnQwMTdhV1dLU3N5eTUxbDhRUWloZ3Vtb0FHdlFhb1FraWtjQnkzUWw1alFrVDJwd1ZnUndManJQZDlSOUNJY1BTUDVwZ3BVNmpzSVlRM25NYzExMjc2K2xhOGpHd3ZVb1BWMDA3OThjQ29MdDFxSWhUcURGTGFNZEY0WmpSczhpamFpdEpNZGNjMWZGREdtanJzbVNFUDlVWEtJQUlFTXlKVHhVSm9nNUhIZThadmI2WXdJWGR3aHNIbnMrMkdNK3FqVFBGU3c1NEtaY3l6NTdQdFlSZWphRVRtUmU3alRBWTJ4Z1dDeUpJZy9mMnNicEQzSkNRYVlZbTVsZW11b1QyVkNnclpTY1pLclBrTVZlUlFQejYzVWxPbCt5eGsyY1BKT1ZKL05VTnRYWU5XVVNmaC9xVktXRmxIWWtTY2ptNXQrbndPKytlcjJxNUZtM1g0enBRcmsySTBOZmh0c2VMa29PNnBPSHVhYm5iRlE1UTlxQWZ0cXNPLzdOYnhRMVVzdWJIVEZjblh4aE44UERXSTdyRzFpSlhpa3dBeUkrWjNoY1g0Q0RqdlQ3a0FYTytZVEIxdU55U09lY3Z3MUVvZjJxSkFWQXV5OHhEc1RWSkxMaVdvcUdkVm9GcDRHR3JWTFhGd0tHYk9EY29ZaHkvYlVPcGNsZ2ZCUXRKZnVxd241TDJ4NENDQkRwdUt5alhSVGNmc1QwTGlySUVhTmMvMGxITlllN0I3SFlQUlVpaXl5R1QzMTMyZ0R2dDRTRmEyVkEvd044blN1UUNDNjRZVjkybDMyS0ZkMjRZRWxDTk1CamR6SmN6M3FSR2lqSlV2WXZxTm93UkJQYXdidHJxUlY2S0dRSHM3VjQ2aHByQ2lSTGFYY2VLb0Uwci9qYnJVMy9VbEpmWlRuQSsydmpZQjkrZHJsVy9tRWoycVora0lwQmNwSXRvRis1SGhTOGoweGVHa3hUTllqU3B6U1EvU3FkSENoblVRa2NWMWRGTnpmNHNNWW9Pa1RZN1I1MnpYZ2ZWQ2NUYk04K3hBU2U4VVlFcTJyRGtiNjg0QlJ4OHlTY1RBbFBYdTU4NnRhOUtjanRmczFNR3JtcW92Rm1wRjdQV2lnditTcXZqQ29IbkVtWGhEa2lHVTFpb3NiOXd4WFhPMVpxendWUjVBWmFVU2F3dG52bVozMWJLOVBlN1RzUm1RUmtwSC80cHRlemlxT0NQeTdWcmRFWUtkVHdTTEZnT0h2RExqZ2x3SkhXcUxpV3J4ZmxFRW9Ccm5QQzhFKzhQZ2k0Ri9TQlBaek1wMm04ZnRiaVJkb3AyMjlMNnVlTDNiZDUyUFV6N1Yrc05lU045NmtnMWw5U3k5Mnd5LzhmWTNPdGxsU3k1T1Z5ZFhJdGUyNHBnUldabVA4U0RCekFUM205WjVCZzRQV01CUFNKSkF4UE9JR0UyQ2c4ZGE3UUtjdXpVNEZnd2ppdi9nWXVML1BpQzZVT2NDMUt2TTVUYW9tb0RyYU1Dd3dGWGlPalZlTGtHdlIzNm9Id2FmUDdDKzRJSmxnU1plMmlyTmU4VVROeTU4ZHRqS3lMQnNabjNzc1NySVJqbVIzbm52NmQ1MVViL3FuUzYzQnJsYm9vV2JXOWVhTG85d25Wa1dXcklPREtRdEJMaDJmTmFqWENEYktRR05YYmpNcVJadHRiQ3pTaWxzTzFPdElsdGFlWitMZmZla2RTMUhZL1p2ZE42Z245REF4djQzM3piNTVDUVFEZkluQU1rRVZwazRMR3V2Q0NuNVpVREpZUThySEhEZjNIV3hKUGdOTmUxN2QwelJTR3VOME9ENURMSTYrQlFzVkN2WGZjMWVEZ0ZDTG5oVWltWDdLeHAvOENncTZMRzNBNTc1ekd6ZFFSU29GVHljb2hlaHhEU09NVWVPWUt0SWlIRVJOaVJuNkVDMnR5NldIWFRBTXN6cE5LdWx2TGRwaDZrVXJsRzFtWHI1YUNSQlZXNnZQaElOdTJialFuTjBnZzZhME1xTEh1UW5YbEV5eE9PWHpzdWEzZ2I2V2s5VXc4VThGQjN2OVFNeHpOdkRUMGpPY2lncHZPS0d4aG1XcXpZdWQ0TDdYd2xDVVFTYlhMY3BZbGNRQ2d0TWEyanVreVhaWlJnTHQ1NnRnK0pTSmNFcldqN1hCaGtIRENyalB2TUhmK3Ivcjh5TXpzWXMvam5kTnMrR1lIUnJPV1NkOVF0bzdBK0VpZFc1eDF4d1VQYWZudzd4ZnNuY3RydkF6UFptNWdHUmxRMTJBOWpuemFPaVNPU09ISElZTVBWYjloTnppaUo4ZmFtWXJ5cnB3TkFHcElZM2RmUTdMWHA5bTRqdllCMjZFbXo2aEZzQWdtMWp3R05xbk1ySUZlcm5hNUh6eE9EN0hYVE9uWW5mMUs0NzFDUTJWUU82N2FFN29vMlk5blFITmhSMUVMRTd2UloxTStiTnNCd0JoL2JyMTZPc3plVFJOVVNpVjFOUHgxbU1vSnFVMFJhR0NNTEE5NkhVVXFoQ3ViaUdOd3NvOWUvZFN6YWI3VjNHY0htQUpIMXFxd0Fmd3dNRE5ScVRZOWJ1cTU2RU5rdHNWODM1c1M3aTNaeU1OaGtWSlV5ZC8zMitPZG1SNy9MQmNsZTN2VkkxS2w3OEtIa2xOem5Cbk10VmZUUXdYT2FWTFBVQVdJakZ0STBHd2xtb003Q0RDWFVHNkU0Um5UTG5tRkF3N0pobnZwb24vTXYzTXJldW10UWIvdmlJVjF1Q3IzNldQR1ZydGVRa2p4SGRBeUJ1NkZpSnZxK0lheWlRcUdBQlZwVHJobk1vYUFmWjVoMUVFSnE0akNINkJHMldrU05LdTFiZXR1cC9KM3dqVlN6R0J1aEk4NTg2dE5OMGtzd2hRSkxmTjRuZU9saSsvRnNrbjF2Z1ZkOTg1WlpiRmQ2a1BiWFc3TWFSRU5pNnJiVSt4aVpkZXFPMlBBeGQ0eHNoSUJmak9IYnI5L2g1RVFtcm16ekFzQWhHa3A5S21WTkQ5dklJRlNjY2J5UXBxbnpwWnlvT1VOckpiQ2NqZUJ2enM1eHlySXZwUHF4dFlKcFpCQXlqWVU4UHRTUlB0QkUwT0lhT3lSbjJ0czFRdmJFd3lzNmw5aCtQQ010czZBd3ZJMmwyeG5EQ1lLZkpIaXFLUzRXTzVFTzk3QWtlRVVvNWxVRUZjV2pJU0YrNS9xRGNFUXVPdkt5T0ljdVJaNUF5V1ZYRjRBYSs1NXRoT0RoaGF5Q0dDdnlSV25PSm5OYVNGeGdsR2p5MlZFZXgyeW5TcXh4eDRDc2xtazFFNk1QVFdlcUpZWEc1QnlmVklFWkxLMjdXQzU5b2I1Unl1cS9mand2UHlFdk1WTlp5QVNFNDhjUWs3Yzl6dXdsNlFXcWVYMEx1c2VDMThiOXo1UXdSQlpDcWJMMFdoTE5JOGVGdDg4K1R3a1pvcS94bnRla091V3N5TzY5V21uNjRVQkVadGJZTXJwVHI5cmN6QVVXbm5TOHZvRm9GWkdMbDJnOSt6L2hmc1kyVVQzQUlUaWtxRTE1NjlkUjM0VzNmNTNXRTB3VWdJUnVaVVpVVTFGMzZ4aWlURThzdzhNOXZVMEdhcDZMK0VnY3drbjZsRTlXMUg2K1BySzBTNTlPc3lUN05KWG43cFVoRjRtQnNIMmlicExLVXRFWkQwbERJU2s1ZWwxV2F4QXlScEhaUml0elpzcjR1VE5WUWZXNVBQazFkd0RjcnRmZW14ZFllazdaKzBYakVZbldzajRRZ21lNy9ybmlvT1NNRHVUVmRrMTRCVy9MTStIQ1dOaTA5YzlJNEJ0bmRvMldqa2NWY3krclA3aWhYME5sd1Y1UHBLNTNBMlZGRTE1OWtLWkh0ZUhjOGpYYVoxVFhqWHd2VitEeHp6YzA4cWhqQkt3RW5rcVZ4U1JoOCtYeUw0S3pWNCtnUHc3RmdaMEs5ckRsYndGSi8yeXBwUVVkUkhGRGp1RnJ2clRrTUN4ME10MFhob1oweHFWdDY1bzhOYUhsdHgyQTVIRjZKNWxKdHR3QWVEZ2llemxySXJnSERVTjNoSkYyMFRrSzlJSU9xMTd3eVFNZC9VZFF5QnBsSVNrU0R0ZlVZQk55cU9IMFVXZjJ6anphOFI4aG5hN3lzSWdQZXNGdlRrOFFEVW16V1BSckl4YktwVGw0Y2RudWlOb3Nla2VnZGNYbEFOakh5RHo0MmJYa1N0V2dkSjJMSzU1eXArYVlabnN1bDJGd3UrbEhFOUVxNUxCNEJJNzhqYU1nR2x3SDZFR1NWZzBKOXIyb1RxLy9PNWtwRzdtTHVpVUFENEYxUFljVFpWTHI3VjJVRFo4ZGZVS1B2TUlNamRBeUdaRkhWbllJWVlEY2d1ZnU1dmdFbURySHBISEZ1ankrWTFWamZrWUVSRmZiaSt1RWdjVkUra2ZESEZGZjRqekJPc1pTdmh6RGFONks1N0l3SWZORlZZRGxyTE9wSEhGek5HVnRsL1dUU2JYZW5ic2o3MG9YdTVtYS9sMlc5WU9wRHpOSERnYStqbi9YMXAyNU5Iem5iQ3pVWUdBTTE5ZzJ0T1hWMWlpanhPaHcvWWQ0emhRZ2QydDdLUVBNNTBSbVE0bGNTSDFHbFNIanRrVnBLdm84V2lFM0RPYUYzcHl0N0EwK1A1Nkk1UmhaZXVROEtaWHNUaTlJeWRhUXZsZXN2WTcrT0o1Q1RXcXpIdEFNME5DSUl4WGxxREhpQlZzbHRZWG5mUm9ybHdQRm5ZbjhpZlllOVNYRmRlUGc2bU9NRlBVdUxsaVFmTnFkeU1FUGp0bGNPMndOYkhzTWF1L094UDN2WEMvQ2tudFZoc0FzaUd2NUhnR0p1bitON1V5ZktvUUZkelFKa1g0cHNweWthQ0FWM2RtME9CWG9WQXNHOG9xUlBKMFVmUzhjMTBUOFB6a3VoQ2JWbCtuSnZ3eGFMMGUycXdVR1ZFM0xGaElvRnBCcXQ0dkx3ZmNSMjRDczhuV1oybDRiNndjK09UUDVIWmp4c3diMW9ReHJMd1FpNmRpUkJhQ2ZXMVBZWVZ2QkVJQUVYV20rczRMTmRpaHRFWnRlZWVsVEZFN0xvWXllVEVza1dvT1ViOHVnZkx1VklrRVFnWms0QVZJTThQKytSaUZyUklEM3JXRm56S1lUVXgwZWR6bFVaSjI3cEtmbEliNmxjd0hSOWRSK1ZHL3gxS1ErZk13b2x1cnk1dTA1MmoyV1h6V04xWmQ0ZGRtSzNvQ1I5MzNTY0V5clJKZnNteHBDdjY4cndrSFJEdHprZ1NYbDc1YVU0ZXAza0wxMzBFSjlLVnVWZXg4djFiUUtINFZ6Vnl0eFpvWnFmR3B4eWk1Qmp6RFZIQUFWNUVUdjNSMnRGSmk1VmQwV1NXSnZQWGtBQmYrTXB6MjBGVDhwa29UbytQZkN3dlhTWVU4b1NweDgrUFVBVHNITWVqbDdETlEwVThCME16KzVxV0RrdmNwM0ZrWElWSXRySEJBcHRRcnFuWHR4RWhtL1BDd2ZDUjlrNEx1NlZ0ekxaTmU1UnA2MlF3WUNGc29HcGxNQUpoajJwd0JzMXh0cTZmUG4yU2UvQ3RDRU00MW9xOU5Qd2Yzc3dLK1ZxTmQybWtLekNQZWhrQTliVE1hOFJCK0VmaDhaMWR6QXU1cnVDOHJpZDZ0T09XTjJqSTlNV0E4RHIxckJ1Y0FkY0l6ekdsV08vbGxPRmdEWXFxMEg0KzJ2dk03bmZ5ZHhObkhLazMwU3hxQkNzemxYUmtIYnhyQS9zcS92SkU1VisxUHZNeExMT3BYZmV6L1hXekhIVHluWi9aMjJJN0d2ckhQcmhBWTJweDhzN3RkOUI3SHJmS0pCQ09YQk9FU05Ec1hXc04zOGJtcmlzNWhpL05ZcWg5bUdiTytzSmIrYzhFZnh6RjI2YmxrS2F6ZDJHOFFjL3dSQ3dhbnFJQnJRYnJvd0liWjBwWTZWQlVERmJ4cW4rS3lKWlRKYnRaNXhUajhvK0RmYnBKY1VBMjZIeFFCcTV6anVtUXFhK0Q1d2NLVlJrcC9zNXF6R011TVIrUDJqUTFQNGg4REJSaTJ0S3RNc2dsL2RHVXBjdytDcHJuS2R3cWRxcFMvWXdLeU5XSTVtVGZxQTd4d3R6Z1hpYmxKRVI0b09ZTHBpSi9mTzYzUjFzMzZEcHZMRmcwbmNpSUd5MjU5STV1dzM0b2FNbzlQcG1RdkRvY2Q0STVkNzB5OHdJVFJxT0FHTWdoTkZWWUJwdUlUWXg4ODRWMGdUTGxJbVFqK1JnWkdhNm42Q1JURnEzZS8rOVhFakJXTmFZVUExVnZwNzdGeXdYVHZBTkRteXpYNHBPcHAyU21CMUhXbFU1V0R4THNlRUlJdFNKTmNiNDNNUjVENytoby94aHNaalU5K0hDYm9oVE9MWS9abEV2TFFjM2s4R0JMRFY1M2Vtb25sZXNNNGxwZU5OQ1VranBrTjdFY3JTejBXcDMxY1ZreE5CQU1aUm9aMzcvOVcwaEJRRnhxemtIKzgwcnIrdzRyM0tKdEdQQzlkS0lMMk1tblZPVUk1V2Jac2VRdlA0RVR6OVcwSmtSaU5qSDRvSEdVek9lQjc1ZVo1UjQ0SFlCRFVDalZMenpiaEw1clV1Mk1MS09iM0hPcUFtcUtXbS9udmtweWphNUFVOGFIQWJGMjgyWnJVN1hHN3F3RDE5bWg0S2RlMlRRY1F6NWk4VCs3Y2dEQ0t5dVN2NzZ5NncyMTAybkRSTyt3UWVDUk1CR1EzUkNqWUE3b2VlT3FwUUdDMlBUYmxjSndyVU9tVmxBb3psSEdrSDNwUFhQZ1lKajhUSUxRSUtYUEdOVFdkQXMzbWh1aEw5S2dDcUhhOWhuTlFmejFGQnZzMCtia1ZZSCszZVNkMThRY0lEQlVyN3hmTXdEejlCOUxDbVBReEpSRVl2UFVlQ3MvUk9LSDQ2OFJRdEpxSFR6NlVUR2lXNXdnekxkT2VwVzJTMkVCd1h3ekVxRGpIUzE4Q2ZtS3M1cjU1R21lMkVRN1R4eVJLOXdyRFdSdUNwVUhaZmxyVDJLdFRzWWh1ejB0OHM5dEFHclhxZjQvOW45a2xqMzlHUUhDUEkzOTRHelY3WnZSeXNhVW0zbTlMR3BiNHVDZGM0NndCdmpVUW5wZnE5eDEyZEFHUmJYOVBGSkgyUGo2L2FFdmU0eVVaVmcrSHA4UXR0eVBnOVRPdFY5TlBiUjRFdzc5angzNlduTUJWalFjRG40SW9CRmJINHRNN3RNZHAzTlROWmtscUt5ZVFxc2FGZGU4RzgxWEZNRWNwT3lRczFYQWJ2Ny9wcktQdWFyUi8rSEtnREtteWxiZ3Y5NTNZUWh2Z2pXQTBsWW9BcHFLZTkvTWxKbGY2S1RxeWROSWRCSkhOVzl5dzk0WWs5MUZLWHIyRlZ2eWNHam9QS3hiNzlKM0ZMMVVycnkrTFpkTXBhK2ZOWjRsSytMMmZTOXFZNm9BMEEzU0dmcWtvb2ZYZ2FXYkZoNzZSQm1NdnNPd2pWS1Bja2F4eTBmWFo4VWpWUDV1RDdPN2JFWWcxS0dwTEYxNnpQRGpNeWpSTlR5Y3Nma3ZDWElJNHBSa2pFOEVsNTZzd0FqbU9Ob0hBdmdTajZFWlh4NDNlMTRJSlh6S3pSM3FpU0N1eWx6VitDSVM4WnNtVkdDWUtrVmlXYTZyMU5aTUVOS1BzaGlmU2RCQlZ4WktkeG9MUzRYZXFPZ2hyZjZoTlRNWDhsK0doVk9OUGdhY2dRRnlQcWpjZHlHRmZWTDJzT1ZVS0R6Z1h2Yzc1MGluWDFOaDBRaEJMS3lyMGliUXBHZHpoTXNoRklTZ3RIQ1p4Mmp2Nm1ZRnRzV2xRVXp6ZVJLOFp5WTk4WThhdW4rVzdETWdKM2pnSUo2dnFRdUZSY2pqVWlzWVgxcEkrNGppWi9jTnk2Y1BZTzJBb0l3UjVUcXBkbDh3MEhJQVZ6V0lLWTBTcTFsay90YWlveDdPZzBhNVRJOWNUVkJQaHhrd1hkdlN6OE5VNjlTRmxWYWlVYWN0Q091eXh0bFV1RmVDc1NGWFJuMW44MmxVR2J4dk4yWmM3ZnJ0cnNQclg3S0UzTzdTSStZdS9zTnlFWmFnMDJGVU9rR2NBaHRsaXhDK20yOUdCSWNlWHdJMThpTGFTTGtsOEpQa2dYdTAxQWR5V0ZlTWN5a21iSzhkKzJoTTErQWZjY0RuK3Y2VDFxdnRiL0FoZzdYM2FkMUE1RS9SNlBaMjNDSEhTUkw5S1NjQ1VHWEYva0RIdFB3eWFkWU12dWhVSXFKU2pNeHpNZ1ZqUStxdGh2eXFRdzNQOFpPWDRkNUpkdjB1ek1LcUVkeHdGMUkwRThLUWdSQ1BVQ2YydGlzZUhjbW9zbVFhWURKWFZpRE85Q1lGYW9Ma2h5ZWdlRW1lYldvRlpZTXUzOVNLY0NITUw2dHNuakhBNmpvQlVqTjIyb3dXa2RjcVlwZTlqYytCMVNjb1JCM3A0VS9PK25pMVNtZkpSSmpnN1NZQ01oaW9tdnJVaXovVUcvek9Va0tKZVdUWUFPck1Pa1Z0MzgweVJaSlQvaFJ1UFg1UnhNOFpjR2V0YVhvLzc5cFNFUmFNeUdIcWRvWEYwanc4MXJxVG83UkV3UGtnNTNUOGNhQXdzeEk0N1NKQ3hSYXdDMmJSSzBmWFMxOUdLc04yRU1uamJtVTJuaGRKNW91Q0NOM0N6bHQ4M0U5SHJIZ0tNVDhIR2k0L2dMbmwxYm81RWttblAvMW1MaGY3SjRTRXc2WXBvNU02V2hyNmJpc3gwTGlFTTFHYVJWRU9SSG9pNC9zUnBGRHdDRUtUMUw3MmxzODNUUkF1RWRVeUdYWmU0RlQyajJYdDR5R01GK2lSYmFaZFBMNzV6eEZIYUlPVjAxYjlPRDJCb3duOVQ5YWVZdkhhNnNsOWdzN1ZDbU4vYlk3WEkwL3JnMm9lKzNLdUVYRTRGeWxjaVlISndwOG0vcnlWS2JNU0hlMmhDOTkrb3R5QlJOR2pJZktCMzdzOFdwaVA3WmZFK0FNZUo3TEJKMFIvanE0c1QvMVM3VzhKakhtcGJubVFrMFRKZzNaVTBFaU1jZTRRcThWNHovYldhV09NNmJnVUg5aEMxNlh4YUh3R1FvaEhkNVhRa3FZL0pqR1dZUGlNblVFTEFjV0oyL25oUHJGbEs4R2hFVjdFYlBjVDQwbi82OXNwVFFmN1lGalpkWVZ3TXlBTXBtT2pUc3R0VUlBSjFHVTQ5b3psS2JRelNxU3Jsb2hJWUZPWHNUenhQdzFOWVdFcVdWeFBLcVNpSS9EYy83SFdpMHd2ZGtkZURSUnBOZG1RYlF5UllKZWlaQWM4M2x6aWQ4bFZka3R0dVRweHI5Nk9YYTU1RUZGWG9XMTZET2RIT29YNE9IZGxsTVlRRUNkK2JwaFJXdkFwbjdmTnJTbWRKZFpBRENxVzRFYURmbi8yQ0g3R1V0RXZ2aFY3OFNXclVpa3ZKTFBUTkZaUTJ6eWhPSWttKzFTTEV3UldIQUpxdFFLTUJUcTN6Rms3M3pWVXR5L1VwOUZhK3dpQmY3Tm5VWDE3UmJDWUJiTnp4TDdYY2xRZkFlUVNLYklTWlFyT0hvcFc1b25QR256Q2dRVmZROVZEQ2R1UjJ6RkYxU3MwTS9OSk1TMFh1ZDhvSm4xQVB0U2Z1eXhOWXlBRnBKazV0OEpCeVhOWGMvTU1jaFBQRzh2U3Q2VzJSYmJhYjhIR0tOUFQxbUhPaUs5M2ZVRXJTMXRaSXMzYjV2K0VJVDdwbFRjZDEzVVBTakI2czlha0JCdHp1bXgreEJaMnhlSnl1RDh6SjhCV2pHVGhqbjVzNHlMMmJrSWpFRGM4OU1uVnZHRlBBTEhlcGRMQ25jdWdGR1grOHdMZ2FVNVhhejhwVGxLTFhHSjU3c2ZlbG0zV3B1L0Nlc1luVkpmNzc4MVZGdXlwbTNaampRT0k0VCtVN0k2SHVOMFErTVJ2NXZteDV2LzEwV213ME1pM2Z6ZWRLeVVpS0pKdVVFdkJ3dllLTWV0dVUrc055UndBN0d4MUNTSmZDNlF1OHRBMGdEcUE0dExmbUN0aWhOV3dtNC9ZemZDdTZqQU50QlFSN1duRmJoSGp4QXJzKy9ZVVhZbEhFUUx6NEUxeTVsbUxhblpiRkE0cEtMa3FIVndTV3BsYmhRbmpQZTM3ZytxeWFCUks1Q1QrL01VVG0xRmR0YmN2alE4V29xSk1jdGtNeEljd1V1bmxkRXhIUXo2eTVzcytxRHVJSU53dTJnU3ZTM2RJRFVUUmpxY05Md2JIZUxMbFgyS04wbkZHaTlvVXlNelpZMVZ3QUd1NG4xLzhHRExEWHJTS1JFR1drajZxd2srUGl3dDBaWUQrQjI5M0o4bnBuQTZ0V2NRSmt3YjZ1UVM4cHRXNTdJeFNFRG9ycmZyNmFqWjVtUVg4OUdoNDhBelNzNkVpZjFnOTQ4VXpNczc2OVltZ25EZm05WFUwZVlBNTVJcnJ3SFVZODJSWnp5VzdUeCtvYVUwOTNrSkNQMEF1eThPTTUrRE02REZyRFhaR1JRL0RQVW9rVzc5bkpHVmhWTU91Q2plaEMwWGlhci9BYUhUQ3M4ZlBRSWFhQThsdmo0Q0MveFVvR2Z4UnRFNkhmd1ZXMmptUHNiL1A5ajVYWnROaytSQkdTaUJCQm9XYnVTVTNSKzZjUXY1bkZRc2F1cE5yQUV1Sm9YNXhvMzRNWitpL3JLUktwb3BVT25wZmUvZHZxcytLSmFNNTQrSktMZ3F2Vkl1aVlCNVBFREtRZEFUbTFoeWxpWE5jaXBDb1FHaElncDFHcE84SU0yMVB0aCswVzZ1c2ZDYmY1NjMvcDV2UXpVU2k4MDV2Vy9qTUF2ekZrMnpBSGRCcTVUb1RPdEV0REFrZnpwbldRR1kvZEpsdEM2cGd0VHo3NDNwRitiMWZTdmx0T1Q5d0ZnK3BmcHVkOFE5WDZSc3dSb0xoaWJRTlB2d2FXei94RWVjQ05RQ3d4OVQ1SkQ1Ylk4VFhRYisvb0dGd3BVZ1VaV2JKaFBlYURBNmhudmkvRWovTjU0L2MrQmVaRmwvOXRlQ1FRM0hFZ2NNTkdMeHRPMVRsY0swM3FpOENOWllXUUxhSG1FS1ltNk9EaEJmSEt4R0NtRTBwQ2o3UTdTMW42ZCtHZkkvNlNFalYwa0FqdUtOMUlYdC8vS2VWNnJ5dWdmVUhGT2RINWQvSGl1L005SER6TUN4SzRWQTBPbHBQWGVjRUlQUlh5V0dBSmtMRFFXc3lwcCtSb1VZeGl3Z0xjS084NEdlRzdtcVdJcmI4dDJQdE8yYjNpeFFYQTZ4WkpYU2hhSG9CdFFSd3plcFVlTXBYSS9RT1ZJUzQvN2srYVFEVW5pQkJaMGM0WVo5VENVb3cwNjFHTTRFUkZZbVNNSW83YmZqUHViZUFSMWtRdWJCZlVIL2k5RWN1dFkxN2VibW5KSkFiRWREcGFRQTJ3RFZTMGwrdXloN3AvdHlFMExiNS85T01CemFFOWZ1dWhVV05hZEFBdkQyanlpRjlBNU1IWU9JcU1TUUwrSHRoS3FlSUVqN0lDNTZhM0dYUlRtYk9pNmIvZW5zd0xmampndkpKTTJuaWQyMG1MeWtWeUxGdUFpWWJ6MU1PQXNabmZMK08waTNJUWcwUlErQ1U1M3NtblNrZG9IWGFzU2t4REJMbS9TWEdWNzBNN21HdWRjY25RRWVuM09SRjU5c3oxd0JXNG1WbkliWVhhYm5UTVJhV1ovV282bmhPOG43NTZpeUVuR1NuKzMzOGE1c1g5U2dPSVBDay9VWVpOSXVxQUJ6RmY2OWlTdG5iOGVrdVVzQjhPNDlFK2xGQ2Z5cDhlNE1pRDUrcGFkKzU0dDFYNk1Rb1NxNit4MDFMY2ZTVkNVZlZ5eEVXY0sxckFZNDI3MU5nZmoyOXFlZm1NMXpBb0I2NGdveFpIamNaWnlkbWxVWVBiMjFYU2kxYW5wQzdEWFRDTmpvbUttUk0wNWZOUkFlRlkzSERhemZUSlhXdE8xVVExdUYrNjY0ZDhEcmFCQyswc0N2a2J1N3p5ekR4VGIzMHBxb05qVEI0ODZXRjZzL2tPN2FiUWNENVByN3JXajRoZ2RkUGxGRGowZDFpNFltQ3NBREpMdU5nZVdDbEdxNnkzSVFNcHhUUE1uWFFZV0lYc3YrSXkyOCsvYkJqQXF6VE9DUmNjck4zaEZla3prV3ZzbDFmbytZK05MNWFBTC9BeXJJRnBVZXZmaktrOTVXVXZ0ZFp6d3JudDVqRTR5MWRHUHZQUzdKSEREMGZ2TS9jdW5qT21vSVp0NXJ6NVdleThQRSt4Q2IvUW1jUlZJRjJkQlBUVU8vSWtTVmVxalJEQTgxZU84MFFmcDNiWS9hdGE2cXZRV1Uzd3Q1OG13bXVZZm5jYVBYamptNk15dWNzOWlkc3VzaitpZVBta2FlL1pqRFQrbzhtNjZndy9wbW15RUxEWHpST0ZJUkx5TEtueHpjcE4rRGRyWDRkN3pRSk5xYmUzclU4aUFMbUFrUUJ0ZUZVdHlkRkNzY1F1cUJuUXZrT0xXbjlocXRxZkdzRWhWd05XVHl4UVpOUGVlVUNDam96cWkxRURKK1VTTml3aXI0TXVHakdUb25BZ3JZcDdldFJoRHVmM3RUL3FTSHo3UGdweEU1RzdybnIyOHJGUFBER1kxeHpSd081NGthaEF5UnlGMkRJWEdQWWo4d2I2UCtxNUxoZXNBellpYkFuUGpFUXYvVDJ3RFVOL3VtbVFoemV6RnJNRXpBRG1UYjlmbys2aU9BOTd4b2FzblM4YXh4aFE5QzU0TnJDb0Q4SVpxaGtyWDhMTGl0alY5TmtZL2xYMm9DWmJrQVRpeDJLMXB1UlRCNGVzNDJhK0swU05SQkYwZFhKMkV3UUJlelVpMEhLRng1eG9yQUZPNDlFOS8xeUJRc3pFelQzdVRVSTQrOHhXdVFOWVpUeXFycmNKUmhHaGt2Vjd2VXFMWHZvOStSb1JORlM4QnVWY0lxME5kWDF6dmJYY3ZKVGZtMEYrRjVlODZUdnpsNml4bzdCVThLZWREQmZxczZLVlVFMmhQeW16TVQ4SVpycmxDMnoxbG9sb1UzejNyZy96NTBHVENFM1B4bU1YY1A5LzB2VDJOZjQ2ajVTQytBR00vWDdab2xwWEpqYkRLOTZGQ3BFT2hOR2FMOUduYWI3UXNGenBLWjZzU2M3dXhTOVlGZ1FEcUFuZTgvbmlyNkUxM3FVZStBUnc2Mzloem9ZRjAyeXh5M0hLSWpSdG55dzE3RHUxcERMRHB3OU42bXFGV0NXS04rWGx0MWpaelFFdjJTbEhacVI0bWxKekc2N055Z3h6THBVUlRTWURPWmppZU5wdmNERFlpRnR2M0xWTFBpMUVMdWxGVHVmaFBJZHF1dkx4aStaR1NET090OHhMZTdML0NxQ29HZmRRN0xXOFJ2SEZuZnhSOWlHV2pWQVROVTYwZHZtendjMWxvQ3VEZUsvTWM4cnY4QzFnVTJOdGk2TmFuSC9WRTRoc3gwQVRUMFJwSExyS00yZ3M1S1FmT0taYVhwQjJOR3N6YnBjME9xU0lvbng0bXRPRTg0cEJ6T2VQSC92VnNYcnpVM3lFVGRER2t0S3VmQjU5T0hkb3hSL3ZUYnRUQVQ4YTBTaXkxY3E1aXUxNHhzaURsZjFhWEdZc05JdUVNdmtJWjFRMTBEcHdRRDdzLzNJMy8xMW5rczFXcmlTOXVxVEg0cmI0dHNIWktDQ1B1Y0p5NnFzOTNsazdkNHdNZzBBT2JrUnpmTjJvQVVrNVJkQUJXTHE2eXBDb2hlWHNZWVk2M2NEQnFIM0JJZFVsSmx0NzI4eElBeXFmbmQ3dkNXUHY2RWJsOStvRGFlZ1lmKzdlTVE5Rm41dHNHMGkyb2ZGb0U3R3hNcFJLUFVIcE05djB6NnQyME1aUnN1ckg0Q1NJNmlPeTNmOE1DVE8zcEcxVVI2R000NFpYaWxtVlhuU2JSOFAzc2d1bmdIczNWRjNQVnN4WXMyRFpWUnZsKzk0cmR6QWlneEJybWR2d0N1K0FpMWhTRUpQV05raU9BT3BVd1FpWGVpa0VsWG1rYTZBemVzMXAyczV3NUY3QUN5bGhpS1VjU2RKK1IvWVlzcUtZZlhOaGJPTGxqL0EvKzZMRjl5RFhDdzZSVmFoL2dhRi9NNlRhUTd3U2hOQmgxTUg4YWV6cGdpb3hwcm5mbVNWRDdWZU5USlZXSU9tRzVCT0JLK1dDanEzOWF1YzZ1TjdZK2trQkp2dnVQdk9KMFFqU0lyWm93akt6aVdQaE1yY3BYLytBdXpib0hVdmxJQjZDeExJVzdFYnh2ZEljbHhQSjhNTUdzdDc1VTFTRm5lSG4wOXBucmF2c1hzT3FDS1BSMnE2bk5UZlh0aXJoQmhudjlyUVM1SXNXWVZBNm5pZmNLaitGWUtCcXk0bC8vT2NwZzdzMEtyUGVaU0w4TkRHZG15QmVvdGRKLzBFNTdiUXZiVi8wU2lEeVFKQUhOZUoyMXhTckxzdTBPOHlMbWE0dWE0ckhPTjEyc3NNM2JjSHJyRjRTKzVtdVQwTzRYWUhobUMxemlmb3lzNS9SQnJjZW5WcVV3d3ZESHpTcDN1TWlqdElCZHE2RHJQY0l1TjBKR0FLTFZEZGNQKzF5UUxiRC9PWk9zTENkU0pjQitnWTZXTlFkSDBoYUVESk5DSjg4dUN5b052NStPOEMrSStNblZpNXB1T294dGl5VEN1QW1PTk5zRFlXakpBWGlYQ2lTVXhXVHI3VE5hZ3poZGpuaVltYjV0cVNpc2RKNnZVTlhGYStJcnhUOU1PYWg4eC9hZzc5ci9abUF5cDNjWUVtcWhxeFZEcUQ1M2l5S1pyanB3N3pUVFdMUXlITlR1RGozOFUvSC9JaXZTN1FEbURKVHBLaFdnOVZVL1Z2Wno0a0ljdW1QSTNvd0s3STRMNmdsNGh3V0Nobk9SZDhsKytEWDFwRDR3Y3Q2a28wWW9hTGJiK25mK0IwOTZHZkJHcUMzZDlxYlBxU3dXWncyT09qdzI4K2ZIbTkyVnBuOFBOdXFsb25xVThVT2p6UHh0cERlRS94dW85TzRHT3Y2VzRBV2grV2thZWF3M1A1MVpyeEczeXJBNno4cGY2VitnVEErWDl3YS9kRlAyL0pOWXkvcmRJQ2VMSXRZc2pZZFpBQSs0SWxPbTFMYUUrTEFpak5NWGliQk5jbm5Sc3djQ3FISjRVbUVOQlBhNDNIM3Qwa2JmVkF4dGI2RU8wRmV3dGhPWnhpSmo5TDk5RkZvT0VxK3ZJY2x1NmR0YWlOdVlYbUl4NkxUNERzaGlONWVLQ3ZYSCtEK0MxOXVmSHk2QlFZRWFFbEQzZnk3eGg5MmgrdEVBVjd5VHdhZTJJZHVVaTh6dm1GMUFYR1dhNHZGeGl5N0NHRXNHaVJobjlIemlYV0ExS3NUK3JadGJaUE5ydmZiWEZTb3RzUXJ6SlMxcWhKaVpGL0REalVxSVBGTWlDMmxpSkFQYWxBVzRwdVoyYmlBbW5iZjIzNDg3VUc2eUUzT2dBZjh5N01WbHBoOWRKYjhMQTZ3ZW9ZZzhneWpuc2h1empNMzJtUWUxT2Z0azRabDVCZFNqTC9LRDEzeWZtc0NVQzA4Z3ppODkrNkFTeE8xVS9FeW1RSThzdnorWDB0RGpsOEdxR0RFRjdaMkVheGJObnpCeU1BemxlUkgvd1lTbFE4YzNkQ01UbE5SWWk2NTNibTUwd2d3Sm9wUml3WEh3N212U1VLdVRDaW9waTl5U0Vwakc0YmpPNjhNbG90eEx1MjI4Z0ZtY1VBRVZzTHIxTXk0bVhpTTVDc0FXOGFXOUM3UW5IRUs0aGFNY2F1K1ROY0Vtb3pxcUVHei9pdEFmQkI4M2Q0VnQzVkhCRkZnV0JpYmhVMGlsRm01OEZ5ajllRnR0Vnd6S0Ixb010QzA0UWdhK016aU9jbFY1aWxSVFphb2w1dzExSXFPeWpLNEo0TFNodUdNRGJYQnlXNmR0c2JCZ3hwelgrYStuM2V3L3FPUVZJZnFROVQ1bHNhVFhwTFlRWXZoLzFtVUszVGRuTlVSMTBNVTVVd1g4UFFQUnBlU3Q2dTAyQ0NxekFLUWdYTzNXMWRxNXdtWWI3YnFCSG1lNU93LzZRdmVZelVlcFdWdlYySyt0bTVHYlIyTjJqT1FXbUpPQk1KS0xGYzBCVEpjYXRxa3dCU3ZkY2ZuN2dtY0xZd3ZqejNxV0g5ZW9wcmMvR2lZVnZBVjYvYlpjR2JQajdpcWI1ZDJKRE5aTk4yWTc5bjJ1QmtZdVl2MDU1TUFoRmIxYTdaSHYxbzFBaGZoR0ljV2hkbWlZeFMxdy9ReWJYd3RCVnRPKzgvcVVXcmdKbEUyODJXVGFtMmU1SzZDZzBZbmIxMGwzb1ZubTgvdmx0SHVMMUM5Q3hreUl0akYzUGE3ODhYYlFTVGNTUEh3Qi9HSXMyK05aTGlnaUtoVTdxUzZXQW53b0o0WVVuNVlEZ01kSnhqbksyemFncXE5QUpzdndTb1htN2NXYll1b3FRSVdKWS9rZmtybmM2OXNJWG44dlJ2ZDlLTkl1NGdONVphUXlFaTBSMmR4algxdlJacUFXc1JqWUhlQXdNWGhINjdWQjk4ZkgrOW85eTZXUDM4c000WDdjZ3AzS1REZ0d6M202QjBWTEF3Q2NneEM2eFZsdUpwMW01dVFxYmppT3c5cEhJSncwK2duQ1lVZHJQVC9kWUI3dHpxV1gya2J4Y2VaU2FPaGdJTGZSQ1QxNFM3OThjQktmeTRoNEVra05BaGZVTURhYUdtbHpUTkpIRFVwWGVRUEc5T1dzdGZMdElqOXJUZ0ZhemxrSm1pUGNEK0Z1ME5yR0hyaDBjNERUVkhMQ3pCVHQxeDNGbllkcnBVRTlZZWJhdjZmbXFpcFg3RWFlM3U4ZTdLbEdjV3Q0czk4alR0aHpZYUhCaXJnWk0xUG9YNjJXK00yaXUwR0ZWbkVlbnh2dzFBVU03eDhXYnJhTW1pM2V0dWNEVThubWVHcVBlTjgxZk1QR0d0K256aUtKZ1ZNcFVCdmN3TmtpaVhNOWZYU3Nwa3hBclVWZlAzN0lxWmRkZ0trTkJza21FSFZDb05va3BhbjREUDhES3lUMS84Uno4VjljTjZTb2lhbU5TS2tWcGs4Z1B3N2dKSllscllpQTlreWswWVZwQVFNNzJKelduTUYrQ0ZLaXdqb0xYcTlKQkpIZVRmdHE0QXM3YnhpaW1uL0hKbVYwQzA0NnZtS2I5VWl1Y2VJYU5Ddm53SHlvSHR2QVEzNFBRbTBnNDhLVkJzaDhMbHpFSG4zMDJLVkxVMFpaQWhFaWZXQy9uSnNSMDZ2NDltU05Na3hIdXU5L0RqYmVYWC9iQW5CK3NORFZ5UFNwOHRheUtKaWtkcHpMaDY4WGpNcnlNdkM5Y1JVUHF2cGozclhrekk5U3RBSVdKRmxLNWdiMXBITDBrQW9mcFJidmx4L0s0TjczRkJwL1R1RkdFTlNydko1NXBMZEtrZE9FZVkvd0lzZGV3N2hRbHk0cFFwNTh3TGpBR1FFaGs2Vko1NGVHcG5lSDhLV0F4SHFDNHdXNktwbkdJMjR6emdWOUhwenNkc0h5VVNwODVZRFYyWldBSzVqY1ZGdXhpeWJLRmlvaC82QWtTYXNyTmVLVVhDQ01xY1hWWE1vOWdjVUh6NEt4eDhaM3FxaVZxQWMzVy9MODB2Qi9JaXJ3UzIzQ1JqVzhwNGo5eXhJWFNuVlVLZUNGaDVOaGlaeTJqZkNwaGptTXRRd2V2ejJrRkJJRnp1MFd5Q2ZWaENmMkpIaDJoSEU1d3ZoYzdnbHFhWHpPd3J4WlZtSmpVMUViWXNpWFF2VW5DeElKcXVVU1R5UFpPR2toMHVrbDVxZUhLZUpDUDhwN3ZjeFN6VXI0ZW5vT0hoRlFFRk9WaUN2dVBGaXMydUg0Ri9VcHE0Q1NpWFZ0TVVZdGpwbS8zcUJVbFYwaXFLMmR5K3FFZVhTV2Z6c2JHdmVBU3RaSG8yek4vdFpTZDlHTkNMTXluNW1VQkNabEtZei9XVlJVOFA3T1B2dGZBRjI2dTlHMVpkd2ZYNzkrV1EvNTBROUFnTzVkSG5lamdhNXRPck9DQm5XOUFuYVpFVFpJdnAvbUpPMGJaQi9yalNGaWgwSE9aeDljdXBqd1h0TndCbVBadVQzR1pjSjFFYmdWN2R0YUtjc24xWXAxT1JyNnNhZUdSM3NCcFhRVmZlVkJDVG50K2prOHFuNFRKK2FBS3c4UmlUSFlxc0E2Q25nM3BwSzJaODQ3VmNkOEdrKzAyVk80QlV0aDYxOFpkMGVMVW90VTM0enVCOGZQOVc3amZmTEorM0pGNWtzNFNDNVZGbGVUKzJGNmppQmVqajh4KzhSbFN5OVVSejVqWmJUSDBDbHB6OVMwWGU5OGg4NUJ1ZjBTN1RaQTltZUNtYzFhZ0pSSFp0QVQydWJuUjFJRmRmaEZ0MVpMaU9lSVMzMk1jTk5YelV2YVBWMHlRRDUzVVVLL295eG9HdW4rbkRSVm5nVVM1WnJvc2tyZ3RkSElnOWtFdkVLcWI5TldTSWcrazdLc3BzZUNUVXh6a2h2WmhuNDUvakdJV3hQaWZLOENoYXliUml1NmN6ZndLR2kvSktBTVhUbm9ZTVA3eWNIL1BSdE50djFRYzdKa25McG40czVMVEd5RTkyNUpGY0NzMGlRWllhUEFoaWdCRDI3K016czBKVkk0ZnJSMEpLekJLQXNYY0grd21vaWxtRVgwL1lBdmlsRDBOYlJ0L0dnN0ZHMFdlMHZXdUxtSlcwRnJDanVxNGozNVQvMUh1czlxRFlWdDVRQVF0R0g0WG94cUNabldBY2I4ZEVud0JhZXAxaHA4NUp1eTdvVjRYL1RZNXYzN01wWXJyc0NtejJaZ0VJYWFqTnFhMlZRYytqNDc5T05XNEJNUkJOL3l4L2V6QkcvNWUvL1ZOeU9vNG5oL1Y3c2NENHltNEtmVEh1RjNTZ1ZmUy9ZaVpWbWc4dkRKY2Z1NDRlYWVyV0hJYnl1Z0FRcTluamh0ODRwZnFoc0M2YlJLRVBqOEdieTB6Ly9Hck1uck1nZlBGU2ZQTTl0U2JFWVNGU1I1Yk9ibXZkako4OTg0bjJ4cjI3OXZlVnVvRzQza0RxcU5tU3ZuTlFwTnVzUk4wSjVYdTFwOSswb0JqdCtYemVycVA4RExOeGNIbGdVa0NtTFRPRWQ4ZmwyMjZWZzd6bFRQN0Nqc3VldkYvZmh2UmtTcHk4dlFSbVQwSGswOHdCeUEyTkR4d2ZoZHAvSnQxNDN1NFdqSzNkZi93cHZTRVVZSWZZZFMwcHM1QWxERXAwaVRBQVdpNVhFeHdWOS9RS3RLb0FZTVZ6MDhHYlZJbWZ3amxjeFZnSDlESisvQjMxSzB1RjdNdDBVWHBmOGNNTHg3RWVzTjZyTVZJSHVtWXRGK2pqZ0tmOHBydFRGdnp5c1plejkrK0dsMnk3TEJGV2J0V0NwdDNMK09nNWxJZ3ZRWTAwQWZoV2pEbGhDV1VoM3lZandoeDdaaHBETmVBSnJhbGpwOW9aRjUwZGl0bHVYeFpsNGh6SndiN0dZdlNtbFhhMmZKS2JVby91c0xiNkxSdEdiY2RrbXpud0cvdHJHcEZSVStPTGplUUFSVWpOeGhwTG5SckZWSG1tZFdFb0F1K0NLR3BKSEFmellYQWh4bHdWSzlNV29nU1hiMHJDQVBBMVl4ak1Rekd4VUZaNllUbkVrSzF5SDAxY1NGVHhNVHdKZERDWGhQYzJsTjIybVpZcllVZ1pjSGcwYzRjYWU2WXlSdlZ1UHlpOTVVcllDOTFnN3lYZjZvMXFpMnVqaHNHTkpMU3FzSTNlUHA0a08rMDZJWXorWktlN29rRUhjNUdlQW55Ty80OXRKdlNIa2drQ094V1VQY08vUUpaRHlKSnlsRmhIVUlmSEFMYmVFMnhXdnBTRDhDelNwSEpiSVRwZGZ6RnI1QWNxNWhJamkxeGhkSDFSZnl5MzFXeE5CR28xcWVQZHl2Q2VNaisvOFBtSHNaQ3cwVTBrRnk1TThWRS9vVUpYWjB4aGw2MVE4N0dEajhmM2MyeHkzcjFzWnkvWkJ2TG5NcUN0OXZvekhxVW9CcDZCTnUvbGR2V3p3MWwzdTV2YXBiNWlTNmFnU0RqcmFxOXhyTEp6Wjc1WW83SUJBdU8zb2huRFlwWlJjOXVPMnh4bnRqZE5rTktFbzZVWFRKa05paUxIeHZmMWdMcXllZ3VTZWd1ZXYrQXQyc1RydjJ0N0lTQWFKaTRwUXlONkFOT1ZTUVRRajNNaEpTWVF6a0tiNFRMTlBVTE9CaFgyVWpmMFgyU2JPcHpGOHFyU2dqbVFnY3lEeitpNnRrT056bXZRL1NUNnh2SkdHMHdYZGlDMFU1WHV5WnZHT2d3aE8rMlQ2SW9hYWNKOHF1MzhUWE9pTHZ1b284SlNIUnROTGRueWFXNmFZSTNObHg4WU9XVGdTcllLb2VXTTdRUGtObFVIbTZtM2hvRXV4UkN5WVlWdEoyQlBmWlE0UEp1OUJxTnFmRGVTQVZobEhBSGFucmttZlFUN0d0SHpENHFRRFRZcThFWnEzWnVHclVaRG5nQTRKbEQzYWNUUExNcFdkSm13Y1dBcHVON1RHb0tHQ0dRNnZWZUxTVzVFZEZLUExHTnpscUtoenk2Tk1GTlJ5ejRkQlVyRHh0MEduWDc5V1VBZEhlUllqUC9GTmFydGlodVpQVU1zcnhmd3NFWERvMjc1WFF4V0ljSm0vWHlFUEV4VFkxeGhVNXZUUnlQSmFXVHBPSXVzY2x4UlhMM25GaHpiTzJYYXRIM3hTT0xPdWFlWkZ4SVBidi9tYXFPaGlxK1hmRVVMYTlNVmZjUW1xTGxQSFdBRHFnR052YnJtaDZYaS90NFVIdlZKY3pKNGFOQXA1RXVpNERQcElRUU5sZEFIL0VEZHBvbC9kRUFsb3NQZHdnTG1GallSdWJwaTRYbEdYZFJraG1oL052ODV3WHR0U1BaYW9SemxnY3EyTlhPOU9nY05DMXJtbjZLajRrdWE3Zlg4elhIbjN0SE84VjhGaTdySG5udWpHZmk5aGUvWXdONUpuUjJhUlZUaUl3Rmk4KzZpQ1pKUEl1SWUzbkZzSXRzY0hSNmZiNyt3bzZsMTFyNG1Mdi9aeDdPalBRMWRTM3lGUzVKQkYyMkZxVWxUNjc5VkEzQktFSER1dWExQVVlN290RlZxd21adng0a0dJZkNhc2dUVVVDOFlqQWhhY1o0NWp4Z3Z0UEw3MVFpTmdJeVlsY3VIbzhoZzArK1UyamJwb1pWbUQwVlFqcDcweDJpVGtWT0ZnaTkrT2gwWFFjWFlJalU0N1BMR0dNdGpKRGxFK2phbzhRcTVDTVdGbmo1dDhheHMxZmlOTmZJMlhlbTN1SG1BK25EVHduZWNmN09ONExGM3ZDL2NldmtWRmZEeVprRldnZDk5VW1BcFBvSWJpd1lIeTVHTGpndS9jRmp0Y2hyYTZxaXVGdFY0bDVOcDdnZXJpTmw5MTA2SCtYQ1pqM3lVa1ArNHdMVUNnd3AzeVFaR3NHOGVZWkZaT25KTjJyZ0dvV25hNDNUZEFPUUtjbE5iUi92M1RMVUFzNkgxTEtscjVYYi9TQUQyK05mVEc1cDNGZlBjdjNHdFpybHJmd3VkWURkL1A0Q1NGK0pyWlBVRHMya05BMzhrb0NiUGlFYjg1WUlkbHZYcFlLNUUrVmpvNy95OWRNWWkwYWh2VjVMb3FLY1JsRW4rWk1RYnl5dkF4U2VJeGRDUUtMcENQbWg2dklENWpsT293ZS9HMXliNm5RU29STUt6cFhtV0lNOTZLek40eFRhMmF2MWsxeVVoT3BUc0wyYzczRkhtQnQ0U3RJb0xqNitkeUF5MDIvM3dWY1ljQWZDdm1aSWE0enFmZzk4L3FwTjd4aDcyTkNaZ2VnUTBsa1NQSjlXbTlqK2dQbE81T1RJTFZJMzFqaHVCTmNHdWtWMSsrbWtOMUpIcWhRZDcrUitlN0M4dHd6WnNKNEMwZEdsMnc4aTN1aUtlVjR3WUZVcUU2bFlWZDVTWCtzcURVV0t3Wk1YVzVQS20wQlNUMXpENW1rNzdtRnhSM0FqQzFuNUpPVm1VUEMwZTFYL3FaM2RIZ1Bta0NaRXA0eDFBeE1ueHBZT09iQWxZZVk3aWJHOWxSNVdhL1ZXNzJNcHhVYUlxaFRiaHY0U1Y3S1lwUDVpaXIxL2dUWUIxUVJqcXg3MkNCZGZpMTlxd3J2T0FpZ0ZKVTRwZXowcm1KYlJZN01NSUpndUlxekErcE9JS0VQOXlXdnB2aGlsUkVzYm5DcFRCZFRxZ2ZIRmk2RVp0NVJidXNrelFyaEp2cUJITGwzYWdxL1J0akljMmlyOGlkbVpaMTM0VDVtNEdZVFYrdmxlbStvRkVsMTJoNHJvMUxpTDFPNjdQcTVvVkRZdFFRUWJQcGVLWi9xV2I5aEJDSkNrdUlzQkQ5MDBtTUNqT3dXVUROVzZjUlJ3T1JaRC9XRjV3NjV4OEhUS3hPUXAycDU1SEhkMDViMkxjbjlBejlDL0pRNTl2RUtYWWM3OGhUUkhUcUFscER3eitNZGEzdStqRktOUUNNZDNuV05UcUxRVk1vNFVTT1BkdFM3UGR3dlNnTTJuc1ZXNDZlMDFzNTNBL29YRTJ2ajlIcmZxRE52SWlSRDUrTjZZcVpQNHJpZ056bi9OaXI2WllZRU5zSUxweFhFYmpZTml6RXBEcytWWERldWd4R2l5aC9iR3p1SDlNbWx6d25mZEdmbFR4bE96eVFnMGpTZURoVzQzdUluSVZkenpNT3M0Z2NXRDJQWldCcDIyOWRVTm9WTFJwU0laVjBITzRLbnBKQkF6UXBXblBBb2ZOZUxPOXVXTVdIYVlpQ1ZVTlZyU3luT2swS2RmUURJSlBIWnNWSEJhZXFDb0k4YWt2RWF4bTBNUmxsSjBPVnhOVUNDbUpqZ3BQd3BwVVdyVmVURHdkRXpQOU1GMkZPZmVrTTA4ZllidzNXTTkzZkxVMkdxaGVoV1FSQjhJOXVDbjdIYWFlOUhrTVpBZURENDNyMjdRcjZ2M1RSVVRBd1FkekUxRFlHUmNRa1RYUEVOcHZwOFYwY2FnYUY5dWk0QngzdEM2VFJ0RUFpN0h1b0RabXdlK1UrTVQzdFdqT1VxS1V3YUFtRWNTZG41RHdGVlViUnNqUjVidVlXYkdiMGxmb1BpVUM4WEVjaml1cmpJaTdMZDc5RS9tRDAydDRldE9BMHUxdGU5MXR4SVBXY2M5Uk5HQkNTbXJDYlFBT241andzUnRoSHBqNjlOVm9rM3NPcTFKT2hqdVNlSjFRNHE0L1pmNkpKS3QrTWkxL1hLdlBzZFlHVkRGWmtlRnJZcVl0bDVGZ0VsU09MYnBlbzBzMmo0RkRwQTlmZDhwNnI1NHBMOWpad3E5ZzhEWnNmeVdTMHI0em1KVm1zU1NKVyttQkZQRHJkeXhyeFNXUTEzaGh0RXNzbTV0QTViRjB6MVdrSUJ3L2ZzL3h2NE03d3NLOFpxVG42RDIvbzdjWkNqUFEzOGltTE9BbkVSMC9qZlBwRzE2TU9sdytkOWw0cXp6aExBeHFHZWFPTTlITTlhaGg4RTdyanBTYTBaVlk1TUl2dEg4SllDLzl5aXp6NE92U29Ob1FlWVJSZEcvQlJhTUFpeVdxL3lqb2tSRXVMWnZjcnhyUWN3SXFYYmVMMDhMTXBlYjlabmYrSGJpTnZ6OTB1UWN3ZElWaVdrNnN4dzNGY3BaUWUrandQNWVsRGVHL3h3NUxzWFU4Ykk3QTQxb2hpSFIyY1RYOUpUTnZvR3hMRDlGejM4UGZqQ1Q1TVAvVTFzL1dTaUEwektLTU8vVlB4RlB3Z1RsN1g4SEFrdnpibmxlS2lrbGY3VEt3TzY3by85RS83TVFsNGMyWldXVkRDY01kekN2OVJEcUFHcjIxaUlSQllsTGxPYVRndERzVE95dTdKR2EvcUJmSGFDalhVMjZDWHVRNHkwQ1IzZS84ZkNYVG40VU5KYUI0RnUyR3pFUFdZMFJGN3F0MkNLb1poNWtrSWpnU1FCcGxBcGp3S3UwUnNBRjBMZ3hZMm5VZU5ZOVdzQ1ljZWRrWkxlQXA3NS81d1B4NUZibVA2aWVEUFY1eVBoMzJZdzMyMDRoc0RuZUU5VTlNRmhsMTM0alVWRVIreHE5L0FZemNBMVlEK0Nmb010TUpCTExJclN0dkU4K2dpK0M5TlFUOSsxYUJ0S1pWMk1UWndVU21NcXl4Q0gvaXhsck5qZDJzM2NkOGFLcUNZa2Y2b2k5cTBGUU9lUDVpMnROT3pLendVS1dUYkVsUXdqVzB2QldDUnZvOUYrSlU4ZUpmMzZUUE8zeTdzZ0FKVGFQVloxUjJZcUMrWlAySG4zamFobzdRdHJYZEo0WmtqcTdFenVVN094OTZCamQ1L0JIUy9ZQmM1bFFHUTlHdCtxZEtvRGtkVDdrRDcrU014WituWnkvUjI0aUEvTlVzTUtXQnpvR1R3YjJFdlZIV1BLVUZiekdjMjNmN3pLR1M2emlnQVp0QTRuclRmSHF0WnFXZlU5NGUwaVA5dGhoS1lrazhIWlhnL3RNbjZzMmFPOExxSVdxaGpJUm5kMHNyZXppSWVjUnhpb3NsQ2FBdENtcVc2SUFtaGc1bnc3TE9MTHlRK2V1MjY4ZVJiVGJNaVdteEtZOU1FNWZEVUh5NytWVXZ0OElKRkYzRFEwOUo1aFN2Vk81ZU9pTFM4RjhRNU9jTnFHYWJCUTN3SXlwL3p6T1FZVEx2allqK3hJU3p4SlN3a0FHRERHUnFvWmJDcnBoMVgyMFhEZ0d0c21oN1lHbStKVHd3MzJrSjlxRk1zNUU0ZGRiTGlLUGtFbXNXbnIxbFdRSnhWR2h2Ujg0R2JwN1BqUnd1NGFGb2JhZm43UUpPa2J2eVp3UDd6ZUErYXVuUisxZjlZUGdBeFRXSE5KbzRidG1GemVlTzYzNmx3bGhGeWxiVktLcWY5RFJWUzAyZVEvTVFBMnBUc1F6TnZxZU56NHcxL1RaUW9VV3dnNk8xcnkzc1FsRGxRaFVrczgwYy8rZ3NGR21RVGFoUXRrU1doL2VEWmhXWUZVYVBkdDFFUTBNK1UwSkRicTVaelk1dFJsdzI5d0xUYjJvQlRTeG4rS3dMZDVTTklSRnlua01BVzl6Rko1ck5GZjY1MDhmOGR1N09QTitsNDY2dVFRWUthd1VzOXpwM0Y3TWpjc3puN3lITTRnbWVwSXRVZHl6V3dmdVZhcnFYL0lBZ3I5d2VyNWRKdW85blg3ckZKU2hyejZDNzN4V2diYzFlbGlJYzBqb2o1RjBYV09VQnlWS2lJWjhTRm1XbFpyR3ZZZmZBTC9QdXhNaVpXYjN1bHFwcDVEb3AvbXE5STFGdU9HVTBuNElEc250VTczME0wRVRWcXAvcEdHQlNza2p5bDFRK3Vta3ltNWNyVDVSckhCWDdIa3hGeEZQQm4xN2t5VDFKK253TXpQNFZ2YXpsNkYwcUptbThWOVRlaXFzMzhMb2Rjdyt4cWYxeld2b3BjZ0RsUmN3by9mS0FPTytWSFkxbXJtYy81SnlWMG1SRVRRWms0aVZjTk1ETTBhaGJWVVRnQ2RnczBtMmxZOFh6bkNPMmFGSzRoWEhPRVcyVHNFWlpvUDA0Q0ZNVzNjRUpUbnR0cFlHK1NHWDFQTXpqUjZxMmVaZzVaenp1b2xJOGdvMU9CVnhZNHJHSngvemE1MnR3ZndhVkdVODZUVC9Obll4RlFMYkR5N3BJcVhpTXkwMnhTdVVUb09vTGxEbmR2L0haQXR5TFg2R21IVUpxREFNTldVeTUzUGZFRmFVeFJMLzE5a0E0YXBUQ3cwSUlmRjRMN3diRDZSaEZ0TzRhK2VYNHF3TXNucVRPTTJBY3FETFVycml0YlpBbUZ3VTZoZU96OUNzWjZyNnhjVytCdzV4bkx4ZFkvN0JQSndpTXB4bExYaHAwN096QVRiSDduVzVZNU1sUmVwSzBOY1hBTnZIbkhlQldRWUduRkdYeGlTVGJROHdWK1JBb2tuL2h3RkZBZHdZZkxoVnZLOW5xa1cvRVR3Vll0Y1h3NXM0QXp1YTMwaHRNTGdobThWSmFZQkNacUhNZmJnZUxQbFhqN3NoUVpNbzBEeHdjcGVnaFF1dGV2MGIxUmp4ckhvWU9QY1NPL1JHRlBrMHlGSXhESmRJaHR0ZjN2QzFYRFpXaFdnb3BBR2xrbW90NUIrV3BnR0MrMzlzWGI4S2FvOXJ2V01FQUQwOTNGb0FsQmpyTGhVWWhOdEFYbm5ueGZqY1greURzcE1XRHE1ck5mejNSOEppbDIwZFZnRXBkUGdYOWVkYWRYL1lyYnVscXMxT1FxN1NTcUlBVTNSMXlSZVlISVhLbXVQUFd5SThpd2V5eFY3TG9kY2Qrd3Y1V2dVeG1jZXhYZmJYSTVLT1BtYmN1ZlJPM2FIMG1uMSt0NEoxc1NnMlMwOFBDanNkNXd2bCtGL0NnUmRZcyt3dVUvR2VXZEdXYnNMcktKSmlEc1BpWGxTeSsraXBtS2graDJJbFRMck9vbkR6MW11MDZBWndvZHRLWXQ3NngrUzdsbjBQS01yb1Z3M1RCQUYvUDNibkoyQkJUSnppcCtPOVFpQmxpd05vcWJWT0N1aDh1dHdDdm9FVjRqZDUwQk9XdlFUOWFGNmFHVWh0L3JHRVI4aGJCQ2ZxU1I4VzRWL3lzcXFhdTBmcDBVUmhLKzU1TWZDd0V5WVp4SDJKSVZMSndPNGN1Vm9IeWRZSE5qOUNrVUd0SHpKWGZsZ3ZmRE1wRTVBUm8wbExaRWtDSUpyNWlMVjRGMnRHMS9HRmJKalMyOWdFYXd1RFJPV3ZyMEp2a0drdkpJZmtmcWtEU1pyME04dXNLTS9zRHZGSSt3dEpFOUNORnBMekZ2ZTJKTm1PTVEyMVl1YjduMzRkYUQ4YzNHTmhQbW9xT0dLc2pZdW5pZm5RcTRTZCt0MkI4Q1VuSWZuTXZLWEFqYUwvYnU3ZzRRbGxWci9OWVVXeTdOSTh4NStLQUIxRFo4ZXFEQUh2dytkdHBudjNvY3V0RE1nYlM2N3B5VjY0cWQra0N5R0w4T0FhRmtKdUgxVzdLNE1qbVdWVWRSQmNod3dYQ2JBK0dWRmlnZmVZdm5mN2c0Z0k5dWVJZmcwMXVRVy9ZemlIU1ZYVEY2ZXEyc2RES2wrZmplcWtabTgvdnJCM0F4YnNrL3hRa25ieWhLWGtkRGsxQ3czLzM3VTRmRmM0Uy95RVBndHJIdmZMckpnRFVBeWEwWlJpNkJlZTdsektUOUlvQlVINlFqakc1LzBKRk05eVp2S1M2Slpsd01sazV4R1BDeUM1UFA3MTQwaGg5eFpobGkvSmVhR1VJeUg3RkZFV2ppNVdWMjBsM1RVZWovVEx3eFhVS1RNMlVVeDgyVHAzcTk2ZGpXeHVyQnp6ckVzSlVoRVJFY3lFbVljalNKQXRzbjUyd3RzeGo5T1J4QjI4cXFXdFg3S1ZlZk01WVgyRnRQT3lDUXBQcWxqRlVObXp0QzhkWVJGV01qTm1OZ2I5TTdHaGxkWWgvOWYwSmFYeDEyaE1ScDlBTFNJSWl4TDQ0bkVnK244UmtFOFE5MHpYczBoRmFVdGpQai90elZrV3pUWUdtNUF0aGphWDYvNlZVSlZTZ2J2a2NtdHNrSjlFdFZQOFY5YytKTFFEZHRtVWZNRnZQc1FLdlZmZW82ZktqeElwVXJ0eURodjZ5ZGFjdWkxV3lLM0pnRzVTUlB0U1pjd21mVFllL0c1ZkttbWJ6amx5d2RTRGJTRGlFNmVpRkRYK3gvTHhiTGI2S1NqMVNFY0dWWlFvSzh3RTZMZi9Na2RmamFZWVR5eW9VUkorTmhBa1U5TGtnbHNBWWVBekVIeWVWK29YeDUvMWNNQkZQczE4QWNLL3pPZGorRVp3TWdtQzNHVWFOeVFKN3A4ZS9lcE9VNU5USjBwNHByZDk1U3ZJUmlaVGtjQTNrbU5RVUxEaGpQTTRReEdUcjNlL2M1by9BNFJ3MnlRYStYRzVCaVZjMGFoOUo1SEtSUlZHaXhPNVNhT21JZFJ5QS9oUXlULzAzYWFxT2FSOVZIQjhnbE9LQ2FqOVF6RjY0VEhFVWxVOTJmZVdxTkJzVCtkODNaSjJZSnUxU3UxRU5rbm5qU2lXcTNGa3BaUjE0bGlKYnN4eGlydVlJemNpVEQxWElqUEh0MG9FS2N0ejgvd2sybVJrc1hpczJCSXBmMUYxSGtwR2dhMXcwWENPS2txSk9nUWF6aWZjdmpqYW1DenhpS2hpSEFmWDBxaitSTkc3YzVjMG94bXlKTm9pMDFCVDJRRDNJOTFHdE1ZVzZocnZzVi96VTl3QXBtS2NxaDE1R1dXczJKV0xqK3VUTTV5N011NlNFTGlCajhtSEIwMFFwNlYyeUtub1VKK25RelhNNEd6RjBnYjNMS1UzR1dhT05tdVp1MlB6M2pUUmNNMVdhcTgwTHM5dlY2OWhNalpjbjE2eitVRDhLeW5rVzN5ZTlON3ZMajZialNTRFZEVGlHQ3duQkVlWlJjQVphSVRiUVJibHBMSUd6TG1SWklPb0J1dnNoWGM0YnFwTVc4NnZocG9KVnh6Z3h0VWpPWXBLbVBoOXJZd0ZrdEtaWWNTdURKYXJYc2JlcnpUaUhHd0tDVkJZT0RyM0VNRVlreTFRL2owc2F1R2l6NzRPVXYwbC84Q3hBMWVLNmxjRkJNVzJYT21wTndMbGYwSndDa1hkT010Vk8zN29QVHYyVWJnU0taMElGNDdhRi9JVmhmRmdoNFhqd08rTnlxaXFwSG9saHAyL0RFNTY0N0ppazVTRkx2b1NnTUZXdkFqcXVrdWtud2xDZ04rUEl2aXd4UzdxbnlDTzgzSHp3K1hEcG5vOGx5RWhlc2xtdHdhcXl1aHdhL2RqWnM0OG1sdFJScFNkUEViaGMxTWlvbktFOFFjWWpYWTFCdk1paTRaMk45Sy9kNHpoVTUrTnVIWFF0YmZNR0ZiMGU3d3VzNXZkaVBLZGo3clJyYTRnZ2t3UHdLQW9za1dBeGZRN2I3bllRUmJMTmR4VWhZSHBKQ1BsdHJFWTgxYUR1cFhjZkZHYWJDemVPNllQS3ZXN0dFVFZQVkJRM2hDYlZ0RkdDUGE0cWwwSTlveHpCVXUwSHFXellFYVRLZjIrZTNNMHJEMFVsYU5oNmljSEhXbUJzbkZaS3hnd3hSZTgxemZ1aTFkVk8yYXZJcGd5M1NzV0kvT3BhTkNCaEU1TytWVHdkZVdRakYwcitiQWtMeTliUkFJaGQzK3VHdGJQaGJFb05peHo2OXNsam8zcFlvemo3R0UzNW51c2cyRVkrODJ3d2ZCVERXWThCSklLbTA4NU1MMHBsd3paNkFtRjk2L3FRWkgzWkZHQ2ZQV3B5eGx6WlFqRTlTa2dqVG1rbDV1My9ya2FwSkV0Z3Jkdm9FRnJHcVp5RXRiM2RoYU9rZDNielBmekR3ZUFsdE40emhZRm80RTJMSXlSS1VaKzhRUnlrY05pM20zdHFab2paUXZxRU5VUGl5dEdnTE9jdGt1MzBUQ2hENlpKc3dmZEJaa1JqS2tkSDBIK1FuckJVbDZrRERIa2RDa3ZIbld0c3kzL2ZPdkljWVVsb3diQWJkM05IcDRPRmRUb01KTk1wN3NSYmFvOVlJUVQ0ZWFORWd4bVd0TjdtblNEQThuQ0FldnNnOVA3eWRkVDNUWUhYYTdub24zRm5CYjc5eXA0bUFmbmJid243QzVKSGE4Rm0wL2xmQjJDR0dxSW95SytrRDBTdnZ0b0FYNDU4aFEzSTNyNDJ0K3RqRzkwZU9DUGk5anNIdEh1aWhTWXY4WUhmMTdnQ2pXY3lodk9aL09UVE1abUovNEc2dkdkTnZSTDhCOWdveFF5a1YvVXdNNWxoSmhrR0pxWGFYcWZ1OXBvbTFKR0w1N09HbkRxR2d3YVhPTE0wR1BoYnBMSmZsM1lPRUVMSGVzbW8vZXBwaXNsU21SdCtqMmphMWlpWURQWkQ1L0pYUisrcVlCM2pPODJ5NXF5Z1dhZjhxQjRYZWVlRzk5c3FiQ0d6WkpOTmo5WHB5dUpMVjMyMDVFQmR0dzRXSWNRSzlIVjlJSzhBY1pZVE5oSmJRVmJrRk5mTHNqZUwyTFRDR0cvb1RQTTBWbzJVa25CK3UzNnJjRUorMUhJL2hCUWJUVXcvRHF4ZVJ6YkxEcG8yQ05maTc3YnByNjRCbm5rVUdQdFZOaW9aWGRsaWFYUGhrY2h2MVVXQzFQb3NCRmhML0FoOW4vMGwzSVZpNm40cEcrRjh4bVpOTW00VC9jc1RJR1JSTDBCL3Z1LzdJL0NIcjJKWEZydmdKWGdPNTFJMXBXc0tCVjJIaU1SRXhYSlNHMnlnSmhMYWkzM3lON2VoL2VPanVveEt6cTBocUh0bmxzUEQzU0pFVE5QdDFZczljVU5MREZTdjVOeTMxVFFlSmN0Zm82bitmYVBBTUtEM25OTm03eVpYd3doZ2xPbW9Say9xWGI1R2tnSlA1Z1o1NVRZRmZwek9ETVpCZW9hMDB3MDB1WU4raDJUb0ZCOC9DK08rZTZVWGs2QTM5ZnJ3WjJUb281ekpjdW51ZGZWQ3lzclpCVjhzYnVrd2ozR2ZKWUtoT1gvRk9BRFdocGJScm9wUy81MFdkWGE3RUZjV25iMm5uTVFpdlpJRmIyUWNYWjNIOFJON2tsdWR6QzR0QW5mam1BdEFOOVpUVDRDdVJSK1NsamhtakxMcVFyKzdvNU9pbUxSTDZreFlrQWJYekQ4anBzRG1oU3F2MGQ1M2VtODRXOXBheWYrQjdBWDBvVUZnMHVxb0M2SHhReTN6RE5WdWhubGt2NEZRbDMwcTFsYmdITjNPSTZTV1pCUlNnY2k2YkEvZDJmcUVMN1dHaGJmMFhZeFFCUXJIMjdoUWtTa1hrbkNHVXNhS1RTYWl3TFhWNVl4TENyaVNCNHdrSXdBYTluZVl5MkZpWXp4T3lZcmhqbk8yWEh4M1Rid2ZpUVUzdUIrdGZXV3JPWkxsWmFabGdrZkRaSGUvL1V4MHJiKzZxNU5DQ2F3Y0JZcEYyTnhmVlZiV21SUGxWck1MRlZHbE9XdFNYTUtyTUUzUVU1WHRSSER3Ri9FODlINUJHYXJLa0NzVEs5RFNxSkdheDgxVjIxTUxkVGwzdmpzVGlqak10SG95aW8rMHlGVGV2aHBFSHVScWJseFJ3bi9taC8xZ1lzRFBXN09UZENWT0dmang2aTRLclNRZ0czSjFtSy9qQStwYmtMbUc2WkJZWWltNUJLSHNENnhQTUdyUmJLd0JQNHRna0lNR3JZY2RIK3ZGbi9wSWVjV2pPVWtjeHJ0NUxucXhqU3kxN1pOR2NvdkkxQVNEa0dQWXdwYXV2UkFodmp0ejB6cGJzeDJvRUVVS2lRRVZkRDQrSlVUV1Q1SHVyZFF0NTIyV0VrT3JVRDFBRGcrYmM0cU5sZmxMRTlnZnFROEhxT09lK1hlZFR0UlZvN2F5REtLbittN2VSTUtIWXFSL21aaXhmekxVNjhMQ3BPT3VMaTY4ZzYvUVNzdElUdms2VFpTQUdCVldrMVFMN09QOUV3SVJucW55ZFlWMEhqS3VMMHcrWDB2Vllkc3FwaURLcmNPdWEwRkZXQ2RvalpIaWRabnZzNGducXRsZ09XSUY2d0pYN2xkc05SbUZ6SXErNXZjQi84U0hCTkp0RFQvNjA5bFhZYk5wRTFPVDlCMTFRbjdBUUxtNWNKZzJhTHZZUjlqZVllTDFseW54WkhWSmlOVG9hdWV1azBZT3dCVjhub3F4aGVld1I3dWIybzdTTWpyU01hR2ZZVVpiUG5LSko0eFREelF5ZkdYTnNPTFhkSGU4Q1ZaK281ekxETmxUL2IwdUl4b0t3aDl2VmRLR3huNHF4ZDlpdTRTRlBvSHdLZjlnOHVDK3NCOEFiT1Y3NnE2cWJ5OVdwYmNyMFJvaVZaQ094Y2pZZ082VlhvbTZrRkIrbW13YVAvY29xenhFRnM2VGh4a0pSR1F5bFVBWWJRRXZ4L253TWN5b3psZVdIR004aHV4blBaMEwxc3puNmpOblJ5WlpRYU11THZBck9GRGNJdVBaY1Nub2hycWw5K3p3cDZhakxJTWR4bkJDcU1Rc0JPbnhOZ2Z6dmFCZ3djZkwxNFJ2aUEzTVFqRXUzUXA4M0ZyM3ZDRHZqODRJRHYzYUxDaFgxTWUxZE8raGhsODNkeWVaZFNJMEZma24wSkttNkxtL3ozcG1ndU1vNFoyUVFYTjJRaGtyaGVFRG1mcWZ6Wm51OEk0bjlPQUlNSGc1UTNzaDRtaFdUM0xGT0hRN0c4UlhtT1VCeko0SFN6L1VwWlZTeVp6Rko0bWlpbDBadkQ4S0J6RHBBemN0R2kvZW93Nk9RNDJqTzhGTGtzNWlhTjkzTE94bHdsczY0MXN5WGdTS2RheXFDU3dVWlNSVEdISmVwbjg0dGpZYm1ZL3I5Q0o2QlR0aDBOMGVGS3VFOVN6Mlc1YjYzWkRaNEUrUnh5WWlWd09TUGxuSnlpajJVZ2wxYWt3MzZFZjk0LzFKaXFLd1dUUG15c2grVDU5ZUFyc1FGN2x1UVdqRnBPb1FXbHcvVWl6MEgrT2ZPZGRiWFBDM3FHN05wV1d5eUpUaTYvaVhwTlBheHNJQWxPMG9tckUyQWRvSEFvL1JCMDVXMlNkUHVYdHJUR3hOelNwaWQ0Q2NGRXhER1ZFL1ZkSFp1S1J4VU4zZWtaYzRYS1d1VkVNSGZSNExqSC9LY3R3TVV3UDgvVTZiMWloV3lmMWgweVBvdXgwSVBaRjBVUFdrWVlMc2wxSlU1cFdpa0d5NUlJekw2OHpBOWpZYlhNTDY3czJ6TG9FN3Z2U2U3UXdYRzB3TlVreVRBV0hqa2Urek44NlRQR1pkZ3haRm9VZ3BYaVNBeHdHRTZaTGFNQWVwb1hEVE9zNU53WjR2QWpRZWtRT2I1NGpxOXcrRXl3Ymd3a0VpaVBxM1Zmb1MwWkNnQXJmc3BCbWtpYTlxSkJzdlRzS0lWcndSakx3N0xLWVhmNEE4VXF5dHFCQlROL0dZelBGVnZ3clE4Zk1qSWZhRFo4ek00a1NsakFIL3FrVUgxak1vU3F1cjczd1ZoSSsrZlYreER2alg0cmFhNEhpMzd1bGxTT2dnZUhJMXFweUxCNENuMFd2OFpnT1NiUkxSRXM0L0E0V0FqN3F5M053cUdSZ05ocGRUOHVZbStKRVgwSmY1ejFpTkhaVVMySGZmeXRQMjQ4VGdKeDRML1Q4U1lKL3ZuR2FZNVRRRkN2TDhKWjdmMzhWeEFhcFR6dVQvaW8xQnM4N1ZZZ2pZU1FldDRZbFpZY1NKSHVaWFJKVlhQalJNYmtRSXJpZFN6N1pKQjFEWGR3VVN6Q1RRNG1SSForV0pMVkV1R1Q0NHZDdWtPUmJFRngxKytPdUpLOEQyek0xMG42Sk9FMlJmVGtFSkw3Q2djU3AxTmIzeXExUEdRL2U5WnFFem4ySko2bjFZLzVCQkZRQzBHbW04WWF1bnkzQlVsblNQcjFLbTVEN2ZnTW5vWUwvdzZjQ2VHUFNHUklxUVhmS2x3Y2JhbGJVT2lZRVhxb2JOQkpoZm9WNGkvNXRGWEcwZm5ycWdUMm5SQ0tGcFgxNi9rYUFpeXZBYVJaSVcveVZBaXJxdU1FLzFtc2phS2pkTFc3WjNqRHRROVZBZTJOSDkxVmtwSUllNUxaa2x6NE1qeUV2Mk1vWGJmSER1VTUwZUMwc0xVeVRhWVMvY2NDS01DSlJJckVOSEE2THpmeG1pVTNBbTVmZ1YzY0F5bGdtNEh2bHdseWw2dDBHMmVpak1OajVYOW1MdW9XRUFpQXQreE1UM2k5MXhvazJnS3RoQ2N6dUdTWDBhbnRXMkc1SVNtZEMvNGxkc1NpZ2U1NUxBNDBON2ZwWHFxQy83ZzFiRi9PMFhCMVN6b0NPV1I4RzE1NXhaQnBaWG5EZkJVelVmYzBpZVlTbFQ2NTJ1VkNDd0U3cmNMSUlEc21Ed1JzMW5uOFk3cTljbDdmemMvdEh3M1NHeGFSbk5HWFlZOGxEWFB4SHYxN05ydFc4bDZzTkJjK0lCOTFIYXVkY3hQTEkrNks3RW9YTDM5ZUhMbzk5akREbTEySjhGa0JrU3NjTzVrSUh5Ni92bHFqd0YzemFFUHo1T1NENDdKZTZCMVY3NnJ1QUdSeXMvVS9mVmxPNTRETUlRaWJzV1l0UEJxUnd4OVVaeWlZb0ZEdDNxaFg1YTJERkY4eUZPdnJRcEcwb004bWViUnBCWHFVMnVVS2lvT1B5akFGbjZWSUJqVmtnTHdpd21aMjBMNmxzWHR2aldHSzdvNDhNRTkyY3VheVloR25sa2QxS2gwWTVDKzhJUDFVc2FNaE0xNURuM0NQNDZ2cWZYaWFsSjNScXp2d3dXS1d5QzJvam9KL2ZiMHFRbDdsK3VuOW1vK3V2WmFrcjVBdi9WVzZQdUhucXNCYzZRSWtVYjJpUjZ3V1N4azBZTWhtWDBQejRmWTdsME0vQkRMdXdnWFE0NVJTTCtLMnFsaHNsc0tRNWFJdlBud2ZORTBPWHgvNXUwWUF6dzZOSE1TMER2YVBFbXJ6UmNEZTZMT09SQU9WMjFrLzBXQjZCNzJzZXlVaHFGOXBvWEo4bElycW5ibS9CQzR3SDNZUC9iazhyU1U4eTVIM1pRTGFCQVpaRlBJTjhORFYzNG9RNDQvb2FsaWJUNUdiSGEwT2pjWFBtSmNxcktyU1I0YjNUb3JjN3hlNjlndzc3d0grejQ0UEMvc2RlRTN4Mm1XdGYwOTJveDd2dnc2R2pyTnA1Tkp6TXdDbWIyZisyc3ZLTjdwYTVUNHlJaTlxWkY3Y1JWS1BXU0hvODdaMU9JRCs0NnFoODZuTmJBVWMwcEFFYnNPNmNFRTR2UDBrRkZWYXIxSmR5ZU9WRmZ6KzZmSFRGODlZNTVxdTJ6eldtZ2xFalp2RVpHUk5Bc3paR3dYZW9CM3Flb1NjNHhtM3Z1aFJYUElkVjI3akViSTh0dlVZRW1yUGpLOS9zbDJJaDZRZ2o3NXE2RjJ2UDlyZEg3ZzFNU3JCdDVYZWlXSURCUE94M2tUNlVlYTlDWEs1MFFPYm5lMnNDMitoNVF0cEwxWGhaS25IVFJjaWRjNVRMZEU0N0NOdk9kK3c2OTZxcThnYmxrNUVjeXgxRU5yOWVadTQ0VTh4SDBBSDNLckJPb20vMlBpRW9xLzBQRXlzVzNoRHhsZVNTaDM5aGJUWDNIRkljSnFNSnU3cHNZWWkzMzBEZXFvYXZvaVRvOXdvOGJKR25obDR2amdaMkIvWU0zcjdYZzdiZVY1emJpb2x3ZWxLb3BXcEliVXlmMmx1UElxNDhKOGJSei9EYy9YY2xYZ2MxcGJFRjA4S1Q4d0tUSzc1cGNsbTZEWHZ4UHBJcld5VEh1RU4zaUdCSWRsMWtPcVMwbzJ2WFhBaHVYK1RFSk1CT09YUFE0RTZxVlFaNnl1cXRVZVRRZW1PdmUxeFAzQVFKeTJQL2NsL1EzZ2hpR0ZNaDJwdGsrZnJLSU56TG96SVpISC9YVXFVYmZaTkRWd1psZEx4Y21zOERzWUxDa1Q1YlRJUWw4dlZzUFpKUmpHdU1jQ2ZFV1JoWWM3dks5Syt1MWZYVGd4REZwbWhBWDBoaU1hSU0yZzlNYm90bUhxK0IwRzdjOFFieW1TZzA3SjlEYXpydTJFZGFsZmpGZTh6UG15K0FtcUFCVEc1TEhZZWthV0krdHBCWVl4ZWJWUGgwU3luZU55ODB2TWZVSHNtbjd2ZEdmQVVvOGN5MVpkcnJ3OFZCaThYS1F5a1R6aUVmTjMxRUl1MUkwcWFoN0ZKL0NhRUVPMWc2WkVGMmNPM281MFp6TjdaNDM5OEUybHM2RlQ3bjdwRkQvK2RwYlZvcm5lNmJrdTY5SkIyb2ErbDNXNDVvOWJUSDU4U1BValdqcXc5bmhlWE5paVRCVFdEaFpNMFdjYWhUc2llMERiWmhyOUE2eXZlUTFLeUY4MUdVektFK2VKUGdhdkovdU5tdlhwUXFxcWpwYXdqR2wzaU81V04yUytHR1Ricm81Zk9mT042NHA4K09DZ09mUmRNRWltYWVFVHZ4Q3NkeDkyNTVNSVcvUjdZcjlESWFlODdxeFhac3Z1N0VCc3lQWUdYaGQxbk81TXJxVk84NjE2cDlTbk5POFlGcS96UGJhYXA3bmZuSXNVZGUwWE85dGJ6cTFpUHhncXRoRm44WWxOQU4xbmRXYXl6enlCeHhPU3BlYWFYVE9JNUZlakFnU1lHaXNPUTVxYjFtVXg2RmdHWU81Z3R6QXloQkNMZ0VOaGczZm55MEpScTZoSWw2djFvQzJuUFNGR1Yvb3lmbXFQU3ZLOC9RQjJNeUFaMmhjdmc2aVZHZUoxWjMvVnFtNWpFdno0M3pnR3ZUQmFRc1dhQmdRNjBMNVBRUUJvSHFjZTdBdTJISEhtU3BDTWtDWHNIM2h1UHBnaWdpVlV0Ulhub3ZiUks2VDJRaWx6R0toelNFUlh0dXorMlJoUFFoZ1M5VS8yWTc5NlJiUkZKcGhvMUZ1VGdBMTFqYy9NYVlVc3hZa2Z0RllpTW5Yb3hMcC9rZmxObE9RVW04ZUVyK1BpUjZQUWJoV084QnEvQUtYdEE3VCtHNmpqZ1lTUm1mbEJhVU8xUHBwYlZJZXdVZTR5cUpUUlZjUXFaZVVFUnVwcmgranBvVmg2TkdNWnMzRVFqNWZLTTNmUkpSYU5QeDk5OTdpbEozN0F2M2FEdE45amdYejYvZ3kxcStLM1NFa3FxTlE4SldmeER0VG9vdWRXRDV5elNKRVI1L1FRbS9HOTZ1VDA1cFZ3ZVlUaWJpL0M1aUlucFc4T21WZlZCRlV3OWpUR2FmSVZ0SldEakdUZEZrL0JIdHQxbEdUN3lPeUY4Sk5tckRZdktCMGtGNlRVRXdqSE11TXE4a2FOU1E2Wi9rWndtVCtyUXlBTUpBeE1UZ2dJbE0xNENQUVlCbkVoa3M4TzdWbEpSZGZtakdqS01lOE1HRXlDaHZCYVlwcUlhWjZBU0tUMFlyUGNReFgyS1ZoNTRrWHpIcFg4NXFlRXhSeXROV1hiZmh6MWovMXVGVzV1WEowOElEdnhyZ3E0cnl6a2k0WUx3Q0xVMVloVVl0bTBMRlNuWHNEYmdKWm1wazZpSENjRWVuVksrM3JmWnFQYTQxeVZRdTJuRWlLTWhBdll4Z2VhczhsVTJHV25NL2tRSGx5OGFPWmRBenN4VEVwVVl3ZHRHUDd5YWlDYXZOcld3a2lMQTNyd1lBR2Z5eFJ2ZitKNzJ6d1dROTkzT2tUbTdKeW5NTE8zS3ZDbEcxOTZvN0R3RzNuQTNmMWhxTVZzQ3JvWTdSNGdyQVVmbCthSlNLcVN1cXdqcGNSNkVFdUF1d1lHS2w3UGZ3LzJGanlyZUVGeXE0MDV0T3ZlSEtsbksrc2ROY0tObHFOMm5GTXdQTklvMDB6V2ZFU2kyam5RQzdGSFVEVEtBa1pFOTZKL1NCTVFhTFc2WEFDMlY1WXRqSjFxSFFhV2NBOXphcXBLa29VVldreks2L0F0eWRJRE5hRGZlNmVPa3VNY1lKTC9OM2R6UHF1bDN3QXFIY3FCNC9XajZiYnpIL2p3ZDRuL1ZrbmJCY3FIZkVVcHdSVGJ1ZjNudWhGRVFybkt5OHFZbUxkckViN1JnWlo0d1l1Rm1MdllrRVVFUG9wSHk5WmpiUnJJU0JYOWtzdTBTeHI1Zm9UaEJYODVPaTVmVjlLSWpvSTFqVERnOXZrNHBodXFUUGpvY0JBcUZOaXdLNTZ1K2tudDZmQjdzZXZVc2d1V0lQajdaSjh2WnZNajVZbGlPZUV5SVVDSWw1QjdoZjJrUzRzU1A3dGNaS0NPU0VCaHpvTElOK3ZaZ1pCQ3ozcGJWVnJjM1VjSkUySEFScHlvelpOS1hseHJnbnU4VjJWYWNodTZWYU5pUnd2MWdXdjRIT1BCYTZDcUFMUks2RHRiQVI5UlZVazRZb0dOckx2Q2JKeGJqMHp2bDR4cXE0ZUJFaDlzRUlJUHVyVlFXZHJjcW45Qm8rYmk0MzMyUkpFWmhqRmxZSXM4NGxlblo1eWlHWU9Mejd6VU1RWkFpak5tb040WUp2MTRXZ2hxTXRuVmgvaGZnT3FGM3lVUkhRdDZyY3VrbHpFR2NwUFNWamdpM29ha1o0MnFyc2Q4MlZXTmJoVDk0OWdlZnExK1J1MWJkUmtXeDBaTDZSUWVDYTRKUmJQNUtSTVVSSGMxdXhFQnFnaS9GSGxUbXlnaXY5Mnk4ejEyTlVyanR4VUtGeTlGL0VIOXhUWmZPZVVtZmdWT3NmU1R1WGpmT3Fkb1EwSkJZd0F4MElJUGRSMS8xU0NzWk95bWFjcTNGOHJLY2R3SXZnSFJ1aE80cGxuc0Zud0pqTzU4eDJ2VldrQzJ4YlBYTUQxRmZyalBtSTdYVk5uL0c4dUdhcWVjT0ZKTkhhaDJaLzZiTW42M2NheTBsejhiYWFjUU9md3Fjb1V1YVpWeFBHM21XZkNMMmFvWk54ckJmSDU4TkllaGxiUk9lcUJJdTJEV0hPU3ZoUUxXVnhDL0VTNmpVdXlIL3dWcTY0ckNJaXF2OU13VldpUVVnOCs1V2ZYTHEvaHRkSlJwalFZRm9DaklhR1FCTDZkQU9jNTg0bVp6ZHA2d0h1ZG1EZFFSSzdnYU1iWTU4UWxaQlhzejRwWDZFakFvU2g0UkpCbjEvbk9SUGQ2ODdUNExGdzZyaXhqYjBGVXUvZXZ6N0hoaFlGNE9uOHRZWmZvUUVoTTIvQXJJL3U0TEk5UWE1b1pwMk1NUkkwYXZTY20va0V1Vmxzcm9adlI1VjFIaEozVVg0cXNLMmRXdUNtT0dlUEVsNFRpZjY2dlBRUUhyNXRvVHNTVjV5QkprV0RwZXEzRlIrK1NBc3RxYjA0RUU4dy9FNGNjOWV4YjVlUWVQUzJGeVdSZ242anJ6ZFo2d2FEMS9lNG92NVRUbmlDTUN4RUM0cXlwUmRIeG9wWnRvM0FOam1UbnBtTTZwQzJpeEZ1MWtmUjBTYW1qU25FaHhyUDlLS0hXeWdETDVCK0lyREt0dzBsc0N1anU1cEdLaGxaMnQybEZZcmdCZkVmcmZoZE0vMFlMVlhWamk3SThDL3U5czdBbnY1N0hSYy95ZWJNMldhYm16MG1TdWFWK2Y3ZW50M2hhNHc0a3RpWDFWZGpCejJLem9CZDA5VXBEbkNYVGJnSEE0VmFHSHpRalVYcEYxR050SVZINndxckFSa290SXcyY2IrdUNqdHA1cHNRb2VraDFkYS9mbWt3RDdLd2VyOS9wNmRRRE9vaU83V3g1d2cvc2Rva1BxZDBncEcxSlV2VVV5KzF4Vlc1NHFmVkVNZ1U1QXI1ci9iNWNzMUpPdkJPTENMaVRiZDExYXFnS0dCYUFWVE5QUVd5bzJhTUtNS0doVFIzQm05T1VjQ0FxNFZSOVZheGRCM1MyZEZCY1MyMUZubis4OUkzZjBXbytkVCtrRnFmdHBpc0RXRGxKL09TbHE3UEVuNUI0ZTBHSVlhT1JFcVZ3QmZ5SUJKMCtmMUNhOGkwVENLR0lTY2NrbWlXTWlVNXNuYndnUGRhQjhyanI0ck4xa3RydVhsWmpQMEpYdlRUcXlodFYwcnhBM2RQdFhENTRMbllGeXkzVG5reFZHTTRDN0NIZlQ4SENQMEpFWmVFaGpzSGZNbFdnVmg0TU5XQkd0SjhGNk0vUG9kQzBTT1ZnYkxpd25qNVg2dkNtUFhiVDFEeVorVTBtY1c4dkRDK3ZuYzhiRlQwOG1CVDJOWkl1cGxzZkVoYjc2SzVVMWp0cVF4MXFWTE55QXRFa2ZpbHBQMHRmQ0hKenRGbmF5ZFZQWVNjNCtVV25GaEY5UkE4VmNGNEJyRHJ0Vk14Qk4ybkRxZ1I5UG04RjJnWHM1ejNjMDF3blJaam9GUmo3TWlXQUlSeUN0L0tOaHJmcldPR1Vwd3JCeFJGMFI5Zll4Q2Y5bThzdktvbGVvUXhITU0vaTlGR0pQRFFHQUlQMGJ6anV3K2RnK1k2aXpjbHRIUlQ3Tm0yWkdlOVU1ZlZTOXBMNnFiUDkvRHdGbUFGaHo3MncwejlZcWMreitiM25OejhFV21KaEZyejRQb1ZSekhxakFRMkczRk9Jem13ZnQzYUFuOWptVnJmRmZKOFZIMlk4dXMzeFhxdlhsVzBZZm1oMnlCd0srcEUzdlp1cWhtT09qZXM3Z290Y2t3ek1UZVYrZnZPMVV5YlhUTlF3K1h2RENNVzg4L0xTWlNsZmNCeWIvT2xGbitXbW96UnZEd3VyVlJOcU9DZzRTWk9nZTdnNTRsM3NpUkx5Wkl6bVVTNjBlbTFiOHBYOTAyV21zQjBUTlgxY3MwOFMxWDZWWkladGFwRy9IdDlGUEdWdC9COFFETjVTSTlaSjY1YmtMbk9KSmFyamIyeXc3YklrOWo5V2VTZExGOWcxTGpwMHlxamtpdEJZc0wxL202Y2tIbzZiekI4UWRUVGQ3OXhHNVRuMU93MzRNQlJQVEJMRVd2b2hhSmFnUlFYMjJ2NjVEc2tHZ0J2SVVOQ3FzNWthOXpvaEVua2ZZS3RoMzJ6SXFicWlUbVg1bXE2bForeUVNNE80M2c0WjNiTWN4NThudG5iNW9lQUkvUkIyWjZZaTJYTmN3eFJDejIyNDNGMDhKVDhmRVNnNGkrQnJTY3VEZEFjUkdpNGVIRE9OV2FaT1huZjZrdk5hK2U1eTQxUWVpakY0VFp5L1B5VjhCNXVNeDlvM09uRURKbWlhb1AzbG0xNkszU3lYM1Q4ODYyUXZSdmtFRkFIbnpHNFh5OGNnalZ2d1RhR04zamtLaHJVZGNsemRTZkZUZ2E0MHlMSzdwb0JRcVZlQUVEdEtZNFZIWG1qbXNtekQzLzFQc1FPS3ZScUNIR1U4SGVuTmdJOVdpUlFpbTF0RktoQllUUEFZL3NYdGU0eEs4N2hmNDFDREltTGtqbmZBbDRiTTh5SVJpc015MVNpZDdlVnZnYmNtOWJ1SnJWZE1IU3pLc2tFTjl1S2xEYU9SVWdwNDB2em1QRnhRZllIVUpnRUVnNzMyd1VTbzdmWDR5c3dRY3RXYWhUTkR2Zm9INkRIcmpjdDhmMWhuSmJzRVBsZXBZVTRNOGJpVlZuV3NwS2tETzJvUlFFejU0L2pXcktiRlF4eEFXdUVMNUZIMXQ1TTBWTSswSFZ2RVVnZ3JQN2M4bHNLdVdWbnBzVXJFY0NUSzNkajZKamRCUDg5WHdxakNhbGdvaERVSFA3ZjgyUGtyRHQ2Qk5mcFFENHNHT3pWN3V1RTFMTEJGTCtIWVd4U3dQNkg2L1ZuZEJpbVhyaU9nN2pFOEpINnRhWXRWZ3NjcEc0NHpWdUhsSk9acjBVVGl3a1E4SDVzZ0JweTlobmxvYVRUWU9RQUxZU3IyU2ozVElJZGJMWUZLa0NsNFg1c0MrRW85VS9vVVJkSWp4TzY1Q1VXRmdEMTQ0S3hxSnBZTHNKekxLMnZidnVuL0ttTEorZEJ3UDZzZWp6R05wdWcxSEprK0FQTHk5WVA5SEwzOVRJQ0dDNUJBS1ZUVUhHcDUySkpXNDFRcHBKMjRTOFdBOTc2S0RXWEM3TC9rS3oxUHduenhJMUt4ZGlkVi9EZ0lRT01Ld2pLVDA5U25vcERDN0ZuWEFuNW9DMm5oTjhYZlVvNzEveFY4eDZMSW4rbTFiQnNDK09BRWhVQTJ2b0svOXdjUTRBK3Y5SjFaaGU1OXZmaDRsdEttaEFTZklnN0YxZDRHZzByOTN1RkR3K0xWUGMzTkFwL0lpZFZ6RzFYTzlZaUtubW5QQTJBVHl1UVkvZ3JYQjEyZTRMUVpUZHI3eUYzN3EvZUJrWjBSVEYzeTdCUHdrQ2U4bFBMUVNjM01ydFpmTjIrMzBDOXR0REtmdTczK2FFTUVXUUh3blFPUW1QTUNXazdBRmpmTUVYV0Q0Q0U1WVVqVFZQSmlWV2pWakkzcC9wTWkvTG9YWDJyYVAzNjVqdTV6YjlDV3BROUFTVU5Ob0JuL3A5dGdhc3VBMFc3V3Z6WE5VTmZaRmdrajdjS2Nta3BISndxWGEyeTFsdWxNSjIwV2hENmJyRXdPVVhCZW5YRHAzNy9oLzRJRnpHYzJuL0d6d2V4K3hmZUQrRTc0SmNUd0ZGaTUza2pvd3l3eFFuZHNkN3d6K21EOStVb05rM3ZhUStycm16Z2VicjdMdlovdUdCb0d3dDZ1OGdNUStqMm1KaW81SlUzVVM0bU9OTzJKbThyZThSdm50aTYvTzJQOFlQV3lCT01QdENEWTAzdC9NSGNqUHZkakRjSlBzcGNLbkhRZjZZdkRPWEJsRnJXckRVcWJtcHFTcnVRNTM4dEkxQmhzaHdNNWNaK3RuZDh6b2E0bXM2OUVyL2hpMS8xNXdHbWxrZ2pMRTQ4OUthYkY3MkhUemZQVU5SdzBNeHZFbjFoMkE3OWNNeEMzUDZwamxhVm9wc2JTYXpYWnovMUhJcEc2ZDF2SFR6UzVNYXJEbWZhYm5lMHAzWGQ3Rm1WSSthNnJFUkV5YzQ4cDNwU2V3YU9NSWdPaDE0UVRxWUFSb3VtN3c5Tm9XL0RhVDlaMWdsbzY2V1NSV2REYkhCaDUwTTdpcUdCMm9NbHJOMytkbzFhM2J4dzRhYzJFOEgzY0RuTWpGWjdRVVhVOXU2RWM0RCs5a01YSU9wRjJjYytoOFM1TkFReXJZTkFLbXRxV0E2My9oeUM2cFdoSk16NWV6YldML1dKUnJ3QUQ1RTF6VU1LQ1FEbjZVdXRjTGRCVERUbk1MUktMdE93NUxUN2lDUHNoNWl5dWF1Zzl3d1hSRGRtWW9aZVZ4K0owNTEyYkpLWUMrMmg2R3Mxa0hJOGxiOCt6aUorbGNuem8rOEhOcWg5NnkxMklNQkkzNEpYbTFTVlFLL1hlQktjcTZHeW1wQUhhY0lsOExjNnEydUdtSG9WZ09NTlJWdUFDalhhaTE2RmprRGU0QlBmOWhMSUJleFBLamduVC9HNDVnY0hRVkRVZFQ1UzNRNnBXNkd3NHFpaWNSSHNTdWVuQjc0cE9vVDJBVXRKZFpsRWloYnJ3ajd4QWtKRkFDemdxb1JyRnhlMkNRVlkzVmZCRzlzdDV4UDltV2FOVE42MCtKV0V5d0NDbzhrWUZyTXUyQzY0azI3VDdVME1ReDJTdWZ4MEtXOHowVi8yT1VwMHllNzNBMUlYZHJ2dFBVbWlBWXNoeFhaaFZyQkJIR0dlTjZLMUZMWlk0QnNLSnUxTkVXaDJtOFBMUFcrVER2eGVHSVdBUFovaDZzUStYTlAyNjFIT3FUTFc2Q1ZwMUcxSnZGZkJ5NlErQ0JnSGw4SzFRRXRReEVUejQwT01HeWZHR1BVM0oyNVYxb2h6bjNyMHBCZkFiYURHRGF0c2RGc0NzSGZCd2VSaDlpMk55T2s2N21NV0xrUWhmVSsxOXdhdXNHMVBkTThvODRjTzl6Q0tMV0s1SVUvYWpIdHdJUTVlZHFTQy9JSUtxWHlHRDlFRkJ3N1RGTi9FZDJDRGNmUHFyNE9BbWNBZklYYUE2VkpsS3B1cXlvT2F3TjNweUN1N0sveEIvWTJqZkdRZ0RoSUg5bkhrR3R2dDJuUXV1QVJYV1Q2OXB2SkNzc2FreHRsZ253R3o3bDRzL01waS9zamRaa29nRTFIUEJYTlM4TE1MUlh2R0lOM3M1WFUzWjNDMDJIbmwySHgzbzFubi82ZFQ3WU1qMlYxVVlSSUZNajlFUTZ3RTNaejViYlY4ZjNYSGJ6M2RwRHdLaTVlaXNyU1FoTHFHMGl0MkoxcytrU0dtNGFvQ2M1WURLQ0YvUHJlMThQN3JaTDNqSlo0dDdnMVE0ZjdhdTR0V3J5OTlIdnIyN0twSkFEeWJjMHBsb0cwQzBJZjhPRTV1OW9vSWJ1T1JkMUlVbGh0QmltcVNUbXBZTVM2UjR0dDRQYmo4S0V1L1lEOG1rNUtlMWdjNnBURjNRQ1ZRSUswVFZZeG1EVUVGamxsL0lodDNIRTJlUzQ1WE9rQlUyRU5USkd5UytVRUwwWlhzTlhGSDlyaklKWmYvNmc2cTF3L1ppdS9sOTRqZEdUaXgvV1FFVGxvVTFlM0E1TlRnYmFqbkkrOXJXMWRLOHVzTmVzaWVSdjArTHZINWlQU0tyNFc4RmxFd3ovZjRRVDRJaWhlOFlGVjZQRDcyRGt5ZnR1cjBxWjhVOVE0L2tmUHR1SnBRNWRjTjNlOStZVDN6RmM1bFdqYXBMMW1uTVJ2SWZ0anptYzFGZ3piWEtndmRqeXhyaWdaVG52MVM5L1drVCtaL1JwdDJWMURxTXlxTEx4a3czY0pMK3JGbjdwc0Z1bzhIczIzTjRTQjZlL1l0MVIrTHlsN3RsRFJ0Qzh1K1hTSUI1b0VHQzFLSHFGc1JZVHVpUnlEd21tZWNsakwzOFhaUE5ZUlprMi9jdE9LRzAyOWRSQlVEc0tXRjN0NzZ5SzVxY2JlamlSTVVPUlo2dGlmOXFZSWxxK3MzWGdTdGY1SHJyVTBTY05QMXM1U2FFMWhHcjc2K1RZSXZXSkVRMjBDZzY1VGVuKzJGZmdiOXRudGJYOU5PZUVROVcwSFdLbVFNMWM5VW45Z1JJc2hPOGxHNE5tcmVVbkVkWlYxNWxCTFRHSlRFd3RQYmliUXVuOVQ5ME9ZMDVwb0FxVnV2SFg4WmEvUWVmS2JqaW9WOU5DRGk5c29CT0pNVGUvZjZIZjM1SXpIVXJ5em01cHI5MXNReDEzamUyYS9wV1M4SFNxemZpeG5jOTN5RVU1dC9OTDhETWVGb01nQTByamE2clZjL1ZWWDgvbjl5S2VDdzFzNTBiZlNqYXJLNVZXcGNleXlYYkpDZzZIK3VrbHBPdHY3QVVob2g1YVNBWE1mRVRZZHY1clAzcXNJc2REc0NNMFJkOGpPSnlJcHJOZGpWdXpSeDFxS1g4VDZtS0VXTGRKQjBxRGJnRklYY2JhaEljdElKZ29tc05HYVlOU0UvSCtSbTFpNkIzdUt4NldyK00yVERjelZvZis4b0dKdmVqT244SlYvUXFsMjBTYjYyUnhuYUJhTGErQ1REK29HSFFBZDNxbFpHbEIrTmRRejZlZEFEaXcyd2hjNTJjYzFwWWpkaUxNZkxFZkNOS3J5N2srUU5DQndSbmxyWkppdkUrSmVvS2FoVWJZY2toWTlINjMzWkM5bjA5Q3NXUEcwOHUyMzhXY2xHM2lhM0NNUnNTZm1lTE4rd3hONFA4MHJ3Yk03cmVPM0Zha1o1NGtMQm54V09vY2pFTnJsWG43cmNjSjBYTlhUcWZiOXVWTGtLY2crbUROZzVmeXZPZk9QcjcvSm0xSSt3REsxd2ZqYmtyOWl3MzZtdGxJbTU5NFFCYlAzRHBoRkNDOHhqelA1RVFuL00xRnNyVUUzN0VsU0NTVnhSbWpIRGo3L2kxaE5TczJmbWlndWJaSmJpV0FoVEd1OE9QV1czTDJjdlIzWGFHNmRDZTdtMXhCMDZnWTJTQkY2ZTVwOFdyNVMzMXpieWNObElrYTloZWxNaWczUTF5V2p1Yit3VTFrY25UTzFhU0lNMUdXVjNIQjJCbDNRWEtqUXhDQUVBUlpvL1BvQWh4dWV5ZnJLd3hWQ0dZdUQ5MFJ6U3VScEE2TGJxUEl3ZHJESnpiRkUxd3p6enV2UEQrUjRlc2ZZSjMyRnJ2SlpOK25DcHhyM2NKRFlSbUYzeTRuR2p2YXVUSVZlQWxvWmwrcTVNUHlEbjRib0kvVllIUnpJbzhDNlI3Q0FQV3U1Smt6cXNEb0EvQlloWSsrbHJja1YzL1FNbURYd2FxZ0lJT3hVbVJLYUlHR0M5QVU2UHFCMG1RS293N3VjVTNkRUlzZTF3UDBqOFM0bmJGTk5vbFhUWjZtaVBuY1p3ZlQyRURRK1NrMy9DNGRaTlVzYjFFWm9oU25sOFRpdzdoOXQ0YUZrUjVySGsydDJnUEVvUnlKeEhUR01TamxDTGhUNys3S2RERFluemQyQldaeDFBVkYyUmJwY2Fqc2NlUEFVOGx1TUdFNEN0NUJ6NURma0xmWlZBZ0I1VmZVZHF2QVlNamNsL2NXMzJMSjZlcE5oWHFaQmhsZlFBdmZFWTlDWEtzYXNqanhwaVNDY0tFclJ0Q3ZVdERvRFd4WlYvS1UwVDdwbW51S3MxWWhWb2NTZXRRZHNERHRHRFhMNnZxSGIzOEovMWJOdWt5WnVtQWtWbHcycFFGc3Z4R2lKdEpZTzdzL0lqbjRhNXVscGFMblcxdVR6SXk4enllNVZiSThUMTlvbEZnN2Y4M2Q0cHNMQjRwYlBxU2ZCejdGUmQzb1hpUjU4U2VoSDI0T2E5N3phaVZ3eldYc0ovSmVvVlZJcHpDWmE3T3lxN1E3TmhxTU1nUFp3VVM0bmdZNSt3RUUyMG9ZWmR4aER5YWJQK1dpWExhQTQ5QzNXbDI2aG5za3BoY2ZJTWR1bGZnQ2JIbW5KdTN2Z2c0b09nVmd1cXVtcGdzTFdyVGlEcU5JUlpsV0ZGek1QVlNQOVVIYytGdzB4TXZRLzFGY0ZmWWJnOXcyTldqSzJoM1BVb0VwZ2dKR1kvZloxaGYvTW9kR3krN1Uzb09ZT0JHSkxXemw2K2NrTzEyeW16czF4cCtqUE9SYjhDRVNZdUd2bW96K010WVZOTkhZM1hjd2kyZndkSVNYaGFyVjZCOXJjQ1d4bmRDeEJQSmZXRDhDY21wYlBCaVlQZk1nYlJZL0ZIUUE5Vk5uS1ZKNlVBVms1TnhlZ3NpVEJENUpPaGdKN2QrYzBaRDNGUXZlN1FWWjhvWThMNkpRczR4N3RtK3V4M0RzYjI2Q0xrWEtocWF0bUh2bG9zSkpMVlRRSnhVYnFZVk93dVhGSGx1b0NmTzRocGF3LzFzQmlTTHUvY2EzZjJzMWlMNDBFMXFBSmZOSTRGWFpCZ0JDOFNvdklaUCtNeXdWTVJQT2dLNk5TS3B5RjhxTFRvc1FnUmt0c0lxS2tjY2tDRkhaUndKMkhENDJjdnpQSjQwZHIwR1FtRjhBZmVweWFjdDIybnBYN0g4OExXMVgrZHpFYUJqUUhubzRocjRpOW1vMmpUUjRERVZVSjFtT2ZUL3NQSitXYjE1eFJQTE9zeGlVSVNsaS95Yjg5OUJpdVU1VlhRbmZNZmJBWmZSbEpwNnI4Y2pQVG1aWDBLRTVMdEUyMnFZeURvMk5Rem0wNDdoMitpMUJPUFBVWmg1cWFVMnJWV2xEekFUanBCV2NnRFk5bnFEWTgvdlhnOG9pSzVzZW55UTJCYk5GR1J3eitMR1ExZjdKMFFpMFlrRTFLU1VnTmN1MC9lM0ZFR29OR1lmYTlvTk1XYnJVMVFiZEl4K3lXcStIVWZ5Nnpzd1UzUitZQjFUUGdxZ2tXbjFPZU9RaWJHRmJmTUtWMEFrRnE1SnFrVnlwUHVJMjdUdnlVOUtkTjc1c2V5ZUVBdU5GV0I2c1Z4VHhDRm9CaVlyZ3pUckgrVW1sdCtLbi9DeHFCUHphZHR4QXA0NURVU1NWajhDWjV5amN3dVRidEFhd3RLSzVVRy84Y2lIb3A4K01ITWRVaURrajNIQVZPNWxYQXN5TEpQMTRnNTVSNndIRUJwZ3I0ZGZ1eHU3VEE0blE3QkFhenZ6MEVoSkIxUkhSMHEzalJnZktQWkQ2T2YwaTFZWVZFQUc1K2VKZTFpVDUwemo5VFpzYUFDNXVvWWs0UHJvc0ZrcFFUbmJJLzJ6OVkyVERlc1VKMEVXbDR5UXlseU80RWJVWE9yK0xrZ01Vc1NpWjkrV1hCVGpnVk8wT0c1MnczcEdWU01qejY5WkNGRFlXNHZQOGpyRVplVHRvYlVBUithMGxURFhoMERETlZCdGFYbWVnenRBUWRRSVJhOVpkUVlxS3BXVXZqRkNqYzFybUlQNVBqckhrMTlHSjYvZTk1RXNGRk82aVhCMytET1ZaeVZSQm44NkhIWVlmUWNaUTc4NTVkL0ZSVWU2TU83R3F0T0pxUnQxS21NODByQ0dwdnFtYmNJcWt3QWlJYUVKT0h5NUU0dTVoT2JFN1FMUUpuYUtCVnVtbENhcld5UHlSbXRIVW05VWM5bzhaVWJ2eG9CaEJpRmF6OXhkT2tidFJrT3dGZFg0UndRTEJVWUhod05lQ05ycXNWbFo4WUI0YytQWFlJVUk2VldrL0dDYWpyUlduNFM1T0ZaYUZlQkxaVUpObzUvQm8zQUxkdi95MEFPRzhUdys5dGVrdjB1WjdGbE1zeVRkTjI5Y3hkRWNPd3dUelA0UzM3TjRnWEFnSWpINWpMcDZBN29PV3JubXVXV1VHeDBlVFJ2UzNnUlJDTytrOGZ1Z0U5dG5TMC9sYWlNNUNOMVY2T2NZdUh3NEV3TE9UUHlSbHBjZ2ZBcmVWYjR6YXMyN3lEa1VaN3NHZGYxL2ZJR0lDeG9BQTh2TGR0WUZBLzNwR29yOEJhMXZPNlNGbXBkbWIrRjVpTGU1UkMrY3pDTVM2bmdIV1R4bmNJT2dBNVA0L3JzVHJaZXg5eFoyVnJuSlFibTlwWFR0U0REdDVFamhoSnJoTGRrajBDTktpc2RQU090RnFJK3JleUNNK2ZrSlJkVHlFSXJsOUtZR0F2Nm5VRlVNTGtwY0FYK1h6TTd1WEdvL1lXYmYweUsyczVmVzZiL1JuRG91NFRPRHZOOHA2d095N3MzSlRCSmtFYWd2VHNLZlFndnZCVEkyYkNtV1d6d2M1RlNtT1VkTkx0OU9MUEhhb0ExZ3JhQ2dpUzVuSkZ2OWE5OVRzcmdjWVpFblhBVDBuRGJMajZxOTRuVldtS3pLSVVQY2czUGNJejR2WXJKQmFVOHcrdm03TE9BLzIvUGRHdCs0andxWmVwa1JmaGJPNlhwaXRMZ3NRWUlhNGYrT0lveWh3R1ZVd2l2Y3J0NGt6d3RPaTlYZ0RObkwzckR0ZDUwTWRvaElIaEpBWFpaUGUzc0NEMmltcFZMcmVpdXhYS3I1b2lZT1ErYWxUNkRuRnNOeGJtREF2b05wNi93RWlpZEJTTVozaUZCODdnaHh0LzArU1V6TWFmMDFGWFlGU2xVYkZPbWtvdjExSktQcHRCR1JQU09ublRpUWRieVY3YUZ1Z1dpcW9VSE80bFI5QjdJRW1oL3NvQ3E3dmpHYTJEdENZQklQNlh6YmppUUJKOEVmK0x0cTlWUDkrRDlpYzVtQSs5VjcvSTZrVFVaNndEZ3R3N2wxRW5jekIwc3Y5TlpSbEJGbEtRd3R0TVhmMkJmOTlveHphVjYzYVhvYTJibDYwbGtSU2loOVBkUEd2MUdLcXB5ckhrYWhkamt0b3NBVnd6dGxwcXU3WTRsOVh3OEdvTElpT3pvaVVYdlpJS01nZmNrajBmeE1pS0JFL2gydzErSm1GR0lKWkUzZlBZbXVCdVF3TzVDakZtaHhKbFRKZFBFY2srYURBODNjWEd4YXZYa3NoZ3FobWZsQjBjL3pudGRROVlMU3h3WkhsSmhQVzhNZ1hZNzFTUmNRV2tTK1ZZSEY1UG5TcGswa3FxWUt3UnVJU0xLdGJjNGFtMmVqa0ZncXJkSEJ3ZSs2N3drREZjQmxBbmg5aXFBZHJJZHJIRFljRnViNWkvaElqSXNvVGc2VnFTSU5oYUxpb24rcEZPZFYwTWVJT3ZremdyZHc2YXlFSFdQYkRtdXZxWG4zdzJGYW1nYWVDZjkrcnY4YkVLNG9qUkV4eE8vT2FubTlZZkVWQnBZZTV6TXA2d084d2hSYjltM3J6MGRoSWJrK21saEhGc1kvUnJwNDBYdGtZNVZvN1FJWnNZSGJWZXBFL0tvcGtOMFYrazVSMmJnWFM2RTdkME5ZM0NEUlEzeW9QSUVwY1pPLzMvMlFybUlZek5RcHI2L3NZSWNlRElEOGVWc1ZGZHRGakdMdWdMRGxOR2VlUVdQSTQ3bEZiN3NuVnZNWDQyN05ESGZHb0FhbnVjbUhFSWVxenQzcjdFR2Y0UDBYT09DWEN1cGFONjZ0bHJuSE9oMmRkaDhTM1lscFdURkI2ME44bFBXZTFaK2UwUnl3OHV1bE5VMDl1OUp2R2t3SzJldnZBdlpweXA3OEp0djVHMUpPdUtnWmJsV0VQT3VJL1NSWEt6QlZjUDB1OFBvOFFORHVjQ25TUGt2eWlvV2xGQUZiSmNoWnZBTVphQko2aFMxMnE3NWxSbXY4MW82MENoNlJVZFZjQTlwREIyTlEyNVJnVXowMStiaEZMdnNSN01sYVdSbnVLSVYvbzZaUXZHb2N1UFhaMkV3VXJ5SUxpc1FtQWFydWFCOS9XVkY5T21OaGhPTU90dzdmZlk5Sng5YmxpUnh1KzkrNmMyWFJiSVpQTzZ3V1dTUGVEUld5TzgvK0ozZHY4UmQ3S1JWQVZDdGtUOVNhUW41NzdDUVpmKzFMNEVCbW5IZTNFMzI1M0JNa1hDVXJLam9ZN0JBRmgySmZEd1lMQnVTNXNKQTVNc204QUJuWmxURFBGV0pWRGFXamJZUlovaUhueCt6L1RzNThiaE1OYmI1L0VXYWxValZWWGV2NS8weWlYcHk1bnJNMUZsM2tOTm9PS0l5NHlYS290cmVCc21mVFB0MG9YRkFIakpNbDFDNlo5dnF6cDR4RUJCNzhlcStnbTF6WCs3OXRpdHpzM2RMMThSZjlaQkFQWkpMWDhHd2pKbVpHWVp6cHRCenNnTDBZT1BDN3pJWEJuaXpPdXRWWXQ5ejJ6YnRpVUNoWVpDTXpNd0Z5aWhKRGVGQzlZMkNzVm1MR1gwWXhGRzliRzN3WnRGN0lQWUZPVjJ4TnFZTEVLVy9UZWVtYVQyb0tGNVdkbjZ0U0VIZHVlV1lyS3U1V1ZxR3Z2NHF1VFgrK2xkcjFsbFBSaytNSW5GVFNXYk9LTXowWCsvMUFPeDZWMmJ4TWRCaUExVGtCbVFWVVFCOEFXZTdVcVhWQ01CajNFNFliZVZBMElBendESDcyOWRKTXZYK0M5UTBpUXVKR1Z2VTh0N2FwdkUyY1ZLUmJjbHNVOXBKQXpkOXZXV3A0dVdIdm1IT083c2d1OUZHb1V0RHRma3dYWWk3bEZrazNkWVRqWVo4dUh5d0xuZFRwdStmb0VTQm5WV3ZhbFlidURNbjBVM2k5NWtBemJjdzlmWCtIeTlEZFpTNlNCL3lTa21hNU5xWUM4VDZPaE5uYW0wTlNDUm5wZ2h4eStQVUpQUUg3Nk5Dc0pTOVdaYTc3eGRaWlpPQnNMRExBTGduWm5mbHNvUXpYYnZOSCtGdVZXZnRTNmxCM1BKd2ViSGV1QTRyRjdXNS84dDhqdVJneG82TjBIbloydm4rU1JaY0xaWE9MNUtkNFBMRGZ0RHFGeVlSRXpVbnMwTEM2SnJxSkw3UWxsZzRuanpiRG8rQmlrRUg3NG9iT3p6TGN5cVdmL2dERXhaajhTTTNocDBZN2dyL2F3UExNV3pGNVFCa3ExQXEvbno2TnlEc1BKNnBGbmlVNmFRK3JLU1Jpb2RyNTFXZ1g1Q0xkTHpBa2dZaDcxOS9kS29kejVYL3pDazA5ZTNUbWhLUWQwV3dweW5EK3NnY2hSeEV5SElRVUVRVEg0UHpJdWZoZ0F0MzFLaDdKbUZzWTlzL2tGRGdHL3ZRV1E3RUU2cDlTdkpsNWtNU0JrZVpCbUQ3Vkt1QjNWSTh6b1JTbHQvMHJRa0llSFlIWnM1ODZENUtDU2k1REkxMUVDNFZPQmtiSzJOQ2lUM1dTd1R0bWg1cXNJTWxQZ0RvU2k5czZkNVZzSjRQTHUwRkVaU3ZEaHJZMVhjbWxDRHVvYTlpSkk4M09WYUdsV0YwSkRTeFlCYWlqbFFYaU52ZjJRWWN1NEV1VzdUMUZEN2VaYW1pN3BzdnNnZkhKZnZ5L3l2VlNId0laWlI3SVU2ZzgzOWltQnd0MmhubWlFdnMydFZUQ1I2TmhSN0phdk9EUThwc3M2MGpiRUEveERWejYreTB3RnV5YnAveGlnYnBpblV0bDhuVWlmN0pnaHV6Wkd1aUIyREFxYWpKTFhXWk5oL2tab1BnMnR5bDZrY1pjd2k2dnAveFlQSWFEUjY3Qjdqd0YxU3BVcG5DRXdOS00rKy84Y3NzSU5kRWRGUGxybVpzbmg2NE1TZFVrWk5LZkNPS3lJUS9HbGpYaDJRVmRINmM1bFNYT05ZQzJoQmQ4OWlyTml5OElGZTNrMmVnNlFreEhEZ201Mm5PcXVnT3EyNlRYMDk5K2UyWWdmbnVCcDBhbCtIMVhQQVlITzRQNWI1TWhPSlNZV2puaFJnU3paOWN3bmIzQWtPTTdNT1g1Q1MwYld6UTFQVTF0YTFRVlljUGR4R0x1UDN2akprNVVZcjZsL0lObzZmcys1OUZOR09Gek9PcHNCeTBsRG9tVkJTVi9qZmhsa2xSY3ZyNEI2ZUNPWDd3VFVkNkxDZml4clBOVnVSRzlOVG9MNlVBaE5xMnZJdzhsK2o0Ky91OFhOSlh0a1JNQ0tmR3pyeitDWmF4YmF1MXd4clJpVVZ3Q3VQeWpMdnprdHFsOXdjZjdVSzJhb2hhT0hteG1aQW1tekM3TllUYXJ0aGpobzJFR3Z0cmdqN0tmQSttTHlueVN5UHA3OHhZN1U3UzA2Y2t1UUNwMlgrOGxWOFBFSkpmTG5rNERQUGlYUm1nU2dWTlpoUnFLUFgraVp0N1hkcUs0N280QzlLeDhOTU1NUHJ4UUUwN21TKzB5WjNVdFFkSGpSQ1lrVVl6MlhsR2RORzVkMVd0Z2dKOGFBTDZySUVVaGYrQVcrT1JZcUppVi9lWDNEc2d3a3BDazhvZ1N5YUJ2SUd0TXFQSFZwNHhBWkJQZkorSVN0M2ptZVUyL1ZOeFBEaHVuUnBkUEhmZHdlTm5pSDJpZzAwOG9JSXpyeGpodGJQdUhwK1V1ZExPdDEvSEsxMm05QktKZzNRdElPRU1IYU9GUzdLVHZWVGNmeVZETXdYNmpYekZiTzBKcGJpWFhuVk1SaURhSHlsTit2NlNBRmFIOEpkajNOa2Fla1IxczRCVDI3K01ML1JYOEtqeDRNZzRucWRlSmllSHNjd0pGZ0F2QkVUWXBLVWFHUHRFem9WOHpmMjdyMW91NzRZRjJUQncwK3dWWHlvbCsrUFllbUViaTB6Ry96eTJ3UlBGYmZWdmpkWVRKRUVKRzhyMzdIeWFxbTQvUHlHZlN3UmRveFBnc2ZwMDhRajVhUXdJNXhXOE1lajNhRUJoayt6V1hYVmpZUDdRTkdUbm03S281MmEvaWZlZ2xQb1hQY0xwaVdZYU9qU0R4S1VidnJqemN1U1pYZ3JJNU50WElZNm45eU4xWWpUajRobkIxMEFZTHFiakdmQVptVVVQMjBlRXNiODd5b2Uxb1c4ZVYyZk5xaTZDWUsvck1HdDFNU1FVRUM2cTVOWllWUXE1WmNGUTF1d2twQ1dpVTV5MXNxcUorYlRsREFjUzBFamhkcTNSTGhXdU1CaUhBb3Jqa2ZIK28wMU84a1VWeFBLalV0RHNwcTArcVFXOG8rTzRMYzREME5wc21hbUpkUHc5S09sUldabTA3ODRIRHRPY0JBN3BFY1hVSkpqWjNGT0hoZXJEQTUreEQreVFMR0F4eWNtYmlvem9KcStaZ29JeFVtMzVveW5XUjNYMjdYM3NMZnZjNjdlem1aVE5nOTB0NkJBeG9hdFZ1NzR2bUxYWEtnU3BjUDdkS2NmMkRvaFgwZml4a2dSalR5OVRIaC9PN0NCbVZZSGRDdHNHQ2J2NXJoK1pmancvSnhTL2IwSmcvZXI1WWdDMTNRZEtUNlhBWTNFYmhLTThwVFMrUjFnUWVQeTBNYm1XTjVyc3JFdHpYbmRMeGtlcTNEdXhaRE9ObUF4OFdSRVJsb1lpZ2tXYjA2cDFPNWgrTS93ZklOSW1TRWhoSkV1S0ZibWxZVTBReFVvY0VvMTQxbk9ZTmh6UWViSjRORUZBVGhHTWI2ZDl1QWRyTmRoaWk5cVF5Qk9qMWdCY2NyQTJxcGdKZVAvWXI0N0hONEtoMDRQK2VZV0pIZ3U3ckVqM0tHWDVRV3ZUNEk1SW03WVYzRitod1Urdm5YWS81dE9KNTdLc1pSTCtqWHpDeXRhdXEvekZ3M2RrZHhNNU81NjY1bFhPUnl5M0VaNnRYejhza3I4NUpkbE4xWmJvRU4rNThJbU42ekl4NDY0L3dzVlhCeHFxejIzUnUvZlBLT3JIQjRPWFAvRlVRdUFpOXYwcGdlYjhQOSs3TTlmZjN1WXpmdjdJQTBwcmlyWHJzWm1Kc0JoS3pwbCtubFNncmExZ1ZKdjZRRTBGUktIaDNRU013TlNVRXlKU3FyczFsa0lwcnVrRDhnK0g5T28zbGRvY3pSOXZsOUhlOUlsbGxOMEY4dU9MdzFsQ0ljNmRadWovWUpXcC8yYUV4VFJvazZxM1QxUnQyMUlscXBVNTNUbU5OckJHbndjUDJBYzVKMnFKMEFsQTFYR2V0b0JwcXV4dXh0WXRkUC9DMmk5ZDlWdk1ZbkxBZlpyNzZENzFwSW1mdUNEVjArdUVJaHFkcEV1YUFHUDZ3ai9WRitPSmhucjFkQjFGbE9NbXlWZDNSamxOMGF1M2pZM1VWejB4cW5ZNDN2UUc3L2YrV2NNSThzU3VPL3A3ajR5aW13TXRnOUR4QTRmMENWZVNtQWRZKzNLc3dSV1NwaElFSGZvNFBhc29jU2RWdFd6c2dRZ2VZeGRIekZKM2FjRkZXK2VlUFBGeUxKVS9ZVjlBWXE5YWlCeFR1RndSa0NiYmw1TUdJRGxYdVRPU2taem1id0gxZWU4TlBBcnd4TC9wZ2ExN3JsZ2JGQ3grWlBpOHdMa2NFSGozN25ibUZVVHNMOEpyMFAyQjBhRlB4YnNIUTFsa3ROOU16cW5ZV2RnT2t5WGRqVjZkZVFVS0pPUmJrR3hCdHpQckxPdFc1T3BBU2tYT0lPR3RmRzV6UmIxbzV0cXFuRmxvR3ZvbU1mZVIySWRtQ1lWTmM2VXY0SjRISzc1dmRwN2xPSmNlRHptK3RoSHI1RC9mSWp4RStva25TU2NBYXJlZ3QrUWNwL1ZrVGQ2OEJMRkF4MG9JZmlZbTg3aWEwTTBMdGc1OEUxck54Q09PT0drUjd6SzY4Z2g5V3BMQ0l5YS9MZEtlNm1yVjBYbzVwSTJnOUplaDFEUHlhUWdwTXFTT1VPSGM2WlV0aDdmNnN6TldEUEE3TzU1WkNuSFdWT3IyNFIzWlh1WHROeDRna2lmWW1VMHo0QU05TnNiTzNsWFFyb2RseEFKNy9vdXpOV1BPK2xuM0F6QU14b2pxKzdpOWNVTTF4NW4zT2hIRm1WTVdiQ3hadjk2Qnpza1JSV2wzYnVaQ0M3eGhDbVJDL0U5NUNzNVlJcE5ITzl6a2gxa3EydTF1akZ3cklzK0hLZDd3eUlIeGVaVzFTVTNneHc1QTFGY3NtbUppR3RTdDhBWGh6K2R6dFJRbDV4NUxUQzVnWG84YnZTNGpiUTR6d2JJQlE0YzdEcTBOTmo5RzhHV3dqck1FMEhocWhFaHE1cXRJYmYyaTJDVkxWc09xMHIxQ1MzSThlemc3Tk1MMkFReDJicjFveEZKK2o4bGNKL0FNYkFwK2lhREZTVm0yTFUxOWZvNUFLSTk2TmlROWdqSitZTTQxZFd1UnprY3krdkIrQVZJcmxMTkp2cXBTdXdDdHZ1MXVrOXpVTTlES3VZaXRQeVFnYW9IVm04b2xsTk9RcWg2c3IzVjU2Z2dzL1lSZnRmaThId2lyYjRhc3ZqR2tiV2dveTZrS2xUekc2YU9ROFlmSGN2ZDBBZlk2emExNEZFRzBMTmQwRnkrYStSUXpQK08yVzdiV1dOc21oZTRKSlNQY08zdkZxZjUrbGRqbUxCc1ltWmpmNE1CNU9VVmhXVDlnWmNTemFxUVJqbUFiNk1VMEp1VHpsY3NUbXd4N1Azc2RpemIxYzErV3ZqM045eGUrL0M4dzlDa01MSDhQODRyUlBZN0RleUhsZlVndW1ZRi8xYmluNFQvelQraGVkazFTY0gyRDUwQ3N0aXRESXJ6c0pWY0ZpVGhxZi9WU1ZmSHRKSkJPOHphdHpUbU1EM0RwTGNmYjU0WjdhVFFpY0VqeW5oU2NJd3JDbWRVeXRZZG90czNkeHBRZnFDbHFzY3lRMXJCUU5iRW1lSkJ5RDh0S1VKM2RoalJsVHZvQm1tWUc4SVhSWERHZllMZjhtdHp5Y1dqOVAvTm5hSHgxemRudmxSc0t2Z0M2dVhXWHJuQmR0VGlsYlprWHhXL254NHg1ZkNvb1JMNlkzYmIydWJSY1pPZ2VlRmRVZS9WdjBmNkVTaUNacVpudnRDdFBmME1mR1phT1k5NTRYdmNmN0lNK1hwandpMmdna2FLeE1SMXhiMXpiWG5iTFh1Rm56bUQ0Z3lOVk14dk0rTnloM0lyN3VXV0kxRk5JSjJBdHprb0hQNzA1VUJTQlVrTDRJNGJNc1dTV2VuZTNIbGtWRjlxSXAzUVphQTEyeTFtbjFwbWRhQnFPbHU4NG5WbzIvVnpVY1ZCaDFsSDhhMWoxSGFOTDVFTGFnZE1CMy9LbFhHYks1MDJzTlRkcWZabjY4STJpZm56UzI3Y0xzcWxBMW0vMXo3Q2JiUk10Mldkb3N3c3JMSFBDd0JUVVZYVHB2THdOMlhndW42OG10ZmFDMWpiR0hUb0NQRkpaRlNaUy9ENkpWYjVCSkkvcnZhMUNsVzVhU1hla0M1Z21sSEQzaisrTHFST2lrNlRRSHFyd2s1enpWNk1OV3VsajNta24vMGJCRXZyekhKTjRsVlVDT3ljZTVNRlNnT0pUanIxb21ScURlYzJpYzJ0UWd6VEduUkl2SWQ0V0RtK1pWaU5OeHdTRjh2NDRaN2xwb2pvUnZSb0tNcnVISnorMFNkUXRhK1JPTGF3MkFPbEEzV0xQOXNyamtqbCtsSDZqL09IYWw1R3k1M2RDeEE5azVyTEJ0cG85U3U3MHZuUEYwQ0IrRWdXbEdKQlErQm9EMXJVZ0ZxekNpdFdhT1dWTnhUd0RBQWJ3M0x5dTVkWWZwNStnRFc2OGVJNng1MHdiUW4vdHNKZldvem1EeE55VUgxejJXZUpBVHdxSm5yRmI2OUFaT0R5K1pQOGtuQjFNYnJaUFRvUTF4TEpNdFIyUnNOTGlwSm9pNlA0Z0QrRG1FTC8wZXBVS05xcHUyY2tuUmtBWmh1V0RjYjlTTm1jdXFQME11UjBOQ1FhbjJpQ0FNV0tOVEQrdGR6eE9PZ3dhZHlYWVNESlhjajE4RlE4UXE3Rm5yazZ3dmFLTkd6Z1FvY2VBREczR0dCRFFIRTJycFU4dm9lOTE3T3lteVhJcXNOcnZSN2EzWEo4aGhtbnR2NzNRTlp0T1hTVmdXbGNZYUg3enoySTJLazFCNk10T3JNZzdZOW5lMlFGYllQWU5oZGxnSGtyczlOZGQyKzFOaWJkL2wvV25ZSmdoRVowV2VublAyaEh4RWFPcWg3STd4WWdONXdMVWpLTWtTSGc0dkJILzhiZ1dkR0VqTVovU0F2Tm1Oa1FZU1M1cUIxZDB1VVo4TXllZS9HSHFYclpjVjBlU2RaamxaZzExclFycmNkZkpLaUQyTi9HaVMxWUtLQUdjbzVNdjZLSHpYMEpUWEl3WkNLN3JyMzB2NnlpaERyeXoyZVZVVnZXTnhPQW53dWxNbVozMWFuOGN3YllkTEc4RDhlMWd4NUtGU2FqdUVpK2Iyc2tDZVZtaC9yR1Joc3lNWFNQWWtLemFDSzBkSGV4L1o5aUhScjFLYU9XL3EyeWdaUENaQnVHa3dmZ3FWQ2VrOGlzTmNTMFZsT0I1QitIdjJtUnoveDZNbWU4RDBwUTBINkJXZFFHcTVoOEdicWhQRHVaMzlYU01sTklKaXlEQzdVM3M2OGkxd204VFQzb25HY2cwZXNkY0xHVldjL2tuRFM1eHh0SzNJblFsNU1RNzBSbFVKdW1wN2FvZFQzNnB5Zk1EZjJxV2VWZTlRcWtycTRzNzRPV0VJN1BSMVhpTTBoeXhuUmRhSHFaQzkrcVl4cmVtc280eEF1aU04bHBhSXBxQURPRU1zOWdYOVVIU0tRQkMzQUdJaVhIMHd3NXQwellnNkx1amZ6WjhnczJBM20yRWpGcnV3dFdiSzNCdkowL240THpVTDhlTWNJTWp0ZGVUVnM4Nkx5Y2YxUlUyV0Zmd0daZTFOdmNEMlZlTjVIQmQ5ZExtRzY2L1Uvd2tKMVJQclIrU29peDBLaVJWTlJYRW1UVnRYUDQwcGFvUDdXTHJYYWhOYldlb1ZZeXg2dTc3cTZsQ3pmVWlBVVRUNnJHdUh3OTN4T3hkRDRTSzVSWGdrSmt4RUlVWldNdlNNWVZXdEFBSXNoT1NsUVJDcFVmWHpaeVpkL0RjNWdBTnBCdnpISTM4aytYeTJVWlV4aUdqcXFDS2FaT01nK3RnMUxJUE5NSlI1SU0yYWxWYjh2YVpZUGVObC8veWlzRVJrVUt6MWxURlZMUkNSUDQyTWVXL0hCb0Q0SnlLUWdzYndoZXVTK2pmVG5aMmJzQUJyVDN0U09EUkpxNVhhNk5ZUEIwMENYVldSNlc3NFR3dlRyaE5JQ29DYm44bkpwWVp2dlNBeWkydWdneUJEbVVBeTQ5SW9YZ096SkM1RU5HNS9Md2RNeDVqcVpUVlIrZmJGWlFNdVJMcXQ3Y1JuWkFBNnE1MU8rR2hTaDRGM0o4bW50bkpHK3ZRNjVNem5jM25lbmNYRGtNeWFLZml4ZjJSSjBWK2hwSHMrTGVLSkJ6a2dPMENEWHhydXdRU0lGblp6UmxiZTZBVUVvcVNBT3djVUFadjJFeWtCclNFSjFTbU44aWZNa2NPMEZuSTNheDBoaTZhem9rRHFjL0NWMkRMUC9RSkE3Y2V5MmJQMDg5ZjBRaGRxdjRWRTJZNmRMRDRRd1ZiNCtuZGVwY3puNEZNbE9OOG9QL3hKQlZDa2JSdHQ4d1h2bnVRZXdIamVvVFI2QVRYRzdEUDlPQ1dOVklDM3JkcUM2TE84czdpK1NBRnRZc2tiUHd5RWtoQ0NwODBiWmk0WmdBdjFXV0hITUdqa1o5bzRlU3lMOEtXb1Y0Z0cxelVRMUk1MmhBSG9YZy9lbWFhY0Z2bk1DdHI4aEdsQi9ZTmhqcExTdmRjSmcwOENJN0RoUUZPeFhEb2h6TjNNMElQdVZLMGdhR3VGSmtuVDRjQjB0Qk9oc0g0NDBhRzVqZ2oxbC9Vd0c1VHNaOEh6cXJxUGFoNC9lanJCcisra2FjWk5xR1pkakZ6OTBBUXFNUzVCY201SWtkWDdMK0F4YkpLRnZDQ05sK3F0Zmhna05pa2VhZXdCNVRpVXdHR1F4OE40aElBejZBaGFOU1JJZzlUcElsTWVLcUJ3TlViQTd3dmR2bGoyWEpHY0hSRnJCeUUrZjVKWk5wYzFQZkJYQS9KSnJ3YVdSWXAvYnF0bHozdk1VYjI3UHFXNlFyVElneHY0dkFnWUpQR2Q0TmRZYTlLRzJPc0JQU29kWmZCZ01ad205VlJyTW43U1VPMk96c0lyaU5iY01lSmtQTi9IUGxIMGNKdEJGZ3NPUkVzeHIvVUxEaEhCbEZkWjdKNzRFMkk5RWlrQUF1SGJWZ29KSWtKVDMzUUhIbjNpcFcwYy9UNnJ0OU5pOFdCK0xLL05zdW1TbEJqUTJLUDJnaDJpK1BwZTNna0FqdXdSeGtEUUlQQ05hUWFQalZ2bS85QXJ0L3J6amg1MGR6VytSV0VyOVluVkh0bkFhL1ZtZEhXaXV6UVMrQ0JSMXdudENvNEl5SFhxbnFWYkhTekYvNjNKc2U0QWR2eG1ZeUpKTUxRUlpYcXpOY2laYVN6SzFUNzAyZit4VG1nQzNvKzNFTHJRZVE3OEhzUkg1VU9hWHJGdDc4N3l2aEFCQktBTHptSm9yNFl1cGpLVzlxay9xQkZqSFlwZGdjaXhWTlFmZFVneWpFY3RiUzVZRVJkQ2hRMm5waVZoclF6Y3JSOEZ6cStTUG0remJoZktCRnlDRHErQTg0b21jOHR0VHFZRk1CODRMa0lxcUtGUmtibG9pd1hvdjJOUDdmNDRCYlVZQ0VuVmxmdjZlQ3E1bXcyTEF6bXE0eEc3Zzh3WE9UdG1HbW55NDdHcGh0VzV6QmVUU3JOWUJ5aW9qZmNmdmtmSkRESlZueC9YTWhneGhCcXhEUmtFVWg2WjI5UWc0d1pCUGkvMDdtTEdoTldnanJ4YWxNZEtsRFRFSTQvMnZFek5vZVMrUDNCQnkvV2R4Q1hQcSsxZEY2M0huYTlJL1Q1K2ZoTjB0Sm44bzkvSTBBZ0Y4NFVDTXJPVG5uQU5vS05nVkNLeHVHU1BPUFdwcGl0VVlab0swaWY4clFlK2RYZ214cmcvK3JJUFFLSWF5RVBCeHQ5YkN4NjlyZ09CaE0wMTR0c3VxUmczZEJhaHc1dkxid3B6WW9oSzI0WHAvSHdEbWQ0ZGh3UEhUT2xvTS94YlhkTGhYVDFJaFVNcjhoMWhnRFByQU13R3U0RGxZOWJmN0E2djBQb1BvSkhuWTJibXlkSUFJbGFxbTNQNXVHVk45V0pJdC9Nbkd4NzZuc0piSm1YbDMvWFJBNUVEaWVhVktnMHZMZlpKbVh3L1AxVUMzVFlaNHRreWU5bThNR1NaY0VjT1MwN0dWOVA0Vnc3QW5VNHo2dFFXTWp6L1JQWDdCVkhiU3c5N1IwOTlZbzVqVzcrZEZ0T3hTbVNTeW5jOEpwSjl3dXZUS1FhYXpHMFM0MkNjenFkRmtDdk9BMzBUcldFcEVhZ0Z6aHhiNW5KMTMwclkrcjhmWGhxZWkxRzdRc1R3ek1UUXJKNjA4ZFplUWkvYjhYTmc5RmlzQk9Lc2JDWGpsSE9kVDFySFlua09wUngvWW1vN1R5bGtzN3AvSjJ6VDJucHVtNXBIRE1ja29lQ040S1ZhaDk0RTJhajlvRkNvUDA1OFk1OUxDTWRicS9ETTRFb1FwaHlhMHhuTGhDVit3OVdBY2N1MUxiNGlVN1BMOFJXQTcxMTVYd3B3Q1NHbHN0eGFRckFidDF2Q3ZzY25ZTXhmZkJjVytLT1F3WlZlcThLZFAyMWY4aEhiUkJCK1JNaFdYaDNQem56ejVWOGs5aXJwZ3lrbVVEL3p4OUwrUklYZ1QwcS8vVVRaY2R0MDhBTERLVHI0bnhTeTNVZHFZR29tRXM0bHJoWURqazJjcmdVaVMwREM0eElhZ1JDeUYzLzlNdWtoZzVMaUhuelZVbjFMRmdWdmxkeWNVYXVqMU9yNVJ0VFhPQldsczg3SXd6ZGppYlhuQTlzd2VLQmRRR0tsQ3JjKzlTdnVXQ2h4SUhmUUhNVWN5WEx3UFR6T09maTAvanBDTDV3NTZremsyeFVNRkhLRzU0WGhGbE1GdDNvS0NFUVpHSjhnZ0VGVlBpZEV3ZUVoczVqMWFPZFdCNnZwazRvUmhvalJnUzVCR0xEa1JOYktRNnNlQXFVN0JkVUdqL0sxNlducjNiM082b2JRTW1DcGZNcmhWeklvWUR5VTZHSlprMjNWNjZpNUJZTHlSSlo4S2Y5cXRLRVgvZkVrY2VCYjlOa2FKWjdSbzZ4cGRuTGVYWkhyWHZJNjUrSWlESXFhSDh1TjZaSUUySUVlQUFJelN4MWV2OEx4VVJPRVFJWnBUU1ZJYWFud2k4c202V3lHaU1rblVtS1ZLZmhDaDR2OEdmQW90a0FidVVVKytXM1pxa0F0MVlvb0RMQ3VlcGJzV2oyNndCY0FUVFBaSERMNWMveG5DbEluVzhjdlNYcmYrOThndXpTWWovZEtLZTlvbXR6bkFVOWt2VCtkYUdIbEhxdzVYUXgxZm9BcjdvVG5ISmczTkdhUEVURU93TEk2Q3lFMlQrRDlkUVJHSHgxZldUT2MvZGZpQmNCQWNtUXVDWGNNMi8zT0V6UmpQcXVOa0VlaXNFVnBRREtUOHJRREh2Q01mK3pJNUk3M3FNc0hpMDNCcnJVYVI5dWRxQkxBVFBtc2xBTWlrcHQwMzR2SFpnRHMxTm01TDl1SjcyT0tDYWtsRHl1NFMydGxYQXI5aFJFVHlLSS9JcG4ybGZ4bjZ3cjdVSGFid0FZUDM5VjR3dnVYbXhGQ1Z1bGI5MVhVdnoyVmxLZzNjUnBua2pLOVpJbW11UWUzZXdsZkdXZWFOa2NFOVVxUWsxS3ZxVksvZmMvM045WnY0bStOd3pVWG1DUEV1bUpkeUtVU2VaOGNMUmlNa241T0lvMkhjWkVYY3FVM1I2TVJZb3d1WGg2QjNXYUl2Ty9uWVM5S1NEb2paMUQxNVVTK3ppdlRaRHc3UFErc3JOckVyalZxMXVLMDZzZENIVzFuNmFuZjZSVk5YbTRaQ2FxT0FsbmtHU1NpdVB5b0t1WUlTVGFSOWF5K2RSNlJvM0tiNHlWRklJbmc0VnczWDk5ZjFRRDJWRG1kR2dZR2Yya1N0YjlMZy9Dd3pYdW1RSzlIa0Zac1hTVUgvTVUxSzJ2QjFRSlFiZDN2aVJ5aytTT3pRT3FZRGZ3cDRnemlGeW1tVFMvcTArUFViRTZONzBEVkk2U0s0QmgwdVBKZlZ3bkhMdWJ5K0lwdTBqdFdJZ0lsaUJGOU0rcnBncS9QQnZPN1BXRHFjNVlVWm5YcG5IZEp5N3Z5SDRlSFBBOFdoUTgwUjdyd3lBNHZlUm5ZTkhCcU9nWWdDbE9QQnBHSEVvZU4yWUs3MHh5VkdVaEh4dUJRc1EvZHpZQzFzVjZQSlo1a0ozS2orQ2kzVk55aWFZZlVLNU1ML05tbjh0NXZndEg0R2V6Q29PNEJXcVVLeFFZOVI0eHAxMXpTK1hoQTdRZkpVR1BGVFNaWVhJQWxYQjNzcGlQbk9yMFc0UGRIRzNzNmtvOXE1RW9rbXc0aStUcU92TUQ1SmJWR1dtS2hyNjNKYXM5SW5ZaHUvRlh4b0hXQ3AzdGlmKzl5cEtNZXUvMHhreTYzTHBCNnN1SW8vMVg2T3JwYWE1VHRMUGQ1d0dWcEN6bnR5S0FVdzBjeEV3aVQ5aXVwMHFhOFFMOVlNZFpZdm82WG9wRHVNMm9LSjlRVGlIRU9uRFhWdEplT0RPNi90aEtyclJwL2RDWDdEQzE0RVNHZW0xOTk5Vnp5ZjRqWlUwOW0rejVLVSt2N2tQTklkSjI4U1o0dWZtMnZxVXduZlpBZ0FVTWJxRFU2QklNeTcrN240ZlBKaVBZbE5tYWRSYVh1YjgvclBQK05mTWFGbXpmemFRbWdmb2pCR0tIa3NsY0M0b3dBTkxJU1R4N210dnRpOG9Tc1h2NWthUy9pSkREbEZ3SGtGUEZGRllrY1ErdytYWUlZQUk2WXdURjg0My9OWUNoVy85RDZkTkRHaE4ybTN6eDJjVm9jMllLZFhvU1NQRWUvOFU3ZG1wZ3hZMDhqQkgwMlBuN1REYkw4MGNXQnlxSWhxUXRzcWt4bDRuOGlyWWIydVJxNlRPU0FVOWVzMldLNmoyRGYxTVI3clJRM21DTW5xSG95VVcwaWxJek9mT3pOY0tjYU5pUUF0Qy9BZXZqMUxQK0Z6M29KdWQ3V0w3UjB4di9hYWVGR0J5V0E2K1N6bWZCVklSam1sdGJzYVlibUFEcE5VVVNTQ254RUtjVFB3OHRybThjY2ZIWmd0MzlzYUV1WjYzb3JwUjhXQjA4QUdpcjJyVE9BM3ZWV3R2Ry9wOWRXYUdpUVZqUWtGQ2o5WmJJYUhOOUF4NnlHT3pkdEova3A4RUE3Zm9LK3lmbFhGdS9PTmZCZHBmVUJMa3JiUU5hQjljanlBMXNRdXd4SUZtaVp0TGV0aTVQUW16b0Z2ekZObVg3TTZIQVoyalBkVGIrbnV3YkYvQUZCL25OUHRZOEFqOFJYM1MwdC9xM0piRVNNT0ZBU05RcUlqcFNUSGdLUEdPalRYcis2bGxqQkFBbVQwVnBwWVZHQTkvMFNGYlFYRlRQQ2dScmpMczhFU0VWbWpDRkd1SjQ3dzMwUzdFT3YxenpaM0tSWUdtWUw0Q3VsU1M1cVlBSUJGNlJjU25VUDJnNlpMRVAySmZkQStCZUtZdU5TNEJiNHAvc0dlVWFhZjIrZ1JTSUkwamo3dGhuMXdjVU9LV1cvREVtYWlueGRzenV5NEw3M0p2WnhUM0lqaEJSVW5OVXdiL3BTaGJqVTV6ckxDUk5LeWtVK0JCYWt3SzE4UWttVjk3VzlGck83OGpFVDJ4aUhjZFNDV0pTc1NFU0N5OUN0SVZJSHNJZHlOYUZ4WVJkckp0akxxR3JpL3gwdTdXZ0tyQWxHUXhqWGoyR0x5ZGM5YW5CRllTZm0waEJXbHBDelJ4dElmNURocE5OWmEyQlZsNE1tK1ErZzlVQ1FZV296S0NCWDNsU2VQWTlEZzRTZEdzR01GWUZ1Z2J5a3ArR0pGSXB4TjdZKys1a2RvMXZpeUdGR0NpZVk2Z25GTFN5eVZ6YWZsamF5S2NjTHRQY1dTaE9NaC9iQWh2MmQwKzJ4djl4QkhKSkM2SXBVVEJ0aTVJTUJGc0lkS2dHL2M1ZTh2ZFdUbEx2WDRDdHVNOE9nd0Y4VjByak5nSzJONVdZd3c3SmNSZmpPRmNlVFZ1R2dTNUNLU1dQU051RHRvUTJZMVdQSzNIVlYwdXRUeWllVlQyVUVhRmhqajJSa2w0aWV5dkVLWm1QQ1N2UDUwK1JmRFRFdW1xY3hnM081cDRZcEJTVFhTaTQ4NC9uUzhsbE9obWFSaFdFZGx6VDBnYS9wZG5ITFBhUlFKckc0RW1KNnFSN3g4TFAzN1pFUmlqRlU1N1llMWxXMnRHZlhRVG5UbjZPM0Z1cXYzQkU2K3hlM3BNVW4rdTFMb2prN0VZUlI1TVFzdWRkZUk4cTRxaDNpTlF6RlV6NVhRMmo1T1NQTzB1UjRNL0FUdUp0R2JVb3I3UjRhSzNuSXIrRHpzVjQ4R2RxaUsvbjQvUGxHd3lZMzJUTmR5QTFjMnM3UER1eld3YlozZ2tQc013TytTT0NIYVZHaGUrbVdNelpoS2FQcUp0a25zY1lVeGo0bkhhalJzVXRxc0VuQkZDQlhrckxJN1NwQmpiNk1pbXpSVUJLNkdhYk1FQTFybnl3emp1VENPbEV0dGpsZWlvSDd6dXNXcFdTK292NjFQMFhWRUJqeWNSdlUyRUtXYnpLNUo3UWhPRm16TFg3NW1Ga0toSzJ1S2dvMmE0WUVaZ3F4ZG9CeTFtcElPV1VpR043cWE4dFc5RnlhU256K3dHMHp6bDliTjR1Ym42aytlY01aeEJyaFhQOHRKbWp2RXNrZmVsWWZFOGxPaGhTaDlZbzQvaE9kTEtIRzlrS1lEQlY5QzdmSU9UTE43QklGNDI2YVZ4OVZnSjNlbUNzSFNNY0NzUzRHRUpPTGFnSEhzbVp4MXFpWEdmRDlUNk1SVCtqUFdGNTRTeW1kZjVlK016Q3ZQRGV3YW1uUjVCakczN1pPNG5oazdBL0cyNjNiWWxxdXBSMURxMW4ySUNvRUtzeE43cVlnd3hTRkMwa09iMWxNYmV5Mjc3ZzRoamEyMWlTaTc0ZHljUkxGMkZnb0twWlA4Wkh4elowYnFwa0xYMHk1cXNEMHFLeUlDSjhQNkJ4bGxuQkJNTmRuVUhhUUJKYlAyMEd5anpIbytwS1ZrNHF2TU14TldiMXZFK1UydCs3ajk2V3czUWtKMjlXK2VNMnFDNEZydTc3YjdNbEloaTdpQnUyOCtRVEFWTnhsMFdscHFqTktLNVBsTkZaSmRyQ2lEWTJ1SjgxQ0YzMjJkdFp0Wkh1R05Gd3Y4VVg4K3N3ZTByQytMeTdhSDFmTGFXNlZjd0ZwZmZUVlo4aFIzR2MvMDhWTWZUUkJkVk5BM2J2VnhYLzkvQVF5eU9kRGV5MjJWZDlPczcrelhuaGlKL0xib1Z6SFF4NVJUS2pvSDlxRk9ubE9ZNStXL0RPSFdiUDRocUc5VWJrQ2Y4YjhOeUxHMGoxVWhzRDh6OWNjN0p4WldoSXJicmY4Z212Y2pyLzhrbDVuTHhjMmZHR2l3SnQxSDJ5WW12Q2tjaG9IR240WnVDNTNDNlh1cGpsOVk0bEpaRi9oaHp0VFY4Q0pIRGUzQS9qUjlOamZBRlAzVlZ5Q0NLdmN6YmpWTFpZc0ZsTVl3SVZLVVIyWlhwYVZoQmNncURqOFZWcnFmZ2xDV1FQdnpyRmtKcG91alBzSDhCVU83K2hCVi8xMlFVaHJ5ZjlGYlZhbXN3V3FsSlNnamM4Z3E1TC8rZVN4NS9kam1iR0hSMmZ5b1FHR2Nnc1hXSVdrYjBmWThyWmlWOWE1dmpmUG1CRlFESE4zZFZEa1p2bnU4dG9JMlhwR0MrdmpyTGVhaHgzZ1FxME5BMGNBVHBWNGkvbUFUL3cvYjUxWHZGVEN0N2p4TGwvOFBwSnVwaVQxN2Q1RVdWWEIwRyt3Z3A4QWFNcHZKSnM4N1RmR1dzRWdGYVExRFZMTGRib09mb0l0U2EzUWEzOUFvTy8xVVdJb0lYU2dOUTEwQWFpcm9QL094bE9vd0hGeHkvRU5NOG5EZ3dpUk9RQUdhQ0p1L3ZtSWFNc1lVUCs1V28xd1dES0UzdE1OcW02aUFqYURuZzdCOEw3SmpDNStKRmI5MnBtd0lpamJ4WEdkQTNVMkFEdkE1a3BQZnhsWloyc3FIbkdqZTQ3MStzTDhlU0RvVHJ0eG1RNVlHZEoxMEQ5WXhRblJHSlUzVjFQbmx6RHpkU29ORkZUYm9XQzl5NGg1Uk5OKytlb2M5RWZab0FWR09OVzZOeVBuMTRmSzF5VFpDbkVOY1MwbXpkTmF6ek5ydkVsWTRYYWk1VWMzcDF4TXhCR0RIT0Q3ZmVEdVU4UlNUcTk4Y1pKSjVXdnVpWXpUNCs0UzNzdWM0bFpGUGhiN04zYVR4TkJkaWRKYnJtdU1EWG80OFcxS2dybllSNnV5dUxWR2J5dmZoR1ZGcVVzdDJ6d0l4REw3U1pQcll1NEZOS25jbmVVMGdiVlNIcldOR2xOMHNialVlVHdPNjU5eGo1dnVpR0N0UVFLMFJpemg2eXRTN0RYOFBmQ2Q4anJwT2Uxd0R2OEF0cmkwNVdaS01HNDlyaWR3OWo3bzJWdkw1UGxIZkk1a0w0SnZybkxZS3dPaktBM1p0cm1jMXg3TU1hRmNMT1lFcmRNTXUzSzJEYk1rRDFjbTk4UEdqVlJGVDQxRDZpUjc4ckQwaUNudHNVd21jSGthR21FOG9nT0xqUzFkeStqUHRCd0dubFZva1B4U1ZrbVJJbEw3NVVOM3hkYmtMQTdjcWVxeHVBa3h3cUN0L3B3Z2I1cEdQYy8rQWdZVzc2NmdjeFFCRVBhTHZtTm5zYmwxbTg1TkVLblIwd09vZGw5V1N2NWJQTmVINWZqT2NwN1RQYktxSlVwdy9uOHY3Q1JERDdYVGVGYzJqeTdpWHVjN0dnc1JFYjYwNWtXSEhPc3V3UGx4alpaYVY5VFJSOXRtR3plbm0xQzBPQjBqL0FoK3Z3MU1VNm96SnNJZ2FwekVrNHlQeEpFZHM3Y2JFOURiaklvUldLY3pseWIwcElhWFBNT1lXVk9sSHNlQUVUS3NOYmg2ekZCV05sVDE1eHpwc1g5aGpwb0Vmb3dKNjZRV1NIRndJcEsxb1FpajExZk9HbGRKWWJIUG9GKzhmY0FjSXpiTUZicUZ2NzB5SFVqNW5wQUEyWUQ1WWViMWk1SGkwRGxzTHZMc3ZBZ1Q5NmJVZlBpcXB4YlI0YzV4cERxc01TNkNhZm9qRjlUMUFVenUvc3U2cTI1ZWVHbU50UmdPdXZrTEl4QmJZaldvNEJ1N0M2OXU4aytvNUJBNkhoMFQxTkpzdHVzS2MwWmdyaGQzaG05NERxSnpONXV5VHVjcCtERUVwVFFrVm9KMzA4UThvUytrc2N4a2hEUHJjZi9IV0JKSVhYb3UvSXV4QVoyL3djNGNUcGVhazJPNklhSFZrK051UzZJUmI5ZjcxYnl5TGVMY0o2bk9xbEZrWDhjRnFTRUhZVzBpTDFLRWN0T0tNR0hPMzJlbUErOElneG1CQmhZNVRpM0UxR3RBZUpiakwvZ0F1VjM1MFFhVlhud0poQ2N2QXA2QnNIV1grd3ZHL3hmaUo2WHptUHJRaGNuRnJtN2Q2KzE5bElTMWxwd2F6WUh5dUgrTXNpQzFOUHFFa09UTlh6WmtJSW9QUDk2dllEWU1MeDNIbUVVY1hwSFczRG1YWmZ3ZmpzV1JoQzRkbnllak15dFVaME1iZ2FmRUtQdGlzT1ZnUFdyRGJjRlJTVklocmN0QTlZTGpmcnhKMGhiTWpVcXp2TU02Y0dwY0prQWFUNGdMT2s2NWZPbU43Qm4yS1NEcWFFZ0ZJb3IzVndrYmtpREhNTk5UTVVQVkc1Qm9aWno4UzFFbXFzSWNURG93cjA2bmNUUTBLTHdsSmRkWDIreHA4c1lCRzJBZGsxcTc3S1JjaVIxeVVrd01kelkyK0F3QURPN0hhMlVDY2toNzJQcHArbUtGWmd2OUFERXYvRGlJbEJ5VFdycnZGQ0NPVUxab0JMLzd6TjBLSDdGRmNWR3llcERqNERMcS9SMWVqbnl1MXV4QXNGcUJydVM4SXB4emRONyt1M3RVWlA1QmUzSUZtUnM0ZjkvTGRJMVIrMGdPSWJzdERSRm1WSlJKSi9qZ3g3dFJYa3FGTEdNK1VnUndsRWZjVjVua1dzMGJaeWJQazZYUkdpYjZ6MmlEa0tUeVIzRjhZTnd2L1ZJSXB6aEhpOW5zWUFTNVhzRnB0OWczSjJOalZMSkhSMUJ2YjFlVFJVMFJUbDVQcXdnZDR5dmo1UTVmR1dtaTNhYU9ZaTNLRFM0anNZQzZWb0lsaVh2NGI4VjFTZU8xVjFRRW9HNlNtNzlyZjJGNndNczhSZHF0aktDWmd5MTdXeE4zV1FrM0NaYndpMFA2ZXVZcEVxRkVtTG5iNG9xTENmM0VqeVR5eVhKdkpadXdFZmhGZC95VCtFN0RnUVkvcCtTUXFaU2lSY1p5d3BkK1dRRTNpVWVnOUo0VmxGSEYxclR2OGdpbTQrTWJ6MzBQYnVtd1N5RVRWcFYwSXQ0WDcrZHdkOXN2dE5SejBRbzhUajJidnFMdXBaWXUrcktYM0JRbXhwdFFuUkVObTI1MDJWcS9yYi9UNHJXN0pxdE0vYVZmR09Vbkt2VitaWjVwaEY1NEN1RjFjOGx4UFczSXFVMldlS0psVXMxZ2l4OWpEd0JKM0JlbXVCUFVRR3pBanpFMmdhOTZGYVJNc2VCTzdTSWFKcit0SnN3cnBtczBRdGdPZHZPU0tMK013U3dNbm5BV0pzb3VLcTlmeDBDUXowRThrTTFRa0RidFNtWjZlMTZhUFhRMEFCb0dkZUp0VXIydnhneDFmbTZEY1F0UzUvMlBxY29NUWVXVWcrbmRwY0R2QmdQM2ZGcHp1MkFPQThONG9zVC91TmJuYU02bnZmbXI2aEpadjRkc1QycHprdU9sbmdma0IzZ2RlUm02enkzby9YcUppcWJzUXk4WVkvU1l3YmVRSXI2aVI3eXQ0TFRyeHJCWG55R0Rib1dCd3VnNVppUXlncWtRMWp3cGZPYnRteG45VVF2YW1NeitZbXQ0cFJob0VGZUlKeWRWTUpCc2NYOVZiM21MWUwzMDlwWGV0UlRjdlc4TEorYmZUckhhZ1Q5SDlTM1hsVlpoZmRydER6Y2xUMlFEQm5Gb2p5RlEzM3BuRnJaZE80L2RkMmgvZVRvWFIrK29CdkFIOEpDTzhlSVhtMWJHcVppczBBc2JIYjByTDVCeWNPNUNCbC9ncHFGOE9YWHdkQ2lEeGE3dWIwRW9TYStDMVI1U3k2Z3FkS3c4QUZLaFhHb3VFVFc3TUNTZUZhR1FRdzU0SFFTZjZpT3drdzVBRkNsMEpXN3VuQk5IelRjNzkyMDhsNW1obFNMam1wT1VyRTlESFl2ZVgySnBxN3JvcURUVVZUWCtxZUwyLzh2NS92SXRJQ1dyMW1sN0YwNGs4VXlSMXp3d0s3UTBLSFZRYXJjbUdGaTVCVm5mTWIvRVZpQkZGcXQxWlQyZVYrK2U1TlBjeVNJa2dQM09OckxYeFJ4c3FybTlaWUM5V1Y3Z1liL0FUd2tzM281SmJzbW50czVvNWJkS21PeFRpaWRCdG5GUWdXN3VTcHVSZE51TllYYW1ZdlIrRTh4WGgyUXFRQXVRNWZsZTEzSHVDM2JXcHErZDVtNWVpQ1BSTFZmZVpVQlpud1RFTHRaajFNNlQ5ZUJsaWcvVTNDWXRocUpMd1NUZUhzekNBMThXNlgwbVh3V1M5YkozdWZtN3g2Sm5LUDVJV2l6SnlCRDRKRWpCbjlyQjZTVVpMTnRQdDB0ZmtaWEI0YThERUpzcmRncjJBc3AvNzBJUnlDekZoOG9XcTd5NWdSUlFIVDRHcmt4Z1F5bXdiRjMxK3hpYVJTYlVwalQ1QTZZUkFycnlKQUZLWGRaY1RFMk5sUHhIRjQ2c2pKdmU0Sm1icVgxTE44K1RBdDR5NlFna1pqOXMvL3daeGU3MWFEaVRsc3Y5OVJrK1B2NkxRcnF0cHNBR2tMR1dsTVh4Tzc1MytPRU50d1lwd3hUNlh1eEpuQVBoZ0I4QTVOdy9tTWxXOS94RTF3dnViWmZTYU9jRGJHdC9uYUlLY3VkaEVqNWxMZ0hjMjJNZkRobTQ4Y2paS24vWVllNDdsL2RST0JrWHd6TElRUHVQbTl0M2U3MmZZVmVjalM3d3NzTWR6VkNzSXNULzVPOTdST1YxL3JkQmVVNGFxZG10TzR3b0NPZThZbkJaTjdYVUQ5TTZsaTE3MU9PcGRYcHp2RC93ZG5pemdyekY1MFBrbU82eFJEUkxzYlBacEdyUk11T0lCaWlHMWtNaUp4US9Rc1JJTXpqVFVvR2xvL09yRlU5TmFwYXhwNEFrckpDVUtqV245QVIyQzFJVnhXRjB3VVNYQTVEZWVCb0UyREF0WHhoK3FnNVA4S1VCSitjT1VWLzlsUDl3bCsycFN4M0ZwWWZwdkxvTmdUSFFBSGdsNU5XbzRtb2ZIVzBTRmkrM0ZDL2R0L21HVlhiSS9UQ0MxbHR0bWhYMm9oV2pHRWkzNC9MV3FXWE1zWDh4aGpicThDWmFodzdZMitZVzVGdmcwU2NHRDBCT3hvNzdGRDF3MWxwQ0RYNE9MYk1aQzRJNldOdUhLblFZNnZIN2plRzJOcnBWcEFZWUJyajVvYzd2cEw4TXB3U2pGYmY3Rm1uOFpwSjBwTWRyN2ozMmF1bXloS1YvM0lLRDI4RUhjV2Nrank1K3R3Y0ZjNkRtZUtMZVpoS0pVNE5JVzVNNHlhc2VHL05QWDNPcTdQbm5USFFiWlRMaDEzS09ReUx1SURWMk0rOXVRa0RtTG1nWithem4zODZkYXB4bUZ2RGZMWXhxbDh1WmUvblJuWU9HMk1PaHBGblRybU45UDVob0IybC9FZmxlT2FUT0JWNms0ekZrR2c3ZkhtczN2OEpIb21DU1QyalNudTg3SnAzTnhldmpRRys3YWxvdEpqcDZvemczU2lPdWw3SDIrRDJwUWJ6RVFlNVpwdG5ZdHNBSTBiaWtybTFURGRYRWZ0TXlhU0RENVRWZklLNENBOTJMeHpCRzlsa2ttSGVuMzUzV29sb3FCeVNGdUcrZHFWZkZENzJlVHVJZWVaWStoK2p3ZVBrK3ExT0RDWlVyZk9FNE94ajBZWmx5MzZVZlFndy93VnVEeVRjQ0ZRM280V0VJODVMeHpxcTUwUEtlb1EyN0s5aEpnR1dsbDNjSDFEbWJaY205U0wzSlV0bXVONCtCMk5HV2VWQzdhRHhrZVlkb2FZcmdlQ0F0RW5XRHFScFFMaW9TK3Z1YmpkczBQV1RvbnhXTHB0b2EzQUpoamQ1TWl1QnBxaFpLQU1qNjl6cmY0WkVqQW0zbHM4ajBrdERDTHF6MXJEd2VOeDF0OHRlazY3ZFRhVXRhQlhQSldEN0VUYmE3Y1NGU1hLd0pTUklzQXkzSmdFR3dQc1FIN0ZnaVplRDMybVpEME9POW1mTXkxRU5ja0NaQTRVQUM5TEVVdEllYzJtQ2QySGcvL1MyQ05XYVhBcVVtY3N1UHdIeDBNdzFmeUt4N29MWk9YVzZXTDY1QjBXci9GVTZ0ZWo2YlBHMnkzRklHQlI2S1NhWkRmOUtmbm0vT3B3d1BRektaZVQvMm9qcnNpT1lXOUR4djR3VTA5ZUtBSTdBMG4velZ5dUxpekpnL2JNdnRsbTRiUFYxZzZBRVpIRGQ4RWkyNm1uRDBmRG80eDMrd1N1Um44c1UwaUdsK2RGaDZubHpmNDMwZlVwdmFaMisrQTdiaGFwZGNTV3h2cWZtWERHRzNuK1VjZDBBZ2l1TmhEcCttNk40dlB5V0txV0ova1VuQ0VrTmR4V3A1bEVSVk03d1MyNllpWHptNG1JWkZ3S0pvNDVFaGhOakZJc2JodTdiRFUyaXd5RklZUG84Z09SMS9OUDhFRFpJelpSUWpIYTJuRFVtL2kxWHVqNzFPb2x6cW0wcWVGY3VaNmZVbFcra0k4VnJEdFU2aHRoQXNKOHVGL2Z1TmRkbGJ0aytBMk9pK0pIaG52QVJIUnRUUFRicHNsYlczY0NuNFAvb2djWkxlaEhXV2FqSW1jU1RpR3JmdEdmekh4OHhkMnBpWjJUQWFSVFVlNWV2RC9FejVYL0NUejhSbU5mZEZiRzAvOXJrUEp2SmJXc1hlK0pMQlBRdTBMQWx6QTVBMWV2aXVwVzNOQ1RyNUVKMU5uQ1BOeEhDTXl0UmN6Z2RxWXNxOXZuVWtqVWltdDNEaVdkNUxOdXg4RXVpMkc2SWYwRFdiNG1uSUZDcW4yU0dBZWUxZEIzR0NFTHBNUllHQisyK0RoT2xkb2xOSHdYVXkvNzNYOHJRWm0vU2wweUdZS05paHh1em4yUlYwbXQvQmh1NWJCc1M0aE5iVGRXV3h3WE15U25ja3p2dDhRbnFhalpBMVdQeEYzbmhRN1JLS01VQTY1Q2dGT0NZKzdoWXdrK2lQbEZIckNjTkd3QVBLanU1YjdkVEN6eWdXeUpzMmpVNTFwbWRCa014T3puYlRNRjlSQzBqNnVFNVB4OGlPcjVxR0dmZXhNTXg1eVNMejdOOUFzOHFlTmFvN3RraFg0QVlmZHZnY0ZleFExYUdxOTMvSGVDcTFIOVRkdENRVDBQbkN5Umx4eUZoTGRIbzFmVXJzVTBXRFBBbldSUHR2MnhhY0FmVVdYV2NZN3ZGYjlUWW9XZVU0dWJzeUhtRUh2Vk81Szg0ZUJ0UWtHa3BpTW5nV3lSclNnREJ6c3FYK0JNajBhMC9sYjBlNExneENqZ3Z6YlUvem9Zc3FoS1VhSGtVMjFLV3dLK2ZDUUIrTXB3bjdkcThYaVh6RlBLRUFPQXVsSDY2bXR1eCtoZ2s0b0ZsRURPWWs5b3FWTUtLYmx0Q25yU1NnbUx2aDhFVC9VaEZTR0ViUE55MlRub0NDeHZld2t1VUVscERjZWdpbCtKK2ZnWGRyYVBZVGVCemMvSmRaZkNwM2JDdTFmVVdSMUQyQjh0RmtvdTdmckI3RUgrWDA2eFYvakxTNEJwQUpjY1ErVTFvSk1GRXRNYjlSdlZNY0ZBWVQ0bjJTYjRPVEg0UityRGRocVBMTk5xTkNsQzUzdDhiYnE4TSs3RkJxUUlnSHNwMTVWNE43WCtxS3pVRlRSUlZhOHBKSEZuWHh6NnNRVnBBZ3pvNnh2WGw1eWhTbndWNDRJbDg5QXBFMHdUcHl0RktjaVZaamFHQTdDb2VZakNIL2xWdGpjckM2WUhpRXlVZmFqVGpEMTJ6aDhnaHJWSjBSRjFqZE01SGp0ZUlhMTh4RzFkQ1ZXZ082NXBZSlVuQ214NW4xaXlLaTVnajU5NVYyRnN3eXVpMis0QmdBMUU5TnhaRk1EeXFFckt5b0JUZ2p1OGpiWThCbDBHT0dRcHdBVnpSNXYzN2JjS2FvN0gveHFiaDVYOGpsaExGK3lIbkQycmVOL3QySDlEVHMzT0Y4TFN2VU4ydG9iL01kcWhpeHMydjBremNlQW9UL1U4MXZtbWg2ZjNMKzhKZDdZZlVncmF5M2U2b0ZGSnBNMysxVWVkY0dkQzh6ZWJOSXd5U0RnZzVMb250blZhRk0xS2FyZG1wa3luc2t4eEtrQmx2VDJjdmk5SW53L0llZDBzUEIvSjkzOGxxczlqRGV0MDVpWi9DMS9pbTBON0lscmVkaXZsVnQ2a0hxemdBbEVTSXV4MTFRRmEyNFZvZW52ZHF0NVhFZndkV1JkYTJUZTBjTnNvOVN1ajBabnZvaXNyZENoOSt6bVJNWnNBK1FuZzNzYVJFRWRZdHpseVdYSHpYTERrVDFEeURjdXJoRzFyRGs1b0F6dFpZWE5QenFWY1BCenV3RlU2akNpTHd5NlFKN25YQ29hSEhNRmN0TFZpQWRtaWpDcXBhdzdFOFRiYlU0NjBnTkZmVTdtTTgxWU10OXlhR1ZFeUlXUWtUeWNxMUpiQTNrUVpMK1ZONnhuc0lKdHVGSjR2RnNJM2xDN1dMZWZ6U0h3cFpPb01PRHFqQ0JOMXRjNEUySHExbC90MW5NS0xSRXZLZnR6aGpnWmRyNHgvTFliRGJxL0ZvUStmUDNTQTZjZGJKTmhDcWl3K2JYS1VBMFBxODhHdkNnSUJ3aXNxbkJuZ2JtNDVtcEVROG1UdzhXeHJtL0pacTgzektaTERQQnovanlaUUtkSG9tTXhnRGJua2pGTlE5UnVUSHlzVklDcVFuYkh4MHpLRFpUSVNFNTQxRkRZOHFYbksyc0NIWEtvd0lWMEFqSHAzdThsTWlqcFl0b0FTZHMxem05MmdxQjVqeWVjMzczUmlnRittVFRnMmdzbkpOcUZya2t3YzBoazlIWFFGdVprdlFjNWhSNWNpMVNKM1VCTW9Zbzl6N0lLWlhycmFKaHJhUGhvWW5mRlR6bU5RV25FQTJYY2N4NEdUMTE2WTFPcFpvTnNnQnRTVlVqSmxDR3V3WWZ5NEFVMXRuWlhFd21SSGprWDhmS1ROSWRkMUhnQkw1Y2hPNVpYdFVTam92cnFGdFhxeHJUUmhMQW9QZVVlRnYwYTE3eVdjTVU1Yy9XL0wrelBlclRJZUJjQ0dkRC9UY3ZNVFBkV1ZKeFdLQ05CaVNUOHgyY1NkUS9pdGZUL1hINDBIRVBkRUF3TE5GMTNOT1NKb1BkMHFvbkhRMjlLVnEwdFQvakFER3BTbkVWbFo2ckhjYVd6ZVEwL0RqOENlbEdRL0lweDNjcSs4dEhaQW8xU2w1SXN5d0hwTnJacW56bWF4dktCOUlsbGFtaHVpWDZKbi9ETnIyQ3k5cE1oNnYxVXdlMi9FUk9ldGxSNUcxakRud3g3TkR4S0xxOGprdTNZUkVFZzQ5YWxiT0JVclB3cU53WEwveUNuZE1oSlJoRnlwQ0ZJdGN1eFFHMmN6eGszRGVydS9JWHBrYWNNWHhnNnBpd3l3OHdiYlg1cnNEanA0QTlIMno2NVo3U0ZQWUgrWXJYOHJ2bVk1WkVNMGQ0Q0tOSHV6WGdzTURqWTdUR2hjNlM1WVFVbWt1QmMvbTI5ZUM0VUdic0R4LzdFWUFkZTV1anNQSnRoSzF4ZkVwb3haaXJHUC9aU1p5TVVGZXU0N3pzWTVnTGhkR0FVSXdXckM5NFo5R3J6dnhqcmxzTWhBRWc5dHNLUElPcjY3N0VWY0NLaHRocndmWDhMMUtpSVI5Ny9VbEZpWTltTEVxV1Baa012WjdvTHB0NFNsVU1aMEJHVVN3cjhwZmVURWVnRVI0K0dWdjkyQ2JvUXN4ZjVLSEFpNXkzcG15NVdaU2JmNjVidFcxVVFyZ1FwbENNaEdkNW9uNEp0dUFkRjhBNkE5RFc5V3RmbEpobGdDdWZzU2xZeWduRXVxQ3prNENPSk13QzlyT1FLbXRYbTJzSEVoZ0ovRklFM3d0MW5RWmtreG9UZzkrZUlUQkVsZjVDUk52a2d2L2JldGdrWWxWZlBJSE91aFBnRGdLKytpemduSExTY2M5YnpTRGpzTWF3OXdKTkxVNWcycUI1LzBqS204elY4NU4xRW1lRFhjUkdQWStnL3E3dDRYa2VObk1GTHZSVjEwU3RYdS9aL000NVg2d0t2SUNEMGhLZ1hld3BsRGtPWDIvTFkxZW5jaWN1VUFScktMNlp1WlY5ZlRCNXI1MldLdTZMZTBqMjgzT2xHRFRZbGpxbHM1T0FnNyt4SUw1SkdwRFJnOEZnMi90Q0duV0FzZlZZTHB4bFBsMGxyMlVwV2xSbUJOYWFRT1hQWng1ejVZVE94V1NiZTVZbktTWHAzaGdVcC9kN2l4aUFXRkkyUjFZZ3JqU0N3VURXWTNGbXZOZHg3SGdQMm1ILzNUSHJDdGxUNVpEYXZSNzNEZzlFUGxKSU9aNzJLTThaSEVOU0xkK3VsNW9QVi9LNlpxaCsxaHBsZFU1SVJLOG9oZ3pWa1hJMk9zWTIveC9va2NhKzZxckVVam1nV2luREZVV2V5Qng1eEQxWGJ5Sjc0ZHhpOHdHRmxGYnMyb3VIRXRPVkcrMG01WVpOWDQxbWlMWkRYWFdiN0ROT1drY3lGcjhXVm53cVZpcGg3VC9xYUNYOUV6Z0lvN2lZMlVqTVdSQTA1TWMxMVFyeDhTK3ArUjJuWWVvOEJhVmx0Z2xDWkhaelRzZ0duUnF5K29aY0NsaHR3WWU1dms3c2gxWk5aZW03ZnpnUUtwZ3M1OWlpaWFJZ1dsNDlma2VYTjFpUDFDb05NY09ldEtwU2ZVNFdZZ083aHVzY2dJdjlGV09sU1g4WTdwWllSZWxHZnFSVGFXd3FpTGNidlRlcmFjR3oreUlsR1Rydy9yd1ZBaG1CdkIrUmpDVE1QR2tpOHhEcnZHMDlIUmJDNGZ4eVRBZWQ3OE0wYjNYMzJ3dm9XY05YQVNSNkxOUzJOUGVhUXhwN3dyamt6QzVUSVdmWlpuNDlBeDROandyRGVLdjhWdzI2OElER0h5Mjl2S3owMmk1WEMycE9rRFRnS3U1YTZaOHQ0K0NuN2ZWV2h6cGt1WDBqNExIaFJiNVJxZG1zbENMK1hWcWRyc2xma3VOaHBYZ0NCcTdoWjJYS0RPeFBSVlhlNys4MzI5b3dwcEtZREo5NXRHLzV5UjU3WGVKTjNvQTkxTzJXMHNRT0I1Q09KZE9DVGlCMEdtKzhBSFZmY25qTHozbFJlK3ZYSWF6dVpwYnk0ck1ZYURiSWJBQ1pQVndwdllEMjl4ZHlGTzBJUDlqVlZvaXpzdHhZTkZON0dUZEdyZlF2OW11Q2RZcGROenVOeGtCejdtRHRvWStLa2R3Qm53WUhJQ3ZwK3hPbytmYlBqeE9lZkNTZG1ORG9GQ0M2anVmN21hcHYvaFYzWWlFUmxtRUpsZFhpZ0hCUTBzNWNJcjJXQ0xMNzF6Rkh1ZmRHejFYRjZLc2toK1R6VXBCUVR4YXNpYWZjNHZRVWJ6U2plSjI5ZE5jbjQ2MFVId1ZMc1hwM2NROTYwVlNXei9PRjVaMVpRdFdlQU1ST1dMTjlvUXliTFJRM244RitrY1RkZTk5dnpKbEVCTHEwQ296VXRtU0NxTEdGSUc0MWphS1pGYlVVajlpekJPS0ZNSzlMeU0zeXcyNkd4NE15RWlpRkUxRlhodGF4NzRVNENKa2FPYlJ4UFQ2VHhOOG9STUxrTTJOVVJpcElsUWhXSENvbHBqT1pXeitKQnE2dkV3a2h1QzhOb1ZqNVJpYmN2YlpTM0FnYkd0ZkVydTV3YngzeUpKRXlzeXVrK1BNSUl5RkV5WGpnQ1BVT2tiS2JPUUhhbi9mZEF2dVp3TGlUdXRQUTJYaVRBdnRNWGlFeEpDdDVlMVZRdmpvbVVoL0hrQUNERjU5dXZtUXRBZlZSYXltTE9kdy96Q243cm1ibnhWb2Zoc0EvRTgzZ2psR3RYelRDVVlLejRtY0JMWG9jOU9JWG5XOCs0Z1NDYlpnTERHM3duU3lSRmZFOHNNOFVZenZVb2VDeTFFY1NPRGpOVURSVFNUU0hiaWlHa3ZtTm94bVM1SFBOV3JZSTRUZUhFTmhFWmFlUjM0eHFudFUydmF0a0JHSDI4SWsxSnA1KzE4SkVES0tDR2w4RVJLdHVtR1BsdXE1RkpDT3NKaTE2QVVBZWtoY3Roa1pKQ3lsRXNnZmVlNmlTUjNMam1Va1ErMzJhZHQxbk1nZCtxOHRwM25ORnZ6Q05LUW9XWCtibTV3QjFxUzZGd1dOSHZMZ05BWnlYTEE5K1JOVElVTzFydE4rNjMxN2FGU0xwMStsTHRreWNVSk5SSTFUUVdsMGMwbXBVSGZvNDVrcWt1elBIdENwdzZmc1hCYkI1dCtXVFNEMWZubXRrOFRjV0hqRm0vcnZGbzJrc2JJVEdiVGhlbXNReDZibWxKL1c5K3c3U3ZoVHgrQ3JZL2lXcldtSW5ZdVc2RlEvRjFOUkV5ZzVRaGUzaEhOTlk4MEttNXFCSlVFeUxEZ0dHTlZ2UVpULzhaVGg3NDdQNlpiUWFGWHJ0MURSTWR2ejFrVWpsSXhKbFJNY3M1Skliemx3UzBxclpGb1VuYkVpUHRpMHFHaHZ3YWhZUjRvY1JTbWo4SUZLalFtaTlvUDNpTENkQjVsOHRBR2orTkZyZUNoTHhWMUovbW9qOExRTjNYUFREaU50TitiZUFpakhzMUp5ei9EKytlaUgvSEdsQkpZREo2QWZRYXJqVGphcll3KzlFM0I1bXI1NnV4c2ZkV09KZmZiSW8yeXp6VVQ5OWxWcDFsVmpSWFN1YlR1ZThlL3pBbzFLdTVoQ2VnZDVlQW5XcW5xUVR3U21FRjk4TlU4Z0JrUTlqWXI0UTZkMXRNNXEzYUQ4elJibjBndDZRcFRZZTc1Mi9qb1IvZmFVaE5PZ0E0RTlZdWNLQit0TkdpNC8yMmFScTh4TjVwL3JXWlBzMW1JcU5xRnFSb1RmYXZBSDc0dVlIQnlGWHdzMiswS09hcmNidzdwZ05nR25JM0dZR1Q5ejV0dzRuM2JISlRTMDdmd3IxUU9KQU5KV2R6UWhWUFVpRHQ4M21WODJ6NnJPLzA0YjRRZElkV3MyUDllMkZNRjIzVS96WW9zZGRoaEpDOE5KeHMzN2JPOE1SQXdnYlNVK3J1MHJ5VHNIUGpMdjQ4UWpmSjN4L1dLcXFzdC9YSWoyNFYraEJ6TXZXL2F5d1haVk1keVl4ZUpET1doS2d2TTljL09MLzM5S1lPazZmdjVaWmJPcGs2NXU1M2YvbmZIUDdtclBUU0IrY2FrbmxVUWx4ckJSSW02bytmWE9uRVlyNWdrQUc5d29hOE5tTmcwTStHd2NGOGVuM2NHRm5LQjFkN29QY3F5V21pR252YkErMDVWUWpyU0FSbThHZ1dCZGc2YzBzSHRLOEUrL1A3N0t2SHFuZ3hnYjRWTVRhL3JNK3lhS3FkTHJUcUN4U3ZYcWZuU1J0OGxsM0FNRkQ3Q3huYVpJMFovVHFnYkFjcDVqUzA3SlJhcjlWdDljbGNYZnRBOFhGQktsdnd0RDZEeXdtdFVNc2kzYUthWmt6MWhkSkp1ME8zTzdTV2pZSmxZNTBjVSs5MXZRM3NRdG5SZXZXWlc0QjdKUkM3WVZ0bThVelErdXNodWtkRlNkQjFZU0E3bkNZdjlOUkhPY3FNdDU4cGx3a1ZaK3JhMDNFa2JUaXkxREJnanJiL01uOUo0UzljZFFMcXVRcnNyWTdoNFZFMzVvbEJBaUIvN3BTend3c0hyajAzZExQQWdrYm1pVllJeE85VCt5eGViaUN3VzhkZlJDWU5zcCtMMS90M2RscVZONzlMWmdGZWtFeXZyMFJpVWpKcUVNcUxtNDJYWlFtSXJ4R1VFZDl1NG5yNGRrWnJsOVVvQzhkbFg5VUF2SmpreHNiTFlkdjVZNzU4enZ1aTNHUmhnQnplZEhvVnFaYkVHQnFKOWJGUUhsdlBLUzdFY1FOa2hWT2hOL1orRkw2OUVYUDJQZTZUbldzZi93MEV1aUk5RXhReXIzTGgxWlJPQ2lVLzZrQndKODhWTmdhZlRLcHhVN1kvbXIydUZ1NDFxREhHcExMZUtCa1NkeUlEUm5MclRldkx4dC82d09yVS9IOEY1TGN1dU5tL3ZRNzBlMkpZWUFXN1pyWEJOME5STExDcnV3VzlXbEQ2SDBTbUhZMmRRUXNPc0FmNHEzV0dPV3VYVkN1WjBtdlRIN0JNNjE1VnptU3ZNTDlOeGF1NnBnSHJFOHNUOWdXcnRiTm5XeWRhYTZxN01uQm45dDdPd0Vtc0VUa0NOU3VTbDlFbGE3VmVsNUFuZjh5NkhyUzlVclR1VTU1VlQ3WnFFU2EvRHhScHFqT0F1VFN4bFJMVDN2MTNVdW5hYm5GMUMvWUIyRjZCSXpEazFJejk4OENsc3o3c2tTWUNYL3lkam43SG4xNFYxYjJoZWVaYjQxc1NXR2pNbDZmdnhJV2ExZWtjdngxK2Q4anNPUjN3S1VwcHdzR29oT0RTRGdZc1k4dWhFVnYzMGlqM0ptV0ZvT1ZnS2xmbTVvZ1QzTlZ4OEdPVkpPWXRVTHV1a0V3djVLMExBM2N0UWFPWmw2NlpwQnFkSXFabkZVOTB3QkIvdC95b3ZucTJXV3oyUlJEVlJ0MnFEQlByOXRuQ0tUL29RcWR4bzZ5ckFEajBMVzAxZnZSSG8zQlVOSlBLSXZCU2xiOUY1eHN3MkoraFhvWlByUWp0MGdSWGRBTENVVzFtMnhQTlhmclZXZnNNbkVTaEZXS1QxNWd2ZjJjZlpucmo5QXo2N1BCM010MGx4UW5GTUFlRFk2dHAvUlpGOFpMOWdOeU9JUXhQaVVGZUlJUWFtMGJpU2hmOFppdFhhZFhzRnhmOFIyQlpaWkhLaXAwWVgxb0ZSTFg1aTE1UFV5c1VkbmFyVTJqS0hEb0FLTzltUEdHWU1PUDhCRmo2b0Z4UngrTVVHaVlham1tYy9WVG5hSXpNTHpuTjQ4RFVSK016b3RlbDJFUk5TQ1pNU2h6V0lITUREREFzbnd1bXNaajlaSEFnNndnK2J6QXdsWGtwZjNNZDNONGt5WEFRNUFqQ09IeXdnVG9XTWJScjhJeTJMS0JraHRKNkZZc0c3THljdHhMd0Q2dUdaLzJBeWNTdVBIcjJxeUpBdWY3KzNWenVOdmpEa0h2UWYwYnl1S3F4MCtSSElxLzg2WDJ0eExUU0dNbG4xNFJqcWZXS1g4YjhiZG53S1dabXFsOHk2T2pQRXlzazU1bytBZnpkNDNEbTRyaWZRTGc2RzhiSDcreE9FT3V4eS9wblQ2VEVZUGpCZlhhNDJVOVVTV3M4bzc2R0xKM3RhbmY5ZlNJd0FYWXlzWTZaNnZ6RjVXZ1hMZUs3SndJRGhvY2NReGhIdXVtM2dmRzdodXFNWDZlejlwSDlBbTJTc1NOaFhzMkdMSERpQnVuUG01K3phSGFLSXRiUmVYN09GNEZpL3V1MUM1ZnArZm9Sd2dmQmNpSytWYlpOKzM5aE1lTWhOYVZqRkswVnpyL0Ria0NOdjE4amVsdWx0NlhHZm12RHlNUzVkUXZpL1ZyTUU5N21iM2RXZGdtaVB1YnFKR0lmTWRKRUZQdnVyMWpESVhyWnRWMkpJN2FuM0FBWk9QSWNQODVqRFpDZXMyWUhYYmFtM2hsdSt6dUpMdHdsa1UvT3BxTmNFRWNKWXRBRGhEVks3NWZtNzMrQVhQT1hyTjNIRWljaWNIWVhZeko2MWYxZ3BDZUFMTWJDMmM2amlmQzlTZ1FXNnEzL1ZRNWxUOUVtOGNRV3AyQ1lxcGtLTFpBaHlmSU1hS01FTTFpNUs2ZFFLd21wQ2xORmdpVTdEelZ2UTE4cnRpRmFTOWUwVElTZHM4a1IwazJRZk1XQUo0NHd5SlBHQStZaUhHY25TbUE2SjYzL2ZnM3hLNTlrSjlsOU5vTFUxM2o4eEtNL2N5QU9YQ3pJY1B1ZzFWOEtOaFRaZmg0WnJOSlJRdU85enR4ejBDZERkMWUweDVVbWZKYjJ3angzdXRUWll2TjZLdlVvTU9nUlJhTmRWTVJiY0pZTjVJS1R2V2ZtZ2JaOExSSW1PU1hGWkwzZzcwU0RlRUdIeE4xVmtNandUeWhIeHBGUUJGV0Zjb2hMNEt0Y2QwQlRlb3RSN3h5dWFWbjhzUU1uMC9ZR1AxWmdNV1ZiWXordHRJUEpsOVBjZG5BNWkrQm5OdXBQams2MFpjSEFqRUhzYjRRMm9VMXBkMmVrN0w4QTFxald4bFNneHpwZVdGUHYrSjByS0lDcUk3RUNBaU4rQ3lMSmRCL1FOdnFUYm5kenhPQ05LQUJCcW5mNThmY2dqS3lkM0JUbVQrT1RYWnZPOUVDS202VlNwN1JvSnVPOTN1Q2s1UDlBblltbnNodk1samtST3NHc1pEK1duMm5BVk5JTlBaUjBON3FYM2lHeFZybDlTaFlRYlc5K29KK1NnOXdjeDlwcDNPcFErbjhWSVF0RmdlZGFHekdsc3RJcEg1Ry9RYjNEQ1VjOTJQWWhCYUYyUkh5M2hpSGdrUlV1NStXb2hlYXFLdTlaK1d0NURJTEp1UWpTVVlSY1hyRExTY0t3VDdJdFlKM3dtM0l0WEJFeEVUZW84MWtLOWRZYzV2bllVUlBra2V3WXowOGNqVHFxd24yMy9OcnJZMlR5bldWcUREa1hqTldrMm5FKzZIdkZGTElQNUJ5aU9IKzVCVHdSL1F2MEV2Z0pRUGdFREt5d0dFLyswM0Q3NnF1N0VLNVoydTV0WTI0WU5UOTVnUDJMK0d4OWJmdytYWUF4aHlPVmhCM2krZk9LcEtKVzY2YmlVRlduemhxemNtMXpjRy84S1NmdzAzdGs0N3dwaG5IMHQzc292MWUrQ2IxWEJRaFg2Q3FWM3Y5OHBrajJpZHBmTm53eE1sZ0RTMTdwS1c4K0ZOVWNBWFc2aGVhbmNHTXlMVmM2RFJ3WTZ6dHBHWHpCRFFRTlQxb25QVzRHcnhYb1V2T0JyQ000TTNvNENpbEQ2aEJKMkVPQVNHbUEzR2FqUHA4ZnFrOElFOXZZcWt5VUt3bVJZd1JzbHpya2FsemFtNDhQbkFlVDBleUV5UmtKNTg0UW90Mk1yODN4aG1LWVVNMTUxdjdZYXV0dVlYWFh4eUttWk5IeDVaOTNld0hiZUVEZjU3bW9LYm54Y0V0OVJaWlgyZkZoeTRwekxaM3pDblFtV1VUSERQV2x0QitjYTN6b1hFM3EvcXNGRGU5VXF3ZE9ZUkZ4Sm5NMHNFTXpqcFIyS0RwQWRwZkVQSkRSbVVBV3Vkc2JDZTY5SktBMmFuc2Z2eW5Md0ZhNzd1L2YxemU4T0FVSGRNb3k3a0QyUmRDYUROSHVmbWt4OWI3MXpqYldUejRQL3o1WWRWTmgzM2hZUHFyL1dPVU02a1dEQWl1OWVBeHJkKzhiT3B2UGIxcVA0a0d1NmZ0RW51Q3JwUlFHcTVhaXE1MDJQZDl4bHhiVXo5ZkVIQTRVS1hROEhQRmV3VmZ2WEtIQlRwbndkc1AyMFd0UXdGRTRydEhucHYwamxHeXZpNmh2OGVFY2Z4NFhUVUtHYmtkbVBWOG80cGd3RnE0cnpWUVptSFRjSU81SHkxdHRJR3E1OStGbVRhTXduQ01CU2NCSU9BNWxYRk4rdnlmdG5HUXhLZm45eXRsNFdSMzgvb2Y4TExFc1JYM1g2L0laSldaNHhMMEFNSUZSK1JpSEx4NVRHeVo3TDh2S05QazNIY1dYVVAzTXVlVXpOaTNmY1VYYkNEck9uYm1WVGJubGhuay9Hek1GU2RLMGFMUVpLaDZlQlhTcGY0R0x2ejBheGZHbWVvWXNhMHdETDhPNWkyYmUrVC90aTJMY05jeFhwWjVvbVlvOTJpWnFkWG9qK25yZnlTVlZVa3o5T1cwRC8wcFRuRjBnZktnekNmY3M0RGplaHRpVjNKbGxoaGtVNjRLTTJGQ2RWU29iZk5qY3k3NTFLcTh2QmJKWThYSG5GSnZjVVFDSVkvekY3bEJPbmlxY1Rnem1iVjZTZlMwb2tjMkh4TE55WU1YMlkrdnlLL3VWWER6bDJVUjdjVllzdHNjd2F2RXhiSkIwdWhkT2VyRmlHZ1BjWlc2YWhFaGg4b0hsRUMyWnNCTmNvT3ZTSG5xa3Z1UU5xMnovR2dScHdCT2N0Yk0vSnJIKzZXL2ttMkd6dUFTNEI5bS8vVDkrME9lNUNwbERJZkRyd3o5NXFJVXVaYnk0aVo3d24rOGk0dDJSNDdQN2R1aU9jdXFkN1NaTDVCNXIrZ1pocVNWNXA1VjA3SFlWTmZmaldiM1ArY0x5S2Q3UmMvazdOeFdOam5mVnNEamxKYXpUWVZrVE1KN1ZFdnIwUDJiSnpXSy9zcENWTGhRZ1oxdDdnRmI3MVJzNy8zQi9EcEtxcnhielRvanNJRDhqTWRVZTJ5d0tCMytRY0g3VHM1bXhSLzlYZFhhSm1JT083OTZvNFNYZUhqUk5pSjlib0o5NlI1K2NSNGY2ODJ6TDhXb1hNbExkd1pEa0FLN3pqcTRXL3ZER09yQm9xcjhYYWxpenFyVkErM0U4dDR1MHlicm1oNmNGUjF5ZkNjdnNnUllteHpnVXBGSE5rYUJDQXRmMno2MkxZeWxTN1NQdGxPdEtRM0xlRktFOUJRaHNjZ3Q0ZXBZNklRdDhDK2NWYTZUS21OZHk0dCtaWFgrK2hnMyt4dEQvV2tHenVKUWZvMFJ4akd5aUpYR3JFTk95SGo0dEZSY3dEbU43a1VRVWprWDltamhIZ1FjQVIxUDAvdllUaDZhYWRZdWUwanA0WkxPSDFBbDZYYWJ0OXFWZWlONFdpYVlkeUZzdHpERVlvVjZ3TkpQRWNUbFFPY3VYb2VzYjJxUGkxYmxSMDVSandPcFgvdzNoRjBIUk8yT3FsdzU4WmJDODdiVUdRSjZRMG9EZ3I0eFJYZHJ6dTJ0TEVBKzEwTHRLWDY3QUtuamhyR3RFSzdqMnBxSHJBcjZ1ZXR3Q1RVdHAvRnlna0FLcmErb0E5VkRnV2x6Z1V6NXhQejBSdzgvR3luSXQ0MTJxbGNqVUNON2IzL2hqOGloeURuRnVtUlpiUnQrZThRa0tDVjVlcW91dHo4QjM1UWZLQzFsNFA3eGdYYUdZWCtxb00rWGk5NHo1S1FNZGtsL3pVWHFwcWtSMmpnYVJpWFdmTGFyb01VK1NrV2ppZFVWdHl6TVZYeDlEbGtaWXBLRklYK3pURHJuR1A0dnJpcmk1UmpJQ0RNMkdzSVkyQXR6N0pDTFZ0RU0za21JdFVBKzZ2NzluTnNxQXk0OHhaM0pyaWxjdWYvNHVrSzYwSUZKZWt5MUh1cVl3aEgvYS9PdlE0YmxlS29LZWU0citmMnNsRkJ3czlxYzZmb25GZG9aNzRlSVNYNFRaQ1BrUG9LNElQb3BHYi9HVzdXM1ZQYmgyb3B6QUpjcElWdjRrc1ljZkhZOXhuRXlBamV1YmJiMlNNTFhSR2V3Y2N4aFl5MUFNK2h4dkRmQTJFWFhNbFBmckgwRU4xN1BQbFN0K0xyU2NLTlNKRHY5eW5EMmllTUczQ3ZVM2ZuRytwTDk2djJUVVNoOER1SnpMY1o3MFZQMzB4VzlGM0RGWW9waXExTjVSa2ZObzZOL2lWYlVVY2VwUkV4SVpMS3hXdFVTVVJWSE5HMXRsUGZGVWxaQ2RXcGZKdHUvYm85d2QyanpxTjdQeGRPbkFtK1VzZWxHYUhqNUlKZ0xLM3hZL0VjaTBjSGRVN0oxRmZFbzFvVjlPTEJEK25hUjA5V2c1eGRnN1l6TmJabGd4emdaclhiT3ZXeGk5SDVSSTVwWi9xOU1xOC85bWZYd2VUeEo3dlBTdUE0WDV0aG1ZaEpZNzJIUjMva2NPZUpZZVpRT1ZJbVk3N1RKODloNU1RZlVSeTNCRGJQdGN2b1ROQjg5SG8wdDk3UGo1Nk9MSTJ5WjRFVk9mb241L1VNM1NzbDFqd3ZqWjRITzlSZnN3OWlhamN3WFhpb3RvMFNHR3paSUZodHNrVmo3dFJ0N2FDa25nYWcrVUVzRmRFd2I2ejFLWGZscjUvai9LQTVISm9Vb1dGY0JYd3ZWZGNMS1RWdEg0QW9lbm1NUmFISTBCMjRWT1BJNTJKczB2RjBsUERMT0lnQ0IvVmN3SWppbzZ0UzlmVUJVczVOaWFqWks2VnBuWTFWN1J6VnErY3ZKS1FGSGZpalFncHZjNWxNM0RjKzVUd2E2Q3ZwM090Ylc5aDVZTVhXVExwa2pqaFduYzFUZmwwWGgvVEx6WEV4UU0xc2cwTXJoMGxudGxpSVhqMGZkVEJJMzk2QUNydXhPU2dsSlRVOGVtRjAvcytmZXJPMWNhKzFiVU1BNDNKVXR3WWRRQzEzMjc2bzJxSkdFTE8zTHR4V0lET2FDeXpHc0M2aHlKTnplVTI4L0JXVld6NDU0VVY5ZXhkaUpjbG5YUFpSdWdhY0FuN1lQUG85LzhOTkdaN1pZcXNiNmxEMEZBN3krTExSN1pxem9Pby9pYmxROExDVmczcWkxcThScmFwVmhXc205YTlxUTc0MGtoSFM1ZmxRUlNMVzVRMW1yRXU0MjY5U0xHWjdKL0UwQ1BJTFQwM1k4MDdSazhORkdpY0VFdE12Zis2SlByMnlhVUFvaUk5QjhnckEycGgzYUMvV3d2d2xqemxjaGZoWEo1WFZPc3M5UkZ5QUNGUEx5UVB2N29FZ0dZRGs5ODdzaUd5eDlBRU4xUmJZRVJJNkpPS1RrN2FyTWpxdWIzeEJGV3ArTE1XdzZuZ2tNWkJmbzl0RUFEaVhJOWY2d2hyb1oweXJSM0dhR1JiakR4Vm9ZTCt5dlZIczkxSXkvZGtvZGJVT0tpRjRpcWRYc0pxZUpLUHBZYldLWUQ2NHEra1ZlblhhUVNGanRtOStLMFBVeCtiQjBrMzBFbHYzalBpUjBFZ2o5WGI1RC9PL2dOeFljODdEcmJRUDZRZmFkRGZZL0JySHM1QlFPY0JNSGZ1eXE3U1ZYY3lSdTROZmJCeGV6RDhaczlwamNZMVpHRm1CODMyNlQrWUxvaW9xcUlmRVVXNlgrS3JsUFdzSXd3UjZscUR6U0EwQnFKdVA1S2Z5VE16UG52bWs3Tld1bldtWlZFNloraXI4d3hDN2g3c0RlRFlLRGRvTm4yeGxXSkVvL3hldXVsQ3N3Z0N4OUt0SjEzdG13YlBJZjVxSjR1NDBrQUVRZFFxS2prOFYwQlEvWEcrNjJJTldMOVpDNGx4Q2U5TlE3UGwzb1RhYm5DU2V1UWMreHU1OXZHMVNIWHduaWE0akFRZ2J4QWwvUlgxcEtYUk4xKy9PQjRxd3c4cHlrdDJhUDUwTTBWTjBqMm5Lc2lROHJac3gyaUV0aWVoQjYyQjE0dEVLZjA4VFNwTVhKNHlhUUhMV21pUXBrN0xmRktnOUEwZDNaam44R1NqWEczN3BtYzQ2VnNPM1MrYWJySFRGVk9WblRLV2pMWmdTOVp0c3l4cm9DKzl4VXJSdWdhUWN3TzNYRjBpNEpzN0tlcVNVSHFaRGV3RU5rSXoyYjJtbk5KdVl2OGhGbVliWWdUS3lRbTQzRm12MDhBbUtGWGN3WWFWNy9uN1JmNTArdUh4RzZlS05YcDVsY2R2OWFYTmc5eDhib1p0KzdvMlZ1ZUEybytrQmtiVmhSNElnRlZuUS9uT0NhbG9sanUya2tiMzFHSHJ0N3ZtQk5HekdGQWZlbHNCSjd3VHlMOGpjNWpEUHFubWJyQnJGYVUxWXlGc0Yyck42MnhuU3JJT2NQTHArbDgzaWd4T3MzOUpuOTBUb1U5a1ZqK2dUVlpwRG1tNTV0QWgwSXdWSGFxNlpkbjgzMHhENVlVQjN6TUxiY0dhNDgvRVdJK1hHWmtsTU45eFhxNjFrUWJmM2syKzJMK2cvdVBhZENiVTZHTExuNTRiRUNPbWd2QUt5RVRDK0FPNTh4TEg3L1hJbWNkRVFTRElTU0V2alNrUE1MbEJzRk82NmI2Zm15REpNakNreUVCWjE4Z29wbU9ibWpCeUNxU0hiSy9yVmJNTE9ZTzV4V2pkU3RSZXpnUUxad043c2lvYk9vQ2NtQUMrblI2eUVtV01vOFJqMmVoNWVjUk5ORnVQeVI1SzhlRm1mc05aSWdqeXprQkEzbGJZQWc4ci81R3FCMnVlN3lYZU5Eb3dMREpUS3AyK3lYcjdPeTZLaUZ2Zko0bTFKM1BIMFY5SFBNckdqd3gxS2Ura04vMFN1QUQ4VHpxR0ZtcHp0UUdVWnZkczE3Um5EMzU5cTl5RnoxS1VSR1d2d3VjY2lxSUluZnZySnVER3pJb05Tb1IrUytFeGtLdFAvU3g2SEROYy9oL3V2TEJqdjlZazRZQkhyamdSMWdwbmlkTGU1NnFianAxbURvbXQ5bmtTMUdkOTl6NEhLMkZoYkVqMmpwWUhCcTRSMFVJLzA4cTdZOE40dWFDTllUMktVeHdmaEh1VjU4MG5qVmtEclZlNndIVHpmQk9JbTlqNkd1SnN6eURWTUd3Uk1mOE03aytFSG5MYWJhM2NEcndlaTgxTGw4RDRQTVhVUjZhc01YWGZXdDdmS1hpUnVaSGd2YTQxNU9aaDN3TnFYQnIxMzg5WEdZTno4NThDNEh3UTR6S1paOHRXRDRNQjgyeFJkQnQ3RkZkQ2JVZlhDbGpFbWNWWkhVSUROUlVnWGYvQTN4TGhDaW5XYnFDSENjSEYxVlFwRVFnb2JNb0UvbGdHZUV5UytvaW1scm9oNWZ0MVc1VWNJRWRDWlB0Rk1HZzBCcGNaUXh0bkRMZVFFUG9WUnRuemE2K1ZFLzBuVnZ6azdJekRFUllRRUZTUS9wc2N1THZVMlFidzlPSS9RbWJDUDRsZkFQVHRndW1aOXVjZ21tZ1VYbUdzRE1oQjZERkRKSnVIUmc0UzVYTk94RzVQNlBVbjJBSThQbDZya094VWxwakJLWVRsb1AxdktSSEZxVFZoUjUwdmhuUTRNajRnWHcwalZ6Slk5bmY3dUlIcHNoU1daRGFrNkY4QjF5VktkdGVxbVFBV1ZacUFhQXlGdFJlazhZaWtjMlUwNG5EbVNMUGNmei9JdGZ4dk9qMktUR3A2akdsT1Vlc2praW42MVdpVFVyc1ZDdDlwS3VUeFBvclN4amF3MWVESFJPd3ROK3E2UzJWSTRONlBkdWFRMllxV2RwNDJTejh2cmNPUHJHNTVVb2lOb28zVUJTcVFYdGEwdy85SnNZeHozeVZ4U3p4Y0hXYXZhNVR6Y3BvN29MUkpjMFdHYzRaR0RKWlpSa0wwY09MaUFhUHhVN05TRjFPakxSSGxZQ0ZJemEvZTdlMk5RaStnL2dVeUQwdFRaSi9nbzF1amEyVG5EaWRnUlhGR2c0emltR3M0WXV2bXVuVDBlRThaV3dhVUt6bjhJVmJ3MldxUkgrb3lMc3dEdVFEanlFMjZINnBQTW5EanQ4cng1WURPc25hWlFXL1kvcDRKUVo3eVpNVmhjbnJvZWwxQXdITU5YUGorclZpUWlYKzhuRzdBSmcyb1lxcGp5b0I1a0VxOVRzcHZFeVQ4K3NMZnQ4SDc0SzFDbDBwaWdMdG9vYm9XemRocmJiczI2RVgwZmp3V01LcHN5NUdITlhwcWpnWi9SeE5vZzE3U202aFUrczdNTjBEZGMwR3pNOENJLzRlUzlYeGs4d3cxblhJNm1hNk9IbCtCTTAzRmIydHpyaHNZODJvVkZQNENCeFBCUDhhOHdwNmVDVzcweFRRNXZzcGdpemdZbldTSTNQMzR6OUZpbStRZHEvUmovaGJZRUxTNEN5Nk9aSDRDbEhpMjlyUkVBbFQ0LzdnZmhsRFBhWktNWHNDUXREa1E0citzb1Y2NTk1K05LeENVTFROMEtOYVNxVEIzUnIvY2toZTJUNHJudkZNZ0M2cHZhbFh5T3BxVUhNdXd5UDcvMDNIS0JFZndvb0hrdnU5S2JCd1V4b3ZSMkxBc1F2RmM1SXFienZlZ1lWdUlSMGZ3cXV2czRwclkvRnlYK0ZyazB6eEY5SG54MjFVbUcxSjh6WDJlbEZSdjJjSDgwdzlPZlhsc3RFczY0OTRNMmhhOEg5MnpyRzBKNXhKYWVMcGZDc1dNb28vdW9HWEgyK2JpaDVOSVo4QWZEVVdIa2JPeGxuQjdad0ZSVjV3RmpPKzduaUs1K2tFUFpobFdUcDN1eU5UQW5PT3FzQmxMK0lwMFFJbEtRMjJjUWVSem5FMVI1ckR2emd1QmlNckoyZFZTeG5TZHZyQUVOY2YyVmlZNldyZXkyTmpSdGlwdWg1L3NKOGxxMG5lVkdqRmk4VnlVZTE1UUlsY2s2b1ZrNi9XUGk3ZUwyaFVYdWkvSnZyVE8zYW9ZTFVLb3VVb2ttc3dsQjR6VStTU0c4b1Z5TjVGNzBxa0V3UGVNTk0rT3NaaDZtNXR0d0xjSmR1UldONHJPbzF1amxTK1ovREVQVU1ZRWZpOW50QWtUNDdUakhtY1hTeFpWR3dqVjgvUGg5KzF3dC9wdHdGU3FZS0NVMk5YRHF1Qk1iSHplL0VVRjRvNGFtME9jYUdianlnS3d2NGVPWW0vTXVLdG1yMlpDcEt1QUUrZDFYaEcySk14K2RBckZkTXFKVkFMc3VWRk8vc3FUbW4rRU9ZVnR0aWVyV0h5ellXRXAweEJ3ak03UU9SeTk0NnBZcGt3Rk8zRjRneFlHYzFQbDgvRGxxOVRrMEJCSjVoeFRSaVVsQjZ1K1Jtc0FxRTlFdmxCYzVIamRYTjhxcVYxUG9kcE1GUi9uK0V1WVVZdEV6VjJGM3VkY2p4TWlCTXhJOFhRa0dGWDlDYnk1dkttQTY4TWYxeGRQbUk0c3QxL1M3aTZqYUw2N2RubFQwMGZxUktpMFpHWE9HaEErK3JjS2I0dXh1OG1RcUNLYmM2K2lpRVcrMHFtMmNlMklsVDRLaVNDUkNYVTlyWEFxTEZrWEZDbDl0ZjVFY2NHcy9odFpDTW16UExnWVdYQ2RyZS8wdjRwM25WSzVqYU9LV2VHZmpxZzJINWdCT1VsV0VBM3Q1eWFsWW8rdE5oUFJtOW1LeUNmR1VJK3F2eC9uQUZEZ2JJVkxOL3V0NWtmN055MHU3eEpLL2lybW9qbVBmdzVRU1RCYXMxdGtxK0lTQ3pwaVF0b2I5QWkxYkh3SUExRzdpTHFXbDIwNE9kVHRONnkrNUN6T3RRcW9GMnZyRXJ6NUVsSEUvSno1V0lHSEJhbXhUNXB6RkxIYUFRaUtrMUwrNFlZMUpYNXZqa0txSkk2TmUwY2R0cW9lYndhSDBpeGUvRXpmRTlEWnZteWNVcHVoWlg0Nk84RldiRWRKNzhWWXcrNzV1Y2NsVUoxa0JqaVloVlk4eEo3YXJvUGtvcUFzeXJRV3JJL3RycG9YSjJ5SlpmaGRvemg0ZHVVTEJqVmNaUXRqMGJNakRjOXdRU0g2cWtWMHJ5SkgvYm04cWNod25zWFlpNDlnMjBoY0hHRkZFYUJ1MjRiM29xM2NkZWlwZGV0QUd3bnFPSjFwU3FybWRnOHJQUTBOYWRlZHpXR2xOVE9TYzJNc29lVzU4TGwyUjQ2SWZONk9NRm9HZW9HRjcycHpKVDlGRDQwWXRXbHFGdVBHTDBtenBRMklzaitWOGRqdjBCWnhld0gzRXB5VDhWbzBuVjFrUmFZaFEvTk5BUDRodmhlZ1ZkQzBKa2hKTE5FR3BSSzdCTEN0aldDaG5ybEFGNjZoQ3d0TlIrREc1SmVKMEZOdVNGcEo1TmI4dUR0Mk9ZYmFqaG9Qclpteis5a0lHNWVJd0J3VzQ0V1ZQWTl3WFFyNXJobXZOWVhDcC9nc2I1MUkraFlqbjRWc1pLOXU4ZElSdjZEc2hraEpyVUVIL0JUS1JRbW5WSlFJbWJvTzdqZUJySFpwOGx6Q0VldnlFMzFTYnhrcU5DUTZ2NjI3S1FySFBLZ2tta1N4aGo4YWRuTzEzcU5XNG13bEp0K0lOdDZBT2NlWmZOYnJYNnpNK0p4ZUtTZDVaMlQzS0M2VE9MMnJCNFBuclFHWG5FYjh6VTByUlNzNURRWFRVUWM0QzE4Yy9OeFVnbzRNVWZHY0N4VmM5WU9FdVBHMEZ4MUxsNURnb2dncjFOZ2N2ZEttT0E1Q1hJU1JCZU9taXFnM3BPK204bVZLUEg0eTRUekkrS2hFQW5OL0x1ZDkvNUNUbjVUbDdDNGpaNGQzS3U1OTlESUZ4NTZGbGUyR1h6RXczQ3U3YUFsck5yenZhMXorb0JGZDRkaFN5algvM1lDVlZkRTdoUWhqdGlMeG4rMlpyM0FRRGNLcDkzM2FhT25HRDVzd1RscW9SajB3YU1BNE1CK1RYTTVRSlJNZzU5d1ZzUVFJa1hKRGh6WlRjTDRkQmUvM2t1WkV3NlpRaFNtR0FEWTRaVzBZQjIrS1NubjlybEdoUHI3a0tJak1leDh2aHhnd3FXQ044RGxSeTZWVVNtR3J2ekNnaC9Oam9sMDZiNjJ6M2hGYlZUZ1ZnWjlBb05jb293OFlCT09nZFRJZktUbWxKTXRTekVqTXp6amRGakgvb1RENWVza0IxTnZhUGZEVy9hbVdWVTB0emJwRmMvSFo2emlJVE1JWkI2d05xZW82S2NweFh5blBwbjVWTU5lMjY1SkZjQzk3U0VVNXpDd3ErUmlDY0xZQnhZd0hFN3YwUlBqRm9wMnFheitzdVFoWWpPd3kzQzlJWmJBVlFLTE84ZW1LeHN5QXM3V25aY1VVTjJNdXRTZzg3Q2F2VS8vT004ZFh4ek84L2pmVzZmdUhYdGhqTGZSaVZNZnhtMWJVZ0hmT1Y3bTJTeGlGbVpFUFRvNE9iV1czdk9JVFhnZmJ5MkRmQmFLbE9vSVRXUmtGQmdJNW1CY2c5RE5La1FGTG9RMFVjMUZEK1JYM0dLU1k3MzJMcjZUditpU3dZZnUvaUI2ZnRlTzlqdVVxODd6eFZBWVlNZlYrWmdPbHF3R3dTNDZXZ1BCa1ZBcVM4RmQyRjJYL3o4Z09yd3VxdXkrT1FXL3BPTUlLTjI1MFQ3OEVsS2pqRDNlVmZMcWxYbGJBYTZudDdDL3BGcFNqYXJTWENGSjRMQndnSVUrdm00cWVYN21aQTdhQUNYL1FoZGJaRGZYZDJCYlZ4VmhFbitCT1c3QXBvcWlOa3Z4d2tvUnl1NStNbHlyaVpRVWZza3FLVm92MzhRNmtpY0tUZ0Q2blFjY05JcVdCMDFsUW1idGdlbERVZkhGTndrcGxGUmRYcGdIa3BqNkhjZHdDT3lrMFh5b05qUDRlcUwzaks0S0VoRGpQNzdzRHl3b2crNENLWGU1bTdiZjhaRjEwcHRPSXM4d21hWDY5Y29qeXdVVGZrUlJQN1RydXRwblgzSXVZOUdsZDkrWDd6YVpjekFudEhqL0hzRVBCblVGdm5XYk5wbWxVOUNQbTFPV1E4Nk43TXBsWjRCOElzWVZiTDNub0wvbGk0czl5OExIaXZSQUtTclNrTjN4QU9SWlhmSHhZYUFEaGpiV2l4bTlycGNmMmR4dlIyY3hzSHE5TlFNQVBNTnpOVjh0WXRQMC9jS28xdjlkNWgwa1VLQ3IxeGpzN05EVGhzdkpESUFMU0VlY09MOTlDSUdmZklKS0xvYi9EVTY1SmJBUGdYb1hTWG54ZjJZSVQzVDZyakI2cXpJdU40OE5tTjUzbVgya0JlTmJTQ25uTlVpV3VjTVYyQzQrUUE4bzBJdjNkOTQrRFNaUDZ2THFkU2lGdDljSjFsYkQzaHo5K0ZSSkdaV0JpVUsxV0owRFRLc2NDcUhWV002M3FmSFZxUndCMGR6Zm5hRUVPUlBwekYyRUJYL0hzNFpuYmZWN2FNVS91YVFMa1UxL010SEZGamNuY01ET1F5ZzZ4R3Q2ZXVDWE1uVGVpZ01RdnFtSFVrZjNLYWVPWk5MakFneDR4dTJNT1dwRzJYVTgrZWh5dk9vNEYrTWdHMVJWZWRHOENRbzlWVXlHS3dCVTZ4cFVHTHh2Z2s3ZitjRUJ4Y0tZY2NINWJ2cnNkNmNhaEQ5cUlYRzUzK3ZDWDlFaUljUXVkd1prdis0ZUVLc0NtTHhHWDlLamc0eGdzc0l0Nm4yMGUxMEQ3WENLaUpVK3ZLcm1RMkROUDRSTmRmVmYzQ1QxZi9XTTh6dXVWaGZiV3gxWHQ5eTdrUS9Pc09JNkppcGh4RTBQRWJyMWlDcklIWVhRRVRieWIzOEVnVlU2TFNzMW1aT3g3VFAwOGcwQXhlUmN5UjA3dHRMdHNzZEl3cmU3dmRlQ1grMTJBY245Y211UXNEVkE4dTd1TUJBV28xY0x4V29nQWd3eDZRdlNwYm1yRUFkWkhNNVJtS0U2NUpJQmdLZ2pjaU0vaUhPOEU1eitGRDFXQmFuamUyVU1WNkRtcDdpdUxqZ0l3emRFVmlzOGJPSFNyVnBESmx3a3pXbnpJOE1EWUlVODkvTlE4V2NqNk9QeUtCY0VFQWgxeUl6cjZ2cml0UndUV2pOeFJaWi9KTXlyR1NyMHZNbnU4Y1JkOEo5RmlVc1FZNjhWN3lPRXY0M1NreUl5MWRWRmNLOEdZaERYUGt3SDV3b0JaTUl3VlF0RUJKZ1M0Mms2aHdtTlhGSlMvVDM5MVMvWGdiUWVVOTNqdkFVS3FTOHk3bG93alpqMHMvUmpLUzh3aDgrazVQeXZEVGVLVGw5dCs0NTg0b3Y4YnpKa3daZDVhZVl4Y1R1WDd1bFBHWmVuYUFHekhtT3Zkd0JyOGxWR2h4dEdtNzI4ZEFjUTh1TGZ6YlVjdjFRcktGOUYwQzBDTURqb0VXYVI0TWg4V1Rld29RdTNkSEdlelZMYUV2UDNWRm1kbEJLQ0oxQVNyVkZaUXFQYTdXVGRkaU5YUVVqb2NiN2syQzJuR1llUWFQNnlzSUFPSkdYTmJFQU1STER0dHJXcFg5WjkzNFowUTNjNW1zaEtDZ0ZpM0xvUnpNT2N5V1FBdlBkaldVd0FkcHZPOGpvSkhDc2hxT2F6Zk1zU1hOVldaZ2JjSEdaNjVqZFZ2WnFkSEhreFoxWFBzWnllb1g5WGtGZlJQd2UvbW1VSFducmJ4Z1RQU2pxNmEybkFhUnVKVXIzUmR5Y3B1aDF0ZHRYUk9mNzFkUDJCb2VJa2JJMk5KaTZKbDQyVkFmaU56ZU5wRUlYV2RPTVB2OVowVlBGK1diSVFicEJ4ZzhMM3JuNFd0bFVuRXlYTkJ0a0lNVzlNWjhRck1iTVNCamhyek03UlZWQVg3MXhaMWd3QmxLWWtaemFNRjkwVzl0aU90OWtmRkFpZkVxbmxHVXZHYzJLeFR1SGdvbXZDaTc1NmViT3pSdXhxVy9kY0diVnN0Qm5uVU5MS2pRd2JnVW1sZ0dZK1VYVWM2cnpvQWt0Rkk2OEtWSUhHbG1CTVlOQWlLRVUxUzMwY2ZZa2FiVXhkL0hwWWFEc011ZURuWktVVytoN09OVVEzbFZzR3JxbnNqb1FpQjRxemhqM1d0NU85WlBBWUc2NXZLOHh5T2FRT0JTKzhFWHJvMlltbWpxbGdUMjJKNHZKZEJvMitQMEM1SFNYTnVMWHV5dHMwL1NGM1ZFZDBJTU1HM0hVOWFpemxLZndjb0xBalJ0S3lwVUpxdXB1Q0Q5RWJkekloaHVxRnhhMzd5bWdWNDlYNHlqVUE1WmcveENHVUROUkV2WHJoUUduRFppTGxNdndnNUZvOHgyVjhiSFA0a2xQZGJoRUhFZVN6T29OR2djNTdQVEJPVE9UL1JxN3YzeXFUWlZZcmRJQ0NCcWNkMWFGNjF5LytORU8veXRkakNDU09weHR2T1hBWFhVZEhXZVNTSDlzSEFZbHpWY2FpcEJleVVhTkRRanRLY0xFczh3L3VGOThJVzQ3bmticWk1bGZYcXdlNml5TW5DTTQ4aE9XemYxdzBqVjYwbnZJd1YwU0FrWURtYTZUOEhNSktaYkljUHZsQnZyTUw4WldtRXI1TzFkWURFVUkyMS9saHFPSlBZYmNyZmd0REl5UDN1MEs1Yi9tTUVIa1REUUkxQ1UxRUhXR0s2U0U4OXBNYWtiVnhGWHlsUWJUaFdQbnZCNDZLVG0yOTVLRWhyTW9kZ1NmZ2YwRVVkQnUzNWdMQkVNdzJETUxTaUU5OGd1bnBsd0FaNDVJYlBhdW5ZblJrY2RvblRTQmRkTHRmaDBZREgza2tKQ1BOMUE3U21SMG9QNWFIajJKSW9NaVRLVGgvOTM2d0NVaXFmb2dlcnlML1lhN3JzKytkakRBTmNqcnZIL2lYZGRjeldTUXZvYmE4d3VQcEd1dGRLRmpTZHZzYmk3NUhZZzJ4VkEyMlN5Rk1YVUlIS0dBcDh6dzd3L0thOU83Z1JieFpyeFlnaWg4NXdOY2NZbjNZb0FIVldnSy9QbmZhaEdscjlwOUwzUlp6b0JsaFR4WUxiK1V5TUNCQWRDMk5PcUllOVpPb1JzbTlXalNLNE9vOXYvVHVtRUJTK0FnaksvVzhJMlNLbXhJOFRwbEVWcE5JV0JqU3VjNWJJSE0rQ0E2c1FzbDVxRW9pcVBZOW43WEEvSW1UWUxaVlZQYzNsb3ZRcUhWOXV5eVNWRktFZERVbTduYzl4b1RMWHRzNGZNV2RWbHI3SkVNZXZwOW9ad01oYzBWbWNKV09HL0tVUjBXWE9qWWVNS0RWSEljZnhmQjNncXNWeWhCTkg5WjJud21McmhQdU9uK1FvaHljc09PY0RuUjIzbVFLNXRBQUlYcTA3WVpHNzJ2VUkyTEUzN2NXRXM5Q2xEZm55d1Y4TXc4anBOZDNZVEJldEYwdC9PcWpLeXFNSXh5eCtkSGcyRTh0TXJyZXRVVlJ1WmM5Q2VNOS9KVDhNZG1SUFJJM2grMThTNXdRcGNIUFlVYVI5QjNNRGh0Zkh2b2xVazFpVy9ydVhvQ1ErT08ySHJTNnRVVFc2bUd6alZIbkY5YWw5UUs4U2hOQU1nNTBwRlA0NlJWcDVPdUM2WGhGYzB6QW83TXpsNjBZS1pVaFp0bjlsbVo5MEwxemliRkdSQUhaRG9ud2kvWHl4aVV5RUwydHdOeUZ4Uy9qTEhLOS9JN0xPTlVZbHNiZmdjanpFM0JYYU4zcDZGMlBYdFZrK3FrR05MM3RBbWdMdXUxeks4TSs4Z1RWWTVwZ1g0SE81bUphSUtzMGRGZ2I0aXR1dG03N1NYd1JPekZlcXYxSENpd2t4NDMxUnovcVYrVlo5QmU0NDFrNkMreDkwcktaZ093S1BoTTNVdTlONTNhY0hZamdvYnlKdFFtUk5oVXBNNjhacjF1UzNHV3UwKzhVVHE1RTBZelN2RjZGcklVOW1xTkpJZm0xMVUzVy9Rd0dyZGtKV3h4NnpibWJHTGdyb1BHWFpsZHpVUndzNEJjZGZJdFBJMWtBYkxReE43cjNlTlF2a3dTdE1kaFFnOHpQb240cS9jQ0JKMFl1c2l3M3NLTmFtSTg1SkQ1NlRRQTBtWXJkRjNxV1g0SnNOUnBCMnBER1VReDhIZlZscEwrcWFDalFXWThKMWo0NGs2cWhpK21LMkFMWHMzSktqZldoa0VlOVc5d3ozdTkyU3dUVjFTZjZkWStBWEs4Vi9CM1VBWEtwSUMrV3l5M0o0MVZmVlRVaXRNN3hWR05pUVExcUNGR0pPMlIrSUxDb1UwdU5pZVgvQ2lTQmdSL0IycWYzTFR3Q3VtVTVUZWdaeTZGT1hvZjc2RXZiZG95T3IyS2E1ZEg5aHpaQmQ0OW55N0xJdWc5eVBHUmFvQTRtRVQ5TExDSzFCSnFzNHptNFcwdzFYd3JrOWgxdHo1UmN4bElrWXV4VzIzRHR1bGM0TGtQdGUzbVEwT1BRTE83b05ieDdRVEtxTHBRa1QrUHJtNk5temNpcWlvZ0dZV21lbXJxV1BSZVpDL3pvSyt5anVvRDl4MjB0VDc3VU9RRmhLQTI1ZUhrWUp4TnE0ck5SQ1NXcldkb0NXSXZXUE9MbDRkSEJSQTRROEliVUlpTmowV3VKRmNMU1BSNW1adlJrN3RxaE5zaEp6S0oyc0V0bUlWN3Uzd29aU25hek9LTVpTVGkwTUxRSXMwZEpBSjJwckZnYkV4eWdYQ3VVUjlLZXJIdytXNVlGUUIvOHIwRjBVMUhYeUk5enNRQ3l3bi8vMlFBQkFCb0FRQUFCTndCQUFBOEJBamNDQUFBQUFBRTBBWjFBQUFJQUNRSUJBUW9DQUFNQUdWUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZ3lLUT09PC9CREI-CiAgICA8L0JJUj4KICAgIDxCSVI-CiAgICAgICAgPFZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU-CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU-CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IFJpbmdGaW5nZXI8L1N1YnR5cGU-CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U-CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0-CiAgICAgICAgICAgICAgICA8U2NvcmU-NjQ8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk-CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI-UmtsU0FEQXlNQUFBQVlqZUFBRUJBUUFCaU00SDVnd2NEQ0FyQTdjQUFBQUFBQUVqQUVBQUR3SUFRQUlBUUFJRUFBRUI5QUgwQWZRQjlBZ0ZIUUVSQWZnQUFZaGRBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQitBQUFBUkVBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFFUkFBQUIrQUFBQUFBQUFBQUFBQUFCRVFBQUFmZ0FBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUdIWlFBQi81UGZFeUFVTFBjTUJlVWZGTWhxbU56VHNad3NDdVpoNVN3bEN1T0xpdlN3LzBHR2RmVFk2NlNScHdCTHd6aHFqQXZabG01Q0lOYUFlZGtQOHIzdytza0pzMDc0Rm9DQThVQVJFaG1sbit0YU9GQkwyMkdDaWFFb0lWaHBCb0R4VUNlcGg3dU9LMXBXbnQrZ1g5VVdlNGc0M3FkcGZZRDhDUUJFTk5iQTU2R0oyOVFhRVUzYzhUU29Rd3p5eEM5eGVSS1VZSGRlYlFZN0tycnBYREhIVjRrQUpCcnEwcjJiOEpBSVdaNy9EN1VMdGxpR1NCQWVzZXlDa2k5enVPaFdnRkVGZTd6R24zd0d5TlFqZWpaRUhsN1AvWElqdjF0NzIrY0hONnRBUnNwVXNsenhyYk0waVhaVUxOYXFRTFBZOFhtNml2bVcyYVluNnVFc2RFVWZkMnNUY2pvUTFrVnN0S1JuRDRUaU9LOEpnRDhEOW5ueGJ2cFVNWlk0S1RTRzZWRWgwZmF6MjVaV1NNTEdPVzVxSTlCL25lY3NlQUdvbzJFWnU5S2wySkc0WDgwQVV4NXlleGRWdGR4bFFCOVpoOGlQRHJDclhjeVlKRys1alBLL1ZqRDZPS2RCZzdNWTFPcUEvR2NmR2UvTVRGMXJJN21CSUlhVWY2aFh2MEtBOForcXhRRjMvai9JRnhEWEtJOERZUVhQSERUdnZQS3RUUEhpdTRoc0EraVFtclJHOFkvL0dnSi92ZFhIaG5tcHd4dzBkdkpmV2cyd0hVVlZjMlM0YjJOZWwzNTY2eGlEUFRucjJtUGw1SGw4SmZGUmVueDlLdWJnZWVneVZsWmh0ZUZhTGl4OGo3dVoyc3pUaGJ5ZElmVWdLeXl4N1RCTEVyUWNQSkJXT0wxNHNUMmtucm10bmNIMHJ1OTc3TjFDZW4rUm1DTGlURWYyS2hBMGZQTEVOQjg0bzlsLzFtWnVZK1Jkd0xpSVM5SEhWck9tYUx4MjB4c0dFeEFlQ3M1SjF3dTJqaTJRcVB5Nk1HUjluYmZ1dUU0a3RvQ1d4TmNkYkZaWHRTSDJic3poZ2xBc3JwbU9UY1VsR1lXZzZNNGsyVXdyam13WHVSWE5RajRTYld0R3ZDQ3BnTWQyRGxENDRDT1prMDdNUU92cEpVNlZ0YVJBZ3ZHbXoxVVV6SzFUVXlFRXRFTkwzTDBzRHhmOHJjWHBjaXFXLzFqSm5BU2ZXZHZuNjlwRk1Ka3NmaG84VnNpajhkMUZic3JraGZTN3hrVUh3SnZXRDBEMW15blhIRkZJUk9keE5GbUJleDJwenZFK1UvMFlJZjlsdWlGQ29VMFdpaENWS1dZUFpManJ0cWg2MUpFdmQ5RzNVMTdQUXZSWS96djlzc0JwLzJKNFVJMWk5QXNPVi9Pc0VXMlVZMlJ6bkJZaGtTcnZEZ3FYSVd4UFRvNi9GOTBBUVkzbGt3S1Q2ZUV2bEw3UU5FT1BvU3VTNEg5bW1IMWN2SFNoOXk2Z2hqN1I1SkdKcnF1L0JEYTUxNERYRTNyZ00waml2Tlk0UXMxSzk3SzFpVllqNUhGV0FTRmI3SzRUNnVUUlhHOE5qY1JuakRZUVdHdVZDZno2SCtwUURFUU5sZE1zUENpK2krSVhCeFhwVEZCODc5MnVJKzNldFdhUGJnM09QSEtlcFoyNTZWSDJxZnhYY1kwTXJxN0ZWSC9MN1d4WXN5b0h2NkRKQnJDQzZ6b0xxdnhRQnJSL3BMaFMyZnFIeXBkdkx5aEhuRDc4SXNqcmF5Wkx5djlVcHVKT2M5M3UwTW5kTjNBOUlPNmV6ZndTVGU4cjF4Vng4bkxFSXJoRW9mQ3hzb1RkdXhDOHU1R3hMNjhvQi9vTXMzZTMyd1dLTTZDUG10ZmdDQXRtVnhkVW9CLzc1YUwwcFo1ZFJnK3hsRERDaVFCU2txRG9OU2dBMTkrbi9LbXpMK1FYbjBXckYrVEFLSWsvYVRuN2hMeWwyc2JBSUY2SjErd2JvMHpmSjgvOHlTZk1sUHpwb05mREtVQVhoSzdIa0Y0VEZSbXhsQWQwRjhrdE5ubVVqMGpJbWthK3lCT041ckVoUFEyZDhMYS9QbzFHSFVCZDc1aUhmQ0E5NFE1dkIraldFUy9IQUg0OWdrc1VZejM1UFRxUVR4UFFIcklVZ2hlWm43ZHZlNHlFMlhSMThyVDhmRVpnY3B4NTlic2JWRFhwUlNKSUFGTDcyNkxRMnlDVlByRFdLREFLdmZyMXhWMkdiWDNJR3RmdDJ3Tnkzam9Jd1A4YmZYZ2hucld5bzFlSTBTeFFDM2FWakFQNGw3dE40Nlg0RW1od3Y2OFk1bTRpVXpha2VxUEMrUDhaZFc0U0pCMGJxRHlEM05xb3NDK2ZZOUlCeWNYUFJLSHJJMk55MWZSaGNPd0Z1WXNML3VUZ2xLK1RTTWFvRGZCdFlHSUp0YjFyQ2wvNmwxVFE5bkVoR1pwQy9KTlNJd2lPTVpLV3ZwOS9BR1k2b3pOSFo1V0pZQ1JtVHYxeExJWTZBRXpiNHpGbzJCOEhFZmV3NGFJOTRHU09mNWhaWmhrVWlySklMMmdpc0FCMmIyOWRWeGhQQTBxTHU0NlNWcVVSTk9obUZJMnZvM2dtUFlURlNtSGNTUndYdVl5dTV3QWkzZDduS1o2Y1FUNjQ2SElKa1BJM09zWkRmYWQ3WkFLZDcyZ3N0TVVxRUY4OWNGM0NCdzEvVGgwbGhUdEZxdG56eFlzRmpaQjdKT2tSbkJNZTFNUUQwVDUxc2RIOEhSMVYxbVRuVVRxejlYaGlRV0Izd0xtWnc5UUFlOVhlbUNFSllnMGI4NE5wOTRseUdEQzBJRzdPcVVHdGFseE1HL214WHZqbjZoVVRyVjVvWGdvdk9rOUZUa0tEZEVPZnlHemJ1dHcwNVRBUlVKbmduTmNYZDZQNkVnNHB3NkNsNDNiKzNMaFpLWnhSZno2Q2drSnBhQlYrSldBTTAvWHZDZzBzdE80UitmYm90NGUvL0NGU1o1UUxXVVBWR2o5YTN2Y21SQk1LcnhEdnBxUWRmNStPN3RTbTdIODl5OWtHenduUzBxVWQ2aDNTM3hiZDIyckpGWXpNS1QyQmVCQXBabCtQR3dxcVVTN012Vk0waEdwbHdqT2JLaHhmeXhDaGNrcGVqd3lMank1cy9HTGJUdGJDRjJxdm1PZVRZcXRsYmdpWVpZbkZzaFlsb2kyUWx3YVk3ZWlXTjRxUzF5ZVN2SlVldWgwNzBuNUFZbUdlYVRtOG1EQ3g1T2lLd1ByQzBMN2pEcVN6UHpSeXVjS1Q3cjJTNDRVNld1bEdnWlF2OG9ERDljTlFWMDI0aUR3ZElSdHp1UlZlNUdrSGdFNGRRdUxVenlaVXh6SEZJdHNBOGtYbEZVTTJNREhjYTRIekNycVdwaHo3U2F5TFR6Uk43L2dhQnV6ako0UmhMRzEva2NUOU1tY0lMQ21CZUZNeEtMek5qTDhlQTZEL2NtN1dGSlZpK1V5ZlpqVTF5M1lVcXhUMUsvZVBVK0UxTFZWbHU3VnAzZWxEVWViamI5TDhXSDJXQk1BSVNCT0RMOXVUZWRFWVlzVGVYMGViRS92QklSUXQ3OHZYd0pSZ1JlbytUYzl6YkYzL2RveFV2VUpJNXBPb3ZablY2bkZ0OXBYeEtrZmxEWndGSUllSTlBUEJyNlE1c2QvdElBcFh1cXRpQ1dVNWZXdUtFdjROS2puRnRSZ285akFMUDRwR0YzUUkrVXV1TkE0RUloQzJGSWV1eDkrNjRnTTZwZW9nVU45Mmw5R0FBK1F6dWo2TE55MmhjdmtmSTFMa1lOTk5MaFdUS01xTU9qRENIR0QwYlNycE9JbzhVeE1kYzdvd2l3YkE0bVF0M0NtSy8xd1cvdUFiRG8rWkxSSEliaktYUmk4bEIrU3htMUNteTNrSXEvUlJ3WmJIaVZkNzM2aldldjdMT2VSaGNnOHQyYWRrc2xnUWp4YXN4by9WNUNoa2hzVXJJby9vcVBIYmN5TjZEb2ZWWUg2NmlXdHRVZ1F1OFNWL2lkSzlHelV4N1l0Mk5OSHoyc1lsNDUxcjVZUzZKekZzTnFHcmduaUs4U1ViZVNwaG9XeFJCVDJiV2tlSDZaZ2pKUElncWRxRnFJWkluUytjc05pR1dXVEhXYTBYQko3cW0vRVRROFNpbFZ0V3gxNWFLTFg2TzNVWUNVdzg0Q2I3S0lLYi9QSThxaUlTR2MyRTFlRFpGZ2k1VlhlUkxxdURESEkzZWpCWnZrRGhDZHVJWGhaSzY5ckhMaTA1ZXhXZEhwRjByRzNjKzZpSTA4b2tuZGNpTzhHSnRZRFlZbkRZaVpHbjBDOUo5a0thVzVsV0FMSDBNMDNmRXM0TVluL1VmWWVNQVRrSkVkSmhWb2RaY0dJRmRFSFJKU05uak84VC9yV05EOHFUUHFpQWJ6QnR6R2ZjRHdxR3hQeThnK3JVaTMzT1hjVlBzdXQ2NkRWWlRHM2VkVGYwU0ordmF1RFpVNzAycjlwNXBnZms3cFYwVnlXZFJWSFh0V3ZYYUlkdmIwV1NZdzFmS0lWT3lKM3FjUWxVMXoyS3dsRENCZ3VDTlh0RDFsT0NIaEVaOHpYQlMwL0EzT1M5eVZyZ3F0RVR5QU5hM3N6WS92Y3pYcE9XaFpTajh5SU1MbE9hRzQ4eXcyV0NSVkdXc3hYYTJwYis4QXZHcDBWYjdGQlN5UWp3ZlE3SHJnTkdvdXM2WG5BZWJmcVpkd3JwUnZuM2IvYWJObXYvWkNNMnVDZlhyemxMUVpYQ3NaM3N5anVXSklQeUN4UGJma3k2eEJiNVZoYWUzSGkxcDUvbVc0NGlQdmxIMzIvTDFib2ZNQ1VkNlFCY3ZWeVphdmtZRFJXd1RLbldoUnlscU0yb2p1S0p1TnV3UjlVbFhkZXdKSHpubmhHb2NtbXlCNDhkTEN0Wm9COFd4bCtDV3BWMmIvbGMxQjQ0cnNleWdzMnpyclVBVnhSOWsyLzdkejFTRUhia3Y0SlFvNHVwMlJzNnl1d3pDemFwNTZHVkZCZFV2VE5MS0M2eUdIQVhnV29vTC9vR1o5eGJvUTJDWGFsaUdoNHYrR3pDa3U5RU8xVjJ6a1JMT1h2a3lENUw1SEhjVm4zc0JIVHREN0Z3UjBrbXczdlZTVVRBWldxazlWdzhYUFN4WU05N1g5SzBNNlhBSUlrZk9hdzZvbXM1eldsZ2FMOXRBdDhqb0JTR3BRMWdzWGp5YWlPdjJ2YUl2bjdRbXFyajRJRm5GSWlmOURxUXZlNnZHOHNhdWRNUWcyYnJISVVnSWhXaU5ZSHlrVkJLbnh0T0lMelJKN2ZPMmI2OHExK0FCalp4alpVdU1QbVgvcFRZa211Nmc3TUhiSWdiRUZNN3NYMHdsZG1lYmlSMWVpRHVuODNtRGNDdjY5N005R3BQOUh6RlVvR2pqRDZUSWFKMGRTdHJmOTVpVFZjNVlrOGRtS29RMUlPbkI1eXExTVlwaVZmMDNjb2d5amtKUHhWMjZYOHJiWlplVS96Wm1hVGM5NGwwVWo0dUd1dDZJUzQyZHcwUm0wSi9uV2c0aFo4VUxVWXdFNkQ1SE9YSEdtQWRZVjYwQWpHdlI0RnNML2Rsckg2bWhyZFRPQWEzR2hibHFIV2RpcXhsVzVGakhlbjc4Rmsyb043S0ZDRk9jdWM2L25BWTM3eVFUKzZQN3FIazNobk1PaVFOemNzQVN0ZWovcEZTcVd6ZDFTYk9JNGg1Wjl5YzRhOEwrT29Gb2ptQXpiTE9Vb2tFVUkxQmp3UVVsQm5vR29wQU8vYWpXMiszdEZoUEUwbmRsSDJWYjVJUENzaXlWdU4yNWhrbkQzWldzaEFscTJGUE1vY2IxSkU3YmFlTEd0K1VtTDBHeUVXY2dnT2pPclpVeno2dnlwTUJ3YUFzQ2pVMXZlNTUvblNoRXhtdlFZblVrcG9ybEF0WWIxSFZqQ3c2TXRISGR3a3Ryd1VzZ2U1MXZERGkwNmxLUWRIMFZ4bVdacjVKS2lmSUlEUEJJcjdML0d1SGc0MFpjMHBqbFhFSmN6WFA2NnpodUxKZkF4anNPQ0VhYTRRdGZmV2FqSXRiTFcwaUxEMThhOFFEMWRHdmNyTlQ5ck9VR3c1amRGbTgvdXNid203K055SFhEOTB2ZVVZVWNTVU9wdjJVWXRwc0U3SlIwMm9iajg2TWhGd0lvL3ZoaDMyNDFFK1V0cUpjbGd3YTlJcERxYmUyV0FLMTNraXVHQWdQMzlmSHMwWGd0M2cycDQxdGRQaXJweXJrSnliQk9RTFZzMytFSExmN1RJNEp4S1NPUFJZZnlja3JXeUNmbS9icERGemxTN2E4WEFjMHd6OVpqWDQ1Tjd5U0VnSVdLUkJYQXEwMWUvWUd0MC85WW9yTGVlempKQnRTQ3Brd2xqOWVCRzNuZnc3b0IxN3RPUFFpaUhLaExSMS80UmVnRTZJdWtFMkJTelY3cEw3MVRvV2JqTS9PeG1nT3VXclY3NzAzcE04VDNiNkRZQ3Frd0VSbTFxaWwzVGxDY1BjTFhSeU81ai95Nmkvc1Q2OURHdTN2M1FyekR4WDRDd0c2TzNoNjI2MTNJSTVDeFNuemFQOHFCZkxwNEhwaHgyTDVDbituKzdTeDBVLy9idUZIeEFJQkE1QlBSRGVtV3J6d0lnYzJQSjQvUlk5UC8zMnN2eGtCbzF4RVNGS1liV3FkRzFxc3EySVhVZFAzTnBNQXp1bzN0ZWZncEVvL2FXaXhyL2J6Tk5HdFJQSDdteTJsZTE1alJLTDErRG8wVXNQTEg1ZWRnTVcwNUJOOHpNYXMzeW9UaTBOVm96VzE3WStCVGRFMC9VZEVEZDIvM055Y3dnTWwzKzA3WGJ1MXNSOFZtS1JqcWpHMUxsNzRLUW9HVVlQa0ZvQ2tWSDlaTDFlVnZldjhvWnQvMkZ6eXZaOFFmOW94bkRLc0MvSVhtelBTS0lycTc4eGcxbFcvUFhPU2IwdzhkRytOa2VBcXl1TWdEKzlGUi9OU2RPVVN4UEtVUG1LZ1VPVXlrTkI2TXlJVFQyeHVXOEVDZG80WmMyVjc0WGJkcDFsZGUxYmpHellrSGJhZ1lxTUpCYnZQZzhhc2x1Z2Q4RnNxblV4cTdveDNGK0lRcXY1VkpSTno2RVBqS1RIQUlhc01YZnN6U2pySzE5cWxGcnNpaFFRQUl6bzJPS0p1Z0hRTTN2ejlOWWdJdWFNeFZNbFNaR0xhcGk5YzkvS0tuclg5Q1hIMEp4ZldXMkJSdEdHcndsSEdTd29keW8vTmMzMEFDdFV0L05jakNIMThCREo1eStCTmdNdGREZnhoYlF2cFBseS9NbW02RE1mdnRleDBySjJpZHlaM2NZRy9YMG1zaUtmWVhaOW9ENldwQTkvZmV0cDcwYkw3K1hrUVVVQXRBYjNHMlFFeWc1NW9TaUVYdVdsWnNUdEF5LzdYUTJGQ3JETDhTWjUwbC95WkxaUjJDMGFMVHJNRmYxSU5pZ1NsTy9GRVkrU3BaYkN3N3hDQjBHTWxBVGFCOXRldmhKS3hRWTc3eVRjbW50VU91eFlWRzhQT24xcXgyWHBxZi9SNitRNEJ3NTE4anFlVExkWTNpb1dOZHR1MTlSbW5mRGc4eFkyWDhZOXcwdEIyQ0JWaVgwb2ZSbXljbXlDVmRScXhEQ08yNTlhYUFQRjBUTGk1L3dQYldjMXZscm94WWRUdUVrSG9YVEEwVWdLNy9wTFZPLzZsUGMydGxpTnpwS3UxY2czZTF3MkJCVXk4TTdjVUk1M0V2cHVEdER0U3dKVVhaaTVya0pzYmk5cTZseEVqSjdVSXNQcTVlWU0rNXJCU2VOM3gzVWI5RDFkZjU3a3F0SFdaa1lNeWVadzlDSGdMVSt5WXhEc01vZENLOG1qN1F1S1ltS0hQNTZCMEE2cjcxZGl5a3Irb0grcWY4bnhTUXFYNEZTKzV2QjJvR056V0NhZjhSVkZNcnd5OVIyMTgwdTRqUHJqSVdIRHVoQzhyZlllZG1nNzNyV3A4OXI0VEdoeVUvM0NPUUhVamdtdGMvM1FJVklTK3ZzQ3FmU2c2WEJLOElBQnpVUG85RXk4R1c1a3lwcDd4NnR4dTB3SzdNdXBoMWlLV3N4YmNTZFVkNjRMT3U0ZzhMNXF1R1lPQU94MWVtWGVEcExMM09JYnZ5WmVhMEhtTmI0Sy9ldUtEUzNzODVEQnJ5cE53M0tpZkVidE1tTUh5QlRhU0RlajRqNExYU0xRVG1KZ2tDcTAvSFMweHFLMGJlY3Q2aGtzQjMvV2NUbzhZMngvcmprSEE2dXgyOTQxTHBpMnRicXZQdEwyYW5UY0wyc2ZPL1NEOWdFMjY2Z0xyajBlTmpxZzFWdng0OUZVdHBRc3ptRm5RbVdOU0syVWpXZ3JhTjYyK1E0WENsMmpadTQ4UXQ5VnZaN1RDUytGM2RTcEVBekdndVVWRGw4T0hNTmNuckc5cHJUZ1ZiMWRKZDh6YmlXZlltdEdpMHhvYmFmZ1VVVm9WUnBvdDdURXduam5RN3dGNGhzL21pOTBaVktrWnNsbTJPbzJ6U1NoaFpwZDE3N1lsdGJQK0J2Q0RZdmFqTG1iV1h5UnhQaFBDQi95WGwySWJyeCsrekllMkw0bDU5OStFcmF1cjVtckFIZTNUWFYzY1BickYxZnVUSURIdzRvelZOR09RS3JvNUlGU05WaS9HQnhyWDZpYThBNXpuMjJkVU1QNklhY3k4ZG85K1VCckoxMzRoK0t2ZTBhd2NydE1VWVlkbURORGMrcEpveTBSNk1MTnI1VTJYS2k0dG1IU3lsZFhtcUpKa21xdllyZ0tqUEkvVW16d1B0Ry91cEFocnBJUFhzRDZmNUdaNXB2SXZFSUJaclRZMjVNcWlaOGVlNEtTWjhDV2lXdDQwMm9jdmlRc3JaMFhOUWU5MEFCM2FNdExmZ004c0o5NmI5WmREQ2ttd0ErVjF0VDhhUTFYWkFhVVFtUWw4ODI1VjJqTUwwQWZSVkNjTXZSTFZpK2x1MjEwd2lwQ2VLcUJDaEpQYVVpS2xZeEtSNytXTWRqSHp1eGNoVEtoZWpxN29rMTU0c2JlM21yVGsreEFEY3NoTDZJNnF5dFdqYVJ0d2RpaG5PS3ptVFZ6enVJNUhtemN0dURpVitvQkprbUZlMEtQVWtmQXVWOVlBVHdDK3RscU1BY2J1OCtxZFRzeHpYTisrYlhvNHY5WkdZQ2FQeUc4Nm01S3pkek0xdHRIcUxUOTd5b0xicEhlUTd5a3Y3ZWVaRGhoVkhiSGdqY2hMS085em43eU5rUWlPdkZ1OXdTSWg0TVQ1RU5rU0VjZUw0cEJPOWxnKzhnRnQ0VnVKWTh3QXd1SkhXUms1SnpDbFNQWmxXTzlBWjRndVYzSm01Zkl2YWtTdkhUV3hldGtWbldLSm1PT295YTZpVXVYNXhtYWFoVkJSTEQ1R3o5eWRhaGFoandsbVJnSnl1OXRKZWdWUHFvbThRWUF0aDJLK2Q0U0h3TWtubitvNlY5eDhWblFDMk9QejdGOURENHpKMmRNQjVUeTdwRVNEMDM1UVdPNnZZTmkzS251eis4VDBvNHJKUDFJakZmbGFucTFTY0dhWERrRjRKTjREbC83Z1JiZW1oRGlDSnY4MUNDSzVhSG9GUWY2OG9pRGZhaklvQ3R1b0RhU0huL25HUlUxM29XNE1xZDkvamJ1OVhJOEJoYmJzdE5mT1hiQmxzb0RjSmNGZTFPMDRSZnZQeHVmZlpMZ1JMZE9OTU1jZlF2R25BbjJGMzZGNm5ISmI5NXV0Z2NnRStzaDlNVEJnRUhvZDRkSVB3VlZ0OWpUeC9xMmlOWVdyNmpGNWlKYWlhdHJZb1FycmNybnVyODJ6SGo5UUpmdS9Fb053MWdqRWNld1djSU5JcUpqZzlieXRNZC9wVnhHNUNuMnJSUnJEVHRCSTBTWHphQW1EZUxHMlZ1RFRzejE4NldiSGRVR2xXNG9meUErbkUwNmlsQ2VYTFJHbllraFRHOUpLcjZPZ1AvYmFwWWNtallnT2FFZnJGSHJRYjFORlUrOUF2RlNOeXdTSUNvVzRHQyttTHY1UU4xbFA0MjhONVk1bVFKUXFhaUo3UmU2SThPU01WU283MUExVXhqaitvdjhnZ1VtS2RQNnZFeDNkRk1NdVl5cHhXMUFZQno1SGVId2hOaVFmMHR0SUhLS2ZOSkxpckN4dkRqdzNEWnRGTW5pWVJ6T0o5NUw4MWhBc0VaREdNZ1RZQ1d0eXRKZ3JMZHJIZ0JzY3ovQ0NmVk16eG9VU1F2ekRQb000SDVTdWVSVjBoUGI4ZWU4bzJobjA0VVBLTE9Oc0pHdEpHTW1jcldPRXZkTzBtQVFVREdIYkNndWVZTXFQWHFIN25iRFA3c3hoMHcrU0V2RVVNT0c1MDVGSzdLUmVSNWhlaE9BSEFsUnBtR3ZVd1MyUGk4T21yaUNIN3hJTTNkMjQwOUdGemxYRmtpaDB3M2RqUW1QT0Vma3J4ajBJMFZzZWd2bllYek9sc200UHJyeW14SUJZSWFvbVI5NS9pRGZQWGt0NXhxeHFOeTZSL1dVRTFKV2NIN21OOWJ2V3pkeWp4OC9QODZsbkIzbm5kRFljaGlZVC9wWmhaQmJRL1lLTTM1T1UzUkdJNVFDNmY1MFZkMFVOSTBybjkzRkhJRTROdU5FY3k3bFZzcVk5dlk5WTdyaDBhOXZOZjNGaFNpWWlGQ0ZaMlVqVlFUZFd1ckRmSkwwL1oxUjFvbEJXcVJEOU1IZEJ5VXdjWE8zdHUxSENwWU1XQmd4U2tmRXM0Wk1SSmg5T3lNeVdCVHRWVHlYaERpbm9qWU5nenpTc2xBQkhQWmJIQ0JEcEVFaWxuMHJveEppR1E5NVphelp3alNBZEdVL3lSQU1kdS9zL2dZSFlGcVdEbmRES1IrUUVhaGFDUVRvaEt1NTNWN0hwMmtmdkhSU3NQam5QTkFBWlREWVlOSnRISXBNaUVqWjVoN3hhL0ZvL1o2dWNnSnVOc0tSdEQwUXBQRE5abGNyL1huZGMvZ21qcFN3Vi9NR2o4VkJFTVpYb0NLSllnTDQxd2JGM2FKN0VHK2hmUGowaUlyeXpSZDFlVjhRMmsybFRWeUYwY2hGWkV3YnptWHNtMHViWi9RRjkrU1JKZlkxQmt0clRGKzl5dmtmS3pESE9vcFNsNFZVM2ZWbzZsbVZudXNQdGRyRmNnN3NWa3hIeWMvU3NMbzJxUElCZm5HWnpnWHMvSTRwV0YraWVNWmFIVUhFZUJwd2xiZEl1cXorNHFDWU1aR2N3OHFWeXRFbzFmT1RQZ1hWelc1NHJoeWd5RVl2WWhMbVlIU1lxNi9QRFhpZGtDQy9TRHRCbHVvYzR1dEh0R3YxSmFaYnhjVTlKejZSMUUrRzg3UnNhTUZreFhJUFg3L01CbTF0YW10c2FxVG9zMnBMOWttT2pIQXV3L0pIL1Fqc0pmRmRWWDJnYnV2WFdkbEZWclRpUGswSkVlQWtHYnlHTm1YMm5YMm4rZ0Zvb1hhL2FhVnNTQmxmL0paZlptdXVPemRrbGxBSDVpYisrNXcyWnQ0cVNWRHMveWRoa1lVOEVmVGl4aFNqaFJyVVhjcHB0bVROMFBkbWJmQTE4RG11cTBkS2l3enM4TG1wL3k2WGNicnJqZTY4eHFybFBuRTJaRW5jMndsRS9MUUErc1EwcDlVZXhQN2lrSUF0SmtYRHJyTjE3dnljbnQrZEFSY053VWQvenFTVXZtWmpnMDBLQjQzNEJCS1J4NVE2anpTTnBobG9ja2p3bDJyUDNCYlhRZWxRcmljUFpOd3d5Zno5L1dIN1M5dzAxQllIckk3Ym16M1VPUGVjWUpyeXRTT2R2RTJjYlo4aTJ2VjROYjIzT2c0eVZMTGM4VHVGSXhaeGJ5MWpGK2E1NnJzdVpIRlFxUGs1Smw2bWlyWXU5ZVM3YXdJayt3TG53YW4raWI1dzFzUFFaL3FQSFdSdk16bk0wUHVoa3ZuK3laWW4yc3dZaVJRMGJMcUtUUlBZRGVVdzEyMjRPOFg3MEJHTkJMVGhxN043Tjk2cVp1SXBTa2F1UjJTRmJPNitEZ2t3N2hhZXI2QW93bzdhYkFDMUlmeUhBZ1hNMFJtdW9QREw5S0QrSlZab00vbUQyQnZ0SlptelEyOGI0eThmejdYV2ZrRXZMa2gxb3JCMVM0ZWQ4ZXhpVjFPenErc1JJcUhCRml3MEdqZ2tiaTV0OUY3d3BEZmZ4VWVHRGt1VnVaaXBXTGh6Z3A1L09yejlCNmpKYXJiQU1sa0lZZnduWWdnWXdOSldpMjNoWFJ5ZzZlRUs1VjhqZFFIR2VzaE5TRkg1azJMQ1FlQ2pwRm5kQWc4YVBwdkVKaW1lMDR0SElIamdCaVlITnhPZXFQRlMvWDFLSnJqOTc0aWhHM21Ec0V3RitVbnFKdHFsTStLTHF1bjZabmVjU2ExeEJ5dUJHRlBOUllFTHhpdlRvbzdEVkY4cTBTYnFUMXlFaFhMd1JqLzZuNTliOXdBYjJzWEh4ZWhsR003Vk1QZUhmcGZVUjgvU2NJSk10OCt6NmRPWjBaamtOOW9YN0c3amNnaGlEV28veGIweWNZUnFNOTMzQXBYYVVkbUxQcWIzeURBbktFMCtQRngyTjJoYk9KTTNNc0hZRXlkUEVXZ2tjLzF5ZCt0NHZjQW5TNjgyZXJId2Y2RUEveGUvSW1KZFNSVjZaZVNRK0RoemtiRDlEdU80K0VaNDByK1RLZHFldVRzMENhd1A3NmhybDBiYWk5bm5WcWs3UU9ZZmJ3Y1RlVHIvWXUwVjZrQkUzbEhyRnM0K2ZGeG0rT2VFNURtbStTcXBIdFVxZEEyU3hIbjlYWVBJS2hNYW00L21ZcGIyc3VUTHVvTWtGcXBKb3R4TjZlME5xYlQyNGZKRnVLeVVpUkU0eWFzMHpJcFVrUGtNUUVpbVhZeFRIUCtZYUxGcGo3b2J2TFpMVnBUNlFaY1NsUkgyNEtDUUg3Y3dPcWU1SVBCa2tzZjhQL1RLdjQyZm9YMS9NcHN0SUZjMGI5MkpOZytPNVZ3ZTB0QlBpd0YwV0hweWcwdk1HWnVpcjBvckV3b1VHUWkxaG5PU3ltYm1hZ1hDSjlOMlB0UDYwWWdsbXMrZmFORlhacnlkMGdWRDlNeUtlSklDejB6TXY1RmhhUXIyTjdzcFN0ZDRyS1F3cEdscCtkLzMxT1crMXdzb3h6ZEZHMlFwK3M5OHlUbTF5ZTlmS2xjdmVwWjVTaDlmR1JsS2NVamdwY0VDZlZzTmxNZTJBUmZGU0JQVWg4SkZ5c2xJUmF2bmdaa3FkV2F1SHRnOHZIcFdybTAzSjBYcVhZeUx3MTQzRmJkcDdNSENmSUE5SGMrUU11SXZaeFRUNmFrWW5wRUJSeGZIdHZFZXZkZUI4QldJL3pZK0Z2TDRRSnFGNjBIVW45ZkxXQSthb203R1JoVHR5VHByd1A4c0xBNTZ4dktyaXRGajdUYVlpSCtzelVwcW1PcmxkYVo2REZaVStWZzREUDcxRjAvSEI1bVMvdytuMDhEY1V0ejI4eUJZbTJFNXZKbUtkbXgzRU1DcE50UVlvMnJzczIyV1lZdEFhd016eDBjRFZ1Z20vdFUxSmx4SC9ia0lUMTl6TTR2bEhra1FwcXlESUUxWHZCK1B6ZjlyV3VoQ2J0TnVkNUpmcm5RNUFzQjNGSlNON3BmaUxjWitidnQ1eUxJaTQxZUN4L2hIMGVWSkwrTTdXMC9hT0JBbHBpY3JsQytSNS9aYlBhdTdWKzBSbmlXSEJrU2V4N3pDWkFvbktoZ1RMbVhsUmZpNmdPMUZFZG9mVE9oVG5qNUFqMXN6SExFdjRIU1RwS2VoWGpmRWRGZ2kzRXorNjg5bDF5TWdIV3lGaGgvQkxWaFVsdzJHZ2tRRlNsQ05LbVBmOW9NMUhEZjRjajdKWFFCdVRTaVIrQjBBUTgzTFJPVGs2aThRRWRkL2JBVXFDREJzOHJqZ1hsNnlOOEtQN0JQaG9HVUNhVDl1UnhLNU5xZGVoQk0xaFJ6VEt5MHlCeHZ6czNDRWZHK2srWHVJNHNXeGREalZBVDNIV1FybExwTGZiNDFlZmdESEswNmxQWDVmOFJIc0tqMzRhdlZ5K0JjV2swNVJxWGJXS240Q0FnSURubjFRQTBkcDhiZ1VoeGxTeUFHNHBMb3JNOHRPSlQ3K0l6OVNsQXhFSGFRWk1mMElWVFNhOGNKanJvb0tuUDFZc2tsbVNjcmdVdEpwc1ZwUTVTV2FvV080bnFvV1lFK2ZzWFJzaEJpQ1dPT0JrODJrSm1hSzBHTVozUDNiRTJQVFAxQzIvRDNJNCsxcVBOT2hNTnExOFFxc3FDcy9hZHp0emZwdzNGd1NBSzhjMHdXRHhUbE84Mld1NThUdmpYc2lpdjJmVXVhQjNJcUJ0akVvcjZqRTNqZDlGUGtHdmR3WmN0Tm5ISGozK0RBSkRoOERFemJFUGh3YUV2VVdrYUNaTXlvaW5tVWN5Wkd2WG55U09rSHBURUZpK2lzY0tHQ0dRdmd0djdTMDVEWXlVbVBPVFVZWGxVVnRNUFE4QVBLekxDMGdPdllIbzlFdDROUGZiYXo3MDJkazNZWno5YnNwVkVqbXkyOVRvTDRLSHJ1Zm0zZElKK2NlWkNpL2ZLSEZWdC84R1crQUZPekJ0YVdYQTJHYiszWlFJRTd1QzNIYUp2b3AvNE9PcWk5a2xxcEpCRXR4enVCU1k1eUxCVEJYelB2MXpobm5vQnUxQWhVNGU1ZmtBbWgwQk9jNFppa3dSTkZMeEhsZTNjdUZEc0NJUXpxcWVnWCtYcXpFTzlXNUVadytjREUvZ05rM3FGclpnY0h4dCt4RzFwdmdRZThlejQzWEV3MkZkWlkxVlpRaGMyS2owSm1TUU5KY1Y5WDV0Z1BnQXY0cFVQdW40NkhFQUJXT2p3ZTFJRGRoYjExN2NoUHg4MEhVYnBWTTRHUlFqOGY5S3JENGNVM2xjZGFTSzRubzR5a1pNRnp1eVFqWHRLTTdVWk01d2tJRkZxU1hWTSsxMVFoa2x0eWJXOEdDQTVONFRrNVg5U3RuWmhNMjN2ZWF2aHpYTXdGeWtkNzlYanBEeGNNeE9sVjA0SEdNUktQNUJCUDRzczVrTHorNUJZM2ZISkxlOEl5VnJOQ1pXc21HZUgwMy9YVFpPU1M0Sno5cURpS3ArRHpWd2VGQ3JkTURLVkZWOGZ0UWptQnBBUFY4UnovSmZoOHBVYnMvTFBoeGpxNU5aMXFkVXpVMmdvVHkxZDFlc3pFSjBZWlZPR1BzeXFHZW4rY2hvWnpsbVNWWTNJMXpuMDd6VFk1UXZFdWVYNEx0QXVaS1F1cFBzaExoWFlxeHRyMDhSbEpDT0Z1ZHg0MWcxMEVJOThsRmw3Vy8xU1UrMmhRWGZLOGl0STZnSGxTb0tRVGpoZ1E3Njh1WHVVMmhJYXhsUmg0ZHNxVzBrK01Ld0t5SU8zbDZWMTJRaGpEVXhKWmh1S0N2cVVYMFgyNTBYdm05N0p6L3lrYkNzYjFIVkpTQnk0a3pPZzZYOGRMKzYwQ29odXlPMFlqazBweFdBbFh6RE5QRS9jYlBQb2NIeU83SjJiaFYrTUpTYjVmb1doczcxZ3pRbHRxKzF1cW9FVTZYRE1MMllXRk8yS0VEN1laZGorTDlNREt5LzZGYnFlcVZjcmtBNGZpL0hQaW5FR0d1TTBER1EwamR1QzloYURZSHN0d2ljSzhocHozdXFvSFZXUDVvZzdMVzU3VGxnYWtvUDZJeVNqV011a3hmK3Z6M2NWczJiVnR2dGFTVXplRjNmSFhxMHNSYVNNTWp4VHNLdVNJT044VUtsMjBzYzB4RnJrNW56NlYwbENSTmVSNnBPV3lvcS9ZQUdDbUpsc21hZUZWaFhjR2dwaG1xblY1UFRCMVBkSGVUcHNuYnNtZkNqcVlIOFlvU3dod2ZNbGVTVUhXZzJYTWpIV2JaS281R003L0MrVEpzU2FscVNGd2FEZ0hGVjZlUlh1ZDBzM1hOS3ZOUFp0QzVPQi9GczBIOUVZMlpEZ29BZUFnWlZVTGdpTktJYzNFenRYNWVmSTliUTVEV0hPMDBkVmxFaE1IWFVRcDJKSmhGaGc3ZDl2M2UwUlRoRENpUU11Q1pUY1pGQWZHSGdZaGRyd0UxRnEzNk5wOTIwVU5NTkZmU1dNUzVBQUpoRFlDU2dRWUxhVzFzM2RiZHNJWXd6dWU5SFJnb0M1dzYxcVVUdE9tb3VrYlc3K2VFbDdzSDdWR0dhOTNoOUg5Tjk0ZlVZTS9FT2p3cHlyZUhBRlFoS1pISFAzc3FoSDIvVXlDMm8vZnhsYndPelR3K2JrMTIrYysrSVZObFBldjZmZHdjV2dxZllQWWdWMEFySTR6MW96Q29HWTloMVVHT2wvNEpLeXg4Qy9tV3laK1JMUmQ2UGZMTEMwcmNMbE02RkFWcUVlM1g0ZFdkcm9xaHBNQWdYZWlaSVoxTzBESUk0WjZmVDdKb1haVkNCbUxRbGhUWW1abE9JMnliSDRhRGptbGVKZEJmMGgwM252aVFWcWUydExyaTNuTlEyZnIrY1VDZnNYL3lNaU90dHFCSk0wWTRpWEV6MjZxKzJoTVh4MDRpbDBDVmw3TFpZWVp3Nk5TWlp5clVJVGtscTA3MGdBSnNjV204VFZrWW04VXZLSmEvenRCVTl2ZXgvNjlkK094WTAxaGcxbExjaHF3NVRqbEdyRUJxV3NHbjVRdVVPTDFSZDVYR2RZSnJ4NmRVV3NwVDB0L3RtYnkxZ3pwaE81TkdrdzBDcjBNeDVzVm5wK2toVDlBUW52MWkrSXp0bkxzS2x6eUZjYWpha0FnbkhncFlocXhlSGFodXorSEpKQnlsNVRYd2l4czdpSGxJbDk2aVlYbVhlakFONlB4SmpicWczZU11b0RVakkyT3IxV1N5RmRqWk9Ta1VoREJHSUZ6M1k1ZzZvYnJiY0N3Yk5OcmhuNzFzakZOWHdWYjFZMnk4ZWVsRzZFTFIvT3RSZ0d6OFNLeTg5N0l1dEVOTksvbXFtWWNPWW10WU5ZUHE0NzVZa0xIK1ZNSjl4VmlCMTJ2VnoyVVBkU0QrYW9qenBTM0tLZjhpYS9JMTdVTFY2OTVIcUdZZjFFRFlrSHJXQnh6S3R5SFluMGlaNDRVTUd5cm9GYzQ1RWNKUnRNQkY4M0duTlkxc0tXc1JOUm9NaTk4cnI5em9sK0ViTThtNWNodGpFMTBrd1RJallZbUdsTTZ3LzlWS3JqWnhlcERKcXNrTmJXMURtRnI1ek9pNkdHR0s0V1pKYzdnNkZ4MmZGTFh4WTFBMllkZGNnZWFoYjMxdWVOUDNNT2M0eGRFMjFOMmw0WHg1YmVhb2E5ZnJrK2VHWnh0OXNWZWluL0JUQ0s2M0cwZTRzaUJhUXZkcDNpNk9kNWVjQTJadnZnWHJ3MmdpejA2N2xqd3N1ajhmeWRTcmxiZTFlZzZDTkxsdG1IUTBnQlJpYTVUQnRpdXlEb1RzS2plV0x0UmY5eDBvNVJDeWJ6ZU9RK0FmdHB4WUEvMXpTL1JGVnZpeVJaY2ttbTNRaVpVSE4xR0xqaW5Jb0FWMlg2TWlnMGVkR1h5YjRWRU1VUG1rSTBsVjZDNy9BWk5EbEVrUGJCblBzTE9zR09pblhFT3VqN2hhQ3BLeUNHRHR2cURtWXB0a1YzNGVmeCtKakx2OTBRa0t2bzZrM1lCSmNBUFNMd1YzOWc5WGhld2JDVXZ5eEtIMGFNbGo1SHprSjl4UEZxTmV3TWRCVWVJc21FSkhQMzc1ZzREVkFOR2JTMjcvdVl1ODR1VWFsdC8wLzA2RUlnOUs2eWR3cCtDeGpWUWtRNU00c21Oai9LcE5TclVGdjZzN2p3YmVUcmdSdTU3ZXhsNHpCUFJFajdmY1lWYkZQamU1Yk5IT3J1Ym9IRXZxZDJ1aU1ocm0zaW12aGVnT1FaWE53K0FwWXBIUUMrN1hoNjdGZmRUZ043NVRlZ1Y3YXV0bmpxQTZLSjlxM0I4NFBtUjZjNkE5cTBpNFlCc0RPU0NjbjNLa0g0UlFOWTQ2UU5pbzdlQW5lSHVHQTd2NElKSjlhOWNvN3RDMno1dkxEblA5SlN0QkFqQXFMZGpzR3JSMTJhSGdpR0xkQmhJTHp3dmhUaEhoNDZUM1FBOFMyOGdlSXhZb1JQdGNDeEF0ZGRKeGpTbHhRMzJWdDVvMVV3NHlTYXFBTjJ5WTIwRWFwb0FVQ3BHd0lDWWNuY3pCb04zaVowN2g3WUx3dm1xTU1JRWNwU1EweDg5Mk4xeDJoQnE2bXgySTFIN1VhckRZSExGREMxLzlrYUwyalFnNDllU1RPVTNyUlpTTE5tSWNLWWlRd25FL0NzQ0Zra0tnazU5MTV6b0VkQnlreHA1NzFsakFEVThnNVhMYy8vcEdFblNPY0Rpb2F2bWlXdHJIRXJJdHJuc216Y0FqdEMrZ3RydXUzT20vL0plcTQ5Y2poWG5UaCt0T0dLc09ldWNTUkFVZ2UwRUdqK2ZxWEh1dlQ5K3AxWVZqMGd6aEpTNzZCbmhZcktpeHhuemVOaVpvdWtPalY2NUZ5L3dHZmFyb2ZUTHNnRmQxMWh5VGdpOTIybUl5RUxvS2syNXhDanNLU3hadWRpMVNJV3hhVlBuVGF1RVBLbUsvT3JFQkpYM25oSXhkR3BLTEw5WkdsaS85eUJKY1gxc2tkQ0M1TEl4UEk0NmpUY1NhM0ZqbERJMjNlbTY0cGs5dFhKM0hRcnNwMlhGbnpxeGJpaThPS2FwTVZWZTZqRkN4U0M4Zmc2NUpBeVBvMXlBUDhiVWpZKzNiL0NUWEIrd2FsUkVqR29jMHk4UXV6cDJ5VW9MdlJOUnJDcjBwcmF5YkJXTWJScmJSWXd0ekoxYm5vRGIzN0pkNmVNRUFsMlJjbGQzZmdKc3Q5MWpNbVJoS0ZOR1pkTXNWcloxMlZkVlN0aDRBTHA0d3p4ZCtFMnV6U0k1RC9BT29GS3lHUWdvSGdPVmh5YitoVGJ0aFRvS2V2c05QWE1KZ004VjcraGIrbXoxLzFsRjVyRTlnRHgyZ2dCU3ViRWtESDgrVGlyelNEN3dPMm9hTk5CV2NwQmo4OE5reVRoNzUxUFNKNWZLbDBhaXhjcXEzMmdNZDlEVnlkRDJOM1FxNXhWMnpRZ2dXTEFpdkcrNmIzbmlXZWdpa0swRi8rUkpMcGRGa0w1VmpsYXV3RHdEYXoyR2NlZlhFa085bjU1N1ZwbXl3V3AxeXVqamdrL0hOa3M0NzllRVhveFBGQVBaYVRncDRJdmRaWDBtQ2NpRVZUbFpUNFJzREJIb3VkT3I3bnAvbTVtNFdYc2tGeFRuZG9NbmFWNUkzOVpTbEh6b2ZzMlUvOEZyNnlxRyswMCtzc08rdGsrMjArbjFGSDM3ZEsrMWRBbVhvaXdCbUZBbHNNb1JsVmh2VktaV2tibUdXR0gwSW9uYVJoSDFFTjY2aEpZUEdPbTFKNzRRUTBYbmRnMXBoNGdMYXdtR2Y1VjNJUmNyM3hvWHFRelVwNC96KzlJT0Y3YnJGUzZOS0pKb3RlVzBXNjRGT0l5YWpCaWNxNEd2VUpxcTlXT1JwRkhRSnlaY3o3cUhHd0hzMEExK2JoVWZvcHBoaU1EVllldkpJY2dHZytGM2o0dVZPc2JaNnJiaER5Sm5hRE95K0p3dURTRXRQL0h5bGRmZzg0VmNjZVE2R0NMWkl6bmhPUGJVTEtnWStXOW1IbU10TTNFMHpyVVEweC9ySjBGK2JVMUl3UzZ3MXBFSWlEc05jNm9VY1UxUjB6S3JHZThYNisvbkxJejltcklhR1IxclA4eE1HOXVuazgyMVJWZUtPWkgzUmRGVGpUVlpiY0NKUnFsc3Qrb3ZOOFQwRU0vajM2d1dJM2U1TGNTWmRaU1haM1QyenFWSERGc2JXV2lBOTdwWHhhZGViZ3lkQVdGTHcrdkZTaldhN1VibTFaeFZpUzZkSlNFR1JOVkRiMWhZL0tCMFgrbnVYUmNveEZwOENucGtYUzFOdzNGb2FRM29adVpWdHo1ZXV4Y29Kei9TWmMvZHJLT0Q2Y1YzajZuY0doRkppTVJzMlQ1S3p2dE5RbzIwZTdkL2VuSm1IZ1FCNlkydmtIbEIxRFYvcWVZTFpJQzBJTDYvc0dLZG52bnZ1VFdIaVEyRUN6VkJaQkZ3VGU3UGs5VGhlZ3hZNFlNQ0w1SFFpei95T3hHTUU3TkR6S2xadlo3dW5rWDVnMVlwNTB5emQvVTJmWlF0T21vV0dFaklVSUhqRGlSaFo1bVpqYUQ3VGc5cDhYd2x4V3cyR3ZJT1N6YS95anFtWFpQUmFtbWIzZzZRWC9XeUpTV2FlWjVwQmlIZ04wTXdDeXlsMjVFY3hGZ1hsKzRHeUs3RGNrNVgwUW5yelhwYU9zb1JNb2JhNWNvQ2JneVdyaDE1RjZIcU5vSTJmNmxNYUM4OCtrZWw2cDdTd08zMTFwelRoaytrZ0xYQjBMbkliUUd5VUxIZG05dys0VmNvRXhWTlIvRm5QaFljdHQ2N0c5ck1oNnVORUV3ZVNNSlgxeFg4Wi9DK1JXdlZ6cHVDekc1SkJ1ZTlOaWs2Sjdyd3hLZVFPdTl6c2JDZVY2d2MwOTN2eWtOMHZHUzRmL0xSeGduMjhIYmJWMzRSenFyVGVHYnA5dzIwVmo0bnlaSkRIWkJpa21IZFhjalEvYW5OQXlCWkVLVUZ1VFpyZWZScTlZMXJpTXZDZkQ2OE01L0RKZlpoM1ZRRlFGbzdLSTArQlRSUnJKV0VuMm9jV2p4ZE5MMlFGdVZnK2NEdm9vWS9DdndTK0lBMEtxRDdsOHRldDRKcjZoOHFDODlncDNvdHRnaWhQUzJlVUtYWWhRU090dVREaEJNbjZVWWZMYXlZY1BPZ2FDL2sxSlRrMW5OeXhpWkRLNTBjeXI4V3AxTDVvU0ZCVllpVFFTM2ZiS3hwL1VvemNzWHBlWWxHWHRMVGdhcVcveHBZeDIyQWxnMnlGeVQzZFhjaitOMVZwVnRoM2Q5OUFxajkwaWpWS2dacWFXUE9vVmZyeUFnQjNWcGhvRUZESjVFejZoeG5veXdpMjhMZWhKeWVtY2JLVHcvTXdCN0xPUmwwMUhHN3ZKNG9YVXQyZExVejdab2wvWXhZbHl1UzlWMWt4bFpRL2lZbDdNNHJpTkRRSXc1NVRyV0IxZjZ0dGsxdGw1bkFTVjlsdHgrU2RkRVRPMVJYMndzL0ljaG94VldyYTdjRW1WNW9la3N3Z1IrOVdWNjM5VTNqZlJiMnlTWTJPNy9vTC9PbFk5N3hLbURHSVpNZWhLczNqbjFLV08vWjMyVHZXWmJPUjRHanRneGh4bUV3WENsTGloS3hKaEVSdzJVMFFVcmZyR2drcGhwbkdGWFU3czhCVUJnZXlhbHVyUlBhTEVxQjZIdHk2SWxYaGZ1ZXZmMzM1bVo4YnFTTVRLNzg2SkU3d05KS3o2aXhRWWgzQzczWEh6ME53ZE5xTFhoNGVuZE5UeUtCLzhnQ1VBL3JJbTZUVnhpUE9ySURtZXIvaGVEdFBrbUpxOFI3N0V1NGN4aCsxWkFoVmQrVG1NTVQ1WDFkTXpaQTFMOTBhWWtTRUNxWUZOR2ZrMlo1Zlp3Wk82VlJPUmRMUHNNOUtlNUxKRDhEaTBscFdpUkxuY2RsSzFUY1FkUklIVjFLYzhhZHBGZktLam5PZVMvRWIxWHdIdXJVU2RDRWg2bzl2UU9rS0hqSEFEN0NUbHRBVm05STZTczZlYVBsbjgvQ29KdjVNTGNtMUk2YTFPbm8wbHRoNFVDWVdGeXpWVEZBZGxTV1l2N1pRMVF1aFBmSlM1cE1EY1hkc05sWVRvVi95MVZKc2hmaThnNEpDWlNXbXFEZnYyKzZEQWlmWXhiZytvNEFTSUlvcGUyVGVqT2ZxaG5vNk1wbTZLZEUvQTVsbytRalNURjJkSExwaVhmbFNWRlJia0FpWDdOdUxRa1pEYnVtb3crTnA5aE82OEx6Z0RoRm91SlQ2elcrb0pRNXdsTlhqMCthYnpreE9VMHZibVZjTVd3VDk3eFlOSHdRSFFLM1F5SGJBdEh2ZzZYQzFPemlONkNaNStwQXZRNC84d3R0K0tPOW9xMjRPckpLY0xYSkpzRGRyVEczQ29HZ1FTaFNEY0NTWUh4eE9ETFFiRFJObEpsaUNwNnRKZVFGNUlvSHF3WWZubmoyUTYrNk1sUHRneDdTSWs5RmFCYUZodmkyTXplbnN1N2RsanhxUDhKbnZMRzVMSWJVclVDUHJYa0VhMTJXRS9VYXh1SHlqSDBMeHJCVkR5ZWN2UWVncmtjSnR2S01XWUhOZWl6NTZ4ZWdQZ3J3OGhJNFEyVjQ2SGt3eVV4d3pqNm41N0VGMUMvVEFzY3g1RjhhVnovaWl6eFZMYXYzU3hnS3U3dEdmTEF6b3FKbFNKQmRvZGZma1plTElYeWpEZXBZL2MzQ0dwNVFCRlN0NS9pVUhxbnl0ckJPS2hFYmdPci9kRFEzNUZRcDlKNnBuWXpGSWgrdDcyaFZHSElJeXRIazg4V2xDOEhnMmcveUZvdFFvcVpMMjB6U0JRQit6TkgvaWVDc3FJVHQ1amdTUTlNaVlJaGRHRXdjMjRHQzIyWDRVQkJ3VW5sbldNa0xUY3ZIUVRIVGZmT2wwRHRZSzN2QUFjSVFEYStYeG85MUxkMGtPVy96Rlppa054bFRFSVRVN1djL0tybHo5VHRMOExScHY5Y3IzOUhqTTBtLzh5MVF2TXAxVnVybkxnY3lsais5em11Wm13ZUNQdk55OFNlMDFFd0ZNdTc1bkFLNjIrZ2VScEVxZHAvTlRSTDQ3V2pQVHRoenNwZVJtT0R0U00zZDdiZ1RxTGpLUWM1WGsvNUdIdWRTUmlaM2VPL3habE10VXNrWDdpbmZEOEQrQ25ZVzJOU09FQTlsMVFVcjFUbWJXZGh1b0FXVEpvTjZkUFpNTU9xZ292ZDZFdG1pZ2VDV1lLY0c3bnFXbmtLWTZoZlRNYjZPTWFFakRyR1Z3T2FvZXJBV1NwZ0N0Z3JxUXpHYXpmaGhXd3JKYTdtTGNIZHUwYUZ0dDVLNjdHUVJqdEJxS0JveG1BeVNBZ3kxN2Z6ZFFqYzhXdFRRNkQyOHU1RWVOdzlDYXlJMTFxN3daaWI1eFdyZHF2SEpNcGV0d1NyRS8yWkh6YXJBQ2JPWTF2eUtjalJjb3RtZ0pNU0x0eTdWZzM4Q3VkOFJQV3loK01sdlAvQWl0b0YrOFR2S0wxZnM2K0pSVTJkQVhWaThUR1FtUWpaS1J4cFVBc2M1cEhNOEppWm16VkNNbkkxRUZMclZUK1ZCQ01idkF1RkRNckk2cUV1WStwSWVqVXFhN2tNQmMweHVWZzBwVnU5YnUxQ1Q0RWhVWVlWMk9MNGZ0M1BXejlpT0RadkNOQk11YjZHNzhVVDlJajRtZXhNVzR1dW5DNHZqZnprMVdyQ2d0NkpXL3RuajV4cE9BSWJMUThhVS84Mjd3ak5zSmZaMU5aRzFGUUpGdXpxTG02aDNUek1relZsNXFGVUhEMkFWSTlSNWxuV2hxcVVZWXlTRm5XNGN2c3NhUnFkWmNsK0hFMjEvUDJ0UkhqTFhtUjdndHhUSXpGcHRUMUkxVjF3Ky9DZ1NlM0xOSGpTNnFZTlVWbEx6M0RNRU42OUt6aW5GK3J3RVpzMGxLTUdOdThXRlZQb1FDMDNLUzNWS3dTN2pQdXpraU0vZGp2L01XRzl6QjBpWnlXNk1PdXF4SXliZ1dTNjdsazVyZUtjRnNLTk9jOGZudkgxQkU0bVR1Vk9uRWlMd1p6ZEpYK3JGYlFpRGpwUWN2SlN1aXRwQnNRTER2T1cvejdqdDQ4RC8xdHROc09NbTlEdmRiV203bHh0aHgycC9iMGd1UHkzOEJoVjhoZ3p0YXY3eFFmOGVPVHJJbWJaQ0ltQnB1bWxGallsRlkrTkYyK3lza1djdG5XT2h0TTBUcHAyMy9JNlpWZGxINmM2L1RLN3dhaGZxRW51dnZYRWdZaVlBK3FnVjJnT09rQ0dNTGJiYlpraDZSNEpyK1lXZ0JYWE9yTFAyRENsbmdPRUN4UHVjNXpCRTN3alBYQ3pGd2YrVzRrQlg5ckduQlFrd0VtOWtITEUrcnorcU9SdnR2RXF5RW1PZjF5RUFseU9nVUU5R2pSdFlXbUw0VU5QSUV0aFUva0kxMGk4WHRZM1NSSWFGQjVtWWR3ZTF6WDZQOUdrKzJ3T2R3NUpVZ1Arako0UlNSZmI3clhzYk1RbW5lZXdIKzZBWGZHQ3BMeVYwamF5dm9FdW5aOEkzTEdiZjlSUVZ2Slo0ZkN2eWwvL20vRDJ1RWxuWlgvUUVLV0VsTDlDWWU5dnhpeERuOHZaUkk1bUVMOUs3YkJ0UVdVWjg3a0N4QVpISmNveEFnbC9oWDhyeUF0ZFM2ejZ5VFdkcTFrZG5lUmlKNWpCdGxJalorcnV2TTFEN29OQ1NWTzFGWFVtVmNSQVlHUmEzSEY0Y1lTMThIMy9rMjFzN3VNRnByOVlsNktianpiZHo1cUJrcjZXRkJtTWVTN2c4WS93RU5IWUVqUFVvK2JYZlpXRHZzcVBZbEZXc1kxbEVncVREWkNpRExnSHFaOHhEV1FoTW5ib2RMZDhud3h3dU10VmNTVlp3V1REdEFWazY1ZkJLaWJoMWpvUHBWZkJnM1Z0cE9wZThjT0VqMlBhRHRFaEl2ZVdXREs0cWxmaWlTOEIrSXlHajJzdEdMVDVBSXlrQm5aVmYwZTJyVGpuM2FHVWdlV1ZFVUZMUnRiUjd3MitqYWtBUHUzblRSeGVWWlVxbTJwU0NiYVhtWEtHc1FOZm51OTZ0QytxNDcxMEdlQUhOQmF4cWFkTkIzRC9XMVlnUjRiQVp0WWJUWHFwVCtwRHViK3c2VzdPdStSeEZWSm83bjlJcjUrM1pIbDRuM1RSWGRid1Bkc091NGlnempyNExqcXBPTXd4MnVpYlgxTDRUWUxObkN0bEZUSU05Z2NHZEU5RERCQ2FjUXJBTXFWWXp4SHpFaSs2VnE3UnNMYS96SU1xcWkwa1ZQZkJsekJRZlNKR2wwOGd4UmxQeU80dW13empTd3lmNTVFR2QyenZZWm1wd2RKd2tMM2pEVUpwaWFMZCtiakJ5NG85WHRTTlh6WXpTWkJ0RzRsNXpvUWVLUFNhL2tBemVoSmdNN0tOOVNoSnhKQW1BRmhzZGNrUkdiYWVESWZpb2VoRUlFK3MrMFBoQmtyejFZV1JaYWtBYzdMMjZoTGNMTjkyaC82aXI1UDE0bG5FWHhGUDMxakVkektlaHNkK2pMbEI2N25RVlhNd21nM3M4TE05L2xsejBoRzJ2WjlDbFFHbFBFOWRMTjR3d0VmRS80Q3YxRUVBalhiQnRqUzRldklCQW8rQ1JmWEdubnNrWGtPQjdLR1pYZHV0WVd0eElla2pqeHFsQkd4aTFnMm8wZktNVFVrSmxJc015dUZ3cWJnSk84eVc1M2x4THF3alIzTElib3FZVG8rR0cxUFpGTDd2NDlNKzFhdzkyR2RhMG9nQmdtVGpwTENGcTBJODQzRXF1TzdRNzdUbVJsQWhrdktmUTNZaXhNcDd0UW1oVGZKenduODBsQ2pDalY2QkdrNFZBNkFleXhrWlF5aFhsbjd6eTdpTXFoRW9ZckRPOUhVQmZDRG1ZbUNUOUZzSEFMZE5SczhvQ0FCcy9HNzBoZk1WWEIyYXpHeFdkOXdwZzhLczdsY3Mxa2xCVHhFbzliVVZUMUhDek5aOG5WV1pIbGpzQVZXbEJlRThLdWo4T25rMVVKNkFzZ1o3bmlTUWdkMmtNMmJFK1BuaS94UTdKUUtKMDNnNm1jOGtadnUxbkpuSzVKRFdIRlc0QnNKb3dBTi95cys1K2ZQWi9pUnBVdmJNZEFqekYrL1p1U2REQlpsTFFVWEFKM1dENFJjYUozbG04enpVdjk4VENjRGdsU1NQd3AvZkVpRjZSbjRPL1FKVFEydVkzTWVBRWs3b1FRSzBDRnhXQ1dibDFRK2FRaUQzQzNoQysyenJyL3gxUnN4ejd6cHRWYm5aK3NzTHMxUEpya2ZRNXFmWVpEWWFkK3RrZlFTRDh5WVVyRDVSQ1JPNW9VUUZVRXlXWEV5Ny9PN0k1MU4xRUkwb2xrZ3YvTk5JMFZnUzVpeG9kd3J3SEVraUhZRmphS0Z3ejRTblFnTDJlVEdPeldMS2RqdDJxd2UwcWdCRExNWU5FQm56aXp0TUFhby9IUEZjdE9OMGdwQnEwa3JwRE1vVEM2d1QzT0t1amtXUWhEVDRuSDJRM3I0VzZhS1ZXNkR1cHI2N1ZkTWd5WVU0eXFWbklrN1NjamVxV2twVEhpa1ZMOFdTaXY2cG90bk1qMExiTDhGb09MQ0dldTBBdGVJSEJtckh3cjkxRnB3dTI1SW1vTXpBdmdYNDF0VFhwL3pFSDc2Rnp6NnF2TVZNTWFmVXBPdFVXZEpvTGRadnE3Rk1mYnpHZDQ3RTR6Zk15ZFNoRE41Uk5GVlF0ZWY3bndYSWRzWVpYdFVhWGdNSm1vaHd6aW5UWnpZZHh4WUtZK1dyVW9ISTFFRDdKUlJSbStEM3paU0l0UUZDWkxVWTVmVXYvUm5oVUhTb1hRa2t6YlVpTDU4UExSbnVrZmZpWXJhRE1vTU1NSFlLc2hiU1lNd0Q0bkZCVkpNbFFBOHI5czFSUTBDQWs1Rkw0YW5QV2ZBRittVkw0bFNMdzlwdC9ZODE2cEtOVENGOFlueU9heWZEVHRtVktpOGxrVFFKeVhZOHVoa2lHVHhXZ2YzdGhRbVAwWkt6ekxvTDJGa3paeC9iT1E4d2JpSHJaWHoyWVIrSkM3eHJiRDloS0NuRUt5SCtWTnBBUnFCQk4wYmZzWE5LNEFjQnJIaFMvTnlnM1czL1dIRXNZeVFZd3Zvd0F0ZHd1SFNkS1paOU9jRDRHS09icWFRNGhCNnFjUmdNTmk4REtST0VwZ1o0bmFSRVpuWWtTY1dLTitlRHBwWHJleXJPZDVKc1F6VzlOYVpqZWZjKzI1cHVsRGZMMUZDbW1CVC9NcUtLckl0NzRTcGNOT0Q2RTdvQUplYlkzRDZPU1ZCUVhVQ0oyZlJyV1k4N3NBQW1MYnhMd01SZ283djgwb3pUTVorOWdpMWFuVXJNRStZRzJFY3RaVE9PMU1lQmh5TFN3V0Vjc3NvejVhaFdRRjBtdTJvSFBXOTFSa0R3MVREVjNrS0N1R2lMaUdDV3BrZXhJVTRsNG40cjFkcW5DY3hlY1pVbE9ObW82eXlXdGloUDBTRmRibnFlRDcyc2ViRUh0M01CdFhQOTJqSngzVWk4ZmpybmV2TXBNNFBicmI1dGVLK1J3R0lxU0NrWFhaaUp1SkpBWlgvRFJwVlN0akpESytGaVYzUStMNGk0ZE0xR0VjWUxNeE00ZERORWpGeStFK0FXaEdPb0tiaXByaU1XQ2l4QWZWRHYzdkN6SmVYMXN0OEhwdjlkWWVCaGJXUmdSa0k5OGlvU1psakgzOXF6MUpEbXFRNzhCbHAzRHNPOFZwR0VHb2ZydWE2OGRwY2czV3ZpcjUwT1dlNFBXVGVHaFo1bjJlMGNZYU15YTgvTDJwQ1pma2ZkbEFKUVFUTlZIWkdha3pCMTB6QUxOY0RwUlFjdzZjaGhDNlMzaWx5ekQ2d2VIK01MbFJlMlhpMXBBTzYxWDZncEUxV2NjeUdzZjhlUC9RUmZlUlNBcVRXL3RrZHpXckQ3NXB0TmpBTDR3TEs0SkJ6cENTYXE2NnRzNVlpelhaVkZRZHVjUlIyNUxOc1g5bEsvcXJtcHNiSENBNmwydUE1bDFqUkp3SXZmbWU4WC9RbWcxOHAwYnAzQ3ptQ285cS9PMGVDak5JV2ljdXFQMy9LaFlYTStBRWJTcWI1UDdGL3VaVGhFOVZHR3k3REs3NS93c2oyMXRHMHFkS3ZwOHdPT3MxaUF1QjR5dGNlTXdHZUV5MlU0VWl4ZUJSZE4rWHJ1Nk9IeFpIdytQS2dIVGkzMkdLWExZekhjT0VYejdadFh5Y3RNcG5VWVd5RE5rcHpIWEM5enIrK3FpMUZqc2p4dHAxU1B5a2lqQlhta1dyUVhqVkowUmJFMjY1Wk1pMkpiQ2ZnVmtQa0RLendwZEFhNk81eUE5YU9oY1U2c2J6MDFRcU1zNVpkZmhuZkEwblRMUDJuV0tVU0tHQms3RGRrYnRVancvbUQ2c1FxMllBSTBESjR6L0Y0YXBwZHZ1RFJTNjU3REU4Vy9qdzB0T3ZaM0poYzJWUSs4b0E5L2V3aTRuc0FHNTNoZnZXZG5GSnVmbjIvU2M0bHZkWjVhR01CY3pzR1B6OGxIdDNJK0VMemlqK2hmOUd5WHVvQnJXQlVIYTAyQmx5VmsxcEMwSnJybFBya3JIa0wzeWxXbUtwVkx2NnpXMDlNaU1VaWJ5bHpmd3pYTGZaamh6dlBYdEZDeDhsUkc1eU85d0ZoZWl0cFhacnhGRTBGaE5rMmxMZEp0dStTN1JjWlpMTGlBQkxNWG84Zm92VWNNTDhjQjkwSG5CSDkrSnhrWGZIR2N6WVBZa3ZJNlB6VXU5SmlrT044dlRBWnlBNWM5YjYvZkhFT240WDhyZURnYWIyR0c1WGFCVVFlcnphci9teERUb09xVzdEZ0x2TE1xYXNnYnJaYktXY3I2SHh0NnJrY2Npb2I1V25ERWR0UkJaWklyT29xZ290L1k3UXdVZDV1ODAzSHplOWVSQ3IxNHY0V2twZHBpYXdqOFkvaVBuQXZaVVpZS1lFcXgySHcvWE9aQy9RL0M5MklBcysyMjlhTytuWVhsZEZIQmlCbG5pN0hWbjB1Nk5SVVVEOVlRSG5yMnlTV3huSnYwRWNDckNZWVByYnN4SWZZNU83S3B0bk50TTZIZWs5SFRROUpnaUpCODFXTGtnWEhCT1hJcTAxMmNkNTBmN2VTenRFajRnZ21tTlB1K0g5YmhqUk55MXphbUJLQU85UmJrQTdyanNFTkFrOVhpeWtCU1VLc0JmRUl0ZnpnSjBDcXVNb2JuM0ZtZjF1V2VQZW4xYk1Md0hydDB0RDMzcDMwcEkyTGp2R3Z5Q1RsMldzcGdBbFFyTExtS0lNYlFsQjFiZWhoZzJ2c0VDNkNpSE9kekxmazBwNEJjRmU0ZzBDUG4ySkZ6K3J3emZvM3RaWEZNclRjc05xaGx1ZUl0QU1kbkVLeEdDOERrTmJEZjl5NERtWVBYNnJqZENEaVdETFJrTlNtam93R2wzNFZEeVVJU1gxYkhVT3pTNlZpN1NxdktzaVJVQVBuKzN0c2dsTlJuRm94Qm8rQUNJbnNwR0xyd0hNdUpOVkJhMDR5WHlvdk4wV1cvZndsZXNFQmZwT1BsWXgva3JpMXN0S2d1QXNONTloQnJZaWtsZzJWNFREbE1GTXlWczJXUkRCNmUrZG9CS1M5V3FFeU5wbm1tUStWcmU3UmNjK0l1OFdoWUJTMTNDTEZGTEl1SnVDWHR3cHZub3pqa2ZtSkI1K0pwbncyRDVxV3drUUdOUitYSVdkaFA5V2R4RlVvK3hzM3hlcHM3OU9DVFhKdmFxdGtUdm43Si82N3hRNmROd0NXZURIaUp6eFBtSTJsNEVyYXRHRk95eDQ3Z2Y5ZU1xTUxiWXdnNE1xOEIrM282ZlV4T1grSGxHYkp6RXJObUNFdjg1Q0NFbmlaRHd3b3pCaUhwS2o2Q1VXLzBIemJnYmR1OXZYbFJUZVNqTWdwd3lYaXdZTXdiN2tzZnJBNkQ1ZVlWQlE0cWVNbElHbDhJOTROdk9ZNSs0MzBOR001UzY0VzhyT3RrT2NjRmFvSWhvenVJTkY3RHJZdWhqcWhrMXB0N1VuMDgvTXBFaE1Kc2tmdTcyOVlRRk1MMGxTOE1FSGpreHpJYlB3cW52c3Vid09qbVFRUmdMaDNRc3dtRWdBUzBaOWR6ajFrYnAzeExnbmx6TEZqZitiL0RNUGJyby9JNHl6NlJkZU1xakk4NlRqK1gvcEtlQml5ZTdHQzJjZzJVYVhPeEpJSGxnY2pZRTI2M1lJanZ4YjkxM1JVYXhaYUR2MEYydjd5aGdDMkRVcmd1bExNcGY5ZG1JZzBtdmFnd0NEc3k3aXBKZkVLa29HcWN2N3pUelVKQnMxZ2FwTng3akZURU5oanJjZzVnQkJId3NlRzAvTHlkb0JTdTAwTENlczlXZmtxbzdaN3owZFRuZ2Q3OFJoMUZmZGZXS2JaQ0Ixc1M1WE9XR0xZQXZWYTBIbGYwZFMvaFBPUmRNbFdaZjdtZnB2MzZuUVRCUmdDQ1RKT1N1UmQzQVNQTEdXWkVaZW5YMWhTMGRPa3YzTFZERnlnYXU3OXM1a3l5cE5lOFltRVRoQzVlSVRoVnJSckE4b0t5M3VWZlA1ZitxOGVUd1k5clRFcnlwUGZCb3I4MC91SWExeExxQ0RxdXNRMFNuTWlKdXI4dStOTWhMV3k1MXdRdUt5R3BIVUlrNzR6bW1FZ0V1YVh1WUphMkt4K1dxbzdVMG55T2pXdmdJdUJZRGVHYlRvRVAwSnBmN2ROUml2MFpXbkZ3dXhUTHB6UWVBK3FMbnNxcjhEazQrdU84anBGUmc2dWl5T2tiVitaUGtqN1I5b1lqMnI0U2dINUNDU3RWcFlFZEZiL1hBWWNkMHg0eEJJYTVLTVAzdzRQSW4yaW16b3FNQTBncnZBOC9kSE4xWWlQT3Y3ZVRSeHo3Z3BET25oM042NFJtNERoYjFNc24yZktqaEZiWjV2N3h6SlphVDl6RlV4WEpXVDFkVU4wOFRlUmJJWnI2Z1JPV2NvWURqUGU3TkJEZkhWWWtrZ0JlUXJpcUEzVkx4Y2R6d3pLTEtaL1U2Q1BiSCthRllrZzJoZ1QwRnk1cVlVSHJGMHphVlU3c1VMU29PSEk0bnJMVjlHTFRlZy9rTjFDMzhrUGtBaGRBaERCSUpqeVMrajJKVHNqZ05GakhoSHIrSkRFbExPMVNHdlQ4NWloWS9zeng3OFkzNVQ5dlgxQ2huVUlEcmhTUVFJZjdONU9WVDhWVHVaQW4wMklrYXZnWXJBSVlvS3YvYkVzc09rY1BMV2Y0WnpwUmJZT1dPVFZWank0dE9PVHJLb3Znb1hwVnB6SzdnRkhYWm1vTld2K2svOFNGRzB1UVg5djNwKzkzWHNKWTB2OG1yTFJPMWhDcWdjSmhuMGE4WGZNRXhNNGYvb2NrbDdlTThjaERGMXFjTTRISzVuMGxVT0JFa2t2Sk5OUnh0eFV4TVZPeTJ5K0hyd21ZR0VQVWxwazRlRERvOTZ6dVA0NEl0bmFYdkV4Q2lOYVlhNEdlOEZNSlFza0FmTy9ZTkMvMWxHRVVqNmJYa3hjd21uakxZUWppTDVhVlBwS2VkQ0pnMzJKYnpxaTB3OU0ya0RZaUdlQ1c3cXo2R0ZnYS9JYmNWOGxhU1NxbEpOMDE0cDVjNGJsYk05cDlFOWpEbk5Hakp2dWFVRGpBcVNhcUYzUFZQbnk4am00aUV3WE5zdDVVVkZKMDF3Tjl0QUViNFAvWE8xQXN6MHhTZnVwd0M5ZldjN0M2c0VTRk9CQW9ReHZZVlV5YTRTbkljMDIxb0xNMHprZEszM0lQenVkNHp0S1hlbEErcG0wajY2MVR4d01yYVVsREM1N0twZFdUUVNHVTc3eWpiNGFUaTYxNUJpcjBSVDJDSkZWaS9aUXRHVDVnVzNiSnM5d25uRDFDVDFySUdIZDE2YzBxS1MvOTQreG1wM3E3VTVpWUxCVnhJQzFqRWw4UWlxMXQwSEo3TkppbzlydUlEOGZsUHJOWlVvZDFDZHFPaEtXd2xhWUNPWXc0Wnp5ZGFlR0R6VmM1NkczOXV2cUtuNG5RdVlXQ3ZkOTBhSVJOdUFtVnpLTWtrZENnU3lJTy9UendMOXpmWVVYVlNiay9lRWhjaGZsOTJZYUVXS2JiWTc1VXg5ZFV5T1NBa1psZm9CREtMZUZVM3ZWV1F4UVBLdDFIVDhCNHNHOXNtOUo1WmFVMGF3TnN2OFcvZG9tRHR5Mzd0RmtqR3JKRklmRmZ5NDlkRVFaUmhHdDc1T0xYQmRCQmN0RmZCM09PR3lubjg4ZEpPZmk4aUZLaVNnNDRERm5EaVNMdXNNMThkRkNObk9nYnl4MUIrSUZRbmR5bndONWd4WDU0bFlxYmkzRDk0eG90bUxuWksvOFFyVGVoMlp4elE1VUZWL21lck5sME9GcmR1MnE3SGVETEpNWDh5ckdqWG9aeXRmS3dmeGxlM1U5U2JFTW5pa29YM3lIaElqMmsvd1BTenNRcGI5VlRkYXhYM1UwcnQ0U2Q4N3hGYjBUQUZFanI0ek9oWnpmUURQZHN1bmhoTzVJZnlLSDNoVzgvMHpDYkRwRzRRQ1NnT3RGMi8rR3RKd2RRT20vQVh4WGI4MGVhVXBxeHlaNzgxcEx6cnAwL1NwV2lJWWNSNktCU2ttcFNPTHFBcmhpdDNlanRxSWJ2YTQ3QVU2dlNqOXVldU04Rk4wQVM4UWxha1VtTk85K2xKdWNPa3p1M2NwSTc3MzNtbHNtTVdVbnVmNUNaWXN3cmhTQ0x5TWJPUnlKaFErVkhld2l3bDh0MDY1bzlDNldjWGZhWmZmdXVLTkRkYnY5K1RHVCtueFVqazRKYTRMeWZEYU94OXRQZU9lSzQ2Z01OMzBJY2M0TVJFWXdpRkRRelJVdDlJVzg3eHBwWkNwRncveGVKU3o5L1RsR0E2MUw3MWxNZW15UElKNHR6emFEWWx1RXZJWHlsMEpURC9MakMvZHJiemdvb25KRkkvOXpHSnIydktITGNtVUFCbXlPNmQvUitYL0NLWVh0cUl0TkpMV050dW1zWjVKdmJab0hFdDI1TGgrcXcwa082eUhkdXFaNUx6cWpNSWV6bVRCYUZoZEJkNXkyT2F0TE9GQ2xoSVJHMHFhNDNIYUFqMnFSK3l0RzRwanVBTDByNWZXTEVZV20zYUpTQ1JWTkZvQXJnb0NpWkVGRXpCS0VhV1dLZndDWHhSQjFsM3VsbEJIcVJrbFBzb3dxSUx5TlVMek5rTlNYd3FYNzhLa3Rsc1Z0STZFZEVyTFVHNDdhckkrZmk1bzcyRnlETkJvNVBEMkthditCWjgyYTlMdG1ybU5YbXFHMTA3VFBkRHAyQkVCbmUzdTVLbzlQdjNLcVBLYkVPT0NOU1VBN05kb1dXQ1ZwY0lHYitqdTVQaXNvT0w4YXJzYzBJSWRjMmtydmoyTlpQVGtHbTJDUmRVUWNQTTVhR0FvaE9nYlRXZ3ZPenZCU0ZFeHk2VGlXSU45ZlJVbnFKdzMwdElIWFFaa3lEVHh5M1ltSzc3U1dVMzdyODhQUE9oWVBNUjA0cXNSQmsrQUJ0WHB2QStuNGM5YU1oWEQvT1M3NDVUaUhwa1gyUmUyNGhPa2ZYTTBrMHVjLzhJdXR0RGVHNm1SVGY4QlBIcmRhenRTT3FSL1pudk02QWxFZDBjaUtUY3dHSWx5d2tmd0ZUSG5ITFB4ZUVndkZ5QmFHelRBMHRCU0Iva3RsNE5kb0lnQWlDRjhaV1Y1T0FkalRCM1E1ZXJQaDNjTlVld3lhcFAycU9LOGdOTmQrZzRlRWt1WW9IaCtNaE5zdkVEQ3duZFFuTWZpenowMi9mVDQyaldQaThydnZFeGNkMmRBbkphNUQxL2lneHZQOGR6TDUrdGNxSytTS2U0VE9EK3ZTUWdBZFhQcDhMYWJrd29BendVc0s3SDVMWGd3Q1Q4S3FCZVQxcUpxc21yS21ERURnN1REYXBNZ1hVNTBCVEFtZlBnSlNaSjAxKzRtZlo0c1ZGVDFXVnJqeXcvZ0VGZFNLMnovRjhJc05DcHAxN3d0WlllVEtQdlZZUm1KS0lNbDI5T0lBcHNqZGNwWW95eGYrbmdDMDRibFBhTUlnU3ZmRVNBMjJUcHJoY3VmNWdnMy9PRXMvdEhzUWNBQzBuMWdqVzR2L0xsbUJ3VmM3K3Q2bXNsVVFHcncrS0xtRHcyVy9lQjUxUXZyU3pwVUdkK0o3Wm1ES00yaVROc1hRVE15TUNWRWh0VGJLZmZLb3Y1UGxBYmRVQXdxdGZIR3U1R3ZiblNuYmlNMGx6azdTSjhZWTFQMzRKL3NsbWVJdkM0MVhlSjVZMko2YTY1V2NCdFV3RzZibmJaZktSdlF3SnpVYkdFQ1liZHN0VFNPYmRKaE5FaExDZEFKbi8yVjJ4ZkxxMTBMRHJGR2hMQi9PVk0wQ2UzMm44VnRoVS90dVArWkNhYWh4UEtLNVJiZHltVE4vOWQzVDgrS1NSdy9qRS9BWXl6UjZpUTE5dm1OZXB5ZWJKQWtjU3N3WFhjWFhkc1Q0RHhtTHQrZ1Q1UWpOd3ZvekpPa1Q1eTBFbC9VVkpITkFzTnpVYnFoRDJNck9FZ0tlY2RjMktPMnJ0amdDa2ZzQnl2NVlVS25PZFZmdVk5MmhWR1AvTUhrcklxRXc0UGdoT2NvYkhzZ2I3OHFhejhSN2M5eUdrakxVVWR1SHUvYXAxM0ZrY3NKOHlkQ1FEZUw5U0YxY1FCVjMxUDBUZHlaNXdNWHd2R0x3TEdRNVlndGNLQWlmZkVFOEtJRW5QeWNhdFJLcldnOVEySEY1RlBOeE1wbDZBNGxvbXR4SmFaUGpyV0hVdTVmMTljcVBIQWxNbjdiK24wSllTd1gzUzc5V3lwQ2pybUQ4Y0FYWm9SR3dHSWFEK1hrV3hXV0NyQ3U3dDkvRHpMMWRLRHpZZlMvZTlsdGdyRkk1eDNhcnphTHVoVlAvWGs1SWJ6S3ZDN1dHU1hPYndiUEJ6VW0rWEQzUll4TzhQQXZBZUxyQkRHd0FRS3VIZnF3ZFowZVlYSkNUZG85Nzl5SHVVM3pVNFhhZExNUE1IMEcvS0czaU1mR3ZUQ1FENmxJVGovdFcvQWMvcFRKRFpBOEk1TEdCYlIvNWRFMnVPMVl5a0E5QmRVQTIzZjFvQ1FoQ0tIYWlERlVLdG55R0p1T1V2dTdaR3NYVDNoQVM0M2ZFcTJqU1hhaVpjNTl2SFlDSmRrMDdaUnZLRlFFTjYwR2JXQnhabjNpYWRaQWRwaUxRWHUrRmJtQlRBdENlVUJYTzI1bGQyWlB0NjVma1c5anZBYURhRklTMS9NR0NGSFBHT0Z2eGt1c3hpNWhGalpWUW1jd3dnTkJrdnh1UUl0am9vV1dJT1Q2MnlLUFRJLzhGNERwTDlNL0sxTy9RTVAwaFhHSCtjRmc5RmoydHNXUkRSVGNDZVE1MGdrc1FlU0d5R3prZ1BFTGVpMWtJQVBLUVlkUHM2KzJvaHcxaVJUNmNOZ0dRaWZjWDJKbVV4SW5iaWRzQnZEQXJoa2tlSVJ2dTl3ZjNSODJ0bzBWQ2ZvNUxnS040UmtqaUtOQ01lTkozd1BEWEwyR0UyRDMvTnZsbTVoRkdQTzFRSm5iUWtpcmdMMy85QzJuT0lsTlUwWTI1RVJaNlFqZDh4bTVTK3g1N1lwSDdJeG9tR1hBVnN6UDZKRW5EUkRRRmxOS0Vqei9lVnBJQ0pDcC9PQUJqeVRPeVpaU2FaZlpoSngvQmJUbEdyakNBTzJjOStPeEwyb0NRamhlWW92bnp1eCtIUXBrWWxnUFJselRzRHg5eVhhSXFpekwxNi9UUjNQNlNNRjdyQXpkQ0NXTXRRTWNqSXM0ME9nbTNveVpIOG9NUHU2NEw1VmdMU3UrQ1BMZ2t5UUFqSGVjaEhsUTNCcmwwUkx2MHdjSjZ2SFlCQkxBWExHMFczT3NDNy9ZcVB1b0kySElGZkhrUlNtMmM3bDVQRGRROGRNYUV4ZmMwSzA1N0F4eGdEM05MZUxmM290OUZCeFlnYWdjQ1BwWTluU2tQQnNDNXJxMWJaVHc1dk4vV0wxZDR3RWJlZ1dHTTAwbTQzQnlUZUNJVlZnRmNtVVpNZ3ltNzlsdXp0dFQ3VkxFVzFiTjZJNjRmRU1IdjRXcG9qQ2t2TmRmckV0ZGE2bkxjbzVOWk5WK21GRjlDYnhwTDJpUXpGNWxuVWVmUWNRT2ZXc3gzSkRkMFZhM3VRTHFkUmVKeCt2V1Z6SHJab0o4MGtsVzczb0FHZG9Cdld2MSt4ZGw0WEU0RWNCYWMwZUZ0QUw4c0l1R1A2eGhWWTJkVExyZzFJR3BUY0hNb0I5TG1NTkh0VGY5UEpWMnhIeUpUUDl5TzV1eVl3bjdSSDFxdFVxczlGSXVGOTBEZDZYaTkrenEwNUhVcC9qNVlZalllRWkwaTJramFOS0FkSlExeVpReEpKaC90WnAxdEd0NnZaQTVIRVQ4d3ZhVFpiSU8zN0NYNW8vYW5hdkpkaDVBSkQ3TFloLzVqUUZLbG9XQ3JEMnUzYis0ZDdkd2ZaU0ppZFY4WDdOTmIrcm5hQlpMTnJtN29xUUVPSGFLdlFheENaTDlnRUloUE9OVmZEenAvWnIwMVZzQnFiN1BDblRvTzlGeWI2aEdPRFhIeVpNTnJONkpaUURxMVdqK2dlQXhEejJDekhVV203dzkwUnB3b2JsWUVPMkdWbGRIR29rS040S1loeTZWMTE0UFRPdFRkbEJFWFVkVllTZnkzbEVKSWVzVk52NHg1cFY3RG9BOXAyNlc3MzVqcktMNzNxbjA5dTYvNDllaVFMc1M1dXcxMlBhZSs1SE1rdjJRRGpRY1l5NzNpeGFwakQ5ZGVJTlk4TXpFOE5iTlFKaU5PcnBkQTdaaWc0UldaY2t5T0NjQk5rNjlwWWpacUpwSFI0b2E0OU1wRExHUGtqZ1JlSm9YOWV0UXBqTzBuU2ZwNGpFbmxqVnlSMTlrdFRMWEV5WXpubERwTjBScGJXMlJ2SUhCR3JVUHpZTU9maHVqeklualkwT0hwSGpUQmF5YmJOeUFiWHJBeWxVcU9Cd3pCaG9KTFlOWXBtalBrdkt4OVRqY0l5QVo0alBHQkJSNnJBNGxCN09oTlE1dkJpZ0xCbVRWdmxXVmt3YVRmNHJKeXlDd0pRUVAzazZYeU9qZnVCZjE4clk4U0ZMMmxHMEg3LzFCb2R0dGNIbHZTYmRqU0pBd2tTWXFTQVUzMU1tQk92Q0NpQS9TMWt0NFptMXlWanZOOFJQOWdKK0pLcnY5NEtpMDh3RXNpV1kxOVNXN1cvQ3QvUTJCbFNOaFZvV0pJU0xuVHZmMmpGN2p0MVNhVlZuaXNRRldjazRIa0M4U2tDanRxSlpvZ3VnNXVkbm92bHJ2cW4xRFhrN0gra2tSc2lycXN2KytmYXlia3hiQUVONFVQZnYySWpMRXRwOXFxZDZnbTRlSnR0RGRrdmJEMzkwUmE2cFFlNXNVZnd0anF1SmxaanpxaDhjRHkvQmRhTEtNa1YwcEFyWDltK3U0MFIvOEJjcHJxVUQ0Y2NaZ2ZOc2hLUUY2UTFwbWw4UjRUS01xWEk4WTBENGpKcTZERmgwQ3dxVjNpWU54VmpFUDJuLzIyRnJSQlNNRVYvMlpMY3BVdkUwMFBaTWtHNUEzNDNsU0JkMzFwT0I4enJxdzRBZjQ2bGpBRzZXUzRYelNCN1pKWXIwZXZ2bVNKbFMyK3ZmcmI0bWdFN1lFazFobEdKYXZLcVQ1WnFNdDhFODNubzhWTU94cm95ODF2azl0Z2g2VS9KVkhlZjhnMExHWXQyYXpCbGxXZ00vNWJjQitrRUhNT0tlQ3I2OWd1aW9qS2hKbEo0N28xQmVlWHgvTWUrY2trdDdxRXR6aVlZcGxZSXJYbGVxL0lnOTY4ZEpnTk5Jb1g3aU1aM2tYaDNhVzVTbUlXZ29QTDhENmx6U3g0ejFLMG95b3dQOGlWUmtPZkNpck13UXFvV2ZvWjNJd3hIYzlaNTBxa0pHT05ySjduQWx3cnRTZWF2dGh2cEV5NGdDS2ZIeXZyNGlQOS9PYmtheGptWDkrdGowekZNTDdzWWZNRWpjQno0bmRhcEptSm1xV1prMXg3M0c1MVpiWlZtOWVDMVQvYjVlbEt2RFZrN2NYY1ZrVjlBWmZHSFZBV3BsNnBub3NtcTIwbmNCTWk5Mk01SCtxZ3g4dEVNcDhWVDZ3aDJmMWFDbXA5NzlYVE1Tdkt5aFB4bytzNGdVaHMxKzJwTnhEL1JoWG04emNJdjNaZTQwSkZjSDB0M2NHRWJUSTRGc3ZJRU82dCtQOFFmeW9TUHNjU2lHRkNVMjEvelM4b3UyYkZSOWlidXRuV094M3VoNS92N3FzSGZ5TkxsODk3d2kzRW1Nc2pHZjhBbm42L0s4U3VJaENFT3FQZ1ByY09xc3p1RFJmZjdjc3VLWVJzNDVsT2dVeWVOeWVnR0licHNRT2VUNDk1bjVzUEFhQ2RLQURuK0tsRDZRWXJLNVRKQjB2NEFhM3o3WDJkRlpVNjNab3VTUGhvN0h1dVk2UlZ6QktPQy9mSFpUUERTeW43a1FzT2IwMUNrWGUrUlM1ZzhYQ3NqbS82aGtEaDdCRnFCczRkRys0alpNN0EzWFVLbk5VL25KMHlRV1BSdnZVNkhuT0dNYkRJT3ZaOEg5S1R4THJkRitaaXhra1BySHJSaTAwMVBnQzFJbzNLWW1lL21hcUN1TEs1aytWMWR6TXhaWU9UN3dIbDdzVVRwTzFhdW9mNkhqMlllNGVDQVMyQ0xDR0VHVkRFdnVtU3hQNnlIYTJpdkFyYStMeVpPLzg1cVJ4cUhNNm05Zld1T3V1bEgxUVM0QUwvQ2V0bnFENWFNYlhJWlgwZXEvQkx2R2d5NVFTd0hOa0JTT3NqRXVkZXhXTTB2MW5GbG1hRlBHaFNpRWZTUUtjVmpGUTIwOW12NVRqREVGNkJFWlJsSjlNVktTdWxMVFBOTllseEN6NVcyR1AyNFRHZDNRa1V2N2M0VGZYR3UxWWFLSlVWMUhpa01vb0gxNnFwVXN5aUlwK0JxWndhbW9kakwxSGJGNjk2QmJqUDJUNndlYlNEUzZJWmVsR09KY096ZmJwZ2NQblNkYUZJa0xHVnBvRjFaeWtRcGRQdnFIUnVmTm9QQjZzYi9OVGRaUGswUXJhdDZ0aWg2bjc4UXhWZUYybXRFYUdsK1lBdkFOZ0ZiNjVsRStjSHJYMUgxbEdXWHp1SnRjT1hiN21EMHk5OGp3OWJiOEVzQ05PcExvWGVKNFBoaWJ1bkVVUmZVVjN5WWNKN0tqMGZlRjMvS2pISVJKa2JvdXFRK2FEM1YxR3dTenpZWTNFTE1VQ0haTENVREU4R2hoaWx1Uy8zd2g2VEg4M08rTVRYUGZJSG85M2lBUkQxRVMwNGJUOExYQmdRN1V1VzNjckJxb2twc2haSzdNMXRoTjVkeHFNeUl1bURvQ2Q5V1YrbS8xTy9HQ2RuWHhOYURyVGhIeG90VURSaVo4dlpndk5pVjBLbVQ4TEY3LzFJM2VSWXoyVFd6SzJQekxOcUVXZitnTmp6aDd5UlpMR1VKcTNEVldHbFBqcm80cGZ5d3BJL2pFZ3F6UGxDMHFuaUxjRHlkSWJmQ3d1NUVsTUpnb0hDWnAwZkI3OE9xdUdXNnNmRkgzZmNEV082WlJyamYrMGF0bkNXcG1SN3VOYkIzQnZMSldxMExFNGdzdTdROXNzQjZRWkl5VUxDWDZnbEdFZVpXNVJtNzhma3pMSlRCeENBVTBhV1IzaDhNcVJXRUtLR2Q4SCszSGJ0L0V6VUFvM1RRdHdDSWw0ZE0zNDUvVGxCWDFzN0pScC9RSUNDRG5UdHAyNGxUbzdmQS9vREc3dkxETjlsK2ZjdkFhSGllcGtUT20yeUdyZTBxcUdlYzhaMjlqeDgyTzIyWDhrSXA4a3l1c29zSk9RUEx1cEd0aU11aTdTZnpXSndxYThBMFNLZllQbWl0VUdoWFA1VFRjYVVDRXp2eXB6VWVNY1pUUFdJZnd6RGd6NExIQ0Z6T00weFNZQnZwVkNvVHRPRXIrYy8vSDhRT1BEMW1CL1d6TkczbkVlQTNZN1J4UHc4c3JsTGMzL1B0UmUxTXNvSk1XZmpkbnFndTd3RkFOZXB5YkFneEpzUVkzVHNmQnRZNmdvRTlmMmNMQnI4T1dOTFpJU0hGMVM1TGRJeFpMUFlKaHprN2QwazljTW0xdWxURm5icmpyMmtpa2VQVDVSRlV6VHpGRlpVcmh4eVNQaklWMkhqbVZkZVRtdDgvMVQ5ZTZ6Mm5tSFd6Zng5RC85MzNkSDNUd2J0bHk1K2oxQ1RnblIyTldQMHZJVjdCYzFVN0J1Z0x1a1diVzg4TEFQSzFhUzBLL0R5WSsreHlLZFIzUlV1Qml4MXNsTzFmUlNBdGxua00rM0tHMFNqR3lDV21rVkxCcDEwWnR5OUhMQ1o3aFcvdXU5QkM0KzV1RUE3RVFaeE5zbDQ5WWE1U2xjWVQwcHBDZUN5enZzTTlLKzFITmE4bFdVSERDSG1xM0FtbXFvN1gwZElWbGkzUTg5Qi9uSnVVKytWb3U4dnZ4bTI0bS9jM1k5UHNPWW1OL0Qyc2xpd2hLanhLcS8xUjRGK2V1cmovM1ovTFlESHdFZ09ucTZIRGllSlNnVy95bWNHYU50dlB6MmtTU1VHQ1IwclRGZVdhRkFYQXhtSHNLcFdxbmVKVllyckpGRjc5N2lWendVeHVhQTVVejBiYUxURk9qYUlhNEZMNHJlbHl1VWMxb21EVW1oc1lkemdHbVQwUnlLNE5KWHQxRTVtZ09laWJUd2RiQ0lsRE5DSW5uRzJQWk5ZSUU0bktFd3l0aWVabHhZYnBBbVpyaHhUZ2ZTallnU3NoWE1BSmVFdnltMm1wTjNlTzlyL0xsOVpRRTJPS1lmeHM3c0UxK213aDFPaFJaeEF5VnhOZHV3NEIwZW1KT0dLV0RBVnlTdUZBcGUvZERlWlVKNjE4bHBISDBqam1vazJHTXRiN09wNlU5MnFDUll2Y0pkUUttdENDK2VkeUwvYzQ5QzVaWU92dWIyclYySGlxL0xNNlBtV2dkdUxHbVJJTmZWVHo4dVExcFJLNHptVkc2cmI1V0t4ZlM0bnAwSHJ5Qmg3V092YlF3d0lGcGs0Ty9HdjlDejhwb1dRRmZLVE04STVKWkdFdnJGdkdIOTA0RGJUcVI2UVJ5dGZNV2hwdk5abjlGVnNqNTQvSUdBYVdCVExkMDdjTExSNVpqam5LaFZEd0tTMnZMcXV1Q24vU21rdm1QNnJ2TGV4TytCSE5EV0NaNElsdXhuVjErc0lPN1VDcG0rcVNpakN4Y2RDYTFYRUZFR0pKbzI1QzhMTk5zU3R3OGg1RFo5bXY3aWNGT3ZvZGVMR0dPR095RGJNUDF5cFE4TWtqVXZGUktZV0NhandSeFZsaG13dHpLeDdxam1PdDBTMVJqaFJzUWp2R2pZa3dlQTIxS0Y3c3NtMUZnYktKeHJKV2lVczlqM20ySHcyd0d4OUMyVGNDbE8vUnZRTm9iTDVudSt0bFRvaUluaXh5WGdWMlMydDFtamRSSjhVNjVxMWNBbUFkblJZZVhkVHZJcXhESnhzMGczRTlXeGpMNmlkSytsMmQ4YzJodlpUSkxLTFpOYzVyNWZnUGZlbUxhUER5bkFGMTlHMnRPWFlOdWJPeFN6R0l2b0hQTHM3elFlamh1ZngvSDRKMVA0RVlLNE9HOHhQRkVrdkcvbEM0UHRBV1U2S2hRSlROaWI1ZTNHTktZTWY2d2orNGNITjJuQjRiYThENnlpamp3T1NTRWlGYlh6YmFGZzRxbDljYkdUMmFGOXN5Yjhaa1hpRkxYTzRqMjN4YVhnT0JyeFBxSDlsVGpldVpnNEppNGc0Vm1rTGZsdHgzK1Q1SCs1SlJXMmRSU1FuQm91M2ZibUFzU1JWN0lubUliTXN2SVlLczFTZUllOUNRZWVwdit2a0FTWUZvV2s5N29NRWxESzRLbUVteHpCRzBJanJFS2VzWVB6czROWHBqQnh0M08ra0F5Tlgvd2tzSlZSMlhTdHlYUTRDM0VQWnV0Z2FjL0NML1RNQWhhWDVnQXhTVmNYcm1mZXZvSFNLTVRKdE9mSHgrcHRXdmlKWjhXYUFjMFNTa29QdFRTMjlzTFJ0Z1U4RVYrcW5EWlFibk5iTmFrTjVRaG1nS0h1SitEbkwzK3RZbHhiTVo1OEpGVVZyVVVtRDFMc0lPV2lHOGwrVDM4L0xHb1ZsZXBCSUVTckpldjd0c1V2TWFTSWJnRWZPVlh3TEI5WjRQQXQyMzZwMDBaV0w4d2JScklJU3MraUFiSnF0a0NzMi95aWIxUnNTZy9sY1BTUnphdjlXMXJLeUgwbzVrdFdyYUtiaUxiU1NUZmc3TTRDb0xDRGszejBXc1U2MkhUd2NHOFdqTXk5RWUrZEJiR1FkRXJ1WTlCZkN1Tm9kM3JWUm93bXZubDlhazQxTlMvVGhLRk44UEpSSzNWTUlrK05HZlBLazRnaDBvc0xNb3pPVlhNeEM1R0NLdXRBWHBobms4SnVpWjdDUDBBSHpDTjBtUlNMeVdLMkQvcXBWb01sUU1qSFZOWHR2NTRjZEpKQzA4Si9JemRwcUVob2ZXaE56U3hIQWdLOWpyYm5Bby85d3g4QUhzRmMwWk1YL1lET3RCamRDV0VmYWc5ZWZyVDZtd2xFckw4TjhuVmNuclJMWjB3SlVvbEtzWmhIR1ZlZ1VBa29DUTNvQ2RuMCtYSGRSK1FvSURNL1hmdGIyRDJsTm9nTFJkb0lHUUkyMk5CcVhxR2o0bm1heGU2Q2lrWmlwVWlCODNNMFhJaFFhVm9PeFhoRTdwS3Y1b0VtQTJYY3g5NFlKYnFMSG1Wc3BjRjRQQW54cEJsZTBKV3N4OVViUUp3NFRWb0pwdWtkL1RwdlM4MnVHWEFOWUJKc3BRL2FPMjNCc24yaktFMmU0N3kyT0I5ZG9QeVlWWndnaVZTdmZKMm42Zmw0RlpveGpzQTRlb1pyRGdQb2FQSUdwb0lJWnBtcnFkS3BONUVKZFhWeUYvTjhkZitKTkJrdGdNSUthRXdnN0xhRlJkMHdJbGV6VE9lRTUyclFRQ01jTlh0NTZtNUxYeDVJUWZqa0MrMVFuNmdmOUVqbW9MUEtCQWdsQkFLKzNwbmxTMnRQbnBJOGpSL2hxNm8rM01vcjhDaXlaWGJ0c05kaGVpZkR4L3JuS0dpb0JZRmdZbXFnRWNIRmZyTXR4elN3Z2VFRFozd0VuMHFEMnF4R0RXK3BLbEZnV3IrMVpoT2s5c1VxTDBHWGVMeXI1anpjL2ZEVlZmVnVGUkYzS2pycjdLUGJGMTRYNU4zWU5XZHRVWXE5eE9CcFhhemlSNnZrZGZoSFZ5SWdPaXg5QWpnTW1GN2V3RkJHZmhjMzhsVDBrZGpVcUsyQm5qdERqZUNheXl0bFdTVXFFTWVZTUl3Mk5xM0FKbENEVUZDNmdVSktsN045MGpqQ2FiQnp4dGdxMzZnT0hUemVmek10eHpHckRXV05sS2Jvc1R5UHcxK2pmUFQxTndPUSs0bjA1K3lmdUU2OU8vRWJmNXkvVEFBbFNPSGZmYXpUeTZteFJ5K2RJZHRxc1ZJa3ZWV1poYkRzSnlpbjEwZzN0bWlKaDRqMUlaaElUWlNRQk0zQmF0YmJuMGR5SDA1YlpOdnJxQVAxNEFpTndSZ3VjbzZKbmpqY1l3OWxZc1NaS3dEcVVzOWxPRFlvNC9TZ2FzYUNEVmVqYm1aK3UxNGVEZ05pb1BwaXg2Qkt4NC91eG5yOVJkdnBNQTdZUDdpOHZxVzhNaDFEdXJtN1hMdjJtNnRTY2hONXZZOHdsNDVNUms1NnE2Qk1hdjQ1d05EWlMvMi9rRFVpWVkya0Q4b2g3eVpVU2tobTY0ODZoYWJXUXVPWC9ZNVVxaXRQckt4RDJDMm53WnlCY2ZsS25aNkxOL210RUprUjRpSHppQ1JtekJieTFva2ZmNDdOZk9yR21pbG9xQzVzRmRlQnRMaGJqOHBIT1k1MUtrTlFvY0JjcElHR2NERVFMOUtxbERrOHlPVkVIUUdWb2E4K2xYMTJQTjk0R0gyRnRBMVBFZFB3SFVGZ3U4a1U3S2lCcEtCdUFlYUJPN2lWSHFBckEweXEwaDZ6MU5MK24vdmVzVW85U3V2TmorcmoyaVJ3TFdUV2NBaE1YZFBSU0htUnA1Zmk1VXlnelpvMkFCTjdYQ3JGWVJieXllK2FpbWJXcmJ3YSszeENiUEZMNmZFS1dGbHV4VTlzOUE0eS9ZcVBnL1JuMFlKQU9PQXlkSDhoRDI0aWxkLzR2c28wVzFINng3U0l4YUNBUUZVRVVmSWdTRGpvK0lVdkNVcWRvSlU5eFhJdG9TS0pxanJ1WWJ6L0hRc1BjdVRpVk9uNjFsNWhDbjBxTUVuSjhVSG5JSFNyT0txY1d2Nzh1S2t3TjN4S25qL3ovUUlJMmRVdlMxY3NKQjVXMnlsRnh3cTRoa0Q2eVAraGJVckJrSTlXekdBVUFEMVdKWkZtbWZwK0RIUU5QZU56VEdmWC9IYnBrTHVZRG1QS2FsTUZ2eFFMeUZTK29oalh5ZmFkbklzbm5ZNS95NzJkQUZHa0hvYnFjU0ZxcDJGRDZibVFOSEN2dUNrZXJLSUY3VFJnUi9pb0VJUTczRDB0azJpOXB4M0djMEVCb0dxamRPbXN4cFpSNXdMSnZvU1RSTzUzUnB6NEdaVGREbGRoSTFlZWpRTStlQzlYQnBkS1JHZ2tCMElja1VDcDhVYTFqK1ZGV0VEMW1IUkdnUjIrcVRmWnF4b3g1bm5ncE1mMVJMSTBIWFpRRXJkZEhPRFk1bS9RQ3VCT0ttU3Yza05CZWRRYURXMWRMVFZVVnNweHV0NXJhdzRXaXh6WS9VMFZwVUY1Q0UzblVVbmI1d1VqRUNqNTdQajIzY21GdUVBaHZYQXhHQjVRc0ZhWEhzQStROTFSNlpzRUZVVlJpdWh5YlVjNWlJcHp5UHVCZ0U3WExtUGdkbzBYc3BTQ2FJLzlJV1VnUzMvbml2MjZDYlJ5UWw2RExQOTM1QjZrblh5dFI0bk92cTVjTnM1bFdJMXJib29SVC9TWTZKK3ZWeUlDRS9QWUlmdVZqamFrSnk4ZFZXUHhXUEtRZGJTS1pxTmtjMUhqcE1DL2xYMXNWNlZWMDE1SGk0S1hLMWJ4Z2VaQ3daSkpFLzM2cFo0WVgvRWxwVTNjU1E0a1QxTGlDSjNvRUpJY1VyaXl2YUJpdE52a1hpUTdLNWxpeDdnL0dITCtTNzRIOEhwbVZVeWJVcElPbit2amdIWG9Eemhtckw4Z0JLZ3Z4c05pVjE3aUtpdzZTUSt4aWRpZlRaMDJYK2toaVZhMGd1RVVYa0pFTDU0QW1FYVhXcTI4amFIeC9taWVzNXR0UFB3YllDeHRRdjNpOTY3cjNiT2dUOUFEUDUxTTlMc2NMQS9NZGd0SW40TzZtODl5Ri9pSGJvLzFKMlBHZDdiRVVZZ0hhSk9EcEpLYjlYWEE4bXJKeFRhZ0tIR1hzU0FxMlloYlV2QmpGdmcvcGhHR1JuRVllTlA4V2RCdzU2MDRvaXVnYk5tVGllYWhVYkV6NUVUcHFLUk1QVW5iTmYwOVA4b2h6dFBSRnkzZllpUHBob0IvYmdsRk5oZmNwV09ocUl3Nm1BcjRyVU1IL0FyRFRIL3FleHpqQVJ4dDdveHY4ak42bHM4NEdha1lVMjhnSVBjWjZaRVNFWFQwQUNWckVSb1YwT00vbU1SU3NnRGpwL1BTb2ptM1U0bXE5d0pJVWlPYnRhcUZGaUJHbm1GQXJnRVhvajVnUmZaVG91M0dJMUlpU1B1SldYeHhnVnBXMkw1ODZwejl5aC85UnhlTWJKVkc4cW1CMWlkSXFYRnVKdHhMMHBwcVNDKzYxVXZKNjRpeHFLN29BYm1DTndubWZVVUxFNDV6Z2VvbWQ5RU5jVTZRUTBDRU1OQldMQ1U5cW16NmpsRCtydzQwRVVZczVqUENoMW9icllZdTVCTW1ydktYclU4VjgrcDkrdEo2VGtuTjdFcVRhMjdrckY5VS9jTjNPSzFYTmY1eUxQblF1OUFZQlJITUplWnRhV0xzajdCYzdTR0xDcnJ2L2Q1ZEluUkZpWXE4RnB3MHh5dG9mU1M3SW1KTVBFOFh6MWVHY2pONVBtU2EwUlcvOTZNWnluUjh2WG5rN0dubTJlSWVYYWlEWS9NOEFiZWlZUnZxY1FyN3dYQStIbDNtMXBhbjFla3JmNFJ4WE5oUU15OUZrWVVpY3FSRUl0eW53bkU1ak8xMXBxMll6TkZFalNpOVlycCttRFREejA1ZnBLZXg1dEMrV3g1L21xdzFqcWs5TFhsMS9maEpyQjJhSmtIc09iRGptcEQ3d3ZLd2ZieWxkRWtvRlpUQUdQRVl2Y3pjb0l1aTZuU3NNVW5scDRwSWpPYXViaCsyMm9GQk43RkxNb2N2OEtBZjZlVUxGelBKc0xVMHpCUEVTemJDNmY4U1Q2cFMzSmo0SExsTHo5OEJnTVhUelRjejBKSjJOZmI5UXVna2pLRUR0ODF0RnZqRVhRQnR6VWt4bmZUeVE0c0o4Y3RqQzhTcnZDNDNURDl5Tms4U3hOSlJDeHpUNDdBTkxJZWkrVFFVVFJybXZocjdWR3g5bXJvMWVCUnBDbXd5cWNOTG93Z2NBVStFMUdpTklpNE1YcENkSlJGQnV5cFhXRlh1OEZTYUZSLzVtYURUTlJwSWZVcjlQcjFhTzhOZFlud3VLOU9sZVBYRTNkcW8yWVdKWmtBZkcrM21aMFRYaUhUMzBXcGpWc1hGWWJhSm0rZ2V5ZnNhVWNsOWdLVVRlRGhnby9mVDNObXUyK0VsVEVrelUyaGhvU2RnN0EyaUM1UWN6ZkROM1NCK1Uza002Y2YxeEZqeDlsSnhETitwN1haNFZ5K2djRGV6czNXWnYrZzJVa1ZjbTMxd0ovdjhpYnNRRkVCNDR5M1NFVzVoaThIa2tlU2Y3akZmUG5zdnlubXV1WktDbzRBZGZQOGZHZ0RxU0hsWityR09sdXNEcDlTS1JhemdGQmJxOHgwL2hLQWozZ2ZMTmZEOE11Y2lmZjNpNVE3UVcwYmtKNG1LRHUyN0tCNWJDRWdYSVVpU09rR05lT0k1aHF5MDFJRUxOUjA4NHAwSkV4UjgxSTkybDNnY243VUZiN3M4bWF4ckFuaDhWWnI1RjltVnhSTm1zNER0MStJaS8rMlEwMDFoeHBHR1hrOXJnM2lSaEs1N2UveUx1cVpyNEZtZTFEaDJaUjRxZ3RVMklyTzlKN0J4c2F0czlBT0xkS21uQXMwWnJSbGgvVFlaK3FyS2tCV01ia2VDZUp4N1JqR1loYWY1WVdiS0taVGJwK09BbVM3b2FEWlNuYVFSTmd0bkgvQTFtcVo4SDBWUHc0aURna3RxWjRrMlBDWS9pMmNONkRINmhXSHVrWFdIL0tZd3QxVXYwdFVPbVhQZGdodUJyM3FpWDZXUGwvRmRXdTNqdm9DSTR4WGNDTUVRNkYxbkh5bXlVSE5JSzJ1akNHdDhlYUJQd0lCNEtqZjlUOWF1ZHdxQ2VBalpndjdhQVBOTTZpUW1RVU85WDBTc2E4L011VTZVN08va0pxTlZMSmUzY0Z2anpRSVBUY0VTTWpYOFNyeUdPQzJnL1BGbTJ6clBLMzJHTXBZaTZLVmJXQkF2Vk00RlpEbFB4OENON0lsTk9KTVFHR3V2VFhGUVkxc2dkdUMveE9YR3dLWkUwNmxqR0ZMbS9zbnR4UmxrVlNpUVpwcnVkdlMxalZVeWpXTkNTalloYVFVSjEyTm1IWWVLSHJTWXlsekpadEFyZTNOam1kOVJsRjgxeGErc2VRLzhoMkxLNFFPODFEQXlVQ3I3cGRQeFFWWDdYbnU1S1VOQXJwVWxtd2J6QU9GSS9od2tKb3BYMDgrWGVOcG16eVNORE1VWjA0QkVBSSttYmFjZFFhbWR0RXJTZFJnaGwrUzNSNGgrSzU5T3Z6OXVMNlljRlBXL3hlLzlIZkxPZmc5Zk96a3VZVDRITGVHQi9mdzd4dVJCZVg0djMyT1dlV1ZKSjhTdUNFTHJhcC9ma3lkTWNLUHhqcExKcG1uNFlzNlYrN0owUlUzd3FHSVhSNU1McGxCUE9mMXQ2NHdUeUVES0Z2VEl1dk42ZThHc3VJcG5RaHowUmFKcFdaaTgycmNvRGNHdU5RWXc3dlRySkdiK0dGK0wrZ2IvcFhOTGh1YkZGR2NJV2dHUWJobENwTGsxVU9kYU1GZnJ2ZVZjbjJaMXg0Tk5YN1dSZFhTZ2xsMzN0ekdRUm8rREFldEV0aHZ6L1IwbnFOcjJ4Mjh4d2tsRTNXYlpBZk9oUktwVHJCeXE2SDBCc0phcGtIZytMdFN1bkVuNlBaajRicnVvYVB5bUlYVTBKSmpVenVHNWRsRlQxV0pFOUNpQlI4QzlpYjVYbHhrTGtERWd0WFREL1lvcnE4aUtqRUk4WkNDVXo4MVF4N3FaSktKU2swcFhCVjROeGdDZDY0a2EyVEFJazFTMzhuWll5bnFsRVpVeFQrNCtaUjlFQ3RMc0RkTFVHVjdrdHR5cndURkE2MFZudm5idDBYWE9kK2F6Q051VTZtU1VBdStWMWI3ZGF6MDJkQTdJd3dqZVJ3TSt6eURYK2FUT093M0hlWSs1NWFKR3RZaUNPUUNUTHlkcWVTSHp0aDFucjNqN244L2pFbCtQeG1GcVA5bGpNWUp6QTZPTGtkZ1BvKzJwUk9WKzlHVEhqTkgwSEJud0M2VFkvZWtkbGs3cFNteUZTVEI1ZmZnV2hjWWNtVVlPQWhqVWgwUmUrbG0vSEszT0xiNCtPYnh3cXhXSEFMSkVKRGdaVDM3NElkenU5bHBwdXB1djBOWkc3cHNLT0U5ekZHU1VxTWdmN0JyckZ5b1AyRExlZG9CRjhtWlpmRStwRHNDdHRoR2wvdzdseVljUnVndVJ4RTVoZUNjOVdPMlBXVkczc0YwcjluVmtDRVQycDZYQzQybEsrVldqOTdkNXdjYVJBZ1cyNlhTRnByZ2NNUTUyVVkrR2w5UTJXTXo0Zzg5YWVKdGo2TnIrOCt6ajMwUEhwYkZYZDZRWmh4UnE5YlJZV3ZySUEyMGsxL1k0cisxSWNnVUl6UHFNcHgvUC9BSUprNWhwcEN1UnB2cHplTEY0R1dFSUIvMHd0WGNpSU04c1FLamZ6TDRHcWh5RXZjTXVid3FFZzRnRURIblp4NlNVVkt1YUhGUThtK3k4YWlxenVjZ3BNZGFzeGhYUGdjSHZaRWhDRHUyUllXZUI0NHhEcjl0TlVCMjdybHRpRHdjUnZ6ZERhZWZwaDJpMnowMWIzbVprUENBRlRWVk5GdkFUSVFualZpR0YzeFVETGZFclVSRVh2UkYwU2hrRllMVDVYanJBditINDNVRkg5U1dCUDZaVEt1UVUzRWdjVXN0VGE5elBWUlVyeWIveGtnYlhOL21XS0ZoMlNqL3V1RDRIcC93cHFyNVNCVnRBenQvY21pWEQwd2VjcCtUaFJENkR4R1VoeXp1cGM5TDQ3cSsxVFhiNG9Rb1lwb0JNRTR2OWlmTVlwc3JXaTFCdVRGVGtDamRUWFZ5U0U0SVZ2N3FkRjI1MkFTZGcrS0hyb2pqWENwRzJ3NmxPSWRYWlRLL05PdHBZc0JkRW9FdHAveWxURGI4MFBPT2xhOUhPbWQvdEkyaW54UGRPUDU5OFZNTjZSbzIrOStQNTI3NjhPU1FhSlJqa1FtVlNZVExNTWV2WEI2TGpLd3BOcWFOT1VHLzIxZjN3cXpqNW1HNzBJajBkNUg5TzUxWExBVmdxRDhsQnVwbkV0ZDZZREpTK1FxUHBwL3NWb0lZSm9IdmlGd01LSHpLNUxZWUNjK1V3RitjRTdFalFROE1LbXE2RFVkeXRrVnFmOXZxbU9PRStMb3RKRGNmR1JJYXh1ZmVSeUpvYzVWMTI3RWZpZTNpem4ydlN1eFF6OWlpVXRFczBsRHRGRVd5ZDBmbHNsSEkrWjQwOEpWOUtuUWZYNTY1eFVxRitNdHpLb3dqc1NwaFlOYmFWVENJYWhweVN5SW1MdzVudzN0NVBCOFdTZXNKVmZKVW5nRnVQdytGMloxMm94L2NYUmNLQUQvRFg5QVdvR2lNL3FrbUo3OUhKNHVDTWJ1dEN1bU5XMmVlYzRpcU9DUEVOOXpIOElvKzZLeUQ1SkFrR2JTYldaRGR2TEk3NWZ3RnlCZUNXb2sxVnVnUlNsdHErcnl0ZXQveHI1azJjTnlZcHhhTVpYL000c3VtRFA0bUdMUVJCMGhlQTF1Q2dFWjJtb2tXSmpnY1p4SHdrNmVWZlQ4QzFVN0l2RUJLRWoxVjAwQnBBa2N4MlgvQ3MvZTdUTEFQeUdJRk5vV3lvVXo5Yis3ZTZZUzM1YmZtRm9TOXBBNDRCVzJJeCtMT2kyTzA5ZHVDOVpmSVl2Zkg5UUgzU2xTanZYcFlKWWRzRzJ4ekp5WkZ1TGNHNWNodk1udGNSUlhEV3lHNlN3QmpzVkdMVFR2QTcrK216T3RmNnlXY3pkT2I5cDRQUWF6YVo2SGNQbG5JMm9sczcrMTcvbTB3ZDFyUDVFMFduOEhtNW5mb3kwdXJNei8zaDRBRFdxTk9hN0YxNXVOZVhUSmdiaXVXbk5YVHg0YnkxRE1PZkhOZEtRNHhubHUwYkIrM0FINis0dmQ3dmhyVWU3WnJOSXAzcUM1TDhOdkMvSGlrdWJ0R2s5N3JuZVBDc0Fvd3dJdjVhK0N6c1NZRWpqdTdMSEFVNUp6U1dQQUJWb2JwOUtOa2NYdytxT3ZENzd0YjUvcTZNdHlLYXVtYVpVcm5paGh2SHh5STZOU2dqTHBpQXM1MEZDUHJvVW9yVWdRaUs0SFNDb0pxYUFsMXg2QVE0TWFSSGhVNzJzRFN4djNhRGwwZy9NSElIM3Ixc0cvVU1aMkFmb1FWQTRYdWxoOTZxcGxFdk03UnlzdDEwVVJ3YWdEcytsZ0xmTUJ3TDBLUjNkSlRzQ0RCSXY5UzlaNEdNa2g2OG9SbGovYmgvSSt5RGx5ZXlCdVhtbXNreG9CNzl2S2pPU085MFVKTkV1ZzVyVWlpSldvbHVMeHVKM0piT2MrWEZYeEJ5WGx6KzFxWHZFZEl6c0V6QVl1RVErbDFCQ0FmY0tOZWt3dTNkVys1YzJWRDRhT3p4eHRCQ3dPTUtQZnIyT2lXYTJXd0VXMXJBRXgzaFJtbHhpSndwTlJ2U0JZTHdIYlZkNWpYeEppbk1PT204L0ZNQmdrUVV0NFNTaGV2a0JXTCtMVFVmZERtZGw1dlpxcE4xcVZ3TlRaSjdWbWVwRitKREVSNHlXYk5jT3gyaFVpMVUzaUhTa05yZ1psZzJIaDhHcTZiL1RiRkIrSllZQTl3N3Fta0pYeHdTcVdya21TYkcvYnJNRmJxU1k2V2xub2JnanpWSGZ2RkN5NHJOUTllVzJmSDh4UDhmYVRsZENjSXhEYnUvMmFMV0R2bnkyYjdNcHNYbWh0SGdGcUIxUXBOM3JhRGovVlhTbkMyZWE3bHlIc1dKVzF2WmxScll0THl3QWIyQjYyRHF6djU5SG9hMlZJZzErOEZqbFdObHFqcFMvSWdwVXptNktOcUgyb1l1SGkvZDFBcTd3eXBNdU54cGdLZ2g5WnZNNFR0aWdtWkt2aVlseW4rWVhtNVBjYURkdVJPU1pzL0h6VDlKSE5icmxQRU1YZ3paalBlSHpVUEg0YnBvTkMyMjNsWW1oRysyckFaYnJXWkJ1SW1HeW5xeC9lZDlPdnNHU1FnTU9idlBnSDJ4VWdVeUw2b1VkTHVJUnVVcFBxUUkzVjlSNXJmVzR1RlJWeDd6Zmtzb2ZKMU4rT3ZFQUg1dlRjaERqQTlOa3AvVDAvZTlwUDJCYVBjK2p2amZUdzdrVU5TbE1RdklZMG9BMDVlOU9WdUk0cnR1ZElVY1NKWFhwQkNmQ2pDeVpIRHdYMm9McWFZQzd4d0EzOXI4bUYxOXZFcHd4WmxNUUdqS0lDbzM2ODNxVkhHTW8rRUE2ZndYcGcxU1doQ2xjdW5qMjJCd1NHdnBBV2pPZFordktqSEkvdEpBUE9QN3J2Z3I0Wk4vWlg1WHR2NUJPc2hWbDRBUHNENTNxMWQwbExtWWl6cXlxMkpyQXBpZEg4enk0MFdrYXBSdnY0TStuRlNIUUxMaWpHVVNQNkRTRnZ5YlJLS2Q4WjFqMCt0eGRmY0NsZGRqTzcrem5LS0VVZkd2UW8wVDJOeHR6OVNyZXQvMmNmS1BlMXlUY2xYWCtUeUlHZklEYm5GYkRlbjM0Q2szRldORTQ3dm5OWUVwMDBWYkNhQUUrYnpINlI1YkZtR0JXSTR0bTBCUDBEK3MrMnB2REprbmRIa2Z3UGhZc0RSOVhSZmNJbWExM3B1eEhUMWFhWlNEdEFIWlFCcDJsNDZGK05TWXZHeFJhQjU1VUFYdlZqc1JZUkpuSEJEaXZsblliYzBnWVdEd1FOcG1oTmI5MlRIdVQzUnloSFR2a255d0N1WStTUGIyNTNvRmRYL1RYNldzMzJSSzhFaVZ1YXI5ZmdJQ0FnSUNBZ0lEemZiOVlKL0Q2TkRGOGhQOC83a3UrMzdITDg2M2Z0K3pKL2I5V0JyNmk3OXYxMGY3ZnNKdjIzRHovQjlWcmZiOUlYajg1ZSt6N1hxKzM3RzM4N0x2dCt6a3Z0K3RoMGZJdy9oOWNSZmI5aUgrMjcrSDl2MDhYN2Zmd3lmQ24rejdGajl2MWQzNTFYKzM2MDYrbjlORnI1MVg3ZnFNYjZ2cXBQMVdPeURZejlFbzFKRElOQ0pVOXdLS3FGUlZxQlN4NWVkdEJoYzhMZTV3ajNhOSsvR2xOR3VIdWFFVGkyeEh5MHdmdUF4NVE5N2tBdHFKRU5Dd0ZQb3ZLWTZWUS9ibnN2RjFvdzVsRUg0QWlSeTc4bGsvdmJGWFRjT1J4WVVHbXBIejhnbDR6OTNGTXdLaEx3UFZ3WndhOFpyVlU5dk5WQ0lEcjRRSDB2YjZNamRvb0IrWUY1djBkOE5qbWtCaU1rV0dZR3ZSaUZtRGZEeENNOWV0NURjeWgxWnM2V0NjNDNRRUxMeFNxRExRUGgzcHUrQWxYOUFlYnVDbjZld3BBOGJma2Npek53d3Y4Ui9tTGFrbUwyd3JVelRBbU9aQ242TU4ySDc5MnM5eDlXMk1yUUlkSFJOUnpYVk5yTHl5bmtDZXZVZkVuckI2S1RZd0hCa003U2JUMmREdGY3K3NhVjlSMkh3OHZuUDhzL3RvSkJFaEVmYkFkSzVBTWJMUnB6NzM1bzhDQVpaUzROU3h0b09zWUZFQnFoZ2RpTTVmdk9JTTdQMTQ0bEpxRGtQd0RxYWlBUmlITmJVR3J5K21qVi9mYnZCU05CL2RscUpGbXUrRDltR2Y3L3Z2dFpmam5UaDkwY0I5MzhKelhNcjMyS0RhS29XRjZacUl1RzBPVzBkcy9xZDhKWDh0SDlCQ3VPa1BPN0RwRDFlU1cxaFovVmlITjNQQ3pJMGROTGRLVzc3ckl5c1BsK08xNWl6V0JIRXlaL2t5d2pVWUV3WVhnc2dDMDVCNTQ2MHpLUVh2dUZ1aExzSVd6Rmd5bldiVHE5VWJPWWU3QjlxVy9IVzYyZGc4RFZ1ODRsaFZ1c25SVXlWMVlsRGU4SVJIZGxSenBTdGRMN0tZdjV5dk8zamNMdEhhK0NzSDJHUkg3Mk9EaEgzbHA1Qm5qaHFYbk5jb09ZU2Z3N3Bsa0lMT2dmeHYwN3RuOVEzdGVGWURYb3crRUZvd3NqbnBGYmdSSnpFQmdnVlF6dlA3R2F1QUxBcVBSOGdjKzhVYXJYejMyL2t0YllGbjlWUEJhenlvaUpjeHQ2NEZUbTUwL3N3NkZ2OXJqQkYvVFdNcDUxaEkvL2tUbWJmRndLcVZHV1hENzdtbFVSWU9TN1N6R2MxQTB0OTJzc1VhRGptdThlQVRXZEhPcCs1Y2tmWXdWOWJEV01UVjlnWHQvN2d6THlqRDkrdS9HUElIWVdhVVBSRlBYc1p2UW41WmJjd2cwbEdwVE5YS0pKMkRLcGJneWFsZWRGUXhxRHVtbml2eUw5akgvRGlBZnpZRXdqVThyN1JkeDJleEdVYnllZ2JPaVg4T2diUUlUV2FCbTNNbjcwQTVzSy9wNzZ0MEF4bDJwb1A2dDY5a3htSkRmb2Y4azM3ZnJUbTRoS1JwZ1NCaGx2TkRLTVlOWmFUZzdmOGlKYnVxaWNQcHRMaWRGQUo3cC9qTm5abVBsL3JLUU0wL2hFTTFrbTFQWVRvWUtyc3Q0OVNDYWc3K1dzckMwd1I1TEg0WEk0TVh1YUw2cXBuRUNuQU83MTBNUzVoWEdkeG4rNDB4VmV4MUVhOVNNc3NONXFIY240MG54aDdoaTJHbFYrVG82dUdKaUkyTnh6R1Q3VWpUY3JuWllxOVNjS1ZiNWcreEdJazhNU0daSGZSeTQvVlowZGI1YXZPaGROM2F4dnNyNXJmZ0U1TnJDVVE4WUFqUDJGYU92SFFTQmZIaVN4M29wMWZPT1g4UEpjSDlaZFFoT3BjeFF2V2ZzV3V0SThrTEl3RWx0UzViaDNJN1Y0alBJYVM5Uk5qb0o4bVBGWWtpdGIzMEhYeGN2OUVjZ0NaVXBkdXdORzFzOW1qbnJyL3F1UHp2ZGxYWkZTZHJRdmQ3SFZtTG5VbUVsR0RrVk1FWjBBSmwxZlR3ZENqaTIyUW16Y0l4T3AzQzhBaVhOOTdkR2JzclBYWWY0cW1BUU9melJ3dllqT1lKN0FGcmIxY2FiNE16cEd6VlIvUzgvM3J3TkRjZFZrUWszcDJGWEpDWUZEcEJxUXBoVGJ3TWt0NzRuUkxoL2hUSHJuOFZxN3lRUEdLYlZoOEROZi9xdjRpQ29yenNXS2JQT2d4bTFpRDIvTFlvTVl5dDdIc3RSREwvOWlpT1FzbjJrSkFvbU9OWXhIYjZ3VkF6N09CVmw2UzRZUUZTVC9rT24zcnl1QUdkT2lJakhoS2ExMkR4YlRHQ3I4TVdaRW5MdklyVndOeFkzbC9ybFJGam4vblVPdkoyRU5sTFprYzU1OHVEM2gvYXc2L2x4YnYxTUhkOEVLQ0pZS0J4Q2R5TTBoSks4dnF6SC9OdlFKMnVkem5NSW1saWNILzZFb01NeklxTGNZMUZuSm9CY3hKc0d5d3JMeW1BblN4OGI3UEVzYVVBdXdXa0hsdVV1aTdVRFIwK05RMnk1NGdoS1lYRHA1TXFYQ1BYUGVLblRqK2NjMldiNW1zdVM5RHdkOTJ4b3F5bi9KYW02NEsrT3NXY2RPbU1TWWhNSjNXUlpSdnFtcFFHcFhVMy9NbVg5cFcxcmVzY1lObFJuTGNsaTZWNjlXeUZKVy83Zkh0SU9sYmZGY3BHMW5sUE5kZkdYZnkrSS9mNFppSHBmOGFBdXdKbXVYVXdFRDR6ZXZKMlNZVitucnZpS3RDTE44MzY3cEFQd093VkE2MmFsVjdHWDFjNFI0WHBjbUNydlhlM3N2VGg5L0FNcVdwUGdpMVpUbzlyZ2RmYnFOeVZkWWs0UzUraVNYbkxPZjNjUGFwVTkrNHBQdjBrekIrcHdDTkpKekErMUorZDd3NWt2d2szY3dSbHh1YXlpK3oyWlF5QUt3RUZ2T3prZllreVo1OXFOTFdyMEw5RmZoVmxQNnFDOGM5WHY5OU14N0k4SDB0Mkh5TDJJdU5KYUNaaWQvUk0vbmZpVGhpaCs0ZnFQbnBXcElDYk5VK2dMa1Q0R1lFK3oyc2hGMFBQa2JuOW1RTndqNk1TTkhkcEkyWkhOOTNhcE9JdEZuMTVYdzk0ZlMzeGpkNTY0bFZvZkpIOFJKMzVjOW5RK01aS3Y2K2VSR2pvUmo2NGc1TVRrUEpoNHFPL2RMZjFIdzVSYmRIQUh6MU9TQXRialdaOHJYaXdmT1UxU1c0RnROTHlyVjd4N29tZytwd3R6b2d6S0hnZFplTVI1anpHcTEvQ3JTQ3hDVFJaa1F5TU5MeHAwU0VSdnBCd2FUbldVTEJPeVltSW85dFZKNG5KUlFFUkFPelNGMTdGWTBHUVVLVDZacllvNFJSdzhqYk9KWklpV3AyZVl0VGxoRjZaczU0WTVONmhMM05FbmNTTFJNcTlOa2lBK1pQRHJqL05qL25ESVZLNm9kNzVwYThNTjYyNFl3UzI2Zjk3NHhBUU1BWWpTbkowUFNGMDJTMmpyU1dlYzAyWUN4aGJkV0tVRkp5b3Jzd1VlT2lRc0MxQUpqQ240SHVnQUYxbDhEQ0VHWDE4OHo4a2JGTWYvZ3B0RVo1TTRnbkZrR2xoTkhUQ0JhNGlSQlZ0WjhQek4veGVEcEtBSHcyWXFGaEdSM3IvczdocGwxaHllSnlYQkpmb0lTWE1JNGpFNVFNcE5xR3pQZ3dBaHcyMFJwSHk4OUxtZE9SODlXbGNQRmRPZEwreFgwc0NhS3duanBUREJWZTdzOXd0cHRJNStaTjlRVHdaNW9zVjhmdHArMURMR0dQK0dYT2dpMkRUUFdCSVpLbC9mNi9FUEprZVNyOTdyNUUyeEpFeXNGNUhtWjJlMGIxRXRUM1hTWVlxZ29LNVhFY1F2OHlvajBrZzZOckRxMWt2ZHBOL05MQS9WVGdadjB1L2dSbmJLcXA5dHZjcUJDcVJPYU5xMkxDaUIvS2ZLVVJ4ZEE2ZGdBU05ES3c5RTNUVnVIa1pvSjBCeXJVZk5TUXBnalpIcTFSU09jcHplWWlQTVFIbXd0MVJnaU50c2VncGJaUE5wb3FVWmxxdjZvQ2J5VE9VZEpqL21MYnNNZ0Y3Rysxbmsvdys1SzZ5c1c1VXBiWVd5UDEwZldRMkV5YklnUWZpTC8waTFhV2VBV2V3V3Y0VDhUYjNvN2N0MnFtRFFXVDZKVHF1MEVQOFNEcktFMXNEbXV2U2IvRDdUYW9LYXF6eVBLQ1o1bkVqNHN4Tlh0OUtKUnRHT1d6QXNkOWJMTUxRZWF2RTJ1UVk2eGpFQ3ppellzakdodndkMHBXelo2Q1dhYmxxT01VWUxKV2JHbkFrYXQ1dGZoaHYxR3JYQVZNSHROVzNaWjFRenQ0M1hXVG8zR2p6YTFFSXJZVVFNcDBSOWJzTUgwVjIrN2pYOEdjYlZUSXNZL0k4Tnd5NWhlZURLTnFaNTQvbkpDaDFwYkIvVUkvR01ycmVTS3pnUG15MnBsWkJTUjgrL24wOE0zK3AvdEp0eDBqUUVvU0xDanordTkyTGEvUDh4MW5ERGZpb2c2OFVqZnNQYXVOaGh1a0FGNTM5eE1WVk9IVDNMTEhWNUs0bzFySW5xMTM3c0tNN3ZDZ2NRdmY5bjNydVZPSm9NNjIwRUhNWkxEdUlKQ0RCc1IrYTZXd0NzVWN3MjJTdnlUMExWZlV6bmFLb0tIbmZXbTVjTjArUC9FY3JwYkZ2Z2NWb3RKQ1R4cDlsc0ovVkVUZFZOWFhYcHZuYTlraTJEUFNaTHVHN04zcE9uOTA4V1pKcWhTaGQzSS9NQUVTenF1YmJUZi9CTStCRjNNTjVzazM4UHVHSDF6SFdTbWkyZjNwOWNBY0w2cDRNK1NhYU5yeUpkdm9oWm9ZK2JpczdDbWJuYjV5aXIxR2JxRjBPelFaQ0NGYUIxdEtveHRDKzRxVTU2NFJ6YU84QTdIMVhuaGl5VUtwOGhUTUY2UlRpQ0diN0lUVTY3b2lCcDBJZGxJeVZQTi9heEV0VmV3dDZ0QTE0Q0tBejl4TVc2emZ6MTJvYXR4RWVPUGZRbitHZU9acGlrRHI0TVVKOHZUeDk5UC9nMHVibEp4aWZMZkM2NENmMCtOY3AzWmNlNTB5QzE3UG1jaG01c2dsNUFBb2lUZTJFeHppdE80cTZFQWEwWXpPUkxyaWZkQS9xMzNWVGp5WWkvVStXdFNDZGt3Ym1XR0NZMTA4TDhyQ1ZaVTlZTmdYbzN5MkxtL1VIbkZIVlI1QXVpQ1V2MVdWbmMyalNoNVpxV0hldlFwTGlBSXNqaTJwTVhmZnExWFZqWXNLY1VQUHFPRFk3YVJteHFuRkZWUjM5M1pvSi9jbmdYWm9oa1ZxZUhkRW5yN3F4THV2N3FGaU5aYXh3YjBzMkpXSlU2YXRzYlpRQmlrYUprS1pqSzR6Um9xUzY3dTE1Wnp1TEpNYmNOamZsNDIvdk4wVklQNlBQVUJzTzA2TlRKTVNPMzQ2MjN3M3ZHSlVONzluK2pRUTM0N3k3NVgvcXNpSWtWQnRVbEp4czF3RnprM0ZOMVdMaXlhUlplN0JrL0hValhpdHhPWGE4QzRjTUUzMlpNUk5XZEhrMFNmR0JXUElrZmlDS0lka2ZVRmJwemNrU2xSMUhtUUl2L0N5cFdBSEFjT3ppMWVCQXBvVGdGQ0pRZzAyZ2cwRlZScU9RekN5U3BxSmdLcEVBSHBOdnVEc2hGcVNWY3I0RkRzdjlyL3Zob2NIMExFbVlnSWlzYm4vT3NOZktGQUFDZ2NtYlRwZCtobDdFdlVta1VpSTBDcGRkY0xQZjlEdEl5ZE5CRjg2UlVILzBmSkJmMUE3UUhOVDJZUDI4dmtpckxDNi9oK0hlS1U5WXgxckU4WVhGRUYrbGFjbFFIVTBVUXR2d01XOVJEZUxkT1BaTVlmaDlPRHk0eG5DdkdicjY1bjN1VE1IeEZycThhSWNMeDNvdXl5aGwzTFpJSGRHNk8xRTR6amxra0FzT1NBKzdNUGhyN3ZVV1VhYkpLRlZqZXJZT05DUUREK1NWNjNOa1FUOWV4S1M2STdOWEFWYkVBSDNnUHRWTExFRFRPZHllNnRyekdBbFdIM05wRjZnTDRySm1sUWpmWmxXTGZLeThReURBRHBmOFppT1k5WjBnTDF4N1NZSDkxcUFPZ1ZuQysvT3YrMWNNQmF4dFRHbzFmVDFuVzJaYWdHdEJoTE9HVmlSMkJmdWw3cmJNNzdwNkE3MlZOZHBSeW1yYVA5aDJHUHhSRVlyTHVtcmVBeEo5QlVoMjNNcjNKMGFWQk9EZUpSY1UxYXQ4NldyS0RMeVFSWjdaZ3hMTDNwMW5zTE9vWXZDemRvQmhHbFJiWHdKUVZDUHlxTVhxK0hhOCtSVUw2WWJEdFVwQmJERHdVcUVZSTFrcy9kZFY5MTBBN29GRktKdXZZM0JLWEVBLzFRV2ljR0grQjJKZjhoS2NDTm5mVDJ6OExDZkgxRHZFZzdqNFlKV29LV00vakZqUHdWeDRUMHQzaEdPYXhBcXpLL2M0MlF2bURXVlVRTHA1WTBZY2drWWc1TFg1cDV4R1lkbGlXM21KL3UyUDVxbys4aTlpa0xMSmsycGdieFRMMEF1d25XRE1rKzZLWlowb0xXNlZzdld1RWlmYnJLaFcvRm5BRmlYSXl6djk2bkU5cXlxelZvUkl3SDgxREFEaG85MXNwRnVuQzFrMzludHdidTM3NkgxUzZWampXcEdid3RYMllFTkp6ZEJNRno1VXZEUGFsajBzZDhVMWxSNzRDL3VMeEdkY1F0NEs5RlQ1TGxnZ2ZuaVg2V0tnMG5QTER2UzhRMFdnTnRzRHZRdFMrS2lEMjI2UTg4TmZETHk1aHhNeDRwSWZWd252bjVoVjZDS1AzYkN6YXBRLzE1R0pPRXBCR3MvdWF0dzZXTDcyamJhaFQ4dFhocTJvK29yMWdTZnpFdlRyODIxaTBNdDBUYXBuRlpxM0l0YURTUUxEMC8yMlRkbVNUcm1QVkRRK3lyMnBLZkxLRFFZd2lidDE3eFBPZ29aR0V6N29jTTVZZGQ5Q0hwZ0h3SDM5UnQ4NnU1bm96OTEyWDdhaGt5VGM2bUVBVzIxUGVLcWtVNTlIVmVBMHNYM0ZFQmJoSnlJd0oySkpmUUs1aDQycFVuUzhNaVBFSk9yUUJLbnZ5OEhhRjRDaGpXOUlXRXpORDI4RHJEUmR2eHN4YmNUc1lCSnNVbXpmVmY2eC9uWWhIUGZiVlFJUi9ZcWFPSTVLaG1UM0cwUmFpSllxek8vOEs3S21MVVBlWFZJLytVUDdPUGVhNk9YajNNdXQvR1JreUZkM0Y5TzBBTDc3SHl5SWJpWW9nZENvd2lIdm1pYmRKWVhUZWFXZ0F0SDVZZ29wQzZHYklMTGovVE5UVnNDbjhvandoS0o0SnBGVDJyN0VNTmI1N1FReWhNS1VZK29Oa2Zuc0FxRURFN1NFdEsvcXljenZYK1p5aGtPelJ6ZUtXMHk1YVB6MDE2UjMwVTB1WXl3V292QkZ6SzE2Sk5NcU1HVzdEbXF6a0V2ME9hNS9wU3BJZzhRTUFYeDZscC9pd0Z2Mm9HVEUySmk4V2VEQTRLTzNvL0FOd0V4Nm04dG9lTGVONmFnSHEvZXV5a2tZeVI4b3UwclJXZjhpb00wZXU2MFUxcU02U2t3aFBUcll4VjNESisrWWY5TXIraDdaWmV1alRNWU1oYXl2bFNRSU9aMkJFU2JDTWtvMUM0a0FXZjdZRElRRzBvUE9MTXRjU1NsYkZLUlVQYzYva2t0ZjJheStyRGVkZE9ZbnBCanQrczBjMjlLNDZERXozVlFCRk1TektaaHBEalV4MTdZVFN0MExSNk1UcnlCUzkyMXVFc0hYeFc0YmYvVzhrQjZmUkYvcThTc2psZ2NLWE5tQzQyNHhnRjVPMUVxL0J6aG5EZFdHOTd6R0VRVDh0T3VoTHMrWEN0Q0lJV05Jd1VPeWtzdk4yOXRlaVpsVjVrZCtDR3BUTzFhM2FydHVCamluQWlEeFgxaVEwbDB0dE0vV2J1aFdHc2RrQ3FMZGxkamt6SVJVL3c2cndHdGNEblYwQy9DNTQvTFdyekYwQTNRTXFNYzBuR1kwVWQzQlA3REdRakY2T1hXeFZWREF5YU1HRFdrRTNNcXNZWHZZd1NHVDRWMmhXOHQ2aVR0UFU5OXlEdEdvOXVYd0dXVmpUazg3SkVuaDFDNGJkZ2JVTUxtd2VGQjJobGRvNTFFSU5zK3Nia25GTHFOMW9RcFJsSk52VlNJTzdIWm1GWEdXdVZTelpMQTNXUDIyWWhlVTNDMGlsaUozUE5oaWN6dndFTWNUKzRzUmhNQzc2c0VzL1RZSDVWcFVwRVVpUnZmWWZraWFaWGp0d2dYV3F6VDZtYnIxNFJ6UEd1RTdTc2svazJyTUNkaGozRGxBNDFaM2pCMFF0M1lyTlZJdWgwN2g0NHZvWDNUWG9Tb1NjWEZYTXhqRFZwMnFmZmxzR2Jib3Y2WXNldnZWY25BcnhYQTFqcHdMZzMxeGtXbmhMT0xKejlsR1M2WUpzaGx5SHhSOTNINlNWRDFiYng1TGlOZDVwMnppL2diWmN5bFhKcitOM1Y5UU8xU0krVjkvaFJHUWczZFl2a0ZCU1gzR1dha0YxTGViRzFvMXRra05nemhIQTU0SVNmWU9LeVhGTkFLcldxZXFEWjNSem91ZnJjK1FQbXh5NGwyMzBaemhoM3Vnd3dxVThueXowMlJVdW9wVjkzYzlxWXlIZU1DeGUyaWlVdWozaHUyd2I5cW9icnRkSUZzUm01aXBSc2RZS0d3d1htZUg3KzZPSEJ4V3FKVHFDR3lyOXQ4VWNURXNmOW5pdGs2eUtiY242aUpqWldyTnlzYktrRkFCM3FObWFiY0ZXb05sTEV3WUxFUm5Hd0oxMk1PaG5VbjVYTjlBODBEU2MzTlZNWjRKbkhFTkgyR0owZE1JVVpDQng3aGhLUjlUS1ljaDAvc1NPUGJsNHYyd1kxajJrUG1xOXRoMmVNNUxYZzVzaE0zWmkzQWJZY3UycHd4NHlwZ1daYyttNXgzNmlBUlhDcnczbWo3aHNMTDJub3ZjcWJZS1pjaG12S1dsd1dZN3JIMHUrWURMb2JPYkZFLzBqTGVXbythMitzTWVrNDFBcVZXT0I1MHhqelJsVG9SMFh0YnJMMHp1SHhYelNwc0FWb0tNeEpJVHM1MDY1Q3JJUERIeW4rRG5zM1NkN2tKUGRJL2dmV1NmMWFEZUVGUm1WUVhCRDNYQ3VFQ3Y0Ny9WQ3MzZUhxeE1ob3Q0QUhlTUpTTVFUOHNxRmprb3J3bEczY21aU1FVYnhCazJJUVFHWHpNSkxjNHMvRWJ5TlZLWFBCb2VEVERnbjFlVVVKVEE1T3E4K2NoZjBqZExuTHh4SGRtSTRJa3lQUDVwQ1UzN2htUk5reG0zNHJ0K1BZdExFMCtScHhiamxtM1FQQndNa1k4NHJzWVhWZGdISFR5QVh4cm1aWHhiN0JERXF3S1pCOVBLQld1MWlqZExDa3ZwNWozSHFOelRjMmd5Q01uV1ZSOUc1ZlNXNEJtdjNuSG1TYmdEZFgwS3Zlc0hIRlVveWJUTys5NTdOZEJwakJvem5DUUJKOUxLeFp0ak9rMUpJTGNtMkxXUE4vYlpqUzRCYjdpSVgveExHOWtIaWlpcEtQRWY0Nzd0YW1FdVVpblpNeGZGV013SjExeDBRMzBUUVcvZEZlU2Q4cmpmRWFQYytldTRZSFRwcUlwMmMzSG9HT29YT1NlYWQzc1c1K2oySXNjYXNhSXJhaGN5TjBHbjBDUzVHK1NsdjFKN1hpVkNmcE1jcUd1ZXExS252b0lSYWgzNlIxdmxpVDRDdjNNSDI3SXFqZi9MRDU5b1JBRGxGZ1dRM21tSlEzVGtvcktPaEROZUh3V0hiQTR4VkVaRThWT2p4OXI3YXJ0czluc3lIZEdlWTlQa3Z5bExHVjV2Y2Z4TEkyMDZnT1hCTGs5em9pUGRwQ0c5aHIrQ1NLeDl2ZE5FbGxIR05GNVRGUlZTL1JBQzIvMDVuaUdUM0FZN1JCRUw5Mzk1Y1lWaGtXckZyRVVwazRkdWNoanNjZE1KU2FvUjhvNmMxWHNUaVV0NGNodmRrdlYyWGlteTNlSzhQL0wyOFJycCs3NnphekdTQmRiZzRBUmlIQUpyVVpCNkNTWVJYQllOMVMvRTJneFVLSlJkSzJTTUE4N1VBc1FaSnEwd0VpRThzeGlnaWtzNSt3QjZLUlRBYnZjTktIQllCWSt3UTJmYkI5dmtsMXZYNHBEamFpRkVGQUlBSngreGsyNUx3N1I3cjNyWHJZR0lXZGluYitVSnNlMFZ2b3AxazJhd0NtbXFsa25RUWpUMUxmS0VsZURwenZsRDZteDFBaHp6NStMa1VHb3BBb2h1WTJOcUVTbitEdTFQWHJ4VDEvWXVMb2ZmN2hLdExuZmhEZ2hjQ0RhOGE3RktUUmhrVXhxZFBuS28vMXRzRm9EUWJIclJtMS9ya2d3cnk2ekFZaVdqZmdCRnRFaXVsL3hKbjA1SDBPWC9yN0NGTXZ0bFg0ZGYzdFNnM2xLazRlY09RVzI0RDRhVTRFa090NXBPTDFXaDcwQU5JZVA0ZnpvOWhFK0RkYVpYVG9MZEhQSVdCY1VNSVJOQU9HbzdIN2FEUzJGNjh2NVNBdk8vcEY1ZGNPdytoQTVzL3RJdS9IQm9Wb0JlWERzNGxjQ1VucVgrY2NlTGpOdUkrS3VXLzJXYUEyZ0pzZEtpRnNqVHN4K0kxMEE5ZFJ4ekwwaCtCSGFxY3lMZjdFUkdTNFJvTVM1cEJyeW15TEFZWXVkKytOUDAxTytHZUxFVXFiSmcvd25OYnVROEJrVERDc01tNllYVzluYnIzSEV3eHc3NjcvMXpTK3M2RUZVYVVnWGJwM2RTTVRpOTVqRS9GSDd3SC9RMXp3cTlyeWRMN21Ed01LUE9SSjF3c1Bwa09TK2FJWHB1OU1VcERsSUY5UmVxekRuazk3N05YUXphdUNKV05QQ3FtbXYzZTRlTnBjTlM0dmtOUkhoM2VGN3pReHlXRE1xM0JmaFo1WEVjeDMwRjVmKzFCKzh2SVN4MFkxWFRGSEZwbXFqYXo0dlgrTisrZHAzY3BWdkFQMi9RdHBtaWhHTGtWK1JaTXZQeFBkbktORkJqWHlxSnJtV0xyN1Qwd09kS1l3bEtTVTVlbUNRcWdTSmVRSW41UTh6T3hCWFJhanhYZTdlOUxEUTVlOGpqUGl2S1AzV1NYRVNlNXlSNDZNT0o2bWZGdmI2NktSZEU1T3pjcmZUOWZLWXhLOWZWdzhhMkFXUklFK2I1WnZ4QlpIRVlVS3owdWlTdndFTHVicDE1L0NyRzZtZlJEek1NZUx6ZDhxNVZpWmFlTXNCRmNUTzdUMmg5OTI0TXZPdng4anVOZWJVNjZEeVhnUzdmWkY0UDg2cEVaY2VWRGt6YXhURmJmRjQ0TmhSQWhWdytSaG1KMUErejEwSGxpN09vS0RweWNaWVY4M0hDNDBuVUZPZGFJcHBtRTJxM2NobkEweHVjY1pCd0hxQkQvV2I1ZlR1N005SWtvMTRtajhvZDVSUmE2Q2o1TWxRSXR2K0poVlZxRHFORGo4b3JRM1lVYjVTUzhIMWgvRStwM3kxY0I1TGhIQjRSL2Y1TDR3UDMydUtzVW1uUVRnb0J2ZysrSTRqV3NPdWx5dnhjRjFuRDNaSWUzbTM2c1ZMMnZNS2JOL2J5WEo0TmdZZGJwdjZYVmxYbDE4VmdLdUVVa2tuRUFkbWROOUNQUzlOMjBlU09mS0N6NkpIN3JVa0pya1JjdEZ2aWpReGtoejdkNHpWV1hwTVlrTEllM3hsK2Y3emtKbGJqczBPVE1iR0JJdllMdkg1eUlKczhscEJpWEtkb2VHZmRBQVJ4SVNtWFRwbXFXYm5GT2RBd1ZSQ0U0TDFhNFFWZk1ERElXVjhXK1AzMi9rSkJhWVNvNXl1WXBEOUExMnpsV25UL1lzanBDSVJ6bTZFWUd5Smo3WWVJTThpQm1YMmJqZFBmeVlnRFFsOWhtVWFjM0VQeGp2WlQ3VFRFRHJWWloyZ3pkaWwvVDVzbkJjY2tiQktCRWIzYWdkdzI5TGwvVVdaMEN4WmRMWlNaNnRMall6WERZeWczOEM3T2d5MHhtVElKTlp0ak8xTmQ2UWJMSnF2dUhkaUFGem03L1FiaG5oUUJrTnJnRXZRTVVkYnNvKzlaakpKSTUxQUh4cUk3UGhQN3BMZE1QeHFOaHpwdEZOZmx1RW1rcEFaL2FINGFLTjBzeUEvOEI3Z2FwOUtzZ3llVzJnNHFMUThmQmRyU0ZzVUxOdXJJdmNoSWtkTnZuMHFlZGJNb0JuaTlxRXdjT053dzYrV3BOd0NhQUhOR09nSkRINkxmZWlpcW5zdjVGQXZzbWRUU29uWSt0TWtHNEo2M2JaVXoxSEE2Q1BOSDFrUEhHNXN2elBoRnZIN0NJS1ZydW9ZakVUTFZuWDJkRU4yVzBkUGIvZm0wcEtSQk5hTS9tN2IzRUpVRVJkMTBWMm5MS3NGeWZUME9WWlNPNDlSNzltRVRWaEVUalJ6Y1FkSVdSdVRtTmk0TmpOYjV2QmhkZTJmWXNMb0V2OXhrTjFsTDNsY1FaR2hFOWN4d0VDc2MzNU1SeEhuWDU2a2ZiR2ZoTHlCQWJrL1JaSW9QSHFmTU5Ya1dENXJPSHN0V1RxM2NZUm9yeUZaL2FEbFhVcjJJeHA4aEJYSGRXdUZ5NzQ1NjV1K0YvRGxzaVpxTmR5NE81SnpEZFdJdGY3VDZCNGFzaXZ2OHllR2lQdGpuYnY5dVVlMUUyTDRjY0Z0VTF0dmRyeE1MSkVaOFhKNmlVV0hDYnhmUXc5dDNTS1dIb1diV1l1bGZWQ0NKeUhhSGplSGR4QWdkUC9GZm42OW5BbThZRFp4K3JQWWVrU3VPZWxJMTVWWFJ3NWhvQ0kyb2VpYjhiQjlwWDZYL1BqOWRKTWJudldTTGtRdDhEREdwaHhrcyt3YjNOeG8yT3NHTVJ1Tjc3QThHMm52K0FNVnU2ODlTMy9FdTRDbmUzN0d2WWN6WDE3VmEzdndxSlRJcWNzdzZYVGtRZnp0Sms5ZnpjRy9DZE1id2tXdmVESTI5c2tJelByVFFDVmQ3T2RGbm0zYkxYd20vSnNscCt1Tkp4b09NQjJhak4zQVJhNHQvYW1aeXk1RytNL1o0a0FCSE1XSmQ5T1ZHLy95bStQWWxFbTN6Q0FyaGovZHgzeEpoMXlRck5WUTErY0dCbzh4WkVKQTlRSkZraERwOXFXMmwyNnBDMDBrc0t2bnVpd3BOTmdnVjVxNzBtREp4MmltMUFXUGVrU1ZNci90MHNsdmxHQTN3Z2o1b1JWS0NIeHNySTFmcWtKd0lmczhJUy9tUFM5NHNVcTRmNURoSWZBRVR3cDhqb2JLRm9rRkJNUXhjZndwVzh4c1VzM1M3ZStkMHJVV1oyQ3h5aHlkeVo0MU9IVGJjcHIvMEx3L0ZXRUZKTG5zQVduUFcrMXFCT0tUaEt0SFhXNzZGYXZnYnJQcTM1WUtrUjVyRm5lcG4zN0NqZStnb1NBcVdOMmh5aElNNVNqb2tSblRXTVJYN1hFc2FtbE5UU1laTEJ0THlBYnpBVFd0WExicFB4NVJFZEc2amxOSk1tZE5DRFJTR0tvMVVCdjY5V2pzdEVPUktKMWZGWVhSaVlNM1NwZWxzN3JROHRDdEsxQ2FTblhxQzR5SG8zeTZJNm1wZW84QjJXcGtRNVpmcVR1YmdnYmg4WVdRcmp6eG4rUGoyRkRDNVFIa2tGbHc2ZGVzZk5xZGZ5VEJ0R0VFTlkyWTUvZjFPMXk1T0wyWU9QWFpNU24zTExBc2lObTR6RU1oR1MzOEp0aUhKZ25vNW1TeUhtNEJJa29oMU9vREF3ZlVMTktsZFd2cnJlMjc4ZmREM2U0R3lHWlRycXBFblFreEEzSmFqNWVrR2wwWGlmVVdCRnVsNFFJY2p3YlpIM1g5ZlJqdHFKYVFpNmJCTHhBUXRVa2l4M21waDBsSEZxTXhlN0xaNlZZd0hFTDFIaVhGOFJQdEY5SXZ3dlNmWnJ4NFpDQkZENXRMV1Q0WWh0ZGhNc3pjSzVWZXVkSjN3RldrMnd2MktNdHFVaEE3N0VOcGtiRWhnWUt5SXVWTDRadlR6N2lCSVBoRGdwVzIwYUlSVGpDc0ROSWlacDB0VWc2QVVqUkVYMUdZNU0zVlFaNUhTUnV2ZDJzL0pPSmZ3bjdmSW05VXZMV2hNR2RBWWFsbUxBSWd4cW03My9IY1piV0NacS9kN0YxdGk3WmVxenNya2tWK3JnajV2Mm5MODc3UE5RVVp3bTN4dDhKMW1pWWlxSEpJVzRRdE5JcTA0TVdPOUZWOWZyNEhFMFF6ZTd2U0NiajdZNHozb3ZqNHBabkQyUlVFY2FpWU55ZXhZUXcyd0taMG54c2t5OTNZNTlZTElERWJDV2R6eXFjcVdaVjRic0luV1pjU1RuTTEra2tUb1dCYk1ndzNoU2kvbHFYeVpVQktkb1cyMkdTSjFCNWo1QU5SdGkya0pNNlliVWxBbU9wdkdoTXNNT0VwUitLcWhEWWpPQzhUV01tOS9PT1VEYnZidzBmTDdGRHN1NzRTVzhlYXFad0QxMHJKZnV3Y0JmWEd6WUZOUUZaY0hmYnFoeDM0enltM3ZKYVRTdTFuZEc3dVRYMHdUNXVBTWtXRDN3Zlhsb0FROXo4anpWa1ZiaFVGS1BXc3NnWGVyQndUNDRjMUlmWmQ2N2h2N0g1ckYwaTNSU0RkcENMRldPSHZTOStuQTIzalQ2c0dBMkFnTTFJQVd3NkVzWXlEbVladHpuOXJXK3l3aXViMW53bFB5RlA1M3Z5SjhsSXdFdS8wSWcxb1BFeGdxblU1OUwzTEpOSmRoNnl2TGF3NU5UU3NQN0dVeFJPMkc5ejhOZlJEdlB2VXM2clRSVisrNDVpK1l4aUlHWUpVOGNpeEl4ZVF3SjBOQ1J3cGEveXAwdytwekcwZ2ZGbnZwRzduY2JwRWJPNi9NOEJsaCt2cjJUSHROek5zMnBBNjBDUTZxaHZoTDBxZTNWS0VmVFpNODNsd2JpWE9mMGptcEpYcU5YNDZ6VFZvRTJGbTdjUEgrdDFqV2ttTDJSWEIzTWtkdWtVeks3Y09na1p6OE1xZVQwSVN3K3RjNno5UHRibzV3VXVYbGJwZ3hxaHFaV0pjNHF6YWI4bmpVRzFDNUNiZ1dWRCtobHNVVlpRaVVEWjlRWHlKbUE5SmlMZzNWMEtuNGY2WVdESGZEWE5EdnlSbVB4UXgvZ21qU2pHc2RNb0VSMFM1OENxS01FTExyandnNHhHTzVGU2Q4ck04ank1RDlpWDJnYWZoOG1yNDVIRGJZc2xHZEY2d3UxMS9oRTJLRDBDbzRmbTdCMis5Q3dtc1daMXg2UlFmT21LYzZzOG5CQ1dxeWRPb2VIRFU0cCtRWERBVDVwTVBVOU1JRFJlVlVxT0JGS2o0WHRpRGJYQ0VGc05rV0NUc0FDbFRjTUQra0crUWkra3h3Mnl3bEplOGVQZ1NpdS8wdVZqaENJUElSNGFwbGR6bDJ1dENJT1BiYjREUUd6NndBZHVQa0FzbC9pSjJmUXlFZ2lFR05CYm5FWk9tZHVDVkppeHNEWlRtZkQ4bnVjTUpkNGg5b3VoaEtBZlFYMks2TCtWVTdsQktCYkE4TjF5dTZ3WlJuZm50VWw0aE9jc0NGOTlCUllWdG9NTjY3dFRUWVg0ZkpNUTFNbVhnbmI4NXB4ZnlwMHRrRGJRQTZDdUc5N0ZlZXkzWWRMRlBhUDFBNzJXWEE5bitVLzQzZnZoaDRXNWlkM29iSUppaFNBMUFvUFA2Wk9Qd3B4RGQzSUhlL2c4ZzUwSWxXOWsyZ3ByTjQ0VCtjREp2bkJENlhQNEx2SEJ3NEhPNlVHcnc5U3R3dmFYdVVmTkdTNk9nemZ1NTRjVVhNazZRQitBKzRrbFBTVS8wQ1dWYmNxWm9xc0FWQ0hOeFlRQ0d5c2tTY3hGRTNUbTNqT3pGWVNueWlZSTBza1oyb1E3bHEvZ3YyV09MZ0VVNzY0dzlCMXR4aDJnSTdhSDQ2Und4S1E2c0pBVzI2aERnZzF4YjRMenNqeENYMXVrdGZDeVVSdmMwTEw4UnE4OG5RZ21FNnc0YzU5Z1V0c1ROWkRQWGZiUHZqdU4zTi9FOTNrbWUzSEp1Rm9GNFRRWmdwNjMzOUdxbTNtdkN1aXdUb2hTM0NBOUxtUW1vS1RKdzVDQ1E4Zit6Tm5pYlRvZmQ4dDhHZGJzNEwxL3kwNHdadTJ6SGNCQWN0dzBYU0lsaU1BOVJiTm82b25ocDllM2gwZEN5NlJQOSt1WFhtYXROck9qN0kvVGZMVldnaG5lcmJYdVN0UjlndU1ReWttUWJnRkF1ZmJhZjFiUVhjWkFEckQxOWpOZFVJMTREWms3MGx1TDVvWkxPajFTQ1NtTEt0S3AzUGM1VThiVXlQNUswNTRaaEFSbjhPQ1ZmQzJsSjBYWHZQS1hESXhZZUlMbzU5SVJ6aXRwMjY0K2lnOE1VN2NqVmFZVWYyN05oRG55SlhpYWNDQzJrSUphYSt4Q2p1dFpUeXRwMGVob2FYbGhpTDFEUHpLWmgzSS90UmZ5aDVtQkw3dzd5NzdReXN4SFlyL0Q5N1o2UlRUQ29EZ0hZR2RVM3dLYmI0VERVcUY1Nis4NzA1eEVGSldxcGNjUzZ3R05yVVJnSHVDanlvVjFXMmtHK2psbGZMZXllZFFsbDM3UmFsQkg0Mzc4VWd3eDZYUmRldTMxa1hsSFQ0VXB5R0ovMjRrVVNHT011S1IyUTNlOUdmOHNySXEwN2lZSEg0VTlZUFh0a0Z5YnkrTi9IQXJXdHpYeFZwc1I2VVc2TW5GNHJSdnJaSTBXbUtjRlBxRUdWaW8yNG9QVitnS1UyY2hTSnAyRUlvdkZXRTUxM2haVTIvaU1vaFlCbEhqRDFnRCtyeDlvbjNYSlUyVnBMYTJmK3pTUjhnbW5VM2xTblFIUElXMWFnVnEyTENPdnlRNlI0TkpGWERoL3hEWWpnVjlsL1BxODczc3NRVXQrOUJSWWtXYmpJYmJuWE5qVTl2eW1TVVZzeVQvRHk2NmVVcjlBRDBTb0RZVkpVVzJLYzJadml5WlhVWm5YV1BHSXNmbnNoK3JYaDUyYnp2M0NFNjlDTkJDSW52T01zQzhjUmZ6eU90M1EyQ2d0Qm93R2d3QmVFYXJwUXRPTWo3SE9qRkMzeXo2Sk1TUHJDaUFwaDlNVXdCWXdrbDNGemx1V3hQaUxyd1ZYUVFmUm9vVWEzWkM1cjZpSXpOWWxlZnN3SkRHaUlNMW01ejJNdmJYRVdieWE2RXRBVi9ET2dKa21ZNk9QbFJsbVZOUENBeFJnRnRFelVoTGQydS8waEM1eGh6WVZ0WFV2ZTNFbU95NE1WOElXR09sRXgwS1luMjY5NmtuUVg4K2ZJV3VUUlZmaVQvQ3RXZDEyUW1USE5Cd0svdzVkdlIrWmV5WjZTWHBRbGlQaTkrRFFJQlM4Ry9iK1YwYVlZZW5tRytQNEhEN2hOZ3lZOEZ0WmZLb3ppeU5CazhjbnJzNDdXNWNBRnhheUZrMlZzcEJwV1lSVSthRWljTWJDNE1hcVNleG9YT2RBd2x4dGZqWVNkTVFxbndZS000L0tlbWFDVHBSWkgyWGdCNFpBOFVLb1d6bE9icEVoQUMySlpldjBRRUxKc2NkWGZSbndBcVNPYW8vSEYzVXNGam1XTlJqa05XemQ2dU9ETGRxTzYxeTJYSTFndVI1QjhoeWNBc3JhWVlBdWkySWdHQUNoaVp2U094NmtLekNNSXhTUXdFb0YvRXYrSEpOMXF3NXdpMzZ3bW1lWVhUeVF2MHduODBzMFdNYlp2K0ZFNnhyTHRUbmpaNHhVMnJGdUlzOS9SRlhFUTZXYWJiZk1Qak9MZ1c3UlFTdDI3WTY3dHJBRHFVREJyM2ZzZnJKa2N6bWZmdVJPcTkxd0JLVXVQTThoc0FNeGZxUVZkN0pNaDlpZGx0VFRtdGlXOGhNMGtyZ1JDdnhPdjN4UW9xa2IvaEF0ekNOdDVnM1ZHdGVqSmNuYlZHeUJjdm1tVEQyV1RKT3F5b1NLQjl5VGl2Y2Q5ck1aOXRsWWhjcWpzOXBrUnFPTUx3L1dLWklUWCtHeTZWVGo5WTVhL1NpUndaSEM5ellVdjBmWWpzZDkvb3FaWlF3T05FeUtzMTc5clUyM3pNZmcrVEtQem9jMlZuNDVOSndyMlFHUUpabm5QbUJIdUFSZjBlTXR0UmNFbkhkT0VpMW9YM3BFdFUrMGhhMmliRW9tSzJyN0h5UnVmY0w0MmRLbURUaDY2cjlwbWs5ME1idEpjVkx3NlI4WHR0cHFhMzl3SCtER3hET28va1hpNTlZQzVMMGdtQ3Bja1FGMUFNV2R0Y0VRZHp0am5tQmhPMUFUc3ZPTVoyNzIyN25OK3VnSFk1ejE0ZnQ3NXoxdFlrdXJJc1FqbXh2VjJIdHpiekVJSmxXdTZOdG9QUUZMRmhtZE5lRDc5UUtaMGE1ekNFcDA0WEMzZ0VPR25XMEQveGpoaFYwV0NiaE95MTNhRlpmampjQ3ZFaWtBbEJGV1oyWE9yM3NNRkZESEZtbEUvbVFNN2k4VTFrb242TThNOTBRMGZYdlEwRE9KejZkTkQ2WXBtWVJ0N0NXUlNWSmFoK1ovaTJvaUN1L21vSTkzZVBxT1c2dzZsUCtBakMvUW15TTA2WFFuZU9QbVFTdFFjOEdxTWJSd21PeUlLSk5NNmZzbnNCd0FjOU0xNlNVTFNWRnR2SzJkdGVTaDVEbmtSaXdKRDlaNjJBMG5WN21kUDNhT1BURkhWQWMwajl6YXJxUkpFRnpKRDdoK1ZmaUs0RCs4cnRkUGNrcHlWbWJiTFQ5YWNuVitHOFdsNXhtNkUwTmtWeTZJTHhhUzRKbUx5ank1TFpZSk42c1dYODF2Z3hnYUZqOHdrZzU2RHRyM0JlaC9IZnpSVGZBczU4eWp4dkVIYWNNTjMvODZ0SWpCMHROZWVadDFxN1krT2xGbFV4bC9NZi9PSHVuL1lMSnQzeUMwNzlZYW5EUnlGWWdsdnVQK3VCQ3Q1OHlPNnU0WldRaDhzcUpFMEhjaUZIdFR1Qzk2anA4TzR0YTR1bU55dUJMamcwTkF3QVpjZ3lqbEVUc0NZemU0Q0JMbTFzdVJObkY5eURFQkNkdXZJdEE2RzZEemI2R2hzZmliZ0x0WXAvemwvcVhtUXJmQUh2NnB4ZzNHOHZtYXFkQ0pSdDRnY1JrVmF5UGpJSmtQS2d3Uzh6enlLQUd4WHNORm1vRUxWd0xjQ3I2YUpIdkVZNTJqaVlvWis4azl6YlVqRGVFQ3o0ZkMvdkhIQXRBeWFMTVlzN0lHbDZqQll0ZDZUbGs3eTdscitwTi93OWRsVE5OdFJmWjc0OUJqd2dBUmd1bk0yN3BZUDlUS0k5VlZWc3dISVRaWTVNc0VLYmNIdGNqSW5PNng0djZETG53Mmh2eGFjRFExRldBUnJUMG9qcjVNR0VvYUt6MFA4SXd4WkdIQzdWZHZZTDBHVnF1c3FLcFdET2E2cUZjaVl2cHNnMVk3VG96YVNmZmYvWVdxK1R2b3ZKRFJXWWMxek1WcHlZbjM5QWZzNTcvS0xWcTVsVHFESVRvKzRoNElKSkhyRWExeUxmaHF2dzNNYWdNaWZoOWU0SVRldnc2OWNxM0Q2UE9MelN0MHU5cmZaL0tjMlRiMjYvZzFOMzhjcFVWUU1aZEhvL1FLalJtZk1ZNC9ucTBNRlQrU0g1VUdzOHpMUHVrT21UaHZnMVZQTHcyWFNFV0dMUVpyT2RIYlZzZWVwcm1VZEtTL3pLS0hOejB5Y3Yxa0dWUzNneEN1a1p2OVRVUlJQS0RXSGpLNGFxYlM5REVUc2w0UFA4bkMrUDZRY2thUENGME1qNld0TnpRdDM1WGIvalRIRVN2ano3c0RHWGY2V01YZExRRUxNdC9Rd2xUOUc1dGZoWjk2SldPK2Judk5OUTFER29LZjZwRllOWGZDRGR5cnIzS2NyQ1pRVWlGK0lWNS9PYi9PSGxMdjBjZmhldG9BeVBtOHlGeklGUFcyQXpkbDE4ZlV6VzVrZCttYUZKWURKSEpTd0ZRZWw3aERpcHlxMjg0YmE3eWw0Nk55NWI5ZDVDOGRmQ1pnYjhxNVgxNUhyWTFOOStvQ2JUdXhEdkJnelo4UU9kNmU5QWpvSExWdHdTUDRmOVExaVNCY3FtWXJJM083S293ekcwK0g1ZXVsSXE3djNuU0hoMWVwYzBVMFVBOWw1b3k1RGFoWDdCYlJZUURtUTY1aC9VUUszUGROTUN0ejI3MytwZGt3bmEwTXgvd3R4OW9hSjFQR29NeEluSGRYR3lCMlVrMytLdjVsMWdaYWY0OWVRc1BENGFIME5WYU11eDd0RmNFcVR2bUFBdExqdERlTVJvdzdJd3RsWUZXSUtENUdvNmdKamF0bWRTRVlwV0oxRHE5ekJoRHNZMTFmVW93Umw4QzZMdm0zeDNCWm53TlBTSUhQUy9Jb2xtdGNnaFU1VmRDZWQ0Wjd5dVFrQ25KcWJCQXVJd01oV1J0L1pNa0JtWDVDVk9naWtiT2FBbWFnZWxscUJVdVp3VzVNQWFyclFqTHRTQWRSVGwxam9zL09iV2VVL0ZwZWQvOWd2Z1pobmlzcWt3YnpsZ1hGY2RBV1lBeCtiS1dvbWo5SEkzUFROZTExYzYvRWp6cU1VWHpPTVlxWHlRZWxWdWRjMzhpeUtOa09wTFZMM1lTcTMrNy9scHgzaTdqVVRYZ1JDWEhjTXM0dk56dFBzSTlzRG5xSWpaS1pIM25hM0tEU084Qm0yUk9JNXZ6aGJnZUlhVDlrZE5ndjdTME5TQTZab2xmcUg5NjF5LzB0L3p4OHZxMGIySHJ2T3JsWXFjajdPRFk0cnNLUVVya1MrUXRXYTJRSmhkcFdlWDA0dWlUWW1OYStJaHU4T1plMkdVL3Vsa0E0eks3enc5MmdKU3kwMjZMSVpvcUpaVWZTVGV5Y3lqelpOMjFtNCtZTnNub3BmNlVCNnc3Rk1xUkxoa0VQdC9zaDFrQ21OK3VnU1psd3dvUmRFMitwVnFOZ0RMdi9lay9GMDg4TGpWQ0xzc3duT1E2U0JPdDU4aHlVakdwbHVlRTNNMUVsZU9CWUU0ZlRxcm5UVnA1aVBGeGxEU3RWMjJtaDJoSVk5RmlSSWxvZFl2M2E3VERqZ2VGYlAxVlZ1dlg5SE1RdkRJNVU4ZWVOUWkzNGlNd1VmOHUvMHdnYVQ3b1pyY3ZIbXVsQ05ybTFkRWVHUXhwVjFPMUhZTko2VGFMN0JpS1BUblBtNW5NekxiV3RBZmVvWm8xRXlhZU5lM1BsY24zb0xlclJlUExWbzFKaDQvVFpYM3hESWhPdjIzQTgwcVpVMDlLTS96K00vNzI4TzdsT3NtR3IwSlF1Ky9zYlBnM1pLcXl5dWlWam5qaE5uWFBDcW0xVUZkbjE2WUF0S252UllxVlFLSk1DdlRPWXFNeWdmVW53TlVzaXN5STJiNGRCUWd1cjZ4WG1HbTRrQ2VodlhqeWlvc2lBUmVVdnZEQ0pkc01UeTVjaytXa24ydVRhcGRsWU1CQVVlRkd6c0ZkejJoSjJiZVEvZzAwZWsrdFRsV2JHM0N5R2VDL1p2RlBXdjkzRGNMbmtSL3pvc0xvb2lkR3EwcmhBd1ZwbThnbTNoZmh6VURFNzRSVzRWa1dsMlUzRyszUU5lMEdySlRFVnlFVEhuRmhJMitRRzF4UDdqOHFkdW5FS1YzcFJGZVZZVnlHNFUwd2w1di9YMUVPbGpLOEtWcVpQQTFIWmkwbWdqYlpJUlFUdHY5OGdhdSs4TGplNisvRi9zcHorTTMzTWdDLzhnK3UrQkxuSmZQUGhSNk9RWkN6bytJSEd1STNURmx6REpMMUpHcmU4SmlTWW9lemczaXhiZFRHSkUrWk03UkJYVkNSd253UmE4LzN1b3dVSnk2RlhBdkxqK0UzYWQ4RWc3ZjJaeXd3RG9VbkJ6UExhNUVOMHEvemtLdjRwUVoremhtZG9TSTlTQTFNdVNaL0J1eHpmcWhaL3Y2TjlkelptdzMzRHczVWgxd08zNC9aNWs2WHE1NWNibEZWVFlNdm1xQWYyU0hpNXFmZDdGZmtEczY0RWFJQmU5TlduOU1aZGY3RmdLY3lRYzNKSGtuRnFEUjd6QlRPMnBIbFRzMzJ5WFQyOUZiZWFQWjJSRGovRUNTZXdwTmJUYWVuQUhyMS93dWRVSzFKM1lDMXZxVzY4ZE54cU4weDEzZmthVXE3THkvUVRLRkZoa1g2cm5VSzdEOTBQa2xwYmZFWTlRTjVBNTVRYk1jaXlvTFpmbUlBSnNkY2hTVjkrSXEzU2ZVdytaRmJkd2VOUGYyRUVPcXErcmNSSklxZ3FtbjY3WTNLWlF5MWZvRHhLQkpsbFhWWGpucE5tWFlqQy9sMktYTm9yQ1AxSEU2U1hlZzFIYVpYRHFOZ00zQWp6dVJPSDNTM05xRVFzREdDVHV2Vlk1akpSZ2wwVWJIaEx5eE9pVFNFaTY1OEplakxlTGZ5QWU2WTZCK3NUTk5ZQ1ZKT01mbVBxR2cyTitOc2RxTHJPTERraVBobEpvbkY3Y1Nxa1BQRTVhK3RXQS9CdmdmYjlJdGxva2xRWTdKTVZWd25IUTBjUFNoZlk4R3o4bHpqMkZnazZ3bFBLVzg1Vjk2R2FqcGx4bkovckQwTlVFZk8rL0lmNkZCcXNBZnhNT1hGWm1acCtwS3lvV1Y5RjZKMTQ4V1Y2U2pXR1g2Vnh4WVFxK0VRc0xQbDJWMGNGdkorK2QyRmE3WG5VaVFPeGlJT3A5aGVQOGVOUytFWlgzS1JPU0p4blJ3bGd4VGRIMWYxNHlPYUF6RDFPUVIrYnJqTC9vMEQ1bU9KQndmTnlRNVpTMzlvV0RhcytBUzhacmtrSVlnWVpHUHlMMGF4T0RENnVYZHhWTTlJWUhQc2lpaTZ6SFJhYTk5NWdqdXBKeEgvSGE4M01ob01UWTdScFpaVEN3NGxDQklCQnJKWW9GNnRWVzROL1dETVlOak54QXA5SVJaR0FKUUZ6Z0NRcnhVckFQSnBwZWxnT05hSUVhN29WVU5JQmtlYmE1NWtEaUJXbWJZR21QaE45cithZjRsbGZ2RGxmNVh3dDZOOHJLTmg5YjViRkRuczhGc203N05zbEI2dCt4RzVkQjVzeFE4RW9JKzVxZ1FqM1lwaTRqMG0vSmwvQklqaDEzRlN1enM0YmY4M0hDdUVyalp0VWxiWENCZlVaV21OQTFhQ0hscmRsSGN3WHUwOCthTjhwcUlGelVScUpycDVySktmak1WYTI0RVoyNnYxSjNOa1V6VHM5TFh0dm9pUzhSTk0vdDh6UHRSRmd3YkpDMWJLWmRtWkNCL1k1U1dFaFpMUGZMZFkxVHlrM2NkeENLZWRkUHZxZGc5MDZWb3NkT2gvMFowcGVSL3JMa3hTL2FSaGpZMTc5b3Ywa2s3a0UvQVAvQ0pYc1cyWnpES2NoM1dEck8vS29kU0t2STFFeFZhblBualR0aThqZDRyeW8xSEZVczJLN2pNT2dUVDEvTU9XWm8vbVBCeFQyVnpoaSt1d0RRUGsyd0tuK0tZQTRCSFhFU1VRQXpraVQxV0tIVW1RMTdENHIrYndZWVVOcWVZNk1xVFlXYWhoNlA4V3FKaThyOStUQTdIMWF2VUNHSHoyM3o5SnEvYThZOHVwK0FHNUkzckIwN0l0dTdKUjYvZ0R6dStaTDBlV0p3QjJuZUhBRG8wb2JWQ3BRNkZ0N09TWSt6UzltK1YrVDM3bW1CdVFSTExSVGZlNFIvQlVKbWdxa2dvWmdOK3BFV3R2QmdncHBUN1IyTVJYMEN1OUszb0JXNDFDalAzMzhmWlJvaEFLY2JubmJJWEVBVmNpbzBGdmlySENKc1ZLNTZNU0UrSHJ3Uk1PcG5ndzMxS2ErZHowdFR0OVQxaFRjRytVdFIrV2NZWWVadW5uSi9WSVUzUUdRM1hnQlY4dEliaE9LQXFZZForVlg2U0Z0cHNsUG10YjhaMW12NHRJS3JPYm5zcFVJajQ1SWtxQ3V0U0doL2lJcC9LbkVZeWE4S1NrN29BZ25pZFV6SmJHVi9qOGtRRWNxWWNwWGZXWm1IVEpMZ2g5R3orWm1NR0owQ3B2VkJBY1lXbmlqcit2WXdZUCt3MXYrKzJZOFA1SjV3YXFoMDBIV3JRbHdQRlRKVnFhd1FlZEFObUxRZjd0azkxTDVielZxNjRvMXhqdjVPcnF6MWlIVHhpQWUvRVo3RFNaVHRldmdYSWFXcHZCS0tSeWNQM0hTeS9jUjdHcjhrbTlRaXllNkMrYlZDcTM4Qis1ekxPYjZpOGdNK3JYWkdDRnc0MkVNTTZLRnRicFZnV29uRGVxclpaeU9aeTZXYWZaUyswSy9rZXdWN3BpV3hudzN5MEhTbVFtOFA3enEwVnM3cUpjT0J4Lzg4VWdUTnJwbE9QeWZaUXJFd3EwaFZ4L25UdUU1eUd2ZTc4SFd0aFhrRWlSeHhKQ1hDS1gvcXZvV3p4eVNYZEVQMWl5WWJHa2JtbmJibE8rWDl6N0poNFZPOWJJSlVUcHJWOTJab2Qrdi9Uc2hsQmZhREpncEVyVm16N2RKVXlhVTNuK0pXNmxpS2RWWGlOVG1iMWZkdDZYQ3liZTYyWi9MNkxVQlhPcURQR01SVk15bkw4YzVWT0tOOFhzQkFqQTI2MHAyeEhQOHJzSlU0QlQxc3RVL0VTTVlYdUZxdXFpYWtUT3Vab2ZqSytUbWlMekdMZFVCcUZaOEZIYzJGZldqc1BNR2NTbWFWNzhYK3pKNG9yTDB1MnhFdkZIUGxzWjVhbFpjaW9KTGZyWjA5SlMvUTExZFpjdkVTbUVxd2FnMDRVOGc5clRodjlCUUNER1BhQmVDR1NPd0c5RWN6SGVocmVPZUdHWVE1bG9iL3lqV3JPWS9uT2wyMUg3cnBkd05FZzQ2Y1hpc0pVbGdkSlpBWEhlcEZMSUw4bnpLRTNGY3grQTh0ODdFZzNzVzdVcmFlalRTOWtjQW05YVliL2xlTUJqNE5nQXRXK1pEbzMzS29mdGRUcEpuUWtUaXpBKzRPNHBPMUJYVjNpZENXRHg3YkdvaGhMV3Y0OWovenNtQXVVWmdiOWN5VkozV0M5UDEyVURsaVJtSEJwaEtZM1Zoa1VLK0htWE0xMitLdEY4NytPWDc3VFBXdU5RTFZYWkNvWWtnUGlKVEZnRE95ZmY4ejVGNUtFVUdkMXdEMHYxZkhEK3lYWWxvU0tCellHUGNQS3NTQ2hiakFQN1RTa2ZmMzlOSStWalZzaWZGQkVvQ1ZIT2lBQ0c2REZOOGIyRlFkMUd6V1phdUJnRTgxRHVFYjExamtTbHFnQlVZMGhuekxTQjh2VmxUQTRmZjQ1U0NtUXNtU0JlUUNVY0ZCaVhpWmV6bGdINjVzNzhFbHY1S2g2cHY5S3ljTUNacFlESS9yZXQwN0N6ekxuWS9GODRmT1puVzJGVWNkSG1PcWhxR1pVczZrWUxObjFKaTVmU3hoWjRpSG93RjJjTDgzZFk1R3BGWG5ySS9GUDF5M0NxL2QwdU56MWRJZ1FFczBxdEZrWjk2Wk9XWWZzNTE2UExzVjcwYk5nYWVOSVB6ZytsQkMvemVMTFFZWWFsWVZJQ1piUmxSQTlqZk5IQUZqekVDZkVRTXlYNVh2NWMzSWx1MmhvaHNZQjJMbHlSa3czVURMcHZuUnpRckUyZFVmRW9DcVFpcUV2c0M5UjdYaUhNaVRMM0tOanNNRjlCY1dJVlNnL2ZKS0x4UTg2RTdCbnBHVm4rY1ZNRXpMZ0xHZjg2cms4Y0RhdVNkR3N0c0F1ei9WcG41U2Zqdi84UUZqK2FqaU9icXZpZkRkUTNPZUdYa1JBTGhOZTRRSkdMa1V1SmNOeDF0S2Erb1hXem1TaUVOaUJoQUs3TFBlYnMwaExvSGdmUXdKdUloazJmb2tVQUE2eHdVaCtIT3JGdDd2Y3JFUElmNEJtaXNkNzhTdkRRWTN1T0lqamxLNlh5TUdxN3V6K2lqQTB4YWNWeDZHTFczZnJKSVZRQWZvWExnUDJ5bTllSXZDci9hVG5SQ3BqTW1LNGQ3VkhDMHV6K0dBc1l1SElLaVY2ME05d0hla2VGMFVhRk1HZ3BzNlNrUkg4UURJallyMmljN1o1c1lvUkRiQUpmZDROaEd4ZzZzbTc3Mk1sZlQrdEh5eEtMTjB6SjAyb0cwSEh6UjF6WnJkaVEvMFVjNUlkeWlvbURwZjA5M0IrUmRSdzBUdHNOenRyT2p3d2hHeTEzNDFvblVQa2x0TFRPQXlYTEt0L3IyVFJtYnVraHRGWFBCM0NiazBZUlhlWWUycW10UTBpQ1N0OFZ3RkdwQ3FwbUNyTlVXaWh0WGdncWtKMnVDNmQwOFdmUzR2UWxaSDRySnBOb3Y4NE8rWStSTnZJbFFkSjBCTk14b1dUdGt0S1EvbS80bUwyNFQ2STZSWnVPTTBYTTY1RmhSaXdDdXRVeUhZbVU4bkVmSFM3a1JkSk5tUENBU0d6UUd1WTlVbm1ZWVpqV3cySVFnY2FmQ3RITytiOHZzNjNiVDNKWlQ3SXVaVmJJMG5aTUo0QlFmVVVyY3V5eVU4eWw1TUVTOUdwQ2RTdXk3Y09XUnIzelpRTzQweVl1WFdEeWVJRkI1SnlJWVlBNjdQM2NLQ28rcVF6VVhuby83eklNTU1vdzdrZW1GYm5aM2xEWlk4bEZ6OGlPUEkySGVkUElPNVRlV24rSmwvN1RHN2dwOTR2bElMUmNMUkI3QTIyWTM0dWZKM2NOZzgyZ0dzOUYwTXMxMlVvZmlNcG9nanZ2d0F2bjRoQ0RyN1Q3OUlaemlxMGtZRitkUHRQVnRVZ3dFU3dBSFIwY2JJMER1M1VzUFBYeTFGdzNIMHBDNU40U2U0ZU5KYkhzVTFJMEFrazJnM29WZm4rUkZZemVPSWpYMEh3aU5SQmpDSThGUWtZZ0ZJUC9aWjdDMDdjU1VFVjBOajhicFJrL1Z4VGVzRTcrR0JwNmQwRy81WHU0R3hNa3FtSU9UcnRNVmlLSmFnOTdpZEVoUldzS1BJL0k2UVVQb0dnQWZRZXVVVkkwQXlaTGpEL2xkc0t2NUNVQmc5UlJQc2RLNk1Nb1l3aFNHaWJndTljdWhZK2FKcXB1MEtMc0YzSWFRWlE5NG4wczY0VmRtVWQ3dmRYSHB3cG0zY0dueVhGeWFaaHE1QUw2QmRiRmp1UzIvMkJGOEVNVXd6aW5wOW83aFdOdE1mNHlCNmZudjlqSnQ0d3hZS0p1REc1WnN1Rk03SXlvSDgvVTNhWm5uNWUrbVdKM2dqTk1Rdk92V0lmWVMwcXJSQlZVNWx1YUMwZFc5NFlRVlNuYVZHVU5VY2VJckRpUURQSUlRRGxzcFk3YnVBcXdaWk5iTnNDMnhFQjVrM0dlZEhzczZqekNnT1dlajFIbmdoQ1JlV1dvYzZpYkpyV010TW1FMDVuL1pHNzgwU0NsYjZIZWd3aVBSSmJMYlpaMCswMXFJOHhFS0E3VU1nZE96Q3I0eTArZVk4aEJmRmhZWUphOWJxWVMyd2RoZkVFVjZDWlV2Vyt3SGIwc05CYlQybFBRY1BPQ3hWUHFFKzg2d3RRNElTOXZybmdadzdiYkExLzZmVEVpMFQ5elI4NkhWcDkwd3F1d2p0cmJZOWRxZ1MwSFkyM0l1dFJLUFB2RG9leWtZSlNMQ29wVVpoWlJhRExMajhoTlV6bHFUMkcvWnNxWDN5ZEZDQ3lxbG1heVBWWjRlWGx3RHdPVFUvT3JJN0lsSWFSaFRPZDJTVGhDRTQwRGs5RDVrdlcvMnB0MHYwWXhLYlF3cUJMc1JxeW8xelpjemNaV2phNUNxYWNjUUZ6N3F1eERuTGFZL1owSEJwVngxSnlVYlJFUkljK0tvYzRxanAycUNuWTRGWUhoaUVPTHZZUVBtT1QrZGJ1QzJDcG5Wd2JDQ3ZLVWh1RjB4MWZRbm44ek5yek1GM09rY2xickd1OGRwYUZpRzdhTUk1bmVPUWdmTnZVOFIyYllDaVpJci83VURId3ZkQys2VXFPWDRha3pIaWpYekVWNFFWZVgrTEJJcnhKZzBqOG8xZnFjRFgzQTF6Qkp5U1llRjR3VWlJSWFhNDNXVy9HbnM5cVNMRENVYmxyZG9RVjNNOXJlSzlBV3dYbjhlK3B5OEVXYVFoTUxUaVFieXY5SDhLd0ZsU2FSRVhNdjlmcXVMUDk1OUtDME5TTkhiOVQ3djA1V3RxMUtNZWhaZWdpcGR1eHU5eGtpYkVQOUtsK3hVbUlpWXlyTlVyWTVqbHlKdFBTMWR3VDc5MEhydjgvblM4bDVWWjZxVnRHMnJCLzBxdHVRWjd6OHFlV2NLelhDRjRObXBnNEN1K1dzSU1ZYy9pYkVkK0NHbUVHQklpZ0k4Z1V5L3JxWFY0dkVnaEJQaTI1eUZWb1ZTdFVLdFcybFZFZFNUaDROSS85R2czM2NWRFBxWmxqZUdtYWtRU1RNMXBqdFFValZYdXZCUmFjRitVMEpyemtodzR4QjlzaWZZUWNXeG0wOXViWXc3SVVwVEk0aDNHZmhtNkRoc2w0YmFyUlUxRm5oQUtDZjNpSkIrWFFPZTR4YVVnVTRGT1VaU0JUTzVsb29zeUdQOTNQdlNaTVAraEhZUTh0aTNSdkhmWVVqVDFNZDM5NDJvZTRIdXNpTDcxRE03dG84dWVSRjFJci9CQXpIRkJNOHc5VzJTeVFUemQyc1JwTml1ZlFIeGhycW5aMGxPWTl2NnZBd00zWW5jUUd5V3ZJTkRmOXBEQVpqUFZuNThOU0Q0NVVBUU1MVmNHc3NaNDllQU1YelpaZGwwY0xVeW5MdXJqQ0F0TlpEWWRpbHU4TS9OQVFkSjJXZmllTFY2S3k5Z3NUaXQ3bGNRS0RFeUhFOGlXNnkxbjYzaUlhODFucXJwM2dhc1ViOEFJZDJma1hHWkNUWUg2MGo0ZFVaRnFia1ZFMmd0azZoOWkyc2NvOEpJUkhJNVc1a3lxaEVqUmZuZEg2ZEJRU2F3MzYxQTJ0VGd4VG00WjhOdy9wVldVdHU1VHh4VkZPZ21UZWJLQmZkZEFKY0JXelkrZEd2NXhRSlRtVUUwc2xIQUpQRXVaRGM5QnpSVXh2bjRiR3gzblN0TW9BSTUyWVdzQ3hCRzFjS1FiaGtQWWtTSFN3ODdHcTRwbktOZFRwUGZqKzhHbkNPVUtnd3JGSXMzS2NqM1RWTmtKbnhFVFg2a0xoaDNpcmJtdnZZeWJwdHdRM0ZxMUZ1cXRiZWFlZ2Q0ZGFESWo4NHhlVUg5R1NsRXV4S1pvWm10eDhMT3N0YjFZMDZFdG41SDNFRTJZR1BKV1gyQXRMcVFjNWJHenJnV1lwQ3BNd1U1K2d4azBYZk5TWDVTbWwyTmxlQWZjQ3AwZGwyZytFVnA4dGhIbHZXbVA4dFBqSjJIY2xhME9CcW01dTlIcUgwcDhNem5vODRsNzBlZW01QThxUzRVYTRjWmxiMFk1TFBLd1RCb3Z5VmUrUWo3MFdmTlF1SXVBMjhFSzJQZ0JJbjVURzlFUTk4WTFscXY5OHpMVFUwNEsvQ3NHdVVmVk1tajZibmhEVTVuby9Od2crbmRKSngwc0ZMS1NEL05QU1FvaStodW1MRnVqYUIreEVJWTlDa2ZXMDAvZWROSHQ3WklvNUd3c2dOMjVKMUhPTVYvaDBzbzZ6UVM5VjFVSFVPdzkvZmlLWE5Wd3VoUmhxRlZHeUx0RDh6NFdDVHhjbHJ3U1lNMU96b2p6cTA3SGs1eVcrc3IyRUgyRDYyWW4zeHloWXVNTHIyTjlEOTJQdUkyb29jMzhkSVZtTnBybkNTb1c2VitpZTNZbTY4bTB0UUdoblNnbW03T1ZZN09Fc1RWSGx0WmFJWm83cHdRV2t0cWJvUGxuYUR3Z3Z1R0ZCb0pWMmVZb1hQOHRiQWswT1FKNFFLRzFVZE5NcHI2ZHhRbTErQmdGTnZQdGIxSm9keUFkdjRITU9TbGRYRW81dS9OTmllNWlZYjFWQlFibEE1QTFWN2xoZUQ3bXBuZVdxOTB2cFRydHBDYUU2MFE1NFEzcFZPTFRVU0FrR2hOYzVDVlpFREZwWjNVSG5NNTB1U0QyWDErdklJQ3YyU2N5ZUx4c1RTNTZkVGJBcmxHdk5heWhCL2tpNXc1WGtaWXBaTWdDWDY1NmVpL2Rhb01hV0wyTmVaUDNCWk1vMUlYVWxPNVAzb1RSOEMraDNSTmN1WnR4SVVKVW9lT3J3aXdtZlZKWGtFeEFBaWRFNU8rNUF1MHJyQ250R2pFY0hZYmovT01ETDFRYnUrV2FYVWZKbUsrTzhxRWZMb0NQZ1pFaXoxTDNDQk1sZWZ6Q2VPYmVTbGkzN3E2ZWsrQXZYcWZseElOWWVmOHV3M25UUjZDRXI2SCtsTGU1N2JsZXNxK2p6M0FkbGVvNlBCcVVQNU5LRVp0RjJKTkY4cUZxcHlXWVhacWtuaHlIVVJTOW5PMEE0c0FGTjVhWThOYXRMMWZDS01OMEdjZ2JxRnpuNW5uWnlZT1psdmZ5RFVGUmplandEaytVQUhPTEdTZDRXWk03d3FHN2RwTmxVbE1kQ2RMN2xYWi9MSGVuWitMN29WbUhWRGJ2eTEyZW02VkhsWTFvZHNDRlRDeExMTlhGR01HS3oyYWxlV1A2UlUyZkVnYnJRM0RKSEZHNjZQQnRuQkhmQ2o3M3ZJOHQ4OFJNV1E0YTJhU1JoS00rZng5WGRsRHpXQXRNbmY5SGNpVkpleGdiTFNUK24zR0dFVnQ3V0FNdGRrN3hUOGNFUGRxRDl0SjdGYkgyNDZEeEl2V2VCVjRVeU94T2FuSUwybmNPano1cVNTcnQ2NGJUdE1sVEtHMjJHU3duT2VKNVpNMlJDeXA3dmY2QUhzU3VHc0NrL3pINUhGUWlnNW9CS1dKajY2N0dPdW4yVy9RRGpyeUoyRmZnaVJNOEFpTFJ0TlE3WkJZbHM0UXROUjFyTXFBZENGc2M0TG5MTk9xRlcxZGVwRU5GZ2xDZW5nTVI2MlFpUStMQ3ZaQXcwUUNQcERwcS80UGVQc0llMUhkc25sbzBKcTlITEcwbFRMT0M5SE1pOUhiNGRmdkRlSVZiUmpUVUFKa3dTeFNtUEJqKzRYMW9GczRqRUpKdnQ1RHptbG1JajVWSW9velFuK0RpZGpkaURiR2dZRjZIUitPSkdKWTJ6Q1JmQ3YxTlBjU3EvQXRpSUZkd0hQRWp1ZDV6aGYvVUJCU3VTZmp4OEZxYTdQT2FkWlpjR3RXMW9SRUtYUzFseXVZSGVWRWt5MkQydjdkcmNTK1ZDbHZjdnNNNnZVRUxJUjNaKzhRNTVCdFA1UCtuWlNnL1EyMENWRVJrZFkzQStHbktZNWtBWEFaZm1ML0ZxSzNKUGNBdGZ5QkswVGE0MDlXRlRlZGFBdHI1OTZ5cC9oK3o3NDVCVHp2dlRhWUl2eVlTd1pMbHVwa2pCMU0wUEdKRUp0RkdrNklYOFNpY2tMZmlYQ2I0QkRvakhlVktzakE5dTB5bzk3d3hzek5zWkNaNFd3eTBLeFAvU3ZycFNwSTc3NTV4OVMvREpOY05NLzJsY1Z3QUhOQUNZR0lHM1MrWlpWSm84Ym9QRVZ3eUVsSVV0QXhuODdGV29nUDhObGNzTGFLbThsaERLb2RlMndjQ083dW5LS0o1TVBRZWpKNUplaUdkTmswM3RrL21DeS9USXRpMi9jb1QrN0piY2hwL05udU5ucG9NOEdzZkxydlBBbk1JU2g3aVRnamVybm00dE9EdkgvRDBrdkdXWWRWUWFuRG1vMkFhaXF2bHg0ZlphU1ZXVkwxODZxRUdqdXIvekdENkpLQlUrWVRXelA3Vmh3eUJlbVpZTTM3Qy9IVnY3WktML29MNjRLd2JzY2hqWjlvblJENHBXK0RjN3BHaTRNSWc5VVN2azB1Z282bEltOTY1Ukdnako1bCs1SGV5OWpMSlJSdXBKS1ZtdUxMVWZub1lTR3crbFV2RU1ReCtkVDF3emc4Q2VzVEw4NjF4YmVNcS9NeE1qUGJIS1hOdXdEb2V3OWEreVg0dUJSdlc3bEhGcmkxaFFKUW5Ra0lXeElBZHRjbmtyRGV3WmliTldLbW9mclFiTmV6d09PRkpmQjh4ZTA5amRUNitlQnNpV1Y0MytCZTVYL01raDdDR0lJUXQva3Z6K0VwSGhWS2IzcDQ4c2pic1ZBcFZBbWtiLzZTN0V0NVRmZTdoN25wZkxaR24rM1M5T0JhWnhYWjhvMXY5SW1TK1NWQy9jWnh0R0RPMVN4OHhXazVJOUpiS24yZEZqY1JkNkhGc21wRnZpMnd1bit0c0NWSStGMUg3OEdYQW9ScDlVU3dIL1hXU0w1S1dXNnJxWENGMmVHZEFPMXM0d05FYTR3RHh3T3IwRDNGWlQzZytoU2p1eWZjZU9WYUgzZUV3S1czendvZE82TjU0Sk1GaXp2ekhxN2FMM1RZY1BoQ2dsZG0vQThCU2RyNjFRd0Vtc0swZnBINGtDb29VYmZsZUh2ZGZMTFkzbmVxYWFsWVBoajdOMmRad1FyZTVBT1g5dHMrMk1JN0I1YVZ2SXBiTFRKOEEyVTVMWjFqcHFWbkhQeFRVbkJ5QVF6SzRzYWthOWxZQmRlNlFGTnFmM01qcWR0SHlWQjBKbUwvUWVjeFA5SkZKYXZocHNhbHNSc1NJVWVFanlVNUQ3aW5lUXFGY2FKclUrdmZnamJ5L0x5R0tzdFFRNUdpTWlSZXZUUDNHd2xmUi9xU3NaWVJzMkFzOEdrVkYyUk1kQzRNbzRLeGxDczEvYklTTWRWQUEzTm1hUFdUOU40eTFuMkJGK0dMcHYya0Q1bVc5SUpFQkp0dFJXRlR2Tktabmg0VWlVNEZkenl1K3p5MUFGY29HYnE0QTNzQk5qODNnTGhEV2hZTVNxRHZTdXBFeUdJR3VvU210WVA4b05GKzZtOEJHdDByaWttckUwTGdBc2tTMFFYQlJWbDhpUnRPVDRnZ1lmaFR0SjBVMmRSME44UG1INm51NUJ1STVPNCtjRnBRVFBOZlhKWGZJSU1lR0paT3JNa3N1R0N2bVBEWDhhckUvYi9Dc2NRTUhLTnNBc2Fxdjk1RGNBbWhRZERJYVM4TVd6cG5RSG56bG84MFphTmhRb1ZxY3ZmbmFkVEFxNW9pK0RGQmJadmxZbm9QMENhcVYwRDNvdUg1V1hsSHpKMVpSRUg3TUpJQjA4LzEvc1FPOXRMRUhDUnN0Z3pMd2JQcXRYN05adlNRME9sMUxFdkdsVFZhUHZUL0VMT3lNdVp3SXdqd01Cd2o5Qi9JZmNkaWNZN0NxQ3Q0YjNrNXpubDVGTUsvUFF5MktIN2xudGRWVWQxNmRZcDBDNkgzMkx2d0NFRXhzcFgxWmh6dnpPSExzRDZ4cXg3ZEx3S2d2ODd3b1BEeHVKL3kyUlJCSTJ2TXdsNklTcnQ3VFBwTVFJeGMwbjBHQ21RUTJacjBobXRFdEljczB5S3FmNCtXM3llU1hFOStPcXYvM0FmTllHS0VVOHVCVVpLM0toa1hCSk9kNVRFbXY3OXBkS3JhTFV1TURtWTNIS2R4eHhEb01YRHFzY1JkLzRFd0NSY3BrREZuRTEwdGpmbS9pZE84Sm9HSmVkU2JWRC9LNVViM1Q1c2hubXhFdjgxZStTaDhGMHhoK1dDS2RrUithRUxxa1dnTGMvR081ZEpkcU10YzRGT21lZnE5RGR4MTVSN3VrcC9FOGxweDdzczgzR0VBa05MR0NTOC9hSEVnbkt4T2ZGZUQzKzliV0NqbDV2Rm5uWmlGSDQrQ1JpY2tJTDZVTEM5UFpnVzlVWm5RLzNRR2Q5czF6UndTQVBPTlpQQytCU0YxNjY0RU5QM3VRTlBpakF6UER4cm5iMFd6bm9tR1hITVdiL21DVUFybTY2Um8xUVV4T21iR1RHMXBWZjhGQ2p0Tm1WY1pvZS9hOXhIMm9rQkozOGhJdTNhcVJhakRSNzl1dnBwRTl6OG5MTURKbWlGUVBnRUhVT0taZzljcWltUk9zQjVaeENFNkxrcTdmaWFKaW9naVhWM1ZybWVuNkFuMVlnUEc3QVp0bUtDai9zT0FYNVViVWZqbTY0ajArS0pWM0I3QkV3dDUyYVBSQmJUc2g4ODJQOTFLemNyWWlJOU5ZejJFSlpQbXJDYzFScUxGVnRoNDhkTVZ6eENHb0pYOHkwd21ycDJDTGlmR1JQUnBCYmtsdGx0WHFOUnlOVTl2TEJLZFpkQXkvU2hvQkViRHJMRkN4eFpPczc5SGgwZWhYYW9HMUNIWFBlYVVTK1V1RG9WVGtLTEozcU9KdnJFWEFxQlE1cEx3TEliQ2w3MnVnYWVkYWNmM2ZibjJJWXFFclRwTnlzOUR1UU9jUXlFZVQzeExRMURrYmRkRnUrWUQ3enREejBVb2UvVERreFllQmRibWdrdEpKVXphblNHbHhZT3JpVWFhb0g5aDRzcXhjZHB0cER1c3VnRVVJMEN5UjFacmk5ZUhnYmxONHdkZW5XRWllMThCQTd4Tko0aGwwalhlWEJLQ3I2YkFVbWlFNk5BT2FlZG5ndng3MElmdjB3Wlh2UmVRWHZsdEJUNW8zZ3dWMVYxWEp4ZlZnd21KNXJ0WDUwVkc3RWEyMkFaWGpZdjMwR1FKanhyNXVueVdIWkdKVlU5TVNRbm5FNVB6SkFXS1hSU0EwaHdQZFgrWmxiNU0vWmpiV2xkemdvZ3lvRnFya09zQ1piZDgvNTYzNjJDdGJFNTJLem42MUJxMFpacTJoZXNSdWgwK1NRNE5mT2ZwTTYxOEpWTW5hNHlzaTdPa3JuVkYxWitnc0RReVZ1ZVEyRGVXRVdnYXl1ZzYzd21NVkxiWmxsU0JrSTJIZjJocUJLRVRKc3RNSDNnVGJyV1N5MHM2V3kxdW9PTVlDQ3dSUXJCQXhoWGRROEVuSVhSbHlCeHVZbTkxZzVSRkRLS1FOMzVLWmxZSXNKVmVOcFNHVmtUNWNWV2IzL2pjaEs1bmUvUHhwSVhPNlNzRjRjaFBleEZZakdjQmp0QU5VbHdONll1bDRDc2VnMnhoNkFGWXhpekN3RHRSa2xGTWlRekhoTEtUUkp1T212UFY3Y3MxMWhZakxXUDR3WHdCQjhXYnQ4eStHSVVueHRPeUJXT3daM1BoSXUzNzdPbU8vSjJKSXBZM0JnaHFYQm1zdkdscHFoZ2lTL1ByZHpBYTM5QnJDZThiamxyb0FqT2JETVJGQ0piaUdXRUZ5QmhDK3BuUUo5V0RraU5YMGpiL1U4ZTgzREdRYnFNLzNHZ1l5NjJOWlM1VnQzeDE4OUNJOUFUYzFXbUU3cHphUmlqL3Z0Mm13cENmN0RNTko2OEl4NFFVRUd4dXFvelZDc2FBZyt5TjJPTk1UdWNuMkFKR2lVdnBjRVo0RnlPZ01XNk4yTkgvQlpueFA5WHE3VnFWaU5WWkFKcjBoclFRTTU0SXRTY3RrWFJ3c2JQRkVzb25RcmhmVVIwdGwwRWlMU0N6YVRVWldZUnFOSktRbmpwWlg5UWRZV28wS3dNdmhpbEprRllIZmxDenFWNmErV25jdFN6YkZubG5IbzE2SklhOHc2cjRFcDNITm1zTHF1QlU0NVgrRUZCS0hJQXUwZjBpY29kTW5GeFUvOTJHZFNERDhyU2FoR216NnV1TkJCdWFUems0cFFSM1hEcjhvd2ljNG52Z1VtM1FxaFc1MjZHTjgvYTFDL2g3M1BQZERMSytlKzU0TngxU1g3RGVTZzhjcUlHVmJaWE1EMWhOdXBBU3RwSWJGWDkwL0V6bDUvSHlBYnBRV1lMQTRqTkNyRXc0YzBIQlp1MUVGQmNrZGwwZ1VtUHU1LzU0L1FBa2J5N0VkUFNzK2IvTXIrWUE0U1drT3lsTzBONHlLeUtPbGFnZVB2SThhOTJQSkNQb2RLdGRSRklpY0c0R1Q2N2c4UGh1VEpmK3JzME44QzNlWXJwK3daaVJzbURza0RWVkFPdU5kakFIWDB2UU0weTBIVmlWSjQxZU9neVRTTzhzaEdWVENuY3FtQkZScm5pZWxTemNtSnpUQkxQZHNJOWpNU3hyangwS2dWd2hrZE05V2U3NmxLQk53TW1CeDlXU2x5L1VtYXM3NjJuTG8rcUtXSWFHZUFCUEFXTHNkODc4dEN5OTVuOGgzNVdRWEpCbkZaQ3dQbkRUZzJmNjRkaFkwSGVHOWtXbjkxU3NYNEswVkRBbEJTR2JleWd2VXRvVlVVZDFSQ2JwVnZXTkhTaDYzTmp3TzJQdGdveUdqMTFvVmJPR01HMVVITEhPSFMwZDE5RmtuYlU2MEg4UWRtNFhONFJycVV3aXM1Q3U5NXZQM2RIbEthRWVHK2xBQkpJTWxnMGdIY0l6Z3FUQmJjeFRKd3hGdDJ1d2dmdWx0Z09UQ3o5bHBuRllYMG1hdDJoUVlUbXg2T0NyK25KZ3R2ZGpzMURsOGJBUEdtUjE0OG44Rkg5SEhCN2d1bjcxbll5VmlYanZBeXhKMGJaY29HOEpubi9YVnlyVnh6V1dQazVwU0hUWERYamNoLythY050SEpxSFFlKzBlajl4dXBJY3pRNVovZUpkRVM3eGlKS0gxL0hocHJCMFNGY21aeThoT3pxR0R0NjczSnVzNHNDOXRQQ1N2Ri9ja0p0MnZFTml1bFcwUCtwdEF1MVN2NkRZdWk4c21VZFlvdjNjZzBTZmRDSXNRZUpZdk92OUNxcGNueElSYVdiWjhEZzVBcWxzUzY5MFQ0cW5nMDhkNlhrOWliMC9OR0hrR1Z3VU5CSnU2K0dmbmMwdnFkTXdQRVhVeHp0em5NUjNjb3VQYUFyREVIeUpRVEU1YjZJbTRXaExqSmFWMUpBUWYrNFhna09YK2hYT0doRTExY1FtdE5TNHJNZk84a2NDU3IxUDNCL1VCcUlhUWp0elRsWlVNazRXZTloZGRGMXlhNGVocUZ1RzFVdXl1a0l3U0RwWk0vS3dyRE5KcmNra0xYYkl2Nm4yMmZ3NXdUSWhtd2VKTVdXak9vWUFTZ2xOSitPK3hJdU4wVE9mQXc2Y2dSNW5zSytVd3dSbUtTOGxNZmdOSmMwZG53bk03K3ZzUVpaeFYxQ3VYMnl5YW1ERGlySnArSFRjdElIOHBaZ3BrZkpTV0FuSHZ3U3ZLU0hrYkxLaGtOOFVVZGN2dWgyblgwWE16UVFac1NkSFFVYy93N0YvZ2xGRUdXSHdGM0ZYeHc3MFc5Z29pVWdoM050L2lGSGYyOWJRNSt1Sm82S3FxQ1AwWTdRTjg1NDA3cGs3blg5bC9YUEFQaXVOc3J4TmVtcGt3THFxUEp3MXpYYVpYcDF5ejVMbDlZeE50Qjg4MCt0RjNaekMvRmp3WjRSWTdEOCtoQlcyQWxWSGpBeWFGVkpueFBWOU42c3hXa3BXYUp6a3JXb1Bjd25hdTNrc3pTcHk0MDR6cHFLeldYTzBOdEFSc2FzcDA0T2Z0UTRtaDA3S2cvWS8zVmJiNUwyN05WaXI2Z0lUdkU5dk9CYmZFSzNBcFBVWFRsbjRlTUFrMmNsR2xJY1JLdUE1YjBJZkdPUC9SM0xTWVhvZ1ExZlQ4bnphRUdSNDgvOGlka1Q5NG1wK1oxT2VyRkdqQ1dWMUxQYXZHMHlQaXhEK0F5cDlSUWlmMTNxcTZobGFNS3pZMlRzOWpiNkhDQlVhWmJMVzdXcHVqNWhHemU1c2k3OGc0Uk12SVlPdVRaczZ0VEE1TDI3V3p6Ym5wL25ucHlOVzBic2J5N2l6UE5WaTFqUnZWZEQxVXZkbjhUbXdXU1lud3B6ZkloLzdhUEVrcjBrcURSSnJTWXNKM2I2M1B3a2xWekowT2RlWEdCTEkvcHQyajI2Y3VVZG5DZTZpR0hlLzZad3Z0MU8vRWxmUDJ1VWlDMS9XbnhtdTRoME16RStXNDFWMW1rMDFaQmc2R3UzNWpwRndWS3JJZ1Z3L1lJR0hsNUJscHRlNWEvYnVmN3VaZjRpcmNTNVMvdm1zTE9pRkJuM1V6eGMrVElrUVNPUDlOY0U4RzNuTHVLZHRWUlFZYUJLWnJoQTNCT1dPZnc5eS94RjRXMUJxRnhZQjl6Z1ZVeW51d3hkRHMrT2NkQlI0VjEwdTNEdUc4L2g4SzFBTTM5V1NnRTdoSWp4NktrSTAwbE9NanZMN1RFT2ZzSUhESWlJZGtTaUVsMWdkRVNweWs4bEVLbStxSmVCYWEwNHU1VU13RG5uYWVYVktQRzFXbVlPanBKeWRad1Q2QVIvUFRUT2M3eE5kTXJiSlNjbHdiWXN6RklxK3Z1bmRXVWNoa1N6VzdqcCtNbERMRDNrMjlsSFh6N3RHWVFvMEtLc1ZOVGVzdllyd3NqT09FeklVVEpJdmlPMjhja29OaDNJdjcxa3Y1dGUxRUViNjFiS3lsMzYrUjZVZlVHT3ZLY1BnOS9QeGdlaWljbC9zdWZCeHlQVkVTbUN6RnhDUmtlRFoxL0Nhem55WEhmOXE0TWVudURrcW1BNU1RaUZteTVyalFKazJrcExleEhhTEl0c0ZReE16NXZURU0xQVR2aUFrbkdFSmltV0JHL0U2cUlTVEE4cUNwK05zQUw3SUZpSWtVNXJRNEVlVC8yWFdjQzFCdnZJUHFydFZWN3lNaDN1cXhvVi9ZamEwSk1SQnVRR2E5S1o4cHhaRG1qa1pubmlDZkc5QjNybE9ISXMxcEFGaWxyRWcweDZTM1dpREZZODFDcHZJMTI3NDBVWW9wYXZtWmg3NDN3MUFGenRWN2pzU0prRExEVTdGTk8zeHhaWjBSTjZ3ODhxMmlsdlJjOW11ODdtOU8vOUlhS0VVN1d2UXFBUXArTkU0T0hPZGxmU2grUVZKQm4rY1crUW1HOWlodkFnYlo5b2xCcXhqSWUycWwvTFhySVJOdTRua25tdW1FTExaTUd0aG9QSmFSNkhLdmUrL0lQSlNDc2V6eEQwcHNvbzJjT1BsNmxVNUhsby9oeWxyazFnU1QwR0JSbitqb0FLSTFhaVErTzFaRHphN21aK1R6ZnAvZUtBQWcrRW16UnZCM083TGJPZ0hEbDQ3cHZoTVJJblQ4NEJ6VTJhVFpFV2pMWDQ3UlVmUldPdEU4Y1pwN05hd1lRUVRKT05WVEt6Y3ZJWVU2RTRubkVML09IMmlBejA3RkZWRmkxYnlCQkpveG1GcERkOHZxZDJueVk0NXhMWEN5UmZQZU00akl5c3N2cUovdDV0ZlJyV0VKZEphQUtHd0F0N1BYdUxqdkFWTHY2VUpLTnAzOHhrd24wdys0bW1BQW51Ly9NMm5NMFRweU51TnE5c20xNDRCa1lOKzlvTkpHMXRjOGVTNFg4Q2c3V2IxK0tzaWlidXNSemM1azFXUlU5Q2R2YTFldEhiYVYyOS9IMDEzQUw0MngyOUVvR1U2NWZoeWNLR3FOUGk1VGNTTzJNWEF1QmVwdWZRZTRIVHZqWVhpYXdPK093cDFWSXpIcHpuTk9HRytyQ3RvVFNjajNiTExib0UrTEdQZWs4U1ZuVVdWSmdyaXhiVHpTYm0rQXlIT1BHMHdiV29QU1A4N0d2ZWlIK3ZJK2NOdnU2clZFa2srSjJqSHd2VTJUSTRUb204SzFRRUFpUkEyZFFOZkZ5QlZpMGNhY0FEUUIxQmVveGVVUjRNd1hqYnQyRjBKQ1g4R2ptYnRQeDBFOXhHK21ZNlVHZGRZSzFzTnIzUHJuOTUwUTNFU2w0aldqcU5YbG54VWVTS0szQm9kdEZacTE5TDBDQXlkVVVXMDl5SzdNSW1RK3RSU0lWM3lkNUxJY0pZTWRvYjhvTTFQY0Q4TStwSXgvZmM3QXVQcG5mbnZkMWtRai81dUthYmJjTFNVcUdubXNNT3pqeW5Ga0JaekhoSEVSNnNKV0FjTGRWRWdSSGMwanErUHNFaENQdDJ2VXdkeVA0OVZnTENJc2p2RzF5TkF1cVdTeHk2R0kvOGVXOGxCVXB5UGNIUlFJcXlZcjZzcmdVQ0RqeS9LdHpZRlA4MEFNRkZXb1dTVzBITUJuZ0ZSeFByNmFkSUVEUWxHc0wvK2F3ODQ1cnQ3WFovTGlxWFZYUWt2VHQ3dVY1VEJPMUJ3clpXWEJobEU4ZEpnaXh1NW1VMERYWSt6clhyMlladzVZVm9NTGlFM05XblNHMTJlM214OU8vUUg2NUdIUmY3VHp6WW52dHgxeU0xU1cvdVQ4bmo4RUZKanN1NnloSlR6SEkzb21CclFqcjhQemxpR1dDQXVhVzJvTWpHZnp2bDhJbDdaTEFqTkwzZ3hiWUVoSy9uc2VZTWcyZ2QwMmR3ejA2R0YrN1JCSlJWM1VCUjJvN2tsWDJqaTA4eXNrNkNueUZqNEt6MWgrSWxJS3lDN0JmV25FUmQyUDAyY0YyZE5KNmJFTEhyeHRVb3Q3TVRkNFJZSVhnNGNXUmlUMzk1Ym5nYnpZZnY4WnpkZWR3MExLYXRtL2oyQkkrL3k3TzRaS1NDSkt0dFplZndmbTM1MERWd0w1QUJtcnFWdjh2enp1T3VmSWpSNXlURm9nV1Y4OHRVdytsYzBsdlpSRnBGTnBuekd3UFMwZ052eG8xVE9Kd1ZRei9PVzYyV2Y4ajhUbFRjdzRqR1Y3c0R2d2V5MjdNWDFobzRmdGkzME00dENQT0IrV1NsT3FoVHhDd1dtT2xVazZvQVpVQVBsc2tEeHh4Z3YyZUhFR3g0b05sTWZSd2VRdlVRRDJtejY3aVFIeE9oVUd4QjZ4SFpFb2RqSERldHM2UnhoSThJaEYxS3dSajFnTzNBZms5S0FmcHN1ajE4M1YwenRrSEQxekgvU1dLYzcvM2daZStyTEZOMmdoaGxoL2IvUEtiK21abGswM0tjUHB6Y1FxWWlONTlYSFlaUE14Q2RTWDVoV0loRHZIbUd4UlhBcDhNQ0t5bDZxd1Q4bEQ1eWdSbzkveEM0bkh4eFJtK3pEc3lEdG1pK0djaGR3NWNSQWY2NjlUMGJmVHYxMU85ZkVkUWhBRzB0RGJvT1VXUjRxdVhEdGZDVGxhNXZ6Z0RrRnAybFdEMWlJNnRzUW5FbnNFcExhaXFtcEh0eWVqTnB0ajRqUWJHNXBaZ2tnUkNFcGozaEZiS0h4UGVubWl2MzFVdmlEbklGcjdOTjhoeWpkQyt3TzZXbGkxcGpkdXY2TFc4M3paSkZBdXVtY0s3TlVtTVNRUDNlWlZ5Q1V0SHJFdDlkNUlCSmY0eWpGaUE3ZTZtdnB5UnBSbCtMYW5BY0hLTWp0RXl2Q1BBVEh2UmtxcllmRnNra3RVYmVtUzd2aE5TOXBxZy9yMEpxMUNSZ1hialRmV3ltdXJNSHZldEhNbjFYWm9EclZQNGRWYllVNXdGSExXMmhGM2JzQi9GTFg1V2NnTXZzZnpDRmZVaVhoN2d0YVJ0TlpaV01iNTkyeTVCMXpsRmY4STlWVVNCSWpFcDZCejBFTmpxSWMyN0lKdmtOZklLR25yaGR1VTFOcVdHd1JLUDNTR3djMWRYTlRRekZpOHRzSnRLTnNvR2pNVXFzM3Ewb29hZ2RtdUlIVFdBNjVPbWxMQWRFK0E3TjhLN3FsVlB0eE1tWmIzVE4xc0hQSU1DS1hndy9iTnhOZzFCTGxzditHT3BFKzhzUlFaaWE4czdqZmR0SkpubU1aNlFweGlqSTdsM2I0QUhFaGJiRTBRWDBpVXhIYWZuNDUwVUlxT0xFYTd4eTd1M3o2VG5XaEUrYUhWZXRRVS9nMG1OKzMzZTlqdi9DUnpBUEczbVVGOWJ0a0Q2aHB1KzQxdVd4YkYvcGNSajR0NXgxdjVvbkUyeVJHc1JGWFhZZko5MVo5dlg0Ly9SWk9lcEtydWN0NlY4MVJUa1B4eS8zNGFLcXBsVVAzT1Y5UnFzYXpUYW9hZGNtZ0RvaDFEZUt5dEdPanlwSGhNS0Y2SGt5NDNUdVR1cGdMUXR0VnFtRU1Pd2VhR3ZxcEdCalBWS00rQXJndDNWN1RWU3VhY1JRbnh0ZHdmQm9tMjBkeFVwcnJHZml5Uk5ZZEIrTFVRSXQxNmgxQ0l2NzdUaFBudkpwQzhDQUlaV3ZveEZ0aGJIWkRFVEV2YUlEcEQ2b0JpaUtjT29ZU0RwbmJhemY3c1NZcGQ2MlVJaHYzazh1VVAycW8xOFhLdXBKdCtDNXdQMXM0MU4yVFRmOXVyWDFZVGFOSjFJNWRNellKNEJlUnQwY2xkQnV0MTM1dkVxWlFHZ1ZxdU1OQWdUU1RtUlJlM1puZ1k4ZWJXN25PcFg2emJtaUtXK1dIQWhLVTZxYXVnZFQ3a295VEJvWjRLZlpHSnZONnhabUtmbE9XakVOZ2ZWRU9iU1JMeldWUUpjQTF2QlZnaEM0c254K2l2NGNzdzRPSmlKYWhOME9YU1VrUUUwYzd5Z0dXU2dqWVNDTW5EUHJiMTk2R0dTd0M5c0Z5dXRMMDIwc1F4c0trSnM4Z2JoMlNXcVZqWnY0V0FtdEZ1b0JNQ2Q2eGNaMFZaT1RDRlNXVnZWRmVkR3I4cUtCR3JRT1lIWXhlVDc5bUE3YlRNdTZ2SWZNYVloYkJCWWF6RkhSWERsODBiVjVvc2d2ejhTVitpMHpNODJ2RUhJcE9BaUY1Q3VNZ2ZyWnhUTm9iLzRCc3lCZVZKSG1LREVqcFFaNkZBNFdiRFhVUUFzTzg3bjAvNGg5ajVPSzRlUXNBMlFac09BZjhnd3d5blRPUWN1RGxieVREb21WdEVnL3VuQTQ4WCt6ZW8wVmpzQnl1ZjBTWnRDUksxcDVRYjAyRUROek5QZFFndVp3elk3Nm5yVE9TdnEvbUY1V2dIcG9jZmpOMU9DdmdRYXVJeDJ0THI2Z1NQOG02N054cjFJR2ZGNTUvK0tDM0lCL2drSmQxbTVqUFh5SWIxWjB1aGtNUjhkeXFReWg5VXN1SjF6OFhTeE1EbWVkZytXdFhCR0pWMitwZGdlbDkwTWdIWXlLTnh5aHFBbkQvUjdialZEVHZ4K3prQ29BdENqYlR5ZEpGallnellmU1BFUVNhVzVkRnpZbkYvU0NSRXk0VlhOVEJZVWZGNTJyZW1wMjZqYVZkZ2lwWk5KVEdKOE91WUlNOXZlc2VraUoxQnMxV1lBMUgxSDZva1puMkN0UjJ1bWdoMzFiakF1N0hvTmY4MDNTWW1ILzZPRVFMMG9tb0tRb0xPeHJIZ0VoMjRNY0h4Y0p4eFI3eUJoZXRnNHBSTEJ1OGQrYVdNQkUxQ1RoeFkvTmwydUx5SFdxQ3QwWEE2dzczWDVUeUV2OWdKOE4yZysyOVNITmZlaEI2T1lPcWx1YW5wd2thYWFOR0xmbDZQb0ZKWGhWOUxLVG02Q2syZ1RrZ0gzZ0M1Y0duRGVtNFhFR2t6STl0YzlQenlPalJTRG1mZ0d4N1B1ZldCeEJ0dlc4MkJ1ZmwrMHNwTDRnelRKU3ZrcGNUOU12Q3FjbGdleW9CVm43L0xZYkNGRExKWDZ3U01LdXZObWNPRE9MVkxzUXE2akZPbkQ1a1Q3Rlo5TlpOOGJySXZibHMzU1A1QXN6Zko3cHdnSjZpL2dBSm1zcmY3ZGxLWmNFKzBOby9pMDVwQ2R2Qk9QWFVzNzJubTNyaFI5Z2xNRlFoMitqU2pnQm9tWGNLWWdlMnpzYzc4bS9aM2dWRWFWdUM5YnpvbTRzLzZQdUFwaG5sYy9wanZkeDh5aTJERUh5UWVORlVVRXVjTlFpNmV5dkVnVlFyeXI0V1FDeWNzQnhGYlg0V000N2pGVHJBRGpnL0MxWHY2VzBGTjhHNE5ORVFYNEVJSEd5aWR1UDBDSm1wVFliMzlUbGx2SnptSTFFelVScFVheUNNM1VhNEdqeDBqbnd4QzBaSDkyalZHd203YmNHRm5LbjNiQ1BkSUY0TzdKeHp5dWwxV2ZXMHZlNXQxb1JPRE1DS2dxTlY3empyUy9QZzRHMTNEN1M1T2xhQkJoNXhrRElEcDRSVG9yRmxiUnAvSXBmS3hGRE95WXp0czgvdmN2RCtnc2M5RUFCSlJGK0tRWTJOd1FrZS9KMEdRREtMVDVaOVc4UHprY3d0cnN3dmRESlR1c01DTVZWbzNjcDltemNydFJtZmFiZjhVNEplTituNDdEelA1a1hYL2sxYXNkKzJJR0gxWURPa0FQR3Qzb3ZaRjBKYnJWK1RPeUE3VGVHeE90ekp0K1FXSXNFdS93Qk16YzFKTzAvNitiZXVUTnRBVU5PVlNpWSsvb2ZlK2RIZlIrS2RxTTROZmJodFF3clNteWtYUXg4KytrSCs3amoyMWZXSC9XUW83bFlSbTNQYzR2T1RSU216TExkVEJxTU1NY21UbmdiZFhTZSszelU2L3hNa2ZQUnNkTHk0WUFzalZ1WDhOdWhPWjJKS29pRzR4VjZqbkdLT3BGbXhnUjI2ZEhleTdyeUR2Skk1Zy9Td3NvVElVRkdOTDY4TkcxVkVSYXF5OEU4d0pBc0t0dkp1ekM0dW1RNkdYblVBaGEzdXNjeEV2cndpSmdOejRIeFpJQnRFNTJBRVpCR0J0YitPY1FoMkRLVDZMWTk3dVJuVEVPOEpiczJzaGMxQ3djQXZ0bFZQY2lNSWF6SSsxanExbHQ2Y2lmdUVldFVpbmJhL05YZ3daR1ZzLzFmb0g3ckZvS0R3eU1RRGdxT0ZEMk9pUHZGR0QrYXh0Nzgvc09sNE5TWTdqZnlQTkU1VDd3ZFhWSEZHZFBDa0hUbTNKNlVjcFZST293M3lLbjFDZDRUWUFGR3pFaU5pTW5OS2t0VG9VM3cvcXpud3FtaTVVaEkxS1FLQzBGZlQwN096RlVkbkF6cnhkcVdOZUs0dlZIVXptU09zUXV2NjFsaTArWjhlcEFXc3VaL1NaU1hVVWR5dnZaT3hqamowVkduWFZsQ3E4MFNlbkxPTTh5dU81OXNZd080d2laWW91aVRlZ0lZbTdiTis4Y3NISW4ycVJmZTFQODNVNjExTTUzK2VSbEEyeFVQOTJaaG0vMmEzV1JVV1ppRU5GSHNjVnluNEppNnVPWEpFcE9EaU9MekVoVFd2dy9rN2NwYkxIUFlXbDV1Wi9ibGUreExFVk82bDdBUlVDSDY1cDJnOVNha3NHM3RRTTAzWHAzdG9LSFFlUTk4NWh6ZVJWTG9Wck0vTThhOHNuazkzMmloeWY2UWhzV0RhOXhzRFpyajdObHNwSWp1U1VzbFZWcjFDN01kMFFTaitXTW5ML3lnOTV4Wmd5SFFhbGZEK2ltSlhybHVEUDY4V1ZkRnA0Q0ROTDdWZk9WRG1NNEMyL0hoTDQwV1gvRTBvNDZDQ200cHU3c2VKblJadGlBTU9Ma1hJTUQ1L2pxT2pSY2I2WFZCRHQ1U1dVK1lvUXdKYTR2czk4UTdUbWxQRC9WYVR4UVhQTlBKdSttMnNob2ZDTzVIYlZxZEVOUGkxRXlRQ1kxcktZSjlSZ3VGM1VWbjdlYXNDNFoyenlsdkVaR0pVSHVTenNMdU9GL3JYUExXUFd0QjR5cGFCNkx5VU5pZHV1Ujc5MTBhQWhxdDAzUitJWkJzMUhHUEtIUzlLeEhMQ0R2cDY4L0NjQzdXVXZzYmpwUXpwL2hBODhuMENhSTJJektlWnl1RHZOcm9hU2ErZmtISS9XN2N4elF4dFV3STU5YU11MnhQeW9mOWoxRnp4clJnZ0lBWTZRbTB5NWFXU1FGNDBVUG55Z2R3ajQvU3dyZGtqcVBoL3VEbk03dDZlRU9SbkRkbi9DVTBUQ0U4RFZKbTV0K1RzaUEwTmhuZVJjTmM1WDFoTW1HS25pdlh3bUlXQVdNZk1FczZVa28xTDBiV3loWUoxNHlycmpvbGRSVlh5TG5VVFBpeHdrUzFTVmxNV0hvd2tVTnFrUFU4Ymh6VzN0VDQvY3d3YVk5dEkwdHZORVhXMitTWkdHeGRZd0Y3TjN1ZElQcFhjczBWclp2R2lUaS83UlBVd2hGcmRRdm5rZ3JtQytUUkhoN2k5eVpXOTl3aDlSZ1FuOEF3NEY4UmJNNWtvd0J0VW5NaGYxYkpjQ2hTNjFrR1BDZUZOU2FGSG9SSVBFUlJ3c0NxTmlpQ1lGOW1DbW9sQzg2THVVN3VOc09tR1k1OFozaU5OajN5UzRydGlCMU92dVNrMC92VDViTmsyYnhWVytMMHBZWldaMUM2L1NhZ0RFNWJnSnFEVlJhYmNtMEVHaTVqRlV3TmNRNlREQ1pKVDc3L3BudFMwb0JEczkrd3EwbUJTeENYOVgrQzhNdDcvZXgzd1RxMlBHUjAzdXlqdmMvNmV6a0lYR0gwMUlhRDR2V2JRci9iQzhhd3VMQTdRVG5VcXBjaWFOWVRvdnhDOGZYdCtsWFdlVllkR2JiVlcvNEtmSFpHK2dJL3Z3aDJ4bmNwN2Rxby96aVBVekVNT3VoeXBZOUNwMElSNkpMalVETW9KdHdKZTBGa1ZHV3hiM010NFdPL1pDQXZSc21HdDk5a0tJdVB0cnUzTU9abmQzQVUzcVJTb3JoVlV0Y05nL0s1MVVxSWgyZjI4QTk1d05Tb05lRUZIZ20zNXZ1Vjg1UStUejEzR0JRbm9sUVU2dDFubHRxMHU1S085YWR4TnA1Lzg1Z1NMZ2FBLzdnS1BnckRCdjNvK2k1a1U5RmU0MGdLWGlycEozZ1NkMHBjTm5MTUp2ZmQzdXlqUmtRQjNWUGJ5SmtyWVpaVU81OG9EVGZuU1g2VDJBVE9pam9JTWNyMXRMdjh1NmVEcFhNbGhoM2FwQVE1QmF2RjZGRmw3bnBXRDZVQkRCemYyYXhxZnRRTGdHWS8ycWk3aDdFUmZjWm5CZkxZU3phL2JjZXVPcmt0b0tONTFhODYxa2VZQlRvczJUY1hHdVdWNEtoMEtYUW1HVG4ydWp3ajlwSXRYWjg2RUp0c1N0aWNGenh5MXRKY244cDUwQTZHYVNSYW9ZTklOdEJ4Z0kwdE00TFpNc2RiWi9xb3h3YXJIbVhQai8wb1loTU5ESEltQ2VHL1QycEQ2MUJVbENXYVdmYjc4aW93eVAxYVdaNlZXbWtlb1B0VEdtb1I0MW1WNGJnT01oU2JVRlkrZkdDbUFYVEVuSzRic0FEUXN6N2Y2TDZ5SUNmYjFDUUJra0pKd21LTnJ2bkdTblpJRUUwNTRhTEo2OXN4dElEL24xZlFkQWg3SUJKZmlvWWZCUjlER21sc0dCYktTaDNTQ2g2WUVvb3lmOTlYWUNDTW9oeDlwanRTWXMzSkI2S3hLSWlvUTgxWm4ybXFjQ1puc25YamJjR0ZPdWRXcC9KOUMzZ0l5TjVmbW5zMWNsemhUUlU1MHhGdVVnbzdUeVc4UDRFb2l2OXhlL1gwZFRGZE52WDJHL0JXbUo2NnE2WkV2YnJKR1ZyWkkxcnAyNHh3Q3R0Ri9MbHZ3VkJkdUtTV0ZDSzNJUUMrL2ZRU3pzd2FITURuRjRvcllmVFpBM1BUZTRtTG8wVWluN0lFV0JoODYwRE5kKzVtR2M2WXNGbllaaG5iT25TV2VYUEZDbEVvUzFBTVc1K0ZKTWdSbmt5d2padkhWVmlUWDhuaHdpanVZd0R5bjdQeW5kVUVDUWFpL0FjY3cvb2w5OC9zeHA4bGZQQ291MkdGS2JpVVFQZVRhUVA4bU1kTHdjYXVlaGJ1Tng3RlJPRkRQNVp4NmlGWmZ4bkIvUDZNMTFBYkMxNDdEeHhGL3JmbFQ5Ylk3eFp3VWE3MVVNNXgxSnZ3ZTFkT3BMU25pUTRZSjNrSW5VUXNwQ0hVQm84bGNXdThNbTRMZU1lMk44OFZNU1B2Qy9PYk1oaFpwUjdIMnBqM280UTZGUGVPbEdWelpJelFSYzNNaDBOM3Rkdy9rdXhRQjBGRG5OZUlIQTZ3czFmVVIxZU9LWmR5QXh3MENxTFNIb0YrejJjbFU1UlJ1OFYzMUdOdEhGQWNmdUZ0YUF3TFdYeWVlZHQ3UmE5ZnVST05hMFZ2Y1NRSUc3bi9QMDNxWitUMDUwelUyazBLQnY4SXBJRndTWHg0Q2tVbU53TmZ3QlBIbmJMckkrNzVWQTR3WDZYcFBiVTFjQWcrUGUvNTE2VHRwZnI1Y3hlOWlmZkFVaG90bjdWQTNPcVhpdGk2TXJXVE54ZWNPNlhVUWRBa29sWEpBSlNBTnhYMnNiUDgwZVZsa0lIZERESmxVdGg2KzhKdVhuTXJsM2ZnZnhOWUdnU1diMDkxYk1NUDRwMVN6WHBNaEVpVy9mZTdQS0JvMEpaczJNUHlBdzRkU1dFYWVzQ2lMd2MyWG9FNS9CdG5MMmpFUXJuTDhzNXBrdmk0K3V6QlJEcXZDNG1ZSmgyeDI5b2FQRzlobDREbThqVlBsaWtuOUNPMzI0TU90ME1aUTNlWjZpcC85SHJFWFNxL0MvZmNJT1U0Y2ROUFhHdWVxbVJzS2pkdjFzM2JkTzFZWFFqcmcxUjZDb3k1V2tlM2Fuc1o5bWlBRHU1Y214MWU4TWliTHorOTBBOW8xbSt1ZUpTNGpnQWd6blRBQkpqOTlaZGRJb2F2Z002UkYxblJxZC9CVVNMWFVVK0c5UGc3SUJ3ZzBVbmxXdDZOZHlJNmdqVHgrYWlNM3p1UHFvVll5cEs5SjcwYmdhL3Z3NmNCUURoekFnaVFNOVV1RU1wN3Mzd0xCRWlPeFAxVFgyUWNtNklYNXBudHAyZmF1MEtvcWVPY1VsSG8vWXRtMEZNcFlJSURGL29jOHptUjE5NVg4Mk1IWEtCMnoxWEEzUzVCZGVpQWdJNG5UODBkQk0yTnVwY3B5OUhOT2Z5LzdDUTlDanF1ZE1yUjZmcW4rbklld2EydTNWWnZqbUF2cUJkVlJOT3RabUk2bGpBMmljd2F1SXhBZWlFNDJDYjdSTWpXdE1RR0JUUDN4dE8yamdyT0RpU1E3aDZQMFpZTmJvSlhnbFo4Y2hWK3oveTkybUJOQkNycGxqUVYzVGhwZjJ2RDJLQk5UamgweGgrWnoxSFdYZnNEdU1GaEJ6RHBrS21IZ2hGemVPb1JBRk4vbDFJR0V2SExPYW5RUE8rd29yV2R5NFVYRGtUelpOdGtpOUtmblNoNjhqZWJHTHZlTzl1K3pQK0wxUDd1djk5OVlzUXFKbEZYTWFsY0pmdzROeE9YT0FRdk9jYjFjcHBEMVFhOHM1T3AxMHdUbjZsdmpWY1YveW9XT3B3c3BqVDZ0UmxtbTRsUDFjbzErcURXV09kRU5QekpnMFhmaXZrUUhybG9TQ1I0MmY4TzdSWTRRa01oNmJBaktvVFEraVVBRmtxb3Zvc0JkRDJrZmF5QzJ3TWZPSGNJWnM5WWNKSE9Ib2E4T1RwZlgrZUFpUE9EZFZ4QjZKRFRHUFNyaXZmT1JjdUt2M3dUNzdBZDNxeTl2bytabGpvcWVKNTE4NHZ5cFR6SVE2dXRZTCtvRm1wWnRpN3VZMVM2Q1VLMmVyOHN3ME9DYWF0TE5FVXBzREQyZy8xSmUrZlNOdHl0eWhsVndweWpGVTByVFNVZ0Y5a2ZuL0NQNnVFclNvQTR5SGxaVlpIeWJPQS9QYmw0Vkt0SGpVcW95aGxyQmMzbWhBNHVSandJT0RHLzlFZnVFTzd0OXRUb1VnT0hZODEzVEI2b0F2NDVQaUhlbWU5L0FUOVIxelAxN3g5VVpzZEpxNlBKQnQrYVpXNnpnc1IvNVpWNXRQL1dWK3ZJZzBOTTIxZ0dnb01URlFYZGFJQmJ6MmZJNkxsY0gvdjBGUzZGODBNM1Q2Y2dQQ2NON0RTcFhWMjM1Z1Q0Z0tTNHdwdFU3S0dWVzFRRnZDQ2pZZWcxYVBrSzFwa0c1SnpSb3V1WWR1aWtRZzFzUWxlSDVsVkdoMVQ2bytWWVZVVDRIcm05RTFNYUxYajlweHYxZEdHaEs4OTRMUk1aVm9vdzBTeEdDdVNNaGhvN1RST3puUmNGT2FBRFQ5RzNwTE1oc1JGeml6c20vQkxHTnkxbHRoeklEbmRSTFY2TmZTajRKYlZLc2RkZDM4L1ZDL0hQVkpaTklBcUM1SGh0U1V0Q2pWSnlISno4elBBTnVkWDNWU2FQcmp4ZjhuU0VVNHJISm9TVjZuTlBaSDFvZ2MwTVBGbmVreVFlVmhic2FicGw3c0VqR2FUdWZyUHM4UEVGVzFQc2N1OVJGR1NzaE1JR1pjRXdRMVlMcENCUVByN1hUME9vZE1ZTFZZek5XdmtFd3RHM0UzbmZncDFRNG1zS0src2I5aHc5UUJPUGNGYnhEUWpzUGRVRitFVnpaUUpiRWxYeGZudGNMaklSSllKMkl2WFNMZWdVWXRnNmtETVBqRkpzalZzUERibVlzL3hkSUcra1BmNWU3Tk83QjNoaUZObXhoSkh3KzAyMUE4U0x5aEoxTEtXSWlTVjM1L0s2VGxRUStyT2MwcDgxcXpjTCt2ZUw5WmZsYVNLeW1yMW5IeEZoZTFHaHA4Q2FVNFg3dTEzS2UzdC9yK1UxQmM5NzlETFIrRjNROS91SGM2VHZ1bld3UXNXZUtEMkt2QXMzVW82ZUpVcndOSTFBUXhBVy82L3lFNHRXT1gwMW5hcm1iSXFjSGU3YzY2dGh0TWloV3Z6a1djNytGUThIVjdHNGw3K1RGbXVQSHRCYTVBQmt3QW5ac1p0S2Y3NEtPUnpvSEgzWlFnZjJqSGVPaXQxMUNzbTJOUzBVMlZjbUlVSmJJaEJZdGQ2S3Y4ZDdOeDRUeUNvakwrcWFIWGpId3JIeU9MeDErdFA0RWxXbDRLdzQraXBiRzdUVk1rd2RJQnVhSldiYVVNNDZWQ2Y5ZzBvNVFiMVhwVWFTbFhyRUxnRVQwQU5mMFVJeEF3b1JhQVdTS1pidklKdkxkQjlaOGxRanh3UjEzcUorOEpDeWpSV1orS3JzTU5UT0pnN0E2QWY0clQ1akJTK0hnSE9zdW1ydENJcko1Q0I1K1JKMlMwMUtZVjNkdmFLc21UZ0hvQkdoMERpTkZIUkhmZll5bGVqN3lPTDdXdThyR1A2WW9ac2FNU2R1V043UHJzdUpQSGdUSitRclNwNXEzMTVZMHBDUVlsNGRlOWJ0VkxjQTBESWMySytuWDEvZWg0d1ZnZHlkWU9JZVE3eVRlbUtENVpRTmhySHUrbFlNNDZDTmhSVWw3Slllb2lFKzRsRWRPOG1HcEwxVEdjR3pKMThMWG8wbzJJb2hGS0wrUHlKbFJkNC9hSXgzUGtSUDYwVDVLVUoxdXlVMXZXbzR4aGRZWFZhcEFMbEJJWWt1WUpEaU1yS1d5eWJRZHFKMTl5YkR5MitlZS9mVzBPYTRZYkdLT3Exa0NFODVCYm5VVmluNlAydGw3VHgxSHBRbW9iNi91Ymw4aFE1dVYxK3gyeGpHeVB4b0ErSnMxWGhJS0M5SFZTRTAwMTlmU0xRUzV1Zmo5OFJVWVlxQUN2Y0N2azRyZVNObTdYNWwxTW55ZVNEdG4vSFhHdWU1Nnhta3A5SXo2U295RDI1Zm5pR0xEL0ZZa1dCa1JvZkc2dU41dHFWbHpRWjgwR29Qck5JODJLT0s0aXoya3hQR2kyM2pvZUxqVUdnVGZlenFkRWttS1hFY3pjaURBYmRtUGVxTnNaenZxbWZJZlhiUWxTK1h5Qk1rR0N2TWU5WWNHNG1LRnlSQnlXNUYvbHF1cDNyMGZob3dXSzZYR3p2YmlDUzJNYW1wZmpJdjV2SmpTK3dHd2FaMDExeFpxZE5sbFVMUGd4QmtCT085Q0Q2b1M0NVJmcFV1cmp4UnhINzhsSHBvTk5ZLytUMVZlQlNvMDZuSHJ1WENPUktJdE1YNkg1YkpaYlhXWjl5T0VWYkc1V0hXK2d5SGtwdEk0QlRsTThmYk94SkRYTGxRTm4wd1lReEJvbThHcGlXS0NWNVU0VmNMWitFb0c3YjJzRFd5dG1vQnFIT0NEWVNKd2svWWR0cDBYd2liUVVOMXpTeTRZWGdmRHRwN0JIcFNXb1I1THpDY1pabzlLVlFFTTlvTEFvR0krU3EwaHZhMGJ5V0xWWmpBOWdpa1pHa0gwMjVOZkw1Z1c3N0RiWTZpSGRvMk8vZzlCSVk4L296bVZyeHJMSnVaSnBvNnlIUzJreVlMY1o5WG5hcnpNcE8zWkFZelFBanlEdTFUeis0czJaR1VWekJaRjZTQm1RSnhaNjRMdTJibUZNMnNlNlE5eklScDBLNG1iNUJLWXFKZHFlSEhhYWhRMFRyWnFyNXpiTVR3T2VvbUZRTWg2R2VhQlF6bjVFck1PUEpYL1B0WDhvVWhGQXZQNU9abHdab3d4b296U2d4OGp3NFZSbFJSWkRISjBTdUdVeEFGZlI0cjdZekM1emdwaVUra2E3UFd6L1JyRmEyWi9zWGRRZTBZZWVVMFgvTVNBVHo3dlJ6MEtGaDNLdG5HM1JKaDUrbFpsTldBSlNWOGo5SExQc053RzZrdUNVTjNwUCtISThQWVFKWjArVWVoV2dzeTI2S3UrTVBuV0tZRjF6YWd1dTM3SE50SWFEd1RSUUowdnNLcTNPRVRNSTluWmZSUUptbjBKcDhBWEE4d0IwOHhuV3FxMFgwKytFdjBiWlRPZjBXVFZ2aFJpZERkbEVzclM1V2ZxakF6TUd0U2h6VWd3c3NPQ0E0L0RsNUlPM2VlczNnTU1aUHgxZU9aVWpNQWJXZ3NGRHR5amNlVk9mL0VyNE9iWkpjNWsxRDNaUmMrS3lJZFp2bCtVOWx4OHpBMmlYTUZjWExMaTlYdVVuY1h3MHRVNU85RStUMHlxaWtHcEp3RlRUTW1qUUJuc3pJL1BMSHNhM3FPSWVCSExzWUJlZVkxTlNuZmI4cTd3cVFNUFF3NDBmdHJEV3pnUTZpV1lPRjMrU0k3L1pmUFRXOEdXVDlxWTl0V2R5aVRkMDRnRmJQemtwWDdQN0VSdU9Vczdpb1FRZ3lpTDcyeXBlb0E2MWZvN1R6c1FDd1E4eHVWT1o1bXFtWnIvYjBhbVNEVkdNTmFZK0gvTjZ2dWF0SnhCbXNOVkFKaTVDMm9OMTNoTWE1MFlNVlg4ZnFoajlKRTZUcFp4SGF1U0p0ZU16aHVmbXNlU0tzbDJ5cjlOZVJGRFJXcDlPRnhkalkrRU5jSUtNTXorTWViMnF2RFJYbmxtS3NFcHdFUDZmdUdnV0ZxWWhwbVp5LzRvbXdPQU5kQktabWVkN09HRTZvUGE1UG8xZVhyWmZ5UFpjWVpna1dsZW51UnJpamp5U0d4bjl3bGRrRnJRcFphWjdOejc0S25SQ2pETm5yTGo2ZEdvL1dtUE5KeFVwcFBDV3FrNFBIejFmN0JLMUlxZlZPRGFPWEdvT2xkbmFlV2NwSEczYkRvaDlDbVY3c1NOclRaN2gvaEN4bVBObmRpT3hhWTdVSDRqYUl4ckM1R3dQQ0ZRZnpEcVE2dnVkbTN0TDQ0Q1dhTGt4QjJtMTl1bnRLTzEyZHBISkxtc0FicEZNZ0I1L0xSYUN2ODh6SlI1WktCZXZZRXQzSjZiOHprZVVUdWRpRGtUOUpnK3hZMk1PWnE4ajBZVGthbWQxMmpMWktYYkYydkIrUHVCZVJCOWlJeFQ0NDcwRENpQTlSUzExeENxNDF0eVQ5aFAxZUw3aGE4MXU5TzgveS9Fai9KeThrU3phN205R1dVREVDbmxCejJhcy9MNGxnYWQvWlZvTEtVdUpWTURjY2piUlZKVHliM3BhWHRKN0cxYjRKd0liZUhqOERPRnlvekRjL0h0RVp1eDJWWmhYbzVXOW93TXl4UFpsSFFOOE9DZGVBRXdOQ3VGOURUWE9CVzhnVzU5elNZcU1uZnFPcEpwcHVMeWNQRzVTSE9aTEIrOVpwRlVnMk9YVjRnNVZUaUlqT25BakFpSHM4UzEzS1RJUFNHMS9NOFZkRDBhME5zR0hGYmhGKzNoVUtHL1EwN1VOM3p5WWdlM2FWU0Z0U21nODBWeW5pRldSUXhqSXBDUWtta1MrNUIzT3dheldaRTJoYTdmVldZNEtkb3RLMXVjNTZ5RlFnVG5BdTc0dC9qMkxjdW9ZeW9JblBOaElZdVNEV1B4aVg1ZjE1ZmlJYVhQL2hEUGxpUlhhSGJ6QmhFT3V1eVpmV0M4OTNseSttaTYyc2h0aEUzQjZJUWhTbFZiS2tsUDMvNzJycXRRY2dZcEZoZHpnK1NsbVZCVjBObExiclQ2WXo1bzczeGtkdkg4K283eURac0R2TkJyWWhxblAyOVIzNnhQLzEway80VFFBcEZDOHppOFhFS21LQ2RnNjlSR2lpeEhIVEFJYmh1bmpXYmVPdTlPUTZIQk43dXVZSGV0WWhJRFhRK1hqZnUrd1lraENmUllaOUVoQ0hoVTAyU05yL2h0MEI0OW9VZFkzR0RsTG5pQzJxR2N2K3VYQmZRMEhDbnI1Mi8ydk0vSWJCR3hCVWVzMTBLc2VtRnFiRnRhR2JUa01hUzE3Q0k2ZEhHVkU1dm9XMUNSQjB0L1p0eEFxNUtwZCswVGRLTTdhYWE2WE80S0VhM0pwbVE5R1RyZmpjZXd5K09XbkR5NlBqM2lTMndUYVlNeWJEQlYrMVVCR2J2bzJRU0R0blVkdjN1ZHc4WENpNjVmT3lORGswZWtGQkxZTlZScXhwbjBRNEsrVE9oUGZCQ3J1ZjhZUVZoRm5yNmZ4NnBJYmJkNUFuNDc2NEVGNEpINWF3VmIyK1V3TWJDSXNKRUt5MGExQm53eXRpdC80TmpXQ2Q5MDAyQXpFeG5na3ZmMWJVWXZFcFFabG5taFNoQzBuZmpWd0Vuai9TRmF0ZG5qK2JXZDRjM05PdWhkRk4wR0E5STYrVXJJakhTZFcwUUF1MnREV0tmQVhIZk9qaFUyWkxaTGlQZFUwb3htR0l2ckdrQ0NOTjk4bEhQeXpRYjJZK2syQjFOTGp1VGlpOGIrajhhYy93K0grMVNHN2Q3b3EzRG9QYXViSVFZSFczQTI0K3dRM1hjdmt0WERadXIrUGRoUDlYUE5zdFlLTkJLMHRxdVZPNTdjcnBzUmNTNTFSRUVkYVpDSTRwLzFLdk1pcXgxNTdGMVNGNlpNeDJsUldmOURHTUk0TzByamdWMzVoeFlxNk1vVXd4TEsrenBhMnhLMnZuYjNrcVNtVXIrdGdsSENOL1dTNHpKMUxwc2Z0dGttMWIyR1RFbDl6ZGtTYjJJeXNsVGVFQ21EYVA0MGozV2pvNmszZVNjNUVXWmZkOWN5MzgvR3p1WVovTmtISFJndFIzLzhSWnp6N1lkYktUNzJoOW1icVpaNVE3aXQxVDdya2haNkRlN3JiS2pPaUQzMUZqUmhPRENPTE0xN0RVQ3ErWm5QS1p2RzNYZ0ZCUjZXV3ZpRVlxd3pOVWtwMnhIN2hyRzBCU0FXZWM2SW9MOTBxRS9jQ2Ryd0syWlZoT3crMFR6VFFSZkpoVzh2bjRCK2poN0NGZk5mVHEzSGk5RmhWZ3VKcjJkeGlya3U2QWZpbWlWM1ovRFdpMnJXb08zek82WnNRU3pja1gwZ1JWZ2F2eUlhdFpmeHg4OEk3WmVtRDBtNllkUmo4YitqQkV6N1RNb1c4Y291NWRVbStjeTNNYVowSC9WRXR6SHExTCtQdHdIRjhvOG1RQmFnMGwzSzhJWmtXSS84NlgwU0ZBcmdnTlRUV0x3RTFZL0d3Q3I4dzM0VFZpL2VPRUJhVGlVR3pUVldCUkVnNHV3OVRCMENHZkhvRXg0Mk9PdFJ3WW1oMVdDU210V1pkNWV3TW9FMWxjcVJqRERLNlBaeFQ5Y1FCRGI1WlFPeUFhQ3ZXNUV3NGxnS25uZFJmWnJ5MGFtVzE4RzJkaVJYZHZJdUhEbk1ScSt0VTNjQXZBa0E2cVBrUDZGbXZneGgyVEhTWDdhdlFtRDVZYnJ2VnRCOEcrWEVWSjNrWVpXbU81YXRBSzRmdWVVUEZLalZRdjlkNnlaeXk5cVVIS1JhOWVRUE1tZWJIeDVkOTNWMGZYZ0xZQm1uTWdoVEJYOTd3MXZFSnQwTjUzQW1Sd2tCWXgzS21raTFoeExhY2NnckhWd0RtdEcrQ3Z6MnVCTDkrMnp4UDRtTDhPQ1YxWDRDYnhUQmVKSk54Wm9tbXdYQkM4NEFQYVJ4SEFxZ0MyU0dqQVdaSXdHLzVlbHUvemF2a2xhVEJqcXptZk1JNSt3VkZ1b2U2UDBORFFrQmVWQVM4MVJRQXlMS0luTmI4ZlozMWZ2V09WN3VaNm5SWHdJVnRuL1JISFRHbDhSNlFld0tCKzd0RXliTUY1Vmg4bzlidDdKSmpOSFkzbXI3ZGhzd1VNNllxL0I2Q2NHdHYrdU1MY0UwelJlSHlYaURiZ3VoelFOajIydlN4SzU5OEMwVjBQcjJrdUhjVFJ3U1FMQk0xRXFqcmNVdGM0ZXRUa0UvMllsa3hLZlFSUmhYRHRDMFQ4L0diNzdoWUdRbzRNa0phbndJbXZoNVlTb1hZYWZCeWFrQ1JhN0RvM25HR3NteSs5T0tkcldDZWZXdzF5eXBXQ0FieW9KQUhZOFpNTXh5ZEtOaG5DV2E1NStDSW1UcHErRzAydXlMa1hueEpGNlRLUE4wYUFOUEE1ZXZMaFZFQ09la3UvME9PK3NER0FKcXZFbzFvQlh4endqbytTNGJHTzRLZU5LQVFlV1oxaml1aGY4YmMxank1aFJzWFU1LzNxdzd3OXdMcjV6L09GMWxhcDMvSGtWckRYOXJVZWxnem95WGloeVZOVVJqeHNyNkYrZXBNaGpUb3RHRHo3ZjlHck9nckxSSWEzL0Iyd1Y1blZFQW1PMDlRQ2g5emxzWXB4Zm5LQUc3NGJwVm1jSklLNXcrbk1kTUpLSnFaM0RLa25EUGVBcWVnV2NaclBzTW1EdHEzQ3QzUmptK2hqNk5TVDVyKzZ5Y3pmaXBkMVBlZVBSbXlqVEdISE81VVRWcmV5MGk2NWpKbnphNzFBelBod292aEFUV21vUWVROTRuM3ZGNDBRYVJVdS96YnM1YnJ0L3R5RURBeUlJQlFkTG5Mbzl4S1BJT1VvMzNqajlZV1lqNE5INjA4RHhjQUpsbVYwUzMrRmo2b0hYeldPWFlYWXJuaGVtQjB6WkJUaUw2UExhSW9UYnRwNzVEa3dWK1M2QmZ3dHFEM3JVR2dYekZoNTNudVpqRlQ2S2xRT3dhRVlBQ0M5bTNzNGU3MGtSdk1aQWRud2FVYVcxT1RQcnliTWpOaWhrSUlGVk5TdHRPdmlaaDlHS01PWFRVdWJjMnJXSzVQOUFGM2FkUEJ4RGhRTXZad3NSakZTV3cwYzIvaHVKRTdxOGNUcEFkaDRrZEtaZDhVbHljT0J6TWd2bUpEMmFpUXZUenBCbSs1MnNuMUNMQXRGYVZEWk9vWGl0eHk0Szg4b0hKWFBqUmZNemRCdUliT2kyUThrTkN0TjlGenFCM283WjgzVGUwemFrcFpxQVpmNEhTdXJJVDVyL2tjS1hhNXhCK1FPd3NBeFkwbkJyTGY5dG9xRnBFR2c0OTJxUXNUaktwRGFTUTJPS2J6YjRHYUJqVjFWcC9oaVNsdGFqNFFCcitTVGlqV01YdzJaellrd0RFOEFqa1JIb2hpV2tPV1c4dTczNzlFYmlpUGJkSnBqMGdZZkRNOWJSZ0dyTlkrY2JZMDE0eEY3Nlc2WEU2am00Q2NuVVNWQVdqSUxCUEJmV2xVekV3NU9qSG9DdXdkbGZVWUc0dEx4WGVhMzVYakdBUFVHSzNhYjNDYnBFcmIzMStidkwySDJaWUp2R0c3OWdJazlobUhKSWRaS1JjTkdJanJVSzY4YkxGSXAvaHQ3N2dia2pZZ2JBRTFEQlI1VWpvSnB5QjQ3RjBwTXBCb3BHN0hEcnQvRzVLSHZncGo5c2gzbk9za0JZMDNqbDJHWTBqRXc4WDRPUUd0N3Vld2kvWGRka3BudlV6WmJ1MDVMVGNjWTI1VGRRMEhuSEkzamhVOWh5aVg1UXJWT0hnaEJ0dTVSYVhvb0VFTnlCSVNZakZYcWtMd1lVaVdqMWFMMTY2M1VqVnNXTldMbXdHVDg2cmZDQzJ2L2RqbjRGYk54OVhiK21JNEU3cFF4OE1YVzA4WUUzeVpWS3VWVDk1S0t2L0pRQWREc2dud0FSekxTNFVvUTFxTkVWU2ppdDIvS3gvbzNqVmpRRkVKcUFINUNwZC9zZU9wbTFHT0g0QWJhenVGam94MlY2S2YrQXRlditCTkZuZ3VNVS8rUjdaNFhpaUxWT0NOQVBXaEV5L0l0VWVZQmZqOU9GRXRlZ0QzQVVmR0x3Yk1HN0VTSWlrZlpXOUZrTEtMaWpaVlIyMmFONGZzVHQvckUwQitXYlVzSlhleCs1V2ZrMm5EakhqYSszMHltczAvdDNUZG14WTlGMmIyS3JFWU05a2oyVkZzUEloeWVSaUd1K2thalhzMCtYVlhVT2M1aFdlYmRLT3hFdFdaM1E3Yk9ER1gxT1NocUZTUEtOYTZHU0F2ZXJVS2NMUXYvVUMrb0JtNDJhNkVaRnYzZ2lpU2JiVThkS3YwMkk4cnpDcmxGa0ozQlFXdENZN25icWFOSWFpcXNVWU5ScWo3NElwK0VxZXdvelB6K2NjMFdvZDlPU29aOWFpa2VjdlAvMjFOY0NOeUhTM3NBN21yT0Q1dlhuVm1EU1dOVU9lMGFhbTNrWGFaOW1yVGovSlQ1WGtEdXM0Q2FZb3F0QUxETkl4SHZYZEpicWxodkhLZnpBczNEbGsxVUlTN0l6bGFjYitFazJWd01WSnR5dlNFQnpxS0phSjRnTlpOS3ZyL2xhWWVlcVNZbStKNXhUTEhBa1lyVUU4NGFPRnlZUGkyNUdzWGNsOUwrVndvYlQvZ25GNktHOTFsVmJReEE1MXBzVVllRmpvYnRabzF3dElPcUxPdjFpNGpqT3FHbzlHbUpudW0zNnljZzNOMlVBWnlRdUE1dG9tRENxVVI4K2FnOU1PRVBIcDlOR3M3bE1pcGZXa3grVENJZFBFcHBYRElZMk5VelBDL2hMY3I5ZkJ0WENMQnN0aWVuaTNWVnVNZnZmTXdXaUNUVld3TTg3R0lhRjhWV2kxc0E2Mk1nem1OWWl2NDgxb05SV2xOdGdacU8rejZsQ2l4cG5tWVhTMGREMk05Y0ZseHFZa2lDb0lpV21qY1JLclpyVnA4OXI3THJHaWVrSUdDS216T2VzOEpPV1pmRDl0Y0xSSGJyQzBEeGZReTA1Um5SNjFOV0dpOWZVdlcvaHFhM1VlbE00Rml2OXZ3RFVvb2UyN1JUcUs1cDd2dmFSYTcyWGhTTzhEU1FieHVXVyszbGJWMWdXVWpZUWRvMDNpeVl4RytENVFZWWVFL0JmaVh2UHozZytQcmFaMU5pSko0VnlIZEFUbFRXQ2lJems5OWh5QkVmM1VOeVF2OGV4L2k2OXRkMmNaeDdlL0g0ZEhmYWpuVHEvRThFek9vQTUyUit2ODVuY0pzTUcwV1NPblZ6azdGZ2tqdlFPM093d244Q1IwS3RqbUVpcCtwNzBQQWhnWGRySmVYdnhwdHNrOUlPaGp1aE9ZREIzL0lNTzV6enlraVVESUszYURIZzNMMUtma3NkM3ROd0tWVkhCUDNuZStEMnFWNWdzbTBCUUY5QzlBSnlOSkRBbERlU21MSEI1eFVXbVdkaThydC9TUENJNlZ0UUZMNGZod201YnRkS0l3a3cveEk2Wit3SmNQRUx5NXk1bU9zQjh3WTJURG0zd1Rvcm0rZXZ0WHJEQ21uWTMvUmlwZkxJeG9wditCU1RlcUlsQ3pzaTJtYWdibndGQmN1dXJ6ZTFpL3ViS0g4SlBBVldjSU55QjNna3RnZS9mb3ZIMC81U3oyd2h0THo2U0lIQkNHa2xmeGxwZkcyZ1RPdnY0d2hVcEVlUlkzdVpzSVNxcVlYTXZXWWI2b05LQXNIYlJ3dUgxWFByOFdiMDA3YVhtUVBqOVZYKzJ3YnVDQ21hcDMwVDBTMys0Z1B3OFRNOFR1SUs4N3lFRTZ6S2twVllQZDZtbkUwMEFPbm0rVnZtNVNneUJXdlZIL01yRHZMMGFVMmoxanRyY3R0R1lDWFNVbHhyTnVSZU9pVlowTWxrOVpvd2ZhamV3WlRtWGVFanFGZWFnTzhzSi9tZXM1eUI5QndZUkF2MHVYZ2VTTXdDb3dycjczVmcxME5kV3RIdlZMNlNyVm1XVjhiRFhmam5iT0VjYzB4c1Mrd0V5SGdkRDdwdTlHT3Vod1UvM043RVZxekxwM1Z5V0d2aXJOTGsvTS9VTEVESnFCLzB2SllaZzkxMWhYcGppWGZVZWNoTEl0R1dMdkYrK0ViYUtEZ255Y1pZUGpaekJ4M1hGYXRRYjNGSDhjbGtwQmtSNTdQUWQweFhrQjRNd3grNEQxamhWd1Bhc2FYTGxhNlRyZUt1UmVXa1R1bnU1TlZtUktzV2t5RXEwSS94QVdFMWcyWWI4ekNSNmI3clJUSUt6alVzVndaTXZ5WnFZMXNpWG1FOEh1S0V4bjNLMWdqK1hLaVplN0VadEJOTVJwTEhadGFvUTgzaFlGZVJBZFd4U1RERGlBdWEwcm8wakdXUUZHUkhmcnNqZkFSbkNGb3lyT1VTUGVSNzc3YTk4RXVQdm8wSDhMcXc0UEtRWHlNZzNEdDRTendaYjd1K2wrOFkwOEZ5Y3krcTFyWGRsbndkN2I3QVVINGtPV2xBNEhFYk5uZUhabFJBNWdxcHpCMllKcGFFbUdnTE1rZ2xVdDkxN3M2Rzl4MVlheGZ1WHpzSlUxWmpnRWJSRVB0U3RTbTA1aDdhVDJBQ2J5NVpmUUdEVGRqekRWZ2FNelpZcFJFdVE5aGd5OU4ycVFMMmVoSWljT0hsMTl6b1NoYzVlOUFKR3BQRFpCOGRhdzJkWlBQd2pDcjdaalN3Q2pSTWQ0bWlNYU9iZXQrTGFLSDdYWXJrNXc3RVJBdmJSZjM0eXBoTlFFYURCNnpqVWdadlFya05DRldoWHZiS3pNRFJzN2dHVzJEN0J4Z3o0enNiTUp2cVlLNmg1ayttR20rWHV1L24vZTBBSDdweUFVdzN6bmh1alVWVlFjNFFkNWc0bk1xVVhUV2RkTWRjL3JrUitQN0lzZ3FWZnVWd1Q0d1VGR0hGL3ZMQngyL0Y0RUdFZGlJWGxSd1Z4TFNxWExCUEhGakFxbzlmOUtkMXBQYUI5QldoN2FDQ3loTWpBVmtsenBmWVNzQTdkQ3I1T2dwbUJROW9MdWtaSVlFc3NXN3o2TFpaWHN5OFRsdXFSWXFpVGhDdnRSZEZlczNYbFlWTjJEN2Y4cEVnclVESlVpa0d3dzBhUVJtaldhZ1pPNU1Hbm1CaE81WGJQRjhtWURBN2pTSU5QSXZWNUd6WlRTL0R0VkJndDhhckR0UHdMQ25ZZnJxRldLS1lnZmMwbVBPUVF1WmkrUWl4TVZIQTlmS3UyTm9WNCt2Q3Yrck9SVnhSNzVpQmw3YXcrRkJWZ0RGNHdpTERrNCttMFVNSUlqbkZiMm8vZ3lFSVdUcWdlMUc2TTlsMGZHUGxnM1ZvOUV5NSsvZ0JOV3cvRGtoL1lYNTBYSGRJU1BGQklETEpENCs0KzJLejJ3R2JCaExmRm15N2tjRmtpTjJGZm1VTGVDTHkvVllZazRvOGFOT1dXSGVSd1c2dWFoUkpNSUtnRW1wWEVJdk13ZllJWDlidEdwTS9kM1pJU1hqMEhJL3EwT3pSc2FWRnZTU09CVG0yR01MZStUbVNSTHFLbVF5UEpBRXZzQ2ttZFBteE8wNi9aK2hnZFZsWFBXVlhCNUlwYWtaUHFxbnAzcHV4aEJjTCsxblJzeVBOZHFvdnlLNUZVU1VTeHVVY1JJOExSQ0xqbGZPcFdCRkpjS3JoVTRnSnRjMkV1bmpYWWhtTkt0eFlvbktSQ1l3cWdJdXNHSWN3V3NyZ2ZwdjA4VTBjeGE5Uyt2N1NERlJTMm9zUGdLaEVKQ3RBQ2hjZHhQRGo0bk5ycUpzMHl3L2swN0oyL01xR0JsOXBCc1FhcnVKU3VFbzd2NURiT09taVNzTmlWRVh2bVd5d1hzSytaYXhzRFpuUVArbTlGejlpdVBXV1JnQmluYTdqSUNVNmhWZnJqNVVhOFN0R0hUV1N3OFJkZDJrcUE2MlE1U2NmaEVtbnZHT1Z1amJOenJMcmdBY0lzZlNQa2kzU2xGS1p3bjBEdFZWVmZkKy9KSVZYdUVYNVJOZFJBQjhXekpna3ZkSG5scjRpWnBQQ1R2SS9HaFpXQTN1ek5XVFNkSzdtWTBscCt0alRnemhQc2tRbEpQWEtnMHFtNGdsQWxyT3BrWmhCNjhFS3F3UnBkQ1hET2dtemxGYjNqeGhRcU5tN2ZzZkN6NXhSQkdtL0cxWDFDdkZKWTBJQXp1eVVWcjhxdXZrYkx2T2FISHdlRzdPWFZJTHhBS1dYZXVvVEd1VDhvQTMwWS9jQ3RHNjR6aytnbHJRTXV5SWFWcWtvNXRkVjRBZ3JJak94a09vbEFjQkZGRU9MdHh5M3pHMjdPUXB0VXFPaVRHSXl5NXQ3Y0JkdmxoWS84OTBESHllMWd5VDAxbXErbUEvYW1XZmxBOFg4bmlFSmV3NStNSWNMbGFiejJ6NWQ3MC9uMFZzdXdGc3U4SGhwV1d3cVpwRG9ucWl4ZGxiVUpONUljL01UdzhnNlh0ZzUyRGV6UUFQa0JMNFp3cHJkMzJLYlhrc1JCY2NHS0pPNzYxRTRqUnpEN0l6UWZKb0NBT3RzUmVDRWIxS3JmN0NqSDVqVWViWDJNNytzcXVZWG1WMWQwc0o2OXNMQUNzRUFKZ0JObHB2SW9qVWtXeHdvTEhjWEVmdUY5Y3I1MWNpNFJlVnUvWm43aGdnbXJSTXlRM2E2azRyN0xqL1lTQ2dham9RTHI4VldxRjE5TTlLVVREcWZqa3kzMWFsUERxMDV0R2JRbk9SbmYwdnJJVXp1alVFR3lPamU0aWhGOThEcGNjdWRlN1YvNDlxQzJJR3NWb0M0WVpXeHBlRVpJclEzNVVvZEE1WlNyM00vQ2dXQ1BKdUt0WmdFQmZMbDhmWjhlWGo0ZEkzZGg1bjBETnAxV3NLQ1FXdkVZeDdSdEYyVnJXamxWMC9pcDVNRDFndzM0TExycnFZaVA5d0ZlaEpzSGtPZFVnZlNJd1RjekdvaU1OMzBaZ0l3WW5iQjlOZFJhbWUxOWZtcktnYVNxTjFHR25ZWFEwb2pwMWdNQjY2VXJuSzEwM1B0VUJPMkphUWg3dWdGS0w1RFZ0Y3pHRUVYSE5pQ1JEWGd1OXJjdE1DYmxzeWo4YzdENTF5ckR6dklzaHdMeHY2RnlNcXZVQXBzekFvaGtjWTh2UTMxOVM1VDZHa2dWcWlKQ2ZwNmZFTVFsR0JaZGgxN29wU0ZtSjh0aHBaaE1sUFNmMlFOQUxqRFFKbFh3ay9ZYzQ3dUMwVHpLOEMyd2lTTjRJblJjK2RpV0lqMTNucUxoS281QW1KM1dZZTd3ZTUzcUg3ZlRsL0FXY0ViZFUzUGYxZmp0NXFBQmFoYUp2b1dLWGNwUlFtZGhQYXEydFNGVnBKSFZoSklURG0xMEsrZW02clMyempHdDcvRTlhUE8vd0pUL3VoRU5BYTZqNHdPaS8ySm5JYjhYeHA4bHlXL25Tb3hqT24xZG4xeWhRNmRpTWVKV1JmN08xVDJTV1VqTmRBUlZUV2htSEdpMFBaak90OXo0dUZzdytUNVRrWWFrK1pJTFpCam1vamRMQ0RHT0NCVnZJcXRhMTZqaVNJdE4yM2g5TFVQc0dkZnJSNW1tTFpWR29DZFUvcm9WV2tkRHl0blNGZzhtbkwwbnEyM0ZRY1pTTjJ5Ym9KWE4xT3o3dmFRWkRUNHAreEtWSm1LZFJicGx2MHdCK0E0SmNYaUV4c3BNTlhONUpsV0JMQzNwTmR3L2RNNU1lVGRaU0FpdlJIUVlUVm1XL0JWWCtpUDdaYnNjNUFDL3ZnR29PaVYrTkQzTVozc094aktUU3ZEdmpQRVNSWUFnUkM0SXRFSTFQRmliV01tcERnenBtdFRkR1dOMmNSNFJKeXJyRG85bmJxRGsyOXR2cHR3QmhkS2RoRTN2eHo3U05WT2x6SXJtaWdVbTlRdC9IZkNNb2JBdU9waWNzbGE2UFk1T2JjV3o0cVZuVHd2V2hKcUErQmUxUkFGVG8zV3FTazdnem5ZWFlhQ2dzdE1aTVducHlKajA1cmUyaHovcVdPOEZacS9XbWVMQmpSRmVKT2hFRDhHWXpiazFKSHVvaFQ3UlN5ZXdSeUc0MkNTMG9rRDdDUTlwdmxUZzJxWDU3OG95VXR2aVFUQWpYZVFiaFVaa0JPZWw2L0EwdzZyR1A1clA3R3ZRZ2JJZ0c1a0tLYjNnMjc0QjdpWHRqVkRzcE9CVHdCTnBNYStOeXBtYXdsSGdmY0Q4K0hVTjlBSGlKeWpGYkVkOGVlcUFXWjlmZmRibkVoczBFUnB3Uk8zUUlRL2hEejJweDVJdXBTUStlSEVIRUI4bVJRb2tFaERXL0N3R3doTmhuNE5FMmhXNDFLbjMrQmM5NE5XaDJ5ZE9HYjFZQzNpRDJiQkxJNzVxSHMzMDZQZnNEamtqTXpaU3lXQzNDdzY0QkhPUWtYNVlLTmN6ZHc3MVN3ZzM0VFB5RzBVSm80TWdkcGk4cGE5dVVVajJHOXp2VDhvNDJLNC9vVUZ5N3NjOUpFdWNYNlY3Z1dmWGMzY1pLenFJZURpdC9EOVI5UnZTUklvQWVvVXM4UjRZcER5K3JRR1lHR01YSkNmU0JlbllINm0wVDhGNnQ4TWpOTmxoV0c5Zi9aUGZZdVd2WE8vQVM5eXh2eExUYUxUdC9OSnU1OUcyNGhZWk5uUThYWllGWGFvOGROcTNrTVdwanBTYmVnTzU1VXplVXVNcUxXRzNtc0prSWR5SS9lNXNMVWt0K0VJeVBnVm02SVQ2MEhPb1ZhL0Fsb1Q3THQ5VW1SZTVoenp1ZHdrVjZVelQwSURnOCtpSExybkQ3bDcrYmFSRVlZZVVVRWZKek0yQWQ5aXBTNnRaVVlkZGN1bGE5MGRGYWRMTGZTdVdOSE9EL1BkbE8zRWVKcGdPblBjRE9wY3hPSndBZ1YySTB6YmRIRzFCVVRzbkdvRFNnQW16N25SeGJ4SU5Gb0VNOU1ETU1qem1NRmNzMjNXdmpBRUhydW5zckVobFJlRDFEaVpCcDJPMHJPeVhIZlFSRzU4VWhRemU1TUp1bVpLQ3F4djk3aVQwL2FJUElrTU1CeDA1UWlZSlpLRnQ1WkdEY2RSMjBia1pZMmVTRm02M2NtZGZWZmdyVEVRTFpnZk5tUnRJZllVeEFNT003MUlRRHNsaXZSdklqYWg0RnJiYWZrM1FwWEJCaDY2ZEhZODVDeXNWZzV4ZURwdXVybmRjVU9QSUhDaTl0S1lMaktCYjArSkZsQXBIT1M1NVJBb0tWdVV5ZXNwdEp5QU1SeWNMOWUxNTgrSVZXaUZPWWF3OENtQ2tWTzlHdTVBMm01bEdjRE9Bd0E5M091Z01KTzlNcHhVNG5rTlBrNG91UEM1WkV6czdrMmZYNms3dVhrNGxOTWZmbUl2ZC9GZ3dNUzRkVFRoZW1DOExhbDlzeXRhUG1YanQ3TWFENzYrUEM0VzlDTXFwTytZL1kzOWZyRXJjM2JFdVNPYmY3eWdaUm5aWnBCMlJPSnJpaStzSEk0ZFlqSitSWU9GZ3ozQ01YSnlFWll2ckZMdzd4emI4V1VqNDVRTC8yVTJ0YmlVbUo0Y2ZRdXd0N1ZJK05tWXd5bEQ2aFJOOXZuYWFwTFhXSUQxOEFNZlg0OVZJZ3p6Lzd3a3dDMUkwbXZheG5PMEtpVDRYdXgzaVNTZjhabGdCMURBTXprd1hYYVVZam8vNWVqY3F1Y3U2clJQQ2tKNlppTmU0QTZrb1hIaGh5ckVhOEMzUTlJT0NldzVadmNWUmxLWkNienh5VS8yRWhBYmRvUThuQWxQZjhNMGMzMDJ4THhsSXVuODlMQ0JyTHI4bUtaS01JbGw1SzZhMFMyRkhGVDJKblI2WWFacFFTL2hYWG5vU3JqclZZY3JYbkI0N3F0Q3NUVzk5bkpLK3MvQ1AwM3h0N09XQVA3NXJ1WE1MUy8wSzk1TnNMUFVTckpKRktDUmFybUJHMktTQjV1Q3FheHkzcHJoMWVDTEZyT2NpUWZNdk04V0trVm5aT1krSytwVC9PZUdGRHIwZ3pla0hGdER1TUxsQ2VWbHVJMTR4YyswZWVXalNNd1M3RzdIMzVqRUJacW8xSy8wTVErbUx1RHdVOUZMbXgrZ2lLdmUrd2JYVE1jMUJ6SUJqOXNhZXo3WU8zMnlTby9uRTdWM3Y4YUh5NDVRRGJHVVI3dG82Uld6MWRPR2VSb29QNVUrRFlDWnB3ekd0UTlDWkVWMmxaSWZSS1pncDRYME1QL0F0RHBhRDdHS2ZGYzFlc1ZSV0RqbFlROW8wMitwT05lZDQxRVhvdjVYNEtlNmJ5UEdXV3BXNXAyQnk3ODBYRHd6ekc5ODJvM25mN0ZEclVHMjZZWklaajNxWExKQ2pFcWliekxXMDRtcFFZZi9oUGpiOFpFdGZNeXdvaEdWYzlxT3R4RHVtcEtnaVYvUEkxRWgzaVRaOXNzWlNINmFLckpGbEpLalBVNkY5Y3dYYnlTOFFydjNFdTgzYmJhTm9GZGI5Ym82VllSL3FUL1ZaUjRpZjVSVUxBM0RJcWc4RDNUZGY3Q0hvTHBNUmVUSy9vcVZ1N0QyalY5NUphMi9zRVlUbHpsdVMwWkRpdHdZaU96VE02N2Mxa0Q3ZURqMndnUVh0Wmh2aUVJNGlqb290UGVEbXhwcERCZCtVemQ5UXdSczhDUHdhbUxvaWo3UndCR09GT2JJUmdZdUhhcFNoZDR5eWtibXRIemJDRjB6emx5UU5JblZkOGV0aFdmd3JQSEJRYXBhYy9STmQxbUYyaEpQQU9FNVZxNytUS3gxYnBmRmpMcFY1OXEyenE2eE5nUVdyTWFwclN1VHF1MUdxWmFhSWdNOS9jOGZjUi9RZ3R4dUQ1TnliWjNUWjJoR0UwV3I0M3ZqV0U0aXlPaGt0OUJTQXc2QzBpbnl6cVY1UEs3RVIwMlNSb1c1MDNBNUt2ZXVVSTJPaE1OVHFWL1lMNWhUNndCZVNaOHlJTkhRYm1sR2dmaFMyK1ZRNDZMSjRJOTdQUjNSeVZ0Z3dtZUVZTGlqZmM5RkQ1UE56YTBDL0VtbTZTVEVWc3NjNUNkQis5dHptWFBQWXltRE1HaktBQURpT1Juc0pDcHBkZzRsYUJjcS9GMVc4Yy8zckkxK1VaVG9CQ2U0M3NObWZQOVBnY2NaOGdwRytVYkJ6ZVRVUlhjSXB4emc5alJia056REkyTXV3aitmSm82dUNUL0xhNEd5eVNveUFxK1BjYTJ1ZFRXZ1R5QzJnbW1wY3B6Qi9qR1dyWlhXOFN0M1pRY3VXN0lYcVFCcE5hTDV4TXlETytuUzNyMEVuZmM5MzFYUjBHdTRGaG5tQlVMV0djK21MZ2tCQnlEelpvQXhSa3FRQ3VQZ1pQUDg1Q3BHZm1lclFRby81U3luZnEyZHExZ21xb2o3U2w2bGsvNTd3UG5PWXJrZjR3Q1NVN0tsdzVlQkZrMFBOaGNGRXBkRjVXblRNME9vMHZOVnF5UHhMOTU3eUdHZmxlM0h4d3E1YXZxcHB1d2tLZDBCc3EzUjdhdlZPVTBJZENkSC9HVVBRVXJiWFVwM3BkTXhnMmROeXhmMlRXWlJaVlBEeG9BTDZhL0hDOWxUVXNJRzlFQ0Y5TXRnRDlybnFGU0hBdE5wbXJMczZTdU8zTXdjZWFHeWM2YTdJbGVNOXBPM2ZOdjJXTU9Cb0h6WHdZbU5KRzdRMUdXUFlGaFdPdkV2QjFUNmF1RGxVNU50NGFiTkRWeG5nYURQZzRyWDlYMUtIYWk4ZkpreVdZQlI2WXRGNmxsM2J3SEtsWnRBMklNT1hLV2krc3JkajJTWFdRclhqRWRRclFRd1FONlBQSk5OSWUrK1B3TGpaaVlzb01mQmpLTVlvelR3dS9xMDVXMVRncE9UU24wWTFIbEpzOG1JeUdBSUdSZUgzT0x2bWd0SFRtQTBsVkF5WVpwRlRRZFVDWlNzRHJaaTd4TkFmbGhLa3RhdGlxdXUyMkFZTkFRWjRGSExXb1N6Q0NRdHBWenM4cFBWb0wvT0ZkZk5pQzdsUitVMVpMUTg3dGpJUStaZ1NHbEhvcmtENEk3dGdPL3RFRWVYOWlTNzNJenJkNjJ2eGFsYnBGcWZoZW9mYlNVa3dscDNvbDVsOUVGaE1DY2pXSTgwa1YzMG83MERXRjZoVUp6SXRkZkJackUvZEF2L3ZmS2VvOGlQazdxR0hLSVIvNUJkUU1EZnpPZkdZTGVteGVqUGx6Qk1GWExyQ2JUSTBTRkJTWDFZKyszWW9xZEtxL25tSXpXZjhnY0VGd1hpMzM5L01mcWFZVFhNNDQyMlBzbGQxd0NMY1ArV29LbTdQYlY3cGRHVjZhQ3llUW1wWG1ocGg0SEN1MFArWVVCWWZ3bW9udmRoQmRjWHd0M1YwSnRrSlFPbXNnNU9zNGVOb2IxL2FJZzdxcXh4UmQyMHRiUG9ZdWQvUWdnUUFmRmN1d014U0ExeGh0Q2ZLUXNmUjJ6UFlicFRuaUtyMmF3SG5yZHhJZUZrbjJnbnBLTHA5VVVMRzlNWHRXMEtVWW1FeGJCazJ2MUZVNHRBeExkR1R6Rk5aQmYrRkl1amFuZEZyZXdZcGMzWHhDbUFQNkxESi9jRTNwNUYwWW91YXU5NnJGclgrcStUYWp5Z001NGNnVlc1aXlTMitZcXdvWk00QkVlNE01TXJBejdUYzdlMExpUldJOTZFeFRpQXh3QnY5cnBlVWMvekl3NTNlMmFyUE1Ob054WkpOQ0ZueVJwbmN2a3RtU2loUHRCdGVEZ2JSM0UxYzUyUElWd3kzZlJRT241ODBCT1ZJRndzb3NEaWNPaXQxK0h3bjNzVWlFTi81UVRyVlg2Wlh6bmUrb05IOVhrOXQwNnJhREp0Nklmd0RmcGZOOVRHQzNWcENNRXltTE9FcEdaTnZtS2hLWGMzbXpCamYxTW9tWGJFQWNFUS9kSXJUWFFaYVQzZGdFdXp0TmNzcU5paGlZUnc3ZVpDVnVGc3lKUGRpaFZ0NGpqOWg0NE5JbSt2bEhZRjdCRExyb1NsYkRqQWM3a1hWS05WaGFpSmw4TUtFTDdIbkoyM0E3SE9PelUrQ2ZFcEx4QkdYQ2c4Qi9aWUZ0U0NrRVp1NnNTNzk3WUNnbHVHT3dzSTlSamViQTFqTFpiVHBVWnNrZUJERXA5aHZzNGtCSTRQWGV3eHZSblJNZVl5WkthVkIzQjBEd2x3OHhLOCtiWGRQV0Zha2Q1WVZxYVhDRTdTeVRUS3lDcVllaEhlTkxPQmw5Z3lxNXFZRkJXcWd3WVErWGt3Z010Wit3eXFjRWdjclJvcUpOcVpoejFsdzRGZWN6cG43dngxNUNtTEpXY0NsM0liT2xzOHppZDdIQ0UyVVJZUWMvNTlEWHBWQ1hLWEI1NjgzZGQza1QrNVAxbjdzdytOT0hjOXlRN01POFR0TzNMYzJEdjN6UWtDalRza1dJa1RIbGNwdDBWMEpmSVZQWitPWXFwK0FQUWpQNlVCOGFGUFhiUXUyd0toZnlKWkozcklwMUZkTmVzYk1oMGlYZktvME1ZeDZBeUlYQjhRWng4K3Z3U1RZOEtKOE5hNythTTJxZEc5VlA1TWp6STRkU2huWUx5enhxeWp2dFh3SVpXUnFYakd1MXVCc2pzNHVmSldiaWhhUGdEQVlTYnNZeGtTMWpzUWtHbHp5YjZZc0JhSy91emRMaWEvRXJNL3dXN29qZFlpSFU3amVlbWx4ZFIyNGtzcFdEN2NodlhQVTgvM1RCZzM5NUMrVjV3SjdqVlVSV1poTE1ySzNidUJGN2hWb2lyZ0lFemNJRkxNQ1B1TVNNSXZuaTIwU0FjNmdFWU1KN2dUTndhN0svSlJPNU9zNWpIRnAvd2N0ZHVUSmF1WE16M3craDd4S2lhSmM2Yi9LNXU4bkh4S3NvSDNDK0c4M1NnTVdSUW0zSGk1TXd6Vk9HTnpQSGo1YUVLTENRdTY3SXNlRnBMd1hMT2Qwa1JnMmZNNkozNjRWL0lWT2drYXpzWnI1V05NSmhaQVE1L0U2T0ZPOVpneW5FaG5PbnhhbzB3OEhXZkcvcTFQYWhkeEZ3bGZuMHVDT0RzYjFueENlMUpidWtFVUl1aXQ0RXRyZ3JzUE84dXdaMkRtWGZlUUhSZUE0QzRhb3puYm1YWmZqTVZxMklqdE1MV3VhbTJEWGk3cnhZamJhU2xpbWhGaVVMc1RKUkpxZE5IdW55aHVpSDdHZktnS0FQaXZVVkcvamVmZVQ5cVN3Wko1d1Z3eDlRWVJkc1dLR2lMUlVjWFNZSHJHYUZ1Q0dHb2FVOStsTGYyQ0RjV3dlcTZmSURhU0RMbUU4VVcyMkh3L2QrYmxoVlBvdTF4bTZUMVZmaXhHQWR5Tkp3cVBqY2ZWV2xOSitVUnNjR0pHMngwcGI2dG4vQ2Y2K0RLNjlzakw4Wm9DSlJYay9xUTc1WmtLSjZvTmVxZzVnZWxyNG5vRFpVZE02MnlnampkSFlSd0FiKzdmY3BxK1pHa0VDcWh1VWVUNjJUUXIxYUhGM2NjdDF5T3pDc1BMUlBpbi80VEtrOTVkVCtGa2xPbDdqdERnNS84dk52OUFjcEpKWkF0SDY2ZmE4MzA0S0p5ZlpKaU5Nd1NTOHp2R0hFcGZjVjRibmhGSmFvRjRmNHJ4aXJGNUY4M3JvODV0UWl0MDhudDhvMjYxeG9wdG1qbjA5d0h0OHB3aHovU1R5cXZHU1hkYmxYNlgwVVh5UUI0WXVLaUhPNUZhbUNDYjhibWhKWFFQMWxqaW5QcURqNUZ5NHovcE9Ed3VEcjZzNW0zTk5PcEJQYjJLZkZVUE9MNitRVTNkYThwUGhqY1ArQ3F1NGhZVG1ySyt2ellkbU5tbWt0OHVzZitZbElHYWlYZ0o5OTJ2VGczbFE4WmVJdnNLUEhRWUVvVHJmTHNNNm43N1BmdFBPeUF3YmhvOTV4ejRNcEhtVFJyWkZxaC9VSDhsNk5yTDNTNXNzcTl6ZGc1STN6RllFYVMrclBtVm84ZEZiZnljVW02UEtpMjhOTG5IdWNEbVZ0QjlSOFpSbVFSTE1jc1YzcW9KbUora21mbVpmU2k2S3lqS2FoblA4eWYrMEpIYU1tSzJIcnJROU85WE5vU2phdWxSUmFKRktiZFJlbkZjM0xzRm9ZaUhTYTZHUEtUTTZHQ1RCbjN1VkpCRXNzQTdRTTJBcDE1K3dxUFNRdUV5OGNROG9YMzIyZzUwL1orTkgxRGwycXd4K05hK3BOYUhQNU1yb3ZqS0NvK0FZeFpYbnpDemVnblZ0STVpU0VkZnVYR0lMNzhGQ1ZaNmp3eWRrcGpSRVUvWVVCNzQvY0lSa0tmYVlhUzYzV21QSTRqSFNucjJuT2FVNUNobDIzQXdhRGpMT1NOYTdBN0FIa3FnYkZpbk9teCtYaTZBeGtXY3YrZjVyT1dHUGVjYnJBL2xDdHI2R3lXOWRuMTVOYmFKMUtLNnNSZ1RTMk93aGFzU21CSEJTNVhrUjBDang1NnBEUXVNSSsxem81Qjhkc283eGtKMDEvVUM1dWRQTnBkZmdaaU1vYUlqTmhzMFVuNGpRTDhTaXlWbzZMd3J3WkRPbHRCeXJmQStUczdFaytMbmJqQWJGeFlrQ2QwbkdSWDdTTWlKTUpER1hGUzFlSkZFd3BPSFdub2ZDM2J6SERobmFpb3llYXpxbTdaOE5OeFNnUWlUWTRPaENkK0VDMWZmMHcwSW5mMWlSUjRmaGNoV1gvUHllbVh3bW90Rlc0OHhHd3ZVREo5Vit4dWU5TytEa1luVFc0Qkc1TmxISTlUYjZnTDNNRUJ1UlRCREZ2bDBxbGVzVHlpWHlGZHN4bmdkaUZ5LzRveGZwZXdlNWZmalRUaTVFQUR0eXM4bEVsT0lrTUhrem15WG5SRll4T0FsZWt3V3B3VStBT01FOFlacWRZcFdvYlNqWkt2ODNRTk4xbGVHajYyNmw1YmI2RWxXcGRsUlcrcVdwQXpuaFJYcEt0a1hKaUdHUTVJWVRwSkYxN3l5Sk9SeEgxejRmei93a3pScUxVTFljV0lwd0RMNkVqU2gvblZYQ0VqWDJ3bk1DcE93dksyRGhDRy9kL0hNTTVjYk43OGxocDZzWG5pV3FoT2Zrc3YxRzRsTmRrVDRUcnpmSHpXMStHVDFYNjhRUjVZNFJPZnVzcFZlak9Ick9vSG5WUkRQVmROeUNOa005UER5eHhUOHZGTXV5SVB5Q0MvbDRQR0RxL3FKKzVlS0JlZFREUzlJRlVYVDVHdTVka01GYi9WR1RkcEYwTmZQZ2VCN3JLRC9yU3J4QmlCUnBUeXFzM0hucGl1M0xUS0cySzA1VEwrUTd6S3BkSUc3NGNreFp6NEwwNWdXdlMzOCtiSFk3bGFzMllVZ1pEeXpSbkhDRVZ2QW5hL1QrelNlYys4aWVlU1dpVU1SZjNNSTltM2xpMm1jUjRWaUtqYllMSDNpdkhsQUYyUUtITEo0a1RMeEVGVTZiU2ZnZGJveFBjc2tBUmZWbml3aGk0N0h2Um1RcjNOTGtsdzBpaHU0WGc3ZENCb2kzcStjSFVRS3dhbjUrUkV1SFhiZFovSzdBKzltYU9wR3Z2bU45Unpad3I2eERhQU1sYTNlSlBNd3c1and5cHA3SHhndWpOb2hvNnRsZ1RoQjJRSUVPV0hyYTJKck1sNHpOV3B4S3dIb203RE5wNElZVFpyQnh0dHpCTG1udjJ5RzBHYWI4UGhFTWFBZzk4dDZBelhveWpqL1QzMnRUZTAzSDFIWHlWMlVOUk1KWjhya2UxQ3JKM1hsRTJUQVBUaXVsZi9lMFpkMWRiQ0xhd3dsbXZDd2NmajU1Vi9jQk45NzBpMERHdFordXExbjZjbFVzMTZFR1Y5RG5nUDgrQm4vcVdZa2M4SXhyNDdwR2VtSTVLWFRCMWZ6RFphTWhWV1RsZVFnalV4ek56YTFrQVBCcHQremZ5Wi8wa3p6c09jMTY3SUV6STV1SUNRVk1rMmZ1dEVNUTFWSDBjQk1SNDBtUjdjRzR2SmdWY1N3Z0V4U3RySHpXYjlacDlxTWVoMWJBWkhTRnB6WjliY3ZBNmdKV215cVREVXdocTA4d0pvZkZsc0dNK3ZjazNNaDRGeU1JczNHbFg3aWtjdVNNWmhWdGdWSW5LdHRpWVlteHFSeXd4U0pNdklaamwwelZMdUhRMzN3VHZldU5LZ3l3NU9BUHdNMnljK2FzaDJ6UzFjdG1hSDNmaU1ZMVExT2wrdXgzcVpFMmQya3BvU1NLTjNlWGNCUzhTZGhKUjgzSmlIOGVTNmpZdjUyV0FURXEyeUFVNFF1WVovTjVSd3E2dnIrUmtoSytHY0lYaXNtb2pRdlAzY3pnbUNWUGkzSVZ2YU5kcHBOY3hHNk9LV3RvM1ArTDh0ZE5wMWU5VjIrT2YvRDM5b0NuNWFBUG1iQWdOd05jL0tCZkxPa2NZaHI2MVRNR1htS2FMRVpEN2ZJdUxsNC9NOGxBYk44dzNvWVg2NHk3Yy9lSVl1NlAzUzVUbURIU0lnRDQzbURNWmMrR3dqc0ZwS2U3Tm5OdCtFMldGTkxlRzhWYlFTSHBKZWNvcTZLbkcvMzdMOENINHUxU1ZQcXRQcjZOVkhuTzFGR0o5ZnZaMnpSZm9YQ1kwUWpRejhDVitjUzJxczJPcnZ6amdaZEtpbUdYMEdVL1psUFVzQ2MrTWxjb3lTRzBmNnk0NktiT0Y1NGNobW15RXFwbWF4TXdYaW9LSVd0YVdRYTFnMVhHVURuU3JiLzE4SjVJZFhOaHAzdHA0VzBBYmRuTjNqQXpWcThFTWRLSjh6YWUwQlBDV3Rpemllc1RwWWg5dlhrUXFKcW44TDBlZFlKengxSkY2UzVla0FsTld1OFZCQUJrYVNlbDdNRVo3T1ZRSmZZQkVXaEZZMnhPc3NiK2x0TXdManhPMmt3M0VDcWJITDJDNXNwQUhLb04xQTJZdy9abDJDRHRzN3FGTGd1dW9LMEtheG5BS21lMUJYdSthcWFjZlpHN2VPZ1pKRW5rT2VRWWR5QWpRcDV2UnpTSnh2MzhPRmZwWm83bk1Rak1uOUdjNC96L21YamliTE5KL2lTVDE4VDdZblJrUy8zMXQwUmh6SjZnMWwyNnNicVBQVVgyTlBCb1J3VFR5Ym1hVll6RnRWOWdod29jWGxwVVdacEUzZ1dkcEFsU0h0d3BjVXpuL1JLbSsrNVpYbm1qaVY3Z2dqbWV2UzR2alYzRlF0MU5EejJsNWFNVTRnMzhKa2dVbUZicnppQ0wyblJndGl2NUxpbG1mS3NsRTdZdXNDc0VVeUN2QzdYZGVJUlc1WG9vbEh4YWprTGZmaS9tVTlWQVhNbDJocFVneC9ObEU4OHQ1UWo0dUNTcE5SRk5rZDY3R3FiZzFWaWE4S2tQc2pRcnJCc1prRzI1MXF5U0dpSlJsOHlla1ppSEU2Mjd0S2FDUFVNbzRlOHN6d3FzNnBnYmJBa2YvTU1wNUw0eVJvMUlFUC9OZ0FuTlUrNWpQOGtMWDFtdEFQYjBiSW42eTRyckV1a0h0NmVmd2RSMnZlSW8rMDRpdGN3RWRGZDJxamM0TXdjcTB4Z1MzR2tPazhScHdrbnFubkdLQnN4YUk0M2pkYUlMb3haempBMU02a3Q0cWNoK1d3VXExd0pWT0RxVzNRNVdDYitkWVVoYXB1YnZDNndqSGt2eHF4cU5Bd1NrbExSVXpINXZzeHQwN09CdUVkSHFzVVYyZ0RPb1V5YWMwVVdld3RDNDhPaGlvTW55Q1ZKOWlUVkFpbzF3UUU2VXRvYVZaUHhzcVVFd01Hbjg5WXlIQ2VPMHR3cHRYeUNyVTQ4UkNPUlgxWGs5M05RUmRoVTZRWm1DSnZjK1pzd0NOcDlXVG4xUG9nYzAvNDRWSm9qaiszYXZmZGZuUnhsZlhLaHZkaFo2T3pRYVJ0aFR2UlkyM3VFWEhja01HWTNVUmpjS2pzMFRNeFloR2d5NjdWSWliMWRoYXNkbGRVU0cwZmxiaThKMUdDTElxOWFNeEZMK09zMjYreGsrWnJyVURyYUZXN2kzREZvN1N5d2VsSDMrcjhUNExPbGM4anh3K1FLYnN5dFY2ZVRWTEFUaFE1cFZUa01mQVVnZ1F3YTBLQVNaVlVhekdTZEcraUJaQTNwOHFhM0tIS3I5aklma3BuVE9HN2lXNmw5OVJZek1MdSsvVE5WcU1iSVA0NHVqTGJDUXRXb0h0RUV4b3ZBY0RHdFBmODI2Y2wwdHFFMldERUZqazZuS09YcjRoYkdXR3YwY1lYVjc1b0hocXhwb2dwMzg5dnZaVEZCUGpBT0U5aWx6TnhPNWZyV0tTMW1zTlJDUDhjcXhia29rZjFIVlNHeDlKM1VOdE1ZV1IxUTNZMWtZeXdmMllLRWpaN1lISGtWYm1Yc3RGdWNKblZRUys2eURDNU1hTjh3ZUVNWjVyNEdPclNBd2pWZ3FJMnU1eVdvWk5scHM2TXJSRFJUbElOTFZpRjJOazlKcUptbTJtb00xdVZHb1pMZ2gxcEFNZ0dBS1YxaFliWTAyUzhPWTlhcnpPOVVuS0sxa2VJdnZKQkxJNHpyd1pBZkxjM2IyQjFJcHNxS25hMkFTSnl3a3QybFhJTUh0MnNCL0lmVGZDWHVIenhBYitkOURsQWRPOHkwUHdnRlFtbUFVRGhJWTFkL3h0Qmh4bVpDdlNmYkxrcExNaElSeDRlYWRBN3dtV2k0MkdDTDFRclpDQUdJRmxmUjRpRk5ZUE5QRUtvMy9xK0U5SFhhb0dJSnFQOGpLUDZXVFJtdzB2b0poMHlJTTdCSENXSHpEUGwra3FnUHRRY2pObDdCenJQQVRJSTRBTTJ5RGxHWDJueW5XYzRWanFnbHVOT0pWanpVSmc3SVhzV3NUckJ6aU1zanYwc3Nrb3RDWks1MVlmV2daNU9jeEhTM2hEUi9uejFvdCsxMGxzeEhsVldtTFNsYWVoR1Q5cGg5LzZzeHdiQWp3bE96ZjlVRXhEYklBOWg2UmhzSFIwZVp0Qk5lWHpWTCs5ZTlYY21EV0lSNDhhbHJJY0daN0gwNW5JdFNMMHpxcjIyWWZmdVA5VnJXeC9NQlZFOUpSOW0rV1lxNDNvNUkyNGhrUkViTzNtSWhpa1Ayd3BBR00wRmNGKzRiekRLNUh4dUxXS0w1bDY3QzBUYUp3LzZPRVRtL0VyK2RMQjJQM0FqMVJudkVMalJPaGI2K25ZUHlzbXppZ0NwcHJqMTE2TW9UbHlwMGRNUWZPclNsSXgzOGtTTzMyRFFHbTNkdVQxSC8zMDM1YzFlOEh0a3BOUHJFZSt0UjJ1ZXdLc0M4T0NwUFJEZGZuR3B0RkhCYk56QU5SWFBsT2FhdHFuSUtRMVJ3cytKWXFkQVducjhkUkdQcjEyMUY4aEJKQmo2Z0pIVnZ0TTZxV0QxbDczTStkYTEyam1CQWpVMHhaU2RqNGRVNXFFR1hsMTYrTFFOOGQ1K0VTSFVXNWgySmE1azdsU3p3OG55WjZrWkN5Z1RKVWFoR1dQdyt1Y29sSm9xclZCbDZpdnZmYlVaams2aUZNY1k5RExtSFh6NTNlNDhvWWdTOTNuelQvL0RGRUVwcUUyOHhHM2xISWY5OHpBa0huRWxNRmNiQ2F0WEhKdGNDTDA3UE5mNElON0RGekxJWGRDb1poUWxReEovVU5jNlczVEVVbGpqelNwWldZclZWQnR2OFpRNnZyV2FkZW5TT3ZGdkJNL1RHUktZeUdoWmNaUXkxSGtjQ3BVLzBIWEh3aCtuNzBzbUpCclNGeVU0UU9OWmV3SmJla29VM1VETTV5MWZ6QVg0bGlZeDBRSG5FOCtta2hLaUpmb2UwV3c3bjBhbU96RDRxZWJkRlVOcXp1cWlPMWdCcDhNdHBFbWVzZ0VCa1huZEgyRlRmNmJYWm5OU2IxWWlKWDFjUFBoWU9NbmNpK3VSQlNKYUVZMnplTWI3dnhyemVmdGlYVTRTZjZlMWtzNENVeitkNFBtTzNuMWZVakxtbm1hUXZJaE9jRnZlSEdSZi9NZUk4K05yMWxnL3JPQkJvVEtmdnVSZElpT29pRmJwMlM4c3hZVmRiSzVMbzA2WnB1Z0dGMThwY1psM2MwZGFpTHdCR1hSbk5VbGs0QUpBNitlY0JaNWxQTW1MU1lDRTNmMUZaS1loOERneFN5akRQSmZGb3lBTjJuTFF0UDZJSkFJK3hpakN2MTBFQXRONXlLTkFTSlg1Yk95WTNIL1BxL3ZoSEk4VzRvNjNiVFZ5SVdZRTd5RlVnTkVBcHFWVVNyT1ZpUllXbkc2c0hUMDFsaElKQnZvOTJJZHlVSXhPcGo4UTU4TFVOby8xT1VKUEQvSTIzTGZCV2QxdVBMUGtBNGJFNUpEeXY5a3VIRWYxYlBDeWFDeC93TitidzVxb0hhZU5IeldhbVo2NUJzcnd0bkxTMGNPemZvYkUrUEZHdHlLSTIwODBnMjRjcERrUDJ4c0xRT2tIMHVVNzBPdkN4VGsvbVAyWGFDV3RtVXhzZG0zcXkyenoxckxUS1VSbXZFME4yRUZUbnFkU3hxbHh5K1JPUXkwOUhVUG8xWnlGeERTSDZFR3dzdUJFU0hVN3IwbmhoMjNwalp3UGN5aDY4Mmp5SnZIaGE0S1R2RWp5ZDdUYkRUcWdqYnplT1MvVmtHTzQ0Z091K3Qzd2N3YUZsTWRYMkRtMEppcEQ0dHE2K0FyS0xROFlsY2V0OC9zaEZVVlZCWlIyVHFPeHVQYlBlT2hrNVBZMnhsdDVvK0doZnVNNm42UmdmSGxqQXlyUTl5RGFVWkpVRGM0TDJ0VEZEMTJzaTU4UW13Q2NUd1c5K04yTmwzVENlaTk3VmVTdW9IY3lCY2w4ekJWOEQybGhpa3JwY3lURUpuYVV3dmtWdDhVTG13aUx0RWtJU1d0Mk5qTlNuSTV5c01QYm5Ha2pmenJ1Y1VnMjlDbDJtTHRPaTc5OXl0M3dpaE14cGFRNDUzY2JZMlR4cWpidjQ4eUFiSWtqRmRqekNBSHl0bGtyWFVEcWlaZnFGRTdsUVZjdm1SNWd5bzdiQUVlWUdRNWVSNWRDMUROQXNqL1lPQlMrSmd6VTg4VzB5QWhCME05UEhLRVcyU085c2RWZklKTklBaHZ1SWE1VWxuQmxDVnZPSWhaSkxaWXVFaHJCK1htNnlkd29DME54OGlGcERLeEY5dnlQeUx5V1BFcXJHY0FidjlzSUMzWWs3cWI2YnlCVC9xYU1mSHJDOCtvNFExb2FUY1J1QmNsUTdtbXROVnQ0V1loSk1OLzFnNGpOR3d6UDdQR3NKUU83MFNwdGhkNHIzbm5aaDhKeXRBLzlyc2RPUDMreHF4cFJMRDUvR096MkhZanMyMWRJUUlHZzMvbUhqakF4aDQ2RVp2bXR0SW9jUUlaUzB0V2JUaTM0SCtqQ1IvV0hBOHRkUWk1WDZuVXd5K01TYkVFbEVBK29qOEtIVmU5ejRiSlQ5a0xBVUExaWhXZmNoeURzUlBOOXp4Y1QzaFRaNWVaY3E3QTRwUW94ZzFOUHE2a3NDcFZ1bDVldnZJZjNnMVIrVVZlNndGSHdUUURWMzVWM2p0Yyt0dW9sb1JFb284MmNrU0h3WDVkN053blBaOHVlSzBKdHRKOUx3cTJsdDNKT3U4OUQ5ZFFFWTF5UGFsWXl3VGZQdFRIakJwMGZSdUlwcDR0V2VQRkNrcDBZNjgzK3dVVE9yNHAxd2g5RGlPTDNFRnNFWXRKS3BTalpGdklST3JnYVFCMHUxZW03Qzlmd2xTd3pLZVZJTzR3SlBTZXk5T2lpeWFyUittc0laL0pjTWVlL1FVZTh0bmNNOEtnT3NjQTZ2TzMxMStBSmVqcHI4bkRNZnArcWprc1R0WXhqUkhhRWc0RkwwbHJ3TnlrM3FUTjdUa0JKNytFWXVhRm5BWU95N0xib2VhcVV2UzNRRGcwU09aM0Q0Y2JjV0FTb0JMV05MVyswaVFTdFREL2JwMHVRdU1rbzltaHQ4OWR6dWRUNG9HN093b1Roa0s1TkFiM1Z1K2NUS0YwYUgvc0xmbm45ODlFK3NmRVp2RVRTV3Q1a3UwRk5RWGFOY1pJOXVwbWp2YURDNWdUNGlaVlh0UzF4SzFRRWc2U08vTmVMeWNpeXhVR1M2ZTBrM2FzMTJNdFFtdk9mSFFGSGdCenZMY1FGNEVxTkxadTZwU3V0cWsvMGFtaXJSMjdyNlliZmEwcTJTamRybi9GZU05NXVEb2ZyYWZQUWY3c3V5WURmNzh4bzNycVNudHhPUW5nWFRCNFpDbW9RVlltdnR3OUZqaFlSRkhzSGl3TVdydlB2Sm9MUWNzamlTRzNMK1h2bWg4MVdRNnZENEhjRGtzcWV4Y0FmeXRxYTRZcVFSbFVCZ2JTaDZVWm1QaXdMdlVRMENqTGtRSjBnVXlyVVNwQ3Uya1RxczE3ZFZJeTFIL2JXQWRDRUpkems1dnd3cmNkNndDeTAyQTNDZWpDdnd4R09LZDFWZ3RHd1phK1RkQTJTSGVmbjQvb3YwaU1aRm16TnRJWFJFQTNmdnlocEZrS2gvNmJuUlZsQzB3eTlTUkhXMm1pRWs2YXY0eFFaMzNMWUZTNDJWbzM4QkxGTHJEUWZUcWtpTzJ4STdUbmt4cmUwd0hMMXNjeEpQSEhpQ1NVRzBhSEVVNXlxbEp5cEZTR0VOb0puSm9SNTZBMHBxWjJuVjVidml5NEkvSmZWTmw2WVZ3UFVXcS9sMmZ5QTY1ZUNkVW5LL1JJUEdjNDRpeGdqdHN6djZZZFdpYy9kcFZlc1FFVlkzM3orUzJ2S1UzL04xUmVGdG1GRE4vWGtnakpWV1pwTzVpeFpBK2ZHT2h2R0ZkUVUrb0R5aEJzRXljS1RmcU8wanZMVzMvMmk2RGk5MFErQXB6VjJ4WGVUUW1veDR1RndsQnh2N1NocFJSWlYwZFVpYUVxdkI5ckRCa2d6OGIzMmh2bk50UnY1dUY4SUhDNVBSdDVtUzRBK29Mc3d1K0Z6WUtNT0MwdnFtMmt1dG1UYkZSY1Z0Wm4vbUN2Z3U3WEJSQlJSeWV6aUZnbnloYmJpNmE2WDRmYWdWYjV3Q0FqQWFOeDZZVEdMdEFpMnBURnZSOERVYmtHV240Z0l0MWxIb0VFZ21jMU9uaFkxU0lxZ2g0QUZXMHB4NmxvazBMSnUvdUI1VllmeHVuRWVsamltcHJoUkFqSGp6Z0pWQkRpdzV2d0x1VVY5OTZPRmw2OC93QmVyREhDWkU1VnY5MXovVEtqc0I4M1N1am5TalhXTWFnbERFMzNNK0lYQ2thWmJ1S2p0L2xvWUl3YzdrWnQ1N0xQSTd4Um9sbm0wWHJUOHlOdlBqRlhXQkRKV2tYc3E3R0FSbFMwcVRIdFk1VFZvQVkyZCs4Uk85YlFzb2hnRFZ1dHI3QmFPcTMrMVcwNzFNem05RVBPM1FjTUNEWjNhQzJkaXppSytIQTEwdjQyYkxGT0daNnd6WDE1TWN4UjFtM3FrdFA2SDJnZDBmcVBSNWkxYnRhMC9uaWhsTEh1alFNSGdxWWlYSVBzd2ZVemRuRFVPYVFwRURPeUxpdGN6bFVUOHpnNmp6dUx2RzlhUzExZGxmc1NCZmp3M1MxMTRGb1EwbENuYkh3QWx3Sm95MmY0ZXpsY3Y4eVJqMWdqSVk4ZEx4cEVNTDBiYWFkd1R5TEJwOXkrNHAySDY5a1JNcy9LQnZyU3ZYZ0RPMWFldGIvVm1ldXF4cXpjVVB1OXk4RXhobXpqWTNBejBiMTMrRU82QVpDNnFpbTZhK0J0TXk0cmwwN1NyUzlrazlza3hociswTEttamVrRlc1VmRkZW1mZ1Rpcno3MnIxSFRRdnY4NnhtSmpVU3NVa0NVdk92Z3dkQ2JBRFVIQVMxbzR6UllNK2EzblU3Vit4VzVHTEpQRlg0c05Eak14czdlODlOMzBSS3RiaitWQ0NCekY2dDJSOFlHei9CcldwSDN0VkxGbkpXSmRsdnpGQUlOa0dDc0Fhb1R2SlVjVWxJZlZaaCtQbWQ1OWNnbmkxbHhEY0xLb1Nva2NienBEY1hLclk4SURMcWZxYkNrSnRxRmkwdmxobTVtc2dLSVZSQWJrOXQ1T3BURXk5QTR3dHc3MWtUTE0wdW0ybXM4dVJHL3VuRitvRnFXUk9NTU5IVGtnVVdUNTdpNnpvcjFWSEtYZFFaemNSWFQrMjY4NDFFRzZ3bkMzOEE2SVZDS1FWdjNpelJlSlpKdVNGR3Y4TnhXYVlOYmFNaUc2QzJWRXZSMmEzTjlUR1YwK0puQ1E5dmxtLzNvVHhaQ0J4ME9Yc09vOElxM1J0bXFFYWxFL2RmRWt3dVIzT2JqRU1ySmtuaWtZbGsxeWlJeU1LVERNS2U0WXc4N29FMnpqcmo2RndqNjhseG5MN1laaEZFMktUK0JlZWxnRWg0SmNzWXVqOGpEb0ZhZEw2c3ZQb3E3NktVcVIrQlZVaEdia2ExK2cxd0JFdFM3R29KN0Z1d2tuS2luZnB3UVQ2UWJCL3VSNlgvQmN6QkhudmFwaWdMQ1h4N0hCZDE0Y2szNTN5RTdBaFlXZ1dHQjBINGRZYW9NVVFFNGRXU3ZxYWE4d3hRZkdsMVRVdlBYKzN1TFJQcVRNODJLV04zWVRXNzc0QTlUaGY2Nzk4MGc1YlZnRE1EdG9SOGs0V1JvaGsrR1dCZGdmZ1hoaCtjR2xXUlpPK3ZnNGp3SVNKcGZmNWNvY1N6U1p3N0xkTDQrRE90SXJBUjA1R1o4SkF1YjRjUjdvNDE1dzk4ajJvVDc5eVFIM2RPdDdiOUdhQTFyMnpiRlRWSWJSL3N6K3JHaHd5WmxlTjRyMlltTE9iYVExcDl0N1NxUkpuR1plWFZFRVQ3Z0ZpdlNsMU55RnA5ZUJEc2xlSFVmMis5eXNZeTVPWDdiMW5ta3FpejZpdzFWOHFjbnVabS9CaVA4SDVTYm9taVArazJMdGc5aHpFTEY2N1JUNDdtT0ZxZnFaazNNanovTTBBOWx3dVNVZlN3Qlh3M1d4aFVUK3dPaTF1TFIwZTBzejV5dmordWFDOXRHemR0a2ozTVlVZE1kZkdUTG0va2lSb2w0NkRSelpydGVna1lSOVB6TWxIUjBNOFdQMndudnpNYXV6alpNRmxybm5hd1REaVVQN2FSa0svWno3NW5NQkt1T0FWMlpBY2JpaGtQZnNTU2FHRDNabmE0U2orUVFRUTdPZzNzK3Vpenp1L2lnY1lUclJmaS9nWHRBZWdRbjlXaFBtVFA1aFo4MzBiWmxLTk5RUXZPbzhOcFZHbnJZTFJteUhuWmFCMytvOHNWeDF4bER5dzBZbTBQOXJmOUhJdGtDTEl1bEs4UzJCUmRnTDRVOFhHaVJCSFFlK1h6QmdtTDVOcFB0TGkxZWdFaDdacjVRNlg3Z3dXUUNsOW85ajFFRzFWUHpEekd2djh0QmVLOGx1ZXJScjRzUHU1aG91NitBei9EVjNJRkFtSDlTeDk5K2hZYjJtTmhnZlFYdGsvQjF6NU5PTk00bnBmWXdHR09ReTRpVUVSNW9MMlFSMGJSRmJXQ2lpVVhnWWxLOGM5SnAxZ0g5RmltNVlRQmFCVmFyVnYwdmduRHNqbnh1Y2pVMmRhVWtFQlBjZHkyc2NBTDNFb3cxSENMeW5BQzYwQUlmdCtkMGpvMEV2ZTUzSms4dnY1Q3dWZ2ZVSmlBcHBIMzN2aUpVNFVURGNaU0ozcnNlVkpENk9pd3VtVFZ6aThiTElNRGpLZ2hxTlpDN2F2MjVYQkh0R0VPNUFOcWUyR0JGeGNLYzlUZ0NKajF4T2pic210Zk8vcE5VLzFpNWZZZitFT1dQSk1sZmRHVjkrelZwL3hiN1haMEtxWld4L25DRUJPZkQ3VnlYSGxvVnUrRFNTcVVtNFFKbFkrMk9oSG1tUlI5cytHMEhPd2IwSTRVZkRCZGFtb0NiM2pGTlVtdHgyajhISktESWNJV3pBWGo5ODczbWpjeHI0eHZVcnVoYUZXZFpiS0QvL2dEVjNFd29aenkzVUNucUEwTVhsaXpEU0V1NG82bzVUU3hJQjIwQjhPdnA4L25KUCtnNjBhbCtoU2RpMnFMaE12aUNpNFhhWjRCUGZJMkd3ZGRwdnFUc1lIcTRVbDJPZDlMUllheUo3M2ZKend6ODlDMWhqVGkzaGdSTTFwNmNJTHNWQ3RMS3U5N1lRL29MYklJRGVrTm4vWXhPUUx6QjBnZU1hYWR0aER4dm9kazFkWDdrd1hKVHd0Z1VxQ081c0FjTERGQjlBSjNycldpMmZ4ZDBJL0NKK2RXM0ovY01GN3ZsSTJURkQwaGtuUUVnOEJ5dW02bGgvaEJBd3VlaEc1bDZ2c0M2YTlrQVVIanQyUEhOMjgzK3c1YkZyZDd0VGFtaVNHbk1KaFBVT21lYzhtK0pvaHBzK1RQbzdEQXRETGxiN1JRL2FNVVBEeHlqUmVTVlBEaUovbU1USWxHbk5icUZHYVZZT0hQRnl1bWh1Y3A3dVpkS2hIL2NJM1MzdGh0T2ljTGlYaWNhdkFZY3h6blZTTDhvYkt4ZEMwcFJKNUFEdENUNnBGNG9LRnU4TSs2Q1ByZHpZYnl2WGtsb2h1NWxpaUNpY2NvbzFNN0lKSGsvczZlZVJrRWhMYW9lbTJLL1VUdWF6eEpXR3JJZGpVN3dLcStZZGd1dlpkRDZDQ0JzMnE4TG5vbmxzRTFEOUpnZzJ4SmtGTUxCRFFpR0QrVXh5VE0wamZORkhBWWljaGtXSCtKL3hMQjgrR0R0dm00cTdtNFBDLzFKMDJJMVU4TWhoVU9xcXg0NFNBald3SWhWUVNKMjI5dG4xNkJuUTFFM2owakI0aFhVczFmV1Ivc3MwTDh1QzdBSlBqU1ZCcWJsRFJLV2pMZDJhK1VKdisvODUxTkpUZldUT1FuT0xIdmR1aTBWdGFGb1ZNbXpGOGt5ekFESHBnRHA4aU01MEpFbm95RU1VTFJTdFp3QTdiTk1KUkxJelRBWTZqamVXNEM1Mi9ieWVOOTVTdWtLSGtaTVh2OTFCYlhZQWliTm9IQmFaaFRFeTVibkRrdm1VSk1UUS91WW5YMUtDWkhZUTdyMjdRWDNCNVovNjFzVThDVTVTeGFzQ2pib0ltV3IreXFjZ3RidnlKRFQ3VjU0QzNWMUJmbTQ3TmIxRC9zZEpxamJ2cmtrSjgxNUs2TEZhdmlmSklwbDBFaXp6UzNEV21UUVFDVkdTSU5ncWMwdHlGKzg3SkxvS3lrYk9Od0pybGEyYk5RRDN1ajI1Y2NBVHQ3S1Nra0Q2QXRxd3Q3OTBmOFlLdW9rWlNqYmdhTGF2N1FCWnJiSkhveE9CUSt0d3pTRVp1akVYcHZhUThNbWI3dXQwTEMyckp2dmpiSW1LZmNHaTNEazJCWWgxaXUrWFJ3SGV1aHJacEhVOUlzVGtlUmZlcFdmS29ORUx4T0loR1Q4cldDNDNVZ0hMOXJGMllpcENSR0tqamFTSTlBc3BtZlc5SDY5UHAxTEswSHJRVDBwQ2RsQmwyZHByV3hyaE12Y2gwTUFCd0pocGRKelBWc1NCVXgvTFJaTVZhSmtzMGhReFZMOFVFdUZDcmx3NkdRajhHNnpjMjJLV1RST3J4S3FDV3o5dVAzSHZiQ280QTA2NFJpY1NVdEduelpOYjN4L0xzdCs2Wk5ja3FEMWJwb2xnMXp4TkhzcW4rK3dmWnd3Q2VzZDA3aS8xYkRNSzUxRnJrSFJXelJTQi9aS3B1T1dMREc2TTdwRVdoaFRrYXNGYXRoZFpFU1Nnck1xVExoWTArUmlkT0FzZHNLcmp2MHhVZkNPdUJYRFUrd0lVeDREUTFITHdoaTllRkhFNUJ6UGlyVVVYUDV1ZTc2VGlCUHBMbWRvQm1qb2g0STd5MkpnZWRxVERTSDBQbFo1ZzdWZzdsR3o4RHVybkl5bXFsVkQyRndPNFRNQVlGU0pJZDI2WExUNUpqUFpsZHNjWktKY0JaVWp5VXRQZTkrVlVKQTNzVGo0K3Fwa0srTkUweThmSEM2Y2o5SEpIOVhCRDROMXdmTzE2MEtQR2cvQ0hGNElvNFlaVEdXMUdhVll3WEJJR2kzaHR1Y1h0VzBEUlhRWFM4d3l1Q1pFMitVZi9XTVl0ckt6Z0kvZEtVRzBtMXZ4cVQ3ZTAxc09mTGdvODlmRVljUDZRR1hkb21OWHF5SHJqdzA5RjRUUk9KY0J5ZUx3dnF4TlZISml1dUMrV09mSURTTENVY3JLc1ZuSi91NnpSdHFHNjVPcy9obkNwVDBWYno0cGRMQllIMlVJby8yalhJYnFjM0dnOWhlaHV4VjF2ZGNtTlBJeUVxWVYxT0kxVjRrQTRhYjRUbWdWNUtPR3N1Uy9mNXh4dHl4NVQwQzQ1Q3AydGJXbkRENEZ3cDU4YjRTR1o1UEVuMHNFemlKYi9CT3VjNzFaQ3cveExzWjU1VGlRWDFRRmNjK0lBSFlwempWaDBNZzA1NFRLVzgwaHEveGZIVENPaFRGTTBhYUJibWRnTTB4OWU0bVk5UXR0Nk5aaVQxRGVIaXEzT09lbGJsc3BSY3JPSnl6Z3pEajlPbjZ1WXNWZTVpUndxZW16RjdTYmJodHpEbzlieG5iQUVueHJobERzSUJXZ3BQbUF1WU5wY1Q4bDNneGRtQ3IrRnNQVWZJZVVZZHV2MlBYcWZxNE5FdU9iZEVWMytQeEpFWTQxNWdSMHYyYXhOSWlqZjl2OTJ4Q0FWV2tPcjdGZDUvWW04b3ptZ2pSblJ3RVF0bkVYY2EzdnRnWlQybXI3MzI2bU5EYlkyZS9vaVlvOFp2dU8zOHIxMjFra3laVWwzbWxsNVVGOXhKN1hhNmNrWFJoK0tyYUZUZ0svN0crVnZvSHA0cE9lcUhFSG56dnpTN3ZkcnBWSHNuY1ptQVlINU5CYzlCT2JJRis2QW1aY2hZUjN4NHRndW5RRzMveTFrc24wOXIyaU9idGJqSjdWTGhWTUIrdEV4WlRmRE9IbFhKVHNDYVJhbnUwUzhvQ3Y4ZUFqeFcxeE80K21ndDVMajBWSHp1QTBqazJrM0hmVFpud1dnSEFQbVYweFlaK2p6K2ZqTWtJbFBHOWFmMkxqdm1OOVJFZjlLNWRwZ2V2S3ZpNUJRWUpIS2JWaWZRYTBjRHVRaDRML1N5QTZjTU9rNGZleUhNYktBeFdsb2ZxTEU0aVpCTW5HL3h4RWVnVFppRUw2Zm9zMkVNQTliSkFYT25WdWRLaHR0RWxsNlkzb0x1Y0V4eVpZQ3VyVXVqQ3VmL2crSUxiQWlpdkkwVWVSbTZvSDJUcnVBRm1paXFOMVV1Wml5KzhmTUd5Mi9vRi9vYVJSOGtiK01ORWZ6UVFVbmZTWG9JQkh0Ylh6UXRXR1BVZzFPTCtXVVY2UTBTN0RSK1pkdXBTYUNkQVowWG52Y1ErYWM1alBKYWE2UzI5d244U2M4TmwrakJJTHQwRk5hSG41MHROL2lDRFpxcVgxVk5lWjViVjdySDR0WEtNN2FHTjJScThvaXJiVTdvMzdNTmpDdlQxenlRZXpRU1ZDTlFGOXo1a08wdXZNd3lCaWJTVGVMVHlVeEVJdFJmamI5dll3eHJIZ3ZrK0gyWnhDN0F5dVFYMlJ1TllqWXVtYjJLbTM2TUpCaXFOTGxkZTNGMDNYMjQ5anovdHE0UlJEazNIbmh6dkpOUHNJMitPSDgrbnVuMjRBQ3lQTWVEN2c4UzBUbmIrbVdPK2xHaC9wR3ZiTmI1aWdxcVA0Z1Z2SGdKSFRFSGpSZzM5QmxPS3AyTGthUlpLaHhmUU1WRkY5Q1pTNTM2aVhicFRibCtFOFdzZFlQZ1ZkQjdkZkw3cGwycEhucVFHd1hxeCtQZzllYU1hcFBKMncxcFA0c3NlRHE5RjFPVHZ1QnN6Smdya0RFUHRQQytjUGloYVNGRnVSUDBKaENIQkoxeEZrZHVaSHZGd2x4NC9ndllPa3djSU13NjliL0FZRDZlRnhkN1F4NDRTVUJVOVVnT0JCTUV1d2ZKcG9kS1NsU2JoOGNCQVBKZ0R6RWYyYjBqcldVd3B5cW1ubWg2UVZXM05TOUI2WE9QdldLUXhRc09ZMll1cHNwdjI2ekwvRE4vM3JxNzJ6Wjl1VVhHSGlwMHM5ZnlqN2VZSm8zZ0htSGs1OTQ0Q25WaEJuWHRIWFYreUttQ1RYQmxJQlZqUWVaelhzTlRwQnFsQlMwMTI3a2YyTHFlT2VTYmxyaHJLMHExUzRBNHFEWlgvMXNrR0tkWDNiRCtsamtNUGt1SVUwNVVobTlyaHRQSGdtTmdFeGtocmlIOHd2UkFzOGFzOGFlQWdESU1VM2dYWGxnemFJeXNLamRJbXFOTUFUdUIrZWNsWUdqam5DWCtLTmVrK2V5VUpvallUN0p4ZVVoMDUxMjh0Q1IyQnVRK0h5bThVaW5SZ3A4V2hBSDZsaEVJTm9FUjFpbStIeUIza3dPMkdnNklwRXZ2RHBhL24rRCtuM1M0SXdURUIzdFNxWXVWUmNadFdiY1ZpbytHakxjNnVIb1hTRTEvbDBSekFlUnplOWNlZml3c1BWSUUwV2RvUjExSnltWERudlFqM0R0QVNrQ2E1QjQ1RklrUUQ3NHBHRjJGMU9HOUxValdTS2I1ZG10cE1uNU5CWE9jMDVKSSthS1dLMHpHTHBsVXVJR0hlQUJUellFMC9VQmFyV1pPWjJJTWs0OVM0aUkrZmtjQW1zTE5DVXMvQ2RRSWxvblIvdmlKYkRqM2oyQUJRR3ZURk10YzF5MytNa096RUtJNy9vTG93MHp6VTV1Y3ppVnoxOVdvMVpETXBRUjNFM0tXQmpGZUlpWUFyQk00V1hXWVpPOEUrc3U0NXBKUXdRc3NjcFlNdjBRenk3U1FVeHdFdzlhcHZyMTV4RXFwem5PbTFRY3FHcXB0dVdBRUFodDhzRnZQL04yblVNM0tpSC9VMFJ4OHhPaTA2a0ZMbURLcnppN3pOVndyOEtaUEQ4K2lsVlZ1Zm5OL3NWUzdsVkVJeUNJOTBxL0xEVmNOZHpCdU4xNitDRnB2blBjNllCTk45KzdWcWREd3ZWZ2dFWnk2ZmZSU2t1VWZhcUhYZ3FJWWVYQUNTZHVKWmJMRkRrSDRoNi9iL1NNUDJmaTFIM2h5eXYwVk1jWHBzcXRDanVlQy9qcTlGTmdyYmJLSXFIK255c3NwclJwNkRlaDdnRktGOXVodUFveWdqVWg0ZkhMQnBndTJvMjl2SWZIUTV1OEV0YWRWTVVveWMrNGFia1hiTmNwaFBOY05SeWk2RVZqMjZYUStEZmY3OFI0Nm1QREpubWFRSVk5UVZyQVZqS0xaR21RVDRHR3RGY1MvMnhqS05ocGU4Qmg5QVpBdHV3d1dTTnJIUEZhdHFHLzV5K3JkWXFvekhzcVo5enFkbTJXN0tIaDV0eUpneE1waEI4MDd5MXEveWNyZVhDSVNieGdLbEphbkxGUVc4UzlqLzdUS3pRekRLR21uVHpuYUFYMDFGdW9GMGhjVGZ1YTRsRnIrTDlQQkdneVVFNGdSblF3M3RJeTcwQUVoRHpkVndWSWR0d082RUN6ZXBySlIrcmlZeEg2VTdOY3h5OThzMFJWRWdpanl4T1oveDJhVTlxaE0yMENHWUtTK25rbXkvUVV3Wng2bjFwMVJ6L2pnRzZ2WTlsTk5rMGlGR212RTB6MU56NVI0amRZVUhrT3dEdHhHMEMvQWNnL085aUVkci9qQXJjMTc0UUhqdHFYeVp6YkR5bjlQVnlDbENWYWNtVjdISitUdzdiL0s3cDdHcGxHR28xbnFzNEhzQjN6TndKTW53NUhFRkUyV2lwczdiVFVCQ1R0TGJvVjZZL0xUS0ZrY3dZNU0xeDEvR0lFbU5SS2pVQVVnVTRZYStzeUxQN2RpL0ExcUpCSFMwNlZRMVQ2aW82dzVyQWY3VVVZWFBzWjFOQ3VMdGxLazlqR1ZCNXhpRTlCNGwrL0g5dDRVVG1YWHNlQ1BxRVoveXZ1dVhYYnBndjM0MWZndUxVTDVCeXdwUytrMkVyaVVZenUzb0NZNUV2WXNXZDhqMVlrVXNNWXF3TGs4eDZMbG1VRGxiWnN1Q1d5NWhmbkE1TmhWNDFRMnRNdlk4d1ExNHZDV2VoaEVNaDlzYWxWWUsrVjZwQUlzdUF3Nmd2YTRKdll1N3hMdFFFaTB3OGpnMDAvREVMZVFWeDV1T2p6cGhFWUE3S1BNV3Bjak5VU0lBUWVJWWpEY29MNTFndFVOZFJtNlVIMWNTOFVKSmZhVmZwOSttVE9GTUVyeldQWFZNdC85MVpwSzM3U1JneXdMc3VoeUtMbk5YendGb1llemZMc3BnQmwyZ3A1L0dZNWRLenN5U2VvNzRzQVNXbDlMS2RyT2M5UExGUmMyaklNTXJtR3gzNjFvV2ZYYW9jdnkxajVWQ25OR2o1dDkrZDBPd3E0SVB4dHhpVlE2U1k3Slg1dUhvVUdodzRLZGR5WGt6dU1hbCtlZHk3V1hmN2w2TGtubis2cDZ6MCtic0pkM3ZzcHNjV3dXUEZpVGMvcU45Z2U1U1FVdDBKeVBLdjErS2NDbHQ4dEozU243MytpcmRNT2lhaGM0UUN4Y3ZDN0ZFZGlQVU1LWGFWVzdJNStLNmI4eGtFL2l0bk1GSDBzZ0loSzRQYXZ2dmFtbDFkTlNMTUNndTZ5R0lNVG5wNW9vNkQwS3I2Z3BVMlUwenA0ODVzWCtrK0Y4QklrMy9wczZCUFJ0YW9ZVGVUQVR2ZlR5RXRsOGxGbGFXUTNzdm5vY2l3MElBVzhQV2FjT0lUejRuUmhucDBhSlI0V1duNVR0MitwaXZXMUZ5OE5sNWNSTElSalFMNWtVOW1ha056Wk9BYjJRUDl0UVRZaWpvMzBid1VDczdXWWo3NXdLUmVFY1BYWW90YjY5QjBUQWtSVEt3bloyazZ2UWRiKzJmZzJHZVJqMjBvU203eXllNy8vRVp1YTVodDRjc3Q0UG8xMUxtb1MxYm5RaVM1VU96Q2NoSDJYandMcklIbHI3YldBeTcwMW1qcE1xZ1JZOXVzcURSUGJSZjF5WVB1RkFHOCtDSzlmUjUzTkNIUVRpMWt4OFhHL1JXSGdxRVZXOGUyQ2ZGY3ViRngySWRHM2FVejgxK1U3dHM3VGpVVUhESWx1TW1HNkxhb1FaN1ZhYlFGUlkwVXFDK0ZINVpmWjNYM1AyM2lSUHFMdnYwTDhxUmMrM0JRVE52eXlXRmh0c2FQazMvTlJzQkFaZjRLS1pwbGZKc2c4R3FKdlMzemw5VStDVXo1QVY5ejdNNzhvemF1dFlTcGlFS0dlMlJ4SEV3b1pGS1lrRkVsak1OMHQ3NWxpNFFqYUg5Nk53T2NEa25rVjduU0kwaGxhNEpDK1dLL2ZmcjY1ait2UmdQSkxRbWxQTytrSzBxVHR0cVNCUTM5L2V0TzhNckhPTFlCeGgxT1JPdmZobzhOMVFYNllnOUtkVERVQlFkSldmcmhNMGYzdjhhaGQ5NDFCdWlZT2tuZVdTN0Jici9CZktXSXlZdnBKaEk0VXJnNVhHaVR5Y0VJZzMvbWNCSUt0RDlxbEx1Uko4UGlSQnYzN1I5ZnJOREt1bkR5YXpLVnhaUW9JMmZxeElCRFg2Zk4vVG01T2FyeElnY1NFWGpVVFZjU3dqNWs2MThLQ2dYM3R3Und2eUtFK05ucW1TRnZTNHZVdC9Vemlnc2Z4QkhxQVovenAyZ1hTUllyRDMwTTYxTUdLeklWM1YxZDgxN0h2YVlyVEVCb21TTVoybHp3M2llWlVyZVVmSmsxdG9iZENEK3pubG9ZNFJJaVJ5Z1dVQUVKbkJGMVdVRm5QbnJEYzY1eUV1K0R3cUZpS2ovSk8zZXBMUWd0ZzZzVFpKamgxclMwRGN6TllYcy91Mks0aDVCdkN3eDJ4OEZWbEtjcEF6SXFKSzVUR2d1R2Q5TVFIZlBIWGdhVDYvY2xVZ29JN2JiNHJLUFA5NERKL0tPK01oaS9ySlQ3SnhNMTZGNWRobzBwTHZadkxHUkdaSGtRRVB2OU4yWTVxTVdtYkR0UW1YYmFlMFVqd1ozT2Riak0yakZadTdnRHpISTVPaGxSd1lTT2VZZXpLUXdrd3IzTEhpN2xVQlhUMlp4VUN4ZmxNN3NxSzVPTjZQSGdFTnZLNVNLbkE1K0U1WktEVDBXUlpFMjA0RmJXTnBYYnNTMGNublJMV0ZsRmZkek5BTk1VQzVrSDJSRWRTaHhEMWpXTTI0ODRJS2RoVndIUFV2a2QxT1QyTGlKQldYaFpmUVRSZHlaM1BmUEZmRWxlK21sU3VpUTRFZVQ3SElEdzhTNmxhSm0yZTcwc2psMjNhYUlobk9NbU1OemJubVpyRzNMVXpsWUtlbHpySUtVN3l2QW9xbTFuYzVuSStyR0NsejVRakF0aFhucmtqbEN5NGkxZnR4SFVQMjU1bE1lbFF5Yk8vZEhtam94USs5YTNaZGpSQzI4ZGxNOGZDTmpLVmJCOHU0dlRwTy82ektqb2tVYTNCdkxwdktTMStNN2dnU3R3YURHZXRGcG9LUnRPMDhnYVBkQTZXME54K1RIaUhCT2FPbzd6V0E2c1d5d1YreVRTbi9PUU5ReGM5N1p4a2RDanYyTDJTVjUzYmlEMnhPZDhoU0FDQ0o0ZUlWZnJkK2k5d2JLcGcxNHJZdFZHcFZmdW9SdDBGek84QmdBQkZ3QnRlRVl1ZUJRQWF2OUJFaFJzLzJ3aGhQSG5kWGxxSzRlOFp3emFnY3pNdzRVUVVXb3o5MklxaFQwbjhCalBQTWFrMExjS2lYUjV5Vkw4SUZtVi95Rkx2SHlvSlBSZjdlSmJEV1FEc3oxMVdxQ25ZdkJEUUhIRmQ4WUlITmFXeWhtbzl3UkFGNjRRWHpxdkwvZzM0cGxnZlpqOUZkYWI4YW5UMkdicEZSVmtuUnljVzZFMFdQVlpoL2MyZS9hRjVrSzUyVzgrWlQ2UWNOWGtFTnBNcDJzYTJ3a1lDYzF0dDhpSFhEMldnOXF1RTRHcTZucmlId0ZFeE5STlVXREtiamc5N29lSk9RNHVXcmwvN3ZPaGNTOXRIQS9RMEljaXZjTTBrNXBSaWxaUG5JWkRld1JsNzRTZ1NMc3dkMDFUQWU5bFhnVFBncGFOWjdpampKdkg4c3ljVEYxQngrOVVmZ1k3Z2hPS0svSnplMDU0NFppalorZ3BmSGNtUkJBdE5hZW9jNXNFT1ZNeHV4SWI5WGx5bUVwQXVQNXdZZjFkV21oRG9SblpyRUNEaSs5U3ArR0R6cHFxYVkzMGgrZUVSRWNjY1Z4SFVSWXRhcUs3MHFtQktNbUEzVDRDVUF6WndvMXJaeGZHekprdXlkNXAzV09yTndHVnA4bE1rUVVpQWQ4R1hhTTRpbGRKa1J4VVB0TVQrSU5mWXJjL2c5WWV4S21IY09Ic0FTQ1RIUE8rcGVMbnc1N0Y0WVd3TjZVZ1FaMWhNVnlmY0FwL3pnUVBiSEJrY0hoV3AweVhtNEhNdTJmYkJ5VmQzak9HMUgvZU41QVdNYjFacDA5ZjI3aHZINTU3Uy9YdnF4eWdWWnF3RGRKMlV0Ymk4TFYwMXZKRHVnWGt6OUQva2FYWmtYeEtxOVBDa3ZlWkZlOThVVjJPeGNxUmYva1VMbkpLODMrMEpOSlVBTkZWck9Wb3k5QTl6VjEzVXErbjNSTWtFZ2VhWEUreC9MRDB4WXZvVUQ5VVpuM1dIbFhjaWJwVkdzZWdtdVZyRzZvOUd2cjlNNDE3WG5tYWxaTFExWVpZL1JiV1h1OHhjRlRNR3ZDNktRVk1peXhLVDF2Q1ZDRHlqL1JCSTBMS0xEVjM0Y3gxamRiUTRkMFZYcjhJLzVRaUhUakVlNE82ZDVCZkV3MHVLQzVTQ2tDRmtoM2xyQjI4ako3K3VUT2N6ZUZXblR0MjJVSGYrcEhBS2xicm1YaUhEUTBCa1pLYUZlWDkwVXhnVFRFVU1FMFVNbTNxSzBCUDdjZENTVUtIUTl4bWdoZG1xamlIcDFlZFV3K0hrYjJueVpCL1dNUzdTaW8xUFNzZ21HaWU2S2Y5M2V4ZDhtdnhTckJEOWl4ektZK0tiTUNVRFFQMVMvdXdhT0pubWYxZGNESkFESDlrVGE1WHhpa2JZY1hvcUpEbGYyUE1CUG1ub0ZXaEcwa2VpbmVkMkxiNHNnbFBtZEF4eE9tS2pqUDVVTkN2T0xiQWVMLzFKYk0xMlpZeTF0OGxCZGNMSlZSeWIxeW5yQUlDSTdnNGFYTHQ3QWR2Z1MzOG8wMmg2d3p6WnV2Ylg4d0ZYY210UnRQa3VGNTdQR2F1QmlaOUgyUEJxUjI4eEJSamF3aWsyQkYwU1dEdUhodDFRMVJoZXFRNnJHM3FvMkIwN0lFaEdMQ3NmeFR2Y01VbStNRFlkOE5BK1ZJOUc0M0VuZlh5Vi8yUE03R0JtZU9FYWMwN3dhN1p4WHRuTWdzOU9MTXNhWUk0Qzd6ZTBCUzFucXRRSWZRS2VYbE11dUpJNVdJRGxDaVJuZGNjSktpVkhISWJEWVlocTJOdHZJQUJLV0hJVCtPL2YrRGNkaklMREh3bW1mM3lIUmJsR0pscThVNUNWald3ZWkrMWJCbm91M3NQVWU2R25XOW52ZVpoaWRFVE1BT1ZwTllMYlUwZWMrOHpKdnNFUWdoTDlvMmVhaEtacmc3amJSaExvMnFQeWUxaklUZUZEVGUxQUgvQlZMYlliY0I3a3BUbVh1bmdEclRIVHI2djluNXdyZk5OSjlmOEZHWmJsYVZKRG5XTExxSklRTnZzRzRSL3M3WTd4bk9ZOVg0UXpkUmRzZ1JhS3JBVHY3TnZYZWFIYnJKS1FGUFRHUHBzcU8rTTZvU3R5WUFWWVNEemhkczd2dElyckJGNTh6V1o0WmVQR20xTTcxT3ZVeFdBR011OXVqaG1jdmNXa1FtbFhqZmVBQW90TmwvOGdYNUdQT2h5SmN6dlMvc0J5QU9MaWJRTlVObHpjNExraCtoN3NYck9WWm12bGlaU2hEMFF6UGNKU0NDRmN5M29scklqQWU0QkRadHlrM1hLOWlPelFxYzk3bmNqYzB4SXJkYzUrN2tKZElDd0wwcThRNnNveFpScDhaOTREbEEwTkFBdS9waCtJT3dkYUg0WVlmUFJSYVBTN2V0QTRxdjBhSGNTWUtRVkpsZExrRDBmRS8yV0ZpZUd3T0pPcHNwNWRZRGlGZE5oQ0pnMERUdC9Bc1p2NkZTNlUyTGN0SWJmTnBCU0xhanJ0c0JpUTFtUEhlYnplTlg1TjEwTEVSTnJSd2VSOU5FQk55aWlTckJ3QjBvaVRFM3QrZ1MrcHZ4a0FwczI5M3pYTmNpSGJMWlRhcFRldURXdldmcUhzYlVGL21wQVl5WlVhV3NkdFhQbk53Zy84aFJIL2ZkNTN4WDV6Z2pWK3ZwbVpQYk5pSjJJYWk2dU1jRlMxQXhTLzFBd2h5cW5TWUVKZVFrV1JGb0FUNEJENHN6WU1VS1lCU04xbDlZVjYxcVoyVXlvQlJHemtBa3o0aDdIWHZQdm0zNTdoNDRUTEpnY2toM2ZTVGc5S25PUExNSm5XV1diQUoxODREcThKRTQzQlNndmp6NElJVFlmQ1U2Rmg4QytVVGlzbFhLVXdHUE5CcDgzSzVzZmRRZEpEMXAwbUp1SVBIUnBwQm9TZTNJcm9acUhBbWxFREdOSVBFTm55NjFQV01HZUs2U2dQL2tHbUtXcWE4RzI0eEx2VG52eFZTeEhtQmFXWDVNUzZSMTc5ZTFiN1dLMm13VTNEcGZMMzgwNGZ5amNxT1FhVXBReUFjS0xqTUwyaDlWeHJxVG5LdUp6WXdNRlU5YXJqNlZyV1ZjSHVQV0VUUTlkaEg1bU0yMFkzMUM1N29kQVhuNm4raHo5NUw3V2cvd3dzNzE2OUpXZDJ3QzNlSHdPeGtTamI5b3hMQ2swMHBTTCtLOVF4V0tuQkkzazZJN2g0VGpEN1dTb1JDQzc4R2pTdmQ3aXZTbTQ0bkhjMXpDMFp4MFpjSEc3ekQvNGFxQ21KaW5aa3liRTlvNlVHRFR4VlF3cGRTcWtEL1F6SW5lVlV5dXB5c1JLNWVKRVdBdGFtOXY5MUg4NDk0bFIwT0hNU2xOSE5QcUpoTGs2ZEVuMVhUWjJYRU1PaUdEZng3eVpLN1hBZ3Ntelg2K1JBSFFuMUxKQUsrYkQ4NVlCdVI1Q1ZpdWYzRml3Z3RoZ0RyMTZ1ME5ZUFRGNVN5dkVXY2p3Rlp1c2ltNEc2TllERVhUd2ZQQjRrL1RFdkpBWTN5M2l1d0djOXk0VjJOdExRbUlSVC9qNk01WDlYWkc3M3ErM2t3ZHVoazVlK3ZGc1NReUsvcVRobDVkVk9DWi95em55TEpUQUt3RWhRdWdVTWVCc1NBVmNEbU04aG1JRkoraFEvdVdRc0gvZEJIT3hHVGlRcWpYZytSNEwwdmZYYkRuR0JLZFM2UlU0Ly9KMjM4dFR4NTBxa0grU08wMmtRUUs1T3ZhcUNzNTBXVy80WjdrSEtTVERMYU9xeXVEaGVPL2FBWm5JZktUQ1M4VzhFVWpDUUc3OW1INFhzY0JzRlNsbWl2ZExwalVFaEhxWC9CSHRNK2FXdzhwbEZGRE9wdmtSU1BWaUREVlZleDV6aXJnakRIRUt6ZDZjb3JHdmhBQTl3VjFkVEcwRlE5NFJheFZNZFJiSm1LeGlpRy95cnd6THdYWkVVZlkwVWJiWkovaU1jeW5ucFRZNWpkSUsyeVpscWtOaWhtS2N3L0w2MkJvWHFYbHFQUFdmVHJTd0lRaHE0Wmk4eVM0bGxDM1NjSGorQVhxSzZEeVBQQzlRR1ROOTlFSXp4dGdpSkNOZkt1NUppQkVWMnoyYkhMQTFVVVlabkVaRzhKYjFEZjlUclFOaEV2aUIzUlVRcmVFYXJmazJUdFNBZ1RGVU5pL2NNRjQyVzMraUU5ZVQ3Z3o4Wnpmbk9IMjJLSlBxUjFuOHFCb1dFQThUT0dweGFZOGFvcmV1Z2YxcHhNL2hVNURuMnNlZzNCLzZTTGx2RUlUMnJocy9kbmJhdElYdC9ibmwvSWRTVUZFeWd4MUV1bnJGZ01XcWQrRS9BT1A5VUc4VEQ3N092UnRMUHVMaWthaGFZVFJ1djhUb2dKaGlBa204N2pILzA5VnFUS2lsSW1RVHFub2NTZUVMV1pLSkZEbEt5UHFzNXJMY1pOTmZhRjJQS0hpTWIvUGx0Zi95V3UySUJtbUUzUUdsVXhTU1NTQkdWdkt2Q0EyNGFmNUcwemE2Ump3RTdaOEVqWk85OUQ2TEkwKzBBYnlxMjFsdktrYVh6b3RCUnVtdURDUUU2WWlNUXprVmwxakE0c2F5eldGQWJ3aWNiY0lMM0RmRzU5NHo2eUViQjBXcFZZZ0xlbGJ1QWIrOWRGNlRpT1h2enp2RnZoOEZVSlR0azI4QWtzZlIwaGZuMlp6Vm5KT0xHbUdOejAwZHV6Z25wR1RXeFZDQ2JwS3JaeC9RcHJzS1NMOGRMVlhnT3RsK0lXWDlmR3V0NVlnR1diSWc2Nlpyc2pDS3dHVEhreE44QVdiaUpjblIzNTRuOWlqRjJkMUF2cGVpeUM0R0NRRlA5S0VYWHlPVng5bVV3VHY3dTY5RWVsa0pzQ21wNGVXWmg3cVZZeU1OaDlKVnlYWEtWMjJUdnNqbkx3NkFJcGd3eC9kZEFONUM3L1dpTCtZRkhkMHR6TFhNbHF2MlRiSXIxU0k3VFVROURTdHI5M2dHWDZVSWpzalN6L29jY2Q5QXluamxmVUk3TzZTNTFsd2xaV3hVcGlqZ1FER1ZzRktYK2VIZWYvUDR2VE5NY1oxQXkvQnVRRmpzY3hhVjNYQkhTbkdhQ2VLaGlpcDh0UnFBcUpGYytYYkZCWmozSnQvN1NYcDVkd3FyaXg5U2QyVVZKL0FvT2ZwY3djY1g1WGVZcm5oVlRQbFBZZUxIS2ovRlVUOXplTzZGSUthaHdJdFNRS2RXRmhMU2NLWVBxbERnaDhUcHpERkxGWVg0cFo2dFpUVU96TjFTWXI4MDB0ZEZLTDVKU2pJOEtueGhSTjRsLzM5SGNPdHhYc3ErV2EyQ0w4eS9Xb1gzUSsxSStldjZxWEsrYnZmaGhUVzFmM1hIcWE2ejBGWDBJRTRTK0FWa1BYSlYxWVg2VFpuVlppa0JGMFZTVWJGTEhVbUxtYTBOZmxqU1lWUW9PUkw0NHdDV0hKY0YzNHN6Tkp1RnZvc013bGMva01hQmtaU3EyWkJzWHhERFExcndsbmJUTFliaWZiaVpUOVcwcHJ5ckNrRFovSWFqS2JhUVlHZkpqZjdiSk91WWR1VW9aeEZOVE80Qk5pdFlkRzJPREc0bEduWWROVmFPV1lCWjJMek5McTEvOUN6MFVXYlFpYlRXcE9JUGcyZkQzREVwMFN3ZEkveWdBUy9SZGltYWgxbG5tZ0ZKRzcybnova0ErQkdHeVJrRzN3aS9HL2NFcHQyMGNYZ3NXaTBPMmVIMDdmWlc4eThHU09rZkJ6QTJaRTJENTE5VmZYOVJQYzRYNTA3cm03VUlaNG9xa2FUTVd0U21WVXJja3VuMC8yc1JCMUVFbk5DckdqU2d2K2tvei8waUFTWVRMcmxvdGpJbmlkSTk0amUvS0lsY1lpMUMrQlZOWjUvUXVwNjNnQ1JFWFBSZzd2UGxhV2Z2WDl0TklvWFVSY1Erb1lzbmdOdVEybWRpZXQwUmp5enloVWtuNUlSYWZHU0hNelE1NmEyMUNYZ1BmYzByT21pOC8zNnFGbC9uaUlmV0NPR3N5YSt4UHRtL0FQTFo2UG1qVkduOFBibzRFQVNmSGFtM3BjM1FsSDZXMDQ2WE9jSGFDNUJSb09ONEhyWkx6UENkKzFrNEx5T0FyZy9LY3paWG1yMGFQWldkU3U5WklRQit6RXREZVFFSHc1eVVzd3lsVmRYenZsdEJWYlJ6M3FTWU9sWUxYUUV1cWwwdTVUZzZjMXo0WTVhenZvdzcvWm9TTjYydDRvU21wcXpodXRPMU1rN1ZuZjRGbHBiMWNEbzZOQWhPeUVUNmxZVjFkUVNVVW1QbHRCakJZYStadFFRLzBYOERUNmY1cC9CME0rK0RrY3dBbmo2VVFiZjhyVCtrWG1nR1M0RHlwbDFyQy94UU1JRDRBZWl1enYxREZUMHVUTTNpbXpHSEhTS1JRRWRDekR3aWNYR3lZR3hvQ1ZHVUk4cDU4K0JLbXhCWE55QWdwdG42cGxVc1lSQkV1SnZROUYyeVhQUkt1VXRxQk8zU1Qvek5zSGp2Q0tVQ0VrMHdHT2NIVnpFMGJvd3pxVzNoNHBxTTl2OUZrV0lpRFdMSklsSVNvbmpOcFhkbTIvZmFjd0F3TzNMTjBKc0QwN0NwWFFTSVNqVlkxTitUNHE2dExuSXNxMlVwVkpkZWFST3oyZDRNczU2MDUwZGlHTDRIL2ZwMFMzR3cyaHVTb05NN2lHYmFCbStzRFFiWDIzd0JSN1hIaGlNVWpJbFJyaHRHUzFJRi9wNFgvR0xSZXVQRFVGTklDeVRUOGwyb2FoenNQMWVoaFNsaWlpRG1YeHpWZnkyNkt2ci9kWHFqc0JYamZBWmZCSlVxOEp0dkFJcFcyQlppVlZLVzJWbkVpYXZBc3BBZ0cwcmdYQmNVK0Fjdkt1TmJ4REhQa1IrVWUrQTNhRkh4UGpyUEl0b3pvaFFNbW5vN3NXTCt0aHhQdFEyUDlXYWlYS0dKRHlUUG9LWmwrS0JWam5uNi83d3NBSmVIUWdQUVpQNmtXU3hUNWRxaFJXcDB4aHJvQStoendUdENFZzNaZFdFZi9oU01wc2xMM2VjdzJQQWJDM1J3RGg4bklqdnVUOWNDbXhEcEQvWG14OWhrN3o4eHE4Z1lQWHl3YjRwMDI0M0pISXdVcWs2Z3RZbXozSzRoejNkK0xXdlhYK0tqSWE4VkpXR1g3Q2pvc1dCcGNUdE5kQlJCeFhoMUhRRDdESXljbnI5NjM4NzlzUEhaMTR1WHAvM0VSWnMzZlltVTlqakEwWG9MeGpkOHhCRGJjaDUyek93bGdSTDN2YUtWZ1ZpY3lyMTNSenZWZUtaZ0Jqb1JGRmtOL05RcDFsQ09VTU9EOG1VRUVuQjBWcEx5N3ZlRCsrcDZKU3F5SzMzNHQyeVFJWEhhSHI4MlErZTdiSEh1NUFPVCtNMkd3UWRaUVpVVTZsa0w5d09RYlhPSnUzdEpPeXRLUFh4UWR2ZFB0Nml5bUw1SFkrTDMwNWtESlBYNG51ZUtsa3lLQXZwM201RVRaaklTV1NSdytoTHhHdFRBT0E3VjVGbE9zMnE2MXMrMmZkN2lHTUU5RGhpK1Z3aGFIU0hTZ1hzMXJjOGppQm5udzVkdFlzL0pobENFSy9pbk53cFF5c3M5NEJFQ2pqM09lQkJCblZnYVJUaGI1MHR4YjVDbFJFaDFDU2ZNWVFKMTk2NnlETzhDMkZsQzc4dm5Gb3g0d0hndktEZ3Q4MnhsUVpHbERYRTVsSDZKMVpRVVl2UjAwNUEvNGtWSFh1c3ZoRDNsQ0txUHZEZjJtUWZiUHprR0xRTXh4bVdLOUptNlU3WXpMdzUxY3RFaloxdCs5Q3dVQUsxa3BXZEZxRXZaa0Z2MVpXbm1XVnVMN09FazRDZHFvNm5lemZtN2M5R3VRUms0Ri91aExMSE5jQXhHaFplUVZ5b1VndUxKeElJUzFlVHRSWG1QNTRaV3FrV2JZMWw5RTc2NFRHbGxUK1BTempjTUh4Y3d0Y2JGWHZvYlFhZjNhTnZ2NHd2V0RGMG41U0ZwT1NxZVhRMjNBV3hNRDlSRDU4RUFFak10dzZVOFFLNkcvWG5aZkI5UDBoQWdlQTQ0VXU4QTJlMnNuMmtoSHozUUxmVk9iQXF1UkMrREkzekg2SlNZK2Y4Y3lCbk93ZnZOd2FDTVBaaUhGUTVWR1VvS01hRHk0MU16TWpZdzk1aG1NOEd1M1VVVEFFTXZZNUxxQmtNTkdUa0xHZWhQYTdKcExGMVJMaWd6ZzkwQ0NybGNDMGwwZ0NWd3dSaWU3ZEpaeUhVUXdGak1zUk9aR0xMUVo3eDU1OEJYeFJaUlVyUGNnbUgvcThwVHNWU2dDWU50TUxrMmpWV0p4RVZCNDRMUG41dVZkQ0ExQTlYaWdCSlZrR3BBQk9sd0swbkZGNWZxbUltN1NsSmpFejIrbktEa3pmMlhjVlUvTGlQVEJvZXZ2Q0EzcXV2ZVVDV0NBd1UwQTNYZHY0YVVRQ2oxVVJUaEc0TnNSWGVvNHZYL0sreTZ4RzIwMFJNeUk4VW5GZCt5bEwrY0RtU0xyTHRyL1BKaXN4ZEs2RDFQYXB1d1R0TEJScmdiMkEwZDdHTmhKYkZ5K28xTjcxNVN2Z0hGV0ZNa3U2ZC9oWG41V0RMRzBRZW0zMGVncnhjUGQ0aEJDRXlNYjZaSzh6dDBXRlVZaDNVSnpyaklXWEtoTlJCRTBpZk1MQXhjZE1QQUlIUmlrYlkyeFZ5YnFuNVh2TEp6V1k1N3N0UVA4TzVGOGNET2Z6cjd4NFBoaThjVnp5c1V1b0RmbUs5YWxqYUFUaTg2R0tIb08wZXpFSWt0MWR1V2c4M1p2dzVvV0xmWXIzanFNZms5U2F0bFl6MTIrTnE4WGdYWTRMelVBWWJPNWdkdHdraHdmWnQ2WDU5dTVhSzFZRWVRM1Z4K1ArQU1aNUJtTHFNc2pqQnZZTHVnQVJpTUhCdnI2Y3hnYkdQa3B2OExBVkhDZDVVY0sySE5jSTYvaXprTXVoY2dmR3pDeFNIKzNpZ3dpOHlGMnBoOTJzN2pWYi8ycFc3bFVjTVZyeXEvRkU4bHlUYWxCV0xIWmYrOERNc1hpdVc1cGtYSXRWTzBDTVZnT3g5NldraTBGK0k4M2JXMGJnRDhoR0dBMXRyYVRPcEJnY1g4eGxCVG91QWUzNzVPMStiVDlvTWFURTFZQnB4dHgvQm5EZEk3bTJ4ekI0V1B6Nm54VFZZRmZ0YWM2WE94QllyTFFNNTRNMXVEMU9QRzBpK3lpU0tENkE1cldMcjYwTWtYSGdBQ1Y2WlduMU9FQVF2N1dxRzB3WGl2NzBEMUQrMTk3c01MUS9MNGxUY3dGaTBBRG45NlVnY2ZVR0xGQjVKemlBblZjeEJ2am52OUpGT2pIQVMrbVBxQXBIdGFvblZjcjlqZktGaHlGNkVlYWFIbFVGWU9IVGIyRnpVZjhtN0dwYm1admN0SWRCazQreG9KaUY2NmNhTDdhb2kxNWc4RWlaUXNReG12T3k0V1JXU1NoK3c0djVtS2w1T3BkaXhKNUU3QjJsMnZ1UlY1bHYwVWJ2U0Zkdk12c20xUUJ5WS9pZEI0R29tS3VDVnBFM2VWZXFUT3Z2UE4wWWVPcjhzT0RNQVJvdmhvYng5a2tpdElLdVhWZmpWQXkrdkI4c2xvcWFCanJSMWhnUzdXU1dFZDU3N0lpTThlM2J6bDNmL3hNYnBjZkx3cEpBZ1VQRlZZMTBKMWRSMjZkeHFXRS8yMDNpQm1KSHFtS29tcmhNYzh4Y2kvSFY2NjI3bzlmcG1XcTJTc2F4YmZiTy9MZUs4bWF2enpYaHN3TEh3TnlXMDhhVCsrc3VIcWhRbTI2VVA5WGE3YkVaVktvb0NJS3BsWDY4RUdLOHFhUUZYSFhuMDhzQ3VSMyt4OHE0bjc3RS9yL1FTZ2I0dGJXKy85c2lGWitIQmtQZ29MMkVwaVdpV1Z1UmsxbTUyelQ4R00wS1JHU2JQOXJqODhnd2xlQmRHTG4vV2JOSDVBTUxma2lIczlmYmY1RTZQVDJJcTZXY1hEem1oV2VRNkpNdTlNMG94OHVxMWZtaDVvSTVnSlhuQUtjaFIxclY5dDUxUVNHQjJFcHlJemkydFFwTGhpclRqSVFCSG9ycGExMlBRZHBZdDhGVDM5QTF2eWFOSjN4a2VrM3BEV3g5ZWF0QnFWRDZBZzVscWhXdERBS2N1L09JbU9CRVZHb0laZVlEQmQxSGtsSGFDOG05VWpqbFdDZlFMbXlnTVhkbUVJRjhCZ3ZRbXBkTGd3NlRmelBGOVpWc3ZSaVpzUWhqZG8rRzhqeERnTzF4Ymk5SUg0ZEVWTVhWVG50dzhZQ1J0ZDk1cEduL2RrS0h6NnowZG1PTmJnQzhXdW4yVzlMN3BSeVJMTWc1M2RwU1NNTC9aR0tXMVgwNmJPUFR4SHBOYVVIQWNmK0hSUW1KTHJocUI3QTZ4U25ucHBLNlowQnlEM2QyVzMxWUVPbWtQN3lKVVUrRmczTGpkMlNFbjZKQ3Nmbk1qZzV4Vk0yL0NkcC9Wamc4RWJTa1orNGhqT0Z3dkR0U3pRNzMrU2oyZDR1VDk0cWQ0ME1uRzVDNTI1RnBnd2dlNDBiTGtlY3RmU0t6ZVk1Z1JESEFFWkVzRkVkWkpDYTM3WWJqZnJxSW5wWXNJYzVRNXRvK2NRL2Q0a040OGNrVTExQzBUYjN4MzhtNk5sbE1pUHJjWnhnTE1acmZJMCsyQ0ZiYXMyajUrY0NQS1BEMHZabDVld2RTMnVIUFkyM24xRFg2QzltZDlsaWFmVkh0eWp0Z3JsQVpYcTNnZ3BIY1AxZCs2NDZZSFpJQWJSSGdqNzVwYXNUYzVaY1pPWEliQkdiWit0T1VlL3EyU0svYmx2aVdjaEVjbG9kU2RYZUVsQmt3a1B2MFdTbHVMM3hwTGhXVFFuZ1VyVGVMUTRqNTRDMm41cytPQ05MN2JTNVNKbVNoZzFIUzFqenZXSEtRaTVqMnlndVI5QlE2RTRMSzd1eGNyZnF2RSthT3J3S0gyMWhNTkJCWFlXdXhMbElsSDhLU3QwbEd0akowQ0IrUForcko2UklDa3RDeU5YcVREME82UkhyOWFiclBwS285K0Qzbk1tTk03aXYvQmoySkdsbGNtcVZGQmZraDFudzlNUTZRS2l3dkdYWnl5YTZ6WVNMczZxelc4VGVnc0lMcTNTYUUzNmxBdXdzR29CamFmdFg1Q1Y0QTNJVVdGdGwvTTE1STVLK3lpMVJUYS9jaHBMVUdDMExtSk1sZ2pCK3BQaGhLbS9GblRtaTRMOS84NERnL1RsRGFvMitIeE1SSzF2K3pCaDdhdnk4STFXN1ZmdmczM01FNThwOHZTeE9nRER2RmY5cHl6NFRueUUyNkcvdEU2RDlDTWZKSmRKMDhleDQyajBTbHlNMXdQbWRxWG4wOUZvVmxSdmpOZFRIMUFDSjg5ZEw5NFhxRXN3d1lZZE54Z0pKREEwV3BjblNkNTFpSWY3SlA0bFNOeU1PVEx6dlYwZWtyek5XdE1WbWVJS3JTZlBSMVUwVnBzSVdMV3RPK0NhM2hmaXBmUGxJcTRka0tTcll2clFmV3VJTzFUdVdCNWRRRDRTeFhHam91SDFNRVA2dGwxNEpMWDloUFpYOTROWXp3OEE1TzZrTkpiUEZCOGVQbkpSbW1tSXYyeUhkc2x1MFdTOFh4emVqZlVQbEVjVkFTNFRSSys5QWlRTUkrVHFSYmhsNno5MHZtK2FmVzNPbWhjdFlVQldCQW95SzB3eVF4THVNdjZZRnJIRW5ZeWZLZk9UVVowZnFEOTQxcHphMGxoc1kvVE11RndoRWtzU095SitYK0J6VWpLZDFNRWExSVA5RnRYaGtEckJmRHlGMDhvaFR3VjBUQmYzR2RrUWQ0Um10OWwxY3NMU2hpOWdwQ29BRTZDcGVPbUtIV0loNlllNm5qYlBUaC9STGFEYituL2RmQllkUDJsRzlaVVhQeUpQK1dUMCthVzFQYVJ6MXpZQWNWUExtaitnU0VZaFNvQldhNy9heE41RDg5bldRWXN6d1VXenljSzdld1FEK0FoSEJQZEtOeVExRFFZdlVNaWVwRDcwcFBMY1R5NlYrSnBLai9xcWxSenVlRS84b09EMjhQNmRZR3pkTkthYXBweWRNTzBSNURyY1RFVFBHQ0M2aERCTk1kZ3FzeDd0Y0hzRUhlc0QwblA0WDFIajJhaWkzb0l1R01oemxNVWNQQ1Z3RVB2ZDNWL3hjalYxRnM0aW13Z3l5RVUwcE94SWthSDd0UmFnQWJNSjZyNkxRWUYxcS9tQnZyWFhoVEczUytYdk1PVnl2elhXWittRXdNZ1RZRDJRbWhpYjF3MktmNnpuVEV5UFg5dTF6dHFsMDBWNGp3ZjhNaEIwdHc3b3BoQldWWTJBcTlnNGFyYXlFNXJLQWY3cE1QMFdkYkZSWDA1UXorNjN6SUIzMldQRDVXRVBCR2k1TVNjbWZIUjZlTFd1RTFMQ2ZnR1I0Zi9YZGFBcmZ0cXcxSWFGWkFEdy9tWkwxU29zbWFZNFYxZDdtdmhCdE1RZCtuMVducnJRQzZxdW81SXhuY3pGRVZlbTJCckdTemlGV3ZhNmhtOEg1QjUwaWpraEdBUVNBTmN3cms4VHZWWWhJZmhueExyenIzNGlMVmxodFFnVENyekZzeFhUUzBrY2JseWNqM1Znd0djVHpwYUZUOTNGY3ljelI4MmZiZi9pRERSQzZxL3JqZDNDbmkxemRmbE8ya29OelNlQXA3aHlZczR3R1pkc0d4cUhmdEtPSkQ5SHRJQlphS2ZnMkp2TmxOcjNZTE5Kalh2WHMwMG12ejVzRkF2OUZjT2xlcGdEa0xSdlZCKy96cnp0WGJybFJuV1oxcUF2YUY1QmVPUUJBeEk5Z3RzWmVhUDFSc0doQVJXMkNGWnpzeG4yLy9rTGdvVG91cEFRRUFWZFpBUjdRTVpKUGVEcGVLazNFOW5TOFVORHZlc3N6S3BoNVhlUHFHK3UxQUZwS2FVMEo3RWZPR1I4TWNGYmQ3aHdZaVlJZnViS0JDaGx4QmhiUUlHenhvdDNWUDV4a3ZHMm9nVDB3amlRWUpmNVYxZDJWa2JGQzJhVlZQUmM0WGt0bG9xVG8yeG5leGlwQmZCK2FhZkFaZjZxNUErZ3U1MGZ6Ti8wdmZrckpGZUp0T1NEeG9wUDRpK29XUGY4ODI0TEo4ZHZNZitBTytxMmVxMjhGS3V5YWFobjBoRHRXUTJ2eXdyUWh6SStiSnZHR1RyRFZWbXMvTmw5akc5ci9KL2tBS3BYbnBkSTBxMEUwVk02RDYreHB3VFUyakVQaUx6OTNUNW1RQ1AyWnhtc0FnY0pFb1Jzd01YVkV5SGJxaFlPUTErRUc2OW5KRzJZOVhQVFJQL1YzYjZTV0o0dTg4cTJIUm5PZUw3QnE1Z0hwQ1NZOXZleHhXckl3YkNEWXpMT3J2Y3M5b1pMQnZZamtYMCtTY3kyT043aGVXUFR4dVVYS0lZdVhkRDE4MlFXSEM1Y1g5SjRsL1h0RTZ2YUNmU0ZEWW5hTUlrZGhoUGpic3E5dVFYWjZQYm5RYzJkdWlwbWlBQytzcWJnU3JNdEhUd05JVmx4T2FvYXdaenk5aURCVHNFTy9PWjcraWEvSkFtSGpXL1hjREJGTUhmZFJvakxXTi9CTU1yc3ljRXZOdWNCRGo4QWlVbWIxZjhobHJSVjczeEt0OW5ESkNwbXNGalpibDk5ZTZYd2RNejhPMEFiU2xseTNKL2h2alk2Sk1ORGk3SC9YaTZjUTg1TzlnTWNCTDlsRkNmcStNZUZUeEl5a3plTnhGcktjeUQ2MUs4V0Z5M0tONDB1K3VsTnNzTTZEWmRRWW1Ba09LeVh3Ym1sYzBHbXpCSVFqNnhtRVcxOXhuTnJXN2dGU05LZWowSmtxZWFXcW5hZ0E5T2s4QUd3SGR6emNZanBFQ1M3aWtwVnRteXN4VzNpVURVNXFzUEFsMWxaVld6U2ZaWVpMUEcwSFJKemoyYkRrQjh1YVIycFF4VXIrUFpRcHZYaHBzREFQT0xWT0dKYk9HbTlHWU9VYjJKNkNOSi8vTnlKM0ZQZ0xGa0ZWeEVWZGFqWE42eTNpc3JkbXhKWjRxNlNNY1BFdW5HNUkwM3RMRktpZFF2Ymt4NVBEYmNMeERBQTZ5M0JUMFpWL0lVdkorUy9sUXc5bDQ3djhzeFNSSG0yQnJxNURQa1B5L1hmYWRheis1V0pwalFVbXhIeXljUEpjUHBUdkVFY3ZrNXFIMjJSdHQ2aEdVSE9XcVlLY3B3OTFINDZsWFJIUkI2WUlxQjhhM3R2ZzhsUHdzaHY1S1hYZ1kzQ2poVjNvNjduL0dOSVAvMFZScHVYMytGTzBVNU9ZcjRXd1BQYStTZHhjdFlIN05RQjR0SjJDU2Zuck9ZM2piSHU1NlYwZDBKcVcvc0YwMlh3S3dXRlZudmxmbmNKVnJxSThzVUVyenhWcC9pMjVGRE5GSlYyOWtHMCtkcEFEQnpCdENKcGtsVDFLaExIZ0F3dXdMRXowRlRTaXc0M0RZSGpWMllQN3hzOWQxR0RTU0JLK0VDaTZtU2FPWnZiUDlVenhQN1hKY1F6WXFzei9nNm9nK0RDVDlybUJmbW5MUmJNUWFxdTRsY0lQZ0hPZTNUMVYwcmJZUG5zd2xvOTNsa2tlZSsybkswdEJ4c3NYTk1sbzRQVE0wbnJVRlo4eXowZ3hyT2hqVWgrc0hMVFdXT1pvRlVTVWdCYVJqMWJFRnJEbDVROEYwRGQyWDlDZnpVVFl3YUc4WWFPVU1OSWlBVXVyeFFKMGRGbit2ejhPTzdEYzRHT0VtcVo4cHFiT0dLT0RiSURJR2Z6MEIxdExKemFLNEY4eVEyRmFnUmF6a2ZrVmtkZXI2N2QycHladnhJekE0TjdFMVRyQUh6RmdUQndqdUY1SGVCbnBrTEhtbkczVEhsS1B5K1V2eVpZRVA4U3NLZy9pTS96cjB6UnFaT29WWWFIb2lZalAxbEZ5VTB3K3dpRk1UeXFKNmtvQWMwY0lVbnhpL1lkRW5icGwvNE1qQ3BGTENXRXJRdTlCODhlZktQSkhhZHo2OWlrODZQbDFzL0NqTDQ2TVYyL3orb1psMGlIZC9OVXpLRW85MklKbUZvQkpxWnA4aTJoanVVYmZIM204Qi9TWnRvOUY4QkNwb1Z5WDNtZ0MrdGlDRGRUTFN6TEJXUE5BUEU1TjRkYlBlKy95LzBOaDN2ZGRXVjd6U2lzTlBiSHE4dVoxR3hicXAveldMNGsxTDdsTU5pUFJuODdrbUJhOHV3cU90bFp5dVYxTldSdTVIa2RpWHRIanUyajR5SzJ1MkZINnJRT3EzaG5tZ0dFNkQzTzluK0xhNVVTNTRDZklUZDdnSDFVZlBtU3c3T3l6V0NzTlpqYlo1Z05yTVludE5BYVpHZWdBNVFxY3A4M1F1ZE9oT1hqdHFiUUFKclRUMFUrN2FRNk1WY08vZE03T3pUSTJzN1ErWHpnZnVHdUhwd3ZVWEhXT1kwYVNSclB4NVdMaHVSV05tenVmUHJuekU5SlIxMXFtOGMwWUhuRkRReThJZ3Y5MHN4U2czOHFJWnB6aE41VHhuQ0c4S2JZRUxENEMvTU1Va292TGc4b1ZqZnhZUURFVm9YcER6clhUNkdNczJrUnBnWVh1a1pBeStzNlN5TmZwQm5jQ3JCVW5BU2lRR2t4NmlVcWQzd2FPNmNXNGFNUjc0L3grSnROcjNaQmJXL3k3cUQxME01dXQ3YmYrcThyZW95blZ0UDhFdDN6Smp1em5hMW9lZWMzTnRsWWk4MlN6TnppdmxQWGR2YnlrcFZDMFJDS2VmSkVzTHlKTDZmOG5Ja1pqb3ErSUJFTHlQazdEK2NmZnFmbG1STS9aRDhEdmsraXpMWkFkVFZGbDljSzJQNE1PVXhKNkF2VHRkZHhHNmNhVlpSWE5SWkRiNUZPOWlNZXhTTmRKeiswMVN4eXF4WUh4bzNLc0Z4WHVwYUdLaWdZQ0M0MHowam50WGUrVVhRNUZtSlluZHE1ZHhTUTZueXRYQjhPU2Q4VjVCOGNPSFh6bFZDanozQ2ZnSEpJdUJ6cmlPRFhqMURhRnM1TGNSSkhFenBVRmpKR1BwOUFLVkhVcGJPRDV3dkFRbmNUdE1mdzlXTDk0azh6T0RTNDFqK3lSRlhpZlVWY0hzY1NwdmhJNzVKSGE3bUg2Y2tRZTJ6bEN3UUJtZDBjMnJLQkN2ZUcrWDJqUXN3WWtSUmFVREZjL25KYU8zZlYrWlYrRFBxYnh1bDA3OE1JRFdvVk5HUXh1R1I1VnhVOERwd1pnUTVaV1lHSUd5ZEpZOHJKTHRZdlBmTDJSQXB3cGUzNC9KbUJKZlN2RlBjUUYwaXVrYnl6eklud2Jwb3FSUDN6RDlvU2lvWWRPVGdsVmppczJtQmt6YUxmWDFtSmRlbzVFd0hYMmR6dEtoRzZTOC9vYkdUVzhlN2tETm9Hd0Z5UWVKNnpaNzQrcHNadG5nZHhxRE9ITm5acDd1UDVvZ05BajBheGc5NkN1MEhYallCNHBRTzB4MHNqaE50c0NLMUdOUU41ZTJCN2F2dlhqOUNBZ3NaOG9HZ0UrWFFwa0RZK2J0QzhzR08xeUFuazRNWmVSTHNOblV2NmlrMEszTnR4TVJ1UlpnYSs2YTdINExoaStwdUh4bUYxd0w0UVJ4UE12UnZCbEwxNlFEU3BHVzRuSWJyeW5acmkyZjAxTDRwV0NlNkpHRjc2SnQ1aFBBcnlvSVNzQjczTkkxT1huSXdaL1Q1VG16MEF6T1d2ZHNzZzlVUFNQUWR2aGUvOHBGYmVyb3RURnV2enRuM2ZYaVM5ZWpKNVRqWmFiVHdQRUVBeWNiU0xYdWRNUXRtcTYwV0Y1blI1YjR5bVRSRjQ1NlplM0RVRlBoRzRuN1NqbWFrVk9VczRLSjg0YzkxSTd2Y0NYT3ZVZ2NVMDJIaG9NOFpRd2ROQzIrYThnUEV3dm5XZ1ptcWsyMXhzalRoMDdlNmhPZloyck5iZHM1VHIxdWZmN0cwTVdaRlFic2M3VktKUmk1NTlzZFI3R2ZTVDRuWWZaWExmaDE1UnVyRGRlZUVNWURmUVg5OS9oUWh5Z2JrU0lFampoNW1jc2dzbW41eTJnNXkwU25md0ZrM0Y1eE5PQ1BzWk9sM0NVbTcwRGROKzdER1VGbFpVMEgyYTJWMm0rbG16YysyOEJkcFNZcGxGeDdzR3BXNllOYkFZMFBvVTlFMnFhS0hrdVZjM0NUTndxSUlRNnJWengxdFU5UFdUVnRMVGZWZG5kN0pwa0xONkppMHhIU1FkM1NrbjZFYlh0T3JQT3pjWHdoSnNnOE5qQkl4MTVqVjVZMCs1MEdDU1JoZUpZbnpWdXhReUJQcVJtb1RSekN2S0V4aW5ybDVaeWF0VjlpTHpySXE1NXplN1FJOUdTVktmZVJoV1RiRk03dk5MOGJYRGdSQWVSNm5sRW9KUkd0Z1NzK0Z0Z3VHRUpIS0lzdGIySllHN0RQei8renFCT0hJZ05Ubm12MkZra1o5b3VxSlNhUG5ZSnNWVkZVdjJmS2pJcmRITS9oQ0dsQ1R2U3BoSkI4d0RncjdzRVJ2VkFTZFM4SVoxZzhDYm45V00xdHdnOE9DR0ZUUHkyaS9kNWVYYzhIOFVOQndheHg0MmlUdzhORGg2Q2VpNkZSNCtjSHRXVS9zS2d0TzJJTmdWU1RrQjJscHFsak12OFBXUzEyTE9ZcE85QnRiaVRwRFBLckhmRFFtYWkrREZLREgvSlJNU2xJdktuSmJXOGU0TCtlQTB4SVFmVDREMzJERER6aUZ5M0FDT0ptTGtEbGF3dUxZanQrdmJPaDl4UXhxMWJ2TXdmQ0xHREhwaVVJT1Z3VHJIUk5nZE1nazZKN2JHM3FlamlSVGlEa3dTeEx3Tnp6ZTNJZFlhQXlSWE1OL3hZeHc5YlNDSTRpOVc3b1oxcHJGOHQwN3FtSDhTZGpMVm84OXBlTWFIZnZlTEUzcitLdDVTeDlYTnBXeFhPeHJleTI2eDRWZmhMcys4WnJvQ2VTMHZwR24vaXM0ZEZsbVhzS3VJWm9qcmI3enJpQVZDMnd2QUJYbDJmK050NHl5RkVzSnNCNjQ5MU11NERyakJtWTRUSlYyN0VVMWFMYUF5Y3VYZCt6dmZDQnEvNGs1bnNLZXlRNCtFLzh4bmJ0MlZFcDJScmNHVi8rMmU4QTVjOUlGblY3bHltelYrejU2TThnNE1NOFpCVVoxY2EvRkM1S2d5djVic3hwWk1XRlNLTDNhYnNxaUZ0YVVCckVLRCtNcGUwWnc0LytscDNnYjN4MVlYaGt5bHhYTTl0b2dtdGFQUUlQeEt5RDFGTHBiL3FzSVFHclRpTDdyNkZsWk9xdGRES1NKM1V6TVRZK2Y4cmJEMDV4VHkvaURyeW1aV1NlWnpFVmMzOGJ0cHQ5K3Q1NVVOWFZuOHNpSEVxV0dndS9nL21QcHJJcWc3NGtlZ2JwVklGTDdDdnBvMitVRExqTlFMVlJQT3dvNDRvNjRWeU8zaGRqOGFBNEQvMnRiSWswMHJBOGpsQW5BdzRoYnlwWWdveElhVUQ0RU1GNnJTZit5dVBpRExJVEtyS281VVg4OWpJUys0bFBTVUJJK0lxdEk4MWlxL1RSc0FpMWNXWndqQlBIWFRqZG1YUFVESDZ5djlyY0RaM0pBR202aGlYUmZQMXBRMDg5R01qVzQ1ZTFaL2VmeW1WbGhIVm9ZY0hRamxLUWtwM1kyNU92d1pVMGVKM2VybFdMQXQ1WmFlcEZCMmZKOFlaMzZFL2NDaFh5N0IrTTBzYzV1V2R3U1kzZHdad01qWmgvMS9iaDdydGNvbFIvRmNpTCtXOEtiLzhFRTVHR3grOTJvdVkxeU03eHo0bzhrOHNlTzhUNGVGQk5KNDh6SVRHb3M4OFVpalFYL0NyQnk4T3JKbVR6Ykx0QmNBUDZqY1R0UVBkcURLYWcvaHppbFY2Ykl6cThvOGErN3dLMjFlMU16ckhsVk5RNlYxVVJkZGZDUWx1clV5MVlkeVlRUmcwVTZ4b2k1TU10SVc1cHQ2bnpjMTdKdTBrNEJkblNVNVdwc0MrK2oyQjBIUUFFZ1F0OGRtaTdpaW82TzY3NGtza29wdTVCSGNqU3dOcUY5NTU0aTBhVGZ5MnVkOHozZU9TaGlZdmdGNTN2ZGwweHB5cUNBcU9tN3FZN1JHZVF4YUdSaW4vVjVtUnJJNXZmbC9ZWHN0T2lmWi9PZWQ5anY4bnhuRXhOWnNxTUVzUStnamdxdWhhZGR5ZUdlNGhzcTJGSmtUdy9pT2w1elU1NnRMWDlZMmRkQWJwd1FBL0xESzNaTVJrZC83WUQvOVd3ajJqTUMxWEhNczV6RTN0a3l5OFdqK0hHQ1JXTURXdjdvaXpad1BHSDRSSDFBNFdqVXQ4ZCtMK2hWT1p4NFN0NENMeEZ1ajZmWVBpeUxLVGMyelljSW1GeDdwWExBekxCSndiOGoxUVp4NkZZSGpJUWFtVDFEVlN0OWNyUlU2T2wybm8reExUNndwdGhxQ3o5cVNUWTlBNWRocFRqL3c3aW1BNDEyWmRzbStLcXlNTXNmZ0w4eFFJcDZ5SVdNQkNTMFN2T2l4RTIrZUpwalBnNm9wNTV2UzZKeGd0SmpPKzhJb1EzaE9pVmtlV2h2SUI4c1djTU5zNmpjSmJuQ2tOVE85V3BIdzZpWEhDdTBwTGhRQ0NQY1JwZTZzM1gzd3FTL3I3cUhLWW12OGFwQ1VRTDI3Skd6VEhoYXJnallBSDRDM1luZnlLTkZzc3dtVmxxZzE3VUR6TGJrRlFsRGJVNmdaRFcxTXdNeDRwQ29wcGswbUIyMTgveW44RkN6TTJ5VjlXenByTS9DdmpCRXBUdTBwd25VaDJ4b1kzZnJjcGtyUDl0VFVUdjdzM1JSU01Jdk0zaGI2c05EUzZHcjVFSDhmK3VmUjB5dkFUMVA4blczVER5Y2xlby9OSXFuU280TkN3Nnh3ZFFXK0NHemRuYzZSeENpcVJrTjEvUXl2aER4d1NhV1gwQm54M1pmZlNBdGNpaThhRlNoSThsU3ZuU0tOcHlHK0EySTJXbzNJVVJwdFlKUnQ3ZmhFdmI5cGdCQ21ob3JsWUlWcmNOVVJZTHg3RFAxRVM0cTdKRE1JQmQ1cjNGWEJ2cXNIWXJJWHhaa0JsWkxEV0xKRUlITWFuaFF3N0ZEUThIZHNrdkFOQXNwM29OamFYdVB3NWcyY1djNFF1M3c2WWhuTEhyeUJ1SmRvc29XVjMzNGVqckRMV3NSLzFrMmRqMnJ3aDIwYWc2N0xvNkcxSkRsYythS25FUmlVaHRLWG93TVFNWkJZOTF2ckZ4c2xGWjVOaWhrV0dnKzN0dzYyd1pYUE9FaFlxNVpEdmZZRHhOeFBIb0ZOc2E1U2UvME42SUFJR0gyN0IzTktGWFV4d2xsdEtwK1FUMUlUSEFYdnpQbVFnY0FNWWw4bkpENlh4SWlFbVpNejhEYVlISG5ZVXNJTzZ0eHcyWUxzWGVJM3NqWUgyR0FxSGVRUHNzNG1OUlZlckxEQTdZRytDYzU3MmtHdEJCdWtxek5EMVRxa29IcHRsVGozdjZ6Q2dQZ0V2MjNWQVZmSVVVOWViTGpIMVlsSkFkVnRGellEVkpETTdPT2NiOEdNU2pycDNTSkVsaDFHeHY2bU1iM0VKT0VYUlZmckphaE1CS1QyMkhWdTV0NFZsL2JEN1N0NDNkK3NnNXo2dUNyb2RxVTVnV2txWmxVQXRTdXptbzN5MFp1QXVlQjdubXVZb3Z5bllpQ2xiWmQ3L1NUVE5neks2U1BXZ1pRWGdYK21jMktiY3Q2QUZZdTE5bWxUdGUza0Q2T1JUZ1JtYUVVZUxPanFlWHdRa0U3aFNneFRIdFgrejUrODJRQWZKSEVwOFY3bFkzbnUwMjFURHlBMllmc21NaFM3ckdHRTl2b05ERi9GbldTSWZFQXloVVF5RUlORDR4K3AzWTFhMCsyN29sZHgvUXZBUmZhSUh6UHQyRXRvdGZITWJ2b29jWE83SDRRMHhPZ3VJTVJJbGVFRU93MFVJQ0pSVUllakJmR2tYaE80MllscVNKRUxVOVEvUDFBblY2YS9nUnRLRUxmN2g3VVNqK3VvNENIVGtOSHZWR1U3dUtYT2FEQXZ1TjQ3OFFDaVFnaVQrU2NlVzFEZ2w4d0w5cTNOUFg2TjgxdDNHaGVTSWh0QjlVSjIwclNtTWtqUFlNTG4xem5PcTRkbFd3bUFFNG13NGs4QlZzVmxJNXNrbTczNlhKZlhyUE9aS3lRcjFGMjRhV1ZXOGhuclpveHlpd1JYNmZGU1RDalhuYmU4MkY3cEZzaW9HNXE5Z1pSNmt6ZzROSDNsMlFlZXBXS1dsb1ZPM3BpdUdVa1dqaUZsVzRUcUVDMytseTV5NEtTcitQcStrUmQrd0VncHkwMkdLL001ZlJ3eHU2TjdPbmV0NUQ4UzNMbTlrc1VUNm5TZ1duWTBEcFZpRjF3Q3lpTC93cDExOEJTcHArdHNpRFoyWDVwbU93aTBJckMrZzYvSHdrTCs1OXdJZjJLTmlsTk5rSHRpd1hCcm51cXhVZmlHdGVFZWVkZExBbTJvdkxaVDZTZEY0SFVKYTZId2s3M1hJcFBVR3I0alliaWwwNmZhTFRHK3dERXQrUGdzTnhrZGU5WWFSRWZRT2ErdjluWUNaQTh0NFF0WU4xaDNWMXEwbENZSFBraHY1Q2hUUG43d0EvQ0lNc3dlQ3VXYmZjejNpK3JFSzVOZlJrTWs0aEVCbE9LcEZkZys2VTRadkFzMGIySTNGakIwSittZFNWOWxIVzZ6dEgwZ1I2eGZoMEFkSDBnZi9WOVlXRTNkSGlaaGk0SzNaMkdoTU5WVFQvVGFmQTl4cEhHSEN3M2laUG9XNzhqT3F1WWVjU0R6Z0NXeXppdjVNNThEdEQ1eXVCYWIzWkdIcWU1MkpIYUlDS2pIejg5TmxCcDBjVUVMN3YwMUNIMENsYUkra1R5dWZmcWtQWmNTYjJRTlRTamVqWUYvOUJFZi9jUkY4ajNlTHBTV2RVRW1hZTZ1d3hWVGU1clExbDBCRDZlWjgrOERqdGVYVVRDSW9BdjBUdVYvUEs2NTJoUG9SL2pjOHV2dFdVUnVFK2FsaGdMbnR4T3V3V3pPSVhWV2Z4N2hDQ3BZUHR3TVpMZjBaQmRQVE9FZjd4QzFBbnVxejJtWUkxTEt2b2V4dG9kWHhkaThWM3BCVjJoN2JnTEFhYlRiY3hpZ3ltVVk0Y3M4NmJYTXE0ZW9RWG1rMTlOVllOUFpBTjBXbG02bXp4SGQ2UHhPNS9GcEl6NFpjL0s5eWFreTcrQkh6T0FVeHlJL2ptYjJGUXRGN3VqK2F3d3A2ME9MaUJ2ZTBhaFlvRGJzdWVsNDN3SmZhWHN6cC9ubDJKQlNQbDlkSmFWckpTOEw2L1A4MWxlSGVqbjZpTU5vWDlhK2c5K0pSWGRpeTVNeCtZTzR6NkVzdy9lRkdkRzNLQTZUazBBdmRHSFNpdG9oSVZZSnRxNTZ3R014bnduNWRBWVBoT2xqL0xheFVwMGpqRkx2NERkVkhzSEZqc0VWcDNpVFY4RTdqUHAvQ3FlZFFuMENwOVQrUjhOdG83OEg2cmw2bDFJV0R0bktSUlpBeGdvQXYrZjRjQ0RneDdLNlE0ZkR4MHRyTEN1ZFVSaGVWZW5UT0pKbTJvcWRSK0RmSGhpeWphUm1udmZma1NXWncxQnhaUlhFaFI0NUF5QkpJSDhkaXpBUHpkRS9kdkUxSWc0SDN3NmFHdm03K1VOOFZ1dStUNDdwU0ZJUm51dFRHRnp1MllMd3h4VkhjQUV6b2d1OGxzVmpWcnU3VGE5OHdUdFpTWHR6RGVIZUNMMlp4WlgyM0Y2NW5CZzg3d0NSejNxdnYzMk1WajF3Zk80VytYRVlmZ1VKTGZvbGpuNzBZMWZINHpZTnBCLzBldHgwdXdVaEJBb3FJUm1DSDlCb015RDdDZVFBOEx5TzVpQlNmNW5hMkxBaTR6dlVwVzBxVUgxUWM5SE5XU1BVS1cwdGVLVXBINWV1Mk0xMlJSM0hhYlBKZnBUV1l6WnJHNEFneVQ4OC9mNVE2R1NSSFQ2U3lSUUg4OStxaGl1OGhYNGh2bXhacTNaRWIwRVY4NkwwRUxYV1Y1VUU1NE1wdXJhY3R4TStEbEVmV3NjTUZoaHN4ZnMwZzdmcWtDbko2UVdrRHhqa3hBa3h5RERhL0xUVUQwcDB1eFFWSXkwRzBRdG1VbUpIbklXRVFjSkZoM1hXcmMxaXgyclphY2lxbXhXOHRLTEUvRXBmY29wdzViTE52am5rd1lETVJ4Nk8xcnVIZFdSd0l3TVE4Vmk2SGkrajJaa3lCUjBIWWpTR0pRdktKb2JNTU90c2hRSElvc1pQcWgyV01oaGpUVUZjYitzejVwK09FWGhFZGVHdXB1eVRmRGdieE9JZWVNUWZKRVE1S2dLdzdHZUU5SmMzdVJ1a0d3MEZwRk1qNmFnaExBKy9hMStFU1pEZWlYdGQxVGlVaGNvU2dTR0I2SlZPUjd6QUpMczUrT0JWdVZvcWVQSEoyQ1lKUmpKeGN4V0EvYUdJak8zMGNEekQ5WHJubmlqQjF0TjN5UEgwWGtjNCtSS1ptQlBTWTE1dVMvVjdVVVd1N2dsSjI4NEFIbVJxTTVTSFJ3VkdCaHJUTjIvVGlnM0tVTVNqRE5JVkY1SXVhUHFaRVFpNTlEY0dlenlEd3pBenM5QjFFQi9pRG43R2d0cVZscmxZbU90Q2xheG1DSStwazJQaXh6WU1yWkhleEVxUndZMVNYb3FBTFhOemthVFRac2JXb1gxV1JjVHN1bFhpaC9JWEZwUFl2eEVhNkFGWmZ4NHhsTk16Zk9JdVVSY2J1KzZxdmhhU2hmaCtYdTZTa3ErVmFER05hb3VLcHhZT2I2QitBKzFUZUlJRzdMM01SKzVIdFVURFIwZ2JjTTB1S1o1NFBia3hBRzViaHNINm5IbVErMUc3RWZwZG8xbDVjSjdJSWNIaDNuR0pXc1lsM1F2dlhaYWhKdlB4NVU2Sm1MUXZvUURKY0ViclFaNTIrQzNSRnIxMXBaZC9NVVVSdjN0UWgxMi90UEIraHdyMXNtTm9CVWY5bE1TYjhBQmh1MDZ5dU5mdWIrUzdNN0RiSUhyQlJtL2ZFQmZNZWZtVllVbmdnSnAzeXVZYnFIZ2xRYjZDUVZtSHNlanFhWjlNVHowYXJDRXJBdXF5R2srVWYycmo4UUFSWmk1cUN3bnRDUDBmajBLM1FveEpsZ2ZwYnRrWkdIRlRTdENBR0JLS1kzOG5sK0pLOU9RRkZ6UUxnU0toUExORG1ySGkvWnNIR2JJZ2RTendDL1pXOXU2aW5vN3NuNElVUnUyQUNUOGlGVjhDanBHNnQ5dHlDdk5TNTFjdTlTY1FzaW45K1ZSa2pLZlcwQ09pblhOVWpuNXQ5eG8zOFhRZURjcnZqampMUEFrRUlhU1RRazkrSUVIN2NSRXdFNkhsYi9qdjlTT2ZkaWtmclFsSlpxQTkxeDJEWDNjWjU5cnhZbUJiUGVHS3NaTkZJT3ExU3psSnJCU1Jid3BHYm5UT0lxM2pZemhwNERjSklibDVremRqcFprQ0lIVDh2VnhYZ1lFYnBwYUVjSmJzY1BucVZGWUNNd20xUDRzbGI1MkxTN2JUN1I4REFDVUptYi81bG9xUVBUVVZwWkNrQ2lOalVCcEpNeE50NFpxZDQ0eWwvMWxibllDcnpZR1JPc0RmZS9OcnU5QTJ6TjN0eXhCZmhvZDNRNzlTcytMOG5MWnFaZ3MwSzBxNUh0dUZqQVUyWVArdkFMRmt3RytpYXV1bndBTjR6cjI3U1owakE3dm4xclIwM28vVHU2Y1FvTDFPWHFwVld5dHFtN08wMEZrNFhvYi9zdzZtQ0lYUzRNMHBTc2NaWWw1MDFOR0ZibDJtM1VGZlhzUHdncVRiWkhGNlhCMEdqdVJUMElmTDFWZ2I0ZWVLOENnM3JPVnNtd3JoUnYzVlp4c3lHaVp0eFlYRFZxYWY0VGZEb1JSR1RnZkk3eFIxUGQ3aG0wYmRUdXlVUWZ1Y2hlbHlLdlpIY1ZHS2NMVDUvNW56NVVIMlh4L0ppdU5KOE5SMUxUZ1FxWXlnaDFsMTVEUVE3eStDcG1BZ0EzWGVIS29Tc1Z0R1J3YWh4SEJ1VVAvd0FrNHVHYVhYRGI2SzMyUk50K3BJbVV1S0ZVWVlyQkMySXc0eXFHTm9JZDJxQmdTWGpXWko0TVhOVFI0dk85NUlWbkMvYWdLRkNVdjlvMGFmbno4WlFuQ2ZscUlRa1VBcFRNb0VBOElwVnBUNHlhbS9aRy9rWHJ2VGNxMWt4TTFGUHZ2VVEzaFdLYzQ1TzQwUVozRlpXZ2NzVzFUdi9BK0cvTDZqZ2FmWGVCcVIyaEFoZ1RpbE9kWUx0VFB3ZWtvaWNwTFo3aWZjZ1FpL2ZjZEFmN1kxQjEvaE1lSXM4UG9YTi9zNS9zVkJUc1U4QmNiVzgwemg1MkpTOVA5LzVCNnAyaCsybm5qWU9zNlZVeUpPSlFwRmN3Q2wwVFVsUEo1bzJmNEZjRHpQQXFqYkF3Y3AxakUxR21uZVkxSW5VbnFBWEJjOTZsQUZqSFB0a0hSeW1HeWdsakZoMjFZblMzY0V0MFlEOUtzdFhVYm1kTGZGSk5ZUHM0VS80cVlueHRIUzR3ajJRWSsvSzVXbzN6Uzh3bEU4Ky93bXduT3lMdk5ISS96aXJxK0l6RitSK1A5RmtPSmFEZk9qVDhzTlFBeGhVbVZsS0R2SU5KMTMvRk13OERzci9NOFB2cFFQemRRNldvWkxyVDJyRE9UcFY3b3dtYUladEg2UGtJTXZZa3lXV1hObzFMc0hCaEh0dzVjaUthSXFZYXlKcUY3ZTdPRDB2N2pvaW52bTYvcHoxdVI0ZFNKcCtXeDZzZk5sNk1TcTk4VmlBek9oTFpNY2RBOWNldmlRTWNkMDdnT1IrSDVYVmZaZjZyYWU1dGRBaVUvVkN3MXYvWUs1amF4VHdpa2o2OTlZa1BzZXpSMVdtNUM1c3NmNmhXSktUTDBiWW1yM3BHZ1Z4SnBLd0IycUIrcTVxd2VaRVB5K2J5YW9JWkVKNDBocXdlYkZObkRMS3M5bzk1dkpwL3F0TU5aSFdiaHVhWTVjdEREd3ZZZjVVNVptY3UvaFdmS1AvQ3UxbkIrelRLRHhWVUNRWGZ5b3g0R0YvQmVvVDlaWXNncU5tVzBkQmtyUTUrVXYyTEozc09Pd1pmV0xuclB5Q0l0OUszOGE3V05QclRpcnFwbkRIeUYxWmE4RmRUN1lJc0FQU3U4YVl1VU1vOWszY05xWWRPRVh0djlHc1pacVhKZTBJK2Z3UmpjL1FVTVp0N3lhOW9DTzdFcmVMUjdDWEhRemdqOUlGWEFJZDNNeTJjL3pLUWdDUDhkSTZubnNGN3NNYkI3Z09BT295bDFVSUR6VGFXZHp2aHIxU2Nma09JZEpSQTRzdU9Vc1k5N1B4NW1sdEdxcEsrSEN2UDQwVjJPRGxMUWFrU240MFByZVVmaUFDa1loQUlXaXBqZGZxUGJpOFRUL0VxNEtkRUo5RkNKMnRxRTR5dENWMXFmZVdUVzZEbERFbUNaY1FtUVJiclBGUlVaYzRTakhKYmw5N3hKait0dUI1Y1FhbEdNTWpBT3BQeFozdjMyK1pCZEN5UVQxMXpYWDg1aTZYQk9kY1d6UDZoWWVRazhTQWI3U1dqUVFMbVVXeG9nQytHOFNNTHZKTjNJUWdlUFkxY2R5dG03Q1Rib05hWGxZL1N3NTRKeE1rTDZhVzZIQkduYTd3UGJyN2xRVEl3cmNURDg0NzdsR0Uya2l6Z2hEOVo3bVlySk1DdDFWckRXK3JKdDlvMEJkd3EwNTJ2L3BqT3J0b3NwR3poVGl4aTY0RFRqd0FRdjZjYnROKzF6NENDekVBSjdJdHlMVWRtL2pPbi9BaWVtTTVqRWdHRCtzbjF6M0JEUTZnbmxsSldNYVhnT3oxSmFNTHIwUHk4a0E3T0FNK3k4L3ZOdWRFcm1xcStCenNqalRRNzlud0VXSGVtQVZsSmx2c1p3a09IZnlWZExDbU1MUFN4elBXZWs3amNvWWVINnhvY2N5Wm9yNThTUjRZVlo0ZG45ZEdqeWw0VkhPT0xHcFhjRFRxbGlWcnptQWY4RWJnUThNL0tZem16MFFhOU1uWjJ1TWtoNU1JQksrNWFqMmlPd090TjZvc3FiUGlTVkxudkNONG9wUjRWR3VTTjRPMEFxY1J6RCtqaWVveGlyOHE4YXhTbUhOU1JDVjJnZEoxRzJRU2ZkWDJ6dE9uQ0p3L3BXZkFLWGVzN2JSVk5ZNmt0MnpmUzA0cjFXU2FDSkhvRjd3YThwODd0YnJySjdGdGx6dFVodGlWYUNCTlc2SDl3Y2hCNnE5M1dHZlpqdU1zRWhlV09MMHdUM1pEOXpmM1YrWGVyYmJOdCtLVHdqRU5MUW1sUVlWNnpiK2dBM3NtczdxWEtidS9IWjZwVW5ManNHNmkyQy9LQklQNWsxblpoWCs3cXlra2tPTkRSKzFXRFZmcW52OWZLNjFaaGYxRElnQ2ZON0o1S2JLUGJkLytVK3kyQkpHQWZIZEZ3NEg3aXA1eUJncDVsU0xTMWlQU1RFamdMMURTNEE2eHliMU9jYXhCRWxJOHJBb1NvVlNEWW04QTUzQWE0K1JZK1lIU1NaaEtLdFJNOCtXTVNYa2RyZHVFbjhGT0pZVFQ0bXFpYlJWdjZnVVhXV3VleXdQWXdzbnEweWJUY1lwbmdxaGJ1RDFuVWNzSEUxT2s2alEzeWswSHdjbmJNMVFwT0lIbkkxQkxKc2ZpdERkNEdIcDZJdTMwZW8rbVM0MGZQc0wvZHo1SnliZ1dRaFoyT2pzUUdJRklFSVNXcCtXZXBuVEl2clBqdzYxeDdHcVp0V3hvYWI2MUw5OHVxUGFUalBzTGxmSFNXaFBUQ2dkUnFWVE1va2MxYVJCdXkvYml6L3kyVFRXUWlwOUZMd1NxOVRYcXBseDhPbFBPRkU0aDJSbDNYSjdRRVY5Q2dSWDAwSjlzcXVVNUJqckRSckQvVzV1eFNpanFTQ0tlVzlzdmxjbnM1VEdJLzJJVWhXU21oWkxGN3M1TmpxWTJHYlYrYzltSFZ2UXAxWWl4dENCLzl1R0x2cThFYW5xbnJQTlo0SmVJSmNTZC94eVlBSDl5VTU3VTlZdFNOeUF2RnU1ejhZckZiZVdJVE1LSi9kK3M2UkxrTXRkR0I3MHF1R0t6TkpGKzlCOXZMcmRHMHE0NGNnYlBsdmhQWXZTVHlMMEl5a1IyUloySEpyVXlybldic1F2VDdHLzBmM0xCUzgzcyt0R3ZPM2VJQlNRQ3crMTQ2YnF3eE5PT21OejY5bzFQTk55bThzRDZWaHl2RlJNcjBHQXJWUDJZZEo1eDlyWnhPOURJcnR3SlJ6RmNraFgxY3RiUno1MEh2UllPdkppQXpoUHRFaGhlTlJXOUREakRPTUVuaWJtVENtVmwwVUo5UUFxendpUTM1eWVUTk9VenpJakNsZ1NKUDBaTDFwODBJVFVkSUdXVDI0WkVrc2JqR2hiL1BPT3J6a1QvTHp1cG4rSE5ydnFSZXFaUUt1V0I1eXMzcTVieGFSMDIxODlTeEMveEpkR3U3djl5OXdpdzV3T3ZJVHpEbE9NQ1hxOGk5N3A4SktEQjVCejFYTTFZU3U2WWlxcEtqRURMZndCSHZUM3o3NjYwanJDazV1dnlJNW5GV05McjA4ZDhSYzIxOWdXMDdsZ254VlFHSVhHTXFjZGdmMEM4cHRZTXcxMEVBblJ6ME9IVzh2Z1lveHBBVFd3L29CT085Nm5yYUpNS040R01adStiNlM5c2QvZ0d5S0Y0aUtRS0oweGxRdy9idDVId296dW45V0FXeHZUNU0xS01GMXViY1R2N1JvelZHMWhabFNtblAvVzluRDFNRlpwSi9xdDFrMlNLT1ZWRFVLbi9UeWhCaFBseFJERmVDYWhJSjRXaEUwYmFFMzJxN1dPZTZTYVpYU20rbXpZbzY0K3Y0WWtuU1MrMXN2aXhaUGVlRWxDODQ4bzZpOU5PYlNZVlpaZUxKTG1rRmNGWDdCTWJGSzMvSGhMb2FBY1Z0UzZwZ2xVVU5YMjRrSE9hcHg0RURFYjd6eXlJQjBQWUtjU3liWDY3VDBEdnc3VnJ2WlZNM0RtcnZhd3Z2OU1ROVJka2xGRytTR1dIRm45c0pjN1Rpb0UzZnVrVFVyaUtWM2RaSTljazRiNW5MU0VhY1ZSQ2dMeU9xdlRjckJDeHdBcjBISXJ5aVl1NTVjT2tZckI4LzJFSFpGRHRhQUxxYUloWkh0NXQvQVVpQnM5QkZld2hmc1lTU2lkUHJXbHZRbmdKSlVrVnNQNnJCcTFRM2ovU3ZjMjVmTTkxLzBFbzgrME42c2VlVTFjZmE2Qk0yWDJBWHdIQmtkS1paRFpSK1lDaElYZHJtKzdLazVLTGtUUGtTcjArOTZTZS92SmtHdVFTWjNlN01pZWFOYXdueGF0VGRlSXZhWHZkcy9GSzRsNWhuckZCdWVEYm53TVpCV2loY0tHdGcwQVlHSUx1czNrUU8xWDJoemxpSFl4ZUFlT1Uzc0FuUWdkeDYwVnZmL0I2ZnFLcW4rUEZqYXVPVnNXWGNyWFVaT1JYTjNFSVJLOEs4M1BEVC9IaHdnS0RESjRmYVYxSkorclhxTmZJQ2FvQW9FbHBqdzhHbFpHK2phS2xIb24vZHUrSmRhcC9pQmRhbisyZ3BwSFJDSE1qK1dhQ1p0dlYyQVVjZjZsUTVVVGNvQ1djb2lLN0VrT2ZHdHFOR1Y4emhlaGM1L3dEQitmZDgydWVZNHJjc01id2phWTR0YnhoaHlSRlFsd2VhU1BjNUZQam9kTzNTcUloa0w2OUw4RVBNWHMyS1ZocmRsRktFZlRSRlk0eHBJcS9PVURsYm9kZDUrT1VVcTRjbElkV21YYklHSktIN0RUdHF5T1JSRXByUStyWDVSZjU3WWFrcURobS9sdy9xZ0ZNaDk5dWMvNDFlMEpldklvalJBSy9uMUYwOHpCOTlkYjFjaXpYQU5tdnFseGxsV2xsMGFJTmFGN2VzVUlZVlZCQTJiSFo2MG14OEtCYTVrNERkNXpxRUdSaVNoN2VDZlRtQTYrNHArV1BtZlBOZWNZQnFSZHRabExDSEc5WVpEWjQ3dDhGUlJlOEQ5STM5S3hRVjlUMU5rZGtaeFhROWp1U0hiR25vdC9IVHpPcitzYkZVRFN5TjBmT1FDS2pBOTZUOThJUHVHdXNMRHZsM1V1TUhRK2tPdjh1YSsvKzBMYWJsbkRKcTF3SGpOa0ZnTUlSblJQUzJScU15TklRZ2NKTlk2S1lzS2dobkVTVjFMQzRSQkJNb2xBY1dYODU3QzMxb2FUUHhxczVDTkIrZktiK2NnTUJTRXNEYVJjUjFsRURDRVZ3RFBSUlJpeVhMcUN6MW1vT0VncjRhVzlhd2VCOU1mSW03dms3WTd3NjJSTkYzY1QxTDF2TEZKSFlnQmtKb092QzA3NGI0OGpncUJqMmtqVGd0bDN3c05LOGlpUXFzYUM2MUV0M2JwazRBOEozcFcxT054TTd0d0kydnFya1lQcTdXZ0M1RGU1d251aVVTTDkyT1ZkbTZ3R2RsVDRIMjdGZytISjZuK00yNkhuQlF4S2FOOXdFSG9yYmdZd0hxcUxzM3g2SjBRbEhGWk9CR1hyRE1kUHJURTlxdVA3ZzRhRHRvTmltWllUMkpQM2pyRzJXZHhRdWNGWThpckpkR3ZRRW95MjJKdmtqeGpLZkJYamRQOUFuZkkrNTNWb1ZKWjNZb1FEZ0pVQk15RjM1dHZqZW1qWkhIWEhkV3RSMWU1allHakZsNDQ2WDZVWC9JL2FidFRjNVp4emhSeXRlRzVkYkQ2dmcyc0FWeTZ1YkN0NWxKc2NNM0o3WnJsVUx4QkdnMG01NW16bFhHRE5iOStocWN4Mm1xb0FQRlpjK3Z5Z0dFeTI4UjRiYnJBTzFvNjNqTHVxMjJESjcxZ0RRbnV6TUNhQi9xbjhFZW1tUU55L2ZXTTRGdWpqMzI5S2FzQmozamFyY0gxeTJCaGFIeFg5L0RwcHZQKzVrRGJ4dmVCamV0WmZ1MmRVMW9DSnIwbGppVy9QUGNCbkR3YkdSZVFxUGRQTjE3TlJaRXVMd0ZwcFJkZWNhUkEvQ1VkRlRCVnV4M04vSERLRWdRaEozVUxnSUtQNHFkVjNLZVlsY0tJV0l0WXpYNExqYnBJcnQ2RWtFSjJVODl0K3lQa0c2eEdKT3BwWS8vRC9DRDNWTHVHT3RGdFZYZnVQeURjV2NtOFpmbDFkcmoydHh3TUdJelJPMjBWK05COVQ3dVN6WVRuWWFvSUhLV3MwY0dRckJaY2ZWWXBmWVVIQ1hJRm4rUXF4eWZnd24yRldxVWkxWm5JaDlNN1NkRE5pREl1bnFZcmEycE5LdGh2WjBBSUpJdFFzR2cyRmZRU1BnUTdtNU1mbmtyM0NTeEZOVHFQQzdnWlhTUEVjN0ZVLzhsdzh1UGNIRFRjSW05Zm9jeVpzMEFlak1LNnVWRm45ZUYwaXZNbS83NWNDbjdJQ0JnVE1ITC9oWFV2RTh6ejNXOGo0ektOdHJ1Ni9BaEFqbktxaDdWRjVZLzlrQUFRQWFBRUFBQVNNQVFBQVBBUVFqQWdBQUFBQUJFUUg0UUFBQ0FBa0NBUUVLQWdBREFCbFVhR2x6SUdseklHOW1JRVpwYm1kbGNpQW9OQ2s9PC9CREI-CiAgICA8L0JJUj4KICAgIDxCSVI-CiAgICAgICAgPFZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU-CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU-CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IE1pZGRsZUZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw-CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk-CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU-CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT43ODwvU2NvcmU-CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8-CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBUG5GQUFFQkFRQUErYlVINWd3Y0RDQXNBQ1FBQUFBQUFBRXdBRUFBRHdJQVFBSUFRQUlEQUFFQjlBSDBBZlFCOUFnRkhRRHVBV1VBQVBsRUFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCWlFBQUFPNEFBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUR1QUFBQlpRQUFBQUFBQUFBQUFBQUE3Z0FBQVdVQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBRDRUQUFCLzVQZkd4QUpWT2QzeHpjWWp1MXc2NVZGaEtwbnZQRGYwMVYxVmdOWitSUG1ZOEYzSS9wT3hrbjlLK0dyTXF6VWRCUGZKb0JvZ0lDQThZQkhIK1FEdzhHRWI3UmJQeXFBOGFCcnpZSlpSN01hS3lIZ3djNU1nUHdKZ0QyckgwaWU4c0lpVlFOSFZoMDFTdFI2MUUraFVpaysxUkVFM1lrRVdKRExUa1ZYbVA5MVNhT3lnWGFBdzFDT1FiQ0lvRm12bUs1VWFSWlJBRVcraUc5S2pBdytYMjN3N0U4ZVZJVXJPcHlRTVVEOFNxL1pKdVM5dU9VNGNhNnVNYXErbEZwcGFLNlFoa0cxT3c3emJFdWpBSEhrSXFZYTM4U0lrQlZzWThzYVZGMnhNb0Q5c0J2NTRFeDV1QzNUK3BQMUJ2eGt2d25mbVVDK1JqbG9SdDJ6Z1Znbmx1Sy9mUFdlZUI1S2JUV0JQQXdWQjNzTFMrRUZ3RlYxakU3UHNBSmUvYmwxTFBiSUhPc3hBSHgySnl2S2dsZGdJc3djczNUL1JqLzZpMkQreXBFMTJISWZyaTJ1Sk9DdVBLNlRVc1I4eHRLdllJUGh2RzFDQUxUYlFiQURYRTZQa1dnQVNMQklyNWVUYnI3TjFpK0VwV3ZPVklERm96elVpSC9zOENsL1BMaS95LzI5V2lxRitML2RyN1Fwb3pscDFMYW9oZmYvRGxIbi94ZmplamlwcnVqak1SeEtMdGlubjFESmtNam8vSDVXaFBqeDB2RXV0WXFBL0VXTkFMa1RuU2dCakxKdlMxQ2prYjZjb3B4blZ3RG0vVTVVQWVDN090WEdUSzhyZUhGemV1V2dSUFRjczFHQ2NiNExyS28wRllERmR5NG1qR1lWMldSVGQrS2tFRzhJdFBYNWlQM1RqZGdwaEcwRWdOUTJwcVFIV2lSVkRBVVhIVTFUclY5MXA1dUhXQjF2aW1DQzVhZUpiZ1BCWXYzY1VrMXdpV1NHL01DTHVieGFTTUpQbjN0YzNHWWpnNVNpdlB1RUtWdnNROVZMTVlOMUFTT09JTEFJMW10a25uYk5jaDBIYlBOSzI3UDd0OXJCdjF2MEdoc1EzYlB5ejN2N2VqMnplZWVvbytFOEc0TkFVM2Q2MEtlUGdmR3p3eVNsVXk0NjBMaWtjQzV6Y0NneG9JV0RBRWkrdlgzbTBCOHFscS9iamNUQ1RBZ2FveEhROEErcGlCZ0h4MzFwV2RGbnB5ZWFmOXBhTmtZV29ZcVRpMzV6Sko2Qno2c1J6d1RnWnlFOFVIcllYeXBRa201RWo5QTJmNG44cGZmSVRYem1NTGRjb2ViMFo3UzJ5NnRmNllsaTMxSnpnMFN4MWpSRkVSdkNJT0ZWTnROY21EaWFqTGczTG1TcndXOHJXMUxsOEp6WXkwbHlsSzg5a0swQWluVGtxaG5ud2Fyb0lyZzVpY2Z2VWQzQmFtZVJ6ZjRRWDhNaHM1bW56d2xnc0xlWVZjbjRUWTJDNzgyVHRpanZySXVoT1NXK1FlcXpkQUJTdjQwZGVXZ3FFQmVJTk0vaHJhZ2RXM1VteXc4dmNsVkZDOGlkWnZaSGM5VDluNFBLdDJOTURBamxFZldRS1pTbENZNWRTN242VkgxdExUc0hZRGFQUW5PUzVhclRJOUo1czk3WDdWaFhSeWZwY3hHOUc5ODZiTVdrcHdkVTdSN1N4YVI2YnJ0eHliMmdsSk1qNkNHeWo1S3R5dTRyVGdoQzB1UlRwQ0NreGY1RkZSNVdQa1VTbHB2aTVJZ0pKaUFrQllZYk1DZkJhWW51VENmM0k5SExZNUtVV1I4cTlHeTY4dTJVMzZVdW4zaUczNzRMU3ZvNlR6Q2UyMmp5aTV2Rm1HRVN2ajFsNDFhc3lra2NTaVNjcTdqZ1FMSjdlK0ZtekFoL05ENnpiSzdKd3UrSEVGZVE1aGxyUnBxUVEzLzhwN0Jhc2tFeG5Dc28reWI0SitwMnVmdVJVVlRjdE84cVhjc1o4ZUdFblZjVE11TmpCOHh3aFlGQ0h4aTlWcjdxL29vdndOdDRmVlZLYVk0VExkbUl2UXRHbXZqMlB4SXdRc2c3bElvdlMzRnpqMVl4bERQNmhOcXBBSUE3b3VmME1kc0ppR2l3UzJ3Qk9xRTAxT2VDS3lGSHVpS1gva3l2RFlsNVVjQXM0N2xsT0ZHRXBZNm9iWlN2QVQ5WnNTRCtRS20zekEwUVhqdUU0S3liWVhUVmZYQUVRdEF2Uk1pQ2dJRStZaWtFVEh1U2NDZUYrREpQeTdZQW9od2JIcDc1eEFBU3lkVTE5YmtqbW56bG9DTGgxZzI1Rk9lTSt2VW5Jb3ZyNWwwS1Y1UDdRQ3M1cGJ6ZmFBek9TaXlFRUEvNTVMRFY3VHpBMmRLOE5EVXFQd1BGSVBxTVNTblAvdUJRY04zRTF4K3JqemtyaTNxVTIxYThhQ0o3SWdCaFpaZkFWaEZhdDBoMWZ5cVZHbE9lMGhpUlYrakRPLzlnWnZqVmxzUWUvejZuT3RDYVpVMXZ0OFdpWWtoMDNLYjZ5cVdwemhvOStMb2E3NXJTY3JuN0Q2SDNnR2hBbGhxb2xDWkRpSThjVFl4ajB3MTlUVWd5ekJWeEJQS25VcFQyQ2daU3Yxc1RDZlRvNHpNYmp2MVFzeC9nRUJuTUE1ajVDWDFiRktPcWtJODJZSjIvelF4cEVSL1NaRVN5V3pJUHhOYlo2VnhDSmN3UjBMV29WbVEzWmhQcmNHMUY2bkM1MEV1WVVaeHVZWHQvbEdzOW1tbkxSU2EyWVhXaXJNeGVUV3JsTDhUTVJiNUJlME13azNZVGd0SE5rN3FBSGo5aHFQdkNJMHRtYXlsQndlYThtWGo1bE5vd3VMMXdBVkQvQVlhblVhN0k4cHFPTWNBdFJjaUpPMGxlczcrRER2Y0RNMDFZdGxkU2VOdnVaM1lYbnZlOExObWdlR2J1WUhIQWlWTlBEZFVwY3JVTWp2YXhYWU1BR2d4TkV5bjFidkVqMTFld0U2WnYxQSttblZsR1hBclh3Rk4rTndpT0ZJdERvYm5tTVYvZGNxUzJCTlBYMmUrYW9OalFLeisyR1ZXOEorNGtqRGZob2RFTEMwNHdGelVGbWY4MXlybnZ4bE53cEVuVlllZ2ZMcjBZVHkyb2RkRGJnQ2dsVnRBZmg1S1BnRy9PVmRQNmVVT1FpMVA5c1VOSzllK1MvZ3FUSnRBOUZVbFEwb0hGTXdPWW84dW5YcWlqRDRvTXR4TlBqNmRBVzdVZkI4Wk93d2wwNEhXbEl5c0lWUmlQYk1iTWh4Y3dNUiswbGNzcWwvanR3eUF2NkVjWUpGU2pXZHIvY2JqaktFNTdXbldQSi9yV2V5emFtWnhIeGpsSFgxTHQxSFNnOWQzTEhWbWpMWnlRVFBWNnNHZzF2blJSeHc4ejMwdzJEOFFpOVJodndhUTY2d0E3ekNlZ1RnYmJzeTVqYWhmWDI2LzJaZTF1Qm53L3FLUFFaZm9qV0hYN3RtWnU3Nm1TMU93VUl5dms0QmJzOTVtR25qdFNUZVlMUkU1d3pkODQwRkRzUExNR0o2all2ZTcydEROUmQzU2JBb3U2akI5ZEwzVDhXdEkzTHdhUXdSVUppS01scm81eldsSWJ4RjRFVCtZM3BnUlJ0VHN6YUtmZUxpeUtOOW5USWNLSXk0cmFNVXhRNnNGZFNjRk9LenlweW1FdEI4TDNQRFpsMzgvQzdUM2F4a3JZVzBxKzdTVkVZenlIMFFDdHNCNHN6aFowbm9DeFlNdG9QdFhXc2ZZeWliRWV4TkgvTkNWb0RYSkU0YllmVkdDK3VMbVRwQnhCejZYaE8rU284djlaeS9VRTFnN3Q4cmJjL3pROFY1WlIyR3dKRUlHMFQxMXlFUlRkZVFEWnJnWkxkeUdHaW0vS2RYQ3ppdlAxZDZkQU5Mcnh3eGd4TW5SSmkxSWIxQlhmWFA5Mk1ud3paVmVPakF3Qk4zQytQQytrR0hkeDRqQlhxcVg3bkRnNTd3b3p2K1hBSEJkbk4vbks5alBNTlVMbGJlNk1vMy9Ra3hZdWVKV0J4akRPV0NLOXI1bk40alBMK1JRdStyM3lKcENSTUY4RVlqQW5NUmxIU3ZQR3kwSGFtNm5DRXMvZHVteUErb3ZzT0tBTkp6eGcySEVoenU2VEQxY2N3cVk5MFdhbmp5V2hQSmtTRGtRRkFqeFh2Qm14YVJrYWFqOUtLZDRXcGNTU3YrT3M4RTE0Vko3UmlvM3NnZGxjOVh1TFoxckd6Sk53UGFTRFFsZSt1K0pZUFc5eG5Pb2Q3RzlzSkFZY3l5dHc0dVJDNFVLVWo0TkN2dDJpek5HS0VqVXp6Q3NoSURxTjN6WVlaZXJNd3ZiNjBGNWFKQ1dsMVdCQ2QrUVovekFTdE80SFRqNlRkRWJyY0dhMmFrMzhIQ0d3OHNLbTJvZjZXM1d1ZCtXOWI2VThHTUlReitZT3Y1YUZZdEZQbU9MU2VvMk1HcHZZaU1pUjBsZS92dE5rdmlxLzZZNERFWHF4MDNnM0RpbWlrSU83NnJBd0VYWENGeTJ2RUJaTVE3Z0x6cGdUSmxvMy9JUkcrQlZScHhXRWhvSXJ6cTl0V2JtOUNNZVpaQkc3VjIvVXd6TzRCNXNFakxHaC9Rd3Y2R0kvV09vQS9QblBiWFhwRXZlakROYkx3UnVtdUJ5aGZ6WU1JQ0RISHdVN0EzejFSQW5FT0trTjBvcFFTa3FZVGVGOTFtMXpWWEdFTC8zYmdhU2I2QWp1L3ZpekhwV3c1QytUTWdNQzBXaERqREV1ZkY5RVVnYVNMd3VpdW9kYVlEZHdGMWNMNVNFSTh3WVBQNXJxMHR3NDN0bmtkelNwTnlCNWJIWElPODNIc2prYXp4UDc5NWpqbHU0MjF4TkpJNUlXUTJIcnBhN09URXlheDdqcDNySVRoRHQ2YTRBNCtiTWp2NXFGeGZRSFJRYzF6NzM5WjdyblRnT2tSVVlJQ3JYdlNtWG8rQmsyQU54UnUvVENOaVU0dzBrQm9qSS9MYTQ1SnRwQzBxcTBoc3JpRmkvNmtUZ2ZBVVFlK05pbXlPeW1PWWIwTnhxdzhYQ3J3aTU2dG52OFZBSDVxUEw1RlRSVlB6eldnWk9hYUdmNDhJT0kxR0R5OGJ6dUFnazBNaGhyL0hSTW9HemNzZ3czU2dsNUpuYzBLV2V2NDBFWUF2a2g4RHlRb3hlZ3EvUFVYdktMZVlmN0dPN2FUMStRRGVtREQ1ZSsybFMzdVVwT0kwTisyaXVjaHlIdFRUL2NBWEcxRWlxQkRwc2lpb1RmQThkRkpHK2xkRitFUUkwQnVXMVB5Um42STlBUHhsRU4wcmFTdWRxaUQzWXphakNLOEp2UGNpTkFyQmt2VVFWS0wvbTRRbXpzeGlza0R6bjZxT1NrTjg1NjB6UFh4OFh5NzNHMS90WFplRjIyamhrTm00U0ZQT0QxU3p0ZFFBelVqK3Q3Wlo2cFMvRUtJNURUSm95UFN5KzdQdHNwWnNxZFRmb0d4eGFucXNRY3JkYnlnSE1OcCtpenV5Tlc3L2ptMUdVOHZ1VVNxcWlxVVhOazJyQ1IzaFArRmw5UGw5a2RNV2pEZ2pvK3VUYnFEbCtiS2NYdVh2OHZ6MkdnUFhRVFZiVUFnNDlka2FqQ3YzUVJ2d3EyNW9zZ04rby9ETUN5M0R5dnYxVEo2c0FheGVrTGVhd1RPMk52SnFmMFBpNHg1dFlMZWtRck92eTVYTy9tcUVyQWIzVmtlMlVkRUtJZENpMjdZRXVITHcyMjlUR3VaRmdQWVQvTkxMR2ZVUmJZeG43TWVRVXQ1eFplVjBYOUtIVm8zaFB2dHBOeEorelZWUU5FdG5EREVGNk0rUUtGTElHS1dMUFJHZmh6ZEFhTlduQ0JIcmtqTlV6djlETzJwUUhXdFRoTERmWVIwU0Nid2l2STZUUHRlOGdUWFlseUxWL25CcG5wWi8yZHhiem80VFVqNUZtZngrQUtmRnJjZDMvNUVxYjJudmlwVHdlVW1EVFBTYjZwQ0VvZHNHaVE3cW1mQStDOFJjNEpGT09veUNISXJycEE4QXpDWFFMSGJ1Qm9wdTNud1dUTFJhRGwzREdoNG50ZHJTcmtpMnRWZEtlNmR3UkQwN2RWUUkxdnNEZytXQWdXY2RQQVg0bFllNXA3L21wRjlzaldnc0VQLzBHeE1rYzc0SVpOcXV3ci9tUmV3dllQWVE0K3NOVXVxRGxORmU2T2paM3BGQ2RNdFRSamdmcE8wMExnVm5RWHI4SWZFbHQzL0dXdVRwMW8wMVVxMjQ2Zi9pQ01ienZmL3ZRdktSNEZKQWg2VVJpbngxMDJoeEhDYndtRVN4WkVhcWkySDJPZWJwdlI3WWxrSlRvbkJSZC9lOFFTNk9ORldiUnZTa080TlF1OGI0VEE0NzVwZmJHQlg1dHArOEptb2FJRnFHTUExdjFra1JzK042bzUweGxiUFhoRldPOEdGSUE5bStTazdWeVBJOThqODBOZ0xJenhQNEY1bVlOMHdlUHRJY3VzeTk5SmNMZzVCbkFNY2RaN05VaS9jYTRqbUdMM2JXb1YvcGIrcmJhRVlRa24zeE1Yb2JZTnB4ak9oc25GS3VSbng5cnJuczEwNTh0cVZhQWZkOEdZSVFNdXpLdzdhSnpld3crOVJxNGEwUzlhUE9hZWtYbzRzR2s4cU5qWWswSTI0T0xQdmRoazRqWTQ3SDRJZUl6WEFFSnlxWWRsZkY3SmxibnlxUVVlUSsvWWdUSEpMemlrc2dNV1ZjL0FPQWtTMHFiNlRlR2pSTVhZUGxMUGFHQ01NNldJeU12UEt5cXRKMFNTWXdtOHQ1RkZDUzNmZXNROFhKSmtIWkZkZkVIM1plTXdMQUdDWjNZVDBzWHRhbjFtSGtZWDBHN1gwdFlJVzdYdzQzcm0vay9uWDlBZThFelNlcHVaQlJzYm44VG1rVUNiZ28xWHNjYjJsRXgvaDVDamVrSTRXOG8xbExaNysyMmFsQm1WOCtHcjNVditramVkUWNWMG5KU1duNmNkS2pqRys0YnhjcGtGR0NzRzR1dE5FQ0hwWnVjMVhNWE02Q2JnN1pDN2RVLzFPU2UyelNRUWdTNTVQVzFqMnRUR3hLTXNZZGpHbENpSU1GNndleWszZ055cG5ZUUlQWTZ4V3IyRXVNRlcvcGhzajA0ak9VRElReEc1OWkvMHBVVTVyUk9JekxWNzFDeEh0V2RENnRvNldxVFUzMERKZzNtNTNscWZlS3BOaEdTRVNOb29SSTQ1UlkvRDdvbmM1VEFOR2hNeVRoZElRenVLeDQyMUUyeXhnWGlRU05LQjRsSXFHVlMyL2FPMDNjZ2NsOWEzSUJhT3dNazYxYzdIcStnMXRFWUI5Q3ErK1ZmTlJvOXplVm5FZjVPdnpjbGJPeVlDM1drbXRHS0o5UDVtVldzb3dWVTZ1SE9hSWl4Y1dtQkFnMU5GQms3U09KaUsxdENFK0JZMmlhV1AyOEJzWXhZSWpxc1hyR0hFdzRwV2J1YzFSQ2lHcnJzM3BySTBqOWhGeUxna0t6SWpHT0dlc1o5dCtpQzVQaGFORDlmdFAwY1ViM1BQT3ZXWkpZTTRXRlAvYko4OVFhajdWU1NKdFg3UEkwby9heklBTS9CQWNVdzlFYnNkcVFkUDRqSFBUY2FrVEF5WTEzazRKTlloVURFc3dhdVdwcm5LYlIwUjErVEpidXA4d2VyWG10M21nSHFpcFU5SjZubVg1bEVuRjlwSFJQTWd5RmcyaWU2TVpWK09uQ0FJVHRVRE54cXJoc0dtSEdRTlF6OE1JSUlYeGFXNWVjYVBkTGlFVWZVbktKUzdzZjlRR291Z1dTcS8wd2F0RXdkN28vai9PU1Q0U29aUWV3ZFlFc3IzcWZLVGxVOTdTSzNDcmIxN21zYVdRc2p3Ynd0a2lHWjVLSkp0Rk8rbmxoVS9jMUtSZ0VOUFgxZnR5M1VtNkZidnhBWXlsc2JUdXJ3eVRHb2I1a0p2NWw2OEx0blhIUmNtRTVJZGhkZThCYmxZMDB0R2Z2QmU2RmJNaWtuZzltS01lRjl6N2d6T1hkSzVMTmNiTkEvOXNrNXl3SzZIbW04MTRwbU5qTzlWbVBocmU1VDJiTFR5ZWZFYmRQNVhUbXBNek5MSk4yMXNvdmtaR3AydUVFNUpyTjJDVWNGWDE5eHdXaldic3oxWWdZRXdCK2tOYk0vdTlzNWcyNjQyMzFKeDhaQms2b0cwSmpzQVIrVVVnMC9kNzZJeU1kTkxxb0FIeXFwWklwMS9TRXdPelQ3Rko4ODdPMU9qNDFRcE0zVDZJTURad2NteE4rRk5JN0tqYXloaHJNL1NFaGFycm0wcllobFNrQWpnZk9sNU9kei9ab3ZXN0FyNitTdlE2bVV0T2pMWlo0S2d6eWRYZnFLRVZmTktjeEJGQm9uMEF5bTZGZ1hVeHE5VEhqSE1lTDVvU1VuOEpWMXNCSTVraEZQZE1YeU55cmpMZzNQM2N6TFBCWDhzcU1hb044akErOTlDTlI5amFRVkFXOXE2L2JlYmxtd1VrOTJjTy91UmhvZXliRmd5TmM5Y0dlenFBc2l6VHNJYWRWWnZ0cU03azBVNStLdkt0L1lpOWFwcFhhSnlTb3R4THI3WXBLOUVBcnU4YWl0U2NCZlVUbXU0WStlak9IemZTWHBvd1diTGdVbHdzNktuemV1NEpHVTd6TEQwaEtpQld2emNBTGVycmhKS2ZPOEF3bDN4UkhpK1BsMXgrU1FLakJrTzBqRnpSY20wd0lrRWpGQWlsOGs2WmlQNWp2NkoyMzJTYzgvdXVjUVVhN0tKUjVQZ1Rwa3cvVW16NW5oSDVxYjZ0dVFaaklKS0pGRVRHcm8vZnRyRVNYWnRkMmdWZDdZN09HeVNDS211WVRzMG5IamxaSy9qUTJxVjZmcHV3Yk5rRTZPRWx0ZFRmNUxOV0tqT2crUDRPSGVpZjFIaGM3TDF6MUczSjN4TmRDZkQwY1Z2VGdZVjd4cFU1MnRpYjJOQitxUnVDU0Jyc085M01HNDdTKy9EWDRDQWdJRG5uc29BNVdKOE1zNGpZMlByVlRYQzQzR2luUStNbzZWSElxdTFmSlR6d0x1SEk2YkNNQ1ZVM2N3ZlJXK1FPa3F6U2VPTlZScFpCdEMveCtkeHpiZnQ2SEdubFA0eVdGS2l3dHNWN3EyeVBFRkY3MHU4WERXdU41bVAreWt5VkhkZk9FTzE1TGdPVS9Kd0hpOStpNnBjSVFrK1ltU2xIdFVvc0JHeTRkdGE4T1JaK1hUUTRYYzhyd1luZnBRaVhFczB1eG1jQ0VzZ0p2T3pnOXBZaU1XL2U1SW9sV3F2MzluTW5Fd09lUDFJUEtjRldEb1FiaXE2MUdLMDViRnN4VjRyQy8yNEcwZ0RlTnd4eXRDQ2dwbTFnSkhseXpLK3hmb0sweEQwQnhuZFRoSm51NHV2TkkzV2I3b3ZPam52UmdCTzNNZ203NHU3ZzlaOHJFWEJJSFJHSWxjU0lhWG1pRTUzY2g3cHBwUEZtTEJSNklDOHA1S2UvMGVGdUozNStGM1pYM29FMmRwWVhFNVU0U0JsenMrWElneGY3c0Y0UG9NTW1JT0cwZjVCcktMRjB2bEU0aEt2MDZUQnZpSTBoaEkxakxDNnV2TmZSNkdxcUZvZFJXcDdrQWtHd05lMUQvWUNNT01Vb1lkYXE4ZzA2U0dObEF1YUloT3RHNFR0bzNOZHExOGh0b3BYS0orSy9jNGN5MlR5WFcyZlBIK2huOE9rTis2OGI1MzlwL2diZk9CWkJYNkRFTWRtZDJ5WFBhQy9qWGZ3ZWdUbSt1N3ljaUVudVhoeWVjQTlNbTZMMWptYnFsSTZpem9QNEltKzN6S09CSTJlZGUyUWE4alBaL25Ic1ZSNFU5V2xwT3pWRUN3TzRkcncyZjJQekZVZkFDcjB3OEVsY1U2ME8vS2dTQk5yRmhxamFVVGtWREtrVXFOV3FPTUkyQTJWNC9MdU9waTZGdGVGL3hWNS9BUm02VDkxZEZGbTFYaFVpeWVNaG9WV01yRHhUbHdGZ1FJU3FWMXcwTzRTaUhyem11TVAxdWVTT0VZVTRuSk04MGdPZVd1QlV2VmFFRnF3MmViclpHNXhYM1pmTW5JN01KcENJSmtzZTJZOEJtTHlYbHE4bzRiSU9BNTd1MWUrV21nRzNHWURVTzFwTCtPcXBIekdIc2NESlVseUNyVG9XYlpJV3ZiTnpDbnRTcVRTLzJlMEFUd2sxZGFCN01DVGRGM2RYa21mZ3cwREhsT1VhN2ZvZ2FsZ29KVCtJb1B1VnFkaHpqUWdEY0cra3ladjQrQVA4SkkzQjRQbC9YazdzNmhZdlZBM2NBU2d5L0huejA1UndUWUgzaEk3MThSeUg1VFZuYnZlZ1VSa1hVcEZ6bDU4MFBtR0pyUWhoRnJudkNFRTYvVlZobTNvMFc5UkJvNHRUL2g1eVZaRUZ5NWtqS0U4V1RQbnhubW1wVmRjcDg3VEEzMktuY1pVVlA5WUl1WTBoVkdtdmJpRzg5cGp0R3NKQXdpNVgvWnpyekNpQ3NVbXRXeFdUSWVIbDFidVUyMUp4MDcyQ2dZeG91YVRrNkpHRDV2Q01obEhldDJtdEUyODFBYk1IWXFxM2UyRkpZVWdsVVl0TDFwb1R1VTJDaVhreHhSM0t6TkVyY3RVaG56MEtrSEhETlU0dEpZM1RrQ0Nud2xqZEhsVVlpSnVJeTB1ZExsQ3VVS2ZKZXo0aCtqbVpCNnJ0Ty9qbjh5a2JyazJ5eDQ3Zll5ZzFNdTh4UXBtd0t1ck4zUFh3LzJ3ajZJU2lZWVlqRTFHVm0xSysxbWREejFsMm5GZWxwSW1mTG5NRnVjRjJmVFZMRmNUSUFxemFsOU5yVFFoc3REd0x2OXhXQVJNQ0JCcllodDBNMmdQNyt3NVNuVVN1RXFXamxIaklnSzl2OVk1NXcycWoxVW9uNVk4OTh6ZDZXNS9MQ1Jrc0xUMWVOdTBGRmF0bTFxTWl6bDRZaVlxMFQwSWpXcC9LOHFIZUR2dVM2OXFWUXhHUUx6WW94aW85WXl2MW9RdlcxTTZoYUN1bVkxU2htdjk4bERzeU5VMGVJTHhKb2Rwd0o4K1QxSWplQ0pUVlJic0hybFpUcTFlb0VzWTd4S0Q0NTRTcXVRc3hsbTROYndqZHltcGgzMy9PS2ZvL0xmcFVJa0ZCSTg1QzN6bDREcVNoTkxucm45YmJyaHh3Y2xnRjZTQmpTZG1vZTc0eFp2VnpleXI1WHRjdDBlZXh6akJVM0l6Q0dJUkFocnBYV3JyTTQvTHZseTJkbGkyY1ZWdXFpNnFMRk1WUjAwSTNIcjVJOS9mdTNnYXZvVUd5cjRYK0dIMEg1cXdSUUhxT1VEaXk1VnBuWDlxcDk2MnlsaTVLL2lSbEtINVFBVnk1UUVCd2hUdHhva1BiQWZoZXZtb3VQNThNbDhhdk5CSGhwTG1xY2czV2pKV3RxN0tEbHYydUVOc0pSRlljZnhIY3lBM2dyRlAwbVNyMitWVGVrV0VwblBPMTg4b1cvdTR5YzV4WHJOUk5RYnI5b1FxNTJTV2Q3bWRNaE1aM29uMTNzRXFWaW01U3FweitvNWdGcmUzN2YxazlYMTZhZjJMZnZySVRmZnN6ZjMrb21ESWtldlpQd0c5c2VFbUtYZnhGRXE5RkFSU2k0MjZLYmVzb3c5a0MxTDhUWTdSNWJNNFRUWFYrZHhIWEtXVlgzNGNBV2twQmlmVU96akFScmtEbmlVOGpXQ2VKd2VxV2VleC9mSU1ua2pORjNmSTBqTUc2b0JsdGcrK3dJbmNHWUhJalk2cS9HdWJqZzZEWjRCb2lYck1Bald4N0VsYm82bW0xSnVvL1BxMmRHSjRSUFhoUXRIdUFHdDY0c3lkeURkQ3c4bVNBS0Zpb3Vmdk8zZHF0ekUwWWJFRGtKK1VPRjYxZEttaFphZmgwbXhSekdWdnJsU2RuUnBMb1Y1TTluUVBKekg0djZqZ1RMcnJqaGJSVUpMZTBzQlgrb2FwY1RlYXl1ZVA0YnZHZTNTZHdvY3dTREExSWp2cEl5bUdaa2Urb3NMdmhqLy9JZjlKS2ZxSmxJRXNJRnE4MmlmRjE3ZjR4bk5MNjlKanpxcU4yaFZYeXlxVFRCeG95a2R5eGdmSDJsbkU2RXd6bkJiVHNZcWw2dmJrSEJuN0tCWU9IWWdzZVBydkozZHovMWVKd2JweVJ3bEdZcS84RFJKdEYvcTBlOHdCcVJOVkxvRzVWSi9ZMXE5bjB0anRwU053N0hqZkp3OCtNakdxd3N4OXlidlY3b1FRV0NZNk45Q0RpMjVNOHZENUZucjJpUjZGNTNMMi8wTVc5WWtZOUIxbENxaU1Dd2diSW8xZTZRVW5UZXlpRjlFTG1JZWRCUDdoK28xRFRxNjVNYXJqQVBkeTJKYnBKNjNTc2ozT3gzcjYvVmVBMk1nNnBmRDdXcG1VUzQzenl0YXc5cEJ1Z3dTZ3hyK203QXVkVElwZ2N1d2FLUFZKN1NEMFlpbHBpK0NZS0oxdVBKemZNN1ZRcXFYbmpKU2VNTmRQVVB6NWdCcC9pT0M0Kzl6WklaNmhMZUNWN1ZGS0Fjc0hrWk82NFh4Tm5LOFRPVTFJZStYRGtNK3JtVHNRcE9wYWMzY0ljL3pYSWYyRjRsQkZaTlB4dWUwMnQrSDMyZGIrVXkxblFJb00yU2E1TU1hM3pXdGNqZmRVakZHR3BoQ2U4ekxTS2RlU1l5Z1RUMkxrdmsxRHE0Y3FLeFFZekpIOUtVbUJJSzduaDY4YXJrZWVoYzBRRytZUlF1REo5UGQ2eWl5NDVpRTQyaFZvdjE2eU5rWThzUmQ0MHgxU1RvblhFV0MrRk9oR1NqVTlGRVNablRLeVdmU3doNEpTb3VodWVPMEV2enBRZFdFZGRTOUcwVFlyb09rUzMzTG53NHl3UG40Z200Y0RSTnJ3UmU0RWJRYTFwNUo3MFJNSnljWEY0V2Fwb0NCa3hESVdQcXJCbU9zRHZyUFN0QVdSREw4RjhuSXNUWjlPbUhwSmdPd1ZHTzRPclgyQ3Nla292dEpUSjN6RjlXSlV4dkVLZVlRQmhqZVdwdllrY3AxVUJVNVBEWTRrN3prYUdDT3VlT3VibDhucm03VGRkejF4ckZqRno5MmVqb0VDSStZMkpXSWxrdkNrVUROQ1BPVUJQODdWNCtrbzdIWi9ZTnFZZ1NoNWYwUEpkZEk4eGJrMDliSFFJbU5uR0oyZDJGSWQ1bTdaeno3dXJYSFpWbHdMSWMveFF2bHhQOFIzRDNWZnk1RGdUZXFSYXFrcnBvUlU0dkdldFNPWlhhaXl1N2RmYjMyVWJrcGJHVHRoMFA0S3ZXeVc2Znp2OG5ocEZUQ2NNaktlbUxrUmllMGxqNDMzYmxmbDhOK0RxY2lBNEVIT25hTS90Y0RQNEVSVlZ1WWhjOHlMQmV2cDdCR0tuU01pV0xZc0RacU8rUEMzT1ZFNndnSjFXWDBudW1OOERXOWwvQ3lPSEdhL3F0UlFVNTJYdW9ucWVlL1RSM2hkdXczSUNMVmRQdEtRNmlZV0dhUVNwSHY3N2podFNMa25QaGFxU2F0ank2MkJtUDhTclpQY2wxaVh5dmNONUtFd1pid1g4clhZeGtJY0ZlSDVVK0JHaVRzR3g1OWhOY0R0a3JaREg0eEo4Qk5RR210MXZZR05rbmY3ZU5MS0xWWXBlaWExMSszUXpQVzJxSjZOQ3Y0d1FCdEExWFdQa1RwQVVWbjhoK3dwUExlcnh2OWVmN08rNFBveW9JRk9BN1RCUkNRTzViYU9TdXN2eTlOaVlVOVA1ajhLZzNWLytnUlpzT2pxMVRzbUYwdUxNSjhKai9EdUFiN2tBVmxZeUZXTit1cjVicE5RVG5ZV1dLL1dpMWNSdFRDU0ZRNm9vOElDYnFDYmZhSDZVTkU3WlFYYzFrUUJTVTRycmNUTHRFc0NIcUZRT0NEME5LbC9GdXE4OXF0SDBWMTJvM2ZJT0RYUWppR2Vrck9VdXpkVURra0ZVRkwxUCszeVc1N0tzQ2FMaVFQQW5JdnVENi9CVm40elVyRFdSSDJJbEM3YXdSUlJBQ2M1Y21rL3lienRkZm84aWVpTXdYWUhHZC9ZSlpBZEJ4dWlJNnhlTWxjTzhhYWJEb2FwWFFIc3Rsc3VlY1FyV1o3c3IvT2JRMEJ3OG5keTlya0d1VlIxWXlxR1J0MGk0Q2RZZ2xMdzNwalhEWDZLUXpKUCtwcUJwemhNK09MdTBaOEMvR0xpQzZkSWJ1MDZnQlhIcFlueFVZbnFMd2liR25rVkJ1L2puVWFNckNtd0c1RmlDM2t0UHJOTXRSOVZmWXpkV01IYktoMDhQUjRYYUhCRG9Qd0N0eUsxQ1cxQkR3YVZjTlpYTmo5Y0VhTGhXbVZ6WVFmZ245TVNSWGRNVHY1YUErcEQwUGF4cGkzQkZuKzAwQUpOZ2hKYXI5QUJwd3J1MC9HeG9JWjRMVW1oWWJzZUNWOUdwL1FIKzV5c25NTHNFeEFWYjM4aUF0T2NjcU5td09yOTFCblFET3NJdFZqSmhyYkZLSjcrRm56Q2h1NGlKOEtNeks0TlliRGJMaVBpMG8rc2dpdzlMNzNYM0RCSVN3MGNqaXRuRWNCdDlEdjZZcFVmNkRvQThtangxU05MTDN6d2pBbitJTVhQWFFqRTkrcVFLNkpyUEJpTk1qNnZXYUdjakNGRzJMV09XdFFrZDR2dkhoNUhpZVVqVGtxZ2FlS1J5eDhURzNtd3pSMnN2ZytMK0pVaUFXRVJyTWFlOGJ3dmtkYzd3RFdBS3VZNFBRRkNaVmhSOTNGOUtjQzc2RkVZaWZyN1F6YW4rMk0vT1Q1dEVpLzFPZE82cUxKVGhMNmh2YWt0eGNJTk16OTYwdFdjZGdxNGZRK3hmQmdxOHJDRjFBY0ZZSDZCbFowWjlpK0J0K3ROQktFWWhnb1ZQV1ZuajFLaWJCZHdmZkkydjBuRGRmaFg3dW45SXFyUG5ueDE0MzZneWQ3UHE2QU5VWHoxL0NybFdrNmdOeHB4ckZZMzJPT25VSk5UMDJOSWRFVmpHbmNtbFlvYzE2bE9oczZKdkVvT3RlQVNYaVNmQkgvUWxMZExITUF4eWdNcHp6SndPKzkvS1hHSXp3TGdGSThTdlhBZXF5Rk5kZ2VxWmhnZmFiL3cxbDVwRERMY1E5dkFlUEZOeG9YRDNNU2ZWUy9IWURQa2JFV1VNTmsxTjZWOXVnc3kya3MwNjRxcS8zaFAxSzVnYkZyR25rM25RT3R4Qnc3MWtsTWhJcmNXdXdHbWwyVElUdWJpNDBFVERWNDBiRDZsVWpYTjJLU0k3Y2ZNS0hNWEtYWUtWT2dJZU1SYVRHTHg5RHM4cXQ0dVhucVNwYy9RS204cUY1VjF1TDFNNFBBWjZvVW42TVdKTUpZUEhPaUdieWtJbnptY2dLUkUrSWp0OWJ3cHpmQnh6MkdGVzF6RW4zM3NFT3BQV1RCNHdadm9kT0pwYStmekxoR01aYUZJNTNZR2hweGpTajZIMDZ2cExCbHU3U2ErSVp5U2NuYU1RWHF4bENrdUxYODdIbldnd3RkTDF4R3d3RG9BRE9NRUFPZU5oc0VlTzFFaCttcUVMVVNDbUdMWkFOUjJwNCswdTM4bUszaTNwTmVLVzhlMUdqbUhDMmpOODU1cElXQ2FIcGo0N1JBWjV0SUgzZ3NrUTJ2VmlCeTdYampMRmRKU1N1VEFmVG51aXJ2RnJrNWpWVXA5RUl4RjZrNXo0TWdwWEZYY0NxY0Rubm9IdHpnckRBS0pTeGoyMVppSFVxRHBWTmV5eFAwNFUwRUV5VFV1Ym5IR3hGejVsUndCL0JzeVpDMTN0eSs4MW9HYlBtNlc4c0RUVG91azBUUG9yTWVqYTZDaUVLNUlCaDllUEpvbzVLY2tua2p3ZUI1dStOa3pja1A2cHczWXI4eC9xc0QzQTNicXYxa05qSkdGeVJOL0JwWmNtK0VOclZyZEIrb21hYjdKZndmOXpBUFhWRTZ0UnIrSUhrcmRCUXVienlab3dzVTR3ZGFlTnpDb05BYzBvQ092bEdUOEN3UzNoaU9rNkJNekVMVUk0bFNIanE5VEhQSDB6WERHdmdJdGlrdXo5WHQyR3FxVWtoelNRQ1JOaitGREllbVlOYnZDcklJSW5KYWVoQktSWXcrdFQ4WiswejhJNjhCNHdXMnNvb0VSVTNYWlVndFJBa0pUS2tHb2NKUytuOENYVFVFNng4WFdmVGZLS1R1NEFwTHRtM2N6cDNZdlVZRGc4VjAxWHhiUTRxNzZudFRiR2VoSEIzcnZEdzYxcXVzVVV2T1dIbmZ3Wkl3aUtaQkpxb05jdXdSY29LTG5rTmxGcXhCYkJtdGZtbVpVcjdvZW8vM2RuZDZNd1hIUWswYkdhN0FjUEJrR1lnbkhQMlVaWkd6QVh5eE1uMS9FeTMzbjEyTGlXbVg0SXRWMU0yU1Y0QlRERkpieCs1eG5mN0VvdFpoWW80U1hTNFJHN00wemFsbzh0QzFMMTVEenFheCtxOGtoQWQwQk1ldnZhUWIxQStTWXE3ZXREZ0R6bXgyekdOVHJGMzVkVy9kNVFsTGZnV3kwQmZwMnppdVp5OVJ4dnRBamhMSkFKUEZOWXQ2ZVBZRmVvbEpiUW1pdWpCZmNRUDdLSHNZWHFFdVBRU00vU2I0UEJBRUh4Z0xlaXE1SE50T3RFNCs4dFdaSFJ5aFFtbEFrb2ErQkxKbW9FSFZRSUc4TGF2ZC92NVEvQWViVktrZFo5WnpGb21tbXoxMVNaY3VVc2FPakxDVEhwTWp4NytRazVMZitkeUVkN2tNOGprclJ0SjZkdDBvL3ZrQ2hCNm9EclZTeUNWdk9vaDZJeDRLVEphbUM4K3BuaUtSdzZab0prWWNhZlFmdndlaTA5UHJ3YWlBSGRLeUQ0czdGY1RTdjh2MWFlQjRMc3VJRXo4RnpBaEZLRC9FbzZBOTZSTFowRHgwbmF5ME5Lam5pSVVtUEpGaFhFVE1yaGtPaFVDZGFsMWkzRnM2dDhQcy9lcVhNN3Z1V01zYlowM2s2Ny9tVzhZR0czTmZ3ekxLMHB5UVR3SUdiV1VwU2FYQWh2UDdEa1JueE5JVDVTSUhSNCtvOVVsNkxPV2tiUDJXVlJGcDZ2L0pvZmttU0hiN2F2ZjJJSWNzMTIvQjl4Ym0rd3FOUFlubEorWURJT2JVbXo3NjluaWtYMVorSThSSVdiYXRoMnhVTGg3aHp5YmJnNzRJTDQvbGdNVmxQVUdCcW1UMmExS2JpVjM3dk1BN1R6SXNYZ2NDVVJaSThlazhHbXpCYTgyRDVTVmRZeEI5dDNmT0I5bld2MGo0bGE4YjhORXQxdFhCM3Z1R2hQaVgzWGFsU3BpcEh6YUs5ZUtEUFFxc0o5Q3FoMmhtS1k3QmprVTVScG94cHpQZHNCbU5ab243bVZPWkJhN2srVzRwaUhQUjUyTFJKME0rOTdoMGkza2xnZnVjZWRvOXNicUFabzB4Qmh6bFZlR1QrenlCRkhLTk5PZXJFVzlEYUczbmdLdFNvdTJGKzJZa0xNNWloZ2tyUTJPc3BZa0tZNUdnb1BVZGtwdFkxMGVhMjZyVlR0Z1pZYUJFYVRDZDZneDNQclFGOTd3TG5tWFRCWGxGL2pTVWlwWkt2NU9CWTdNLzZsUXJyVURKTWh5QmtlcytYend4bGJLbDIrVktpZDZLZUo4Rm8yUlFlUVlUbkRkc0JWRVY1RmdKRjlrZWtaS1k2djZ0bjg4UTNiektjOHp2MUlwOXpzSnZMN2FPdXViNER2dU1uSXpNM2NjNFlhV0MrNzlPdUdTdS9NNzRYTXowM1laOTdiT3BsYWZXQ1V6cXBEWXlxV0s1ei8zYW5NcHhlNWc0NWlCbWhYWFkvUkJKV3ExaHpwL2dGdDYxSW9neUhLeUhWWlJqekZhZjgxQ09wZlp3bmtvdktFRE91MzlRSGhXOVoveVF5SHlTY1JRYUpkbHZZcUFsNXRUdXRYSGZZK1QwcnlCWUZBdU9rMGNobFhEVHBFZ0ZjbDlCUFdaUFBleGNxdHlKSW9ybHhhT0Y5a1FQanJDU08xODU2eVJ5Y0NETzhSTGl2a0dVQjRZYVBCZ2Q4R1ZyL0RoUXZxcjZtTDBYODNKODZldjdDUHkzS2hnR2JjQlV3VDczald3Wk1qalE0MmZpcWM3QXFON0NETDRzMU4zUHhzRDNyUklQbVdvUFdqODFtQlJHYmtlekRrNS9aUzk2bGpvbm9MN1E3WFF5OHY5d1VsSWkyaGhNNW5jVElJN1NMQTRmZ0IrMlNmWDlsdkI2cXdvY0JxMGx2OTZITFJhWERIN1IxYzYvOW1RdU84K0FIYU9rWk9QcHRtbC8zZGMyOThTSHNhSVBFd1dYRTVOU202K29TajdwYzF1eVRXRVhsZGlqYVZsSTA2dys0cWVnbmJybE9iOFZyMm5Cdkl1RXU0djYwbEZ3bUd2YzQ1WHlycHNuV2xGL1JrcWdaK05rMGZGZE42RHp3Qk1uM1h1S294ejROWFJhamwxbHhSNHpuVkd3MU1WdkxGa01XU0FIL2FWWFN5dmZ4VEw2YjJTR0pvc2JrUHRsdzhOVWpzdXJVNEFraXErWGNxaHJoOXY0STR4emh6RG1KWkVxN1NhWUJ5NmlIeFNBYmZXZ2FkRmtXS3ZIWG5ZaGxzMmFxTEZMVkRNNWRyTWZsM093MW5NYjFGN2VqTmdTY2pxdFNTZVExSlk3cDJoMlR3YXFBNmEvMEVIckIvUGxkZ1ZZZ2ZIeTFpNldYMUVSV080RmpFOVFLcUpVeG8ydHFXekZoT01MNnh2OVpFOVFFaUU0dURWUVdrWi9KcVVnRWsva0YwV3hLTExVUkFWOFcxekJXSTd2VlYvdThzd0J0UU8rZENTejhObytQVXNERklhTFlrSEhQd3A4TlZxd25DQTFPcWxaYTR5Y1ZwbkF1MXNUV2lMNWxNNnZiM3VkQmVqaHQ3SGkwZ0I2UGhqdDJyb2huYUdYcWRpQndmK2dCMW5PeU1rRStSbWZhYzY4T2lGemdyeG5DZ09SUVpCRkVIdFN6d0VVWW5lMDJyZ2wweCt3VndaZUcvRGE0WC9SZWJBSzBCU21jOG1ZWUxIN2lUYzAxWjh2ZjQvRFc5MUs4c3EzTkNlNG9SSHVuUHZJcUwwSGE5NllrNVkrS3VhT1hMek5GLzNJcXFsTWFxSG9MOWh1Y2R6Q2JDZC9lUnJFZDhycGZ6S0N3cml4dytKd3FndzJKNURoK1MvNVBzU0RHekl1WkZBbURSbW00S2ZjVXVxQTlpUVF0M2dxZ2pwTFd3OGRxS0xOTjZoR244cmN6N2NHTndrd2U3UmdYUmtKQWhZWHI4ZVlkSnJsSVpLWExFWTVXMGMzc0E2ekpxWENrbW5GcTAyVk1yRVkzZVhkcFdHLzJVQndtVUVYNlh5SjVtWnVOM0lmZ0o1eEZRN2FneXBmYkRDNHhrUlpqK1ROS3N3Z29LSURsN1l1NFE2VWc5aGVBS1NiclZLMzU4QXlKTnloZDlGN2M3YTBKL1RzRnNobXdoai9hekkrV3FXM1FmeG5Gd3BQWjg1clVPM1JpeXBkNjl4RDdHbHhrUVVzdWRLZ3MrQkExVmtxYlY4WW5NbkJnUkRtT2w3eWN4U1dSTWdvT28wYmV3RG1pM1ZMaS8xZG14TkxURnB1cTF2ZHNvRys5aHhSUTdvQVk4bDlkaktYN2VsRjZHdGRZSUdya2tvUGlaRkpPTFlRb29EaEk3dk1PTllyT2tIOWZqd0VXY1RKaWg4QjJqUVk5YXFIRm4vNWx5aVpPektNaFZaWFFtZ1U2VFV2bzVWa1Zac2NzMTlLcmEwR1JhalVkVlgxOCtOZjlpVVZqNXpxUmFENjhKZW5ESndMb1l3MHVtRXBRdTd1NWppV2x2enFZZ0F6WWx3elhXZXZONUIxZEJEUDZkY0NGeWRlUGNvNjdxYmhqTU9NdDdrSWdlZlIxMVROZHFNaFJyT3dXYkZISGZEVVNXNmE2KytZamdMWjlGWGVBMzZTWFNPaGhoNjcycGg0VWFNQzZXZlpJcHRHTkxzR1F6Z0dDVXp5N3JZSXU1T2JqcjMrcUhQTHFxTGsxb0hHZFJZbVdMdjF2RmNpTXY5Tnc0VjdIZHJwaitRK1QvaEpvd1VLTXFHK2U3c3JSOXRRMXZ1QThPUm9GZ3BrV0I4N0J0NHlxVmh5NU9GQ2gyNXlGRFVxZVVnY01XaE1BYXZVcWFuRWFNdW83VjNwUnY5L0pPNjBMS3U3M05LUllEZ3E5Qm1iTkh1dEZqRUtiNDVBdmV2Z1FTazNHUXpIdUVWSW1rZEt3Uk0yMFhuc1dKQVgrdzNtakN6RVk5eHl1NTlzVHNWc00zMTZoVU40ZE5FNVNUWjF1d21neFVWazI5TkFQZzc5Z1FrWXVSSGt1M3hJWGFBVTZSVDROYnFIYy9rQ3BGTjhYQk9YazAzdkc3S2plZ2ozYnNTb2RZZTVMbHZPem42d2phSFBYdmNaNFNxaW5rcGN6dHV0a1lHSnlESmpKZVZDYUcrZzhRZWkrb0MzTWt6cm5VU1R2RTBzcGtlQVlnbnI4UkJLdDIvaDh5a2dQODFiOHY2Nko3elFPRzFIUHFkVHJjaHJTNEtlakhjYVVFMzBFQWt5eTVlSkMvMGp6N0Vkc1pseHJNSWhDNURDSE95MmRrdHRGakNIaEJ6cytqNmhDRFlhMnNWVjBUMFhFUEw3K1JWRjJDOVFEalFLZElBV1J2bjRhcjNYQUNuU1JZYVkzL0Urd3duTHNKWlo4ZENWaTBUOFVZdEpvTTBDK0pvVld0TmljdVNJWEZOeWxoREVYY05oSC9MOFJBOWN4TXBRa2lzbHIwT3ZEWVMrQmlYMWRXM21TcjVHNjhTN25aa05MR1Y5RElWNHhYZ0lkMFFybUxRLzJxeWhtVXFlQkZOek9TK0VWR0lOeVFzU3lYVmUvSWd3L016NFdvTkdxS0IrQ3FyOTA0UWRROU0yVHZDVVBmaFRQTmF0bHczVkFGWnBjcU0xaVJkTDJRMXkvSlRDMTJOUlpkVE9ncWsvTG9aUUljaldZT1RzQTltdG1udGlqQ3dld3NTUFJzVWJuUzVYdUJpT1FSeGZaQWdXY0ZnQ0VLWit0Y2dnK1B4NXpkMlFra3ZxWnVobmZjRHVHSWFqdEN3RlVscHY1cDJjUmtKQXRMUGtTR09VWnl4OG1BU2I5YnREdDExMFF0WStFMXJNZzFMeVpya2g1YWdzMjNFVWVHU0ZSd1huK3dpTHFxcTU3aHk3NUtsMVhQS0hMNWprU0s1S2JBbTIvSWloSnd0dW5lSVZ5TkxDRE1MQzArM2tmZi9LSlVNcTV1eFFjdXIzbC91eWJuOGwveVc5YXB0OHk4WjJRcTBNVlBPMW40NW5BTk4wL0RjUDBUQm5UdFhjVEJxQlUwTGIwOWQ1WngzR3A4MmdmbW5tWHpwRVpQRWdNZDJTcEY2WFlsNXp2S0pGNU5qVi9XbTBjY1JCellaMWtDdjRVSjZpeW93dDA5UG13RnhKcG45QS82aWdiaTJzcDNYQ2dCajJ2aTVEeU51YnhIMk1Yb0VkU2JQN2xKSmxFNlBUd3F2VnBrT3d3c1c3a1VnVUtYVUx4NjJISFE3N0RxOXJmOFlzN0FUSnNVcWZZYXFRam9xaU5BdlhCSnJ1ekx6S0RTbU9wanV3aDVDQjZOWU1FenJiUkFWZTl0cksvSXdlOTJ6MmgzQXhsSFJRWVZ2RTRJT2cvbVBDaEMzNDVnTDVsb2JmaVpiVmxraFozcDdVMnZJaFpKMm9NRGJxbzBzT1U2cjI4bjNkdFZ3ZTlUZEFrZ1VISWNuNEFZejEwdXZZZGh4NGZZVS90UmpmNjc3NzVDZ0t2dDdwVnE5aGl0cXFKYmc4NEUzdWJBemd2OTVXZHUydUd3eEJRT3RpLzdaVTVqajlZNHlldnVWWitKWWRGUWYzZHREdlNSam5kYjduSUt4NlU2K1FacGZFU1QyUWhOVXhPakIrekYvSENLeS93dVFLNTgvdHRsbjVGNmVsSGRGU3p1clNWL2VqWUxZNWFjenJZNkc0cXVnT3dTOWlTVHFab0M3WFhVUTFtWWQrT2d0bmdaTmtGQUsxNUhYR1oyckJNNTBHdy8ySkN4dUt6cTdNK0FCNFdaM0plQy9vMy9SWlNsUzZOQU9VektQVmhkQmhJMjgwS09Xb0VpNU83dUZWb04vSEJhVk02dlNWQTgyTDJPWmpNOTdTZC9RVllIUmFMRkVkUnZkU005dEV2MS8rRWtMRnA5UjRKU1Uvb1d1SVF3YUFlRytGelMyd0N3dU9vSVZKamFhUU1aUGtuWmFGVDBoYWVVSWgxS3B1WXZ5YjVUaE92YWpSWG5pS2dRS2cxWXRHcE4vQWVRSGo5UTc3NXdFd2NDR0ZrUkFMT1Nta2hnMjBtV0JLZTZjZUJHRFh0TmlaakE5NmZ3WVkxQ3k5WEJGOXRoMHdoQldzaGNiYUZaY0xsdmlGZjA4Mkx1TVVud0hxZHdJUGtBS2NkWVdYdEpzMjFmQWFKOTBjaWgvQ3JwaXpUdkMxQlZJWkdKbzNDWjY4UEpTSWpIL1FrWW4vUklIYzhkL3NTMVNvbzVKVCtkb3ZqdXV1ZzFiSWpKTzh0N1lidUVBanowVFl1V1FZelRPV2VhZmZJSHYxc1JySGNBSENWYkQ1bjl5a0dGTHEyZnFCQ3RIckl0cHBmaGUzNFVrLy9BRFZ0Y0ZTSU1jMlh4amQzUnVCTzdTc0xTYnpZeXFwOEFNTzc5RFZZWnlEOHZhQ0tOdEYwcWZYdGhyNWp4NFZ1aEt1VGI0YlhKNUR3K3BCajBmV2l6ejlvUlhZYnp5bjc2VElaaEtBSmFtOGVsWE5qWnY5UU5hMXdydlM1cWZZQXZjQ3pEbEdMZFp0ODhrZXRiUnlWcmxpRWJoU1BvNGZDUkNmNUxONGQ2Y09vZGM2a3Q1L3JORElZV0Q4eE5FQnhOQ2wzbU9hZ3FKYU1TY3lrOXIyTTN1ZWdHRjJwU3htSWRtcEtYb0NZdE81NjdBc3ViTkEvYS80dklzQWJOSFIvRWxwTDUxMFJDbVp6N0RaV3ZhWnZTYUpreGdjRXcyb2tIcWV5NU9Xanh3RG0yd1cxNW80NGFpeTJEaUpUbjJETmpkdUx6Q3lHNHI0bXF0SXAwZ1E2L2lrYndMVnVMUHlzTzFUYjYxekRyNTlnQUovK2R0am9oMFhsUDNtQkNvZHAycGlJWTVpWUQzWEZLV3Q3T0YvS3VnYWVhdDAzYTltYlg3TitNZjRxZEV2Rlg3Tlg3UkpMcWp5SFltWHA5cll3Y1dkdUVLQyt2M3prS1pnWGFqVkFqZXVEenFMSTNFOHdSMmZIczByZ01ydkkxUWR3M0dvWjRlN0l4SUZxdWVGSDFSTWVuMStEYlpsZzgyR3puWnMwL21zZnVQYm9KSVRJZUhnbWduUkZOOStWdjFRRUdRdURhbEpab0xXWlFMVytlbTBvNXdWN0Z1N0g3a0ladktmVUxkeXVvUDh3RktEejE2QnZOWkEvZG9oa2xXNHBRRlFHRlhSTkJXWUZtb0NyVGNKS3lkUkYwYVVPSWRVelBuUS9HanlEbEZ3cGNvOTc5TEdYdWU3NTBENWxhaDl6OTU3K04rcVdlZjgzUGRhSGZ1aTFZTXg2OXN6N2J4bFdDVmc3VjU1SVovbUdrV0hkWmhsNU9MMmZBVHRLMGpaamZyQVNKTUlKb1ZBdTlVeWJQZWtmNXg4ZXdrMW93azVXVGJhbkR2V044Q1FnVnFFRjZXblZ2dURMaThEazIwdkhCeXFGQ0VZeHNpZHo2Uk9EKzBPdVFVaDJHbjNNbWoreGhuZTcydGpFU1FvNitzcGFhTitydTRQWkp6V09WbG5wNXRYSnM4dmpzVUdETzFaL1lUZzkvcTFLaDlaSkphUEM2REdEbE9rbEo3RjdGWUhDOWpUTFpMSGthMUtRTms5TmpxZlBablZOUG56cDlyYkM5TTFFNEFzTW9CYldEWGw0bS9aN095bmFkWW9HWTNibGVpNFpWWm56RWZVcThEMWY5TUpZRVRtV3AxWFp1YmZjTFV0L2Y0VUh6dDMrMFFOaVFSTnk1Vmw1bEVoQXpZVWJBSGkzMFZXOER2S3g3dlU1ejJmRTBKSU9UdjZlZXJHek1vK3Z6WnFaUjlXMG5jbytEMmJ2RWxoMVVSbmt3cjVMbFp3T0JqMUQ3RncvRlRwNFFyR0ErdHFMYmcwY0JVeHlPSS9tYWQ0ZkpqT0R4Ni8xV3hVR1JZQUtYcENBSFlDZTBvaEFWREIrQm11QlRoSEF6eFdqZ3JGS1pCb1l3Yk9udUkzY1BrMXZ1RHRYQlVZV3BjMmFtMmwyVEVvcTlva0lXekMyM1NZZzA4YkN5ZG5iZ0NWcWMrdTVPTU1NTjZWVGJiYkFRNnBIclpJMExCeVNpNmFrVmVCUUE0NFZpSXpFOFFwNzk2OUlDR1hUdUs4SmNPN2F2RGlCMmJtRGFJa2tvRWJUbk9vOEYwcUN5dlZ4bUN3UGxpR2Z1WHlqYjUrM0VXY0xJWDZiR1RodjRKZ0lMSHhOVmEzQWozTDVLY0FYcWpubHVVSDBhZlprbXJPbHlyN3NWTktINWxFUkNjVmFWSERRQXFyQVRuUjBmR1dRTDRsSk9scWJMc0lTY2hoK3liNEFlclVvT08zYnYxR213eHIxc01qTFdzVWtNNXdLTklZRE4yUVdBcDRlT05SZUhqMzhuL1VvZEF5V0hjR0JnQms5WkdJdkd0VmlRN0tHZ0Z1ZWFVWW5MT2JsMFZUbEt5NUM5OVRZNlM0VFI3U2NCdkpxYmhRdW1EQXQwRGRZRUJKY1RpUnpGTXlLQ1hEeHgwTEgyRnFpRE1uSk9VT3NmeDZqWG9iUWhSZFZPLzR5aWx1MWx2c1ducEUvdnpNWXRmcS90RVFlR1Rsb2w0b1puVnJQQ2VROVdiUXVoOHZTeDB6L1FJdktJakVuMElNYmhWcDlldDFWd2h0amNmZ0NxOGs2RzNmY2JVMzhmalpFS09hNlRUam82dXNpc3RCUktJRHkxODg4Um1ld3VMNTJWZUQxSWFjRWIzbnJmSGloYjJJYlpITHNjamZ4Zjl4UVg1LzlZY3llRFA3Q0dQTWlCemViN2FwV3hYUnJsbWNNQjdmcWUxY3lUTTRaSmJYeXlmRVNkcm5zUjM1cXM0aGtoZGJUZk9KM2s1bm93cDF3VFEyZUxobDFWNUdGK1BUVHN4K0ZJUWo2NlJ4UVV3TXJ0VzcvY1VNcEwxVm5zUDJ5SXhiWkR1ejAyc1VNQjRBYlBkZHR4NnlLL3pYR1ZPeE5iVDZsS3BFaHFacSt3Y2hvaU1ZbDBGZDFFSUZhVm0zTmdXUURQRVh5clA0ZWQ1dzRqMy82OUtGYjEvQTh1YnhHci8wVzdEZzRjMjN5MkozSXIrOVVmeithRU5SUit3NGkwTnNzMy9rZGtHOUFBZkJxMW1GcnBBUjlsL1pQQmk3VWhxYlBkUEJNODE1WmYvaDNZUWlrdE81US8yRWw1Q3ViSkorMjZhSzltblhFMEJydlNHcEtwVW1pNWhEN0R5YXRwbnphZ09uc0orbXBSMUN4L29SZnpyNTJvbUFZN05MT1U5ZGlVTTN2T2FUb1lQVWp1UjJxb0Ezd1c4ZkRSVjVndTdtNUtrd2phUEJ3OUJvejY4TlpwZ213TzkyQk5GcGR0em82YkZJSlR0cWt2SkczblBHV2NEMklMQ2dCeDllYmkyemJGcUhJR3RWK1RqUEwydDZpLzNBSWJ4Y2Q3b2g1aW1vNjA5eVBRMTczK2g5dzJ3Q3poYll3R3ZqVDJwQTBSVzRrQXk1TmVHeTFZNllnNHgrMjdndU9oNXMzM2poMHBwcHBtYVowRXhvYSsyNWM5S3JZc29oaTYzSHdmVFhaNHVaMG1BazRqOHhJQ1RJeVcyR09QMXNrVzlWSU0wdkZoK3pmSVV3QmtONVdOQjh3dlozczJOZHFpb2VZbFlNc05keXYyaHQ4ZVZUZHhJZWFzYTM4ejlpOFhHZW1vTjloSXR1WTU0WU5BQW51R3B3T3VyLzBHeXBlUm9VcDlKVHNJNXpEaTQvaHZYenlkaUpRYjRxMlRmWW5ZWUI0YWFrZFVqZ1EwQjhtVFN6eVh5UEo5UEl6MENSOFBjZjF3V3ZmeEMxM2NNQU5sU0lUU0s3TzFOMHNHbUNqUWJseWRpVVVqZmZuNzlRZDBnQXdJZ0dQUkFLaFJURG5zOXQ4ZVVBa2hPWXpLQXhaSkYxSTF6TXFFRUJyZEhKZEhlUm5uQWVCODRha2RsTTU3K0NFU3ZDczB0aVlKL0FSdmZGdUJwc3UyZEJyTTBabXhvaS9RU1BjbThxVy9YT3RsVFYyUjFxV3MwVkZROU5aOEdtMy9Yc2ViK2YyZkF5ZTZNeDFVTzIxTEdRWFhLMWYxZFpFUTlCcnUrcDMrb0tPUzMvemFhZjE2U28yd0hNczdOeVI0UUhJYVVFdVhXN2EyM0c4Y3RZdjJRL0prb2sxdFNZK2NVbDgrT29ZZkg2WDNmNmFQb2NJcGw3VHE5MWFnd1o5T0RORkV2WU5sWTJGU2tzTW8yb1oxNnNPSXQ5aDNaRUorQ3o4dXJmWi9lQUlkQ2RLUnl6M1BxWXk0d3UreXR3QU1qWk9wRndMSklwR3FEcTRvQTVhYUVsWmVhclVhRVprVnZGa3VzK1lxYnB4L0lJajBIelRRM1owaWZlcXRCeDE3Z0pSbEtsbTZKWU85YlJ3NUdPTG5ISkY1VkQybFpPZFRGOHplM3d2L01wRXdpb1BrczNtcUo1ZnRuaCt2aktVWXlOSVIyaGdHdFBHV1JkaUxMRzFTbUJJUjZFbkZxMGVBU1FPeUhXbmp4YjFoRWowS05HUTcreWNnK3Y4VkxZdUpCU2Rsc1JsN25wcW1HcEd4SmRQVjFzZ2pYb0pIOEUyakU0NlFqTVNwL2l4ZklEN3NtZGhPRjVQUUNnTDdJdnREZmN0RUtqalY4UzlPV0U2VXVnMWE2aXlOTnZvbENFYWtOL1pBWHVNWUR0eDlDSWJDNkJtbmwzUVd1VDd6ZUJabDVKa1dGS1NhNDg1d082elpMN2hBRDYrc2lPYTAvWjNqMldiZ2dETjFsT3lRQjkvZVVsRmFvcEpvYXNudXBUdE1QOGdKUWNOZENWVXliMVJxbUpSRE1sM0lHZE0xdk1sam42eU5mODJ4cWhzdHRFQUhGSE5XNk1Eci9CYTllbDFOZDE2WXVQU3FDcXhjMWdyUGp4SUxLdTVxMkM4TWJRdzF2cFd1eDBFMlJiNThLOGVYVGxUUjEyaVJPNkI1cUFLTDlvUVRsQXE0UksyVXFpRmtGU1V0azhlUGovZVpYczF5ZkxSbUpzMUl0akZRbnAvQ2NzQzRVY0I5NGg5MVBIeFdXTEVCbHFZNXkyZ0N1YzFDK1dDQ0M2ZDc0RXFEUzc3TDlpdnRDc0hRY1JENVI1bVlJTWhXWTdqS3dUS3FFTTh5UXJseGo0VFhSODVCN1Z5REpRTm9DdkFNQ3BaTW9jUzZOODV5c3Q1OEdtS2N0ZG5qOUhlSTRHOFZvTm1oZXEzc3U1aTluRFd6VTVnVkhmdjlScjFIQWVVUU9sTGgxYzljOUh1c2pDaUtUcS9aUkNkd2V0K0VHWFl1eVJMYmdsYWxmUEQ1aVpTc1dCbE81WFJvNXZabGpWdHNOdGsva01pem1hRHAwa3ZReEwyN3BFcHNjTUY0RERoRFk3cmtZSTRVMk0vMmZFTjlCdmZxY1ZZZlc5aWR6cDZ3NzI4RkFWYXVLTHM0VGV1NWdLNExLbjE1Sk51OTlRN2pMWE9rT3hKdS9uc0ZEei9Nd2NpYUJhb3FHK3l0bnVPbUxDRFlwNFdYRTc1Z2FHQTkwZzBBQjRtNGh6OEJDeGU3NjljblR4bTkzVlkxWWZaSVFNeGJiZElCeXp2ay9mSVE1QThuenl0aEpka2ZINXNMM01GRnVUUUlzMjlObkdreVFHei9IVDh4NXR0WFBnRDJmbFVXR2IyaXVxaC8zajBydjVrTkpxRVJVZXArMmZUTWVScTZGMWFWSmgyZ2c5d2xTYmhhUUNXVGVvQmhVRFhQeVVtTmVmTTVQQk1sMXAwUFFWL3JEcEpxeThnNWEyaDJvb0xBaW9iN1V4OEpKU25nTTlibE9uWW41cTRjQ09OZTM2a2tUTklZSGNjaWdVdnplVTU3TXcrMHprM2R1QmFNRzBMZzMxM2UweE4wVFVoN2NaamM5TnhkemgwRm9uWUF5UUgva2YrNWNGY1I0SGdGd0Z1azVYQm5mNVVKRHI2dW1STVF2NVZvUnVDNHJ5SVYyay9xdkRHbkVrc2NVLzFudUE5aWdpZEJWSDZWZkhzMXJmN0h5TTFPc1NYSzZIemNLQlNPK3NWSHU4R1UvSEJnaStLTmp4L0I2UkxtdWZZTExvcHB3d05kT25TZGh5MmpONDhIcjFLd3hla2N3Z0wxUzB6RzRIS25tMGFadHBEKzVXQi9QTzIvVnUvNk90SzcwclkySCtUTElXV1BreTF4MVdGOVN5T1lzeWJ4a2FBeFNiZFZLcEZrQ3UwYWtIUllYR1pHQTJHSTNyamp4cEdCc0tWVEw4Zmt1ZWVkWjBHWTVyaFp3VXVhYWU3MHhDQ3FmN1k3YWxFSFhEeSs0Qnp1R2hTbHR6eGFpZFBXUnd3VjJNM3hxMWtKWlRmWFZEbHJnZkQ1eERhZSsrZmNiL0F0YVdHdURhT1pIR3JnQy93Y0tlUHJLSUZPeE9rSmhyVXN1aEVWNEpNK082RHkzc1dFcFdhRWdieS9IK2lsQzdtbmdtakxpd2JhZ1I0Y2tIYzltWFN6a21rajJVcm1jMUxuU01zTkNOem9aYTdHVEQyRC85SmJNMVdmQ0VXcTZrdDZTaGhwcmhpZnovTHhZcHE1VWRBa3I4cnRNZnlRWVFrcVF2MTlBZmJMdUliY3hna0lweHU4aG02ZC90T2RDSFpmb3pRRU14d0kyczkrS2VIS29rNEJoaHdMa0VwdU5uUGQwNmdiMUc5RjVuVUo5MStuYnRkczVVbENEQjF0RWU0TGU1VmpqTXdIS05waHQ1UHlEQ1VqNnB6YTY5ZzRKcjBBaURwanFkR3NpbFNiOE1FMll2bGdNZEwwV1BPZGcybGlVZTQ2YWQzR3BYVEIxTFVmQnYxU0llMklOOVNLQ1I3MTZVMzN1T3NPNDE0bGxVVGViK0xKQUthSUVFNUcxc2RPN0tJeHRIUEZUZ0VBL1BvUnAzSjRZUHRQSWhQaUpqOG1SVHB1a2czb2JSQ1gzbnFyRlo3bTBBcFhSTmZhZjY0ZVhQb29KblZCemlrYVVlMkttM1FWYVVmd0NMczVYWDl2Uk9yZVQrQ2hBTm9lQ1NnM0haaFN4TUFZTmVraFl5UGhlWW03c3J2NTlxR0Q2NVdoV25yZXpQb0VvUUQ4WnAzZ1U0UExEcGJ2MHVHek5aZDl4ZFB4VVYvbEc1Q05YYXN2MExZYUhFZTQvajI1c0YxS29oQVFHeTllTjBORTUvMXFmWW5ZeHRCVVRPcmMrMHNQcml3VzZiNnY1dFpSK3R2V3phTTJPQ0tvMkF5TnZ4bkNneGMxWUFvTlFRRDZrTUFuSG03Vm9qb3dTeEw1b0hzVXY1QURVbjRtOE1ZS3lsZzAwRlRWdHlGbFV5VFF1dmRXWk9VNHhiVyttWHdVRTVQTzRXYld2SHFaRFNZazI1Tm40eDhqYy9mOS9KbE52cjJkUzdiVlpTOFlvQXZYcjVWTmZSTXFDSUU4ZFRIc3RaVjBxQUYrdEZUUUZ4VjFGQjhuWTRNK3BubkR4MUZqNGZQSGl3M3cvR3VmanRDQ0x3THZqZ1podVVKeGpsT0tOR1pRVGl3ZVFqNDBuM0JHSUdTdHp6TFhUdUpQQWpJdTJQMmRBblFrRUYrL1U1OTA2QldqeWVHTHJYVG9WSzVVSjlEUU0wUnBqdVVjZEdSZ2F5TDl0Yjdza3hoWFJjekpXYUFyNTVNZEE4clQwSUh5R0lLWmhJTXg4NTd3SHc3aG1xdy92eTM1VTVLek9IZFk0SWozdVFtSnhQcFpyYi9TdEhoUkQyYSt0b0ZZUnJpSExJMzF1bmpwN3R5TjBMSzdDK2h3VVg0KzBTMHZyR2szTTRVQU9SajVLU050OWtRUnNPWEhlUUJHVTd6Nng3UWdUTUFEYWMwY0tHVnpuR2pFQ0ZWSEVGNzNJUWNQZktHempiak81U1FuUlpMRm1KWlNjQVRpUjZYRnBZWHRSb3UwVzBJVEVaRXFzTi9yTm5sM1QrcWpiR1I2MGttdlhHaGdjMEFMRW1hTThGMXh2VXJQd2xjVk5xZ0djWWZXbktnUUhuTjBwdUlzZS8rQnhVemVlQlhmcWJrUGpMYytYenVpNjYzMEQyMlZMaE9EM21YY0NJdTMwcmdBVG5LSlo0bXZ6MHZvT1FtWjFGTWJUOCsvMFowWnV6UTUwU3JNUW45Znc1T1lIai9EQU0zRFIvd2wzOEZNcXkxY2FGc1hwdm14cTVsUnZRU0ZSWno3U1NpMG1TSUZCb294VEVaV2tWZ2k0dlRIQnBpY3B1WWF0U0tYYTZTckJCbTBacXkvTCs4R01GQkhlZTJadGNiZGl1WmxEYXRQTW4wM0J3UzhyQ1hXb3Vqem5tNUZWQUpuOW5DM2ZqdU1jYWNMZDE3NVlvaDVkM3c0SXFkU0lhQnVsbEdyTjZuYjRBQXRGdHFDa3JyZGR2b1IyUjZpT3ZoR2ZkWWxxbDgyTzluVXJ2MWJiSTMxMHNCZU9TV3czdE5vSXRjQ0szaDJZNjdQVEZndzROZmRTSmpLTHg5T21zcXNDRk42cXRBM3FjUjRwUXJqOVh5b3hPNTliVU04amZWdmVMUFJLSDAya3RrKzNYR2dKcjJOMlFGM0N5V3BtcStvN01nSVFoVzFPMHFwZTRsVCtmdit0N01HN09Id00vcHpmemhTK0lPRG8zdTZsempFd0h6bnlFZkFWWlNzaTF1Uml6VXRNS1BTMTk4M3A3cFI1TlNadXNvRHRobmFIVjc0OUZFMDFjdElQOCs3Zkk2c0JOUFgrYWdGYUtHNWg1VGUyQVBlbGlCODVEMjY1RUJWV3duWnBTZ1ZmSXFsUExSYlJ2bTBXcW5ZdUNUdDRBcFcxUVpBMHRIKzc2cC9jd09NOXYyR2V2V0pvMGxOMTJLQXBWN0FXTGpqUlhHSmhSR2VualJpK3JtcjVtVUJmajZqK0VHWVIybVNJTHlEN25rL3hsYXdweFFZMzEyeG5BWEJKRjUyQ0k2RHQyVWo0N3cyQWVkU0h3aFUxRjdJbHNpSW9seklmOFRzZ0dNbjhZdXR1T3UvdG5oVGlMY2JnT2k2bHJFY3JwSFFueW1xaEdWOU5GcVN2OXZVSEQ4R0prUWNmbVp0MW1YVnJVTXlFZzNlL0pyVVNTNHI1c2FCTkVPWXE2dmwxbjljbEZVZ1U3OGYyYkp0RGhGc3lGSEhvSXZjM1dEWlNNUHBLRzkrUlE4cDZSMzB3ZjQyVjJTYW1lOEpuWnM4Sm54UXVCanVmd1lyRFRPTlJ2WDdWeXVCODdkdFh3Vmw1R1JOMWg4L0ttSnYxWDZQNms4bnJwdTBlbitkSzNGbFEzdkRyT3JRQ0hTOW9DSTZDNzAyYzAxTFdFTkVNVzE1SEVzeUN5eVF6RlBmRTdIMkt2cXUxdWc4WU9jY1g1RjBjem4venRnTjZ3ZG9lb05BVWc1T2JPbjFJNit5YnM5V0ljc1ZUL2xUOEMzLzJvMTJkUmdrL25YUHlwOThya3Q0VVhVVm1UalVpUG9oQnY1MkZzM1RCVjNFVm1yZStsZ1MvdERGektYcUxmaVhkNzBXaTBkU1libDJnMkxudFAydDFBeHErTm5WOXU5WUlYTVBDbFJReDVmQ1JqMFFyYWt3VmhLMnoraCt6S2k0Z2lGZlhNNEw4NHFUaXJpNzVmOUZzb0V3K0ZPMFZFQXNTM2dlZzFXM1VwTUVwcWFsWmtSbW54UEhSZWwxOHJDY1RiQXpQdWRRTE5OK1p4d0VLSGhvakVEeDVjSDNyK2s5WDNzYnBTdkQ5RC9aZWhVVFhwU0NMQjc2MVVYWENSU1hxa2JBZHhlOFJOUGZvWjRsMFhnQlZ6NzcrcHI1TUZ5Zy93a20yVnFKTmFpUERjdUFYVXpwMTVRQlQ1Wk1jRys4eXJ1Y3RiSVM2K2xFb0NaSElFRjc0aGxMWGtremY5Uyt5VEwxMVZXZlFVc1lrK0xHQS9SWExiVzZBR012YmJiYmExU0luTS8yWTd3WG96cnRzM1FRMEI3WXJqYkVZR3M1YzR2cFhjQ0RsaCttMFk2S3VVVEhFb29ad1VNa1RzeENFbjV1SjJFUFppZHN6d1htMlVBNzlXNklMNHFuL09JNDNYakZGYS80akcyYmFnaTk4K2NLSGtLbTFHK0YyTHJxNjlXTWtPZ0hRQ0ZPY0NPQmFoY3h0RnN4ck5wQzNMTzZqZENrWWtOd21OZjhKOTFTQTZvSm1Pam9RTzhvVC90TTV5YVpkTCt4QjBTdXpRUmorZklLZzdoOWVCRlBmbWtjYkpza0FSdHFrYW40dWd1K2Roa0lUTXQzdzJyQnBVWjVwdXpzM2grWkpERVhqenBnVDRXYnpZMzAxdHBmNjI3ZHBjdWkveUMzRmVGVUczY3p4Wk9wazExWEdjWTFPcWZiUnh3NHR5OVYzS3psaVNiNTdaRFBjZEdxNGJkS1BMaEVicGNCSmlqUm4rUWVmVXl5ZHlEdnVYMXlMb210cWNRa1lZMDZyS0s2Ky9BMzRXMFpHZjk2ZGF5V2RJSTI4Y2J2QksxYlVmN1FjUjgwSVRSbFJKOHM4N2xPUUxxM1I3UEprTmxyRkFYMDhQeDBrU2xiRk13OWx0SEFhWG45SXNIR1Z4VWc1OWFTN2JJajgyMWJrWGp0KzMrT2RwK3JadnhVVXk4dE1INUFySnJZSW1zM0FQOWZaNHFwaWlPczE2OUdGa3FyVmRIM2V1WFpIWkdyZWh0NzJkMDNlZ1JpU21ZcE5iUHI2VzJGR0NFSmZMVzFPdjRuRjhTUDYzNGZQNzlUbXZHWldrQlhiMEpVcXJhaUdrVVREZmdLaDRXMVlNcXFqNnJqc3VDZFVkcWNlQUUwUTFXbmlLb0MxR3lsTnlsM2VwcFYra3c1TncxaUlMWVVBV0ZVbHpHa1BsT2FjTzAvZllac1FDSVZoQ0JDbVlBZnR5R2JzZENZVll5YXcvT1RzMUcyWCs4UG9yUEdPVHc4a0hqeFVUUnlPNTRBZUFlQUM4Q2xSdWNEWndodXl5VmRqQnZNb2NqNVpqd1I3ZTI3WFNqWjdJVlJ3djEzRWtXTU4vbno3UjZMNENBZ0lDQWdJQ0E4ZjIvU0IvdCtpcy9aOXViK3o2OTcvYjlNSCt6M0IrYjdmcE4vMFBvM3I3ZnRHcjdQcnE5KzM2YUQ5dnUrY1A3UG9aLzIrLzUrMzdDWDl2MU9mZlY5RWYrMzJZdzZiNExxaCtwcGw1cUVzRmcxZ0xwR3NTRWxWMkNTMVZpR1pjUEVlVUtDdjlaaE9TRE9KUDZUaWJEeUlvcmdMNW4wcU1Yb0NWQ1VvU3AraUZOeEphSUphaVZLZE1vUWRRWEIxblFUT2lMcHZMTmltTjVoTVd4SklVWDdkeGc4T25Ib2dnOU1zYVQ2TFU1bXhaWWxGZElVZHJUZmRzQjhjTVYxK1pWWGg0TUN6a2x0d3F5VWhUZjJjZjd3dERPQU1Kc2IxUHFkMkNESWhxNzByZmpqb2lCcE91YjAwNWFEZzRuZGV2Q2pQbCtvK2JPU3QvY2xhTHg1RWVCYW1SME15b3NBTDdUY08wUUZFY2RaR1N3RXNUN0lmZk5zUnZMYncyOEFsV2tGSEZ3VXRWejVQSktDQ2tKQzhtL2JMS3c3YTRrM2plZ2JQVVRUa1FzazF0VUZCdDZYVGtINElNajdpSlBGYkh0aXhzb1Z5NC9TM2RMVkMzSHFXM0I5TnVXWWJ1ckVZV2lSOUFpUWZieGVEZEZ3R0xHNW5QQm1FcnpveDZJc3FMNm4zUExNZDhxZ2pFM1Jxc2ZVTlpPUWdsYXNVNmZta2t2U2pmOEUzTS9UWlRFVTQ1cENEK056TEJlY3pPWG9rdExtQXd2L0Rqa0lDMUVOWHBEcHNhbkhaQ1BYbU1vTFNheENXRCtpNFpjcWhIZmttaXZ0UXEvdks5a3RVdFIxSDlyd25tM1hPNyt4a0pHNkpob1AzbzVHS05pemkrVXFmTXJEN05BeXQwNzVOUWdOU1l1c2RYcjloZDVmQ0o2QVV4QWx1bU1tczk0eG5LMnFjUWoxTFkyUUNmeHpLRnhrd1FsN2Y4WVpIQzZ1RVI0b1ZOTDR4aUZIUWc1OGpSdlVnVzVjTnpkeVFsRVZ6RU9RTGRtVnhvaGNhZnJCMURoU0RkcFpWMW9UM3hUTjlBYWloRFBBcVNwWmpZUkZCbXl2SDluM0xwZGdEQVg1ZzRsckFsYzlOeUk1d0JiQlpYSzBjOCtCWksza3BpV2kwZ2VBNmg4cDYvUUVXaUs4QVhXRzFSUlR0d1dXZmxSczdxOFRCWGlwKzRRc21uL1NPekt4MlI4SWdERlRhdWloQW9Wak9GUy8xR05jaWhKd1UvVlk1NHd0akw1aEtJMDFuWndHYXhGemd1WXVsa2hvUUlrYVlIa0tNZTJDR3dWREFlTFZwNVhOWlpLNFFzcStrSHRJcHRoRGhhd3pRcm4xYnVyeTI4ZkJUcmhNWWZNWWhBS1BQaUJhaDJYc3NvbTczaVBTVzRZQTRKaDBYNkY3S1pLRHZ5YkpzdHJzNGl4eGJkQS9WRlRKRzlRVzFRK2JVdEJGclF3anNmaUoycU1lT3NpVjl6NFk5WCt2ckE1SHQzZzdCUDlBcVMxclFGZFJYMzNRVElvdTJ6SzBtR3BXWG5zVUl0aDZkS3BCZGNUQUZoS1NsQWEraTdnbE9xRUJxTDV3cHJwZys4MnBvVEpPR0FwYUlrNDFqbVJ3VC9XdERiYzVMM2xsTVcyMk5jSTZTWHVhWm1tY2VYWWkxZHVpdVUxRUJPZVJWQTR2MXZaQTNBbDdXMVB4QUlwSW1hLzZQMW51aUp3UklkbnJ3bGFuUjJGNnNXWGVhMmdOK0gyTWk3SC9PUDZ0Y2RBSitFeTY2dXJNenhKQWplNTVNRTQ0UURDeTUvaUxZUHZhMmd6eHRZRkc3Tmt2SFNydHduWDBpaEZyaUhJR2FvUGdzblg4NWM4SU5Cd0ZTSzlyWUQxWmZOeEdiR2hIc2kvaDZUcnJrL0lNS09wNGlCM2ZKQmRBUUt5cG0wNytVbWkwdVNsMmlCOGJ2U29zcXBNajAyMVR5N0NkNVJnTW1YOWNGcFBqY3VHQTZwQXBqOVdSQTRsSXF3R1AxRjZFdEJ4dnFHOFFYQzE2TU1IUk5IZE54N0pHbkFqa3BENklkT01mWHdEay9wbm93Sm5DRFBsbGExQURES2FMeURxSk1JNmFEOWtkQmdEN2JhNWNBbVpFeEtsMVE1SzhicnhQaW9xK2VyaUh0WGt1WCthQ3JxZjFIUU92MDdqcThFd0RLblBOQThVOGhPaHN3K3hoYzR6OVRMVHJLclNGUzBOc1RidGQ0Rlc2NFpxa2prMmtraEZ4a0kwN1hCV2NEUWs0RUtLYmFzOE1WcVgrTGV5ME9JSWpocmhpOWdtSVBwUnhOVEJGZE9FOWxkQkptL014Z3FtYXFRRWs1SG5hMFhuREw5ODJQa2xkSnFwMWVXQ2lLcnAvVUtpV1EzUC8xSExmUU5vRmxzZkd6Z1BUd0JKSEoxMVpxbWNuRk9FRThGaVByL3BUb3lwa3lTaTdad1pwY1Ztakg1K0s4cXJWMmR3UEFKWEphN3BpbHhEQVMvY21PS2EvM0pkWXJsdG43TVZ2MVRpRGoyZWhCSXRGbytZaTRBMS9aUkxkOEkrMHJqQ2U2SVY2Mk1rRlYrMXNKdWI1ZUQ3R2VnTTJFRVZRTzFHUzRCSW9MeCtjYldxS2xaRlVwUTNOV3dRNFhOUy8xdzQrdFB1THpVbVdLTVFoS25rN244cVVzcFc3VEZNZGxLbWF2RzRpWDZqcDc1d2xoamE1c2lYSERVajZ6VWR2U2ZSM2JGcFVoZzRIVDBZd0drWUExZ21nRHVGYWdvWitYazFHQmQ1UmhhZURrSEtiOHdLU0NXR3RtQlFLWlhnY3F0Zk1lQ2JOZ3VBZGpTcUpZbG9aalVnTFVVQlRQWWVobUVkaDdBV3NQdzlRbWtxNzdBbUNucXdGV3BTZmJMWHN3NzREVzRoZGtKTHhYTFVFQ0VveXhHZDdBR0UzZWhhMFhKZ0FLeDFXOEJBS3NTYlVad1hPMU00eGZzWFZ1TVM0OW9JY2habnQ1R3BoZUZ4UGxJcXZIZEFUQnJVam5uR3RJQUFKWG53Yzd4VGhMdGdDTEdnT054d3QvdFBaWDNWamZMaldYSWNDUmk1SXI1cXZtRjdyOUdlb2owdktsVllBUXFxZlB3RE1sVVNIc05EcDdERW01amw1c0pqakRBTWJYWFhqclByRzcrYkFxRHFyR3c3dEJiMVZGeHdCcDU2YUwwaFp6L2xudHd3T3p2NVk2Rm9Cc2p1Vm00UXcxOUY3SEcxdUI3V04zTzBvV0tsMGdSNFJPTHdSaVk4TlJZdEpxbkdJN2NpS2ZrYXJFTU1GRnpqOXpiR2xuSktpK2wrclluZGRqUmw1WUlsWGN2Vk5MSnVJWkw5Nkphb3dNdmwzanpVa1JQUUtuNE90TTFibUpnKzB2TTZ4QWxJNFZKZnkzRjBFSFZvaHQ4WXJVc3o1QTNLZDFLOXZXN2FqNW1nV0pQdGJtOEtncjc0NjFOcjhkbXBNQ0ZmYlJDbVNCOTlLZ3BEQUQ0SjdLd2FicnRMQk5hM2Z4NDFuT0FtallHMG81SitkMGRvMEJpYlpaR1Mrd0t2MGVlQlBQdkxEYjNXZmIrOUtSK01GdlNJd0NqN2RRT3lZSUJ5L1JsWGp2dVJhVkN6cG1XcVNZaFRXN21DTmZJZEJtZTRXdUpaUW1ISWNCTEVoN1RHTXdYb2ExMXRad1ZOYnptTmlpc3BacGlTa3gvWWtsYmhCTWg1czBTdmJBS0tKMHp3U2ZyRFZqZ0o4Qks2WGZuemZTTXRXRzRldTRxOXAwSlUzSUp4YURrYTk2MC9YMWJGTmRzazlVZ1pDUjEwYit3NXB4cS8xZG93ekhLOFlGbU5qZmxoOUtwb3RFcVZ0dkdkdE43VUorTUd6QXhxUkxjaTFjQ3VUUDZON3QrKzR2a2tjS0hQZkVORGN2MzNCRFlQNWJQc0RNOHRMUWUzTFF2RHpyNmUvY3YvZkQ5Y1pkR1c5RUh6SmZMeHZHS2NtRmM1U3R2dDAvaURRY3RCaUQwQ3NmSVc0dXZIRUt0WjdJV1pBRjJLaDlLWEVFVCt0dlZGZld2MnBwQ1RPd2dlQnJJQ2hKL1gySm1wb0RuNFZ1WTJHKzc2SHdudThFbC9QSjB3Kzhpb2lzS2hINFVjTFMyWnppbHdYeW5sOTJrL0RZa01JblFwM05LcmFnZkh5ZGJtcHJtZk1ONlNaTmplSzQxTnp5MnJjSHo3WXgwSVJOczVROS9HczVybjZuZ1dBVGN1cC8ySTFxQzBIK2RSWlJKRzhxQVorVll0ZWxHRlhmMXd3dlRVWUtVdG95VE90NFBWWkw3d3RNT2RDWE9mNjdkOTRUdEJhU0d3azdMTW1sTDlhOWVFTVhHb2FkcmpSZVI4NTc5NmlFcUQ2bHlQWmpvbkRWdklyWlI5ZkQ0R0swUmlHRWNNR0ZwbTlzOE1pWHNaMGx2dUpCQVA1QjBKeWZvc09XU0NGS1FzVXY2amNxV01oRG9QVy9IMmpPOE9RT0txYzZRME5FNVN4c3JMT2ViT1F4eUlyU2JUTVZoamZWa0p3L1BvMWFLUU9XMEw4TExicmM3aHBJajkwMlNHYlBBTk5xaE5td1EyZEsyaEZQekJjYjdvZVdsUkV2ay9JQjMrR2FqYjdGVEJYQnJSVDdCV2NVMDNIYjdrTk51TmFzVDd4Ni9zVHdKWHV0emxadEkyZWxkbWNGVTBGaEFxdytyQlVCa1BmR243dVovZ1d1TDRFWmxEN2dhQzRELzNiUnJpNTFrUnBEdnh0ZlBtTUxMVDFTci9LUjZNM0xxU3F2MWQvclJSWXJ0bFhNSi9TTzNQM01udUhtUVlNWGJBbW5sTnkwZ0xXTEFxRzNKTlV3OHlURkFPSzNqVk1PVUdtWUlHMG5JM3V3ZDhWQTBtTzh3VXliZWJTS2dYajlFZ2VsMk5RVjY2bnVROEZ3N2E2UkIzT0xndUl0N25qbHZVSTZ1ODFVTGNqTitVVkZBZEFiQ2xqbjR3Zk0wRWtvLzFOVW4xckdvZ2pVTGFZbDFzV1dTR2g5T1Rhc1ZKTHRISDc1SzZMNk5YVCtqcnlVZFIzZnMxK2VtZzZtS2pBRStzb1hMcGVrMkZIUjRIemdqQzBsazhTTTR2b1BWUlNVcWRKanpzM3ZkdGZhRmtLa2FYc3dFQTI0bm1FVkNwQzRPbUtNd2lJZWtwV1BPTjNPYUk1ei9CTnlrMm5aYVFUSkhzeDcydkx1aW9NRDVrQityKy9Qc1RsUHNRWm0zSjgrNjhsL3hDVm95MGJwWG8zMWVvS2Y5N01ldHBreVpaeTdVWEdVdXc0ZDhtRWxPY0hyTFVBcENjMHJPWWl5WkUyUUMyd1FvYmo0cFNXcXF1Z0VGNFBjWmlBd3dBY1lON0xVNmN6bngvUktaRE1XSVRhT3dVNm8wV2VhenVjcHBpckJsU3RraStzeGp6cjFzcVNtSUUvU3p1RHBwd1VacUJJd2VaV0NNSmk2dTFHYW0rVForRVlMMit4ZDA5dzZIMUM2L3NxbmEzeVYwV24yRWxPek1xYjRaVFp2OE1VR0NrQ3dzUHprVjI3REdxc2NDV2QwSVNFR3F1M1lRSGI4eDBxZWRFYXZpMDBJWWErV0JlNjE4Y0hOdXk1eThoWjE2ZExGSlZpd1hrUGZ6cFFyQUNHaEJ0QVhiMmhoTVd5UnRHZ0NYaUFrUUpQSGJoYlM0aVF6VG1kL0pLaXpBWnB1aXMvMWdMakw0QjZhVnhQd1BmMDJkVDhtd2NpalMzNlI0Yzd6a3Fxbnk3bHZYWFp3MTZTQ21ZU2ltcmdza29Wckd4MlQzSGlWTWU3WWlGOGp1NTJUWjhlR2VTcmVoTUlMS1FBK1ZscXpwRGxNT1l1VDZxcXFKZVJBcWRUUmtSb2FOQStGS0xuTUw2Wkh1V21GTUM5cExicDRCdmZvY3oxNVpKSDQ1UWtiM2E2c05FSUxCUWxwbHdwd2c5MDVnUkxoYUxNK0x0MDVsVWgrVkFKZjBla0FiNXVWaURoU3lpZGs3Ni9EdmEzODJQaWhMSEovcUMrN1FWVVFSaU5EQW1kRjhYTVBGUVZmbHdWMEdUdnVHUlozNTdiakVya2dPVTYya1orWWVXT1ZScFFNY0hRN1hsQWpFeENDZHFYVUNtbnBuTjc4dE9RemdRdjVQVjFPZGJHbjlNV2tqTmpaZHhWdTdCek5iZFRhOHBmK3gwczg1SVFLWmNyUEhxTFcyMGVNZ0hEZFRPSnl2YTR3RnRmR1A5Yzl1cE40ZGFMd3dtUEN0dHRXR1NZR05WSGN1b0JPWVhxRFdKc3NSRTVQMWJ0b3hqNTdjNjREZnQvMDNxb3BzNmY4SWhOMTlOazZJNnZRTmhlakpaK0hWMmJJLyttcFdVdmJXazgyVXIwa2lnTFd5cm1QQVU3blU3dzJBSG5zcFVRdGxJTXBSNHZPb2twSElNVmZBN2s5VUd0dkZKWHdlb2c0VzJ1YkU2bGpueDVEVDJ4TmlidHlUNllZK3QwOFl3OFpTd3UzczRzTWhDVFdVaU1heDNJcWRtczZoM2gwc0xEc2wvVjZ3V2pRZ1BkRTgwWkFoRU4zdnRjZkZHV2dNbW9xbGp2eGxxNUVib1oxYjlPWjV0bVRub1dvQTlHOFV4NGJRbnE0NFc0aFEzT1RmNlJ3emZCMnM4REhmQUhYY1M2bmgrcTF2OWlYWFpxZ1FWU0paZFJCeWJqK2xVK0g5RUNQU21ZUlNYRk5hVUJrS25Qa0ZNZGxGSzZnWC9ENm5zK0hHWVhHNktvWmRLRllGSzU1QzdLRHM3djNDdFBXMTdxUWkycTlHVzdLZEpqd2UyK1VpNUk3ZC9XODJFSHR3ZGJSV01jZFVLZGdhMzlzdW8vRTR1ZnQ3NS9qRTVKQzZzRWJPYWIzZ0ZpWmpESnR1UGNtdDBTMHNPSUNRdzNhekJ1Z0tFWDNteXcrRmxkZjlJUGx1a2JETFVEbWg4QjdqeWVxVEczWnhuR1QxVTNFeHh0Uk9Ca2dDOFdUbWMzb2VSNEFvY2ZLTGdzMkJzaUpFWDVoa0grNkVzWk40MGF6ZXpUaFBOTWZEOVcxYnBrUFNyQnB2cStEa3V5QXJENlUwdldRTXE3MzNnOE5RdXFoN0FOY2xZRGRSVjkrSTNjajBYSElBc2R1d0w4cWNXY09aTG1ySUtUb1IyMFpMQmo2NlpRa2krUGRXVWMxTUpvYU9OM0lnNm56MVRWZTV3UnNPQzhhVWlUSnc4elNqZUZJbVNmS0E5UW5SM2pmWHlnaUlEN044QWpxeTVVNm5GUU1uQkN6MU9jMVpNcTFmaGNKdzBLQm9oendlUkxpcVkyLzRaNUlnZE5ia2NhS3lCRmFQaHd6ajJMb1EveXR6SHZISlEvcWdwcTNvWkFiU056RERPSkN1cUpxZmkvTzJvY2tFcGYrcktJQlBGMXduQVRKdU9lczBORzhVdGpQVDM4R3hEckpxelo3QnQ0eS9keXI2dXB6Vzdic0dUdVpTWkgwcTVMUThpMHVXOVloQ3lncXQyMkkyMGxDNFVoQ2d1Z3NGclRibTZWYXJrdGZRSWJ0dTBlWDhQc1ovcVZiV3ZNQzZldHppV3hKMWkvbTVNdXdqSkRyS0JzZkNIVVJJQTB3UzR4aHFjdEI1ZytZWWhVcUxuRGpQSUx2VWEwYjVtQ0FEMXFPSi9LdjU1SUF4R1pMOGd1Z0xyK2Naek1sZlFJMGdrTmtuRGE0cXZmS2lPQnNsMHYxTEh2Z2NoU1FiNG5sdFc3b3FYNFJZdzN0MllCczdlVzlMOE5TK3hhT0VGMG1CNmxBZUIwZ1Q5alJEWmplRzBWU2RGdFRNMUdpS3JKZ3VKY0xnQmlxRDFnVlRvbDRFbFkrTlFtLzdHQUo5NDYzY054VUZQeW5LYlVrUnpDM1Ntek1nVFdadURCWWlWRnlqclZWZXZma1hFMXpBaEtwKytwRllNTUVpRWt0bW5UWFJuL2VpV1FOOFBiTWFnZHhZUFN5U1dMWDFla2RnNDBCKzNvRHRxbnVxMjIwV29peFZ2RTB0UWlMbVM1Nm5IOXAveUZCMWd4c0kxRDM4WUp6dzI2elJ6NEJGVnlGRUhhZ2toWmZjL05oSUx3VEFMb0FBVStjaHZrQUsxcEQ2Y0JzZ2o0VlZML21DT2VOaTNHNHR3SE5ITis3OE5XS2pFY0VVcSt2ZEcyN0w5OGpCcXJkeG5iR1Jkc2FuNVJDcHBsL3hyeEtpeFJyWDhibElob2FkQ3QxcFZMZDduaS9rR0FjTDNGMFFtSXFucWV3RDM5dXoxK0h3c3NlTTkramd1c0I5UTFuZCtHNHlIVXBzTzNtKy9kSEk0RFc2RnhDUUIvbmlHbHZhL0MvaDB5bUpkOWdTR0VsM2dkNU9LK3lKa3F1QnlNSlNFQURvaG1weGVGWmQ0ci93TWZMNlFBc1dQUExmZHI4S0ZuUS9JZkNzMHBiMUg4QmkwM0pGdEpXTGhQc1BuZkVVL1JPKzMvelZzeVZESkg2SVNLc3kwM21WOWpyRFQ1YjYxS0dkRE4zZFM2bG1rZjM4K2RFbGUvSURvVzZOSW42YVJFalpsdjdsZUJ0S0xsN2NPelpGN3hWOEd0cGg1MWZWU3hRR1ovUFBTL1NYcnBsUzM3dnowYmI3eHRSY2pUeE42T0ZvWlZwTlN4MEJvSmlOcVAyWW1JUkY1L3lsK21FcWFUaWorSUxWTHBYcU5seHdlZS83eFlaQzhqa1FzR1NFZEw3aHJVaGNzejN5clpwb1d3ODhGSzJOem9YTUd4elBwSjNzUVVJOXlmK0hEU3lQMzhzU3dnemJ3eWhZc3RYMU8rWEV5MmhNemMxVUZvNTJNUDhMZVJHdy9EeXRNbUhSNml3V1Y1dVRKNE9SWGE1bEU4MysxY0JpWFVFTEU4bmlPY08xSlBJZFNnRmdPYzdodExuVHFGYW93UXBGeFhrU1ozUGExUytlR1NyMEhxWkszVEhaUU5EaE9zaHNXTFQ1aE1WVlZkOUdwcWIwUUlqalpiemhoc2lQWW9RNVpGQWpLcDBqU29PN1VmTW91Q2orVWJNdFR6c1VYcXc2bmRNMFpjL3VHNURJZm1HdHpvaW5kQ3EzNHIrOFpFcGNiMC9CUU9UUnJIeUVhMkJMdk9odGs4ZTg1OUVlcmxpYzRybjJRTEUxRVNwQ21QeUhNZU5adHBtTWQxeHNyc1VhTFFFekxweU1XdlJkNDVLRnZqN21jdWJ5Q0x5cWZ2MlExemdmdXNpclROREQ4Yld1ME9reFhuZTk3ZVU5Vmt6U2IwM0RCUWZEYWluUldGZWtUenMzQXJGdEduYVFabUdvQ2FWMUtYdFUrVUhjQzBMcTgwLzhtNWtpQlE4N3RnL1R2VitLbDNxSmk3R2swUmtydFZRRkV3b3l4TW5iSzhKNW11RjBQY1lkdWsvYmFSS0VjenY5TklFL2NwOUlSR0NiNlpVdXJab0FjeG1Hbkt0YTdIN1ZXbE5WalBDV2ZocEZoRHFJRzI4TFdpRlR4RjFxcHlrekgvM29JbHhhWUdUaHVIYWx0ZFVBVEN1N2w3NHhnWmdWbDlJQk1RRDFuWFhHNkpUbUk3V29Ec3NyY2VwblcvZjVRM0htSDVUcHF6RzgybktYazBnMjBzdFRacG80cWlkVDRvaW0zSUF5eWFTazVock9HNEZFS2pvcm5kcWNWbUdjUUR6OERSdXpNdWMvdzZMYUlvVGdtUElENGJsbU84bHFvRS9aZW5mNmxoMkJFMXZQL0d2c3VYWDVwZlRJeFUvdmRlSzdBTVI1Zjl2RkJQTU1iWnRWUis4NWJEQmpnY3JHQ3ZFMEg5eUs2bGUvZ2UvMHphRUpjTlNmZUw5VGlFTVJlNlFQQ2ZnKzNEaFhNdEVQOE1rUUVaZEV3RkZkK3BRSmFDMHhaWFFHRlUzcjl1dEpMYmpCTGp6ZDVlK0Z2S1BNZXFaYXNTd0J0anBEcU4yY0VCNEwxdm5QMTdIQWphY3FiNnp3SFVIL2NxbHYyQWg1MXZ2SkFpeWpSNGR4ZUE1Y2NaVis0VDFNbGIrSjVBWVQxY3VNaFl5QlFQanJxTm9TMXpSUmhzU04vc0l3dGVDUXNmZEZtaFZkSTZ3WjhJVk9CUDRiV2FkdTFETHdCU0wwL0ZacTU3NDBNUlM5eXB1UFdmbE40aHBqWjhzK05ZR0RwVk5Yd1BPSXpPdVd0cmlLaTF0akU4Z29rNEVQNFBoVkIydldMTldDWmZSQ1RPaGtoMXhuSGY0S0M1QWNXMm51cnpqazlhbWRkYndGZ1FiT2FEamZpc1pSQ3Q3a0NHTTdBYXpXSjFIOGJYYkNKTmhVc3VMQVF4Tmx2OEsyT2ZrUkxUb2dQdDMzdTM3cUVxNHROc25nWENwMUVlR0ZRMFE2LzFPWXg5Zk1aWWI3d0pJS2pKSGRYTXIzR3JVNEFPbHhpTFNuTVBjWTdyc0JWZWY4a2hsQ2hYN0FPbXMvTm5Wb2xid2MxNHdMZDQ2SzZENG9FN2JVcjlhUldPeXNQcDZZbTlPeElEb01UelUrc1pnd3E0RUEwbUpvTm54MWJuOE1rb1lqSmlJKy9hNmtmN1dzVkN5TGhiTWwrYjVCb3VETVBCM09WV1JDRjJKdVd5bVorVU40SjdqcXB0NG9mOXJmWGtmdUpuMk42cThnbmFQQXgvUW53WGlya0lza2xVZTEwTmZiWWdZaU5PVW9iK0F6QmZTcHRURDYwckMrRmllSGFuMTBPK3hQYzBNNTJUZ1BiS0VEelRNWEl5U1d3MkJqTldSWjMyL3BLdW1FK09vM2VCMHJQNGRDV1lEWWZlMVJCQzlnZzE1ZENDTDJjOThVQllXbGJYN1I5ZmtLWit2aEVabXc5Q24xcVpuZmFoUzdEcWRyNDlUa2Q0cXlmNjNUMnhNTVRvVGR1UitLYjdBY2Z0dzVqOC9LanJhMXAwM29OaTZLRVlnZVNoY0lxeTBrN1p5bkRvK1kxSzd2clh6UmRmUWN3YlFTUHU0ajJBMU93S3ZjblRSdFVrbEhvRGpSelM0Y1VpRXk1a2Z3NS9GWGRWVXRWdG8ycjhVQlRoNEREdnFHekVmMzlWUE9NOHl6WFJOU3dtL0hsWDdlZ1JvYnhJWS91UlVvZm04am14YjF3ZktpRnNWUDhsVGduSlM0TkQzYlZkV0Voc25Ud3U0eUZEUGFGQmJrVFBIR3FBVVBteU92WjVsRkxvQTRYSHZYQlRWdUVDaHRDMnVkT1hvbEMvazRYWDZQMk1vUTV6K2cvVDZWZEJ4TWQ1TlNIaUpTVnRubHd5YVAwd1lPaWtMUlJCM3dFRHRZZ2tGYU0wbHlvaU9QZ2FrSWV0a0tQWmMyQXd2cUlxZFY5ZjNHSUNOeG9vd3lvbVlDWXZUSXErNWdJbXdvbm9JLzhRelhsMU0wa1Q3dmxHZjlhL0RQU2FhajJKSy9lb2lEZFpOeE1WZklKNHlGY1JiN3dnMUZ2a1VVaEpISHNQVWdFUEg0RExZWnhJaUlUSWRCczB0SEQyelFvT2crekRrQTl0OGF6WFlQS24wOG91TVQ1b0QzVG54b2V1NUxKRWJtbTVYYzJ5NUM4UXp0S1hVOUVxck1CNitRWUNJZ0lrMjF2L1FLdkdVeXovallpYlVXTFMxMmJlNWpVdzFEdFZXSUZOQmNBbFNOUjZtNlpzOEp3Z0pzSnJHUEFEL0h5M2tTSEFJRnRhR21ldDU3bC9QbnRqa2NEbis4SzFDWjRhWlBmU09lQk4vMitVSzRCM29MbzlNcXlqRTA0WmJ2aXJoNE5zdW4rOURsUklNS3RxSUJ2VW9lQUFlZi9TNUNuQnlvWld2czZueGVGUi9adGFWbFFleFhDM2pRNHNrK3krREsxZVFpbVBDbmRycmJpZmluVGxOTkRBc3lCbVRBRHNpT3lia2pycU5ZbTJ4emFMZnNXVWJVZzFkUytqaStIdnhaQnVqN3c5ZHVsMTlxU2JLQmRjakVJMUFzbk1vYndxQ05lM21DcktROS9UTkdzd3A5Z0xaYkNlend5emtLSFN0VnRLdENTNzc1b04yZU5SQVhnWkJaYVdaNkVaUWw0c1NGc3dWbUJBd0Q4OWZQZkxVUE1RY2kxbVFRN0dZQ21XelVKSTVYQmpJUHB6TzJpUCtXWVRGUTFjb3g0NG5PSUpyMmR1WTBXVHp6Z1RBQnFZOG9EZm5GaU1BbC8zNXg3a05SdmF3SXNGYU85L0J6cDFYdmJZc2Voc2hXVkFpcFhERFV1RUFvMGdteUNzSW9aZFFWZ3BaWEwwL3EyekpyUmFVNGtpQVNWMHN6TzNXcEFwQzFhZnBoLzNCY29KNGJhbE1Dd3pKaWR2ZjltZnhZYmZJTWFmQitSNmtLVEdIeTFTVFNZaTFmRVAvUDdYQ0x3VEdtVEdBckNhUVg1eHQ1R3MxdnRjcy9QcUlFeEdwVGdCblVLMDRLaVBvUTRhWXdBaU9kMlJjSlZ4a1FLeXNYcjBrY0g5TWxzR013L1NnWmVVWG9tcnNhZ3RhR2xkcjdWOEkvbkVwUWV1M2xYL09OWnlWdDEzaFRkR2dBdWpHNWx6NVhVb05NcHZqM2hXdkJkbEtmY1h2aDZHWXF3dTJoeEdFV1dSdGc2b1h2SnlRSWtWR2FFaHd3dTFjM3JuOEE0eW42emRVTDhHVmdtU0JBVE5DZWhjMGRRTXlKcktrT0tYQmhaMWprcHkrN2g2UW4zbEpTbWlzSjJrRmh1Q1NIbFhQVlBwalB6ZWg0TGRrTlBjNktZdHNGeTRhMFlIUWtXVXR6b0Y1V1NiSndsTnlMdGJJM0RVd1NLM2xSNlRaSXg2NlBaS2ZlRi9QdWxXS0RVUVErMEJhYWNqV1dienQ4OFJCanRJRWhGY1lzKzgvZWdxTjFrTFE4TTBmakdQZ3dqQzVEWFA4RWRiQ3FFYXRjb3ViZ0s3R21GVFowUDdZWHU2RS9MZCs5Um1ZaDJCMkpZWG5EV2g4WEtTdTdrWlJhdjJPTFJ1TnJHM0E3MEFwWGJsVXprNDZSd0R3em1LSnlZUDdVU2tQNjFsZ25rdmRKQ3JqcVdXWnNwRjRJVzBFQURmaUJKL0dJSkhVNWprY1ZrUjIvcTh1ekVLSlRHRHNyYklIcjBoVG1RZzFveHR2QmlieHhBMGxQMUJrWXYxc0xFZTFhZWFQeFhEQ2lRbXozaGIxaUwwTVloNE1WNmRBcHJ1TnFXTFdUY241ZGp4d3A1bU1nQldhMDVsWWFERWd0alRlU0F1TmJ6dXlNZGFlcW1SVUFKVmtDYVI3MWNxU25FYnc0aWNVaTFDS3c3VWN4K2x2Vkp2aHlZRXJzZW1OV1crS1RWMy9GWkNHV1FsdXcwaVZUM0liU1Y3aExvaDNqcXVnTEtCR1NQWkhIS0tyMWRCTUZhSkVpUk9pVmVZTGxTVjNVOTFxMGlVQ3hIYmNTVFZ4VG5GU3krWlhtTXV2OFQvZksrdnV5cmo1R2cyQWU1NVVySG9tY1BVQzdNNmgydmwxeWx1bHhYQWo1WCtlVW4yN3BtTDRJWERCVjNtcmJGd1Z4enRwZmdQNHpobkNhMGxFUzd0ck55VmJjcUlrb0crUEtwdDdVcnk5VllqQ2NtTjFiYVFnaFF4L1RrSXA2a3pDZzBsVlplMFppUlpvWW95UlFtWFdZbjBrbHloOU1QOHMzOW5OaGxsdmZqMnJTMkc5UDJVSjhkM0V1TldmWHliQlVGVnBIa3BtQ0diOFVYRjc4RndBS1BFM2dHRm8wbFJTYTkrTjF1cXJDZkRpOFd5SktxSFhXd09CdWRDRGdmRVhTSStBeFArZTZ6aEVhVzhaeXdQTHdHR3dndXdpN29QSWg4clBlcHlQb0twTUdGN1JmUE1vSE9ib1FpcnE1RjNmNUFsTWllc0lhZ2Qra3RKMWpmM2xuMDdlOWtRdTFZK0tOOFJudXBiRUs3NndiWU9BUDVNWlhOTklZMWFRdlFuNDhHUEtVckFtaHFXNnExWVNZWGNrMDN5c2VReTdxR05VSHByTjlyZ1l4azhLYnZOcDJNV0wrM0dVaWJCcVYvL2NWZFdGaEtMQm5PUDBQZ1RRTFBIbHJISUF4bStuY016TTFKRGF1V0w4RWJrNFVZcjZGK1gweE9oYjRncVBNQ1FyV2JTNG5TeVFWZU9wbkQzSXZlUHc3eWJFRXRNVTJTUm9waENOaXI3ZUIwS2ZJNEZrMU4yd082OXBrNnVJQXg5Q2pFcXZ2WVVOa3ROeFRZU3gzWVpHdWM1elBhZVVGa1o1YkVNWk1TOXlSOWMrUmtlNTgvdk9PMG1rMHJYa3JlNFpTaVRwNWhwejNVU0JFUzRPUDFHQll2eitndWhTaUJSaXNrRUo4MGNzSUM1UkU2cXgyRThVQnc5SEJqOWRSV2FlN0JzTHVqdllzK1pqUlVuMU53bVkrV3k5VVhBSUVLN2NXb01GNDBJcDdKMFlkaGRPU29sakNLVlJLam10ZEhtaWQ5SERWV2l0eHpVakxJUU5UM1lIRWpoQ3o4Y3FtdEUweXFtT09MakZaUjlGYmpFTWpzSmlFZFFKUkEwOUs3UnMzWjBpNkZOTnlrUmpYeVRzYXgxVE1yZEwvaURjUFRoNlBtNnJiVDlJTVBRbThyeE50Q1FMc3A5QkEwQ1dkR0xzQjFwQkFibjdqblJzZEoyYmNjblI4V3Yzc002RHZuSkR4Z1JUUDhKV3JFR0xJNkJucklsbnZoL0MyT2EzOTJDemEzaU1SVXJ6K2FIOHd3czRHUlpxQzlMbFZYWWJaUW40Ly9WODdjckF5YXNsMWoxZHAxVUYvSkVQa0tTQ2MrWlRJQzM0VWdZdm80bVowaGl0RCtaUkx2SUdqd01QM2JBMmZNZzN3d0h0QTR1SW81cXliYXVtVURCTUlWV0N3V1FtVlNZa3RIMnM4eTl5dWdRMW5lWDVLdDRNbGZvODNvZmhxcG9Nb3AyeEdTdi9XNHZtRTF1TVA5T1ZLMlVJRjJCS3pSZllBUnNBanoxa09lUVUvT1B6bC9hS2cwdWVoR0Z4WTM1VHpMOEdNVGgxMXZWODBpVG1MOG1UbGZHYmwyMGIzZEUzTkJMYzRYbS85dnJpUnlQMW4yTC8wM0hvb1plcXlERjRPYmw0blZLU1FqYWdhSkwyWkpLdDd1UEFLV2tyM3kxRnZFT1RnaVN4bit2T0k2NkVVS2FGSmhFN25acmV1WVlId1RRaityU3VCTFppRnpxWkR4Slc4WnN3K0hIcmVLbldlVjlKeU9KNVJENnpBUlF3RHpNRjZlTmdDOUtFRjMrSzIzWHlZU1NaTEI1S3FXRGJKYmM5cWt1SnQyTDhHZllkOFo5dmdPVzBZbzd6TGIvV0dJZ3hFOWFQMHpaU0tyU0lpTDlYZG85NllPVjExV1BMVGJKWGJ2NzZocEJyZ3BxZ1pReTJqK0ZDc2IrRUFONW9BNThtb042d0k3aFFYUURvRWZrNVgwbS9kNE1TOXc4NkpoVnFnbDY0Rkt2eWgzSkk5SW0wY2QyK0hXbFNQL1czR25xRzJ3eS9IL1ZBYzdpVFpSbXlLc0pNd3d5aXJIY1UyNEJ1eVF0b0xzV0VIdmIzYURuNDFXQUJON2l2Y0NDTUFqdFdMbWFkSTlyOGlpcCs5NHpBMm96b0JBeFBFSUZhUnc3b0tqbXkrbUYzUTRJZlN6VTZaODZVWFlOd0lJbUJrcVI1aG0vcW9hWTlVT2h2WDNEV2YxM0VsWUtCNWxFemlkRXUySjdDVERiaUliSkE5eVNZbjlkaXg0U0diaWFWNk16SFlKa0RCcjNNN25NVk5PTXlZWFlWQVQ5ZHZxdlpLN2hjTU1UdXBsbitQS21GdGhNR1EzRmZURnA3OWRyaEkxcUJDQ2F1WnM0RG1MVy9nTjNnNjlTbytYTDN2cjhuSkIxVk1GNXp5SmRCb1JHZkdmS1FDUGV6SVE3aHJ1d2JwOC9NV09leSt2bWVzbTVRdFJWNm1YMjBPbEtiYkp6cFlMb3kzRHhBR3Nyb3NkK1dlQ2VobE5ockFvZEFSQ2JIeUlieXpFTzdmdlhpMm9qdTVNb3FPTGFiU2VkOEN4MEFMNG1aUnRPR0ZkcVBINTRlL2NtUEVCMHFpSUxJZG90enN2OGFKL1k0RTM1ZjJ6Y1hUb1hPbnNSWTEvVm11dWNPcnB5UnpNWkJLMWFVdWlIVU15cEVBVXRzdWVaZXJ0WlhNaE5KOE5FNllkZXFESDV5WE9CMittbytVUGx3TFRBbWlwMWRQS0pRTGdWRzZnbm13N2ErdTlaeHdYWERYZVlIYzk4NUhBVkVmb0RqNHJza1ZxUGova1hqUDlISHYvYkNkZW42M05sWjVram91V0FzN2VrNE9mQkUvN0hZdzFTaFYwYVFyOFM1b2JwUVA0SWk4UDltclA4MXBpOUVSSTF0RTZwV09LY3NhRzZEM3BWcC91b0ZiREV1Ym9GR05CUm9FWXp1QzloWm5hR292dXYwVHRIR0xFRVNWdHQ5NVNnbFVrTHNCK21uVmZRMG5IZkxxRnZ6UWM5a05iZzl6Ym8rSlIwU0lGSkk1bndRSUh5NEdQalhnQVJZR0p5eDJRTm81Sm9GWWpZcHRHZDRnMy9SQ3RQSXZiTUZINVJFSlQwYkhLMUZYOGpxVjIwTjljMW8zRkxoWjJuZjNFSEc5YUptSzdSOWNjNzJhbVlyMnZnYkp5SitwTUNQWmRhQkJLbDNRWkVwQWtjQTZXNElhV1dSNWVPTGoyeXUxdTc4cGNjcnNnOXRwZEh2aURHUHZTS09tM2lkZmdMQVRZOHNyTXZmdWx1cmpzd05KK1lOV3prVjhFb3NLMG1BMzU1aVJmaUUrZmplK1hqVUYzZDk0UlNnV1pqT3c0TjJJc3hjeDNQeWozL0JaR2VNL1NtQkJXMmFVTExlTEgrelFjaTRMREsvRkloTWltWWp5RWJYNHhnTjg2Y3FqZnBqZEl6WG9oZWl5M094cmpkS1RMSTRDc0pNanNGclRCcTdHWnNta3VDQXBLRG1OVDFzK0Z3TUdhMDdBM0MvRm4ybkRUNjY1Zm9ZT3JRMEFKWVJiVC9ZVFNMdHJrMVBXWDZjdHdHWFAxWmROaDVObFNIcGFUQmlVNTBVck1vVHB0NmJReDR3U3hSemI2SElQUFZIR3RGMjJwSDEvMTJhSFdWeFhLOW9hbVBoamVFek5NdHNQRk1qMnBxSmEwYWV3d3ZyRXpTdTQ2eDhPNFNrZ3ZYUW5YUnVndWxNVzc3aGdZQzJjejBrdUgwMTJaUy9LOTZFeTlYUzV6QXlGV0V1YkRjK29aMmhnb1lFTDZlWkNPVzZJRFFsR05Wak5KeTFGQkFPV3RuNksrbTNUVDRWZ0dwdTJkL2FQTmY4RjFmcUhDNGlWVTc5K2lhYkw3T2NKK0ptWlp2a1YrSVFQWi9ndFRHRW1IRUxuOVR1MW5NVkhKR0tHOEN3ekkrQUZFbDE3bnhQTmVmTWFsMUs5WkkwdllKRVVmcDYzbXEyMGVIcXVldmd4Qm9mcG9hc01NMVY4Z0FKMzRPaWFpRU9seGFUV1VuTVM1TFNma1ZrY2w0UnRrOEhTSlc4ZWk4dE1ENlUwOFBLNnlLRWpIWFhab3JmdWh3cDc5SndpWlhkZFMwc3R0VlNrZzRQOVlidE9VVm9qT04yNGdRN1JoYVNMZzZ2QVNaR010QmtEdkhlZ2FXRTRRZTJhNE9IOXZNamVlN3hxU293N3hhZmNTQUV6SnJkNVFYRnBPUzYxV25UUlVmUHhXVHlRYmpXMzZRQkNDUnBsSnhxci9LeUg3NjNEalYxTXQxN2JXTWpjWWZicVFFV0VwZzNVc3lzMWJQL1cyYUs3OWdVNG5VN0ZaYjMvV1p1SHlXV2tqWXhYYzFUY2crOWxUZ08wMGpWcHQxcXJSVjRTamlBTmxjeDF3Sks0RTdLTVpLd1ZzbXpFRWtmY3pXdHhxOTk0aXE2a3dMNUFXdDVKZ0NRK01jdEJadllPajdKMGJvaW1WUVJNS0tYLzRHR1ZFUVUwemJCQ1FyQkFSb05wYmVMVmZtRnR4RThmaHc5eUZVdUh0QVJEdVVodmViV2RXM3gzazFwdlQzdXpnd1BsY1JoYjlrdkNua3UrclJhOFlxaGUxRUZlZzVGVG1ubTZNV1FFcUpYbjZ0ME9jWlZNZ3VrWFMvelp0dGVVOG91dTEyYWhyMFMrTDNRMjVaVzJNeklVZWZZZGZxY3dqTHJxd1kvbk8xdWdHemFFeG5ENW5tNXZqREd1R3FqWWNobW9XSElzWXpFS2JhWEZlZGl2bUR2OGU4WGxicWRoM3o1eWdKRDlYL29qeTh1NHFYMVgwdHNRdGNSRVF6VW55Q2NXOWhLUWVkR1ZkUTZ1UkFiekRNL0g3MUowRzd2T2RucmMvMTdOOVAxNnJXQXBvTDY4OUhSOEh5Tm5kZ3FnckE3UTNhaDNHcGpBbkZkQm4vWjFLRUZoSzRTVXRjSW8vQXdoRmlIQ1ZuNkFxNFUwZFlhTkRMUDZ4ZUdjVzcxQzdyWXJIdERYc3dDOGxwNW15RG53VGdCRW8ybTUzMXlSOU1pWkpDYmI1M1lVK0gzL1lHbG1WOVlpWmJ5SXJWOC9JbEppRGk1bjFWaVFURFJxaWFTdFF4QllkQk9sQUxGNEk1V1N5UWwvZ1lHT2FZYW16empiWU10N09OaW03UStpNWhHS3VRNFpoOFVndW9yR3pMWnNnRzI0TU1EQXpJYVhHVjJ3MG9QQnJmWWwyT29NR3ROQm04NG9GVW0xam9RR3FvcXNWOG5ieDBabGsyUzU0OHk1ODJrNThCVnd3T3ZvMEJ3NGNKSXJ3UlpTTFFjS2hWM1RoV1dLS04ySUhoMjgwbS9hYVJ2WEdWWHNrV2dEcmY0a3hJaDB0ZktnWkJZUmpYS0tZY2xydGRWd1pENHVNR2tCWHVXR241c29VVG9xa2ZvQ2hVbnlUdXcwemNKR1orUENPaW9yMGp6c2x4MktvaG9UM2F5RnVtdmswazdtcXF3YldNUEFWVlFQU0dYNk4vdzZEYSsvVE50RUg1SkpueXFnUUdTLzI1QzdtYTJXbXB1aHNQRDh5YUZNTWZMNnB1N3JPVERjYjFNeTdVcUk5bHNnRndEU0owTHRjR0ZnK3ZDRUNjRG5mOHRydTRzYk8zTEFUTFcwZ2xLOWFVWVV6U2Z6Qjl1VWxDNERMMENjQWV6akpnb3NQaGd6VDZtamJQaUZlaHgzMzJzcGVJd3NDVjN0UGdMaVlkMW54WklWbGthalNvWlZZVXpXVWJzRUxGYU5jWWxMZ1ZJTnZkMzcxVjd2clRQSzNremdWcHltT1Rqa2lqQ3ZaMS9CVDYzeTBJNVZ6S29aSS9sK3gxaDVUTG4rT3RobXU2aE9aVldIaEErRkE3S0wvYmRveWE1UlkrK0I1ZWwxU0NkNjZoQ0duYWpXbnhJbHZHRThraE14Y241ck5DWnZybktqRVNPTTdQYzU3bzExVTlRZFl4ZFJ6eFFSczhPZTRrb1dYZUk3TU9tQ0l3S2FxY0cyWVY4YVEyZVZsMXFMUzIrQmdkRzBPU3lnNG1SR2ZlaGxFUEZxRHc4OEM1YUhzVkpsbTRreFJ1WEJOTmRTNnBkeG1wOURWYzlTNkxiSVFqVTFxWGh5bCsxeHR5Y01Wd3daQzkwdS9ZYVg3TWowc2lYczBtZlZ2TmJBdGdHbWVwb3VYRGYzRC96MldPbVRiR09mbzU0cHhSYU9tb3pDNWhsSDRaeEJFVHVRTHpiSnpYelduRkdnV1Q5d2Z6UmhNRzRHNDBSaVZvTmQyL1liYlVRYXR1eHIwV0ZUUzNuWmFOamlWaW5rUTgxUnhOeURoUzdBR0lOOWVmSm5aQWMwRTNZS3pNMUF0a3FzeUJDSlhZZGRJNkJoKzUzRkpKbUNNcVlEdjBwK2NTUGtuU1ZzekEvRzljVFRNd0RrWXlTUEZXOWNNY1NXL09Vc0RMSUNxUGprd285b1E4ZFBsK3ZJc2hlQUdmQU0wb2duay9HT3JxRXBxZkwvZGhvVnNxUGV6TkZGbkRXUlArNFF4bDZaUXFRSkJBa3BWRmtlUHh1SE9PV3hXSDYySFVJMlZESUR0YzNydDJUU1JDNGVZb3I2TnFhYjVhbUZSYnl5ZCtIQzhsOGZVd2VJT3pqYmpIRFJUYW9DR2ZBVzlHMm51Z3QwVTMvbDJpbURCdW42dDRhZCtTdUk4bmFiaUpBeENhbFA4QnMwdWgzTnFtSFpPY2VnbDQxTFpCQytkTTEzRUFRWTNKMW9CRjBSZTBZc3haVUlBMldOV3dMTnZIQnpOLzEwdjB1eVhyRzUyVjBvZ2dCYVRDQTNsWnhTZHJEM0xaL3c1L25zMTB6NmMycTRRb0FvWkZzb0Z5SGtFaFJHTGd0T1YyRFUyZHRSRTNFb0tEMWo4WDRxUkVyWWRjaFU0aXhJd0NsS2QyZGY5cTRob1BaNEFaRG9RM3VMT2h6NkJFTG5yZ0RLQ2JFbVVUbVZMNll3aXBYMmlEN2ttTEFLeW14b0tabUZNdm81a1hpdnR0TDVzOE4rYTRoWWZXMUJiUUVRc2FkT0FEYzYrZTB0Qkh3L09jM2w1aEJBcEo3UDMvVnlpSjlmdHpqd0J0OXcyTTRvMTN6UGdubVI4eDJkNHUwdHMxelVHREF5Z3h6MFUvVzA0MG04dE9Ldktpdnk0UkwvdHZ2ODRXSlpJUVZEWlhBemJ0ZlJOMzNpdnk5eGRYakRmT1RYQUo1NC9XMGlCL3RNbzNZakFLYktKWHlIMTNiK3BIdWE1ZzZpMXlyZVJHZjgwMytXMVZYS1hQaWNHTytwLy93V1BQbTZHc0NLWW45d293bFJKK0FzVXkwWjdRdmxSaVJWcnh1cTNNa1hyYi92NDA5NDdpKyszNjRPY0loTkdEeU5XRk9pSGhlUGdVZ09yQVdyTzdCWmc3SUc3TnRhVU5TUWFkV003bGI3R05Ic1JxTTB2MHBRZG1PdHc3OTBydmNqaGRhWWVua2M4V21CVXFYSHl0UFRmTTR0QWhCL3VpMndBMXVVVHU1YW5EWVJYTUI2bHFEVWdlaWR4U2FxZC96UnBqYVhDMER6UU1RTWtwYkZrU29XMmRhR1lzSGdHd2tiSkRCUGI5UWV1cFhzVjY4OGNadkR1eG83SmtwQXZMa0dqYVhJNW5XV2VZZjBSS0M2WkVDSVAxZHpsOVo2WHl2WWxiVGJPK2h0dnQ3WWtDNzJTaC8zcVZIQnlzQmZzYVdEeVVzN2lFTHpwWmlEVmdKRUgzaHhVRVJQeDA2U2FkVWh1aHFXTE5Ec2Qxamp0Wkx2NXVTOUhKTnVCWEhSRDJrRU5MclJYWWVoMGVSY1VHVmsxQVFSd2FVSXRISzRBY2tVUkM5dDVmcW9sT1lHV3RvZmx3ckVJcnhRdkdsNnEveVZKY0N5Z3hCb1BTYnFMVnl1bjJzV1Y5cUFua1h5cnhJRGtxQmpxSFUvUnNTOWl5cmJ4M3N3eG9GYk9leHl4a1pWMnJINWtsTGJYTU56R3ptMlFuVkxCZFRqaWZRMUlJWkRrb3hESEJkbE1OYUdvTkthbysvWlVBeVZOMkgrcVc5di9WS3hCa3VXeWJObTBJSnBnTUEyVVcrY0cxYmNpQ2FVK0VYVjNmMWM1Vko5RXZmODllajdsVElCS2lKbDFJWDJoWHNuWndibDlOYjAwekE2RndtTFBWbjVmZEZLMEg4RG5JVXFCczJjTW53ZmQ2b3o2TU9mWklER3JLY0ZqUWhHSDl1c3hiTkdVVUNYb24zdXk2YVZHZU1BTFBhSUt0dy9kcmpTUmlIUlNxZXFUZkNGUVhwQnlNSlVxbFBCWlJiaFlzdEI1am1IbHBTN05ab0F3R2VoNDZPOE1EeTBQYzNyRW01L21ta1VJZXdtTjNwbGRqS2FqL3pKeXg0NW5oa2FrUmFZZmpSYjNsQm5vUDk1dW1TdldLVFhrazl2RHp0TkRpZnFKYnNET0VqajV6MHl2UWZMK3N4NngzV2JNYk1IaWd4WjFDL0FpaEhvRkN6Z00vUzZRQUpkMHNFV3UydUxkWmM1Z1NTU1hYdEhrNjlFYTc3d0pRbldMSlIwUUI3dS94YUlXaGdFRWp3WTMvak5rZ3A4MmU0U2U2NERaeU1yb3dzWFpGOVJtVGFlWFFTZFBrQ1Rmd2dsU3UzWHF1TW9UOGoxdkdYMUhtYUVzR2sxNURIUkd3VE9aaVRBZVBIdDRUTUovWk9DaXNVRUpaVnBteXk3S3E5RHdSWmtJcExBelhhbDc4ckFWWjlDQzdLd1ZDVjNnS3NvbGVaTmJ3RTVjMk00YzVVV2lpV21jNWE1YWNqOFYwWnViTHovSm9ldmZaSXE2cVJRNmtsSTFPN0NRd3lrRGZEdjRYZ3VVald5WjhtNGdFeDVhY1hkVzZFd0hxQ0xkazlIaHlwb3Y0ZHNQdjhuZlJWSy92cDJZYTZQOWNYY3VqZWh2MjBramZnQ1poQnpyd0dXck0ycEYyOFRHaEdHMXRZanN4bzIrdGl3aHNXeWg2ckpMU3ZCeko2ZEpObUZvd0hhS3YxbFZtNkxZdzZNVGxOSnhmazc5WDRXTVY0ZmkyeXVKSEVoVzRQejArL3dEODIySGNHeUE1R20xVTRZby9CYU5iNy9waThjMmV0VTNXTTR0b1VpQWNIU2N4T0c4aXhYdnBtWi9Ka1BLWGxiTEs2YUtrcld1ZitwckxsYXBDWHF2aDgxczMxWmphZU1xVmNKdG53Mi9rVi85NkZVRnlCbHg2YVFkNUE0cXFlQUdZdFlvUkxJVDE4RFRUaEdTa09uZVVpODNaeVBZbFB3d2c4SG90dXFQY2lQWlJuYkZoOWtOTlZ3c1V4anhCMzM1VWI2amZXcHF1czZXOXFMMDQyTGswL3B3WEtHL0djc0hZdWk5QWdCUzdKSnIrSzVlRUlvK2RBNllHWFlNdDM5YkFIclVJKy9ibVNwTitzS1dVREFoR3MwdkJjU0N4NEZzcWR0VTJ4djdjZkQrUFpsR3JZKzNNeTF0Q1lvTDU4ei9BYzRCREptWFo3U0l4SGRIZytGNnNNZ0ZoV095WEVockd2R3NDT0lNUFpnaURHMU1CZzFVOVVsSUpKNFVoWkZBaUJibXN0YmZhRlpQbzVpN1B2VFNaUXZFN3Y5Mnl6L2kwWFRycG54VVZyNVNHam5UOW1leWd0OVFKWDllTUhOempiR3J6U3dTczdZUFZyakZNSHhpTTNLZDJoVzZlRTlUcGNNRTAxTTdKT21HT05HR2xMRHkxTW9vUmFselYyKzU4Q25oSktjR3h3Kzk3SFpxZHduU3gxcHNYK2lFVVRVd2wwY1hiRkdWUko3YXlJWmZ5TXl6RFpuZlJqT2MxM0lXZTdTYXFFdWlNenAvaUR0d25PaTFoL25mY0VvbXAxMFc4N2tMenNaS0JyNldsQWwvWjV6Ui9Wc3ZSZkhVaFJjYmg3bDR1NUdCWnBCM2drNzl2WjI0b3dlSFNzeExhWEl1N25JRldKMWJtZGhuTnNRNUFWVzZncDY2Wm5PWjVOcHN6NkR1MlM5Yms4K2lSMDRtYzIyVjNPbiswbThNUVQrSmNkaUhTYlBZZldOTEM2d1JHdFF5RVYxczVHYlBBc2lHNDQzTDRROE93LzhQaHJnZWF0UVRJOTNvcGoyZk5uaGlkdkxMTlVWOEJWWm4wQnNEbWZTUHhuTncrMUx6bkNpZnJvTEN1ajR0aWN5amg1WmxXckNzdGh2NVF4ZDdBN1h4MHgxWUpWVUgwTDNZZkRQVU5nTVkrTEsrWTkvUEl2anZObC84b0pxRVdWS3VvRU1sUmhaK1o0Y1UvUXlGdklUTFJSdVZQZXlabHV5K3h3empSMnJsenhZWFdncVhkZ3BKMU9LbjRselR5RkZxZHl1T0FnOFJwbzFldlVSNk9iY0kvdVQrNzNoNmVLK3MwV3BHZitSUUJCWklFNWRvbmFiNVhYdGhDMHNISENNS0MrdFM1Q3lNcnJhVUZHQTFPYTBIUWFXY2pEeGN2NHQvbFFDOFhTU3dYQVZhWFVuZ2lHTXlzNDVsTEUvMU5kK3hhQjN5cXdWZmFpcHd5TnBOdEN3bmZtd3ExWTZ1a3BhcmZ2ZzBaMUt1S0JWNmE1V2tGWlRNVDdjekFyc0xOdFdFQkQrNXJHVmU2RWxiM05CaEZaTlRrWjlEc1BuY3kvdnhBWmsxOXlrYW40SlMvZE1jNU1WRkZpZW9mUDk2cTZkbStzeTFUclRtUFdxSm5ZbXdVRDNzZzU3czIrbnkxNEEzbzlzSGgzbnplczFOcFVLempiL1QrcUVya3NtMWg1ckJpK1J1TTJuaUZvZHh1M0tRWGZoZXRORUhqQWE5SFk1WTVjQ0ZDaVBJZ3dacmdnbWpKSlFvM1J3K2RId1ZiVjdSUWR6WjNpN1c4UEl2YVErZFVJUGxhU1NJUnBkNG9jdTM0VWgzdDNmR3NKTUI0cEdWTTFQNnlGOVJuYzJEQ3hsaWx2SCsrQTdyR1hlUzdoaXZEWWVjbFNWWFh3Yk0rSnRuSnBCRXRocm9BZHl1SDdWNVRObU1hUERMYmoxZFdtdnZGd2hvNG5scVhUa0dNTnRrbFJINjlleVMvUTVtZmhqc1RVRUFNcEFFMW5CVUJtMXRXbGZrVUFkWFFMQlZ5a3pqNWQyM2N6aUxFbG85TE8vYWdXSkg0RWFtaFZXTC9CRjBGQVRha0lOUWt4UnR5M1ZGL3VtbDJXQTBVT0VHMjM4MUhYeHZFNXViYTQ5eTlKdUgyMENqRkxjc2YzWXoxN1o4Tm9GNStLeVZ0R2lLK3owcXppek5uUjJvZkd2M0czMTNYSUFRNHUyY1JKSVhaY2tRcmVqb291Nlc0T2Fnb3paNlhyQXkyTllJOEZ6bGpCaFBwS3NwUWRMQTU2d3dSbkxkWDdYc3hyZjVTdXlwTkVNVWQyQVA3NnJvT1R0bGRJOXkwa3RtMWp5Y05sak8xNFRNbVZ1S3ZYZ3ZUTXdNaVJ0WDNFU3YxazJqQVpsbHREMUN6UkU1Qmp6b0QvQ2UrSW1Xc0ZRVXU1TUV5VHNBU3g3dTk5akZUYlVSc0FvZndRYnIrSk9EMFU3MHF1dzhpMWpUVjVIZlQ5cGNqbFQvSnV4SFJ2NDRJaGZlY3dKeHhVOGh2bUFaSFhTaE50eUkyZGVwdllId0ZCNG9sRkdYU1VyTmswdExrV1NaaGVrZzI2TElyZkF5ZVRnaTV1L2VYMEFBM3dmaU5qUmZtMkRyQktMZkRHUHZudFRtUkE4VUhsVnJiUGV1NGNpcmgxV2NGTGo3M3MrNUF3Wi81VUxKMUdQc25EcFhkTkZGSHhNdWdkTDNpWHdUYlpadFd5em5GY1Q4U2pLL3dUZHU1RVk0OEgrVHltL0RtUHRkdmVzc2d3bks5Rmx0NFZ2YWtaQk1ES3FSSmswcjFzcGV0KzIzdER5RjhhcmtCTTBoamVRL2dwUWtBcGhEdTQ4eVZTZUhtZFRtQk81L25kRFQzcFl0RGxCKzJFNDIvTlNTK0lmN2FsY3dGL29PSmhDd3VGcnRUUE1FUEdqWitwOEN0ZlNRc1pkbitWWCtiM0FxWGhCMkhiVC9PTmtzaHlDRE83dEdDcDFmRHdIMHFvc1hNYmNuN0xzOCtId0lRaWwyWUVMOHF3cDFwSU5lRzZ2ZGpDbmNMb3hBUFAyVVNuZVROVmVDMFBsRm0vTXJsbDI3MTZpU0hoWkthb3k3OUlPQmFab0k2Z0FnblhZZlhQamZMN2czdmkxS0Q4WTVqMWdCZUQ3aUMxZkF6NnlLK0hiQm9RZ2l3Y0lOVUFFeEV6VWYxT04xK1BzRGpobUJuV0h0YlM2elJtd016QW43TVd6OGdzcUtoMUcxNEI4K001SWp1Um1ieitNcjFFNC9wZDBBdFJGZisvV2h3cDBZc1g1UU43QWcxQnRpdkY5NDRrZGkrdVEwWmNKLzBsdlhwZ0ZZRldmemxUT29JelNKckx3aGRWQ3VLSWcvSUpZaktMb1NMSGxSbDhjT1hUK25TNjgrTXBXb2lQOVNrRHMzTnJlSkdwQ0dlZE13ZDRXQS9IMXE5aDE0MExpR1oxM3NrTU9hZDV1endnK1FiSlhoKytRdHN1VUhoc1RqRDhjckJBR2huWGk2ZzhrZUI1cGQrbVlxcHRKYmowOTlkbjRLd2d6bDduUmtjR2Z4WHhkTFUvQXJmVm5TUFRpUmFsMGNDQTdCTFRTeHZlQ2txUmZHcFYxR01sb3N3N05yVmp5SEpLOEl1b21VeXpGbEpFY3pQOXAzTGFCRmZtV0J3WitMRUVZR2krYXlHVUJ0dFNoWVZFaHVidHh4QXJNNjlDUTlLNDZzMloxbHBlanVYbkZ6RFZjQ3pwUWhqcjY2T000TWVVbWM0cW5FTnQxYnczUldMS3Y5RkJKNGZVL3Y5UE16TExZT1drb2JmY1BXM0VoNG4wWjRGZ2JWT1hmMkQ2QkV3WVNGVmJua3puVkMyMFBRMkxZcTdBNFJyWVo1VnBuTGliV0VLM1JEUjZUcWRSR2tGWU5tcXJHYkJNQ3d3bjBBbnEyRVljSy9MdzNIaHJ1eEZZUVE4R2Z4MkJQSkpDTWUvM3V1azBOY0UxZzR3SU01NEpodkszTE9QeG5aY09BZnFZQm1WYm13SGJ6Sm82Rkl0aTBUbVV5ZTljazRHbythZ0x4SFU5bittTzZ1bUdkeE9aN1BOT1psS0syWE1SRFhGbXBaVndXOHk4Z3UrckErUUh0Rnk4cmFQZEZGV0RVTHVocXJFZ0VodUhZMW1PRTJ3bGcwS2JmRGxaOHV5ZXBsSDNQVjZJYncvU3FLTFlyYjN5U0R0cEFTREVja3dPRDZWK2FPdERsZzZPU3JTVWwvaUJiTElIYlhMOWpDbG9ZQ0pEWGZjdXhvNkNhTTU5bVVJVGt0ZGltNmc3d1Y0cndxWmkyUk1ua0UvMDBTeDV6UkRyWE5ZckExY3hpWnVvZzBSZnZ4bjByWGJ1NWZqb2dUd0MvV3FZTzNiQlJjNzRia0xCVEJJTFgrcHRGTWlBVzVod3gxY0JOTnkrTG1Jdmt2V0pmNEk0c3hWZUtNUjVkbjdyM2tGY25NV2RDd2xqcHY1eDZVc1huc1Z4NHhEc3ExUUZ1YmZndXMvTEx2SkxXV0lrRFlQSUZjTG9IN1ZVL3daYUtLNURGYlA5ejdDV0UwZXNSTW42dEg4OWlsQ3hlYjdXTWNsTTZ1Rlh3S1ZsWnB4V3pYREZDQm9IVUtmOTQxelc3S2ZjUnVJUUhhcmdVTWtLNU15elB1aWZMNTZQSXgwTFBtZGFkVFUyV0ZsMzRxZm1sNHN1UFhIVDczUkNJM1VXQmxlWWd0TEwySi9MS2VIR3JVR2dXL2ZvUDIvMCsvWEMvTzM3d0pwbXVLWWlyalhpUEpPRnRRU25CWE5yUllIR0VxOHdsQlNacllQOU1zYnFVZTNlbkhabmVkYjdEYSs5UzZSUmFUZmE2WWRRYURFZTBreGQ2KzJtLzIzSkc1TGEra3gvTXpRdVBoUE1xYXRaejBtVm96djBIU2dBbHV2OVJHN3N4OWdjTVlBZ0U2TDZ1YzZ1MlRPak02WkFueUlkTjc5VWtJaHowVkpuakNUQzFYdW5mb3ZwUjg1Y01zU2RLMUp5ZWtxTmdDcHo2YnpJbUhvWkdLRGgrWG5yVnBldVpQVysvS3gxY1RZYi9MLzNRTnJvaGNMRmlUMUl5K2NZK0xuSEtYZ0I3cDdCM21qT3JGRVI0Q1JhUkpFRDlkYlREUWswdGRpaGljTno5US8xNjB6Z2ZGN0pTNHdxaUJ2R3NjWDVGL3VkTXNPVUhsSmY4VTg4VE1QNnNhM2VDYjRNZndMd04ycnBOdXpwbmJGRDR5RndLSVh0RExlZjg3RUM1WC9vbnJWL2MzL09wdCsrTER2NkpRNm9XeEE5SEZqcE1qVlU2ZDFXUWxsYXVJN2xrbkZIRGczL0RXNDhXVm1xK3ZTQXJsenIvOGs5WEJLR1hTWEdnUlVUeW1ESHV0MGxGMS9teGpzd05qMk5GK3MvekVkV2k2MFJSWHhtc21TRnFxODkySEdVckRMbG94b0dWWHVUM3N5VWVPZ3NRQ3RQc2lVU0hxWHBycXBuVXZkaEZyakN1N2NHMkw2WVVscmxqL0Irc3pKWFJXamczZEZvWERFMzhKdGpEaDJJTzdLR1FkL0FKT3p6WDI3TnlKcjJMclpTaDMrWVZmNkdsUWdManhTbXNLNDNrMHRNN3pKSzBDL1QvYzBNNTJSY2NXVlpJeG1OZGlXNWUzWEhWelRGSEl6YThRVlV6eCtXZ29ZUTZXVTVhVTlaSzhXL015ZHlkc1BTaHBBREhEL002K3NwMnNCUHBLckgxcS9IdU1GWHJBdG40bkJoZzM0NDFjdnd1bzdCdTFTTlpRU2FySG9pVnFNRVhEQ2JJZi8zakxCWjZNS3k2M2VtejhHaWFJbnlCSGZYSU1sdU1XNlpTSnBvVnc2RzRYZHdEZ1o2TEVLZ0Fqbm91dzRLeVJ6SXNhYTJqMFJJSVFFVm1mNWplR2ZYS1NUL1VJMElQMy9Vc2E1WE1pVEpOQVMxYTJuUXd1RXM4T0dvTFREMFRSN1Z6ZG5UbGkzRnNGNTNaOCsrSHhuL0JSeWg4VUNLL0hYREFNQXB6djJFbHlxNlhyN2o1SXlMQ1g5aVhwOXZBbTZlcTQ0WlZRRUpaUUdaQU45ekNYSDNOWnJNL2FySXBtNW9TaE5PdzRMNnhBK2NtWkdHVWRpOGRodDI1Y05iRmRQSnp0TlNiV21FMEVKLzZHM1BiWEpVMEtzdEdLbXJXRmxSSDVjRDRGd1lwWmV2WFBjc3UzUk9nSC9KRDRpVDgzb3FTK09ocUFBOC8vT0poYnFuYytlRXlCaU43TFdtREJqVGRqbHA0bTFHcUtzOFNTYVVLL2JIdzJGVVFxcEdac2JLQ24xTHJGWXl0MTM1SjZjdjhZdDg5S1dhVGdDa1hVWm1JeEdhcVdEay9aQ0V5bU9LdUpaM3BZandGY290T2owb1pBMVJvR2FDaSs4MHlGaUtBNHpVK21kQ2ZDaGxjK3g1YWRET1FTZlM1SnBCdFpnTW1mTlhrYmJYb3hlR1hpRjV0SjRXSXNCRDRWUXorM2VSUjdvanJ0aXFwNzdsbjRzeFRqQTdwazVSajg4bVhSSE9mb1J0NFBmSktiOWNkM1REYnpjcjd4U1JNUmQ3YVlsbld1WUF1TTFlbVptdGd2VUdjZ1JtNUdNck5XOTdXTENhd1VvcnZ6UEgxeGxET1pKWDBZV0VzUURhZFJOYUs0dERrRnhVZWo0aHpTMW8xc3M1VkJNUm45TElyWkVjcDRIaVdOU0JGUFhudEVPaWNRK3M0ck5RLzVmYUI4bTgwOU13TzZiVkhrRm9va2xzbmZzY2ZxRGtPTHplamFGNkQwSjdQOHV1aVc5Ry9vU2ZJeStudVZVdkpFMFRuVExSWnMvQ28rWTcrckphOSt5SUgzMDloV3NvMmFmRjc2Z3cya1cwTjlkeXJDcHdoV2syaWJUZzVrZDVpcjNZeUhUcGpicWNPM2xIL2gzRDdSL25qamkraHNPTE84bm1kbmNRTEdhWWFUUUo4dmdNU3h4M1FaMHhkZUZYemQwREFucVNvNE1jcWp3bW5mMWp5a0hvMXNDWU03OWlMRFNCbEZjcG0yOFlKb1RQaFFtYmp0c2lVaTI2c25DYVU5NnNFbVpaLzYzaEN4cmJiUlc5U0duZzhLZUxwSDRJWCtqVTdxODBMSUpvRHVpWWpzUy9ObC9nMVdwK3hVemtISkV0TTRaRDlOTG9ISTdNVEIxTVFianJOd3B5VndNMXcxOUx0a2FNUUtzUWNZOWZmdWdzZTBHMkk4c014MW9QbmpFY2FMTFVDbWZnZTRFRGNlWU9PSEQ4Wm50UU5rSUpoaHp5L1dEa205K2VHNVlneDBtK2hnSCtEY3pNNDM5Yld0RE1ObC9mWnRnNXhRRis1WjBPZlRBd1NDOEFwMHpWSExOMHpYbTVjbnpZOUZaUG5XY0pCNGNvNk5BWUFIM0lpZk1HU2gyWnFkNCtWVk4wSjcxNmpQRVpId0FKbCtCdDZDdXhjRERlTkExVEo5N2J0ZUFFMGdOS1REN05pQWhtZlFkK2w1MzJPcTkrWnBhbWNmR1NWVVhVNnlQbUNGaTY0Y1loVDhyanN5blZNMGNWR25MYWlvV0NTZHBqSFVrQ0hNMHk5bEkzczEyZ3lEdC9xcmthUkIrYkhLWlo3TFRicXpLWGJ5Rm1KUlRybU10MVZpZE5iQk5Da3A3ejdqY1BWY2s2dDZoK210aHBEc0MwcG1GS1k5cWxZLzMzbGNTQ3pEbXo2Ny9raWt1UTkzRThoT0xMeW5ObVlRT3FWYUdmZ0V4UW5tYmxVOHh4aExUMDRqVk1UYjMvcVB5RE8yTW9RYXE4dUNTdWdRVW1IeHQyUFRLN08vQ1ZTbWh6UHNOb1pqYmgwdmFKdjBoVDVXbEYyMlZjSzl3K1g2a290YVpUNVpsQkJuckJGM0hvQld0M09mYUtxQUkyZ29vbG1ZczFpanFIK0NvalpQOFBNcWNlOHNvcWVVenBnQWQwdXNUMlRXRTJTRitOQjNuZUMxRWZzQUQ4cDE5Q2k4aVFmOEliQkQ1eUN6NmFkdXlHc3lkRWVQMUdQeGpQTUtickdRbnJQb1dBSUZxMSt0VTM4Y3l1clh2cWJTYlJUMndlM1lmcGE4UFlpMTJ0R3g5S2daSFVJcFZDNnJyZ2VyTnd3RzBBVkQzSlNjTk02VnZ3Z2s1OGozRzlhNmJaNk15V3lKRkwzRGd4V1ZzQkRVUXRWdnB2RWtxZnlPWDFRL1dMOFo0VFNDOEpjWFIxSkRpWkVodkU2by9XWUlmcTlFMy8wKzRLY2d5UkljS0UxbUd0a243ZnE4cjROSndKOGh2dU5rTXJ0YVIrU3JyaWt4SU5LQ0Q4RE53YUo4dS9QVThabHozWFB6RlFpYmF5dTlrdFBXeUpqNDY0aE54Z2FiYThzOXRXbGgrNEQzZVgrdm16eXlnNnFUTTkyRml4L2VsckFuQmV3N0dvSkFVcGx4STMyMlQ3RUVBck9QRlF6QmJSR3V3eHo5NnI2TUtBaEF5VG5LNUhabDVUeVp3elU4NURJZHk0ZEQ4MFVTQUVscTBaQUc5eDlMR2JKQXBSVFJiNEZ6d3l2b0h2UXhVdEl6N21QTC9Ta1R4WndreEVCN3FkcjQ4RkpqYXJyVWloOGVIUVVKUHZUYzhuUVlZOHJSdXBxQ1ByT213NkIrTUtWWVdvMk52ZUdIN3poci9mT1dPbVZJNmdEMkdxVi9pTklVZ2dlNll2OEd4bzYvR0o5SHhQTzNMKzFNNmI0V3BNVHNDZnlCemg5OG9HcXByY2Jhai9ybjNUakNwRWYyMmRCcHpwZ01lK1JJMFRSa2ZJbWtPaXUvVVRKMU9tZXZ5UUdDRUQ5QjRVNkJzSE1GdVo4Y3lIMUIyWmFSbWlRdkZ4VklzeHJEQ2xTVkdCMDlBbXlzQUdXVzlIenZ1YlBTL1RMN1daVTl0UVR5Y0VhdVRZRE5PTVB5NXhWTFRicTNFYm54TGJ5RGpDQkl2UWR3WWY4dzRaMmhzcCtCRnUwck5tVDA5TlA4SmpwaXlXaWpncHQxWHpreVZyZ1NsbWUyWTg1TkVCVWc4MzRwaXl4YmYwNmNEdWs5L2RFVlJvRXJuTUxTZW5pZFFETUhuemQxRzZMclJDNmxTaFkwSkNLNVlrRm1mK040MmcySVlSN0dkWUQvQm9OVHFEZHFySGRka200eTlqRC9DVHF1cFRFQzlENXc2eXQvdlY0QWpLNGtsTU9TRHBCUjhzVlBHS3hxdm9SWUZGRlM5b1ZDUXhuWU16NmZFSFlRMTJhUHVmdEFwSlc5azg1cURKZHE2eU5tNm9STEhXNDhKNEQ2aERoWDJUWEdOUml6ZFpKMm9vSXVoNjFvMnpyVGd4T2NpbWdMejljSlNzMHREMnMrcEc1bUV5UVJrSEowL3dFT3p4TytBYjFSaWhEM0ZQT3lKSHV4TTRjY2ZiZUwyaFVIeEU3NUJOQmt3WlNwYWlNM3plaEgwTVF6MjBnSmNOYlhTNGl0QnZXeUhJV1BrRzdVT0xJRjJTVnZEVkZUQ1YzVzRUT0w2R1pUUXdhSEt0RVdxSmRwKy9xWTNFWkJtb1Y3K2Z0dG4ybHYzWG9GeFphZy9iazNjaXNUUmpmRC91b1JveVIzcjFTNzVKUnh5TXRCMWI3L0ZwaHVDOWp5N2JyYi9sYm9sZEhrSUxSK3d3L0tCWGJjOVpyMlVxWkJDQ3lQbHFreWtBM2FGdjhucWQ4TEM2WXZxZ1NJaGdDNHdLaFlCMTdOd2NBS2pXSndyRTVYWGc5TnFZVDErWDBUVktHTEJEQmhBVHA0cVJWU3RibTUreHhDcnhTUEtMODNwVEMzNXV6ZEZwa0lUaUFnZ0pIM3ZOQVdYaFE1Tk5UKzVhSm8xdjluVTRpUEpzQ3ZuRDhZN2tOMU9nRXg0MDFwanQ1Nkk0OFUvbmszSmV5dHRSKzE2NDNQYWt1ZlZBWXFqbmxkRmF3WjVMUVRmbFIxZEdSNURMb2szdGhhaGdyczVMd29oZDRRVkZ5d25IMENValJFYU1RQjZZOTR4S3pKRmJqL1dXUVFKY0hkMDRydVRqVlEvZEdaQ1llRjhSV2JEQXV5R2RhZkdEMHY1ejJHRGJiWXk0M3dtWlNlSERweXBnWGt4OFhIOHVOR3BMZ2F6K2ZSckREOTVSU1FtUGk1WUE2eHN3OHdYdlBybG5SSi80TEt5Q2NkVlNjQWpPK0NhNGE1RGtLMFdxQW4rcTJENTZ4VmVwZ08vRFJ3U0Fyck1STGlNZWxWenZxVGJoaWkxVHVCNkZJK01vVFE5YnpzMGxiTE9QeERTOWxxbnhPUDNjaUtXd2h0OUE3YWdiampxdVlrNGxCaE1MbmdON2J2Rmp6Y0ZOcHBaVytGZUFvQXVwWFhJaVUzVXFVTTY3aG1hVGNPWXhydzRGc0NGeEg4T0gzM0ZRVGdUaDBmS0xJeXpobFpLaFZnbTZwdldnNWlUM2V1VmFxcmw0bEw1eDNjOTZKVXUzeEh0blcwdnJGVUF6c29RWFI0cjZId1M4Vk1FRGZXOXJYU1FnUkNFbThZMWN1TGxGVUZ2MHY5Q3FUeFZmMDVWazA1eG5XRlpaeW4rZ0tSZVF6czV1d2JubC9OM0V3VmJRckFZeTVpdGJWQVdFeG4rNDNsd3BxT2taazJMUjAwWFpKTDBuT0lScUJvMTltWlBhd25ldlgyeC82VlNYajU4MGM4Y0tGWXNjVDl2RUZmZnRTZDBpUVBOSEhucjlEaWhiRVlHVWFJdksyWnFlWWFacEhWcDdsOGxHTVBldlUzMnJjS2w3ejA2SUk4SGNBSkEzYkJlSVJ6a0g3SXdURG5GWTNIVXhxN2FWOVlQRXA4MnQ0RXIrSGpUNWk1alBIQSs4QVUvRFNueTF5Qzc1RjlZaTlseXYyV3hKMlIvWGY1dlJyZGhDeVY5QVRVcGRWQTEwTTBHV3YyZ0FVZzhJS1hZVUk5eFlQc0hXMWxHUXR1NUF4cHpsUkswaUxYVmV2OGVHRE02VTZhWDQxQlJZTDZIOEtTNmtncWJNdlVtTk5IK3grWnMxTGlpdUxTN01jQ043Ui94ZnFxNGUzbWNCdGNqTXd3OThHTEVsZXV5dDdwa2R5bEV2aXJvY1NDcmlQSnJBK0NBc1l0Y0N2UGtLWU5uNmVENkRZaVNpZGlyWVJ2dW5qejUrWUk4RFU4ODlaZS9rZ0s2N0NjZW1valVHOXdpVkw3S0xqQmgrcjFCQ1RSaDUwOVVsTVJKNDIzVm9CeGVSczRGVnJOS0hnWm9DZG9ZV25IYUc3Z3FuRldEVlUvQWFvWFhRblJiQXl1SXNCMWkzSlhvbDFvSHREdnFnL0pFWEQ4aFRYcjJnOG1TSjM3SUgzY0x5b3hmR0lPOFdHMEJXZTQxMlBhcy80OE1SY205Z0N6R1NmcVVLNnNXZ1A0Nk9FTjU4eDBUb1NOVW83S2hLT2FITjRvbTNpQU9lRGx2MmhyVnBGM01qalNJMWhiRTZpUjlnejd5YTU0N0NvZkFjL2JJYnoycHNmbisvSXdONC9RTmtNMGNOL0lxL3UyZVlVQXJtN0N0WnBXZmxtUTlKdlZaeTJiUWg1MkVrNzIremRHREV6c1JJaFdHZUt5SStmeDFtdS9jYnhyWGY4YUNyVDd0OWNwYVpCVXdqZkE2ZnpWVWtpZXVML3ZIR0FFdkhEckxPemdNYTB1T3FiY01McUNMQzJZdkRJcU1uS0w5ZDJKbitwYkYxbGR4T0pqOG1nejNsSkE4d2pHMDN4TVZxU1VkaEFEOCsySWFqVy94K1p1b2dzc3E4M2RQQXREa1VLYWpwTFZ0TTI0cko1bUNLVVBHeVhRc2RuOGdOVDJFRG9qckhQdXF1aGJISmZteTVzTnhuYy9iK2VCY01zcTV0N0tsWWpZQXgrUzd6UkJUOHFodDk3UEQ3Tm15QzA2bi9sblU4aHJzK0VSdHRmYXdaZ3VqcFhzdHB1SUhOV1p2c29RajJTZGVja2d4aXZHTUNpaVg0cEVmaXRmNFZLWVdlaHd5NnVzdFF0am5ZN2FDaGh6a24ycitSSFBrb0lBNGhsSTFmcE9yRUtlYVJ3ckNNYjBiR29JYWxPWFZvOXZPWTZRbWNnTTR6NmlvdzNyL2x5SWtOdnE4RWhKWi9QVlJtVmxDVXBRSTc5VHYyV0tLVFV6alRaRmduWEJZaUt0cEhPcURxTjBLRUxwUXNZSTlhMkFPZ0tyVlBPS2VJREFLU0hWTlFnYlNBVjdNREtTTlZ5ZGtNUjNId2c0TWFrMDJVK3J2RFJ0UUJQbUx3OUJEdTEvVUpPaERQVkhmU09nemY2Y0x6U3lkSjRJRk1DM0w4VDBiZ1h0SE9jSXBkWXBwaksxbEViZDFMZHJ5RU9PL3cxRTBxY3BldkNBUHJyQ1NTdEFwTDE4bzBmd2tobUwxckNRVThPbE4wUVA4eGw4YWxQRGw2WmRETVBvZGZwUkp1ZXlsaVRKSDY1TnlOT0ZyeXorQXBqYXRXNmRJTzVFakh2K2V4TnBOY1I5d2JlTFJwQWJaSWVvRGVxRk55RWYzVldaOHA4SWNiaGF0U0xlMlpGRlJNeUd1RlhBMzFIWHhGbDdraGRVRkdnK0VGWmVPVnpLZWFpSVdPOGtib05SenZsTGp1WnpqT0JidEdmcm42cnQ5b1EzR0wyL2o1N3dKZXArYXVxLzlFV1F5QVRRL2N0WmhWdUlyWUtZVFQvZVlRTURwZkpIUjJ0OVV5UVFLVFNjSVcwazJhNDF2cVNjaTE4L1FFakx1dVhvQVNmZlRVdTg0L2MzMkh5elhhUEhYL0crUnBrUS9VNEcvVUpNVUJEWkRhdE00QXNmT2dXbkpNTStHTDAvMUp2OXl1aEVaZGpoY0hVeG10OHhzSGVhT1RZdEVyNTU0OUZ6WVM2aE1obW84em9ZL2QrbkVFWjdLNVpXY1Q0VFYzelNxdUhjaG5rNFZuOFMvcWh2OVl1L2NZMS9xbFRvTDJ1ZHFockhsNkhyVFJ3cnFJcXVjODJFaXJISEhzRGdiZGlNWVlTQnJNdldwNGlaRW5UZmQvNTJpeVdzYVVFWkJxazRoeS9VRXV6VnpTV0dXNllTc0FmU0pFOUNPLzBKMGhuRTBWVXBBSTBxNXladU9UdU5vR0RQQTAwejRHZUp2akw4RDJ3MmFIRlRvY1lKTWJhZHd1UFpud3pEQUEwdm85SWQvRVAwQmQ1WlNlazZaZFkyeFQxUURkSHd4YmphT3RxUXZ6Ly9mdlM0eEpDREZybkYzbzdaQXF3cWFUcCttS1I2M2NSZWxzWklJOGRLbjJQL2drOVV2SEU4bEt1cHJZckpOeWpZRFgwdm9za0gxYURyL3RMOHhpbkV2Uk5ycXp4ZVFyN2IrcTNjRENkbjRmVnFtN2oyV3VEZ3Z0aGcwbko0ckl3ajNOZDdSY2FYbXE4Y2dXc2FmWFJkNXl2d3JaODBSOStUWW9adndwcS9WVFRZUHdHVGNnUnRtWlFBSmRnbUNTakVCQ2diTDA1cFZHOVNtM2JUYlN6dkdpaVZ1VDlzTmZEM2xrb05TMHgrbW0zUTlRaWNJRHFMVEp1VVhsaUNTdGRkOWRuK0l0emVFRkVTZWJTL21idW5EQ08zUkNua0ErbjFxL3dVTkJNOXBOL1JCVncrWkxWbDF2SUVKWkZCeWxhOE54TkxaSlBGT1pTS3JPNU51WTErWnMvUXhTaWE0bWhSSHEzNkplTXljVHpFL1dSbzgydjF0UktvK0lIYTRrUzlvQ0c0V1Fab29vM215L0hzTU9UVHUvQTloZnc4ZG5yVjV2TkRNQzRBck5hYWNTbTJVd005ZE5pKzNyTnFtaEczcDVMTHlwc0p4Qm1VbldldW8xeVVNb2JqVEcwOXhGTVNlNkMzZlZIYTJ4dnRvMDltTU1IUzZoTkIrTllpaHlhTWRQcW9jT3grTEpLVkRrakxCSk9tQjVlbDZ3SHpVNzJyb0xvaW94bUFram5Ia1k1cnk4MkxiYlVTUjJLOHpzTE1VYkxnNTFIRitzNmxwNDdJNmdrb2wvQy9BY2lidVV2RXRKTHJCRXEvak85TzlWb2pOdGJsMjhkZi8wVWJzZ1RDeXpHcitJZzRQd0JtdFBVKzVXRVM4Q2pxRFZMUHhxc1c0UVNzaHpESk1TOG4wVTYxVXNhd2MvVGIvVm13SktuZXJONFY1a0RTT3JndmpzdS8rWTZLSWFVM01zN05DRWpBcUxHNU4wNEZPbktjaDRKeXpOZGlZK0t3L3dwdmRMUHhCVkJ3RGNZZmJtRUVlTEtUa2x6dTNyajk5aUFKakdWTUFmRE5TclhVSlRVNnI0VnhGU1lvY3ptQThwWE96QlNvanZaOVNwVlZiTmxEZzJTYm10SzNJNy9vZ3VUb1Q0cGVCYXBMQ0JtM3haTXpMODdidG5TVWwzMG1NNlRGSW4zYmdYaWxjQ051aDBLcHNyOEhTYmN1RUpOa3Njc2dPeC9VZEdySWxpRmtYMUlRYmxmQ05RVlZKbm9SM095SDJkK21SNVZhOFJGKzFYTXBIbG93QkR6anNBY0dtL2dXSXVwd2VZY3Z1V0QyNDRreFVoUXRQaVJmOUtjd0lSSmdzRXNaSVUvV1VFa1lnUTkwMEtaWnp2REl2emJZNHFtcWIzU250ZldrblZaMXJXdVBLTzY1ZTlmNHlYZTZCL3ZvbUw1RDVyQ0xiZ1V6SEhVVXlKQ2xiVXpON0VGRC9XVW9vMXRKY1VqdHdKVkwxZmYvR2pvb1p1RWd3Ylo2eEozdFlJQ2hsUHRDb1doNUFSekI5ZUN1dTEzOEkrd0hDMWY3TnBVMjZLYzRlb0k1YzBuL1k3WlRTdlBGSVNxZ1FxUVhGL3I4WEtuV3BlUThFQ21nOGFFakZOenFvSkVtZ0JWRE5Gc3BPN1FsOFAxcHFGVGt4empzSEFaMURraHVlQUNzTUJCTmg5R2VPMXJNMjR3aGw1Tld5OENHRU44M2d6WE1rU3VDeFZ5Y3JTNW5tUjM2WlYzcEY5aGswOG91MDV3b1VyWnVLeFVTMzMvUVEyaHpBRmtlT3VMN1RMSUQ4K2FnVjFVdmlmQlIwTEwwWEtzUzdaRXFJU3BwWjlTWjFJY3R1MllKSThEVzJMWmdCSHM0U3ZSd2k4dXI3YVdmWVM5RnVQSW9LZXd6UWxSbnpKT2RqTlZoRWt6dS8wOXk2cUVCZ09VcmRkRmlVL005dW1RM1lFR0xodnpWeU1kMUlWWk9lSk5BdE1MdVFsY2E5ZHJFVTlpRFRwdXYxUkNXRkZITEJkZ3NVck9PRVU2Z09vakFvZEJOc3hmSWVKSWNrdGtNS280S282Y3F3NTkwYVJVL0VOclMrbXVLRmg1Zms2c0wzbXNTZ3ZwYTcwdmxsZ1NIU1BZRzBnZUVBVW91c1V3MFRKaWpsVmhidlpSVkRtK0cxMDlIaTFFamJaM2RaSWNDSnk1OFFIUWNnQU5xRXUvRWlIN0RYTEtOcnVXNklqeDJac0c0RkxxNWVXSVlNTmdSR3hpZUZvdWtWZHMwUklNRGVGUjFSamgxR2ppOHdINHYvYWtGTnVBaVlOaENqSE9wblBtRjc5a2N5dzMxVjErQnM2TnQwWFdQT2tCS1gwWUdtR3lmTzFKYWE0SXRJU3RiTXJZZi9OZlJsb3RhUlBUcnI2R3FaLzByT0NjMjRPaDA1NGNHei9BU1pyV0grdTZhcTBXWllQbTNma2FjTUtJVlRVL3pNdW1KMmJqcytyZ0o4OWVDcFRxUzdURFk4MnA1d29EbmZKcEJ2ZGxnZE9LTksrQkcydDl5cEszM1dzVWVIRC9DSlc1M2lueG83bEVJNUV1ZEVLMUR0bXl2RUk3N2pOUWZ2Z0RRMWd2Y2NoamtVWGpPY0taeVpEbFhXVzdiWEQvMkdCam9tNTNOWk9vWkRFZFdBT3Q2QzMzMmIzU2tUMWpvMjRMRjVHZWZLY1d4a3FZcjByUFpyaTJ4NlJtUEFQc0RIVlNXSS92ZkZYV2ovZndJYkNxQ21qQ3JXajlIeXlvaFdmMVFCTWV5dGhkVlVZUythNFlQUy94NExzeFRlK2tmVUNvdlhhMG4rT1ZicDh1MktOTDM1dmFmbHg1QUF0L1NFV2lqYmU1QklLM0UyeGZKVDNhL0IyMWF3R1VSYjlzSUZ0Si9ydUg1L0U3b2hCUk9BL3Y4MHloeUtQSmtDYlVRRzZaNTE1TnplMmZ5OCtYampSdFZEYW94dWRXeHQ0N2hyY3lzODFOZkhRTWxoaU9HYzVjaXBHMTZMUW04amJNN09jY1YvVEpGdmN5UTg2R1JPM1lEalZiUS8xOXVrWVBEcUE4YzYwZnZVMDBBWUJJWk94UWZuODlmbE1vb2hIbDlhdW0xaXJ1MmlYbFh6aGVqWC9KR3B2aldpOXRJY0VzVVhVVWdJU3N4WTQ4ei9Hd3pNRUZMT1B1cmtzTEU4bEFaVS8yRmJYekt1cWZoTHVYK1Irc2hOWS9qQUhPajFjaHg4SFd4dENQeXBpVllDOFhNdmtGMmI3MXZzSjhRZXBTbzArclR0bG1vcmY2dVVYR3FiRW8xeEpKMTlZYmtBYjAwaE9uYkFjRkJaMmdweUdDYVN1OFJabEpMNVZQcFN4UEgvbTVSK243STlTV3c4WGowYU9kYWMyTncwOW5YaHNMWjI1K2V6R29CL1VaYWNYdDV2cll4cUZGbnhqdXBRMTlJcU16Qnl6RktweVN6aFVkSjI4VU9NZTFGbk1hZzNka3V6TG5Yc1REQXdsM3FmcjdyQWdlMnBnZkhhOTdlRnIrOHRrOHBOSU9ocVlFZzZtNEl0N2dHRml6NDJQa2dJYWFMaHJQS0YvRFNUT29VTkJld1QyUFdyOWFqL043MUU1eXZJUmszQ2pNMXhaT0NRbGk4cU9nVUgvczgwQytTditYNlp2aHJhaGhuK2VSTndGNjJNQ0oyUmd3Z1pzSzdsVVlpK3FlZk51YjdZMzlGVVdOY3NwczVMeHRWZTNLYjZBOGZDeVVyQkpEZi9TaVNsZEsyS0pKL0ZlQkMrYzkvUi9MTytNdGl3dWt4NEtmcHoxb1IxR3FkVU1tOWVaTzJqS0hvb2lUYzBoKzMzcFB1aGppUEZGUGhlWmhXMGlpdkE2NDROZ2gwa04vZzBjR0J0VHpORHdhdGY2R0p4ZTVPdUxJQnJhS083UjcxUE5sRzJUTUtmRDB4QWdPR0xaTjRLcHIweGRsMnBTVjF1TjVsbmFFWW9hemFIMnVTUmRZcWNjV3VodDVxOEJVYlVPemt4KzJib2pjVDZTR0h4eFo3b0dVZlZoYmNkenVEOUoyUGlPbkdQK1Y3bklMamhBb2VtLzhVOWRzeGx1RjFtVWxaS0p5Z2x1dWVNS2h2ZHIxcEllQ0ZEYlJSbzB5Y3NIZjl0Nm5hbWN0QysvSzhMcnlEaDFScUhMYXVCNHNrOU1oWEl4Si8xUjQxdExVcXVoZm1SRjRENngyQU91VjBBUE8yWVRjMTYrSjJCLzhmdDVQK0pRSWhhN1R0bUNTUlR5OVhWRGs5NHdOZS9QcTVQQ0RrRk9kdzROM1hBdUNhbEtKSFlDQWs2b1FUYVYzVmR3dmxlWkFqTkpNdkc5czI4TlpyTDZmK3FxRmt2Qjg0RldEREFldjNoc1FZU0FaRytIbUhWVDA3a29oMjB4R3NyQUtGMU9kVEF5MFVESnRKekpnejcyaXVudWNPS1FUY2lnTExoUG4weXY3WmVXeDl0dVFlWWtiUGJkS3ZydlNJV0d5UDNod3BHN1RlOVFBSWpXM0s0YnZkZGdBdm1zVzhTbGo1KzN6WHFTcHJ3R0wvUDdwVzR0dmtvM3hvR3RXVDNPWjR1dkR3QzcwWTc0ZHhlUDh1bHE5Tkx2SFBuVFZiVW5ORW5HTS9NMm5JeEtBOENWMi9NeG9vNmE3VGJ1UXIyc1EzNUtKMlV3MFZFVU1JVHlDRmdOVjF2NTczZkQ0SWk0bUpLdXdvY0k5a0tPR2dBelRqQ2VVakp4N0dtR1BSR1UzVkR3WWFBNzdYdEtvZ080VmRTd2x0Y3djVHN1QTlsVXhac3RSMDVqd3Z4VXRHbjUrMHN5TmhUK2ZhZFJpUUNoVFEvMWt1VzVzcDNoVnI0RW56NlJSS3l6SnhYWXJCZ0pWMEluaVJVU0E0NUhjZTJiMFpZV0FlV1dsZTdpVWY3KzFzMC9EdXQyeklEZFVVZFZLVitLZm4xalZFbjRNWTA3ellPTE9JU3gzUEMzbi9CUEo5eFRwMC9RbEZzUS9jQmQ2dE45QTV3K1RTVTZvaXNaQUhGRWc1eUZiKzJrN0hzUjJkTThPVkxQOTYrZzFaTVBhTDZvYzFkTXdLZFl5STR4bVUvaE5EdWRGVEhCS3dnanU5dW9CK052WnZrLzV2eXZoZkNGYnB3TlVJS1YwSUxnQ0YzV2dxWjB0Q01yaUNnODJ1UlA4dFBaY3hybjlpUERmaDZMcHhLNm5DR0J0QmUxVXI3c2VpU2lXaDluTUo3aElrZTJOQWRndXZxRUE1VVFTZE90MUhRdkRYM0pjdkFIQWRGSEVKd1RobFAyUVhGSkpLSXpBcHQ4ZUVnbTFsblVoeWJzMlN3MlBKYTJMdmJaei9kN0F1TEUySUdiMDB1bDVHZjBubHdGM3dlS0UxZEhHclpIRFRSdGVpQzhTNkhSWllaWTRwSHBVKzJOMUlyM1dIS0pqOFZOUXhCZDgvYXNJYlQ5TFMwK3BxdURUanVmNTBCRTI3TzJRcURLL0tJVW10aUs1Znk0aWhVTEdVdjYyTDJnemlFZUkyODF6QVc3OWo1Rnhwd0VYZ0hxTnJkNFdjR2N5NkJSUGFhVUVKL0NJbnZQTWk1Z0Z4WXBJYWFMQmtQL3BzOVFuQWhQNFptTXNYVVV6aklaY291Wis3bHRuUDd1OHY1aGpDNzVRU1FnWHVBeHV2ekRiblRPYVhRWDFrL204a2RXVzRWUFFYL1R5Y29nZjh2VG9kQzBPUnBCZU1YUDc3UHVZRFNsWDJVcGF2R0NMTmc3d0kvM25ZU3FCaGFOaGt6UHNwV2w1Q0JBSjhIY01rT2NXdEdPTGthOFVUWXRiV2JZbzFtZkh5VmhNV2h2TlpEOTB2amR4SjVKdVhCZ3lmMjZwNm5IcmlsbTBJaHBFeFdrb1BmaFZHSUoyN1FuYmkvTGszaWpKWHlKRnZXLzhzcGh1dmpQMmZzVXQxY0piWVdleCtSZkNNektRcE5TTE93ZzIyME9mY3Z6Y05VRGNvaWRROXpXUkk3cnZtY1JNbW0yMFR5MEpxQzd1U09Rd0Z3L0k1L0QwejBsYm9wK2x4STJFR3ZpL2VVWE82SGg4UEdEMzgxRVdobUVmOGEvaWZEYmNSamZuY0pLTGVKdmZNeVRIT1AyNGZnM2xGVEl4SENDL0RwN3Jic2VrUGJEQUl5b2Y4L1FmQTVjZGJic1FlV2ljZkRPSEJZWmRjVTdNWHlVRG1sRWtTdmYzdlYvUWV1R1MrbkVKcFdZWGtLRUN4MGFaNjE1T0ZYTFJET2FFYXNsL1dXdnl3NWUvTW1PeTIwKzdZSmFtdFJCSzBFZkxVQk5saHlDRzFZUTAvd2hjd05Kb01WZ0dlTFhjMFY3ckdXakx0OFNMS2hJVEw3RHJLNU1mcDNzM0tKenNrL1hCNmtOZEE2OVB2NzRPYUJiclpLaVVGMlloNkt2OFhKcTB0d255Qkk2RlNRMUlZNGxKZkptQXNibDl3bWJhUWg5dHpXWUtEaDJWT0lkQmFNQm1RMHBya3dQNUFiREdpbWJrTU8vZDVaQ3Y5SHNSdGdTb0JMUENLSGhKbnVLZzgrUDllR2VKVVdkMzg2NmxOZ3NjWXo2b2R0MlFxdjVWcENWNitEaVhLM2J3QzE5Zy9DVW1FOElLN251WThkd0FIc3BNQjBnZExaOWFnWG5YQ29kOXZVSDZJRjZmSVU5d0w2SWhTdVNnaHFveEtycWxwbSs5M2FMME1YNEp6d3k5amNyK0lWY1ZnRU5OM1VGS0UvbElESjJCZHB5NG41cTJVOU4zdlk2dlYrSkdpd1ZrOG9VelZkQVZDeDhTYVVwcUNVL2oybXpvRnZMQTc1MGFLL0I0elhka1hRN0tJRDlZbFZHSm4vWmcwcmVrM0pKcHNJQk5vM01yUXM0bXZCYmhmbUJjb2M5dDRpNCtlRFFnV2ZvbGsrazNiUVJ5YWFXTG9oWm9MYWN4ZTY1ZVJZOWMwOWZnaGZyeVdxcnZzR3FyOVBUWUV2NERjN1BNQTU1aVN0WnNyc0wxeE5nOVNFM1MrZzg0VzZjQWJuU0hobnhnaHNMN0NEVU5nM2x6MWJPL0h5OHcxL3BTNUp6bkhaR3hOQ1NiNW9lR3RaN3dCSEdHU3dXNjFhOXVLZHhETE1hZGNkcUlEV21EejFXZ0dJR1VWRG1MTTlXSUd0MTgzUmJHUHQ2V3IxVUxJRXV5YnBUTEZaVVJYZnJnRERCdXZESUJNTW5TOWxZNVRnREVNZFIxZWZSaHRFazZoWVhHY0ZUdURpUnFnMmI1Vm9jcm5YTlpOTWxidmdWNWpXeEhFT1Q3S3VkQXhRY0JDMWVKbUxaS3lFazc1Z0Zva0k5OWtnZVlLTzN4Sk5GeUEycXhvaVhFQWpnOTJGUzVQNEU3QTdtLzNwVmIyQThTUHZxUFVHbzJZK2poZ0lWNnptQjBvT0QvWFoyM3BjQU9RVjN3M3h3Tmo1bVgyUEllTmlkRFRSZXhDc3UvVGVFT2VKZXJvNVpVL1lwQmQ0S0M3Tm0yMDdIZW1wU1dpTTFEUy9nSWZXWXJuWWZ6RFZnWjhSb015WWVMdXN1eUNyd2hCOXhSUCtiM0VFbTBDNXBNZXc2WVZ3NjdaWTIwYy9TL2l2MDdqSGc2Qzd5Ujh4eS9wT0lZeERscFNmR09QVXVrK05tMmtkNTBLeTBBRkM1WC9jbTZMVHVOQmM4ZmkwSDJ4TGhlMjl3Rm5wTHZtZ210UlkveFNRcnNrcG1JK0s5dnltWlBmMSttRDByT1o2ZGIyM3BOb0dRaW5tM2hjNFhxS3NnS2hrTVU0cDVqM1I1YnNYclduNFNndjM5SllmWmZTWjBGOG5OenlROFJXNnJycm9idUpDT2piZHJJVi9pUU5uVTFlemdqQlVlTllpU0pKVDBKMDNPSCtNVTd5LzE0TFcreUhYZFBEK3pLMDdieFN3TEVGWnRncEM5L2toekp3dUIrMzdKK2tSakQzRlQ5Y291VmJFV080bDg3QllXcWJPKzZwVXl2WlFlM1kyZVlSY0hwc3pzRnY4QXlhVGtNQzhzOVo1M3dmeGRZa0JWZ1RKOFhjNFFhK0tEV2psWjBGK240T25DR3M0cmFnT2E4ODhDcE5tRFBDR2F0dEFJUVhBWk1ybFJ0emZZWmt5aDFSQmY4TjBVZEg4cXNCaU9GQ0JzcVlieEFRWk9LM29uK1lhQXA2OVpQRmxlTE9EVDVNZjVpZm5ZWUJSZHVEbUlkVTlIMVdOekZHVFZzcDNKOXNiZzB3M0I4R3djczRtM1h4T2QyNWxXMkRBckNDY0VOK2ZRV3VYUE0rMUU2cFdDbmhSVGRwVWE3ajFWZ1MyT3pDWkoyZjdPR1A4MzZielZkK2Q4bTIyOUVEYWZEWHRkUFBQd2FEQVUrTmR4RnY2aHhZS2FsdEJJVElhZXdPYmpzYVE1cGlxN3p2UnYrQTZ1anF1dW9vUEltWStESG1jVy9venVua2xXOEo3NGFWKytCUGxoa1VTR3VKRFRCYnZ0NHlWcy9ITmYyaVhGTVdGRGJlL1hwRW1OaExobDl6OHRKeFR2TDJnZXU1Q3ZMR0FQQklyN3RMS3VIcnlqc3NVcnZOSUplVXMrWFNiMDIyZnJ4WHN5ZmZsbkdQaTNIS2pRZU1icFJyeDFwaEEzcWEveERRa1VOODdjYjJ5R0I4RHh3NzdOMXNqZndpdGtYbHJpMGVVMHBVWXVHWDNCZlphNCt5TmtnOUV4UDI0OTVCcndHVjZQUDRiUDJ4Zys1dHpnWEs2c21XcW1uY3p6Tm5kSm5OK0JVa0IzOVg2WVZVWDF2dm9MUVl0WUJXaTduRDJ5SWY4TlVHM1Vidmg2amFpN2lGWXlPak5RU3RIZHdoNnVXR05FVFZJNjJSTXgwTUJzNnN1WGxuTUZYTlc1NUVsYS9CZUM4d0plZmhpd2JSNnpZMkdZMzZaVHhRRXFlNGd1czFNc2x4azEzQnFpNHNHUEJoekM4Zml2TEJvcmtkY3V2bXErMGdSVDdyYnhKZnpudFRmc1VseWoyZUY0Vlo3TC8rcE91RlZzUUdRZm1nU0RLZXRtY0ovNE16SjJjV1YrNGFoYUVxY2cvSER2emdjcGxINDJIc2EyUitNZ2treXRSNGhTWFRuZ0xMVXVFallHUEs3b0ZBRGhYRHJhT0xFYmJNSDJXV0dhRHgvMWk3NXJBeFBGYjBkbEg0OVNZNjVGZmIxU2JUT3dSSkd6Nmc2SmN0bTJCTXRQVlJvMlh6WlUxM1dxeVRBYnBkd3JiWXIyTjRVZ2RSdzV6ZGc1b3JybS9qVlBHbGpwZzNWM2N5eUU0QTRrQnZGaDZvK0IrVm9vRk9nWjVyMld5WkVkR3RtbENpdXFIQWlJdnhMVDBSZ1JxeDh5M1hxWVNRTVFwK1VkbCsrTkZ0OG5ZR2tTclBmcVFaS3JiNzJlRy8rUUNuVkJZSnRnV2g3Wjc0c3c1dm02RXNxR1FmZFZIdXRDMW1FN2NCUUUxZXFCb1N1U2tLSDlQS2VuQStId3hrWDl0dnFQMWdyOENRZWMvN0NjQmxCeWV1T2k0c1BTRDIza1A1dlZaZ1dVMDgxTk4rUEJ5bWVmSjB5VlM3bjNKNkt3UmUvQWJzNGVWTHo2dkFZbUdVSmRCYmRwTDB4UDlRTkVQZk5oWldTSzVVcjF0ZXo5cklUcWJtcWF3bVJjMWxzTXMxaHY4NUpwdUVrcEJuSXVERndKWjM5OFgreU82YnBsM1l0YlV0QXRJSmthbnhGZjJ2ckhkWDJWUFZoWmN1N2h5V01sK2RmOEczaDZOeDBmR3NuQTBwL1BQMXA3WlhCL0w5MS85ZkF4ZzhhaE9aQU9NTytTemwwT0xkdVhvazFLYitnd041NEMvOUluMSsxSk5Xb3JZQllPSEZ3OTVGaXhTbFM2dWwvVkRxWUZXc1ExQXpSZEdXRkthOTUrbTdTVGNZblQyeFhyaXAxckN3cDcrRyt0MXZna1NDekxRUjFNVDUxTHdJRnYxb3hvSGt2UGJXUmU1TkNjRURvaGg3R1FSSVhTOHM0L3pycGtoSHhzcmNHaVB1dm9DYWdJck14dlZyeG44aEMwdFpSbnVtYjljNGV1azM5YytqdFJpa3BmemQyb1gxWDlSaURHOWY5UkoyMGZ1d1BPRVFsVjk2aC9TVGNmVEVPRzRrQ0ZxczRMTmpDR3hPOERzbzIwLy9NL0FOWENaNHZGeVViSXFYTC8wZkI4cTkrdmxnaDB2Z3VXcUxNNWo3Tks2Yy91Z0pYUHpoZEM1am4wOTJmYnZuQXU1eTNlTUhDeHRhUmhITHVWODdnbWtaQURma2RIWlIxWnhLampLUUhFS3VWOHFRR0ViVUswVW1DbnltTW81cnFnR2tKOUc4em1oQXhyYWtVN0hURTRiWnFnbjRDRThXZjhaTS9NOTZ0MUMvTTZXN1I4UWRmMGUyOFA4WHdDT1B4Mm1wYWIzZmNlK0hWRFZZNDI0SDBaVndCMGwrYWFIVGdnMVBGWmMzNVlsYlpkWXpOT0hUMnlpMzZBUVZsS3c0Nkdad2hLQVFsWDhRY3lRT21vMm45NTdOVEdwa1BWb1ZVMWkvNC9jdnY5bUJTZmtxbXdtTGVRS0EzMnNxb21vNTVrcXRnNCs3R0FZd3NDOXA1UE9FYmZZYkZMbTBNOEQvVTk2UjJiYndjMnJWQmZJQytMZ3JRMW44QlhuM3FkUlZ2U3Jqb0gwZ2l0NlR0em5TNHpuUUNTd0dNa25BUWVjY1NoK1VEcjNwYkRTQi9yT2FpN1lRWGMyRGVuOEt0VjQwbGgzMysyMDh0Nmw4TkhSYUNLdzdQYjNEMFQwdzhaWnEvSjc0MjBtempQYXpEWktaT0VZSDB3ZjZsWHBnUWxDdExDVGh2QWZpa2xxc0UzYms5aHRFbUtMN0hpMGsyUmhCdHRLbXphUUxaUGZGVjFCWE00ME5QZ3FxVkQwSU8xWURlUkJrV3AyMjhlZC8yYmJJOEVjWER3KzFpUGdWZW1WTGh0aXpKRHpIamdOaXA1RTlTYnlRUFJ6d3V2amg5R2x2ZVNrS2FLZk12L2MzZ3luakZSck1vZHdTcUlSZGs5R2xjRldZZWlUdDQ4VzNMaGkzQWp3MnpvMVFvODZQVEZRdTViT1ZxTWpiTUg1QXU3T29tSkd1amExdE9CWTNFZ1A5QzU4VjN6ZFlUN2NiWUZBdmE0Kzk4RFkrUDBIRThSSStwT2VkYUswdEdsVXR3NDNjWk1zTTRFb0pzRTBRby84YVUxS1p4YlJKV3gzeXk2bUhod0NqUDFyOUxiOFlzamVGRTB3SmdQR3lldjFBUW5HMG9HSGRLQVl6RjV5ZEdjWDVnQUR0ZDNBYjVadkdvZ3NOWHNiZXVLQU1oSEtlZmRmSkxZMndQRlViUjk0cDgzVThhN3J5TWp1Z1hCaE5hRVp2WWNrQkR3TWYvVCtaaGFVNEpJSGFOeXN5a1F0amhjUU9DMG0zV1Q5RFNVby9TN0NmelVnMUFhdUhYeVUrWlhjTnQ1QlBlRXZGSDBKOWpqR2luNFhoa3VNSUx1RjNhZHB5VHc1WjZrd2FsLzZWZVB1STBaNy9Qemg0ekU4a0lzTGhlYU4rU2t1U1NwWVBzcHMxYjhGc01TeEFWTWhIY0V4RytlTXVOZU83bSs5WW5qckx5U05wclcwNDRBZ0FQRURMeFJEYkdZVDRFTUdHWGZlMitiR0ZCaE1PazhpQk0reldIWTBwTUhoeDRXOXhFWm5aOW1vb3VnQnphdCtMQUJnUWhzZmZPbmcrMjM3WHB6Y3RlRWJsT1JzSFBHdk9UYlJiZFl0TzdUTUVlY3kxRXFEUWtPZzZVU21PRkxpV09rbEdSam9MTnA3MW9lRkc1YjBjN0RubDlsTWI3NXpNSGRXZlJtYnhMUWVMbkJGaWFMVGlHUXBjN3l2UVR1WXEwUmNQeTVIditPNGhRSXV3MElFZnUyUU9pdTA1cTNjUCtlMHEvTTBQZ21UR1JCWlJlWTFSdnMrdm1LMW1RZngrbUo4czZodklnUGNReTd0LytocVJUaFBMT1EwcUtmOXFqWFNpRVA4ZVN1TFFZYWgxUVpsOEhuVTBhNlJleFlNZW1vR1QzdmhOVHdTT3ljNzRhdjhQdE91R1dzYkMraTZQZjR2VVo1c3Z1ZjhkVUpDY0V6V2ExVXJDL1RaL29HU3l6bXhyYnpwNzF1aFdhRWg0VTZlMjZkendYNFhhODJnWnAwdDlvekhlUmVDZEZhbUM4Rkg2ak1kSXhFcy92THc1QlZBd1BCTFQ0MVFTL0ZiaXZ3YXpGV1BCY25VZE0rWVNNZS9JTVFCR2trRFBTWUtSNXgzOXRuMnRlWE1KdGMzZ2tKOXZEa3IzeVBxdXplNXNsZTFOUVF0bldNS1JrOTM0UTZ5Zm41dVdzbEF1aW1JMXhlckx1d3JzMS83bXZYUDMwcnJkemxJNU5iWm1uUUhReFNLVTgrTFFuYzlTd2U5eTZpM1dkQ2pvbUFRdExKdHRrcS9kLzF6Sjd4L0VoZk1Yb3hVUkJaa1AzNkpjMnhVV0pCbXJqS2pNRGNCei9Bc1l2endUeEFzT2tVT2YxWTNXbXFYSG9NbG9BcDNVSkY4QzdtcCtvaVB6dURoNUwxQTlDMlhGeE5PblVsTVhhOFBWTWVPazlIYU1YMHEySTV4UTBGeFJCaFJ0NWZrMWF6ZFh3WFcrdWJJWGMxdDgxb2lNQUY4N2FzbHNPakJVRDJHZFBHREF4MkhENVRjTjc2TElzR0dmL2lNeHNoSHpvdFhUQmJnYSt2YW5aazlYc21nZGt4NFZMeGs4UmoyMUlKR2dIQUdDUEJOOFZtczgwUk9iUWpXWUh5RXRGVVpVaUZFZGw4eGJ5djhIQW1SM2ZjV2dqK3JwTW9LdlFhd1Y2SXcxNllRYjdweHJWWmFzYnJBSWg0V3hPa1dDWm81dVpGZ1JvMmg3R1hSSklocWdKVkxpK0ZjbnZIRmtYR0lvcXR2QVB2dGpiVldYMXhmdVNTVFRGSitJTElQVVJOM3U2QkJZVURvdW54R3NEMys5VHE1QVpMTytZV3N4elJoUVVHSERsZnByV2c1VUM0QldmTlpsWHZYTkpSaU8xSWZBemg2VkpmQWppYUNSMmhvUnpwSkN3dlVVSWtKUkt0Q0hvb1NuSnBvWXEzTFZRMm1DTlZMKytlck1EZzQ5N0d4K0ptK2lUR3VpWmx5bDNSdnV1bUw2SndUWXI1OGRncy8rWWhtWXNkYVFOU0FmRUVHQXdPMmN0SmRaeUJ4Ly96RHgvSDlBWGRyNm1sQ2lSWlJVNFQraWlqdE1PWFdIbzVKTDRDRW5ocVFVZExKOEZka2RtRlR1SVJaREg2c2Z5eEFEenNLUW1hamV3VWloOHpUOE9pSW41OFQvSjFTdmhGZ3lYOXBBQU5RY2VIU0dQKzd2YTFmSFY3NzVvL1lZeW9kWEZvT21CUWZ2ZE1YZkF4aEI0Nm9xK1g0bmJzVzNtOVUyZ3ZlVXV3TEVLblE5L1QxY3RaQzAyVFJVa1l0SkpSYmIzY3l1S3lWcUtDLytmYXBDeFR4WkMxcjVXcGY4ZVltRVhKSC9LRmdGSm4rUjJIUnA5YktKZHR3SkViL1JXZktKR1FKSlQ5U1dnY3NrTTJsaUJkeXN5SngrTm9mUHFNVXVRNTRldHM4R0xmZk53TEIvM2ZFSzE0N1FpSEh3TlJCdURORVdPaEpFaFJvN29BVytCd1JUSlo3dUs4MEtuWVhPL1hTbjA5akltUW1yWDZVSVhDODFNdGxvclprMkNSRXJxZkxrMTZiSU0vSlBqcmhaeGFtZTBZNDMrNDZCS1l3ZWdNT1RJQWh3YWVQSWExRlRMbVBocWoweHFQbFpEVGpQcHZ6R3JQUkZ0UmwxYU93ckpXcFJ2L3VvN0pRWmZlTlZCSVErZUdwaW0xVlhOUnpTVTh0dmo3SVNGL1FmZE1paExxNm9NU1pFYkJXMWtERmoyeURSRjR1NzFKQ1NuY2N3M3BZNXlzNE9rZXF4VzgxTWxMamcrczFXNC8wR1c5Ym5vZ09vaU1ZM1J6cGtDaUVMSG1BaUczeXJVb2VLL1VER3hNc0ZTY1VkT3ZJMENGTTU0Q2J6Um9TRityMU0reFM5dnVMWTQvQ0pybDB1Q2YyRlNERUZQaDNMbzlrUUZMdTE2aEF2L1l2L0FzSTV4VHUrYWtxTVZWdDVkT1BhOEZCOHVEcHpSeEJlVFBSb2VFMmsrb2tSbnhYSnhxLy9WSHBldEtuU0JZSWlWWnhtUHQ4bFFMa25jaUl1WUNQMFhFc2FIdTJDcXQ4SGVDMlprREJyQ0RvRnZMU3g0SmNHNVlSQkhCU2NwNTFEeVN1c29HL01tMGE3SUpEczljYlIwakR0SXM2MHFsRTk2bnNrbHdsa2pCSXc5bTdJOUVIMmlacjBsRWt2S051NTNaUlZDaVdsUDZjVmFZb2RUclRSVllWL29rdDY3SmNJZGUyUURjWHlDWTllUHliZHNUWnRadWpLRklqUFM5RU5nTG5EekJmSmdpOWJWU3JaYjZzOUNlUjd4dytWdG0wQ0dEUkVlSkw2UzQyZGtydHU2TGlYbXI1UDE1MGFSOWVPK3RPNnh0MzhTeGViU2lEUS9wRWJweWVwTnhKalFYOEpPbFh5QmRtakJnSnltWjE0dDliaXBxTll6dUZKUE8wcUJLOVFodHNDbzFsaWM3WDhMS3BCbjUxeTdBVDF0bnZ2QTh4VFd3MnpQcEFKSC9sOGVaV3paaWtReFlZMUdxSzNUMjkwOWRWci94dkp2SDNVSXgxSlZWNEdNOGFnYjkwUDRmVzV3M3dRY1ZvSlJLMnBsQlV0OUdTbkEweGlJWVQ3V0tmend2MU1SVnFpbmh1cEFYRVFleE9COHlZSzFYVDRacVRDaFIwSEVLQnljN3daRXFxd2hoMUtHN0FSdUszWUpCQnZ3NGwyakhCWWdLVFJEOVpmUCtIWVI3NVBTUkY5Nzd5SzNWaitDYkF0TkhFdWZ6M1AvQUhCK2ZYdTdmN1VsZVIwdXNSRjROWGYrS3JZK1VKeVo2L3ljZmt5TmNmeXhqOUVBYU5CVHlIQ1kyMkxFajNwanp1bHVhVFVzLzVibnJXZnlaWUhlMXprSWhCamEvVGdKK0F0WmcyTWRmM0NhbU5xd2xiV0I4QnNkM3V2SmtHanpxT2hVcTIrdkd5NG9pd0pNUUJEL1pBVnd1UlhFTGpjRVhpb2RyVng0MmVZd3ZHYXJCUHNBbGZCU1B0SVJ0MlZGcGdBMTVlVW5oeGJYdjc5ZW1SVXVUZVlKSXhQYzc3Z1lDTDZQTEtoQzZzWklycmZpbEp3KzRGSnUrbXlMWWtPNnJLR2x2VUsvV1N0d1ZVc3F0UVNLbHZRajhWV3BuOEpORVZJNHRjNzJIRXRTYjZERzdOM0JiemV0bEpKeGptTEEwc2dHU01OWnZiTEszNFVYWDZFSllpNEJ3ZzFwNzNxNmY3cHNldDdQWXJ4bnZnZVhidm5qTkc3UUErYnAzeldxL3dRQkRLbDFCeVEzM3NsWTdwSlVwVHJvd1dFVnlscG9sRURzb2pmWitxYzFuRGE2VmxwVVVrZ0U4Y1U5djkvejQ5TVVleTdMRFQwYlJIY2IwZzlsajh1TmltR0lpb09oMm10SzEzNEhFTmZSU0Q2RVpPQUpwc2tXcEhXZEllQVkvZzhYUHc1RDByVndkeUN2RnAxQlNQbGx1TUt1RlBKOGZ1a2xaL0RJc1NqbW0zczl2dTJaM0x3UVlDeWdQdG15T2ZqN1NKVVpZS1dKTGMxcXo2NEJ4R1Y0RmdvcGtDV2RDTVA4WEZoWXhYcjR5eitJOGhYcW8xbnVrZzJSWFdqVytGR2w5Y1lQUlhBS01JVi95WGRiczRPSVlGQ3B6d0NIZHFuQWhKRWpUcUJUV3hXWitQQWRkQ29LSnFXc3VtVmc1R2QyYk10OVNKNnk2KzVFRHY2RzNhbzNKSkRoTk9zR09LbU9HTFV3bXhxUjM0b3lEQjE5L1FuTDNvcGVxZ1k2eWZFUUx4L3U3cG1ZSmd3U24xejJMRlhKOEQ5M1pFdEw5RDBPWGIwNFZSYlpxUlJjN3lkN3ZsK1JjUnZPM1QyYjREaTI2ck1ZK1Jzcm1rYnBxNVNYZ1lrdU15MGFrVlMwMzIrK1kxa1kxdHc4eFhTRFEyS21LZ2RMVVRhSU9TVXRLVnBlL01DdkE1UTlQcmpLa1ZnMkZXYllpRWVGaHBZOGF0QmtxSnp0LzhQSi9UL0k5OUlMbUNYQWtlOEJxUkNaZTdOdndMUXBaaUhJSHJjVzA1VmQ3OXRTQ0FqRlgwYVBPdnpoV1BsK2xWVTFEZSszQ2RCcmR4dlFHS2d6bFh0QzdFL1NvZG9oeTRaWVJkUVlUOEdoaWE3ekY4SUlJa1Z6NnN5YWhtUUltRlc1cFl1OTZFRGhLVzZ4dTk3REIybXpNTnpmT3JFZkZTcENtRXBZV2JncUZMdWJXZCs5R0RYOWtYRXdvTEhuTDBudURUZmJGSGZGZGx1UXZBd1lYUzRwdmN4MzBQUXl1MmxkNkM0NmZhOTR0OHdJdTVSWVVzTDllUkl5YmdLbktXdHR2Y3BtZGhSRFB2S25XMGo4TE5YNVJTVGR4SFNyQ0crajBoT1VjTitwOUZXaXhteEdSVXNnSHp2MzFSNW1JRHVYUkZpMVZWTXFmRTFCWkU4ZkpMZXFqNUQ1MUpORGNRKzZVVU1XUllDOU1ScG9MOG1OelRaTERrc2J3cGlpZVNPMWpUTkMvVUdIdmdjS1ZPQUhZcXE3WnRFSStmc1RhaU9JQmdGYnA0UVJLOEZUbys4K0ViaGNZai9STGtqNjkyV0h0NmM4NGcvMTNlamtycGhrT0FsdDJnN1RSSE1JYVlXSEgxc05nUTVzVHJodUVEeGhSOTRUN1U0MkZLK3ErYzFxRzdTODJ1SGN1b203Ymd1c2ZCS3RLa2JIMWloanAwdWxMZC9GK1VRcXNoY3lFa0xuVDBPT1ZqMnhjSVFPaEJRUjh2SllVeE9NZFhkaXY5cmczZjk3YlAxSVNDZGtSZXRmRVBJcEZoQ2RMOUUyMzU2NGpwc01uUjhPQ2ZENGNsNzFQcGlsYStqR0Z3VCtERlZ3OURZazZiMFNiRmtyVjJlaWpYUEtFcURKd0NOa0lDc1FFQ0I5QnJqR1ZidVJBT003R1BxcjMyNWFxZmQ5TXU3VmxGZUxoazJKMmVPT0xabWV3MFR6MjFPazBybEtnNlNUVEFENEJJVzUvSFJkUUtWV0N1YUxMZUpXRlF1dEE1QXZvVERrZnN6SlVMeDNFV1A0QVR6UGxUV3JUT3ROYVFuWjFFY3lDVGVsendoV1cwVUVFZk5wQllGTHlISjBzSVN6Q0pWVzZZSVdWa0dYdVNzN2RnZWlUQldEN2FZU2ZvWXo0RC9BTHovUHhVTFEvTHdEMnYzNCt6dGxVaHd1SUk0bWNQQzhHRVZYWlNpa1JjVHFQb2lHRzVZYll1NHJYNXM0T1NDbUFyejRWdTI5VXR2TCtXWFNCNXQvaWVIVHBQWmROS0ZTRFJmMjJEWFBGMENtcFJmQnZjeWFJRU96WXBKYmRDZzAvOWRNeVlHWS9IZUdocU82SGs5Nm9QNmVEQ2tvbk1tQkRFcXlQZGIzalJiQlhhdkF0VnIvQmRyVmJPYmhoOFVZWWRET0g3WnNGTXlzRW5RSnU5U3RwQmZvMU55L0VoaHpRVGhkREFRb0YzS05JcE8weDlPc1ZyaFlxL0VONWRBbVB5VjgvQnlqbWI1UG9xQ3FsQjdkNVNseHY0TkRVM01adjFtY3l6c1dSMjA4L2VTdmEyQXlGVlYyZTNGR3lkd2xkSHo0cUhRMllReGZPcHdxRGZxZG02bGtTcG9NMGNmb1RQOUVCTGw2U3d0MS9oOGx3bDF4eUFsR2ZlMmorVHhTcWsvRHFSdlZVTm05c3EwN1ZqQ3N0bGpnSzFNcFRnL3lhN1JIZ1lnVnlJQklYVy9YTnN4cUhIU2dtSHhEMWtlNm5tbTM2V2xpVmE5TmNqdGJ4ckFSb2Vqd3RqZHVlYjRzbU5qbkU2MnFsOHJFb1NzQVJUM2QwcmtvSTRxTCtrREdiN2dYQ2Nkb0NyeVhZd2kxNURvQWtHVC8wL3lhNGkrdDF0L0xGY0hsc0kyMUpSTXpCNHZyT3J4TmZReVJpVFJiYkhlVHY0WWpVMVJ4dFpPNTNhQ0IxTVZjMzZiOFQ2NHBiTkVoeUtQUFdpMmdvYjZHSzlKdVRQczlXWUdCRFE0a1o5MWFISFI4QUhVOTlzcm1TdkNVUVd6TGpWYVdmdHF5VXBsMWF6dUljRGxqNHpycExKMllSZ1Rza2JpckdpRVRpK3JxUzIrUnlSWkRIY2dSL1pIU0VFWnV0UFRKVUIrVEx2aEdWODdTRm9VSHNIWmZtVTBhMFNHK3oxbWZwZFFwWUZDZUUvOWY4aUdHYnliZUZSYlduaW50Q0NyTmFvRG1XdXdMeUxvS3hVdzVTSWovdTVLemc4bzBaWXFMbFA3RGQ0bnpTWUZYT0RVTTh2blhiYldUWU5zNnJrQ0NHTHVzekUvWWtydlkrY0MycXl4SkRkSFdpOWlyUVBNem5ySVFjU0ZuUmFGZDJPaldRcXBna2FManJKZkZqeEVNTTZ1YXNiU1NSNjR0V0pjam1ncmUrWVo1WlJtMEt3dVNVVGlWVGxTb0NWQlRKcUMveG00d3RESkFxZXk0T0hGYTMyVmhuMlQzWnJVUnFIRC95QUhPQzh6NXlRUkN2ZnRCbUNnRmkvRFMvUFhvUk9KTDhGQnpSa1FTbENKd1dvK3BRR2xxVEViWmQxQnl4QWpVYmNGUWUwTkV1TUVvbktraDdUbG1INFNxV1BVTFJVUm9lRGNyS0tBSjF0VWFkb1gwdmxTKzJxbm9tOUM1VHNpRjJpZ1U0THRvMFEwZWsySVhuUElFZjJ2SUdWbkoycGxNQ0ZyQzA2MnR4WGpUUG5YeFNab0MySHI1dktBYlJzRXFjNGlqQm9kM1lzVkVsV0luTDhHUk5wekFQeW5rbzRyS0QvWWFIdDQ4MFFrcUtycEJ3ZU1hTXVxYUtzR0lVaysxc3FOaWtQaWZxWjczaS9KODB6RTJPRVl1KzZpV0NaVEdFWHB1cnUyTkJTWlFORUpMREpicWNxaXcxMnVaU010M1EyQ1ZSY1lGNGRzR3lPSWh2Vk1vbUVPeGNMeVphcnFSNVJUck1sdTZSck9xeCtIOURSWHZsck44OTVZbm1xT3RHT202dDZoUEc2RDJVQWRNUUxDM25PWktISkJ4ZmZTZ1pZQmk1akVza2p0b2dmbDBTY0xpamtqZTFnTno0SmJ2ZXhObTRiTXg1Y0VFbGNNNFdURGo3TU8veUtTR1hiRnBpbytNTE1PZ2laNmpxbG5YMUN6Q3RNOWxVRWZiMldHa2VBc2pYQ3pzK1EyTkdvd0JJK2hpdjhQUVY2QU1QV3IrU05QV251LzNHZG1qTDJGVnp4OE9sbE5VbytqcHdIcEYxUWpydXF4eE5kZzhlRC9SVDZ5YmJQVS9OMHpEcm1QN0lqOVlIbVViZGNhaHYzUEYrcWF4TEZjanNNS1E1SUFmTG94dUo3enJ2RmgzNXF1UHpxZGdwNXdDMWp0dkNjalJBbEIzdXF3cFpZOFYrSThRUExQWHM5UkFqZy9keWFmMzNlM2lxRVlrN2pURzB4Qm1JWUI4SEFmbFBXbEhIVjVwM1IxTnJIbUFycTVNYzErMEEycWZsNFVkWkZwUDlOYm00MW01LzkrWlMzU3ZrZE5ua3VsOHFVaGRCUkhZRkwrQ051WXNhSWh5bmd4a2VDRE1jVVZmbWxnSUI0SUYxbmo3em9HTWhPSHAvUFZLZU13bVU0aU9tc2lUYjhrYXArblFRUERmajczc0pzZEQxQmFlWmFhc0hWN3pNcmlVQTFlTEpRcFlMU08wUzZXbnR5QkRzOUFKTTg3REprUDZYUy94R2UrcWU5QU1sZ0g1S3lVay9tSjNIVjJKZHBFa1BpUGRBOUVmVkMrMk5JN1g5TW4yL2hENlorUThuODZ0Ui9CazhMVlYwSjMzekF3V3NGUCtxUnBUaEVyYjdTQVY1K0Zya2h3Z0phVTkzdVJwc3Y1cE4zYkRQUG9USGNhMFB3d1NLaTFlZ1FwYzBXMzVlS0tRVWhFVGJFa0hLSFlyZGx1LzJsTEVPT3FVZVoyUjNnd1RVTjNPREdVeTcza2ZPdklZVWh6dEdQL0lNbFNWT0x1djFqNnNDd3NoT01DalZjeWR1S3FGY2x2RHNmQmFyRytReUVxQXhKdTdJTWpETnZaSTJVdE44MGdVTjlUN1NiVnRyQjlibWNFU1VDV01VZ3JJNzFKc3kyclR4TCtKdE9IQVZQamN5bTdybURxelJlVDcxS3o5OFI0aFg5WnVsbjM0STMyTkxCRmpaUlN4bENVZ1NSaTgyMzZTZ3ovQm1WZFhMN2ZaYVdYcXFpV3BwZ1hIbGNvckVQaEVmMFlSYTJEN0Zxb0h5RTRWclBVTDNoK2ZCVVA0WmtTOEdFYzdzMzljMWtBNUtyMzl0MlRXaFI2OERhbEc0UVc1OTNtNjdWTzgxbmNXZk00Wngyak5iRDBlY1BudUVWWGMrR3grYXVwb2tqT2padTBtRVlCeHl4ZGo4L2hRT0kxRVVoSkJGQit2aHFEVFhESkRRbWlVdXdnMWdtRG5wSnk4enB1UDNJNjNNcGVReW5CRk01TFVmUDdYN0lybWJJWU5MdWdXU3hLL25jQ1UzTHdIQlpySkFvVStrcC9lVUlnT0RnN243VXpnOXY0Q0ZOUEFHM1ptRU1jSmQ1M1VhUUg1Nk9hRVBkUTRrZ1ZYcEZZSWtVeEh2WE1aYUZxaUMxRldPcWozSjc2THFKRjRhaGg5S08xdTViNjRuV044MXlXcUpKcmVqZ1RlMDJjS0hhcjBlcFMvU0ZJbldYODJNUmMxT3VOTDJlV2xZaTI0alJYNGtiOFpaZjB0ZkhOcHY5SXAreTN3Mm9vM1JQakVVNFJBaUJab0x0R2taZS9Na0VQa1Nvb2ZjSUVoYU93NGJXdXRHR1JxRlhGYUhvRjhxb3l0VVAxeFZiT051RkpwSDBrK2k5MzUzQXljaXMwQ3lXL0RxUkUwazVqc3RMNmlZTzE5dXFHMlpQc3c3Um40TXExMUxrMWN0dm8velZMaEVGNUZ0dWJobm82RzlOTUk4YlVCb3d2SmZsUWxUN2cxcURueUU5T0JJbk1kdGVqQ3hEWkVSRTM4L25HM1NLd1VvTTZEakZYMk5INUtxeUZmbVlrZHJQQkFJejVuV2FOODN5REJzMWFPM2gvbGRZYTV1ODg1VXQwZWdmZCtKVTJkazdxMzg3UUpPTldKRkovWjFaaEtSK1FzeGdBdmYwYkdCZUZVdVp2NGk5ZjZqQUhpYnhteXBlZTl0cG5zVGhWZ1hLaGp0aERyanJHeUdtRXJmVmMvd25xK3ZkZTNza1lsVDNTNHJoNUZrRnRSRE83SjlrRWpjenh2dDN3VFo5OThDbWhzeGNKbFM1Zkg4TkVJUDNxM0JmVnduNDNOM3h0aFV3Nkw5Zk50TUFEbWJTVkJHMTk0VEFQRFRleXk1YWtWeGJrVU1CR0hMMHpwS2dULzFWb3JrSWVOSHZIc2szeCtrNE9pYjR4Y1k5akJ4d1NlSjJwc0dzT2tZSStTQmFrSlBPUWo4OG5INUx5Mmx0aHAzeVZSc2ZIQlZNU3FUZzVMaVZSd3BhZ3NKWStKUG1wVFlFbkR3VjhMY3RnU0hQdDRCUk9WS2g5RURVQ0VRUmNGalZJY0gwZ0dRNGh6c0xKdE5SWGllcEhDRmxvcm04MGV6RXAyVzZCcFgzL1VCa0ppK0k4TERjOFN3eVVPV01jak5FbDA3VDkwUmdvaVhOM1Z1SjRFRHJ3cEVsRS9IakNmZnlDcHUyQ0xDTTc4VU1jMWdGaHVKYnEwa08wY2J3RURYVERGS0IzRUxlek9tQzF0S0FBTk1Pcnk1bUM2QlFOOVVUUGwzRW8rUmxmNEtJNFFsMFRkc2ZLVG5OZ3o2MVhoTkszWVdCZmdNZVE2UWtEeC84NjJSTkI4eWo3TUZLUkQ5aDlHYm5tL1R1OE4wbU1kQk9XV1VnVUR4VGM4Rmx1VmphT3BHcGMzaWFRenB0QlNPaUs3R1d4aWpQbmdxUWczcmVFZEorcWJjSHlxUGF3YlFsNmUvRm0wYTI5V0lsUVhWZTRmYWxNc2dsUDBPSjMrREVvbDJWKzdUL3pMYUVPeXFHbHBHL2VBTVpsNWt6TWs2SnJqbmJ4TDBXcGpuWDIwS0ROVUh5citaYzRqZzlqNnA0UUR2UmZEaXllOXJRSURBTzlPanlhbmRyQlZIS2RkRzVKU1ZmNEU1M29Rc3lyc1RLcjdzUE83d1huZlBDVnVOczBub2RySUpadlFHZlNuVUV3WXFYMnBiU3RlckJEU3RPUkhEcXFDaERjcWVZYTdJVUVsRjJQeWlHRnR1czhLaWZmQ3JRbUVkMFhWZ3d1cy84czBFSG5BOEhOUzlwdjJmNWYzNUl6K3dJc1d0TC9ZQk9UdTRFZzdLWmJITlRDNnE4SVlKaVNnRDI3WDFLL0FYNVU0YVhaQVZZQWZxZFphbG5TYWFFVHFGUGRCODQ0K1N0cGFiRkk1WWRyQXZwUG41b1dMSXdiUThham04aitGWmRsMHl2NmJNbjBpTWovRXhJektYVlNTZkZQdy85Wk1LVUl0UFJ4aVE4cjE3VHZUWVhQR1JNRGVZT05BUjY2YWJGT1JFMXJZMnlZbWRRRjNjakZrdVdzUHQ1UXVaUmNxMDN1L1RySER4ZnBnRi9BaGpOTUdGNDl2cUhZcHlCdzFaVXJReUdKWDVFSUZUU2hDYkUyWmRUS1MyNzJuSW5GL3dMbm5od0lFOWtnZUVEcUIra3AvVzZSMkl2clBwOXA1bW4wVDhyTHB3SCtlRSsyVkQrbkVGOHRtK0E0WDVXRE9OK2p5NnNDa3Z4NEdlMU5TOUQ5MUJkSG9BYkZYcWh3N3pVaDRRWW52WWl3UUNZNDdaTm1vWDM0elAxMFFtNVNET0RSY0xNd0FZbXhQR3dCcy9ZUFNnMUVSOVNDeTRCTkl6UVEvd1J5N3Jzc1NkS0kxWVlSVmlIM1ozUVRJaG82bFpqbEJlM1ppb2NucGQ1UVFjSzJkWGQ4cHo1eCtEUGl6YmZoNUhKVS9CUjQzbGRSUkFvdE9RS2hDTlUwc2xFc3huNXFZUnl6NmR6amo0OTNRVU9yUGl0SmNicDF5SVRUcCtxeWhpa0w2T0Z4Ri9jSkZsN0JoRHdRZ01DcDgxVzk2YkMxczhTSDdCUkIzS3NCUXhLWWNnZVlYVGpUMmFsSDVILzFLeHVYVk4rK2hRL0FZb04xMWorN3diWEhPZ2ltdmdyT3liUHVyakpWR0xucHE0d3NTcWFBRDZlaU1CK2IzUVhZRGsxTEQybHJQZHVjQ3dFTGgvTGZaRk5iTzdsUDBKSTBTb2ZQUWdjTkhzdkpPakl3M3hZVkVSRDZTZjFPa3NnSlVhT3EwOXZzdHZpanV5YmxsNUxzSjFlYml0Z3N5VWFZZ2hreDAzVkRnM2R3bVhiTXhuRCtjK1JQcnBMbCs2ZDQwcHB3UHEwUUZvbWVTbU1DcmtYQVkyWnJZcm9XYU5GY25QeXp1Q0FMOHJldVRoSzl4TndnSHpvWGl5T3VTRUN5QUtlMkR0Wi85YVVwODlTaU9OaEF5YkErcjd0YngyQlpLdUhyUDNCSENFM2hJVHR3RGFrc0ZqenJhSlZKR3djL3VaTW55MWtiSHNwZDlFOHBxWDgybmdOeUh3UWJ6T1V1VmVTeElHTm9oS0NkTWMybkFDRStGbEJwTnVzelNKTHlUaTFqTVZlcTkwTDJVVTFPemRpSjZKUWx5b0hrc0JJVFFRZENOMHZDZStFRGZIb0pLNkZKWXhvUHlKYkV0bGdDQmlvTFkySWxqTVlPYzdpQ3FMZGY1SDgyV0UrWGhJcUYzK1h4bnM3ZWRGbE9aRno3MkhDYUtSWTlWaEFvOEJKdU9SZGZwM1h0WnJsWFkzTDlYRUJjckdIM0tjeStadjdsaUg1REE5Nyt4dHlKVnd3cGVmTWdzZEpMQ0JlNWprQ0JFS3k4Mjl3TXdxSkdBdllPTHlveXVxcXpraUtmOXNtbXdWdGJIbWhFU09EZEk4T0pjRUFrZURqNGtCQ3p6QUNJSExKQ0VDNjFoSG5rWUxtN1piM2JQei9QdGZlQmwwQmhDZTJ3a2NQTUdXOThhZDU3dXpUa2ZPY2dxcnc5Z3BqVW1NcDRTTklEOGhpSVNMTytucjQwaGptbzd3ZTlidVE5VTNyS29CVHBhZVdDNUxLK1ZKQXBMekpWR3lOWExaeXRjSG9rMWhoY01Wd3VvakhMU1F6NkYzeFlVcnJtRUJ6ajJBRkE3Mkt2UmU4WVp6TlROQVpBYjgwaDNzU1A1aVg0eHQ3L1dzd0tlczBNR2tZSnJhZWNhN2U5OFpoUHpOMExYQjJsK3ltOUdXTEI2dTYzdnEya0NmbzVBbzRXdXRsVWhrbXVzeEpTbHUrVVIrbXpGVGJZRjZwcW0xaVBxSHZ6Z1RrM1dsU01DRW1Pa2w1UGEwVy9YcjlqZDA3MXhZM0xEMFp4RzYwcnJ4VTJNT05SbUlBN0Q4dTdGeklUR3Q4QTE0ODU4MmJ4cTVyRVF4cDZVZW8vbGZHWTJjUGxZSmJxMTZlTEwrVG5Md050SzlsVTlXaUdUMXRjZVZSL1lhdFptaHJtUDk0cFdsQ0E1YmIvRWhCcTVyeFVRUXV5ZzIycHpRaWNHbHR5RXVVelBrQjlZbzV5OUpvdlRrRTA1NGoya3VlK2NEYUUrOXg0K1RMN3ZTU3QyNkxlTVdRd2FCZThTa1lUVTZhR2R4ZmFZZDROaUx1ZmY5Z29lYkRUd096bXBCSU9LTTYxK2RSa2toY0tZR1hPRFI2TWlXSlp0bTU4SlpHb2E5OGt5NS8rYWI0ZWNkSWhRQnVuVlhJdW4wNW5PZnZ1bTJMVS9Oc290c3RwOVVjNEZucjZFVVdoSmNXeDJyUjVxaS9WY2NBWjZJS0RrR3pucGMvR3hQSlMwcEQ2bmxoc253Y0prZDl6b043bUhPRTdmcUExUDNIWFVLYUNSc3JmVXdqS1A0ckI0Q215WlRCOW0vUTlVYVFlNTdjWnNqd3JKLzlhVVVyd2kxTWd1c1QySDNTd2E0NmxvM2ZoVXlyTHk0WW92TnNtbHhIZkR4ZkcrMWIzc0JKOFpKYU5Db0dVb0NTMjBRd2RHMU9KeHhDZVhSL3pnQktwK3lYZnpFZk42SU9zUXdFenE1dXNqOUpPZitYUit4dmNHNVBneEE5KyttOTh1Tm5oTnErdnhUajVQTDA3Wlo4bTVmNzdwVWNhYlpubURwa0VhU3gzMlFnOERDZVFTWmRzSXVpTmMwcGROZU1laFpSL01yb3lBNzZwRVIxdFhSMjYyU2I4c0VhY1VrRng1aUphWGtEbVB5Mkk0UkpNQzRuMlFWU2JXMjJhamFQeTNrTjE0K3dwbm5pbHNtZ1dwdElkamhCWGRNa21CQktuNVdLRjN5OEdsaTZwS1hxRWxvcEpGOUtMekVwc29UcEZDRy9oUGVETHBCd056V3pwb1lzdGEzYkxCdEpLQ1RCbHZ1NUhHMVlCTjM0TXhGTkYrMTZyNWJ3L052NytnL2NyNzB2N2N4a3dVZ01zWS9HT3M3Z2JQN3diUjZNVTBQemFCSnZNOFcrall3eDE2Y1paRVduTGQvNDhNOWswRzUxUmI5WE5mcVB5eWNuZ2xaaUNaTlBYb3VjdVYzWDM4bittcFpzUHdIbkFVUEZlNGpSQm9TNWdscTgrZmg2am42aXpHR1hSWWFHeGpzMWx4OEpQcjIyYnhadzdrL2dGdTk1V2V6MVpjVXdueitYWlJzNG1icjU0a2xTMnQ4bEVKdmhiMEgwVnkvV2xTT3dHekl6M0JXRXlkKzFuZTZZRGxabGdUVTdZNjFxUWJEMmVDOGdHK1NFL0U1bittaUdTUkJ3L08yTlFnaXVORmM0cmh2YVYrRXdTd1pINXR6a0JNMGF6SVFOb0N2eVR2Y2RRVHowd2pwQmZ4dDlxWGhRaXBQa1M5L1FrbHB1RWt6eDBPMmFUblJuMnZIazFzTEl2R1FsRXVOWXA3V0hMbzVjaUdUSXFZcitkcC92TUlTSzZITERyRnhrUlVmWFlTRUx2WElwT29XcVB5c1g3L1VMQS9tYWxBdlVHRDhDaXMybVM2a052amFtODdUYUJZSFhuRk93TU9uSFlybTJxYURiaFFYTk1YY1RaWWc0S2xhY0dGdTlIWUVjbW41d1ZyeGRTWjczZkN3Uzg1SVlXRklLaUVpZVNHSk5ydittaTZmNHdjbVpmZ3lzaEZUWnB2VlRJR3pOUDFIV1VaM2EzTHo5T2FlT25aeXQ1ZzFWei9RT0d5ai9QbWtseDY0SC9CSHBYeGlrZStjV3FSRTBGd1F4QjVubGRZclpyWVVobDZhSUJKOEVmbWZjV0ZRRGpBanFySjhqU3RaMVVlc2xJRnNzaWx0a3VtTHc3K3ZiVkpsV0VsNVh4a1M1d1FZdDFwZzZobHd1cjdJS1pseThhRGQyK2lKTW5vVmhGcHd4MzM4L1FFUEZtVldzSUhpb0IzSGw2a3Y5UmJzYnQ1T0RkVjVwSDRjbXhDZ1l4UTNtLzAzUVdxNGZCMWtSQXAyZ3F1OUI2ZVZ1SU5TNjFmUVo1WUhyQ21XOVh2aXo4R2tLcEhhRHhwNHYvUndUelJhMklDU1gzWFRhTFJwbHFxaFE1MzdWQmVwb1VsbmRNRlVrWUNSeVBHTjNuVVF4eEJHaE8zdGRrRGZxanVFdXpDNGtDam0wbmN4cEM1STFQRTNVZVlUT3RqTHp5S1dtMElWWFBtUyszOE1KbnRVMy9CK3ZRcEdta0lRMkErc3hoU3RTdkpaaE91S0IzR3ZMVDNOYlk2QkhNeGhYbVk4RFZhT1J1MHVMeUtOb1lDc2RUUVl0WW0zRGJqeEFQWXpsMlR6NzNUSm5odUlBQlQ1SGZ4N013QmxabnpVaS8xRmRvWnd3TC95VTAwRGNKd2lvZENTT1F6L0tqTE9WU3pVeVk3Qyt3c0ZsRVQ3NzFUeGdCNkc0NFNIamRRaitnVDNKeFJkUkpaUUc3T1JReWFjS1FpRkZRZmtBTFBHSDAyRFZROGNIZGY5S0M0aDUyN1FuTDVUbFFxTzJHTU50WEdTcDdXR2NSY3FQa3VSSmRWT0x6QThnajF6dzgvMnAxdEhheVRVVkwvWkJCYXhham9vRS9qc0ptTnFxajVZVUM3R3Y3cVRRVDFiYU5rekt2YTZLeGxLcFZnaXdJaUJGMUVRUmxZbk5hb0k3QzZ1cUlieDl5cXRHT2h3UmxVRFY5dHlNVURiRjhOZ1hnRmQ4UTgycnhPeFVCeGk2aVV3RWdyellzOGlxMzFlS2NzMlhHZkF6WUc0eVdoNWF4NFVCeGVvNlN1M2VWb2daTlVwekxmTEhaS211RFRqTWxRU29tcFhkbVc4RDQvbjZpcHJ2YVlKcTZhZ3RRUDdIcENvd0xkUERzeU5NdnZ0bkpaOFNsc2pTdno3cmFrbHRIZFJmZFMvNkM4dGoyOGNEOVBqNFBkalloZzZMUVBnbkJLblZ3YTRuSFYyODlsUXlLbk1QenlYaW05bjRjM2NvOW1mOWNsdnB3amNrT1dqekhSZjNwWjhUWDBNSE1NSzNRNGpvT05Sai9XaytYeGZEWlE3SWpXcEQ5SUVKVVV0ME04UkMvZUQ5VlFqRVNKN0xyV285R2VKSUFnU2VYWHVDK0hQb213UHFWTEZhM0duT1E0akNpYWx1MndsY2t3MUZmWkFRWWJqMEpvVTJKK1N4c1g0ZVNRU2V4eCt1MGRoRjNaR0QxZnZ6bk5wSVNSMitTTlRWVjcrWmRvV1BydnZ5dWlHV0laVlBXRHljSldjK1FuUnI4eEtZQkxYZGxwR1FGUUF5bkplK2pDc2xrbzhnZEo0UWl2L2lsR1NVOE9wNXJDNm5VN1djckc0UHZxb05NQ0JHdnNBWnYreDViZURvVCtPTTgzMFpndHBpZjNQUUU5UmVSOVlxOEcrdDhoanVGWWJQUTJUckZFS3JzZGhCVjNOSFREMSs3b1dLZVdTL1lrL05qaC8zaTNkTTdCaEFFWFBQMkRIN2JvWFo3TlgyNWZKQVZYVzh5aWMvVi9wRFcrb2QyWEYvSXZ1R1ZIWisyeHVZMitFbXQwbnNVVlhKSVZLSnhGN2xNY2dsQlFHSk9LZzZMS010OUZkbzQrdVpjVGlCblJTR0RFWS9MemJwUFlnVkpZVTJmejJTN0xGUDVEcTlvWHE3QkdsaXB0cWhwZ25mMmxnTktybTZKSGplSE92SXZKOWI1a29DbC92SlJ3elRSNWJwM0hRNTBkcFU5QmdMZ3NmUjlCMm5aUDYwZmhFaWVGQlBHaGVYaEZGZWRXOHR2eldIdGJXME9tQm5vQlkyWXNzYjZqN2JTSFRoU1ltdVdKaEduVkNDbXVySkNhMmpUQXAxdjZwTHBHZytjSDdmQ3Q4eWovblBjMkVjemdFQUZJdGpOYTlnNzMwMVhCRHJhNnBhVVduZW5NMzRZZnFyYWdxOW5seCtpSlluZFZ3VEVHbkR2OVJrU2JGdkxyejdKOU1tYXJmT2ZBT0lmcitEQlUzSXpiQXU2K1dmVHZTTGFYdjcrSmplNWZobzFvdkNNZXBoaWdURjQxODM4Qmwvd1FOQ3pvRm1VSjJPc2FZMUJsSjdPT0RCTTA1eUpGdHJHdjFQUDNZWkhicHlIclloMjFNQ0tBUmw3c0daWllmcEdBbU9Ga3BjODRJWkk1UmxnR05KM3U0N0loclh5Qkh1b3FneTRMaWJTaHEvOXJzVkh6SnpCQ2dMZTZPWC9SZFo5WlJNbzZFb3hPVHlIK2hJUWgvUDJ6NDAvS2dZOURuS0pKV1dDM0ZsTUFkeE1JWGhjTEYzYWtYVDVzaUxxbEhTaTdVN1BnUkdsQkZ6dlM0RjVaYWZwNkNNajhXWWw4ZmlKVThjMU45TytyS0VqQWpjY1JCZ3V6amszY000djJLZ3JQcENaNk9Xa1JMM0tUc2I5cDNMQk85TjI4RlJsWjlCNzZ2aXlFbVBHcEEyQkNrUWtVckdwRzQ3RWtHV252SjVJSHBvWjYyV0toRVpRQmh0MXhMdHV2S09FdE11RG9CL1pQM0MvbU14TWcvNUIzWE5ETjl1aUZERmkxZ3hiWE9QaVIxU0xyZXVjb2N2b3dFTDAwV2F3dzE5eG5NcWg3SG1jZVFPck9jdHhyYXJrQ0NhcHlOUkRUbTc3dTJLaW1DRWlGUHI1MDB1VHdCdzZmdVExZUs4U1dySFJMdnMxVVVaMVpyZDJFT3VscFJXOWZocER6R2RiaHNZNk9JUTVvVnl6TFNRaXByWFEyUlltVlQzK0dWS0ZDOWhob0tPNXNrczlERngyc0VNeFY4ekdPYzlXa3JHbVJLRnlwZTY4SkxLR1BreDdRZ1YrTFUvQ3R0OWl1enZ0YzE4WlJHSWgxT1VtNTNCdlM1bWczZm9hRXNFeTl3K1MxZ0NqVThLSE15akZwSmYxSnBNam5EbzhYc2J5bjNGSjFuWHlpVGhONTVUa0pMWmpaby90WEdGRWU3TWtqTnNsa1JMUVl6SVYxZWlTOWJIMDVMRENZU0hYOXZiNzN2ZVIzcVVLWTBkalJEUFhmbG1RRlQ5dzVSWU5oYzZ6S2dOUlFWeDY1emJTbHd4dzhUTEUzK3dZZTBVb2tldlNvZ3YyeFRBN25EbXVqS3d5ZWhBV2RXK2owWUltVUl3SGt1enY4Z29KRjNhUStQdzR4eFVYakYyM1RHZndHSzZha09xZEhFOEdBcEFISTN3WFpGQThxQ01LZ09uK0lZS2xzSmNIK0JrZWVGekdZb3JLelFwZEdKS1JqbGcrSGd1VHZMVmVHSXoxVUtpUXNlNEVnTFIyRU53YUh6bzBPdFIxalRvdVJvVXRLaUlCRUhuUTdxTWF2RjZob0RFejBEUDdKbnFXK0dSY3VqN2VpTFBZck5sVnV3dXdmdEdJenUvOWt3SWNmcmhaREFXUEZ6d0FMUTRNVFpSOUk5VmhQSFJ1bWlzTlgxS00wdzdCZ2IydWtUT09hUW9qbUJoS28rRStmYzkvVWZJWG5nWHhZK1hIbW45OVIvYmI1cUM2MXQrV1BGbU1KNnQwY083SkZSVDVURWZJV1E1c2w5U1hNMnJ0MGxpT3g5UVFkNEozZzZzMEN0eW5PMmMvTzZ0bXBiakhaL080R3VhZXB5SmZlWlBKL3JLSnY1Zis1VXNVb1FUS01YNVM5MGExdlhxNkFUM3llSlcxRTJLbXU1eHdEaWx0bWEvMWM2b1JtRDlWenBLVVVRazBDcFc5bFVvQ1BXRk9uSzU1RnBxLzJZaVR0RGd4V3c4cFlNb29pOXJyTWsvZ1ZhOXhxVForQVpWV3lFV1FjSmFKRUVtN2dBSjdIcFBOU25EVXpqRTZrUGNEVlNvWDExTUdBY2pLU0YwUVcwTU9pbDMrRGJuV1k2d1BNbGxUL0JybDZBMmhYakVuWW42OWtiV2ZZY0lIam0yOVl5T2V1VW5VR3ArTVprb2JacXlOWGdJVTdxMEY0VDVtb1JYcUp6QWVnN3RkVDN6QXgveGsweDhTWmtoSnM4Q0k2cmpvVDEzYW1SV3F6NEJTMXNjM3I4Z21pUUFIT1dyQU1iZmZQV3FwZ0NJWHhrUXRMTHFXMFZ2S20vMVl2M1BCYXJXUHd4U2kzZ2xjUytISGNzVkFtazIrT0NFVEhYaUsvcERqMmZ6L0RPcjhGUm1nT0wraVBlRkhEL2RrSkgvM3hxV29kRU4zd3YyNjhYZEhWaDlDYitEUlBrd1pUeTREVGpJKzRKQ1dMYTNPQ2lOTGNmOFc1aTVQM2ltWWdDVHJURU5URmFvY095MHR2ckN2TmhidzhiVHkveWJjY0RsZW5xU3JMdHhUTWtMcC9FUFJHS2g5QlFkSnRtYUNhbDBuZFUvenFQZUNGQ1FiS3ZObGJFQ0hmRjFJd0FlcmRxL0J6Uk5SYUQzaXFLdTByTVd4ZkgrcGEydEZoeU1RY0NOOVVweStIWVFUbHBOZ2dkZEpYQTNrK0p3Q3VCS0lWS3ppOFNvODQ3STVRVDVuektIMm9naGd2QUErQkVsQm1qUkxyeHk1QjVHMkllSXJadTJSbmZKOVFNZHBBb0ZxaVpwQ3p5aWZZaGFuRjdiRVllOXhmZGxmSTR1VE9SeXd1cVRiTGgrM2VNTFdycmRmeDdaUlBRMVhINjFCTE5vZ21hNlpra01OME1hK3JLUDlrM0NEcnBkcVFOako0TCt1UXQ3eXM1ZEFabDBkekoySEM3R0RQUWhsUzEwOFVmNDJpRDJ5WVBzVXY2Z2dPQ0pVMFNURkNkdVlvMGVHeDJ1cjZCT3Q4c0V6ZlBqMFZGUHF4RG1Sci9pMWRzYTlIeUVQbEkzb1dRRUc3ZDNkbVRTWUZtMW43aXNGbDhqOHhzMWRrQTQ4ZlFGekR0cDQ5TzJUWWVBcDI1UGZoUDRFQkM0STVHdFFiSkluWThDYzRyQ1RvT1hvL0RZazQ2R0prbkE0eG14WGFWSk5KRnhpd0JGdUJ6aHFVaDVMWkc3S0oxa0sxZCtHSGRXcnlDL0h4Y01SQkdKdGtjL2tWVFZrLzBZb0s3a0lydUlLekxxZ1R3NTVoT2NoNlpTOGpHdzlUOWtKbWVZbC9ITHowYkQ4TVBtbk0zT1pQTytUdmhYazM3NjJFL0JUTFZQaERQN0VIbmFIVU9MclJHZHdsVVhkV0VwMHNKdWRud1RzeVIvTnE3SHUrUTlST3B1V29UZWI5OGtWR1hSdVRwU0FNb29saWF1dENZYlhFeGM5ejM4NmNJNGVvVVlTWDY1TC94Znpjemt4dFJvM1VYRi9PS1czMjRORzExd2lDWFRxcjRtdmlVNDh0TlhFWTNsSGx6YnBSckN0TzhqYmwxMDJwSmFTY3l2ZFRGSEhCZGIxSXMzVVdIU3lqUVRoSXp5YlkrVGlUdmNXaDg5ZGxUV2dDZTNYR056UCtrb2ZJb0Y2Qk1qT0dJL3g0dWswMUhhaDZJdE41OUhJTUFNclN0MWY0ektuTEw3YzBVYURDNEwzaDJ0WnJhMXEvTmVZRUdXbE1QU3F4K1ZSMHB4RlN0THlZdlhtMDhzM3dadzFWaitScC9pL2FYZUVTU3ZzZjBOVDg2cnV4d1g2a2h4TTcvVnhxR1EzbFJPL1VETDJwUVM0V1RUdG9Cd05ralowTFJ4WmhndkpRcnFEVFlRS0pZU0NMZmpVY0RvRGRyRlIvS0o1RG0rdWE2a2RsRkVCMTg3a0dYMnVFTVRVU3MyWWV2YUdkQkdaNU1DRWZBQXUxc1Q3bjBCNDRLWmFXWDlDWEE0blZnOHRqSlZuNktzZGFtMFM2NjJTSnIzTmhZdk11aDdyK3lwWVhUaGFQa1FROHR3MW5EWTNJVWJkMHFoSWE1UFEvU1R0M3AxVlBaZCs1NFlPZUhOcVFIR0plM0pPbmM3Tnp3dms3NzN1YkRHWS9oWlNTRUIxQzFkUHZJZTB6RjlFR2p2STA5VGhZcVZ5SG5BNTNqVitNcnNQVWhnU0tLVnlPSWluYldVaElwTU1Felh2MlFqUFAyZ1lQd0dkWDBvRXVvN0JmazBxSmNlcU04MGpGY1dFNEhScmtJNmk3d3pQMVBaVERMK295dEVUaTNVV25WMG5HOU1SakFVcGlRaFJuY21xUzBYeDhWL0VGaE5mdGxJRmNaRkZVZVBJeXZLa2lzNS81QTRSWUdod1RrWGtrd3VtMi9aVjRneFRUTEJHdVBPdkE2ZTJYNzVwZGR4RVZsaW03c0V3M3oxY0EwZEk0aDhYTUhlTTZsUXZkeHpsOEtSTVFmUEo2bHRXUjlLSlViWkpjcWR6NzFxL0pXVUVoVytMWm9lMFQ2bTcyWjZTd0g2Nkl4SDJ0YUZ1YjBNTzFqYlYyZFlCaUphbERIcTVVYjdJZXJPOW04Nm5laldwK2ppSFJNb256ZmFiekppRmRJbU9sNXE1WHk3d1FVeDA3ZkFpQkJMZEdzanBYZlFKcDdpYWxGek5kYzdDUDJYWFd5WnVxUWpvbzh4RU9wUlUydGdwRzJwbUJqVkhzZFIwVEpuYlhmTFFHSk1VSi9idDYweCs0cG5VbnYwTnRqMVRaZWl5V1JoaTVmWmxBUXRLemRFUjBDNWVTcXNTTHd3YkplS3N2KzVTNzRnS1dRVlFmU2YvSnk2Z0p2bDJmQStYeDlwNGJjM3d1Y0dYVG83ZXIvODkzeGF6QUpFKzJZMUJlS1VlQzMwMFNzZXd4RXgzTlR4YW9CaG95UGJuR1ozai8zWjNnNUpiYmdsYk5ZR1J1elFQWGV4L2tlYjB5d2ZBYzFYY3UzNS9pNVV6NXB4S0lJZW1yK0R6SHVKREdBT0VOdUlVUENtSmR5S2xhb3BCQUxPemxZMjJlbEk2UEZQM3hiaGdhRzd2enFFb2tHbVppVnB6QTVjdjhINkRwdExNaTc0Slg5emZFRm5tRFA5MTRSaFJ5ckx6cTlocEM4WWVkSEVmdWs3VUNLVG8wZWdpUGFuMFMzcjNZRkJhdDRBM0RaKzZtdzRsc2RzR3FpWWhGTHVNaSswTFlRY3E5YlhRcVlpL1RzRk1HaWJoS3BkZVpMWW1VNVFpR1M1QzVWSU4wUVNwMGtuNS9nYWpBSjRxWUZKNnNRTENWVUd2ZlJCUmFyRVMwVFlxQU1xNlI1ZXFZKzYyRi9icXpab1BIdmZzRGEzQ1ZmZFhVcmlzZ3JsbEY3cGZzZC9EVTB1NThienFjR3EweWRGaGZZaWhHZ3ZCaUlmRHJzSEdkekU5UkJGSWplQ0l0d291TU1GclF2NVZNNlpIKzMrMm5tNno2dGRCZUtzTmh0YUpqU1hpbi9IUUoyOVJaSk1uOWNqWEo3YU83N0k1UUZTOEZOeHI5RmNIV0lhR0hsdDRaQmJtcDRSRGpyVFcvejRaRkx4OEp5S2lsU3RxTVNsMG5TMUhSVldKaU5ITVh3eDRVVkhuWk1IOTRHQXVEaHc5emV6UFhUQ05FRnhJSE0xSlJyTE0xWHlvaWxSN1YwS1JxcGNJZWgyaDVOaGpka0RObzl3bkVBclVTSTJVeXpsRHlVN3RWVGRkVHk1TnhuV2UzeEtuQ3NyNUhkRzI1a3NLVTBvRUFWeHNaVVNCS29TRU5TbUs5K011UC9zdXFtSUkrVkxoNmRWTERtNSsveWMwR00wcSs4eWZJTmFXRlNtRHpFZ3JmV2RZNzFMYjFjbXlUZ2UxUHAvL0hlMmFmdWlSbHhrSGd1MWp0aEp5bHBUeFJlQkxBYkI1VldLbnZnMmVZN3libXhRYW8vV094bWpqTGhWb2F2SlgvUWErbEl6K0pSQVVVbkJqTTJ1UFRyNlRCeWZvcCt6T1dKWWJQSmRYUkQxUHhhNzVCRnhDRDhPSDliS2JYT0I3SXBqVnVMSHhQd1NOVkFzR2JtanZJT1I0N3ZWblZpTllhdnFsTzNJSHFSUnFSaGYvSWdWUi9ISlVNRW01UTkyekZ5YVlvcFE0alpNSFBvK2QyTjdLdENTcHBXelVWRk5OVXZiL0x0azNVbVBreGt0OGRJSkZyNGJWclpVTGRDNTYvQWJLSUNRQ3FLUGhDVy9GSXRWUCtYTk1RdU1wbXpDc2ZTdzUrdVZNVVpFQTUxNWVSWHhtN1dFZVNxNnZDOTc4clpwM0lZVGtmREVKR0dYY3g4b3h4MWJwVTJPbTRYYk5qYysrZFA3bm1TcFdobEhZbzJvT3pQRmVlT0w0cTAveHEvWVBaU2pFK0grRzZMUUZlaDdVMTllR2ZzWUxWN0JkUjY2RktTeVBIRW5rZCt6TmwzcXBnZmxRMHd6N0o0UmNkVTNZcDQ5NDVCL0JlU3dPaTZlK0kvWDM2aUs2bTVGUjdIMDUwRDN3a0RGNCt2SldJVnhYbmw5RW9wYzhETEdyZHMydDI0Mm5ySkJ5Y3VJSjBCcGFmVUgyYjZOMlBHZGJMdzFYVkZzUk5jbkZISXQybzdjdWc2enduZlI2UUFKekFFaFcrbnd2VmhhNk1zSHl2ZVBhMmQ2dkljdU04eFZ2WisvVzl0aUN2NzZtY3dnZTJhRkx3TnBIVnp4ZlpyN3ZHVlc3ZGFZMUt1SHZ4MExDeGVwK0laNi95MnpkcFo5c0RVL0dHbWRYSDdTNU9xckFlOFdpczRNYjFMMkpsaU03YTVqSnF6MlUvc1RiMHl5eGl4aHZVUlRtZnhETWNHcFNsTS95blNVcXNWZ0JSM0xRUFVhNUZBZG5YdDVIZkJTdUJxSUp5Ti9Nb0JxMnM5dFdaYllHMzdXR0xKODBMczRWVm44VVIrQTh2c1ZtMmwvazRZbXZHdHYvRllqYkNHMmMvcStlZ0JTcUhNUTBuV2JCZmliWTlRK1VsQU1YYTMvZVBJSE5jMFk0SUt2RDRJNnR4b1p0dXFra0cvOHBvMUFIZC9aVlVydFcwOUZGVEs4Wk1MdXdKSXZTZDZkalRXYzhEZ3dkb241THM0b2E3c3ZOTWFNZVhQRURUYU1Ba0s0dnNERHlxbmEzMzF5QTJoTVhUdTRaVG9PNHpYdkdyYSt1VXR1cHhmM1lJNGtHV29sKytkRnhmeEJvRjN3cU5HNERkVlM1NnRYbGxOcVlxeXZJVUxaQWFwVkFHMHFSd1B3blcrdmxhQlJqNkRLWHN2eVh3bDNuRklZYjNDMnBCeDRyNllJdWNlSUs3RzgrdXI1dlh6QlFpcTBmblRFMDRDT0pDREN0THc5UkFtdVdhZDU5dUN0QkFFWXVRZ3hndy91TXpFNS80WmVvTDdvOVIrcTkxbEpadVNmRTY0bUVzQTllNzg4WCt3ODdhZDlCWm1tZitTWFd5UVVjRHZYT2g0QW1GTkRPcWdEeEIxY0VUMXJXU0xOQUwwbHVXa0l2NC9jUDcycVpWVFZySUhlK1VSUVJsZk05cXFrbTA2cy9QcmlKZmU3dUdDUS83MkpWazdWSkVaRWlLdnp6SDdDZSthaFdVc3ZJb0FVUzZpUVBGdDJTTWE4cE1kT2MzU2FpeTI3akNOUDRCQVVLaTMvU1h1V3RocjhQMURGbFJQN09HM0FvU1ZEcXlITVZGNGtOVUhTbGJaU3N5KzAzR1BDTTZNMmZ5bUZqZk1sR3pjRXowdW00Sjk4M3dtVktzRE1DbS9EVWl1SkFybmdobVRrbjB1dThmTno0a0JWbFAyRTJCdStpRi9VNUpsdVBSN2hFaHp2Wk4xMzNhUmhMaHZtbnJUcUxUcGljYWR6eHlsUzltM09uWjRTSk1pcFR6SmY0bmJIK0RkdWoxTHA0eEswMEcvTW9iUjBDUm45Vmx0U3d6L0dXaWNwTGdmMWNBbmE0b09kSkR0WHlwbFFxWURkRGhBcWVLNlBwTmhlT2FjYmdPblA4QUl3QzBIVVdpK1ZVUDFOSGt2azdFdWtmNVV0d2FBZGVYWG9CV3I1MVUrU3VQWHNIYVhrNzlFN3ZhK2psbXUrSDV6SHRDNW1vRFB4Tm9HMWFuQVpHRFNWVm95ZGJFSXZGcEJwMTBhUnU3SFlzTTVnY1RRcng3eUtrL1FnNUlWZmgxcXl6NFJPMnlJR2FONStoTDFsTkplcmhKOVRQTmlsR0FRVTBYM2hjdFlFenExaXlsbFArOEZDbXRSaEdqQngvWlZ2V0t2NDdLcVVCUGNYQ1pFU0dObWN5VHBrWlB3SWdrTWVFdmVGN29hUFFPbVZ3OVFObW1mYTN0U0tsZ3JVQkRQcFVDTUNWYVA4amRlQ0ZhWFhiSTd2RWJJUnZhc2ZVTjNFY1RsV3k5c3d4eEdMM25vZjUvRjgzbWN4L3I5OXM5SUV3VEF5bjNGMWdJY1pyeHFSYkY4MVRTQ1NQT1ZPaTRPTjF5Z1RucG1lRVllQ1p6amZyUkN5WWNNVUF1V3haV3FQcVNRbVlEYndXY1NIUzFpM3ZQNHN6dGMyNS95aUIwMGdlSmtUcno5Um9jTW5IQzRYVmNhN0l2ZDF2WW9VaTBwS2Z3a1c5RUhmaFpYb3JUb2hYQnhPUitSMjh3VnRDL2J3Q2VMa21jQTNHbmlpRXRSL1lZaUpoVTdEZDMxOEJTdW8rdXdFSGd3dnIxOHRyN0c5SVlwbjRlREpsOG1CelpuQm1zTzNJR1NVZjJUWG5ET1o1MWdqT24vcTZmS2tTdCtmbTk2TVZIaDlmZENCUXloOG42dVMrdGFXdlpsMnBodWxHSUg3M01WamhVejE5YWM3Rllkd2RKVDJOeTFBQVIzb1U1U04yVnJ6Snl2bjh2c1FkVGx6RHFBK0JFQzcxTEpSQk04Y0NvR3JoY1lOR21tN2FNRlMzYU1SdlgrTDFZaHNqRDhBYTFtalJzUFM5VTlvei94a3BtakNLL3k2QTFBcDZTcFdiZVpnTlBzcWxtcG1KNzMzd1RzSTJaR0NmeEVicjFNcS9vRWRPbWhTVC9oTFdCb1NsVkUrbmhyWUhMV0syWEMxQ3hnd25tbDF6b3EwekU0d1ZPZnRiejl5R0VZZDRvWHFzcmZxQzU4MU5JdGZuNVNzRnJUNjJ0ZDlLMktLbGpQb0JpUXJlSFgweTM2dU1IdU12N3U4Vk9uaUFOMXBpS1E2STZYcGgxUHFqTC96aE0rWm1BMC9HNTZmR2RqS1ZKQ25JaC9Nalh5Nys2bE9hZEp4cDRLcGxhNnRURU1WemU3SnV3Mk1GeExwTk1XSk1KV3BZaCtqQldVSUp4MkRTZUpFaDBjTWtiY1FvRE83UndTbXg0MjBIOE5DSmxUSG53NmVIUkdZakg1RExaMlJPK1JyUFoxYzV3MGIzbTN6V3RDSU1wR0cvNEIzVUV4QVplZlVHN0tVYThxWW1OL2hDRWN2ZDd3dTBOM1dZMG1WWGI2blVYUWIvSytrOWVLSFFSR2YwSnR2VXorL2g0dUVaRUJyYzFHeExqemg2YklhcFpGaTFVbklkYnZ3eGxESEtiS2czcGVVcE9TWmpjdWFZWlB5cG9QOGkvdTJyWFhrVEs5dVdwd3FmRlBaTXA0Tm13ZDhrT01aMTd5MUZvN0FQcVZFbU9KNGMxUm1jcGF4cjd1QnU4a1BYdVpOVkM4Y0Y3TjR4MWVhZlZNVE5sdjU0a084dkk2dis3NHRvdTUxbjNtR1NZWFBvZnRZczc3OXVTZlgvY0pxRFRaUk9tMWFFV0Q0V2IxY1ZCa3hhN0g1TGx5Z3Rhc0dXS2pKR29WWHJsVHRiM085RGJERFFrblcyQVZNSWgrWXVvbFhNcHlxSit4dVJOVWRXZ2lVNERzeW10d1dOaFIxVXB6Yy9WQ29wc0NvcHRJV0hYcSthdkl5NHh1T2R2ck1hc2t1dEVCRytlMmVYTW1TU1p1OWZwYjlDT2RkRTdXK3M2bTh3b0ZwaGNUT0JqYmxQZ3BZSjVycFAycFc2V1ZNa1pCRXhXaVpibWRxcmlkenMzdkFObWxxTGVQUGRqRnJvMm9QaWRCODVsa1pxK1Evc0FIWVBkVmszQnM2bjFHTFozRkFKYjdnL0s0T2EvVjhYRTlwTVRway9JVmFyS2dPYlJkWWZseU95TS95a0dCYWRubjUyUG90MTVqSlJIUm9WYkhPZEloK2dacUJXN2QrYXBNcUJTZXl3RGlraWsxZFBSaEhqTnRPb21vTHdxSGM0d2tRNlFDeUJiSkh1L0YvcXc0a0Q1NHZ4SUZBM1NyWWZMZkJoTEVrMzdFTDczQTVjeU9kdDhDQ2dZeG5RL3hBSXYvR2FEcnIza2xoUzNVWDRQNGxaOVNWeGNGWW1VVGpRaWh1QUxLc3lhcytKSTlkdW9rNFNGWDZPekxKc21HbDZBMU4zek40aEFsZXk4cVlNSGFCZHpLb1BZeFFPSGI1NHNnZGs4c2pTRzdzblA4a0NVTm1sNjFPdVE2ZkJUTmFOOTlkMVM0Z0prRVdpWEFoTWxTRUNtWnV5MzJGVWxrRmNwNDhCZTdQK2pZbTRkUmNwU25YdG9sUEQ4NWRvUTZNL2t4MGJzREUwRTdkWTJLdmhWZjZDM2NiMXloZWlMeHN4SG1RV1d3Uk10T0xwNkNZS2M5a0szenE5c1hyMG16SExxSnBFczRobEpqcXFrS0kwczA2dCtIaTV3K1RtMmY5b200bDJ0NGlESGNXci9tcVRZVjc5VEJndGcxMUFBaUloVHYwZGdraHA3SHZMaUl6M3U3MDZBOC9xdjhNV3NXMEFwcjVKMnBtK1VvcEFzUm5Ga1dtK0dWUWRRSHp2dXJuYTBRbnNmbEgvVXo2dUxWV2Fmb01IRkUwT21BQ2I5QStvWStaMWdsQWFHZHR2TDFDUzNUL2xoZnZPSWNvdGEwTy8wZlB2TFVYbVNMVUdzKzNZa3gyb1FZUTdQSmFyZUFFeVhOUUYzVm1XV01pdTZ3VFNBanNtclR2NWxTdDRLSlpabFlUamlVNWZRazB6aGpYUHV2Q0Z6UlA4SDBMMm9CRlh0MkJFYVc1TDE1RW4yTWFmaGxodjFPaEthQzJERk1yaDNiLzFVMVlQL3RuWUtRWG1hNVllcDlGQ3BJT2p3emsxOTh6Wk1TK2RIT0lMdHA0RVo0ekkyL0czelUxUHhkbHhlTTlaL0tMT0U5SEZRaFQxUkQ4aVc3dXZySUVRSzlyMVhmc2hvL1JTY0k0cGxKWnZPSEhDdXc4dFB0ODJPZjViTU83Q0VkbEcvTjVQM0RyOU44VHBCa0R5dEJOcEg3NTZlSDB0QVprblhuL280QW43c3lQQk1ITngydURKSHBFanlhVnVHMUlIdmNiRkdPS0F2UzNyVXdpUmtpMFZSZU1aOEhyVFlQQ3pyRW9HejlpUGp0T1J1Nm5tRVJQeExmZkovUW4waU14MkNlb2V3VnZnRC9kaUtXZ3RaUVdYakFPRGplaFVpWExmaHphZ2c5Vko1VnNLNDIrNVZiRXYwcTN3RUluZlZ3bWl3ZWVRelpTUUwrallGQ0ladTBSUlJ6SFBJcUdQdEliODg0WHJzRUttdWJoNFFzL1dzamhDbDNkUDRGdzk2U01TRVZBanBtMnUrK2lhcmdvZm1LNVB2aTV1Y1llWHpwN1p0cUFaVW4wVHkrZmsyY2hwb2lsaEdtMWRKYkcrdVNYVVZJSTRRQytIb3RCNFRaWHdKSzVpVklnV0ZBOVFYRFdTRDIrSDdGd2I5NWFnSzJ1ZW1vMEtxaEV6SllWdjhnYkRsSC93MURCYkZ1Z2Zod24vZ2RnMnZBUndRUUNUMDFPcThPWlpHeG0rWWhiMHFJQVczUWJ6UUVENThPRVZNeXE0NmRJQ1FxVm8vejNiK1NnKzQzaEdUZnBIWUJhWHY3YU01dWZvenowL2N3WEEzdTRnRWV3bVAzdGhZU2ppVytoQy9lR1Bia0dSdEdRVkhydE1JN2dkbXlCR2J3UVppbXN2R2R6VUpuekdtNTk1SW5DaXhiMWtvRnRUeDhDeXZ2V0dhY211MjBUYUVDbXV2a2FTRXRPUytwTFdDRjh2Sk55Wk9TOGV5SDA2S0hlazhzUTRXQW1rTGNCTFBaTUVteHJ5OWFlRmRSaVgySjRpbEYrOExRUGhPdTc5S2I0QWlNT0dlQ1EwR2Q3aGM4RHdNV004SkNuZm1wSzZuNEJSTnJOM21IUC9aNGVJbUlsK1B4QVErUm5YWERNeExiUm1TcDVXcHUxSURBQlBDWnhmMVorTHhQOHBkQ2swQTJZM3lWbVYyNWlyMDFwcWNhNXVEVlpiUTdKNHdSMVdLOHo0UmFPeVg5UHBnQkNmdGVPSjkxZS9TK3VzaDFtbFdXL09XNmhIUEFXZVg4elc4THkzdTN3bW1ubGg5MExPZUM1MCtlQ0NPU1JjMTk5T3NWblpMQ3RIVWpYOGFyNWdlRDdYcWJMVXVNWGM4c0ZlYk9GOXR4WUxPQytVMVMwUlEyd21JdStJL0VNc0ZSOGdjNi9tQXNVMDR3SU00dFgrM1A0NUpFZE1ib2J6c0dXK2lWNlZNeklaTUZ0OGcxNzlUcGkrSU94RzZoSTBKV2pUOFRvMjRBOTlCMHZudzVnNStqM1EyWmx1TXFqMzNVd1hONnFOZW1zbEFlajhKUTJnaWEyM3FxaGcrSDduNU90ZjcycCtKYXJmdk9YaWtaMXJxN0E0SzlJRTBNcFNOVmE4WmlpNkxWL1VrOGVHYzdYQUtEcmNNRVhTOEhuZjlvZzJFNWprOUcrQ1ZtN09oc2tEQWN4OE1Uakt2bDZMeUEwYzV1VVNORDZNUlJTOE91dmcxSzZsZmVuL2VBYlVlQ2ZtTnJNbUtjc2hURG9QK1ZadTVwc3VKUTR2eE5xMmRnSnFtSlZHVHA0Mjh2NVRYYlZRcGw2TEJycThvbXh5cmg3RGRxdlkzZEtSNWxMSnY0c2plU1FCQUMrTkMzVUZDVnNQZFJwZThIT0JIajNVaGFaZXRscndYU0o4ODBpZW1OazRaVVlCNU95NzkveXlQRFlVdVpuTm5mNmtBS0V3bTFvUkZXZzdWTkdabTJTcXg2V2kvek9NbHVudFprT2x1ZTRtMjlYd3FoM2N3UVFMQnByTEw4VjNPTGpOaVVRcFpGcWw2aUxPQ2JEOGxyNUxhMVBVL0Z0Tkl3clZHaUJETnB2bGFVekl1UnhsWG5GNEJTVG1DUUVqNG8yelRwVTlkUnJ5cFR3cmxITlRxRUhMU0RqdEdadmlHWklPV2RqS1pGUTJTMGpRcjB5RjcxKzA2cmJKT1UwYldrV29Ub0F4MGxqS0dNc3VzNUY0RWx3OUV0TnRZNXZPVzN2TUFyamUvdWlaTDRobkFYT3JabHVsVHBTYmtDdUpMZ0VXUUV0dHNTYlNLRTVsaHZmK1ZoczZML3FRZ0xzTFpNNVIxa1ZacTdaZFFqYkhwUEFWNFV1emdkVExteHlPdnFvVHlDeFJvNUM2VWVsbTRxWXJ4anZtS1hyamFmeEdyZjdFbFNLelBBcmJuM2I2L0pha3dPdXAwT3hQdWZMRm44NkJxODkwUE5Sb0xZb25WVDVIZGd0YzMxTFZiQjRtak5DcTQvMWpETE9Ib0pjdHl5a2N5R3YrMEtzbmRTZ1pkVW15cVV6REJMbCs2Z0MwUU43UTI0c01PSnk5SU9DV2g3Yi9WazA4MWFhc1dVS1RRaVNqYzdpUTBETTJId3pyOUVKc0VYUC9hbDVZT0hIbjBIYlBUaU9JcFh3TnoyVCtNMldGdkc0UEpGTC9YWjN3SDJLdUs4a01zRnRvSzFxYkpBaFRZbmJibllZRFZUdGl3d1Q5RHZXWG4vMEtPcit4aTZwOCtVTFh4aUJWWGx6TGpOL3lkcHRoamRNUmpxd21ZdnV6UWFKTWs1TXJqY2tCQnpvdHcySmEvTnNUYml5L0JON21UZE40c0gzaWptRzZ4Y2dxRHNNdDZNSVpjVDJrU0NYVnlxUWZiUkVKYnFjSzV4dUJ6Ykw3QzFqUUUxRDZKbklYaGt0SzJ1ajlaSXRNUDFhRlR3YktrclZ2eGhxUkp5TVRwOHQyT21DTDRLTmY0R08zajFYV1l3RHdHNFpzb0wwMmpNOGU2RVBRaVZ3U0UrSkpRcXJDaHZLUzZGbEVzYi9QUVo0SnFnOWE3TmczUVB0eTZjVFllbm90RGV4KzJ6cG1ON0g5VDhSYnMzeTF0MllOVXhqZWwrOVIzRVVlUk4yMG5XeGx1MkJYOTgvSWhoSEhZa3grMUJFOUVncWJHYXZlb3BKUjRGQUdEWitaY2wvUC85a0FBUUFhQUVBQUFUQUFRQUFQQVFNd0FnQUFBQUFBN2dGbFFBQUNBQWtDQVFFS0FnQURBQmxVYUdseklHbHpJRzltSUVacGJtZGxjaUFvTXlrPTwvQkRCPgogICAgPC9CSVI-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5SaWdodCBMaXR0bGVGaW5nZXI8L1N1YnR5cGU-CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U-CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0-CiAgICAgICAgICAgICAgICA8U2NvcmU-NDc8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk-CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI-UmtsU0FEQXlNQUFBQVQvY0FBRUJBUUFCUDh3SDVnd2NEQ0FyQXo4QUFBQUFBQUVpQUVBQUR3SUFRQUlBUUFJRkFBRUI5QUgwQWZRQjlBZ0ZIUUVSQVk4QUFUOWJBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQmp3QUFBUkVBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFFUkFBQUJqd0FBQUFBQUFBQUFBQUFCRVFBQUFZOEFBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUUrWXdBQi81UGZHMkFVTFBjTHM0eXpxMENpVU93aGRLWXU3QTBvN1dZcnhjc2NVc1dwNkpLYWh2Z2JraUlveFN3MHpZbzlGZllFTFpmaEJNNnJwZk9BZ0lEeWlJZHhOaUo5Y2FSZTlCS21jSzRkbWZ6QWdJRHhBR2JyS3B5bWFZUUwrUzRBbzZqSjdNajhCNEQ5WWhCZE5UMXBLSG53QzRRQ0xBeE5UUk54MVFEM2cyNUIrU2lOQXQvSFdBQVlyWGh4eDQxL3FpVFZrS3VtTjhMTnFEVjlsSFR3U1crQW85UVI1Z0FxZ25CUGJ4UlYrRmg5YkNHVEZMMnVMQWFLYTYxcS9LVEF1ZCttcW84TDkyZ2lSaGdDT3dtWml3cW5wRnE5ZFN3WlFtQmpZYkxLb3RZQXN1a0Y0OUZCc2kzQURBWnZ4SEhncmxuc2tuMXFFQ1dNTFlGVDJmdHovdkZBeGVMaWdMcks4ZjFHc0RReEx1Rzk2NWc5eDRHNGRNQUFjSVJxemh2c1lVb0U0MU9jRzVJMGN0Ny9QOGdBM0VDL2U2ZkVVdmo4WmY4TXMrWnd2Y0VuMHQvcEw1c2wzZ0ZHczB5N0IwaTRIUElmU1plTlFYUlBjbHQrR3I4aS9PNHBaMlpxbEFObnhCRHduejl5QmlDczYxTEt4Yk9aN0ZxMElDZzJRRjJrMVBGbE8zRlpQcDM4NUpLTlFCUkN6RGlFT3BMcjBFZHFINTY0UjZlM0w3WHRBZUtIZ3VwUkxPZDlZRGtIRFdFb2IyYWUzQktMc29jRFFENUJuNUY3bklOU1ZlUXVKUHRPOEVzWWRHYWJwM0I3eVVDTzVHMGErS2RvcDFuQlV4SjVPSGlKbloxblpQNGFROHpNeFNBU0xySlFIakV6aU5temNSM2EycEk2dFFiRyt0ZnYwWFJ1NkZLK2gyTFoyKzZaQTBVOTBJYUQxUExRRlN5QW02TmpCWi9RYnlXTnhGdjZXZFNxSG1yd0xOa0pWbHl0UHpYZ2ozRjY2c2Q1VjZ5eE5UV1dTcXBGNWx0em9IaFVhN0JDenRIQlZGamxpemcvZjFOUXNPay82SnJRbXgrRVNEeVEzdlNWSVd0SkpVa1RBUFhvbzdLcG53UnRhME1vMitMKzZDOENCNlJxS1g2dGcwY0FLeFh5OXdxQWhvS1ArRFFNaEx3K1BpeHZFRE9vOXpLRXk4ZEFvNlBvTzljdS9QVDRud0FJbnBreWU1bGZjckJMWHh4bEVhQjJzTGQ3QU1lai96WXJTakNFUXhBSUZ0YnhTS2lXVW5HTHUrTTJmM1J5MUtvbXZvRG5VdHJJMDV0YjRyb0Q2bGQyWnUzOG10S0VUeHdVNW8zMUl5N0VGQ0xvamtORzV6U2RhcUV6SktaN1JwcXc0bVRLeitUSXFvMjhRUWZ1N3BVQTFFY1JFbVRrWVBsbFZjY2V1KytOVFFzU2VrMy9BRTBsRHRROHJjWGExdU1vVGE3TjBjWHBNVmxmRWhtWFNkbks3ZllhbGcwM3JUN2VIa0Jya2tsZStIY0taR2N0NktBSjJFa25nOFllK3lMSjdnMjZLRDE3TG5uNGdFUzdaRS9Ib25oQWR4UkcvSG9tZlFuT0NiVmVYcmFsOFdoWkRIWWFnSHd1RE9lWlBOUGhFdmo2MUJ2ODdxK1k5L29SNE9VZEoxNUV4WlFYYXVQSU5heHdlWFE1dUJPOVg2ZmJxeVpzVmhQeU1uUnVsVXRVbUtQa1N5R2VMaGdRWEdpZmlpTDdubWcxUE9DNFV5cXpndllidmJDL2M2VDhJVm82TDUwNGhQdXJ3UDRhRHBXODRHRTRhMVJVN1h5WXhjaEtRYTRBbzJSM09QOFNFWEIyaVBNZ3Ruei9OWHBJYW85bUMvdU44WW9SY1QyRUYyZXFPYkZyMFFDdDZFcVVkMVkxNGFoQ0JHaUpCTWF3bmtVS0VOa3djQ3BsRWtqMytuWFMvZ2Vuam5DS2I5WDhuTlBuTGVQU0NObERISjZjUm0rQjdkVEdLQ2lkVWU3QUV5bkZUQm5VekVzVUxpb0YvcTRSRTlVcWtqdlh4SEM1SUFTU0VRamFjN0ZINzZ0R3RiMlVpS0NVMTUrbEpBejVLeGJYRzFzUlBJZnZER3U2NnBEbkZNYitGcjlPcnkvOURvU2FTT0VwakhQTmlxS1hKVHJTQ3JTRFRMTm9acTN1L29mdmdCZ28xak1OMmRuc1RTcHBNMmJhN0Z1Z2hnU3pJWm1DU2pCNDBjRnFkT2RabSsrUVRuSnhESTlmK0hLS3JEakNoMVVBYUN6Qm1HdFVUQnFDMkhCbG1PdFBDMnd4NXg4WXlOT05ZUGhQa2t2TUlDd1VnbnBmc0JaUCtDb1BkbEJ1dnRQTHIwWkthV1ljK1JZYXNmSC9hL3Vjc0RTR1Bna3Vpbk5UWHRBSWpEVDlESUVJOFlkMVIxb2t2OHltOEVjckh4a21HL0hIQTNjZFlMTzg2MStVOGRLTEhHbVlPZE9PdlhtdTJwUGhFMjlKOFhhQjRqK0RlYkk5ZEs1Rmx3OXN5RVQrd0Y2VlBnc1h1L0VKNG0yVHFMWjlOOVBNK0t5UE5rR1Z0N281MDFBMWJCU0JHdmNGSGZ0RGhORnhDWmltWVY5RjhvYW9jMnRQVlJYeFZvOHJic2w3MHhycWhXN055MDhEU054VmxXeGltTXFSbFZzQTlPS3F2UU1LWjZHWUl6bDNKQithYzJFM2RaeHVsTWc1YlZjVzJHTlQ0RjVBbUpYWFplVTgxY04vVXBjWjh4bk1UWEtpK0E2YzBqOCtUMVRzaXhOU05QWlNOajRLVTZobHBmbjc4cFluUDlwdXJwY3ljZ1REZ1BFNW1kcHlYTEVhcjNJQk51MTBqMWVDK2wrcGZBSEtOaDBGRVNFcmJRdlc4eWg1R3BraHJ2Y2lIbWNGWU9DbTg0YzBOemNFY3ZjLzBzWFlpMURFL20yVTkzbVlybXJobnNhdFdUbVorYVpmUENQa0Z4ZCsydW5uMkgwNStzUUNreWtJTUJ3UHJ1Z0FtbFVBeXJaTzlPc085TTJMdTRUVlliaE1odFpUcWhYN3h0Q2lSc25zUi9pMUs3TXVIMlRtY05VdmFCdnhZdStmcWpjbTdvQmNzQm1XbFIrYko0RG5lZDNWUU1ZUUFhQ3ZkcVhvTnBtbDArM1drSThKd0QwaXlJVTlXYVdaa3JsUWo5TU1RdWtBT0R4TEJyYS85MXFjSWRyUUhrZVZwekR1dVQyakUxd2U3RVhKVTNiRlFsTGxLOVo1Ykx6WVQvT0NNNzBLb1FPU1p2dnJPS04rTTFIdjRzd2NaSnU3ajdVQmh1TTlXN0Ztc3l0ZDhjUFZmZk9iRGJVWSt6dEpoQ0FsZ0hMUVNOM3RGbU9BMjlkNXFVUFVWOXhsOU5yNHk5UEsxN1E1Yzd4OGczT2tXcmxmUFdiUkpOckRBNjVTcVhDN2VSdFhMTUZDaVZpRjRNbSt1cHFUV3VTMWttMUFmcVBKSjRBeFhEU284VjhROEg4UllUSXBIYjZTZnlJL0MyQk9xN1k0SlpidDI5aXEyUmJBU0xiVnBCeFFLTnlGRzVlR2ZCc1NWVHd5L09vWC93cWVWMGFoSFFnR3RiSWMxcGtwQU5DZ0pMU3pEaTQvUlYybnV6SzVGVlJRb21KWld2TlNTVUxyaUlGMUg1akJIS2g1ZUFFUGFXalNoS213bWRWTHc1c0RreHQrem9KaEVHbmEyek52Q0s3VkdxT3FvQ0l1YWhKNGJRQkNYTXkyZlQ2U2dud0I0RlQxN0MvQ3lqb0NWTnFyUVoydXIvY3d1L0xMMGtwUkdwbHBuTjREd2JzU0xCUllFOGVFNTJVeUpxajVxSTQyOERLZ2FpeFFBZVlISGdCU2FkUXFsMzl6VkRvakhqRnBINUsxcXZZWHo2WjdmUjNUQXhMbkgyMnlUZ3czZWlIYUl2Z1poNisyK2xaZFJsQ2k2b1RoamVWTm5uSWZRTkV0bkpxdXJrblUrTTl3YzZRNFBQQk5CeDB5MzFENHJZZXA1eURHNXhhV2VIMzV1c3Q3TnN0Yk55OUpwdXIzclhyRjVTUEc4bi9Sd1Buby9WUEE2c05lRGtQclJzd0JFY1ArRU1xWWV6V0tHY0Y1VGFselR6TW1OdUdIeGZ1S2V5MEJ0OXI0VU14a0tDUDRSR1ZHYVBXV2grWlhpUWFPWnNQd21LN3VxSEowQWs3VWcwbVQ0dTdBRzcxY2taMXEzbHVQOTZWdGhaNWR2WTZMOU5zR0lUdGptQ2xLUWNWdEJ5MGU0ZmVJVEpBUGpsUVBLOWJPb2RNZW1pY2ppRkJnVWF6dTV1NndiZjlad2Y1UTRSMjhnODZUT0ZVa1RreGlKWnB4b1F3bVBmTmZ0Q1BHQ3duYlQ1VVYrWkdNQXQ2ZnRRWFRVRnU1clR3VVdmRy9VeGhNQmtMRFZYNCtlQVlFYzZ5NGJLZVF3ait0d01scnI3MzVZbWRIcWhKeUloR2RMd3lSUDJlZkE1ZXBpVVFVZ2hSd1N3Uk1YU2lMc3JxemNRWS9wRTFROHh2M3V0VFZWYmM4dnpKelFRWkFUWEFMeXpKc0xxc216VWFMNlZWWmNtbjNXQ2xQNjA3U3drSGR6SGtCejE3OEZNcWdJTWk5c1dGQ2Z1Y1ZJTWdMcndQd01PY21CUEExMFQxOVJldE5qWkNuc0FHSGg1YytZRE1WUk1NWnNzYUNWcFNtNHpXVUQ0K0xuS0VhU1dvbGpUM3ZqMkY0bTZaeUM1RnM2RXhZbEtqT3B2Z3lYNnorRUtiOGEvU2VnNm5CN212R1R5N2FvRVJ5NzkwQllKcjZMQ0UyUllPa3hsaTB3MEZ2UUpmV0c5aExXTlZTdmdldkxVTjV2Zkw4MGpKbGNjL25IYWZkZVRIUS9uTXNCSTlKVHpKVklsR0hkcE9FdDFZSEpCcTFrd2ZNS0JKRlREYUZhV1ZHZlRGY0gwYis0N0pZNVpOOWszUk1scTdoazZvOGh5anhVUmluZlBFK1YyVnlhbHFUbFI1Mmt6c0pnMU91VTJuY0U1bHZONTd3V0VVSDNqejRaYnErQkNjV3ZFOWRMeWpSblRVMDRNbkxlczhqbE4vREg3YzNPUklpY0pqR3oyajhNNTdXS0VvYWpXOVBmOHpFQjRTc3NuclZ5TUZadjZlQi8ySHBpekM5WDZ6N1JYSUZibk5qWFNxdXRZdVM2b1B4VjdpV09KQzZrUThvZ001WVM1TGdOQ2lOYmtLT1FxUWNhcUt3WW9rcVR2QllnRnY1cGlHQlIwVE5nbW5wRXlvNVo3akZPbWQzNGNYTnZDckRoR3VURG5KNDE5Tk1pSjd5MmRrTFBmTnZYSW1kZGV1OExiRlBKVEZWTStXcG9jM0V5OVJMR1VZWTlvUEhYdXZmOGdkSkpQSWh5VHU3ZU5yMUtqSk1qSjZzTVQvbDlDTU1lbEhZS3ZkY0dtR3J6ZkZ1WkFEb3pYb01XYVpwUEl5ZWZDWVdLaExTNXVXcnE0OFFyU0dNZlA3M0YrRDRGb2FHV0loNWIvYjN2Q3BQM25MMHZlUkY0TW1XTDVxY0xCbUt2OVBqbVVzOWRuZEVjazRsNDRRK1NtWExPZFNkdkFYbk9NdjFFcDZYTVdzWDhveTkxWWQvU0NEa3p2dm96dTZRdzJTeFRhditjQmlXS1JXakY0OVUrZ3FTZWw2dEhVOTdwdCtReHNaK1Y5L09La1lnSFhlV0hKZ201REdmTVRVcGg0Nmt4ZFZ5MERHRGxoMmRxNHNtb0plQUN1aERsNlc1Y2prK29Jdk45OWVvbFBBVTEzNk9vYjhwc2VpOWpNV21aSEkzMUt0eTdQMFBpK2xIcjZpVXdNRjFMNmt4SEt2d0JrRDRWMjlIeTd1MlBTaFBhTm1HYURxM1haZ3BLbTBxeTJ5eXhjcjMxKzdDbTZQQmx2ZkFHOE14Szk2NUx0eHpCUlc2RjZsRE9UbXJ3dTVnMmVuREtrTlVSRjQyMGNxWVJzakNrL29KN1I4REFyaHdOY0NITExsZkIrWExkbFhhSU14WllvbldSbWhReFdPREtmajYxR0I0V1lYZkhPUkxwdUU1bFN2R3JJdEt2eHJhYmR6Qi96RHoyWThpUWRXVWFlNXlPMThrNE1xSkdhc1h2UWRaK1g2dCswbDQ1elpXY1czNlU1WE42NldMMEMxWVVMeW1ZSjQzbS9OZkNVZmkzN0VlWCs3VG04dTBTcFk4N3BhS1VZdm5OWVA1anZadTB6anZBZlVjRGJJZEpUMldjOGV5U0g2NUp4anRPWDIwaVNmR2p0QkQ1blc3dmplNE5NbzBvSC9ieVRHUUxLdTVyRGtrcmxDS01wSjFjTXphQWo1TnVRVzlidjY2RWNVTHdNeXV5aU9Ta214dWtHZEVURm9VSktLZ29zbmNGOVVOU045NnNLek16S1NkZWh5OEdCUC9mWlRlTjVZa1J6OTIySkxLdW5iNmxqZVV2ZXpFZmc1a1hSYU5xbVNsZzFCa0hlSFNnMGVFMTAvbW9UeHYyVDlwZURkSUVCZHRKK1ArSkptcWtIeTlZc1hGREU4bzdTSmUySjhDR0I0UG0vZWRwTlVjOXZVMmRUdHJXYUlOWk1jNHNkNlRJVjltblhJSEJGM2xtd00xdjFVUmY5WVN5WmNKL0dOeEVVek9qc28raXNDdW5tVUliUk5UZFFUVlZ6MDdwOHVaSlE1bFFHR0FPelFlRGtFeHNQc1ZwbjN1dFh1dktqZTQ1MDdsNTlXZks3MVIzU1FROFJHeEtoOCswZEUybnF4V1ZiYTF0SzJHSjZidGVPK3hlYVVoUFM0Z2NaWFljSFhpRWlTMHptMGk0Y3FzaGszZG15a21TTEdhcy9BYUFwTDV2TS9WblBIc3hjME9DUlRmM05FZWgrWHpZd2NheU5tdlBYcm9VN2d4VkIwSEo4bG54bUUvTnc3TFFWcStWQmYyV0JyT0dxbVBseURNOXMxM1k2R01sMUtWcU94SUhhT2wxbnlsbTJxYnI3cGx5bFptRGpOVHQ5ZnRXekU2UjBFZVc4QnV4WWZISGxlMUJlNGhQRVkySDZybTRZdS9zRzAzR1VYRGJCeVVPQ2tnUHJiRVJQVS9kUE9MbnZ4eWFHOVZpbEppL3lhc0FCZ2lIVHU0SlBNUE1pdmxRUGw1QUNoRlVSclBsZlVIK0RHQnQ1MnNaNDlHcFp6TWpzMHFiZ1NnL09vdDNjcFpiZGh4NDQxQVo3bG8yVWNhcVlxM01JV0RrRzVtejNuNzdNZU1JVWtocUNlL3BZVU8zR3djNEYrUGJHVXMvalBWL2RMS1pqcnZFRmVWUmg0SlZMSmN5endDeERMcDRHL2NFMXpzeVRHR25tYkhuK0hFVTd5eWN3amw2NkU0eFdSWjhIRHN3QVlmcnRONXFWVWpoandCNE1Lb0hoZ0NFenpmeGp1TDJqWjdEdytTZE5nSVIxRUcraFcyMkdvdHVZemx1RU9ocVR3alExeXVCTENIeHVJcldNM0YrTmMyN2cwYmd4WTNGQjFwUzBBc1QyZEhyUEQ3dHdpM0g4TVJvRThwTjhWdmJEdjBwNVpiRGkrRUhFc3VrZEp3Q2pIQjkvMkxvejdXWHFMSmp4d0xjNGdyeG1ZZmk1Kyt1RUlJek9BU2krMUpwRFpsZ09sbWNZZG5PS0JlYkU3TEU4QWtrRU9yMVJja3FvZ0htZFJ5ckl1OGJmRGt5eTBqekxLanNkVEh4MnNrdGZtZjZBYWtOMXpQUGlvVXprbVpJSVRIaHJFZEpzY2xYU0NlamZKcWdMMDNRMVlPaTNZSHc5L1F2R3o5MGhFUktsRDBCTk5pK0dRejIwTU5iNHFMdVA5MVQyZitNbnZoTWJJOUYxVDF3NHI0SkdxcTdnc1JtVEtOYUJabkxham95cXdXbnp0bjcrVnBkRjArV2oyM0tUa0xmTmFnQ09OenVad0gwa2hXSldUbDBuVmNtNG56cG1qcVpCOVlKcWlDSE5Eb2xjRDMzYVFhUkl0RTlqQ05mdXovUlFYTHZuTzlqL0kwbS9mVVRpWTNvUjhmSjYvU1ZQdVRBUjErK2YxMlAyU1J5aXJvZXlpaStWUGMyWllRM3NCR1F0Wk9SSzQ0Tzc0M0hzVUwyWDN1bU9nT3pFcjFFei9XdVNHUGNTME9Odkp3Y3V3VndhVXJ5cFZZTDU3VENoOTB6ekg3K2RHdDlwNTVHb2Z1bUdYWHpmWFM3eGp5T0tHbGFsZzU2TVVwdmNsWTRvSlczOUxzc0JsZ3dkUkoyRnBlWWdRUU5QbmtFUFdrNjl3WXM5YitxUUdPYXA5dDBWcjBKcStLdmJaOXZtS2FOc01kaEpOL3pPM0NaRWIvUDBrUTF3anloaFovSHBvcTBVTjUrN3lpSDVQSHFKTHRIcTNrTHZoZGJoZUpjZWEwUVlzQUhxTjdSUHJoSnlJNUk5VlhJT1BOVDJiNDlBTDJUTXpzT3Zid01zeWUwQ0swdlZLWFdoS0dsVzd2WGQvMzlPRXBVN3FzMjNKYzVBRWZic1FoMUdwU2dsUlNIazlGTzBkM3JjRndtTVRzNXExZkZ5UUk2RXFKS1J3cGdHcDJzdGI3ejF6UzFibUFrSHJZbTF3NlRVOWJ4R2hiaWJMRkhNZ052UTkzdm5lZFpTWng3YTJBODMybk5NeS9KMFdnMEg4V3FXc3d1WEZZOVd1ZnVwbk85dGhzK1d2OU5UQm1qMytFV3cvOFBNc2NSQ0w5NE1vUDNLMS8vbmM3ZXZCa2hnWkFLMThTUUhHZ3RTNnFNdXFxUDMzR3hOOFlOM0tlTElINkNhcnV3ZUU5NWU4SmFrNGtiS25UcndwUWlZbjk4Z0RDeTRQSFpaMGloYjEyb0lpeklESkdMSjRmWkdHbWdOeVRhUVI0c2xqcndGdTBsUDU3NWdqb1RkNWZPRkFjWUpsdmNBVzZkdTJuZHZCQ0hXMDd5ZGpQbUNJWXpBdVFFVHF1azNhZDhNaXlJei9nZFYxQzUvT3o5clE4TTdTZjlHZWRlRWNPYkZSTXJpQzNnNG9ZWnBnNWs1NDlMZFNmQmRJTGo0S0ZlclhmYk90MUs3UFRtc25UNkJhTVRVRkU1bm9LS2hCUHBwd0Rka1BzeFBGa0F3b0ZKZnRlZ0lQNHhiK25mTGxsNWQ5TmpFcng2UHk2ZDdJZWtJUStwQThob3dzd00wSjF4KzI0SFA5YytTMFBGMy9YN1NpNzdxb3pleG53WHdvZFBaMEFJVkFPaHlsMnZudlZRNUNiOHFBbmh3VUFqRFJhOVBoTXowV3JWOUNaaEJtTTFpUWxQTW1vbTg0Y3hUeHZ4bVlmS2UweTQzN3FxSzIvS3N4SzA3WlljdFdSdXRsUEpjNGROUHlIRHN5T3BWdXQzY0ZQRzVobVBZQWNYa2NzeElJeUloeHE0L21rNXU1aHNWR1I5WExhaDFRSWE4dE5EYU5UTTl2M0V1OWM1SXJUUmtGNUpCT053ODVuaEdYQmZOUHd6YS9ia250WmwyWEtEYVVoSTdrem5JVnVobTd1RDZSQVlKVzRRTGJrOGNLNkVXQUZOWStKL0FrZHZaRXFyWHJaSE5vMk9EeEE0M3hHOTB0SHdIZmE3bk5vUjNYMHErcUF3RXFqd0JYdkxadUtIZWNtOVF4ODJSL29IZUJycm5Oa0ZCNk93TS81UUhacVNFakZXZndrSEZOazAzLzlqTHJxYUtyRGF4bHFVUnJ0ZWxaTko0VXlQVU4yNURkNFd1ankzVzRvRkhZbUZnUG0yVE1oTkIwSitheHVlVk50Y0tCeVZRRHZyN3E4cHVPSVdYeE44V3pLNW1JMmlLUGNIcEFwd2pSaUdESlpQS0ZEdjBQUEg1M0lTVUpPSUN5cyszZ0kzWU5CaDRnM2J1RHU2WUJxamtQaTgrenloTVd4anBVQnRGVitUcHFYcUpNNUhUOXloS0kyYVVWVkppZ0VOaG8vZVFFSXpoeFNlOU9EQ0hSVVRBTkpJZFU5NGdIdnVCeWowNytTR0x0NzlGaUhGVFhvMFVnRGNLeHYvenFIMk5BZjA4RGs0Qmt5VW40STFCbXBwZzBPNkVjVEN5a2JnZnpBMG1Db1FoV2RlZHJPQytncmpXaUt1UEllUjhQZHhZQlBEL3JxZ0h0aCtmMEcwbWRTRTZvenNEZzJ1c2NtTmRpVDhBV1A1cnlCd1ZNci9QR0RjbFFIMCszdUpBZ1hLS1VCb2ZpRGp3YU5PUDFMYzhHODZIVVdBQjhlZ1dNdnpPbGlFam5qblBhRzVhd1kreUpSaStNekJyZW5CZ1Jmek5KSTlmY2xiOS9YbTdOcDRiSTg5Ynl4Rm1OWmJQRjVkaVdVVENJT3VVcCs1K3lZb3BlWUsrUzVtY0tGand5LzNReVNEY1NDREtjL2tTL1VQYndzMDZGRmtuYXNsV1ZzUjdtNjVRNE5mZ2owalNyMy9zVk1qMnBzL3hSOWpFdE0yOG9Zem1CQlNVOVErN1hGMVlHSVVNdXU2ZXBMbmY2SzUrL0FwZjBqT0YwNXhHdEUybU9XZzBwM2FxL1pNOUZBVlpSbDk2MVFYZlg2Unk1NlhaeENVLzdrekNEVndtQmhOcllvUEN1TTIxOW9pK2NxK21wWndGS1czQmExalppTEJPaHYwZEd1Z053WjFIOC9OY3ZBZml1ZFdiNWsvMWhkUW4zOGhhZ3g5UmdYNmxDZFIzeHBJZ0Y4RWRYMU1oOTB0S0ZRSko1aTZYamNOY1VjeTM3M3YrNlAwTVF2YmdjVmtYK0h5Y245VDRlWHZQOFhoaUNIQncwaC91aGMrbzRZNUE5UDRCZ2Z4NUUybUFhVFZhWmZRRURESE1ZVzdKbW1xZmxUQ3JVVTRVOGFqQXFzY1RUZGtoTXhrVWRHMWExUHlEMUlUclZGZm5NMWxiTFphMjRRTFI5MWFta1kvQkJnWExZYU9PcWJsdndibTBpU0NPV3lKVVhQejFQVjltK2Y4NldxbmZuM1dHSmROQTBjbFRkQkE2K09vaWdQTnAwV1ZITlE3QitsN1V5UEV1U2VrTWVVOU5kTEViUi8ydHNCZjR5N3MyV25uOFZoeGxiazlUZ2FQaXQ5MDlVMU5NamVrNGxKU2pobWhQS3c5WG5MQldXYkM5ZUtPYnMxLzFqWjhobWgvbEZOSFovb2JFM0ViTWpxWjErcUNmYVVMTjltaDZmZmpDN2dCbHlkZnV6eHpHc3RVaTBHNldRck13MDVMbXVuMXdHRllJT2hPV1oxeVNUOXJuMEltT2thVzFkekUrYWhFQnA2TTYyM3V6VTlONGhHWUoyanFTZk90VC9RTzRJREl3N0UzTElnWkd2U215cEVJcUpzd3FHU0ZWbkdFRmI1eVIrblVZYUtWeUJyNis0TmtMV2hiMzdsemJ1UUVRMk91TnZYZXJoeUwrQk9EZTZ0aE5lcG9CWTYxSllXYUFDbHdQc3M4UFl0elBYNTVZYTRnYVlzSWtwcC9GZmpPNVR2RXNWWDJPcFNvTmdPY01scDlFSXdvcUl0SlVYNnM5RmNHM3U0U0dHWC91TDl4NDgyZEZyUWxrakF4TTdBMC9JdVZxOTk1QVRGaW8vUzZFMUlzT3hLdmRhNVdWVmZNOTMyL3RjT1BsQ2QxV250UVdrZDB2UTd1VW82WU9lVktGdTM5eTJwSjRJU1RFOGxIQ0E1dDNFeG1EQkwvVWFlbFI3S1FYeEUvT2VManZPYVlNUFd3L3RMcGtsMVg0Q0FnSURtK21nQXdNYTB5SG9pNk1HZVkxQ2NraTFZSzJsNllsVnlnV0pvblFJVXRVNHNOM3RaNk4rNmRrZXdqMU1PQzhaYU5SUVhQRnpUTFZmOTZVZkJNelp0VkZXQW9GT2pxUllOeVdSclRHdHJwWEo5RnJDVzlaZEUxU2hwUXJkalpieXA0U2RaajNrUlQxVWYwU0NLdS93UnBWTkhHeXY1ZG1QbzBnSS9zbXhiTDdBajFPaVdJVkFUd2FqRStHYjRrNHFNRXhzOGN2RG0xRnVlVUt3Zk11UG9aNTZ2QVBsaldoZFVMbnk1aWJXMW1hQ05nMFVieUEvRHg1QlJ6c3cwQzBEbXQ1bWROenZrK3J5bU1MVFZkU0FkaTFOWEFaVDJXL3g1SzhxdHg2WDNaZnpLWTRmUldCbDMxbWh1SmJSK3V6QU5paTVzZmw3ZzhRbXJQczJjUTJabExWYXpoc2pKVzBzSWdrZ1RBZGdyZ0loTndrOEd6ZGRuV094MEZQOWFkSlVZeFZxZno1WEowdkV6NS9oY0UzMXpWbTJWWUZTZEdheTZ6eUQzYnA5eFdvYWRwVUJUOHVPYkFML1dCOGdsZ0sxWjFSWk9QZmliUHJPSUtWQmsxUUY0SEs4bjFTcFdFYytGZmVjQWxzbitWVytYclFLNnRHRys0aTdRSUVzMVhYbEJVWk5aMGZ3dGtsRzZOR292UnVQYnFsd3pMd0tCQWR3Q0k2YjFadzdBQzlJZG9WVnNvV3hGVndMOFZmVHhKbHpmSkc0eFp6YU4zd3NLU2k5Vyt6OUJFL05PeFBJYWswZXI1eDBRck9VQnhFbld1YXM0Q2VOQ1ZIVWZCWmN2R0ViRHNCWmpaQ1JpU0V2aXVrM3IzOXRXdDkrMlpCYWpUb0IxQU9rMFJucnQ0Z2xCRzFnMTlIQ1BoU1ZISlV4eXk4aWduUGh4VzAxK1pMcXdkMHE5L0xBdk9PaFE0b1piOEx6Z29nVlVKSDVPRkdlNWVCa0YxK1dVdWRyeGNQTUxiOW43c2o2Q3hPVXZzVXN4QmRqanl0ZTlicXgzdmVmcVlEY1NGWW5sUnpHSENXQjl2NUFjVlRZWURRR3VUUjZkVmFlSm1JVjBIQkFTWmkxeVUrMjB1UHNSa3dOeURPd2xTMC81SmUxSzlZdFN1dGUwOENRclkzSE9TV2llZG0vdWRpTEpZQVBJeGRXa3k5VDBaRGhwcXlCUFRBOHhkR25nVFoyZlo1VkdqMjVBOHN5TXZHMUQ1M2ZqcFhtN3M5T2oxR2ZGOUJsMnRCbDFyakVBeFg3bkt1UDRpLzF4M2RBN3ZtNG9xcXRtSHArWkUvREhFcXIrUjVZUjkrN0hES3AyUVJXeDFVdmdWMUdDcjJuenJtMHRYdnNvU1J4VS9iVFJZSkhkai9FNzhCQUo0a3NWeG5oYW1WK3hkZTJCOEVDQW9UNGprcW1RdnBtU3JaSzg0Q2pLMnJlVXAxamtNaWU4a2lFaVMxdU4wNzJXeWtQU2F5N3dseWpPQkR5VWg5VU51TjhEVXYwRFNIak5rRmRyUTZkdGdSbGVMVzhRYjJBSlRlSDAxbjRHeSsvUlY3K09mcGpwUC9DT24zRFM2N1dCd0gwa0Z4TmY1dTU4RU5nMWF4eGdwUm9rUE9vb3Y0MmhyNVpXQkgrTGRURC9HMHJsdnVGM2FobFlYSHJNWGtESUNMaWNyTmxqdVdiR04vOW1tQU1Zc0FSb2tTdC9WaFNSUFcvMUQxa2llYi80dFRKUVhsYVdUay9JMVVVQ2hXWXJndEtGZGxMZnZQQ0tFVkU3L0owaklyaEtudDB0L0xJSGJRbSthek9TYUZ4WUlHc3lpc1g0L001UjVWeld4bE0vTE14ampSQXVCOEhrWTRHNjBXR3RBTTFXem1TREdwMld3eEM2a3BqYXQ1WDRKdjNXRWFnQSs3QXNpNjZUS1pDVklCdTlGelROY0FHQlhBZ0ltZWVlbHhtaDMwVktqTjBWL0wySU8rOWY4K2VHdktGYmU0Q2R2ZTh1NGxMd0VXTmRvTEhjV0kvYXRTVjhQaEUrMXBrVlh4NTVDSm9wNWNscXhVOFlXdVZ6bWxRTjkvV3dIMEp5N2dWRzhUa01NYk5CQ0VRdEYxaXFiZGd2aVZzY2o3T2o1UmhDaW41TXZJekEzTmtZdEVlSlRNMUNGWDlFZ3BZU0xoVG52UjNtbE9zbkNVc2FKQW85dVFDUWs5YWV3TUxsK0k5ek5WWnVqQ2hLRlVSc3BaRmNZS0J6aFlucWpBUUxITEVST3JNTm9GQlpheVg5dEIweG1TZzB3WXhtcWlMblB4Tk5BZ1laRVlaUHk4cnNmQTdZSlJHSW9NWWljeWljTGxVTXdQUTFLelNQSHlqYkJBaGdVa1FtSGFFQzV0TmxsUVE2VmdVMjRJazVlcHJ3d3p1YWZVNmM5NVU4RmtVVVByZVVzMUdGWDI1ZTlqTjJJWC83SVlJZHhpeUJ1SGgxdUlEREpBUU9sSTFlL3RUVncrYVZlK2F0elZtUFBhb0FwckQvVlI1V2pPYk1NdEwybWZQa05HRjh4WTU0cUZuK2VNWjFuTExTa3lKN1lFaXZ3SmhWSWJUWnJnNHpqYkFZcnJUOUI0cTFuZFZuUnhyVHF6ZG9ZY3ZZZVBQdVVFdDFUWFNiUFI0U3lmRXRJeGpmY2tHRUc4aFVxZnNKbTlPdVVkNlZNRlZFY2JiaE5QazNnMEE5NnFSU0FDM1gxUHBjNkZwanNvcDFqSFpFcnhaV2wzeVhJVzBsa2VNR3V2bXcrNmNwTU5SN0VJTCs3Z0lUenVhQkFkUmlELzFmOVRsRk5jd2N4NGZCTlNsYlJ2Zy9XK0pCU29lSDRVOFR0QXVib2xRWXU0SXN2bEtWbkZITHFyMnVib252TXRXOUl1QnR4OHR2a25ybnJYOWhncGJMRDVPdUNxUUlpdlUvb2ZWTnBYU2lsMjF3b0RHSjBxNXY5cmRVRExLQ1ZPcTRKbFB0QlhsaVRHN25NSnZJekRTTUNQNVZMaFB5Sjc3aUttNzh1SGpaNkJjQXM0SGFOdFhzZ1o1SFIxb0svZHBtdVJyUk41Rks0T2ZHR2ZZQjhGNk1HS1lVV0lrOXh6UURWOGg2L1EySm40ZzZ2Q1RiaGZlVVJhcWF3MERKT0xDcnA3ZWFOOEN5QkV4RUFObVUwcHQxMGw1ZXQ2RDlPNTlheWY3eEM2cXpHQXlXZTl2eThScFhDOTRBWk1uMHhkZis5ZWs0d0tjd1RsUnBMeCtCVy9yakErdXhvVTRYK016L0ZGazBldnA0TjFLZ2V1V2VCSTdiMlg3K1NpaVlRZFBjb3lnY1paMi9Pd3hka2RBWnRhRTVRNzdpNmJkWDNIVnFER2hGMEcwTWQ5alN6dmg5WDM4NklGRkF3bmpzRVpiSy9qeWNvbTh0N0hVV0g1K25GYW9oMFpTUGoydDVTMGNFNFhRUnhVNHl0S3NpZW11L2I0d1FVVmZWUk1sa2F6YjZrZmtQM0pUL0ZSQ0RoVUYraXVDbUVyYW9GK2NrMVB4dE5mb0tMSU5BVWxMdk4rRkx6UUtOMlJvZmttOWdBa2RuVTZKdmFoQURLL1htMmNTWTZTM2hFMm9STHlQQjFiSHZHZHU5VGd2NGUxVlBIb242SEJNMm9Edmd3Sy9XejU3ZjJWN2VTUm5kV3NYMkdtcGM1VnNmTk5ua3lXWjVScU85VW5jQ0UrakFMRWE5aGRFQmpwRCtiZnAzUjRDck10RThTZ0g4aTRxWk1rcEIvendTTStNL2FISzI1TFNPSVNHQmIrUmlOME9hVVBJKzJxVjQySURvakNJMzhTN1orQ2JlZk1DMGdQUHZrMjRQKy9PWGpRM1o4YW9ua0FWNENzUmsvdVBNMmZ5Z1Jyc2I1Q25lcUYwbXd4TEVFUUFJTEVLN2l1Y1BhT3RlYXV4S0FzaWNsc053WnQwbFdteW5uZHNpVzluWStnMHlUUnJlOVF2NXFtdU9wY216cE5VRnhGeTAzdG5uNFpwWXJqRUsxRWNRNjRNaEIreTVkL0xNZkJCaHE2RndxenBNZDIwVXdYYTdMYjhkS252TWlhMm42dmx1L3FNbE5tYjlaV1I5Ymo5bHl6NnkvMnhpYjlkSC9XWkQrbzBmYmEwWDIwYi9COUFGKzl2QXhaUWthL2Vaa1JlaWo3QTZsVEVueWRxZnBBdVB4enlRNTN1UTlvVFIxOW5ESUdrYXU1UUhKSWhnWDZuV0hPamtxMVlMUTZ6ZjBIZFl3SW12Q1B3aDJqQlpxdklYanRudzN0SlRHTHFwNFhyRzlUV3ZMMXFqT3pXWllxdzRvQlF5UVdUNnBNNlcrbWJJN05IM0t2VkR2Y0JCL2swUmlOYTlpakNGZzMrTm14OGszekhHd1BUYmp3UFFWb3Zpb1NyUm80MGVJVUl5WDhIcVhyWC9PSzJhQmNPN2FYa0c1NTJFeG9hVVExUGNDSjJTcnZwN3VFL1ZiS3J2dmk1c3B0WExwVldiNkZZa0l4dk01ekxPSnVRNnJWNVg5R1FwV01VZDRXWjJUWkR0aWNyeHg0c1U5R2NCenhJaGJ2SnNIellWMmxoVlNsMDJLdnhwMThGWEN6QzR4U0V6dXdiNUFzT016YStxUnQ4dlRWaVNQbEtUbFAyMFJsOThQU3FjR1FkMlY2aGtuQ09CamM5enpBanVnb210UU5IRHJXbGlTc3djdmFIRDZPT0RBNDBYR2RQUzhIdEg3SUhaSXIwSmtPQURsRjFtbGxMK0R3Q3h4SGkwM3l5R2cxN3FnQWd5MkFKU1JYVHA3eDJtZUczdXFnajBDOEtCeUpoT2tSaENFaFV1OTFYUGdLdFRub1FRVFZtTTVvSGsxM0c0bTJJVTJ0SGl3OGtxT3A0UXRIZVpRaThIN29LTjRPVXVSa1hOZ0xONFNsdDd1QUkzdGNDRm54U2hKSlhHa3h4TnBxQmd6eGd3dHZZZEdOQ1JpZGtQMnpURm5BTzFtZUJrYjlTTVlveFg2MzhyTUlieC8zMzBuMGpsdXVzZDY4OExEdHZ4Y01MR1B0MmRLdGpMb2JZM0I2R0RFVFFkMlEwZ2tRMmdHb0tnMnJEK3diZkxTa2NSditZb3dTMXBrbVdkWi9EZXhkWVhnUWtZY2RudEFKM25hdElwUzk5emJpZFJsbVYyL3FKemtVLzVzQXdHV2FCMEVLbkU1TkIrb1Zibm1CbVQyaEx6QTBjejFxU2JnWXdGRTREZEsyRzZ3ZWlEc1VsNXVsVGlRTTVmdmRuRmVXdkcyZmZIRmIrTkVrZnFJV083VllQVkJXQ3JxdDFZUWNIMUZMZjRhOUVJY1JONG9VV3Z2aTQrMWJjMVRMQ0V6cDVHUzRXcFJjTWdSSHhGYVNZdllDRXVPU2xnS1dpS0ROR3dRdW0zTGlCNEJKdGlTNVhwVEpaM3JtY2JBL1BjUGRoU3FqbElHWWRKaGJWeDIrZVNNRUxqaC9hREROK3g0cU8yVWlXMkVZVm1aUTljdm84c0xDSlBjVGhsamxBWUFPT0JRQzJYU2FlQ25mOWFOZzF1SDZMVlZFSUtxSEgzNVlLRzg2OUpmd2R2SkdzK3RoMUkyT2Q5K1BnZTlDS1lybXpzWnJ6RksxamFSaUYwYStJTFZLWkFUekJoOFhEeCtrbkxuNHdKb2NWMk9RNG5SZ0tLanZXQzNaRWpZOWY5YVBLLzV6WDIvRUNDQTlqb0ZlampaOUc4NW1VanJ0cEZCUnpEcDVOMTBWU21sRHYrUkhXdzlkWGZ3QldJcjdNNmdsdWVkT09SOGVGL3RUbEt3R25qWk5NZjRHRmNOS0JueEFLRlNtQ292eStQTnc5TTVWcDZ1YlQrWThTTmM5ZFB4SVoxNEd4TjJ5cVc3bXY5SHFVcHRFRWVoYXdnWFBLTXFubzdlQm4vWTd5RGdRYWZpQkpyczB4eFUrZ05KL24yQnlRb2N3VjFneDRPR2NRd3RvaGNxRmhFaEF6bFdhbU0xTncrT3RhVjJQek1PeCtOTU9ZcFdqSjR1bEZHaXBWRG9JWFVYNkxwNjdSL3FVdDdYdjV0azhpck4yUTFBVVdsVEVKcGhON1dOQ3ArTEljd09yZHNOQ0xsb1hBZjVtNmY1K2h1NUlicElvVlljOXNZblhuK1N3aURZYmpwN1dmc3EyK0kxQUhnNXJwc1BRK0h5L2hqdmMzVHcrbFp5WmlTcGtMN1pNVitsY3hBUlNwc210bmN1L01zVmtEckdraG56TFVwcGpweERxY2VtZDc0ZmtiaEd2dFd6OUdMeUhYNitnQ3JaZ2tZOVhvSXNNc1FQRXlMVEdxZXBOWHNVdmU1MWszS3RyTU5kZHQ4UU8xWlhvL29pb2xHbzhQMTgwcjl1MFBvT1RreXA2QVE4V1ZPYzVobTR0aTlrMU9ZQnQzc0h5RnVRanZtd0V3ZFRtd0IzVFlCcUJJajdma1NSZVRvMUhVYjJMNGFDa21EMWZ3RzVCamZNNGI4dXdTNWphOEYzT25idmU0akx3aUZiOWNYR1d3bDEyZUdoL0pOdDczeDdPeFEyZGtIM0F1b2VUNXlRdG1wVGFnaGxhWUZiU3ZEUkdVd3VkUzh4aVlsd1VicEpzOXlGUjFjVmRiMXlBVE9SNVlON1BHV0pMNDBUKzhCTGlnODhHYmZTZzFTZFp1aXkveFJvdlBwN1E1TDJ2Zk9NSFRzOTBnbXUwb2NBbUhqenQySzVzY3JoSGJSQkV6VVYzOWExL3FPWk5yNlhlMFdSbVNzZlI2cHRaRXRKbW5tWkVjOWF2WmI3bWlsTTFQTmZPMitNRUJ3VW1KN2FuNGdwNVFvMUFEaXA0VGVJakRZR3hzaWxzMWhuaDgxR3pJY1hjVlpUek90SnY0bzg0ajd2a0Y4ZVpkT01pWkJsWFBDd3dxbVlHdVZzeDRJMmt2YUQyMUczVWQ4aVJaZmk0Z2M0VjZDUWVmZGZXdWhheDdac21HeitNMSt6aGFGd2xSei93UG9UWWlrUXN3Z2hYR2Z6Ni9CVzZZZkRyWjNmWG1RWFBrVTc3c3BrZVM4dzlmT1VFTWdFeXdzVWliQXBVWUJQa1EvOWw0OS9UODNtNnZkdVVReSsyYTZSbm1ZbElFSXlOMkxXRktBTkZrWFExREJBYWgveEVoSHpRNCtGKyt0dUU0MjVvRFRCaXRiWklDMlpPbXdLZEVsZ3FaWmtDYllyOVdOd1hONklTaDUvZWF1M0IrQ3BCd1lKdUpLVCtNOHhGQUdQc2R3ckRnd1lVWHVzVzFXcWQvcEViVER5T0ZidjQ1OWYxU2pHMzRncHBVQS9YOFBZbS96NVpvUDN4R3hhTUJnK2FvR3JTYXVyMHV5eDA4Mm1iMHBYbFpneXgvTEF4ZUZxUlcrVml2YmM2Z2VJcG5mbjQ2aUlKRzdnUXpjc0lRRzQ1MnFvMWpDVnBzYlgxaXoyVWU1MW91YlVnaGtpaUhReDgxbVNJR2hkU1hlN1NORWlpQVoyUFlKblIrZ05mWlJaT0g3b05rVEg2b1Q5ZkxEeG5LUTBsemY5aHZmbUNWQmlLcXJTUWxKcGsrdUNReFIzWHRFcUpjYWlRa0tqM0dzUHJSWnFVMnd4U0o1RGRycUc5bnFMdkQwb1d3MDM3OEdtaXR6M3FId01BVDk5dnpnSXhWVUlqLy9NRkNxR0pxSzBLOU0zZGJGTUF0UGVjMWlQRzJxUGEvd2F2a0NEVEV4c1RoSVVqQktycTJwN1k5NVFRejkvWjNWcG9kaU1xZkxPVGIrcDFjblRkNmxXZDlPSS82aXpqeGJjVG05cVJrY2NWenZERFZNQk83SDY1ak55Zko0RUp6cHQ5aDlNWEtvZy93dHJneUJGa2w4WlBqV2pWbXl0Y09iZ01MV1I3KzNhZkx2MDYzMVhLVFMrUHJ0SWJDdGw3RHhtWS9WSTlFN2ZlT2NMZ0oyeXRuN1Q3WjYxUE5xUnRGLzJrR0I0NHhyYlQxL1FoSTMxeVVDcWY3RUtkcjgxaCtoTDd2a3BGZFdOZ0tvRDJmWHlMOFJ2MER1RGZvREtkZkpkV2oyZzE0RW44WUVhS0lNQld0OVhqVEZnai9kMENVUDFJK3lkRlk1OWpHMGMxZzEzek5ZZ1FQWU9ldUFmT0Y1ZGw2ZVdLTm14ajN6UU8vWmNsVGJmQ2hmSUdsSVhjQW4zSHhTZWFUbWVJdnBTZWNnZ25LS0RCbTFDTkRtRmVKeVhQTmlyYnE1MHM5Z0l5bzlVWEttM1lVaEpDZC82a1hjMGMyR1o4QXFmaFkzTGVSUGVIQ3F4d1N0NWFwRDM5TUFqbmxkczh2SG9UdjM1Y004ZUU5U0ZucUI4eUM3TmlJalRWTzY5SkxoQWdKaHhocnc0cTlWSDZNM204c2tRRVRJYUhpckhzQk8zcVRJQ2RsaklIZ0FhR0pxQ2UvYlhpWDJFYmZtUFpFMmlOcm1PVisycUlsdlZMbXI0ZlpLdnljVkhoOEJwK3IyZXdGbnRYeks3ZTFvU0RVejVRZEpxQkI1QnpxZlBrUFJYQ2lsSmdSVFZoaW5mK2lKSEhWTS9hNFZkTUkxbFBQSEViejVBeTlKRlkxeFhjQjRTMWhBd2dXUGhRRzVXc0dOSzRtMjJqQVNRMmhRMnRkbmNvUHYrNDE4RGNiSU5abVl2a0FHZURvQ2lzbXUwK2w4NEtMaXdzaFJEdjBqYUE0eGo3NEhGZC82dXBPY0xKMEpUaHFRcTRBd2FGKys5bVhVck9OS3FvbUdBcVFPR1ZiK0FMUFo4ZHdIU2w0MWhMZlJQQ1FDajFSWGY5amRhV0dIb0VjMStmVDRuYjd6MDhVU2dnVkZDZWZNUlo3Tlh0aGcvWHg0NDA0eURsNDFsd0E4Z1F2RlE3SFk2ZTAyZFhPbDFURDg2NUliN21nNnJ3dzh0WDgra3ZKU2F4MWoxM1QxNEI3U1pDY1RpcGl3NzFCdFh0TjRseExkQWQyQk5hWk5VOVVFWDl2TDhjZ2RkQlJ1RW5PL0Y0MVZHZC8wQkZET2ZLWW9IbEhndTRyZ3pRVHFzYmZyaGo4UEhKNWxEZWpuSWlKc3owM0p2eFlud3NCOTh1bGtVZElQTGhuc1I3VUVEb0NXYVd0N0IwNUk3cU9tZ3VOSllpa0tISHA2dmVMcVgzNXR5bzhCemFXVk9hTWdScE1CSFFkU3BGc0owWVU5cUlNK3FkdjVXWEQwVkw0MW51YURtNXRnUStIWWFOUmVwTHlVdWZTNGZIMGl1dCt4ZkYrcDZoZmh3eTdGZ3BXSkZqOCtKemZ6NzVBb0NibDRuUmZ4T1YybENmRDA4VXVDREZoSHpJTlU0VXZlSGRqNWRNTkNnelFwRmptVDRaNjZSMUlGWk1UaEhhMzV1dWEvclVCUG90Ums0VG5RSGtuVVRVTzJ1U3BySEZRdEZHL24zVHV0eFBYeDgwZjhucmszSE1vU2hWWDc2d2QwMEc2Qlo1U1RrQkYxTWJxdGgyNUNvakpyaDA3Zko0NE9JNlVyT092dGZaVFFYYVlMNmI3K1hVTmNaWGRjS0Yyd0NJOXRuQjJ3WStQOTRuOVlMdWtIVUZNZEVnbmx5QUJ1QWlKcGNhNzEwR0RnUFN1R0lpdktUWFhITk1IQ0kzUGM5ZS9tZGNaSGZ3SHJ6cEZUek5FWFB6NHVyMmdiN0tVQ0N6bW1BRnpTSjdsSm5xcnhJZHAzSXg0TjM3QlYrZVZRbnBoT2l2eDNGSDkveTlDNHhtTmFkYjBmK2Z4RjlucFg0N0dNRVNSck1Vd3NkM2pLb0xDZEw5TElDSUpJeUFoK21tU3o2V3JSYm5mWkRnanpKMk54bENHc21oR0hNUkJNVkk2QVREeXZycy93QzBtZFowZVpYSEs0bWxtWVMrZHRXOWtya3p1dEhTZTgrNlV0REpYcS8zVkxydmVDNGxKWG1TbTVGc1JmK25Db0ZDNWdtc2JVMDYzcVNEUktyY0xaVjFDODJiM2x0TEcyUE5oSVJ1cnFIUzdZQkgxNGQwaXJIdFNVeUl3R2NmUEIvMVdZZkpYb3FHam5kMW1tZXJGOGN0ZWYyNHRvRTdpRml5RlRuTVFyZmhONFlTcHpkQ3VBZEZicnpiWUs0U01DNXNmMGl3TzFsS1NyK1FhZVFneEFQS0czaUVnck1GeTZIQlRQLzJRbUVKbzFyYTc5cWoxTnMzeGFaTUp4RlYveU9pOFNwNFlKWURJOHVGWWQrMFFqNnF2YjRxSHVSZytHMnlNUGpnZGJwdVdUQmg2NEVTYlppMEUvZkNaMDQ5K2xINEJOallmc014ZWVRUlZucXhqY3EvbmxxUHZjZTJ0MlVDb2xwUjFaOFRpdk55SmN6WkF5ZjVVUjRlUkkzN0lsV2xzcWtXdW9HZVFWekhzZlNKQU16TWVFOVFMT2ljRVpreWV2RHhDM1NEc3JlZ2xFR05ZMGhPcCs5VW0yQjlWQVVYRWt1UkpDSnduR2I1Nk9KSWYrQ05kZHpmSFhrZWptTy9SbVhxSXNrVk5hVlA4NWpVa0NPOHF1Sm5Cc3JRSFRmTTNzc1hPUmErYnFjK0hiYnRZMnhlSTRpYm1JQVd0QTBFNEZCQm1SbDNvOXp1ekZqT1c5VmFVeE1mT0VUWnZ2SW5yM2dUSnBPNHhSNTBnTWdNUmY4dmtZTHpvaW03MHRUZnFwaFJhV2Z4bjhNcVNGQ1czcGRscU1sS0FLd3dRT2NYOVhzNXdPSTlvTWtJUlFEelNjd1pBTUd0TTgydytTTDF6WkZKUWkxUHN3c0ZWVzVvbTVZY1dxNzEzUGIyR0RZd3cxT2FGNU5CSmwwd3JESnp6OFp6U1VIVjhzRE45K0s5Y3FZenVYSGpjNHM3YnV6UlNOWlhUZXNaL2U0MldLNysvT1VUby9taWMvc2JqdDlBTzNYNmhrWHUxOXFYZFJHNVFjQ2lHaG00dmtXMFN4MGhIWjJVbE5jeEtrZmdFcU5DQitoaW9rVVJwbnA5U3Q3NWtmbnY4RVkyNTlSVUw3UnNqMGJTMkN0MVFqVFRFWHRacHhkN2JGVUxsRXRWeU1HMGxoR3hpM3hyVXNFUVhVQ283eDIrR3pyVmtFSS9yNG0yRElEcVVnUTR6dWxjQ1Bldjczc0VPOVV2UGhPTU5wN2FmQzlkN25lc0o5RVBYempPWFlsWHo1TXNuMmhGZnp2S0NLQUJSc085WDUvT1JOSk9EM00wM3Z6NkxxbkRKMCtiVXMyVDBycklHOHFEeCszdlR3b0R3QThBWW1DMlVzdUtrUGVhS0hqSVIrOFhrMHE3cXNRNXZkekdEN0g2U3JUMUg1dHkzL0VPQVl2cTJVMnlhbWJ0R0xCdm1OaVNERG8vUldwbS84UFlSbEJhNTdwOHBtajdUV2ZjMk1HdE96aGtrZHk4Tk9PemhROFVBN2RqQmh3TUJMa2I1T05BeTBZWGd6dmowWElqLzFpcmR0SkhRc29HNHloaSt3cEJrUWlEdkdmZEJsY1FldTBoRzVDcUFVdmtNSTlsYm5sVktYTXJ5U1NTUHNsd2xnKysySmlzZnNuV3prc1hvbDVDKzZTUHZRVXdrTjRqTTV0NVZwT3FMa1VLNFZUOUl6V2x5ZHBMOUpBNUQrRTI0cC9JQklsaXEvV2ZNR2tuUzBZM1VhMFAyZS9aU2VwVDJ6LzFYQllmZk4rUUY0QzZCRTNuZFlnVGRMWU1ibDBVbmluSml2RkgxZmpXSFhQdk44N1VmV3hjOVBPcSsydTQ1UHYxS2NMeVp3aGd3d2JiYllMR1RRbE5WNVdFemJtWGI2bXlXd1pZRkk1WExZTEEwSTdyRFdLbVAvZDJNNFJzcm9pYkFqQmZ4ZHVwMGdUS0pjTWEvMFY2MUIyLzhyckFCeWVkb0piZFVPdTZUT0UrWklja0pzU2w1UkJ6R1Zxa3FDU25Fc0JibGpSZklDb0ZtaGFwMWo3dUZPYkxXdkxWQmxZK0dYdWxjNUw3TGRvUFRIMVRoeFZ1QTRVb01BaHkzbWxodmlyRzd3ZGhsVkVGYnRJK3dpcFNNdUhyTFh0RkFxdSsyVjdUVFd5RXdtaUNJRzlha1ExbzJ6QmsyV2R4MytVcmlXM1o5UTVRaDJJUjd2cWEySUw2TUVpbXBrYW5XYVpWZHNadWRZTXJRSGRielVjRU9CRDFDRTBYN0FnVWRYckEwazVQeGduSjFES0h0MTBxVGZSeVdwNjBMSGJmZ09IWUx4ZGkvMFgySG5QbkdnbEZoeFNFZ1BGRkRvckNrTTdSSFpISUdWNnJJMFNWU3lZN2t5WDZNc2Nac0s5ei9NV29BR3lkMU0wYnd5ME5GQkV5d3B1aW5MdjFBZ0hjK2wvYml5VTV6YkV2MVh5Vy9lREloTmZFb1Z6YXVvUjA4TXI1MnZ2VzdzeGh0MllURk03RUZJSzZNODhaeEc4UU40dEVIVmJOQ1dFV1ZKYXFWeTF3UmZhQmNNRW1vNGFoQ3A0dXA0bnhOdndXbElQOWZneW81WDNJWThQTElzcVIwV1hucytobFhPVmNQSVRSN0lBcUZ1dmthc3hQRVRPR21kdHpCZ0U1dWdSWTVjdmwzTUpNell3MnFoYVN5eTdlYmNJVTNmbjAxRmZSSGx0NGtad0d2Y2FrQmJZQmw3WFJqRGZJSjNodjRXMmkzTTJNbDd4VDhUQXpORGJ3Snd3dUM3bERFcm1NWHF5VmlkRC96SDVlWkdwQ0VpWm13SmNxNC9xY0dGMHg1cUxQVU9NTko5dUlJUms1eFFVU2RRaVdFNXgwdFZRa24weEw3aVp1WHhPU21INkdzaDVWaUJUcG42WjhoQUpkZlA2cC91YkhTSGhqOHNnODBUTXFSOGJ5b01XcWJPclR3QXlHTkhjV2dTUnBvSlhCUnRrQzVza3BaejFDeHhUckNUalRsYUtFaEgrc2M5ZTdUZ1M5SDFEY3RCMGJDTmVUVUpYMVN4bGU0bGcrNmxIVTJRQWlKdTVCd2xTZFNCT0JXa2IyL0pzZWRxUnNXYzdQOG9YZWkrZjg2eHVHcFd4aUVCenV2aGp0MlUrek5FTmR4WW5YSnB5dS9BTlN2MDIydm9EdkJ1V0QxNkZ3bGhZcWoxeHFxNFN0NlNOQWxXVWY5c3lBamdVcDNta0J4RllPZ3Nvd3duOTJSdGgzeUZkZVIwR1NKVHd0QldGMkltNXZrSWw2VjZrTVgzd3hBZ1lMeVZ0M2QrYW9Halhhd1JCNFQwbDNPcFAyOTBaSW1QbEVFa290aGpnTnVFSFQvZ3BlajR6Ui9hODhLei9wUnFuZnpsbzkrWE93TnMrbE5pVm9iek81Mkd2eDJ3QURJQk5Kc3cyb1krVXV0SjNmZFZnMEVsdnE5bitjY1B2TENmLzNJdEtFd1RlMFhoWXRySFNEVjRnalduVjUyaGViUnF0LzlxckQ2TXgwZG53bGdqYUZvcVlYcnNMNnd3R0RTOTNpMEJ3M3JhK3JJYUpTSG40UDVYMUo4QnNtYUxCR2U0NHJ4UHBYM21QZkhmakFNRVUvWW1EOWZxU2FWWEJXaFNOTkRyMnk4UHNOUXRKaFlzT3Y1ZWFQclU5VWNvUzhJL2pHcDdhdEFxeGxtVVJQNmRYNlRISVBDbVJqSWdUOGJFemlaY1lkNy9XL0lKNjZNenJnV2RFclYxa1JFTm9abzAxQUh5bUV0SFpiay81NmtLZ2V5cTZaVDVVQVlPaUFqWkhudEdhaFR5OXI5b2NvZnNadkUxNDQ2WWFRME5oeFdQNFIxM1RHM0JITzhJaWNDb3lrcE1nNHEyR1BmSVc3K1F0YUhMYTNlWGxoWEx5Uk1NYVd6aG5WOVV3dU5uUkZvV3ZQNEYyZy9PQ1RDY003WUtpMHZoaFhVbEdzUWtTSy9yaTRyNGw2UmxGZ21sRTdkc2pnb2F4QVVBVC9XOWNHTkJoM1BwNkRmUE1WS2xxQXNBQ2k1dDFSMGx1b0puaFFuM2l1enVvTytHWkhRbDVwTFpHMTFlenl0V0NZV3pYSVJVb0ZxaThZVmFLa041ZTRuVzR2M0VKbnJEcVRCYkpYMi90MU1aOElpelVkU0xKRitlUUdJTlRJdkxxRXdvM1pMTEl1cWp4eWV1b0hPREw1eGVZTFoyZWtGam9DUkxqRXNDbzR6bFl5Y3EwMC9WRW5XRFE5MTdkOFdFbkZOT1ZWUWs5ZlZSUTQveVhmeEYxNkdtUHhqYm1jZVh0ZU5oWE9kVlMzdHdvSERBVWJ1SDM1L1dEY3BVdDJsRytqS25DMVdOQ21uc0lzR2ZZZzJubEN3R0JGc214MTN2bjN3TnVycDNGR2g5T1hWYzVHSGJZcldXZG5Nem9xSWxDY2pSYTBERmFqYWd5bTRTZm93NFpjc0wveGhMTTlGbkJmMlYzWWxrOTlod1lRdzhTdXRIZ0lLOGFQUi9ZZU9oRERCMnVDUjkyWkY0ZmxLNXJnYjhTbS92SGVLZGhkT1lOYVB2STBGQndjYnZvd25USm9qc2NUeVdBL2tua2hsdy9QdUsrRXdDVWxWV1FKUW9Wem9rY0c3T1RjUk1hS1pkYm1zMmNmYnlrTXptRzI1bzE2cjVKNmpQdlBiWjZhUHc1MmF6OUFma3BGUGxYQUhJa3BNN3Fra1BiMGRWTEdxSVZMNHcydm5vOTZVSUZjWEFNdkhuUXBkUjB6Y2tVNEhoYi9kVjEwUEZqNTEyQ2g2QVEyZlc5dkRkK2syY1JXaXVIaGpvYXNLdmRKdEhoMEI1V0VSYTFab0FmdjZCM0Q0SGVDQktOcnQrZnBiNzZEMDFqMUM0MXRzRDFlWVlPcHlwUlc5aXhtenJZdXBFcnhrVUpTTEFUTnN5VXBVV01Pak5vZjBDc3o4MzB4bktyUlUyMkRXNFlXK2tGcyt3WU8xdTBwSmpWbDR1d3gxSUtYWkgxYmtkcjZzZ2hZelV6M2NFeXVXcTV3bHlET3ZSbmh3MXMwZ3I4ZXpoTTc0eVpKcThPK1ZETE1Ua3lobW5UcEQ3RTZMWC96MWQ4TDk0c2g0QVlyV1craG5PTG9meEl5VzNscnEzK1JlUnRGeXFLR3Zya25PdC93ZElaQmFYZWgyK2dmNXZJaUQzTFJYMnNkbnRZZ2xFN0pRMDlEK2RVSTY2TDhCakpzVGMzbjhQb2hvb3dLMUdLVThDdUpRQmhIWnhBSTBCOW5tNTIvcm1PME9DQTJtenI2ZEFPbUVyckRVa2QveFpiaUQwV081aXd0SnRidnI1T3lmOGZraUN5cm5ScUJNZ21SNnNaK1BIYm4zUzRHMjkvS2xiWXR6bC93NWVQN0U1ejNhUXN0YkdHbFJLQXpVRUtnWSt1T2Y2RlpiL0ZUREhqSmd5eFBLZnN2V281TE1zbmNjQWlNMCs0R0J6eHEvMVpUbTBRLzNYenpLMStDNGpPZFY1WXp5Sy9nTmZaNWYrZkFISWM5KzBxSDRSMUNKZEhhVWtlZ2sreTlJd09TUVNqazFsNDhCL1pTaEJlL2lJQThobDJabVRlc0NYY0NWYWladSt3MjhDdHVBV28rNWZHT3Z0VWlNUkwweFJBb3M5RUkvZzlJRENxcndrMmlCamJzbnFWNkRKWVZCaW9FS0F0K1NzV1Roa2lqVytyMUtGQ21sN3FzTkZxSlY1V0M4My9FV3JONWZrMWR2Qitqb0psMzdZUmZqY0xkbEpYa1RrQWM0ZVQwVHNseVhHNWFRamhkWHAvdk9yejZyUzdHOVRvb1NYQ3hJeWwrOS9OTmxnSVNNSExET1p3VFNHQnk4YzI5OHdmVnNuWW5YVjByQXN0bGxvajBOQThYcXFGYXpvdUtnSEl0eCtNQVh2ZmszRFdHNmFXQnVpR1FwS04vNWo2SHVhU1ZLSTF3QXVpeGtRSFJDaXQ2bzZtbE5nanJiWW9ySDN5RC9DSkpXZFlHd2RuU2FUTVFWY2NpVDNxZ2FXeC9UaTU1U1I3MjV0RFpXcm96NVZaRHUvZ0h3ZUZKb0ZPY0FzMDFCclNiTDNodHkwTDQ1KzZOaWI4NmJBL0ZVUUZZQlBlYVBLTURTMWJCdzRxOTllMnl3UUJkc2dVKzM4bnNGdDY4aVVkdWh6cEYwU0dNSVcvUGNkUDkyZC9kNzVsSXg1amR4Q2xYUEVwdkw2dlZUYnpQaDVleGpScGNIeHZ3MDdFamFQanRIQSt4ZVg2RmVpb25IUzNSUWN4NWd3SGcvVWFuUjRsTnJ4M2lheFNERi9ISTZzQ1hudStlSm5oc3lZK21CZmhpS2xvaG15U29POG40UVU2VFRSTXFxcW5mcmFDdWxqOWgzejQwaklRT2lHNm9Nb2lHN3Z4UHg0RlppbkRxWHpWbWlsaTc2OWNabVV5bHZXMTB6Qm5hSFpOYkdjQW5xVlkzK0wyOWRFcmFVOU0yVmFOUDJsUGJCUnQ2U2NLNHhLdmZZTmVOQzZWY1dlSHRpcjhyQi9FSytZV0lveWJZVDZZMTNKZmxKYTJCcUY3OGxoRjNoUWxlaFhjSXpvVkNieXZLSFkyUVpaUWwyditTTHdoZ2hJNThtL2dQNFhXNUhOay85NGVPZ21ncEtyQm9sbjFlRWg2Ym10R0FoTkFya09aTFdEWXZoTFdTWjArZjdsT3llZm5GMm01dVlQaEhtTkRWMFBKZ3BFOFRHTHB3L0FrUmZuSXhjd3V5WkN6ZEhseWY2aERaQWVRalZKSUdGTWpXenBKM1Y0R0dqQWZ2c3VzLzFoaE9BOE5VRkR0WFhjOTIzZlhiY2NaZHNMb2N4RDV0YW5Daml3cjlqREpIYmVmZEtJUUplc2JGZkxZNGJJYnk0Q0d1SWV3aVZQNzdtWkNoQ3ZMMy9LRU1LbUcvTXB2Yk5oVWRuRmdJVkZVMmRsSmRTdVZwMS91VzhnTFJ2aWJ2bGtZTHAvQmtLSjFQeDVpNVR3cjAxeDc1M3NMdTB1c2x5dnZ5eEJneVBocmd1N3NERW9uTHlZVjJtWk12TVFhQ0gyN25wYmo1ZU9jTW1WVmo0T2pnSmNFZ3JKMVN2NURQY0hrODdNZWFSRlNQZDdBejQ0SC8zZS9QT09Qbjk1bU9UVnZGd09kd2NOZStWUjZ5cmZLRkcyZ2ExV3VTSXYxcTZtdWs3aCtFb2p1dk41VVhzZEQzN3E4UXNxTG1rQ0hUNlduaUJNeUcvM28yTmZQVkkwTmh2ZVk3cFpKTnIrVnU3SGtvNHFKa2VEbmhVTDNhTnNTUTBpRVAxM1E4UHlUQnZ3VHJkbDQvSTVYSUY1cW5qRnVTeHBaNkZFc1BoMFJ5NFJFMVJxbE5GMS9IVTQxbWJkU1AzVnpyKzNhMzg2cmFOUzgzUFpGN3hObGdZMzBYNTlwZ1JVRVVhcEVYdlpaYkZqL1orYXcvQmJlNm9qaCtJNWhZU0VwQnVGM3BRclB4QXEraUFsQldEQm1mVUx6MG1VT0tSNHpPRm1QK3BKNzFicjB4anFyL0hKckVsNWE0Z2FKUE5MQVV0S0loU09rbk9GT2U4M0hHOE5oTmw5cXphVzZQSnVmYzcwanlXR25FSnRQeVBla3o2RG5zTHRtcnl1Tm1lK21ock5WZ2hBa0tvK1ZseHFDcUlTSnVBdDVrRGxmZUQwSGUyOVlIL1RiUGcvL2hNanVTODlNV01IVHFYZC9oZk1Ubkp5ZUhwcWh5TmU0VzBUQW43TjhUQVd1UnpWdUNzaGNjMlpZYXFZMXgxdkFHc1BHZDdYN3R0S3U3WmpLTnQ1a051YXdsT0kzVnFJN1VkTkhnczZqVzl1Z1U5VjhYN2dLYnBTN2NvTWMwaGZneXhGUHZpT0FSbVJrMzBrVUFCclZ0MWdhbXZWUFJzRUZUWWRBaGQva0dnQWl3RndzcjJma0hZNlUzRTg5aDdtT1M0c3c1eVRTSmF2eWRmQ0pnTGJjdlg1dDI0eEd0R2FzNnNLZkFaMjhpZUUxT25ZTXp3OU5CaVZOZjF2aGZ4b0NjWDRnOGgyTkRYMWhqREx4WnNRK29wazd2c2U2ZVNPbDhLalM1Vy9GbzBtNi9OMkcvZHBhQXRpUVBHTGFNcGlYZFVoZENQSmxXREk3aFptM2JYUW8zek1udnd0djlGNkViVTBvaXdudVQ1MFF3aFB5VWpGOXFnUzBUSU9hL2pRYWNZSFNzdWlETisvSFdXRmFaUGVHUTJvR2FpaHZSRnBOWU5WdU50OUxYeWhOWTBmMFFwaExXeDZXSzZWRUh2cytMRkRIYkk5ck9VQXBjM0ZEU3prSmVPVEgrZlA1bGlOM09zcTM1cU4vY0l0NVJ6UTJoVTNaNy9odHp6Q2hPM2RucU1wOVZDRGw4cmN6OTFhbXpJZVpkR3BDdUxKZ0UvVWZqTVp4NnBxSi9hL1dkM1BMRkpwd3RUUWFuV2VoUlJRUFoyZzhvNWVJN1U0VVFQeGFKY1ZOa3NvSDlHL09hcGRxOWwvTHNsQjJqQ0xWODU2bloxbVlNR2xBSmtVK2dac2RxWU1LbjRpdHBIWWlVb25JdUVIdWRRYitVY2xITDgzSXk0d3creVFSazFic0szSFVlK0h0NmJOOXZtQmhrWXRnTmVUYlJobE9kRHRNYmQ5bitodzFoVXdnNFFLbldjWXFmbWhCeGp0YnFSRmVvQUJMVnpwV2E0dkRzd3pEK1krMXVtQVVKN29vZ1VvU0x6WlAxdWhGYThnVkROUXJWYVZ4aHM3TTUzNGpzR2VkaEhkK3gwdzNqY3poWTd6NVVvRjZBVGgxZjl6NmxiSWd1c3VVWCt1ZXp5Mlh6N0VHR0tYM2szRzY2S3Y4MEJ4L0c2bUJxZXI5QVBjbFk0aU1ieFVJUVFjSXZrL0plc1libFJlMWFKTGhUZTF5OGZ5QXZBQ2VvYXowdlk1YjdQaEFuZ0ZGSHFRQ3F4MWNpbHJRM0FWTDAydUF0VG02QXdmZTl3UlM2VXVzTVpycjFBU0NudjBYMUc1b3B5WkYrVWpLTXVqcWNSZkptaFFpb0VVTzdZay9uVlFwNkdyZTduWDhOT0tTVlNJeE8ydmFJcHU3cXFHNlJ3TDJycXVxalU0czJUTGU1ZzByOTJIZENyaDlEeG5sUkNvdmJQc2lsOFRDN2xKQkpBcThYLzBLVkJFck5CSFVNMDZsRFFaaXJ4enVPb0hWMDVINDMvakNOR1lWd2srNGI5MTZqeFM2Zk9pemNGM1NYd1RrdUwzQisxSWE0a2ExM1NEQlcranBGeDl4UlFvYmt4NnM1aGhwSm5TZ2lPVnhKSEJtNHhTb2MyVjNtUHpIL1M0S3hUdzdxVENESE8zdm9COHBvOWFXSUp6VjQ5S0o1VlVwaG9sLzJMNEVZdlNxOU1EczlnZWVPQ2VBZThhbHJWbSsvOUFTT0ZOMFBwRmJBRkFaY3ZUOUl5eGRUSXRPMzNkME4yNVJ4VHJ0dWl5b1JjNWh4dnVHbXhBRCtQaE1sVXRBOXp0V1JDazVGTCs5Z1NQUy9MOWkwUHRHbUxCOXBaTEg1TGtWT3UwcFpObEtYZzhGNHB4dk5wU1lEQUMwNllBd1hvUDMzQ1g1aW5abC9oRWlEdVl3V3Q2Rk5EN2wyK0g2SUZmSHJta3VmZTRPdWZnZFI3a2lud1B0Yjlyd2NMREt6YTBMN2tDbFh5K0lzK0pBK29oNEQ2T2lnR2E4eWRxKy92MWZDb2hOUy91STFHMEhKN0V2aFdhVGw5Y2wzY3hwS1NLUS9NUWJ6cWJUN21SWmhpZlVhU0ZhT1BhOEFLaE1xUlFVMHgzTGZmVy9EV0hFUUJheENkV3RGSTNqYlBxRUtncTFsZGFuM0VKdUFTK2pMUWlVR2ppdTlXTElvMVo0ZlYzTHd3TzdjMlpnRW9YenlXcVNJZDI4ZXlsV1FLWG1pN1J0S1FzSEszbFhqOGppZ015VEExOFVvaG1aMStzd3Q0YU1uRS80S0Jyam5HSTZTdkFoTEw0WGFjT3cvcVBrSmFXS2xXZVdsREszRVlMS0ZaMVN5NkI3czVwcWJuNlpWK3h4ZU84VlgrV1UybjJOQldMeDg0R1FYTUVGbnJrOTlWRE5sb0paZFhLRC90Vm83Zko2SU11SExxNGgraVVTb09rc2ZuMjNZSkZybWZTbFNZbnFOaGI5MmNyYW5nMHY4N2p2R3ZWT2l1UWN3WlQ3TXBtU2N3TDdnVDRwdjZRLzJmMXFwMGRaSzFJNFNrNFVvM1VpVjh5R3VIZ1ZFS1JCRFZ2V3NQbVNUWnFRRFFCejYxaVlGU05TR0FvYnU3Uys3SWVJcWNaTWhMVkg4eldHL25LL3FDVFNlRU4ydU03YUVzbEpuUTQzMWJPVDRGdGc2ZXFUWExRSnNuMmJhcXAzYlc4SFlSMzhHVGJidW9ia0NQcUFWWU5OZ3R6Ymk1dDZLL3laM0dXcHd1cWpxTGNtbWE2NTNBbWJEMlM1dmhTSVZ1TlI2NFZzSXFrWEI2a3JmcVdRYW9GeFVIdkJzdytZUDJmb2RNZVl6Zmc0SEtOMVNaTFBMeEV1VWZNV2I4SmVqcXJxWjNIVkgzZVFLUFFaYTE2SXQ0V3hHVTNhSTc0VDErQmVTQlp2TFQxd2tDN2Z5eCs4RFVRVXArNFBEaEdjYU1lVExHMWNhbGJ3b3Mxd2JybmVSUUh0MEljc1BRL0tZL3IwRkJCYnBHbU9KaFM2cGVWTG44bmZDNDEyc0d4RTFtOVFHTmt6TDdRamZKbkc0NDNyZG9FYm9yRzZaNmc5dzVoNTRBVUhSemJGNmVLSWxvYmFDSzhORFJKMFZxbXVRc0I0eE9mM2pHaUtrZ0w0YUxNeE1lM0dnR1lQQi8wVDZWQmtuUlNDUThBaENzUlFBbG9PR25MNnRyOFR6UEVwemZhZ294aUYxZFB5NGpUVExpeU9WZ2NXUHNTNWIvK0Z4ZC9rVVkxWkxveGwzOERodUJyanhGRVBYZnFXUk5XQ1VvMm5kWlBRalBRYmRaMHZVZ1IzbFBFaWJERHdzb2NWaWU3a1lKcXVWbWl4UzQ2UzhHSFgvWkI0bWlYZGM4TGROdFliY3BDWm1mZkdtOEZjT2FheDd2RXY0cS84cEpIclNXVWgrK1NHV3hBMWF3TVhIYkNVL3dyY1p2Sll4d1QwZXAwMXJZR256R05iT3RHYjRhMjJYMGpmVk1jbmM0TGU1OXpENWFoWXVvdGRUWk5MQTFkMk9yRFpRUy9pWEpsY3J6cTRFT0FMcS9yQ2E0d0JHL2ZtK1FzMGxyVnAvbEVUWEVWenJjZmwxUUUwYWcxZVFQY25mYUd4c2pnb2hSUElqSDErc0c5c1YvQTkwN0tDMGw4NFg2bG9JNjF1WTNPekJxMDRwb2J6ZHV1TWtwUTlDVnEzb1J4aHdQR1h2UUgzV0tEU0NoNVZpajRrRTlpWFlleTRkSzlKZTVMTExaVUFrYUNEOERwWkJiWE8vY2hpZkMrK1JSZ2xPQ1NhMGIxUnJKNzNzbys2UDlMQmxmdzNnaW1pUitqNHhZaC9QeUZLNC91dzU0UndwMVAyaHpKMjB3MDlwNGVEV0wvV0c5UENYbHh6YjNWNGErUE11ZGVUNTEwRGRySWY0VmdXbGlzQTVlSDBhcmswbWpXWmZpU1l6NVpGVnNvNEFRUXEveTNmWFg4UjExQnhKcm8rK1FjSkJuQ05maWZSRW8xeWRlb01sdnI0SVJ5VjZIU045S3AxazJkamlwL1h1QU1zQkJNTXh6bWkxSHFrcGJYdU1TN2swMFpMNWdMb2ljemhZc1RjRCtOZmFFTTFka3FLNHBDa3ltRldCNEJEN2lVeXJRWURNam9mL2wvcFVhZG1FWVdKS1FMaG1pZlE3RnAvQkFlSzJtQWJVRHBYQzFMWUFIb016RWxCenFYZjR5czVna2QvQnNraHRSN3JST1FDQ3UzWFNXaU1qRGM0bWVZVGN6c0w5UEk5WlpLR3dVWTRVVTR6c2E4aVNrWDFHdXQwSVZvOFRGU3BZS2haTlNnQTVmT3MxY2VzV09UNjZRRzJWbGthOXY3R0d3T2hKaWlkcmdXZHM2a1NMZHpwSnlseFQvVkVMVTZRUUhVeEl1K01lN0RBVnVTQ3YweFhKV3ZHeUNCekI2ektzVHJYV0xwVWkvRzJjZGRDQUoraC9Gb08vZlYxT3ErYnI4ZnhUTEhrUHBPcVc4U3BzTmp5eEo5MzFNV3VpYkdhSmhJWVorWjcyQ1Vmd0l0ajJKdmxmWDJMT0tDR1pEYXY0b3VTQ1d0VWl2VE1ZeFR2ZWZhY0N1NzYrcjdPVmdIdi85YXh6eUlWRFNwSnpiVjlySkYzRmhUUU56a3lOQWpzamJSMGdXQ3pSNkNNN1czeUpWUHpiLzM4SmJQcEg3elVDMW9oNWJjRW0zdUptMkt1d251VmI3eGl4R1ZqeW1SY0drQ3htWk5LTElJaTMzZDlIRzllZDIwbFIxWHB2ZEd2cWN5RkRwME51TTBodG9vMHplRkx0ZnRkd0lpLzJmS3k1SnlwbW1FV1c1RUI1Slg1K3lOQXRMSHdkTWhOQ0FDSUlFNGoxSUlRRGJaMXp6VDdUNnUycWJOQ01SalRucnZpaWlmN0tCMDJuSFVLdUJFcWNsWHlIcXhqNDZYbkhIQ3hYaTRHWENaeEQ3MTFuM2JGaUJyMm1uQXVyVHovdFBsSUxvbVpTYWF6bEZTbmRrOWJ1aFRBOVRnZzR5TnF0YVpwdVVVWnBTV09iRE1HejZDRjNqY3dQdkY0TEUvN2I3MXpWU255bElLUVpkQXJEc3ZjenAxSFZrSW1IMGk2aTdJRk5PdENMTE5lTWdrbnFMTitJR2hmQnpzRmxEVHljTE5TSG83NEI0YlFwTXNUamxVRUI5UW5WRnJXYkJYYzNnZW9BOGRrK2RRajFISDRraFM2c28rd3FuSkUxT0I1WmhpWGoyRkphZXJTY3BmNG5oWERIcW8zSDVzVkQ0ZHp2OFcwV203TTRGeDNKaXNQU01URGs3eG1iMjlhQVBpdU9mc2xHUTBPdzlJZTlKTFcyWTR2clhoS3JuY1JBakZRNXhjd2pib3cweGpJVXJYVkFIRXFST1lEVGZGekZjL01DTktWK3hidnpQU0dtYmdQdEdSVmdtaVpjdlNiZXVRUUduWkV5RGltZWZLRWViMjhZZG5NMldKSVBGRytJQWpkYmJydjM3SUdPMjd4OUdvMFJVVlQyZTh0SXpSR1QxejBvdmlLWnJhNHhaRDRJSDArUWpXMVBkbCtrZkpUYVVhaUgxSmtnMFlQRVpsY0V1OStxOWx2R2hkK2VMK0xRam1RRVR4T0tpdGd4M2V2WWVtMGU2bk54ZkQrM3VvTEdRS1hEb2JCMUsrMlpGODluMVg3SWhjUkJsbXRCRDRObEFOZFVDOVVHNkM0SVZWa2dpbmVsMzMyYnFQSlV4cjJiRjljNTF0a2E2S2dCRVpPNWkxSkJ0Z2dTczRpZ1JJOE01WnpjbWRwbWt6ZnN4N0U5UWlWRnpud1F2S1M1UzM3QWpzK1FOc0hoaVgzdG1jdXhWYndESE9KRDdoT1NGdTA5Qk5HMUFTaEhrK2xacmhqRWJhS1JQNUZiOW5WZkE4UjFYbjJ3SzRaSUt5UGRaRnRvbmxxVTd3dlVIcWtlY2ZNK01TYlphRnVOT0FWRzJKK2xOanZuaGFLUG1jdHk3M09yWGFxTFR1WXM0a3VHeHJIeTBueDFtVVhEemNSd0N2T3JjLzlUdDJwOGloYzk1UTFyQzFmOE44cWNBVmo3RGVSam8xUXEzaHJ4Ulk2RFNXWm9ZYTZ4OWsyaTUyaU0wMVFZcFhTdUlYSEtYYWtOR3FhVkFYUmpvNjVuRC9DbWsyaExhUHZKSFc5dXZGM1RRbm92MzloYlIzbXVJVzF0bVcxU2hkS3l0blQzS0JaM3pySTJpWjZwNUlFbzhBeStpNFhQYjIwWE9HdU1QMnBKbWlhblVoLzMvSGFoQm1IdmZiVzlUb3h2cjhKNlVCUVhDZUoxaXVLVVppejZobzNmVDJ6VG5yNmE3S3BHNmFtcGJlQlJFSzBJKzl0OHR1SmwzV1VXWkJYbWdhc1U3ak5yS2ZuTXcrK1BEcmxDbXFGYWU0Rm1FS1ZtVCs2TjVMQUx0Rk1zMGIxWVFKMGMweUI0UDhIQkJLNlBGNFRTL1ZrSjgwZWF6NzgraDB6NFZQeHZGMksxeEdNcDR3WXRUdDY3MGtVdFVMcjMzam9LanB4V1V3cTN6K0ZjT3ZWWVNTdE01RUQvb3JuYTBSMDdJL21UbldsaDZQMHR0RkN2c2FWMjBKVWVNRDMzeHl0Y3QrdGJWaWpTWWZ5TUFBU29ZTzYzTTNZY1NPRHgxMmtxOWtpVjY3a053Z1l2dW9GZzgydUF0bUNNVFhCNDIxcDlOaDZGYjQvR0luaVh0R0hLc2ZyRlFDajlpdkpveEZERkdPejBRNk1hZjhBNTRqVlpwME1zSktNM0l4VUxCVHJIcGdtT2JLWnc1R3Q2U1Y0MlI5RUdTZFMrTzRlYTY5OFJFMFppYXN3R1JBV1I0d1IveldYc3c3UTFXUFgvRmg2MEVERHFtYlQ4VmVWQkhFQUdzNzZSUlQyNE42b09RcG0zaExkc29iNU4xTTBJa0lYRDZGbGhhREE5aUMrN1dORE9JQnBrL0tSRHBKeDR0Tjc4VVFrTW9lc1owczBuaTdKR1I4eWozY2poWDZreWllMEN4VWtLSUE5U2FLd3cxWUV6ODNvUG1zRk5ka29DQlRkK0VEc05jem02UmI5bi9FRXF1MTBYWGY3Z1NSNzZaemVEUlNWWHdzUERmOUtveDZVVjhFWEpMc3lZRTdCSWw0R3pZcmkzVnN4clU4UER2U3UyWHVWVGVUMXNCSHNpSmJzTjZwSEIyM0hvNFRLSnJOMkxRV21nMGFLeDdZdzc0VjZodHVEbTJ5WHJDWllUL24zcmRYU2xQalJrdW42b2hYM0l3Y3NIRHpIaStQdHdKaXZabzl6R0NaUktDZFdiMHRtaWt2WDZmZFhLMDB6WHlUazRVaGRlRkJ1YUxkU3pwbzUrMGN6WEZrVjZtV3l5UWhXOWdMbTVjUWs1RjdzZldHSVc3N3FvZ3VrMzFUZ3o2c29JbCtCSjVEMnhmNmwrYmtIWERUL3lLOGZPYmhMT1dPSHpyTHE2dXlCTXByMGZsYW5sRkxuRTZ5R3lyUGR5UVZLcjdRcmJZRE42US9YMFhZMFgzUEZQeHZrWHRxSnFIS05LT01nejZReUNoMHlDdk9NdHlpVDRXZUhhSG4vaHozNjJrM1I3dFlIaFZaeTlpTVoyMTVaOXdvTjQxNXYyOEJwVjZORVJteEpRVyswYmFRZXVXbmVybm5wbkJET3JETUpMYVVLY3dFbytPNFR0ckI0MmJxelNHdWNaQnU2OVhka1JPRFFZVnQrOERWNDJpMVA5WjZpMVR4R25xcWFmRlFzaWhKeHNRN0Frd3d1dDkwREtneDgrUDNoV0Y4NlYzYncxRFlaSk00M2xxNkZIbE5ldWNCbkFhR25jbHV3Smc0UVNpYmdNeFRlTGl4SElsNS9VaEFXdzZ0TEZPSWpKZjUzSTRrdXl4NmsrK2p5bDdmc3RTWm1MZWxySVJIZ243RmtpRjZ3YjdERnBNQVBlN2lxTzRzcis3elRsb1R0SzY0K0xqN21jMHpsZjlRZGJTZ0M0V1E2aDhtVnNmVXoyb3AzdmlQYmphZ0pSbVJDNCt6UGRZeEhwSUloWGdtdnpTR3RUU0JXbEZxdWZucTVXbklIdVpXTUY2aDlIWjZVbXRmMnhHT0xiVCtKOFBWSXhTbHNDVm9JVUhnZ1EvOExsdkgxY0d4SkZHc1FmaXV1Vit4VzM0U2xRcFloWXdmckhWdWdqMHdtQjFnSlVPVmdPb1FYNEQxNlBRWlpLc01CekNoR2JYWFlDTW9GeVNIU1loRzA2UzJaaU5IcTBSVFlBN1ZSU0U3aWtyYjQwdUFlNjRNNmlsL2Y0aWdXQXVnaHV6aGxuY2JPbHNvK29ER1Vub3lSOCtlNEtPZFlqY1c0VkV2VXR0S0h2TDhtWmdzWTFqZGdpNjZncmFzamE1aE51TEpDb2ZScHlXUDB5cTV2enlOY1lVTWNCeW85OVc2aWlHa3MxdUJWTWRlK0NHVVVabUNPVm4xdzhhMnBRcnBjWkJWNTEzNFVhVDhyazU0K040M2pQeEU0blpOT3dwRlc3NVZkUXZCcnFFZUd3amMxNTdsNmtXQkNQWTB1L3M4c1pDZWJJT0UzOUQzemFQUlV5SlFweXJNMGNZcUM1bC9EQWdQV3RiYmovbElxQVJoMXhiZXZWWlhjZ2JTNGsrVk1rUTJQN01RWUVpek9XTmFDYWpBanB6M1ZGUEJTUllBVzc1UVRlOE4vRzR3YmpwQjltcG5HZmpiTlNGdGxvbUxmQWp4RzQ4S1IzdlVpOVMvbXdiR3dyR1cxVE8zNkJHRk5rMW5DbHhMTk54b0V3bTBnR2tNeWdmeWkrU3hCV1NFZkVjb3ZKcm5yaWJ6d3QwcjNibERUWXVFdU9xaE5yZmZCdHhyMVhMSUVxcW1CaDVITy9WMlRWYlljUUU0TVpCNkRPUFlibm5ibWl5eEdMcFV3TGRYRE5JNHVUYVpubllUNXR4VHNDc1EyVVo0clYzNEY4RE9UUk9aRVFMeHM0MHlGMXczSUsyNlpoT29JNGtnVUJSc3pWQ2c2NTZRTXZ0T0lVdysxeU1wYWM0VmpCTFBxb0FnQXNiOUdrR1oyRDZhRUkxRWRBZ010TU05dkVDeXV6RHJnTlNFeUdBcS9wbEZXWFIxbGdGVkdFcGZRZkU5WWNIK0pWRTFwRnNjVFNBSE1LL0ZOSDFHZnhPbkJDZ21MNE5TSERaa3JFbWc0eG41MXB3TzZWSkUzWkNCb293MXJBZHliN0ZjdS9Dd3U1dkF6SnBEZXBWcUlacHloTjl0eXJ3cHNzL05UYjhaNkp2V0NJNmQ1UnZuMlBJV1dOMkFmb3BWTXJDeWRGbjZUUHdaZ2ZWUytQQzNRY2dYSTVWeUlRUEpEaE5QQVhsWWR5YzFIY28vTU1rT0R5ZTVacUdlbll3c091RDZoMVF1NWtvOU9LU1RKK3FOOEgvaE56S0NCVUc3RFFwMVdCWng1bkppTmU4bWdKZDNiblhYak5qcDEvenBKNTZVbFlvRXdSTzdENjU1S283OXdDYlVHWlBacWdZcU8xK2lkSEN3ZVgrNjVtVkYrNE5uRzc0NjVIQXcwcWFjZjU0dUJHa2tZcEpHRTI3WHhMVE8vcHBNVFU0ZnFvUUdUTVZLcFkxbGtucmhmREFTdUxNS2ppTjA1RTE0bVhvOCtlZHBVeDlPUUh5Ni9ycUxmK0Y5WGlRWEFHMjJ2cnBsM0k0b1M0UmQwckd2WGxuWmJTODltellMeUtITXZweGRpMFFpUm5aaHhOV0lPbUxDVk9sbU5jbGY3eEhnbmd5cVV6eXI0dCt6cmJEQ2NmS3Q5bWY5VVdVOE5pVHN4MTFtbG5OS0ZscWlIa3BIZEJnR3BTQ0RsZFdHVHNuTzBvWVNvZ1NteTIvOXNzVlorR0lUbDF1aHR3MGFvV1RHMHo4SkVSZ2JRRHU0WnNWNkRDTXBJb1k1YXJPUEMvdlRrVjlDUUxBUEhlVWNvYUdNcHF1dnU5NkRUZ2ZlYmFiN3RNbFN1WjFucXdCRy8xcGp4NkthSnVWUDAvbUVsRmt6eDdxQ3lTaEpGRVZHMUZvWm9nd0E4cmgvM1hkd0w1VXplS3VqYmRmNDJ4MFI2bzRSOUlZU3pnUjh1bk9xWWhiK1UzK2MyUG5xUG8rSVBVNDNwelZNOEgzOHZUaWxDVVpycUtBZ3NVMTR2ekp2ZWlKalBWREI1MHFub2ZnVjVCNUtuQXV5MjRhVW1UV0xqaVlibFVobHdvT0RvR1NTOUljTlcyYno1d21wQUF1K3ZWa0NSMFUxaHhuYjVRRHNSZTM5cVpaZVp0VjZRdEE0NVVUTk1nZE5hckRQajlLYjNkdEd4Um1kc1VzZlc4ZFJwdkRld1hnRkZnU052bUQ0RkU4S0lpMVFndnhSYUJMNVlRcHNtSXhTNXNadE91VE4yYkxsdWZ4ODFqQ0Q0SlhjNGpJVEozaDZYaEludnhQUy92bkM0NGlrdjVMVzVKKzd3T3l5bHVCZGwxQ013N1VVMG9sWXhnbUkzVEpwWUpidVA4dmxWdktmS2dZaGtIRVVxaDE4Zlp1N0thRHFxWTBuLzJCeTJjUTBtQ0cwV3BKaVFwYmozVkNHTlhZdUo0QVBMbHVJYXFmbTJLOGg3YkNDWE1FamhWV25yQmNaWXFVRUtYUXBYYmlsd0JZK01Ha1FnQVQyeTJWUjNtSVVtT2loVUxwckY0T2o0NFIxUEhLekxTcGdqL0w2aFV4bW1kYlJ6M3lyNDY0aXZhRjRBOTJKczZEWEhCZk9GR1JPbzZPcHlsVi82ajd5VVRmVWlBbjBCdXhHbTR2bnQycC9zYk5iTjBZQXl5YjMxTzFISFcyOWEzNWhVVWpCWSs0bEpwWnIwVk5PV0pLYkx2QnMySzJiSVZKVFMyL3JKdk83akhCbEQ0TFNmSWo5R25yaGxFbURqcFRGT2Zvdzk2WWV3aDYwc2FmOHdpeTBvY0hMYy92QWNSUzM4dWJqK08yN09tNzVBMmRRKy9uaU9JTkhjQmhaUG1ZSXAxdk0rQWx1U1RVc3RFWUNXcHRIZWdpTk1lQ0dJR1hERmdlZVViMXovcGFHYU8zWkdzMnlzL3RCL3FPNmxNM25zenNDOGFjRzB2N2NLbStGZDNiYkNhUVB4eVcxZFJEZHNKY0UxSldmbkM5OUxaRUNGYnhVbTg5ZmJaMCsvU09ObXhjSXRta2kyL0VJMjd1ZXU5S2l3cE5kR3pQZjZic2pzak9Fc2FjeE9BVUZCdjd5ZHMyN1JVYmJpeGdkQWI4L2FQZVhyK1lKWlEyaFNDUk0yVGkzcmw2a2VRVjFtUlM5WlhyakVpTHB4aWc2bDdvN0hlTlU2cEVDU0FKdDcyOVh6Zmx4ZlBBZ2Rlb0NoSzdvbW15eUdNUTRqZVVZRndzYmcvQkhaY2FLUEZGV29DZkp6eTRVZXV6TCszb2lJcUVXaFVkZ3RGM1JTS1pMVDI2K2RKVDBQMnp2RXhDbzQ3MU91bUhqWXdnV3lpUll3R3NmQ0ZxbE5WU1RIaHQ1NFEzNjUwYWFNb0l0d1NHWlpTOFJwRUVybmFiOXN1bnZlRFJreWdST2toMWIxdWt4ekdkY1Q4OFdVUTZ2NnRycmc2WXBmcFJZSHVNK2tlV3QzNnRMQXJadGdBZkpSNzFxVVpIWjVISTFENHBURktUdlhlNmlWb1Q4SFI0YVhhWE92bEN1YXAxQ3N1NkZrNXI2bm5iYkVaUXlXYUZoeEVISFF0QnJXUEhTcjZVQWE1SzUzM1FLa1hDMlNmbnNnZUUzM2V6Vmp2T28wM2daYkRMR2ZkeGxldUh2RlRwV0V3dWpDMHI1d1dpYlgzZUZWOHIxS0NMRG45eU5QRmU0ZWkvQVNNUjJ4TG5JbUkxSzhRRUcxR2RNc2RyZm9UU3plZFJlOGIxTWpSN1Vzc1BSQXFnTG5OS3VpcW5FUG5kVm9FTGwwaGVqVmtLUE9xYUlseEFleFZrOWMvU0huQTFtQTVXbnJxUFBvTFAzdng3QUprYlhyS3N1UmZCeW1tZ0NFZ0VsejgxRU9mRTViMnU3ek9Hdk5sakN6YytBWFJ4Q1Yzc0dTU0dpb0VTeEM1UExaazN0T2F5Z0ZJaUh4MkU5TnpVbVdtSlR6VWIwQ20wUkk1dW9hVzlOUWJhNTkwdWdoNTFQenBydmNoMGRXQ1lJcTBBT3Q0WHQ0ZkRJektmRkdzQUFxeEtyMUY4OEhuWWc4M0s2bEZ0WjBZaEdaR3lXNnRYdUluWmlOcTYycWV0SW9mdWU4Z0JSdXZQdnRDYkFrQWFpbkJ2VTZkaUtiTm9DeHNzTUcwWEJtNXgvdGpJd1RGWkNNayttcmZUc3NDbXk5emV3MHlicDhTNWFkalh4d3NDNzdOU1VHUHVoVjJ5VXJFRVlyZUYyMHJTVjFwVUNnVmE0Wkp0bE5MQm1BeEJvWVNBejh4UzJXaDRZZDUxVUFOWGQ0SEJOdjJ3Nk1ZTkFnMzlWSUJBRTNudzN3dTgrTStDOXR0YVBEUFgwT2lBSFg4cEhwbEpIY0g1ZzFFa3FTbUx4NStCM3BQanVpY1JBcGRiZHVZV0tVbnNjV1NWRVNNeHNpVmNVRlYvQTRiRXFkVituNnEzWUQ5anFLTkxFc0I2bHI4VCtWUU94UW9pbEUzRVN4ZWpVWkFQa296QlpxWFkyRWN3aEVVc2dTYjVpSzVQUEF3YjlPOC9HRm5xbGN2MnU4emFDN1J6SmhqeTJQcG94TGtFVURMNU1XSUtBaDRYeVpKb1gwT2kzd3RxQms0NVRiZWJvT2NlT1VHM3k4R1JoNGQ5TDZoSGdjWTZRWjV6ZWxDVlRmNnlOUEplYTBOT0xvY29yeENUcEtUNEJlcDVGUTlTS0Q1RG12NDZsNk5qelk2OW1XZTNBWm1NUm5iam9pajQwZkFXZkViNUFHakdqYnpzRm9iNFNWNm1rMGpOQ2FyWGd4M0dSQnY5cTZHR3V4emVrZ2twZUtIclJ2Q3hiNkNiRi9SRE4yM0luTFM3ZGRZQk1ZUHRjRjhkSGk2bHRkTWtnVHZUa1pNbStCUS9zVzVad0hhZUJLOXFjWGhjdXMwTk12RlVTZWhtcm1aK3JXSGkrTEFyVEtRM3JBTU44N2M3RzUvWmZVVmYwTFg1UnlmT1JmL0dFVnRLalVZbWZPRDY0U3ZSWTE1dDYyc1VCVi91UE90WUNHR0cxMk9ycjVwVkZTS3drak9SV3RXMndCRnVtL01HRlhwYkdmYjIzYUVIM1ZtRVNJL013ZDNheVR1WlhTc1lYc3JtalU3K2tPc29aL1AyT2hmZ0pHaDNQVVBnSXpYOVluYnVnSFNaeTYxMXh2MEVYclVUVG5nZkNnUkVpaWpHSHVNL291WHVHQ3B5RFdmUmdqWUJwM25URUludGdXU0M2RWsrUVJySlNBclJzWmJDNXh1QkZXWitlSjQxc1c2azN2ZWxCQTQ5U3ZidkI2VkprRWZldzJITTBRVGt0N3JsQzhpcWdZSnU0eGFVNWJxMWRCL0xXRDJmRVVnbUFSZS9JNzdoUXFrSU1qOU1YNzRiL1MzSDlwSS85aWVsWnRSTGlrOVZEbXdwYnFyZklJQ1pFNnl3NTZaOGN5Nk9GcXdHTGMrTkhlOXZudE41OWVpai9SclZEU29QSy9zaWpESjRpSENpbkJ3clNDU3RyNjlxblgvdmNRaVFkNU04S25wQWE3dkJGVDgwcHAwcW1DaEZDN01mWEh1RFdjSHpwdzByMW0vQmlwSnBOeHlRd20va2h4aWh4TFJsY281ay9yYjJ4NkZ0YlJQclJoYS9TYUk4ZUtrNFdRZEszMDUrNlpOQ2docFh3bjh4YzM2dEN2MWMxQzIzaU9FSzVHRGpUVUE5bHNlRTBTQk04QXpmUW1EeGhqNSs1aEpNWUtiQUEyRmNUQ3pQTEsxWWFZRUJ0aGU5Vmd1UFZtOTlyajVqN0VXejJncGhZMmRBWWFyKy9HYk5uRkRxTUh3eGxpRW4wTW9UUEZSTjVnUjdkQjNZOEZKTThveGhqcmV6dDFuc2lCSFpYV0NRK3RrOEFnSUNBZ0lDQWdPSjdSQURCOU5FaGFPeGVTQm5aR2t1cnJuMm1ROVR6UVhUaWNqWWlXQno0R3NHMEUxWmMzMi9XRjMyL1JmNmZPays3dUY3N1B1RFAyYThiOXYxY1g3UHRVZCszVWI5dWlmN05iblA4UHJLNzdmcGw5UG5WL3dmWnEzMmZhWi90MkgzN2ZxM3YyZmE4Nzl1dUg3YnEvWnFHNGYyL1VFL3M5L3pYenBQMi9ZTGZzK3dQL1QxTDM2dnBsZjAvcnFkK3JTTDlWdGZwNk5EYlhjZVh0SENUWlI3VWZnOXBMU3dXc3E4WVBLY2xnd0JRdHhSMHYvNUROY0RYalA5S1lLV2MrdVNKYWNNOTlCUDhObllkVENnSDU0U01DSTVJM0ZjSUtCemdVV3pWZXZMcVBHTzFEMWFseXo0VStGcElaVnFDLzIrQzY5QlBERGhCdFpvbVNrZnBXZXdyVFFZSmYwNlEwNStsQ0UzWWFUMTlLQnBadzB5cHN2SHBOL21HNW1PblRyTzBaM2J0SDRaQzB1R05rZVRLQTA1RHl0WTJSb1ZxVm9xYmZIcEU5b2RHYUJsWEw1dmNMeWlIUlpNNFNGZVRhN3hZcm1BVllhZkVVd2Vtc2JxbWx0bnN0Q0JyQ0gwZ3BvWGRjN3BHcjNtNFVkc2ZlNzJYeis2MS91dmZFVGxIVEVvR2JzY2J4TktPdmsvTUowV1ArSFZBNDdGM0JVL0tVWHo4eWJJSDh2MHYvM1c3a1NTaWRBdC94Wm1IU0ZXS1JRNWpwT2R4SmVIVDZzVVI4R1k0c3dZUzVENDEvTjZhaXM0aG9ITkxsN2VETHJFenMweHgwdGpaL3dmTHZkazBZR21BSXpQOFdMNlpFOXQvanRKeWxVVGROVksvbUFIdE5RN09xTEsxNXI1NXhPV1pFYWwrOXFJTzZaSDBRSHNQWXdBd2JwaHozUzBoTDU4L2E0TnZ6Wmk2OFBxdmNlNFFETWFtdmQwc2R2WFNXMVpZOUpMN3ZzaGkzWW1SWEdKais2dnNGMGRicWcrTXFsTEhPRmU4TXNzc0sxMkpqWkVIaytaalBUekFnWGY0UUs0cUY3T044T2xIRGw3eXpFVzdMc1BhRWVnYmZkM0NadEJnbHVQN053YXROQWs1eFM5NnJObFlRQzlYd1dkRmQ5K1hBdk9RUFVzQnBPanFTanpINDR6RjFUWkovdTdIL0Z3OHdiTWo1ZWdoN2dXckFoTWJPN0l2L1BDRjJYN3pnWjJxOVVsZldMMW81cTdJdVVHR2VrbHd6WTM5bDdqUXhmRUlSem9KcnVkaDhlVVpaaDR4TURZdmt5RnRlVUZjZkhibkNNZExSRFdOQVB4aXBqS0tqZ21TZWFmL1pOMFFDaXFoVFBKRSt4UVB1aDIwcmJzR2xJYWUrak9RY1p2dXlvc2wxajduRXNJVXhaQnRHZU9QM0pqb3k0NVFEWnFhRG8vK2VHeWt5MU1lZE1tUnNpZEkydE5xWHAwZVFpbU5aM1hpV2ZUSk9XTW9WRmJScWhSbTJwVUdKcUQ4UjJObElPTml6MExsdVBhWW5lTWc3S1VUVkFFVXdDV1psck5hcC9ZSlRlUUFsT2dtalpOTlFLSC9TckE0ODY1M1d1SURGbEpvVkZtZXRRSDFOMTBmM2pKSkR5VzN6d2hoNHUrSHNnd2thdDdRWm5EVGxMTFM1eHZYR0ZpcTlidys3c1ZDbkl0OGk3UThrUy9WWm1jRmRIem9WZFo0Qmw2S1pObUV5UGNNMlF0d2RLUDNESmpBUGhGZTNJODBjZTBtM2Q2aVBXbUQ0VEJjUDI1bk9VcEJOTHRuNmcyTndxM2tyd0RIRnc4KzU5SEE5Yk93cStrQm9UbjZORCtoYjE3NThidDBUbVZyMlhSYmppUFJTaHZnbG9RT3owMk1haSswYUl3VXZJOThvWHVIRGRpVlZCQ1g4OXp0ZjRabEduWUJMVUU4SlZHUmV3SXdNbVpjTGZTQlZPV1BzV0ZiQzZ6SGFBNUFHSXdrckpWclpGODJjT0NDYTluUjhvc0hUUU16NjdRcVVJMVZNVnJZZ1VoTHZUOWErWVVQR1ZEaWQrMjVpaU9SUS9CdUVpY2VGWUhzSTVqSEIxbzhnWDdGd0VZaXluRXZ2ZFZUcVVlbUIyQ3FjS1lIU3FPbUwvRzhjVU1mdHBmNTNJWk5tUUZuSld6aWdiK3doaThjTXFoSVVxWHZ1SHY0dEJkb1h4ZW9MbWpsUHVWMmdhdHBkdENTNkFIVSs4S1VlT2dKbXdaRlhoT1RsTzEyNzQ0WGpwZ0h0TnV4ZlNjNWtuUHJBb3NuVGY3ZFhXcTdTVDFtRXVkRXJ1TFdhQkN0aFZNV1g0c3RUOFRaVlNHMSswZ1lUaHp4VjY0WTBIMG9ibng0TkVtY3pxenJHSFpISUw0V0lIL1c4emlBdmxkaE91SHlHUHBVcG1VUFZndG9ZcDZUR0J6d0ZOQ2ZNLzY4L2tuR2xQZWNtcmpMcXpZNTlJNE5lVytpdXdPR1RQZ3l6cTBya0hHcktmeFFTQ1M5eUl1eld5dUhCM0E2dW85U3VvZXNqWTcwZlJabXNZZFBPVHk4RWJPUVJCRXRlTEJXZktJeHBGekFjaGs3QzJSb2NGbVRNTDVidHUxVmhoN0lsS0pka2FmTE00R2IzY1E2QnpCVkpaRW12dyt5bm1pZGkxV2RNaTdVS3RkZHFZTVJGalA2TGhrZUJPaDZtUWg1aS82dWFWYjBqWmIzRmRJSU53MEJIKzZhdHdrVDIvT1NybXRSREV3UVFmS1VoMjVzaEpEUFdCSVdxV0JiKzR0MG5Mb2FYRUN3VUFhL2xSelhyWUE4N1BQTWNYdy9paUVLUkszWW9DMUJvYkRENUZVTTQybUlTVGJCUnZqK1dTQ3ZaaldYNVpvTGRIMDB1TFQ1QkY0bFVEakRYZ3dMR2xTSnM2NFR0OXBQWnJpRS9YSDNuUUR5T2pWNjEyNmFDV1ZEQUR1dDh6UjVYR0VMMXVhRnNxUENnajk4c05hbFpkSWxFbGIrQnpwbit2YlNXWS9KdnFxbWIxZTljaWhOZFpmMDlqS3h3ZmVmSm1saEhJa25oYWd0ZTAyMjlrY0ltcXBoMFZMTFE1akNGR1JiTTNvT3RYR1ZSV21aQzBQamtJY1NESTJ4NHdJOTZ4SktwUHU3NHpDcEZmWFJsNzZTNjBoU0ZXWGF1NkJPNkxWTTcyODhEa0JWVFE0dzB0UWo0Y0ptcUYybnN0ZGpmeURJaGE4eENvOGdHWDBYTWVMT1d6Y01OUDQ0TmJKbkFIT3FYMWpOeGNhRG1UMnFiZ0Rrck1JQTFpNlJmN2JKMGFEVTgxempZeWdEOGVaQnlCaGhHcHBPS01oc3pHaURrRTdabFdyWHpFTGV2UTZTMHlCcTVaWEQ1SFNyWGI2OWQ5TkEvM3kvQlUvVWRsUWxxTzBoM256Qzc5d1UzNFJSWnR6NUhtTGhnM2ZiREdpMnVJQnlDMmdyTUtWeHFNaHRsS3NqdWhuM2g4WHQ2dlliei9lb1B5eFVNTzM4ancwOEVDS3JWVkN5S21lZklFdVQxbzlFMngvdjFBd2Vvb2lVKzZ4dHROeHozbHFaUHBrM1BmRnlEMVR3RCs1aFZycE9wWUFrK3NUbkU3bG9uMjJoNmo1bTFoK0tNNUsxNFhpMm1WaCtlMGdvWFpEeTBoV0ZPZnh2OTIrS09oZEF1b210L3VBNkJpR1daVFAwY2RjUE5WREhyQWFkVmNteTdlYlo1NWZLOUhCWFRZOWlDWWVodVI0SUhmSko5bTU3TTIzdkJxRVI0dGNxZUhCL1UvUUFUVUs1T3JmY29oM01LZ2R4aTlTVkJWMjd4b295RzFJMFQzN3pzUVlFVm9PRTZ5KzBlcEQ1QUNNNHhTblNDZlVRc3JWRiswaGN2Z05EYmRaSld3OVVXVkFrS01XOGtiT2xEYjU2Snkxam14eGF3OSs2Q2wzaWRHNjJtUnJsUmZ6NlozRlBYSkNyRlhqYy9iMHdvMXBQMitjbDVTWGpnWWxWOFRuUTVFTVNKelgzSFdhRnF0bmpBM3h0cU5CZnRtMXlSbStQWjVFbHFVZ1g2Nys0djI4ZXIzMGRrWjBsTkVxWHBwL2FjM0ZkQUNDZUVSMG9LdmhRSXdyQU11UTIyZ296MS9ORHFPQi9semxUSlRHSWN0TUNlR3hxNkloMTdMemZJZ25CNjRuWVBwbVltTUVpamFwSlFvcy8zK0VBL1J4NUREeG55clB0UXY2d2FRWkw3Q0hvQkFOanN2TkNraTRHd0tEZkNHclZNcDJBdmFqUFg1Qmp5M0dITHIyLzJCMkRCODJjMXczTXgrUU04akdlYi90WnJncjM1TklXZnBXbG9zSkFLOHN6VjVHb3JuRjdPWXJFTGVPeGJuL3FwejgraWVoOFhPNFRmcWMzdDVGczhaZ05oMjdUUCtLNVRQOGNFaksxVHBwS2E2Q091NCtCQ1NYVlJXd0dTVDliV2RlRG1CdGNyVjdlSFVwdnhWUXp1NzdUemVUajRMd2toOElJRDFoamE1Z0drUmhnb2NUTVE2MllsYW9KS0srN25xYVpubWIza1pVTjBMb1gvUXFmRTkyaWZBWUtRbzkvd1AzSHh3VFN6dWNxMTIzSSthSFpYZ280UlljdlVvcW5xOUVsMzRNdTh2M3FmejdlbXVxVkNqL1Z2dy9QSWY5QlFLNEtRaVd6WlUwbENKOTNLUXZvVEpHak43M0hFaXNkVTJvOXVJTFl4QlEva3pCdEM1TVJudUFrNkZwR1F0WllyTUtVWXJKZ3ljc0RrTVg3SlNhVFdvbmFaRE1CenRFWElueC9hSXZNaGVVZU5WOE5wdUl5ZkVjYmxvemZSTjRST0pCcmFLbk05WEljeWZVN1BGeXJiTTdwNXFnRHBtNUtyRG1XQS83NjNYK1Q5UDR4Qk9jQi9hTW1OdmdpM3ZxOFJwU0Z4c1hybXpUUEZQNjdId3dEd1FWRWF0Z3dwNVRRb0s4WkhuUEM3OVhhWW9nc0QzVzlraW1aOVdVcFBkTzhDV01zNDNpZ1ZZNk1rcTRGcmt3NXBsWmh0NFF0cjBoNlNoMll6eUVIemZqMFVZZEd0dkNxdndDOThsUVNnSkF1dGt4a0RVZ05MaTJ0dGhiaGxoUk1TazNyM2NCekZnNGFKV1Ztbm5lSmhVV1V0UmF0cWJCL0dQbnZiR2drS1JzNHpZL09Pd3ZNWitYME5nc05tckpPV2xlZ29neUYzM2NIUWNaZnpNb2VldHFWaTJBZ1VnUFlUeTZkMGFWYXE5a013V3NPd3hxeks4QWVPVjJWNGhOWWF2OGNIS3VPVW4rbUlrakpXekNjM1A5d3AzekFCbmF3WjhKK1Rob1FCV2dOU2tsK25UQ2pRVHdTcVlCL0svRzJLS0xhY05ZSlFVTXZhWkREUjJyM05oT1l6cktZYVkybEdVZi9PVjJidFdQbERMYnhORnlUYmE5Z0VCc1M0d3ZNdzh3cWxZK0ViM082VUFNbG0zR1ZjdUhjN3drMjgvd0lvdW1hR0JpWjcvR3hSOUJ4Z2ZjQnhjbXlKR3kyaXRralJMSnh6NHdOeURIczVQMUFpSWRFSHJ6ZWZ5Y1Nqc1QzVUxDS1N6M3M5d2RzT05hNlVvRmZtNHpYajZrdCtORmFoNU1ocXM0VGwxY09vNFhMdi93UFkxbUIva21XYThjODI4UVgrbFpEODNHcis0S2lZVWFiaE5KaE9UeHRnNXRwVllxdHQzQkZxeEF6Wkd1Qjh1REdzNTkya25ydjN0UG81RzNkTjJuS1hETTM5TllQcXMrVHQrUGNqM3N1aGU4anl3b3dVUDh0M0pLYUZpYjZnNUxaclg5UGx1ZGgzZUlYVlAzQzlIeVNGRjhTZmJOL25KSk1Hd0dCNnlFaUVkalJUd2E5MC9oUCs1TGtuRGYzRW1Tejh1ZUh0bXc3L2VpZW45VitCTllHZFNjZWlsVU1rVzRRaVZrNUc1TGhZd2xEVHpKZkdtWk16cFQvRXRUWXZiUU1KSTU5ZTMzSU5xcDhISUdZMkFrdWZFQUJHK2k4V3BvSVJmOGFYMG9FVTMrUWpYQjZCRVZEMHcvcWNySzkwMHQxQmxEbldGWFprU0pERXFDYjIrSFZRZGxoZkh5VUg4RTBXNVBGdnUxM1NQenFLSHY2R2d2S1ZLS1F6b0ZJVENLZUdFa1RzbkFIa3FKaEx2QUk5UHFVdXdkeS96eGw0L25TVTloY2YxM2k4OHkvK05rZXh0cVc5WmR0ZHBNbmZVQy9rNnhscUt5em81MC8rQzYyNXNqUXhyL2RBSS93YzFURzF6SkNHd25WMjBkNU9FVytyRkJiQlRndFROZWdGOXlCTUZwOFdGaFVCd0NLZ2Q3NHJDWUVuUndUTkYrY1dvWW5qdUpoQ0Q5U1d6Rlc5UngzRlhtU0dWUlNUQkdBSEZKZTAyd1JMQzRNL1hRUWlzWmFodjFxWWt2NHlUK3o3Q0hWSzJwNU96SnhsbnRQNnJmTkFqcDZtNHNGWkR3dzBXNTdGSUxLL3hucVIra0t1S1lPSXNWNktuSG5mNjdiUVFrSFR1THpCYzFOOUlIRXd0UXFBY1hGN3BOVGIzUTNXMk53YkZhVEttSmNmV1BvZlEvbHZ0VXYzbjM5cVdWbEtFZExyd1luc1pUdW4xT3pEUzFTciswRXFDTTZrTklndDlla0dOMWtEVEhQL1pBRjZYVmJqd2FRdzFTcnF5U0ExK1ppRExnYVRva0JuM0ovbnVKSXJFbjhSKzFVWjF3YXUzaGcybVBuWUV1cHd5Y1R2N2VqSVk4Y2ZVTmljaXh2cWpwUlNBVlR5RXNNZ0xRWHczb1JuOVIvZ1NHcENQTnMvR0ZBNlg5Zmw2Nk5PWHFtWEY1b0Rib3l1MTA3T1VMR3R2bCtyL205RC9TNytCOW13aVRLOEpVQ1V3WEttK2V5aTdpVUtKb3BMODFWMHRja09ocEQ2cjZxc1JoR3VRV2JzZzVKTFZ3WDZiU2xyUFlHcmRMN1ExS21mSEFYaXVuTjZZMkpUTSt2MERBMVJoaUw5Qm9jRVJoM0NnVEdZM2VWdmhmK0dONnN5emtkMDc2bGZEdTMyQld0dHpPVDkwRG9tTWVGR2JTUzJBNnV0K2t6dWdIc1VuSU5YSXdVZ095eFhjNHFKNEcwUnFWMWNjNlZ0ZXJTck15Z3gzTXBsT1FXbW5OUnduWG02TG1JRkZnZUVUVEhyNmE5NUpRWXREekdFdDVCVWxNdEx1bytNelNjcFhhUmNkWG0zTEVJRnJoeDlVTzd5SGtHUU1ZNXB0VUhDMU42WXJkRW54Z081Ykc4YWRXVnhsRDVYN0czaGNuKzBSWC9RRTZodW9YZ1BQaTFXT2xmcStvRnZtWjBwZ3QxM1lKb2FtNlF6ZXpyRTNmTk5yc3JyN0hHTUtSejlCRjg2ZHhkVEpDd1FUeVN4ZU83S0ZleDRLL2dzL2MwblEwNlp4di9SYjRkeGJZMXNQUUJqY2wrV29tZXdrSTFQSkFKYTl2YmhNV0QybUZ5dnRGUG5XZ2podUh5ZXBxcS9xNFZZV09hek0vQnl3amRQNEZUYW13UHR2VXpxT1AzOHNtVHF3NW1ubVovTUt4T25LMDhEQUJWd3lyRFNRUDM0bExEZmdmMjQvb0JOM3NnNjBEMVVBb0E2LzFIMytUOGlxOW4rUjRaQmNzVlhmcWJCai8xUW43bjdqdUVtSjF3UEQ4V0lZOVllUFRTdVNGL0dBZVhuM0dGa2V0Y2VOblBBdXE3L0h5dzlGZ2lvMndzS1hmRXRaRzRxSVh3bDFhNVBIVFhMZUkyendiNExMSlJuMU9mZjNiSXdFRU1XSkhFQmdnaVJLQTV6eDBTa3I1aElWU2h4L2doQmprVkMzbnpXcHNwZURpbVBHWE1OZWl2SGI4SkM3MlhLOUxRNDU4VUFCdGp2TTJmeHppUVp4SFZvLytFZ1JVM1g3RWlGazhMdS9Ud0JrTVo3em1Sb1N3ay9tV2dacGVueis0UlFRS2NoZ2V6QjdhbnN4QVZxaFJyS0VSQ3NFQm96aXEvOWpzRFlkY2VxcUxvMzNKczdBcUtMb0lJR2xXWWkyNThpcTI0VThCZjkrSGVlbGc1RDNSM1pwc09UaTBKZnlpcU53ZVljdGZTdEU0Yzk1emhkdGJNZ2VtcVdLOG94WVZHcU5QRW5aRHpFQmVSUU9WZzlGRjJJTWpZVjVLZWYzaGNDUFVnclY1L0Z0MnVWcVo0U3ZnazBsSWY5ZTdVcFA0QTg1K2NnQlByUHBKUEpWK3YwWHZ3SWhEejJEWmpnbG1xOGZWNkwzWXdpUjBRbXBiQlRMZVZjSVdEUEJzenNUa3kxcy81cW5tbnl2N3NhNzV4cVhOcE95dEtSc2hJY2g0RkpOeUx1S1h5b09lWlRMemdzZE0wc2pnUnVETyt3bmMrMWQ5U2JYc3lsZWZUcithOXkyTlFmdUR2Y003cmJDRXBSRnQ3UGVhYk1xRGxVcU44YVo2OGJ4dHJnaXdzaERIMWFOaUlXQ0VSbHpYVjNXNXpkeEdvWDVTNm15ZEpQNmRLMjE4TkZlc1lVc3lXVkNKMW8wY2pjNDFLM2V3dFFaQ080Q2Rxd1lBSFpnUmtvMFdha3ljNDhNUlY4N0Ivc2ptOU5HQ0h2UEVHUTBRUDJGMXRoY2JrOS9raFNmdEljQzZoNnErTEVyai9hanYvSW5kblpoMm5EbzY4bTcvbkUrSW54Ky9VVWxMY1ptQkFBYjk0SjJvNmhQa1B6NXZmT2RObm5jM3RoSDhnMVFOUE4xZlJXb2E5cWs3RmdjMEEwcEM5ZEJZQjBuNzFZUkw4b2pUL0NUODNXWStwc1c3RVZmQUNyRVlHOVhqWnpJdS8rRXRFQlI0L1llZHpXT0FpNXcrMDJaS0Vhd042WURwM0RFRWlYNTluVWFONllTNEcwbEpVYW8rOEw3N0xYbHdtaGw0Q2oxREkxWFlzWDJyRGlXdjR1a1JZZnA5SXZ4QUdZbzBOMFRqUWNwZW5NeTZMaFdKaUJqSE5hdE5kVmxJUFQxVmFIb2hBQjRPQnRiVk95VHJreG1JdVpMdW1XUkdhQ29YYTFSOThlNkJLNzk1cld4QWFJQ3Iyb2hYdlVLVVJCWUJYL0dISjFFZS9wMEYxeXc1RTJqaWVCd3crL3hRTDBZMTdpUXBtK285QWNXMGlKRFQ5ZkxVRzVZUTltYnJlZU1vcFQ2ZzRUS1UvbEtpWE00M3J3aTRoL1hzblFJcmE2WWNaRTBaczA4WDBTaUx4YmhjNGs3NGhJOFk2MnJwNE4yODFrdCtneXAzMzRhL3RyS2hCQ1BmSTljUGViNDVRVWtDZDJyWEY3WVhQcE5UdkFvMVY2bjI4MXRPVjhkVVdmL0tSekZuN1Y5YzhISzh0Umk5YkJxSVhzZEJNUFloQmhnZk01TDJpWXM4YzFEK25PaFA2d3ljcWNwZGE5T1Q5U0NKVFhmOXEwZEVENWtwdkhKdHQxU3dxYVlUS3Y4MHdCeWxYVm4velFzQzNlZGJlcWxCVWFGZVV4aEpVbFhRbzUvTTNYUFdYdUYyenVORlZyWUhiOVcwUzBDR0YyM1h6QmRGYnNIb0pLWUNkNzE5ZVQrRWVKSERIUi9SQm1NRDBRZmphTkU3VlMvMnYzUXFNTWRrMnJyWVIyN3dWcmlJcnVpbXZHSzl4NjliVmE0T1dsR3o5aWlWMjNUQWsxd3lDZy9UT0d3RWFXcWM5T3F5OTVrUmFlM1M2ZkQ1S2R0b1VIYXp4UUtkTGI5WjErMldLRDhTNGR6Z1NiaytIR0d6ME5YNHFRUmJmTzNCcVVXdjVBTVpDVU5icVVkWk5pRFN5NzdNWUdaakJWWlZnNjQzNlN1dUpCVFk4anMzQ2ZlNDlUWkg1RWRORXhMUm1ST0pwU0liUCtJelJuckR0RWtoelJBMS82bk1IMnoyS0VQN3FUS1VibXAyRWZRSE5MbTNkeEhUK1JMTitLeDV6Qk5XckdpclJkclBtKzJUTEUxK0J2MU91bWcyc2ZwRzBpZ01oKzVmdjh1RG9pQ2U3eVZoRGRJOFVaVFhqVExZQ0RLcGRURjV1RlhIU25FTUl1aGREQk5ISjJueVpsMCtVdldtUi9YY2RZNC9oQ2JEbGtOMzhXd2IzZTVyTTBTN2s4NXh4a1c2WWNsa3UxUmQwdjVoanprUEdSbmt6WlZlbTRPM1Y0Um4yMVB3bW1VUUw1eVVQUSt6bnJLZlJieFBCb2pqbFlBRENsN2xxVEpqQlAvVWdaT2ZBZ3lHaU5wS05QOWxBWlVjckN2UE1rUGNhUXIxcHFCQlp0WXNreVZQNis2T3N3VjNtZDZjcDNOaFZuU0hFVldJc2tsRUVpeU1PWWcxcGp4NjE5ZGtlT1VZTHBoL003VUlvWEk3SVNYelFyRmRuTkVybWVyM2tDWU5OTUtFOUlMQk5yU1dkRXUyaEYvRHpFQWdveDJXSFE5MXkrSHMwbDFURU54bFNpVk9BTmZJRjdZWjcwRGVLOGtrNDZudElnc2RQK0JSMDdscUcveXFuLzJKdmpLNURhUm8rZk9nb3hjQmlxOWVmZ05DdXVnRGRubjJIR0k1NG9Gd1o1Q2NYN0h5SURncVdZQWNrL2dhRGNhVFZrNzhjU2k1dnRuaXlRc3NjcThFUVowZ3VIS1NLOFJQZFBTcjNuM3hHWXI5WDVYWjhwZkpkVFhOYlI3TFU3WThjYWRKMmVwSlFkRXZScStZc0d6ZmNnTVQrV0V3d2o5Mm1TY2tzbkY5MGE0UEUwZm5CT0puTHdYVWtvd1JIVHlESDA0UlpwVGxQcjhPenVLQk1UT0hldHNtdkJ2OVR5dmszelZITjlBZ0N5bHBaVmd3RW9lMmJEVzFxNk9DYU92T3lnSHVKU29uVTNxZmZidkxyK2V0SGlkMnNZOUZuVjFJUEJqTTRPSVYrNDNRdmk1TXY1d3dTL2VuNU4wQm5SNmlydG1tRm9zMXEvZ0x5TnB6T3ExT2JtOThGOUhGTXNkTjRQOW9ZTERhcE5YVkhWY1hwL3pWMXdSbGJSL1cxR3MwWWZOeTk2eUVzZnFLcFMyZ0tPN2Z2UVFoN24zUkRIQUx2Ukg3akJWeWQzbjJjMFRtbkZQeUtMSVRDc2JJVFZUT3FjM1FRTVl5cXVIYUpFUTBYanczTG45YWpjeGVSbk0wZUNvRGZFbGVxbFNIcGJnM1dDR1MvRUJNNGhOQ1lNVXFHVmJob2FiSVY4dGI2OUNwUVk4SUEyVHBKUzdlanRUZUZlSGRiZzJtZVF0bVBIb2FjT3k2VUxGbkp5T0cyR1c1VFQzL3V5NnpFVmJRbExMRmhSS3VtVWV5TDVVZXQwZXFTeTFnQTdDS2ZmVG8yNXJ6Mm1iQ2lyNzhHa3pTTERudkVIZTlaWTFhY3hWQjBHdWZpc3RVaXJRK1pEL2JJdFpLakw3Uit1OVJiMzNGQmlWTmpLR1B0ZlRsYnlacE1iUnB4Vmo2M0hIZnhVN1V2WTFGTjBQNFZOckVRWXZhVkhjUU9rZnpONmYwQy9rdjJabHh5NElJQjdIM3YzRkJVNlBBTGI5Wmh5Q1MxUVVaOHNzcUdlTFdzQWp6WVkxTHk4Wjd1dVJFUDNpcEk3M2JDdm5oS1ozNjVhQVFKaXJ2THBGRUhydUZYbkswQW02Z053ZUxmUWRaMFBmRFArNnJRUVQvSDJrc2RLMHQvcDR5TXVhd1FnZzM1bjNNRVBqWjlYaERJSlFER2dyb2lhb1IxY0svb3gvTm5OSk5WZmR4OG9Wc09uZ1VVMEUvWGlPZ1M3dGsyWnR2VVkyN1FDQkNUQVBkdS9JKzN1NTZIbVdZdFdINnhlMDdFK0YzS013ZVNJREVpM3hxcTByV1FqZkZQMkdVOTliNXk1eU5KWGpXMTNqbncwRURvY1NEQU5sT0RucnRad3oxL2pCVHBSN3NoRHU5VGVFcVhNSFR1bzRPQ3VIM2hPVkdmaE5Uc0UxUGVFQjcwVUwwZTJUUTNlN1RzdnpNZjUvRm11Q2VMdWo3aEJCS3FobXdnWklXV3c0aUpHTkVUem9IanJtL2xpWHJ6N3ozQ1NELzRZb3p3dFM3YjBjR1Y3em5SZjhDSGh2dDVQcGRsU3JIS2huMlJ5aTc4YTcrY1c2c1dlTUZFNDJzdDBkcW1teU5JVVAwQzdvRVNjWVNXelJoelcrbVpBWExmNmF2NERlYVdudkNkRVdHdkpPeGNITVMxcXdjdHFaVm82emxibDNYZWVyM01xRjMxTXlmSlFtV05IaGtVWmlZMU5kWDc5ZGlYWFoyMnArOU1CSFFFM09GT3JveGNMR1AxaTN2bEt6MGJLYmovZm5NTWkrMk5LYXJFaEkzQURQM0sxSUdNS3FuZHRCalVKT3dCWm1jK0dhU1g0YVV2ZWdDbE1VWElUV0JtT3hvUEFUMmhHTFVIbzRKWFBTZitJMm1LME5FbXhSUXhZdGJ4SXF1V0tnZ0FvVmVGcG9zbEFvMmxuNnZGSEliaDVOYi9SNmpRTVZXN1hTQ3VtSDNsU3BkcTh2ZXpVS0VTRHN4NE4xNFp0emxXSkY0aVRQeUxBZGw1RkpLT2o2Z3U0K24vZWxQQTdidXZPcU92anB3Wi8yd3VLNTFPVkk3RDliSTJvRCsxbUNycEhua3plUHV4NU5NT1RBNkxIY0FZM0F3MUdWbmJ2eWRoZUFaN3FuSjdSQm1pT1BIR2FKcGpPSlF6ajY2TEM2Mlc5a0ZSaWk0VnErN3BYYmpGSnZkUyswVjc5UGlGaTN3b1AyNTcwS2owL21tRVhQdVRxZzNVZUR3RWtiTVFJb21hYk9yT1FCVURnNHhBK0I4cjdtNzlUL2pPZG92ME53SDR6dy9iUE5PQlBESmpoWldFNHllb25xODdaVDgvaVA0N0NYVHVIUnQwWFY3Ym9QTlJ2ayt3NU45NG1aRXIvYlZEVVVpVy9yRDdGQ0xDYytnL3dzN016TEhuejhkS1I1M25pMEJOUWNGOCt3aWMySUlUY3VmZnJ0NnIvZTBSUFdXZm9RVkxjS1FZUU1VZ0taMHdMNmE3dlpVNHQ5TWNTU1BOc1h0RmpqYXl4c2I0a1NJNm5TM3A0Q1JHZzdVQnk0N3YxQml6NkI2TEh1UnhwdkNHVytpS2NiRGJ0dFowK29QdUpUZnFzR0lyRWRLdUR1aVZPOHNpYS9HZ1VCcGZsb2V0bW42b0F4dHdsQ09wZExUSG8veWM2WnE3dFJmT2RYcFlDbTdXU1p4MG8xU3ZvMlorSCt1TGFuWE9TUmIzbXJOckVoaUhJSWVPZ2pJdzdLL0lDUktwUHhYc2hFenBjWTd5b3Zaa2FVNW5FbEtSR1ViTEtOSUQ4Vk5jODdCLzJBemNxVE9uaHpXQ01HMXhWT0FyZEo3bGtKMkY4MVpWdzFidWlYcHY4TGdGUWxHVGZtTTJ2Q3Mrem1PRmhUbVNCMkVKNk1lZUU3Y1pjSjQrZ20vUkFtejB3QmZwL1UwTVFhdmZxZGNJSFQ0ZTJOMUd3MEFMa0lmaFlKSVA1YzlFeE5oL1pOYmtSR2hPTmFwdkJyOER2dGp3bHJNVmJ4V1JiNm5veHNrQU5WSkNvVlo5YmQzTjJsWkxXb05LZDhySU10NlB4K0phNllZOUVNeVloa245QnpVcHJvSzkyeHBnOTlzVXhoY2RuSnZzL2JYcEdacW50VTdkV0U4VElEUlZ2dWdOZi9MbUptUUxPTFFmTXZFYjFYcVBHWWR4N2NqcDBHRU0yWmlqSFVyTUdHdDlPOUVZb2pPYkE0UTVidkFoYnUwSS94Sk9LeVBJK3d4SkFqd3UyV2w3c0FCYXBBYVFZaW9yWEdYRjhORndWL2dpOUg5Tmx0aW9teFhJQTNpTkJsMmJZNDN2eG5MZDhmZHY4K0FCbXgyUWt2SEdPOVNZS3BhL3dUSUtrNVJ2dUptMXlzM3lzVThGUFZaZklLY3hIUzhwTDIwQ3RrVTUvcmlEMmYxT254QUQwczZiL2s0MHZibTdScm1ZRjRxb3gxdEpESURtMHFNbVoxREVUaEFRSUdiR3Z3YlhpdWo3aHo1TEpHMW1sUWlCajB3NXViZmlzUXFJK04rY2pZN09iQXJQSk9PU1Q5WVlRN28yS1JPMlFTZXZxWjVEbS9zQTY0V1RyRFQvVkNpVVREZDlpbU5sUnNRSG1aRlpOTTJmUnJOb1REenpzekpJWldtVGlhNFp6OVpKVWJwbitYZXpPL3ZKaXBsdjJRWEw0bWU3MGIySFNqSmRiZkZDWHNMUkc5elZkWVlWYmQ5RVhDd3h5ZW1RZjRQZUxoOHJJZzljK0dZU2F5dm9VenJEYk1TL0ZmaDdQZTNvNDlDd3lNUWJ2UlhrL3ZmRndqbVV5L3BUOE9YZVZwNVk5VTNjSzYwbm9WWmhPWVV5NlFZaE43UlBxRDVmWFFpUitlMmNKeE5PaGVEL2ZPTEFZZ0dmcUNLbXpvUlF3YTFqdXFteHJCL2RoQ0Z5c1Jhem1HM3N2dmp3aGJGMGZVVFloc1UxS2FLK3hwb2Z1YzFhSU1ndGNDUlVqQmMwYU1sR3V3Z2dGd2xtUXB0a1RLY3FxS3pHU0ZkUnhtNzJ0NzNRNmpUdmZTUmo5Y01yUHFyTEhYTHFKMGdpMGsyYVVPeVYxMlpOcU9LN2FFZ0ZyUllTVS9KQmpVYmFIY2pjNDJJR2ovZmlOYUprck83ckFNZ3lvekZDdlUzVVoyU0twL3dSZHVCWEt4eWZRdFAwcHNUWDJiMnQwY0lNbmEzNjJqSVBlOEJ2TXo4ZGFiU25wOFFGakpxTUhJaEFlSjJ2M24xaXovNlk3SHI4a1ZNamJNMHNUVmxsRFdiRmZSRUNZTkVRVldlTUZYUVlKU3YvVEFFUkkzeElNY3MwN0M5T2E4TnVqK1ZxQ1NoQk5ZWWhGcUtPQ0FFTGZZb1pYd3Z6OWUvaGI1VVRLS212a3RSK0lncHdjd1BXT0o0Y1FKVW9zeTEweUUvSmVIaFYrUHF5YS9RMEtoRmpMS3poVm10bEIyYWg4eEVLdStjc1Y2N2RyVHVSUWJzSU1pZEdhT0owbG9mdHMva01GbkVCNkhKeWcxV3VFOGVzTUZsckZNa3g3UEtLdzRyakpwTkIxTG1ZOUtWWnk4STNkK0o0NWQrNWVhZVRFTmVJTE1peVdibEdvL0FJWGt3QTVwRGtsQ3B2R0JBWWttNWpMdmF5UFhGU0plZVZTVFY5N2tGNHZDMDJCcGZwanRCM0cyY1Q4SjBKQVlCTW9uV3RBekFvWTZKNXU1anZWaENpcVhGQzJLdzE2cmdLZTQyZ1VJMG8vdURFN0UrNU0vZ0psQ0FtY2cxa003ZUJ2emRxVWFTdVE5d1hpZlJaYVA3cEVPRlBmSi9UdGNXVHdLVGZOdWUrWXFsVWFYSjBkWllaVjJUdXpKaDZueTFrMFNGb2oyUG0yaU9mZ1dnTWEwUkNjK25wd0tmeU9jL0tPaU9MaEFUM1ZzbksrdWNqaW42bDVWOWE3L2c2WXpEdmphWW55ZmV1VFFkbUtsK1BUSE93eVhpQm9vbzZGamF4OGVQV1lHaWEwbmV0SXNIYnB1ZHVpSHJDRTQwMDkzeG03dFFXc2NFcUVWL2dxWHQvZDVFMm9Cay9TVzhVdTJKbi8wNjdTLzVoWG5RM1pZaituaExtZjcyN1N0MHZKdjduak1nV1dxQU5ZL29ZQUo0VGdJak41TDgrVnZaS1kyYkhwYzlpMW90ZUYzK1B0UU5aMmdCU3FkVEVwMHZqYnlJVFZ5QnRFM0ZpYjVoWUlHOWpjVjJmNkprRDc2d0I3ZldyREtiZWM0MlBRelIvRU5RQjFoVmZuRFIvSlBBdUlWam4rNS9yV1h5TTFoL1JDOThaWXhFWWU2YjY5R3lCK0JsMXJSUExmNitxYzFHdy9hZnE2blc2ZCtmN2NTdFYvWVZQclNEN1JHemdKY1lFQk9EQkZ1REcwd1VrS0pnTmpLRzQ0WXZ5dnRLOVk3aUNkMzU3QzZLYlJFTzE1a1NuOHdsTHc2RmwxRnVhRUtJRzZMa3V2K0plVEtsaTdPMm43L1FxYXc0VHVSeDJDWjM2WElLaEJFYlo5YmxQVlYvTHkvS2hWWEE1MElub3FJaHQ4a1RNQmtKa2JjZkRveE5PODJoRzNJRXVXRjh2OVdNaCtBOHlMUnlRelVCZ096bndicU80M0hVT29GRFFXUmZiSFZiemhKUkpLbUttd0RpaDJBMmxoSmFIUlE1MHh2bUtqY0FrTjZGTkp0RUVZRG9HVEhTbzhhMklBTjQrQ2lrRXhNOXVITWpWNEVPMVowREl2L0pDcGpJbW1tbHlvRnhZMTZUb3JpL2hUZ3puN0FiSG14Z3Zud01jSkxrOWhjNUhjME1IZVpUNlhBbFVQZEtvYlRxSE5UTFdVVjdYRHgzR3dxOHo2TU5zRG9SakE3dzlKRk9reUhRMkFEbHNCUkRhSkRqUjF3UGk3aUdqK1lCUyttVncyeFZ3SU5jaWMzVnVQdk41eTF4RnRtemVlV2RPRGF6K0t1Z2hYbVZROEhHemw4QXNNZWVDc0FqTGtDcFFGL2pTS3hheG1OYXZDOUoxNVViQjRFWlBhRkNlbVJQWEZFMTI1eTl3MVc1TmMzKzZoSzhnTjl5aEhHOWRDWHEzRzVSQUpPVXVVVE1mZUJiTmgzWGd0TWFadnhBenl5WGFZYnU4aXRWcWpwTGFJMVhyaUNGYWJJZ0h2M3B5S3c0MU5abFhkN1pxNjNCUWNHMUNNb25pODJ1UjJwTzFINGV1UG12L0xRak1NMUk0d2ZpVHN5MjhaOTQ4aXFmSFMxejEwSTFWRWNod0t4K3pxTzdBQ0w3OXE5SHFmMGdpd0ZnRzA5ejlIRHhUY0M2SnhPUmlzcDU3ZTVkSFU4cklrSlBWMXNucm9sWXByalFuQmZ1bEFOc3paU1N3QUxra0haOFowUUZhQzRNbCtmMDEzM3NqbXZqeStQMTRyYmFwU21JZTl4S2cxcHdKWmZqcW9ETVVuTVVxK2lORkQ3N0NzMWgxOW5MS2FhTEZIMHFWWXFlalVoRDJVcUxnTHVVOXRnVkRhb201eFI2RFpGTmpTaTNNWmpnZTNuZlJFYW1EZXBUaE1ZYit0V3VodFpteEV4R1BNdVpJclJDYnhxS3F1SlhnNlUzZVFiZmFLeVJHOE1jdHNVdHl2RWxYVm4yNUZFNy9ZRnFyaWFoQzF1SGVwTkhablZMenJpaWxyWmlhQWhhQm54M0NLNXZCWWRnVUtGY0FJdnhoUVlhOEZhMjI0TE00aWxXNnh5V3hmcHd4dmM5ZUxwRlN4VStlOTVaTmVhOWZIOUhUUUU0NHMwbFpsR3diTHdnSjlpSDlsdllDMWtscDRDeE15dFJTbExjOVpJdng3ZDZVK3RvQWt1T1ZXYnhObFlUS1hqbDM3UnhsczRobUxJYzUrdEZKQWQwZFVtVjMxakRnZHUyNmlHR0pxYzBhb2dBTUtkTGNEY3lyR2loTXI4MVFZYkgyQXFjaFpBZnBKOG5jL2tjVkxEaEZpaVpOS045S3BBdlZhcDVBQWJEWTVabnYwS1A5WC8wUlJJcW8wOEhmR1dHNDZjUEI2VlN2RUZvdUQzdi9ZUEF3eEI1SDl5Mk5XeCtLZ1ZMS25xM2oydlhBUkRmbHc4RDBBQVA4YVhRM1dZK1B1VnE0blhXYnBkSGVCWnR1S1l4VGtUaWRwOG5GL0IwaDQ2MmpxZHlJczJndHhEbkdhTUg1T1IvYUhaNW9CbTV2RUxjbUg2YUw2RFBhTk1wMXBHQU84em85N3loamZKVGpzU0RPVzdXaXpsSVZDVG9xMlhIQVhpalBnVzBxNThoRkZFUEFVUDNJNy9KejcwM3dZR0ZVU3VzS2VRWnh5TVJOYkc0Y2dDSnBYeWJ2aEtPTHRkcWZtbjQxK0kxa2dUUGt3SjVJRStoKy8xeTJRdFdLdnVua1FmdnpDMy82MU9WeGwxN3N5WVkxRmVCNUZpRDhRREdmWmpEWloya1psWlgvZmVIN2kwL08wNHNmeFVFNDZjRlBrZUwvSU5GV1JiOXlDVlRzOWhWSExiK2k2a0M3ZWxLc3FtaThBOTRrYnQwK3hIVjZxc2k2RzNwL0pJTGl1ZTA4UVBwRVU3dHE4OHNuSVNxZ2tRKzlzY2V6c1VzOHkrd0JScUN4aVZSRHFnd3RsVmlTbFVmcE8zKzZoTDF6ckhlMGgxaUhRZmhnaVlDNE5XNWdWb1NGYURGV0lpS25aMWlxK0s0VHM0Y1pPcnlDMWhMZmMvcGl4d24rc0tkeXpaTFEzWCtjWDN4MmhFdFlBdHZncXhneksvbzdUSVBLSW1rNlA2eHVvRUsvYk50VVQ2ZTdSOXFEOUJWenNQQzhtNlhKSkZOcmkwSnhOVm9vQ2ZjMXRPQmhvVnA5YmRHMzljdGpmYkpQRVNLT200UWlUWmFrYXlzQkFqZ3ExbHBKM1Q3bVJJYnd3bnBuWXhsRVZYdFdTQ3ZqenZmYmRYcXd0SVUxc1FzdG9NaHVFQ0pHRUtKYlN2OUZBZDVqRjV2Y2ZGTHZMd05icnp0WnBqNEEwRE9EUC9NWno4UXgzU0ZSUDk0Z3lSOFV5SU43ZFdYVFV2dEw3b05wNG1hZDdWbFcyZlRJRkpkRkxPM2YrMXR3aDJ6emtxYWlZSGY0UFp5SVdrUFh6UVJIYlptZ09RcXpxa01ReGM4WE5KeVNic2ZDdzhFNzNXMUtvVndPbW1SbGdTTnJlc2VkU3NwMmRHOG80UnphcC9QTHdmRThteDd5azV6YVl2N2k4c2pRWlBFdVB1SWU1NFpxRXdlS2tWNE16dXRGcS93NFlzc256U2gvQjNPL1JOMWlGcWFPc01KMFVYRDFjSjBaYm8rdWFHVXVRcWY0SnhTZTVQdjdzelRvdWFNUlhsR2JoYnR6YWp4ekg2dWJiR2JpbXlZanRJVk5BZzNxNlJ4TS9BQjEvNEpoamt1d2ZPM0xEeW0zZWMxeklCRWlYTTM0bTc3Vm1EYjg1bDRWTkgzdUJ2T1R3MXZFZGRBVjVjelhxOHEzMHh4Qk1DKzdPNnIxWjZPZGtYUVZEWk1JY052Uk5ucENLN01MWHJBQzMwTlpKU0N6V21qaXgza2lEMVcwa2hyTERGd3dwVnNzWmdzZ1dKc1lBYXFOY25MNE16WWUvc1lCczk1NG82ZmlUTmZmTmp4dll4aThVRHBRY1BLd2RQTi8zSFVTZ2J3cXhhajhTMjhsUk5lS0hORGl3c0hqUmFHQ3htai9mSm04RVlhS09Oc3grY3lSbVJIUmhuWE9YT0lJOXRSa3FLRTdTUHAxU3lqY0R4VFlXZzlXVmF3eGFjc0FkWnJVK25NdzY1WjdVcll4VmprT295VzYzdWorbDJ0N1FvWFVCZ1pycjVlM1dFNDNyWjdJRE5FMlcxS1Fya1YvdFB1UWtDVXYwcDhXS1N1VUROQnBWZ1VMa1pTMzhGUkZMdy9vOWpZL3N3OHAxZFZmMkxtNGVqNHlqZ1JjcVY3aGo0NTBBeVpLNGZwMzRQOU43UzREaXBOTncxa2JiK3h2ekVhRGdFc1hGU29MYVdibXJ3RkIvMHpBaXRqejlxZDhYWUxURlVZUG93dGs3cFdhQWsxalRsTG9GSDE5NEhCS25yR2RTK3JNa3licHZVWDcycUwzblI4RWp3a05vK0oyYU1yVUhKNU4zUDZJbTVReFdDdkhISllyZTAwMVIvbFVVQ2FRazdYQmJESGNnQ3VnVTFra08zQUl1Q3RVN3p0NDYwQm5YVGRKNXNUdmhPZUFkN3NxR2crbW1RdnJmYlIySFE1N3V1ZnNiNURPL250YnBLbTJGZGcrMzA4SlFUWWFON1U2Q0FvNzYvWmNwVXRibFdBUlFheDRrRDhIUnVYSTF6NDIxWHgzcHpLQXJIdVNwR3FBYlZnaFd0anRXUUUrYzgyZE5xRFR1MHA5cGNEWGRCMEFPR1dGZHhNYVNncnI5ZDFoTUdUY2dLdnNMZjhidkJDN2lSMEEvbDJ1aXNEYktvR3F6OVQyaHFWMUh4L25JanJhTHZMaE84eWVPRmlvRC8xb3MxSjdNQ1EzVVRJQTVabHZucVZxdEZJRkkweERXNUZnWHZUam10cDl3WnMxbFZoYWljbWFsNWwrUURQZk0ydy95K0FRUUlCQUhjRnpMVVVFenU5Wkl3ZnpMK25tZHEzVWsvQkdNdVd3ckpHQ3F5MGEvRk1abEhDeXlYRFFMSThHd1M2emNIaDBLVU5IaEF3K3Flb1FPOGpFU09kVVNlRzBDQWtrVmtHSVhraWRsT1RyaGNXY2dMZmF5SStGN1V0K0JKdGFwS2xQZUR0RTRFOTVITnpnS0hEK2E1TG5BVXRFMGc0ZDdEdElobTJvKzZac3RmaVRHd2YwUU1CcGQrRFhkT1Y1dUd2MGdzdnBzL0x5Z2dzOUtqdkJFUW1xWFlnRENXd0Z5U1FUaGlxMDNOYmcrYVdIcGxqQTl4aUZnbGlmZENuNEdQQ1VkMXRRb2Qwek1RL0VuWmZQNUcrSVorLzduMUJlYWZac1ZhejNubDh6eTY3aG9ueUxaM0N4dkxpSzE2eXZ1ZzBOUG10ZG1CVFdTVStPUHV5b0d0OWRtcUtlNlF3NVlCaHVVMFJNU2VzKzJpVGFCcXFQcDZlaGdDeHBnUmExY3djcmJwcHhPL0I5MDdCUGkxbW9RaGtwU1c3dEdjbi9XVWl5QkJsQUFHU0FReHBNQkFqUllhM0hzQlptUU16c0VScHZQS2N6dlQwbHB3Mkp2bDZDQ3BvcWRocjl1ekNseXZXSGtmbXp4V1pNNEh0WlVFUWR0bHR5UjV2eXRmaFl4WjFlZGtGSFVJUlV5dElMVUFSd1pDU1ZRaG9lNE0wWGxKSTNNTGljMFY1eE12VDN3RUhnSS9lMFc4VlBGYlduZlg1QVEyOWJ4UXdDVmdUK3VKbjdYWml5MEVPY3M3bFVxTzVTeHZ6alJtV3U3YTdEdklIeGxTNjV5U1dHdGRFaTErR1lRSGJ3bW4rbjNJN1g1NUZpY2R1TlBTMUVBWVB4ODZ6MWZiREh2Z0FlUER1VnRnYWpsWFg2NklnODF2eWRIRkN5UHNjbGh5TCtkb0pJc0JuYTVDNkVhdEp2alF3Z1B5S1E3VzFhZHR3ZjdLSTM2VFFPUUNOMUZKclVGTkNKQTMzc3NnQmVBaWppalR3WVIyTzd2QnBnekZ5OU4zT3RSOU1nTjBSNEk0aVF1QUpDZDVYM1dVTzhOYStyQ0xjWkpBSElNVTg0VUZ1cXlDQXRSNko1Wm1tNk1iTFdDWjQzVzlmS2RxTUF3bk1YMDVodXFiUW5OV0owYU9Obmt2UmJqdEErUytGTllDek5YcXlML0VyODlnYlJ3dy94UU9Jc2hpOE11N0FNUm5VME5hVlRSbCswa1A2NTNUZi9haVY2SlhiZEdqY2pOUU9MQ3R6NVBkblBQZW1zQzBMeGpUNXNKcUJ0SC9kUXoxbEJpYTNVUmxFWlArS3VlS21mWHh2bXp0V2RBOGdtK2ZnSEk2VFBPTURCOS9NMGFNMGg1emdCcDFxRkZ0WllaeVlTWjdMY0M0dWtBd1czZDFJbjZ1TTIzODdBSVp6dHVhNWw1N1hRQ3ZvSnJ1N1V4WFcyYy91VG0ya3lSQTVXRG0zdDBjajFxV05UaHpUWlhxc01KWldFTUtLeUFzUWJaZVJIQ1hWcHpTQjlZQnlTaEhwNU13cUtEZlJjNkRVcFM2T1BYSi9sSWxSZXMwc0FWcloxUWFMOHlmc1RaOFRSQm11R2FDeDFRdXcvenc4cFNuNG9oMG0wdmZoRWdLZm1DdUoxYXpQc0tFN2JoQU9pNFI5ZlBvTmtYamhjQXJSejRTdzcvenhOSVFGSHZUeks2OERDbEdOYmRnTTZRcVlKcmdtN3RNUVFiZHJYNHUxRUYrem5UUGxLQkdDSk5sUDFpOEJNWU5EQ2xhaVVlVFMvQm8vUG40eE9ma29vL3prNTdVNjdzdkJnY0tBb01PVVVKRHp2MndEOUttL1UvbWdPeS9meVhaa3l0OHl2RnREdVdOSHltbnFqa2FZWmh3UTNPUEU4MWVsdjlET3lzZjEvNCswWUJNa0ZZQnExV2VvOHN5MHpNdmpnZmxTWDNIS1JvWGFZRTVQN1duTHB5Nm1BUVRSSkw3MkU4bjVZWE11RTRuRElZRHEwUW40bEpjOTAxUElwK0s5S0Jkd3MrdXIzNW9tZEhHVGpObnZRRHFSUFpIRk5nTjErcGt4SkNrdEhXNTg1c3dwRklqL0dQMUlGUXFMWkJHM1VZYjBvbGErQWRoYXZqNkRxK1BTWmdPWnV2UjE0TEdFcmhsTDJIb2NES0lXUUxkNFprQ3hkYmpxbjU5MlAxdHM4bUtBWThMajE0MDlMU3ArQ2lhendVemxVLzM3OG01andLM09ENXhTazFWWkVSbFNORHE0Y25MLzh5OEx5eTBtSmtYQ2s4WVlOU05wZ0ZDd1dHYVdMOWg5MzVMRXVnb1R3azFWcjhDOVJISDgrcGxYMk9yUmZ4eWFFZSsra0RuZUM0U3I1TTBXUFJYSkdwQW1ucERWTG1VRUt4K29qem16OS9iMjlSMGRoM2hJRHBUU3hpd09sNFFVSHFzWk5Mc001OE45cjQ5VVdZUXRTOHJrTVg0SHJ3a1NTZnVZM084bjVpaFBUbDNRSEdudHpGTjdyQ2RmUkt3aDFXbFJTS0NaMzA1cDMxZUdQbzhkdUZ6V3NFRC9DT0FkK1JrVXQxY3NPK3JsdjdVMU8zTzd6Uk5EUmo0Y2krWG5TSUFFY1p4RVI3aXVzTDhUVDhFQm4rbUo3aTl1WCtad2RqaU94MmFUVUQxTmdxcWNMS0ZYWGI3OVVXZ2lEUUFHWnozZm9mdGFTTWlCdXcvanJtbVYyOXlKdWZOWWI3ZC9sOURxRkJzTjF3eUZaUEVWSlZ1WEo0L3FKSWNkdVo3ajVORGdNbjl1dEo3aFJMQW9DbFJsMU1idDgvUTV0bE1NTDA1T08rR1puaDJ1REN4Q25FQkpLdVdMWjVxSnBwbHo5STZtVHpON0hIQUhWdlZuOHExU1VEVHE1akowQnZsdHFyOHowTjRvVHA4ZGRDSERJZzZwS0R0VFI3ZDl0SHhEMHF1MnBiM3ZDZXZLdG5WL0NoMUV4ZjJteDB5Z2lNZCt0YStHSWw5Y2M2SHBzSk5MczVWUlNBWEd1V0RLbnFjSnA0Z3NFZkk3YUgxbEJoSXRrY2NYYlN4WklNTTVNK3Q4RmV5dUkwbHAyK2pqQkhXVDRWbituT2ZkRVd2K0M4YWRFaUdhdWtoVFJzVi9KNU9uZjdWWFV1L1I4UUxwZkZBYWFhNnpkOHFVNVBkeXFSR3lmaDhVdWI2cUVBWHdxaEFiZkZHdEZsZGdTZ2pZTW1UUDFnL0RrUWVqRitXK3hPVGszT3hXclhzbnE2VkJnRXhkM3l1UHZlcUpsOEVPUDZqMWhwODJuTXBmREw4UExDaEt5OTJEUE4yVUJuTzh6dlRYU3BURGFoRVk2UFZ6M1dmblRPUXA4U1RJdWt2bkZoa1o5Y25QaTRKSXBreHNWT0U3QlZtV0tvbWpHRTUxOXk0RVMzbnJJN3lyTSs3L00vdE9xa3IvZmJSdmRkNmdtaklBREJSYzhjRTMvSmQ2QnR1Y2FnaGtzNE1iQmJDSzBCYWFWanRKdGQyOCtNeGM3bWRIbUV1Tmw2bmZ1L2Z5U20welluTFlXWUMzelI0OG8zNTdiNDhHSWlkU3JpT1dMazJIcUJzRHYyRUJFY3B2SWptRWM5cmhxekxPVE0vd3VIZ2FVWHF1RlVrOTV4eTNVR2NSZlFCL0lDM0hVY0Q5cTYvaDIyUkdtVFlnb0ZjQ1E3R1ZlajhEeUgvQkJJUENPam9WT1NHVHUvSEdoalpBWDBja0xtVXV5UG1LQUJzMHk4OXViL2ZOT1RaTXNpTXhMMlFvbVZPdndkYmhXR0R4N2VmQVFsclArUzNVY1pldWhpRW4vUzBxZ3ZUZGJ1MWRaS3huU0F0cFhiM3U2QmJ0STZQdU1EKy9SQTVvcXNqRWYyRVFFenQ2a1pUOWdyMDJVeWRncTY5MG9rWkkwMG9xd3JxOWNXWERZVjE2TjJRelBiWUlGNWR0RHFWUlgrQ3VEdllRUmZBMVFmRVRaSW8xSkJxSnNHT1RtMjVkcTY4bFB6bXBaQ2lmTmVEb3R1UThQY2kyREtFVkJ6VkdSOE9RNHRjYW1xRVI3bWx4dnR1a0Z5RlVLbFVwNW9LcUlkN2REcUtmSlBHWFNaMXY4RlhuU2FSdCtsajA2WHd0bEl4Q0lldXF3bGE0dHNlWlR0R3pST1haeWpTdTFjMEJoZlNzSnl4UU8va3UxQnNKU1dZays5ZW01SUNsRHRaQ2cvU3VxWWdrTWxpbEhidzY3R2JrOUpJUHhGVDgxdytub2hGbHRTL0R1QnVqQnRNdDFUMCszMy9GRjdReVFJTmZHaGg4OG5LbHRlOTc1N3NTaFYxMklhRWY3Y1FlYWRWOSswTWJHU2VtSlhUczdOVkh1aTJKc3haNlBMVnpQNitJWXZ5T3NmcENZeDE2dU9ra3lvTU5GK2lUL0wwSysrMUs5NEtDdE9KU3lJWTZ6TTQyWWFNOVpDZXhVb0lPNVFXVTA1RTZFU3crYkJpS2prenVkWUdiQlNvNGZSa1VXZWN5QkpjZHo2Tnp6ckNsaWpSZDBtcG1pbUZqOXo2TlBSRUY2UHhqRzllNUdkRW5XYWtDTzVyWUY2RUJtMHR2SDczMk5NU3RLc1JDN3pLV1FCVWNlSHFrRERMUjd5ZjhlbmRQV1A5aFRBSG44Uy9uN1E3UGxrMFY5N0h0YXJUampES2lDR1V5a0gwbWVYK1ZVK0JkVWNkcnlpQ1FXZFh4Z3E5SXZZYW9qaDZpU0Noa0VsUU9hYmwyR2xIMTdCWmIrd2tSYW85T0pkYStEOFA0Zkp5UjluMndTajg1Sk9lelhMem5MYjl6b0t5RGQvTVZJaEhpZHY0amNFaW5tdExNamg3Rm5NeFFNNkRUdmFZdlduaG1reSsyall3R1VCbFIweFBnZWNyUGJHTjM4NkdnSGR3bi9CcE9raFE1MjFwcEordFlVK09QM2UvOVVSdnI2SS9MRHhPbDVscG5MQ0U0MzZFUS9CdTIwY2poSlRpSXNiZnN5VHU4RUdZM3UxQnZlYTFYbTZjanZZTVFOOFpTVG1ONVUxU0ZhbjE4YzIyMkVnblZHNitGVWUySHlBNk1kZ1dnSi9Tb090MHBHTnVpVXBSdXlnWjQ0TGlDVWs5L1FQNVhqU09lbG1Hc1VScGJ1RWZZOXEzWldhelNoZExjVEtIYit3cldKNTl6MGxGMEZ4bmxlVjlEWjJSNWlWNUo3OEpEaDFXWWRCY29lZTVvMTMrbmpjV3JvUnVzQmdqQ1FZMHFIRUJoSnphZkQ3c05OTVU4OTVNbDdlSGQ4djZuN2VnbVhQNVg1UysxN3ZWeGFrTzVET09XdEpXMXpPcC90Nkg3WU1QbWZNUWNOTENUSThKTkwveTNyWnBCZjF2aS90ZW5jVjVOWUZReEZwUXI1c1p0YXloMVU4NkVpSm96Y09pNFk4MFJQL0NjMXZDUjhxOTNuZ2dRWWNBRVBCVytjNnhMa2FySmgyQ2N4N2h4c3E4c09NZ0JYdHREL1hQcis4NUFHeHZZOElzUzlReVNxVDczZExab0F0dlFhYU5TS0hFUEdxL2ZNYXd2RkM3OVVHNVpiUGJaOVhNRnl0bklwS3ptOEdMdVNXNHVNQkh2aHVmSy9LWkpnYW1idVBteGQwa3ExUmxQUXBnUStPTDkvZ3Rad0c4bTk4VEhmamUvcHcrZ1JveCtHU2h0L2RxdFFxMjFybE5kOG10QTlqb3dmWGlXTG5idmV1VHQ4M3RrOElhRzNVNGZrOWRyTGJ0Z0tvVUZseklxb0JQZWpUaWVhdmdFcWdtOHBwaFFISytEYW9rQXNNcTNSSGMzZGFoa0pPSCtlWjZaTHlUMVJlQStta3FUeXBuVE80VWU5VmoyMHBWYlRQOXpVdVhlNTBDa1Z2dWhoYTM5dFcwY2hXbXVFNGZXc3F2NkZoa2R0aG1YU1lxYXFMaHlXNlJwc1E1aGZKUmNGaTFwVXhZcGJ6cVljM3BKbE9SR1F1RTdjZ2hLUzZRdEt3SG5kZlhjNk1yU0Z4anluaXZHTWhtcWswSmNkOWtVZlFvMEErZTBiMnBlN0hOZ252Tm1Ob3Zad3dPVUJkbEJ0bWpvelZHOE9UUTJZWWF5YnRPK242ZlRiUTVUWWxja0hyUmYycnAvb1ZiSEJhbHUxTGdIb1FrMXBMNWhGSWhYaVhnbEJ5NXRPczR1MExHWkhFcFNUUEllUWZPNWI5OHNJNWlHa1VKSEJXbTB1alRBVi9IRE92b1IwdTRXVERvVUx5OFk1WG9yb3ZaQlVaMTVLTnpoa2VjL2R2VllkUFc3Y1ZoNVRmV0N6ZkZvU0ZLNk52SS9aSUZLVHg2bzFTWlc4ZFUwZHFsbmVKTVVMcU5tSkxjVkVQTjBPL3AzMmhKV1E1TVFqaVFTalJZN1lLRytYdFFRNzNHMmF4ZmxmZWpZdFhGMFh4L2d2YjVpRnRIdmdpczRUQXBEQkdmM2ZzdDQ2TURiRUVYYUR6VnNOenFGaDVZZExsdXpUVk85U2Q1S0s1VU1vYm9ubi9uL2VPVzI2Tnc5VUJJVGR4TkE5NDF1Y21vYXhwb1QxRkhpOE9IODBpK2gwS2tSNFVqSTZpdjlvR0xNMTIzaVIwNW8xb2JhSXlVU3g5K3R5OVpWbm5jdVdmWWgrc2gyU25NeGZWaEVJZEd5OXo2b0FYSlBLOFlHVS9UU3BEb2dtSk9mZi9QSnFJQWtwNmlqZC9Xc2NnRW9vZXNPbmFMOVZXUUxOZklJN1Y5L1BLSG1GMXdwN0RRMGJFSk1qaVRGZ1lBZy9QZUNNQWxwZlVNeGZzRFNQdkYxRk9tZjkwTnRvczBlcmRVTWdnMHUwV2dVK1NvUkM3Q2dIcE5iRVluM2hqWE1SQmJMVXJ0d1huQzBOQk9CdncxQzdmSCtVV1NGT0oyamNhUGVHVEFJeE96WFFjcDFuNTFsT1JuTTlLUm9hbm5hWUpFcXFnYmtBdGNZdUZCbTd4OWZRL3VycHJMbHZ2b0Q2Q01ES2toVkN3TlRRbTNFdXdaY2RGV2ZXQ0o2djQ1RUVaTWZ5MFpUTHpxcVU5cUc3TnBLM1JPbGtmRUVxOG1wYWh5S0VLdVBrUEJTaExsMndac0d2WklHYWU5ampneFZZdnU4SUt1bWo0N29kRWNVUFpJeldTa2V6UWF4b2huSGNoWVpCczNpQlRXOWZQZE1wTHQxSmhzOFVpbkRzWjRqL1BIVUdGZE9NejJMaGExdENqRG9QTzV6b3htR3dIbVZiaTdnWCt0Q3hJYU5CU0xBelNpNHpPVXlTeE9lY09qc1pUT1pSM3RvU1FQZ1A5WUpsT2xiWlZCc0NFaEJJb1QzR1J2OGh3bHNYbDVqWG0xQmlIK3IvTDZwcFNTOElMeFZVTEdFU3lGKzVEQ2tvdmhld3N0cjQ3dDRQR25BS0tRVTJMK25DbTQ4cUdybGhaVXdJcmNXUWZsemZkREZaamhZclFBVzJiWmc0WWhoQ3hnUjBNY2d2a2dqQU5ZTjZQWjdNdnVRRm5aNElZWm5IZkF4Y09CODFCUmJoUDhaTVZibXA1QkE5NUx6enRwWTlMTjFUTkNGV2pFK1lUU1hhV25UU0pjUHorZm1wUGVGU004VFNUQ3lYRzl2dDl5K0l4eUVjUW9QWmpnZFpOY0hKN05RY3o4UmE1SWgvV1NhblhKYTZxOXYxRkwyVVJIRXZwUVJvVElwQlNPelMwSzRwTlNUaFg0THU1SzJXZjVJcUtjSkEyRGkzVnNVdmVwK0M0VWxsckFpZlZHOXdSUWZ6STg1aTZyYnBQbFQ0M0lIZFFiWFNJcmZvQ0JBenkrL0w1Y1JSa2ZDTWpRWW9NSnZBbU1TK0tMNzJTdDl1LzNZZWdDZUZnOWpPVFJHeDN6ODFGcUxhTWlqSHVOeWxwaUN0aWZNaXFHcm8vQUdQWFhueU9NRnZqSkFCTHRTK01sUkJtRWtISUtUeEV0Q0RPL2MvTDBRbmNxOGtlMzlCUXlBeU5XSUpzbW14cGliaURXL0dKOHdRQndIRTN3UTZVVkcvY2VXVUNELzVoWEcyMHN4SW5oN2pzK3d1K2xwMW5VekM5bm0raTVCMVNhdzg3TDAyUTM5c09iRE80dHlKVTlNTHQ4U2tDU3RQMGNZVmtIT1JaSUxOWW1GWVlNcFdxUEFETVg0WTRHODlFdFN2VW9mN0ZmOEVxUExYMThHYlNpVmJiUmhGQkZPMWNTWGxYSk82c0NyVHppYndCRG1OK05YQ1VDVFp0bE9XYmpmcUQ2SmNnM0M4aXhHTjluR3prcDAzbHhuWGI4anFtcVRTYTJRMnYvbkkzNE1JWkhsVmhyaEcrNmd1QVNZN0twZTJPMGdGVzhZNzVTVFB1OE12Y1RNM2xBSHV0WVFMdG5vN2FyOFlNZFJHeTVzd1l2cklHNmtxbjBudmdEdmM4QkFXclVaTzVOOTYwQlMxUFBmeUprZHRxUDNiemNyOUpNaUpoYk1Uc25OYUZZUXluQk5mNDNhMlRwTjh1bVdEaVZwbU1TdzhXRkl6NHBFTXJSbFhaTEFPU3ZldzBQemd0STJjVDV6dFA4NUViUFNvOUF1cGZyUUF6REFLVWJhWUNlTEQ4aG4yWWhQcGJXaXE2ZTBuR2pheVl0SDRROUNkNUZRY2oyRXRRcUxEMU5HTDZtN0tnS2hJOHNMZjU3T1QxQkV0c3gyK0NLMmlZY3FyNkJXYUVNMTkzTWE5V3JrNS9JUkhORExFK0E4MDJqTE8wQUZMUmVBU1ZZV0d5aytuYldoSlEvRFJpdWtUWXFCdllZdzEzUWxuOWtYUVgyczBxWllwU09xTm1ZNy9WaVRPbnluRXZ4NFhLYkMxbTllQk5GejliamdtSTVyNlhac3hoWHFxSk1JTzhhUEJNNzd2MERUVUFyQzBjalVINnBIc29kczlENlhFZ203OW9VY1ZPbEdMclppR3pRbXhEcUQzeTVMVW9Ec1NyOFlxV2V3ZmZpOWxFVDZsWDBhSFRWRGZXbjNnSThLeUJWRW5TU0x3SHQ2WWp5Z0twM3F4blBmNGZjb2hoR1dBL0FPcFJudEJidWJhcWxodjJ5SE5QdEE3OUdlR05INHBKYmtxc1VFeWdhdTd3Yk93UjBPTFV4TlZiZmdYOXVDV2xVa0EvY1ZQcmxVOHR0TTBzaDBuVFFvMENaR2FwcDZXQlErcjh4d1N3VkdHVTRXQVJoSE5pZWg5K25WUjNWL0tKS2lsQ3p0aGUrd0dzNjR5dDMxS3ZTK0pyd2JBbEt0VVM4WG94M09jeVJUZGI2MXM3a0ppYjJZVzI5MEJUelk5cCtxQmZFUk1iU2drT2JHS3BkTUduUmVmMWsrMCswNENpcVgrbGNIZlYvZEU2a09EUXZGL1JyQXpnVzVPUWJmTTB1WDZFdUc3YzFvT2M1UDJFMlUyOTJvN1cwb3FQTUpjTWE2S296cFdDZWxjVE9NM0dnVkF1NDNpVGpOS1RTNkRtOHdIbGJwdjRNY1gvckJsdFltVVprNlhNanRnYWpRQXcvMWgrZjRYazYwQ2N5c29ZaW5ZQ3M0c0xjT1p0VlFwRUY1RWdHeXVvZk8rN2locmR3YWVDR2FjTmpid2NNQzAyTm5lVDhNOW05cVd0WWhjKzNReEY1RThGbm8zcGJ5WHg5UmF0MmZ5eFpWaWM2aTZEczdXVGFIYnZ2VWZ0bW5oR0lIam1IUnRMYk9wYlo2TDM1cVlucU9STGhFbEg5Rk5JL1VOcVZqeUJsNWltSmQ0WXpvcW5PNzFkaGQvaWJKRy8wQTBRK3cyNTVyNitXeW1rVDByb3ZkeVhvTTF3ckRnVVR4NVZYSGVGK3MvcjNiY29SK3k5d3pOOUxQZ3VCa2dvV3d5S2FXcXJaVit1MVNLcEliVDFoWkRlcEU0SmZrbWFrMHBYVVhURnpwWjRZYzh0VGFXMlhVcXZraFFzQktYYTBBZmlJTHlCQ0c0ZGo2ZHNOdEw0RmtxQy9YZ3pBNTRESlFhelNlNE9UTnpCNGhJWVhwcS9KMVJsSjFmSW1yY3JLMWNUMWR6azFldVVoOU80ZVFEU1BIZWtzRkpkRGYzRUpDeEpzSmZIYUdOMWZTU2VOcEpvQlFra05GODVBRUs5WlJaWDFqUVBOeENyWFgyZW41aklhVlRpekY3bEJwSk1oQUVvTHZRbllnNXNPdFVtbzVUZm1wTkdXaUFDdmFwWmJ2c1ZDaWFWWTlWaWM4OGpPMzd1c1dCeTRaRnRwQzVrWnlac2l5QWxkRi9QL0J2bWtMdmRITWZHYksxMHpHZ2Fna2lJUWxlQ0lvVXhDYm9tbGZkU3ZTMERCRU81N0NvcVlhc3Bzam5xT0tFbmNOc2VjdzRtRU92WkpJOU5VbitRblVJVWxGcUFBNml1UlVxSEc1eEpZdlF6M3liT0w1eGxRTFdBYU9hV0N1YjE2TVRDUlBhOW5KcGxtbnhiVmxEMGpRMGozSFc2dmFGQ3Y4RmhaOERKd3E4MTZFckJ4THBaVDZIZ25PSWl5ZTlwU3NsbmpZbXdhdVlVdDlrNGRMZ1ZLSjhqRE8vSGMxcE1lMW1ocFZMeUNPZ2FwZ01oRzN1ZkcveXZoM0RYbVkzWU5sK3VmUHNmZkdXUVB5a0d4alNNcGJXaGQ0dXh4d095RWcvOE53bzVwMzlZWjUva3lXV0NPNFJ0Z21IdVg4bGlaRjcvR2FJK0VqWW9OOEpjRjJYSjI5Ym9nem52ZDU5aERpRmx5OHhJZUFEVG5DTkdkajBydUxKcGVuQ1d5R0hwY0E3SEhET0dHUFZ1bXVQSEEyVzg2VHhVYWtmdWtDYmxiUUpzUjl0OFduZzBmK0ExTzc1VWp4TitGSjZ3K1FndEdBd05zK3NhVzdKemNwdit2ckhSY3NYRUVHUDZkMEoyZ1FhS0g2T2hEcGU3QVF6bHJUUkxMWTZ2eEs4S0FXR21EL0VDNktYd3Jod0M5Szg5am9pZVJkTFduN2xaTUcxbm5oQTNtWWMveEt0eThqdytzdk1sMTFNdkdQaFd6T0lldEFuanV2aE00OTlOKzZxcWIyUUJBVWtUbjluZ1loUVE4cjhtS3dya0VBb3l5eXk4N1VYcHpKalZJUFVkelhkM0lUQ1BKOXU4c1RWajgvcDNhQXlNaEVXL3lsU1c5R2tOREdMc1JPQ2lOT3FvUjUwaEVncWtpbTl4Y3V5ZmNDRUpMak1mRkV1QkJCcGs3bW1IRXVHbW9mWXBaOFdSRVRNNXkvOWRsM1VTdjdKWDVYNWdXLzNJTmkrYmRReW1jWWtNVkN1SGU3QzBUeU0wdTVPcmRFeC8zQjF4cHEzVXk1NTBoVGJsMHl3cnI5RmVDTllTUnlMemZxR2pBNUpmQmh3dENTMnpOWnltS2ZURHpQcktPRk5aREJTVXo0bWpYNlVIWE5Weit4UitKMEw2Q1hnVFpTYjBwcUNDL2RXd2IwUVIrSU4rSUJOV0I1TjBML3JLZzZTU3JJR21zalI3TEozU3N1cmsvUFlDSmo2U0ZjZ0RmYm1hRW1Ld2tITE9wRU5VQ2x3aVpNSzdsUXZYWTdsNmpnNWFNNVhoR0FwWWZ0ZWFkUHhVMW50cmtpQmdTS1ZaTUJqTjArdWpVUisvWVZ0YTlsUWdINktPMm9YaUREb241THhjNHIyMGZTWk1wVmExekJETlJpNTFmZm5GTEhidXBWLy94Y0hUZjlrRHhLd2o3VUM0OXRPUFdHSlB4NEtsRGdNdFduSGpsWm95L1JMVGVNWXp5L0IySnJUWDBOb1pTZDJoenFGQVlzZzFRV1dDcERoQVo0UXhXS1JxdUdLRVdlby9NUGduQnA3UmxIVm1ZOXBiU2dkNlBTR3o5Vml1dkc2K3dSYTVDUllCWEdBVWoxVHAyOHBrSTl1QXhmZmszTVVUYkx4TW9TSk4xeUI1dFZuUkZwVzd2TVU4OUFTTFU1SWJVaVVjczhNOE1sOGVaTG5QdE1qSTRSWW1ZWmlYN1duN0hmWGN6aDF1RnNrbTdZTmpjOFExcGRMTGtoSThjSVpzUnZTVUtEeFVvMHhieDdoOXBMRlVvSkFqY3dsQllpNFBxNmVYb2ZTOE5sS21LbkNqNk0wbktVaElBTks5MUVoUWdJNUppRVhtcUl4aDdvaENjWEIveGp1OTZESEdrV3JiRHd1US9WeG80L3hZb0JoVjc0U1ZaMUFhblZFTEJIYkc3ZEZoNDBGSGJ4Ym9BUS9wYU5sb0tSWHcydUVhQWhKYktFWlVNSzR0b240a2ZkMWpWTVlHYklEc0ZtS1ZhQ2VwM3IzZUlXdXhiMG1ncHJtUVZNT1c4WE51eUE4Qk5pbEhKTGNjTnZDcmtocGVSU2t1dDA1NWlIcmhUSkV3RXMxbndtRG84K054MG9FK21UQlBHaVJuUlJiazhqNHZJQTNUWGs0cXJ6QTg3M3BoMHR3bk5UUU5ha1k1bWhFVkVuSEdiT3FtZm9qRm9JSEZNdHA4eUxROE5US2N5MDNWRU42c1h5aFh1TTlsTExMSTNreklJRmpmU2N2UW5TeldqOS9yZFB4ZnY2Z3ptblFTalJJNCtxYnBieE53c1lSMFFTRFFZc3liMUp1ZUt5MEFEQVBkRG5MWWQxbzFWcDBrVGFGWFFBZ1RYd0YxMnlhdjBwRjNBTmQ0YVFCL21KNE9FWWdMQ1ZiZC9EM1paT285U050TkNBa3gydzFWTWJCL09PbllzRmJsWnlBNUtqZ3I0eUtITVhaS1VmOGttZjNBK1l4NGxERDh0OWxnYmh4bUFWZ2xvbFFkTzFPWldqTEJWYko3alRIVFVpY2hFYTc1SHlhWXRjNDJqQlZiWTNwSW41akxPMTBEWGoyUUJwRWJkK1dDVjNGVmtuTFVpSUVMZVFGV1hoQWJNMHVUL2srZGt6bS93REkra05xVlZPVDAyd3dUT0lURnhLTWNUMDA2em5WOEdlTTViNndaQnVwcldXQm9yQ0gwRU96eEdYN0dRczc4NDNJRm0ySjJ6amZOZVZoNkhKVk5vZmM5TTdCeTRMUXBncVdSUE92d2h5dkNob21lSmZYNU5PdURqVkJjVWRTQ3AzMFJVVU1oTjZUeTVWRmloYkEzU1V1ZzBmVDVkNnM2TVdLMjZyMVVYeHl0T0tUV2oxNDdxeU0yOVNmT21HNEtDWHlVdWdFMU5Hd0tJNEtib09mRVJHTm5TUnkyNDVEdS84Y2xTVTBvbG1vMjFhT3NLWjg3L1kvK2MxUDR4bnQ5TWVQSUpIZUFkTU1PblhkNnNST1FXZmpyZE9NaXRPVzdMdkxjK1hYNXA5VDVYQm9DQ1o5Zlp5aFZUcHUrbmZaakpNbHlrY0Nid2N6N1g3ZklpL2l3K044SVl6TjJvUXFvdFdXek5mWGNaclZYV0paRTlXT2Nqc0t2YW9ReFg1cDdZY0t4dGpVVDVXdnJ1K0pkenJYbVBYZWppcDhTd2svVDVnS0RkSDBNMlJ1YnZ5MHZDWFFLLzQ5WDI4US9KTHZobGwrQURzUFNzUWVXMHVXamNHUXFzZXd5TXBZbnVKQ2lsSkFtL2NySGN1c1JKa3Urak1DU3dxeUJHQk9aL1BBQmk4R0FlbEVUK1VpMG4vaXc0aTF2WWFrNzR5SDc1eVVGUWNXci85MGFVK0tiMWZyY3o4Z1pjRjFlUkhwaWRkdlAwTDlkNVowc25BVVdMZHcyckRqT2VEMHM4MGxrN1h6Rm5WeG42UEh1Y0lwcWphQTdSa2h3cXFMUTVYajRaWUxHYzRLWGZEU2w5WVdRRHZOb0pXWHcxS2VNUlZsbHJ5dWJSbUdqcHVHSm5ncU0zdGYvVHluczdoUVpkSkIwMlZmNUJibTRqMHVzUHVSZVp2azFwNDJsSGVHQ1RJUmxVWnBEV08xanBEb2lRRWtteDkxT2VXNCt4M2t5VjcweTVhTTE1Wmp1RS9FbmRyVnZnZmtML3cvbVBlU2JVQ3B0UnpuQWhRdFVVRWtYaG8xMjNNbmNyalA2OEk1aXF6STFqQkNmNWZjZ1diUVpISktKZnQ1Q01DQlpCbFNFZDc1SVl4bktGRG9HWW92a2tLZFlHQ0Jlc3VmNkQ5NlhJRXd2cTFlR3BjMVRWRTAvaWp4UDdTZUlWemhTSUdVcXUrbWFkb0pJd0FKMmFydEQzR2FEN0Y4aGY5YzVxOFljWVpER3g5aXBGMnJTRXE2WTltbVdYRlRsRm14cVAyT0xmbk5odkdjQVlJUDk5WTlwVVRjeUp5cTRvdU91akVtS2hZWHQ2SnE0WlFRRk9meWU4YWlTUUhIMDJPMkRJanVzQ2RTRG1uM1JWUVVFNndPeDJRaFdSK25ycW45d2NRUm1seXM2YUtBKy85cFQxU2l0QlRXVkROUmNRdEkxM1ZQUmNvZVYySWVYWFhSZkVmTjdFay9HT0VYblAyMVV3MjNNWEQ5ZmkyVDVydXl0UnloNGVRc1V4T051MVc0dkVydnJ0ckRZQXREVzhpRmxOMGxVZllTdU51dmk3RktscGVOR2tlTTBpOFprQTRITnhUVGlZRHFPTEFhaGhMYTh1MVk5STEyUCtmNjBYWWhpaVZBcFJwNDMvOWpRN0FlcWNBd1lHY0x5cFBMcGYyOXE2SjR1REVEOHI3V2JvTkgxOGtkVGZiemtDa3loK1I0U3VrajRvb3k2eUdLN0Ztckg3NXNzQlI4STNzeDFkZUpXUnQvT25jSmFmOHBpK3lBZXVFdXQwVUN6VXk2YWZQM2pmemUzbUJDMDIzdDA1NFI2NG54S1ZYTXVLd01UUTNld2RXUGdtRU9SWHFmRVNVWFZwcnJFK0pMOWZQdStSMlBFamtBL2ZEbDRSOGI2enpZc3h3ZU5nQThmd3JEaS80YTNCQis2UnFCWkFYM0MzMXJYWnQ2cExESjROODI1bkg3dUI2VUJQZHQ0TzhwbEhYanorN1liR2tJSHBaUjRRZi9FR3ZMVVBjVHR5TDYyUnJwdkRaTEpsZmllWXJMM25pTFZTOTFUWCs2bHZ0VHlaR2ZJN0gzaGtCNlBzaldNeEZhcGk2NXFxYzJMVW5DemN2WFJCOXhjZTV0em5qZGRhM0hXTHA4bEFyblpucWl3bUp4Y0VXSytqd3Ywc2VLcWRCWXpvZVcvYmMzOW9LQkwydXB3MTYveTNEUjRZak5Td2s5MkRQU1Yxcmo1Y0RMcjRRb1dlNG1OVXRIbW5WdXFwOC9JcE52RjVYbk5DSGFFZndHOEE3OXJnMlJNdnhpYXRzMDJ5Vi90S21hTEVIclhMcFc4WnFTUGU3S0tNQ01OUmFHSmVqS0lERG5jOWFkNWlmRDc2N0czTWRXQVBCVzhxb2lPd2d0NVRiUlVLQnhmMUhVcTFtekdLc0V1Mk1NNGV3WmI4MzZvRU5yaHozRnlRWEJvYzJxc0tveDhERDBweFdVZHh0RHk5QVV3dE1ETDBSWDRtdnVDVlMvV2NUQmJ6Y3Fxd1orMjlWV3ZmaGRvVXFXWUpSSVNGQ3RJSG9aV0RKczFrYTV5dnZBVUJiRE4wdVVySkdUdmlvVkJxbjFVWkxDSFBKa1l0RkxQVklIU1lxcDQ4OGo5RC9JU1pDUzRRM241VXpaYXk2S3NKNjIvZ3I1WDhIcHcwSkFYd3lsclZkVGVvM0ZQUmd0eWtnWlpucGIyNGlMSkRndkxhQ1BMYXhXdXBPeHVqT0htNnhQSlhiL1hvazRqeWZtL05aekErRXJwK3FXVjlFRmdkSWdOVFp1S0NqVUd6UGc1Q0pmVmtvbDZjSkRoU200QUhidlVkVmtkRmcxVm5WNUJ3TlRmY1NhZEJxZVBMZlVUcXRoOEpRRmtoWTZ5VDh0ekZoTU12eUJWRndsYmlXQTJ5V21mTjlCanhYTHBTRmQ4Szg2THdUR1Eyd3JUUW1jUDRzRGZncHM5ZHNRUXh5ekpPWVk3UmV0SW5VZjExM3NkcktpZlBMY2xSRGZvY3RKUVpPMGZBWm1JME5tVm1SQjJYT0ZKU1pFQzhETC9GbXR6SHhXdis1dWpIcDBlVlovbGpGZHBobkxEOWpDWUFzVjZINWQyeVhVd2hsNkE5QzhhRWZGaDJmTC9kKzEwQ2RCWUNBSVNTZlloc0FrdU5GaHJwZ3p2cktFK0ZDVlRyVldSVGR2akdoeGd5RnhuUllNbnc0S2pPUGJUTlhJQmZ5aGNoWFRVR0xqc0dtY1QyY3dVSHdjVGNyVkR2WElLeG5oRFVSUHU4S2cveXE1d2x4ZHBjODVBR2tRWHJqazREZHozYlpkZG1DY2NNckJvUm83c3ZybmpiS0h2UnNLM2REVDhtSTNDTEJsL3h2YzFWcU5BTFBhbEVNN2htWmJIRXdMUDNGMXpKbUh3WkpYdXdWKzdxdXNzSGkxcUxHNXZ4VGgwQ3R5ZEh1aU1HaThIcldOK05hWWplM0ZaVDhZUjFuQ0pXL1BQMkgwTGt2THZvZjdqeU1kUllxUFNOQmp1WG5GZkRvZWJlRFFlL2NkckdiY1ZXZHFFd20rQ3Z0NzUvME53eTRSMDhYZnhFUkNpMS80ckUrZExnZkgzM0lvOFlIQjVKMXJXVlhmdkV3TFhzUXJCMm5NTGllYkc1Kzd1Y3VyZkZoR1UrSGpOUW10UmF1ejZXYTMzbGptRVQ3aW01VXJFeGxtVkxuNUZJdE9TNmttcGJiZDBZN3hWUXFqNnhkRFNYN2dEVjkxMEV1cXY0Z1Z4L1k0cDNZY0lJTjFIdkNmbTJYY3hMeGVLTnZ0NDVBc0tWRjZSTFdIT3lnNyttbVVzalVtZUlweHFySGdOcG9QblZ2bGFIcHlWU2k4VGR2M1Y2KzQ1SmZjanJUanFDUC9DcnJBMXdkMXdBNVhFYlc5cElRVGt3SjJQMWlSdHJYTlFyMG5hUHZhM20yZTlNdGpXOHpmdHllMkUrbWRxOTV1VU1QOHJreGQ4SkNlRVVzVjRCak5mVFcwaFRrRG01OE5RV3duUm41U0lTcEErOGZMK2JWcWNYWm8yaEhQbEdPREpGQ2dYZGhFUXJRL0pZTkI2MS84NFdTYWo5djIyYjJXTzBvK1pwMU51eWpHbUZoUklxTzJteXJFdUdLUGZJOVpYRDJ5SVc1Q283WWVYYXZycnFaTXRvaERSMjNLME1QWFNLaGZaNnFMY1FqM25yUm15VUt2aWZIcTFWdSs0RnI1TllYTXdHMjhQc3ZVMEpyamxMNE11ZmQ2MUpQQXVEOU9WQjBza3lzSGpHeE1sZ0pmaUtPcjdBYWNEOVc1a1NrU0g1cGZJcjYvTVNXb2V0MFY1b0FGNG4yWjdrMWlHU3ZsalBKTHJPV2FiVWx5ckJKZmhkSXNtNmFUUlA3dWE1eEpKS1NScWdUSTQzaE9yN1BmanY0dElpWUU3VTlxSVA3bzNhK25KaEZyOHhEUXpkeSt0OVg1Z3J1MkdGYldnb0Y5Qk0zZG5hRTdQSFhjVVBwTGNpZU9NVStvT21GbExubHZ6Vzd2Q2Z5NTlvYVRCcTJMN2w2Y29RT29mUXA3ZCs2L1JYWmowUXpDaUFhb1ZlVnV6NUdVdWUzaG52U1Bhblozd2NhUVJCejdSdjJJMVRMVjRKeWVoWHlWSEZoMFM5YVF5My9XUHpFblp4dm1mM1BqNm9uTHJuRDVuL3lmdGpCZ24raXJBSVQxY1o1MTdweXFaRzVrNUpXMzMwaXJpMzlGYUN5TGdMZ2FBanVacGdsYU9CN0wvUitoN3pyWWt6OUZRSVRzRXY4d0s5TkswMm9IZlpiRTF1cmxwbEl3VSs3QmkrRkRaMmVnbWp3anNNZ05VQUlQVU9xeTFISGozTkovWWVybldDd3lkVGJjWFFQdWtBWTFMaXhUV3BaNmNzdVBMajR2ajNHU2p5c3VLNHQxRUlvQ3NjRUE5bjlzYkp6UXhlcSttR0tyT05LQ3UzcE9Ta2VUK2l4TTd2bUxjR0JaQTYyZVd0T0xRWVNpa3lpcVJKcXVJK3RrWEc3eHdPbVJIN0FzQzF3ZW00K3B6anFGaDd4bzZpK0hiWDlDN0xWa0kvQmJNby93M2ZnamtVbmJIaWVjOW9MNk9lSHVEbHhaQ1ZPTVpOYzdBOG1SeFVnLytjWGpMdkVzeTBtVEpmNnczeEhFUlRVL0EvdnN3a3ZCTlIyQ29XK09Va3h3eUtRZUV3RzFhMkRjWXVnU0VRck5hUFRMSjZSMmF3b1NBNkZmTjh3OTcwQVVBMTZxOGZkemVqaWZqYXlqeWx4TjFHTWZvcUNvVzBvK0tEaXpZRStnVUF4a2dEWVNvaktreThneUtUNVF2ZzlsYjNtS3I2V1p2b1ZhSTNxY1NlamhXWjAyVXF3UlJKNGVNZXY1KzR2dk9VQ1Bqb3NTM1pRTE50VW9EWjlrd2xuODJDMkdqTjJwSS8xblcwSXcrd2pLbytvUnRRSFFiZlhmTExCQURLcUFnbXZUL3ZRN1FtZmFLYWpyL3ppZ3NXV0NWSE1WS3kxMVcrVkdyNlUzM3IwNFBGSktaUVJxMUhjUW8yZk9uTndNdks4eW5kSVJBTFdyMDFPa0p6Y05ic1lVamlvcjlUbzAyV2d0aktKQWxsQzk3UHRaN0ZleTFoS0l4MnZNZmJ1ZU1zTDQ3N0NaVzVzSzFVUlc5a1J0VjEwL1FNTzY3SEJQWDJ6bXJxcEVjc1o1eGE4SE9WcXprblFYSlJ5ZHFMNXIycmYrS00raGlldVNCeHVObW9OZE5ocWV4TStOK25xOE9PL3pQVWFPd1RaNURXNDhyY2s2M1pEQkNUZ0dtcUJDSGsvelZKYVl2YVp1Ukd0czU0U0ZlU2Q5cEppRCtCQXUyVUpYOURESFlUTXBsTkxuVmQzVXZvU2JBN0xLVWRPUVU1OGV5WVF1N0ZsNkJwK1dkV0VvNUtjU2RNQU14Y24xbi9MUTdPc2lEdjRUZzU5OEdmVGx1Z3JtRUdsQVRoTEpteEFlcVFQVnl5ajVRVE12L1JkWXc4RWJTTW83WXhUYkYwamI5WEg1S2FZclVUNkNodFQ2dytpSG02dDNnS2NGQXM3czRIYmhVQXZjb3lxWk5jRGpDWDNsRmFHc3ZGeFFZY3N0eEFhaldLNjlzTzFIYXNRYnNXV3NMTmxWUEM2S0tUM2k5bU00T1ZRNVpwWFQ3SWdnSTlGakZwbENoNHZNUzJMUmcxV24vRFRsMFBIUVExeXFxSTZkSWVmR2x0TGhoeGVFRnFlM1RFV3FZSW9wdWJTVUdnMXZxOVljWngvSDBmMUE0aTZjcXBJUmZTYWxBSzE4bE1VQ2pickR2aC9lWFFVZ0hoa2dOZTc5SjA4c0lkTENsSElkOFhQalpEL1ZkcXdlRVByZDhvcWc3dGtkZElROVBMN3pMNlVKOUlIRDU4NHZHY2ZDWU1HSHZPekp1MW01NWYweDFCL01FVHFDdnNIQnMvTy9rRXhPQVgzRHBMMGhYQm80YW8yQVNuNURtbXlSQ3VWR01QUEFjZEx0SldwdTc5MkVlTjJqcTZPSlB5K0g1MVFKZjgxd0REcjBQQ1BTeG5sam5qNld5NTVNUGR3MWdLc1E1S0VUZXI4NzBzV0htY1BwSUVmYUJlNUgrdzhrbGZTUVFwYmZjRFVObDI0c295bmRZaVpZRUMwK1hTVmJvNExoK0FCelpzSGVSNXpuN3FRM2pEZlpGQkJxTjNwTDMreFlPV3AxZEN5QkgyUEh0MXNBMzZWSnVvTC9oa1lLRm5qaG5UdjBlY2lyK3hrK2pTelg2REtLVmNxT01ZN1VrZ3Y0NjVmNWcvT0RlOFlkT1djaW5qUVBJMkJMRk1DblJQNWxpVGRvUGxZODlueUh0Vi8wQnhjZS9OWEJ6dVB6M2UyRUs1TDJmNHh4a2ZsSmticzdjTHMzS2xicy9MbGRGYkxQeWVnM2NmRE01eWhKSHA5c052VVIxWVRaUjJLaFJFV042MElQdEQ0a3Jid3B1QXVTYkxwZlpJdEZmK25ndGRrNzRhR0F1Z2Z4eU9uK0dubWF1bXZnTCtNYXZCSXBmYllHUUJuTnlGV3lUV1E4dFU2ektTZ1F6cTViUDN3bXFvMmFkendabUxiMEFtSEMySHpycmwrZGFEbDFsNTlCSE5iSUNRRm8rQmVVQ1ZrYllOcTg0Y3diZGZUdktPTCs5YU4yMW5qYUUyekY4YXlqb0ZRVkd5YXh2RmJ1dUdRUXJnUGI0bUZPZGVsUjdON3FIQmRnUjV1MTJ1eHJ6TDJrUTdJdU1tT0pjL2U4Y29kdXoyWmJzMTBTQXVLSC9ad3pRdGR2eitvYkJ4b0tmbDgrTGtHcFJscmczL2tFTkpKcXZIMnF1eFo1TGtDMnE2aDBqZ2R5RE1NMktxQVV2dnQ0ZE45a09sTVFvRUdPV3d4MG1JOWtOL21mRCtwY0JORTJWUGM3ejI1Y2dMMGl1OENhUldTMkQycmppWm10eGlhc0d0bC9HbnQxK0cvNlNvcFhSRWExL0FUbVRVTVVGTEI0TGhKMTl5bFRJZFhCaHhacFdFVjdqVHRMSEk3Q003K0VUTUc0cXc1NUZOSlJuWHVyZzJOeFlWTDFteFVBUkpCMnpobHl4UWg2Q1RLZU9wdVkxWkVVUjFSKzl3TWRFWFowZjk1UU9QOXZkZDVkb1JFa3NKODJNTUdaSTFRWnNjRjhCSFBqYkFGVmRQcDhQZmFjRUM4aTYrcUZDa2dVS1pNWTJRenpvbU11MnlzVFJENmhmUXFTNzBtWDd1Z1BBUnNIRjc2UVczR0kveDhnUGcycFQvVk9UN1hXbjZEdlpMS21qK2k1OW0wam4wUjRBcGluTlp6ZEMzRnhvME9lTWJXNE1kRXdLY1pqYVRUaEVuOTFyRmpZVllnUk1OV3JUQ0dLTkNyWWkxNEZvcDJBbU55Wk1xT3lqM2ZnMGZEdStEa3B4STl4Q3BPdjlmUnRaUFRCeEN2WEJkZnp5S0wxY3IrOEc0eGNtOW9tYitBSnRLeDFXaXZacnVTNERWdU8rb0ZVaE1Xbklxank0RlhyNTJnV2ZIMFNWVytoK2JHNW5FQkJxRFc0V0tTVWVFWVladmtEb1FJM0I2ZEplYWlqampEUlBROWIxNzBTSGlYVzMwa1pLN0dja1JTa0h5KzB3WHpudkN5QmF1TFNzVzNOTGk5UnJYMUtoUFVLVXBuSEUxelBCbmNiNDJzN016VUxiZlpSMmtOSFRMM0R3cTNWT3J4andWUStsNnYzOHVjR2tOT09UNjZYaFdhNHFrblBoUnFNc1k2M1dNanJYMG9xOVdKV0Z5NVNlRk8yOWU0RjVsMkc4amkzVkwvak8vOWpXNEQ3QmtTK2tTa0p5RWRkaE9wZm1hNXpiZGtUSTlYZTRkYTRucGQvSlZQZXVPZTlsSHpjdnVFZFQ1cU5ISTZabmZSbURYK1MvbWFWV3BaYW5OR2lrRC9Wb0Z6dW1xRFJZcXhRMXRMYWxLVHZoa25vT1U0d1RLOThQNXc4bUZGOXNJekVTMjBMR2NuWVFSSDJsY0picHpISGtZeVRFUFo2dlFqTXloeUg0TmVhQU9Sem9kSkV5QkdNS0VUWnhXemFZYlR4TW9GSElCQ25sa3N5RmtnYmZJNjB0anRuZXRHc3NKQWlDRUFYL1pwd1ZGOFFnZjZNMzRjSHdLYTRFWUd4ZCtJazdRbWtRdXkxd3VkRXMyMW81QXBveGRwbVJVQ253RFl1OHBOaWZBMExvV0o5ek1FWVRzU0JBdDQzWVFtOGRPVkNzazc3cEFSN2pCeVZiVmFvS3NRZnlpbHIyS2hIRFNvaS9aRUlyRXlEMDllRml3eEVDYzFieEpNdnlHaXh1d2l4azQ3SGxTK3d6Zk5tQnA1UGVrUHNXWmltUXRzVVR1RGZHYy93eUt3ODYyMEg1L1c5SzZ6SFFtRU1xd0U4REMvejFpOENPcmZDM2tyMUFJTFh1eHM5bGZSa2piUDZMOGZNMEVpbk1uOWw3aHYwek1lNFBiVSttcFpocGdFU1ZRc2xxZmg2NTE1c2MwQkUwOFhxS0pQeTJYc2MyZW1FdENENzczcmw4SVhrWm1QcklsWThiZ0ZqeXNxMXZ2OUtGUUZ2a1VXUmdFc1NzNVBDdTBsRWZvR1lNTGNyU0h1MitCdE52cmQ2YmpSVm9uTURJWXpVTVhOT3RmYjdMRWMwWk5PWStVY0JCeVBjQllYMHZjaDlIV3RCMWdTYzNvQjNIYXY0OE5sY2Q2ZlpBa01YVjVhWnd1WWwweERLeElhL3ZzSzM5RS9OQzFydGVML0VselAyaDNpZTJ2alFsV1psUGJSZEVnLzl0VjdFNVB0OXlYOHVqaHNJTzJSam9MNUh4OFF6cE40cEdXczY4cUMwR1VoaElrQUx6QzlLN3JNa3I0enFYUDlCdG90Y1RzWDM2emtWNlNUbG1NQ3cxeThOYks5a1MwY0lYcjZEREVDU2RFMXBFOElqSG1McTFVUno1bGZ4WEVSejhzSzBzeGo4SURFMnBpUmR3MlFVWWhSS2JybEhMT29TM2ZMbVFhVkhsUFl4eDZQaUNaQTBjWDBKa3dCZWcxMGpiNFc1VW80ZzlpdERiVmpjZis3dWtKbW93ejM0Z1lrMEszbjB2YmI2amg1dHdtVWl0bWVlVElXM3N4RjZyYktqcTVrVVR6NVpESHB5dzZzM3dKcGtscmJCVkRPOTVmV0lWWWRiWVRtMEVuUGV1N1ZacmtiS05kKzVsTklhUStsaHZKd0xCdWdIMldCSjY1dld0bTBOM242cGZVUkt0T2s2OGlmSlZCT3Zod0ZxWGNIRjVid25HeC95bzBBSlIvMzMvYWFEY3NzMGdwWVRUazEyd0JLT2wzV2VVZDc2dFJ3UlJQRGx6KytJcjVzTm5BUm5DUnJXQmpLVEx1c1N0Ny9ITDZXNGtJNmxHaFJjSzFqTGtPUXlVR2U5VnhVeFlwVkdTWDlCTVkyUnIrTWUwR3JpTXFxVXlsbUxUTmViY1dVZ0lhWXJsQmpHa05vUkJYUmQyNk5MV1BiYTk4NlFYaHFyVmNreTRPcm1IcW9DTjgzMlhnSnYrb1JTakc3bHYreHA0aE1hU3AxL0loaUgreU5Cb3pQaW1wVHlUMGJwcW9Oc2wyMy9MU215bTZINDloMzlHM0wyeWFoUDduMGl2dDhpN096Qnhhd09jV2lmcVVmWVdjZG4zUkdNV1kweWsvcmNBdFhQUWZYMEVlbHk1bitrNEFkMnBiWGFESldubENTQkZwaXIxVUt4V2RhbVlsdjQxR3RTZUF0Qk8rdGRmSzFNOUtpWHFEWVorVnVYU3RSaG1QeDV0dU4wQTZDYllkQlhyM2puL3ZXbUVWT1VPTitzU1hJVWVoMXZiWUwzWlQwNlZiQ2drdGQ0K1ZMMkZFV1g4RnhoZkVzZmpKRjk4enhhNW9GaEc3RUF5OWF1ZDJabEU0bU5vc1c4UlIycjhHam9ZVnFxdnZIOUxBeWJwQndodEJDRXRrTDFKd2o0SzRwbEo4bkhHcm12MzVXZVRRTU4rNXJsYTVvNGtBRVpDeXRoL2NBaThWMlk5WTJKWWpVVTNnbXV5bUdlcUFnUk4wbzJDMDFCME9YeDlRUm5lSk8wNG1VM2x0TDU5aFIwTzB6aHhxeUgrNkhnb3picXhwZGtZRFAyUXFtVGNncXNWQ0FsSXI2K0w3THZ5MEVkdW1hdDR3L045YmQzTi8wOVNyY1hMajVjWEpOMFRrT2JpVXp3QzJwYkZORFc2aVJSVnFkRndmb2xVWi9OdGo1NWR2Mld6VXlOQ2RqQTQ4M0NNdEtzMFNFNnZ4MndIRU9LZnVRNmt2aEFBU1E5S0ZqcTBnTHc3WCtkV0tGUXhmUlIvcnlSQnhpUmJrRzVndGNuUnpnRFF0bDBkb1JGOHFObzVHS3FXMnZhcFFMWmRkaGZxUHFEQkFUSlJwejVINnRvbHNzVEpuM0gvUHUxWEdIY1JQZEVuSUpZK2c2VjN2SmZKb0VkYW8zWWp2b0t4MUptWGNJWm9FZCtEM2dqUTJGTDN5VjgxeXIwQzA1Mms4ZGtNT1ZaOVF1RXI4Y1lNSm5YSmZCSDhpUmVYZFphRlhzRERVVmdsUkNYRk15bTVWVkRMQjZTOUdIMDRlTHhsOExqeFpkZkdNSjkyZy9KM0Raa1p6akRaS3ROK0lRUk4ycW1TcllLdlV0MDQ4L3RmU3NqR2ZYZ3N3OExjUXhqSzNjSHBsUExHT0xpTXJxRTQ5b0xJMTU4b29rWG0vVWh3c1VqaUZWQVNVRG9PUkpnWnUwc25lYXU5Z2I3bWJteFA5bE9LaVp2RkxFSVV2bjNraW5YbjJrOUxIVmdqNnBiRnlLYm1CbWZLRkViZlhUMDBRcG9YbzYxcHJEcUkrVEFuYVIzQjc1YnU5S3c4cyt6RDg3Q0JsY0Y3Nk90WXBvMU5mNWR3UzNXMlAxQyswdGlwaENnU0dwaWFSTVFZenk3OUpYL1k5SnY4bkhCNEt1SEs3MHN3MThNL00rVE5UQlhKbUNGL012ZlBIN05jS0hKSU5ER2krZ1cwSnMzOGc3TEJDSW1QUEpJTnFlMkVpak5IN2VsV05FZFRjMVIwanFVQVV4Tm5GakhDQ2hrTVFPalNtRGZJNWZieVpWcjlPeW1CeHp0RTlmazVBL1lSZ0VMaHhEa3E2WU56aVlLVnEvY1dSaGUyd2ZKY25HZjdQeEVMOXJyVkhiRXhBMnhjTmx1RDJheElqbng4TWR6c0poeUZTbXBtdDA4SGJZV2tTa0hWaWxiY0hqa3VQNnZLUlY4VDJJTG1iRVQ5KzdrZ3ltMUV0Q1B4T1ZSNWt4dmlJcHJJaTAxYlZLRStBSVU2dkFpKzcvbVZWOGhZWC8wRWdLdjQ3RWJzVHFBT0w1M3I3S2xoWlBLMzBlNndBLzFmOFowVlFDODJlWExnczVRdlJxMWRNMHJyS3lIczdiVGw0QmV2UkY3OURyMVBhUjI2dURxelk4Z0xBaGZjcUY5VHliek8wV2NSbHg2d01qY0MxekFld0MyZHliRHpWN1E4SE1DV3g1Y3l4MEdBWXEyWVM4Z3ZPRFdaajFrWkZPdGxNT1VGMXA4UWVqcERaUjFHL2pHNXB5cHltNXpoaDhYWDRKbjlEK0dKaUhWMk1sWUJNL1Z3Q0NoZGpVQ1g0a0NtNS9TeWpFWHJyRFVPWnVEMGo2eVNEb0ZUa1FscG1KNXpOL0lQQkFCekZseXJMWmxpdG5WQTJNd2NzaVUyVzNzOHRPb3hTZ1grcjdGL0srbXEvalgzMndwbTE1eFlEeXpyUG9wTWx2QXVJWk1hbk1QTlUwWFhmamRrUjlYeDVsUkFJWDF3eVpzTno4bGpEVm1YUExOeEJUaU9hMXB2MWJiSXl6OXB6c3QyVnB1cjY1NHZ3MCtRSVFxRDFPWjdjSWpmdVBON3ZSd3MvN3hXcUVNMmVibE9sNGVHK2Jnci9nVTE1NVJrdUgzNjZpdE5Zd0laV2QrYVhzR2VXamszRng3U0IyWXROa09NbjBMNGNtNkVGTFlDQUVEWm5SSFFCdWhxUGxKdXh1cXI5UkYydERRTjg1NGpEMERvdWN0MTlCSVMzWi9lc2pOWE9mY0d0MzhkaGNjcU1Ccmt5WDZNbmJiS1RzdDhYajhjbTQ5OTRnSzNzOU1HVWErNlk4VzhzSWRkOVk2MVRXTklXbTNIZFM3dmEwTG1TZWFLRDFMNGMxZWJGNklzVzZlSHVNekdEM2diYW41Um9NaCtkSHZ1bVpySFdCeVVuVXdNTmZPV0pOaGk1bnJHclpFalEvSjFReFZoUTNsdE9DME9rTm1tZnN4d3lidXRRdjVlMTBMa2poN1RTZEw3TlJBZ0VqSWJOV2xaYklIVk5CTk4wSzlEOVpnbzc5T21HMzlOUlQ4NVhpSCt5eGlCOWcwcHBlVkRIblVtVFV6WEk0SjU2L3BIN0VqWW1jUGJzNmxqTmVHQ3crc3JTRWgrWER6RHhIb3dRUUtncjFVeWlnaGhWYitqWHZCMGlDNDJPalJDOEJpRzdSdE9CZWp2RjFUWDJEaE93RktLWDFZMy9iZ3JiVWpaeXBBeFcvRFBuRmNGODdWMzB4TlgxbkREWjc4VlRrOTFQTFIzMnM3TU50dVY2YWl3U05WYTdqWDNxNlgyNnFpejhBbUlteVVJK0xMeURod0JlS3IvelYzMUROb3FEVDMxaVllV05WOWVmMDUvcHNOK2xiUEpZd1FjWlRxWHFueG5Nd3didjN4Z0tZVnJJcGdkRlY2MVVhZ2psWjJicjFtMFpKOWpFaW9paDhHZkovRDBjZFRqd1ZhVmhmUnhVMnkxK2duMmZPajNMQmVUdGw4SXpldnpWRGdGNUNJeGdidThVWlREa3VDdjk2aVZQUzdRNm10NysycWo5ekhzOE5YR2plVXZlS25KWHg2VEd1VjVycmM3SEdOZ2dGYVVDNUFUT3NrOU5xaE1zMzNiU2xTWE9YOWRDMm1ZRlRCMkkxQnJRYk5mUityQzM0cDVQSjZjc204RVZCcmptMThUTkpvbmw3aEVGdUhnM2JDMG1XZlRIZmlwaTh5aWJiajdIdEdaR01ZVmpFWlJQazNOZkc0S2R1ZDlEalIxRjRlUWsxL0NFci9oU0tTcyt4TE13SndVZGRKRjI3d1p1cnBvcmpkQmpvaUxBTzl5NzVZdWxZSFIvNU5mb2REV01RVnNPeUwrZU5JNUtvYys1dFMvUDlWcEpLbStpMm5saVg2NEpYQWVrM0thanM2R2hKdmdpdENNaHc5cmw5NVNjU2g4WDJ2cXZPMWlwUmx3RlgyM2laUTRnZjY0ZGEvQnY2NTI2MmVNdVU1MmVHMnQvdXlsREFKd3RzN2pCWHUxWjhCb0w1SHlTNHgyQlBMNHptSDJpelBuWTMwQ3RSbi9BSFY4alJScFAwbXBKdkJvNmg3Uy9sWWJoZDBESGh3a09wQVVmUFlFOWlPK1lra1R6Tk5UZGVYQ1Y4TW9Zdmc1bkpIQnNPS0tiVFJucDVnUk5DeGp0YXQ0UGRvcHlUeDJwbDdCU0V0d0pkWXUzUlFjc0p2L2phUngySEEzKzBCbDJxK1lKSkkyRlVwWU9kcFNHNExYalpsejUzSkh3WVJVUHhFY3hFdmRNaUh0THBuYyt2VFFIek5pdkFNNWhlSS9ueE9MejZJTWcxUVU3d3Riajk3U1M3QWZxdmlKL2MvZEpMRmVPa2tFQ1BLZmdZWWFmelhtTHQwdXBlVGVwZUVsNkFXcDAvOHlidXFXVXdUVlV4bHNaNGZ1Ym94MjJpOS9KbXhMQndEa1ZlVE9wOThNdG9sbm1HMXhYNjE0UFRZYTRtVlozbEZ3bWRaeDU1MjNJeXZmdldiQlFjbzR4NVIvVmozcHpGeDMrcGJHWEl3MmsrUC9jYk5qNTg5VjI4am9ISlVxZ2hyemYxbUQvVmtuTFBNSGFnbzM2TXZldXlzdFUzMkIzZGkwcFRGTEYzK2Z6V1FvQ3gycFFsbWVSSmVNSy9aalVCOEFHQnFYOEcrRWt3MnM4dFQxUFNSVWoybVJnYnd4QUNNc0Fkd2JHTjRyWVVqMTNXVDlmdEgxbkhxT2NUTitZTHZibVZaSTZhTUhtNWVyQjNpMXpISDU4ZDRPLzZhaU9sUFUvVGRaVSswc0I4K3E5d1lZTm5nRThwQW9xYXhmZ3B4TUxJZWovY1QyODFqbzlXMlcrd25LT1N6Mkhsa205TTFoR1Nyck81MXo2TnJnNHYrank5b0UxeDZLWURuU3RmeWZnUXo1cFdud1I1bDdIRlM0Y3VaSkplLzBMVklnNFVkdGt2dEtuUmhsaWVVYmw4eGVYRlJwWmlQK0RNK3NrNFFmem9oaVJ2RVhqS1VwQzVjVCtPV2tRYmlQbVk4UkkxV3RHaDdJYjFTRWsxNk5SOTdVU0tSQ21sd1JHcUdWazRFWFVXMVRmWkl2VkVacG5EZUdYUm1YQVp3Y2p2OTdzaU9QNHlvMnd6bTZGdXhpb3pZRGV5NTdPT0pvK0xQOTdzenpyaTlaK3ZibnhENEczbWpDNEdwcWVET1d5WXJDd0NVVzhod2M3RDAwOStqNXYyR3BQR244UytoUjZqL2ROK1h3SzBKR1hJMmtlcmdEdzJBSU9STURBOXpCTVRtbFQrd1oxVWNLZFNsR0l6anJiY3dFZEI3eDQ2QkdPbUg5ejJOKyttL1hka2JHV2hVS2xFUUgwa1R4OEpKei9hNWpBMjlZZjJwS0l5a09EVVBEekUrRUViTkdkNitLTndsM3B5cTVjWFRhZTR1cHc5Q1ljMzNCckVjVSs0YUVrczVWdEowbEJCQTcrZTVEMzdHeHdoVkR6UnliaXpwYW5wVWIyeDdLQ3A1SnhESnZzSjZ5RGdlT2Q5dzlVVHY3WnJ2Sm9GdTBOMlA3VUhvZlRBb2NCNVJaSnU0MXA2NzUrSWl6S3ZoeDdVMStaUHZ2dmtJS3ZFVjBGa3JzQ3RLZnJpa0ZkZzdYK3JKYWlFN2I3ZXBpb1JneGZtY3lDcktnNytRckxJdFRyckRvMlM3bUpKRVZUdGVsSkVQWUJyUmVCVytSdlRmWEF2WGVUWmlwY3NuNjJTUlJITStrTXN3MWhFbktVdkNyZ0tRSWN6VU9qYzI3UGZMc1R4amNVTTVFS2NzYzRkYnZpSWM5dnMrWUk1V00yN1hIa0ZZODZXYWluR1BCcGJrMjlnaEdlKy9vRlNGNk1FWTVXTXlFemtGMWJSb1RyTFBHcFpyc3EwZkI1MDlEeGMveFA4QkpVSDZkZXROOTVhQVFjSXh3RW9aTmRyRmNTV1ZmSWk1R0dTU245RHR2V3ozVlZGaVVBUFZYMU1TcnNpUXBMK3lpWWtFZlRFMDFNYk9Hb3RSVUhuYUxhQzZxdnAxTXBtNzhMalJmTmQyN1ZreFY5cVIxdkdTSGZ2RFNUVE5QVEhOb2p5Z09ZOVdUUUJIbEZ6ZUxWZEIwZ3B3THMwU0dyMEU1Wm1zbWZqMHVxR1U1T0xLMDYyT2JSR1I5anFzY0Rjd2x2TEVRVFE5a0tBOFJuSU5Ocm9RRkQxbS9Da3FoZWo5cXc1T0lkOUY5QVlzamRYWXdPWTJQV0trYS85OWk5YUJQVlZZdHM2aUxzajhkUWVSUDVxY3BXRmF4WFN2ZDJBRGtyMFVHRkxzTzBJaTltaytkQ2ozdExoRWJ2WTNqelM4emsrL1ppSjVha3IwTlFsVTB5UFprdUFlOXZtYUlTRkd2VmhyTU5mdFIyUnAzK3VEQkdqZHVDMXE3OGJXMGU5VWZ4aUk4TVRwWWdlbnBIdFJsOXBFTEg2WnFwM0xDQmg2Q29hcmlpbHJSblNuY1Fld1QzbFgwa2l4QzJlNDN3dlV5YVA0c0hqV2VHS0NTekxKNlgveEduOTIwT294MTh5RTY1NERTRDl1TFVoQUltaU9CZVNxaWpKQXhBZ0I2UXRZRndqVGxCV1hVUG9xbXVyNjd6aEdKZm1Pb3pyWC9YVnpvaXBtZHRFQzlPMXVRRGdFRFFnZ0VPNkppanhXWXI2NHpyV05yV1VGUHBVeXVIRThKSFpMS2JBL0h5VGdaOU0xdG9zS3BQczRndjhpeDgxT2RUV2hCRGRiWUZFbnREd0pGZnNxbUtDU3lnd2JpSDNEdlVlYm9WOW16dTh4WDdQa3ZOb1psTEJWWlRLcnR0bVUzQjF1aVE5V3VuMnMrUU1lRDV6TkdMVmRQZDV6RGVUSjVEekZabkQ5Q0ozVXpiRklSMDg4Y2d4OEF3b0FMdTh2UHRMRmNaOE5WNk41WktLRFlKaEhHMlV4ODQyK203VzZnTWp0QzludXBsODRHTnZueVlHWVNzdG1YNkduSGJyNVRjakx0N2swaVRSeUJRRWwyNkRhdzY2TmZVYTFxbmJqVVdUNkthRUkyUzlrcG52dVBDLzBpYUxqWTJqY1NyQTF1RjU1WjFaTWpyRE80dHBMdjh2VHo2WHRlWmpSUzlLbXhKMjdpdEFMOGZOb0dSdmI0N0FjdnByV0Z5MllkTnNPdVl3eUU5V25hSHJ4Q3NvVlFoUGFCY1pCcHpiL2dpdSs3UUdBcy9BdUkvTFVpY2Z1cjFkRFVlUFBTdHJTb09ybFVFcXRqM1c4QnZaZDNBZ29iTTl3d1ZTY3BXRCt2UFdZaFgrMTFLYjhtYTRZQ3BOMjVJc2Y0a3hoaVZMYVNqTVlQYjlxRHgvczFZbU9JMjJNc0tlVlo2T2N0cTd4TFdwWmoweDhsK2V3MFRPeHd2bml2czk3L0VBR1VKTmZRUytFVFU2a05VMkwzVURwZENDT0JCWGdnMkZyL2t6TUZ6TytBbmw5L1VGUkRzb3Jyc3hxS0JQUWR0WGVZNUpCbnlMaWFBekVKTUpiVTZGd0dJR0ZuUkVtRFAxZVgyand4dTdQS0pJbXBRMWF1ZFFCTnVPNXhkYlhuK0xDV3ExSXV4Ui8rc05rRXJFTEE3ajkvQ0pYZVE4ZEljRVVPL1ZVTC9TOGdYeDdnS0pwQlRnZVFTcW8waGJxM01Wc1cxVFhrRzFiWC9wRjk3d3B6SjBrUytibUhKYWlRcDZyQzg2S0Npa2RtdWlPRDdGU1l1NUdPS0p1YmY4VXltNEpMK0QrY0FJRjduWk81OG5hQ0VUL1hqdk5PRkdWdk9VUjZaZlVvbjlaUzczdDVPRFlsVGRNRnRkWkVDNmd6UlJkRTc4UTZXWGFCQktNOTFoOEx6blU2S0tnWk9hc2tuR1NFc0F2ZjFpUy9YMGcxZ1dOcndPMm1tRTJnRkN0cHAvVnZxYm1WdTFzdVhSR1UwUXhKN3p5WlZtQ1cyNnIxY01XeFk3SXJISzlUZVl2WTg5ek1iY1hUVzNVbEFtajlkRTBPVytuMDhvMklPdTlKNmYzYXFIdlBzRHpSSmhIekdPWFdUS0RZOWpwS3pOVDd4aHhDODdoU2I3MnNJT2s0bGVERTIyY0lUQUlMMGlMMnhDUENaRlgzbitCSEwrZHoxWnhkekF0N1Jkby9Ea2JnaUxiVnM4WnhiczlTdEpReUIxUG45ZHA4aE9rVGxXeG02cTlGUHZmSkthTk9zbHVFSGdTbjZLcnhEbnNsUmVyRmNkWFRzQmdwSFpUTjJ3anBIbzAzNk1wRVFkbUQ4N3drc1B4dVBqN3VKR1VKM1N0WVNOUk1FdERpOElITkp4aVRucGlSb0Z1Slh5d2c2WW1Ga2VsMTNIOGcvVTFBS2VGYTBoV3hPUFhhWi85WTBBN3JhaUdSWTd2dXFlaWhVTkZmbDB2OCsxODBtLzdvS09uM2VSZm1kdVlwVnlpL3FkUkJKZzI4Y2RpWlBrZFMyQmRtRUl4QWtGWUdWdVlpUUJhcDl5c2ZjZ3JsbUFrRTVHVzg5VDJ0d0hzM3ZVdjljNW8vMHk5NTJCZnlDa2hKeERLeSt6Z01wMjN6UHkrUE1yamlFZ2U4UTFGcmtBbm1naEUraFJ2UDRZSm1XbjRqdCt3MUdicklWQzNFYUxHaHhZOVVVWEh5elplUC9QTkdzYzV0WHBhelpSaVdWM0NoV0hxVEp3akU2bmxBYXkzTkRSRG5PcWQ5Z2RVRWtiQWcwREtoTWVMS21BSWhWM3A3M3F2S2pxWGlUdFVBZFpBVEpEOHNNeDJuN0xNTGY2WFc3VVl4WXA4ZEJPMG9BYXM5d1NJVW5SMEJnWmp3bWVxa1dhQ0I0Z2FYRkxCZEwvbGo1Wk0yQ3dja29xRUo4c1RwRlVTVkEyVm9rYklMeE1tMFVxc0lpUzNKNmEzWEM1OHdSajVnZWF3bS9Ka3Q0UTl6T2ViSlRMdmFsYjJJNFY0NUhxbVZnK2txMVhGTjltMEl5TFk1eVV1NG1TbjBhUlFXKzZ3YTJ5eCtacjVpN1VhMG9UNXZRR0NsODQrcXFHamFCZW5ZMUhTNi9ROGtGWmdjMEJ6NUhzVkVjM1ZHRm4wVDM3ZHBOWFNmaFg0MjkxRDhnZ2NxWkdDaEJkYURCZW94cDBqTFE2bHB4ZVpJY1psaXF6VmJZc0NVaDEzMGdmL09EblJsYnJDbFZKb1FNeklqcVA3SnliQXVQV091QU1KNXVpVmM2ektDdHk4WGZVbW5DMklNUkJsM3p0Rjg2cGRGWm02SGF4QzRNMjFrVXR2NDVNRHA3TFhMOXZHMkZlZ0VGUGtzSXJ2SjJ3dVJxTG1BVFYxTWdlOFdEY0NrRS85Wjl2L2Fna3prSzJBMGtLRHN3bFhqUDdUbWJwUndHS0lGY0o3MFVEMm0reTgwQXJiY1Nyd0NjaHJjeDVXcUFSTUU2UGJvS0pmSXBhOUdjaE9kWWJMbVp6MGdUZHVQbUFKemYxYVJsdUVRU3RzemFyQU0rdTN1Z1duQW1zVWtkdnZVY2dHZWNXZ3JqNUE0T3Q5bFl1Ymp2M2pFc0RBTi9Qb3lvc1V6cm9xYitPT3UyWlF6YzlvRHMvZVlDdGF1aldjZFV4SzU0L3JBQmd3cExBTnZmOG52bzFTUTRUZGhnZ3BvYUJMUE96WENaREl0c2cxSkQwWmR1cjdzRFJmeWJKdkVGWlFUa1ZsK0t3SWZtMk5wOHJMOEdMM2t6ekw0KzdENjBZUVYyZ2c5Y0sydklDaGQxRzMrSDB2TXZpRUZBbDc2b0pzd0FkektzbzFmWTNWV3JScEM4STF1djNBUjRjQWhMZUUxcUYwTEszUXpWOE95RFlBK0ZjMHRKTHRIdFFmb25NMHFnYzJ0UzN2aCtIb0w1TXpwSVRiMGVuSlhKdS9rMkhxaGZJbzlKOWQvak95MHcwWUFRTUtYQ3FRNGNscnhEWlFuRi9sMWlzZkhTT3F2VjRCc1JVTGpmZElxUElONFJPZTZZT2JYekdiSTZEUzZVbmVSM0s5c09xSHJaM21VVCtTUWhFN1o3UFBYbUNkemY4d0pDMUhZY0YwUlY0T1JJUThSODFDSjIyRm1Oc25WdkVpQjBDSVEycEVaeVZnZ25BaC9VOWZEaTNRTXZqSmJLbzZqT0QxTnI3NVZsREViK1RkRVdNdUlhNElydUt0V2ZZV05ka25McS9zVFZQSjgyOWNVcXlvNjNBWDhESkdEdFZmNjNKL3hsZHFXZ0dmRnNKd1F0NDJFWTQwdkhqd3JIdHlrajZFc1RzVkkzWGREVkhnSDlFRXJQa0VmakszMnNsZ1dETXV1dnR0OGhDWHYyUDBLczhqdnFHbGNJUTlwOVlnYU5CdzlmQXYydkkrNFBwTmRVZkgyTm9YdDhTaUozazBnb0IwQ3QyelNsSldnZkEvcjJJa1JXdWFlQlJXWnljaGVvemJpckdFQllFZGYvODVxbE1tMG45S3hYY1hqaVpWM1RpZmo0VkFRdjBXc3kvTkpKUzloeGZ6bmJHVFVCenB2c0s2QmlYRUR0Tmdsc2c3Z0ZwcTNObCtRVlZheVdjVG04Qm9xMWtUcGdmS0MyWHhRUDBIaTdlNkp6Z2d1WE1KaS9LajB6QXU5OFlVQW5mNXhTd0Z4Y1d0OUc0bnE2YjFUZE01UVNGc1pneVVJaEtlR3ZXTCtQVFFjYXlNcllFZ1VCWXFtdEp5a0pIc1ZUNWN4b3BIMk9kSEMraE9pY2pvYXJBYkxXckhyWXF3emhuNHpEMlo1TDlzdWZxblhoKzJtZUd4RmlGSkE4ZFkzN2NlSS81dnlMMWNwSHRhWTdzZzZPb3d4MTFNVWcvM3NBdDFPR05WMzhYbHdSWlR5Uk9YcURxZC9TK0NHN1Bqdnd5VnRsRGNZUzYxT29MdGJEUjJZWkpjZXZtanNzVFNLcDErclhUbE5XRWJWZHRvblorYStqOVlnVWxLMTgvWmh5dWZxb2U1Qk9QZnM4d3J2bnN0QWpoNmx4QkpYMUc4a09lM2RNcjVZdmNORC9EYkpWVXVzYk9JM1FsK3RibGdnL2RHNmdYdjROSEV1L0h1MUJoREpYUWNWV2RoYjlpNzNFMzhQcjNCVHdsYXJVbzBOaGhZWTJsVjl6WEFsSGVGRGtBOFZuMkhHNGZCSk9lQ2NZNDExVzJnSUFYTlFnbHBUNnEvZ0Q4akVlVndicTRTWVZEaGpKUTR1azJVeW1vUHBNUmg4L1cwRzhqaWxiaHhoN1h6L1dmVnoxU3Mycm5sWWdkcVpwTFJ5Q0Z1UVQ3eXhod1kvR0JhQWZjR3h4Y1MzVlRuZWJBcENJVFIvM2NTNnIxS0Y2VUhXdU92NEZIbHYwNks1eFl6U2xSU2hxN3l5KzhGYU0wMHBGWFhCbUxQU05RTTNvVmNLQjBYVEl4cmdkM3BSYU5yM2xkUStqVUVaYzE1dFozV2srajduOFRXV0pRK0VNaE9WNHppSmxyK1Vhc1AvZUV6amt6RThqTVl0bW04dWV1b0ZLNDZKYk5wd1VuVXVqaEhwSEgwd1VkeERCdEhwYTVOUTNJODh5cDJNc0pmUjI5UFR0ME9YdG1zUE5mUE1XYUJXV0V6ZjlpNjJqTmNRRkQ1RUttRitORURmM256bmlTT2dtZTFZOXlVN0tQVnFOTmpxQmg1VlNhdG8wdnY0MVY4TSt6ZE5kaERKcjJsdjVSMGJwNkhnSElwaDR4UWhjcm1FekREZWsxTWVST1hDOEY4bGQ1TFNSb0dtVW5RdG9scEtMMmtoc3dERDY3SzMvRzJ4WWIrTklaWVd5YWhrd1JGVXQwYnFJZ1pIbFcyNXFsOVVxMDg0Mk9JRVNGWFJvNkQxcjBlRkQvY21ZNi9MVlQ0UUxpVFJQYi9NRjIxaVJiVldHM3pTNmpXclhQMjllV0h6OHVERXRPRGNvd1ovdmJ4ZUUxdHlqVEZ5MUYzRlMrWXhSRk9aREhMZEVNajBuNGNSOENLUWdsMFVGaVV2YXdJTWUrbW94UCt5VXpnZUdMNGNjYUVhQVpHRnV2dHk2L0V4bEhacXV1ZFJLUzF1K1BHZWhqSXFZWTcrMllscVdYcTRTME9YczJhTXIzWDlqQ2Z0SUl0Q3p2ZEtrVHBWZk9GeWV5RC9VOHp0Sm5xcGFlS0Nzd3QwbWdwNWp2b294dll1a3J2dWozcStMbEtnT2FQY3RMM1dMYzB1U1l2cC80bElCQXNWbEhlWC82WjBuamlCT1NXRUR2WmM4cWVPS3pOa2d4V2c3bXhvWEpINmN2NS9VMjhBUWZtZFFjayt1MUJkTGZJSkN1TVJBcHZlODNGUHhGSWdmZEJmVVdMU0VWRDkrMmdvcmFjWllLS1NRWHJvY3gzNG1rWXhNMWFob0lPWEN1b1ZZck9tYnFGYkJ4R05relFQc1BHblBmTk0zMFJPQytXSk9zemM5cWsvR0NzY3FYUGIrSE1iR29WRERaMmdLTDNNcFIzZnQ1MTFNeFR2dWUyczVzU3lmWDk2VGRWUHFQOHA0VkdRV1FjOFdDWjYrNFlMWUdGdVJ3QmRYQStzS2g3dlZ4RWNzVU1UM2FXNS8wMXM4d3QrZXl4cFB0a0RFSTJITnNXemRCOGc5bGIrOWNTNHZpbGRIQ2JiSkhheVJmVm9QMTMxV3JOVDNnZkJ1U0lKaFFJU0h0VGVWeldrbDlLT0hEYjBXRUJHYU1veFFnWEJTYTZtaFhHYnhxcHFFSDlYOUJQbUlMTk04YmRqUTNoczdvYm1PTmdrVVEwT1dsUWc4U0lJMXFlTjJ1K24vamJwQ2dEV2JFYTVJbEZES1dmTGZZL1hIRVloME5Dc2owcFRidi9HRTlJN2xsMjFTL01LN0xoa0g5UGJlRlBJZTVrempFeGtodnhhaGNYRjFFRWhCbzhlU0N4c0tNQ3pvWHg5MzFCb1pPNW9HOU84T293TVJoTzZ0ZXM4ZjFpVDRiYzF2NGF0UUF5SXRGVFNYYkJiY0l4OGhQODVPVitLZGpONXBLUlJBZTlRcW9kcG82WDdhRSt0WEM5V1hTMll0SzZoLzdDSE9TQjJxOUVLeStwVHBBdlJ1Lyt5dHJOeEdvQ001Y2ZXaEhwVnRDWnQ1ZUNKSkJRMFRrdWkzeVl2ZGF1L1ovS09VWXpSTWhlWVZ1UFNPc2l3MWl5VERDRUgrWWplTW5udlFmRFUveU11QnlsN3VLNXp6K0xrV1JYMDdvZUR3dmFwMDFCNUFMZW1Jei9TNm1RSzFIY2pJc2lURERybTRqOWlKQzZPa2tGbHVGcGduRDIveDIzSFhVMGNHbE9pNk0xaHBMK1JDSmtxeVVpclcrT3hLVENyTUpjM3gvRERoZ3hXaFBoRzFpNjd0NWo3Uy81akprcWUzbVNyNVBJMGZBYnJvQkJTWk1Ca1BWN3VCendCazBBZy92WDJOWTNmcDJrVDJkMHIyRGFYREZia2pTMTVBak1JaXhaRkppT0prVGlZdU1Qbno1d2FRd0d3N2xwKzl1OUZDUFlMdU4xNTdoRnlvbi9JOUZZeFhUVTVrZnNKajVIbHdDbEtpOUUyMjBhVDNKbUNYQkxKQXM0dEFvNzFVOGpST05Ma1JBTDFKS1czcm5rVGVOOVJ6anRSdHdDd25wd29UeTRsZHZNbTlOM0RBNHhlNS9ZdUFQTmZoaHl1akhYdVFVOG94dTVoVkJHZUdNZXA3b3V5d2VkRDhqWk44R1lqYnJHK2dROW0zZVZXTHZXdktoNEJuMXZ1RnVxVDRIWlpaS0VGeVF2U1F6NmlmS1FhNmFmd2ZxUXlIKzFOZDhCajRveU0xSGJsanRPbEhQdmIyOWMxYjZ5MkNUOVJsaE9IdlRqK1ZpSXJVN0FlWHBzSWdqR1ZKT2JrY09BYWNWQktoMnpWTkVYTkRzL2ZCbVZsUEwwL1RLeGNUcXZySS82S3FCYUQ3dGp3bkdud2FuUU5wY1UxQ1JjbTZWelF4NHRvSSswNjVHL0Z6WXA4YXpUSE9GK01VUGVqcVp0YUwyekd6ODNDcHQ3S3Nuc1FENUFHa05LcXRMa2RxcFZWM2xhM2Q5VzBGU2JObVpqYW9RK0NzNHpLRWhDcHI5czVEWGhkZW9na0RER1ZsT1RiUjhkTkN0YUpieHhTMUtyaGxIdUFOcXhUTUtqV3NUTmowRzNCSEk0Rnl2T3ZtY3hDYUdZQ2txSTNSMUcyWkcvNWRRMStOcGlZTFByamIxRlhqWCtkdGxiQlB5RzZHRTJJdzMyd2hoeDFtK2lQV3JqNVFOcU1NWmxYZjk1enBBbmFxSXRPR2hCN2U4RThURWkrREt6b1lZWmNNMUFMUGJ1M2hNdXhCUnRCYThMZUpNRUZGaXBjOVc3cjlmSGZSbkZlZy9EOWdFS2xtdkNNMEJDd3lROHdJeEphN0RZTEtTY2YyWHk4ZkY3cEVOLzdpKzZXcDFLUzN6VC9xVWI2eDlGNHZBTWpLaDNkbm45TSs2VXQzazNKNDNNekdLMzhDODRlVUluY2g0VWFWdFErK0tQb0g5SFE2S1VraEg4alk5Z0NseWI1Zy9ZTnk5R29HZ2lRd24ybXJydURXS2NvU1YycTNNWURhdWtQYXhJM3hwOWtRdHM3c1prcmlwNGIwU1gvMktEOGZZN2ZpZ1NMR0g4U0lQNkwvbHdFaFlXbW0rOWRJbmNQYnhJdENlYUxCU2h6SVpJOHFGcU1MK29SaThpKzZaUnFpbzc0ZUI1cDFtV3hONWVMYlV6K2ttUDBIbDBwZG45Y0ZWeUcvckJMakRUYjF0dUFma3JENlRXRWFhSDFFcWtiWXZwTzdWR0JoMUlSRVZMclZleXc3T25UcisrVk1ENUM5bmVndTdlUWdwMkhRUVZ4Z3h1ckRLeDcrVnV0cFlDMEsrRGNFRVpQWllJWmVVemRneHRRMVVpdjRRd1A2b09qT3VFOXV3RCtpWGdWMGI0NDZ0TnczTHRMWGVlNWhRZkd3ZjQyT01uSTNndjFSS0tvMEhsWTNPNTdiejlDbWZnRmFsNFY4ZENEOUZkNlE3VWx2RWhlUzJZVlBmN2E2aG5OY0tQRU5oNEs5dzFHVjcwazIySmt5ZGhRV0pXNE9LU0VCNUdrTEtDWnpoSEJuLzllNWdjTGZHZlJDVGwvamhmMlFqUFdkNkh5QTcwd0w4bW1NL0RVelBFTTI2bG5oWXhjSm1mZXV5SmVWZEhOditBVHdBZXJFNjRTcXMydVZTK0RvMEhWVWlTT2dWSjMyV0ZwallJMlFyeExsL3JKR2JtNkd1dFZDU0YvaGxVUkhZK2p0NGUyT0VCY0ZTYnlyZ3JITWJZZ3ZMdXdUKzR6U1NrcTAwZHhNdFFUVlJJTnJDOXFFcmlxMFlQT3pKUzVtWU0rVnBsaWRrYjlwWDFJOGw1bVJYVkc3YXd5V1FZVWcyQW1BV1AzSUpTcENCYTZmTW45bmxxdHJ0NjZLd0sxQkdXTE93c0VnZ0hYZ1EyeFdvOXNlMWxkekI3MlJQakhJYnBXbzlsNWsvcjlIdEpyQk45YVM4cGVlU0piRUhGS1R2RHdNR3NhZ3lTdVVBNnppWTMzUk8wY2dSdVIzR3BMakNueXZOU2sxU2UyaGdISVhORWZlUXI2UDdHd3dqcm14RS9nQ2kvV1MvVVJqenNTakxmWkRRVnQ1QnZNbFVScng4enFKWUJSbElKdkN2WXI4NkxxeWxveFp6aWQ4YUUxNDdZVWdma1F6YjNvVk9sSlJLNjhHT050SXk0TFgvcEhOUmUrKzZOR3IzSTRjdHdIeXg3R3l5OXdGT0k3MmUvU3B0K1dUUFZibE9YVmJ3OFZ5cUpGRWpXMnA0OEVWTEtPQ05BNW14NTZta21xNVUveDdIQmJoalQ1WDVBNllKekNpdjAzTlI5clk5RGFyUWpKLzlNTm1WbmhhVWlQTTNxQktsQWdwYk5McGJPTktYeUo5K2Y5Nmo0S1JUY0NKSVRuYzE2SHpFWXliMTM5L1UwNjB5RFVINnJNZVNrNzJWdmc4NkFJQTJRWVFtUXpleldxVWlDaUZTUmROQU45cWlEcTFHNkFWNnNDM01RRU9WV0lGVGxLeDBlNkhrSXJ2UHF6alNCbm5uR1ZoVzUyOHFpVVk4SG0yVmdDaXZFRWlBcnpmNXVVRFBUWEFGSDFKYWszM3h2NlVyeUUwdi9LOEJKMHp6ZElzZXhWeE1jL2lBNTJqUDVzQ2RFb0xxemtQb2FadmkxTmpVSFNHbGZ3OGs1UTIxY3dCeGJ5MDN6YU9DMkNaaUt6aXR2alZ6TnlSbmxnbnM5bjJQbWpLUWgva0JoOHlGUThlRm5UelBCbTlQR3pCN3p4NWYyVVZieFJ5anpJUGdwMnppSkdYSFFNZmhtMmtoMVpKd0FwY3doSkJ1VEhrSjNLenp4bHVPOG5NZStNUVArYytrOXljSFZ4cEhkTXBnbjVJVVAwSHNCV3BtTnNJdHcrLzFrZlR1eEg5WU1hWXpNOGUyZHp4TlkrK3IzZ0tHb29sZ09pWlVLSk15MzNMOGJXYXpLZkRDa2dYKzVWc2dTNzdpcVhNVFNhL3licFlHSmdCdjFJWFcyOVRiOTlSVjdPcjFlVjJhcEFHZlAvc1Z1Mks1dVQ1aGZvSnNEVi9COVlRTnhuM2FCTncrRVozSlBrbEE5WGRGU2pVdzlGb1pyait1Um80MXVKNXdJbVVOaUcybUdGSDJZdVA4WVFJY2hKYytlUHBRS01YVWNoUHZhdHlETTdaNWpCOFRybGM5UzlMZEIveG9mTk9MTmxLdXZkVGt6djBzcVkvOFpZQy9jR3Z2dVNydWVXTnB4UmlkKzNDZnlKUEZNc0k1Y09hdnJGMnRTSlJGOFJUZC9WM2RtaU96RW84V1ZRRDV0TEpKUVZ2RjdnenZlL0oyVXNBLzNuUlhvdTRWNjdOV21vMVRjbEtEMWowNThsMXRvOGxsT1F6a1B2SXRvc2RwazdQN2cxSXp0OTBwOHhVM2RqVGtra05QZGRKaVhCT1FoanI4cVF2NXNJSmlhbTVtV3B0QzBDejd3Wm1QckRIVy9kOVAwbG0wb2xNRHhOc08yUHdUaGp1R3ZKSTY1Z2FwVUIyZThKTlNrTFFqSXlsRUEvYzFld21tUWRnZXJ0RHJhQjBFZU9mK0QyeHFwVTFydTdoa09FQmF2YlFneVZpQUtwMUdXdEk5UXgreXdQVHZlN3Z4aTlrenhhU2cveFZPV0hyVitYbS9lK093NFJIY1VzeWgybTQ1T25jNHRwa3FWYWhsVm96NmtLV3F4SWRPdlBqVmJDQThkRUx0OW9kdkNUN3g0Y0lSaGlOVHZ3eDJ2cVQwRU9jRmRLeHpFN3RWWGt5SVNpd2kweXBhaFRYb3pDM0Jac0FuNThvSWMwSTJzUVNpSVFpNVhhYkg5OGVickpITmhmQjBVeU5vSzczd0lMelhyUytJK1cxM2oySy9EdEc1eVZudXY0Mnh4R0JUTGhUczBoWDFqSytHUWtOU1NZcytmSE5ybE1oUW91MDlzYVpIWUh4V2tjQ0xEUGxza3YvemcwazFKeVBwZ2ZuQ2Q4R0ZUSjRMc1FmeEFYcm5meFdaMTQrbHBoV2phRDZGbCtJN3JBWVg1d1pCS0FibjhXSFNPc3cxVFI1ckFwSUR1cHo0OEI4UFpCNloyMVMzMkg3RHJGY1IvWXMzNW1JY1didEFJcjI1cDhLK041ZWFtcnlES3ZDZmNRQUJ0bUhwaVlzZ1RtSWlOanBoVW9McUNOOGdQamgza1ZQOG1yem1vZEFkZ3pUUm41ZWlES0xDaW9SUitubFNhWXhGeXNMY3VaODBhb21ZejA3dzNTbzJDWjk1bHFFQmIwSDB3OFNnUjZPUzVtelBrY2k0eWp4V1E5eXhJM3ZNbmpYYjV0ZmxiQngxWUJNYXo3cXVjdUdGMnpKa3BWQWhhRGcyb1lxbkNHUW40emRmWFcyRS9DbWdOQTRQOUxyQms2NFVvdnlhU3VpVkxxN1BMc3ZOZmd6U0hXNTE4Uld4TWtjbzYxdlFQb1djMHlTZHJWd3diemMvT1krWlBXVFdXa2p5NEF2Y1lqa0Q5by9CSDA3RjhJY1JjalRKKzlqYml2STRIYnRNN25veEFPYms4VzB2SDg2MVF1RVJUNnJkWVBrQ01mY2JrRTJxSlFhcGVFT01zbmF0RXFZOHlCTlVpc3UxTzZLQU84RlQ2WG9sM3NOeXMrY3ZSeEozT2d4cEFtY0Z4Nzl3RFh6UXEyc3F2Nkx5cVZsQithWi9tTjAxSnVhL3pQZmpDOURhZ1ZDQ0Y2dFF5NkFpWWJjS2FhY1VYU1dZRVFLMFhhV1hyU2NHVnBveENLTzVEMzUyYXlrMXd6ay9Mdmk5eEt0amwrM3JUbXdxbno3NWtGaVc4TmlsQzNnVHNGYU5KZStpMXppUlIxNkFyeEo5OUV0elVUUys0MDVvZktndFdtR1Q0RGtYeTNpMEZWRWI3SzB0K0ZkL1NvNDh0K1RCODNCZXdBbTFMSEsxbTBoZzFFcHZML2J3OFlsQ1BrNTJZTDh3ak1HYjdPc1pxdXpMWVBSQlhlZXRMWGFha0xJcDllVm54VmY0enp1Vlo0MEIzd09XQm1zY0k5aWdjeXF1dEN6a1ZrS2xNdC9VQXFXSm1OUGpYOVNjaTJwdldpSWhHc2M5TXBBM1VLOFExbzcxaE9aNlpBRVlmVmMxMi92Z3NEbzd6YUZXZ1hMVGg0VFJvUFVHRWdPYm9uY0pocTFDdmZXa2xEU1JsU2FrZW9tcitUMi81Tm5RdTRKYjFTZGRWN3daUU9GT0ZyU0dqcnJER0lIT0hTbE4zSmRNdjMvMFBVUXhXcFJXVWpwTjhudWh5eHhuSzkvOGpLd3psME1xeS9zekZ4ZnBibG4xSkJpa1YwcENIV1Ixd3d1REV3TEIxSkpRNndxRmhWMXBPMXVSb3BHcjgvSmpWL3RWcyt1ZURNTHcvQkNNblJ4enF4M3QyeUlIckxoWmhGclNWNnQwK0hXekdTWmZ6bWQyN3ZzVWhHbjJGbU8wTkRVQWJCSUF0a1RROUpxYXkvd2tremNOM2tROUFTQzY4VG40VTlNRDBDWTFJR3BNU0F1dXQvQlpscXhLaHZSZU9GVUUrbm9YMU1OMlNDNC9ZcGpmMk9oa0R5a2xMT04rTDQreXFWYkpVOGRodmM0UW8zYzF5MzFidU9rT3F0a25INEFseEZJK2RvcnJjcmpTYVRvd1ZNNlF1SXZNNEpyZGtxK0pDNFlxMWFZSWM0ZGlLRHFnSVVHa0QxVEMrOU5jN0pJa0g2S1VVZVlicjREWkpHTzVQSFcyL0M0c2VFTGRGNHp0R0U2SGIrSWV4TE8wb2Z4S1ZUL0xPRitXMldvN09MSFFPMkZ0MCt5MWlNYXRjZ1k0ZHMzVm5vNDg3cFUzb3BCU3czWVg4aE9BWUp6YjM4cEs2M2pNVmlkZVJnV2NtbmZ4RWZ4eWl2NmxzcmNoQXAxaHR4a2dqMUFyUkNidGRNeEtneWhLRVYyYWFaSURhWEE5ZkMxdGdFamJJbnJIdE94aGk2dHNGWVhOelhGR2tkS2VUMWdDYkRPTXF2S1VKc3UrWGlnTWEwdHFOMXVlZW5RaTdXZXBLV2tSUUcwcFUvb3JxTFZVTDFHWUlITERzYmRWZUtnTmNqdEpUZGljZkY4RlM1WW81SVRzNkV2MUtyeEJSc3lvUDZZUGo1MDFUN01CMHJNQS8vS0hxcjlNaWpEcXhOZjRzYTI5UGprVlhWQXU3eW02SS9KRWErb1lOYmRiM0lLS2ROSi9tVWdPVGxrV0EreS9xSVd2Z3JvOUZCdDZKc3RReS9VMkt0N1daQTFlMGRJckttRkVJdzNTN2ZmZ2JJZHRvT29GUlhkdFFncmpiYU1BNE9jR2xlRVl1QkZpOUloZHo1Z3NQYm4waGsyYlhmRnBBS1F1U2pJNGo0VjcrRE5YdXVUV1pnV0VDV0c5b2VyTEdSbXozNW1zS3dRdC9idVlNd0dRNEZac0tDZHNkaG53Q091QzNmcnVHRHI4eHJLcUxDRHFDYmdvVHNZWHJQdjNRVGZQZU5uMTByb0NQWnRYU2RFQVJFQ2xyRldQdVlKUWdXcUdYVzM0Y2FxTVQxVk1tcEY1MXFWeFNISi9wZ1kydkhoVlRPa3g2Q3lNTHl1VXIwaHJMNmdOMG9XeXJYdlp5S0JJb2NQZ25obXNXaEgrVitITFp4dHM2czRNWDBXOG1odkpLWjR2ZGtrSXpTZVE3bTUxaVpjdzlUMzFhQ0hJYU93dWxPd1h5QWVwZ0Z3VGw0MzFSb3c5UHFnR2tPREJDdk9SaFhMSlM2T3VLMVlJRXRQampSMVNEVzFGWjVzNGJvUFlWWnRIUWdEYWlSN09BeSt0N29YUTZPaFg5OGVRTWk0akpLSUVIcXdTbWxaVDdiU3I3QXBWZEhkcExRNEx3dXFKQjBSMTdrRmR5OFJMVktvdjJuUGhEYU1nMGxBNDRpYVJjZHpSbEJOTXVBei9RMjVtMTdNM0pyQzNRRmRvcGdBTC9CR1k0cndOb1duRDBvZFEycU11amdEQVdieHFZQitUTU80d2QzVjl3SWpyYkhSdGZQRVVwOVkvUGtyc0JydjF3Mjh0YWtOUlF0OWszMTV5SVZJTDBZNEpmVkx2SE5Dek55ZHdHbGNvcytSVjZwVlFPZU9LSWlnUG9STU5ER2NEZHVJK2Nnay9pN21McUtNdmcxS3hzNUtoRjRaS3ZBVDdZTklFZHZxY3BNS0ltbVdFZXg4YUIyV2I2cGxKbmVFd3N5ek5jWnBqS2VDdS83RGxUSmRNZHB1SGRNZ3V5cFg5dERqTXR5bGhEcEZnSnRRSk0wM3VSV29DMCtIb08yWWZzdGZQeUw5a1FhMFp4TVVRREdCSEJQK3NhQ1FlblR2cS9MRXBycFBRaUJIMVV3ZGt2OXZ5R3FndW9aMUx3Z2J1WlBBRmlOaDJpSm5lcVZsS21JcVIxYmhsaFlsYmVuSVRJVWEvMmZxNXN4T05CN0JLZ0ZQQW9ldHo0SVdDREYxVjN2ZWRIVUUvWkN5V25SNEdZK0RPWkhCQkxwa3JlUTc0QkNjeWVkRlROQ1ptdkZmUUV4R2pvR3F1cUsvTVFaNUpZSGlQdHA2MTNLN2hJcWhnQ3c5TGx1dzlXYXBHS2pwYW12YksvdVU2RFZzVTUrUTNKWTRUSCtDbW1hOWdLWjNnNVlmUWVnZmYxQUlaZHFNQXZEbWlqeElNY2daL3F2NmU1NDRJd2pZS2NkUitlUXRiWFdCQXZxdzhIQjJnR0VsZyt6L2MzVmNCY3pBd1pQSG4vUXh2SFBOVXUrN0xKdE9VYmwvcXFINWViTVVuK2pWVHVJbFMxc2IvR0xXOEpzOUt4ODM5WmxRc09lMkgwNEZUNEptUVNMOFcxSzByNXpiblpHVEJ1MXdmVzhOVUUzWmpLa1NoelpPSmgyNDJJYUhudmp2T3ZrWUZYL0duZ0FSZjlJUzk1WWhaamkyeWk4TkVRdDNxTjg0YzVqL0VXemJUYktobE1XRDFXQndKUGNCalB5aWFzUG9uQXpGTmhGT0V5MC9PQ2Fzb1orek1nR0ZBc1JPWVpBSDVmM3lZRytNa0dUWThSOFRNcnlaRjNyYWJNOUE5QlkxOUNnMDg2SFIxa1BTaVlJSkZXWTRkVHBxTGhKM0RLemNDQUw4d2xxYldHcVRoOUFkZ3VyTFhLOUxHR2U5Uk40YXYvRW5TRjVjeWg0aENZYXh1dWNMK3NaSGhPVXIydGRjMk1yWEhoWW1pbEJQZjhiWW9iTXpZRUVZZTJJSDJlcWVubUY0Q3puMnpTZEU1WG9Cbis1TGIxZEFkQXpRaTFWMTdwTzF3NmI3WHVrZnN0N2o3REJoUnp3eDNmZkRYUzUzc21nMU9kbjJhN016cHErbVJxUkhJR2lvVTNCWHR0akJ0M0VDT29hdzh5NE5oSnEvVDhUTVR2SklGRThWemFhVzdoQ3dJV05UV1JKY0R3dFNpalFlV3dXb2EzU1pqQkxkbVRTbmh5RVJJTE5KcXFlQ0FTMGsrQzBqUHk0U0lBYnRwMEFJNU05YlZZczd0d3NIejdCQ2hLdUZTVVFlaVdZK3JiRWxrQzZ0ZzYrWWJLN1h1bnU5K1BRRkVLMUdSMUtTeU43ZmFjbWtJbTBMZ2RLSXhpc2J3MDRjS2x5QWNJZ0swTldTTG1WdU1iSEVSd2V4anRWYkJvemJRcnhNanBCVjV0ZlZDcjBnREZobSt0bUhXbkwrbElsVjZXajJ3TWFSaXBjZ3ZCdDBmekNsS1hSc2V6TkxPL3RYVFJnWEVxVnFNRmdYWHAzVnczaFlVSEoyTThhejdMblYrSDVIdm5sdVpUbW40dDdmcmJoZDNYMjBUbU1YYm9vSGFRdUE5dDQyQmJiZ2xaRDVwcndGSEdRZlZJbGQ2WkxvSCtrWmltWFlsRStRWTdCdVVkejRkTW1IZGJ1Q09RejdXb3d4L3ZQRC9tRFMwcGFkalNjTmpIVjBRUXpIbUtEa0t6VzJiVDRLamo5NkErOFhpcm5CRmJDWU1vMWhuSzBqK2JaVngzWk9qdEs5ejBJeTFwcUZvYXBBZlE5WHFIS0VJZDd3NjVwbVBPSENKaHJaNW5odWh3OHZCWjBrb0FIVE9xcXRIcElmOXBneTE4NnVUdldTQU83aUg1U2ZiMnFzMmExUk1rSkg5Mll0NGdRaTI0WXZ6S0g2Z1ZITVlqbEQzSGh3dC9BNnZpUVlaSjhOMi9zTFRkZ3o2QVd6QkpVbGl1UmdScWxaU042WVFraThsMUl0ejRqTFZTMlBPMW92TlltbzJZNGE5UzlVRmFCTVkzNUdBZDIxN014L252a3Y1c1NiamhRcVJ0TlI0a0Z2UWo0MWo5cy85WlQ2dzdjZWJ6cEljTDFpbk4rc01aWW91cy9tSXBMSEhQVmVEREJHTVl3bmJXa0lSSEw0enhQT0Q5bUxENGhMN0dmSWxOUEpQRFcvcnp2YSs4M29rSXBYTjZxN1JuQkdra0taR1hHQkZTbDAydTN1cFVwRzkzOG5hMm1Ub3JEWldibWt1ZXRUK0l1WXJTVWdWWEdMaG5LcDk2clVWRXplNE53RFFDQmJVbVRwTlFiMHJQQkVDS1J4bGprZ3doQ1NjcVl6MmUzZ2dRMnF1VnRwZzhHVDlmdDJqMnRXNTNzcmlDR1ZoSkdnOXNrS2lxTFlUY085YUVNVzJTT240SVlmelhJNVlRdGJ5Q2l0RXRZemNydzBMeW9GaUhsbDRJVzc2VUJ0Q001U3IzSnN0RmRjNlUrVGtYT3hEU2V1Mno2dmZoS0F0OStJR0dLREdnOTlBWm9TNXFyRm5LdThRK2JpeFVtdjNjKzFJZjk3cDJzOWN5TG9Ob2l3eGVabU8zUmFNUUM3RmxRSXJENzJteHhrVFZ4NldDNVlhRW1sQWNrSm1jd2EvWko1bStWZ0RGSjFod3RFejF3YzArZjdONEtlRng3eEl1N3BLc2NVRVUwSWQ1SmdpelhWTUF4eUFHbmtNUnRSVFNmcjFpMlo3L1k0RlV3M3l0Zy91ZFF5UTR5ZTQ5Z200YWU0OTB2YXNjSWtwQ014WUVzdWIvV0NhOHZqTkh2OHlyOG96Q1BxNDU3cmpIOEl3NVFSUlVzNGZialBSVk56TTFRU3RRamo2bmtZaDgwRm5XcHVaR2VETzl0Ym5kbEhhYXlJZExlT1ZyM2tFSFQxYW1vZkh2SUdLUSs1cmdiTlR4K01xenpaRHRMTkYvWU5vUkp1bm5YUUhkc2gvbDI3WTdIcnFzR1Z1S0lCK1Jnek5VYnVaM0dnMUlpU0dXcDhlUGtqeFJGWElMdlRwVnBkRGtlWlpjVFc4T2FwQjY0L211Rjd3Z0Y5NWRXOXhJRWtURlY4bFlxK3JpcFhFc1N6bFRqNkxIdTdVaG5WZ2pEbkFmMTN5bm5UM0FsK0NWUHpDYVpMNEVFZmc1Tm9lSkdxM3doaDRnbSs0Z3FLVVplVjBDOU9tbFh5YWVJU2JIeHRiN0RoR2t4Rm5KN0Q5SUo5RWF1cUFvdXg4T3B1cGlyY0dpOFF2TDFocTBRSURaR1NtcmFyaWJjNlNVbFJ2VkRhMU43Vzl1cVIybUNKT0tlN1NOdmRaaHUwakxrY25jajhOWkIxV2RqQ1dxeFZBQWJOcmo3VGFsWFZISjl4WldoNVhrRjBET29qNW1HVlhhZmd0c01mV015cnlwT0VKVXYwa2Q4UzRaT1ErNHd0aXdNYUswc0ZaVk1zbjlmYXd4WDFuVTFGYTJyMENqcDBrN1FXK282OUZpZ3VqM2t3UmNjeVNKdVV6dFRZcGpad0U1ZVNMc1g2VS94S1BNMWlyMjY1S1g0QVRjY1AwVXJEY241RXhBL25wYndvTzRVb05jWWZaTHg3UkR3N0FvT1VpcDFUdjh4TzFFY0lIOStiWGhwdEdWbGJ4bTNsUTl2cWdpRnhaYkJWbThyd0RUNXl6MU9Ka21EbGthTkRUL0Z4bnQxMU1QdlRpK1B3eWVXWFVtNjVNTEtndk1JUHBsYzZaNWJaNFlIQ05YNEpiRzlVQjNJY0MwTEE0YTljT0doNzN4MEIwdU54MWRORkVTeVI5M2NuUDNtbVNJaWdpV0hUSm03ZERVWUJXVVJ2Z2JWSCtpTS81ekI5ZDQxNXlQSyswSU9QMU4rejZ4d3g5SU95Y3pwMVYza1lRbUxNY0t5VVJYZzNwSjVDRG5leDgvWUlYWWNsamR3T1VzbUNLcCtRdDRtcGFRNitJQUdHb1haQmc3b0VhdFU5RHhqRmxBSlJWSmdWZm9WTlZaM1o3Y0VNSnE2ZG1MT2ZOclJuTTVzbGJWYnpaRVFtczZTdGpDQmM2RUl3QU96aDZVdHdHbHFQRUZNU0tTU2VsMXRTUzFqc3lNUWFhQkRpWjdhR2JMbVRHeDBMeFhnUEV1dWNXTVZ3eS8wVERMdW9FcGo5Rkk3dG5RM1BnbW9FcHBqMzhXUFZ3a3hpU01WREdkcFFXWFhsajhQVXNaanJNOFJuWmpuaVM5NE9TZ0w3akx1SDE0dGFCVWR4TjJSMjBrb1pjSFRFWDFGSjJETFBnZ2V5NkVTUTltUmhsMGpzSVpOOGYvV3JoY2tseXFOUitFRUdyeVNjcFE3M3dTNGp4SlpaRFVKZ1R6NFJ5NmV2VGFkaXRGaU10WXpXSUQ5VCt0K2UvbzVacFdLeWhNd3c3T0NOV1BsbkprbHM1NG5qcm1aa20vZTl1SWVuNGlhSjBLSEdtNXNVd09vUnk5ZG94ZWhtN1BEamhTODhKNHIvb0g3ZTF2MWFTMklPaDdJNm5ZcmNGL3JhTGxNSEtETTVmV1pGNm80czZodiswSUdOTi9BRmdWd3lMZm9WUWkzNWcyMWxDRGJnZ3RhY29CTTJIM0w5T0FJaU9ZdTc4c3d5aSt1YWlTbktPdmhPOTFSS2lyNmlJZ0t1TzMwVFpUV3R6cVJYVTVxcEtRRXRGT011Zko0QzdScGFXck9MRmpVUDNPdGhPN21GUVl2NnJ2L2sxUFcxT0g2TFNsU1hraHlvU3NseW8vaWNLckdrWFlkWFkwV0RGaGVmaGFVZVpEc21ib3hudEsyaFdaenl4YnlNNDRDdU1taVZtSWtyQldiQ21GTEgwbzUxbGZpM3d5Y3VvRHNQViszWkEvNkFhb3VqZmdEZk5vQ3ZyTlZnS3VQVnNkdTNjNG9TaHZaVnNCMUxPN1FadUJOeUFpYWhLMHJVQXhFQ0NwOUVnRUFmeTZRUXRRb251amI2allrcWg1UUYrVlBkTTJxSHRDaGdwK1lpRVpMbVYxQmFYeDZ2SVBJSGZtR2dSZFVoYW5GbGNLQXQ1ZFRDQzk2VFE0N0lRc0lwYUgvdVhFQVNwWU9ZTHh2dTNMTHRRcVlDbDBhd3RQbE5ZcGJESEpFQ0dtOVpnc0ZMTGxDR3Q4TUgrSytJVVdoUDdEMUNtZ2IraDJnSVZURXdKdmt1VjVGY281aXhYS2VQNDl3bktReUwwc0ZBWTdLZC9ISVJqbXhPTG5tMDIzQTdmcUdZejBuZ2hhNWloK0xyZ3ZLdWh1d3lGcnR1bzZodmx2NnJ0Q2I0TXYyTitJRUlvZ2ZxMitPVGRVb1BCY0M4d0hIRVcxWG5BNm1aK3l1SW1wSjlrN1ZWOTh5YzZoZWlxMzd5MHNaQmJBaExGdi9LYkJ2Z3JUMy92TzAxd2MzZ09mRkRuZkZrbWQ5eUZGcXFodEU1bU5PY0RFdVdUcUlmTWxjQU1Xc1BPTSt6Zzh1c0dPOTgxZ1I3Y3A4aGJ3RC9OWGVaZVh3aW5rVmRSdDdDaXJ0UzlTVkNXK0RnNGZyTjNDU1E1cGpOSjVmdWFybDRkMXFpeTdML2x0S2s0alU5a001UU5YKzYwbjRTckw0UGM5L2JtdHRXbi9ScmpTenh3ZFl6SjlnWjc3ZytsVmk0R2RnN0R5MStSK2V2enBnSFRkSDNITm1tWmtlaTBsd3N5bXVCK3pxWkluMFcxRHhLSGs4Zy9CUSttS1ppcWlLQ2R0TDVzbXJxd21vYXJHZEdhSkREaDBnZGYzdkJEVGdKbUMwaHM2OUJ1Rlg4M1d3Zy92NlJvS0hiTEM1SkhQVnRCakx4d2VHR0dENFRzOEpFN1N1MldKcXk4TGgwM3BGRFBRRDZCdGwzMmpsVzVza3FOVjMySThweTJNYWFEMjFqYi9SUVRDR1BlNWxxRFVtMytGaEQzNlZQTERZWjZYNmxwcCsvZitjMHRPWGZiRk9jUThOUmFHZTB2VUZ5MzRVTjlTR3Qzck9LcmkrNzRzUE9mVGtEYzNEVHhMWStGS2NNYnkzYWh6blhnYVB2eDlpOTVtNnlwSWQ0VDkwUnA5TWpOTEptWU5tV1BsYmNxSHZ6WUQrbk5kS2NxUTNuMnZBTkZTNXExZnh6a1NoUUdVazV5T1ArNUlHWDJHRXMwNXZseHkwSG5SZnFISHJzVEQ5eC9LdnpNQ1NuYWZEaXFXYW5Gc0k1ZmpPeFpsVmFzZGdoeWtTRUh2b2EvMEJzYTJVV3BBNnIyMTZzYVBlWTlGWWYyb3o5bjRWa2lrRXYwUFZldkZkYk5melRteXcra0xpN1RPSEoxbmhmZGdISXVxWUxHSjRsaEh2QjRUcmVLM3cyelF0ell3OTRFNTNvMEw0Si9iTWRtMzVaUHdUVkJOeGp2b2pKakFOYTJxemFoMWxjdFVEc0t3RnhjYlBsTTJmbTlRL3lTY2xqRDlpL0N2Nllab0pmUEQ2ZWdoeHp3bkpjOW5GUlRXelVMcDkyeTRBNVJlRk16bzZtSnBqVk51ekVlb1FIZjFCVG1WZnJkTVVjbk1pNGlXZTZrbGF1MWhtZFhFVDdla05EOEE3ckFReSsxc2IxMHE1eklsbGxsYWdIa3JIRDBzZVp5L0FiYzJvN05pS1FhdlBFbEhjY3FuRzlLS0I3a0NhTTN2VWJvNWpzRk9tOTJRWU51UmZLWjBOdVZ2dHZrMWVldUhlN2JKT3hPT2ZIMkFncFpla2QrRCt5Si84VHgwTjFiWGplcGhpaHlSSFZ1QXdJcHMveDNJMlVwU0hYejlBOEdPQ1VPU1d4cnJlUEVoT0grczc4Q2RidmlaWHhYOEJtK1lwQkNPQmpVaFhycFBnNUYxU0ptRDNqUk55TU8rQmtyNk5sSUVidng3cDRieGZ2bWJQQ1NCaUNYQm5DTFhCcTdNd1I1Q2ZQNlhoNnl0NWQvSUlHbHlsaDVXT1JTckNJVGwydnB5cTR0c3ZFNm1Ec2Q4TWFsaFdUWVJlRVdRNHVHWGdPdkJtbkU1U2t4M2NZbEJWMzdrRVVDdlRPb05pVHFDMGF4R2JMS3dzVUxncnJhOGxGcS83WGlpM1lhc1BpaUswZElqNjN1NkNISG1NdWhSWUorUUt1SHJmMUFjTGd2U1ovNGo4U3ROaFNFbTZrYzRMMWN4Umk0QmhmYjh5bnA2SVRIUlZtUG5wUnBKNld3NGRSWGRxeC9DRjFDQ2UwYkxLOWFXaWxpWTdWbUVRdzBqNS85cTJ5RnBZVlg1VnBjcUtOZkJRVlR0ZTh5U1VrMlZhZGd1eStBYXBmUHBtVndTaWV0UGliWjVWNkliSmpvMUlmbWl6eVhpY2poN2FDdzVGT21XZFpCdUhIVlVFdkMrV3Z1a0UxRXZiUFJTcTNZVHdGOUFROUZQTVJsUk5zbDFjQWt0TmV5NExMbWIwNjBhQjdjZ3lzRnQzOEJqZEZIVkFQbGZRVjhnYWlEQ3hvY2lRdXBoalBzdDNzdzRYVURVbllKN296VWVQWThyMG9UQ3dRVVdpS3QwVkZ6bkhQSWd2WjZ6MEpwQTY3YytZeDV4VUFnRWZxRWFNSmdHYzVvaXE3WWhaZUhWNjh3N3VVb3plTWJRSlZmZTBlWStOLzZxWmlPK2RDc2Q2WGNQSEVNOUxtbWVScklzR0pHK1IzQUQwQzRzRHBGbmZ5OS9VZ2htc21acER0dXcwbmxJWDU0czJBTEVlQlFMV3JPU3FaTk1vM2k4QW9TWVRtKzJQbGNFOStSQnRSZWlHaGhBc0RLY0VzUkl5YjViOVo5bjQ3bHJYZ3FlV0IrTXlTNnVpVGN5QnhUWE44OEJiUy9VL2dLQ0pwZUhkdVVSMHc2c1h0cFE1dm1WVStSbnh1VVdOWGliUi9DT0NPeWlHSU56QkRIYlpTWkpMNVF4U0M0ZkQzVDY5T3ZlYlhlcTJOdTBZcnAyOUFSVFRhUmNVYVc5d2xhRDluZ1FwVWlvRFM1KzdmZk9aa3JSa0MraHBoTERna3BteE94RmtmSWtTQU5tYUl3R2x2aUVxaEFSR2JRRHRYaTZFckhtV2h5VjExWTd4MUtCaU1CR0R3QllpaVpBMFVyOHM0cnFIMXM0a2xpRGVKaEZqd3dBUXBPSjNUaWhNeDBnUGRzWGFvTGlVY3Rid1hEV3ZsR0RWMWRtU0tuZUZ2TndmZzlMbkhqeG5tcUlJVDhDNnNEdlFyclZVNmhvY2pxeTVlVzMyWC84cHVLMkdwdEVEakpVWG8rcVRkdVp2SnBoeTBEWG41YUwwUUdFMnJEazI3MXpDaTVkNTVEck52MS9HY1NKVU1ScStsKzVRL2FVMnlJcUdZOGNNR29qdUFxc0c4bk5ORDdnUW04b2FNWGtaM3JTck9udnlMc3lGK2FYRGpOc0xRNVk3L0N4TTdZUVk1NDB2amxVajJ5QzJRbkFIRGtZNEVFaForTjAzMG1jWXdMU2xIMVZMTTc4Q3VXNjNuMUVJbGpmVVlaT2J2VW1XcWlIVEpDQVZzOGlCK1lRYU1XaEIwZmlyLzQvVndNOU8xNDVLYkdEeExVS3RwYnQ0ZDllVzcxUDBGSjNoV1ZHSlRudHY3dnlOcytJQlh5WU43RlJ6VkhQbkh3b3JuOWV5c1BpSmg0d0NSOGV4ZXR1c0U4ZnRjU20vMnpIN053cFoyTnBiU2lDblRrK1VzVHFUa1gwd1UyRXF5UW0vMGNwK0tPVk85MkJFRjlkSnBNNmpaWWlpMUsvUm9yMHpsZXlsYjdRa0pWUVJCTlpOblg3emVSMVNCcVlZbUtZWWtNYmgzeHJwK2dSa3gydm1Pa1RoUGxoVFNOcFMzbmN4c1h5UWhGdW8yUjZUZEtRRzJaOXd1bTFHMnc3MktXQk9UbnZBc2dwc2pCSlc4ZU9VSzA1WEtoR3g0dzFGV29DdEtneVk3Vk1PUjRRWW9oNDRHc05kMC96Z1U3dWRZVFdISHFjZnhWNGxEWjV0ZGdYSi9JenppSUxweEZ5Nnk3ZkpUSTRzanV0MDlRWG5kbElCK1IyWFUrU1paVjBmWVJMQWg0UVdiTlBmMGQxQ0FBYnJIMG5McHEwdm0raXRHYWpMbmVMZTRMc2NWYWM5MWRlb3RvbTd4MXdBZFI0QU0xR202Z29mTURHMFhYb0xFTHpNQjNOVWpzYitnK1RGMmQxVHJLeWlRTUZnUGU4bVNTUXN1a3EyOXYyUGZRV3liU2xIdlJsb3B4OUdTUnNzdjU1TTZ4NGF0RFJWdzhLUldYYXNvWk5LY2ljWTZxcXJsaHhROXJwQ1J0WUhQTFpuMlpMVjlIUG9oS0crT25ySDl4SGJKZ3c2eGd0VmFvNEpOejFIWDRIZnJGRFJhZnU1T3plMnY3OVNUVWxwK2h2OFJtdlpvWWxQMFk3OWErcXVwOHJkVDdPeXdrN200c3luMUM1QkdKUEZLMDczTEhuRnNiWVJ2V0JNTE5mQ1lDa1hJVG1qN2dySXdCNkFpOVpZbEExVXNueHF3Y3VQOEYyV1FGRzJYSHFzaDkxdmlRUWVhTTZGVzNOT1R0UkIxeXFkV0RVakRjWU5hSHhnNmJnVzM2QmFGMm14NFlkbFc4clFZSTExeWNlQmNuVDNhdGNsZHkxU0VNU1NaVS9vTm9VeEd4U0xzNm1NY0lVVVV4bERyeHpOcXo0WjR6NlhuZm9qUURXZUdZTkJrOU1oaDkvNmN5VFRLNXZLOUFPaVJleUc0L2JUcnNwaC9YU1lyeDRGQmRVSUpzK3M5Q3FqUW9kY0NsR3prRzR5SDIwNUc0NkFPSE41dFdDa1RHVThVMU15endQMnRrcmFhajE0bkZpNUcyS21BdFB4dE0xSUhQeUN6OStNTlBHRTBkalQ4RkFmUDZyUGllVG5iaWpQK0dLVEJ1NmhHL0l6dHhZWFU0Y3ZHT2VEVnB4dDNTN3hleDZVczZSMTRwK1FuaXdyK2x5RWc4cmFwWE5OOHNqUGpKeUhlTW9QS3RoTUNJS0pJR0NGRm5RR1BlcTgwQWFnZlY1MG8yWlh3MmNkNitaZy9oN29uc3BIS0Vzd3ZMR1pCd0tCRmRySzc1WWV3c0xQUTNmUlJ5ay8zTk9IY0tuMWZzVkorRmJYZjRVWlRYbWZVQkxWS0h2UVR2d01LejhBVVJsVGQrNmxxWmxpd3pQMkFaUlpTeGZIY0hDRzVXN0N2MVVtQTZ5dUc5T1RWL2VqcVV6bmJKZHkvbXdXd1ZkdXozZkp1SmY2b1RsRyszNWZORWRLY2poVzc5ZXNPOW9wcEVVSm1TODJPQWt4azNaZ2lWbVBKZWVIbHlsNUhGcGpLdStVVXhwRjNHT3IrOW1uMmxlU0dMOG45Smt5cEdRazRVUlQ1bS9Yc281bFBUR0l2MGs1NENQeFJVaEhsVllVRlR3OWtxbjR5SENOK1pIYkNKT0dnUVZua25XaldGamw1S3M4Y2FGTk12dGthNGFuVm43bFRrT0ZKcllFT1hjWFJNRnJQOEZjbjZiaGlRVGd5ZVlXY2V3NVUrVnZGckxDQmkxN3A0TjBodWpGRzlSQU12OU1XWEhCZXlhM1U1WWlmU1cyczNraVBmaEVEcG9zcEZlSWFLSm5rV3RkeUtDZC9RbitiQlRPOVA0QTNTTmZucDBKMTVETVFHMVhRV0ZidGM1Q1M1R1VqWGg4cU9xNjVQeHpEMUdHNEF2cm1GYUZQRW9WbEZWQmxpc1BUTmdNK3ByK1BMTXcwd0Y1SXB3emhlc2V6cXhmSDQrVkNLYWlKazRJeDNSQjNtc2t0VWZ1cEZBVi9VeWhsRWlQaUczT0R5Q2tKbUJuODN2Rks2OWhDNDJMZFFURzEvSlpiZW9QSzdOM3NKOEwvNmp6TVlsUTBPT1J3bUpSQVZGVUdwTE1QZmVGbTVuTVUvRk9LUHRHVzJoOFRlNXVzbGFta3NKMU8rNWk2MEF2ZjlIZ2lZSXdIbVpQTnBJcFRsOS9TT2dwZXY5cEs1ckVWeWx0SGJDTFdla0dEaU53b1RLRFZMN3NGSThGd2VzS29kRk4veExYb0xFRmNyTFM4cTlVZUJVMmlZSzdQeEQ2QWw5MjYxY0lUT25pR1JmQmdkby9pVWlBcCtvRmZJc2wrb1NDbStOSU5DY0xwdldGYXIrV0ZBTHZpa2RuVUV4MzNiSHh6cWxGUFMyWmNPTHhmV3poZGFYWEpsL3NTUzNXYlY1OWtLV0NKcTBtQmt3dGt4YkZkSS9TU2JIdkJGcmtNcGIwTWRzYWNaL0ZGRWdRd0UzYUdOREF4STJIaFJkYS90Z0FxNjV0c0VjQWxYR1ZJb1l4dS83cFJvVXdZeG5reE1ocEpwVFYwSVVCZDhNSVNENnhkRGphTE95M0VNWWF4VURFamY3NndJS0l2S0dpUzVMQUxJTCtCRSt3S0FnSWo5TVM2cGdnUVdLcXpjWDJSWW51SUJzaUt0Zm0wMVJaTDlnUHFBT0xrMkg2QklQbTFqWm9vSUhtVERzZmlPZFJPa3pDNXVkenN2NHh5b0hTYXRuOHdUZXB6Z0VqaGlwaTFhQzkvaUw3Vi82aG51OUhFOFBMOVgxYTNkaFY3Q1htOW5vRjhjZ2ZJOUUvMTJndTE0cGUxakNhR0wrYkt4eERIRHdncXBYbU1oNzB5QS9taVd4WWV4cExTdGR3Nm9UQXBzZWVkNWtsRXhzRHBvOGEzS2NvdThDcGd5QURNdTByUTg1Vm1ScGpudGxXTnBYQUhOYnp2aVpWRGQ0OXZvU1FMbG53cVgxdEhOZlNPaUJxVEFobDRVZFRHMTJIU3NPUWRDU0psOWF3UzVDYWhXUU5uejVWeC8vVi9DWDFYWWhNNWxuWGdRMkxxRUN3UlV3YmNTbmZMaTJ2cS9rZ1pGYi9wSVBTL0VaeFlUQ2Jwa0VHRkc3VXZyREd0M0FrTENEQ2VURlhmS2htSUoxNXBZSkNzZnVWeS8rZnNQVnlTekhnMTRXeXFXR09ZSS9WQS84ZmozSGttcFc3Z2JZb3ZwaW5jR2dPSlpNY0VrcDY0UXF1UnlTVkhUR2pDUm10MDJwVUh4NS9BS2pMbEFCcWFLZ2hKZXpXYWxlektSekhFS0VnV3UvNTNmZVQ2NWdQMFQyUlR5d2J5ZFd2WkRDK0Rzc1VsYWRPSkVSekY2ZFlMbDBwRUFDVEtVNGFWN3FPV0ZLN3BrTFVBSXRXTXNHcnFTRnVoaGF3U0IvOUk3UlhmdUYwNzBxRzJnV3F5b2JpMy9iYy83RHQwNEtBR2xlSlpCRjk4WVRrbEJkY3RzeUFwelM4b1pIcXBKSXFPTWhtcDZYMTlYaEVqb3F0TS9mN0hHSkV3NUZUSFRJQm9IVXR5RXBhYjJNMTNHdDBaRkQ0SEJSQXdsRmlNQzR1U1h2L05LWjJLdjVsaWhYZnZwVGU4clpzcERkQTJRRmRMUElLWWRpZXhjYm40UUFtZWRmZlpTRmhDRGxlMmZ5My84aU5VeUdaSWkyYUo4L1dmYk9rVXhRb0ZlYzdQa210eERvYkMvbmt6VlRjZXV5Y3RNdzZ1d1pjTzZCWUE0Q2ZYZlBpZ0VLR2lROXZBOUgvdTJoUmRySzdPMnNENUR0Uko2OFZYaGFWR2ZnVGdKY2V1OHlielBnRTZHVmpIRjkxaUIwK1NiRHRPMzkzTWk0MTR5UHlFRTNTMmUxMlVhakVqNHpaMVo4K3FrQmQ1ZkZwVGR4Tmc2MEIxSXM3VVpDRFlQa3dETVVuVmp2V2VKVThrSTd5SWQ5clVzbTNCWmJLaHl6bU5zWHl4RlJ4VzVzRzhHdG5FSGNlODFsNEE3YVhheENjem82c2F2VTA1NE0yTzZ4cUpTL2JBUWo3aGVvdFRRbWoxVG1LVWJQTVFjNldSVXlIVTVna0pvK3p0NjlsNTd3bVVubW5waVZhNlkzME1CWnJ0VE11MmRNa2hOWEkyVm5hRklra2JaKzZMekRBQ2hpV3ZENnc0bVMzUUVSK3lzajNncnVEMnJQODVHZVRqZG5TbUNhVG1NODVjbnZPY0gxVEp6Tng2OFhFd0tSRHF3MHFzZGdkK2hkaVk0OHY0dUpoMjUzR0tMUEpyRVFpUVZaVEFOb01lSEt1RUl2aFZVQjJBWkY2RG84RkJPUUE4cE5zN0dySFcxcWsvQmZ1aDZtampQV3hVT0tWVURYek5sTUNtVHBVTmloZzhXSWllSFp0ejJibjRtaUpLLzQ5UEs1Z3RMcjBYMGJ0d1Aya2UwamZCSlJreWJuaXBieTI2WEFSN2hGSWM2a1paTGtreHJ0dmRRWDNWaWFCZWg4QWxVTEFwY0QvcW1oUEJmQ2NiL0JCOGRYcCtuUkRuM2xPLzkrd3Y5RDRya2NpM2I5M3kyNk1TT09SbVQ5ODNZM1Z0b09jaXlVbVJWaThoTkloa2lPOGZ3djczYmFxUEFScUJDZGNnZ0lFMks5YVh5S09GdWg5N3lFbzQ4a09aYVJMTkhQM2NDYi9PZ2sydmNQQkRFdE1DTFRNck1JNEZxelV0cEl5eUVFRjdKTnVYOTBNNnkyZjhXcEtFdHpwM21ObTg3K0lGUkttSmhYbjFaVmZWd0VVREFmVlY0RTRvZXMrdmlEdGZPVGVaczIvdk1jSTZYbVJ5QitZMzFSUGk1R0hHeDJVZUhzRDdvblJpVnZIdUZRSXdKN1NtQllCd3JhU05Hdyt3ZC9rcERFazh5WFowVFNoUUZlNldaVEhSTy9jQWdOK2hiQWdNYVc5QWxmZk10VzBUWjBjU3k2RjdtbWpxYmRSNFpyWTNucjZjWllFaUsyRFdVWFI1L201K0pQQUlwdTRvSjFVV3YzVnl4QllZcWtJWnFxbUluUVY2ejAwWWVOV3Q0NHVVdWpmUjN4eEV5TU1EdUp1aVlHTlZwc25QS2sybC82b3pKUGJ0SVEzR2w4NmRFTEZjNnQ5VE4yT2IyYUZGbTBLb3BnR1Y5YTFrdXdWZ1dETE9ldVY3YklYM1pUT1lScXl0NmM3dlpmQjR3bGU2ZXc2Tko4UHpUL2dVZnhYd3g5RFpMcGo4cWlGSDBxNTI5Snh3VE93Q2g1cFBqclh6ZUp2VFpwbUVsSzgyYVJ0QmFJNFB4MGc3b2srbi96djIrYjE4UzQ4WjRtM3gzWmVnSzJsMHNDZTR0SWhPZXJXM3BHUk5qWUVRd2E1dUhVdVJGMnR1NkJrclhZSEYzcDMzSXNFOVN6c2VBcVBCWjNsc2NMSHk3dDJ6NUEzSGs1UCtuQmFzNUJTVjZBVjdJQ1l4WU95LzE4YTU1NEgrQ1d3MGxGdHpwL3FlSnZGL0NEL0VjblVKQUhmaHdOUkRFM1k3cFJXcUFxMURDajF1cGhMQzZkOFBucHgrcE00TWxJUHBQV1dFMkJHeEZVT0xaZEpJVlFsTlZQOWRBNUFCd0Ivc09nZlQwT1NFNkhVK1NyZDFscnpVUGdNVGF0bmFQQjlmTWhEWWVPWFRabVp2SDlET1pKcmNWZm5zNGM3eFliT3IweW8xYlN0YmhsN3VRYU5JRDQ2T1kzQUhraW9mbHhRM3ZNME5vR3V5dmpkd0VCdjVLNm1PR0hhaGRHdWtTWTJ3TmZmUDJtcjcxU0U3RVJaSlpVZFZNWERaTUZaWGx2SDFURWI2b3AwN0pURDNOc3pPaEtNYW1FWlhSem9BVWV3RUpGYjhEb3U0VEt1bTBjYVZvTzR4bHE0Y1c2aDZjQW5pRUtYNDNKM0RqRE1VUUxOQUlmaGplVUFWNUw3eDE4em5tc2NhTHdzY2p5aXp1WW1hSVdpV1J3OUtYVm52VWJyMEJ5dXRCcUZNdDgrcStLTndxV2s3ZmdIbm53eTQ2UXFKalp1dU5NdFliWkNWRkduTGRSZkt6UFcvRXQzVEFlMDVjV0dxY0krZ1JSeU5IR1k2Z2dQRC8vWFVUUktNL1NUWUhNUWlEVW9tYmxDNDNWV2w1VVFIMnZrMUEvSHFWRk9zakhQeUthOFpWVzJlS2xSOVVFcGJYVWQ0eGc0bDFrTmFNUDlTT0ZTcVZKaWcvTjVhcTRqQ3krQ1R1TTNxMVNpOHlraTBoa0RJR1hKOE9YSkVFdndyY0VBUFovS0dYRXB0VThBQnFlYmNRbDE3bzFITnVBQ1dTcFRBd2w5MU5XWHV6RVFrOUt2bHMrdG5JWC9WK2ZiYllKWHk5M2VwNWZSQXdtMTBhbnk5K1hhSDE3VTBVNEs3MnZMSTJIVDhnSGx1VTd2S0c1ZGtSdHF5amxZWVh0bU5PRURWUitnRUZLcTFZbVkxUEdYRjl4ckVNcm55OTYvcGdiWTlaQ2lSdkkyTG04ZHpYUDhrMEV0djB2d0xNZVVtalY3ckxHKy9yZWRLUWg3T3ZuSGgzOXU2NCtEVzk1akdJTXlXUXVuRmM4TWcxSTJRMEwra1BPemN5R2VCS3FVSmhrWG16SHFNaXFGaXRpNS9TTmNQNVRrWm5xcWdqeVBTV1ZOM2hnTXhNNVFtNnJVMkhLeVJqYjJiRm9mcFNLWEg4ZW13QW1mbFFMS2Ivbkl1WXVqZW5DbHdDTEk0L2JKL0loTkVPQ096SG5SZkJNNFpTeXgrZmVsTzliVkU4TXZmTEtKeHRQVkUxRysweDYrRjcxeEF0Q1BYcGlpZW9la0ZnelZjc2RjMENqTkFuUS9aTnIzM1ZtcVVBdmFTUEJuUGxvaEs3NmwwWmx0OVJUODFONk01UWVnTE03WnJRczZMaE1TQ3pDcmJvZ0FRaTVIb24yMENOUzZ5RUptQnhySTR4Mlh4a1VUOXA0czZob3V3YkozcVNDVkFWTmUvbGFRa0FjaEszdjUvOTlRK3RiNVJEbGRrMlpGazdVOU4yai9DTWZXY3NJa2tPZm9MRUhLdUNUMDUrNXQybEdSMmpOV0JZVXpxQ2xiZnIyU2Y5WkpvbE9nbGlSQjBqY3B5WmkvcDZqT2lKM01JU3drNGRCVFRBN210emhzdjloZzMvekgwdzN0ZEptU0M0RjZxTzNCbFhjVit6TVF3OWF2bnZvaFJaRitDM2FxWTZXcWZ5MzcrQkc0aVFIb2p1VTMxNzVJWWI3NUR3ZC9ucVdtWVc1aDlXSG90aXR6MXBBS2U0K3BhSHp0bnZwRHVqVWRHdnFvalhZdm1ENERyQ3dRVGNPZzJVWUxZMDAvbk5kZGRTK040YWYwYVpCYUo0aHR5Y1RxZloyWHNXV2E2L2lhSkwvWFB4WTMrYm5CVjI2YmtndFBubldwY1VhSk1UNGVNNFRzSTRkRkJwb2YvYW92eDQ5RjlPcEJWSEEraktUYTBWSmZrMEl4WlZ2T3ViaXNBeW1SVXE2bk40QjlFK0NJcFZHVGd2U3BJK2pRWFUxck1ZbE5UeXBsUmtJRGQvS1dMZWZhcVFmUlRwSERDa0Mwbi9KU0k1VTFlVmxZNkdhVG9Nc0pyS3lkV0crNHRlUmJELzU5ZGRvNDdxd0hXaDZMN1hFRzV1dVg1N3BkM0xWSU5tRjg2Wko4QzFPRWZSK2MyUG9WM2NMWXFpbkJKQkZhVUlGZUtIU3FveWl4RkNzMnlhRGRQb3N1T0EwQzkyL3ZJNXFKZUZPWHJ3QVY3NG9FaVRab3Y1cWMzRWhTd2xEdFpoR3pPQXh2REpKdnMrUndmMkFHRzJuWVpPdnB6ekhHY21ReFBROUtMTi9RTENDZzljRzdnSEVSZlJKdXU3U3RiYnFTWWlkTkhBcEVoTDUyWW9LRlo4K0tDSjlWTExnbzIxanJraG1kME9CZEFUVC8zSXplTWhVZWYyenkrNXNnbVk2Qmw1bjBoOHR0bkR1VkpyQjZNTkQ5UEtmTFBKeGVwU0Q5ZHpEZ2NxN1hKcVhqTktNcFd2MXBCTjkwQnJkVmNNamdjVC9QUm5TR1BIbTdrUFFDbkRaVHR0aEpVM1FQamdlUW15SXVGeThoODhvU2IxMDlNSG5UOGVQNVpTZUwzSzNrTzlKK1VNOW5RWjVwRG0wVVdRelVvQUdSUGh1N0tlWkFpYjFmcTJuNkY2TDk4SjZLZVVsVWJWRWJSQml2N1hVZWtweENjdkdEZXNRYlJIdXlkV2xxdER5NVk5OFZvWTZOTmlvbHA3WHk0bUtzSVg5andvLzZRc3gxNjVTYzN2QnJHREtnbUZPL09yRE5GM1ZjR1hhU25qWE5OblA4b2JEY091eTZKNVEwUGdPZ0hrampCSVNPMk5oNXVQdHpTYlc0VWYrb2lianNFOTZCSHNjcXlNOWdReGludzN1eTJQakxSQzYzRjRPYlB3N1J3NDBwN21lNlRVekZ0bGFVRUUrWE9TT21nNDNXbDBWNmlFVkJqRWhpVWhWeENiUWFWRW1VV1pPR3FUREVSdmJGbUhwWDZjeDJZcUIySFhnNGdadWVrc0ZaRmlLck0wclVmaTQrQUZpRmV0SHMyb3FDZXVlTFJ0aGU3aWdrOGxqSEpaZnU4bWJvNk01RysxNU9tSnQzVHJLaHo1enFnMk1RTnE0VWcyTW8yZEJYRVcrRWVQNHcwS1NzOWdsS295Z1BFVnl6aUJaMmwzNHQyY3c1aVVJQWhaSEdCcENuK05DaWYwSFBKMmh0eGhSTVhyS3c0WkI5VXEvVkQ5aVE4M2JYYU1uTmhYUmdyWnFGdHpzWTkwM0x2WGppSWhlc2pCTXV1ZWh6aGJ4cE1EMjdqWEk3dGhyVXBwemhXQllMWlZ0L1dNRmlISmFxTXZrcXZieFFBSXEyeldDUGF3SGQ2U0pKVWZ5SDVhSjhaUHRGbmNkNnROSEhTOHFmenkzQkJwTGtNMUxRdWVMQXZRSVlvd1lsOUtWNXBRWEF2eUlZa3JlU1ZYMEUyTnpTdDNhTllFT0p1Sm9vb2xUcjBsbGZLMmgxZU8rQjhoVW1mbEVzRFhlaG0vYVFvd2JPZnA5TEtvd0lZZUJsZGhtakR3V0tZL2t2UDVwd2VlTFNEaG51VWgyWmIzbjJxMSs3RWk4ejI3L1ZHTW5rY2d1alBnVVp3dzVMNmZPaUhWaGVPZnRhWFFiTnZsMXplbWduSDlrSkNzeWZkZkY1UlR6eEI2dzlyS3k2VlhEM3p6enRaU2VqMjVQYkpTelpSV2lYQksrMlVvQzVaUXFtR2R3aEViL1FFcHk0ZWdqNW5lTXB2UFpXNTF1c3R3Y2VvMEtyOWlMUlczMFdVdFpqamcyQXNkMlpHclB6TzBqY3Mwa2t3Wmlyb002aU1mOXovRTNlaXFBaERMeWJDNlBEd2pCc3AvalV5N0tpZHN0bGtIbkloN05ucmkwdk5XdnR5RmtEVnd5S0FFT2grRHFteFc5dHJDUi93c1o1cjd3eUwrVWdNcEZRWlZORkNTYUtoaFVoU28wWUxpbjB1SXBSNkRqaEdJZEFLQVlTc0pBb3VPd3k5S3FRYVRHeU9JcDhySkxBNXVjaTlydzZmVktzNFJhN2dZVDljakJnQWs4ZXozV0czRUlvbkFVeThRVkNtS0FlT0N6eDA1MXZVNm9XQ1VIU094VUUxVW0zc2lFWkVvSmNnWXl5eDlMcXpsZVV5YnY1Wk0xWnJFUHZXaXNtUWFiaS96T0pTR1lTa2lodHFqSkxEekRqNDhOdVFoeXprM0owZVZsTEg4bzJsTzd0RU1nNmMwZTRJWHdscjRBaW45UEx1VDFpODM0UWQ0dXdwT2dJQ00ySXFOZ3B2TjBRaHNocVJYVWkxRXBGcFJWUzlCNHVsTXdrSSt0cllteGxpVGp1Z1Ntc2RNVEpiRVpSQXNBNzFWWTd3NGtacUZIYWwyTlhJajQ1c1dyd1M1YlBJdEdJcFVBWlpwUkhrallGOVNXMTdNTUppcVV1NW9Dc3h3VUNmTlc2SFJEK1BreSsyTE5rTW9SYzdtajkwczlGNWhTMUF2UjErdndIUkwwblVLOFVEN3NLUTNxaThNSVVVRm1MUXIrWEFVRDNralZtZ1FWbk50ZDY3UVR2TkFxR3V6VnpXVFlsL0FSa3RiamR2ZTUxTHErRWlFYmFIYzJVdWY3V1dJclZKTG56aUpkMVNLYm1JeFlKS0JXN1AzTG1QSm9LcGpxYnF5R0xXOWcyQU4vTnlESWp1cVNUN2RUazBveVk4WkhaaXJDYmM0YXZrWnp6TENldFBHK1c2UTJZdkdPSWk2V2JBbm9FUFA2eVJxbjNvSUo4MitvUU1hUnlYOEtXMGVHQjNzMGZNelBIckltRGRCaTFDWWxSL3hKNVlyQmpGQ1l5YTlOSngrU0IzbXExaGtIN2NUYUg1S2I0VGpRQW1RVmJDR0d2NEtvekZ2WnZBN0Yra2JxOE9mNzRhMHhZUW5PbVExbWRkWlJXSkMzWGtKZ0hOWGl2czB6Z3Vhc0RVQURMRVlBc2V0Q09wczIzVGg2cXdIQ0R2V0dRdDRpNFFvTnRJbTBIVzNJalZKdFR2UHdhWndRcXdrYXZzdFBwNzd5YWdmaDcrMW1STERmRXJHWlpwM0NsUi9mQmpOL1c4V21YelZQM2NBYlg2OGsrOC9EWUlGUWFZaFpYZGh5UXVoVzZHTVFkMTFEZHdtZUpjNE1wV2FZczk5V1lrNUYwQ1VWWUhrZWdhbTE4dXpibldNK05CSEVuTnRGZ05kRzFSNmc4aGtVVldKU1FjSjlDK1BHb0ZwRHVQU1Q4R3RpMGpWbkpkL3ZXbFpJTXhWVXhwWExtRXJKNkxrbGU1TlI2SGJjRTB1ZHk3ci9TdGY2QzBLR294OHJMazJ1RDBIYUdxSVo5S0V6bGx3bEZMNlc2U2tJKzVScEk2bzNHQjNSc3pEQldoR3YrMW0xaHVQeUdINGdjMmJxeFZiSXdsRGx0b3BCUSs1MUhjTmFhTWRqLzB5T2dhQkVlc3Q4TmpIeFRXUUZBWldVWDBOK0JIS0JFUGgwTk1Wc205aVNsUkVLS2tGbTEwc0NpM2YrM05qY1g3Zmp1cU5YVlVIdTloOTF4MHczUERzb1dIdHFHVmV4M3ZQajNRcGR3dWd4TE56SDJFVHphUGxsRlRnbXc3QUFweXZ6Z2lKbFpGS2pFZ2dIUVZCUnN5Q0JBL082RXJ2MW5EM05YUkNLaForMjZyRjVORElIOUlrNnM0Z2pBU05wMjNZSVR5UHd3ZzZDQ1hsaG9QQ3RRTVo4Wk5Bb09JZ3JmaUQvVTJSdExEUzVlVTBRa0krWDd1aGRwdDdtMitjNkhNcU9uVXZjQU9mRzBQTjZhTVBKZmdRcVJxbU5WZXR6c1IrdEpoZ3YvWkZjaGtlU2Vkemp5a25ScFZLek5VbGRVQVdMbFBLTHBKRnNOWmVxYkJPemFmWVZ5QnVLYmFtQkhybi9DbUFiZkw2QVJkRHIrTUJiTjR2THgwaDYrNEI5eG1vUFpMSUpSOTl6SFE1b1FaSnljU3RLeTQ1TkgrQzdLdE1sanhVSTlIM3UrTHFhNVhsTTA1VmlmeEpnUGhUancwLytoM0c0dHI2UG9BWGN6Rm5pTFNKWjV4ano4T1FPKzFjcWoyUml4QTdVRzgveXd3aDdwamJXM21KNXlpOFFpV1gzODg5UW1iRndKV0NUU1pYdSt2ZmxWcXJXblJTMmtyY0tKYkdna1lhamMxUzlvVy9IeTFSb2tvNGpqMzIrL0VXSlQySDRqZFVrZGs0M0QwdFVIdk5vWnhJS0dvZlpQOFJPVFZtbnN5S3huUTg1OWxTUFVlVTJKenAwbnM5eWM0c3g2MlM3U1VDMCtaazlPdnp4RGJNZW45WWVYbkNNL2pHYmw3K3NmbTE3aGx4VFcxZmJiY2lVdDhLeXJSSFZHSXFZQThMZmV4a0pwTHN0TDRDWVVxNFdidll6RUlnQnFEU0hmdnJEbGRDWGJZM0w3ZUhCOHZ5UE16alVLT0x4Yy9xNWF1OUxyYmx5RWlkOHkwOUV1dU85KzN3YkswQ2R5RWh3d2FRa3lFbU5zNU0raERrVjBZcWRJTUZiZWxoTkFnREN0VjF5Q2djUmF2NUVhOUpUbHBnZDM0c3NxZXRnaEpLY011MFp2YStXWWhtaUtXNVoxNXFpMDRoT1ZqK2JuNGFUR3dzUlFhc0t1T1ZaSWVHZnpmVzc2eSt5d1pFKytadGFFbVdGT3RvYWo4SUhTOHJtVzRUNXZwSjllMnRsSFkzM1R6aG9MRG9YVk0xWklaZ0d5dHFqM0EvelR1Z1BCUnZlNEJ1dnJETndub2FrUjg5c1UyckF4Y2JOTnlpMmpRb0JDZzhhSENnRmd2Sk9aNkpWQzZXMFptcHZkaGdpKzcvOE1pRVNFTXVwUkZ3NWlnQmdCT1Ara0JKK29IenpqZ1FZYUx5S1VVV25xMTVZMzUxU1o1cUxuZEtKNUloWE8reko0Nkh1MW9oU3NVRUV0Y3VVQjRUYXAvZDhPWjBVKzhOZFlaWUJrUlhXR0tnV3NEdzNuN2F5VjVqQXVmWU43clIrSDNySVRtazVkN1FZVkJuNC94QkY2ZnR2Zkk3bkI1S3Y4a1VYMmQ2TDVOdG1WZVQxSDNpUlI3akZOeWhKb3pJYUNYQ2wySEhTWk5zNWtXNEFrV3pQU1padTAvYnQ3Ui9vNE9hSDNSTG93MG5uY1IrcGREckdTQ3NvTU9zc2NwbG1SaldCZ09vMjdXajdDK0xnTTJWaUtReDFBWEFsNFdoQnNiOTJaUFJXcEJpdDBZS1R2b24vZWtCYXJ1c0hsdXlmeE9JUHNhK1VkYWpSRmxWRWRvL001dXUwZ1FwRm9zbGp2YmxQVXBxSzNYaVl1cnIyNWx5SW4xREVUdUlsUlgxUEx5VzhwVy9FT3hNdkVlOWVuRVA4bk1BMWJkZ3gzc052RkZOTzNBZDZoYnYzMlBMc0V6eWJUSjdjWVBncm1YMktEUE9Kazl3aDlQZUdUakdiRFBteXlVQWdLbTFMWHJ3RWQ1L2x1NkFjeEVqbWVVNElZUWdpZUlJa1JkVDBteENyWDQ3QmYrSGJlYXZMNHZPWVRlTGdBTmlSclo4eXhYWmNOVlIxNFMxOEE3NXRLMnRUTndFMGRBVXM1ajlZRXZROVA5eExxbUlTR3RnS0d5M2I1WkhTTllBSWdNRFRoc3lGWjFaa3FJeTc4RTFUV2xudkNvTHQ4TEpmWlcvOEFrOURINE1FSXpRY2dnSEs1MmF4NXdyNkVQQWtJcDVqNy9HVmYwZlJOT1hSMEJ6aXVYZHhaV3dHVE83OXNSVnBxMzJtUnNwS1ZWRXRiZ29LVnJKc2JRc3dQd0E1eG9CbE53U0FrenQ4eGRSOW4wOVZoSVV6cGNGMjBockUveERTODdONHdrRHZpU1VuanFiclJqbU9KR1M1Y0dMbjNjU283Y1ZsaHQxQ243L1VudGh3dFVRNUlQbmFwRE95bXBFTUhXYVdUTTQ3L1RXaWx2UUVIeW5iZXdqR3kxblRQZ0EwV0dmYVc5aGVOcXdWakR6TC9Eb3l0SHVLTHNkUkdITUNybU54K2dGcVJKNjFmMis2bkdLMy9xeExScUtVbCtWL3A5dStmMk8wWmJ4d0wzWk1XdDA4dXZvMXlWTzJaM0ZLaTA4N3BTYjlIWFRZQXQ1MmwxZSsveXJNRit4N0FBOHRudGFvS0ltbll5dW9HMVk2NmJ6WTZzczlQRWVteWZBc3VXdmlGM2hQWm9sTWxzTitiOThNT2pMNXU4V1AwMVNVRThiZjhyeCtSR09mZTZmaUVMODNLcUhkRU9kN2NKRDhZSm45Nk8yK05kS3MxUnZ3NURiM3A1aGxiTjNJZDNNV25QUDhML05Tb1J4d0tSQVh0WTVSSW5CQ3hKWTdzakN2c2MyY01TeENPZ1ROa2hJUnlsVFpaa05PS1dTOVdaK1RrS0FaS3RWNjhvdXdHck90Qm5PR2s4SzhHNW9RbGxEUXhUNHZObDJBSzNPT3cwVitFMFE5SHFhc3IxclAzTEMyZmpsV2ZVYXNrZzhVSWZ0cTRHNm5iSEtkUjNlNWM5a0JqRkc0aXRlY3dkWUlnMFppNmo4dkdoYkY3R2lZbWV6aWlyMXptRFhJOVV6Q0hKRmc4RVByUXA0Y3l3QU85c3FkaVJ5R3Q4RVJ5WGY3ampFaEUyU0NZVTJUSzYyeS93UjFEcG1yek00dVF1TXhwNS9CbkVWQnNCUHVTVWIza0k3T1BZWHE2c25hSys3ZUNEeTFzUjBERmsxSWdIbWlmeUorZ3VLT3lVWFNhcDJjRmRyVnRHOENvTDdzaENnckMxRUh1RzR6TWh4aUgrdmErb3pyWGdvMktLcTBqLzhwcXgrdWQ0L1o5S1lsdm1hR2l1OURSSnZ5UTBhNlNNZUl6cHcvTGllWG1NVnNlbmd0bkdZRnFCYUt3YnU1cmFPZGgyeVEzTDM3TUcrYm1CbVpvZmlJL1A1bnIrY0FEdzdrcmdSUHVrdHVka3QrUitJWHl5b29OUkhFcGFyR1J5STBXZ29uWWlSV2dqSkNzVzZjL1d3VDRhNVM1aHdYY0JremRLT3RUTHVxOXBhOUdFcDdieVBJckVaUEsyZi9TcENxcDhMQVcxRTRMNU5CYXNCWkhnWFhWemRQQUYwR0E1YW9LUjVER2xTUTA1L1hDWHZPc2p6SjVSUm9qQ1Q3dmJIVFA0YWIrcUE4VE5ZbEIyZThkZnR2OEtETzV0WFEwL2UyZlJEUGJ3YStaUGtYc0p1SnltQzh2Mno2cElkZUVIaU9pWmJEbzN3cUtxQ29ZZm5ZR2xpVFR6UGZwL3h1dCtzSllQaGdrN3p5ZVhsV1Vsb3A4WnhET3VMUC9DYWZaU1NJRU05M0E4OFJDc0V4OVk2WTlaRkdKUzFvbVlMN2taOWpNR2VmR0pBTmJqbTlGV1dCaFN4UG5QNUhVSHZDV2ZGb3RwWklBajl6aXVFL255ckRVTmg1RCtXcEc2VkJhaUdPanVzU1N4a1p3QkFnZU0rdUNZamU0dGdOcys3RHRwZjZTZGIxS2ZuMER3S0ZkZDN1K3hlU2lkcUlDT0lJUlRRaEpISENQK3VrSjJ2b0hrbWZ3WXZGWG54VjllRGczMGRTT0VSdVNhb29WMWc5UDc1aVdWVUtFc0s2dHAwSDRzWG1WUEJPeUQ0VkQvTGtZTE8xYTdLUXdnMTZEMUNnVmdrZ0E0ZjNsYng5SmZaOHhvU0NzSVdxT2w4ei9MTHN0MGE2UUlpZDY3Q2tPdmlBeVlvOW5rRFV1WHZlZGRuVWwwcDlTMG5uaEg3M1RudTBGU1ZtT0ozcCtBdHRYOGRFSWZxMG9TMUFLQUMydFZBa2RqUkc1Nm1jc09xa2J4VzVJNEhhdnZtK1BORW9CcmExMFZBRnFkOHRCZEFXbnpGa0Y3TFZpY2svOVFOMlRacVlXVi9OaDR6ai9MZ3VRbzFIczVITVVld0Nzc3h3cTNiNlJsRUNNN1RpaWM0WnN0YWp4UFBqSHRmSEZzcHJKZWhwaEJudnRwMlpVQitJTWZsRnY5Ry9GdHIwMU5XNnZsN3J3RmptUDVNMVdHQ3J5U05MTVZZR0lndW1mdm1EOFQ4Yjg4dkpsY0FsOW9ZV3Yrd1B3NnhCckhCTmx1ZExiZEVWRU5jQzRzYVBMK3huaitWQXJOL1hoOEZ6N3RnL0NaSFlFV05ZT2ZPS0FPTndCNngxQU9IUHF6Z3JDZFQ0emFlWjlzTGhDdlh2M2NUQ241Z2J4bDhWc1RBOExhLythdmJadWdJMVRYazFVK2wvY2s1UERrd2lkQ3FJa1N0c3B0bFNaUStsY3JsclI2SmVOZkNiL0JncjlLTURaL01Na3FFejI5VXZ6RHJ4VHBmUlZqMm02TGVnODdIcm5UaHAxZE4rYXR6N1RhNkpiUkxxUUFHZUdrRWJpQWtGbmlaTlFud2xOc0ovbUlxRzU1SXVBY3ZDazJRWkN4N1IxRzNQOVErMDZVV25Rd29TMklObmtGOW9oL1Z5Z25UVGVHalFYTlhHaWVNZk5QenFmb3F6eTlJaU9YVHM2MmF5VEllMDVKNDNvWUR0SkFJVDNvRS9EVjF5NWVPcTBKaHZZSlR5MW5BZGxKOEJId0g5dVRCelBYZ0hpNVB3dUNuZ3duRjljbzB5N0FMbHF0U3RSWExTeHlTSVVhUjZ1dnI4M1BSd01XMXFBZUZ6bE5VMFB3T3NETkNoWTI3VnQ2cmdodUk3bU9sU1VxR3hrRSszMXBVWGNKcjlYd0VBbHJJaDNYNW1FTHdJTVMxZGdUNXEwUGl6ZVlXdmtmTWwvVkVJeGtKbGlLOXk4UUVMQXFTVkl1M01ocmdqK2dqa3BuRlE0QUlwOFJHN2NEOFprRW1pbFhrMDE4TTZ4TjB2WW0vVVZyU3ZWK3I3QlNBVnhVY2ZqUVhnSDdsMlJCQ0pmcHRNUmRGMUZrYkwxUjc2OXhueUt2VVdvZlhVZ2VXaGxidy9pTHNjRTZFL2V3MEl5T0RHVlVFcXdUK0ZXM0o0YW55b2pVUnBwTnZIczZWL2xMN29qbUVrYlpnOU5uVnJSd0MvR1JZMjd5QUl0WUx6MHRUa0ppSU9ZbjdxeEF3QXBuckRjWGlHZ0g5eEdpbkIzWGhYZU03T3A4aWdNZ1pwOXFZY0lRTzhLWHpnNVpTOGVtUVJvZUcyU3g2Z3I2Z2d5SUhqRll3YTlEMzJNd0E0SnhJRkRiYmVaZUhkd1JLaFovaWFHVzZ0RjQvZE96bzd0dTFaQ0I3T1EzVVlQZnhaMFh0bjU5ZkZBR1h6d0pWUkZ5ZnlTV3I0ZUR4WVR2emJFdkNTaXhjcUlteE0yZ0lNaDB2b2ZET1owamNsNmdtUmFYZVVWQkdZbHZwRmJFV2lDRklmTjFoRk04MDRmdHN5UUtPQUJITVBjVWNxSVhRa0FmTkNlSjRIc0IyMHZ1YjBZeVg5TUdnK1FpTkpVckU3Y3dXa3I2SlY2eTlCbms1MS9xemJLNU41SXgxZ2xKTThvN1VsN3daOHR6THhsMmRxTm4zV3MwYll1dC9NTlA0anI5RjJtRE9Za2dmZ2NWcWJsN0FRRW5STlBxOS9MR1V1WUpaL1FQejZXZGthY3VjKzFNMlhHNFpvZEp1VDJLTFExZ2VsNXErU1E0bFFMTHpraHBkcVptVk16ZlhyOThhVjMrNWZ6YkpKSTBQN2trQzU5MWJjSzJSZkNlcHNXTloxM3p2Z2M3NTV1ZUVOd0VJNk0wWGk4cEJaZCtrOVF4K2JnTXI4RmpWcEoyN0srTkd4ZHlkb0o2cXB6VEZzQTZVckEvaW9mdHBqc0ZsZ0ZCdmtnWkZLNGIzVXE3VUJVSkY4LzJTeldTNnYzUXVsOGFTZGdFVk1reC8rQzE1QUNseHY2YmJEM0d3b1FwZFNFRWxiNlRoeWgyQjVuV2I3bzBSOEJiZGRqbWlhVk81N3BXZXpXa25TRm9wZzVEdGMwSjVYU2tuOG9OWE9LbDZoYUwvR2psVVBRUmxpY1FYUi9vb2pXeGtWZkVCR0FVVDJDZmNEQUFyNGhhQWJBOGxlRGdmUkhBMnNJMEkrOXV1SUVxN1dVZ1lmRG0rbDlmbmZBVE9oWndQOER6TXNwVlN5cnJsanhERjE5NUc3Y3NnaEZwWUZRODBCRWpaajNvdTJ5TVJHbjlLN2NyQU5uUUZGQ2IxemxZSFpobmRNMUVRTnpCaXV3U1ExV3JuemZiZE1jSzFhNHNaV1IrWGtab1JQaEZVZzdSN1d0WFFYckJwbTJCRjAwMDVJREpTS3J3ODRCZVFUc01BR1lVYkVVREJtNGg1L1F3MklXU0IzTW1tSWYyamI4SENHYjFhS3EwalVrTHhNcmx5akJGbjJ6aWpMYjkyeVFtUGt4TVpnei9QakJicnFYNTZQdG5pMGFVVjk0b2FCRU9ZVngwLzVyY1NXNHBSeDJ6QU1ZNjJPTTdXRVZ0WE1tU1JsUkhRRWhlNzY4V3BRTjJGTnhMV0FUK0c0UFhmTG5qMjNhd3I3OEtxUTFwSVQ0OENKcHVOZStESnFyeCs4WjhQM1hVdTIrem9XZHBoa0x6eUhia3Z2RkN0dmowbVNIUFhscWlIT3BLSTc2bVpMRWNoMWVSc1JucEk1N3NDeDA0Uk5hOFpiZm13bVhvR3RkdEJQUDFQcUM1azNvT0tlYWExenR2OThiM0wxZnZLMm0zMW5oUTA1WlF0MStxK1grMDF0Vk9CYlVUbjQvaTZTcEZxbURDKy9NU1dzeHRJRzRSZEVHYytCemdoUVo0ZjBZWXhQVmlRWEtqZ0Zvd2dXSWMvcWUwajJIMy9YTWJRR0ZRSFNSalp2d0lqTmxSVkRUNVluQXc3dWhnWnN1NXZXUi95NUkwQnBScXV0U0pvUWZOdDhuSTQ2ZkhhV2Q5S0JXZE40aEZRK3RrMUFlU1RkdU13cEIwUmZXTDlQOWZoZlQ1c1RYdXJwMVJjOW5WZ3N6RFQ5bE1yM1MydVYvSlh3RU95MWxBemJOQUk2eXB3Y2tCQVJ4UFZJTXN4MFNXSmZISmowMldhRnhNRDZBMjByNFNCcFpWelNxbDZRU1FiaXp1MG5rT0RlZ09RYjNnVGZTQXZCbW9uUkJSMjNqeGlIbzNabUVYQmhhZG5QWDNiaVltWkZ5NHdIMnRvRWpiZ1Rmckswd1ZkNGdQUHVhTllMLzNWS2FjUzJYWmpuZExyYlRoZkVVaEVPa2paNHlsZUgrVWlQMkhoZlFsVUlBZXp6dGdXT0g2b0ZLMGkyTTZUeko2NkZaeGs4STU2cHpKNVcxV3pBbG83SDNLNkJrVGZHSTVuNGlibTB0Wm9BdzJnY3VLSUE1RTFQdDZkc2tiTTI5TkFXODROUlVmUFlGWlNNT0VnbGtBTGkvMTVtNGFSZXpuQUJPTk16SWhGbTlSUG5VMlRva2cwL3QxcHh0dm12dXBMQlFWL0FMeWNsNUhQK2tQaTg2OVJIWFUrR2RBRnBUczZ1VVpBUTRIbmF1RGZmSTdrOUY4OThsQVExWUVmcER2aENMM1VkaHlBZWtENW5ST2UwaEJpazFuV2MyQW1Pb3BNaG1HVkpVR1BtUjZNU0FtRFZTaERQRzlSRHg1MGRrODhTdFIxN0lUTUJZTDA3NUpnUUVRdHNEZGJYSW5yTGZEYXBrUEpGcFRWd2d3NVFxMVFMOUV3dFhLZEZINS9hdTlQRld6cmt4SURwQTJzb1NjODhxTDBPci85QnF3YVJjZUhERVBwOS9iVU5NWmpuQVVKbjA2eTg0VWpUU3gzbmNUanJDWnFHbXRPTDRid2w2U0RydnZkMHF6aDlzUHBmNlZzRnVSd0tCZFU3ZDVybXVCYW01ZjllU0RVQkRQZk1YYW1lSzNBdUdOVkFCTUptVDlremU4NEdUTU5sNk1tby8wWnRlU2xSWk5OT1NpYVdhZldZeUI1NXZmQmVKQm5uRVl6dTZ5VDdOVmQ4cmRwMnBpNk5JWFl3aldZRzhwVDMrdmxVRlorMmJPZE5GeE9tSHlwSzQ5WkNtMjN5dzhZbVo5QVM5eXFObkdPaEVObTByR0JZUWlKYWlHWDYwY1FOMjA2UUtaU3Q5SFBmcHRTUERTU0dYMnNCR2NZaGVrb1NENVpsTHhBdjhmaDRBK0xXZmlINFhndWtVbzVoaE1ja01rMStSYS8zQWlnSTNBQkNsZHpoWFh6cXlGcmViOWZZaFd5UUpibTVvejNNazU3SjdxeUErL20zdnMwYjZnRzJrMmtINSszOUtpMlFuaVBKcDkwcjVHeXZWSnUxclFqL1ZLNjdDMm43VmJYQkN1YzJ6OVBJWTVwNlBUUWtTbVZ6TGdKNjhRR2psTVZnRmNJcHg1MEZoSGZ0SnZCYkttU2pKdFppNVExVytaWnpOa0dnays5Mzh0NW15VGZTR3laUkhmZ1VmZ2pqYVZyVnhoQ21NaGFsYWExUXlDZWczNWZuZjBrVDV0OHEvdzlSdEdoUHh2eENqelE5TDVRSnVncDZYME04QUxGOTZzNzBQYksybnFTRnJnQWQ2eWlqbmZLTzBxNFJrcGM5RWFxRUpNUTZlUlpDSHllc1QwaDZrNnhlNVdQYjE1Q2lpY28rRWwvNUFLS1UwU1lMTWZwWmdKaVFpK1hHaUhSZDBTUVVkREdPR0hrUUtoeTJTT0o3OEdGMzJESzZCQ0wraElFRDJOQ1pyMk1oa0VDVDhSa3JGaVc4WVQxVHJheGEyTUQxQ3dITHVmOWdwbVhSY0xDRzQ1L0tpeXNOVVExRGd2SUNBUUROK0NNWkZZRktIa24rUnZzTnpZZHFHbU5zOE1rcThLeXI1SnEyd3ZFVy9SakJqK01tdmw4L2Zmb0VRTDFITUJZZlZaNHpqY3BoaWZjeDR2dzl6QkcrSjhkcjM1blVKRzZlWmI4Rmk0Q1lFNi8vUzNsWmFqSjc5MXZGL2FMSHRtUllCT3llaWwyMmVjeGJpNkJ0elFOZFhtcjNmS2dUS2dVRWpzbTdZMzNhd3RMK0FjcUxOTW5xRDEwbnFPS2J0Y0RHK3N4MFp3RmkxSTRuazRjTDVWbFZ1NktFQzdBaXVxMGJPbmcrM1Mrek9IelNLNVp6R3drOWdhdEhiaW5IVDd2NEdlc1U1UUJzcTg4V1RzWTA5YVFQZWpzYkhWWXV5b1R6M04xeUs4eldmbVorcVB1VU9JMUVyeFJoOUxHamxFdC9heFBuY3JaNDN2RC9FTC9BbGYzeG01c29tU2NXRjF0blEyUm9COGUrWEVRaGIycTJvbkRDeEtmZWlEclcrQXgxckJROFNESm4vek1jQko1VWtuWUxFNW9SdXNoS1pNQm5aTEdib2V2ZUMrZk9nOWtnMzJuYS9nQmcxMndSSXUyeXlXelpNMElvUUZXVHYxV3pKdWgwNUZmc0Y5bmIxQmNHc0Fuc2VmdEFzajRYQkdlcStjdTJONmsyNkt2NCt5Wm5xR3EvamhOQi9VYnZOTnVHM0dXMmh5M1NUVk80YjJCSmVONjJTK0FndjVvM2t5ZG5keWwxbFhueExVSEhDdHpSeld0UTh0Tm1hRFpRWG9WUjh4NjNXVEh4aEJ2M3JHZTJtcjY1K1pMR3hQeDB0Z2k1UmhoVzhrN1lNaHpBWE5QMHFxMkN1bWVacW9JZ2RYekNaQ1VFU3k3VWRDbjJmYVpjQ2pPYklRMEJudjBaTnlpUXBlUFFvbzg3T1FMMjdjK3Jhbkx5MnlRNEhDM1JuQUpzSk43aVN2U3B6UnZzQ0pCZm1SUVVWUW1YeEQrZ0NNWmxnSlhiZTZGbnF0NVFOb3h1d2lXU0hhTlJzODVMWHFBb2p3NGI5TTVSVk9OZDZNa1lsREw2bXR1K2FBZUZ1VmtuK1A4MFY0RS80ZGx3L1VZN0hDOTZ3QXUzMnZlaWQ2Sk9TKzBaUkp6WXV1dW9HWjBpczEyNm9UQ2hmbjgyUlRlckdXUENNUlFmMEFUUTdtdExZclpFNEhNWEpyRWdrR0VTSmx6ejlha2xHRXVSWlo5Wi9CbmtWRWFDS2hSR2h3b0gyUmdSOWlBdW9kK3owczBRdWNUaUltN0xyc2VRWEF6RzFiQ2M3anZCVCtCMExzY0ZLeTJIRnRRcXltcStwMWdpK04wdVA2MVdLcGY0MUNZaXRQRGxnNDZWWDJYSEZRaUtSaUpKYTQ0eENNZ2pvdFljamtzSkE2MXExR0krNjJKa2VwNVB3OHhickRzaW5uL2pYYlU3NnF2cXY4Mm5hcTczR2NiMU1yd1hadUhiNzR6ZTN4d2I2NFczMWZhQ3RuWEZaaXlwT3ViUnJZdmlreFhHci9NVHZaNmRoZ0JLZTBUcWhONU04S1VKM2JVYkkrZXZhVTVwTDg4Z1V6VmFVN0gwK1l5a3ZHNDVYQ21vdFg3RU5obC9wSHkzOUE0d0JscFZyZDlOQVA2dDU5SkQrZWNWb1VVY3RKNTlQejRzZVJYMlMxb0IzNFlIakdhbTZ4UGwvVThmM2czSzQwUU1YejhaV3pkRzBKOUV0L2g2dE13SmFzcStaVTlORjJ2cjVMNVNKTzJ2cGRRQkRvOGdoaXk2K1pHQk1NOTR5aGNlN0hBWW8wamFjL3U2QjNKdXYwcWIxYklTYlpibUFrS0QvMElqOXpUQUtCd0U0a0ZoNHZkVUd1U3huRnV4b0dmMVMwVEJMc0FaK3Z4bW0raW1oV2ZXK2k2cHJKNmM2bkZtL1hjN0FGVzFmZ3hlVlBaNkxrdVhtNnFPeDR3S3YvT0FNL2RnRFlQSVV1ang3eCtrUU10QlpLNmkxeXc5UVQvTE5sQXR3bnVLdWo4WVRvVG9zY2N1RnZxd3dQS2VxTmVmQitsR2pMdHlXTVR3M0RMeVQySWo0YmhmS2dSVllRV2tOQkJWUXJCYU1YaHc4V3A4d2ZiVXIxZGNGd054TDJHZ3dXVEljK3BIQ0dxbjQyZ2ZtOUpVTncvbjhiMFpVSG1ucEpOdjJDTkI1MjB1Zy8zUlpIL2NmbHpjTENjVU9vU0tQL3NSRC92SXNxRS9JQWJzTWdRRlpVWlVjOThadERQQmo3WFBHTHdvckFib0dycWdONnlDb0hKYTFRMEFZeWZ4dHl3eE9Tek5idWg2Q29zZHl6SlFudERsSDNkQWFFVXNBSWFXR2RkNllDeWlVR2FwSysxbU1XSEFCaU5LSkxodDRkbFlKOTZ5bTdxRnR1NUNWWnVUSnpNZzlaQ0hMb1IrVHJJaTJPUTl2TUFuWFhsck5XWXdDUEhPcFpXN1VoQ28yMFJIUHFWQmU1UDRMOUE0UDI4amV6UEgzRlFJb1VoWjFOUUxFdDRoM3BpV0Y3a05mbUdlSzZRR05ZK1NFOW9UYTFNdnc3cFk4NjNFbUhNNlFaSkU5Q3FMdGY5aUlJdHZXSXRYb1VFZEg0ZHVtWUJFZFloa3J4ZTVIcW9RUkladXpUNmxyNkhieVFGblRjaGdDUk9EeTVMTGhLNktycUhGd0g2RXVDY1JaUTczc2hDVkFOM0k5ZnMrWVoycXVtdW1oak5jMXJ3cWkyekt3UDV0MzljV0p5UGJyeW8vQTNoaDhaQ3oxS29pZVlGNTB2Vi9nRUFqcnVrK2dDeG9uYnNtRnA1QTBtNVZWRTllNC9UT0ZWR3JBcG1TL012a1N2UzIxejhFdXgwK3F6d29VdFBGaWRhR1BHVHY5REU2d0NFRWxOTUNZY3BHYXFBNFlzZTBDNzI2d1g1OXFtQ3I3dTcrbUtLSUxnWU1zTzdMQmJKSW1FRDhyNDh3ZGtZUVBBdnlqdm04YWtaS1FsM3AyYzRrb3VYTTVFeVJjS25BNTAwUDFIOHM0QzdUVThQMmN3QVlrYTBhK1VRTm9DUkxzZ1Q0L1dwT0pWUUQwV1g4a2h3cEJlMFJURHprUWFlVGNyZ2JzTUhiZWpzY0x1Rm5UYVF3U2tKNUZHajNJaFZrWXYrQUkrNHVyVTAybjhPdlNQMFZsZmxvYm44VkZQb1JlZG9tcXB4L3dRbWFFZXZaQUtjMGR6MjVUcEFYTDZkV1BwZ0ZMamQzWTdaNXd0eFU4aFJYZ3ZvZEsrUnVQRmZib0x3KzhZL205SFNWSGdmdXF4M3lQUDlCVWlBcHFLWDI4bVdrSWtuczN5Zis3SnBxYzB3MG4xclZISzgwNVlLTHk5cWlMZDQ1djZUVVNhTXR3VzlKOEVuN1U1Zlhnc0x6c0tqUEpvWFd5NmJnUVlyMGxXMU8vMW1XOEwxeENYbXVxb2ZEYXFmNkFzdGhWYll5ZmNRNjVYdXV1YS9HZnFqci8xS3lMTFJHMUI2RVBJeENkS2RSeTN0R1c4bS8wT0psMlU0aElvVHFIOVJ2VEs5ZkVMRnM4R0pCWm16M0J4d2Vobm15b0FhTXVzL0tDdFUwUzJXSVpXbzdrbnVuMitTTWJzTWNES0E5dUVqUkRxVUUrNVkxZG9UQzQ2Zy9vM3p0aGVkVFZWK1pubno5T05vVlU5cUhqRXBrR2Q5SGxad3lML2NFSng2ODJibEdlem9ISGtUVUMwRkt2MjhEVUNTQ0ViQlBIb0dsTVhFUkU0SXQzd0hTaExBblB4VHBMQWF1R1ZsU2t0KzRwSS9UMnE1YzJoeXZCeGVOVHR5eDRsWGRhK3hyS0lNcDkxakZpSUZ0WHFIb2luQTZyVmtnZGZsQ2F4aUlESWx0YjIyMGN0bjM1ZzVVZVFHa2FJbUJyZS9Vd1NGeHVOcS9ZQUFQQmV1ekZ5a00zQlY5NVNpVDdrL2cza0p3VjVRREdSRFp3eFFsTTZ1WExvUlZuT2R6STFGODRiQ3l4MVlaY090em8zWDR6REFKRVdib085TmdCbWVGQVpuMEhVRTRuTVU3YnR1TytVaGovYjhZQU52UVBZRG9EelRBZzUvZG42VDZwRGJBRW5rLzBrNDNkOFNiTHpQamRibDM0VlMwVTBzTlpNUGpuZlk5ejRwY2FOQU51aTRnaDRINU4rTTloeWRVUWNleUU2V2ZGT1ZpbkdVdWFJSlJ2ZGpqQ3YwYlJLVkpjQ3hHbE1CeTI1cUExK2lYOEpmQ25pNEY4TG1SV1dKYkdUaG9xZGRqeHJiS255SWc4aklxYXY2SlVSVndON1B4c2tlTWRqcVZVcng5bnlhMWV1Q2puSDA1ZlR5dXhMakdIOUJuSWR3RXpOVmtQWW5BMTBMMjFnTHEyQVBMeEVKVHNvY2FiZC8yNDRQVS9ockhPTjZBZm5VL3IzNUE1U1o4c0dFZytCUTgrd0RXT0JPcnVZZ3ZtQVZkdXZxRzlnQmZSWHlpcURFclVXeWxVWTBkRElyTGp6WjR1cXpQOXNzL1FMQ0k2emNvajQ0N3FwK2gweHlMbGlHRUNMTDNXdnlnM1l3WTZTZVZITnREOUtqMll3S3pFY3o4ZWxJdmx6azJnNkZtOVNhcFlBNWxjY3k3UXlrQ0E0eVB3MWZwa2JJYlVxemd1cVQzV2VmUTFOdFR4TldSSmlnQTMyYURnRlh0NDIzVjRFQ3FDc1ZJZkdlMW5YVzM4WGpGcEN5TU5BR29ZQWhVS0gyc1dQdDlva21KMVc5alhXWnBHZmgwcWhVTjZhMGw2SjZYalhRR3h6N0xuMEQ2Z2o2eUlnZ3RNRFJtN2hSTHRKYW1hQndwUWg0cFh1NFY4ZDNxdkJseXFjblJHNkpTdGlwTGZ2M0YyQmo3NjkxeHMwYVp1SVgzWXNjc21tVHBOZWVUNmEzelZMZmVuY1pOSXRMbnRWditSUlhnaVBKT0EyVFV2MXVjb1VYanlnM25aN2dza3lEZ3BUTHZJSm1WRVdWVXdSVWNZa2paemQzNU9RcVhkai9aSjRxc0VuTzlta1piOWZ4bFB0VDM0cFpZQnRKclhjb0g3cm9mWWxkb2VXZkUrOVloN2tsNFkyOHRJU3Z6bkIrYnZYUTlpWnZ0NE9uL0tLcHF0UTM0ajBSZVc5b3NEeTNpK0IwNGpmbEE1YklNYnhEZnpCS2RreittL2hQOVFsOUNyN3poVWFjK0l6Z2pqVlpxa0ZlTjBTRzM4dTloZktRRC90bHh5Njh3T25DRzJNbzZFdFRZcWFhNGRCeXVmSWt0cENyTFpzQ3c5UitzV2NEbzlQRForVGkrdjZOM3hHVDVFL0x0K1E2c0lCcDU5RjZEYTZuOVFRUkxYWEMweVA5VGxQRVAvTm5POVlUNGEyQnZENkl1Z1JpMmR1RTlhSnkwM29Nam1CMWVHZW9QcjR3cU13dGNGdVE4Y090bE9KZVNvSHU1dy93VjhpNS84TE01d1dTWWF5d1c0OStpUm16Y2JzMUNTSDJtUDFVdWtVZW9pM0hFQncxVEV1S1FMWW8rdDlhczZjTmZHZndtUjFabjFJK05WTVRLSXZoOE5mT2pKTm01VSt3R3N3MGJQRDRKUW8wZWNUcDNOc3VBenhBMTg3cjdsTUp6c3VEdXNtVzAza0p1QmZIT2xhY1h5cHhyRW1PNG13alVtMlhxUEZTTVdpellBUy92d0JlSEhFSm1vczU1by9uMjlQaDE2b1k1dHRUSTRkdk9tRXdDVmdZYnptZGc0M2xGdVlpaWhHazRveXZpWmE3clZWUmF5ZU92aHpqMnhHTUZUMFo2akUvUXgxUjZTUlRXL3oyZGl4QUQzcjdZSE9ROUg2TnBvc3U5dHM5bUN4Y2pETXI2c205cG1lYkpTcXB4SEYvbTNqMi9OUVRLdVU3TFIvdFQwdnhWbHl0VXkxdGh4VXdKSC9OZ0NFSlNkM084OUhGaUI3eTZHMjNFQ2IrTll3VzRDYm9WS2dlZ3lic3BZSkZMem1uNllaWUNjVWhFTWJnZG9XYllNaTVkenRZa0RTY1BiL3FLZWVuc1BPNFdVNDRENWxZR2d2c1Y2VjltYm5PNFhpREEySW1VeTFtTEdhWVh6TTdqcHg1TG9Ya3R2RG9OdlRwUWp3MFBRWDdOcmY4aDJIWU5vK1h0MzdSVTMzUStZQWNRMCswMUNyc0NjTlVTUUxnQUwzNXhsbjR3dHg0SlVsNFRZamF3dEZpcDB3ZklCZzRLbjJSRmlUYWVvUDhkdWNKbGVyYmpKVHVtVWdiemxjQnVySW5rMnNMMEZvVGYxV1RkMERLNkxZanFyNWtMaVlaTFFsU0xYY3d1aldiNU5FcXlVcmdMbVM0WXZNTDlVdDJmS043QktsQnB2SHI0czdQbzZPQm8wd1Z5aEpTRGF6aXJLbWs4Tlh2YnhpVDZyUjJLMXVHclFiOUwrSEM0THVkc05HVW1FZWxZTzFKdDZGdkNLRXVJRCtwc0FGbHFteHlwcC9lYmQ0OFJibnozdnk2UkV4QWRIbi9xaFd5MzRpbUVVaTZ4OVpYNFVYKzJxWkNQWWhMdS93SjNlSHM2SkF1SWdtdWs5R1Zid0R0cE85OVN0M1BtelFvRDNLZk5rWVBvUG1VNUd3eHlkOVFLamRONk11TWYxMVp5bkFUSUZzSDcyMUJVRjdtSCtkRWdxVE55T04wL0RoTlp4M0ZYMndiWDFLWElmQ2NnbzlydXNtcTV4d3RUbXB0NWlNbE5HQ291bkR0SEtORHdHWnorSnZPY3NPTE01QlE0TjF4VEU3Q2lTRlhUSVk4RlFMVWNERUVqazlmRi9ObGp3aENsTEhWYXNlbEF4L2ZrYndJcGRnWDZqT3dnaHZaa1hHSWRLNWxuSnphekhuMzMraWY5NlZlQkwwc0Z3WW03a3lURk13L1Q2VEdTMElVNm1vRkhkdnlhWWVNcFEwc2ozNDFzSlhYN29jeHcxK1RDYjFsTjh2SjE2NEI0MWJETnpXSnh6aWZwNVlBZ00wUXFqUU5iYmVjYk83aEFFbDkrVGMyU0Q0clp4d2tzZ09Gc3dOSkphdG5aQUF3dGF4emtLNyt3eXAzSzBMd25ocVc4bEsreE9NSXNRT0ZsTTZOYUdxUkl4WDJDcEZDeVZUZUtvRTJmZHRHd09Memd3dHhVUXMyeVpNRHdQMlRhSlhETmVEZHJjY2l2NlVKbE5IUG03ZGs5K0VRbllkYjdEa3JBTk56NXQzS2krb21SVkYxaDA2U25ON3dybFFScWJZQVl4aWxDNnp1eGc1QTVndm9uWEY0ZnBNbzFNVkNPUHJmQ0VHT1N5ZEs1eXlxVG52b0dLM3BQa3JsUTIrSVZQam5rOHZpWHFYcURhaU9JREF1NS9IQWlMVFBrT1dDZU1iSWNxeUtIWHM4SDlrRTFQU21sVkNoRkgvVGp3VXVEUi9tMkFOb28wN20wamY2TVNtVlZhUUtPa05QekY5bG85a0pwdlVHR1J2d2lINE1TaVpHTUYvQysrUG9MbFZkS2tvVkRpSXUwUVByVHlSOE1PZkxhVUZkOFozM0Y1MFA2dHVwZWZSd2I4WkE4UGp6S0ROWE1PYVYxU1ZHR0p5TzZrZGQ1SWs0SWQzL2wvRHhiOWg1RGt4MFlzY05WdURtOG5Qdi9UK0J1K0QzOTJoNHJ3Tm5RcWNvQkxTMlQxc0lha1J3YnIvWUkwNHRTVUlYNVFxaTlNS3YrNWhmUFFBQVZ3RjRKdWthbTFJdWVqckwyU01jcUdWY1hMMGRMU3N2ckp2VExkRUhHR2JUVDVrYXZ1eld3OTlFZHp0TGgyZ05xKy9JUXFIbzFWSmV4cFA5Ly85a0FBUUFhQUVBQUFTSUFRQUFQQVFVaUFnQUFBQUFCRVFHUFFBQUNBQWtDQVFFS0FnQURBQmxVYUdseklHbHpJRzltSUVacGJtZGxjaUFvTlNrPTwvQkRCPgogICAgPC9CSVI-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IFRodW1iPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw-UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U-RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0-CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICAgICAgPFR5cGU-U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjc5PC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFhK25BQUVCQVFBQnI1Y0g1Z3djREI4VUFJSUFBQUFBQUFGUEFFQUFEd0lBUUFJQVFBSUdBQUVCOUFIMEFmUUI5QWdGSFFGZUFhc0FBYThtQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJxd0FBQVY0QUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRmVBQUFCcXdBQUFBQUFBQUFBQUFBQlhnQUFBYXNBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFHdUxnQUIvNVBmRXpBWkx5T3RIQ2pYR0ZmenZ6WlorZjF4dkU5cXc1Z01zVWtnSTc5WDB1LzByVFVDY2RNYXZwZ2xtdDExMUlXd2V2VUpYOUNBZ05lQVUyK21XRFVBMkNXK2FHUS85S0F0Z1BGdzk0UGFiTUlzZldNdU8xTkNrcVpyNXc1SFBwNUJZeUtBOFZDdWVTQmkzNEkzT0hHQjMxNVZaQ0UzNXhlL0xlNzhDZ0FCVCtsWmFIMjh4RXN2d3BRWVc4ajdhWGxYWFJ2UitpdzVzSis3SVVBM0U1bXZmSTFjWFNOSHhVaFlIM3dZVzdZSHlldnc4R1g0NnowNVJrOTBZQlMyUHVwdVFhRnJSMWtlc1lqWlBheDNra3VwNENKYmhkT2ZxZGFxY2UvK2ZCVlNXbFNBSitwdzRRM1RjZzY3clAzSzRiSHBvaGI2aEphQWZxaFpSVkJPeW9XZElxTXU1TFNhMjlUazRRQzVrTHdRYllJRnFYZXJKOGpwU1ZvK0dSZTZDV1RkSEp1NTA0dXFMamdKV2ZSK3Vua2RpSitMdHEvQ2NJWWFrSjFMN2pxMUNmNHM5K1hKeno2Y25hTDhpTkNacEl3YU5NQ2VaZjV1SElhTzRjREpqMTZIMUZaS1lXWXdpdHErMmNURVJRQ0Q1cEtxc2t1SjFYbjZxSjVtbnlTWjUvUHd2dllBR3VsanpKcjhZNytNZGZNVEFQWmdvcU0rODhSWFQrcE9WVTZjMHVKUlV2WmdKMEhLQjRzR0QxWVUwRkQvY3BoZm01TEx2ZVRQcHVNYUN0ZmtUeUpyZDRja0orZnhsdXdJZ0N6cFRPVTdaYlJwQjJXS0hFWjRFQWtIMHh6QzF6aElDYzhCYkRlTDhIZG00Y24vQ3IvQ1RRdm90dStYSjJTZSswYWphUExMU3ZDZG4vMHVXQnR5b3M2emNSd3FFYnBCcWsyR2JVcHlsMFFMT2Z0RE1aMERqUEs5MHR6TURXQmd5VWNvTjhrc2hkU1RjSVZOSm04ZWE3TCtHK0Rzc2xNSGZsOXlnU0Rxd2lvOElOM0FEbitsWk5UQXRoWXdrZVRzTWFiaDVmMlpoY01LY3BFVEk5OThVNFVKNHdvdXlFOWIzS1pxWUdTbm11STd2ajlWUE5ZbjZzeHZRS0ZxQjVhM0F5UVBSeGpaTkFpbm5BODU4OW8xckJDWC9pVVlHaFQ3QU5vSjArYkd6SjFBaU1WUi9XVThPTUE3RVphQTRnRGM2L3FuVDU4VmRTa0NrbE9yOUpEclpRZzkzRGtlYXZ1aDY5enJZS2NlekY0Q2MyT2daQ3NtRTBhaE0yY3M2ZVkybDkwaHZnN2hiL05LNVZ1VXdMcGJTZVpGU0pGWEF5aFVWbm9XQ213QjI4bkJWdXN3bWs3b1ZNdDVWWG4vYjA3ZzBrdlViRGl4cW54NDVJZ3FQWG1rR0F2M3V3MCtSVnloM1VtOFJiM2pPNDNKa0UvRThoWXdiR1l4VXREZzIzb0RYVmVhNGkzOXhmVnlReGd6YmczSUJqckd5SlZoYjU4Y2NEdzZzVXBCbXZRMmx0UXk4S2IzY2Q5ZldHNkpQcFk5Z0tPZ3B2M1pwaWgrZG1jTDRrTkEzNUVxOWpBc0NnUkM3TGVtaExYTERzL0hyb2R6dC84dldXUXIyR3JaUk9YR05rWCtGN0lyQkk3eWg1OG1weGU3NEFvenNIdjhNdWJEM2lBcU5qc1FsL2NDemlUZ2pEdW0yK1hYWmU5dExHZW5mR2xGOGhaVjUvSkNrN0JVT0RCMEduOUtpampQcEFweUlXdGtvT3QrZ3RNWi93WVpOa21paE45b2docEt2UDQrOENPbUV1clN0cHNLWUU5ejVuYmtlQ29wMTM3L1NzOW00TTRBTXVMSVpkRGhvNWdNM1BkQkd1YUpUQTVkTDNCVEsxeXJ0MHo3RTlnNVNtNWxOM0VqQVI1SVF5eTNqZGJBN2lzN0gxVVNjVkwvR2I0NkE1bmRnY1N2MmNBYkYyWlpreXN0TzFjYXRIZEdCV043Sk9mUmZmODB1VVd1ZzFNdFNtbW8vdjZhcGRHakI3b2NlTWREd3Q1MDZJeVo0WWpjV0FQeFFENHhobk1GUHZGdlhrR29wY2hXVi9VSE1tQWN2VVY3bjBwbGZlMU5FQVhjMSszZEMzak1xa0NML3hWVG5yVjFhWTltNERwQitvbVZMcXdvb3JzbnhXT3lPSm96ekd6OHFhL01uWDBzS0tKaUxVcHRDS05IMjg3RmRBdjhkY1lxcENMTmo4Y0VJWUZFUjFNdU1NbnlRaEx3MXhYNnZKdStTcjcwSUE5citrcnBDeUdYL3FRMUI4bkhhdE5Jd21vaXhWaitOc2dhQkpxV045a1AxUEdVYis5ODVpNU5JdVRIdm1wckVuSGRQQnFQeEd6c3FFcDNaUWc4STR3UmtQRmxMN0drc1Bkcy9IUE0zUTlUT2FQVi9VenFvUEdvZi94bVNoRlZVRFgyc3FBYXIybFU1bkdpcnN2MWMzR3lseXFvd1UwRVVLeGw3emxMSTY1UUUvU3VsVkxhTlEwSWY5UGgzZWtaZnltVTFwbWIyZURqZFliUmMwTGkzbVhsdjgrTnFWUWdlZVozaUowcFJpbm5XVGN2VkNjMFI3cHhTUFFMdGRTZEVEYjZZeDlMT2NXR2lZSnF6V21sMzRZdE5XYThnK1UyKzBsTTJ1dFdMT0ExNnFSc1RKTGpGZGYxWUhteTVTMCs5SnV6eHhGRjZXYnZmaTE3QkRFK2ZDU0dqU1lLaGtwSGtubUVGUjRJM0pFbzlMWWtDYWY2SUtUTjFGWHdxYW9URHNuN0JCbE4zSGZsc0pZUDVGY0pQYkk0UUVvVnhONzBtU0xvU3hsVEZ2Wjk1ZUpEQ1VzbHRDQXQza0FEblM4dXZCSDZ3UHJCQ2lYUEN4V3o4SnpVVkpFeTZtanhweFFjZlA2Ym10dDRQSTVJaXVGeUwvRDJndVFyVEdBbTZScWRTUUdjd3Z5WUdPUWVDVnBURStDd0FiVmx3ZUpXTEVpOG0zMUlhejA0OW1wSmVTUFFMQzhEMktlS3d3a0t1Wmkwa0FzVjVZeFlCazRaN1JlUkllaGhRangxWXNvQ0lLOGExQmsrS3BoQ1lGWjNXdUZFMXBVU2NWaVJIdEZXWHdWVlR2dUZPM29rR3ovMnk3RW1kRlZEOEs2RDZpTnpYTFRMZ2lPMFkxamJEdGN6SlVWV3hUVkhHS3I1eTh3MVNXNjFTdDhIWUUzSkl5OCs1ZGUydkdsMGJTMit3b3ZhOXJ1aitaaHJoSDNvRHhLS0dzdFEwR0ZldS9zVTZHMUt0ZkVqZXpLLzJwOGZHM3drRzVHazVKZlFSenoyaFRGVGVEdjQ0b3lHMGlpcmVlRmRkTnk5RnFmeTRHSnpUWUxFczAxdFhNa2FtZ2UzL1liUlhyMEZmOGpVS01kU21HUDkvamV2NldVMWQ3aklSS3lkZmNrTWM3WnFnU1FPZWtTWDV1SUs3a3VSRGxiTTE5U1ZzRzBOOExEVEJmZTRLY2x4T0EvWnhrdFRmcWNqV3dvRU5ZUTVKK1BpcHdXV2h3UE5pRXlhbkVaVW5tNVFReGgzMVFocDBoZkVTcWorN1BsZW1YS1htQ2lvUHgvMnRQdlJqaCtrUUp3SUVOdmswVkdacDJ2Q2ZYS2N5NnhTdEpDWENMejRpL1VKQ1dTTkxOSnZJQkVJNFJSc2hIOGpjQjM3T3JFVjhaNWFEZUZTT3NXSkdCMFNORG5ycEp1aFFoMnZHUk10bEh0VGM4ZHBnNVNucFJwa1kxSUpJUTlEUnQ4bWhTY0FHSzFBSmpZOW5iMHY3N2ZmZm8wRHBHR24zbmF3c0Q5Z3ozNWFuQ2F1VXR4alVuRVJpVWJtOXAxeHJRY1Y3Wkc5N0xqUEpPRU1XK25vL2tFbzlsbDVIa2ovUUZJY2doNlFldTNqRjlmbWVrY3p0NGhqN0JrZjZSb29VcER2cTNwZFhrM2svRWVOYUhuV2pWRDhiT05CK1VCREdyL2JmM09pQU5vVWhpQWttMndiaUN1VGE5bEY4c0ZZbHJzM1pwTEZMdWl3M0NjWUpRQ1N0MCtYVUdQNzZSdTUzTlR0RUxremxPT2VUc1ZhZjdGaUxkWXhua3pYamFhVjNta2hjNVV6elZ1U3d1ZTZkU2ZjV3lYSkZpMzFyb2g0Tk1GZ1VOTEdkb3B4d2g1bXlWYzNZa3ZCNC9XM2VHYjV3WDlWeTRIZ0lkN2YxRXI2ZHJEWGQ4UlU2NkNQZkRsei9mMUVPL25DUno4bm4xcVNMSHBCMkNPOE4yc09UcFIxQXJsVEpEcjViYkorQmlhTUNtYmVieDFOS0owY25sKzYyT3dqa2RtRlBzL2ZQbGpBR2dEcm1kWnJKUkhZVjVIMmFYd3pzdGkrUS9FNkZ4bzhia2R5OTdndXIzNXRSclFDdElUc2Naa3dKUlpVTFpPVDFIWWVWcXRrdTVEdWlJT29ZVGtyNFFVQTNCR2VaTnFseUlRbkw4UDhoZEVrVy9qN3lWc1JTYUlzcG90OThrS0ltZmpLNmVhU2RneGNUditBQkRUNWl0RUVpNkQ2UzhIZkhNOHRMeHh0ZWN3ekdHNWtidEFqMFA4QTA0Y0pGdjdpNGR3Smt1NDBjb1cybmxlZkdHWWFhS0ZyeGZhbFBldnN3cE4yeTFjemVQMFdVZ1UxQnpEY3JwSENSR3Rncm1pamlmT0tlcUJ3UTFBeFhQajZBVW5OSHhlbTZMZ0FkcVhzNVFLd3o4M2FGWllBVkpqY0JrZUxDVWxPSzFZb2pZYWZNYUc1YmFOYTh6eWMxQWZiN1NlVHpqTUEyeDg5Y05CV3VXenhtYVdXSDFZVzkzRG00blk5eUJwczhGR3ovdk1Mdmt6UjlCV3ZhMTFpbVV3a3c2SVJzMmhJeG10ZjFjUk14bTNIcGNPQlE0TlBDeUlUdmgvMFpSbkFyaHVjNFZGMHMwdVRTU2FTTXViUXJGWFFsQm1sc2VvcXp4WFNab2QrNWUzWkVxNEJpTVFUeWNtc09DNHVKU21ZVGJxdG9lcGFJMWErVXQyUG0wRDRrczk4Y0F0U01PcVFwQ3JjUTcrS1pTMmxONXFBMjdhazZFSU9JM2EwaXJ2V1EzbEZJUndGbVRCcFpGcnY5U2JwQnpZWFVnM0NIbEU2N0JraXVpVzlMUTVqd3hqb2hkT0lZUFYyVkx1NmFaY1E4c3MxZ1ZtaVJNNEJFaGpFVk9mcjFIYkxJeklTcGxmdUo1dXE2R0Rzc3hhNGtYUHNBYldnYmRVdllXNVBaU29ydVc4cE9rZDd1am9MQ2NUQTlSZVY4Z1gwTlNub0RZLzh0NDlVZkxYWkF5VmRCbzlld1RDZkw5aEluYWxZd05peHFNdXZoWTdiU1RTcEtIWEVDOEdDU290ODUrUFJPaytlRllXUCtYR1JHVS9oelVrS0hUR0RkcWlQMHEzdTNsaEk5d0dTUDVJT01nNU0vMzBOM2hjTzkxY2k4UVdWNS9hald2b1hjWm9La1psMFhUSGFONjk2ZnpXVk1jOUp6bGtZZTBRemtveGRiTVcvSEdUS2RuRGZSYTRIaGpxV1dyYUVETEtIZ3JXMlVZYmZEcTZkenRNcGlZWWRKZXd5S1VnclBTeDQzaG11SXR3SGZvTVVwbWVzR3l2ZFhtYnBwMEdMankwUHpkZVdLNURseTdVOVNWTXVmNzg1VHUyNXkrdk5mamVxbURMaklaNmw0UUNaT0dTbGFrWUpRdWdUNTZadUI3OERnc0ZlVnZ1NEFTNlFmVjRnWU1URkRBMFNjUjlJSGlLdUtrVUYrdVZ4KzJ0T0J5SStCTFFseVlpc2w1ZUc3T1V0YkpCbGFHekJBYVBXVmc4dTIyMmhZZ1BwZlNPc0k1VkNHUUNQSkxodVQySCtwN2dTdlEwbElNVHdMYzFMMkZwbWtCQjgvRWNyN2NZSHgrQjUzYXU4ZXZtTGJZUFh3Ulp5UlJab3BIUXBjR3dIcmw0cDNBb3gxZkJwUGcvckZFRTVIcEtHTWM4R2IvelBXYzBINGxMZExDbzUrTkFMeTRPYzZNc0pqOHBZSjQrTCtOY1pQQ3pFTzZsMDZDWlRTOFF0Uzk3d1FDa1BoNWxUYm5WeEFNMHBsS0ltUFFtYWNlWFQyNk9OSjYxT1RQUEticEM2c0cvME52WXlEQ3BoT1RyMjE1TzZVL04vQnhIQit4bEpONTV6TTJBZnQ5ZXpFbWFYb0czUXN4QnEwd3k5Ny9IVXhYaVJJWGdVaWFEOGNqUXFYcmJOZWlkeFV4N2tDeVBrazlxUkM2dGRvWnVNZGpwOGMvMXA1YVU5RWpUdW9hcFZSa1hPSHMwUjRLRkZmZjJEYnJibXNtLzVIUklqbDZZdzljZzRyUWhFY20vRnhsSUYwWWc1RE5wQ2pYcTQ5ZEF5Tk54UllRc2xBOW5NWHlnN0FVajgwbFA3YjBHRTBvenBPSUUvOGRRMlFRVGpCZng1RXJHMUdOK21QZVRKa3hNcFdlaGtDdlVieEdxZnZRNWRaQXVHREU4RTFoei9jNVI5aGZWUkU1SVRNbm5Edi9wb2lla0lVMU9uWDBqMjNvNXcwWVVVblBmazdyMW1DamVRd3dCZ1hSK0U4WkkxK2Z2Sk9NdkU2R3JYNGlLVkVUdEs4ZS9PTURkRTJ2V2xVdjhGZUxiTGdFN2U1bG0yNXpBc09NVFlkcEVZTU9nL3p0OXFpMG9zWHdrVGlyQ2cveDFnRmg5QWZKc3BGUmZESFZ1RWtPdkFRM203MXZLU0FZVWVKTHVodHUyOS9iVDlOUmhyeHhSZTZIUjlMQ2FjcUY0U3BaOEZpTzV2VHVaeGFBVFYwalRaaHpRSXVYSDB6VEJKUEk5V01XZzRTSDJtWitwTXMzb29FU3IwTnd3eGl6bU9PeVV2bXZraU94K054NnppaXNlVjVwV3VJMCtJK3lnaUVTZHYyM2ViZXFuNVBPU3l1UzdMSEE0NlRPbnJxcWllbjB3UW9MUG5YeWR0TVV6Y1BlbGdJaEZWL3B6QTNKSGNQRWpjSGQrbHBITDhZMTVBazRnczZzV293MjdZQTd3b1N4YTFIaUlQZDdZQnJzbVZtNmJwYlNxTVl5UnRzVlpsOTRIYlgrTE05OFZUa1BDMThmT0VZOThOTTBHdDVwWHZUUllhSHB1b0RMNTNXYnFSRGhSZlVya1ZuSTlRT2VnOHFDOTJabFNYdnAvRnRDZEx2ZElRRmVVZHRwZkFQR3A1U1VhZ3NQSld1clpGNGU4T29OVkZXMi9VTzBzMU5hK3dJb2w3THVLZXFQd0RkL2lLVnBlUTdHZnNYMjJUNWg2MWw4emRuQllJRGhvWlpDeUt0U0ZJQzFodVdkTm1lam96WWtDT0plUUpzc01MRHJUZFZhamZzcmovREF6V2NqVE55VjlnZm1ySG1NWHdwbVFscXV4enNpV0pDcks5N1Zjb2phM1RhRE5ZTmFBdmZmbUFWbEJYWm5ubmsrWVhFSmZ1ZHNxc2dzRm9WeC85WjRzc29uZmVDTEpmQkhNR1o4Vm11OEd5dWRsK01SRjA3emV3WjZqZjhwUFlaUHZRR2MvbVd0NnY5ZE5nelZvTUpDTUF4bnZ2TXNpQXp5ZzRSYWZCTExTeExubFBhbkU0UFRQQ2F3T096L3hQQ0pnRGNDVHFxTERndXBud3Rja2E2YUU3cGYwcmovU3QxOWh0b1BYMGpLNUxQdGNvNFpnUWZVZ05ZSTRiTmlORk0vSjJwUHpXWmZEWUZWOFNzbk5wVGhBbDh3RWpWS2FnMFlpeGljS0RXalAyOE83VlhFMDFudG0zdzR0eW82WHVvb2dHWjhnZW80SWVrYVNFejZWUE1rR05UeUtXMzJyS000czRLMUF3UVNUSUUwWTV6eWVYWno4Vml6My9mN1VxUTdveHlBQ0xabEZRWXB1VGkxQTQwZjhrVjBMSTNRSkI3WnNnenIwZFlxL0RzREt1TXdNT3JUNmFrRE50TmhCQWJXT0k0OHZhZk44SHg3Rmw0ZjlMNFNEdzljQzJ4clZsdTdmd3ZkL05nMmtoN2x2eGp2M1RDYUU3YjRwcms5YzRYalNUTFBCSFY3WkNSSWxJZmpES0JTeG9KVnhEdk55SG5HT2hCZlJZQUZReXRMeHowVjIzUmJNWEk5Nm9raGN0b3Z5SVRzRVA4WlhnWHRiVkpnaVo5Um5YQndpOTlOaDFtMmgvSVMrUS9lWWpURWpyZUxtaUIrNW8yTnFTMWJQUy9JV2NpdGtzUzg1aUpmd1dxUk42SUJFc2hsT2twRjd0L3BZaW0zQXR3Wko1Yk5NcW8vREkvdy9BcUNDcmRjdDdhalRtSDlZV3lwTC9aY0VHU25qNEJPK0dvb00ybVpaajJCT2FSa1FDTUtQU0QwV0NVMUQ1MFVkM1lBWkEvdGNzQkxOSVp3ZnMyUFV3OEtaRTB5WWxwd2FJaUx0UHpwK0pVbkpHTVhtT0NTK1I4SnNNZ2R2K09zTmZRSXB0WmxNUWhLKzZYRzM3Uk5yeEd6MGdvcWxRS29ma3FHS1dGUXJSRjlFL0VpaGtFRlMzS0ZueFBNTkRRNDUrL0hFUWFBOVJ4UlNJcVpoVUVyRmFYMmFyVHJXS2h3QldEWUlVa1N5SnlaRVZ3TWhoNVp3Z1FtV3BvTVYrVmpQd2NuS2V1ZmJSemhSUmplMElRYStsTDRFbm5HQXF1ZmlyTWtzbkdDeURHTVNzYUJIelVXVWVvN0JGa1Z0QTlwNGk0eXJqTG04THQ4Qk9RQ0hHYzhsd3IxVTZCb1BCRFhrV1hJUFVkRVFLenZUc3p6L1d6a3J4bnBxNjl0SiswUU5wOHRTYU1MTUoxTVl6M09iZ3YyOFQxRUFOUVFaL2Z1bFd2dGJsTW04S2x3MExHQXlpcHByb0Z6T016c0Y4aG9rdTg2akpseTJRMGZwOEhYSVQ2UHRoRmwvZXVRNTZoSEpUUU9lV0h2ZjFIdWNTTTRYVmhLQ21GTmQvK1BESDdrL1V3TmZYcDB1LzYzcDlXRDFQVmlvM0VlVElKY0NUeEdCM2RKa3g4Wmh5YldZcjhtZE5NQ0docktoNDdscWNlOUdFcm4yU1E4YmNMK2lTL1V6bFVEKzhlR2FQMzNJanlUVzBWRVVySi9ZMFQyRFFTNlQ4N3Btc0R5UWNaUTFMRHJCS0NmWWlFZndHSk5NdldLQ3k4b2Y5OGd6dUFNNldkY0srbFN4alJrc1ZuQlIwZVQ5SzUzbVlReU8vRm03ekRmYnlSNjVZTWZkVkRiUnRjdTdVRm5aWWdrTU9yQVNCVnFZUzRnUWNjOUt3bENGTkRvdytpMkZFSTcvTjdicXFwcVdUclMyeHJWNGFpNmpwM0hKMWhmSEJlSnQ3MXgzNjIxempBUVlsVVFPMGpZdkhaSGYvRmhuUUtsa2o5dHlRVGRLMW90TEVNTTZVWVB3Y2c1cjRacnBuNmp0Z3RyQWhPdmN4N3lvM3MwVzk4eCt1R21RS3RiYWxXSEZUVnJJMlY1NXVyb1dFMURHVkozc1o5MDVDUEFPWVpVYXhQRUZUOElRVC95NUozSm9samxuL1JiVEZSK0l1VnY2NE9WOVZoaE5weG12YmF2bStZbHI0TDJHY0dvYTVSWTBYTlpjUlZmdkZaZVhIa1VTNWVUU2x4N216UEUrVjlZeFp3TEQ1Q2NWTjdwMGlzbU1LWmpVVjR2YmQyYzJNbkNGTExnQmp0Ui92VHRlQUlrTWxZb3MxWldrUjhXbXFmR0RsbHRPVityOFltbzNXQkNsL3lmTmpjTkFSOWJTTGs3eStsZWhBOERzVURWVTJ2c0Y2cmNaMzVzZFR4b2ovZi85YmFIVVRNK29MOStHZXJ2ODdQQjhIeGZvUEkxTHpTYkZ3Qk5CcWtRb2RyOS9UNHFTWG5ubE9KODFzOXVhanNYOVRIWHVuNUFWZFFaeVF3Q3o5cFVlYTNlcDF1SzRFeHloRVo3T1JpWXMyYmo0USs5aDhKM3ZQY2RrL1ZDTG9hMkJGVVk2eHlwZFZsR25wOGNWQ3Jac1phS01IMnY3clBuSlZualNlaTZHSzVSNUFNc3dSWnltSFp0QXJOb0xSODBIL0VyR0M2T2lTYS9aZFMrb1QzRDd0Z2U3ODJRZ2MxeFEzNlEreXZLSHFGNDI0SW9oRHc2SnJVNDlzYXQ0ZkkyM1I4UjJVTzNPV3U4aGdtOUZjemxTVHNqWU5vbW8wd21TWTlpZVlGNURzcEsvZ2JyZ3l2Y08zTXc3Z29maFJROUxMWkF0dHdCcU1VZDU2dFZCQ1k2aWpnQlVBVklVK1VwU1RsY2RBNVVqUmYzaWZsMjZHM1l3Y3M1dFpNQjROV2ttWitiWWVLS1JNZTZOUG1BM0VhS3N6WEVJUWpVam94cm5pS2YybHk4WlN2QSs3MkFTdmlZSnBWR29WbDVhb2g3bnA3RHI4UnduS0lidkFQY1FEWTBGOGR1VzlVMnd0VUY3bmJGVGhFZGdkSTBvb0pkSWxtbG9mMGV1UURYMFBXWW5uWjk5RXRrSVdQemZQM1E1S1lVZjN0M081aWJPc2VFbGQ1NHBEU1lOY3RsSm5HV1d3Mk53UWQ1eXA5SHRyUmNOOFlpOENGamJPY2JRMUlyMCtuamVsOExJY3RnWHRrSENXSXZkRDBWU2k1ZGpkdG14UzdOYk4zTUdZZTdUZ0MrQWlyMFdhay9UcTJjaUxnTk1yaGxYVFdVOEVzVnlBM3NzK1F4REdTNVhqWUNlRkdLOWpSWVE4QU5PdVpOZHFJMmg1WlVTa0ttcm95UDAwRlF1V0szRVU0NE5uWjRjVmZyNVBiUEkvWDlDVG0wRkZBd2NnWVo1ZUE0OGlhYm5PZzN4eWFCUEgzU25LaE53ZTQ4Sm1CSWFHYnpWdVBXNkxWNjgyQWxBY3BlKyt0UnE2Vk80eWdTUVRRU2I3Q1BLWHdFMVdCKzI2ZnNuejVnR1huQ0dDZXR0NDlKMHhwYlI3R0J2Z1F2TFN6TndBckF1elZJbWxKNm1rTXY2Mm1yOWZad2dTVVdnQ0pHTkZRSDFPakxlcFdSNUFkSUlRak1zNjJXank5WXdsdDVWNDE0R0l3c2lGL2JuWmFzeGc2eHpiZ2lKdmxjTzJwS1plUDZHRnRMcXE0cGFPM0NEYVdsZTRwUjEwOU84UjN6Q3BOUTdLbi9YMUtqY1BjTEU1Tm94NXNqT1c4Zm5FVXlpZTVwK3dPZzJVR1RCL3kzZ05QVnBMQkxRMGhuejdHdUp3L0NjK1VJTlBnb256UGFVazBmY2VRQzZkMFZrdFV1SVozYzVnS2Nmb1VFUXk5MjZSN0NjUVlndTA1bnhZT3BZanhjUzB4MkFDb0sxcG9hcCtIQkdzOWxRWEN0aC8zZTg0SzZma0gzeS9zSXVvQ1IyMFRySGN1TmxMaGlnV0o2K1Y4LzNUMnlaYkxHbFhFRnQyN2tDVnV3YXBvb3plYTRuNGgvY1JrZUxFZ1RhWnB5cW44UmtaODQwN29xM3VPZ1p4enFTRGRVYXgrd29QbnA2dk42VmxXckI3b0hEQWU2VWlldnduRnR6WFJia1pveml5dFZSajFrVTI2U1p3RHZzQ3NmdndFbUNuK0tFL2toNklBUDg0UVhab0pXcUN6RldyRG40YkxFMzRRUDVHREtseWRsT1NaTUtsb2FCS0JkR2pvZUZPNTFocEVWVnluMlVNMXMvQ1BoRUJmVGRSN0wzVk1PNGtlYlEyeXo3a2NvRTN0bGRsSnNBdG84U3h1dnlrWjBYRXg4RDBSWmZyUGprc0hMZG03anZDVjRDd2tqZVhQamd1SnI3NG9KaEo1ZGh0dTF6QU9nb2lVN1pFTmZLQkVDOHNoaXJaOUtDMHRBNEsrSWFVd2E2ZHNuamh5WGQwbW42YjZhU0FyR2liZmZvL1lTa1lHalNPd0w1M1poNWliTGhtTjlHTHhNQnRISmZwVWZSdzdiRUpERnJCK2pJVXpESituRFp2RnE1aS9KcVRwS0tjazJuL0g5RHNXVGZ4REJFbmZROGtQZHN1NzF4ZDFRRy9Ua1AyM0lIOXZlMUFoRFRHRkhFbElkTWxBbmtkZU15S2t6MTRyYUQ2dzdlc0RMT1BSd1JhQmlXS3ZFTXVxNkovbGtKSGxhQ2dPZFU3WEg2eEYvYXlKaTBJWUh6bllVYVU5eVF0UzExMU01eHVKMkt5VjRuUDdScUw0VUVYWWZMVHRhRE1yUUdpbzVMRDR2Zk02c0p6aWFJV1hqVENzS2dkRlF5V3F2dTc2YkhJSldDcEZnOHVIUjFWZU82MHhYKzI1QU8xSnZwT0tzdkhWMDdCV0syRDlONnpMNHM4ZW1QZks2Z2FweGVYeWtVMng4d29QeWNGcElZNkFkMUpZVGx0UzJmNHltWk5pNFV0Ull3Y1FobEVZQ0VBbzR2bEF2Y1VBS1ZjQXAzVFdzUU9mYzN1UkM5L0h5NjI4dUFHWTljY1h4OUdHampBU0hYSEk2cWk5RlZGSEpxQ240WFhubjFDNW4yalpGNWkxbjV3c09SaXVnSDZINTJVeHUxOTZhSTFNOExrNkNvckZPZXB3TGVkeG4wQ0l0KzEzWk9INTVsOWVqeHVCYjU3Z0FkbHhEZ0xUV04yR2pFcFRMdlNHMjNVQk8ydjZiS1hYRy9UQTJBWitKZm5HYWtEck1Zb09ud3lVSGNLeHA4VGhJYlYwVkQvQ3ZXZ0xiMkRpQUxEOHpSSm05ZFVqLzVyUVV0b24zekI2ajcxTk9YT1BlRjhSNitZZ3g1ZkZtVG94bExjbzdUamxyckd4OUVjRXAva2pYTE9qellRUUkrZ3hMK0FPUHRseGRjM3c3OGYzTU54eU5EWVI4QnZLQzE3bjNLN2hOajFzTllUd0dBUkgySExMT2NUMXlDMnhQb0hRT2U2ajB4L3BCN0sxTmRWSS9yaTVtVlpMUmE0a0tGMzh5YVNTSXBzdkhvTWlZQm9aZytqTUJmVjBsYnoveWVSMmgvMXVmTFpJNERONXFHT3REcUVNNUZzdC94Y3BOYnFNSmNDOXk1RXRqSk1kOTRmSXVRMTRYT0UxcWN0d0JKSFVORzJiVzhMRWhIMXJ2bjhlM1lzM2lseDI1ZlRQRTd5OWN1T1VKOXVXRkhvUEZoYWl2Ujhoa1RWek5YUi92dnNDVEJaelZZY3lTZ3dXeGw4Rk45K2pTR3ptUDlKcEdnVXNFaThXTytwQ0JDNzhMTm5KMmdVZWVSVGhJL1cxd1pNN1Q2Sm9Ea0FYT2lDZnJIa1U4QWxHZUJoTEZTQ3JsYjRMSWc2dDRDclh1cTZ4NHdlU3dhTXpzMjRKRE1UUjUyTi9xNndGNHNRcEgvU1B1NGFKcUZRRU91OFMxMUYrY2ZVaEt2TnplTjNjQy9VVll6RWZDMndueEdHV3BnZmhBTVVuUHVDcituUlBMZ3NTekZFUnNWQVRZOXFyMHkyckt2U1ljVW9PVEdrTk9Fb3hLWmZiSnZzd2FYclZNYlNjZVMxNS9ZWnVJNnhTM0gwZUw1QS90YTFycS93bUxPL0wwK0VTSTVoVENkVGx6a3kxNk4wbEZSdVJjVTBPUzBJYWNLcWFTazVnV2ZaeFRzcEE0Z2NiTkRLY01zTTQyNFpSN1hNT1JTdGc1UVV5c2JXUGh0alZ5Zk1tM0QxMG01LytyYjVicko0ejNYRVVoTXFpUElmUEtTZjJKdVEzQ2lPWjVJcFpVK2t4eEJoMmZQL0ZORDlnSlk5T2J0SFUyQjZUaG1tU1MzVXI0YjRpYU82NXhEekVlYUJKTW5iMlpBOXdHTDZlNGtyQlVQRzFuaEFmWEJEZnFpVkdDejc4cjdQL1JDd2JFVU5QaEFFZEFzWmsrd0RkcDNWUmtYNzNBNXhsNGxkQ3pFeGhXOTRpYldTYUdRNEh5Y2Rhb0hpVEV3Rk93K0JzaWJjU0wraXAxMG9vYUlPb2cxQ3VnWGNNREFXVXV3ZkJ4RFV6bG1IWTQ2bHpaWlhYUkhoQzB5OTU3anUwWGNlRG85QnFsTWZqYlhBUHE5cXJBTFk2eGxDOFJOcUt4VkQvWUFGSWhXNXQ5WVU4cE81dHFMWnE4T1JQRHhUN2hSZHJvZm9JZ2pQNDdsQmVsSkY5WVhBS0I4VXRsTDIvQW5OS1p2bVlmOXZvWW4wOTB6Z0Urck9SRGtMSnN6ZUwrWXVxZE5lY0loeEx2Uldic2s0TFBTLzN1VmF3WnY2dHM3ZmpjcnMvZVRlalpHdE9LbWJRQXZIMThrSlpZL3I5cHYzOVg3UEVyV3JpSVV1YU1scVhzNTNJbTVjR243dnBwMFlJQ3huSHVkUW9IWTdpbk1SM0Q5YlBuL2NwNU9oa1ZsamtjMHhsTW9NcW5mUjVEYXpuNXE1VmwrVlVoajAzN1VOZm02clYxZDJDNnlKQ2ZkeHBUS3JJSFVGTi9hd2J1bGZzK09seUpIdHByY1htVHU0d0FNVnplZUxGUFZSaU9sSUN5WmRaVDVpZVJwTzlacXdCa0JpZzhkdlRIZFp4NC8wRGxKaGJKcURGUXNBRlgyOGlyOGtWNHVFU09kOE5WVGJRcE0xUTdrKzJnL1gweDdRUURPRUJVQVovQlVha3kxNGhZV0xCaHVNZk1nc0t1aGdzNlpqMVRDSUZsSU9GeldIYXh1L0RmbjhVdkhCZjBvcDRyRXV4NHpDOXlKUmdTY24zdS9ncmxGWHpSY2tiOHlhVTNaYkZsRWlYY3hIMGlFWkxqNDBvRVlCSTJtZDJQU3g5dG5wb2FFdmRjRnpPb2g1dytURzhyOUVMUGI5RHRuUEdCUmJKbTBieDJsNkVjZ3Z6QTh2YzJ1enBYWDlOMk0xd05EOFpSdXJmUitUVFR3STFKU25iNG9idlMxSlVDRnNkcGF1NHpFRDZvT1IyUlIzRlZxalBicTVKRjZlVTYrYlRBNDNDekhzaUw2UW9UdXpKRExiSGZIRVdlRENzTitibHdPWXRCWUZ4S1VIRFc1VUdlRWMyT0RJL2p5ZmFhQ2VGeXBzVDZxWW41QmQ0Vll0bTBxc082eGl4MkkwTy8yMWZSdnhyWkk1MFNXMGdlZTRDdVFqWW1TNDVMMXRGK2NqM1NyeUFQcWxDZ3VNSWR3OFhPalBiTFlyUUVJZ0dEak5jWW56NzkxdUtTaWp3bkxWVjNSaGt3WmtJdEZyVVNFelNQcGFKWWJBb1ZscVJueGpFanVZUHNVL3hNemFxUWx6YnBoYkVwelhYVVJ4VXEyaVZDMjdWS1VkT0h0Z29OdU9JNlgrQWJsZ2VJY0dQTU0zam1VOTQrZFlKazNIZzk0NmRWNUpJUFB3RHppSEo1endBMS9hREdJQUx6ZEF5Y2xsQXh0TDlIMkw1eGxXYnlHUU1kUFladHBaQmpVMFhDcnJFM2FqVHhOUVJKcGY1MVV0ZU9EUHBTZU15c05uWmVtTmR5SnE3OUV6Mm1FRko5djF5WkRXL2w2bUJmRlQwYTFvMjFKc3djcFZoZ2F4WWZJZUY2WlVsRWg1TzVabmJ6TVJmbUs5TEljSnlNcmtIRW95ZlBuTnJvOExBY3ladUt3ci9HOUhpOXBUUyt3bXlsS2lmdDc3LzBtZm1sNFdwY2wwMmZiWkxRZ0ZlbGczYTN6WHlPTklUMDlmbG9NbjUwdlVHQTB3M1ZqcU5pRFMyaGY4RlQ1VW96RnFkY2V0OXc1UTBlZVNTMi9pbVluVDVrY21YalNDbElObysxanhScHZwTUlEWWM2UStiSHM5QkthOThGSkp0ZkMzZGhjNlVmRE5ZRFlBdFkvVWhsSWZ2WmpWZW44dnhEVTRxa1BrZjIzTTR3WFFuTmo4VUVHbml2aVlUZEFPU0xTR2l2M0J4cUtjWTdpWTZpR1RoOTBoUHpOYzlWais2NXpqMHg0aUF2NmwyRjZwbnRaaGUwSjRCQ1VvUTVFdmJIZzhvSjVRSmFza3FCNTB5bStQdjlMT0tFemJoeWg0TGNnZHhNVU92SXIxY2hOMFpuNE53a2l4dms2cUorcE9qWGdnSm0rQWdJQ0FnT2VmWVRkTVozMXNBSmdJUnJvVWh6VjI4cUdxRU1ROUFnVSttRnBTUEl1Mzk3ODU4cXpNR1hnTkFlaEtLa2lvekFNdUh1N0Q0eFVNYk5obFI4YjlHa2MrcE5vUmZvd0M3UDFJaTVtT0VZRmtYby93Zlp0VW9MUThqTTU1QVI0Kzd3eDZPWEpOOEQyb3REaisxYXo3Z09KdkNxMXJOMWtQbmM0NGwxdWozVk0zWnJEZ0s2YWRuKzNhL3RwSUpLWUthVUpLbTVtYlZTRjZWYUxjY0RURW5Tc1JWWGFJWEZoWU9iVVRSWERrVStwVUFRUVl2RFhmeWtkVGh0M2NYQ0RwOU1kRi8wdGFnYkxQTFZlVTltdWo3NXhGTk9qOGVnL3hDeHJkclh2QlQrdEFiTW5jSG5VempUQm1nc3pqN3ZlSElUZ1NqTE9UL0ZHQllLa0pOL1dCczc4ekFuVEVPS2pxSFF5Rm5YclpSemVMQlVUMXFFYVRZTGVEbTNkZXpYMGNlT3dpYmpGbEpvY3pVWXEvK0FUNUtqQXI0cGU2VmhvbnJmU2lUWWgyRFVodk9aeWZaNVh4K0hCbXg3dHlFZngvOXU1TVRsSWNIUld4ZnpORzlwMHk3WVNaRERrdmVqbUpZUDlEVVRjSnJraXNudU96THZ0eFpJT1ZZZHdaSkZ6L05LbTFZV3RzRVoyd2g4TEJjUFcyRm1HMEFKbVQ0SmRqRHordGNkN1Qya2VEOUJ3L0tPajRSSFJjdWFNNDZzNWdzcEd2aUpSOVlOQk1iS1lHWjU4VzJZaWpsMGxuSXdjbXBnQW5lOEVXKzdiMWNNSWpCNUN4SG5nQkp2M0haNXJNZm1mMHc3MXRVLzRMRzI2bWthWjZMdTNDT29nVWkxREdUS2o4bkVpNEt2d0xtWlFNMThnakZ0YWVCd2dXei8xWm5YZ3lNRDZCa2drTGJMNElCQUJVamNnTlZxU0svbVB5c2NnTGhXYkNsR2xWbGdqazkzcUpZYSt6cVJlaFZYSE4ySGo2eGZuOVVnckpnY3ljc2dMSitpdEExdkZTM1dXVUd5OU96VWc3U2xnbE1xc0VWeEhDei9lYmloK2hxbSt1T3h5QUQzWSt6TjlYSGRPZDgwU0NtUE04bGZqM3lrOFJSMktCdFBsVXd5alZTK3pKODc5NTNrZXNSYjZJUHN6QVdCRWdYeW4vQWl6aEUyL0ttTU1PUDNQR3Q0WGRkekNIaDcyT0dSWU41d0dFc2d0eFphNEJwV0EvMXlNcldxem9wMkxZYndlRTJRUjFkNi9RN0lPY0M2YWdqSFBkeFBwa2MzUGVjVTVUQjBKSzFZUWUwek5CU0lUNFlabFZUOFkyMnFndUVDK3M5TzlHbXdiUFVmWlord0t0UFBhZGNOWnE5am1DeVdHNXFlTE1ybEMrZGQ3WVl1dmVndTNmdlNCZ3BMYWRETHNaR2FtRzZ1N0lsTkFIc1JaanFjbnJEZFpJS0Mxdzg3Q1YrR3JmdTBCUXlyZzJqWFBSaGZBVmVIYVJzVFY5WEpsWTR4VmZhSHdNM1ZQSmpLMjBYTy9TS2JSMWJYbU5QTkxXK0trbUw1ZFZvbk5QdDVFWk1iR3JqcDdzNE8yM29KckFsZ25nSjBFWHZZMENSY0l3bkN4QTZtbjc5TVFxZ3EvRHlrUFQ3bHVLKy9qYWtvclc0NVkweFZJTVdobGQ1QU02VjRhTDZCYVd4N2Y2dTMrdDFFMDhkOVVlc2h3cENTdWQxZm5mNkVFcjJGcFp3UTI4cHZtVTVBYi9QdmhuUzBpUnNLY0RhWFpoZUJnbmRLRVBpNnBJRFBPSExHcjRhNlA2Tk12b3hLa25GbkZES1RkTXY5djRza3MvaDZESlMrbDZhSHlHdFVvc0Q1bWR5WXBvbU9IWHVpT0RyUy9sMUxadFhDUXJSZmtFckhqL0NJMnZkcmt5V3JvOGZpYzlCekVGdWVZVEF1WFg2WlMxTThhYW1LMVNSOUNuaFM2TlJtb3U1cGJiVjgvOEwzWWxuSy92Nks0SE5SNUZQUGdIaFFzcnNaVHUxTy9kZVJ4Zk1uc1VLZTdlYVdaN2I2NXBvL0FNZTNJcnk5KzV6cTEwNmxITUtLL05JVUdWdFg2UDh0Yi9lcVVNaUVheDcyY3o5b05yTTV6VW1BaE9DNkxRWkVxbGJnSFJNWk1XUk9HZzZuczJTalM5OTdoSDBhT0FkdUZONXJUMnN4S1gyUEh2LzA2azZnRlZySkIzTElINzZ3b0pwa2lMTC93alFhd0dJM1dsUG02UEZLS3B0blVLNDVEL09udzRpeEpoU05jQ1NoZjhvVDZuVG5ITUhWRjVlN0lDTnBJWUxLVmhIZjYvTGRRNWRJcWZzZ3JLTEZYVmkvTnoxb0RBR2FPK2FEVFVuUkZ3a0VLQ2lVbXhuTHBoVi9Ga3ZsMzRJYTNpenN5WE9kbmRYUjBIbTdFM2VuK3FxbnAyYTlQNHlOaFl0L3BTc3J0cWF4U0dDWHZKY0tmdTZ6RHVORExpdUU0Q0NWeWkyZVBPbGhqUG1zNmhLMkZVTHg1THB6emNlbjVTSTdpa3Rra24veGtrVW5BZW9SbFoyR1N6cGU5d1IyMUVwYmFPOVZWUWsva3I2L0pIN2JUbEtqNnI4d2dWR1p0NmVUSWY5VXBYV1htSzFTVmtoQXBhUExTY3RXVjBocXU3L1JvWTZzcGVtZEpreFhMN3FNbkpNT0tKOERGTThLNkRPcnJFajloNW9XbkE0YUpRYVo4cEwva0hnbjRSeTB0cTM3T241TVg3OC9EZG5FalU0RGk5VVZlam9XY0dzMkVrUmMrQjA3T3phdCtaZEhXRG9HWjJzaUJzbVRrOE9VVW43dVFrbk8yVmlQM0lBUjVNM2NpU3ZPV0pkU05uT1pSUjdYNEJFSUVOd29hbzZtenJqeG9yWWN5czdXVHViTU9EVGJVUDduN1FzNHQ2eHhtNzgzalJxQ2xocVBUc1h4TFIzcG9KZGZwenc0eUJCa2N4TnhpMk5PcVU0bmN5dW1YZStmcWc2R1BsYXl3ZVZ1dVpyelBEWjRjZ0F2b3R4THNNZ01VMEs2NDdOTERpUC83NHAxVElWRnZRd0ZkdHhMMXJ3UjN2Y1dQR2JWZXFnWVhXZGliYlErVGFFL3M0YnFSRGdJK1JTMXVMeFRLMFVXMU9UdFd5aCtZeE5WUTFaTlYyWmJSdXFGVWR0dE1lZTNnQVo2N3BxTFYwb2RLa1g4Y0Vla0dMSVZCS1VXQnJUbXdyZjc1TVl6TjBYL0FVYzJNbzVwTmZTSnRGOW45aG16a3BTMnZ4bDVDZVdXMGdLb1lPKzk1dUN4N3BhOFRNazhiTmY3bjJzeUNkTU41UVJ5NTlJS3Ryc0JxZUhDaWtmUUVrd1RPZmIwZkdEbmVxcExKVTUxSlIxcFpXL1B4VkUra3hncHMwczliUzJ0NENXZ085YnV2NFo5NE5DODRZVXJUc2pXbWhGUHk0YzdhalNLVjN6WEJSV25CWFZSb29WU2owV0VDdmsyZUFKTFhZaFgwU29oTXF0c3JDNVhwVzFzQ0YwWUVoTVZFZXFBZ1FvdnhtSjRvdklqcnZSWkJVVXVmL2h6ODlsNmphWmNQN0RCdERlN3oxcFdsMzNDSWV1RjE2NTh2c0t0UFJzVEt4emM4d1VTbndhMkZoRmpRVGE5L3oya3VXUnhQWXV1STdteFVsUms4SUl4K3RBMm9qbUVMK0ZwMC8wdmZHUjlESU5PQS9UUXpWbXMzbkxQRWNlRExYVVlFZ2VvTXFRNU9ST0lQNnBKVlU4bEllV0FiRGt5aWY3THpPUUliU1NTUlNOQ0twSVNIdUxocHJzdFYwWDdtUy9la1hTbmV0eWpRdFBod1RuYUxMRVdQeW1LUmhSdnZkWlFyZEpJMUU4cEI5czVLR0dXT2cweTd4RS81QjlCMDhWTDVCNTUwa01ROC8zb2pjdUtoNjhzMjhMSjhJZE1sWHNBZVZHdndtci96bGJZYUsreE9Icmp6cmFTcHdaT1Q2SzdqZmZ3cG5PYURxcUZlNDdaMjJjUi9zR3lrcU1HL1Jzb3J2NEJRYzZHYTlpRlJKRGVYQmJ1QlFNUVczZW1OVWpVRFlrZWNpamhXNnAvS0xxMFNYbDBpWTZWblpySUpJdGVvcXh2MVgybWxKZlNJRzlZZEN4cWx1U2dtNzZ2eXQraEdySk9zenBsWjFKc1BaMU1HcCt5cVUrZExCY1hyMmd4bndNY1VzV3UzNG02b1RQVE9oZm5ZQ2F4ZEkyOEphNFdaRk8za2xpakY1ZTJkbzZFSG51UkY5NXJFUTd1ajd0U2p1cDFyYXJ1RVY5NGkvUFBPN0s2NSt3K3FmTkp3WVhmc2dGQVhRSEY4cG9tbWovaUpNNzV5YStCZWVpUmRKbUpBdE1CQW5CNXNwUEFEM2Z2OEI3T1kxbGpnSTVBVFhCMHRpRFZMMU1rUWowZHR4RlY5WkNCUk5lWXY3UGNZdkQ4ZytWTGxrRmpNNEdjZ3hITG5ySHFYOTVQZCtJLzlMdll6aGo0OC93bTdrU2doaUJqN2o4eEhhQmJaSkFnS1NXaldrU2RDcjdaZkxEekt3UlRtNFUzZ0JMRmpjQWdGbS9GVEZwc1JCZzNIdWFDR3MxMnBDdGxLRk55d0hPOHk4RVVjdmphQytTU0ZhZFlkbElnWFVqNFBja3dhbWNHU1VFdGtwdXBoNFVCOW9YeDhRL2hNTmp0M1pydnZsUlhSWU9pSkZZd0lqT2ZGaXlhQ2hrM3Z6R0xGdWZxRFkrZFFxNU5QYTJBMG1XQlE5TVhRT1ljQWxkeXh6cXhBK2xjaFZWWmFhY0NTL01QWUdVSHNGZkVWY2pwWXJBQmt6dEsxVXcxOXdkNDZXNDEwMnovSDV2QU9XUDlWVVNNL1Bud1ZvYm1jT0RQNWltM25JMVRiYXlIWjdRU3JBSnBCRXFzZm5acWpreVhlRnBDY2NrOVRyZmJldnh0UnE4dHlJbTB2NnozYVFoUnRRL2ZhdVRzekpDem1zQ21xbDZYcHFnL0FZSXMwSTBhaGk3TGhOYzVtWUxNU2h1TnBhckpGN2hjQk9DNDEyaVVPTGllcWhod1ZzaW5ncTVJWmxBYXh4STNMS0IvWVRSTlFOU1dmMmVabjQ1eWZHVnhVZWMzYWZXYTA4R0l3QVEySkZtSHZTcTNWOHh4M1psRlhGMHpOODFpeE45YVJSVFo0NUl4Qno3aXBIMXNGR1pQRUkyM2s3YlBPcENRQlJ0bGQxM3ovR1E3dEU5YnNlSEM0aVBMd2RPRDlwZjhvaURtSS9qTjhxQjNrdkVkbHhZdE11dVRadW9keVB6WENZTVNOdFdibWgrbGJVMGgzN1BOSmVwTFFHamJHY2FpbnRZdFZZdXR4Zit3Z3BabklTVEd5Qkp6d3pZdklkODZpd3JuTktJNk1udCtOK2dSTTdnWU5QZFZwcXY2OHRHbmNpaFFPY3FvNkVaMXVnd01iU0RGNGNJV0N5MnkxOUFKYXFiTkw3SEdWVXZzc09uRktjeURIQlpRU0l2VmJGeDZZNVJLRnhHd0kxQndxd1ZPWmFzQmwxcjZ0V2xaNnhmaGhFc1JnTTJXcWhkV0tlYUtoREJWKzFXN1kxck5iek9RQ0RkMXZJZE8vSVd6MEdFc1F0SjgrbEFDL1VJODBlV3JDRUE4ZFdBN0ZCZnIzVEw4VU1IZ1BpUFpGcWhwUGJMWWZmQkMwV0FEcmpOdlliNXM5c3FubGdBK1BjeGYxbEQzMWxlL1drcSt4am4xbE1YMk5aK3Vreit4bjMyMmNuOE85ZjkvMUNuOE82QU9nTlM0cktVQ1NQMXlHVGxyNktqTUtyZWhUT2NkU3ZMUDJ2ZkVianZvY0xIUVQ4djhEMzJDSnJvdWdpKzZTOHJoclIzbVZ0bTBUNTVKc3IxNVh2akFFWXJWdnB2TWhkVUF0VHNoclFMbjYvL205WHdKV0hSamF1eVp2L09FTG5xWnhSbWIybE1qN2pmVDlEZnlic0VrWUJVRStPdy9Cb0E2K014L2VaZ2dqTnNXYkVzWDRTV0NYNitZN3hTUmpoRzZDM1B5YmMrN01PU3BpQzdLNkdHdFBmT3BXOGlFcm02SHNkWkhEaFBBMGFIdEYvRi9NWFNFS0Y5TFRJZTE0TzBlVm1qL1RuTU5qYVlXYzFXcVpPZGRuS294cVFaT2dvLzJZcFlsYVplMTRjZDlLRUg3MzZJL3VQeUFER2ZKU3R6N0lwaEJwaWtPZjlvdURNVytYc1hqM3BqSHBKUjNCMGNhQWw4cnY1T0xSR3doWG5paG1uTGF3T1ZEZXFZWjlCNXJ0a3FVb1g0a2MyU2JhSDhjaWZQakFpQjF5Q0xYMzA4TE96aWI3MTd6TXA5N1N2em5LVVl5YytFT2dDVzV2Z3dld2JESzA3VG1US1BPYnVyeGFONFZYcDdkaEZiSTFyQ1hCOG5OWW9rSHR0ZVBaZUtwY0tpS3RzT252dnh4ajNManJ5MXVGK2VuUVJ2TElmS0hkekl5ODcweG56YUhBdUkxR0JRWjF5d1JESUh4WVFxM2xlTTZyV2pId01EdVNReHpMZTVYeVN5K0dLUWQwcENiWHJqK1F5VmU1YThxQTJ6Z0VTRkpkZm1ubkU3L0FHdE9pUzZsek1nVmRId2F3c0t5SmJWell2Z0JnWFhYSFFvN3Q3Z2VYcnBsdzNHc3pOUDZQOGgyR1NhT1dRN3hBQnZXTDVtQmdxd0pXeFNuNk1HMzcyMFR1d0R3OXRhZUZzS0ljMFBJNWdKaG4zZ1U1Y2RJYVJuYW12Q1hXejdJRi9oRXhWQktZbGFWK1JxRGdvcXMvUDJJa2FHSjdPMGxkQVFnT2hKL0pSb0RYVHhNVnlpZ0RzWE9BYzhBV25PcVJCMzMvSUhucXZrblpyNWdZNmZoRTZCSWJpL3BDWHVmV3p6TysvcXFPVXFsYmQ3UmFmOG1seUZLdEsyQ3hueU4yN1BETDhrNVpwV2NqQXJKcGU5YkxCQkQzWDJ4aGtXMTRIdVR4QXFhK3hubURSTTRvZTdjVDVRZXk2M2tRUnhlb0lPdFA0TEFwcTd2Z0xmRTVtYUM3Tm1sQkNnT3N6czM4L3d6bTZ2SzJvYnlQRFE3cUpDK3dUZ0RmL1pHb0l3MTdoUG4rSnZ4dlJQSGlUOTZUMXl1VzZhT0lqNVdUck56cEYzN1pXYTdVczZrWVJWTDhKUEd6Ti93L2FkNjV1VUJlLzFPOHdNcWpjTEJQdVpHRXp6cXBvdSswb2NYRVRiOU5jU09vcWxWNXdDZjdzMWF3blpwRzNnQWVPSFpTMXNCZWRHRWQrK1hlbVNuck8wUHhwZTNTMjUzV3V0eGZ3QWRHZkl1V2R5R0liNEl2ODBjUGl4NWtxLzB4eTlucVdCRG1HeDlVOGFGTGdOWkFUbHJ2MmJTcGxXWHJDaVQ4N0grbVZzemM3M3d0QXN6VWdMTUFXT3JoRGZYL1FFYWdZd3V3M28xaFJSMXV0d090bHVQTjZaMVVtMzBjbFBrNU05RFlQb0l3Zm1LWDhqK2FOVzhtZUp5Mm82T2NFdEJMelgxbk43M0tJWWFqSkNBWnRrL1pQSCtUQTN1UUZuZGIvR3dVaXlMUzdBVWR1L2pBMkcwcSt1NjRvSmVvczdxRWEwT1h4eXAvOHJCL0JrTWxBYS85WFJrWGFWQnd4cnBlQkxqaVJrUmc4NzZoc3lSLzdUdjZWeEx1Z3ZJSVFqUlYxSjFCTHlkMzNjVzN4M2JVYWU3VjVXOHJYRlRjR0RaTmFNWUtDRS9PNnFSVzRsQXZnNVg4cEU1ZDdSVkpId1kyekZnWlVkbkRUcFJjZkdjMHJraVR0c250R0tkZWF4V0tqaDJZMGl5dlBtQklsejUvZHBNV0MwTXVpRndGeFA4V0xwK2s0NnJYa09qZ1NrazJHbDNJeWtnK0hqUGNLTDZxZGNqc0Z4eGh1dUtvMldPUWdMckRxZG1reEt1bXBvMzA3VVdkcExoVmE3ZWpzcml4dmdIS2Y3THh2WnoxZnB3TnViL1UwdVY2VlRNYXVrS2RCY3B3M1I0L0Y2Y2ZPOHN5VnF0MXQ1RGszdmNXNlZ6c3RId3BGT0ZnMkhtNUNuTkUrZzNZMkxaT05hZWFoRmtsT2RwZEhGQ0RaVitUbnBTMVZzUFpZY0wwdEE0SVljWVJyM0FRajYxWFJTSEFPUlY5eTJXZ09iZm1rOXk0V29lWkdGQ0R0MkNkOG1oTFpoR1pOWjZqRkVULzEyYlZqUFR0UjY0NWEvZTVSWVQ1NkxBc1pHakxIdnhpS2hmUHV2Y1F1Skk5RmcxamN4aUk5TTdSZzZGcDg3eFA2T2NzYjJjZjBlOXlwSmZNMnpVRjEvZHhZRkpsSnh3WFBBRUM2bHh0YU5qMDlxUXFXbUNBZ1dKRDE3aVkxNXpQZC93aE94K0M4a0JEaC9DTjl6b3NFYVRnTzF5Q2xHSkw0TVdnSlNKcFRBcGpqYnBMeUpJWWoxK2NyVDhWU3JlMUFzRGZYL2RxVXZkV3VHd1l4K3lEeEFDVnZxZk9DdXloSEdSaFRycjdvRkpQZm5GYmkxS25NdmFMZVlFUGlESVlqa3c2OStvdEVNLzlndmJPRktmWjVCNndJRlNiaHVvbFlzb0JFNTB6MDRQeUVpeFNNWm94eVVwa1ZxVmJvMW5jK3hGdUNHa1hBQVlSNVpxbHNJenRLQjBic0w1cUcxdE1hanpaaGk1QlhUZUxKaTRZc0Z0K1hPOGJvdEU2MHl3WDd6cUhJSkwrRVFaWmVtT3JUZ05ZUmFIR0kvZWJFTllYTjdPbnUweUVuWHFBcW9jdmxnUy81VVE5aWpDNS9xQmdPcmJPUWd4a1FPR3YydkNJU1A0ME9iYjNWVi91d21rTVk4eEE2Q3VkQ015SFR5c0FPK1BpZlpFSXZuWmVFN0xtdlRlRzY5UlQ0alNocVlNa25lZk93KzFCeURMUlpTNGJ0VUtHdVBBUG9rVXZWZkRoOUxNMGhNM0FUWEJLNHNKSDRmd0g2NWlTbmVYYkI3VWlkUVg2Uko0NTZjZXA2aWV6U3g1MExsMEZKS3pxM083S1JvS20rUDJKd284c01uVkRyaGhLMG81dVJBTU01STFTcXU2amZrbFB0OGUvNkhtVktISGtvTmdwVFliTmpwTG9LZGlVdERVN0JiZ0xYQ0MwSXl5ak1VTHk1NlhqYjZXZitVaTl5K00wY0MxZ1hxeTZ2elJld3hPUkx1b1dEdFlWNUNHSktxeW56dmNPNlhjVDR2OFpHU0dleElmZE5xUTRsSFFRMzhBOE1SQUdzazhWd2gyVFJrc2dVbENVaWJleitYRmV5YjVJRGYyWE1IaHpuUUxMaXhLMHl4eVBVVld1SGlOTkZFbGp2N2ZydDgzbElZcHpPQUp0UWVXRkdOTW1aMnJRVG5XYmszQndUbVJ0M3BLU1NDdjRJc1U4VGVSNDl2djZ0Wm92NGd6U3JIVStaVVFvQ2xZSXY4ZUtraWlSNUlNeXgvYzJiSnMzZ05QMFBpV0ErWmVnMjI2azFMY1htRUVkWkxZY3ZuaE5lb1h2YzlOckdsVjFDOFgyQkU2N29DTlpOaEFFTUVVcVhFdGlZWG92N3lwRHlVU2xaaE80N0JYQlZ1Z3FEUzRIVjhrSHZzblQ2QnQydTcweVlValc3SGk5TDB4VnVOS0NGMlAwNUlOZ3FVL3I0MmFuaG5ZMmllSG9lTUdGWW5KdlNaRUVFYStNVklyWlZETFprMzFzZG9SWjllVTBpQlZ0Mk4vemlJZU5STWJJRlRBem1HQ1ZNRkFDNDQrV0RxUXFxakZIKy9wV1creFhJQy8yV0NmT0JiKzczNzZScXR0QTk4VWFicmNBdmFWUlp1NWVubTdLMlpaWEV6dVo5WFY2ZmFxN0hkQUNnNlRqZlFsdG5UZ3BBK09aS1pHQnQ5aWRHNjBUUTdNbHBHaGhDSnAvVEQ4Sm1LOTZXSUdQMGVrazdXWllSM3MyZFpNZDQ5bWNYdFcvN1RJckNRVDdTZmk5TTBuVGV5K3MwS2FUdUk3L3hibmk1QVJlV3lheHdHMW9MN1NobEJ3cW8rSTlFd3dqUjdUcjZuOTRWaUJRQVUyVnZFM1JvalkwQllzaHhiemNaejBjUnppZXhGNm83Q1VRdHpPNE5LN29aQ3pKWVptZm9ZblVwYm85c3h1NmlLTk0xaEhsbHZ5Y2g1ZzJwckFERThvWVlHc0gyZkRrRHJWMk5OQzNodHdsQi9OTDVRdjdHL3U3b0M4Y3RwSUNwbDNKNUpYY3RwYyttNnAwaVA3M2J4U1lIK3Ywb3A0Nkhuajl2UTNFU08xZXJLK0x3RFVZNWorKzQ0ckQ5dE1jR2pnTlBwYzE0Z3FDS0ZnUmpEWE54cVBtRmRacWNEQm5tOWo2YzNqWE5XM1lWUFpIRmFpdUx1TU4zeGxxd1VKRERkQnNscTJ2a2ZNdDRlZkdmUk5EN1dJQkJKOWFaZjRsbTJSMGhDMXRqUDk3Mll4eWhPSCtRdU9BQzdLWjhZZHNnVWQxS08vSWNWKzB3Z29MSFpNdlJOcSt4dXpqUHlkM1ZWWWlmQU9QeVowREdCUDNIRzJtQkNxQzRLQzJDaXR5dmpWeU1zbjF5NktLR0NXV3dueTdMc2RYcFQ5T2VHdm90Qmk3Q0Q4cG1XbHlQVlM2dWdxczcrOEdPdXBvK3BDSFp4QmhjdWlwZ3YxU2RIc0tCZURpOXIxSFowa0xEa01meXBuM0d3MXNlYUwxbGVXb2p2K0dYeWcxS0VrV0NIeGMzU1R6T2pwVmF3WHpuZW5IMXlPZ1NpRGZDSEZNeU5YdnkyK0FmcmxjMXNoekJ1WjMzSFp0Qm03SXRzbENtZzlqc0syTHBpaHVmYUdoMmxqcms4OXJLT3lHWElMbzl0V3NMcXZJUTBKbzhhOWtUWDkyblZuNHZQZHppNGlrN1BKQ1pVOTd2SUdXOXdhM3JUNnNpRzZGK1NRbWVOVnpwQXZBZ0NqLy9QZU9KVVNzbHlUZEZxK29EYkQ5MVQyL2ZJNkhVNkt5cmtYQnR6Ky9ERU4zY01QUHZTeTN1M2xaaklDU3JkdFFvOFl3b1B3V3RMRHZ3RExRZ2lxM3h4UkJTR2dTbHZBSHB2bnFXSUNEWHYyQ0lPSFphZU11UWNKY0xvQnVRNU8yMUhvZmxzTGFtbnlPcXNlcDkzc3ZURElNYlFkSzdhQjhqNFdCRlFNa1VkRUt3ekdlWnEza29IcFoyajRxazdxUlB0eHhsYXZUN2xYYUF1U2p2ZnJScHp2Y3UrMkV2YmJQRmdYU1BlWHNrZU1QWWRQWUpEZ2tmKzhIMXdQSmtBSGV6NGNVaG4rZHd5b29qcVp0T1BOZ2I3YkIvNVdCSjcyVUFIMUVvU0Rqc3NjZFYxYWFqYS9FanhNRFFTWElIOFZzZ3VyZjUxbFl2MGZTUFpURGt0ek5jVjZreU4rVk5UbWFaQTZQWnFKbUViUWlWL25FemVnVnlZcUNNbGtqNHVhdmdaUnlhOXFyTjNUNjJLaHFMN24vTmZKUXVscDZ4UUlQc0o3MFlrMSsxRVZDSVVCTDM2ZEZETDZmSm5TSHQ4eHNVTjRlczQwbGpxUms0TzhBek5xOTdmd1o0dzR4c2VrYi9NcUgvSy93YlE5czF0NmJEbHdneExOeDhmY2U2b25wOFdjdTJnMXl5NDZISVF3ZU5vY0JKWEtXZW50OTROLzE3L3hjM0JqS2JuMTdSMlJWMytzYzBjSVRaQUtkTS9yNHc5N0NpMkRYWW1oeFV4K05VMG9DNk4zbjgxcDJPd29jTyt0NHk1UE1NOUFBa0R6VVNFNFBHSC9ZY3ZUN0xIaC9tR2FIWkdiYWtHTFR5K0dBN1FaUmZMbVc1OXRYdnRzcGlQS1cvK2N4ZjhxNWEvREpIMUlTL0NQQmhTeWQ5d1JvZVlzWEcwckVRejN4T3RjekRJVUkvMXcvSEFOK3g4eVFsMzlEcVg2R3N0R2tlU3VZaUtpNHRXRFdmRk9uTDZrNm9ZSldXK3prRWtuRkY0TzRzc0I4Y2ZZNmtwdXJQOU93cy9UR2UrREhUS0d0MXMyUlVKaVVFb3d0aW1wWlZLMGRISGlmS2hyL0YyQ2tvbU1TTkhQT28yQWpUdlVNTXBKK1h0ZkJ3S0xkT0x5cVNYVjRQZWNNZUE2aW9nWlR0R05tMVp2d1JJaUorTnBDdWxFcEd2eFNzNWdXVHRCR0ZNRDd2K1B5WjQrdGEvRzVQN0w0MkZvSndwRWJhV2M0eEpDQ1M5dytJREtYb1IxZ3EwRFFCTmFNRlJUdEgvSFRPWjVaOVJrWVl1em9UbFJ3bjIzeDd1V2k5WlFybGwvenczMEpzU3VHdVFqVVcyVjhjS0ttbUVlRVdvVXNJbEdrK0hpNktka2ZWNHZodURiQXJZbjBPSWlRZC9IVXdvYVl2Qm1VNFpoT0lnMHVvQ2VEcjNKWndCUHdTeEk0V09YRFZaSE1VSGs2SlF0YmlWcnRaOTZDSW9lb2MyR01JOXFxb3ZkRVpFZzRGc3l6cmdGK2JETmtzMzQ4OVlIN2R2Q1c0eHp5NUtFamROVHpKWDRTdzgza1l3TDJ0ckJwVUYzYk1oeE82Q0l5aFg2dWNtazJUQ1QxRStYRmtyaGszZ0dCUllsOE5tUlNEckhVRFh5N1lxMGRKSlpyblQ5Mm5rQkt5RHpQM2pXMWl4VURZTnN0NUNsSno0K3hHbW9HbHBKV3VjMGNQbXFNK01sZzF4SXRFOFRqZWZyZk1sRGFTWis2RzljZWlsUmxjeWJmWlBDR2VTdXRua21oQU1SRUgrWTljeUI5ZkhOVVZJSzkvT1lTRjVDQzFzUXlhbDVoOWtETVBzL3FxTlZvckVCWWk4MlJCQ0JWeDVaTGdHM3F1MDBFakxFWXFSUFZ0R05rMHBFazR3WnU2enliUStlTmZQQU10a2Y0WHZIbDVMSmZhVmh2STJCYXdRQS8yQ3o0NkFOYnhIa3RRc1pNZXNVSFRPZVkwK1RiT3czSlp0YlY0ZzdiUXlIMnRqbFlreG81WVdzVTMzOEhzQzlQbDY0YXJGcUUvK2xtL0dOOHp6ZHFYRzB0eDVYMUZKZTVYU3V2SlRRbXNuTVV4eFlPbmxnMGxpOHBHcTUwS3dScUN5cUp0VDRuTmJrUEN4dTBEU1Rud0ZFaVVEUU16OEZ5UWRESXdTNkk4NUR2V2xPOXdGNFlKNytvSXVvN1BKR3VHL1N5bFY4MEFmNVp6S3VQTXRKVnFFRE5Vd1pJZXJ2TUR5dFIwdnl2MzBGcmsyblVuOC9RcnNzeElJNDhaOVVTZWQvSUpxODd6bi9nZHMrYUhad1h1TjluMTRVS0Y5RUlzYlBNU0tkbkRWVi9UU3NNeE1jL0lwWHFYOWtOdjIrcm5Ndks4R3VZTHNqQXJHeFUyRXJMNFpNU3hiaDZLNFVUSTl5REJGTHBrOW4zVG90WmRhc1BVVFV3Zytud0xDdWIxQlh2WWtWay9BOGFBV29RSUk1NzhPa0pGSTF5OW1lWUdxbnFUZU01Nk9nOEdVQm1WZkMxaVNTamFWbUtRTFNHQi9xZmRZNFZMTU96NUVSZ0Q3Y0YrVFlaNjlma3NRaGFUczBDWnVnbnBhTU0raGNFemNLak5JZndZRlQxY0Z2SWZjM05FUFc3UGc2VTJoMi9OU1d4bVhhS2Q4OWVlQlNIL1U2RDc0MjJSMkFrQkV6akhzR2FOY2hxNDl1Y0lBSUdjS3AvQm5ubXRTZ0Exd3JIaDlnYlRvaHUyUndROFdSQ3g5ZjRTQ0htcXFBT2RBV2t4N0tDWEVqc1p0QkFJOERaRDBJSGM3ak1HZ2ZLcXZ6cnhXeVE5UjJTUnNWNUQ2R0xwLzNXRFY1NWdKa1U3cDZPVkF5ZFpJMG5NNUtQTVNKMGhob25ZbzY1MVVnNk9FcDFjWUZVRVMvSlVNWFVFMXA3NFRENy9mOUg1VnE4RDMxeUlWaUczcEtQdVJMby96K2ZseXlSdFIwZmRBbFlqRnI0QnlnTkpiRlA2WFJQYVdxZXJ1dVkwM3M0T0lhMlpDdGI4dk0yanNqUnZLR3hvTWt5UndGMmZJYjJvZW92SEFuMWUyUVI4TkxMdnBhNCtLMWVsZ2ZLTUE4S2VCcG1MelZwUkdKVlFaY1ZTci9NUWRhUTlYYzE0M1FrNGEycWtlQXZWYWxZWmoxTDN1YnRMN2RoR1M4c3IzcnVlRGU5aEI5N2ZxaDBoK3Z1LzlaRGh3R2FwT3BpcWtQSVI1dE5xanRzYVR5enRvMnRhcWVSUzZOTEtaTWFCZ0YxeERRQ00wWFJpdnZLd2lpOC9zYXFJNnNiWnJaTU1sRi9iaXlIcGUvQzQ4SUxMWlc1QkdqYzd5dk1EbkxLTDR1bEJFYmc4NzR2TG9KV0xqRVhQZWtIS1hrUXUrc3hHOHhBSU5qa2s0b290Y2JwWUtQMDNSZFVQblBVYVBsN3ZMb3pRVTJqdWFLMUdXWTN5UWFMd3l3eWJTRTRLbnFnbDVVV0JpRmJWMm9iNWkzN2FEbnpKRXdraVlCNURDQWNVQld1TVgzNkxVUGtWczFaejJ2TGlpeUhZeXNLYjUyVHFrNjdEaEdZK3dzaEJoZ1RNSStvRTVZeXhQNXl5YlgwVlpwbkpENmpQWDh4Y1R2SzduSEdlcmd0TUMwVEg5anVhRHhzNFRHU2tnQW90bTN3QVM5M2NObGpUNHlvaGtLZ21TazBrNXQ3Vm5yRHdDakNQbEE3ZzVJb0tPYVdRdEhtSk1rbldlOTBSTFI2d3d2cEJBUmh5cjl2d1Z4N3d3bWJLYThnWWZiY09Ldmp4VWRNT2NmYW5ORDBNcGw3U3luZkVJYll4SXdoM1AxeUd0WjJnYXQ3c0d3d283aXJHcWd6N1dsWGY5ajN6bXRwYmhpZHo2ZXFZYzNGRFZoVWpQY3kvREhzbitDMjFvZENJQVNGR3VOdW0zQUFOdzVKckVaMGdqcWxMeWNSNm0wVG5HOFpIdkFXR0M2OE1ZOW1rYVhKdERSTnZmaDhSWWtySy94cFZpQ0ZQeVM0czdFenBlYkJud0xmblpsdC9aUlBrZGt0QngwQUR3SmplV3g2NHo4OUpvTlVhUFZYR3ZYcjlzWXNqcWhLdm1GbmJ6V2ZjUUdOUzA2dVhNSlgzeUtSbWVVQmZwQkNBaDBVa2pZLzZNK3NOcmQ0MnFZR0lHeHlUdlRKeFJaU1RraUtsM0RacEErREVoM2trTXpXcUZSOHZoblNnR2cwUUtuUUpCQmVYLzNjbU5KOGpZWW1Sb21aUS8zaHdwaDhPdGNUU1pRSExzTmFwOWtJb2k4ZFhqOVh2alZlcjdmaVM0d1NoTVNMcmljbFJIWHdlSFhsWE9sczNubi8xbWtSWkFKS1FlQkIxN1hxbzVUa3RIZDVidUJvcUNselNoc0pMdlR0a1I5U2ZSY0UyZktEeEJBM2YrMnozNm9jdGVsQjNJcXZMVFErUk1WdWdJd2pDYTExQmpxWkFPeWNRSWkxeU1qUlU4M3F3WVo4UFF5T0syTVpzSUk2cmdhaThyZWxUZkRDT0VlekZlMVRvNkNvTUl4YmtwMnV2SEhSUlhlS3ozS2Exb0lBRVFqdVpPM29GbXJUTXdLOXpIM01TNVBjWlRKMzFPSEpldFdDSG1GWGZrbFpRcXY4Tk9qVklUaThRREN2bXZKR0lDYUhxRTE0UlRaQk1MYkxlQ0dLYzgwVEp3c2xlaC9iRW8wY3lEVjdDN1pNMFlNbXVFcEJrU1V2T3Z4SWV4NVFiMVNMZGM5WXBIM1FWc3hjUGlqdi9mdlJocnUvL2NNdm5xMlpRdEc4N09TdThoZy8xTzhoZGliV3cxSjdFM1lhR21kWGE3bVVlUmFjaWdjRGxZYVlPUWJDOGVqSCs5ZkdIdGxNWEhPeW9kbEhsblV5OHpZS295SDdYZmluWXJZUjcweFBTNFZBWUppZWhtUU5pUzhCN1NNRzhMcnpFazhTUnUrU0ZVY2ViRzJ0S3lrSXltUUE0RjRCYjh1S0VxY3FacGcwNXRUM0o0S3RtMU1sL1l6blQxOElpY1IxaTNnWEIzMjlKTEpycFZIWFljTk9GM1BKcHp0bEZFUmVwUzZPdmF5ZnlCNHFuVDREdDkzMGxmVXRPVEtZR1VGdnhmMlFqRlF2T0tpY3RPS3dhOHJlMGg5YU9nY0t1SDM2YlJqRUVGQVNYMC9GcDUyWm9MZEpmaS9PNVNGL0NRTkZ4QUwvOUtTTmRVeWpYaGxhNjMrMVlUZGIxNGxOZkVIUnQvS1pQUlV5WGlFM2NxWC9VcWtna2dSOEJnclNvQldESE5rYlZKZjluTEVPVlJQNjBrSDlMYkNIY3ZXNjB5RUVoNUY3L0tJeGRQaFY5K1dhY2RvR0l3ODVTYUhrWnMyc3hLQjhSYkk1L1RPZng3RzMwN29YbDAvVDhicEhiazRwblExeWNjWDlWMEtkSGFwbGZZMmlqZHd4RWNCZWRPaTdmVytPbVRyNmtaQmRRVk54azNBL2NKU1NFMmVqb1p3eGZ0NjNmQXd5UWNRQkd3WjJMY1VRbDJ4K3B6a2p6OGxmSTJ6VFc1SHZWVzdwVDQrYmxjUTVTY2NoZStqOTNoZzlFRThURmxxOGhxSW1FRmcyWlF1MVFOT3lCSW10WFpodFIyWDVkditaUTdvd01jV3pFVVFBekxBVVIveFlkZjg1SE9abDdaUGR6a2VSSXVkcHptVlp5Z0hWZnZvV3UzVHpOQVI5czVQNWtGMHhKMmdtNXJvcDNYOEtQTlNtK3NCNll2dER1QXFHcGtqQTQ0aVdZSXRsNW50b1dYcHpWRkh4THlkNmxPVGVKV2tpMlpybDZOOHUzcUsrY3pGajFRSG12Q0V5cFZsdnlmZmZkNFIrU3l5eklnMnhZUFNKaFlVWVVhTGN0cXAwUDgyWFk0enBSRzZma210b2VBZnZPa3p5US9jWVJIVlZPUmhPem94SUtrd3Ayckg2cE8zaDlzai8xUVJtTld3Q1JRWmZxeXY3NTIwQlVKMGJtd01YZG1CcFJraThMWEVqRm90UFg0RnFicHZkWEVLakp6aDZsMW5sKzIvUGZ5MDhkVEh3OFI4OEs0NG9rVlBLRFl0NU5GUnptVVExOTNiaFU3dUlIQXBVN1BoODIwR05OU1llVXVlR1pkYTltNDY2dFltK1FKOTJQWkhjbFh0WnZiYTlKM2VjVDdqUXFJZ3VDWFh3K3pSbFVhbzNidnZFMUVqV3NuRktYQ0VBdi9GeGx6bzVFNU5kdXlmaDIzWWZSK2NhaTJiSGtBd1ZPNGRBZmtiR3pjYXExa01xYzNXYm1hSU9NV21VUm15Z054OE1nTXVQYk9uckgveXplWHpSZFBYZUhXL3ZTYzF6SFNiWEZ4R2xoeHlhSVB0emVEVSt3WG5NeWc4RitDSzNwUG5FVU8xaVdkemlsUTYzZk96RzhrYmtFNHBlaTc0blM3WEZhVTVoL1VQRHpJeXRzMWlscDZWVDJtQi9zeFVqa3MzS1N6SEpNaUVsY0ZjVFZwdEJoYXpwUDM0c0M5NEFZSzdnQW5aeHVjT0FuZkNsR0RKdTIvdXI3bUZDR3ZTMUkvaHBxc0NDRDRUNVMzcXYxSVdsRllTNWE1cDJCU25KM3k5anpLcTUyODNtekFncUlxZkJMZ3FaTy9rWUVubk0rTnVXUU1xZzQxMDVFb2JSaGo4T0VCRUJHd3B2L0pzNkloc0REUEFld3RJZ0RVK24vS0ZHL3VreC9XWlZWaTQ2RDZ4Rm9pZHZhdGVyYzBXOW9lY1lXOTk3aDg2Wk5DSDBsY3NHRUl6YnBVbkdDdHl1ekZhR2JHS3NhYXJKRVB5M0RGOEF6UldxNllTdWRFbHdZVDBtZml0MGd4Y0h2OFhJWGJuWlN5R1lYZmROejNkTExiNHZBZU9IY1VoQkw5MUx6MWNCUU1ML0JYWENKY1pYb1hyS2h6N3Q2bUR6ODlaVkxubXJqbWNuL0ZPTjZiVURrSmFHVDZJbGRWcmVsUktvNmtRaUVqZ20zY1RpWFk4dEJNS01rSWhNMERxOUNyQllkNjZtZXZ1SjFjRUl5Qk05L2VXK0g3N2xaL243ZEZuUzNMWFFZd0pkUUZBZFRWSEdFNkNRNlFpOWFHWWRaSVJFVHV2OVVYZ29JUEM0VFVCQ0dPVzBUR1JhdUErZ28rOHVWVFpLMzM1Y1FGYXY2N0ZIaEVRUEZsWG5pMlFtUFl1VHJrT2NVcmRCWTEwa1BPekRkNjFidThEbWdZWUhpVVBEaTNQSTZnQ2NIYXUxdk55UW5aR3BWdEQ5VG1JUXZQelpxWkxLaVI5TGcrY1pqclV2Y2xTbmcxdEdrcjJleHliQlBXb1lVdVpDVnJJT2FtaWZReGRLVDlNKyttL0FLMXQ2VE9OYzFEdTBReUdMUysvdzJZUU9rNExrUUIxTHovMWhkbWhvYXd0UXYwLzdVZ1pvbFZvVjVkaXFqUzBVY25iQitmUUpXd2t0NC9DckFldmZiNERHMmU1SEt6VlFrQVU1cE9pd0o2TWV6b1k4cHJlb29zbGZrUS9zY2pjN3ZBUWJuM1JkMjM1NnZEQVl4UnRpWEp6aSswZ01CWW1QSk5SbWlzK0pUYUltdFpBMWpPZk1sVmd3VXRmNllYUUdKZ0ZPVktXSWhnUTN3cWxMeDR4TnBlU0tpSTd0S1dhQm1CYVhjRkxrM3YwbVA0WEdudUhCK3M0NUYxTnAxYWtueG9wTGEvVzgwT2lNbS9OZ3ZkdFJCK1JINS9odHBJTjJnQS9pajI3NVNzSG5DOHZZN2k1dHJueDR1Qm9qMndSdFVQVERTK0xQNzJPZ3VyUDN1aEtmbHVZYnI4N25VUTA5TnFyNjQ0UVV5ZlpieU54cUlYc21OTy9WeUs3ajgvZUpLWjVMTVhzdDN4OFhyT250dkRPbE5ZTUc4YldhWlowYzkzbEFnMG9PMCt6VkZHRmNQcEVLVUZnMjZ5VkhvZ0tWRDdZZnVxTEJPeVozc1doYXlxeVdIank5WlorL2tVbC9HN1Q1S1YvWFJ2Tkw0ZzBvNWJkdGVseE9saHZIemhxL284aFVzbWhMTVcweUlZbnVHaWduYmI4TGYveUd4M29VV2hjbStod2JydXVsazRPc1JKNytQZ041TytGeWJJMXhnRnZRUU12UXVET0xRWUh5Ui9XT21RN205cmQ2MmpKQWJFdkJTelErYnJmZW03Rnhvamh2aWs3SzlvM0tKcmloWjhhTXNkeEpuTWcyTDFhSmszNEpTN3F0ajBaUE5sT01NMUtiTHhQVEJvM2MweUdTRFF5UytMWk55cWpRNTY3d3VMSmxUakhvUTMzTkhqSlVUV0pVdk5STDc5ekNSdUNnNnJTcXpUZGZPRmVOZ0V3ODMvQjJaaFR5aDFUajNjNFVESEtrZkQrTE16ODdLSTd2UmlJSnNRWmFxcmFCY2RZZm1uUkhNdERSSzlIaVFHOEsvUUlPRExObWt4aVYrcXQwbjhYMWpQQU5UWUNQUDhGRmJQbmRsbzlLVXhsQWIrWkhFYVNkbHF3cFdxczA4K0gyZFI5Y3FDMzVkakZWUFhibmhGdUx3Q3NJckpUcndiK1hTSnNzdXNwUk9LUXBhckk0Y1dtU0JRalpwalltb1lYamdWYWV0QUNFd2lTMDVTOGUzSVhQa05DUWlacG5tdzF0a0hKS3RWSkg4NWVUbW1mdkxJL0V5V2RScm9ZeWZ4cE55Rm1BT2t0RTJnWUpBNzBGSVN6QytqMEZZSTBxTFg5RGRjbTBERy8zZVZnUmFBVnp4RkFmMkhYRk5pZEwvSzRieVltR3BHOEZUY3gzWGRrdHhoSU9pakVHOHdLKzZ0TVBjbVJqK0FEZkpxZFpJYkdkQmRIZ0JTMlpMd1lIbGQ3OFJpc1JYTkNpZ0FYemFtanFuRmt1NWgzb3VQN3JadkwxTlJYcmNBejdkVnYzcWd1YUxxSUpEVjNrR3RQMy9lcXFhWE14L1p4blNubGdpeUxTcjlvWHVUblZZK2ppQmhhSGoxSXVLTHg3bVFrOVphdStKNm8wb1pUSFViS1ZBNHFtQzJhWHlPVDlUUG5LZ3kzQXgvbUoxQTRDcGxIWS80c01pdThMcW1vKzdXTUtyYU4yWUdlYmFCNzgwMWNaWjd6aUsrcmtHSzlTU0w0Yzd3bGVmNnJVMGpodkw3aXRkUDMrUUltbVB1NG83OXNZclNQWG5YN0s5TWtGTXp5V3Jpb2ZXVDBNVmhKMHlDemlZbUhrcG90N291NCtFUmdZWFdSaGUyWmxySjhWdWJlNDExZmJGR2hVTE9hR0xMTjdXOGlvanJCblpXU0RGMmhSWnNGcHliMWUrMklUMS96NXlZUjJtYW5OdFp1MEEyUlJiWmthTkxMd3JGR0ZaZk1iSC95WGlSUk5WbytGdGhPT3BRMlJmaExxV3lCMVc5R0pQcU1BMzJXZnJsY1Z2eWdKeFBuSTJxUDR4ZFJWajBXV3IwR2hxZUlweHJ6ZWNnTzhxU3FLSjBNd3c3c2Z3a3NGSGV5MEMzdlpqQldFTUpsbnozeXV1bmZoS1FMVDJZV3paTVZWQk51TmVFa0JjZDUvQllxcHcyZTFZNjNaU2NVK1E4WXpndWw3ZVREVGxyQlBaeHVxemIwRUYxNG1pR2dEbGovUzlGZktVM1NiODRNUTNmNm40TGUzN0tEK0VmZXR6c0oyR0hCMlNId21CRUxQSlM0Nzd2Y1A0U3BCVFMvS1c3RHRHRTlYZk5TWEhlMUJ3c2NIWTM0ZTJ1UzlZRHFUVVVaMEJvdGdmUFhLelMvcmM5bWhDWFNBUmhOZ0ZJV3F3T1FrUUtYc3NqNGFtclFFN3lTK2xsRWdXV3hoZ2lNQk9KU0NDeXhzSXUwSGpJc2pVc2dXbFJBQlRTSitXemw1WWlMek9aVDArdzFqL1lNSmgwd2l5eHYxbmtrU3I2RDVtNEhSYXhrV2ZRS2E0TEl1Z3hEU1NIdWM0aTE4djlSTitJamgwaVNsWW5FRjNzOVloVkdnVnNvVEQ0NFNlNVJwNTFwUGFqM1J5b1dFVnZlVGxkS0RXQklRTEFNRDQyUE9TZmFvbHhjWGpuanl6R3ovQ2ZLc3hVWTUyY1J3bnlUa25PbTlPbStpTXBnU3Yra2JkYTlTTUJoWnVKaFMyU1lKODd3SEpUVDNVZDFnRFo3L1pROERMQ3ljalRzSWtqbWo0eWU4ZlZ0cVdER2VOZjNLYXhibjV2YkhXTm5tVWY2ZzBaczJRcm43RDNwSHp1bklnOHcxS1VYV0Fxd0pIYWpXTW84aVJmVVNoNE9ReUJGY2JWZlpsY3NHbnBpZk51R0FtY1Fvc202NVhNS0x5SS8xaS9JY3ZDZWd1eGRMZVlHR0kvUWtzWTZnRGdackRSMnBuNkFNbTQrdHNDdkV1WEQrMTZXMnh0azBHVUplV0w5ZTZvck5QY2pWRXdyUHRhTFZNWlA1Snl6VzJzeTVoZXdUa2tFRkVjaWNPa09kb0xRZFNCZjBYYU5rZlJscmtwWWIyYWhWbEVBTS9sQVlyQnlGRENTR3N4WitRUnRzWE40SE4yTld0M1A3REd6UG96MGExOHozdmtsNkE2NDV2eW9EcVBPSlBnMEgvZk95UUtmUW83WnBIOThFb2xpL1ZjWmpxTEUvaVhCOExpOGY1OVZkdTJqdkJERFduRy9IR0piWitSNVBUMWJDUzQ1UmF5azYwU2tLcHZhTWVWbmhOWUdvY0JTREFvcldjR1hpdnZpaGtVQXUybGs0QU9OWTIrUG0rRms0SFU4SUYrUDVwOHBtcFFUcG8yeUFjU1lON0U2ck1ZL1I0ZmkwL0MrdUZDaVp6UTVJS2ZlZkl6TFNIc2krN0pEcmk3OU42VWJFQTI0M20veEErTkRpT2N2Qk80UmpWRG1vaTd1bEJrYXNaMFBJOWk5a0VBRjdWdm0wY2FuNFQxcWFCVlk2S0FSK2xHWXFJWmgwTjllU3V3UVduV2ZNZmJacGE5YmY2cEtFcWVqZ0tDRlRHTzVUQ29kdFZLVG5DODJNSzNUemNDZXJ2TjBvRERaTTJYK1QraE02UUhEV2ZxdDQ2RlYzSHMxcE43M2F4QVNqU0hjUGF4a3dvNE9tbktHdUw5L2JEd1NDVy9VUUloTWdWcTRHOVNMUWZxZnc3L2pFK1NSNXJVWWtOMjRCYWsraHJrdFVjdUJESGRJT3d3ZGd2UUlXdVNDZnNtZGloT0p0T0ZYaXJsdXV2QzNMV2NSc291SmlTNjZ2RzQ3dlQxdXc2Y0Jja1QwRmJqZnRXSDF0NkZ5eEtBZjBFRDVFbHBiRHVzdU43OVFQM0NZeTVkQlRDNFFYNys2cVJnRTFnZi9kcnh0MU55L2JtTGFrclEyVUZtYjJTcDQ4TnZodjJtelppdmxHTEtuOURXOFZqWmljMXJKaGxlbGt0SHFnTmpqYTQrYzZLUVp3Nm1YL3EzRDN1UWJaR0NXQ1dLSHF5M3JYZUJMR0wvMk1Ca3E1U2lhVUhYN0FVWWtrcC9wMVJ5Q2ZYV25xVzNEWkI4ejNqQVFMSTJ4L1B3eXNvUU5nYVF1UWtuUGw4cnhrQzVjVVVwSmV3Vm5Dd2V1R1BkOUtETHZCNUozemVRUFhaVytjYURHWkVqNUcxdjR6UVJpK2hZMnhaNzZkT0pleWJCZHU4L0JQdS8wT3lHTWNVK2ovT1FLRnduQjBZM1h4RkcwNDMxNzdKazJDOTFVbEcrZnhHL3ptYmd6WDZDUEhzeGFWL1pmNm9ESHp2OCsvYkE4eENuL3I1SlI4SXMyanNOUkJ4ZzdrRlYyM2JlWEtVNHl2MjFHN0tpQkJWN3A1cmgrY2ZzV1NsaGNEUkJMdXJNYkx4WUNKTTlQOGN2ZzJwQlJpZXhSRllmeWthVzhwV2VsVEFIVkZ4VUZubWtJZ0xMV2ZDRTg1OGVhcmZXNUswaGZxY1EvZmxOSzB4Y21XdXNwMnN5NDducXNvbDhZMHBoU1hwMkhSWHZVSGNlY25veFhiYlY0ZkNaQWFpdUE0a2h2NzB4MGlpRXQvZVJHZUR0K0srZ2FZMHoydU1RaUJPbko5Q0N3bW9TeEtXQmlHQndJU2V3MVpXWmpDdjJCdDFVc1ZudmFRaDU0bzQ0bEpRZFJRZmhVSEdUY0ZTTE5IeENFUitiaE9vUk1jNTE2b2NYRkxzL0NsSUZyeXhkd0tYbWtYTC9Cd2tzTyt0czBaQzE3M0JSVThBcldxSnJ5ZVIvM0VEUTkyVGdrWUpjQi80dUw0ZFlCMGJDZkxRYkcvUWRXaC81cVZWTGZiUGdPSkNIN3hHbzNjSGpNeE5WOWh0M3I5cWd4ZzNDb096WDYycGE4T1lTZDJaMTZ3QWNiYkRoNnBBOXZaMmx6VXBOVitDSW01TVNkbGgwZ2ZNWnpxd1FwMkh3YVd3SWJaOVJjKzFLekZTSnAvS3RGNE12d3lmdGVMU1J4R29nbmJhelhUMWVXc0tmdXNWT2ZOY1lNUTlEaEhIZmhUT1VSVmZFVHE2WDhQZjhFUlExa21JMVRLbDZZWE5ueElLQ3p1aTVZUXFJd2sxV09LcWlZZnBVNlNwQVZTa2s1RFBMMkNSUS9EaW02RDJkamJMNWlTRXlhTDRyVXVDeFVIckJQWEpPNm55VkpjS0dFa2h4MTlxdnk1QmdhZ0hXam9tT3RlbEtPaXcyeFZnM284VWxueEIzOVNrNGw3YVhtbENuTzhHeFJSZ09DRk5iUTlZWDFUOHFpc0ZVUXNQRUttalJ5N0diN0o5RnZzRnBtNHU4MlpDN0o0RE16S3czR1BTS3lTcFluSURMNFVwUEhFWkdVazl6N3Q0M2xFY1NzeCtFalVSeFNjSS92c1paeGJvb3JjR1d2NGRsZ1UvQ2Y4R21rRUtHZDRLUmZEOWFndTZUQ2s3YjljcUdlbVdoVjNtWUVqL0NrWFFtRzY2MXNlcjlUTThRaitjODZIVE4rT3MyeWxORFVrUWRrZEhCeUdNOUYwS0lZZldPSGNmeXRmdUpUSWVqV2VEQnBCcWU1OVZMUFVmRy84TjhYVDhCTEJ1NldZYjZPclp3bWdnSkd0Q2I1Wmh5QW9oMDZRQW11dzd5SVkzVFNRYjlUQyt5WnZFNmFMOVJIdlhlTGhXaVhzZmF6VlhHS3pKQStMV1VndGV3MkV0ZTk5d3dpWUc5UTQ5cWhnNkc1VWhyVkxNTk84aThqYTAzOUxzNlhEWDFPNU5ISEFUOWFVNStXaW9VT0k0aFRJSWMyS2FCS3ZCZXpyUm1yaXdPY1V4RjFxWE9aNVVoWmRuNzUxUWUybHNCWHBjYzd5SWplQ2JkOFhlUnE3cHhOTUx4VFVWYzZoajFuc1hGa0UvV3NWYjVJNmFNZDc5ZC9LWVZWQVdGZXNWRStPVHo5dkQ2QVp6QWY5TnFXS2l3WUorSGlqQUlZYlhmL1c4UXFFeUdhNkVKM1NiL1V3ckVFdDVUeXBMbkdaM3BZdXYvbldyY3RGMldveFh2V2J0NTU1aU5yTTZoakYvK3d2TDZFYW92ZzRHMHErWHB4a3k0dFJ1NnN2aTZvaExYZ3FYWDYvVzV1NHBNdWtPaFM3VDRvd1lVM3VTNytaYTUrdC9GaSs4WFpiVXdDOFdGakpkQW1BVXpGRlFvdGRnWWFsWlg2NXpRcnB6aWpETDlnSXlmcUZzK3U5azNyaVA0Rk5QZE5wZ3NRMEhmQTBieXQzaytoRmRRV0JnK3dUemNmOUUxdTFZRTNkNWtHTmpwVU9oVXQxa1IzQ21sTWZEUHBUejdsVnp6MVFRUzNrY2YzZ1czQndHTzhEdnJrZFU0OEQwYVJyS0RaNVdscG9ZU2tkZk84L2xpK2lYOVlieEQ5VHJENUdKK2hZdWJvUlV6YkdEMkV5NS9tblZnZlVhREs3dG5uVVMwcGhBa3Z5bmc5c1FkdEpkMERub3h0UHJEUVBWdkhGY1VyMTRMajhOYmh6YXlZbXFTejl1aWl3NnVOc2pBTUFNVURCTFNFYWlldllYTmY5TG9hQzY5ZW1uNk52ei9STm12WnFGOXVyZEhKcTI5bDl4Z2JhWGJxdkYyQnZtY1V0VHphako3cmt4UEdLQlpBVTdPcnpLdlloSFZwWVJRN1BaWlQ1OWxRSHVUdzhwSGk3aExodnBFVFMrRWlHZmRheWREcEZIYWxrUzIrdENCOXFGcFFnRXZMM2QzeWZNZGNJYzYzMHNGNjV1YmREMzF3UUZVS21EeG40K2FFVHoyRDcyaTFWWStBUERCdjlvbXhIQVBoMWUzbk1vcXN2STRWM21yT0Z1a3ZzUVprbGdkcjRNOENocnhMdlpIVDJFa25ib0hEY0xzRjNIVTV5MUcwbXdCZE84SkIyZU5DK0YxUloyNHpjQjl6UU43YTg1NnRUa2RiWnI3cEsxNEE2bWtEUkdqdE9UQlZMdlRVa3Z2NDVGcGtMS1pWMWJhSlM3VTUzL0ZOaXU5ZzZRdDNFeGY2ZjZRQitUU2gveExXSERuRjAzN2FwZU5KK3l2cldmTXVlMCtNSjF2dnB5a2I2QXlTSmM2d25jOTVGR2syaFZlM29jTTU1T250bzJwdDl5RzRDU091Ym85bzF6akdZUFE4MnF6bVNwY1NXMitVcTJxeFhYREpaeFJoSyt4dUxtS2ZNU2Vyd3owbkF0Yk9KQTdVZWl1UENTVTBZakdRTzFJWHJwd044RXRkRjdpWFNVdHdEcUgrQTFTdXRmSGdoaVVFTVJqclkyNFlxTWFPZzRXTm1sU2pQN25NYTRVU2lsdmpYQUVXOEJwbTRPMkY4Z1VIU1haaTh0VHJveHgzYW44SFBoYmhhTmdUZHc4RFBBbVZPMWxyOFJDSWd2QjFIelZrbnhQOXU5WnZnRVBhdkkya2tVL2R5YTFzUWZnWm52M3BPVXV3dmJTNTZkVFA4Qi9xOWNsbmZHdjZhL0pWOXQ2TTVPQ3dBRE95YmtzdGNYaGk5TEp6Mmd5UWQ2TWx1NHhOSlpGOXVMRnVFbmtibnNyYnFjU2kza25seHBMck9tR3lidVlmNzVvT3ZRY21aaTlVbHdPUnJxWFVUQmsyNDdvZmhZK1R5OWd0S3hiK3NZWlQvNmVoak10Q3A3aHI5SlMwTmlGNUZHNm9pQkF0ajhxVXkwSnhERFZrSGwyUlFoeE5OMGQyTTV0SmNsM1BpN1JXcEFZUXErQ29XSGY4WlJuSTB4SVRIemxnOEc3VUtGb1Y5SzV6VFBPSmppN0crQ1ZoZ0luNVhpY29Qakk2NForenhLUjlmajVQUnEwd1NBVWVXN0ltcVpDcXRvY21adzljQWV3cTJXVVBGTVVSTnBHWFB2ak5BNXU0Ui9oa0QrcjRzalpHKzIxdkw1em5sOS90V3VvUFdDOEFjcjFOZXR2ZC9rL3FSV2kzWHp0dElud290VC9Wand1cVV6MkVRSXFzWFFGbXp3bVRnOTgzTS9VbXlEYXRxMXgyVFhwZ1FYN2tqOUxxZEtDemUvVEpIczl3YW9SS01wMERnbmtJN2F0Skw2cm5MckFRcjVsazlYYnV2UnMrTXI0aUQvZ01GVG9yREVHQlR5Tm85TDlhTW5hdTMrNGtLQVM4aEpOUm1WeVhGWS9qL3dXOWp5a1RmdmNKblFqVXhOU0tLUjFFNWR3citFdjBQaVY0SkYxd2xUVFpWdGlTQS9SWnlBKzFFQlVjQkM2dU5jMzhiWXFMemJEeUE3V3k1Sk91Q3BWREpEcjZYblowa2Fmd01oMytpNmpmcVJ2bWJJcm9SMUVaTmtEYm4wdUNvM1dXMy9EMnVjZ2UvWjUvNGJNSE01TDBCMUNFdnBZRXl6bmhQQnhjdjk2M2lUcVZ0M1VKR1FOc3hJYTFESkpyNUtuN0ltRGZlZ3FSTVJ5bk9yNjFGYjhNYUdBeVg0bWhWOFhEM2JkbmF6cDFJY3BqQUpwS3VCR0FHNkdvUXcyWGs4MFVzS2dRM0hxS00yWmZnakxmaDhjQm01Smtzd2thSzVEWlU1cmtVQkJiR3RhM1BqZ1V6cHlkK016eTB0a0Nwd0VvNkxRN09URFlJWkhmeDRyQmFFWS9BMjBMRzNrenYyZndwV0ZML2VrL1A2ejU5Y29UemRLbTdpS2dFOEhkaUc5VXZ3RDFucnNNZ2pXUkhoNzRDWGNpeExXbk1EckJMRlV5MHZrY21WanIzVFBkUm9HekYvZE4wcDR3dnNZWktCWC9hQkhxSTlyOUVwVldYS1NKWEpJclR0V05sRFdCZTlPbXFnbmtwY1YrSGZuWmVGUlpSMEtzOXZsQ3JSNVNOOHkwNDllQzlyTklvT1hSS0JQSUcyQlliMk90ZldvNFJ2OFp1NXU4YXVvbmVZb1BucEpQYlJjLzh6c3NYUnZteTRDSUNVSTREeGtoVkdWelRIZ3FNaWxud0lWbzlDZm5aZGgrbHFPd3JhNTM2bUdScEJuS055Uko1RTFjQUhxdzA4Qkx6Q24xUmNJSUt0S3VzV3VRR1pudS9GK2JtWW9BZlhCZldQaU5wWk1rNDlwblozeTNieDJYYXIrSXpoT1d3b0pCb2xyTWZyNVVlZU1GSDc3ZmxnTzQzL1VTdHZRVEQyQWxBOUUrVDJsRU1pQ3p1MzRmTFd4ZmI0TWZ5eVh5ZlVIUUhCZ3ZZLzV2aklCb2RWYmFweDlCM2ZXN3JRek42ei9ONUxwQWZ4NTB1UTN6aWd4ZG4rS0YvaFh5NkRQbXBJZGRvSW1TUTlBRnFKcU1jVHA3Mi94amlpNVdKY0VUZnNUNFlDeXpoUDU4U01OcUFHSFpHaE1EYnIrc0VpT2pYTTJqKzc3ZCtYNUlJMG5xUUFwUkdQWG5sQjFvWG13RGVhYk9TZytZbnBwM3djenBGQjZqaUFiNEZucDk4d0cydlJiNDIrTmVPbEN6aXJFTHlrT1FTUEVramh1a0ZHVW05aEY5K2lPUUpUTE1IUmVWakpodW5EUGdtZTRBUStQN3l3Qy9TVXZHRHlOd2pwWXRoL3Z6Vyt1K1UvVUFNZkliMGF3M0FYOXA1NzJ1aHRIVUR0T215OUlYbGlYcDdTK1J5cC8xNHpkcHdEM21vWUU3c0xFZWFaVGJhRTBsMFRYYmJkQ0JYNnVDRnJGU2E3eVpSSTd6dEdNbHZGby95MU9xaHMydGQ5eXdvdmU1a1pPV0VHdG1JRUIzRDBjcHBJL0wwMHgzS043MUJGcHIwQ2QyVXI0bmdLendoKzE3Sm80b09DYk14d3pacjhVR3FyL2U3V1V1UW9rajJIVXVRUHhEZlRZaks0WkVpRVhsa1MwVjlTbHhhejEzRWpVOC9yZld6dGZ6YmlhTUhxRmRITGF4VDFYYVM2NFZqNTUxMEdRbVg2UHhzcTN5WlVGaU5pSzNLczBROThjakJuaFc2dzhCNXkza0NaN2p4MEJZUVFOUE1jejQ5NVYwMi9oMmxvTS9FdW9JQ0NZd1V6VWpQd1VVRE1EcFJvb0Y3K3I2VlVieVcvNk5JYkgyWEJlTXNRNHI5aEM0R1V3UkdOSUdORTVPbGJzWS9rTko4Z3U3MG1BRWswT3MwQ3lmSm1Kb2p6S3lndVUzL1VTOFJNMDlvQWxFRE5aSm9aNXc5ajRaVDloVXNKV2p1QU5NOXhQZWxSWFB5TkZtRXZZVnoyak9PaVFPVXlMdjdLMkF3UUhRdVRPSkVQNUE0MS9sREJEQ0ZscklzTnBGL3F6N25rNVEvd1g1YW5nOFlhbzZwdkdOY1NpODFvNzYyUVpMbk0rSk9RbVZNbmxPMzZYUkZZZmhseU5sZVk2NXQraGNRa1h2cktiSkw5M011bzJFb09JeDczQWpJVHdmdFV2WlY3VUFleVQxeW9rdGZ4L1lpWnM2OWJ5L1RHeWNYWTBuZFFjeUxrNzZ5K0dXLytBZS9maTZ5OXpqVGFtMXdpZ29maWdyOUlzRlZjK1ZmZHMyUkJxcCt3VXZjeWdmanVldUJJeWZEbHFhUUt0dTBMbzZ6cmNXeGhlK1JieEwzSjZrV0E5TmQzTktBcUViQ2gyOU4xTm5GcUZKU2Z1eXd0dVRUN3cwUDZRT2RQNHNVSWlIRjdLR0dQT2JvOG9xSG9zNlFBV3N4YWNrVzJYQUJ3bXhJUytseDlVSnNoc1RNL3lTT2lhZURoUllQUi9oNWx2RU5vZ0pFTUxTWk1yOXVpckg1b2VKNTcvdWdsbWhQZUZ4Z01paTJOMi9tWTcyaGltWjRyV2xoTVlYTEYwWlhWVWZFaUVubW1XZXhKcFQ1eTd0NXY4dHowVnd3UmVMNzlScUduOU8zUDlEb3dyZU5XRFpYZXZJSzQzbTh0aXJ5dElaSlkxRzZtZCsvQnRPcGJrNmlQbElFUTM2cTNqaHZyekMrcGNCWDNqdDBTZVFvNjNjazkwWVJzakZrNmMwN1lLOFRHY1gwVVNna0xXQzNzTW8xUGN1NFBJTjhmWFVZRENQOVYveVZJOU1EZ0JYQ0h3MkdLUFdVMFA4djJBUWltQUxUYnJ2V0tjbStnRHRObGlPSjMxZEVwMTZNSjNNOXE5Tksyd1JCUmdkZjlBTEs5RHR1R1RQSTdIcHZqYTVFQVUzT280ZytSNlJmSzV4N1Y5WlY2Z1daSWFFWldyZFJKM2NkaTROR092Q011ak9hVkVtUCtvVjlqSFM2c3ZtZEl6OFplcEhidENldlZ4N3RDbWNUcmtyeitDb3UzUTZjWXdHSEJuZUpESjd5RXk5K0g5cWduSlo2ckNzbERjNmhKYkp2N2QwQ1BzVWMxdzYyUjg0OG1BR3dDU1paMUdEbEpJcnNST2FUZkZCVHpVVUJmYTNZdGh0UTdkNWhCKzMwU2NySzdYVlVOSTJaRUpBRk0xZFFHNWF0bCtvZ0t5N3ZRMWJlRjN1cmI1MTRqd1BlMmFhaTBteEVQNHQwL0N1WVpvaEQxTzcwZVZWRFBNNjhDT1pzaUhyT08zajR6M1krSm45UFVaWlNFRmkwV2ZSQmpCaVZaT3lybXpGVzU1WWpXNlJ3RktLMVZEVG91M1REUXc4MEhFSzRTZWJEaFh2UWNBMlorMjZHRWQzWU8wQldpMXR1RFhSQ2hjL1oxWnN3RGRrckVlNkNicDVqS24vWkdNQTdGUGRTUmJCSDcyd0xhQXJYQm9OYjBWZG9HblBWaTB4NUNXTXJnYVl1OVpvdmtUdFU5cDZMR2N0YjJIQzlrWndoeHJYRnpLN0VTK1BXYXdQNUxuOXMrQVQvYWNrdG9lOEVqaFRBMExiakJKVlBnSnIyZWZIUERzZFNidGtVQVFNVkxQZFlidHpsQXVPcEJzZks1YjBjNUtYWlgyZy9kaFkvaHUwRUNvUjZlSnVveXJ4c1NKKzlZNUYybEpDVUpaUGlubnU5K2lyUTV4c1BpUGFzeDRIaEhlMWdlZ3VjUm1QMHVXb1F0VkhOZHdqaXV1VVJFOS9WS3ZKazE3QXVlRFY0TGNrZm56VUNDMWdtU1dJZ25WWWh6L0FkMllPNFFCYVN3S3JNb2xlODI3ODV2NUpsaHJLQU10azJ6OCttWEtzZG9BMG0zVVBwMmEvVTA1eTRjbThRUFpQenFTK2lZM0N2UEdqWVRHc1U2NlZncnNMa3JqckEwVDNCMGdFNFRTUnR1aE9wOVB2b0lUWGp2L1lMK0pOZ0c1N1hEYThXNThsb3NiTTA0M0NvZ0RBcE5tNjRML3cxRWRDMi9GMHFPZVhtblpuQlBrQ1NWY3BhUVpPZExFMkU1cXp6R2xZYWZWZmJDMlhLUGg2cURUOHJ3R2JQY1NUWlpKaERWWTdZUTFZOWdtOXJ3N0ZPNDJVbHhrYVU0bGpQR3ZaamNrUmh3dVRLbndoYWZDbXNBYyt3Rm1YVldqVWpIYmd1Qi9vdVBKaVhwWEFJOTJHelNtb21VbFFpU1JhOGpoWGV4Tzk4MUM5bVVib0ZhSFJNK2gyallnZ20rMmZEVHRkczA1d1NoM3lmRHUrc0tXSFRhSk1QaXBLYi9UeHhyR1ZjMTY0WmpUUW1MSVFrMVFZa1VnSTBuVnVGZXp0aCtrQTZOdlZyRjFGZmJjVmFxZGVIWTdNZ2F2clpWYmU5clhaS1g5K0g2SHJidmVjWW03VGhDWk9RWUxpU0JZb3ZQMXNuZmhKbTBzSWYvZC9kRFdVYjV0ZWVXdnFvTHRPaDF1ZDF2WDhwQ2cwM3YxWEcxRTdlWUpJdStITXRyQjZGcDBGZEpvazV3SUN4TzVIa3dRNEFML2t2RTVBOGlkcUdRRThTVWtLRVBnNDAzNjdXNE0xWjQ4RnoxZkc0aHA4RE5Yd2lzc1k1d2ZSaWdMNmdLZ0hPYmhEQjBDTTNKeEliaXZQUVQxTTU2Yk5ZeURTYUJNRk1kUUVXa3ozUVloaUtCdWVuakYvYmpramM3ZzF4L0pNSmlsUE1xVjEyczZldEltajlNeXo0cXlWRnJsUUMvYzNKYW1WdzVKcHBRZkk2SVlmanRmVWlON1B3N1lIVFppUkgvVSttenJBSHFzdWRqOUd0L1RCaExzM2dPWm53UXI5UDZEaUlrM1p6WDFMR3RHQWpGSUh1eVUxdEJyTGdDYWZBcHEraXNTQ1FqWDhyaC8zNGRvdFR1ZjZsTTVMQ2NwT0pwTFhMb1JBSS8rZG9BMXF6bDh5d1B4NGVXOWwvejV6TVM2b2tyeU92d3A4ZEIxM01WNlRIMmxLWFpQM0ZxU1VXTVdnN2dPR1cxejlyN3ZyOTdIOHA4bjl6SGtRdnE5YnVTZHp0ZEJTcEpMcFlobThLdytMRkgyK3FhQmJOSXZnMjh1MVlKcU9peFRyd1o4cm1IOGdPcm1xM1plSXZnUXVPeVpWNnAyc1pXWlM0MVh3d2ZGMHdwQmZrOEhaL3dEWmUrVnFObmZuMGNXNy9pSERGQTRVL3M2bE5mcm5CbGR6TzhsdXp1TWsyZ0lWQVRGTkQzZ3lrWG1oZmZwS0hiRWFNQnNxbGhhR2M5b1l0c0U2UlpmeWMxQmpCMFFYazNwTEpXZ3FpNjcvOVUvMlpVT0NkNUxzeXRTVm9ZZWNZbVhRaHRSQ2dib2txZEU4dE5BdmtFU3FWM2tHV0lSNFlBdVNPZUQ4UUQ5RlNZa2J2clppTDZubGVyR1UwZDlZZWdMNFdLemZLQTg5clEwQWR5c2FzUTh2ZU1SMEZRMDRrUGNodVNjdlJ1Z0hOSStxTFVxMU5tdHN1WnpoVlFHUDB5V0lWTWsxZ1hzYktjZjl5c0RzVEltdGZWaCtmdXFUNTh2eE5BSHJRdkVrNFpMc3M3Y1lWWjJmOCt3NENEZTNHYkhkNnMwTXJxSHh4Z2wzNklCMUtBa1BjRm5tV2hHTXNrU1BRa0RBaVJ4WW1maGVoanltMWthWW9TcmRsL1ZXV1RtYlNCYkNEamZIbEFpVE5BU09YdEFUdmpYNkJ1VkZYMzJKZE45Y0tQQWJ0MkdMOHNIZlhhNHYydCtkbHZFcWhic1NXT21tTzZBb2R5K25INytVbnBJWHBrSU9XeDY2VnA1ZUJYdHB2dEZwNk1NcTdMdWRiM1BmT3IrQUppTTA3SGw4SEtLbW9OcThvK21rK2JQblFHNGQxRElNTW1OaEQ4SzBhc2RieWgrWFdXYXIyeXpsWE5XL3IyQXRQQ3RkMzY2bXoxbVFYNU1KVGR3eEs5QU05Nm5BbEIwM2gvQ1RleWtQTXl6cndtdmhmTDFnVlJZZzE3dzVwOStDc1ZFOWRGZk0veVA1bDNvWGNrWGhkcjBjYXhza05WSGpxWkNTaXI4ZHZUb095MmlTNWgyN1lLRWtXU2lLRCtGYVh5WkNxZDBoY1JTbEwxWmZ4Z05SVjI2Q0FCbnJzZUt6UURvQXE5bGpaUHI0ZmQ1NFlwTjAzdHJZMFprUkRDcXZOdk4zY2tOYVg5UWc5Y01HTEQrTmppdzl2UjNWT1hhTy9mKytEbmlEeWhSaG13OS9JM2RTdmluZGthYzA1dlFCSjJFUm5GWUhoRDd1Q1NRVzQ3dEd0VU8rcUNneVhzQzcwUTlhTUJQZ3NScmFWR0tzeDZIRGtYUm1wM2REVlk5bzh3M21pTVdObHgyU0wzb1ppS0g4WmI0Zkl1ZzZjblVnQmI0THErWCtSNE5mMFpMR0o1cmpJcXVYY2VUQ0dkVk5PMmh0ckZkSUtnM2JIRXpRZHdWd2Z2SGJ5MkljY0doMnpRSW95endVTHdWc21kMy9pbFRDNkdPVlFlYkpEK01pZnJKRDVHbDEvMktrVGFVODlFMXhwRkJqZkdPUUQ5OW52eWl2OVhUOVBYODJZS0pxUFdpQ2hwL1EyRUtMd3pUdkNsdFpKSTR1L3F6aGx5cWZRUnNyUWJNVnluaWw5Tk1Id3lQSmdYMDkvYUtRbnRmMGVVM0FROTRmUEk5MG9uUHAyYWdyK2FKbG42VnV3MWFBSWN3VXAvZEVSdTBSalFlaDdPSUcwYmYzcC9XcEVUbDFFa2RDSDN4c2VjY3MrT1V6RjB0SCtsTjI4SjFrNU9Uc2tJd3QxT0xGUDVGdVJzZEdTWmZSQnRob1QybFc5UEV2RXA2WHdnUlcva0FZeEVoSVIvL0NvNDh2RXdrNHZjQ3NmZTZha1dJQ2UyQ1h2ZE5WWDhoU0IxVFZCK0ZvR2FRWllZZ0ZVZi9DenZ4a2tFbVpFbXQ2aUxhVHJsdDdaZmxzcjRvdnpwVFFwdldTK0dGRHNuanlCc0tna3IyOE9PanNUT1JpWkdReXdPTkJ4a3M4ZjVxcmNDOWl3M20raVgrR3lTUWpyc2lpdDQyeGlVNjh0MGdQR3BEWGRna1NDVVpMV0U1djZjcmk5QysrTXNzTGt0eHc0UWFtbnQ3NlppZUplUVdtYWt0N0dLTFJFUW11R1l4bmNOR01rTG8wVTVNWGFlMklpZ2ozRkxhUTBpZXZhT3ExTEZsZUpIUElGc1hYOG1ITDlFNjVCNmI1bWljN3dMdjdCZVRRY3M0QWNRdzh6bllkWmw2cTZRbk9VSmxlblRXRWhOOTFob2czY1JIREc5NzQvQVNDMTVHYUhJa0dyZjhKRGxDZGt2bElWTnRRUTFnajgwTjVQUkN2SUdLMkZsZlZKejV1V1JLTUg3S3N1WldkQ3BUWXVMSnhXMDcxd2R2ZmYwUk85eEovc0QzZmgrVW1wYzBGY1JPOURzSUdSUlRjeVkxSnp1RVNEcWlteDhjMzgzTEJvTkxDbUd0U3RtTjlRQm1NMGJHUDZ4dVp5am1oRktFYVA4YjJybmVmbmJyZDA0bGJ5enQ5amwzenhWRUU5Tk9LYk5kMVlaNG91S1dGT3U3OVg2ejR6bGgyY2RvWWFMYTVIRzg5ZGZabzNqTC9RWlpGVU9PeXcxUi9IdTZtUkdicGxFZDlBdXFETUZMKyttVlBYSU9mV1A3akhDdTN5cm5CbEFnMmt6ZXgyZVZIS1hyNE52OUFOZVc2M05hR0pUcDNoeisvd2FETmZJVFR0SUhzQ212SllXL0JVSHZTOS9lcVlrcWJSaGJ3MFZoeGo2ZVJQcmg3MGsxMTBDb25ISnRVdEFFLzF4MURTV0RWa1k4cWoyMjF5anZ3TEFEZDl6bUtFQm5nUy9EdWlMbnBSYS9yMzFQbm9kcFRRMVNkem9EUGdlTVdwNzBEOGpGNkZkRzJJZkNVcWZmUUJtMXMweC9WOXNPa2EwcFV1eWxjd0RZYW1MaFcwM0VSWXkveW9YL1FBNW9hR1A1djh3MXFMUXM4SXh2YWJ4UUt6bXpVcnRDNStUc3lwZXBwOGxYUVNZblpmeHU3NGJnRXpsZGZ3UFp5ZTlpWU1HZm1oTVhuTGIrNDUrVm4rVEhGUXp6YzZpM0dOZUsvR05OKytJTVBEeUF4Vkt6Zm5Iamw1TnBBaUdMVTgzdzdVWGw4VTl5NDg4eTZEN1RuMExQMEw1QTF2dmZEODNkNW9SaHZRaUxIVWZlVm0xZHFhb3g5TU5kME9OeTZ3dE1LWmZmS2FOZWZQMUNqZ2h4ekhRdmo2N2JtU0tjWTNZQ3dVOUlEUW5CUWlXYWlRenRvS2tYQVlodWF3VjYxd3ZrUWxSS3JKcnlsRWhvY0owdGMvMDMzRUFKZVRzaGMzdUJFQi9WYnFDTDUvTXZndUNIb0JmMlNDRDRZTlhHQ1YyWlQxVHpCNkNyZjlETTZEajAxQnY5ZkRBZWk0T25CS2hkUHNFTHRzVi9HZWZHNXliYUhmaU1JQk9iS2RoN1ZvQ092bERHbXhGUCtOaDhSOGFHdE1jT0dIVGVpTEE4M3pSNEp2MDlsT2FybEphMUhPQXJ1VmF1TzJpS25odnJIT2E1cWszYWNWRnlSNnVqa2MwNmZRVE42K2lUM09Wb1U4alIzWERjRFVzOVNwSEZ0cUprRHU5SmUzMXkxa1cyMXVUSUlXNUN1SG9vY2RnU1RJSWx0VUpSa3F3L21Ld0xMbXFORUZvaFBvOEFtL08xZ3c2b1dtMHJ4R2NOcmJ0RUtSTDNtMURIc3NuQytvMGx4LzVhNlVTSk1idDA5R2E4eXBIV2tqbXZDUjNqYWsxVERXbXlYSmE4YzhQL1czaFo0SlZQbFhTTUxtQkNhbmIycnp6WHJVUkovTDh3NnhJa1FWQ3FocVNqRUhKT1VQNm15am9MSzdPMzBldzZqcTlFbGM0VXRXdUc1cW9aNThUbUNrSHdCODFSNjhJZjU3U0VuQnYycTkwa2hQNjMwZEs1REg5NXdQdkJPb09jZEdBVzRxb0o5eUVLWHIrR1FCa2pxKzZZMW1wVlJxRUZZRkZOaHhhZFgwK3VvVWtUYWdRd080R1NHVm0zYWJ6MHU4YWJmRVhQaUVlNUc5VTR3V3dweit3L01LdXBrR0duMFlFWlk2SUtuWldjaFZuaGY3NFRNa0l1a0dHalhPVkRyNG5ubmNSUExGWWltY054N0JlM2NlWnRuUDNwOStkazFuaDZpc3k2L3FDWjRzUG8veXRwMHI4dU1jL0NYNXJFNFNjVEhpaTBVTGhvRFRaMzJabGExL3VOcWZWdHczQTNVSW9yc1d3czZPTHVBTmpBMVVqM1RyOTFYOGRSNlliR2xuWXUyNHV1N1FIaHlnNW91RC9mUTg3ZnhXTUVwdG8wV3MrVFFaZXRXZzJubHFYOWJUaEt4bEM5UUk4VjVGMUM1MC8wZGthWUkzWEVZM0VXLzRZc2Q4ZnNEbHNUT01VMXI5Q1hNelJ3MXU5WWVGdHFTeVY2QWs0UjNNcnB6SXBvNjN1Vm1pTmplTGREYVM1bGtKZ1dBZFJtNUdFQlVMT2p1TWRUYUFJS1JrMFUxb1JjWTRlZjZmbWFnNjZkVXJLM0dwRnFmUS82SkFjaE5ESm9LTjhpcGUzaUxEMkIyRlNicUJhT3gwSmJweGlDUWdUU0F1VU5TUmswZ05DU2toWlVacmNLbHNQcGpsbmljM1VkMFJVMzg2YUFYN2hwTmZZckZvbmF5aU5ld0lydmdNbWI2a09nWTQ3RVAyVUljZUs3cFdLTDBxQU91NFJycmltd1ZML2ZaYXdRZzVYaU1hZWtXaU02d01ML0Y4UWdsM01hNFJNVGVMcjVaZWV2UTZwaEQvbVNXM3o0ZFFsQnliazZocE1KRUE2YlRGaUV2akpsQStSaGlTTjA1TWN1OUZ5V05FejU3MCtERXBML2tvcVVORU0rTjBVcGlVZWJINTBuRzcxb2lJTGM0YmFIenVZZHBWWVpyUW5TMkNnajRlbXhBQ1I3VnVTMWJZTGgraWY4clY2eEFPcFpRK3R2K1RRVTNPbSsyd01pMnp5Y3I0SlZhS1N0bXpBWi9hdlhsbXdqM080cUdZS3RTeEpWSFAvQWF1cElOWDlBRzFPZWNUWkI5eVpaR2VUcjh3ZDZzcTN5OWgrQ2JKdGxnVnZteDh4L1pMNjNSNDFEUUM3RUE0blB0YjByZUdpLzRCUktCaVgxalU2QXVFVmxaMFB6YTI4L3pXWnlub01KNUhKL1pla0pRSlRyeUlYVVgzRWhibDR2aTJZMy9NaWtMcjZRVHBWV1NIZVBsWTVLMGxYR1BhZTFpWlI1OW8vWmVzWW56NjhqM2dVUjBydUxScjQwTVFKbzZkQzRuS3I1c0xIWmlXZXNLbWNDTThTTUZoWWY3YnhsNkxMcWcvS1hPcFRwV2pkUHlXZkNiODhNWW5IMEZSbXZ6ZXlFUE1Xa2dDR1hMdU9uMks2MHNZeWVlN24zczZOK2Q5YjhlaTQ0bFFIbHdOVHhMZ044WUg5RXErM0dqcUt5NDE0Zzd4WlN1dkdLdmh4c2NiZm5sWmVuaEUvOTNQN291ZUxXM2ZOQWY4dE9vcHlMTGt0SWxqYm5JRVl4cUtsOUJLWDc5UVAwOVZrbW1FM1Q0dzlzTE9uVnZFVklPSVBXNFFNQWZDSlh4bVlIVm93ODcrR0VKWGZEMk95VlpyOW40MGdlaURuZkdUcnhES2pZbDc2ZjhJUkJ3azYrMVphbmh1MzVzNEdweUR1Nk5hTUp4WHBrd3BUQVFqcWhreFJxNys5UlJFZk82V2JiUVQ0YWIzaWoxNkgwZWR1MCtvZHNOL2F5TUxiV2k0WHhhYnZvY0tIclB5RlhrNkw5QVBiT3Q2SXlhZTBWN0JSQ3Zzbll3Q3MrOVk1Y09TUjJDVVo2amNDZVZCcElta1JkT3RHQXVWcEdWQTRsQkY5bHhOWTJuVlU4NmVqWVhQMm9XS2ZTKzZFeURZMS9ya3RUZk9HcStsUXZNWm9HM2g4Wk84TWV3eTNpUGNZODZFMTZycUJMMWQ0Y1FEdlpOSWJsaEllaXlnSFQrSzY5YmhrMDdndlhxQnczMlJYQlVLbGN4cUFEQUl6Rm0ydW5iNE44YjBlZ1VoQXdHYkM3emgzRVpZVitEM3YxL3ZBRWxRWFV5QXF2QVVMSVhGQVJkK3RHdFRaU2o2N3FFczNDWVJWYTk1Wk9PZXp1SVNQOUN5NG5mUHVWU2IyNG5uRzZQeW1DV3F6TlJKMHFDUkE1aUtxTGNMcE92NHdWY2QzNXppMUdJbmJJUVVNQ2h3bHdxUXc5TS8yYXhYcEpOR2dNMngrZjIvdlFwbGlrdDF4U0lVeThxRDNjTGdrSjJGMzJ0S2xoYW9jbFNPVVpYNmNFY1hCb0dvRjU2cEprSmdFTDM2QjJrdWNzTVNXTmgvZHFoOHpLZ0lSZ2dLN1Z5ZUJ2NHNJZzNJczVvTG90UUJhT2dPeG9JaW9BYnJPN25qZzN6T2UxT3A1RnpIRjJOYWltVUc5c3NWeUpWTXBEMUpzTTVpSlEvRngvdGRONFlpMzNRWTVPTUo3WitVM2FvdDBOM2xUbGxJYmhXUlplT0o1Ym1leWlvN1FtbHlYZ0N0SmJ6STVwY2R6QSttZlgrTHFXZ1pJUjFYNFJyZUFFQ2tRd1V5MzhMZ29oVE1HUVJSSG5XRDI1dGFRcVRkK0htNURxK3FuN0RmU0UyZVpoMmxDRnk2Sk1iWFBybDFaUStDZloyYmxkbWF5NlRvNDVZK3ljOVFMamFmT1F3K2F3YSt1bkNETUd1Tk5JYUVFWTdjK0daWHVtNWQrTGFBWlJmQ1VaRWsxaUNnZ1FBQ21pWmwxcFE1RVJ0WmtKYlQ0UkpRbmd2V0kybDFudldiTUpNT1A2MFlpNHpad2FLcGE4UFZ0SmVpRjNWUXY4MSsrWTBSbjg2T25QK0VRVC9WM0xPZWxqUFAxR0hQS3VBamU2cS9DdGNieWhOTThEdy9zSmdXc2czNndhT3RVOWN4cnBTQ1N2QTg4aTd5TURpTXVzUTN2K3BLbllBZGdubFlrRUFYYjJUOTR2blE2TXNrKzd0T1ErdXhxS0c5WDN6MXc1bURTNWdNS2xGVnhTM0tBdGR4NEpoeERPT0JwZWV6QlI5ZG5QZG8vUDhGeTJ3STZNaDVKZ3JHdlN6NzY1WnVpTjM5dkNoc3B6ZDRMR0NzQkZvOEloM1IwUytQcUdrNXljWk5lRjVyeHl3OGZtMVNyUjZBSTZCeW02VmN1UjByRExLTHRBSGc4VWRndUxmOEJQWTZ3dFoxVVliblRFYk5qY3JOTmVqUDNMb29EN0wyL0lpMjFqM05hUG9PVm00LzZueVFMVUZ6MW5IL2VQVW9Sb0NVV09HUndvVVVrUFlUS0RuaEpDVkFFRFFYazZaSlluNFVObllLYllYbDVXV1REakRhOG1GWEY4T1A4OGRTa3ZrZkVMZk5qTGoybjg4djdGWndzc1M1bXl3WS9NMVZELzJoaU10ODZMYnRVRG5HYU1mQmtSdlArMFdNUjFwcUx6dzh3U2xoVFJjeC96WUJBdkRtRG8wTjRNVjhoU3RXTDBsVGRLQ001MlNtNUN0Sk5CQWliRWFXWGYvbE9zbXl5SVVSUUVZcHJDU0x5OFRreVRRYUlJaUtRVCtJc3l6MzN1cHJDcUJsaFBVaVhXVVFKT3ViSVhWdG9ZNHJPOUpOUmVHU2hVVzdlV2lML1JBcGU1b2VuQXF1RHJON21xV016dUo0TXRNb20wTnNlYVJLYTkwdUxYRlpTemtnUmpqYzAxTk1kTWtUL1JQNjc5cXBWL2JMSk5HcTJHU0t6RkRacndxbUg5SVhZMVNuMlVKY1pFTEd0QlRkMUhTaU4xSnNVQzBDMUxmYjdEQ0F3ODFyRlpIc1ozb1J6UGdSb2Rxa2x5WHBTbHpFTWExOTVKUnFuc0hxVVJSdlBKeWxQWUtmSzNQSSthWlRidXJHV2kxV1dHMWhtRmVTcTBuR3hxb1lLNXJwdWdOSjJrSkRSV1NEWERHNC9oL2pJeFdEcG4zZGxTTHQ5QVJxUE91bG1TU29XUVBjMk9yYkxZV1h5dER5V2J5dy9OclRKQ294WW4rcFVhWnUreGtxM3pGdW5rcHU2Q2ZsNHEvcWtNa1NVaG4wUXc5T2l4bi91Z2NxWlJYaEVvT05DTU1ZaTVGSVpUQnZ1NWwxNWcxdHJqcjZuOUVGQ2VWREh3SjNLYzVyRnNxVFRLN09yUEJmR3NDUFYxREhnMk5XRUpPaXMrVXRndG9iU21rbEplYXFiYmJwWnZ4SFBCNDZjR0JFRCtpZUZRZ2pNSTVacWFuUUliOTkwWjhzQmVBTkFESllWd0FsRjF0MHV1T2c1aWo5QVhML3JVYVpxaTgvek8xcEVFWmNkbCt5MGJrR2ZieThTTVZmcklsRmd1VjNCUU54akVmaEtDSTZKemtHdHJyWXRsVDNybmZ4cWJMUmNESXZPS3k0bUFHZW1JbU9vZm9xNDd4QXRuK0lYQnZ6T2owYnErekV3Z1lRZmxYSk9KQ3BTaG5UbkdVNjcxR0w2RzJRR2t0KzhrekpvSmhyNDJDS2Irb2daWDJ2SGRFelgyNkprRXhPenVxRXlnWHU3aWFxS3lidXgvS1d4YVp5bWErbUtWckVLdGlvZ1VrWUZ4K1MyWjFTY0VtWWNXaFNzL1RTdzU1QXI2Z3dUMmFNUmhJOU5yenRHblBzNWFIWDhvb2hvV0JZN1FpVStqUzViUjlsME9YUDhiU2hQQkp0YUt0bmxKNThZTlc0TzQwVGtEOFRrZkd0STdtZEt4QU9CL3BQemU4cFl3SlA4Sy9SbXk2dFZXRjIwd1pjWTcyRysrcUtJRkh6SEJZbDVxNFdoYk14ZEM5eHZpZjAxY0wrNlZBM1h6cWlzcnZTOWhSb2lhMVorbDlSYU1IcXdjSHVUNzllMkg1Zk43RDEvVENNcEFyS2xsMWZuejhtWVZoNXdSZ25SNVpQcnViRi9RaTZ1K0IvcThud1c5MzNjRlFEU2tJQWpqRDFUcEpqT3JMcGZya2FBWkZNeGNoNFRpMnp6dnEzeTFUT0dHS1d5ZjlUOGpXRzF6SVNZNFRkZFFJb0FZeHhyZ203Z1Jaek92TTBFUHAvaHljb2oyS0pYeXI2VjJJNWRDbHF2Rjl5UXU1WDdIellZK0tDKzhpdkVjV0diUTQ5U08rNU0wTTdtQlFHQ0FyeDZlVTh2dkVWZGptY1dwbXdYc2dzU1lTcWVQeUwyK2lQam5LY08wN3FiTG5WdGt2YWVFdVM2ZHZTUjgxZ0NjN2lSUWVieWVWT1Fybko3VktXd0FyUmFMYWp4bTgwUmJiUkEyVXR6NVBNL3Y1QXk5RXJWdjBTT01ReVFueWg1VU1JcDNxdW03S3RrQXdyTkpVMGZQVk4yK0w1U3VwSmVFTFpvdTVOR1NpcWlZaXVOb1EwTWVqeWRsSXE3ZlZrNjlRd296bEU3czlhTlRJVlZPU3pBL01LU0w0bXJXWUtVRmhoNkhUR2VxVUExNi9QU3ZWQVhCaVhxMlFQSEhmVjMrQWpGRERtRXpVUTlGSjNZQ2MzalAxQS9hd3VBclR2RDZ4eFpRWjhSZkZrUStQblJpTXgwb21mSHlCdHIvWGxPbytWOU5DZ2NWMURFRW9hYTZmTjhpYkw1bXRSZ1N3bW1SekZBYUp0VzJubkRSZ3dheHZpMlBodTZrME1TL3pkNUxUYW8vYlpGUytWU24zTmh6YWYvS3lVOWFTM2tIY2FOUSt6aUg0dlRGWmlqbmorYm9XVk1relRnZmlwOEFScnprVXBadlorMlRPWDhCT3l1eWthNjVUUkd2NURmQWRPZEhiUkQ0SjhkMitsMUVraEZ0MDBzYkllWmNCcHUwaDRyenVXZytZZCtJYXM1WTJ6cWhKeHVuaGhTdUFSNEFIei9HSGR3Qmw4Z1dSUnJScWMwRDJEV3hoOFYvdEV4VzUvR3EyODB1U0RKaWx5RURxQmMyZldNdXE5V0kxdmVBakpPTGNydU9tUTdTUmR3a2NtK0huSjgwb2Q3NWZDSHhubTE3N3l0ZS9kUkZrajFpY0U3NE9tcU44VTJzM09sSzZLemFZLzJSTWhlaERvOXdGdjF3Y1M2Yy9Za3hNN0laK1VKTFhIUVcyZEpkMENDYkNPY3c2c3dlR0tnT1MzVGk3Unp0Vk1uTG0vZEN4S3NIUFY5V0hhdTBqZktnK1hJcE9qVksrQlNEZ0t1eCs0UU1yN1RtVU5ZWWhRQzRsZTdKbzA4K3YwRXFqTld0RXRZbGVmZm5oQWMyWE9ZZ1dNeDVLWEs3WkJmTm9LRjB0WWNrTUcrV3gyVWZBakZXZng4Y2VEaG96TzJOYXNYUkloRHhTQnh3Q2pObE0zK1FlYVhlY2Yza1FMVjl4Nm4zdm9lQ0pmdTV2SDZJcW5TZlhGQ1B2OGlZZWZ4ZEdhOGttdm9DVm1aazJuUHJOUFFIVG5lT2RYNGc5eGhMbDFJcHZhL3cvSFA5QjF4N3VkUTEweXFxdmtwb0JYbXJsSHBOSG9pU01FQVlMempJeVRhVWlnODlWQ0JHYmJxdENocFpjRVhEaDlQNVMzaE1adXNHdVJhR0ErT1N5M0IwT0RnWXdPcWhob0RkZkRUcmh4WEQxU2hCajdUWS9EUzJHaVprc3BGSkM1aFl6QUxFYlpxdGFRUlpKNHZRbStuT1Zha0l0WXRvOWZDZ1BnT1k5di9TQ0w1eUhIL0gvOXZ3TDBDVjlNb0dUU2RSODRqRVVVL0poSEZKeXdkNFl5Y09XVEZ0RVNSRkcxcThnMGlCTlRKNmQ1ZjVrNmNMLzA5enMyYmRPNFV5cjR3ODBWRVVIUUdvWmhMMzdGTHpBck9GcXJZM0Q5M0lKTEVBbFZOTXNocU5VYngyaWRobGEyUDNHZGZleXJRRG0zYmxXTDJtVEordGV6UTRBRk1pVHJBdXlDb3BhMWVLTi9LN2FKcGpNTU1RY0I3RUdYMWdGZEZDNTZGUlE4bGVHN0pTeEh0VXZ0Z2VWT2xEbWxYYk9VaUE0TE1qTkluQkJkaGNQYUlCWnRtM21CWklYSDEyOE4vZ0lDQWdJQ0FnSUR4L2I3R1A3ZnJndjgzcmQvWjl0VCt6N2hUOXYwdFArMzdHYjluMnBYKzM2WXo5dmROK3owUi96ZW4vbSszMlUvNGZhcDc5dlpIZlo5a3YrLzdaYjluMGt1L2I5b1grejdVei9oOU1iZlYyOGZzOUJ5KzNxWTRmMit1MyszNnpUL1oxYmZzK3V2L00rd1kvYjlERi90K3NJdnAvWEVmN2ZvZzc2dXpPK24zSVgxZEhZRG5WdUNEUUpXV3Q0b1VCS1NJd3pqYy94MnJEdGs4eGVZNEFNVlBGbjRMRHpEWThLVG94dFluaWRLV2crQ1VSbmluZ2tod28xNG5vaVFkVUdUQkk1WDJaRTJhVkFTVzZuZjJ0dFFVSk1MQWNjdDlidmRBeThKd2MwRUgyTU84Wm9kQVZsOXJZUzJwa3pJb2ptVXJPL0lQVjZhOTM2Y0RKTGlFT0ViVXZJTm4wQytlUEl0dnJmVWZ6MlBjVzIxMkVuM29qTGdNV2ZLbVhjcWZtY29LalpZMHdURC9KeDA5SWdVYkhabUpmMy9ZMG1USjFBOFN6dnpxZHIxc3VFNlZaaTNVVnJxTmJOUUhpYjFTaytpc0NRYmNYcGV0eWpUVHo2b2lBYnRsMU83VExBaStTRzVTZm1JWDZOM0J6KzlQYVFSOVVnbzc1L3FrcmlheVlDbVpmNktoWmcvRU5XRmJVWVhtYUJVL1QxRWJiZDRLa3NYQ0ZXd1BmMHE1WjBJb291VENZaUhwcTVVOFVUVXVWejd6YkkzdDFiYWd3ZlFubUI3WEhXRU92N0kwM2pPTzJhWk56cVdhQ2U2emNIRWFLc2x2OTFyZ1JZYlp3YTJaWkt4YlFJUjE2eXkzWnYxWW55ZHhOdjlRZDhrSW93enkwZmlodUdqSEJ4bzVLbndGeEJEOEtQcUlkOUYwWlVJUlFoaXBSODNseUdZc0pTM3h2cDFNTThxSWpRb3IxRk1YdTQrekpsQ2ZsRmM0dEFmZEEzMjZkc0hIRy9IeTRvSmdhY2ttNlFaZzZ1dHFWVkprL1hUL09BWGpKNzJRRmZRNDZjVGNFRU1pOXdVYnBNTVhZK003dVdyZWdLV00vamR1K2xhT1JjZS9CRTNnZEVIUDRJcmhFQVFiK3ptcHduL2VudENjUXZCVWJnMnVvVWw1b0ZtOVpmbGFkMm1OME93NHVQcXIrN015TWljSXJzakpORHVBV0swVGF3QXk2RDVuekZFblhraUhteFZZSUU3NmhxV0ZCTHZKMHNKUTdCc2JQTkJJMjJySlBPNnkrdFo0Nks5MFEyMStZM0tvektWUTFNTm54RmdSN1Qwc0gxOTNEajBDa25TWEZhaHVmalp2WEl2aEhjY05UTHJwMTlQdTBiOGNFVk5xZU9ka3JwSlR2THJ1T1U2R0Fxbk42V0ZlYnI0dk40VGllVVp5K3YyYzhrSVhrTGYwYUd5ZXVyRktORVBINnFiZGNybldYeFAxNkJ0N2pnWURHSkdFSUZiSyt3aEtJcXltcGttWjlFQ0htWjJBNk81amdFcEpDQzkvYjJ6Mms5VUNXWktPYlpsZWYwN0ZrRUM0MlFMUEdkd2h4bnBRc0VDMk5BL2U1R1VtdTF0eGN4L1FwVndKNklpSEF1TUdzUkNxSDl4VllSa0RsakVnSXBqMTYrQk9aN3VEZmFvOUlTajUxUWN4UjZUZ0dveGR3QlVHV21Ld3lOTnVnd1Z1bVBVd3J3MUh1TzVjRkdVTnE5cTE0TWM2a3FZZ0ZBVG1reEpJNWZ3STZkOW1lMnc3cVNxblJTUXE3TTIxemEybEszZWs1MTZQeldPcWpUWlFkRHRSYmNnbkRGMUQzL0FPcEZ2bG1mbENNS1NMSUE0cGFkRzRFczdQRU13Nno4RGRLZm1KMU5tczhlZE9LMmVHWUp4NXY2dlNhdEd6UXZXL3Qrb3RjV0JKK0dLdjFnU2doVWNVUldhbERRNFhiNERvUmFjK3dFM0phNTdja3kyaW1TMzVpNXNZV0J1RFBiMTRSWDhUM01SNDBqKzRYbnVZZXNHUU1KNnhFSjRudmZ5S2xBeEFJeVRmWS82VE8zM3VFNm5pQnVyYnFzMzYyNHQzVEVxbHFIak5GWkZlUEM5U2hZdlk2ODBlc01VeDJpUk9UQlAwWnRzcGhVaWtMd2ExbFJYbUNrS0VWcVdXcm1sT1RpZWtUcllpb29iT09jOURwKzU5STJ3N2pOd3Rpc0tpcTVrTnRHM1JtSjNqbG5mQmEraTZ3bnNvandiYkRCa2xUUFpISU51M094aExyTDRkR3g5QU5OUWNkVjlSaWo0N3EvdGZtZVhCS01IYlp6S0hJUUF2YjlhaUJiTDl0ZG81NCtZY3BWNUF6V0l0cnNkTnhTN0k5eU1abmVzTENSTDZ5dVBNRHBsZjlVVGhqNkJXUXVWdERGTnFHMG1VNGp0YW5nSm9EeDBSNzMvRUNSbFlnbXk3T2U4elZwSlhNbU9yUmVCTy9MMFdoUUt4b3l4QWYxNDZGdFFDcWRNbWYwY21oSGJ5Uk9hb3NvVUpmY1lNekV2Y0xjY1hveUh4SWZORWt2aE9lcngvVWszL1pOaWoyWFNRM01rajArRlMrYkgxbThOR1FDSTZvejNJcTRsUHlNZ1dyL2t2bS9hRkNCWm80MFNOaTJOUEdMTE5OTHVwZEpnNVJvWDR2QU8wZlNmUm56UHEyMkNpbGtRekZIV0ZySXlXWkxuOEIxQ284ZGUyMTRSZUJqVTV3eXFoQ0w5WnFlSlFISzEwbkRzWlpYdWNXYkhleExzS3RqcE0wY1pBKzlOSmEycTAzRUo1cmJZTkxRRE1jMC9leW9MeFFWTnpWcndicVRwT3gvQi9yWUpwV1psa1lqSlpKQzJySzdHWVh3ekt1eGhTZ2JKdFlsbWtTajFPdGM0YldFaFZ5anVkekhFUTZkUXZ0NFhodFVpL1drREh6OXIybTBJUXo2L0lGc0hxRmlPYlFqaVltYkt1NHM1cEliUFgxc01Ta0FjN0cwUXJiZ2lNYWVMRDBqUG50UUh5L1pEUnorZDdFanRtU2tGTXBHR1pjRTBMNnNzSEdSdHF6SCtuSmNsQk1kcTVOa0wvZXJ0bUFZb3FCOUlMNXZFL0Y5SnczakRVamV2akVZK0puTlhXQjVtMXp2Ry9tdk9lOVpRekJublREM0sxTjJUNHNBaU5LMUdVQ3hOcFRLaHJDVXlUYTJzRStUSHhoem5FVjRCajhSZFhpM0pqUFJ1SS9jVDNVbmFVT1p1UHRNbEUzYlJpcWdzNHdmRG93eVgzb0tZeXNiUmowYzVCOGVHYXBCNlRFNFFZR2lUT2NweFZaM2MxVTZnNnhrMmxDV1NhcWplNmhCWEZJWXNqSWl4M1pHZTFwN2hvaFhNYTllNStObXBobmk3TGVWdFhESk45OE45a1FiekV3M0RpK2RTZHBLS0ovd1NUOFZPTldtVVdPVzcyWE5vN3UrTlZHUDgwbmQ3RVhtbHI0bzVjbmErQU1mOUs2Skd1bEpyTEdwWUVIODA3dDdiNC9PeDBMaHlGcjhJYTI3eFRxTGN4QXViL2dVMzBmbjlWV205bW1EbHR2ZXdlREMyanJ5OWZvOWtGZmJvbEdIZGxiQzJnaDV1dnVkRjNFWW4rTEI4dUIvdm50ODV6SGtHMFFsdW84Q0hLaThVeGxiS2dqWVlqellWWGJrbW55YXVVeEhRcGtxYTFjZ1pWQXRwbXl1a21FdUJjekg1TnpJSjRiMjZDdGVPRTFWaGQwUXJ0cUdFWEZpT3NFKzd5STR5bG1JdDY3ZG81SXphRGttYWtXZ3cwTGVCNVd6YXhkb0pmV3RLNGZocFF6c2FueUZqTjVzWmIrTVN2aUJRQ1Q5ck56TzJ3UGg5T1ljZkx0YWhGd25mYTFPREdvc1IvNUlCbHZlY0E5dzR1SHgzTk9vRG1sU1lDRkdHWjIzbEd1SHpONVl1eWNHcXczSEFrQUVpR0JsS2ZwNjJYeTNJSFZKM3BOWW5uMzMxTnhuNHdJMmZubmxaRWVpVFVCVGxxSFdINHh2R1pleW5QTEZEK0NXdmJYZXd5RHBBWHJja1Y4a0hKRkJCc3JuY242U2JZejZFMTNFOHFzcUtJditVVjVFU3hZVEpWNVN5SEhTT1RLNWkwWDNQMDVJMTFZM05iOVhVU214UXBEZjVIcUQyMkJaejIvS3JHVzR0NWROS0RSb2V3K2g1KzBSYnhvOElCSk5lMkJ6SW5sSXpyaVc0Y1pEU2s1Vkdiait2V0xYWEluclY4aE9ZNzZYd1lWUFh1MC92eThWUzJqVnUrNHNqUEJxMUlwMERuZlBIem56SlgvMVdJdndXLzh1bmdBQTcxcWRySFV0NmFHZThCL2ZwanZmZC9PWUtpaHRuR3UwbXRUQkpnZEZnWE9KdzJidWF0UDBXekc4bk5CeE9VUHdZMGRQd0J4VTQ2OHlBQjhKS3k1Y25zeW84YUFvTXk5T2duQjdLUmpJQWovblVuSWloMVVGY2NQTWVucG9pWXZsZU04WGI4RnJWMlBPRXVKN0lKYW1sVVN6eDhkcmR2Ri9QbjU3alNNQk52dW1kMFhaLzR4alE2K2RkYnVFa0xkVUdSc1N4SEFIQlpiVjQycUdvMTJvMFE0em9Cekc4WmhJTHpDVEg0ZnIzejBTeTJpM1V4N2NqUEx0THZJbU9xR01WVzIvTm5wQWpCODBRZnIrOFdkZUNmMVJKaEFvWTlpWVNVemNxNTdiczd2RFFxQm1PMC95aWNIRkYrV1M5T1FNQzJVR3N6aERPQ1ljU1lxcXNTd3NwbmhROE10SWNRaXkvRWdHY1BlcTdkandOTjV6dStzc2MyMU92NkZ2bVliQ3dIY1dielNwdk9GRU83SVRoY0NMV1dXSU1RT3orTVFPM3k3WndpempPSVpDK2FHcEkyRUZEWEIrV3BZOWRvdnFTajV6dHpiMEZheFVJS3puMkEzNGNNR2FsQ1NsMklubTNrK3RpQXowNmFVK0drZHJEWFQ5eVRKd1RGODh3QjY2citqVDUyaHZOVFVibFRRYWE0WDZXQmNDbmZNbEE2c2JrWFVQMXRRVDd0THg4SVNha1g3T09GME01YkR6aGtRajlHL3hNUCtQMVgzRG5iK1YwdWtZTy85R2pwdVhrbG4xNjRka2FuTWNSR2VPYyt1NTBnMUxDVVZlV1B1SldKY0FOSUowcVhua2s1NkNydmUwejFSVnhHUVhmQjJGemZFZVAxNjhSQ2JZb3l6c24xd0dVMWxTSE5GT3pIQytCcXByMFpFSDhKMmFDWjNudEdyUUh4U2dQemtIaExsTFZCWkx6NVFtY05PUSsyZ1hEYlBGQzZZWC8vUk5pUzIwQmg2RE5POW9aQk1sRWh5U09kM0ZSazRHS0hXUVZsZXhHVGFUeFpKRlJFVnR6S2g1c0xTWWVHclhLY3RETTIzYTlIZGZ0VnpKaS9UcEFLSm4zRXhTeStHMTFJV2RjejdDcXRzZXpUUng0c0Y0b2YzcFA1YW1DcGVxZVlrWlBONTJUdVhwTEgyZlhsTzBmeUkzd3RGSDlOOHhudTFkSy90b2F5RXljcGY5TTlxanYwU0lLSHA5ck5sOXVpdVJ0NzJBOFFkSnpqOGNJMHNlZDgybkJFVnE3UEpIQytHZ3plbmk3Q2EwalBwS3pVK1F2NTZSaGRrY3R3VUtzQzhNTWpQakpqMDVUQ21wak5YL3YwZUEwZkRkMU5KTjlIVk82RWFkbFVyTllKL3JibjFRV0JXRHFRUU5HUjhNNWsydFRzRjdRdnFKa1IyNU1JYkZJeWJObXpJc2V4Z0I4eFpVaGdVWWlHNlU1ZXlEVmZqOHo2NGFSN0lqMVYxaHBRVkNPZ0YrUVYzM0RUQ0hrUG9RTzI3d0I5UE1RcFpzdFp1Q2RTUkpRelZQaUpneHFrd3pzNnk2NVVpVWlMVDUyZ1lNRDJDTjlqWU1rTXo3VGhLU2diU3ZjVDZGay9NVVh0ZVYwMGFhSi9pbm5kb1VzNjlRTFNaTFBtb0h6ZEhRdHlDZUpwMHgybWgrK3p0QUpxbUFJeEQ0YU9oMFlaa0YvYUpvbnR4T1V3RWVYc1FLM3Q0ejFRdHFqdVdjUENSb0I3bG5VWjhNLzBMRDlSalp6ZEg2YWU1ZUpKUy9TdFVXQktwNWFQTmdMQk5Ta1pWWUJtckgvaUVOTkUwaDhXYzNhWXc2aWlkSkNnWWJrUzd4d0FhNkVuMDZUSitUd0E2R0RwN2VUU1lyUzFidjNtM1Uwanhyb1pRUENwMmFBeGRoNWN2SjY4SlhoZWRsMndvdDhpT0hRZFRWMkZRck1OeHJFTUgyWkU1engyZFo3RWZNbzBNeDNSUHpna1h4VjU3NS92cnA3dTIyV2hMVTkrRXhlN2FZOFNYRnY5T0pndHRENVgxSDJXQmhZSFNodFlSU2dEc3pvT01hdFhRTlUzbHZ1OTYzUXdpRGZMY1FIYmNuOHYzS2pKNDBBMkdoRm1RaHo1UnVhM1NraWJMWWlXOGJPbDl3dlNqbnVBU3UvZzZZV3RYQlBjM3BNK05rU2FJY0lwSU00RFhnNzdLSjJSSm4vcVgyVFpKakJoOWxwZXRNU0dLM3ZsNWFZS0NsQm1EaGMrUm8xK2Z1cjRWa2l5Zm1Gdno5elNVNTdlaVAzTkdwUit6VWRpZ1lNUVJpZEN3KzF2bkVvdEZPb2padGNGTzQ5VU9UbkFuQjN2c3Y1YnY5eU41QjVubHUxVkdjVUsvbmgwcDBSL3llcEpvOGFPQzh5YitEU29IL3p2aDMrdnN5V3h3VFJOMmtoR1JESGNVVW9odmgzUkpFY2VJTk53SUZmeEhPQkZpb3BjeXVONGlPUTBONjJpK2JncVc1dDMyQWZjaCsrNy96TGJVd1JldnpxVjNIUVNpdTNOL3lvV2hSMUFSODdtOEFtcHEyakFyRzN2U0g1SFFLcGduT1BjdmV2RTQrb3FMdUtUUkpvclB5cGx6bmRiSkFXd2Q3ZTI1dDNRVjRTZWZPa3kvc0E5US9CdHpaYkdZeDNydklYRVJGYXJvT2FhYVg5ZTk5Uk5xYmY4ZGtMbHpTQ0hsNFNJeDhFUEUxc2xoQ3JZL1Vsb216SndLNTRRU0hKdG9UN1VZRnlaZzlrTzV6MHQvcENCNHl4QWtFaTZrSlp6b0t3aHdQWmpEUTdxRVdEVzBrVVZZNHE3NGU4VHhmZDhpWHVETHlzVkVjLzBhcEFtTzE4RW1rd1NRWDdQaUJoQ2N3Zkg3eFhZMlljdmNoRzdjMHowaWh6V1FMcjIwaTdRVDI4c2o5dTEzS0JKNXF3NEtDRG5TTkU3WXhRRkJ3U1MrR095MTQ4eUVsM3JHSFpOaHo0bHA4RHdmUXJrUGJWNFZHWDcrOE5sZDBKUHI4OExrMEFsNC8xWEdPNmVBN2Q0MXBxNHVHR2VxbDc3NGRnS1FrcnZHVlJEWUZ4YmRMWGdqMlJsOUNFUlhKRXJkRC9qVlhmcklYa2xPZzNUSFh2WVZhYzIvMXViblQwTmNRMysvbGprMFlVVkVjWWpoTmRqWkNoSS9aMHpndFJxdzlYTXh1L0c3Y3czcmZLdzQ2bmFDaHNIZzNtWUVSayt4SG92NVVLWHRDY0RRNmdiaFdsaGRhMi9vT09IR0IzUDZBZ1IvaDBTUXpONy9MV2lMcndLUjBDUlk0alBZU2E3cktqVVVERlRvenN2YjZuTUMya3RjMmVLcVZieU9rOFd4MGxKVmw3NC80T1NSY2VHU0JyVnVReTNWSzlZMjJmWXh6WXViV0N2bHBBOXNYZmtkZlpkb3VPVDZDdUdKSUhVNldWZC9KSFJhdTVsWldpc0wxam94Y3NuempnNm1Md3BVR3NOZS9IWGZuZkZOUVJ1VTY5VHFPL1pLWmRLK2phdmU1N0FjZkpPRkRKNGhNV2tZbFE0d2FFTEpKZUthUGE4VVRZUkxVOFlqaWhXVlk2d2VhSmlaZS9oK2Y4VW1CQjlWTEhhL2gzdWhLTi8wV2V6Qko4aFVuVGxma3VRcVVoNGJyeEtvL0lBcHJvRVFkQlJNMWJDZGxtRUF2R0c2WlFVYmpjaWJyRlBQc1IySE9XemFWR2pJQURKVlBjNzd0NXJOTTRKNVc0ZXh0SkF2clZ6TWhBajMyaXpSUmIyOHRFSUxGaGZzVG1CT2FneHpsK2JEUHpPcXhtSGdvWFRHM2hGMXJuMFBJMnZKdjVHYTdBSzhIdVVJcS9GNzVOVlRyRWxHelN4V2RlaVJ6T3FQY1lyQ3BzNDA2Nm1iLzZnSHNpSWdnbzgwZVF6OTQrQXpXaXNMdkxwcHd5MThiNkVhMTFRc3FZZndIQUxscUl1UHpPeUF3NFprT0RoNE02RGtLRTA2VFB6Y0Rud1gvaDRpTElJcjdyVzJEK1RzekZ3QURvSUZmT1NYRzZDTUJmaEM1K3JmMC9Hdm9NZFphaHNiUFdVM3orWU14aHFGaVU1di8yQXZhRFVUU2JSTlIzY0c1eEd2RlA2RVRPSmVxQ3hxQ1piK2xZczNIY0ZnL0N5WHVERkdZSTVuSk1wWFltQ0lTMENSL1kyc2dsbHgybUtzaW9VOWYzeHhrb1BVV0J0a2l2L1EyUXd4cWRqaFZ1UWRXZ2N6RlFTOG01S1YzZHpTUGwyVkZWOGpIdTFESzJMYlA0TkZOUkZFaEJrUTdONEh1b1FNWDhiV1Q2RUlEc0tIazVtbjNmTGwxUTdoNEdmK3pidWljZTVOUDErNWw3bnl6MEU3T2MzTWJQK1JXazQ5b1dyR0FvZmZPd0ZING0wSGhQZUVpY2lZdE9BU1BYQ0tsakRWZkloaHNlMkwzV1NycC90WlFrTmtrNkcrMytPTlBTZ3BnNEF0WWU0bXloUHRaai9GSzJOZEVaZmVzRjhKT25iQ2xmdStoK1VKNml0YlkrSVliRnpVckZGQnZ5cnRUdmhhdG45S0V0ZWxxZVBqVG91cWJNTlVnNmNFWGlhbzB5SmVpa3p6V1FWdDQ2cmlwcmRHWitLNkNSbmx1ZVNVd2ZxcG1UMjYrN3VoREJsUkF2NEJjYndBWEMxdkx2RlBHUi90bysxamZCa2FzQ3FwT1lvZjZob0VLZlpETDlRcXdQZUhOMytPTXlVeUVKWXpKUi9HUTYwSGJCY2FQMGtrRGpucjFsNmxvbFNtTk0vd3ZqVWg3NEhoMjA1TFJnenk5UFc4WW5nZDgyZUhnWDEwZk96R05GTHBhc2xSUWtHZ25DdnBOK3l4UTROaTZwZGYrcU9OMVRPdWJJWkpwcS9ScEFyNVlUd25SZ1NCRVd2ZTgvb2N6YmYvMHNySkM1NnUwYmJKNHlZWDlFSk5MRnUxZzhnNXpieGowRTFlVk1FdHh6OTNZaEJhdFhFaHRjK3JsQ2RFNE45QVkyRTNSczhMSkVtd2pIN05xQVJNdTZ0YjF5UWNOWHpCKzVBY3NXTExYamdhNkQ0SmZGeFlLT1QrQStmNUNGL0dUTFNGYW1iQ0ltWlFuR2JING81WmZadEozaW9JZW85dThwTHYxTHg0N2M2L3JrY1d6RnVWU09NT2l1ZDdzLy9KSVYvS3dMR0p2VnpTTEJXY0pRemQydmtHd1AyQW1oVm1BOEwxaUgyYlVFQ0E2elFLTTVJVUYwcGFqbGgxT0o0cXVHRjErVDg4L1oyYW4yK0E3OFlmK20yc3ZoOW9lN0VtNHpUSitrRUl5aG8xaGE0M2liUGd2dVFuTG91SmpHcmk5Q3NpQi9iOG5UaGZSMDNOWjh6eHEyNVFacXVMTGFCVXVJWTAzZlZPRlhoc2FLOHNPNzRVSVd6bUlTdUJvamhyTHJ2Wjc5MHpldW8vaW1pYWM3V3RpNVNyZVkrYVc3WlU2ODc5OHRBM3dVcW5abEJGNlhndndDOFB3WnNHM1VGMC9lSy8zYXZTcC92MTNIRUY4RFNvOUt2YVZBR1ExbUZYVUlKRTRZbzBFUnZKc3VCemthdmxhY25yY1VNRlhKYjR3YVVNTDcvRHdnZWo1cWhDdHVtU1daM2dNRnFaRVFLMHVPdHI3bFhndlZGcThSa3oxMnNGU215Zm9RbmxuZWlicFNLYWNma1ZsWXpMMXRDdXdxdDI0RGNGdmlKV1MwQzlRQ2FzZmNvdkhyaXU1M2YvSGhSUG15bEsrZU1FREg0d0RKdURvakoveHpoUk00bXNBeHpxYjNLVjRlZEpGSnZqcU4zMGVWdGIrQmY5ODRaeXFrV3oyZERUMjdHL3o3Tk5Tc1ZKQVV1aUprWVF6VWFCck1HL0FoTDcyNnFZbUlJLzJlQWVwbTNZdTFQV3pDMVBoZWFjVkVXc3p0VFlMd1hlbkNPRXdCMDhTTGlRSnUxdnY4MkJNTUFFcVpyajBSVExpZ203OVpDZXJWWFhWbHFyMGNRdWJJTm9HY0lySWIwUncrY1kyRTE4TmNPd1pwNWRndTJ4VndiaE5sY3YxaU95TTJmWlFVVEVWQzBmampFNlZDZHlyeTRLVTV0eXVkNnF0cXp6bXViNHNXZUFKMGxoZkd2dUFvMW9yL3NuTjJRbmtveE4zTC9PYlpRU2s5cGhEWVAybFU2KzE1UUQrVkZSekpsbE00N1FHNVRTRGVmYVV1VnBsb2RrQ3hEa0toRy9HSWlCSmYxMUlZL1d5YkloMEptT2ZyVjBaZ3R6ZE92cHowNFBaYUk5Y1JJeEVWNlY4OGUveEhKbzlDdnNjd29aa3VmRHNSOWd3SHdhajg1MGE5SExxMmZvOWRxeHoyZmFtTjRkUVNqMXZuOGdzQWpjdFB2bzVjaE1CQUgzQmE4ejdlMFd3R2xkWmhOcEdlN0ZkVnJDWmtlUzNYMEJoUkNKYlJZaTF5UExEZnB1aWQ1dW5vUWE5blg4Z3R1VXRaVlcxS2NpWmd4Rkw4VWptKzFheHRhdHJaU2R3U01rWFN5ZDhSdjBZaGhxWjQ3US80V1JORVBZbUREV0FCT3JZRVc0SDJzQWR0VXlCdEVxcUdvVFgwODhOQVVlcC9BTUJGUVVpQ2oxV2tLVzluYmtCbURvUHhSQ00zN0lmNUY2djdwc0hBK0l6WVF0Ymp2c3U5NENYaU9XNVZiYmpoT0xDOVgrdWVET1Z3QUlkUlNXK0NTQmJPTjBSK0MvRENhZlIyS3I0QnlrK0VZQXRRZ3p5bW5Sd01sVnpOTGMzYytRUnd6eHlpT0JwZmZlT0tJNlBGNUp5Yi9NaGhXN1h0UGkvODhYMVZCdlFlaWc5ODdOdlRtR3BtRVJmTm5sbTJLUDdVdlUvczZKeTFET1hVZWNyT3d4WkNoTzlCcFBLZXVrbVVHV3BOSnQ1akZNcFprYlVqQU9FU3VxUG00c0F6SklYSmdrNmlLWTN4S1lmWlhkMjRSdjR2Z0lLMWZyaGl6NVl6eVc1bXdOMjlGMlR1a2psbFljZE1ka3BQM0lSbXlqTG9qbGtxMDJwK242TStCMzZvSStOa1JkTUZHZXBZUTVHYmQwWjFjUGc1c0E1Qzh4cjFmOEhkenJRZnhrWHNQZmlJVjVuL3Vmemx3WW9ENTVCSkhSTUYxUS9BcWxDWm4rZWlTRDdpTTMyanp0ZVVSQktRK3pFWnRseHhqbkJ6ajBydVRxVHZXUDJBaTN4TlpqU3ZUMkZzenhEa0Q2Uy9ETXUzSHE3WUF0R3FFS2ZUakR2T1E3VE0xL0xBY1lqYW5qNlMxRHoxQnF6dFlKRkM5SUt3eXJrTUo0VmZUK2o2aWk0WTdDZGY2b3diN25KTVd1TEdsS2U0MCtjbWs1bG1oSjJ3T1JtaDNqQjV1S3krSVhlUXpTUlVrMGZLakNjWGNCMUl5MFVhS3lPK29jU2ZlcytBTFRaNTdKY1NzVDB1bU1RVy9VVUZ2UDBvODFwYzFQTnN4YXVHWFBzN3Y2bHpSRVRNS3Q3WTVmZ1Ryb0NacUc4NFZjUHMwbzgyNDdQVisxOWlTU0FqaEIyWm56aWZOS0hyY0UxQ29VM092UzBJalJtM3lLcFZ3RnRPWVY2V0swMEo0cDMzT0JISmN4V3JiK3o4OGFMRWlVS252b3ZHQ3BXdFNGYzAzUkdZRE15bFlmUXpsK25QMk5pbDMxdHRvekFBOE5YOVBVdEN1ekdDMlhtYmNXam9pMjRDb2liMVJkMG1maFROWm9rWFlKajlnclJRV3lqRXhiejl1eG1nekc0RER3OXNZcVI0MjBaVGR1Y3Y3VGUrcnBEUU1HMFoxODRsTWg5Rjc5RkpKZy9DcTdscVJ4aXp3SXg3b2FEK0dpV3Uyai9aTGU5c3NaWW44eDJMT29MY2pOOGxNWUE5b0lCOVBKOTJ0OFFiZVA4ZWtJRzRvZWgxZXU2SDRBZmRXc0RQUmM2dnhqcEwwUTJIRDFVN1VZTGl6QTNTQmVJOGRMTU1BWXhwRDZQb1k3akFWU1hWdmFOYjRMRkN6eXhUNUczZFkzWjR6QkZpK0NYTm1hZ1BtM2g3d2pRRDZhMVpYSVM4WnpBM0ppU2pzcjdnYkxXd0dlRkNmenh3WGE1OFpXVDM1bmE0S29ldk5kLzZCem5uZzIreGxOc1FOVUJWc3hwdDRkVlJNcFAyaUYxSkM5QjhtMzBHbkZBN3RnbE5BZExUcEt3SjUzemt0N2hJNUxabTRKd0hiL2Z3QlZRZzJ4SXNDclJydW1QZE1mVVpPdkFZYWxIbDVUeW1vUHI0Q3lRTEYzRS8zcEhyOEdSbnNmY21Md3diVDZwTDJoVWlwVHBZZ05RcVhtVkZXV0NyclpjNFJpOHRkeGtnQVBOeVI2c25SRDcvL2VMMlRHNU8zUUoxK09RSzJaVGxrS0xUR05UWDR3b0EzaXpJQnhNcjNVYXNVVkxyZ1AxQVh0Ylc4NzdJZDhrb1pTYnB5UFgzbXJWQkU1YmZ2b29WUW1KVWZLSWdKUHpwVWM1VDFDbk0zelhLajV0UWNLMDF1bmNTK2xTRDB0S2hBYWRwQWlSV2xEMkdGUEhBVElwM1lHdHVybjk0cDNCNlV6VW5mZEVMMEprWFZTVG1vNGNuYTdMTFF3NFY0NFJCbWFlbkRaZ09GYTlGUkNhdktJRFg4U2tuS3hzSkNKMGd0OEFYQ29hK0RYRTVrZmltTkJLRlh0ZSthSHoxM1RBUEV2RzY1N1ZRU3hNUXhKSlhBOWN0enBIemZjWXBQdmRhZWozMUFOTGdZdmsyQVRRWnRLZTBWYjg2UWoxQUduRzViZDZMdFVFZzVOMTFZeVRLZTlDaGwrTmI5WU8zcFdiU2RsRXJLMG9HTUdtTkNQZFg5RXRpcmU2dmNVTEs3VFlnK1NIcHpNcFlaUUdzWUdmVzE4eUQyNDBBa3FLbWYvUGJVVzJxejJJbWN4b0UvNjFuTWVuQ3l5SmZmMGlxdDN3L3NjQ1lUWjM1RTE3TU1xOW42Y2dic0d2VFQ0S3cyNXFqMEwwUE5jd1hQcUQzZ2QvTThNNGpBY1RhUEgwWGpsK1JFQVZxcDdMd0M4ZzVrYTFnWHovQ29KeExveGpQd3ZVR1p6aTl2bmF2MFl0RUpxSjdHMktLanpyTkpDM25vNnJNRVpBT3hjcXJkRVpxSEJNZFNZSGJPM2s4U2h4NlFFRklVWks5ZGM3MllrQ3ZDdEV2TWlhMXlKY3NMMkVacTE2Q2ZvRnREcDBxbXVrZE9uOVI3OGN4R3k3SXhIb25CT1E0T0tuYXV2YXJmeGVpUHpXcm92M2VHRlFmenVTQkUyU3pQbFVlQTJ4dVpxelJ2VS9uNVZ5QUdweE9WcUtIQ2JNS3I0RXM3ZlI3OUhoeFVlYkxUVE1pa3FyL3FHVXZmZ3BjLzluMHpyTTI3bkpvcFhRS2xDa0hpZGY0QnZLaUdsaGVqTDc1SHJLZHhkOXRMU1VzdmczWHk4QlR1bEFkQnU1K0ZxRmlZR1o2UjQ2R3R6ekl4djRES0x2M242MFYyQVN1L3gvaE9tU29IeHFQTC9NOEg3Q1VUYk9jMjdsd1JjSng3eGsrNFFyQURtM0cxUCtjVThmOElOL1dhc05tNXlDNVVUQjBKSE1uMWovK0hkMldBRU9HT1lUL2RWY0tJVmJpdlRMZXFYak5sQjFpSnJheUNvWDZ0TU1oOWRzUWNRQVpieXdWWjArQ3lQalU3NVBFSXAvTnN0NUNyZWhKMTV6U0dwanZqczBvbGxNNytIcUIzTjIzYVJORWtIZXRsdFlkbmhibGNFY2FZUjY1cFd0bTM1b2U3dk1Qd0s4VWZDWk1FRmE4c1hjbUZ1MDU2d0x6eXE0WnhWVGRrSGc0Z3FBS0N3U1pERDZzSEhlcEc5SHAzeTV6aEl5UWxpZkJ0dEpOQnlzL2tmNzltdTRsb01pdzhpUVFCY1hxUDlQbXZTbTVRTDJ0UzMwK2pYNzhPc3Q0RW5XaEN3MWxZTXdBY0VhQW5wM1lMY3lJL09nejVWSDdwd1hFOTRDQlNNaElXYzY0a05GUHZXL2o3WktCUklBTlB2WERaQ2Fpd09hNStsUmprclZNd1ExbGJjYmZWQlFwbE9EQjMrSDB6SkZuVi8yZkJreEFNNWprYm1UV0pkY0JPYTFoanVrQUxzdVlmNDB0NzlheGlUN2hDUm5kaExzUHUrN0VPemt4MlU2WG4zWWFxUE8vclVkdFZMSld5STZOVmVsMU9XNWZVWVRXdTNBa3pVVkZTQ1RoV3N3NGwzaFpUalkyakdVamEreFRuQlNNYXVpWVJvZTJ5YU1LRTNmSTBNTUM4Q015NnFVNHBTUHloaTlhNnl1Z2MvTmdHV0FST0VnSWRJak9MRmhBVEU5aEJPTkVJTDRNVHNEczBsdHN1dVJ0cENzVGRHTVVRbkUyQzhpNWFrNWt4cERKK2llSEVVVGp2Z3RnaXJjMUMxY0x5VVNNMnlTaFYwQThIa2djZVFyUXQ2ZHNNSWs4eWJCRVhsL2hCYjZuZDY4N2dhWXVRNWtlTkpmS0ZkbjdXTUIwQy9aYUl3TkVVRi9IVlBoSTh6bWIybCtPQVJkM09oUWY2Uk5DdWJwY0ZZaWY4MzVpSnA3RUxhTE45ZktHTHdzTk9jWGFWaVQ4Q0V3NUlxbitnK1orc3E2b3BtK3RzNU1jcDE1Z1ZqaHRmTThVS1hLVEt6djQzTUN3clB6djBGWmNzYWdST2dNdlI2YzJqRTlyL2U3anYwVFkydnlTSWZvbUlzVG9wd1NoSTAvTE9jQUs5dk1ReUl2bkNEcGFIblQ2czFOaXcxd2QxM2FJdmszcEpncmpPUjNNSFBpcmJVSjM3akkwMGRhOWkzOERPWVV3S2VXUXZQT2hucHpwL1JUT2RSY1Qrbi84QkxRVU9FNUNKeDNSOVdWVTNpbkxkWCt3U0ozbEczTE5wanNkY0pvSzU3YWpIZE9DYTNnMGNTZGF3V3AwSXlzRHZoVWsrVlZnMW5pRVpqVUZyZjNtWnNtVTJvMmdsMFZORDVHKzNNR1QvV0NZYWZtdW5abldwTEMrcEtxUjRneWpQTTYrNm5XOVNkZ1JvODFEL2JjS0JRUVVGSnZZd1hWb1g4VUttNzRWMTdaNmlEc0M1dVRzZGIwQ1dlUHNkbXAvNEptSWVROHRvSjFrRE5rZEQ0QVNucUVrM2twaG5OZEhaWkJLOGo0WjU4RnRqem1UclZmZ1hxUjlUNnNHSWI3V3BTdkdYK0FJMmJPVzQxMGZRVWNjUnRUcFFOVzl2VU1WblhISXFZT2EwWnBvUlN6T25UM0VlRnZtaWxOanhjb1kva0FMT0F4aEk1QmV0NVRncXkyTHRCUGlVYnQwNHhweXU2MjZ6Q3VhbWlQQngzREljMjlocVZITFVYZHZ1U3hLeERNWjRyd3hIWEkrTlc5TlJabUNvelozenFUK2VBYXRvRGM0ak5WTzZWdmdSYzcwdi9xUVBpU20rZE1kY3VzNzVrSzBKOUt1V2d6aTBtODZycVZHekYvcXpXTU1iVDB3TGVqa1U2U2ZoZ3p3ZTB2d3JaMmNyTXMvRlR5NVFjNFlDbysvdTZmdVVpbWZmQ2d6NlRmNExrYTFJdGhkeDJ2REpxeGJja2dWQnhydnRvM0c3dWsvdVh2ZVVKM2V1OWZGa3ZMQ2xNUkJ5ZEU2Y2NhaVVPc01DaE9EUlFhQnAvMHVDVG80TXZwMFY2YnN2a0hKNGZhS1RUKzhXbXpOL29mMGk0RGlVUi9uSENPODdMR0Q2VmpmdmtIcUx2LzdiV2ZYZHo5OUY4djIrQXFiQkhPNnhwNWhwYXRkZFZVek1DTlRBMHl1VmZQcFNwL0E1S0FlRGh4N3NxdTBQNFVnVVF4bmxGQmlxZWZkS0drNkdza0RsMXk5STc0cUdKYmdMS3VWVGI5L2NyTlVqMDZCMWgzcTlqaDhyU21xcU02a3dTVW00RkEySHAzdldNbzg1RE5TS1NUbDcwY2wreUpsM2NVZS83bDh4Z1lLWmN1eG5paTRDUGc1Y3B3NTdKVFAvRXRCSW9mbG5QVGc5V3ZBdnQ1c2VzSkhYeFlxM0gyQ1owUWw0eFh3WEM1RDJVaXcrR3YyTGtveERCTzVrNlNTNHAvdTFtNWhFZzJpUEo4TFRxb21pVDlUYlpINTJ4eVhFdGpBRVVab3dlQ0VuMTBXZ094Z05nUDAvdUpaM3BWWUxOdWFkMU9jQW12NUtKQTQ0ajFIWDFHQkd0dEYzN1BTRnFPYzc4ejkvYVI1bFJrNUhTdSsvbTVUY3V1VXo2NXRFbkFaeTA0TW5DTjAwd3d3eVFoY2gxcURzYjdJYXpUa01xWDdNa0lPN3gzTGJiQldrOVQzS0JId05xR2pKSTJkU1kxNFhBcFhXMDlTc00zTmhSV3RybWVRR1dOMHJGL0RmWEdVQnpPM1ZQcmlLVEVlb3FUVU15U1doQUhPaEF0SkVWZ1dVR2NpckpPMnl4dkU4UXliMEx3a0ZhMEJlaFp1RHdlMTBUTVlPRHZuckdMcC9uUFhpZ3FzUmQ1QWNlUWVieXF3MXFkQ0ZlcFdSWDhkZDl2dXBueUs5dFo4UDRmQmlldjdyZXFHTG9MZFRwekk1YXJwb1ArREFWalZSWGhiN3NrbENjUStaZUdsQXlBWnFQMEU0bUNkc2NxYitUa1RZVm8wVWZscG9UbmZNNXhHNjgxWXVqMTdlNnBHUU1CTHN6SC9Ub1RLVlAyWEZqOUFvcy83aDZSeUpjcUFjd3FsYWFxSGwyc0VTc1JSQkcrOUhUUVRkRGEyR1lFWkVQSmwrY2NGaUxnQ25aclNMQ095WVBDaTAvRWovVWR0cVVVczZUcFhPYW1nbjBoWjB5SkQ4NHh3RzMrZFJkaEV5NmVuNTlvU0c0SGlKczV6UUd2ZTNRNVNsbEdlNU8zdUFZcmlxdExoV21VZFM5dkEzNU0wNlpTcG5WTGVMeG54aTVpMzY0ay95eTVGc2hLbkxhVGM2TEYwWXowL0xib2NDZWhWSkxOYndiSk1jVEtSOWxlVzF3SHVhdWFkMUp2NHUwOGlUKzFDckY1MGRQNjVVVEVuTWxzYmdvYnpobWEyVFRWazM5SStreWpTWWtzZ1JPM0JCUDdDY3JKTGhmYjEydDE4ZmdRYkY3cVFIYmZSMzZhVHBVQ2NQSkh5OTZ0S1lwM1J3YUhCNk5ma0pseG1tNUk5dEoxb2ZTZU9sK1VLMm9HYnFuODMzR1R6L1FPNVQyRjBmd0JjSjdvWWhoc0VwNHp2OHMzU1BacSsxZFo3OFc4RzRiL0JnRkdMSUVQZWo1UVNDOHBQdEQ2NnR1ZDZxRzVERVhYbmlaY25KRVlWR3B5elVQMDFUdFN4SzVNKzdmaFYzQUtrdmg1Lys0SEtVMXNkQlVsZzAyTVNTdDUvNU1HQ2lucElZMERXendpYVdYOU1wTUQyT3VTdXk3clZYZUh6ZWVmRzNsdWl3Y2ErcTJyM0xFTE43USt6NkVOcTZLMDg3K0hzZm10WEJUcVIyNFBwbEVGTmFPMVh3VW42c2Z3aDU4L2RKbCtnbmkwaVBRS1JwazU3dW8vR2tRUGhLb0hEU09wMm1KUjZOT0Jzc0tIcmxHT05aQVV1cTZzb0p4TjFhSlRsYk5uZkN4SGhlRGI0S29jL1ZXTGhocEJLY1gxMmpTaHlZU1VMMzRSTTVxa1pGWWpBdUViUmluc20rR1VoOFhHM0NRTks1OVVNTEJiNEVhY1Y4bXJSaG1Hb1RFTzV1RWxLVzFMd2tJQUczZ0VPSFdGdXgxTm1YenRxelhuYTZ6K3FtdlhqeWk3N21wL1c5YzQ4ZDYwRlR4UjFKTlRQNjNaSTNDV21zWGZVUTlJdlF3VE1jWkEzbG8rQkJTQkFVeUthYmdxc1Z6amNOd2MyZnNXa1ZlVHFNTVRrTUdDcUF5L1c5bmlkOCt3eTFBd0QxS0Z5UXFuSkJQUWd3OWMzRmZRUkR5d0ZLTjl6bDdaeFhSaDlxVmVuSTNwUkpoSWI0Nm8vVDRubkwxcnE3d2F5U3RDYm9tem8xa0krdFJ3dWZBUTQvdDFJamlidEhaeFlBWWYzcXMxVURBNXR6U3VxRUFWUGx3QlRGckE3WGFyNWhIT3N5dlRXVU0yczI2a2xZeUpEaFZZdTR5Qk15Tkk1ZXZpUVk1VC9EZkpWRkFwMUZHc3l3anhIN2x2VHd6T1o3R0hUbnRyajJXTlNjRnJIV0RFM2M5K3o3WXNTbWwxcEtMS1pBVitQL2ZxdnNGT2IrUEpGVU90S2VVcktUUEFqczdKakVmWlIvK3pxNDNoSi9WdDN4SlBMbHduZXMxUm1MdXpQdXJZSHE4dmlaMzVPbDNEZnIwd0xENTA1RWdZV0hPM3gxenlJcjJmaXU2REVHR3RXTHZoK01jMFhxbTNOQVo1QmczamdlSHNKSTUxV0pzZEhPRUhNc2piYzZneEZXVWdFZGthVzZjMy9Ldk1OdWlPOU4yV3FVYzE2aDRvQVMzRy9YRlJEVC9lY1NFUHplOEVMSkVsQVFvVWMzemtlMFZaMGVyZFExY1NpZFFUUnl5aUdBM1JoTkRyaVVkZXdRU3BiUGIvc2VYUHBnL0E3SGNxTnBSdkxOZ3Q1RnZBVzR5R0pHTzNjZHQxVEtUNXBOQ2VGUno5aWJPQm5yaHFCREpNOXVLTVpGL3hTNEljbUZnR2JTcE51NjhFYnRFeTFqRmJVWCtjS1hxdEcyZ0hkUjkzaEpOcDRXWC9OR0diWWJrM3lXYTFRNURsbC9DUnl5anUyLzJXdEJjTm5yaXQ0K3AwOGlQcFQyckRaSllJT056Q2Zva0dTOUp4bHpic1d3VFJlQVBvaDhjWGV5VGRyRmhNK3Mvb3c4RHJib0lzVjRyektvSW04SXFqbm1pMlcwT2tyaVIwVEhwRDZoZXlMcG9rMzB2ajJRNmdETHA3UVArVDlTM3FUbXVaUWxmRFlaWTU4VUdOaDBGZjVtdk9FbXFta2hpNThMdE1rOEFCWjhDdWsrMVdYNkhOWmJvU0FSellkUktWRWxOT2RIVk1OMm5vS0dTREp2cHJkTEtSMGp4aVBHb2tXV2V1SUtmNko1VXFTWTlVSXNzU0swUFJ0eXBTRjVYeXlsWVQzWGQxQ1FQbUFOOHRoaGNtODUxeFRLbnRVbUx0NXd2WGE5VzlEdzUxVHM0L0tKVSthM3RoUFBrTnkwTjcvUFJDYTcvM1kxWmZyMktBalRXR1pxVXdsQjcxRlZBajdURFlXMjIyL1pKTytKcGVYdWs3TmpKSDJXOUZLWnhrTHhoL3NES2Z0WFRuK2Q3a0tIeDlyMUtoOFk3UUwyMDB1MklKTmJxcnpycE5xS3BCR1NXcW1SZDUzcjlMYlo2ekU4N05oMGlsd2NQaUovbGprdzk2VzdybkNNWTNnWEJveWZJeEYyMzFpRGJweEp2VW13RjhMalR1WFlyVVQ0WjhzTzljaUQ5aXMxVzlaNTRBYkczd1BtWVZ4RkEzcWE3a0ZNQS9TVlB0dDFUMWc2d3BTRmQyRndxc3BoYWxWdlpteFJwVjJsZEpwdTdCTXR3TTMwUGoveU94Mkh3SUg3YVBLUW1jMEZNTWMzYkVxVW1DWWp4d0EzT2MwY0NaZTRlSmE2VDlaaTdtbmhRWUU2QlV5YnYvZnRoZW1makhjcUJUTzlrQUthVlVabjBINnFQNHRZQWhRQVhJRUVMaGwxUlF1ekFaMFVSY3FUMUgzYXl1d05TQkN5clBYWnBneU5EdW9RbVJ6MC9DV1ZTSkxaWnVnOTVZNGRzRC9ucHZuY1B0V05GaWxEZnhXQnJXSHFVbUlCcS9RUTFmUE1qRWpsSDV0UjJORUpmMXdnbXpBZ042Smp3eU5aelJuT0p2aU0reHUyL3p3YVpIdThUazRCaXJmOU9WclRCanVyU1d5WlVJY1J1TTlEM0FuTGdBaFArMXhVRjJMSWhmazZGUkZzd0xOQk5Mb05VQ3ZNbUgrWkF0cVF4Y3VoOWZQQ2pDMXAwdW9HaUdrT0N6d2Z2SE5OaHRsSkh6VGMxZ2hhZkpIVklBMlo3U1YrQVhrUWtEbkpBajBXbXdmRzVINDFNTS9WN2RqTUEydWl6TXlYaUJ4cFFBazhVTFMrbm9CQWdxVkIwVmNRQ3pDWG1FRk1kYWpST0tiOFNHV0p5QnErdWc3RGJKekpZUXRwc1E3Ujd3aEtxaVdBM09YTDJXYTBGWFBHV2Fxa1VTbGRHTlJsMmZiTGdFVlU0V2xRaHRxcG4wVzZ2RDgrdVVkdEpHMCt6cVpYWFpDRnZpcHE3SGlpRHNNYVJzVE1XTTZNc0ZMUnpFSjFqbjZKTzhWWjhYQzJFcFpOSDRDVjYwclRLZlRMOTNuQzYxNFRKZUVBNnNjSkw1TzBZODBweVVHeitWYm50N1VnTVV1WnZJcDRWWnp0RWFIZ3RBYUNyQ0JWalFJY2F5ZzlaZkd4SmpaWUtYekJQTkczVmlWZDlEcjRRZ1NwTnVQOEkzc3J1YWdKT2hkS3RxcXhtSEpiZEZYRCtlUmNwanZCdlZ0UHB2ZEVjOXV3Q0E5V2FWRSt6bHNzR1RiYkYwK2FSZnY5WlA3WW14RGQ1SGZyVHlnbVg3M1FUTnpNeDBIWE1XVGtyZHQ1RDhlUjBhUytMUkdMMEtvQ1FFcit3QlNTUlNYczB1cytYYWtCK0pydkhmVmVORWpxaEw4U2FKMVZXYTM0MWQrUmtYc2FNVE82ZXd3QjVYNVdGR2lRTWlSZjBkVHd1eWpYclhCZ2xKL1FxczBiUjhWMzA0MWN0YWtaeGMyOXNrd2ZUaGhqem1QbjRDaEgyNHRqVjZBbEkyaGcxVm1WMitSUFg4cGVXZkRaNCtRYUlIc1ppT2hKZnNNbHp6QkMwY3lmRXBFa0N3U2xHQVFXUXQrSldLYXJKVmhtcHZnS1Btd0ZTK0hpNzBtRmQ5eFVXSUtrZFoyM1VCWkJIZTVsd1N1Q0NodFI4aVgyV2FHTUFWYitKMERmcUQwZC8zdjROSXg0THQ5N3NvTGZNbkpLTDlqbExCRzlWczBGTEJvREpSU0tWN3hDK1NSOWVvQ29HK0libmVuQ2ZaUllrdlI4bmZTMW5aQmI2VnBUelZVb2pQcmljZUpiUHQ0NHB1RXdTdUsyL3J0MTV0MGZZdG9zVFIvZU5LNTI2RFNKVjFyaFRHR3ZuWDFqTUM5WVNHNi9DblI2elRRK3lyd25sTTBjeE9RRnRUR3VraFRDR2R6MGJTclNCNXFJR2V4Y3hRRGhrMytRcytLQWN5THBIWEMwSGlBSnZSZGlTSjJMd2I3dDdlMDhzREdyQ2I1MFN2UVNQNTBtK3VFeEJVNjF4L3A0bVFFc2JHK0ZDZEt5REtrOU8vYWRLMnZIVXI5WWdxajRuMHh5b1RzNHBJdUtVOHhMYm1uUjQ0M2Vwa212a1ZwaWV2SGdDaWtHSUVHZHU4WGd6NXBmN1F3UzZIeENzRFlwM2xPeGsxYUZUa3J0RzJkUmI2dHhHUVpqUlljT2YrYlQ5VG5ET1drcldhVmM3UnJLMDNHaW5UQlJENGN6ZjRuQkFjbHRNa0JHV2NzanZPa3I3SEZ5VHI1QVhhbVpJMTRtVG5naVhJakdHbTN5T3oyZHZ3aTRrVHg0a2E3Rmw4VVV2SThrU1RNNUJEeDJIMHBrM05BdEMvZk9mdTVia1M1Mkh3ZGlBR0VKM1ErOTV6Q1VLNDJGeTUreXloRDUrek4ySDQ3UDhkdnloU2VHREx5cTI4QWxPbHI2b3lrQmZwTWZVejg3L3JlcGtaV0hWY0xoaTNYQmRSOXJmUlA3WWVRVlBtU2FiMUFyWHhoL2VTbVR5YVZEZkQ1U01VdGlPeVpVTDRCVCtEbmorT2pNL3oxTmFUUjM0eXBNZWo1VUMwaEZ3L2xlTEZFK3pBdVBocGRNQkhSQzFOa1M4V21rbnBYSmptUkV1Q0JtNlppWDdqOVhwSURlZUk0OCtRNHhuZmRqalQ2K2k5Sm1IVUtwOHgxN1JMS0Q4dDAwcHl3d1BRZUplbXYzZk5PZ2Q4K3NxNVVsdFJvMHJxYzliVlVKeUNyUUNOSnJUUXQ0RG9RVXEzbnQ4WXhkaGZyK3VXcDJRbkUxM1lFdnUxa2FVREcwN096WERjVzBkcno2OEt6dVNTeU1sN0ZKWUpCSXY5eW1XS2lpWFNsZFNSazgvZUczaGoyVEVSUkRnSS9aMUxLc0RxSS8yYVR6Sk9HWUFTamxqZUpENXdDeFB4N2IrVmx5dUp0cFN3c2l6eTROZlp5bFZIRkk3R3oyUVZFUC9YVE9TNGx0S1RFZzZuMVMwZUJZY3NWSmVUUEk5WEpMcEZSeFhKNmhhNGNWa1hLOG5taW9WM054V2FJc0wySVJsVTdTRGE5MFhwOEhnam1FZmZHOFo4RFEveW8wbm1JT25kcXRCMk5ZVjBTTXZPSWRyZHdWWjBxS2QyaEZqNHhVWGpYTUduN2RpYVhHVlJ3VUVtRU96dXN4eHZISUtBZzFWRFliRGV5dStlbnBRdGgrU0ZmRXFPVDlnM0Y2Z0NUUHVTUlF3bi9lYmlYc09sK2V4aDF6VllvYlVrMGxBWGxUZDJOK0RTSFdzemxuakNlRE5IV3hqNXY4c250WE1SY3Y1SmxpbHBuUU1ib3hyUnRnWFhlc2tTSTlrN3pvTW9VU0R6TnFrTmMzTUlHU0k2WXRuV0RFby9LeFZlSjJrN05lTmh3K203eGkwTlJxbDdVWWo1TUg3RFgwbkRuTzVtSzlwNGlFRERoamNhRzNqWmxEOWR5VkhTRXA3SnpUNWorV0hONVZwSGovRzBEa0RLUlF0Nm92YVlXTGtxVzhIVzM1T0QwSm5PaUR5Vm9lbWZZcGtBVEdDTEZPWnRKWXhJUWJ5Nnk3OEZ1aFhGQ21nY1BaczZCdUZOOEUrVXVLUnhqK0c0bGlINkhodkhtREEvWXNOeEZsdktvUDhqazdvdFpUbStjckoxK2VsdVpsU3RuQW8vTUN0dE5HMkNZVkZjMHdEQW1MMVVvcjNiQ3dhS2VLbDVFU2R2V1NYTlJUKy9VOUFUeGdEWlBxMjJPQ1Q2emtDYXpyeVAyZnBLcmlaWDMvZHJiNFY3THlQYzRWODVVeFZ4MHhlMTRURDRlMkZkS1h6TW9PeGZwK3FGcituanZqWnVvQ2d6K3BoSXByYlovWXlsNHg5WkwzR0JkMFZmYThhUzg5NU04Z2NOU2hKNTN1N3RMdGRqejBGNGFFUjRFTnBKd1plSEtGYktnZThUSmgzTit2RmE3eWdaaTVCbll6MnIrV0IyUmV6SmUvTzcyRi95TWJmL3RuenN0ZExGNHdtOWFxcm5iNGZkZU1vNUhEVDNtZEhmVnUzK3h5aTZtUmIwUHVYUzUyQU1hSndSZTM5RFNZK3JTYklvcmQ1Nzcrdk5xMEE5VHZJUVMxME1VbjF3ZHl3bVU1QVZpZmIwR0pHdC9ZaUNPZEN4QjBZSE8zUzlHMnkvU2kxcjVha2JmdjRWbjl0b1FvcFh6Z213ZWZMeFE1QXFVazZpRFNtckhsMWN0MWFMQVRPdXIwVXcwQ2pxL1ppRDlhdHVXNFd6Qk9DWGpONHp4eS8zSFNsMzZaTmpla202QzFXWGVtNHlWenI3M3QwM3NIakpTRW9xMG1sUU5VcWRiZ1VXTWtUb1FwVG5HSzh0MFdEK0NCSGc5UmFDc25UcGxsdC9wWHRlMDZYQ3h6M0VZa3UyWlcwUlRpa0t4U1RWLzI4eFY3S1VRYkhEVnR5WWllT0wvcktLTUNkYkRxTStSUHo5V29palEzMUI2aE1vTlJ3bG8reFBudnpRWGdLUmc5bUQ0R2tpamc2RVRIT2Y0c1hDVGk2ZFhsb0phTXJIaW5ld0d4VXM4eEJaT1lMRCtETXBCNXB4MXpyV1huQ3VTS2lPNHhzdS9YSkx3SWtoUEhYcFUraDYwdjFWUnFNZFdtcFNGcEVtb2xWd0xaRHlhV1RUVFVwd0ZBS0Y0WGd6bHpiM3RmOVl3RGRhSjFTZzk0VEZkcVRKem5nT2VjY1JadFlyUkpxai9Yc3ZMN3J6Q0c5aG5nVmJWK2o0MHEvdWZVRVZ6VGtGVjduT1RLWmU0elh5QVE0bFprS0dmTDNTeTR3QTNNTGt2L0xqVkRXWmE5NkxRSmRhZ1FVNFQ0NGtqMnEzaGdsa0RubDBKejRjR3dNejlkQ1hPRzk1cVRNM1VjZDl6ZnVUS094M3VDMlJZYldDcTdQcjMzZ1ltQVNDSW0yelhJQ09UQ1o3Zk1PTGU4Q293aGRIMWRIYnNIMGpveCtJZXpxTnQ4YWUrdGVkdFBqdDR3bWhUSHl0TE12NXc3bW4reWNacmVFS3dGRExyZS9JMWZ4R2UrUm4wbUNiMnFsVnBaaWpyS0dncmswaEd3RzRGOGRvWmFjbWZMSUdlYXlnQnhtQzJpMmlHRDYvNDE0STF0cjB2Nmc4ZWlCa3U2VDhWUHBkTWhEbkhmUWZYU0t3R2dieDlIOC95S3dWUGdpNDJkanpiRi9lUmcwR2NURTlJTWttQUR3OUJFWTN5RXc0cHVGMWJYRFhsVjRQVHpjdndadlBMSTRiRGUrR3B5WXQvcFZ6TDc4S1BxM2g0MVRRSS9kamxid1hEVzF5R0pNeWcxZ1RlMTgrd0Zxei8ydG0xWXY1Tk1TZ2pwTmR1UlozN1J2NFhvSDM5WnBHTk5ML1lTMmp1eE9vdCtDMDF3cTNxb04wWUdXb25CQ3dndmVDOHNjOVhqNkUycnB2WGxORVFoT3hKVU5HY1lTR2s0RnZSZW5wQmZ6UlRBcDZlTDExZHFDenprTFZoQkRxM1pjZXBubGZvMFRWbDJERXhOZFRMTDhrSm5NNHhtUldyQWlWekYyUnFnQmhhMCtwaVViUGhsd2c4VzcwaVhZd3BzbVFlRzEwNVhpam1EaDllVW44b3RzdmpJbDJNQVpUZ2x0bDlDbzRLVnIvM01CYXd4MzI4UU9peGwreE9EWEFiZG9NUVAvY0cxNzBGNWFINjRqZUpSVFQ3Sm9qaEhjV0IrTFRqQVN4aTB6S0pqR1hXNCsvZmVsaEIwZ2syQVVBQ3pjUlpXMVg4b2ZqRURTVEhtUWRWdEx3MDRZMFVSZDdCSUp1WU5ENERCRjAwZ3BWcWJ2cnFwSzNsM3MrWHVOTUNtV2RJMFVJN0RTb3VOT2l2TmF4Y3ppZWExM1RmRDMxZFN3VVpHQU9lZkdTbnFlTE1lSjRORmFkb2dtcDgvZXpBMVRLeHU1ZGF3OVUwd2pHb1o2RTJRdW5ybWsyQXJzNHc0QkExR0FnMUtlSi9qZUh1dWZ2ODdWMUpmQ2JkTzlVQ21MU0hlNjVQMmNuMDN6dE1ycVZ1MG5GbGxiWm50VjB0bXhyaDlQN1NYckRiN1YxYlYxdXR3Tm1rSEFKa2p5Y1lQc0I0K1FJNjB6dkZLMXFSNjZubXVZMHNpYWtXK040ZjRDY3dHNEVaYTZyaG9aS1VvQ29uTmJFWWQ3eEN4cTZ2WTVqNkcxZ2lyZ3J4Y1Zua0U2Z3NRQ2pTemczSG15UHNhUG1KalQ5bnl2dExvMExLcEJwSU5LNU1NbUhMclpwN1M3cDhjK3JiTi9jaEViNTJ4eUpjckI2bFp4Q1BvR0FhSjQxa0t2UVphZE1BZWNtbk9HeTJWNHBodys1NnA2WkdUMVp0NFk1bUF1NXNZUk4vcTZWZ2JqV0MzdUwrRE13ek84dXlTMkJUdVZTNFY1eG9Fb3NLNmVBV0xwcXRCU0Q5OGd5Q3ZjUVJnbU12ZG1vWG5LeXlNYmRESHJVdGFwVjV4M1R4K2t1K3A1bXhXT0dyTWExeG5KVzFhMzlMM0ZBQ0hZRzY3WUtiRkx1bW5GS1NjWEdDVzNYMmNRbVk2L3ZBTEd2YUdlcGR4TG5weDBwZmVVTG42R2NiMnJaMHpkUHdnY1dnb0JXNnNJUEFZSHluTmVPdmIxYUNzTVVLc3A3aVpha3lIQ2ZOenNKWkhHM3VFVmNYWWcvRGVWTUhWRnpxU05QZmx6UjRCU3NoeXdBaGhGaGtxajBhYjhuN1htc1Y0UThkWVBaa015UFZRNFlaQmNMekdBTmtXakFKQ1BmaWZnZHdGUEVvN0RGY3l1b29Fb3QvSmN0Qytla2VGbTVFOVRjZC9oNnY3d0JtMGRaemlkZ2V0MFZvNlZRaGxUSUN2NXJOR3RJcnE2bEd2b0drRlRTU0IrMVBOSlQ3WGFjRFVJM29qK2dOQW40TlRmc2h2VEdQVWpBenorMlpDeDJjSlIzeGxkNGk4eHU3eTlVK3pidkV1RmRVdlV3RHBtamRMWmNoLzdwMFg0amNzVzRpZVZTVU5DeHJscjliZmorNnpVUG1QQWZOYkJTdHRIQ3VGUVhTUTF3dHVoRFhZaEswdEcrbXpmSUlCZXZkcTFLaUlKdU5HdlVtVEJ0ODlXUzJ4TWE1akRodWZwc21RdlJ3dG1WQmNPTU5WRnlpVnJMQWhnRXRSLzJmb29kUGl4bVFzczJUaDlVdEZ3aWFQK3ZnRzBGSnlZY3FwMVplL2N0K1R1U2xDQVd5TFc2dHl3QjM0UEgvcExsbmZ0L3oxV2pxTHluUTdkb3V2TE1PZnlEYW1KQkh0SVpzNFBHU2ZtZURFbDVyR01laU54ZmFqL2IvdzEvQklma3JJajVoZFZFNFhGdG5pSjJPVlBWRjYyQzNLNFdWZUlueUt1blladjMveWtxWjh0V0RQM0svTmhOWnFRcUV2STduVHJVVTEvSmFBMWV4c2RLZDdtODFCY2pIeW8zU3F5T0NUVWZqNXBTQnhLV0h2OHR5aEJmeUpNV1Z3aXd4T0Fjeitmc3FqN1dpS2hnMjBXV05YWFFKSzlsTGtlN0tYcHE4RkNoaFc1SS9PaGVZeXphNFZrTEpTRjA1NmdjTlFCVlY2dmNaMUFNaDdtME5FOCtlNVBON3VDTXVreituTFdhcWgzbkc3U2x4Q0QvZFpmY0tZaGRMc3g4YXZCb1NPOUcyUEtKVVkzalBXVnp5Y0tEVWluRWpmMHNtcDRybmd1MUpkSDBPaGE4QVF1a2RvU0hjVFBiSm5tMFZJVkd3eEkvOE0wL0RmQnkvSXdvTUwxY01SSWlsUFBNR2lmQUNuQ3hTNTZQNHlYcWREYThZRmZMVVloM2cwemF3bXcyY1d4WjhlZmRkVE5FRXp2MGM4Vm9oNEo1RnJaT1Jkdml0NVZYZ0J6SzRJa1BpRlg2Vjl1bnBPMFB3aEFsL2JCbENkL01QN3hwRWVnODhzOC9NOW4zWmhYeFZxaUgvbGNEdEFaSnR1S0V2enlaMmhwVi9mT2dkN3cyRHJzSUFnVDJvcGR2ZDB1dVk3ekpLYkUyMTA0YWNrQ1RvL3dHbW1KWkdPOGR2R0prNWN1amplRW10aExxT1hwdWNhRE9mVXZBWEcwME95VVkrRnZWVnNVa0w4WTdvUmtHK2ticXFhOFRkQkZDa3BkSTl5WTN3WkkvQ3ludER1MmpYUU5sQTJDWmlnckFhMVpQWTFqZTlhYUtMZ2lMdGZjdXZrYTU5bVI2SHlMOGhOY1BhYlJhVENYR3BQZDhDL0NjYzlVRDJCWDhjMHFyRGRDZEQ4N1JCWFRrRmplejRRM25BYVBUQjZXRkF2dDNIc20vRjBJU2krV0pZQU5pSXFvbEd4OW1qRjlKQWpxVm9rMGh5WVUvcGZPblkxU1FMdy9WUGlWS2w3cWlTUk9LWXZESEllbDdvMndRczlqTys2N2cyc2FyYkxUUDlUa2NzRUFsSGxYNU13TGZES2MyY1huZjVjY0c3TTZ6SWJHZk1uTWxPWjJ4Uk5uYy91WnpXYlFHb1B4KzdwQ0oySG5oV09mYTVKaDhvMG9HTFdyM3lXK2tFTnVEM1NiTDhla0hnM3lWY0wveFQ3K3RLcmh6NHk1VnJTQzdOdWNVL3lWeUk3VzhHQTBUdEYxYi9WUnNtYjc2Q1dlTFBNYi9WQi9kYTFsaVJTOThnbFlIdFdwZ1B0QldsdWZNTzhjd2d4ZW1YaThWZFZzeHJTNnM1VUU4T293SVpnSUNwYW9HT01KamttVllrMEFsMFRSd2RrVmxsc2JkVnFkR1RQd2xOUXNZczdSaHhQOHVOdHlzZUQwTE1pUU9xU01IZUhnN2g0VlphaWpGalJXQUJNTVZPYldGNTRGa1JWMlBrUzczNUhXTlJaZmZEclNXNEVzWmpMN3FBVHhFanpTOG5XR1YzUGhJYjdxYkpHT3I1WE56d1Z3QU5uK3Fhc1krdHloNWh5WUpBZ1VQeFA1ajc3c2lXeUFRRzNSd3NuN0Zvd0FpUHR5VVBkWENUUVR6WHIydHU2REtnYkJvWURzNXlObXFrMW1qbnY5ZFFXOTVnNmp0ZHg0QmZjTEx0YTFsTDlJOVAxa1pTNXJvbTgvbExTSFBxTVp2aWJCRi9SWWsxa3dFYlE1WkZBcUxFN0lwVmx2TDVYR3FkL216ZnFOc01DMlZqWmh6cjIwYWNIZ1hYd2ZJN3ZYa1B4YzJvbjhSTXRmSkVCenN0WVNpclFxOVlrK253T0VjK0JPTFJVOTJlYzJCdDNyZUxzNUNlenJiOXFpbHdjRk5YOE1CRit0d1V4b2hVQkxrY3VIWnlLWnFqNkJMeVJzeXBBVXBTQ1VYRXAvRVE2WlVJdDNBOXRld00xbTc1K0NmSUZ6WVI5VDZDMnc3a3BzcVg2ZWJuNThtS2UvVDF4SCtQcE5ERklnRXZzS05UcDJLL21BZFMxTmk0OExYWXd5cC9yREZhMUFtYTBrOTFIRkk4Q3JWVjVOVURzQW1DR3k1cGpoTWpZNGRZdGdwa3VMMXhHRjVjZnNSR1BaM2psakkyTUNrTHF4QU9XWjU5dm8yRmhJK0RINXRDT1I0NmhJeGF3ZmdIamROTXJTMml6aTN2Y2x1WEN5dmR0QUpHVFc1SGVKc09BUHNrVk5yd3UxeHgyM0VnOHJFeHFqZWRzUHR1VzdTRFk4bG1sT3RBQVdpSDUvT1RSdG9TMS9vM3BTc09VQW1rc3VZbnUwL3E4TGtZWXdIWHBIeXdYQXJCU3lqMmNnRTRkNG5Damswc2NhNzZkOUxzekJMZ01jZHh1cHZTV3ZYVm5mL3RvcklqR3Vpb1VmL0gxMFFoaE8wakVKdUJvc05MSmNVOFMzdVUzUmNYN3BTS3BFR05HVkJlV21zOS9lazF5Y3VXVmlpbDdYN1p6emJMWnk3M3pUSzJkdi9xc0s1eWgrSU9zc29Zb1ZzTnhrZTdPRmtQbWRSdXhWNDFFbUM2OGZjYStNaDZZQzZxMjExOTZ3c2J3dFJ5Z24xTXRtK2VvTFEvUlRzUFpPeE5zZjljV2pBL3B2THhsdXd5V05QUFF3UnBRSHowanZvelpoNzhZZDZ3QzNRNEx5ZC8zMDV3Ymtpb1FzUEVQSUtvVy9FQ1VuV0VIMkNPQ094YzRWWThpZ1FkN2NMMUlySHA3OC9uSDMxTjFDeG5BOTV0TmN0WTB5N2NWdFVXMW1JcW1TV09iNC94KzBhcUNuREVaZVZ0TWN4RzBHbGczeWZrejd5aFkvemtwUnZzVXc2cVNkSmdXdTNmV1c2aUpoQmNmSkFXd1FJY29RVXFKTHZzQUlacTRkUWZYWExqUmhTRm9IR1BTek9CWFljVFpmTGxNU3RvT2NXbWdnVjhRNVJ0UFNVdXdPNzdiREZTcTFqNm5OOWl1OEE1N2RjemdOS254NTRRWlhzUFByTkI5RzFaT25WZ1RmRzZTU0pVMXorU1VwQnFvWTFFL1h6WFQ0Y3V4TnB5eVNvWERlMzFmZWFCZTdKRndaa1dHcmcycytOREdMSW9ESjI1UDN6d1puYkpIWERxSmdMNVRsRXovRlhkRUhxK014SWdYa2tLd1dnQTBEK3RzTmJBdUlDdDRFdTN5R0NlWHZIbnF4K3FFR2dsVUtoMEQ2VTdpdnFNYXF4RW1zSjIyYkl3TGY3cEwwVEd0aWQwd2JtV21vamdQRWtVNFFUdnA2a2V1bmF2RldDVnNhMVpHakg2K1J6dDRIbVQ1NUJCdFFCYzRURy9scHpNUTIrdDVsUHA2WFpBMnhJa1JHVWV0L3UycVk2RWtOS2RxVVZZS1pZVVIxSHVPUkord214Y2taK1BvS2ZKcUNZMS9ON0xhdDVJSmhPWFdvTTJZWGVTbGFwekVrNUFXRXZnTjRsS1FvdWZqV0N0eVQrNmtVYkpXcGttUCtmNGw5VGo4NGd4NGV5N3lHMVR0SXNMd3hjVTVwcTdYdGJjQTNqcVB0K2dPaFA5MDlEaU8rbTcwSTZ4Q29wK0VRY0ZLWHBEdCs0bUg4UjZNZWMyN240NDR4Y0YyYlYxTUlKWUNKWVZDNThiOTIyUnFsU1RzM1Jsb3Z1NUxsTU5TMmxrdmZENktPOXp1b1R2NnBKQ2RtdG4rR0F4elJjUHhDTmhIL3hzYWNlK3hPY2tTSHpoS01ycXJMbytzUEtxL1I0Q1RlaEd6UlVVMHVCTjZBeFEvVVdqQ3liMzZwcUN6aVVyZTU1KzRVZkRhQjdiZUoxN0UzOTlGT25UTVRzNnlqOUorbDZZT0d3VXQwRHd4MjNKbnJ2T3V5WllQK0tjQ2tta3VkMnpXZFlzRGFNUXlZUFNHbm94NEhvQ3JseXlndTVyUW1TcWRXRG1UTHd0Z1Z2a21pQ2tZMm5SZjFjZGxYcnVxSXRPV04rdHA4T2c4aHF0NU1xT0t0VkJ3UjR1RXFLcVRwZm80WkFFREE4eXNmR01WbnkwWWtOVUEwMnpHRkZNMWV0ZCs1dmVqUVhodmhBbzhQaHBVUGFjWHZJSFBOTTArRTkxWTlUbXJHZkphc1FyNnpseHc1bDJLaWkzenpRa1dtRyt4SE14Y3dVSFZrRWJRU0JQWlpaMHJHdDJ2M25WOGNteUpEZ0M4V0lOQjNoNFFHcmlPNi8xNC9aclNHUTJCdVpidDJKTVNMZWJlS0FERHRYcVFNZUxWOS9tem5oUHZPZXAxWnRYaVRoR01oLzhReDA4NlNpdVByT1NybFpKalMzNG02MFBMU2VINnJDYWwxTFMzNzRWUWVmZjZrZ1FqaktBWFREM2tBRDYyZi9nMGU0YXZSZjlma09GbUtqT3FpL0Z3QnlNNXdpZVhjaWwxL3c1S0lLUHNWZHFCc1FJNHdLams2ck4zUUFUUk9VNG9wNFcrTVJnMVkxcnZuZGhwZWFleGtXWkF0eXduM0t0b0ZlanNYdzR0dHF3djc2Z1pieVpQWDhFc1V4WXNuYmQ0UXY3SVVuUUlPekJKTk5aVlhENm1JZ1UxeFZkUGU5ZEg4dUs5dndPRnRsTElXSXlOcFdZQVVJSThRNnE2TXhGQ0hTdFcwNGlUQXJwb1dZc05KVUpnQVF0UnF0bjJUdkIzSE0zamNMTTdJMDk4Q1lNenB1SWFsd1JlemRIWUw0ZXBtV0RPVkdzU1FzNitKemhCemJ2YjVmY3RncnhFRlQ0VExLbE0wb3A5YXVVd0F4czgvcVFxSE41Vmk4K2o3YnhNUGs5dVB0b3FJY2c4L3Q4dk1JaG1QbVlmRlVmeVpOOHVPSWMrcDJrdE9Ib0t5T3RjY1VXRGtmbGI4NWZPa2NKcmZIblhKT0hPb0E0eHRnaVZNRG5IT0JOQ0o5bG4wVlZFTWFhY2xmZTcvQXhUWHdTSDBzQk45K2hvdFJYeU9IVWlUbWJpTSs3RGhxNkNOd3h3a3gvY1hUODZKOWZFU0Zxa0xXemlvRHp5VnE1OWsxcXZCamVGS1JQU3BJRDdFQm1rYjczRHBZSWhXUW5rdEpjc2pUZy9tYWs1Y1RSSXc1WHVTMFh6NmdSZXBBWDQ1ckNzM2NaUUQ0THZ2T0hNNkl0UllqU00zMDNyWSs5Yy9UOU0zYXNaeGl4dVZPdWJBS04wM1R4ZEQrcVNEOHQ5ajNLMWxocldoUGgzL3VNRkNxekRDZ0RsOUFNRWRuTS80alRZQlREWFp5UFpNemtpcXN3OG9PN05GOWZLR2JuN2FqZTNKcitmc1lZeW5YSElkc0JkV0NBK3k4RENxY3NnUktjaWZGSXg4OVhodms2Y0xJNWY5UzdOOFVkU2VkSXZuMFhMUksrNjc5T0ZQQzZmbzhzMVpNS1dreVo0em5jdWFSS0V1dEtOc0lEMWszS0xCRncvczdqZklwV2VBQ3FuWkFnZVBUS0dDMW5RZzN6WEtXZTZEV0hkWTlBTUM1dkRZSm9xR0Z2SHBBRTJYUVRMMVloVndnbXVEVHhzNFkwS1dkYSsxV24vT2tORFhoQXdxS282NDhHa2lXRG5nYkpBRU40NlEybHYyZXdQclhMRlRtazlLbFNVQXNKMDZ0MkN2WlFzcnl3dFRRUkZ5QXVYeTNSOG83R2UraVRJTERNNkFOV1BRVUtTWEtZalVKZ0RNbnBuVTd6NnpteXRoL2lIckIvbzZ2T0VVcmxuWkNNc01abXF2VE1GVUFrNmdIM3ZtdlFjUVlsR3lhYld4bGhLbWF1QkdtcG5ZNDJaL3lMTlZLTS90bys4emd5WjNMZDlTU1d1ZW5yeXIreWJ2dGUxdlBsK1l1QmxKMGZrdEtkNTJTNVF2bXhxK0FIRmVUdnBKTTlFS2ZMbkVxUzFEZlU4MFl0cnZPNk5RcS82aHBtNXhUTVcwUW9NRTJKaE5EdmhKa0dHMHdvTDB2czdYOVFKemNlWUxnWmtxRy8xN1NmWHR4VGkxQXVmME5hNGc5dWx6eFNMZGZqdTJPcTdKalMrWGVCWHpTSEtUbGJ6NzdJcEV0UVYwTHA3Z0s3NW02NEVYdUxTbW41M2dXOTNlSngxZm15S0tjdm5nU2NXMXczdytld2hodmJSR2NiNi9SWE50RkFLS0NoVlNrRE4vR1lrQjBObFljYzFYRkR1MTRXVGE4RUppRmVCeVcxV0JhQ3N1RjR5UlZ3RmUybGdYR2NLRmR6RnBINDExVEdyNzZTbVYxSUVBeENNK2lSK1QrMUo2UGFwbXloWDJDVldwaVhFb2FDSENhNnpIaUhQUEFnY1oyUmFOaFZEcFA4Y1hReUhUUHRaNGNEOUVtanJFY1RyRUxyNkttK1ZjYjRoOTQvOWhBNmJMT1k3N1FxNDRSZzJHL3g0WGprcWxsT3lXSG1raytwR2R2ZmljczkxSE1yU0pIQWRrd0ZLZjBYZVFLREJxcFQ2YkduTlZ5RFRmK0NUY2Z5VGNrTjMzRExxcUQ0dU5SczFJV0dUUllxSkxjbjIrMkJrVUhiQ3pueHNtYUNVQVA2MVdvenFyOWs2VDBPdVhFMUZuVUtwS2JPSHBjWTUxZm52Ty96OGdUZ0FWSVpjZXBhS2xKaFl1dGp1NmhrbVA2TEM0a09uSmxvTFlUKytzenFoYVF1Sk1rcHhkcldOcnFzaSswTFQ4bXlhKzRmTXM3N1c3alY2RzEzbEY1aXlzL1VIQTlQTllScS9CMFJBL2lDVU5MNTlZQkxINjhoOXVjSzlJaWlVQkkxZmdzTGJVaTQxUmRmYU9jZnppYWZNRk5FVjBTNE9taXVoZ2RnZjVJU2txK1JEbFRqVURDQ0wyc2V1N1BHcWVYNzQyTjc5NHpqeHBaK1poR1JxUmhvYXJPSWRXMDFTbmR1QVZINzVGcUdXVXBXWEFwa2tQcXNLeXA0Ymh2MUtQWGE5djJxSjdIaHFiRTdCM3NpS0EvVjhKMkRnQUpsZXVmNDhxZDRsTjYrRnJBME5qOGVNdHJKTG81REJYOUVxYVhCTWNQODRBL0xzTkZ6eU9pb0RWN3FTMk5KWlUwekhIakVQZWFOSVp3U3hSdDMyclNCbGNtM1pIdjhHWGdZNUZSVFFua1ppcWd3enI0WUxlQmFEeTNQbHZlR1RnT1gzMUN5OVJYVmZlSEdYN21HTTJxeHBhcGFBN3Q4SXB2NVZMMFJTdThuNUJmQ29ESDlDdUZad2twQnpoaHVMQ2NZUGpCeVdOWUc3bHJUV1cyVmlBemxwcVFMRjFkaHUyUnN4MFFmL2gvZHVaNVZMQ2Qxb2dhM0dNM0ZIRUNiYjIrT3NzYmw5V21aZGJvdTROV2orbG5KRHNHNkg0MGNtdjZxUk56bTI3azVQVElWZ2kxU1VZTWdBbE5CNFViR1FybEJnb0Z1enREV1lYcWNWVVQ1Q3puY0RQcmF0OE1Dd0lsMk1Ec0ZERmJsZzA5NHo0U1VRTXppdVJYMGgwOHpIcmp2TGdmbkd6NHJQTUREYmlUekU2Q3dXQTJLeGEzZEZyMTRXNXNjOWo1OW5UNUdhWUZIeVIzMWtNQlV5TVBCVldhV0NuWEVlZytLOThQM3hiSmpTcVNzM1lsbFJSaFVmOEhmMVVvNTVoQ3E3cmJURWI0ZERzRmI4Sy9pRmFpdXRPclZMZDErOU96R0xvNm4wN1l0NTFPcmo1ZUFldEVGOEtqZGlTRThySk9HRkh0TDgvUEhxeXdRNUtNR0RwRmJvMjNXUDY2WkVISXdabmc0c2F5ME1NelRmcm1ma09IYkRsb1JhVHRZdGdxankxNG4yNGtTaXhYZmtHd2VSWDJiWTV4VFZPWUw0VlV3c05GanhZTVRvZEcvdGdIMU9UQjFTd2szRFNYam9weHRmV0dqei8xZkF2WW9DOU10ZWZqZC9sTDVsdXNVaHJ2MS9WbGpoWTdpMlFPdzdZdVhDd1ExRms1cW4xNERZcG8xYjFUa0l2STBsTGNiVzZKV00rRkxFUGtyaGZVZjlxRkhkS3JtdWRCMFBZNGVpUFYrMk5ka0x1dDdNciswMlBvcVB3SUdTQVpncFlpZXBVWHhzdkhSU0RkZEdveW5hUDFhR2JUZSs3MWt0RTN3d2xkREZ5SWtXQlpFQldCUmhMTzJ4THJTNDZmZG4xTzFBdWd3dGlJMXdGTG1ibVlTb3VxZWkreUo3bmFxREtnNnlFMFpxWEppYUpaaDg0S1ZqZ21yYUE5SERzem9UQndiNGloNFBXeTVyV0o3eUl3a3UvSHJxYTR0cG5BWjVscUdrMW5FSWtkQXJGVGk3TFJnTC9GK2M1VVp4dS9ldm5uNFVSdGtZY2tsVmRaM2ZMS1owekVnVi94SzFCajhYcjB5a1dwdkhOcC9PWHk5RnV3ZHhtb2t4c3Y5ZTkwNHZFeWtQUU1FT0R6T2J0a2tETGx3Y2ZiU0VlcXFmb1crbUZVSElhdG5STFVBSkQvc0NCSTN2ZithWXY1WGpsVWsvUG5qN0ZhY1FSNUNMZFlsc1loL1YyVjUwejBSV3d1SW9nakY4ekxVWk5EOUpRUThXSmtodXpQY005bWEvTUtiUzZvTll2WDBzU0ZIL0llYnN1a1MyaGVaSE14SGlDNkZ0UmlRUy9tYURVUkNMMGpMQjc5WXF4dm5NTGYzcHFIeXpVa3o0Sll6blhOb0w3ZjVRdkFvYjJVbVY3ZTlyMWFmNlgyMndMNmFINkJGT3ZOUFpIUWFBdWVVYzdSdDlWeEIyalcwakI5TmZQakdqR3owSEFCdklpc0t0cThNSllmQWNsSUJLTjVpeDFINGJibGR4NnFodC9Dc2hJdUlGWEZsWnRxZnMwOHduVWRkMzVZbHNoQ3ZUNktBcVRzWEpncEkwdVQ1azFkY0J4a0Z6TWlhbGJVWWFJU28yZzVEWTVPN2tkTUpkWXVQaXVtSzRpR2VsMUMxU0dxeFRtaVNIdGh5bjdJc0o1YVZOMjdZNE44SkRiN0NDVCtVQ0c2RW5iWmswVXh6aWhwaVZiV25KbU9mMnNMVGxIUTM5VWVyekhrKzFheDgyUXYwUUlOKzIza2JxSVdXWXY4SmpGRkprcndaT3IwWGhFWENUM3I2RnNDWUhVOTFwdVZIbkpCNFhBUXZPZlljdU4weXUzREpBODRJUDRqRFh2MnV6RjY3WVF1aHVFYUlvVlYrRWtCaHRHazVzZlZWN0pZNGdQWE8zSkY5c3JSMFdtVTdGMkxoTjQyVG5sRkRkVGNrR29YSlN4RXV2SEdKRkN5QmkzK1YxYWVBQmhQRS9Wbzc2VVpsZ2lhaUd5ampQSTcyM0xYWlc2QkU1NmcvcUFlZ3NESFM2RmlRQjdrdXRVM0FpNVlISElTV0I5QlBiUUUwYXNVZEd3QkJ0MDlXbS9KZEY2dnp6dTJwUlpPbXVIRGczYUZXQXR4TThUN1pLaWlpc1NSdlpSYlR4T0N4TmYwZTdHUEpRU2pQT0RtU3BzYmhSbE5IdjQzNEVHcUc0M1VGSWpabExVUi92TjIrbUk5RVF0K0NRaTgvQ2xBMnZrdzZjUzJPc3FxTlJ5ejB4OHJCOGdrY3ZuOTg4WGIzaENUVGZwSmI5bGFTVzJNby9JOHJTOWJaVTdOa2NZL1htaWkzcFUyb0xuUFdYWmhKa25CMzR0cWtSUS9QeFdTVzdXU21hQWVKN0o2VnBxbmxhdWpyUlZSemRLOXcyL1ZuZGo2M3huZlhFZWIyZ3Nwb3lHWVZaV2wzTTh2OUVCS2ZZUGRuY3BNTlUvd1BMc25yUzE1VWNlRGZ2TzU1bFI4NmNHVUQxZVRhSEZCSXhPYmlNeWU2dmtqd3NISXl6bVovZlBxNldwT2pZZk5Ec0VDeWFsMTk2dWxQUVM5RXMwSmw3b25LSDZRdm1maUhpWkNWZDl5b0xHa3JiODE5SnIzVEhzOUV5UDZhdTZYbXZlRm10SkgvUEwxM0hwNURkTlgwdFJ6aTNZTXJmVzJ2TUVRYnBhYm1WUVdvRkdBeUYxZWdGMFJrRitqNGtzdWNGL0dHQ0JNb2NVTm5ldVdNY1ViYytGWnM3Rm9OUXN4VzNYVDEyMUJoOURtMkNwdHBSU1lmWlF4WWN4MFJIREx2VEhiMWZCU2NVZE03TGJLU0ZUMkpiZVMzZGtPNlBnQ1B4MEJ4RG1EcXZmZTVNbTVjKzlqV2pZOXpSWS8xOW1OUkY2SmRDSFlKd2lNL2UwU1NoZCtQdDhYWVRqZXhRSGVrd1hzcXhKaENxdG9Fand4cWVLRFN0RHAvbjI3VThVeEErQkhZeGRFejE2bEloVXZCeHNYU0JDT0lLLzJqaVFOdHFQcjZTaW4yWitramh1OGo2aW9UaUNGOVdhaWVxMk9WUWM1cHlMRWovRUFCZDdrQWRJWFZzRVdybVhEeEJNOVZTaEYrZ2JiNGh0Nm1lVUJ5d2I3STRMQzNOSFQ0MXZKb1VKRElaSUxRMFdBTTJTaVJ5WDZId3NzZDc2U1V3c0dIMmgzbzdhMUhEWk4xdE1pb2NzTmRtYnVHK1NocUVLWkRYNGcxMzRicEpUYUlaY0l4c1FjQnlvbGdNc3k3TzcwWmZZQU1RQkpicGU2aEJJOHJFcjJLOXp0bm1SeDBVVUNCWmdKdmFVSXgzWFdJL0pNRWlWdXF2UUNlSU5EeFFtN1B5SVQzZzZ6SnJST3ljVWlzUjFxRXgyeVpFNktmNENOaWpRZHNHVis1VjZRclRVWTRLNlNIMmc5VDdqTTlYUW5qU1Z6VDRFdFB4M292N1UvZmg0allOend1VU5zTHBBRnBmMVZlT2lEUTlPQTM1VWh3T0JPdGFtVFpuZHAxWWZXaERzMmxoRk1NUmVXZGU3UFZrU2w4dk1vcnNQcDBOYTJhdEVielV1a0d4bUlVd0FGU0pVUTVFYy9na1pHUG9FQTByV2RMS1NRb0p3OXBneFowd1MrU3AxQ21wOUkzbzU5aWJ3Yzl5amJueGVJenFhV0REU0x4TU9UU2ltbThaR25vcUpiWk80U241ZzZJVEwrbVNidlE4NkxkMUZkZWVvZlhYa29tNlNGcEEycmd1WDdRQVlXNzdITU1WTWtGMGZ0L1hKRVdqNmk1NWw2MDBTNGpjOXdsZmlaTkFCU014NkhtbjdsSU5tZDBvNDhXUWNBcFkxRmNLU21tQ2FHZ3RxN0toRlpSYkJGN1MzVzNsQzRTcEF5blVqUFBnaFY1U0ZjUW9KTGk0NllMRnlud01RckpNVGNmNEVSWFEvMFVTalJ5ZDNQR3RmYzdGNFI1azM0dGxsMUlmM1BNeFA0Yy9zTXN5SVFHZkduWmtOTFJ3ZjBxQzdsV0t0SnpmNzFlWWJ5dHBSaUpaK1BVL1pEdG1ETlZQTy9qeEZEbDZXVm9ZMC9ad2I2NnMwQzF5RHBzODA3dGR4dnZYYnZuYmhxa3VBZkFOa0c4K2RmeHdBNitYV2VaSWZzODdIbHJkM0MycktJN05lRTErQWZldkRQVVhBMERJQjBuZktwWER5WkM3YThSUVNFcUxqZjhvQ3FQUzJpalhBVHEzaUI5OUNGanhVcCs1cUh0ZjJnTUdCanFiN2pLQ1hCT2VVY2N6TlIrUzBPdXVpU3NaYWowS1VUZ2dGdjdLZFRoRUxyWHRZZldGV2lwNTJ6Ly9GazU3dXUrOVRITDBKWmRReEx0alZpaXZESi9hYUIvNnZKZTV5Qzc0NUZoc2xJS0V5MEVBUjdHL2Q2N2F0bU5KWUlHRGVzSXZhNFhFellpazhBL2MyVGVFbTRwQTBsdUdPelpuTjFaL0pzU0x5SDZvYlZobkdjTmVtMUFUVlgwd0V6SytDektlcHlPZkNHcFdDV0FIWkRuRkh3MzZObUFnZGFwYncybTVscFR2MmQ4SWpPVDZYczVNZk5LK3pyajR5NG03TWk5ditiTVo0NUJIRFJubHNKaHRjUlZFVEZRbUhFRmhMdlhOTllhTWs0anZITGowUFNDWUNVTVZpWkEweUJMS2hnVEhxa3F3N2JOWi9DdHErWjlGMDBGbUlacjBmTk5pa1BiSURrZUNEYVRTL2JETXFLWVFnUG9uUWczQm9lSFpyNHNGamZTN1VHSUN0cXVhd3ArMTg0US8rNEJKWkJpTSttVFkwdkNlbFYrOXdrY1NJTnNCMUdDNmlXUWM2Wm5Ra0o4SWlIZDY3UDcvZGY0bVVmeXkvWnNyS1ZSNThlNjZGandmUFViVWRiWjFJaWVsUnhpZGRFYjFHazdhcXVMZEJLNzV0RTRJSzczaWZtbXRsc3RxUElKcmZtcnVvSk5mRndqS2dhOFRqd2liT1V3cjJIUk5uVlZ2S0dpb3Rldnhhc3JZU0QwSVM0NExzWThWK0JCckNYZDM2UkpwQzNGZkpEWjVPNE5Bd0k3U2NtQ0M0ejlJck0vZWN0RTBHdkRsK08vRW1OYU4yOWF1bVJZdXdZQVF3VlFPc1AzemNPMFFpVGFadFROUUJHdjRYQUNaREhMZFJibnZRb0RCdHpOVmhsdlBuSWZ3ek5UMGFXbmJ5Mi9uQ2d0ODZMeGMxR3VaUVZWa2pyWFFKdm4vV3lvTGdjd3hWeXRGNVovSWtjcnEwbXdzRUMvTGxINFpsTlBqVWpuaFMwL0xnNnZzRW4xbWg5azRENnRlN0lFVnY4eVJONWF4bSs3SlJLK1BGRDZrR1prWFdBcEhYN0tFb0t4cHlGOGY0czZxajhnT08raUhpcEExTU9aL2NYblk1VEJCYTYxL09rQXlXNTJYQXd4Tml3ODJub2twVWFGTDlEd241T2JBZW1SQzM5NWVmZlh6NVBjeGdySlVsL29rbE45ZlhIdEd6RFVMRVJta3NhZXNnWW9yazZCbkVpNHlCMW5GTXFGeDlBVnQ3dHhvbnVLNFN1NEVnYTJaZkEvOVZvY2JLL0JLTlJYRjAzdzlXaVpheFJtZ3pXbE5xSWhLNXh6QVcxWFdLdXpzUXVucDYvVitCUzZRQ3pJMjlGN3Y2SDdzWFJyVy9PK2dpcmlHUGdSK01OQldDZFNSVThuUFIzK1hFdjR3dENEVjBmVEdweHVIWjF0N2hKelNKSWdiblNQTzhXWmx6YzlsMXBpRnl2UlI1SFpMek5GOXdzWXRENDJucDF2SlNnakh3U3hTZy9VK1BxR21qSlh3cFM1Y2dGUE5PT253YTl2OUhxbU01V3RwUWphSnVVYkZ3dmVQSnB2WFRtQjIrMW81aWpPd0djLzhWSko5cjZyRVpoNHJzRkxpaGxNY04zOTZuTXphcEZib3padnUvektQK0VzMlVhcmNRVG1EbjNEM2FTS01HWGVXcTBkZU9OMUoxa1d0MWFXRis0R3VFbFduWHV4Y3NOOWI1QmhaWkV0ekVDakVWZ0ZMdm9Hc1hqUnNpTXNxNlBGZVJVY0Y4aWRTOHU5WWRaUnJMSnhLaWRUV21SUVk4NWgxZXNzdS9UYmVxTUQ3anpLL2tzTHNNS3JRRXRBeWthNVB4YlR3RllBb1o1RWRXZVdEN25tVUFveG92VFlweWRYYmZxUWJGM0ExdnRCYkkvelY1VU4vdHRtTjM4dlBIb3ZkdlEwYjl5NzJEWDRiS3VMMHN2TllPbXhraW1mcGdIeEJlRGV6bC84aFMvZEZkcVN1cUdNTGhEYVE5T29Ob3djdWVBVGd2Q0lBRjlRbkNTbWE0UVFEWkRiY2U5TGdMVE40ZW1USmlKOGtEQ3hxQjZrM3k5NHhvUGxmSlJ6SFNCWitVeFhkT3lkbUdZZGV6RytXZGkvUlBVdTJibEN2TUp6ZUs3WFJCcW9JbGVQTmcxeGFkTDJGSWlHSnp4anFJdmtKdGlFbVpwU2tPdWtPZkF2ZUM0WTZQQ0VacmFpSE1WL1RSZ1JsRGMycm5UenZtWEJabC9LZ0NBNFhYN2xBS3NVWVI4bVc4UzNScFB5V3RFSU1QRGZNWjlXU2dkZFA3RUFGME93YUdjZ2ZvSVJ1bEU0OHdKdlhSZkY0Y0dwUHhXcS9hQ25HdmxzeTAzMUpLQTdYb2IyMDNLMmFlVWlrbXFOZUo4QThOUjdhTEtnc2VkSENZQm5CUEFFR0IwQUN1TGtxKzdRUUNvNER0RkRlNVJBeVdoOUcyeW44eEZ5dzk1RXBDcDR6RmMvbStlYUE5QkU3OGVYbzB2UTlhZ0hSbjN0OE1iRmZCUVpXT1RNNWpJdmw2bUZIUHIydEQ3c0Q5OSttTjhoS2NKVGViTlF3eTYvYWRMcnRCREswV01aV2ZZdUp2SmFDOWRLNmRGdWVMV2pjTU1FTWYyV1o1OHZqRU5xRFNLc01wYWVnYWNSVGQ4dHNXc001T1hLUkZIR3NwWXdWTjlKaEpIOFV1bzkrODVGeEZDV01oVGdaTG9KaG8yU2ZZczhlQ3ovemNWRnBKNFNDdUlGZXh2NlBlT29MVjIrdHh6bjNYWDgyR3hzZmovODdMbU9iZmNZOVFKa0tXcisxS3dBZ3diTHMxTmVLNFk0eEVIb3BXS2wrT0VOUFB3czBpdWdwSmNSaHVjZ2pzV25WV2tYQUJhNWZxUHFtT0xMNi9sZVpVSHRNNmx6SGk1TnI2d01pU292S3pkS3l0cFNnWTVHdmFLeDR6UnpUMStqdnZ6SVBiZCtMVW84WUdDR0dHUGhqYXJFdkZONU9GK2taSHEvd2Q5MHl1Z3hOdmdMNFVDK29XdjhOQVRrZW9qem96czVMRHZFWWNuZlhlZ2JmVzNCRUt3NjJmUHhjcGVRZ1MrY3ZLMDdmQ3hDanh2a3VoRXB2SGVkZnFOZ3RpR1hnTFVhandhUmhvbkh2RDdMbDF0TVlqUUdPdGcwdzQ2blJHbVJhRE15bFNTRmdsQ2VZUytZTkV1ejNac0x2dlRNczVNdHNvaFJvNGlscE9GSkh2cTlkY2pYbXZ3c2RPek5ZUlJJVndJcUNVN1AwRnNyaVp0SzF2c1YySWRhSmpNNnRheDFkc0ZUenY1cG5HWk1WNnpLSTg1WVR3K1lYOGVMRWxFSnhRM0k5YVplTmxqdGc0dmpJcmFYOWdEa3RKTXVnY1dkZUl0RXQ3alNRMFl2YUswQVBGSGZvbVhhNWlJRUQvRFpUKzluMzR3RGhTS3J2eUhERFhiVmVLTkdVcEdUb1EyTk1qTmxnZ3BjcDExRWsxWXg2Qzk2MTdyODcvcEpadG5SZzBTTmZZeG9LZU1JWjQxa0pPakFxOXBvWEc5am5WdEJveGY5LzRYSkx0VVR2TEhQdnhHT3Zwc0dkdVZuMEFNQWdVMXg2aTlmWHN1em9CWjRleEozcFd3MktmWU4zcVpqYk80M1ljN1RnN1Nvalh1TWJrYjRabkJIdFZVNjU5YnZDdFVqZ0xPRkFZbWtHTExidnVBZzBJNWo1ZjdyRU1odnZ4cWpkRkhZeUtwdHk5djFyeXpIbklLRjVsUmJsTTRkNjA5RTNNUWJ5Q2tiK2ZiWkxvN3pxYU5lWVBGWW9PT3N1dGhvaEJETEFwRUI5ZmJhZGQxNWgrK0hER2c3aVE5RlFFMGlmRlYxZVNQNUV6TUpVTWlzdndnR3ZMOTVuZUdiTDdxWDd3Uk94VzVtM3djSzNwdE5OZGZHZmpUTHpUN21JQ3RYcHFBMjF5eTAwcm10Yjh3blgvUWhTYk1BeEEra3VqOTFveHNpdU5rV0l1OFJscHk0bDZCSjFYVGlSdndHdms4aUZpRHIxd1l4MDVTQTlES3MzeXB3OXprYi9jOURVUnFvcGN1dTZUMmNTYTVqbEcxQW9iNFQwMi9XQm5uYWRML0JVc2hOTWNBZHhxNGhiWktRRXNEaDV0a3hURldUWkZKYnpYazVkZi85U05lOWsvVkhPQWFEM2E1UmFqcjJ4bkpHUmtoZnBEZW1pRnZ5SDJmRHJPT3J6eUU3T3YzUTZobTRJS3VKcHdVckxuMVF3cWQ3Q0FSdk1ySnA5QldMZHZhSGYvVkN5OTZxUlNhUTkxL3dUQ1ZzNkR5bFpJUXN1NkI0U2RwbGMyTjVUc3NxRGtGa1hONVFkUWZiZTN6R1Z1MnR1Q0h1T1FXeHhhMVpxNTNnWWI5VDJ0ck8zdWFuZEhmUE5oYlN0VlVjUlRwQnNTcXpnTGRrdjJEZUVyTjhBQzRiK1VDSkJmQVB0Sk5GV2M1YXNQMVk3NVZjVXBqcTZoMVlFc0ZhSHZZZGFoQ2Vnd1VYS05VR1NUUmRPb2NhRVhwdDA0b2xJZnRYVG0rYjFsRHU3SENrOWU1clhqVHY0LzA1MWJ5V3NISkxoOE9NcWxoL0QyZzVxUWxLemJIc0wrRmJhUElsczVlLzJLb2pFY1lNb1pDKzA1eHN0cUtjd0hLYlRQOWN4NjJHZTN1VURaT3o2Q0tUYmM0RWJqVU10bkRCUnIvUXVIM3pyb3JWWUdVckN3WnhsMnlDdFE1enpTOEpROTNZUkZCT0FpOXZTaHJpVGJQODlRUS9jRUd2QmtGL1h3ZkNuNitDNnRnRzdWTzJIQmphaDZaVEJaTSs1L2RuUTk1QUZ2NEs2cHN5OVFwMFgwQkF1amkvNjV4bGdWWEZ4QVFxUlNaNjdONlBBVmdpdUJDU2RxamlwVnpRaTVVcmUyZnpEcklMQlYvNDhFOTYvaFNZOWp2UVQxdmxZY0ZvUkQxTUJSRmJJRm55M1M2S3Fic3kyVFZTb29jMEZtT1lOSkU5SzEzNmwxdUYzQnhoamFJOS9paUF0NFdEMWlFZHhDa1Z6cEdlYVp0UmNLNFhmcEdCYldhNkNKRHYxVWp1TmhUTy9TWTlSd25FTTVaK0JyZy8xeVRaOHpMN09Oc1dheGEvbUVpVC9VbkVlNmloQmpBVEZFYmY3Qzl3SjhnSjZSb3F2ektnTFA3MHIyd1FDdUE3cGo4NnhpNTYxTitNekJxN0ZmeDdpUWhHcmJnTXdrbzVROTdCOGl4eVJkbnBiYmY4NW5JWkZTM3dQRzFBU1pPYlhFcmJwWC9uRVNmNjZwZGRhdFhmU0RqMjRCSm8xRmNSazcySjlEK0lnK0dsemNkcEozSytmVkxLUnZLaUgyZnA5ZG5ZU3laQUN3U3RtUzhXNXJJWnptWlJUb29nZkYydUtjbzgyS1pZTjZFUVB0QkY3OXZGR01NT3FOSEhUSjNqSVBEeUpLM2VqVDRXcnF3Y1FoZjVxTEFlanh5cFJNdU96emcrUi8zVWpaTUxsWU5idUZwQW9DWFVvdUJOVlA0bm1RVlpTUkJzN0JyTXNLTXp0cWFaYUVNM1dVSTE5MjRqMG1NN0tzaWNaaVBMVzBmazF4cTFlU0sxbHF3RHpGN3RtT2V1K2VrTVFwTFhiWXlpc29JdHpLSXBybG0zTy94N0JTL01xQXRDZnV4cWJpVlQ5aXdUTFcxUlE4SGFiWFgrTkoraWp5T21pb1Rqb09JbExZZ2U2MFhPM21KNVRibTFTdGRRdFN3Qk1rclpJOHFGeERZRXRGSlAzR05SeDZlK0haOFI4d3QzYm0xYUlIR0xOanFzamtKemZyOW9ObktkWnZxdkRaTWRaZEQwR1dSM2NOeE1oM0pBNzdnQWQ1Vmw5NmhlbXFiTHBiSHNlM1RRenZuOVZRUHdsYldDZGxKdTJacFZxSFl3QTY2TjlEZE1KelBGbE1TdTFQVmxTRVpTT0VST0hRcmgrZWo2U2pCeGpDbW1oL2lEbjdjSFMwekNJK0NDUlhnWURIMkEreHJvNXFWQVZyMW1iRWM1S2d0ci9VcHBXSDVsM0R4cm5NbEhsc2l6SUtZcmg3eWZsL3BZWGU0dCtGQUpLMHNSNzNHUEdseHRNaDRpTUFnTHBFcFVmeDNtZFNVQjRqNjJlTDVUV0E3VUhkOStUck5tQWxNTGI4ZE4wSjN6ZmU4NDY2S0psc05veFBsdDg3MlBRU1hQM1phQUtDcHNpZzRYRXNJdHRkMStrNEY1RW44ZTZBUnVVVU1DUmFFY3pNOThVNmRGeWVvQmZFWnBOY0VTOEJrQ0l6b3FNRDdwL1lpcGFkdXJGaEcxNEh4eG1VbE1rOFJrUlB1TkVwWitMMjZTK1hRd2ZBNEoyVTBweXN3M3htOG5IZDJ4L25JZUNMNTFwakplVDltNUFnMTlESytpOTZXTy9LbXNxMnh1WWV0K01RSmRuN1ZRUm11Qjl4T0Uvcll3Rkp1V3RUUkVnYmJjdnlXVXBXNlo1UlNxZC9PR1o3V1IrbUkyVTV4SlZlSDJKYk84RU9iTnB0UkYyNHRqWVV3eVBpck41OHVQZWZZa2ZUN2ZJWStIZko0anRGNE9Ec2hmTEwxelM2elBSUHdoZzZrNFNLQy9VbmdINXVjWXpjTE8waDNpUlFJNzJjRGRsd0dNckZ3QjhUTk55akpERkVtbmw5WFJkbnVXT2kwYTc1b2dRSUlGN1hleDN0U0tUZWNtR2owVERNaGpXQkJIOUdPazh6UzZ6K3JCUlFRMVh1NlJ6SW5heWdmckI5TlEzd01FdUNsVWFpTi9ralFraVJEeGducEN6a1hpdHVFL2lXVVR5QmJEdUhTdm5JSElybG8wT2NFVVB4UWtON05HMWY3dGFZMEJ0bnpTNy9DaXIzd0ZQUkNPR0NiMzg2bWlqcGsxcG4wRzk5b0N0eFAxUGpsa2RTNnh4NDhJWVRQSm84OXppV2k0VTQxU3lUQlNDTTc3L2RRd0NwdDAwaEVQOFQ1Nmw3aURjK3QzRWRSMndUUFpUdmRCWEpJeXJwbDVCNW0xcm5qRktEeTFQaTdIcEczTndueGRhcWhISlpyK0NweTJlM0tERVJ1ci9lQ0dQdkFYSHZ5QW83Tyt5OHlsYTRZeklleWNaUG9HWG9TeGdQNkZ3dWtGN1NacmUxYlM1VjdnOEt1aWNwRTNzSWZhZ2JZSi9CcmxQMStkNEJJdlZ6N2QxdmErOWRhU1BFY2VvTWpUT01Da09Xd0NISURYUlpXL1dkOEV3cGR6cTk1cG5KaGR6MFpoWnlGcmlaU0VzVUxKUFduV3hQM2NlaGk2RDFnQ1R6RkpvdlBpRHBsbVZ6L2Rna2lEVmlXV1k0WHovRnFLdGNnQ3BtTnp5bStweHRzTWcrSUNvTm9UMjFjWVR2YXROZ2VmZkMvMGhPY1l1SWFyMzRZYUZ5V2lJTG1PSGFIVDNwcHpjTVhHcEp6Y1JNQzkySmZHcHJoSmgxbGM4dXRUNjkrYmtYRDFtc0Z3VDdtRmQvUSsyZ2ZpZldTbGNXTkxlbyt3eVN1cFV4dDZpNHIyTlNEWVdHWDNxVnQ3eStJRXRQWExiblZjTXBhdUZGMW9YTXZ2Qmg1S1NHUUdab3Z0QmRzUGNab3VnZm5VOFBWdi9QSUcwUnRscXZ2TXZQYm9PcXBEZlJZUGZLTjh1S3VOek5UUERkZmdwbVhsaW1NTEpkcUtERDVrOWF1Z2VxUGlld2QxTG40dlE1VmIvWXNsQ2VvSmp5M2VCT2tNSDRHcEhVc2dmTElZTjIycUM1VVlRNjhtanIyK1RBam5FamFUbzhYaTBYMnJnTHlEUFhKNkYrUHhxWDRnUDVUaDYrS1NSa1RqdDNpaUVXUm81YVBocm1EcWJHUis5Z1M4Z3RubHVVeUZZczBZeTUrYmUvbCtoQTZOWm5sY3djWWFDeWxXY21LMTBmQ3lzNEVlN2Z6M3lIelVQYzNzUm1MNVc4MzRTdnI2dUU4aDZZWkljZE5DQTdiY3N3YndFcmpib09abzRoZXByQjkvZ3p1bXZrMTJacVd5VGE4Y05IZVlodVdXNUdSNVFqM25DbFAxMEJNeTFOV214RUhOOC9JTUVOMkhBeHVHOThiOHFmbTNabnBsL0JuZUlaeDdYYUxPTndwMmF3TTNtUUNPdXlQZVArZEdmUWZvcGZmazkvTlZHQ0F2NXBJU3pXZ0hpYVRyNEduVXVTTmR6Y1d5SCtOUE5DYlI0dkcwRDVHNDZxSzhPWEc1dGZiUFVmcElHS0sxRksxK3ZiOXlHWkRmRUl6azNLVlpOWVJPaWEvb0JMT05RREsyNC8wVGZlMHU0dy9sMGw1V2lpTlVyUGxpL2U3SmYwQXhKUjJNQk1YckZNcDg1bnEzRUFnRlo1MzlCWEdVTGtMYTFRc3RjRDc4YnBsQ1NkQm1SeXJEL1N4UVZKTUpxMGJvRjVSbUVCck1GN0RHUmNiTzhacDlMbDNSQmlIeTg4S0VnVDkvdDAyM1c5TzBMNk5NMXBNeFd3VVN3MnN2ZGdjbVUrQW10R1B4S3ZkVnRjeDFHMlIwS2JVaHprbGNIZnZTSXZia1ltcTlYZFFWMVdOT2ZDRVU1Vmx1N0gvTjFxREo4SXRhL3NOSlgvcFNUenhvSWtMMHdIV3VmYUIxZFRUbnNCalFva0JjVlUyT3MwU3NnbW9GVnlJZUlxckpYVWxYL0d0UWIxdHBNVVE5ajVobmJVS0Q4bThCQ2M4akREcS9VM1hpSTk5VFkxMWxFYXErUjJwMit0OFVDRTZTZktkWUZhbjhvd3RndlJzOWtjRkdIbXJXVi9Xd3RxaEQxY3lxTW1DS2hTNmZtT3VCbkNFeS9ZRkI5RUVFcDZuZmpuM3Z3OXNPVTREUEJsRUNSWlNWZkFqV0lUK04wQmNpZ29renNKc21DdVB0MExZUFVwWWRmV3dJcENoU2ZvbFZEYm0yTDVRa1cyMmYxRFYwMklvT3R6cHViTFpHLzBPT0xENmxJT2pwWG1qLzZpV0xTeDFQeWdCNUNFS285aSsvU0lia2F6VGhOeDZaNWQ1b2d2UTFjUlZPZFlIMmI4RXRJM2R2WXpXSEdyM0Zpb3FjdE4rUTVUWkZicDh2TnN4eko1UURUeDVzUXFOMVlOOW9XUjlYV3VXUTRXMk9XaFI0UEtjblVuZkM2NXZtY3h5SmdMRXRXYjZrUXhOK0xYZTZ2SXBxdUVLVVpJR1ZRdVRuSk8ycWxNaXFoZXliN2RZNDduTlBUVzFRUTBTTGVwRnZGN0g4ZlBsSzhYQ21DVFdlQk01ZUREbi9MMXZwVVNhbWRFLzhVRVVhV2lzdHZYZExxSXR3Y3QrS09YY2NyWkZUL0hYZExNWnJBN1gyMmRmOXk3czB3QlpORnBOcEVabEh0VUxnUUV1b05reTh4YkNLT0Y5Z0lSdTRVbGw5RlVmRDduc3lTT2RxYUpQT1U2VGN6SVpTT0NlOHpWSjVwbldGbWk5MVp1b2k3VmRzZXFoOXVaNjZ6b0xuNmdCVUgrYTRXS0dHaVZYZ25CUVRwUHhiWjB1WElxTWtGS2lkTERqcktZMm1HL0NXV1hrT21BUDQ5dWcrYnd4OUtBdjhsTi83NzRUUmlYMWZDUFpzcXZPUVhuaDNxMVFnWmhIbVNBN3AzanpNU2d6ZnhkZDFKTURFRlJyZVh0V1AxeEYvUCtObXl5Tm1oc1hsSE5TMVBWV3RuZzhLam1TazNiWG5yZGthR0tqa3FUMUVSL2FBb05IWjlQb2RxSE5yem5jdkVOK2s0MGtOWnY4WTVjRmo0Q3ArK2NVYzdLQTRYbTZGWmp2RlBTemJDVlNlcDU2M3pwOG9iQ3Y2cklscnp2eEZVNWFXbVZKaER6RnBXUlM1aURoSUhVa1oxL3dRM2JrSnVDR2kzZkF3UHh6UnBXS3dQd2ZneW93VTJyaGFXRE9sSmF2SHZkT0pibUw3L05UbXo2blpzN0tOalNJR1dEQUI5TXUwTExpblYxYmJWRlhBQnJxQmtreU10TVZ3SDRKZHhDdU9lT2ZFL2pZc1RPRzRaRktZNFl4SmdnNjlaeTMzNzNxTm1kQzRORm9PQlJ2OXRMREtKUlZaMFVQNElGb3FaeUxrZ2FaOElUNWk2dzVuSXdVMXJGdmNTaEhlWktLTk9Cc3JIbW1ad0lTUktXV1FzWXFMVytmdkRZVEFEQ0I3N0gvb001a0h0ZVlUTzE4cnY1c21pSkZPZnAyUWhubG9LOXV5RVpuem9TZ0JZZjRNRXRUK1h6VmkwWU9uZ2ovYSt0VzdDU1c4TUhBVCtrTmRxRVJOK1JiWFNENkk2SzI4K1l2TWRmZUJFVFFuMmJwaEZrL0NrMDZUd1QrQ0l2ZjhRa2poTEZaZkZESG1GOTE5U2d2VHdONnhzdDlEUDBMTk9WZFE1VzJLcUxNb296MUNjU0c5d2xVdUoxcWJUTkhZRmtHTGVYQkRQZUIzanNhS2NDMW12Z1RqamcyTTNZNUlObkwrUzMvZE1QSXVmeGhScUVMRTZpVENYZ2xKTVpUdnpaYy96cVpwenZnU3JGUWcvR1Bka1V4c3dpeGk1OTc3bjRyK3dZWlBPeGVDSEI5VENnalk4SkxUbXBXaEx4ZHRmcFdCYTVLOWRTejZjOTJNVVRod0QvQTNpVjd4VW5xTDBlaWF3eEExVzdIZVJGWngzUzZ0V3MyZnFoUEgrdmFEanJzZ285c2Z5WGhLZnpsdmlBb1BoK1lqWFpTbTJKZU0rTUFJVS9VdGcwSitMZHhoZnhTZ2tvSjNKUEI5d2RlN3k3K2hKY2xnN2hKNjVLOVVhdzRPcEVET3lWWkF5OUdXVm1ITi9qVVh1K2ZRU3hhdVpVOGQrN2Zxd0RhTlFHNzZiZzNhVEdVTGI1Nnd6QTIzUllvYjZoNlRGYU5aK0JtVEFtK1RjWk9BMVNVNEgzU1dvMkcwbk10SGtGaXZWYStxdThVUU9FV1o4RDdHQ0t5emNZTG9ueUpTYk5BbWRrK0REN0RXTURYNzA4WE8zQlhsM2Y4R084aVhxd29Mci9Da01MMml1MFpVZUhzQ2hOSWZJUndYRlluRlRGSzU0Z3NZWC9kR2lIbzRsTHVNeGVDdTNZTkdvOFdpYUhOV3l2aFZjaVdvanVxYVowNmg2M1Foam13c3lkZmhFRGxkdWtKOFZnYXA3VmVVdjJBSVI3NjlseVFVQ2hkMnZ3WElreTYvTDArTU5GQWdydml2QlV6TWYyUE9pU01mdHV4TG93dndPLzFBcFo0bGx6c0s5dzRqMmRDWUZWRmkxVzFKMHBUYUJHNDdLK0lGTUZ5TTkremd1dVhHK0JBempVRFBsV29NejlDYTF0blY5RjFRVjVhd1B5ZEluSEdZNDdSbEFzSDlZT1haeEl5Mk5qdUFmZnI4Y2RHWFlkNGFJVFJqSXpSMEFxRjB3TUVxYmNSMDg5bXExSGVMYVhyT3ROREJkYlFFZ3FXTnpoV3JSNkxzRW1UTXlJN3orbkMyTFFFV3l0NzhTbVRsZ1A2VjFEOGYzbUJxcHJOYis0d004S01RV2U1aDV2NnJxS2JFai8wN21nZkhWNnI4NnpoOUYrRmE0aXZ2QllvdFY0STVsZktNTzgwQlJUN2dCb3FRbEU0T3RYOG54dXNyQlUxcGFDZms3SEowc2xlZ2V1UmtoNW0xckduL2FvSmlVelNKU3lzcjY3MFNJUWY0VWdKdEl6L0JOK0pkVWdYODExcTVtTUdRUlM3Wk45M1V4c0dEMUZ4bXJDSFNNYW11bUh6WGROVmViNzh2RU5UazhQN3dSZjV5Q0ZZclNRQ0NVQWZnNGJGMWFIWGJLeWFPdHZ2VDFLdmNBYUtHM0pzVjM4dEFMelYyRlRWOTRFS0c5YmcwU1Z1bGFvcHhFWmxKamN2VjdqK0U0YUxFSUtacVJRMG1CNGs0SVU2b2NhbDd1VVJnMi9oWDRpY2J5U3lVNjU1RUtjdmFubHN5Q3hCSVc0NWczZ2FFaUsxL21wSjdnb0gycC9nUFpMQUlVSVlQMGk0Ym5Rb2h6bUQ5a2VKK04zSExqblU5WDMzQ2d4ZnRhVmtRVjFXNVZHTEtOSVQvUk5rUXlwb0FOUFJvN1NnWjBDdkJraDA5S295MzNxVm1yV0UrWEFHSGtrYzZVNzdnL085bEhKZjJpZ2pjYjVjb3pyYVgvUlMwTlNwaHhWWFh0M0dJdmpvNjhaQmZlYWVuNjFHMDA4Yk9xY1cvZFJKZ0c5S01hMzcwS2JhenA3SDYwTHloMGorVWllVitHbklwQkVPcEJqVVhucDNsK1kvOWN5U3JLYVpOckdtTVR4dVZCSDh5T1ZSZCtXSnFJTWNFWjVXckEvYVB0SFFQaVppanFqWFNMQXF4Y3JDZTFDcFZoZVZGZWdKeGVBK29Yek1iN0IxdHJwS2RDVHpZNTZxNVlIeGRpcWQyVHZqbWZEYzV1dkhtK2gyK1JqeC9lNzhuVEV4YmY4RHhwRGFhMElwQWJmRnlnTjZhSDVvaDZxQ2R4MWpMRWsybEF0WnF4d3dyRk9lUG1La2ZTWGNUdnJyMjhKKys3bkRFd1drVUljTkUzYVVaRHNWbW1Cb1JlYis0WEprcVdFR1NmMThJSDJob1BVazJ5WnA1RUUrUXltV2drTEpBaXJZRlgyTmwrcjd4NEVXMytOTmpybFI5RVlqbEk0d0RTMlA1OXBuZDA4eFdlczBoZlc0NndMN28wdXMxQzlrZ3VqMFM4SklWenoydVlIRnV1cnFaRnd2ZG40dndJanVXUG9YNGMyWHZlRG5qWFp6VkxSZmpGb0xSZjRSYlJEcXRON01yOE1hSUxBOCt0QVZ4UHl2SXVpMnZ4eVJ4UWZXSUprQmhMZWdiWUxtS1IwcUV4dDdVcUVJcldxN0c2Kzk3L0FoYWpHeEdlejlGSkVtSkdJeG5UQTZkcmZkMkg3RHZ1cmg5bWdGdHRXYWN1VW5MWHhGVkhOdVpaMHRoaHV0NDcyRU9hSzFFUm5RYjV3ZUdvNjA1MksrQVJzbkRYOVNUVzRyOWtuY0dlbUxIQ01DNjlPYStsY1JLTm0vMUJhWXFaWFVzaDJTM011dzFMeXlYdU1PVGpnd3hmMHQ5UVM2TEFlRXJJaEpEN2pidXIyeU94Q1NYME9NOHpxOEgvVThEWS9LekhMd3ZxREZMYlBicUNoLzlJd0hJRnlOVk0rRDNnc0p0M1JNbnZleHkrWGp6Y2YyNDc2Mlp1MnJqZnczaE0rRys0ZEdWNVhwbmlpM25iWkZkUTJvUXBIQXpoN0lBOGM2VmF5MXZWY09IOTh1MzV4TlNDRGRoT3JFNFNwS05iOXAwK2NDY0FTaDMxNGtPeFNDQ2FrdHB1SlhETk5Sems1VGZtK1pUeU9yN2lpc2h4c0Q3eVdaRFl5ZTQwRjdsNWV1SU5kY0NhOTRFWnBkVU1jbDBrNlozay9VKzlQOTh4S2VRTVRPeVVVUHZKZjRpcy9WMVE0NDhkZ0tWbTJuM0NJVlF2L2ZYbzBUcUVtTmk4akRtRTdxZ0ZoMzdPaUtLMFpBTFBZaXZNVnJucThLNlVtZGdhb3MrSVJHS1ByMk9Gby84clkvOS8xTVRxdXAzTkF0V2Z2Z1k5S2RZSXlrbXVLTXVUL3RqVFZsVnZERWM2bC9vN2Z1a0VMNVFsOUFmRlBsb2YwWk5oRXBTcUZEZGs1akszRGZnUGpnQXlMVFNvR0lNMm5uajVpb0M2RXV3OXNvSU9iNkVrcTd1ZW51a2dpclFiZ3hZcU1XKzB4L2Rnc1cxamNLQUJvaTRzV2VlbUhOc0ZMcFdvZENTKzJqbE5jbWJTV3pXUzJsK1JhU2RJdS90VmhOenV2R3JzS0RROVRUTzRTSXkveXRjYzhYb25UUk9ZMnNHdzV1Wmp2eitZN0lKL1NoRk9ZVTBYd1MxR2NSMlQrQm9zc3MwN2NUd1ZDUjJLOTNkbVVnTlIybm13NkFNaG1Kc2Q3ZDFaelZmeEsxUEZwamVSTW9sTjdLSC9HaEtHajVpVW54aEREenVuSjlZblovYW9QK2ZBNDR4WWRPYTlzeVZSMGRGQ1IrZ2pFcXBRbDg5c3U4WFJtcS9DYnZaMk5HbzROYUp0U015dnFQY1lQdVNjc0RIZU9nOTZZRGFOMUpqSGtkK0prR1dUamR0WWE2azlYMjdLV1BZWDNnSEJaVFkzWWU5RWFNRWlna1lLZTZ6K2lMSlpOdXNWWlA5VVNBVWpac3JJNDhDUkhjUCs1UUcxZVNzSmowYWtFMnpZMFRkRHJ6MGFxSnZDeGRuTExQUWNUdkJVaU02eXdzMW9GRld0OU9ucjQ5ZDRBZFJpdlJGYnAwVGhIdURzTUlVV0pkQkczTEZpTjFXWE1kQVp0dmluRjNraC8zd1F4TWk3TEtDblVhNjNaM2cxWVRRWTluY0JLRFIyTGxodVNBQWxORHF5d2tQRmZ4OEtTM1Rmem1Tc1VkR0h3T1B6dktRWXp1Qlk4SEdBd2NWNEdLaEVqNWFYS0tTZ0pjZ21WRU1KM1pUbmthbkNXN3VpR2lpd0wrZklEZkpKZEZBYWM5TTJ1Qlk3WnJjbjJkK2k1ZHN3YkZlRFhFN0hOMHQ3TUxLNXNBOG5UNzZHUkZIbnpaY2MxWDlnVGNWdExyUEtlRC82Vk8xbVdhNGhjQ3o1OEMyV2lNQ09zU3pSSlN6S2FJaVVCdmlubG00dXZ4ejNwUmpnUElkNC8yVzQrZ2NuNWtJRC9mYnVETFQ0WG9XTDFXck55bTZjcS94ZjZ0TG41d3poR2xzTGp2UHpieDh5WmJlOW0vM2o2UHB0cDNLbGhoZVNVaEVhNzdRejlCT00ydGovZzJaNktqVSsrWm44WW9WcXNwVnVxcmgvbEx0NmdoSkpZMHI4dkZwbTVzb09uL29vS0pLU1pWcS81ZE9nNGhQSkttSnpiTThNOHhRbENGWVBSTldYdENiVVR5TzBHVmxONkFLQk9FaFVuS1ByempVMU9PbUtxVFpaNXgzTnNoRFI2YkhFNFpSck9ITkkzWDhYOGtOWndVSFR0bnkzMU92dkp5U2pCZ0Q2SXVBdThiejdEcWUyTG5ub1lBMC96dG0za29Wd0ZFZEZ6V0VOMEtSSE1yTkt4SWMweXNRNGgxRDVreTNPSFlCbE5rYWltMHFjbTh4UTdOZE8vdThEK2FSK01aenFyQVhnTUZ1WHJzZTBPSkNnZFJFSTIwY3gwbzZPUXA1WDJsM2pZZG5ybnlYbFQyWkJMR2lCVnB2b0pQMzFkNEhsMXN1NDB3L3R6a0tyZ1RsYXRPcXdXaVA2Wm0wRzgvQnRKWG44WFMvSUs2TUdtQnBhSzdRREpqNG41emlyMFU5aW1lTXNvNi9ZVjk4MldGaHY2a3JGQmpiMzFjR1pSZWRQVUJ0TVZqREdwQ3NveGFEcjZXeGtKcWJCY1BpL0dWTnhPVEhRV3BiNm5VWHR5UzA2emhtZmFDQXc2NUIrNjVlL2lkd0ltWkZJWkYzV0tQRjdzQ240dXoyL0NWVzNHZnVjZWtCVHFWVEJoUmVDSldaMG5SNzNJTkJCZjRsRmFFVEpVYkZFTkVtOS8zUFJESTNLc3E5dks0bk0rMm1HcHUxUk5nWTEzamFhQzJvU2J2SEhJSnN4ekFxcUdBR0dGT21IVUEwTjNaVWJjcCttTUJrZTZqRFZ4NzhDb3dPMngzR2kwWUM2YzdZVVhPYzBwNEhreG1WanBOSmhqUVcvVkpwZElPMjdVYVJkeTZKZG5hRklTT1QyRll4NVYzc3FGaU5YRENQUXRvNGhSV1UrQmVIenVHZVVYd29qZVRCa0lycTMwVHVjcXl4bE15TXhwZlBuYnhNL2IyUnVTK2dxdHMyOXJHWjdCV0FUNGV4bzJza3FKVGlZTEpVckdnVmtoU2JMaXRIK25HVmVwMU1kRlFlNzg2a296andFSTlENTZhUFUyZHJtcnB1d2tWRHhFbm9OL2JZWXA2ejRUeTlJT2VpNEFHSDg0YmIzNXJ3TEtmaWRQQ0kvUTM3aWxabXQwRHI0QkdzTlJiTmRDWDdSU1hEYTdkU0o5UFB0NmZyNFJWaGh5SzJQTU9wbEZtanVzd2lUMWJmMm5ieGFQUU5FTkk2dmVXMW5nNGZKZ3QwcElSc05PUGNQZ0dkQTBML2x4TTRqQldYWTBkc0p2WUdYd0thdDNmOGhraHIzM3NWM0M4dEVxUnVnY0ZrZ1NiR1ZrRlJhWjhIb3p0VUpNNWFqVzk4cHIwU21Eb1ZMTWs0MXhYOUhvbWQ2UGZaTnZhRzBpTE9JYVlrdVJpS2ZSbnFxaUpITllyd2ttUk9IZENnTll3STBXcURQRVl3Tmo5YndRTXhQREpUM21ZQ3o0Nm5FbmNOQ2d1T1JlSWMvWkJLekNKT1h5Y0t6c1c1S3VHbnZnZ2NzcG9jREdLRHRKQTZVYVhHaFZxUnN4Z3NadnRZRlA2bUtiVStTcExaQnN1eWtEVEVYNVNqclBOeGdKN0JUNUVkTUNyWFBqYllEa1ZteE95cWtNSEl5TkJGY1BSYXVjZGV4VDR2QWp0bHpscGlZdmJacmQxMHhlRkVoU0UrQlJOeXN4WFB5Z2wvMkViUjdSaEtxT0N0UWxxQVd3dEJGeml6d2xRdmM3bkgzVjZKdld4NnpDaDB0M0lBeW14R3lXdVovZ3lFeVRxWjVmVE9KRjZVZWtjYnI3SWJseVVYSkhEbFJmT3F1c3haWVgvSzViM0FLRmFBUGRaQ0dJSFBSZGd4TURYMGEzUmt3Z1B1VHFzZFlKOWd4U1E5aVJqSlE4UkFwVnJRSGRFUW9KUWtCYitJUlZ0MVhXRDV6bjlwOG5xc1dVd0RLZ1JIVXJyS2g3MHBVU1M2S0FDNnF5VHRIVEV0aVZwY2dmNU40ZFZnWXZzbDlhWkVVUURjcmNSV0V0bGgzaFI3YXhTM1prd1p5eUl1MWpQNHc4YktzdHdJM3ZuNkI5N0dTOUxHa1M2UWJXdkNRZkhYVFpxZWRhY0VTN1p1S05Va1BxekFRYnA0dzlzSzBTS21vYnQ4S1hFSGJHVVJ5Z3VzajF2eXYyZDFWTk1aWlNhemEyWUhyNi9wdSthclYwSG5pU3FObVRJb1hFd1RSajErclBCUjRVYUZDcVVWUFVHNmdESERsVVY4YWRmbVVVSGdoVE8vOXlnUTE2R3BKZ05ZSWd6UDI1WGJ5UFpLc09KQ2VvRGEwbU1tcjVIVW1kZERnMVJONENzb0hsQTJUby94emRmSXF6eE5obXg5Q1NQNk0veGdiMHJWUTRjSHJZbmFiSFdiWVpNcEF0NDhmN2JubUNnTDBXQmhjOElCRFlHZ3ZUVVM2d1FMYmhSOUY1cStsU3ZZZkQyY2ViMjZZS09HbUtTWTgxOTNNa1AzYTFuT2NqcityZTNBQ1MxekMydzYxNXNUT0Z5ZWhQMDQ0alVBMEt6Y1EwTmZkVTNraFhELzVHQkdyU1NsRmRpcjNteVFBbU1SSnY0V0dUWG1vMWpSbVdTWk9hNUNyRzl5Ynk1Mnptc2czOGJNczhCREx6cE8vOVhIWlh6akpQbFNTYTdlYk95TVZqMDhpK1FzTU5TZ1p3SmtnSGdJQ0VTTmJpRjlTeUdWZ2FCbEIvYlhseXZUSStJVjgxcUVUdDdCQWdPcHA3TFRXRkN3UkVZdlJDS2V5N0NGalMwMjRiRmU4WHp0QnBVMVNXSWVXN3FOa2dDNEZCdHB3ZG1iaE5kVVlMZlpVRy9TWUI5LzBnYTZjTkdTMGJoV3IwWDhOWDdqZTJwK0ZhYmhScVpVQkZnVnY1anI1Sk1WQ202bjhnajY2anVUcXBHcUtGdnFudnhpQ0JOdG1vbVMveUJDOGFUMTJFWW83bjF3cmdvalNnYXlKY1M4eS90MU52dm5BYUtOTXdaZFk1ZUJuc29JRU4xN21JTVJsZXo3YWIzTHdtV3RObmJrbmVPc0E0V3AyMmpHdUF6eFB5dzdSVmd0b0NBQTlDekdNaGNISFRDUXBEa3NjaEthVHRjeWcyUTJoT2VvYmEvODRNTFNnRldIYldHc0MvT202RFRQWTNBRHpiOElJM0xZN3FVYk9Hc0kwaktML2lIckswVzVoN1FzMCtuYnNFbmVXUWorSHVPTEZqSHF1YjJxSG1hMHJoNGU2SWwwZCtCNGNvV1dTNkIzbEpzOFArVVBRWFNrRHVXS3labGw5eEFlODhTY3lwS0FwaVUyRFpWT2VhLzhUd2l1NFNYZmxDOXJVL20wN21mUy95MTN2dzBxQzVUTVpKMzFmTDhWQnBkWUczU0JXR0VBUUNUVGhORkRnTEhSaFNsbzFVWnNSU0VjSG1IU2U3MmZkei8xaGs0UTNISGwwcWppK3FGWGFBLzdTR2w5OHhpbnhQcG5RT2JldUViU3VycjlRczdISU9lL0hiWWhrMGMraE9Cc3cxVk1RMTRzclJnRzVETTRRbWtJS1g2enRhbnlYbEp4aUs2SnJwdWI0d0JwUEZBdDFxWE1UanF5aE5wZjVVK05ocy83K0FUeGhvbTNrWjlxa2JRZzUzMnZ4MmRUUW9sMlZMbTcyL3ZuSC9vRTZLdlZWcWttcjRSYVZkVCtndERsVXdILzNoRkI4dGxzem02RG1Oa1ZsNE1aa3lJZXhZandxbk5wMVQ3WTJpdGUralBXWkJuN1lmaFowT3F4K3pONndENkl5ZVF1b1Nvb3ZreXBIOXNDRlR6REZjSytMWHFGL1MzMGV4NlkrY1pEMXRSWEZNSWplajVDTmR4dEdhL1d2OHRYVU55bWhxemltWmpTQ0N4Uy9NZDExYUJZdDRVblhDSEFSb1NqTFREUXJTTnQvcWpwbkpqVGZkQklsMk1FNzZBT0VQL29zQ0dTMG5RVGRhWTNKTXp0OUo2M3VYbnVMOVRkdHVtNTdvUDhESzRKcW8yQkxxOHIrOWVLeUJVR0dvaHg4NzJicXJ1c2VnSThONjIyTWdSbStyYWlEQ3ZpbTRzait0MG05eW1aaVZwMnI3Tk5xZGdiYmU4ZU1pS29UQVcrajhJbVF0bnV5a0hucThTZDVrV2wvWHExVjRnOXhSR1N5SEJGa1dYU3oxblNsRVJsSGhIbXZTV1hiemhxZm93SVhHU2ljMEI1cUt0aHdKZ3BwUEhuYlZvQVhoNDcyY0FmTXEraXZKMGk4TythNFZZUW1sbSs4dFloUGsxc1pDU3BuayswRDN3aDA4QkZHRFEyUHY5eUZQb0w5bDdKU3VSZjgrTkFGT2lrNmZxMmRTZTFHcGJKWU51YkdTTTJjcVo5T2V5WUUzSDF5VFBrdkRzRzRjNWtqMms4cHM5UmtCRHptUjliMnN4UFpmbzVYVlZ0ZWNtQjdvME9UdzByUDdNNElxN1pXQnZ4YnlEOWJueHY1Z2tFQys2emJWeVlQMGFVUlRyL1lQWmE1KzdEQSt1YUVleWtrQU85dzJMVjFCQ3BhMWcyVEQ1TENkOEl2VmQrOXA0c3VkanVwdE1EZGZvYVBsdTB2Z0xNUkpkYmd3K0ZYNTAwczFKMWFTU0FQQ01QYTJtL3RwUW5xeHNvbk9wSnQyM3I3cXdFcEt2eFJaL3BBa1NMbGZKZUExdFhiSi93a0hFU3R4MWE1NUFpL0NNbHBGZkQrR2NvQWFxSkx2WVU4bStwVThyQ1ZPcjUzNzVlUVN1ZFc0S3NZOEVYdlRWaUdoOE9QL3Q1YThRRmZLelZZaUYwcVUyaDNCTGZTUEd2Wk9HcUpLNzRSSlI1MmRRRXoxdCswNnp0OU9EcVpVNnZKWWFjMW1sdzE5Tms0dDFpZlBnc1B0Ylg2M3FUbzNYMzJublh3cEY2WFFqRHppMUJUOExGSWRvd0ZGVDBsTGdyOGxBZjNzZWtmTi9UQ1dteWJUWHBVcm5CY09SOEhWOENlVDZYdSs5ME9GMDVLYkRDdXAvQVBKL3BMaGl0aEFDeldjckVlL3RENmQxbWtsclI2b2NkK1dBaG9UNm9FV3BkcFJHOVYybGtMSVhPMXdTOVhJWDVPTHVmclY5bFRwWXA4NG15cjc4OFBFeHdCWjZBalNvVTJXaDFTczltUm1ob0N3b0RSYS9hRXFRVDhTTDVaRysxUFk4OU9BR1U3bWxiaGtuejJ1dG5sZ1MwWFM0ek5BRS9kdEtXOHJuRHRWaHRSOGNFSkdnbUJUNTFwcGx4blhnbS8rdzJiTW4vaEsrOWhWS0N0d0Q4SmwxcFdQV3pnSDl6MkQ3ME5iQ2ZEaTVvK0dxaUpzd3VjazdXQXFrY1Vub1FTbmZPNm1WSnIxeFdZOFpzNnE4MFFDSzJoT0JqN2VUeWtnVGcyd1VyOWhaSHE2QW9KZ3NSNFNDYk94ZFlMVi9DcjdKRWtpRGd1ZUIxdjQ5UGJQcU1yUWpKaytzK24wMjA4Ti9LbTFUN1pDbzBTK09kUlY3bDNSb2ZYM3puandyQmFtSkIxUnM1RGxvblp1WDk5aEMxcVNpdnFHV1h3c1oyOEhmTmhVOVdpRk1RajhieExRd1ptRk91UkRmQk5yWnpyUzdZWkttREVoOVVXUjNiWFBmUm5zYnptZlNrQldYWElGMkwwRmZjN1RvdkVQYXJVbEFYZlViaE4vamFZYldzOXNjV3B4MUtPb1Mvd3NBUFRDeHlIbEU0OXQ2YmVhcXBJbHB6Rkdqa1pETFo5SnZtSlJWUnBQbmxHS1VWMm8zZzNDNXJYdFFzRG9iYTVSSit2QTlMZW8rUy9sUG9YTHJBdDBLM0dBRmwxZHJxay91NmdBVUQ2WGRZMVFzeFZUSjJSNjRGRXF1bXJEQVA2Q1kxS3NCd09IRnUxMkZOKzdSMEY5d3gzK202aVNCODdVd1Rwekk1OE5JbzhrRHRkRFRHdWNwTDZGSjZQb0xyMkdvR3lHOFFrbnp0elRJSUFHVjNiL01FLzFDaUZqcXVsbm1ScytRczdLTTE3d3h1YUxNUkJIL1hBV2k3blBuSlNkMjFNNkhyVzE3QmlKME0xMWFlcXRFN1FJYk9jUW1QRUs3MEdYNW5OOWRSRFg2WVF4bzZwUHZKc29IdXc4OUNHY1FMSFUrdHlvQWFpNFpVTFR1Qm5Ic2tWOVo2ZDFPQ3c1Nkg0YjZuMng5enJUTTJLUm9ETlZtY0JNSUY5dVFFQWEvemJtcnJwQUtncU1LS0lxWnpKK2dlendKRmJxaC9jUWg3REk3dG05UG5wRmZqMXMvcEt4VEtKbjVDcU9RbTFsSkhDaDI0bFpONHFOcFFmSUh2aTlmYy9TSXp3d2dUcTVVMnJOa0ViYUVyOG9DMUprQ0hkWWhMYjAwQ2dpamlUYjRKaUdLVVZmQm5HRmRmZFlobzZFdDZiQUpwMWRDQlZLaGpSNVRVMnBBWldoZkk1VkZta05UQm1TN2ZBeGtwSXpYMm5UdDRDS2dHd241T09aVDcrbzAxbGRBREhSQ2xFQUlETGgraS92cUlJa1N4ZGt3eFozRlZRK1NUNkIwRldlaVk0bzhocWRVZW5NdWVKV29ROThvZFVLQmJUSlF3aWxjeDM2L0krUjJrbTRKNDYvZE9GVjkrYXZUdUVIaVRSSVdvZjJJNWdLSDBXVEh4YTNuVFNvMndCclRqeDJpc1NsS0FyYnJFT3p5VlhNL003RkJhemhWalRURlFibkxtbXlUQk1tQVFxTXhaRk9NUnpKOGtyMG9EM0FteGMrRzVmREplVXBMZGtkQnhSVXdPZ29tbmhIcVgxVlNtVU1ZZ0d0dGVDY2RqNk5lTWFGOThHOFIzdVYwRWlWcnBMaEt6SE5jdmJNV2Nmd2pFQWx4WG03ZjZ4RG04ZGZ3RCtZL3JVUVlBN2wyNmxNYzFEVmNSeGtvRXorVHN2SXNORUNzQzZXMTVadGprMEZ0cHpmVW4rNXBMa0JBeDI4N3ZXdzkzV0FiUVNyK1pSeXIyVlJnYlJwMnc5dnNFMGoyWDYxTWZjV1lUSmptVlVhWFVYOEhpR0R3K2VrQWNEcUhucStleXVHUU05RmNPUjl3aHdOVXFEbm00U0s5UHhzYWkxcXVjQk9LUFFSRVJaVTBPbzNFTStqdWlUMVFtakxIUUs3TGdxaGhlQWZrVkovWjhzbldib3g2aE9WWjg4Kyt2Qmo1SVdHWUZKOHZKL0tjdEFmSnRNWmJEdVVZbDkyZHJ0VXUxekZndVdMMms4Y0oxd0x1WVBKSk01Z2pLRXJDcmRxUzFJTmRxSHhqRmhLOVc0NE55Z3QyRG5Zek5IZExZYWlJSzNvQ1JxbThaeXZMcnV6MVFHRGZhT1dSN0IzTWFzcEYwR0ZiNHFncmxBSHZhQ2xNeEpINWR1TE4yUEtPN1RwTnNPTmRsRHNUSkErRGJobUluR2hjQnlzdmtLd3U2ZXA1ME9BWUY3QVZUZE91N0xUaStCc0x5VVdtVlczWjgzY3U5SnJEMlptNHhwTzQyTm41UmRVTzdWcHN0T3h3dWZxUVNRUXRHMktpTVN0bXhpN1JLUnpGald2V3FGNmpXMVFMNEk1Ti9vamI4eENWd0VPc3lzV1NqdUdxVU1oZlZtdVdCNE5iTHBpNFYxYytIQTJBdHBnMXlZcmgxeHUrbGhDQVJnN0hBMFBtczY1T09TUTl2QjdySVZNWlFlZmNSTjhjTk5FM3JyTVl5OVc4VmdKQklPU2hBc3hpQmxReEhkMElHL0t4SzNzeEFsUVpnOHNmNXZKbVU1aFJQZVVFV0dSbkJQM1ZRLzdHWU05NVV5NnlnblJNNlpoVE1IQ29aWW9LTUVlWHFPaVVUQzR6cVZvRFB3OW5qSUZ1aGh3cXpqMXV4TE5LeUc0WEdtMGgxSkhjWnFVM1FSRlR1U0Y4cmR6NDU2NG9WWWRNcmRtNU5HOUg5RFFRUzlEMVVuQWJHWnArT0NEL05IQUdlSzl1ZFF3UVAxSFgveFpsMVpHQkczbTNKY2VMeVUvWjFQS0p0SkdDMzdVazlkblFHNnBaMU5SSWRMV3drK0p3cDZvcm9xVUtUc0EzN0VveWtsWG15QWVJQmFiYTNsc2g5cFROUlEyQUxkZWJiUjJ1bDBLUVk4LzJ3RlhOTXAvZHdhcHd6WFJPSzBGYWJKSTJ2OUhXZXZ5ZmgzNFBaTWYyNEpweUQ1SE1mVUFaOTZlMThmdzlVVnpHV21qdzU0R3V1QmtVOXdncG5DQkpHMDFkbzJlZ2pjYUlhS2JyM2FDV3V6RlF4Q3VZYVR4Rm1oRTlOb1czbkUvRUx1K3NWTVkvS3ZWdG55NnZFUmtUOTRqUkd6TUZHdWpCZXNDeWRrdTBXMmhhQk1tTm90TEJSODhGMllGN1lEaFYzVEpVRTQveW1vbkhhWEhKSnlrU1hMbzk3VHpabm8xRmVOOXkvSWkyT0I0ZS9DVW9tSjE0a0xsa09jeUNOL05temdxL21EdGhlQi9iM256THpqSWd5akZycFpkb2hhYStlcVU2NjAvRjBrOTJNRnRxS0w5c0M1S0hKM1A5ZWhDeUpIUHJJTW8rVGk3cGw1WkZYT1gwcmNoU3NzY3JnR1lkM2ZtaVl0VlVWY205UXR4QkYvRkRFd3drL2lGTFYvRk9odTF6M2NJeFJuSWQ2MHA5RCt1dGthTHJaejBzaTZxQkFwMmFiTmhhSytzVnI2cjIxQ3RLUFgyUk5wcnJGd05nUHROemNmbzBLenlyV05ZQWlkNit2VDVscExxQjdLbmMvOXpid1lJVFZOVkI0TThvRnA5QW9oWWE1UkJpUGcwMENRRWR0UDQ1TlREM0lwR3k1V2JjK3V3Q0grMWE1SFl3b204K1hBU05DZEt3bG4ydkROenduWTNiTmJpL3M0MXp6c0ROZy9sRVVGaVRtOWtnWWpTQXhXaVpEZnBGSzNkUWJZMUF1eTB2V3NOWTZ1cWxJdk9YditXUzh0UXRUS1BPQmZxWTNnTlRmelNiYVZVSDJqRm9rOUdpUzN5Um1pZFdidHRlOHFMaGY4T0pnd2JiS05sbUc4aFhyc04zSFlVK3E1a3RObHl5ZVB2aFlRU1d3Wks4Uk5GZXo3eWJjdTVCUVFXVjNoQVJDT0pGbm1PVFRkY05sMDlqS3dWREhIdmlyRExUK01nMkg1dEZDRGMwTjBNd3VCWDBEU3NMeDl3Y0NjdWZBZzJyUDhrejdPSGVqUGlKSTlJNmw0VW53VFY1VEI4aE9ybmlsY1NEMm1LTGVRMDczWFNvalpUa1ZtcDVMdncvRSt4bDlIMEc0WS8yUmp1Vnd0T0txWjBpeE1OMHQ0UWE4SUF1SG85Z05QV0hDdkpSVnl4Q2tJSkozc1pQZ0cwUWlTb0srQVF4dHI4R1Q5ODFibjRQTnlCN0tjTTR2WFM3bDFOY0ZIUUFrLzBESVplci80Q2FFNUVqU3FlNkdPOHhpdDBBdEVOTWNUd3NocmpRbUNYM1l6SzFEa2NZNk9sclkxa1l0YlEwUGo4cVZYSE9ITVJFVnZ3R3V3SytvbHZ5ZWJqaHMzN3JJTmFwZWRSOEUyS0NyTkNwOWFDbXVaQmUwQSt5cVl2clY4ekVuUTJCVkpvb2lrWFNmN3NONmxEdkxONE5jZHN5NEp6aUZ3K3VLYm1NL2RkYUFEMm10OUpBOVpqM0E1ajBLY0Jpck15SGs0Y2NwWHU0a1ZLTVFiamJMR1U1b3hVdU9ZYkdhTmtIY3Y0NUo4b3R2U1B5MzFhN0Q1RDFYa3B6TURDUUUzREFzNkZHOFBiMVVXZ2JQZ0grS3o5ZVFZM0Ira1dnMW5mOE8rWFRZNkVRQjAxMmhwdnFFWE41TFRGTzdxc0Qrb1IwanU5OWJOczdQc3VwWGRRNzQxbVpPOVZJQ2h3YzNXdDI3QkgvRHNTcXpLY1hTTUhDM0p6QjloeWxyS2oxZFBuZzhOQTlBQ2tsZVlzSXlTYVVvaCtydFp5YmVoSXVLYy9aamFKWEUvTXVUN3ZRcE5VbXU4cm4yc0VpbVZyVGorS1RhY0hmcG1vRUFvaGpIVUx4cEZCWFZUcDRRc1hkZmptM2pKays5V0gyWEt1cU54ckhjc1l3ckE4UTVMd2UvL0R4Rmp4TWx2U2JGcEx5c29TSjlTU1hhcUVLRkZRUXg3SDNrbnNmOWlLSXhhTmNJc0o0T3JRR2NPUWFEVTBpQ0lqLzR0RlpleWRhdEdZbUw4eGMvdUZIMkcwR3cwNHl5T2tvRVQ0NVlLYUlEVVZjTDFubVF0L0VCa0dneThQeGZ1bjQ5ZlgwbytCTE1WamtaaXdGZzNmRVBHUFJzYUt6Q1ZuZkpST3FtQjhRa0UrWE1oVzFuOURGVUxvSW9zVC9peVkvWFhFUi9WVEhBVFVEMFF3eTBXRHlJWWxzcWJCY0VuTlBZUTBIMUM0UE5lVGNZRzFRbHRrd0JTSnMxTEdOSWFLS2RsV2hOc1NsY2FUcWZsWU1yQkc2SHFnUHFkSFA1RUNMNTdYU2YrUUlaai9pVHB0a0tKa1F6Q1hRZEQ2VWFlV1NOWmk4VmlmbXN2elk2OEM4VDRVNUJZa2tGeUdURUtxc29vTDdTeVdESGIxd3ZhZVA4MDFPTy9WTEhXNDREcGpYMmpJSnRPYlp4eDJPT3RXWWh2azVRRDFOTnFkcTBQQUdPZlhnQXhOK205QmpFK29hNWljSkc1K1NnMC93RTBJRHRwNWlRR0tkd0N6aWJDMGx2TDEyUWpXZkJhM04wVkp2dUZKM205dUE5eTRValJYSVJ4UGdGNElzRzkwalRRRUg4VHZzd0lhNzFqRVpGSzdHcjlSblQxN3FNTVQ1aTFDSHg1Vk81Q3ZSWXhIYzloLzExMVVYcnV2R3JwZjlvd3pKaTFRMCt1Ui9uVHRSeTJ0M3crdWVWWG5uTUVvZVpwakFOV2RjZGZDMEhqRzVWTXpxMVJXQXpFTGRGVjNDYk1MTktseW8yNzMzdWxMQmlEejBMbE10aXBVVUNSU1U5YlhiMVlOblA3WDd6aVFnZ09OVXhuRk1pc3g2M1JiUGNLU3U4d1JLRTJ1akZBMXNlR3NjMkhvMDhsTmFRL0ZsUC9IRXN6Nm9JeHBOb3VhNUhmSXhrM0FuZ2Y4MkVIbVphQWpheHZPR0xRMFlDeFdVZ1ZsTVphZ3lFT2Fqck9ucDlieFRocEFxMXl6M21HLzBpaE9yOEpFRDBEeFhHMHNtMEc1SGhyN2VYTDF3YUs3a3gzYkg2L3ZhckJsZmRSVFBKNlJwNVlxL3pqcE9UYmhPVzJwQTlkS1dsZExHMUJOTS9mUHVuemN1VzlncUlxUWtnQWt6RlloSDFmV0Z6MTFJL01nUUtRUklpRTBUODJRU3VmdzlUSVhIZnRwbEkxWFlwUTJ6RitsUm9WanF1VHFycHV3MUlJQ1ZuV0trS0xFMHRoOWdqWTFEZ0JSd1AwdEFpcC9LamNBSmI2UG5lVUpoRUt1OEFFU2REd0dLUmhUbEV1K0wyMDNyZ0dUTlZoYys2Y2ZPeXlMRi9FVTd0b1J5bmdOYnpHOWlSQVBiNXp2d0tGMFhlY2pvTm51OEVsRlhRamc1R2hjb0Y3VVBMcElETzhxdXlGNEtGNG9uOGNHejVreHRhY0l5aWRZNnppbURhRlNLRTJoVFRhT2sxRmU2VDVGWEFmc2JOTGFaaDFodkRheWNBMTdCNjVTellHRC9FZ2w0aFVkWGlGdENla2VYTTBxN1ZROTNlUmIxY1VrVGcrSzZ1dEVRRUdaWnFRWWdKeTduK3ZYWElxbmhPVWNIa05CaFBGMDlXVndXVW83NVEyZ21uc0NobTB5Q1RWZVhpcC93bENzY1JRSE53RlhaWHdUcU1wckZFTnZrYUVoblJRYjJDbkpza3R1TXc0dkJuRFdFcm1UVWlQSm5HZk1EblYvbkdYakRwdnhTbDFSQ2h0VkJCOHA1YjhWUm9vOUtoSUtmZW8xQzFUWmFNd1lKTVhDTndoakRtaldYMkxCSVFpWGlsQVZWVFptdTEydVJtUlZJWm1JTDJib3RXUHJxWDIrbGQxRjVZdlk1OHRJZzBSaUNFUk1LendXOS9wYWlNK1hBamh4cS9WMVJ0dVlYZFNXTng0SzdxcWlvSE8zZGxDdGxkUGduTkpwY2lYSldrdGxHUEl5OXFjeUpCQUptVmRNMVV5aTYrdENKc0xSTUx6RWFuMlhabWxlN1RYT0dManhwb21uWURDYU44UHlLZ2VISVpxdGd3ZFIwMklXYVl3cXUvcVZTZWFXSFRtbXZMMVhodHFCT2FpaUd6b3dpTkhhT1RXR0d2T3g4YzJ1bmYvYlF0MlhRKzk5Zy84N3R3L0Nkc1Z5UFRDa3hEaVFrNkkzTGpJZlpaeGtvczh1cEk0NS93ZVNCTHNMOU45OUdNTHZ6UVZJUDlIQTVkdG9nQzg5M1BEZHB6VFpkSUFYbUtkSnBVUFBSYkFPM2o3WE9meVdwaVV5Qmc4clVLSTJNWjIvRXp0UVF4Qm5rVCtGZVBMREkva1dRcFBqd3B4dVlmMDk2Z0h6QWRvTFZqUE5PZHV0ZE9FSmxMSWdBQ3VlR2V4cThlQU0vK0J1OVFDWUdlU01BU0xLMUpFbVhndzZpOTlzVVJlZEkxUGFadmoxejgrNU5EcUsrejRISkhQNkwxWURScCtoR1crWTY4UHI4dlBzZXI4TkROTGZLcG9mcVl2SnRNVThGNFZURkppK0FocG9MdGQxT3N4aXJYWXQzMVpCbXRtL2UxWVNDVG9SbHE5UHJDV3RaMnI2L1FHcWFiNkNKYnErTThvRi9KK3MwQitIdkpYU1RSUm5YTEZ4c01WZUkyRWl6NFFFbDNaNnc2d2FuRVNUUmtYZ3RHNHhZN01MY0VoRno3Ky8zSnJtd2tNSmZpdHk2QkdIQmZiZ1d3SE1zWGpiaDR4T0ppcURyZ1EwaU5ubUlGcUZkRjd3SGUwSG92SGYwZ1ZPVVFTQWQrcTRxalZ0NzNQK2UrcDZ6bEdSVkpJM3M3MWU5aVpYZTZYc3ovckFGQ2F6L0V4ZHFQZWFhTVpGRHF3RDI1dTRKNmwwNzMzd1lXc3BFWHRpd0hrNjZ1MVZ6enpudFRORStRSDRPd1NhL1dkL0Q5dTh1WDVDanhyN2wvVTZna0haWHRmczVKL01KeXgrQjkxMnY2V05IMEdUeVRtL1VVcFRFVmFzVTdibC82YVRsWVlRQ1NrMm1kS0RIcytHdHpmdnVVcVlEL1BHOXdhSW4zMy9YTlBxWVJJM204eW9OTnhjMzh6enVnZVo3SkM2QVY1aTgzRkZadU1yaXdsYmxIQTZpeW92bjJqZ1VwYk13YVdINkJBenBIMm5UZFVOS2FDZUtLMEZxVG8reEMyWmtSTVdXb1Ntdk5mQjc2eHM0YTJqaW80djY0ZWN0NGUzVmdLdHNrcEV0OVkyNkFMWDQ3UWloN2ZyOWN3ayt2V3VQSFJaTlBxTERxVDZORXVCYzZ5VldjUm5HbTJtMVhtVSs0VUtrdnBvQ0syUlFKVmc1S2J3QVpMUGpSN3lucC9zN0Q2WGI1K1kwLytZS0tpZUtQaWVodlpDVjhFZzQ4TVM1aG1WN3pacEg2bjVJWWtnaGk3akNNUDZ4MlVqTnVCZWNkcDB1WGIvRnhxWDlMVDd3NElaY1l2OUhOZ1YrUVB0UEZyVXlQbUloQWZxZ0k2cHRvOEd5NnNWNnlKN2dBdHJtSlQyV2xMWlZ3a1hLTlo0a21reW1XNnZ4SGdPUFRUd3Jnd1AyME5RTmROVG4yeVFKWi9ibkhEcmNBMHoyREpLNW5LeENWWjF6RE9DcXVYWTZMZTFDTm0yYVJkWFJOZzZscTdJYkFwcmlldVJ6cGI0SzREdnRtZDBtR1R1RXpFcDF2c0p5TFliWDNjZWJaZ2NPNzdXSjB4QWtiT1FxOWVEbGhscWFEZ2pVSDhmRHl4aHUzVEZwa1JlQUtrbGNscEk4emlBalBGejRKTGpHcVF2cktnUDNOSW92SFhUeXAxcVgwZ2lYWTBWVWNFSncrdFB4VUc2UU9WKzhUYUdvRDVtTVJZYjdBQVMycWxPVUpYcFNKa3Z5Rm8rdXB5M2FqYktyaWI0b2xJaDJTZ2pNNVF0QnBwVUxaRGl1NUVsTmxGVktmajJOYVlDZG5aRG9IbStGaXN1Q1VpWE5CWERweXBFNHg0ZUlFMi93ZjdFNHY0N0krelZ3S2t1V0Y2TE81ZWFFWjRsU0dFU2QxbmRTSEh1RHdGcjVMVkkwVmdWbDRnaWRmcytueENqNzRBOXdrTjh3S3lDem03VnJWOHBtcU5WQTRlOVJ4V0VscU1jcTBGejM4YVpSdWtnbDZhOFY3dWZHT1FFbXZnMmp2YVhsSStqRkNjYzNUOTdxM21yYUwybUNJWFY0LzAxL1hpbStuNkl5YW9kd3lNbXZ5b1NUTGZrRGliOGpMT3krbE5oZk05amoxUnVLd1pUWVJMa2Y0bXJlN2dRbkpOVUpvekN2bzRveTN1bmtRYVYwUUtrb20vSXJ5ejhBRVc5MXc3NFFjeVVkbEpFWnNnVk1PZGtnK1luV1hEUjJEQWpaM0RsS09tbDk3c1pLVjhKMlgrTXI5TWdZYzNFcjBRTHllZm9tbHhiKythL1hZblZVcFdBMGxrQmVEK1hDeUdmaWlGSjdoK2xKRkdnQ0IzaXFmUlAyQ09IZ05XOE5XRHAzU2QrTXpBRHk0WWZrcmp2YXpaT1JlU1VIRlY1L3JwVlpYL0ltN3hkQ2hMNlRwRkFhNTh5eDl2VTVHWVBpZ2JHMitXbFNQOHJySzZEYWMxNU1mRVhzVW5rWTViS0s3SjVQalhUMm9uY3VOdXkxUy91VG4wa3hwVUpRaUsvSzVxM2lMa3ordEVoUXNRVThDekg1UFBncFQ1aE95aTl4RnRaSjVMWTZrelJCOWNlWWV0aGRUeXV3eHdqZHdaVEQ4Y29tcEo0SU0zSXdQL1hMWUFRYUk4KzRiNlNGRWFka0ltZEtlQkhuSERmelRiWHQrM2xtR2dZUHkxZmh5L3d1YTlGTG5VTmJVNkxaK3o0OTllZ21HRDFNUUtaS1NERjhCVi8ydDYyZ1I5bG9tbEFPZ3htV2FhQWxxYXhmNlZXY1g0R3prM0ltbjNTd21LYjJpYnM5NTRzZzl3NmpNQVlBNjJpMlh0VUEzREU4YUJNQnBVdDBIQmQ1Zk5jV0Y1L3FSQWRyODVqSlVYWEJsRkROenN4YkFOcUdwajk1QjZWUncrSnlYeGw2WlNScnZ2dnNwNGsxMlpaRkNEMmFJRklsOXBvSFUra0Q2UGJMVk9FZE5xMTlmdGtRVCswUHRqbHlZVmF2TkhEOXhvVlBzcHc1NkJPNGI3M2sybGtuOEg0VHR6enJzYmROVDNudlY0bkpkQmhBaEhoQXZkQXJKemdwS3hEdjhPV0pnL0dnOW1sbytuUC9ENHY2Mmw1Z3NFYTBEV012OVVGMXVHMW8reGNRQzJIcTJXb1dGdUUvd3FUNjU2eG5kQlpWbEdsUmp0UnRoRUd1aTcxVG5HalEvZ2tZUWdwSXNmYmFuam5MdnBHeXpJczhzR1huVDdkSEZrbVMwN0hqM2F5UFUySFV6cklHSFBxczVsOXFxcHpzMlluU000YXJObGdoR0VsNXhicC9KY0N1cTNRSk1KNUxnazFpYjRNbUhiMytEWEtjWTlsNFZQaElKSGVEZjZWdVJwNUNIWk9qTVpmRW9qVm01aElBOHdYT1JYMWtqOEl5VHc2VkxJVXFtQ0hIQ1FKSFNYK2hkSUo5WkZCMEtZbWtwOHBob1FIak5MQlNYWW9lczlFeXJnUnNhdkxyU00ySlRRMHp3cVF4RFNXZW9OMUVicm81MDZIdDgzbEdjd2U5UDBvaDdTTUFHdUJsVEpsMWFuNXRDbnZpcVNMeXBqWjFyOWx0aVU1SjBVNFpRYlc0WCtGZ3RzMitiUTVUNVJ3RHdKRlA5eWNpbUFwNFFnQ3I2czBJRlkvZ1dSM2NYNTRISlN0eS9lUzB0blFGMXFJc1NiQ0UzeWlCMU9rbkcvODJiTDhTWTlyREZnUm5MM3gwdjlvT094NXRwS0N2SWxXaERkN25RaWx5OTF1YzhYQ0dpS1Y3Sk5OMm85ekhWK1BnL1J4bzl3S0wydVdCM212VE80dTQ4RmZjNmtKV3grcGlXRnczdWJ3dHhvTnNwYVlQSVB5Z3hCc29YVTE3SkZwMjRVMUw3M3Exc05uaG9wc3JMT1o4RTNEdUd2MTNwWlRBdFY0ck5lRi94dlJnV1ArMGF5Sy9wR0NPSDVFSmN4ZHZueFZkZVVINUc1ZHQyb0hvbkpYMlVKT3BRVzBibFFPUmVPV1lCSzR1bnIrQW84dkRhMityZU5kT3dHMmtZNytRczNyb20rY1pUUy9zZ0RRTjBTWE5waE9kSVo0WUh6ajlxTHRXUmV0WGQ5eHpzaVB6dWgzTmN2ejUxTVJRc2d3TEFZS0xpYWlVRDlFOG9jZ0tQTFJUYUpBTTBWQmlOVEs5SDlZODE0NkE3Z3JCUjZWYUpJZUt3dXp0dmtzbG5oVWJvUjE3NnB0aWZNOU1UWkhYdDZQSWxhbG4ybStnS0h4RXAzdkZJS3BBallPNmthVG82dDNmYkIwVFBrUWduMEhSWFlDR01YSk9aOVV3dTM0UVdqWVNnS0pGMlRURzZHSW94ZjhFRlBFbDNoQ1c2aFoxM3hCalRkZnlrM3JXR0NQMVp6QXBzNUJCaHg2aEkyblZSNnZSU1gvdURDR1lHczJhU3J1OEVrVVYzMEhMMm92bFBNV3VZWHJkNWFQdjRKdEFvNmlFMVNRR0lQdjZLdjBEeFNZWVZvWENIWjNnRkQwTUhxZngxVDBHK25JN2kvWkdhUWdSNGpxMlhrc096SXgrWXF1akZMNWkxTnZVeDU0bExLSmNWdGxyZlNkT3U2c2hZdVBWMTZnN1hrZ0ExaFN0ZSs5UTEyS2xqSXgxVGllYlZ0YnJ0TVlFOGl5WVBDQjMvUzBXWjN1WGJsVVA4N0VEYktuVmRpNmxYd3ZTbHZoa000SlBEL1RTNlh2VHBmODZ1dWkxaWNSZnhHaU9id0dmQWhzakhieWpQUk5Xek1QZFU4dXppM1ZkM29aOE5vL0hJRmpad2dWVHhrNm5CaGw4anUrQVg3VVduRFptZldmZFpyUXkybXFrOTdKSDdtVkxESVEwam9sYXhTMHB2TGxpWGJCSC9VQi81TUlPOUYzaWdhamZFVnZNaGh0R21BUGcyUStsQXJ2MzlDbGJGSnNMSmxwK3oyMVU0LzdFeFZYMFlVSndiNjFmYTBURDFqYnZlNExNTGpydlZJMUhLVmEzaFBacktmNHNpanlDL0YrWnhPaDFRR0NEZXVaQmRnaXNZd1FlTzNTdkszSnFjNU9ibDRQVWR0TDQxTVVTc25iTkRqTVhjd0xydStxQkxXMUdUYXNIdUF3Zm5KQlZkd3pseXhyejlHbHBTLzZUdVdxQkxuUkdWNVByOWJZa2hvUUdyaEpXUVlySW9sMDlpL2FVNmpoWkVic0hWT1NicjJ1M0ZzcUlVU29HaVdMOUMwL1FMUmhwTFpGTGZVUWErT3E5V3VLY0ZSUkRnMkdBUGlxU25Pd3IrcExtaEl0a3dRdW5rS3VYUGppeHlJdDl2dmlMbGJtdFhBWkNCTGFuNFFwR0hISjFXLzFlZWFlZTFCZzFEVGtiR09rL0dnSFJsWG4zMUU3S2R6bUQxQVV4SmR6bWh2R29IYUJpUEo2U1RSM0xodEpydTgzL0pYWDBJTFlXOUxUWmY1dERCd05VUUhYVjJqZXB1RTFDZHBFRm9jRm9QTUhleEVQaGJLc3hOWVA1RmtDM24zK0hLa211YVdMU01XeTZhSnA0YkFRWlBsRCtUSVlHM2N2aDVHWndjeVR3UzhmSnpHbGZDVFhmcklDU1BIa3NuQm1qZ1V2MVFjaGc0OGR5cFhKR0NLYmI4am9SOTA3RHVaazAvWkFiSzIyQ0dtczhjZWFwdzlsdDcwUjREQTN5UnlJSkU1N2ErQWhRM0J2ZFlTN01jL1d0aGsrNlA2dDJhU2U1Wi8wcjd4RG04dnZUUXA5UVFTNFRGWXdSNnFOY2ZydllRQjRhSGc1Vk9DVXAvSWdwWjFVVkhxcEpLc1NPSEZyVThrV01rVUwyYVJPQkhXcjZkWGpYZlQ0RWQ1b0RWTXkrS2Uvek04ZS9udE9WdEFaUmJNR2dGRG9ONUkwWkZxQ21mdEx1MFdRcytuOWxjQnRrUjh6NFBaUU92NVp4OFBPR3RTanhxb29ydGFsOWpsMjEwaVFUNWpzOE1YVGVQeGRhMi94Yk92d1ZPYjFyTkRKWDhHOVNMTldFeTd1c0NuZlJVSFlDeVo4WlBVc3dBc05IeEYveEZ2ZTJ4dGRYWUxtRmJNVUZVRytsUlZjLzBhandaMHIzTTFVZlZqSzRWQXZOY1IvejBTdGZKMXFzTWRaZzd6ZS8zVjJlTjBlNGtZL3RKNnFjZ2IyeENYNUNZOXZYOVJHNERVV0REaDVIcmhQanFadW1xdXgra2JCcGU3TUtwSkkzMzErWXZKTEkwcXlaTC9MUVpZYzhERXUydmNidmlIVUFyTUQ5cnl5QUtXaHp6MFJDek1tOUkvWEhMZTdLdUVNbkVzUFF0c252SXNJZ0EwR3ZXU25ZYXA0YldCZDlzU01Cb1Q4UjhTdCs1S25VSUFkZzQ2NlplbnovV1cwSmNiQWUwWXRHY3ZlaXVGblpQQmtmWDZTcWp0UU9haXplcDh3cDF0c2t5NThZQjVJb3JlaWVDNU9rcEcra0d4UkdIT2s3bHlmZXBDRkNQNkltS0I1WG5qcThPUXBHWk1kaHFVaXZIWEs4Y2pFc0JqK013Mm9vR2l4YlZXM2srSURiQzRjVXJCMDdrdy9OZUVNMnc1YWIrK2k3emloMTFIQklvUXUzck44OU5NRlJkc1JDM3RQd1ZUWEd6cHVJQ1VYZHRTZ1lUcnFGaEhMVU1aY2tuazNnRXNUaEhYeHhFdHhLekR1eWt4TEZFTFY3OXRpam45Q2s3eTF3RGwyQS9mNVBSYTBRYmV0THNqczBoVWVhdW9qQ20zR1VTUDVPUlNtQnRzakV6SE1UbkIxRTMyMys4THdLTXJVSVFGOEFHWkcvZjJUTWZ0WHVOazlNRHdhenpBNytJWkh6bkg0U0xVQSt0Rjd3cGtDc1B0SmpxTkE5Wi9xZkJ3VDdsQUpldC8vV0F3TXgrYWM3UjNwT0JVUG9YZlZsNFhQK1VjU3pFdWNva1BSUGFldm9WdnptS3JBSVhVdXRtbW1GNFFuVmhhUVhIaWVLcWJGVjlWL0RaZUJvbUxOaGtscHdRK0djbzBuR2E3WWQyTE4yem9tN2pYVUpoOTZBZFQ2OTlYenFtSFNFZEJQbG5CQkZjbVhkU1pHN25DUG53UzJlMURvaXR5eXJ2MVI1QkF1RFBOdDIrNFVhRlJPK3lhc1FtTTQ3WmxJRVl5eHZTbVRDZFlNMW05WHJ0U09nQWhBQzBIWE5yeWlwUjdrdkk4SVp5dE12bmltaG43eVhUaWN0UER1eEdZTDJBYndsV1I5TC9nQ09BQ3dXNDlndWQzbWJzcDlITHZDOXk5b0o3NFhHOGZLZExtT1Yyc2NjTlI5L2F0Q2FUb2piZFpmd2VCY2pYbXk0V25Rcjl0RlR5K3l0TU5Ralo2RFl2clkySVFJWDY2c0RyN3FDRHFwMVdXd25tSVprUGMyNjBlNHhpUmlodkhjUldVd0NrTTRvRy9sb3p1U0xRV0U3c0VPOEZhTnVCa25ZNWtuWFBCMzlkLzFKY0UrdVNIWERxSElrd3p0eDVqbDliaDBZZzl0OS9ySUwyWSt1ZzRQelhxWmFCWEhROWF4M2dmZkFpWTMwWjkyY1lVN1N3L3p4ZXhhWWVLQ1JTUmVwQ0Y3UDc5WWRDYlhDbWZoN2FvMXFLUFdNZEhmSEoyc0hkVUswTVhsRXJCQ1E4T1d0WUxScThYSG5vUTV1NURNRlhyZ0habzduTjNXdG9MV01UZTRETHlhRjVISGZqT2plakF2R1JTZ29BeVFMUmNtN3dPeTA5V2NBblV0QUZUbGhENUdldVh6ZXYxL3UwNjB2NitTakNBK3JlZ2pQaWl5SDlVSTNtSnViYnc1eFhYR2FwM3YrUHlKOCtYSlVMWFlHTU02dCtPdUdwZ3FpQUFPOXJMQ3pYTXBlVnhDMzdLSlZsaFlMNlhrYmFQWWhVMWEwS2YrZHRoNXl5VlJ0bEJGa0ovNXJVOWV3YXlzczVQc3pReXV3VXRCYkloeXBibVpFaVNrRDRiTkJDSEpnZmtHTDVUNmdmNERKaVA5ZUxqL1cxUmFhQlZFa1RBcEpMa1YzaHBpeFpLZlhWZGNlT0pFVFFwUzlSOUY5bzdaak0rVy9mSmE3d0Z0eVRmMEMvSi8xOC9JTTlZWnlwaDJqRFZEelhjYlJOTS9PWk5JaGZGT21uTHNoTVlBeEpZTEN2Rk03akt0SStrTmNBZTBsOVBlZCtScHBiSUFmQkZXeGd1a2FTTExTOEVybmdGeUwyYTFSaG41TTdDMlRMQjY3Um4rNEswcEY2cEtRdjNVNk51eGF0NHNWZGFiUXhWeGFub2VpY1Z5Zk5SNFBKYTZLc25VZTErdVBjMVYvOGJwY3EwMlRiZEh6WWJwekJIaUtjOUQ3ald3eDVBVk56eUp0WXNpK1BOZWFyL2Q5dUEyaDVWMS9mc2JROWtTZFBjTjdIdlNrNnFhWFJWTk4rbjZwVVpwbFozR1hUUkZyTXpUYUh6K0lhcW1wdGtNN2FmZlZzZXRBVlNkWXRPV3V5d1o5ZG02bkg5N3FucTV3TXE5OGUzWG1LTml0SUowTHJWK1c4TG52QzE0K3hkZGdEZGJGM2s4TjJoVEx0eXcwZTFlc1JGZjRrblBuSXBtSFV1bTNNc1FlNzZVei9EeDlUWTdWdnFBVXJQbTlyUTFrT0VlZDNrQUdjUTJpcUhsTUgzdmdDK2hqU2dWUkExZFpXU2d1SkFxQkpGZU1GNXVuZzlZSU5WVFhSK1c5OGFLWVdWRUxGay9HT0QybDJXZk9IVSthZzdGeTVDS1N0ZXF0NFc4Qlczb0NhK2FmOW5wdWpCMlZYYlQ4NUFwQmZYVm0zNU5MYVYyMzVmRVVGbVF4cWZha3dadFQ2R3cxL0JQLytGdVdaSWg2RGhMUDh6ZU43NkVDVmM4Mys0cnJveVBPN28ySlJvUmoxcXpqUXdPT25sVmg5QVBwTzc2TnRKNlQwQjZiMEdZY2E4K0NMWnQ0aUp6QXJUNmk3dTV6bmFtL3RxeTI1TXhIMkQ5Y0JrMU9FUFlGQVB5d3dMMmsxUDZQSy8rbHBFeDFOSHF3Q0R5MHFjQWNUWUpZZGQ2OG5DNk1KY0IrT2Rtblo3QnAwK1FZSHh6MHBGZlFhM3RHUWx1cS9HSGFldlpBd1RpMCtMYVh5NEtNTHBGZkRPbjN2TVRWbFZ1YTJHQklYSHJjcnVnSyt6MmFROHlCRWFuRzRXOVYvMjU5WUVuR0E5UnNvdUZTK3FBQkpsRlJ6YUQxZEJEaklXZkVWMXR6QTZBZjA1Q0N2ZHlMSTd5eXM4RFlGY01rbis0NHNaL09ISFE2c0hpUHI1UlNweDRtUkkwemNyQmRlYkIwemNIWVlnOVVsb2JyM0g3d2F3UlVXdk80NEF4U0JlSTQ2djlWaFBIcDQ1eExLR3BzZGszb1pPWHhFSW9OVmVYRlJIU3BzLzhaSS9jb3l4Rk1xeG9HVXRqL29PeURzRVMvT2JyWTBuSE9LUGVpVGlWa1NvN2RvZ0lxQkJ2WktLcXdjL3hUaEtHVU41WEJKY0FCdlVuS1pHWWxRNnN6VHJVVGV3cnFrcSt1S2tNbllXRFhDSCtEa0JlYVpLcmduTGMxd284dXAvUXRSVVZjUVZnS0xMNGV1elZSdGRXTmM5OEpPTDJiOHhKaHB2MXc1TDYzN2FTaExYRkFmSWVOQVdsTW1EUnUxczAzaXRnOUVaekhsck5PazcvamFPRHNjNlFWc0xWODNNeURnVzIrSHBUNkRSTUNKMy9odVJUVG82c3cxV3RhMU9LL0RvMlo1VDBncHRIeFlyem4xSHJ2S014Y1BTNVZCUVNKS0NXT2dxNmg0aDJYTC9aZjc1VFQ4SFg3SU10Y2V0b2s0SlFDWHBwUVlqelpnMDZZTEZYSXVVM05KMnlSQ2U5cHZuZ24vd0NyWVhIa25wcmpjY3JmY0ErYU1PV3EwVnhHa1RrcytLak0rdEwwcUtaUUEvVkdsN1dRbFV5Mk1UajYrQlJEdkNiaUE4MG5xRFJxMmhsVWw4azM3V055K084UHd5QjcwLzZyd25GMFN3dW9HTWxPYWFqbHlucTRSbXliWWNMNDZTb284NGY2a1NoOHpnNW9ZV21iSEZpQU5Ud0dxUW9Ja1VVeUxBZkMzQmNZcm10cFdXSnBUSmFEWUFLbnhLRk1icW1qaXNpL0dod1VvKysyczJNeXYvR1ErVlowa25uc3ZvQWdDZjhtaDZ4cDkxbHI2M2h5RFhhN2Y0VUROSytGaWFYSjJQWDR4VmRmS0tLa08xd09pS0hKeHFFZ2pjSlJMenpaSDI2Nmg0b0NoejhhenlBejUzQ29uQzlRWlNBMWhzbEZYY2p1QWdYRDRPRUxoT3IrWFZCalBhQ092djRueDRtQnVtcFYrZ0RXYlFuMlRLZnlmWWQ1QTFOclcxbEFpMnczT2dEblJyMXBnZ0VqZHZ2WkhqL3EzT040emF5MU4vVXdNallVVng1eTNHZ1J5VWdvMnhXdDJsMDNyTDBYc2dWL3BhZmZ1bjg1M1ZsREZMVjBoeXZGVGUvVGp1ZFM0aHJRL0pVaDJPKzZZK2xzclk4VFUzVlJ6WlErLzg3bWF3UDBMUVpEZ3RSSE5pK3BvejlwM0dnYy9jN1htdkxBVUJlYXVMOTFHWlR4bE0vTUpqN1hmRWZhYlhWeXNTSnBMNUQ5c1NzM1NuM1RDck1qWHV0a05na0FOMVlBMThYV0FDTjlHc28vTTNnZlR1NVdBaC9uWklkRSsydGxKTEVoVFZCRVk0TEtKb0wzQ3hxbThvWlRTZUt0Wi9EK2F4K05YV044VEpGZzJFc1NMa3pDRGhQcEhjaDl1RHpJVFNaWVhWZGVCajZjRloxTnQvUmJFcXZFeUhuSFhPSTd0RkdhbFlTVVRQQ1hjVUg3aTJlUW9oeWxERnFiU0FKWjBGdmE1eFk2Z3NLUzNNMmFXbFR4NldUeU5tZDAxeEFTSUw1Snc1ZDRCSHloNDZwZXgxaklXQis2b21qMjdDdG90bXZxMCsvbVltRno5RU13UWVZd1h4cm5jMCtWdzRsTWNXSDBtVTFXQTUrck5Hc2M3MStkTkcxd0k5Smxqd3VhaEZXU05ZdWVDWFlXdFUxTG85cThmbTY4RS9vQWJxMHY3N0xKN0RZb2tRWWp4RTAvZ2dQZ200K2haOXduMHBMLzRkR3V4VS9pdGwwY0k0SlNBUTQ4TUZ0c1pKYmxKN0NrbEhqQXBqUzU4QWJBajJYS1Y4VWN2QmFaV0Qwc3Y4SGZSaXFYMjNDTWNMNU1GSkM4RVIwWm5CVHo3VnJiVFE3K3IvVHBDNFhycHJEeHY4clF1alpZQVJNWDhFcWsyaXhpZTI5TW41UnFBbTk5R0VycEJ6NGptL1Z2a3UwU09xa29NU2IwVFN5M1hPdlVFZ3p6ZmE1VXBydmloeUFMWnh6Z2RFeHF1d2xRYzY1NEJFaXYyRlNSZGJwT1ZQc1J0dGtnMlFxYVRSb254Wm5aNy9naGJYS3JtMVVYVHA4R2FWR3Evc0M0clc5TllHMWt3bHZIMlMzaXlRKzc1bkp3SGgvd2xhVE5PRmFOMWZLMEFnd1VYQUtnUkR3dzFGbDRabmdCaHVGZ1dKa2NSUHRiazQ0T0xhNlBFZThlMHhQSE5SUlJSYWVSTndlRm94ajNVSG5Vbnd6YzB5WHNKVTI0ZWxxU2lhVjJta1l6RlJqbGFPZ1ExUDF2eGQ2M2QzMW1WbTRTVkI1ZWlHTEUxZ1B6MzBhRldGbXR0VFdHR2orSHRoM0NDNUFIbWt2RE9FeWRRbjNscm9HMUdKZ2MwZjVzbnYwSHNSU2J1RVhjVHRYbnJNSlpPb1JBdWxOeGFTWVhPY0JRRDNSeHB2L1V1MUE4YlM4YUlCTVZjcklEamo3dERoM3YwQ2lQSVFEL2ZUN1hTelpnZzI5NjZJRXNJZVBNdTBSWVdmaUhuaFB1SWk0MTA4MTdnc3A2YVAvc2pmZi9YRlJ6Q3kxdzQzVEt0ZEg3VjNOS2R5V3hSS3JtakxKNHhvRm1nY290SlVJYkV2dytCamxwNzREL1dSVGl5eFlMeUlmRnZiT0djV09yeFF5TFcyT3NsYTZFeE1nL210eXVQeHd4NGwzSXh4a1dSUmltbHdnZzlHa2hhV3NzdHFyR1paQzVGa0ZDM0d6ODFVKzlPN3Yvelo0YUNJTTdUaUNHMlFxdFJwWWpZdklqMXg5Y2V0ejg5TXY0SkNKRFNCeU1rRUZ1azQ2VkwreWNMbEd1WGhwbXhxb0ZjU0NqV0p0RW5BS2RXV09nWVhienJTUFVPZ1pnd3FTZnVNQ0RJTjljQ0dKc2pnc3dpSlhNaHdTUWFYbGV0KzBVM0RnY2JQbjZodkM2YnZEVXdqRFpsYzBnTVVuSFp2RXN0SXBXTFhJLzMzbENQckpzQ3pra2twcy81OThIb3dMdUttMkVRSlFXQlYvU2FhZDlyRVR1NEVkbEtZd040UTE2aW1PRkdHYVlvcjBicExxeTZ4RVBEUytKZndMaHdaakJPbTdwaWlMazVhT1JYcU9pazVuTlJVa2VuNVFhSnEwckozQlRrRUIvd0JxREhyY2N2VHpCekx0RkpsUzZUTm9VZlZJTmdVc2tUNlNoMkh4U1p1TzM0aXhtb3kvelpibmJCSzdVbmhsKzY5UnlPeEwrOWJBZ3NpNE84ZUtpc3FmclBwejBIR09oTzdYTWNSaUNHL2M0OVoxbXdrRzRpcDc1NmIvd3VLd2wrUk9pdXVsS2UwQWlFQjRXWHo4SlR4Rng1QzhRV1NkM25yMUI4Qzc2QXhnK3NQSjNEQUpEL1ZFblJIWmlsQVVHb3BKYjN0b1RucGhUUEdNdnpaQ0Y4bDRYZlVtZFo2bkh2TGtDV29hdWsxd1RpNDhrQUNnRUxyMjVnN2xtWmJJZTYzWHdjb0tQek9mbzZrakhnd1IrWFEvc0FmNTNzL1ZwQ25TaXNlWFB2WGdteW1ETkNRa3ZNZitCQlhRaWVFc1JRaHExYXAwWmRmVml1bEpYTjdTWTB3NEJkUDVyNFlxc25LWjRVcEFRV1pUNzlOYVVwbTh6eTBQeE12UlpBeGJMMCtvVlJWSzZlWElEaldnRmlkTHgvS2ZiQ0ZHdSthYmcxa0ZVd3AvMVd4V3VKcEttalpqK0VnTTZCMVExdFN3c0tMaWpaWXRHejZ3VU1nWHZPOWE4VFNsZTRVWkxuY0xVTDNnZHUrMDlGeDRjT05QWTZISENpUHBHV1BkSnpCWUVDTUlFUEp1dTdRVUYwMStzUThZRHZYV0NPekxvZHZwRm55dXlCeVJ2a0JrT3F2VGFSbWZhVnBzSng4cFBacWlMS0dqa2c4MFdpN3FaRmJJYVJKRHRlcVN5dFJYeDc3bFg4dVRMc0ptU0ZoOTl3TjVyL1lyQWJIcDRmVDF2bzJZSEdzZnFkSkwycXE3cGMvaHZBQjJNaXRncHBhWDZ6NmVIb0NiQlFMS0VHeEtiaVVtVElyaEF3cmxTZ2ZUeDFYbWVXUEV3b1E5WVNDT2xSeVFkZUtSMTUxQ29PdkVuV05CQmNxdVJURU5zQXFUQWxHUjNLeEE4ZjhIVEkrYld0MytEY0VHcWdrampRdDZOT1YxcDhzWG5FVWpGU254S2pMaFJLbUJpeEtvaHk5NVF6Z0c0eGJjVlJhOFpsUm9NUkc5NVpKOEdZak4vVmtyR0lRMEgwM2hBWXk2ZUd4ZEVQWFpWYTAxc014b3g3dUhjNkFDQm41eTdIbTRCZklkcW9NSzdqNTZ5RUVOVlUrVmFtakN2NEtxRlArWlk2TlhaUThGVVZaOHpSaUdoQU1TaWRJbDN2R0YvUW0rcHhTbkVsS3lyY0hCU1hESHJXeXFSUjA5dFBzQ0hXOFkrZ29HQUtrSU8xbzgyVXpmYmNlR3h6M0JTZzhPQjhtdzlqT2JqZE9mNW1lVEhqYjhUNFhyMmNyYUZBZE5qcHBNaWNzamlSVXRjendPaVdKbzVMWkRCYXpCV1FBUjk5T1V0eXhldmVDVDh5YmlwVlBMeWFaNTE5akV6bU1PRGdzUFZ2U3hpbDBJQnVmUGhIc2VMMHNvNEpRZk1mTWNnNjVOYWdPdVNhNlBMMSswQndWQUNrR1BnRlZBa2l4NlZNajJVMXBGYjRBMFpmQ1FMRlV6MkhZSFRsM2o2N0hMazQzV1pTT29WL0x1b1UvRVJRUk5yNjdNWC92SEE0M29uOWVlUzNMbnFURjZWTkFKU25xYXZteW9JV3c2WXZwYkpkYXhNYlVVUmhpOG5mMHVOaU0yT3NXODk0UUdqdm1sK0twcGI1VXJLeS9VYnJTOGRtN2ZYQUNGK0FiZTBzanZTSGNsMC9WWHUwbmsxWTZ4RmpTeTdRSi8yaW1wdExxZDdRMjJjK2VQZXJ1VURkc3Q5eXBQWVQwbnFiK0tZcHRxQi9pNDBITU9mR05Jd1ZDcUdiaDV6ekEvVzBjMllJcmV5empMV3dwNndPSVNId083MFBQNjRBNkFNd3U3NE9GNTlud0RzSmJaeXpPcitmcFJ4ekE3Y2s1Tys4OTBaYmV0TEk3OEY5V0hmYnN6TWl3M2JsTUhSdUlyWE1MYjJPeHFvQmxlYUJta0RkZ2doMjE4SU96cFUxY1E3Ni9MTjJDRW1oRlNtbTZPUlNib28yWkk2cGt3a1lXUjdXNElQNzcyTklEcW5XZXBhSjRRY01obUdyY2Y0ZzRZc1JwRnVwdnAwUzUzS1BUWmQ4TnNRdUloOU1XV2VFMXlwRXpMRVVPbzBPU1I5WjJtY2NWVjEwOHRxS2lkQjdHVUdRRW1iR1ZMdTV0RGJJQUszZWVJUktOd2RyajVQUEtvdlhqUThWWmZ2ZWNSRUtoMHBXZ3lqT2xlcXRkYlRVLzc4UnVlOFU3bm9xckRoWXZwbUlEeldzT0FiTklPQk0zN1I5T3lJYXg4K0t5d2FEOWRCeXRlc3VyaXJXS2lzQ01zQ3dHOTBwYXBVQm8yV2V6TFB4WFFkbW1lZnNuUHIwMjhBcWdVdVRSUFpURjZQdzducWZJazZSSmVPZktLMmpCVCtITVh0WVp6NmJxSE92UWhZVjBSQmFENDVZQUo0QTZwWEMwSXJuazRha2FncDFOR1NNYjlkcEkyUHZDSFRENDhzSnYxK2NpTlAydlFpVkdtN0gvZ0NCOUIxdzg5MFRXMWFXM0ZhS1NjTTlac3lRdnFmYlhYemZQUFlqcGJiYUwrdUJWS2N2ZkhGUmhWbW1EVHkzQ2tzQ2U5dEY5MDdtNHEwWjBTa0dsVm5sb0RvV0NZWFZ6VUdWbTZuWS84M1BsbkM1OWRzbGlxSklsQndFTUw4bmlJUm1CbFJiQXpUd1J6L0hwU2I0Qmtsa28zd2lnam5hc0srUWVLbGhlU2J0WW1lMFFBNFZJV2FIVkhMbWZnd1cxVk16WWIvMHRiSDFFZSsrZ0JtRHVrV0xsRWM5OGVXMmlPR0xhSkQ4L0NNNWl3N0RoZmFvZEVLNFM2MEt5Yk9yTzltMTc3T2RkYXgwQ0ozVDJsb3Frcm9tQmdXcGsvYXQwSmlTVldDK1pCK0ExdGVRYU5OL2tic2FQS2cxRE5SZFBNNEN6Mmlma2xmcjR1elpmTVRWZC9MWGNYSUxqSis4ZXNuL0xtSjNhaGY5alRJcWthSE5ISXBkeWZrN3JEZTdZcFAzR0dOUE9aSkRvQjFZb2lWckhOUmdka3UzY3NXamtyaVFGSUNJaGZzT1M1WkwzZ3VkcmZjMXhDc2pBTW0zczh5L0EwTk9BZ1JCZFpaMmVLeFJ6WUVBUVpOeUlMbzR4NjRvd0ZwRTNrcWNWY09XWFVuTHZDRXZFZlVNTEg0UitNcXZMc2FMVXcwa3docTNDUjBsQm0rK2hIVkdJVTQzbE42d0lZMFR5VkQrdzhGQ0drVVkzV01LN0tUU2t3eGNmSFBZeWlEN1RQNUswUzZHUTF4L0VSZFo5a29vLzRPMDFNZTdCV2tqaFMxWjYzUVBHbHI5dlY5WHVPNFpqcVZJRWJBaEZFVFdJWGRoa3JyWG5BdmRlVmp1R1VhOEozZHcvb0ppeGVUc0szeGpQeXYzRzFlK1NDV2Y4YytKRjY4KzB0VlY4TWhyTVU1bGc2SGFXKzlPSjJOZTFieGpFb1lPamdqamFVM1dUdElvQW1SR2lDUTdhZ1RFRHNtUzVrUGdjdVAwcnlWak4rK2t1SVpCYlgzUXRybVBvYTlUcGkxcmpNbVorNUtBNU9ZYUcrY1NES1NRQ2gwNjZIbzNXSkpZM05XRjZ5NElSS29nWmJkanRwOE9nYmVURUtDaVlGcU9jRDJtTWxyTXp2cTcwUFZqUklKc1BXYmc0dnpPeU9nRWJGaWFTSFpIaCsxWmlrTVFONko4Mm95N3BFczVjR1FodEhCSHRjOXVNWWQ1c2FWbS9mdUl3RFg5L01OSUd6LzNrcGxiMmc1V2p0T2JSWXo4TG13RFFVMjFhaFh4V0k4b2Q2OUo4MjFnMmw4SmRtWERiaEtlN1lqOUprWHdYV0hNdGxHWTFueE91WjdpaGFlWUlYbHRNd0hPMHljZi9WTlRZcytzNmREMFRteXVURC8wckRJRHJoWFBHRHNxUTk0U09ENUREMngzNUJlaE9LUk9JbVg0QjR2MEQwVDQ2WDVSWHZGNGUxSjNtRHlaMnVVcWhKVkFFY05zeW5mOG82M2F6bWJkVlN6L3RZcUZHdDhDMFVRT2tlTTV0SWJEb0p5TmpHR1FjR05LMWRBZTZWekk3R2sxRnplVjhydnc1VkJtVXFhUHpXNkxKRHhLRjR6WjRKZ3JoaExqZ2RjTmhyTEhYRjVBWXVzcTg5QTdMTzNyZlc0V3RpM3Y4TkM5a0pkTWVUSXZnNEtJamtCM2Y3TjQ1ODNtV25oNXRoOFhzZmhGWHA1OG1ObWJXc3pLZTB3cG9hd3pmYnhZMnl1S21oUkFEU1VPVGUxdENZUzNqWUVQbDZ4Z0VjZUplTUx0OHY2dTVvRnhodVBWR3NpZ0FySGxhUlhoYWFsczM3cVU2cFRhMWRrOVBIOXV5eERKUlM1djFCd2Vncmp0bGMyM2hGSS8rRnppY05iUEtFWVFoMDljaDd4SDhvcW1xc3VEWTVTczRtNTVpeE16MVFKeTRYN1FKZVlDcFU2TktxS0NMcDh4YUd2UlM5SzZYdUpYUExrWVFrbnhzV2xqV3E0VVRvKzNYcXFpQ1laNFNCcFBQT1MzRkVPV3o3Vk5rR21mbkRFNWhiTjUzTlJON2s2bDNIZW02NUVsSjNxcjhuSWNJQUtLbElPV0RUWnJxS21ZV3BxL1NEVk53OU1xT0NIV3cyTHFtcVZPelBoV1RmaHZYV2p3WjltN3VMUjdGOE1PSzRnOEdqU2ZxVUc1VVlqM3hiMGtuZEVXTGNjQ3pCZGIzTmRHektONkhRTUhTRFROSmRiRzZILzd4UFFsbGcvaUNNVVZJUFBTcGp2aHJSVzYyWVFSdU9Pd2c0Q3p5M0Y2d0U3L3B2MEZXTFM4QWJsSGVZckNEQnMzWmRYNVRGek15ajJjRCtwbHBGak9EdENLY3MvVDg5TFlQT0tHeWF1VVMyS3hMK09MbGl2VDRNeUVRYk0rcFJMSXF4K1g0dlhBT2N1MnJReWllVmcvendIOFRIRlBZZEVzL1A3djQ5MkVqdGU4KzIzd1lMdzM3Nm50MUdrYkZNdVlBbzVkSmVaSmZZbHpEL3ZlZGhiaUJRNno4SG93ZFFVYWxaUUxYSkdZd3RocjZJZGNmYURZZmc3WGxROURuQU9BRysyUlF6YW5JVHJYYUw3dDFRTkJNN1U4aW5GcTlZeGFRT3lzRUYyN2tjTnByVzBreTk3Zys2ckszUTI4OFMzZzRSU3pZejZMNVRvZjFFQmsxYXZwdGM2emJQUHJ0S1BPQmxpQzZiTDEreGt1TVl0TFFDWFhsVDdubUdJWDNSZ3gzQkFxWnNRR1dSUkZ4UWlFVis5bU9oeVNMWVJ3SWQvNUloYThHN3RiaWhTRzkvbnlYSFVrSUVYcHZhMDAyK0xSU2tpdEJIQzY2WFNnUk1xQWhHR2NpOUNVWUREV1BOYTVxbm9kZVBKQm9sUmthSkhsR1BvQ3QyUTlRaWJTS2wyT3d5b3JLQ0JiRGcvbzVzQWJXZmFyYnVGclF0ejNQOTVpUjVOV0NTNHBEOUludVFCd2xjMlFoSVBUUmUzKytYWngwc0ErcStUMTdWZnNYV3pVZWx4eHl2b1E4emVMUFMwYm51MjhtT0NLQWJFeUZhbUFCSSszRUpJOThndGR4RUpKRlN5ZGRHdHhPYzEzaXArK1Zyc3hmbzVlZldqYU1Jdjh3QjU0WVBZR3FHTXdBdTV0RFFuQTUrRXU3b0NaK1JCMVBhcjludVdhT0F4L2FVZHprc1hHc2o5dksySHVWUlZ6UWhsUjc3K2lhSTZtZ3NOMTluYWJ5dkd2U0hFbWhBREQvWWtmL0NGMnZHU3MzL3JNQk51NHVuVHNYcXQ1WTlyaEtROEdYeFdDY1U0Z3NrNlJFMXBhM1FSWmRvbS9SQXl3Qk9vbEFZSHBOVjdiUTNid1NTS1NjeWVodUlyMmRuMUo2YkhjZ0NrbHVZMVNHUk1BeVJUWTNNYit4emk0a1BaSVNIdkhDVWo3T3lGSVQ5aTRKTDR5Nm1FaW1MWVFsQU5OMGwwR0k1aGt6UXJkYSt6elozU01tV1VhM1gzWTBoQnMvcDVOc1RLUXFDdXhod0xVWFA3OTZXbGpabnlLRHlRenVOc2RFckpIbHB5M2dvT3BlQ0EzOTJkQWNBTnBqZTlyanR3R2gzUzNGQnhMN1RvZTEvZUZrNVdmOTNRVzVpSmh0TGJucGllVGFtaEdqdzhSajEwRGVSSFFDR2lXZHJreE53WDR1ZW9YYnpsSi9RZmxVZ0hTMXJLczYyeUs5RXdKWm1NbS8rTUFYVSs0dm1IcjN4MnBjcncwUUZHOHJhVWZmdEdGZnA0SG5tMXNKaWh5RDFZQ0FsbkErSzF0U3dIbUtoOHVIUU92M1BUbldJc2NDZEFQTjB2RG5jSVJ5aFZhWFBxVTA4c3JEcmpIdllZamFsOXIrU1JkVkJpcGVkZHpxZ09MR3VFZXhVWXlralllaytqZUMyQ3Z0K2oyZCtidit1citqVjM0ZHM5THZGUisrbVJyd1BVTXpHWmU3U0JyN09iYUFwTTNVSWJmbTVmWFZxSHVKd1hkdzRuRWhoVEtwZ0hKQ3k2dzI3akxTOUpnZDBlcTV3d04ra1lBOG5RbkQyTUIwMXU4czg4dFhUL1QwdUo1WjRlZEhrdVo5eXo2VFAvR2ZoR1FIWW04UTZVU0hFQUFwcjVRVHVUQnh1bDFNTm9jUDQwaWpERDgrYzRLZWN0ZDhMREtET3RxNStFVTV2ZXVhTSt0TzhyTS8rU0dNV1RrTUJtNEpBYU5ORFhZUmlDNnk5MXBVYzEwdUJ3dnlCTFduMDFLTXJjNm9xYzNYS3hLc2Y1Q216T2NqKzVZSlRBN1hqbjlRTnRrZThFRjJKU1RVcFhLV3VYbVR3TEFSaXRoTzZzYWovNFBEYnVwTUZ4clpBWUVyWU1saW1RbnRWanlBTzR6NGlVUzhhYThacS9kY3Z6QWkvSnBPSlBBZVJtWnN0RzdOVVBhUFZOVlQ4dUNpaFY3N1dZa2dmUWFRcU4zOFhERnR2T3FmQ2ZmVm81UkJEazZPL2RYeHRjVkhBaU90VGs0NVBCdEIvVXJLSDY3YWhwM0pYNTdCdFdXd2pWVmZlMzB6VFIwUTJ0UXpOUHpLdlVxLzhXVEFYQnZ5dnZvc0RsS2d5QnIrQW5ESVl3T2pCVGJOb013OHN3R1ArUllQSmFXOGY2QldmT2hxOWM0RW1POEl1TUFVMU9IVC9PWStWVThLYjI1cWg3R2VBTExGU2l6YXNpU21tY2JNRTFGY0dQcVNjQkJlU1E1d05kU3NXa0RXZXRYendDTGV2OE1JL3RPTHo4WkFMSm4xYmhkckczTkNvV2c4UC9nM1lORklvdG9ZbzJhUGdneHdjV2pRZUsxK0hNKzVueGhHaGdOcGNpeVIwd1BnNTdRYjgvWkd3MXFWWmtQRE1TM3hpK1JzR3lnSzlkWEpNK3NXMm5IaUwrT0NDODVZUkpVWjAxcXVXSXBjZHkxWnRGbktsaVlEeHNFc1RBK05yQ2JFNDI1ZmF0YXpLek04WGtZcnEwbXFvY3dPbHVPN3hicXUydzZ1OFNpdkpOSmMvYy93QStWZUJoMzlvLzV4UE1zZEgrS0NOam9CSmh2SUpSYlNOUXRBVUFmcXZkNjJKWVRTVUtodkxRdUE3TTRPalpFSzBQV2FPdU1YTjM5NmlYd0NoM0tzUGdocTJLSkhBdTh6QThGQlhxMHVGamN1citWVklhU3FtVGhTQmxkY0xCWjVXVzBOSERQYWZYUk5ZdXg5bHAxYTFsTitON09oNWRmWUxWaCtQb3c4T0cya0lQWUQ5R3h4bVcrQjM0YjNMeThva0JOOElkVURHelBiNCtVQmNFS0lWaHFKcWNMTURtSFYxWG9yUDYxZ1o2ak1TdXBXY1JHcDBsMXNqbFpETGZKTWx3ZCt5MmpjQTkxeTBvY1YxWW5IZ2R6eUhFcGtBa1ljazh5Vy96VXZlT2NVWE50Y3UvOHI3clMrSmpHbGpzS2JZZXhpQW5xTEs2dGJXa2NpRC96Rmk5dENrS2c0RWw4Y1lKMmVnRVZmQVQyd0xneDFsWkpxZURDV3lwcS9mQUx3RU0yakoyV3ZwaGNuYlFtdjZKUEFiVHRzenM0V3FJWUY5MHVmaUZjc1UyWmg3d011Vkx3UVJzeEJ5MzdXSzR3VTA5MzNjWDVjc3BoK3poM1ZGNkdFeGJhbUptTmZqU0pyTGlhNS9Jcmo4OU92YWtjT1ZTcmdNVWtpWnprQWhTZCtTK3MrZzgzS2NpNXA4QXhKa3JtMTBGRFhkczNkQmNiaTdWY1NtYnlWNDcwYnd3Y2E3bHdQMURZMmluZzhLNkZ4dVBkbzUxbGFtUDlrZFRPUlV6Ylc4cFhtYXgwdE5OV1ZGejVuejM0MXJGWnVpRHlYSFpycW9wUGVBMDRPYnA2REp4NDFwWWZtcUd2cmUyd1lKa2RBbjdWL2dWM3Qwc1BMeUNESUVPTlB2cmVPaTIvNXZyNlRrbVYxcUJMaGgyNGFnUDdqclN0and6Rnl2YkpNUkw4cU9YK1pBMERYUG5yQ2U1NWVuNks2c2JaTnd3aGQ5NktlKy83VVI2M1VKM0xyc2pBSVJpMUs3aFZtV1dxVGV4UzVQdnR2b3hJaHN5OUpTNmtmNnpJM3NuTzlOOEJsaXlYL1hmU1JBdmJYanZZQnQ5UDBST3NGa2VJMS8wcGxkOW4rdWVkWVZuVFZwcEpoTEx3b2h1UHVGS2hlUWp0dnBjaWpKZ2FXSUM0bEtpaXJsRk9tcDVJaFRaUGVmTGRKbHJBQm82bHZUcDRRSmR1YmNoaVpSMGpOUTBhMWVENTRzcTAwQzdnVk1HSndPcW1Zc3NPQ3J4TXVISjBscHZxQWNqeHFTZ1Jzamh1d1VLbmRoUGxnUFFPOGwvbFIxa1dFZGl3d1JZMFB6ZXE0UGdrQkVhY2ZQT0lQS2NwZnA0Znc0WUtyOUxDVHBCb25SZVlWL2ZDRnNvRHFEY0Jhb1FRNU5KOHlxa2Q4czF6K2FMRjJvZ0l0c1Axa3QyL0F6bTgyb1czNzVMV1RYZkdIaThzaWxIcFdQSk91STZ2ZEdWQlJIMXNwUGdPeDh4NEV0L1d2ck84S0pwOWZNVVpqY3AwcnhTRXpmUW52WGpxTSs4Z0Nid3Q1YlZLUVlMcDMzbHJ3b29NVDZxR2VjZzJ2MkVEaEhOZ0E0VU8rNk9oaVRhZ3c5NFpOaGdSNG5HYVYwUFdkc29WeG1EUEg0TlViSHhMQU5pT2FnRmpPTmJibVU2ekswOTJwR1ZSd1oxSWVkdmc5eVJyemdlT0J6WVRuRGpGZXQwNk5MRU5VVlBXTzlQMCtDQkdYQnF0M1ZoSm5oOHBuWUx4YzBoZjUrVllDa2tTTkFqV1RwZGFqblkwNnNxcW5pQ3FwNzhmK0NqUkFBUDZWTVVpU1RvWmhBTU5DSEo4VC9KRFpRVWQxemVJdlBOeVArVEswNnY4U3FQMEZpeFA1ek44NWlaK2JRSU9hbDVhTGg2NDFWRWNYVlFlUnIzOEhUSDRDc2VSTFZlN0NDK2pMSFRQYTlKY1ZXY3MvSUNjMWRNVlJoQndxK0dNYmdmNWlCbFNvUXpMOUNkMHBHQ3dVTlduaS9pcHRlUzR1L3NrV3pVSW9BRXlIUXZlUFR0SkRBQ3VzUVJhdDR6eFU3Vk85eDFxQ3lFR1pZNVdDTjZTY0NhRHd1eSs0NG5IMExqcG1HVkVrUXJoeExzMmhiUU92R3pZZlIxZGxVU3NaKzg1ejlReno2dkxIZmYxaTZDWkZIUmFnOXRMOWxhZmt6VDhHZTBQRnNxV3cwWFdodlBJd0FTc1A0VnFTVHRSWFQrYTdkdXRHY290dGcyS2lrUWp0UjFJaXBzWGRYenViSm81cGIwcjBwWU4rM3FDSlJOYzh6ZWJqZm9xTzQ3VHdSODRKRGtKZHYwRHFXNEhseW03dW0yaDcydDBsMzJ3WmdPR1d3eXRJRXkrbzFMdXlrNzFhQ0syQkRuS0lnNjRNQStYWWJ1cUM5VzduSUIvcG5MQlozMXBBY3ZoR0o1YUpQQzJyd3lVOFNOaWhMS1pBT1ltdnR1S2hTZ01lemZHY0EvUHhEMVByYnFIa3UvTmpJTmZxUVJlR1ZWSzNURyszYzg5WUo4dmJhdmRMNHprdnMxRmFyTEZLNDQ4dG1jZkpMREFUNmNqSEJibnMvTTlkNUhrZWYxZ09JNFh0QmE1UFpuM0N5akkwODlIeGJhVCtIRXRUNnlwWGtSNlZ3L0ZFcEx6YnNuUXFLdzZCMG52dHU4RHcwOXlmVFVxVWhCU1JYM2ZHUzd3US9rKzFlbDhJajBpVUNadUVLVi9ZV014cXN2RFJqT09TVmNiek5YZzlJZUFoeEdFVy9kS1hta0RLRHdVNnB1Mmw3SkpDK2tGYWdZOVFjT2hZZDkvRXFFa3UwSEdSWDlJZGRUZzI3bThROFUxSVZEM0RYQnBXWVd5K3lVZmRJMFNVYlcwQWZsMTg5dlJUd253Q2NnMy9XV0FDZ2d4TlJyZElFY1ZmS2tKbDhOM2l5bnlyVWZWQUl1RFJjOUJtR2YwVjlKMk5WcmRUcjhPaFRuOElxeFQxZExHUnlFZXE0TGR2cnVmcHdsekEzTjA2QThZOU9mY2Y2M1NxSjVuMEQ0b093U3RZSytrN3IzSlZ2NVJFK1grejAwY1pyMTk1RjNDNklGWDNmRWtCUmpRb3lvc0ZPa2RudTlIeVhyRyt3bVRKUWI5dEdlcVdWT0plVU1RMnRqYzl3c05RbEM5VSs1a1g2UDNXSnUxWVRGNjdRODdHNzVIVkZ1T0N0azZadk9xUE5yMkR0Z3hndUFBMnVGblRrTVRlaE96ZG1YYVpXOE8zemp5OVd4RCt2QnJXRHFVdUhIVklzcE5ZS2hQWGVnUllTcUxBY1l6QlkrYklzWUFSMFcyemdHZFpILzVEamdsckczZzVoRm1FaVR1bGh3Y1RuUDlCS01laVVFVy81bis2L1RsbGFqOEQ1Y2ZoNndXRTVQa3VRaHRPbXZXbkhoR1RuT1cxYzh1Ym9yalcwQXpVb3dVc1NlR2l4bDdwYm9TOEJvQjZ1bG9tdDVzWWFwbldrV1lZWDJUWDUwUXFCM3JVSndiSlpwUEt6VC9kaTVUOW14Z3pJR3RZK3kxTG1ZRjF4SVJ5ZEZRbTRtaFR6VGNmMXBaWWl1WUtWKzBqNGZTbG1XQUlhSlpiY3dpVTZiNnFNb3ZVVjR0SmdwYWlyakxVYnkzSVRST1RuUklBRjBCRkprTThkTzdtS0Q0OHJiMk9jL0ZCU2V0RE5zUzhHaGZUa2k2VVVZOU8vMTh0ZzBIN2FmS2tYb3NvYlh4Q1c1RDFXamJDK0xiRnpOQWYzVXU1TnFlcGtGWUNwQ1NjQ2dyYTNMSENVUDQrNW5qbkxaREJyUmx1eVAzY1AwUC9lVFFwMFJpWm1lODhtSTYzVTluVTNTUUV3RE9MVXVEamMyOXNSMGFrWjNGeDR6cUZJM0cySVpDUVM0eXhBNEhkWXVNU3hlN2QyNnBqS0NZUGlBNnpGVnpEL05NaUwveXVEdDd6QlpmaGt5Q2pOMjJRVjEyV01jZTJOenB3UzZjTVl3dTZjN09PZFAzM3oxaFk3YUgvTk1Pem1nVUdNQjVGQk5jdXp0ZDN0YlhuR0VZY01TR3FoMWpCL3pzR05OOG5KSEQ2M2N5dzRFK2xqdmV6WWpuMTFCOWNGTWNTcjFja21IYmdDUmgxNXVla0VkcWRjMUNZbk02NDV0UEg4cWFDY3kxdVBYdE5KUkRMSGJ6Y2dMRnBSV3RobHVnU1J5ZThhanFlZGNHTEFnS0hpVkVYQUdrVzRPeWxPbmNHSXhQL1BrKzhkb25ZbWp6bWcyN2Z3V0hmbWZMSWVSY2ZoMXFic2pzZ3hpOHk1WlB2OE4zOVpmOWx3Vm1mNjhVc2J3aVQwcUZXVEF0cmE0RXVrTnhtQWU3NUMwVS82dHk5dENhbGhFdWFNNlg1Q093K2lKaXlHQ3cyY1VGM3dRemliQ1NJYjVDeDBWZ0p1R01GVWk2K2gwcFVFVWlVK1RnYWxmajdraStoVGZEWXZvdTV0SUNTYjM4UlNSOEdsMU1PNThtRWQ5eUtwOWFYdE5DRHNUQmdrUGltSTNUMVluNi9lZ3NZZTE4ekVCYkhtdXpDTzk3ZG9aT013U1FTUThNVXhoK1p1Q0xxK3BkdHBMYUlUNis5ZEFiTU93bnllMWxjU2NpTEkvUFdObEJnTFIxYUQ4akhZR3EzYTJsOW9MT2NBTlpDa2h0ZVljSzBkMy9ESDFxS0pycm14a3VaWkxBcFNEdFVETVhjRGJnRG5WRS9tYzBnYjV2SFFUZmRTc3JvWjRNN3F1Si9memJXajREa3JaSDJqdFlNU0RxdGppU29xc2NXb2thYWZGTCtFOGhFVVVnY0FlcFJNZUdVNmRiVzhKTWJpb3Z5aFRnNXRQVGtGZ1N2MUkvWk1NZTNiZEp6RE9zWHdFV2hwUEpHYTUrN2I4SWNtdStwY2VMY1ZTSDQwZzRjT2Z0NjNmVmo3dGQzdmFOUmdQWjlwUWljZlFVR0lQMWRwdnpWVnhBdDNTeklkRUM0V2hrNGwvUUVNelNkSUxaNzZ1NHFsNGExUnorMVFHZFo3bkFJalErakxoN2NjeFFqcnZRUFV5ajBqcmI2R0syMzBEck5DMnkvV25xSUNKdExGVVJBS2syQ1crUlIrWW13MUdjVDRNeWVKMFVab1J4K05SclFYT0Q3SWE0L3BpMUxyaVA3YkdVK1U3NkdVR0JlcG1KZGdVdXpBNkJZSFZRb3d0MEtGdVd6R2RjTmdvTUR2QlNtUTFEbVJ3MHJkTFpZVlIrSmJMRGFuWjlBMTF0SlNPUmdUWVd4R0RUU1luVGx3SnFJSXJxRGpGRFgvdjVmelBnNlZWYlpkTE1yaVNwVU9TVWVabFJ3Ujg5aFdMOVR4SnV6d0xYa2dQTEcrc2pCZnM2YUVuVGRxM1FDN2ZYdiswV1kwVzE0RHNkb1pSWFNCdzQzNkR2VVcvd2k3WE5PZzR5Vk9vVEJQTlJrNmk3eUJCZWhxN21lQ0tUeUVCSWgzZE9BMzZBaDFyeUtFcHpuNUJHRVpNNENzZzd6bmZCQkdjZkQyOHBGeks3U01ieStuVHJlVlMrcnR6ekdBSGNCd3d4aE4zcXNHODV1WkxkRWMvcWNXTnBhZ09pT0d0blVqMEQyeTNJSXdOY1JwUmVYUlVXVFl2YUYxZjlleVhQN0JPV3BWcGU4TjRxazF4OWtaTm03VVlhNlA3ZlRiU2NCWTdWczFRVU1qRE1yTXdFcXJDK042TXNGWGZNZlgxc2pJOWNEU0tYazVLazdjQVJRWUFuQ2Z3ZGJSckJpNWtjY1VlNS92SG9EZUM4Q2M3N2hqb0t5Y28wdEJ4cis3R0JMRWVLNEFtcjBTSndET2ZCR1IzUVlwM005YjZPaGJiL09hbG9JRXJlNWI0dFV4N0d1aERUSFhjTERaM3FyS1dRN3NnaVlTTVc0ekdlcjRNOUFVVXpRMSs4Vm5FL1ViMHV3Ty9kU2J6MitNZzZqMlo1c3lESS9Oa1Y5YVIyMDdsSnYwZXJpelpMTzZHa0FYNW1kTWZNT00xdUNpVStSbkZuTElsQ2l6a1Y4MjdLWmFqZ040L09meWhjNXIrZWZjQXcvZUxGUi9ER0s5MGFwRTM4TTM1WUR1Z2U4cnRhWDRmSDV4N1lpUnhMK2ZGaXBKTUxnTVVPYmFxNVFPeGJZOG91TDUvTTZmNUFENE1hcVdGOHA4YklGRnRESkFuR1JJNzdONk1kY2VScmVFNWNSY1B1Ly9EeWI1ZjFlWmFxOE1YUDhyazlabFRCNlZoSDVrK2NHY2M0THJJVkpxODNKaVA1Rkx0TGdzNTE4NE5McEpNRVdNR3J4OFJ1RFgxVHYwSW9GblplQVYxRDJldUF4a0YwVTVyby8yWm9vanNwN0tKeklwVklxSWJPSkhGR1c1ZHlKTXRPb2puTSt2OUIxdWkrWXpML05rdHpmaXFlM0UzN1hFNFp1YmZXcnJ5L2VDdTZwV0J5MS90RWdMOVRJeGZzMW51VVZwUGpzanQ0dXZRM3Q1aU0zeTJ1ejJyQm1MR295ZGNMOWt0UHZWRU0yM3NTbTMwNGw1RkZLRG00RVJvLzZKWmIyZVh3UU9LZEdqOXpJU2dPNk1DNGM4M0I3SFJ6bFpVd1lPTkhmamRza0dSK3V5OW9rNEd4V0FLQTVhN1JwREZ1dGUyWHRnQzVPNklleUxiT2czVDZneWJIcnkwdE05dkk2czQwSDdXOTVUVVh0NjFNdTl0WEVxNmZSa0gxMEJSWU9rK1AxUVIwVDk4cm1hbXNySXU2ZzhHS0lxendPRUI2MzRhWGpFSTlkdytRazNTV2FYNTExT1N6NmZLOTlFRDdmUXFwRTNybHcrUFh3YkNoSXdVMXVZa2JxWUErWGRsNlUzc1lIdjNzTzZwZVNaREZscURjaTFTUUZ0MHZXVXRFdE1oVHdLdzVLWDRDd0hINitpUUVhazc1MXhheFE4d29ZczhQU2tOVnNsN3hrdkNSM1Q1QVI4anZ6OFA3dnZ1Ny9NdldpL29HdGZreGwrbzVxeUhHWVFReWg3VFUzSzM4MTBDUEhZOW5ocEhyeXBNTWM1dzIrczVTRVE5SGdhWDA2RkVvQjBId1U3eVVoNXVlcy93MTVNekhiS0VuS0Myd3NDTVpWN3lyVUtjdFlJVC9EdXdLTmlnRUNqTlNDdzJwbnJsOEJicUFOaEtjc0VkaVR6c3haZWlWT2Job0ZnZVVQL3FOMjdLWDRKcDN4OU8xNFBvVTQ5SSt2TEhidytudkNWanV3K21NQ3R4Z20zUnl1c2QwdXloeTVkelJQYjEvMmtSN2lNd2llZzAzcHBURG5NZjdHOHFzeTNocU1kTW41cEwwcHpQT21DOXlBT1l0VUdLNlAybDZBTFVNUWhVV29HM3NrZ0VEMW9vT1k0bDNaS3Y0aC9tdkk3d1l3aTRNWk5va3IvSitYWGZHQlplTkxISUd5WGVXUk9vZGx1OS90UThyNVFiVndxdVozMEdRcklSVXVxOVhHWHh5blcyQ0pZT1hTME9TcnBYa2ZmbU9xZ1c2eVF3YUdoVGZvbHRCTEdweUZoeFBPbm9saGdyeFJidkJtRHRjT0UrMyttTDk4Q0IvS2tFWnFiK25oTmp6WWh3OGhmSXg5TCtjazlKcFd0MER2MHZsTFVhZ3dGdzdIb3pTclpjWE0welFtb2J2aUFqTnAxWWVxZ2s0S1FzTmNrbFZxZjVvQjh5NUM5d1plbUxNYUFESThpaEd4dkIxeERvaTR6VmJJWllVY0F0L0h6bzRKbnFlTXhsRm1mcEhHL2tXMUxwZlNZTHpNQzY0T1FBR01QejRvUllMODczZ2tSbXdJYU91LzduQndMTXhZZWZuUHJ0eWdvaFJTaHU4ME56VjlNRFFZMTFuUloxbVdmclRYR3IvRzZ5TW9IN0pidXU0UjNTRVp1RjdxVUhtUFhRdDhYKzhkOFNwZzN4Y2RWZ2pudEZ5UVhIMWt3RmRzWmdWajY5WDEwUkx3cHIzbEM2aVAzUjBQOVhKM2lSazBUNjYzSEZHdUVLaXNxcmhmWmoveTloeDYra20xM0NLa2orMkZKeFFPeXF1WE9EWFNsbVYvSlVsSytuQVJ1WkpJeWxPeXp1My9ZUXVZcmFCOXBVY3d3RWtlUFRaQUk3VjdBeHl6WHRkK3ZnWlpVZ1VnbUFjQXd3RkRUWmRHUlJVbE56NTZlc1RzNm5IOUFDWk40eERjbkdIZ0t1dk5zZE9oVDR0Vnd6MllzbW5wTy9waThhOUtHbkkzTldJQlNlSXVWYlhPZEN6VVdzSTJGQlFSSlhjVTh4Umc2UTFCampQVGxrQmJ2cDV5eFFRLzRCM3htZUE5Y2lGYm1uQ2ZlS0E2bFFNQlVSV2t5amkvcGJrM0dmREhTQmw3R29KMFZPOCtpdlZEbVJNRGdhbkRveFJ1OE9abXpsSmd3MmtlY1Jtb2VNa1NBRVgxTThjRGs2Zi9ISHJrSkFPbTFtZ2VUZWFhYWpJWEd5aWtOaG9vNm8wblFRTTU3UzNLcjNlaC9ncFp4MVhGZmVyejFUWDdWUEowUWljNG95REpnTzZObFNMUXhodzdwMGtpb25qMFQveUxjN25RNkRZVk92Vk16a3ozUGt4NUZsMEJFd1FtM3NJVkxjcDFuWExrczJiMjI1ZnVjVll1aERSNkZ1Zm8xUVlQQWw2ejhocDFmaExGdUwxRjRBWkhaVG1YRWNiemhxRVNEZkFKcGd1N00xVEV3ZHJxTkc2My9vS0UwWUtyTEZqdDB2NXEyM1FsRTkvdkhFb284MHhHNTdObnFsWTcwNTFDeEtmSHkzSGY4L2VVV1NRUEVoRy9wYTh4NUk3SnErSm1zQWovVFFxaklocWk5YjczMG5jZU1tMTExbTQ5QmRXRWtjSTRqaEpoa1VPc0pRUjg3VnFXWlV6cElaODlUNitPSVNMT0RzUlk4ZysxVWh4eGsxM1l2SzJSb3BuYnhxRDlSbTJ0a3ZnSXJvTVErRHAxTnlCNDdHYzZmZXhqcUVPVTAyYkQ4WWEySGVocFVhTTZqY2JyQXRnVC93aExhVnpQRHd0YmdaNHE2ZjlrUnVwM2lNREl2bUZiRktmYVdPMlYwZURkbVBWM0k2S09UVzIzOGoyRmVLb1lKWFRBVGFaUUo5UDl5VXVnV2wwQW5qLzQzNDI1QlBraXNrLzJnK0tPNk9kQ2o5WFdRUmIzWGM3YytxV1FsV3NDbjQ5WlJsTUJ3U1lhS0FZQy9BWVVXOExBcGh5c2hLWVNOVmhqNGJwRWR2dGN3c1BuallmbS9ielJCc3FWeG1YMHlVYnRPazZDeTdOZElVMEg1ODZtdEhOdmhLcHljQ1I3Ylk4OWtPaTREU3UvQUExSzIxYkF2NElpbkdYUkFkVExudGpyTjFvbWJsYU5OenRtWjk5Sjk3bmxQN0FzeVpUNkJFaW55Q2gzb2V5ejduRmh0M2d0TVNpMUw3NEpqZjRNcStNMVNyNmh2U0luZmhWRm5hSHZWK043cTA1WFVycFFpSU1UZlFXTElDRVZXMVJZWHZXUWZPUlBUbWt1aWl0bHlaRFFWS0ZhK3l1S2QxSVVyNXl6bXBtZnRsbFRKSHMwMEZnY04vSEU3TEU4UkRPeFpkcEs3SlYyclRqQ0Zzd241OU5UeXR3dzdaT1hoR0dvVWtSQWE5QkYvSktJS0tlVGUwRnY4bE9lSkU2ZW5RQjRlbHdTempMQmpObFREZGhlcWE4dkZlbklXZ3diSWNBbUNIVUVhWXZkUkNVK2hwMng3NkR1YzY0N0NndHRmanFzZjdmT1FleGRRSm9ub3V4MEZpOFV6SEtUZTZJTzJBcXNnc0J3R1JsejRhQVUvbEtMbnRIMHN2MWtETE5LckZkTEErQTJ1NjA4UFo4U3l2VVh6bXVXWHZIVDVjWVFheUhmVm1keHJwa05MMzBNNEF1dlNOUTV5V1djaTJ3SnlOWDBaRXpJSm5wQnZYd1NIMGZzcisvdmpiaWRuam0xNzNuWWFaSkFLUkY3cDBoQlgzSUlKeVpDSFJYZUp3SWVrZ2h4R3ZXMWI1OEw1QmdaSmRPMDBiYnlhZlI3RUxyOWZITVl1Z2xNS2lVZXU1anFseWRqNXIvWjJpNkhnWE40bDJyOWx2ZDdrOEJPVWFkRVh1SkVFazFOVU1zN2g2bm0vTnplQWhLWUhLejZoNmJybk00OXdLOWU1SndMYWlWdGFUZS8vRFNxSmx5YkVTeU1LL1pYMHcxNFpWMVRCcG1VRGlFNFo4UzZpcGQ5MTg1OURicWVhZEo0cHJwcitFbWswUGwyaXhTUTJGTTYzT0MrOXppWjVmdlN5a2hYVWx2VitHdDN4bFFkZGpWVjVSZFlFZ3B0cmY4cVJrcnk5ZVN0Z0hLdWVsUmZST1NRSjV0a0E2ejFFSmwxSVRBcU1Ma2xBN1lzMnpqNmN4S2lpcWFBN2swWHNnbjlFNjIxMFhsZU41SG9JZ1BBOHhUbVZHQkt1Q0dTNTl2K25lMjNmSytZTE56RmkrT1JqNVVjYTJndnVac3BzMjJSTnRmR0diekl0US9VSEhwSFR5c1pzUmQ2emlEQW5XTXJybGpkV0cwZTRXeHl0YjNab3J1NTZ5UEhNZEdHNEc3R0ZuWGVudUF6MjVEeDdXZFhKT1pEK29abHlhS2VqVThBRzdhYVRNajEwZHJTY2lxWU1GMjFTNFdIak1MSWtPei9hS1JST2pnL3NoSHRaeEFPQ1pnak5wUnBHNEZDWnBUdEhLTWdrYXIwSVVqdEs1ZDVUYi9UOWVFZzBCcFd4WklzTmRCdWFRNFRXQXBkWktESCt2WWc0b05Ud1Ewb21GWkltVmNkN3VURFN4UmNncFRlR1pTcEJPSXhlU2VOZzBmd0hBMUQ2U1huTXhDT3JLNkg2bm9EMXhCOWVtbjcxbDJyVWwyZ3BMcUovdDRBbmFpbm03eFhQb0h2VHNjNE9uTDkzTU04SVNXSnRvTlIvUkNWK2Qzb1diamh4dGY3T1Q1c24yZmR5bXRDUVcySDVPN2tjNlBWQU5Hc0M5cUNkVmV1ajgvVWVNZEk4NWJpUm5heUl5UXJzZ3lRQlZtbGJNYW9ZK2YxYzErZVgxS1RRUk9aZFVwc3BNZkQ4L050WmNKZzZjcmlEY0NZUzZQVFhkUHZwTEJIalFUd3lQWUFXZFFPQzZIMGhDeWlmcGF1ZmNRN1RjUDZDSzU5UGZ5SE9XV1pxODlscDlIYVZZTTNKdEdsQ21OM2pGMzFzWG5Ydk5iVlZmTGJWRndzanhvQjkvRktPRWhlNWtHK2wxRDMrQlYrdEVYUm1ncVR3LzkzeEgvcGllckVkWURFQUtrSlh1SGo4Q21yUVU2U09ZK1ltV1NIVHh6THZ5bndST0g4d2pIaWIrL1RXbTdtZVVPR29yd05NWFpvQWd3VERLMHhpZUg3ZEcwUmxuMmFPcGwrWmx3RGszZ01NQlJ1YWtscVVUS04vSW5HR1BHSWJFNm9zV0NQTUNzRVJWUTJtZ3pRMHlIOEl5c2hvQnNLL2NRa1BnYXQ3cEdjQmZXbm5GV29TekJlOXJ2ZUl0NCtmcU1rWldEZHZ6UkZxZ2hoaEJIL0RQeEhvbC94MDRSenVUTm1yMGUxcmtTbHJzeXdkbnU3cThlVmVBVDc5YVlGdWtoV05EOHQ5UTFRNXJQa0MwK0VrQjFXTnlrSGVtL29qdGw1Z3d4elV5czJuZUUzbkRmWU00cHgzMnI0M3BpRzU5QUc2RW1mQkpndllvYWZ2aFJHbkVlQ05GRFIvTzliT0IycWZ5VnltTVZzenNJSnZwcHAzR1oyOWJmKzR1TDFRaitxcUZ4VGxhNXloaDlvYVMvMFcxOFVMQkhrK2NTOGJTRlUvazZwbFg0d1NTTjlMQ2IwTFZ2Z3Nya2syQXdVQW9WK2VCcWliNnI1NThPbnNmQmNWMzNPVlMyazlnNzRHOE1uWTBzaVlESVBoeW11bzJvZkRoUmdjd1BTZFJPTVpIdGtFbXNZcDhKaTA2VUVKNjc4SkJFWXJFNHVDOEJtc0ZDdm1RV2doWjFQSm9sSGw3eU5HeTBmbHRkeFNSWUtMUjh0YTRmQTNDNUd0S0xra01VNDlFWjJGWjRXekhuUWdqWlJ6SjhVVnFFRElOZXlCcGh1bFo5OS95N0pRN3gxYnp2ZTlqdWNla3I1RjJmdkJwWmZNa0YwVXFUZTdDblg4RXJBK1dXRlRFK252VlM0YWhGc0cyb1BNUE91V0NEQW44Q2VVVGd2MUFxcUE0ZGpieWgzTFRiY2J3c05YSUQrVmVuOEpLVEQ2MmN4VmhieEdZZ1ozMi9rcDk0cUlwVUdtdHdLUFc1c0F4YXdYa1VMVlozSVBZMkp3SzhOeUVsL3pxVS8yZTByUndhNTl4TDFWRW13NHZxZFBORi8wTHdOZnd2VU54bXQ0dm5oQmk3OEJGbFZXUmdPcTRacUJwcjZRWFVCYkRZSVJ0UFk3enVaQTl1eTdMZjRKWUliS2V2WEFkZzIvM0JHTzR3dUdpR2lqTGpzNklKTUpDL3hwazd2ZjN2ZTJLbGhjeE5NSzBzdi9GaHlqK3A3L1VqcStGUjVLbThGY0VxSloydFpKMm5vek9Mc0hWZWs1MStKSjQxS3loQ29yaUYvTmszMnI1Wkp0aG94NWNVamhXTTBQWG9qRXZBcHB5VldGM056Mm52ZkcrcWFQYldoWEowL2dYcXk2eHFRaDhYNDk5VDBNbzQ5TUpQM0xyRkNqalFaMkppazZ6MzdSdStpY3pOTTdlSHRVTWkrbzVURjlNeDBUNS9LZUNQTGVZK0tRMHhRc05IdmJHWFRpM3dmU2ZhR3RTU2VrSm4xV0FoTVo4Y05NRXdUUXdlK3BrSUF1MVJSbS9selNFbTdxdjhzazhxeVQrRW9WTC93dVd4T21pQk5xZTV3MVRFSEdtK2p0Nzc5bTJJRXQ1ak9YMHNINmJSYUZZVVZkZUpjZjhrc21pS3VCMjV4Q0FlaW5XaUtlMlZUeXdKcVF1QktJeS8wT2JPVFdtTGlMcXh2VlF1dE1vOTAwKzEvR2VBOUl6cUUrbG5YVkdWR1kxYWEvM2Mrak8vZjU4Sjk0ZFk3RU50Y1dLWklYSHdybU1KYVZvbDhzZEhNeGpYRm1MdWtnREErNVJ6NTlnZmNicW9QYjJaQ1RlZkU2UStGZkVQWlkwaDVjeW1kODIzN01ycnVnVXdmUTNrNnp2NytlS1A1UVZyZmtIVmU2MkhNeTcyUEV0RXVpQ2ZLUGZiT0VBcy92ZnRJS0xwYVJlZzluOU50TTFHcFEydXNkU1dodVNlMDRXcnY2UjFEV3VWU2NkellENnFQeGFYUlIwWXJMLzlPU2tBRDRIcnVJL1JDSXVFVFBlZ0ZnU0hNUFlkclhUK1RZWjhBSWdhY0Z5NHR0dTYxWUpud202SGJVbE4zKzFOZGJTbnhoUitwZUNFY3YrRHFiSW1TM2o3RTk0TGhBeWgrU1EzV01Ndnh2bmJDbUM0dXJpcWRKWmkxNnVlbFVocEhqNVpoWi9qdHA0VW9vRnZ6UXp3R3JTeTFSc2d1MHdkcGp1T29iQ0orWENneFVjWmdDOTZVY09yQUpkcmMxMkpDekRqUXdza0plMS9XcjJvTTEyYlRzLzl3YXFsZ1dUcVlUa1I0dHgydmU2dHA4Rk5URXNVeGp5QVlpVHRvZzB0SXJXNU1OQnhFNGZPNXY3OGh6dFd1d3hLamkzU3BuQTBVWkRvYVpzQU9ocDlSNWkxSUlrUUF3UjNTVlg5Q1lVdkdCYzJqSDJ4Z2xYQ3RjM3F6cVVwbFAvRVRudFYzamlBOENhYWlJQ2h2enpma2R3MVZsNkFoYVk3Qm1TclNSQlIvMlJWb1lYSmd1czBxRXlQa3V5OXJtcWdYWGNoS05VS2cyaDQ3cU9kZm1ad3N0c0lMRlNNN2NTaVc2ak5aMXlUNUFpNVpra0dhWDZDYXJpckx6WElEcyt0aUtpMW9NS3BEYnhmTC8zWnFFR3luZDVUZDhueUZQM1dFd0wzQWFubGVzUm9nSnB0V1pZc0xRekNFS1B1djVxNDcrcjNJQWRvTmszV2EwWmpKRnd6amJjR3hsTDFpdEdweTRDRS82aHppWW9mVkZNUkdLSlNuRHdHeG1RMm41VlNRY2RHNUE5YUdWZVhGK0ROZmhMa29hUW9IQURUUE5JcFZ0WXVMNzRRUldPVDZwSFV0QTY5U200N1BUaXd4TEdTOVN6RGJoVVJWWVBHaUo0VDZGdy9pUkFPNXdlV3QrTjM3c0VGWjZQY0RhcHA5NmNLWjcyd0JxTWJVZXRMQWRGeEUwNjhOYWQxNERKUFdCTXNPYWVzOHhvK21ybXFKV0pTcU1BcUhVT21qc2JwRXgzODNwN25kK0NqcHlGNDhpamFDNmJNaFhqTGNKL0pYQllMYmhJQWpiREpwb0JtbzV6SnQxUk81Q3FBYWhVbzB2VkJxdlA0N1NZaWZJZEdjZG8ycFlaQXdqczUzL243bDNzTnY5WHVOUElZWlY1bWYvU3p0NldndkNXNlBFM1ZHVDNJYnh4ZTQrYVNLSDYxRnRqQ3RPSjBycUlJUHVpUkF0U1QyWlZoMm1GTmMxWTZ4bmo1NjV1NGlYUkw2L0ZTQzBXc3krY3VWYWJhVkNyMHVaTldybVdja1hHUFgyTEpuZWJBaGM4K25aaFdnTzZjcTVTS1dhZktUVXAyT3QxTTFHTHgxUnpLYVdUbmxhMkFiZ01kL2FVTFdXbmpKL3duOE5WdDVEMnZoK2wzQmRIMEVTNjJZWkthVmJvWlBSZ3R1QTVrV29nWWtEanJ1RUFjNElLSXpRYWt2M1l0YnF0Z2QvMVBoT0lsRGdDUEp2ZG16UkNPU1lzV2FTQ3J4bDQvZHRZZ0ErUFFPQ3BmSWpzbWptR01Uc2pCU1hvczhBT2ZlQUsrc0RrdUNRR09KOXE2M2dtb09ENjNDbEZYMXozaExyaS84dkRjRFdQaStYQ292aUk3cEFMR3dzM1dCd0FtdE1FcHZDdzg0aytTRkpPb2hGa25rUExwMm9pRnZ3Y0FkeTkvOGl3eWEvS1ZnZEcvc1A2ejFIbWc1eDB2SmRkcndhVXVtcDg2NEJhWFMxcHpvTE4vYytLUGwyRWtoeFh0ZnBYWCt2RzkzNG9TVmhBMEN0RzBDY2pvdGJEWjhuclM5RWJUdHdZRGdZQWFGUG5mbTZPQU1EUSt3NTdEeUt5UXI0RkJkMWxJV1RjYkhleitiL29WRisxNHRHSmxocjREbE9VOW5uUjdTZ3pxV1FnclhuNGdKdllEdzBRNjczOHRCY0plUk1qQ1pBOHJhUlJHWmFJSCtNKzFlcllKcFprVDY5YVJzWXltK3dWRm5zdUtPem9xcGRJaGFPR250ZlM3aTM3anNCS2E5WEtkRjVoTmpINmp2eHZWdG1EU0tKbDdrMWhHd0hQa0VTNExVV2Zic1B6K09HU1VwWWx3aGdiSmZnc0N4OEpKeGtkaUVVZzRYbmlZL290MkpxQWxGWTVoYk04RUxZalFjL0IxdVVNNlNaWlJ3cThEYUk4VkZVNlQ1YzVhNUdIYlQyZ3JSZnBZNXJ6MUlxTmVJVmxyaGh2dWxaeldaVjZQR3l5MFAzaTczMzhobWNqQkp0ODRlbEQ2UDRXL1lIUFIvOHdyMWYybkdHaS82ejBCczZwZlFwOStsZW11Q0R1c3dHNmNCZU50UGczbDNaZTl0b2tMSkE4c2R4NXZqelJrMEkzRU5lTWs4Und3YVVQRkxkWE9tSVcvak1nVVorMCtUUGV2bTZXcGM1WCthWU11QkpnVzRQcDRBbmZYZmwzN3h0TXhRWkhUeituRFJKZEx4VG16UytCclE2aUxCRTRaelh5NHlqN3l5SThVY0JNRFhkYjY4OGtoOXVORm4rRGYyWXN2OFBuclR2ekFXdno0dHBEcjJtdGIxVmlpTmNGTlFKdmoybFBCNXJQd3VQendsVVNnem1GNjVoT2t6UHk3bmlNb1p1SXorMWtJRjI2dG1nb2ZuZ1V5ek4vbVRDNUIzNXlqeThFS1MzWG9jZW9Vc0pvQTNqQWt2ZVB2T1FZc25qakdYdys4TndKTGM0QzVtZTRZa0lzRU9kbFVpd1l1WmtaN0hnU1QvVmJvMEhGTnBrL0UxZi9CRW42Mmh3NUUrZ0h0eFpjMWhZSURWSmlHRGhrdjQyenkxUStKT2tCa1g2UzBiZk5UZUR1dDkwNCtVOVl4Y2x4TzZmR09SRGxacEVZR2pQUXU1QUhQZDNEU0pNVnhyUmkwbHNtZm0zTEJuM3h1RmZZc2NjZUxIZ2R2SE1PZWRLRW9HMU9HVjRjd0JlVmJtUnk4MndxbkFmdWhYUGxYM05lZ29mYkhac0VQeHpnT1dFYThldlZFSkdGZmpaVW9LNWU1Q0dwSlJEN3NZdTk4TTFIOG4rN1huUktGSHltamdTaFU2enBkcmQwb2dYZmtyd0p1QU5uUlBWSHNjTG9yNE9jcmVvdDlGTFh3QmljTmU3dmtCQjZibmNnZmlJaHliWDA4K3ptS2xIYUtUU1FjN1Jjb0VZcXc3UG81cjEySmZmTndoRUQ3L0JKNzhVZXZtWmpwYTBiS3hETEwxanFqRk9lRE55VXlRNE5nOXRWMVdCMldKYU5lRkhaaGU3dUU1YlNsUUtxazgvaTBLSlY2d3Jpd1hWeDBsdDBYY1hSMnpXRVlQNSt2QkJIMkVic2FNMTZGWmlOelprOCszMVJCODJrZFdYQ0prbzlRa3JPUitjNjV1Uzc4NDNkL2RFVkRoYitXS29wMk5MUFBzUmJXcGZMczBCTkwxMWJnNTduaTB4bEo1blM5QTd0eUNKNlB1N0VsSkVPbXFQZkt2Q1RGeGFLK1RjV0pwZHNXRWQ3U1VDWVZSZzQxdE14RjF4MzZjcmR4bWcyUFlCenlVQkF1UHpDWDR3SjdzN3ZYMDhiV3RNdDVMMEpMQWp6Z0t6a1Y1NFBSdjNib3ZsaEZqR1VFRE81MHNrWmxtYkR3czB4UURaWWk3Wlo2YytISDEwVVQ5NVQzcHp5eTdVc0dSOXJ2VEszSlVOeU1ZMVMvZHpZcDVmRkJPR3BKUVl1TmlwWXhHL1hkNlZkaHBuMzZ6WENFZlNDb2ZJeVNuU3FDODUxRGd3MnlKOENhVGM2Sk4yWEtjTkdTcUlLcFdTc1hZNGhqdmZ1REpxQmFKdUZuVzEvQjFBZVFuVEYzbU8za0VpT09aYUU5RkRpZGozaDB3RXgvYXJ1L1MzV3dBS2Rtb096SWdMWWVqVWlocW9jL1AzWEZONnJCUkV0RlA0cXk4RGVBcWVUNVRPaitOM29Ed0pwQTNsV2dwQ0V5SHNnaW5MdEVpM3JpOVVNYTVKNCtTSktPd29DU09ISjJFRFJBNlFMR0g1RGgraWI4VDdEWGlrTUZmcHMzOHFlSThTREZVV1dsU0lJa1lnaWMwemJkU1l1Q3FxRjVTTWZJU2U2UU9wZnlTOEdYWG5sYU05cEEwMkYrV2JBMGJJYUZheVVqZDF0M25LODk1Uis0ZmZTYzUvdmF3dFREVzcxdlZxQnY3S2hWMi9qNlRSR0NMMkYrNTRWT0c5bjBIUkpNVlFoK3dwOUhmZ1FvSy9PbEFSUTlmUHlPa1ZnNWV0TE0wMWZMWk5KeGFmOGl5dGZwT294aXlSOE90RDROaFFNM2EwaUhlc1BaQXhsMEdIbzg1S3pYeUtrZ2FMOGM1SlBWRHZrWFMxVHpMVG9tTVBRRkl0a25PWGovYUxkTGIxeDAxdjRaekp1SWlMR2MyejlsWnZHczJGRmdBVDluWG9zVzVBNWptd2VIclpQaHVBUVphWTNtaC9kaDZoaU0vSFE2cHpHcE03RHdKdU5GbVRaQUFEdVpBS3ovYmpCVm8xR2IraTBkVFpYY0E3OEkrVWVkc3dvRGhIMmhXeHVqZVNkZHNYVVprR214L3dIQ1VieUcybFp4Tmp4STAyVVM3bGZ3eEUrekJaOFc3UXVBb094dkVWSm9BYlY0dllEb0trRG9yWDBHYk9zOVhxZUNIYXhIclN6SGQzeEVlbEtDZ1FDNkZoWjIxR0dQZ2tWUEtxd2pnYjNmNHFUN3ZxejFiRFNIbDY2dUgrQVBaT3lxRTUxenhtSzR3dGVaTWQ4Rk1jZTZ2eUowYTZmeWg5LzBLQW1iNHMyZitkVWVmQ3VKbnhwZ0ZML1RnY2tkT0FxaStGeUNGS3BmU2lJalQ4MFVpdGI0ejlKdXpaQnFMYlRtd05XZUcrelFzelA1S1FPTldhN1NtQjhkV3pobEl5bVp5VGFEdUpta0k5MTFFUmF1TnMzdHdvYkFrd0p3WkJ1Mys3SFV1MzUyNzBGeDZ1cU15clNITVV6SmNNcEl5Nm5oMmszb3RHNEN2RVEyeVNyYXN4RGExS3RqZWUweEc1bUE5bnBzRlJXajR3dTNMRFE5RkYrR3RxSWZVVUFaNGdRVDZRTm82cG00Wi93dit1UGZ3VlUrVk1zYytSYWZabkpNdkpTeWpGQjFRUXFzSFRWT3BYdkRvYlZkbVZSenFGOVZENGhWL3cwcWIvZFh4ZUkwWDVaNE1WTUNqRlp2am53VnNyOGl4SWFiaEIwZVp4RUk2QTdST09zVXZYMUNUeHc4Q1ZVVXJzN2QwOURGb1J6aldhT2VOZU9FVC9PeC9yKzdqZzFJTVVSRWlsT2hyQVZYMkhqWWUyVlp0YVZGaDdUM3VlMVRLQmRVdFFKMm1wZlZEdHg2UGcvSGpuL3J0Q0NsbzRhNHVJSXhJYjBFWDdqOXB2QWhydU96MWJ3Z0Foem1pV3pWTWViVUhaamU5c0QzMFg2Qk14RUhvbG5qdnA2eFBJSS9QaDVEekxydmYrOFJ1M3JPa3NpdDBoeGY4UzBhVzVxc3I3U3pMd2FiR25YTWpEc2JCeVJ1REgxd1NoQXVOT1pTUk1RM2NVS1FOemExT2h1WEMxUE9QR1RjaWs0NTBGTmZ6STloY042R3RzTERSQWFoVGFvK3JLRm1XUERQcDdvM0d6SUhGNVU3NHhzMGJoYThWUjhBVXR5Mkozdm10dkdHVUoyYTIrSWgreUpoRzFYaHJHd2RaaXRPMFNJVWcxL2krRTBvR2dXdG9lUUJIL2FHeXdQY0pBZWkvY0R0TkZST3hyMlNzM3dXUVIxZUlQV1BjTXFlMDBobEM2bEFtWjZnZldQVmpQSzVLdXAxVElCV1hWeHpQYXBwZmdDSlQrdWdiN283SUVCRy92ajFtb1JpSUdmYytRaURRMElab21zZHExdFVIYXg5eVIvV3Z6YlNhQlhVendNRSt5N0Jpdk5KTFE2NWZlWlNwMXFyY2Y0N01JSlUvN2RCY0Zib3FWQUpYZjNBNHJ1enA2aWFoV3BHd3g4MWhpUm9rN0s4c3UwK2hFNnBWaTJ3TGo2d09SNDdoM2FObENpUm9IcmZlUmltbHVQOWhNNktkWGdkUStqVmF4anlRK2VwN0c5b3hNSG5VcVltV3E5a2YzVDQ0SnN1aVNReTQxYUZGSVYzVUptMDZOTTZsTFoxdDhMRWtINU5KK1pUS2JVa0lrZG9TNk8yWVB0Y2N4YXZoelFrS1B6N3VGcFdwd3hFMTJPMmcrUkpZcnJXTWZTU1hrOHpFZjBEMmlDNFJvRWh1cmY1TURPd2ZndlJwZUFtYk5rZUZQR0M4SmVPRng4bkx1U0VqaTRYWGcvMFFrdHV1Q21IT0pNZVh6RTlrejQraWxGVkl4bWZWbm9GZWpOV1JZcnBPYThWZHhBWjFKanBpRHhCWnBVODdDeXUxNzNJWURUTFQranhSUHpTY2l2STltVVIrbmV5TUNhcWhEd3c0QlJtU2N1M2dFUVd1TXQ4eVBhbFV4ZVJwQ2k3N2pBaUJ4L2ZNVjFYdUxUMlBaSHhJbDkxMUdQV29QeHhIVFVHTXRVN2NyamlwZTJrMHR2bWpHUm96L1UrVDV0N293L1h5OVE0dEg5U2Q2ajhkVDZ2OThWVmVsaEhkejNZdGtHVjk3bE1YOEtPSzF2Mk92NSszak16RmZqTWRyaXdLbTFWbWdTYmhLUkl5anBjOUlUZXdMWG01bkk3dXVrOExneUF4SEZScGxHOGN4NDFrRUh3c1BqTHlhUXRlcjVGOTBEbzF5Mi9wblRWMGxNd3V2eFphV0tTdFpCNEYvWUNZYTljS1dQdHdqNERqQ2J4eExkeFplWjZ2SUx4WGZhSjV1WmhBMndUdjQzVUpKQUU3eG1teEM0dzhSUkNSb3UxaFVaeHJsUHVFYk4zS2JMbEZvZW1ZU0hFTmhySUhyeFhZRjIzcjcvOWxhcDNCMndNeFdadTM3cEFDMTRSYWo1aEYzN3NOVjF3M25MLzRPNURJUXlHRDJUN2ZROGZmN2dDTmlYY2ZySm11V2Z2aGhCVXNmbFU1UXBIaXR5WGE1c24zK3l0aGJGbGxuYjZSYWw4V3RSSDFFSEpSbGpjTHdDazl3ZEpFVnBxM0VLVDNhNDFyR1phNHE2ZTV4MFRMNW96V3lFRU9QTmpWL3RieFh3ak5Rb1B4MmxqRFRTNXlORktqVUZycW8zQVJqd3dzaUdzcEpVWmIzTnh4dlkyODVwQzhMaGpDUWRTeElYV1RRdmRVU256NENUNllWRkdFVFNLWC9VYVA1S0RQczVLR3lIcnpsb0dhY1dJd0FzYU5jMGhUaGR2WWx1OWd6QjY4TENIUU82b3h0S3JrYW5ZOUVoK1RKbk5ybDJBVnVWUEVlczAzNnpXN2EvUGFUcU5zdy9IakY0THdtS0dSMTFYR3dReEs2cU1aVmJpTDgvVTd5RVFYbXZCMjc5aENERmJZdkM0ZGRlTjQxd1dTL0xIb1Qwai9NRjNFR01VN0pCeE4xajZLMS9wL3JtU3c2VjloTDBOeG56MCtmaFlXQlhyVHR5QjhSMGZEMU4wTlBjU3lFNGpaVjk0NS9YUVZSTGQyOHR1Vms2eEUxSG0xd1pVUHkzWUtZOWtRRDJKdTdId0lZK0NpYWkrdTJaRzNiWFZ4WWw0Vnk0K1VYUFdaVE1XTFpGK3NRYXUrem9WaUJIM0xuVFJoK2dGUUxBNUdObmhrYnNxbU03OGNKeXQyTWdaS3JsUXVOMkRMeXFuT3FVU1JnMnJIOUFDMG5OR3FLWDhERHc2b1g4UWd1a2orSVdBMk84dytBeWxQNmNjbjkzWU4zeVczUWJxSTZGbmZzVjBOME43ZXJlaGRaU2xNdnZDVkY0LzlObGJCaG9xMzc4bjdINEtaS1ZWTkdQZWY3SDhHcEFCa2VXbmFCNmVrYTBjUUZvK1JTZ01yKytYQWhkdzJWZnZQZlA2a3BDSlpReGZYRW4xS2dMK0dEbEkxK2xxTGQ5bGVsaHU2cXQ5NHhzUXRDQmw3UkFkdGVrM2hHbjNHWUtkc3lWVXRreDVFaFJGWFYwQ2E3VlBTU0pVWEhlUG84Z1BjMFVTaC9RZmJHS3BCY29aTmRLMGNaN2s5bjU4Ukg5KzJTWUZVMWRrVmx0eUVxLzJ1T21zZHFRdEMrVE03UWxFcW00KzhzSWMxdkExamppdkpBNlVFMUF4TnlGVWVDa3hYOWZvQlhHWDJEYktQUWdIaXZCVXFJTWRSSUh1dUpwVlFSTlpnY01BM1pLaHFlNnQ3NWxvZHM5YTJRc2U1SFVrSmNmWTJvSE9xYnlkeTg4MHdERFlncXNlRWpHVVBHRXlyQzF6K1pxMTl1ZnhsSFlLRnZZRjZSMHlKeFovUjZ3U3JIYyt5bUlxMzZQUkFYNnVNbEZQZDVxM3lReEhVVlBnNFJMSFN4anR5RG96UlM3bXRUWkRMN1pjampvdGhHUVJ0bUZkbjFUamMwV0JjN0o0ZUFQbDN4cVZ5RG9zUTR1bGx3M050bWhPVHV1d044RjBpbnl0dFpvMEx5Um9tRzhEZU1WR2hlQlV4dVZKYUhBS1ZwKzc0eXg1SnBZT09kaENMb3Nac0JaRzVhS2E4VEwwNE1GRDF6ZEhPak9zMXlpZU5HWkpXV1RWcXRtMmpSTTFXeGZpbWdEejRTcHRMQ1hxemxhWityRHBZeWtPTmZhbTdNMi84S0U4c3NxWEkrWklZNy9QZGQ4WHVhcnhOMEExaTRrZWRLZnhUSy9MMjRXOWNBd3pIWWxUS2ZJWVlleFRUNmFyUkFtQzF1Y1lDWWtxczkrb3cxWmNKYzhMU1VBQXJiMEFpYjZRRWdyWWlSbE5zR0lTMXBpbzhwdnhaTVZoZDRQSy9wOWpjY3pIUVpQWUpzTkdrclVwTWdybWZvcjRZaTE0OEd4OE40SkptRTE2K0k4ZWxHU0lFQ3FjckRMZmNGWlUvWlY1VDRyU0FHQ0lKd3VDK29iVDBBbUpUaW5yd2p3Y1ZDK2NpaEhpYzMvc1ZLZFY0SUY2ZUNDTEsycG9ZNWJDLzYyR2IyTlpDbDNnQ1ZnUUN6MlNPL2x0ZCs3aUFGV2VlL216dmI0R1luRnFrTkNrOFlMOHc4L2Rqck1nMkZab3llYWwzb25lK1M4MWUwY0VnQmZlV3dIY28yMHFhSE1RYmNPS3JEbTI5TGZNVGJvSDUzUDBhRW03aEhpazR5bmJ5UEhIdys1WnJkMGEyZEtvSUhKZmkrbis4eFErblNxNGJRb2krUjZ0b2pHWlFqY29GVXhTeFFPendRVEpIM1dOZWZ2aTJwdEdOajYwUHFaS3BGMHhRQ0I3VUhFeVFrb0lYM2VZbXRUc09uRUVPQWRONmYrdEszMDg4TVZ6TGFkdkJTbFZtdFVENzJKbnY1VWNVR0dMQThQaDBtMlo4T1NEdjU0RUEvMUpqbGorZnBacVl2ZnI4Wms3RUE2alMrR0R0bDN4MHZBNzBJQTAva2hib0ZLUlNWMUo1ZllmMTV2NGFEV1VjWTN0VHRudkF1dDJQbmJUWVU3azFvazYwU3hoaC9pMzdJUnR2aEd0bzdsQ09aeDM4eHc4N2FCOEJ5b1hlcEV1dEdlNkcxcDhvdHZPZFZ2WGZibTdacG5QcUFxbXIrS3UrRW5mSW9vaGtMOGdGQmlIcmxUOGZvMGo4M1gyOU9TSmV2bnBYNXFXQjEydDhWbmFNaHJzRVIzZTJLaytXelU2SVYrcGxka0c0RW1obEdzY1d2QW9FQXYyZStUeHEvRm5tUzZ6UmIxMndrUXBMblRhZlhsM0d4YnQyS0xFRzdmUGRrOExxalNYS09nZU84TmxpenhIdzdsSXg4ZXJDd0dYbGhoS1BPUVIreHpyM09tRVQwNFo4TWdUT0xHbHN3QVRCYkp6WmZQZTM5TXRLQUFnaVFUbzNmMUZHd3RURzlTc0loVlIycnBsK0dxZWVCWHBJbUR1V0pSZGFUU1A1aXdQekIzSXFwN2tVbWtTWjNvOXA0TkpzN2pUako5Q3lSYkNSL2NSTXdVd1RMbFNvcUNGVzVLc05oS2tzVzhGQ3ZhZTNadXZDMmtES09uL3FNMnBqVmFBVWRBVXljT0sxWnlXdTBEdERNa0pBKzJRZ1hwckNXRFpGOWZqRThGRU02T25SODJrZXRBUHdmWkNvakNpQWk4SUFPSmZYTnl4STlWc1NGZERySmVzcDVWTG5hN1hJS05FQ2tqaCtNMkl1VGZRdWUzTmgveUFCNTJwVllHVkcxaU1UdGE0eFVzVXBJMFNnYmtDVHJ2Ykhjd3U4bWVmekRFWXJaaEZJelhna0dnYUprM0NRYTFncjNmOW9Fa2lHVnM1THdRODNhK0d0TUFzNUhVSm9QdDdNQmd3RmFiUDdaOHRZRlcvU25Eb3F3b3pRNWYxdStoN1JNbzBpNXppT2hmYmg4YlpZWVc5cm9Wc1ZQakxNbFZoekQrUjl1VDh1M1hFZUhHUGpCai9Lejk1eEh0b0Z1WDcvWU5VeDNrVElLM2htVkgwcUJaT2pZbWpaKzhadmFmQnBGUTBkdnJqOVdOa3p0YUo5QVNoMWJjM0w3Q2xWTEs3R0RPSDJlaGNMZ3pDaE5sRTZNeUJZZStCbXJPY2hBTEY2RVVlTGlsM1dRUUsrdVZ1elJWdEZ5RnhZNlBDTGxYdHBqVXNUU1Awa3pmQ0VjN09raGxrdWFkOGlkMnB3OTNURjdvMHl3aTZ0RGtQUlhKVS96TWhHWXdhVkFYNHdQMUVkbHdCRHM5S1ZsVnVmWHZkSkIxYk94akdGL0RTQktjd3pxUTdVSkZadVFYUFZEOVMwelg2eUF2ZDNxbnNvNDFUMmUwU0tuVEd2RzlJeVlyckN2T3huTXN2U0NSemN4TEM1TGRlakpwK2Vja0I3aG9ldzZ0SXJqUERLZ205bkM3ZitBSVc4OEFWVkcrSVlEUXJIbkhBeWZDRVBLVllMa1F6L05QY0NJK0dYQ2IvUmtnMkppU2V3QzlCcklGclgzdFlOWTl5Szlzai9HTnV2OUN2dUh6TXJDWWNrdjY5MXhKMzV6Ri91bEl5VGJmSFhsTWZWb05tNjJZa1JYNTFkOGg0dFBYRWFZV2JBVEJJTWxtcFJDSDhFSW1Ca1ZkNUlmNDhiNVM4V2pDT0RXcjdaS3d2RXJOaGI1YU8zOHViMUZkVEFHNFFYZE1lNURkUXZoVnc1NGwyak1zbEtsbEk3bFBGT05lY24xV1FZT3BsQkx3SkI2dGN5NENMaEhCTDBicGhLM3RCZWFDSFZNeWNyeDViUjAycEJWdlRlU3RFMkxCWWxRRzIxcUU1a05nK1RyQ2U4OGhpVTY3dWZFY1E0enpraWRPN2gvZnRYQTlsWm5QcC8vTldoUkdaS0VnTU0xa1BwY3Y5UktYZnBJcGF5RjV5bmUyNVV1MHZYd3oxZ05zcjZOVUFNNVRIL01oT3hJRmtEa1QzUGpIUGpVeDRHMnVkOEVCOENFczJSSEY5R3BvT0pMZjBzSXJVdks3cithQlNBUndtekl3cVhRUmNVM2VVbHkrRDlOczZIQVkvb0tEUW5ZeVdzTi9URzg0U1M0UXJYQWt4bzRYQUNFVksvQ1NpRkVZeUE5Z0d0NDAyUFN4RVhiNXVCVUo5cllpT2tRMmNtWWxOWUpGYjRrZGxhU0dHeHhNYWFTZm9KelFTa2VqcmpLV2V4MGJhVVhsS3NzNzBzK0l5a0MxV3Z6KzNTNEhUQUVWazUzMW9QazFuamxHWEp0QUJWOTB2SVFjSDErVU5CZmhXY2dIUmhCR21vSVRJR0hYRlcvMTNPaTlVZkhyZnpwVzNxUzJZRStuVFlrOXU3MWFKTnNTb1NNcy9KZDBweThDb283MUN1Y1dUNnd3N2Q2SUhiS0l6RnE2K01mek01YWJIYWlQY2NXTDk3RmJjRzFWWmJsa2xValI2am5DZFJMMHkwTEZ1TWoydWdkOXFmeDdNV1NwSlRuWlZHVm5JakZla1lhMmFjd3Q0QU1MMnhCdU9ncXh5OTZ6bjN5WmxsNnZ3RUtRcXVwTXQyNXY4WURKc2l3bkRvQm9sWEpyb0MwY01oYVdnaFhqdlBGNytRdWxpdHpKN1BFTEFNMDgvQkdZOHBEY1llWkdTZVZTNVNicUhqVTErVTkzb1BLcW52aUJkWUZjSVR3b1F3RmlTNkVTYm81MVBXMVhhcmJzdnRUWUs3RjdRT0R0RndGZW92QWhqTVZjN3BKMnVGNmV4aHRLakVqcXMvWmYzZnlLT0VUT1V0MWZhelluQnZPdWc4Q3RtQ0xUUXpyNVNLZmhZQzdwRTVTNTNyY1I1WVdtaWVkeVYwdmRGVEdpcDE3aU5DUDVtSEZoNkwwYVJlRGszdi93cnhObUpqQ2g2K2J6T0NXZWYxRk9NM0FwQlFtNDRjRi9nVDNnUDUydjdRZEp4U2RYUG9Sa1k3YU1pZDduelVuL3ppblk2LzNocEdzaWx2eGpDcnE1MzUzZVF6YUMrSHQxRDBHNWhYdElSZlFEOEhTYjZLWDVZdGVhdVlhUEtxYVo5b3JnbTNlN3l5Vmo0a3VhK3UyRGdwenhwVEEwZGs2cHFsMDZhVlpERWtQUlluTnNVc1V0OXRya1RDZkdWcWFGbU1IMXU1M21rYTdUTC9EdWg0dEZzWmlaSU1jbE9OQVJ0YkN6cG5URkovUGxIZmhIcExzOCtlaHR1WGJKcmN6QStjcUpFMENwSTR2NGtNa3FJclB5UFJvZmVBVE1uTE9NQnQxL2Q2am5nclJTb0NSWGFWQngwb25YckJCNC9WejY3S0ZtaDNWelhNT216NzJmSHF4TnZ3Uy82Y09KUnJtdnVmdnZFUFpzR3BBc01hQ2dCM21aSnJKTGh2bWxYSTI5S3lGUUVMbjlpYVBNY3AyMWhUeHVXRkthN0FmcWZ1anFpU0ZxQ0UxakF3eGdqQVU0ZVIyMi9uNVV2Zk1INC96WVpIWFlzdXc0UGpLdm9vSXpPRGxvQ09jTVIxSHFVVG9yZHVMVUZRdS9yYjgvTkdPY1p6d1R2QnV2S2xNaUtFamFqTnp5VStNbGpTbmlON21WUDVaVTQ3QXk0bGJEbGR4Vm42QUdsMmZHaThzeTliZmZvNG01bzY1eFY2YWw2a3dvUitQdWFwYVl4K2FldXNYNjJoUDNTaWNaUXdPYzJSb2x5eHpkSG43Kyt1VXJ2YnQ1a1c3M09yMkZDNWIvdWo5NVQrbWc1V25MZXFRVkppMmt4OWl1UkMwTzdaMlRQUkpNbkFLcEVLSDdmSTkwNlNpNjNZMU5Bckh1OWxiMmtiQVhSMUphY1VqL3AzQnE0K0JJSGNlWjhnY3M5SXVBOE1nTmkvaFFsS0lWeUhna0NBeGw4K0tqL3F1SGpUTkp5OEpVZ1hBTFU5VkUyQmFaWmU5SkdpY3JRSjYxd2VtYjZqMURKSzYxRm0rZXkra0JqTWU3VXZhbm9sZjFYdmlKcTh3MVFCWTZkTkZPSnJ4RS9EYnNGbjhxb1FjNlYvYm4zSi94SGxrcDIzcXNaMTQ3emIyTUlUTWZ3UjhTclEzOUhLVjdjUFJ0UHdZWTRXMEhHUjhhdWlHUlJEek9QZDRvOFZyTHFGUVpJMjJ0bmp2R2k1eklhU2NvNXUyL09lSFhYRnMrSVAwL245R3BMYUpVL1VBc0Nhb1RRdkVwVzQ0RGM4aGhWQnFaZjZmbWdrcjYybnVFRjRLTVVqenJraU5nRXJmc1lQZHViUVZ3Z1lvZVJ2bWw1WHNlTzU3VzBmRlBOWXVRSkY3YXVTaDBqMXZpR1Z0TEJnRVFYZzR2OW5NTmxBN2J6N0ROdlZXNlN3TEl3OERuUFRxWlYrUllJQjEyYkE4Q1ZpT3YwN3Bya3J0RnlRdGNDK1FTV1Y5RWgyQ2NPZ0FTa1RBWjF0MWI0b3RBK3lKMjQxTDV6bmh1TjNiOWpJTC9TRE5QZFdNb3llV2dyZ09JMzQzSmhkRktMWUt0RTRlNlUyaHJGd3g5eEZwbEl6bDRxNEI1RHFocnBwc0JQSnNCTGt6WlRkZ3MwNlpIQVJVZUZKWXZUN256Q2xPS1Y5R283OFJJVkV3b0piV2lJeGRYSXEzZktJQnRZSGxZMVJXd3NlOXBtYzQ2THVjSDlWRDE2b1lpcy9QSXNOUndQWEpYYUlPanpzYlltL0tCS3ZmQmk1R1JqRkxjSXliWFc3aDdBYmxQUVdQWm9tT0YzRTAvQ283emV6cDFLOXRadGVKUURJbUM2UTZlQlZLa0hURWpGWmd6REhUMWhHbExsUmwrbFlzUDJnVDBtOWZzYml3VlkyQzZQOHhwNHlzR25GYmhLa1BFd2FXNUUrTUI0MFRDY29ra2RUL0JxemtVaTVoUUdKVHpXcjg2UDltTkVhNkE0NS8yS2tndEV2aDJaQkI2MVhPR3RFeS9EU244Wng3YitSZ2FOS3orQlRaaTRPRVloNUFEd0YwVW5mdTJRcEpwQzYzUGxIS3lpcWlsTGhTM1d2aS9ENjNxVTZEeEJ5YXIvQmdXS2daWE9qQTI2aHljMERTcit4aFFnb0lkSkRKaWFSS2NDaFVFTVNqUTNPV1ZXb0k0QUU4NWFHQnlPOVNtcUZxbTJWYU9GeElXM0o5VEcvVTNVNExzNEV2M2dyWkRVaXlMVXpacjhCQkUzbW4xZGJYYVAyYXlIb0NwU0k0S09BVVd1YVF5Z1FOcS9hTmVZVlNzM2dnb2IvUXlQYVg3aWJKZy9rYUJXS2hPbStEMFBMaGFoaW13L2dKSmFLcDlMS0pqQjJGQ3d6MW1KUHVYdS9VaW9obHcrRUk4TG9HYXRGemxFQmxDNjN4dStPZXBrbXJMNGk5OXlTTkVBZ1VuY29NMm0zSUF3cTViWWhLdjZMajNVMjBQcm9yalFYU3lVcXBVYnFzNWpXY29Lc2t2dTdyQVJXZ2hlVzZBM09MSTZIb3ZoNHpOd2ZaQmh3b0ZISHhsT3ZMN2xXVmdOaHhlV3F5ekpRREl5ZGhkdHUxcXR6Q01SZG9GY3QrQmNvZ1o5T3pwL1FEUVRHNFZVUWlZNGRuQllyT3FIOWZyVGk3STBiK3AvZ1VGMjNGR1NodUlheDZMRVFhNnlVOTlsV0d4ekRUeE95b3lnaUtjUEpobXVCTmZJKzdKeGoxYWlZaEpuOCtaNGRzbEJtTzU3akk4V3F0Ti9aVlQzYVBIb3RMSFVaZFBkQysrSWFNUWxEUzdsRXRaektlOVJqOE5meCtlS25wWDFMZjVXTkNZWjRwTGU1K3FDZG04eC9KSldMNzVNbGxUdmJIMkF6eWdmcmdmSEtmMWhCZ3F6Wm1EeU1EWU1oVFNvQU5uU2ZwQ0pqeHo3SDBqZjBjL0haRmMyM3Y3SVl6VUg4Q1Q3NGNuL0ZPd20zQlB5V2dCbWp4SmNEYnlycVRDYVc2U3UvN2N0RmszY2NOZ1hDUS9CQkw3Wm9oYlFHSUV3QjRYM2xNc2ltL2dCbHNzK3RkcG1ZamthdG83VUx0VUhxUU5NNWNpMDloa0gzVU8ra0VwMDRiL3VCd1NwOEoxa3k3WllBbjA4ZEdwMHd6ZGNEMmxHVHQweE9icEpKOGRRbXJZeWJRaEZSRkNJVmFlZ2RWUmIwdzd5c3A0UUZMdWI4YlVsWHpwQ3BoM0VobWViMUg4Z0o5QmZweWpPL1lVUFRUb01SQ2RTeCs3Q3BwZWlpZzhWN3gxeGY0V3BwYWRGRTZHU1NkQVFLMkRxZkNtVlFwa1JPMGIydXlGZlpBcjdOaDdHRWY1b3RMcE9BbmJ5em1aUDNKSTFPMHdnSmRxcDZ3NHIvUTlySmNnOXMwUlorVmF0aEYrYTJvQVQxcitkSEJIRVRucGVOMnZob3ZlQWQ1c3dQNTd0T0ZtT3dzWlVDSEU4UHlWRU53MzVWb3I2VWpCdnZmVnk0SEprU3E3dU41aWJzcmZibWltQk56eXQvSUtBdVpFQnd1aHZXdm01SVRORzZ4UTRRQzhScnlNUlp0L2VWQWhUVUMwemZUVkZqbUdySTFXdkNibzROdy9icGQ4QUV2a29YeElwWUdYcFRIbFdSRXIwMkkyVU9JVUF3clU4aGdrcVhLTjdqQlVTUUtyTG5kUElqZkdDclN4S2RXTy90Y1JiRm1KdGt1NkREd2tZYTNjZk96SXNicG10NStXSGJudkJ2Y3lyMWY2RHBTMVQ1Vlg3Rll4L1g1RzJnM0NKWW04NzdaVG1SdEpmVi93MVVqNzJSSXBsMWpoU2FJU0NxVG1BS0pKWnhlUjdXTUk3Wm1zQUhYUDNzLzNuMmN5UTlMSDRGVjJ4NTFpVzluRkxsQUxrOGFKVG4zTWZMY1ozeFVKYU95YVdGVlFCdnc2K0hUclM5bEVYTGNYSlNheUlQUGdlZTVIVDQ0V0hRb21uVjNielVLYW5ubE9nQW9IU01BYnRCQjF3UmV4L29jMzJtMHlFaDVOdTlaTmQrWmpKREFEWHlrdGdFcEpsYk05Ni9RSmdPYWRzaE9NVWdmNEN3NXdraG1wTmgycmZoTnpvNFlnVExyTldXcXNoTE9ZOFZqTS81VTlaeXcxZm5WNWdoZ1lKdFBaWk9LNFJ1Z3VUK05kekpyd1B4RTdpeGphZEdsRWYvUVUvVFpvRXZXSXE1T01Ndnp0dnpIQ1duZmFDMit4c3FMM3JKQ0g1VzB3ZkEyQjREaWpxbGJUTGNSdW16VTlrOXRRS1AwNkF1dm5yakJFamdTQVhheXhKbE1pU1o4QmRwYk95L1lhYStwM1BBNGtIZFR4cUh3S0JVNXJnNkRhcDVXelVmVWgxeU9jZU1PQUl5QlN1QnVPVTNSU1phaWZZajJoNVNSd0ZaZTFrQlhOQlZLaTFncTJSTytZZWVuSXhtSmcrSklzL3VqWElFaE1nTktxbVNjaGlVbnhCbHZsdmliK2tNM1BBNWVIWktCL29lcFhmTHNBSXlSV3krN2pBdlBKRmhEcEJPM2tlSTFoK1lROVJJcUZNdXBGT01GcGVaelUyMzVTZlM4Ym12NGVxZy90SXV6QVFYTnE5b29VZWRaTGxSakJKc2dDaVZieHBvSWRBZytDM0tEK0YrK0JieXh5VEpHRXJDYWtncXlmYUJlUnVIaUlzVzFoTUJ6U3YrMmo2M2dtY1dWeHhpWEtXZXNiMWRtbzh3MTlvOUFuMFpHdlJMakhHcDVBUzlyTzI0QXFwRDhGeVA2ejVlNjdOOHhONjE3MTVaK0RnQ2E0c0xoSFRmZUJoSFdwalRhS3JROGdrakdPOHJ1SDV4TU03TThKUEJRcDlMQ08wVWh4YllpNkRSQVpITXdNNlg5eWNBa005bUdoVWdRN1c0L2w0S1NFTmtEZm50K2l1T2FJK0ZXdXFIMmQySkVRVUpZNnBrZkZibjJERnM0aTVhdEFXU1h4a2gyZXJhbzBsekRCN1Bpejd1TXhGZUxGeWRhb0RyeXd1Mjlla2x5bytCa1J0aXhXS2RYY1BtOFpEUDV0dk5IblpoWmdWYmo5Z3krRkNtQVRTL2NRSy9MZmN4S1NVTU5pL0FWN3lxQWJLVDdqZGF5YVdBTDh5OGRMam8zQU1HSTlDUGxVM3dSSVA0UnlnYlB6cnI3V1hDVHNlZXordEtkM2d4RVVnWWNIUWhHVVMyT0pyeFRqTCtGbnprNTd3TWhtQlBTc1JERFBHK1RIYmVNSXRZWDdyZjhZRHQxU2wySzh1QlJwQ0tpbksxQ0FJbmhLMkE1d0tWamdjT1hRR3pscWFQUnFGK1VPSW5DaThPcnZWTUlHUGcwanNRN3hnZkF4WFVCQm9IMlV2U25ET0Vya1IyYlI0Nno1WDlvc2o2WGUzZkkrUGFSZ1lsY1YvUVh5SVE3UFpSWWFKRkIzWDhYTHBYMVFIMXZPM1BoLzg3MnBmUUZEQ2RTdFV1VjFKcS90bjQ1VlBHZkcwaHN6WGlHOGxrQjB4amJ1OVdtd1hsQnBWdWJyZSt0eVFxVGZQWit2S3hVMXVYUVo1bVozZnZyREJ4ZHZPK2RDckpiNW9WZktsQktSU1I2UUdEbGh3d0t3TkRpL3kzZW05ME1RWS9kaS9ZOGNXM0RaYkI2Si80WmJuQlhsdERGeHJleFp5ZnlXUi85bFpUeEZodEloeTdhU0V4QzgrL2RnR2VzVE1UUkpzNTArMFBNVFUyOGoxL2hvaTBDOVFGNjdKNEpRazN2VDBVZEN4R0VWM2l2cEZHaUEreVlyZHlQSXFuRjJHc1lsVmJsV2Z6d0o2a0UzNkkvcEtTWWY4K0lEZ1VtMkZzajF4RElSMVdaTWhIcmNTc2ZMWkhCeHAwbndmMG00c2ZTanFHelVxR1BSVmZPaEw3Y1pLMkFDSzBISmV2VUpZVmNNTzlqUTgrSFBwdFlrQ1JKQ0ZHQjcwbWMxd3NtNFRIaHZGYmh5Rm5LZzJzWUxpZG5jVW55QWREMjBza0wxampsSzBJK1NlVXVqS2FEWFU4cjdyMm8vbjNlaGJ5dWJLcDJFTW1TSENKYTdyWS9oZlZUbmRCb2xmTnZzWHl6WnBybmQ0N1NrQU5ZZmMvdzZvOXBxRW8wZU5VYk5kZjZiYlY1aWd1dkUrdytYS3BucXp0Qm9jU2g2eTYxQWNmL0oxaVVCWUgyNGNtYUJrc0xZSWszL2IvTEZ2blFaTzllSzYyemJSR0NaU3Zxc3I5dkgzS2taN1p2MUR3VDlReDUrZUppZ2s4RDJCOVc2b1FDY2hYSFEvbmVIT0czSlJ2WlcvMTRTcVk3TEl0R2tFZmxoL0tZa09NOXJ6QW9OOUNnV1RoY3N4aEhvaGMxK1ZuRXZraXVobXZrM3JaT2h2S2RtTXEyY3BEZmFjVFRwYTRRQkhuRGZEOXZmMjR6N1dvaXlKM0tpVEZkcTBUQnljcEJSeFozS0JLWHlWeGwzRVk2SktrbDdDVDJQb2JyRjVJazhWcWlxa2RZUU1Nb1l2WWUrWW45Wk1PU0Q3L0tJOXdPSWNTeHRramU2SDZqc3NGTC84MlZZWmVTc21sdDluR0cvWWQ3MUR3dHRlL2F6Qjk2cFc3ZHREZ1loTmZLalR5ZWpra01TSnVlL21BU3V1a0lidm1hRGxVRWZSZ3prdTQ4blErZHdZZ09TVyttY1Z2NGdISVRPalA5SGE0T3dDb2RuRFlUT0lad1lkNjh1NzlsSTFsSkwxeEdmZWRyU0ZzRUllYzNPZXdrYkxiSFpaRDdsVUNObDg1cnY2a3JiaWlGTDdiVnNWWTlQN3V1bFE2NlJqQWwrT0Qzam5JWG40MXNRQ0RDTmU2THBwSFlnTTNMNS9UNkFudldzVUY4VFZxKy9UNHhxN3NQOWNKQlovM3E4WDhUL1dENkNZSlNYanFqVjFLRStUVytOdzVaZXNQblZzTGY4b2pDQVZKMlVBdlV0U1I3UzNVZHd1T3lEUTQvaGlwNFJvb0k1eFpsQVRTM3d0Qjk1UzhPWUR4R3RBMHdCR3V6UG1XV0w2UWNXd3V3MWFZR2grS3ZQcEFXTFYvaWp3TnQyQjlzYkNMdngrb1hFN3RaM1VjcWxDcDJibFJJdmI1VzhBOUpRTW5iMFYwWWpjSlJ4a09ic25OUmpEcUZHbFlmWHlXTlc3M2xLR2JjL1FnelBiTlpsU3E5U3g4LzJWNVIyc1k0dGsveDVTaE1WZGh3Zm11K2UrWERiRlZqRzhGZUtMbUpvZGJweE1LSlVlWjc3cXR1SmF6MC9ncGY4UlZ5cGxEdlVlZ3hrZys3UDIvN3RlOE5QcW5lTS9iQlN5VXhvWEJhdU9oWExpYUNPV3hiNzlCWWxnbHRicGZhd3hRMUNsSndsa0E4MDNXa1pvRWhCZS9EMEpwL0tuQ1NaMWlQekowekkwZEJRU0U3YkpLMnVQblk5YXRWUEh5cXJWRlVsWS9mQy96WVNqMVArZjMvYi9jTkY5TXlUZURyQXc0WnJjYmNZRjhxY0pJeU9SMElGWDRoamZVUGpxT2NTUjVMRTNCeXVmVmlpMmlBanM1dXp0SUNnQlV3Y0NSbURnRUlRZVJUUm83dG9kcnJqNVpSYnEyeXI1QkhuSjFUZm5BM1JkaGtRWGtzNDhXTlZUSzdMNVJYWDVVaExmSkdlcDNGRUtRUlcrQVpRaTRoTHdtR2NCTENrV0tkZFFCZ2gyOW16Q0FHeUVpQjdSSVVqWTZsVmRFTC9ueU1nR0FITlBrS29TT2lGMEtNemI0Y3VySXdNRnJvZ1U2NmJLcHNxYWpsTFp5d2VmQ2x0N0c4aDY0ZVN3R1p6RWNxN3dUemdsbGRYN0ZySmdwQXI5WC9IMVNFMU5nQjVvQUdRTWtseGVsQ1VkcnFvQmlDMmtHWHQ5SkwwM29KSElUYmJZTmdBaWZpdmdJV01ENy8yZDJ2cDc1Ri9OWkFSTGpLWWNGQ2VOQ1hNUzRtRVY0RFRBSVkrSmN0Nmg4WXdpQnhVZFZROVRSYmtIRzN0UlowaDlhbks2VldicS83eTZxN1J3NG1aYlYxeVd0U0Z4WFlkZDcwakxTUVQyMzdjbGJidGEwVkt5SW1RTnF3ZmpaaFB5MDRvcmVzakFJMm8xMjg2YmowOUZjdVVpTGZpalI2enVvMnFIRjBnL0NacGMrZGZBZWZ2V2J2SGpDakNPdjJaSHQ0NEU3bUFDbWtXV0ZqcUUvK2FpM0E3R2N3ei9iWlFVZjdEaXlWZjBPSjlVdU94TmErU2lJUE5sdjl6cGFXQW1sS3AvUkI2dWc5WGF4SGU3bjRNVjcxbjk3b3NCa0lTU0M2WW1ZUzRTWCs1VlkxaGhGSlBMRXFodHlaL0pLaG41OEY2YXFBdjhkbXNrWkRJVzBONVVhcFQ0Sk9CNFoyMnZ1NDQ0RmpSVmwzOXNxMUxnanlCcHVnNGVwd2sySWpnd0RKWTRqenlpaFc0WGV6Yk4zMUlYV3JUR3JoMEtkendteTROTEwzUGo4b0lRSFQ2YmR4YVdxSXZ5NHk0ZklseUNac0RkZEpGeUtFNGw2eW9qYmY0ZkVOYzIxWWM0TFp2Y0dIOWNLZDhCS0s2ZTZTVzdLWHZ5bTEwckhOR3hJTmhXMndWb1NyVjFZSmR2Q0JHWGl5b3ZERUNoWWI1cDZ6UWxsa1BlZmRucWI3V3RnWlFtWlg0djNrSm1LN3cwNVBGdi9YV0JFUkJubEkxeG9zMnh1RUNlaG1UY3JIbEQzUGVjeWhMWW1uVjV2UDRRVEtHR2NNbXRTVVFaT0JCc3Vza3FmK2NJMTVyL2wwL0tDSWlKWWVxNVBiVmJEelF1bnFIT1AxMmtLZTJ0VEZtbldtdGZXZVo3MnhxaUM0S3RMT2h3eWhWWlg2OHpGcWZ0cFFjSzR4NWFEakhFbll4V1Rlbllja0dOLyt3Z1JTcG5nZXZoa0xEdGhXQXJjc2luOEhMYk1BdG83cE5odGpEempFK2w4c0hobzJrL3QyZVMveVZLeTl1ZHZGeXVMaE1iY3dHMFhDZ2dXNDhkL2lDYWdSRzI1b3dDRHRkdTBpbVJ3dGx4b1NTMU5GQWgrbFFramRGb2loVjdPaXNyVTBIWHMvejd6am1jQUlnU2pueXc3ZGVxVlVqTk9Fdmw4dnNjMXdSM0liOU43bEFWNzA5eUxtMkJFcHh5djNxNnJXbm5Od0QzNk5EKzdJNlFMVkt4TnYxdzhZa3JIcTQ4bzdEYkFOaFJWQWt4a0RLTnNEdFh5cFNIMWJwaVZJUjBObTJEeG9KMitsQ2ZJbU5UVFA4U0FzQklTelRVR09aZWhuOTU2MjJGRlh5d0RCdVlEZ3BBQnZqRHFVelZkRWoxL2kwVEdVeTdaN1VnVmRGUjk2c1A1b0pjb1lNY3hpTmk2dkhOeC95VjB3UzFlRFpPQjJoTzhzc0M2TWMxaEMrTVVSYVVFTHZrVW9nSFM2emZncnQvRXlOVHlmZ3BwZWQ0Y08yNjlQcTdKWDFJL09Pck4zWVZkU0lZbzZPZFVJUW1ZTXUvM3A4dU5xdDdyYjVaR2hlK243TE9ROHJBamp0SkxXVVBMVDBGc1dBUWpXSDNsWFJWbDRyb1BOZXBLV1VvTmp5bDMwL3J3Q2FhMWFtOVVNc3ZqRVVSaVU3WWVBb1RNTm9IMGZZU0UzK3BjQ0hJb2l2OVdwSTZoWHF5K25Ibk1wNThHZnd3R2lkNEMxdkcxcndtS0Q0TXJyZktURlNPYitYSlpDclZYblp1ZlRyTnAzZ3h1cEN2b210aG9BcTJZekhiTjA5UTRuNUs0N0VUZ25IQjNZWGFXT2ZrQ0taZDVLN1F1Q1RlY2NCby9QWW9UY3BmaWFLMkkwTitEcVh0S3ZhS2hJcldZWDRkTjVFSnZlcjNobklwcTRmRGdpYUhWcW5hVnpsdC96VlpnRzdzTE9acWdHZ3lOS25VekdyTFN6WVRkRFI2eWVENlV0RVlqRnFNdzFFcVoyZlVmdGhGOGhKeC9ZL0crWWRibDh6ZEs3S1NUTnNWc1U2K3NIcUFGb0RXQThscEVCK1lkZHdmRXBTUHAydDlVL3ltUmtYS0RaYzJoZHFhczEvQVhoVkwvSjdweXFTdkNuQnMrajlSRlVkUlpxaHNFMWJuZ3FlQldKSDZhRW1JTzFidTk4UDVHWUZiKy8ya3d2SUs1T0JxMk9hb0pIcGRTSitFenhkVEg2Qmw5UXpFd0pvZXVpN29CK3BlV2UyaExHc09qSEk4bk5Yc0svU2haNDFNVklQdEJKczdjNTI5S3QrREFqRCtsVy84Ums2RnBvQitVNXhZcVZGSDBlekUxaHdKSGZJVmVURFp6TXlBMnY2SjB3eU9DK1hROUVUYkl2Z0h6b3l3Ym5BRk5za2RJSUZGaDNjMlBzNXgvMjErQW5ZSTYzbkFoMlp0ZHBQczVMV1RJNGppWE1Qc1JxSU5hQyt6SkxISzFKekEzeU9QOG9qbStld0w5WDRESFdUVVQzVW92YU5aemxpanpaOWVQZGg1d1VLd2xYQWxLdUxZNzFIQzZNNG4rdUd1VXovUDVBVVBUQVhzZW9xMVN2NHJ2RStzcFYxNDZVa1BvQjNBaGpkM0pzMjkvaTExVlVneXVmalFsdUdFOFVzTnE0ajR4emJWOVpCbHZnVk4wbHFoK0xOeG1MSit2RGFVbEJuaW1JWlU2VWVpSExxalN5TWQ3WWtpb3VYRVp5TGxtdGovV0g3elpkemxZT0JMajU4elJlK3B2YVlycE5zU3dYT1NUZUVRV0JNMmRWRmI3a3VOK1VEc1YranRuODltQlYrSDR3dUg1MnhpN0hiTWxkc1VqbnE2Y0lWMVY0Um84R3F3SlEvSlhSY3BBanloTTVsRFcwTWxnSlJIMStUZS9WOEtRQ29RQUpjWlYySlFNZXVrWTd2WGFhWFVBZkNRR2dLcGdsWW8vcVJyZ2xBdE5YcXhlOURDR0tWMStrZ29YWWpDYitLTVRrZ1Z4M0Y5UkUzeEM2UEtHdzExNmtzMFhUOFl3b0phMHMzNm0xVEhqOFpaUzlKd3lRZkxBeFR6WGhtcktmdWMvSVJROEFmSHF4K0FsdlA0eDl2T0hMMFgzT0JSUDhJdW81UjhSQXFVNzVpM3MxU3RiNUV2VWtER0JFaVRWMXByY2VGTDRQbFRGM01KY0s3bDE1bGF6dFRQV3JjU1phL1YwQVlCZVR1dWY1U3N6d2o3NzdTVVp5eGU4YUFDVEZ2QXRJT3U0Vjg0ZFRsQ0UrQTBLSEpxMkxWVFlVdURidzR1dFNJSFNHUVRQUDdWc1F3aDZESW1CWVV5d01mYXpqM3kzMXJBRWVPUitlN2prRGtSWU5Ib3hVTTFYUis0T25WZ0RWaUZCbnpuQXA0TTM5eVkwRTdhc0pmdzNBTkVZU2lkUGovV0RMU1Bkc3lDU2JpWGlDeDFCYzdWTUxYSHZNY3lVakhvc0FvQ2VKMVh5c1BHREVNRmtVTU01djEyeWQ1M2tWWEQxQTZwM0dUN1ppdHdGNlFIZlp2RFU5TnJKSGU0NTVlaDRqRWU3ZVRncW01LzdKNHlpREo4Rng0Z05PS3pGa1NHSUxNbytCUnFxcyswR0VLWDZLeHM5RXRHMjVEL2g1aW1yUWk3VlIwRk40am5JRTZ2YWt2ak9hYyttdjQxZ2RJb0hMckZCbHNhT09maHRXR1dQN2Q3ZzVzNkQzVXB6ZWx0YVpnOG51eHJmZGs5V2hCODFCaGpMejRBd2Y4SkNEQnA5NUxmWEFvM2JYQWk2Mll3dkk0dW5UdGcxRDluYzF6UWtuSjZlNUNUSmwxTlVjMzljSDVCZmo2L2RxU3lMZVNnWGdNc3FRTmVKUzlQeWVuWHZGQ0M2dFB3dUZkdFF3K0lPcS9JeFV3dzFBekM5ZFd4bWt1bjlIeW1rVTBOQUFSOTE1VnhLNDJydktrWFBFbllubHBYcXhMSkNyeUNGK0xvRFFWZkt2anZyM3FxMXRNa2s0YzJFazQ0MkEvbnpnMHZ2ajlwektlRGVWVzNLNFlSanI5dk1HTzJIZ2JvbWd4NjRQbU1ITGFTSHFTekxyUjQvQ2d4Sk5STzJDelJlU2lMRUZPb2wvdmtDU1dINW9rRDEvMWt5blJrLytBTjhVazYvTjFkWE1JaFh5Q2xPbWtFMDBTMmxBNmZpWXpXUDhOVnVwNHFOeS9TQk9UQjhVVHZCUVB3TzZDYzg2Q0hna0JOaWhPQlMyRWZNaWEybThsVkh5bmNCVGtXL25VUGNUblUwanNIK3ZRRmx1V2VkSWZDYUIxTHA4cGEwbnZQTEZxZEx2VE1kK3lzUmgwMFJUYlN4OFkxdUU5ekZSVzRyMDdzRXZtNzZqNE04WUNMdElaQ3BvekhaRERMMnhJelliQXZQNTlQVXpvN1VTUCtJSlMxcGxuVzRhMDd5N3o1TTdHUjVCT2Z2dW93MUFmZk1vOWltS2VvQmVzNzVvMjNwN2JHcjV0ZUd3MC9wL1c2VnFNK09aSG1mWUJzQnhJMG1iWEVySTRFUUxVUWFkTXJTVUdNRDF6VEtmRldDZVlUQTlETm1OM25ZckhpSnIxWnFwTXZ3Q3RzNHdZT1hwUmdlL1E3bEFpYmpYK3ZLZFRLVElvRG0zb25VeEVRd3A0bVBsWnR6YmdhbldvbXFaaS9kUDVkcFJWT2g1SGROaDIxWW1hMUpNOHZhM1RMR0hLV1crWVhBQ3Q0NlpMS2pTNFBuM3Vrd3FFb0Y1RXNsRFc5LzJrdnBkZEtpOFZzaVVLK1JFL05qeVZlalBtSE9Gc1AxckFTNmNOQnYwOW5UZWFNdEZDVEJEZE1xdGhXOU5ZR3NibjFjOEh1V25wdTIrR051RGZNWWl0Q0IrZjk3YnpXRk1zTi82UEgzWXkyNm94Y0J4RWdWVXZZWUFzeWdvb1N1enZpTTZqWURySXhpVEhOa1gvVUoxanVYZHpxbnZNeWVXREJEOUltKzE4MnNsamJyZnFOMnlqbC90RjV1TkdsYWlFaUhCUEZyejEwTjJsQlc4K2owK0hkem1mSXg5SEFETkhwdmt1MnJSRnNkZXZxdUpNTFN0Mkg4NHhNaHFKVlpZbStuQ09rRmw5T3llejFSNm9uQjR4OXZxL0Y1WldYOUVnVTU5WVJCZ0ppT0J1R3JGZkQxeHl5NmFoTjl2SWJwc1M0SkFSaWp2RldZYXp0emZoU0ZTZzRQQnpHdHIyOTJKWFVHb2pXYzdDSHVhVWF6MngwMmY4eVJZaGtlenF2UjNSMmt4N2hWWFpNcGJMbkoxZ3ZQcjQ1Ni8wZkM3NGNDVmZtQ0lyWjA3WGx1dkJuYkpONDJvazNiNmVlVCtXbG11QlU5WDF0OFV4MnEzclhzTXRKVzRNUWR3WjJSN2xaMTVKcGVYdG9PcmhVTEowU003eWJ3WlBmWStQT2dhS0x4SjlzVDJCbS8vSFF6bmtvbmVNalJ5TU5PS1hWVnhZa0xDWmNuYTF4dHl3eUhJNVduT3paczUzOS9qNU5xdVpRaFRiaFBYdUFwU2RHREt6cFFsOWtya2ZSbW5hdFRHVzRTc0xuUWQvc3QwL2xUV0FSUnFCMDgvZ3lRTnZ5NVBLZkJrU0VyZmZZbHRlRDBka2VoVTZOWGVHZ05sdml5aWhkenlZQWFjZ0c3YWovdElLSGVYa0hKZmxhU1htckllUzBYMVNhUW1HNU1YZHlXMG9BOHRpZE9XWmNKcGdQMjltRGFwOHlnZDh1bmJIQVdvWkg4WHY4VE5tRkJaRU5UVFVIWlE1MlAzNnhYR1B2UVNZZjFqR2xHd1ZaaVZibm1pSEpIcGtTYkE5cW5mdGtIaVh3Uy80Q3dIM3l3R3QxZnNuaExONWhZYjB5VWpFd3MvaXZtOXIwVFJCdEs5OUdxaUJkSnR3Vys5eXY3K21xTXc0YTdVRlNIYjZLZFJWZ0VUS3NQaElIeTZBbWhxcVpWc3RUTkpMZHd1MEo2SXdha3lMRHNxUy9XSnlmdXhDLzVNdHc0OXgwS09aUXFuTXJtdHRIWFA1ZG9YYnRxdHNVbTREeTBMUERPYTNLSXNnOUpIeVo2NGVBcDdzSkZkU0ZNemx0OS9sODNUMVNwbko0T3I0SW1va3pHUlZEbUhKN1JKRWU4RTc0QjkxMGplcXlHTmFPaUo5OFZrYWFOSkVaYUxHOHpveE52eXRvL01KbGhQNFE0eUc1VDRuendFZUF3dVYvZlBiQmtNbk81dnpzYWxMa1pIa3ZwSjRieHJRTE5MY3Fpb3VBU2x5eE9Mbit2a0ZySU84bUVjdHZkajlTaTdrdDZmaHZmdDcremhFUXkrK2VoKzFETmFHelFGalpQWVc4V090aS8vVVFPZ0FDUk1Va1RuMHZHaHZOckhCZE5WR1ZtbThmYnpVUzdoMFpPOWwrczcwMnBhcTZ6aTJHWmlRbHRJdzlKd29RcUdRcTczTldEYWdLNmQrMlNjbG9ZR0pwZGo2VTZWOXFLeFBTeC8zcEpWWktidTJPZE92MVUveGR6RDBJekFtQ3NKVXdKRXBtcFl0cTMybWUxUnlxLzZZZ250YnFZdk1YRjh3K0luTmdZSFRtYXhoaFVHVWloVWxhcnVYRlp5QU1ETWxjangrUnhxZU9MNlkrdnFJL2VwZkM0Nm1TRmljaGlBY1dROWlQN1N6THovbG5qSUtnMnN6YU1yNkViaHg4Qk8wQmVoV3huZ2ZnZDdCR01rQ1M3aG9XVkMxQmNCbDJIQm0zb3JUVWJpbFBsa2JHK083ZHIrOG1zRXNxbHhGNCtlNDQ5d2UyWFJOWTZkZXdjd2NGd0VkWVNSa1RXVERoV3UwM25jcFNiWEdOWThTakRJOUMySkxsNjNnOVUrVEV0OERmRHJ5TUNyOFl3a1p3UC9zWU44WFBpanNhalFlR3VxYXYvYlZnUjB4L0d2UGxkOFp5RldNbE96WkxyRks2RUw4QXVsaVFLTUp6V0dQdCtoRDRqYjFWV1lTWjloOXgxbGJLMmFkQUE2dkxXL21rNCtGckVCeXRRUEVBamJIWkNDbXErWnh1Q2ZDYUVQNWZieC83TDNPZFdqTDcrNVpUZEtDSVM4RkRqN1VKUzJ4TkZRLzlIMmNhRE9qYzgwVnFhVmQ5M2krd291MWl6K3p2ekF4NFVxZXdabHVENWFZekswOEF1RDE1dVZPbk9hV3FqaTl3VUx4M1ZFTllWWWhoVGdXSWVhL2RNcVVoeWM5WFBTUTRESFJTWU42cy9DQk02ZGtCMXpyc2w1cURjTWRNbnIzRHVRL3Q2U0VtTGVIazVmeldkMkJLbkRaQjdsZ3FnOVRRV2E5SEZLTnhpbEE4UVJEYTg5ZzlGVHFRejFDRE94bmdwT2hHQldUdmhUR3VuT3lFOVc5T1Y5RFVqNWpmNmR6ckJGelNOVStNWGR2ZG1HR1JFMWY1MEhVRlNaODYvL3FGSHdSOXdBblhCcmRUbHdXQ0Z1clFzMTgrT3dxR2JmbFdEY005N1R5R21PR0xHTTNKQWk0WXN6aGpDN3JoVTkweUVxdkpNa1JJZmxldGJ6c29XMWJCaytLY2lHdmxIRnBXbzZIWXZybHpPYXZrcy96ODZ0V3o0bnpzbTBzTHE1MnRlbnF0RVI1emdMdFpIaDBvM2hrSzZJQS9Nd2VMaHRYY1U5R3BrODhLckdDWVpCY1Nsb0hTNTlWTzJ2ZzAxY3pPbUhYZEVFeEoyc3g0b0FJaktNTUdrLzJhdE11YnF1c2k5MVhXWk5Sb0RuZEFjSGQvdzlKeGVtSTBIV0Z4WWxGaGNaQnRIaDRMWVhaZjlpN0FzUzY1MWZxaVJlQVhSRW5LQTI5Uks2Sk1yUWZ5WTdjM0M0Wk9XRkpGbCtmc0RTSXE1Z3NuaWNUWHY4T0Z0U3A0dzU5a2VseHFCNno1MmdJRzRWcmVqZHFYeTdFYTFMLzJxaHJSNEd5ZEkvMFIzWkpLWFQyRnczejV6V05lODNuQ04xMGl1WFlHdi9mVjRkdXRRbVlRL0JQYXprNjNZZW5RYUV5MXhXRWt0R0RBVU01RitQUEh5VWFPWldhUGtsai8vQyswaDM5VURUVTYxUnBjdDE0U0pRSWdqT3MwZ3pTTzBPT1F0RXhtTDcwUUFtenNNL0ovVmQyb3FKeGVsVktWTkVaZzJuTmgxQzRlSGE1V1oxOG9QRDU5amxJeVdnbjZBQ05tL0dPdWtPSFBHdmVtTkxpa3ZvNGR4UnpBVWZtMHM2bDJYQmNTN09KMWxMWlVYc0lldEFUNWgwT1ZhaW1RR1R2eDdueVV6VC9iZDVPcXd0N3N3S2ZTekxkV3MyV0VyUExVblBkckRPUHFwM3VjMllDMzFIVElRRW05bG52MjRiM0hHN0dnMEFMYVJrbTVVR2d4bE9Bako0Y2d6QmdZZDBOVnlPdjh2QWFBdFV1STdMSEsrb2IzaDN5OUE3c2xONnJPR3NNc3hCM21jTmgwZjl2S1F3c1l3VlBGL2ZmMkZ4djR2Yk9RVm9mNkJ4dlhMZ2Y5ZlFZV3doZUlTYWJQWHJrZGQ5Y2I4UWZLRm80VkFkQXhLOE9ESXNNVzB6QXNWcTJaR0k3TllxWTRiTHFwQkNxVG9oU1d5MTMxcVU4QjdGd29wMjlBNi9QMlpvWTVtMTFZamRqeng1VE5XOGZJdkthcVIycCtoMHhKVzBubTRBTURSTndWT1NTK3QrSHBXaEMydHYzZDVlclVDQ3ZHNzVUN0xzREFDV2dUKzVVOVAzZDFVYmRid1pXZm0vZ2xoU0tFR082d2QxamVjci85VVdyWmNSWGpVakJNcFNseTJoUlVyQlVDRlQvSnIwdFRzNVBjREtIbzlSamNaYllZMTh2ZnNLY0dOV2prdWtsK3Vud3BLQzZPRDFxd1JXNzZabklJQkU5bGtFMlZRbzIrbTQxN283MlgvTkc5RWRsM0VEWmpKV3VNOFlucXE1RlV0TndWWDRQMlBkTU1SNE04dDhicGYwWWlreEY2Y0ZVRFlCcU9kT25Id0x1RkpWQ3c3L2VDang5WlVNUjdEdGxyU3RmTXN4QkorVDhFZExMR0dQVEw1a3l2SFRMaGNDRW5aWEFpSWZnaEYzQnF4a3FYN0xaWllvem9ySjQxdkdWdmdiNE5PUkVRVFlORGRDRy9Zb1Y5eXVHdnhzNE02aXVBMmYvbFFPUm82WlpPY0FxdVViblFxaXJRRG5NcTZKb05xajFrYkI5ZDNNK3BMYmE2anFZV2U3aWxPWHpvN3lBbVVhcStRQ1ZiWHpMRmxzK21qMTd6YXFUZ0VQUTRhaUl1VUV5d0tlbGV0WXhaNnMwWGprRzJSM0tld29WaTdOWDR6bnlLTXgrSWwxcTMrMy9UTGJ1L0lMaTNNaVZiUjZBRjZ5M0FTOFVBaE5yL1JZcWx6Y1VzcXpScy9nVllNdng2OTc2d1R6SVZsWmhKSWROb0NYR3Joa3lBekNpMklLV0g5cUNWRkM4eTQwZTFCcnlBWUpvamxGY0Z4OGdwdlhxekRDNFExT0JuRnVZdW1BWmNUajh0ZGs3RnJDZkFva2tTSzUwQ0pjbjJsWmNtRUgxaHhEOGk2UjRMKzBTQ0xwL01qTHlnSXg5ZEhMdGRaaW1kUm5PMzVYM2h3bkNpb25WT3duVEMxL2Y0OTFXenJZMXdkRGx3dG9rdnpETFhCWmVuQlBGb2o5bmhwU2lBWHpWQTkxdm1OYjdKVGNqcnpmU1lwR2lCTDBjdks1QjZuU29SU2tGd2tWdzZZWWFUbEVkZlp0SHhQWkZUbFJlU1NaVmRGT0FzUkVFdW45UGtaZXpnRnNzN1Fsek5nKy85LzJpQ1E4SzlBcnRpK0tkUGtmcTh6YVVMVldHNmcvU0RwUlpLUGJJcVNSSlZ5ZU9NZHRwSHBsL0JuZlZWRmFZUHl3bzQyd2lpZFovd0svU3EwaExFMnhCZHZEQU4zQ2E1Qy9JVndja1VuckovbzVBUCsrc1VLS0ltUHU1MjV2cER2UWtJeDBxb1RJbW9xRHFSd2MrUWRHTUkzWHZoZlY3RVFIUTdIT0ZjaXhwaUl4RWdOc3hBMDAwa25LTVFVSk1VYWxaZFFvSThFMXBWU3JjSm5VcFcramhTUzRWTFBiOXhKa3dIbnZpcW82WStMb213NDcyYUcrY2hQNzdwQVZTRkIwbEo2cklNeGdTb2taMTk3YzducThoRlUxeGpHcUo4elNwTVJNYzE2cXFuUWk0RlQ3Nzc3cDVsMzFzQzYyUHNjSmpnMDFsUDZZOENuV2JQWXpCWVFscWQ2K3FNUGlUY1B2UjVvcEZERnFnakxYLzgvYkhBSTVDdkY4OWtVRUhoZDBLNU9CaitGMWlyWjlSSWxrYkplZ3ZuVFN3N3NWQW5WQjBUeTc1SlY5T2tHQU10eVFIMXo2eUNiNlp4NEtWcmtRNE1jaEhmRUNsdFdOL1dESHNwVEpCb0R3ZzdjZFc2NWZUTUM5VlJHRDRYTkdnd0xCMTl4SGxLRUZPZ0R4bXJjY1VBY3RJTE1SQWxwY3JzREdQckFZNEUrMXd3VU45dHlXVmtETHh1N0Q0dGkzOFJMSHZtNFNOaWVlcExrVElnS1pzV1BvQmVEaU4rWWNDR28zb0Z1ek14Q2lyUzl3TUcyQ2NBUE9CQ2NiUDMrdDNVTlZySWhPWWRVTVB5K0l1a2t3a29NS2lvV3RHQlpaTkZ6VVpoaG95eGZqUm1Id0dVNXR1Qi9qRUlxL0JsVW0wWjZjWlVmakZ1RDljNXBpeFhBU2NxNGdreU91SEFLc2ZWZ0UxYTdvMUw3SkVKcVR0Y2RORWtkbUZPN3VTMUE5UnpTRnJGRzAwQVE1RVcxTXJrOVl4SGg0WGxNNVRudlpkZnRXK3ZxWmRNeXpMS1JQVGZBUEJwWm9Vb09meE80eStUQlpNS25zYTkrVENscmdDVHdiN2V6eldWU2dYMER5QkVYdy9zQ0tEeXVtcDVlSllyUjQrVkJaaW9ETjdpRzhBZi9iREVVdUUybkpkZEVKTC9yMmxONFZJdzBGajVGMHp0Y3praWZaaGpTcDFwcWl1amdsVmRFQ2xuc2tkZG02Z3VYTnJ0cENQZ0JUWUtoMUVtQXFhNkM3UGRqSUROdWRudE9kUVVmd1NVcE9KN0Y4ZkdlcFU3cjJnQ2FGaVliVC9MVUpSTW5vSWpXZlJBdUtaTDlnaVVZbHpOYi9IK3R2cUp6SWoxdG05N2V6bEN6aXUycnVPaEw1M3Vsc01Nb1lwUG9mYWpwSVZrSTRxQ0NWU0xNU2U4SXdXa0VWMUU4QkFUR1JKZVo1eGN0RWd1TWlPdGtXUThwSUtnaTZFMW5ETWVIcmNXbWRoVllDZEh0T3VIR2dmdU1JNkQ2SlNWbjE3YVNZM3h3QzFOUHY3SEdmdXl1WXlVMGtrQmNNU1JVN2VxRTlYK1hlTFl0MnIycTFKZmtTdXZ5ZWxWWm5XYXg0YXFpSjU1MmVPRk8vVkQyTWY5Rnc5RDFpSm5Ya2I2U1RYS0V1SGVmeW51Q0hXOHpHODdta0FhTjVEZHZIcFRyOU42ZXlDdjhNSmFnMDkwbUxONWFxa0F4LzBra1FpdU1TVkNsbVA0V0ZEMDJqZHl2ZlNtcDkvOFMyRzc3VjBsd2YyU1piTFZzcmRPd1BORG40am5sZ3pnRW4rbWphZms5NmJCMS96c0tYVmZDZ3VBR0l2VmpYNnZtMTBRWS9rVjBjVmx4UTh4UTdwdW1KNXRtTlYyOGhiSkpxMVlrZmNJUkZXdXU4OXQxWFgxQXdybUFDcWpQZ3dLRWpUd0xLWEpkemllRU1QZituNjZZRlY1akNoenRPdCtjKzE1dEJmcDRHNkFpRU1UMFFQVWVjU21RbXY4TjhKQmwzZ3dZdXEvbHoySFJaazQydzdaTk1janR4MHhJZWFSY3o4aHkxUmx1MGwzN1dsWEdTMFlySU03b0w3cngya2NGOTlBTG1YRXAwODZVeGp4dGxmTmJsZVVnQ0M3Sk8xa05mVVh6R3FKT00zWk5LREJjMzkrSXJJRXRwWkdtdUlIMXltNUM1U2VxSFljckd3clJROVlndkV5V29KQ0pzdXFwd245Um1vNnVCV2VoMG94RTFkQUQxcVl6eGdFRWhnS1RFNlM5enlCSGFmaGs3QUlidlJocXFOYWNUYW5DcDExeXBxS3ZseVV6YWRYTUxVcmhEZWkwZkgvOW1NalJKbFc0V2RCZ3VuT0dsM2lxWFVaeTRLRXpsMDMrVEZBOVVZaExqa2w1cU5FYkp4b3VLZ0oyYkpkTG9xMHZ0VmxUWS9PdEFOczRnTXdZRVhNNW0yR1NOdGhocVFabkpuUlowVEJqbUt3Wm1ET3FPc1h2NnE4TDN6U0ZuSFZkcUk4UmpWL3NhRTNQa1dLaUp3TmJuNkVxVjE2NzVJYnIrT0UrUkNXY29mUVMwMlU0YUNQWUs1T21EVDNkOTVDS3JBUEk2Wmc0OGJadmdIaUptV0libm5rbmRzN3ViNXVBdGhBaHZlZmlLeHgyYnVJb1M0d3M1RUh1ZGMrSmQ2ZG5QVDFUT1htdmR5NXNpRm1RSlNWd0hQcVA0NlFnVGp1M2lBbW53c09Cb09IdkZiazB1TDl1TGV5WHRXNEFjdEJkTEdacm0vaUpXU0UrZXA5NTVEMy9ZeUpFTXhVL2xPVFd4bTZVQmk2U0h4dnFYRDJlY040a1RUSk9SOFFoeEdFTWcrRGtpSndzbHBoeHY3TUVmUllzejNZVTZPRGpaaGdHZmlZc1QyZHRiTGVOTjRNYTVOcndnZVU1ckVHRjR0dXR4Y3BJR05pcFBaOXBVdE5xUzVWVW8zY0lQVndqbm1zdjl2OWg1OGIxSWlqZUNOQUo1M3JkLzF6K2hwN2t3Q3ZVVXVDaDJ5UU9RTGhZQjBjbDNQS0hjTWR5aGJzOTZnbEtrMTU1UXZOTk5ZWklTM0JLcnlBWmtLaDcyVlMxa2tnN1VLUjV2cWUxc21pMms4M2ZkaVplVitWN2lMYnJGMkUwdkJtejNKazNNRVBKOXlUL0F0YzFocFdNY09ySzNVMzFDMSs2Vk1HQzlRKzYybGtEY3l5ZldSL1MxNTlrSU5qSkFVNUphMmc5TSsxZWJoQU9LcmV2Z0tTa2hYcVdPTXpWVzArMzM5eTZSemF3bXlKRE01M2pMM0d3U3pFV0Z1b3dnMDc2UTdQZnFaS1puMzlFWVg0cUx2RlB0UVB4SmE2SnZYSzM5dXd0NHVuOVBvSjk2QTYvcTJTUzFHZWs0ZjBxWXpmbHo0SDUwYTBkK2t0bjRnZmVkV0dIdWVuTDRPK1NKSUVGNUR4ZVE1VVY4WjRoaE03NldMK2gwdnNYeGptYlZsRm0xTnltcHBjMHhQNFRuTFA2QnY1T0RNTzBEeGk5bkM3Zk45Z21kclp2QkFSZXJZN3g4SEg0SUIyWWttL2lUQTkxaFdMOEpVYlhLMnhTWXZxMnhWcWg1RXhKYmU5UzU4RUxla0NFaEFkeGt3NXNNR25JY1BOM1IyTFhoWi84RlF1WEd1ek9PcUtDY001UDNKOS9XSWFtZ3VlOUQ1Q3V2dlVybEhPRUUreWhVaW94L2xqaXIxZUpJWkJjNXovS2RwR1ZJVm52SGFyNVhTdzhOdnNlaEJvZXh3ZGw1ZThjZWdwc1NHZE5JUS9SK1M1am5NY3hTa0tGOUt2bS9CNVZ5elBDYmNtZ1NvRGRNMTU0TExCNDhGVG8rd05BcGVlTDNlcm12WjI3SGxmVHVqVVdEU3BtekhOWkpSaVRodCtFZDZiUjNScm42L2Z0WGRUTXl5YzhINWx0S1MwVkMvTkswaVFuRm5EcFBjWjhoMmNlZU1GMG9Tc2MraEc4ZmdrVFhxdkFaK2NJTE9TbnJXYktlbnFuZW1BSHU5MzgyajdPSWpDUmJtb3p4MFZqTW8way95eFp1YThGeTlHWHBSQms4SU81TEUzQml1Wmppc1BtNWVBdUh4T0F4VC9qN3BQS1V0eWljNkltdFlwRFVTR0xqQ0htVGdTaUxSRE5oN3JtZDdHSjBHOGI2U0VRWG9vRm5uY0F5SjE2bVlpVm1yS0xod2JGK2d4T0FTc0VLNFJhc3JJeFFaL21aTTNqVWtLR25jODkzS0VZNnBSMDhSRGc1OXpPMkx1M0Y5Rlh3Q3pZcHhVamx6NU03RXFiSXlieURxemlNRGc0TWltMlFybDhwOVRydDdxQVNkMG94T083d1BlVkpHdFAwR3FwdzVvMDEvMDZoajZJeGdhOTEwZzQveTdRczVpczZ0dTZZaHN3eGhqeVpTV0F5aUUzc1ZoNk02bitWQTltTlp0dkNpLzVYaHk4U3NKUnd1cUkwWGg3bUVnU0dNN0xLMjZSNkZNWVptTnFiUWY5OWZDc0t6aVhCZ2VHdi9HQUNJQVo4Tzl1WTI0a2llbXBldVk3Q2ZkbDZpc201cXVaNDBoRkorblNwQ0N2bEQ1MUphK0dKbEpQQ0VOL3FpU0tJVlJaNjh0aWhvcmgrS0pLaE9lSTNqNU9Ya285Z3hRYy8xMmFieXVBOG9BNFZBMDlFcS9FTHMvVUI5bWVtS3lHY1J5cTVmZGlNaytVSGJtZlRkVVJQajM4cWxTdWtOLytralRpV2x3UmpheEsyb3ZWcm1VeG5RK1FpUFlCODQ3dHhQZWJUMzRaU05YekJaM3FOTTBqdUdkUGErUWxsOGZsWHRLZEdLZlhGQnphMEZZV2pORVE4RFdJK3pTU1ExV1VaaU1QejYraktaT2M5aVI5bDBBREpzZ21KUDNiemxwaGxpTXlpM0d2SjNKTUlibHdnM2VTOXhwcXM2MFBhRTJzMWhNWG03NlhFZDZuVFY0enIyMkdabitydjRtZ0dBVGREQmtuNkxic3Y5NzNUaGJ5R2lqMXlySHFjOFA5TlRCbWJkN3dmYUNCUFF0K2w3VzU0NUtsNDFSc3E0MXR3RTYvYUsreHh4a09FUTZON0N6QndYT3ZZUjR1ZnVMNkVNeEZBR2ZZWGV1Z2k1WnptMXc1NUZLZzQvdnpSZE5EZE56WEhZaFI4STh2cUZTUWc4RGUwSnhsbkU5WEcvd2FoaDdLQk00ZTBxL2xKa3lPa05odFREcWJJYnd1Y0JkV1BGQVlPZ0Z4UEtTM2Fmem5FaGp0SStQR2JVKzhpYjdVZW9pc2g5VE5WQkluTkQvY3VwdTcyUFk5SlpZenkzcjZTS1lJbC8rQjVtTzllYzZVSTk5QVlBQ3VjQWdJcjRRQzRaMHFiU1BIOTVkS3BQS2tHemVBYmxkV0x5RmwwcVllUmVqdlZhS3Ewc1NCRmZMUy9jQzhZRlVzRmtaZDU3NTZkZTAzS0FDekdvNmpiTWFhaXJzR2FOYnUyRzVhV0NkZmhzT2h5NWpCanFDaXZiNCt5Q1lmVmFySEFVRnNPZ0t2WVlIcEJnbStJanJqRFZROU80bGUwU0VnaFFQdHdudEpZdmZPeHJkM3dKSm41dXlkbEVwTkZRVzhudFVJTndsWjdkT1ZjcUh2ZnZ0S2hOZmZqTEUwaE9WRHZJT2dZcEpCZi9SY01FVlN1M1RuTnVJVGRiSko3NEtiM1NzQ1JlMFlQVWt0bTVnZUF0ZjJKaUZhNUZiSDJ6M1dqYmZLV2NKbEZmMU9IOXhxa3BHbjdBUm51VjNGd1ZEd3JzZTR0citNQzN6Y1hvUlBiRDdBZGEyVE9jekI3UVZFZGJ0ZC95Vlh1M3M3RDk5N0FzTGwvZmxZSGZnRnhkVnQ2V0ZBY0tDQlFrVmNveUNYWHNSNE05MXdSc01wTTY4Vnp3VFVHS2VSM1FBZEgrUXhoNGdrV2d0VGhzLy8yUUFCQUJvQVFBQUJUd0JBQUE4QkJrOENBQUFBQUFGZUFhdEFBQUlBQ1FJQkFRb0NBQU1BR1ZSb2FYTWdhWE1nYjJZZ1JtbHVaMlZ5SUNnMktRPT08L0JEQj4KICAgIDwvQklSPgogICAgPEJJUj4KICAgICAgICA8VmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9WZXJzaW9uPgogICAgICAgIDxDQkVGRlZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvQ0JFRkZWZXJzaW9uPgogICAgICAgIDxCSVJJbmZvPgogICAgICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk-CiAgICAgICAgPC9CSVJJbmZvPgogICAgICAgIDxCREJJbmZvPgogICAgICAgICAgICA8Rm9ybWF0PgogICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5Nb3NpcDwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPFR5cGU-NzwvVHlwZT4KICAgICAgICAgICAgPC9Gb3JtYXQ-CiAgICAgICAgICAgIDxDcmVhdGlvbkRhdGU-MjAyMC0wMS0wN1QwMjozODo1Mi42NzFaPC9DcmVhdGlvbkRhdGU-CiAgICAgICAgICAgIDxUeXBlPkZpbmdlcjwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU-UmlnaHQgVGh1bWI8L1N1YnR5cGU-CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U-CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0-CiAgICAgICAgICAgICAgICA8U2NvcmU-Njk8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk-CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI-UmtsU0FEQXlNQUFBQWd2TUFBRUJBUUFDQzd3SDVnd2NEQjhUQXg4QUFBQUFBQUZEQUVBQUR3SUFRQUlBUUFJQkFBRUI5QUgwQWZRQjlBZ0ZIUUZsQWZnQUFndExBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQitBQUFBV1VBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFGbEFBQUIrQUFBQUFBQUFBQUFBQUFCWlFBQUFmZ0FBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUlLVXdBQi81UGZFK0FKUVRSZWxQQkUvcXRaTVMyM2dkK3NhK01nSlJ0MnhsbExOckhpRHJwTVYxMkNRM01scDVWTTdvbFpTejBOSm9KRTBDbWVzQXA1NGFOdDVneFZWNERhWUFJd1A2TmZ0QjVPZmRORXoyUWpJbm1BRDRLQWdQRGcvck9tdXZPT3BPZkdUTFdVOXZKcnp1djluYmVOSVVmamtrQ3lVb0R3MEVtVzI2SFhROVZqTmJGVkJQOEVlK0ZNbGx2U1gwQTRId2R1L0FaQVZkdUZhcFRYVHZJeldvYXlGLzdGcHkyNURCOXZ6aEhDbktDcFZhREVuWWhOVjh5UEV1WkRMZm9OMEdpOC9sZ0hEeWVSMXNDT29WRHVyRjdSNXp2Qm9vczA5USsrUEc5VjIrNWNEck1xdUJPQXgxcU9zRE9LQ1Y4NVpYMzZER1RwMFlnTmo4aWwxWlZHUnM1R25TVjFoZTMxbDM2WXkybXNrdmNuT0UyenZhd2RUQWJqaEt1eGxwQUFwcGt5U3R6SHA0VmRURU5zblNpajljamE5c0FxY2VUWG9FSzZSZkdOVVZjM0ZvY3dtWm9Kc1NDdnVra3Uyc3AvZ0dUb0VuSlQ2bzlMZ2V4YWlUTTBwQ3hyRDhKQ2NNang0Q1ZvOU1SbGwycWpPbUpGcGtIVElUNjNraHYxNE5wcGhhQ3NqVm5jVThuaVdKZ1dTZ2NiKzVNSlkzTFIzOWJQWTNSaW8zdUM2SVpoVitKakRZZGVLZm8ybGU4WlAxYlp4VVVBd2g2SmF3KzhPa3VxNHp5VnRlbEJpL1h6dXZQOFpLK01vZk9hZ0lQOERVZThSblZXS0s3ejBvNE5oK1M0QUdXdndyTzJndk5sbVdadlJtUW1UaEJSKzZGdWdWQStNYmsySisyQzVhMGJlNjZCeGZueENGNlJtNXh3bnUrQy90SHYvRjIxSFV1L1lRbHd1cElHTzhMNWVtSWZFT2hnT2hydm1SZGt4bzVGRXI4NnduMTNRRkJzV3g0cVg2Qzl6K2ZXMW53c3pMRlRzQmVwRkFhaXJwdmxCUUZ6UUdUcFEwaXY3eVRFSDVFNGRpSEc0UFgxQ1pqaG1vSS8zVjRCbDhpalJ6UE1ucmxvd3Zzc0tkcFhkT1RVUThtcVpJVE44OGl4QThtREJOL1E1d2ZZaHMzdXZ5UEZUK2h0RVJBOERhc1VKVXVDRklaSHZxNHhtZ2VQcG1TMFpsa1dsUW5NbE1HZTVhUUFqdDBpbU02NlVpM3RhbjEwV3dhVDNrbzMrL1MvcHI4emdEK2sySFdxOERzQnJIS3hsM0lnYm5GdlhTRUFUMzdzQTZwTjNUVWhGOWFGTWgwSUxjSHZsVHF0aHd0Q1FJRE8yZW9kbzVOdFBzc0NhdGNPSG03ZDZzRWp2RTBlc2Jib1VMT3NZOVNIYVVEUjNBbG5abjZodEdPeTNZalk5aVpGLzFLTGx5aDVCVm8xQlRqY09iY3VpWnZVaUIxRG80clBrYjhQUXR5VGVCc3NLM2p1SzhZNWh6Zm41eWpIRzcybUpsSHpnRUoxb2d2T0Nzd3cvUk95UkhhWDVMdEZyN0JOUHVtTGxjRG9CaElCSXhXZEU5MytoTjFzaFlYdGFzSDdPcVlnTUlTbjRPamF0a0xSeEdYakZveWVCcmdGWXdjd3dORDUyZmdxdm5yZnNOZ2FRL05TNVlNUUFGZmg2RlptT1pEMDVIWWl3OVZrd3Ixa2NrYVBQeTJTZnUzUDdDc2dCdGErQ2FTTWI1VW1Tand5SUEwTXJNa1QyQ0kxMXNYdjZjVEpHNmhZUk1jRXFkUXFsNkp4RTgwN2NPcmZiMDFJWHhnV1FsUGo2V3pkR2FZbEcxYjVGRUxENGV5aW9VNjFENmVDTGE3MVZHNENqb0k3VXNZMFRXQTl6YjNNRlF5dmVnS0cyR0N2R3A0ZTVCQ2k1Vkl5UlJzaUNuSGo2eUYwMDZlUmZDNDJUcTNEdnBXbTk4RmREbzV2eWVxMGh0OCtqTER3RGZOeFJCREg3ZG13SUU4SWNYMno5K29QbHFqS3hrVURPOVY1M3labGZWRDc2WlBBZnNQc0JlL2VsaFAwOWZyVXRqZjF2N01seC9pcTlhWWE0a0RnMTh5d05EZnc1Q1FOcEMyY2g3NDVCRE5nMStINFRKb2FyRk9rMmt3dEM4c3UxR3FHNHVJVEg4WXNCNUVBZ0VkcUluY0Y2V2ptUVJTY1ptQXQrMmpIcEwzN1NvajNNcG9sYWxMMTRsQXNyQnpUY0p6TUMrOTQ0bjltQVhPc3pLZTRBWW1pUDRONzBYazlQTkdUUUNnUDRIZm03SktDT1pFaEpxaFoyU0RXdkdRN0R5TmlEV3plS1JsQWUyOTdPQ0NWc2x3dGlDZnY1SzBoSFlxMUp3cHZsN25zcjVkbmZYTjQvalZYUGIvRFdFV0lBQnpMSzVGSU54bktDZ2hPa0ZxNDBiZEpTeEVWNW56T3F2SnFTeTNiaXEvcnJHWC9aL2pRUy8wYXpxYkRnSEwwcUVSVkxuM3hlTFk0ZCsvZ3pMWmtEdm5JOVZOZEFiQ2l5cExBWlc2STNDNm80c25Ybk1qUytURUVxN2M2L01ZcjVUQi9RNlJBWUdHM2ZUUnBSUjVZcFBjRjdGK1h0c0k1QmQvWEVCNzUxdjdlYjFkeTJ2ckF5dE8yZXJHdmFjcTRvY2xMZnI0QmhLdmRwRDlEYUdtS0p2SWFrREV1ZUErVnR1QmpGNTNHSm5YejBrdHUyYnJsbkowOWZNb2tLSmZzY2hrZHE0M0xWajNFU2RxUE96cFpORWM1TGlweTErVTBsWG9YVnRGMkJVdm9temlUZEZzTVVBR3NnK3owRkpIWi9zU1BRRXU1YXk2MVV0Y0I4SGptNnFuMFR1RWxKb29KNzRvK1JaZkJjbXRzY05wSkJoMFdndzVQbHhiYVFPdWhYSEFiUHNZWEpVbnY2UU5JOERFbnpGZ0RNaDBYRTA0WnZSbHpKV2JUTnVocktIeGhLTnBZUzFNaEdyc3FUbUxZN1FSRmEzOFpKQlpsd29pWTZlQllRQ1lzVGlBbEVlbTV3em1ncDV3V0ZaS1BuOG9ZNDBRT3B2SzBITlJxcjdMMXBuTkp4U3VIZEhqVDBFK1VZR1BlUUUyYm0vNFFGQzlXSFVIN21NR2ErQmhIeHlXakJjdUtteUNTU2FjdEFQQWdrQ1U0Z25LbDFTNjlXSk9JMkgxUkozTGxHNlN6Y0FFN284Q2pEYXRSWGhDSElhY3BSUVRHeXRFdFl5NzBydmVqWWVFSnNuS0JEcnR6dnF2bmlRWS80ZVUwSU5pY1FEc05vUEtwYUVka3BULzlROGFJaTFuT0hxd3pjTVhOaCtsb21BQzNIcnpVSGhobUNlRWY4R3Fsd0IrRkZ3YmdvS1dXTklGZWZLaUZIVnFWUzFRWmRnQXU3cHNpQWs0Nmg3em9aQnQrdXU4R3F1T2ZERFMvazFPZkVtbHdzL2xTRTJmYVd2MmpENTVFazZ6ZzJ0MXNPRlVRQWFJWVdlL01xOUJuakhqa2taa0l5VnZuZWZrOTFvK1FVUm40cEt0azFNMk5CejRGcHRGN1ZJRkFVRDRVRjJCU25zb0tFeElZQVIwRU1LNjQvSEc4OW5OeW9mWTlBazJsUEthU1NubGlkWis2ZVR5OVhlUWhqUDl6QVJzWGExNVkzSzUwcnlzZ0d2WjlwQTZod3Q3SGFxNGwycFVrNmswaXhLVm1qR1NQTkhkT2dMVE9GdStPV091azhST25CcUNFRmw5amlCUHBaZWF6eXpPQ2lLU0pXUjBleUJzbHRWcDgwNndFWkhOTUUxUWxlWWNRckc0V0JmZ3FjSUhMWHE2ZG9vRWljYkhiVjllTTJFcVFDYXBmT2FzK1BJWWczTmllRno3clNDOE5pRkxJUnhaMVE1UDNWR1N6d3BsTjRITDZJNVBjelVCTEh5OXJqV0pZWnB4TzdxdWlKMEVwK1FGNVNMOS9rK2Y4ZzJINWNTYVNPS01heFYzZi9oN1owZHl3dWR1SmpXOEdNRW5sL29GUXY5bmJKbzRkNm91SEFZK3JRVXFyK3VjbUppWlZlYzdWLzI0WDVPWS91N3FTbVFuQStJUnJES09sRnBtclRCTEhvYTdaM3Z4MklSc1R1MW5LZ1J5OEV6bVhWd1JjZXpUQ1IwdUlNbG9hOUMxOVphWG1QUzJjZkpzbGVjNG9VS2lmemhTWnlqOFN2Q3FtcktGK0RQWlI0T0VvWGRsMC9rK3IyTktNck1oMGJuV05uQVgzQVVCdGdTNnZJU2w1WjNLYU1wL2ZiWm9sOHRrMyt2OXdYeG0yVVpuYVJkQ2RleFBjQS9GN2U4cGlVajRvMmtqN2dJMVhQY2RRZGJGZ01raXBPTE9SUUVQbnRRNGFzYnJqN2lKR09NcmQwQ1lVdnYyZm0ycURaU0lyNmw4aVVQV1NYM3phcERpMmJ4ODFZaEFDbDZwTFVsYUY3QWIrNHI2SklMeVFzYUJzdkFtbUszRXVEeUJiSEwyZVB3eFozZFFTTzZpR3B1VUp3bERlVXM0TGMxR3BENEZ3U3JZWFZBSnZsaXZYeVlBcVM1YTRyWnZSaTVuQnI0TmRVMnRkZmJ3cjlBUWhrMkRvektReXJtYzlSb1dVblcyKzdQSnRITWorbk5JK2lERjJ0Q1ZZM0VWaXEyOTlTaXlFQ3ljeXdMU0VQUWwwTVpiTUN5STdIWWoybzVIZEtab05GZzlLWmVQQkVWWVplV0VmVkh3TWJGTlp1dWRQOWJURmF4RU11Z1VDS0FKdnkzcmtqa3NSNzRkRDc5cTF1aERxRi9VWUtPRStzYUY0Q3R4SkdsWU55eVIzWWZQTHJYcExtRjY4eTc2ZERVb0U2aENPRnQ3WU96bGZHRkVxNkRqNmkrWnphRDNoN1FJT3lUYlJ3Si92RTdHV1Z6V0lVWExvZC9Ta2wvVHNXWjBJM1RzaHVkaFc3b1hVMks3QjlqaEtrNmVVd1ZSUFBFTkxiV1VaclBrWnZmYUZHclVsVHNtaEs2Sks2U1cxUmpxTlY4MUprVXZLbU9MZHQ3bFlrTDF3OC9zUGt1a2tmVGZVa28rVUJCKy8vbGpRR1NhaEtkR3hUUHBDK3E2NXppWFl0dWttOXZCM3RCWHhHWXEyOWo2ekl1WGErTHUxTk1YR0ErR3Z1L0Y5cTR4QWhoZzlQVU1uRnMrcWJLTUU2WHR4MFp4bElBek5nYVlmbSszbERIY2xTaXR4OEpBaTdMUk1YM04vbVJqcmlOSUp2OUFGOXQzMFU4MTFVWC9PQTJPd090Q24vdXVUd3RJOWdSRU4rcVdYRStYUjdaeXBSbkNTUWlXY0FKbWNMWmgveVp1cGhJNDA0TE94SGdQWnZWYVdXNkxPSXZHeThzYnkwRVdUZ2V0WlMzdkhvc3AyYndsSWtsQktMZGQzNGhLMDFpRHlPSDJ0WGlIVjlTa3ZqTlEzaTFpVVpuMlJQYzJsOXBMMElLeStRRlI2MjVtTTZ3MjBWajZOQ3VoZGNnbzI3NUxBTU9WSmlzNE90OWt6WUxFc2NScncvYUJ5LzJTTERydlVHK2RGbjZGcG9SczhyR1h6MnYzZ3EvNnl2ZFRkV1dMQVNDMStjMUVuZDFBMGtqc2dZTEcyZUo2Uit5WVNGVUFBZDV3bi93VmdCayt6M3g0ZXZQOGE3bUx5bU9NL3NleWJtbzlKZDkvRnRWQnN1aEZ0RzhVclVUOFU2eTVXVEVENW1sLy9aeEVqY0NNUGxnb0lWdkh3NWNlVGthTEFhdmpocERmOWJabUFxMFdab0luZFB5SnB2Z09TeC83UC9scGVNZ3FlT0Jmemg3ZEgyYkU1TFh3Q1h2YUllR0ZjdXB6d2tRaklaOG1lbXRHdU1BRmJzYmV0SlRpQVNCZHpHZk1kRUlQeUc5YlFqR2xjck9rYk5kVHlMRW4zQWRoQnRGWDVmY3M4a2FYU1BGeWpCMHRyK05rbjZkZCtoeU5VS2ZCZk9WOFZsRWM4enBKaW0yTUcvSVNjc1BPTmZKTTFDaFZVYkRUZXY0bHRSYU9sMEJNU25mODdKWGZ5cGRhbk1rWUtZdFdNVGpQMThxL3NQbFVBam1nc1pqZzk4bCt3VUI0eFZObzVOaDBXUy9wTGp5VjNSYzFyUGcrOFdENzd5bGxJNCt2S0xONjdDQlJQdDdUcGpRZ2JwYXdEZVZVK0NvNVk5cXVpZGpwZ1UrcXk5L0V3Tk9XT2E2YkZLMW5uc2QvSjhMSEpYRXlpWXlRa0U4L1Fmb3l1QVpuM09iMTd6N0VUTmNBc3U4aExGd29mdEVVOGdqZThlSEQ2NlBHbE9DZnI2NUNtdENSc1VNVlBjOTg4UWVJWEVmVW8rc2YwT2JhQjRNQXNlby8rRHQ1OGpXWUYrTEpBMUlvSHRXZWgyR0d0K3JydVdiQTNGRTdLOE13eldvVFVMckZnWXJwRWs0UmdOeWJiekpxQnpudzAxOStTU3ZQQ1o5aDFpRmxJdkc0ZXJnZFoxY0ZTRm94TlRocVVCa2Mxd2h5M2liK0FZV2R0UW1ueWp4MkNQMEFyYi9KMkJqWHlTNzVYbko5TVh1V2pyZnV4RzhwVlUwQVVQM1g4dG1EWmtsMlIvdzRmZHRmN1lQUHhJdGtCVmExOFBCY1VaaGYzOXl1M25oR2hzN2RVMFNPZm50ak91RXVjVjhCM2praDhEUEpWQk4veFlGbFVGMm1mbllpZWtLT3JMNkN5VndDYlhnU3pYMXVKWjdSVGxjb3RHSjVkK2xaZ3RQVkd6ZmhlSWtEekEyako5RmxPSXVocE1TcGgvd24rTkwyWS9FTFk2TXR6M3VwQzV3U2RrVVFwdDl0SCtNQ0pOeGowNVMxVFBHWXhtcSt0czVKUnBxZVZBdDAzTUt4ZUhyOWZrdG03UitRVU5idGtSbVpXeXg1QWtyZUN4S2lGb0o3ZDNqK0g5eDQvUVIrL2NyQTlEcXRySUpJZ0NsNEJ4bk1BODhxY2VpRmxvWThWZFBzSGVzTExmVUwzWWYzNUlVK25EQSt6UmxWZGhMblRtQ1dySkRoejVTS2F1SEtldzFVdnFFOGp2NVl0b25LUlppU0ZoQ1RDUzNtMGhqdWxyWk80VGxYMk1idTZEUDExZnBZSmhUSDlnOUFFeFVOUkJlaGwwWmNuaTFWd1RDd2cvdDRwa3ZsSUxnbmNwWk5UMy84aWtJV1FiR2xraWZibzZwcXRGdzNnNGV1Q3FBS2NjUlA0VXlDK29DVEV0NFE3RXpYT0NyaGlFZXVKUlhkSzl6SnBCTzl6WFRFcHNreXJibFBQc053aTN5MjIvWVN1Q0c3UEZvN01RcllKS1JicGRXSWl1SGYvTkRwSGRVbjZrV0hROG5PbTNxb1lTdGFNb290YTZ2Y01LNjFLNzBlKzFWT0pjaFlWMjNkSTNaUGdRT2llVWVWZThmcUJJd3lhWnM3TXRvdGwwbGt6Z0NGUk5DODQ1VzZqaWtCaFoyOWliQXg3RlVXSnpxZzVCS2JrSDNkcG9vU3JhMFZ6Z2dKMlc4N1p4UXpBVUVsRkxRZllPcmw0NkJnWUxPR0E4RTB1L3prbWRrcGplZyt1MnIwL091QzM4MGY4d1hSYXBZNVVqcWNrUDJPRW9uTGoyaGFkZXRRYlNDaC94ZzhrOWhlcU5aZmFyTUFwY2dIVnpCK0JxK1BVa1l1VUhDdTB0a0s4bjRVdzVrNGhlRFU1RG9Sa3RiQ3B0aURIMGhSa1pBdXpueThZclFKd09PUk44aGNYQnIwQUtIUVRpNytOdS9KMUc5N2hEWk0wbk9WT0JXVmN0OFNYUkQ1SHJMektGTjFxbm5OOEZwZHBxN3BxMXZ4NnRVUEFJdVkwbXZ6UUFyRU1oUUI3aVd6K1N1TmlTTTN4SGxKUkV3UDlYOU95U2pVaTB4Z2h6Unl4SDAwRmtvT08vd1h2UHNnbWRMNmJpRXBYYzl1Z0hvSFhRS1JQMjVYditzZjEvRzNtd1FkUHFPejV6eUJ4YVltZkZhUFhaYVRNMW9xcGt4cFRuZnhNbWk1OEtidzI3Rk1RQ09aSjZPVEJ3alR2Z2lnWStTM2NEb0hvUmdjSy9hTVhzN2tCQVo1MXl0aG12bFdwbjc5VDhVOHdrenVGUS9mS25vUkhrd05waHp1RVA2Y0lXWVlZYnRiUlNpR0d1SlpFd1J3Z0xqTzdTVGJ2b2xDbUpDdTNNZUhjOVRTYnpMS2JhY3h0UC9MaEVlZU5VTWVzQnpDNGlzYkUyR2JUajRzVzZRZ05UNEMvdGIxc2FLTkdWa0w0QnhYeitFYWpTVktHY3NvT1RyNld4bTFOcVlEbWpMRVZwV1ZTVTZyTEVndFR6amZCbnh6aUcwd1lpWWErN0NmYkFEUnlmUDhlNUVEMU1EdnZTMWEyTHArQkwyV0lDbXA3Z25FZllnZzBPWFYzMGF3cEs3MVYzUUx3a09IbkVaa1VVRER3VXlrc24xVEExemo0dXNhaDYydzhWT1JFU1Jqb0J2MWxZZnI1RUd2MlVNV0JaWHh4SW50bVV6NENXQmUyTi9BbWRtdVQ5NllHSk52b2NDM1o5aE13WjFRcnhMWUlqUEdSWHdEaTRybW5nSExjUzAvL1l0Tys2MjNMWEZSQzRQZWRYNnhnU2ZUTjRUUjF6aUhlbmFMcGlmRFlSZHJrZTVQNm85bmttV3dzRUV3YVh0SmE2R0lEZ08yZWdkK2cxblpmcnFKK3liaStxY3JEUHFUS25ZRUJQMGZLRU9wLzB6UjM4WC96eVB1bldaVC9kcW0rRjRmcGJVbUt5cUFvU1pCVlJGVTRGSFpReVZJYnM5UXhVQnp4dElkWE1zdThDdUpkbERTbTBqdStrUmZqTXhzZHM4eE9nd2tTOTdZWHdUV2x5OVhBVk8reXlqR3JRanJ1QitqS2N2VlVxakE2bXJ0a1VvSE5uN25zTjViTjJERW0wMm5LeG9PQkJHT0lGeDRsbTc5eTJxOUxKamxTOXhaQWwvNC9pZjhiRk9UMm1DOGNFeHRrOWh4S2xaNG1Bd3pGejJzZTdvc0dGbjFLSUtjd3pKaDRUaUduaU5XQ2NBSllIMlA0VVhHRUZxVTlYVldLN2liV3N5enZ6YmtIZzlpaE9KazlEejB5Qm5iWVNabXJESm80MWVlSnV6d3lUeFRIYnlGQUY4M0FVU0ZuclFHcjJCTHNydVREbk5zeUZOVnZOR3pRRmFyOTBEbDVJZXNuSzY5S0d5dHM1RHdqWGtOMm1ybUZ3SDBBNndGUkhoWVM3WUtUQjdlMzJMQzZ1eEJrWW5peUNyTS9UeWgyQlpFOXl4RERBZk1Uc2FqS3NkQnZHMDNlTHQzbk5nZnd5YjhNTnl1VXR4TXFrKzdxQ2hWa0I2cWQwem9ISG9PYnIxb0pTZGVPWFZPTy9TNDE5TGpIMUh2Z1Rwd21SWlZmYVhyV3NNbVVBN1pydTBockpVcFNCVUM4ZFFGbUlCdXhNbjRONkJKOGR4cStZUUxHd3lFOG5lNHVML01OOXUzMUo4T0xhZUpLd0V0Ri94Tm5VNStoNzU0NGRQekdZZGpBNzlsaU55ZDU0cnFjTk85MG5lZWNZMXJwK25iR2oybjFQcXFDSGRJamtZU1k1MkMzSW5DdUd5dmFyNTZZdU5XWXRqVXZTV2k0Rmlqd2JMR2VmeDM5WlFmQURrZ3Jpb1BGa29VVEtVZ3Z0YjR1ZFd2QkJKNjJ4NmJ5VGJ4UzRxaEJzdlVPZ01WWHMzbjJKT1RDVlFxZ1hpK21RTys4TkVBV0tOVnQ3OXUrODViUjVlcXBuYlRwYk11V1M0bDAyT2hITmdEck8zZlltTnhQRXBiUUFkZTR0YzhNdGpHSm1NMHMrb3J1Tkd4VHQwUDhSYk1tOHo5M1BEakVKR3RQeVFJZXB6N0k0ZkFnNW1mc0lEbGRHelRqQUl2T2E1eGxBR2NaRzkvdUFqbVppWVBKb3Rmd1lRaVdtMi8rTGJTT0tBZVNaZDIxRUVCQ2VUUnRNaTJuQ0Y3aTQ1bDJEWjkyWDNJdjd0bWM3UUV2YnAwMTlONnNuK25KODNqaUE2akdqYTFSQlRFeEREYWpMQmpDUDJEY21SaTBrVWdNQjVnOGlDNEpEQmprR3J2SEJxS0k5OWsrVmZuekh3R3M0VVZHdWVUU2NISDZwSFZMb1djZzA5d1J5NkxaaGg1dm5tWU1KWThGcEtmTXVNVm5vVW0rOE11VlY2YWxUWC9ibFA0djkwN1VvVjY3dzdpU0pJZElNdURHdlNNMXNKbENIeDlWS2xaL28ybDhsRk1wSWR3YVdRbEViUXZna1plazFjTTdwL2NyM1BLNHBRcjhOcDRVWDhLaDZrcVQvanpqRmRQWHVPOUFKa1YxVTJSNmU5M1VjaklKaFUrT3FKdUpRSFkzUUdvRXFWUVlUaUU1WVhhVjF2a3JSVjRWK2VWTzN0ZWJ4dHlqQVA2Mm90WkdJSllOdWtzcUJ3SWlnQUlUTWIvM1RVVGUzUjVkUXMxeTNoWkdDZ292cnNxblZpVzRXM0RzZFFUL2dQbUM0K0xFZHJzZk1DNzBmOFhNOGdSVUpENXdPVmIxMlkreStSVzgrclQ3NnZleVdUR254U0tvbVF6MVE0NFBVTDF5V3ZlZ0ZDUGh4eVpZMmVxZE1ocUZVZUp5WE9rSjV2cnFrRUk3Y3kwS0JBY3VTRDFQNHJKeGhaY0RGYmlEYmRxMUZMeUdMWWZPTTJMcU50ejVBalJ4U3RwTE9EM3JBODBLYjVNV2VLY25zS2VjdnJlZXg2VGFDTGhxYmk1Z1kwWDEzcEpscUZBbTdvVHlHRndyRGFPV3VLRnhqcHFkMVkwVkh6YVpnWW9xNWo3OGwxYy9BWi9PWnVvem8vQUxWTzl1cGFEL0EzZzdTNzRHREV0UDBoWGhOUHNyVTdla0hSTW5ycmRjcys5WklDcm9DWkNZSE5IaktJWnlRd1gvQ2V0ZVM0a3hGTk8yOXFna05OUFB5Z3lEck5BSXZPeHlQVVdjQjJ5RVppbVkrTUdiS2xEVmRFZXVBb3hZTkFXdjFVaDRZZUNYY1Rnb21ER0t3WW12RzI3YXZVVVkvMlFjU2c5WkgveEpHNUs4eHg4cEcwZFMwWlZsNFJIbmVlVXJGOWo1SEZaTkd3NDNoOUNmZ2QzQ1hYT2ZxTTFOU0h0dmZkNnM2dk5pSEdCVkVCUUI2cTJGYWhaanVmakpJaC93Mi85Y2JWSlpYSXlVa1QvbEpWS1NNeG0vSkFlbVR0by9ib2ljdWlpSW9ld0ZudHN4OEZ3Z1FJcTBPTU83b0o5VmdQeVc5THRvNCtueEJRcmtBNUJNekNmOWJtUW1xc1FHRWdKOVBDeFFqa3JVQW1xUGJiTGg1d2E2Mk14N3hDc1ZnZGtVMVFaUlJXa2g2NmNtWGgrLzRHS2RSdDVlQkZMT0luL1N4S01YeWxidzBCRjFpaVVUaE42ZnRuT1NNeDRPQ1doRVVjMlpWSFYzWUU1TlBaL1ZnWFpQaytGNXcyN2lreVpoVG41RlhVaTgwMHBNRFVIS2pGZTFwNVhUVU5pRkUxQktxUEh5ZG8wR2dqK2haU01jTHBwcWxYMldXUDVzelZyMlFBcktyTm1oMjJ5U3ZPMFNkRWdQdERFbU5PRzRKQ2VmSUJUM0gybVVKTnM0NWZlVTdib2U0OHVNRTMzdzE3blRZWWFONkV3Q1NjbWNBMFBUUHQ2eTVPOFdZRnJvRnVHRlFndC9pYmFwS2VDSXc5OHorS2JkZW5XNEYwTjQ5eVljeXNlVkxOUHZiN2xzZ293dU5CcVJvaHJKNjMzdEswQUl6a2RQR1JWU0hMVUdWZlB2clhpRm5TbnN1QmlCUmhWQnRDR3lCckwyNmE2N09QV2ZZZVl4ZzdXanl3aFlzZWN3ejF6NFlOT1NyTE15cXAzc0lBU2ZodVdLei9wb3ROdC92MWxSeWNYMkx2c2Iva2Y4MUVxamU1d3VVVVhLMnVsb2hyZUJMZkF6Q2F3eFdKWkU1N1BMVGFZV0JSb2FEM2t5aFc4ZUZ6TTVzclFOSlRYYVd1RW1zTXUyMTJLajV3eFFrS081QWgyYlIzZFhEaW1CNS9sQTBrTUxNQUhIWnRvYnFPU1RYNWM3ZjJQam05Z0s3T0FwS2IyS2V3azkySDBjOXN4YktxSjhvMmUwTTZjKzRDQnVsR3d0ZkJVUXZOMHpzNkNMZjZ0Z0k1cmFLTkd0Z2YzekxoRm1iK1owKzlJWmtKSWJtVzk0Z3ZNWE56NFVRWVh6OXBRMEJwbWRNcmVDUkIxRjdOT29Yb2JPdW9ORGo5MStlY1JCWElGR2ZIelRQS1dSeE14dEc4R0c0VHdxUXBubFpENlc0TUNKc0NISVExa2w2SGd6YS9wOUlCOXZUdkFoQXhGbGRHNHJKQnVkMmFNQlJUUGYvcVZ5Zm9yUTcxWVA5UnZGNXZqK2JQbVlLaERlTXlIRXhZSkZLRjhFYm9kczBzWHZoTU94dzFVcndnZmlDR3VIVkxaV243RE04VXMzSGVaYUVOeGJKM3hrQ0lZbS9aR2FBL01kR01scVVYcGlvai9POU80czJ4VDc0SG4zQXdlaEE2UG0rMFlpcDhxd0FOT3lDUno3RjdTNEVPK3JiUkxXOHM2dkR6emlxbjBCYjFkbkVraWFsRGxBMXdOWmxZaDA4U3JSMzJPdFhhMUZHZUNUZVI5Y2x2RU9MNCs1RkFDdEdNbERsNUJIUlpDWXBhRzIyWUoyMEVJWlVrSDdmTkxmcldMK2hZdWJxTzU5Z0x4SythR1dzN1FrVEFOblllYUd3eWhJN0xZc0hYcVNTSlRpSnVFd0pHVHRHSDRiZDJ2YWlyKzdIei9MSXhyTVNpTElXdXZxYVNDc25GNnBIY1MyQTVKZitiTWt3dXJ5blBiVTlNMElpWmY0KzZQYmgzQThMNVgxbFBjSW1GbWFTdjczVGxTVEpTNzV3YzJNazlFcDdNaTdIQlQ5c2tNU1pKWVhya3VQTjR1bVQrWEhXU0tBT2MrZjFKMVdmTjZIVGlqTFN2dGFWbVFxWllIQWZtQ3RrTHkxVUxlblRUbHE1Nm1TK296OXc2bHBxaUFIenl0QnNpais0UzNHSVdGaGhGWittZEJJSmYwb3hFYUVyaCtyTnI4YjQ0Z2ZVK3ErMVRjWGhWSDczeTlkakw3b0JNUHRDRjUwblVmZkduSGpxNC9NQnl2eW9hYk1lZzdrdW9BUEhpV3o0RE1IQWdHSWIvVmRza2lXVTdWcWNpTnowM2tjWkFQQXMxK1Z0dFFQVTlTNXVDMldDb3RiUHJGV2dLRjhsU3lVbzMzZXRsbXVEWjF3MWp5MURKdmNhQW9TY3ZSbUN2NkZ4MENISHgvY1g3VlNqTWJnN1ovODFxbXZSeWpnTzQ4a3c2VW5zb0o2MDdubGUwYnBqV0FwM0F2ZmtMZVpraXJlQ05KdnVmcTJxaWZ2Smxmanl2dWhoajhDZ2UvcGhwSjBVMEYwR004ZmcwVG5td2FMVTZmaVJlcXZiZkdjWlhRNXI0TzRzeHBPK2hHbDFwOEdOeUNLWFoxbndqcVBIRGNSTWM5UUhWVDZTa1k2UEgzMld3ZVFvbnhadVFsUzF4aXY5UEVEd3dvc1pueFZXK3JUd3NNS1VPbEV0Z1QxVUdHM3d5cDloR2pXcUpkQzlRQ3pQYm9oNmY0RlU1bzZCZ1pnR05SS296cnI3YzU0K1ZBRDNkaGczZ3ZBTTdldUl5cXJsS1U0akpuUEVSSkVVNlQzcHNSR0NBSlRYcUk1L2NWNXpjVTNVdkJjN25xc3hWVk9XdFMrNXFqK1U4NXVSVTZ6NlhsaHBIdXpnYVRHbkJ6L1BScFR4RFNjS0ozV041eEdVbklqT1g0RXNjREwwMGVXdkUwVmZDUmFJeG1ZL2NLeTBTZzZFdDZ6ei83MnhFN29MWFdoR1dJVDVJcEg4ZllqRDd0YlFOTlE2ZTNJUHR1cHNUTDZpWlJuYllhOEVDZUxRUE5xM1dlNGg4dk1mMTQzZHcxaEd6Z0t0NHcwNlhpOHhVMENwRUI3YVhyNm80TGVYcy9WRjJMVDliWE53OHNEKzc5QXZWQWRSWldJYkF5eENVZXdCcjlrK2J6NlZvSmpHSzZoOGdLT2NMelJQajErRC9XODZiOU4wMTRpZ0lIMEg5SE9veGVmVXBwWlNGQXJld1pTdjYzM3cxbmx3M2NQZy84eU5QdGMxdzdNNDFEMzVqWUdLNFRwZ0gyUnZNc0VNc3YvYnZLYXlyTFZKcUR4NHdnSXAyOWRjekRqaGpYUHZLamE5QXVYS3kxYVFENzdUeW92ck1qTW9mSDNVa2IxWFlSZVpST3BmSDZpakhLc0ZGTGlrL1FPWkZqbVNHZnF4Y0JWM0Yxb2drVi9wb1luMEFuWi9tV3dPMFNLdkxYeEpySlhocUN0VVVnSWNpZnNRaHhTUjRBVlBwUWJDMVU4T0ZueHlTTHIrSDFYZDBuT09Bc055SklnUnVJaWNsWktnMjRTTXJEd1V4a0NmVW1YWnUwVDdVNHVZM1NBWXZlYXJUN09GeFVqWkdCTEs4cndERWw2WmF0RUc0by9mSDhkR1JBTDVGSnkzT0c2cjFFcHAvejRBT0ZNc1hNOGhsd1ozdHhrYVJnTEFGN1VzMWVhZENJN2NqU1JPRVVWcmIxUm1aTERPTjd2QmFDNlRCVWtwNUR0b241dkNrcjlsYlZGVENKRWd2RzViNmtrN1h5UHlqc29zcHhVNlZTeDRXVEZKdG0zNzdSYmdBS2k0aDFKZzYyOWJvMHZhVXlLWHcwdHVabkllS1F4bXN2elBtV2RJQUFyNmpYTTFWRFQ3WWpIdGM2QzhFMmdPK2VmVnBtWVdBMWFIZnZCTnVtdEtkYlFuUUVYNkh0bE45cHRwWmJkaHJKeFVRN2Y3bldXeWozZ0ZmN0FhLzlwckxSVTI0RE1TTWkycGlNVVlFKzkydFhHTDV6Vm55K1NEUzZ2OXF4azJOUGxSOVhLSzAvV3dqKzVSMWV0UXcvUHh1dkhPd0lWWmV1T0ppTEFrREp5dll0d1ArVXcyTnZQSzNDcUlnQk9XT2IwTUZvMkh0dWJ4OFlCZG9tM2N5ajg3RmJnTXp0VHdoc2NETWxxdWNrZVJrWjJqUXdYcFA0QS9ZV2lNV0xpZkgyb2IyUUdFTVB2ZGJQRnJpbm5wK1Zaa3hLN0dBSWFhOExHYUZaWENDU1V4bWg1WDR5a2VhSVBVSG55WjI2TlZxOW5BOHlGNWNsdWNnN2UyMEd2N1hUVE54QXQrMjBYc2o3Vi94YVhlTGVWK21DckVDaHc3TGliNjM0MWkzcTd4Szhlbmk2ZEVNZmVtWHRMVHl5NENyWnF5dm5GM3haQnlROFdMbVNiN2xaY0FlTGRZcmZwbWhTY3ExWFFTcDQ4YnEveFNPZG8rTTFpRVY3MFJmMnEwTHl1eGZ6ZU9KVzlJVEU3QnF2WTEyVFdYckdtdmNNU0piRWkrS3ZPQVVORXEyQlZZT2R1ejZFaExVY2c2N0RIK21GWFBKbVNEMXErZXBQOCtKdmxWWHo5cXBBb1A1SUNOQkk3ZWxFcDJ5bkFqWDhPdlVZTEwxekc2eFpOUVF3RXlrbitYVmRlTmViNEtBM3lKNXhodTA2WVVUM0pOTmdoZEl5TlM0NW9vVXhUUXU0L2x6RmpzQTAvWDFHV002MG9TMW5kZ0Urb2ttVXQyRGFHdE4xcEFIVVg1QWhkR3ZYZWRwdEMzTlZhUUtBb2RHMjVSTXBTaVlORkhWZEN3ZEptM21yR3lUbkJEZFNwM3lTVGFkMXZPQUdyV1hGZ09ZSndZNUNjei92MllYcVRHKzMvZjBuTjdDUDVyaGNpNnJNUzNFOTJWajZIWXRNdmpHbVYvaTRHUUttaXcrUWF3L1kxcVRXcWJTUGdZdjJHejJOajMva2IrSHIvZlhhVVVqZ0VuSjBOdEdrdE1nVktYSWRVNVJOVnNQNzY1K3E3V1pDNjVBWFdnbGFMUjZlV3Z5NUhqejlHU2pJUFFTbWowNm9ES0dqOExNVHNDZ0JidW5Pei94U0lzMVFtU3F3cWpScGY2b0Q3cnA0V3hlSzNUOW1PU2JGRnpXMktndE0zTW9oWTVMMXFPTmNpTVUrRXRLK3Q1aExvSjNCd0RVK1VoaWEvWTNjTXJHRjNFdWJRY25TV0ZvR0dlRlRBdnNQcktVaGVzbjExbkxER0hJdUJ0bi85bkJKZmxiTk1jeDVxbXJKMzdyS2lnWWJpTVZvWk8wUXpKNG1BSUVOemt6MFVuUERsZi9zZEFwajJwdGdhTWZuckM2Q2hhOEVrUUtxWHpMazFkWUdFc1F0T0hYUEZMYjNFUnNsd3ZWNmhFU0lDTE1RRmlQYUJXS3BnY2ZmSmJxZUh6ZHh0cHlKNEVtYWJZb2djUGxydHJHWndSL0RZemtvU3VWbmlYcXdaN1k1d081Sk1HRWx0V2xVTUFNdFpOMGxuaHh5Z0lzVmZQdktxVDBxKzBsdHJSK3lCY1VVdWo3ZFhERkdFeDZwQ1JxSmV4YTh3NEV0WElxdldOT25WRHVBaitoUVBZZTBEU0hoZ1FLUTNIaENLYUtUWis2MlZVOEVOZ2ZYdENDeDVTdm1CdlU0Rm4vNXhqd3BCR3VBQ0tMbkUrdWszdUpZaVZTd3doemV1NVZyaWNUR0NtcERhUVVLL2p4TklnT3EzSEJLQjIwUWxNZHN4bUY4eTUyaytWVFQzU1pZZDNYaEZBUDgzd1dycmFicnVqa2xFV01qMUZUYkVxb2dMd05HTmNYRm9sajJtR1FOS0ZTdklZYlBPZVNVTzcrY2d6Qk9UWnJaUDdLQmhWUGM1c0Mra1BVMHlqVXpzamNHaWxkNEE3bER6TkFzOEFDZnROK28yckNkaU9zN2lpZUlLbGNqMmY1WWVrNzFBaDBWTjY5RG9rN2htZEFBcE41OGlaRUNtMll5MTJ6NjdnZXIwMlZyck00R01JQm1kd0hZN1A2VkZvOWdVU21hckFQUkVEQWk2aHNtaFlMTWdCR3JsTkNWbFNCZWY2bnhxUzViZHE5U1puak9FNW5YWE9nN3ZaUExPOVY4Zk1LbUVDNDFpTlErNEVSc3V5eml5YzJIS3A1UDVnOEQ5M2tRMGw0YXBFNkJSWDdYM0lsdXFBVnpSaVN0U05DUHhtTkR3b09Hc1ZJdkJRU3orS05sbEtOVFc0WDVidEZUZFJ2OE5uN3ZZQ1diWUtyd082dkRCVk5oaEZjT2FSZWNHVGFQRFdhYUdlaGN1TGhHVmEycDlxamtMNm8vR2d0Nkg0aWVoNGRTc0txWUxOOVQya1V0NmJ6NEhBejJmTXpXUW02djE1NXNmVlo5My9LYWxla21KNEZtVGN3MHNGN2phOVltZTFYWHRnN0VmVHZtQVJESEpXb1JBK05kUnZOWDljU3pUM0tyVkg1bDVMN0dGRmUzRGVRL0kyeVdWZjc4bmF3VXpNdlE4Y3JCYk9CcjVLdlNwZnM0ajhQVWxHVW1PVENQQ1c0a1FWcVpvWmcyN3NaVWN2U2lDMnpQdWhiYWttck8wMkk5cmQ1Qndmc1h1MTRGNXJyMnZnZnhscnF2R200bTVJYURWamhZYzJSTmNtMm01UzNxS0Z1eHZHNzFnd1BCckh5T2x1L1ZuaUJiZ0k1dDBOMUpHU3U5V0d0b2cvQlp1YW5NS2dCeHZUV2tkYW9nd2pIK2hTMGY1NU53U0NQaU43eHUra2V4bEpqZVMzUWxQSk01djh5eUx5Ti9pbGUvWFkwNUxrWlBrTU1NaFFYSUNzZXhwVXE4MDdsRDdZZ1o0dG1CVU5kQjBRTXBTbXA3L0JLRVAvMlpOcGI4Z2ZTMUNBdkZpUklLSThlT0hQVGFhenFXeUZKVjNWZVM1ZHk3bTZpSUZydkpOeTNmSkJMRHFzZ2F0YTVzcU50a3BZUFhoVXJPU1ZoWjg2cUJXTHVFajJYUWRyNXRZM0NhTWhjTmtMZ1FhcERGL1FpWDlucldVRm9zNHAxSVRtbFZIUTQ4MUlaVlhlYzBmWkszcWV4OUVCUkJ2QzhrV3pHaUxoYXc4dTh6UHpiU2E3QklTZHdxMFhIMEEybUJKYkQ3d2QrT2swSlNEcSt5SjU0V3ZpbzhvdFo5b0pqOTVhTDZPb3pYYzBEU1NnL1Uxa2s4LzVRR2sreThpcU15Z0RNOGpXNmJ1NUM5TFpLOXB6bU16d1RSeTRYZ0N3aE12VDZjblZqRWMvWkIvanJBbkZMQUlRaDBaQlZyU0U2L0ZBeWRXZ3FaNStoaW5xU0hlUXhaZW5iM0FhUWZwODdkMDlDTVI5OTNiOXlFTitSNnV3SjJEWFFhR0RmOXZFdHRrdGFJM2wwU29BaUxyWG9XTVo3c05WaGtlYXZpaUFLVUViM3V0Tm9UeWROcFhsMk0rNXY2V21aVXI2bzlJNEpxNk40VmJWenkwbjZNdVNPdmlWQ1N0OWtRTmRKdFhGTE82WGlacUVQbXd3bkVpS0NCd1AxZHE0WUNOeEVrMnh2Y0hUc3JUeWZlL2xObGd0dFlBWWduSHcvQXI5ODduSHVTeE03d21LRWdYcGQxTEdmYTA1elVEUm1BK21WQzFKM0tNN281a0o3WW1za21uTHNMWFZnSXNuaXFuVmFLNXRjZzcveVJVVy84VWpxWUErTlJBN1A3cnhYWkErU3h1dVIySGszS1JFbEFLTjdnRXlhV0JkZjhNd1dMOE9lQXo4RjJUNmJKU1JTVmhnc0ErRUVsQS9JQVRBZGpuWU1kTDZxWStpWDBBM1dhWEJlR2FQY0FUUGpsSkx2R21vUEFCdmluOEtXRDRGQzNFNVRISHF3VGhlUTYzSlRjSjVnbXpQWG5uNXBhSzAzSTNtb0cyMDYycWlQaWhQMmxxS2w1Y2lpNXhmRzhOVkl0QTVxamxSc0RNUGlralpqNjJCSXYxNU10RWNRZW44bnV1RXhJRmQzWXZkR2ZpRzg2dTk1MXRQSjRxdGM0STkrbzdZeU01Q21IOTJOQjlGc2lXNFpBN25scldFN3MvdlVJRjB3eDFmQ2dnOVhqU0dOYWI2eWNmalhyMHVmMnNiTkxJZEIyOERlMFdNU1NQa0M4QWJOVXJHV2VHNlhnR21lWVF2eC8yazdpNVNwbXBZRWk4bFROQThIbHB0bk8ycS9ZZGJlMGp0bkpPSGg2b0gyc2NmMXRScUF4YVZENDUvMTFDUlAxRzkySmo3d0xISzFKbnJqZWM1WG9MUU9hVHpvWnpxVkNZc3BiWUc4Tk5WOWM5cnJHQy9ZVThMc3Rzbks2dUlyV0x5UndGMzQ1WWV5cFI4dWQrU3Z4R0hTVUFyZW1lWmVNL2dJQ0FnSURtOWEzVitldWQxMi9COUlBQXd1aHcxcEIyZ2IwakFWTEhmVlcxaDdoSy96UEM5c3krYmxraE5YOWF3ZUNWeDlwRFFWcngxSFNFNlRWM2U5ejltUU9KYTkyb0ZlUndHT01JdHhXRm9ud0cvcldUTDdIUzQyQWdrMFQra0VTLzRiNzZTRVN0SnhxVXhwMnFKRTJSeEZiUmpSaEJtNlVtZVAxMWxwQk16c3VqWmgrcjVVVFkvWCsxa2tvWGpnZklWaVRMMUIrSFBnWmd1VFFRMkF6aGZBNzRyUFNLOEY2N2xYc1F5aUp1QXg4Vm44anVadXc4NXhwakZUOXQ5Z1Z3UU9vOTN3NE1RQkUwNmJKNHFWMXhnYkFKOGVidDZyaS92dGsreDNVY2FZRzRRTVdjVllXOEZHTjNtVVBWZTEvYWplK01qSmREWkJISU53dTkrdWdRdm04Z0g2N2d3YmdtVFVQQWJjOGpoSjdRbTNmMEZvWVZHSVZPeERJRndFN1hhTmg1NURxRk42RGhFaFc5NVBOWVl2Ri9OUnBSQXJraGNqcW1VT2ZzTW5kQWpzb2FWWGdLQjA5VW9KSmtGQ3kzdkdOdCsxUFBkZFVjWkVwKzJLQmp6NWUvZEx1Y3BCbWFmWlozL3gzbDZpY0tZZFhpc0NHQVEwejBHUER4Z2o5ZkpVcDZGMnBmQW9xdWIwM2ZrUzJGMXJBWUdPUzlxSTk0ZTVEL2RWQzQ3T1ptSDd6bEx0c1hjbGphc0FoWW1jSlNqOWw1bE9GN2VoVThPRnFJTDhkK1cxYjlqSVkxZWdmQ04zeGNFL2xJRHV6L1dXMjNIMlY3cWZLZk9IQmpVUjQ3SzBpN3B5bGxaU0cwRjY4ZlkyVzg5bHgrSnc4dU9YeFBBV1VhdzF0S2tTOXlrcHU1bWNXQlNJV3RWa015eXlrODFCRmdjelB5Ui9pUmM5aEcwUm9tTUNsNWZ4SjdLWm1WeVJodlJLUVB0RlpFZDdXZW84VjVUa0E2WUxlTDVYK3dUbUg1QzNCQjVsWmtLOWpZNXJVb1VKdTJ1aTBLbE8vcVFrUjhBVlVUa3NHV3hwN0djbUo1YUhvdnErZkkzWFBGZWpRK1JYZDYvdG5xY2JqR3FLcFkzcVdaVXFsSzlIcjFnOHowRWhhRjZEdnpnUXUxVTNQNkhGanlUMS9OSWZReEhEcjdiS0tNSWlld2hHY0J5ZUlUUmxUZ0NtN3FTd3pSRlV3VVovN1RpOWJiNmlnd1BNc3RGTFNCaE9HNytDUExSdkNvKzZDaWhxeDMrTk1tNE1QZmRPWmRBZFNscUJZWFovekxpcTRMcis0QmhuUHlKL2pMbWVBOW1waVVmcEh1UXZrU1ZNT2tEcUx1TmlXbkFURTZZelFlbVZYY040aGpjTEdkTTZ2dWxYMkFIOEtNWFVra1VBZnlta204OEpES0FJUGZrangrWGM4NFpCbmFMNVhFcFRNY0h1NjdCV1NzTnhxUUoySHRnNjJPWlhHRG9rZ29wYy8zWWtIa2pFcVdsUHNIZ2JNcWJPMkdndXY1STNJdE9lRHhnUWxqQ1hPS1BIOGp4Q3o5OVFKeFMrTllac20vRksyeTdtZksrVzgzT3FoaUl1U25KS3AwK1ZjZlNSbGZhVTEwZ1liVDFGUjFjZ0Fja2Jha1UvNTl2WGlaVEZmYWRZaGo4L0xBY2RuS1JramJmM2ZkME5XdGlEZU5GeVBSbXY4dVJQOWR5clo3RjJjQ05hVlVnekE5SGdxc2RKRmU0MW1wT01tbWtBUGhOdzdEeGpCZUFQc0p6SWxkUUdVeEtPbmxiNXNtcHdnSWFabVRVcmtMQ2tnRmZaMkNZVEVHWmdTUkhLa2Z3UEYxYnhLQzN0YU8wNWNrM1lEaTZLNTVHQjNYT3ZRYU5wcFJmTEtwMWRmdk44bXRwQVZvMnV4VFhIZk1UbEJJam82MWk4ZUtzVlplc3BOTE1WR3NXekR6YzkxUVVQaFdCamo0V0JRUEVWMjB0Zk9XMFZTS1ZNYWNwUGhmYXpQM0UyK3NGNGh0WFdZaG8yZjR4VDdobjJYUXJEU0NWOHVrUktMa0I1eXAxQ0NYWS9ZREY2K3FzVXYrOEhRcFZiV0dKaDRWWmh0TmdPZEduSlJvZCs3dFNkUDhyNUErRzhDWUMrME5mNURLZ1hUYXZsVGVobkQvUmZ3bzE2NHdsK2toSENydWxtclRpcVFEbjZDMjZlUlFMcFp4aUROY3dNYTI0Y05hN2dDRlg3ektGOEFyaWV6MFkrdjJMOTQ5RWN6emU2aVNyMEo1ZkpOWUdOY3habGF0bWpWNU44ODVlSllSM1VDcG45Y0J5ZFRlVmFDTEVEUHduUFRJQkk3MHptNmUvSzdVOHQ2cWxuU0kvUk9oL1RJNWZWdXhIZ3RQd2F1RkIwdGZyY1RYdVFyOTdNQmFsT3NBaTNpT3RZcERsTEg3TmtvQ01rdlp2NWgwaDNmRjExZDBNQk4yUkRSNlQ0VjJqNUhlaC9IM0lDOURVSWZNRVBGV0lyTlRHa1A0RzYzc0oxVEdwVEplYWZSbFZxZnowMHVDMGdobzFQMUFjWmwzbzlIVzl5NUFsbWcvMytmb25pRzZqS3gyZ3oycHRGNyt4NTQ3Q21qTENLOUhZb0JVckttM0ZDbkdkSXg1aTBURmJKWndXNVBvVlJWWjEzMUJjYVhCeWdzNTFTZjdaYytraUVLL0tBYUNUbmxGQVRwU0FkVGVVM2tFQ3JmOVNXU0M3VStrKy84d3o4eEpNdWt0c052ZC9rcERTN3Vtam9uYStHT0VmMDZJQWs3b015K0N2R29KQitacWttZVphcGNzalA4RlRWclRDbXdpeFVNZ3BPVTY4bkVhWkRMUWJ6cUhRc1dqWFgxQmVIV2N6NE5qTFFHY25SQ1lPbkhwdDA0aVZ6dGNWbW0wNlRJa1hPYmhVdDhFN1lHWExSYjBJd1NFQnpvMGlZQTRsbm1lM2M5aXA1djVGb3BjQU9zZldpL2s3OUplN3cyWFI4NEQ2eEZhUUM0U0Qwb3kvQy9DSFNvV0l3a3JBSnY5b3NSZHBwRzJoTHJkZWVWRmVjYzVxZ3h2Q3NCWTlKVStraElUMnJ6d2Nlc0NRNnBRWlZSbnpqbzY4QW43bE52Sit4UHpWV2Z4Qi9qMk1veERtcHFYL3cxN1VkZ3MyREk1NmRUR1pHeE1HcWZ3eDZDckhBR3lsU01MY0k5V2ZFMm9xWVlaYTZaSVlHd0U1dFV4UlByV3F6NFJQNmtoT0ZnTDR1eDBiSEg0d3F2dEVUMnZMWm1IUWlsUXhUQ2pGVHdnbXkrWW9qNlJuUmp6a2xhWXMwcE5PMkQ4aU1MN3ZaZ0doZkY2UjFMVG5Wd0N1eFdKN1NGem1HVUhXVWNQZTRpbzBHbG9JUVhFNmp6RW1uNHpDTW9va09VaU5BaEs1NWJoaXpZN3BaY2FGUmFYRjJqV0xFMlFqZGRDZzhuMHRWQSt2cDc3OTBOazI1QWZOUEVyLzFJc2ZGbEdPV2l4SWxCM0NKVXgzSjh1ZFNkR2JycUJGd2Faa29xMnVteXNWd3o1bW9IaTRBcWlQcHRMM1FiN1JNc2ZkK1FwSUoydUxDY1pPNUNDeUY3NHBrTm91S2daTU1uaXdOdTRnRFhMZ05aSS91Wnc3bmpkdUo5YjhqcVlvSktaTFRQMUtNMU04UjhyS1NkUUM4Qk9FLzV3a3h1RXJKWUpUa0lmejJsVUI0alM4SXBzY3FtRVVqMjhPWjlDVldiNVJGUVJRY1lHTHk5YUtML1BoRXl3TCtZMDB1a2g1UDlPc0J2NUxrVnRpSGxRN2t6UnhSQ1VWbjNldW8wVW0xVUJXbTFqOFJsem5UNmFHK3VlcDZvSTAxOWRGRVdyNnNBRjYwZFVvK0hGS3loSUlDVU5zWlg5bnBtKzJIQkJoN0FVQ0pCejBvU0J0ZjQ4NW12R2FMeG53YlUwNHNLbTNRSmNqaUFQbU1BSXgwRE82ZUEzalNibVYybEQrekkzTjMxbjRDWXl2VGtpRTdpMEFwT01LMnJDZlpQQ1JKbHN1Tm5UdEtzRzBuS3F1cEs3ck9mZzlSYm5mN25lQUt2T01id3FCRkcvRExLRnBFMUlBakN2M0JaYUxodlgxQm5tQ0p1WnIzdjBZZFo3dDR6eE9oNERvZzhtQUJuL1I3bnM1eVlLNkJpRGRzWFJSeG80dnIrL21LVWs0dmJhWmRLK3lNaWwyaGVSWHBSUkV0N1pxRnZUN0lZQU9md0R0RTAyb3dWUnprRWZyWEx0OWMzQUg2eWdrU3hRYzA1T3g2RDZkWTRRaU1zYVRvaVJKenNZdEs4UlVLMXBldU1wWFBMUSs1dFhTRjNUZjl4YjlPdTFKS1p3SmMyOTVKdVc5VC9ML0hweDY3VENpTkZVdzBrd1VjN0tSRExLT0ZxcXk2aFNDaTIzUk9ka1dsWnF2eWJUcTRVTmxFeDRaZW9HUnlTVmMyS3M4QmVZTytTRUE4Yk9uVFliOFVIVmZDa0wxTUNyVTJxS2s4S2dNVHBqZTc1QlBlVDB6M3dlWm0wSjRVdXFZVW9ieG1QWFI4QVdjTWQ5Qkh3djVSNFhxWkFYVXVQcmF1R2k5SEo5NDF6M0xMN2Q2c3NDMUZ6QlZjaWxlUGxoNU0zZGEySnFCQzBleXE2YW1aaGYrUzF1alhGbFBBb0hXNS9mSFVmZTU4RTkxekxSRkwrUUNKeVlpem5pVi9UMGhqclN2eGZqeFZ1a2lFck5Bc1JPbGhTNFJISE9Bc3c1QXA4emxjeWdtUnIvZlhFN1pxLzROL3lOV2l0NDZCWmlrZzZkdlFIUnd5d1VhbHVNajRXMUZPMDBzYVgzZzBkVHNBLzVFdzMyN2xjZi9yTWdGRXZ2Z0VXQWduY2d1YTMrb2Jhdmp0QnZpc3MyV3dRL0NKZ0kxQnV3VkN1ZEFGeldBekJFSjE1T2hscHpzNVpjQXlBZVNVVnA1dWVKZ2N0RjhSN3MxMW10QXU1TWQwczVhNy9qWHl5UURIREhYandUV3MrZFRJWm9yRDJ4bDkxZWdORFN0bVhUd3BYTzB3M0ZGdytEeUprQUlUWFpKU1dxL3JSOHFISlhWUmdsdmhONWtiK0ZjRGIydW4zTk13bk5VQityektYc1I2R2FqRzIxVG9SWmw3TTE3RVNYWCtuL0RWWklLREZMa0RDekRCelFJOHpIUmEyVHNjczZ5SmE0MTRreGRsSXZ2TjJsQkhGRC9ubmlpZDNTN3BPQVdtNzltdzFyWE1yOXJIbFZna05zSDAxOURFczdBcjlpTEpjZkFZWWRjdzFxOHlQWldlTGFGRUJaNkJoVG9MZmpueGhtUmYzeS9QSFdsRnNnMVZMNTdBV21UYkdBdUdmTGxtUTZ1ZHpHRm1US1FLZER4S1N4SlV5MU1mTllycC9DNVdTMmQ2Vm1wUkxGekNKV0hUMmFZMUFRWi9RS2d0azhvVXN4Qk9PMWFUTmZlTEhnc1UvaGorNjJVeW5Ya2tJcTFvQU9sdkJTZmNJd0VEeEc1ZFhXVTlNZzRhbW5BOHlXN1c2NnNjZDZNc2Rwd01PbEoxM0ZBTDlJQ0xtZ095RnIxNDhLdlJiNDRnUGpWZHRFbzF6M0FOSTIveDFpdzBUSVJmTVB1d05tM1NjSXFyZmZ6TXRrWE5GVzBpODRpdnJoSFNsYkhQR3BjT2x3TEd0elRCblpWTzdlYThvYkd5N0NXM1MrZXJsVVVBOUlkcVcvV2l5UnR3U0JrdWx2ckY1aitaMVJoNDBlOWROUkR3TmM1TTJacXgwRUFwWktBTE1laEZwdi9IVFlJck1RWkkzK1JaWGR1aWsrVFU2TzJ4QjZZMjJ0TWJjMVZBSEZMbGlGTUMvcVAwZ1VUY2t1b2FCUDg2eEN6NEdDMURTbGlPcXlZcG9BcFl6K2VVNXdUamRyNWdpOWM2clVBZDczRGZZMjZRZ09QUk5xM0QxQ2NCcXVraVcyNTNUL00rU2RvYzlTZ3JOOWg3aVRldUhGZW9FNE91NW1GRkRXbVNqTDR3cHZYRklieEY0dTRubm9IZWxadHJhR04yTnAwaFR3eTRnbWl2RHpEc1lPWjVkYzlpVVNkRGY5NnowQXdudktoQU9Zb0xxRjlONmY0anRmWUIrVEJhTmhreGRXeUxMbXFwdVNJOXVzazBocGVJQ1pCK05xZGNuZ3kvOWdPUTBWR3B0d240bERtSUNEb0pQQVJyZnpERHRybjVvQUR6Zm5OMURjOGRkRHA4czlHN25YK3JEVmh0OGgySEtNajVDbVhrSXJQTjZqNlA2VlRLOWNvRVE2cStoNjRxWDNzNFZnNjVhc1dZQ2pEZmF5VHVrbWc0Ui9GTytIbi9ONW9CVjVPVkROWkxuTWZMcElhYitoVVlNRzdZMXgwbXkrSFVxRWRKYWt2WUhuUXcxeUxHbU80R3VSSlB1c0oyZDFwOWNYNnVkYi9Jc2I5Vk9QWWgybVVGNmt4eC9uQ0kwRncvOGJMVFVIMFZDWEJkT2E4c3pTbUwrVjhVVGlnWkx2TXBkeUY4L1FVUXFQeEhWdTQyM0QxZTg2em5IRlpDYTRtS3FsRXhHOWpHOXQvTEpaNGtHOFZxZXNGT05iVmVlNko3TjU0NmRnYzA5S1YyVnVhNFl2SnlBbXpDRHZaU2VSZ0owTVhwdVZtdXdDL2xhejk4WFo5Y0JkcFZESTN5a241TnJIZE9yZlFhSU5nWGZtMm9DdGcvU08xK2ZXVHJzckpJTFc5dzQwRFl1WnUrQWwvdk5sbGR3L1EzQVRidGV0SXpHWnAxSzVrVzY3ZEhDc3kvVGpLMUFLbDZTY2tKQUpXb0pVbTJLd2swenovdGdCSDBsaW1nSUh4dzlqNTZQZ0lDQ0EwZkhWOENGa2pMVCtPWXl4R2lxRlBKeVdKVXpaYmtmemJCVHdtTXBvTTRqRlhZUXA1UHBZZ3dHRFVJM1htT29uU3ZLd2hneUxRMmxSMTQ1OVdwTnJJcVpNcWFjQ29EczQwT0d5Zk9jSkJRWDgwQlBWWHBhRVM3M1lvTUgwaEViRm96a0QveTlyejFzVDgvVDIybVlKRlJ3dXR0WWxPcjNHTmx6cnFWWlRFSDF1SGx2MXhjM0p1cmxDbWZwT0J6K2dHMEJjWlArSEpRYktIYkdKdGNhUXFxbEtUR0w1WmUyMnY1Z3FrMDN4cFU0SitZK2p0ZjJMNi9yTWorc3N2K3hMLzFaVHI5anZmc3NjUHIwNmZ0dEcvdGVmOXUzbXZ2OHEwT1RlU1RsaDBQeUlCV1BxZ2YweWRwUDIyOWd1NkluS2Nzc25mT0dkcnQvSE1DMUtZdjRnRmxTTUd4eFdCYlZqOEE1b1Y3MVdUM21Zb0dBYXBpTUJUMkVJYnVuc2RScXdYVEk5aHFpWkhVK3FYUk5WbGtkTkhwejRUdjNNREUxWmlBbFVsbnJ2NzNOS1QxQ0RYZVpRbWdoOUhwYU1GWmFEbURxV1cxeVdIczh1MVVkTmFkc25xOWdNQW10aVBZRVU5eldZQ3pZVVc3NGpwTnF2Qk9DTXA2Tnh2WFVFU3k2YlhZQys3eG9DaEY5ZHkrNURIWlVKcG91YThxT2hJTnVaRE5wbG5PUExGT0hQQmpBSFE3TlJEbVhPek15blNBQjhtY0dBM0Q2WFhKOW1MNXoyZS9KSVZVanVEOTB5K3pEWTA3WVVSaHp6UitwcFQycHMwN0U5ditzWndZMHR1MWF1UkZuUE5NWHlKQWZRU1ZmZXVNOWRJd3dwVTRRL3dXUUIrbEhRWHVrUlFXQ0MxQ3VjaDJZZitldkc1a2RnN0tVS09ySDdRWU85VG5hSHoyQTgwQVBZNVhvTllKb25xNlc3eHc1bFFOWUM2aWFZS3ZMYU0rR0YwVExCa2NBQURVeVNlS2hwZm0xY0VROTY4MkZqRHV0cGNDZWVUTGVKZHpwYjA0US8rVHBKVlpwenU4aVRUTWdjdFF0WGMwdmJSaDhCSytOa1RuUVMrZ1RwMW9UVlZDT1lmaXdEU1kwZlV1UW9CcDgrMmowMzVQQmFsRjZVRlJSdjdpV0hvME1pbEYxSjZlZmY0VEtOOWhYWWd6WGJlMXdjRkZnMUM3WUtqby9DRGVEL2dna3l5dm51Z1ZXQWlSM2lCa083cWlXVzJ3SVMyNCt6a1NoWVBPZGl1ZUlQMThZK0FoeXNXZVgzTVlNRXBHVTlVS2Q5YitEb0FwNFNtQ09janUvQjBpN2NFTWhFSUh5QXc1VTcydVEzV3N3cktVSkRRYisyTnE1WXlOWVd6OWlDUGsyVG95Tkg4U2hSM09TeVd4VTJEL1NMblA5c0FtMktKeDZzTy85c1B3MHp3MVc1cXhES3NxbXlwRERObDhCcUY1UUNKSUdhM2tYNVJRbzVabVJqQzlaL2VPK2t6TVNGZEZQYStwVGE5eE1valRiUVU2Rll5eHZDSHFTbWsxQ3J1MmE0RTI0dkZBd243bS9lSTNBRjVmRDZxUllQeW9DRDc2aXhDUnlNNTZZYU0xdU00RTdNU2Z0QXZZM1dPWU9NcHVZajkwYlNUMFpja0Y4MCtFOTcxVDFVTGlrK2s1VTdGV2I2V3J6TTlyOFd5czRIZXlLbk9uMmV5eklWcWlFb250d3RFaUZJWWtiWkJhcWgwOC8yMEZXUTVzd2N5SlBxMitycVZkYjlZdzBlUTVRZlQ0Z2ZacG9OTUN4N3NKR1F6Z0N5cTBnUUhsdDhmdkwxRVNiY3RIeFFKSlFhT3AzdGRtayt2Ty9MVFpuT0xoSkY2L0RCWDU0QWRRdzhPN2dmR2lhUklIWVZSUExZN00xekxlTUZNWGlSVExiWWZBcVkvblJkQ2QrYjloZ2VKUWpLanBOcU4wY1p4alhia0JHYlJNMjNLWUc4cHo1NStlOWhWUVhiRm90QWZzZzF0emR0SnE5Sk9lV0lsVWhBMUx3R3JJQ3BiUjJtZ2huR1FqcmpUUGFQNEErcXlJR3NyWVB5VnFGYXdZUURnWGpvOU5EMVpIK0xNYXR1dEhUL1VrVFlUcGpvNWhSSy9ZNUhGTk1EaDBsRmFhdU9JMUxtS3hwcGNnbTdSQ2sreEdUM0FISkJhZTkrcXd4aTl6R2k2djQyc2FmSlBKckNFSmQvQ3FqcFpHb2hRR0U0VE15clBzczMxOG0ycnRHS3I1RVJLWTNrbENBNFhQYXFZYWhZRFExWTk4YStWSFFZK3hESEdWSm5PRkE0eDhKWlRVZ2ZkYWJtblY2Y0Y1cDF0VWVKYktRRlViQ3R6WmZiVlJUbzhjZmkrdGNQWGNsbXhmQlpua05BdFBDa2M0aWN2UWRQdytxTVlqQUkvWjFocjB4a3hhbW5MOXQwcGt3U0dWeWRsVVJvZlZneUF1YkdHUXdSYmYyemdBZFhWZDlQdG8yTGlXdnZkWWo5OHVLcmd0dzZkTERuZU5zWitUaWs1a08yTVJRNlgwV2FWYzJVYk9kSnhiTDVMWmJzeHVSa1VHbnQraWtJOWhmVFR2UEFoVjZCdFNPMTlOL3FXNGpNbjc1SzBJbjJSVG1HaUtxb05aSG1kNzAzVVArQzRLbG5NKzlQYm5HejhvY3loSUtCS21HTlJqQUVUa0dUWEluYW9sNXdlb3F3U3AxTThGdnpHNEs0NDRSRjkyaUxramlBdW5VZGxveGNxci9RU25nZ1VPTlBrTFZMRU5nR2NXY1ZkTjhSS3BraElMVDd3WVZ6M1lMRFVZUVNRcnNWRmtFMVd2NTFFbjJmU1BSS2dqUWtwMkxsSTVHT3B6WUNhUDZUeWp6ZmxtcFQrNGppVEh2eDY1WFpCS0FmOTZtUDZtSGdVclNQcVIvQzdWYWZIK2NxVlRLQUhCNUZiWTlpMUJzMGN1UG1uS3o2NVBUSzRhbVpROE03RFVKVURSTUl6K0JUWTcrMzVMbDRLZ3FtQTZITXBBejBsM2NrQUlmcVBINGYwRnViWHRIMnVCek1pYkFqWnM2cXZzTno1dUc0V0UzWitUQm1QR3lRekdlSTcyRysreWkvYzI2bHNsRExmRWYzQlZrckNvQSsyMlBRZ2pZNjk5SHRxamxYZlZXa0lhbng5Rms5cEFGaE0yZmVoZkkxZGFla08xWXIvaXZzbWlNTW8vMU5jMUJqMVFud0Fwa0NSbTF1NUtUNTFWa2RSSm5Sd2lidHZ6VzZkcmx6M2k5YUJHNFJKdk9abzM2am9GUXEwUlNFLzFCSkE2WWwxeTZPelVwMmtMZ3JNcGxoQUIyN3BsOXlsU0hZejY4RkZZTlI1cUFGR25ja2VVM2FIKzJ1U1FNaE5qbDdDMFU3RUJjMnBoL2JsVkEydXpRWElXTzlzWFl2c2toa2FMbUs2dXp6eDRTa3ZQeFdPRUR0dnNnZU9wZVpuU3RoMXRvZ2xVOTlqR2JydEQyaStuakUrK2FucVRRVjNQZGZzRkpmeU5UZjhLVWUwQUd6Tm9EWnJxeGdVTHNINUNyZVNIdFJpc1QwbW5VVWEyeHJiQlh5QVE4LzA0R0htOGZ5S3E3Tnl1OW1ySm1mQ1NTUWtST3kyZXdQYVR4STlZbVNBeHpiZGJ4WnpTN3BmWWRvcG8vUTd3LzkwcWwwWjJhVGZOZTYzU1BsV1loNFBidnJkcVo2aUkvNFdlbXcybVBCZjZBNXVKMWZCbFd0RUhLUk9wR0VwT0dFcGE1NW9OL2pFTnM1UXlzU01UZTRwKzZVakRHMjU2YjduTWV2cEg3V1M5Wi9XMzFzYzM2RzhjalVEUjJ4QnNNaCtJbHE2WmdENEE5ODR2OW9kenRkQ0Q5MkFFSXpxdDF1SUN3UU52YkoxczAwSm1ZUzJJT2xzckd0NTN6amhvMmF3eE1FL0RzWVJHMGpYVWcvVGNCaDZROHEyOU9RRWlTcFU1SUtkVmxubWJtSGNid2xFbFRxa0wydVN3d2UyTDNuOU4wT2xDNVhibjg4aGpNdWUyODd2Rmh3L2MzL2VwdzlFZkl4Q2kxa3RlOXBvQlpBZG9MRFJGdW5OajdXWE5rTHZhdFVKV0xWNkxpR3Q4bFJxZjhyTDNCbm1LNS9Fb2RwS3NOOVg4cXFUSUtGVWtDMXhoVmlZUDl4OVR4OHo3Z25tSWtzcDJyVnNWNkxrT2cxaUJFNVdUT1Z5aEhsM3hMKzFpVG5jWXJ2d0xyQXBjclVPLzljYXFyMWIwME9aTm9nOWpWRGs1MG80TDNBNi85dmV1c2h3TlorMWo0RzZPQll6WUZRMU52U2pOWVltNk81OGNZQWluV2crZkJKRm80N1NDcTJyT0hRVGphZTJTSTUwYXBNQkNuZGd6bm1mZGE3ZWdOMzdBUWRqL0RYaFQwakRrYnNkRlBYcm9Md2xCaGRYQlpDeGl1UHdSaDJqT1lJdUtlc3ZNR24xZ3pCUmdzL0VZUWxSVm5pRHhUdnowM3ZvMStzK0V5dCs5cWdUS25kME5Yd25MME1JRGVONUh4QlJVYkhaNExUdFZnTmg1bTIvZUtTZmJEbXhVQjRtUDcxM0dyTFlTL2tQVGVhTndUQ1IzbFpPQXhvSGp2YVRZZjBjSjVUVHpHTi8xZEVONTJjcFJtemkrMHpEME5ZZkFNZzdhYXM2ZnR3aXJKMytuYXJaTEJtSTBjdEJUamsxMDBmR052SmFKVGVtZmx4QVZsOUptdUpzZjNVL2h5UStXekY0UjFmczFDb0lkc1o1QnkwNGlyOUNXbEVsYlBuSERkRGJTTnZ5YXBTUnM5ZWVRMHFDMGM5QjIrazJTbmhEMDVzS2tiYTlsM1pLcWxuNWZYb3djWVFPL0JmVDZxUE4xbjREWkdvMHFabzFWM01GRXVZM0g4cXpJNmJwNTFnZ0JXSVJNYzdDbmRxb2tVVDgyUkxrL3YxOEVYakR2Rkp5N1h2NGVLS0I2MndvQUdYY0wzRzdhTnpIMTh1L3lGaVVKd1NUWGwrWXplbitQdDNXKzRHNWV0ZVd1NldrUXNaUGpXVDhVVFA5aDJkSGMvWVY4bldHRko2TWhvTytnKzJlREgrMmRzcWhCelY4UmZ1M1A3R3pEWnNia0tjNXBhaGFWWGVhTWRiYWJLS2dWZUNMNWxWWDVpWnJGRm4rZ1RQOVVsSm5lTi96eUJ5cHl0UE1MbmY5ajEreWl4ZXN0R2tvaVB0cUhWRm9TanRjNU5mZjRwR2JKQU5IUGo5akNlYTNkQ0FJMG10OHl2WXM3OFUzZEFteWphQmFldmhOb0tod0ZCRVovcklocjk2cktuVHUzYjZoeVJPR2ZqOHkzK3pQOXE0M25TSmhYR3RVRmoyOElvOVB2Rlk3SHIwVFo1SHRaUlpzY0paMEZ1RW1FQ2V0NGpiZENCUGhUd1ZMZjBFRUN3RGgvRlZ5TnNoNUxnclRZa0xINHBkT1NycHVEdmYzZTZqSkYxQjFSb3BUdlFoOHB3ci9qOElHa1lOQXUrYTlrbEw0cCtacmxZeEZjQURCWmZIOHFDVDVhNWZTOVJvZHdvUktwYlJXaDZrTGUwZWtGYytjakRmWUhRSEhJOEpaWGtvN053VmJ1M0RxN1Y3WXFLWnJ5Yk9BWjIwcUNpMFJlMVJBRkQ0UUU0VmJpSlhyNnRUVkRQY2UxdWwzbHErZHdsbEFnV0krVFZJTnNpOENtTzh1M2djTHNGOTZiYVJEVHpvVkgrM05MYXFCeUZrNk1LMFJRcHBFQUMwSmM2QjEvenEzamg4MmZrcU5Obm53NlFuSERVMUpYTGtzVmxwNUgyME8xN0RHUXlwWFRUaWQ2dWVEM01vQUJmaXJIMVlzNzA2VmFzUTNwNlNJemthbVcyU1hiN2J3MGIzTCs4YmJaV3EwUEJYZ1VyeWJ0c0VCMnlUZnZFK2lVclREK1hienN6L1lvODBtRDIrY2luMEJDSU8vWStERjU2QUlSSk5EUG5NSWNXQ3NvdTRkMWhYekVad3J2aVdzbXUvcjdkRVBWcWpwcnoxQVd1R2M1WGdqdmcxVnZLdVZ0cUtsMWlvdnZtcEREL25NajdCb2JHbTNXUmpHR1VORkF4UEJkM3BuY0hwbWdHaGVuWHQ5STg5aUxtZm5hTEhHdUJsT0lWK05RSHZQMXYzcDdGY3lNUkNnMW1Nb1NpbDRYQ3d0VU5zSmxoa0pTR202L0xZeFBCT3VaQkdOYTRDUXZDUUIwVmhGZVorK1NSQXBLUlRwMGxYT0dwU0NIeUsyNXB1RUxrUzhweURuWmlIeVlLL2x2MzR3MFhzeUgzc0xUVENsRTZLOUxOa3I1anoyRjRNRUJuRTVkZDBKMDhBUkxaU1l4VXZqRXpCUmFuaEFHQXMyckp1dndBWkdzRkNJaXNsU3U2eWp5Uks1WmNuVWxHakR1MG1nMHlTYVRwYTYwaWJBbDlkYmFVci9wbGNMUUFxYTJkUXlnWndaSXZ1bGp6MmptTnV2Wm9paXYxMXRDL09xY3RyWTkrT3FURDVPakNQbGxSUy8xNkZzQXRhTHp4ZXhnMXdheU91U1ptdFQ1VlVYM05Rb3hwTEdoem5CL1plYk1QbXd4eVltS0dLZVRnc1U3cnNWY3RaU2JDNHVTUWJVdXIreG5tT2ZvcFpDK1BpY3c3UFBUOE9xdk4yaGJ6dWUyU2VNZTJZclJNdXZlcHVtck4rMXVTcU1xdU5qb1VWWW1NUTE2cGR2bEdKS05XNHArSnUwYTVLNGtsbzJJVDFCL0VqQ0hIQUpkZUZQUUsrUUtIZHhORkt4ZVNzZ2o5bDJwOWg4YTlybXRFckRTOGs4bFlnQ0lPRVk1a3N5Tld0dTlxZHR0U1BFM1ArZ0I3cGt4VlpkclhWUWkxYlpLOHhMbmNsSUd6WXMwU1h1U1M4YnNWd1FzVGwrZk95QU1sdnhvaURxN1JpTXkvVmJBejRWSU9sclpqSTgvdjhhaGNIdGVVL0cxTDM2bDNoVEFJV1U4N0ZKdnd5bitWSDRJWkZRaGtYeDhiKzdleW52enpNNmZWWHRFVkVNVHBWdVloZlhIR3kyY2RxWXpRZm9Ca0ZwdjJ3a0JvaXl5SDBCbFJaNFkrNVJSakY1K1V5dk8xWGJLVFFwTVFRV095ckFTQmxZUEx6cHUzVHl6VForT2NCelN6SUllRGV3YWthRW1BVVVlRktvUk9HeTkxWE5uVkgvc1ROWWFBazZhcHlhdEdMeE9uSlNBQXBkcDk5V0RhNWhNV2JIMVMxaEY1RXVUcXBUSmR4dmY2c09BU0QyWnAwWlUxV0N1OE9XV3JxajZDOHBybUtlSjdtMHlzYzhtRCtsL01PRjRiUDVBYXFkV2pRL3d2VnZtczlySXBkalpkSTJQaThQTW9ERitmdUNkTnBZTXdCT3pwcHcrVXU3bE9nWXhoYnFZdWVDTHFvMHMwQ0pKZlEzTmRpWmxqRVBzNStJSnZ6WWxKaExCWHh0RTJpeFI1V2o2KzBuWWkyZnA1Njlzc1NJVGtkYnJlMjdLVXAxZjhWMkhRU1BhOFhvdkF6NWZJL3FpVHUwNXNRNWVGeHRUY3JHY2NFcFpMdWNRc2kxN1BlL3lXUE5pQktFZG05R25LMlRjbGRVWnBUM2VBZTkvSXUwNVJ6eHJab2NuV0J2a3NIQWNWTGZUalB4Y3c3TGp2YjNIaXJxNk90YURUTkhGaHZRdS9RWHBVNUhXcnM2eWhGdklPbTdCYjZ6dXdUNHpsNlZBNk0xcGxJTkNiU0hxT0lVTHNaKzNHWVFDbmdCWDYyLzFiS2xGVmJyY2ZHNlcvRlZ5cnMrOG1FbExQa2VsdnJTaGYvSHJSejVzbS80aU9SMi9wWm9ic0F2aGRHL0JtZnVPcUd2LzNHVVdSR3lOMURSb2VKbHR4NzFaWWplVnBycUhvcm02ZzJjeG5hT2lyZWkrZDVpLzRzaHhja1ZDc2RIbHF6OW5ScEgrck5jNFJ2RUIxSXZnbHE3MTRCMmZ0YmFzOGdFNjF6c2tGL0MwL3YzRFZyNWVFYXZudGhxdDZxUnIvRlE0M3FXOTRTMUttMzRUZ0hBSm1YZCthZmFISWdqbmRvNFA2S3h2SjhxWlVGeUJ1ZUM0MlNQalNScnlKVGZpS2NOZG80bXhYVS94WWxFSlBodXB5YUhmdDdFQXI2eXR6WEw2Q3Erd21qaXNlZVJnK3dWWW5UN1Y5Y0QrRld6ZmU5VkpHNk00djd5a01TeUZGanRVT3ZZYysxTEc4YUMzbkNyeUxrYnprUyt6a0JnVEoyUEtMaklIb1JrVkhtWVlBSzIxUTkyTkpORHZ5SXUzWGQybzM0bVpjKzgwRHNBdVBwOVkwNGI3TkFWSkg1OGt1TkJja1FZaVBKLzRCNE1YMm9RMlRGT3RHMnVYd2t2Vko3ai94dis1RnJMd0ZTZE4rU1Q0OGlodE9yTzgweHVBUDJpc2pJUkwyZUg5VFZoTGYyZnVIVHIrb3ZKV3BHOGphc0ltbWFQZXpnUzAxVUMzUGJQOXlPNnFqNXBKc2hwTFFUUjE3ckNmNEtrOVNmSTRUckYwcWVKN2hxaUJKaDhUTWRlOVUzQnc4bFhVU2JBOWN0SlhhbVR6bFpxL01aQWRta1pXRTd6MHVzNFNWenhXTHJPd0h4Yk5kbXBhYncxVTBQYThLVzRtV1N4MUJCd2pONE5rRXhvSGhlRzJxeGJ6R0FaU3J2QTlrM1dCTWNKZWxTemc4dUV6UE1ocGRhWTBRQnpoMGE0UG1JZncvYnpOTWhTWEdZNk1oSndkdmFOQWgydzdwL2hEenpoU0JudTd1aVJHWkF0dFZRWjNNbUZzVmN3NFQwMG1lTGNBbzl3NnN2Tzl6b01nNnQwSVVsY09oZGlwOVE5T0w3bEFlUXhZZml1cDVQSUI3YW0ycWc2KytYL2MvZElVUzMvYWxxSUpHZjJVUlE2dDdjayt5NjJ4eXRCQ0kycDRibmlGMkp5a3RnQ3h2WGtMTHRPaThwSnpzdldZZzNSSDJvM213S08xUWF3d29kSjZiL2ZiRW9ieTJpOXZzTlUyVFZmYlBDM1k0TS9EUzkySWx3M2VtUHdmUlpYQ2NGeXN5cEZtdU1mRVJKSmdNS3F5KzVLNjBrZWl5QmdPZkx1ZXAxOFM0bFNHY3VOZDk5VjQxTkFGeW43SXQzYzloUXhNTWxvOXBLdzN6MmZEVURTMU5xeWR3WU9aWGxJN1hIUTUrNDlwYTAyOTVGSUtDYi9rbDRJSERmMkpBWFFQMUxaWmtmdWdLTStYVmhNd2FwWVRjM2dtdzJ6OCt4RU11SytpcXdKZkdBUUxPYmZaQ0VTamI4Y3JpVTBmMUhHQlRneGVuL1g3aWFFcFRKNWVPUWF4NWo3Z2FKZUIrREdzTFNzNWhRalo4cWZKRXd0dE94d281aTdmVG1rbUxETEFiR1R4dkJlbWxUUENSR0Y4VzZybDJ4aE90YVhocmRWTGFrdHR5NVJ4UTc0SVpHd1dQSDBpTnRBQlNFNVF5R3JZZzZ4QjYyQ1JOeWtXTSt3RndPclo2UExaOHA4YkYydk5NRzV1TGZuT2p2ejhoTENvditOaUhVUFlGTkpzeWV3YmoxOHNpaUNnbC9uTmlHaXAxZUtqN1BtOW8xTGw3MEsxaU00Y28yS0JSWVdZOXpmSzcwYks4WGkzTlJlMEt0WXpaNlU4YUw5L2R3T2phY2c4M2VGdFFHZUJLYXc1d21UcjBUR0Y2Nzdma0c0L3hzMi9zRklrZy91QkUrbE15aWUyejdkZnpBdzF5Nyt6Vm0vQVpTRkNzTUh4dUVTbjdudFNXMzg0L093Z1FsdVVyVzlkVEJuWGMzN3oySnpTRk1FZzdVaW9uakx5TmVtRFhQRnI2RkdHOHd6SUx4NUlpVEozQ3dXUHM5cW1hYzNrblcxYkZSbzlyNlRwY2syeXp5QTZnQUpQc0dMMGpGc3dkS0U3bzlQdHBJTklhUW16MXlKLzB6b3NobFBYUUEzS2crWVNuVzlzQTdzNUdhQ0l4MDRjdGxKY2diU28rVDl6SUdqcWRQMXdOTFdvOVh1T2tMN1ZScjFBWStCWkx1L25UcEZ2MGtlZ2hkaVlYNUs1UHAwSy9NMlRIRGVoNjNBZXM4NWxYc3ZtdGJBUkxtMmYyWmVHNzlSamdPRHhacFVNOEJCVVVLTU1PR0ZRTnJtQUVIM2N2N0xQa25uS0ZLTGtMY04vYjd0OWRRUU1VMFBJTzFWdWVHYkY0WENMUGRsaFVNWEtQL0NhZFVBMElnMVlLWWtCWUlacitOSE1mUUpPWkl3K05FYjl1ZTUrTVdjbTF6dnNTODRMMTRKcFdSQVE3M1ZVSWIxcm90NVlHdmFPNm1acTBwMVVHWUVXZmk0Y3lLanY4SW54UHRiOVFYVUg2WFVjcDdUbmVEeWVJNmRDUnduUytReElCN25jS0xpT2VVNHc3ZmxTOGVpdGxEVTNmMkM2YXNWUS92MzgxUnZWR0xwTzNVV2lQYjJ5TithQ2RMQnV2SytSMXpCSGNxZEZXRnMyRjFTdjV5MDNWRWpNUlJzcUJUY29ldjVTaDZjVE9DMFVQRkRkTXZVKzRXNi9vZy9UQ1hmYjUwTFVFQjAxYkRVbUc1bGwzTERjZ2cvQXp0TTFpQTl2Qit3c2tYSWE5SVZiMkhQaGFGazZvK3BnQ05Kbm1Vc0tlTU5NcVB2VFVTa3ZYYzdNeDlNc2VUNitSc1ZWOGRiT1lSMzBUd0w3anRkMkEwNlk1MUlJWmx6KzVoaER2aGk5ZTBub1RkZjh1aHdxamVSazR3NlVqV29FdWIyVEdJbVkyNGJBNUFHbFU3bmZQUTBidStGRzQrM1A5T2V1dlUwSmxMOURSRXc4Qi9LYm54R3FDV0hFR3g0eC8xLzFSbkt3MjFsTjRySkFuRVFISGZXZ0IrWFpjb09jS1h6V3MrTUQ4cjJEQTBOUGFrTG91L1Y2OWlhaTVhV0hMZ2JHNXBtMkxUaWN1cjlNSFgyZVcvZUh4aFFKcXFZUWJOZG5UKzFjaGdhSVVGNlA0UFQyYWhzazJ4SXVmbmlCUXRVTExpOWJWaHA3YkpBVVBSL2tETWZzOFVwRkxJU2hFeVVQRGo1UnlYc25nV1VyOGpQRklGdDcrOHRVcDhYelhRTDUwYnl2OHgzSU1HWVdsZTlpTnkvMU8ydlJnTGRKTHNsWXpnNFp1RWNrbk5qOUdlY1NyTndEeml3LzA0Q0NobVVJWVdFbFc1V3dPbkYyanN0dHJrZ2pDVGs4ZDhJMlJqRDluTTl0ak0vTzZMWWZwcTJja2xxeTNPaW0vazIxOEwwS2FRbXJZS2ZweVVGQnRvSnhxNjBHcGx6ZWJhYjJzRkc2b0lQY2hrOUdoV1Z6MlMvMDhoZEMvcmVmaUpJS0plY0ltNS96VllvZDl1a2ErazZWRE1LMnFZdmlmNFA3RnJLWmVFYmZqc2VOS0VZTWRSQ2l5endpRG9uL0pSYiswUkZXMFZGV244VmVNQ1B1MStma2ZSbWcxbDJNUFRNT3BiRWZmNFZkRkYxMmpHOXBzL0IzVmlIQVhiS1pYbEhHUzBhWkVzRkphZFJjK2FHV0tQQmtmTFNvTUdWVHgxeHAvTk1SR0k0WkNSTU05cnBtdmNHSVpqS2E5aEF3RldwOGhCQjl2WjIyU1k5RFNTUGQwc1lCUWFPWUd5WWdWdWlEaVZUQlBBdlRKNnJOSm53cFYxSGMrWjVKQXN6S0s1eWRuK3BENjQ0L0daUUpxYndEMkF6REFxY2pXdU5XZHljUkVLSm13aXBBVGpiU09UWmdCelUyOHZXdHhxSm10VXFYT0FuVzhOQVVVQytGaVRYQUFNbVlselFJaGJ6RnpPMW53Y2hUNXM2QU50WE9kcE9nSi9RY2NZM0RrMVNuTFNYVUN6dUJpVE5FZEpMMkVmVUpYVlBIcjF2TlRtOW1KdEo0R0NkZGQzeHFkQ1p0a1pMbFdnVTBoY0NwdUVtbjAyM0hEVjdYZmRGYTdpTXI5S283dFgzWU1RVkM3RDMzNjF6SmcrR2p4OHBXdk0vc3BCaUgySk04ejY5aE5XTmFlVVYrdmFNancyRWFseVFUSW5jMWpUcXNwN29QZ2FwdGNTa3FqNjZNdDg4SS9EY0xwcyt3MkpaZmw1RTI2bWY5a2pGd0FWRmtML1pOV0Z6NjdkSjZ2bFdhTHRRQ1pjRG15ZEEvOCtFVmNmL1duOWFPVG84NG8xZjlmV0JINGg5c0xBSVZHVSt1VUZRaHJMeXpBeEFGUHE0dWQyUDdjZE91cFF5TDN5K0hIMFVrbkZrUENZVmJUY0s3ZXV5cFFaSVNoNDRSemhVc3UyTlBmNXZQV0tSdWZwbG5pM2VVdTZKK05NWGRmdjNpWTdQVWZ6Y2Rrek0rVEJKeE4xK0lRSGxGWkdqSXhzUEdBckJ3Y1A1NnN4Zk5WZHZzcWV5QSs0MTJpZjBGbHdWbnQrNzRndmtWeFVMcWVnME5tbWUxNndVU2dLRUcrSGx1SEdLYnlBQmt6NXZudWJ3N2hVMmpMSkhmWHo0bzFpa1J3NzRGZlFVRlpOajY2NkNQcnhiTitkSXFTRXpCdWk0Q0FYbVA0VVJBVGoxa29QbzlvRi96SkxlcHlyN1FMK2VISTEyT2VkS1MyWnFHcitDajJCdWlrRlBwRDR1L21GWG41V0svSUN2ZDlEc3htZWFyWVU3L3pXRDNkbHdFTVRMZ1dqWEluSGIvU3F1Y0JHNHg4bEN4MUFoQTFpaWRKbWhXeGMwcktlVWdMb2s4MG1qYWs4L3RkbWc5K2ZiMjFVNmNLZm93T0xaUkdjQndLUGwvS0FxUENqdFRqZWw0dTh1djlxeS9leUZKSUVGZGU2VFlMWWZ4NVNRSndKNFVjOU4xTDJ4b0tyMGRPWFlsTTR3bDdtQ3lGWk5aNzFkcGZBQkY2TXBXaWwzeUZmQU9tbkJoNkU1ekRzUGl6RDZLNzBOWUN6L1VpcEpNUlVHek1ZOFVxQzRFUm9sTlZrWUhsS1g0ZEJsTGVJQ0c5N085eUQ4TER2QkZRSUdaNUhYTnlxR0xackR5T2ExVFY1YVJTWGliWUZUdHBoeTFIS0ttUWxBT3RTVmpacWhRSDBOdm5maU1MazM5QW53eGJMTzF5ejUzY09QWklrZHB6SkhhQjMyNXRZZkVoYUZLSmExMXpRS3hpMEREZzVybU92QVh6M0R6b2I4b1ZsMFFqSGlHK1lJSnprdWllQVQ0OGI2Z0VqRlpYazA3d0MwTFNOMG8waHNuclNMQ25XMXd4eVVycnJTSGtRQklmSDlxQjlDeEdrUHdqVVUxUVBMYVRkRFp5SUo2eUEyWDhVTzVNUzVLT2FYV0JlY20xVnZ4aGRYa1cvL3p5Sm9pZWkyT1VSbUdzSmQ0NzdBTkNuQWFyT21COWdQS25PWTRPRzYzUGp2NGw1RUkrUGFIbXdFTGNEWXc5RjZ5dHYyaTMrakY2YXJFbHpPTk1ES1U0SnpiaEdDUUdEa0poNXFNcXBjWGFTR3Rvem9FOUZYOXZxWitsUnBqeXhyOVU4cUJUdmZkMlltOGJTd2MzczMycnVxNzBrYS9vNi9sME0yejRkWGttNmQzMHVJTVNXc0o5MkNoTG1kUnVsQVM2VHJscjZHNm03Z1ZyUjVpZ0I3bE42ZmxZbW5HZGEvRDI2MTNYczMzNjFld084ci9DSzB2UjE1VE51ejdqUzY3aW1CMWVnRm9SdEExdi9IQUEvZHpUWks5WDgrY0JQeVpZSjRzMTFlZ2o2SzlUamdTcEZoVlFHUTBFZDMrblRJNW9NWm5ON1p2bGFwTUowYndUNG1yb01lRk1kQ2tJczRBYVlVcm9BMHhScmNNVHV3a0xuYlpWOXFuamVnM2U1V2gxS0tSRTFrajdUUXFNUnlWdWR0WTJyU1E5eFBiU25QeDZUQVNuS1BJa05kN2t1OUFmZFVPZFExRDI0Y0RycVlCNEZnT1EwZmZpRVc1cEVXbDdsQU44MVY2eloxS3JzWG5HL3ZPM3B0QmtpeXkrSFhjNXluRUpkRHRVNkYvSTRWSFpQbjhEbXhKNjdYYndwU0RhWEUrOXI4aTNaVlJHK2N1bU5jNmg0VEQzb1BMTWd5TzFvZnhtUCswN2g3d05ENE5CRC92MllXSzRLUkkreHBNdDByR0NkS1hoS3owRWtCajNkOUg5b1gvMTdZMDNvZDV4bzBaR2JOSTI4WFB4OGRUUlcxbHM4bmZLd21jbUw1aFcxbWgydXpEWnJkVU9HUUhyWVZ6TEYrWTZKYjNad0RPRjVQbUlLM3BlNEtscmcrMDhNeFpFVlptazVVczkvb3FWNFA1NzNWNlkxZEdsbzlmWVNnMEdsTU1pc01oZzNlVzZVdS9semZscUUzSmRzaHEyazRrUzdoWU5ZaEMxZUlEUVB1Uk9XSEk0eDZ6NHRNUVJwYnFUTEhmdTZyeWg3TnBESFFjYVM4RitlU3lmKzFwQjBQTS8wU0ZLRGZSQ25uWE95c2tCQXZGWVcyeWxyV2ljQkFERENqTDlkemZDcHYzeStBWngzTVpnYzM0THNPNS9pOTVRVzQ3VkVOK1ZjSk5menZld25WdU1XNnF5MDRZNUxwMFZIR093aE5JQmViZkZFM2FOU1g0L2pKTUVBNDB3REJVWU9mbWRrTmpJdTRoelVnYjZzMkM1a014OUdUa25meHVGcTZwRDNaR0pOeGZ2VlVuL1JFQy9ablpzdEZLOVJaWjlxZE9rbDBRWUg2ZDYyMlR6S3JJeUllZlpTOC90SlV4a1pyTzdtc3RNbXdwMUpDSjRERFBGeStnRmVGUGhEcG9hSjlZc3M0TEd4bFd0Y04yYWVYemJ4VURNZ240TzRYVjk3QmFUZFpkYUgyN2xjZHZ1Z3dnNnRIaEZWbUJnUVFPajZQLzl5eWJPcjdiTjI1Njd2dEVVbHNKeXVvZEV3YXJyY3Y5YXU4UTYvdUZxa3gwK1czWlk2NVhTZlh3blBnQk5wOG56N3FzYXdNYW1sQXNVQ2NwdDF4TzdFbTUwekhiaHV6c2lRYkVOdmcwSEpaNzF4Q2dFcnZLQjZtNmtRczZ0RFJQZ1c4dk9SdTlMbTdsY0VKQUlEbXJrZzdjMWNHengwUkZMYjVVczVnNmJscEkxbWdzdWEwY0k1RG10Nlh1Q2M0L0hlOXZYU1lZb2doZ3hqckRZYWNYN3N4enVySlFZeldSd1ZQV2JZYTBraTRsQTNkSHFwZ2tXYTFjVU5NN0lKL3N5VGUzMG1Ickt3NndRci9TMVMvd0dpZ3dyN0o1U21INEZNekpJT0w0SUl2VWdhWXprOXlKd0l5amgvMDlkQVovYzFHZFN0b0RTMXFPRlZ6YzJ6b1FqYXp2UE5CMmx4cE8vb2x0M2lUaElaViswTnBIYlIvQ1NGL2VxT1lvWXN0cDY2YjBOcnRHcEYyQUs4MHAzZCsvbi9WNmZpeENXZjhDSFo2UjVQTlhzakgyQjcwSmpXODFsK2RFd25hMWJrN0lLRE5IV0VKd2lmaHp5V3RIZHRRTG1ZMm15ZGgwY3kvTm1RVlpodFJrNkFzWU1kUGdMMnRLeStzNHkrOHp5Qk5KTFFsQmhvcGE4Nk9pUDlrcFdZZmNiTHRKTURYdFcvamtEQ2JYVGJoa1l6Ty94WmlxQU15TEMvaytIY252MjI1SVYzcEIwTmZoeVp1QmVNZUtVb1pwQ3VRcFZnL3JPREowL3FJU1NrTGJwU0p1aVowSFVId3JRWEJPWUx3RnFNOHdUaWVGQUxLNmN1OG5XcnVBZ3hmSWlQdkdBUHF1TnQ2d29JQWdCNHpET1ovTjljWERSeHRHTnpKckx5bStqUmFsUjZPVnUyMTRZOE9wRTdQZzh4L1JVcm5uQ282aGdyM0hOa1p1SHMrcVduMFVZWXc5K3FhVE0xdXMyK3lFTGdYd29ReFdlMDlGV240ZG1UNTJ2eDgxU0lCN3BGbHNaQ2xkNkVHWXlUSytaQzhaOHAzVDVnVmZEQUY2NFhUNjI2MTNGUTVicVIyOGlkZEFMa29TaHd4Y2ZadFkvZzB0b3V2b2x5cEtEQnlqRmREMFFUNG95YzUrdjBzalJPQ3NSbnB0T0NWNk96SzU3bWdqY2VPVFFjV29hSzgyakMrempmVzhZd1puK3dvRU5UVDBDRTlGSDVlTjB6VEk2U2w4TERqeHE0aHlTdDY0SXNyclBHRU5HNlpRcFF2RW1TMkN4M0Q4NGdWYldJSTVpWjZGZE9jOE1xbXI3UnZkbnBGYm11UFFRbTJuRDlhZlN0aS9HQTBIb1ZVVjRudGh5WXgzKzd0OHpNdFp2K0hXSWZtNmlrVlJmOWFObGIzajErS2VCUWRoSEFMLzF4eUIrRHBHRTlkVXFUSmZpVXp1b1Vjd3NMZHFqY1A5ZDVrbVl0UHFveTJ6MlBKNnVsZ29yMXMvVWloVUhGM1ZrVkNCa3MyNGRZRDlXbzRDbXhiVVkyTzB6WDZMODI5TmNRclc1L1hidXhVd0R4dGlxdDROamQ3dEtrbGhmV25NSXdMWlN1bXMyNGlCa2R4NU5yMnh5NjlWQVhmbld5N0NJbzVuN1NNdlNMN0xjdkk4Q09XTFJGY1dYMjIvOFdwSDJ3R0hTT1dKMUUwbUk3NXgrY1dJVlppdUZqYVd2V1BNdW1uZ0wxd0NpN29yUngzWTdaSVZVZHR0UDNzTVFWZzZDVCtUMGtHcFIwZFF6UzY1bFgrbVpCUWlPL2JIckdHL0hBTHJHVlhZeDNoQWpwZkwzV21BUWcxdU52TTJGRVFoOTkwRHBmZE4vc2VzRDhQbVExTXU1Um45RUdyNFJkMlk3SWJXVk12NWxsQW1Sb21KYklOVXo1Sk84TC9ZUG5aSGdiVndGWWRxZ1VwOUNZQXRrakxRV3ZOckFOSmxHd2ZOKyt5aVExeGd3bzYrQ2pYMVpOSkkrc1NtazJGTzdiNjlhbFNkdS9ER0J1M1loSVorSnJUbFpHU2RwYXp3YSsrajdQRXF3NzFsRU03Zkw1ckZGejl5T2l0NEp2bFNnNHlqSWRjY01MNWJWL2pWSDQrTVZBN1lOdFNNUWRHT1dNZVdFOTJPRGRyRnJSMk84RGhlZzMrVXBwNVJTYmNPNWJTeFVpcDNCUllmY0ltM0FyUDl6eThEdThxek43QzVJREd4TlZyR0xnU3I2SXVsWkpiSyszeGtVcFpyM3M2eXFnUGtQQTY5ckgxZzgyM2NFd3U1Q091MnJ6eldseGtrS0RYVVFyZDVyODgyOXIzOStGSnBOSWpGT2s3dGM0NFl1dVZXWTFmWUFIQnFzQllabzhlMFF2c1lFS29PNHRhNmNPT201MVM5U2lTV1JaWXpFWExyUzNQSURFZEw1VENCNXF5c1lNSXZqSzF3eTlIWFYxUXBNclY0SW8zWklSQWNRcktoakE3NldjQjRQSEFaRDhjTlZGWHBWUVpIRWRVN0NEN0ltQXFZYWIvT0VRcVdUYkVna3hjMzYxdTlhVGVTaVlEQlBOc3RiUU91UEJkWVhRbnRxWnlhN1NNcDM2MTA1blZvK01tdzh6RytycWRUMXBFdWE1dFBPc2ZaSjFaYUtHdFNQRUF1eDJWMlNwWjRKdU94WEszbWtiSWVjSE1kUlhuazFaYzNDQ2FsUk5vR1RjelBpbHNmOUNsRDBRbHJGVlJpZHltbkRLVjlGQjBqVXdnZGlCNEcyY24ra0ErVm9NV01nL3pSSENmR1lrYVlMQys5OVRsSnJGdEJiY1kxKytwZWd2VHk4bWNCRXNONC9xVm1jSkNFc3ZWMjNSc3ZaR21iZUNDM1I1TTdvS20yaFg5TTM1Ynk0Vld5Qy9ER2hGSXJQMllYVk9VaE54STk4WmFVVXA4ZEdMbDJYM2JlYnZqL0hMLzB1WHFhYmVGMnRsYm5DSWllUFVaQlhsekluZnlCakhQMUE2OW5WTVNDSE9GeXBEUjdjeXlOcmdZWndVUXJ6MEs0eCtqRmQ3WE5wclBWbDRMaXVJUVU0Uk15d09TMnNISWpZazZBUGRFRE9acjZBVi9MVVdoTTF2ajFKSjF0QitScFNEVGpGMHEyY3FmMkQ0dEEyaGZ4ejRobEtrRFZaeG5jSHFLSml0MXVHM3RYbGEweUtMMXpzTENHS0FQMW92aGdKYW5weTFUMUQyQkZ0ZHpiWWlYenlaT2pEQUxrS2ExTzZtcVJJVWRLSkJZY0lvUDhpWGxOUm53Ni9QMGpYVmNicVhXbWZKRkJsU3hmOXRFS29MQzJhOU55WFdYSWpOU0t0elBGTXNHMXlXMlRLK0owWVo3anVsZDIxSk9PbHFEVktaMjR5M3Y1aWlaS0IzOWJIMlluVVlmdktXZVZzcDZSRElobW1hTkdFdER3SHJtbWo0bjM2dzNUR0hzVmJpRmJFb2JQSktWRm5USTFUWUFMUm94RGkvWVA3dFhXbkNuKzV1TUVoZE9sUXdLNG5pS2JvU2RUSWxyL3NHaytFempyMHlmU3hkbEZrMHhxY0xWb0s1ZU84emZ4dngxeEtlcjd0M2xYeUdqcU5aUVB3Z25KNTkrbDJPSDFnRjgzS0VqTUp4all3Yjlsa2h6RkdrNGUrSHNPWU83UkdwZzhJcTFGYnVBT05xWEZMUEx1SVVnL2hlRzNHVHIyZk02MEVGbGNoR0ROclBqaTRKNWhXRlFzTUFCSDNCVHZYWkFIRlF5NjRxODVoaE81dzQvM2dkZlhDSEh3WnFqMSs5OWx1RUFoU0hDOXVDVUxmUW1aSGcrMDA5aEhRalkwZ0NuRlJnazJWRzdaRDI4Y2VLelI5a0NxaFpURURaaHlOcVdUcHZMWDVmSzRuTlIwQ2NhaE16cDhhWkNIamhQUnFYYU10dnJ0RmNKdjd6S1pOTjlFS1gzcjVERktvNHZxenAxUnBXOWE1TXlrdGtia01HY2ZtdWZJSEJkbDdTZFVUSFk1R25EMi90cWFqRGVXNlk5SHV5YmE3N0xUbkdpdXNnUnc0RUxTTzhhVTdzTy9kSVZjSTdmUmhGcHplcmptcEZhcnRHck9xWi9kTEp4a3hJRFpKbmhpblM0Z3NkMzdsbVpuNDlmR1pGdGQzelA2T1Z6TUE5MnFLeFlSLzRYbUlpMDdwL3hTeWtMRnFpdEtxdGV4YmN3SFpGTVhCUlRZblVIY0JFam50YkxCMngydkRoMXRyVWtuR2xnV0J4cXIrbWtmUVNoVGZDcU5ESWdobldXRlpTTnM4OHZ5WmhzYW9mcTJlalQ0VWVKL0xxL2dIeDdxZjVKYTVwRkU5SmZTYUlPSXA2ZGFhVExFUUF5TE5FVXd3Z0FHUVdlN0JVRS9wd1RkMXo2RWkrazR3b3pFb3pYZDFMRVFnTFFXSDFzNjk3WG1hRUhrM3dTUkxKTzI2TzM5YXBvbGI4M2dYNDZ6NWROZTlMRFBod2lTQXpRRFdBVEZXMGRhZUJCS3pRT3J3T09pWHgvV0h2N1A1NUlmSmtYbGkxUU52Z3E4dTBKRkg3RDA4M3B2TzdvSm52Y3FXdm1ucGQ2cHp5NnRINGF6WlRZQWtxanJmb0RMWmdxb3I2UjNWVzh2OG5MRzlQVFpvRGxCMUFWZW1KMitFV2RFWksyaVdxcjVuMDZJOVdtUFdFZFJKUG9PWEJaOWF6RHl1bXpVaURmOVVCL0VlSlJvekVnQzV6RktvMzBpQ0RmU0NpQmdLME5oNXlVZlI5VHFZdzNnRHh6TWJpNFRsdGZadHdMeUJTNmJVbi93RTJwams2Q2h4OU9PMTJqWlFFeFhRNi9NMnh5UWxHcWwvS0pBeHJhS0YzQWdlRWMycmsrS3B1NHBYV3dFOHBXTFFNZUhxSW8zRVlaWW5xdmpUS2ZhejhzT1R6c3VQQ1B1ZTdHTEo1ZXJxRnlpeUtXMktqem0xUnNTVDBIWHF4akRQZStyUDhyYzQrZWdObHpRVUtqTENNUWVVWXk0ZzJwTzZKaHllUWt2M2J3Y3crd1duQmVYVGZXaG9seDd4TEtxVGg0TDdFbXdTcmFENXZpOVVPeDY1TUdMditaYU1tL1lMTkI3SUlMVXZrNlVESDZhVDNZVXlWZDNnQ3YwbjlDVFgxd1MyNCtZbTZqRlduNlo5RXRtQWN0aERlLzNsYUI0K2tkU3Y5SFdvdlRBUGhVSXVYcFdOeGlJMWZoMHVreXo5b3lkbGU0bzFlN1NXSWl4RkJvdE9jUVY3NEtCTG9qbDE1Y2RxR1hSRGZWQ205VVFWSndia0g5ZXZGdW83bzVHOFJmdmZoWUJaR0VVNzdxaUtQMVpOUXlnSktPQlNrZVBLSjh4bGx5eHNOMVJ1Wkc0WHF5NUx2MXV4dFFqRjJqZWwrTTJiVmF2VWVDMU5xQzhTTHdLN1NvSCtwRTEwMHVVQmxUd3NOUERmWlJvUkV4UTRjRTRnTld1TTdvYllxUGlHRVZQenpOL0xXekdhODczeWdUTzEyb2hiUGRZMHU2cUJaNnZIQWNVbHIzWUV3aVlFNHl4WmlZTFZieFNpSjRDMGdTbXBreG5nanYzYUxaRjIvR0pqclo0dml2SzJrZmxpWkdmaFk2TDdqY1lhZnlIQzh3SC9rNmp0TXBkb0w2SU14TlA1Z0xncUhRdTFQVm9vcE5QVjRDQ3VYdTlTNTVtMXVxbXpUS2VDUkZhTUtaZ1VYQUUwWURmZTdwd2VIamJhM2ZUbENLTU13ek5jNjEwMnI0S2pMU3JPUlBOUmVLcy9TNDEvSGpjV0NlTldoYlVERHVSU1pNRFdZeFdaR2RYTU1TT0ZOaGZMTHlmbyt5YnB2bC85ZXpKazhBdDhBMXRJTkFZTHFwRSs0Z09jQjRPSWVHZVM3Qis5a204YlJMVzJHTUFRazlSaTdVOGc3UGxkWDIzdjVSOW02WE55eXl0ZTdCTjhNcy9BRGZ1am5nR3Mreko5RWxlUXRESHY1dnYrSlVSZUpIZU4ydHBzSnJyVW5DVFVZTGIyR0YvWTlQcDNwK2FVWm1ZV0NNOEhwZFRiT2pVcTVsNGdIdFUxSVh0YkxZaCt2Vk5oYldzdzFjUDVjNUh1M0g3eUxMbC90Uzl4TFZxd1dKdkE5VERxUWZTSnJSU3VzVDFvMCsrbmRVRDFrRHo3blhYaFNPN1pCWURsY3lKOGJJZ2RxQWM3UGQrZWNlUkN6eWFsSkJvOWM1SVZrNXhEd09zeEJKTmtLdkJidTNtdUE3ZU1zTDVpQXNJY2Y2UTFXWHVLMS9KWWdaU2tKMTllc3dveERyYXA1dTliV09Td0dRb0dzeThhRUhwL0t1SnBUSHIrZVJPa2JoQ0hEQ2piS25EY1BGVWdmZEtxc2dEdVQxejFucWFSZTRuTWEwVXhteFFZSFNiUHBNNVJxdmtuQ2FEaW92RS9NdFo2ZGlqS09uYWwra3J2WEhXZVVoQnZMMGxPWHZNMVE3L3U5NXA3RjFCZFBGMUtGVk83OExjbGloQXdtWTRBaW8zN0o0b3BhaWNSYWJwek94NXdmSTROL0RnaW95OUNKTjhzVEphUE1nOGJjM0NaaE8xNDR0RW5YaEZRTlpjL1QydFhMdUY1ZmQ5WXM3dG8rYmxYSm0vTEhManpnTUY5blY4ZVM1WEs0aUlDVGtMWTFXcGpETmVUems1aWlFekFtaGlRc2VOditoTEgxRGhiUG9BY05BQktkV2dFemlCektCam9rWVpxM2Jaa21Edm1yelVtajZ1aVZqVmp6V1NSZmZmMFlQWWtVL1FKWVVJM3dHUFc3VlBBdnBzNzh3UmY3QmF6Vk9pcjVpMnFVcWFhQ0luQlkyVW9kWkpVWFVWcmRBSXhTbk9IZ0xETmxVZzAzNFBoVmlXeFp1MThvZ0ZOREx4d3N3cDlQWitWYWlOVXErLzNvRGVRRS9VaGJSL2NVc3dhb0dmTWVzb2NkcmtqVzYvbmZLTFlCUlNiVjJ4Mmw3dGUrWkszR2dNSGQwRHY5eTE1bzlDQkZuRXJzYmpTNkdRWlJmeFY2Z0ttVnRlTnZ2bmN6Y3Vac2JNbmZLYiswUEhEb1ZkdmZwcUdnN3V3MHRVK0NlYlRqdmNJNWdhOC9aUWVFbG93STVLUHRGTTkxZ1c4MWxHZEVwTmlrRi9FR0VndjBSbUZwNXhNYzFqK1B1MDY2eXZLeTI1N1hDcXp5eW54RUJyRzVpekJxNHl3K041MklZM2tRcmpFSmx0RHFHWlEwQXdzRzJFK1hpNk9IMWp4RXViTUs3cHBGQ2FEL0hGamxmbk01TjIrUGl5Mk1zTGJtU3F4blRScWJjMFdWNDh4US8xMUNXcG4weHBhVTM5bXkxK0txS0lMbHFhNDVGT1lqeGNsRVloalZucGJCb2hhaTFlMmkrUUhnUkJOUzRYQnEwbU0yajFDRlN6cjFRc2RxcFNTdmxXYzgrbXhwcWtaWGRlZ2JsS2o2UHRjdlh4UEFPalFndENML2RpUjdRRmJ2YVY1TUVVZXV2VThIYXNHSStDcDBNV0FCVEZiT3Y4L3ZOaDRZckNFZ0pyRzlna1JGQ096TG10Tm9GWStTcXZPNVpEN1N5ZGJnSmNzclBkSjM5eFNsYWpDeE9nbEs3dkExMGwzL2EwbDZNSXJlc0FQZFRWZEV4SEtTZmI5RWkzSGJ3VkZPT1NsdXNmSklSc3FHd3pkM0RBWEk4a3RyaThiVVFMUDBvWnRVMCtaTFlZS3g1WG0yak9IbFJ2aGZ2TXJiNUxoSUhPSWxNZHdzbUErVnV6VUc3Q3NWY3E5UXpFNEN6Tk40QzJLTktmNXZKWCthYXpsVGFzWHVpMDNyMW1tYXFHRWhYOTJSYkErRHlVaG9MbzRXK2UxUEg3VzI3Zk5OWE9tcGxoT29KZFNRSld3RXM0c3lGTHFBNy83L1RKdHhOK0NlTWZtMHVhM3ZBNnpmYzVNY2szVVNXaGxTakhsTjNyY2t1cEdHZzB0Y1h1dndxZE9yQm45UmFGQUR5TWg1Vkp4TVJEWGxkMk9VNXJ1dHBrVzlmRzhDYTYrc1lOL001cVFIcDhBclNrMWdLc1NnVnJQQi91cXA0UWRxVWxHWmxYaE5uOHI0MTdPdy9rWUw4azJrNkVJVm9sc3YvMnoxSnV3L2ZadHJDMW1Xa05haWVBWEV4cC9qRS9HYjhjWjdNTVhZTWRtYTE4dFc2dmRWYy9qWUhBTmlMblFiNFRpTU1QYTJiSmd5dHlZNUtVb2FvdFlUM0oyLzMzbXg0SDl2RUo1dm1RSW05anZYait0WndtOU5leVZIc21mU2N4Uk03SHdZQkxtTTFucEhtTTNBa3A5UEFnNGJDTDhTVDYxVHl1QVllQVJMS1R6R2pkYzFjZWFqUWE3bGNENTJLUFhCbHMrd25pT1l3Y0ZENGx4SkF4dUFLRjFvR09pN25YZFVUb2hDa2pVd0VZMFZzdldzRWRza01vdEpzUHNIUzRabUdtb3VQaXdxMmxrcHZKcU5iaGhha2hEM0dXMTV3Y2hOZEhsblhYNHkzRzBZYW1MRStENnQ1bzN5UERXQUNvS3JCdmYvVmg1bnJMbENNMXJRSDdYUjB4bm95SjVWaDVweWJLeUNKR09aaHRPRTZKZTcvbjd6bElUaElUcXlnSnk4em1TZHRwSXB1Rm9ZREdaaTdwQUhnSnhReWl6SHRKVWROMSt2a2FYbW1XaUthcHhiMzVDQ2pKL1ExeHJ2Y2Nzem56MGpLa2pUSTVsWWNYVktTQWpEOXRZWml2ZU15c3llKzdXSTAvUmdZZmtaR3pITm5IdkgrRlg5TUtRR0JBdFNrYmQ1Ymw1dUpYUS9oeGRiYjJnNWJNOEF2emgrc3A1Z1ZqYjZkcXU5cDRENmhBckNrU0hVak0yRS9qV0ppMzlkeTl1dU9YbnZrc0FubVJhZlU5cFh4ODd5SERvVFN4eDBqS0U5d0t6RDdxejFkYnR5MlhINEhub1BDNjV6cFUyMXFtanZrVXlIZjRvcW15ZFM0eGs4R1JLT3JqN0dSVExLUCtydG5uZWV5Q1N5SFBxaTlnUkxXb0RXNWhhNEJyOGNUaDYxTFlBaU1Hak1IOFpRRnZPRm5hZjY1WUNaL0JsRXcwQzhIb2M3UXBkNHhCdEZNTjdNTVhYNVZiY3VndEJYOVdRbXIvYmQ3eTd5alRNaTg4YThETENCWExkWEVjdW9DTFNabTdqRElmbGZNaU5FdGpCQnFzTVlhQjcweGxtZmF6eFNFVWwxV3BxcEJvWGN6MHlYL1RTUEFybXBLc3ZKZkNzVjdjRFBtY2ZmcklDN2NVczVKVkw2YmsvR0R1OW9mNFFBU0pqYkdyYlppcFA3MUxaWXRjZUU4RWJCRXB1ckVsbWViYi9BL1ZmZk93cTFxb3ZhTHkrUWtjcTBBZ1lWS1B2QmhlOERsY21BZUgzVXljc2pIeHFicmEwbmJPYm4wL0FBeXBleHlHdWg2YThHRXJ6aHNCY0VhL2Y2L3F6TUlCUXRYZ25MbTZWZGFrYUZQMlEwQmpVRDBxVGxzbS9jc2k2RWswKzFublZtRXlzcWdpbkVxR0pQYmQ4MDZLOHJ4SmVObkd0MXIyUS94Mi9hcUdPcGlNcUxLVU9SQnlqQVVaQWdibEJTNjhsd2lEODZWNjhCd3gyalRKODlwUUF2am9aQ2hhTXk5NmRlbTI1Slg1VVhpUzZPVHVEeWc5QU1mZ3dWR0JTeDk1VEYvMzFPMWZpVFVsU2o0M1FGQXhzeWZEOWEwWlNNRWFrSGtjUnU3SW83ZHIrZzBCK0hlcXd2N3hBQWhRRkhnWlpVQUZMTCtmSkM5N1k0emhkZVdMTkdJZnMxUFhaYisrNERQRFJzdStFb0NxbTlCcFRKeHM2TWpPN1JyZFJORTRtbndQN2pHUThZbDRNRFZ5N05oUTVJWUozVUllNTN5SmlGeFQyc2VVYVl0dXNiM1o1RHBCSlpwV3FseUdEN3hQOUZtbUZGdVJ2TGNGZXR2QlF2RGViSUEvYXo3L2RXb0VHZHY1RlJtYzcxdmJTMjc5WTByNjVpWHAreEM2cVFJVFRONzVTeG9UajU1N0lFNCtGdjRBd1RVUDJabTR3UkRhekt0RXhFcXNVaUx3MlZDeDExamUxR1FRVFRaNjYyd2p6RjV1akJKZm0vcFpaV0VGUktpcVAwQXA0cVpHdmFEY204Z2NHcmUwQW5hd0tEd1lBNGM0VHFZK1FLeFlqbkE4alJCekpJOS9vRXZsalJyZjFWcFRleHZVODV3WVEvVHp3K2VuZmR5eGQ1Yi9qK3lxVitFbnZZVll3RWlBeDViMlFKcHdob1dyWVV5d0tkRkFneHZrWFJGVFZkYm1QQm5GRDhjazdvNHBZaUtQa1d6VklmSGxpUmFXcEN2bVhrb3VaY2JKNTdYVXRWMFR3eWsxSDc3eWRNeVYxR1p6M2JmdGlKaEN1VnFtYTdacCtKYUZKS3A5VlJUaWtJbkVYZURoYm1rRXN0cGFuY3V6M25iUWtxUWhHZk0zWENJcGluVnFmWWNnUDlacE91YVRqbEdUV1EvMDJTazRnMERHcXlhbUxBVm0xdTZRdWFudUV3MWFvaDR4a1I3c0hpQkFMZEZsZ1VhZ3NwUUJZQk9jTnc5WlpwTEt6S2VPMEpaTGhzNUdyMmRvdHNJdTFiODBMeVZRa251czh2ekwyMCtIWXBSaXJLOFFETDNrMUpuYWpyVUw1QzJvNzFhT3dEMHpBZWpiL2I4SDNvdEtVRXBzTzk0YkxjR2xXL3BVeFpxWVZWSE5WbHV6WXFMeTlvSkU2WEg4bWphZEswYldURnFMZjNUS005R1hHUnEyZk5jazQxZTlHWEdMQWdIZGNDOUZQVlgrbVEzaG44RW1nakdyR1NZalNndjRkLytZdVVIcWxoRDZ1bjhiRmhvNTdwSGhTQndPWC9Tck5rM3JyTmJKZ1dDL2pxeDRrVHh3SmRqaldjSzRyZkI4bGk0MkgzYUtmQ0FFQ084ZktSZ2luYjhKMHlrVlg5bE5TakpGTlF4dU5FMCtaSVdlZUFlWGZldXowQ3d5MGxHVWxBVzFQTXdYd2lMdHZIZ1BhRzkvdWUxZURtK05jNzQ5SUlidHlORkNJTVJJdGxRdzlvamtTQlc1cVlGbjN1bVVBSVlwRlhvNDNYd0pLTVpibVBQVDNLR3JpbXRCam9FREp6T1EzcHlsemoxWS9iNS85MTFqNkFzMFEzYzBxbjd2UEhvbEovRlo3Sjc0UjlmcFZxaGMzQ2tHb2lxSGFVRXBXSjRMSkdKVDhSQ09GMHV6ZU5lQm1UYjkrTjQ2YUV6cndpMFE3MXJDWGVmUmNrSTRlM1ljZncwKzd0Tnh0Q1Qva1hUSWZmbG12OU0xVEVpL0wyQ1lqbDVYczNmVXhNQi9nTm9ja1ArMzQ5akMrUnpSby9wSUNDWit1ZFhrTEJNTDNUbVY2bW5OM0tsUGRZQlR2ZzdsMk40QWRUalROaklTTHNJNmtRbXFteFJ6YVVSRUxrZGR1RVJYZlNqQTJNYmlWL3ptYWdaMW55anFtdjdnYW83MEtHdldsTG1QNjhIVm5EVFhOQXFndUlobSt1UTczVUZNdjVGeEloT2w2Q1dzcW5COUoyeDVCRmEzbVIvSEVWbzNrTUJIU1EzK1JHbEZoR052eTQrc0hFK0JacStPbVpya01rOFdHSUQ2bStQUjhyNXo2d2ZPcjBwQllsN0lOS2Y3dUF6bmYxTm8xcGZOaXdwZkZGWmxBTFZTZGdJeHk3QlZ1RC8zWTlOMktnTE5EUHE2VHV3YzNLZEdPd3dMdmsvcmJxdEtpK1NJa1NjNHRJQ2FPcU54cWZhY2xGU3hZR3NyaUZsQ3FzODFhUU55T3NWUko0dTdvbE1OU201bGdxcC9nRHR4b2ZiY01zK3p1RUhPa2lJZjkvNk1OSWlSMEdUc2lQUGZvUVFpZXhOL2R2RG1jbGYxV05RcFdXNlYyUmVGc0hsUWk3Y2xSR2JscUlSWXY3QTBOWDF0Nm5wc1JCY2N3RUtBelJVOWZTV1ZEQyttNENmL20yNDNpNmc1akNiS2M1WENXOVErOVRBTFZwTThRdW9oT0ViME5mMCsvMy9NWS9tL3RMK1ZGNUhBWklmaWhNamdmNjVjS1FBb1VGd0VFQWdnTU5kNm50RTNXM1pCUHoraGVvTUVTQnIvZmE4bkxab0tDOWlzeG5jbDB0a0xzeG9vZ0pKZnB3UFM2VVgyeXdYSE85WE5WWksxbng1UTZWcXcwMmJEUzhzZnFnMVhqVDExaXpiRGd1aWlZWkErOHpzTHZ6OW91VUJBbFM1S3pSRFBkcTNpZ3h3UWxJVWttOWNLWVRQbkI4M0FUdWRXV0gvMmErek9UaWdGSXhBRlZJWlQwUnFOc2hyTDR4cCtaclpVSkFib3ViUm9ubDlkbWF5NXZpYTVKR2s3U200V0M0QzEyL3FzM3pZakdFSEJXSVdrcmw3cTBmV0dPemNpdzF6UG9pSG94a1NGdGhZZVRKdXlTZUIyb1hZWmdSdFVWVkZ3Z3BMeVlzWEhQREtiSCswSm45U2UzdnkyYXdRWE05WUpvcnhzSkQ5MkVYa05qL1Z0dFByck96Q2w5ZHg2NU1NRDhwUDdjeEFSb01EZU9Db1FOVW9iNzNEQWp3WmVmZW8rV2NsNFY0UCtPcXN4VnlJSTQ4TEE4bUV3RUIxRGd0RlVxeFVydnRib0d5dGZndWE0azM1T1R1VFlMdEN0bDBFeUVGOXpBU1FGRG5jc0pmRmhpSkVkcG53bVA4OHB5NjBJdktWd0h2eHNkOW5XeEZDaW5qQTRrbkl3Q3B2K0R5T1pOTlJmZDBYQVN3MG1VMzAwQWI3NUNxMVlWcWFLZXpXMnlzS3NHc0hscHQ4dUlZempIZzY4bElPaGJ5VkM5MXVoaEF4aHFZb2RjdE05UlFaQXR5MjZVT2Z3ZXQ2L1RuRm13WFhDd01ub0xTMzZKMzMxUUZLMmIzR08yZDJNNUY0TkNnNWVWNmY3WVFtMko0ZVlpdTB1R3E1b0VlM1JrYmFmdTNjTHkxN3pxL3VFb1d4aVhtQ3M3dW9LVUY2VjRlaWVLY2hIUlBOakdzd292Q29xdkZFa1hCUmNXTjdQa1NYN1NOVkNBVHdKaHhnTlV1cUhVNXlFUGJZY25SVEs3eWJIOHlSTURZa2p0L1FkZnErWmVTZzJxcnUyblJMMnpGTWNISTFnYTVmYXFpQTZWd08yem9MZUYrTmF4T1J3S05HdXlUWEFKR2lWa1hFUDUzMnZHRUVGdzBJazdJNW5VZVJDeHlwRUlpcW5rTGd2QjdMKytETjJuWS9hSllQdEhRRFdUdkhuK3pRbldEZS9CbUlvMTRmajlZRlRZWE4wdGlLZnFsenczNzVEUFlWSXZjdEtvUS93ZXo4bmE1aWU3ZnNoazRrazVuWXhYWThCT01XZnlDS1RiZk5VVmNCMTd0YXpHcDM5WEkyY2E2aHU3OFQ2dVNiKzZPbENqbFNiQjdyVlNhWExDT3YzZFZEMiswbUYxRmx0WUpQWkh3djZZMnhqajRzbWpmMFVjMm12aDNqS01EV3hwUVdodXIvc1BqdVFmMDN5dkRsZ2QyV1l0bk1TdTAzWk5LVUw1ZnFld2oxaVdEN0RTMFpRbGJkcm9RMkNyM3BSeG5GZ0pYVG1CK3ZNZnMyeHRzY2ZIQmhaSzhsRnZIVzVBd1N1RWFVMzVmV2w0NFBCS3Z5anduc1NWUVBwWWNMRldTRlpRY0JicmVKcXZrWEhsNk1XT042WVRJYXFyUXQ5Vy9ORS9JWjRxZDd3eG1sVk5SRmhiY0V4cUordXEzeEVlR2ZCU25uUjQ1QURmS1htWGlMdW5UNkpFbUYrSnFyS04wR0tvQ2s3QWNtdnJWYWFKMU5BeHRldUp3anZKQ3hQTWxhclBKMVA5NnZqOGhLY0NsekxBK0xJMWNIbkplT2dhQ2RIUkJPMStLU2toWFVabFA4OXhZQk9xRldYakxIL1oyemczSlNmdnRUUkJoTDlKYmZvNGlUS1IyelA4azVVL1Vxd3RIem9YOFdVOGZDejRHWWpVSmZXeVJ0OVhRUXZ6NHpIM0w5S09QYVBOdW00eEE5SGdsRnF5elhBSDhNZEVyUFhac1RwNTliRVNlUXQ4akNweWgzNmxjR0JRR1UxbVZMRVNyN3JzRnZjRDhxaElMMGhNVS9HS3pyRldIWE1rQ1UvS0Nuc0pzTUJ4OXlPQVJ5WHVqZXlkem5ra3dRY01pQ3EwZkdBTGJVNGNnRnRuOVU2MU9HbzNwZlA3MmtManFmV2hscGZEVVI3U0p2ZHM2ZzBKWU5GcXFzL2tkdk5maFBwckJFbHBTajJGYURrLzBJZmRFcXNmNGlVMWo1TWIxcFNtK2lTTkZ4dEhmTXIrVE1ENVdOKzhsb0dFNE83cUNmVnAzMWw2KzBIV1g1YTQ0R004U3ZsR3FoWlNxclhDS21reXFhVDF5L0p0M0pxUzk5NGZkVG5TcW1qWmhQTWdxR3FBNnRhWitDSmQxR0JXR1pzTVgzaDNZeDhOTE94Sjc4WVVuM0hpTGxPd3F4U1NCUXJka2g1Um1vYjBOZG5ncWd0K1lxaDQ4bkpDWWM1anF1UmNDdHFUdElXaEoyV3VnN1VybFREd0FweDhDb0Y4MzFqQ1g4SGFsTmN5Wm1wZlBwVmo2ODFyenAwcFZ6elV2a1Byb3M0aEZTWGhWeU53c2hqMXJMUXpTVHNhVlFUTWxyTE5sYlZZSTdiakZac3FMS2VXNHdQREtoSGpsNTdrcHBvU0VERGlENW9RVDdWMHJEbUtoL3hlOHBwNUxabEs3TVR5NXAwbzNFOVU5TUFrWU1jYmIzclF0OUNOdlFZUDRBTHBCaDdvNm1RUDZVNEsybC9TVWFPdDVQVnJYYnROZkVYUlhOVHpkeGxGVGVVY1djL2FER0lzdDV2R05FZGsvdnJCeFFEV3lER1JQbVVnU3MxbjEwakRwK3pvTmhqa3VqM2dUcWhzcEkrbUsraFRUNXExcTB4K2hla1R2WkRiL01qbXhlTndPTXpBTzh5UkExdjlzOVlmNHRNS3VkTUxlVVVuNXR4WUdLd0syYzZ4Vjh5cWpQZW9mK0dOZ0FOSEcwTkNpVWw2d0hmT0MzNlU0R2xaQk51cmo1TlN6clUxMUtVMDJxS0NkdVkxc3lmaUdaWkphVk9zUXJBTHozQ1FaWE1hNlAvREJCOXVwTkZndFROeDZ0ZTcvQnlSVVN6bXIxYXNoOU8yVWdpUFpIUHB3aHZQR3B0aTNwMks5dUZ5UWVGTVEwRmlWcW9kb3FlWmxqTGFuUkNFLzNIV2RyOW4rMU5ET3FUc042cHBTUFUza2JSL0w2c0VpK21HTnFHMml1SG1wK0V6Y3hya2Y3Rm1tdFQ0bFB6WDc1eU9nYi84OGtuOFRrZW1kSU5RcTB6cHVqakpZS093cVVSWTE4bU1uL2dXVVNhemJQZDI3Rnd2b0d2VjhlK2Y5aW9rSmtQQ0JPOGlBMW5yMitYR2NTVEFOVFo5TlRPeUhXbkpncTUwbjJTc0NEelpYOXJ3QnV0TXFNRi80ZjY4azVTbEtBYUhPZ3Z5cktHaG1xNU4vbUsyYTVhM29LT1IreUI4cXF6V2VvSEdUaHJFdUdiOW16MmlrRXlmelJhbGtNdjFHUDlUWWhZRDZkb0tkeEtudGpkTHpmZVp2WXorN3c1cjJzZ0R6SHZ1dUFMSHhhUWEvS2t0TmpaU1VCUFZ1QmdDV25Sc2QrZG5ZbUt5ajdrdjVIRDlERnNwUGt0WkFNM3JqRE5QWXNQanBPNitMYXFjU1VTUEgrTEMxMk5oWUY4ZFRjU09LVjlKeVdSV3FzWU9UaGpFU1BYSGNiUHRxcEdCUEY3YWZLelMwR1hnd2N5TDdLT0UvRk5jK0xGdStoQUQzLzBEWHpKSCttM2UvMkMvYXgvTW42VzN2UVZlUWJzVkQ0Sk9PQXA3OGlybjNvdGNRV2dvL1J3MUNDNDRIOXY5WEFCc3FxdkUzaDJJYWJOZEVzVU9JVjNYRDZpaWUraGlkQkEydy9xNHJxQkJQbDlwRk9ybzk1ZnVoWVRVUC9nLzRxSWJVSnh6ZWZIWGVDQ0dWRnNsQVg4WlkvYzF3TERnR1JFK2tPWENzeCtpQWd0K0FOVSt0b05VcWpkZ2xCWTM3N0wvdU5zTjhZSVpPMDdUUWVkNFp6WVNlUXhoT0lIY3JRdFV6clZ4Mk5zQndDQUZ4NE1FVmFYci9jYm43MHZkYWFYNEU3MUtjNUpFYlNTUnJLcjA5VUwvUExucW03VE50bXVMWCtQZ2tqaVBtQjdNT3NHSGszcFhoRkVkNzV2NGlPWm9zVkJ4bXZBNGhhbTlESmdHM01XRHk1NE1jUTdJcU1SM3NTVm0xM251dER6YkZlajNJRWNkMUxQV2NEcUM0c2xaVEs5emlORkpHaWhTbUxVakN0aUVNVjBQZUc3WHBlQlAwSmZUTW0rK2IxVjA5Q0ltaENlaVBGK0xBaVVJL1NacmptNjJnb2NWWnpSQzFrWmhIU0V6YWlOTWtPUlFVc3J4R1ZaOUR2OVpVUVZQUlM3UlNacFVYNURYZ2VrYWlpZjNRVDJWOWZLRGpZSEdtY3dTekYzK2VSZnhreTN3RitoT1JIMlQyMkpFaHZkQWFxQkUxMUJNTmlJM1BkV2NMN3J0bVNDNklqenpRUVNkdFlsSVBlei9aRE9BWEErTWFSbzRVZFZVVnlWUXE5VVc0V3JsUXByRytxdVcveTh6d2JEMTFBc0xRT3VaOXFRMzdXT3g2WWR6K3dvUzJPS3pjMU1mS0Q4QW9tQUlmVklPMnBZeHp3ZnBSanRLL3p6bXlVdmg1YktiamhQc3l0ZkFBMDZqSk1QU0kwM2tVSDhDNlBrOGhqM0h5MFE4bHEraVFGaEh6UFl6QTg4eWhtTGN1d3BacjZuSXUraVliVjhwa2c5c0JxL3FEcjZCYUlUYlZnVmYxR2trRUFuN3Y3c0VSNXI0dTFSb1Rhd1Z5SW1uVm1HWDdmV3Qzc1VaVVdlbFlBZ3pDdXRuWmU3SnFiNTBoQjNpZE9FZGlNeU41OTJENmRRSngyTkZESCtkdFNJa0NFTnNiODArMDZvd2QzMGlDS2VCR01CcXN4dFU2a3VycUZXWWsvVUdkeUY5UlF1R1pWZW5uejhFK1ArN2cvcWc2UnJFTUwrdnI0QnBsY0FCdDZkcmVOaW5rQzd6SWExc1JBdjVSRkNVMGIwbU9PczB2bG1hSUhreEI4RlRQV1IrWEVpeDVVTVRvd1BsSW81ellIL0hIQmNwL0lKWXk0UTVaU1FTcmEweWJzeDRGcWZvRTdWdHhCc3VLY0VmZG9ZeHhvcXlQUFhCMHhhemhQb0s1MmFIV0NQcDMvWkVBN2hlZEJCNTZPb21jakg3c0dua205YmJHZWFnRi9nUElUVEJlYjhNZlQwdC9qNUZ0Y0xSZC95NmlHNXkwWVFPelpteFdQRUFLZ2ZMN1BjZmUzV3hjOCs2TjBvMzIzK3dyMlAxZjNHMTVaWE1hMzhJa2tBU2JCWndpQXlHSUtnZmEwdmtiNjBNNjJlclBBbGlnRjRyUmNXZWtNWno2TU1wQy9rdGc2Kzk1eTkxcmMwbk1wTlFPS2x0aVhsS2tnMmNFazN2L0N0ZVhmM3hscDRyMStYSEowQkVLRmdRZFErRUxkVlg1MnhjVkFhd21UejdVSGZaQUI0ZHh1OExxcE1XVDQvOSsvdVlnQTJONS8xbGNxd2wveU1zRXQzY0kwMis0V0VwUDdGdmFyUGhReUY3elBUTm9CeEdScWQ2QVQwSDhqV1k2ZWxxU3F5T2JWVEVpYkN3WndMVHQvWlZjYzdMMGMxL1dqTjZtSkJTZDJUZG1nQndtS0NkVTNYL3lYVGpCakovUmthV1BxOTlTRmlsWjc2T0RodzY1bkp6ck5jMEs0ak5sblFFQXE0UlhvWURldkJnNDE2SzhHVmtObGZUTzFpcHd4dmV0VHl1dmd5TkNKRC9Tam9Ubk94b0NPbDRYZ1RkWktMYmw5MUptYUJhUElMQUQ5REFVMFY1OHZQeEJPSHZ6bmdudFBsN0hubVYyYjdOYjVpNDJLY2hHSzlHVEJsYXNxbWRFMHVkeUlTVUF6Ny92ZktOR3oyRk50a2lMaG5VMXN1Vm43emRFZW0yVklFN0xMSnIzUHRJbWw4OFBaY2E1T3dRYkhKbHB3ZkxtRERCUHRmNzdkUHdIRGxwYjJ5SzErR1lRbkVXbk1XbmxvNUJTOVpVbGN5UGxtMndCaC8wdGlLMjVlNVVoMkl2ZDhvRTlFNWYydWFWbThHVWRxdG1FSGpKbWZqbzFzd1BPWFA4WkdkaDNLYTZyaG9TdVZUSjlvajd6L1FaMG81RUQvZmJNUHBFWnZnVGdUWXRkQ2NtT3dtN2dTTWh4RjJsUXlNNTFoRGNNa21FMWROMmN4ZW5nOHdvS2xOWUVuZG5nL1h0WW5xN01tR1FNYzFPby9qWDBlcDg1eFNSbkVOcUpzRm5LMTlLZ3huRVZwWDZ1Qjd6MTZ4VUxqa3RkcWNFZ0xBbVhwVCt1RDFKWVlyN2dxNm1LMDdocndldjM0VUFGYTJXODJZejZOd3l4bEE4MFFIbjRoZ3BUd0tQWDZ2N3BVSjBDNjV1dmJldEhlTmhNbXlqeldPcmRpWHFLL0dXM3lkQzI5SzVRU2J5ZmFZRVNXNm5lZ0N1Sld5TS9KZ0huNkprek5LWjY0Ung2bFFpSWZickRyaVRJcUovME1INUhQck9pOFpDbmptNkp1KytVOEZZRlp3dFNQVmZMSkJmQS9mRzFwK1FoMmxGeVp0cENQVGJnYzl1OXRaSC9kNVlvU05ZZjUxRTBUSzVjMjVmakVnNTFIWDlGT0Q0a0xpSmVGb3VBdGprU0F6SjZsMU45cXo0OHZPb09JaDhyT3pHc3JSWlh4RWlmektqcS91ZFEzQUtGbTZkemxOanVjVkcwbkZGYlBBWXhOb3p2VWJKYmxEYUdxRmVrU1FTbmVEcHhWaHZxYjhSRWxXMDJNQkF4RFg2V3N2UWZHVUI3NUZyZFJ4cVZjZDFZOU14c0szbWU3WDVpcHlBRG9MVkNySm0yTW5PTkovcGdOMnNEb1F1U1gvNkpRSGdBc0FDZ0V4WlViQUZEbUF6TVZwdVpRcHRUNW5ZZFMrbG8wRnlUb2pubkg1aFhHOG9za0tFMkYvTnl0Z0ljRkJNSEhBMzNoUWRWTXZhNmpMODVtbW82UzBrQktEUWF1WlVHeU5RUklSQ1dlSmV0dXdaQ3htWXpMd3NMUVdHcmMzeTFNZVVpMjJyT0VZNHpxK0xmWCtrYURac0Fvd2ZvUW5nMzU1WVVpSGJiUmJaWWk1amFUS3ZJN2VibG9uVnJlVURMOUdaMUgxQ1pkVHlrL1ZSVCtoZjZ5eTZUZ1RUMmpkWWZBbUdLN3hML044MkltaW4wNmkvdUJJWHJYVGtST2psakxGUmRQRHJHYnIxbnBKTjBtYk50MEpiSFk5RmIzek1HUVF6d29MazVESS9LR29oSWxQNWZJMmZzWVhZUTFldkJpZHpJL3hNVFZQVmZIWTRkU0hQNDQzVWxIUjRhMGVPWFMvYU1MRlhnWjJxNjU1L3pGdG9qQTNyL1hLUWxoOS83SWlscEE0QWVYS1lDRzhBYlMzekloNmZYalp2bGQ3RzFEVXFNcXZjMzROZnlCdkFNdTZ1ckIvSEY3cDNwTHY3bkFkdFhsQU5yb2VxanN0Ukt1dFg5WGJ0UHVzemhjcUp3VHFSUGphcS9sUkJpOE5NdFd4TFJ2VDVwWEpWQkg0WkpIYmVLTUphbXZWK0ZpOEVkN05KTFlndjd5OWpHOGY4Yk5kdE5yOGRFNnR1QXkzZ0tZallaMEhQSjQ3UnEzbHZWdU00Y2NBNUpNYTVFejRsR3ZhekxVZk1JNkt5RS8zTmRHakRIYi94LzZ4a3h0TjZwSzVPWHVQOXBDbHhheXU0Y2ZNTWM5R2NwMmNYUUg2eVViVkkzRStNdkdLcmJZUFNJcmV2QlM4ZEI3THVSRlFqVkxYS1h4RDlGZ3FITUx1eDhDenNXenZuL1NqcUVnenBJZDkxUVVETEdSeWhEY1BQT3ZLOXVSZGVUM1V6VGRPc2ZTWWZGYkR2QUhBVkxSSXhQeWVHdUNkUEtETWxHcWJQN2FPQVBSUlFtRTFycFIvZWMrT0t0aUYyVmpYVmVKV0ZiY0syOGZhNS9VSVE2alpSNTlEZ2ZoY1R4YlBXSlBJMUFhSkNmSTBwaVZaVFlXcmRlVi95RWJKR3p0U2dyU3d6cld5NkdaWG52WEl3S2tpMzJSRmMydmRjQ254Z1U2YTRPelJIU0RBNEZrS3hvUVNGNEwvZUJpYTlLMlUzQkhPMmkrTktDTmY1WE81QVR5NEdkYUdzZTFPQ0YwbXU1YTE2bHJCYm03NXRubDBmOGRNbTQ1ZmtMS3IwTjVBTnJ4b3NSUVZQMHpUWHlkSktPWUo0dEY1NlMxc3ZZSkE3UzlkbHhoNWpxV0o4ZVFPVXFQd1F4bkdOenFHdHNOR0Yxa3ZveTFCK1d5RmxpNVJQR3haeE1NSEs0RmNKRlQ5UFF4Q24rK2dEcDUySmFNdkdhZGt6dkUwR05lcHdFNW8wb0hNVGtWZE9QdnA4NDVTdTNGdk5KQXBlMFdqZks0V0pONzlTTjM4QUg5Q0M0SzhXbFlSQTB6Y25MdW1XQmRjY2c3UjZudWlIYTM3T09nbDZ0alFkaUVaQ1R4NWJUYkd0TkkrSGZQVVRQQldZWUpzb3lZc0Zxczc4OHZYV3ZHa210dEtQZ2FKQmppdUZBcnUwLzRqc3ZYRlh6RG51ZkRoQmsxS05OS1ZQaWc2UHRFMTMvYnZxZmR6anEzRDdiNnlON1llMGFwK2pOQ3pTY00waFVjMlRFbEZqWnowS3hNQS84L3JmeHlVeUV6bUpoVHVRMlRpazkydXR1ZTZNcnVVb0t0Yi8rS2w5NHdsQ1hPd1d0UWVJYVpFSGVnQ0hNMk9qWHFrQXFCeEVUcFVzbk1zZGdWMVJaalZKd0huSkN2U2tHemVVWklQd0dhbU96Ky8wNDdOOUEzTkpRK1kwUGxLakdGK3RKYXlSNisraGp1am9oaTlsTDl3bndrS1QzMWNoWUtZNmgvaDJSQnVjSFFBNXVqTzd0YnArQlVuMm5HQXJsZHB6Uk5xMjBOM0JmV2ZJMHkxaXJodGZ1eWtMY2laMFBMdmhsRHU1WFdyd3FubXc1MGJaY2tpSDJ3Y2pUbVVERmQxLzNVMDJrS244aWZPTzNxRXcwbllZMC9VYnZqVU9KRk5ROWttMjF4R2JpWUNqL2YrZGhLMGFDVDlkOU5vSTlaUWlPR1JlWDFzWnJMWWo5ckhGTE5HY29FUHQ1K0htQlY2dy8vTWhYcHFoUmZmUDBSbEYxdWlrNEdCWisvcEovZ2ZTcHg0b1RDR2VDQUtkVktaZDF3TkxYaEhMd3k0eE5MMUNyS2pLNFBPTWdQVUozSi9ucm5SNWE1bVRsWkdqYlh6S042VVF2ek1yV0wzYWRVcXZoVytpVC94WE9vNU12RU1BeUhBdk1EVDJ1eUg4a0FWS3paazFsV0MvRkpSdDlKekU1Y2RjcWlkcjNPbVYrV0o5S0s3Sjk1L2hzT3Z3Z2NRWUY0YzZ1OFNpMzFzLzIwZXRlZUJkaEpCRnNaNUxLb0dmOUVHWUp0TVkyNUpiZTlaa1UxOVJkaVlJMVV4Q05hcHlFMzFRa1NPZ3hFOEdmbmZSQ1liWXd6NE5HdlVzamFRN3Bqdml2cFFIT2ZpazhaK3NOQ3VKMDR5eFA5bXFkdWVhektKREpuOWJFdUljenRsYlNTSjlOQ09KWS9FUFEzNWcvaW9La1Fsd3AzMlg2U2ZTeE53SUJJd0RsKzVOWW4vRlA1WjREN1JKK21vNmJtaUVEZFRldUJOdUdXZDN4R1kyaHEycnpWVmptM1A2NGRVYWJ1WDhHSXkrcFJnSnUrbnlBdDdjWG16cjlQb08wZzR5RnpuRzJ4Nkd4NGhrZXltaGZrQWFyRTdYWEkrRTR0UnMva2EwbXRKNFdab3I1Rk1GSGFZZVgxbGFNbzJzTEhheGlTM3RkanorTkJiU0dnOE9OTXJlcVNVRDNzU2Z5RmowOVBHNlhnTU02S29Hd1lyQy9WNlhKK0tnbUlNdk15RWpyY1dZeEhuSlYvUGJpVDNrRTZhbFpTUk1XcnZVNFhIeHMzYVUwUFJ4KzFIVkZrQXgzWDNDU2ZUWXNQUU1wbHJZclBEcVRTMlRYeCtpc1RITjNrK0VySm9BYUhnMm5UQ0RqdnkrRTJEanpkMERBVktOMzA1Ylc5ODRDS2pZcmRiYmlwK1NPelREM2lHdUlHSXVlTVZRM3pVS05LbmhxTkpjSUZkMzViVVMwc201b2dXWG1NL2J4emxmVEc3dzFwN2dneUtqa3RveUpaRUFZcTV5UWtsc1h3WExmZkFKbTVwTkR2emZhaVZRYldrTC9IaitPSzVwUzRJQ3dxNnMxV2NLSEc4cENDMVNyWm41SEIvQWxUTWlMTTVxZm1uV0c5c0FiY0VsREt0bWxKU3d5RFpENEV3a0wzdzhWdzVCWi95TCtxUzI5WnluU3FlV2JJa1U4bTIwd20yWVg0R0lPOGtMYXM3UW9UWUZ4a0p2U1d1OUd2U21uUUE2dmhLVW9IbHpWOE5USkhXME9SL2h2NXV2cEovZzZpcU5iYVZ5YnZiRVhxNEtOT28vK1pVYVc0TWI5Z1lhdE8rYWlMRVhaSUxWTFUrQWx0V0pjcStwVFVYWmxRY0JXRnZzN1VocmpRd21ZZ24xaFlIK3Y1Q3d0TmNkVWpnME52NlBEb3g0dDZCT1BSUm5vdlhtNGNFNm1XUndBNEpxZFdNaUtNTm82MW8xYVlmT2Q2Q2JvSEFRTmhUb3ZNN1h3VHFPZ3VWUUkzK3JQZStwWXlwWkE4Y3UrcEpkVHl1YWVLeXh6emZOT0MyQzF0a0pBU1ZJTVJhOHVBekE3a0FFbGNpbHYvd2QzSEcvSUVsa3ZwUE1XeGdQTXZ6dmxZb09HWGx1UHVaOTVJbVpkR3ZTSE04MUNVQ1lSdnlmTjByckhoWmtmbmZRV3Y0ZnEydllLT3dkWDIvblZWMVhXWGhYUDk0eXNEeE1yVXpwSkxRTE9VT0NxN3pvTE1kQXdvVE1ybFVKUWVlZXZqdG1PeUU5V0xBaTBpZGgzZWlLeU84V0c1Q2NlcmFSbnRya1ZHL2dkSFNUTzFCRUVVYThVVjRLeERCSTBVamNUbnRiVWFrK1p5cTVuZ3FmV2VjSXcrOGE2bWEyNTlPRDNhUDM0L1UzbCtNaWFrWW1oYjllREY4NGdQYVhOY1d5MDlyUUdPaHlvcEtDUEJxWFBCYlVOcU9ISlNZUWRGaW9QL3hGcWFzUjJ0Vk9hMk0rQ1Bwd3Rnalk5SnpvTVBpY0orT3JnWTVYb0hGU1hoajRDYTg3WEtkWTA5VXE5SXk4My9GYmVnYy81dWk3NzIyZktFa01jdFhLMzRhWHVvck53YU54NEh2d1JQZXdYQkI3bU1EUXA5SjIyS2d5YlNudUtaQjFISFIyRVRTbTVXV2F3WUhLcHB4bTkvQzloNmlOT0lMVFVQTllGR3g3cm16dllRL3FWc3VsZnFCN0d3TmVwWlpqUHNlU1h0WmdSZ2dyb3ZHMHpaTUwybW9WOVA2UUZQNFlzT0J4ZzVkY2ZrbTNlMENVWDBIZGJkdXJTbUdsTHd0UEpYVERSTkkxSnArY0pHQjVmNXlodVhrN0lzc1JmaEsyc0tKR25SM0hlUUpYZDVjUUt6QmsrbjFHUlhSR2prZjJOajU3clFqK2ZoT2RNZlE0MEVyMWZQNUVMVzFtQzRmTTRpMk11NnRLWHRPSHNtMDhGSUFMU29KWnN6aDVOL0dyMzZJSkVXWGZtam1WSXpZR1JWd2pjbjRxWFFvZDZudUIxZjE5Um85cnJrUUd0SUFYU0ozZUp1SDlqYlU4eEFrNFRKRitsZVV2SDYvSkk2WFU4NUNSZWs1WVRkeTBwME5TWUxVWFErV0RVdVRwYjl0eHhtdUFNVHN6cjVuTnRPQXc3bGNjTlZ6L0ZVOC9DZkxWcTdHVitaQjhOOXUwTzZmZ293cTFRRnVkWWVhQnRhRFN2S0lhOUlwaUpyNC82VTVTSmRYWlVGbDlGQW13MzgzNjZmbXZEOFh2bWV5bUN0MnJWTVFvUDBSWTVjWFJ0dWdLbkJtWjE3bVlNUkxQRC9neDRDQzBNRzlmTzhYVk02NFlpTzkxVStPcThSRUpHYS9XTFdUa0RPTUVrTmJMT2l5UG11bytMdE5wU2lYRFVpb093NHI2ZVcyK0R6N0xSU1REcEZEaG5EQU8rUm1sU0ljaUQ2MjY4eFlVQkdmcXJPU0lyNEFPbHJIRnhoTE5yMTQvWVVrM25UQVBQVnFYWTdvU2R6QmxKdGVkdnVoSmw1c1o0Sm1DYldnUDZQNS8yL2M5NzBDU2czQTBPQzZ2OWhEUzJNQ2xzWmg2eVRmdkozNnJuamxjQXJzZDUvMm8wTlRQbVVSZ2RtWDVuOFJLRDliLzBVL1RBa3NkSUsrZStORlN4T0NEZ1BTN2t1aWl5YlZvZ2w1bTIrM1JRQWZtZDRRWlBYbW1VSnhpNEl0OU1tMGRkTXBHaWhOUm5FcXNjbDNoaFVEbHU1MVB3N0hvVVhhZCtScnNNUlBta2FEREpQbjFpODNYYXludkt0WERiQm5aR2diOFF2YWhFQkxDdm5wZStqTHFCK1RleGVWQU85b0cwdnlSN3BETEg3THdGLzJjT2c5WU83b1h1NDlzVzNPdVhwSHRtSG1BQ3ROOFNKU2JHb3dXblRjK2xqUkFrc2pMMUZQUldubDZ2MHF6L1oyc1oxcXg5LzJMc3dYaFNXRlVuTHczckVUeWVVZUtKcktsdkt0TzZyMUo4M1hpdEVHbk9rQm9rcHVFN0orME1nRkdNekxZZHFrdXZVbjY1eC85bHVrT3ZzL0U3cEtlOXZmZTJQVitkZ2tpRVhrZUY2RVhUakFQOFBqZUVNc3dhY3F4cmpBcjdKVlRhQWtndXRRYlIzSjd0cyt5YVhjVlA4b1RYWEJCamVTM0pvU3ZGMlhweTdtRU0vUXpscGtBQ3dyYlBEYjVaaXhxTGI3NDQ2VHprTHV5NndKbUdIeUYrL3JtaktiditkOVVDL3luSzV0NnFiYW9VdWp4Z0FCNmtRNGVCeVpkRFZHNUZmSmtRdHhlNTQ2SWFDTENTcEZaUERYVUJGMDNseVBTOEcyME03R08vOUdkeFo1OGY3K0Z2c1psYk9oNkhzeFBHL1I5dUFmNWxWRzR0aUN3aHRxWUlSZkJHbjJnZWtLNFRLTjk3NUxuNVdiZjhZT1Y2TTJBQ2lMTkZINzFoQytVaXIyNzkvMVA2M0NNTnIzYjY1YmxJWmVkamUwUmp1WDBUVzRUKzhtQUhZSWdCbzNOVXYvTS82NUVjY3JXdXpMVjlZc2NjdVFSekNaRUJZV2VHQ2dkQjBOd2UwbkRROVp2dGRSRjNxSHlKZ09SbTJlYW5lbm9ZK2h3WlpZZ3hpUmpFbkZMbm9QdEg5VmxjeTIvMDhoc0U3aVpuOWY3MkM5Z0pCQ3Jqdy95WTZnRDNsM2J5SXJXWTZmRStTSjQxekdYcHpZMGVBeE5nRlFFL3QrWjVnaU5BMStxVHVmc2pLa2JSTFkvb2pqWmxPUEtIN0RPNDQvVTJYdml3Y3JLMTlqVklHaklHZEtEdnVEZWM3eDlWU2RMTW41R0RMZURNdmZIQXFRTVg5NXRyd1doeis0ZlNmMkIySm51SXdJK295dVcwNVZZK1RFWjVSWlM5d3FaOWF4YlpXMXNjcHVzSHpuanllcngrRHFBMCtrSnZUWkF3RktuRmo1ODVMc1pSY05wV1FzRHlZb0JvTEVGMkVCNXB4Vlg1YWI1bDljQzF2RGVLWTlTZmpxdUMzUHFiTklCeEFqYzFGTlJ5Q1JWQWhTalJLWmkxbHk0UzJ4L0Zpa2F6M1QwZlBPbUdzalRUVGxkVWEwdURkemVyS3dtOERJNFY1WTdTWnBIRk1GOGpjdUdMaDNLOXMvdFZEcmJrRTB6dDVqSCt3MG9MMUk1ZUJjMXhkYzlhUFB0SHhWUUM3dU1jLzFLU3N3ZEZFU2YxS3VCYmJRZ2REU0dPaEhKMTQ4RFdTQWlZS3hJZEp3d29odlZPdVE5OGpoRnpPb0MyNlkrRlFpejU5MzhKN2hNa3JYWk5zcG84V2R5d3FEY01ab3pXc29uYzFVZFhxNzdMbnFkMHBSMTlYOVRlcnFGTzRSdCtoZWllUVA5a05nRVhDSmVoUmdvRXVXL1lHUHJtb3pkMjJtdDExTW0rM1AyekI0WkZXWEd3TStna2d3aDBIMHJKTFQzaWhsc0hTUjNsSU9PeHdCWGN1dzdDWUtkVFVjUTE3cXdoVExqbUNpdWlENXRqdGZLZ0MveDF0cXFhc0RhWXNBc2gySHNnSUlOajJ6bG9uSG8zQ3FzYlFMdC9ENitxL2RpRFVyeTZHRnRCQTVFV01ya0lwU0M3dW9OZGg3eWl6ZlhiMkFBV29DRnlCU2dZQjlsYjdwcWRyL2E0eitkWlY5d28wM3pRZHdiVm1sWWZwb2lHRlhWT2R2NmNDY01lWU1PdmVSVkphZjErWDhlUzRESkJ4TVMveHZaci9kV0M2em4vRTRNMFVEKzNjSk9qazVlT3FRdnZ0c1dmZ0JIM3B2Zk5pYnhRRDNQMlFqQ1M2WVNhQXhpVFowaVlnWlZhTElkemsxZjRXNnNPZTdwZzJqemNKak9VSEJwS2FvZTgzTUc5OTFwWkR1WFhUYjlLekhZOFhJUzZseVFwZk10NDJHNi9RM1o5TmI1T0drWWJUWHN0Skl6emlQT0RsSjZuejArZWtZbnd6a3E4d2FhTUpCdUJTZGNLQkZqYnF1R2RCRzdxRXBXRk42eEd3VXJkRDQzWHc3WlZxQ01yQ1ovM2xCV0h3aUNqUlRGQnJhMXJxNUVJdnVSaFN1Mkcvdk5QaVo1ZUMyUDdJazhSczVRbmNGaVNOQzFaNHpYOXVnM2lsVVhVSVMzcloyejNMM1RFVXUxdCtXdkJMY2pvZ0NES1lPUTFJWjluZnh4S2dzbzFNQ2RoaTBUaGpmQkRJcWNqR2cvVkQ1SW8rTllmeVFmRFZPbnNabkw1cDB4TGg1Rm0yUnA1VWhEOG9haW5yc1BuQzRucmgvN3gxWDRsTWRyTDRpK3dYeE5KcXdLWmh1MzA1aVRlVEYwTGV4bzVBVnJQcjJhRDBoK25SbDFkN3p0V0p4SFRIdHFEdkFNRDdiMVZHa3hxZk1QSmZmdlNXeU42eS9SZWxwUDZ5UmthWCtzOEplQksza0tQNHQzejExb0pjMmhwZGxhZ1NqQis0MDJ5cTMwUEh0WDEyOHZBRDJXKzhTdlUzZk9aU1BVcVZlenlVWGlKT3dQUW1WcHBUOUc4STZkSUZFYWRxS0RFcHNwVWR5TEE0UW5jcmdsRnlBTWtQZnFQSEdhMUdKQ1plZkw2UnlDZm5SR0tiZWk4ei9INmxkQVRzOHBidSs5MVpadW9mVXgwS3pMaVVzNE1CVy9aSFcyaGM2OFRnUGxVQTFFTU9GZk9ieXIwaXc4ZGpmcElVN3JNKzN5K3puUmZlTnNmUEdJdW5pcXFsWVJqQ1NWRUtUT2RScG5nMHp0dUFNa1pMMTlOOWVvVXU5WGd1eE9pYjBLMWMxOFBNMTg5ZUZTOEVXU2EzQlpBeXE4Z0k4ZEhEdnFJNld5ZUNaaVB4TnVmUWhoYUdHQUhublVIU1VCdld5dHRTWlFmN283ODJNZEI3VXNmMFYzM2p4WlAxMU1qeFBSc0R2bVpJRVlPaWhpbGkza1FjK2l1aEZpUWdsTjFlN0JCdnJRRnlUby85RlVnZGhuT0VoV1NOVnhpN3NiTi8yWTVKd2VtTjh5b1BDYXNTVmJQbEtuc3V2Uk1YQUhRbGMxdndJcVFhNGhLWmx1Z2EyUVBXc0pOdkJMcjU2TWVWTUQ5MkIrWmQ5SUsyUjRJMG1waUU1Y2hrSGdYbzNLWHRZeU55T0I5L3pRWTBaMUExY1d3UXlLS1lha3VhUThCVkNLeFRPQlRyU1AzakwrVXF0V0lpZ2xRU0JjRWVUZERsSWtJQ2NQOU02NFV2SGRDVjNEYjFmMEZVNDBDWVBhcXFJVThjQ29mb3gyKzAvekZSM0N0QmFuVS9xeGtYc3ZSV1JvMHF6YjgyY0ZCbVRQS3pCdk91b3c2Mm9RS3VSV2kraUNqUnNOT3ZNRjJIL3FIK0twekphNEFmcEpMbGVEdmpMY0ZvNkRuaWZZaGhjQS9PUFFhbmQyN3NkUTR4cFdOcHpnRlFCUWllejJKRWVENVpBRnI1TzJ5Zk9PNDNmWUlubmp2Q0lBdndOSDFmVUEzNWFWVzZBcDdUWGNBRnJUdDNrRHpJcGhrSTB1YjJDbUFzbnNJUVRSck1PVnBkZ21BdGsrcHpseVFtUE1XTU1PQSttcDNoem1sVWF4Q0QvYS9yV0tYMllkM2RGWTJLc1VmOTE1ZlFNYi9SM05lczJUMy9kN2ZnZjlaZkoxVEZpMTM5dWFKaXRCNVZGMkljUDNQUktXdWFCY2JHYUl4OEV1aXJIVjY2MDJjRTFYUkNvb3ptUTZzUlk2aU1vOFFOK2xqR1lxOHcvdGlLdWxhT2NEYTBZaktab1puOEFCNHJ6TEpWSDgzSVVJNWZSMEc5dGZabXJIY1UzcWZLbFY3VVBaQ3NGV0J2YS9jc1VFdFlzYlkxd3ZnclNEVFZScU9ERFhCTXRzVG41eUtNRW9JQ05VcnBxb2hDWm5DeEpKdU9NdnVVSnp3NHlueWR1TXVCYWlDNnJhOE9jUjZ3VzkzNlp4WnpscVlZaXNLeEU2Nzc3a2dyT00vSndtcXgrd2FWU1JvYmZwc0QxTzg0Y2N5L0M0ZlkxcUt1cVFaMk1nVCtBK0pRUVZlS0I1UnNsQ09LKzlRdGVNZVBYM2FnS1FzckhuU2tUbmt1VnJHQUhMRUtVZ1dxa1Nrb3FCMFh3SzlMMC82ZHJ0YlhWMnE4WUxWVGNNQWlWQWxyUkhxM0VnaUREK0RBWmZVaEIxNHZDZ09XbGNDdXlUbWpYTHdsc3FXbDJiS21PcVFpbUhqbjhQVE9uQVBIZkd4TnpqMnpIZ0U3WDg2QmpxTjBJVkxKdnJ6aUhVdTg0YlZoTzl2eGRuNzU5V2RsOFBHd2dnSEdVc1BIYlE5c2RwR1lmYyt4alhDc2R5cXBxM1ZwQ1kyeE16MjNtbWZXNFdKcTQ1ZG9Bd2pzYllLcEdxRC9lRzV6eWh1S2RVV2RDZ0tSaHU4MjljeGZlcFVyakpuS21qcmlBYXZDQ0FkS0pNMlZGUW9nYjdRaDI1eUlBNHhWMTllNkhwcDV4WC9XT1FsY0hZRXcxM1RqWnRsTk45T01GMUJONlNCc2I4cFFLbzdrOVcyRE8rblJpZGlxTWY4UTVHdEFsNFh1bHgrMFkyU3ZnamtiOXBsM05qamJmc0ZLNmx0VFpwZDFHdExJR2FRQ0Qza3BJcmk1Y3VtckpiVXV5a1NFdUFPQVhrUXFyamEvZ0k0QVp5djhTajcxUHhHeThMNnJtTEd4UTZaalRpaFFjTnVRSlBNUU9RdEdOMXZHRkorY0pHeC96cXRJenRrMVNraDRBUERuMitZZnc4RjdheG9sUjFBcXRnVjJkMHJFYkgrcXk1Q09Cb1VCZDEzcW11emowNkRUZDZJZWg3Mk1aejB0SnlNcFlrS204RnZJVGtjNnJoUWtId2tjRFpXZzFsN3RFVTB5cStyMTZBZk84Wkd2eUhxa1A1UE85Uk4wb0JuVmhEaXkvdHFPZjhaR2ozZmNZRm9ReHJTTE95TUNlWHVoeko4cTNxQndGV3MxdXlyK0hQY3lTZ0xNNldwTkxXUm9abTdQVXRpcng3eEx2bVRVNlZ6Yk5mRE9aS0w0SXVyRTB0c0ZKTThxSTFCb2pPTXc0SWxCRDFMZ0lDQWdJQ0FnSUR6L0QzQTc3ZnNZZSszdFp2dCt4K3ZzKzQ2L2g5Tnp2Mi9ieWZzKzREL2NQcTZmMi9TWi90K3JqdnQ5blBuK0h2VC93ZmJhYjl2Y2QvRDdLZjkvenM3OXYwMC8zaDlwNWZaOXd0djJmVTAvd2ZUUVgyL1dVL3Q5bVRoL2I3WDM3ZnJxZjh6c1A5dCt0bC9aOW5sKzM2TkQvYjlpVit6N0Z6ZnErbGcvYjlEMSszNmNQOHIxekR4d1MveXdyVzJpUktHOWt4K3N5MXFldnhUOVV3R2lZc0FuWlgxSzROQmQyU3VWSWNDclBWelY0VllJbEhBSUowYWdnckozNTUrbTB4UFZsRDZFaUpDVVhDcFUzSWZrek85bVhPc2hGUXhrcGxHRnNQRCtwZCt5ZUhCbWRtNWpZRlMzTXVkdE5CQmx4c1VNZzhHclRBRTYyaElHS3UzY25UYVZCTC9lOG12WURvd0IxQU9tS0hxZTc1ZGxHN3VZU2psWUF0eVpBR3YxRWNLNXByaU1iNG0rQysrY3lBQitDMjZpVHJqVjZCZk5CTTlzY2hOdnNrTG12N0Zyb0gxMW53dmUrU1JtRWpkcVFyYWlHak5JbE9CRXpmZU1WK1JETCs4b0dwdVA4UGxMekk0ZVlwRzQ1b25TTXV2ZzFWSzVxTnhEUmFCS1JLSnlkMlBMaVphSTFqN0FTZ3B3SGxlVXh1RjNBZVFDZVBYNWtoSHJPQkxUeThIYnhUaDFZU2VRQ1I4Y2haaFdwTHRUYURVM29MS0tNbFhwbFpiSHMvRjIxZEJucHJoMFN0ZVBIMFZIVyt5Q2ViVWJEMXFJMmgwQTY0UkZhT0hzWXZpS1ZDK1JVSjZZLzlhcEhFWEwzbllNTm95OVVPWXZQanFzTnNyaCtPSGVBVGNvSFBXRzNIWE1ySnk5aUhaSSt0eURNd0tySHUxZEZHSnptM0dJVkIxZHlZZHZEOGVUZVJlU0x1OE9YMEFNaitmaUgyNWptRjc1TFRMdjFZNlNGdlIwNW0zTitpbGhESUxsblRNZ1FJQlFUNGd3Q2VDOXU4TG83SWU0NGlSazk3UHJ3S1lSMHBxRHBmakxjY3pNSkdLQzhwY3VjcTVFc1ljVG5laTNjc0V2R2ZYbUN1eElEWkJyUWVMMkN1M3ZsRVRCczBxMXkyT2FxeWp4dzJyOTVJTEpEeTFIN3JEQmlsSFQxNjh6TVNodHZobjNBdlpkK0dvSGpRL2wzbnBSUkRkekJ1VzJ3TlVlaW4rT1NHZk5nYVJyYW0xQzhzSS9VbUVEcmNIRkVTaVhpaCtIeXRSbWJDOXlNR0NKdW1oaGlwY0Z2TU5hTnFQMWFGWnEvTmwxSmMvdW92d25obHo4RmcxckNCVjg3eGpZVkQxOXlPb3NrRmNhOFBBRlQyYnpFNEJLV0I0Qmp2YkFzVnRkaDJUeE5tT2gyUGRwdXlDOElIa3RWWm9rVmt0OFVWdkQwaTN1Sjd0bmhGMW9ibFJOSXdpWXVWZFlDU1pSTmg1V1lKdTNUZTlzQVl0dnNKYktsVE9EMGlvOEZybG9NSHdEcVZMZ29KeWppOU96N2JXSkFXM05VZGhlL1NhaGZlL1Vrb1JSc0JRKy9PMkNNYzVSTHpGYkVTd1EvbXNrZkFNaDk2S000OVRKdVhycnE5TS95aWZvT3FsOWZ3ZFVZYWwyV0RVTjBYVWdzanBoRU91OWFmalJQMnU4UEx3aXcvd0JjQzJkVU5rNENPRmVWZlBJaGlSRHhmNEE1Ump2dkpaQ2dhaEFmTXFxVzZZaGt2aDR3eEw5SCtEcTdSV2tzMmtYRW5DQVVpTWRCK3Z4aVBzVDd1U1Eyc05vRmlzU3g4aTRaRXJZaHZlaXI1M3NZMTVLRW1EQklPeGh4NkcrQnBKOGNwMlVLTjV3enY3cGpWb0ZVUUxLU3RsdDAybUVHMGYvdFgwbEJSTU9YNDFJZkpsaWVtL0RKVXVVdk1hY05aL3QwYmJKUnhhS3pCd1Zja0tGclhYelhOUFJhaGVsMWFmWEZHaHhCaFNoT2RJOGFXWVN2dERyZVdYbVNnTHdrT1R2SkppdmNrWXMrem05T3BqNCt3YXc3WC9CbzJ3V084Y2t1Y2h3U0VmQ2dpMGtnbDdOVFZlWlR3Tlo5N0hrRWo1T1lLcnBEU3NXaDNxMXZOb0FnTDVGYkdFbUlhei9TV1FMWW5hdjl0T1VJQmlITHVhczhVREduTVdNQ24yYkRCVzRzOFMzYzVOaHRNaXdyMnNkVEVvTjVzUnIvM3hEOTNFRTVoclFxSHJMRjR1WjFTNTVWYTljQW1xbjFQWW1VN2tBek80MndnUGd1WjNRSG5QOExxVWdyUDIrK0YrMG82Y24xZ000S3JBMXovZ2VkTmxNSGZiQnpMd2w1WVhYc0ZVTENIYXVEc1FyNFBMWjRRUVJ2b2ljclh5aEJSS2x2bzJ6Nkh5S01kUlNBM3AyVi9abFBFUkxpRVVDeGdqR1hyNC9PODJ4by9MZURLS2NZZGZMdXcwWGFHWDJSS01HQk5Yam9UYVI5K1hReEtpSzlLQWNVUmRVUXk5UjFWaXJaTGNDR0VRVXgydkhKUFNVWEhEMDdFQTBua0dTUE1EVDNHNmJPTjV6cEY5T2lDc2tUUDJGbml3ekljaFVUanRtbW1zUFdSV3JEemhxOHRYb0wzTWJIU2w0TUxTVm93YnVESnRDNnd3Vzcyb1hMQVNkUDJ6L053VTZxU2JaSnJYUDJ6a1IxaE1QNk80RW5qaVdWRUJ5aFpEb3VyQlMwemczNS85WEJsTkh6d09EV3dtb09ocXNlNGcwQmtORE5rQkdQZmhGSGl0WXlMZFI0MWQvMDR1Tnlsd0xnU2p1blB1RFJPTDBxSVlxaUNlNXJyMjBNd3pVbGVqNkhrK1FVVXlRSXJFbmNhMi9nM3hjRU9Ed0RQT2FjaEd2VEtERGdyNDFFODJ5RHdRQkk5aElCV25hVkVKQzNUS0ZwOXBOd1d5aUhxOEgxSm50OWNibGtqMEFwSXRXbUZkSkpHYXFMMDVSb2hUcTdPT1Bka1kwZ094bU81cDRxWTA4TmhxTVFIMmRMbVhTQ2h3VlpLRUMrcW5GVEJ0U0p3L1N3Y2V0K3Fvam5BS1BGRnJ6L09ZeVYyRis3YjhOOXlzOHdQWGZ6Z3g5aGlZZ0sxc05UZnlmcVp2YTcvV3FDajdIdWRqM3RUK2pOamlJQ0xTR0ZKMnJkN3Jabk1HcU9aNE9vaVdzN3p5RW1TNVgrSS9BMEdreThiZXhmNCtyTEwzZmNMdUtZOXdGdDNwc1dGQWsyUjhYZjc5RlFBZ2dZT2RSRWhFR3pIWXRiNXh0Q05DSzB6YW1VMlhXNVNIMnRJem1RemR6VDBybm15ek5sdk4yTGlHTkZzbGNuYUxHOXpWQjE5L09WdGFqY01VWlU4MWJZTitlcTloeDFoVTV2SzQ4ZWdzbUZNL01jUzJZSnR5K1lrV2F4Ymk4dWVsOTJ4c1pjL1NlbTdHaG1jdHdVT3VZcVpaVGFDT25WUVJoU3lGakVBNnNDRi9BVitkZGFBK2E2YVdnZDB1MEF0TE5kdFdYdlBPSmROa1Uva3hwNHJGMGp4TzYwcnQvUTBsaDYyc283TDMwS3JBeXM2RnYzUnF2SlFObFhaeHhYOHpaQUVnODg2RzFnbXF5cTg5YStveWNtMFZFczc2eHFENDMraEhiaVQxM3ZnWitob01pTVV3b0M5MDZFWTR5YlBhdkhabDhwa3p1L0t5VndSOWk2NXhHTGY1RXQ1TnVTbHMzektRdUd6MHBscnk2OFZSbWxhRE81MVUzL3FQNkUzbnhISjFvTERvZnhMczVYcGhCR3N5ZTgrVXFpRFpETVZZSmdBaFArNU0xVTA4QmdWZTdJWE9lNEI3MjZoWFBrR0FnaEQ2dFRaWkZtZHlMKzBMelpFRVpLNmVGQXkyeHF5cExIOGcvMmZsajFYZ0k5ZlVsblU2Tnc3eTByaHpMYTFGTzMyM1NINytJOG9PeVhxOXV6amVSeDByZ0h6Z3p4bGhSQzAzcE9hU1M3Zy9WWGphUHZnM0cvUzlRam42QTVyZmd5TnpZY3NUcGFqd2FoZlJXR0RqMDAwTTU3andyZjRNYnpuZnFMNENSeDdOcWVwalQ2d0trSUVRM2N3Z3ZPZ0VtRkJjZnMrQ0RxZEdYanZGRlJnemYvRnBXa1k4RDU3aUZxTWR4QitNUmEvVGtJZTRrclRmNm9sdEtyNkxtMzgvK0syV3hmQ0xNLzZqQUZjZWUxUEI0WHF0dGE5Rm9ZVDlScDBZRnhESnVwM041VU9sVnF3Tm13cHVFRDhERHVmRzU1R3haa2lHUms5Q2VPbVFXUE1Qc0RKemhsQ202MTNEVTQ5UndqRUp3YW5Na0N0VlBYTVlGdG1IMzdMR2QzQmYwRW1XSStXY2tvSmZqNWFsQ0VOK0xMYTRJQlN5U2h1b1M0MTl4Ykc3UVRYSml2TjhpelFqTmJPaXZ5NitjSzVOSzFqUEJvWVBUQmwyb2xIMVJKekJwQTc3MG5yUEdNY1RpRmMwTGRYcDlXcll4djlncitabGJpVElSa05JakY0aThrZ081Y0J6ZEdqaFRqaHdCMmVBUVNKc1Z6L0p6NG4wZlFIc0xWaGZyNUh4ZkpXalArMHVxQ3BGU3JScVByeFRaenBDSGN3SzdndVFENnlWWFZpQlpyV0VmMVpHdTJ4eDlRaUo3NlNFbnltZUNqU2VkV0xWWm8zQ2Zzb09uQmhPL1NGeUovVzVFZG1UMnhVd1RtZkRFSmNSNFdOREhTTHRaeHRJcng1U0ZqbEFZQnZscU56OU54Uzk0NkhYbE9UcVI2Q1pSZ2ttczlkcTNDRFQ5alA1NFBrRW9XeERsd0ZDbDlHaU13WElWWXEzR08rajNxRHFCLzUxb3NaaGVLcDZOMmFUNnRUdHVxWGRkT3ptR2gzRmdta01SdEx3Q2FSVmFDYWlrVUlxVzBTcDBlbnNDcmYwbEhMa3lscU5hcnV4b1p0QjJ1bzV5TkxPa1lvQklBR1lUdERrK3lqL2g4ZW9nQVo4SzUvdXdXczc4M2grL2hDeUdHajVIUkxQNmorVDFkOTVuU2NyZERnQk5jdStrenBZRzhGMnJBWHFzSFkycVpIY05MMEtDcU55Z0IvQ3RjV0ozL0VLaWFic3FQOStzZURyRUVJU1NOSVBidS9NZk42VFFuS08xbFpkZEZDbXhQZXgxVW5mMGpGd1huZXJsRzhUUllTZ21FWHR0LzdNbUVjY2ZuNmtZNkdKaWtMTzRsSzBqRWY2UWIwaUd6SkVaZEF6YWZETG5NeXB0dkhBMG9rUlhyRmk3WStkU25KU1N4V29RZzRYWHZ0eVcvTUFvUTUvZjQyZWh3dGtZQmVlOGtUdnh0R3lOckFMR3laK3ZMREYzRm95VzhFMnhldWRrb3ZXSld6WldMck9KVzM5TStiWW9GTHlQamVTSzJNbUwzaXZmekJodEVSdHFsNVdXMnJYWWhOQlNWS1dxZVBVdThhazZaYkdKdmxqNmVHeHBseUpDVXRtOG1LTzJmZG9KZnMyUzdDbHhQVGQzL28yaHhEak8vbmFZTWN6L3JZeDJQMk9DK0txWURUNGw4MTg2c0ZxWWdoSDNxZFltaVpzU0V6aGliOXcvSDJjSWsyUHJEY21OdUJxV0xiUVgzem56a2ZHdXk4cXg2TkcyU3BkdUxMdGdkeUc1WXI2NUZLZ3lINE5weDVhejJ6MkN4RWp1ZVlndDQ0UStOTDBnK0s2Z2Vkc0ppYUZWYWRYd2RST0JvRHlwc0dPRFNIaHhxc2R2WVVnL3BDcWlPMm12RnMzUks4azlmRHpiRWgvZThBd0dqTm5RTG53ZlhZZFRQRWVNZDU2ZXZzZGREb3hkR0YwUExKNXNBR2R0QlBSQVFBVFVjNlZPV0NBTENHa0JQYzlFTnlTbGxVbmNJMCszZjhzK05hdlJSVTRtOUpUbVVKQlF3bnBaaDZsa2w2TVVEL2k1aFdYWHBndUxBaXNzUmUxM2ltSzJPZkx5Rmh6WGgyKzFjb1Ezd3BMWnRzaGh1dGpEd2cvS1JNNkNnUDVsUkxQcUpIT3ZSOGFnRGJFcU0vNmRFVTU2cVk1V2h5ZXNwMUdWYnZOTVlmM25TOFUzSGg5T2o5THNqNDhKNmpMRnk0QXAveXhncXkwSHhtL2VHMXNFRllFRk5nakM2b0JWbXJKU0ZCSjBVM1dOand5UmdTUEx4R3V4enZPeG1rditiV2lZK0xGb3JRQkF2cUg3ZFFsVlFiQzQyM0Y2eUhzSDJ5VmpoRFdNMWxjUEY0VkFuanJKd0d1QWhHZGh5d2JXN1dHQTVoWm9zZG4wMjVzV3VtbmIrQlBMbE5mNk53OHFnbGNaYVlUeTd2NWlUejlNVDl5RUNoVDAwYlFiSkpHVDg5emp0cG1odU1MT2dzUU1QalVURkJSdTgrWk5QVENGd05IdVROc2VVdFhYWHhWZmc1V3VqL3pEMFpzYzJJb2xuTS9VaGJuUm1vaHRaZnJjUVJNUkt1MmJHckFFTWJYcmx4SWppMk16YktncGxvMUJjeTB3ZE1qZkY1UFNRTGgwQjVlb1FPYzk4dUZoWWJXcm9vM3Vkd0RONGt0WkoxakJDSW4vMW1GSm1tdFhyNEtFaG9SQktJUk9hdHgxOExmVEppaFBzWHRzSTd2aEZqOWFMYW1PSzByb2ZXbXlrYmM3ME5ESTBjcFpFeUlVMENxT2pnQ1JTNmp0eGNrcWlCVkxzTEU5b3RlYzltcE5EZTJlL0R0Y2hrVzdyWXZFangybUVxWXJ3OXN1Y2lWdmUrbStGWVZxaTBJZEdZa3k4VVpnWHVXUXAyd2ExNldjeW1IVUxjTXRaSG9nSnM4YzRyZFN2TzhNajJIZHNuQ2JvcG0rSCtyN3hoMnVGakNiVWtENXd0L2RlZWQyaG5NZlQ0ZHo3NXRXS3RSUUMwSzJxWlBMUFhCSU5SOWlLdVRTbGZCbEJZaE85bGFTK0E4S1hKOGNIRFhGKzlzem1ER0ROalY2VllLRUpEalJ3b0xhTFlGM1Bsd1VXRUVYNmtBVEg4aHBEZ3RLcVR5VFpmQ2RmcnFOYjVoc2lLLzBuMkxJMVN1MncyTGhkTG5zcVpJcTVYZUxGTzhXMTMxUnkyR0RPWFlUcnhZS2UrU1hDSzBPRzVsbTNDUEIrcWhoeDhmbFgweXl4cDQ5TDU5Tm12SXU1enJEZ2ZNek1VcUliUEpiZjQrd2ZHOTRZcGpYTi8wK1AwdEErMWlDQ042Z2xTSWJleWRrTnhZc0pvMFpxWjFuSVFSYjNIZURvU204S21FZGNkemt2cWdyTnVVUzlhb000TWliVk9Eek9KVmJsdUZ4TThRS1RiSDY4Y1hMR1NXM1ZpOUxrTjZXcW1BaWsvSy80S1M5bC8yVHpsbmJMa3hodWtUcUZXRDM2Wm4wQ0dyRHJNSzlidTc5M1VreUk0dHhKWVZBUVM3S1pmSWIwZ3dnbzYwWWtQZ0RyV0ZCWktPdW44U1VUMDJ2RmtGcVdlSTRjMW81M0RDenBWemcrS1BUNUhnMEZ4T1diZGVQNmc4Vll2K0VSNkF4L1JreG4zblBnaEFkUGtHeExDTUx6aytGdjlLc1dFZlhPb3djcFZKUHIrVUd4dHFNb2hGaXpEMmNac3FpYkZjTVdyQWp2WjE0bjNsOEUzQk5ZKzN2UVovWStZem5kRFVNckpxOTJhOWRWMkZLb2J5UEl6Yk1VUDZBR25zYVYwWlRxMTVNUmd5NVFtSHhjSmIwQ0R2RFg4OU1mcFBpMVFDK3RBRnRmdFVZdkVKd21TM29MYWY0dnVoVVYrai9SQm9aZnF4QU9KYWpGRWlSdGk1dW5pS0NpcUJoRHI4QktPd2hTVWwvd3N1S2ZZaVdQdkY5UTNCRkIxY1Y3cTI2dVlPWVcxUjhta3lNb0dMUGY4MUE2RlNJR0VTU3QrbTdTQVRsemlwNndGd0c0RzgydTFmUkxRNnBIcjFISnFKTkpKbFN3ZGxKeHNrckwvL1VZcmVwK0hnWThTYXVocGNBZlJQeFNmZkRLM2JTQjlaaXJubDYwUFY5VGZyMVFDRzA5TnFqWjJKR0gxckt5c2lEVE1oc2Z2S0VCRGRtaWIwOHJEekdoQktIR1NEQnI1NFlMM2cvQkdXcUVBRlo5UGd2TTJQUzdsbmJDcVdYQnh3blo4S1ZaN3lyT05lMUZPeWQ2R0h4ekRJMGc3SnlKcjdCMlN3dXVDeXh6dkJSMWU5aENGTm00dGU3bWY1WmFlZWJmNzFma0VpOUtnK2NkU1JaaHk0eWhsRFd6dGcycG1mMW02b1JEL3pKNytobndxU2prOXlUQitZTDJDbDBFNjRIUTRVZ1c4YkNiNzBJNWpWVi9Denk3SHNRUndFOHJSNGhlNisxZnIyNE9DdFhXMkFXNnJKZnE0NGpEVnFlL2x6cjdzZFFGNENLaVRuT1lvMjd2RGpFUXNWUUs3bGtocUM2b2s2cFd1TzlYWEV5VXZ2NWFLa1ZLME9tTTkzMEhyUExKWWdVbnJQZkFZMnJWRkRkeFZDaDcwa3JYcW1SeTFYLzMycStuN2dZb1VvMVlRVGtHSlNPZ1pXbXFjZllqTE42dXhwYVI3VU9zQ3dkRkVmVnZNNzZ1aG9DS0VPL3dBMUE3YjJZZlFTTkJWYkpFeWltSDd3V3NySkVES0FDZ3N4ci9mTHNMVWJkM1BrQmZ1TGIxMFBPUDlnR1QxWUtNR2ZjdDFJbFR4a0NLUDR1RzBwamxyTTNsUDlxcjE1UUR5THlnTXlVOFBlY1lmTmExVU5OZXp0REduSUZMRFJremZLbVlramFkZzRpbklPUTRSdThCYWJRZTVPQzQvVUtOcGlheEhsSW82S29FeFRDcEtyNkUrZEJtczdlZ3dWNmErQ3lCanFvMmFuMlRyekJBSExMMUtjc05HMzRHWDB3OFQ5c014RFhNZUFnTkdsbG4zOXByYUhlNllvVWhLVFArb0hZRXEwdmV3WWZRZVhLdmRlMFBHd0xNa3RFbkVab2lxcmg0SVF2VDRxRnNaL0RicTVub1lNeUNSeDMwdm1kbm40andWRmplbklOY21yNFY3U0Jtb3ZNZm5haGJSZU1qekUyUFMrd2lIa1BGUGhQdjg4ODJkNlBwUWkvZ2gzK3Fid1c3am10YTlrYVo0TXB6eEUweDFMdnNvdDlTRjl6VTIwSCtySGpIcDljdEcrZ2MxaFdwWFloSDNGWGthUmhRdXpxV201RWQ5YitodmtXUFBUeFh3YjF5U1dlSGptZytqRytSRzhTNzVTM0h0SGJSczFwMmRONlF4Zy9qU3B3RUdvb2Qwd3hKREFONy9adkxUSm4rdXRmUGV1RzNza29YVFFCd1R0ODhJWnpDVTVTMkZnMTMxMmJCbUt5Ui9uMkhLK2QrREljdzlCMjQxcmh0TG1wNE10aWhCcVhSQ010VWtNV1hiaFg5bUxvcUhSY1dNN1ZrRkthQ2VrRVEvYWZJcFFtK0dxQ3hSeUwrQVBENUZMWUxEWjF1bkN2bzhnMlYzbHBwRWdNdjVza2N3VVJRbCtXcXpteUpWV0d5d29GVFEyUzkwWjMxd0pSK2orR29uU3NseTV4Q2FSTk1saU9VcDJPU0RXaXpyd1pUVXpRNE4zWjVhTmFsVkdkQi90Y0NjZi9mbytabkVZZzlQcFFRbm1nUlRpZEtEbVZOU3cxSGJwOWx4MmNaY01Jako3b0srRk8vS1p0OXZpRW1oTHdEeGtNR1d4a05xOS93OEhadm1OblpNZS9WSm9KWWFaM3I1TjJUdDY2Z1g4QXJWNXhxTzdyYTBINFhrQWYzZ2ptbHdKbzUxajZoM1BIZVl4ZTBiNUt5K2hvYWpCSVBYaFdjelhnc2tBZmtGQ0NIVi8yYWJ1OE1BSUdrdmFnMU9kd3hVazgzUTVGd2FLZVlka0ljdUJZSTNtRDZoWXhsaGNFYUJDcXBkL2FCdDFzNnlhQ3plckV3dVVvc2FaR2Q2ekdvZ0dseW9XWDZqK0dUd2xTK2E2alFwanZvNFZyeEJmTVpRL2RMdzhXSmgyRjE2Q3J5YWMwK3RBdGNZNEorTVlPY3o0ME51emVOeVhDZUVuSC9aaUdlTzE1NVk5V3RrSExsZHUzamc0TmpkclRoaHpXZUJMRWdZbVJTNFlSanhjZ0EvRVZtUUc4ZFRvSmhDaldjTExQTEdJcTZHN2Q5M055azg4VE5NV1BhSmlpK2NaNHVYamVPVmUzRXJQMEJvL3N5bmZ2UnZkaXFNNEhBVGxrSTFGZWpXVkNNeVJQSm9TaUp0Rjk1QzhGQWR2UXNWazB1U3R5MFNvSU5RRHVtYkxoTUFsZTVNbHdQaVIxNkdCOXJXelk5Y01lWlNkT0VZdHNQVzJFa3VoVkxqU2g1ZmRTajAveGNSVTdjTEw4cmRyeEpZZHYvWTEwVWYxYWZxNXBHUkQyb2I3TSt2ZmtHU2JweitVVEp6ZGp6OUNLTktYY3hHaTFjOHFneEVXTXQyY0dNcVVtUnZQYUxiK3NlTlVXMVpzalFxRHFocXlBMW9QRFBmcWQ5SDVQQkZPdnR5Y0dHckVsUkxQUFp0VGRDYWZpSHc0VXlnZlFpS21HcTJTem8vNnhRejFvVDkvb0NRWFZzenVsWDd5SE92bWtLd251RG5WcVExV2dEeFV4Q2puRHJkMnVSdUpmVTc3dlJXQTQwa24rWXRPOWhhb3BWKzc5TDNoV09MbUszYmJrTmRwZHQxTFhNQkxYczRFWG4wSXdwNVNGZWNtRnAwWFhRa2lzSUFPKzZEZzB1VFRXbDFySE1EL2NFSW81WEsxdlI0amRRNExrc1lOeFhVaDd4Z21wQVpJYXhHODNqUkFSbHRsa3VhK1ZjdStaQ3Z1Q3NTZ2g4YUZQSDB4RFJaTFp3b0UxbmJSVFFBbEZvN01mdTJZV2V5d1hEd3E2dlpBZno3bXZqVmdQNGdhVlRjU3Z0Y0xQZFRHWFUzQkJ5SS9Ibi9nVFpUKzN3M0ZPVmw5WWtzamVXYmlCSmp4QncrS1hMaXBjNllwbC9GbGl5KzlML0hKVUpZOHRrNlJqZjRhaE80b3BPMktsWFNBd3hSWTNLTGloRnQ4NFp4Wml2RVlOT2hHTzI0UTJnR1ZPeWl1alNCTE9GM05hQ2xMYVZvOGQ0aUVGVjh4WE5PZ3YxYlFxS2hFcjZZdmdpRG1WcUlkUU96QVlCSTloZ0VKM3czV0RrNnBmVXlKTDJqSEt0NHhaMHBTbGFxeDFteVN5OWI5Q2hydFZuMlQ1U3pXa3Z5MXh3YmErTjV2Y3llK1ZSWG42bk14dUVYd2tOMk9kcll3QWtna0RiNEFhdHZMMUQrOU1yQWFWNUsyeVd4ek9xZ0Yza0tpandBbms1M1hrWGNuT3pzMW1zZndvemF6MzJteHhlRkwrOGlxL1dkSzV6ZGE5RTZxR0xBL0ZadnJ6ZzUwcUxYRmU5bW9wRys4N3J4ZnpLOEMzMktqbkg1OG5acUxObGUxMThJTHM3bGpKU3JYZGZVK2RHN1hnWlE3YUVoRm5kZmJ0K1VjeGpneXFKcGpENzM2KzY2T1pTOU5Rd1I1VDJqdi9KNDVocnZWRGl0YzNnWXJhVldaeXZzeDV1NHR4aHVUZzFiU1oyN21QYlppakNUSWhIWGp5T3p0NFZRc1hXVzNrSEdPb09hajI0cWZjTmRGdE03VVNGeUNUNGdFcjE2UG5DWTdhZ290cGdvWXdIVXN5VDFWWXA2KzJma25kRmMxdlg5Q2d1TU1zNzVzN2JneUoxbkcxRFZ3Tk1sNk1DZC93NFdxRVM1czRTelBrb1pXN2g4RVNMeDEwZWF1TG1zMGJYTURYZFZ4SEhZLzZ5MWxzcDVJVEZGTnBuRlV2OGJLVVBUNGhtclhlaWdaQVRmc1YyL0kvUVd5OTFudkZvKzdHRk9Oc2c5ZVd2eHoxNlUvRG1lNjJ1MEhudURuRWpwTjNhbDJMNlpuclV0VElsRkIxRUoyV0tIcmFXQUdLZTYrb2VJa0VWeDE4NWhBZHV1VnNya053MUY3TXEzdmtSVTB0VXE1SjZ6MUdaQ2RVaHNSUkNBbEM3UEc3UHU0K0prUnNCZDhLTDJKK1pDc0FqTGN2eVVnTjJiS3dYeUpFOE1BYmN6WVpKVC9mOEpTRGFHM3R4YThualAvU25aRWxNNFptd3dGSkhneEhaMkszSHo2R2RCeEIxYzl1QkczOGJwdFRHblBjRnN4L09kdDdIU01QTVhOL01OWG5PRStaNnhzdTg0QjM1ZVBiOWhYc3pZMjhvZ3puVmJoL296Q2tUWDIzeHJCQitob0wrektPVGZrV1BoMG1qbUhKbTF2R3JyZmFoaTQveGk0Q2JzL0NTSEdTYlh4ZTM3NVlKZmFZOUpOS2NCSURPRmhxWjdzR2hNS2taR3dIRXk5UUZuT0dpVjU0c2V4U3NRUyttTWVFWWZEWmtIL1l0eG9mTzFub3p2T0h0c2ZvOEdDaTdLb200TDNmYTBwTjJGTzl6dlRYVDMyakZCZDdNWTJkK2l1dWVGdldFMTg0bEJFSURSOVd4RnNxbVpqc1hNV3JEQ0NZcmtwUVluQXprRzEyZWdBV3UwdGh0czRkZVA3MCtJQjEyQ1ZkYjIweUx3bkppbHY4bUhwcVVBa2pGUWsxdnc0QlFJS2QyRkdKUHlsVXMxM21KK2p5aFZ5LzJDVERGUS9ieHBHelFTektDTGhmclpUVUpPRDd6dnhBaklHZnZqMmpvRFB0ZTFyVkVTZ2dkVmlFK2l3NDVCT0NTMDVuYnkyell1VTFvZ1pwdHFZbXlMaVgzVUpKR0NkNFdtcFJoNzRWNSt3ekF3Q3FsTHZhZ2x6T1ZXSXh3Z3FENmFlNk4xMnpzQ0JyMkVHckltVUtJbmJCdUhueEFlcklIcTRLS2F0M080UkZWN1ZFVFZTQjhzQm9qNXBtN3FPQ1VQaVJueUJUeHNSM1BpWXV6OXE0bVFkeWUvTEVrU0VQNC96blVrR2kyNnlNNzdIdW5oSk1OQmpwdlRjbUMwcXN2bVJzejRmQU5oMU9qYldNQ1l3Yzh5US9DWDJIZDNtSFRPcTBBam1UN1JkRHo2TURXVDJ3c0gybGRuTEl4emxTZU04ODdVZ3VJL2ZVTHg5TUl3dEkvWmpvUmZLSVJLbHJGaG1wOU5PUnQ4SXowYVJBYmxhNTRyaVNzTGx1TnkzcTc4dFFvSDYvWjlFR0lOdExZQm1KYUl2M0Viak1waG1ETld6RjRLUHFCNlFqOCtkcHVTTXVOd0VabnVwdFU3RHR2dkhRaVRuY0lzMyt2cUFIbjljY3BpWGRjTnVjRGc3dktLS3pPSUFlM0FHVFhVbS8wMVluTVhXZHNVMzZaYno4eU9TOXJMNEhEK0FzNk5BWXZHYUN2WnJ2akZPczFXZzRSVWsvMEFjWjhMWlV0TXN1cHI2djdWbk9icURmOERMbG1QdS90SDYxTlpKWXlVT2hrRlpycmNRSm5sOU5LL09UeDdmZkZvRFhSeE5FakVYSXlVUXYxcUtRSXRMUm1RK0VvTjRacHhUb1pFTmV0ZS9NU1RYOENMU3JRQ1JUQ2xPakVNMzF6NUw2V2RGa0tLV3lMeVplWHhKOUVySnRjZlQwSHNIZ3BpTnRoRFNySjB2dU9hZEJGd2xjWTNyS0VYOUk1ZHlkT3g4VFNxc0hRQ1dPYitjZVFzMlczMDUwQnNDbFBTU3R1Q2hTaXVDVXM0emZkaHgvMnRVWWZUVUtSNnlUTHNrcmgxaFYvQ1RxaVBraVh1aW5KS0MwTE1tWTlxS01KaXo1TjBPSHNVZGdkVXNuekhwWXFUaVVwd09rQTJNb3Eza1RnYjNDQnhhSGVJNXVQYm1ZVzVDTkx4VExxckFHOW5qaEkwTTh3ZTlZZ3VXQUFUeDBhSFBMb3BVaHdMczcxZHVxYzl4MmdpMUJVMzBzOHQ3NG9aSjFSNHNlOStLRUNhWllBR1ZkZXBUNTlVSGRwREoyaHNLVkNQZEFNYjRCTEJFRFlXakVwT0k3QWUwWEoydDZ3TGh0aGN0MWUrSG5GSHlQSjZIMVY5VTBkb09UL3BEQ1htajV4OFVZaExTMTVzWjM1YUFZZWtTdDAwK0hUMzdNL1Y2aFdpZ1A3M1EvVTVWbGZpYUhzQUxlSmtyQXJKbXdSMTlWNklVNWdtVzI4SmhDVzBPeEtBVnJ3Z2dIa09JSHVIWnRjcSt4NWM0VU1uNFBYQXhsL0h4WXowY3ZLTGtlRGZNeWQySUlVS1k1MkdEYTBLa1BxN1JwQ0NEQlJJbDVrdSs0azl0UEZCSER6UzdHQjFKUEVtMmZWcnpRejczd3hwRVAyY3BSQ0lyYjZOYVdsZUtzMkg5M2FyWTdNMTBUU1JwMVhXMDVtZU4xM3pLaHlNbzY0K0trWUdHNVN0OWxPbHkrcUJoQUtkK2s4VTM3TlVzZnRYcENDU2UyNVVyMFF3ZHk2TDBuNFZOMXI4M2FZU244dzFrSEszL0pDSDZFaWdGbjFlVjRuc0FVWDZoQkJJd3Myc0l1SjJMTE9tWkFjTUU4eVBvdFpqSWIyWXJRalhva1djMXgwSTVYVWRQMGNXVTdXUnN6WnZLQnVUVTF0Smc0alBhZHUxYkRIMTJhdHZwd3BnUTY1SUpHRkxwMHhLbW9sSVRzZGs0TUZ3dUZIRXJMNmN0SE5GaFBrcmZHMzhoakk4Tkd3YmQrV1NiLzBqMGp5VVczR2htKzJXdTVDWVFaN3BhSkI0Y3FoaVEwK1BoM3VncDcrbStZKzFjUTd4aGlrS2p3SlY4TGVDYXdYQ2p2RjZrYVYrNzlXQ21uWVZjSG5SZXlzU3VkQTM4RkdZWFpvT055NTZueTVzcUNxbktRN1VnbGFXUjAweUk2VmY4MTBhVW50RHhJbll3dU5RQUpNbXczd1hYeVprTWMybjdpR1lTUDZxc2Rzak1PdkpJa2RXZHlvUURoa294UWRLazZMWUp5clo3ZkNEQk12RFlVc1FjdjhOT0l1bWRNaEdFVlVHUmptb3ZqMG5FQWdjbHJaa3ZrMldIQ1g3OTErd2Zrc0h4NUJnYjlPYWgzMkk4ZnUxd1BmT3FWNU4xRkkvUU1KSWFhbWMrbHJla2RMelF5RUFEYW5jczBOZXFQc2pLMmx2aFhMdktlTzJLN2JQQzFlb3dxTW1mSmFNcTNoZWhmOG5TWjI4Vm1FbklQN1BFNldqRUhxWEYxaU01SnhFaThlc0VmVEdLQ3RmdjJ3SnhPNEdYT3k4WVJDTjFqcXg1dDkvRXNzV1gzZWpMS2tqU1JFZDg2c0xyR0RiSXlIM0Q5b2NzN2Q0eVB5c0lodXc2Y0xrWjFFd1VMdjhveWpJbHJCSFo2b2YwazlPMjdsKzlsMjR5aThwUFdwRzl0QTRQb2tYSWRuc1VnL1JqWDU3dncveFNHdXRET1dWUVQyY0M5VWp1SW5Sd3RKcjhhNGJhTG8xVDNTL28vaFdHcUVTOWxpbXVVWERjQ3JtU2FIL2EwZy8zM3FhMW5HdG1EUzExb2lsM2MxNUFQTU9pVkExeXY2S2hrQjhSU2hxZkRnMUhTUi9lRldWcVFMRldwMDhYNjlIQjRQUFlhQjI4bGFpMkJabU9sUUtrWVYrZVZsOUEzSVIvNWw2SUtmNHBvdVVudGxjd0FGQ1l0VHMwMzduVnIxeUh6R2E2N2Zaci9Qa0FmekMvY3k3VjVCaXpzbVhMVHQ5K0hTRWc4ZWk2aUNpVVVFKzdyWWg2b1hOL0ZyWERpS0FGK0pXNFFWN21NT0NSOUt3QVZYeHNBZ0ZJcERLdGRhV3l3VXFvQ3RJMWh5ZStiZWVhU0ZsNzVtbUxONDNaTWI3QWpvaW5DZ05GUkppRVZxRG54ZmREWUlCU2VXb2Fpek52d0JGQVRCeEhRV1MzUmNmTHhFdGpVd3FHNTNQL2R6KzJCbEVBaDhSVWhmYkNvakxtS1k1dFQ2ejV1blZrbUdjMWlNWUdnMHRRQk03Y00wai9Bcm4vQzh6M3NmaGFYazlOcTlvSVVvVUFRelJVTDdSQjJBek9Zb25CbWtDYTdhdFdab28zanc2cWhtdXNPZk1RTGx2eG9sbkttN2plMGNtOVoyNXlTV0oweGh1N3dzMjA3eElpNlVta014NEd0NVRmTkRhV21xUzErNXJyRlpCSmYvTjhydjY5anZDYmNwMTZXL1dVeTVRK2ZoelNSUnpiOTNIa1NiNkdCVmVCd0ZkU25jZy84SEVKTTQ4VXdFdDJMMWIrS1VQemxCb3hlL0RENThtY3crTkpMRFJNRGE1aWJqMjNQY2tMN0NyTVdOK0x0ZThaUTM3aE5LU1NPMGl5Yjl3eW8vdEpudkRCRjgzbWJnUFVkbXF3SUtLemg3WjE3QmdyTU90QjA3MHB0cjVsQm5nNlB3cE42WTZWcmN0OWxPV2wyRGlTZDBMT2lsRGgwTkdlYjRWZXIrQ24yeHU0WCt6aEs0VDRuMUlSVk92R2Jxa0tUZ3JaL1ZUWlFob0NMMUNINDJyUE03TWFVUmxRdG41L09HY0J4SHdFOXczQVUzOGRrYTZpc2tqMUlQeFFIMjR3Rkp4U0NyQ3BrY1JQaDlpVXlBREZJV2RIVWZwMjEzMjNsSjkvdnF0Mm5pMmEvVGhRU3VZU1dmZy9SMUgxc3JGeC8wcmtqS09zYnN1RlM0bFRRZ3cwODErNlc3eTlWMWpDcUx6dTIwcHAwS0hiQ2d4M2JZcFlCOTBYMWZDSG03cytrTEEwTk9SQlNTaWNQRk43QWJIcURISnBhTmtWSWtDTjUrYzlQZGhyWDF0VmxlQjFOUmI2ZC9hcTBnaGh1TnVwRlpSQ3ZjaUZyc1l3V3hVeVJLWVRIWDBtUnUrdXlHZmxtVXllYjBRbklreXJuRUNHbTlOVlAxdkxESHVmY1FtL2VPY29BRGJyMkg0R1JrNDRZbU4wRThSWjBsbGlDTk85dURaclNIbHRTM3RRU2FDV3JQc2hyczlsYnU2M0lKb09xT00xK05uTytEYXpqYVRNVkhhanpCdHg3eGdrVjMyMThBcjRkQXkzZUZhRk4wNVd5YU5mNEZTd0l6Y3VaRlhFd3NhVjg2ZmpVeDA3K2QvTThFZW5lKzFQa2pxMjQvdm1EVVVlOUpKTEhsMmoydVNEbjhITjdHYzZ5UWlEOERpVlo3RmNtSmw1RFFObk80RVlDVmpEM0F6bytCdXJpM3hxKy9RL0NPYkdGVG5YNjFrOFIvY09QeElVd2FkalFrVUFGY0pqSDNna1Njekg4eDV6OHdkak10bGdyYnJ1c0o4UXZhY3B3cVloQ1Vhb0RzNGtjakFScjI3RUR2THNjYzMzMzQ3L2E2SktMc2xKa05ueG9UUElqQTg1Y1V3Z0hXMW9DaWtlQmFiRHZyOGtNZnZjcEJKRXF5bWRtdFkvUzRkaXUvYkVjKzRBbHVCdFJlZGdxaXlTTU1JWVVwdVBuS3BFcTRmWkxLU0IrdkozWkRNN0p5ckZiMHVtTTBpUWpPRnhzOEpnY2VseWJFeENoMEh1NHIranBmZjZsSCsybkhWdmVHRFFSUUN5bjBwQS9uVWhSOHhuTXpBWGdKRE9VT3c5TnRCVldVb2JQSlFmOWNUcE9kRW5hL1ZOMHJtZDV5Yy9nZlBUZlFJTjlNNXBIQTF3RDlGcFBuUGJTb0hhVjZrOTRmdlNqMTUxaXdlVERpTE1lQXQySS9iNkMvZElXdkVUemVGNWIxaU41c01acFNxOVJxRVhaQ21wMXd1L3lNYzU2M0piak5yOWVBVDBuR0lvWEZERUZPT2lwajNaM3d0Ukg5UEd6dHBVWG9iempvbmFSWGc0RjQzT0hwWWxGQTdLU0NPbTJpYjNKdWxMK1lMeTEvOHZKYkNvSXZIY3NsNWtrZkFqa0lzNkJ3aUZUSXdpMlYwMU5TWFRCWDJRbyt3UDBKRkQ1cTFYQ0ZWYUwyaUFGUS9FWkpSS2RwcnhNb1M5cFJXeUFHeVVHQlJxOHhsTXZ5WFA0ZTRXZXFYVTFESDUzTld4NmNiYm1MelVxUDVpbVZSU20wc3VPRmRlZ2ZnQnVORWJWYXNkMUl5ZDJvVXBXOXNBWlprbWt1NTRhUmZxQkNRUTlDZ0RyVE5FYUJ2WDlUYUk0WTNsdW42NlJMQnpvWnZhVzJWRzNDdlRqZGVOSDlmUjYwc25BcWc0YnRZSHpJcy84QmlKaEdJa3JmV0ZTdHZOUHlKNEhFbVRFeWNlSUlrQXVaOWlsZkJvL1dleDVHRFFkL0FGTXY4VjdTcUt3MjdnQWNYTmhpRzZ0ejhOK0Y3TG1CS24rM3BuTThKdy93TUxJQ1FCaWJ0Uk1KZ3gybXFpTlRWY0FPK3FSa3kxTUllNmlmQzljR2NXOWhncGtsOGduMHVGNjNKU01iUEJ1ZS9QZEdoN0VzaHAyOC9XTHRPUVFjOTdUUHh3L3ZiL0pVZmdDQ3JtS3ZMOTc5RVlrR1hoSW03RVAwaWtxS0UrZkRITTUxLzNkc0t5NndKdTFTdU9ubVRQK3hTOERPUTliRmlTN1J0aytpSWowRDh2dE1lZmYvajRUY1k2VUNtOGFOa1pVRFNtZ2NNTW9ldWI1VWM4T1V2ZGd2eFp2RGRIb1Y3aGY0V3VjVEY2V1pEZGUxMnhkc3FaUjE2WXdYcUEvRFAydzJJdXhaVE8zMExDV3N0QlhDQjdCUnVjZ0krZmd3YkpoRFZnV2F2cUxHTDZSUno4S3kvUlVrb1cxYWc4alplVW9WcVhLSUp3ZWRFb2I5VlNHR3RSTTc0aHFTaHRKT3dyUkRabVNlU2cwTTdoVUh6VlhHWTduVHlkZmdKaFI4eHozNHNMaVFLczEwc3E0Y1RsQVA2T1JtR1N1ZlF1N2g2a2dUYnF4aDU5YnptdmZsYmY2NHpkR1JjR1FrcVdVdnFLZUd6anYyYXVXRlRZRFFJSFFaWFlPRTJFeE9QUExZemZ6SCtnMlNMV3JCL2paQlA4SEN0ZWRUU0xjeDBqdkJsWU4xS0cwS25ndTN3eTE5QnRtSU5HOG1zaUV1QU9kVk9LZmkxV2dqRkpPekhaYUQ3eFZPS3Q4R3Z1YjZHN2U1bzZOeExpRVczT2hUQzFRQytZVGhWUGE1bGQ1SjhRNEVuRzF4YlNhL3RpYzZlR2p2cjk1aFZxNzRCZ3R1TFgvT3daQnJVeURITVhlWWlhL2ZJUDVyYWpmQSsrVm5BL3ZaeHl0VHU1WmIwaEtXQlorcE9NZkYvT25rdGs1eHoyL3pwYXAza1QrN0g3Q1dnMmxsa1ByRTBtRnhEZXJpUzNZekF3SWJsOFVjaFBnYVdGWWIzaFpUOVBTdnoreDRrb0hpTllGdWNTbk8yTHJZemFSRTd5c1NzWC9aTzJIMHVhcXI1eVdHcEdCUVIwckNkdTlSMXBtejhsNy95Z1FwRGFNeUU0b1hkL0hRZmhQaGVkcHJMSzYvbjNydWVtVnFNbm5mdkxrWHppNStDN3hnd0lKRVVSWkdKSGVxbWkzVFQrMnBaYkhLRjFqRlQ4ZjNiREhra2J4aWJ2WkdZd2VYVzNTZGVweG1hV2k0NGNlbFRHMzdGZWpSbCt4MzFZYnluOTZKY3R0cUdlZmdRejlVeHdlR0JtcGJvMXhSVExlejIxYWtCM3BIYjBSQVpOTWpsOUJid3laUU1YNklyL1psWnNaOVBQWnFuUTNvZGJmRFU4V3l4OTJQR2tHMno2Uk92NjVOWXF5bll6d25MSCtYZ1RNVHlKNllGS0FWakphczVxZmtJMDhZRVJCZHZUdkFkVmJUVDBkT2Vtb0lJR0xobXMxdTFCVXd2amwySEZ3ZlVjdmNtT0R1S3J5VzVrM2l3eEV5Z0d2QVNoc0psYmRxcXpxaWZCVW5TNmJqNGlFbVQ4Q2ovL0d1Sms1N1FuSnpxazE1L0V2Z1d4Ymt3TmlpSXFiWEdQa2RaOGlIQVlpYTJDUGtheDNYNy9TamdSenFNOFpxN1ByT3BkeEpWMjVzRzdKRXUrNExSUGRrbE9TaU95OS9saDZSc21sb0FHQnFpM21HTHY0QTlWcXRMUXVnWlpNa09aNExNZWhIbmVpYm8xZXZRZVRsY2w4T2J3ZVBrQ3R0bU1ZNC8wb1ZQUTc4dW9SblgzYnJhN3JObFRaUDhKakM2bHAzZFg3VGpDQVdKU3pXdGhndGx4MDQxRVphcGtkL3hleXpLK2YrWk8vVFJaQkhSVXkwR2QwZ05lMVN2Y1paSkI4aUJIdFNjVlRVckFKaXlSSC9uNmFyQzZsN21BSWc5REc4V0l4NnhMQ01vdGsyeldiNW1PNFNNUFlsYU80Qjh3Q3RzNjdJRVlMUnQxRGNCYTJzL3p3NEVDcm8zM1htRXB0T0dmTU5QRFNEUnZzRW91TzBuQXowdXNya3ZUd090Tm1aSHRYZmg2WmtWM3NVK0VFdTBZYklEQmNha0owMDJWQkVYRFpXM3FLSWRDZGJaQllLRHR3Y1dPWEVzMHIxYURERUJtdHExM1NtUjJYdUxsRWJETFdhR2NOVTFjNjZtQU4zOVBZRm1mZFphbzN0N3JmZ2c0TGVGRi9OTEd5blkrbU1FMEtydmlKT1dVY2ZnaFNLMVR0VE5XS3kvTEVqd0hTYVE4bVYxdmozRjhtQ29aRVJFNXd6Z241bnhkTXNJOVdoMlJYUmhpaTNCRjNTZEQxdUFueUJLTXJabTBJS2RhbzlqSHdtanJHdmM2QXR0TStBZmRLaDAvdEFRT3plM2p3eVBUMVJtMDhoQmRCbFpvMnhKQjNUZWdlV1IwUFVUSTJpZ1BIRTVCNVpKNUVKeDM5VFR2dXV5b3ZrelhGY1htajJDNVRrcU9VRmVCdEFncXVFcS90WWdUblZaZmtFSkMyM21wb2hEdkV0RmM4M3lCYmRlRzd5MHI4MTVVMjc4bG5ReDAwQkxWc2pEak1kc3U3UGZsRjQxek9NczVnVkVoUUp0KzZDTTc4U1hQbTM5ckhoTVdQM2RxVVBmT1FtNnFKaEN0S2Z2SGpKZzZxeWlodE9adHhIeGhGdk1Wa3Y3WFhsVTR5aXAyMnBNRE42clBOZzJxNDhsa0dGV1ZlM3RmeXlFR0RkM0p1MmZwaWJySFVSSE9FZ3BzVFoyZGdxWFh5U1RacVZHdXZ1c04xWm5ZUlZpSXQ1OEVJa0RLREZER0JhZElHR3I2MGd2OFVKeVpVTThvVFBPU3grNitRYkM3ZHJMU054cjRKVlRFNjNmVzVqY3F2N2d3VjZISkk0dEd5QUdBb3kzSm1vUVk5NkZlczdUdVNxdHlwR2FDMThPcm1EZDY4MVJ4U1JyK1A4d2UrQytKMlZLdnd3QmsrbVpkazJPM1BTMk04NkpYY3FzbDJBWHEySFlZOHc4dW1JL3FkOWZIcHRicVI5Qk0zN3VrWXB4NVRIcEMwZDBaaG9MN0J2eW5jUnAvNktoMlV4YlJXU1NacVlHUVdtUGZwL25kckJSSFRlbnZsbWRqdUZzamErY0RWSlprVDhxR1FReW9zNUs0MW1uN1dobllrL28rSVliTjFTbE9ObjJKaWJLZTdWOE5taldBaCt6YlNPRm5LQXNyMVEvUEJmWkxsdUhzanVvL2dWdldLV0M0N05wQUttYS9YS2NsSjQ0U2twbDhuVUJTcXVveTVQMTRjOFpkbmc4Wm1yZVVNRk1xclJXWXJKYlh6VlJISy9qTU01UjdwbWpRYkZCa0c2UDBrK2hqd0JHOUlNZzExNkFmb0p3Skgxdkc3MXBsYWcrekZnZXl0d2tEWW5kd29MeERyZE5KejV5R2hYZ0hwU2o2THF3RUllbVUrNlJkT09iOTh5RHhUZkZJajZ4WUdsZk9aeU83ZlZnU3BDWnVYczFCRUh1bXpqY3ZmcW1wQnBENmRVMUF4eUkzbDdXNVVhQXd0cmFHSWU0V0QwTm5uNk9IYlUwV3Nmcm5pdlZzeEVIUk9wMTJPbSt1OUIra3kzcXg4WVNkbUZFYTlPc3Nkemx3cjlGTTQ4dkM1WjdSRCtqNmVsczJuS1N1UVpWbjNldWNvUDNSV0V3R3piVHc0Z056aVdmRWM5cGZkL3c5aUdsQm1VZWlRSGhONGJSdklQNWx1c2lpTmVveW9ldjhoU1FFSmNHcFpEeFBPOWFyM3lKNXQva0NXeGNLbDl2N2Q4MDA1WnpNR09uT3UvR1o2YTR4d3R3Y1l4WlkvMmRGbkRuVThVSGU3UHJjQ3VGYm84YmZuUWRaQVdEV3BmV3Y4dU1saWpVaEplSkd6OWpwd25FWVJ0a2J5VWJjbTJqaVFOOHVWc3J1bGpKK29zRXdiVEVQTkZ1cXo0Yk1VYXYzdW10QXZSa3JMMG02WDViemdXMng1bUpiYWEzZTBHbHpNNUFMa1kxcm1EM0dFdlNYUllBVXl2YzNiVW0yOU5SSGl5N0VuZCtncDNOYnVNNzBINjFKSEhYeWR1NitzYVFUN0FHVEVWTWpJdGg0M0NiSXJDQThpYWx4eHhkVUdpUkRMZWJmNnM2U3V4Z25ieEw0RlM2cThnZm45WisxTnk5TDd3S0FmTFpMcDJScXFVZEpTSVVlRDhxMzR4QWNNeHREYTZHRlNQOS84VzlXWWJUNnIrcCtSbVVJaU05azVpYUJSRHRVVGdiVjJwejIwakJqYk9jd0lVWVllZzh2TTBRTEw3OTdFU0hxZXdQVUhtL0taR0xJenhLdHNKSXZjM29GWmNWcnRkVyt5WlQ1eEtOd3JnWUMzUnlBU2hyV2tRVFdIbWU5U1AwQlFkRkExdDREdHExVkdVcGVma2dvUzlxSi9ZNm1TbzJvakFvWFhncG9nZUw2K2N3OHJ2cEM3Q2Y2YklNSkl0UTAwUExZVEd5VjExWGRCZDQ0ajlMcTR3SEUyVVB1eUlqb2JMK1NjY1JZZk9DWElZTjVQelQ0UERuZGoxQ2x1SkRGeno2TklXdE95Ry9udHpQUEZnam1CYmZaR0pPQnVEb04vMlM4Ym9hZ3hadHZwWXdwRm5yb011eGJQL0lEdVJBVDNiUmtvY2puVTExWVR2OFAvM3hNL3piazZ6K294Y05EQ2pCdzJ1MEdoTjJ5N2FJSDExa2IxSzBLZU9sVXNCb2tzMHlrK2dTUmxYa2lTTVBrZzlkSlNPNHFzWmtTVnRUTnhCRWxQc09GbW5qRGxXTUJKMUUrSE9jR1JqY0ZWQ3VBQnVjSFV4bFB4aVJsQzR0UjVNZ3h4UndVVFdvNTFySFJxZ2ZmUG85ZGFITTlPU0s5U2ZBbDZLWWYrbVY0QWdQMkxQamJ5OXZWWHFYQ0oreUpkR29VaGJlN1FiM3V6Z3FOcS9jUjRXcE9jb0ZBZGI2VVArUFhmaDhpRUFSY1FIUCthV3VmaktibXRnMGNSR0tUL3dVcEZJUW5NcDNMZDNyNWsyTGQ5Z2UxN2RIb3IyZ1ltRlRTRm4rb0dFYVMwQ0Q4c0pUbWVjZzFNeTltN056WDB6SFpmWkFQV0VYemVVM1kzZzBDeWt0c0lYeXowT1Fua3MxQTFSbmJUUXRTajIzb3BWWkZ2MndvRkR1d21XeExMdmtWWmtXeEpYRFUwWUZUMHBMTGZqR25TMW00a2xxakdMdUpOendpUnpVNGFTajhwcUx3TGtSNDIvdFlHbEk5ZHdVZkplNDI1Z09wVUQ0VW9EaVR3TTFSVmFvMmREV242OVNEZm80VFdlY3NZSk5IMnFNUGYyRmNqNTQ4bkdFd2cyeUxBcXBRd1M2SkE4dXliVjlNMWtRMlVHb3JaVU1FMldEYlY1ckFZUTkzWFJNNDZqTWJCQWhaTG1nR2RFZENibHRNTjFSQ1JTQ2o1YkhuanVudXhTOUVCU0ttd3B0bkd2d1V6TlgxcnBoc1VMVkIyWUZGZ0g4SGQxUVFBdkVBdEFndUZFL201N3R5Tnh3dUZZdGdmck1Yek9RTU5TdTNFaWlJRkUzclNYbGd5VHZjTHFDY2t5WGt0UjZvZGxtdEhrNW5ocjVzVXI1bHU0ZGdFYTVGbk9kcVFPVGt0TlFhUWhUaWRLRHg5M1lndTY5Y0NBRlYwQStMK1dSV1pWVjkxczRhRTd4Z1ZVTGhmY2VPeUsrbWhGajlUbkV5aE5hSHRhaTBNVVd2SEd5dWNlR0tCMVI3M2dOUHpUMXVtVmhQR2pwUmZUR3drUVZXSHpPQ0FiQjk1ekhwT0ZlR1pOWEp4djJjT203eVRZY3dnL1VnaXZnaGduMVNzNlQzZVI3Nlo2a1ZmUTh3bGNqYllHVGErckZTY2FQallGYTJBejdZMXFFb1ErWmRxaURIMVVXZUVuWUlOS0h4K1AzZm9lTU9iRUs2emkxUGJiM1dRRXpsR2Q4eXBlV2lpV3Q4RVRiMkFoc29CSHZvQmc0Wm5zMks5Q0NTZllJR25iTDFTNUU3Q3EzWFE3NXZ4b3Y0SW94T1h1Wk41dzRSOVRqaVh2OEZlT1RzWmltM2pxTmttblZ3TXk4WUVPcHJKS28rdHRrVlRNT3ErUVRFTXpESUpYTzFDQUF0aGYzZlQ1dUtKWk00RmZPZmFMQVBhOXIxNjRZRzAxOU1VKzhwaHZqdVM1di9BQUt0ZWU3QXBoRkZGZHJEMnRoR2U0UlB0TVFTOEVLbzBYTW5QSG9idVVLTnJUbFg3M2tlYmg0Qy9icGRVZDEvSjdERWFDRWFkeEVZdmlacEsrOGJiK2xyQWhVMVFTNWlPYS9LRGlndlR0Z25xUkFwRUVnU29DRWNtbE5aelIvN01VaEI0bnlpeGN0TVVmWVptWGZ0Wit2TXZZR0tiVkFrNUtMZW5nVlRsb0U5RnBieVVia0poa0Uxd25PSzBtVmxWMHM1WkRJbWU0UnBQK1NyOXRVejF5QUhZU2YyQnk1Yk9ZRFZqZ3NrNllmSmRiSU91V3h1SGdsdHk0RkVMZzhnN2Z2Y1VEdUNFdWtlMWJYcUlxYW1JbitGMEFsTzNQUTN2TGc5UFhkQTJpNXJNcjVEdHhLM01RYzNSU25rYkJ3R29iUldjdlovZDJNOEZDWTJydW54SFRmT3ZrY3hHdm9PcTIyUFdySnNYVnRsYUhTcjk2a1Rvczl0NC95N0tGb2U2cVQxTW4zYjdlUWVHRjZGNUxrYjMra0ZTNGlDN2tqUlB4aW5jTnZqZXM1YlQwNGIrdk9ORzBJZVk5UE9kelVGSThpaXZEVWMwblc0TnVVeDdNbGpqOXREN1Z1N1pKanJjY2grYlVuUFlMSVpkTWN1RXJNVnI5ZVdZVTZSS0d2azM4UURxY1RvOHRLWnRqZE1DMDlGNS85QU5jWDBhQy9KZGVCNHVwbVo1eWxvWVdydjZDZG5LY2JHNzJoc3lCS0xXNHVKOWt4WnA4WVZzZWVIR2g5eFppTVE3VzlCdS9hU1pEbHBzaGRGbXZkVks1cVVoUGo1T1Y4MDNKZklTcTdTaUZGZTZrbkxtMUlOTUlnbVhiSnJLZEhmSjc2Wk10a1A0V1BjZ3pOYkFwV1hoT0ppTmRYMm1UMzBIeTh1RTBEWXlDV3F5M2lkQ1hTSkZHV2hRMUNSN0pXdllaeXdiaXh4aWFRVEw2NEQya0VBdFNGTlpMYWZxUkY5WXpmS1R1TlVFMmxMNk9yNGhQTEZwTldPRzJXQk40bGpDYmNDUkZLM2RINmNta1pnajJoY0cwZVlMdXo5L2tlV0xzNjJUb3VrazJOTlJ3blpBNkYzRjR1UDYzWm5yZDdEWEdsZXhHV3F5VnBoQmdoM0Z0b09NemVYdjdPd1ZEeUh6YW1aQmxmQ0tSdGZzeWJyRXJlVE1EcXpzVjFWODVhOW9kNGtEUTlqTU9OaVIvNEdtM3EzdVhOek9lTUsyMGJxTUlqTE9UbWJDYUM4YjdJU05wYWtyV1pFcnkyajZ5QVo4RVNQVWFxYzU3U3pHRFNvZk9KRXBwdklqdm9FMnNCTjhUNGpqNituTTJDd1Yxb1VjS3NhRTBQWHBpVmhTRy8wL1lDQWNMQThYaE5aT3lpQlBPc2NzVk5uWUlNejJwWTYrcmROUm44amEwSEdNZWo5UXM0V3lrcGZxRkFKaGIzbDN3NzZTeGc0d1kydmtXaktQYkozSERqWisxaDlCeFdGTTZIdXNqZDJPYmhteDBQNzFZeVd6R2FBK25WRElKYzEzOFRmMUpUR3FqbVpIK3BFMTcxVmRUSVVaMjJaVlZSc1lHdkEzS0YxeVVhT09pRm1SSDZnSVZTeWdPcUdiV21DYmtlOVJrOUJaMnJud0FKNWRSNzlIU2x4bUVqcG1PaFM2Q2dtQlJoVXNCMXNIQjZDT2JTdjZQeDl0eWtZZ1ZkRTl3aXBINU5HcDEzNjNrOGtqM0o4WEI2NERNV1RRb3l0QXM3VmVidU9Gckw5Y2VvQW81cldNWkhST3Q3ZjJYOUcxdzEyd0dtemFMWEpUSE9lTExKMncwQ1FuQ0htcW5mNmdLVUVVbjkzV0ZRRVk3Vy9teGs4NEVkVWgwcE5IS21uMnZObnlEZm5uQUJuYm5Ib3JQOTRFNmRrMXlCRWJHMW5JdEFwaWt6WkxtZStyaVprYWdjVVExelhvTWZZdVdHbUlLdzlhNFp1K0xQWjJydGRuZWFsNHRjUmJoUjBBTDI2TUczVVlaaWhvYXNscGpCVVF2cWFHakFvMkY5b3RqSnVkMlNleVpBWTRtbzR4WFFrZlFKdlRWd2hBQlV3RVlPMUlWQld1b0VjNVpYem4zV3RkRVBzUVRUQVpTdEF5VW84a1pQZURkeGNpcHJhR01YRCtPYmFjdEhsZ1JKcGdvODhwL2FmMm9PbUtJcEFPTUZmRkxUbnFQczZTYlhRdkFmMnZJMmlMMWUrR2U5WnYraXVUa0xrRkRDZ3FOQXA1ZG9GWkxTMzh0OHVoR0J5MlREY1dSTnJmcCszNHJYTFVZUElTTVUxRkcvdmVXdys0aVY4ZDhkK2lsTlBIU0RDR0l5M2FkTmZyU3N1VXZ1Y08ra3l6V1lhdmpuL2QzbnZlUXFCV0FnQW9ITHlyS0JZUXdrVjlzNnRlWlN0Z0ZLS1FqZEtHUitkbndMSTNhRTZrYk9OMG9URUR1S1ZibXFSNXNVcWdXMzZnQ2VWdXBsMW5LRkIzd2V0VHkwN3NnTytNKytHSTVaclYyYSt6TmRHaUI2alhpckxOWDZsKzlqZFlhdFdkQU8yRnhBLzlTMHBYbngyOVJTWlBoUHdOL2hiYk1KTHFiMEZrc2NYWlEveVFlVlhXZWxGTFBYVGl1TnlFUkRuWDF5R21zajAyK0lRejlJa0Z1b3JyTkVVUitDZ0JmNHFSODlpbnpuODV3c1NhYUVSTlkwUmFnUy9MTHYrNmlWTll1cGh0d2R4UExIanh4U1BlS0dCd3RjMFY3UkVjUENQb2ZvYzM0encyRW1oZlZvNXFQcW5oa2FNTE96UTltc1dLM09GY21Ndm1kZEI5NDVvbkZXeVFKWkp2aDRKZ1ZOL3FOeHBxZGNNbWk5ZlhxaGMxQUkrNTI5c3JxeHFWV3NuVVRacFlMbXRsOTRVU0RHRm5GQ0hEQkk3TVB5QlBHNE1uWWQ5Qm9GTGlsdTlFSG82UDVIZ0NQWlNsTXlDb25meTVZRVd6dnp3LzNJRVV1WTRDZ1RRMUcyM0VteGNHNXNJT21mSllCTURPYVd5S3RDNTFobzBja1FBdjAxaUl1STZMdjhtNWhuRFdwREJnQ200K0pRckdHaWdtWjhFT1ozWDg5a2FmSTZSQ3NTZ05adWtDUi9oSUllZG1ldVh3WVMxR2lDWEpqZTN2a2gyTXFJRjc3ZWg0Rkg5dlFLM0VkY1g2VGNDMnc1dGVuR1E3WWtIWGZxdEplVk1JbHlwK0hLMENVNFJGalNvYkk1K0NpSDVJZklGMTlTVUR0L0hQSm40VjR4UjVpZ2hFb3ZGQkZ2NVNkYTM1SUJCcU9xRmorcjd5cVFxWUhKK3NiUm9Ba1FwSkpDcE1TcHk2eHVURXp0NGViRk9iT055bmlNdURLYmtQZmxXaTBvVlVnM1MycEl5aXVZUk5MenE5UGQ2Y1g4Q2N4TzRMZTNEb3RXQURCdEVYemlkY0hKZDNPRG5KWkRBYzZ2cW5MWXpyUEp2LzMrbkF1SlM0TExNNnNUYU13cG81U0tXTGhGYjFiSzNOOTBUR1VEZmxKS3hGSThSZVprNlUrUFJxRm1PVVZjWGNGK1liU1Vwb0JxaUNsd0R3VzRuaURLNjV1LytXMTBaVkJvR0RaVGVrcnZvWFVsYk1RQzM5OXdtaisxQ0ZSNHFiWE5hNEcwWS9nOTc0WVpZZXVRN2ZsZ3E3Y3JmcVhPajR3RGo3UEF2UWdNakJiRGxhOEsyU3VEUk1xR05LM1dwT2ExV3NBWGlhYWtKV0NWbWM5OXZrM1ROMGxFUWJTVUtNd3ovQmV1QXFLU3Y0STBpdSs1VkpsWDJkRENOVFl6UVFNTU1tV0VtOHJ4bEQ4R2hVaW9GT2plZTBERzI0YS9ocnFKeUVrNkdXSWMyc0JUTGZ5b2xiMkFwUmd2dzc3Y3hoQ2FQSHBLeElvek9lOW0yQUxXZDluRW5xbXpKVENFeUUwTHMveGN6cVhBenArRER3WWZ2V1d1ZUwxL3EzTHU1NWlJWGs2dGgycUhUUm9rQWtPeGZRRXVyL3VRME1tSGMyK0IyeXBVK1dBVlc1eCsxQURyR0U4Uko5c3R0YUdNSHVZVFV3aSt0TmxVVzRUTzZWSzFGc2xnM0Y2ZzdCcEF5NjRVM0tIS2xkYUtMUVphWlNUQTRvc3pyZWRiMHNlS0ZwUGpnVXhJTGo4RmwydDJLZEl1SW5BK25vYmdKYXB3dFRINlF6cUUwMVdvRkpIQ3ZVUVdkT0ZyK1M5MVZOOTRzNHYxc3NtUjBlb29NQkNZWGNSNVBIQWZmbXdFdHNYcUZwQXpuRFVrT1liQW9kYzVYUk5CK0tOdGxZbTl4SW5YdlBpWTlMVHZGNmxUbmJpZEUwN1Uwa2tJcTZBRy9FMmJjKzJtZkliZXE5N0VFSTAvWklMU1lCMnhwSlQwcUxUeGlBd213cTJqbW8xQW9pTnVqRzNCd2FIWjl3SGNVVzN0ZFF5ZkRXNzdFcUU4WVFpMUUrTnR3WHUrNTNNOXArSU4yMy9SVDJJVGZyVG84UFd5Um1uNGtzVTZXWEdoVWwwY296ZlVJSUhSNUtPTmI0NzBxRENOb1k3K2tvcE1kSm1RSTRtSGRTc2xlN0lISkxVVlNRN1JNa2JyVlAzcHJmQ3dhWEV5UUgycWtJVE4xWllUbU4yM1ZGZmNOaUJtRlh3eEpXMWFDTlQ2Wjc2ajFTTmM2U3RrV2dyeWtIMTgrSDN3TFdqUmN1cllFR25SbE5jSzZMV1gvWHJSeVNpYTQxV2JRT1NMKzEyUndCTll4dXRQSkRBalQrOVFOanVhVmRxc2I4NTZ3b2VuMXdlS1JkcDkyR1Q2VkJqK3JZM1VEanpVVldKelhXcFQxaWE5MmFPMDUwQ200OUtPYWlTUWhGUVVjVkdsTWVzQncyYWJyQVM5Z24zWDBzNG5BVzNVTklqT080Y2NKR09lby90WEZvaXZSUGdNbktjdmdyOWFqeFNNaEplNkhWdGpKNXVEWmpmSGw5U2hCQXdaUGk2aU5sbW5NSVlFbEJLdDNmQVZpZnlnYkgybFd0Vy9tYUt2a0hQbUtZMTVFUE5ZejdIUTVRSnh1WnNUT0xnSndiMm05MDI0ZVFkbGJJajBWQWR6dDJ3MzcyUmZNNmgyL0t4ZFAzWlRFNzNXMFh5NWRyRy9YTzhQNWRrQVVhbHhLTk5zbGxmclBiZERCMmozVE9tWW8rYk1NVU5wYnhqMVdFWUY1MXBEUWZQVG5LVXkxU3JrMHJmOHZDV1JsYzdtYncwUkJvV3JJa2Qya0txK0hBVlBSUlhlNllNNTArNUNGbmhZTVFiQ3pxK3pST2NpK050VVVvMXozV0tRRHJGQU9weC82NU5IQ2loRGova2ZCM1hYOGdlK3RHa2Z2VnZVTGtpblBneWRJc0szVW9IL0hQL05HTzl1azkyNzFjVjhEMmN4VnBKZFZsdlZPRDR2a1FHRnpmVmxWQlY3WDRzZCtmUGEvQU8xbG9LTXRXaE9jRXFGNWtaSjlsUHltT1k5WTJmRGV4bHJDZWxWZXVJTFhsVFF2N0pkSGw0WnlaYWV1QmJVUkYvb2ZJMktBNkFiZEFFcEdoVGtlbFQvQmlNUmhrdnkra0RWcXFGWUE4Z00vblJQdmlnSHJjSVR0V3Y1VkRRbllzMFVjT1dRVHBhMUZ2VHlHNWl6aUM5NDlsZm9wU2k4WkpUUlhsQUJxMVZBSWhBenRLNlpnV2dzcGtmeUZwL1dwbGptd210SVU1S2lsOWJWWlZkWTBNK1QyTm5SUFJQZ004bm1hdG1GR0JxdGE4UUNTbmt5V0xDL2hRV1hCd3pIdDVuc1JROEdKNkdBNW9QcW84SGlmSE9XVnJ3VWJHSkRDTFBqRHlicU5ob05vUHpjN3hMa1ZqbENLVWE3QzROcFVoNUFTTDBYcFRSaWRKbzV6eWNUYWE4NWRsYTcvTlVwaDhOcVpnNytvMkdqNEhUVVk5cHl1ajU3QlYxMHNBalRreEZ2Z2JZam1VOXpnU2RjRDBPSS9BMWdsZXk1NndJT3NoS2YxcFlDYkdTRWQrUU11Zm1ESnE3NENtb1ZOZzlhcTV2eGNKNVlKQksyTlF4dU9qc0RRRHByYzZFVTFuaVdJNDBPck93cTViTllIenB0NG5UVVRRNXdPc2NqcGJmVzN2ZHRwYk9TeXlaT2FTWXFYR1BBVEdUU1hRSjFnNG1GSHhDOVZrTkdxUy9paU01Yy9WR1U5RUtxWEdTQmxJbnIzSUdKLytYR2lUMmdqU0RCTnNXdnBPMkdjdXFyVzZJRWRoanpyM2wvVnVET0Z3UmFGUy94VDRIUE1adXBEdFdHM05wYmJwQ1NiZjZvUkhkQXpTNnl6TGlkbWkxa1k0WHAvRjZFMklUc3JreUhibnQrV1N0dmtWb3FYZnR1S3lnN3V6SVNHd253VGtlNDQrNVNsM1RraWwzcmVGaW16Z1plTEY3UWR6VWdoZXoyVERWWTJmYVBERG45TklZZHE4VWFIN0VnMnVvMURyL1dycThkaEJscW5nL2NzYk5JQU93TnJpYnhRWi9FZzFUYWs2Mm9leEVOdDNpMnRjL3JKVG9OQkFsTkR5bWpJakVZK1ptT0JIT0x2VGRCb29tQnpYSWNOS1lNYTBQV0JKODlrMEJ1VGdKdUtaclZqY0s3Z25Ca3pMOUxTZDRNNWRlbWVWNkJtV0tEeGxmeDRQVC9CT2g0clIrbUtKZ09HRVZGVW1aZno5QTdTSTc0SFQxV2NyYnlIUWVhT01iaWFBT1hneUo0UXJKbTJ4MjJ0T3dHcmUzaVNPNytMcnJqL0JkVmVuYTlvNXdvRExueSs3WjFZZ0dURldvYWFTWWJTUWJNRzg3YVpnSnNqRmdEeW9QTnBObldUWVZ3eXByYjlIMmRJRTA5bFozMmpKQnNVUnFDWEJ4SmhXNWtBZGlHTGgxenBhSGs1SUpVSWVEcll2ZlUrMXBtZUxXUlFtc2dwZUNNUysyMHBick10d3ptalVFZG1WcXRFZkpDWjdqajVQOFlGU3VabEw0Q2lxRWtkZlI3ZHRTZUU1YnpyOTM2VnUwUStCbnV4T1QvNVVXRXZWdjdud2NWRURwR2l3R09jVnZ1MW53ekluZlFkUmsyOVI0S1JyNk9ucFo5cGI5dFh6MkpPVE1rMEd5YkFIU1JKYkg1eXlobitYTG53ZGZLbENyREpYdDhVMkhnNW42M0gxZnIvTXJ1UUd2MFZNVkJ5cTNBNUg0RzZ4SlQrOWpQcWlvNVkxZkU1ZkdBSXRDWEoyeURPOXhwby9tT3lrcm83NDZGQ0tFbktIVklhQzBwT2RTaHViSFZQVVFmZFQzUCtkeHBWR3IxT2cwbUxrY09jeTJFaFFGUGNyeEY3QWFSaVpBYWp3a0tQVEtHS2UxTFhBWFpkalpiNjhCVnMwVFQ0Tlp0bzNuZkQ1MWZVWW10OWVSUmdyemhmQmg0SFM2OGZ6enlVcDVhOTNvS0t0ZUdzWm9RakxlWG1rZWxNQ3hVdDJMR0xHcklVZGpidTlVWU9ndnE1Z3FNblo1N0hzNE05Vmo1YjJDTWl1eDB0MFE4ejZvanVhN3pTbmVKM0FxMys5OURmTU4xQS9KTUVsNWdMWnZRQ1VRRm5ZSmhYLzBWWHlZbFcxYmJ3ODNiWmNkYXdQVXdpK1hQN1ZyamVOc2lKQmVKbWlGVnEwYlozbzUrSVcrbDVRdWo4elZWYW9FWjA3RUdMUTcxcllDWHZpakZVMlZRZXZvR0ZKdjJZbnJrN0NGQWZ1N2Q1VS9kc1RXdDJZOVZuTm45OTVyN1ZuS0wvRTB3S0ZWRTdRY3NDeEdXb1ByUjZsZko1YW1CcS95Z3lLSm5uOEQ3RzdtS3BhWWtFNG5BTnorcjBPYWU5RXA4OFRZTmpXcGErU0czZzJXcmtndzFrMkZnOTVCaEYyN3BXNkkwOHVxT0J2WjZENEh2R3MrOENhR3JYM1FLV3FzUG9ucjNobHdRT3h2bWhXN2FvdWNveUdqOVE4M28reXFKTFBxbVVhTnNCRmJYSEhnQUNhRlcvdkFiWXNJajN3QWN6VGxpOUcxUER5azRpQWlWNUNLalJmM2pPZ2NkYTRYaXpwS2pQTWJ2d0xNTHRvSzhXY3VwZFhnc0pPV3YxRmlVc1RvcCtUOTN1emI1b0UwZ2VGN1hPZ21LcEphQ05yYlRQMTdPc0d6VUFZWlZTSVhzbEJnc1h3K0dkR3RkZE1xKzFpeHBaNVVGbmlHMkpXNyttUUpYMzBQaFlmZTJmdkRDOG1KVnI5c1lHYlkraVI4UzU3L1hZOEhFcDdEWVdBblBkd1JwcklRYXFoT0VneUFzSDJJUFArb1RWTzhIRHQwQ0ZjTGl5RXhpc2xGRU85OUw3dWZnVVJ4amVFZXFoWW1vWHB1bDNFYXJkOEpqbEZSWDJFb3pLVnN1S2FzNWVSbzVqL0I5OCtrQ202K1JMdnl0OU9aaUppMEJPaGxCeWdpV2FuZVprdWs2QUtKWGZHdzFZYTYrekxTOUFMaVBML2s0dTlVbk5uU3hGL1pUNGJSQ2toUjg5cCsyRkRrQmVtZ0JWRDdLbHZMVmNKWHFxZEkvMEdWN25ZRnB3VDFYV0FQZHFrYzcyeE1HRmx3dTFTMS9SQXhKdkN3TEhPZnNQaU5EbU5mVitKMW9kQlFQOUNsMHlWV1ltOVVKMmd4cVlkNHozZnpaWEYvOEszN1p4VlovdzdmRzVxYVpqTjVEYjZVUkZZOEUyekxoRVN4TEZuY0F0NGhxMFBGZ0ZyT0JPUEFkbE5GWlRIeDU1dWNNNkhVUHh4YmRQZ1dhYzRHYnBwd3BQcWVJZjhINlFxSnJOYytiWm9TY2VCcVIxUTArVkFjemw5TDlLZkVLTnd1U2REdFhYV2crSGpTQkxOOSt4bDBJU2lxRjNwS3puTk9RRU9jWXJEd3p6SzdUQlJjTTJ2VlVzS0RRMXRnRGp4ZTdaZVhMci9IZHZ5RFBHS3FzSEFEWnIwOHhUdXF5ZHNGTjd3ZGNXMGc3UEQvT1RnenljeWZzOWN0YWFlNzhON2ZBSVNWM0lvNHNGdDk0dmdnWVloaUN6UENqcXVCbVA4ZjQ1eVhieUUxdnc1L3RBWTVGWFdZV2lCY1RmVEpZbk52QWtPYXhna2o0TjFSVXBHcTQrSXVHb0NVRCt3NVhHYjJ5aHlnUHg5djcrZ1NsRmdNKzlUTGFGbEFDUG5PRGtHS3IvT0xBMDhpcC9nQ255bE5DSVYrL3pSUktOTjlpV2kxZk5QY1dQWnlQVmVLQTh4ZTRUWDRGRGVpeDBsV2JkcWV2cStlQVN4NGNWS05MTVhLSEFqYWZwSUlqM1FINWFKQ0VPaUQxNGg1L0VoN2g1U0hUQ3hLNFA1anIyemI5d3FDZVl6T0xqTm81ajlnVGVCV3NPekNXMjN0Uk9BZzc2Y2lCV3BuODZKcXlwSnQzTXhKYUJXdXJvdVgzSFlOQVN5ZHFvdEQrWXlZQWtkbS80b3puMlpxZkVZcm5rbVZ3UFB2b0E2VFpGK2k2d2FWdlgzSU15akZETzF0TzA0U3hBM09ZUU9UQkRpTHhEQnRkY09Ic2dNYXFKR2tYN2NNWGJQdkMyRmJJL2ZYcjZ6Sjhrai9OZmdsQVIzcC9PcGRQWU9UVXJqK1RLSldrWEZlWGJQSlBRWlVFbWg3RXlPYWU2cXdOeVU2c3pjdzRFcFo0dnI5OEt6aSt6WE9nUjN1bzBWU3hqWjR2N0c3ZWtDTGtEZ3VyM0JRUmI2akovUGJyY3l3MUczNFpURlZMRDJjQndYTUozSlBKZmdtK0g2M1gvVmlMSVM4THFIUmRMNmJmSDJoK1dsR3VTVWlsVzhsYldPTERnV0FoS1Y0dGJDNThxZEpVbmd3enJUT3owVU1sT0xMOWxVSUxjTWc3dy9HWHFERmhEc1JwVnNtRFZucExZMXQ0MU9KQmhiMkMyMnFpcEZXQWg3by90STVoeXRadXpUcnhwdVdoUWJhTXFBcFFOZkdrZ0ZLbXUxSldWSkVCY3YySFlRM2toUkdyVitKK0t1SVBBYk9mKzJ3aG5kcDZXMXJzWXZYVWIvZ3FOdi9CVkZLTFlnTHlhdGM5SStCUWlSTlVuWkFWbU5FcmlFb0F6bHMyY2lkbFFtK2k2Y2wrMHpxcXdwZXdXN0ZxYVhQbGZYWG1DRFQva1U3T285cG1wTG9UL2dBN1hmU216WmNrNUZYTWRhNFVRNlRkaEZNdXhLYUFvK1BEVXpEYlJ3NmtMdHZRWXNuY3YvQkYvdk5Xb0lvamFZNVBOUUNTb1pRcUU2UFk1Zy9SSlo5cVJiQnBvWkpJTEJWSmN4dEpKeGRYVzFtdFMwZUNuSlVuL1JmZzZ3MFRWUWpxbjVoQWlNeW1wcTR2SkhrNUxVOStIUm80TnMrc1R2RC9vYVEwN2NWV3VwYUxsMDQ0VnZuaXFSOFg3dUNDaURoQkU4YVRpVlFqSk5uWEtjbmhRc3ZMZjhBV2p5WktyaXBsajhBRERiQWRlemsyV0tFVDVaL0tPZnpId2paT3JvLzhMTUd0ZisxMFp1QUxEK2w0YVE1N1VPcFRBTjFzb0NXUE9BWDI5Kzd1MHVwdFhvWWo0VVI5UjRuYTFpNC9ZbENZeTQyWkRxSlB6a3Z6OVptMFVRc3VvVVppZzB4aUhqVW1WRng3WCtoT25NVUxuYyswSk0ybmJNQmNVbm9uSTM1OUVGV2tjTGdhQXlJRXVTUnN3eWY5YTVMMFMyYWNPalQzSG9wK2hHL0d5aGdZdzlqVWdSN0JQcENDZU5sS05ZV1FHL3JIL01Ic1d1UFRnaURTZ3orallpQi9yQ1BlNjQzVFRlSlN0Y2Q3VyszeG1vVHFscitMMHlFdFVrZk9jUVd0L3hyZWJLWWg0ZXIxZEJjNzhHN2NIRUYvU1dGRzdmTHJBbHhDb0lGekFpLzVuT0lNZlBIeUxMUHF1RWZWVzZERndqVmJ0ano1R1FFYzU4WGZZRVdVNnhpTkFNSHQ2N0FodWVuUnhhV2tGejE1VzhaQmFVTU8zM1ZGSE1JZHJDb0Vjd2ZhZlU0bTh3VVlQRHFaVzlFUmNsZzBRTzVnK0t4dWd4UUxBeGV4V2FSWFp5UXVkRzUvWngyV25TU3lHRjdNYk5uam5rK2lkOWxDZzlDMXZMUHdHNmhZQSt4OXQ1ZzZ0MkIwbmpYaC8xMHZkWDM0Z1Exdlk0NXlCWHRnV084dFFNZ0lEVW1oN2VPRnBBSUx6RjBPUUpZR2ZtYnA4aUNtcjhqK1p4cDlUYzNWNC9xYzRuNk1mZHVuMnVmaEhkNGNjMTcycFIwY3hPRDh0TzE4U1RwdTJqTk5zUFpvYkdrNEc3NkpYMDhXL3lVUC9LNVV1N3VUUUozeXdCK2lxeCsxQ25rWExZZmtNdHN1a0xvY3BXS0MzclkzUTUzNkRDeWkxM0tiWTAwTjZmTlpWekhwZ0VFbWVhQjJiQ3BzR3JuWHdqM1pVZHFUSUJLQkNHVUx4YzkrbmdhelJiWCthVjJCcDZwdDJ0ZHpTV0FnbFJhb0lmZ0t4cjd4UjBRUldsaHZqVk9GRE1YNUxaaE95cVNVTHVYSUhWT0lER3FOcWc4d05CWlVjRWIvSE9xR0I5YW1QNmNJeEFJRGNEZUtqeVhvOTVWbWFDWjdEOHZSaTdRRGJWYmdVbkdIS2RTNE50ME9NOEx4bUs0RWVjS1E5UklraURqUXk1MnhWL2dqNWhWZkJpYWhQa1BRRUsvRGN0S2NBVUdKOVhPMVdSNFdkQjErU1Bya2VtVWEzRUZ0TG5sQUZKTjBYMFhkTUJTSHhUQXdKMXlnYnB2TTRnQnFrVmhYdE9nbEFESDU2eU1tMGZiWmNEZzJyd2l3WmpnNjZ5S2ZDaDl4cWZaeHJSWUxOWnRsUnlxS2tQM2hCRVUwT2F4bmtrck1aVVVHYlJsQTliNXZJcnE5d25GYUt2Vy9XVXFzcUxxWHExZExTN0dKOG8yRkMrMExBZWtCaEtEY1EveW1ka3NvREpKTTB4VEFQVWlIaFhXdUpZYlg3eVFmN2NoVHZhOFc1UU54WFc5eGdreFBrTHFjUS9CamlaUWozRE5DdEo2V1hiN1JkaXI2bWN3SkMvYmFCRjhVZURVU1ZpY3VxbUxUY2hTa1hqMTc1ak02T0wreFNma2paZE9YMGVMSUk0YzdVNGljUUtGSjR4NnUyb3VybmFXL3Zac3F5SFNVWDdwdUx4dVFyd3RHY1lYTUMwemd2NGNQc0pVMk9neDhGRDFxUzY5R1hXcEZHV3FSQ2NCUUsrOWtoL1RKd08xaXZDbG5veFFvUFhzTXlFTDF1czAyTWNhbit3SXFCL2ZLSkZkbVhrWWtKM1A0bnovTitFMkorK1JsejcwNXpZcVdDNXRJWHdtNko1aFVaSUVadi9ZS01uemFSdzlRM29zSDVMa1FpcE53Mkp6WC9kK09EcURUaUE4ZG1WdzdiZmg0ZnVsVWFFSnJyWWFFdTFOTE9nL2sxWXJwb3htUG5VUnRoQ1lOZXJBdzZldnBZM3RoM2ZMQ3puaHUwb1ZEWTZFbTJhb1NsMHVFT2tXSXVoOG83Uk9kellkTFdSaVRtQ3FIZzVveDhLWjJJMWh2ak5pY0kzRCtXaFVPMW9wK2VZeE91OUpOZnIyQnRxOHJEd1pWcFV0amhQcDQrS1ppMkJNV2dlOG5uN0xLRkRvcFZERWlBUUdOUU96YnBVMFhxNHRXaWswSFVhNXRTaXpMQjlqb043ZWZudmdUMU9nTGg2SElieW1rRDVVYUhlMU5MTDk1d1A4NEVlME83R1RFVklFSVY1MldBcktKaUlQNEtKZHgwTE1YZ1Z0UU9ibldNV3dUeGlPYzl4N1RHT1ZTOHRFOGwrbW5OMm9ZVzYzZ1pBdFJRbDd2UjBHUUNEY296Ym8ydVFXU09Gd2R5NFlib2thcDhRMENua2l2Tjkvbjd4emk2OGxFTmVyLzYxVnRSdTU3ZnlOTk5PbWJaTmN3SDFCRlZPWFhKSWxzbzNWcEZhanVvNnJrWnhzSUpDL3p4YnRTWVZrVWdsakQwZ2R3eVRxTlFxUlhFcm5LVWVUTEs0YUNCcGtIK3UySXVEMlRxNmt0S1JRMW1JTDJhNno2ODdIRG9YbXBTaUNEN3lYdDlIMjJEZ3NqWVZvSW5XUEF6R1hZZjlrZTFKVGpSY3BJelRHaTFCT0JTSkNyRS9xVWNEYk5aYUJWSU1HNVNIdWtLYWRYdEMvMk5NeDA3RDZDMzA1d2Q2Zk9vazlCUjhPYmk4OEF0aW4vSVBmMHY4djZkdWI3VklwTnZlLzJJdnR6RFhrS1RMK2YraFZ6NGxXZDRYa2trUFc2RlpNNVhBRE1SeDY2V1pXN1UySk1TclljWmJPeWNmWjJKb0ZnYnhUTGR6YlJtKzd0Vk9RbDIvZUdhemkvNnRDaXNxZDFsUHZBVWhacG8yaHFVcHJtQmhYMWNleUFRZmdpZjZOQTB2akpUbHVyUisrT1RnMTF4aC9odzkvK0NWYThuQnhvL2JoSzMyQXhOdTR6YUtwWHFxTW40NXlyZDJwTDh3UEdBeVl1dEhYWWN3cmJ2c1QrcUJCc0FMVHpVQW5YNHhXajBsMmFUYVFWRnBQR3FYY1dBZUNkVlplL29tT1Y4cnFrRnBCSVRkbTZGaXoveU9DcVBLRDhVOHVGQ21zeWs3VjZORUJ0R3FoQXcycC9nQ1dyWXh5bWFBOUxIaHZxVi9GNWR3RXpwRUQ2Ly9aNndscGl1SU8vcUZRY3ZLck0yYVFEZHdxaDBCbVVGbU9jYnh6ZmhwNVJMdXZlTk1odzh3cjlxb2Y3Wm4vK0Nid21qbkNwWXFPZ3RFSkt3d3pQNDA5ZlJScjREcXlCRlBuWGdSbEh4UDdFYVFpb1RScGVTQWxzQXNXOWRpM3Rld1J0SC9oZ1VuL0tkcnNxMUl2M2pyaWo4OW9yazFqYW5UNmJ0QmU1cCtMR3pUU3hOcklrdFNzajhZT3Y0djQvem5uWGQ2QTZhRGwzZVp4RVN5TENFNmsxVVNSZmdlUkdaWUNtcHJkSUhoeGNMaEUrZXZ1MjNQRXJJYVdpZEp2YVNUNk1SQVJDWC9BdVVlOWxhQTJLeGNCL0FKcXpTN0NCcEZHcnpRN25ZSm0xK1VxVnRDKzc5ZTBFM0VsbGVhS1lUbWdOSU8wa3J3TXhtelZPUUJCbFY0d3kwME9rTmV4Snl2Y3k2ZmplZElPS0xIQ05TZ2FUTFNzTkI3bW1IcVF0OUhJaTREOWZackpyTjhpN01BMjdnSndTeUFLMmk2dUFJODNVOWNMNU15SmljejE5WkREdGpNVFRybDhMK0M2SWNJaWZQNGZXNmN5eC9qY0ZXUzlYVUhXa0J1U1lSZmErRzRMU2JwbHhwRjhjL1ZBbExhK2VhQWRKbExBanNMLzJMTXQ3bU9HZnhzeTdYRGg2UFVKdkpiMGozeGhjN3BtT2ZHdVZwMkdQWVZybzRybVh3Q3ZzTG5La0FudG85NUtpRHc2SU0zZFhsaU9CSUY0NUhldE03a3J0c21Cdlc0VitYQVhuYTRrd2IveTJ4azNqTEl6UllSdGRaV3l4MFk2b2x1RjgwU2V1WFozV3N4TXVNQ0g0SDB6NXVrZWZyQ0NQajc1ZEJWOHNlOXVrN09QNWVSZnI2SXJkVkYyWkFMakZzZE9IRThJV0UzTFk0VE93a3VKblhCeWZxSEdtTlFGOHdwZFg4SFdkK2FpNXAwTlNKSlAyVnF5MTZZTjdGV0RpdjJhMytOZGFRRm9nQndIeXRJdFVRbUpWc3ZNR3Mwc2lKdlNoczdwTVRaSmtTVE1KdWRyK3JXdngwd28weUwwaW9MYWFTOW9Pdm1BR0lBTTEwR2F6QnhUUWpTRkJKendCVkU1K24xSDI4M2FUdzAybDNqKzQrS00xNGRIMU5YZFJPYlRvN1hzc3NFcS9LMDJ2OGQ1NFRKT0NQdDRPRVV5Y3d5Z0haMzdkd1YzclpaZzFrQVliTmZJbkFpSWo3NEY5c0MvcU1Vd2IvRngvbjhaUmFzMzl3a29ZK0tMUmI0SC8wM2ExWndQbGJ1aUltZ3AzVW12SlJ0eEc1d1BZWmlPR2dETW5rbnlqY0VSV3ZrTnJKam9lV0VTSlRZbXEvUkxlQ3FIUWowT0Z2bUR5clpSTFVpVkFsUGZLU1oza1l4ZFJGTW5Hc2FjNjZHaEh3VVNENXpoQnhxNEJvNmNHSDFDeERlTnlJdk0wRDlGalBXMnRrWld3NlhTK2ZKZUdRM0tLS3VPTy91RUJROXlXcDNrbjVMMUdubitHK1JwVzViTGdiRTFyN3cvM0JhemVSWEZnSDZEV0J5OTEwNnAwakZlVFFNalJTZWdGdnY5Y0hiTEp4VGNROW9YWFpFOU8rcUxHNnd2VkpiMXAweURXblJnaTR6Z2ZPSm5IS3pMVDJZb1hMc2dQMDlwMXEyU2lFdVdJcVplcjVncHgzeGdxNEtPVWRlYjBuSVh4NGZzQVd0ZWwvSVovbDRRZVM2SHE3dG1vUkFuUG9nTk1FeHdwSTVSb0tvbzdVMi8xc2RyRFJ3dGNDZ2RHYlZhUWJCSTk1MnB5UnhUMkRnRU44VEJ1VUdNeU9peVFaR1V3eFd5SGh5dHUzY3B2SFVrREQ4b3NKREl5Vm95SEYwQkYxblVWZnd1ZTJDS0FhemdxUmxUbDRMdFh4dmhKbWZQNkFObjE0OTNIc1RtemZ5K1N0K0NlKzQxTUtBTVA3L0gwR2RzVVhidDNXYXRPdGRXNUZKMnZoUWpjTlR0RThpeGlLa1p6Z2MvWnc3STczbUhKTFNKTUhlMzR5Ukpxb1EyaDBZV3RMYkhDcjNTVkIraks3anpxV011eVhLWDllcDE1bi9WbWpaQkQzWTZaWTYyOE5iZmlYSUsra1ZnSnRFc2hJSGJnc3hOU0VteTFDU3h0OXk4dGdsMlJvYmNIaldxYXY4aTYxU0pCZm9XSHpwVHhHZkNVKzMyWEJSNEtZNWhSajFRajBvM3lyZGNkek5OOHNPSHk1OWgvbnl0K0Zjb2pxQWJzK1FQRDRXQ1MzWmJGYTIvVDFKZGs3YnFmVzZpTUtUTFFyeThSQzlId3pvZzRNWXVmVWxXYmxzakw3Q3kweW5hdU04Y3o3MzE3VkhmaGtYMlE0N3U2TUZtNGFMcnVuSHZuRTlNRXN5dE02OWxvY1dCMHppT3BReGhmWWs4Uy9HL1I1ZHlPeE9hR0F5cHkyeGJYK2Q2VHFDM0UvcHUzbjR0Z0lRNTdrSkd0Lyt4MVUzQ2F4b0dOU2hMZGZvQjR3V2xOR2YrRWlGdmgwanRJZEhGRWVzdmwxelV3VkplbUJ4N2pIdVhNSGc1RTE5TGFCY29JQXQwMzVoUGxld1dqb1p0Q2RKUzNzYlkvZ2doN0Uxb3diNG9KcVNtMS80clJvcnNZVStlVER2dWZSTFFjMUlnc1RVWnljOWh2d1dYRVRSNHZTWitIQTZBTElidG9NZjQ3djFVODNBeUhIOUg0TDIzajlNeURWN3dETE9hSmw0MFN3WTg5L3RkZlh1UnNmSWpYUldaT0kzTVN1VXl3R0JBdVhUd3lvV2p6blNQOWs5NTY4cTBWTVBPTjRZQ2pWVTg3eERIajl2MWo1Q0I0UHloTnhwdStXanFMNEVsbW1kTHRZSU9jMlgrM09kVkxzSnIyREYyakp3cmt6RzZ0MWJPSXlwZXZ4azUwaUd0Zjk5Y1k5enBMTjFKci9kRUkyODRUamwyczNCM1JEZHhhM1lvTGRSV2FnSmUrVHArbmM1dTAxU2x5QXV6Q29RN3NWcG1HRkN5MWRlMkI1c05LRUZ6Y1Nsbmw0VGlncWJmcms4THdMQzQ0VzdVTlA5elk4dFRKaEtPaldoV2szanpieEJZTG1WbEtRS0dsbkVRL3NhT3haaXFicVozTEozTmRrZWdMclRvaXNGdTQxYlVjdDJrak1uK1JWL2FqaC9UL2dqNEpzUlFWMlJNREQvRTVDM2xoTDY5dEdMR1l3Rlh1M0VJM0lYdm5FT0RydmU0L2RYZHBPM2VlbzgvMkxoTFRRSEFqTDlET01CYm1OaTZwQVpuSmI2L3VOQllnSDhHeTJVY0VTQVU2ZG1Xamd3TWpkbWRyeWRUN2Y2bTBBeG5WV3ZjbVM4eWhrTEdJSHZQSDlybkhqK1pXbVY4aVM1WGlLYnBWT2V1YjFNd1ZZVk1VQzk0SnZlUXgrWk1UcDJhclZVektnZzhIZ2ViSVZlRTVQS1ZmN1Y4U1NQeHY1cXpqUGkxQXo0OTBjNkFYd1lwRjFnQ0MremhrU0VZSitJd0I1QWJWaTZ5L2k1bnN6OVZDRVBaVGdYZHVFbEdzVyt0Z0NVSTI0am42ZEF3UG1SWnhUNWZnVHZxdUVJWTRpRUZsQzBsbVBhMFlLYmF2RGw4dnJWUTNDelE0QWtEUUlSdnpXWm9uckJmYm1oZEVvc3hqN0t5L0lyektRUGoydVNGbXgzRENqZDdmUmFEaG1GOGJ2RVVpVGJaOHBjR2lQRUYzNXl6ai9CKzZNZ0NwNXZKYVF1cjg2SWgxWEYzYmZETTZLWEEyL0pQdDR3bytSRkF0L0w5KzJIWTRDTWhaREFTTll0dVc4cE1EclduL0RxS2paeWkyZjVpRkRsQ0VXZjN6STRocVJtY2RydDE4ekZtMEZjWVRUdjB3c1J0RlplRm5ZVUQ1MnhkaFpoanZiVmJvc05FU2lWY0h4ek1DSnl0d1NFdTBZdzF0M202eTRtdTNpOGt5OStWbTFqZFVERjQrb3VncGlESXNST1Jsd1plUHdXcEtRVGEwYWJXM2s3dXRVdFk4Q3QwQWFWMnZHd1o0ZkxWV3p4RDk3ZVR2dHU3blVMVUNDc2dkSU45UktzRmJnQTlUY0c3bE9tSzVrNW1TWHNaVExWYVI1WnhpTmpLMGYwT0xETXI5SVYzYzlKUVV2K0IwaFZsYTBkSFI1Ykxab3NMNnpUOTcvQVpLTjhYb292eUFtY2ZQb2k5bG1hTXh6eXE1NTJaeWFmbWIvRkEvTmZVSnVQbXZaUWhYSFRtVVBSM2RaTWd4dVc0NFBOMFZ4SkJheFF0bWJiUkZGRDVsU09oNnlLSk5rOTYvSTNGQnlJYk1rZEI4Qit6VU02RWZoaVF0eEtVdS9qTStIYW9GMHRIS0RSbFVZbnFhR2pqc01IcFBrekpxeEUyYXFtYVdiMTVoZHZNSERkZzMzaEtDcUhZSTNIWkZ2NFNVcy9DZkFyV21OblByQ3pMT2lHZEF2a0UyZk1iZUx0dGQyTlluSXU4K3BPWnhpdHRPL25ycTdnUzFWV2FMWDZzeEszSFhwb285b01YN1V2dDNJRHNnQXRpbys5eEpNVDA0WFg2SlJFVjV5YnpIZS8zcXlxMVM5bWtyZGpodVNaNmxqUHBoUW5DYmszZkFLa0grMkVYd0pYZ1E5ME1qWXdHOGl0aVg3dGVka2JjT2ZGa2E5eUxHU0dzbTIzM2p4aGRHSlE2Q29aaDlBRkQrZzh6QTE1eXc5YkpCdFUvUjRZZ3hlc09YZG1tM0NYR2Z5cjRhYlV4NnJWQWlHU0hJKzBEa1dMODBIcVhsRXNnTVd4RlNaQ3Frdm82R0l5UDQ4NE4vSDJ2OFhFVEoxcHdXZzVKNmtjdGdPTlZYVUdtR1N6SVhGeDkyZW1wN29ncDVRNm1URitaTmFUSndrbml2ZTJSeUVicFZVcTB6cHdNaGF1dTFqbVp1S3dSclE0b0gyOFIxa0hZYzloU1VyMzJNU3NUNGExK21Ca3gzcXBmendjSWM0b3FEektOd2ZaZzd3L2hpQlZ0MzZKci9qaTdndHZ2YVo4SG1DZ3F6andpRzNqNFY1d1FGT1lJVDh6RjkvWmY5VlNzWWl5MDZPQ05nN0dRSDJqZE9hUXpmaFl4b3d2MExNNXVxK015dnBRN09vbFJkd29ESlZ2ZUN5Qm1WalpMa0pNUm9ZYzAxRVNSbTd5VTMwZmNBdUtaQ2l0WjlTOHdvK1Nveis3Q1AvZkV3VzRDdUU3UFZ6RGE0bmwzMDBkRW1zY0t5Nm8wR0xlRytYOExLSkRva0hmMW9OUUNpQVBsdzg4Y3E5WDg3RnJnV3JIYVNGdmxnV2RTWDJyN0tKVTFGNXZ4a25uK1dDK0ZVZ3loUkYyWnp3OVdzMUVNVWU5TkVmUmE4Wm5JZFUxYjl6WWFqU3Y4eWpzWktCTEdEbUJYMkd0Qm5WY1BCUzhiU2tzUzZDWWFTWGRGQmdWOWxxZ28wMHUyQmtIbmFIR3ZKYjhsVzFtRko5NGtRamVLbXdlcVJTdWVIOXp0WjAzMnZkNHBtVURDbFZBcms2aURtaWpyUitacTlITVBHWDdWelRhanVhSW5QUkVNc2ZvREhJb0xOekVCSUMxMjJWRkpPWllWUWlpSTlTN0dHNUJpNHF0NkJrMXcwaS9DOER3R2JlOEZrRWhjTHQ4c2lqU2sxU0hMbzh0d0l1TUZCdVJzV2ZKalA0STh2aitCeHBCRUFMekFDVm9FUkZUWllJRncyZ29qZ2pyOVlTOGlsMk5vNG4rTHJsYXkyUDViYU4zc3EzQjNJU1UrOHhPMGFaVmpzSVJ2Vk5DTDNnN09ySG1xWXAzS3UrQ0hnTkVXNnlWL1ZRbVB0ZzJWenZRRUNYRFlNN3A1SnVnekhrMjZxSFBTQ3FyNm1vWG82L0owa0srUzFMdEVOYmlyaHA5TElaVXdiTWlaV25jbUp1VU1jTURhaEY5SjlDdHdsK09yRTVPU2hpOUovUTdmOUM0dXY3SS9qdURlNU9FTTVMTXVnclAycFdnYUI4bWdidVl4bU1SZGlLUUNESzI3cWNaQU1IczVnTkxkcjZQQU15dnBVdEhqWkdHaGl1cVBMQlJXWTg1MVZ6K01TUDJZdTVaV2J5WGdLVWJhQ1BueVJ6OER6MDRDN1c1cWdjazBjZVVnQWZJQkY1QkYwWTRCUnNiNjh0dVd4bXc0MS93b0NIUFNGTGM0cDdnNlVqRWVTR2NDVDBFVjJjZ09URzhWaTFCdlVOR0tNeHczVE1xVU5tTU11NG5OYnRxeE1IRHJwRGVpZ3NFeU1kNG5CMDFHSkRYc1EvTm1tcHd6SDZiQm1XY2ZZZ2h5U1RxUXlVUWxOWm9Bd2VzcVJCbnM5TTlDYUJONHlCc2lyRlZsVElMTW56UXQxeHVzbUFkRW1jSVVEclVWRFZtUGZabzQ4ODZ1YXBTQUQrLzNBVTZzOEUvSGNlTm82Mk0rcU5BcmEzZ3k4WDZwZjlRU2kxMFQxNXQ2UENSV2hIcEI1Qi94Z0ttOXNmTWd6d3FrTnFqRzl3Rjg4YU1VbUNQaFBTNWw3b0RGdkNPb3BnWjhoNEZvWmgxZTBOV3JRbU90Nk14dDl3K2doWWV4RkJLY2FlNEN0SFhHdW9zYk9kZm5sK0tzZE1FUGxacUpDSXYxYjdqQy9WNjBEUVVzdlBMYXRRUSt0ME1Hak1TdVVaY081dHZSbjJQdGFadG9TNjMvQWZBRitmSnRBdzBtdGp4WHJwV0x6b0RjRkVPS1NVRkRZOEFyR21EQ2NjU0Q4SHUrVDgwclBlMTd6RUFQaWN2TlhxL1N1ODZCZ2RVcHVzcGUrd1RqSnpLOWoydkNLNTFINjRVU1d6bFBCcThsYzlISGRaSVkwa2wwZDhURjFxaWVnZlZRL1B6SjdBQnJZbVgzMGhzRS9kcUQzQmdMMU9FVWEzQk13eFpJTWJSR1hKOEgrckVlS0pYT2J6cTdqTzdUcEFBOGo0UjNOdHJXSDZJT0drUnlMNklZd3F0Y0tSK3p2aFdUY2ltVkx5UGcxRjdUYTZwVmhTR1ZsU2I4bElXaFRnOWdzeVJQSVMybi83ZFhiTjdXV1hGQ1hWUlJMTWVKM1h0cTQ4V2U3NlVoSGNLbVpZRXhqSkZnRDNxRE1uK3NpOEt4UUxLY2tvcjhseUlEQUpSNDJPWDZmR3VsQ2wxK0Uya3lFM1lKd3owQnVwRzFJV1pGaGxIVE91VWZadzRFTWNCeEgrWE1TMUZIdjRib0VEU2pvV3IzTGNtRlJHd0FTMW02T1VUQlJucWVpYTcwM1AyTjRuSk9rb0lwbEcwWEhzSTNGTk5oZWh2c2REU21ZM3YrMENjTDlWRWtqV2kwOFY5ZUkzYTJxb0R0b2pPbkI3UHJ4aHR0UmIxRTVmMmIvSWhBZ29ybVlaOUdkKzNlNGtja3J5YnR0NTNzM2xRSjdKcVNWOUFnblZRMjlDRUdFaEh4VEppeEhOcFU0UmNvRDBxUW95cFRGNXlPM1dtSWFUcGlqbGxvNS9zbXM1OWdTTU5mZ0xDNitVWFdibEhDVjhPR3FJcUQweXRvN3ZONEhiMXRnMENIOUlZZDk5OGZxNUdxRXkyc0l6NWxZT2VjTlRJNmJSWDVBTHZLWHliUkRZNFBUN1ZET3p0K2tEMlIza1JCYjhEampPZzlISitlNDhXRXRJYktKb1EvZlA2Y2sxZmY1aGl0M0k1b0dMczZLNFhtTzJNeUVZYVNCMkdsdnRhWU9NdzBBdGlSOXEwcm5uZE85RWJKdnhCcnV2T3Z6OHpBNmZlc0hiVzk3UkJ1OU53TWh4WlpuUEhaR0NCalU0bjFwNWNxcW04SzJ0a1ZHWkFHU0phTHBtTGtINWtJV1hkZWZOL1U3WG44OWdKZnRRZnhPRUs3SllwamQvRkVuMnlCSnlqSi8rMnQxVE1ENmZVeFo2a3o3SUtkbVdmbE5OL3l4MEZHRTk2M2lOZTFPQVEwaTRHL20zUEttd1dQNnMyQkkvR1lJdTZVSTU5bjJyeS9wSHRORmNkd0o1VmNOb2V5SmlxemVxU1doaFZrVDdLTUFITjRTR2RaZzIyNlpuYWtsUWxHUE1NbkxoZGJMU1E3WTIzTTh6ZnhVNEZySDNJdnZhdTFaTFRhdEo1TmVWT3I2cU84ZHNNRzd0OHA4MzJiU0dqSUpEaEdKWjc4OUIzbjdzQWdrc2E2b1ZxTFQ3OHdTMjBCQm85TmRqT2hSRzF4SWpGa0svOXNRMU9NVkJFNkN5aDExeUlXMGdTY2pOOTcxZUhEU1RTRDlWN25nYzNjVTB1T3U0bEpQUDBtQXZoNi93N2tZSTZ3WHFLZjhITUs0Mjk5OS9OWjN2Y3BFV2FTeGhicHdYQlBKOExMWm53RWI3eGM5TXZKME5RK0lKcnhJMHhpNVdXN21KdUZLRC8zeHlBb2Q1Rmg2VUpIZ09NdFJzNmZhNzdXNkZ6Q29GQjdmNUZlZ2UzZHhQS2RUMEIvZ2lxS2cwMmU2QzBTTkRJdkpybnNOTmZVOUR5OWp1ZzBIOUFlSWx1ekdvY0R4cVRENlQxT2tPL3dyaXltTS9oemFKeGpuaTNlUUViRjlhczZYVGtKdkRGL0prRnFwQzlIeG54WnBDWGNHODJsYkpsZ01kYXY0R3NiRDRQd3RkUVhiL1h5d283bHBqTUZJVFh5NUpvU3djZFJRalR5VVJ5Mys3czJkS3B2WFFZQnZwbUQ5VGgvazM1elFUakQ1ZmNnU1V3Smc2MzdDNzBQbE5weTh6WUdwc2c4WXNNdmNJNXA5L05RcUFlZWxYMi9lL1pERWlZQ0psVVNqTjQ4WXdoRkpQWmhoWVp4RGJOMndRTHBJU2t3OTZDVWh2eWQ3WmVRV3RITXJaRVhrZVlzRFJPc1k5QWxQNUlKR3drNE80ekVoVWYwVElDYWdtQnNSdHBrN1JZcjBJZ0h5bHRPejk3KzZtdmZkQnBsRHY1NmtVdmtiMlB0SVRLVS9yeDRZalRHaWJwek1nMloxaFNKZWdYcmpMZ3BJWit5bVhLNFFVMGdKVWs3bDBvVXU4NWdUeFBrVjVjdVlodms5amR6dHQ2QXhvejBRcFhvQzNMdDVkaEhHSE16WWlUM1E5OGRYWWdxaVlHYlBDQVMwQVB6K1JDdWlTTU5FVW5VLzhrOHJUZnA4TnJ0R2dENUtSdkduOVo3TVV0V0JjeUlPQVBEWW1WeklOemdlSlVuMTNoQjFFMTR0dk9FeS83R1loaVcycGEzVTZDTzdXVXA4RGk1azY4bnJrcVQ0TVBGWjFDMjIrYk41VTBxVldIY2gxVndWZlZ1akVvN3pURFFTNEVtYmpHT2FBRjF5Q29xLzhlYktZWEhNL2Fyb25YSWlncHhqYUE0TFFKUE1DVzJKN05VemNCQmhUTEF5ZUNjejMyb1k5TXQyVHlVYjBoNkpFQXd0VlZ4MUVWTGpqNDdITU5UWlVobGVvcXZMTk5rK2Yxb3JFL0p0TnE4YlFETnNPZDJiZGhVRldtbXJGcjkvaE92eWhudDFPcWpnYTdVeGFYSUszUHJwS3gyNDhBekYxZXh6blZtd0hqTnVqd3BQZ29oalVIOEhKaldFTndLTk9jVXFKOUZ0VjdzN2xkWm54TUZqQmVSZDAvVG5mQ1BSdGtHOFc0U0xOREdETlRCYUkzQ29KZDdKZjFyZXpEYzlmM0pBRkVnMjk5cHBMWitaTWZiK3N2TlI3WnJPUTR5eVIrQ25ySkpvcTVmQkxJc29aVjZtRDFRY09hVWc5cnRRL1lqUnZnN3ZBdklsOEJFMVBEQllZeHhLK0J1bVhiNXdsQmJOMWg4Q3ozOEZxcXMvSzd0MFp0U2dkZFZxVW9KZmt2RG8ySzU1c0xNTzkwYXBqZ0p4KzEvSjM4dGlhTFAyN3BvNXg0amJnVW9mU2svOUFrdVNNaXoyekVIRSswMWJFTHc1RHFteTJOVWQ0R3Mrb1Fqa0ZCNG1JZ3RONVZCRGw2dEV4KzRzNU0wMWdDeFk0MVpsRVNyakYwdjlPMUhuM0VteXc3ZEM1eVprQmNoK0I5Ynp0WDRqWGVDSFljbFZsSEhkb0luSTRKbXNXRnM0S2g0dzhUUkFlTG8rY0J2TkZKelZEMi9zN0VHWkMxaEthblpVN2xnMXNFZ1pVcEo0L01Ba2lSeTI5eGVpUUkzdnpCb3FQR3hrVEpqZzcxbDVOL3JTQnQvZWMwTWRuV240dVE1VnpXRndhUVU1RWhJaHR1Y3V0SDAyZVJoNFJEQXpZVkxhUDFMbWViOWNnLzIzU0RLMWZ6Wlhqa0wvY2VkV1dtL1l6TlBNd3pwc01hSzVtQk01Q1FVanJaelJYdStWTU45anBuTU9ISzFRQ3NsRE5mejNGWHhJalRlSE9BZDB1dkVnQzdZb2oySlo1b1BFaHZNSmZuWXgyMWVIWWRaTVZQUU1nK0RHSXpZR3dSZStTbTN1bGJVS2JLakF0MFM5WGg4SHJGSTUxWWZ6Rno0WUNCamRjY1ExS2hOaDFGMG1DZHdXL1ZlSmxZQVRTUkZKS0pKQXN4L2RkVmo3VjU5OXhCQ1lmdUZRcEtLdzdmVmFUWmZVeE5VV3k1ZUZXMkN4bFl2SmNUNTNlTk0zY1hOdGZBbUR6MmZ5cEc2SHAvWmVSYjNJNTNNOEtWUndhdUYrUlhid05YNFllSS82bWxmNEFHT01QUDZJZmhxSUk1WFEwaXhlU001MWt1NlJEK1ZZRU95S1JWemN4dkR3Z0xMRDhBbWpYV2JSenVzRVlDYlJWOVRsYVd0YVk0T2IvU05LSGREVjYzSEs5cXJxekFPaEdkY3JOTkZGci9XbWdRWTBwVUlVd050UUNsL3FMWk9vZmpMdWNVSEJxSzNYRmgwcG9QMHZkN05OdGtqdTVZSU9TZWtVc2hJVGNiZ2w0TEkydys1ZHlSTXhtS1lqVXR0SzNicDZZZ29PeHJrNjFnVXE4MFRUK3BkRFhFWjgrWEZZb3pPMjFVbVRadzNIdmZmQ2VXZjRzWk5SL0t4NUx1aUZHQTdiY2xJUXVWcFpYOVVEbTFXazdSVFJUVXdLa1lhYVYyY3pleGxxcStkVDh1S3FnSjhoeTFwbURMSDRiZzE1dVdhQWpVcXJJNGNHL1NERkgzUHdKeEozUlJweVhqODJPcVM3VlRHaTIvSkgvVW5rU1hOM09GR2lMTVk4aWJxOVJ0bHUxYThxRW5nZHZEbGRCU0EvUUJibk84RkY2a3YwQzNUM2tVMEFsM3ZqNW5hZjFtOURTT2F3eUZDM1JLTG1KZUI1VUo0QzhzV2VOdmdlQmo2dWN2MmtXL0Z6RG9MbEVSUVlIQVREdHJScndTSzdSbzA0SUoyWlg4S0Z0bjUxUzlrN3pZbW5SZWVrekFFK3l0N1c0VCt6MFlEMDgxWE45Z3J5VXZDNzhjQnBJZ3pDSFFadjA5Mm9iRTRMSEFxdVdQMmx4bENycDJ0NXpjTll5dWVjOEdGUEJhRjV1elk2c29IVnQ5RFNIYXl3S1NGTS9uL0c0TGo4UUlHNExTY3p1aFJDRUR1akRuVVpqWW1yMVNCSURkMzU2RWFabG5YaFZ5cE1SZDBZWUNaWTc1TW1wVzBIdmZtYUs4eERWUytscVhvSkhwa0hicy9TWXhQdFh3TWV6SWJodzhyOGIyd3JBUXpjd3h0eWl2UkhzVzVVOWx5SGJkSVBsOUEyWlZuLzE3OVV3V3FLYlRSbFRYT2laSlZLYTQ0bUVidERYa05Idm1XdnE2bndnU1FCTTBpeDhuQVkxMUoycVJYKzduSFlkK1pNN3l2VktVditBOWI0czNpaGcvTFhWZXd4alNDM3owb0dmY2tkVDRyZ0Q0Nm1QbTk1dXdRWkdmREMwV0JyUjVmYzJQbmxkTzFNQmdEOTBSQmhUdHFBUDg4dGViT0Raa1g5NzVxa21OeUR5TVY3NE5yeU1RT29OVW92SFdWd0lDZk1takR4Z0RrZGtDMUxMUjlBWUxNeGZQMXVRUC84QzNUbEx1RnZ2emNYMDhETzBmRVJIaVdNUkJ6TUZvdW45UHVzNXlQTU9DVkRSRVJsS2ljOHZKWnFpb3JyaXcweGx4RTEySm9XeUJHU2dyZWtId1J6UE5STVVlVTRaaCsxWXA4b2lQTjRGbnRmeWhhN3FLU0xnK08wTGh1eXNOV01zZnErcmlvZjFvNHl1REpXZ3J0L2JZYTduTnVjaGQ2dnppcktReS9oVGZ3eCsyaDY4U0Q1VDd0R2htS1I0QUVFRVV6Z3dxeUJGYXY4dHNTTGQ2WlZTTXR5V0wzRm5wSGEvMElsdzRFWXd2ekFZVmJHenJkQ2pqTHdaY3p1Yzk4K1ZjT1NqaGd6YnB4UDBQTUp4TUIyV0xnUjRWWTl4UmRVblpaVEV5bVpsWit3WjVvdHNMZHBmRVMrWlBYSzRiKzQ0dkxIVk9NK28wNWFzZHVZd2RGR1JYdy9RandsT2dYc1d6b1U0b3RyZ0dBVk9ZVkRrSGZ0bEsra1FheEJwd2swVXU5UUpEdWZkWml2RHphcFBUS2IrcnJsc056WTNJZjhBT3hYRWovUTJiQitMUXRUL0c2OURLV3ZjVndlN1JtVWZOZFRPUGg2M3h0dmZ3SzVoUXg0WVgvUDhQc3Q1RzVab0pqQnZlazFwRzE0a2JsR3hUY0Nzb2xBWExPbVp3aTNjd25YM0R3alFGV1B4cEphdGRETFU0bFBCNnRlN1pCTmZFOWtXUktSaHJKSFZCdWNtaDArTmdWRDZHdzlveG9jOExNV1RIY3ZSTXJPNXRyVEtGb0VFa2gzZzNkOCt1M25tTHplSmlpVWFMMG1nSjFlSkZCMGJ1aHJKZDJnTGNwV3dDM2FVQU54ZFp4SW1LdWNMNTV1K2ZWai9IUjBud3ZIbnd1ckljMEdJVEFjcG42N1hXak1xK0k0bDlEbllHOUdzTlpsdlcyaWZnVFRZNHFpN0dGYjdQdyt1akNnRnE0Tmg3YzNuQlI4V2cyeXdPVDJTeWZvYkQyR2dhRnI2VFZBS3QrWkRncjdlT1dHVFhtT2NJa29xZGs2cjE2T0tLWXJUSHUyM1g1SE0zY04rRFBESjVlSFJlRmQ0ZVJDVm1mZHBvdlpaTUNJL25uWS85VWpoUnV0T1VZTWtJRFBmMFZpc1lnd3Q4cnpRa1dGd2wzZTV3UnJoL3gwMExCT1F0MWV0QjlPR01PKzJmZXdLRDA4WGpYMkc0ck4rWWg0aWhpU2txZ0dYQ3A0S0UvUVd1MlZxSWs5MklMY05veUcxRGNFSlFjZ2RRVVMzc3VsR2s1RG5DTXBObkM2Snl6QUtrRUY3ZHZCanVGTGdWM1F1dE9jOGptTzZIcVNsditpWDdTLzNQMEZLc1NaU09lRGx0TVhXUWRneW91elZ1cSt2cUxUOFBOK2RqZ2JBVzl1ZXRCTnBYVll3ajByTzVoREFveEIxdW1abkdEMkVwcjloY2p5YVpodVVuMWVYaTZDZHY2Z1JnazFFRzJFdENnV094T3VoN2UrQ3R2VlUybVp5T1FPQm1uNjhmMmo4WklSTlRyNGY0OGxJNFpxUkp5Y2VIbXl6amp4TmphV2FPWGFQZVAxZ1dqVzRvRUpZcnJESFV3SGFMWkU1NVNnV3VsKzZ5cU40Y2NKV2ZoOXVsT25Nb3Y3UHU0UmwxL01KUUF3OTBWcnp4cWRTdjl4ZW0wUUZ0Z0dzNVBRSDFCRmNIMEVSZ1dzN25HVVVLQlZXYkx5OG94cUtIY21DUm9WcDlYcUl5U2prV1VrM3hTUnkwS3JOZ0s1dDZsR1U2RGFvRUM5WFRjcDZnQ1ljd1RJcVZ4Y0E3aTRzQXRocGMxYkkvejBlWEVVc1B2TCsvUVI5cVhmRG5EOFdINTl0b09FTmJoSGl2TUI2b1J1VFI2eEcySEFiSUQwOXFkV0xRUmRCUi80a01UUXFlejArN3hSenVLaWpGZ3pBZHg2dUhDdGNKQmM1ZlRBZXdaU3pEZDl1YmU5RURkRWR5QitGMm5kUnJBaC9nVVVxdjlrNWhtSzZpWFp2dzZQb3V1NnFpM3RqdHR0NkRzZS9hazdjb2M5bFlWM1R3dkVsNGxCcFhSSERxN1pKWkZpa0tBcDFxWGV2L09QVkVxL2sremlLZVR3TGgvQWdDYzFhR3NsQ1B6eVc0SWs1aEJodXNjejN5ZUNPS2dsRTNrZnB3NkhEQmlLbnY1anhoTmd3cngrR3lYM1ZrQ00yUTZVeU1FUldJUW92d2F6OW80dktOWG5TV2lRREdEaVVGVHFseUpRUUdURzdLU1N5b01wRytQekpHZWFDN1hqSnh5QjZVZ1MvcThRSTYvSjdVa0FzU1RzenhXeURGbzV5OVVoN0xzTDh2VnJNSFpESXBVdFRrUVkyRmZEQ3Z1eXNGZWs4ZS9zdFlhLysxUTdEazAwenVqNlBQU0M2aGxJM2J0QWpqUnhFbFFuQVkwMU9RMWNJV2ROR2RpQU9QMUVRdDJBYWthcmtLbHdNSnlBUW5CelNGaFp6eGpxemxhY2sxRnpiZ2VOcDUvakxsU0JYZDBJZFg4M0NsbG5XWndRcThuYnVncldQVUJBLzVLclF2L21RalcycFlSdkN6ZWtKb0FTbk1IWUlFUGdBUGpVVFQ1NlBkMlFZdUttOWRsVDlEVUN4TStQWWc0anh6dXVpK2FWWmRwVjhiSnp4cmx3cmtLOVBQWklwL0k0eHcwTkZleWpMTHpYR2dOVjZsQjBPcWZhSHNUWENDOFp6Qi84ZzBhQTZURnRBS2JTZ0RiUnJ1cWd2Yy9aVUdkbjdjMVQ5RG85cGpWc3RvQllIeFpqQXVzYUxvWU1wY3UwRXdyN0x3N0FURlZPd2wxRVVrQ2lydEVBYXRXRC9hNHJvRXdnM29MM0xrWFI5akZ1bFc4czBlcW1tNUR0QnkwQmpFZHk3UnU3bE9PbDJqWjA1cWNzWFJyYVp0OVBKSnZkRjhHYjZPM3dOV2F4Snh1b3dqNkM5M1ZYYkNKcWlNTUswbUUrQWJOTVZhS29iNjlBNi9VRERDMWNZYzhHaWNYUDQ1aVh6dW10Y3lhSVpHbFJEY2ZLVE5yYzJpeExQazB2Y0daSlFZL1FYR2xYTnFIeGZudWRqY1hUczByWlZtQjMzeUtnalhreDZ5aFhpVzBzVm4xUHZlbU9KRnk4WXI1c0cyNXRybXZldWxWOXlQcGdicXNwZi8zTGxVeXIrY05taWJjaG5rVXR1WXgrNHE5OHpzellrVjdHelFWZllqVVFOcW94TlZCbHJyTExab0syU3RpbTFBdkovREpXNEUrOVIwUllEMnplS3hVWlY5MHFQOTVWcHlacTN2eldiQjBlRFQyZUpheTlmSi9OamxXcWtJdUZRK004RStxYVhEek9JVnY1QXhuWnRyR1ZERHZubXVFUFRUMFphZjZ2Zy93ajN4R1hQUVVkNjM0UkgxV2VZU21senRnZVN2VHNzcjRSWVZIdkgxMjBWQWxaQ1U0L0h6bDRyVkpGaU14RGxlYUhJWnRISUNwUXhXQWJqZzVqdUFNejVYVmlkWm5DZG9VM2dYM3Fxb0Y3Vkd1cjJnWmk3UDFjaWFZZlJKaktBcERTM2xFQVF5WWtQUkNvMU01aCtUMDVNYWt6UjhQTHM2MTY2dUJCWVNoWlEwaFpmV3RFZ2xHak1KTkU0U3BnejluZ0hjcVd6d3lIMEtPN3I0WEJKSE9RVGUydExFdWEydFJYY0hTMXBHdWRsVjYrQ1FIVGNJVDZ4dkp0dWNPRlJ3U3BGYkcwbWE1K1dKNXEvVzdHbnFvUWhGR0tMaXRteDhYaWtxd2luVmd3Skp6U3dBNnkyUk95SVFRV1dVU1l5bmJSdW5JUVZ4RlBJTTFHWWprUzRPTkVka0MrVHpWT3dZT05lSHpHSkFtOGMwK2tFZ3MvaXBvM3BXcTVyVzljMEV1amtWR1RpWVI3ZDhEWktnNjJZU3hjL0wrRWF1cDVKWFJuN2J6ZDMxSXA4WmpzcTZMNzlYa0lMQ1U4aUI0NkV3NzhPekQ2UzJ0TitiRUV4RlF5UE42K2FoTWFFenFJd1IyUDZtbzdZYlVnbWk4M25jUmMxbjNQQXNVYkE3Z0g5U3ZPVG9LaHJWUDhob2FRa0I4NFZTN3N1azRSNm9ETHpXSFdVc0JXY0hvR3BhVUdTRmpucGdrbkxEd0hFcDRQcjBLemZtK3lRVEMwMllLRkxnaWVmVjdRM2lwMHRja0xJRHhDVUZoVGUwY2FiU3h3cXlWMHBHZWdNQStDSGpoQis0M2hUeDh4dElEUVNEeGdiTmJYMVFnd0xZclVtNDhRdFkvM29LV1Z1d0dsMDRqVDV5bDFiRVlzWFRvZ0FaZWtjRGJPYkpQb28zbEFNOUhtWXdSaVRCbXpsVzFxcjVNSy9lM3h0WVQ0ZHQ2Y3BFbDFxR0lBR3QrVVVsek1lczVqcDVnV1lzMkdYZW5HZnJQaE1ub2V5OFRDeTM4alYvWGFqWWc4SytER0tXUFJMbjZYRmt0d2VicG45NkxheXpvU09yODNLdGpiL0lWQmtRQTRYMk84c016S2VJcFRLNkNuajhiU1ROMUIyZWY1cC93M3ZYVjliaG4vOFN1RVMwWUwvRDdqT1dxUXVSRk9hakVFc01rUWNnWnFFVGtDd3FPME1OMFBjT2I1Q2hsd1c2Sm5KMGU0cEpzTzFLM0NsSUk1VC9ramlPeUQrdkRqUEFjR1NCckZPbk1Ob2tmNWMyaHVPZmozRlBkbXJVS0Mybnd1NmFrN2dCL1pnRE9zekhKeWRBa3NiSGkrVWVadFd1NFFVU09qVmRhL0Q4UG1vNVBwdkxiUnJIdTN2U2R6cVUwcGRsZ2NYcGtVQzM5WGUzQlhlMlovMUo0R1ZtbDFUaGtIUUlmVTZqYjF4RlF1RzIxZHpDUWQvQ3p5Uk9na3dWbVlKdE9ZWWk3Q2xMUFZNTmpjcUsvOFZISFZ4MGNZa0dQaTdlMmwxeE03L0dpSlJWeHM4WlU3enNNZkpwajFpNUwwZXgyeEZzRHNUNU96UmRWNU9MNkdmaVdlSzg5WWswMjl1M05XQWxPNWQyT2d2eWZNa1prenRLV0txMUZ2QTY3M3BNa2V0eXMwYjQyb3FYazJhdUYyWE9Va0NmV01Sb0N5YVF4NmJuMmdKOWo1RFBabzNnME1sTzVtYTV3RTZBVnZrekF6U1RQUmlMTTdnTTYzVVVYYkt0T3VoZEZmWVJDbWYxVnFKZUY5WHhYTkJPSUlwOVdaMUdmT0pmbyttZ3A0MTNFVi8rM3BJajVGSUErOS9PRFB2MkxtUTRvSkxvakYwOHFNVGh5cjk3SUQvU1B4S2FMa1AvSXl0eEYxVlNFYkhUOUV1RmxKZ0paVzRIMEZvY1ZtTHdmd2JkN2Q1YW95K0Z2bU5kUklkSUs0aU1Dbjh1U1lFNEVMSitNekRFc05VMzI3eFFuL3BCdjQ5bXk2ZytuWVY1aGg3VkxwVGprWUxXTks2My9seHdNWW1Xc1AxQmVGMno0d0lMM3RIQ3hmTkl4MHJCeVdFTFMxOXhRMkl6V25mTE1POXFSZ1l2b1g4b0NoaUVCME5IeC9xMjFCZGFvbFFMc0o1YjRWemNoV1BHeU5sTFErQzlkdUl4Y2NFQm1yR2kwSEJHNStrNEVOanZ6aS9ja0tCaXp5NGNCdFJpV2p3elBmTnBtamZ3SlNDd1E0c1BJNy9PSjFGTitEY3ovZStteUlZeWx5VVp3SDJvQys0VEdxVk5tMzUzYWpBWjRDcGxCUzN6aHJtdStyWjFlU0g4SUszUXlqWmNZS3BoOC9GVzd1eEYxZjg4YXhmS1pvUUZFTzI5RWxRNmx0TnlrNnVYWlgraTVwbEx6MVdoZXhZdCtIWkhzRnVNclFXWUJBNkxlaldramVGMHJWdFRQRHN6VTcvRnVBRDFEVGNxUkNSTHladDVwbWZKTDFLVlJwUzYvYzZsQnp6eGFSSU9iMDVhSlpvU0JqSVZ1N0U0REQ2UlpyZWtDcGpFZkl4YlNuVUVHMFdKdWZEV3duajNhUUhCMzNvaTFoMkZHZ2Q3Sjkvb3dwR2l3RXhGTVRsTmJLdHFpNHlnazRqMzQvUmEyVitlZHUyL1pKUmVWSWpuWHpRMXdSUEFKYWxTTmN1UFRZRkhqZ3lYdjhMK21naTVnRXJXcFRIV0hScSs0b2dwSm82K2NENjJKSjQwSmkvNnlURERpTUlpd3dmUTFzMHlvTlRlbklIYVRob3dqazBrbThLQW1mVnB4T01iMXdDdHhCTmRjU3J4dnNhWjRJSG96WWxLUEs4Tit1Nm5KeXYwNFpTY3RSRUF1bGYvS1JZUFFNZVowRDFGamZmUjhUTzNHVkhtMnd5WlBEdFNvOHlaL1ZKZU1JeVRrNlludXE2Zm9sRmpHLzZ0cXl0c1FWTU9kY0pFR0tpTVhTNjZacFhDR2xTdnM1aTl6eG9zSGZib1BNNngwbzlwcTlDdlh0VkV2UHlrUUc0S2REWHdJd3dxTEtFdCttbC96aWZTSlhwN1g4Y0YydGVWVGN4T3VmSFg1eFpNMXpJcm5ZVWtzRm44cXR4b1Ywa2lmZEdINEIwNEVGaEtyQ1RmejgveVo2TnZKZkVDd0V5UHJpb3lQbnZ3L0w0VHRCK3ZXckhlaUdnNGZSYkJSaFk5UDh3Nzl4V0pqdEZWUHVFZWI5OG44bWg0STR6d2JIS25pNU9TbmVxaFRrOVk4TFYwbEVKWHBhbXczVGplb0NFRDYyTFZtdEFkTFpWMlBjT2tZS0VReG12RHZ1RGVuWDBKbW5nV3p1S0t3M1RKS1ZsNmFpbU5WL2xjbjR1d2dla2xzdnE4NXRFUmJzc0NMRFIvajFLRXZNdlZkUXNDTGJaemRzOXhFY0tLLzlEdlNnTWpMYkF3U3RVM1dlazVpY3R6SThoNFpXWDJRS1FlWElRWHN4QVdsUVBUVE1BdEVJN1MrTTBoREEyMWdZWHp2VUY5Zk9pbG5lL0QxQnRJenVqemEwUUl6TS9IaGVZYXZDTnFHaGtNa3NmYXVPZXZnRlk1WVo1WHA2bjIwVDl5N1NaYklKMk9Hbnd2ZzhwNTBmTElCR2t5ZnpVbG9MdFNEdUpZbGVtcEkrYTEvZThSeklobWI5Y05udzNIREVYaHlEbXpDRDh5VlQ5Rk9CRUtrY2V5MjdPelFab0hFakRRUDZrajdpakxRQjhZMFp4Nmk3N2YrbkE3WWNKcnBUNWZzTVhvWXphRjVZeE0zZ1c0cmRGV21VaEU4bTF5dXZSYStJaE5SS3lYZUQ1b3BwUkRBNE5IWnZOc2ZCMG9yV1pLbjd3a2tvTnI0Z3JPUWZoK3RQd21YMFRBaVJGY0tWNUl5QnFnZm1JZm05N29FSW9KREpyOXRBRndKSCtVWlJuL2s5L1Q4cloxYmdwUGtWU3NxOWtmK2g5aEpINFVlMENGeEFiWTRPZU9NV3RrVjVRaEJpTnNscnZPYWxZTit5WWxzbGx2U3pUc3VEOXpvRUhwczA0UjBJdm9XVjVqYndlQ3pETjdjbGJFdkVKK1JzR2pxOGQ5TDlWY3dUdzVmS2NIVEJnekhjak4xWjFvclAyRUlZTHdHTGIvWkJjQW1kZ25tVnVnQW5Sa0tWWS9VRlhKZ2dzZG1YSUozV2NON05ld1YzMmh5TFczS21KeWJOZTF5WkNSWXhSS2FXb2dVWElJVHhpeFhGU3hEQXE3Q3N0b2RweEJCYnlVRUVYSTBYVTRVRGx3ZzIxekcrUnlybWFuczVJWXRIN2JpNXNIQnlDYXZIT3d5YiszTUZSazFSUGplT0VYQjAwUUUvREtpcWxoWURScE85end5TmZ4OWN6SlZkTmNEbGJ5MTF6dVk3akJMMTRUVFIvZnJXVUhwMnJXczZyNXpNeFhWMlJiYVlQOC84Q0ZHd0hQTHljKy9SUS9ET2lhVnJkMFAyOXVTSGJOZ2JvQkMxTHFJZkpCQzFqa3IyeWNoYXUyam4vVVl0NlZKNlNMUDZoSDlidlFlUFBodGhaT3owNVFHTU9yU1lkOXByNE8zaXFYeUs5Nm1GU3ZibjkwZXkzNUtndVloYzh6VDdqd2tFNVJSRUNmSm1OME43NnZpNHNiZXJiMHhFUUpXQVVmb1IwQ3pUaHh0SklvYjFuRUkwWXhuN0xqNmlTV0QzakhobGxtemlNVTJOMm1rY3hVdzRHR2dYY0JKSzhiaDY0cFp6S0hMTVhzV2diYlRNRjFjekxQWkxDR1B2V3o0ZWxwQzVDUEtVMVA3d2VLRy9rT2F6U2szSUY0RVowc2gzWGdFbStJTXJtNXhnY3hsM1Y0T3d4QmoraXluQzRxQWpxMy9EWHpmZjF6RE1nS2Jydmk2MURvaitnVGFPNENncGZ5VHZwVGxKai9SMkdCWStqYlJGRlZhVjlIN2hMclZFNHJPLzl2VHZsRDY5dmxDZXBsYUFZbkluTjFUS0tpOC9YZTYvdDBvZ0VkMG5PNE9pQjBMR3YxT1BMRDhOWGdpMWRhSERSSGtwNU5XNDZmNytKWUJFNjBxbmVFZzJnS0hNV1lIamk2R0pWVGcxekVTckVYVkJjaDVWRVpJaVd3WjlxY2VSNVVkSTQyOTdGT09yOEZUaEZVZmVJM2JHVG85THYxOVJXZEZ3UXg5UHRTTkpkUk8rWnNOV3M0bEUydGY4NkRPRnJlT3FYVU0vNEk0UWtFYytyNVo5dFFVSWJEVXp2elNnSSs0anJ0KzNpS1pGRVZWWVRnWkhsZVp0SWI3a2pDd2FwU09MNno0RS9PRUQ0N1MvTWlmamwvMy9URGdqODZseERrYnVESHFPT1A5cFFzVkI3S0ZJemllUGJKUnVWRzRJc0x0eTh5TzZDL3B3bHpTaWRrV2RWc3Z0Q2NNMnFsOTRVSUxMeWxxTTNtOHNDQmozL1ZjSEZHYnVIVzRid1V3NW02c2UwdkR2MjdtMW11OThCMzIwRUpnU1h1WU5wVDJMR2NuVnRKcEZjYmtJRElWS1o1QmVhYktEdU51VXpnSWJ2b2NWVHNDWk1RQ0JNNWFVdEVSUDIvVloybHFvbXg5NTFtZHZ4NWtIK1ZiMEprUVdIVEtsbVBRS2lMbnJvb25MSmQvbWdqWVFYSlJTRHJ5ZGhQaDlXazdHMkJrb2ZoRlBYQmY0a2VzQWdhRlBET0Qwc1d3MnVGRVpwNzB2ekp6dnBIbGVuZ0doOWZVUkEySCs2NXVDVU04SDF2c1NZeW15Q2NjS0pKcm9pMm5ZYTI2UmZTbk8rS0lMZGYxVzhsbFJJMlgvOWJRMkE5ZDNuUGJTUVpDeFlpOStGVkpWbUFtOHZMdEpaWjRyZkYraHNsYW1zRGVRWi9OeExXQS9Da3VQa0xucXFZaWJPQzFJalNsRENkNldJUHl2elNqaUQ1dWtrSTFjNnJpYlpCbHppdUVRS01iWXpjTCtEdWl4VE1iZXBKLzQ4SDZxbndEQW9pV2dIYllQUm9Pb2s0M1diaUlLUUpTY0F1NVV1UC83M0Y1NWFXWU1MZTF6Vk5RWm9rTEYwYnBaZ0g3Z2huYkxIeERhcWVFSGdWSkpaZWl4ZE9XYXBmY2lrL2VzZkNiTEF6VTM0Qk1lcTQyYWVkOXYwWE53Znk4VmVBWkEvTlJ6TFBwOTYrMFIvd3BZYXppb2Y4VUEzZFVwZTRyWkUzN2VnZ3hja3BZblM3bWhrWEZBOUJXL0RZN1dONU92c1VIamJ0VC9Rb0dKL1RCUmFRRFVlcXZPa05yek5yUmJ4VVV6eUpEZlRpUmQzc00yUVR6ajRSSWxvVWo5VDVzeTdIZkIzcldOUHBjSFJZSVVpYTZVczIvMWlwOXFoSSs1RUZiMVFhbm8veS85ZzlmbExnTGhBN2x0cnV5a0NtWHlJcWJEWi9DY1pjb1hDdkVPNFJsRDYyWENZZ3V1d1J5a3lJUEU0TVhtQmlCT0NidTZkamFBVzJIN3dtbVRab0VyYmZaWndrWEdJM1FNQWV2eHllc01QNk9nUjhHWW1oeEE0SjJnWkN6amNEY0VmMXU1aVFoQmd6em9wYlc3MmRhQUgyWUtUTEtmdnJmaGluaGM5L0oySGprRENWM0Y5RGtodFQ4MjBrQ29OVFR2RGRkVHVWNktqSGNKUUxEdVlqejRUaUZjQmR4bEdEdTVPdGJ5aDMwdXR6QWQvU2VzRExNbkR5UkxmaDliZDdHdWR2TTY3YmFjcVVnU01RVENUQUdhcE9pWFJUUmVlY3RCUFhJQWlreFJ3T3V1ZzJTa2pNV0VRNGtHTVlQSi9ZSm41MHNHMW5GZXpEVUFzemh6dHMwczJpaXdLZWFtaTFpODExaWpWWjdVanJEdjEyRCthTk9FbzhBdGIrMXdXUElZODJvTXZYTENWTm5Id0U2VkRKM2pIYytsMGtvUGZqUWZEaVhrbFZGeVo4L2dBYTE5VmFTOEJJUHgxcjF4RGNuNUxYL0lvdUgrTlNNK004YkFuZlVncE8xUVA2d0dKK2pJNlFFQkg0YjVFTTNEREo4ak5rK2ZBTzd4aStvMmJsdWlWL2psaUdmcE9hRWNSZFFoR3RuUTFNRmxyaGlVK01kcjhYdG00TzN4UHV6ZTg4TWExelRFYW41dEx3UFhaK3plamRXMG9YUzdiTTFmTHNEcTFtTGRCWGlBNm1SemxwbzQ1YkxWQVdRaDkwZUFMQzB4bHZqSlkyQmNoRHdhcUlyUjRjRXRObXhxZ1pSdlIxcWNUbFZ0SlRMaTNxdjlsMmswNC8zbDd0ZmwrUk9INm5IUy9HalgwVE5qc3RveXNDdEZLWnNFamU5T0VuYjZScEN0YTl1NUVoSVlGU205K2hiK0hRalFTV1IvSkphcTBkRGtIOTRpbmQzUitDK2xTYTdnSWtzZ25FRFpZcWZ0WWk0eHVqM0wzTy9sVmtCRnhoK1JMMTZZTDRYSE9wM3BUTU4xckYvcHRZeTBnT2FIZitlYUw2Z1RqbkgrRU5GSzFIbVBzR2dWRGQvWDRISXFHbFozaDczREdrMWlUWXJyUDJQWSszc0Jwa2pHUXhYSEtFeWkxVWsrWkVGVG9TUEcraVNFV2VMVnJEWE92UjFyV2NtcjJ2OG1qd0RnK1lySEtBaVNEdFE1VkFjRkl0TnExQlpJVnRTQldGbVFEMkVoYVN5V3Yrb0VyV0Vpb3FGUnMzQjhubW9RS3d2RTlzYXlrdkZyaXk1NzE3ZFVlMlI4SmVxK1A0ZXdGNW9zcGpzVjRvazM2VWQweEE5dURaSVBFNGI4U0NkUThZNW51NEQvWm41VmF3OEdMa3U2MG1qUkExMkFhTzlyZm1MNUxQTzlQTTRLOG1UUjhBK1lWb2V4d2g5c2xFcExnTG44OHMzVXB1WThnbFpnNjV6cVVCRFRoQ3M3WDZoR2M2Zk14dDBpYi9kejhKY0wzQXJncGxzM1NHV21pOGFLNU96RWozOENjcEFXWVVjYVFCWTczVW16bTJPb1BiM0ZZMFAzWHZheWtOREYrcHNQaFlYMTdJdGs4WlRwU21aeFBqOUJsbWNScmJpQTJyWkZ1YmU4Vk9HK2FSS2xtTU1RUzdjTE94SVZrWFhYTUNMM24wQktsa3Z1THh0Um1lcFk3TFJ4aEc5VU1LQWwxRjN4L0FuQzM5aTloVllZaXk3ZUZqWGc0UkZzYnhwM1B0Zlc4eFFHaUFoYWhscVJncGd0VGtIR0lSWjY5ZGsrWnA2WDZtU3pEMmRuUkcvQXU0RXIxUmU1OXB4WkI2WThZUXF3RC9mVnZTcUUwcnoxUUk3TEg4M0ttbTg5eFFSTE9xSTRNSGNDeEVQQnVJZVorVXVOMEtjaWYxaUZ5cEhxdFdzVXdnTlYrekN6SnVOamNwN0VuU1lGcjk5UDI3d2dqd2pxYTFyS3VJMHVpWmJSUDRrMkhndWduSXUxYkoxY2FiTEVkRWhNRGVlSWRRWUdrUlJHV0VzMm9vZDZ2QTU2citpSVNQbS9sRnFheUFxeDQzaWs2emk1ZGU2TjhhR3djZmFKU3g4aFVtb0phTVlHQUVnYk9pclFERmI3NXpiYVBZZ28rcUxBc2MzdDhQMlFndE03RWE2MCtkYVdzMTlXMzhBem03cCtzdDkwUEVlcEhNNlJJdGZsYmRIdzVacE83OC95WEtMOGQ1SlZyd3o1TjhxRjQrVlVld2JSS1ZSendFZE5wTExHaHpjR1N0RFJnbWROdW00cVE5TGFmVGhhT0NmOXl3QWdvTVpnTjRTTU5haEUwWnlITTBhVDROS1N2OUJ2NkprYkU2ZFBTcy8rQUdZRXVZc25GTHFQMzh5V2p2eWRkQmY1cEpxOEhkYXZXbUpEWmY2UlJBTGlkRTNQYncvY3V6TUpYTGZWbVhpVHpUQUNGYWYzNitPUHgyWG5DZ3RYR3dHV0ZQRzlwMHErVU5FeHR6eHRONFU5QmRDdzJ4ZG94dzhmS21CMWo2Sk1ESW9YOGZqMWljWWFiemhwTkV6T3grQzFzL3dDZHZlQ2N4SWgvOTI5V0tRUFJNZ0VVNGhVZlBPTUs0YTlyZWFhVGNDMnZFckNkZnJiVExmVXFPeGQyUWdSYTIyVitwemFUbW55L1liNnVTUUlVbFB2YlBVZUM2UE1DTzAwMmhrZG5tcEhpTDNzYVpBdkdzUUZBb3VzMXQveGJuY0VXRnJrR1A1Z1FvenpSUFRGZlgrejJJakdRc1dCZ1F4VURhNzVkVmpiQmJvVW1OWGhxNlNGaFJiNjRqU1dTc21DT3llMDNvV25UQ28zK3FvSkZLdW9YMk1DUWJLb0o5YTNid01lZnJlM3AxWW9LWTVmckgxaFBkem9TSVlEc2NTc0Z2QnoycC9UU0FYQmhyN2FXMUtyakZzTDlRZjJvSUZhdE5YQ09YOUpvQ01aL2V1M1BlVTFhTjlzRThFMk85ZXVPejBFS0VwSnhtY3Z0eVJHVWRLNzl5YWwwNkZ0bm9jWWFzTzlrN2tSZjZFNDFlS2dnazJpbE9vaXZRWWt4MWZ6UjdWT1hkZk1yeThOaUgrM2NVaFVoOUlPVC9VZk1YY29YbG9LV2VzdkllSVE0YkFWcDF4bHd5QjB3VmMvckF1UTYrb0Rsd3VKaG5HSjJrMWhJOGw4T1g0bnFGdVJxSjJReW54MGgwSXd5dHZjZnQvUVdBRzRpOTIxSmU4Yk9wZ2VnRk5RcGVRWGJ3aENmTG5reTVrOXpRTVBPTENLWEpWd2NvZFRwSW1EQXh0L25WN0o2TTMrMXR5NGVIc2RwN2M2VFdpOUtLOXlvUGpHSzU1SXZqRGpTUXFuN3pNRmU1WEo3cEtTN1IvZkFwOHRSL2swU1BweThld0tmZ0E2NVFsaVJ1ak0rRW5wZXczZnZwUUYwM2FJbS9LdFE2aXhSbUdSUklQMjBBY1hqSTd2ZmdtQ0cxN21rTmZXV1lvaW1XQnM2V3R1MGpxQyszODZ1KzkySU5zTGFNaFJCQ0hmZXJsdGY0WkJYKy85NGRIM3dPOTR4M2dDVmM5bExkN3lmWC9VcTNGTHVhOW9RNHpjRnhSNzZSRUx5bW5jTVdDSFk0WUY2Q3lSaDhoZ2dTeDRWcnpQc0pWNUtaelBIOGZUOGxsc3FCRGpwN2NNdGk5emJ5UFdVbXN0MUx4UWRRdCtoNE1nbHplc3ZtbGhkc3BsTDdtdjB3RGFubmM4WFZmRzR5UEFRaXZpVkhkK0lHbTc2TFVsL3VjTnV0UTBkYkZWbCtONTl2bzA0YXY5SlpqR2RqR21XaGJjblZ2THNYTWkvTUxWaHoyemJFaVd5c2NPS0ZPOGVrejd4TmdSak82NUJYcFdJZTB3Sm1pRjNKMGpWN0RLNDE2aWZxZjg1L2hTQlNNSTVFZ2UyN21ZVXNlazZrbEMxeEgxN1ZkdGwyRFFLOXBwbEtDZkk2N0FlczlHYW1nbng1bS9ueFNid0pJSk1jcmdUU1lMNERvelFNelhwcW5uNkdKaUpvQWtVMm5tc0hoMnVkQzlrdnNvTmhqczM5bDRINjlVN1J5VXlNc3FDOURFWjhOR0FCTFJYQ3Q1aVZpTm4yZ0g1U096K0VtVG1UZXFmQWtEb0VWUExsQ2dMVjVRNVJmbEdZSndJWmd5OXFOa3NVeFgvTU5zVEZ0dUxwbytDbDB1Q09wZ01QZUFxS2tyQVhiNWpGLzg5ZTRVeTZLNDdCQzVCQmZXdjJSWGxaN2ZiNEZKTG9EMndzNzBNOUl2L0g4TFBRRFFtWnhWcS8wOUk3aDJWL3NzaWdzcndkblhIc3JHUStYcXhmYTlzdks3WWNBS0lYcEtGbk82UHhVM0hEUUxZTlE5OE4wczgvYnFtbm9McUJPTGdER0h3WGhHYmVLSnk4S2xjNVd2SnNFekFrV256c3JPWlJLNWZKMGl5OUxNWGo2MUlJczV1V0tzTDNaekdRcnFUV0NmQVNzL3p1VEpiZmNoNGo2Y0VBOENvS1RjVHJvTHlEQ0l0UTl3V1crVFdYU0ZJMmo3WU4zZlR0bVArYndGTDFkcU5zTzZZWDNVbHhJeWd5RUhkTTd4MFBSRDRkSmppVmZzUnZQd1hxYi9xYXJxMzNIZ0h4SzJweDZ5TDVFR2hNL1dsSXZiRXZsc0wxUERxelVLeVVrZmRjSEsvV092amN0QVFwblRRUVNGbU9CTmxpMFZocy9obUt6cjVyRkdYZEpmendiOFgyd01JNGRtQ0FaZmxSK05UbkVudFR2eUdpS0lGNmNJZUs2QzhFdTREbUVDUU0xMnZHSDAzU1VLM2pBbzZDaFFZbUlrMkFVRDR2QTBXS0pBelk3ME1GeGZJa3VBQ0Y5UmNYbUlaZG9ocGtiVzlHbCttVUZyRDZkdVcyakdDeFNVWStNUDAyeHpacTRSRjlQSURGUlNWcEplUDdCQzl0czlLTjFadXpIMVZ3SitUaEt1WVFoWEFIa1RVeUFZcGsrdktvNFVPZkNycDJzaTQrcEt5WGFQdUJ1Wkpib2c2YmlCL3dsMGUzZ0RTa0w1ZFBZb0RvdVpTSUdFbk5XZVJtN3ZYSmQyUldIRFE2Q0dDbjNOdTFCeEJ6YS9yVWh4VStkVTFabGozbXJiTEJsQ3NibWRVd09INStNUlUvVE5pU1oxbnBmQ1lvY0NRQ0xUbkxkUi9RVFlpdDBqRFNja2xLUmNvWUxmSm1Na05MeHFTNWdIOS9NVndKalhWN1MwM3dkZXJTcUQzUHdYMTI4UGhFakRIN2pVQ0VIem1XZEFvbzBWTE1sWnVYZnREUmViVFYwUzVNNk5yelZSdHRvMXRXa2YrUWcxQVB3b216bXdWUlAwell6YTA0eEpWbVFQN2Z4bEhtSitHZXBFY3lrYVFxVk9uUUZWQVduekpTYVA3S0FxNjlLMDZLc3hZVmJqRVY3ekd4NVp0OWVWWUJ3R3pHVjhydklvRUpxejBxMmNoY0lyTFZhMHA1Mjk0RnVtK2lHWHIxMXR1UFdvQVVCbzlhcFowQVRZTnBUcGQyQmN4ZTIzM05wamQ3MVY0N2tUdTVscWlBZ0QrWm9tWHBNNzNyTWhCaEJxTHg1ZUJna2VQaEZiM01BTFM3VC9IanJ0VnJsUkRaMU5EQmtpTWp5eGx6Nkd2ZHNCQytwVFFXTWVkNzZxMmJsMnVHMmVUV2VRMm1aZDE5YzVWUnpzQ3pZd0x3WFBPblN1R2N5MTRaUmUrdVdtSy9ZcS81dDNVaVpmMERkdHp0SW9uTVlYUHlZUURIZEMzT2h2ZXp1emZQQnJVSG1IUEdXc3g3YktWNklVaEl4Q08wRmNEbE0wbkVWOW9pQi9TYlFGZFN0eDJIK3h0Z0RmV1BMWW5hcTdIZ05VckhIeCs2MkROY2d3a0k0TkwvQnZuUGVrcTJ1SFRFWGR3NTQ2WDI0MnR6d0dMVkl2d2YrYzFvTEdpVExqakVYV0dRSkRnSFVFamxWdUhIWFRqVFdkTjVRYzdGNy9kZi9URXV0a1B0S0VzcE1xZ1BrTmNyb2lQc0FkUkZPeisxUXU1MzJ0eU5EazVFUUpIV2Y3Z1ozZVBnclNKUXBSN3hHQ1hWdUxyU2hLZTVXWHpJZ2pCdUM4Q2diM3BoY3NqWmQ3SEs5TCtGZHFZL3FxeGdyWkVnaGxzTXNKU0k1T1puRzlOSEVzOEtzWE92QWY3dUY5bk9UM0FUM1hHMW5GS3ZaV0pBOGYrRWUyb0tjdCtYZTdQTSsrUkFhdE1CSHphMmJPYTZrRzFiMXdrZFh6SjQvVG8wZDBpdGhoTTJBbEZxWWlkZFB4WkdDeitXVUF1dTFibUZOcmZ6RmxzOCtPeW1GKzFFTlVBaFNEcUUwOXlHTlpINGp5ZFN6MUFJZlhTM1pwZzZnYjFvTVdGd25sSDZ4dGRMc2NLVWMrc1JsYmtub0xHZEJ0M3FCdHo0b01PVEl5VHpHckVOK2N6YiswdGYvTGNPQ0syQWVZVDNHNEtvVGN1RzErRFRYUG1KVXcvMVBiYndyaUZ1eXJYNm53MWhWYU1idVFSWTRUNUVuTnJXRWd2TUVQZk44UDZuSHUyaG9aWmpsR1dSb2ZvUVJIR2VWTFhBb2dSZmhaSm9ocmpJQ2NkMVZwY1NnQWNpaVV0Rno0Y09kL0IvMHhzZVlEcVlMU01lcjRvRUdoUis0ZWVGRWNYSjg4b0ZUMHpxTE1DNVhPTk1vb2hhdCtNZ0FGaHlLaFlmMjZHMlBmcGx6VFRmVktONG0ySmUrUjFNOG91NnZRSmhncHUweGVjMWQyUTcwNVhPVFh2RTdyenl4Y3NVclR3M1dENHBvRlh1M3lzN3BUeTQxVzJBb09wZTJFYmpJVTg2RE9CUGhGaXExZzFDMTBDVm9Uc3JuQnBOWkVleFowNjV3ZmNxdWZxbDB2N2k0N1lVUzBIRXVLUFREVlArK2dqTExVRkVvNm1leHM5aTRWMWJRR1loeDNETUhiUG5jYzAxNVZFTFlxdWxqYUpQS0d4c2xvSlBpanV1ZXNmZ1g3WVZKY2tTbWJnZEJ4OWdwM0pEc05BZkpqSHVrS2xuTG5SbVhWMXZ4Z2o2RVQxanBKbHJ1TlpkZ2MzZTJ1clVkWXRyZ1VkM21lWmk4VFNSR1ZtM0VNdFhvTFFMckx3MXpqUmZUbUo0Q3pUTU94SEZtc2RvMHRwWVdMalVtQ2ErSi9EaGpSU0pVRWU0Y2twQkwvaU1TOVhFMlNaaVlpUG11dExBS3FmeVRtSXNlcGVzVk1kb3ozTUI4MTBXL01ZUTZsUFNzc3N2MHc3NjlacDZERGtiUnQzci9JL3BOY2tQR3lhTmt4cWZMQktuNHVQUGdQemNjM0hyMGNuQ1NqdXJScG1iODU0MmcyQ3RKSE5vS3pLMDI1TkVlb1hITkk2S2dLaWRJc3hWcllzS3kveGxEYmJSQjhaREs3L1lMY051VTNMV0s3Y2Y1M3Q4T05qWWJwQW9yaEo1c0g0QmliZTdiMDBpK1ZCdVZZRW1ndjNUS1Job1lraHlTL3kwZlNLKzMvNFNFWkN3OUtCbnl2QU9IL0pBdjI1d3U1UFA1WGlpbFZFZ01YTmhIOXlHQzhGSG1wSFpoaU55eitSN2sxOGN2NXhCRDdQeDVKWDN6bG9VWU5EV1VGV3V0SzVnUmJ3YUhRdi9KWll2K3F2Wnk5MVhieXdzcm12dXBvSU1EYnhySmhFbXNnRzBxMWlXTjFZaHErcnd3S0lZTG9qSy9TaXZZMkdsSm9NVnk2c01XbXo1RmhXdjRvb2VVTSthL00weVVZN0hCaWZRQkpOaDcxRW92bk5sU1ROTEtBa3ZiUWo0czYzNk5DK0NLckovR04xcDMyWjh0cUNpaTlGNDAveUQ3UGRHK0pOWDlvL25yVGdiUTZQUlZJMEFMN0RRUDdweTVMZ05NUk5jRFdlaUgvQ25HQ2JYSVA5RlhPVWdzOEJxKyswWEtnNGJPeVE5bjIwR1krZ2hycFE4VkxnUDFORG5wQjRkajAwVkdIZnNjTU5OblNwbnpGbkI1ZHFKdjg3QllkQVhNWVZoN0ZQRysyN09oMUplUk5GOXFkVmRlWVVaNXRHL3dyNHBFa3JIVy9lN0s3enNmdVFGL3lCNU8zVjhLb0RERHdWYkJ5a3RuT1A5ekRXSFYzbmRTcXEwdUtRcWk1MHUwa1V6QkdVTUhETzdueHM5OTM4ZkJiTFZqVmJRWEJwWVpTL2w5U3RiUG1CcXVSM2xScGZLSzgweGJSUDQ2dkk4eTRSc2xxRGFEZHpWNDVWZTRFeVpWQi9odWo0alFwdENac0hxMXdpbVNNUUtzWWFKQ2Y1WXBLNThUQ2RqRy9uTXdnbVdRcnFic0N6QTZ0ajJoN2hNQUJTaXRZZWJQTXZyQWtDTFR2cU1QNEZHNXRFdG92aHBtSFh2UzZjTjlJNlJFQnB5eXI5K05KRFVRc2djbUJ4OWFYeEdEUkMvVU85RWoveXlmaDJsayt6dDRhVndacW53N2RQMUVvcXdueS9GNTQwbm5tWjdTYWtDVmorVEhPYWhGYXF0Q0E4UEZRblBQV2l1RkxxcitocWhWaWx4aGIxNG84TTZNYTJEVFBaQ2l3emVYckdwb202M2pRaHVYUzIwdTd6Z1gyTDdLWTVEVC9iTUVubkdLQjhMaC9UOW50ZVpGWCtocEtJbERQNWRVRVRkbTlTVlFoVEliMkNmb0ZjVEoxb1B1NjF2U3lDUXhDQW1xYjVxMEpLWmtqTjhaOWx4SWFGNzVZbXZ5aG5rZWNGZm1VcEVYY2FUdWYvQ0pMdmprQUdYU3Q0S0NNelNZeDdLYnJnK2cvSFdQUDQvMnJjRzVVR2hKVkp5czZYcFJ0VTcwRzdBUXd3SnBCTmVSRGo3RUxyektqendpd05TWGVqbE0yUHpsdHNvR0xUZGRJeVMrUndIdTdVOVJVaDdOZng0YXJkdE1aeEx0YzhrcytncHhhckhzRkw1SjBJTFhURFY2UzJuWm5pVS9YUTUwNGplc0NFVHo1M1hxdUlmNnZuNWthMzlKTDJIbStRcGhhM2diMUZoTVFvY29FaDJLaE9ERFdKK0hqeDk5M0M4eTVlbHlyL2E4NXRXSlUyZi85QlowOXRqa2E2OEVvM2d6dHVCUTYxTGJHOTlwS2JWdDlFQVg5aUNoNE5EN2I4S2kvampmNDk1V1M3YVBGRDgrSFVRT3ZNL0ZTMytLdlZIeXlhKy9TQ01meVhIOThsd09pUHgrb2hvWE9RTnNvaXBZSi9ZVmNSZFVnWjF3V2l6RFJkR28vYXJkdFNQcFhXYzRubmlIY004eEVvUVZoS3labmhUY0VEQVVHRDZ0SVBPMmpOWlJ5USsxZkNaWTREL0lxcldOZ0UxWmJ2eDB1Y2FuUlhkM3lYeE1Fc0tXN05ucnlqWmZldGFGZ0NpMUwxUGdUSWpKcHRSVWJHdGVDY0hFQ3dwaWFMMU1menpQSWFrU2NIcUxLZnFSQjdWZnZnSU1YTDhsaGxLdmNtWGhwQmRQS2VqTlVHb3dZUEs5WWNTcGpRekFwSGhhWXc3K1lrYzJuYXRXOEp1U3kvZDVVN00vQjRMZTRFQ2I0SmhjV2pxcFVWY1Zqbzk4STNNeDUxallzeDJRZkdydkVLNDhkTm56MlhtTy9DYmNLYy9HKzd4UzJEUE5wOFpuMU9CeFJDT21jSjIzQW9WUk1KSW5iSWU4eTJCbHRKemViOWhMZ1J3VGlsR0lubWg3bThmM20xSHdWN1dSK1oyWndMUjNQbXp5andIVFArSTQzTDFIOElwSndiNnE2YU1zRjl6U3JQQXFQcU1kVDRzWnA5Y3hjWHc4VGp1QndnOEtNdHRmSXhpSmppeG5BdHN0TERXMkRVVm9PNEVPT3daT2FXOHkwRjJwWE02OXFESklDMGNhSFFoREh3cCs4ZzZMcWJ2aE5XYW0xM0p5OGE0aVBvN1RGMUVveVNwM2plQnRZWWxlcFJSYlV4UHJ6d3NjeGVQUlIxalp5a3QwY2I4RU1wR2hnWmRJU3dBa2I5UTFNZ0ltV1VSc0tselJaSXdKeDN2ckVwZFJhb3pPWk1iaUtteUlBK21oMERSalFvc1RGYkxpUFFySEdpZEhwZXJDVWJva0ZxSDA3UDZlSndrYnYrZnJoVVRNdzZSOFM0Tlp0NUkyRHArRnBUVWJpb1YyUmZwVFFYU2lLSDFXaXl1N2FlQkFDaGFSaUxid1lhL3YzcklDZ1BtZXhhN2oyd1hkK3B6U2lYNFpacjUrUk52c3pjYjFVWlFnQkZqSmhGWmtxNmFJODdYekVsTDk1RlFsdlpRVmhYWEMzem1jU0NlRmloWUc3WTFpV0ZoTkZRWjQ2SS9pNVhDbjVMbnZCRUpjUi9PWDRwZ0dBL1V2cTJaaEFGNGJWSzZEdHJ0cWhOdFRXMGRNTXFQY0M2MnMrM0diOStNaUFVeDZ2dFJyTWcxVTlxNFdtMjdueFVDWGd2aC9nV09qZk5xZ0grU3FYV0ZxSEJwT3MxUFZISWtSTFdvcEs1a3J5dDQ2Y3RnbE8zNVFOUElnQ2N5cUNtRWFmd0ZNMXhwK1hPWlczRGhzV0JZekVqVFp1Wm9MV2x4QnBBVmhJUmh2dG84UXRsazV6UWxqdy91ZUhlMVJJaXBBR2FJa0Y5aHpEUzhIbHlsTXRuNW1wUGl0SlJWVlB1Zmp2WjZ4RWdNREd0OE54WW9KWWhUZnIwMlRyUVNrU0hhUkdQT3FkallPOGJjanYwVDJSNGRrRGJyWjk0Qnp5ZkRLc0U1ZkJHQ2FMQjAvMHBKY1Bxc0tJVVVUTldCK1dVTUt4VnFBcVRoK0MrQ3lMYWYrR1ZSaXNiMU55a3dLN2JxaDJwQ09mc2tTUnc5cFRNbFlyVkNGT21MR0dQTFBEb241TzZYWWZxMjBQVC9TUGRHNkZ3YzU5UllMbWlHeXpxQ0drNC9nRUkyVk9EektZZk9iNmY0RDVjTVRQWDNZNmdZeEVFL21OSjhTWk5LOTV6ZUU4OVBFN1RBV0FEYm9DUnZHVFRFY0dKYXR1YmFpVHk3b1pGMlFCNUtISDdnNTVrclpUREY3eTRqZ2pnZElGc2lJSFBvM08yaktveXR0cUluZlE0VWxVVGxiN0VPTllZNE9RaUIzWFQrZUxXUnNvUUREM1hadEJYdXo4ZXpNQVl4a1k0U0FSM3lZbUVXV2tObGNySWIvZWV1Z1ZqVC9mUTdidGxaeENPcFlQWnJhQ3dadTY2TkpwSzF0bjIxaFN2Y1haM2tnSExPTXZrY1hucUJDTmVUdHgzZDBGZERMWlI3WmZYaVJkK1lpQ2ZrVEJtWGdPZnR2V1JlMGNyOUlWWTk1dlVKWHhBdzAvcm9EUlJzZkpYcysrR1djQUNHOStIb29NRTg0MDZZMWpDdk5ZZDFKU21WMG1IaVA3RHJMNmhGODNXdlBTcklMM3VORXk0SWZXT3dMTjNUTzVkUG1GdFRkVnUvQ01uMTZoeERoS2h3Ykw3cUxWVzMyUUVXeHV3cGtCKzNjT25iaStiREZ2TVVuSkZGQzRIUS85RENadFdGYW40NUZuQzc0NmU2cHdpZWczZ3MzRGNIcmxUQUorN2gwUGJVUDlxZ2hoUTZNeCtJYmhPVHR1Z2xqdnBJdmtrandsSWJkdmllNUVUVExPU3FIQnVJdGI4U2NMalp4bXhMTW5pbVkrTkF4MXlCbGk1NnZwRk9mVHhsaTZnZzd0UStxY3dGQUNUenkxa3F6Tkg0STlOSjRlcis5aGJQK3VpT2owSi9SZ1dpZjh0ZjZpcU5oQkxpOVkrdmJhNHprbjZtTFhrdlZPTnFDanhXMnFsQ3N6SXdXMXZTemFrS1RocUxYQ1lvTDNyMVl5QlBycDYvdFptSXR4UkdEZ2ExZm9TOWMxa1B3R01OMVd6MUtYYThnR0tvYnVqZ3NtZXQvOFpBTmtJN2gyZVJzN1VocEZiVjh6Sk5GUWFSNitwWDE0K04wN1FtRThXUkl3Skk2Wkc4QjdyS1l6d2NvMUlDZStobmpkQVJYSjdDSGltN2FDamhxeU9XQS8wUlhNWVdvYktrSmR2bGZYVGdVSHo5bkVPQ0VjeGNXcFhKUlpaTzZ3R1g5U3VOb3p4N3BBMXRPcFpIWmwvTFFnQWZUemhpWDJLMXNKcUgyZW1MWnFxRC84M2pxVXdnbUgyMDM0N2QzZlRjc08vNXA0czgrNlorOWRoM1A2czUyT2ZhWGJoYlJDcTlDdCs2QXZTWHNvczdJTkFSbUVHSVB0SGVMaVd5aTZNRWZ4bDkzd3o4VjJISElrOVVJeEU1MnFEOUxVZ3JNQmZQV3Nic0tWNmRMTS9EekJrejZnMXY0azBMcGVXeU9KWVc2UHd0UUdNT2JpQnl0YlBTL3dGZVQ0bmI3RU9hZGRzMDR4SHdUU3NYNHRBSUdwQVgydjZoY0U2eGI1WGlzenhXbWIxczBpUXc1VTNFSVd2MUhBRFFZZ2hQSDA5OEM2c2k2aTZaZjF2WmFNT1pxYUlrTGNXQk1VTGY2ZFZJM21pSFNCUnNvNDZVZmo0cmR6WW0wcFlDSkhGTlkyQjdXM2VraUFyb3dFVXM1eE9tU2pDUXNKazhVYmpkVVZ2YXlIQlp6cUQ4NlE3QkVJa0RHbVdPL2I4dHl3ZDJENEVraHRMY3FodzAyeTRkeFBrRTI1dUltNW5EVzlheTFwSEVTZk9yOStTSE5TZG9jNVdtdysyMzZRdHVLTHFnNStjeVcvOXhaSCtNZjFtMi92TWN1VEQ2YnoyTHdHUFlQeHZiWFg5N0Rjc0hlcHhCeVlOeDhiaW9SRTF3U3pTNi9nZ0J4UVBCcFREa1ZqdlhtNTBjNStvRWYwcHJCOVQ1TTdlS3NCaUJsekd6dUJIM3BDbE9YMFh0UjBiZFRFNFFjeXFkSC9RRU1LaERYRnpPemZGdmplM0xlTVVvWkZSc3dkaGdXS3FRenJVSElJM0Z6ZE56bFZrNlJFQVF6d25qTlhBQTllVkVrZ2xSbGJwaVlNdkdId1dpQTZrM2h3bTdxS0tPQW5PZG1jSjR6cDNLZjlpSXBVc3BYMnloZjRzUi91bXo5Q3Z5K2JIT0s4WE8vUFNWLzlvYjhTSEdyOC9tZ3gvVjk2cFdlS1MrSWlhOWN0YWpTaE4xR3dmcnJSbnJIa0ZDVUdJYjJ6M1VmNEFhRGV4aGQrR05zN01TeUlITUhQcDJSV0FsMDBZYXVSeE9ySDZNOEh4S2I3UE0yUDJCZXduTEFSc2NLZEtBMnE0VXIvcll3N0FxcmNyWkJRa2w2SU5WYS8zenRxT2o1ejZET25TbmIvRENHK0h0UncwZDRWMW1Pa2g1SDhhUFdERXAzZzMvVTVuV3gvL2VGaTA2bXV5WWx5a2VqR1djOWtiSlMrZktzaUhyOGs0bU50SDUvQWF6dzdoK1dCZ1NIUHliZTk5ZjlObDY0cDVXbDNUYS9ScE9EdDlmVDJTa3d3OHhxeXg1YW9ncis5WElYczJWVTh3ZmNlMEozY2c5dUVWYVprR2dWckNZTy9hZWNydXdPeThocGJldW1PbG9YSFlBVGFoeGZMdk5JL3FJYlR6M0FQMmxac0tnY3JSMFpXT3ZGVS94VGxpUVJKYk82dEdYendDcDVDS0hmdnkySS90Y09SS1FYelNPYmdZamNuSXJacHQ2ZjhMQVowZ1I2cFYyQmJTTTNxdHpuL3A3ZEh6dTNLTEpSVVc1SnRMRG82bHlVQytGenN6VUl1T1VYcmo2SHVlZkdVNHhNMlNob3gzUnQ3blV5M1krTEU2dGEyWUxITzNrZlhrUjlGZFpoZWlaS1NHNENldEVhU0JjaFVBc0lvWW5BZ0pvSUZMQWhWaFB1TFIwUE5iYUg4RjBtYzdhNDFkU0psSGUwZ3UzZ2ZrQXpMZDdKWWk0U0YvREZKbUhOQnN5L0hGakxUNDA1NE1DS016Yzd2OHZpWWsrZ3FiUnMzT2hTakI3dTFxa3E3b0RSd0NhUUtocUwvc3dUREJXVEp6dW9GZXNkWEd0NThmM3JQUGpabi9NNVBkR2Z0RFJTWEducUpIeVluOFpZeUd3MGlwcHdQUnZVOXh6RnZXNEIwV1hsZUk1TXVHOVBXSmphQmovMHJQV0IwYmxsTDBKdDJWdnkxajFxK2t6ckxsWEYxZHArSWFjNm1ZQ0pjRDVQZXlFU1d3ellQcXh5UVpad1h1MGNIMko0NFhmR1Y5TDVwQ3ZNOEVHUlg3TE9CRHJyZnBlY25ESE9KWGhaN0VnS2doVkY0cXN6bmRPYUhGRDd6cFJzeFcvWm5yL0pNdWEzclZHc1YweWFJVXFYVHpJUE5YZFVsYWZvOUtVQmh5QnJhTnZnNHFqV2lJS1dZZ2tkVHlxZ0cxVEFwZ2tvYXV0MWIvU2lzKzRxV1MzR2Y0MEJ3WjU5d2xHeDZDdVdMSWppRTFPTzRHUUMwZFlMWFRFOTBJTStFYWRydVBYMUtDL2pHK2dzMWI1R3pVeUVrNlBhOU52Vm1Ud2tndmFFRG1rWDlSRStJcmNWKzN3S1QvWGI1czFyVGJSYWlKZ3NoblVUTmlzcmFXYi95bUZTNnVjeDJFMUM2SGZ6MEFjYVNvK1Y2Zm1ObjRMbEpvVnNpYnJKS28rczk3dVk3cVE4RVl6K3N4YUN4QU9LcWpUUW1ZYU90NitUL3ZNMFlkWkxWb2hJRDcySm0wcGw3WnpYUW1JSGNQMFhSZlNGdURlT1hzVm9xT2hEWjlzNS9zbjRLMmUvbWZUdXcxR2gwbzlYdVZBQ3FpaEhVRHFidURuMktLdzVwbXVjRU83c0RtMUNvWjJkd1Y2NGJoY3NVTGx4Zk1QTEh1UEtwZnE0c2RsaGpzemY5MGlpQUVtcEFXRWpFTVA1eDFhUDFuSzRQNG9tWUREeUlsR2NlVHZDZFpPS2V5a2dHOUdwM0ZyNTRuRVZaKzVqSC9ZUGxwak9NTzdLOGNVY0M2V1cxVDEvTTRMNFZhQUFSdVY5Z01BbVJVd2NhRzE1WmoyN3YvVmxKUldINmVBc1pkU3Y5dTN3QmxRamMzOHlTZEswTTAraXlJYXZwaW9CemZmaStQT0kzYnVIVnRIa3JVWUV5d09zbktzUmNsbWF1NFdkQ1U5Y1IvK2kvakVuQVZpY3dmRS8xb2ROOVlCRE1jRjRzcmpIZ3oxWHQ3TERnSEx1cG9LdjVLUmxWWHY0VGZHVjVpcS85ZU5Ia1F2blVVVkNLVzIxNkdHZm5mMENnQml2S1VNVVl2Szd4SmRoNm1WUEx6eEJqT1FQUFJzZk53K0VuQkJmOTJzdzk2L0dDQ0lpY2gzWG5PQmZyaXNldkdLRlcxczRLYk5SK3p6eVB1eHkzWms3VXhFa0s1enBWNys3Z0RCNkpNVExPSDl1UDRtVDB2dVdIRjBPR0xMWm0wS2V3dE00MlF1SkhVelZGU0wzVlJ6YUVmUm9xZzJVTHB2RENjWjl2WTRueUxDaEtKYm83Ui9BckV3R29FZldSWU9sQ3FSNThrYnJmNHY3VUUvazdpamovWW8zaVRuSjJmTWZaVmtMUG1RSTNDODI1OGdQMWtPS2tuaHRhU1Yrbi9CbktScWhpdyttTWFMTDhkMGRVeXNIa0JNYjhtVHJwNmloaXJDaWFWWlJ5Y2tSVXJ4dFF0Um9TakRiNnBpeUZ6V3BRMzlkQzlYV3F2cDJhQ1ZnQzJtT3RoUXNLNm5QWUFrd01oMFVwbVN3Ukt5UlVRSjZQT0VKazU3UlN5OThhSEJxYndieGFQTlkyOU1XRXpxTXk2cW53aXlSc2FIdC9qTEY5RGFLOGlodXhsa1VRbllOeno2RlozWUFCWWtpeHpPOTd1ZTV1Q0lvMk1CVXArWWlseDJZR1ZvUzBoRzJMQWRydmp1Um9OVzkrWnhtZUJOcTI2TU5lSVFmbEFuQ2tuWGMxZnZpVWVaOTJLNkFzT1NVT08vbWRjWENRT3d0ays0QTQybE5OSjE4clYxUTQrc0g4SW45VlVWL1lFNlhzbUZGZ0ZQNG1OSTRGdDN2aG5lYzFFblJzVFhGRFJyL3UwMHZ1VmF2ZDM1aUwzZHQ1MHp0RFg0OFk0NjN5YS9hSFNPQUl1a1o5SG0xR3l2akEyQW0zN2lEZW9XeDJXckNvMDJGSUhYd1g2b2xlY2thOVBkdDNCamRnV3ErYUduTlFPVmVYWFluQjhsQSt6by9mMm1uOWhCOHlXV3FycVk4WFlHOURycUZHSExKTkRjdE9aeEpoZ0IvdmRob2V1amNuUXh4NHlKM2duQllrbSt0VkJNbWNVZlVCRzE3YVQ3MUdMbmlvYmRZcGI3K2tiSThSZW00Zm1tTVQvYVA5SHNsQWxVTjdrY0tVQmVkYmxwV0NQY2FUMFZiejBESUxZMStjQ1R6VmFoS0FFbGpPWWd5WEl3QTR5ZzVZb3hRWFdJa3VoNjBFdHRzR2ViZDJDQWUrVnNXVG02L2xHdEc0aUw5Q3h5TmE0M0R4WHVpdEtaQ2ZRV05MV0cyZE1TZHlxak9iQnJObXRjMTc5MUhvVXhVRFRzNEV3NHIyZ1RZYUVxSTRMYVVSTUdFRjdJOTFXNmlTMFhzNERFZ0s0QVA4ZjVQYlhVb2Q2WXVuL2FwN21pRzFrZ0s0SFlVOTJWOE9WejhXRkRwSTBqNTlLYW1QK3FpaVphaytCeUNFYWRNV010OGZDM2VKclcxbGZ3QW5GT3FFODFMZmJiSjdqMmFrMnNzV3Bjc25MY0RtWWkrTitDVmdkb1VLRGRQOHU0TTllaDBxUjVzMk4vM29RTkkwZlhRL3FIbTdBVS9FYTVoSzF2TUhxOStZTlFwdzdOcjBCeTBIZWU2eWp4dkZuUVJBbG1jS0h5em9Yc0oyTllCTnNXZHpiT2xlWkhQRUFkTnhpcS9vMkJXMXFHeG05TWRmZGFMbnp0TUZoMFA1TVE5SG9UcTlRelpRQkRxa0tncUpsbUJnUEdPQTFQOHhKNU9lZEJXd2hUTFJKLzBJY0sxNUNBUHVTamUwTWRPRHpMckVudDF4QTVPM0J4K3pYUHJBL0JZeEczR3g1a2ZFZnBXN2NJL0VtSGtYaXJVTHB4T3h0NWkweVFnWG5wc0RXZmFZMVk5OXhWdHZQK2pOOGxPbWRXcEU4S1hJS1BSS3hvQmxwTk9FeXpSVkh0VXRRdHl4YjNyUDZFVERPOWdXWFRjbk12UUtUWGJwM1BqOHNoRU9CRE5WbTNzTFRoMEJ5VU11eG0ybzNEdWl5U0x1NHJuakk0c1lNSFhQZGZtQWJVV1oxdHZvS09XZW02RnZxOEI4Zys1elpJalE3UG41NG1lZnp5M3pSWE1VTld4Y2Zid1kwVEhxVVpsOTc4UVM3SVlkSTc4LzhCUnBxRWp6Z3QyeDFVSC9JbWU3L08yTUlKN0IybjhKLzJsTXNDclpIWVpmMktIZEJ6Nmo3S0tVS1dqbEdYT0grWDNNenFyemYxdXA0dXAvN2VwMkZoKzlzQ2pvMVVRL2NFNm1CeW83RTVOQ2U1MTl1cmE2MFRGdmRJYlowUGJ4ZUhXajl1cytpS2RaaldKTzRGdXNITmxscXNnaEJhSGhPaFlqeUl5RHZ6QUFUTWowL2VPSStDdE9UajFQYXBZMldhVXlPWFhhbnpHVXo1Nnc1RmovUkhEU2w0N1VnaElJWUUwQURTV0RGMFdoZDRMcG9BUWpQR2c2L3BHK0lPT08yZkM1dGxOVis2SGp1dnljRnhxMVljMStKVklUNHdkUGcxTjlRY0Y4U3VyQkpLRjZoSkJGeW5ZQUhNMyt0c3U0Ri9RM2djYVNjR1FGWVVVNm90QXRJYUIvMGl3WU1DTWRhYXZGSUZSS1FTNmxNb0t2Q25CODh3MTkrNnd3T3BzTzdpVHg4V2RIWXZVN0xsUi9SMWNaUXZXRnI0dnJtQkJzdzhWRk9UcGdhRHprU2IrRzdFeXF1cmVQclRIRTc5RTdadVIxbnFWR25FanViU3pabXMzQmlKdkRTNGRHOWpwbUJvbVluNHVncFp2aHlBT3QySlR1VFZraEtMcG9QdVpXYjhRdFR5K3BYakNnVHcvelY2MzNsWTduc3IrT0lsbHlTVW1vOFU0Z294VHJLOXBoYW1Tb1plQ0gzeHpUTTc3dmpEU2lESHFuSHcrOW9yM1Z2cXFuTXV4M0Q2bTFXc0xQamFyaGRMY2lyN0t1VW5xeEYydGwyQnF3eUtCeGJvV0tPcHU0d29Mdml1MjU4K2ZsNVE1UWF3eE90M0NvZHFaTHJpbnd4M293c1FObFRqQUM3QlViUUFhQmVZa0JJdE42a2tPcmVaTjRsU3U5a05xdk9GY3E3WmlGbzFoUkxiSHpac1RqTWJsd1VUN3VJUnBuNDBjUzlDdVo2bEtFSnpNOGkyNmVDTU9pa3dNak5yUkhHM0g3R1N5WUxZUWthRitzWmEvVm1PdWp4MjFHRkQ2b1E0MHA4SXlnMlJJY3h1TW9mOWhYdHNOZERDdzhvN2luSVhTTGlTbGZDOFJvenJwc2J3NlpIdDQ5VHFrVzBQblZvSVlFVHNRa1l5ZUJnSmo1dWEvbGkybGdvT3RlUHBmRFlRU0lMbnc2blNhUWpTbWsrc3ZDbzE0TUsvczB1YlRCdjNUSUFkamlPWDBicGMvbnFQQjdOcGJmM2hQbmI3WTYvTWVGRks4RTB0ME5BaGpBTUpQdVpHK3hSa1p0bUpFYmVYZUlZQXJtUXFiRkZXUlFYUlRmVzJyN250Qlc3WE9lc2F6ZGdrS05ET3R4b2NrZlNCbnIrNDg4SE9VTE8rVXlaVTBLZHpGSHByY2Mvc3QyMWdQTkoxL0ozeEsrM3NxaEx0V0Y4ck51MEkzRmNmdHE2UXF1N3AzYk5yc0VjY2poMGFRa1lXZ3NZdldEalFWYWRmRE1RVU1CZDhzZkMzNEdwc3pqV0VFNHYvbU1ueTNZRUJuT0V6Zzg1T1crREtuYk9KR3h3R0dUamMvVDh0UFRjY3BJVXNOb3V2Qm1pb0FlVGttOE9LRGxoT2lFWTdwMkdDWmNxUUhZSmxZWDAzakZjc3pLUjdRSWZxNGpaVjRscmlpQ1NDYjBTSFI2YklkdElxdngvZ2lkUE5IWFZGUVI1NlFoVDE4NkIyWWYvUlc0ZXhhQ3YrcFhxMStYbmdjN3pudHN4a1RwUytJVmVuUVdEUytxdDhwYnpScWtRVFljakNPSStmZW84eEJFY1M5OUg4U1NoOHVOSEJic24yYkxxWFZLMnZxS09MMWhFZkhuYzMra0VhQUcyRUY5NjNXUElXaDhtMnJPTm14ME5yV1lIeWlDZ3V5ZmI2RTFkYmFNSlk1a1BpN3laSzNQdkp3V1ZmM3JleHpKcGFTYUUxQkcxN3V6YmlzR21IWFAxZVBPU1BPd3ptOG5hNnNkeHdqWTlVYXhNUjk4eERjbEJTeG9nQk1zMnlzbVo2K25RTWZ5NkRpVDBIa0w0VlAweHl5TmFPVURpT1E5akZZWUVTd1FLMVp2V1NSY1R1dXNmWnAwRStrQ3V0dUpXQll0ODJTS3MyVVplTi9yRHFFZHFwSXpveFozZThjTlZIMTM3ckV4bDA4TW1FNktWb3ZYanlxa0lrNU9SNWFUNDJ3OEd0b2lJTkF5dFFsT0RBTGF2L2VqZFB2SENteThlWmREQ3JtRCtSSnF3ZXVsZ3FGcFAyZjU0UVd4b1JicnRydkE2czREWks3eWdBbklIWTVoV1BhNm82dDgycGYwQXl4Q3lzenRIZXRPQytxVmJFZUtSaWFKNnMrNmhsWDBTV3NycDNwTk5Xc2FHMkhIY1l5a2tBb0xJRnhCYS92UzdUTWdQSElOQzFnT3RybStMZDFFR1grS0d5RDhERmhROHVDcFhFTWxyZTBObWhoT2FyQXpmd2tZUlRqMThzNEpQMzZIWUdwRjZLVy8zTUd5L3lOTXQ5ZjBOWjhuc2hCM2h6dXJ2MWd4QnFCNFV0WS9EL2NONWFMakc3cnl2dnN4RGw1OGFpTytEQnhGYzBzV2V2c2E4SEM4Z2oyYzBJei9jc2ZOSVhFL1ZCOHE3QUJVamRrbUxId2RrWDNCbVpEem5QbHRhc2ZSTGJTNWMzT3pFWlZ4VEdNaWhNUWtscGh1OEZjNjBObUxmOVdGTGh5QTFVTzh1QVZ3THZETVRJV0tsTTMrTGYrdVdkdFRUL296U1RBVHI4MHhUeFBkVjhNTmVEbWtTeWd5MWtDdzdld25rcUpHTFhRU0hRYkQzTUs2MG92dFZsUlNWNWg3ZkJOOS81bnBUdW5HemdWODFkU3R6RUdDdHBoV3QydS9aM0x1d0p5YXFtWThQNGlucTBSTjBiMWJkMVJQek9ZYXBkdDgyc0haSnArZ3lDWGR6SkhIVGhOM3hoWTN3MlQrQWkwMXVQZTk4YS9VOFBocituWlVKcHhtOXVpMzJQR2tvbG5jejdWTkhpRzZmYXVaQi9MQU02c1JTcjRWYmt3K0h2ZkxuRjhydVZKUTV4bmJyclRWdUhEa05RY2ljV2NyRFRrZVU2UnZ4SG9yS3ZyVTVqZkE4UEx3ZlNaZVowdC9DME82UStNT0pTZWxUdXgvZXlhbjJEU3c3emFJRGs1TW9UdzAwaUhzZzdmY3ErRnJSTVRDZDlHNFBDQVhpcU5NSUhFUlFlekMyVlpmL1lKdG1CMGphZ2xycTRZb3cyV2FucVovaE5POTJVRnVxbll1blMyMFN6bmVPa1hFcFpnOWJ5MStyaGliWjhndE1FQXpMbkoyTWhqcXpNbEJXaE14bmxTQ3pJQ21QNXhBckFNMkhqT2J3S2FQOFVwYlphMTJvdVY2Vlkrc3BtWnk5bm9WQTMyaS9sbmNJYVNrNGZUVThJbmFuSFlGeXR2K0gvc3Qvc2c2U0JIUWEweGhIZkxxamQ0V2JpOUJMOFl6ZzJJWDFqN21xQksxMlRaQlB0VXJEMkhLYWlRcVNvV2VlZ01FU3ZySVBnaTMyVXhNa3B4cFV6OUVMaVRXZjRqTTJWU1ErYTZrVnpuNFZDOEY2UUNpa3Rmdk1aQkdSYjlpVmlNSWZCMHVmQklBcHFZTjByYlJLVDEzbUZYanJsbFFwcG5ONkEzZ0tFNVpIWG9CZFFvcUhJbmZPVWhneG1yU0ZHM3RHaW1kTUY0THkwVXQ4RjFQeXJlT3RHQ2JLMGxCeVo0bi9PYjJ2cS9GeG9zcklVNjFIT1dDckI0NWkxeGNTOEtpNWFGNW1SYWpJN0FHSUtzb0VucUtQeGNDVjh1dG45YWlUWjEvOUN3WFdtdURLMGl1UStORnJualVxZUJUY2tMYVBTYVF4NGh5d0ppNG9PNktGUDNXNzNxVkp5TTNQenI0MmRCdHIvUlorRkdZTVJtbEpQVWdxQkhkRXRBeC9LR3phZzJOeVFBbHI4d09nL0FjYUxVQ2M2bGJzWUk4aFpERnp4OC9jTWhHN291UDIvUXhCUzd3U3MyZHpHZkZ3OFNtZkNQUjRDMzhOMTFWTmpqb0ZQRXdxSFoxWDBUZ1N1K2xPbDJUTFhPUUNsTzdZQjBJcksrSkMvb0l4MkdscDV3UmJOQ0NMTkc3Sng5RVRsZFFzRE1uZ25CY2I4eG1kNlVYZkpCNlJsbjFLZHd3cU9PWHF5L2RxZ2RudEljMzEzMzlnNVB0U2RGTENkWmdET3JTMGJSM0JVcWFsdlpna2FwaEpCNE5kcnlyWUtPWmYzbmI4TVorbmFYdHNZa3N0bHFOV1NMdHlwaEdlN2xwRUFFQkgrdTl2Q3ZGUEluNWlHVzcxRHllRkVVM1B2dERJd0xBRFgza3hlem55RUpwYW9aTExhNklybStubGdheUdrUFIxRHo4MSs4UzlzV1RDalJEemdxMUVHNktUcWdWVnErN2o4RkppSE9FS1U1bWtPRFV3alBya0JaTXAvTW9NV3RiWENQUFlmd1RJTWpmQzNydGhTOWVkanl0b3VGMnN6M3owVVVsVGtRR1hEVlZXUExLalNXc1pOZzVwdlFFNUQvSi9ZQmZNRkQyOENuOG1zR0tHa1FuTURDcWVQbGtrSTF1d3Rtb01JVVhYNkl4VU9VaFA4Y2lGUFhoMXVJdUFHa0RpcjA0QkUrRGFiLzhHc2lqNHg2RzBTaEVWSkNYVHpBelo1eTR3ZlZTQkd2cVEzQmR4MnpqdnRxUEYyc2I4WUV2QWRITHRiTWRjODFRZVNlbngyR3IvVERSUm9xeW1HSGRYUWVEellITUdlUGhyMjZHMGpVbDA3ZlZETDhta3h5S3kreTNUMFlKekM4TzRlWEpOS3liWTBLYVZ1cFYzOVNQV3I5MHlnVjNCN3ZFR0VSVys4MWthVzNzRGJOb05kalo1YytxeXl2QkRRMkhQYm1ROTY4eVZuMk1MK1NPaFZURUNkNjMyNWJmUFV3Vjdld0Erb3VVSHl3RUFTMFBYNExhTGF5MkRlSDFHanNiWVU5RVlJVVM0L09CNEJER1dreWZQTGs2SXY3b2ZVclpwYnlDSkRrSTFoQkpNbGFZM0cwalVCQXlqVkNFVUViZVBrZjRENGhvMWxvYjJOVzd3UUpSM0x3b3Z2c0lRWTVnMnczWlJBWUN3VE5QNzBRK1ZETzJKOWxEbC9BYis1VWR4YjkyODNFMG9PYzQrRS9CSHJxekJIc1Y2b1N0bk1OczlsSzdUVThsRzhheDNoU3hrR2tSQmdZM1FZaXQ3ZUdkYVQ4UGdjUGhqTjZMTDFTb2pBN013RmNhdCs0T3cvMlNXWGFpK25JMEgvWU40b0NqN1FVOUUwczIzZ2lqTTJaOGRiUHptdmpNU00xb1QyT3V2WllpQjdPM3lrSVUxVkVlUWhpQ3V1eWxjVEFQS1RzWTM1VkhnbzFKUEVZaHM3d1NrZzVLRXpDc2k3SmdWa0dFdWhMeEU4Lzc4aFhTYk9FUk9PTVA2VnltNzVrc2NxRjQ2S25NOThLVVgrVWJSTUN6SG9BVXdOU3E3MmpjTCtTam0rQmtVYnlZZ3Y3WXEraUVtTnp0U1Z3VEV6NytBcFhzK1kzQzlxWHNRUW9qTi9tWFFBR1VTcWFlR1VMTTBZaFpwVks2UU1jNGQ0Y3BpeFIySjB5R2E3Nmczdi85QW1FQUVQVUpwcFIvYU1BOERLUDdUVC9KS05Qd01LMlBFTjF2dzNIU2tDVmhCNVRYWk40QVlqd1NTV2JlckJVM0ZoeUlsenBUMmFHUjE4WFZITTY0WDYzVW1SbVpLc1dYMHFaaEsvQmtUaGRyUEtOUVZUd0tzQkpRVG93UERsQnJPZ2pST2dJVUo2OUtkOTlzSTI2Ym1xbEN3VEorTU94ZDMvVEd4Ti9OVjBnYmVNRnpBZDRVVUd6dmUrcWxlU2hMSW5henRjM3ZyQ0FqbWp2MlNRaXN6Q3Y5SGM1ajRqaGxPWWpSTndsdHYrY1FIZWczckdxNUJVcXdCbDR0ZGh0S1VuaTMrNE5aZDFPbUxHdndvd2dnR0VORXJsTTNjdk9MeVJRbDYwUFVOYm85VFJ0RDE5M2liVUZ6V1paUXNKM1Q0bmdjcEl2bFJRcll4aXNoUFlieUYyVENzQ3JJSEpua3R3b3EvaDNra3k2WFRYcnp0M2J1cE8rVnZ6ZGJ3UUNXWWhiRjQwam9HVFdTUC9rYTd6MlNwcXBrWlhJV2xBS2kzZUovMnNkU0xZL0hxV1VjUjBZeEZLN0ROQWR0VENkbVRhMkFVVkMvRGF0dlViNHBCSW9UU3AxMEdISVdwUXRqTVMyRkhuaDg2QXQ4dGtJTTBIL21kVVFYSzJKaG5tZWRzdkRza0tSR0tkVXNFb2xWVW9mWGtYblZGR2ZLbEpXSFBiRS9xdjNUTFlyQmt4TG1VZCtJQWp1Rk9QQUprMytBVUNodEpLOS9nUTlyL05ZR21IVHNFS083RU9OU1VXaU9EODZhL25CZUdLeGV1ZFE0QitOSzFtYVAxeXI3cDMwTHBLWjBzRVRtOURwcWhnNUxrcy9RYjN1U3lEQ3hIWEh4NzlRUDBsRjJJcUpjVy9qNE53N0VLTkNvOExKRDBydllETGdSdUhrbWU4aUtIK2NGTmh0cm55ZlMycDIrZEVMM1NRaXdlU2lRSHdHRkY1WVFOSW5TVG5WeVU4Sk43bDhnQk55elgrSXJFTzZFZFBkZjJZbk9qc1JBNmRuWkcvaHN5TlNxak9VblEvSjVodTQrbVo5SFNFZGRGWDJPZTc0aTkwVVdWOFJXLzFmUTNMSlNEVWU1Y0RBbzJaVHBVMTBTaFRqYi9HeEZUWFUxQnVtN1kydE9KeVZ2aTNzYmRPRDNNS1hrNXM1MHVMVGgxd1VYVXpKL0xMMWpOMzRMclJmVTBpcmNoUS9tMzBjNEpUOC9KY3F4RVdBUWFJOVplSThrRDRxcUtVVnpTSWowa1dGSzhLOU43QWNWVWkzeGxlZ0NuYjBCbC9VTzllN011eDU4TzNxdDVjQmZ0VXB1WXh0bnJWdXk0cXUzTmp2bW9xRXlENXRTcFRFZ2hEdWFnbGlEcVB5SUJHWmJrdExSbTBoSkdvSy9MNjZWTTM4Tk9EMmVyRTN2VHBBVjVicVI2Z3VIcUgzeTJXclpCQUQzVEJNa2ZYVXZ1MUYwSzNrK3U3UVZHeWFxaSt3MktOOWtYVEpoZFhVWXF1dG1NMzRGeCtESnUxbWlEQ0RRZW9JK21DWUNpYTZCRStsY0JiOHV6ZkpHa2pvdEt6eEVmcWZLRkFCUEVFaVYwRlcvYk4rSk5jM3V3SkpielhwRlJRaWlXb2RORTlEcVA2VGwxcDNnYTUxN2d0a3lRVHloZk16MkZicW1JbnQ4Rk4wVGd2ZlJlR1dSdm1CWlB3bnFLaldkWnpraWtUdDhLRkFlTHRndE5oc3pHSm5LWXRGUVpjeEpGd0RLL3dTWTl6Tkk5QWpiL2JheVpML2d6em9vVVRUVGJWTkp0TEF6bmhUVzdHZ04xUm1LQit0RjhCYmNhT3FITmJaUnhRdjZYWHBTcjdINEZrTUREdWVWelV6aEp6a29hNGdSMm13WHIremFTb0hRVFVYTlJ2Vm5ib0VpOWo4SEx5U2NJVFV5QWxjd0hBUkladkNqMk1TMEVqWGtZMkNRV2RaYkxYdVNKRUpNZEI2bUNsOVJ6b3lCdG9XUk1GNEsvUUZEWGQzeUNPdS9DRktkcFRmbEtCWXhVZkZUeTJSb0dQYy9PQTArV3FTcS9ja0IwdE81VTZPV1NYS3BJZjhuZXhXK2tsdXFMU0JWcGs3MnAyQmF1MURLZGlUQU81QXZJVEJNUmRYRmVCY2ZhODIvSkRyRGVvTUx4Y2VTdm16RnBuN044dUdwaVVNbXgvaWs3UWQ3YVhBL1p4U0h3NUttb3lqS3FRckFyUDBFQlY1U2tYT0FFK0lmZ0RORHF0cC83YnZUc21ZYW1GRjRkUTRhcHRka1d6V2VlcThIbUREVnR6UGhLV0VtQ200TWFsY2Fqcm1IZ2ZzUzF5WFdGaVNnS2xPeFhIN1IxazZGQy93QkhpK3l2eUloYk53Mk9jeGVObmIzSk1ueTdBWWhnUjJKaFpsTXJpUkh0dkFkcjFHa0VkN25SS2lyUHhxMjFudWxIUDRFTnBTTFdNT1ZTQUlWd3JFN2tBRitEWEl6RDQ4UnJtT3NkTklsVXdaZndGUmY2aUk5Wm1CYjdNNEpNUHJHTEpKQkJVR3Y2QW9aOXBSRmpRY05FSC8yNzZOOUg2MTJRZGM4MjA3bFJZZFVPMFJKN2dQanA4U2tncTFPWUJTcUVkaVR5ZnNScGVOanJaUHJ6c3p0YXNaQUp6QWJkN3VwaWRXZ0xkTVlMbU85VUtBVWR0WmpuS2toYktxeC80UnJHTXJLM0dwMXlGQ3dsSVBYTTk0RTJrYVM0eFZsaU9hb0llNDJncUY3dEdKUWw1UzJJS0tjM2pyS0w5dWYxSzI0blN6OGRUTDVKbFp1QUluVjZzbkVCM040ZE9TaEJQTjBaVi81WWpraHFzV1dkM2xyQXRRVEhHSnR1amovbkREb2J0ckh0MU90TFROdkFHNmVFTkJKV3lqVTBtWlRaZW5JYklDNDVBVlFHckhMRWZFRGJxOFhLck9YYS9OcW5mYlFUc2kwbVNuM1R0VURVNlR2RFA1QVlZVnUvMWh0YVY4Z25GaiszWGhxUituYmo4dm56dlZpOWNlT1JyRjBBVXdUSFZRRE1pVW40WmVRaWxHRWFPeW1TUTZseHE0cm9MbS9GZEhNS01naHNoZTNLYjlyVzhhT0k1SWVnMWM0cCs0Nk15NExaZHZnNWhhU0ROeEVQMVB2dEEyNWI1T0EvYUVBV2xGcVU2NmUwSXM2YnJCbnhUeWRacmoyWDQ0eVd6ZGd6eDBjQ21yTjk5aEVKUXBoQ2V6cUU1SXpDcFpoMXlNRTdYQTRmSGV1SzJ5OEpKckIweHYzcm54WHdxRzRzN2diL1dFVFZYdUxGaGtIRzYvaTRKREV2VSt6NHFvSnErVUxPSnE2ZVlzSlNvUW53QUhrejhRMndQeVpOVG9KTWtXYjZKdVFIT3hGTlgwRElyTWdGZ1NhaVZzai9CS2JRV3U2TEVneEVwZzJIZm0xRmVPVzZ6K3E5TitzZ0MzR1ExSjhkN1ZWelRORFo4L25CQjJYYno1Z21FVEZzSUllWlR5QXNzMXBuSVJrWm50WHMrWnBBMHRSN0pFYVNCSVprR1EydGhBRC9OaDVyRnNpZE9LREM5dHBUd3FDNEtXRUNieXNNc3JhcGh1QStqOHd0UERYUTRmSEU5YWhvZkRSUEQ1a2toRTVjczRqY1NSakpMWjBUZE1JMUtPTUtQQ0VzRHoyL2VpUXhGNVJubU9KTTRNT3M5K0d6QWViR3FUc2tzU1pxbDhGWHJaWFU2K1hMUnNlc3E0c0tldmFHY2dBK1FRbzFEWWRzbVVhMlJ6ZWs4ZGxaeVRqUklvZjlZNmg5SGtNeUtJczQ2VGl6NW5hdDFTV0NONUpxL0dJMmZkRGtodU0zYzV1c29SZElEUkVRTlNvWHFtWjZpeEMzTGlUNm0zN1p5dkc0a01GSW0wRG1SUDR6cnpSV2ZBT0VFU0dPcXdva3dwMW9DV3Z0ajY3L2JTTHF0cHcrZThlV25WNTNXdTl0ZVpIa210eUp6QVdONHl5eWJPZHgwaDNoSGhZTTB6ZVpMaHRXR0ZoSE9QRnI4NmZhL2g0NWxCeitQbFRUbzFYN1VyRCtGV2VTN3l2L2VraU1EbXFxWTcvU25zN0JYcUd2UXhkU0dYWVU4OHBHNUNoLzFpRWtwOXcycjZySERGbTEydjI2YkZNalBaODZVbGdaZjFoRWJtL01mc1JHTEpUTjRta2VSWEhDRFVteTMyV1dmQngwL2tBeDJmR2pVUTZucVRGQ1hjaU5zb2ZiUVRlTW1KNFhqVTh2WERlanRiZ0ltRFZnbllsRGdUb2hiZFdhY0VYbkpNNTV0OTI0OWUvKzl4SDl0bCt5aVRtUzcwMnRQUWYxYVlqaUpoZlp0aFNMUzJrODRmZXJWc3FINlVTUmIrM25vL3lHQTQ4TkowdjU0ZjBFaFdFd0ZTaVZwbzAyc1IzSmNzZldCRFdwQStKSklzOWNNaEtwU3U4V21DbW50WHJDT3l4eWR6dE1FV2JGSGVBdGtiMWV5d1BOeDV6RndvajFWKzBacEpDaDU4TWU5NW03cURwNVRTVDlxVmc1M2ZjS09WVTRWYmZZMnQyZVBRTC9KbWRQU0RQVnZEZTYvWURyMUVORjluM2tkam4zNEFDL2t5dEdzbDViSFVYUmY4eTNKeXgrcGF6MHZoZ21pSVpqSElSZE5OS1hudHVoaVNWNVUwa3BWRjQxeERMQjQ0R3VMQTV4QiszZWExb1ZVQTJMQjJySktKdDg5dHg1eHJlN3RudEpTaDZGZUI2bWt4UUExaHlpZGtxeFo3QmRiWldvNVVBUW9nRlpkdW0yQUQ5RzB6RFMxUFVvTTFTQUtVK3Y2T1oyekkwS0dUYm96elA1Q09qSFVyR2xTRWFSS1lWdHAybWhSYWFYN0FUOStVREpSN2x3TTRVYU4yZHd4MnNUMnZQaE5oNVF1ZzNUM2JsYzlseGsyaVJheERHM3RVREI5Ri80QUVmcll0THlkTllPd044Qm85U2x5eHFtRjNEZWQrcWxPbFNSKzhUd1hQWkVKcnlJc0IvQ2hJbEovQURyZTVpQWFFZ2UzSUhIRHEzQ1FkdGNqbm1teW5wOE5JNWk5bXFLdnl0WE9pcmRCYWlmNHdVUThyVWxYVDJWUFJxSnh6Wno1SURFd2FXMkxEZmthNDJtbEdibWxSbTBvaEt3RUttZDFuaFJDTzl0N3JwMi9QcGpxRDV4amVPam0ySjVETGdkaWcyL0lxNlNJVjBJeDM5SEZzTGtzK3BETHpORTEyTzJvRVdVZXkva1ZkeEZpdDNCdHY4cExRaFVyOWs0OGsrcjFmWmxBOWF0Q0haTysrSEUyTUdxQ2IwcG1uY3F3SFUxRGswL21aUlN1S3BFQkwzbFdjTkJuN0ZzdHJvNlh6NHpIcFFjQTQrM2xhemV0MThuQ2s5YnMyd1d4blViTnZCRFBkcUNJanFjbGNvZnBReTNUZVltWlhMYmtnUjlQVjg3QWJraGNpbjdhK1Q1NTBRQ0JoWXEzKzhLR29rbzNlTThITTIvencvVVFSQlBkN1RsRk9NWVJzWFBxWmxubUhEaWdnOGNRRnorNkh6anlzbUFseEhDc3U2V2lyTm84WlVJU1NsVWdZZXJYM3YxaVJ3QllUbU1BRkpuVXR2U1YrbElNMkFvandvSDdnbmF3aTBYUFl4QWxLZ2tTcG9rNjVicTNrUGpIbk9Oa3l4c09seWY5bnliVllVRVJDOXB0MGNEUjhZSUZSbmRxcDBzVWh6NnFnSDNRTjYyZUluUU4zWHNvMTRzdmdzSXQ1d3htSnBUTjNURFBFU2orV3BsSzc5OFM5bkVXWHRJdjBXSWlINkxrbHVISmJybnkzY2RiT2U4dExyQncrNXRiWlNTY1hnZG1Ub3pQeWNHV1doQytPTWJ0WXU4anRnTFplL0U3bDNvWjJhUzYweEJMTFF1QjN4OUlIdCtpSDZURitrR0Y5MkdQaGh0VGJoWXRnaWlFYllScktXa0RDTlgwSllVUU5ZZC9FMzZvb0tYbkFUT1MrUGl0cHgvOG40ZFloS1Nhamx2KzBuMWZaVlA2TWZzSFBvMlF4U0tFd0luTDloa3RnRTB1QjNoRGk1UEptaUh4YWNkU1pmQ1BydmRRdTFwclBWMWdibDUvek1FZWphcllYdU9qUmo5a3NrWmJFRHpObHFRVHU3VGxkb25zQ1FtMUdySmE5ZEt1ZHJOOGxSbmhrVStOd0srVXJjVTdzWGRFNmhWV0lBb2doU3lCYlNELzE0andpcjZ0YVNQL3dpZTVuR1pramhpaTNIekpETkppTXhNY1Z2a3BmWGYvRHViU3ZRVzVvU3dCdy91ZzR6SWRCZzBVY1NBS21peXZ5RkZSVlhvMlFmWlFwL25PR3pZZTNzRlJ4anR3b3oxc1FIaGFleVRVZ1UrZFllR3NnY2daaDVHZWw3VVYxRjJJYitKWWZsbHl0NnE1VEEzY2FXSktxQ2lNVW5wT0RvaWRoNnRRMEE1TlNsM3VPcnVkMmgyVE1sb3VjVWJGTVlhcitIVzVWUFk3amUwOFFFNUhsVllDeDF4Vi9TNHpPejNqZHZGVnBHUlNqb2xxUms4Z3hGaWJ0TC9KTXpTOWNvTUdMMWRZRVVmdDIydzF2Z2FjTVZVZkFrVW1DaUhEYmNBMytjcEhnTGZHNFRuZUxNMmZCV2hjbUZhczVOb2ZBZ0Y4bnN0MjRBKzJ0ckVWRWM0aGVLTW1FSHBNbXlrcmFvYWswSGhDSVcrVHBRVXZ5dWFhaE9mRFZBNmMyYnN6UlY5SXpiNXRYUDVydlBUSHZ5L05LWGNOenZTaWYwcElPcEZhQjlFbGpaeERrNXZCS0dXSGVxSU81TVhOd0hnUnZORG9XQ2lRZUNwZzh6ME1GMnVKR3haMFc4OThYWWdNQVk5SFVZMjZZNnRZZGJYTDV5S2dmb1I2NXdobVJuNGh4Y0VnNWZlU0gwdU9XUzE4a0VBa3JDTDdtS1JPcEZxc2tSTVJwYjJhaXZSaDlLT0ZXRHV6WVZvVGVUMnlxaUlQK0tIN2YyQXFsV09KVnpPMnBxR1ZrMHlQbm5RM3RkQU9jL2V5YW1kMDdpSDlJUkUvcE1mdFVOOXduKzdxcnBiSFdxQll0SWtydFVaUDJ6Q28ySjhhM2F6d3k4UmRtbUFQaDdPejROeHl0dVREK3FCc243OC9Gdkp2M3NrUGJyL0pVb1QrcGtVOTFGb2hlaFpxOVdzVzNrdTRGY1BjRDdmTGVyZURmTm1ZRU5pNXI1ZENOZHpmNmpZUFlPeHBGNUMzYlpMZEViY1FzdUFmWXZEWlpOUHlLVWtoemRQRGUzMGNFcFJEL3N6Y3p0NFlGWlBEWjA1Z01OUzZ6cFgrY2FXVU42dWtzZEUwY1FaQ1hmQWkxT3hYUlhJT2VXcTJwd2plaG02Q0VJcXdhWWRwTy95ZGNVclArQ3FwckpVOUVZQVNsdWxLZEFVL1Y5ZTQwbjdLV09uZWtCRDJDZDNmSVhZUjBQekkxNG5GQ3ROeUF3dWZzdDI4d2cvTUNIWThWMFQ1b1djeE9HcGZ4T1hHK1NSMXlkV2grRnhtNG9PaEpvTWFPWWx4dFFNSE03ZmRHTWVlakh3YytyZm9KQlhsLzBtbkVkZ2ovbzk4NWxzZFVSK3cyakVKNzRjWHQvdXdTbEhKUy9ZRkl5WWRva0JVUW80dzhObUtSZ1BJYXZ2UG1Eb2JvRnJUZ1NZQ2tiVDgvV2Z4TG9NTHdobjkwTGhGRUg5WUlNZGRUb1dBclRnYVJPRHFacjNlbUUrUmcyZXZFcmQzVkV2YzhjUUUrTGQwYmJSTVdzanJ1VlZPMGhUVmdlcHM3a2pmcXVmVnFDc1FyRDlSMWtGb1RTVzJZMndQeWtEanhZMUNsekRnWGhsejJ0TldTNXR3VFA3cWxrM0tjMWE4d0lkOVZiTFFUL3pqY2RxM3dxNDA4SHQ0L2N2aUVEMGpGQ2pqa0xwdjNZM1RTSnlxOXF0TFR6b201c2dtZTMra1ZUeTdqU3VoTG5pQXF3QmJPVXJxRmhjM2VHbGx5Q25jdU0ycE5kd2Yza3FTc1c4a0ZGSHpPN0d3eEJJcjRiVzZuZVFYL2xwa0NGaWlOQW8zb1JLSGFWMVFmRXNHSGpMUDZSYkhPUXRkUWppcXpINzdnUm5XRlVwcVNjdWdDeSs1QzVTYVJBWGV3UFlzZjd1emZCWGFsNlFPNGI4NDREK3lVcGI0RGhlUFRseHZhVUYyUGJQRTR2Z0NjaU5MUUhmQTNuc2pKUkNWSjF6dkJ1ZHR2Y2ZaTFYvMmpIV0s2Z0VIM1BhZjhCVk0xNHlWT2xQQzNqYjczeVRaRkIySDdya0lsaUg0U1FvdCtheUlsS2JHS3VhamJCdXhUOTMxaklpaHRlVUZseTVpd2k5bndxaVUyR1hJSkEzVXdmd1BZRjlqaFhnVjRpMFVDTzEwS1VQUndGQWJuTW1nVHZkcUpyTkFEUGpwUjVhMHdFSVNoYjErTmNZOE90NXlMYlIzQ2RTa3dOQ2lSVmVKNUFTQXgxOEg5TkpVR2NKRENZQjc2SWZ1MEovZVJqSENxUnNmcW9nWEMvNEZWdDZhcE5zd3BaQnVHaXg0eUF0ODBYMVF1a3MrZnMwVkNHVEtNaGtwbTJ1L2JDQmNSQXdpUFNkTFJJV0VYQnNER2c0ZVpGenI0U2lyZGJNdEt0US93V3FyU0dIRldlaVE5bk5RMzFQN0dvQlRNdHFrd0xWV25HNEVtMEx1QXhyK3ZTTlZqczVlVDJ1dFNwTjFDeGx0L1FuQ3IxQVBvS2s0Y1NmS1VGMEFDajg0dnQ3elpqL2pJZmFsaGlrUEN5SllDaDl4Uy9YR2ppNndFVjc2UHVkcXUvaU90UGV1ZjFreERNbm1CNlJjWVNtUnNyMk1aVElzd0JVTmNRT093dUR0WHdRWFNjazJHTlU1dVVadDdsQkJDUjhCMzBseUlEbGtBNVl4cDRLbEZQeFhVallnMHdCU1FRR3hQQlM3UktSZ3gyREg2ajlPNkpiQWNWS0JUcWt1NlIvWUllYndVV0VYK2JEY1NtbmJxNWRROVFrVFBJVlI4NG5kUlRIS0xIUXJSQXhmU3JpTXJYNlJwY1prQVZqVFNqbVVmRVUwQVBHVm9YV2FYNjRibTAvNDdTdXNRelQ3bHROTHBzckVYZ2JSdzdtb1FYOGJYdUJWWktMUis3R052S0JKYWRSOGNDZGZnTm1hRjRMNWlyc2pNckdySS9OQjZuNzMrZ25VZmpLMnJJMURMN3lPU2Y3ZDFIaFlJNHFjRGVVVkhlcXNONXo2TTBwNnJqaWYyS0RQMkdiSTU5d0xRY3JzMjNTSlJERk5OWXhpKzJMTmRwQ3FTektqK2pEQmFtR0JVandTMnBBNmErYmtkQjliNVoxUGVzaG0rMjhKRnpMWEtFYkk0T0dOUlZuRDFGcXMyd0hBWEcvSGNvbllzbmNWbE1UM1cwOGZzOWk0dVlXek5xZE8wZ2pzOGNsMHN4czhLWEprM1VYTGszWHhUeGQ2UGdZMjBLakpmQjhlSldRaTFuV0ZNOEc1cUkyVkF3RCtDK1kzUFFCOUIrNSs1RXdVdDRSYmdzYXNWTXBVY0JORW5WSERQdmQrVDBjYnlFdEJiQ01DU2pndnZmUUZFRFk4MUhDWFYxV0R4eGttTGxZTll0Umt3RnhsQ3BEZUUvWHIxQnBoZUFFWFVUY3U0NHBBZm5xb2dsVUs0S2h5ajc0WW5tZUppQmF2b3oyekxlcWlJdXlwcVAyZ0I3My9vNlJ1QUhBbnRXQjJTWU5BSGJWK1dQdXQrTEkyODlYTm5rbUFITGpMNWNURFNhY213MS90MzJ1Sm50WDhOWHloVFFGaFpZSGJvSWFXaUd5bHgweTlFNm43VjZQNGovTGEyN3VHNTQ3YnhMYVUzSU5rWlBvT3I4RW5aRnpBVzFZdnUrOEwzaW1DQWNYdDhDeWx5bG9RTlpSTXZsRFZCKzdXYSs5M3FLcTRlbkNNQ202Wkt5MDg1K0FXSVl5QXNpcDgwNXRadmdPNkdWbWlxNTRmelNTY1JFZmdHRWZ6RDNYK3B4d2JOallvZ0d4cDBuOS9FOFJCc2ZmUkNZUWhtbi9HSjZKKzRpalRyL3FwRUYrT0g5TFd5bTJkNXZrUjdWNCt2VngxVVBHa1JVV2taY3FHK3hsUkNJZ0Uvd0JxaUdaT3k1Q3hEUkx4ZEE3MDd2NkNydDN6MTYwaUpEV09Hc0QzVitIS0VHSi95c08yMmp1Y2t5OXp2RVk1NnZza28xbi9TTGlER09PSGRJeTRIS2p4L0FESnRqNmNLYXBXd2xkc2JoVDlWa2lTeVdiU2FKMXZNNnpOYXUwQWRabjVEU21oWkEzUER6L1lBdksrZ25FRnExTDVqWnlldEl0b29helVoaFEzelhTcWwyRXN5N3dGZzE4L1p3UXh2cGlmWkdUekJ2SXVsYWdtUDhpNWFNYzNmY1Q4Rmw0OE9hMVdTaTFHM0JwR0lpVEZUeVNhSjMwem1DWG1IWnBRQmYzTEdPcnpEZ0ZkTHNCb2tOdTR1aTZLY3BEaHFXdnFrVk5DWWJFalhmZW12N3ZWbXRjY25XVFJtOWhGTG9MM0UvcnIvbGNFbFRpQ1ZEcVNDRHZxZlJqcG9qbGZzcHNFYkRzTEhEcndiMStPcnJwRC9mVjBlRzNTQ1M2czBGUysrcWNkZ3VPT3lEUENoTGdRRVRqQTA3UDNDeS9KWm1wRG5pVTU3VENhVVZwbnJjMWFPQmVhcngwc2JmVWQ5cHNJNytIZGszMnNiYWFBUk5vbG0yaituMjFUNFV3SHRnRHN6U1JCOUtxN29aWEJRaU1rckMyU0JRUU13QXVPM0w3WVFIZGJ5bTBrVUxoQmxSa2FLZE9OdEM0bXZSL3RBd294U0dtRnNzdWprZnNERk94M24zenBBZmtGY1dRVzcyRWJYdjhNZEE3UGN3QjJteS9XL3l0cjlaVDVKdEZPWG40SGl0NjhwNzNONllJR3kzWUhjWXlsUVJQUTdVcmV1cDFPcERSUWZ3STV2M1BhZWRjNGlRNFViZ2QwVDRZdkR3VEc2Sk13M2dZSGJYSXB1MXdacmdnNXJ2RzIwL1hPWUlMQWZCYUxjS1VheWUzT3l2TGp0MHZYQkg2VlpNWThQN0U3K0hDNWcxclZPVC9VM0VBZ3NoUEdZZjRIeER5ejBuZnp5MlVnTGpFazhiNjhzTjkxRko3ckN2YXJTeDdBcFVBL3pJTWFlbWpoSjRpbEFLSkdzNUZhTDRSZFZQQytpU0FlNWFwbDR6Y0RZMVR3dVlzM0tCMnZSWXdseFhkNE1uT0trMDRxTE9LSC9nOVRkbSsvMmNqUnEyWDNYRmZzcHlXNXU2bTJmVVd2YnJJVzNRSVlKbC9RaHp5VUxsWVMyTUE5d2IzZWdWc2kxS1hvV0tOUWpDbnRFaGxhTU9PQ3k5OWFjalZ3S21qUVVOUDFuNFgzUDk2R1V6OXJ6YU5BZjNHM2hVU2hGYUhjOXpGNHZtZ0RsTVYreERhTjdqZk1kWHZXOElocnh2M00zMHBpK0YzeHZvV01kWlB3NVdDWTVtaSt4Y1JyNUErbHRvQXBPL1pydFRJaFR2U3RKWjB5bnlBcjBHVFNFcWovcVRpWkJXYTl0aTh3ME0wc2gxOGdjL09GVSs4YUQzQTRNajJMY2FoYzNPRWZ4bUwwbUp2WU05bktrVzRuMTVQYXRBR2VQRGs1YlkzNG1PRjZkdXNKTlNXWmlHNVZkKzR5eGdGdmFicjZOcUxEMEx0TVhxQzV1WGVVTUNsdGtRVUgxRjFKVGNUU1RzZlEwTjdpMkROVWxXTGI1eXNQQlQ4RTRqQ1IzZXRlZmJINnJnVi8zTUt1bHlMOURySzF2UkJKTjlsUGt1VCs3dkovWi9VbGwwSGcvWTZIWjd0MVJEdkllNjByVmNFaDNMdkIvSVBkaHBTRjloa1BEdFpKQmY3YWlvNjY0bFVVQVNpemtsZldXTXZUcmNDQVRncUxhTS9pc0JLcVRSa0xMUEdDeWpZUUZ0eWxSR3htT0JUZWJwZ2dYZ3ZheG5SeGpzR3pKZkhKS2JLUmVTUGZVdEV1UjFJNk04MURnM09ta2dtN0FVZm15cnVtSzltWEV0eUJvR1NiNmpxcW82ZGdRUTdzTjRTS3Bxd0FJR0JBcGNNNTQvTmdjU2h1dHRIVENuNTdnbmllYWVobmxMc2hkTk4rZy8zVmt1L2dVUWh5aUduRmxpVVFaV1NYelRlRlNvSy94UHNyZmhLeWl3WFVzbHNLUyt1bkwzWWZqV2dGdVNpT3RyYW5JN0lDbk9HV1hYays1VSsxVU9GbnR3QTI3SExrUmdoUmdYSFNsRFJpYmZ0N0haTFpoczZsMzJFM1RKYlNWNjFhNDJxeHZUVDdjV2VaWi9HdldUcDJNOEd0RjlFL0J5R2RTRjJQY2RQbVpub0ZwTzdMWVJlZnNuaTVVMmR1MFl1YnpiSEVQdFAyNUFsREFsZTVwVUptSkRsQUkyd2E5RFFEbW1vQlBablNFSUYvcjVVT29WOXBob2tVTzJUVHpsVGkrWHJyT2lOYmVKMHd2eXRkY0RadGRRNC9CRzVGVFZVRUtDZU51N2VQZnh1NFVicENnM21xWXE5VHJFUGVreGFycEd4NW1kcVFsYU5VaWFabGo5eURZSDhicy9HKytkMzl1UmxnTlJMWDd1UllmY2tYNHNUWDBiNWJuWFRHMkhOR1dpZ0liVEVEUTd5bFk1WnlOV0VwZmNuZUFML1l6bCtpOHk5VFdoQzg2dDZwRXJML2FOTWFEQ1ViWjYzZlVoVWZYNy9hOWdHVUVRcm8rYWdScWdudi85cXY0N2tDdFBMc2ZEWVBuTWRZYzZ5TUdBMllvTTZ5Y1Rlc0RGekxxOUtPRkhsT292c1hwclhuaityakpKdGF6RG5rYWFLQVZYdTVUczcveStwU3hDenREcVZYYTBPSUk3YS8wbGFPemp3WDAxZ3hZNkxDKzZnSWsyVThjbTA5ZTdBSWRxOG9lYU1xUEFOY2pId0Q5WmwydjI2MU1RNVJib2VZejI5SmJaUXBiQWgya21CcHlvWHQwS002Yk9OTWROSmU3Z2I3cmpycVFxNzF0Qmkza0JSSFIzb0VPT21MNmhpRzJ4UE8vSXl4eVBBQUlzK3lrUHg0M3laS2FjV0tjUy9LRUtOVXlDakt6QTlRMHhZUlFqZmd3S0Z1dHhKMHVPWmZ3VXZwY3prTHhPTlYxRDZSK250ZmtKOXFOc1JwckhsdGVuTmxDMCtUdnBDZXA4NmlQaW15VGpzSk0ydWlGMG9QbitaZDhtbTdjdllRQVNMdkFRUTZqT0VjYm13UGFBaDFqVHgxQ3JadUFZTG1Tck45T1JkOWVDMElZTXhNWDd1NnczZE15SjVBcUJVWitDU0I5THlJN2NiYUx2NTZyNUV6eHIvQXU3ZGp0OWdRMWJvZzZMeFREMWlXbXdwbHhnVUZRaEFWclVaS3NqRmc1RDNEejZJMndUT3RxcnA1QnFmbzE1Z281RUZPQTlyMVVBS0x5aUdBaEN2YVl5UjlWNHRXSnJjcHY3M2NRQ2NOUmQwZjQ4UmVpWGtLcW53elIxMzRraVh4aWpwMm90dU9sdWtKZlhEeEcwSlAxT04vMEdyWVllYWtKVlVsY0k3cWgrUW9VaXJoTHpSaGpXTG5ZczRSVHNrZy83L1VITWd0RmpJRE5MZmxxVWVDbXJZbVFkVkM3MTdqQjZrRkpUY3lUK1BvOFQzcWw1VW1IMmQrUXo0Q1JUQSthUEpvSWhQRVRSa3pVVHVDOE9PUmxxOUZlREtDaDVDcEVSRkhVckYzV2U5TmxlWHRMYWlhM0xQaW5CdE1ONWgvTXdYQ21tMFp2OUZFaHQ1Rlpua0lBRzE1elRCL0o1eUQzMXZtc0srL2dwUjliWEhWcWlMMEZVQnlYTnBxQm9OcUdXL0Z0T1Qzd2NtOFN1amVrc3psSmtSb1pMTDhrUkF1MGJBOFhDRVFhaDdUcVhGL0ZOUCtjLzdaWmhQQVMrckxIRWFzS2M4RGVsQVgyM1FWWHlQL2R1WmJsZ3hrWjd3ZXdXNmZXejhNV1NXbmowbUp5Y21GdXBMbzFobWR3T1lEMmd2RnpiRWtoZEtRS044T3ZkSDU0ZUwrNGZ2cU1tTHpHOHl0N09VNlM2RHd3OXN2enNHZDhQb2RETHlQN1FESHdSTk42S2FhQ2ZYVXhzdVd6RzdRdXpCSjRiL0IxYkc4aWF2bWtxWGRwN0JlZVBKWHVFQWI5U0dyM240NmZVZ3pGQVEzTHRjWTB3V3g3bEtrM3JsL0RJbngrS1FvbUlQeHZMeE9YcEU3L2QzYW9UMVd0cDJRY29naSsvTVZYNkUwOWpLc1diQ1hUQkpGV2NkOUo4T3FJcUUyMnVRM2tramZGUUo1SmhiNCtERXZWcy9QUEVzZjVuNERLY2R0TlFDY0xQQTAvbXlBbFFMQUVUUUdlZXdURmhHK2JHRlFkT2UrbG9mV3g5eXpNSDFoUWVXQStZb0hqZGpJN3FPNm1iMnhubFZ6SFFzQkc2R2VGbk1pV3NtVzlVQzl3TkNCS3dlSlhSamEwbFRCZk9OWU1GV3NsODE4ZVY0Q21ubzkzVHNudXJPQ0todCsxczUzN2RVeGdhbUx1b0dKeVQxRGlpSXN1cXRxdUpGV2E1amhTeVZpZlBVZHFoWWpBMnJPUjRaWkxKcy9RN1FuT1hPNE1LdmxrSmhsWHFPVzdnWkVJbVljQzBTNGdxYnBIcEl0bDAvbXo0UEk2RnREdE1vd1VadWtmZW1HVzFLcXlLYVd3b1FtZTl2VHJ6SkVMUmRNMDFMZlFwRWFuNEd6bVZRdXhmL080dlAyd0tYUjhjSy9YelB4bk9rV01QbnVtUHo4RmF2cGVVK3lRSW9JZ25LL05LS0wrKzRIZnBLZURwMG1JMXhqWEIremlBSDFKbWNYeGl2UUNGcUswRjNETTJ0SHFlS3Z1VWNzcXcvVGgxQVlZVmtmM1BWd2J6ZWFpRjFXNjc5VysxaC9OSHZOM245VEtjcFZZbGtqSE43SHZnaXpRUFQ2cTJ0dWFSVENITG9zaFB0RkVmYnJLOGxFSEZNRnhBVEs4eEZ2eVJUWGlxV0ZkbHVod2NlOEpIeUs0REhhNkVvQysvNWw1OHlJaVpUMjI5cjdhbnhSY08yOXpFVmtCZG1JbXdHSFBBUmtXYnhXMUVrSXA2UkJ4NnBrM1BWUGNidzcrdHBTNHNlK1htd2ZFSjlUUXFKUjdvSm55bTRjbU1HUXhtRjIyWlk0WUE4aWlQTFlNa1hDYzdLN2FNdjBZRENMd0U2eG04Q05ROW4rMGlzQVdqWGtsblV3Z0d2UGRWd3dVRFRveHdxeWo5amsxYXpuT0NmR0V4ZThPUGN2WmRXQU8xaU5zYlUvSVVPRHJYU2l5c3NWdzROSVBESUlTY1hqTE5jbEpjSjBjM1gzb2lXQjl1Ry95Vk9sZ2lvT2hmMHVqbHlRK3lXaHpDZzd2UXh2Rk5OS1JsNEpIZmtrL0NtY09ySkFtOWp0R1FwK25CbXA0UmlldVFnRUZEeFNvQTJJOEVZM0tlOVNRaWEvWE9VQWY5d1dTcmx4SVRTVDI4SUdKNFlVMnlVSkNsYldhT1RocWsxYnB4T3E1ZFdOd3VyTytFQk9qWXJwQW83bkJ6U2ZCcmgzdWlzTFBNWmt4K3dESUcrcFdERnVialIrQzlBODFJdkJiWmI1MjJndTdhSWhFcGI0Nm5GcWFZZlJFeUNObzBzem9IVE1KMi9lSmMzV1JOaVAzZGVaQ2xQNFYzU1gyK3d2SFJ3cXVBQnZjdlhsTHE0enU3Y2hyZXhmTGZHemNjVmV2cVlhZ1BvQ0oxNnRScmVDSW4vRVQrYzRPeGJuM2xmQWZxWndCUmFyQmwwUXRrdXBpRFptZWdZQWZIbmJCWUpnZzMxVTNRMVRXcjNBbW8zT1JhVEJmaGFNUnVBVzkzUEd1TU8wZy9VMTFKTzZLSFBKRlduZUhYMHRRbmNTcUZOSDBYZUZHSGpmdUM1djQ0Mnk4ZmFNODBybWVRN2NnWENWVlJFTWxxZlJtV3BNZ2E4cU5NRFhzOEIyRzRCWXhQNG9Kend2YW5PQ2ZVTXVjOHhodDBKOU96VG5Kd2thUm9nalBiTHhkb1RzQm9UMzdmZDJOemJHNTk0c3EzNTNoNXdhcHIyb0NuNTllTEFrTEdXeE5KWTk3aXNzNmw1ekZNM0FjK2R5MDRuZlZucG9ZMnMrbExuTEhySmdDZ2pJZlRzTjA5YUcyUXBZOFdtd0hFanJQcHFmZW9Qa0VQcStDSFhRR0srcWV5cmlyZFhGamZsSG1xNlNaUEJXMTR3bjJGU0ZlNlNMcWJNc3VpQm1GRk0vaUh6Y0d2VGJ0N1VuMm00ZUFpNVhGZzBHbmVLeSsyTHdZQlE4MjFweldDUlNadytZNkFNbkk4bXV4SmFLZkY4SkxLQ1p3dlBnQllObTIrWWRxaWZqbnVtNFZYM1l2V1N3bS9BWXFqUEo3c1VkRnJ4OWsyc3lzd0RNbU5qR0NpMVFpMmdaZDdoMWFNZ3lEbStqT01YY0pzNUxlUHFNK2hHNUtkeWxoVmJvdmJURS9MSHZ2dlI2QXRHa0hZaDBkR0hCQ2g1M1hyYkxCeUxHRXVnclN6Ri9OUHprMExIRkF0S0VWR0JYOTluaHAxR3c2OUo5RE50bzBaWHpSOHd4WHdNSDZxTnZXMDBtVis5RDVTRlc3OXI5Rm16YWtXY2llajdzY3Y0cmxiZTNGVStwN2FxSUg1aytiREdqZ3lJR3ZtUitNVWdoL3EyZDFxa1dZODdXSFNHVFdNOC9ZTlBOYjhUMGduQ2ZKalRVeWsvOFVRUFU0MkFRekMxSlhXR21oNG9hTTZMVmRCVzBjQm41QVI3bHpsWEM2Ukkyd2Q2WW8vUHU4YmdNZmpKbDYzRGcvb05RaGtlbDZFSnNVb2dCVnE4NHBjUndadTRyVFFIRjMyU3NXdVdlM2drYko3QTJTdzc5TXhnd0FWQXpFRjhlT0RQWWJtYWk5NkIyVEdleWVJc0pLYVZUNWt3UlRJUS9XYjhOWkNPTk5VWWdWVEhHaVJSMUVldG9WazRMUmxXQTBuZ1NLd1VneDRnR2tlZ3VpR1N5dlZVR2tpQ1FVdEFIVlhMOVEwNHloVHNENnpmOHBpdGhSQU9JcWxEN2pkYjRXSUpaQ1BrVDRYMnduV1ZMSGVQTjh4eEpjWGpQNHdCZ0JmTGVhTW9PcFdyZTRPMk9OOXBaZ1ZhL0tQVEpyUjN5NFp5L2FFSENmRkRQRUVTZ1kzOGpoV1ZiS013M05rWlhFUVFHbFNhSFcvOGlzZ3dvRkd4SmxjYmpwNDhHMGlXaFl0ei92aEJuenkyNlpOT1c5UUhnSndWSUFKSWxCbUdqL0tIcC9HTnlJSXBnWXN4V0tpMEp3V3czQ2l3cHhBSGh2OG9aYWZIOTR6dDlSNFFCTTFSRzZBUkFxVVR1bmhtTXZRUk5HZG1BelJLLzAxNitBZ1ovcVNWUFFpaGl5a21kdG05TFYwWGtNNVdoWXJudXFWTjVDbjdpSk1IdUdLWWk2eE9TbFJpY0VucSs5R0kvbjBCaWd0N3RENEJKQU53SFVlTjlpM2RzcnVDUVlDczFUcWwyci90WnhKRjFiSGxncno5bkJFTnhPckFRQkVMQTd1dlB5OEtTeTJTaHpTUW9JWHQwQjIwdE4xTlRoK0lNR082UWdmRmFWMGc3eWtFVCtPN21mSmlMeW0za0w5ZzZwTDdYbDVYaWNoN3ZuWTdXTm82RW9RUmdTcTVCa0M4WEhIeWRFYUxhTld0OWVET1cwRy9RSE5Uc3FNbno2NXd0WUpjU2d5N2JuZGRYczFGZkpGVFJ6NGU1b2ZNRGpKZ3A3eDh3UFpDd3RKd2wzcHk2L05BVkNoaXhGSFZPcDN1czNYMUYyY3BzZEtTOThvVFQrQWg5SHRNMk9NUXIwLzc1YlN6L01Fa2JXdE5YSm1YbDZ1M3BuMlo0RnU4ZEZFRkJCL1dmWWJQdUJyZWhkYm1OV0Zta1Vwc3RwS1h6N3UzNkc3ZTZYTmNiTjhTTFoyTTI2bVlsRXREL2hWMEJPSjBYN0dKRjQ4RDJ3NE1xdlFJMVlCdHkvSHBHYmhNSS9uN3dHT2x3c0llR2xWaHNKZGE5cU05SFlaVjlSLytka3pvRzB2KzloWWpUbEtxQVJwajVpZ1N5ZlkyNFN4TGZwWTFpSEJkMndzVGpZdmJlb3BBYnlTUFE3aDdtZ2ZHdXVOL3lsa3FoTnhoKzdabXFWQjNEaHlveFFMZ3lBU1ljWFdiYzl4a3FhMnk0bWRITXl0N0Ewdm5rTFBOTWVGSzlCT25sMktYSjNvcVpoZ0dqS29BcmdFemVsTkRvYUZNL0thNmZzOUhUa2xHVFhRYkF1ZEhjUnVyMmpXSkxwTXpNUlhDcEpjaDFBbnVSLzdmck9YRncwbzJsUDArRUw4bjBkTSt6QkZPcExCcDlmcDdpdlV6RlU1Snp2Q2Q2T200U2hzREVRRGh0akxiSnZOYUpGTGRYVTU4aklWY2lnaVIxMFl5S3g2QnY3Y210N3lWMFlrNy93TFZXTEo3ZXJWWlNCdC9ZaFJwSUtOcUw1ZzNNRjZINklHU1l2bUVwMzM4N1pRdWhzaWlXQ3Y0Y3NwTWwwOGNBTzI1TnRweFVoVytiQVpmVENUVmZ1aHJhSU1Cd3lES0JhcmluRlFYNWFVeUp2SEpIZnVVcXAwWTZnSjVOTUdubTc3R1BTVytZdXpwRGFjOGxGb2IyeVROWThtK2NQcXhNWGk1M3FzNzFhRkRTclVTU2JYWUo0TUFRSHhRM1ZnU3BONm5sV2I2bHY4VG9VcGNuYVpOVnhoaVV5M1RDWXc2ck42SHlqRWFaU0pNRGVkaVFtK3ROYkhQUlZvTDhlM3J0c1dtY0doZTRlVXVBVllIajNyL0VPM2xoSUZ0Y2pxWG93d0VoUWM4dW9HM1gxWFNtZk81andnditMaVBOYlBaV1pjMEhqdG9KSUN4Vld0dHFZU0lPRmdQdk9oTitaZGxrVVE3aWhSSFZ6L0t2UTIveTRKSU9TaCt1N1BoRVl0S3hFZXlUNC9XL0gzd21Na1R2eWZUSWh5YS96VFA0YXBjcFlYNFhBL2ZUbFRWTEV6WWd0WW01MHE3TG1tc2JPR1ZLRXM4Y2ZpMkM3ejJ3MEkxKzJENzlaWmVrbStLaHpoQ2w2bHRSNlAzTlkrajFGV3VxOXk3c21yOGRha0xjc2h0WlpYZDhLejRsWmcvN0F6dlcydnhrVnhNY1hUL0lCc3dwb1hUcFZPVzZTWHcrZkJJbWt6MWVSWHZEOFRBSXZsSXpJcVFweU83RldNekpaZi9JZlpSWjlJMGh1c3NXeVZ3dE5VOVBCRnBHajJuQUZjb1A1Vkg2aVVJZ1l5UkozTDFDMUtGQVhuN0dhYW1sazdVVHY5cmVqS1hRVFRnV0VPaUJlTHZzek1uMGtTeW1EVTFtOGZWRzNiWE5pMVhkMVdiVzdoQjFkMWJDcGNhQk5GaXlnOUNjM3RJVHNYWWwzcUlkTmhqTTR1dXBrOWpIK0NNaFF1ZzNVUnE2MG8rUy9XYlM4NjZzem1uWmcrTVdPSDRRZXBjbVNPVUFuWVIyaExzTnRDVlA2ZEtob1RjcnZKdzM1QlBONi9YcDduTFFlaEZ4MGpQTi9aOW5vVVgzS3M3aG1sbHV0aVJsZjl0aTRvaDltK2N2c3pJbTdDd1RZdVQxbjl6NGFDSWUzNWFjRFQ4RmNkVFNhNVp2L3psWi8xR2Z3RzRrdFMzTkdxcHlOcjJmcXBvdC9vYkUwajYvamhyR3dvLzVLV2xLM0VDNmtpd0hza0tBa3M1a0p3akNmcVB0M3c0Q3BGVEJrTjlvQS9iU0E2VzdPV2FTdzVOT1RSREw3V2V6MmQ4WVJDVnlCb0lXZjlETEVtVFpKL2RUOHVTVFBaRis3SHRhUXFyOEdqTHJpczdyTXFQS3E3djd4WHIySWpHYVNod25kYk05WWhzb3BHdnFMS2tJdjlWM1phTWVqYTl4SmlGOUdUU1NLQ3NoNkZwdTdFa1pPeTRtbHUvRkdSUytZQ0tJMWJFMWFqQXQ3RE9OUzJKTExhaXRhc3RFQmdpN3JWYVJ0c3BRTHhDZUJOUzlMcFBpSnJBYlRiK24zU2dIMG1Yd1J4aVZBMjVKRUUzb2YxeVRXdm5udXFYZ0FEUXZOTUVqWUY3bE44OTlMRFFxbGdFNzJZTkF5T0VVK1d0eWVJV3NpdWRUcVk2cDk2NVh3MXh4QVVKRUNWaHBDTHVNQWtjRm44ZHJwVWF3TTRHNEhkd1BhNG1lNjM2WTg2aDd0emU5eCtFT0lPaUNjdS9ualVFN2M2eEFzTTg2Mi91RHZLaHhYQ3BidmlWQkk2cHJ5NW4xYnBkdFJBdUY3UlZHTEpTUkZDU3NlYlZxQXVkTjhSTUxpcmxQa0kzV1RXbWQ1eVJaekdxd0R1Tk8yNVp2alFMYVh5Z1lleWJmajBQZzFZRWdXMjFzbzR0K2VvKzNRdDh2SGEvaGV0dzY2bktkZUp3ZWlENHkxZ3M0TVRxOVBzY0h2SGl3d2hVamMzZk5ibWJ3dW5nT2d1dnprbzE5dnMwVTF1SGNSMTltT25qU1N3U2tvaWlLeno1N0RyemJPODN5a2NvcGFSNDE2bmN6eEdrL3ZQVTdNVUpra1RLTDdxYWI1MVJlQ3Rac0xFdHc1OVVJVHZZU1hRUzl5eWZzNWY5eEZ0c25PRHpTbG8rV1ljSnQ5VUx4RGdkU1ZSbXpCL2UyYkRMVTg1RGVkRWlPb3NYTEY1TGF5WVdlVlIrcVUza08vT1lTdDRubVhxQkdXMklzNWVncFBMMEUyRlRURDZUN0tRTmhPSGNWOXM5SEMxWlBTL1d0RnJRak1sMGpjdDdsamkwbEZqd1BjUzZic25ielVHdVJrQkFGbWljUXltTjlNMVNSaTFqTkZSVk9VVmRzWjBhNE1KSVNISFc2MkNmM0tHanlpQW12cGZzM0lNYWhqWk52Z002Y20xQWsxS0dydHFLdm40TDg2N1MzUFl2Q3EyNFBvbGZNSXBZMkx1anloZW52VHBDL0k4TUtpRDEzUmUwQmNuR1RDWWU2SjYwMDB2Z21ZdTQyM0dTSnllTHVKZ3cwR3dZdGtsazc5MVEwcXpibkNIR0UyU1BseFVrdGJUbDNIVUg0YzF5ME5CY1paaDVoek9Gd2dzaXdtZUFvemF1TDNIUjR5WEkxRTZtdHI3R1gvbERGMXg0dkFwSU5FaXFWR2crbUYrdmkrR2huYVprMzkwYTdHTjRrVjVNSE9aOE1waE5VSTdoelJ2UkpHNUZBcGZHTThYa0RzTEc5Qldtc0pJRHZ6NEZXQTZUd3I3U3NOQjlkL3ZKak5RbDl3bDM5RWQzcXkxN2FhQkVVc3dXWVhQNi9pTVh5VFRGNWY4NmpXaTk3dCtDdzV0dHIwWjNyMzdaWGQ3emJlcGhTcEJiaGhMbHRoN3Q0d3oreHhDY2pqM3NKdXF4NWVmWjFQZDNxRWRKK3ljcVNvWTBPUVZNNHBUdndEZGYrQm5TWjJVZHVpNlUzVGt4OXdPamZpZWEvSUtBOGxPSERUVmF0ektCWW5JTWF3NWJUMGhMVmVvZER1a3pPUFBDdXJtVjhQNG9PUXZqczhZVGxxbTZkZytETExDRFgzUllpRlhod2hYRllTRnFCZ0VqN1FxRkFFeVh5ZXBmT1VyVmlIY1ROWW1mUDlTVTN1Yng0YlBWM0s3SzhrNTdJQytnaStWN2NJUTE5a0dBdEZ2aEs0Y1NZdDBYSzJWY3oyNDMyNFBoVEF0UGtQWS9VbkwvaERzWDRpY2prc3JtKy9ZK2RlTE8rK0hkSXpPSGpXUVBsTWVZUTBtdWFNQVBDK3pxK2VQd0Y4ODdCYkJKN2lnb1dBMHlZVysyQlF1cVVnZTdWMmRXS2ZWNnAzb0dadkowRGlEcjNKL3JuNHNJWnZpVHNiOXRBSUZBUklWYmxBejNESzFnR1Z3bWswZjRhU1hmaWhWUEIwemhZS3NQb1BtRDZQOWJvWXcraFVaM3FueWdDdmlRTlAxSWdMbnk3RDNZWVFaUWhTbVlta3FLVmhUV1RlQk16TXFMbENVcUlicUN5MnpGZDhYcSsrN3ZQWmVzTy9QY2N0emZ0MWxyZlBxS01IV2pndko3TTIwT2JnVDFyc2wrQUJEVkVVOWdweW9BMEVaUjZpTnZRSWdqT24wVmhZYURZdG5hTjVIZWhLQjZMUDk0MHJINitiMHZPSVBWYnVza25DYkFkNXlodDgyMHMwT2E5VUNwbG1YT2libm15T0N4bVBYam9xS1NYWDBsZWFWWGZ4bVh4S0loaGxIY3dzZU9DYmthRzBwY0lyOFZrOSs2VzNmdDNKM0ozcEhRV2JINXpVblJqSVVXTjY5VzMySVByQzQwZHpjejVOMzJPQ1paMExOM0FUWEVtUjIyZVJpQnpzaEsvNEVDNm1oZzFLdnVHMzlzUDFGZzJBZmN1UVBnd0w0VTRXcmNiVHNSdVIvamZneUdmTlc5eTZCbmJsV2JIMDFWUU15UC9NaDZrckRISUgxR01PM1lyLzl4WXhUQllkRWZXUUhZbG9CLytWUTBmWjFJVEd5eDd3UjY0cnV0VkxuTURNUTBPRlV6TXh0VUNra2l2emQxYUMzRUdCTllPQWVuMU1UbStQczVLSjJmU21wRkZUSHZWQ05wKzhwT203dDZQT0NaY2p1QVRCdWxwWkNaMGw2cTJ0NDJEaEF0VnN6aGVLbGR6eXRldkRJcGpUYm9Da3BEMDVuaW1XdHR3UUFYUzNhQldiSEppTUFvdXNnZHNBYXpGL1pBMWNOaGswaGxvaHVTVXBYalpGUXErWDlPZW1nSWVUQmowcHgyaFBDTVdQUGwxdkFOaGJ0YWp4NzBnd2xWdGVLUlEzVnlmVFdveWFoWWlFUE15MFR6Sk9hMVBFN0dmekl0ZjJ6bmxZdUg5akFFdGtPR2Z1SWp3Y0I4a3BPMmdZb28rVUVIa20wbW9mdGQraHBHWG5VZmJNRVZvYWZndUZ0YWhEU2xqdGVHOUNQVmtsMHRxaGxKTlBqcUR6S01XakVlR1cxQStMbytjcnJNSlNqWmFGUjRLYWZuTEhoL1pEb2kyK2p4eHNTdkxGdGRaazRsaEhvNlp1ZHh0azFLMmlUeGRXZHJBMDlndlhscW9yM3ZzY2FieWV1YVdDTXM4M3l6TWtTYjlsQXAwSWVkaHNDUU1HVjQ1V2JjZnNVSzJKalhwOERLNVNZYWFsbjQvTkNMekpHV0c5OFlLSFhLYnJoUjJjVkNwbmEzSGdwZ3FFci9TVzhETHdPWEhQVUhBRHRBQTBQMGV1Z1k3M1A5Skp1ZEo1dHBCaCt6UnVQU1B1d2dqYU1oWG92MUw0d2J2TCtlNDNFU1p6eFAwN0hqU0lCbWVsaUtWS3g2c0ROb2JtWVhydEszY1lZeUU2TlhtTnlkZEZ4eDdLZnNTYXIzU3RLMEFyRENxK3B2QjlhV0VnZ08rYlBCTlNpVnZ5RVQvZDJZaVczS1haWHkzNDM2Tzc0ZWRqazJPaVIyek5lM09GbmlrSTNpLzJaTHJKeXc4RVlGOFFoUG0vTndhZ0ZXK2lESXE3dEZGODlEMjRUUlNNZzNMTmFPaUZxL1V6d2Fiek1hVWhYcmRTaDh1YnNNQjhmcDZERTVyOG9YREFPNUtNajFSSHVoOU96UjV2c2h6NmV4KzVGYUhlYlZZaDNXVkVEZHF1RU84WmRZWUdMeWFFVmwzZHJ5TWhXNEpMYjgxcWo4NEx3ZTRIRWptUzdaZVA5R0g2Q2ZHeFQvTC9peHVtZExjeGJxVzA4Z0JRRkdPTzJYQTNaSE1ZMURId3NkdUxTcUdiV0V0NXIzSm40ckZqMlI3QXcya0w5M3VaN2c4dG1MRWNtSWk1YmNMaTRuekhzSFBoeG1oWnlXN2ZZSkp5NE84aThlUDJzeVZlUjM4QWNGZjJSQVNHc2NaQzlEYnJpWnJERjI0bXo3VlRjRks5d3VVMUx0WGZReUFva0dSU1hqN3JBdmZhRk1TSDBBR2l0cklmVWNKUTZaK1ltRFRSdnA0d3JmaUFYQ2sxRXdIaGlOc001SUxXbFlqV2pJSHFIa2lPVzdhb1puK3VHUUEzVEdUeGQrZUdOV1JyWDdLazh6WW05Tnh6TkdFMVFkMkxvRVcyMXRwdkw0TVJ2YlVWK1o5TC9ubWIxYUxFbW5GL1M4RWx6WXlXcWkxWHZYZjZoNUhvbmxRWVZib2FhdW4vVDFjV1ZKb3cwMk5td3Vlc2o5TWNoM2lMR3hGcTZadEFHQkRRT0Fva0RmbVJENTJNNmgwMG5POTZub2RJVlM1ZERmeDBodUsrVmI5cGdTd0lMUWgycjdPbVV3QUVYL0ZMbHFZc3Y0ekVNTjlJb3VEV0VkdEMzM0JSWU1aUytLVkoybE41eERJSlpreEhNTURnMktMZWRNNlJmeEdncy94T0pJWktadFJFWEI5aUZtNHZRR0t4eWV6bzlHSGlXM2JpOFVNMURhVHZTTUNHN1BtdWdyaCtYRjZjeUlRbHNEenF5cFg5SjF5bmNVZzRGMFRKQ3JqVStWSDJsTDNiWjdENjNBdHBTMU82NEZOb1dFRXFHczFwNVVuY0x5aFFkRlE5ZE12bXNnOE85ZlAvOWpUM2cwQ0ZybCtEVm1QK09waHVZLzRVVW9KMFR5OGx4SnpVOUlJUUJ1QnVrR1FIVGJzbnhoN1F4TzY2b2FsNW9xSStlUUtnT0hYcTVJQUwzeGU4RFhEdE05U01jc0h3TU1KZmxQdDZJc0dFUVUzbjMreDFoZ3lHQkJEcXRiRVlSTUFFU2lVSjJuNVBjRGh3RnhvRWU5aFJJOGd2ZlpOaXlva1ZsUWpqaFlCNzNvOG9zaURFSDJNQlc2QjVDbmNuOE10WFc5QkNRVkNBaVIvbVI0TnRFS2EvdnRyM1FnazBuVzhsRG5SeUE5MUZFZitiY3NiQ3BqRW11RnNKL1JCcHFwVnc1eWlNZjFXZlhicjVEU21lR0lSejg1dU5VWnhEcERsNTFRbEMzNGswbVYvZXJSUkJYTEYrWmF6bGRIVG1lODIrUlhLUmlrT2JxOC9aMFc3K0twb2QyNzFsQXRlK1Y4czhwUW14SE1ZWHQwK2pzei9GT08waEtjWXJpeHMwaGJhR0JlMVF4WkpBbmRDYmZOODNuZTg5TlpDQ0gzNy9nQUcvcVk5UTZCZlNab0hwdmJPSjdwdGtBS2VOM0p1KzdpcEExMHN4TzZzVko0d2dLa0VoQmU1czBpTExVdHB0cU1NRmtscGUwUDBiRGJoZy9OdGV0OTFzMlF4aStjSFNkR3lqcmpOTEp3a3M4cGgrd0RFdjBkMGRKUG41VTF4L0pUWXZTQjEzRzFCUGxHV1grL1Vnbm1nYmsvb01HTnJtVWx1TmU1ZnlCV3NsaSsrSVNYOHduV0ZuYlUyd3dsRHhPZXIvNkFJU3FYcDMweGVlempRcG14V3g4Sm93RXlpTEI4Tnl5MTd6WmI1Z0JZQTlDb3l3bmlGeGtrdVZ5UkRadlo1VVN3NUZ0K29ESGxiTTBSY0J1Mi9NcXFsQkZTcHE3ZGFMUVVJeG4zcjFNUXJSdnBiR3FrbHJzbElVVm0zci9WTTVKa3l4QTdjb01CMkRadWZ0dS9QUFgxU3BYSTF1dlVqcmtiUGFUR3RLZkNkYUJlRTU2RmFRTUxBVkI0b2Z4b1ExcHduYXB5elBNTmJGQmJvSTAwRnpuQTJtOTlxVGV1MDh2b3YvWlpQRFdpTnlOeXFpMjBpbUNKWGZtVm44bStPMWxrQkFrOEMrb0VzbmUzRjMrMzJOZ2l2dDM4MUVmMHM3bGNXaDV3OGMrY3FDeUlFNEU1bEN0bmpJL2x1cDdOdWVPUnFCMnRycnRNRWgzTGNMOVR4MFJ3RmNiMGUvOW0zRnlqU3NJRTkvWWE4NzNkbUVmYkoyZVhIaW5VdHdaZDd1eEN1VzhtYzFuMlJBbjNEZTExVWl2VG0vSnZYU2RCQzRaMWVrSkNGS3JCNW9MYU5mWlUra2ovUzg4eVhHcWI3N0ZncVlXNUJ2OXZsVmVGTjMrQ0NKQkc4S0pVSzEwVTlNUDZKVkM0VG9RaERPekRLVWpQcmxRbzBQZmRITXkweFRGZlJoVUFkM2VnMUtvdmVSd1IwZEprM1VPbEdVVFNpdWEzeFdmN1NWR0FpeU9aNnBzcUx5cExhcHlQbXBGU2ZQVmIxR20wNjRSY1hnUWxxYm9mUVNGOHE2ZlAvT0VGdHNDTllOU0hnSFI2QnlMV1NaSXM0eGE2UUFPN3h3OCtoTVhNYzVJU20zYUMrU0lUZlA4ZEhPaXlVaTY2aVFPelEyZVhUNXFsclJJdjQrWXhFdlRnV2t6bk5CNWYyVEZvbTdmWW1LUE1zQUhiWDBGTDVLcE1uVGF0bDRRc2l3WHpoVCswOVI1UzlmZHlaN3VRR0pTZ0t6VWpPVDRBcnVnajRSd1BEQkdWeTdSZmJwUmk3bjJ0ekdIazZTZk5VbmFLVEk4OFlETm4wZGVRVUEwRWNBbFBnVk1SVnYyN1RWcWZDZ0FXUGo2MC93ZFNGTStzZEt1UnhlNXQ2WkRGVXQ5V0pmanN1NFM1cWRWNUlDL2VrR09mN0NIZ1ZQOE1CZ3oraThTM2ZQQy8xN05hMFUvYzYzTUp3Qm9HYnRPVitwcklScUs3Q2s5d3lMVG1jelh1QnFOdDVFcVFyejNGVk9ITWJySFh1RlZ0K2JEcnJZbGJwN0VwZTBjdTNiSE96UG9iVDZ3UUI1WW1CNGpGSXBCUldJQ0s5YXpsdnhHaGNwU3Z5WithaUhSQTYwZGRENTlPdTI3VjlEWFh6V2FONnZXS0RHbE5VMzZ5ektpOEdxN1JJMXRiZkY2Q2xna05uU2dUZ0dsYWlWZlphTW9GUkNmU25aR2ZkR01tUXNEQ1ZVWHJ5TklnQk92ck81WDNMeC8yN1pOTjJ2Rkt5QVQxVlI4OFB5YzJyZ2lFVUJqR3JxVXk3WjFoZVgyanc0WEU2eDJQVmdhNWk0Uk51c1JHZkpBbURPa1pEbTAzVXpBaEhPNjZuZWExSkhwOVZDTDB3a2JheUVPWTdDQlc0Q01sbGZuMml0ZFV4T3NZNkhjTEppRnFLS1BDSUJvaFZ2dzdGMlFvTkJ6WFN4TlhJSEc0OXNlSVloak9ZOFJ1d3hjWHJ0eDVmUUJOVERFdG00UENrWmE0bEs0T3JBYnV3Y1VXNnp5RklqNHFnbFNsWnlUT01XdFlSYzR2U2NINTRvMnNDbG9ZZVJtZVV6cFR2NlhISlZZMTV1dFdNOHlaSkQ0Q2tuQTBmcGlCUmVSeGtSa3RIeXpDeVlSSVRLeUdhVHRGb1hmYVNWYjYzbHd6RHgxZzJKR3B4dXpIYWV0M2RUWjYrWWdJbWJMN2NSNGhnS1FpWDBiU2tUYVFtQVRuejNNSUZWZmNuYjJBbHZUZnE0VmpaODluMnkzU09zbEVPR0E3UWtvV3V3ak5pZC92empRRUh2akpNUDJBQTBQdFBlSW9PL0xtZ2s2UXhVRVZ3aWpQU210b0dyaHFrWVJTdUg4TytYWXJSY3laNmc3WDUrVWVScDdVdDI1dTBjOGIwanRLSnczcWc2bXh1U0loL1g3MDVIaVNlMitWcTlJK0t6clpWTFJMdVRIQzI2cHIySU1mMEVCRE1YNERsa3hlRE16K1R5ZjFVZ256NFRHMHdmUEt3dWVCbkI4VENQWFB5RjFuZmtBZWY0elNSYXY5aGhxMDRpamVvcjh0bU9nOG1GTGhjSFpnTEN4OW1MOHZ3RWdaNjZudDBGM1ZMaGhWS29OdSt2MFJtK2JLenhGSkREUlBPNW5DRFB4d0FrQ0czNTJvQ054VGk0eW5jYS9oWXVnMkZvUHF3eDl2RThlQjQzdVJNTVo5RUZvVjNrUEwyOTJId0ZsanVMUVF4bVE5ME5FNmJzcUw4ekQwb0xzTWV0bnZPdVVsdWRmditZUHRmcG5PQkljckRMbkdFMDl2UWh5dnhlUmI3VVBiNFZYZnpIMG5tdXRuaSsvYmZsSk1yS0pMOEhhbTZldk9QU0pUdTMyS2ZHWUhEMGdhWUVuQ2FjQkVHdlRSbW5mNDNOaEg5ZHJLU0lvQXgrUXJNVG1CSGVQQ3RyTU5rdDlXOHlsbFM5ZmMxTU81TXVweWgzYVU3amZNVldOR2t3dmdHR1VJSExWaFdEMGN4bzIrWEJwYnRFNURzajBQZVd4ZlVLa2x6d3h5OGdPMVdhSjZlaFJOc1VqN24zdk1Edlg4KzYxMDJtVUdxd1FYSU1ISjMrWWJ3UTc3M29mTXBTNk1MVHZRUll1SWd6RDRuWUJQaEpmL0dwV2x3bURXRlppbUJYNmdKY3oxQ3VKczJhNWZDaVRyZ0E5eU1teUlyV3R2NVpBOEF4SlJ1cERaeDY5ckxINXVSWll2bDdVcEl1N3pYUE1iL2drbmtkdjRqaFpkanBnSnNMVXNDNFBEa2VzaHhyMW4zZ04xQUx4QUtFTkNHdzdlNVozVlcyd2hjWXFFS3RGYVd6cXEwTWh6MHB0Qy9VcWphUkxGWXM2M2NWc0RsOXlDdUxQM1MvMUU1SkhqK2JmOVdGczZzcUVLQysxN1ZDZlNNOXkzN3pPRU4vQ3ZvUkFxYit3TjBGeVlrMXg4VXZkd3I1VGpVTS9wRzlMZ3NMMVkzTjExQkhwQ1dteXVuT0thWVJ0V2ZILzJoblNGdi9uR3RmZEVONUZQb21FNG9iRTFSOVlPK0d6QXUyR3NVcjNHdEVMeEpHT3NZOHlIMXc3WnlTaktPOHJZR3c5ZDlEQjlhKy9zbmZ3TzdiK25kV2J1MFZRaHVKclVnNC9YNkhQSFpjemd1TVZndmJkblBuMk5WcWltMDRwTUNpQXp5aXUwa3JldERSMWM4SXNIenNlclBFZ0ZaT3NLcTVZUFcyWkJGRkd6Z1VwS0NOQ3A1MERPZDdUZVFPb2dER3JRQU5INGp4UlZobmp2YWZ1dHI4b1I2MUhLaWh0bFNJOEkwUGZreGFVTXVrWVA5N1hVMWRNTnZmbXZpQ3ZEOFpOdjRvNnFZcTF1b3J5eEZRbFRDdnBTeXJrTG9MWDV1V2lzKzljMFJsYTBBNVMvd3EyaUV6STB3ZVA1YUFsVmZPMEZDcFJ2ZEdTdnJjN2VBQzlVQTQ5QVhyZjFzeU1SWFZ5RHJBUnI2SUNOdE5lSTdUMW9iaFhNZllRa1NsQXdMK1ZWcWZKMGV5Rk1mL3dOZ1dwWEFQajQ0SGMvNWNtMnIzT0Zqb29yUXJnU0RCdUlFUXVaMnVpajBtY2lXSVpiUWNPT25xcWhKUjFKTG5TTm5nN0FWY1Y5K2prc3ROcUhES0kxVmZ5ZXlqQXZ4QmhBMXBBVlpsWGhYcHV1N1FWSnROcElDci9aRTA3bXFUWGNuNk9BOEN5K0FhR0xkR3FyeWR4N0oyV1grdU9uS25JV3F6WUhIK2lYL25MUmFBOWZtZjhRTnRicDFLRTlEYXU1aHZUMlNPKzFJeXR0bTRuNk03c2FDbllhaTdtUG1PVUFtVEhIWmx6Zm5EUlFIck1oRFFFTFV6cVA4UkM2eWNvNU4xa29HZzMwdDBFN2tJZ2RlU1hsRDYxampNNnBHTld4a2tBWmlKaHA1MWduN1dtVEdnY0txV2M3T0Q0TGtkWW9xMk56MGFZTm90em50U0wzSGNRd0tMRzkyU0d6MW1GTm5TWHpBZGFjLzI4UzJDdXNSbjV5OVA5VlVGNDR1bm5zOTB1TE00UnFOSGpiWDQ4ZkdYTVRCdmpjWGwvd0hNYWxHQ25OWDF4QU5SVjZoWUdxTGxFRGpxQlBIMVloYURYbVB3M2lqUm9SaDlWS25yRWtXZ0Y1TEJRMGZiSzlHd2FQYXJnaDNNUnZFSkw2cWpuVzcrbG1MdHNqZEpPMEc4N0ZSNzFYd1NTVEVGOXNTWXhURG9WMk0wdC85cEZwWjIxQ3VYNHdER2d2ZDM1YWRodGZSNEcyb2VQSW0rN01iSEVQdHdHRUJMVzIrNFYveHN2TDNEVzR5c1ZlNUNHNHp1YjV5OG4wK2hnZTJ6WmpUMWZuS200MFdlUzZONCt5a0FnYWFjQVJkZmZub0hLaFRXZWwyMUNRZ0Jld24vNUNRR0EwSVlzbHEydlZhVXJ0OWd1N2JzZnhnVEI5YnpRbXJrazRIY29KZU1iRnVXN1Z6TTZJamNzSCtNcDhHcXVaVmRGZG9vMEtHOWplSkQ3Um4rV0hGcEVYaEtRb3pIaG1tZzRBZTFVcStiTGNhUGR6S1RKRkZOUTNxYnBQQUZWSWVzbEVPRnRiMHZ1MFJJRnJVRG9OOHVvUzhXc1JLNG02K2N5dWVoeXNyY3Q5VWZTZVFjMkQ1Nzh3Qzh6T2hHNis5ZkVHaDZ3UFQ4UlpJUlJrUGRBSkV6YWdZS250SmFibzRzMEFyK01hRTRkdzZxdzZVZEZIa0dZQkRDUmhmeWdVNUtmS1lrOFNXOVVnZllMbjk0QjMwTFZ0M0ZObHIvNk96MGFBd0o1eEQ4RGE0dFZvYWtQL0hqemZPYjN4UTVqSk1rc015bDNXdjdCS2Y0ek0yVkJLRXFoeUJFdkt4OC9yaGp3aGVKOFhtQTBYcEhtVy9Fckw3N2tyemhRN0VyaGExeWdmbUw4dWtFMm5GNTJVcEF1MHV0cUMrMTRBaXJrUlYvVlV6eElHLzA1ems3R1lIZXF2MVdDQlljQlk5VTFQQk9YVWJjTlVnT3FwZHdJUHBSMHNabDZFZ003K3hhRExMd0xBVVBwN0RodjluVmJpYWM5aTdoKzFjUUhaZytNVGYwYWhPdVVSdkZyTEV0R1BKUWV2UTBKSjJsaHg0U21PK0huazBxSGRVdlJaenU2eXNPc2JzWWFweUE2a1JyOTBYN2FROUxsdGZ3MVI2N1ZrclRwQTVrV0oyc0U4dXpuVkVEb2lpQzdkayt6WmJRTW5lRVpMTE16SmNyWGRmbDN6OEkwM3FKQU03bENuaTdISDdzWUR2ZlNMU1pFSTlrTmJWc21iSkZHOEh5SWFyK0d3d3FBVE80V28vaVJ5N01IN1VPYTY5cmxSMUxEUjFNRTBnc0NBSmpTcll1eWI5TzRPLzBQaTlFWEhtSHJhZGZhbEJpRDl5VlVESTljVEhDOHV4RHp6ajFtQlNRT1JjWG1HYWZJU0w2dVNUbWM0WjNONGZSQVIwaFFHR21hUVdzNGF6QkQzK0dtVmh2SFFRYzIyc3hCZHNmSk05U1JlRTFzZTcvVWUxY0tUTUl2SjZkMStlL2xsZGRkVzFiUDQ3RTlHNnY3Rzdtc2c4dGczUlJrSm9tRzRKNVR3K3U1K2ZyMnpJV2Z4bjVsYzl5ZmpqbVpOcGtVMUdTamhKSWxkbUdkbjVMRUFnd2Q3MVZzckZ4c3Jld2NxRnVkOVlROEVJVThlRjZ1bDk2YTl4dzNDditRKytWVzhwdzJ4TlNxQzNmMVB6bFd5Y281Qk9TM0ZxeU0vaWpyRkw1RFpMMk5BbHZhSzZIUCtqWWJHR2RsZDZPc1JORldKaVhGS0tjZE54QXpNeWRidkJzVmlvdnZTcjZBT0l6YndSdHZzM1h3V3hOUlZWcncvQTIwOS9WeG5URGRPNjdFREw1M2lnbWNZSlY3bW1odlJZMXRNTzkzendIUWU2ZDBqL0c3Z3FFNzU3Wi9OWHAzNit6bzcxd2dydTIzRXVnL1pFanZFU3NrUmd3S0RxSDdkMklwZlRVODFVWmhjWmw4TFIvdUVBMThWSWtJL1Q3SzlEd212UmJkNnM4M1dVZU41ZFhBYnZScUExYVd0TFZocnNHUXg5RXd3cU83V2ZCOUVmcDNUb1EvZklzcW03QXJrekI1NjZBOVpCODRwV0V0OXFnbzFVVXdLMG9mM1pXZ0lMT3lVc0lDeElCYlJXSllOTVRsRWYyVmQzTnNmVnZ0MWFJR3J5TUJBeDl1d3V3OEQydnRpMlQ1cnB3N0s4Tm0wOGhrUWxLbmgxelpJN0RTSU1RRVU1S283eTVSNmpYQXB0bitVTkNZV3pPZXNXMHdEc0dPdGowZWdwTm9Ha2w3S0pWdlluM3ZiTkJieHZCTEJBT3VYYzlwdGxxTnEvVTJyZnI5T09saWIwVnUzaGVQRVlmWHFCUkJsMGM3NWtPZ0E3M1BKOE1JZEc5N1A1VUp0bkRNbGJudUltSEE4YVVITUFHNzNEU2xjSnhHbEw5Q011YXJqV0ZWQ3lXKzh0UTlqeFRKUWZndE1YTCtjRCtoK210d3ljTjgvNFFvYUIrT2J5ZjJSbjhuTmpFRTVyT08xZjRCcWRpQkE2UE16dmRid1lJOUFRQVZwNEVHTTNCTVB4VFlNV0FwQVM3REhKZmZWcVg4eDUxd3ZFRXVSaHQ0c2h5OUxEQTQveFBOTW0wbzBxN2hBRmd0Z1lieE03OVZqK3NyOFRhSlMrMlNXMGpyZExhLzArZlgyS3gvK2M1dFFMREFzMDhJVHUzbTBGSDNZSXJiWDhUKzcvRmZUZ2xXd2lmNGxvaWpyaGw2TWljQk9xNmMzV1llYUcxc2VHblB4MmMwK2puS2VLU2FWMUdhKzcvMXNHOXBralpxbGFLUmxGWjZvc2pJMlhnTjJzNzcwbmxNSmN1RXBIQ1FHeG02YnRTeEVkbllNZ1RlVGcwRCtnUUZsMjdFRVA2VjNSeU5FYzhmell4ZmRyRkhyaUFoY1RtMm8zVUdHL3NMWWg3MWtlYlk0VDBzKzMxTnA2VUNzU0IrNU5JbFdDOUhyWHpCRFY2UlROK3dQSzNJVkU3RDR1dmNKSHBKaDl3eS9vRG1NcndwNzB5Um8xK3M3RmlveHRGb3l2Y05DVm9hTTBNbjI1ODB1dFI2Ni9xcENKMjByZEhsaU0vMzJaQmpyU0toUnZOb21rVFVVR3lNdndmUEJsck13RmdlM1FWeUcrQXhVZHdianFBMjBYZ3RMTGtNV2RCSmphNWtDdytYc3EzK05YVERJTTJCL0NrNlk0bzN5Q3laazNRd1B1ZVh4eCtGN3VsSVFhaFgwK0RZK2JPTkErQnpScGJvWlJIbnRiVTV3dzR6ckFwdlVSeVl4MmhkMEtxOVFCS3JsM2dxZ3M0Z3M0K01vRTdmaW1aR0pHMTFHbXFEYk5XUzdLeDRML1pVMTc3bDBJQWlDWFVjRllueGRYSnpPUVBzWEI1OEVweXY2WnhoMmlkQjJRczYxdUx6RVpFeUNIb1lYaU5Na291NVA3TGtJNGo1VXJMdElienoyZDJtSlVOeXlGcDJDY0RBamxnRFB4MmYyK2pXcnRsWDE5aC9QTnJxRlFZQjVPWENRYmZhU0psazF0S0QzUFJwYXM0Nm5iVlBOaFBDWVdzMkMwRC94Qm01UGc0T3lZeVNEb0JIaGZhS2hXYlNpa04zV1BGczBhNW9YN3BwTmN4cGNxRjlvMWZWeStlak1WOUVKK3RGeDJFVnpnK0RZTjdET3FGalhHQWZRVHFLMURNY2pkbzJTQkxvNGZRZVZsVSt6cFVHSXdhTE12WDZWYlcyenByd1VScXlwQUlRL1hjS2dFUzJ3bDFVY0VQWUswUEw5S3NacUhuTGxmRzhzdWhzU3gzc0d2MFZESnFGMmM0aG9xcG55TDNPWXI3d1hNWFVONFVaWDJqZlMveElTNCt0TXNidkpiRnFwWUY3MDdPeDlsZnZyVjQ3bEJHZE5qNzR3bHlVNXBJd2YxdExWME8xN2xKVk9lUE5INnltZzBTdDBPNVBMdm5JMjBQRnhSTVUxV1Boa2huMzI3WEdNL09oSVIvTmg1U2lPcjJiVkhhSis0RzZ6cWY5aVg3Vk1WOVhzdUh5a3R4amVxcnpVOE5kN3lHcnZPNWN3RmdlNVVCcVF5K2ZOSnBRU0NiZytyeFFuVlpobzdxSmowR2JoaFhIenB4cHFrMnJrdVZqTXhGUktnNWEwNXI5ME5jdkpEN1BmQzhGT1hCNDFlbGxjWHJxSHRRQ1kyV2FOdzBEQ1lUbTZnYUJjMmRHL3Zodlp1YmJzTTl2S3JNRlltajhqdlVQc1RzaWJvM3ZQdUppbFIxV1IvZ2VteDA3RWE0R3ZwRHVnalVhbWFmRjNEaXZSYmlqUWtNaENzYXpacFVsMDk4eEs4SWNYdlpZVWNEYWdITk9iNWJvWk5nalI5RjMzdmtmNU1YRXlzM1hsNmJrRFZmZlRUWk1FNTVrRmROTmt1VkZLRUlEdE1PSWZjY01wb1J2dWxTTDJ3Z3hzekVlUFBqMDNUVm0rNVlzTEp2M2FvUm9FUHVVUEZ3RFl3ZXNkS0JSZ0FXZnp6T01lbUJYWlBiVGdkMzdhdlpjM05KZjNKWGEzK0FpbkFiZjl6eVhvbmt0UkxGZU9hYlUxT3dnZlJ3ZjJnN09wOHlPSVZVVXFXWFI3RkNWaFBWZ1RQN2UzUXJtMUIzd3NxZGJBTzE5bHFyb3Z5dkxVYndGVkJnbHhZeXFObHlVNlFQT3VnTm5MUHg0dFA3bUtnN1RJVjZFd293MS85UHZFVjhTSlkwREZBWVJ3cnhMdDVYSUZmYVZQQ01GWFMyZDI5SkVGbWhhdFgyOFpjZjRGSWErTk1HRkQydGk1c0J0aGExYjFJVlBmN3ZDYkZ5c2hWcWpuTElRMmwzUERMVmI1WFpadkpyQ0h4TmVFODZuWkhCSTZFS2EvTEFPS1VkWkRCZnU0ZHJpM0lBQWo4a0ZBak9kZkdPWHNZZkxybk5qSE9SeGVzcnpDekplRUxnUGhOSURvSkZSSkJHWkRoRmdJT2VtVnNma2QycENhR0xJUThQT1NpMnczZFprazlLallIZytDbTVxMFRwZUIrZUorU3EwbTYya01JekgyTXVTLzhvZ1NtRmdTMUdSSHdqNHhabkJYNnZUdG92eXVDbEpRNXV5c1hHVGQxWFBJSHoyZ3dnK2s1TTRCTVVLYWc5ekNtUWdhYkU5TTFxVExZM0w0Ym9MY0U2K1JXWmpXbnZDR2Y5aFpmRmlZSmRDTTRGMGZUNlUvQitHbHRWaDE2NHhWTlZLRDFCUEpmRWM1SGRsY2xPNzFEZnM5aXJKSTRQdCtaNnpaU1NpY053L1dXRTlScWJ5Z2o3MXdqWnkzVldoOURVS1ZwMnZnQWt5K0FhRjR6NUNiWmxwbGZXRUhoUkhsQmFCWkQ5Q2lBYWFzVW00ZUVUa1U0QUdiYXhwYlBlc1FRV0RKT3VCdVN1S0Fuck1tUU9Ga1YycUVsNm1KYngrSHZpSzRXaTcyZDQ4L1ZJMFdHamlGM1FieEQyTVcydDlYc1BlTlFqbW50cnhhcVJEdStVb3ZGS0tWRm1rTHdpZy9McXhOanMvaVB0T21ZbkpSY0ZHREV2aUpYK2dYQXE4bVVCVFhReXhleDRrcHdGMFoyMlhxSFJQSUhXWWZvbXQ1aVBGUnE0aVlRMjZwOFBVeFJPM21XOU9ZaWY4R0lSQ296aFhOMjFRTDUwWHI1UkRadVFRTW9tMnhsS0R4OFFhYWd1NmoxUjZQbk1Vd0owZ2lydWZvTDk3SHhRZ1ZkTGU4d1lkamVmdjIveTN3d0NDU2o2Q0E1aEljalJZTnNvd1AxRXZUbTBQS21BZit4amtlTXVYcG9sVzRKUXNDcFVWRW1tZnJXSlc4OTB1cnh6YW5jYU1PbWxPRlJRZmNuSXlrUDh4NkpINlRqYWM0NUg5SEdJbHpWUzcybDlZUVRRSnZQcWltTERMUXZkYzdmNUQ4VFBrS2J4bWlsNGtwRGt0QnMwSyt1WHNMcWdaU29QbWsyUWp4ZUJXb2tqcnVDdXQ0WDVIUTRYVXlseHZ3WHN2R2k3TG4zZ3pib0g2NEJoQVVPbXNoZTNmc2VSWGdlM0t2K3dzcE4xN21zWVVDdlBXYUo5cVF6bSttN3MxdjNRMmwrUzlnMXcvL0lSSnozNkJyZ1JjenZONkpXNE8yeXAxcDJxQVZ3c1doNG43d3R3SlBWdnAvRjJsSlNNOWVzOFlxRFlXMFNGRU9mTmZJNjBoVDZoWVg4TnlvVUZOSjZoY1k1R3VGNDZPMGFBMnNieTF4VmtVbmRhUGFhUE9rUjVZb21RWXVCNzUxSXdZY2tEd3FQcmoyRDhYSndBM3AvbVBIR2luN1FJdHIwakFybUJuVXplQllNcS9NRlJwQVMyM0hJakZCeWdMQUF6dU1HNnlWTVcxeXJPZ216dk5zdi9oejMwM3hjb0MrTXNxa3dGWFB5a3ZIOVZUMVVBMGVXNk1LK1lkQmNvYXZndTJnYmMwZlRIZ0dmTmx3MC9MNXMyWVZmZGdaZExNT2dlZnk3cTFRbEVCeDdYN2JrMnFTenhNRjlrMWtDbzA1eStYNXc1eXFob0xoTHhvWjRuZnExRm13TlZUOVA4VkhBS3c2c1J4TlpYUklKVlk4czdMc0J4Mk80UW9SKzRkV1h0cmdiUzNlZnVxQ09zcE8wTlFZVUtHL1dsVXRtdU05WUp2VzhpOFhWTENYc0dUSk54OWl2VG5pYWl5UW5jemlSSmpxRS80aTI3bjFvdDh0aXV0VmJNNXhVODZFNzlmVFZabHQxUmFjNWRiakl2N0p5RU9xOENaVHlpaWJEdEJBWVQzOExucTZHQ2lPcDd6OHpxTmFCeWphYUhzaVp2dUZXb0tVMG9kTDJVVGY1Zk5TaEpSaU1BQlJTUENjcmxnK1N4WlFNR0h6NS9GbEJ5VlFqNFArR3RvckMySjFQUVV0NGwvY2FoQ2RNQTVuR3YxcUNEd2tLTUNCWU5qejN3WTlBbEU3TS84OUJUZDF1R3ZqUlM4WlJSNDN0NjZOWnQ1Q0t5dFc1T29pMkhOZHpPN0JCM1VCWmI3cG0ydGpUbGZMemM1TDE0M21LZlE2S1h3b3RYU25BWnhuYnJLeWVGc2JqNU1yQ3NkZHBSWEpHVjl4bndiL1V3T0JxU0QwZDJ3VHZna3o5V3VGZDRQcmJPcGluVDlJSFBjMjh2S3NLejhHS3M2cEF2SHhaMTdvSW1ld1hjT1NobU1uYVliaHJuZ1haYlk4bUlZa3g2ZVA3bGZ3Z215WmVvYlJVUVVlWkZuc2o0TysrK3plelRVVFd4TkZqWFhUczZmRm85NHBhT3BuQUJOUkxUK3RKKzFkQkltTXhUUW5LSVBwUnRQK1NIcDZDSXZOdDBSQkRzYWdtZFhJRFM1RHU1L2FNMU1ITVNLNDBtdklKTDVQb0RUZlAvU3hYOXp3Z29uajhyQWsyU3ZzWVdXMjZiZnp0VzVWL1FycXhySG1kcUJNSVlObi9FY0U4WjU3OTJTbG5mcFlQREFWelVxVDlxYmNZcXJXaGt3YURKbGp6enl2TUZ3eWJUSVJzVmRzbUdtS2ZKZW9xUmtVMWRzWDRSYlUrd2lsRjBRS01rRWdLdldZR2VGc0lTcjhGYnA2WkhiVTBTRXBITlMrVGIxOUV2MWNBWndpeC9Dc3p3L1BaMjhwVmd6SzQwSHYrb3NVbEJGTFhUT2Ira1ZXalZVUDM4UHZvZGdUUjg3REpmZzArOHJtd0JOMUxhak05TVpvRmZlZGp1djJ4cm5rZUtHbWExMTQ4WWpTSW1BWi9mRmdvZmEwb3pLM0xnaE1yRkl4VGxuNzJ5MEZMczNxV052VHdyZ2xIcFM5Ylp1RGlzZExuY2lYTW1zSFNtdjFmanhzdWxnc1VjVTdLUDVxVFBCZHJmSW41TmNldUlDcWxCMzNYTU1lVmNWYWVyVkFTZ3lZNHpIaVpMc2loVlVEQ0wxeTA0Z1htSi9XMVlJWVZnUUlIQkxpdUMrdnlRUkh3TkVwMGV3OHd6M0tPV3pBMmhrM2pzdTdDcTdrSXVRSjF3MEpvRVdqdnJmT2pEcDVyK0Z1eno4eUlQTWZ5eXlrV1RIR0pZY2JuM1M2eWtYek8remdVd0hQN0dBKzBMVWlKUlVsWWwwUUxKOXZmNlFYcU1DRi8wdU5GTFNNOFliTWxScUxrWS91QjkveEd5bEUzWjhJZGxtMUFoRlVuK0M0WDRmMmV2OGY2SXBjVGIwQ2l2bXlFVXBFVVNRdHRSVzNHdWN2a2pVMm56NXROa0ZVa0lhcktvaHpZVXJneFptZTdZTjNFUDlZWE1GbHY5SERKWldzRjFEK1Vzemo0SHM4T3M5WjdDNHlXWVFKdUtCZjRwL3hCMEdFNUU0UndUOFJNMktxYzdtYkgvc2VKNU1kQlMvek9XWGcvQ1N3R09zSi8zbVFXR3Y1cVphSktTdDZmdlBMdG9RNUZkMDJCNnpJdkszYVdDRW9ZelRYdzZqeGUxbzhzNFUrWEtsTFJzblYzaktaeVh0N1dFTHFEbWFnYzJyY3NGTldJVXZ2MVBoVSt6OVFKdzZDS3lmRGJ2bm5vTW1Xa3F5V2lhcVUrcWU1VkplckFOUnBlekdZd2RtRVAvNzJ1TWJkZkV2VGNSMGpwcCtuUXFzSWxFc05Ga1oxZStZUmx3MGg0TW93a1BVY2Q2aTdEV3B2cHhmUXRRY3AzNm5raStaNjltaVYwK09vektseDJ3K2F6eUZ6V1pxY1NKM3BRNnB2eUtJanFVN3JOM0VVbGdPbnZUOFZEbG5hZk85MWg5S0hET1AzSmE2cU8vNEZwcmttbFU0cVFHaDVNRGVkUGYwL2o3Z0lQTFNzQlFCVG1XMDJLZkUvYXBrMU1GaW9sKzAvS1BCZTNDdGwrMWxqWk1YVWtGaTJ6QklLTzBCUVpsdXp5REdvY2lhS3M5Z2FCUGkxUktyMzVZZlZZazlWT0Z5RnozVVd2Vis3dmt3U3J3dEx6M1p1emFZY3p0UTNUL1dlTW8wcjFlMFRMMG9relEwS2JGRzZ5Y202eHlrb1drSGJHL0Q3UDlxeXpsRXpaQ0RkUFdROWVyaXlNdXpzbHZVOXNRektZOUZjR2RoMVBOWkowOEZmZm5MN2VIYlc5RjBwM0MvZEVreDNZdUh1TXMrM002UllwbjJzOGFQUFFjZ2YvQkV6QkJIRWJUMWdPRCtDalNzVWU1em5tU2w0WCtxRGdMa3pxSytDTzhvUWpGVGw0UWpTeStCbnVVb0F5ZEFFbHRQQkovQ1JsQ1NYZkp1NlVOV1RLRHhsVlZoUGMwKzdXZ0h5RWZpc2hpcGNqbXFpeEJUQzVyWTV0M2I2RlpqK3hsL2ZHRkVWeFYrZFRlcWViNkE4bFVveGlnaXR5QWk2KzNzZ2pJUHNha0VDS1A5RDVkeTVmd0xkVEJiZ3hrazVzNHJCVVhRekNRSWl4SjcxdE9YVjc0ejU0Q096clUzaVloK2lxYllGOFZ0eStDYzlDOWJ4OGgxTEY0Yy9RYTNLN0J4YXczMU02aVFjbTY0N0xSUUpnUVMvejFuM2dBWGQ0OFNQa3dSaEhjVHJiMkVTN3lFWXRTZWhpekN4blFCRHp3aTdiSHp2bFpaVXFiOWFYbk5UeC94VVdyRW15K09yN1JmVWRMcjV5RUxyTkE3KzVKNW8wTFZUS0xtZTFRR1E1K24yM0MxS2ZZM3dDTS96VFlhQUdGV0ptOCtZU0hPaEFWVksxOW1EUTNCT1hCVWpTTHJDNFVVODRkRW1ZVTRXRm5WTE5oRFExL2dWUDl4YjJXa0ViS1NnM0xmNnpqTDFoRlhaSU5vclNZN1EvbUp2Mmh1R3AzQlFack1WazJPbFphSWRqTVdEMnRBY0F2TW44Qmt6MHZ2N2VJeG5iVEV4ZksxUjRYRTJVVm9UdTd1b1dvRTdpRjVvMXJydThnV3NyZVo5dVN0WndURGxnSTFRcWVuZEFOU3lPb05BMzF1SitpelZWOTVpZEQ2YTE5TCtYeExiTmw5dnVtWklGekVHb1U1MXdkRVZmdWJOYUw4aTJUUlJ0SDZwUEJra3lhdkJZZFdMQkFPSmdtVDZodjc4QTlrMmVBWkN6S3VPOVNqSFA1bGhNTElkZWNyN2x3WUhHcUMxS3dzaUxydlFPN0srWmdIVytEejZzRjY0bER2VlZIR0cvMkVYY0ZRRmQzRDM0RXpURDFSbGVCaUxlMnFzVlJueGZSLzhmS0lLNVVRVTlENGUreE1oYllsR3l0TDFBbmZmWXE2TFh6aWdGY3ZqalZ6S0h2QUxObVQwY0RabXdkcm00R0xEQzJ5eVphMlI5RTd6TW00M2Q3Tzk2Njl1V2RDZmhTWDZGSFh2bElvZEVvOStmOWM1NDdqVFFaNEtQc1d1VGppV20yUHFXRE9DT2RVK0VxS1V5Z01jVU9oOWNrT296K0xpWnZVZ1pxWXpLdHV5MnE2OGM2Q3MxeW01NjFIaGZWMHBXYkM2Rm42bnZOaVpTS0NCOUFCUHo4SHJiSHdwWldWR1hUNXh6UjhxUDNFNFBVZWF2UElVU0VSdVloNHg0a3BkTEttSGduL2pNWm90TXRiejRMWDgvVWJibDNaODFxMjZhb1NMaEFsVGJUckxHQUJ0UHBVckxHRkN1Yk5pMHFQc1hZQS8rWXZVUXFCRG9DU1FWU0JjWDVNeGNXeld0V013NEhnTkZadGMxSG1mZkdsU1BpaHgyNUJmQXpocVBJM1NieFd0bTRuQ21kZC8vQzZFTEI0MXI2VXNCK2YycVNFSDYwT2lTSFZ1eFhXZTMxZGRlZUR2eFkzQSttbmkzUzYwSTM2NmQxMTRsUW1aaytFS3Bra2FCTXhyL09ERzF5MVpMekU1YWF4ZVJleTI5cVBuVzNHWHEvaXlnWDFxbzVXbkVuNUJZcDJFdWdkM0UxU0NBZDVIK203S3VmSFRLdnkyZW1QVTdTR3RjYWVLc1NPTmxCc2h3ZHpTaFhUTDluUnpFcFMwRVRyZlZhY0l4RUc3TUhPV2FkY2RSai92SWlJSFJMeEJzTnlFejluekRqQzdqa3FPc3NudlVQeUVWRVFBNXR5eTBlcEE2T21VTTB1NlVrRHFBVHF6WVl6SHEwSmt2cXhjYVhiYUQ0cHRBUk1ubndjazg4ajY5NWJOUE0va0RQRkFKSXdjYWpubWtzTmVDS25iQ3d0MG5wck0vUGtaZStxb0cwekxoaW5zT0RYcUs3dVBxcS9LMXkzeUxJdVhCLzh2SUZZWTJlelJDZ1JoS3IzZy9ZQitoWHJqQlNwVjJTUGUxYmZjd0o0WnpzenphaWtoZFluVTVEVitxZlFqR1paYVdIY1grYkJmMVlQeVI2RkEzbStRUjF2N243TjYzNjlVNDVoMnlDSmhyay9Dbzd1WGdkcERpWE9DTzZnd0wwYmlLUk1mejZnWWxDaFVPQS9jZDM4T2ZIOWRzbkNITkV6aFR6ZDYyeGkrNWJKd1AvS0ErWStSTVNUR3pmR0ZjWmRtR1B6dXkwM055S3ByK0hndmdXbmFvRFdCQjVUck1zYk9HRUtxaVd1MVFZSi9ZcGlRUWNHTE1vekpQdVFxTzJMNWE3Y1FOWWQwTHVUbFBGM1BMaGFVNTBhMFhUV2ZVTDFCOHIwbjczRHpmT2NmUW9ZR25YczNYTEhEK1crcjI1M0ttLzE1MnVTeTFjZlF1MUs3a0M5RUZ4OTNUbkZweEhUdzZWNHQydmxENlZ2WHIvYjJqSCtXRytjRVQwUVVjeTg2dHNoZk5naXdsZ2xGQThTUU9HRXRyTklvbDc2VTFVVmRhWFFNMXJiemM4YVVpbFVKd3dhN0tZRCtCWDVablMrUm1CQ1UzQlVyTTVhQzdGcXFWbjZtYlNGVDAwU2U4NEkreG5zUGFwNWlYY1RuSWVEYTB3NzhLQUtMcDNOZzhTemkzeXFUdlZiVEc1ZU1FcG5OZHhOQnlqSk1iZmsweWEyOERaQ3BmV3BaUVlZN0JJRDNXN3ZDS20wZWV3ZXJkVG1Ha2EzR21wQnA2WHJxVGNCWVY3YVpVb1ZyMytzOXdKeGUvcXJHcldxVEJHZ0xtRFQ0anhpWTdvUWloWmV0VkJsVER5cmpQR0hCQUJFQWh5S1B5YmNRcXM3OHhjRm0wMGVnZ1BUMndLdENrME9QZFlFd1JLVE5ZdENRbG9UL2Zzaiswcm42RkpGTGFEZGFCV0Erck43Qk81RVZwWUpDN2lvdWxxcjRvWWNDK3hmdGRQQTdzcWxjWmpxMXY2cy9Zcm94ekgvK3QraTVOUVVvd2l3UlFjWU9zaXIwbmdlU3FVemEvcXk3ZWV3UjdSNDF2UGNpV3BZcEdsN1Z2V1ZoUmJqd3RmOVRzTGhvNTQzYWdTT0JRWjN1MFdXQXNoQ3YvclV6QWwvckl3VElteGhvVDRicktPQUtMVGhTdUd2a0ljMkdTY2NRMFZOd1pRSytXNFdHUlpGTC9UVE91UEVrRXFDdlYySkh4aGhtR3o4SmtyRUk4dEZSVlBqeHZjTW9Qc3I3aWZPWGZKc2tVYlB3bFpvMDA1RnBLOWxZWVdYTlUvTSt6b0V5bmNaT3VkN2ZubG1KMnp6cit0ejNwVWFqcUg5cS92SUpGYTVCb3I4N0poM1JybnBVRHFRaGZNRGtWZlA3TDlvNjExcG43YklvZXBYVDMwT1huZTVQNDRsT1p6Z2VCb3Y4Um1tYldPaTdQczN4MFpzZ05QU0VsVzU5Nk13MVFVMEtXTWhtSXo3SmNqc0NGTWpHWjYydGhBWTRJQWRlK1gvN093TEl4U2lsNERES084SVlUQlVOTm1NR0JFdXdhblFKQWJQb2RkSTlFTHA5NGtIVldYLzExem92MWZvT3pTa29yZFAyb0dLMTBaL29DOThJTjQvWi9rWk1aaWlpMXVGNXh3T21GMDdOR1ZxUkxNT1YvUTVJNFlaT0wwSGNuMXpmSWRFWDdSMTZqeERENGZwUEU4Q2t0UVVDNzB6UE45L3k0MzNmdXpHb1phQnFvSW9SWVpWa1JrTlJvNm9aUFhyL2hLTVRlMUptL2g3Q1lyVk5NWWY5bU0rcjl2T1BnVEc3ZjZvTU5FUVUxbzJ4YzR4R0dpWW1sVXZDRzJyU2dBYm1JMVF0U2I0OXpPdGZoU1N0NEJFbWFxbWo2ZStaY0ZsbjZjK1FFd01rYU5OdFlldnFVVURXYjA3aU5GeDhsTFpQS2lNYmhrMElqYm1YSTlQejlXZTJaN1ZUQzN0QlU2cVg2RU9IWmxZQnJsWlViNDZaUHAvRnZ5VzlXTmVkUGkwdlcxSEVPbi9VN0JSMWZ2NFhlcnZjWVg5akdONDk4TThKZ3MyTVIwYUtsY3ByanlCZm5lWmU1RWh1UmZnSC93ejZ1VnBMZFpwSUpRYVpNRkxnR1A3Y211aVgzUkFmTGFCRTJTdEFydWxZdkxjUDI3RWFRdWNWQ2NqckxZTzdhbGtiTVZVTEVGWW1qZUlDdFRRWnc1S2hCVkJQdlo4N1NVZjhoNjNmRHlZcHJ6K25OaERadk8wcmlLU2MvM2RLYlhOTmQzZG90MXdxdEFldjhyNmVDZnh5VDJHU0pmOGUySjNHL1BLYzFqRUhWRHpDT2E2b0h2UVBZZmdxelBseFkwTEMxODhPVEFvU0pDRmUzejN5amJreXp1SFZaQUtseTltODJWVWU3QXVuMlhydmUzYkFXY0dxNTBIZzBEeklpemZzSHNvYWYxZHpsYVJGNGdjbFA4b1BpeldNNkJQYXp4MTIvcjlIR2JpdFVoSnp0WldEVEpDcUZRWjhPWEVadUhXWlN0MU95aGNhdmg3bFZqb2tyblBqcVFURUczeTFSWW54QWlqeUF6dWdYN09hV1NDRXZNRTRSK0toVVdFTnNSc2FWK1N1ZVoyVHhqSGRVakJrYmdaVXNsNWFoV1JLdmtiVEFtMjhoMTVyUFBwTVEwZTdZVHFIN2JvcUNMVFRtb1dpWi9aYk9mUlF2azlDQ29ZM3BIM0NDRFFEakE5L0pwbWNML0h3MXI5cmpQQitNYmJkdlU2Y2s5T1k4TVZCM0FvNk1iSmRvNjhybkEzTWo2UHhzNXBUYkpYRjZPUmFMWDhrQ1FmU3FicEcycm9MUm9RNmF1eEdONHdjWnRlNmdEUFpyVHRXengvL1AxWVdpUG0yTWdVUlA4akQxaHc2S0hhR2pNc1JjTGVYOGV3ckFWZmxGS2F1azl5QXFuQ28vZU5Cem1Sc00xdUNqYkJlZVhmaUNyaHpLdjJ5SHRtR05aRlhzMGxCZU5pb1Q5Wkw3SzQ1a0tmOXlDNzQ0bnJ6U28wWk01czExVUt0S240aFhRZ0hUZlpNZmhLN1JiV1lqYVRVdk9LT3VwakxOdlhsWW1QTDFUNjNENjJJakh3bHUyOUdUWHVBUkxYak1jbU5TQjNoQXovOTRzMExicjdhcHNrYnBUdzlwTFl5TEFKOWNOcFJKY2Jwak9kUlJUaHMzd204VndadmZUNXkyRnJLVkNvZTdleWJZamVkc3krL3NJa2F2ZG55SVQwUTh4V0xnNTdvUUV5VDRvS2NnUEVLc3RXenJTMWpoNjdEUlplR2VmSjJiQTFkNHNmeUVmU2dOTHMxaWRTZ1Q3UWJSZDEveVY5WXVieWlhUDVNRVNaaW4xVlk3cTh5eFhQWjBtNGxXNTdMWWZxUnVRZmZId3YvTFBQVTRkd2JlTlIxbFNKYjRkVjh2YTI1ZHlqYmFJTmp2bHFWQys0bTVVaVpZT0VlWDVjMko1VjROd1VOS1RxUFJqU2tod2IwQWpaMjNHYmd6bk5yTVRDeE15K2Y4UnZ0TDU4TzNLdXZDNW0rUkNtU040UVVtZVN4bld0dkRLb0ViaVFxWHZsN1g0b09wb3UrNFFKRDFjekpKakI4SUNpQjRIUjRVaXM1b2d1NlozSmo1eDNMM2E0eGZNY1hwM1Jldm5hOWRXdGdKM2ozL3p4dlM0M1B6OUFYa3ZCYnJReno0RUloT1AzZXZtU2Iyb0o3RVYraXE0SStBbzIwQW1JdXdWbDlxSnl4a0tkYzg5dXZydjcvVTRKR0VmK0J2R25WOXlEelRjaFZMK3cyVE9GSzVlbkowRGZmZDMwUm1WV0tmY0pCR2NEelY0RnlSeGMyVFpubWZRS2FXRStpbkExR2ZEUFVyVEZWMllhUFN3b3V0UmF6dkdsMXg4ZHlVblNxT3hibTJYNXFEWk1LaGpVelhKb2RiTTNya2taR0ZQcVNURlY2RVhsUnlTdFZJbHR2R2xINytwY2ZDZ05JMTBvbXlyWFFNL3NhWnJpUWNKTEs3TXJEVnVlc0FFQjE4UXZnenArVlBxYkh0ZGZwY1JDZEE1cDUxa1hyVWFsN1dpSzAzTVphV1R3SitqYjc4RnZhWkR4VW5FVkJVNE96QVJxVzlwUi9SYjZ1eGlhL1NvZzRtSm82a0RleFdiVFV1TFcxV0NwcTQ2T2hyeTBiWTNORWVZTFlscDRrK0U0YWtUcmg5VjBlRG9zamJ6N2dUa3NYZnlFMHhrRCtiWjdIcTJvc0R1TzRocGdNZWwxTlQ5S1QyYlF2d05jVW55eDEwWkhyemdIOXNHSXZsSCtDTG02aXFUdUFEVStuRlNZa2docnNvVXZqNVgrUFhHQnZvOFUwYlFvNEpkTkhERk1RNWx4QmpWVTMzV01waXU1aDlGSnJzWTErU0pKRUlwejM0K0pxNCtMVnJGVUtEdjgxbkY4V1ByR1gxcjNjWU05eUVHbWx2NHBUN3NEcFFuVHFoc2dEOHlxWDJHRmRQTzZPWCtBS3paYk5BNTlwVlRVMzkrRlNLS0dNdENmaVRVYjJpdkovMFkwVzVBQ3poSFNFMjQxMGU0cVI1RXorZ0RxVEhZamJaZG1nc2c3ek9uclgzUlAxVDhhdEtUWnBCWXVoYkZSUXZUTGpzOHhZR2psRkg2WjdmNS9SeXlFbUk4akRkUXlCNzJNc2NaRTU5c0tuZWtVTVdqWnE4azd1ZlNSdlo2aHFVcGlBTk03ZlR4SmZWRHhvRG4vWVdtTWViZm03dTJUaEdWV0x0SjR6SjhHdk1nU0d4Tkt4NlRBQUdyaFBrSU40bC9SYkl6bzJZQ2ZMQ1J0TTBKU0Vob3JKSC83Z0V0eGxEeDdyRDNRSFZ1dzAvT2VCRVRrNnhKOUxWUUQzc3Vob3BQOTMzSURMZEJxckQ2TWJ2Vkk0bXJzb1gxZUtoOVpuR3F2anVJN0duTUR6Q2ViZFB2TVRIS3VocEVibVZUWmM1RDJoL3FVd09VM1A4eU81R2JkSk9zNWcxdUtadkRlUEcyZWNGTTZqZ0xDYUxJQU5zSG5yRis3QXdCakpXNEZ4NjhwZVorNVBVNUFqRloyaVE0NkVwd2dSTkpMams2bnp4d3VIVE1lR1FYYmxHU00xYXdITmJIcXpHQkpyaFRZejdIa3hQWExSSW1GMjlZMnM4c2pxWWlHbTRKWlh2UUR4QXpZdkJJODBMV0xIanlGQWw1SUNxOHRGQTUvM3VHRDJvMGhTUFA4azJHL0FsTnpFQXE0QXhHbGVzdC9KaUh2SWJNc09mR0w0NnZhUHBBa0gwb2w0TERCb1JKL0hNbUlhTU9kUmVPREFlaWZBeSt2QzBNWERtbnN5NGtvYXdEeStxYy9RdWtrY0t2VHd3MnMyUDBPVkxEU3N4REMrYk1TV1BsUnI2OWZNQmdSN3hRdzlocDZvMXZVRmRnQ0pSRXd4b09HbWFyc2dweUZiL3cwWGE4QTRQWCtoOEw0Zy9WbFJlZnVXSDc5Qm04UEFjWmhlZmRjSU1zNmRZeno2b1J3cXRqZWM2cW11WG9FMGMxcDVjNE91UnpXNVNwQTVVempnK0RhZG93bTBtbnpld041VWx5K1JHZjdHTFhYOTdRSlhsc2o1Qmp3cTNFc1pCR1huTU96OXFvYnU2SHZmRENHaEYzT2NyTHBtTFV2SXRyN0lTNXBhUkxrKzl3bko3MkVSamIvMVZvaFdPS1phdk5uR01YbkZTV1phK1VYc0JZWHBQWThZL2FsRE1aNkxDdVlPQWVnRXNFc1g1ZCtCb2FCbzBKUlEyTitCMXNxZHRob2RaZHc5bXZKKzRiOHZyY2dTYjRCNzgvS3pJZEl4LzBKZy9Qd3JSVlZvby91anhNb1RFcnp2eVVJVmo2b1d0UzlWS2JlZFpIbExsRnZXYXh2UzBoMmRreVZNM1BLRmQ5ellHeWpXbGxydGFtMTU2andkMmRnOEtDSk5OaHRQOWt6c3hITi9FY3NXbHZMYlpRUFlhWDIrSG8vWkFJS3N6aEJIbHh5dmFKRnpnWlkrNE1nVEZKa2JwODlrSG9FWjM5Y3N2OG1zZVJENmFFTVJQWTc5VTBjNk1OODgybWVubzdjYk8zMTM5TWExeWNNYnBpWWMrenhpazJOaXpEVU02QUpRNnVuRDliZ0lqMTIzMUM2YysxNzg3ZEJFc2NIanU1c2hhUVpIUEt3L1UwanV4dGFoZis2K2JJT2V1SmRCV2tZcG9kbFJTTm4wamEvUGNWLzBlK2pFZ01DNFZYRTVFM2VHRG91L0lHY3hYOEY2OEQyOVJBUEN5VEF2R05hNkV6SXNqaXZHa1JpU25SZldGOGZmT0c3QXhPL0tUaG9oWnE1ZW44bS9XUHpFT1ZOcEl5MFBhNDFYcXdidGtKeHhBdkk5OGpMMGQ3R0dLVWJ0UzB4THF3Zm1Ybzh4SFM5dUxncjNkaG9USk1zU2k5L1p4UmlEekhwaWRnK0tmeUJSMHNRbXFRb3FsQlp0bFZ4cHpOa0ZkUWhaSkl6bXlZQThQSmh5dW05ZzlRYTJ1TTBnRXJkNlBoeU9HUHYvUkFZTEpxS3FSRU05K2NKR1YvS2pNN01ncGJGV1pCQ0pUdWFsZm82Q2E5TVd2TG55Wkk5R1IzWkNJdTJLbDJoaUhhMDZRUFN0TnJrUTBSTVpXRjYvT3pSSlZIZ2pMa2g2RStxTzk2OUFyQ0p2OGhrNUlLdmhXY3BVcHF6M2pMRXBxblQ1UUNyZHVvUVNWNmpYSHpBc1FIN2gyOGZtL1FVcXVQckxoeVJwZUpMaXNUSlRlNDBwRG1KVUREWE5lSG1RRC93U3p4ditWNGNWQ3BFbyswWmpQMUo0SW8vekdwbVpiaXFXb1JkT210NnNCdGJmYWptZWVZeEd4NURwSzZxOGVQeDdqdWQ0dCtaYm4rWjF5b28yeXFBck5TRkNLakZkOVhIenB2Q25Zc2dYNUNrQk5RamluWndlNm9wbGdGWjJra0ZFc1pQOFBYdW9nZnRxYUtHYzc1R093MzM5UXZpT0NjZ2dnZXRmSEJmcnpzU2JiVk5qbTU5OHdPMHA4K2FkelhzOWMxNTh1OGszQ1ovcXhCanVReDN4ZC9MaVVQVFFlRFpyWm1BUXNjRUhoWE5BVHh6eDdFT2dQRHdGWlZ1dys2b0txdVBOb3AvTHNGMFh4NFBQTzlmdGRBSjhvOHNpeHMvZk1kRE95WVlub2FTUzVoeXd3SUIzZDZTS1ZtL0FzWDYyNnVwOTJ4WENlWUhUb0F3M1NDeHg3aFhjVXNyYjY4Z3dHMlliVmY5V3ZJZnFhTXpuQXBma0FZUkZ1YlJXRnNHV1R6RG1UUkZGNVkvWHZDVnVpWVZyRGNaTElRYS93eFlJS1J3eXB1dktxMWprcW9ZNTFTNlV6cnE4d2dMdTlFTnRzWG1iVXNIZ1AwYzJzMFVrWlg3cS9uSW1QT2RsUHVEczJwelVpdFRJZzdVcTZQY2Z3SHlYTCs5a0xKWTNoejhCeTlGSnBuV3VGbG14cDZoQ2d3amRrcnR5LzFDUmx6TWZYY1dJRFNzSWRYSTl3KzZkVGhrV2VmWDRITVJHTGs3NTJGWlJFckd4dkN0aE1wREZKYTQyYjE2YWVvc1A5TTUxNzkyZ2kxdFB4dTRjTXVucDljYWN1WGJqYnROeFpIS0MxOUREcU9CVm10QVVvSUFNcjJEeUZDN3Z4cVBaMVNMSUxPVU9TajU0ajJOcHhybitiUGJlTHo2RWFmZlRVQjJPcy82WStWN0JaTG5NcEtkK0M0VEFjVnVhNlJCaUZpQWJTV2RQTW55bnMwOWJTcEVCNDdUYTZkTytCTkVFMEhOell5eXowc1B2b0JyQ2w2cFhFajVjQ3V2dlJxcFpZT1BmZmpCT2o3cHF6dWd5cDUzTUJZYjZSb2xkdTdQaEt4SnQyRlkwYWVMM3hqTE1GVTR4QXVMSFJyMm1uUnl0SGJoTW1QQ2tsWFU3ajM2YlBLOHFKQTNXbSszVjIrdVdUVDlDUjVLL3VnWEYzMG1NNHVKTURLL1I3Y3dWNG5XbmtHUVFLMFJyN3hxaUEyTmF1bWlWcVFJMzAwZFdld01QbFpwdEdnRnpXRFVLa0RLcGh4Y21NdGFISVRDbXRNeDZjSlZDaFRVdW95ZDNGUml3TWRQYkhpTVJCRUg3TldkTmVuSkozQ2hpaXhLRFdIeG5xVjVUYXNnbmJNdVZVc2x6bHZseFdaeHhtS0ZyLzNQVE9Za1JEL2MyRnZDT1FoWElYVG0xT2VDbjZnT0NvR0h4NGxDVlFuc01SV1BDZ05DMytuSFZLTFRmSVhYTHEzMEF1ZE1LTUx2VTNoRU1EaHA4czNBaHdUWHlNUElyWG9sWTFac2g4ZnJVc1Jrd0J2bUZQTFdsMUxGaFVJblVsU2hxdllZK1drdUZMVjc2VVd1cW8rK0pkbzF3VlUrZ0s2QU03QmtNVzMzcitqT1NaUGE0eGo0MDdZK2dnZ2xTNmEyd2REWERKQzhmNU9DN29DakJsa3lPZlFqUEVqR2JPRXVubnIxQ2ZBT3l5bDJHSkR5RlU3cFpFbHdWVTAzKzc1eEpYVlZTYkhPVldIQmtSd0cwZWZGZXZYUTRtcnA3RC9UVlgzbGRnaFB6R2lLZ29LbjhiS04rWm1WdFFtYm1TaTlMb3gzRTRxNm5YUlE5bkhLR2J5WklQdXZBdFJmSjU4eHB0SUxrZmJvYXZnSDI2YVhURnZySmRMYkVTZ1czdHBlYzA5OWI0NjdlYjRLUk1mOG9OS3JUT2Vid05WbHExKzBycG1RVWI4ckRKbnVhTU1QSldDTy8xTWN5bUpFOUJYUEdQNHRiMHhoeEE1MTFycHdwNDFnMHVibGx0c1FucHBlU1YxbVdBekFiSm9Fd1dCamU2TnRlOFcrTVlldWczdVM4eGNnVlQrUVpSY1NzblRkZXpXZFptN1FYUXVLdjc5RVBacHdpRUNscGM3WG9xT0JTY0pielVTVnE3Y2NRek94aUFqR2RFd1gxNzhybkJuY0tlendRMldnSjR3VGU3cVUvVDFGQ21ZWEtFa2tyK2pldUQvZ255THpWeXh3V1cydDB6K2hTZ1N6MExRYTdBVjRyd2l0Njl4NStXTjdteVNCY0xqYmJSKzZTK0JIZTZWK3ZjYkRVWVpiQUlGWXZ5S1VFUDJPTVR4T2VTajRKZ0UyMy9RQ1N2eDhVMXlKQmZEbnBUZytJOVBHY2lZY2cxNDc4WTh5Y2pUU1N0WGZlTFdzaFNpQU9zUUYyU0dQTG9ERXIzRXMyQjkyWGVIWFRBckdtOCtkS29VdjFZNENLSFBDOFUrWFpSMGkxVnRFTlRQckwwd0VOM3JLMnNUN1ZYSG9TaHpKNGtjSkdOWFk4ejc5YUtzZTNJY3pybjFmSkNFRFBMdEdjUEFURzB2UmR6VG4wTEVpdmlHQXg5NmE4Wk1pdDQ0QlUwS1BMRlM2OUxjQlllNEdOQWdvcGpFTU95Tk1uMXovOU4yalVyRUNQSmx1ZVo3UTBRWGJBV1FMcXZHZG9CVnllVGk5QVlEdURqMXJaT3RNN1BoZ0puTnROWjJnZWZRV01KOFpBczNCckkrVUZWT2t2RjNoaXVhQk5PVGdla2N5eUN1VStMRDV4djBGNjBCM1RMVXYxUzJRem1KUmsxYng0MXc4YXZjVFo0cWorY3VEb2QvWm1xY29wa0pvQ3ExK1QxY0t4T3g0c0RCOWR1SnJMWWhZSDh0UC9kbjcrUXpHUVd0dUtRVThKOWpPWTlCOXpXcUJCWlRzU0V0SmlDTURDVDBFTFlaUzRob2themZjaHBseUIzN05PWHBVdHcxaGs0WmVpMVdDSlZRcERmNVp0ajB0WTZVVXhMQmo2Q0lXZVlQcVVqbndZOE5YY05ldHhKMGpmUzgybFc1QmZyYnVHWUtaTnBoY0F3Y2lnNkRTYk1KWUJlVVo2WWpRMHVUWXc0a3lCWDN2L1cyc1VLMzV0SnM0ZnlxaVdnTWhkbFVrNUw0aVovWE90STB4ZXkydHpid1pvSlIrTHArK21nQmRHaml2clNKeUhkN01uMGZGaFFuaURMdEdWUUM0NkorbFBLYXMvcVlVZGNKZGNQWElCR1VKbE1QSnozT2EzRmRzM0pEUmVzRVdXdXFuc0VWSTNZZmRKcEY0Qy8yQU1tQ3laZDlPdDlmdlpIMzY0K0pkWDlCUXo2VU1LZjgyWXZodGljRTJEU1ZEY25nbUwwV3RjamhCa1BkMzg2VnNHQ1h5UTNBTjIrK1J1VWpOdG5qUzNBeDcrc0Jnazc3VmJPdnNZbGVlR3lLZkdtOG9USWlvSytPN2t2eWFOVTExOFRPalpJa0dadlF6RTJUS1kyQWZKT2s3Y2tFeHlBZGNlVU1mQnZqbFZRVmVzK3QzWjFMSXE3Tld5Qzk5V000eTBqRzUwZ3JRZEFuUDNOL25oZGpyMGtkUzJ1cjN2YTFQaW9wZ2h4clJiVTN4Y2ZTQllLRDIyTWxTS1JuTFhpN202MHp3UEdqcSs1dEhSdFRyVTFMYmpQVUxaYnpPNHVzeU5UNVBBQUMwTXU4NWVTM08weVpnVGJLZmF3UHNyb1JqeHMvbDNmUGY5d2l3dXllbUg4TlRxMUVJZGtrY0paNkRrMnBuVmVwVEE1Z2U3ZDZ4cEdQakIxUldLcUx5ZzB1SDVyd1dYZzY0UjkyTmtQY3JNTkt5QXoxd1IrMW5sQ3JwV05SRkFxcmhpeHVNNk1DUk9FTW9zNmM2VkdsbWRZQlBJWDF2cEUyaXViZkdVVzd1TUp6dVVNdjdxOUdZdGtta2EzZThIUlVsY2J5Q3FDQnpyR0ZPZzlSaFRpT25KbWFZNmdDVlV6dm5najhZUzhkaEJxdDlReCtBOGkwYXFNT2kyZHRpYy90Sng3SUx2VFJ0dXZTNGZzaituMzR3ZjZOL1p1citKZ2dHL2h6Tkk0Sko3eTNJRVhGRlJXT0xmTnlVZ2kzeHZuNkd3MTZoRjNiVlMxK09uM2dGZkpTTUJLRjlpc1pLU2RCaTNsS3hRQUdkYUhEMXdaemo5ZEZWb2Z3ZTIrbVlVRVQ2UDQ5dENXS3JOWGVhMDZFSnh5Z3ZTaTh2Tm5kQ044My8xL2dFMEFPMHlocHRSOVZ0Ti9OVUJTQTUwemk0WWF5TXpTNkcyN1h6Q2VzRUNTRTVXbi9BUEZXQ3ZXVm5rQUx2UWlMeVJNblRGbDk0UEFWMThxMlJwaHNvU2ZVa21tbWZNaHVzQytEVG1KMnlac1M2czZGL3FjN2k2VXlOQW9GVXN4NmQ2THJjS1llVVF1REJTek5pN1FMbXRtWTZuaDFkWFNsNjRRZjloN2lsVFdQMWZ2OGFjM1BwSHpCbmVoSnd6OXprSmN0eUh4dXZCWkRyR2hOOE5jWUU4eUpJWHZOUjJ0bVVraGdQanQwNVdKRnBLcUlqcHNTeDMyQzkxaiswMy9zZGUwNDRNeWM4V2tCRTdPLzlBdmxHSVRDZEZQaVNaOVhaZ2FuM0pnSVlOWk1pNDZObngwd3I1SGxDWEhrczBCaGFsTytaM3FFWXp6MGREWjlPR0ErWXU5alBFNE1Ib0paQm5JVXFtNUEvYWEvMjIrSEpjVEF4eldiaWVBbWluRlp6djlqM2puVjBaa2VpWW54aEJsTThuZ1FucWlVM3ZZSTVtV1haaFJ5ZElLTVNuRmVlTUIwTXRwSUpzUUE0V3J3VnB2RFZ3b2VXOU5DWndWSUtvUTVzUWYwOS8zQ0dKQk5LMUsxRnRab3E0WmczeGpFdFRHcloxZk9vZk1MMktvay8ySjBYQ3dkKzVEMFNFWmVSUjd3Q1A0ZVpUcEhsT2VtVit3RkZDSU9lay9UZVMxK0lPQkdUVm1TQWh4aC9FNDQwVmZCeE44eHZBVEgreWhEZ1B4QkFXK1MvemhVM0VGdEl1SEZ3akRCem9Cc1I4Y0FmOVF4TVFiU1FNMDdRMVh4UVMreDBVVXUvY01NN2N0eXpGaXNTc2YrK256MHpvUHRDcDNiaVZSTThXUU1Celh3RXFNd01saVpsTHd5WTh0UE9DeUlzOTN5cW0yODh2d0FLZnUrL01oa3JCT2hXV0FuWVV3YTJzamlIZ3MvRDNBMU8vVzU2UXQvQzBDcTFCR2E4VGRKY3BRSWZxTFZjNERhVTZ6WC9EVURMZ3EyL0lKRDNkV1pjcjFiOFM2OTE4aFdoUG8xdzNwVHpCV2p4b2ZNS0xsNU4vOE1lb05uNXZzRGlCKytMZW11OXJCRExJS2pwenMrTDUwVTJ1Z21ubHpLT2RoQ0xDanUxYytIR2Vmd00rYnJ6b1NsMGNCVHZjeFg4ODhLS3NZT0VNWHJXMHQyb2pXaTRvVUY0YUg4UUFNcnZGN3NqMEh5K09tNWVvd1J1NU1jSHp3OWt2L2czYVU1K3BXTW40NmZoUk9XSk53SDVDbnljc1A5ZEVzZmN4QTArSEs3ZlViQzl5Y294RkErck1WYVlIajNIWWNXa1dFdHlXaFB3VnlMREk1YWpvNWNOZ3E4bTdXQWp4S1dVaXRKV3pra1JSWlcxSk41VUFmQVdWUmtCUk9ReStHd3Z1UXR1eVc1b3FlRTRSS2lIeC91WU8ybUhJYVFvR2Foelk5RlplTHVpUlRYMEtha3EyQUdldVpvWERNcXc2MU1tUDBjQ0VSMUJJdzlFd25FVDBrZDA5Um1rMERqcjlnU3ZzUmxLU0F0bmdVZjkwdWlkSFlEZmxIMnBiTDdNamYyeHBuSjhNMERmM0w5UWhZSmZQY0JKbnFWbmQvcWc2eWI0YTd6RTZISzMvWHJUSzFlcndNUklaV1kyc0JtWkVtUWNwR0ZhUTlXLzJ4RHFBZVI4QS8xTEJTbmMyYldjOHVwT3oxNEhKcFQ0eGVWcmNaM0dWN3JyMHU1ZGpjOC8rbUczRyt1QysrZkFpakNuSDVrRnhRQjRTTmFCemk2WVA1enpoS1hyeVpTdmZuMHpqUnRpclNlY3dOcW95U1drbnQzc2dxVktEVm8rWCtSMzFrWGRuR253cVNvUXliNS9JYllBTW55Mm1DYWVhT2NGZXA4dmNLSEw1NVVKQmxaMXUzVlVLY3BJSmo1a0Q2UjFMSVhuZFFXYnphaGtNTDl3dTI2SWYrYjhWSm9FcmxTZlJBN2JOWHdicFNKcUJFcTV2bTVRcy90dWg5eFk4SGF0Zy9xUzkzam1TdlR4WC9PMjNsMXVydUlabFBPYlF1T1dyVTRxYVFOK1ltREFIUllOL1l2aTVDUXpHSzZGQVpQUS9BK1A4Zmc5bVoxZm80Uyt2cWIrN3dLSTI0NjJnRzcwdVRuTXk3UEN3cXJScGU4ckpwZlFIT1RGRHlGSGgwZHF1RVBZMHRaSGNLVXpkdmRlMUhXdWZydFg1eU1VdHl5Zk8zck9FS28yZjBYL3YwM1BZMkViSkJpUXdiRjA5REFycGY0WFR4b2s3NklDNEY4TnRxK0hmWXkxY2FXMkNoWExkN3RFbk1HUXU4VzZ2Zm5XcE9pYVF0YmlKQStOUXBaSDEzMlhjZWhBa0tqNjFDRXoxWTd3YldUOFhvNkc1S3Ava0w4dDYxRndYNkF6YWpRU0NrWDBkT2p6R3M3MWI5L2djcDl4c2RsanFVU1kvbEhkWXNYYlRiUW1ieExYcUtNRGpCeWVNV3RCakxDcHZRdlprYjJrOVJXakdxbkQxaGZVbjY3aTBHazdLV3hzVVhTL0IyczNzZThIOEZtY3V4d2E3ZElpTTErZ2JhZWNLMlAybkZxQWdMUGtQdHJ5YWZ3TUI3aEtDMkZUZUE4NWNtall6a091V0UxNlcxSGFDUnRRRFpUenl5MXJaMHZiMTJodXA3TkdyYVMrbGhmeUcxSXFzV1l5UUQ0cm5NN3ZxU2xRRTNCeklKL3hSWmNWQXNHVldlaDI3NkVJYUsxQjJ3ZFdFbFNjaHd1QTdZTDJnTkR0VzBLZWljNDhwZGpGVWcvalI2UDJuRlBpcTBhM2txMWZCVCtzbFY1ajFFVTgvY2c5cGtUZ0JNN2hZejRpNmpRYjZmRCs1ZTlaNGoyZDVQWmNzRHc0VjVWYmxXcm1Md2xMOC9sUTVvc0x0aDROUnNSUFh2MWxEbzN3R2pLbjFVWHpWK09LMjJybnZOc09OK1loYzdwajVXTXJPNnBwT0N2N0Z6OHFjaDQrSGtVbjVOdXZsTjF6bXoxRlJGSDlseDVUVVZmUVRuUlJDN21WMUZtaFoxWWVwbnJxNVo0Nm50c1JhRGhnQ3pRbGRNMVExb00xSld2TUk3WFhrRmh1Z01vT1RmWTl0VzdrVUFzMmViQ0lhWWdxdnJLNmhVTmxNNnRqN3Ura2RPSUtsd2x6RllrN0dvOVJYZlZrbHdvWExzbFUySnhlU2p5dFhUNlh0Vm1TaXlQOXZCcHRDODBvQnBlak1nV2NXSkVFSjA0eHY4aVFMZzRVUHhzdGNQY2ZqOXBGLzVWWGR5a2ZxY0J5azJrUXhRZnNDaFo3QURqZWdQRjhTM0c4OXNaKzJlVjU2QVBOZ0s2YWxnQTRoR09HbENGRDFiWjBsRGh1SFhaOWlMRWUxWDBCSDJMVkZFQUlGUmlQbHJBUDcySitRZ2FXTkorYUZQK2E1TnpFRGhucWxLQzJKejh6cXZ1eUhQdDJmUit1MnA4ZEl6aTNUb2JrVWJLUmRiQXhtWXNVbDUxUEp4NEN1d3paQkhiWXpBTG56bFlGb1lCRTZrQlJROTRHZnpzTXdCV2JyeGVBWVp0MFRWd0hHRDgrMVhjODlKUnVUSGFvSzlMU204SWd6MWtSa3hWOU5kT2hzRzhRdlFtTUdjNEpZMDN4dE5LZmxDS0VzMm9pR0pUOVZrMzBWaGF4Yk1mVVNIRGJGSjZKQURybHVrNkV6cUpnY1ZjYXRFdUlIeEVsaTd5elVZUzRJSVFzTktCTXNiUXZPNmVCbXpiT3haQjJQMkxhNHZRREN6L3ZZbUlYTVI4NGFSSStvUWZhNmgvOVFLeHdqMWtTa3YrMjBXNXJtZzE1aHFiQXhoMGpzbTJEWEtiTTVTb2pnTmlmdTJ5dkxjVlNoOXk2TVp2aTFvbXRBT1NDa3hBdjVLYXNkQWduczNKZFJ5QlZDUmN3dEtqV0VxczVpVVR3bExmcERuK0E1eHN2aXIzdFVaQjRrdmZJTFFWcE5mSDFFOGpETXAyNk5sVDNrTHRIZ1lLemtrZEMzK2tBVVRacWdocnR3dDc3elZTQnE1blovUWpLWGgxOFNLeHV4aHdHeFJlVEFjRGZiVXE4bFRZNFpKdEF0QzNXSTJkcWRHdmJyODdDYjFlcVhCaUlTb3QzOStvKzVaQlFWcWczY0huNTl3OStRQUladUZ4ZVZZUFhIOTl3Z1pnV3pxd29kck9rYnB4YlNKQ3F6U2Y2dzVPVHkwV1FRaVVUZlJ1T200RTJhNTZZM0lNdHI0S1QyYVJNNGx6ZGE1Sytldi9uTUJKYlJleDVOcTFLMUpEUm1GQzRNRjFWNkFFUVdvMkp4UTR2L2FWaytCT3VFSXo2WFh5Z0lEaXl0MHJvcGN6c3NNSmNoTkp3T0NHME1tbXdEYVltZ1RkMHA2M2k1SHZTNzBzSkl0cVY0Wkh6TUY3bEdDclN3d2ViU3gvMmlaVUlnd0RuSStxa3QrYkF0US9HK2pKZGN5M2dYa0M0eGtCRVhDa2lTU3l6aHlPb1JOSm9DbFBRRFVhakF3L2hVM2tVQzdKdHJhK2QxSThkWDFTdWdDbHhEam45NkIwcEZPQVEyV1ByaG0vaUYzU0x1T1lZZ0hBM3lHVHk0MkRVMWFpZUsrWVpaTXVjNEF1dXR2cVZqZ3E5a1hzaXRIKzF2NVluZWpwK2xRUDhKOExyREd0aE9SMnhNOURDajd5WXc0R2JucmNROWs1OEYyMWF1cmdYMVVkUURzaVFNV0l3TFRMTGtEeitTbG1mRXpYOUJBeUJ3SE9LWnZQQm53bXNaOVRUMU5rQkFUVFJSR0lXMVlmRlNMNU9Xd2hSa0VrY0ZOa0pEeXgwb3JJRmloSVNVMGtYOGJNRG9UYzJDNCtsUC9KdHpZUFhkSDk2Z2NnbFdIWGpNVE5Eai8zUERkczV4Q1FIaGRiT1ZFNmZJbjZxUE9BQ2ZxVnhFLzMvSVNBMDAwUVRsbWpOeGI2TEFOM2laOWhBblZpbTFENDNqcVoxN2pCQlpsdFFhVVRkalJBdSt2cmxrY2pBMit3OVBjNWdiaGRXM2ZGRHkzSEhxaWpEc3JPaUNCdGVzd1FjRXV6RmNOeTB5N085VG5RNGl1Umo0M3RLK0ZTV0NEanZVenVJdU1JZCt0WW5zd2Z1OFd1dUMxY0lRRmlkanBZelRUWFRGVGxNMHFGVGNWTTFyQ2w3Q0h0TEVwdlpQRlcrcVhlVUJZdDhiOTNPWWI2YzZoSEdLSFZVNXd3WkVTQ2dFMkc1RHNETkFBc0FQb2VmcVNrTXd1amRFemRuWHJyVDBSU3A1S3VQRm1TKy80dDhDWlV3RDFSL2VsRjdVQ1I2Wlo3MmxuUW83WDh3Y0tjaVhid2RzS0Y0Wng3QUVocFVRMHRIWUJsdTRHbmJGQktFWmp2NzJDanpZNkNrV3VlNUZtQ1hWbE1aeGl3Njk1U05pZE5XaVNlSjJKWFdNckJMd0JjV2c3T3dLTnhYaGh4RVhhTzhIRHBPQ1N2ckI2T0ovRDFmbktKUEFjNGMrTmg0MUJrWVE4YnZhUFJZbkNoUnhUNTFMT1dTelh3UlZkbGEzMWdrdGp3WXNiR2FKam1IRU5LblZ2MEdSSjdBblc1REJwNUJqelZUYzcwWDRtWlA2dW9pUFpqYno0bEcvb3FGbHlXdDlnWTJ6WHg2d1pTbmxkWHEyVUQ0ZEZPdWkyV1dZRXdxZlhkM1NKN1A2eGVGVjlYZytPQmREQUNnRWs1Qk9vYndFUUNOMlFIUmNOOGd1dUh4UkJtOFQrYWc0YnRZeUJ2bzRWMkdnYUxaRWdHdjlOU3JUVWR4OEEzWHJBelgrOXUxdE5nL0RjQ0hFU0tkSmpmQ25aSDZyQldGMGpQVkZyZ0VtQW5UYytQQnVTYUtnUDc5dCtZdzFXVldDVE14UXcxZWIxZWRHU0xwNTFncDdWZnVVRVc1emdqbHB5dzFkdlEwOXpySkZtRGtXekZBQjByVEpnTmNEc2pPL2g3Sm9VTVhrRTBZajNMNzhpMmFGZi9US25FUW9ibVVzVEdmRURnaEtSeExpTjZub3h4eHBDckMvV1M4ejFmRXQxTW84SXZCODVsa21OSE5CKy9XTXMvd1JVUnZFTnRDaFdYZmp3VmJGU01qWjRvUE9mNVdmYmR5S25LNWRmNHZSZWhGOHowN3lRK01TNnJVV0NLdmwvZFhHbmY4UFQ5WWtGWm1ybWQyS3NBanprdUQ0QWN4UlZkLzZ3M1Q2akMzWDFLWTNhQXlkSnhlbFFjb1lqcXEvS0VGV1ppZHN5VERWeWt1WTFMdndRajhHdllFVDh2Yks2UUpBWHRoaFc4N3pEMWFQOTB5QmVLdFlXemI4R1M3V0xYWDczb2VZNEUwTG1sSDJrWkswWG10ak5FbWV4dHlmUUg3SmxaaEd5eTNWazhQZkRaT3BDdEZkejBSRWJ3NkUwWC9vVXl1ZktvblJOQnRkM1VQQXB0REFHaExON1NSMG9LUWFvWlkzVGRPS2dIN2tybHphbnJ1Q05udnNWaEovWDFtbTl2eUpPYmhYajJSb0JKNmxhVld1NjBZNlA3QmV2RmZOYS9TdXNQeTVtRUduZVEvV0RJZ0tiV0JMM0dIVkJIMWI0RG1aNUlSV0Jnd0duQjYvS0xla1FNK2l1Y3d2bGttbjFNNDJ2MkxOcFk2UGppeUc5VnBUaDhQU3BoZ3Vsc2I1K2hRakxycElnS2JSV2d3L2xRR1pWZnd3bWpMREFrYjBmdk5hTnFEVktxTmdSeUlJOXVwckFuVjIxTHN2TjNUMVhyWTZGQVQxYlFHbmQwa3RWNkVkT2lpbGZUS1ZJc1B3aEw5Tkg3TlE0RFlLTnVaVWg0R2FkTEY4RUVyUHZQNldyb0dZQjhBU0RjL04xWjdBSGdZRVdNdTI2akNab3VBck9qQ3U0K2hNeWRRR1pvUUtoRjFQaGVQcU8wSU16Y3VRV1dPWHJCRDF4TjVQajdRS243a2hsWm1PeW91V3h6ck92TjJUbkdGZ3cxYmkzQS9uY3JNRG9sODNmNVVVK0lPdHliekc1M3hTK3FQNFlYYmpUcC9xc0ZsVSsxNXZPSHJ3dHc0Z3JaZnNoNXcwR1owbjlqaGMxVzk2VzRJNDR3ckdZbHdPbkVuK2Y4c2hPMHh3SDZBNSt3d0xnU2I0aWNWS0h0QUhnWEZFdzBoV2tmOEw4b0dDaFVwNXVaVVYxYjlvb3F2ZGQ1SkdTWjZNanRhYW1QdUpxVjVkemw0cnZ2RmdpbjhlZnllN3JaaFJpSTR0R3d3cHcxd0tRM0R2TnR2RDRiZHF6VHRycjRsTkZDL05PZTVaSFJrNy9XL3dpZzJscjRnbUxMdnJkd1RuYnpoWG1rK3Y4ekFubWh1R3VhTHBzeEFJN25YeEZUZjFOSDRkK3dtZWdEWElscTZaVys5aVM4TjlSS0FlQWdhckVYSjRuVUN2OWpHUVdPTWpOZWFOaUZ4Uk5LRE5PZ1BkRkxkcC9HZGVxOUhRSGpEaVd1b2t0dFAvSUxleHh2OVIrbU1raXZ0UXNJcVN0MzBPa3dqSDNiZHB0UXQ1bjJ6M01wZkxsc1FMYTFWQ0toUFpqbndERzBWWWJMQXBzaUNSTGRjTFRhS0VzcUlPbzZ0R3hVY0NyNmE2SlUvR29vckRtOWJ5VFZnVGU3OUtzdnFpUmQyQzU3d21OTmVVK0puOHdEeGhFeDcyUE1JaE82MjB1VUFLL2VDQTFJL2NNUnBvbTdyaStPWmxsb3Buc2FlUEp3NWJHbXNIV1NsNkpqVXc4Mm9QMDFFcUtTY1RyOHFXby9uV0V6TmtzcGhwQjZ1N05PNkFnRTAxVGtwRnlIRWZYZmNEVDdITWcrSmZ3SHo4dGNOWk9keEJ3aUpWT3g4V1RPbmdWTlBHWUp3U1Zrd0ZxVHZJYWtnbExQaXY5d3g2TlRqRkVkcFEzYjNqUVE4NFRJeU45a2JqUmJ4WEFJMkx1UnY1T3F2RHNmZW1UVU1TbFdDUkZxeUlDNHdJWDRRUTNwVnNZUEtjYjgwalhGNDcyRktYYTNlMmxTeWt0VkN3NFQyVFNYbExwdkplczkwUmkrUTBCMlZPNEQraTd0aWFad0JXR1dsTC9ERlF2UGNZVk02emVrQ2hJVjJjbG5KYWc2SlZZaEJ4WmZvbWFhUHR1bk1zckRaWjIybEhiMU9veFNIVlRhUTNweGdhS1JKUXRlck9DNGU5a3IrbzY5Q2tBWmE4SkFzRXRWUVNIN3JuenFMUkorb29OTjRzWlNuOVJPeEVTSHBpTzJWVEtMK2NVYnk4TnFFN0FwT2tPdHlxejVXMmMwanBvTGRlOTBWQzlmY3NXczBkbXovT2ViSU1rMXpUMmxyYlRhaU9tSzY4T2tiY21DSkJIQ3BvckhsN0x5cGJLZ09CSU5Va1Y5NFVNYm5sUEdENVFzeElvR2tBNVdFRlk0SDRiZ2NpaDFOd3F2cmRsZjBDdVNySzRTT0JhZ3N1UGhscXpEZ3lpc2Zodm1BOS9lak5ZN2cxbGlEYW9nY3ZNT0tST0RLVUp0cE9ZUHR0aXVzZjB3TGRIK2RCTHhZSkxzbGpUWmRjdmJTVGtVcTJNL2xLeTR2VnI4ckFMQ1dFWTJ0eDVTUnd0VkNpeEcwcFJTYzI5S0V0RlF0NmoxdktBWTIwQWF0M0w1RlprMW5sekhYNmFzT3dqRnl0WnkxNWhFQWpFVFBFYVpoSGNINU55YWw4QWlCZFBqODlTRWVCRWx3N28zTmJuZFFaRWhWdFJPOHVVeWV3cWtaK3lvUkFkVk1WYmdXM2NMM0JkdEdoQlpXS2xVem1Ud0ZLaDVtQWhZakZiZTRxVE1mNE1yNG5QalhBaGlOczNsQ1pCZU5ybnVocnkwdEV3OHJzOTZhTkY2Q2R1QlN2U1FzcDdYb2RQbU43Rko2RlVmdi9LdSt4dU1JWUJScVd1Z3BsRllhQmx2d29XaHBDZ2trWC9RWWxIbkxESDhpd0RIdFZxcEpSZzE4M0xxcWFhV00yeERCb05paWxFck5XcUVoNlBjQUR5REZrM1hjYzhZMU5YaFNXNGY4VHpyOUpmY0ZkRE1GcUNWOFgyT3V0TEpwMFlHbzV2d25ESlJ4Znp3dHQrT09SWXBaS28ydEc1OU9XTEtadzk1VkVHeHZhRU1uUm9pYlUrQU5MeityQ0RnNEMybjhOTHBHU2lYZm9GMHZ5aEU3RmRjbjVWQmorSEp3VjJZNTRQSjRiLzBVeUc2UldvaTdkR3FmU2FhQlBFbUR0a2RYcE5YZTV3UVhFdXV0NGRrSFh2cHI1bS9JK1FGU0tPaTRtS05oNkNGcG5TMWFMbEVteTh6dXpaUXVObk04aW9Fb0JWY3dPQnVONHZ0MU4yY0NYTmxCdUxKY29xTEVRZ0pDNEFLOHdPTTY4eWx2MWIzbllFMEp5UjB0RC9yMjNoVVpWSE0wTWdQSEo3N0hZRWpES1VLYTh4SFRiV05KUU9Xby9OeWg3QTE2WXhMQ1ZudVdKS2NDZ2ZjeTl3alpEbXlEWThDNjZYazQ0cW05QU1PWjQrQmViSVJDNjhKYytFa1hyN3V4YmRjczB0YmliVmlWODdTU3h6QnpwR1hRU1AxbXdUZWMrUkZCalMvZTkvcm5sSU5xelZTd0R4RVdDQWhWemcza2sxR0ZITkFiQXAxbXlsaGxvK1V2SlpDOWVHTVBnQmFaVXBDT1F6RFg1Vk5oK0NObnUzRTByTE9IOXZsYU1VZFZqTUdTREZvZ2tKZmZtcjIxZ1BFcHl2SGpVdVplWHZ1Skl5MXdmZmNLUGpBVFgvcDVNU3pWSFBHOWFXeERyY2x2YXZNc2UrSzllM0FhYTljc3FlcFYyRTJMUFIyU1JtcjN0aVJFQys5alliSnVqZm9wRlBzTTdaWkdxSmIvN3U3T1hJQ2NRYVRMc3pDTW82ejdFWHlxcDVnK2g1L1FuOG9BNXNtRVM0d1B3OFhMZS9VWitQeU1zSHAwL2FqaVRvZnpKejkrcWRDRENpci9MRnd2UEZlcWtnT1RqamN1OXo0bzZyV3QxN3I0OU5VNGRnM0owS1dvb0dvQzRQQjYrTVowaHJMOEphaDlTODJxZGxkMVZmMWVoSEpnYWNGT2xaZzN0M1hpSHZPcE5Sblk1dXhvQzU0UGt3SmlKdUR5SUpnSjRUallFSEZtaHZYYVNYL1puY25SVGNxMXFqZ0VJY3M4V1BrenE4allheUR3cHJCQjFaVlY5eVRrTTBZaDRFeUxRZ0tFOUFZY2pVSU5lYVhMcmVRdk9XZ0ZkNUJjWWI1dGRMTklJM2JHYnFKc1ExRTVQdU9kUG10N2plMnhmaW9aNDQ0bExramVsaGZrNnUrWFFXVXYvVUJLV0VJemhtY2l3TU43SkJDdkd2L2ozdnpqOS8xZUg1QlRSQjNib0N6OXgxZXdPTFV2RE52cmJUa0ZmK1IwMDJpeXRPRjJ4NnVCcy9IM1JzeVVhd29PMFJ2TjF3US9LVEJrVThaT3ZxL01qbEI2d1Z1RHErS3VnWlZDQkx5Lzh3RGtidXgxZHkrSUVUOVZaV1BmWlBiNThuVGNQOCtJOHA4MHhRWW53TWpEWit3SGRzREsraVdhUnhKd2VVL0p0NlRINmZtSGZ2OXNrKzZpbE5ONkVuY3hPeEFyeTU1bFlFK1lwRmpHblRxd1hvSCtYMk5uZzFlS2xOeDFtcjlIajd0bWZNcnJLMzE4SGQ3K0JPdFRENVZQbG5MRDRtNWw4QW1LNkYycHJuVUNVYmgzbG84MTAyVmdQN2VTcDlkNmYzdkhqakQvQWliaTlCVFlQWVcrMDlieVd1OVJBY3I2bk4wVzlRZkhpdk4vWmV1cUZ6ZXVuczR5ekVtQ2JZNHR4WDNWZTRQQVJibWtyMW10WEhpUXhURUxRdVB0ekk3SWl3enkyTVVRakI0S1FXODQrM3l4cDJ3Y0w0bEo0ZjRZYkFiWWpzcHJXTDlYWWpsZjgxOEFCYlh0dCtiUWlxU1dMZjNaM3RlSHZNZzN3YkZXbVRzRzZkUHExZ0p5Rlc1OVNOdjgvWk1pUmVaYW5JUWVGUys1MVUxekk4K0N4WE5uOGp1M1ZxRFJyY0dXN3g5NXM5K2FScElvWTBucTZmaXVnd2dwZEJ2aCt5cFZndWhYVGc5VEdNQTRVcWpCR0tFTFpMbXZYS0ZIWTZVUnhuWGduUWFycnhibTV5amtOMTh2R3lWRUxIdGpnMEVyV0ZmSndOVXFacXlxOXRIUHhKbWkwYlJEV2FMWElqUE1zU0hwbW1EUGRiY3VyTFhzNU1hV1VyVjhNdHdLWTZZb01jQnNaQTUzeFExb0cxSWU5TWx2Sm5RdS9aYjF3Rit0dWJOUDJ5Q2dhYUtHUGFoL0J3cGlEN1JOK3pHaVRZYk5UeFZTcnJCWXpubllTUEtvM3IvUkRrZzVIUkwxZUsrUzh3WmRGbzlHT1pNdTB0YnpSOHNiRTBQcVVvZFFKbi9wc0V4bnM5V29UTU5RaEpmNHMrc1k0UjNWUWUxa2ZHS2xlTXQwTU40aVFqcG9weVVoTUJzcEdUMlJFSm8zOVArRlltR0p5N21vWEZ1SjBYbllxcjZuT3pnVlE1ZURMZzY4QW5FVWFDa1o0Smh2YjdiZTB3L3N4b0VOYkVhZ1EzNGloeW82anQvcEdoTFAxNFJpdno0YXh5NDI1UjJwa09xcmlxMFZSSjgxSGtMWWN6c2dOR3VuUUZxVDVtaTdsTGdQRlQvNjZ4SHFhdDM4MG8rZUp3SnF4eDJMcWVVcmtUM05IYVIvL2Fhek9qVExpQUVTZjZuZ2J6Tm56UDJ4YjZWWVZaMjNjMXFzSC9FZ0c4TmNlYmJCWGFZR2ZrdFlQOXY3dDdlUkFIb0FBaFVrYTR6VVpEN2F6R3k4UWVYYUcrRXl6NUlFNC9XUnhXNko2Y3lDQmUyaUZWOCtzNllKcjRHL0R6RnJKT1V2WHNkVW4xUEpYU2dqQTJrNUN6N0twdXN5bHdvcDNVMnFLN0RTN3JNWEpjT3o5b2xjYXFLclh6ZHllS2NPeGJTSGVCbVN0a0c3ZnlmbWMyU1kwek05WS9xd3NoWkJtc2UxYjJJb21yWGhoaC9kdGhpTm9hNDdnc2QzOUxDWm10WUM1OG0yUVF0NG1TYkdCQnNXaDhJY09rS0ZVeWtqQXpJZlcxcnlvOStOMVZsbnN3V3V5S0ZsUXJoTWFrNnhCdWRaWnZVSTNiWFhJQWFXVXdxRkI0V2cwS3FVTmdkN2poc2ZyS3hqZ0lUV2dXbUNJdlZHWUh1WmNxTVNLNWd6ZXhDbFU4Yi9iTFlZVFV5TStQbEFmVlZESzl0bGZ4dnI3NHNBZUxjRmR6NERVa0hyaEJUazZ1Rm5hanFsblY0R1VUTVlZNWhHclVJVkEyZ0xRV0g5SlZBYzNBdjBFNUExZ2Z3ZmVtL0g0UEZnY1hucDRRRkorN1UrY2J6VXhGZDh6a3oyV3VxNVdUVS9hSEVXVXRPY2lIWTY3REZNYWZNdGk5aUR2MXFMSC9LSlREU0FVaGhDYkkzWndPQ0dESk45ZVlsMnB2NFJKV2FxNXpqQ0Q2aEJab0RZbnRrQUNkM3d3RlcvblYxa1MxR29oMjhZbzBSM0x3VlVGSjAxcDU3UnpBd2NIMlY2ZFdpVnBJWGh3WXRBd0dyMVdxcSt1SkVUdllUci9PNnZsbDNjZ3NTK3RtQTN6RFUraWk4T1NvWUp2Nkc2d0xiay9ZRDVic2FGSmxqcW5EM0V0MlozRkk0Tis5c3dsbWRkUkVEYThHWlJzNEczbDM0T3c3RVZlditnZGNuZjJITVlTYlJFUlM1R0tFYlJkQVZKcENrRnFick5nNEFZSkY0ZjVselhQcENIQ1VLOHFqS044ZGVFMUUrNE82RzdWVzJweGJrenpPVUlUUXlxeGN1ZDZNWjhld1ZtT1dwVHZ1MjU5VkRlaUZNd3hBNUJVaE5TczJkWHY5QUZyZUpMS29NV0tua3BVYjlncW9tVnlvQlBwczZUc3k3V0FFQlp2bzJ1Q1gzam1ZS0NhMk91NDg2cDNiNGovZStjdXlqRW9YRzkzelZ4R0w2QktydjQ4L3lva1RtS1J6VEhFZDdvbXVFMFRMTFVLMkRTTllaWCtwWkw3b1EzZG5iUnk2c0hPRVdZdHY3dHdmZXZ3VUNVS0xsUlMwY21XNElZMmFFMG0xdGR2azQzeE81cFVsSHRSdEZKNE9LUmI4dUVONnNsTURxTVZCK3pMUWpNU2FhbWlQazQrSG9WM05OUXNkYkEyZnhsL0VmRDUrYVBYTG9oQVdzNDhsek5hODhQbEM4aTF0UnA5TkVzQUE3YVgzei9LN0p6MTdIN2FwZ3cySU1oMXRyTVEvZW01aHBmS21WdEljVGYxUmhHeUJCS3ZLc3B4YjltQzJrbG1abmlFZ1lIR2JjYXJRSkVJWU9GdGQwZmtwUkx5YjlvNVptYXFSTWxrQ3hWaFRFa3l1a0w2cTliQytRRHd1RVQwQVBMQ2UxNlJjNGc0b0UyajF5RGwyOVFPUnlMZkdhKzJHZzNsUGVBMzF1Ykl4aDdKandua2d0cnp1L1UxbTIxNkdWcERWK0R1TFIyWWNHVk5yYkNiWjN5NE5yaldxUkg1M2FweGU2SExLRjY1MkI1R3NPOXQ0bW5FS3pFRDF6ZUp2Tmk4R25tRHZLK2tTK2hDaDU5S1lJV0x2aEdzTXg5bWJEanFjUG9WMzN6V2hGSzF1NUR3UzNhbU5oNnE3NDNQMkx0YWtkT3BiZnZ4a1hZdVpISm9LNFNodGo5cnNEcUxuV3dHTnA1N0dXQytIRFZoeXpCZVU4b2Zhd2JDS25DUnliRWZmWTA1T0tPdXRzOFNmdEgwWjJYeWI1VUNkL0hlNU1ZQ3lYWmJzL1poSmErZTJ3TCtGYkMwOHY5akdCeEl5NlNuTTd4YzN0YyswR1pRTFdDaGpzMW12NXgwdkpjUDkrMWhlZVhvOTZSNFp2U3NUNHFxZloycHhTb3gyeHZHbm9YZnhVOHAzL28rTzhzdlZiSjlsUFo1bGY5NytNbExpZEttQzhtNjBGdlh6VzcwK3ZkWFg5VmdZeUUyR0pxS0NOYzkrOG1EQ3J3bTJraHhWdjBPOUNuWVZHN0wvMDZScUtLdDREekhoWDhIUHJxNW11OHhUREt4OFhUT3VBRHZtQkxrb3JrWUdZbmlJZGRUS0lWT2xORzVQeHZuYTZqL0IzU05yc3dVQkpnVy9BcjJQN2FJQ01OblhRRWJYYnBpNmZ1cWtXdjc3NFFLekpSQlpEb3ZyalRwL2lyc2hCTXNpVVRmQ3YzRmtxa3BIM0NuMStyY01ENENFTkxvQkpIalE0OVpaS3V4U3h3Ry9BYjdmamFTdTkrVisrZEdYWVp0b0NoNCtRUTA3TW5tRWpZVEJnN2lVZjIzOVRZelhwK3pheldpd1RvQlFjTXhKL0QrYUg0RzVhZ0I4SjhDUkQzMmNDUTlKUHhxSTZwU1dqL1k2WW9XWTlqb2Q4REV3ZWwxbUIycUZyVXF3Qk5EWXZrQnJMdlBjRTNBZU1uemNzbEV1aFAzYkZUWmtwZmVFVzJoVHdKTTJxL0RTNDg4ZFVBKzFsNjdlRHhLMkNxWTBOZnU0cWRqNVB1eCtITGNZRGw0SzU4Tlh2dlZ1TmFDMGZRUjRRT3pqSitDbSt1UmZiMi84aEVMdDhqbXV2VitSa0M3aVp6dWdVc0VBTHZhTXZjNHQvRXZVbjZCYU5hUGxubldtRDBick5PcjY2ekNyTUlvZ0dPRXRud1M1cHFpUDZ4c1pKNGI1aWJDb3pybHRKL1VkQWJUcU1lRld5dWs4SkVqSERtVEo3VjJCUFB1ck4ySzltTkwwSVlibk5HQ3VWQVcvcnVyZjZZdzhSa3ZVUHBzYW1hNElobzB2bHRXeWNGU2pSMHMxS2E5UjN4RDMxWldhOWZtN2pVK1M4L3NuU1M3L1ZwUWNrK2RGV2t1RjlQR2xlL05VMnRzVTJXNXVBaGZJZldkeVdjZHI0S1JLT1hMK3VEa2RXVTAwV3RHMGg3eTFYWWpzbDkyMTZzWnBnU0xubGhmNmZMVklGVVRjek5ldmRxS1Fib3FqY3RxS2laNDhVYytvVDM1U1hYM2xYc0gvTXNxMVZhSkVlOTVwWDBJeHI4L0ZvQUF4cFdkV0dsUWlSTE93T2tmN3pOMlJZVW9pR004M3doSDdMck9jUEtYVkFEVUc5Z3V2ajE5ZW1ZTHRJK0h1SG9NYlV3VEc2SFo4b2NyQ1hOMHF4S3dWT3prZmpnWGdSZEhTQUhKV2pKQnA5RW54QjJObFNoZmVaVk9lVXRTdVEwSFAycm5aTStCRTFrM0FUcmVtbDRlODUzbGRkNG1BM3d1TTNER29WOVdocGlaTmtDMWhpa2g3R0JkQmQ3dWhSVXNoU3FPT0JmcHZqTllveVdCc0VtbHBSRnhzc1NZbTZhakMwdXJ0ZlU1Wmg3bU8yQnQ5R2xKVGg3SUJKNW5DRlJxYzdHTTFHMnhyMTJYaXZsbC9jRGdTNEFKRDMvK0RTUnlMSittY1E5QkcrNFNTMVJDenliS3NtK2N2Q2tCZENwK3FYTVE0ZVg5L2VtQldSTDMxL0ZwZXJaSzQvaDdic3l5bllxMEJHUnlIMWxsbktSc0lSa2szK1h4NkE5MkNHVUNET1psOGZaUTVSVDZLSjlOWGdsWmJoR3Y0UklrNjFqTkxkM0ZseEJnOHU1d0N5WjZPS3k0LzJNams2bDVFL3JhcFBsOGNiQjFkRGwxL2NHQ1ZRdXY1TVVOcllBMkpIbDBoSEVyekp1OEZLNFNab2pBMWtWVXZTK3JRaDhjWGo4bHdxSk9QY1c5SDJscms5OGhwTmJ1ZmEvUnE5VVhSOXlRS2k0UVp5QWEwWGQ3eUxjUVFEMWNBZ2JvTm5YbjNoNytrRmkvdituMzYrdnBIQUIrbVJRc2lJeS94cFBKMkpCR3RjWUxXNExGVXo1Z0pVdXR0akNDNlZBZE1MU3BWZFFLdDdYTFZYNWxnYmcvSWFIM0RlbDM0SmRvUk16akxxY3VvSGRUKzZEV3ZFamNhMVhjWWRicDJwdzdPMTlPNm9FaVdBRStvOTVjYVNDWG9ydm5SWHZDQmxibzBFenJhUTR2czNlOGhySGdOL0UweDExS1RFY3B1RDU1N3Q1QjNieHlma3Z5ZkJzekJ2dU5qenNsWldpUWVrTVRRVGY2T20yVnVMbW05TVJKWUV1bURsR1M2eXVjL29CNTZVbW55ZW92MGpFRXJvcDdnSXIrdW50VkE1Q2RCZzZmWjMyQXFWb2VNK2hObGtYV3p1aUZ3M0FzcjNFVXh3TVdQRjVQaDNnVGVwams5amJjdmhLNjl5eHVueWY1MU9rcnQ1OFR1dTBOL0pTODNJZDNBN3NvL3paUngwYW5pbzUwZmVSbzZ2aVdsamtmb3dmUERRSTVGSURIL3hWQ042QjRPUjlFY1VqellkaE1uVTk0aHgwME9ubXB2c2oxbUltdXJhdlFCQ2JpQTZCMEkvQ2lTbWtEa0NoRW8xam0xNEpJQTBxbzBwK1NOdzZROUtLRTZJTHMzRm1LZGZTeUpYeCtTand6aitwZFA3Wnd4alpCTFg4ZkpxSkJlU0VTTExGTTQ2Mkk0alh5Ykl2T205cGpaVkVmdVEzSm9VQ3RINnVnbFFMWmhVNERLU0gxSFNtY083US9VKzFKS0g4eERTeStaMW9EaVhyUnliNnVoNlQzOFNveThMckc3eDI2ZEFVTkkvRzVHKzdmYkNHTU5XdFZFU2tzOE41SlcrQlU4U01xdy9USkxNbXo3MjB2MHdZbVlySUpzMXJVeTlURm9namRoUlJIUmhHUWc2cE4zUnhaT0JWQUVrRG41ZzJCSjZWM1BSNWFMSTFrOVVSTElvbkhLR0RrSTZ3UEw4NFQ2OVBabE83ZWo2L1cvNEJ1WGhFcllGTjVXZktRTFAwZng5S0ZTRDZkNVJxWkFKR3VkQ0NSRmZnNy9kYWQyRjdBNFdBZ1QrOFg3TkVJa3lLRjVOWFBmZ3FHeWkwa21ENGJXQTZhdVNFU2M5STdWaEpCSTFmeWFEU0RZN29hNlR3Mkh4dW52U1pBdU5EeUlNZmkrOTAwMGFIWFQxUkhHQndZUEl1elM0OFNIWnVFbWFZc3lLZkpyMWE5TWpXZGRVUytlekFxVDZMZUdia05ibm9PMktvUXBTL1Jib2RpQ29NM3F6eTdDQWxvSUpqNEpZb0JLM01mbTlKRUsveFQ1azU1U3RiQWtyWEZmV0QzY09rWjN3UUZHelFwWHRQT0NtdjIxYWN4UzVMdGMydHZOZ1VwWUtiNmhOYzQ0S1NCWUtoNExxbWdsQm9YWDNBN3NuT0pzeHBlQlloZ3V1TnhxR2VoOUE3SytwWHVqOXRQdHgzVEE5RmgrZHpMeVMwbHQ5ZXVXbldYdGg4bWRVbWJ0VzdkK2FCV0ZUUTh0NjQ3NUpya2kwWkIzSlpWUFpuK1htcENoWkxQOWtHajVJRDk4aW9sK1h6aW81TGpRTUVjZGtLUXZFYWpidC9qK3JybXFycXYxdXdCc2FFTkJQOUlINnpyNjV1c2ZJc1MxbHdRTGVaaERtZWF4b0dRdmZWWVRIcU8yQnpoVjZRWVdDTUc5SlpTMWZmYzMwalFkMzR1YS9hazBLZVp4ZlFEN2hpZFNXWTRKWUdSdWZlY1FzNHdrYmNqZzhVWGZweHBEdnJZU1pTOFdOYlVFU2ZIejd4aDBNREhOemwvVVJMNHFYWXc4T1cxZWFGak5MRFhqcTI5UEh6OWg2SVc0bWU3eGs5Q0dVazROVGRHc0tJNWRVdnBKQ3JlZU1mSHF5Y2ZrVG9VNnBScUxTSTUzaDU0bFpIM1hLSHM1SmZqUi9nV2pDWEIvMGk2Nk1OY3RsUXpGS2pzZ1RtMVV4cTh2Mnl1eVhjcWFVZFBONGorL0FkY2x6c2c0d1dMS2pocXdvalhkY2psR05vbEl5elltbyt0bUJKdkFXZ3RZbzVucGk1ZTFuNDFham1LYlFNMk92RndvTTNaU0lJOXBmeXA0NGMya1JhL2s1dmI4Mmp0WmxvWWdrS0VTVjBoL2E0VnRUa1VrWC9uV3BxNWVyL2JHYWFKNWdtN1Bod1hobTBJUjNSOHJsUXpNSUhUSXVPVGJpdUdScmpOaG9lekJNc2RYZ3FsbzU2Y3FmQ0VmVldoMncySG5LdHU5aXhLcHRRYndmb0NrMVEvekpDV2p6WElLOFp6Q0U0TU1sNk1VUmJ4MkFhZTI3VVgrVXpuRTZSU0NtVjVKOTFJUG1VNUZ4WTBheU5ORXA5NlRuZkdoVjdUT3JUY0RGQmk5ZE0vVEVKNXhrb0NINUZIczVYNDZYVnRiMHNSNmpvUzRaZlJQMDc0dHYyNDhPL1VpOFBnOXhaY2xMb2xMbnJUWTBwVDVPYU1kMGhZcDFLYWFiNkp0MzQ1WjNEamNzZDRYTHJkQyszMDhPYko5Q05FZ2VqRHM2UUlrdzAremxMM21XaXlMazdyaThzM0pLcVBnMG5IYUdHZXgwNDhjQWpreUZnR2JHQndFakZYeldkTUdkSTFEalNpSnhtZ3ZOWXNURHhkUDg5WlM5Q1VzSzRJZ2hDZm1yVU1KQXVpT3lmYjg2aEp2U3IyN2FsM1FZeno0cVFQTCs4bWRHVVhRTGlmMXptbWRpUWtnNVB6M0doU0pEOEVGRmlSOGhueXlXbGVSQ05ZV08zS3VCZmdLekJxNm9oZUxtQkJ5RXlnNzUyVllPTTNyOUNHNElaeWVvVTRtb0FxWkxEWVZJbStoZ3N5bDlxVkRNWE96b0tlWG4ycXRTdmtYeGdkKzgxL2N5VGRBUTUrTmttWXlYV3ZJUk81WnBTVnIxbFRpU05RaVlOWFNqTitveWtGaE9ieFA4ZkI1QXlhcnF1aHZwWkttcmxvT1lJcFpxLzY3TldjYTg0aHQxOE5JNUtIZllkeWxGMlhvR0NhcFFLWWk5VERDQ1M3MUo1MFBLMzd2ZVlCNThZYnVHdVRRcXJua1FVWXYvOEFzMTR5QkZweit6V1pOYjdYV1l2UG1EcCtBQnRTN2pMcTdkaXFzSmVxdHlQdHY0Wi9DNW1lWjFBTDh2NjZaZkZPRXozRXdOaGZid21kSGR2RDlhRjdrY21ydGtuUllWSXhwV1ZDV0dTb0RKcVBFYmZoMzNVTmFzamwyV2hTQWR3Q0JrcGxBUDJVV25lVURSRDQ0MmowVmVIWE0rL1F2Qkc4K2c4OWxlMDkvdTRWRXZLWkRKSHFrQXJHRXJ3ckdqRkFLaXFpbExlU3NERGNHL1d4bFU1d0xSaHZTUXZLdmhBOGQxYm1nOU9iTnEwejJKVFhHdFlaZmlBOUwrRk1TTlY0d0dHc0pqUnVWbTNSM3BDeURYSTB0VFZZNytKbjVoSnYxakt5NWtOdElRU2hBK1RpMElreHBXNFRiV0tWVk5UNDY4eEJXZVhMekhSSW5DSTJPL1l4ODR3YkpTV1dXOFAwa0xYbVpSNlZNOVVLSkVpdUQ3R2taOWxwUFN2SWF6ZEFZalhWUWxtRUYvWjhrNVhWai9EdUpmbTVXZUdjVDc1S3F6clhQSXlvTEdzUjA5SGlqdmhtV3BteGRXN29yU1VYb1o5Y1lPM2pGeTM5YXcrTkp6Nm1NK3V6K0FGbmFNYUdEQ0tuV3RrUlNORFpXSFp2T214ZHBWWTM4ZWhNM0FBVGZaQkxiZThJNC9ReUtneG9KVi9JUzJQNWpkTkgzTTZGZkFLNDc2YWlDSFM5TTNBeHo3czFjS285bStXMTZRWkI3U0hYbTZVL012U3ZQeWptTFE1M0VaR0ExWUNsSEFLYlVTcTF4VDMyQytBUW1Zdk5qOFd2eU82MnRUbWhiMW5HbmxqZEN3QzR0Qy9GZ3A2SXRKZDh4bzBUVHZ5Ylg1ZTZXRXhNYmUrTlIwbHIxZGdMakRrODBISkV2SHRCMFVlTys4WTF1VEFlL09TVlBDU3Ryc203dWZ5MFU4NkRnYVJiNi9MQVRGeTVJdnNXUVFEdzA3ejJzY2Z3NjIvYjc3L0RYWmJQNzVjalBadEtNMEY2NkhHY2NJNThobUlaU0FTVDAxZ0xFQS8xTjNJUkhZRWk5RG83S1hUdXZRK0twenRydmVqMC9nVEJmV3ZDdHFQTkFDbWlMeFV0M3BKVVAxdjdBOVUwa3d4anhxRzJBa2UzUXVTeTNlS0FuNjdQZ09paE1ZMFRweFdEUVdEQWZ2UlpNZldhd1A5V0FrS2VLOEhuZStvZnVzOS9JcVduTHFxNTBiVCtnYmRyVnlZODVKREJYOVpqc1FkT05kWFg1M1p3NXpBK1pnS0VScjFwOEZUZy9Nd01OZmxWb2xucjZHMG94MFIvOGZ3WG9MdXp6a0owSExXNzRIWXRkdjF4NEIrdThUNHQ5S1VvRFFYTWkxcmpsdEkwSm1UbHM4U0JPY2E1KzNWSlBNYzhRdlhrZUR1ZU1qOWJKT3JVZVNrS1F0aXdHelRRMmpPUmFXTXBIaTRFTWJENVFKNUdKd252clpYY2lTOXhkRkQ4WFdZZlNSUk15U1VxT3VrMWZmdU1ta3RrSS85dFdrRDFtblVBY3Nud2dDc2RBL09IYm9VMDNCaVVTR1FjNE5COVdXMmFMTDJPdUxVWW1OS2hON2lNZ2ZCbUtVZ1crM0k3UlNCV3lTK0ZNQmk4bzhja3g0N2J6bVFjRXRlUGYvOUMrTzg1T2ZaM3RsYjZJcTBBaFhOV3Zlc3c0OGN2TUhUU0M2ZS9VaHowclIweTN4eXp3UXhzS3pGcCthS2RTMzJVcHd2aDFIaCtWUE5FdmtpT041a1BPQ0pkanhsUDlQTmtPRzJqMHBib2o3cDNremxQZzJBalB4bEtCalYyakhBU2lFcERKUGU2S0JyL01wUTRZZWFnbDB3RXMxcTN3Nlp2THpaUTk4YkFnTDU4Y2N3TDJ0N3NIYWpsWVZCVkRTa3JxWXBMWGRTZzJYZDVHWjduWHpjbDVkdllnTUIwWkFZV0p6M2cxK1pkcVIxa0lMcHB4a2YxKzgxWUt4NFpEVXBqMjZWOVl4OTNWK2Q1Z1Y1TFdLdnFjRXRtM1hGdzVTaXVMTVMrakxabmhzakZKV3pqVklySkZmUFpwVVo5OXhSQXVCOE8zQUh1Z3Y3UVM4OWx1U1JxWU1ScFdEdVJZT0NvVGJsd2tlZ1BTRlFxWjUxUHl0SjIxQmttb0pWdXIxQllEazErUDB2b201UmI3RzU5a3dpYmNJSHpXN0tpc0lTMkcvWWh4WjFETFlReFRUalZ2VExoRVJIWmY2V0Rla29nSUxmSzVmUWhvSzJ4YmI2Z1JEajZlTEF6MWMzTlBjUFR4bDhQVk1QekNVL3I3VUltaHNYdjFad2xhSGtiZ3MzRnpURlBGbyt1TlFOYXAwd1pOREtWWmlVSEVrQnI2RmpLMEhQMlM0Uk1ZUkZIL1JhWklMcGV6YTRpcnNTK1lDVkxZOEd6REdrbXR3cStIWUZYY1BsTDB3TGlsTlFzNlZmZm1KZVZtcHFMcm5SUUI4aFBqaGJBdklxL1JLcEpSTGJjdko5V2pJYkxySFF5azIzamJzb0FIR0ZmOG5SSHI1N21mUnNZdGVUSHRaU0JoV0pTbFYwdFdITksvWVpsME1uSUVmOXBBZVhMT1JUYnBjRXd4WllkMkR0K1BpSk9xUlJiNm1temJyVGxmUUNuRDl2eUNQTHZNRkdhVzdzVFJTblFPWFRacVA4TDBpWjJvWFQxQ1ZNTXZmVUdHWndnZHgrRnV3SERjUDcxUzlSdm1LN2pPSzFDeFFIT0kzaWFKQVdybEY3QnNGcE5QMkdBdnFaY0hpeHh3Y2xMU0tFeHVqa3FjQXF3UlBHcTlWWDl3Z1p1RkhGRzdQOUp4eU1mZ1BvWVhJMDIzWGkvTE9NdG9xaHhFQ0xHeXpsclhNQUltZHJYZjFCT3hGcUZ5STlqQWhxQ0FXWHAra00zMHVNbHhJQ0w3YmVkK2ROaHBjRWZ4YXJmVmcrQkZ3VXc5MkwxWkpDVWkyWnQveU5xN2pGYzBmRUhweDkzc3l6bjIzQlRndDJqcUEwa0kvRmUvTXJ4aEcrTUI3dGo1MjljUGx6MjUxQU1QanI5Smk0ekFXOWhVWkVXa3BDU040RUxadmVLdU9YL05jSWY2ZlJXaG44N2pPMmdvOWVLQmNYRG1Ca2taa2lwS2k3Q1ZsdWYwdGllZkgxbjhWNjBTeGFhUmZJdjllcElaenloNC9KODIvSzVFRXZ3azdiTFI2dndEYU40UWxqR0U3bFJvUXU0dzRpQUh4bVFYVUR6WU8rTlRVemtIT3BvOGxiSDFveG41RFZnVFJkaUdSRGhwWUdHY25CQUtYU25aZ0RzWDlXb0JSR2VHZlBRU0VaYmtCTzZqeWpFMU4wcDdJNTg3YkRlV2hSb0YvcnBIRDBLalBmK0cvQ0lIcmlCVFlnSU02dzZBMVJXTng4cER3VUVlbWtFcTd6OFFzT3QrOEppSVdlME5YdDRPaTMwaG52cHhZTENsNVpWclFSYkkySlQ5clNLeTVsRGNJajdpeUl2cEZBNHJ3OS9qZFd5VHNzUTJkRVdaLzEzMFlib1BwUWdJc1pYRWpBMXZIZ3FselpjYXNJZzhsMXRaSUZjNGVmMnBGRlVmOFVaY2tRMDFoMmQ1Q0QzZzJwUHpGSGprLzloU2JJSDJScmduYmdhdCtuQ2Nnd1RsRXdGck51MG40VkVkd3QzS1dla2FPcHRZL3VreU1kcEdSdUVHWVZ5RFBLaGFvTlh4a3A5Nzd3S3dnZGVUOFI2NXNZZG1YaEZDbkFzYlV3bDM2dDM2ak1YMWRZTVJPQU9XM2VFRUJnYjNEcE9Vendld3NaNDlIaWdVbGxka0Jya0ZoTUY5d3dXTzBHb3hveGhHc1lueDZmL05VSVpFa25ielo2UkVwLzFTQVVyOEEwN2ttT0tvdHlCZVllQXZLT2ljUU5tYitZOWJPZjFpb0ZTOTFjeGVuWXpsVGpWd1gxQURyZ2J2WnNZWVREVkY4MCtXU2JzZkd2RTdYZ3pSS0lUaUFzOFpoOE9WUnNtb0dQWHJTYmxka1lqSFhwN0RDWjd5UFl5NTFGaFowZjZpRk9ndyt6NytFYlhuYy9TQmx0TEo0NE5DUVlVT1pkeWxzODZUczZhWUNlTWNJZmZhcDNhenhoVnZMckl5YjgrTjdtb0lwU0dBZnovRjBybUowWFF6SlNhOFF5d1g4TFdqZnphMnBrei8yUVVNTFh2cVhLUStpa3Z4RHRCNEVzNGpWVjM0K2dmMys0N2tJemhYOHk2dGVhZUI1Nld6cERTVFAza2FBVEk5VDNmQlQ0ZXZHUzVOSnhaSVpBWmNRWjlaOWJLaTdOSmlqcHdYdE9ucXlCWEFCNzhpRTF4QWZOeHgvNnYzOWFCbU9aYVBKVDcxL3k4bUhjUmUybWhJcXV1alhNRlh4V1V6MDlXWk55a0V4WFlUeTdDd3RyRkw1K0tCN256MHRqeW5CQkJzbGtXZ1h4eGR6MXo3c3pQOGVGdWczaHZrWUNGV282RFArdmlYQlRDQTkzTEcyUjBHVHFRdll6S2FobE1FWDZlTFhJcERWR1FvMFlhdWZ1REkyalVld1pQN0tRdHVhNGlNbGpzYWxGZnhqYXpoNTVHM3BiK1hqa2JlWHdPZ1NWejVHWDNtbDdyd3puRWtsdXY4VlJHOVpzaDRWL0NZK25XZzRpZzY3YjA5cDRkMHFGTkpSYkptWmVuVXF6bnhYOUtMdkg0aW5ON2FzZS9Mem04TldQaWw5YUs5bDdLM1ZLVHVGQVpCcWsvWUFqL011NkEyZVdtM2I3MTU1QklNRW5iL1JUYzY3dGNQTUhKV3krWUIrc1VMMVdhUG1wdEIrRzJGTjYzVnNhOW9yOWp5ejZnVEpNZEtVNThUYXFjTEMvVWp4RjBUbEpQa3NENUl6Uy9lWXNHdWVYSnZtUFVwUGxVQWh2WXZvN2hFc0dVZm05ZnRFMDlGV2cvMk9Gblc3cFpDa08xdUVqNnh5c0xpblUzcCtjVTg0cmNjZHNrYmc4S2RLNFlYdkRBdk9YM01ZS3ZkZVRVeHlPY29KNW0wL3BrWGVwSjVPM2xqM3ZMYVRGRk5EVlltb1Jmc2tiZDgrVnVoVW5EVjZTNS9pZ3FjNzNrdUZEclpDYU8zdktTZFd2M2JTT1FydWZOOTNKY3pXYzNhTkEvS2JYTS8yRnJiUkVSYURKUnNRdTNRS242Z3NRa3JZeldCbC9SazVyUVpxSktIMmZzN0VDUEIraDhTMTRuYWQxRk1RWFNPU1djRnU0NWRNRUViY1pYTjBkU2xDZU5TWGhKcSszczJpMkMveVZlYkUxV1dIYlgzeVRmTzRVNnU0V0t3eiszUGZ0d1BNY0JTNzZXYXk0bkM1NGFySTdIMXhXbU5CTDB1cTJvYVVQOCs2TmIzWStKNEZLbFpUZG5HNlVnT0pua0RFZ0M3TkdmWFVUeGxNZHBVZzBvY29IL2JCYUFodHZ5NGtwNFRoK0JRZEJLT2Iwd0tPUFRBTCtoUWtNQlowUkZmRGtoVXQ5dzdEOFNQbDV0R015cDhpbTRzb0ZkODFvZTNhNW1TQmpIM1JUbUlNVUhWT2hzNjVTMHcrdFU2N1FSbGRxSTY5YXVCc0taa1NQdmlRWG8zdjh2emFDRzFSb2ZEdTBPMzdPMjA1N1gydnhqZm5YRWRFczJaYW43dDBWVDQ0NDhML0pWSi9tTzN0T3Q3MFhlOXVXa3Y5VVZSd0JOaXVBci9DNHExSjY0MFN6T2lObmJodFFjMTFhNlI3WHUwUWpQTzZTWVlvT0FNeExMbmMrcUtvZ25oWTN4cmhaZVVJSENuVS93bVhoSG5McmtwSlduSWEvcnBQQlNMQVE2ZEVuRDJhMlVUUk9taTYrOG5QUWxZd2dDQURXTllxbjMzN3VacDVzNVFmRm8xSnZwb0NxVEpVellsbGt2OFhJeUpXRm83c3J6ZjhFdmZYVWlQenh4bCtVVTJJNmVhZzUxQ1dIR01UVC9QWmlnK0RvQlF0bmVhZHFwRTNsVHpFK2ZsK1ZBNWtMYXFXWi9Sb25VUyt1eTlZdm1BMm8xS1o4dmZDLzloQXhyVjFhZ1JpeStWUzJ3bjhOMGh0aDNQUDE5VFZwcHdsbUd4SUhWWXU1SWJ3UkVyQlZPVGQ2QUhnT1R1YitCbzMwbktESGU1d21kc08wbmlpTGxkRGFnNy9iQXVJaTltZksxS21qbng0aEFTNjJyTjd0V2QrR2pmYURYVVY1V003RDZJSTIreDI5RHF3dHdPY1hLUDBKczdCTzUxdmlsbWxFSUl1VEJXbHhDblU1aElSejU2bFlFK0F6ek44Tmg1T0E2ZXRuS3psWmNTR0NHaUFnaDIxN0UyTCtHK2liOXZFVjlrbHVWZ3UxeDJqUkpoNlFrd2pOSFFwTDdzY1lSbnJ0V2FQc3BXUDQ1SUVOTTlqeTZuOHE5SkM0OWdyMXlkRjMrc3EwOHlkUURhRTdKV1ZiV1MxQUpkZ2JhRGYyUytYVDBLZ1djSjBkSkRrZGIxdk4xWXBJKzIzMEFRTHJDcEFtREsxQVJxeVVXMm9zZXdRMFpiaXlzbEZsQUR5dG5aS1FQRDNkeHFXYU9Ka0tFaFNyK0IvR1IwQXA2YWZPeS9qeE9GdmJoRy9ja2llTUVnQ3I4RW5teFB2cyt0QXFMRlhxZVBlS0NzaHkycFkrVTFYS0dYSHlLS3cwWXJJTHBNYnRXRkFnOFg2Q2JzcS9xNHlRaGlWNUNDVmdBU2NCWDVwTTFjUGdvWldNS3RhamNWRzhaT01LbTUyRDhsd013aFJ0d0NsQ1crMUFIOURQOVZvVlhndzlXaEdCb3FEdmtRQVo0cGFGUlhNbzNGd3ZnV0RScXIyVkc4SmNIN01GakRnS09oUXlSL2pVYmdrSDdJbGFLTDJGZ3Nxd1RCdVR2NFhFT0UvZXRJR0lyakYvOHR5bGprRDVpTXFJMURQWHA5WGtiM0w1SDRBQjEwSXhYSjNoY3RFWVFIMkVIMitlbm5uU00xUHo2LzN4NTJiNVZ5RFpIeFFQaktFYTlNY0ppNTJsVG5zdmQycnNBbnh4dCtrLzJscnZuRmFUZDI2RW1DTFFsQm1vNCtGQ3FtMGRHZkxTeFhxZHdESWZDcTBGUjF0YWNwVEI1a0ptK1FsUFBqMEQrMWkrTWc4ZWgyYURBU28wNDhLMG4zYXJMOHZWS3BSeTcvTnU4YXhXaE1PWnkyUVd2YWhtb2I1dG5YSWMzNSs2RlNUQlB6aUdXZS9Fd1huYnVxaXJXNk5RbWYvYitvZnBWRTZPa3pudm1LVXE2NW4wZzMrMGp1WXBIa2dyRWg0V1pUVDdFMEQzcWZQQjlla1hHQUJVRDh5Y09qTnNpYmgwZm1hOHBDYmhlU3Nuc2hkM3owYkZwR2JZdjc0MFhCdVV4eUx1Ylo0cUU1N1d4RGkvZ1cvVTJWUjRZclJRQTFWSFZEVWpKNEdoKzF5RGdSSFpiQ2FiZ3NhcVg5OHRqTUtaSDZJZjRDQlBkTzRZTnRNK2ExdzNQK0MxcjBYWEFvUFVEY3dwZHhCeG9JRXkrWTc5ZE1UMTc0NHBjK2hGQ0tCQ3J6anQ0U0JCb3pZNW41S0c2YXEzQzAwdzdjcmwvM3B4QlNnbWJuVmRxMXRhTGgwWHV5VW9kdU53T0lFWXpEeXBpN3FwZEY3US9CSHRiM0l6cWhUalEza3Z1SG00N2ZNUk9JSko3RW5WVGRHWW9QQWNvQnh1dlJVWFFvRmpsWHRwc0VMaWhYUEdhVTBwUi9UTWp2eFVsL1ZRcE9hbXN5WGZIdzJnQjI0b1pqc0pnZ0UvV1libUVEYjFZeGRPKzN1Vk5xdy96TlI1OVc5MVlua0pCWU5MYndFVTI0cTJlYUYxd2M1VjJQRGhFMk5od1dqM1d5ay9qMXM3YStxQ2U3TEhxNUZGSTBCS3JTdXFzUFdLbnMybE94VDFPcnNkS0ZENG5Va2ZGSUI1SlVqeFh3RkZNOER6UCtmS0h2a3VJMUpibzhpZTZET1N6UE1NQ3Y3Q3FqYlZadUNxV3FBMDJGc3VNRFVMOFdnaklnRWRLTENpME9FZXQ0TmpYb1UvK0c5U0MrNXNiYjZJMXF0L2lkSkhETTRtU0V3TE5KbXh2UHNPS2lFYXllT1J5Q0ZxcGFrcTVhcVQ5VXg0a0hvbWd3dlZZSXczODVGT2tubVI3ZFZmamdOV1F5dVQrVTF5eGpQeFdFUytFMXQ4NHhqanZiUklVKzlEdDdPMVllLzlXZFd5RnNnYit3U25xaUJWZkJ2SUhRb3NtNytFQ2gwQ0FhVXB4cEZMdHNKWVJtTzBRMU1oSmVSNUlkbWpXK0g4SllTQVMwYStPRG1aVW43S09vOFBIb09CRmhRS2NJMWMrV1k4dnV1eE9UL0JUeFFDQllycSs5cldGS3lsSDBjZjcrb0VvdW91Y0xEeEo2R2RmcGJPZnFRbWRxcjhlWG1SS0NtWFdmRGllOFRNK0dJa3c2NEVYVGxxdEVucjFGSDBYU2x0MjFDNHR3RGF6cDhBTkJrN084R1o5Z3N3STBRcmVLYWlwTDVnRzlGcEp3b3FqSE5DVHJ4Mm51L2JJVkgzTTRZZTAwVGdZRVFTbW4vbTd1bDRMWkZSOFBRS090TGMzZDJha0JpN3RrMkxPZTRBeTlVOHhVVG9PcFV5NDkwQUNyS05DSFQ4SDNSOEk2NnRJRHByNWtpelladCt2TllTRzdJWStTSDZEY0V5bXRuejBmWXJYTGNzdkE4WTNNK1RIMFdVTlViL2VIWERHaHpQZnhCM00ybi9LY0pLM3VUNjdERGpPNDl5TWJmUERPalFFVy84OTlqdEkyVE96K1ljWFdxemIyeTRtQWp1UEhFYnFxME9CTlRpMlJSelF0SzFnWm9oMUJ6Z3NqbWdXNEpEZGtvVTFnVW4yOU03VmVVLzNFQXBSUlFBYlBIcFFUYmRmQ2UwaWdNZnJKWHU1M3dTNDAxbVd0VitYUlFiYVVuS2ZzUEtycFo2cmZmcG15b0YyeURQaDY3eVhGYklrS3ZVUWlia0J1QnBhclRRZnZ4UFVtdnNLd3JPR0F1SFloU0RmM0pJOXFOWStDbHl1VmhWTHk2Q1BVSnlkUDhEOG5wdEU2b0psWUNTamlVWXlaVE9PMVN1SVc5R2hRMDFCSDRpN2pUaFhzWnd1VUY1YmQ2VmRrYkdEakcyTS9IYzVBTE5qeHdKVHc2YUlEdGthS3JRRTBJL2xvZUVWZ3FuRVZHSVYzMUlEK0tocDRxckkvZGlRa1lUWlJTWnltR0ErdmZSMGJwZU9BMDNJQmVYQlhORDl6U29oNkFISEc2c1VpK1NWR291WkZicDlrekJoa0M1MlNCVGpnVzRselNEeGV5NStkVkR0NWNIRUhhcGpEVFZIcWQ0aFZ0YjI2c0o3UngzK2U4MDU0Mzc4Y2hhNE9zVkdPZU5WZnlVU2JFSGJLbGhmTkgxcnEwM0JWOVYxc2p2UUVBOHR2SWQ5dm80Y1ppNUkvSmhtbld6ZWszWjVCc3VpL0ZLZDJRaTZYRWFjeU9SSHRvWHZqeklPbHc2ZTB0YVNlYzkrSG53TDRuU0F0SkF3TEN1MmQwczJMSEovMDNKS2VuckxCbzJsOEhaSW1Db05KYi9rYmM3THhpbkpLV0hWQThUNW8wNlIrQlhXMjQyQjlRU0Y0VnVvbkZUZnc4WjQvVmZEWnFocGpMcmtTdjRNbzNwRlpHQ3RMeWdRclJTaFVXeUw3M3h3ZWFnSFcyN3IySzE0dG85Y1gxSnh1elhJUXkwUG1DSWFST2ZxN1U3TmZZTzZTeEtHRndxcXBoVWl2QWV0VGVYR2ZlOXVFdzhnVlFVaWgvYk1MdVFJYVQ2SkFKdFdacGZtOTUvMk9wRFNGQkpXSzlFZG9sRytZSUxYSUxENGJURnlZRTRrMFQ5U3J1QXl6d0NwZ1FzK0ZWb1BWS2R4TjJ3SUcyVGZWUHBtQW40NFBIdENaSlQ2Q05VZHpwckc4akZOOEJWZFI3TzVGdENjYnIxMHZ0OTZtZkcwZWY5WHRRQ0c1Mks5MW1VQlFCQmJOaTZWT0xHQ1h1dnNUQVAxTm1pVW1zemJvNTJsU2R6U01KK2Y3YnpxR2tqSUtlaWp6Vm5Ed3QzYU1FSVJpUEpWdFBUSEhCRUtoWTRJa0VNUVcvZTV6SVRhRzJPVnBmZ1RNQk1kVEJmLzJRQUJBQm9BUUFBQlF3QkFBQThCQVVNQ0FBQUFBQUZsQWZoQUFBSUFDUUlCQVFvQ0FBTUFHVlJvYVhNZ2FYTWdiMllnUm1sdVoyVnlJQ2d4S1E9PTwvQkRCPgogICAgPC9CSVI-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT45PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-SXJpczwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU-UmlnaHQ8L1N1YnR5cGU-CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U-CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0-CiAgICAgICAgICAgICAgICA8U2NvcmU-MTAwPC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KCQk8QkRCPlNVbFNBREF5TUFBQUFNcnNBQUVBQVFBQXl0d0g1Z3dXRGlZWEFIMEJjMTh3QmdGaEFBQUFBQUFCQVFNS1FBR25BVDBJQUFELy8vLy9BQUFBQUFBQUFBQUFBQUFBQUFES293QUFBQXhxVUNBZ0RRcUhDZ0FBQUJSbWRIbHdhbkF5SUFBQUFBQnFjRElnQUFBQUxXcHdNbWdBQUFBV2FXaGtjZ0FBQVQwQUFBR25BQUVIQndBQUFBQUFEMk52YkhJQkFBQUFBQUFSQUFBQUFHcHdNbVAvVC85UkFDa0FBQUFBQWFjQUFBRTlBQUFBQUFBQUFBQUFBQUduQUFBQlBRQUFBQUFBQUFBQUFBRUhBUUgvWkFBakFBRkRjbVZoZEc5eU9pQktZWE5RWlhJZ1ZtVnljMmx2YmlBeExqa3dNQzR4LzFJQURBQUFBQUVBQlFRRUFBSC9YQUFUUUVCSVNGQklTRkJJU0ZCSVNGQklTRkQva0FBS0FBQUFBTW5YQUFIL2s5OTlIR0dBZWRISWFDdWZJMVdCMEFrdmZqZzVKaUJOY2FIdk4xb29PVHM5Qnh2NXZ0b01tbkNWRnVFdEtiRjhJNjlqeEs4RDFmTElLajZkSGlXb3pOUU1uK2RuMlpYZ2wvamF4SjBLRGdIdUJoRmg4Q3cyK0tCRzBnYkNxd3F5WUROREsyY08wRXVnNDZWWXZ3ak1qSythdElZV0R5ak5RWFlLYTMzQmxxUkM4NEg1a2ZBd1VYeVY5azNLdWJET0VsZkgyTnNmWTd3K3h1QTdPN0pFVWhvMzV2TmpKcm9rUzV6TTRHT2R4Yk1IanNXcVVrSWZKa3IzQmphRERTMGtmbWs2aVk5RjczUENKUkhBVkE2R0swUVR3M3ZlVStYandyL0ZkMXYraXVFMVdjcGVLVVlOZC9CUGd5ay9ScWlsNS9aQVRwQXBMbHVGWTZwNmNEV3hGZlQyaCtqbWhScy9KclBUTFoxa2trMTdEZXpwSUc1OVltdGY2aE4xU1VVV3V2cUdQWEVNUnFJQ3dWV3p2ZjVhR3RRM1o1b2hvZWxBV0w4cWIxWkhidUxIQXJIZ2xXcnFoV3BPbXZtWUYvSFJ1T2JuTEtramptVXlNVEZ5WFpZUitseHZhVXYzeTNvZHE3WThUTjZrcTBYVnIzU2JIb0lFSkFXWTlaSk9yRThyOTNwODNSUmsyZUFzbTlCeE1DMms1aWFkZTF3OGppaHZYTThjZ1hWM0RTNXE4cHE3Vm91dFlJTFlUeVY2bVBFMnlYaWhZYWUrTngzSmxmV1M3RUMyYXVNUnY5dThMd1lZWUM3QzJaaERsallMV3pMaXpjdjYrRTlMdUNLZnYvZkMwZ1F5YTErVEpJQU9XUHlIMzhmWnJMSDJhNFErelcrdGt5aGVkTVRKZkhic0VkZWlic0c5Y2RSTDZsaHlKcnY2MkpFa0dGMDFjL2Z6VWN3eEVzNFNFK1hKN09wNWdRelBYYXVQWnVoMUV1K24vT1lBMEZXMTY0T1JiSUVoNm5kY3Z3bXVBSy82czhKazBFUCtsdXNjMVBRQnpueUJwTWtLaFJhcDkzdXlCWm1VTjVXakZYK3F5SkJGelAzS2tWNC83dUhGdVR4Y2l5K29iS01MdGdtTzRSNXNyTHk4U0NVVlZ2Wmd6YkVnem5xOExSQjFVWXhYb0ppVUlQWmJoZExsMnlobHptQWE0eWlaUXQwVE5lajh3MjMrOTYya3JXOURtY3FLZnlRRnZsU0NxeUU1eFMwQnNpcy9ZNVkvZGF1NDIySzMvR3k1VVR1UHNlRExnOGFRNzloYlRXTmhJWHl4UHhtdlkyYUtjQ2NkSWNZQ2U0bWVBU3YzVnV5LzlHUE5acFlHcWlDQUJZUHl4Yk9UTFJnOEJtbmY5TmZyK1Z6aGJJbHp3ZXluZ3hHUHUzR091d1FOdVNWd2kybGRMM2lSKzE5NWNiSHV4OG9LRFpncVBpdGtlZ3hGL09YdmZsQStwRC9xUnBpNjN6QjBHaGlYVlFDZnkyZVQxNnhKOG90eUdxdUxtS0IzRksyeUJtdFJoc0wvZ0RDRmN0VlJYYlZVWEt4Um91SHpSK2Rjb3hWTCtRK21PTTAwRHBKYzloM3hyK2FEdkg3V0dxOC9GOWgvd0x4cFU5TDk3SzdnbW5RVUFOaFo2bjRUbm8xVkhwVTNOZUtiMGhWN3VXS3J1cFozRGVNa3E0cnh0OXNvN2RZdmEvZytBZ1hCdHpFMkdIZG94VW5VQWZwTXhoRjliR2dHQkJCM2IwVmhDU0U5eUJOM3NIdHhEU1dsdkV0dm03NWdHSjZ2VVUrb1lhNXFCTkYxd2loaEc4RnVVOERXeitqUm1oV2NtcWhGYU5pWFNCSmRGV2lYdFZnNGVRWHFHVi9zK3B6Misxcm1XMTVzMnM5Vk1yMzMxdUxSUlFRa0lUWXJvRzJyd3FMVkxVMzRwRklHV2JqQkh0TzhRVDV6WThabWZNakFRdUlyU3N6cGZsTzNqRjR0S3ZFT3g4b2ZpcE5EaDBkMCtsYzNPOGVGNFpubnZxR2JIMXJKK0dTYS9EZUpENVhYVTdTelpLZmJuc0JWZzY5RlpzYlRWZEhqckJONHJMRW5aS2JoMnoybW02OUZXWEpuWUVOY2lLQXJwakRNZTVuVWJOaklVSlF1QjJaY28xUXhSQXlBM1B5SGxHNmFqWGRVamV6blFLdGpDNTBoZkJnT3BEK3hYQkhnTnYzNUQzRThxSzFCcEpQdkVDTEtyQ1dMdkdJUkJ5VEkzYXF3d2hoVG5ZK3gzZ2owZGU5WkxGV0JFc1RaWHR3WmY2bHcyejNZaXluVHVKcXNaNlZjbjh6THZZWFBUT1o4dWRLajgyL3d1SEpubzg5cEhJenVvS1M0ZWFGcG1IYzFNN0ZFSnRXTlp1eXUzTG1rMk44L0wwNUFsT3VjTVhpNkgxcDdyaVNQR3NWN2VYaTRCMnZtRnBaRDZ5Zm9UTXdJNFR5Q1R1K1lHblRxOFRUOGNHU2liSk0vNVBUcnhQa0ZIS1Y1VTZldmlKYStTaVhCclRQdzNuSjJYUDVqRENERmdOSWI0eEdYU0pWZDdMYkIwcFhiSWRJeS8xTG44UXFDMi9LZE5wOENzSTJNRElBMExJdm5OZjFldjB5TTUvb0pPd0I3NFl5eFB0d0Z3eU54akYwbXpxYkxkZXJSUnRZTnd5Wnd6Nk94ZFBXTnFTOTlqWlBhN0tlWHVxTksrMmF2c1p6OStPTVJKZFQybDdNL254NWhCT013cnYwWnJqcXhQT2hGaUVjN2FzUDhrWktFSFJqWTgzUnBmR1hScjVmTklYL0gyK2xmSDJlbG5INGVtY0NGVE5xQm0yMktiSG9ZQWgzcEZOWVBRZkwvRVNiNVdqY1VEWmlGNWVIVlNOZnp2TEdQZzNIQ3JMWkxmOGVqRzI0ODhuUXJoakM1VklKTkxMR3ducndZQmtiM2RBaTBOOE1LV01MTXVRZVBrQTVCaFc1NFJXTGZPWlB4RlNLLzJaMlhTSG1odTBWTGc4RkpYRlZ0OXBuL01MZkk3aVRXTUdpaWN4c0RjdjhPMVRsalE1YUtuVTVpTVNNWVlwWVdoZnhxazA2VGhDWHVnMVE4WDhCTnBZeFdEUUUweUdqQkw1a2lYTUFINzBJeVpQWUloVlZ2MzhlYXBneXJpb013QXNxWG9mVzd0V2tyNFMvMGh6b2ptN0E3NmNIdzBLZGxPcENoL3pWOGxSZ1RpdEhlclVhdFVUVGlWMlVudnp5b2Q1MHVwbmI3R29uU0ZLOEFoKzFib2RoZ1hMSWdFLzBrd3pTaThkZFc3NXZZeUtiQ3p4TGVUU250OHB2UXFaeDRUZ2NvTm1TM05pRys2K2JmRkdMcnJDRTY1ZDhzV24ra1E4Wmp4RndjZktjN1BqeXBLNTBIM004YWV6ZjdYdVhzend0ZEFZNm5TQ1gzQkh5M0thME1VWHdUckh0cjlzTU5WOU9mTXhSVEU0WCtFWlRSTGhWbi93L1Qwc0t4aEE1RU91V0xxeE9manhMQnJTRlo5WmZENnZEVGEzT051Y3ByMTBGRnM2QXRPdW9SRWpPOHpFS1NjbWJCeE1IM213NXlGR2xhYmRBQStyaFF1RENYNmQ1d0p5dFozS1NrOEM4M21zZXJoL3hJU1FVMFdZRExWbC9jdXpXNTk2SE1QMUFSWHJSbWlNMlRhTGlmenh1anpRWFliNEVMeTF2THdaK3lzZ05oY1FRVjNzS0JtUGtjTXpwcDBEbGprNE9zemthVVV0Yk5vSzNlNFNNeW9iZ3BpaDlWdW5laGpLQldCWmNyVHVSdGRKbCtVT1ZkSHdma2J1a0xaLzRNMVViZWpUcjVReFIxTVRNaHlZZGdmT2xMZDJWL0FrOEhaK3o4YXZqNElFUWV1V1M4UkdmQkpjOFUwTFpETlBrSG5sc0dtNkJCY2k5eWNjejBacExHcCtiQm94eUdOMVB0OUdlUmYvWHk5a2VLQ0E5Vm5pcWFVK0xCZzJwMzlHSjdFSGpoVllENDdKMVJpU0hFblE2MXhvS0cwZlFQRzVrb3VVUllaZ1loZkxTdTV3czlPTUJEamFrL2ZPajZkUTBYdXR5WTRuQ2tXL3hYdFZjcnNSY20xenkyUFVSMUMxZVhJN1NnZ2tSQUZIV25SSVdPYjdxQ2dQbWpiZFBLc3QvWG5nTHcyc0RlK3ZzSVJjcGF0bGRlWGVFVGhwMmVocDRIODdIM1dDa1BoNGdZUnROWXM5N2lSWXBQMGtlaXF0dzVmOG1iS0M3V2x2SHJsaTlXZGlhaUNLRXA5RlJ5ajNCM0tzNmFSdzZLMUZIc3ZSVGx6ODIzN2F3YkhTSzc4cGFqY3FyUnY2dzN2ajdkamdLTkJ3aFNNb1pxcDBJL1BZdFNrQWhLVFFvS1g3SHVqK1hqWGh6TURUUjVNN3BMODNGYXRVbzQ0YW1vSC9qdGJaZlVCMWRlcDRMOFNZWGVuTUpEbit6L1hqQmhTTTd3MVI2czlIV2ppZzlhY2NaRVllUUZvMk41cVBadm9EcmdocTZjdWxra1ZjemRVdnZWdzZhWTU3WVpMRWlZcDNNaVdiWHNkUFFJaWFPQmYxTWcyaGQzOUpqcGt2VUsxRlVhSVkwUFZMaCtoVi9lYlBNa0hDYUVQUGkzcTN0ZURyYUczTldQaTJML0ZHbDZQOWpOek9oeU04SFg2MDEydGxkM0ZrakNYREVGNmllTFFnOXducDMybW9rVExVV1cwOGRuNXZuUGgyTDhvSExyclc1WVVDM1ZGZEdWWjFVODUxMG01cWRVK3ZYRUsvM25aZXhEd2c4b0VEL056Ny91Q2RHSUxqOHkrdjNXL3dBTWRNeVlEWU1OcklkZG8yR1dJK1Rpc010TDlqbHpTWGZQZkdOUi9YWURza1lHT284UjZJbmx1UE9kOWxrSnhPRFBzT2FkcDdDM1RnRnN0bDU3VCtYRGpvSm84eVdLQzBIUVByZG9PRm4wd1ZmY0czS05NK0g3UXlJWGw4WC9jMS82YndJVnRoZ3BpeXdTaWpLYVIyM1RVZSs1TEw1R21UWU5SVXBReWVkcCtrVmhGQkxNVUFxY0wzV1lTQ0dtYWVpOTl4cHlITWdhaGoydHR3dDdLTnA5OG5wL0ZQdUI5ZTBDaktRclNIdG9LNWxkV3ZnVUQyTEw0c0djQmNtQTVSUzJFcXpHUTc5L2RWL3UyOHZPM001L2M5Qk0wc1ExQ21tU1ZZamtpYmJiQUpoWUVNQnpzVlc4bTNnd0J3dnJwa3N1a3JPK09Vbzk4QUxDMXhwTWVJVllTTFphWDZWd01lV0o5ODJqNXhaV1ZiUS8xQVV1T2dRdkRVRWhJamZldllBRjBvZ2s2Q3FXTkx1V2Q5cGp4Ui94V25nQUcwaFFaSmpFVEJaNHBMV042RE1heTYvYlo3Y3YvcXlReU5CM1JSbkw5Q0hGY3BUd1F2ZmF0Ky9LaFRwanU2aFUvckM5M0RicjRGelBMQnZhVzVzQnZTMVduaGF5VVQ3VE9sSlhYektHZDZjdlhMWHRzSU9nTm9GRm92Y0V5TW0waDBwc1hiTGlzOFhObzdVRjJWeDZ0V25rY29aMVJacFk4YldwWVJHNnhDNWpndjhhdWVrSzBrWmRaWjEvMzROUGNvc1FSRkN5R1ZSakJkU3JScWZobFNqM05rYVJKYlVUTXRLTGpwS1BGMzRhaWtuN01VbVFHWFM3Q2JrNEZDcEliWVpyTmFKN3F1ZGdFTzY0SHA3S0RoMWNiS1czb2dUSmNWeUZTU2lnc2RvMVp0bGFBUWw4eUtHMVM4THJYaVI3aEZYbjBLSGdhYTN1UHZodGF1Y0ZEYU1Mc2xhTjNGcVNQb0JFSFcwQlB4WTh1dUcyQUw3VUVHbllMOXlqdG5TK0V5RC9jck40b3NSYnNJMkZWdXQ1bFFoN25WSEN6cHFyZmhON0UxMFJybWYrUkhDK216d1BlTWtOVUl3bjlSUThLRkxMTko2K3ZaNEtwSzlsdnQ5L01WNlVFZjk2SE9RRFBjNHI0eGpPVFVwRWtPWkRMSGhlUC85M25sZ2hmOFB3Ry9EUTBoWnBOZnJRaEhaUUZqYjVBNDdHZnVLVTlIOElqUndkRStwckRCMkc0b0FZZTRyL2NlU0NTamxGMHk2R0REVk04bjRJZWxSZENKRFNuK0IyNmxlRE13REVkSjVSMXM0UTJFcVdKaWV1VnpSODJTUUZObkhNMkUvTUtDSXNoL0VwNklZR3FMTm1STEJOOE1JRHpGYk9GTFZXMVZTbnV3TUZyTkZZaHRrdkZCdnQ5VzVjUmJqUHRmSTJjdXhLSnprbExwRnpwTFlITnZjSlA2WlpGMzgxb2lhYmxNOSttVjlzaXZiOWZXZDlmL3doMGVuTlI2Z015LzhiVkQrdHIzbDlPL0FXQmZDS0JDaHFLOGVoWnhzNG9LOFRPYVh6a1lHVTlNMGYzZW1zZUNSL09TZm11dHZsSU4rMkF2UGpNaFRncTdiSUU3THpMQTNMeGdkYVZVcEE2SVY0MkNQMUtlai9RMDJKRS85SnhKUkxodDRPaGJmU2lDaGk4bERSeFJrK1hCMENMeXpaclJzS0NNbnR6bG5Xa2FjOEt5cE51S2gyQUhTaUMvelRRWXV0UmdaUVN2VmpjcGp1OW9RNk5XTzBoUWIvVmZaZTRpd2NYUWRFbEJHSmtWTmNVK2tFWTJwejZrNE96Zm5jNy9UbDhHZHZZdEVJOXMvdk5XVXZ5UDlDem9rL3p3b1hvUDkrTWlScGNpS25HYUQxNFNKNlYzMCs0cy8wUEdRREw1Z0xUdHk5KzhRcnRuR0hjSGxzeU9FeVhndDJKVi90RDI3MnBXSVdPeEwyV2RFcWJVNzNpUTdnWG92VERHcTVRSklIT2Q0MmJKYVNrS05kUmZJV1NuYk5VZkYycDYvVmJUUEdENm9UNUhoa2ZHUTQ5bjJ4MmVwaVVqSmpPNENRZ0grdGtuQUQyK0o2WHRPSExtN0d2WTlqdGtQMmpPOUNYZGdNLzJYSC9mSWVMUzVwQTZiUlJpRXNWMWh1ak50WE0yTjFiZHVUaWpoNUpBVVdaZE5wMnZrcU41RVhLenE3VG5pM2MvWDZ1TWpqbXErVDJvdFNzQnR4Yk91Zkk5MDhwMEhzTXNDV1p2UVpxSnA4RnE1bHBRSDk2ZXdqbWZPbTFKaFBoeVU4VzIzNEQ4NElhZkxqNTFjRVZjOXc4MXl5QitDTUxvVHdBS1BGV3FHSWFKVkFVelpqSTh1UXRFOS9YQlZSK1cvYUVsc0xDV2w0VzRmTW9tdzdkZDFXVDJvWG1Ca1VsMkdkRk9vWXBNc280T3Q0VEhxcDBSS0VXR2RQSUFKaERad2tYUS82d3JDM1hPQUQwdjczeDN3YnZVSGxpM1J0L0Y2WFlNaG0wL0FSdkJmQkF6ekkzdnNLVVMxZmdRYi9OZENjblRrUi9tdEc4MDBYblpUSkl4eU1pTkVUU2lOQWJPMGxoaW4zVU5SZEdXMjFMVmRidWpPU01HL2E1OWFlQW1keExaV3BNRkJoM3h1a0l0Qnh6ckJzOWVnY0Rkblk4bzBvM05OVTBab0NMSStGci9PREZaT0FDb0QvZ2NPak91L1VPamZFaEhqeGdodnlwbnJOL2R2U2FnM0pBa1YvcGQ3ZHRYeWlUK0JjV3lvZC8xdk53SzQxbFF4aXlESWFLbVphYVR4WGdEUk85RTVUZjk2aEpZaG1zWi9WMjRVR0ltYldWMzd3WWhlM0t2UzVFRVpsT0xST3VmWmZGYzlXSVJ0WGNSdU5yOUNkMXpBeHlLRlRQK0VHSm8xdnlwV2RWL1FOcmc2S05QUFcweFEyWURRRnFqREFJY2VXcXE1cEM3STdEMC9mTitNVHE0cXN4WUduczNhWmI5NlR6WUUzL0FSM1hVaDhDNkdUbW0zSHY4cERKUXdRa1BUb3NSNTYrVzd5RmpDaDBOcVhudFl0NFk4QXhoMGFoRTZ3OUZhZ3J2NnVnT1lFQzBNa0U5aERwQ2VpMnBSaTM5MjZVOFFzSjVXR1FuT0V6NzVQOFlaamh4enVUbHAzcWNVcVRDNDJ1TGx6MTBZUEZJSHl5bys2RGhxUndReFMrZWptK1dST1JtN3dxWm1RWXZkZHY3a0xrVVVZYXZ4Rm5kNHk4Vm00ODRmZnZYRU4vZk0rMENtQmdhS2Y4VEhxVjNBUkQ5UUtkaVJHMG5GTzZiZVVNRXM3RFRpZndjZUJ3R1FCZXpuOCtRSHRhcWp2VU9qSXRndG0wTGRVbC80NndHSk1kUDNNL2FMbEhhd0Z2TGhxcDRoNkNibWZoMmRVUDRmTDFsbTdVSzFNaGY3aXJramtRblBXYW84R3l2WndNVGtZclRTTjBxcWxxR0VHMy92UGJEbHRCcXBlVTVZU2NTUzc1M2I3dnNON2svM2tBa3dlczBjS0NVS2NJZkFpYzFqZ0FaZm5OR01IVERjdmI0MGNseEc0eFEzL0phbkJ3MExHQmVDcFpFNTd1OCtadkQ0MGhhRFBBTU9PbFU1Z0pHb2xZUVVnRkJzM1R3ZGNFa2FXb29tRlZQa1hjYU9xUjAybm9OTk9yd2ZnUldRVk96alA1Tk5IclR4RVNzWnpQczZ2MXJNMjFUaCt0SFN3YlRpVUthWm5UaHdxOGhaaWZYUHFLMVlDUU5YMWk4RzJGKzFTVHkrU0o1cHJNbGJHYTZ0enN6U0J3Y1hJL3pKTEVLK2VTVStVbmp1bmtheFpHLzArY05TSWNJVWlXTlhCK2RmYUxPRC9oN242UjByYW4xWTlsRDFGc0labS95WXZqODhkR1RlR09HS1FVRFFuWC9ydWNVUWJuRzJIYmN5aGc0YzduQllSNFdIcUxDa0tWV25aZ3hmUGF2SGY4R1hISXlJaHRweHRDSURhWDNSbjZBbFN2NG1uSjdZL0NvUXFxVWVOMElveWJyQytVYm5jR1NHQm1iNFovYTM5ekJ1ZXAzUzV6amZNWWJaMGNEQ2VWek41QVd2OERZaU5XWXZ2dnpQSzdEVVR2VFJjWGVxVHZmRzh1SUNjUWYwZ0hzcEtER1VYOE5EekVuZElKWm1EYkhHRG82NWNqdlJwRWp4bTdBRnhjaFUzbWFJSGViNkhrVDNGSkMvU013a212TDJxbmhBSmsvelplbFBaTHNRYmZQQStDMDN4blQzWW1SUVFSalhzY2IrV2FzYnZqT0orZXR4UVF4TWFFdlhWQjk4NmRGU3AzTmkwc2x4RjBPUDIvUW0vdDlkQ1BrNkFUNTl5WS9iOUJuZlQ5WmVQazZIWDFYN2grMzZHVDl2cndSOG5RK2ZQdk1EMFRwRm9pdW13QXBVNzViMFpCb2ROenVITk1KNkhEWmt1YmpLd2htRWV0cGYvWGNzTm5adk00UENpaloxaTFOL0pnV3IzVmRuSVhNUk1CVVF5QVN1WGdyVHZINlZacWRMMzdyeUR0LzE3cXVFelY1Wlg4VFM2YzVSanl4cW90UWhLcm96dTVGbEN2QzZYZFhQV3VoR2dWRHlOVW5nMkNtb0tVM0FLN2lOWkhwaXVTaHdSQVRkMU1LQXFBV082TTloM0ppWFNNNXJ2b2tjbG03bmlwTE0wKytxdlVsa1VScGJYNEFnNUpQOU1tZUk2WWU3ak80MFdLaXorN0tDYS9MK2JjblhOMFZWd2hyMUZOL3hscFFiYmJWb3BEUDlvYTVaZmxTeVlnOWVheWZWRDVnQXlib0RLeGovTUVKTC9SaFZidWMwOFg3S0dsWUVod3ZadllhQlZ6T1VpQ3o4cndsQU56b0lGK1lpMG9YQ1RsSnlmNXpqV1BLZjd6ZEo4bm5aTjcxQU5DVEYxOVFyQ3FkdGI3RlFLMGNEaTRYZVozb1FKMU4rY3kzUHdGbllkNEFGRjFpb3lLd1l3MEk0SUZtYVJhQXQxeW1BNlFaemg3NTRjVUlQRnRDOFA2ZXhPa1pNUnowZjdMeVZYdW9OQmxrdHZlMUMwM29iQUl6R2VNM3FBMFZCS1ZMOGRoWjVmQjZNdEFGSDZPenUrK0J0WWFSSzdhQk8rNGdpTVJjVi81VXBURFZzeXFnSkZrdWNCYXZrUXF4QnBXRnR0VDFubytBQlI4NnVpVi9XMFk5R3J0NVVMbUFpMjJZU3VZNXo0bnNicUFZUVB2SElMV3lMeUY2RHkyZ0N5MXVMSENKaGlpSENjcC9WMTV1TjBpZXJ3eno3Z3hsQThOWlFkRnF3anVYdWo5cGlzdjlaalF0Zys3dHJZa3pVeWtkeCtkWHNydE9TWHF1RGNMN0VoMGVxa3ljRmNXT1YvU1FzcnFZZVN6SEY2bFEzMHFCMXZUbUc1Wmw1M0NVVkVUc2l6d2NYSGxoOW8rZUlzMFRJQWhsbzcvaC9TZCs1NHF5d2ZpZnlkSU1SdjB5Y09VSlFLeWJqMGc1WURRb3Z3a0FRRFdBeG9nSk5uTW5BZ2ZzT051THA3cVR4TTNMc0diT205RWhuRnh3WmVpWnBHaWdJbHFOUkxNNHRtQXdFaEp5V3RFaWhMNEFyWEFFOXBWTms1VmhkdUljZExLbktGOXFYdnRML1pibk9mbVJ6dGNFM0I2WlB4bWV4dVNZdmtMS0pmU3BJTzJKaUY0ayt2UWxFV2hsRzZ3dHJTbWZwNEhsR1lveXdWV01oakpLb2p4R3N4c2pObmo2WGpUWDVkY0g5SE9LTTdReDdxMkJ3amVFakU2QXlBYWUwSzRSQUdkZll4cC9JbVMycVA1YUZsbTFvZE9LSHRoU2ZtU1Jqb3dmOC8zY21KRlpZSDMvTVBRTE1ybk9obGJVOTNRaHJ6ekRYNmRkcWxSbWZJNlpQdE9RSkQyR0llM3hPNFhjcDJ3ZmdDNDh0emZrNmg1YkNtUk01c0FTREZ1UVNiSHBmVXNGV1VwY2NRUWVDYi9OWDB6T1h1ZURIZjRaVUFUS0IweWxEcXg4aURMOHJZNCtnWUk3M2VrTnlRUHJnRHBVNEZLYmpMM1o0WVQyV1dHclltbC9SN3BCTEZqcytWNU4vdG9ENk5JclZnMVpzcDNJdm00dklaRzZYOWtwNUc5SWI1d2daclJRbVZRTDcvYlV5WFFCVWNkMmhNU2ZZcXRGY2xtTzcwZmY4SWx4bGw4a3R6c1NEcTR5R0g0ZXZJdjQ3L0pBb0hpWlI1VU9nMjlxK1NzcjdGdkFZMU9ockxnSkc5VzhrRWFRekVheEtWdnNHaXd5TFpzLzhNU2JvUkxTQWNSa28rTVgxTXptamE5ZnowSU5icnRpVHo4RTh0aVRFK0VSa3R0dlRDYk9scjl4Wkw1MHRoYllrOGhza05Md05Majk4VEFMUElSRmQ1WFRmanViZDNvL2xoOHpxSlVGeEVHVzdsTVZwdHEySFFxcGorcGhLOENMSmk2bERmZVpPNmdiRXJmdXRsNW5nWURGZ0E1eTk0TFFoZ2hQVmFTVXpscVdHenFneVFQcVYyakc0bGlFNy9SZWx1R0FON0dUOWxsNXlzd1RDVDBkNzN4NDVId3JWbDRwQUhLb25hazZjNDZ2Qkd4WlppaW5wcndaYm53bStSeXl5TDJSZmhUN2VOR3FrYk03OGRvSDBSMzg4dVVEeUluRTZ6TkluWlUvZGNENTI5RTdxREEzRzhwcEJtek5MSGFhajdlVFRVeTFtdmlhYWxSSFpYbjcwdmFVcDhWU1lmZXQ0UitHR3JaSUNtaTVZYTlHbmkyajFjYkN2cGxzT3hlZDdoRTFZM2l2YWl0ZlZFcm4xL1o1a2VGUytEYTk4VkRPNzdsR2ZQZWhpWWZhemlsb2lDNmlNdmMvQ2VkTUszS04wYklUalBqdmlIUitqSnYxL1ZvNU1iVUhPM1JIZmRnWXhvUUpQMjdQZitQdGYwZDhlVldYdHhYbmY3N01Ubmw3Nm93cnUxOEFPYitaQWN2eGZ6NWFCQWQ0VHhqMjVoVVgxbFFXT2g4cklSdlRCaXpPeTFDVU1mUkk0eExpeG5NL2VQZUpPRUlVQUFyZ3ZmbnlSaFA1a2NNMWJ6NU5aZnkrdzdTRDZVV21LcG9xZ1dBUWdvV3pSZzF1VGlOWWRaeUVhdFhQZTBORTQ4c2xweDJLZW9iSGZmakNKOTBuTWZ1NVliVkZic3BVemlsY2RhNlZZcE5QQTJYcC9IL0t2SUQ2UkplaVNEQi9iU05xT0dVeWZvWDFHVU9DNnFWMTNya3JmSWx2RUIyTzJwbDczbW9vSkZHYjRjbnN2ckRwZ0xNMzJKYlNsSkxVQlFWa2dhbURDdXZneGgrZFFSM080d0c3MkdiWUxlM2VKWS8xSzlUWGU0L05UM2h1Q1ZhUG1ZOVJhV213NzZpUFhRbkJEOHlXSDhLSTh1SzMwd2Nxa2tEaVhaQnZZYzJIZWtHSEFaSUxQbWZ2eml1UjVjZzZWNmw0ZGl5MkJBMXZVdFp5R1B5eTB6QWVqMjdoWFVNeG5jS3hRYXZyK0ZBSVVzSDNOalY1WUZGc3BZTFhXSDdhL2YxclhyYkEvRWUyc3dnVnBsaGFkeVFoQ09PMEJKN3E4T0hoc01NWXJhVjNpRFdmNWthSWZteFZ3UUpQOXVCKzJFQXg2TUlEbFZUdGhiZk5KRlJBWmgwVVdwOUk1M0U2Q3dwcXoyay8zK2tHUHh5YVhKV2hjbU5IamNMU2t2SVFGbmlhVkUvWlZOcFdGS1JBSXQrZlBGMWU3YVJyQzdlaGUwT2lkQ2ZjWEt3U3NPTGhsOUl1VnNTQlBJVFRQQzdkZDNIaFpLai95ZEhmby9USjJoSlp4VGt2blJSMTJEbmtVUURMRE94ZUtsajVNMVVWQWpPbGF3SUVqMGRmUlhEZXR1dlBvSlVBY0JCRXhPMTh3VUdJaUg2Y091V1FCZDVNSkFDbzN3cG9qZzdsL0JrTGNWUGtJVGoyZjJHZU05c1I5QkdtQUI4SnJIT0xIVXRRZkVmRnBHaVNkQ3VKb0lETTVlSE94cFhVYUI3MFF6bDU3VHJab2JYTnZ1OGsrOEdXOFE0U1hTNklGa0t4UnpSZkZzS05mbUdWZVRYSWdEZ25DL1lSYVNIQW5wZ0hURWdjb3MxL1Jxck5BUG4veXhDYU9mOXFYakluOGNlZHU0Umd5Tmx1Nkd2enNoMllaZUkwWmk2bDZIVXNJN0JwYW4yZ0t2SmFNYnRIS0pwamtzYk0za2xyUzJ2ZHFhdUgvaHB6dGhQTnFpaU91SXdmUUVqTDZheW5EMDRLOWdDWnlqK2RrMk4wN3FOVGFneml1UkhkWHVFS3dyOHRoRUhOUlNmTTZZM2Y4R09PeXNoMzZhUjQvdVdoTzFSTUt4RCtKcDVIdFREVnZzRHNDZGRCSlZZWE5RekpGVGVzdG80S0xQRGRQUVRZUW1UaFcrN3Z6b29UNStPWlJVRmhtM2U1TjJRN01taHh4WUkzNTdiUUFmRzErUFFhbGVXbitSbmE5MUxSWEkrMExiRlUxTzEwODRhdEJJS0t5STZja0ZUVlRLZisvVGx5TXhxL290ZVMrZGtGVHkvMGhHZVJHc0xYYUpSTGpNb29XOC80MXZmT0xFQ1ErUGNhenlpWnhWTzRFQVprUklaUUthU2syUnJLaG5NS0ZNK1UySks4R0tOWVhtczVidVFidmdCbnRTcytYZlhNMWZMeENhVG5YQnYyYVBvaTlwQ21KTGswZzlDUE9YQ3JmYXB3NFQxUEtzZTZBelZrSXI0aEI5THdkU1pWbFdMdEQ4ZHJuM1ZsSHNJeTB3dk9WOHhVamZrOTlxK1JqVWtNa1RiaVZTNVRuVTZNVlhPUEVCeVZCM29WbW9GdHBUMDJWbVdOQlNGbit3aGxnMHFkSnU5QTF3cWZ3VHovRG5acmZEN0xNdEo0M0RzQlJHOXppN0ZoTVJtVjNJdEluSm9NYzcxc1c1ZGx3S3BTZlJ0VlBhWThsdjJPV0xNdS9yTmVGN3lybVM4KzZZZnUvWXZjcHplVUJnb2xaL0hSTi9UdnVXdWJuQys4cGdITEpiR0pBcURwOHVWOWNlMXVwRHR4UVVoUmdCRW4vcmMvNXI1ZEZEaUdBMzdwSEd2T0ZXbk9NazRPMG4yaXlIVnZGRTBjdzJGQXdZUEpGQ2ZnQXRzb1hpdUcyZ3lkNDcxRS84YWVMazJlN1NxcVVRNGc0ZUxHQ2ZmN285RWRwWk52cUJrQmV6N2R0bWo4aC9MNzYvdS9ZQktYNUhaZ05GOWM1cGxYNUJBUkhSUk9GVTQwaTA5RXZpMVhUaXNsWEpwb1h1TnNpK0pxWWVFZTZhNjUxNFNxZFBoTjRFQ0tLY21yRTl0UytTVnlFampNYTVWbmRPYWp2d0o2RSt1b0FqZ2FCejVocWFHbFJ2SnlsODhWMjhIdy9lYVJPWk1GejB3UWt0RFZra2NZdXd6cHpWdDlESGZVeDZmZXBzUkJvNTYrajhET3g1a1lrbHhvY05hWFlSRjVucUVpcUMwYXA5U0RKSXdlNElneWo3TGJFandhMy9lQldZSDNVN1VkcXFMMnM5dFN3eFRoSXVJTzhjTElQZEFuM3BBNEt6TFdDZTcxbEhDVjRGSXVFR2I3aExXcmpQWGdONCtKRmJ2Rk1wUTFmc2ZuWlVnYjcxSEhnaVVvUW8yOXR5WTcxeFFsZ1Brc2dNeFZsV1RjbjREUzZOQVQzK3RlV2laVEVZRllIU1l1em1lVFZLaHBSbFJnUUpKS3NyaGhlSEZUTXRaemZCbVE0dVNYVmhMbG5VUlJWSW1XeHdzWVlpZW1YSE1DbkV5UE8xcEtCbmRZV2c1UU9qMjBuc1o4SHRuVEx4Y1N0SkZPQnM4M0prb2dmUm13SWlZZElmTkFQNWp3RVZ1ZUorVkpiaTlXam1CQWgrLzJNNkZNT0J5aW83N2VYTFdzNFZReWRjZXYyR1dYWlduWVJsWEhLaHZlMjM0QlJDQ1JZL0MzYmdWWFNiL2VaSUxiQk1NTTFBeHduQjl4bzYxZERjRExNRCs4NnZrbXI0T1pnVXIvOThlQUFOdkU3Vy9oTHBrblRoSWprRDNDb3BVdWV6V0tHcWduaXpSQ21SbEZsZXE5NTlza0ROWG04Y2t0Sk1DTlBtemJCWGczVUplNm11QXFHRTZjWXpjWFREVlYydnAxRzZsQ0lnK012WllrdmFlR0pIV3RYWFI3V2dFMUFzbWZFRCtNUXJTQzZzZTVPc2hGRmlBU0l3cXhGdE43VHNkSmFWU2ptcXZXUUdSSWZjd1A1cFJqQnhBSWZ4aGZTbnorSGdhbWF1WDVrM3VrSHZSdTVORU5Fcjh0czVWSjhuRElCTWFxdDBlWXFMemU5MThOZkc2SkYyZzRDZzdNZnhleDdSL2h1bEEwWjN0V1UrbUM1ZzZNMzdsWEhxTmNKVys2TzloalBLck1FTU1NeWRyM1I0RnZueGNGUlJyNXpGZmNrK2hKaFY1SXVScFJOVEdORHMrL0FmK2REaXBVR25aejY0MGZmQ2xGYVBwZVFaMmh1UmJoRDMxZTJhQkZ1NDRBRzYwZnAwMXV2Wk5FakhtZHg5dmViWjhBb040ZDdVKzVGQzVVWDhXWm9zVmo1b3ZuaythcUpmei9RTjFoc2NVUjFuLzJHOHhZa0VaeUN0dnBIbkFlb3NYVmhDUXUyWFpHVDBKa2Z5Q0pyMXh5OCtVTGFVRVRCQVFIU0M2d21QRHEyV1RLaHhrYUVCUEdxWTN0WEI2cFVtWlI4RkFOSy9RYnNsSG5vTjFjM1NCSXI4aTZyVm83dldxZUZRNzM3NjQ4WkpadTNOSndORWFoSTdtRjBJL0JBcFBranh2czFMQ2NFd3RkWEFFbjdjdk54bExROW5rS3lpRjE1WU1vbDVCbTg3eFJaY2ZlaSsydGJrVEtJZ2xNdUlMb0RwUVpxNWVqekFBd0ttQXhSV0dsSG83WWhwT3FORDBHOFR5OEVqczRkTEdscmxBUUQ0NWZjUnJoUWs5N0ZqU2tHQ0dqVy9yZnpJWTd0QURnNjRXSlBzSm9GRFQvSVc3eUlHTzN5Y1VNSzVTL3hoa0pJbk9UYXQxUnM5NVVCaHRxQU1rdlV5S3Z0RE9oUmY4NUI3TkJla3lYN2lEWDFMdk9KV0xiSGtlcXFvNG5zQ0M2WjhITE9TdUppOHpCaXVwTXZLWkMwZWpXeEwvV2kzeUplQkMyVFZkMmRJQTlUOW90Z2d3TWNVNjROTHJxUnp1WFRGdXR3UlB3azhmM0xJUmo2T3I1djYralgzTlRhSC9mckxGU0NIUGlBMGhFc3g4dGYxNTJYejFwUW5ER1hWUnRvZ3dER09aYy8waUEzOWJBNnA4aXFNeEloaTcwaUhuTG5zdURPMStETno4WC9pb3ZxRTc2c2xQMS9VWHd4My9rVDlOOWtibEhhcm5QcmhJazZSbEdtdTYxd01kSlNBenQ3WWRGaDU4YkZZZkg4eGF5V0xZUlFpQk5SUFlJMFQyOEUrN3dlLzZPR28xRExhQ2J4cHRWNlhIcWJaK3ZmaDRxL0hES1FLa2t0U3B1bGxrbmdDclpJWkg3akFnOENUUUpYMGtIanhXR0RnRDRCM1lrZjhxWGREbWdaWmYvUldhUS9INDlFcEk1OURxMkJyZ01lUjdpSDNKdExVb1FGRmdldnhDRkgxeUcwTCs0SWVPRENpUk1GamhlQnZtZHZwSXNZNnZ5ZWdUWVhNVEpxTWU0QWIxNEcvYTAzQUIvTUlJWWl0UWM5ajVWTGxLUlc0SkMxWWpQc29idVNqVUQ2ZVBZY3NVK2pZZXdkQTVkZmxjd2VpdmtHOFUyM2hhN1paaGNOSmE3K2dHODFSTjRYeDNlQ3NQcmpHdEJXOHMwNWZSSStYbFplWVREellGUXJkT1cwd1hISzNTNXpQTjRjVUhjZmx2N0h5ZGlaTW8rTTlUK05IMC9ZVHJQUUhiRVV4cFBlM2JQU2h1TGZGMWdURlMwcGk0QXg0QThHWVFFeDRiSUdkTzNCcDBFWmRYNFpUajVxOGx5YUk4eXo5NWsrbW55LzhNYUlpV29PbFdiRHBMT3lmZEhnTG9HUWI1dTFmS1VZME5CNC9YK2N5TnNBeTY5OENiMjJDL0ZvYUZyOTg4bll3b2xTcXkvT3VHSzZrcThnbnVRWEZ2RDBSRWZYWWZSQ0QrN1N0UTJDR1QxQzBHdjFMVml4eUd1aElKZmNvTTNKNUM4SVkyL1ZkNGRJMGtqTlgxS25Lbi9BR0liVVlPTHVlak95TzdkanhWU0YwRTdKQjkzVURXSXdrTUZ6amM5N0JteUpwczlaRmJ6MmFROC9oMG8wYUJ2NTF6TEh1WmVCZUdYQXdIcEh6OW9reDNXRm1VN1JoelJadVNJUWxYR1hjajVJcER2MVRDazluc29USkl6QnlSNnhidXJURW9DZEpudG1idkEzL1FxVGhicWhaL3hXL3JZNnhFWkNFNnZRL0pGeVN3SmlFZUU0VTdyUFFrNFo4U2ZtdzdGOE5mL2c2SlZ2WlRmTW4vY21SZTBwNnRVL3c0Mk5ZMURhaDdjN2RWQTZpSHRkWk9BbXF4T2tBYUJabVNSVi91bU5HTVlld3V0NXBta212QkNzMjhHRzMrL2FwQ3NUaDVXUVdOelozUzM4SG05bnhFd0M2anFKUkVsUy8vQTNEUHF1enhHSmRMcmFidHF2b1F2cFJYMlIwNlZKSHplMlZSVzJnNzJhRDYwcU9GcXVTZ1F1cG1sL3FiUU1kSkUvSEx3RXlpZjlZSHpYako4c0grT3VkeDFYajlsMGNLV2ZFNE43SFlPSFQ5V0dXbHI1aEp0alVXUHN4L3dRcnFyc2w3LzRKQUpMaWdsb3llUFhleUlXTVNCUnZGVkpnU0NnOHNZd2krbzNoR0hZTFpKMDZ5OXJkRFB2MVNjYWZhVHlQUGFnTnJybmJ4aURSazR2TjlTRmorNjNBMkx1TmJ2R1VyTUNRQk40QzVUSGlLTGVYaDNhUzhhbHFTTlFKRzJQSTB2U25FcDIvcEFvTU1CVkpaRTRBYldpZ3BjcnpQVEpUVHhpREVlTGE3QVozWXQydEI4aHMvMlAyTDJDZkdEaWJKUnV6WEZUbFpEUmxQT3FqTTB6OWtXeWZxT1VTeFhlYUNZUW9zMlV0TEFTc05hWDRKMW1hcFBKR1RlNlZzcFRBbVVpTytOTFRBcTdzWmJmYjNMWTZBZGtkek55UWo2QzdKR0JXV1k0TmhyOXJTVFlHZURkWU1vQWpqQVdmVXM2Z0ZmTHVnUnJtYnhua2RESVM4V0svSzZWandWVGZjaERpdHRLdlBkdXVWN2VUZS9JZllORlYwQXV5NW5vSytjeFQyV2VRaEpVV0ZOWS9mUXZyZjluUWRSQjVuZUsvb3ZNbTR4TmI5cXNpN3FvMDN0a0J3cmQ5WGN3VkZmYmo1S08rUC8xU29vL3JwdjdLYkJLcTFOZmQ4aHNqYkZrY1hPZ3FRTkwvSElFdno5NzNQWTZZaGxHd1hoa3M4TWdNRXZNWGpySWVxN1FYaFkrbXlGNTE5K0dZVlpTZVUxL09yckpYaXdlbnRnenVKcEF3Y04zQnZPbGl4TUxObEJaNEYwUmU0OWt1SGUwSmFEVVFpdm9KWEJXVTc2RHVmNU9nREZDakNwdTd2dm9XdHZ6YUpORWhyckcrajFGYnRKSlJ0WGJnOVNEbHVadXNEM3pPWFNEU3J3MnEzdTNMc3JCRGwrSkdSb0RzU05oZEFmeVpuZXZYYTFuYzg4SVNMeHRGOE54SzVyT1gwTnJGTnNHVVBVVldodzNQQjRmdk5hN0x4OHh1eWVuVCtFbGFyMEZ3VFJaNEJHc1M2NFV5SzZ3aE9rTTdja2lxS3o1eG9VNUMvdjkwZzdnRWIvbkhrVEdWU2JZSjNMYjVWdUY5cklGY21NRHN0dVF5TGh0TFNaaGxIY3NlUTZlaENpM3pXMHIwVjUvMnZkVG81NHBDMmNDYVVINk5GZUFWc0dTZW52RkxaOE5TemRUdkE2TTNwalVWTWU4dlVVbTBqMFpoV3ZHak82RjhkSktNRVk0QlVXM3pqV2Y4ekloNWdRUXJiUVJNdDg1YmN6cXZ4QUh3L3B0dFRUYVlYRG9VQzRkL0dMZWdkY0ZaSXE5VzhqK1lsSmN6UlZQOEFZVTNBd0pHOEFYV0Z2MUE2bHNyeDFhc1pYZk5BV01EUmdES25Fd0tWMzIrdjFKVGVmbS95b096YlJKWkVWbDlrZ000T2M1UGM1bE54VmdkQ3VXUjFRaG12QjBaV0xmMEZFODUvT1NxVG5rY2laeW1EcFlYVHYzNElEMExmSXdPaHBUL1lISjZmWjdQMExaVTlqbGdKdlVJNXRaYzFmbU9TMVZ1amhNeU84R2F3SnYrQU5pME1oK1g0ZUVDU1hnNzRSZDFHWTM4dEV1SlZNSzhhbWUrc0NPVDgwTisveDB4cncwdmwxdk1oZElPNGRac2FRc1ZtVWxjQ3I5VVVIZTcySllDVW9rWWZmdXdZUndSVkJxVnpCbWJhOTROTU53TER3OVRiM1loczN3QXRGLzQ5U3FjMXdzQ3ptNDIxd0dLT0pTSEZ0MnRSV3dXeDk4dDc3V3FWY0NHTG43c3VoQzNZeWtxSURITEh0NEoxZ1pOYm1BeTRKYk01QS9TbWoreEZ5MGNmZVlZVWNxT3pFbXRIUDUrdW90cmVNdTJwd1pRWU11QmEvcDF2bjAwYnhlanVhYTYxeE1KNW1tQy9aQ1Fyc3p5QjcxcDVUMWNTUzRHUTdmMXVqcmUveUhDdXB5MnYxNDZuRFptSldCSTEycHhZNmw0cDhMUVZ6Q1pmS2lHWkhsQ2pxN2FaRUczZ2xxcEVFZWh5Wmh5azhuVDlXTzdSc0c5bkVPWGVucTY5TldQZzUwZ2pCMVFhQjdQT2JSUmxvZDVCcGQ5anRqSTUzSDlzOHFqaEF5L3lvMGZXWkVtVWlJbVBWZTRZcDE3d0szWG52U2lmVC9nU1NNcWNkR3RPeUdNYkthSTA0WGpJMVAzVlU1cFdib2pBVjV5M25Va1FvcTZFRVh6bXA3c3BXWVlkNXFzcDBjSVJwaTRENzdFdFViNzAzczJkaDg2MzZwaU5sYjUzRmdCSWJGZFZ5a1hOQTRNN09sQWdkZWRuQlZGZzZxaC9rem5PU1I1MWFlbE5vbTZVdXRSQ0w4VU16MTFXTFNVV2hqdGx4bEdSb0s5ZHMrVEFUVE0wc2FUak5VOXJDeXdxQksvWmNIRzhiZEpwUEdhQXYzYy9XbjdkdTUrN2p6VlQ3c3lxMHE2dW9TMUxGWjRPNjFKRDFJZjFraC9uekdwcW4rVVhWYlZFTlZMUVllMGRvMXZBYVBabmVZa2wxUW5MMmk3WHl6RkxWQUhZcnYvSkRBUFFLYnRqbWdsdG9Kd3c5QW1vSHdjeGc0U2dHemJaNlEvZm5Ud3Z1UGszcHdoTHNkb2EvSENGbUMwQlNoK25mOHd5OXppUGJvRWRiajdCZTVQblNIQU5NaHRiNHdFSm1RUUw1QTdwTThtZ1J4NjROM0RzSlFlcURVZlNrOExiZFY4dEMvZmlHTFdWclZDN1EvQUp2WkhoSnZiNHZRa3FyM3lUVjlIeFU1K3pJZGt6eW9CbHNkZ1FLNUh2ZXl0YmFsOSt6VUs3aVMxS1AzeDBiSHJTaDh5TXFYdjRtSWxFQ04rSGNlK1FoZFo0QlQ1MlEvamUwZHc0NlRCa3dkU2Z6S3o0QVNya1lFN1ovYXR5RWEyaTlXeVJkSmI5dllab1R0d3BsRnFCNWxnZGpLOEZhZE5ySzA3cWNad3ZkUjhjMnAzWDJEWjEvRXRtSEE3ai94dFd2RmRzQXM2L01vWTZleDlGbFd4U2FnRWM1WTVGYm1aQ1IybmhGa2NlQ2w1N0txWXF6L3BDaHdpYTd1amM5WFBlY0FmemM3cC9nYVpLeGZlV0xPYmdXdHJJT1QrZnc4MEpXaTVDVFd1Zk84SkFKWU0yb2t0RDN1d0Y3RHB5Q0JOU01Ed2JCN2dWUUpOamxyUFZ0MENyaS9USFdZSUdoczFTUEhjaEhkOEhyRWYzSDczYWFVRElSeURqcjVvNC9Vc3pWbWppUWZhTk4vK1pkbVExbHJVelh5M2VocmdHTzJiWmFXZUw0UTgyaHh2anRFRFZiL2c0djdHdC8wUlZ6aW5kU1FTRUNNUjFYSkppbGRXVXlKMjFZaVJ3LzdBV0ZwOTJ4THU4Z2ZuNG5ZQVFFc3A3TGJVeG0rdUczNjMrY1d3OXVydW00QzFWWHlDTVdVRTloS1hPODcrQnpZRWdJbXlydVhoYjBXK2htYmIvdjlabFlnUXI5MXc2U2ZNdVJoN3c4Z3QvVFVTRElZKzhFVE43RDg0ekNsbkdIaEhucXZSc3lKaFdPbG9lR0ZxR0IreUg3NnRpclJtUTdmbFZLYXp3R2xzbWNZVFJrMkV0SWx4QTRNQng1MnJGQzNJUHFrWWhOZTJ0a0J1VmZYTllURU1JcS9UZWRVay9QUlNpcWZ1T1dBM3ZyV1dEeWtTaGlsVnNXM2thclZYYUgxV1Y4K2U2c2FRd2Y4SUpycVowMWMrQTd2VVNJRGY5NjFRUUlRcEtYMUdJOE91dmtNeUkrUzJFN2RGV3FJWVVJUkw2aDVjTUtEL2JLSEhpYUxGUFV0S3U5RGo1ZmZXT3A4NGNBaVgrRzBneW91Ym1JSHpaTE9PWStkWE1GVklHdm92VEJTaWtFTXhDSlhZQ2ZqVGVIRnlCckFsRjUvVkE2dUlwS3V0SGlZSjBqRE9YQjB3TkJ5c3NFNmJZZXZUN0JKZHFyRndCV0EvTjVXS1BlVk5pdXZ0cTdzTG1OQ2c4aUF6amtXZUk2R0hOZ3BnSzY4Ym43eWRFa3dqU2U0SkpCdDBiRGc2STk0cUR1Q25PYmVsMndQbVlCQnlEY2c2Z1dhWEhwUnlVRHNjbitpV1FRb2lmZTlOa3B2bUhrbjBUZ21QUStVZFV0T3J6UEx5MDJkTThUMEZodU9aQlQwb0xGTkxTMUQ1YlJZYlExWEdZOVdDRHI1bkU0a1hDV3FFWWd0a2xDa0NmQnc5dWxLNWk3ZzhXU2VUcUlYRy9XazlHNlpiRWtGdVZxYjFaeW9zOXlvM0l1ZlRxRG9YMk0rNWlpaEhyTWFpYVpCdWJKUFlIdWFONjBYd0wxcUV0aElrOW45S295UDVNMWtzZWJOdnd3ZHZ3enlUYW92Z0hJNzZpSks2OEpjaFBrMDB4a3hjOENWUE1Feks4Wm5sT05CUmlJQ3dMMG9wcUJsVEJ3aFoyOVFYTWdNNTh5NnVRYkp6OHNENERMVUhwWFNBbWU1NGJwQ1hCSmlUZldsb2srNE9FejJTWndDQnIvN0JGU3p6U3pXNThuQTBNRUwwbVZxQk0wRTVWUUxJRDFoUGZOUHRQSEpKM0RBN3RSZVhYWFlqdk9uR2ZMQ29RWWk2elo3TmNSTUx3c2IrZGc4c2ltdUNjZHY2eUFzUkZkL2h2ZW1mK2N4N0xISEhOTFJyMXpLZXNXaUFPQmxFQjhIbXVsWFk0RDJWOXBGVVgrY0pwbE12aHBFbkZIMUdubUZ2WGRaR2NXQzE2dGk2NzVPQVV4VzA3RnByUEJmMzJscE16WjRra0JzeEUxU1dTQ0IxVUFJT0xINDVTOWZNUkV2MzFjRUdlK0NkTi9sNEdMMUdRTDZsNFdvVTdoaTc3WEcvZUN0R1hWT0daNUJwNE9zdmpMTnN2ZFBHQjRJOCtrYWw3WmsvSUtSTm9hVk5wc2hBbzhzVDVQdmlQSnNiL0pmRGVyVHZMN0p4bWtQa2ZyNWxHdS95OUwwK0xjVUZsQW4xYUFWRmpSdC9BT01JcDBTSFN4bFJ0T0g4Mjlsb0Mwb3B1dysrS0VtSzEzYVM1NEttTWp1Vy9SQ01uSTB0dUsvVWd4R0JFcnlnS09VNlUyWlhERXg3eStwa3daOEgwMXZGemhXbjcxRU5VK0h6V3g2TnJSaVVWZDVoYi9Db2x0R0dFK0Z3S3VQbjFSOXJXYXVYcmxsSzVyaTFpekV1NUdLdWZIcmNoM011aUdBYXRGeGEvMVlTanNzZzVoTmlxaml4bEtHb0FGczRIVFhvTEw1MDZlUnEvVE5POXJyZDBBazlQQTFNVjlJQ0F0R1gvMW9pNll1TUlRa2o5ZTA3MUhCWlhFZWJISGRlZk5weHJOVjBYQ2pXSnh4ZWZmNjlvMEM4ckk4TFk2WndiRlFhV1p2b1B4alRQRWVzZmU0OTFNMlZGRjA1NUw1WVovcnB1emQyZ1RudURjOE9kRHNsTG1nUmFla2FwWWxuT0VkVE9XcVI4dlZ3WHJOZVRYNS9oQVlEMFJuNUx1M1llL1hWQkVoYVpoMGtrQ0QzWEhxalBVSXJ0UytPanZJcEsyYStRNE9sWG0vN0crWENzZTVycGY5UHJCbnhTQnprd3J6SmJEeTNpLzFJRTdSTEkyTmVBbEd6S1FqbXFlQmthM0I5TEFJUzJMdFYwU1pxRlp3MjJoQVBLWEp0TUI4N05lOEhTc2dHbUF2dnc1U216UEk3MDRkMVdQY1c4WWRLZkQ3aVc0cEVWbUh2WGJ5allxMW9uRFhTbXNPUGR6WTh3S1BaNjl1emtidVIweDdlYldTRnJxNEU2WWR6ZTF2c3lMSi8ycVBRZ1NIblY4UVRRd0tWSksydUxQNm9SKzNLT2VBRlcwNWVMalI4WldLSnpWRzhzcmV4S1VPZSt6bVVDdVc0Y092Unh0eFgycDhkNXc4MENmV3NwY2NtWDNyRldSTWR3VFNBMmlYcXFsM083UXV4R0plVUNwMzdEaHUzZjIxL2FxQVZIeHdHNnJ3MnlUUmtvWGc3Z0NGMGtJYnRaL2V2dkJGd0ZFaGd2YjJJejVKWXdsTWRJTnI0VUNGS2NNcnBxc3I3am9leEUrU1I4TjlrK3l3WjRvSCtEdnNmMko0ZTE4cmNzTWdxOE5IcnkxdVdySmREWGgxUktLSEpRWTdSRzZMWXl6N0JYeG1NbzI5dDVtNWdyOVNQcm1IbGZDM245Y1lqaWQ2QmFScTNXQmdHSWlzOEpOTEZPbk1HaUFmN0p3ckxSc1I3eG5pc1FlVStGYTJWSzJIWERKMGxrOEpNQ2FLUE9FNVRUcWtCbkRpTjlWOGhnanp3RmlqTjQvUU83ZFVaNlYvSkR2QWRmc1NNY3paMyttZEl6NDRFMlRLQzBsVGNTWUpZTTR1THBFNFNVcXhDV254SFQ3Y3h0WWo2amJCVlprK1NUMXFiYUY2WXlPRmJzdWY3c2hiOGs0NkVWZUpid3JyUUg0azZ5K1RJTEZqbHZIMVRGME5pU00vL1RFVWMyR3B1cDY1aExhSVNpeTBnRFhMb256SExaNk1uelBlcDd1UklBeDFTTHBvb0xDaEk0b1F4cTBjdFBTcndNRzVRYjBZQldYSzRXc3VjVmhqRzY1bWtmKzA5bGI1ODM2M3RENzhxNjg3OEtrUytycUhSaWMyRGRET0ZOMUdFYk9vOFdTVDhhWU5kWmFkaHJjNWtTOXFQd1BpWXphckplWmRycWx6bEV5TE91dVpUeCtEcTkrZFkvRUROL2dtZjdqU1VqM29NZnkxQkpRTFRxL3JHMDVKL20xT3JURHcyVDdoTGlsZUx0QVJPL3hhTk4xZ2VvM2owb0djRUhZNmo4bnZwMlh3ZjhkeitxUkdJUWNJNlp1YTRBMGpnK3Juc2JDSVg2MEJML2FOeVh0S0tvTUl6b3dVNFlyczRlWFNlV3VhSjE0eXFLM1FLL3h6dDVha1lVZmZrM3ZNRjNYZ1NteEcvZ3RFUk05YVJ4S05TNjZSblNJM2ZuYWFNUFZoR0J1Y0s2dTRrTG9tOXl2TnhNUVJJdy9IVGF3Vmt3NDRxTGhROTQyaDUveFRWQUw0dXVKdkV4ZjhXRTZQeWd2d3E4WFVVUnptaEp2UGY0MCsvY2JOOG1nY2M4aFJ0L3lJU3ltckhleWwxV01sM0IzcXZSbHQwb0dvL2tvdFRzaVQrRGhvR21FVnZVQW81anhobEhmYWFidlNzRWlWQkNScVVFN015QTZMN3dFNHhnT0haNFp1N28zQndzdWIwNFBXVFM0MmNScGR4d1VuWWd5K3o0Q053ZGVGNmpUcmpGMXpuQi8zRVIrdU93d01yQkcrVVF6Q29oUmw3bDZmcVQyTzVmRlBXTXhVdzV4SzZIT0hxMEdFc245c0FFa1JzVkpVWXRZYTI4VWEzcjhYdHBOcFd6bTY5ZGY1aEdvUWZ5QXZCanlUVjlBTzN0dUNKYlUzcWNiMC8rU2t2bTdpb0U2TkhVTmNYd0hmVFRiU0JWZHArM0RpdWNzVE56cGxScks2WHBmSEM4Qml1NHRaK3dHSHdOZXdScUxORkJUZHR0bC9LVkpoSUVJeEJhcFgxTnFOMU4yNHVvbG1HYmVIN09LOEpwMi82OWVDWDJtNGhVemZTK3RtZnJhUTF3ZEJKSm83VUtPU1piQ0FIcG9Qdnk1Y09oa1VKUFM1K21MVzBxNlJSTXRqRkRQbE84cktFRGpwUUtRbktkQ3dKRVViS21qcVUvaTZPM0I5eDZGUTJjQXYwRitwRnQ3aHRYV0gxcFVhNStXc0lsRzYrY0w0K0lJbzhJNFUwN1I2S25WajhyeVBUejNJMlJ0anB0Tk5LNjRuUHVMUEdjZnpGU1pzUHEyRHdnR0M1SUNJU1d6aVczSllHYVVLSHJ1eldFbFp2MSs3Rm1WOXN0N0tHZzlNRmR6YXRFS2NnSUJsdHBwenhGcVFaY3VjSjBhbHNvNjVlbWo2eXVUQXJZQ2VDQjBBcGt5d0diOG5VdkNFNUFjSEdVZWZvSFMzcHBNZnVHYXhIejlUNGVhZWlMVXFWRjdKZ0FGSU5SamRJU21ZWWdDSUUzeGM1WCtyN1I3aStsNjhLZ1pudk1YY3hsZ0ROWWdPUUEwUHEyejBOT1U1ZGlWUVJXdGtRbUV2OWVQbi9COFZ6SUw3cGdQSmtuQlkxVTJsNWNtVHlGNDRyY21UU1dLVGNUNGxUc2tnd25aeTRVMFFQSmZHdjl1REhzdVVqcHVwM0lRd0JWeEQxY3pucWJ0NWhEbXk0MXJ3WXRtanJjTE1wcEhYKy9WZlpJUGxyY3k4bEFZaW14RzNON0J0cCtBcnQ1WkhKWTUrcmZJZmRuajlJT3NBRGlJbUdud1QvR0FKQ2xYQk4wd0M2ZnVjYnlQN3BQUnNRcFpZYXZ5SnY5OGFPRDU1RElqSXZSbVlVdU9MSHlDZU8yMVJLOFB4cVB5YlhJZ3NqMld3R1M4NUpPZXpTWlVCUVRhVC9RTXcweWhTMjVvbTJkcEtRb0J0TCt6MmJQdXVzTHAyaFU1Z3g2ZUhUN0g5c1JjWEErT2Y5OUc0M2x6WGZ0c05weVlYcTNzYVFxWkw2dUtqdko4SVp0M1VKV1B5R3ZXWEc3SWJGbUFVSmlkOFc5R0RBNlJMajZRWUd2anp3ZHdKTEo3bUZsOFhjUXdPSDFpNHFJSEx2RSsxWEpUNEEvd04rUGVEb1RtMzJsVmE0d09aNHVrL2E4Rzl1bDVsSkd6UnlQQkJxWmg2Zmc4NjY4dXJ6VzRGekNoSFFhaUtnWlFoZGNvRFdWUnZSRWpHVE9wamdlQ2UzVlcxMVYzSEdEeDdhc3NnS05qalpFME51NlJKa2RLNzViZ1FKRXZONTVkZWhsem9hQzBSRnhjR0xQc0pOR0VuRnBRUW85cVROS2RCYjZFWkxxZjY4NXdhbFMzak9iLzVNS1RDYnhkV1FDd0JhM0ZUQ0NhbXpNK2Y3RUNYRXlTWFIrZkQrS3BaNS9sMDc3Tk5EVXd3Y094Nnl3UmRCQWwzZ1RINUNUeXQ0YXhsRStvOGVNb3pyeVNZcTZ1dVQ5MFNJd1NwcGJyc2l6Q255V2ZCSSs5OXBhUzR4SG5ESXVFR1lHUHFPNmIxRWlULzErekhMUFoyVktHQWxUWFdQOWVFMDE5anNpbmV0ZHV1bnE3RW0velhjMVV2NWk0czVrZVRiZDREaUVUTW5DRkpyTUs3QUQ2RnJHZjhMVmtpZk5JQU9oVzVVTTMwdU41cE1XcStqMDZGTHlWZlZCckZPNmZXY0RkemFJSFgyZVU2Z0JYNFY3WW1za1Irc1hxK3k1ZmdvNjZtL2ZaUFpIQWxOUXZrNFlzNXBueHBLbFFxOFVsbXA5SE15dndHZVdETTQwK2hxMEF2Mm5YMTJFRkFEOHRsSTBPQTB2N1lpUkZ6R3I0ZUtoaklRVUx5dEF6NnVVbzFzYTVXeUFJeFJyNWs0Qlh2NXZRcHkyRUtQUVdzKzZCeXNVd0F6VVJhdk9PNk55Q2x1RmVYSG0zeUpKc0dvQzRUWWRUL2JKOWh4aVlybmMvRTB3RXN5bFlWS1grQ015ZDlWNjMxTlNERlh5SnlpTzVrRkRoSCtWOTd5QUd4c2Q1ZTYzRnU1aWIwc3lla1I3VkhGTVZjc1U2MkxPd2ZEakh5YVVneDRyOE85dVg5cVcxZ3hic1R5WVNNdzduWW5neEpaV1ZKVjJoL2lrZUpCTjB5Zk9TTENoNzlKeHp6a3c1OVArOEFrSy80U2NMeVVPZEMvc25Jb2tKeU90cHYxckFkblBVUFN6eGtEL3VlSlFMR3prYUl2NUpCemo3aGxUZWdPRkR1N21yVGhmNVlUNlFQcDFyRTNubmd4Mnk2eDFvd1BKaEhyMjRJZXZobDZEMXhzbDY5NU5XOFNNYnRTdkVZZUFKNnBpQjdOcUtqa2dYS05KMW9mZjN5UnVDTktkSVVYSEZ0Nm92Y0RZcklNSHBKWHJNenBzSVRaOGorTDBkZFlxWGs4L2xZMUFXT1h3WUNDeURHbFpGVlBpRlFmaGlITFg3dWlRa2pYTUhkeCt6L0xpT0dMbDJ6YmZUY0VZNHJiTTVuNFd6bjdTNU5YcCtJeW9BV282Y3FtTFlENUs5bW9KWEdPNXFLRnIwd1E1anRuSUhtMldtYzZXM0JxNUp6d1UxbE5weEpvekF1SEVWcXR0dk1oMTNVZE1qRzBzaWFwYWJlZjlJeUpWV3F6OE1BTTRtZkQ0ZnFBY1Y4Y3BLOVZWM0xlL21lMDA2YVJ0SFg3d0g2YUxhWVFBSTBKWkR2M25VS09icEZSNGczK2l6MXN4YzNtWWdPOGJuMURJenFLUzFkZmVqVmNlWkdqQlpmWmdmeDBNS0ZTOFo0Z2hVYXYwc0hyS21KN1JOOE5MK09CR1h3d2VDQ2V4U2xKcUo0VzZBcnY1eHhqY3JpQ2FrR2tZUWdkeXpVK3VobXlmOWZTUGR1Zjd3UktEOUxHT1J1VGZZazZBUTErRitzMk14aUkxV29DOCtsRDB5Rm5hbXVzVlprM1lqb0lEN2plYmRIYTZmOG1GcXhva0hibS96TWYxSWhFTmFqZzc1MEN2eDRCQnlNR05JQzFURHV5VVVLdisxbFBEY3dCZWhmdU1YUDBmNVlnY0xhbjZKdXFJeTBabFpTWTlGMzJ2MnRJaWo1YnVjSjNKN2dKOTVFTFZDKzhrbmt4UnVuQkVIZTBaeENEY25yellMOFhsdzI3L3o2VkpWNWp2TUZIVHk0S3NvWTFnQ3BXM0IvL2FWY3BJelhsNTYzNVV2VGhVRHhEWFZteWQ1SG9NcHZDM3pZL3RWWVRoYk9IZWI1a0lhM2RkaDcwWUkxRWUvVW11Sy9JclBTc2RSVnFJK3pnZmpRemJCU1ZtZmpxTDVrOUpyL2ovMDBCRXB2VE9QOXN0Q0xtRFgvT3FZbkx4ZHd2QWtYYnYwSUFYdVF4d0NvSjZqQnN3eVAwS2ZycFVTT1BVSnNzYkFiSW50R2xwUEd2TXdTRWpWeGFmSUZVa21wSnp6QTFwbGN5aXBMTGF0TWdHNzYxaUJtaGJ0Y3czWXFidWRnY1RzcnR2NndPcjV2MEZ2TDdNTFBvbXNGaVhlbytrYTF2cDltcUJROW5MWEN1MXNScUVhdzJCZUxUL2hwVjNTUm0xVnZCUTQwV1JPU3dXY2xlS1dpSy9jOFBabngxbkw3T05ObE1TWlo1cGl1MXRJa2NFbGh5Q0xKRy94WTgzNzFFQ3dqRzBmQTAwT2dkMzJrRmpUTnZVQ3BKcjR2TUZyVW5mM3pIRG5SWE1wMm5nTU52Tk9MUTN3TVpDSEJ6clcvYWdnc0xTc0s0VlZlOWpoTWJoRDFpQVFBYnI1ZTBDTUU1Q1dJcS9Gb25HWlpLem9uaVZRYUZGRDVKeVhFblRDMXpNczBBZCtJdmJRSFNyYURseWUxMzFpTitnU0lKemxFZU84UEgzR3F6VzVBcTJTYVkybEZ4RlhnUnpwcUt6S09OYTVYOGZPSTRxSmVCWnB5QXlvZVJLWXphTktRUjc1aHBTYXJnRXozb0U0WWJNcWV2YUxnV0hMVmtNRlhVSXE4S3R5bkcrZVpsYkRBcnpPekkvdzlENjVIZDN3TmpmUUJhbEY2NmtRRDEvZndJWDBmVFd5cWhFSnhPR0hmb1BXSWdTdDVzZDJMRW1aWnIrcDVndlptM1NOdTR3VmpCUHl0OWp3MnFpcW9wRE85SXk1SHFRMUU1ZHJvOG9jSG9XTjV6c0FVcDA5MldVZXRHZ3h6OHhHTFhOanZWSUtwSEs0eCt0TTZyczVrMm96U05oTXJhL3hBdjlhZ1FaWjRtN1RjMzBMbXFrcFZZNW1kOG1idFJ6dDFTazdpNjF3WVdnYnoxSHJyNGZPcTh1QSsvR2JPQU9xZEJ1dGRUS1hQczFDTHgxc3lEd09wL25FY3EweUdkMjVUMnpJRzZTbXAwdCsvcHJJVForbzhpUXVsWVdya0tGeTg2TzBkUUtWNFBadG56RjlIUDRXZ1M1dkZqWDJBcWhLSS9hOUhlQVE5NGRiT0F5Q09YT0JQWDhkS0RJL0NzcTJlMVJLZkJTUkViWFcxZHBUd0s2dE9KaWxjOW1Xd1BZQ054V2Z4K0RYeXNjcE9MTmxFWEowNUhMcmJJUmtQWVJXVVBUR205R0V5ZlV0SkxWdTRZNVFYNDFreUxGU2s3bzl2ZFNIWmpWMEdMMS85ZC8weWFSd1NwTGlBb2tRVnRXY1ZMcTZPbXdvZlgwOGp0WCtlZUhZbU1OWkwxU29vUFE2NkNDckNUb3pvTExSdkJJQWxENWhRR2pibWVwdEZiNmY4T3ErOXFXQ0NodHViR05QRmpNRmJmcEVGUlpQd3dFNkYyZG5LeXhCSERSZE4vVUtYMmNOOFY4R3BVWEJxYnIyQ1ZQdndZRDE4NXllTnhSQ2UzcDgxOExieE9icTkyaC9FTVFHWW0zT0pmUFQvYTdqWkk5SkpkYWhpOXJoTDB3WmR4dEtLQ0drdHMvY1VPaGZ5MyttbHdpRTd3TzBhaTV5ZlJGOEtNbXZLOGU4cGxncGw0V1k1V29QQzFVbE9pZ3BkR1VmUTJyRHIzK0l4OUtUaFc1c0l6cW9FcGhtREk1TUYvZWZpcEpRRVRpbzBLcFdjSkt6L0wyeG42WEtFcFJqODhkaksrUCtmZG1hWXQ0Y3MwWXpLSXJleW1mRStLVEdzcVV4TnJDaTB0Tlp1VWdUbEQ4S0tYMys3YjJUMFBveHRsK1VoVkUvMlVucEl4RWRzRHVsWjhDakhDU2JMSEZrcVFiVERJOEFWKzExQjVYNFJyZUE3dUFNWHFLYlBUbVAybGR4OUV6OUt2S0k0bkJzbnVUbWpkZWlLRUYyWUk4eU0rZFp5bTNkaW8xb25kNS82bjBJUFBuZmhST2VNSWZwVk5CQ1IrTkRjK24yemJnSzRncUVWMUVPZjBOM2FLNVYrb1E5NVB3dzU4bk8vVTJKNTFjU0NZbzFoU3ZYWWxtdzd6djdnWUZhMGplTTRsT2llOHBKdFk4WGNzSEJYUmkyRVJ3REpuRTdMZHhFYTVMOWIwcnZaRUloOXZYbVV2MXRuV2tTNVpwbmFFTzFDZmtlNnIvRzNLY1laSEFHcnJOaWVWcGJPVlVHZGpjd3duR2t3SHhFR2xHYmJHRFliVnJmSGQ2cmNEWDVpRU5rNnlZNVhOYTVSd0UyUU1GQTlXWDBNSFNkdHY1NW9MYldtdHQzUjFrbndrVTBIUytuUFBNeURnY2NwRFl3ZTVlVWpQcFdqTXN1Q3pmcEdNdSt5bzV3RGY4TjgvMnNmMWV2My9WZTMxK3JwYnZuK3NSK3IyRnA4bjFjYjUvUVRuNU5zWHcrL212azdUZm4zUnd6NVB0ZjN6L1pBLzFlMlRmTjZqSjhuMXN2MWV6RFBrK3RYZlA2WE0vSnVEOG5wOTE4bmZMOC9TRGdiNVBxVi9uK21IL24rcmwrZnUvZko5R3o4LzAzTDVQbzkzeWRyTmZCMGQrVHVCdnlkYi94TmxBSXhTZ2ZMVVRpYm1wMmZyOVVIQVBtT3J2WFlCZEE4WU5DWmpVYWFEdjcvU28xalJxdHJBbUJqK1hzQjJuRFNnRFdieWxwQm9vMW9qTURNQmdvM2o1UVFoaERyMnBweldQTHdlUTVIRnd0WVl3UHFpSHh3ejFxQ2JBMXB1OEMxMHAyeHFTOVZoalBxY0NPSmRObUoxTnNGL1JoODd1MFhTc1BjbkRVRGc1OFR6OE9nR29CMDJQdDJTTndpL2hhcG11UFB1bnQrVml0alpBeHlVOHJPNVdDYWxTb1VibXNiRERjN2VzSlhoMkVDeTF0VmRGYjVEZWdHRitEc2RZalNIWGhPeWdFbkdzYTNlaERocm41VWhmSmkva2svKysrZ2l6cnZWVDJiQVlpeC9CNzhZSnV0bXJCK050MTBrQTV2VDR4TmNnQWVWNytaTEZVUUhkbWQvZS8zYUM3QVA2NEFjb1hreHpHWGdPUHpEYkM1d3oycHdoZDRhZGs3UUx4R2hNQ1A3dzAyK2I3ZElGM2pOZzcxeU80dWZnYkFtZFNRWGl6bS8xbEcxa3FjNi9NSlhvRFYyem1XVGxSNE1TWHh1YW83TVlwY0xCVkxGeW42ZVgzTWR0ZThnT29Sc0Y3QzA4UHZ4YVJxVE5mamhyZlZOaXYwemlqL0RGOWZIN0lnTDFLL0tZUnlXSzlBOGIwdXZ1R0FDdjNWWmFwUWtlTTJ4WFdOakZmaEtDdkZ3SEg3ajA1RTdUaFE2Z3J6UEhrSWRaR09LVUlMeXdnU094Q1hpRFBBRStHcmVvQlhodWJPT1F5ZjJ1ZlcwRUovb2RvY3BablZRZFNTTUhJOGZLTkpmQXI1WS9Ka281R0NYZ0E2OUxVVTZaMUFuL3NBS0JLZDZYSGE2ZTRCTm02NGFYazNEaS80U3hkNVR4TnBEeWswTGovU0VpeXA2MjB3MGZqTmZYdVhuU0d0bUgycDMyVWRzV0VUclR0bkJ4SnNYSTFLWXdaWmNubWRMRERKVERWZWdXY0psaHkydHAyblNnUFdnVmt3R0hQVTFJK29YR0orNGlEbHk2NWNYQkZUTHE0K3dCK3FSdXRSd0J0YnJEZkZVSkdsY3pySWY4RDU3YWtBMFRxempKNHNFWGFsRks2RnhUTVdHVkRsSHczVDNyanVEdHZzbTFRWGY1aWZsWitwL1YyOCt4N3dZVDVBT1BtTE1SU1ZiT296ZmdES2pzMXFHNWo3TkM5UUo5U0Z6UXhKTlFpcGVtMHVNWHdKVmFvR2Jrd05QT1RldmZlSTk0SEtaOTBJa096UnZEanZCd0ZXcDZIaW1wWkczbWh4NzRlS05nSW1ETWtnYlVOcFgvbHFGbGlYcys5K29VdDQzM3hsUGd1dFVRbjJrWXNUeXVvOXgvQmNBbGtpOGtPV0lOclpzMjIwTXVwS0xWUTRVdytGdjJjM3RWa0Z6QXhpSlhXL3ZXbDd5VFhqQXVDK3o5dFhSdUk1dEgwZk1LVThiVmVXU1h1ck5TQjcwVGt5NHI3bW1VYUxtVTJvQjRpQnlmOGs4ZmpHcW5oMXkvM2F0RDYzd0F3Y3hxZkVEUjZLS1U2Y0Y5N0wzWDdUSnBRbnRrSXNaZEVPeWl0SXZYK2F6MEcxcGVOUldQOVR3N0tZZXlPL1dldTh3SExoWEhjeHNiajk2SlFManp0K3VpVFB0K3pvQy9zbmZGaEQ0NGJzR3ZaQjFhS2pMQklxb0c1QzZpaDVzS1NtQW1uOCtvOHBrNzJsMndsdW5mZ0VXSlpaeW10aWxjYlJZejVRUkZkN2VYRjAybkdDeFYwWEpOVG1lUU1zZERnKzMvSG5XL2NGYW0wTVhqa3NUTTFpczhoYXZUT0VQbldwZ1IvdTZVTU1pZ0ZzS0pwM1hPSW1kOXBzZFBxQjloS3Q1d2UwaStMWlBhakFpUGh1cVB1UE9kNlExV1Q0c3ZqWEhqcGxYTlNxcEVVMHdsblpZVHJ5cDdzUURGbnV4dHl6eG5kNGFXbi8vQVkxcHRKZndtc2YvSWhGRkZXQVM1dUoyZlNRdmhvcGQwM2VvVVZxSjB5aUdaWlU3TWdHTndnWGtDYStMTmtFeUJxUkZSZ1JRS1phWElhYnNUOGw0dlUyM1I1dlkwbkJVeC84Tkw1ZzdLZjlhMGVNem85aWZXNjNPc1R1N2hTR0FLekNaaE9odDhNeWVFMzQxc1U4bUF6Sm54WDgxLzNuWEw0N1dxeXNJZXZQeEtuWm00Wi9JSm5hZEVaUkt3MkxSSXErT1dicDVIYnJFeHdhbmpuMTBjRFZVUnVtc3BURVhvcHQxREdsVDgvTFFuVXFDcitvMkFNNTNmb2lyRTNjUjRIa2lSa0JTQVFzUzQ5QklyaVZTdkpiK1JHcEc5K1MvdW5FWnVDVHRUZnBrdEFkRmhnemlic1FQdDhSZjExVDlmOUZWcVM0NlFFc3V6NjY4WVNvYmtqOXI0YkNXMmw1Qjc0alUwS1lQaEIxelJtSCtobU5GR1V6elVLNjRpSzgwdUZjeldWemxmWkU5d2s3Q2x3dFE0d3NjSkVKUVQwSklIbHNnMHVDN2VhdGE1RWp4WEt1cWNISHhZQjJ1OWRvWk9VOVY3ZVBXT3lWMWg0VllyUUg0RU4rQXdxa1JTSWxNRDV6bzZOVmIwa0QyZTg4RzR5aGM4Rklzb2RiOHNsWnlaOFVGekpwY2NmQ1FDaHFYbFJGb1pEWHBHZXBRSXdqQXFVWkZuc1h3WWp4NTB5M0V4Q2kvUERhK1g1a2Q3ODkyUG43YWVmbUtzbThwdkRaN1lPTjdHbjVTc0MrMnlHcDB5dlFZKzZpSkl4QTBJZ2tqZElqVi9wdmpmQXQvRCtncjQ0d1RKQmp6ZUQ1WDBiM2taZGZTSnFGTHlVRnhKRSs2WTVla01qWVVvczdnN2czMitPN1FoejNwUm8vMlRWTnhIVnVwSFBObkVmRGNNRFN2dmRpcVBHZS9SbnFHM2RyYnZ3YmRkY2ZXRE1Oc3NNUllod08yY2hiZVIzSVF5SFMxWStEcXh1UVc3c3NBdldUUmdEOTlUSEVDdkd0RVVPWUYyNmU4MHNhcW4zT0oxNEt6eDhjc0RGTkNlNU1xOFFQV1E0K1pQSDYxZkM1ZDZxdmg1QWNPQWJrMTlQUnJiaW9qbVlodW04aG40VHRBTEVzdk9NSWJsMHhYeitpMVNvSmF4QzA5anVRR0xFNjY4ZTlidGorb2hub0wvMWlaaDBYN3orU1RacGZFbFhjWnY0aldDd1V1SzJGakVTMkhPUDhIZkdqaGpycUVNeWwxaDUvRk5CQk1HNmYxZFhjN2Y2Y2tHQ0ZINVA5ZWRCTnFnd2MrWGpzVXVKWlFqc1Y0cFQwcVhYVm1HSFl0OEgreG5qQVU2WDIxSEVPeTBNUFJCVms5bmJOMW5OMFJzZHFqM2ZiWmczN1BCclFpQzA3MUxjd245QzI2TVdxOElVWjQxV2UxVG9JdDd3YkZlTDJIMVNNRk5OdHJmcnNuaWQybVd3bWUxQTNOUzBtMHRrajl6ckVtaWhGZlhEWEpNQnVYV01XQ2ZlK0U2cVVDVGlieEZIMTB5N3VSNWs3QW9FSnhlTzl2eS85UFpTS0M3QWdUc3JNKzQzMktwWFBiOFkwcndqR1FXaUVUUEFCbXU3YXV5aEZDd0dkRWpEcmNiOW5ReHRzaTI3MlJlRTN4SzZsMitxRFhDcWNzeDV3a2h1V1FEMU9HTkg4cmNwY1hpbEkyUzREVE5CMEc4dFg3T3RRR3ZMQXZsd3BXcmsvSHAzY05JUWYvWE5TS3NpWSsvd1E1MDludGRNRnNXVjcyTWdIMUlHUC9Wa0txeXZjejdhcVFXRUYwV0FQTlVqSHJGam56ZndRaXVEZWlkSTlIeTRKbWYwSHZ5MG5INGJQMjRqblRERTlKbWMzYmp0NGFuNkRTWWtXZ29ZVDZuV2tKQVV3eXQxT0tkQWtra09XTmZhZGh6VStZNWU3dCt1K0huQXRGMVdINS9CdGVDL2VKREtLYytYWmNSQVhlcGUrQlcwVkpPMjNrQ3lmZGYxM2lRNWRkR21jSk9hcXUzSGhLcXF4cjdHcGNOMmZGeE1hTjljMG9aQVg3ZXdpWi96SkRMOWtBWXppUDNtazV5d3dPWjQyZ3hJMlBMRUVxUE5aVFBheGI2MU83QkkrYlA3WlREeDdZZzliOHFDc0RkdEhoR2k4bDNkL3AyTVZuQmpTUkg5a0IvZDRCY0dNYldJbVhSSGc5WG1DNHNKQ2pjMllBMGpXTG4rNGJnbndHc1JOVnZDaXd4WWk1UUR1MnIrSmQweDZEd0NiU1J1S3Jyc2k1N0pSYi95M2J6ZFdteDJ6Zzk0L05kQVI2enZuaGFqNVk5Wit6clVFNDRENW1SMnJoV05xKzkyYUZVR1FReXR5NmZvN3NKNWJTNGZkdUljUEtaM2hsb0pqeHhFamk2M0JpZmV2bHpJaERpaUJ1U3c4aWwxRkNRYkhlRWJiODRMbGdEWTdnNUxqNlFXOUp2eGVETWNoNy9XZWN3NFovVndkNzc2cExiVm55Y253NUVtQTY0MDN5K2NHeHdsazVVUGRmZk80VTdGcXkrU1puOWd4MDVCR3BYdDR1K0tmMXdka2U2eWhLcENDaVZVS3cydzYwcTFkWDhRa3NvWnAxNW9SY0NFSVRTMjhDU20xMGQzZHB5YmRFalR6MWdnK2tlUTA0VXBoenZneWUvQ05JbDQ3UlZyMUh3WExnSzh2bW1QUXBwTHIrSFBUUnVXU1M0UmdDSERQcFk0WXZUQW91S1FmbkZJVHBCRyt5Ni92YWU3SGhFOTIzMlUxZysyNGNnNG5BbitTOVlJWXY2elVDOElZZzlleXR1WENEa3loRFJYWC9hV1Fac0UvMmlGVEJvUjdid0NHNnBzRkRjMENoKzUwVFk1dkpjVitvZ1dKVmZKdzk5bzRUWFh1dHM5TEpSZkVuNDFING5YL09jN2JiTG9TT2p6WFVDZHlSSmt1M0F5UWRpblNjMEwrdzFmUCtWcW8rVzQ3RncvV052REFPUjZ0Y3ZEZzh3R0ZEUlJqRitBcjVNWGJydjcvN0VxQmppMUYvb3FPaTlycFlmcXZ0eEJ5NlFhdnNoalhVb0hzRTc1Qk9mei92VERnTThXeUVCRkZEZUtWZ0lKVXBEdnd3dXRFeFpXSkVsTmZ5N2Fsbmw0a05mMTJmVkZucDRFRmdkdnZYUFpMZzdxbVRxdlF5Qi9McnAwMWtRNWlUSWY4QlVaWk1WK3hsRkU1VzVnQmduOGhubDJ0SVpnVjhhYTE0SmpyOEFhRDV5VGRMRXdhdll1NG0zNTViOExsVXprQ1c2QU52U2prMTJpb0pUUnk3S3dtd0Jod3FCM0VPQllXUWVsS1cwdFN5dy9udFU2aHFXNzZMcXR3YTNRbjc2eGU3VEptOTVIbDlXTEJUTU9yOFhuWmVNWmpoWG14eEg1OE14dWF4MDNJZGd5bWtlRFg5bnVORHk0RG9DejlnbEZETnIrYVZ4R2NaNTROd3NaYlpnblhibzd4S0kzaEZoVmtzaWNNck1wTHdPZm1DMDJVT1JNV1paaXJaYkxVUUVNMVl2cVZyMVg3SFBtdy9xdHBPdnE1c3E1NkRTRStKakdQZTR5S2JmOWtSREJXZ011R0k5WEl2ZGV0cTEwS2lrOGJyb0JzRlkvdkFuTTZORGE0NFpCM3didUxncENCRjNMejlRSGFYWVYvUXQ2Y0VqUHcwRDZ6N05yRzV6ak0zbXkrbWFWVjJWaTdCbk1lNEFkQTkvckZZUnJyakRzMURpM3hkYm5QaFJCbnM0MVczSjVlbjZaNHY1S2JVT1BiL1JmS05iVHBqQURSRk1sWjEwczZSbWxMTE5lN09KbTc1QVoxb1djSGQxcjNoSVRtYU90cHJqYkFsVWtkb1B0eVFrVUc2TVpZT0ozZ3EyYkZWTXdYQzNhN3ZxeHNrQWhuS0RERzBDZVp6MGJrbCttR3RMeFdRQW9lNmgybUp4TmduSk12M2s3UzRvYUMzOG5Ga0ZTUGZNQTdKNGcrc0NnUzJkaXFRSWNPNUFVYlE3T1hsc0N5MTRXbFBKZmV1N2JJZ01vZElia2R4UmdEM3o2bngycUo5UjJpWWtTTU0xM0VRbkN0b2dZUVcwWW5CL0t4NnhrVzBxUEIxTWducWl2dDlrTzgyM0FEUUlhTXlSVzNha3didkNNMkNjZUNFQXVCV0RPdWVCalY4aExSS09PbjdwcGM3Z1BPMDhZcmVTYVIrRGg3RFY4ZXFodThsZm8zVWs5SW1FUUw1bmtxWFJjcTBUZXZzR0pFNms5RmxDaDRoVjgzTlJiWjE1dEFsL0hVSTlKdG1tQnVLMDlnSXk0cUZBczlDdUNNTFJsZC8zcjBnTitrMWlkRFpHMy9uSzd3VHpvRSszbnY5WEpnb1pWU1J5WW0rbi9zNE9ESTRScEdZcVRPOFBGNEE5YXdUOXExOFE3dXFKSjg2cncwNXZqaXQ1Mk5TNHJnZmxIREI2Nm1mdnlzVlFaUktoYTdHNStRbDdMSUZta3FxUEJwVUZPWGg3NkxHNDNJUER2UzhJRC8yVjFjRFZBQ2VJRWlaWmIvQkRJcTg0Q1c3MjVreTcrY21yL2xkUStwbk5BdTk3ZHdtdHFxaHdOYkh3SDhQZEhTMnZmQ3ZhbzhmT1ZLWUtqQk42SjhmMFRIb0dvTUdlakRYQ2hPS2N2ZHVMWFBmWk9VT1VnRFM5MURRUXNaVlhCTDlDdHFJZC85bStrRnVtVEMvMndSUUdXTGNpdU53eWUxZmlZQm5vN0doa1ozdW9hak1qTkJUVVVpRVNKb1lhSmJjSk13RHNXaURwZTdlT3gybTdBaW5TY3N1Y2hEa3ZCSnQzOCtMdkdYRWJnNVRzQ3F0RFVaTTk4RFlJTEUvZXgxSFRxMGFpeCtFUzkwUDI0VEpCaXE3ekl4QnJXYmtoWFNoSWd5d3VPdCs4NWdEZXl3Mk1CblkyUXJhWDV6cmY5OXUxSzB5bnh4djJsbnp4L3Y4NGh0UTZ6TkhHc2UvWUtDTE1XVTQzcUJMRGZmU3NYSm84bU05Nm9QUWp5SVlQckpkYW9VZVJDNFIyMS9GTmQ1UWdMajZieE01UWZOcFlyY1BiUmpNUDdJMW9BNW9nUWxCMktJVGdISm9OcU9pbzVCTldxVjRxMUhTMy9nczJRYzBYeXdJZWZQcVFyRlE2ODY5bkJTQm5yRkJlbWt1bTN4RFUzczdRWG9URTQzUHJ2MGhJSE5LM2FiQUhKZnAza3VlZ1JoRFAwcXVROHZmdEcyT0V3OXV0RFlDODUyUGQvQ3k0T0RRVWg4SXBwbWcwdS9URXd0V2FWQys3NEVMU09jS0ZHQXJqNWJNQ01ETFNQanBYVk5YVmZXWVNjYzNEY2xLeGhFM1hubzhRMnVjRzNzY1ppcUNxbDFGWjBnTGVFWm41azRKY0NwWVZVQkRrcnY3WmJjbzQ0VGlSZE9kR3NQOVFZU1ZOcVEzMVB0aDhPTnBzb05aNmxoOXVqcXV2ZlJYbmxDb1hQU2VXWFhPUHUvNnFxQmd6cXJoc0VRcGk0cDl4QVNHT21NVFVsQ2xYZHN0ZlVxcVhSdDRlc2xBcWxtSW1vc0I3NEQxVzlQaHpDamwrckszVFpKbXZQTzZlUERPMVh1Ujk5V3FvRWdEOHFJYkFkamdTZ0c4cEM4WG9uWm1XZlZvSjdaZEhGUlBKdk9Bd0hwS0t4Znc0Tmdjd3hxMmY2VHZ5bHJXN2pTVGxab29JT3M4eXF3UjhUSVdPNGVlYTZMck53a1FMdmkweFRMRFpHa242cmw2Ry9FNjdwR0JwSEkzODgrQ3BKdmZxSWFOZm9sWW9SVTJFczZYYnlhVTNxUzltOFdmd2QvUjRneDR3M3prc2xySngrY1M0ZkJ3emt1MzZkUXpJUG1JOW8vYWJmYWpTSmlodzdvc2s5QmdhTEl2SVpyV3daSjIwZlhsajA5U2lDWFdqTnlYM2J0Z2FYMzlCbG1HRGVZMWtLMWNoQ1BObVNITjhxekh6b1V2YTZyc280cHQyT3czMjU3VFNxZzI5MVJVSDNFMGsxL0x4VkJESnhrUklCVEk2QUlwVzlGeUZaOHp5bVBZajNZZ1loRkdReExWRTR5SHZpMmlLbkNXODVWMGduYmpDMytGRDF5REJKeHFQZVhKVHpPa0ZyMk1XL0xaT2luN255d01yQUhmaVpGbGVjNld4QytHRjV4dzVLWUJ5R2cxWWsrN1VENVhUWnZkZ1cwZ3R2UmR5OXBZTEE3ZytURjVmbW5raXVRV0dVMFoySUdCaGt2cjc2OWo4L3dxSXFjbnJ6UC9LdG5MT3NnZHRJRlgrQWlJN0VKR284dmlPSkZSRnR3QjIxQldNYmFINzRtVDhsS0NlSnBWTno3RktLZXFzcTR0eWFJODRoRlczSUkxQjlWZVJwSWtjaDNUQUFvWURrdlNXSTI0NGNoUFRMNlh2RytaZG1BYzQ5ZDYvbldrdGJ6L1FYVFhESGJPeFhZSDJIMENrbnU5SG1VVU1Xd0pOUWhIbERKbkZTbnBvTDhYNC81ZmZlWTBwT0FIbXBaSmlWTGU0WUFEQ0RyMHVNeUhGaWZnbzd2K3ZYeU93Rk9rM1Azbmt4MzJ3ZEZvNU9kSFIzekNZazMyeDdNU1JRZ2VMOVNaMk5FS3NsM0tMNlhpc0NCaGNXV0NJbDhCdUkxYWdhZUVmRjk0MTJxRVByc3M0bmJhYjMxM3NtMSt4RG5MbGdkbEdROEwrY05Sb2QyUHNxbTNJRnNzQWE0c2h3V0h3TTFUQ1ZkUkgwNmFNSjNaR2tEMHdzUnBpWjA0SWVpeGxGZkhZRDg1cjJCUXFHMUg3QllNeVdET0oyaWYzYmxXZjhGb0NRNTdycURZU0RKalBhZVdCL2FkdHYyMG9OWEsyNkc3YWJFY0xHWWM3c0JOc05DMEt6R2JzTVBzNmJyckFkd0ZRVzM3VFM4UzZrb1FFNjd4TGcra3dHRUkzVVZDOW9TakpFZHdxY21reWVhdjFRVHJKa1lkN0Zudjc5T0Z4M0xwUUVlQWF2VWZaaEIxVm45OXdxL2J0TjFhVlhCaDhMS0pNYXd1K0lDSkszRDNXV0dDQmttVVRURzJzSzJVT3NyN1psOUxoNk1VSWxrWjdQczA5TExNWFJZZk1VdFRiUWVjU3pFT0JTTGsxVHQ2cnhlSEVuRzlwQWgrNzZRVDZxV2piZjI2VnRtWjM1eHRtd2p0TWZUZm9qRHIyNXFKdmFHL3RZRHpqWEhsZUlPWE9uUEllN1E0aGp3UDRtVkhadDdmOUg2WDVXZHBmVUxSZkxzWk1IT2ZTL0kwTGxRVjlIUXIyR2NuVFZBRG14WmhwZ1NyOXcvbVV6dldjQ241dGxzV2dJNVNXQWNkL1hjUE1nR1Rwd24rMk45MWhwS25UY1dMZG9MSzdwMlVMdGhOZTFCYS9WR2NJZjJmbWxLaFN2cytGR3pjWHRYaFlmT0dJK3RBMlBZTkFRcEFVZkhHZ0x3cE05UGthZTBaN0tDVmhuZUZLV3o3KzVzcGJBSVpZZFJuZ0R2SEZJT3FPZXNzRXVBQTNlN290b1BpaG82N2l1Q2srYVc1MUtJMlVka0o2TGxoRVpKME01cWdJWHcxWXM3VnA4NkdsZEptaGlNMjBWc2w4c2dTdGZNZENsMXhnMXlrRUdFRXFEMktnSnBhOHBKU3BQc1gza2U4bUxCRXdoZ1JPOHVUejQzUTdGdkV5UGJSV0ErTWlEbFNDbjhqcW1nUE5ZR29iU1FOVWs1bmRIOUdrdTJwVW1hbndvR1VkT1NyaG5YMlo0dSt6dnJzTzhEYkczYThuOElGNEkzRkUyWDAzU0c0MTV3clFmelhDTXQ5TWJNZlJNSEJnSzd3UWpUeit6QjVZM3dXV2xISnJsTk14RERZQnpXSTdEcS9WM1hBM1puMVFhRnM2Vk4vWTgrYytOYzFkTENQaXA3MnIrU2xoQjQ4OUVJRWoxVG9TYWhKSGJ4NmVPb25aRXUwY3JZcnpWUXhSK1U0NDE5ZXFmMXJmcmNxT3pNdjJ3SW1EWmo1anFQR0Y4TU8xTWp5SkxaZmhYOWk2Ni9LRkdwbU1SbUFkSWJtMERwSTNOVVNod2Y2endNNnNRVkFQRkh6K0pwMmJtSi95Z3c4Z2pXOG9UdXNxUWM1VzVTTHFFeG04UWxNQTI3cncrMzlFYjg0N0RGUE5hMzd0enJzRHNJWHB1R3RxQUFmaGo0OFBUZCtwVVlkQmw1a3hYekpwdzc2YXdwT2EwL2d6b2lpNENZN1FPZjdzZ2o5dU1qN3FLMmxHa1RYMWIyWjlaNXhoanVlaFlldVVzVkJ6eHdVSlloUHBsZmFSUDlkOEE3M1BEOXEwSW13MGY5c3h6OU5yYlFIbnlWdjc1SGRhRklIdytHeGdidWdHOUp2V1FWN3g0ckx2aEczVjdiaGQrSWJZcVJuTDFDWEdIdGY5d0N6RWRYUlZIZStuZGIwWTh4Q2xzOWxNU1F3elpscFVkWEZ5L3ZGQVY3ZllHMnc2NStBbll5WHpiWnNzUnFiNzRlT2xxYWFHaVhzY285c1g3aWFqU1pDZFg3OXBmQnc4QUhsL1RkN0ZJbXUwSGx3MytqNWhkVXppTk5lOFQ0cFRWemEwdW5RMEZsdXRGa3owTlU4elFwZFNBSkNHVERHbmlnbndOQTI5TElXcTdiL0lpZ292U0M4Qk8wcWxjUWoyNVNQaGwrbGpFc3NsZ3VGbkkxM3c4VkdwMW1aRTZPZ1hJRmxva01nMzJ0N0o4Y0pjUXpCSE1UaXRkWE9UY3d5WE81SVF6d05nb0FMbXNWUU02NGhQTzd3b1A0NG01QzJMdEFUNU1sOUpWZkF0UThBVmFKd203VkppbHVEbmhkZGFtbU1vaXlyR1k0YkI2NElENUpRejVNYXp6Nm5nejFibVc0TCtPYzlWdjE5N2VqQnNFY3FmRHg4MzVOZEk2QmpkbU1KK1V3NURKWjgxK1RoQUQ3TnlnSGxMVTVXRTJ6bnhPcGU3bVRaYVl5UWlnL3ZRNjNmTituelV5MldzQkNjUTUrMWp1dDhoSnVjc0Y2a1ZrQkZrSjVqWi8weS9mWTZwWkJUYmQzNjZzaXRaSHZkcHV0KzBsSzBROE5SYWtzd041Zmd1ZkQ5Sk41QldUUmFQSkNDVWpjeU84RnZOTG10UDAyWGhWM3FhVVd2V28xajF2cXBaQm1tSFkyQk1FSFIwU2F3Z2luMzJlcEJpbVppeW41aXpseTJBUUxTczFUbFYvUnhUbmlmT3hyVUtGcVpFRjVXWXZHcjFGWFlCb1VwNmV1aElaazkyVnhNU3JvQlMrZ253Zng5aGpIV3RJcUlXSTNLbkxWRUY1WXQ3SjhmblhxOXlOd0ZqdE0rN3NFcjg1K3lYTjhyWXBpSHp4YVZrNDVHUWxrKytzZkhYZktzRk9BUXplZ2hUQjZFM0R5dHZVQ3NxS0xZTGtweWRueEpqVitIUFhPQXRzWmFTRjVCRWtxcFNSbmxxZDRjanJuaGI3QWRLa1crYXpScGcwcVM5eHgxdU9BL0Z3bVE2ZjF1UFNHWXR2eWw5Q0ViSUdweHp4YVV2ZDY5MDdmT0Frek1QeTc5cmFwMkEwNWFobkMxU2FvT2FKWGY2Tm9hallsVyt6NFZQWmpwVXJKMEYycDlNV24zTVNpSS9VUW5GMjBJNjh0RXFoY2RqUDJldXZIVjVKWXNsdmRIUVprSEZEalpaVzY2aTFoUHQxL0RabjkrR1lHMStEcXM0OWFRSEZIZ2MzUW5mWjA0d3FMOTJGMWwwSkp6bFVtaGxtN3NvL1pTMkQzSmJYQ2t1TXVSeEZTSUxPNjlRRWJJdEUwUHN2MnFkeXVqOGNWaWplRmFJU2l1KzA1em10TDIwckhVL0xvNm5ZeWhoaWJhMjlqeEZ2dVlxZ2xzMkV2VzlBQkFWcUlYNTBqZGVGcDJUY0plakEzOVMrNloyQy9FNlQyaXN4cTNmNG1NUFV0c0ltNDJZblA4YlFKMlFSM1loWE9vSjJNMk4weUp0Z3pYcnc4SzBBNmxHV2RmUDdyeFF3SCtBSVBzUHdIakZQUld5eGY2ZnZCczV2djFoVmZmcmVNb2tqSUhmZFhGL0RMMUpwc29BNGdPcjN2T25uWS84a0prc2ZlRm5nTmFMYXY2aHpaT3F5WENMMU1tYWRIa0lEdU9LcHlPU3paZGRmRVZTajNHY2JjaENuVWxkek8zTWpKZ1VlVXNzc3ZlSzc5M1RyU2dLYTd2VmFFMmdDTTgxRlVUZDlYb2R1VVY1WEFiS1FOVkZLTmtJbzlNUDdaRGZldnZZdUV1RnhUTE1BaTdoN21zVmdjRFJVWld0NWdJYVZpWHNUNkpnL1IvMUM0ZG82UlI5eDJFMmlFeFBsaWxhK0hyQVFCK1FwZHNHVEZUeURjWE55TTFxU2l6TWltWmFJTUd2OGwwSVIyK21RQW5uZnlkWFdlRktLNEZpcmdtVjVJQU9sT1cxcXoyR3ZQSjFISFkxL2lpWnRMeFUzQ1lwem9VLzExTzAwL1prOTRCOE1vV1Rmd0VWakFXUkE2cVdQOHByYkQ0K3dFa3pvVXJTRWZ5K1A4L0tnYWU3L09LL3VmOVJVZVFjeFY5NklMdXIrTVRxVS9vbTJLNCtKcVJPeWtDdXZvTytWeTZGdDNYelJlVXdGamtJR0pwSXRJYmJTYWpjK3dVZm8rSVBjWnhzQUQzLzBFemlNK2IrWWxndEM4eEdIU1NLQ0hRUUVyQTUzVEdKQjl3clZWUE1RbnczVGhYN2JBNEp6UGV3NUJvMGJ4SHQwK3RUV2c1QkpjeFFJUTJhQTJWSW1ldUFJZWxTSFlTQ0ZqM05VY2hCd1gvTkJPYy9YY2wvdzhEQnR0QWQrTzVNY0ZRN1VCTGFmcVFXYzNQekhjNWNkZW5vN3NUQWFiKy91VlRmb25jUEVwYlRlR3lPWkdpN2lIbGwwUStXKzBoY0t2ZHVzQWwwdzMxeDhDVnJEZzQ1bVlzRzJFVUhuL1k1TWl0WW5hWWFPQkFhSlZPUEwxQ0JCNHFpMWpkeklrV0g5RFVoSkJ4L0ZyeFNwSWM5UXdBSmZCT0hYamhOd0FWKzlYbzJiMjJmZXhkeUpsa0duMS8xZ1lwR0oyZWhuRkxZMzREMk16dFNNSzJycVZ2dU1UOWV2N1JvOTZvcUZneWEyUHQrVTZ2M3NJbm5QSVM4dFBmUmE5N2NLZGtUUWl5Y0RIMkRBVUVnMzRROERZRzlrREJwWTVibGhyZEN3TGF2SmV4TDlsczJtcWdOZVJYTkQ4cURlWGt1NFpVemhOS1BCMHZ6SnhzNEhYRmdaalArRW1HL2NGUm5teDZFODExRStzdWpkQ09JcUxBNGJ3QnR5bk1lU09uRWRncElMQTVCT0ZLMjBoZEdWK2JyZkNhY1BwTXB5VkZyV0xZNlpGeGM4ckhvcEhPRVlBQ3hNY0xzeDFMTmVCU2RzTzUwVmlYMjNyZ2NlWUwyajhJN1Fna2NobmxKOTNTZ1dhNS9VbzhWTjBvSTlSeERUdmVFUTlURCthN1o1OVQ2NEl3NVZyQXpLNStJdWJHT3pENm5Cbnk3NWtBZS9YVy9WdVhWU2t6NERReW1vbk1ZQVRQL0VmbVNHdEgxR0ZwbE9KVkgzYkRkUkJhcTM5WGZpNVZQUnFLQzVTQ1ZTVHNKVXZPcEFvRWM1WFBuQnpCY1lIM1FDd1dhdXU4a1ZHQzNlZys0eDYyVVJ5c1hKRnFRajEvS1Y2dWgxdlFiVExLVnNXVzJCY0dWSVM1WVY4Vy90eHlWTmhnV3NkZTNpdWlJeDBWOFVOU3crV0lmK2ZhYUxlcElRQlBzQmtMakJGaTJoNXFDanBBNHU4bFFheUNYTXJiR2dwUkExSE5adEVYZk95R0dSM3Rrb2FCZll3bEM0V21xdEJSQklpcDBTdXhTZDZHUTJQUmw5WXBuU1ROMVNYSDRVYS9vcDRPQ3UvSyttaERQczNCdzVMQ1VkL0I0VU5meWkwMVBCUEQ5K2VNTEIxNU9ZSVBRdy9jbHBzcGRLcEdRNUtUZFZvNzJHNEVTdzBDK2VDNlFHdlVBRis5UCs1TmlKYnJVMloxK1NMSWJpb2VIZE1DT0Z6R3dFL1dMZVFOc010RE5uREhLanBseGFZcHQ3L2wyM2ZEMzJZY0dTVVJwa1EyZGFkeWRxdnJ5VkppMWFQSG1rWWhlUWl4bnZ3VHQ2REdHUUg3emdHVjVUak9rRlZQUzFwTyt0QUd1RUV2WllERFZ6SThpSFA5TjNxVmRyemY2Zm9nTVhyL1BPMllhMlNyUzBwVVZqMkpTK08yNS9pV0NIOGVwTUhwRVI5Q3kvbHN0M2FqOHh0UUhSc2JQZEs5TmdBbk52TUtqdzFRNkRuaEdQVXVSWDkwbjViVmh1SDE5elFGSGhBNjl2cjFDRnJiN1ZCenp1ZDBNMXBDRGtONThYZEpXSUhiN205ckVtaWVUK0JVWVJxNWdnSkR3N1ZWWUI1U1pOL2pNZHEwUUZza0J0Z2lpZVNkUGxrT3NGRHQzdUhOV3NKdXNrSFM5bkQxZWZJNURJZ29BMnVFTGZKRmtpMFIvczhURitNZFRveUo1dkdFQ3VrNzYrOTdvN2FkOWdjeVJYNTF6MGR4RUVwMzhFYzJvRVhYYS9wQ1BPQ0xwNFZTVncwdUEvTXd3N0E0ZjR0aVFYRGhaTC9iZnFIVjdRT0JsK3RzV1RHOE1aODRtSWdsRGg2K2kzOGxwcVljNFd4bzZUanZkUnlnY3hhVzBOVklzL0RzRENSQTROenUrUVVYK3g4N1hUb2ZXZlcxSncyckE3OFRaaFZIMUh5NDdYQyt4OUdYK2VRTlRpRXZkS0lORUhCVU9tcDFNUVhqWjZCR2J5SUhaVjc0cFloSGFzb1NwU2Q2N1JUdmkxNHBaTGNvYSsrYnZacjFvdzZwZ2kyWmM1UmxvbHdFMTNJdE1PWVBudk8yNTN5dGQrS1ZuOVBDb0h3STRHY3hqNHJGVUV3MVZ6WDNYVkJtK29GLytBOWc5N0p2Q3k5WVNXQmFueGkwMHFPY3lsaGpDT1ZyMkJTZkZmQUdXVVJNcEVSTkFINWVMQXMvVGRJM3ZCOWdQSGJDbHFHTmF5ZlY1TVRqMlh2RU5KbzY3ZVJ3cEVGdWJZUHlPdTZDMEtTaC9qYXV3SEJkYkg3ay9DMWFoODg5aEdJcnkvbjRFRkdNZXA5ZmYzRmdZV2loUFFvWkV1UjROeXk5L3JzL0hMNi8xeFNJOUpZdFd0NnZNN3NIV2xNN2xsYTRTTzJIN3FqSTRBZkdFL3NONTZrNC9LZmkrWVNXbXpvUERrQ0huZzRoZ2dUR3JoUDQ3V1RiVVFIdnQwTzJTNVg2WGN3UXJJU1l0UlVrZXZwSTJjTFhoUDRLekc3aDQrT3Bab2x1OHZqa1Qvd3JtTEk2ZDA0ZXkrbjlZWEhaZTUreDB2UmFFYTNoY0lWZ1dZTFVnVkRRMHRVMVRvUVdJOC93dnlrbFpWcE81anBlSk9XSUpUN040T3AvREJWdlJUandvV2szU1VRaDA5RG1SdTRoeGlSQncwRU9JNXJJdUE4ODlMM3BYZ09FaTFiblJOWlVBcFJJN2g3Qm8zYWVPODhYZDM5TDNMREtJclc0b0V2aU00d3ZvM1d6R1p6UlBXYXdnQlFhNGFTSlJHeEZyRENuOFhsUjZFQk9zcC8wNFpsVnBKTC9nYThaNGJrNTF6ZStCbWJKUTNWMVR5WHVKUGZwTTFQZkw1aFpqc01MU3UvVmlkU1E4VW5nTUhtQ2R6Z21HYnJPaUVZcnd4NjZCUEZVUHF4VmFIWkNRVFR3UVZDNnNldE9udjcrY0MwTUswdGFNUGxuZEFMZXRSU2VzV2UxQVRVNWJrbmw2S3FFUWc0eGt0Qk5BYTdZNDloTUExSzZ0QjVkWWIvS0hPdHJoOVJHcFFWOFFRWlVFbzY4b3h5YTk3WjNNWWtUQTd6Sm0zbmNkTXhzazNrV2FJUXJOdURoOWFUcnppZzJEb3ZKZUt0RTBwUWtOSTdFZVBBQ09xWWZqbDhVYWF5Rks2LzFZSG15MDhiU0MxSUFMclp0Q2g2L0VrUktiMndScWtIOTlSL0toUUtlSzRGZzFkWlYwb3dmOUZYU3BzTVY1b1pQUnBhbVFzbWwzOHNSZmlCTGc0WTFCQy9sREh2ekFSdmxMRStuSkt3eUZPRDdpcHhKaG03SGRrald4eXlwSnV4d1hPdWFlK2VaR200NWV3SGc0TFI1M043ZGdmbUUyWUJXQ3hielRTSE1YKzVkWW16Y1hMVTZIVUkyaDY4SGlvNmhUMy8xZVN6b2JIYzZZU0ZYRk05SEtKTmtra0ltM3IrVGdLckVHSlB0bjZ6NDhSckF0bmFId3lEOTR3alNKK3RBQTZHa29hWXFZaFY5WTZDNno4YzEzNDdRZkYxZkZBQmU4WjNCaHJwak5wYmlPQmRrb1A4UjVmS2RGcDNJSzBTUzNEU2JnTDIwYVpya1doS1dVYnZramRHUTNvL0RTelZuM0lBd0NNY2xjenFrRmVEejd4SzZGOGk2V0tETVhhSW12VUwxcUZzdkN5RW5PVFJHNHRPdjJRWlZyMDZYL09SUEZqUWdkV25oVnI5SkRldVVMS2tYc1JVaHZTK2xpeTBMYURxR3A0Wjk0WnZtOGtreFpQWnB0MTlEK2I5c3ArazBLenUzaVJyUDBvMnZnNDQzeWw4NytEbTM1QzF2MTNhakhaUjhFRXkrLzArSkRoQWpFdVdMbW03ZFhQQWgrcDJmd2FHaTF0NmhEeFp2TTJ1WFVieG0ydzVUUjY3VTdGSitmUFZHYTRleFhsenhQRDdsc0RHc01WczFuMFhsV1RpTi9sRUJLdlpUSHJmMCtzU05uN3F1SUZJeXRXZVFaRERQQWlKK0ZWTi9ySmFUSnRRQ0o2VlJvOXg3YmhlekRKMWNQT1MzZVlnRnJmcWttTjBhVUQwNHFRZUtNelptT24wdmNTY0tNYVM2Q3ZlQm50OHI5MTFQWkMxTEpZOW54emNONUg1eWhPSGI0eXRYQ1dndE1hbUFvd0huK1UvOEtqMVBOSHBjWjh3QVZEMnJnRlM4bWZVUmduRStQcjMvaE5Rd0hPVm91cG5qRmlPSGVCWjVWd2pjSmFnYkkwRU4rUVM4QUx4VWpESS9EMC9GMW9ENWF6WmNVN25CdTNORU9DeTFQZkl2UUpyK2NzTnlsN05lVW1CRUtaVHJQYUJZU28rK21taEdUYjZxdVhUV1pUdC9paEh1bEEyVFd0ZmxYRDZBR1NmaVpIekgxdUFMMTBTV2FJajdxS0pQSUdVQkRWM084dTV2aEtUQkl5Z3V5V0hLdEkwSFZHTHp2cXNiZ2FIdlZqdWdFRHdUdWRPNTBmN05GTWJqN0FTZkVUSGNicTNuY1V6UFpvWTZEdjA0ZklnNmhmcnFreUxxS0hWbE9DS3cyeGlRZDcvWGhqNTVBTkFzOWQ2NE5wblV1K2Z0a1pXVEYxWVhMUlVVcHdIMkZMUkxWZW1BMWYyZlRFWUdrVTRySnkvbmtxaVg3cnp2NmJnV0pUaDg2dHAyL3hCZ3ZvYS9mM2c0UWdlbmQ3R0RDVVBNYmQwcmRnT1NqZzlQb2hNNEYrT2RxamdST3lSNjZydkMrazlZbkV3YVFZeWVJU01DczZVYkdZR0VQMWE1RlF3cmhTWGQwdk4xejlvWTkrZ24vSDlwVzMzZDd4NEl2Mk5ZbThCdHhxWTd4anRjRHZTUGJLMlFHSjBnRmlqZzVYanE3TDltbEoyZGtqTTdmMGVFaVQ1L3RILzNlaWN6MXlzb0hTc1NuRCs1dWN5WHdPYmp6c1RIeE5zWXB6WXNBbXZlVVV4WVNKaWJtRjNjZ3RrV3drMUtzT0VRZllhc1RMMlNpT2pWNnhvWTBvcDRXOW1zYy9HOERWaWZ2SHAwN0dEWElDMWFVOWMwRjRPR2NLZlFvLzQ3MEs5T2ZmWWdQK2Zhb3lTK2s2ZjJERDUyQUxURUQzNTBlajZsTHQ2NGpkdmtOaENsUWtoZ0JZK2F6U1pQa1RlNXozYXplK2IxcVhaUmRUaXEveWFPTEl1N1JpWk5zUGlYUVlzalpHTWJnSUFOZ1FuVjZpOExHQmc0TTIzQm1DbkN2S0ozeHpycUxhV3BmVERYaFJuL1RLSlR1ZlBMWmc5OVIzZnBGSmtPN2kyZzZXS1BWd0RkOU5YWktSVkNLblU0ZzVPeVBodzByWGdqUVdLOUNCcUVvMEtxYmlhdUYrNktHWXVuTUdTTUNHWng2a2Z5L3B5eW02aUFQZjJtZXBGYXlZZXdBNHVnZGNGaDlzZktMVk05UUFYRHBrc3lmdzQzM3orWGExWFpoRnNOV3F2Zk1NcGh6NnFlR3FYUWpPZ3BpM0NIQ3lUZkh6eHRzaDNnSkVGZXN5T1dNWWNkdHVoM1R6YkxlQ0RRNThncFpXZWFTS1h2eDZsTENzUjJqNFAxRjl0ZVBDc0M2N1lqdEtRQnNhRGZ3U0pSUExPN1pNTnNmRzFlbHdjUVJXKzgrMW0rM2Q1Qy80OUJDWGhtQi9vaGYzUmFrY0FRVnVkSG9jTWpEUitPTHhkeDlJbU9tUVRMTHhNWkRwVkxabG9OakhBdnIycTFIZHNkVGFBbzZ3NHZhUDFveDFXRVpSWW8vci9YRWkzSWNIVEpGVXdQcCtLby9WdHhHczN5ZnpDWGduRm0yUE1DZHpvUWVtcUtMSmVWbnRqZWhRM2VFT2xtM0EyYU1kbjluZXVEVmVPb283UEJTQXlWakVHZWpQdWY0WVNGckx3dVhubEVDU04walVqeDBRT24ya3Z4dXFzZWVmV0Z2UHQ1VGNBMGZMVjluL3ZvZmxwQWpBUk1yOGxTdWZrT0RPT3BJcWZaUmhtUFY5YTcwYUxEQlFneHhHai9mMDBTSXNnUjJLWjM1ZUZJNDVFOHc4K0tBOHh4cGE1ODZpM25VZGJ5c2c3eThFZENlUW9sZVo2QnFDV05TYzRFY0h2QVIxUks5eGxRYjRBM3dxZW50cEVDVUE4UTBycHRPY3NMU1d1V29jUHZFRlJmR0ZDWFMvaFczRXV6dktQanFnUlZhMDVxby90VVdmczJwa2FsM085SnpiWmx0TmI0WXFUNHg0RHBSUmZRcnJXYlI1Z0VsWDBxd2huZUl6TTFPTVplT3VBKzBOc3ZNYUFYNmJacUdzU2xBNHpQSWh5R2FvQS9PYk9UUmNaV0JzOU5JQlNCbWlFTHRBNWhIS2ZDZVdJYlo2bWxIRUswN1BCUGhxd3R0VTVmWXNmUUtmYWNmQ3d6NXFzZC9PUWV4U1pkVXZRWWJ6S2VkZmhNUTJPNEtNSk80aVJ6M2IrbFo4ZzlzK2dpb2VJMEdNWWtKQjJ5Q3QydnBlRkJrbEpuY3h3STJ4bkc0VHFCNGltMEo4YS90SGxMQ2xWYkdyTGdKWkg2aDhpSFV3R0V0cFJ5VlhyUWo3MTlKUWZvRFl3Y1YzWjFMRUZrKzhkakJWa2lqSFNQUHlQVTcxUHRKVHQ2RFlJZDA5UGdoeGZURjkrMVpqelVOTEU4aHNwU3duaGN6YXZSUHFaQkJZSk02ZHVpMytaaCtYc2RjY0pBTy9iVE1pOVZ4TkNLc1dVVWQrSmZ0ZTJmV00vbDFRR1h3ajRyQWRjSmIwb0V5TmpaN2YxN2paN3B2bTg2cDlZVnNZL01EVlFPZHBSOVFLZWFVSUFuQW1EaFQ1cm9tVnBqWDZWbmt3S0NOVFdFQlZIaGxLSHptZXhUbXY5dmZXaE9sQ3FWVmRQTTFZVjRVVlJ0RW1tZ3BvVU9seDFxWGpYQUNjTDR1SURLV3pScmtVcFJDMkZtUW9FWW91YUpyeFhURHZ0bWNZTmVralZkTTA5N09UclIxWlZTVXlady9aRkhXeDgxR2xuN090SlN0NVFPN2NvZzREeE5FRksyMm5oYldZWlRvcjh4dTJycmk4aExpMGtuZmJRMkI2ZFdLWndpQlZ2VWhNZ1dCakRzQUw4STZNOVpGbmw4Y1BZMk52dnMvUVphUWlZN3N6NTNlM1dod2xVblR0Z2JaZ01LZEVCeUtsUUVGYjZFM1JZQVhlb3BCU2wwNG9oMW9yOVB6QjJCR1RsekUvdUY2ZktndGlzeVY4WERobFRQUk14bEwwVmZhTlNreW1JYVcrK3hzME94Ym1mci9jTExCaEw1OEo3Q0hhcTdIa0V4cnNEN0swRVBHL2JGc0prYVA1ejArS0ZZeE1KbzY2eC80WVJNeStRWjBJWkxjTlpwc2gvNEgzRlIyWW4wWjJ6a2ZXcVYrcHl4ZnRlOURHaHBGSXBGL2lGOTV1TW1kNFk2c1Vlc3cvcU5zcjl6TmZQYTBicXNMRWZnSlJ1ZUUwd3ZOYkVDMzlUbUpvM1NhczhmWEhwVzZudjBVS25sSnFSOS9aNWNRbXp6ditzWFlNVnpxRzVXeWJRQkdzcmdzVjlhbXBsQVFFSmtORGFlWlVyMnN4cmxKc00renJZeUUwMVdZL0ppZjJUa1hyTmN5THYra3c0SGlGNEt1REpBd2gvQlp1cnNZeVVPZnlMM2xrMDg3cFIzVFJZN045MHBoa1VGdnBWVFVkVlN5ekZUcFVDUUM1TU5TZWpMQ09qMW42NkVyOEF4YUJJWWdLNjlPZ1FxVC84ZVo0NWJkS3dCcm9sRXNzaUZNWktscGVxV0VkSk82T2RxUzd6ZTNqSndxZmYraHFwQ0E0MTV6ZnZ4cmpMdUR2aVcveVIzV3FnZXUvVU94U0hZWmY4dXBodTJwUE1wZWRkK3p3bVdpMlB6V201MndON0FubXZldHFoZEdIMFp1MlQ5clY0ZXIzTkZqMG5qQXBOVElxZnpveG03dkFDcURNa2FwcExYblpsdUltMURkK3hTRVNZU0N3YzFHalhLNHB4UDgyaUt6cFYrb3V1dlZJSXpvWjZRbmhhb3VTRkFIMlVHNzZYUkhLM0JsMytLV0RLMmNUTHR5WnFIQXZxaWtDVzJOUDhPMkF6L1MrSlE4NE95L0pjVXk1UG9OK0o1NmpMS1gzaVJtVjhiT3BZNHZKN0lPbitBWkcvNjNTV3puazU2KzBmNkpEeHJDT2thUlNVck1GT2hleVJaR1Y5STlZaXZ4d2xma0d1ek9yZW9YUUhiNDROMWFNNWVBNjNsK1RqQWxWNUcvdGRFTHhlMWdobDhPMzRWTnE1bmdJTHQ5ekJWVHJMSFBjL1pZSWJlcEFmaWdjamFFRllDcmdBNDlpOUlDZHFGUFg1dCt2S0lWbHBDTUpBUkl6K0NwcFlLWG9KOWovOFhFVXAzKzNWVG5Na0E3S25IcW94MjdCbEptNlVhbStFYm00aTRDQWpqMlZTRE1kV3lxa0p3dTlURDRUUDU5VzR0L1ZUZFJjVWltSEtzbnE4TmEvZ0FkejVmWHNoYUx3dUxJSTdZOTZHMWdwWnBMU2FFdTZrZTFBTGxEM1ZOMjlPNUV5MWxSOWswR2ZlZWtkWWtXd1BULzRoanJtSjN4Ri9pNlR4d2RoSkJaUDRYaUhBelBOMEZ3Mm4vR2dtTTd6cjJCTVZQNVVKcTJHSlptZUExUmlXZi9wektUdCtPOVpZNnRwNmg2TU04Z05SZ3hRZGFKaGtKTmZYNHV0MUc1dlVJVFV4OTNkSzZ5M0FZcSs0bkJwV01tVHlxQldGSUlxQzd6dEF1OW54OEJ4US9hVyszTVFIR2RyR3QyRUNsOW5BZ1ZVWVRrSXdXWGxEQXR5ZVpweFcrTkwyOEtBNWpTY3JLbUdBRUZ4UXRqdGViUVZwQmlQcVcwYitOaFBGdUZJdzJZQkFsWEdXZFNJN3ZVOFZySWw0MUo3eUU5bFNTK2dDaS9GMHFQaWVXK29jSngrUGtGWE0vT3JCOTFOQUE5YmpqNjBlcHBweVRRRzQya2FJTlViL1lsZmptdSt2TC94RVdtSXlRWTFKdHlzZkUwdnAyV285WEl0eWFBZDhKZkNpS1JOOFlFRWdxUlhEblNhMmJ5YXF6Nlk2SlNDc2luRHdwMVJYbGFnekpoOTY5ZFNYb3h1aCszNXlvTlpQeEdodFp3Q2Mzd3dWZE43MXYra0pCL0twYm1BUTZxOHBqVXQwOUUremhWWU9OZWZwNnl5aUdXUzVJVTc1WStvT00wUWM5SCtNc1EwaEFVNTVaOUs0VUdRTzd6NDJyUjJpemYrZFFkb2JDc3FjRWhhcXZwemprNG1HQ1ZrN3daM3UyM3RrUXFhTzlVY042WSs1N3Y0ME1wZDliTk50N0JNMDNkM2ZtWTJCSTRCdTM0SDkxcWxlQi9aeVVIVWxoRWpubU9SZFVtaWpvNmh1a3JsY0djUWNDN1FzLzllcmVRZzNtWSs2YXpzcU15aXcrTTJJL200aHBGMU55R1Y2VGM1dUlwVkcvczN6OFNxSWJseGVKclNjOTI0NkhUcGFPMEVFRGdRSnFPZFpEUmt2VUZnVTgwdzVRdVRCSWFGeW1SNS8vZUVCSkIvME82MHJmcXBCclZLSHlYY3VGWk8ydXFTMnYrTHFOYThaZ2ZxYnRWOWJ1SlJXSnlrTzczWGFYbHU3L1Byek14V0d5bE5PR3YxN2RleUc0dUwrbG53M3NNazZPS0JYR3VUY2hCcWFIL2NIcXE1NkZaY3hheVJDVjJQOEl6cVJUUGtuTSttYXBmTTRsU1lsRUlRMk5pNmYwQisrQkY0bzhlQnB4VXExSXZaaXRJclZMZnZNaVdIL3R1dVBoRlFlOFNIYlM4c2hlMmQ2cTFXRUtpYk9MSllzUjE2eTR0eVNJQUNNQmJJRU5Yb0t4R1lFWnpIZEtOeVFUS1BrdHJqRE05Yk9vWUw4RVlOYUdiMzFocEtZc1FzQ2pUY2crbThRVEpueWJsUG9rT05Wc3hzcEpNMDZJZ3VZcHJQbDhYdWdScW9SREdGeE4rSGJiODN1YmtIYmNVWjhuRmtTNUpvcDBYY1BqRDFJaTB2VDUrakI3Q2pIQTBOc0NxL0pyN0ZrNlRaTUhreUY3N3dxVS9BOFlkbjBHTFcxWWc4WUVPUEFFdGR5a0xpSWJKQjZ0UGVlVVZrU3dTQ3N3QnZTY0dkYk1tSW1lbnE1MHE2M3BkK2ZTc2lidlgyd1ZKUU1neDhSYUZpYWoxcGlHYUxDS0Yyb3BiR2FTbmkzQnlVaFlnNncyV0U1cWZVaUJ6OHpBeXlMTjJJbWs4L2xZZzNWK1JxY2YxL0p1UHZWL0tsd2g1a0JBbUxUWjBycFVEZExKNlNDS3JvTEJOQ2VmQzJXdW9CSCtFSDVhOEExREdxZERsaDZEdG01dHhTQkZvUkNCdElLRUJIY29zN3lWNzVoSEE1dzBpUXIrNFdiejl4NHhwQkZQNFlmWERvV2FRQTdrQk1oaWtFckxCVVR5UTFlTVZNQzVJNnV0aWNPUHVYVW0waWlJUzJRaVU0WGlSVXFxRmJaR1JybU1iWnBXSDhXQWQyZldmdWVWRDRzcWxkMFRoa096SWtoc3QreS83S1owaWVzWkJrN0ZhNVA2dk5jSnkydDVpK2N3cXlKUXpVYTMzRUlnMEVzSDRQRXIycVdqNHk1MTRWRlVqQnlJSVpWZWc0SE9qS1N0VUNsWlhmakppZTFDSUZPN0ljbDFEcWcrNEhjT3BZbDdMSUt0OGtuazJLeHM5ZFdReDJSS0lpWTlxQlpkN3BoQklrNnBGb3VoekZBeXpPbkZsSEErblR4ZElKeUZlZW5ETDgvVmtjS1JhWlgvQnpMMDI2eU94dStEdHJmVjQ1bG1zTG9ob3VHS0tia3FyYXRDWmk4NlpFa3BpYkQ5TVU3Znh5Nk9ucllxVlVxTDg0dkVQM1FXU1ArSUtRbjc4alcvRzJjNTduTnFUVVZ3WHNWY3YzcXYvWitKY1dHTmE4SW93K3Vpc1BTSEdDTGI4cGQ4ZDlFa2VzLzJqanJqYlA0WmVnc0RLazU0SE95QzhvaDBpdG42L2xpKys3WmNkOVpVRGpxZ0dwUGVDRnNlT3c0cjV6SVFMbWxqSndpenVpQmpuK0RnVTVwYjBOYWdPSDFVdW1pL3dKbWJqZjVzaFM4OTluUkNsOFF2OUhjZjNWbEJJSHFNVUo0OHFGcVBDcW1leGkwQWdJTVFEeWlFSGN2ajZWUWJqRG0zeUJ6dU9nV0hUZUhLQVdTSVo4ZTFPdkNIdmRhVnpPbFBIR2dnNE5KTGVKRjY0MkNtL3p5RWVwZ2VERVIyeDZRQXQ0WWZOdTh5djF4bjdVcDBSczZBaitnRXJHeFVldy9scy9EaGpmWExqcTVJOHZ0cXo0UTdWbW5VVVJaOVU5cElPWnZNMW5DQ3luaC9MdU9nNVlMTldabVBtajZvSEpUZVpiZjhyN01OWVJyMzJYY3JFUHFUNjVOMlVBVnZkRFRwSjBySGV2b1hqYVozcWgweXhMTVB3MG54RVFqV2dvS1Fla0pzdDI0TFRpZzg3TGFDZHEyUzVadzFqQmxnOHgzcDFOVld3V0lLa01mbEFvQ3Vib3hEdHdSWENkaThwNUc4SURKTzRObTJxc3RnUGZjMG52T3plNlNCakZRUllxMGpuaTR5TVlNMmJOaHgvT0FOY0FZYmplWkxVek1QQk9Pby9NdkNjN0JuTUVDZ0FXbjR0SVJGdEY4MHVncENvdDl6b3BVSVpCU2VPNWFvalBrMnJDd0JLdW01cWZFZFhNekI5TU5zTUU1MWJDS0x6U3lEWjVpRHIzTGxTc3hUenAzZWNZcW4venNzUlBGVnBsYmVDU05YR29CZGRvOCszVUxJQS85Mm9Mdm4vbEhUdk5uYzlaaTVrM1JMWmo2empGUG9jNkdLZkxWRHo4VFJyY3JDUWM0SWQxRThyOUVxTzRMaWRwdEg4L29ubnQ3L0JzM3pIZ2lyMGptNkZWUkMzWTVFcFhqYUF4YkhkUlFuYTZrVTJpTmVTNWd5U0Y3QXF0OENjU1dNanRqL0xmSk1QTHBCZ2FoSGRIUmw0c1Q0L2JMK2w5YTlGUmxEc0pnS3VIeVZ2b1VldUEyaWQ3bmt1STBCT1JwTStlN1IybExLUnU2ZEkxTnFLT3FVUUZYQmFsb2NkRHBNOXhaaVB0eVBJd0RZa2E4M01FcFNsajhLWDllS2llMmlWMHBUd2RGNVhOT04xWVVJc091dkIydEN3UVNtengwUFFuMGlQSG04UjJKSHd0KzYxL1U2dUQxRktucXhxdGttN3g1ajAxZkJibTIwUTZCSFQxZC9LMWl3dWR5N1JBd1NENHIzd1BDR0FCZW8rTnQ1dGRLcis5cGEyVk5GZmZLV0lidGZhRnJtQzNGVDZMb05DSzJDbFFLbmlYRzZTMUFDUUh4dWlza3RhSUcycEIzUjhkZWVNL09mM01GYlpDeHAxa2p5Zzd1Zm9PUnh1ZEJIS3krNlZQc1VsQzljdE5mdEJEaFJnOEQ1TTVKS0tHWXFURjJRVFhDZ3FBY3AxTTM1ZXdKaFIxanNTWXBPQjk5ZjZwa1A5TUs0K1pKSEp1T3NZNW5PUTBQVi9DVkFORFR6Yy9vZk11ajVIQllOVk5aOXRPL0txRCtwNXMzL01nOUJnTEJQTVlGNWNxTkVSMFpxOUlSbE5QTUk3bUNLcXowWFMySWlNVjBsY3JCVlpyWnhqZXhSSEtZQmxxOUZYeGh2b1J3TnN2UXJJV0FuV1I3akQzQTZBSklOY1BIM05FY2NEQTY3SnVnY2ZCM2tYdGU2aDFsc3lON2ROKzVCRGZhbVNuMVBJM0FWeFc2c0JnVWdJNG0xb2hRNFVrV1ArSUJURWh6NXR4WS9jeFZjVW84WVErT05welQyUzk3VDgwYUZvWnpqV2pDL2Vld3NxbzExMkE2K1l2QldYdGc4UnVTUEZ4SUNXa2ZmMXFTeFArb2FnWEVpWTVreDJBWDlENVAzMGpRMHNocGJKc2xyNUIrRkRPQmJxcm9JdTY3MTQ0WkpZdXpaN1dveE53Vi95UGRsaWJ4ejZHTzNkektVVnVDTDVCbFVJUmoyQ0RmNzZyUWNkOUVsWUtvWmJmOVJ6UWg3bC9KM1hDRVNWaE1iMW83V1BTakNKYzVNbldzdlhTbGNuZ0VCakZ3MFAzbVNsNnNHYnFWcmFnWHczOXVtbkxOblYzTWU1UG1GOW8wWWNsL0VTSjFucHdHM3Vka20zcHl6d3BjNFkwaWZva2NBc0xGTTdrUXppRTFNNHVNMFhjSTVheTVCekorUDRRRGJlOUMrTm5vTVZiZldFc2tDaUJnNlpUdi9aWHBIeElMZElZMjdSV080T0xYWU1lWXB1Nmt4RGJ3dEZiWUNJRWJlUFgvTkZpV0o1VmJKbTlRa24zY0tKRUpqb0RmNEcwaUE5YlNPcWdTaEl1WUgrZzhDSnRReGRtUGJnaEdmOUJIeVRDTWUwa2d3T1JVMy9JYVJDZGRPMlFocDNMV2RFT2VWY05tdzFZOXhQOFZlUGVMK1RXSS9zL1JmN3hrTW8yNjJYWVNGUFJkQmU0UlNFLzZiUStXV24vcnU1K2t6Q21hNjR3VlJhSEYxN1FCelJocEMwK3dnRmZLcFZHaXBWMTFoQmRSZ2xMdnBFdnlMOVBvN0tuRDlWaUdxSk9sdWh5enhDNkgxeEhDYVlWbzMzNFhyRnlXQzNXcnJYdVQ5OHZTUGNiNjhrM1l3SnB1YTlLODg2bDhiN2JPcEpuM3N5aWE4VnVwQldycXZDa2NrcDcvYVRlUVhQK1lNQjNWbFdmTEVRV2EyekIwZFdVUVRydDlCODZucjE0ZStEcUI2bEJmL2FFeExhTmZlQVlYaE9UWk9QWGlXYzdvVW5Rck14RTR0Y28xa3AwNW8wemI1SUdJK2w3SG1xbTYwNFZpYkJSL2dva094NWt0dkZPMG5PUXYxMXI3MGxyS3prOXVxUlFRSDBGLzI1NEZyVUxRUWpXbHBVa3RjaEdGbkZsVmtONVZsQ0pDMzJFSEUyOXBjQVc0T01ncHZoWHlKQ1BRYm9XL1B0ZUNYNmpIT09mOUIxL1M0M202d1ZZUGFlNzM2QUlxS1dCbU13blBSaUhrOG5Ed1NvV0krVDVMaHN2TkRCRnJpTkJOUFJISVRmQm5QZ2ozMXRrSVNTTldWOGFjN3A0V2R2VmxlYVU5Nm5zN1dXVHNoSktjYWZpakZMcEt2TURuSjM0UE9qWDR3NEhwV0tCZDJvdWxkL2J1Z001dFVxaE03djRmdVJtbzBVcjRyNEc0eUVKQkV4bmNHTDU0VGlJQTJxOFRUbEI2dEMyM2RjZUtramp4RmdZdjNKcE1lTUdRUHV3NzE2T1NxNVFYZG1HUWxuU0pqVXhGVks3ZzFyLzFEbjMxTG5pVkZHMEhBTEgrL0tQU1NiSWRtenY3Wktvb29SK0xtSGRSRGlBdzNFc3RNdXd4VVpnSDlRRnF5bW5oelFsRVM0L00zT3JGanVvd2hrRXdqVENvd0NvY1ZEa0FCQit6MjVqSUdROUpQZkZoTEkwNmhLQWNvMFc3MUZLRlZDaS9pOGpnRDU0aE04a2tycTg3L0trRzJCQUNjb01CUEpHSngwL3c2ell2eS9MeE9MNHJlOFl3N2Y5YmhvUk5YR3kyMnM2QXZEZUMxZTJ6SDczb05XMUQzUTdaODJWVlFwWjdHM2pLQWRjL1ByVVFGNmtVYVB2Sm9RejBoWmRNTDU3aWxtVWordmN4UUkwOHZFblZ3U3B5Wjl5SjBFTkhwMWN3SmFxN2hCRTJRN0NIQVlqQkd0b3dkVFd4dEl5N0RjTlMzVFNJdnBLc1JGV2NtYnovOUdLQ1pWY3NMTGNEUXM3WEp1Y2V5bnR4WW95YUNIN0IrYS8yVjB1RlAzTm9lQ2RVNFFsWDFmYmZ2SDVyRlJiV0k2STFGRERDNWFjalFIUURmUnV4VnF1WFlIN2dWUWpVVVBITUxRYVUrUVplSjBXcHAzOERtV3JscXVOQ1NoT05YTEl4bjRIRjNXTTA2NWJoMkpQTFoxbC9oMzg1T1A2MXRwb1FRd0tFOHltZW5mVE9YMWtJM1Y4d2xEZVMzU21sTWoxaXNQblowaldZS3F3Tnh5bGYxdUFUcmZtUjl0L3hUaVNNdlRSUWhQcnZkY01zYVFGQkdKbmJ6eHdYcFVibnQ3WUNrWVNXWkczM0R2SEs1WExIOVNhYW50NlJacTc0c2owN2xER1grb2ZuVEpJMTZNalVxbjhNSVFmRXNMTEs4YmF6RTBvZTA0WnVITHVDcDFzempTaTZHWEZpTStRTGNMWnZhTkc3eit4VHBOM21sOGIxOHRwZ0c5aVphT1pBeEF4UFRuVHpHbzc5aVNhMjkxdHFyaEd3c2tBNGt5cGUvOG1kdUNHS2JwdGhYR2dSOUpuS0tpeDVCWDNZU2FsdEFhWW1Kc04yMmFOVDFBOEVZL1YzeFp2MXVNc2cyN2RJa0NJb25rTEg2K0JYSEtPYVMvU2JZZW9rUG1va2JHZythcXBHcnBSaDN1R1dUREJ6ejBJOTR3NHovV1RiN1RMN3ZpZXVpVER3YjZwbEUzRVBvc0lMZ3ZmNXJSd09senNycXJRa0F4UW9lbDdzbmJKWnl6NjR3dW0zZXZmS0xEc3VnTWpjV01NOTIySGZ2d0VKOGRTZTZTVnArRlphZjhDSHZTYzNTUTFacGlEN2kyUHJjVFNjZUwxYTdpaVZvUmJ5YVNnMUFoV2lqaG1sYkNONzJRYnB2b3BLdERzUUZZWW56V1psR3dPckQ4WVZCekNtcHNuYjBHVjE5NzBTTHR5aXpCdUo0Y09yYjJRdWw5WTMvS0RFL1B4OWk0ZW1vbmZZTGtDMEF5YlZxT3dROS9KL2ZFQTBjTmZLQ2xiSFVOTTRNdktmalBpcWxMTERIOE1wcm9nMGY5WTV4dndsVHlUR2liZ1BLSUt4TlkvcFd2bC9wUXp4VlpYMjFEalNwd2RtaU1TaEt0bWFHVm1IdUxGVndRcGFzcDQveWd6OUhrUUMxZGNsTVdlUU13Y0FwU2Y5c3JXRUdPMzgzMmczb1c1bHNnVUhvaFlzMUpsSjJRYmJZWkpuRnV5K3Q2WTU4djNEbDNNRU9CazVkSmplSjdZYlRNVTZXcjQ1a0hIS3lSSnRQZ1VWUk8xRkwyREdTR2kvSkRXTUYyMERWNlYrY2pQWTVsMVErZStHRjh4dUorbVRGMEVKaTJCYit2Z1UwdEtmaGFaMHNZQmFaR1NFMS8ySEl1YnJEVE9ZeDN4TEwvUVdKNVhjdUY3VGtud2UwVE4zV3BRK2h3cXpvZUlFNCs0aUd4WWMxK2tXYWlCTzE5VEF5WkUxV28yRm1OMHZ0NFJhUTh4bWYvT01mZ1c2SGowZmNLa1RWQUgvWWo5WGdMM3RRcHlFUXg5OU81TVI4WHM4KzB5UDF5Yko3TStxalBRbElpRUh2V3BQaHBYRG44TDlvQXlrZ1ZCMkNOUU1taSsycUY3UUgwUzVRRWZLT2t6MWorM1FkeFVLc01MN0F0WjVtdzNnRnpMVWVPQ0J2TEhEWUd1UGhuc1FnTlhoZmJhcTF4Q3RScWNjSlE4aURsN2ZqWjYyaFlpVVg2bXB5VWdndCtNUXF0K2tYNk1BQTE5SnhBNVBRQjcxeG1DMEpRMTFRZGV3ODRzSlROTUZtcnJhZnJwaTlQU0pnYjgxU3Y0WVZQSU5JRkNaYXY2elo5TU1lUXgrUi9QdkNpVHoyeVZLZmpoYjRvOUxFSEJvZ2RaSlkyenp4VTV6b1YyeTRmNkM2ampkLzdYN2VpeERwR01vKzR4MDFIUGZWQ2hRLy90RXNIUEZxbXhua2FEZGpQVnFnZG5xdUpWTGVWbXBSYzBXcVg0M09XZU5zZVlmaDlxdVZveHVLTFY5V2NxOE15TjB3VmRmUy8zQ24rM1Bid1VobFlYdVprSUJqd1RZeVZjdlBCdkxwQ1ZXd1F4TEYyTzVqU3ZqWEtQdlVQT0pkVldlZWhzL1BWRERTbTVZVmtRMUVGbGVvWDZDanF3YVZ3bFo3ZlY3Y2ZNb3NleHVNSWloNkhwZm4yb0FRK2h5TCtaWVFOYXI2WmgxRGpjY0RNVHFoUlkxZFl2eW1Ndjg5dWs3a0tFNDRqVllST2U0VDVrWU5CSEFPbldBaTF0OGw2OXBFUnZHcVJzVmd2blU0N2UzQ2lqSEdRTUhSRFRqbERZS0NCbFZVajR0TDM4aEE0T05yUE10UXdYc2htTzI1QmhtQ3BZUWE2UlZRS0s2OGdRaVk5bmd5NlJNSzB0elk0Vys2UWYwK1orTkpNSnZRSmMyQjltNE50ZUNwc1RDWkZKVi9aRW9INlhDbFZ4RmVINlJaRzNGOGh2cDJycytNa0lFOHJ1KzE3UXU0R2p6dTYySFlCcFhTMkYvNWZreHZVWG5WZlF5ZnRjVlAzL21iV1B5ejF0QTNyb1dzdmJUWmpoZXg5NTBZd0NtUUVrVUx6U24zUDhnR2haVnZyRm0rYzAzTWhXUmw0YUptbGNHSVlPUnduSWlXOHZIcEFuTVFUWTdub0RIZ3g4Tk02VW1FR1Z0dDdnWS90bTZORzNOQ1Nna00wSUNGQjJxYk9BWURNbGdSSGNCNnIySWdKSTRXbVhrRERmdE1UM0s4M3VVQThtNjVOakoxUktLYy9MK290RndvL1lPakxReHNYc1RxeGFkT3BDTkVhZW5ZVE9jRDNUNDkyUTU3bG16Z24wUVYwcXJPRTh1ZWRWdE9ZOTBENUYyRlp6bTZDVXVkWVIwdWlPdFp2czNHcVkvQ0xFcjdsUWJRMDJJTWNwRXhnc0oxQ25ybnk0TlhJM2pYUWc4aFhhS2dHTm1BMVpRNFdsaFNBT3A1bkc3QkppN0l0ZUxjb0w0eGZKY0trRjJ5aTRJRmFKK2Ftb3ZSYTNNdXVMUzljN09xd2pEQWs1V29hMTBGR0xmNi9uWTVsZ01Gd1pieVB3ZTdnVXFEOWViMEtyWXcrdEhtOGIwMlJFNGlUYS9rU21EU0l0alVJcVlDanNZUkI0b2xMR09mWFFWS2xhQndhYWxuTkIyZ1ZRMFozc0R5d3A3UWpGMmpuZVBoUENXRTV1Rmx2dTJMTC9CaEJlRzI2a0JlWEljMW94djlRRnV2TjJHaG9WM2xmd1VQQkszRTY1Yld2Y0hFZk1taEFxZzhDVkJjT0g5UEkxOEtnUjBkRFFqZUp3b2E2QllMWjhRc1VSOEJ4eXZwb3hpSnYxaFJjWlgyU2FNK0FpYVNKekg5UnhXMi94NUxvVGpYSGlUZm1EVnZvZFM3dXhlWjRldXdzQ1BQNGdQN01HdDkxZ1hvd0x1dy9PYzh6SmhXOE1CUlBFNkZnS1Uzbk5XdFBIdmY3NTdwM2grRDJiK3FVWmtvdm1uQ3RNRDRzMXgyMWs4clhjaVFwbFBMT3hHOGdINTIyRVN1cVZyMkYyZWlPcGM1Ui9IVjIyMmVzM1dsa1pMZmJJTlZFMnYwYXQyeExad1FYWWZKTURlRDBwV1FwQ045U2F5Y0ZVSWQ3bWNSaE8wekNnWkVGOXNDZUgvSEl1RkI2SmtDcUUwT3NpL2lock51b3RBZmY4cmhWVWs5L2xnTzRzSlpjbnljaHpiQUZLT1VZbUozZ2lXalpuRmhJUEdud0d4ckhaeHRyeHR2NlNHeEtJY01hMzE4RXMxVnFqTDZ1cnZ6RkU2a2N0L3phcU5zUnc2YVNzdS8rSWtTOG1jbk9xTzFobHNDYlVINStFcXNDRXJZYlorbTFxdHF2SlVTRWUxWVYrUCtuaEdlNVdxamlXWWwvUmNXQ3d4V3pwOGkya0tQam5Sb2hueFROaFJiQ1YzOGVSczJSeGJUb2JRekt2N2xubGlCUFZGNStSODNKSFh1S1JlbElqQThCeE80TzRGVjhta2QxMjRiSUZyZnBBaXRDWXk3QkQ0Z0pNNjdYY2luN1VIcnlwMm5tb0VaRDlVV1B5elFyM0RpMC9zaUdaenhXMWZObkR1RjhIb3JvMnVvTWhxQVVHMHJKT09YQTVyL2F1eWpvMzcwbWhkWnVnT1RTQ3dZSm1tRVVJMFhpNy8zem9WVGpFUW12MGx3djBXNHFOdnYwa0ozSmxHMmVFZy9wZTk1MllvVjNZb2JaMnRwUGxibGZXekVKYXd0VTNCY1NrUlZlOGJrcGthWVRMUmRSa3RreFM2UVlSUmNNa3ZQWDhHd0R1Ujhjb0gvV2cwdmhpNkh0SmpjTVBzbUVaVFdZU3BzTWxEY1VSOWJLU3ZubDN4Mnh6NUpBZ3ZCVXBNb05vaE51SzNtTys5d0dYY0VkT3hzVmFrRFBhb0RrTC9JTkhjN3JLQmVTdFlHc0w4RnpkMUkybXdQNFdaTk9XQktFNUJiUXVpS3BpYUdIZXhJbjludFI5R3BZaDBuTWMrNHlPaTllSElWQUJ3eTZGVE5TS0RvTVdSZTFXTTNrUWhrTStpb0JXWC9Bd2pUR0srUXBPM0wxUkdUakVkOUdLU1JPWUpUb0UwWGliczE0amJEMTM2dFlJbGdEcWtGUlI1TlZqSHovMHpUelZvRFU4ODlyaTlIeUNRWmpTV3lRRm9CSXdxc212eXdGR2c3cW1penpNTG1TTmVrb3FSNlM0dTFia3F2M1pLZVpRK1VaNHFleGhPaW9xTXlGS1dBRkNGSjA0c0dzbHJqbzNXN1FyUGdreEZldDNhenp0U1JOTkxHejQ4c0hpOE5ZR3kxei9XbEtoMFpMdnhvNmNOVHMybStFV2tVc1FWb0JCNFpoU0NxcTNJZEhHYjJPTjZtSzZwWmsrd1F6cWRNRG9FVjZjdlJiVThoMkdTVUp2N3VpSW1uU3hFdlltVmM3NFd1S3dPY0dYYXNkZ2RBMzFoTkxPdkNKOG5Wam9vTTVXODUyYkV0dHVEckwrWERaNVJnby9QZmN0bDdXS1Z3SktNZUt3SW5pYTFjRDhaRU01YXdRWjlBQjUvNzBrS3MyRW5yYTJSUlJmOVpiT2RNMmdjTjVmWlJSNzJnMjI0SzlCYTBUcEtyL1doWDd3QVRQM3Uvd3FDamJzZkhHWkZ6NWg5cWxhdy9OWjA0bnJrZDJhUGJlbFhVeEdrbGttamQ1QXNGRVJRYkI3a0dhemJKSEZ6VW1rcXZMK3VNRy9Yb2RpaElwaWFnUngxWmIvMnZaQlBudzh0bVIwU2RTekdTTDF0eWdVYWF5ZGV5NEZrYWVDYjl1c2s1QklVSkQrOEhIdU5taXlpK3ExRnFqUnJKcGRmRU9vWmhQTEVMcHRKa3VuWnYxL3JJREdzNzhMVnZCR3d4TDJVL0NsaE90dE5HOGxJOVk2cDdDMzdPdW03TE9GU1oyVitpN0t5L2JHUWYvMjNvclJqQ1hqK1ZtRk80WG4vV2JGSjZDOUZRNVRUcXQvTWZ0SGpOQm9uTEdOVXliOEdhSkJEaXJTaHFRN0NtODBEekxiaVo3em9VYXQ1K2lzeGhPRW8weFkxdlFpTW1PMkJHTHFkM1BLd3Z6RkF5eUYvSzEwWFdKMUZnS3BjVEFFbHYzSCs0TkUvMWZFQ0lmTkUyNUgrQkw4MHRtODYzbDRKZ0Z4azA5TlN4RXlzYVpKT1lkY2lKMUFPK2xQcnRWZzFvckhTdjg3U3N0VHBzN0ljcHpsbXhqQmJvMjdUUGtXZ0UxVWM2b3VPMHVYcFFwSFgybEptQWlvQ2k3b1JEaGZXbXpPWHlxTFFuNXpRRHplbW0zcXl0ZWg2WXB2MGtWSTRBaGROV0t6QlhNQU9kb3pwUnhtTmJMV3lnb0xVSStvMmtNTUJ3djJ6eE5taHdTZTZjaFRxalhjOWpVKzVnZSsvT2o3bDlTTUYvVS81bm9tdmdqNkovWWVGRXhud3hzQTZ6L1ZmR1dIeTlIYWRTZkpLalhGVkorUFFXVUxJTS9pcDM3bElpckJYckdnVDhMSTk2M2xaUE9DT2YxNytQdWF2VzZPY0srWlBPY29zRktRTmMvZ2V1NkFiL2ZaZzRNMzcrZFVuUFBNT09ETEVJcWFSZHNITnVWVnQvTFk3TTVYMlAzU2J5aGpJb3RlZjFnUjJNREZaZGJmVEdEM2JoSmdxekFJWDlPWnZiVmU2MkltWk40SXhsaHAyYTJNNCsveFl1aVpBdktDbXlYeHBpOWY5RDcyYm93bCs4a2prdTgxSG5iZWhMa3dmVFJlbVY4MENQM0FnWktVMklOdzJmT0lnNG14VDIra0cyNzlLK1IrSlZMSG5wc2U5MnVtSVdzWVpvM0d6TENkMXo4SisvY296R3d0U0hwYnluM1ZXL3V0OWlNMndLL1dyWkVBMDgzdGpzVmV5Rm1SUjl1T0tFTzRldkhuREZqaEt6M3Zidm5vUVg4dEMvNmR3cnBqWUQ3OXpRNGJyREJ2U0JSYlVFK3FsWDEzcjVZTVVzcCs4U0JpaGp6SWNPNXpucXgyMTAycVJnQ2pPcDlvb1piWGI1eGUvQmYvMnpiMTNVS21tSEZodHBtSEsrejBEVy9tbnFUMmFsMUhxM0tmVzN4RnVrT0tJcG5HVC9lSGdld2EzWEhScnUwQi9mNG9XMDFzaHJKZXhjcDdzbG1LQTdvWWI0ZTM3dldUVGUvays1bDRSS3p1YVdWZnN0M0JpM3EvOGZTTUxhdWZMWnVFSEZ2R00zWUhBVElWZzVzZ1hpeVhrUVBGbllaejRFekJyT2xzWjRCUTk4MVRKNHc2cHpaTSswcUt5aFpPYW5jUUhZL2grcEcvODlXaWtzZ0ZpR0ZQY0hZTnRaT2dpcUNDSVJSVEdEUXYwWVJaeVp0cmkxYkxyOGRaYXBpVFV3SkNXZFEvb2FsY09NaVdoRC9wbWdkVnMySjhrWFhvT3IrUUR5VnhDVkwwcHlUZnZTdmdvSUxnR1lEQk9yanNSZGs0MWN4TXpuSVNtTCtHR1VvNGQ5TUdURDBPVmZpaUo4c0hNYzh3MDJmUGpWcitFdURoQndHMzZJWHJxYUZWMElKaDV3YloxOXQ1OFlmUkJKVkRrRDZxT1ArU25HSWxSSUFtTzVYMHo2SnRkM084Y28xYysrdHVObUtFS0dvY2lNMlZxdWZDRlNMcE9UMzEvTkg4NjJlNEw5ZG5iYUs4ZG9RbHVEajZaYUhjbkZHYUsvckozM25paVFJdFhXRGE3TmhhcHlVdFYveHhCNXZnVTVWUk10TkFUN2hBM0RtVDlIME9rMU1LdDQrck9qdVk0R0dxaXFWeDIxVXQwT0RhZkNWTHp6T0trckRscW9OdjZsbWJNd3pyVGFvbEI5TzNLOG5YdU5PcHZZaHBnb1QvQy83bHhUNDBVSDk0ZG0vT1IrZzdhSFpwM0g2MFg1MTlTbFpFdFduWnEzVXlsamI0c0N6TE5xbmlXcWxLTEhIemRsLzNFRDAvS3krV0VkUmFmNHFVSlJaMU1NVzN4RUR2Um05RG0rL0N3YTc4bkNsdUtCR1k4cUhXY2VOUTdEME9rZ00xZm1uOVVjV05SSEpaT1dUVUwvR01qbVRjY2d5a0p5THVVdlQ2QTlwNFhaUDRsajRtdFU1a2JpSjlVZzFMS3BpZDVHVjhzeGlkK0wvT2tYRlFIRlVtaXdBY1VteS9SQXo4THVrbWFFdDVTTko5Ym9BUlM5aGZyL1VDRlZRREpMSUhhREFGb1Eva3pHVWpJUUgzSTdpV1ZlSHB6Q3dGdFIvVWlJY2hsSTJSek4rQm1za0hVcm1qS2UxQ0c1bngrYXNndG51T0tTVjVoOE4xMTZZZlc2NENLdk5CanptSkMrM0NydHRGbEZ4NWg1RjdRd21zQjZyRTNGeTBra3hVdmtqR0owZDlPd082SGNHU1VPQklwQXV3UjRHd3l1U2dOK0RqNDZBN0xOa0tQcjNaTzluZFYxak5LU3JRSndBalF1NmlIL0JyVTJoeGcvdnV0SlRkQXpGcGVXUmdGVjEvQ1BsdHFja2xhMkx2SWtFYk9IbGNKWlFLRXI0VWxYOUNOMzNlS0JQTEV5V3haN2Y0THNnT0ZKa0xVT1NubkFpRXVoN2ZBN0lqaVdac1I1aWxVYTNzcWovangzejB6WVM4SEh2d1pmUXVXVmV6anNmRitXUVlXVnM0YWpYeDR0L21BQ2hDRXRwM0RNeVlPeHlJRmlWaW83NWFENzNyVWR2L1pQajJOQm1CZDhVR29NVDhXV0xOQmVSQzNMOXVZTnFrdDZpa0hlSnlRZkJxMlkrVTNCZU40Y2E5cDQ2bVllbVFZKzlQdTJlQVlPcUZGdFc3a256REFwRHlWVHFtTnJwSGErUFUvTWJybDVPU05RTWJNV0hxZ3pTQ1dzMFhNSU5IWUdEVk1kSEVDSVZGa2txK3YrTDBmRlVVNks5eGNnNmRzN0EvOXp2TlBKUEMxNDhKRFNXWWMwLzF0Z0MrRnhtZVlKRERqWmlFN0t6R0kxWmI5V3lWYkEyNCtFRVdVV1FORnNIbTN4RUdWQTd6ajRmNG54ZkQ2SmNhN1dsTE9JOEJtOTc4SzcvdHRabXRhY01wT1FjL2RGUzNrRllEbGhhVEpZTGZBWE5CeHJuZVRUdDVJckRYVGhHWkQvVHErWWJMNm14NzZhRWNaNTU0ZkhFdURna0YzaDBxSUx5M0pLQWtTdExTTEtSTno5Ylg4Uzh3U1ZMRk1ES0NoOXJNeTh0RlI1ZmxhQnpQR1pLL1FNdEZUTFV4WSsrZXpFQUNjUm02Y2pEUmd5TTc3SGZabXpEK2FEQjlSRDJFSStsSDNOZnJRc3l1QzJScFFieWhOdzJ6eWV5MWZzRUxKcTJiZWJzcmo5V2c5bjBiOGtUU2YwNWtGdWtBY0xucVRxOTdEc0QzeHlnRzBKNDdvOXp5TmR0ckxkZSsybmtSRWE5QXRqQWxNTjBUSnBhbDVrNkhUZHhObzZJY2lwRTNXSzl0QjZoVWR0Rk5DZkhPOFVlQS91NCt0N05LNmxacUxrRE5hczR4Mnh5TnRBQklTdkozZHpVbUlDa2xWbVZPWnZCUXhXWHFSSnV6K2Y1ZGU2cjdLY2llOVQ4VEg4U1ZoSE9KcWNNN2k4RDJuMW9FRWFPOHBkK2h0REw2YW5PWVBhcFgrRGpaMzA2M00ySDkwaDF6aStyQXY5RXh6OU0xWEcvMWxKaVZPb0dFUDdKemx1NXMrb3Fsa0cwRklqOE90Zk5DdFZ4M2Z3T05vNFZXaUh6blRUTFZjaGdPRzVLai9TdWN4YU9iRnkxaUVyV3Y5dUJJZnp3L1AwY1VITlJhRE9RUTkrd01DTjltdjJVZ2ZZQ1NLejFXQU1Kb3Y2bE1CQ2xBc1RDQWY5UlV3WUdIRS80dk85eTNtRnlvTkR1c29yL3VQVVVLM2RKSEVEUDZWR2s5bStUVTRzdkV5dnU2c0hndjQ0Y3AvcWlTeFVCZFl4NGYzTnhQT2ZuUnMra1Uxd2ZFYTJXdWUyQVZCNU0ydy9IcTVmTCtZRXNUU0Evc2hYWGlSMUY3bUlpZXR3YXBRRUlqY09XQXV4RlZJcUNqN0hTa1FrdS8wbkNMZlEwVWJMVmJ1eUZPcjV5bzNOUWVOcHE0d1hYMEhpS3F5b3JLRHBsR3FQK0VyTHpseXRjTy9SQjVnY0RqM2ZXQzNRdUdPRERNd1RVVmRBQkswZklkV0RrcDlrUk9nUTFJVnJnbHlYQTRQVzRxUXZLdHNqOUtOSHdvTWM3emNhUmhxRHVIRUNoSlZZQVY3Uno2dWQyRndsemkxMXR5b2ZBd3IvVWpCOVI3NjcxaGdtNGZsSGo2b29EaXpsZnorQXVWSjAwempVbWI0bFRwY0RXOFpRUkRVNEdDTzJCWEdSL3d6NU8rdFRkNDJTdDc5VzZESVRWaWVUMXNpbFNWNk5oRU9RUXdBU1pWSldTSW0zQjR6U3A4WU4xYTZBcXVCZ0pzcXNha0hVOFZFdVZGWUtKaVNOUjFkYlF2TjN6ZmJUVENibDNudkYveUNua3hrR0VpencrMWdESXdGZ3lrcnV5bzJhdzBtb3R1TjhTeEFaNVppUWVRMGp1dXlqbHBmdW5CNEpOSVpqNWtaMkV5L1lLa0F5YUF1T20zNi9vUXkrV2YzempNZVIzZXI3NS9GYytTTnk4aE9ybmpES2M3RGxJMTMreitLYWRYNXZzeDh4NEdXTXNVY0Z4SjFwV1ltS0tPRlRTdkI4N1hLSmkzZUhsS20xZUVkSXVDVGJ0K0JlKy9qZTBTcFQ1UElEWDI5SU9FaW04MmgwUlR0Z3A0SENTcExMZFZTU2ZZZUUrN1Vub1UwSG9iOENkb3lRTjF0cTJsaEJMa2xKcGVTN1ROTkM4TW5OcmlNand3RmJFbUdBK2R1V3diOTIrZTJ5WEczb1l1dzE3b2tyZlY3QldYSHZwYnZpY2NZNWFNbTFYUzRhaDJBVGcveWt3aW9iUkJLL2dsQ0g1UEpOMjl3cVJYSWdOamhLWHlCMklRSEEzWFV2bWVtSFp2bWM3bkxRQkk3d0lJeDFkUVMzRXQ5aHhiaDBBcFBlRWZ5WXdqWE4xdmtJdTAvNWJZa3dhRjI2WVBoblhiZ3I3UXlMV2lzK1RMcng1K2UwLzJybHVkenJ0cDdRQmdENHNUbUhtQWVBTFE4ejVwcWI1a1ZrV2NpMWNOK012bFh0Z1BWRHhMMTdseTlNWGJLOThiL2l4WnRWVjZqR3Rud3NVcmRESFJXMVpnOE1GTXlPUW9TZmhaSW9ScytTeWw3QVRpQ0RWbVBUSGhacS9zWE5mNTZpYlNiYVBmaGs3dUsxZVpxaGdDSExTeDJoVVlNWWJJeGV1SXJmRXdYK3lKUmx1Y0huNHdaVlZySVNwUlFXaWI3V01TbjVXazZ6WnEyN2JLSXlnSDNURURRQTlreW9QUVB1Qzd5MlV6eVNtK1B5NFRFL1Q0cHROMGlpdENMMUt6UklSRGtFb0JOQ1R2S29tY2lOcDdic01ZeU1jZWo2dVBVMHJWVUhJYjVFUFZVWk9JUVhMdHJZSkV5Z3FRcmdWbFB4YVcydEZydldnNVl6cU45blFPM2YyOTJheFBST0haRjc4NHNjaVNhekdzQlcwZFVyUTFSdnJ0QnpTL2hScmFvbk91ditoMldBQW1ZTVF1UmF2T0dqRXFPdWhzcm5weVR1bVhqSklxVHNDdVJTQnRYVDFkR3pSMGdkQWt4M3NyMnJ4cFNvNmxZVmxuVXJYOW9MZm9tUEdzYWx3dzVyZ2V0VEtxeUZEZ0I3V3daSmlOdXBWK3N5T2FHUEFWV29xZzdJL2VRamt4SzU4NjNVM1duU2xUMUVJblRxWTBmZEhYY0xyalVIb0RodUl5TXJ3d2QzWEQzUDNZdm9HNXhPN2grMlpVRC9Bc1dycm9aU2xQYlp3TFpUUkU4OHdDdEdmWStkWUs5ZjVXL1AzQ3lOYVFUZVdsWDRNZmQ2bU9oTm5HYVVCRnM0WWRwdDR3RTFlUHdEUW8wZk9NRWpWUk02NmZVZjJiMGp2amthelJEYVFYai9WRDNuZk5iMGVpK0ZZQlVKYU1rSnlmMGtUMFJQNXd4ZXd2emVCanArWG5oZElJTEZjTzNxeGhoOHpGZDI0dTRZRk9OTXM0dU9Tak4rUXczYUswb0p2S3plT3V5bmZIdEtTK3NPTVJMZEQ1aW91NTRNWDd6U1RNQXVaeTBnTEd3d3hXbHVDWVB2RlBaaEx5NDlRMWw0M1Z5Q0ZubWs5enZqUlZldVBnT3B0M1NNcjJQcUxqRkpLRjZGZWRXRkRGTzZYN1VmRDlxL1REcFB4V1lYVExaRytCN0gxS0lzanMzcXlKWEdQanlBYjJrQ0ljbG1sQVN5a25zSlJLUit1SWVvdzFGWnNuRGxOVnNGa0xlOEFYcXM0Ujdjb0dScm9IaWhFcU1ONVMwelc0dVBDNGxoVm1Ed2JPUXRSdnFySzh1RklFQURvT2RGL3pkMGFCZDduSDB6WkZkeGdDU3plRTF4d3ZBa2hPSVFqTEsxcFNBc2VKNytZNWtod1EyZGZYMTV4bjFhaTU2dlhZYVNRUVNoakxuT1FaYk5NdUxiY3ZYeUlxZ0NzZEpaWHBIN1d6bnZYTHovVzFyR0xUT3NVdkZWUlNORmxvdCs4Tk1PNmZRdkVLWGZPdnNzUzdrSHloMlZCaDR0Ry9tekNQMXZhTG42Y3RncGxXd3hLdFA3Mmo3VDBOQTkrMGQ5bVRXckJ0eUQrT3huTklkRGZQRnVULzhUZVEzQUJIMEtrVHFocDFFKy93akY5VThVOWdZSjZodlVIMEx5SXoxUXBrUXBMLzZia1QxL2l3Mi96QWlZY0hMSXhzUVlzd2cyN0g2TzdHY1poY0NJTFBaUE1zVjNaVmduVXJad3JkNU1obDFrbFNpTm9BYWhQemp0cGVsSGJyUGZmYTZsUHdyZS91bXpzU1VmNmxJaVJibkdGOWNGNVNHaTdYRVdpUWdOc280VE5sUGtRMHJZVC94SWRSUnUxMy9IbVM0TG04N2E0WVdRVi9iZS8xdktZK3U4cUFXQlVDTnhvZzZ4OUdwQThScnZVN1BFTWNOSE8xZUduclBaQmJoajZCY200RTF1akhlMERKczhwL2NoSGlmUFJsdHljYzR3eHQ2TFMvWmJQODlJTWZxbUFXTi9XSE9TTTFHbWZKa0tkZ1A5cVBGSVlzSS9qTS8xSFIxSk8vck1XeE5VejNhS29EdjF1QmZ5ZFZ1aDZteE1KbkRQWlVVSEhrZ2pXbVZCbGNKeWdBZGlZckd0SlRnUEdHSjR5cmQ1eGsxbXBEQ0pyVGpkS1laeG5jSzBSeFF0eC9zcXhNcUltU3RMc2VOTmhLUWR3SkF5aGk3Y1doUFd4ajlzTGNmRHBoYTRnTUZoQ2kzeVJldWc3bWNwNGNJNmxXTzBMT1FGeWlMU2h4TGlOTlNabWYzZVN3YUtRejF1VlN0TG1yRXVKREI1OHBWL2Y3R2lHeFNQejR4ek9GM3BxV3NreUQ2TG9ZMHkxempBWWFUZWJKcERPN0pXNXhUUmJjVDRBd1ZGY1dCVWZaVWo1NjM5L25aV2lyajJWS0x1WEVTc01iWmZGcmROd1VxcWE4NHJqVW0xUUswTUJON1NxaEN6OUYrY2R6elhrZ3JjODZaRFcxN2pTclo0WDJ2OFI5U0lzOUlJVFoxR1ZOSGh0ZU5VRmsrK3JubUdLMlozTHJCWnl1MUhSZnE4YkJqS0NVUW1td1k0ZEtNTWNnRGtrN3VqN1RvUTdtdU5vSzlhbUNDVExINWdiSy93Mk5lZ09Cd1hZNFdjWXVPVzVlMkZ6bitwU0hRMEk0YlhaOWtzN2hLK1RIV29FZUt6dXBqaTR6a2RqR25ydXY4bkM1RUNwS1hweXZ5dkV4eGdnRlprMSsrZ01XNTBoWURZMGRUWXJrL1pVTFArU085dzZsUXZFSk9VYWtLUkxnOWtHcUU4aGxkbi8yekNjdE9Tb2kxRFlLa0txYVRNRFJIb3JxWWFMbmc2c1hsejRVYkx2cDRwRzU2R09kVUZVYzVaRVVPYkxuekF5K2ErZWZUbERkSVBnZ0tTVk9xTUxFK0V6THNwc3kwTG9tU0xFdlQxVS8xcXQ3Y2liaFdCdDVwNzFVcW8vUngvZzFkTXNyYlVRcTdTd0FmeTY5TFhZcENYd0xKRUlzYWVlRmx4UGpJZkZOM1BNa3lIaXpCMkROcnRQeEJ5UFpGRzdxWkZNWjVqUTdST1d2cElaSGw3T0JKZzRZVHJORDBqcC93NE96bGdaTFd5RHpMN0hFZXlqNTkzdVJvSVFvbTV4OGdpdGhabFMzdVJXV3FZcnV0bFVIOHJJblI5OHlPNEJ5R1FMbzJTUTBncmJvR3pqUTF1bndqU1FpajYyUE5zNXVqdTgrL2dIU0hodGFTWkRkNm9kOWVoYks0dmE3ZFJWL3JuWC9YYUJRS3lQbzVEbG9wN0MvZTZ1aDF6U0xmbGRTMlZJTGdXK1NRdWdlTEJXdURvZ2hKMnJiZHRPdHpTei96N1RkRFY1Sm9TVE42ZFU1Vld4UEFkT0c3V1hFQTV4U09ZQVFXZGZJaGtTZ1dDOHZZWlRTY0RYbFExUnNuRW1GdEdlT0tiSjl1YlRYOFlnYVQ2cGUvZWhySWZGZlBCSzlSOEZqa25OVFovYTRaL0RBY1BnNklIMGNiL2F5M0RVV3JzNzMzTGp5Q2szVEV3T1ZRYTd0QWI1VzZYL0c0N0JLenNxV2lITE4yVTBXZG5adWFqMGluUFNlaE0rVCtVOE9sdXVzNFVScFJQNDM3alFlTHRBV2dVZ2ZCdkowUWM1WXhPTTZ0QnNyWWUxa3NMMEttS2UwSzFHbVltNVM5Q04zOW0vUXhkYUZxZ2dzRHZwYkh4ZlByQVVxZjZOMTRUbXZWOFhDSSt6endpNURZbTVGVXdNYUF6YlUwTFZpVTQ1VGFLa2xxTG5lN3hJQjFiUnd2VXVhR2xXTjIrdTF3UlZTeTBxcGJjWmM1ZWZuWlVzMHFGUEFPa1dHNG9ESUl0d25MMHlpZDZkSm02aU1XZE0wVnNDOTlvM0wzQXRHcUltdlpqLzBGaFAzdEFXS21BNUJmZ0hPVENLWExYdGkzbkxXQm1HVERCU3NjdUp1aHhFTDJUMlM3bVhEcExFc1J4ZXJ6NGtqUnhUYXBDbFd4SG96SU5YaUcxY3d1WmsrR2ZydURza2Eyd29rdGtONFdEcmpGb3BWaGQ5YmwwWWlKWHNuL1B6YjhUNzd5WjJXdGpma25wTHdpd2tndnU5TVJHb0k1UGNwNmZHNG9zcVJVakJOTzdMS1hiK2NFcDJ6eFJKNloxQUVMZlB3NUpmcmd3dkdBNFdOelF5TFE2eEJiWmMyT2psdmxPeWMwRVNZUEp1ZVZNK2dHbU8xVnJmSzRvS1ZOQzNndmVXbWtIb1dNMlZCTENNWTFjQUVJVGxNQzQvY25PbFJtT0EzTENFbmZXd2tWNUVQNGR2U1h1NTNyZzAxMm54TU52R0tVVkNtdkZsOWhkVUc1SDllUmVIbmJHUk1jUFp0MUxvd05FR1M5Wjl5Z0l0ZFJEQWtEZ1JsSUJLZ3Q5UkVMN2ttRDJVT05GOTN2S0cvWFFNOFdzSjdua295UGZRN0hMQjk5Q1RsZW1DZjhGZzRzUS9wNXo3ZHBhcFZydWNxVm81RWRCVkZHMGk3WUVxNS8wbG0rQVVGb09SOTl5eFlpMitHQVBCS014QWQySlIwQTFJemNnREhqRnVFZ0RpZHJGWjNQQ3k0YTQxMll1U3dtTnNHWUM1OU93SnZYVkJZZUlTTEdLUlQ4ZVloenA0c2lCbGNwZkRmeHhQUnVkcHB2dUlCVTVOZ1Q0YkY5NU9tWU1ZR3FGam9obHRhUTNlY1ZWTXhmZ0lTVjc1elBWUmRKWGR5cExKSExtZm9mNm9SeUE3OE44R20ySWY0MXNUWE85WjRsOWtNeURXUUxFdllGNHhKa05aSG5KYjRtWTczdzdXUjVub3hYczRmdmNhSHpMOVhGbUk1RDJSWW1EQVNJYUdFTTVJNklCWndFVi9La3IweUgzZDNhUWR3Q1RET1kzQkVCbFV0TjZDZ2V4d1hEL1pmWW5jSHpQZEZ0b1RtaXY4NFdLUW9QL0FpYmR3NDBpamVQQnAzV3hYUTdRSFNOc1M2RkZ4NmY2ZzBsUk1FWnVJaEhJZDlpeW1BTlVaMG5zTXl4N1hMRXQxczVXU0RtSWp3QkdrK0VZR1Y3ajhoRVhUUXZLV3hqbTl2U1FaLzBqejd1cStKUzIzRmJhbFZCcjBMbjEveEQ5OTMvdWpaS3pvUlNJRXdtcHZtTm5zMFdBVmUxZUw0VnRnQXpwQnJSU2RscnBPc0NZWHpOaFdTMXFvUU9jVjNOSlkySGdUdmtvaXBlWXc3WWltTzR2bzBNOXo2NXRENS9WVExIUWN1NUw0ZVRiTGdCRk51NFVvSTFDYjlMaGNHSnNySDRDYWNpTFVwR2pZUzdxa2RpclBCUklvaWZIOFNkS1J4bzBvMTdVNmo2VFJpMXY4QkR2by9rN25QcjVnWkR2L3hKaDAwWlpGc2tSZ3dXeS9valBwQmppaEUxZkVMOEUzTFRaTGh1SG1ZSVN5d2ZveVF0Z3d3MTh5NHlKTmhRZzc4eUZFbjNWMmgyNnV6SXNnb2VESGgyNldBVTFQVkxsRFNtaFdaRjUvcEZlZkNvTWV3eU5maERsYktMU2oybmhNNHN4VU9IUVdjWkJBbVBsSndmNWF2ZlhQNkpUb0FxYTEyMFY1VFpEcyttYnFxcjR2RllwUDFNazBHR2F3a2Zub3lTU0szQ29QaUZEaGFaRU8zS1djYnR6N1VSOUdiaXdnKzFVZHJUWjZMbTlwaDFIa3dmWnNZTk9QMlFsTkNhalMxdjlvYU5IYkE4TnZiZzZUVkViN2FDT2pGazAydW5VTWhnelhXSnBlcVMvdVF2YzNWUGY2Q0V5b25FYW1Ub3V6dTFiOHNDMFZHbVh3WWMyL28zMllQVWM4bVR4K2F0MjZJR0lDL1JjNXlja2xPRmtVcU95WnVUQmlIY1JueG0zVDBvandHa1QwQzlIL0xUWXh0aDZURUxoaEJSQndVUWd0djQzWnMrUlF1cng2Z3ZmdC91N1FUV3krN1lIbXdIb3YzWGRSS1QwTDJmeEhqaE1HakpzMXNQSlNrcVNDM1Jod2MyZVA2K3JRN2U2RG01QTdPZU1QSUxOb2tVTGpNTW4ralJybmJSWVI3R1lQMmMwMkZZK0ZtZStaTkd1ZFQ3NHJVN0JkRHlOaTJLYUdQQ1N0Y29zZ3NhNWdZaWk4NEZydFlqRWpyZmxqSDVNTEluM0l5b2U0ME1oOXlFZjZXZW8rVUtaNnlMQ2o2Y2l6eFhMNS85RG9GYm96TjNvekdqemc2bk0zYmZRVDFlK0Zqczdwa1psYkVWdTU1UFVHZGs3ZjNxaDZkZUZDbUNyK1pxZXZ2NzVIQllGalhWbTd5S0o0eDZRQ0VuU3NKRGVKdHBCODN4Rlh4TEVycmtUTCs0TUdwa3Y1b0E4UWtXU3RmTDl2ZFo1TmNTZkhjdTN0S3pFbE4ydWp0SlVSWmp4TkFxSmRDUmRpYVFxbDZyUHNzbzdSSU1QUTJsUjl3b25XMko3Y3E4NmdmVjc5OExDQ0ZwQ0FJNkUyRm9ueFk1bGdDbmJUNDExMHRKRFpxWGptSnJMRVIrU21pTU5CY0xFNUlvV3M5bzdGZjBTbFFZUlgxbkhjZTZPUzZlTVo1V25MSjlFTzI3QmtIZGk4LzhsNGZmM1pxSzZCdTY5amhTZitlVitka2hGcU9VUUo5aVJiVmJDL0xzdlZJQm1VWWFWN2UxRk9OMTc4aEZ5ZEFiSC9HUUpibWcvZzdZZytsbUhWNnRsbmlRdXM4WEowYmNXeGhjVmNkUmUxVDhQa3p0MzNjWnFYTS9EN2pUdGZGb0JCVyt3c2QxNHhuWitxRmFRdWFQV0FmUmg2RjRyNllqUEFPbjBSODB3Y0x3YmVXVXdRcGYvUGl0MHh0YVFHUHQrcmthd1hPM0Z2OERLZTVxVFlHOGtyYkx5RGdyanI1N0R6Vmo1UmloWUZkT3NwNFdVL210Ui8xY0hOdm5kRHl3R2poNkRQRFJOSGhjVjI0YmZ5Ukd4bDF1QXV0cDBvL0hhMStuOW9XSHpPZkxsL3ZxUklrQ0tzQzh3ZVFueHkrSkplREFqRTNsQzBJSXVwYlRJd1A5SERxNFFzc3l6bWFIMmtuMlJyUXcvYzUvL0hHY2hzb1dBYkc5bHd3WEtNQ3YyNjcxVmZlRTJmb2h3ak5NN2pMMGJ5c1pJUXltMlBvTFFRdm13ank5bmQ1N2Q4dVRXNy80ZUpzRlZnZEdyRUNXdzVPWTdRRlVZSHlSTGU3TDJwRUkyTDFMM1FUeXVPK1JYSHlORHdGQkRrL0grNFdKOFpuR2dwWVlNOTdmT25BYlZrS3ZwOUFvNnk2NWdJRWNERGdZZkhtNEhnYng2VmMwcTMvbVNUWjY0Q25TUWN0bTlUMUQ3bGVqc0lvUVJ6dXVpTExmNERkdWJKOGNYMithOVFWcWl3NEs1SHRzY291SU83NFlCRU5OMGVsbXE0RzZMbDR0NVdMWWUwQmVHZGxJL3dyaitPb0MvNlJJbkMrYkxFblg3YWlFU3lDbVRGWXJBdDhlSTlvY1RoWmR3SXY5VVlrWWU0ZXhraGpQZkQwODU0Qkk0MmtCWDFQcnZQNTNMMFMxOEl5VWcveWhxT1F1Mm5FNjRuYjlRS0lqV1BNcWx4a0RwVDU5aytLTmVSQ0p1MVVWVzc3VEJKSWtrTFIzMUE1YTlEekVNU3NHTjNQZUVQWXozYjNLVGlVeVB3SWo4d2RVeXppTDE1cHpIWjE2K20vOEdZenh3NG1SQ3ZmTWlrZkcxS3U0bmNEaDVEZDlNdmxjREROZzh3cHNKYTBpOUJKVHdzZHBxTXlwcjVQQUdMOEtGY0ZlWUFuUUk1NVFhRzU2aVpSTllKRk0yZjUzV1lTQ3VKZ3IwKy94R3lnVjdCeHFMTDZibDZoN1lOWDZadWFqSHdNUjZQOG8vZkhwMHVEenVRbzdYQU9RQ3VuS0pyNkZjVUl0VDF1MWErSGNxUHkvSVRRS3JhZzIzbXpaSTR4UUxadnhPWXlHdm9vOVloOTl1bkdEQ2dFN1JqSGwyU3VyWkRnSjRPYzNmeEZpQkRVcENyV0h4ckxJcEVuczcwcUZxODB4M2N2cDRnL2I4VUNvQ20xZDBnU2E3eFhUVmdwejliTnpGZWVJdzhlZ3hjZFZxMU1kYXMxSHFHNUNOTVVib3dldVpLWVdjdU5LMFM0UXlwWkpnWXFudFo3VXIrUlRHSlZITTVUYzVUU3A3N2J6VisxaEdhd3hPRHM4UVNScWdyUmovSWFCVEJ1SVJFLzJ5d2tuQ3N2ajhyUE9yN0FKTUxQSW9aakN0RFJOWURhZmQ1SEsrNWMxYW0rN1hYK0c5eVBOWDZFVmhzMXgyczBVNjF0cVlSS0lVNU9ONjZzcG8vb3RXSEttT2hUN1lYT2hRWG45TmNhTVk0ZlRyemVSM0NjNDRTNXRpMEloVVJLdElKV0hDb2svb21KVUhVQW1oeTkzUWgrYVc4ZFNEakI3cGVhYTlXcFBjYU1PU21QeWp5bzE2UndSQS8yNmtodHhVZHI5R0xQMUZscVY0d0hPbUxHTFBhTkJOQU90QzBOeDFPVDRYVHIxUzBtczhPVVVrMUZETmZMbkRyWEdoV254RHNybFM3aXYwYVk2R05CU1NTaFNxL3dHNHMreHdNTnFSOWQyK2VLdlo5NGttVExuZ29xelNvRHRZTDB6d0JnS05HQWxOMmE1cFI0N1BNOWVpUHptVTNyU2ZWVGRIUHN5WEV2aG9HMUEvckNQUm1Pck5EMDJaTmF3TDZmSzRHNkV4RER0VkJNei9RMllwckgzZDFsN05ST0M0WnVFZy9qUWtiMU9pOElMUS92T3BIMk5MZVhsYnBFNWtMQmNRd1JLQlRtMVFxNVNKdkFHT0FQdUY5elkxTkU1Z1N6dFZvNzQ1ZmExK1EvSzZWY3RMaUdXc2ZZbE1PN1ROS3ZNMzBJZGpmbVJnellMbXpRekhyVVRGUXh5V2x3UnUzQmVOVjF4bHFrOUZwcWpqU3haUllhZkxwOHAwUi9GL3JCa2E3Yi9DeGZPaU5aNXgrZytCa2tqUXhiRk14UmljSmdZUXRaV1RIaTZwOVZjY2NvVHlyd0EydWVWQnZMVVEvbTU4OWk1K2ZMbElwdUJzQTFxS0YvUmdGWk1iNkloY1NiNExIdHF0a1VuK1VGYmhEU3FWdnB3Si9MbUlQUjB3LzMxR3RrbXN4K2duL0VJekZyM1FBK2lmaDJXaiswbXkxZ3NGWXdJZmZFOXZlc2QxTjl6YzNCMDhKTXpZWXBXaHQvaEhVcEZYdWJnOW96bVVOU2h4VU5VNkVDbURCK0FjQVlaRjhrT1JlcUFaRjBkV1BsSmgreGNLb2VtdDNkaVNmaTRSKzExY2Q1RXZlQy9wcVF6ZlhDZ0NiMkorbWdQTEVlYmN5QXZjOC85bExMTnRXRWdtOHVwU3drZXBkTlRXaUJFWmNmb0xhY3duRWZIbEtRNFRWZFhLNTJ1N1FkZmx6bmpuaTRaZlB6MDhMZThNL3JrWW9sZjJKclpRM0dzRmZUcHNSWWhxM1JIaXY4SHJ1YTMrK2k3SEJQakx4RW1ISVFTQmU1WU1vNVhib0x0bXBkNWdYdEhCZnpnR2V5VEhqU21BZDJqTGxxYXFFamR0VkVmbUorQTA4c0d0alpqR1pnbkF3WWVteERYclpROFFCMnM2MGtiZWl6ajE0YUVjakdQckNFRVkycGlHRmtYZU9IbkVjODBVb0o1NWdqVXZUTTJFQlA1UUdYa1pTc3FpQkhhTGFnVHRCS1k4MUcyb3pqWFM5WHA0a1NZc3BEMTluWjZsVENObG0rQmk1bHd5T2dxL2h4VkttZXJ4c3BycWhaUHo4T3pZb2d2UnJvWHRqM3ZiNmc2Q0pRbTVHdHo5RE9aSE5MN0hXS2V4bzF6VEYvQ2s1Z0t6MWxnREkyNjVBS1I5QnRzOXh2WW9jbms4U29YMmJVQU1OREJUZ3l6SVdTcmVhZGZvbnRJOFdKSW8yMnhISXVPWUtzYUpJcU9aclNSRXhya2FqVEYwWnBvUEI2WlA4UlBuUGxnTnJiR1JwUDIrR1g4WGpTdVNKYisxRlRQaUtVMEVQTkNBV1RLOVh1alRkc2g0WVBENlRDRE0xTjVMYjVidm95U0I5dnZWaUhxeWp5aEc0aWd0ZWVVN3ZHSDlKaUkyaFBoTGJXNkpPOEVjRUloWlRRUXhKWkpPSzNqSUhDa3g0QkE5cElsazY3WkFpeXRtMUNvdmVIY3RLTUh1WFJuOWx2elZ5NUdCQVJWZ3B2c0Y2Q0pidnN2VjVqMGdqWVZEcGFGWVVnQ3FoQzZrekpxbXI0V0xtUzFpUWMrY3BZaTR2bmxBckowZW92QWdZSGFHZ1pwWHN6TTFSb2tLRXFqRW5TQWRubVppcGl5NVhPRXBVRnJyTTZuOTh5M2Rrd1Y1dk5QU2hwUWZpTzNaSGErdXQrUHNJa2ptaTlFMi92Wms3NnBnTlBOTTJxUEFzaHl3U29VSEtSSERPYUJJMUprWStEYnJJcWJRL05YenRjVVpzY3BYMzRkTkhpaTVncFdxSnA0bzFsVXpQWEJ1alEzNFB6Z2JmRHZXOGptdnhBSjJJbEF5WTR1cktDeGZNOTFNNVBkY3BHVE9HNW1ZcCtTbmdMRTQ2MEdzTklpelpDK1RidWVNZmN5dmZoN2JwMGd0Q29KUDk0MGZYWFlGZlE0NUZPY21EYzdjbFZxc25DdWxmcCtIakI4eXJrYVF2TEM4c05ta3VqcTVqTkpFbTRMdnBQRWV6ZHl2MVdPZmVyWitRWXlEYkUvM1RWS04wY0dmdFFTbG1kNE45NWZHZmlMRE9PdWtpVm1sQlVXVjFwdVJ1bUZ2ZVpBQmFvV1ArWDMrangzOU9QRmt1M3dhcGZTOThrUFN2K3hXa013b0p6MnFNM2s5aWZLMkUzZDE5WkdWc2Zaay80RWZEUWNJQjY0UXNuRGlRK2pSMEFteDkwcWhaNWdDNXFnSXJFOGU1cUt6enJDY1I4aXloUURubDZIREhIQUlCWW5zaUFXdDdnQW41eDlzTWR6OERhUzBjUlNDWEhveSsyaGZiTkc5SEtIY3YwNkxqcGFoMTdZQ2dxelBqRDJiY1cvSk01emNsYnU4RkJqQXZidFREWHdWdVpDWjhLZzNRTXU2OUc2cjJickhYV2V5ajdqclhXM2RBVmI0anFFdXlVR3VTR2pFQXNJa0FzM0E5akJueUNVSmtNSE1qT1FJanRxekFXWmxyejI0cEJLdTdSMkpqMVBqbXQrSFBObWR6MHlRS2IwdkNPYUplNFk5Y2VyOElCTDEzZFhQME9iWjFpM2k4L3B6ZWhjTUxGemhMdEN2UWk2c21DeGxXOHBoNTBSWXZ0c2traUFFaWhNMWNadk5VNWFYbFNTWlVmVkM2WXpMM010YTlGMldSLzk3d2sxc1cwWHkxTDRPQUMyYmtMOG5sWG9OSzgzc3FsZzBXd0N0ck95eDZmN1hSWWlxbksvU2cxL0dtaVRrS09GT1c0Y0dqWXhzYkNRZmwwaUtqQzAvY1lrRExrb2J3cEZ0bmtGejNPWU1pYzNjZnlYdHluQVJhOG5YbTZBYStEZktsbFhlKzlwUG5NOFdBQWhlUEI3TngwWUpvakRvcG1wWmR4N0IwT3FlL2hJc2wwVmJQVFdyZlB2S2pUUk1Na21CMkVEMEFqemxQSFJoTUpCTllzeTVnV2hObElPSHlHalZ4Y1doaURPclFHUW5XZjg1R2dmWXpyZ0M1UlBkYjh1MnhnOTl3VzR4L1pld2p2aFQ2NnVNZzQ2d29RaXVKenBSb2RIcHZQblhXeUdIZXhONzdVWXNIemgyb2lOWnFaRHpvQTRlZzhNb3FMdmZhRWNocldrWHNiTjI2clk0MEZlQTdrWVZpeWtQRjV5MTVnY01QY2Jrd3lQcHNZTUR4akFjY0I1a3dob01VdEFmTjJ5MXhpMVp6YzNjb2RIdHNycWFmMDJicUgwdVdJNmxXZjh3dWFRVXM3VTNHT0l2VkxaanZMODRGNVdWVXhzY2NPMzVqMjBoNXI1eVZjVU53b3hmYnMvbitucW40d2lSbUFubmlseklPUm1QWmNEVHJkUHoxZXVWL08rRVVDRHJnQzJEZ1k0RlI0U0lWOHB0UGFqTCtaUzc5YzNOaURDeit6c0ltQ3ZIVUNISUVaUWxqdUxvckJnUmdLSW0zV01GeGFEZlI5aDRyU1VzL2N6eU4rRmo2cldGWjlHajdKUTFnVEZzeDNFTnRoUWVPSjNGRE1lSDZ4aVhxMEcxVmFXQktuL1d5Q1lZWUhvWm42WEo4aW5YOVZsOUJEdGduTmkyUGJsTFl1TkV6Ryt1Z2M0eFZ1empsN2dDWHdIWDFmTzFNcENSNHA1Y3FTWlNqYkFJcEw0bktTMGFDUW8rOUpKREJUQjRpQ3FqVE0xL254ejAzREhtYWtsRXl2VmhFTXRRM3l6R3pkSnM3SWRnRHl2RjN1TFlobFc4cHJsVHdGVWxXQVc3c0dGWjYrVVhRcGFhck8wc29LTEwyRVVoNitvSDVPMUttSnFTVVRIQkw3Zld6UGY3Tlp2ODdNOUJZSDJCM1pWN0NIQ2cyYUhtajVtVFR6eXE2NGtjMjNFcWhVeWFzWFNFNGZGWFhUQjY3cHhIaENXVDBmckZ3OU1PS1o4NjgrN2JMWWMrYjdFSXduYzAvYUQxZW1VWTZSbkhzVzdjWmhwbmJxRiszSlhrekFHSm9ncnJOSEFVanN6QzBNMVBaYlBTcnBlZGxrS3FjWEh3R292aWl3S3FONGdwSlNVbkFtc3VFR0hRa0RRY1YzaElCdytZMVJ2THZ0bktCRmNmNE1XVkRnL1pWbmFKazh5S0N1aTZGUTdwclRZMDMvTEFsbmZNZ0VTRmFYMDlNNHBCbnhYUGxwM0ljeityclJVTkxPZUZRdkVtamNDWDNTNlV5MHU1aDZVN3lESWpQSzNldjBTZ0crcTN1TWZzSld2VTc2aUI0Um1TNUplSkx3dU5VMlBlZUI0N2M1eTZsWmxmcXZlWElJQzdkZnVWRUJ5QTBueCtFMk94R2drUUxiRFhSL0ZRWE5JbWp1Nmp4UmMvUzduTXUzT3hkOG9TU3JBa2hmTXZCTkI1NjdQMXFkZkxrRXM0eFk5QTNOSW5RTjI4V25RSXpnbHV1WmVoeTRobEFNMk1EWEpRYWEyMHJWcGV3bm05aUpPTjFRM1l2SVdvNmxmZUEvMTRNZzZkTTA5SjdmRTR2dXA4YTBCek56VUxBdkg4MXQ5WkpCeFoweEUrSm5TUzZrSVkrK0JiVGVkU3Z1MHBRTXdHV0pIWTdMS3lULzlvVGxXNSs3b3RseU5QcXY5NmNmT3VkbnFyaERDOHltN1FhY2ZEc3F0RVFQaTFOd0lqU0twRk5oTVZmdjE4ZXBnN3RObU1Uc1owVlBIMEY0Z2FOU2ZzQWpxbXpWSzhtMG1ISHVKM3ZLM2FMTGNESWh3SzdBbUl2REZMb0RRN2lNaHVuQURwNzJGM1FBdjFzaW5MRlVseVEraXR5cVlOQkdJa0lxR2F5SFRDbXh6ZHpZMkVwN2RjeHErRkliWUhWNlFTcDV6c0NkeXdTbGJOYng1V2RDTGNZU1VULzJ5alRldVYrclNnQW55YnhPcVJMUzNHeEorbHdrT2pRUG9Md3FUNGR1UU04WERqVmJ2dDZpaDNOQ3ByWjhGRWFESjgreDh5cEV5SEVWakx1bEZidXphRUF4Vks4cEZDdWFJNTIvczAxdWFNWjdRdGtBMUExM0VvRk5IUDMxQmw1aDFpNFN4VUo0WmVSeDhGc0FPUGxUYkJhRjZ4SWVkQVJyNytKOEZzb2RlWmQ5enJFak1ibmZqVEExWHR6TG9HQmxTd1dOcmx3WWhtdEU0OCszTkllNndLcEdzYVFybjVNaEZpdSs1Qmd5TzNqbjduaUZSSVZQRWZMUmhqYURSVnZnWHJTbEkzUlQ2ZXp6SlV2ci9mQzgxSEVwcys1K3NQQm1jWTF0QnhmZEZKZ0MybDNhVi9NZS9WWGF4M3M0MXhlWnVFd1dKVzNOOGlzZngxRmQwcVgxckdRMWxJSmhDdkxwSGRMdTRlQ0t6a3FoTUpVYW16SEQxQnFNT1lSNWhEQW01MWE2aXlicGViTHdyMml6YlVWMlRkSEVYR1ppSnNXMmlBZGlBMTRnNi82OVhWU3dUTWdkQlZUemYrVm56S1daUW95S2laUWRlVjVUdG9jbm9CUGdmOFhqRjJmOXpYN0ZwQVZtd3pxVEE5UEhqQ0pIOWRGUEIwK1ZTYkd4NWFhbDd0NWVOTFZPWTVKbnVBUkwvYVhSUzdTbmpWTXNobkszbTFaemhHNGVXTVd1TUE3aXQ2WTU2c3VmNWZwejhNZ21idDZiMWM3RzloQnJ5eUhTU3FzWGZkOVBsRm5XeFp3Rm8xOXo1MG5LRk02M1g3VmRGV2FDYmhyUllRTVlwemYya3hVaVQ3dGx1RXBsV2pNTHBoVWJRdk4vdTgrbGxTcmdFelZlL3hZNnpnSGJRMW5Rby96a2RBeFRSc3dpd2JRNG51VXBIQlhrc2xZeEJ4Y1ZxYzNOcVpNUGZPWGNGNXFvVy81T21LajlPS1N1YUtRVFB4TDh1d0RyWUJMR3ZwRlJjQ1NlSFp3N0ZoY2cwT0VERzZEUFpUMFZYZ0MrVVJSRXhkb25kRktpUk4vRXFvL3B6VEtEVVNDYld4ckFkazJrVWxYMnlKaW5OZXNSZGJiTzZHcmVaeFN2NUpEUFFoN2xlcXlUVjRERHlneWdnUHhPUFI4QW55U0g3L0ZXNWtoaWV2cW1QeHY2VkNWbExjaDhrWjgrcHhZMFd0eUNxa3hrOGRQcitlcjRhaW10ZGJLTFdzVVVZMm5aNU4yckdScUVsMU5KeFljdFVPejRXamVmZk1hWDNrVmRUbUlKeE1MS1pDWWFQelFhenEwSWNSOGhCaERKd2cxbVI4SUdoR0N3UVpnaHc4dzQrb25aY1VWM0tOeDNoOGdHMjhmR2hzR3hsRDZ1bDY2eWJXS2EyMGhSQ3h6UXdiVGNaYjBoMW05NW1qUWRUMEpJcWpZLzhpcURNVE9XKzY5TnJ1UjFibEJia1k5WnRaeTBLdEpmR1lnaVI5OHE1bDlOSlBUSEpOMzhVamdlSGNZMXYvSFVwTk84cDVHSWxHRERIS3RVb1FqTWExYTI5RkFpQ1BWS0k4N1VqSUNsKyttcUlHd3JxMm5QNXg0SlRqL0cxRUxWVXo2Y0RmbUd4R1dxVGh5V2pGbUsrL3pZdHlRc3lHckNycm1MUUI4NVNiTysvdXhkb3V5d1Vlci8rQ2pXcnNReTg2SjVRWXA0em02WXErSFA5eUcra0QvMzNObmY0NXFFd3FJb1ROUGs1ckJIdnJGd056dTN5WHB3NzFINjFSYzN6RmluUlQ1MndrZHdVb1YyU0QrOFRnZXFJYXdmWGlreWlTQmVKeWh6RGhxWndHN1FJdWswSHdxUllZSTlpYy9QQTZwSE8xR0ROUXpCK3E5VXNBYkFjck5FUW55MlZRMGVmclluVnFpL2tsaDY3dDd0dkNCVkw0TTVCRTFsMit0a2IyZzdLM1R4MHZZQXUwVmt2TVJ5UHpiMmh3c2MzQno2WG1kTnBlNittSjZjZnJrWmFqOUNXUCtRdEhodDlwcXNEbnV3MFp6UDVrcHI2NytMeTQ5bURWaS9jQ3crc2FkNG8vNVhlT011alVReVROanZzR0RleldqY2pGSnlUbXZ4REwyN2c1dTMrMDZvYnFZT0NRUzZ4My9iTnk1UzRGa3NSbHU2V0pBbkFQbGNqTlJtMnc4bEJjS250VHp0d29tUEdXelNGTnJRUXlhTHZXK0VnYVlCLzVEdTJlNzFyWFlUV2NDU0J5Yk0wSlNDZThzWkJMa2tvbzlCVDBMTmREeUczVVhSOTlDdURmRUZobFM4R2JFdVhQNDAzbUFQZ29sNkFRVG9lNXptRVpEMUZLajc1Q05ZWWlmT2NXN2FzL3dBOFFueEJRYkllSUxYS3FGZC9GMmJ3dWNmOTFXY25MbXBMbGVvNmdUQXNkRXZTMzJmR1Uxd1p2WVVJUmYycGE3NzNpQWJyaWk3dFNjVDd5T3dOa2dpb01XNlAwSzZTOENJYWlnaTg1NGZKWGFHbkxCSVdINVVzNDIrV3d5dXpBQjVMeGdzcXdaeWVzQ1FFaDR4dGNiYm5WZFBJMGlKa2U0dXhDM2k5Nk8vejhPV3dJRkM3QXpxVFFoU3hWSTRVeVZxVmh6ekdDZDgwU0s0eFlXcmNmeEdXTlI4LzZ5Z0d1MU5PRkt6UGFxdU9ZUEVtcm00dDFFdGZRdUY1R2ZKNUVNWFJ0cnhHaUZLUmxLaFpSeXVCaU5xNXBBLzBReTIrNVNYTFh4dWdpTVpaNmFZZ3c1Vnc2N2FhWXFaZ0YzMkxURjhHSHcwWTNDaTRsQzlzN2FZUWdqeW80WHU3TEJGTU9NVTVoallqSDV2a2RHcEk0cUwwMVJ3WGtzbWM2RWJGZ2FCNjYyWnlYeFJFbjA5cUhyVjVDZ1daL29RMHVTZVFlZm45UVgvZXRmcVdyWmY5UEw1dWdOV0NQNGJpVUt1cnpPbk9kU2k0VC8wVFp5VlpMc1IrYXFlcFVHWngyUjhNQlhkRGs2N0I4cmlHRHNVQU4vY1N6MmJWaTdqdnduMG5LMkpMMVhKbGxJbkZzTEJhSzN6UkUyWWhZUXBKT2VWZ01KY2Z3VFltSThOQVoraHd2aXA4eStoNEdScFZhVUxHWUlOeEtMTnBWa3FTaEFSRjJhdWlKbU1BSXMyamZxQ2hwdkR2VVNweTd6VGhXb1dKeCtSak9ZUGo3dDZiSEJUUWx5UGl3ZWowckhMQjlZYnZyWmpidWtEbEVHYzN4UmRBM04vbVdTVmRFbTJhY2JlL1hFMU9sZFBaeTZOd0xoaGVyVzNzM1pIM0RPNzZvSERVVG01dEg5YkU5WURMMWRXK0JqeUJ5SkQydTBZM3VCVUZpL2ZzWUxFNGQ1dGhEckRGbW5BVmJ6Njk1U0VUYVBHUERMbUlHR0xvT2xDOHl5cFZLSG4xdS9uckxuZ3pOR21QVXRpOEozSVRxRXp6V2NiakkvY0RIc0c1bWZIV3FocW9zbHRVS08xLzVteFFnSFJCaDRyQTRzR1FETmN2TVRoelkvRFhMSFZIakdremhRZDFLQjVUSm81NThGRzJQaThSVEp4dHpPNWtQeTJaRkYwOGF3Z2tnamQ3RUd3N21SMGU5RFZUbm0vYU01UHBsTlc2NGZzVDRSVG9XYnBseFlFTERRZ29qVkpneGJjeGRWSy9pYUZjSEdpS2ZpMDVsSTRjL2tHN242djV1VUdpMHIraGtsaUdRbEswVzdTcHQ2dE5ZeFVmNFg3V3I0TUY0Y056WG1TUTdBZkpuWlF6SW96UHAydlVPclE3RUtneXRWVXNBNWJ4amVkakJGUVQwKytnbXNpMEJIM0l1Tmd1QjcyZE05VDVTazY0aE5BWExuYVp1c0ZmUlhnSjg5UnF1ZTRpMjNyZVJadVBwTVZLQ2pjVGk4VnR6enBNejFGTTV1Z0JNV1JsM256MmJJNzNsUUFGRUhjY1JvcGhhWW1aelpuMlZYSUw5ZXNyOWVpTU9Yb3hnSXdUNnQza1AxTkpaMzdROFQyU0MyaHZiT29SZ0lvLzNXVDBjVDgyblJYMWhpSUN6Yi90dHMwS1MzY3hSZlBTclBxNzdEREdncEFKNHMvbklobHRqaklzeTUvUCtMR2NFTnZ4ZG9XUEk4LzhMOHg4SHNncXNSYW5ncUFEajFoTU9ZWEN5RGQrTFVUZUNWU21sUDY0S2UyVDhOaWVBWlhybjJxY1VqaGsveWMyUjZFSFpPcW1GZDNBeGU5T2RMZGs1bXVmVlJLQXNnRmxFbUdHK3dDNDRqY3dVNUtoVmZDTHJJb1BTMk8vaFhENkhwOFVZM1FXbnovNTEvVWpvRTZ4c0NJQ2J6Mi9ob1ZYWHh1bEZ6b2NIYmVmMytvQmVPVkdCQ3NoRmFBTFlqc0lEVGprVVIxL0ovV2xLaUxFZi9Za284Z0cvTHFqdUVVbnl6THU1V09ySjQvOTFOd1BtS1laQVdCbjB1L056eXFoOC93QXdaNHptTGxUNHJwSzRqTHYxSGlxcUtlNFdZM3NRTVhqWWdEZjhxc2E3YlZrTTZBSzBoRGlTVkZKWmQraUFEZ0NadzQ4N2pwUHIrSVB0VkhBaU5sdm4wN1NmajZFbVpOc2pmREQ5dUZJM1pmY2FRK2NDK241aVNtRjZ4aHlOSnZHM081YTFadlV3bGd1NmtHTDNZblJjMTRxMXE1UkJ2Uzh1YTRGV1lRLzdUSjF3VXd6czlxUzlDZ1EzbGRpZ2pwMEdCcjRhSmZBdGU1WVNYb2UvMnNTMUJidk43Zm5uWWdvSHpBV081Vml5Z0lBRTgyay9Ea1ViSG9QVGdpYXRsRk1CeW1DTStNUXhRSDFhV1c1TjlRS2EzVmFaQnk5VWh3R2I4LzhxNFdIUzBSWFpJUnFTVFFGNGt0eEJHL084WnFZcklJZkdURDBPZDZPSmRlek5YMkFWM2FFNzBPVnduWFloZXJiNFlXQkMxcXVXZ1hTNzZ6MEF4YVdsanRPRVg0Z09sNmZjdjZYZ3lVT2ZoUTRhUnFKZmd0RXhZTnkxemNuQ3hoL0ZmQlBhQnZ4U3BKS1VGQkh6MmgxSHZ2a2JMWnZNcnpsVXdWTzZId2JHZHlPamJvZHk4QWZBVUdEYzFDTDBzY0JlTjZGWDhHbENzYURuYkgwTjgwbVo5ZDVVOTc3Q0FLTW9PdU5MWHVoaVppMDhNOHlYVXI1WUF0aGgwbGk2anpzaEc2aUhqaytQZ2Q2Y1NwNWk5MUgvTm11cE9uN0RUWFhZSHA0YWR0OU8rWkJNTVhQeWpvOGgya01YbFpuZ3VVSThnVEpYS2kxRzdFWU1EVkY4REwrTlRRWEVidkRuNWVrV0FtUXFmV0hHNEtKR21EUS9aYXNyNisrODVOUVFOVDM2Y1NNODZDcENKVGM2TW8vbyt4eXIxZTBuSmxabmxIaFhTVktvREV5cjRsL1lZUGFmODluT1BKQVdobjArTy9IMDhoNllDc0t6R2hWSzdwSjNUV1lOM1hyclZId1crMWJGMzhJZFd2V2l5QUZWbWhQQ0lzRjIrMEFRVGJiVDYxSjNSS3NuSUJZZ09NV0J5aG44T2cyZHdDUXNhdFZsbTJRODFLTUViMnRqditaM2pScTgvWi9sVytkSzliSEs5KzE0eG12c3B0eVFGVHRsWE9IUHEzYndzakJNbDRMOFk5cmNaRVA1cStlUEk1RjVLaENTVURBanhQOFFFUkpVK2wwcElrYWJidXVlVkNHSlNwOW12OVhkMEJieG0vNjNIeW5jejc2L05MV2VQUzl0ZlFEV3p5eDVpcURsd1A2eStqei9MSGcyWmEwbXpFYnNmU1JLZ1czb3VRbEhTZWNmMVcrUTlsQjkxZzZSbmdqSTZkcndTNUR0ZHRMeTNpSVQ2dzExbmVlNGgrU2creDR4emZ4MlB3ZHljYkczNWxGcDIrQnFneGpyUWFtQXJuUlBybU05Rm4zL0ZFSXR3dzBJVi9mTTB0UE9SWFZUcXR6UzlkaHpWcWNnaHNyMDRwWU1xOEFWQVJPa2tVMXFpa3YvRmkzMUNGN1p5a0FBY0lCSnVzSFBtMXZ5RlFpcFNKVG5XRjV3WVpLeTZaR3ZUYnYrTnZ4eG5lb1UwOTJkQmV3aHg4K3MrdVU5VTlaOVJFWUdpQzBtUFlpdnMzem5pZzJOb1dXcWdZOHBJYnBJOUpXbTNXWkQ2eEU1RnJ4SEZxMkV0bWZFbHV2bHJFTTUwRlN6S2JCSVQ3V280TytmSGlaSE1ZK2xEUGRUckxBbjduL2V3NURZWWhyKzJaZVJmdmJuMmkrSG92dEZRS3RjR0ZWK0RXbXZHaWNWdXR1enNuUnVXLzBscnc4R3QwZ2QrL1BPTitiZW5xMCttbzFpWENQdVdkeGNqT1ExZFlhZml4RExYUVJ6TkVVYWlnK0p1K1l2b0hhZEJMNFFlRHJFenFJWTNxSjlzZ1VkWVJBZWFrVkgvQVU4QjVsYU03UWFNbE5TMWhtTFNPNjU1bjJvdGFFYmlGN3RjWm02SzlBaTVrc081UFAvZHZYT0dmd0hMRXowWFg1aFErcUo3VVlpc0toR2Z6ZnRxaCtWSFl6Q3Z6Q2RhdUdydEJ2d1R5N29qTHAvUWV5bk5ndlo3UithWW1WdSt1RHVRaE5HNnF3NHdzbDAwTVBFU0RHa0llVVhyTjZNYzloV2ZsSkxMdndYMFhwZ3ZZYjg4V1BzU2RKMXcxRzk5NzhPVGhFQWRNVys5V1BtcnQ5QjNSUUc5aXVYaHhXcTNRbUorTmtCK3FubzBtMUlKZGw0M3IydWxaeTQ3ZUR0Q3NZY1ZlTmdOV1l2d2lkVm4rR3VZWVpULzM4Mmc1T0xxQWFiWCtUSFhuVFRzeklXRVV3MGliZ0RNVkkyZVJBY0MxdFJzVlJ6MEJWR3E1aEJTdEFXTXdSdGVjYmdPMnozaG9RZE9xTnJJRS9kVUVNM3BpblVlWlczSlI1c24yMHI2enNJVGhiUmN4RGUydXpiK2JxUnM4QXBLTHNxTEZXN253OHVNYklubzlLaFVLU0syRzMzWldVczkwTDNhNGgxQm5FaHkwMjg3SFd4TnNhNWZwMmJUdGNOSVp0N3pqN2Vxcy9HVldlY3BXSzZXaS9BYjNtQU1hWU5mN3MxZmxFVENUR0pSLzlDcUljTkE1N2NwcnlVWXpzZkFnYmNpdUVPOEpOYVVaUUdPMWpPZ2kzWjM5WDZnWTZaVnI1OWxTekFDT293ejhrRzUyY0tJY2wvcThQSzBFSUI3bS9kUVFSRythUDlkNCtjZUxxN3I2ODJubEFheWJhUTlPd3ZZVDBhL1BUY3NwMDk2dUNTZXZYQWVpTlpXWVJzRGFHaG5kMmVJYVVsTkYxcllpTGRpV3JwbmN6bU1ZL3pNdm5MZi9tcUxtVHJjdCtLNkRUVEVPSi9ha2dFc0dFaWpzakpWQUFybndvdVphOEJDV0xqdmRLNjlERzRsYUpINUNkaC9FeSt6TGRGMXdIb0ZqQk1SZUZPRkhyVzNNcDFObTlJUWZ3TTVrK1hrK1p3WE5JaFRkY2xZZ2hkaHVxM21MQ2RHUk42WUw2NVBrcVdoU00rMk5OY2pFWFN5U1c2R2RDWFhOUTJkU3hjSGFVaGhaRUNNa1hoU0NhNmFvOWk5bVlxVGVBSFRqWUpsYytIT1c1cnZoK1F6V2ZGb2FHL2NPUUtsbkdselVxSk1RcjE3T09kNnVUNXJ3ckltcXZ0RG9XUVlDMTZLZFVhMy8vWjwvQkRCPgogICAgPC9CSVI-CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I-MTwvTWFqb3I-CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24-CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9DQkVGRlZlcnNpb24-CiAgICAgICAgPEJJUkluZm8-CiAgICAgICAgICAgIDxJbnRlZ3JpdHk-ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8-CiAgICAgICAgPEJEQkluZm8-CiAgICAgICAgICAgIDxGb3JtYXQ-CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24-CiAgICAgICAgICAgICAgICA8VHlwZT45PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU-SXJpczwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU-TGVmdDwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw-CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk-CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU-CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT4xMDA8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk-CiAgICAgICAgPC9CREJJbmZvPgoJCTxCREI-U1VsU0FEQXlNQUFBQU5pTEFBRUFBUUFBMkhzSDVnd1dEaVlXQStJQmMxOHdCZ0ZnQUFBQUFBQUJBZ01LUUFHaEFUa0lBQUQvLy8vL0FBQUFBQUFBQUFBQUFBQUFBQURZUWdBQUFBeHFVQ0FnRFFxSENnQUFBQlJtZEhsd2FuQXlJQUFBQUFCcWNESWdBQUFBTFdwd01tZ0FBQUFXYVdoa2NnQUFBVGtBQUFHaEFBRUhCd0FBQUFBQUQyTnZiSElCQUFBQUFBQVJBQUFBQUdwd01tUC9ULzlSQUNrQUFBQUFBYUVBQUFFNUFBQUFBQUFBQUFBQUFBR2hBQUFCT1FBQUFBQUFBQUFBQUFFSEFRSC9aQUFqQUFGRGNtVmhkRzl5T2lCS1lYTlFaWElnVm1WeWMybHZiaUF4TGprd01DNHgvMUlBREFBQUFBRUFCUVFFQUFIL1hBQVRRRUJJU0ZCSVNGQklTRkJJU0ZCSVNGRC9rQUFLQUFBQUFOZDJBQUgvazk5OUhHRVNMQzBiL1pZWllxVjNuUVZ4TUFXbXpYeHFEVWhlNFhZaDk3V0RISCtoR2RMV2c0bGI0elVrSlIxMFkrUjYzaTBSenl1cFc5N0VXb3RHNnRpUy9TN0JQTW9qMEFKWVpRUzQyOHU5VlJodkJHQ3p4dTIxWVhUYnpqcWpzcVhpSGhBeXBjRTkyRDRrUmxpd3FuSXE2M2l4OU9VNGE1Mm5INVEzVHZKbXVQYk9BTGkxMktTdXFNTXlGZHlqbGIvSDJOOGZZN3creHVCdEU0Ry9lblRvelg2d215SlVBSlltNWZ6SE5OcERmSTdkNWo5NFB6SEJ5eUFqQzBvRCtDeHhtRXhwL3diMENRWktMOFZiMnZyNlhXeERmaHB4ZnpYK0JBMVhUeGJBZjFzdytvOXFkWEdBVkpKRDBwQ3FqSlpSKzhXV09sYmdZSWRzbk1jSS8yaGUweTZwNUhzVVdkb0hUdUxvY1V5YlFBNUU1WUJramlvVXFHckJQVkpmcDVoREdOR3VTUGtVNGc3dlZWa0JEMlgwQWpzZU9IYWFjME1CRHR1bUhobTVMSmZ2NXZUZm1SMzdQRFBGQ3Q5VXdGUDV2VGJhQlNPcG9oUWg4SnBpRmlPSm1aQU56L21uSFoxQUJ2Y29kblArR2tKdzRhNkhENzdOaDJmSk9TRkNKMCs3WStGTGhuVndDQUE3SWlqcFkwWDZWYXhOeHQxbmxyWWJmaWIzSjBJMU1uS0FpZFhNQTBaempBNHN1U0Zkb3g4N3pQNEJqRVA3Q2xGVndlOUt6NnNzSDY3dkpGdk81Z2tBQ3RKQXdTOC9wdlJaUkFKOUJQWDhXbFlsTVNnVkxTc2ZVWU5YNDhxTVpBODZtdW8veDltdEVmWnNaRDdOY3EyK2tYdFRZQnU2MmtEOHozU3NXRTcvZk9SMC8zNVJjQVEwSlRVWXFHSTBNeWhncHlPN2xhblJjcXBpRUxLU2tqbSsveDNZR3kxRXp0a3BDT0FLNGZ6MVJOTWFYdWpoTldhcjVsb2xGSXQxRS9DdUZrbUpPM3IxSWtlOGNQOVFXb1JlT2I1OHJkQnZJRUZBVk9vZzlWWGw0czRPck9wSStPN1NLTU9HNkxkYnFQMGZvVlhPODRtUUNmUUxvdHcrYjcwaUkySm12cUNPRW14aG50dlc3WU8vRGVlOUpPbXFMV0oyVTFya0lZdGgrV25CNGZ2YXJWSmVKY24vUkVDTmtlODJnWUhUZlRWcmdpbTQyT2VBNlFRT3lHZmFtbW9rcmtya2kxUFZiMmdKYkxYdE4zOTVlWTQ3ek1zMU5NUlk2TG5YQ3k0QzVYVlhONDlvU0FFWlZOT01rdlpuR0ZjQk1BUWQrSzlzWFdWV2JNOWZ0MGtNWXJZZHZNRXdqTFpqbzNwT3BnVmZaRWg4YklOdW5jQ2UrQzlqQ0I3TytyT1J5RUpMc2g1UWlVLy9LOFFsZ2Via3VoRjRmSVJrWHBnbXdrSXZzMVBkeVgwWTR4RkFCTWpvMDl0N29iRDVMSVhUQlRhK0hldkFJZWdReWltZWIrSlRWOHhDSUdieVV1b20zOEFsQXJXWkNLTitoWk8yREo5YXNlMWVGcFk4enlUTjJ0UTJCYWxKaU9LK3JmZ09WUDhBOC9Mam5HcTZiakYvTEhTTlhEd2RwNUUvVENUT21aNTFwNHRFdEhScGk2aEFSa1d2NURzSFlzbFRLdk93dG9zdDZJZVEzZzZ4K1VyS0lwNVlmT25SdERjaW9FUDRyLzJ2RUtMaXlFMUJ2TmdsUXZsb05BSXhyVWNpV0g4UFZGOFplb1hHbEhhaEhwclZoSVlvTzRJbFVSZ0RBVkwzeWY1QTNJY2xaemFoS0Ridms1emI4YllpV0hGeEhYMHFsTGFpZGYwNzY2b29VcEVudTdCeDFESW1lTTd0TGdTVGxyNDhGTWN2Yk5YV1ZJeFo0R0lwTWI5d3lKZnlUSzV4WXlNM1NyRXpKdWpLN2o4ajEyaTVvckdtbXAwL3ZNdWQ0NmNzTG1yQkJRRlV0Yk1SOGgweXhmdG1mUFQ0aTdBUW1wSFNrZnprcytWdFJHdkMwbWIvTHIxdjAzRXN1bCtIQk9zMHRIOEo2L1poTUNKOGRhekJvSHpleFpvcWhzWXFqYUticzhJdFJDeDV1UkVaVzFyNm5nVnlhNG1qQlM2R1E2YmRnSVN5UXN3dEJSS0VHUmQyaEdONzliWUpUaU9zVkNpem9id21CSGFORlprUmtGdGRuWXdhKy9YOVRRQ1BFeXJhS1Z3YmNBbk1mVlFUdmlDMzVqWmRXSFM1dklHdWdaRVhJQndOMkptYTU3Smg3dnhXTUJ5M0wxSDVsN21qLzIyTWZCMTh2YXQycGZCdk14YzV0YVJ4TGhkOERyZ2tnNXllVUd0dHF4bXhSS2pIRUVmM0pjVEV4czM3NHMvdVMrd1R5N2ZBL3YxcHhBT2dSOHphem9CdXl2MnlQZGVVZWFQbllacE5JNVJVQXpnWEptY1RLYmRaN3kyMjRscDFjVzg2Vy90RzRTSmhkVmFnUk9va2tnVmQzNU1YYWRBbUkwTUs2eEhYSnNQVkk0ZnlWRExNMzBETkZDdEJjUkFlNThaWDM4dHBxOVMwK1Rya1prdUVVRyttZkhYRGtQWlM2L1lGeXY3c1UxWlJaa204cTNwWWNQNStjSWxZa1VzL29FdXQvM3VLaHBLR01jblVvTG0wUXArdS9sV040SGJIZ2ZwUFZ6YkNmRzNoQ2JmMWRxaGZwZ05ZMDlqdElxbWRNUUxNNC82QlBVdzdaWk5aVk5LQy9IN0U0NkJaTHFuSW1OL0hhOEdNaHNpZ3VsMngwbmhuRzY0WjlHNzNMYU56UUhkRnptZFhvS1JxOVQvUHc5TDJQdDlQdUgyZW5tQjdYSk9kYi9mc2lsWml1TFp2aVYwUUczM0I3dTc3QTM3YVU4Z29ZQklzM2tKUERyODY1Syt4bTJibHZJRTc0YzIwZ1UzZVN1QVhMMzlrYWpBU1Z5cUxzdk0vM2JXS1pmMFlldFZvQUZEQ3F1b212ZHZZRUpmQ2J1VGt3dVB4YzJsT1oycXdONmZtcWVnVjNwNytOZW5pclBodXR6aHpIOEJ2UEV2dmMrak1yOUp0MkJWVGtwbDM4NTJEYnBBL09sQkVMT0h2c0NkMFlUVEExWW5SLzNwTVpHYXJzYjM1WWtSb09PRFJmQjM1dExQU0ZUTm9lQnZEdTRtdXV4RXVEOGhQQkVhdXlXcDZNYUZVMnlFMnJjdnZHeHhZd2Z0Rm03ZEZyWHAwOGlFbDl4dXBsWkhGTDQ5ZDNkbmVxMXc0NDBFWWJVQ25XSCtXVTdlN1lRU292UmNsd2xqTW1OSDhkWExrY0Y4RExWbWJqeDljdUhMRmY2Nk1rTk1lVnhyL1VIVXd2a212TGt1bjBncXd5YlhCcXl0ZGRBN3Z1VXgyRkx6T2krZEhGK2F1OVNKQlg5YU5TaFVZYXJmb2hmREM0Vjk5S3J3K3VySW02alczdUcremRmQUJXWXVadE1FcHYrOUJHRTEyU0sxZytjbnBRV0ZUdHZJbG5yKzQvT0FGTWRJY3J2eXhyd2JDTjlDMXVSV3QyWnl2YXFaSWFVelFxTWhGTlhkdis3d25uMjBEaG1jazY4VTZZZy9CSkxHM0Ywb3JaSGV4QXdvNHdMOG1OSGhMdStybzlVZTM2MUNjdE5lekRVTlVsWDN2dGI1YnUrN0F0VnNLZkVvKzRwbXBjOGszb0VYNlQ3bGI0NEx5TjRyNjN2QkFKcEtpbUIzTndHcTU2c1BiSnR6WnVoSGttMEM0UVF0VjdtajBvR01vSGdXcjI4a0hOb2Y0MVVuUUxRbElMNEtxcS8xZit3YmdrL1prL3M2encxWXZVY08yK0pwaGdYQXNRNTliMytydzdUWlhYbG8wSG9EWGtycmJ0T0xzbXBVR3J3SjdpVzZTNWN3S1FERGRpbmgxcFFQbENwRkFmMDcxRElTcXZFMXdaUmF4ZEFiRWFQVHo1WXE3MFpwd3lFWFBONmg2OHJ6UmZwRDRPTnJsREpqV3FSVVR2KzBuSUEyYjYzQmM2T2JVRWVGUktUUmg1RWt2NThUa0hjL3l2WVFKMklQRGZCS1hVVm9qdk5UVk9ZNER0MHZhWi82d0RLQk80dUc0c2ZFMW9UeFhyN3BteStFUWJXejh2Nk1Ld2RQS0NMZXVEOU12dUNVbWl0ZG9VbkVEMklCTlpKVzdqTTg4YkxQNW0weFV1ejY1NW1Ba2ExeFFMTkJLUU5ZRFhjQmwwSTlwTnpNUm9hMEY2RnZHR29YYmhvTldrTzFrbXJNbTBvZVVyekx3MFBFYnBTRDlMSHo1Z3RNZmdPMFg0bEUxeHJ5MG1BTmhaL0F4YzhMRXJ1SFRESnk1Sjh2YXQ3Vy84OTIveGorMFdtaEwxNDZYRjRkbUZQb2h0VzRVTmV4NVN0bVdxbUdVNGc0YXo0UTUwbjljL0ZQRnBzekoraVNKaTRKR1M5dEF5K09HRGduL0lTQ3VzeXdRZDRPSTNDRHV0VmRHZ2dvZmxNS3ZjY2x2aldlUVZWaHJteFNnU3FqMFQ3T1RsdndvUEEvUXVtUEFvdEFMMTg5Y2J3ZHh2TUhLZTlhWFozM2t4RkhTUUlodVdheWtHeHR0MGRqL1ZYT1NpeE5EVUN3QStRb1Nhb0p5WXBLS2dNTEgwRUd5VjdPM28rQ2licUZ2RExsTWF6VUdZd3FIQWRDOVlSVG14QTdLREhNdFRGeDJXNXF3N29JSkxQSW82ZXdPMnhZQ0pSWFVudzUvdDdPeHZxZWdWT2NyVkgvdmw1WlRzN2JDRU9pdzI0REwrYWpQUkVqVEd3UXFySlhQSEVqUVZIcy81bndpYkcxK3NIVnpuQmEzSW9KTVJ2VG9xT041c3JDSW5RVXU2MTBVTUx1Uk5UYkxqbzRTMDhSKzlGVnFnZzZjQ1ZDQTAxKy9qWUNPODNmQlBWTWxkTHBOUGZTbnRTOHE5V21sMGdFeGNsYkh0R3BOdzZpSUNUemhSVUV5MVd4a2U4bjdBajJDbkpBN1ZCRXJPTlQ4UHE0bEx6K3R4LzVwdmZKcVE5K1FXT3BBQUVZZUdiYkpTMFpEcWg3NFpQOXdOMTlGMmN0ZDY3cDg3bzBLZitzYzJPMTRPeHBoaTVucjRDRHoyaVIwL3dqRllJVHd6enpDM0dEb2QwM1RFU1F5akdvbkZhQlh4V09xVk1Xck11Ty9EM05iSnpqSHhSQnlLcnl5a1lLTVYyeHBIK1Bwbi90OHJMa0lYSEJsS2k1QnhTRXZIdDN5d3NtQ09aL3E4c2E2TWlZeDgrWUduZEJJTmZVS1A3eWJSYkp1U2lCTDVTTzlUaG5OV21hNG8wVHpTMzZMajNPWEltcHZSQVFtNTFnSXp2UmlvQUIwU08ySExpbnhRUUtTa3N1cXMzUjBqT2xZbG1nd3JBQml2endqQzgyQ2M0NmhtNTVqYjl3QXdCY3hUekdCUWdKWG13OUFtZm5WY0tPUzExRXdCdFhXRWxBVmtHQ0JaTm1JVXpzTkVEUlo0aE9xZk1ZamxDY0tsTHB5aVl6UWVJUzlYMkVjM1dEbmNENlNuMzlROXAzQ05rSUhYNkNEL0RwZTRpdDdNYk1YWC9qVVN6ZDBOSFJyZlRIMU1HWUJzM1V3ckkvSWkrc0Y0aEgzS2xKajRseTlzTVpmOUhHcGVMNzZFZ0RhdlBVS1Fuakh3eFdxOGVNRTRvMDhZL05nTnFGdXpqbGRzTmdDbE1IcUVWYUJxa0xlUys1UXgrUjIyVkpwVUEySUxoNmozS054ZEp5Qjh1MFpsdkNXUGw3bVRYcktQYUJlZjRoNU9uWFA3SWpnaG9LZnRyRTB6NklBU01vQjhmQlR2T3hXWmg4UEU2TWlQWFFLcHNDemI0V1V3Y0pWMnBTQ3h6ZWlzeVlSYU1zbWFiWkkraCtYVTFNMFdjZ3lqY0t0TkhjbWFtSjdMMHpaU2ordG9zczU3d0xXVHNwRlIzL3hmY2lDcHBRZ3diZzZ3NTVzRU1EMjNwL3luRXNJUzVhbDdld0RuZWhOSFp5YlBCUjZRcXprb3ViTWZ0S3UrMU95YnE3M2toc244OUdPRm9tbldCSGxiNFpQWFg1emRwbm92aW0wWDNrY3NaZm1tcTA5VE5keFJicEJjS0ZiTjFjUVRIU0YzM3hLeDR1ZHZ6VTBtQzRRNjNCT0w5UUg1eXpVR1VHcVI5V2EyOXJySEpjaENjS3VMV3JZbmx2STcyZ2ZYQjV3K2MwRHpWNzE0NzRCVDZySHJrYXlIcDVpcVJxRFpha3VUVVlVbmRxTDl4WnN0VVlLTXJKelVLcWxmS0xTVmlxKzhHQTlLNTRxYlhMRHlBZW1YMGhNakRsbm5qQXRFdGEvUklkWXRSNnVnL215U25qOEd3UTNHS2VJazFVS256bnBTcE00NnF6UXZOY0hLVGZDV0xBMVNDNkFmNjBRdElDbXBnUVFCM3cyR08xUGgwL0JHZzFvMDVwdzVLMnJocVBoMThqajZYc0ZHQVJudC9kWU56RDRROE5ESkRldWw0OG9FRUNwdXN5Z2tiSWFnSjk3ZVo0L0Y4Q2xtb3drM1o3TXNDU09FV3FuVFZscTJ5Q2IvMkROWGoyMFg5d0tmYUdwYmRuamF5VEJSWC9wc1J5RmpJdndoeWlycFJKdlNJV25DTzZYcTZEUFBsVVJQbW9SbW1tOWl2eVdDQkh2U2JlWWcvNFczNGN3Ylkwak5EUHpOWXVRZDVYYmVFYnZmUU5hMTVwb0Ezb01Yd3RXUUZmMmEwV29YdnNmR0lrZ2xIcU44NEZqd0NWM2xXa3dhUERpVGhTbTh3S0tWRHR3eDVndzh3QzNob2lmNTVtT1dhU1AyMWw2aUdwZ2IzUGhVUkIxaTR3Y1RlNmxGS09XVHJoRUVmREVVTU9abTE5YzJDanBJYS9nUlkvWVJJUm5HdGFDMmNDMXBMQnFOc1lYakVOQ1lydG5mNHZIY2ltaEhjRXhLN1Noa2RUdUJrc3pMU1hCckUrcFFDVHFxcFQwR0gycGdXZ1drNVRFK2cvbE1WWHpUMHRYNW41WU9Sa3FlMGVqMjlVNy9BZUZhRGs0Mjg0ZE9VRUNHd3JZd0tVczAxenlmRWtyNmdlN2g5ZjZWT0lvQW9mNjRlci9QNGQ3TTNnTDVFSFFEVEVRMzl3L0NaWHFvdUpvUkRlbGJXczVpbEF4c2MzWDdmUnRsaURiQ0gwdkVsdFh4NXplaWVwa3JvOVVNczhyMW40WmhwL0c1UldmUWFoYm9GNDZ5ancxeGg0ZG1RWTYva1dlT1o1bnRKaHZBL2wrRWgyNVorSzVHQVJ5SDlRSTVMYWl5cUwrbVViVFZRaW5XNVQ2NjhjRFBOTVlKbUVCMUNmUzlGY3AwYlJUbkVkQ3VUNUVUbnZHVkRMam9XTGdZZDhwWnBtQTNCWCtTa1hTd3dCc1ZLZFhRalpjU3ZEQ2lSL0VyZWlya3EzREFvME5LdzZRZ3ovVU51T29RUDdkM05EZk1VQjlTNWFHUWoxRFhDdEpnVzFuZ3NZbXY3L2V3N2FNdC8yVG1UQXZwME5ZTENXNVNMeVZkVmhBbm12VnBHMEh0S09lYXlOVmtIMzY4OU9KanNRS09CN0FBeU52Tm9CZ2JTaGlkaUZ0b3NwM0dNZXk0QWRjeDBYUDZyY1RBcXB5d2xpVzNmNmMzdmZxeGRmdXdTUG5ic05oTDloalp0emwzRldmYUxJMm03b2dlclRHazhlKzU2ODFLcUJHcDlPSURNZTJFS0w4Z1NUR3dtV2JCZjlnekNCNzJvWnBtelB4Nlc2dTBETnFLa1VjZjVtcExsVXliS3RKZHVMSXNKSzN2b3NYM01uTEYxMEI4UFl5V2ozZ2JGZVM3VEw2enJOZSsvTHZYdjdBa2hUWFdlSkN0Sm1hUHV0MGhLeEtCckdXTE5KYjVXcXRTd2pVZ3J5VngyNTFUSU9OOUJmb05pamZ2THBmWnkyeDZzelJYY1oxZlQ5S0JhZCtmNnhlTTNoU0dBRGVBT1dVMHVhM2ZROGQxZk1GREo5V3g5d3hYN1NYRmRPNTREbHpiY1dEWDBDdlhPZjI5eGQ0d3c0Z2V2WUF2RXBVQzVMcTU0azQveXltUzFWYjFLa1RXN2NXZTJkWkZ0Z1lLUFQvSFNqbVJTL0JHVFZrdGp6bGE3V1A0OXU4MGE1MG5nTkduUFc0TFphZU1OVk84a0t0dGI3OEhscWk2RWU4Q05aMVBkZ0tBM0pYKzZOMDBheVVPVkF3ZWpaZ0NnUWRKaXNHZ0FKcG5LL1pWRWtWV2hVNEdxUThvYlhhK2hGZlFPZCsrRVhUbmt5bnNRVURtVzF0TkFyVUdvZE1GWGwwNWlqRkVmaHdiUFhjcThWdllLUm5GYksycDFob1V2SkxPYTFERnJnN1VGY2pTOWh2SWdkaVNyTlVnak9QbG9yZGhCRXQ5NWgxZW00SFRwcHBCM0pobVpDME5yLzRvZHE3cWwxQnByMEhZdmFPZGdYZE9FaHkzZGtoUFpLMVhjNjB6RDFqQmhlN1kvODYvTE8xb0toemw5S2FMczd2eW5taWVwZkxIYjVDdXJ1VEthS2ZreS9aOTF5UTNwMk5nM2NTeVRrZU5WUHJQbnRZME1hZWdKcnk5RXZPZXIwcUpLYXRtQUNnOHVpWjVXUjRnWmtOQkUyeGtyR08xNm5LN0hjYXRQeUhnRFZDaTFPc2hBOFdCNGE3SkppcEs5SFhKeVlJcHkxcTBObE1MNC9BcGdFUkJCeDVWYkVPVGpMQ2VVT21lQ1dPT2s5djJFU2YrVWtxTTczQnMzQWljdHFyZHd5U2dVV3EzdXFwYlRmZ2JpRU9BMjRSd1pROWFOWXFORlk4Zmh0V2o0TDhjNWlzUUEvU3REbW02dll1QzNXVzZxTCtLREhhVjVyZ2F1M3hWUGE1ZWlZOW5GbllTOWlHUGsweXI3VFdDZUFpQ0l5VUowZU5jVzNEdnhoV0FyK2xYUTM2cFBDYVg0Sm5aM1NDbTJ6SEprMW5mTm5ibEdYWE9MMmM1b2xLYWJvb0hUM2JqM2djNmpjbzZDTWNYdEFJU2w0VzlIWHdPbzIycXV3WmN1eGVKYzhDYXNNQmczc0wycXB5bnN2RHpHMU9GY2ZsQkdiOFJVNGlxSmJERStaT0RpZHA1NUgwT09vRnlCT2lGQjB4OTgraCtBYzV3TFM4UjJYN3MybHNlUmgzeGgrMVRUUDJWOE9uWHlqcHkwOFJFaUt6ZWo5VThWdkp3SU9jQlk1RURMRjVLWldQazkvbFBHYVlBWG1vMFh6aFZQOXR2R1pxNEgrdjBkeGNlVytkZjJINlVBNWF2VGs4VitGRWwwekpoeDRDV1BRSzVJaUFGR1I1Mld1VEp2eHlpTUZKekRPWXJBMmNCd1dVTXVBUktpUWU0N1hBdEIyMjAyMzB5ODBSazdlMEREaE5IbWxXcWlaemhPMUkyVWVUODFVeEpkM0d0SHJNa1dyeWVFSGMwK1AyZlIzWDAvVkpuejlXNCtUWHVQMi9TUmZzOWRQOXV2bDlWbVlmdCtrTC9aNjUwK2ZybGZWWUFNYW9kbEVuaVcvNHFBbkxTSHRoVmg5alZQQ1htRVFGaUZNTVpxZjRDNTZmZS80WkJESzQ1VFdmdzVMVTN2UjVJaHJQQ0w4RGNGeWZlWnVNcEhVc2FRMkFoaXRVbVllNVYvNXJ5c0NvYXdDOEU2ZURZMFl0RmhqT1pWUUE5MFA0TGRuZWJWeFlwZmIxN2NkUkVuN3pnays0cTJUQnJlb2hhVWY0R0RYQnRZeEpzaURCdEJ1cVF3Q1o4TSt1RVl1SGJzUXQ5eFdYdWlwNGNIVFkvQVVNMFlrZlhyNGlwbG5pSUpNSnp3d1lrSDBXVTk4RFlhOThSaUtxNjdoMUpnVUlaUWpRRU13UUZpbTIxS1VzSG91anRlQXYzODdaZzhVT1NDekt4MHI2RDhOcXdveFVXblFubGFNYTNUMk5pQXl4R3JRaTJ0d1pJbnFTaGhWb3NFZXdSaW8reHlwV2EvM0NzL0FiVmg5LysveWc3Rm9nYlhFMmJrNjFKZnAzOVVjbzFiMXRWdWUvN0JnR2V5ZVdnaFlsWGdKS0pOMXMwTDRCRzd4WE9FcSs5eGdjSy9wMlB3ZXFoSTBub3JKZGhRVHU0Q1VibEErZkgwSlRWU2dpdUZ5UXVEZGRDUkxEZ0J1V0lxaXQ0b2NRN3RxNWxnQXVySnQyMlI3UE9WRDNDZ1FuQS9kYW1DVHpGd1hkR0RvakVmOFp5dFhNblBLQTZlV3RKck5VRVg2bzlEam5VNzVNS2grb0J3WkxOQUlEQ1pGQ20vaGJqZ0gya05LRlV2TGIrWE9pbWVZTzRRcVNiVzNZdVBxb0ZiamJ3cGNqMjBzWGNmcTA1Nkx6a3lHUGVnVDNTbDhCSDhkR1IybXFkWldpSmFPaCtqUkI1MjhpSWl0VEpkTlhjRktjcFo0ZHpKV2NrcWpOV1pNWXlRYmcrL3lJVi9uc29wWEgxbE9RQ3ArNVo4N2o3RjEzM0E0YVZHK2kvWWVlMEp3UGVXbVVhbUx0SWdKa0liVEpvTFhoaVBOb1VRWnVMT2VqRXB6eTZTZWdwWWc5eThGZ0huaCt2L2JKVm8xamUvM2Z4UXdEbVRMSGJIdlNpa1BZUGZTQnpxVkU3b2M0c3BqRExleTZya1Y4b2FCbHhETk1EOE9mRkg5bktWc2l0YXJOSzQrczlBNVRGaW9Zdmdxd2NTeUxrbjF0SUlTT0srTXZaaFN0M09UTnF2YkpFck5aM3N1YVp6Q0JmMkpTR0JtdTV0L0psdUovNm56UFJqRnY4aUlTcEI1Z2pWRnRwa0RQa2VGMUkzT0J3K1RjbjZQR21BVHJTcXBNN1JGZzBYOUNGajlBcjhkTzNxMVlOZDAyblJBRlR1TThUclNiOXJzNlRUd09nL21ITU15cVQydVkzMmtUeXFhMU4xK0dmbjRxYXBQYlFJZ012WTVXWkh0YndzOHlac0t4eUtRL2JiYjJncDVlUGxpNWVJTGU4RHNQUXNBdWlZQTgyVU1iekt0TVZZZTk4cU9hL3lObUdTcFRWYXVNbTAyM1IxR3p1eU1YNURlcjZnQzFDcTJLWWRGcko2Z24vUnRDT0N3Rmt3N0FQcmxpV202VDRBWVZ4TUpycXNndVRqYjFKanZtb3Qxdm5NL0YzZ2tFOXo3TEVXMkkyZy81R3gyd29JWFp0dVoyT2FsOU04dVI2OVJTZVNBaENIMEFhNjRhWWVwNlhSV0czdUtFTGt6bSsyTmY0NUxoOUoyempScVZqNXFjZk9NcXl2bFlTVzByMk8rbkhNSTQza1RWVmd5RVFWRHIrWUc1MFhDTERVc2cxV0p5Slo4S2wvY1c5bzM2aTVYYWZwdDF6bWw5VU91UzZxQzZzL2hFQkdPY2dkU21pTE9oNUJIYjFjYS9RUFpnNElITS9Mcy9CZ0NMUTlQL1gveEU1SmQ1a3M0K1FoUDlGdFF4UThCT09oL1VJTDNpd2RucXFXVDZoNUI0dTkrR2tWUnpUYlNCYmpRRVhhRFBUb1pRRS9oM042UHo2ZVp5NzRIaXpRWWt4M1NsZEE1NmJ2bkVyWHNkRk1GWnZNQlc5ZUFnM3pSbnBaTnRFang2cll5dTNYeC81UG56VzVaZzdJd2VtMzV0a2UrZ0pwRG1HQW40Yjl4QS9Jd1ZFUlBYaFJSUmRNVUxHdW96YXhoczlsaWVudGRhWmpDaWphaFlWb21rMGZJNEIrVHNZdFdQdGhIeFJvaWE1ejJsNXN4MnRNRGVCbGl5NWF1Q2VlbTFySC9qWGdxSE9LNzIrVzlrUVYwdjd5b21WYVIrbHBFVGs3VWtaRjQwd3kxcEJaYkVvUnNUd3ZqellvQkh2TFExZnpDeG1HWjJ4R0p1Wm1VVHpCZWFUSVJ6TUhNdlBVVkhvMGJwVG1mMUZKclNuUTQ5QVdFY1R3U2oxTG4xckNHcHF0SEw2REpha3RseC93ZGUrTlFtbFc1Wkwvb1FObjk3cXhLT0ZERGRWYWJZbDFXTjJtR2JNWWhJb1dUMHZ0K3c0YzFnZmlZeDhhVFJSNTFQUDc4aUQvckpicTNuVVdzVHJBNjdESy85RG5rZzl0OFhMOVNyTzJSU2h0R0F3WkxRTS85Sm1EMDVCeWoxT1lBM0tSV2F1QXRpMWxDZmVXSDRHQk1DakxIOURJVDFIZlF6aDhBdGdVMEZjanhRb1ptNHdTR1plU0hudlIwM05SOFZYS3B2WUdpS3JzV0gybXhoL2pqcGpJUmdicC9BSHp3V0Uyc2x4ajBMckZuL0ZYbyt2KzVEZE52aDA5YzA4eC9LZFNIbVZwVlY4L0M1Zk1lczE2aS9oZXl6Rk5za0s5VDVnRXkya0Mvc1FBby95QzZnSkd3eFFObU9oVzZiYzZiVFpJaWl1UGR6bHZVK1Nnb3BEZFJ6RDBLT0lob3JNbkhoeHY4UFZSNG1LWCtWNlY4aXRSQmx6b3Z6WW0rcDJhSWZ3VG9pUmMwenZWZjFPWC83bFUzaXRsZTV2eE1GajRTMlM1ZHg0OW1pbW0veXN6cWozWUN4WUllL1NGRkMzdFNXdHBKVTUxV0hPdEhYa3RSSjBQdklwL1Z0SUVhbkd0b3RvcTh2U2lzbzJkQjFKajF4ZEk3RElCRVNGNlQ0SjIrR0FMZENUMlhIc0hVb2kvek1MZ2tFczd1RE8xeDlRMzk0ZlJPV3lGeXJXY3dwWWlQSHlvbTFET2czZ2tBWXhJM1lYTmlhSFVhUzF4VjFhaEZuUkl4U1NnUjAraGxSMWcrL0ZMUGE2cWZvS3lyVVE2MG1Ob1A1Uy9xbldJeXR3Y2gwZUY0blV5SFkwNG9VRldyaXlaN0J4SVFGcm1XMUt2eWM2d1NZekh0Z3hQN054cW5ab09Ddnhwby8xVGk5bE9BWHgvYTI2cUc1OXVhUEdsVnZWalgyRHRqTTRVZmJyRTFWRzBzWVJwYVFnVythRzZkMnJCMWw2emNocmUwaHliYm1yUDBmMlhCK1FmUlVRZHkwTUhVSlpjYTMxTGN0VFcxdXp6Q1p6WWRxYmVJWU9IOTFpbGFlNDVadGh6VEhuMmtORG1neThWNmtRaDB0KzFHdng0UzNYSlp6UDhCbG93cjFGY0FnL25oblFWb1Z1YjJpTDNuVzF0T3YwRG02THBnamFzd245TUgza0kza09mWlNicHhmZmVJbURLdHYwaFVmL0tvcmJsbkZoYkpkbDRXTnBoRWt4b3Jlcm9YK0ZpYSthU01hTFpsWHFjcU5PSkpGK29ydnFrZVIvbG51Sk05T2NmRnB5cDNHMTJiMlJ3THN5dEFTVllWb3kySGlSc0MrZFJLQU42YkttOVJxd1cydzB1bG1SZjNhWnlaZWhBbndqdk5kbXNqdHVJYXhHN1VzVUI0UWJEUUFZM0pyMEhHbWRKQmxwMVZxWkcvQmplQjlVREZsaGRMRkNMODBjZG5adzdHNEQvZWgyV2haaFlsb1ltQ2d0NmpBemc0d0NRc0FzZ2E2OEtHeXR5dEdmMnNBOVAxVnFRYWxsZEtmOHpvVVhqR1BCaGtwK3hobWEwRDdjK1VYeVZhSGl3RlpUVk5DbkcvbkZiZ2grVEJjYldFN1pqRHNUaDVpM3AwMmxIOXZWTmw3YkJsZllXM09qbE0vRG9iUnBSb1lncGYwZW9TUWFIZFo4NjN3N29RNEF1d1RBUzdXK0tNeFRVUGdvbEpyVk8rcjR5bjMwTEd6bkhXZ2k3S2xrOFU1aStWU2I3ZjNJbXlCZERXdVVOM2xMTkdQNVJaRWdQOGdQaWRZNS9GOEtXRTNHdXBDMGhmcnU2akdwYWUvUnpWVEdnTVo0a3pldmpjaTBLTFNXcFMrUGN2OHZhaU8rVFNaVlI2MU5ralkzellxRFZGemdhN0pXSXVOYytuQjFlNDNlTmxPZHBaY2pHRk5aQnF2dWl3YjB4d0YwQUQ3TzZjd2xqdzZXUCtCYlFaY0QzajJvQ09sMUVNUWxwTGFHL0wxOEkyd1dPYVJtNEFheHlGUnBDQm84T3R1WXBWYTJOM1ZPMnhFa3dyR3ZlUGxmSzVTNDNtbzNMdmtBc0haQ0ViWHptQk1KdzJJSWc3QXNSb2dacHJIUkhtUGc0ZklMY1F3MjRNVm5sem81SXh4b3pQUEZyQUpWbHhmK3Rvdk5oOElMTW1SWHNteGx6cWNYblY0c2FnUFRJTmQxNXZhYUR5OFp6R0dqUUtlbmJ3ekdjUzVySCsvL2M0TVc2M2x1VFZsTWQzZktucFp5SG43M3N4TGlPQVdQYzJWdmRjSHF4SldlR0JwZ0xFSnU0TS9kVURzMEwxTERDYlVsT0E5SWt5d2R6akp5WmU2OFhTN0dsWGZRK3pVODYxQTdrcHFoMjYvWWhHSlF5RWt6ZFZJSHFnWng1WjNPcDR5NHRxZmxFbFlRUVlQM0hCaGZJTTZISDJkc2pQYzMwSGdFZGdCN3ZRM3NvNjlweFFjSWlwYVBRRFVtOUdyeGVNSjg1MFl3QnFvaSsxU1dhYzZ6VVF0NkZFU1JYN2JaUUQzNWswckFTN09SWVdaQ3I0RXUzTEZUV0QrRGNYVmlOZ0lXb1ZTTlpHOWhLQ3JLRDh1bUZSMkNpaDViRkJGUjVsSXJETDgzVWV6RW1OMisvZE9SdzBkNTVoL0EwdUJ5NGV2cUdGcGcrbE8vclhhc3EwRUdJSlBjY3NKMndWN05FNk1WdWcrQU1HditDV04zVFlSUm11emFjdkw5WkVqMGhSYktsTzlpSCtweXhlWEduVkpuZExxUzlHN3JNaGRPWi8vUEt2dGlOMUZNYnVRcGkzaTBqTUV0eTZTQ3M4Mkt5NCt6aWVoVUtpdHZNSGVEVkxYdUs0NFJmQnRrQk9TSHpYbEZKdmpLZHRwWHZqSk1yTkZiQkszN01pT3J4ZFluOEVJYlBSMitPaFhVTTFLQTlUYzlNNitud01lYnBQMCt6YmpyOGpBYVBmVVZVdW1PYzVRb1AyNEI4ZFBIUmlGbTFmRy9zekNHclNycU0vWjJ2NUtJOGVFTWNlRmpySkZhaGJNdmZvc05pSEE4SDZrYkVwMkxZL045c04zYm9hU0hRa1lvT3doUnU3R0NtejBMSkRXNVh1U2tNOTJJdEhlRjRDRmFzQlE4d0hwdEt5bEEzOFU4a3Vjc0ROQytQVHNhN2tKdXprQlR4U1FBK0ErOUNjVkpaWFNhOCtYVndsRjNnZ2YrejMybnpBdlRhdWxuTU5LQTM2TkNIdkRVd2tsOURsQi8wV2luY21wc1RyVExodnY0TExPWWZDamlMc3YxSUhZOTZMR0pGdEFhMXREWnIvbnFMcUhFWERkVDdkWlIwZnJWK2NFQVRGbGw5ck9INmp2VWZRN2VwQ29mcHdibFQ3M25HT3A5ZnRONlBEQzViU0dsSUVQc3IvWlBDRkpEWVRzMDYzOW0xSmdwV3EvVGZCMnlTdkhMdEtRc0lsUFZGQklQTC9vdWNIRWY3VHVnczg1Z1JGTi9LWnVwOEFSZzdaVmNGOE10c2dzbC9pRU9pa2ZJVnl6azhSTWkza3FZeFp2T3h1VFBtWEp5Rzl4TjAyY1RSZ3JFTkNIWXdIa1Rxcm56aUhRT1NxNC9yc2xQNFN3MW0zVVpndkhjdEJtUzBKU3poUnByRDJBdU9KYUVHNmkvbDZ0alZjK0RlcGViU1krckI0NC9PdHFzL3kzMTFYOHZuQTNzenkvNmhOVEpIK1J2d3dGRzNEUzBmRit2eWRJOVFINGlrOCtVVW9KUXQwYi9ZREUvZkoyemxRekg5aWIrdW9GbkN1VFR4Yko4RDZmQ2gzN0xORW5QSHFVVGVBSDk1THY5YWJKWDNEQTlhK0IySkRJUE1KZTJnL3B0VkhYclBjN0FrWVRZajBvdVZ6SkZPUjJlODRSVlpoMVExb0VQbStnNFk0d1VPMWV4RDRYRlhpNWo2WndOdWF0ZEFxTDZzcUZmK09pQ3NJeERnSThCeWRjeStPK0I0S202aldaYWphbmloZjNtajJ4UVk3K2ljbndGa1JWZW02QTRUbmpBbmxzczRzMGExSjRRZVYweFRCaGo1RlZCM20xOUlDdzFtSm11YjRNUEVDVkpHRTIySzFMRmZWcEFzeXExQWpMMHZ0MXFLb2JrSXlMNUx5RFZLYm1VKzl3MVRXYWJOcTh1V0xlblhVaiszYnBTcXF6a1VYOW01dk55ZWJQZHMvRXpraHdjSmNQREhrdnMyTjFGck84VUorckJmZDlldndPRGVPZFM0SElDT1ZSYU9GazdnYUVrdWk5V1JEL1dYbXZJRlBNcUIzdys0VUYrSjZBckJRUmZXMW1ZQU54c3I4SGN2a3k1WGpFTVkxZHN3MjBTclBDODVmOXE3cUhCUHA5U3p1em94RmZlaVpHVmFWOVVONG0zcm8ycU9TVDJxeHdZdlQ5M2hOUk1WMCs3YUVpejVzRXZDQnl4ZURoR1FNYkNrZVN1VTBGZ1RDZnY0Yi9US1EvQ3pya3d5VkIveHhGT2p0Y09IU1lLQXpRYVR4K1ltRDN4ek0xYWFZMzl1dWtqTHA3M25teCtOSFBjeW04MU1tL09VWlVjNEVGa1I5NVFwM290b2M2VkZleHZzcWdlQzB5V05sS1dsU3RRUDJsdHN6M3l5THdabXVNazEwMlNQcWxjTFhBWTJObXJXT1ZEL3paTEhQU3hkQXpVTmdmWmNZVmpBdlRuWElkRVNyYWdxeDdDNGRPamxhNldBOU9Tbk16V1Z1blBPZ2trbXBHeFFJRzA1NnVieFo5akVpQk0rWFhsOVpuZmQ3Vms0cDA0QWxWZXhsVEFwa3AwelRxTURlaTR3TFU1cHo0eFIvRnlwclgxNGxEUGNCSDlsMG0yYUdPMDJlR1ZzOUZFLzhneVgwdFFvcC8xbDNQZjltWGlKRWJON1NDQmFGTEVDVStiZTZ5RS9VdGY1OEl2TWowY3hjWUs4Y242Q012VWtDeHJxMHMvSDJDVjJsOEIwMlFYMWVqcWhtV0NlS3pvN1hkL0QyMVV0Tk9IMjA4UHk3T1ZuOXNKT01aeTFPa2JqeE5lMER0OXdqaDhMVzNjdzR1TllWRi96ZkMzcG14MDdMaWIvaW5pd2lHdEd6MEJDd0dRb1RXcmM0NXdJcnFva2hiNFJXaDNTcHQ5aHpDUVd4WHk1MGQyTWxXU3UrMHUwbWtDeCt6ZXZML1pOaTZ6SGVWdTVKRHQ2Q0RHaUtOa2dCcDN3empTYkJ1a21sazgwb3IzbXNmMlBNZlF1MzhtTU9mdGlwY1hqb3B3Wlp5UVl4RVMrL2pCaTN1R0lpQzdId3B1bWVmZW9Eb2dic0xTbXNSYkg0ckxZYWl3VkJvczVUNUxuSUNpK3prdkFXeWg0UEVKTnM3RG02UXlqWDNXOEtYNUVNajFNNVlqbjRrSzl3Nmk5Y0phOEpGQ3BuL1doM0gxQ2U1RDlhdXhEaVF6eXlxa1UzNHhhZXRxMThSNEp4TWJ2UEFpQ09jS0wxNktlSzBvUTd6ak1VaWRZWDFqU2srWEg1SVFFMFNoRzdoZ0wwS0pYSmlyQ0pNbVJtZE95MDJwaUQvUkY4aWlhRkcwcW91b0RJQkRCcSttSWxTV3hSaHFBZjNHcUQweS9jU3lGMys0ZDd6UzFlT3poRkg0SGpIY3VmNzVrUGtCYURXNWZUWUpvMjVkZ1N3NWI1RU9UQkZ3eURYS3kwMnlPS1U0U1BWSVoyOFk4YmFZeWFBOENHeFlTT3AzMUNRZGJTUVAyQldaSkZ0akRkZWcyKzRVSzNUaFRnVXJqYmN2SVRyZjdlSVQ3RDFjNnpuVDFuK3l5dHl6L3JPcVdhcndQOXpvL3lOVTRlQ0NLZWMxMmNGZlVYNlRvZDJaREU5WDBodzVPcDZoTHArTkR1SktQbGVxVlR3N09ML1ovT0N4Y2QvRmxFUDk0TXk2cHY4elNaWnBhQ242OHk0cEU4WlY3UWVhVyt4YWMweU4vOTJOOXFmajNOTzJDYVE0K3Z4V1hhM0E5WjBqRVpTdjRKOWh5Z3VhYkpUdDRaTmticjVDank5aXpRckkvNUhpN3ZDbzMzVjVJNVlPSW5jTXZCWkZVZXZkV1hkVnZTaXYvOWJOa0hjWjR2UUlaWWloNkY1TktTY3RUV1hBSm1ZaGs3QUR4c21Uc2UyQjhwZkxMQ1A1clVqa2h2TmJZWFJkWlRlV3B6K3plQnl3SGR2TElzVFRJekc1bEhNcDkxN3lwTWFnSnA2UVlpMTNrbEg0emN6aHdRdmRHK1NtNmQ5RXJQd1lvK3IyV2pyMGdkNW9lc0U0VVRFYTN4SVFvemJqVFptaHljQ1JiVDBCNE5Ga2ZGZ3F2V3BucW13dUZ1QXArNXI5eWl4NzBzSFllN1JvZHlHSlU0V0R3TnBEeHJaZy85dm1sNU1uY1kvaDhBZG52OWdwamt3bWRwbkhFRU1OejFqc01SQ2tlS0RPZmtBSDdZRkpveElzajJ3UVZoU0QwY1RKWkVMaytIWGtyL1VodXdGUCtoSHZJQzJtci9Eam5hR1BYOWNVNEdsZExTQ21sdldORXpVZnFMd2lHWHFUU0MraTdYbVg2ckMyM0ZvQnllRGJjRkpzY0llN1BmVFdPQk05ZnQ5SVgyY3hmWDM4UWgxNnJJYjMzNVZlUDdhK2xKNE5UamV4cHNUdmJrVlIvdGF5aFVyekFIc3NnQ3c1cHF6Smg4WFN2dmVGUlNqV1d3QjlVQlRYZjdtaDViTkgwTEI1TlBydlZFdmc1L3J5UkxXVzhzeTRSa0JXZnR0TnhReWxzR3N4SnZzOGxPNEUwQWJZeVIwSVRidm0wODJvRjdaQmxROTNIUlZPZFRMUzRzck50Y3U4V0JySFQ4TWxhakdWRzRsaHNaK3BnbU9mWnhuNTZTQ0hjR1haOVZwd0M2Vzh5bi9HenBhY2MxdUl0NUFCWjJWclRhS0dsUWpJYWgxRGZkWFQxMmg4eUc5Y1p5OXU0MkU2TEtLTWVvWVZsd1NPL01jVkZRVkREM1JuYlFJMHBWT2l4L2Fjbld2dWVOOE9ScGI5VS85eEpoVDhmdDVqNXFyVHA4VG5nalNHZEt4aGEyU3FOK3hHZzcwdXgyTEQyNEFRMUZlck9taHRlNnU0WHk1czBYQ3gvRHoybTN1V25VL3pRWmJkR3RwS2xETnpKZ2NZODNGUWpFck1PRzN0SVFOYTJuWFJnNldZQ0NNMjA4UE5hVnh2VFhPOS9nckVJd3FNZFNSZWRZVUpzK2t5YzVhM3d0a2s5VTJwSk4vSlUvSkI5MDMzYi9qT050T3NwVVRzaVJrOXZIVjB1bVdRVzVXVUtjS0VweU5FSy9BWDhrdlpoL2JkRzh3eEphM29NRytOV2dneENEWC94TURmcHl6ekNTbUFmNkR0Ym93MjNUcFQyQS9WbG1pRVBuM0RWZmt5OFA1WlIvbldpKzdmYW4wVlRiM0RXdCtvWWdtYkFFbnpWOGVRYnduQ1VlZk5sZ24zN3dnUnkwNUZhV3FONlcwV05BMGk1d05ZdFJ4SVIvcnlOQlVaYWFhVk1hbzBmZnUyS1J3ZUxkRHdwbVJqWGVqN0lHb00vU3JQLzAyaHZuRG0zNzBNYlBCcnFBTGFoNHZBcFZCak5lN3RqYTNlWmlqeUZMUnZYeHBtcEhMM1ZOMzFUcFowa25tSy9KS1Qwc09QZEJPLzBUU1NCWHYvRG9KUlJaQ3RteHhDUk9pYzhWdlM1c3V4V3JFc2hmdEtxQ3pCSGhCZ3Z2T1Z3VWJWakt1SUR6UFozSFVHU0psaG5UbHlJSnE4WWZvTjF4ZGtrMzloaEYzcExHT2JIekh5b2FhRFpWQjdmbVpGWFFZemlHNTdFLzF3aEU5MkdKeHNCWUY1eU9mQTZXOE5ERHBHU0xmNC9IRisyN2VYcmpNMWhXd05iNllONVN6VkxBSWJFamFoNm80Yko0eW9OcXlFd3NOeml2MDgyUXJwMUkxWjFrc3lGaFhia1Q1bzYrUVNSd2xjRHRnbWxhY1JzaHhTREs5OEZvazEvbGhGbWtoaEliT29Rdk5tWFdjRVFvNzQrL2JieTFLOGp1TEFmY0JYM25yWVVCWDJ6VzA1bkRZcldTSnZCVDlkUi9vSHVBUmJqbEN5R2x3aHBPTzAxWDltczlFRGJCbUtvYStBMEN4SWhMRTAvOFBaRlBkN3NUb1kweTVwem5PSDhzUklIbTYxdU1ER0N2VDljT1F0VTBnUDAwcy91eno4QWN5eXpnOHFvSkFmcnplZGJnOVh2bzljQW5lMnFNaDFsVU5GeUNtUmNkQW1ndEF3TzhIdkFnWmZQR2pvU1IyTHB2a2MvMlVQYzh4MTRxNVdlQnI2aFRDTFhwaTdaSEZVc1NNWkM3alJ5OFdjSDQwUDFWWlNkR3RrTHdUOWtGelFyVi83WjRUZ3BQcTEyVGZqdFZEZWQ1TXo3TDhIQktwSGQ2NnFkZnRRd3hIbUMzSFJ6SUZpUjN3U3JqVXQ3ZkU3MTlHRklldHV4WXhmZFVmODhIQldvYVpVRVpLakE0M1ZQakRpTkVGM09CTTFsSVQzR21Sa0lXRHJWQ3VvM0x4Wk1FYjY1ZWtHR0N6YzdZRktpTVIrRjE5SUVSenpBRzI5THFpYWZXc2x4TzhaUGtYWjVxWXZqL0krNCtNQnFma3RhSWYrRVczUDZhNEI1NTNSVlNKM29Gbmd0eE9UNEo2Z0pIUWh3QWJRYld0QThnR1BiTUtObW5laEtwUCt1RkMvdERHTGpxRE12UGZOZHg4TDBhaGNFYTVoWmt5eGhSSldTRVNTNWRxZW4zdGRVeFNZUnNPRVY0WlZOc2VoRlIwbzVBTkx0RHM3SnpRc3RrL0dYazAwaXE4MWNsbFZ0YTI5MU9PVkRkSkRvUUQwNEZmTmdhcWhXMjQxTURUVGRFOG4zZjBhMjlHVENKSEV4eGtyclMzNzEzRlA4ZmtTaGI4UnZuT253d0tqSElPNXdObnMwUkQvNEJwQW9nNTU3YVBnUnc5bng3Tm9NK2lHdCs0MXNJRS9tRzNsL1pqZjF5V25aMGYzQ2ZuWElkZ2Z0UzJiNkcwS2t3MEJNQ2lMdElIUHkwVWFOTGtDZXVmYW14bmNXVXZCR2lvVk13bGFKdlVCVHdNc3hYaktXTFFjSnIrSGJEVm45WUxmY29HSnFhWVJBS1FLMHB6U2phYmkxSXN4ekcyQWtza25Vc0tvK2JPaFh5TFZuTWt1TjBqSXNpdDRFN2M0Nnp1WnJBVFM3QlFFOGg5d1hrNnY5ak81TUwwcFN6djYvMU1GUVFpQ1I5cTFxVU96OFo0UXRQQjR3MVhCOS9mRDZvellnNXhUU0RnNTYwMmk0V1NpYlNWenlHcnhZbjlNN1RlekVWM0xwcnplYllCQm5Lc2lHZ1J2OGpZUmMwVWRKU0pTNWRBOE43ajFoOTlDTXRZczF1aVFRNEkvME44OVV0SGk3Mjc5MGk1Tk9ML0dGM0JKbXlSdGc3cXQyVm1pTGpRMDNDZ2xaVW1UeHl1V2FvMmZZZ3RhM0NJM2FTajU4eFBwRFVWOGNta3lJNFZPWTUxQ3BmODdsaTFDYlhlT2RKZ2FEbFN0UGtXR3NIN2t6Y2dZL0pzNHZBV0doajRtYVgrQVdma3Jldk91MU12bnJ5a25OQXErd1R5VkNWRDhTSFNiTXh5a2g5UWtpdUNxY25sTlltS0F6YUYxcUR6bmxHR0tpbGswaVR1bjNuR2hhRUxhbVVEWGRDNW5kTmRSRy96U0dSQTZuY21Zd0JSZTErb0FyZ3ZtUWc5Umpxc2hvMFYwSnllRjZ5eFNQNkdhdDc4a3JFeTY5RHB1WFAvRzZKYVFXUnFyMDJXbjdKaThWbmcxRmtBNzZUNUNuam94REVFMFZIWWEzU0NROXRyUU1WdkV0UFNib0wwc1BwRjI2bmZaRVhLS0lmOHQ1NXFhdFZFTXNjTzRlT1RzNTQ1U012dFlRZENYN3hJK0l4UnlLTUtTa2FGTkFCQURNWEs4eXorUi9sT0owU3h0em13QmtUako0aS8yU0FLUjRLT3Z4aUpkUVRRNzR5ODh3ZFNhWDlaSk1zL3VuSnc2SHg5SlVKNzllNVZ2TS9EeS82Vkh0a2FKaXU5djVweUpCLzFMZ1VKbit1Y241WTVXN21wQ3RneFRXNzBGWWQ4NHdJSTREYUdOZXRiQ1dlOFF1dWFDcit4bXliek13bVBmaHVJL2hpb1RiQUNULzBkUktuSkhIMzJGVjUvellsNVpOd1o3bnlCTGp6dWQvcTlHVkUrbWtkdXovajhiWGdXdjlBL2tuTHZPaS9UQlRjUE9RYUEzNER0dkJhbDY5RXZrVmRaWGw3a2Jac2Rlbjd6YVQ4ZEM2UE9PWkdDamRnWkVhZWNoM2ZDeEFFU3RnSXpuS0tOTmlwOFZGYVFsdE00N0RIaC9PK2RPYVdrK21ZOGo1WGZvWFA5bkxldCtIVnNsRE90dGRhc001MVFEN2hldkRJTU5UWU1uaC83RjZrbGpEeW96d2dLajl3OFNvSVlyRkFVS2VnRE9EcXFndUllc1lIVWN0S2NKOXlyeEQrbFF1bWJHdER1OUZmSmQzenhydGJIaVJmUnNtdGZidytjcHg4aXZQM2JUekt0Q3o1NzJ6KzM5d09aMjJGaG5EcStQeWsyZEdWeHlnYm05WGxrbnZNeExGOUVmWW1SVDNIa29Zc055VWtPZHk1RlphUjF4d3BDZXkvODIwR2p5UENhRHBoV0pGM0FxVmF5czJzQXFUam1zKzBqbjFQdnZ6c2pmODQ4UTlVVnViclJTMkVocWpTdE9Id0FyczNKWHY1OUpwVGhlT0NlM2xQVytVWHlUdTdIS2UzRWdHakQ1bllwME14QW9zdEFlbjZtcXNRZGptWDJxbVJmdEJVWVpFTlFCS2dmeDlBNXlsQS8vQlhWTzRteWhxdnFzSVhtRmpteC9kUDQyL09pSkppTXUxUVhQWDg2UlA5MGtuaFhibHpkNExobUw3T1doNGRyN0NvTDJ2TlVrWUFEUjFrNGFlelcvYnJOdld2L0FFNmxsMG5mSGJ3ZVFLTnBLMXpzNmpURFg2VUlDcmVSRktRdkxRenNjZ3pQWThnLzRvcVY3akFLTituOUpsT3BhM0NtSFZYeFF4SVpucDNWK1poRERWWUtxM2tTNzNxTDBha3EyZ3V1UkFoWHJhTUgrd0ZaNVovRjNmamxuMEJSbFBxTmpjMEhSblpXbnptd1R2bmZJOTg0K3F2STFQd1RCYU45WlVoZlRpd0hjOEZQRU1uSmlkUTBaQnhSTEhzRTNGejVjZnRxeGhCRDBlN1pEZjdRVElBQjdRMzRmMnRxSUliNFZ1ZFpNZnJ0eVNMZ0ErUkdudG5DUE9zQ01zZTZHRWU3SG14TEZ1cit4V09vWEUvc212TTRaSFBqT2NlbDVHcnRRSFhDNE4waXJraEFNbDV6NjFwdFMyazJITEUveWE4ZTg2MFhFcUxFREhxb0RhRG9ZdzEvYkhSbmsvNklwL1ZVV21McWwwejFheW1LU1pVSWQvMG5tMTlYVW5PbkU3dDNqd0tScFF4UXpvZ0Q4elZLSkl5MXhRNERsdStUdTJRQjVzMitZZDRWaWs5dk5OQU54bHBMMDFLNGU4WUNvZHZCREpXWndpQ0lEY3FGNE15NHUwYzlmK0MwYXhwODZ4WmQva3NmeGxlallCWnltMXIrZkdKWllBbERkSVhJM0R0V3UzYnphTlpzNTNSajBCeHAwOFVIQnNsdlFveWgyS1VRdXFNbktrK1dqZGhpOGphd0FxZXVJQTdPQ3FFdFBOYWp1YmpqMU5SalUrSE5NZGQ2bzRyNHZZTEZHdFU2bG5pK3dEbzQvQ0dsVFhtRXJTbmxrMFVWWk9ocDNUczJnVGdZVEJuSk0veFZjV3hRckt3Syt5V3NtWU5FZjVIQSs1Q3NGWUV5MXhmZlN1UmpMeE1ld042V25kNDd1NkhGR1dLajRhZVZhVlQrSGhMOEh3b3Z3MXlNY0RkejVOelYzb0RWb3F1VkVrOU9HaWhWdFM3R2ZlbThkZDVxRmhXYkdJZ0NzSmJoaW1MeC9GQ0ZYVWIrMm1jQnMxaG5NWWMwbmxWbWRtVFJZa292R3Q5Q3VKM0NXMzNTUmMxckliZFRRRjUzT0RKZGxwQU1KM3hKWWFJZUpqWW55clJQYUhpaGFiL2xxUjlHYllScVpCVUJlSGFnTEdWM1FXR1Q4TXdMY2hyZWJqODNrclgwUldlT0dEYnBIT0NnMmkwZjR5dVEvc25hYkhuci9FSk9DUGF6M0JMOEFxVnpVYVNGSGd0TU04VFVmcm1zZ2QydzA4aFFES3czeXlFMktsY2JqczkwR2V0b3lhTkJCak1ZR01XWTZQRUxWNTI5eUFkQmVqTEJjZ1RRTC9SZmdvSVh2QitZL3k2bER5Zy9oWWYrSFFEL1lzak5aS2twT3VEcFIvWUY3MHBYenNGU0lpQkg1QjdpdFZKOEMxT3hSUDhWNmh1NkZpNERPNGx6U2p5QUpRVFNzS1dPSkxoYzVib3c5a3FLRU5XM1BwQU96R2oxQytBanRLUmRTai95ZDNZdW5kT3FZOERPeWhkdGIyWFZQMUQ5U0R4dDNIa0pqRUZyRnJLeFIySU5melc2TjY0UkV5SEl6S2Jrd0RBSHJrUjhIeXRlV1NCS05odTRtbWdyeldYVE1JSWZ4TmZjREl1ajU2cmdnSE01V01aaUNobGc3WHU3RG53T3FUb3FMT3FiWm1FOGxwa0JNc3htNlA1eG9UeWhiRHp0eVR5N1pYT0RsbTRiQkhkUmhQYWZ4dVRLU3BycG9RS0FLMFFScjBvZ0lPdDdkZU13K0ppT2lheE1wbTk3MjVOdExQYzBsSzFKYkxPcmNCT1FBZEtrdUNMbGJlZDBOUXpPUE1ET1Bra1Jhb3FTYU1GUG5jSXBMa3hiQUQ3Ky9DR3J3KzNpTWM1T1MrcGlPUzZqam5ydVNkRHFxNTNXWVF2dE1ZUEh6NFg1QitFM1poVzl1N0hDdzMwb3NzZkhSekNYYkxKUzZJSzVCaXFMVjE0UkRVckdKVEsrVGV0azFrcDdCcWoybXdXNk5QUlJQL2V2cElRMFgwUUZaNzB6akU4VXVoclFNUmtSdllVRUdIZ1FlZ2VnYlFsRFNxUWxyR1Jqclk0cEJqRTFzZDBmSk1zczBBYkhFb1ovckNOU3Vldm9WMWFoU1RJcUdwS0d1YlMvM0N4RXVQTUhYelVBY2s2K2ZTUXVlZkUrdGh0OWpnQ2pxc0JTVmRlQ0pOMmdJVnEwOXZjOEthWitDSWVkMkx0WXMwN2d2TytVOFgvSlIwNU4rTUFvYk5tTHZBOStwcnZ6RVZtSmhUQTRhYW1rSGRYYTIzT3loQmVZeXFrc21ZK1NjUms3Q1hjVFg3bS9leXZZZlZrNHErVVVKT1gvZ1ppWEwrbittOW5jdzFPY21WVEVuUEhMTDUvOG9CeHlvd2Nod0NRdGE4dllwVk1YWkVtcGRiTmZSYUd4ckFjMGZwK0RyUGlNTVFhU0JTUGZJL1JDeFh2aXkzdE84MG9xOFBNbjVWMk1ob3ppTmhsdHZjZ1ZHb09qaGtXd05LczV1bXAyaUFhTjM2RUh0bVJIdVVPZUIxd24rekx5c0tEeDNEZTdYMHlINHdqaHJzRkFFSXAxZHY5TzJScnhDZHllSktpRGlhZDE3ZEsyMWFKdFJFRktVQktDSjFHQk02RjdWWHFIZ3hiTFJLR1RuRDlTWk1HRkI2OWxJVnJWdjdQT2lZd2NpRUk1WXQ3blNWMHBxTkFVR3RCYUdLb2JiYUtMYlJZWDQ1c3hHRlNRY2NIbDZibGV6MXFUSGhBaklyUjRiMjd2dTM0ZHRTcTZSRzNLL2xyRlJnOHhJMGM5d3c0Vk1uZjI0UVRoeFpDU2VkWkR4NzlXcXY4SnVLQ3lWNDlCb0Q5YU9pSktCWmFHTWdFQTFFUm16QlBOdUZsZGZjRkRKNitib0VaQ2JkWGhGNWxQWVZwOHltOThzZ1NleTBFbjRraXRZelZibXBndVVlRWo2VVd2U2ZkdDBLWXlyV0NucWcvVEI0aEV2LzluOElLRk9Ibm5CQnJLdEo2bUVnYWdDWWVpT0I4eGk1czI2VEl3YnU5dVRwQ1BmNXVqYTRKRllaUGdJODJUeTVkcWxiakZxR0FlSjd3VFVWbTRpTkF1ZWVzRFh3WCtiUlR1UmxSV2ZJY2grVGNhWEdkK1RtblJuZklQUEMxUzNhRVQyenVTUXlHY2Z5Q29PRlJCcVhJRHhBdnJxcVJUbWQ4MitTRFFBcWIzTGlISVEvdWVjV3BTTjczVWRGYkhkVjNqakQ2N2VXc2pjQW9xNzBIeDBsSmFFMFVRNitSQ3hTOHFQUkZReWszbWgrWUFEdG5tK3NBSW4ydnJ5SkZWenpYOEJyRVlLUHp5SElYSHlGZlcwUUdPUGJiVWJEMEFGYTIvSURTYlBvR2EzY3p4czdQeEN5STBWU3lwdFdQcTlFWXJwTmhxbWQxWXJtSVBFR1BXZnByd0hXSUFFRWtNVTljY1hhZkJ5SENRQjNDNkRrTVh6bTNJZFE0SVNrK3NLVzNLbktSV3E2UFNoY210UWxUTVh5TmRFQ0duTlNTWktYcXZwa1lKb2dQZDl3NVZVcVdsb0g5YXM2bG0xZDhBSlYwaWtacHlFK2ZFaTFsOUwrWjM3R0R3YkxMY0lGMnlvZ29aU2Y3Y2EyUTRSekdhTXlOZlQ2Sm5lSGNKcWFGVFpKeHMxdUludGVsSEwrOG1VY0hCZ0NUek5pWFZ4eDRWRWdvdC9mZmNwR25WdzVCWFpvc1RDOHFweDB3UEh2S0RVWnRGbU9OM294cEhHOUhTbTVXdWFudWxveExLVGVKTm9mZDdnM0hlb0VTZEZINWtDdWszWS9PYm1tYW5kdjZYUGFGeGUvSEJtUXdSbkZqL0gvbnU0SVJvRk91TjltMWQ0alVhcWVpWXpYdVgvZXlRWnl1Vm9yd0ptSUVzcitXN083VVdhcUJCYUd3dU81ZFRXQ2N6NEtzcDk4dEQ5NzVFbS9BOUdDNXRWYWl4UHBGTmNLMWVKdEk3RzVkby96U1A1TCt0aFRuN1ZTMjFxd2lSK3Ird2d4UzVnVWpnbi9jL0hXRURaQVI0Sm42ZXhDaHlySUxIcTBHVStiOTBZSHBUOFBmclMwMTJPMVJwU3JqTHNBVTN6Y0VWeFhwWTJNLzJwTmYrOUhWckZTMnNFdkxrNlIyMFJhR0VXMzE4REtLNmtIdlFzcjJwV1B4eXFhbUNxUkdTcVVJSlpRSUtxSFhtT3pNdHdLL3FicmliRjIrcTZWZzZOaGhGTDMrSmt6aDFITFhmWWlraW5qM0pwUURRWnVncGIyREl4OFRRYXlGZWxQT2VOcDhyajREUU5ISmxkUEhmQVhGRDRNeE0yOVlPT1F1L3hhRFR4ZnRnYXQwSkpCMUpDcmJXblBCeWhvcFVoTW5SYmRpU0orcVRSVGVsY3E2MEpaQTVaUFFybHdBcGZKbCtCbFdPNHZiR2xwSzRQOFRXVzV1TkFNVjVTM0c5K3gwWWNMNXpvNU9rNG1NYXpCWjFVc1U5bFkyMVZ3Q2dDQlNjOVk1SnEvV0gyZnZvTTJuNW5mTExmcHFIb3ZLL3dTWlAyaEpNdktuOXdhU0xVaHp5cVR4K3lUNmlMeDVGUFlmVlBLeFM0S3g3T090L2lxYW1vTGpHS3QzWGcxbDNrYVRqR0lCV0xlVHdFZzkzbDJiWFlmbUwyYlFNNnVPY0ViU29XUGZqMHpyZktwN2dHRzVWdXZ5MS93Q1U5WG04ME4vZmVMcTFIbmNTWGY3Y3N6UTlXanFUL1haKzNscllYYXg3TlVERnNlNHMwYk5rK0ROZWoxcUtDNVB4YURKYVdzdU1TR2crSnkzSCtsbjFCNC9SQXJyazROMzBmVnhKY1QrWDdISWd5QlZtTWdsaTlHOG0yN01nMnE5NFo2Wjh2TWxwMFEvcjBJVXAxRkNxVFA1M2dkOGx1SHUwZTduRWJqck1HR0Y3c3JYZUxNUmNlRjRqVGdJai9OSFZ4aGZocFM0V0NGZjFhZGc1WXZ2ZWttTXlwc0xPUld1UktXNU9VMVRYUWJjZVFvN1MxeGZZV2NLa2J3b1ZtZ3Z5L2dEN1JoUktDUEpZU29DVkpSZzVFTUl5ZXFDb0xhQzd2RStSNE1teHVXUSszaTB2MlBQaWJ5K0RMdld5aktJL3lZM25GRjFpVHBCVCtNazVvd1U1MVdBcERXZEl4MVN4T0twTTcyd1VhZWwyd1VHUExYZkQ5SWtLZGhvMDNwL1NVVllRY3FhamF6TUFpZWxEMVlTcGtOQWNheFN5ai92bU1PS2t2ZUxKQldEZUxDNFllNStYNUZRRVRLTzM3TWZuZ0d5em85ZE5aY2VaVElpOElmOHBrSjJ1SWxBTWdJYTVieGorT2JwL0RHcVB4b1doZzdKOERuSmI5M09oTjZsVm5xbHAvbEtiMEpqVWE1U2xIRmFQd0pqUXhLRTd6SXJZSWlqZ1loY0N5ZXJDRW1ORk16SmZQRnpDa3FWR1k3SkdzbzdnV1JlOTk5TGpDTFF0Wnhyd0F6SXVqOTNoTkJKeStKNDNrNW1rdnJ1MnVrL3Fpd1BMbm0zQWZBaXBpMUV4K25HQXFIS3JNWmYrWG9XenVSTjF6NzRSSFB1dDNnSDNFVkpnVGNUOE9OQUU3REZWcTd1eWN4dHl2Sk1Sc2RwWG5CcVQzYnlRZUpKSmQydTljM1BueThBekJOUWlCZGVsNlBXc0VMVWNGUElsS0k1ZmV5eHQ2VEdBUGZXVDBCZWZZMHA0cXdPZ0lzNkh2d1dyOUJqUFdDUnU4REtWcnNtNkp4MDhrQy9qY3pGcmhXQmVOWHMxVFNiVWxVU2J0WW5KSStmSzF3T0FtRW1IZEFOWVkxL2ZSM1dDSjh3cHFUdkdaMytuTUI3azB1bDlwODBnL1BwL1kyQ2VBNHk4OEhGeE54NmFNYlRRNmdQWmNrWUZSMWZlaVhhZGhMMFBUbzV5NG4vYmxGWlhPRW1OakZIdzlBV2JVaDdkc3c3WEJyNnlhbmg2Y1BGaVFUSnVCVTYxejlLV0FoVnpNYjhsYVlqRXA4eHgra2RTaVlTL2ZYc2E3N0l2ZWJRWTRPNW44UDl0cklyT3MxVzRXc2xoeGd3S0hLckJKNlM3V3pzb0VvRFhOVkR3azRWVW1GNkpXMjNxYjNyTnVpTVhqNVVITlJ4RWc0NFpjUElUTW45QmRhNTh5MnBoYWE1U2M4enBQd3M0WGtSZ0xRL2tRcDR6TnU2VmdITmtMTWpubjBEL1gvanVxZTlNMER5dUxXNVNLd2hBaGZkMWFFNnNUcDJydWJOT203akdsSC94dFFldnJrRDNqRWhiU01SS3FtMUxsNnVkbklJUHZoalFHRXpRRElFRVJiR210czhQWDV6SDcyN1dueVMyOStXYy8ydnloTGZBZVJrMzFLb2hEMTJHSU1XNmd4NnN3VHJ4TVZuMUNDaWI3WEVHdmpWUTRGRC9Eb1YzSlhFekNLeW83M2NLWEs3WlRJOHlXais5QmlFQitIL3dZekdUQmxNK2Z2ZDI3VTlpZ3l1ODZ1WmlNcWFwZTc2THNLZnhmb2F1aXFCU04xTXg1WlZ1WDMwYUZUTFhCRTN4T05sVk1GUFgrL0FlbWlKaUxkOUVrM1E5c3ZMUkQvV0pOMEJxOUJaMVFSTlM0aktyemQ0b0taaHJ2WTliM2IyajlFMmF2Q3pGUFRuU0tDN0pKeVFoc1hydEVSRWkrTjBmUkFNNUVDMUZMc2p0VmhyQzd1SGt3WWFjRGFXNWRPSTVwNzR5eTMxTm44L2Q5amFWVUY3OThVS1p3NGcreGVwazBMeGFPS2lMYXo1R21IRU1BQjVkb3JHQUdJMmdMS3REV0ZHbEVyUzdQTkVnMERTcldUT2JGSXYzdEd3aFVCQlg1cmZZd0tZa3pFWUtScGh1NXZSOVRzVXg0a1RmL3p4dEtzR2M2OEIvUUJha1dSZFlKN0FXckhjSU9nMVJ0WkYraGdtRE5wYnpPVzVHK2djZlRneFdEbGkxZWtzblVmV3R3OUh1TTFodm1ObGIxSGtrN3FncFFWdHVWcGxhYWNabDZmQm9nZDB6SHRNZW5vRSt6WDlQN2k0Q0hrdDBiT1VSSFZ0anI1T3ZEUDhSU1BEZlpEZkRvQzdXbUc1dWtqdy9RYURFaUJYZFJ3Vit1NkJQOWdnNUt0b0RDTThnbXhxeC8xb1J2YitmZ2I5d1liVTRKOGt4cWlZQlY3NmdMZ0RXYzFaaG9NQTNkOHdIZ0pTN3hWM3FuS3BTSHhRY3E3Yis0QlpsbUpHWUpRcXRUaVlHbnV0TjlrZUI2WXFoZEhSaFZBUzhiRXdUSE5OUDlCSUVxc1RpaUtJWGlSRDRYczgyV1I1SWN3WlR0czdGKzJPcmJLNW5HdUlOUENGTlZUSGFkK1V6dlJtR2xWN3VPNitCWHIwYlZkSDFLLzJNanN2Vnl5M09qMmtRTmxSNlRHVnd1RExXM3ZDOHAyMno3MmQ1MW1MYVBOcEJsQ0xEU3kxenhXT1RybURBelRCV3JFNHFkeGZoNUQvUXlRZlJKTUpmeTU0UVFrSmlwSUN5NmhEa0llUU1xODcyNXY3UWtvR2xIcGxwMTAxOTdzZmc0NkVVa0dCYzNsMTNIOTd2aURKSHRudUQ5QmlKUUp4dG9XZDRmT1ZoSVpnRkZJWDQ0TUt5d3VHNzVGMjNqU0x4N3VkVVh3QWE4dHczeFFMWnN4b2UyZWM3N3d1VlFSa1cvU041U1Y0aFlwaUdQc1hMZWRCQjl3ZGhidVFCUEJhZC92aXRGd3A5V2lNOU1iQmZ2YkpCRFhYdEpkR2d2TGRQZHAxK1ZFSG1mK0o2THk5Q1JsNFZLdzZjOHF5YkhVZURRWVJnV2R2ZjJkRDQ5MHVTdmM5REZHaWVMYUFDbUhMUmY3aTR4NjlwSzVXZmhVV0Vic2s1U1VmSS9zL01vanE5TVVYVEZSU2M2Z25rVE9TY2tVdnhwR0dZNDNiT1lzcjBjRHlaMUQ0N1pjVUM2dkVXYmp5dkxLcldIZG83c0MzejBPeXdtTjhuRzIraHc2eDJlU01IV2pIZnRneWg1YzJOSUcraGROditBWm93ZHV3MDgrdEJ1TkxJeHFveUtHODk2bURqU0xpVnUrRnlPd3RZMHduU3Z2djAxUWxmR1E4b2QzaXpCQWFXelM0azA5SzZmKzU5NURaMnVCdFFkbnZhVERsY3BSVkMrclZkbkhzN2N0MU9DMGFhVFdmNGgrYmtuTWprTjEraFJ3eitEVWkxVTcyOGVMM2NSQ2NXYnBMMm0wWCtkLzVDTEJTN3hxRVYrbHQvZGhrcTR1VjF2Vll2NEpKbjIyWlJyM3FINzQ4QnFBd2pyRHVWQ1VqMnQwdmpCMlFZN2VEd2ZKaXk5VStUNXQ3aGxpc3NYTVRHZHNoZE5QWTJCOVdJbWlXZUkzVDBFbm1zZWdZVCtTNDIxYnRIM045amw1ZzlGZmduNzVuWUt0cHFXRTZtVTB5ZXBldHc0S01hTFR2TWtrci9lZkRueHFSWnU3UXg2Qmc5c2tKWi9tU1Y5MEVDS1ROc3JxSDlvVVR3UE5Ra3A4TXpTdUhJYklCNWRkTWpBcldDcVZNTTJsN2hkbnlLdjhLZTF0WlJON0ErNGdGNW56TUpDVll5dmp2SXJUNTJZQnEwaUxUZUI1aG0rVEgvUEkzdmcyNHNTUGc1WVVqZFhzNUwrVGROdmRLR1NDZlp1YXVST0daaWV6ajl0RDVCNVArREhGK3lRL1dhTG9KaXRiY0JKRzFBdDg3dzBSQnpEL3ltSVpweVI5ZFphRjFLRWhldjVSMFRUY3B0dkpEYk9GRC9LK1VVU1hUUFhyWEpPVU0zRFR2WU1EOERIdHlKVFhaVW4yRndRd2gzNzV5bDZiOGlXTjlXTWFHVlFiMXhzTlJmWExhTGRPa2JxY1piWHpGTlZsZkV5a3FROHFyYjkyQ2ZQUkI2aTdRYkZhZ1RGVnltcC9CZU1tR3ZnNEhnQXhVNTVlUlN0U0QzdUF1QkNUUDB2V1d5ZGJGb2ROT2NqeVBoVlVxVm4yTTZFU3ViN0xaSVpoU3JNTlJmcjBQWDZHRzFtUUpTK3crM0JqL05QaE5FNC8ybjl4a2JZalJVREdDVXhxbnppYWtsQTYzaVVXSzU5TSsyOWJUL1FOOCt4T0xMeWh3ZEJrOURQSmFxTHd0bmFVUlNpVU1lTW0rUjZ5OTZWN0J6cjBpNEV0cDNHSVMzaURBd3VIdjFNeXpuem1kclYzZ1YrRGhqQnhMMlFrSEc3WjJiWmJIOXpWbm9FTFZEQVdHYlorNmsrZFhsR054eGYvR2ZQOXlYOXZzNDUrZjdRZjUrMnMrZjdJVjlYc2FmbisxeGZKMk54K1QwTi9rN3JZL0oyanZoMjNoL1Y3elA2dmJ4L3l2ZXAvVDZGNzUvdHhmcTl2UytiN3Q4K1R2WC9xNmhMNS9UWDN6OTF2MVVkd2I1L3JjL3E5UjNmbitzbmZKMW5ueWZVQ3ZuK292Zko5WDIrVHFKbjVPNS8wbmFMUHg5T3Z5V2dNZHBZdzFhUUtIaXk1UkxtL0U2NVZvV1A5WXFUck8ycHFqdUNHVFVpMVNkRmF3a3V3Y3hScnZLS2Z1eENCVFFQZlc3WGx5ckRWZmcrdkhRSTlOVWdHbklDZzY1RVhERmJJUDZBNlNLY3pqbjFvT1lZVEJ2WGNWam1UUTM5enJoV3pZR0pBY3cyemRNT1MwQytLWkdhNm90bVlmeFM3YjJneDAyeVk0N0pJeHUyenk1SVdkMWIvSHpRR3l1OVhURXIreDNLZUJMTklqQ2F3bXAramNCQmlWQ3RieEYyZVh4MytlNWlORWtpa21nTmFJb1Y0NVZKcDRCR3JVWGhUcUY3UGlJU1BnajhUOHo2QXhMMFJzbm1ja21RTnV1TW5CcHJoc2Fuc0JtcHhYVlVlRG5jeXBHZWQwY2Jvd2ZkMWVjVHo1eTFOSGJ5Z1FHNE81WmtpWUN4WUZ4OWh1cDdWZUFFMUJ3anhSN1ZxaDZxSE9PaW84aVhZOTI3S3g2TzMrMHFUbVdkUklIVERVdTl5T3NxaGVudWo1ZUJ4VnBHamJVOUhsRE9ldE1wT3VCZjkxcE5yUzBDM3pvdUY1TmNvL3pRSUZ3djBjMWloeGFibVM2alE3cnlIaFVDOFNmaTdpb2dWcW1QNnM0b1d6dG03a3BId0Vkdlo0YVlvb1l4WkVKYlg4dUFYaDhsano1eVdobkt4V1J5eXM4UE8rUzFmNVRQLzhuTU5HZlY2eFE0YzdSQXI5eHU3QWppcEc1NnlCVjcxdGRFRHozWmlYVlRUb0RRbGNSaCtSNVZzaW5HMUdvMk5CdnRTTVpPZFBNZEhrOVlkdGtxd0hNeTlGektTZWwva0t1aGFNQllSa2s0SEx6bzlMVERMSy9zc0J5dmxtMTZRQk9QWUZWcVhIcFJvQWdDR3FrQURtZHNuYmJ1SUpEbDA1d2RYQ3V3WmZNMmVpam5FL1B3cnFqZ0lFT2ZseGovZk5rYnR4ZEN1enJWNXhldzV1dWFsN2h3dmtxZFQ5U21GUmk4ZjZVQmY4aEVOMStmK1hFbkRkTFBkekFHeEN4NEorVytRY1g2dWhIcmtEWVpzcloySGlnRHZvSWRtcXl5clJUV2pEYTkvSFdsZ1oyT0Iycnp6ZFpUNUtnMGVxa0VlM2ZIRmFVa1VQdm1YcDJCSFZXNm9wZzJjWFpRei9jaG9YNzRVYUFNTkJQbGxrazQ0Y01uRWwzRi84ejlQQWVXTGhFSW14bDNJRHRwWWxiRURXcldST29wb0JnajRaU0lqa2JXaHVCbHdUbGlIRVhzVzROOFg0ZHl4cHBpekNvWUJ5Q2UyQ1BNV1pCSmREYUl0SEg3M3VlMldSY3NsakpmZzJQeU1US3FJUXgzMHR2TTZ3U1JkU2habTQ1SUorcTRUQVl0TDQxdXMxNzIxaXBpUzRuc3hNY3hFVHlZdmFyUkFhL3NheDVXUnBUaW9rcE93WTNoQ3lHODBLOUZmVnExenVhWWJzOWVtRXVlRFprZHZqcnlKMVQ0NVN1UHJBOUlGZG4vQms1WGVmQ0xIQS9Vc09ZOVl5N3g1bEFNUGttd2JOYjFsRm1RbzMyQ1ZmZll6RXZFdWl0VTlqTm8rcTRNQjV0RStCOFVMNXpaVUJ3SWJMV3kxMG45d2xzTHp2clh3QXRROFVEV0F0NUNzNW5nY2xxZ0crV3AyR3VrNTRJOEx4TFMzUWxUWUYwMXQ1elZZc29ZUVJ6N093M1IwRUNJZjJEVTdBL3VnWE40KzFUSXdJektySnZZb0JobjhvZk9oeEVmOTBlZ2taM2wxcGNvQWFPQmU4RnE0dlQxa1MvOU9JUnhqSWhjRWpWeGZqRzlGdGpKQmNDUEw3TXhBTitQN0RCd3l5QnZ0MmN3Tkx5YS9uZzQ2SmVSOFhIWE1EUUdENWJHWE9GWkhBTnBVdXpQcGtia2tpd1ZrUEtBcmluL0k3VWg2M2xxZmE5U21VY256SFVtZ1p1ZW11eUZHMTFaUFNHcDJIMDhrdHJ3RldCTmo5UENONWI1alAvZmFTSCtHYzNXOVNVY1R2WDBlcXp6Ym10RUNEWmVPTjRpZXVtUS9uSTcreHdpa0hwZ3FLWW5BeU0vZ3o2YzlPT1B1RDIrNGk5SmVIdTdWWTlBcU9hSjlCMVlOVXZrZCtHWkNLS2I0WmN6NE1SYkh2QmJqR0d5YXRUVlRiNjBVNGlEYStDZUlLaXArUGtOa3ExMGc2bGRGbGt1dWR2TVFQMUo1c1JlVlQwK1dqMUVlWEFtVTJMOVZkbytIV25kNy9IQzB1RHZyQjdsSitra1NPcHMzb1pLaVl3T2ZxRVZ3WFFmTWVYWlVFZ0pGMWhLQXZmRkZMSEtSYnBlbG1nVnZsNjg4Y0dXYTBmR3RWOHdCUE5MdlJsTG5RZjl3WWZKQ1hTaS90ZmpIODJQY21yRU1FbWRZRUR0c3ZKcGx0cmJXSW9uaVExNXVpMlRzWng0cFUvdnV3bFliUm5sTUdlM0hHYTdsVlk0UnIzTlo1cm5YaDdIWC8wc0VWb25CbFl4ejlQNlBuZzdIdVR4TnR4dkUzM1ZaRHRPN1JnaEQyWHIrNUdSSDBZL3FoOXhEZ2V2d2hPU2tSZmQvNjI1NTN1YXB1RDIyaFdZUVdyOGZQbWloMWFWc0ZVTUZ4aU9idHhRbytnT3UvejdHcy82VlRHdW9VVGhkQ09HVVhIUmF3M1BPMGhnd3RUUitGSWVTSmNXbFVvSXN2MUtFb25JZE5nMUk0WGtxNUQ2TFRBeTkwamtrZ0NUUldMMVRzSVFjV2lJSEhJTS9oSFlqV2k3VnR1Q3ozV0xuV0ZaTFJrUSt0WUZqOXhsUmFlaEZmSCtxN1F0aDQ3UjkyT2hoNWprRCs3cXVQejN2Z2g1SHozUkZpeXMvbllDZ3FuUjlNTS9UUjROWkFCby9sb2pYL1pEa2svL0l4SFBab0ZLVnJ1OXc3cWJLL1kxWFVnT0FvOFAxV1hDbHN1c0FXQUxLQ3oxVUlFSlZjNk4vd1doZDRIeWl5VjJXc1lMejdjU0ZMTHFGUnBXVEtvdXg3QjAvbGI0ZHRpSGtaV29sck01ZHBDa1JrL2Z4Nk9xd29LanVzTmIrQWcraTJmVlprY3pHWGhGMGdLUStqaGwyaTVvcXNnVkJwUzBDUlkrTTFDQkZwTE0zWWFlbmkzMlZCNDJwUlp6TWI4VEljM0ZzRHRDNU4vSDRsSW5DSWZqanpDcnJCYkRzTzM0SzE5M1lFNGhlMG5RWXUxaVZic25tSllZSXYyWHo3WW1IeGNybVRpblF3OHFuQXcvYkxhNEpqL0poRjU3RDhsOG9oeTdVSWNWR0wwa1RYSDNxVXNiTDRiRE5uQTJxZmlmVVI1UkZVaTR4SzNLeUVUMENHK2gxN1JKMEFwY0dXUFFDSWVaQm1Yd09ncm1rRXFPRks3OUFhWGM1RzZEakhLZXVPSXRvbkZiOWFGSkVhcXVxQXJlNk5xK3IzMFAwQWNkSTJNL1pkZUVJMS9ZcHgxQ1dlQ2dudEZjb2o0WlFnUFZpY3ZwYTFaSHNoY3habzExQ1JONXZvVzNLaUN1UnBHNFkzMGU4QzdPbGVNNGVsWlliTG14dk55R1Z1UDgybGFQQVdmeXdaVDQ4OS9ETjBzYVVpQ3ZNNENvUGsyZVp5Vkx2eWhRMk9yK2lVOHhsYlNuZzB5eW13cjJnWmp2MXZNWW1rSkliRGFQNFcxbzZYd3MyeTVaOU1HV3JyaHBrZW5EWTdHTkE0ZHcxNUE1bjZFMUV6YTJ0b0d0eW5CQWRaaEpZRVpkRnhwTk9ZaUlsUUtJSmZVcGZVTFNaU2pWaEcyZGVOYjJveDhlTVRZSlRqaVFUbEhvdUQxYUoxWHVtWkZmekNrdGlrbzBHM1YxMk5HMURFQis2S1VyQXhSRkwxbTB6bXpHMTlvcUZxSzBNTkhqY3RiZW5WOHBsTlB4QVlzZ3JpOVF6amY3WUprS1NRQW1YMDhoTlBRZGVSUEM5d2l0aFo0aDMwSEFTOStqdFF1M0g0N0tZdkNwNWJTc3pNTDdOY3VSNXdDMk5PaTEvOFpNS3B1NDRvVGJmbWx5dVBJU2tzMzY1N3gvWEZacUVuYWM1NFRqNC9jMHZQZWxaYllWNnl1WWIxRE1IODEwS1BCQXo2ZHJkNTZJaUpxRDdZVXJqMFhiLzFxbU8wNDFyRUVrYzBwYkZFc0pwa09PNXZ4a3FuR1V4K3BDOWpCQkZ6NXZTdzV5c3ZUc2MwckpyUzUvanVDc0NrV3Q1TTBWNUtqdjlhdDErTDliWVcxVzE5b2hCQm9HdVh3UkdtaERKS2pyRVhBRmpXb3VzZ3l5M21vUE9YdUlXTDViWGV4eGgzSC9acktCa2JheGJ5eUY4ZEhwSStUNDk5UG5zcWxqell2cnhpV2kzbUpnaEhYcDdndjRMeU8xZ0VNNGh5Zy9tMHBzQjJmcjd4aVV5TkhxcEQwTnQ1WnpROW5qWFVFL09YV2pHTzN6WFFoK09yN2N6RDlnUk16bkw0UVNta1RPd3ZzbzM0T3NXbmJsMGdsdXNoVVQyWUdxUjUvU0FxSnhLSDdYUHlDUytBMUdWMEJsUlpzc0tXUEtDT3k4MllIMmVVSnhZV2FVOU15ZTdHeExuYjJGbnJzQ01hOGNRRjV3SG91cU90QW16S29ZNjdaYU1aNFoxNGViQnRXMDcvWWdaVkdYekgzSEVGcndyenJFbUlHdzNoYjNUSU1FZFVYdkdqdmVSV0pnY3lNNzFKbTgxLzZlOVNKdmRMenpWWDd2ek1ubzFweUc2Y2dkcmJtNTFJbVRMV2ZxZFFacVg1cnJPdWhDdXd2MUFOcUNmV213MUcxY251dytGVVNnUkg3aDZYOFpWalVlNXA5QkVsejYzb2RUWmtTeld2WHFrUWxIemh5bzJFUklKaGhxa0lvWnNTSlpPa3kwNXgvRWdhUlVkVlRUblJMVzVqcllqdlpyaC9BTS93dGV4YnUwc0k0MXZycFZIRjRGa25UZ2xoM1lNVHJDTGFhNWdUQ05CdE12ZTJSUUFEMktIQXBMOUVFZXJOWFpSd1ROYmdkaG9abFhQYU5qdDJvZjJRNnUzVlpaUjZnWG90WjFwUWdKNHE2UlNGMm0zSFoveTd0M0xZSk96YzZhaFBBVWFYdmRwVnlNeGthS2hIU2lXZHRLU1R0N1VTNTJuT3lGTmN3Wmp3Skg1Ty9DTVdQVEF1dmdJeFVST1FGcTQ0cjFUbWttYlgwNkNvWVdUSUdVdXBNS2pKYTBxa3pkdkZ3K2xIdXJZeHl1bDNadTFMbWQ0SFpmem1xMWJUMm1Ld1FibGQ4azFRMzhsc2prUUtSOEFudDBLRlgyeXB3U1BoaU5CZTFMV1htcXlubFNYb0xiY05sUGF4UTd5TUwzM0g2UUd5M0Nkb0FTRkErSEZjMysveG1OdzRvcWE3OTc1L05sSndvT0tsNDFFWm9qSFN0UmdIMTVWaGNMTVZ6aGJKVmt1K2pDa2hKZHY0WWFWdmtzdnIwRENoMHZ2ZGRZbklLSlN1Yy9IRm05RDU2TWF6QkxYWHdVOWdRb0NLWU1lcVFkRXl6RXRIWE5zL29IZ0hrT1Z5ejU5M21vdHlTeklRUjk4a0xiN2FYb09jUnFSZTNRNU1ENkdwRk1TUjV2bGlRUGJzSGc5YlB0Ni9JUHBoOGxzazFCN284UVZHbFZnSFBHOU5LdGpzYUUvWUdCOWtHajB2OUIzb2orTmlmQSsvYVV1OVBZTFUwdkVEbnY0UjJEMi9qWHRaYXRSWWZUczlxZzM1ZDdCRDJCZ0wxVTF6YmNNTFNHVEV0eVlSeU1GT3FmaDlRd2dsTit3SUdjckRVdThWOCsxbVhCcGNxWFVGUmNDL2pzS3crazRuZGgzM3FYd3NXY0ttazZrdGp3MWMzM0VwZmFoR1lqNXNPVlVnQU5PYzh0TjRTRGRxRW1yc0RoWlNJZm5lOXZSRUtRbjBhNnlJL3FHdHJBNEFXQTNQK1J6WDBoaWpSbzJDdmZBRmdrV01xR3g3Y21WRjFmS3FJSHVadkpwOFhCWnhnRGJGNzBMZjl5bjExR3U4aU9iZm1VeE9XSDFscFEzZXNJb2Vld2NnOXdXUVFLaC85QUJQc1luckJhaHQ3QkpjWnFlbkpIMzhsWjZqaysvQmNtKy9wSENESjN5ajV3VTZVQ3IvZWJXYUYwdGFocEkzR0hTZkVSQ2VxNWJSSGN5bTRPL2Q2SGVEYXpMS0dqc3pJZEV5M2YxMXh5bi92cHZxNVdEQjdFZFVMS2F0bUdINTZGaXpaSmczRG9LYTNZUVBHK295NlF5Y2E4RVB4cEEweCt6c01hWU1CQnlsUnNTbnBCMVliMERJclhQblM2TGliaTcrZkg4dDVHWm94T0RiTVdDNmhaTXNVT1pwYTN3VFkwTnora0d4WENaL3ZERUxUVThxUUFlS0h3NlBJL0p4QjRRY25YSGxJNVV5d0w5bTZoNW8yazJDbnJoSFV2cHZiTDFPZG5tL2RVMjRxWndpam1IaUVUOWxwSk9MNGlqNXp2NTNpUDlWbldSM3dJZ0ZnM0hFb2Y4ZitMNDhodkNuS1cxN1drSForNlB1bll3Tkt0d3ZPU0w3cFcySjVGcHZTT2N2MWpLVWNNUE9lV3VhRGVzUWh0WUlwN29LREpOSzIrb3JlaVRwOXZyV3Z6UmxnM3Z0b05JenNRMnZwZUpXU3JZOFFoaUZxbmM4cjh1NDZ1UlIyODdCM2RGV0xxclN5ZWlYaEVHbnZjbTJpbUZKQlhUVjFzMExsbTUwdDYvOFE4S2gveWVtclIzN2RIMDRkZHlMbUpaZk4zNUlNRFhCVjNpMm5sN2JlSnNEVXFrMkNFYXVnemdzYi9RQ3FXNHRTTExqWWdXVWNLczJ3Ulp6ODI2S2RYY3FmYlU1SGQvQyt1SE5tTHdiOWdiUFFPeTJTMFpLcndmQWJWN2xjOUR3SmdzeW90aHhBTUJkdi9XUmJESTA4OG5WbG9rNExtRFUyd1RZdW9lckNMaXBxUlVzTVlyTnpwSFlNYTJ6ZTVOdmtpYk5TamJ5MTVFbXdNd1Fta1BBdjNHbzlLanJibTVJbktFb1JYelJrWElRdENWZ291Wk45RkN1Um5XZ2JVbi9SQTl5SVI5TWZZMXpHdEM2cElsNW5Kd3dadXlkMHJUanZQdWFRWTlFRkZML1ZIM1FCdm9jZmF2RlhuT1IrUXFYanFhS3ZqRmI2ZzBXN0drZzVTcnRvVVFnY0RxVlFFNVk5WDVtcFErZGF5djJyditiOFZLNXE3dGQ3Z2ZndFMwWm1yY0VyeHpvR3ZaWkxwd0NwWHVEVExhYVpub3dSaVBRc0pCTW5ITFVaR0NhK1N2N3BYeFpKY1NlMmU3VjhHMDlnUUdDWDRkek1wSklxblFGcTl6NHRuaGMrTVlpVWdPWE9lSTNIQW9NVkw4YmR1RThrS2dMMzlXa2M1SDhEb1JHdG5MaXl0MmJnd2hWMGJXYU1tMXdWWG90UzJ4dHVUcUg4RWpUbWRlN3pJVmR2RVREbTR1NG9PalFSdDczZks4TVo5WjFKajRZcEUrQ0FaWWgwUFh6Y1dsWTNJNzZkOUlmSDlsT2Zld2FmY2QwVnYwODlJSkhRUHZrYzIwbXFPSE5JOHdCekxOM1R1b2JBY25hdTczQTBpNUtlNEpUMGg4Y21BakphWklGdVVER1R4b2tRZXBjeVR4ZGlzSEFuZjIycVEyWmJwaTdnSUU1SHkzQXVuVEdmd1ZjMm5uT05VNjFLQWdZMnFaT3dKOXY4NXJhT2FQV0tCR29ac1Y0cUlmUFpNNGc2MG9DTkd5ZGp6SVNFUGZ3WE9KUWRNRmQzWGd1R2tIVEwzQk82Y2lDYUZkK0ZVbWhuemZ6QkJRUUQrZ21BamdBb28xMm8rUkVzVnpmYXZ1TjFMWVE2WVBGMFJhS0ZkOWs4VjRPbzNEclVUakIySVNvd1BmS0JjRlNXQ1d5WUFNM1grS1psdC9RSUtZYnpEQk5rMUo0K0ZYSXVYN0lITGQzNUp6VXJqRVdyMFRUWXJtbkY0dkxRQ205TkE1TFJhZThsaFR1ZE0rYjUrS2wxRi9QcmJWVExJOXVFRXBLRUlKc3F1N29oT2dSWWlDY241NWlCTzZLSHg2Sk4wc291dDB0SG9nWEFjT2dMdUNINmVMN1lhMnNrWk01NXhuSDRWc3hmTGFFK3YvM1lya3RNa25pakwxZ21yV1lBOThSMmg1VWNseVFtMklaMFJBODhGVXFZM0hvWHc4ZDRsMzRrdm11YTc5RWl0OXM1V0JwZndsMVdaQjFwaEd5V0g0RW05Mk9xQjdJOUhnY3pSbitvSHJUT0g2Z1BOQ2xET1oyUDlYbUNHdk1hazF6ZWhOcU5meW9lbjFjUUxIWHBLbUsxU3V3QU1Bek9seEE4WWpCUXpqbTVNVmdlTzdKUGs0UFZpNlJpYTlleFpCbkFFOHVXYmdmVlVKdjhDSUdpRWRKQXNqdXZaNWlBMklaYnF4RWI2Tkt0eDRrRVJhaEQwTXEzQ3FmKzJrOXdUSDlkL29BWXlwL1M2USs3RUFJV1laN0paYndKcW5rVHl4NUZQWjNKeGVuQ2tSQWNvZzdJVUJERC9iampFSGMwQjErdXlBTVhTOHZKM1JkWHN1QUlkV2poOHRKR05RSkFpZ3IzRkhkOVJvcGxZejgvMnNyaGZ3bHJldDkwUlRZUjBqUkh0MEFwQlNSQkFpSFppZkh4b0JYa2s3K2lPcDRwbGhGNFB5UUJaSjBQZytQVWF4SUxHV2FGaFVCUUpsWDFHSlp3U01ldG8rVlZKak1ocWJjRjN4d3djRzlVVnhFUXVRZ2xEMnZuOUpWV3pETkc0WURQckZPN2ZFb1BYajVSNHR3UkhnMlh1N0FENklIeFYzeFN1cTlLUXRoM29lNjFvRWJmWG9qOEFEWktJVjRpVHJqSGxrWXZZSW1neitkVGdnSi9UMFdMZEc3SG1ZSmxNZkFvRmExcmwrTExjWGoxQXlRcVBSZ1JmQXRFUkIrUmYybkRlM3k1d0poZXhuMzFqbDk3cWZoMUxVWmErMmVrd014eVFoVHBmWXA0djcyS29vUjcwVFBQbUE3R1lVcGlPU0t4RUdrWFRRZTlUS1dOU1IvT2g3MFhFQWZCTkRBVlBXQmFXL1BMK01SUVhqd1VpWUhMcWUyMFVlVUtqNzlFdklnaktPUEdreHdnREF6dUZHN1dvMWl5S3VOMnNSUkxjSGRpeEoyVFMxN0ZzMWZzMGdyeEo0NFpVOEkyNHJZWWpUVWRCU0lxTzVHQmZXSWJLcmhFZm9YamtJc3VtdkF3YlNkL0FlRHFnZVlRd2NBUHIzb2pjVHU3eFBEQnZHa0RXQXRZcEYxOU9GQjZpOHBaWEw3d002cHJocTBhNDFTQ2NxcktmVUFrN0N5S1hOS0hrUzAyVnV6R0ZuQ3Jyb1RhUloySFJxODY3NzF0clNWdkQ2V1M0SU5UL2w1SFJoZUhvck0wV2FSaHFrUmRZb09pd2FMb1JGMWhseVV4VitKcjNWVVZoVGRyb0p1MjJNZzEyR2xlV0paL3UyM0FvUndxdkZvSWlaNTJXRjZFZ0hrdFYxR3F3bUxJS2FOYms2TXdXMGpMeitQaGFrU2N4bEdTRmJjVWdWL3czRE5lU1RsWmJtS0ZIK3k2b0MxY1pOU3M1d2RFUk8wQ1JhK3FORU5obEJaZ0dUZUVoTDZoRW03ejYzU20rNDZJOGFNMHQrdmxOQ1paa3hEdTVnL3hjRXBYWUVHWU5MR2ZLekdmbDNkVTA5dlJCMUtEOG5jcGZmUFZGNkxseDFKaXpDUWs3azRvOXRrUStRY2F2Y2xjOEpGVGVYdGwxRFhMbU4vMXMxOVhsRUlhcGtMVFYvNmNmbzBEc3JkWFZUQVMzdnZpamxyNlZ0Um40UmtINnk4UFNKZnQrVmMvZGlkbkJFU0ZSOFpGOFJBL1RhQ2JudURKM1dwWnZYVm1qZy9IMEdDakpJT0trdjR6WHk0OXRrTDRYK1FhcG5iSGFMRnExck9iTDR6czZpTGwxbnhqRVRaaFBWM1VHNWx6b3BlanBWWXBiNmsxNFA5OUFNSjk1MitlUjN2YjcxSFpLcWJaVUtDVEg2WHFvbU1YOExIUTltVDRMU3gxY3lSVzZESXkycWJxd2ZJeEJXM3dxOUUyTVpIa3QweTFiSzhKOVlOY01wd25NNlcyQWppZm14S0JIY2FkUkI5cGd4SmY5bTR3ZjkxZ3NrSVY5dGFlM2R4Rml4RHFpelNid3BsS3NOMXhUQlR4SE41MEJvNVdTZnBCZDlxaXZpQlVWM0svODlSeEMwNWx2b1BjazZRT2RnRjVaRnFKUGpZNWc1djNPbTZpM1M0ajlCcG9sZHhqU0trbXYzWWN2MGwzN0R5QzBMRnFqOHZJcnVGWG9TM2NQOVJTRUJGelFiUXpsVXZNQlBhUUlSZndYUUx2NHBpQ1huMlltY1E0b1RQd0Z0WlJ6ZWdIL05tbHFCYi9KTksvYndaRFc5QVBXUG1lVTJMVWpwS2FuaU5GSGhyNU05d2dkTUx1T0YvU2FsOVBVUG1jRXV6Y0VtMG13Nm0vTENFb3pVdWxFUlhKOExyNVM4VWxabDExZ0tYaEFhTjRsbkdMTldROCthdTZzWFE5NUN1S3VDd0FDRnVSUGQ2djZyMHZUMXNjSEdqaWxraXEzR0JpYzJyajF5QWNWRTZCZmdQQmZBVFpXWEI4Njc1U3RFR2dhd1ZqOVk4dWdGL0JWSEJ6NHAxSjJlYWNtUWNBVXFNMHhCc2tDMW5RdGphbHN1S21PZXN2TVpCNkNFbHExeWNkMExydUJSQ2tGRk43ek5EWlE1dEhDTFFOdXp6NDZBaVlyOFhoWXltTXVYSnhYMndteTlaMTViL2h5VWRzNGZLcGo3SVdXckhUTFNSa1VHZnF1ZjYxdVpucHhtWUtxOURiUU9DeUpmd2xUaXlqYW5uYXRyUlVVeCtKdVNsU09qVW9KQzRYRDJkRkVOamZLc003ZmJSSzFhcVBWN1ZYQlVRNzQ3a1RNMlRhNEpUK2ZoemNmWGJnUmVSNVh2MERvWmVIOFZ3WmE5U05COTN5anJRa1hxUVJjZ0xjVW53Ui9WY3lSajlvQXlOWmxlU3lwMGZxaUFyWStsYUdjL3NQTW5qZ25QMHdPd1FHVUZieXNubEEzeFdDRzhLQ3BydHFTQ0ZWL2dNRTF1UlV3MiswQ1NMUlZpZXd1YVhlaEJKNVN6bm82bVhhMXgzV2tmaWQ1eVdOYlJNaXFXc3pnUEo4TWttUGwrbjJ6Tm1qbnFPSStqVGZkNEpFV3gwajFsc0NLVWdnMXgvUDZkdWxtcm8vWUVEL1MrUWRwbUVhM2plNXNDanNvdnZDRGEwS2ZxVk4wbjdCQlVQdkFnM0ExMG5tVWRWUW1MdHFPOVBrQVhrdVRyb1NyeTBQUTd0NDgzSmlsSGRGNUVHNFMyZndURzRPcVFVMjQyblhUUkYraXJSMGJIN09WbUxWdE9BQ2JQcWxwNVhRY3VhSUZqeTdqNnp5T0w1VDNvRXpWQzR4YWhHMG1JWnFLZFcvU0J0N0o2aXdhVDNWV3FpNnJIQkJhZEc3ZUtPVjZNckZpc2xzMUNzbGxsMEViaExQczU3WjhyTno1SS9wVDZkS0tkWmdkUFgwMk81cEpUM0V4SVh5SzVBZUFDZCt4RjlVb0pyL0ozNTNPZCtnNmtiR2dCNzNPV3J3eFloNWhJRzl5cjlPS2s2Qzg3YVhPZVhaQ0w3ZzlEMHVrN2l3YzBDejNOK25YcEsxb2R5TVBBd3lEWW5ka1c5T2tsei9iTjhHaHNNVWxiUmZITTVIelVYKzZaVnJ6cHJvcW42a2JuVVFMK3Bwd2dTTE9iSEk4V2NkcTlrVncvOHV4eTBMYnZER2pnUUNzT3JoNWhjUE13dGt2aGhSa053NHk2MHBZbXErYyt5U0UzdXZRT2l1T0Vxak8weXJEeDBXQ1JwMDl6RnNQcTRuQVFnT21vR24zTkV1ZUx3cFluTWxyNlZZRzRZYzhsTkg0RjdTMkxYNW9vSm1tdmFaS1BBRVNjUS9PSHliNGV2cUF0ZzJDL25jWDJxaVg0aWVyYWFlaDFiSUc1RkhTbUltekcxOE5NYkp3bmp0ZzRSVHFEcXdSR2EvZHAwNW5Ld2JXVE1URnRHSEpNNlNPb1VHZ0dnSEhuQjdSS3VCc3dsNnFDMVh2U0l3OEpmdU9QMm50Z0JpNWU3NmRaczR1WDZrbjljUlR3WkJJRE9jRTE1VWRRTVZUc3hKZ2twT0V5M3pZVThsQTJPSi9uMW4xWHZxbkdpSWtSMnhCczErd2FtNUhod2tpZGkwZUp3Uk9aSWpscmpsQW03M0VPd2RYN09Gem1WeGMva0M1KzVzWnpraERrd24remJxVGx0ZHJEWXViM2hqRVZmdlBJcVE1NDJET2ZycUNCMUFYUFZyR0FQVTdscTd3MmU1Q3NqczVLbVhSMXlsaXpVRHFudzZ0ZkpFVHpYSFFBTVUydUhqUWJ5U1B6WFhYRWFmOUE5NlAyNDBuUHNKSmJ1cWtqalEzSjhvbTh1TmFUcndCS2ZHaXY5UGNacnRWbGV5MXAyTW5Gc3ZseERyTFlabWRYcVJRWDVqVjhKTEQ1MDBYNjZkL2lMNU1wOG1VOVp1K0FaTExCS2Y0WVZsYVhsY2tWKzVTcVhwd2NXSml5cnRtcTlqdDd4YWZjSnkxd3lDTDJOSnNUdFFqWWdJaVllRmFqVEJqdlhCWWI5UEhhVEFqVWhUcWxzUmZjSldHKzBrMi9SY0hSZmVhL1dvNTRWbVA2UDVxWnUxZGdQSE9XM3YzODZtd2JOQ09EWGF1LzFZOUQyR0R5WkdMa0V5ZDdJa2FuUzY4aThXbU9pek5xKzVyZnNvNWduV0prV2dWSHBIdm5qeEhtb2tpb0Nsa0xERGRkRFV6cXZCcncyVkl6MVJjZVNzT3N1V3FzRVB5c0RQTnlLTHM2STB5bXgrT05wblM5UW1ybUZTOURySkNjZXlGcmFZTDJ0MlREa3lsbHVXUXZyRWZDNkh6UHBCc1ZDTm41N2loRjRuMmNkdFBGSzVqanVqWktHR2s2Z2ZIMmlLSWlFY2dxZUh6NlhDOHI3VTZkUEp3VWFYRTNna2g5YWp4dWltbzhmc2RQZWZ3aXBaRTkzZjVHVnBoN1hqVStSZ1VWbGxZNVREby8wVitBaTRPckx5Vi85T3ducEVEL3VqbWhBM0daRnY1K0R4ODJZVmtpZ240WjFjemtkRXFnUk5QbVAwUDBOYmU0U1VJU3J6WWxCaVBNT2lYK3VoeE1OOE12YVFrZ2hjSTN4ZVM5Wk95NjZuODZJZ2dnZ2xKOHZUeTNiZWMvUXMrem1UVDNrY1QzUWZQWG5BdlRCemxaaEFOUHVOK0paamlXQm9jMnAxbmw3RXNiSUZuZnMvVlBQL0hXTzhEdFBzN0JoSFo1VjJ1eXBGdy9hVUhab21vdkUxckd2L1RyZU5DRDFIdG5xK3NQVlZUdGs1QUNyWnZNK3pNY1lhUmFSTTBYZ2hVNlpkdHdMaWtqWGlXNlEyY2VNMTA1U0ZSN044ZmxPaWNLQWhkZllRTFdTUk1hcUJXYVNEVG9GdUhKL1NHQjFXVGQvaUNZVjNyaVU4cHNHKzE3a2lNRlQ0VXNhQkNjQjRSQzVuQi9ubysyemhXMVVkTnpFZU93R1Nyc2YvZnRKdVA1eGVSWEcxQXpBbk83dDJhVEZaS3pWQ0Y1OWpXS0piUkJjNUEwdVo2K3FBV0NkTXN3M25WT0xTVkpVcmY5WWd5QS8yNHU3R1UrbkNZbG9IL0hHenhCYXlRcnpRamxzU1pZdUNua0U1V2NvMndsMHc2bG1ZYXEycHd3ZzRWMk5XYkJFcWRKSWJVSmxIUlJmZ1V6NGNycVFGa2hFdUh1cDdjSXRJK3d2NDhjSGJZRGx0QWpxalZqVVpNLzRiV3c4c2N3Q2RtMU10WGNQOHM3YWhrUkJ4MWY1QzlvWU1UUS9BV2lPSk8xekgvQ1pOOWdSYktSUlYwd2xRNnp6Yk9talozWkEwTUo5ZzBvNkFHNDNZNHU1K2F0N25SZDdtRjExWFFXQlFlRnh6UE8zU0ZLcE9maE4yUkJXMmRIaW80V3pPeU9TdGE0eEc0TUVaQU1ZYmFLMWZLSGZSenptYm1oeEh0SWVsTkNIUitPZk80SCtYVzlFZndkRk5QM3ozY3VQdFVPVytoWTVMQk9RcWNQOGs4ZnJzWnh0WHJaaGJYVlFyNHY0WWdvejZIa0c5WkxzejRwN1Y4bVIwUVgrV2ZwOGhvT3Vwcnl3VUtNU1ZiVnpIOXFLZmJ0d2h4elZOK3o1NU9peDBuR254b2xKZ3ZYQTNRZmxGa2VidXN3L0VLQkJjOXN5aDl1dkxIVjBMaGd2Yjh2MEtrNlN1NndESkdPSVF0eFBsSm91ZjhWRlJoTGZvdFJzRmQxbEhDWXdFM1VkdW1kenF3eUJxU0kwcDQzbkFXRjhieGZNSDN4YjNTLzRPSGtiRjZTamZaNDhuanNkcVUzd1NhdkR1OHRIdnprQSt1MlZSZGd4ZXRsa3lEMkZVL3V5TjdOaGxvSW1ITythVVluRVhPdXk3eFM0alVQM1VlTGVnb3NuVU03WGlpYnNqS09qamhCVFJBcVVSL0g5VGt6RHRRL1IwbnFsZjRaWGFuNldDVFdvTU1YbC9JUXBNcmpsZlFjVm80c1ViWnRFT2RwRS8vbXovREFsblcxZjNaeHVVN05nSjFkYkdFbU1zbDR1YnpBN1o3T1BHcUh5SGJka29VTDVTYUVJVDNlLzNNcFMxejhzdVlXRGxzZTlrWDVhYTFGSW1sUm5tNjIvOEpQT1Qvei9uNG5sblVTaVAydHJ3eDZPdGg0MWlLNHN6NmJRUWwzdkM5Z0lBYWNRMGFuMWNKcGQwSC9HVHZLU2JFSmlQMmZvYlZYbXphODJsR3BxcVdPY3crU1l3T0ZKc3RYbk0yekFBTkx0aUU4MVFyTUkwZ1VWYTBhRWJqT09oam5yT0h0ZXFjS2MzMDAzbFprYTRVN3k2RDgwMlRBZ2hKbmVjR2tpUHJ0elIrTzhWYjA1TCtnRE9VN2J4ZjU3SG13WGp2S0t6ZHkzS1grOEx2WmloZ1V3eGFBYlMyZnlFQUxrUGNBRm00U05ONGpSTU9TdG51Q0lmWk83RHNIbVNXZjdiaXczbDlCSlVpb2RUdEhGTXpVSElnd2g5eUR5R3FXUE4vWVJuR1hqSHdDMTd6UnR4YzR4NWo0cTkvMjBNSTFmVjZFSkNlZzlCTkRWMk1xWk54dGwvWnJRcXlpaXpSSm85NGEvZk9hUjJHUE1RRDBLYzF2MGM4RkR5Zzh5eVByWXNvLzZDNm9wUk50YW9ab2p1S3ljMVkwSUtpMW9mbzMzVzhTUldTeFNVUU5nWmsxTi8zaDg3MDcrMW9jMFNBOWl1bjVvSDlvaG8xbTYrdi9aZWdOd3ZXL3RNdm5QVHlNVFh2dDJRaThlek5WSVFUcThOdzAvVjdoVVR0U0t3VWZ4ZklUamIrQUVweFY4Si9nMEYrWnJ6ZHBacW9aelFhWUFWdUUyMmU5dmRpY09IM21HOFFOYkR5M2N2c0RrWjRQc0JvMDR0bzFleTJiUXFCY290R3orSmQzd1U4T0JJL2tLY1lPZEtYSXZDU1RIS3VuZHZRSDUweUg1b1Ryc09Cd1JLSXZNVlA5V2Q5YkZ1WGZXWTA5ajRnYndXemh6cmxFK3lmbjhKOTBRMVFRVTMzVHEzYUE5bW54bGE5Y3Y0VklTemhqSEFpcjdLSEdZaEdxNllWWDRJY01sQmxTNm1oUGhid0xuYlVwdURaMHlBcWttZEs4WitxTGR0ZERTb1hDRmxyeHo1MkFGQVE3MWVQL1VaMENaWjlGM01tTFZkWTBxeHEyYm85dGtiNGZkaExOc2xMbGNUcFcxL0ZVQlRwSUJCMVhSQ0tXL2xZS0l1MmUySi9RTFFtWW9VanRBMDJQZ2JrTFNscEZQeStsNEFxaE81MUlPQ0ZZL1pNNXRENTErN3gxNDNqcVVUaDJPR0hUOTdvdjV3ZXVkUVBjTGY2RC9lNXZlbkxTT00ybnM4WVFkbjYzZmhFb1V2ckhKWC9VWWl3QXZQb0RlbkdZcm9GVkxGakdWY0dIeEVSMTA2bURFZDZnVnNTK3BlYm04bEVybHZFWVpkSXAweFlBUFRoQjNuRGZocXpuc0RtN3JGTThMUCtZbmFpeUxvVlNNRnVrVEZOT3B0bXBaZ21pOG9kR0ZQY1pyT2VDWnlpdnFOLzBKektPNEdiL3YyM21xeVIyOW1sNm5PVDdMRkFrY1ZzL0NtYWlVeDNsZ2RhZmRiUExlOUVVYmxnMDFWSEtyd3NtZEZveFhGUFNVcE1GTmxVMDl6amZOYUpjL3NJcVhSczM3aXRJMGh6Z2piU2g1WUZEMGRNcjNZczdBQ1p0bUFMeVFUa1BWVEZscTZidDU3ZnFzMkFBTHN3TGsweld6YnRneVNKWnFEblVzbzRyZTlSQm5VUnFUc2hPQjdTV2RqK3JyM3RhSUdjdU9pc2JDVkxRTFFOdFpFV0N3dFZJaTdYbTVocXllb1o0N3Qrd0paU0NGYVN6bStnS1VLc2RrNWI3V0dxelV3UGVmYlRDbks1OGVDREFodWU5bE5rb0xMT094SkRLbUY3c211bSsxNFJ1K2hmMlZyWUh0UXJ6TWVuVGZQZ2tsOENtQ3E4TmlVNU9xeG15ZTdHeG1icHVPKy9DRDMrL0lRQ3Nud1lhYVdSM3lNQjFHVlFqMU9mTHdtcTVFMm5LN1Z4VUREdU9LeGtMQWlSK2RVN2VOcjZVa3dDM2I3Wit0ZnpFNGd6VFBYZS9DZGVWbzJHSE5DS281WmRuejdoTWMxL3hkUWZ4T3BicGR1Z0EvMUlLdW4wSlVvRU9uc0Z6dmdia0NHZFlDUExaYlBpcDlRSmZVUldSNFJIOXhBaE1NT3NDbVlvM3orRVFYNHltbVFCdEJzdWJDdm0vOGJ2c2MzSmZ6R2hBQlFRSm1DVXE5NHpIYUFicnJyWExYNzQ1RTExU21IMk1WT2xPbVpPWTVGSi8xSkhIRTd5M3J3N09TVmtETFc3L1RuYVlwOVVQS0hvVVFDdjNoY0tzZE5VRUxVRlI1c1dLZUxOYTVSOENxWS9xYlBPeHNINDQ3Y3p6cElSQ0dRVzgxaVdjLzZTcXF6ZHpHUUVjNWpQOGNIekUrV2xOMlYrSlA5dFYwSzJIR2VHSlEwR1YySUxRRCt4M2VJSnE3czVET1FEdnByM1VNTzNacmNzQmVoNWV5OGs2ZkMrVmJ6UzR1K0ZIbElDNGpqbmFTS1lZT2tQSkFqTkVJV3BsNXhJWU1jS09FUy9oZmFVc3c4RjE1M2VydUdhN1I2a2FwektGL21QT0NtSXVMb3o1L2pmdk1qMUZpQkgyU2RnTlZtampzRjg2d0UxcEdWaWkyUGZBUmZDYXhvNURBamZ2QlNnSkJoS3pVZjVLUlpMa3RJMlhaTTUxMWJwSXI5MmV6K2JJTkpBZkhyL0d6ejNkb1NnRE9sQk5WaGd5QmI5SzFlQW9lb1FmMmw0Uk5JT3huMVdmb3VYcmxoYUJoT0lLNkliYktCZWdQS1JXZ0pxc0NBMHdhalZsMEwvdnBzMEo5UTRYMlMzdjkwNWFDeGdHR1EyL3FVZXZTMWQ0d1l5S0VZUzZsYnVzODlCNFozWC9KZTRDcS91ejVsU0FLTHFSdWtOYmxVSjV1MnIxdUdwcVpKcGxrZDRmejU0eURxOVFWSDUwTWFKQnNjdUVqV1BiQkVUN3pBNzZ6bkVvUXB2THJwQ21VTXB6bkl1bzJHYnJISlVyNDlsbWo4ejlLOEVicldicXh6c3Z1ejNYZHFBYm5UUURyOWorbXB4WUpXRXlVbUdOUCt4RUlyMVVlcjRuSlhKckZNNDlhTGFJUHJvbllWcHJoempJMWVKbGJnczAyZWVFaWY1azNCdVI0NG5nQmhHOUFiZFcxRUxXeDlIekZPd1gwSGJEZm9nSXpBRk1DZlB4MkVjL2tFT0ZxdktIdFlDeVlETWVWb1JnOTZseEVveHVTeU5odWtaQ0VHL3dNa1dMMTB6R3lLYnU1ZG5ZeXY1Tk5PNlZzTVdvRnRHV1dFVjVva0NaTmsxbXNSc0srYXA0ODBYcTFPK0ZmUzRpcURGVlhzVytVaTB4OGU0cmEyZzZUUnpycWw1TW9zRTd1OXdiOFpyM09sT0FjanlsUjRxNmJkS1hQSUl1cVBkMy80SEYxbk9BQ2lSMGFlKzNjaUdaaDArUGg3aTVtSmdQRytVU004bGFwd24yaVVhaHpPTzkzSFRnV1pXNy9HY0NZNXNPOS9SeG9iaWMrY1ZTRTRKcUhrNWRHM1VRdlE4dlFGQm5XUEJ0Wkw0azVuQlRLNExRVmpYaWY2eVcvQlJ6Mk9LdGFpbHBrbG04ZTVXeVQvZ0NWZ1Y3WmljYXVQL0dwMWZ3N0NJbXE1MVVlekpKcElVS3MxQmE0MXNvTmxxMjZFZG5GL1NWQlZuS1V2OVA5OU40NkN4OFc0OStHNVQrNkIzR3ZlUWdPeHZ1QUxnbElYdVhWRFpwcEJ5VVdWVkZtVE1xSEN4L0JrWVFDMHQ0QUhQK1paVWxLN0g1em9iRS9mcmpWNWl0Vmczd3JPbUxCTXorTEE3enQ4VEorcFRMb0RleDB2SjBLbERWaFRxVUVscFNXZU96NHpYaG5CTHhYTGtpU0hpNHRUYmovY0ZRb2hVai93TCtIMlRZV1dpS25lL0Q5K3ora2ExVXlsUUhWeW1zWHdLSFFTL2NLWTNOV0s3NDRoOEFNNUhzR2xGMDVBR3d4dGg0amFCRldWOUFrZG1lMmlaMmExVzB3TTFNSVRFTjRINndsM3V0QkNDekp2azllbU1zOGFBM0tJQVJZNDBLVVczeWwybHl2RWE1clp0R3g1c3pZNWZSK3FOZjU4NHRuTHR6OHV2dGNkSTcwRGpPeE5aRDNidzhlMXhZeksrS3pVZ2s2UGswR2cwWk0rNGE0M1dVUnhnUGVocktSUHVDcmFwY0RjSTRJL25wVWxUQ1RHeFVhSjFvckFKOCtEaTVzanl2aDVaRWEwYTUzWEkxaVNjRHJpL0loK3dxOUdoR0wrVzFBYmpJNWVQWDkwb0ZTWnRab1JxQllkK3hJS2tkUnBkTjkyN3podkNlWEtNS2duYWVDNmMzSWVWN3laM3k0RDFIL3BMQnhUeGNobC92VWFkODZBRzZvZ3ZXMkd5UTBLNGxkOWJiY0V6TnBnY1FqTXRzTXdLMEVnRzNuZXliZE8xSWtBUCtXdTU2QVJ4RTE2VGVIQWNXenFueU9ybklsb2dCVHIvMnJxWGp4byt2VlJEYTJjYW15dVpLbnRzbXRDYlpBbHpmdGdmRjU0U1lna3ZhN1BZVWlndVBGdEx1Mkx1YnhMMlJHSE1MWU9PUkg5Mm9icTFYaXRuaWh3ZWkzZG5ER0diMUZHdjNyWk1LWnczdW9iVWVjV0MwQWUwTy9oQ3MxcDh2RWpFYlE1QkRLMkhLclRZMGE0N3RFRi9oVzFIZlJyZVMyR2tQb2U3WS91d3YzSXlyNS9FUXR4dGQrSXBmUXJmZ0tFb3B0L1FOUjVpcllxMGtxRHpvdW14V2FEc09zbW0zQVVKZUlOS2xYME1IaTdTR09taHlBTUhYZEpTSi92UFJRZ3lqTVc5Rk9EUXVNaTJoa2lCVndmVEdDRWh2VThCdjd2aTFGL1BKVzI5d254aTRvazEzeXNYb2tVMWQ4N3htTmd3WUdhVTAxT25qa2ZlOHVXekNGdnVaT2FUUGNIT1JXNlN5L2hHeHBVZDNFVGxnMk9jdlorK0preExKOWpXVERxdVF6eFFBWGxQdzRjQ2IrY0RWcFJWZDFqS3F1Qjl5NGFuMzNmeE5qNVQrcnBabU1ZSUMrMDFFZzhxcTZRQWZVQk1mbHpxS2JrZUFuSVc5czFKSDlIa283TVprazBaUFRaVVhMUWtWMzhCTjRBclRxbHpsb25HQW1YRUVYcUtEbDVhd010OTlEL2VReGNlL2E3RzU1cmEwY0JvY3BqbnAvcjV3Wk96UktBaTBtTkgvOWRSR1hSUnkvTkpKRnVGNURWUndWR2lLbi9ZWjV6U2gvTXROczFVakNMZ3JOK09OenRxVzVTQnhYd1Fsb2ZyQi9WMWFLa2FYbUVuYjVyL3ZOVGJCaVR6RWdQTis3ZDdqSzh6Wi9tQ1ZRY3hJcWZMUXBmRnV3bWV3SXlWQTFOL2JScHFwZXF1azVTQjlubms0NzZ5SmorYk5UTEl5RTB4akUyZU9EOGVha3Z3SlhNUXpXVXVrNDVQdlJkbTRHY2Rud28xTXdPWHJvNmgwektMRDBNQkJJOFdQczJVNWMzSlMrT21pVnZsb2gxWlByTnVBdHdHZWM2SkRWQnhnclhKRWx1MzJjNSt1Z3Q4SGVteWx4NzlpbTFpMUl5aXN2aHdLaHNFQWVpVWhzNjVUOVJKdEZVNDdiK000WTZLYnlLSmtZK29KV2k0UkJMbFJUZGpiRUZpTXJDUWl2VUJONThTWkJwRXpsYzhTbmkwaWR1NThMMUVmUjBjQ0NVSW5SZmZuaElPQnJlenJ6ejRESFkrRnVSZzNvL1d4Z1pERVR4T2hVa0FrcjVKbGJpTkhSQk9RUmloemVIZnlGM0ZLZTd0VEVLY2N0cnd6TFNSVll4Rmd3eTFndUtydDlnb0tQWTczQnRuTHREaVFSeTkydEI1ZVdBdldmZVBETHFvaVIrekxNeCtUTU1JS3FlYmVxbGEvdjNRTWdjT3VaakNqdUJXOGNEMzdySHdqVzZsYUlaYVVwdXB1N3pWNVA4SnJYeUQ2aVpzZUxkK2tyT3lXZzJxTDFIOThhTFBTL0M1V3J2WDUwY0ZEZ2JkUnJ2UWlEYUhlbXNWU3hHeGhHVEZ3NEZmbjBXZDZkaGl0Ynh3Ymo4MUJ5SDNZUWgyK3FUR0hKd2RDTzRUMTZ2TUNRRmJtQXR6SlpKMTYyb2hHTnVQajNSNGZXVmIvMEVWWisvTjlIalI5SmlmMzZJam04ZmNBSTEwNHhyblRZNjFzZjd6RWhhcDZjWUNCcmViS0tXZTJRb1Jyb3owck91OFI4ekNacEd2OUlpWlFqYVNnSXY2N1hrYzZrNU9xRExMM1QrRzh0SGhneHUwWGtvTGhVRE91aDNoODM3RVRUNjlOV2N5NC9ETkRzaGhtaWFrSFVvTUVhMXR0UnNMOW9Ib3plUW83SmxBM0xwZXN0S3NnSlYvbkU4VTUvbXRBS05sbi9IYjREZlBDbDVyaUh0eEltTWtFaE1BQ2c4Vk9sVUNKVDNwSGUreEtvZzBxdEdCWlRuMnBmQ0xPdVZ0aFpSWUI2ck5wbkZBS3Y2MGJENE9CeFZydHNuVjhtVCtwMUdySjVHQVdWMENCMmkzVEVsMnVycEhMVFFSSThjenZ4RVRQbGs5QXMxSUVLdTBhOWlSenREZldnTnRkNlIxSGVuRyt5UGV0cGVGbVZMMXduelpLOHdqQS90bFdrMS9DY0FzRkZFYkpVQVM5NVpzZHdqdHRycjV3VkZyYTdycWFROUU5V0lyTnFZdEprd1ZxdXpDWE5kUW82Y2duNzNQWjl4SWVVcWwxSXVOcHZMRkVGNEFsWElDczBZQlovRWRCREpvN3kyNm5BaC9oSi9vaW1rb3lyaGlJbTg0K2ZsRkNvWG9MaURNTDhsbXlUZFRZWTFFdHo4YmVaLzArYU5IWGRLMXRaMlBoNER5enovRzdwdVdLaGk1T0FZaUVGY2I3RGhPMUxoNm02L2hRb3YybFhtT3RnWjR4TmFBUDBScWxob2lWMmZqVllQQURlM3hhbldFRXlOQ0Z6bmN2ZjVoNEh5akQ5ZTZFbC9EZ1hsSytGNkxkV3lBRmZpaE9xYWhFZVNrNFFNUG90b1pMUDVRdGkrYk00Q2pGMEtOVmNjRHpmWFZVRTZNYkZqbzZyM1M2T2ovUUcyaEFxRnBoMlF1bmFrM3JodU5kU0QxT28vcGlPWXZIdUNjQ1V4d1JEUjJZZGxhMUpweitPa0hlTW1oblBKd0h1V1VwL2pVVk82eG9ocW5GS2dJTWszc3VUVDUvU2pWNTErOHNYcW5td2hQdGNES1FmOUEzYjRxMGdyZDhVd085aFpvRG5SVmdQRlRpM3l5Qi9UcHBJOFFZMFAwb3hybnR2QmtYZDMzbm9tV3ZyQTcwNnd5dkM1UkhPdFNKQ1dza25HR0xSeGxBb0ZOdUJIVmVQVENmbHR3WUEwbzJYZ3VMdXZyQ1dQbHU0TW9jMXVEYjVReThUKzZJUklLNGhjcTkyaGJwVWRyZjd4c1hzb2FPZ2lmT3RITytqY1ZQRWdkTldCTjZkOWNMRCtOeDMzVnhuQ25DSU02STFUTnlLczVlYnVlWGVBeEdCdFFDODJCcUlvdFJFa3RWY0tlcGtEWmtvTm5FWG9aVTVuV3dlMUF5TzdhOUkvMnE2N1JjOW9KNC9kRThUUm9kQTJpdWR1dzZoeG1YRmhwWkJVL3hINWxOZW1WMHIvQkdNU3EzK3lzSWY5MFBzYVkzVjFGeXU2SlNnZytoaGdpUXVOV3IyQnMxZUFUUHJyeE5BaWdLMU5oRjIvaGtLMnVsVXZiNEtmZkRIR1U5NmYxeGFGNXdqS0p2ZWZMdHJRT1hKK1lVWVBaejMra2tMa3ZQVU5GN3F1TlBFak53am80bldoejZpckJyamZvczVENlZUNkFlZFlXbTFoRFRGRjdMT0tGeTNVL3VWWHdwbXkwcTlEcC9CZndwU2xNNE9Wb2FwYXdiWkhTOUFHcWppVFBJaWxZQXBaeThHTjA3ejlFd2FValRQRWJXbTU0cm5WK1BMdTdHaHF0SXdxdGsrOW00QmFDVDJqanNnRVVxODM1SGdld3pNOXRldmhVUkRpOFhRaEhpRSt1TnU5anp0WTAzWGpNalFrVDZRMWtIcEZFM01uczRPQ092ZVgrcUhNVkJ5SHVCT2VBOVR4bjBPUTFJcVJqMUo4YXVhUkJIbUE3TGVsdHpLOFhQaVFvZjFzUmVIZFdPTDlzTXdCdm5NRVZNR1NuNTZJNmMrMWxhWXhCNUNJVWR0QnBqOFZMMVZvdDRUd0ZoZWxDS1crTmlKVDNueHN0aWRkVENzVHlwN0FVM3M3VjJmbEJTSk52WXV3UnFMd2xVS1NQdzBHMDg1eDFVT0Y1ZGxHNk85Ym5WUWtBbkZzNzMzcDVVQ0I1N1NJMElZV3ZrT3pZR3B3NE9zNnhxSUwyVm4rVGZHa211ZmR6ZU5CYzN3Q0w2Tm03cWxYa0FSdG9XMmw2Zmo1U0xCS2d6UUdGK1M5aXQzc29oWlZ2c2EzWExvZGloL28xODdyNE1OUGduL3dlTmZyY0Z2RFdKajVnakl3b2NlR3l0Mzl6SDJzanhYd3B1cWNjM0xxdnlZZCsxTk41WVYwa0Mxd3IrMERnc2txaW1xamdRMllmRU5SRVNlVVN1a1dEdEpCYWlDSTJxSzVhNlVpVTJWUWdnZ0J5RG1mVXZORmpSSWhUOVNDdFRNUjV4RndiVXQ2cmY2KzlKUGdoNFZGckhyU0hkY1FUaG82R1NQd21WUG12ODBXcHVKSEo0Q0l3THoyRjIyZUFHSmp5OE4xcEV5N2EvT0NURFljRkJIYWhCZFcrL2NNTmNjUS9zcE1kZnQyQ1BDS1N1NDJOd3IwaUgxTkNqSG03ekRJcWlpcjlSZGpLUlhoK0k0YjU2NTZ6S1B0ZGV1RHlnK1VJYzl1RCtpWTBSekFaVUdBZWNxR0RxaDQvVCtmM0N5OHlqZ09KZ2lDbXI4ZkdDalZZU1ArU1Q1MHQwSDU5QW9TWC9XbHEwZDhNSXFONVZnRjB4SEtkUWFKUkMxdVJ0dHBuMEdPUXIwTG9TRHpHdUhHM0J6M2gvT2NUZDZyVmkzU25FYk5RSFZjMUF4ekduV25VbjlPN0NGZHhBU09peHFMSVUvWWVZS2pSM0d5a2d0UWs3UXJucVJMZUJvZzFyU0dSVkJwTG1UNS9kSzV1cFB5dHlEVFNnQ2FML0pBNkljR01ZK2EzV0FUdUlPR1NFcEMrcHhxcUxTK3c4c1l4RWJHZCs5KzQ0MWF4akg5UUpOQ0VNNm1rWHRDaklMQ3U3OERkeUlmMVJkb3dqbUNDNjRuOVduVlAyV2I5QmVhSlhkSHRzRlI0YTh0V1dGdEE3eldUK0tVQ28zaGtiSkdJZXRRMFdkbW85QmVhcERRaitadDk3dWgwWU80b2Q0eVN2TGdlcVRNdEp4UEprc0FVZDIyUUxXemVnSHFqd2FwdVlEaVRzWU5SdThRL21kUDZ4eVBDUTBENWpZeE9XaGZwcjhuZ0dFVjE1OXM2anZsYjB3SW44Sm45REZTR0RBbnR6UHVmeGQxSXdRUG14elZJT1dIWVhQWFdnMGNoY0tqMGszbjdDQTdXUEEyQ215eFFuUmplLzBBVzBhd1cxblBsR1RHdlc5Y1J5Z1RQRXVPUEpPVnlrT0hSdWprbi9EeDZyWHNFOFJFOTlxWDBxT2w3b050VDlvK3UveEFEYjNyalVqVlB4bUFRc3JVSFFOZTdrcEV4TE5DVUVaRmlmbXdVZFc2ei9VQjhRdzA4SzVBaExCbld0S0dEMmhTNStZMmJ1TktMbXR2Z214eStRRVAvMUJqYkltb3djejFKaDBLZjJ5cytaN0RjV3hhVUllZlVYUlpDVTM5alRURDNYNkhuYkdVRS9BbElqSGtJMkEyTnp5clJEWFlha3IxSGZUbVI0c2RDcTh1aWpxdG5RV3hsUjhrV1BhdUdLVjc0aW1EZjZXY1FOVHlzYnVyUVRKUHpJeWpYSGlONjV1Z0tkVUgyTm95aldZOWpHTXVUU29VdWRsOGhRdVRKNW1UWmxNdGhYRklSUmhzV29XaHJ4Ym1lWVBGeGprdEhqQ3dCd0NpVGI4M3ZsOTZxU1VkRFExUkZwQWIxdGUwZlpKNk1WVGE4aEl5Qjd4YVMzbzg2dkNGdDErVXlNaWYwN2ZhWmRYbVNic091aVYwQU5RT0lJUGEzYVYyY1Z4eHB4blpVQ3pYaUVuWW5yUFRETFM1b09qdmlIZVVaSjljRTJWNFBLMUVpYTRMclVIajN1ajdlcDZWOVlEa2FGandEOTRvOFNpUldreUswNHNhSUQ1VUNKSHJjdFoyYkNpWWNqR2dRYmdLU21CejFKbDNyUm1tc1FBYldmRHJLRTA4R2dkd3liTGtMbllUOWxCeDJQTmplOURkVVhiRFYxNzFTS3RDdVpvWnhuYWpUMlo2UmJIQ0pmRFV4MEZmWVBnbmowMnFpSlpwSlNQZ21pbXNxSUt2ZGpvNS9TOUExMjJJMTdha2x2WGdYeWxhL2JrL3FyeXlkbTh2NVQ2SDc5SUI5dm1iY0lybjg5SlBxVUhJb0lvY21CaWhkSWJxSFE1NUlZbjZmdWRkM1hvT3hiM3pxWE5rTUp5dmVHdzdHSkVuNDlNNDdMTkVuUFNDMkh5b0ZZZEp2OTF4cmUxTEMva0xyc2RCclVIZ1crZkdoSEovdVNkUWZwaXd2blpiQzd3SVA1a2FqTzhMK2UrVUI5VjlKL3VoVGlYTDZSaUgwTWU3QVdER0lXWVRPeXFyT2cwSUdVQW5MVzRRbG5zazNXeHM5R0xxRWFYbU51QzVyUDdISlFOQytNZCtOOGlCNUhldlNPNE50V1NkR3VRTVptSFpuVkxvUWpIVXF0RGJlZ01nenhBdVlmTlZlYlFWVFJJRHBvUWVhUzYwUmovaDdicS9vcVJEOFhUMytJNGQ2UkxGOWdTVVExNTMweTd2Q1IxdlZ0ZmwwREFWZVJhcStWc3F1d29jeFB1SEJPSjhML01LcDlQUS90OHpyWDhiQjQxdXJRMHpBaVYyYWdnTXFkazBabWxneUpremNMQXBLaVZMLzB6UmhjUVVFOSsyZGVka2QwcmdKTklGcHBudnIyaklIdk9zdFo0aGVrK3pFc1F2blNEUUQ2UzRETlE1SHE2MDlXZXdaZFhzMDVHQWEwOGJ6VmJidVVzQlFHV3R3SU5aZzdNeklDUXFpWi92SmUwQmpRSGR6MDFLNXhIT2ZkQ0ZwVlJBMVhkdU1MNDNNUUxVWXdVMkJiNWtTQXZTQ0wyRHhYdUxrd052TTdwcGFPK3Q1cmZhUzZ0b2J2dW9VU3pralUvOWJnenp6amI5QkM1c0x1Z2JsUnVIT2VqNFFyeWRnWXZtTElWd3dabUoyTW1KejN2YjVOVm5ybUIySjZMeE9ienRZM2hNL21EUVdWVTJWNE5laXZFejREaG4yT3JqSElqSGZqRmNLTlZNWlU2U1d4YnlEQ3pnN29jcWR1MUdJS0doMlp2Q3BGWitkeWJCLzBYdlRBZFRvT09LMDdzbnkrRVVPdEQ2VU1kdkZaZWdnWWNERVlueHlocTAxVlhEQ2Ezd0tWQ1FJVWg4cVBEWngxcGdvV0c5eDFDd0pjQ1RHVkxtSVhKaG1WbGJMbWlJOGlXMGVqcWhnYk1oUlNLeVhNbGZiR0tUOVI3K2FtMnliL1dMQjFwL3FhVlRLNlF3blNrNGNyRGdwdWNRdEhiTDdYbFl0a0xLaWxLSDJ3ZEdTNW52b0RSWHhiZTh1RGIxRmtqcXZxSTlQR1p1MU10S3RnVHU5enp6d1ptWlJzd2Q1dG9HZUV5aWhjWEpmY2M4eWdoMGExR0dlVGhSUmg2dzJpOGJBR05iRHREKzh6a25TdlpJbFVCWUxxVGZTR1JRR3ZFbmwzUlhadnpHUG53L3FWS1paMHBvRWJEb3ZkY2E0KzZMZ1B4WThmQVhKRVN0dW9lc2F5V0dHTmd4QVlIVWhPZEdBTzcyRkpIak5LUWg4QWFyK0tZWmprbkJENllPd2RoWWdVOUh2dkFUVUtaMVUwQWMwL2RRT0krcmh5WEVXSy84ekIwdE0xb0x0ZFZPbnk0RjFHSFBzdjc4NnhwUGFlcUZ0VFdKNEdmK2VVSDlwWjBreW14VlVZcnlKQjVKT0ZIRkNWMHgycUpnZDl2RUVKWlBkVzNOajM2bTVmS1VORWliNlpXNkRRY0kyMGNPSlJLRmEzcEVGdHF3ZHlGSXl3VUhxbmdCT1NXZmxKcklCSjJNcDlaSFJia291djRyU3JGR3R3YkV4SjJDUXBCUGZLSzlyYTBhcVBDN2RhcC8xV1p2M2hYMzFmdDZhT2lEK2RCS2FFOElEZU9WOVZJTk9sNmRZRDVicHNrZFFnZ25tREVXY1B4SFdVZ2w2akdLRGZ5UlBDbXhSVkVKd1JlNUxndTVOajN6MnRJWElvZURWZTZibkpzeFNZOUtSSlpVdTBFclpvQk1VaTV6Zm8yU0hVTXczQWszZXk5VUR5d3F4YWsrTzh6SmxhWDE0ZjkyUGdadE1VTFpVYjZiZXJURTlzVXFOZVdwVCtreGZhSXNwYmJlUDdaUlE3MFNWN0VGNjI3MHpmcExXNmtRRGFLNWU4MHFmRXZUcXllckR4VGswcHQwS2V6K0dnZFdERzUwRVJJMUVKaWIwZS9OdWFzLzVHNVAvY1p6Q2VIaXBlbVVqb2FLRS8wWTNSbGpSMzNjdUo1TUtNRHQ4ZVpicVF3aElMUFNWbE85cXpyZG1aVkhzdFpTTmxVdzlDZGdwdW9MRkxtRXM0TFltb1FpN08zRjBkR2YzbkdpTkhacjJHdjk3OWcreloxaVdPTGhqL0gwLzJBc3ptd1dqWFRLdEVXSSt1QkpvTTkxZXdqQlIyUlBhUDdta2hCMlpsZ1AzUWovZkVTVUFvdG4yV0JELzNNekhSUmUvbGlUM3Vib3M0UlBURGs0NzE1blVnTncycVV6WS9jTE40VENpdXlRaitRc3h6WlMwcjNNUERJL1FVU0l5VWFRR0dxNUZZakpTTWV6Z3FhRDluM3RQYXN0SVBxVEQ0MmIvMlNTU05qbTIreFd3MklUQnVRdFk1alpidy9BTyszL2ROWWR6ZkZEQ3NrTkZBY29Ta09KMWNjVTJVTis3NHpONFJIUmZjYUwwaFNyYVJUR0lJMEJDdGNXSEt0QnNMMUMySTdzenc3cm5KUVNnSlVhdjFueFUwR3JMbCtRdVJkMk9rSVMvanVIZXk5RFBWVktHUDd6TldTSzF3OUFVb21jMnhCMFB6RTlQem16akRUbWJ1SUcyK1dOdFc0NzhFUTVEeml4VHN0TUxKMExyckhpNGFLQzBFeCtpTTVjNllIUEYrNHNuM3MwcXR2dkdGbk43OEF6aFJxNDZob3lGTVFuV05KTjhFTnJBeEZKV0EyRmVJQmdFUGp1L2t1ZTY2Smw0SFY2OS9ldGgvMFhNbHpvRUYyNy9qTGI2akNCY3NDWHlZS0xpcE9PTkc0WjNiN0tJOWc4QmNnbThoTTQ2ZDA0NkJIQ2MyMmxwNnhmdEdxT0dFdkVsc0hJSDkyU2cwRlhZYVJjbGx3b1NnY0JOWENhREl0SFVpbTdpbkVkN2RnUGlORjdSejJsM2cxeTI3ODFTMmplcmQ0dldMSVNTd2s4V1BCUFBoRGNqdyt6WmhZN0c1aVFyV05FSkVuTDI2WjNpZk9DeVNmQ0lGamxnUWVqSmVtbnhtNVJPSmNabnppbGtuc2p3aUNibmJaTERwWHEvVW4vUnNDRFFOK0xRVWp4THNraGRoQ0thcDhVVzRlaTZKek5IVStQYURNNmJXdVI2dExpZ24wcUFvbmN3MUY4RTVsbW9zbjhvaGlyVEFIbG03c1d1Sm1FSDR6dWQxbHdlNDI4UTlwV21PV3AyZ01TZ1YvRFhyZWlGTU1hNTVNa3JHU1lSWVpWeUpNbDFpMTBzZmdBbytnOFdDa2dHbkVib3JtVGQvdWlSNDVlVkVKODYyL013bGRZejhLODJLQ0dHNmdDeW0vYkFnNEFUVnlmWjMrUlFQK0RBTU1tUzVCMEhTSEkrem1WcytVU1hocnppd21HWkFLaE0zU3VBQzJWT0Y5RVpuWkluMlhaOEI2dU53enZqaStpOXBOcG1iaE96UkdoOVVsUTZuejRuaXhJOWx6MWJFbnNxZ241dTV4eGVFL3MybFhVSHFndEZHM2dwRWVjdTRBb0QwWERub2tBSEFqaFlTZzJRWlE0QVJXeGg3UU5XOGZHb1RRWElqejZmUGFwMzRSQVVzTGNxTjk0OGlGTHBORnQrS2ZPcFF3R3NhUk9EUnpJZEhVeHpwQjBaMGljclhWc3RpRk1Yd3cweTZqdG51dms3L1ZGOWNjUGE4MjBPeFJyZzJzSlM0ZGtaV2lQTVFwS0hMb2J2cEdmbnRVMisyWnNLUVErZE1xVkw0RFpkQjZTb20rYTdhZGh1QkxwTjI0R3pmVzdjY0Vrenl1ejAzN3IxcnUyL3pIOEVRWWI3V0FMME55dUlVcWQyUVhxQ2ptZmJ3V001TDVBMUNKcnNTN2pIRlZrd0FWdC9xTTl0UHc3cGFONWlnZmc3bkxaeHRBOHYrRG1VazFGNUR3WU8xaHp4NnBCbmUzREtSTUVWQlFhRjd0dU9uZDRVU2M5cTJieG5LUmhpVXFvY2FjZFNwVTNZeHlhaW4wS2RPMnVCSEQ0THFlaVg5UVlrS09lRHlYemN5WDlXbUZ0TjJvWU0xYWdEeWJjZzIzbXoyeHZ5cTh1WXh5NFRrN25kMmlZYXZsWStQcEFaSDRWVUFJYVJLRXpMT2dPOWJ4ZWVveVhnVnk4UTlaVUx2emdjTXhSNzVOOThtMDRJRUUycForYnRtUmMwclozREl1V1QyS1RsdXExano0ZW9KOVA2WVg3VFBqWHJTUjhNQzhKUTNqOTNSa1hkTFAvVWsxRTRYMkg5SURwb3F6WGZPdzE3ZW52N1g2VFB4dHB0KzhkSVVBNFJaOHI2MnIzYzNSS05kRFZLeGZRbXprMlROUS9Rc0dHeThZQldIem5aY3NNU2htSUovWkhEcjdnS0RubWExMjNYM05JMDNJdTl1VWlLUEZDd0R3SlcvWEtQYlQrWnR4VDBpUittWVV4dVRoWGVwMEU4UHorSzcvMnJJeUZ0RDNWN3FDM1p3NGgxWVo0ZzBncnQyV1ZIeGxWeG5uMDdoZThBcnNSbGNRbWh5ZVdXMnpEc1ZOQllSbEpUSlJNTmNFcDhxQ21ReERQRExMeW5mT1ljRXlRQXc2Ny9RUmlWRU11WFlYSDV1QnBmN3hpaEVXUFlKaTZ2d1YvZHAybVN0aUJkaldLSWpIZzlla2g2b2VadlY2OFF3YmU1RDVBb3RFZWJoaU9yVXlmUXMrdHZVVDZ2VGNVc1ovQThqM3VTa21Td2tlVFpGS0QwWldpQ3MrTVFUQ2oxZXdTZVlmSW5NWTZSTnVKbVZXcENzYUhYNXNlWFJSZjdVZGlCSXQ5VkNnZFhKa1E2OCtHazkvSWpRSlJBTEFJZXliMGhYOVdMQ1V1UUpsL1RXOWl2OXJ3em5GUUo0SE00Z1RmWFRPOXVVcEQyQ1NKTWZQMy94RUx2V1RwZkFlcWduM1VGemEwL3dlc1hmNVFSOXNjb0tIMndsWUNPRTg3MytmcG1JRHhrU25ySVhRd04wZlZ5Mmx4YlFnU0taM3lRR0ozUTJxUTQ5QlFjc0lQb2MxRVVUcExGUUFReHptdHd4d2pyYTJTL2xZR3Jjd0JLcmFpVWI1M1JXSm5IQWUxSXk2SkJaZThlMHpXZWc4Ylp1ODhlU000YmQydmFiWktyU0l4bWxob2NyMXFWbkd0bTdzQ2Y5c21FSEF3aDFNTnJCTlRMK2g0QjhjdVRyejlIM0lxd3dQK2VzQkEwS2lFQ2tkOG42MmFWc0dvb0x2OERFWVhUMWlTSU9ZREF6MFJxakdJMVZDVHc0c1dyUk1Ydis3ZWVoa3JHYk9oek5pa3Jta0FLTHE3VFNzMWcrcVJuNFFsZnJzV3NyNU1lSDYrRFRaVjFnNEFZaGlrYXh5VjkrNXVmSjFIMnIzeTREbm5SZEg3UHFMK3EwVmVIUHVLMndmSG9SRnZ2YjBONExjNFRlUDdQWHZTM0M4ZWphRktoeTRobDRyS3NiZjhQRzVNeE10NDB3SU5ZNTE4d0dlRUpDVlV4UGpUT1kvSWZsb0cvWXQ3UzFnZ0gxOGtVNW02Y2Q0R0lMaGoybWNtK0pCdDA3elEwdFZhQ0c4Wng4WGNMalpwdndUVGN0c3Z3K0JhMDR3T21Sa0VZY1RPT2cycmh1NlRYbmpRcEIzQkFYbmJockZxREw3MFdBV1RZWGpHcUM3akJMTWpzSndtMjBBNDM4Z3NjbnBBNDJTT1ZWQXEvby9TZHRBVUV0N3lQVWZGaWtheUo3cUZpYnptUjIzZmN4bm5PS21vT0Y4dGZ5ODZCU2oyaEN0UjMvZGdXa290eUVvV2FoMFZMdzJBbkFRdHVBdGFlRXNVZ2xtcmxuTjJ3S0ZZeFVFRFpVa0ZWTnVtbWdBT0xxcFRVUTFFeEdXZDlFa3JlYUVhN1ZKZWNQR0Zud3JvYzFMZFFOdUNtMno3RllpQjM1M21JS2dydFMxYXVkWVlTYWsrcVliUVZqUWluZjhJTG9iQ1JEU2IwZStDeTJUZ3lkdUNIaHQwSUlLTjJCRE1hK05pRXpnT2pRK0V6MVpRbG9SZ2piNVN4VkpodDA1RjV2eVlKdWlmYWpYampFczg1RnhVMjZ3OHpwcDJkK0RGZ0FlS2VCb1JDUGZGcWhiRVY3ZkVMcnFmbitKaCtaNnlHTHdaQ2dvQ2NhUGxBZFhoWXZPOTZPVVplTUp2bG9hMjFycUh5akREdEhLRUxMZU0wSG9pMStURm4xbGNnaVplUVZ5NEIydWhtT2YwT05PeVRXRi9yWVVsQ0c4MUZIRXllTTU3cU1zbVlVTWJmeDJNUm92ZVlQbXVsa2Rya1YzTVh1NlN4RFVTVEk5UkN5eVZuYnZPRU9LZUVrcElwVmhNRFZMUENsaFV3TCsyMlpXWkF1K2pBOVVQYTBPSGhSeEFTeU9hWlYzc1ltWTdtd0t0WnlpNWVtclRkYWZ6TzFWTGF0VTlva2w3VmlNMzZ1ZDlUdUlXL2FBTU1rMDhBekpPMUFoT1FDN3Z0VXUrVVhZMXJNc2JTVG9BUk4zaTM4T1R1T1U1UXBzWm1GMzZKb0VNckErU0QyaGpSdy9McUw5T3A2OEZEemJSVTZackdqZlBaS29xZlpENVM1RG9IV0dtUG9CU0JKUkZJVlhEVEVURFF0RTY1M21nU2I4aGpiWUpaOCtCb2VYL01vQzZPd3dHS1lhcVJJakJ2SDR1NEFGSnV1TXhhZE80YkdFYkNmbW1NYlJ6LzBOSVpCVXpYNnJCTEhBbGpIUFdkcFJ1dTNLMEpqbTFLRzhxTU9TYm1udS90ZHhXOXQySHQxTVpvNEVKQ0NSRHA1TTZIZThSZXVFdk1PdThtVUtKSGcxMEpBd21ROE5vYlZNVjdSem5JVS9GRThtcWlQZzhaNUR3NTFFK2JlMytDTFI4K0daeElORG1pZTAxdklWKzdJY2I5bEFjZHg1emYzTmlNZ2Z5Z1ZOK3pMaVltUldjNUlWalIraThJSTdleFdibHFraXFyTG1ydzRKWVdBanlkb2VvWmVnRkk1QXBRdGdSRjVMVkxjbUpHNXNKTk5yVTl1cERhcVNmRFRZQ2U3VldBS3MrWmlHb0pCbkhJcUZOV29TYnhHdjZYUXdVV2NLbno5TnZHakR1YnRYcVJjTkxpNzV0Wnpxb1hqMU50SlBtMDJHU1Z4R3p1SkxJRGxXeXBEenBIT0VaMDJxM2ZKbEZzZHR6QVliODFHU0YzcE93V1VLbk5vblR4QTB2R0Z6QSt1by9rb01QY2lMVG5NVHpadW5rSXFySlZTckIra1FWNXJqZmVOdTU4Y0JocW9EYXNCa0JSTTFDanlrVUY5MFluS1dINkROSUUwbWZlb25BblVQK2FGQUNZZU4rQmFWd3RsSUFuM0sybUFsamVUMnpFOEswUTBQbXBCRERIejRxcnI0dXNNYmwra3lCZjJtZjNuZ0MyOFpzMWtNZmVkYlNUSUh3T0VMdG94bDlKUG1jN21hemRVeEpjeHZSVTZpZHVDSGZnY0xuYmUwMUNPYlFVb3Jlcm1DWEtDWlFRQWNjNUlQTXdnS1lBZmFEcTEyR3h6ZnJVQnFPN0JLSVhDVU1YK0JBTnArZVAvNmlwMndyNXRWVFNXdWRISk5QS0NJR0JIQ0tnNjdnbFNIMXRxcnFzWnJvZlNkakx1NWlGUTFVcmxEZ2c5bE0wOXdBZ0kzUERiRHNKbWNQTXAzenJuYkxGbTRrYWc3WDhPQXZnZTNPdDMvem5oa2VQN2tDbzVPZE9PUFRXeEJYbDhmeWxYVnZqdjdPcEVnZ2JWWkFyWGlNM2RjNW1tV0kwZXlDR25MVlRYMmJMS3M4dU5CNy95Zm10T3A2WTBhTm5Nb1ZqakdITENTSDNTQzJJM1l2enRhVm1BUUNRQmZhTFgvNUpXb2h4aDZRLzNYUHdLODQ2cEJWeS9MbEpTMmdibVBERFdsU29aSzRZU2QvdmUzOWlkTzljM1c0V1V4NU91NHJQWjNSbEZYOVB5VnA0WXBFdVpKL1RpczZyRUNzUENQQTRKWW94Rk9nWDM3cHlaY3lOZDZQUTUrZEZ0WWgzWGdERlg4ZDhSRlV6a09ndldZNzNocFg5RUJIWFlYVWNCUXhPdzZjRUZIUGd2V3BTSzFOTjA4WkpSZm1udHNOdWw3ZlFQRVRhZnRwd0FTV00zdUcxUUFSdHE2U203TFNSV2FzMy9tODVER0VCUUhpSzV2eUppSXR5ZzgyZHpOcFZGbWVJSXJHYmhlTjNwTERweHpoU0svQ3dhRFBkZ1lYS0k2VW4wUExjdGVmSzVqMC8xN21Va05sRVo0RTlWMUlEYlpCYWw2VTl4YmIvM2pkRU45RnpqVFdIclFhZU9td2YrYXFMVHlRejFQVkdEOEVvS29TQUpWSjVKVDA1djFxdlF0aEtlSjVxSUhFZFNtazhpdVRJUW5UbGxzcFJKVWczbm0zalhOQXlIN0IxK0s0YWQwSGlOcDluY0xLNFZrV0NLMEx2dWlqSExmWW1NNDdER2xZbDIxdmJNS3AyMHdBcUt0WG1wdjNWeUJXNk1MNDZOTkdXNkU5QlhsR1pqbncwdnp3VnRXaHI4Vkw0bzZTUWZ2WlpWRjZyM0dIbnRVWGYrbjIvdExKMUFZZ3NtY1NhQ0xYWmlBZ1ZQM1M1OE1jd2g2WUJGbVhlK29LTW9uVUlUUzdLMS9zK1BYZkliZlBJSXpES2dVbXlmYThSMnZ0cnVobjUvOWJDOERrMThkZFUxeFJmc00wY1krc0kyUmhaRXlZb01PdHg1V1l4TVFUZCs2WXhGc05zSGRXSC9wbTlRLzBmVVdiQ3BLS0Z0QngvdVlNOGJUYWYrclpKdlZMTEdpM3k4UDVVb2xIWU9mcklXRDNGRUVqNno1YUVQc0lyM1VYYjNqL1dhVkFobFR0eklMQlNpZmd2M1JXcmk0K0VtNkNkcU9FWVpqc0diUDJOTTFWNmFNQnBmdHhNSnVQdnVVS09scXVJSU5nY2ZsZ2dteHRVV2Q2Tkp3K01hNVgzb0lKaEkvRDRReHRYdTRlYmdGeS9zYTdrU0ZoTlBHR2Y3VzVRQ1hoUndQaHlYNWpJRGQzMGRpQ3h5YnB4ZGpjTGFlcTAwdVdocERvMnF3RkszeTMvQVQwT3B1RzlHZ09XWC8xS090OEN3azN5MWcrRmZPaVFnaXNhVFRFbXlGT3FOVXBlcC82WTNOdE5vZ2c4ZGtJNmhpd2c3YVNDTnJXOWY0WnlSd0l4Ty9uMXdjeEV4TnB1SDgyWVl0M29iVURhbW9jZ0RWa2k1RDBGTWZMT3RWMFJjMVl3UVdMSnZidGt2VktrZ2J1R1NLaHYzQ1NhMjFKdkNFdjBjQkF1Q01tMFE2RUhlQjl2V0cvYk5lTFhTNUR4QmVqNzlaVVZibUxrUk9mK3g4T2d2b2w5TVFMeGtEcDFNUkJ3SjI3R0pickNiZk5wN3RqZlJRZWw5dFJwY2o0N2FMdmNKTVU1NUpnQVpEVXdleHc2Tk1VODRNNU4vd2RxZXYvVmFTRnRpME40MGxYbDM0b0oxNzlaZU4ySzQ5L3puZHNhRDA0TVdLNXRsZUJOMzZ3WWZMV3dmV3FSc2pGWXpwb0dDS096ZjlvcjRnWkFXM3o0TWhHd0RROXpPUXZrUHNqOWtmVkgxeDduckFWTUNSMGVMaGRYTUZnTzlOcWZIajNKcTNxb3hsaDhvbzJwWUFNWlVHUS9HcGtPZktBUjBENGp0a1pLd01WS0dGei9CSGZ1QWVQMFBhSXZzdE90VWJ2SEpoYkV3dzRYVTVYZXkrcHg2clNJdTltV2w1R1AzVHZ0R2xnMEg1d1AxMUxEODFlbHcxVnJYTGhwQzVLaTZYbWh1Z29BaFp3b0J4cHRzTXJKM2NXTjFMZ2RrTGp6UWw2WnpzYXplWkVBN2NGRDBPOU9mY3l1TzNjcUcyWmRoWEJ2enBSTGQwY0ZTME1uMHRRK0dtcnk2Zm0weFdicmhXbnNrd09FRmtZeHBUV3ptNWdyZ3VVZmhKOHJNSE40dnlrV0l3STQ2SzVQRDZybzVHNzlnTWhtakN6ZmQyT2pZMnE3TWFxbnJoYUVzRGl1NFFybGsvUnI1YXNYRDAza3p0QWZSdm9MaGN6ZWFSWWRHM2dsQ3JBZ1gzN1FjQnh0NVhxTzM3M0hwMFB6MDhnMjd0SXdnSFgzdmZyVk02aGJiQlA5bklybjJRcTVxL0lsT0w3VkpuQmE3Q2xuWmx2N2FmdlBkVzJuRmVVRmgzVHNGd3QwbUxvOUtvOWJiK2hPeDlvcnFKYVF4bk9tNitUMlQvM1k3OU1iZC9OTzk3dHhvUzdNWHN1ZDNWZ1c0NWdmSFdzUzlkRktOMmgzdFhKakJ1MWdOYUlvYTlEaThiQ3dDUjV6UGM0SlJIS0UyMUprUERZdHc5QWlpVjBHUkszVXRZc0lOc3JDZ2NaRHVyUnp6dlEzNURyaVRIR1ZxL0JXbFVyMVh6YWIvaG9vcVdnRm1pamxzUFFEaXZ1d1VzTU0zTWIrUU9rZ1NvVEtqRWk3RW8rY1ltdHF2WlBRQUYza1VqWTZldEhFTDNQR0JmVHVhY1dxaXNwdDBpd0dVdzNaVm5UVUUxY3hIZ29lczJOVkorWkM3dlkxSTkzWVlZaFpxRVNXMnk0ZlEyMXc1ekU4QzJNcGNJRzRuK0RXek9EQml0N0hqNVp1ZVR3dXZCbkhCbU5rY0lHSnluS3ZINEkxVThyVjAyVUJyL3hmODl0VFRWY1c4ZWVJMkRtQlE3T3FzWnZuK0NwTmtiRXRMclR6UWhUY0lYU3dhbEpMKytZeGl3Mjc2ZkFLRm85TVBTVmNTOXVvL2xobTVUZ2pVN2xhQllFVE5hZkJ5djZsZDczelNEakhkUFM3a2Jzd0p4OUxvSGNTMTVvQkRMZVFhYkIxYTQ0M2hWam85RUloT2Vsd09TUmdYcW93eFFPTTQ1YnRLTit3czdNUjdndmtOakVIdVRFMnhrVDJmblU2MDRjL0ozd3RSQ2QrbFJYU0p0dmp3VXdGeE1jR05mc0hRd1pRQmIvVy9heFdYeGF5cUwzMXVMa2RZU3p2cEhQY2dpc1dqYkZIdUF2Rkg2QUVrbnlJMFI5N3dadHhWWDBRWWlubXBLRFRhSlV3UUFnYXQ2OUFVUldsQ0hIaDNCWU0yekYvRU5heGJBWjA3cWJ4cmtDMjV0bHdYN2FpZUlpVGNjRDRWcjNpTkFpdkszTjJKUSt4VGpFdlRXM3JhejN3Zm9zR3I5eTZHanF3WFZJMlMwekVML2cvdjlpV2hGTWJ2Y1NaeHNKamcvWERXWWdKQnlDbXNpUGNqTi9lTW05NUpVNng4aVlqZlhRY2gvczV1OGpraHlNKzV0Y2YxWnRVekdOS2I5RHRsS3lwclBqb2xKaENwNmwwa3A3QXIvNElycERVS1VnRkpoYWdXeUpMVHJDKzFGMU8yVEpvdUk3WEtrVlc3dlpKSzdaSHNZOGM0Njk4S252d2hqM1N0OFhjeHpSSjhSeHhTUFB0SFVzQTdRaWRLKytUWExuRXdsMHdxVjROZjNaWmxSdElpdFZyYnI2cVpqTjBlSzY4VXQvaVJIUUFEU2FoOWJXZDc5MVczMmVudWhkTEU3VmRPMDV4cXA4RFB5UmhMc2VOMzVSRElnU2FrK2pIUnFoU2JDK3Jud0J4Yi9iTDRmS0x4WWlyaXBOL0ErKzljSnRQbGVWRm1jUkRjR3d0eUE0WklpbzcwdUJDWFYwZTU5OXBKb2xBSEI2Q0VpR01QSWpqdGpGandEem5rTWN4UGhRU2FnZGQweXkza2hKTEo5SnV0TUpKNURBYURTcXJxZWY5bDVvVkhMNVl4N3FiMDRjMXhPVmhrYlJRVzdOZkppeGEyc2ErWWN5OGVETXFLNzZ2eVNBZ0wwZUZHcTZkajBndk1GVHEzMTNROGJuMzUyMXlCSlRCZkhvd0dNNUNURWdGeitLWi9BNFJCN0hwV1k1TnFkNk9IbTNOTDExZjNQeDhPQnBNMldkbW5IRzBJdFJRTFFvN09acWJpdlNybXVKditYQmdiZlIwaWRqaU8xMFJUWXlNV29GK0RUbzRUb2hNWHl3NEVOK2tPc2duVzIyL2hkNi9Dem14c2Q1QTdENGR3VjBmdE5tTkh1MEJSWC9IVitjcnVBd1BZUmo0c25iSW9YK2VOeElVYXlrcE5kbDJ1dWVkSGsyVzlHdGM4TmN4WkxWdU5pTDZLNm0yQXdkWEFpL0IxQVdiWGFCUDVzcXhOSklNMU5pbEpyOFJ3SFFCRFpFVEVBcnhHVWlVa2RrZmo0WjJVNCs0ODJoQ1NzYkRWV3gyY1pad21EZlQrTThlZGJjdEpzTWxjekkxbU5jbGdZaUxDSDdYekQrayt0L2FMeUx1Z1lWaU9DWWxLUiszS0h0VUx0RjhRdVFOQ1hyYjBkTG1jWllkVyswN1BtUGVveDRna002R1dFS1JKZFlON0lkY2d4aEFwVHJCNjVhN2JUSDlzMVh4d2M3aHhpRE1IMmdaOUl1em4weWl2eWk2OVRJR1J6QlRDZDFEd2JkdjJURlM5MFJlMGVDTGFyUG1aVWwvb0hUWkxIeUw5eEZYNkx6dmh2T1V5bDZtMlFDUXFCUEFBMzB2OW9iTExTbXpwMnMrTU1FdllZdTdwZHozVndTSDdrQktQazZLL0N5K2pvM2dKUlhlMUJQeW5qU3MrZkpoYzJPL29sck5oL2JDQUNnVUFsV2xZbmNTRTJQdHJoOGIxVGV3eHhHOHdraXViQ0VYRk9NV3RJeXFzcFhaa3VpL3ZqSUR5eWx3R21wckV2dkdwM3paWit3RlNJWEpXRGpXUHlZNHBOWEdWaTdtN0xSQ1o4MWswdFRMY0ppQmVCakZvMzk5ZnFFaTRRKzg1enh5S203YXZ4VEJsVDMwUVU2Q2F1MFBvbEFXWnFVTEpCaWk3b3BDbXpVMm1yT3ZIRHFuOHJGNzFnc2NsVXkxWnduY1NvS1FsdmJZcGpzcEt4b0kyMDJHYkUzL3JlQ09HK0NvazlucFpBR2Q4cEMwL2p6U29hekU4OHJNZHRKM1BWdnUzK2FnRmx5VVdHV083V1VxSUUvWUUzNTBNQ011Q1RMNmZpU2U2Vkw1TS81V09Qckp0MEpDcGFSeW11WGo3RTVuWGZ4NUFoTWdienZWK3U5dDhhZlNNWVE3S3NSWFZKNEt1eThIYkZkamVBcWkxTnVhZm9SYmhTR21HNjlkbnFQdzhCcktVRUR4N1lTaWl4RTlpVERyc25UeHpkbXc4UEhHNGdDMXNPRnhuenZyZE8xSS9UdEN4NXhyOEd4dm5zTjI2YnhzNHdWZmxmalROYU1RYUNOT2R1THZPbWE5bnpzMEVla2lhZ25rd1FnWG9GZDZESzVzMHZnZllqYjh2RkpHRmpsUUpNSDQ3bk41eXZqWkVFUkJRcmF3bTFXMFlxamRsckR6ZE5yVm9kend3NW1ZcVRGV1FuODdZOEhvMzNwV3c4ZDFycWp5WVY0aUd5SC9peS8yVERaaXV0ekc5NDg2aDVDOVlkUTlBYmJFa2ZISW5qbTZLQ0VUdmJLRnVzL0VhY3RFT2FoczlBbmlkNjRaTFRqNmFXejVIRTFNdXFZSCs4SzloczhOYlBvNWNtWkNGOFU0d2MrVzU3Z3ArME0zZDJlbG5WUWtNYTZuN1VaM0pBMTlKeUtvL3JEL2cyK1NpZnVQSmROV0N2QXRSdHdGRjkvNzJJWkNQN0RhWFBJaG9FMXFCOUJ1NW9aOUhYdzR2U0hMNFBtVEN0NHdzZS9rTElFOFByRXdSNkxCNUVkNzdiR1NoWU9uREtjRkdBcmk3QUtYSXdpMCttdy94QXFpckdDeTJ3ZmxJMWN4V1I2cUtpdzRFcGxaSEorSFIvYTRSUW1jQmdLL1JWcC9VMEFYOFpaa2JiSGNjbk0yRkw5bWIzZ2xQbVFlOFJ4SEh4bWFYM2t1NkxDZzZyL0JGR1dxWkZpZjRIOWREZmJjcUdaVFJXUjl0SGNnQ1IzNUQzai8yWTVkcm1BWnFMR3F4Q2w3Wk8wbTZ4UWdjZHB2OEN2UEs3SW9sYXNVKzc5ZGVHUllPMEhEY211bU56S1UvQzl3Sy9LMlJJNllsY0RtdGY5YzVLTEh2YWZTNkowK2xvR0tCMFJtcnpsN1RqWXg5bnhKNmk4UUtwNE5WaXJkZnFFZnBYckdsWnF1M0RDYTY2a0RrckhZaGY0N0VIbmZnbXgwQ25GczdWUFROUUZYVVo4SUtkZnJtQzdPM25DK1l2bk1PMFFaTE9nTk9UTTNORHRoN2xsVVkrQU5Xd1BOZE84eW5zazQ2eDBxdUl0azNWcHFuT2ZiY0IvT3ZsVnNjZnc0bnZOS2EzRUlKWEloejZTYkJjSEFQMnRVR1ExSDZHUU9wdzhoSGFscVgwYUg0Y2tvRGpDZndrS0x1MDNuSTlMYU5YZ2N0VGRoT2N4WnlwQUN1U1FuekxlY1k0ZlltaXRzclZmaEwwdUY0THIrTXJYTDZocStxMjBUQmQwMUpsU05nN2RGb2lPdi85L0F0ekk0a1JuSnIxNmk4enk0Z1g3U0pwQWsxMzJkclhITE1lckZuSDBlYkpBNm80THRVbTk4ZU00TFBXS1ZmcC9maHJNS2NYRmNPQUZtV3lZL3VFcmZZcUlPYks1Zm10Z1R5NzJtNTVsZ1BSZUQ0WkRFamZUNGUwVHBRS2FYOHJVWkFtM2h0R3RJbGtlTG8xVWx6YnpjVGpyRkRuSWFrbHNIU0c4RldvUW9vSUhsV0o5cGFoZGozZHJpb1Y0UUpxUUlMdDFSQUcyZStveWdkeUp1d2dNWU1sRnhITGIwTjN2ZTFCbFVyUXBwRE5zdnBkUXgzU29McHo0UW8wZVRzeldsNjlkSjFhTEg3bG1XcnY4TElxZk5vc3NrVnQwdlUxRzNQaHg1cHlWUWRqek02VU53a3hjeG5CcXE0YWtaRmVYaVluWjFUL3FLMzAyYVFGeTRvVDJoSktaQ0xWUDRVZEkvQmVsVmNKQWwybSs1bVd5QzVPVFMyYTFjVTVvMGVxNFJyQ3JLREJjRW1rODJuQ2RhT2JPejcwMTRENi9sbGhwMytXUU1VR0pZUTBzZzhRcjI4RGFtNU9rR2lMZ0xVM3NKdVZITjZuczJmbEpIRHF1NytYcUlnMnF4UWhtRUk1a3ZlUHhqUkVRVHUrWEllK0pYdjNvVHZkd2I2R0lIYTJ0YTM3RDBzalhoUVUrV3NDLysyTDVLaGZ5NVJUNmhjVkNBaWdGa0JZa21XeWdrM0FGOXJQeWRvSFFyVWRzTmhRei9pbUE5SStTQ2RZTGxxN1g1bGp5SmhpNkpQQ2hNaHk4UWNHSnkrWUJrc3gzd0RvZGgydG9JenVjYzRwTVFMajVwSlNYaHJDZTBqQjB5WlNkL21HSEw4UXlTcm5aZ2ZJb0FQZmZCTkxXYmo4dGNHc1hDMDRGV0FJYlpVbmdaQUtwMjNERllEb3FrMjd5dXBsRzEyeWM4Tkg4T1hMQmhINWNRVWF3anpqN2cxRk9lUmNkRlY5VVh0b25yS3F2UmtiNEdveE40S0FTRHlDaUFMMzM4S3dUM2dkaUw1SDF6MEZZazZvaFlZUlU0b2R4ajJKaGxjMGF3UEh6eVpEcXdiS1lzUUR1Q3pUUHpXSURhTzdtNFZGeEYveDY2aVlLbmM4YU1xWlVkY25mTnhCTVBSZ0RDZ1NTcVlMNXlEdDVWejNTd3VDMXRONkJkNlhlWmo1a20zNm9XYVgvSEM3YWF4bGlnWU00YUZRdnVvMmZXYlNldjlydFlJb0RVMkFHU29lbHAyNzRvbkpCeXVBOUZpZnNDMlp1RytnNU9FaU1pVXEzL3ZOeHMySmlmcjJTaG9kVTllOGltcDRqYnplNEE0Qmg4SytaSWRaSC9Hb0ZUa0J0cTBXTHc4RkhhRFVaSXZXQ21HSGplVUZJaS9PWktibkR0M09OcFhVaGJmRmFuUHV3c2V6TjRUTTU4blZhQlFDRTd2Qm5ibTNHVldnUC9JdURhbU5BcmhCcEt4Z0cxZWNFM3c0cjFtajhQb05FK0M0d1NnWGZsQWwvUTQ4dWUzUXJ6OXYrRWEzbmZMSC9RUlczZ2ZoTVBqSkRQcTB2SmIvbXBWUkZyenpGaFBBaHhTcTJzOHkwV2NIenFGS1hQYnNFdE1taEl2ZENOVjFiWmh4NmVpWlI2bFBoV0lsWjhGVGcxdE9uOEROQkJwRHU3SWllNGN1ZWtJcWVQOE03dDZhVkp0STR3Nm5LSnF0RlMwSWlkMTIrelNLZ2Z1WW5UbTl3RlovbDNwckNtVklHZThmaEhsb25iWmNPU3FZQjN5M3kzejh2V0xad0tYa1dKMEJyUnM4YTBQNis3M2Nnb1JQN3hJM2tzWWsxYStoRWV3SGprZllKdlZ5ZEFkOW5NMlRWMXk0Z3F3S1czUmJzTGhSaTNTUTkrU0VGVkYxa0JZZE9kL0ZHTm5KVENEWFdENWJiMG9sVW5ob1M5K3BEODRNa2RpUjJOU3hjRWNDQmI1VUI1U0xwRDlQbC9UVENlME80OWNnVUdvSEtIY1hIR0Q4MVJnaWxaWmorZC9RcnF4UjN1cnM0MUhkTDhPTGg2SkRPVDk5UDhrTjBmeENsWjdOcUVZbkJnaDVDTWxqVVh3TWlRd21aTnJSdEpmbXloZUZrWFhla08rUmRLWlkrRHBwNUdwbW5kT1l3UklxTlFXOWU1elVjelB0ajZwTSthZnVRa0NIT1BQa0RGWVFqTloxV2FTZzFEWEdmeUxsLzBtdmtvTzVFNEJkQlJ2U2p1K3N1RWpNODJSMXhjRkRtZDF6M1R3WEhhbnRac3BpSndjUUZHYUlzbVFxOC9EWXk5d1N5KzBRcVB3SkRkcXM3TGtBNW9reExyMDUvTldLeCtXaGZwVEdhVVA2d25QS2wwdzBCbThKNTRuSUUxZGUvQTNaYUF2dzQ2clcxS084TklLZmJ2dXBRNlNGY3pmNy9IUTlWYithZm9QbWZlNUdPUlBFcDg2K2ZYR0RoQ2hOMlIxTFBsOHQ5RFJzQWpmMEd1eVRQNHZQbE1zL0FQS3Z3UVhxM3Z2dXRMVGFZUnlxdldZVkxNZm5iSW04dC95cjIyWFBsRUJsZENWc1YrL2RxSDFTN3NldjNIZGNxUnFpWTlhRUNmSWpQWXVTa01FNE9ha2VZZkR6TzdqR05RalhrbERWa1lsODlhc2J1bXdQNGlYU0tqSjFCYmVOWDJGdjMyOER1VERlYmF4OUF2NEZ6d2l4M253ek1IbVpuVUJMVmtmZDRGeVVCaUs5T1AyYlZXNldEblNCeXl3NEtSZWxTR0JyQ3V0VHJtNzlEbno5OGQyb1hQamVlVkp4ZEhqdUZZTGVFSGQwR1E5Q1NKOFk0UlJzRmt3TE0za2R5Wng0QzJGU3ZFWXJGandiR1Zjdzg0cDNiUEYrdmhzbVQybmtIczc0RU1zY0NuY3Q1VU0raFVXMHJUWnFaUkduQURwdHNNaVQ3cG9SblNodjdXYWpyMFpFMllKS21aejFmVXdzYWhxNUxodUZ4WnVqTnpRVVBJdmlnd09jcURGQmkrWTNuZDVmdlk0RDdBOXlSUFlFVXQ2ZjZ4S0t5dWp4ZDRwSUd3anp0ZERxSE9RaElJNzNZWjZEbk9XSmZWVmMvWmo3eWRCVFNPMDVJV3ZxRE5WZlRoZWRoWFZHUEd4ampVb1Rzc1BSeXVLeEYyblB6T0o3dlZoSVR0c0VzcXEyM3RjZ0ROaFBYeVFjL0FkNGExK3JlYzRpU0Z0cVAvVm42RlFWMUY1a0RHcmNqN0gxRkZtL3I3QW41QmNGdVJ4L2h6L21FaUt0UHRuWTVQbWFKeWpCbVRBYkZOVU50YnpJc05td1UwUVBvMnpRNGhKRkJSaXR4UU9EOTBhMjRERU42eUpMbzMyL1NoMTBYUjUycXVsbVpXVlp2YzgrYSt1bUNBZDQ2ZnhiRyt4RC9Scy8vTzBNSENEQU4va29JSllabHlTOXh5WSs2VlhESGlxSXUwdWtPWjEwRzhrVWZUWVFpdGozVGtrbms5TWZETzNCTU9lWWtYdFlmRzdaV0FWUXM2UGgrZWtqanREUFM5NmMvZ2Zza2xlYUpLeHgvVnBuRFhkS1NPL2o3QUszZ3l5WnA3YzhvTjIwT2h2a1NFWnVIbVBXZHZWaUZ3M1hyZ0VhSWdQb0pMSEE3UEdLYmFydUl5dkdXNFYzeVplOVZzYmZFaU5veGpEc0FVNmZCOWhiMDlUdDJwN25sM0x4Wm9SY2pKR3pPeGtQeWtjcGVhajRmSU55NVp1UVpIeDgvVDZFQTl1Z0hoL1p2VVJzR2dXLzBtLzRLYlNzSmcyRUN6UXErYkFtOWZqalozNWhRUkRXWWNkbmR6TEg1RXJWeWhiZHlNclU1WWJKUHc0MmR3MTZ6VlpDOVMyemhYSHhzR2ZnRHJiUkJGSTZBRzZNS2ZURVJjQTlPVmk0NjRyQ1ZNOThPd0M0NG5SMlk0NzhiZy9BMUh5TFNCUlowc0VYbXpYaTF0VmhVVUl4Z09QVWFGQUxTUlhvMmcrRnY0SFJsYXAxYk01a3BucHBNUlJrUmQ4eUI4UDFMak9JUEJ5N3l0NTRqRE1jMUp3Mmo4bmlmZEkwRGRVckdHNTUvTEVmRFhvcFlITXBWUUIwenhmYXZjc0RnWVhtZ3pHTUM4aW1DRnBZSUFXMHJMaldydDR5b0pMcmVkS0diY3poYVFjWjZvTDdUN2gzM0lER3EySXg1S1NURExBNGJtQm9FSFVaa0VDa05UZ2d2N3RWUGE2SWlMREVEL3ZUOWhyOFhwbHJNSWtXMUxhQ1dadmttR3Q5UkR6MEJsTEc3WFY0c1ZXQTZZSlBLK0xVQ3ozUHZKUDl6dE9DV2g3czVBYUNSTWY4cTRJeTZvbjJ5NUJ1RGI4QXIrcXVuUGRxdjNJVFBGeEV2aXRMcmZpeHhDaitERWNlVW1ZcEZLMWxOdE9wQmpXZEk5dURtSHNhWlNYZ2dCZ3ZEaEJSMW9qWnlRM0xLei9naDUvOHJGcUs4ckgvZ1hiaVdka1dmUUVtT2I4RDM5b1ZHWW9JbUNjU0NRUGI2N0x1akpJN1MzS2l3M2tPejJDbzJNU1ZaUXdoZlFMeDZWSE1RdkV5OExvdFJKbVp4N21mZ1RWeEVGSEZnMHBBQWRMbFhkSlNSZklEcUhQN2kyUEFhcWx3Z0xtVFdwTlJTTUVuSnNSVnl0TnNHZWxudFBONUNxbXhqamsrbExQTVMrcUZmcjVZK2lrcDljMTZJcnRtREcxZ20zN3FXTVNmeFMwbkZ6ZUluSmRsSGo1SytCNGM4NjFQRm1KbzNNODdnQXRQRWR4QXVrcElZdllVMHpGUTNXOHQvaGtHaklJL3NvbVA0aE1pbE9tQTIrdkRuY1Z1TDdDc1VzN0s5WG05QkcxeWlnejM2QzNuZHhPWXhlaUxxWkROZmpzZ21XSDYvRmtNWnJabVRycW5wcGdxQmNmdXpVamJzU3NXcDlaaXVMMlJOK3krWGtyd1BLUnhZNWNzRWJ0QSsxWmFEZTJrdW5haC9Dd3NsLzE3TmhSMnQ5eE4xMUJlUnR2bzd5MmRTWFhxa2hwbUw0Qm0yU1NFN3hKcDJQcC9RaHFEaFJiUGNEZCt4bXlYQVBaUFd3MmNjeWE3WjZLSWVMdEtNM21aRTdlR1Y3bTUzdkZLakJWdU94bVBSYmNMcGsvaHVHOTVIcFhWNDFUd1lmbUhNcmFhallod2Mra25JMXFWbVpVZ3YvanJXU2VoelVwMEJ2d3lyVmxSSDA3WmJueVp2N0NXcHVxTVo1b2x5M3R3aTlzWmx6TUEyMkFLeGVPeFRkNlR6Nm81MkhVZlFXaGl2SVJBQ3o1cTlLQk45S0JRWmprbnBGYzNXNzFKd3pKa0pmWm9oQlJ0UFlwWHJrWUFub1ZPVldodnBQaGhPQzlzZXB1NHNRNGhzMEtidHcyRVVTN2R2Vmt6K2l3UFFOR2dsay91RGlaQzVxS3p6SFZuSStNTE01NWFaNWxDL0FXWWh0SC9NdVhNZ01mSUlTdjlIaDFkTENSU1EyNHpZM2tXS09XNW41UUQzd051WGEybjh2aUF0Z0s4bUQzK3VKUDkwaWRRSE5La0tGVjVNR3I5UnNtcUl0NmxvMmp3eU82RS9uT0dNY2dTb2JPMWJZMVo1TFlaQm9VVnNoSlAyWDljazJ1Rlp4LzR0aFk2TEh6U0luSXlUMWxCUnRHUlNVa25FazNkSVN3RGxlM25WdzhzdWU4b0ZOSG9mQnUyWEtzVXlIMnJDc3crNlJScTh0WTh6RVV2cVNyNGIySnhMcGJEK0ZjZ0dJQXovRVRBT2d3VmUrZmRwd2RiUk04TWJBT0dKREhpd2FETXQ0QXY3Z2pFMEJYeExtM2VHaUlzVTNuQjNOaHgzUUl0U2ZXeE5HM09zdU9nRmdqQnFyQk9LL09FQ216RnNxZkN2RGRaaXVEeEQ2Wkkyd3hvMDVvOG1xdlFlY2lkZTZBYTNtSisrWnlmd05qZlhwMHVpa2dQY1h3UWpHbVY4TC9LNEFYQVlycDRMSWFaUnJ6YTFOaFNQTmgyV09zM3hWeXFMb2lBNEJ2R1VUR3N0aTU5cFUxSEdHQW03Nms2RkpTMjMrSjdBUU9WMXFFQ3hPckl1QVBFNUNGRjhIWTQ3b1BYL0tDd3I4Wk5XbHNxOHYxOGc0Y2tYbnUwb1ZXNTk3WVh1cG5yMWd5Y1k3RVBWUktUWm1BZTA0b1RJai9jbzZNY0p2Y0tMUFh0ZE9vWTNNWVVkUEFvS3prc2ovVEp0Rjl2ZzB0ditwRkdSNUhpSlB5aHc4Z3N5aUM2VlJVQy91eVVvcDB5YlRqMzdLa0szZjhlWUtMV3FsVjUrVGJEV3I2bTBLWEx5cXhDMmR6ZDZyT1ROWDZYbXRIczUybFgvWUppMk40YklNSEFaTkFIQWkvT3RITC8rMnRBVTNuY0U1Snp6VC9RZ0cvejQ3NGZiUWxJbE1WcnVFeCtDSTNOaWc0dXhwUzVQa0ExZk1mSTZia1ZQWStQMTM1RFpmMnREeVF5eXArRzZycTJxUnZqT08xN2JTSTM4aDJ4TnhWNmdIS1BCSHdJZDBBRVpqbis3cVdFK2hFL2gyclNMM2JSRTk1bDRIblQ4bmhPMTNKNmw5U04zWmhKeGZzeXptSnZSMlR1bHRRMjhROEpkYWZ5RTFGWno1dENXYzMwVUtvRDB3cFdPRyt2THZIRFdLd2p4cHZWNUtwNG5qZkx5cjZYMkM2TWxLdEYweXNyWTRBSnM1d3h2UjBiS0Q3dEFGWXd6dkpyeDJkU0tyMG9OUmU3UUhrcjJhSzNEZDh2M1N5VHFSbExmWEo4UUJ5S2J1ekxoYXJhNkt2cUsrQlFwejVkcS9pQlg5aXlHekNLRjd6ellhc3draGRZTjljMjRCZHdEcCt1WGc1WUtNSlZYa1VZbERLVDE1a2YwOUdVdnBPS2VwR1B2R2VqYTdkVFpkUzNsaHhLN0ZaUDRGS2VUc05wZ2wrTC9Rb2o3eHhJM3ZRcExlZURjSVVPdzFHNUtsdFVOODczMmtha3FWb1VlVXJhdFhPeDlGWTJHaHVBYlpKM0ZOZHdYUUpQOG9EZ1J1NHJ4RDhURFJJWEtaYWQ3MGJNR2l6Q1ozekxIUWNRWUs0Y3RrcjBEMzF3QnNKK3FML0ZqMGxGdXA2NHc5V09BdjdJaEt5bFQxejdJbEtGZFVhZXdrVlFsM3o4a2ZkWERTNGJ0TlJSdXREQWZSQktrTmtzL1JWZmhyTVBYd1lNSncwcjN3TWpJUUpHYXVqdkJqd0xONXd2dkl5b0lKSWovTjM3Wi9kLzdRWkxQVVBZOHZqTzZqbkJ0SFJyV3lEUWJOVnUxclFpVjVSbGpnOGVWc1ZqYTBFdkFiOHdIVFliUlN6ODY0UTlUVktySGlJMjhMZUt5MFJybkdZdHFIdFNPN1VKUDdZbU5aU1k1Zi9JU3loWmJ2ZWZ1SXg2dGdweWxVWTlVWW8yMHJQU2lOejI3MnJoYlptRXc4ZENkRUFBcmc1RnFvOFJBSCtmRnJDa09la2x6eEw4bnFmVDh5THNjQXNUMjlXc1FLTkx2Z0VLSTl6STN3NTJmcjZRcGk1ZHNZemZ4eHo0RmVYY1UyeUxpMk9tV3RZcFVTbEJpMUZvQ2piTGNOU0dmbWFOSGY4NE9ZZHZUdnZtWnlHK0w0eHBtcDBHOGc4VnF2aTJXcWg1MlY3OUJ4Ykc0TkcwRk5CUWN2dkZmejEvWlIxeTlpZWZ0WDZIRTdkaXFqcHVDN0ZuVWtNc3NGdzA3N04waHlIb0hJZjdIRnl4NHVjUkd0cm0wVXYwZkJMQjU4N2FBd1hTTjFRaXBUTkp3TkpmejBxTmVLK2E0MGdKTnRuTm1aNThsNURkSjdpcDdSK2VQb0REVzdpV0duSjg1ajhZaVFORTR6Umx6cUNSSW1xUXVxc20zYTUwMFlLZmdPTStjSVRqSllWaExYNTNRQ2pIenVDZTZWOTZkaEFXMk1TVGZJRE9hdzMxMUZOZU9tN1ZFSHlaUW9OOGtjWHQ4QllUaHNNUUY3ZUdhL2Jpc1REYThWbno4MUNaMXFacWUyUklNVUJOVGpyUkQ5dVpMb3dNWEF3N0c2Y1Z6OXR1OEM1bk5Od0dvRHhKcXM3N2IzQjlGVmVUZGpXRzhlME0rMlpVQWVyeE1icWtoNTh6QjRmZW4rRUUyNEk0bEZmTnlQVitKOS9HdHNvOVEzU0FjNzMwYXUxUS85RW1UekFWY0ppNWRRZzlUM0E0bEo0d1dPVW9kendBVVBPWDJ0WGtwL2hITnAxaHRHdTZOMURBNzZQcTkrNEc3c2prQWJGMCtHd0tVck9WOEVEelp0Y2ErZFZuTDZpdmJ6RElkeWxRTnZpMVQ4azFKMW1vQXhVa0RGQkVtU3hUSmp1QzZXS0J6VjZ0Ui9GdEE1RzV5NHpGR3ZUSzhPRWpwVlFJem16SHdXZHJ3SitEMXZmMHpmbEdhSXh5Wjkra3BhdDN5M1NxR0ZGUU5BMWVXVGhjSkNkSFlNWEpNaDhOclV5eWRlZy9oQS9tamJHL0tKUGx0RzhhSVZ2R1hXRFlxVFhQMHBOcHhncEh2ZGRQdXZqbm1ZdXZGL2dUa01jSWlCQTlJblRpWHJpdFYwWWllTHREZ0ZrU0svcGxyWkVxVVpjSXlvcFdlUGtMY2M5cHdwS2k3UEN5VzA3enJkcWJtV1ozK01rZFJrNEhjVG9iMjZUSFhtN3FveHBIaDB4dTV5Q3hlV0NIWUw1M2hRbW9PRk12bEFqaFdpTm1ocVYzWmVTUDlOdnhFZUdNdi9NSzRzcWdzVUFuV0w0NmF0ZjJVMWJZYWVnbFA0N2VsR0NsTXIvTUNpMGxiVlNqNk9SVjBuc1lhRTVSN0JTd1k2bUV4Yi94WmxFU1BQc2VHb1k3WnJGZHlvakFJWU0wM1kxSUFRVlNaaWpzTGF5REx6YnYxczFDbnBRcXh3RUZ1OG50dGVrYU5OU1VKbExTRW1qUmh3ZDdWd0RGNkhpWWV1VmlwaTIvZEY1M21GQUVsc0dpN1dnQTJZSXBSWnpMQ0g5UkRtRHYrbFFDN1lnTkpvR3J2dXBXSnE4R0hGSmdHNXBCV3lBMk9rSTcwem9zWlozWnU1R0dwR252OEt5ci9WVGxlclFVbHlXV01DOHFObVA2NzA1Y1kwVTMxRlgxRVlFRUdZQ29LbmgyWjRIdTRXVkFWMFNRMjdySlAvR2dRUVB5L1VlSUdLOXpvd0xhZ29vcVZNZ3I5TldwVXY3OEdhdjZEVHJ5M0VFTUNBUDZvcEkxdzYwRjkrVlhPaWN3ZEhBYkl0WUY1MlFDcGZZZ1NFV2s2TnBLVHpSSThOSVU5MUNzU2t4SjI2TWhnYmZlYlB6azN6Yk9FeThjYkl2MEkycTR4Z0pGWWYzUEY5VVBpaGRlbS9lT1pMN1ZFdVFZV05DaUJRUEMyL2dCK3QrVDEwb0ZqZm1EbWNnR3p3c25jUnRITW1MS1RhN09ic2dzWG0xY2ZBeFdLdVJBSXQ2MkpwNGg4Ym13STdwaS9EaDdQenIzMHJoS0FTdmpyS2N6R0dEZkwvbUg1a2VxbnlSK1FGdmNCUll0RXNRQnh6cXVDUWJmTnQ2anIwaDlPZUF3cFlscUtHamlVdkJGRVp1eFhFR1NSUngyUUJaUG91NEM4bnp2R0xYVnRHZ3p2K1UzaitGQnFjWDZIZGJCcmN4ZEt5bFNFWVRPSFVCVVUwOHJqTVlpek42WnFDVnhEY0tBV0ZqaUlzaGxSUWtybDRDWlpHcXkrbkFacUo3dlYyQ3YzTVdQY1FmZWhpeDZmd2piOXdCR1BDNmt6SHFWVU9CVGZrMWQwbWIrbE1MYmdsYkRlaGtOdnVCdEgyS21RVG5hcjVLR29veXRDNFFKTzQ4Z3JpcDJKNFJDZlh4UEg4MlprVm0zNnR0MEVnSy94SW10Ni8yOUYrYnJXSjlMYTg4RE5yNTJTalQ0WkJIWnRiLzJVcDBiR0p1U0Z1aXduS0JsMXY1TzJJcGJMZUFWWkZKV0ZXL0QxckZoUGNuaG5yaStpdnZsa3dpYndYMmN2WlZRR0VNc0o5aXR5d2owQUY5MmdBZGowT2ozeEVyclh1aC95cjc5aVR5N2l0dkJjWEZzdTUyRk0ydktKNzg3TlZSRlArNWxXNFFsWE81a1NFQ2Z3NnFKTTUvNzBHdUZFNnlWTmlWTVUwU2pHdEhlOUxwU3JwUi9FcDNhV1BTUTBEYVNWM2ZwL2lJS2UxRUhqclFKdzFSS3BGb2E4OE81bzVkem1BTkhQTy9YRy90SG94V1U5ZmJ5T293ZUlNRm5qWlBYc1ZtaER5NTRXbE90eFlWSU1udjR3bURVUk14NDhob3Azby9Vd2lweFIxNGtvdW5IMEhoMDJlYUFkTE5zc1BGUEZtaU5qR21aZWk3ekUyTHhpN21xZlFBMzRrVUxqckVzM0JLQ0lNNk1TMncwbWVqL0ltQ3plc2ZwcklmTU9aUkpYelU0MGgzRjA0NjJ6YmVwYk5xc2ZjMTg0cWFSSG9FYm9kRXhwK3BGaGNTWFJYSWtzQmpxTm12MUhiSllheWdBaW9lOG84d0ovRm1QUlpYcmFZSVlQejNReXY0dktzM0YzSERKSXljazFEVmhLNFRMS3cvUnZDR0Y3aTFUb1VHdnBDVXRuQktkT1VOZmlHa2hDMTNQYngyYmRabE80NGcvRlhCZzJwMW1URWR1TkEweFZWNk9jLzJKTjhzT2hwaVJVbXJGTDRjTUxPbGFCZS9Qem9xWXJtQ2lzeUgzUTBoN3Q4bzhhQmpaOVp4S1BPSHJKVzU4UmxwZHVBOFFTOGxJWUg0SnNMUDlQaFNGVXJVQys3NGRBVW5XYklvaUN1NnFHV1FGZDVhUllvaWRvWTJ6akVOSFMwdEU3WVJUaWdKSnVXQXZMZ0RtUW1jYndKd09wRlFTTTVGcGYrYUllV0dEUklUNDQ3QWZUS1BhTktuQ0tQeXBJY2xleDJLWlF0eDdFSFNVV3ErTzhxamtPM2RhN0hDTC9LSFNXVVY2ajhVY25zbFE0UG0vWlNTTXU2ZDFoTnFCVngra1BYZHJBYXlmOFN4ZEM0Q0t0Z2I0Ny8wTGZNejFnTkFDcWd4Y1ZpWHg0NHVlSWJWUzR4czNnL056QWFNaEgveDdHU3Z0Z1B1WnBYY3AwWXFsMytLeTgzY1ByMWxBU3J0YTVJaU1NRjl2NWVmMHAwQ1k3eHhFbE44UEtXOTZXOFdTUy9BRjI3RUNlMEhnT3crOWFSRTNxR244NzZWTFg4Uy9odld1eFhxU083MzFEM25sT2N1eXRISWFlV2s0NlFCT0pDNkc4eVhvN2VnZ3BFTGZNWW5VcFd4ZTVUN0tJY2R6QXBKeVRpdUc3NnJsU3BndHlFRXo2TmgxbytSbExDamlSTTJha3M0bTRGVFNYMVpaVnptTFJZTDFjT0tocjFHb01vMmFCd2dCcWhCSHJSRHVnaVl2N3R4dks1V29wKzlqdHRkRk4xd3BnNWRZK1dNWjZIUnhuRXJib1BwQ1VDQXk5QXhnZ1ZGK2dQSGV1cWhKaVE3WlZHeUx0UUVtZ0JUTktyclF5c05pYmQ1WmNwaDFRQWVmZmpxU1g4enV0WVlheG05MTZZMFV2bFFjNkxobGErTXlnWVNwNVZaOXVFUWpoTGd3SkxGQW53d0E2enJ3bXFpcnNoQWQ0dVNVK255MGlHeE9QMW5sUDJyVk5zd3dFdW1mb1Yva2gxRHQyblJxbGFOMnlDWm96aldvQ3lCS3ROdmU0NGZrYXhlcEJOQ3EyclRBRVVGWmZvUjlmdUcvK05zWlpSMng1MzNhQmdSZUJKRHo4L09sZ3FYcm9lUVZCbjlrUmZDTEhpR0VkZm50cHpkMEpHVHN6OU80eXh2VUw1ekRqTE55VGNPSnNBeWRHYjdibDd2MmVKZWlWRkdybEVvVjc5N2JrV3pTbDZyTTEzOWdUMm05YWdPa013N2oxbVZTQ1BjSmFhcVFROUVHQ2sxSy9WckRWZ3VkZHMwOE1XcnlicHRwM28rRTNtWWxjZ2w1YWIrVkJhd2Foem9IZk43U3ZpVi9mVUtXT1Q3dXBxcS9VME5JeGcrY3FLaTgxRUNicW9oMmIvNFNPcy85SDBtWmhCU0wyREI1bTJmWVRFcFJRZVk2N3puTmJKV2VsdkJYUWNrVS91dnVGZkcwaGwzamIrUGhzR3BTYUI0MTJ3NnlmbTUrS1VhQi92T1NMdTV2VXpsR1J0WGdMZzM0ODFWMlYyWi9Mam9vcVVLYVRGbE5QbXcvQUUwQklGaVVtbGdHRUtBay9ZZGdxQ3JXV2JIYW1YWGNyL09wdlFHVDNYMGt3UVVzSlZRMUdCUFdrd2sybTNOVVJ5ellQc3YwZ2g5bnZTYjBBMS9CWWJ4ZEFJT3NhMnhBaFJDQTFNK2gxWTRjZ1hDODd3Sm5qZmt6S2MxbllCTmhwSGdkV1AyOTlrUDljQjgwcW4rRkwxRElYaEl1VHlLV1FQa2kzRTNJZUl4RDlaOVZkOEdhUEFmZGhVWW14QmRJYS8wTTl4K1phTU90TlgzcUpNSjJBeDN5WU9vaWV1c0pBcmJaQ2l2djFxenRpUzNINGpUZ2xqd1ZFekxhT0FrK3Jrc1BmaDdSYjU0V1pLb0tjNXQvVDVDRjJ0TmE5WTJ3YWJFc3IrSE84UUhaOENOWGNvbHFhYTNPZ0RLN0VQWWNqN0ZJbWd6YWVHYUlmYlFuNStiQjFyTlN3WlRLTVVpR1MxZUlJSmlTcm44YXFDTjI2b2VIQlNDT0c2TWlvNGZROFlIaTV6S0RJdGovTG9TM2Q2bFVJdmZhWmZBcTY1RHQySktLNlpBMFpCMXpUTUdXV0lyNW1oZE1yak9YUUVJRjZPZ2pwb0YwSGZyNk8wUlVPM0hPMWhSSWZybGNQTG9QeTlLdTVzYWlFSHdXWElwYVB1L01yK1EzNkFpZEFyMzlWTDVjQThWSExXaWVKYzltenN6Rk8zRTVVQVJtMWVac05tclNLMlpRdUxTRFlxUXZvbHo3UkEzVExzdEZwM2ZWL2dFam0yNG9YU1diR3ZLMjBKbVhaTGNIUTF2NXJqRWUrVjc3c2FiVVNyS04xbXBFbi8xd05PUjIyOXJReDVRbVB0ZWgvamIwVkJzbjdwQ0t4bzNQeEV1TlF4bzRiQzZ4TnBCVjA0eVRNVHpLbDdkcWE3eDBWM1NXUlNqTVRqR0pYZ1cvNWliZll6Z3gwbld4M01qb1MzZ0Jyb1NSTkNvcW9kOXdRV21NTkRHV3BzalVkRGdqdkNyZ0RZcTBidmZaSjYxY3ZtK2pDaGliNk81aXVtTlEzYzlyZktZdGVDRDJxVGRpTDRwTW56Vnc1QWt1eDJFamZOQ1d6OWwyM2pTRUdBa0UydmhRK3EyK2xHRFgySmlBN1lpQWhLWEdHTWFQajJoelp0MGJMRWZ3b29XTzZBWndMWlRLa3lwUTJUamt3YTl4UVRPRGJGSlo1L3FSN2w4Y005UlY4c3BEWUhpYUN5RGhIdVZab0JKbkZoZFZLaUp0V3RuSEpiRXhYb3lDanVlN29RR2g5K2MzcjFSWm9KYVlUaFlOQTdYZ3JaRFNhSGFYVUtLbEsvMHh1N0wzR0Q3ay9vT0lyT2s3N1dOdEhGLzZOUFl5ZENURzRySGpGM2RVRXpsRjc1TnlFaDFjck1YMVRNMnNxdGpjWlpvMkIzQitGK0xURFFGUkplblNteC8wdmFoNHEweEJYSXVjc3E3d1grc1FyZW8xWUM0cWMzU3pXcnFkTkxtVHdiTEJDMGY1dGtTR3FKY29qK0pnZnFUQUJFMWhGTlNMQldYOGFQa2x2WFZ0L0dzUkJ3VHYzeDdQOFdEaHlBd1BjeDhWOTM0TnR1SDRHMkYzVkZURUtnR21MbG8xUm1yWjdxZG8wN3ZyTkpuVWhtaEtldmQ1cXBoYm84bnh3UUx1MzkzdXQrMFhJbDdpdE9jNFRVYitacEIyS2F3NlhUSjd5K1lKTzFnVmhJd2U0TFpERkFZVzlGdHc0YUhvWmQ3V1dHZWtmK2xWZFZDZGtnc3ZBemhsQWwrUUlpNmJaZWhYTkpmSno2STVCbGFLb2E4d2U1T3dCRnFxVmRVelpiL3orYi94NFluOTJGOEJLU3pJUlFjL3RIOG9lRHhVVEp1YzF1ZnBwdkZYSElqYlF6SWg5L3NpTTEwUkN5MFJJOEgydG0vMktRNUNjazI5ZUowNzdDZ0ZPQ002TndsMDZlck01UHM0NDQ2YStXWHBpQ1VTR3NROXliNVk1a1Q3QnJWQnpKc0hzSkFYd216SjJ3YWoxRnhLWHNCaFdQT0dTNGJ4T3JQUGpnM1h0djQ0Y2d0MkpyRUhYSTJzLzBYc3JmMVM3cVV3eDUwMWFncDdWcWhUUktjK0p0Q1ByMmVoK1NzY3lTdkxjeHNvZ2pwYnhaQVRwOE03RlVudTF1VzdaSVdQUldCZERUeGxRd0F3S01KVWhycUFKZkxzM29nRTlCRzRrS2gxczh4TFdHV2dVMGZJRlp4eHpNNWpQODZxaThHbFhMS0xTNVk1Kzd0M0pvVHMvZTZMVDdNZVpPL3o2QTFDN3RaOG96M0RjZGkwOU5RckQ3Nm1ZTmhLT2F0L1JETTV3Y0FtbXpxK1pFaDVFUnhYYUFqL1NaNEwyaEQ5cXVmWjZBdUVRaEExRk9FUDlFRmt1dkFFdll6Wk9oSTBoV0ZjSFhteElsU2ZsVUhPclNPV0VSbDlRcEcyYTVsZENJRkk3SVNQcEtnSjBEb3YrMldNdExJcUFsSnFYbnRSOWNmNTlGZTVOQ2N2bzFOc1R4WXFlK2NtOEZhYnBVLzNkUFN4N0tLekg0d0NqaC9SZ1pYSGY4anp2N3JCdFVtbUYvenFWRzF1SHBNV0M5by9iblRXVnpZN2ZxdjdWaEp3czNwZndBd1JpdE40R3U4c3dremhzalB0NjJvRFoxWktPTWdyVlMyblpzeWZrQ05FYzN3UzE0MHJ2TVlRalhjNkdSUlVzalRiclR3cVJDVFpETWVIcThlejlTZStiQTlIcEQ4UUFQbTJlY2RRL29CUFlHbzhkK1lqYXo2ckpsbnErV2xFMkJadHIzb3p4TGVnWVJqOXFLWWFkMmQwNW1nZGpvbitDVThmVzVWK3hHbGl6SlIvdE9HQ1ZHSnVFVjIxRlNwTEgrK2pvMjRWbE1oWG9nTnVoM3k0Z2dsYjhhUG9IWnFsWlk1ZDdTTEt3cm1HZG9PemVid3FjeFBxVzlQbG9pTG5zSVp2cjBtdGhwM0xOelQwc2Joa1hzNExIWTJ0RmpjcnJ3Q2YvR3NDVG44UkN1ZTFKSkFGR3FDUUJvRDJOUkg2RW1QOUlBMzRUMzdXU1RXMXV1dWVoMzF4NE9EaTMvSmRJM1dXa3NaQjFCRE1ZWEx3M3VhVkx5WU12T3hBc0FMMXk2cTJaVndBeVZnZHI3bEdvWUNld0g2Nkg3RXVDaWp2OXRwVXA1UzUwV0lCL3N5MGF4NGoxNUJVZ2ZBV3RnanhLYWhvYXZ4MDRjOG9sSXhTSmxUczBqVzk4c0pvT3o0UDRMQklPd3VZUlhtSzdhejlHYjhkZkJxcWhJdytTNnhBMWtkblkveWsvRkxxZ0prUVNOZWpsTXpxUlg3TTVBNm1oMFpXK25NaVNHcnBOZ3E0cU5UUUVPNkpBeElKTEsyemRmd3dOdEQ0Wm93YktFZ3VDM1lQQ05WQmJCMEhBQmxzYUF0VTNnaWI2MWVoOG1zbDBVU2ppb0ZkMFJCVm9wWGEybXRLbkJXSVRJdWJtNjdOSEVCZE4xa3Q3Qno3aWpBUDBkcmJEa21XQ3p5bExkSU9rV2pNa0U1RTBBYUJtTDJ6MVFOcVpXR0Y3UUsrbmFCQ1IzM3VXY2VxcUJaZHE2QmxNZ0hsU2ZoczduVXBBNzRlV3o0L1MwTjJNdzhKT2NrK2loSzE1UjJGTjBCTWZMY24vZVhCNUZBM2dLSlg2QlBqMTFSdmNvY3NSQ0JQR0hpOGJPcCt0ZlBacklOUTdGd1F4VG1DVmt3TXExYU5CMkxBNTRDT0R4dWl5eVZDNzNKTXhTSElQazYxVUlORnhmZ2Q2aXYwcUlxZmpPU05pWXk5UVJITVNFSlJaNHV0MG1ucExDSGhTU1Q0YVRZSUdYdzU2TktkTk5lYkMvcDFZekoycGtKcjhad2REYkx6Q2VpbUh2bm9vaEtIQXlCUkpTUm10T2w3QzZQeHh0K3ZGa3htdk5Qd1pzVWlFZE5sV0l1Q1oxVlBZWVc0QjY3ZHR0dzdIdm1rdDNzTEpTbHUrVEZjeHI4b1crNVRmQ1NkUmNmRk5hU1p6UWNaL0p2K0k4NFFkaWpnUTRSRGlwZEcvbDgybW5jUXA0MnBkRG9uMURCVWFFeGwrVjc0MzZ3dFo4dld3QURObGEraVYzclE2N0pQSElBclJrTzZMeDA0OFFtQXp1SkFRa2tYeGxVZDdxaHB2Q01abk84QVJvdGFhS2s4WFRvSVFkK0FKbW9VNk9XU0VXaFBKSzVKWG92TmZqSTdzQTZtSXMwWVY2elhBTFJCT0dNeE9lNWFMQ1BkTU5uM2ZjTzZHNVFzNWdZNFVob0xRU0tFdG9pVGZ6OWQ2YUdoQ0JEK3hIN0ExcVA3ckd2Nm41L0JCRDI2RnQybVFqeUdFSWlLWXRuU1ZtQWF3eUV6dVUrb0doSVRxeGsvZUJicW5udC9TZGQydmZUNmJZVWJreStpQXRXeWVrQ1lZaDNaUEZFb2ptakFlczV6Zzk5QlFxVVRzVXZNY3NiSmZMeFdXdDYzZEFZdnRoUXB1L1ptY2VVcWJkUFl3Zzc5cGZMOW1sb0NmbFhlZkM4L3NiNzhwQVZ0aGxBbWtlMG4vUWxQUFYyTTBuVUIvMVVEMlpoUWRteE93elBCTWRkWUcyWFNXdUlZZ2JXazFxWVM0OHc5dnU0ejRiaXc1cXFtc1JWbWJQSmczZjlaNUp0bTFFYnM1QjJoSndDT0o0aEFBTG5teEVuZzJFRkV3b2dKMzBzakpCY1k0R1FHR2wzL3c4UEJGNlpsaElZSnJudWtpUHluTmg2cEFlRjBTVzEvSFFDcFJUYmxEMUdIRDN0Rld6VDB6eThoQWs3dktPZnhQU0FOVk5tcFNsMWh4K1dzZ0pRdGgveU5jTHNOUnlxcGViRkQyckk3M2tWdVdBeS9TTk41WEI4U3BkYWZDN2FEZmpUbHJ0NDhHZy9MTStJTDlDSUNnN2dTbVlLQ1d3eDVWd3YyS2lyR09LanhtTkRncHBPb1J2QURyQXQ2S1hEVkFHSHFueHdjU2hhNUZuTXlTVGtGV2psK0Zma1VpdloxOVZGejNVeXdDaVM0dG1PbFBGa1p5aVI0SC92SGJjdjYyV1NaM1lXNFd6b25iZkthaEc1UUpUc2ZHbW9JMXN6R2UyMkJQdEUxMGpFSUwzYk1MbUpoT0RTYzF6WmN2Z3RHRjdpT2phQXVENWhtU0ZyNlR6RWJWTVdNbEliTFA5dUJnVlNjSjJTS2R0MzRrS3lvZlBScXFldjM5eHZBZlFaY2h3VXpXcXVRcExjUGNDUUVFVHpJOVpob1lZNDBBekxWNERuTkdxNklEOU91SzhiZXJIZTRtQko5YUJ6alBpa3NzdTVsSzV3MnU5V1czUVk2YUdGdEt5eVdBUExEa1lvdnlUVHppaVFCbldoOG5GWVlRcFcvUFNQeEo0anpQNVNOS3JYNUFLRDA0Smt1akt4RDFxb3lYM0p1aEhDak5YR3hZR2s4S2Y4M2V5c2p1d0t5V1BWOE05bktUMWE5cktaVkJHRUJoeTF2aVhTL2ZBc1Y5MGpPWm9OZWdRSndhS1dqcUhRaFRwVmE5bWdHaXl1UGEvZHpKb0pnMUhsRmRId0wwNlk0SjBhVnBhY1NtSFJzck5ZQnN4eGM3R3VOTER3UzNDNjRKMnk4eW1YWVhscUdJN2g4Y2JDbHNEZ3EwWTBsOHJsNENITWlyLzE1MWNML00vc0IrV3MrSVllNEJoUmt3aThTMVdYOThjL2tlMWpBaFM0N2FoaVI2UGttSWFYa0Z0bUdjVVZUa0VEc1BoRGQ1bnhGWkFXK0hqL25xQ3VrODIxS3pLWkVWUTVZNTFieENUV25DU0JIdm9LWTVyZVpReFNBYlk4SkI0Y2hXeGhPWlJTeGF5TTllaWpDYVppc2szNWRTeUdweXVod2dLZzB0ZmJzNGdJNU5sUDFSaEVuMWdpOFhTTERXd1JES3N1VzRsMk5HSExtalRoQjJvSisyQTk2M2VCa1pHN0x6WTF5anRVK0FrQ0xiRDczc3hLTkRXT2x0cXZiT25PZDZYYmlnUkxjb1lnVHlGbktxZ2dUbVlHRWNqUnMzN1NERi95VXRFQi9VbWttOVZPR1pRYlZ3dXUydkJJL3RGZjlpUWswYUlvTTBpdkpBemxTVzdtaTFYQUtZTXJkTVdrRENKRVVkNzYzK1hzZzYxN0RRUDNORjZCMTc1OHM2RytLMlk5QU0xTVlsU1JBa3VVUE9uK3crK2N4dE5yV2w2ZXNPSnpPbVZvYklhc2RJVWxhNUxvYmdlQXg1V1l4YU5reFY1LzZ5cjRYb1FkVHdUVXNNcTVOSElFdDVsZEI2K2wreDc5T25iTGtTT05SSjBPRFdDSDZpZ2VuUFNoM1hPSVNXa1k3YzlsZ28wWm4zRGdIVnFSaERVdytDTzF1eG1FMmVkL202ME1WakZoODAvMWhZTUJ1YXp4OHh3WEk5NFlNcFptaW5GdTNpZWpNT1BMZExzbUZEUHJXci92UTFHY21qdFk1QVovTkc1UFU4S2RmS1prek9Ba3JkMHNMeGJZYXRPTUNQbGkwUm9iZHI0dUNreGM4RVlRWjRROUtyK05yWXEwU3J4a0NNemxidU5OS1dZcFVoSGdWbisxejMwNEw3R0NPaG1aVlhSV1lmOER1VHNKQXc5NEJhNU41T1JlYnNkYlUyZHc5djhPbVdNN2tROGhISFdPd3A0U3NpRDZsV2F2QTlwb2ZLeVZMbTU1ZGxQU2FleFppMS9sMTVnUmJxWWFIUVV4bjlDdmU2VkhQQmpQOEtWYnVmTFIrRm1TdGlkM1lLL1g3RXJ1eGU5N3VNclA2VlV6SE5BbGRaQ2NjN2F5ckNPT0pnZ0N5dzBjTkdkWCtGRVpuZ1hVbFhqbTNJNEpzUEl3ZVZYNzhUZHF4a3d5YXA5RVJlaTRyejI0UFBxTTVsbXVoNWlRYTNCQ2Q0Q0JGY042ME0zMG01OFQvcURHVFJNdHJReVdrd0toME1QMDNNMDdnbjRHaEQ4cGZWUjdLNEdha0xIdUw3SEllM1ZVMHFpSStMTEpHdGlqd0RKWkFTRm04Uk9jWnJSdU9uenlpZklleFdNMVlmeEowcHdKSzJVZTdJRk42cnR6VmltR2Nya2cybmw4RDJPK1hzemt3MHI2bFh5aXVUNzBUZjRiU2YwZmpjQS9OMmhZdW9ITnZLbGFOWGd4VGd3VWVSMkxzdmljajFjZEJLZ0dWUityR0FWd1R6c25oU0VaMEFmekpLMG5odUIyTGhRY0ZtZnc2SExST0ZXWGdkZHBpS0hLQ1RUVmE1RjUwcytEL1hTUDdPL05UQks3YUVFaTFzMnVMSXJDRE85RzhFUjdybDN0dHZ1VGE4djVtNFBIcVJ4ek5hVlIvbDZkYlZucGhvald6c1IvWnlTK2dTZFpxK0VuNmg3NkFmUFlVczlwM2VxVk13L3ZnZ2hPN3ZqQ0FXZ25HUVFla0RIdVFPRk5DTHhuRDlJUmNPTVdudWxNUGg4eDF0Vm4wQzlVekVUTEpkR3poalhGYjZUb0toS2lzd3BrNEdPaWcvU3FpS3JDLzJ2Q2VkNUJtZFVQdDRzU1V3cWprdUY5VndCcVY0T1kyK1ptM2lFSThETE1pTmpaTFdvdUVMS0NMQlBabkxLY2xNVm9hSy95NXVuN2V6cWIzNkVrbzJ4d24wQTJNRU5DODF0cWJpNHBhdTRidU9nUzh3VnN6dU9zaUVxZnJJK3NhRXFoYlYyZmxrajhEU21ubXNNNkc4a1JibjBya3JUY1FPUVpHRUVpZWFHaXpMaDZySGdBSEV2SWJjdnNpcjVYVEtTQmdHc2ltNkY1Y2pkZUZKeitiYXJEVDNMZWFPV3hrc0VIRjBqTDAyNnE4WUlHbzBoSWdDNEwyb3lRY1MrWC9hL1B2dm5Nd3Y2SkpxWGJDZjNKMmc0UHFQbkduWVpJcVNPV1Vkcis0N29qS1h1UmNHYjZTZWFkRk9Wd3R1YnJJNWsxNHhpMkJpaVlKTVhWZ2E5cHNTcHNLTXRPZURyUUJnQWVHVUo5cTJ2dDVwelFYRWJBUUtBWTRkYlQ5M2pZRFUrb3gxTWFPL2luQWc1UFBWUzAxa0JJSXl5Nnh6UjgvOWZPc1FCbUp5NGt0QTNpRXdzV0Z6aHh4cnRLK2RmVXhkYnptWURPL25PTy96Ym5lREJBV1VYY0ZQNnlIRWhaK0pjYkFpTVR1eDNsd29za29FRzVIWGo4dTRGM1BIZXZOSlI4Q282QVJzSWczL1NhdFJ5ZXJ4eGZkR2ZRU0ZpZHJab1h1b1I3UDBOcy8vSTdvdUkyc0RJeFdqSDlqSlI4c2FPcVRDQ2p0RHg3VHdVbjIwTHVyNW9Ya2NaOEdhZk9FU2ZXdVJVeFZmaW5RVFRyTis0RXk2VnlLOHZtTTB1MjJSMnFFVmJ6bkM4aS9KUmcraWlBak9QVUpxWGtJWmE5MVU2aDN5WmhCMVFZalN4a3VMbnJtdDB3OXVlZTQ4SXBlZ0J4M2dnT0VodE0rNVJsMUhvdUNad2J4eHoxeEMxamZJREljcm51RUh0VklnbmJJN2tCazlXUzdNZmFacnNsTXB5Lzk4TkN2VENEWVRXYkNyUWFrOXVxSEpXc29lMVdJaldob3d0dStCT29pL0w2NFR4MGlITEtaL0RDeGRtRTRFcGlUYm0wYVlIT2pmZHh0RGI1KzltVXRKTjIxRVhwZFE1M3lWbE9hd0w5SThVT2d4N2RvdndHc1R5UWdCOXRTMFJZUXoyblQ2Y3RlZ2hmSmZlWko4cy9QdlJXaHJhaExxcUtWWG44czdHY3FaZXVwUjV2cjl6YkxTVEJUTHIxNlFIK0ppa0VtZC9YZS9Qalg3bSt0ZUNGUkFzOEgwRDMxOWU3ZlpGZDdud1hQbm1XK2YxN3ZkajdRMlhFZ2RnWGxyVXZLWjRWZFZZM3Bqc0pQU01zanNMajhHTjcrVWlITUFFZm16VXN5cjkrZG52RCs5a09YTU5pazdwMDJzT3FIQkpXdktQdkhTRkY3Z2NFYjlNUEFnempjbE9WKytjUTUrTVhuVnpyUElSTC8xaHFxWkVCQU01bk1Wc1kvYkFicElMUm5PWWkvZytoY2lnNk1qaDdKMFJUSm5xSVhUVTJMRFVsWWlJaXJVOXFseDFsMnJhaDlHNUhGVkZSWkZwdjM0M0hhemZuRDRrUk16ZHl0UDdEOGJOZXNoZlJjUG1ZWUVpMnBKbGtWVkhOd0ErdUI3VlNQZUFndWs5cUVhK0Qxc2xQeE01WStiNURiYkhEU0p0UjN6REZtV0ZIbzg5aVdZT0U5YVdaM0pWQ2lqc0NTN3FhN3BGKzBJZTZpazRPdXZWSjJyU0NqL1FRYzRxSEh5d1BvbEh5a2JkYTltVUdVRUxPRGJHc2llaXQ1SWFNR0NNN2NGM2lCMnNIS3V6Skx2Y29tNzJFeENjZUJTR0E0U1hXNDl5N1F3K1QxMVhBeWZWWncrUHNOTG5KcTJocGpML2dONU1wWGtRRWdIVEJqZzg3VTZsKzQ2ZmZPM01rYVlrTHF1R09nVTVIVHJlYlBxNU9IOVlTM2trNFlhczIzMjBSTzNtd2FkQk5adGp2YXFjVVZrUEk5L0VBbFJzUGtFWXdNM1JNR1d0dG1DWHU0RXpBRUw2amlDaVJpM0Qzbkoyc0hSVDM4WXljK2pROWRESUJQT29iUE5tU1BiNWNMRjZNR2hTTjRrWWlXdlM0cGE2blBGajY3ckZTcGdqYWg3SkN1c1R1TW56TWN3UzJCbHdzaE95WEg2em9yK1ZFZFRpcVdIaGNGVUZMbnFyV2RKc2Q5Y1pBUmtMZTQ4bmxtRHNyTFVVTGVsY3N3bXlvcmM2QXdNZFpxV1Z3Y1gyMnorUHo3aWNzbVRxcFB0N1J6ZmpmTytQaUdHOHBGK1pvR3RUWC9LMEVVQnk3L0VzYnhhcXMrQ25xbWs5TC9tZlNreHRBekdHL24rWThjQ0V2R0RBM0pqcEpSQnJhZFRKb0s0TVN4TFJyRzlwR2tDUTRmeVpxNDg1U1ozMmNWeGRUZ01JcG1XeXBUR1ozTjg1cnJQUlJYMU9RNllmd0w0K3dOZVZWR0hXZS9QUVdGYW5FbVJhbVdmZ0MzcmlRTVhOOCtWR01ZL0dvT3Z5MXUyZkJ4eElEMEhUTjROdkVLL0pSR0FwY1pXSVRJaWtHanRna0dYS2UxS1RHekVZUEFlT1NRdlh3YWp1cWZTMDRFN2dmYlBnQldDMllMcVZiSjNjTXNueUxLU3d6ZFJmOXc5UkFZN3UyM2tNdE1Vb0FmUEhwdVJNQ2NWSzE0bHc4SlplUWhsTlRiRExTQVNIR2dhRmljR0tWQ3o1YjlHZWlHSS8wOVBVOFRNSTFKUVR1RVVweG1rK3ZwZ3M1TWJRd2FBOTFnMm9ySVFPQWhXTDhGZVlYOTArQ2MyYTlvSzk0NSs2a29na0V2T1JubHE3Q2h6eTg0RnJxRWNwZU1HZXJidXExQ3ZlREJTRXlsLzE4U2pRNmdGZDJRUjJjaEFNeDJLOG1HUmdkbHJjUjMzejZXQWg5cnBjQnZCN1RiMUpPS3NvWXlBZGhpMzR6SVp3Z0tMVkRHZkNVZFpUYW93T3gzb3R2Q2w0Zkc2TkMwcHJydlc5RTlkVktld0EyRnBDZUVBeHY2S1RGTXorc0NIRndhK05UWjVyZmJpRjRSemE5NVZSTEpmaFIrOXVlU1R6aWVFa2hwTjE5RDBJdWpGZ0ljTzRjQUY2YjE4OFlrY1pJRzlhbzI0MlA0aDR5QUZ2eXpqK09Nd1ZBYlJpM2o5ZkJrUGkxaHdXdWVWYmJicU02QTdxUVJUYXdBc0RXTDdPWGVYTE1WZGx2YmF6VUMvS0F4UlVDOUg2L28yOGk3TTlERFJYR0dhQjBpaCtKS3JncTdlYUpFb2ZmYktyRVNZa2t2SEMwV3VIbW95bUdWUU9OWU9PbUVOK1h4bU5WMnlVVUtoRE9XU3d6WlNmdzFmaXRZYlJDRlBnLzR4QjFxQStJdFdZNUdrcnljd2Y3REMydTRHTlNsaDBkODdGV0RqSnpsdVJXSytlVFFzOEQvSzFBOUFBRkpMU3JhQUQrWmRtQzRjMHhBd2Rkb2Q0dXlPc29KL3E1RzFoUnBiSU4va0tzY2ZOeHpkOHhTY0FZSzZyQlQzV3ZHS1RaOWovTjdMRWNGQnZqOGpoM29aMzlkWENVYks1WVRLUVFmY29Pd2wybDJTR3ErK1BaK0FlUWlRbU5NZEExTkFHWjBYUVJxbmNydkQ2K29HbWY4MTMyajJ2YVlOVHpWMnV1aUxHaS9Yb3B6NWZnMFFrL0JxYnNjaDd0WS94bmErS3RxMHo4bnd5MmZBaTk1ZXhWMGFFaGZveXB1WTFQM1dUNGxjNklKSGZLZXFIODdwRW9hRjJIYVlkTWJmZC9KWWVMZk1CRW1zRytxQTM5bUtweWI4Z1dWOTYwL045bmdtM0JBY1k0aDRxNFM4TmlkYkREUkZGK2s0Y0VEWjRKZ0E5WTd6OE16b3Q0TlZpRUhtMTN6eU81c2loQ21veC9oeTJnQVhOd2xPemxJeDBVS2ZOeTlDbFpRY2kzSWVvN3N6U3VyTUJ1eWRXMnE1UGxleFQxSWFLV3YvUkNDQlh1bFlGK1FpUTQyT1lzZk5rbmNKOEM3WDFuYjdZOWNFZ0FaaDZFSzVXRVVGaDhBZ3FXNDNQcHJSUkNxeXlLK0VuVEVBYlFKbWkzZVVVeW9wbHpBclU4MVhnT3J6UkRYY3A4L0hZYnc4MjZJNGp0VU1uNk9GcUVFM3JLRmREd0JyTWkrVHV2MUVIRFE5SHFXZ3BBTUlhbmNvV1hCV2N5ZXlNSE9qYkFEUnJjcDNFdS9hbHJLa0FCSGNyVzl2RUNzanVxcmFXZWYxd0k0WllIV0pmUVJpWHE5VWdiZk54b1grRGlaay9CeHNEUm4vUTJ6K3hyUXdwa3YzbXJBUC8zNUxSSWFXUTZpMUk5SlNDclUvUGQ3Q25tMmIvaXhqa2ZTWFl6bnZOME0yY3ptRitmZHViZE5sTXgwVENuemNYOGxxUVFoLzZZVVJ4ZjJrOTY4dTB0L1ZBM3J4MGFXbGIvdVpsZmJpN3Y5eFV0cE5QMnVReTBpdk83dkcwTDF4RldsWW9MUEFWSDRtcFFUTWd1anRnV3RJcFlpNG5lR0ozM3dSZXI0T2lGUDcxVTF0bVdlNy9yMGRuU0p2aitkU0dONERrK3JMa1pVcHIyS2U3ekdhcXNmLzJRPT08L0JEQj4KICAgIDwvQklSPgogICAgPEJJUj4KICAgICAgICA8VmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I-MTwvTWlub3I-CiAgICAgICAgPC9WZXJzaW9uPgogICAgICAgIDxDQkVGRlZlcnNpb24-CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvQ0JFRkZWZXJzaW9uPgogICAgICAgIDxCSVJJbmZvPgogICAgICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk-CiAgICAgICAgPC9CSVJJbmZvPgogICAgICAgIDxCREJJbmZvPgogICAgICAgICAgICA8Rm9ybWF0PgogICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5Nb3NpcDwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPFR5cGU-ODwvVHlwZT4KICAgICAgICAgICAgPC9Gb3JtYXQ-CiAgICAgICAgICAgIDxDcmVhdGlvbkRhdGU-MjAyMC0wMS0wN1QwMjozODo1Mi42NzFaPC9DcmVhdGlvbkRhdGU-CiAgICAgICAgICAgIDxUeXBlPkZhY2U8L1R5cGU-CiAgICAgICAgICAgIDxTdWJ0eXBlPjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw-CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk-CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24-SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU-CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT4wPC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrRkRBREF6TUFBQUFRWVBBQUVBQUFBQUFRWCtCK1lNSEEwcERRSWlCUUFBQUFBQlVBQUJBQUVBQVA4QUFBQUFBQUFBQUFBQUFBQUFBQUVDQVBBQlFBQUFBUUFCQUFFRnhnQUFBQXhxVUNBZ0RRcUhDZ0FBQUJSbWRIbHdhbkF5SUFBQUFBQnFjRElnQUFBQVIycHdNbWdBQUFBV2FXaGtjZ0FBQVVBQUFBRHdBQU1IQndBQUFBQUFEMk52YkhJQkFBQUFBQUFRQUFBQUduSmxjeUFBQUFBU2NtVnpZd1BvQVA0RDZBRCtCQVFBQUFBQWFuQXlZLzlQLzFFQUx3QUFBQUFBOEFBQUFVQUFBQUFBQUFBQUFBQUFBUEFBQUFGQUFBQUFBQUFBQUFBQUF3Y0JBUWNCQVFjQkFmOWNBQTFBUUVoSVVFaElVRWhJVVA5U0FBd0FBQUFCQVFNRUJBQUIvMlFBRGdBQlRGUmZTbEF5WHpJeU52K1FBQW9BQUFBQkJQVUFBZitUMzRkKzRKdDBQTTlPY2pGMVR1K3pILzAzK01EWkxHN2ptaUQxRDZlL05YRmltZ1hnWXVsK2VZMS9rWTRHdmxzb0dBYkZ4NHBGU2x5U1JwTUU0b3RJUlk2cURiTFlSMjZIaEZjS0hPWVJ5YXE2VUtuQTBaYjZxNUgrWlFjdzlnMytMVU9JdS9mbGFzMkhoSXNYMWpCWUN4Q2kxWk5jUjBHcXhhd2FJY2VWSm9VOXA3akJaQ0hscEl1eHJrMnJiZjhqK1p0RWVndUlwVGxxU25ZYmhPS1Rhb1kwVUo5cDdTZU5pYXNOZElkSldQZCtIRG1Sem95ajR1V1R6T1ozTjFtV0VCWXdLbDhLdWRiVEJLcHJPdFd0cGE1VHR1L29vQ3p6SnNVV2t5VnFlM2xrRGhtRkcyR0VIZm1henRyV0d5TDJoRzJsOXE3YmdQYnNTUFpFc21wMlRzWDNkSHppSEZuZ2hIVy9hRmo5c2NkMXVYTXpLS3ltUkFQV0VNLysrNGhpVENuSmx0SFM5cVlPZHIvUmJURnJnZmcvWVJEVE9EdWZuVTFuRnRCVmo0SjFnaGdXQkR5VlFHMjBpOG5SQXRoZ3Q3bEx4bXhvc2MzRXM1OU1ZNmZXTHVRcXhMUkZSbmZzK1RYeC9HM056ZHlaZm9iUFBMNWNIV1hmZVFMc0RVQkhLbVdvc1BkYkMrVUNEUVJ0QWFGTEdYaHRoMkNjTkgvbDhHREo2QXhoUUlHOEZRMlIxZUlVL2pWcS96c1JyMDM4djZBNzVpR1VYSVJXYmt2Z3llWmVsMG9MNlBBZlFMY2k1OXc5T01ZVzhJWDAwRnExcHNXSEtoZWx6dUR5K1dFaVdIQXVMUE5XMlZ4R2EvOXlUYTNLL3JsNE9JalRkNjBqcFlrL2dCRFhWcVAycW01MS8yWHJKTklqY1VqallkcXJlL3hESTlodTBEVWtoWnhpdzlwOWw3NkFBZyt2UWV5OGkvQTJ5bkJwSDRXN0JyL3dZWWM0OHdiOEdtS0lCSnpDRnNFUjlFbk1yM3Rwc0VncjMrSzZjSFhFODRUMTN2bnhRSXgyQTBrQ29kMjFPRTZJZ1ljMUpCM2hiazBldnZhMVNUM1QrNGtyTjlhS0xRU1pSYkNVQWVobHpZRndoSnRlTWY3K1dqa2s4OHdZZmdyakFIa1I2NXdsNDVzZHFxeGdoQmcxR3hYa1phOXZPbTRoU1hQWWxxQ1pDTElLcGtsRE5zcitrb2x4b0JDN09kdEpPU2k5Yi9ISUF2Q09ZbnV6dTgyM2RKME5PU0NqYzFuR0tvRkVoWFJqbzAreWZCKzBuVnRwU2dHUVFLb3k5QWI0U0NqcW42SWE0ZzNMMFNKaFBQYTdpdTIrRU15ejBOMlFRdVlTVDk1Y2s5UWFIZ1EwYkcxcGRML05EcjZPaWhuZkdGUmdSZk9XdTZnaktsRVRVbHp6MUpzNGlydXFXVHUrVTFDZXVpUENPdWMzMnBKVk5iN1R2RXVMSFZOd0x5MHQ2MDErdnNpZU02d3dQejNhZkwwQzVPSU5Gb0FObGlsMHk4cEpnUXh1RzZHK1pDS3VkZmJBWVZESFp1OXliVGZrUnI2S29ZVTJLOWR4SjNjMlRseitoZWpKUEljajdXSm9yR3dwOFdoRWNReElOOHExeUN0RThUUTI0dllRZ0FaZVA4MXc4RC9hSWFOck9NRmFTVWJCRkNHTmE4K09qVWhuOFRkZHBvaWlGSHpPaXhQTURGSFZrU1h3cDBKTm0zSmM2cy84RnEyVmV0VGI2N3J6bGNOV3R1ZFNzZVdnOTZmSDFkYkFFbUdiUXU1a2pFNVpERGtjWFZ1Wno5T0hhZTJ1U1BTU1NGMGFvTGpoUnY1S255ODBmK2h0YU1XcEZ3TnBjUWhDZWRCc05HRXg2d3VQeXNiK2luQ1RidEdnMGllWXBibWJsb0hLNDR3SS9FeDVwYUoreEhrWWRkYzdCdmtGU0c3MnVxZjZZUEE0Rk8rU25nRDRkcUV6OFdlUVBVVXV5cVp4SEVtME83dllyWTEvSzcxR3dISi9ybkM1VTduK3FLNy9TdHZldjZGamxCYUhHZWJEVlZJRFJTL0k2YlYzTTYyZWtVWExTbWc0OW85M1Z2VTk4REkzcktMcDZOeDhXTFlSRWNBUEx3dUM1K2p0TW9CMnNMdm1QcDVZNXJnME44VmxPOHJCSlhWOXg4dFl5NVlpVzVpaDJXQVZMaG9ISkpiTUs0UDZhODJndVJqQnNXbWFVN1RweVdzd1RWN3Jxd1hZaUN3QnloWEltKzZ6alMrSjc5aUhPblo4NkhtMFAyRVFJNlVlekpTZFpkS2FoYldZMDJ3S0ZNd3VCa3hWeEsxOFNaTHFnM04yaFIwWENZdmo2Y04vaEJVR1NrYlJrZVpFeFp4T2l4R29YaW94aGUwSEplRzcydmdqYW9XMEIxRkVKekJ3RlRVYnUzVmlzSVYwdUk0TDEvQms5Wkl0NlRUYkdQNnZ4YmtnblQ0aml5T2VnTWlKbU1MZXZBU1RvR3VWZHNxNzcwdVZZTHMzTFErbXB0WSsva3MzZVdLblZialo1ZjBzTWRDZGtuZFhBT2dCSDJHL1NaVTRrMnFGK2VobG13MjdLdnVadU8zR2l4RnJLUFpTOFZtS2NJdk5JdlFGTFp4dU5VM0RKSUNxcG1hTzQwQ2x5YWZGVTc2aGhreTl6NDdaL0R0L24yUGx5Qnk5K2dJMVk4YTV6VjBHZm8xdmJleXV5SldDWUZIdEUyY0NReCtCY1E3NEk1SklyUmV1NjNZYWdkMzBTUHpxU2lhK0JhZ2EwZlN5c1JLdG5zaWthTnN5d3BpTCtySEpFSmFRcGlIWGl2Q3RSb2dYTzdPemJvdkNxL0E4V0MxR0w2c2d3WXYyQnNOaFROWmtRZURGQXRJbGl6MVIxckQ0ZlhWbkx2TUJob1pYNEFWaHhhRkpmY0tQZThmTmVjZnRvSUFFeTdhYXJVc1FLa1JyTmpxV2ZUQ2RybWprOHhWZERQWEdMOEQ4SkxRaWF6T0hnSkJMWG50K3dtV1BscXNXQlZmTXYwb041eko5ei9VU3pOdUp2bHFzM1VXbTRyL2ZoMWFnRk9pMzdzS0lmQWVpL3YxSkZ1bmMvcXdPTlFCVG44UmZrWHZDdWhUZHVBMmZObW56MXArM2lXalNKZGswRlRXbXlwQThsOWdMQ2tjVUY2RjkxZXFyelRDWnZvV043Y3Z5ME82c3hFWEdKeXY4ZGxVS0d5YnByRGpFMThhRUNNUU1VV2JUMlZEUXZrWnNvekdiS0FIZEdIUmZkN0xWd1hqdk9qWEx2ZGdNZXgvblRPQlRUajI3QzlXREx6YjQ0cEw1QjEySnAwdVlEa3FlWXBHZ3RTTDJLaTdKWkRUTkxzelBmUHpLQWk0eWRxQUN1c01weWhCTEJod2hDYWJnc3V1VTdvY2dhYk5tTFZKOTBHamJaMWFIam5lejlCQ0g0cVJUVFJycitWRzlnNmpETDFqTzQxa1dPTVlXSlFHRWNlODdRZjFoT3BTdVh1ZWE2WUhPcUxEdC8zc1JNZXBjSFA5SUQ1SVJCQkJnbitRaFVQUUtXNHVXUHZvR3lZc1lvcUZQUnRLNDJiVDR1NExRY1pWMXdWTlVhMVhIREdnSG5pS3ZVL25jb3Q2V3RQS1BQYXpvdTA5N0hscWRYMDhySE1oSlBvK0NVbjZVd2dqOG85d1NrYW5pMENwWVlhckJqMGthZjN4QklEbml6eURNZ1dwK21laytDYzNNZzk0ZkVIL1cyOE9WS3FYN0J1TWRoUVBoQnBENUJNV0wxMmlnQUUyL3RsTjVoMDNJMVdIN3RxRzVyN0NoZEg5OTdxZnFGOHFzVjUzN0xEVGwzSWlTbmU2WmEwcDVLbXBGOU51anowVHRkZCtOejkreXJLY3NFdDVmQnM0TjNWaG1HQjd4K2JSOUFxWWNBYnJhUWsvNGpNa3lsM1UwUUxyZ1dOdHpnRTRKa2V5SGRpNmoybWE5bWNnSGlSODVGb2JZTDhLOCs5OEdrSmt5MnVncTJEYy9zWkxaWktYRjZXRDVobFlMUm9FaDlGSGJiRVM5S2hwTnR6VmcrNnROTTdUSlNnVDNVcS8vVWw5Sm9KNWpUV0ZkSktsM0J2ZmVBbEdobSswU0ZCckY0VHFrY3pRWm5saFJJTFdpa0grZGlqaXY1SDJYMTZRejIvc2Y5MEY2VTRpV1hycVpMZStwbENXWU03Qno5UUQyM2duZlA2V2d1cU45ZjA5VTlkZHhYMU8xRnhQOVJUYmtMbmZLYTcxbnp5RW94K1pwT0JTNHJ0Q1lZb2QvejhPdEtmaDJHUitIWDREUW52QnplRGdyelMwc05EUWJ6eWRKY0t4N0xqT3lubjN5c2plbTlFaGx4UWRrT1JvMm9kNk9hSWNnYmZLQzFhRFBad0U1Mm92Qi9iN2xvbjRtQi90dEJSelFHVG9qV3FrbzRNTHNnMDRKVkIvUWxRWW9nVkw3cWlXaE8yMW9pSi9rTFBWYXh2aE1ZY2FDYXB2RHFCQ25WTURUSUN6RzUrZDJTeVJVUG93UEE3eWxza0ZhTzlhNWRyTzFSdFp0WDRYb0xDRndkK1J5UHd1LzFwVnptdHk1Z0RWSUsxYlZnQURQWmlhbHl6cktYdkpuaHZXa0VNOWdWR0g4ZGlTWXJ1akc0OTNwTzBCa2J6VjJxNnZEa1JJblVVVnFjTUxlbTcrTWc1N2ZCWkgwc1U5aStoKzgxRWoyVGpEQnVocmNrdXZkSTF6WUdzbm4wbG90YldOeVJObXNPSi9nSHQxMEhsejZON0x4N2lRNkZTOXN3ZGhLbzgxRWpacTduZCsrSit0Ym1EZHpUZUczR3czeW9zbkZwSitXRlF3a09oQUhzNVdKYkhaZTdlSHNmRHdsV2dZallUYVM5eDRndCs1RGZwSmdySGM4M212ak10US92NHhIODVnZTRTbG9DVGtJSXZYVUdvSk1PN3dmaFFOVkxZU0xkTXU0NEViU1BXaWJXZEdFNS82MkQ4RkNRU3VqekFxU2p4aVMrT0lIVnhXSThJWXhWUGVCbkVrTWpYSldmZjdFSDdSM0IvMTEyZDdFbDIyc0NtM1RZV0pBYVZvMXVwZzd5T2lCdHJuTUd1L0k2VmdJaVUyR283L2VheEo0Z3lmNGlCVTkvcldqRFRGTEVVR2pseWh5VDhPVTEyN3hacVRTNjIxVGpPU1NhV3hRWGZPZ05FZWl3Mm1MbXNGZE0waGs5SzRpM25QdnE5V0lnb0FGMFFUaFZub3dTbVFkYUFkV0NYNDh2MGNocmZTNExtL0JabmRzYS95aXpBU3FSeGVzdWpxclBTQzNuU21YVk1DNUFKQWJ1MktjS1A1MWZUN0JzbnJnM04vcFFzNGpxUTZ6ZFRnazJNcFU5djgwQXdHTWRSRk9wQW43elJyYVMvSmdpWW41QlFJR1kxaGczK1hjQm9pZVpRUjIxdGxaaDR5aEpwcmJEcURCQWRVMzZRSm9CeVRHMWtQYlJDSlZHUmVuSWFabzFjQ1RPb0FUY3lGV05QTDh0Zkx1WDJhanc5UndtL2MwVk92b3pybWk3UEdOZVBISFlXdlF4T2VvbEZLbmw1NnNkTC9iT2hnNjRXOE1VMEdwTEhaYmltT082SWpVOFdwQTJ0TEFxU005ZDVhTm9kQ2tLZW1RMVpaT1ZNVDZTcW5CNUozOFM0UUlWNlcxM2ovNTEwYytKRmZjVkMyUFhTSmYvcDRzNEMxbzVqbm1FemwyU3BFUldWN3Y5MHRGS1JxNG5Ub1Y1RzhBWDZoU0NvOTVDby9rV1lmWG5qYWtIM2I0aXRlbC9xWVFhVWF3OVg3dWJFZHBOWHM1QkhrYjBROG1WVFhCZ0p2cU5XUDdIS01TQmp5WUZEWi80cXBOSlNxa25vVndOWnNSbC9DN3IzdG9wZ05jQmJRZ1BIK0xGQzJ4V0R0WGZDVHg3TnJKR2UwTmJiKzN2b2d0Unp5dnZ3KzBqakU1SlFQeXNHcTBvUkM2dW93L0VQdlZLK0pHQkRtd3pCQ1J5TC9WWmsxM3dWY2k3UDdBNFE1ZlpLL3VsRm1COFk3T0xJZ3UxcWg0V0VFaHhoempUUFpXa2xKSXRpWjhBeVI2R2Ntek5PbWNSNjBDcmI2eTJCUFdMbFBwMXdha0t6NU5NeDkwRkhyd0h2Rk84bWs1NW03dzFZMURqQ2kxNmpKRy9xbDZnZUszenZCdGtWMko5VUE0YlIwVG5RRXk4ZjE3Sjk3Tmtxa3NDaFlIWGVKV1BWb2I1WHR3ajZVRE4vcXBHdXFzdWNMMTJiVnBlTnBEeEVqakpQaFNzK1ZESXY4SHd5aFBpQ0c0QXpvZHoxSkd0MHIwL3pZWUhWN2hoWE5nSXkvNU9tQy9kVEZLYTFhaWdWanBRTXl2VVl2MnJZekYvUXBBYWY5NFdwelMzNjV1MWRYekoraXYycEF5UThMb3VZOFJsU1B2UEJSWkJKaXdpTDFWbWpyNmMydXM2a1Z4MmxIU3NOV3pDMkx4WDFNdGhkUmcxeXQwWExldlRsTlpFb0dOQ0I1QXFoSk5BMEtPNHFjUUFYU2ROemd2QkhocGJ2ZUhOSENwU1dSdU1iNzhyL2FwaC9Qa3lmVHEveVplSjcya0RlbFJ0QitpRCs1b1lzRnFLMXg2N0dORktZY0FmYzlDOEF4aEkrUDRIaE80WVNXMm9jSEMzUE54dWorT1Q4ZDZXcVN0OW1RVUZvUVBHejFwOHkyWFFZWVJUL0dUTnJjNGdwdkRTakxzWHc1T3hZVytkWXgxc2ROWEFLZEhpSTZKUmRaa1lUNFlPdFVFWGF3RnNxTTBNVmY0eWlwWUNweE12VjVJUVc5TG5uWDFUVUIxYTFUYXEzYjBxNjR0Y0lHRzhNRys2RExuWlk3OXAwQlVqdVRMNXpLWGNYL2JTVkFvTjBaa1JRMGxxaHJMS2ZpNUNyaUZEc0xSWm5NY2taOUpOdUxidGI5MGE1YnBZWW1rZ0FSanR6TkdKcjJHNHl6L1BobXdoVklZQjl0ZytwZHF2ZFVzMS9QaXFMZ1pWQ3d4NXFmMTB0L1FPamUwNUtBc0lhbEF6RFZ3VmViV1pkcmxvVjZOMnV1MTJJTVR3c0NiNnVNelk0MW4rWEEyaG5yUHhKb2Q0bk5lcmJIdWVPQTN0d3AraWxYeUthWUhpQXNONEhNWVl2RVZ5dE1kc1NBTmtqeUFlWFhaNGRqS3kreCs1cUE2UVhRa1hDZ0Myd0UydEtkaFplYzZjbUhHLzBRWGtPS3dZeE1xYTZiVy9BbGRLWjhncmVheCt1TGNYYTEwTjZjT2R2V3lYQjYrcjl6L1NOU1JNaUhCQmFGdTVQVDloV0ZVSnpaWHcwSlN5REEwcGM0MytSSXJjT0pqVVNsaG8wZ3Zjdk03MDNmYk9KUHhuOU1EZXJSRm9pOTdsUVVhYkRBS284ckVYMXVNQ3pNZVkyaVo3d0R6bmdIeHRlRk1yTWZhbWMrNTBicWRJTDlXelMvMzhnYWhvY1g5Z1BidkJaZVJnSGxGc3FLOE56MVgzaWdYV1hGSXEzdTJMMmxnbGZNT3BPOFhITW5xTjBpM2RSYm9CeHcxOGhRSVZIeHY3dFZidGVxK2lYOGNBSk1IM05lN2hoLzVCMXRhUTgrS2wrSGlBQ2JMYnFOSWV3ODdUWE91S1lnMXEwTFVBdmZqa1ZLZ1BkYmVzUk8zd1oyeC9BQ2lUSTFVNUUwZFNhSVZJQ1ova2VlYzlBYjJ1cUxYYzZqNFhSY2h6MmRVTnBUdTA5bG1XNkxqWTZybndjZTRrQnd3eVRlVGUrdjI1TlR3Q0xETkIxMmF6RkI4dlVHOHo5ZmhtN0JsdFFIRTg3QjRrMlZsTXFoWU9xZjFLelNvWXVwamxrTkdySHNCc1R1bjFMZmRJWkxtNE42VDZkL3NSRkxKeEVRYVlkSzQ2eDZlUWJ4V0theFJXbzJ1elZJdkpONzBPZUlpaVF4NTE4WjdBVi9ZNjlyMUh1OGxDZnpLZmxLYWp5TjVrV3dNNkV5UzZSYXlNb0JtT0IzazVwSXRyOWU3VTZJbWY3YS9sejBteVppUjZHTnRxaEdNMWMvekROaGpBUk1LbGEwVGFrZG1xVUVxYVRXcG5TTHJpZUxORWZXQkNEWW5sTjVnNkRRVG92OUE0NGJweG9ucE1UeVduNXZpNSthRVJLNkg3SUJxK1R1R2hZdVM4ZUJEdWtueEw2dElxc2I5ZjlFOE5pak1MZ29MbTA2Sk5oUlFSL0JEZ2NPa3ljWEo1QTRoV2ZyY2xpTm81dk1tb2M2RmJuVVhSb0VjeXlFcGxxamg1ajUvd2ZQNlNJUG45UlVENS9VbzRRdlhqay9LTCtSeEVabEZMTmJLYklFbERLYTZlTVNsQjlXYTJmVW1WTkFZN3hxYnZKdU5HZEhVOHA5RzV0ZE5wem5xb1BzbWV3ZFpWUTZDczNMV2lUQ3h2KzYvTitSN2Z2clhIM3RxSkpuQVU2VEhZTE4zd1BxRGRmZktLTlZmQ04rNjJDOVk3WjN4bi9adWpDU0x3bW9lRnBvci96czBqTkhHQTdFZTRkeHRwWU1IYm40bUREMkszUGdZa29icHYvM1ZPM1NOWXhWanYrZ3QvUElqVzdWOTdXcEV4ZjZwUnFYMjAyUm5RNStpTFR4ejgxTjg4MUMyYUdvN2poQ291NEJoeWI0b1FsNW13T1BoWnliOXpjcGNOdTFtL05OWFN6NDN0bGVTL2RXcG1ROHNTd1pGb1A3V1ZlYWZOa2pjSkpvMlRCV0dnenpSTXk4VEcwYyt2RUptTko3aksrYW1KZWRYZStPK00vd0ExU29rWHdTS0xjUzM4VnhHWFNvaTUyZ2RkaG9vUGJ3TEI2QlBCd2ZWWExUNEorYVZhdVptSk5KQ0prRmJ0MjAxQlpGRktRUkRXUHhxdmFKcEwrL3RQRjRZNDJLREtyZWVMeWNyOFNBaWlvQVdQWnk4VkZDaDJ0c1BXaldHOW9WSUcyZytuVy9VRkdjcmhwa3dEV3dvUC96RGpEYThKbzA2ckk1VU1MQzB2SnNOOStNOVl2TE5vaU5sblIrVDVwK2hiL0N5OTVHTm1jZHBqaE1FU0ZhOUZlclFPMFcweWwwZTBpdGZvRzhGUk54ZFpwM0ZXcllqRFludWduOFlzVTJRUStoV1o1TDRXRHFtVHN3M1FaM3BlNzRUSERBVFdDMnJSaW5SUmcyN1dIcjErelNrK056N2JLRjZtMXVzeUg3bml2dmZqQW1wS0MraDJ2aHNmNkJOY1E0OG9BVGhNVDA5aTRkT2UwY21wQkhZakJYbnM4UHpWaS84d0ZoYjJDc3FTZm5hd2ZBR01GcnM4VGtLc3VyeDNrbzdqRnhicG44ZEkyZDl2RjM2dkdzVGZGZkQzYUlUcjdVTXhITjBvVWJObmV0WFpZUGNTRG1IZ0JkY2gzMzJTdFl6b3ZuZFdTRVdxNHNhUFM0c1liUk9TTjJ5M3BjeXNFUjBtalAwd0JLREtwTUpSV1BlSnFZOVp0V05CanBLc1F6Y2hoSXMvbDlmM1pJNUJnUHBjWko1eTVwK2dmNk5LelFrd09Ib0x5UDh1Q05WVk5aOWs5UjYzOEJSc3lxOGVuTTRRbUdSbjA2ZXQrS1hvRHF6SGlmSmpHeGErMWZJb1k5SlhRTklCcnJRdTk5M1lXV2dhTzBsMjRRWjI1bVdSblRRSVp0dnhOK3c2L0RZd3IxK2Q3QU9SR1FlOXFYYVUyYnN1MVJhU2d1Yk9mMmdLQ1Q3QnMzbnErZGJKdXU1dU1aVExVVDhBaVVEc3pEQUFQcVhyWjdGRTZUbjRicmVqZk1pZlVzM2NoVTdFRDZmVjlLcmU0dmZMbUNVcVFoRE05Z3Fwem9xcFp1VlV4aW5xeGd3RzY2b01UTXVGT2tBeW5rSUdoQS83ekthVDl2VGFCUzhxTFRHb2ZHVFdsajdxNEs5VnphdGF2Y1NMbFZ5YXdTbEgvS2g5dEdTTXFCWW5kK001Mm9uR3BNbitwVGk4MVZQSjh4ZkRzdWlwOFUyRkRaUWFQR0RGTUFqdm1tM0RQY2RXcEQzMllpYzZqOXMzcStmZmxPUkJNS3lzc1o0cXlmbVZkbWNZSytQcVhCMEFNZFpUK3U1NktrVG5UNjJxUmNBL0tSYUkxUjkxMnNjYmQ3UzdqcElJdEl5WFk1OGcwQW14MVpjcnd3ZTlmeitJSlVwajF4ZldGMWNodjNQb2JtQ3pvTm5tZFFZTFVxM2RVU3k2dEEzcnZ3NnlPVTVKM3p2WUNYMFpWOG1XS0U5YmVwY0NEQ0V3OUN4RDArc05uQklDL1pBb0FZb1hDeWNlK21HQ2hmR1YyeUFPQ2NORkRLNzlPOTRKamprc3dMNFVsOUlhQ1RBMVJ0cURVUzNTUnFXQ2VoblgwNjZVb2RUWVpqNFZTZkwzYVB3NWxmSXBnVnZraVBROGtEd1EzVk5HQVlYTjZnRysydFY5dlRSNGNDMzlsVmp4WEo4MytlTS9SRkI4eWFRZ25NRHg5YWNtQzJIQmtnbWFoNENKU0NqbHI0UDlub2FKRjd1TDlkUXZBalBzWllLOHJwdmFqQUNWSGNRZm9LcFE2YUROMDduNUJsQVIzRjAwaU9TRm5naXlHRnJxWkFQTk56dmNOK0JlbTU3NEp0bFNEVzNWOEJtVytnUGVHSDA0WkxIK3F6ZWtzeS9UT1IzRktReEVPUk5lZllaOGwyTk8vWGY1YzdaT3drOE1aZGhmMnBnd1hndTc5SitoWmpaUU5JczZrVlBDSHo5Ym9WL1lDVGMvS0FnUUM5Rm05VGtVZUJyUWpRV3h4RmxRbThPbDgzaVhxOVA4RlQ1QUgxMnhJdER2WlU2Q0FEc0NrSjc4UXhBdlBnUUk1RzM3bzRUYlZqOUhZMStTS25xVnNXSEUzQkVRdUxKd3VrTU42YjFheFdsb0RxQnRBRk8vTGIrTW13Wkoyb05kbzFndVFvb3pxNUV1QmJ3RWRrbjMzN2p3WXhDcDlhcmpGdksxekh6U1BtcGxFRkpQckk4b2JxVFhyRnlrd2wyUmNhUlU2RVZtQkZUdit0cGFSWkJCSllXYWxFQVVXU3hnNndueUxUdEVLSTFnSTd6WUhOaStXc0pRTnJ3SlNTemc0MGZFSXpjSmQ0US93amNzaFN5M0pKdEt3OElxQldjR0ZBZXRpUFBQK0hhcCtEbnhWNjdnNFkvSTU4ZDdPNDdmWHlGTTV2bWZDLzRsRVluODY3cUczMzkvbjhGWDgzamVIRmRidDNVUFIxeTJzUVdFV29DcXh2UFE1b2RlZnJOaTVHNUF2TEkvZnpqb090aG9vM21uK0Q4K2NCKzhFdXdQbVpNRDBmNlJBMFI4UE53R1JXVTZlYXp1VVRNS0I0Tm95SHVha3hjWS9mamVFc2w2OVUrOWFGbmU4eVBuWnk5QTVrN3NWcmMyQTRyVS9ET2F6ZXVhRE9yL1R3eVhISlFPMlZSMVVpMnZyb1V4WFZMRHcvZmxSN2FWWE5oT1pQN25IclNWY3lSZ1oySzVaRzBuMnRYeHIxKy9raWI1M1ZkUGtBVzlRMjdmV1BpYm1RNnBWMkhnbnA2TzM1K0VxOVpmT0tndVV4MmYwSVVKYXN2b3JZTlBwS0trcU1qTFUrL3Jpb3Vsc1FoRWNyM0V5ZDk3TkNJL1MxSElBSGM1OEh6K2lHSDFkTGtENS9Tc002Y0tGOEE5NURaeTVQZVp5ay9OWHNhNGlFcHlpa3NFLzY1TEU0aTkzNHBTWGwxMjBSelJxZG5Jc0J3L2FhUDBHMlVZVm1BR0loV1pkUzFmMWdEeWdjdFJzSnhsSGNYVjM3UmoyN3kwRWduSTF2ZzZMTFl2QkMyK0ovQ0JEcGszVDJlaTRBd2lyK0p6U3Q5UmhSQ1RxNzV6TkEwRmdVOXQzN0RyTXg2V1dSZnE3VHVmNE94QTluL1BRWXNWNEQvQWhmNWwwQ1MrMmV6ZHJOdUZsRFFLNmpIUlQwaWQvT3ZKT2RUVHcwQ1p1Z1J2aktqQXBtRFhVV0lGOGhtdk9XMCtXd01DMHpzcm56bmdjVDd4TXF3OVkwUVlWa3pSVW0xKzJGVkNoWm9iNGRsS09SVDVMejFVOXlUcCtkaGU2THIvT1M2MVE1NVUzWDlETnZFSWVoL3I2a2MwVytGRHQyc29mREVTSlRjZUs4OVdhcEI1cWM1Ui9wZkRVQjhFYXQ4T1lRT01aQkFaV0RHb3hVTDB4cnc4VzU3d3E4RldzelRKanVPNEplSmF6ZWFOS2tZWGVhN2xCMVp1RlArbkF6bU9TSk8vcGVsdzkzZVFQak9mS1RjOTdNU3h0dk03VDRYcWFMbkJPSVZrZ0VtYVV2TmUyRzU1YVZKZWJScWZXWXhSamJJRjQxNUtaOG4rSmZ4RWxPdlN1ZHJ5aVZxTXlXM01HdzJVMEFjcVY4VCtxQS9zdVZWbHJvZmxvT3ZhaW5CZXp5akJ0SFZrNXJMaUhWVWdremNFY2JDOXVETmxvODJmaEZxN082clRESkxVYTN4T2Zhc0NLbWFLSXVHeThNd0l3ZDkybkxWaG9pcE9xU2crQlViVFZXMzRXVXVuUWFwWTNLa1JINmQ1R0R3MU9sSDR6S2w1T0MrWHljQTN2ZU95MVFzK2U2Sm5MS1ZXUUFRYUNBVldRWi9GSjRtbC85aENrUEZXdmZiN2ZUZkFhQXY0TDFnZGhwVWZvT2ZkMkdUdktvWGxVUGZxZWxjVit2bjJlWkF3TFZ0S0hUc2w3UHd4N2p3RDR0T3d1ZUNSS1VwV3RLcXpoVEVjZVRJMm5CaExvRDhtRHkxUFo1UlhqSC9PRnRkM0QrUENveHY0LzRTbDAvTU9EdlFNZm0renlEOVAvZlNnK3NUcVZEZ2JuR1pRMUlMcDh2aE9ta2J0U1FrcE5qOVlQM1VrQlVraG1GUU1KQjNOVlNTeFAzaVRRYlhKZFhjMkxkY1lwNTdCY2RJMHZXalFpbXRyVTFQUFNvSFEvQ1E3Sm1TT2VCaUNVUWEzaTFCbUNlblBUNHFBL2ZIOVhFditHeGhtL09uM09SOVozanB6VTVPZUFXWjVpV01sNTdCMkc4cTIxamJyRnNTM0pGN3BUL0tOWEtORTNIWXA1NFRleEx4VXRHQ3NSS3E2OEpxbVlJVUsrZUl1RTh5a0w0SjJrTFU2dVM3QlRXbFRLTUhTeWpnS0hHTUxZODJyeFJMQzloa2cyMHMwc1ZZYmQzaElYcjdvOFBUMC9GYjE5T0puUkxQZ2Y5MFBFQmlkSXVQS2EyaHhFTzBzNXlkUHpkOGE5UHhpaTQwU0lYbXN5cmJMTDJLQmNzTmpSL1dlYUJHUGJKR0xIazM2ajJtMVRRNVQxY2RJc00zajJHbnRMa1NhMDJUVUFKeEQ5bUVMZUNJSUNHY24wSEM1S3QvWmNES0NxSUFUb2hhQWdmUlc2Q3FuZEJ1QWVaZnlTckZGNzAyMGs1Y2Mvd3liK2N3aFN6SExoUTJJa3BYVGQ2Y2kraGhxQVVxR0xTVms2RldTdGlxV1dMUzEraXdLNzFjSmozbFd0blBxNmYvSW5nbEczdWE2bXV5SjRFbDhPYmduM3NJZWRGREg2SjZZM0U5eXh0UFFMblB5enh6NktMbWFGZnlOdjlaYmtaeHQybnVuVm9XTWRPL1I2Y3AzZFJ5d2NRYkVndHQxTTY3M2s5andZWDYwZVJUVDF6Q2ExemUxUEt3UUZBUnM3U2JNeHltN3psMXgxTzkrYjdPdGRoTS8yVDdpYy96R1FWek13NDVHOFNpOG1JR2lBS05DYjkvdHVPM1l4bitCRG83TndpSkdaQ3VIVmhGZzV2Vis5b0hDUGJEcHIzM2YySEg0dlVnbUlRbFpTbDJGcHVpL0pYVE9uaE8vTkFUSG9tV1NrQlg0QkxxWDk4ZzZvUW1wWkdsSldrOHlqV1ltUlJ0ZmpJdnhuNUlMNG1zQ1ZkelB3b05SM2ROVDR2dUtobFJ6OXVmYVVzWXJaRVUzcW9RWjBIUWEyMHZIdDBPaHBKdml0ckJyMW4vUy85VTkyV3hzWWRVWUIvaVR5ckhvWTA1NjhHWmVtanBWN0daczd1RnpJQlo0L0N4dnZEeVQwSFZXc3ZoZnlKaEtoZ05PZUN0NlUwbnptVWNyUHpUVWFKQ2F2b1Z6UmRucXFja1A5TnZSM0tQbmVaZ1AyY1hxdEZmZVdsODN1eE1WOHdoRXQweXlLS3Q4aGYyZ2tTc1ljY2gvZmtoUFgvTmpqVC9SMXpsSFJUd2ZSVWtFL1VvL0FFS09FQ0oxcjMyZUtnRERKekk4MHNnaWwyY29xNXlrQkJ1aWJQTlkyL3pwM2xNOVgzd2o3NThkMnJncENFYWh2UTV5TmxObGZKUGJ5MUN4eVpCNEtvNldnOTdQNFhRMzFMdFJDSmVseENRZnR0N3c2VzBBYlBwUGhaT0VoNGRJRnhlWnJ0L0VZTnN2MUxDWEtkcVo1Mi94L1NyUitPR0xDOWdEN2VvWmthcWQ0Wkd0VCtiWldneXg5Y0VoZW9sQXpvelhLUk1pYWdzaUxob05ONHNjVG1wRFpNSFlubWxhYktaNkVRMlVNSXdPcSt2K0p5YjQ4RjRyWmZlZUplZS9ZRGw3TGZPbjUweG14bUszSUFVbXhaSEhrc0dHejNzUmNXQ3A2NXVzYi9HdlJwSlE0WmdMR25wUmU5dWw2WHZRY3ZyNHRUelM3bE5UbUlHOTF2eEhPTkt4RFlhNGkxbHozaHg2aW93OVR4dTJLVUVwU3A3Tk5MOTh2aTVOM2UrMm4vbDl2dFdmdzZFc3Z0OTFEK0hSdGorSHRCZnc2RXc1V1dsb0tGZ3VLN09UR2k5cENtMTZ2RzZRMnQ1QUNlcVl0SHNuODBKMFljaG9RZ2VLK1dsS0g1Q2oyRUlnOE51dmpmZHhPUXE1WUZweFBmTlVoYzEzTk1PY25aa2hKTHlqWFovZG5acXM5UklteHFGcXh1VUFPYnJQUkpXQVphRUFUcjZmOFdCZUl6aHgyVG82THFRbnBZZGFTNkxVLzhVUVBHKzJQbFV3allGODBVM29wQmJTbms1YnBpVUtSV1laNWF5QmFiRE9zTDV0MU5za0xvTDg2Qzc0c3l3UUN4dXA0RjlEWkhMTmV3RnN2YWtXeHVLSGJCYkVUZDFjZ2dMRXdHcjV2YWF2VVpXWE5wRWNPUmM3cHVQb0JhTHlGb2FKK1dtQkREemtoNWt3bTRaNWZPcWlRYnRMMjdsc0FNNjNDbXpqZjhSUk4zaERnR2tMNGQxT0RmcGZsWG9BaHVWK1lZUTdWUy9CTDNEcVpsVEdUZ0dEVFNwMXVpK1I2Rk9pd1lzMW9Rb3pENzBmTVVwbmNxRmtLSDVrL0xoS2o0UDQ2M3Y2aHE3SWdxSVhHYXZsb3hLcGl1MHBUUVMvUTVtREllbVlNY1lQZGdIaUhuNlJiQVNUWnd6VGczQ2cvS2RydmpDUkJidGN1OG4zY1VERC9McDJwWW9jNjJrOFBwMUV2TmE0MXJseFhaZFdEZHdjeWpuWGh0Q2pITVRwWE1XZ29MeFo1SGxhTjdibkhEandPL2FzRXg1Ty9yWitQT0tzYXhsVHFYWXVlY1B1ZllvVjgzbmxveDhQSlBKUGRVWW9iR0ZrSzZwdmdubU0wV3RjUURJK01aRHFGVlBBUnJSaW5SdHh5dnQ3RllUM3Rhc2FMZWpLQUtOQ2hLalFNcjhWVGo0MUJSTm5uNEtHaElQYWx4b3c1T1UwMnZqU3dsQUhIelZsbEZabzJOWlF1U2JyS3Jzb3JNekpmdVpVWTRRc0JyblM3RFQyenRscHMxS3ExMmdMZm5pZkhMaXZqREZwQjJyZFE4OXgxZHFZd0tYRFhTOTFIVFg3M2lOWFpzQi96dlQyeHd1dTJEYzgxQW9UZ3NIK0QreHhsdjRwUmJUWHRYSmNDUC9UeGl2N3dZdHZxeUM1L3pkVDlrNndsUmhKTnVyL3hTd3NQOEprU29sOXlkTmlKUnA4T2IxU0U1TFFXQXBVMVd6TlA2ZFNOV0ErUytPTWxRbjJPOTZvdU84M3pqeFIrUmgwSkZOQU1ReDg2cis2SWNOZHI5YlJ4eDRHSzFGR1kxMlF0QVM5aVZCSDZ2R3lFaVorc2pIbmpTNXZ2ZlZ3b3NYbjlvSy9mVHh2Ny9UL3pYZHdKcGxhMHRraUJlV25pWXUwQ2FIL3R4dUhlbFMvQVUxNlVxRWZDaklLb21SY1c4UjNxUGVnNGdmanI0YVNUZEh4RDhxdnJmc2pvNmhOWWpkdFpYczlSRHBvQ0FzV1c0Y0M3U0FRYlZwcyt1cHd2dXVHRXZ0MWhxbWg4dFpLeGhQZ0dyZktDQi9oRm9udDJsYlBaRTEwR2s4T09BS0gyNTBNZ2tNbjdPWktNTjdsS3dtMm50Q24xSjZUZGpDOVdmNzVCK3ExbHBoRGMxbnQ2MzBTU2VRZlMzci9VVndVdXZ5S1JDSVVnMzgyYmErZXZNUjlUVDF2MTY0blRCUTVoUENrKy9YWGVURzVQNWVUM2QwSUxOcEw3MEw2S1Z5VDFqOGFGelBZV1JNVHJqN1lkcGhoaG15TTJNL1lFTHJuc1E0ZVJVMDdGRm9PcHc4UVF0T2RaeHp3K0FMdjI3cWgrek1mTEF4WnJkQ1pvemprRU5pL3NDTGpMOURJQnRxWHBWTUNuejgzc0Frb0Y5c21VSUFVanNSRkpSSWk3T3BmM0NBV0pHUmpqaHRpWGt0N3czbFRnTXlFWk8xUU4wTlRJd2d3NTQwQjZPRHQ1eW5kN2tUdHh0NFFDWERLQlY0Q2VvQllhL0ZKOVR6M09BY3FIUkc5M1Jnb0ZKSTlyZVlYcmN1RnoxVDB4VktGZGF1Ynl6L2JFUnpBblY5cE5TYU1mblNKdVFJMFcyVU5RYW44RWpsS2ZNUVFNUU44K3RqOVFrWVFxR0tSVDY2VncvVjRZNzBOTzMyeCtNR1FuRmdOdkl0aFlzdFVIclhNaGp6NmU0ZnVuNEoxYnQvT2ltRmlnTldvNG5DNTUzQ21Ca1FnVUcwVW5lQWRKRGtaL1Y0RzJzZisvWjV0Wmh0SXRmMHZySFBweEZyNjgzUHVEWDNUTXJxbzBQbW1BcVliaDc5dTRKa2YwM0ZHMEtIb090UjlNT2JLaHpSN3d4RTFGaHp4Szg4SHlVM25LVjdyUmdRN2hWcmNreUo0VlJ3MzUzU21iQm9YZmFacUpUcWtCRE5wRlQ2Nmsvcm1CTjdhWU9mYjNmSlpoQVUyQlFuY1NuQVFlQUdqNWhPUk5ZYUxhdS9PTGFVaU56Y0FxUFZteFFtWTNDWm51Q3AzanovRVFMNVVDQ0Y2WXY2VUpNM0p0TEh0bHUwaXptVHNwOS9WcXY3RVd6enhEemk0d2lrQTJEM2kzb2hJRUxkN05IR2JGT2VBdXpjTmQxZElQeWR6bkd1TExJS3hmWXNHb3NZL3lPWE41empPcWNLMUFpRzFJcEVXUDhWL0pGdlBITEtaUmJsYjlncU5HNmtFemFlYTBpQUROYlpvcm1CMzNwUHB1MjRzRjloWXFHejIxRktiNHVFZVNaM3p6YnB6T1BWYlNIeWlQWWdnNGNaNFltdFZ5TG1CNkFiaEZLSUxXaVFhRWJuSW9nR2dUTENxRkJ0bUh1Qk5qTDdoZUxkWlN4QS96UjdhOFF0NlhRV0tpeXFSSjlVRitZakdITytxdW4zN0hsRHlVRlpSclpyT2lOdkdCZ2dqbk56UlBGOTJRbHlJeWxTQmVWM21TYjR1TmpES0lkUVVHMzBaYUdMNW96UjlteUxOTGREZGJCMUJJRFp6TEs4Q1NpTWJQWGo0MnMwMmhBQmY2bGE4TjNaQnFMblRuckJkYldoUjlFNUZmcitXOFZKTWhHSDdDbWhHS0ttSzJjMDJLVG0zeVVqZDFFbnRLNXYzb3Q5bk1DTmFzTTRhSHF4ZFYycmR6Uy9QZmhQL1lSOTVUL1Bvb3psYS9yUTZRYXAyOFgvRGluSFYvSmZTbENpNDl5NXlYUHd3T2JiZGpjdk5sRVAwYzlWNmZoTjczUVZhcU5kZnBod3ZoM0lvSHNWVlZaSmNGNFFyWmxyZGNYRUJ3dDFzVzdsMloyZCtSZXRTNkR6cnN6ekdya2dwMStXZi9jcW5TOGx1aExHeDgxWVd0VW1adkVTdlRRSS9JalVRWjVMaHowUGV4RTVpcXFEdE12MGtGQU93WXBMSkdQWFFVY3hZNGx0L2JZRWltamxPNFg3TGxhSG1ucUhzNDJjZUNPVTVETlNFOWMwTzZLZ1FEREFRZFV6T056L2VPcVkzTmw4M1VlcXZtM0Mva2Y2TzVSNklCVmZxOTRNYXkwUm5MemVIQWcycXhkbGxOdmgrdUhybC9ZK09XWEpmL1pMR0FHaTZ2WnRvVGhoR3VIS1JOMDhuQ1JZTE8rblJMTHN2a3pmalBMWjlOdXAxUjQyUVhVNmxlTkJ0YnNHcFh1YlgveUc3VVNvbk1DY2hISmtFRUpGZ0YzcEJscitDdHM5WVdCVGtmZlBpRWJ5bHNhRkVxNVdlSXVzVForc0VnNVIrN09ocTBQcTdpZnIyVjUvNTZ2RndoVlVHZzFMYkRENngrOVcyY0haSWV6TTZ3R2NXN0EwcUhtcDJoeWVQRjFodXUzWDBBczltZjhTd2VhbkhSRTFSeFZONy9TNVFoVVQ5a09DelR3VHRpelRNRVhRaXZNZ3VEdHErMGhnWnlrY2Jmb0l3RWR0SlpoWTM3YVdIeldVS2piaVdldjA4cDZaaXBxZjBweWhSMHJTM2R5SWY0dU9vQXlMV0NrK0x1WW8wNjFNU1QxODc0MnB0UG1WTFJKQndpbUoxclNvN0MzSXptL3hYcDFDQjRpaFV2OERudE5GM3FNUDZpK05mRXQrRzFDQUg4U29oTk5XREpJVmZBWEsrY3dBM0dHb01IbUFMM05obk1pV2JWZ00zeDgvMGYySTlhS2lpVkxWZnBvS2IreGczMnRubUhZTFZ2V2NFckZIM2tYc2dKdEtVTVBlSlFXRjdEclVHdTZNSEJNY3hqR2R5dE51aXpDMmpzWXlaS0ZaTXQ1MXdiSEIrVm4ycytNRHE4VnJaNWd0YXpGbHI3WDFheGhrYjlJQmwzVFRjV1NNSnNVdXpzZFU1Y1lxYXRFdklESm9IWTNnOU4zR2VmQnVka0JqazRIblNiV2ZjeGNPVUFySUpLaEI5TFIreEF4RGRBR21nanhtMWYyRUlGb1pyNURMcDNZL3kwN1lkTk9YK2dZcnZTc0JNTThqVTlndWJwNnB6eFdGbXR3UXUzZlJEU2RNMFpTTW1DL2dQMnhtUGFyVkxQWlFHeEpObTJaQVRWZ3VoNjdVbkN4RlJjUmVWN21OY2s4cXFpblBERUVyYUVydHZXem1rRktyNTB1MnduYkdld2xsd2hWVjk0Zm9xWDh6S3M1b0dlN1dEaERGYXdibnF0RGRzQ2JUaTduTWZVUUNNenM3RWFoZ1p2TTBQdnZZYUxMeFN2NTZXYkllNnJHdWhaZk91ZHhXdlVvL1FUWDJraCtXUFY0MmxHQ0lJY1JpK2VLQlgyQjU5d05GRHFOVWtYVmlSeEpoVmNXMkJlanBuV09ZRTl1RlpHQm45ektDN2V1b2lUMml4aHZDYjlCYmdraGZWV1VZdHpOeC9ISktpVW5aWFFsek5SY0VYUGVJQWdyT0JBaWNwcDcrMmRGUUdYSzliQ1VLenNlZGFKQmlMaWVPWU5RMndBSWZPTVRxYWZnaWc2U3pYVWF1M0pETmFxMVdDY2IyTkdRekNoVnlFWUlRbVp5cE53RzhGWVlURTBscWY0MTQ4NStOQ1A5MFdzaFM3dGtreTFWRXlNY1pDeVRybmhBeHVaR0dVY2ZHejIzbis3Vm5BczNPdzRVcDUrNDhkclNIL1c2Z2xDMzBiRXlndEl1S3daRjkrNFJvZUZ0elZTdTdpRjFPOEpsSVhJRlBPY25sSkU1bnp5TjJYK3FIdld2SzV3OFljcERVRUVOMnNUWTlTQXdxei9OcHdUWndBRUEzMTdOdEkzZlZ2TjF1NCtaNzNBc0VDTTlER1ZDTkN1UWdEVjdDc01DbXg1YmNlZHJhYmV2bzhnVENkdjV0STVuZm9YRTBYYkh3MzJPZ0tpLzQwSWs5OUZkVEpySzVPQS9SN1ZFYXBic25MR2hNODUzZHJIUEx2RlFCdVhZTjlOY0o0NE9lSm91ZmpsaDNpQnZlckdzVEhDb3ZIWnVRK0k5SXN1M1lMZFhnMHRjaVRJZzRoZ1Y3QXZkOXAyQVBSSWlhUldpTzlCUnY1Ujd5LzBNL0QreTg3TytjZkJXdTN3OVpsYzI1YTZmY3lyVEl1R2VjU28wN21uT3VsazVYYThucjlCVndlWWR5TmlwMzB5c3pWZ0V5RFdOSHRqOW8vU1p5Ti8xMU5NemJaVlZ6NUF6bktMcnJhcmgxZVI0bG9YcjFZSndwZGtvek1qdFdQUHZFZ3hvTXVRbnBVQjFkeWwrQ2cwc3lsV3g0V1pYN244N3dEMFB3cDhWclNJZXhwQ1g5OGl6Tlp0U2lKU1l1dGF4ZDg0RVB6WHNSWG1TZTVhbzd6MU9FaWJMRWkzT1phRmtMMGFjN2hYa0w2MGJDZTNmVG9ZN2RBVlJzOGFHa1ZlTFQycGxWcnVIcnBxK2lqZTViVzRFZWl2NXFBNzd4aFVKcXEwWnV3S0V0a016RnkwS2dLVzBNTll0bURWMG91aEw1R1YrVEtoSXlLRGVpZXhMUE81bmhocmExcHc1TnhPazl5ZUVPVnByTDU1bVhYZWhSKzdzQTBzM0dWcTdFdS8xTHZhWUx6bS9kT2VMWUhkYUNrRVJ3enFtUU9abnNYSGkxaEN5a3R5YjlGSktDS0tFT29mOENFaVB1dGIxbWVtRTlPYTRjZ1JHeG5BdWZRNGxCSmY0N09yNmdFci9aL2lCa0RDdlBRSFRLak1ta2RGeFJjSDRrRk5BVFhXTFV6amVjM21VbkhCQk10QjNaVWdEd1ZvQ3ZiRkFMMmdDbUhvUFNmUlNkdFQyQnh3Rk5JbnRJTFFVeEc3T05Ga1Azc2RxWXV1RGM5TndZWDNaZ01wMHp2TGpHa2srS1FtN2hlbDcrb3h6cHdXVDEycUdwQzFPWXZMN3Aza0x5TnU1ZXdSM0NpR2dYMThCbEE2Z3hET0RySEh5L3ZrL2YxdWtvZ3BseVNsMnJkWVpwQWwvRHUvV1FROXM5Q09WRGRRS1BPUUNDUkdnVVp6YkRUUGFNYkJoeExwTDZQNlZ6cDd0WTg1K3N0dDJ6YmFRdVdETTE1K1hTaHdlOFgrNnlNcW9SUVNhZnJFMVBrb2dtTm1la0oyUURpMGVyZThsWUFoNUVmZGNucU5WQXprVTF6enRHclFrS2MxdFFlR2tBeGNobDJ0aTlUUHVMUzFzdWVzSlpieUNFdWRrb1JXU3FRaWg2TVdtY0ZEa21TWUlBU0RIU2JIUHV0MS9mcWJSL2FFUFFENFhJbkI1WTcvQm0zbHFnUGo1Yko0Kzk0L1krbWc4TUVxZGJ4d1hUUmNEUkdTS1NSTWNRTk1YOU9Bd2VKUXlZTlFmcnVSbWhyazB4V0JyREZqeFhsMVlxeUtxc3I2dVBlVm1pWVVPNnIyU0lrbFd6MU56ZlpvV3F0OTY3akNqeDQrckhpUjNBREF5eVErUzRHemJZRmxFREpqa0xMUHhvajdSSTZLZUx4ejlwSytlM2Fla1pFcHlsQkYrZExJb3N2TEhyODl5bCtJelRBeWhiOHFEK1dCakJTNTlJVEtLbTBta3JoKy9OU0Q1WHB3MU1uNDc5UFpKdklVNEd6RW5YVEtBZDVPSEp0UEpMTWtUVk84S1lyL3VDZENpZkJMSFRMUjNPY0FVTVNiSWN3TzlPajJBenJTeDQ4M0pTeTVCQnYvR2JFYWZqYkRsbHlHaEhBWmFDbUYzZzl3cWUwSmU4dURybkVtb0NKY3ZVZS9pWDN6THlzNG83RnpkaHZoQ3FiSUVsV0RWeG5RTzRZd0R2b2ErLzJISFFTYWVrZFJlRWdQMjZNZEI0dlIrLzhmTVhrT3d6ZDE1ZnBsbDVPYlVVWVNsNlo2VE84aDhjanZzd0c1N1dZUmVDdklZMTNTVXlvdWwvV05WNXdLM1U2WjVLemYzZmw0S010WmE5UzdzRkxyZDBEa3NCM1RqWDlvdDB3RnIxRUNvMHpWS2JDWWVLaVFNSWhEOVdtWnRGMnJzSzFrdnNpWGJSeTl1Z25JUkJJbnViR2VFayt6RnpBQVhRZXpIZlZ6NWpFUWt6bXgvSjlCYmpLbG8xZlYyZlBzYlJ5aDdEaTcxT2dWWnhjaDBreXRIa1BHanhyQXJlNUsyOUEvUHd2Qjg4OENPNWRUMGlSbFR1eDZwVjNjYkt6K0FMVjFIRkoxbU13dGZkRE53dC9ZQlY1K2QyejBwVXZGOWR6eHN5RTRRdkoyWFFVU3hDYXd1bTRRY2tZTEFCVXVUbEZkYmNtTkI4VkwxUVdCQmhKK3RjSjkvUDNQblR2YkpsdTdjSjJaR0JiK3BQcjY3SnFDdFppazFpWG9DSWw5UFVSamNFWmcyNXNyYlVoWjFnMGt3aEhRMFhvWlVnZ1ltcGVkWHFwNXc3bjIvRDg5UGFQeGZoK2RaTWhhTUFsdDFMUTRtZmM3SDZGcndzTHV2U2pqMUc1T28zZGJ2MDI2MUo5ak5YL2pUTHk3KzA4ZXpYYVQxRWtxZXBXdzllb1dtL1dIQ2U5bE5mT3F3SkowM2dOT0tXK0pxVG9KeHJHT2N1Ums0S3NPTHdVRnBkRFNWVDF2NXU0REY3dWNQeDRacWtlZ0N2eFExYmk0TUV4V1hMZ0xNbE53R2VBNkJMc216OFV4TmNQZEZrVlE5SFpRUW9Bc3pORXlGZGtkL2pGcUJtc2NNU05mR0N4aStlVmhnUVVFRWlXRjEvVS9FV1F2ak9yMHlSK1pmOXVKU1d0M0RnZ1pRNjlMU1V0U0d0NXR2Ky9LcjFVbytYQVptN2c4c2I0bFRCU1JXVnFlc3ZKQmgyZjhhVE9rWC9OU3JPUU12ODkzWjUweEZpeXUzbFB6WWp0NmlCc1JoNlRJdWJBN0ZiOC9CMXBDWURDMm1FSWFlUlF0c3ZuTzUrUVBGVkVDWW10MXhjbUVxV2V5SDVUT0VjRWhhc3JwVlByUmRJaGx1bWRnNUlPM2NZcVhjdjBKRk9SZzVkUGdqTmRmZCt3UEQybjJLNGFWMVFPQ3BDRW9SeWtlMUZsNGkvaCtoeGw3MjNwaHdWZDU5N2xFeW9haW5ORnNsOEZncGlxNlRiN3NTME9PWmc3c1FRVkRIUHRpOUZkeno4R241T2p2eEZWMy9TdmFOVEF6aFJuN1hZQnhNT0NtZXNoNk5QTWs4WU9NcUhiVENtRnFXV0tJOTlFc1NwRjhrdTBMNEw1TkczTDJFcGhVRVo4SW1idW1VZ1p2YlFHOW03WFpWZC96MTFxUDNWbFM4ZDIxcG5QMzBrMnNSa3cvbktNTnFaMG15OVRFZXFYRTVWQ1dwSnl3SWgyR21wNWUyOEY4bmowVVNaSkFrZEpFRFpiWHNXditBWDMzY1hYRkNFVXVZWlJyMU14TVNKaTM2czJSeXoxc3VuVW9PN3BJbml4UHJaMHB6NjVzVlc4R0hNOG41b0tHZDBIdVR1MnY4UVo1d3F1b25ibWRIMmYwLzQ3Mno3aVF1MXJubmxGbXZzTDZidnB3Nk5KS3RiYzRPNGx4QWJ6ZlBKR20rQ0VNT1NxQW0ybXBaYm1QNGEva09nTlUxNTEzdENzK0hvODVEUnNmcWtnMUpRcFJuZnpYRXNSNENGVTZ0K1pvWithMnEwek5tbWhxNmpQWjRqTFV3Z0ZHM1B2eWhjVEh1aU1HanFGdE9yM0c2bVQzV2ZPTk5vL3JYYmlBZEc5M3UyVWxqNTR2ZFZKb0NmbC9zRWhSYWJRR0xRUDdLNlBzOFpmZzlpSlVFY1hYMDNVZ3crMllBMnFnUXNOWTJVUHNGZE0rY3ZEQnF3MFY0emJrdDBJVDhuMDA3anRtb01KODY4bjE1ZzBMVG01eEErQzVkendmNU1rTVVRRzRoRlZ4alN4bkYrdzUwK0lVMHZKaTZ5blFVNWxmcmJMYWJHNHFGaGV2Nm1Ma1ZOL24vbUhDdmhRNkJJZmF6TUVDMjJsUFNYWEU3d0FqdHZua3BUeUlDeWNSK3ZZUk83RUJrM29NY2pxaGZrRlJKOWdYRjRrZFpiaUFzSVFLcEdWUzBaRmszY0oyWXJkcnVEODFVbzBjS05nZTYrRHc5MmZsWVlsVzF0bnlTNVc4ancyZjRPQVdyYi92SUNZbTEyc2JIWk9HQ1dJZzIwUXo3dWRiWVhNeDNzbGlBanl6Mk1HSG5uNTRxa3lUdG1iZzZOU3RNek5Dd3RFL2E4c2FTemFtRlJDN1lGMHBsYm5ISkdvcm16NGdybGVTOHJxTmhSdEc5bWtJdnN5Tis4ZlJOcjVVVExXOXhLZDU0MDdqbjBZR2VmdFlneTZFR1FnclJPcWdHUTJwWGFKTmtQWGFPajlGQzM2cEt3Ujh0eUJBRjZXMC8vYW5BdU9UYzZ2YmxVdHJpMlR4VXpYY0k5RDZmRHd3eG9EdG5nV01lSklDNDhxMGFRQUp6RTBQeW8rM044cWRXM3JpZHJDUm05K3lPcHd5S29BTFlsWERWeTRkTXZSTHhDeFJrb3A1R2RwNE9mV2Fvai9wRkR1b05DT3M3MWpYWm4xcEFLWXJaeDRsM05aeGczOEdrYkdaUHJ0RXl4RUo3ckpYNGtNOS9PbU1SazRGY2dLNnlOdTliYkh5WjRsMHE3MkVQbWNVeXc1Zm00OFdPanVMWCtmdTFJeDBkYWEveVRmYnRpMFJ5NmdSQk1EVzhNMEpRcHJLSDBTejhBYXk5VHlWZXVZUlk4b2VSbDZHeVVjNW9ZU0ZYSm4vcGtoS2h2aDY1cUpCcGFSd09RUjhxeXJlZEF5MW1YZDZXd21NcmVpcnF4RGdTR3RLMm1uLzZpRDFJdm11NXlkZXRudSsyb1UvemlFc1psSUxETzlTTisyb0NaZEJJSlJVOEZNUURqWThkN3U5N2dtUjlQRnFoMklkZ1BxSEJSVWRNNGtrdmNYNWFJU2p0RjBIVkNxU1U5QWt4SWFHWG9FVVFLYktGUUxXV3A3aG05aEp4cmxDLzRpanhiQ2FjMFJDaW5kL3IvU09oWHIrK29RazduNGNsRUFTQlpES2RWdFhCZ2lxUlBWTFVCYU9wdk5OWVBBRDl2bUw4NEZCblFHYzRsdURWU2NBVElPOFgwaEdwNGo1SGJFbDhJUlAyZUpFdU5hcXltSDgvWHJjaG40QmRIY05pUE8xVkhqcUh2QWVScDV2ODFtM3RoK1JaalBDTWhWSFV0TUd6NCtGNjNnck1LRmkraktxckhDQjlIeGFUZ0p6TVdUbG5hbHdNbW9KaWoxVHVCNllDZzBEMU9RcisyVEc0aGdocHowTnhNUFkvaEJ4YnBMVXNKbS9wOVFSUlIySXRTTTU0QlZwZUhPK1JhL0NKSFdSRE9zYmYzRnJvcjVOM282T0ZUdnpFS25QeEwwYkdzMUp0Z0tORVExbCtweWdOUlZXYW5EZG5qOU1yQ1VZK2UveXIrVnhBeUFtV2tpN212RThYMjVCdFNyZGowVzc5WmNVYW10RnVIdTlZVnpqUlN0S3ZwZ244Si9kYy9rRDAxVCtiZW9xYi9kYlBJY1dsVDcwTmlXby9ZczV3RnFwcy8xd3F5UEpWV0thZ2t5aGFYVEdTWk1EYzdmSWJORnU4L1B5MG4xNk1oNlBvQ2F4T0M2VEFlL0dkZjdCZmpHNmdEYmk1WFBsLzd3dkRWRDhEZ0VUUWYycDZ6WVRPYVEva2JuQjdYWWFuV0dhVmxJRFUydXJqSzRTODFzYkl2ZmorQXl4ZUt0VHF5WDh4MzZYODVBTHNhTkFrVVVyNWxBVTJMS1FyeTlJRW5aUHBMUENEOG44aWJaaU1KTXBsYno2UmJETW9mZTZSWHMyaVdzMWI1ZzlrVEFKeVdHMXFuNUtlaUo5UzhYYUIwenk2bmk2bC9paHZtUmpLT2k2Q3ZZcEYwODJPemlkOU9LbzlMSWpxeUpXcnBaeTlQajBQMEl2NldleklWYkZoVjVMNkdXQ0s1R3FLNWF1MTB6Sm1RbG01QmxMd1lJSXBFaFNMV1crWkIrK2dldHNqb2FONEJoTUcySEdZUVpJL2MwaFROakM2bS9YYjQ0SWR5YVNJNjQ5b2d2MTMwdk50Uml3Wjg5dTJqWkZVckpRMnF2UTRTNVpMZTNHNnJadmJaMWkzdE56WG01V3JsUXJTaE5MamdqTVpoVkV2WFhNdGdwcXdCS3ZUUXU5cWRqNTB1SzBOWVMrVDZScEJqUVVxZ011R1poeWloYUt0R0lacmZCRmNRVm55alF4UU15Q3A2aDRmbU1wUTZNenlHcTB5UzZMWm1SeVc5R0Z6N1dqNjA1KzlwS3JjSitNUzhqemZiUVI1bmFoaGJETnB3RWcxMFVKblVtck1vR09ENHV6dDJIL0hlNFZ3S0FwclRDcndsT0JtdmhuWm8wcW92dW5OekVBRjJvdnprajBHVGxRSGJqQ2xlai96b3NsKzQ3QmlsdlFjZUlCZUg3K3RHbnpERXpIWndZUkNvMGJvcFZpR2wxU3orY2JldHJNZWRyQTBuZWdSU01xaUJOZ2wxL2NTM0FHMkVUK3VaeVZhWnVMNmFzZW5SdnhIeVVPcUoxZVZ6L0ZvRUZwaDhMWjYyVHhRS2l3S1pFbnJsSUNPUHJWbkplK0pxNklYUjczQXFEWUtWQ2VSVTk4STNiYW5lR0FQRnpMU0JvK0RiYUpsWjA5K0p1SGlHUnFWaE91K2FMLzk5Y2Ewa3NmMTdNcU8xYjA3TEFoTnVKZ1dPbGhYYlpXeUY5Ris5bC9WdDRMNVBxWC9uNi9ZWHovZEgvVnYzZ2gzNzB2MWFUa3lsRkhOajdRYTFtTDFUN3NRSGlsQk5mTldBbm54TUVFaE5yU2pCSDdHSlE5U1JVWmRUZHhHaFJPaVFxeXUrMVR4eXVQTlRPY0IvNWpnMUoyMnQzQkNnbHBPbXgrQkhZSkpuZnpBYjl5dXgyTEZaTlI1b0xEa0NTWGgrWFVweUZITE5rZHYxK09Ta1RwQWxYUk1FamhIOUo4N25ZeTVMT2h3YjI4UWhhSGJ5Qjd0ZEZ6UmFFSnFNU2RyRzdSQVlhNHBBdjgrYS9iMmlrajVxMzM3d2tmYkJ2bXhNd0NITWpnZGRGV2FzdURmbSt6WGpOTFFEczZJRlIrV3dHcDRZS1BqaGc0NHR6SDJLVVhTTTYvZkIrYllCS0VlWS8zR3FnTkRPOTFVV0M5bE55OXBaMjZhL29tdkpCT3p0Z0NLRVhBdWRUc0x6c3AzbWJnWTdyVVNFZ1FUaEZuNkxlbFZUYWlEU0IvTjR5V0xlYmR0V0xOem9TM1hiZHB6QjZDdHIrcHdES09kVVkrOFZ4U0M5ZVJYUHo0d0NyVndHYWZHcmswUVI2T1NjZGp1aDhqNkNGT1RpS05Pbkx6cU94TmIrWW55VHVITEJyZGJMRlU5a1lTZmJwYXFScElRL1pGcDVLZlpVM0xPME9qQ0UyNjZZZkZKL1JYQzJaZ1ZBbWIvUjUrSDFlK3NxRlRNWi8wU1QxSkZzbmg1Q2ZGekVxcFlzN3VKNzdBcTlmU2Fma3lFcVdaQlhCTWt2Tnoza1N1SWhIZ1ZkSXN4YmJ2d1V0L29KaXVrbzE1b1BIenZSNGNTVVQxcS9KZXNHcFVoK09wRlpPN01JV3l4NmJUY0pBQkthbVBaYzFpdWJueUZoa2Q4YTRVM25vWUIvWWsrY2EzVEwxcGV1VUxyNUpMZ2hocUE3d2xxWEMvUnpjUlFFeFExeHJBYmFnQUVLR3Uwa1N6cHVjeWsybitISWRGVXZCMGlVczhNS3U5OGdlYmdBbXZmT29aWTVPUEJuQjNzc2RaMlB4OS80dWs5SXlCRDdPWmNKRG1RR28vT043c3hCQVFhWUZGN2FpNkQ3SWRwOExZdjUwNWNGeDNybHc3ckhOSVN0ZDBPMitGR3NDNWkwMkIwb3B3RFp6SWJ1ankxVGRHbTBxaVcySm44bkd5ak9rWHo1bzFWeGUrelFEVVZpVVhGYk9WcjJ4cGEvUlE2MERVbXhsa1dzNFpTeFlZSHJVNWVERW80Q1R2dHBqdTQ2Yi9YRFIxd0syUWI1VVQ3UnhSQmdnbWdlczFGQTZPUmlacTBhYmVqVkZjRWhLNytnNThjRDR3RVE3Qk9rZCt6bW1qZktNZllzaGE4L2xnWlBTTUZFOGZTdGlES1poeGVxU3o3a0R5Yk9PNlNrWTRSTmRITnkzMnZPajFjNWhQUzNrS0VWa29lLzJHTGJicHY1Q1Z3RjV6dUF1N0NKSnhvM3RHa0FFR1VHb01zQ3FYUFFMZVRZNlJPS0RKWERlWkxzZGVlamFHSXNxV1NhSFBKVmJubkJPc3JCNGdyMmJiY2ZRKzNzdkNzUGY3R1JseGs0ajVSMmhGQ1k1T090a0t0MzhiS2htSmRpRGhoeUZYWTlsSkVFbWIvZnhLbm9BUHlvTFIwU1U0RjFaWnJDWmZMdnFBMzhoeVFZRUZVdXNSMFFidFh0N3hqcWVFMzROb3I4V1FicFh2MkhmNUdHOHRQSG9kQUZxbEpxb2hmaUhGME5nKzFVWEhiTXRvVGVJc2NGc0dXY0lxbXNGSTRYMjVkWWJMSThxTFFQeGM0Tm94NGhvWDZoYTE0K0o5TkxJcDIwdlBETVM0US9kbzYwZWpEWitXUGluSG9RenorU0ROYzFHV1ZHMzU4VXZXRWlpdnFqc0NSV20xaFc3OVVZbDFqODY4SWtlMGx6VmJyTTk5QTlzUVBUNURxb3VONGwycTRYNDJ1U1pqYjIzNFZNbzFSdHE0TjYrQVMvTVU3cUxQTmlLMEtBcHVlNlBVSG9SN3pwcHZDZ0tyMk44Ym9qNEZjR2htZ1UvR1JVdWducE0zazMvazdXUE9yWHNJQlhxaEt6VFBLcHhZUER1citXcEtLc255VERCUUxjcW8yZHdETE9QUHY2SmpiVk1EcjNlbE5JL3NHUE5ONzZGMWorc3lia1lDdnU1UGl2Y05UaXFVdndMUHpYMlZYUzFjWVpHZFErSnBiNDlPYW96cUUySTZqMC8wbUFNMlppQ1B5VS94U0tQS1NkbUdsaXpuMnNnLzdmVlRoQ3huK251ZDQvNzRmZHpyaUFENVBmMk83MkRqV2Z2R3dNdEIzT0dNVGJ6K01QUE83UXRTaFFCeENZeHIrcGI5eFRMWUZCWEI0SDFrbDZKWFRjUG4zbUx5U0laMDBqdUw4V1JIT3JSUnFIcHAvaVUrOWZYUTB4K1BJaWxsbnEyZm9USDd4bUJmVGk4cEF0Nm9NbkE2dmRIcytkZ3pySU9JVG1ReXVjWDh5V0taVXk2a05wVXZxaEdmRE9sUUZGRkZaWEtwMjlGY2tPN01LVHE0YW9ZY3hLN1FlaVlBc2hNeDlncElaZlRHbDdOOCs5eGVOcDNjUmptdVdxSWV4cVJuNU1Ta01Xb2VLdHByaFRSdktidlMxZXVUejB6NVdLOElwUzc5Wm9MeklNcE5GZ25QMFd0ZVhpVC9KT0FJRHpNSEVEWFBQTnBBZUxPL2Z5YzIvaEJNMDh1d1k2T1BQZlZ5RExUOFVDT2hBekZuTkZqUERJejBUbkpGQVQ5WTN0Nkl6U1RyUFFaU0R4bDlKb3VLMk5FN2dsWmNQTjNETER2bnVNUm5tZjM0YTQvV3B4eXJxREJlenNoUkNxbTdFd0F2dTgwd2p0VFlLU3RjUFRJRUNKZDJqdHlIeVZvVzdNR2JURFJZUUZkM1dFbHN4N084WkJTd3FZTTgrazdNRXNWcHFleUcvOWRDUFZmUTdqdFdjR0NVK1ZhYkU5bXVlOVRsWldGelhaNGZ0dnk0enBMOHVISHh6Uy8wVkgrQlUyMUVCTDB0alRvLzljNzdLWVNlRUxiWWdoM0Q4bjdaUFFWY25PS0lIUmdIVllGV05HRjdNdURJR29YM3ZkMXhmRkVCVGR6L1FlRlFvTllvcnZqeHdVdFEwZWx5ZEZuYjdRQjRxLzdIbDVSKzJOL0VRNGttai9NeEVQTWpNNm1jRWtkWjNQUVlGYnNwb2FSVzdNY2ZUcFYwUnBwN3h5WHluZSs3Z1o4TC9GSFZEK1h3T0ZZTk1yMUp6QzlTc1hGTDRrYjRqYlROM3V5YnlkdlRQRG5aRnpVcTV3bEZZUmkvSHF2TDY1a2kxVVBGWSt6OElTTlNJelUzMktBdGxKOTliRExZVVdxaTZ5ejdiUjN4RGRZTVp0eXFiSkE3cHQyRmFjencvZWtFdHZRNXJYdHNuSUR5a0tsZmtPSWQzNVlrbndLampwWWs4N2xIelZGOGNiTUs0Z2EzWnY0bDExbFNRN083WVV1SGhqSHkwVXM3eGlUUXZkdkZrM21LQjNYSGJtckdKVERJT214OElVcDVNWGlkRjdaZ3l4SlFhay9jSWlObU5rdGlCQS94aGp2WkJTeno3bGtSZWsxU0NLVmVvMnFFR1orSUkraFZLdkpLeld0UllldTF2b0RFMUNJTHFPb3hURStpblVLNHFUVUMyZkZobnBVOEx1Wk9FSGpmS09mUjRuaDBTMHFYSEdtTlh0SXBadVRENTRZYy9zOWdSU3duNHlpbDc4YWhUWFRqQlZsalVPV1NxeERCdXFZN01VUkNpT2sxWDY4NGVwdTUrS0xvc3o3VHdhY2V3OHUrWHFudEVaZjdtZDVIN2ZhdlpBUkN2VGlvWWVBL1M5dnNtc3kyZkdrTnRrUmJtT2ZoVTM2WWxnaW9ZTTEvVVczNkswUGJteU0xNVlxYnRCSjdaSm5iN3EvazZjWWhDUGM4Q2tVbktMT2pSelJOUFZqQUFhQmxEL0VyanlBSVB3ZnJHem1DSnV5cWRSak5zRk9zSGtOT0lQMit2dEpZTFVsc0c4LzBhSkVpSk01NXZPQUM2RXpaUmVYK3lMVkF0YnFNRlo3WlU1VENRamdkcXVVUlhKYXpBTm1xbXdoNnZCQklmbUtKOU5lbDVzdWd6WnlsKzBWT0FEKzJOczR0NUovRFVzOGcxcHBRazdEZ1BrOUJicngzZzBDeW9tT3NjSDRhWDFtNmIxZzk4aWIySWFlZUtwS2lvUkpnNkg1MTFRamFmQWlOc1hIUlVPU0JOMkcvbEtxTlVkOE1NSGowakR1NUlTUjVNaGZhUEdQUllVVGcrZkFTb21VcHNzcU9SSlVpUUh1ODM1V1kxdHRKWnl3aCtEU2szdmd6cE9YQkp1NDZsU1dJUW9pU0EycVFDL3UwamxyTGtlV1Jsa1BxVXJrZjdxdGNHZU92TTVwNVRQNGh6ZDB2eTdOYzZWUFJ4OTd2VURzUnl4L3UvL2EwVDJCZ0RRTC9VS3dkdnJ6VzJjZEUxR3Z1QW56S3piSW0vSVlrRStmM2ZOMGpvM21idTZ3anVRVSs1a0U2ajJlTFhTd3pJNUR6cjAwY0JVTjRaQjFRZTh0S2x1SWl0MHlXRy9zeVA5WUxRSHd3TUxuUUdoUUJPNEwwV0QxcGtNUHVtNG5WYld5WmdBcXRJQ0NzclVxT2hwQThaOFh6QS9xU0hWWHZVSXlXNlFyV0hRSWFxUHhUTEhZL1o4WG45VUhvQ1JpSW1DUWVZUVRPUmljT2JjM1ZiVWRsRWJENjdjbENZUXJQZXJVZ3pSVVg3Zm1ORmNOY2w0aHMvaXpVUlA3aGNMZWhMWFd0N3FZT01KVWtFOFVZZVZaclRTSFFIL2NkTGc4SVR5YnUyVUpOZ2RRcTE5d21lSkpqRVdFSDV6NGhrTG41SGh6SWJIOXo0Zjl6NmVrMGxBb05WZ2svc3RjaHJFOHlXcmR6V0ZTczloUmRLcXIwZnFvN1hZVEVJTzZpb2R2YThPTk4rbFp0T1dUazVkaGZ4VTNiVVVqdHdTQmxjbFpPckRIYlZkcERxZGFvb21zdDdMcVFDM1lpR3ByVjhLeU5hM3hwNUl0SG0vakhGby9oekdGSjBwK2NWajRiSmZRdENEYko0dkQzcHdzSFFWcDZBZjRzUW5SVTk0cTI2TUdIb25TUDZIMXI5U0RuQW40dmtLS0JLRldPUGxkeWpVUHZRaDZqbndXNUFKSHdiZ0xZcHlEZ21WdmxUY3pCMVRrSHJyY2l4RkxDQ25PbHV6OXJiQkdaK0ZEWFdVVDNOcDVMRFRvUmlkNGI3bWFKOHE4eVNUdTdiOGQ5SXhDcWNZc3F6WlZLclFITFlMVEdJT2t5Q0lrcHU5Sm5HU2JmNDlnQjN0cHN3VUFEYzcyUXk1aGR3ejhsWXFtc1ZSWXRKcVduaTAyTjNHWm1Tc1hGbW5XR0twVkxabWtEcmRETG9MRjFTbGdLTVNGNnV1T2s0L1MxeURDWkRTc3R2NFpabnVjTklOSkxBdWJURlBaMCtzM3RtTUhhQnR6djdRU2lQQy9yU3JSR0N4eFNtMGQwNUcwTWpnbWcvWjVvam1CU0hUWFRUMC9hMGluWG1kN3B1cGV3a2NXWTJiS3NWQ1QzOXNVVi9INlBOaW1WUXJHdTMxSjU1bVpQbUZLa0N4TnIwbHdtYnlrTEI1UkhjTTh2U2F6VHJzRlVYcWw0WTEzc1NyWjlpdjBpL0FkcjlPanZzcVI1bVN0US9MREloTHpUc3UrS2RwSHlHOXRzN0VpeFFsb0RWSEwxa1JZWlNYeS84OU9tcis5MnFuYVVGMWQzQzM3dk8zbzZkMFExbHM0clRvRC95TXNEb3dKRFcrY01HUWpocEdNSE1KejVUNXZXU2c0VkNLWXIxUEZLRjZ6bVVCeVVIZXlyaEVWU3ZBSWs1NVFjalNadTVrZUk1R0ZEU3ZJd1lMcy8zcGgzZzh2bVVJbHlXT0ZDb0p2bTRwalE3OUxrUmh3VDNMUnJqWGtkQ0NvWjltYldqb2psZ1cxd2I4eTMzUnMvMG4zN1hacUhnS2o4cHYvc0RQa3dRU2lTdnNCUzdzYjJIL1V4NFExVVZpZGtLRmxHNWpySVB6cDVmSXBBaVFWQ0RzZXo1NnhqeTNHdmNqYnpFMWZVaENiMFBsWnpncm82K3VvRWJGTkxpRmdCWkUxYkdsRG9rTmtOeXRKbVU3eklVbjQ2QzA5WGJ6bjZZRE02QVpvQWg3WHdUVVhyeHVHcUlZVlkyczVPUTFpSFVTbE91UUw2V210ZGZMdCtVL0c1ZVJ6bkprUGdoREpESi80QThaNkhrcDAvanZXY0xNc1k4bGNkM0NvYWNYRlBWVzdOZzdDdFV4YURlR0kwVmZFL1FGbzZLRVhuQ3YyOEJ6emJjYW56SnZxUWxWdlhwRGRyVC9WM0JCam9uRkpPTEtlSW8rTXNiWHFtd2x0WTMrSktEaGsycDZlUGs0Y0R2NEg5V2xWNk0vSnRtNVNwZkRMaUNlb3JmTjI5MVRQb2o5aXZiMUhmcUFFeUhBVXREcnhQVlhrRjdnMFdIazhZYUEyZmFOMkxmcksvd3VkQmJJbnVJYU1wbitudVF5UmVwcHNGNkV5dGJnZ2xnZW5SZ014OUpFaC9JelowM2dqVDJCSEVqeXgrREZlZEdoMC9Zams1TjVGUmdZdTRhTVFyS3FkN0ZLNm9hTlcrdEJTQkF3UUdUSml1dkNYNXNzUmt1ZzViZzdNenBnL3FXYTVVN3cyRTNzNWNYL0NBb3I5Z0Frdm0wNmxKSkVqQXFJellhVlRxNEx0a2FybFNvMitYdi9YL3ZueWZmVU1PRnM1RUxJb3JBS05lNDFsZjI5dkhKQ3NvR2Y1NUJqQUxHRTMyYVNuZWpNUHUyT2Rra0JhZUE3bWw2aWM2Z1ZRaEdJbW8yKzBZSGdxSzAyQXhjSmNVS1RkelA1V1NKaGRTSWdnZHEveGVyWjBCbmZEREF5Tlc0cmtuVTlaZ0pnRVptUzBhS1dHdzA1N0E4Z1VPd1pvUnpHUFZlUmxnb0o4d0FZaTMxWFczYXA5c0hIQmw1OE5xaklQWVRiUmQrV1pMeVJ2MVZzU1lMOTE2SGxmWGN6akNXa3VMc29XUkpFOWRqN2FHeCt2MVk3dnRlSFQwUU5RS1BLVVBBb2lFZ0hyTEFhZzVDdjFvUW1hVEdTRGlIME15ck5meXlQQXNtUGt1WUtPQ1hVcHBvL1IrYTlEbEhNSG5nMGxuYk9mSnVQdmJBT0lDU2VuTnpzN0llL0VWcHpEUHpPWjJmclMvd2l2VkFXMUluWlNxYjNnK1RGWm5GTktUQWF3Wm90QzJrYUhERUl1dklVYWhhZFZSazMrbEdmMWRIUXRxTFJJNGhVUnFXTGNWWDduZXROV05nZE52UWlIVjR1N2dNdkczbEMyZ0hmTThQMDlPNDRMN2tCSzZRYTdYUWhKL1ROV0gxamNNZUZLVm5Kd1ZXSHZDNzZqaU9nTHFGSkczS2t1eFVteW9IZ0IrUEFtRlRwZWhYdlI1UUhvZ2FKRkFCeTcySnBJZWJHWEIxRVAwWk95dGJ1VUZZaml2SHdIT21KZ1hTUktvd3YrY0RYemlOeTRGR3hBeXVVRCsxRGpJMWt5QUR3K3hEclRrKzBoYi9kZkpzai9WbGdaZWJ4T2lBWjkrL01QZmhhb3J1TFlsSVo4NFJGNDhKZnE5QllpdUlCUjVRTFFQcGdaNDRMS29yV0NxODFMMzU3b1hvOXJDMHhpLzY0T3RSbkdtbDlzbEVqWitRYkdESDJJdHl5Zi9jOTFjL0ZYRUR6TGtyV3pvNHB3V1UzcW5HVHRNRFp2bVBmQ0ZyV2FUajJDVXlaRTBHenI4T1lKQ0gxQ3Vmb2FRdkM2UlozR0ZKY0wzTlpySi9CZUI3N205N2NzYmc2WWJ2R0RiZzcwbXIzbW5LYzB1OXFiS0JPc0oxb3h1Z1c1cXRPWEhsNTZaTExRTmpJOFBxSStUL3c1N0E3NDZoMHI2d1RlYnVSQ3I0ZHpMNnh1UHJNK3BoeU5TWTNKd2puMHFUSTdxQ1cvdjV1aWdSVlVqQUpJWFpzR3M5cUMwMHgvcW1FSEd4QjlzL2M3eVFiZFY2Z1duTC9jUG5EUGM1VTkvMGZ0ckJBOTlmTG1LTm9KcW9OREV1NVdwZ2MzbnBsN2w0UmpLaWRJbXVVQXFKS2xQZGE2ZTdEZHd2SWZhVHBLTFdIRkZBYTd2aDNMUW9CcWpoQVh5cTJ1UFhQdnhrZkcwem9NK2pPL3lPU1QyREtrdGhKUUJwR3NSYjdqOFZ1YkZYanBiOFRzbGJUakR0WWIvWWlHZXVJQ0liNzJ2WW1kM0MyUmR3WnZCRDhQOG1idERtbERCSitWekRueWFqRGVtOWlxOUNsRUxmNzJrMlVySWE2UmN1dk5Gd29rdElaS2lRUTJudHNyWU83aS9FcG9tMStYWjgrZVJMVDdPcm1BUVp2T013MGphdzRtelhJa2ZUZm9hVkVvaENadVZLdkRpK2IzZTZaWFkyRVBiaUlBU2lSVWw3N0V6Sm1FcmlRTHBycTAwc0tBUlVmSlMvcWQ4SmwzODl2L3FzQ3pWNTlyY2paT3hQRmtjUllQVFBqUzNYMzVZV2J5cEVSSUI3clR1WXhTV09oZjY4WGdUejBpV0o3TXluTnVCYVk0WXhUTmRLSDFYTDgxRmdFbHI1VUlLMHNsNEZGT3ZMd3M2NEw3WlNjRU5pZVI2OXloTFdCMzRQRGdoM2lEZnBBaTMxZ3FLc3lrOHJIaTFOUkxIMlRidllERi9VQlRRWHB6c2JtUmNYNHU4aVFlcU1NZC9iSjBzMkNRMVYxRTQ2NzdTeGw5UGV3SzE5bHRNQUNla3BpL2NCNnRZeWprVkxkQ1NScDh2bmRVYWRvV3JTVFNDNFBUY05EVHBzT1lYekQzN2VUajd4U3lTWEgwbi92SVNjczdOSGE3ZEZvSHdvaG01YXUyaGF3dytkRXFUVDBEK29PcFlERzJ3WktBRERLVmhRQml4aVprcFkrSU1POEgwTW14cUJkT1ZsbW5wRENLc2tTV2s4ZS9PNmNLNVdzSnpwNXY3d2QyVmtiRlRQV1pUUjdiRTBFVGg3SHpsNG5kSXZMbWRuclRtakV3bEZDbjZYTjRYZG4wZmw3QUNlVkVDRkU4aDR2eURiSWdYcXlKQzZTcnBDcWNjZHlkT1QyczJhRlo1a1hiQUpuKzRTQnV3d2huYjNEZkZ0RkNneWpWeEd4OXUxUHFrY29oc1MybUxsZDFyVXRaanlSS0FhTWYvb29SVXkyNHY5cVNOd1ZNSFh1SEZNdldNeDFSVlcwb21FR2xjeTlvY3ZqVklBbFV2OGRBRndaa2ZMbGdsZmlnT0NSdU5pTHdBSjVVNkV4YXFkdmd0ejhPajhrM3VjQmRvdGdXZU9md01CUytzbWNDMmhKQjZITWYrQitUM3YvU2RETVAxZXk5ZlAzRHdEOFAzVS9oOUFnakh1TExjNUxrM3JOSFlQOFNocnNQMFBsYjVUWW9rTmx2OGp6UUlYQUhEYkVCSTNrQlBid2VEeE1pVldkN0kvc0FiZ3JsOGg5WExhS2x1UmNIV1U1WTRKdUtDR05jdk5MTTQ5WE8wc2JycVp1WjYwdWpGRUlwR1ZqOEMxNTZ5RlBaN2l5V1NYalJPTnRuWi9uekhTL1VTNG9JbjZPVG9VQnNJbDE1NWJ1a3VxeGhqbUpzUkZLTnM3eXhoUUYvWHlybncxdkI0S01qeW12MC9aS28wMXlETjUvTXg2SStYb25FdVBjb0thVXlGWkk0cWtNd04yeE5oTDkvMHdqN1JaajF5Wi9sMncxeFdKVGcrZUpUd2EveTdJMTZHWHJzbStDSnRJaHhFVlRpSjlrY1BkYjVrditmWjJwOVhRNVJYTDE3OUNsSkRzRlVVNHN5dnVYcWY0SldWOWMvSkRxVkFmVythMFJMNUhtdTd5Qm1HMnNxNDAzNUI3MloyYU80bTJEdk9CcGdSeEU3dzNiQkJ3dFYyQVVmcEovNStqdGJ4UENtbGQ5enlpanFJWnNXNlFZcVhwbDJqTVBPY1BKdWplRWcrUEpmWW85RmlYQ1hKb2U3YzgvY2xhcVNlQ2dyUmNDTDlFZUwxc1hpVGJtRUZDNEhPeEwrY2hTRGw0bzZWMU50QjRWQnEwcmJCNUVZdG1LMkk0cThvMFZVcmFrQUU0UFBoTWhsWis1Tk5PS2RKamxyZk9iT2ZsQ0RPTWNRM3I1ZE1Lek5OOFNlZ2trMEpOejJqaVY3d0Rwc0dSN3VUVGxnMldCdzR3cGt0eUJ1ZzZINWVBRjl3ZHlQYS9lV3V0ZkRNRFYyS2F2amNocHg5Q3lOTWpVR3paWG9ETHJwOXAxMlJPcjFHcFk3ZWxwbGY1SzF6Zmo4dVNKM29hbjJGNUE3bHRpbWNQRUtoc0hhWXdrdDArVVQ2L2JUYTNPRzhPQ1JFS0pJaGlySzdwcXVxREtldWRMWlZuSy9LWEJINXFOQUgxMjcydktJQU44alI2S0FGQ0FHSGlrK1lTUml6T3RxM3AyM2VaWWh4cHJXZTRTMmNVMUh2OW83TW1HRytBbjl3NHZuY3VwU3ZsVU9zS3RtVzBPalc0MEpSOFp6VUR4d1lqYzUxVE5SL21JdEVVQ1UvbnVWbEVhdFhHbHdjVC9YNFMwd1hKem13Z0tuZzVJR01hUUFHNE1tWjdWTHk2Q2VqRDg1TW9mRi91U3kvV3hEdzl6M2VZOWlFZ2gxT2FmMnp6VVJFVEtNSlp1ZlRWR2E5bmVCMi9pemQ3cWtJQTdCSVpQdUdQMVlTTFhqVEcxWXg1WmdaZWgydzhFeTVNVXFqZE1EOUNlc3lDTWZ4LzVhQkprc0NqUjdHK3JYcU5DRGJyNjNpWXZYUmFlaFZYc3NOb3pRNmsrN2Q3ZzRvYnlwSjB6L1VIUGJGYXdBSkNwaW1pUnJPQTNVbXRQRkpCRDVubGdNQzdiUHRYQ0t3U2JxbXducWhwYll2QTN0S1N1bzYvVXdOcU9lKzgvNzJWaGtGYU1OQWI5bkZ0citKY3RIMndpZFpYZTFmaVFzYXFlMzlpL1NFK01hNGt5ZDFVSzlRWk5UZE93OW9ITTQyVlhJcUJUQysrd2hxeDJMWDdCN3Z1dHNBcDhmU1BjY2NHYis1QzVFYTRyZ0RQQytzVmllK2d3ekw2c1RMazUrUWhPN1h4V2VxbkxPRGlIZ01TMkpHT2ZIRzIxRzJjb1NWZ3V0WllhcTNMSE9vVmVNdFgwNzRNRUZoS2R2WHRMZW9ReXVHUXlsWGgrTHlwZUE0eEtmYUVjVGdkVnFtakdlL0ZIM2ovSWhaWkJqWXNCbjRYUE9aYzBMQW0xQnhFS0YxQUZBV0Fra3VjLzBSalMrUElKRUtQbHQzUk5XZ1Zad2ZGMmRzblBHeDU5MUtKby9qOGpSUkRON2ZmY0R2ZWZBQm45ZElwMUdPQkxhOGZrQnE4bHVCbnV5d1lhRzRrcUlMMll1M090cXdoZlQvaXV4d0JPMHlyV2thMmlhL2FVdnVVQk03VDBEd2d6Tm8rUjYxSGdxT0E1M3NjV3huU0RBZkUyWStGUWJod0dzZUJtSzZEMUF3K0haUmRpeUIrV1RHTWNCR0lBdDZIYTBRREVnN1hGUmhmclRVQW4xaDc5cWxXOGhQSi8wRnBEQU5IYllXSnR0R050bGpNWHMzM2RkSDhpVGlZb2E1MnI1OVpKbW82Skg2R0NvSE9RbmRweEZmcjFITzlIUzBEaUZlaFhyc3p4Z3VsN0VyRHExMzVzcmFGem96Ym5BZnlxa3h5S3VSNzhIRE1XbWszeHJVdDNwYm9YWUJ0akRkMW5qcnpadmJNejRQVTJhUEVaNkZJUHo1R1VyanArQmQydU9sMlRhNzJTMXlNZkdWUC9WaDVJbEdCTDg2WkRMTEZ4eFZmOW1vTUIvVE9SYjNFR2dNYThjeTVrOHIvSGVaRXkyLzlyaDU0dTZGQnoyVTd1OTRndGtQUFhnQjZwOXVrYlFwaWJ5S2M0SmtjN3RwRXJUZHpSSnUyaldhMUgzNm0zRHU4WHFRaTVnZ1VLeDM0K1Q5VUVxTm1jTTcrNVd2aXFDeENwSXNBOERDRHkwcEdsdGZGQ0t1Qk1ObHNKdUkwS2k3VmZac2dWa2RpbXIydTBhbU5SM0pIYXBJZmhjTVZUV1VlcmtYVEFmSFArRFNTRzIvQkdxUitJWnhZNE9SUnlPZGxBWitRRzZSS2taTVVDQ0pwZ0UySDJDdE9QNkpHVElYNHNzdDB5NHYwL0hTVWlMeDYyMkZ6aUhBSGNwVUpRdFV6SmZ6MEVXMjF1V2lIbHlLTmk4c2ZpeWZGU29EZSt4ZThCcTloa1pBRkVCcS9RQkJUalNMZVlkdzR5eGxmWWlxWm9VK2lZN1lQUmEwdWc3RkdReTA5SlBVZ1hpQldGZlN0WFQ0RGJYK0srQ2s4RG9WQ2Q1V1FTR0lUNHVSN2xpZnZRUW5GY3pDYU9odzMweHBmUGZJNVNSUHVUUCtYOVJMbUpFMGY5d1NBVVl3TE1JdlhxWmlxclBGTEErNU1PMnVCY3QxeHA0TkVFRFlUZExqemNmUFRzeHFvMGxyaUZCMlBNVmFQYzZRRFErWTBLdDlwV0NWS3BqejVGRlA5TENWUzVsTWVSc3hZQzBOYlFGYU44bmNlMEt5QWt2Vis2cFFvNW5sOVJwb3h6ZGNXUlJtN1pnNkFDYlNia0x1REwvRnZMb0QwYWVKL1dxSEtYR000MHd0ZjgxUi9BS0ZVdGxtMkNmellVZGVKT2hqQ0NSOGRFOUlMWnU0NktFQ0ZQWHNnRUVqY1UyUEdiSjQ3cGhHbWNZOXh2cDF2Z3pOYTZlc09PcHo5Nmhxc0Rua2FGV2lqYmswSWlGWWZEVzZNTENobEhRMS9kV2hoVkRJa1pXSzNjNnc0T2dReGhvcGY4T3Ryb0xoNFNqNXBYMXIvZUFEUVZHR3dmZWNtczl2YWs3VGhJZ2RhT2lOdk1SZUQ4QkF4Yjk1UDZ3TFBYL3FoaTQ0QXFWOTBRZmtNYm1UNTNadE1GeC9MV2E1NkhWQTZqNU9sSjVGMXdKVzRhaCtZdnVxRmNsOEpodnM4VGRmakVxMmxDc2dvWmlSZkdMaFAyUHJDWEFJRnZrNENWRHVTbWJhN3F0MU5oVkhGVDY4UXBTUFhGOXd3NUJod0Q2R3ZJWHpWK1dpczhybUtOL1ZaUkVLd0tWZ21qMXRKeks0MlorbG96WG1ZZVNQcVdmblVFeVFmSy92TGRadjlLK0ZsWnZ2OHd2VWNIS1ZPdEdzeTRocjgwdmVtS2grTUFvMFAvWFhRYVo0enRGdEZFRmI0Q0dQSVBsNklLUmRMdmVvTFFvY2tMenRlV1B6UGQwclVieFhsSlZTVUdSVmRRcEhaYjNDZjJ6OFJwTU5zSXUvOVFGTnZmdndTVHFqWjNhSGl5TXFDaFBxZmtseGFyQzA5ZDBDQUxBR1VwK1lKVHdPSXd0N2lXSXVjZ2pNSlVBWDNCWFRGR1BTQWdRVmlzdWZPeEUvNXBPNU5pSW9PVnR4RUlyNXZxelE5SndEZ3pNK2wvQlZ6MUplVDhocFQ1clJSalU1RDRvZ3cySXdiUlB2bE9pV3o3dDMrbEJEUXhrT2pIYlJqZVM1anp2OG1SQkp1Zjl5anBPR2d5UkxMa25mNCtrclBuRFB6QUNPKzJKSVlkUHZCVVZnY2lHajY0cUEwKy9PRENhZmRJUzlxM0JQNnFXNGU3RkdUMGtFZ0l2TTFrWWNFcTNETkRZdDFpYUVnZHlNUG9aeU1sb3o4cGZmejVXQWs3aHN5cE1iRkZod0IyQUlvUnIvaUtJSTBoVnJ2eWRhYXY3STNmRW8yTmV5ekNKRzFIZmI1T1g5VEUyb1FyN1c2NVR1TnBuNmdkVXZNU1BvaCtUNnFmKzY4Z2RMVXd1YkdtWVg2RWFncU96RmlYeEREMkNIMmJ0VWlUOERkdndwcTcxSHlmK2M3dkcvUUdzYyt4ZUNEY2owMDdWVjhTd2t6V0ZKdDdPcm1FVjJmTEVhdmppbXl2eEtjVC96YXM1Q2V0eVV3ZjdGL2ZDUEE3MS91UkhEYnh0SGljSXh6QUQvRmhkUGFNd3F2WHVvZXRDOUtrT1publAzT1lUalZTTmo4dGtodXpqcXJFTzJ0TlBnNlR3ZEdEaU1PZzBuWlN6Y1lMemFuWTl1VC9ncldsTzZ1MXh5ckJxWFBTZkR4akR2Q0d2amZhcG5lYW1KTlJjdVZqN0g1ejJoSUM3RG16dUw5OG9qSEEzeU45Y05hRXd5cUZPdUhhOWxYS3hJM2d1blRMdjM1NEJxcjZIblZYVisrMlJWb1M0UWdNWThtenhBdkNFai9hRWNtOUZBSzdNZjNTYmg3K1NpR0FhVDdPVFdiUG1uNCtLODltdktJN3RGK1RqbVEvTzNLM05mdjI2cmJBOThpSnI4WDlUQ25vM0VEb291allFTDNrc3JFYm41N1RabTd5T3dmbUpYUnV4akhuMmY2bE1tL3hKOHVmZU41VjBMQ3ZNZHhiNXZUUVZJUmdJSGNYbW0vZStaMjFHK3lWcDJtamJlY1ZtanJ5Um1zQnFjM05ZOGRvNWcwVU1DSERTY1dyZDRRa1ViQW9DRjRlL1lNMjJ1NUxKLzJhZnlJenMyOXhETVNBNGdkSVFQRFA3Y2l5YWU5bkVqOFJyVlRLQUVDcEtEdW9BbVBxZzNpWXhXai9PRVVRekZmNXA3aExoS2dLcVpTbmZUWjd5dTNnQ2JrMUVBclBQS2RqT096WnA0Y2xTYU9uSVBqbjEvOHNLV2lBS1pORVkyaUNhdlhmR3RETUFxd2NPMUJOenRTYU9wSWNYek1nTmhZRXdReUJSY3RiRE9GcS92SjlCUmk5a3dhUU9wamFjOUFGcUpnOTgxSDIwRGZXZGIyaCtnS2lZdVFKNmpKV0UyT1VVNmdnc0FRNTZMcVc3cFNFRXZZUEhhZTNXK2lyOGp1T1BkZEhlMWcydGx4WlB6MkRIUklTS1ZMZytlT05neHgzcklMNGdJbVhTanlHRXkrT0pRM2J4UFNzSVU5VFZPLzBpSWs4emtpZ1pJTW1DcjZwU05LMGJsYysydWNVMHkrVFZkSjRMVzJ5TCtJdDFBcHhlTnFOWGtFcnY4NGJFMFBEdTBxeXdMTVg3RVdHeko4M1pYWEczYUVRMk9nWW01ZCt0bTNJRHZKcmtYWlBJdndTOXE1aDhJVXZHZFpEYlZyTWFROURIK3gvR3FCWXdyWC9ha1dpOTV0Ym1QMXh4aE0zbEYyTkwvaG1YenlDanBqQ1cwbnB1Q0tUQ0E2U0MweTFIQU1rSnVWZGtXb3FXWGgvZmRvU2U3dmJWblFpUXZnV1h3RmkxL01jV0ZFU3FyVFNuUVRaRnZQZXo5S3FFeDB1VzF2ektiT3B3Vm1wRTFveG04RHBlQ0FCeHpnTzk3cmFUN1FmR3ZEamZHMlplSTMvYkt0eitIN2V0OUNhZ2ZJd0toc3UvMWNYSWpLbmNOSzYwb0pkSjROYS94bXJRV0VEMEtnU1Z3aU4zT0NubjdFV1JEWHMvSFVZSjhEMDBheTFBN1Y4VUZFZmlBY1N5Y2t0VHBmemRNQUNiWE5YeFpiWWtDbDlmZ21obmRVZ2FmdXhzVFp5RjV1cWlCVzNqVnlxb1VXbnZpR0ZSOG9uRGtmUUdua2JqWVYzRXQ0b2t0Rk9uK2JlcUttNXFKTGxjcG1ZK1BoSXk5cVBDWUt0dktxRXRpVG53RlZmNHJoNkErQjRBYldYaE1EMzhMMkdoRk5MSzFiVnRCZU9NMUhrTXBNdE5nV1d5RjhURWxka1FxZXZkblVHRWV5L0JxSVFsNWNNWmkyTFE3WGZXWU16M0NrdUpldDkwOWJCbVp0MTArRjZ6OGtOWG5jcXZBcDQvSS9pMkkyWDFBSC9YMG5yQnh0WkJ6aG9Gb1RnZHdKV1NRWi8xN2cvMTBIeU9JTmhvQUhOUzVIOFh0OUJYZmx3WDRqR3hYbUhtMDFEem5jcXFGeTJyNWcyNHQyajJZRHEzR3o3aDlxQVdKMWllNTRLcThaeHF3cnU4SFF6Z2VSWU51TXY2eUxxTnQvdGFPeE90NG9LMExrejZKRjBwbmF4R2JrUGFuVjlwQXdxbWE5b0ExVHBsUGtybW05VkwrYy9YRHF2cU5hUVZsUldtVnFwYnpreGhEeGlCbldiSmhENU4zSk54RldGR0JQcFhmRkpVVmo5SDdVUXlhc0tkS3M0THU4VmU3Tmt2NmxuVDBFWStwamJlY2VaOTlWa1NZKzhsZHRLdFRFYmxZazU3SlJhOFQwc2dmK0Z1YmEyZTJoWHFHQnJNaGllNy9hZzlzWmMwYUhveURxUDZwV0oyRmxuNkVnQkJ5VzdFQS9uei8zN09NZi9KWnRrQTRMdVViQ1BkaldRZ3ZjZ2l0cjJBY21NczcvYVA1L21rekx2WkJXTk0wcFR0UFh4d1dOclBMb1o1V0ttQUtYOFV3a0VQdVhkblNWTWwvT2NpM1hwVnhDN2dQbVhONFpHNEdBTkx5Y1o3aUcvVkJHd210OFdtOTFacVRaUC9zd3R3djNtK0FZak81UFRmMklsVmxwR2NiVHgvVnl6d3F6QUtJSUZneWJjeHdmR3A5MW85NmFMYmozSzlwN2tReDBJSEtoTyt1b3RHSzhwSnJDNzZQVjh2Vmh3eTRJaFpSYXZjMVZSZGM2UFF4Q2E3TllRMDMvKy9rQUJnYmQ2VXFEMnZzTlN5UDFvUWV6cXEzNFRsS1F3NlpmVFh2M0VqKzRCNmZRVlBSRDNydmFKVXlYVGtBME50bmVMSG0wbzlDbDlFR0JSZlVOTEgxWi9XMU9ZTjB4cnlINTNYNXphM0R6Z2NEdG9XNEdoUXJIVXU0SDZWL3haM29nQXJ5SnlmYmNtOFkyMzBXNmt4NldBejJwMUkzL0ZGVk14WllWYmNHUnpKZCtjV3c5TVNyVVJqMXZMZ2x6Y3JwaVFGV2ZSUWY2anBJRnFZem1jemkrblJldEI3UVVxSU51YXUwajg4K1F3bXN0NmpTUkUyZnJITlZGRWxubkRtai9mRDZBZmZnMGFzK2NQeGlzeU5GK3FzSW5MSkxhVldrSVBjUjFNRitieGdwdE9BdmJ0ckpMbitVbnhiTTZITS9Reno4VUtJN1BWKzdmMjlQWk1XL05HMk1DTzA2Ti9EWDBCbUp2alVOTFR6TmlUeWJKdHpCSm11TmRDcEdnYzBSVElmRkRlc2c5N1lWUjFkN1hXY0xLOWhjN0ZkcVI5dHVFZkJpb0hXY1JXTXVGVzlpd2UzL2JibHFlenZwZGx3K0FqeTRadStTZ2VrMEJpU1JzMnZ5R0FoYWhCZkdlYzdCK3ZaTVJzVVRaRnZHenlLTG9OaFdETkxmenNlWXF1R1hCbnJLeDhiSlpzMjFGanpVTDhqYm13MnNWSSs3YW9IYVZwK200WjhWaG5jYy94dnE3MGI2dXRIOXZyRmZ0N2F2ODNzZ3ZxMzI1ZnQ5TmI5dmJiZlY2ei8xdmRCMzI5blg4T2l6aHZxN29QMjljbDlYb0dYMWRnZS9WMUJmcTNUUERYY09taTlyRTkxVTVCaG9yRUN4ckRWWExnRlUyWDhFMkJrUGFSM2xrbFZMK2VNNnhna0tGZXRpV2poWEwxcW1kdHV2VHdSNlZXSmNacHRJK2ozakxWRytHTTZPSlc4SXZ3WUZIeFZsblJvQjVBbEF6Vjl2QktjdVY3THROZUJJajJSKzQ5bVJkTWNkT0d4Z3dGNlV1b3Z4TFIwQWtFcklYb2VXcVRFZDc5UTBIYWpnZzJmUVZlMXN1bTBuSFN6ZkJNa1hUQUd0K2R2eDlPSURodWQ4M2pIR2xsRklrQUt4NlBoTEoyYmt0R2JBdmZtVWtLc3pxVE5tMjNkSTgxVldOcEZBRmJ2c3RhbjZmbk9CTDJxanFpTXgwSjBONUJ1bW85aUs2SDEyT2ZhNHBBL3JhbTZRR3hnZUVNSkhrd24xdVpGeDJaUW50eS96aVZpaUxnVHdsMCtsdUN6QldtQnJmMnhZQXcrbStTN0gvaWUyK0JSVkhuQ3p4dUhvV1ZBUDkxMGRORnY3RmV6b0xML3dKWENMRGdWcFA2QnIwQldORGJIM2U4WHc3VVU5RzZaWmpHbzdwaDZDUGgxY3JmQUNnWXBmWlNoeVNkSTdSUzZScmpFSjdQVGxFTkNjVGE2aW01SGxZYjdYcS83QlBCcVNqQWFIaDMrdXB0YXFvVDFuajh4NkwzdW52OHhOUURmUzBTMTFibThaYjF1NTNMVko2WWNmU2xTWWRaL3JPbWZ1YXU0eHF1NEM4ZWZIaysvdk02YTZCYWJQd0dydjFMOWVhdnFhWWRjbndRcHMxT2NRUlpUazJrTENMQk9GeWtUWmlSV0pxa25qSHFGK0RxOG51aHZSaHdOa1NNSGNKSC9lMUp1aG1EZnBNMEZxVHBHc3dZMEVmRjFUR0RybEZ2aEhsK1AreHVwMHZqSUxnMno0Q3gxRGl6SU5WcTU5Tms2Nk5aM0R1V3ZmaFhrM1l2Q1czU0FKeFFTVUhOM1VwbzhuNmlRZ1dOWFpDRFFyd2FxMFVxWFdFT1NSRDVqNGoxL01SZ2ZtTFJvaFhxNlVyamJyM1hyWi9rMnZyZk5UY0sxU2VGR1pKaVhWZVlhcFVNdkorUXByNGFkcVg3Mm1ZcnE5d0NYT0lQTVRJb1RqK1phcUxwV2QxM0hZeStkclBxVE9xekYvNUU0VisvZldDSzgzQ3k0M2dxZXN0eUorNElqb2h1QWR0bUVObHN5dzNoSUhQQ1dHakVlRDZ5RG5sRkR6UVQzOFJlalRDWDN3UU9sbVVJUkNVbE4ya2JPSFBXV1hDTjhVeXJaM3FIUXFvRkhvTWZJY3lRajkvOFRreFhhL1FWV1RXMDRobXVMV1Erdzh4N2hnQXBHVkJYcXlUTG5QOEtYNGRYMVlVSXdObXYrT2U4QU5JMGFoWlowd2h1VTdlcy90K0xEdjJ1RXkzdzFQbVJxZkFaUy9yeXU1eWswd1o4ak1RWnhXNVcyZncxSTJqbkFSNFFEZUNGWW1zOVp5ZXVBakhVd3ROMFFHS1cvMDFMbGRjMFYzdmx4OEtFOERpbHdlQyt0bk8vbzJHemNHMWRVcGNYbWdtcVVXbTNIci9lblZtRUlibjR1OHhTSWdZa1NxL2V2M2dDSmhBVXpOeGZOQ1drV21BU0NJRFhldVhGMFhPK2JsR0w3UHNBaGg4c1FoU3VBNm15RGw2ZzdnNGFxRHlmWWdrTTdySkdqRk9LV1pCbDhYRTA4ZmlhcmRUUXlPZmdKamNaRzFoaGY3dVhQQVczT1ZuUmF2c0NyaWNMMUUyang0TTRHRzhoelZGR1JnVHRhNjg2RXFpMUMzMUFTNCswcWZtK1lKZ0s5YWVJeUpJNGR1emY1UFFmRW5nSlZsd0E0QlZSbnltWnZwOGVaWFRTUTl4eitOVDhkeVhVbGxsTXVYbWt6Z1FTVEhXeXpQTWFTNmI0NWtISTZjV2o3ZzZ3NlBMaFJPRTdqU0hTd1o3N2tnaHlUUUtJN2xxR3ZQMWpudlJWOEtwTEtFYUh3bmFQNlptZWFJQWZlSzFRQWkyU1hNSkV0R05ITmY3dDJSSGNlU2JZUUk2T0JDbnYvWmw0SWwraGNBMmhPQW5pSDBNVmdZREhqY0MxVzNlUGY5dnNJRC8wM1E2YWwzcmJxSFMwTUF6dzl1N00xOUtDbEFPanJtdlZQU1VoYXVKVUVVMFRldEpUTGFlaDZ0aVNzcVcvSXFiSll4Y25KZFk0V2ZYckxhYXh6SjgweEJsT3lGTXZJTFFEOTBSbXRIWEFoaVJxWXRxdElXZ3VHOGF0bHk0Z3RVYVMzemFhWVp6VmM5Q29USGwvUG5zRjFtMUFnUHBJTWQvVHhyam9kaVBXR3ZVUFkyMFlLbkFNakFtVW1zZHZld0IxTmVORk81bEJXRE9mQ3lYU0FOQkN6OTUycXk3a21KbGRKVVFrcEMvdjNHTVUzaHE4OHFETW1HWVdyUjlUUk53Q0FRd0pIQkp6V3E4THlDVFljM0RYUk51Z0JtZkUxbW9BMEt2MTdLOEYrZ2l1cHRSMlFtSGpnaHRFZjRkN1JXUnhCZHpYcHBTWGNza3VzbWV2OXc1OXl0MlR4akRXV1Q5ZG5PVlpJQWNRUkdwWjUybnJKNk16KzBJcW4rVnV0T1JlRU5IUVFJdmVyUENFeDNZa2puUjVLRFUwdEQxUExjUitncENhbE81R09GcXJqcUdNRmJGbTVEMFpIUlVNek8wYzRtdUtsbEtVOEhoYkl1TytkNThFQWlYT1FHQWQrNUYvSk42MGVUV3hvaDV5cVJ1eGk1NVlHVGc2cllQQzVKYjZiOEtZRlJwemJhcVY5LzVMYW5YUFBTRXR6V0F2dnB4bm9YdEs2TWdqeDRCWitYdXVNY2ZlMkp1K2lwU2g1Q3V5a0VYbWQ0WnJ2U0M0bGdIZ0hCZFkwZStxZFZUQnZKM01COFViVmFMS0xHamtIalVGZ21od1VWbWlZZW1ORkt3aXF3UnVCbVFJcDJoM0M0ZG9uOUJ1ZktteklyU2loMVNnTFlUTEZMUmd2Z0hNdkRyc2dvRU1SUTAyWjh6TzdteG45R0h6bm9GdWJUWkVHenVJVEZpL01qNWZ4MXEyeVU2VlZuVDAyaUZEZjRWdUVLbUc1M0RycDFFMnVKNVJYL2ZQbzdhUkdiKzdGbW1oT0VzTmc1RE1HVzJZZFNYK0VlS1BKTE1CRHRCaEZsRTZkZDRXTGpRWHNQSXU2Q05xemJ1L09hdmN6aDNBMUdoem9LL0tvN2Zlc2lwRFBjenpMRnNSdTUwbTJqVUlNZzY0MGJUTm9wWVJKblVXMXA2WG9RWkd0ckVJQjlyYk9BeVJxNXR1VVpYRC9iRkxkelAyMnBDRHBjMUFwN0grSWlpTTVFK2h5Q21nNCswUmVwa1FoV3Vsd1hRYTJVa1ljREtCNDNlTXpqcHZXQ2tERzFSUzFOZHZwUGRBcmRGS1pEbXdVam5YMExXMFY4R0RCUVdSRU1zMjFQOHduNDZaTHFiSVpUNVBaWDRscmo2ZXlHY0RZbHcrRGtWSzREZk1OTUdGSEtsQjRKSFZnUEVHNVcveTVBNUt4dGlldHl2MXRBaWU5cVpzVTFVZ0NrM0Q1dTNkbmhnd0JxdlhGQjQ0Qnc4YnR2K0hwS1hVMjA3MnAxRm16N2dQK0k4Wmw3SXBRZGZUM2g2UTkvaE0yUXdIZW5XeVdERk5EamNEcitUb2xmODVTOXdSc2lzWmVUS1pmakFlNTFzekhFbDhpOEF6WmJtZkh3Z3RyUVVyVmNvb2ZiODZTZkZtWERSMWxMeTZPV1JBck85bHErRTlKUVdURHNqZ0FZdnh2emVXTGlQRGdGVm5lNlg2SUp2VCtkMDBqYlJOaGpaTGVLcmJRTFZoa1M5SVJYUm8zTEYxOE1tV2JHZW9KOGJLa0c5SVNkOCtOd2lXUXJWR0JyVjlNNG9VVVdmTlFUaHE0Zm1xbU5mbWczS2hsdkhwSTdySUN2Mzk5VWJKSENMK2FMUUxSamlDOEZvZWsvcDRuZ0w3ZUZBRGtNV0gzbVgxbmhrcXlmWXZIelRacWZueElsbXNYS2dqSm4wRzVOUmNLQmRteW9taTlQaW5qM01XWHIxRkNYbkc4WWNYWWQ1aUlqK2pQSjZVVnNzUXkraG9ad2tVdFkwWCtzTnpoL1U5WGwzb3QyeVBZYVI4bUtUbDIzSmlTd1B0YVp5UnNoZnd5c1pXTGlXNWYwdkpZWjc1UWxpcGtFMHVTU2I5QmJ6Y0Q3T1B6Qi8zTDBaaW5CaFhnWnJEUFpPdmF4MjFOTG5wbytGd3p6WlZKVUh4dzRJN1kvSUZvNWg0MFVEVmp6djRSSCt2NmZvTDNTME5xYVc5SHNvc3E2MlkyTUlqV0w2dE56T3VuQWJpNkR0Q2R4V2daenBna2RFelFBQkFMeFB4T3VBazBVL0xKRGE5SjlDVW1MMU1IaWlQOGVjcmZ0SUs0TFJnTlR0b1pVQWpCK1BMeSthMmJ3eWQwWkQrNWJIYjVtRHNnajVMVE1CSFRHajkzczgrZFFNWS9nTU5Rc0dVb2ZYQnpXN3d3N05SdHRjNUJmUStlMzNqUmtIb3AvM0J5OUpJSks2VEl1MlVLbEFOcHIraTZQam9aQVdqRnk3UkxWOGQxQnR2V1JjNm16OUZuNXZELzAweGJrYm9LaGlHR2RnMm1JNXhJbWhEZHRucGZIdGZXWnQwKzd4Q3V1eURPNXBsdFM2MENvdnMrby9CTjJVWmlvQ250TWlmVmJMODlsZXBVaVgxdUgvTkVNZWwzdldWYlc2Y2krMEVqODl5Tjhrby8ySFk2ZzhFUTc3dVg5UnhwdWZmTlpjNDAwS09kVjBsaUgvUnVUbUNNTGlTZ09xL3l6VUxVM0xvUVZ1UmZJZ1hjL2x0elJHcDlhZ3JqMk14QVRJR2V3WXl5SXduVVFlWmtMVlZ2bGhZeU5KQWhNdUdwL1hMT2tycGFWSG1pVFBEYVdSd1ZOenFQOE16c2o0ZDl2OG8rUE1TUS9qSi9KWnRETVBqRGZmQlRMSlpFYXE4VHZJSDlxejJkbkxUU080ZmNVU3VISS9XNnNWVEpZUEhiV3Y1MlZzM2czSmJ1T3grcjlCRjBzNGpuTk8zMDgrLzFhL2NLejFwcFZkTHoyV2w5Njl5MkROS01GVHl1bGV6MWRmNXJFZFlOOSs0NkNBaGcvMkhrcTdaYzkvQ0NxaGNPUm43aVFwMk9zTUZWaCtBWWhTVU80TG14ckc3S2I1YkZZNGRyQVRQclNBQ3JmYURQK2d0dDVmRUZXV2dhRi9kNzNHemN3VDcxZHZkd3RvOWlrVlNCcjRwQlpWRy93YUNKZDQya3BOeVVoOFh0VncrYWZGNEwzb2tPT2pZQi9UL2Yvb1hIRmxKTTRsd2pUVk5ITUdmVHZaLytZQkd5M1d5VlFkWGZPZk1LODMvWXhoODdxVjNjMGNXVzV6d2d2aVZzYVh0Z2hNanQ2MGpzNXN6M3M1Wjlxb3Y4ekkvd0xxdDBNQnpIWUducmVEVUVXWHRGSGNCU09ZU1JJK1E3dUg0eUR4b3pDbW5kZ3hGQitlRkF5eHBsR1dVM1VMRTBKdGJ0ZGxZR3RxbWlSTHVQVEQrVHdRbzF3RE0xS2RIQmlXLzJyV05UenRVNE1CZnI4Rzl2SFE5MGR4aHhSbXErSjFnVGxwVmZoVEpXTHdHYU5FRCs5Wm1TY1FhZWRsVVdYSGgxbGIraUxmbFJReDBRbW1namZ2NWZ3Y1ZJVVA5UGlDd2NIejNYd1ZxZEZVT3I1K0xVaEFFWGgwKzVlTEJXNWJVK2VadWdQbGg2KytZNVlpZ0hzd0FpcGlJRDhuRXpDWkxzOHBOaTZkSWg3Q0JmQ3dEU0YwZTJIVHNIYTdaN2ZwM3krcVZMSUtoL2YwN0xTNE9VVzRRL1lvZlQwSVlodEFvQWU0b0x0Z1lpV1NUQy8xdVJDZXl4ejBCdlJKRG0wL2xJRnZScVVsR2d2QzBDd3JQWGl5QzdBbjFIMDZ6OU90MWhuUi9oQ0dYeEU4QnFCb0hnbWIyc1VtbmdWT2pBZ3Racks5VncrUDIzcVQwZ3VFclRwREdraEVDUXlhMGFJakdzOHZmL05PVzF0NUtSYWc4dm5TVHFJcWVBeHVNZFFDby9wQWhTZzNOenlJTXhQSHdIdFFJWHRPWHhqREkvck9hM25SWVFieTdObEhWcmtia2JZYzdGVUFnaFZmdTgycnlvNHV1OTdpUUI1VTFZaHdMRUlTTS9rb25vVzRNR3RyY1pTemRhU1U2dkszMFNmMktXM1ZaS3ZHMGsrd0FlZUNJNThSVG9VczRzNVhFMjZXRnltYzd4eU5DSGg4SVh5SEtOZStRNVozanYrUDFlZm1IM3ozTGZocHJoK096WXM2RjM2TTIxcjFJUHNQM01vRFBkWlFleVc2UmRLNnEvSkh6MkRUUTdBT09QaWxORjRVTmlEaHEvTUlaMFQ1RWZBTlBURHpVcmdoMGZMYncxclZLQlB0dzVOd3NJaHl4cC9jN0RMOUQzR1lnQW1YNkdmbXExWGtJcmxqb0dHV1BYTW53VGw2SGdjek56clhtR2lxQVRrWTRQRG9lTXFNeUJKME96VlNxc0VuL2VaQkpXRHNHaFNXOXA5SU1QUVdxNXZneEU5MkxjNENPUHp5aHMyV0N1TldLWk0yNmt4VFNYb2lOaWszYzVINVNnMkdHdlp0YmVpOHVBMnIrcjlLZWZDVWxXL0RUVHcvMi9iK1BtcVB0TFh1SHJZbWdxaEJTNmJraWEycnFNcVFTRXp1ekIwM3ZCMEs0VzY5QWFrRUhZdVBFdjhzSGtKZW04MFBrdzJUOHNCZGQzSWlOdlprbkwvd2JTUUdKek91QXNzZGI4TWRKRFBSVnhyMjVYVEx1TkNQbXIxbzJ4dFM5NnBWQUlhL21KZFhwdFRsbUZtYkRhVFlnVFRIU24ySUdDT0ZBd0d1YThrbVBoekpoOEZtMGQrVzVzc1hXdDhvNG16cVRiem5ubklWOElYd0YyNVlZMnFTVXV6VjA5Rm45UytZdFFUM21POWx6TVZVVXg4T1FhL25ub1pTNktGRjgranlQT0ZhRVlJd3lQL25JTk5hb2h2TThXM3lNSG05c3NjcDM2UzFPNWpSQ1NybjhpTUxHZEdmTnptY3N3R3lCeDZFRTF0Ym5zallDQ2oxSGg4bUd1ZnBDelJMNk43ak9EblQxUGhsTUhXUUVMQXVrZzZzRGNOMDk3ZU5WeEpjckVzb2pVK1NOMVkwY1djUXNYRUdrSWRNdlR6VGYxZGRiajBndG1rRGtwVlBXOUUzTDRDUGUrcEI2OEhmWktNNFI4dzZSMWNIdVpqSzVMUmZBbU1SZkh4RG9xbHFHM2w5eUxnTklMVlhwTE5LclZLaURLYzlLZTE3Q2ZyL09qcitmN0d6VmdJeVpTRnd5am1nQTA2dmlxK0ZCYXY5QXJNMnJtdWNjajRmQnZHazBieHJ5dW5OWndyd2ptRzVGQWJLdU15cEN2Uy9jeVYyci9MMXlKV1kxY3VFTzJYRGptaTFWVG5TM05IMDNDWVYyaDg0Y2Z3ZTF6UnpHK01CcjNLL3I0cjI4aWJtSUZOeGFXcXlaV0JsVDNVNEFFb3VJZG5PTFdUY2xKY2tCcDlWYWUrWXhic2NHbE9sZ2tRekxvQ3cwWnNhM2dHMmtNcWxONUNTT2ZWaGNRTjEzMGZ1QXhSMmhGek4vcXFyTHhMMXR5VExqN3UwRmFOendwYjdQOFdxM1RmRk1lZFJ2Q3JVL25iTTY0SVRBMXVKT0EwdUVBcURyQmM2VmJNOXVQZGxrckt6RzJDcTRERXRBNUhNR2hZcjdMNDlXV2Fvb1R1YTJEL1ZvL0xQK3l6cUZsVG02WXU4NEhKckNHSUEzVVVFMzc4bXFNYm91NVJMaExHQjJCMVNyZVI0STd6eFIxdm1lTEhkYmg5YkhMYWFsMjk2OFR5bGhsMDFEcnNaK3ZPYkNQUjJvK0NZdU45OEVyYmErdCtnN0pBdlhYVWl0bUFsb1BFRklWVTFmVVQ1S2J6MjNCRHlMUUlzZ0JXMzhhWDdKTXd1aW9raHZ5WnBBdEpUM1dyR1ZRR1B5Y1dwVnJubFM1aWNzVkk1ZThFcG55NEZsb2JBVS9jUG00aGEyQzFaNzJtd3hvbjU2d1Q0NnJHZk5EMjFWbTd2bkFFbllSY3hhTTVlNXVoZk5LdXltazhhRjFPalcyaDdqSUNXMlA1SjBWMFhhdVpnaWc4d1dqOVR0L1FXbUZ2RGpzU3RvZDhabzYxUVBzclFzRmtXYmRoOVViTnN5cEJWVGlwY1pqMnNLTnZnSzFLWnpUb3ZMaWFDUE9CL0R1c2EwR1UrRjA0ekZIQ1I1ZXk1cTBidjFIdjh3bmpxM0JSWnhjUVJybXZFTTlyMjl0Q3dxSUY3VUZ0QUlQVDJqMk1YZjRTTHBJc01jNG9vK2ZiM24vQitncFJxU1U2RkNGZ0hmWTJKMCszVlB4WDFZbXB2ZkhLL01aZk83RGNKNHVybHpEbHRaTUVkUU1KRkZweDM5R29EaSt1bHQ0eFZaYytrK1JVUWtCcDNqUW83eFNJUlhQWVFHRmJDNlVWVnpjb2MzRXBnZDhYaUpuYjR3NmplZmVZTEVyVi9mMFlCZVZURG1KNGFKNW5ZdVVNdFhSaGowN3F4K2RvWlhJNzVnSi9aUWx2UWtlS2F0ZFBvcXlOQzNXMm9kR0c4cUt4blIxbytEanlMU09yWVUvd0w1b0lQSS8yNkQ0WldjN2FLeVhSWFRSbUd4VThueXZzQUR2ZWlVWExzc0JqU0tGTHRRQlNOcW9WYmh4em5ScDBYRlJRRlNHTjZQRElwODZ0ZTBTcWphYm82YlJhUUJubUFLcGZleVYzOXR4V0Niam9QbVRDZUhyWUljZ0g0a1JrOVJ5SjVZZ29XWUt4Y0JYT0g4VFdLOTJFYkhYam1UckF2aEkrLzExQkVLRW1NSnlWMW9DQlBHQW1wUzVPN28xbWZod1dNUWxWOFFUMkNyTjQzVzBZU2VpTkxiSnZFVCtVUVZYc21SR3NlQnpqMkM0OFFyZFQrMGVGU1FXbERsTlR1bXZWRWhabUcyZHdMRjJjRkpWa3RDMk5UVWlrT0tIVWlIb3dBcEtTWjY5QlpUZmNramUyZm1oTm1xc0ZOeUM2cEJab3R5Z0pxYnUyVm5MNTU2MnhQRGY1bG1NZU9GbkY3Vk5SWWI0S1dFL0NteHVJYTJQYnE1QUIyQU1kbjNabFBXMHV3U2xLSUIzTXVZOE0rWXpPUUVRSTIyczZ1c2RIMDBubkpKVjJ0TFE5d21DazBTMVVlY1g1d0lUK3V2SldQL0VqUEdDVXZrWDMwUk9QOWgxU2pMRXRiSExxa1NCRmU4eWVUUmZTTEdnUDF4aVV0aGQ3cUxCMjgxU0FmdDRxOUhNRlBldTVTWEVtMkYrbVhnSmNrUUxUWGJkaWNpdnVPa3lBVVBaRjJYeTJJbzJzbVRBNnAzZGdES1dvTXN2VXMvY1hxa29CeHVISWhHZWpLZ1FaZnNPS0tHYXRqMVhoZ04wVXJkT293N0I5bXVsTFNzOUpiVk05TWxRK2lENXVlcE0yRGRINnRTb3BvZmFQOSt6TEEwOERGb25wTkMxazdzbmhBSy9HZURkUjl0aklaY010SEx1OU41NE5IdHFFSERxdmJqbHIydG52YU1XeHVXemt3Ukp6Vk5LQS9xbVdwWEhxd1ZueWtzbzBBdFdCRGMyYmkvdnNsRzZ0My9IT0w3VFdjbDU3T3o4VlBrd2hRRTNHOUVSTnlXSDl5TXBJQkdoWTJ6dktsczNhZEdyRHp0NU9pVWlxVk1yMXdRTnlQMFkvcVk3RmxWTUh2S0QzYk50elRyWWk4d01Qb1lUbUt4R0lNZGZUNzc3bHRFNDZyUWltaW1uSW5FS0w5OTNSaEowVjExY1l1RTl0M1pZb2tNQmRZU0QzczlxK01uS2VGR1N2WTNiczhtbjJ4eWdzdHVLWWc1ZTdhbnpOVUNKakN0RjdwZ2pzdXF5NTFGNWRXQ2VLUllaa1RSSHgzbS9xTkN0bW1iTmhaeW4yNHJXaW5OWVFWWm0vRHpsMEp5dlozVUhsMlBqUXljQjUzOGNsZTlQcHZ6Q2o0bXRaajVGZ2cwd2hTSXlOR003RkhxdXNJbWtlMFh2b3F2S1FVMHppMWNjVGhheEZ1MzBIVnR3Q0FhWXdzYmhhU1BUOU8yWmxUb1l1MDlsdFV3SE1NMm9hTEs4b2FMTXpXMzlrT0lPQ1Y1TU1venhrcEJ2ZVlScitBSDVmUEtNdG5JcEo1Z3crSWFqRzMvS0dDMWFnd24zc1Rlckx6OTQxWWVkSW9BNk5XRGhWdnpsRmtCbGR5UlhGNVc0bUtCTHVkNUs4U3ZCWkZhTGRyd3pmOWhrWFNFa0thOFdZbDRhYVIzZEVZNEFONG1LZElPMHh4NE9POTA3RTFpWGcyNFM4TzYwUEkrWk9PQTYxNDZGbG9YREVzd0tyTDdPMVZFQjM2TTFDSlVtdmVFUFNWUWJ5RWpwZkp4NVhYS09HR1pac0ZYZEpRMnZsVmxkc0tKV0FmaHpIeEJxeUNWRWYyQTBZNmFyd2NXVnZFZEZCblhTTTd3RE9PWE5LUVV1VStCN1RzZGV5VEh2bDZzMlJSNURvUFNQb2RMVDhZaFFvQUxKdldnWWZFOGd3b2JhdjJkcWN6bExrbTNVN0U0MkxyYVlHMXFUZDlOUU84K2NKa0k4bzVrSnRyUk9sWXNxcEJ5OWtLbXBGK3lyUlN6NFJGODBybmx1MURKd3JueTcvSUdjRFgrS3hySEdGMkthbXExbkt0ejBWcGVaNFVtWTk3RWtOWGtqaGI0OVBLQXJ4QjNHZGkyM2Q5Sy9zOXVibnB1L3BzdE41R3pGbkRKU0V0emhodldFVFRyRHY5eWc3enRxd3lHdm92Rzd0WXkrVnJURDJNVHgvQXFRNGEwUmZXdUJHczFSM1NvWm1ZcVNGblg5cnllRFRTdi9qNVROeDRLVXlnY2sreTBUVVNkVFZMOHQvc25KN0NvQTlORkJKa2tVdUZHdmtpY1AwQ0N2ZS9YaTQzNlhJTWcxV1JsKy9ZZG5yVW5TMi9CSzRmb1puYmRldGtHZm9YMHN6RFZoSHlIMXUxdGhkcW5FRDRQOFJGVk5FY3l1TzdmcHVDTStZbjdwUEVkVmI5SU9qZUM0TWN3RGJzUVJET2NmeGdjbkdwelZtcWRIc284UDUrbUlubkQzb2hRK3dFTmlCZUt4K1VlQ3c5Rld3MkxVTE9yU1FEN0ZGcW93blVNam9JZlNqT09kUkErRzZvdjVqM0NVNXFIRmVSQ3daWnNtVlVnMWJSMVIyUnoxTGkvSFNlYk44RTBSQ1ozaC9WZHh0RUQwb0VLMGZ6a1ROOHQzLzVMM3pQYU1KcXZJQlpEZStwZE11VjdLQm4zeXlFSkZHZ2tZTTl6eTdESVJ4LzYwSWR5UGsyWFNYR2FNMlFqS3Rla1R5UGlpTVM0SVV5LzZOQm9Md2lTM0FWOXE5eTl6NS8xWTFrSllEL3BGMHlES053SUFEcys1UFh2L0tEQXJpMFBOYWVIRjRmbnZlU0VJL1FZZ3N0OE81UVYzVkxmWVBBaUp1dEFlc0cxMTlIWTJlZ0RaTm5RU0NpcnprSkl4Uzd5SE9BNXdZR0F2eGpORHZuSEtKSHpPUDhhRVI3czhTTE0wSkNCcXJoWm9ZY2gzcnA4RC85eWc2MFdCY213M2tzZC9USHl1RHF5UlpKUEpzOG11djVoaXJyTTNZQjY3bVRJM1ZjWktDQitKQnBYYko5MHNpcFB6NHgveVpCUVRWWDlyQ01hSWdlYzczNW5zT0JnSFdHMlliZzNqRTNib1pHR1FtOWp0cnZJbzladTAxMFFyRDJQdkpPNmg2OGI4d3E5TXkwS2FKYTREUnRTNXZTUEJOQjBRZFZMN2JaQ2hXbFBiWUtzY0d4YjNUYUFjRGtoTzVsRzFXek80L2IwbmJZS1BPV2xXdkZQTlhmREhVRURqMHlNMlhJaXhYU25YZnBhb3JGYkNReXY0MVZKUm5CaUhrbUxmTG1MSGM3OU5wVFliRWNJOEd2dlFaRlJpdjcvTmtTa2hGTTUvakdQMzYrVUZpQ1N0NmVWVmpJVkd3alBkTXZRRndVOWc4SHJvRTZMZTl4VnAweGhKclpwemEvUC8ybFRqdFU3MDViNG1HL2NmSDNFWDVIamxaMkpTSC9lWW1Tak14V1BRR0w0cFRsK3N5YW5Yb3IwQlJUVUZZV1JnZ1BmaEhqQlpoSGNoQVBkMHVsWUlzdWtKdHFOL1JRc2VGUDRTN3BTKzAzUDNNY3k3Tm4yM3A2ZVhGRHIzbm50ejZTZzVDSzFRR1d4SjZXUThQYmswdXBLMEZRdDZzTUtEUEZneFVPcWxQZ2xiM2RSMjhzbmQ5ajVIdytKd2xDZkFmVFlwUlJtWDlxZUhEN3BEblA0cHJmTmVLQm1Xb1BEMzR4L2haTzZEa1JaMEpPemtRa2FKTGFVM2p1M0RPaVNvNWpTaU42SkZzRlNvejFzakhKN25GUVdsdngyemp5QUtFWTI4elJoOTE3bDlpUkErZ0RORlJDVC96b0hTMkdXUllOU2JYdlQzd0doZXFOSWVGZUlnTGVoQ05HL2lDZHdRNis5WHU1VTNicUpVTEFINklYcVVSYVFqWnRzYXAyS0JmY0V0YzM5Tml3NUtyakdpRlllME9GYi9wenlxZE9DdUNOTTFCS3V0OWUreDJFdHR5di9TZnFKOTl1NEZzL1dhaGhoWXZnR1U0MTBWMGxwd0pCaGE1SUFFT2lIMmkvMVYwOSsyQUVzVE15YlNaZEtEN09GcWpyMmQrWHNsemk0aU00U3pGbjFKQTlPc2YwRGhxamcycDVJem9HdTYwQzFQT09pQytmNVBZVDg0dCtWNVZvV0RWNzh2U3BLQnU1UmVaVVNHQmtLWGRqWW5pVUc4SHZYYk80OTRHY2ttOVVWSGk0Y3gzNHI3ZTg0UUhWWHg5VW14aTBKZ0dySjhDcXVQajYwWHJ6aGFDNHFQOFo5WWFGazNCblNjdTJHWE5wZFdmbTRaN0FBSFpEaTE5Y0s0T0srb01PaHBoejRmVkF4YlJWRjZEcUNKcTVjZUU3c2tqYkFORC9Vclg2V2YxeS94N2VWRHJFWnEydGhuOEI4VkdQS0ZIWkgyanJMN25va1hhYWRzeWtJMUNwb1JhL3pteW5rY0MreHVoYngwZjZGdjNIa1M1R2ord3VmUWQ1VUpEQlZDZ1I3eWR6WVlZVnY3MUpiWXlXdUVmNSs1Qm9CN1Rjbm9kL2Z6RG4rS2tBcGpHbkdjZ1liTjRNWURFRURkZXdtQTIvMHBoVE56cjZUWEh1aTdCaDFLUHhGcFFseG8vNTJ2QkxvRE44TFZsWENrTzN0NFkwcWc5T0R4L2k2YW5RcVdvOEZjWDhQeWpFOXV6amFleVI3TUI0bk04UmswMHlFMUt0dEovR0QzZWMvd29KeHkyRkZiSnc0TUF4cUdFSklPRzZTOGc2ZnlSVU15a3E2bGhUekZYY0FSUDhoZlp5eHVZWVpWR2NwQjFlRytXaGNhYllYK0FETk43anlJckhXV0o4ZXNBamxUOUFjZFJxRlFCbmgrYStoai9QQ3MxMDF0cTJUem41OHA5RXh0MHp6S25vV0RLMFhpZTMvZVpZYlNuVXNKWGwwdkZJUCtCdzJ3RUtkcVRHNndJTUU2ZDU5SWRWbUJxaStWVjlNOHgwTXRJZjVmMURzSGZYRFYrRmxROHJlaU5HVDR1T1FLcTJzS1BHUTJVY2hKekswMVpCdHQ5T1dCY3JmcEpaT1J5MVdRZFFGbE5leWMrbDA0TmlQVHpvYVVuYmp6OTRaVWhJcS9aUWNNeWNyNE1JRDU4eUVnRGNoMnVCNUcraVdoc2JKb3pCeVp1Mk5Na0ZaNGZWL25mTGtrVmwvWWNLUlBna2xiR3d6ekNTaFVRdEc5QUxFYTd4TFcvR0NtV0ZSK0J1cE8yQ0QycXpSU1NKb29HMkI5Vm5HU0J6d2swRDE3SFRuV2E3OW1wRlhGb0trZ1dqTmh0a0Jrbnl0eTU5V2ZBbEw2SlU3SzFBZFc0cDduMjZraVIyRFdFK2QxTytBaDRXOWs4QjZqT0VOWXR3eVoxbWhDaHNPT2pKSnhFMEJaYzRnY3JpSW1WZnNka3FsVm9sYzFLWEVXZFo2WDhBODBtRHJIZFZ4VkxTNEljaUFMRS96ejB4Y1IvakNFMEtWK1BJSFowYnZGSmlEbU9JZ1VTaWt1QXpkdnpKRGpiazhpNjRsb3kweWlINUFHYWJsbUVOTTZSSENEVFJqZFlCS0g2TmphOFREbWNyc0hQbXltYUx2d1VNdERhTEhMby8zMDdZTjRNRG1pSlhqWE1pSG9YaDB5NDJMSzNGUStkd1ZJS2hPcUFML2FDbU1zWFNXOTVMWHdIRXJYbWtwTk0zdm9ySy85QnZQZm0vWmp6T1ZOUUVNSmtPRXVSTmltSTlGNEhFZUtxVGMvT0M3b2VOS2l3ZTA5ZEwyc3JlTUtxSGMwRmNtbUEvbjJUL05nTUN6enhhaW9hbHRoWWdYZ203Q0FlYk43YllvN2tXTXo4WFg4TkZ0c0xES3Bjd0hwekk3TzhNZzFvcEJjYklQbzNhWkZBQkd4TVFITi9rcFVxTnY1WHYxcFdFS1ZtLzk4bGxpZlRTdFZ4MWFMSlFuN1lmM0ViQzljbmYyRHg2YkREb2xtN210V3JpZU0yNVBiVUhHNU5idDd0UkZJbnVKQVhWUVZHZlpmR1FmV3Nia3J0NnJ2UWhKOTZsTmVOMzQ2RTB0bkRuWGdWN1lneUZDc2h5VndOQzR1RnFWKzRUVVlWajcvMWtVamlNQndCTlB1NklWTGwvc282WDNMbkV4MGJnWWtNSW4rZE1YMnA5YTc1TEdTd0Y2cDJBQmMzbkUrOGZYb2Y4YWMydlFmOWRVOFhBMHNoT2J1aGhldmNIK3MrT2Y5eWVFQkxMaEduMVVtWXlxUXlBbGsyUEF4STdtWEdTSDFSM1BYS0VqbXRjVTJKRFM1ekFxRnBRZTlNemFtTnRSc2VRTkxJblZISnlFQUU4ak0zY010V3BzNWEydW9Ia1Z4a3BaUWVncDZvaFZjZ3ROWWxXTy9CaUszMUk1N3dta2N3U0xxbmk0QWJtWU0xREZqOWtsMDF1NWhBRWphdVZRNmhSNjlPSDJLRktxUVJFRXNlaWRzdmJhNjkrN0tyeEF6MFpPRzQ5ZW5zRVhZQ2xwRjlPSHBaNlRzUG1hejdPOVVPa0NYUXV0TEV1NUNUc21aYkNFWmRydnpTU0g3M29OQjdWa0xxcGcxMExuWGxzdis0WmlZUmZXNFc2MUJtQzRMbzU0N3dWQmF1bHoxaFB5ZjIwc1FuTkIveTdqZ1JWK0IzK09sd2U0QkV0VkZrNGtIalRUSm1zUlUxd3QyVHBBeDAvRU5Md3ZlSjF4bmZkSyt3eXF2c3BJUnp4V1RPd1hWNFRmQmtiU2J3K09PM0NPMFRXZStZM0ovdnJTTzF6TkFsZTBPdkRlNVZKUzIrUFdsRExYejIxNEVoSi93VU0vd0RqWFl5QkEzN1pES0pGWmVKYXFmTXJJclBiaUJyQ2RxQjltZ0lWR1FTb3M3bFhOWGRoKzNITURkMWxodW4xWGhrWWZkQVdRbnBMdnI3b2s4Z1loc2J3SE8wM2IxbkcxZXVzd1lqQWpCa2E3Zm9iQ0lRMy9VSXQ0ZkNuNkt3THpYbjJ1S3RSRGgyajlGSHpOeXFZMjhFa0dCbUxUc0JNVVRYREsrSFhNaG1UQjBodzFJRlc4SmlIV0FrUDZQM1o1Z2tMUkhvRFBqdTUrMDIvK1ArcDJRZ2tDUWFjc1o3SjlpYzZTaitkSVBNbFhjUDdYN1k5M0E1NWRvNndKOTFOSlpnZ1Z4alRFaldHdUpSdDgyaDZwMnlRY0cxSFpJa3d6aVRSU1lYMFpEbVNxcG1aeUpCeW1hbnQ0RTR3cnJCSUNBcVRpYUxSR2hNVnVmdmtBaEhRSmZadUtUTGtjbVV5NlJVYUVOZVRGQ2VsS0dHRTViRlpHT2IwSS9xTERoR0FNaVh2UGc1ZzR6UTZOTXhzaGExbFhnTHFpVGlRZCtIbVN6MENmb0JrWDAybGJoSzZxOTc3VmZ5QkxhN1ZCbFRyUk1xZVJocnlFZGNnQkZxNFFBZzdnWUpRNmdESTBnMERucHh2dmVSdXEwd3BwalpDTWw1d29PZk54QXV3SFBpMnlMNkxDeU9WZkZzTDhnVzJSZEdsdHdaR3E4Rzc0bTdWVExzNklySFhadjlWOG82USs4VHZIQXR1Z1lOdnhuT0NNbXRJSWNMTmZmNWdESHM5eHRsMHdkUTVvdTA5RzFicC9zMXBZak9YSGZ4WmVQemkyNDEwb3JwRnhaTGJsL2xuRGZoam10Qlg5UU82dWNWUkFoeWFWbGpRVU9jL2c1UjN0SGVTWGMrbVA4bDdaYTJyTUVuM1IxVS9UMHRkQ3RQYTlxWUJCUDZTTHY4SG1iYmlMR1ZNWUFia0xmcTllRVJNNWdYcWRXK0M2NkhxdnVreVJGdW5DQUg2TVpxY25mK1lwMWtON0xYSGx6QWppWk45cWN3K1AydkJlS3phc2hNRytyTGs1aGw4YUhKUmZoWDZ2ejhUVGNsK1VxK1l0WkNpZk9tRjA0YTl4VjNlRmY5b3AvbDJtbXRHWU5DWEdWSGd5MllNWWxjSi9QT2xkWWxwOXZNOVAraDhVR1hCelpwaFZhcTU4dURYWXNPWWFkRWtpcHF2ZWxxOUxZSnJ3dHJORGNHMjFidHVrL3pLNTNFV2IvV3Jrb0ZBYXJqbGxMZTBPdkhWM3Y2UWtQUGNsTEpPdXdZR01lQ2c1ckFzM1BjbzVQQzM2aHVuVG45MGVGOWhidnlKVE12dk1YYUFoL1E1d1poSE81clExdUdVell2Sk0zbHloTmRsQmsvZ2NNNitwT2RsVmpNZlgyTjVqaFNQZ2NqSDlJZTVJZjBpVUQzaHUzdHdveGdjemlWR2xrdGpTR2JFWERjTmNiK2x0SG1Sa1crY1lFQ3lOeXhIT0RQdHZTV2pBZG5laEtlMFRhZUpGbFFFREFJQ042WXBvQXNjcUZzN3RuOWM3elZTTDFuQXliQmpySkNHWDIxTFNIVDNsY1d3N2ZBRTVtdmg0dDJTTHdtWlZEbmhWK0cvSlQ0ZXZpL0RjL1hnb250eW84SUxaaFZvVThYeTVYZUJOVWRSMTVuZUMzdUd2cjQrbEluSFgxSkpzaytYdDJsdFNuZ1poS3U0Q2o4WkZpT1dJUUEvODVROFVQRnlQY0ZUUUcweFFXdGVZVzY3c1JXQ21UVm51dUxuVWZOa0NvMUc4OVBrRDZicVQ2N0QwOUU0VVVYMFZlZVBCVXVVRHBvMVFLZ1dRc3VidDZaSzVpNXhJdWNwVlZOS3hyOWpqMWJEcUNFZUVLUDIycmlIVjBPUXBNdVhJZFA4cDMrMkllUDl1NnNNNlBMaFlIL2VlS0tzZ010NzVqM2h3UllZWnA0dnh0ZDA1RDZXMVZwOHBtSFhVT25qQ3R2b240TVZEdUxUZmFRSVZVYkdaWHMyaDVuNmNNcmZyMU1yU0thVkFmU2VYNVhMb01idGY1ZStGayt3V1pEejcwOXpEL1RFemlENktSNTRjNldqcExFNmRucFlXS2NNTTlYNmtVSDFyUVRaWEc5UkhsRktndndxS0hQNmZhbWw4b1VjeTF1Y0JjRi85Zmt3ekdkTFRTWWZJUDl0UEJnci9TUW94SXlKOTRPYlhPMWhmVEVPMjFTdUdndmpKdVZ4SVRjNVI3SHpiU3Y0SklIeUQ3eXpBTjhTUU1pb1doL0xIVkl3VnRydWxOYis3S1lnYTF4MUhXRFJDQS84eksyZllXOFhRZkxBT29rUTBBS2xpWDZXL0ZkNXRJY0V4bFBKZk9wMnM5RWU3cTFXV2NnRlhNYmw3dkI2OEpiQlBNMjhwYm9paFB4S0hJTjI0NkRWTW11QWRKTHhpQ3I3WW1BVWtLdjZkbmRDRU5aSGs3UStKOWRvOWdrOFVzOWVWaFJQSk9NcytrNWVKeVNSS2dzY2FCRXp0TEI3NHNrZkVyeDBteFdWSlZGQ2hRemlnSjJPSzVIT2F6SE5DLzA3TkpYbDViYzRmMGpjdHBFakROUlVWdXd1YmtFQTM5ZDl0aGZLQ2hVZzF4MmNOdEdpWUFnRUZNcWJ4Yll0Z2ZxVElpOWlkQVJpR2ZpMTlZcWsyTmFyeGVObXdlSlFHaFFnU1IwZ3RqTEc5R0JBV3N6T2NaUWZtcFlkUHZZWGxXcm05aDR6TlQ0Z3ZXdEVMZ2RqUTlUK2dqSU8xRkRsYVNKaldERjVvdWFudm5HeU9JYUNLQkVGTmxLM2RwNEROU21Kb0Mrem1GTzI3RDNTWVdVQk1nRVNCZkRGS2xTSnFaRlVPWHVGSlFpaDdmRjl4Y0lZUmROcGNlSTBsUnpsSERhc3ZUMzdvZGJBTXNlaTJLZVVvVXNMZmhZY3FHZzR5SXNpRzBYVU55dThZTStZNkJWbTdadWtEdmhDb0pSSXd3ZXZEYUhpc2k4Q3FhYW54VTIxQWk2T09SWU52Qk5KYzNhOVJLSVgwOHRkSEEvSEdXdEg3aFJCTWtDNkY2dHBWZVc1ZTR1L0dDcHdaYmtVZkUzWmF1NzFuMUQ3L0VOMnVidkN2THJPZDA4S0RWTmJjSFlWTkw4MWFkaDZTbnpuMGYrbklreGNWRTUvTmtuYWZSUGxvdEwwUGtzL2c5Z08vRXFQTzA5YVZTd0UrYjJKN3RrMkFIZTRnRmVuVHY4aVhiaERKaWdub1FSODltdS85L1UrQ3NRZmZyMGsrMFhvWXBrK0JsWUVsU2Z3cWovQ0x0Q0d2cG0rY3l0L2JpcC9Wc1RoK1pEOFZGaU9CVE5TL0EwVGg5bzZ6aCtWd1pxQWRpM2FUdHZuNlRDMkhLWTNEeUlYNjlxeEp6NW9pMXlPZHdQUkgwTU1HYjlTMGRoZFJmNzBGTDN5d3lrTWhvY1U0Vi9vQ3lSZmsvMEpkTmxtTXdCWHc1T2Z0WjNLOGZabjFLR21ydlNockhxU3J0MngvUUdnQWw4Z2laQ2kwb0JyR05US1RITEZKUkhvWmpYY2tKdXlZTzhvQWhSbHhsWjlPOTlnNXZvRkhSQXVwT3RsY1hKWGI3dDByWDh1U1BSNHNEbmxXdnBwMGg3eEYrRDJROW14Um1HSTVCWW5EYWdEZ0g5MURtcnZnaXNPOTlPUFBBRitHZksrMnQxNFpHQ0dDYlRmQ3pDbVF2UU1Pa3BLaEliZVViWDNlTjlSR2IrcDNvYlBlTnJkQy9WSUVTd2lNUXB2OTlZSXpxdEhqTTZPM1Avc1BZUERNVWx1eHNPV2U5cXlXb1ErZHlQTzFFU1BYSW5QTi9xUDZuMG5TSDhBNmllVGJacGJFVWxvUnJ2ZDhsNHljU3hhYS9nN1BPVkwrTUFGU2RxcG5PdnB3Mmx6ZXZjU0VhbFJQWW11ekpIYkpCUnBNK1ZncWZkb3V2SzhxanVFVEI1MlpLY05pT3N1T2NuelBvU3hvMlFCRDVka3Jmb005WDBFbGlzWnF1MEg2V25sWnRqaEtVVlJRYXdLVEQrWlZ5L0RpSTV3ZjhNUnBSTGl5cGF1b1ViNStVSWg5THMyQW44YWh2M3VWdXoyVEhiamNpTTJCYVpoZzRyRFVIL244MGtIYVRqU3l0RXl4UHVHMkJXOHBGdW1uVCtuMFpqQmtEMjR6RjA1Umd2WDRCV0VqRTluQ3c2V0lGdXBxVWNSb2x6WEt0QnFNNHBDVnRDaDVkc3JZS2FZQ2h1R1hmNG5TUlA4ZDIvMWIwRm44QkIxMmZXWUl0Qm0vWTN2d1FaV3ZOS2hEb2dEeHlwbUxobVZ5SGgwdWZmb3ZkR2ErSHVYM2o1dy95NU5xMTFhbmVMcFUvTFJZcVNmVXo2NlczOGNOSEtVUFVzWW5vSUZ3SjdDQk9YeXdCNmoyYVVCVG9qUWVCK3VvSlA5NVNlakFhV011dUhWaFhNMjNxNmJWOXY4ZUsyay9MYU5QekpoM0FEa3JwS1ErVEhDRFo0akt5cm9HcEMwQVV0T0tXR1hjZVFaTy9jdG00TnRyK3B4b2NieGxVTENFOGhSdkNta2xRK2pWSUhyemNNYkVHSkQ0TlFsTGlqZERjVDB5ejNOc2NRMnkxWStacTJIbjI3RXJYTjQ3NVhjUkgva0l1MkpJcEpNOU1JQ3Fzc3BqZTE2V0ZONkc0dWswOFpoWUQrRHlaVXhmbktZUDZkVG91OFlsMTF3ZmptSm44MUJWeUQ4eXNWWTRkNHhVWjJ6TGozU3Jpb1ErTmh6Q0RyTkkxOUNyZVREYmZhOXRhRzRWZUVtcFp0ZWNwdnFnN21MRGV5WjNHdVNsdzR5dkNMTDEydXZzY21BV3h0S2lGMS9oaXh1WnVWeWJ2WXhZWUUzYy9QblZUczBma2p4dHpjRW00R0s5MVFaR3dxc1loT1FNbjVMUDJJbk9mbEtTdkVPR1dlVmdHVlYvQ3pITWRCaitZMjU0Qm1SYURuSWRhTmpCT2Q5cGg5UCtxV0hDTXo4L2Zvbk0wc3JpWGtRTS9jaGo1bnNPMDRScUVTSDg5MjFJZllzYXQxRlpIc3dwbVY4d2lqZ3dUYWI4U2FPOGVUUGtNaUsySVlmbXk0YkFmWTdzYnlQTE9KMWE3T1dmY0MrazhUdGszenpSRVd3a0psSmgva0xIL3hBbVB0Rk5WekdzVzdpMUFla1VUK2wrTFpjM2FiYTBUQmZsb0xDSVZpbVE2bjM0VWNkdGpBWFhhSWpPKzJtUExWd2Erc2RMOUJ1TE5NcUlNZFJjQXJQbFVBaTlwSytYZnIrYnM1WjFwWkpFdkdONXdjSVk0QlpNYzU4Ty9wVzBPVkc5UVhOb2pMR0ExUmVMZlN0WUlzOThpTCtBWlEwZ0Q5Yi9KbDhmMTIzbS9Nem9tbitxSjUxMTUzd3Z1anRQNzBEeFJmY3FObHBhWmdQQlVobjQxc0RpclFNSEYvOVZzZXUzQU9NWFRxQmpadVE2NzZFZmZydnBsNHIwelYva1dkSmdqOG1RSFpUNUN6amhaY24vREdKQ2t4YjRrQVFxVGRReGlTWnNGQ0tjaU5kdmxMbVVXbjlWQ0xscW1DMGZjb2ZVckhJWTE4bXBId2h3NkNUR2tjY3VPVEowVDBMRVNaMnFFSTEybnNRVVBHRGJuNmlKSTNqaCt4YnZ2aEZVZDNWY2l0b2NmTU5JT21ZdHAvQmNWVHBzM25HaFR1ZTZ0V0VReldOc0NBVkY0YitZN2dkc2R3TDdNNzM0T0dWTTZ1N1JlRTdXc3ZuM3NESkIxUU9XLzJ3ZWNjT2l2WDAyQi9mSmhkTThGS1RNV0I2TkJTbEJaN1RQekREcVZEUnFxT2VxUnZ4VWQ1NkRPQXJIM2lsWjFuLzJDYzV4eUJoWGJuTGNYREtnaSs0V2R4YmZ2ZWREYjVQaWlJMENmVU5VL0c2cFk2UC9Cc2N4VTVxelRsdGRsTDVpUWlJQ0JpTU90dlVVWksrSmg5MHBsa2lDNExLMldVbjA0TTRKZW93R1JCYWw4ZnRPVTROaVlObkpJRVlXbjJOQlhLRnhYMHplaUxHcnFsc0RBVlJQMFRZR2dENi9WR1FkU0pRSVRvUyt1bURLT3ZCNmRhaDFWSGR3blE1V2tralE3eER4YUJCV0EwcEU2bTNwQzdaTjlsaE53NVloRDd5blRWUEMxTVFlQTFXaHdXd2FJRXNHYW56TSt5bi9ZWDg1ME1YL1YxdTBFQ3l0MERQMTMrUm9iOXZZRnQwTytqUFNkaUVML0d5dGQ5Tnd3b05Tc0xJTDMvQnBnaHFwc29JaFl2RCtqckJwdnpHY2YrNGVTZTB2dWU5d3QwbEJLb3ZwSjFFOGRMc2czVUtWM0VrTENCVDVGZVlvQWNiRmlFYjFaSXdyTkxick5jT1NiaGQ1Nlk5NkJucFlpeFppb3BaSy9QOENKclNqNS9XbXE3TEttVENnODRWZTVEeHRXYlQwV1BZV1NmVVpZQ0MvTnBtZDMyNmJWUWo2bG1TRXNhZDdpQ3g2bk0vRjlqQ2VUeE8zTWtoWXRLWVpUeUtPVGZUNnVpNXhCRC9Pb1JHMkwrZ2JUVis5bVErRDErYjNSejNGTVA0S3JIamhrWENTVmRxdVZKUGNtSFRJaTA5R0RaL1kyem9TSWNJMUdlSTBiTkZNcUxNeGZOMXRESGZmT3RjdDN2TjlwT2V4L3pGNU0zLzk5WkRmMHhLNUxlSDdNQUlVWTVGK2g4U1htTjNib0RYL1h0bGI1MVlMSXY4bHh0WVdwaTVhYk1vZE9PTmdlcno3N1pvc2RkOUc2a3kwYktqbGdmUXVTRWlyb0M3NFVwNXF4ZVFjcGY0eURtRUY0ME51azIwUk1lWHMwOGtYUEJ2bWJ3cTRJTUhmb2czMFoyS0hLTklsUkdyVzVUdldCd3J4czdhYnBBdkpmbUY5T3k3cjdBYzlIemhZZHBBNkM0WlNGWmNGNWdoUTZEdDlrSGFaRmFvNUZhbk01Q1l6U1FjN3Azd1A4YUlvUzhGeUw0dXoxU1hxM0wwM2RONUZsakt1dnkwdVJHMjRVWENyYkVoZzBNc2plU3JZQ1VJeGtpM29LV25ZNU1XMW1mQjE1SWRFMTk3TExBbStyb3VHT2dYWHVJdkxWR1RrYm1XVXdSaXpYajNuZ2ZVeUxrakJyZVp5RUZrVXZEV2lMeWxlRzNhalg3ZFBla2hsZDhZOWxOeFpuTDN2RGx2blA0QWhhYXdIWFNvS0Q2MWNBdHptL0I3a21Rb1N4VVRhb1ZPeklDcndjdUxDMFNHcklMeFp4aVFSUE9uck5NQnN2NFl6djNTaEhEcWJXVVU2NWF4eGp5NEloYmtZb1lQOVNjUVJDL0ZicmNPSEhqaXBtSHhzU044RWNHbHdPeDRLcm9WQUVGK0lJRTladkRjeVFTeUkzVjNUaG0vUFRQcUFaTGNkbyt1cWc3bHlpZkRjampWU0ZaclMwVTFqdDZJd0FUSzB3eGhpZTdlQThTc3lEdWQzNzlVRFk0a0pjMU9lcjJVdkpuNk5lUGUxTmNZdFlYVzYvZ0ZhT3BhNUlCYVhLSGZZaDFZN0pJOFhQbDZXbFlhbnpTWHJPN3RTNUVtQWNNVDVUQkxkZmgwVjlzeFdONkt2QzNtUnV3UTBpSytDZER5ajQzWVFzbE01ZUZobDFXdTFjcGxteXhRVDh5c2JrNVl0NEV3SjU2d3FOQzR6V0loSDI5eGJYaFgvQThsRVdlNWh6MWxmVVNMZUQwa1NqbnFiTHUrSUR1Ujk2Z0plUWhPRytLUDgzdnI5MVBJM3lIWWN1TTZjaTVoaU1yQzR2KzF1elJKYndjdVR6eTJpQ0lkbGJseFhPTkVuY0drcnpiOTNhSjJsUWRaRTd1L1VVdjg2cTIvaHpGSzdYbndYeTVSUDkrTzgxZ1kyWUlqYmlMekd0aEU5aE5oUWloQm9DemhRTXNjMzJETXpXcHNjNW9tYVp4MENZUkhkVlV6V1k1STF1M0lQUjU3dVlJZ0RocDYvdDR5WGJyTDQxWEQxUkJyQ0xHMkM2VmM1endmQnExdEpyL01rMHM3enRLNGtpKzg5TnB3dXg3ZDNtMHBTK3BEY2x5dUV3czBZYitJQUY4Z2VjNk1pdTdGQlpTZUhzdmxIaFZQZ2ZkUFhiRVdYNHYzeVl5dE9JQlpEVE1CK1JSK09IeEVQbkpnMk5CV0U5Mk9XVENEeWhNbkw2L3F0WG1pWUNHU0kvZjNoZEwrNy9hcmxCdG9NblM2VWJOVXQ0ZXN5dEw0RWViY3Z6NnJveWd4M2J6S3A4dWs0VEIvYmM3ODNja21SeE5lR2czakNLVFoyR293WFNGNFFvWE96MGNpdjJYc3FrN3czcEp4VVBZZE5PME9BZGsxQXNqZW5zYWs0eDVXeFZ0VEFiYWRCWEtFWTVGNGxTV1g0a2tSZE5WLzNqNVI4aDlLUUlKS2EzU0hlUDhrbmlVdzBWUkk0blh2bXNyQkY0dWJjd2NkSU9hSXFlM1RJNkluajZqa1RzbHJIS0NJT2NTd01pTm1sV21XMFF3dmkwRXdZZS9kc1R1WE0rLzlwUGxMeXF4aXU2cVZqajdNUVJPS2JuY3pQVEZZWmF4aW1pelR2UTZQUjdwWjRWVHJOZXhQckVIcTRUV3ZHODZBak1vRE1vUVlVVkswNDFJMGk5WkhNM0pHZmpwODlqeFIzcW1abEkzb2pBZkNTc0d1WnI3WnZXd1kzQ00xcXpmaDlhTktFWElSMWRGSDlpNGpmMzdtc2dNUmJkbGI5OWErVzFLaTZ3RGxsT3RIRWt3dXU1Y2lBOVFIRkNpckMzTWduck4yRVorajZQKzRvaXNaTUgrQ00rTEY1ZytENjJxVXNmcEZTVVMrN0ZsbnFYMW5Bczd0SUZCZG1WYkxJTmwzb0tvZG00RE9jUDREek1ES3p1dU5qVDdrUDhKMkNUOEk0Mk1TVDdpQ243TnlyL211byt3Qk9pMG1VZmlFQ2d2RG1RQzVuOHA5Mk43bVJPY2gyWWJCMkEwckJ1djVmS2EycnpsbGtIQlQ3YXVxRWxQRjJPL1pwMFlNRXpzc1J3Z042YXU0VTU0SExnQnRYVDlqakhJYWxiaHZBbUZXNC9QaXh6ekVyQzR3eVJoU1VPTmJPTlEzUWN4Z2tyTWRaZDFuZ2lROExLQ3ZSUndNelNOd2N2L2I2YnNuc05MLytBOFpnSE1QbWJmdjNTUlZxL0Rmd3YvVFB1RUJqL1NhRVNWeGZNVVNJL1FhWWYvVGlBajBidFlLVGRZZG5NRFhMOVIzRk1RSjlFdnBWS2N0Q1BJWVY5YmJtbWRpckNOazhKS2VhV09UeFg3N1h5UXNXck55SGxYb3NRbUpvUVBPUXZvMEo1Z2VyTSs3QlRTZ24xU0NDOUdKZzdwNHloSUthMXV4RXZxOE1mQXBUbUhaNTlheXdrQ2lLeURYQ0JHeDJGZGdScGZ0ZkJSNG1NMy9ySXZ6anF0OWkwWmJKM3ozOXd0dEZ3Y1dpNnVoN2FZamZ6Wk9BVW1vZ3NNTGJOK1B6Y1hDVE1PUFNBcjU2ZDVobE9WcDhKc3IrUnc3WCtpL0lhNWV6bGZITkZjdytOdnRFTlFheVZPUitjbXhoUWNQbEFJUG5VRk9aZDN0UlljWkpCcWQ1SWF3NXBSQlI3bUZHdDIzVWNoeXlLOXRTc3paRExmWWUxQjExMitwQTdVWkMzYkcwM21Ma1c1Q0JER3JJWnZmeCtTZWgrVDgrcXZSQko0anVLanNTTDlPZE1TMFF2NkpUb01wSE1wVDV0QmpYMnBMc0ZiVU5WL3IxaXRSSmxMc2FWR3VKbHM1cDk4bE5hTjNMaERyeVVvTTMzQ2dEVVk5VVp1SG1QSHMzMTJ0ZElVVSt3R29ocmZXdEh3Qm1LaGgwaHJ1YXNFOGFrNkc4ZTRRMHpWM0xOYzBhSjgxdk1hRkU0cEwyeDJ5U1lNNHFBUWdFdUpyOE40NjZpRVdCcDZHYjFSckZQOGFRSWZwUUVIWUc4Vk5pRWpuOS9MMTg4TFpQODNEYzBkOFcrTUJsMmFIdkMrZTNMMm82eHdIU1ltM3QwZ0JzMWppSWJBN3JMUDVteHpSWktxZmt3MnlYMHZUVnBXT1Z5Zk5Tc0JaeU5aRStyTlMrTXpjVVpVQTlEOTNsOS9lU0R1VzNEc0J6b2laL0oreDZiTTFmR2FOcFYrSFZXdzR5WkJwdEhuZ2tLOXRVZGRxTk11NjFiWVB3cHM3cWtFMUZ2S0dGR3EvUFZVT2oxbGs3dzMvMi9BNVB5aENOMElKUGN5Z0FuVkNMZlZMd0NWUTk2RSs4SHI1Tmc5N1ZKaEdhTkhsVDRuZzZYQ2ZhaDRRTUJtNUgwWmpNQm5kMEdLL0M4WDlyNlVoaHpzUXFVS2pkVUpDb0t1L0cyOW1mNEJvSUowWFpCU2hucDdrR3FFSWRvaE9DalNETGJDc3VFSVlYZmxuK096dllhVTc4bldjV0krbHRxYW1uaWJxUHRUdHJzWjhTUFB2TThYV2hIcmdQQUxybTliQlRXN2Qvb0swbFI4K3Rnb1MvRHBzUTNHd3N1Y1l3Z0Q3ck5HY1RlUGpRczEranM0UHdadzFCTTJCUmlSbndlWThHYzdvV21NbWUyaENqRHlLVU8zelRDZjgrd1ZjUjloK2JyZzNudTIzaUxmWDduVGZjS2RrUDlvU0lWaU4xL2Jva2tyaVBoWktWS2dsQXpySEM1cXB1K05nb3dKdFkzTDRNazkwMExtU3ZCL0U2NXBOcGZ2a3VpTjZXTXk5MkxPMHVqcXVWalZJTEZxZjhpUU5ZUUZ5dC9UQk80eVZndGZtVkE5Tks3M2JJRHdkOU9GYXdHcGl0bmxSMWg4NjVpWW83NFk0bEZIU1RwM00xTWRFUFdkK3ZkUExIaXh0TVE0bDZQUWZaUXorMFdXU3MvT1FhVjU0UHk4dDNsdjRXMzQ3cjFocklsQ0FQWG4vRXJBc3VLRUNUR0JvS2tldjZnTk11dkh3WjI1aDNCcXdRc0hwUnROV2g2MzVPZW9uNWJUOGxuVHBxS2pBOE94Y2oyb1Q2NEpMdk1vTWJWQXo5d2dRV3kyU2UzYnFTcXhKVmFpWU1sbmVPYnhGeEhRaFRwbTJwY0xjMHJ0d3BKVHF1YncvUVJ1OW1XMGRMNjIyajk5enVxcFQ4aW5CRDZhTzFlQUtIb014ZzhhSkx0OFNuei9oNUxpYzJDeW1oTnZTL2NQSUdhWWhqK2xEcGJUSHl2RzFhTFZ5Z3RPMGRmSVMrSVh5bXJHbmhLMWU5bngrZHpRNG44T1RKeXlueGJiTi9DZkhaRklxZjlpbUJ6OFhuME96YjkxSU9TNVN6K0xjVGwxS0g5ZzFyY2xVWlR2djdtUE5rbm1zaGwrY0E5dWhwb0J2dFdMNUJmbVBqVFF6L1ZzZkZMSXlmdEEvYWlQemo0N2htU1JjWVlyb1BXQnlPTUZoK2crbXM4UEN0S2V4elBMTW80QTV5RUlpVjdEcEo0M2hWM0YwMVVabHRURjkyVEpoallPTHB6ZUxiWTRkVG1OanZoQzh0OVk1ZmFYWUZVeWJRVnZsVjhoNmVpR2dpUG5nazRSWVV2QkRreXVLdzZqU2ZnQTVPb01pS1FIaTI1QlNreUp6QlJEQ05FekE4OUxkVUNmQ01uT3gwemRaMEJ6L1hQSVZVR2orekYwZ1lKVklIdHZvS3p6dDhGU1BTMjJLaFdreHVmdm5vQzFzMndoK3RXak1hU2dpUmtOcWhveWlqNC9weCtTSkF3K3h6NVlQQjNjQ29XWU9CODVDb1NrcE9nUmZrRGgwREw5Rng3U09BanZJOUFSb0x5WEtWZUZJVEF2d3VOMTd0cVc3NjZZa2JxbUU0d2ZkOW9CTlJGaERYUEtyeG5Zb0ZUbWhWR1RvS05QOTRnaTBqNTlhNk1xRFBSYmpaVm00aDdDN24vcEk1T3l1MlN3bWZxdzMwS0xtb0o2U1EweVA3WHlhT0F1WEg5c3JLMThObDYrNkZvT2RZbU5ldkZNbFFJL1I3bW1ra0tBTDMzZUhRa3N0NWZaNzg4VU43SzI0UE5WeS8wYmNUNlFMOGNGWXNMdmJuTklmR2c4blVmVnlhcVFRbXJoNHQ0VGJxZ3RyOUk2VXdwZDZ0cE5UY0hpRHY4RmZEOWpzNzlTLzVQY3pmRDlUZitmMDAzeWRkdURmSjlTUytUMmUvbitrbGZKNnZQOC9xRi9QNkhlQkh2MjllL1d2Nzl2bnYxeC81Kzl2NSt5UXQxK3N2N1hXQVVEY3QzRGt6QWlnQzkza0JTUmlVN0hjeUswamRqOW8raGRUNUZ0UFkveVRRbFZ3dGZPcmgxTzBOcGVVQjR2RzVXcmdWSTdva2tuRStmMjdQM1RsZXAxYjBZMG1LeEZGQjdySTh4WXhVdGFtQkkyL3V5Y3hKZGljUnRob0VjSjYrRmtQMWltZ1EycUxuZUN6UDVMNkVXZUZ3RjRYeit4c3VBT3JmRjVZcUZRcVBFWlFobkpuZ2xqQUhwKy82UnBJS2g2MjlsdGhnRkpnMWdYVkhKZko1MUhsQXNMRnFpY0Z2VDB6L2ZEVHhiYzg5V2IvVkRJUFFFb2ZySTFESCtYYUdrZzkrKzBma1Q4S1lRUllTdDROaDlxMStqa2pZOGlhbzZldHRqK2Y2a2FJMHdPRUJpU3lxaVdYVURGdnpkcG8xUDBFeGVnZkhSaVpMMnpGUzhvY29uK280L3dqMFJ3RmVxTEprb3BtR3d3Sjhua0hWblZ3TTZFRC9idEhmcnRSZjBuWHB2OW9UZWoxTlpCRjY0amJ6aXF0VjlNNW52SXZrc0FuOVV1ZzJDaFN6a01uWE1zZ3VQZER0bDVCay91eG1sbVZjbllMa0ZYOGE1M0RFMmRtdkk2K05zUUloOE1BU3RpU05kNGI0VGRrZ25MdlFaakkrZ3IzQ2p2UGxVQ1ZCTlhaRDlmUXRVZmZ5ZFh2ek5sQWl1dURLNWc2QmxLR0VYS1E4MXltOHh1YkVJRm1DY2RiVDVKWmxWMWtySWFhRWNGb0wyL2pVckVrVEtJV2dMbnVEY1I3SWNzWWpiWGlOYnRLYnVUcC9Pc1NCR3ZMTDJTVFZNa3V5aTQ1OUt0MDlEOXdGQkRpMEFMRmRFWG1PMVVIVGRiRUhnV3pyNExHVUpXQkZZN1dEaHgybVREYUxSaEZoRkozTVJGditpT1hFWHg3dG1VNlFpRjVnODFTb2dkQlhOTnhZdlUrbTdReDFDeXlWRUZJQkxMY2h2ZHlVU1licnZMTTEyd3cvMHN3cGVGL21yY3F3RFh3ejFNS3BrU1NlMHRJVUhPd0lhc3R1b20zcUlydnZkenhTR1JkV05ONUxiNXZSTFMwSFVjOXhja05jOEhrSDZxMGpTcHMyOXg3Ylhub01ZSXdNeGFQVEswUGtSUkhwVFRjMFN0UGxVTjhiOXVQK0JMaWpnRGphV2xQSnFiR3hFazJDTmhSSEo3N25EeFo1cVpTQmJoZE9qa1pwTXRZRkcyWGMrZDA0NGZZSXd2VUcvRnAvS1VsQnkxSEZrWnlWbksyeHE0dVM5STBsVlNjR1g3OFAxbExYa1F6d0FpbHY5a0xlSFJjbFBCNDBnYWU1NVZnTm9JR09qTEo5SXdIN2I3emQ3MmpXK0tod2lEakNRVFN3bEdvSExtdnRzNEVoWjYwaDhEUXE5ZXZzeHRGclVrMXpLdFMySDA5OGVrVzJqTExJenRoM2dZU0JKa29hd2JYSndpRnpnL3ZJWlVybmN6bjl6RmN3dlEwS2JVVW9qMk1pN2JhSktJOVJiZitGSURNZTlrekFPelI1SzVkMEJxRVFyeGpTSkJwM0dYZk9YQVVhdWgxRTZBc1ZPOHdZdkhNRUpOeUNIaWRHK1FTL2FLQ0toRjlsNW9iV2I4YkF5QTRYK1NMSklmcG9GQ1RlbDBZc0E0N1FvUXZLcTVKUzQzdk9WVndIaUhQOStMSmlSNW9GQzFNQ3FzTWpVWUp2Y1l1Ti9PdERtaFZ6c01FN2JmNTBGNU9jR3hmQUt4T0RCUnA3cUJSNFduSnU2bFc2NWtJOG85Tm1pc1N3RXphYWJQUW1zVlVzTGhZUWk1YkdxdmlwMjhmY0JVOGRtVG1BQUNaaCtnL2IyMlFCK2dRYjRxMzJYNGJ2OWVFait6MDZmSW9sSVlJM2k2eDRUOWpmTHhidUMvaXhNc1E5eCt0WDAzOTFwMVVxWC9tZVZadVNWZHNSOEdSMXIrcTh4dENYcWJBbzd3RzZNSmliMTdWVHBOMmgweThBUFNoNnRISWhOWjFvSHB0elVhMXdJb3U4RzRnUDRETkpTVStOL3kzaEc1bGpNWEdtOTVxKzF1cTVQRnRRRlBEQUpHNklVb21TM1ZYV1EveTJydzQ3cFNNZjVxOHBibHcrNTNZOVA1MjE2OVlMNGpoYjRXUmN6Q2o3T0E4MGVpUkFQZTFIUnU0YUlsRnYyaHdJWGNIcit4RW5WdVd0U3pXM0ZiM1RXSWcvc2FIaEhLcWtmaEpObForWm04VmE5MUpFdlhQQVBpMlpvVjdPc2VZTGRTT1hPRlJSL3BqNm9RUnF3ZWhBdno5REdoNUxCbnNwVkEvWkNmYXJkQkttOStIYmpEamJ3akhVYVZpRW56V2RwLzloOC9PVGJab3VSTFVaa1JMVTV3MGZwUnM0anM0WTNPZTEzR3hPM2dhSFNYZ1pQZllER3VUL1hmZ1RKclp5bWYxWWVKZzdVeDdFR3VGRmt4RFhiYW1vUFREd1Rmc1NPaWZ5U2lDcVNmZmpza0dBQjBDMnhqeTh5M05ZamdEK1dPSXJTRjBlakdCV3RZKy9mOHFqcHV3WnRlb2VtaG91OWtmU0QvVGdWMzNnNnVjamRGT294MGNMc1lqbDFJQitJZmlsYVgwaGFYNTJGb0d4SnZpR2tEcEtHWUxSQlVlYVNqOWxDSGpXTmZXRUdvTEhXMC9mVzVvTTR2aXh4YjAwczRVMTZ6cmpJZDhoM3dWNXZ3R0MxMFQ1UTVONTU1V2xVdHZVMWNLM210NXorTCt2OXROMko2YXpBRzlBQUJzNUpveVFjWWJwM01KVDhDcVRxV3JzOTlpS0hwZmQwR25hUm1qTEFBWWF5eXVCeXpKWjNDck9ZSG1HN0tIWXhvQ0tCRHZ1dGlvM0hMVzdTTWcyZ1loeTdaTERLSXpONVVwak1jbGROUExBSW1NOEtkcFlRR1ZKdkROd1E0Y3dGTkJ4SDluS0d2aXp4WjRMNy9ON3dNbjF3TllPV2NaQ3dGZlBONkhGWW9QYUxNd05vOG81UVhJdFZ2TWtIRkwxNmh4TU9yZGhLSXQ3VFhGYVhoNFdjajhPeUxobllTcnQvUUJ5RXZQRFc1R3M4QzhwMUlDUmtBSzdVU0twUFgyeERzWTczWlVWY3ZQVTBadDM1QVNmS3Y5TWpiYlZsOUZ2aWFTMCtnWEY1MG5pMVVpWXpwejY1WXhWUkRGUndJTGdkVmRjMTNlSVhQdGo3UzNOOFEyekJmMTZoQ1d5eHRYYVZLRXg5eUJWUEdvVVVZSkc5RVlKcWpmVlE5alltcUsvMkNWaUhkSXgyOXh2WEEweXh0aVg4NjZmUEFPNldxdVZneHlFcEIwTXFwMVFHZVkyK25WaTcxazFjZUs4WWpNcmVCSEVXdXhtM2xDOUU1cUowUWVFL2NVdGFjMkw2RUZSem5QZ3VreXQrK1BRc1RJdVVudUpZSGVPbVZ6YnFTY1IvTGMySjZKYkpNOXJmcjFJMVVFVzJVbzcyMzRueFNnNVRVTFNqYS9od2RNZW4xcjNOVWE1Q3IrZWtxSVRCS0ZoZDg0bFZQTjlnVm1uREtoYkVFQ2N6YXRJSWtqdmRmTCs3TzM4UDM3aGZ4TUNOeGcvSC9JajNHVHUrcy9yZ2F2eUtSRU1XNVRnaGlvNW5xNjlkWGZNTEorc3dUUnZSMkdpM1p2amh4V0VqSE5jR3BWeW8wdlh3Sy9iT3E0cVhzOW8rR0lrT0lLT2FKZjQxWXRzMTQ5SDZmU0JsWGZmSDFjOG9mRTJCZW92VmRyVnhZdlhHMFM1U2xmc3djK0FNMWNteXBnQVRPNWhiSWpkREl6czhRK0dJc29CRFpIZ1pwc2QyV2xGSVRKWjRCNXB5dEJIWEFieG4raFQ1TE9hSnk0M0ltU2RLWldvZU5ObUJGRmdqR2JWL0Z2UEpuV3ZWVDdreUtxYmZyd3lzaVVVbTFLRyt5cWJXeEl0K2cxWGVEaWRaOTdCdzhjNmhjSkFudHQxYnJnVkxSbnEyekhpWXM2QlJ5VWlybDFuWWhPZStHbVduUlhHbERGQlFzWlhzSllyT0w2c0NWdDNRbmJSbHhsSkFFRWlSbFRNWHVWUkg2cXJ6ZnQ5R3c5ZWFLd2lXRkF3dDR2U1E4Y2RRbUh6azhFY3dPMHl6NnlQckMrSlc3dkhOSkxqZU5pb3llNjcwMEJjMThDR1B4MGNvQWRXWFMreEo0Z05WamhlanNtQWNGR3FlMnZwRmVOcGZWUlRDVG5FUTlLMisyZ042bG1IUENmWWpOSHM0bHJkMHA5WkxwMHFFTTY4VmlNY1dvVC9TejJkVFQyNU9iSGViNVpqNW9MZWRVakdOWkI1QzlpM2FMVVlOZXNFMFdFenhYUWRUaU95REVsdjU2TnV6ZXVYcUJhV0V4YXpSQUx0c01NWU0wRTZMWWwxMjA3dG5HM1VOTDZIekQzdUR2RE1ncnExM1ZBSG1OWXlTVDZSdEo2dURYMm9mMmlvR0JMUHBrK3J5a21iY3pCVHpoSHpzeklpMVg2Q2dvWTVlOFFtMVdaWVJpOEdNcTIzQU50U2V4WGk2bXhGSUNnbk8zLzBwZHFkMlFXa3hFNHdoeVR4RUtuQ2h2OXRvRkFWT2xyY0o2NTBHWmZrSm1mVGtJSnpnQzFFcXZueFNiMnNRUXFvR0MrSGsrRk9vZEhnU2pCQ0JXS0hHeUc0NzZJdlE1M2xBVStJS0REaEUzaXdFNkNGUCtyQ2pVbU91cEh5eW40WTJmREJtMmV4dW1CVkJoUmlNMy9RQ1dqTkU4YjFoMFBYckRnczJCNFg3Qno4ODVuVTFpUlhXVURKZ0RtdjB6QTN0YTRsSUcyQlQ0cEp6M1o4K0lOYXdiNmpzYURjVFZLN3FZRlFLeDduZmd2MEFOQUY0d1BsYnltZGVXWENsRkNkRnM5ajlEOGVkdTJyYUVBc2RuckxZaUZOWnBqWVJEVWFhUFhndXRsQXFrUkZOa1lYbzd3bCs1dFRRQ1ZON0EwT08xZzBBa3o2WjV0M1BUcHNGVHFQUUJJNFNENm90OUdCdGRRdmdyZlNVNmdvSEFaMG90R1Nmbk9sYWlUVTA5dzY5WHlBUzI1bmxuTDN6SElib3hyZWFVcEIvR0EyeDJsVEJVRThzb0tNZVlMc085cFRCVzhPL1BBbUFYV2VZd2hOSWxabitRbWhaY2w5M1dLTHZWMEtkb1M2UHJBeE9JT2VjUzFVQlgzK25zWEYwVHZuOTFpSzVjSk1udno2UGFJVUFLbitiazJ6TC91TW1ibnRNOFpGNGFweXlnWHBPY1ZhUEltVjZkK2ZzQ2lvZzd2eUppU0JwODduNzFRcTVuMFhseWtnSlBqSFZXYTRUeHBnRWovbUs3TFFJZm1ORnQ1a2JMOTYvWG1TYTIzOHFNSkYrR3BwSHdlYmJBd3lNZGJHVUptZStKQWlUNGZ2cWw1L0NlSjZTVXIycG5ZWE9EMmxIYjJCcUVvbVhCQUVHZ2tuK3hOVEs1eXE0KzRTWUw4cndLditDS1FjMlRHbXN1aHVzRWlpaThKRlg3akFJVy9wTmtreDNqZlVNdUpDNTQ4L25tSjN1NmxkbnhDN0xML05sZVJhSDBFV3NTcHZtWGdNcWtUa2xIbUxYamYrQ2VKMTlOZDhqUnp3V2srcWQ0cDNZak1BazV6ZG9HNkUxMFBzTmMvUDNrYUV5UVdCSzNYekFvRXdQME5ia0wvWTJHUHMzSko3WFcxYmdtdlhnbnExR3crMEIwTDlWWnJWUFhWZDk1UElTb2d5Ull3b2ZRcmNLeHdyZzdLaUZhbjUzRDhQMDZ1emg1a01RSUlkNWdYRnRPWFh0cWJ0Y3p6WUxLSXJSbE1qdW9sUEhnOS9ac1AwdkNBcVdNMGo0bS9TUFpXRW9jNzM4YUE2UlZDZTVRL29QcWtKZ0dJRE9IVllhT2FZV3IwSFlJWEZPdmI3NC96M3ZuVm5TNWJIY0QwRWx6Z0JYL0hmcTg0TmZmWkdtd1ByMGk5b1d3T3E0MCthd2RvZjNFckFoQzFaUFI3bVlYdFM0S2IrRWYyajkvRG1iZGlidTdwVjNTaEkvaDdHQWlRMXp0M3l2cDVVS25tM1lJalRkUHJIMDVoRExRSjl3RER1WmlGWWRQOXFBOGthT1RUeisxWERNZHR5RDJkTWVCTkFYZk0vSWJyV05wUExKaXFDZVZaa3MzYmQweDk3Rlp3eTd1SFRTY241UlRKeGtLaEpsbkVGTC9oUFNHRWtUZU0xVUhnWU56VGpjcXVWRmtLcmZMS1JwMEpERTc4ODJjL1MwWERDSmo3SWR3SkJGWk1uc0JudW9EOHdobi96M25qaXJaUGxuYXBpTmFSWWpOa25xSFNLdFJQOVU5Z0gyLzhjNVptUjI3eXkvWW11c3FuMGpMbVgxOUdsTkJSTHlLOG9BWkRlejRiNEhrbStGSE05b0R5UTFqTExKOFgwd2xoZEVaQnZQQ09ab2RxK29jWExEelpQR0dxUzl3VnJzcEo4NjBPcHM4aUJaOXZyTnJkeUg0ZEpZUUdNeVplaFkrdzFIQVM2c2xWZUd2QWFDQWwrZ2xqWjV2Sk81WEpsMnZoQ0h0UjNoMHdhWisySmJCTVJJakQzdUZ6eVhzRmg3S29PNGZiN2MxK2tKbVZkRFcvNTRPclhvQlJLZFRVY2piSm1JYnFyRHBvSm85aGFxQnRuWVZscWRrQkxhd2FoU3EwSGlNZEhtWkc3RDI1OW9FTUdxWjJhQlRoQkVRTEJCdDBROFk1c2hWaTZtMjdDYkk4V3h1eWhVMVVYVkFBSVkxMHFMSFJEYXZUNWJpdDdPVzNtVTBSQXZEN1FvL2EzNWVKV0NOV1VPR0ZxV2U2OEZ3eWkwRlUvMDEwRzkxdHh2QUtYTCtmMTc2RFNvV25IQnRQVmNYZ0N2ZnNLY2ZENFVaQ0tmYi9CT0lzYjlIRU5pZTNhMGwyZWIvMWxNL2JaeG15SXp1eHJLUklwK1ZmWTF6enY1OHFBNG5hdWtUSjEraG5kS2YwRkMzNDNVa3FmR0pBblExQ0Q2TmxSaVIwSGFzNjBMNzhMVmNZMDcyRXM3S09zT1lvbTlRL1NOblBEeU5hVzl5Z1BJbzhIQWNrL0hicjJtdXVycGJlTE9Sc0NwSmIvWDhoNkJsdWdPODdVY3AveUFmd2FieFFaRUtYbERuK2J5VnFXNWQ3MWpoWlpnSWRCRldrd1RlWjd2T2dJblVUZ3lGS1NKZ0IrdjRUQlpjZlBmVTYxNXVmektHQmMwOFBGa1psZTh4UDBOU1MvWFBIa0g3cm5iY0pNNXp1UTRvSjhHbDBoa2Q3ODZPZ2RTSEhmZ0tnQzE5WGFsV0RrOWhwUkc3M0xsSHdNUXJzcDNXZUo0bjV2TExCZ3dQajQ4TFdPdHVPRFUrY0d4ZUFhcG1QRlgzREFGUVQyam5taWY3eFVSRmZuUSt5akZoc3RmL1VTeTIySjlzcEhKRklZSFB5Tm5NaURyV3gvcWFvMDFDaWdFL01ORXVVY2loMUh0TU9UK0IxWVN4UjBWNnBDdDB1bG1VanZtMnpQYllHNWlNa3N5dzVVZHQyZjN0a1hVVStoczNHbG9GNDJHSTJvSXZ2aEZjNWdHVkNsMkJtSW1Cb2ZEZzlCZCt6QVE2b2J5ZnlOVldZQnRQNlJjajBjQzgzQ2VlaEoyMkRZdmIyWTFiQ2R3cXh0Y3VQSXVMR0NXdXozT24xZnZwQW9hZ0V1Nm5abDkwd2g2S3Z2bEhhUHdIMmxPSk1RaGF3cGN6cXFJUnRobkVkdC95OGxYRTVwVThWZkE3aGJqY3dudTNPNVlZSEpqNWFmS09wRnJ2d2NCNVNHSzk2ZXNkL1pMNG5lTnlUSHhkUGFBWHRBTkw5L0lKSmFVZjlsMW9KK1YrampoWERObE1PbCtOaFQ2QkVLRkRMWnM1MFRYcEJCN0Qwajl3bFhkRDdlcmVWdDlTYk5GK2MxdlFGMXBCbWg5Nzl6YXl2NmZZajVIM1NZbk9FcGNqQ2cwS3JRMTlSRVBKdjV6Nml3ajZpUVp2VUJNSWlIREJyV2lhaWRmeTJ4R0xrVmppZTc0cmZDVHFrVFBndkY1eFh2L2tuT0pCNTlSNjRCcE9UTHpJcUFlM1c3SmNVRjlkNWdVUjlTZHNsQUozcmRYUVdIQTJIS1NwK0xjay9sM3Y1SUJ4bHVoenRuSVhjLzdFaGp1elp4RHh2TEpBVVU5WUtNVEFLcHBNaVdWZFhEWnhCbkxKK294dCt6bC9HR0ZDS1NQbjZuSDVML1dzQ2d4RmhvTzY4YkJJRXlzOVI4Z2pOeDR2Tmk3S2lVaHc5cHphakQvVGxqcGVHa0g2NWs2eW9YbFhYRG9xcDdUaUFJSnpTKzFUc0R5ZEpINk5WbkJvYUpreWV6Wm9YQkhPT2hSSUZCcW5tdFJ6R1hlZjdmL2NFRDFES3gwUnhUbHE4YlA4cEgvMW5lclV1ZWd4SVYyRyt3Y0dvOXhjU0R6MGE3VXhKamxoaW9NTVVVR3JXb2RORXRKTThsbXpEcmIzS1F2OWdRUXpMVzdKcTRZU0IzRXE4emxNNWMxVk9yaEVuOGJ5ZTNzQ084eERSalNIYWVPeWFvMThoVFA4YUN0ZGVQVmNsaTdacEM0NUxLa3pubGUvQU1jbmpGdW1KRXRFTHUzZk5vRTZyRXB5aXp2TVBsOW1PUTNtNDQyVG13ZWtVbGplS1M1UGNUazYrMWpzb3lCWHNNVUp0YUZjTmttWmhPMDNwU1FiSDUyYTNnQUt6ZFBLQzNpN0tpYkRsTGZITllkaXM1R0VxcWFzRGlleENDUFRLZFh5Q2hmeFptbkI0dkZvalB3bGJmNzYrYnJleFpDcTlFTXdJMXB6YmJRclhRbWQ3cG9JQXBWejZ2cVhEQVEvcjhlQ3FsNVBBTkxZdGpUMHBsSi83Y3pZeG4zT3J1S2s1OEJGbGN4cVVtdElTM0RQbHdxWWNpVDVTU25uTU5KMXMvTUlHeGRESlFwZjlWV2RGNGFzQWV3Qzh3WkNDYzBMTUVRZVQ2a0FybEl2dWZ6R0tOdnBpbFNEWERZemhyQ3JCT25USVJpY2dzT0dtV2Z3SXVCczNNWGFRSGdaZEdsWWJBTWJNKzVSK20vZjB3cUNQQW93UklINU1LZFBVV1FQeWgwNUtKVWFXM3lmMzc1WkJ1Uy9QdFlHS2hSd29mb1ZpTFkzaVF5WnpiRWlhaytnZ0JLdUF3aHExVjhKU3NvSWZWL1I1MjdVdGtwSFNGQUp6eU91emtqalNEcUFPOXRLVE0xbVhCSEd0cWdPZEp2eElnTUJYQ2pXUXFDeVZOMjZvTnNod0QzN3I5SVhCL24vNnJQajVNMFNHY2dmeitQbmNSOWwzUjU3RFBnam5nZXBBK05EK0dHMCtHMTFGWlRzMXdPbWFScHA2SzZ2b2U2cXdMcmV4WTJQUEQ4WjFZRDdmd3l4K3NxcWxaUmJ0N2tuZitnMnhhQzdRblRCNzFSOVBoUFl1NS9COFFqQjZBR1VYMjdUQ0FIZGp2MWljQXJDR1A0RVF2SUJqNEJqN25pamMyWmpxcW02bXBVNlJaU1hCRHRYTFV2MWQ5bSs1SXVWTFB5RHdYS0w1UmYyY0hlc2JmS1o5T0V0TG1xa2NoOFIrRWZ3K0E1TVF1VlRMMkRNM2ZoU2ZiRkE5NXYzWXlScXAzZlBnK25UTmFwWFJ3YVdLOXR6c3Z5bUUyakFRangwcDVLYllJOWhHVDNUUHBNb3U3aWpWRXpOUXFrQlQrOFdKcGZjZHljVlY4QjZFRDFGZ0M5WUpMUjZnT2FueEtUY1V5MlRjUUJlMjBqamYvaE1jN3ZBWE1mR3VEaWNZR3MwZGlQT0lBWkJvWjQxMWZkTUhsUm5vYVE3bW83UmlsejM1Q3N0aDhOckUvMW4yWDBtelU0Zk9wR3JtYWkyZkJEQ0txcTQ3a1NiY0pTc3ZwS1hSdFdTb0FwdC8xd2dPclRvYmwzN1ozdHRTdFYxbXVBMTRwMFYza0xScWRVbzduSnhqYmN6RUoxSzdGMDZUbkhhRzkxTCtaR2tzZ2pvSXJGbm5BUVQwZDlXd0dTRUlmdmswOFBoSzdMU2x6L21VYlpkS29JUWdnUXdGVkp6NURBTmtjaWxoYXZBam1xSUliZkw2RWhOTzlkR1ZoVWZVa3hXU1AyVEZmeHhsckN6d3NJQ1k4ZC95clRDREFPVWwyejRTUmppWTFwaGU1UzYvdmFlVi9GN3d0MDlLcndJZ2kxZ0RkZ0RHdXpaQ0VHWFl4VHp0WnZzaDBPbFYvT3RiZGFvRklpVUNlL01rTEt5ZDFmSS9PNVRQaEU1dXFLcjJaK1RjMURRSjN4bUpBOU4xdXdoOVBnMXlGUnAwME5pd1EvSmVFMVRJdUxFVUdKdW1FeW9FN3I0MEozd3ZmSXVwYWtXemZhZFE1cXRqdlhvNGZyMm4yT05HSkdqdGVlSE5ITEdrbEM4ZXFCZk82MUVRRFBnMzNLMkZIVi9rNTRpSDY3Y0NhcnRIL05jd0x6SDJ5T3ZhWVZCa0RldHhQK0VmaEUrRTJIZ0hKVURocXgyOTAzU0R6SWdkbEx5cXRYaWx5cjlVZVRhS2RWOHdob2c2ZXgxY3YveW9MZnFjbGd0OWhvUFZHMmh2R0dnYW9iVnRjSWU1dGFkYXZ2L2RZN0I1UXlZKzROb3Z5eTlhOWg4T205TGcrN1c2ME1RRTl1MUFKajdEVE5xQUx3VlJaRkNjZWxpc1V0UXcybWJPc2hlZmZrNkY3SWVaZmdrV3pPUldMUk5ZMWRnSGRaNEtTR1RIbFV4RGpZNFIwaTZSdWtERm9ieHdKcllEMUs0bHBsRnFXMmRmdHFTSU9TVHdkUi9ISndCek9SUGtxMzZTV1N3MDJsMDcrQUdQcDRxMFo4aW9GVUxqRUlMRmhWOStFZTl1RW5iSUZRdmFIU2dNT3V4NEZLeW1XdU9aWXpOOUIyUDdNbml1Z3pDNURQZE5rQnB2cEVqR0hMcXNyTTROME4wemRRMTdNS1dEUjd2aWh4WXNzWTFJZ3dLTmQ0R2ZVN3d3S1doMk5od2V6S2hLbFA1dkwrSkZnMFpFa0hNMG13OEJPRENJTC9hUWZJOEU2K2ZyNU9ZKzFORm9QNXFDZ2tuNmthUXRCY1JsU2lFM2dNc2NpNmMxdkJQZkE5akUrSVFJemg2M1lGdUoxNENkVkNTNHRZUEozekdkOFFOcHRhQXAybXB3Sy9LekUxQWdUZXE1QVNLVFNsaThtL0N1VFZ4dlBxTEpiTUFwTWc4dk5mb0NsTGl2ekdCV3hVQkJmOXd1b0VJTldNMTdTcFdhbzhKUjhPOTZyNi9uMUtzdmQ5T3UzMVNqYTRRbFRvUU8yZUhnMFloRzVNaWVYUzNVeFowNGU5eFdUWVMvOEZQdzZDRlg0N2Z5d1VSWXdybExJdjltWFN4L09JWElNUFd4bXk0cFR0K3hOREk2YnpjdWd4VGRXMlZNOXNjdit6b3ljTWtzdDQ3Yk15WjRXQjQ4MWFSQ01jSUhqdnRPSnFrWi9DODdMNWtLR1VtcktqcmZtbldHU3hNWFdWdVZ3WTN4bWZyL0podmZZNjQzMm13NldpNGtJYms0dllWRkZRUk5lclBrNngvelNGSWRQcm9TYnZIbEtrR2FSL3hjQlNKQVd2NlJkRTZubmJ4WEdOb3FnbjM2dXZXeXlDQ1kzb3FKc0dDY3daOTNmU3JlaXdLZ3MzcjRPMUNmUTBuR0RYQmNXcmpFdmZjQ2szcDRSbXBzTTBuZ3l5b2l5dnBMcW5ZTHpQcjNxUDNPTTc0RXVTNGI5ZEJFdDdxWkd4dm9uTU0xcURacm9PVDJ2ZkJvclI4ejBYRm9hWXg2c0M4Yjd5czJ6Q0JiZUQyaXFHM0JOdUFlUERjemVWcTVYRjNKT3JqZk9RME1ENlpSeDlFMVlYRUIzbkNGNTBORmtzSTY0c0xhUWJWT2dCajY2NFBiVkdQNVpIRkdvZkJBU2ZVMHlYRXY3emJHV2dFdFAzWnRxVkFXYWtOWHV1NDBxUVZrbHZRN2JwQjBUK0RpRkRrSGI0NmU1K0d4NFUzQUd2OGdBQzk3MVZwV1RRcHJBM084WURsSVRIL3J1ZlBUMlhnMjNqQ2QxbnJIdzdzb3BGU1FsSHQ0U2syK2hqK3ZFbzFwOGNMa0xVbFpURlh3TGN1MlhYZ3d2SGUzaHM4STh2OUxZUC9xV0xlenZydlBaeDZmM3dDbTYwYnlSME9MOWFWcGg0czhSWFFHQzZONjVQMFIzNlBLU3VHYjUvcEgzWUh3QlFkUytaQmNZcXVZNFZZWlNsbVNnblFDNkxLdklXckZVNWp5M01kL0lXVlZEeVRXU0Y4WC9Ucy9ZUWxTeHNucXlyS3JlNXdJQXJOWnEzeVhCbld4eSs4dEIyZTc2cUltbHJOanQxeWl0TGREQkR6akIxMW9oRElKUG9lZHhJa2E2S3drYWNWRW51ZVBJSmNmNEpoYWIzMTJISTRkNXNMMkxUOWhDNFFiY3FBQ0c3K0dsVGZZNURUM2hjM1RvVU0rUGNZdlpyNElVbVNUWHBhc1VPenJpNFJlZ3ZFZGxPMVQxK29wd014Z2hSZk03dHVqL1ZCd0I4OFN4dlgrUFVCSjhMb2tHZDFqaFE4NzhmYS9aWTZISVB5QnpIRzVCaWxZam9mUEFvTmxzRTJIVFhpWG5GU1F1dG1CQ1RpQXNvdU8yb1NMbnNnM1M4ZHBmM3VVNmlaUjN2Q3o3cjlvdWliaXlEL0lUL0ZGOFVFV2lURU9FaS96eDFZR1V1b1ZtSmtNdi9iK2dXS0JGRkljbG1IUGQvSWh6UDlrdzk0am5DT2c4NkdxNWxnV0xTQUZzU0k2UG9qa0tIN050djh5QnVEOG1Hay9OamZZZGJEd05tWlNNWTVCYWZ1Y2pneUFKdzUyb1FNVnV5UVBwSlVSaXNPa0RpT1FWRmZydjlGSGd0aWxzV2tvbWF5dHJpMmx5cDV0blBhZStDV3JaSHQrbE5Zd0NCTE03Q1ZYcFFoeGw0WVJvL3JpM1k4V2wyVTIzbHJoelVQVzMrQ1BLa2R4WlR4MUdldmhSckFYajJjTG11RkNydElTeWI3MEMrTzN1Q0UzVzY4Mk8xTFdSYlNIQzJHWmpZSkY4aGgrTmQ0MldndVhXSDNKSDEvNmI3RFY5dFpQVlo2K0ozcmVSZUNqd3hYRHRWV1UrRXhvN1EvUmkxNDJBaDNUdFpTSGx0T3ZUL05IS0ZwRHNuQmNyNEJnbmJqR0dicnRQK2hJNFgvRkxCcUVUbk1pUitpRm1OeFNGcWtad3hLMkVjNWN5ZlhCamdwR2s3R001U1pxQnY0UkpjR0hyRHd0ZUtIV2NqZzlSKzBHQXVaKyt1cDdkWENBeGp5eGlTV2FNa1pLNlg4Wm93c2JMTWd5ZitBcEhxNEYrMFN6QzFyTmJGeEdYUTBEakRXZ0FtZWQ0c2oyTnAzNHRGaU9jTms5R2ErY2IyM0dlSFp1V1EwMW1WVW1waVJWTmFmT3hBNkZ5TS84c2UwcGQwbzBaZXp0cWhRb3VZSFMxSjg1REd5a2N3QjUwdHJDZFROU0JBQ3pYc0o3bWl0NlJpNE1LR0tnNWp2djFlVUxYR29DYmQweTV6M3FDdHErOHJ1b3Nza3BLZlNSSko3MGFxYlM2ZG1aU29oR0RDYkVreXpPN2lXMDdhc3haZWs2L1czUW1jK3NZY0RFZzhlTkl4QUp4OFBnZXRKTmZVQzlNYmc5NzRLUnJEOUkrVFdhc0VqSE12TjcrWHNCQ0NOYjRBOGVqNS8xNVAvY1Z4VEx1dzhTK25RK2JPSWhnY1NmNGhNOVlxZ1k3R1cwMVYxdklqbzh5b0VIZFhHQnBIelo3VnlFaHo2eVRES3M2dk4rRVNBYXdrbVNIQ296YVhmOHozOGkxLzFXVS9CckNxNFBKbVMwZWZvNkJ3SGdKRSs1UldqWVY0NFFiMlNjb3ovd3lBKy9sSXBmbXFpQmI3bjVzbkRaWUpzdGpxdjgycHVqZEVEK1dWaVVyV1N0dWNJMlFaWHllTVhwaVpCZ2c1V1pXN3g2YThOSWdsUFpnWVpQc0VQWElmOXp1TmZ5QWozY3Nod2dLQytJb3dUQ2I5eHZXcFA4MG83NTltVUh4Zk5QcWJwQnAxNENIU2w2b2Ird1dxL0xiT2phUjdxY3dqMU1TTzN2RjEwT0gwMFo1UGlDNmFVS2J0RDE5WDhCTjVZU0dWV1JwT0p4RXFsWm1LNTNjbytYOGl4S09QTTNFMC94cTRKRHk1K0htM2l1aVRlRjVtYzhrdFFQVXhWd2pBSFFUY29qdHIyeXZTdGkvOXFYSlg0aGptbE9HRk1CSGE5VkgrbkdDVi9wS3dZS2ttdGZaZWJoTUp1V3dmZDhFVnRvR3cvelNLYXFCYnE2VVpDdXU5eEY3NTY2Z3E5WFFJR3RaczRFY0pPVzVMZ2h3UVRSS0puSUJ2RStIRk5ZbkxpK09RTzBFSWVRN2FyWHdMTzlJQ2lQK3BIMjM1RG1Ld0NzWWNEZFZWRUhlOTNKbVpLakVpVy91TjQ1OVFjUnJMR1UwT0E0WDhmVStCREdQM3pHdFgrWTRVL285cUprT05md3I2bGpMbDNsazhCZXg4QkJ1bW5QY2YzVE4wNU1RZEZFWUIrU2VkVXMrS0Z2UGJZc2V3RDZkWlF3VWp1TS9LRzlGUzJ5L0tvOEpqelUrem5ORXpWVzVXRk5JWkZRa3gyYUVNdm9NNnBxME43TzdFQSt6NC9ENlRncTEyK1QvQjNhak1rNDc5UWV2SndtaFE1SHFXR0tnQ21UQVFhNElSaTQrN0lmRmhQUXd3WUVZcWZtUHhFNkw3K0FhUkdieGlPYTJybVFmRnVhQlllV0U0a013QkdpaHJLdGFQeDI1QTkwcXRqODJPcno5dkZnS2dxV1JGNE5EaXliYW0za0lrSzZHUGVPK2xwYk9vZDJ2eXdadE9iWmUyZEU2NndFM3ZWWThmQ3F5RUlsWHFJNUZBZ1JRQ0hNdDNHZUE1eFdFUnczbmlqcTBncDdvcnJHUzJpRjFwd1VZN3M0SUJ3ZHZJS2s1bWtQWjZ1VDZ6dWFLaVpkZ01LY1JHYlUxci9BeHhvYUNNNWU0Ry80eDhxcE96WENnNGpzbkJjaElyZ3dKRWlnbUhQTzhFL2xsVVRFc3FVdWl5UXA1NzJ2RFpNL0Y3Zyt4K1NheFJBQWlyOC9TT3Y4VEFucjFWMm5nNDMyWnluYnRuQzBRT2R1aEJxb2FKRmQ4d0NMdDdVVmltMTBQVE1YU2lYRE9RdzIyVlJocVFVclgwR01uU0VLSlk4MTVBelU0ZjhZNFQ0T3ROTTJ5NWpqeWwwOERGZXcrYWZWVGpvdlA1Qm9JU1UyRTJHQWM2Nkh4YUh3cUhPeVdvRUFYMHBreTN4bjI2T3VLM3ZqcGJJRERaczBPOHpjRGc1Q0k5c0N4bmZVdG1RRXJXc05Qcjg4K3NGYVRvemxIRUE5UVAwT3ZTRm1qblk0RTFNQWl4cC9rNytZNVFYRTRwQUZNVVNtejlzTXhuU1lSVm8wSXU0ajUwVllTWG1aMGI2bDF4b01ESG9FN0J3NmwyWVl2UFoxVXNWSzBLRzhsNUZuQXlxTG81RWNlSjVQZjg5YnA1L3MybE1mSVdHNmdPMnZSNWZFTWhLM2k2RkRhUXpRRVpxOHJXK3JmS2FBQnZ6akUxbGM2eEN3NXBSZ2QzaVdXLzJmYUlaUW43NldDcEJzQjZ0bm5GQXRvOERqN0pubkNLbXdEQ05iWXJUbEFyQXJpQlpMVStNZlVqNlBOR3JVRG03VTVJV1A4QmZjYWdKcFlGaFUyOXRGK1ZWZnU5WjhkK1RnUDllOFpQL3dWSkFsZDJlSThJejFHR3p4SEVUa00vYTVwbWMvODd2SThaRnRGYjRsa1k0Y3NwNDNmNEZDZ01najJMRVJvbGJZa3RSSmQ0dmowb1ozUjRDNVdSYjZiZWZJMEV4b3lwWXliMXBxZnRNL1kwa29HZmlpMkFCSEVSV21HZ29IRGxwSGRyTkJ0cElIYWVsa1BsdUNGZS9OSThlOXFrc1JpZHY1RTNCazhjK0RGUklndUJ0VDVscnRybURmd2F6SitHNlFDektZd0Ntdzlrak9nRkdlTzNFMDlMLzl5MlZTcmdlRThPWjJlYm1wN0gwemFqdE1rQUNsWDR2eTNNZzhiUVFXeTk0SHE5QXl4dzBFMTdaa1JUbTMyblpRWVUrSFNscmdRajFBSGV5a05URlpPK0M3VnVrTjhjeWxPRzM4NGsxTXNXaXRFanBXMDA4QjZybXIwMG5MT1dnMW1NdzA4L0tsQ0hnZ1hteVd3Vmx4ajdyZ1EzMzgxS1NxaUsxNytvSDFXUDF1VEJ0U2lvdEwwbzRJdDNrMWpyaVZ2VXZmUTBiczRvWUhhWnZJd3BYVEtGOVZxY0lLOWptWHRMeU90dCs3WTdKMDd6aGJ4aHdSTnFDRHpOTGhDYlFFWVVBSkc5SXM4SW5Xa2sySmFOWkJzNEVVT0ZBUVdtQU8vNmxJV1dqNnFBaVZTVG1sU1JLWHZsNWVLYmVyeVl4ZGVuYkxSVERWL3YyK08zcmhLV1RuU0Nja0tXS0NPV0xXcHJJMGVUamJzdUxKdEFUNmtMWjRkT1F0a25rcG9vUy8rdlVmbkU5ODE5UzVhODZETEQ1WW4yenZNQ2dEY1JCSllVQTFZajBCOThlSzJXN056Q21zRTNONHNxZHJJMU91VldLY25wMUpkWStvK0FpVjJmSjBrREtaYWwyQ1dkc1BabmtvYzZLWEtQbk1lNUtqZDFXWHY1WUNwMXgvb2g2TEgxNHpLcGlFbFdybVVKTUtoQno2amM1RU1IRGRsbXEwaDQvc0JyM2V5RzdUNkx4MStZT1pVTVcyVWJCUUZGM2IxZHVja2FNcXgrY015SHVUc1I1dW12d0NGYVJLNkVKOVRqK0FlcDZyRlF4bHUyeVBxYjNHQUVvZm45S2RQelNpME8rY3k0bVpLb3IzYXpEK21kOXBYaGpOZXd4Z2lBVFNzVkR2RzByaG5KR05UYzE1RU9SZXRvVXBFZFVidmx5djJxUm9wa3ZKRURiTk9ubjFNd01ScE5WWlAwejRBREZodkcxc2NuaS9lZUlvWU52SStGdmY2cFVRcEkxRGdGaktmY3JTckdON2o4QUNwR0tUT2ZqdE9pYUpqMk5jeFUvNENTamV6ZElLZThBbk5HRjc3S1ZGRmlKQVo1bk12UmFSWXVQZzNkS1dYS1hkcTV2STdIajhIVFpSdVo0VnBVT3RUMDkrQVk2RGJqam9rUzFqQUdKcEcweGVVaTJnL3c4cXJJd0lsRjJoajVpZXdCQTVZam83N09odjk1UUhqN0l2SXlhemJBWDJkbmhHdVJwbXpsTlM4SEN4TjMwUU1EekUzVHIwSEIxVWVFTEVvQmY0dUVHd0YyZW1VN2lodW0wRU5TMEVNRGQ3U0tzS0FBSzNqMUF6YndXd0JsQnFYTmlieUFWQ3dxL2ltdmRvdzRWUWRuU3p2alhZaVozQkxHOXNoT0RDVjNDZEYyYU1md1pPcXpVV0YyT05rb21BTVpyRkRkT3duNWNQL09NcFYzSFpTd3VjeHpXY3RVczZGNzVRcExaVEtvbW1jbmVabzk0YnBhbWprMGFEbVBlL1Q3ek0ydXhPQUFrYjJyVkt6eDU1eUdYbFk5NDUyTE01T2txcSthNllFaUNUVkVTZ2N1OTB3ZGRmMVEwWTJoMVNSdFZJell1UHQ5Nmc3blhTSDZMdzVJeXg5YzJUcy9lWnNwUEhPZThZMlF4Mnd0TUNjNWQzbGNrK2ZlaTM2ZUFMUXlEcWFBdTIyRjFReEpMM0NvaSt1TEN4djd3N215QmRlck84bFdwRlUyNjRmcVJkMjNLYlhrNTBlUWw5eXlvbnBMbEwzVHZ4RTgxaGZBYjloY2pndXpNWU9oTHlqMm11cWtuSkRrRDk1RTJ2MWZUWm5WcDhmWEtyUkNsKzRhUXgzOHVWWEhrSlNjZFNwdnhuUWhqT0xydlF5MVpwZ3h5Mzg5WWlwL3pCL1BUc2o0djFpOUs1clRsQ2k1RDZqQ2pqd2lnbEphV2lISHFPQytDTVlxa3VhSjNlVHRQUXMvZVVOYWx3M002WjVlNnlFclJTSUFoVWJBeHo1WTlCMGdHdVhsVEcrNTVDWEE3cENVOUEzMnEvYlpRNjk1UlUrNE5QajFiUFAvZ00veW9FSTdvQ2M5cHJPY0Fmb3RxTEphbUFYcTNJdndRb3M0SW1HWDc5UGxkOEo5aHhvcHduV2FTa3dWc1djTkNQakdtcHpVL2F0YS9VdU91a3lyaEFqSGxURGF2cm5WeDl1d2p0Z0ZiZStIK0VYQWlDc20yRERacHJsR0xXenhwNjNWcEtxWXNBUEVIQlNHWGpmYmJVOWZSMGtjeTVCNEtpcUQ2bTFiM3I4eEw5Nkg4bzJIVS9xVHdmYU8zTUh3WjE4OE52L0J4b1hzdUpqZFVQQjVPakFnMnlsQzIyVm5vSzNYbStuaGphMlZtU25TbVN2T3hlNUl2bFhiZ0F3aTlaaGREajRJTWlueWxHTDJWZmpIWmZCL3prYWZNOTVUV0J3bmw4MCtiTFFETWphcGhqaFR4V2J1YUZ5NmRIeVIvUE1vWHlXbXhQNnl1K2RubDh3VkJ6ajIxc3JILzd2TEFhWWp6QnQ2T29OenJYcGQxTWZ3V0FYVWE0MUVkZk5kL3M3c3JnUnYvVUtkb1U4MVhjcWpCUmswRXJ2VGYwNFJLTW45MjU2TDhTWncyZnpob09NcmhTaVQvUnZtR1NzRmZrS2tYRUZRcloxRWd1eVE0Wk9zUHN6cUNQUzFoMWhGNVVhMmhqbXpRakRoNzFFRmw0d2NHK2c4citTTnZocVd4akMvSHEvWjZReHN2Qys4UkZTeUxSSGQ5aDRGeDhDRzE3Q0pCQittVXdKSEtlY2NRb2ZCYmp2L1E1NnFpMW1KSlQ2OUFwYzdrR0lNbGlXVW1jYndTWW85MVZkOERpTmE2d1E5Y3dGNUo3QUR1U3FiS3o5M2QxOFp1aC9tOXBIZnhpQUxEajQxb29GNUJrMHRBanVTQTg1ZXRqU1dDZWxENFRNUS9FakQ0Ym1lWDhzZWdQdmswUnNuN1hZR2xvWmRqNXU0eU5VYWhKLytraCtZRkduTEFQby9TdDIzeWZ1aGpiNm5VZ3BKNHNlRUNSL2ZaU3hyTWJQTzFIY09PSzlQaUJtcUVWRGl4Ukxjekw5M2RNa21nbVc5SXBQd042SEp2YXVRdEplY2JqRGNKTThOcnNuL0xPeGt4WEcvSHRYeExScXdqY3FMQjR5QXFsanU4WncrSW1oakIrVnFqK1puay9UQmdKa0xIMWlQU05WdVhBSUk5aVNRdDRPcC9KVkJKNFVRanB1OFZLa3ZWMDRQVy9Bb2Jyc25iY0Q0SnluODV0b0lDODE0b3V4cnVlOThxc0tzd2Z1eHErNXBRUXpnV21ob0I5NDBIZHhyWHlpdnVKeGt6TGdPdEhobTVIZnlGR3FnNzIwU3lOWUhvQmw5b05qcjVEcDdPa0NIaEVSY1RhK0F2Z3JNQWZSWlQ5SzBEWlp6NGlLTVhjUjN0ZklOeXpNanp6Z2RwVy9wa3RPM1Z3ZTVWd0VLUUhSSVE3cnZMZEVXbVVWM3IvNk55UWQ4cFptVm1BOHFWbjFNbU9OTGh6WHNwUE9CbXZvaHU0SGc1U2ZTbDU1dVJrM2J5UWlwMTM4end5M3E0UzVGQ2FyWEVXT3NBc3I1dW5pNCt5TVpmS3k4dWx2YVJzUUR5d2FxNDFjMXRVMTJUNm5XbUcxUHdVeHFiK29OTUFhMDFPamV6djZ4ZTZYc2h0Ym9LSHRxTEVxL2NPaFY2THJrOVB5b1NITWR2dGd1cmpCbmpMSk0rbUNBbnR5cDhEeTZUZ3ZGKzVhd3RuYWM1NjBlUmlBZzJWUU9SSWRncEp2UzVGaFJYdDdhMGp4SDhKUjNEWW1oYUhKRGFibkh5YjdJMXk4WXlCM0plWjJhb2JSUEtUdDNZT2t5Zzd1am9UWTRyUVFCSm4rWkIrbDhubGpYMmZWS0tzZitUNlRuRHF1SmVrd1FMOFBaSkc4VVVEVE5ONmVkUjh2cEkzL0dMY0srYTA2dlVTVDh6ZzJydE12bVMzb2locC95ZkRMZkozK0RRTUtmc2hjK3pPeklWeGc3SWptQ2NSUjc2Mmc2bkNrUlJWbmprdUdXS3NaL0NlZ3BYNkg0U201OWNxV0ZvSE55aytnRkFFZTAxeEk1T29JL1JnQWQyaUV0bHlCNWE5QzUwc2JhcnhlaHJQTHJPL1lMbjJKbHhGTG9NVFdGNTV4QzQrbWV1NTN3Ymc2aW5kUXlWMm9lOFRUOW85K3JUZllVWi9ic2dzSXJOc0tMaEoxZVhaTDFtQXlSd1Bvc25hSW5BMjhydFhPKzAvNzdhQUZTNklyUGt4N0psT2RwV1c1QWxING5CTHNPaGRqSUdvdUM4bjNLb1JiVUUvZ3UwT2UzVjZyVjJ6OWN0SUw1d0Y4SkcwMDVMc3E4L2l5UmJCZldEb1I3QVM4S2RZTHBOSTNtekZkRGxYeTR2WUwwSnJ4S0VKUUdBSitEOC8zUE5pbTNET0Q3V3BONXRRTFFiS0xVOERjeXdGaG02OWRHYmdYSW1wQXFDa0FXNFEvTGx1UnlZV1FNVklDSHV5NjlNMFVCK1hzaElSa0JYWTBkejBFL3lIbDNibDdJRzdVRFByOW9WbE56MVhqcjBYbDVuanVLVkNnTG1QMXVlK25kZ202dmV5cXBTTGUxZDB0T2hMZkFpeHpOMVVtaVJ4eWZMeVdTU2pDVGFKY1JmeXRCL2w2Q1h1aDYvVWdQZVVWYzc0T01Bb1RCTlllOUFSS1ZVbDhhVkRERi9IRHF0djd1V1dyd2tJWE0yVmYzNmROTFlKZ2ttRnRVeldQOFZRTXJoKzFqVHhCUk9JcXBKc1U1N0Ezbzk3NFJobVFwWHZxeFVOa0RMb2xBS01ISW5kanlEcmkvbUNYeXZkOTd4ZUJnclF3ME51MmhWbmg0Tk9QUGtPQ0UwWDJOU2lXUVFJTlYvVGxOWkRFNEc4VW9oNkFJbUd1VjlsM253YXZNTEFXZERKTjJBNGJIZ2MzNFU3VExzVGdabnpSNm9DVjBXK3MxcXpjSFBmUjhWUElEeld2dGtmQS9OOGFKd2JNcktxbjV4TDZ6czE5c04xdkZ2OUxZTzFvc08vQXZuUU9BWGNBb0Q3TzlZOHRoempLdU1tdmdyUHBiMWE3S0JkMzFyQlVia1hpNTlHQmkySkhucjhFdlFlTE9hS08vMTFtb1Izck14NTBlNHp1emN3ZFZrODlCRDJxb3dMelJiM0hPdEV2cXVvTU1FTVZ0NTBQNE5QNjFENldmVTlQaVE1NVdidEZjQXpGOXhRRVNJNGVtN292UkxKNDJ2RUxaM1JId0dDbzFSYk9aY3piNzQwZ0IyKzVURE93cmxMVnFSVmMzaloyT2xzcVNvcGNPRW5aQ1lGa2JpcVNKdmg0VVgzSVkySWpCMlcvRDhTREtJSDlCZ1Z3VEx1M0ZoU1NCSzJkcldYNE9aTDRRL0c1LzJTZ0x2UnZUMGZzSk5UdFpha1A1WU9PVmt4bm5td0Y3UlBUemd3K2JaMmVuaW1XRERMMjhSNVVyOGttYm1ubEFPK2tHS1J4NWN5RG9DSGpJR1RwL3d1R3VJdUV2ak1pS0RSWFlDS1BXVmdBZGFUcWRjQmxGSnUyblFVbFdhZFA5M0NRbzBRV3B4UndUU2FjZTFRRWJRNnZQbHN0ak9pRFA3UEZpejQrdXhxeHBucjRUNHlaT09hNVFPQVozTHJvVHRkR3NyNjhYUFVDSWovcXMrRkpQaFI2UFNvOE1YdnlkdDJXREFhaExOaGFpWk5TRW04bG50TGl0N0VtRFJiKytacm1GT3UwUFJodXY3Y3Fnb1hISkRxR1FzcmxMRjlQbmkrc0cwdkMwUVNQditIeFp6ZWNwajRwY2VUcmxyMzd3ZGRjUCswU0pxSTA4VkppWm1iZ3hUSnFMZEVEdFczcXZHd1dWT1MveGltU0VkczBpRjF4bm5QdjhhL1hIYTFzS0s1Y1E2Z1BOOUJFc2UxYzRvaHBrT3lQcGl2QXZSVmlCemM3aHByYkpCQVNXYXQzbTRrdXU5ZHBUR2VLREg1TVBBclFaRDVRdC9idUhtelRmS3dpcjZHVXNUZGRuRndIa1A4RU8zZllrWGlTT1J0UkNKMHBLNTdDR3Y4QmlRUjg5NHh5K2VnVU11dmVGK3BSN0dBbUJxNkFncmRhV0M5cGZGTjlWeXhEK09rOExpZ3NmdjFKZWdVbDgyNTYvMlhxUnlxWWs1cHh6WllGVDRTWjhZRXlmYTQ3ZFBuUXZmZjZBUUQ2U3l3WDFYSzZ4QVVYMUR2bU1hUVd1MFNaYWpGcExuOEluK2YvYU1BNGh5VnJwVW9UWWY4WGdyNkFmSm9ndHhIeEo3dFRHZDBydFJMWHJadXpaQ0R1ZmhpVCtRc0NtVlo1NWx5S2MrU1BmcHhzOUFjSkpBZE5TTEY4QTRLQUFVcWxWaGxoNWRxMVBaeklibkIxQVJnelprL1VOR2xjTGpBYUxqWlRBQmRqenJNbDIzOURjR0ltRmFLNFFSWFRpZW1UYTI2K28yQ1JMQVNnSDFlbkVZaE1nWlhXL3hTb0JsS1BMOG8xZS96WFhFZGpXS2NPVjdVWnlNMHc0MzROZkIyMXBKSVBKLzlNKy9iOWJYcG5Db2ZlWkxOQ3RFdGRBM2NSWVdJS1h5NWVFMklTdmdkVXhNMllma1dxRmwzK2Z5RDkya0dhVCtKZms4SDVWS2Y0R2pKbm9iakEzQ2ZGL3VSblhNWmtKdFNsQWtseXpGZVBsUDliZGVhK3czcVhEdkpQcWZWQ3BHUC9OTGM0VXdpSnpHYmozNDZORUJKNGZzVFZmN3dhQXZqQThxdFkxckNGOVI5bnNKb2MzUWk3RjlNbCt5UzBSaGNSYXdFQUtSdUNGVWNzWWt4SWVjbUxIYUJEb1JRYzBqb3d5UUpmb2djWlN5MGNxTWdaNmdmQ2p5UWRHU1RmS3lZaXRCMUZiTERSVUpLM1dhN2RieWRRbEszbEZFWUd1OTNiaVQ4WGMzWU1Td1Z6S2cvODZ3NStSTUtJK2t1dFRySFNXcTVZWVcrd2NEYzI4b09yb3RNK0pndEY3cHMwRVdxclNaRmN2TFpjQjRrMUpvSEZYL0xEUVo3SVlPMTV3dzlmTGJVNUpiZWt6d3VqdjVrMXJLa0NLK3E0OHVXTXhnQys1MHA0OWthMWgxVWVjdEgyS1NhQ25YVncwajRZeU14M0ZndldTT2VPNnQyUTczQjdDbW5TOVhpdWFIZk9SMUxEYzU2NWduSTRLUDJHdmI2bG1OTDVjWjZaN3pCZTJQQ2dlZlpINVlQTUxaL0c2WFNKdjhWN0FqOERiWFRjdW9tL044b04wSTdaUTBUK2lMcUo2bEdjbTZGNnNldGU0VlJQNGdHTUtPK3g5RloybWxqdCtlUzE1eFpCZ0U4ekxrZGZSTUxGajBGdGxzbndiNVBYMUhmcC8zbjlzdDhucXczNU82WDVPdEhEK3IwVnA4bnN0bnllN09mSjZwTmZKMzQvUDJzNEJlL2F2NzlidnYybWUvV3gvaDl2L3dmWXdCNXM1UDBmTUg3UC9yWWQwR1l5YUxlWTgzVGJqVmtZRUNwMTNVMStVbDIxdlRnQjVnM2hockxHbm5wK1lZKzhQbG5Kb3RaZkxYUzZEVWlFMUNqc3VZWkljS2hVVTliOHZpZWtPWnZhc3orSTJVZUtPeHhnWjd0czBoQ29Iekg1OE93SUE5L3c0T3BlS1pKTjF2a2FZY2VheHgyNUR4UTBrSW8wT1dhN3ZHbGJrTGtLazd6UDlDb3VJanFkMnVtdUF3RjkyUzhNSmVSbEdONWhIVHY0Y0xLeDZ0KzQvTmxBMFhiV2RoeXorZ2ZnWERMenZaMGEraDZISUdEdmRSKzJpeUlpYnJyYzIvYVFSNFNYRDBhdVljdmNPcE5xbUdlTmw1RGlRa3FSN05GOUhPSW0zM1ZscGcwUTRjTkQ5dWJ0eDVCbzRtaC9veEtKV0lPVlJ6NHJFZ0pMU3ZJWDYyNkFmRkx0V2hrbk5neEZlQzhoa1BNVXcrRlgvbDlmaEp5a2lZM295Sk9KNEppVjkzajFmRUZhTlQ3ZjhYTGlWOTFZcHMycktPb0Y2VEc1SEp0WklEVHZKc29vZk1ZZzg2Z2FzdkVhbWFFeCs3RGtJZjlvaE85S3k2d0Q4NjJWMkN0MzVGV2V6d1JndzdFdWlIdzczMkIrWmhYRWtYc0ZDaVBzbDhUMXJPOTUwN2loOW1KVWx6RmFIbENXYUR4Z1k3NjcyM29FYmF5bmlwZmVLakYyZFRhY3FaZmpmWlZXekg0M0srd1ZuaFdnWENhYlVYY01vT2cxYUMzR1pVS1ErbG9udGdWL1QzNi9OWW5OdGxMYVlacmVJMTRsbEhjYXZueStqaUl1RUNnUUhhK2Fpamd6bGRnckJZTGI4Sys1cGdXOVpjV2s5SFFRakx1WWZ0VExCdzl2ZGhPQ01BT3A5ZVEvYkY2cHlINmVVUkQ1bEcrc3NLMEZKVS9INm83YmZEaUlpRUJwTDlEZ0hjK2NnTE02UzFENkZsMmNnV0pGekhZMXgwaVhNazVNdGh3Tmpxa0VBVStXTTlvczhEOVFZNiswbldYWlIvUE82bFNhS1ZjRnkrTnBmM3J3Q2pDOTVQamNneWpBbFFpRWVKWWlJSVZBc2VoaG5NTEh3R3RCSGVCQ0NLOThJZ1NrU0VxcWdMekZubnVlb3Q4U1pra2g2eCsvT2xLWlpCc1NOU0FxbzZDVU90UTJlQTZCMWZ3aVdSMVJyc1pieGFDOTdHdDdQY3A3dE9rQmVWQm5zTTg0WnBxU0dKZG9KU2Z1K2QzeXFjZTFVbG5RSytnd3NhV1ZDN1EwMXBLRENjYUZEL2N4ZVdQOUwxLzZtRVdldnc5NG1yTlVoYmpLNHVIb1pqR2ZKS2svQjBVeDE0TTgxT0plbDNTcjNxMklUN25ta1lERlpLMnFZbFc3S1k0bS9Dd0Z1V2FRRUV0VEd1VDBkaDVTQnJJaURuWXNoTGdRZExYdkR3RllzTzlGY1dKTFVoUVhuM3MrVjlaVnlTRXlsV042KzdtaUZuSnQvakVqVHJacFRnSWIwSis0cjFKb25TK2k3T013aEVyWDZacE1VS05HazdmOXJjcHhMRXFvY2hqKytHeTV0YmtmdExFVDR3V2FHK2o0SDRzcCtWL2dVSlp3NDZyQTBOWVRCUlZPcmVDZFFlTWdTLzhQcm5VeFUwMVEzYmFQMzEwNlZDYnVhb0RIUFViSW5TODM4TmR3NkpHeGhyRjN5OW1HVTArdGtWSTZ3bFVQb0srbldDajk1emowMjMyMFdSYUUxNFVjL3pGMk1mRVN4WFB6M2xzSTNtZThMV3l0VU5nVmN1NE5BUTIycnFCQ095S3lTbjhIcnVxNGZ2dnFGU2w1bFZEaXJ3Z01aYWJJdHA1VlUrQitMbmJmd203ZDVJUU5lTm5QR0E2Rnd4c2tvU2hwbGhMRkhrUkFiQnN3NzJTVTdSYkY0Uy9yZFdpOCtFMHFERHYxWGdhTXVwRVJTRkcvOVUxZmhwTGN1TUxHSDQrcDZEYWpvaFIzbTFuQ3NqbVUyU3UyRUZaTWZHa2RaOVpUdVZnanpXVWFFRmpHWTcyekczbzRRUHhCaDNmRysxYjRQN0c2RWVjOWllODYzSXJsQ0tPY1VJRzA3VlNubWhOVXJhYVptekMrWjd5eGkvZGVZTGZ5R3l2OEJHNVZEZDgxTi9zUUdmcDQwNTdUd3lENExpdEdqS3R3b3p2d2xMaStEZGhwRk9FU2todW9nYTBnclo4WGRLUEdhWmQ3NDUxYXltNkNBUUFEREtxdGNuRHZ6YmYvZWtkUEgwRzFkd00wTGZ2VGtJTnZSeGZpazZyTVpMaFN2cXp1VFlnM3YyOW0xcTFsYnRmVUp6QnljTllwRjhid1NtQjFTeUFUWVc4RGdSTVVRU1Yvamk0dHJxWXN5N2UzVEtQbEh6VjEybFJWa2dzYU5wSGIrV3VEb3p5T0I5cEpjdXBLUE1GUFd3NnVDYzJOQ0dJV2NHaE1QUmVBcHF4eGFSN2VyYmdmdW1HemhYc29PMUY2aUwwVW5wM09IZFVPSFpoSE0rck9aQ3FFc3VHbEE0TWkxTFZZTC81dDc3bnJZZGdGVXliUmt6TnRPbzFUTjczK21uZ05nTEtkRmF3ZGp5YTZNRXRQWTZ5eU5MWEhMMmM5b3RLS1NGRUJCRGZIdzUwaFFadURpZXI3ZEZRQ1pJUkdsS29zMTF1Q0I3NjM0SVNBVlJ6cDRjTEh1YXFkZ2VZV3U5QzdLSm5qYVR6TVNEZTF1UXlzd09PVTdzUGJSL3NDL0JxVDJqWm94dzdVbjFJYzRoR3paYWsvMHFMTWxjY1R4MHA5ajEwc3FJbDhZNFh5V0xrcTlTdjhCekh1ZFBSeFQ5dmFCMkszOFNNQUEzb2tnUE0vUjZsb3p0a0FkendQMVRHaFc0VENHdUdKN0dxeTl5T2Fyd3lnbjBiSGpqNnhuZ0tTODVVZVVWKzBiejlCT2dVYkdvVEJRMHl3SUcrdDloSGloc05jdVZmNlp6R2pueEFJZTJ6c0tVb3k5dnFTTXFNUjd5cUN2dUhXa1BSZ2tJam5hbGpWdmNKY2JEd2k5enJPNzBlRHFaTm40bTNzWnBBbERxV1hWMVBEQkdub2Q4dkJ3bHBtTCtxVll2SUZ2N0c3bmR4bHpXYTV6STlKYndBakRRaW9xSG9ZcThYc1dSVy9mN0M1eGxVTHM2ZnJYaEhndDVweTBXaEU2dHBiY01NSEpnVzBqNkRDV0JSOEYxYjdaVmcxMjlaMnd5a1oxRktER1hYZWhmcXdyenNCOUFMSmxHK21LdTVSMVNKZDFLNlRRQzArSmxYZ2RLYXArMWpXdEs0QVVkbFR2WHBxRHhlVk5pOG9URHA2WHEyKzRmcFV4dHByQUE5ckVRNXliM2JuWkVyMG1rUUZSblAwdGFpcnMvRFBWTWdMQ3Y4aXlWZndFdmNGenMwVHVxaExlTjdndXlsMnFsOWRZNEhTVjNOWC9vajNqM0hVbk1qeFZ0bHByc1psQUszeVVwTVNSR3JocWNjNWZRY1hmenN5bDIyOVhtVW1CMjB6ZGZLTmFaR1QwdzdhVlJZN1l6YjlTVnZKY0daSVdoSGV2RTNwbUdGNE4vZXRjdlVyVkVMcjUwaWdxNExoZldQNWhJbUk5L1dWU2lIMGNRUVhMclQ3Q1lIWkVYbEI5YUZ0VVdIT2NFNTMzajRBejhTVGlzR0FWUTZOV2dFRWE1TXhUVzZ6QXZtTy9ZdzBObEFpRmRieGQ0dFNzeVg5VzY1YncrN0xndUdycWZyMWF6WVJkUHlTcld1c09rN2JtWmNDb085WUlxNzErK0JoYk5RQ2dJaWNDZUhyUHdTTWxqSGtlaGpJaUFDTzBDNHhncGk5bklKWVZiVWxnRFJKcHU5eXhxUHh2KzdjU3hnbGxDUGFnelRmSTVJcFpDWGx2VHU0OXFQeWlxZ0RyUXJpWmhCb3g1bnNXV002VlhSanRoMFkwd0JYNFYxV20xbzJ3SVhQcVpSK2QzMTI3YlFCelZDRkhrSnMzcDljek1jTllxa3RRbXNiZ1QzYTYyZ2NnblliWXY3VmVhS3l6RWZJNnhxSVRGK0g3QzAvTWhWUm1LTnIxMi91S1dWTXNBSFJqdW1RVWltQVZQb0R6cVEvQjhzR1FVaHFNcGcwSXg5S0ZxUVFLcUZxWGZvTVNaTEY4MSttS2JTOUxIWUtVRVFqV1IxTkhYRnAzai9OOTdwSndlaFhiVWhYTWRHeVdkWC9la0ZnWE1Da2hTc2x5TVhSMVgvdVhMdTRCWnNWKzVCZnM0Y1YwazVwL1k5c3VMZ3lyUGRjd2tYWWF2bHVoanVLV00xaFhFV3JEak5zSlRkRzhDN3Uyd2RiN2tCY0FObFdyUlVqSWpKWGNNeEZacDB5djVHblFKcGpLaHNkQXVxOGZIcy9FcVphRnlxaWlpWFJmZ1R5cm55UXNVVDZWRHhlRmNyRXpjZ1NkNlFoNFh5YWsrTEhXRVJiTGNYZExTUHNEN2twci9xVkRiN09jQjRmTXlMZVpHR0J5Z1RNTFZ6UDdseklCS2VWVmhrcFZMUVJWcitrYlQ1bDVnR2pMM082Qjcydno2RHZvZWFQdGh5dnVSeXlEU2k1OUVlMHcvak1RYTJNaFByY3JIakRLTGJiSld5YXRnWDkyTTFNV3FLNTVoeE84VHBwdDY3N2lWSWI1d0htMThrOTdSRVZlZldTNXJ3NXVQSGR4dXJLdmhBTG5GWmlEVmlKTXdkSmdnNlhnbnFPdW5UK0l5QVBhMFRaNnhXRGJQZXJoeGdqdUlDZzE3TlorM1hzN2ZmM3daTE1qeGVxVWxPbnNJT3UrQ3k4TDMwcFF2V0FjWThBUHFQUEhjdERIOTQ1M3Z5eFRQcWNlUGRGSHQvVVFLN3ZCUkVqWFVwL2cyVzlETVJUYVBxRE9lcUoxZTd5eXFpakNPU2lna0Rsc1NEZDhTdGU3Y3dOd0dVL2MwdTZWSU5JZEwzVVByV2pNNkRJWVhhYkZ2VTZyNWxOWGJmcFpORnZCdHlhTWhGelp2dmliQUhqSzJQaU5lU09jSk1KaGNHZ0IzaGZLdjlQcjNTc0h1SEpxMFczVjRSZnA3TEZEUXVzb0dsa3VoVGtpYXE1cHNlV3VZSGg2aGd3cThSTG44aGRSZExHZWZGZXdYM1ZyYmM0YzN1U2s1U0V3Y3ZWRlU3elBkd1BJQUlzQjlTQklVY3NUYzZMa1BUcmlZUTVMM25ZNTF2bGNuOXkwTHZ4dmNjOGl2ZmJDMHUvVGNINmVmaVFXbzZXd1ZBSk83ekJvbCtRSG9LTFR1S3pia2hYclBTaHVRSTdNbkZXeXlRbG0rNDNWM2hXQ0E4YkRNMWprMmFKUGxQd2FwUW1sUlpUWm00ZVgrODZxeThNZWhOeGx1NTd0WXJyTzN5eE9EZXN3NnBjM3FGTlpaR09NWEsvY05IdG4wM0M0dDViOThkblV5eEovVXpZbzlUWXV0K0hyeERZRHZlaE03SU5zSkVZL3hkWTd5R3BFVFh0c0JQaklEYzRka1kvdzFuY2pXdit5M1JUQm5Wb29GY2ppY0pEMlZiYnA5RFlqTmZFc1lyZFVnSzZ0OFg2L2VhWEVWdTA1VWxBMjJQeG9QOTB2R083SDdJSHJEeHJ6UFZpeGtGRVIrYjFDTE0wT0wwRE5YY3UrQ09XcDBQQVMvQ3BLcVZ4RDRuWU1XMk9yeWFYYVBNdTFoM0ZDSzMxTSt3WDBBRXhtdmtrcnRKZVY2NnMveWlhMXZBMTQySFFTY1RqWmUvQnQ0UndyVHpLb0FPNGlhWlhoYzhsaVFrQnNXZHU1czAzZlVJcW9GdEE3VDBBUGRqMXc1d1lia1VqZm9EWExHUnQvQ2VRZW5PSGdVMm90bGpkWmtkbDZWQVdvdWo5S0FMRGJUd1AvTTNqbXZ1ais0S3U4ZE5tWGtjaUJKYit5UjFrZ2ducCtZZFRDMjBlMDREVVc0dVNNNlJRRGo4WlFxSjBSZXdwcW5GUk41UDh1N1F5V2lZVlU4YSs2bnZGc0pFa2tZOWtqdStJMWpVeU9mZ09tYTdZWDJFZVJGRnVCaXpDUUtpQW1PT0E2aUN4L2NiUERyZ0p4UjlJRXB0dDBwK1VCUHp0NGZuMFJKeGdJcmJkQ3hpQ0RlY3VNcU54U0V2MnN6cFJHRWxYTWV2cFByQTNmcGptUVo4bnhlRmk1NzJnVVlDUWZMNUc4SnFwajlUUFJPdnNQV1UrNzdHZTJnSUwzRTQvOERON0lhVzBTUjV3WXhFZ1dIV1lnNi94amlpRG1tNnFnS0Z6cit0cnNteDVucHl5NVh5YWhVQk5MVjRDYmJsNnpoUjl3MFEwTGpmL2ZXb1JMMVZJNXpYSWZHZmpaY25KVjRTTnFXNFF6UlBSUDlOckR6NnVPOXQ5V1Z3WnlHa2JLZ0tuN21wNmdUUG9LMm9KUEIxdWkxOTR5MGlNOUZoMGFaTXYvU2hQMVNJWkZyUlBVUGxURG84ZWl0UFd5K2tDQlowU1ZGNHRIYmlzNC93eVpoK2lUYkk4WklOVi9JY1VUQjRlRjNSU3QvZDYrMGlvOEpKam1RME52WGV6NVlPYlVHMFlkYVZWZUtJaEJsTnJEbXAxSlBJWE5rK1FxcHpzTTlKQ0N5RFAvQk8wZVFSdnNQaUVlczhlZGZNd2RqM0k3Wmh5Mk9DS3pBaW5kUHBDcnA5empaK05DalV3V1JhMVhXR2U4R3RNMGl3RWhJbGwzMDRwdWhIUEZaQ1V3c1M5d3RhVElaOHEwTnZUbWpWU3VqeEZGQjRZMTNEWjhPR0hMQ0Y3MmFGUW51VG5iYjFlNFlXY0E0VGFoeWdCZitzc1ZiRlQwdGtFcmh5aUdlSTVRcGtpbTFvUGhFdll2VDRRNFJxUExaZ3Jwb2FhcnAzWDZlM29iQWhsaGwwZXJmV0Y3WnRJRzFqYVZQSDlxV0dnSHN4bVZRQWdkaThkOGVwQW9jM3BkaVMyajg1TGtQNUdFRlN6VGkwRTNvRHd2ZndvdlZkWGdLNmtmeUpmSGQrd2gveWQvdXJJMGYwYm9scFNGMHl5aGU5Sy9ZY1lyVit1SVB0eDBmU2gvZC9LcWlSUllPSEg3R2pTWTNiWFpxODlRUzE0UFE2dGxtanIzWVRseFJHSzdIRmxWVWNmK0tYcHh0Vko1NmU0ekdpOWFnY0llQndiZzhzdTdqaldYVjEydXpMQ0FWRXpKUlo5bFk5QklaOUs2REowaDZHNGZVTW9RaWR2cEZaMG1mT3VBaFBzTzBFb0V4bUFUb1QrMWRBSGErVzROTkJCRXdqa0lnOTQ1dHNZc2ZwOWZEWE5hay8zYVhKQ0x2dFhGcjJ3alB3OXUvZDRUZkZWMVVJU3ZKSnFmbklXVU4zc0IyV0VUaGdhbVNJZTNGS2Mzclg2amJwRm5GVExyMStGMHBjQndpOS90cUJtSUQ0SjRGSkxYdjF0MGhqMVN5cysxdlAyVDVnbVJSNHVWQjZqSzNMQ0lIYUxJU0pUS1lZTlJqZGJsY1N1UW13cVdObWRLbVlkakEveXo4NVFSNHkvUVRpdnVnakZEMmNvZUNGN216SmZwSTVlM0hSTTAwRW4yclhmNWlKVEdzODJ3UldQL0hYRU1iR016ZXNVWEdPS2gxdmw2UFBkc0ZETkVvOUtYbEpzK0UvRnBVM0ZaeTA0dW5XeS8zM1VsVHZzYnN0dEhXcHVUOG5EL3lGcGw5VE5ENTk1ZnFKR01XSmhhNEp5cEY1OG1jcmNIdUdEVnZueVRsTzYxc0pPV2RRaE1hdUNOVW5GS3J3QVZVcFZtQW1oMW01YTNPZGFxS0t6aEIyMUpXa0IyODZoS25CMHRDcXAyallFWGlmb25LYno4eDF2SzZIeHJVWGVFN1cwYUc4YS9iUE1xcW14WjZtdnh3cHZ3ejNpSnZKdUI3aFpzR1ZkN0NObCtwQ01xSVBEL2ZlR2pmMUh2OTNnOFlqUkNNUjZ3TkpUL2Y3MDZJWHVZWmRlR254OTl1QWtMeTk4TkljUitCZlcrWUFobi9rWXdERG0rQnNpNm1oSXZPV3JxWmU3azRodEhwbFI1SU9pRW4zZU5ZZUtXNWdyV3JqMGcwMW1DcEJOMFd0S2lyd3Y3V3VrWlFpMy96Q1hVcjkvMzhNT3RpUlB1Nnhrc2hmWWRaaVNwT28wY29BanBERHdhTnVJdW1QRkU4N3VkM1hsTkhGNEl5a21GY1FOMWlaaS9rVXJQYWZxaVE0UUVIUDhtUnIwMXFDOWVUY0djbEdKZ1dEVk9yUjFVMzgyUm1zZGxHZVdIaWU2bWxoL1F6SGtwc1B0QW5FYllrY210K1VNSmhWanRRQjZZZFMxM0pMRTVIeXdHWC8xSlhabXlEZTN2dXh5dDJEQUh0UmdkbEhjQStsWmk0c1UwQXdrRUFkckNvRE1FRVFBeDJVUzRxaFNmUGRoaDdCTWkwS0hmazNmUnJDYnhVcjMvcmVWUWM1WEtLR0ZSK1pNKzQ3RXVRUGhDeUNkZThaOGsrUm93SnRwVkxUQm8rVjVVRklHMmhWTTZGSG1nYUlNZnMwK054KzZhQzR0cUJzTkZxUXlsb2RKRm52Ri9YSnZUaWc2emZIRys4bDdBOXdhTDh2TmhoYUZmYXhWdmFtMnFBSFFIZmR2Vmx5TnNXNXQwaGRxc0lxK01OZ2NGd3ByN0pySDBiM0xwZGh3VWZGUGJ6MFRMNm5WYWthSlBydTVzd2hJbFRXVS9UcWM4TnNWV1RSckF4OUhvY2pYeE1rd3FndEg0bmkzMWUvZzhzQW1GLzIzd0xrVzVqT0hLSFdYb05ROFJTblBraW1JMUdnUzlFVjdvc3RMWHBNNG1wYnMwTC9JWTRmNjR4RzBRcGRIUVhVZ0Z6R3ZGMWVhZDhZQXlUejdDL24yK0FRT3dJQ3BJMlN3UTF1VlRHc2pUQnlWUkZDcDlxVHV6US9mYjZ5bVI0VEVlVWlwcFZUSDJzL0c4K0FIdHhXd25xNS9DVFRici93L0xuS1c1NnhwaDFURXQ0U0VDK2pLTUwxVkprRnE2b05wcnZ1UHBwSWMzZnBYNnhFcUdqMkZDcHpMa0RGWmFzSk1MUXR0ajlEQkw4eTZWUk1IYlY3d3ZEZnBMSFRtYkZ4VktBWmoyL2VwWUVGYmJ2QWpGVnN5K0JDNmd4WFNJbTE0OHFGNmhKblFSMlVqeFNlZldzcGoyVEV4MGpHRythZlhJdWQzNXNiSzVWZC93cVovekR3Sk5ubmR5UGJobCtmbTlHKytqYlVqeDI3MGFZdksyNDdUWWtuUzJpdGF4TEswQlFvSmxLOGZablBaVE5HUDRoaldaL25vNElmdlhMRHB1RzRKMDhaQXN6VWNuSU1PTlRRV05HRlN5WjZScFREUnJIS3JBV2pYT3B0aVJTNWJIekE2TjcvM0Y2Mmp1Rmo4clhnR01hU0pYc2FGNjlxTXBta0hsSHN2V1g4LzhyaHVmd29JVy9uRGVhQlBqek5SdURTdWkvR1VOVDlhekZvenkra0tESGQwUHErcFhTTUxxNkxReU11c29GTkpNbHFZVXpzSFdQWW5QVFhaSUpqL1VVNGFxeFoxc2EzRWdQbitqMWF0dlVIM1NuaWpUZzl0TFpqUk14MzNBR3Z5VnQ3aGY4dWtsU25NWmZ0Mm41RlhqN2hFR0xTa0pFdldiWWRUUW8vTGtWU2s4dU1jNzNnMHpmdEVBcGl6TEREOGtTdFgydU5idVoza3U2dVZ2N01JYXN6amdYTUVXMDJzZHF1MktZU0tIVmtBUUdBanluUXYwUURnZnd6Y3pLQUcvSFpwVmt6QmROMWNQYXE5TU9GY1RLK0Q2YjlTVHM4dEZCMGNJdXNMbWRBVXdVeXN6RTYzL2NCSzdhZHVEOFZCQldNeW9RSCtzNks5blR3S0Y1c21nQTFpUndPUE5NQmpFL0pVUk5xUXNteElVZDJkRWVyb3Y1Y1pRNWFhMVJFN2FyVlVCZngzTDMxazJRaWZJK21Gd21TcnM2OGdmaVU5dFZ3R202SFZrc24zenlRYUtiakMyVGFtZVQ5RERqK1d4am40cmR5ZjhuaG9VczA0aEJlSU5EU1d6U0tiZURlMHpwUTg4WmI5ZmZ3R3lBRzRsaGJuMVdFUVpjdEhROFhRbjZsRmwvbUlPcjVRa1VYcGd3T1g0RG1QU3oybVg4YmxDYkdLNmExZGhzU0V4TGwvU1VWUjFUdHlGaDk4NTBxdGdyaGVMS2NicXpaVmR3dEk4SThNbUhvSS96eHVxOWREV3dweVpnTzdWdjlVc0t4MUF0aDZ5a1pCdkhnSVFBTGNqQi95SnZudDBud1dra0hiai9LZnRhN0tXUU1yVEZOczJYNmVhMXVOMXlvVFh5eTlpTE5mN3hlTjQ4dFd6dmhLblE4MUhjVFlWY2ZyVVpZazI0bGhlUTNRcERrZFVkU3BicUxQNXZaMlVjS2h1R1lWNGEvWnc3WlAxKzA3M2MwenRpNGZKQVJhdUJ2NmRTN0F0Q1k5Vkx3NU50OFo0NW5ZY0dYMG51QkpMTVR5VEp4Qlo0dnE3cDNyWVU5cUVWcUZVWUpMOTJlUzVoNnFvQ3lyQzR3QXF5blNMTmRMTjNGTGVQVU93MnVNWUJUTWF4ZW9ITndtaEVKbFNOOFIrSE9STjRzSWxZcHdQc2h2NjZLVHRoMjE4QTVYU092VWpoV0cwM2tJUkRKZGpMc1A5TzF0YzZqRDJTWEtaZy9xL0pIQzUyRDAvZ0VCTmJjYTI3SFR3N0NFYXhGVHpqeFRENFNDN3FtbXhGbXZtWU9aenFOWW1EUGgyZDNzRmRuenhSdTB1QkdIK2tGM2hZeE5LUzh2TmtTdHBSZ1NpWFhuUDROcU1LUTlwMEh1M2d5T2xJUEUyaVJiak9VZ2owaFVyeFJCZ05KYTI5UEhCL21KRm81U1BSOXpLS1lpK0FRajYxdDZYMEZkbWZpUVRxemFybVVzVk5SaUdjd2NKZE9ycFMrV21TVmk3cXl1YzJTaFhWN3V1dk1MQmlmWFZKUnVoU1pwVER3NHpZbG5iaHFFQjB5a1U5d2w2bmgyTEwyeHNoWVpNOGVqQ0hvZWNkTnFiNVpHSjVuMnMzZ1MrWmFxNVI0Yncxa0VUcXpybndHUklTbnV4SUE1dTZuMXdZV3JvYjhNTTB3SVYyY1llL3FYcmRQN2ZuSmdlS2paTERLNXFSNXlLU2U5RUlnSjVnb1hmb0M4OGlWaldDN2lvSWpkWWVmVnI5R2V3TnZNSGdXWlIvV3puOHZuWWRlZzQvMjhLQ1kzS1ZlS09BaWRuQmxqWE02L2pyVVMxWlFGekxCSzhXd3NqcXJFYWx0NVVheU9nOUh6eDNRQjhNZXdtUWVUL2tHUWRyOUEwOU14YmtFT25ZTjN0UGx2eDREb2RsdGlwYmxtbjVESm5LUjMvMWIwcXBVd3ZJcGtEekExZmQweXFxdGFYcDg4WHgwc3hNbVREbWZtTFI2QXJTWUpwUXJ2SU1GSDRqT05tb0tBVG03NC9zQ1dzczkzdkVkQkw4alExb3Zia3FzK3pKTkNHSTBaejk1OXJ4eE9NaCszM1E5UmJYY2VFS1p1YnhWWG9SRFNpOFZZTi9SN29mMExmZHV3VkhoQ00rODBFRUxsbUluVTQ5dzI4b1czdU5nNnFzdUxLaVNGL3l5MlVIZ3dLR0duaUpDb3lLVDV6UWwwSi84amQ3MHJrOHBYRGV1NDNmelBIMGdTZ29qU0FvSCt5a1hJcTQvc3laaFQrK29xQWRHMnJlcEtQclJvZGthZVN3NStxaWlXZkFOb1Q3WTJCM0JlU2VhRmYxVVA0VHRKTXhZaVU3aFdzYjhxUkRvMEVzem9JSWZJUE54clF3dDg1a2phZTR2aWVlbkZpYTUrZGRCVkE5NVozRVQwMlNNSUZENlVOTEVCMDcxaU1yS1RkOThMa0lhc2NWb2tuTzgwUWZNNGJpK09MWUpISnNTN3REOSs1aDE2aHFkeUdwVG9WT2xQU2pzRFczdkY3Z1NNSXIzSGZKSGovU09sdXZzSWtUeEIrZ1dDVTljMzVhVWJiRlJtOTc1MHpMVTNHam92dy9YVUxaQjBQTitzMUNGVW9lYTgrZlFxL1Btd05mMW5QS1h4RFBuVzQ1bndJL3RXRE1jR2RtRnJnbnVLTzFvN1N1V1BHWHFIazF1T2NEYW9rZnBwT1FhdENqcHpQUkhGTXp6TjVwZ01aaDlMU2UwQllORFhoKzhpR0E2eGxUZFZzb2NpNWszQ3NnMVgwbWNvUVFaVEQyUU1JZzIvS3pOa2ZoTEZZQ3RFWnhPdFZqT01iam5PVmMzV0V2bC8yK05lcXhRN210TW04YkxyUXJhTWZHbVhUeVhTZ3JnanJXVERGdVloaXVOaER4NENVcnpPYk56RnVsV3NNdmo1L0RZMGh3R1ZJS2ZWTW5QK3FMYU5LbGJ0Z0dSSVdYNjdQVitOeTZLOXRla1JzWVFRem4rb3lDcGNTa05OOE45L1VqRWdoUkNTdGpiaE1CQWIvUldGOXBFdEJOaHlyTXZzQ2l3WlBPQ0c3Nm95RUJSOTBGU1QyYTgyMEZTd2FnTlNDQnpZY014cS9WQkFYV2ZWZEtDeFQxUndvOWdEK255dTZtVjEzK2dRNk83L2RMQmZweWhqYzZTc3E4ZkhhSFdKSGJLeUNrUVJ5N2JMV1dMTUQrczFIVmpKdGJpMVdwZUs3L2c0S01ja25zdXdBRnAyYmVyWFpyR0VrRFdodUFJOVVDa1lyem5YcXU4NWRYRUZzTldSVFFwdFZFeWl2RW5JL2g3YlFEYTAyM2NDSTJWODBDWWFSSTdBS3ExK2hNMkJNMzcvWis3d09JVVkxTDhxaWZMNFFqaFJDbTBZOXdvUTZGTzFzeXRIbVNkMDEzLzloVTZsanN1Rk9uTVE1QVU5bjlIbUkwVk1RY1ZKV3I0Q3lxcXpCZXJVKzlncVdQUloyMUVxeUlOSDhJRS9lUE1ySUxvNjJWNmRFcFR0U0FxUS8xZDRiZ0tFVGZUekRsZjA3ZFl4TzBXTk1JV05icjFsdlh4OUo5V2hXSzNLSnFkbzFyaWJ2cXJjam5yMGJBbzR6K01nN0tUYTVadFloL01peWJrQXZjRXpDSGV0VlpTb2psQkh6dlVJTWVJcnF5T2o1MDBYVGZtdEpGYjlHbDJ4N29QUzd2MHFlZEVidTVMV2RYQUhmNmkyN0x2Y3hrT1NMVHpVYjlSN25yRkpDVXBEb1hGeVVQeGdCUm9yYXlraW8zanZWY2dFcDJhMm1mNDFyWFpRRE5pV1BWV1FUVm44dE42OENMTG01Mi9pb1M3dk9sWURlWXI2VGxpb1dGVGdSakdoNlI4TXZzWEVHRWtGZUpncDcyWnpoaE4rbE5zN2lLVHFrK0g3RkRkU1B2TFpWL0FJNXNvSml1cGl1c2xtY2hGZ281R3I3SVpxcmpqUDNGZHFnNFRnck1OcUEzbHdWcWcxL2ltRXJGMWZEREJvemJ6NXd6UnlNc3NJakMzK3VjSmowM3YxR0EwbVduTHY0M0t5Zlo2TEtBcm5ydlpxMkZQUWJ2SUo2VzJHZ0RCbmFoWXJhZ1ladDZpVm56cHlWVXZaaW9XVnpHVXY3MjhmNGNtWlNETFFhOVgrVlBNc01PbXFKbExPcTU0WjIxdzA3ZGRTOHNPMzJQT0gwbVovdmZwczFZQ1MrajJKV2MxaFZHUzBBNFdmc05vS2ZTRFV0ajF4MWdOWllDTG1OWE9IUHNoOTFUd3E1MTZpR2tvT3JHcER1ZEZVVVN5WVRVV3JZenFYNDhBRFJSWVViWS9HTFpGY0pWc3FaTU9Ec2w5M3QwYXQzbnArMDJFRTZWZzN0TUhDYUszdVd3LytTYnliQUMyWXM2dzhmeitBNWRVT2lUSzg0end4RkhDMWk3Q0FxWXdaUmtyMEZuTzJCT3RBZHQyUy9KM1lIRWQ2V0ZpYkd1VHNEQ3NaV2F3cDFoVzZ0U3ZvWStMQ3Q1dDltV3UyaFR4TVFDckpLcFJOTnVzNEt5NEFOZjhwVThmWktVMlRscjZxWlA2TjRGanIwSEM5dUVYWmgxQ0R1Q01SZ2h4TTdBeVNhWXhkTWZSdGFaZHhSYnlrQWtCVmRYVXFKN0cwWkYwVTBYcEg2ZTNRSDZ5bUlUdVlBZUFLQitlNUhIczYxZWliOHNzU0VDcGQ1Y3IxNnozdkdrRlFUYzFHZG1uUmc4OTUwOVovQ0k0Q1VTTEpFS0J6Y3hiRkoxRlVPRUZrN09ma3NZNU10b3FUR05oVGRML2xnL3h3M2ZYVGUvWHRZODliSHFkbTgxc0hQU01DMGJsVmZwNXd3NndRRHNCRjB5algyV08ydmJkeTFtN0JQdE1EMThzaWx3VVhTT29YdW9ENE9ON3JSeUhBeEp6Ni9YNUtvY2tEeXl2ZGgxUUpBa1BzNGFpc3hSQ3BwOTR3dVNpWDVIUDl4dlViclRLUGpkaS9HMUJPMDRjd210YVZ5aGxmUDlMWGlkRHV0YkQ2SFQyZU5YWkFzWTQveUJDcDhUT0tTRjVyWUN2NStlUnAzajVITHhJd3JRVCtabEtmRy9Cc3VkekpPQ1BUTzI0WURWTUV2Y3dGbHlqeWxqMVQ2OHhqYjhTbmc1bTRDa3JnMnZnSjJ0TmM2TlZNck1wOS92ODR4WHVmcE5uWTIvQVIvS3NVNE1mYlZJMzRGVGNUV3ZzSkxERDdoMjlpTWlkNTljVldYbU14WDZXUURNR2c0eDFXbW9KN3drQWhBTE9zbTZnbE9nMDlqQ1p4Z2t6UUZIZEZvc2xtVkRSWkJwaDhORmt6UE4zY0dVVUNWK3I0ZXN2T1FFRkJ3aVJrdk93bUNveGhTT1dxNjFyQnkvczFyUDNWenF2dkJseHprNlBINy93WDVJUk55eWs4N1B2L1VXVkpSSE43dTN3Skp4NjFFcUxSVW43d1FPWUQ0aVlwRWljVmdGTC9IZmQzRFpHYXJYblZrcUNZVENhamFoYURCV2JkVUJiNW1kTTJPbkhuZUVJN3Y4RFNwdXlGN1hwYkJaM3ZjL1JycG9rVUJ5aEhTR3RmZTNYNjd4SDR2a3NMN0FTeng1OGhzcDk3UUxaMHlIOGFDRkJBMTVLbWY2S2gySVdYMnROVDBURVRxMVB2Wm1hdW02QWFwT05nN00ydWdzVkhwbzhDQlpwSndFL2plMnZJNlRZMlg0cUZ3Qk8wN0VGZnAyTVdiUjlMbkxIQVNjY3ppTTU4d2l4UWxGU2ptYThGTmRsN1QrRmxFYUhRcy9OT3F1M0NLUE1oMFhjdHpRVS8vUTRpbjdlalNYQ1hqMGhLSVhFaUJvY3VpdkNDV1lIUUJXajVyeXM5WlphbkdXNEZ3dXBJRnIyLzlzcFdKRDM4TXN4R3BXUi9jRTk1KzNzNUFiaFp2Z1hHdGk4ajlMYmptYUt0b0pyc0V1STBSNllxVXlHZXlVMFplWTRST1k2b2oxZWNKWlhpWERYSkc3cEVKQXdmVUVVOEYySFVxWkdvV1hScmRvRXhJcnpSNG85ZUc1V1NwWmhnQWpJYTIwVWZaS1NZZzRWRmUvb1Q2UFR4L3dVTlRpLzhWYkIrRVNaUEk3OTNIdHFlQU5MamtoWDZvckZYM1p2aUZLeE5FbzJZNzVSZkVHbWo5ZnJnYzFJcFhtcnpkWmV5anpWb3hmZUI5YWdra3pyZUZLeCtZY05lbzBrcTZnaU1CSTNRV2djY0R0eGZkeGM4ZW9OWU0zc3hjYjVSNE54M3QvdXNVWFZuOUpoN2tMUXdEcTM3eVluUTlxNzFuTW5tdGpBbE5kM216c05XZTRPUnNZekpncTNtQzJkWWtxNHA0WWNodTA1clljbUpxMWVLbjlCRmlmcTNPOXROVnlNcHpIVEVMYWg0UlI3Unl6K3BHdlRyaVV6azdDV1VzNTRhd3FGbWFsZ0Z0bnAvd1g2bGRJd0ZhSFl3UjlWdnpNbTVtNDRNOEYvSGhOR2RDWHovZVVOTkFRVDNKOHdCL1BYL1NsM25nZnY5NERydkJlNlBnNXJ2US9jQW1VOGlaNWZoMEFlS29zMklDaEF4YjFPMmVUQklYS0ZDQ21PdjlDNDdRWXowdXdDTmZKZEFIWVBra0xPWXJ4TkY2czdNbVhCZjlHMVdIQ1paN3YzdmpVWndaUlJiZVByU1o2TUNQMmgxT0pvU0lydzVzZzVQTWttZkhRRjQzQTNMY08wanNPWXdQcE1xWUgrR3o2TStvWVZMZWJNeEhsR0dwbERFUWRyWm9NRkUwZEZaeXNxMkJUN3ZkOU5sS3RreWxnNnVFVVhiTXN1Y3ozZHFSMXRlcktpN1ZOQ2J0N0VRUnhXWFptcXNJVEREWEdyRUNyN04zakdkN0RRSXpRYXh4K2g3eHpaQWdMcHlBOEV1enhKdjJEM1hwTmFFZkh0MnBIbEpaWW5tc3FyQ2VWSmg3UEhGMzdjZ2J4U0VidElqaEtvckVBNlY0SE81bUttZzgxTEhtcmFxSWhrVVUySHhTQllIaFVTSzdqK05aczlzUHB1b2lKMkgrY09LY2FyQTV5NGozK2QrY2ZTb1hjL0tGMHhGakZnQ1Q2VS9TdHRzMm1FMkozUU5OTTM5bDFuQmhJTStyTHJjdEdMODA5V0VxZ3BIblhTMktidE9PUVdsUm5MUU9Mc0k2cktIWVdVU3dzMlFBVEI2SVdQRUFXUzRQSTU2c1VRaHZoYWdkS2N0Z1Y3djNSWjluaWlFNWZtOGUvSU5Qeko1T1lKb3RsbnYxamNSOGZWWFU1OWltR0xJWkxQcmRLa2RJMDlXV1B2eVhjMWN6a0xXSjYzNnJrNzlOQ2NkN3FQMTc4ejdoOUR2dVk0eU9oNVIyMTRZZmFQOG1JQjBwNTlRMkVZeGhwZmQydlM2NDVrNW1mNVIxcFpkM2hWU1g3VUNxS2l0YmxhTkZPR3dVc3RjNnB2WENML2xoS0d2ZU85dTZDK3NDZmVGZWFhaE9LcHRseUZNUkx2SXBPUk1QQTdraHpmSW9ucWxLbHNmOHVhM3lFYXBIRk1qeG5LU0NtdU5seGRTaW5ibnNKOWJadnFhaDg0M1ZHMlFyZ3lwZGR3WUxpNDU5U0NsR1hQdUNGYzBRSUpTSUx3K1UzQmUrQnkvOHRrTkY0QlJ5d0tVK2pORVcvNXhaMXY5d3A0dG1adjRMeThQYm9zSkI2YXVWSk12YlU4MG9yY2lML0kxV3l2emhOdU9RZFJuNm9KMkg1REtMVTdLUFdOb0tEbmpEenprZ1pvMWprMXFuK1FvVEp1TVk3S0VLUHcyeXArb1RycE9UaTMvSUlYanJBTDFIeWF0Z3A3VUxDWXlIQ1E5SFBReThwZTBjWVdlbUpOanFObXhRNjhmUG96YzJQcFpCcW4rcHY3L2IwZFNEa3ljSk1YRGNkaGdQaU9sVWYwYTRHTDdpYkVLdnJySHlLSjZUMjBoUnY3OTR2S2k4VDEyb1BrbUdYSjM1VjA1d3U1bWEvYnRmbFRaNEpmVFhQQmFWVEQwQStiRGRyVkpMMUpJVU04Q0JKKzF5V2tvanQrd1cveGpzZ3l1YlA4YjVEMENWZkFBcU9tTWsyWVB2d3BWeDVLd3F0WGhqbkZmZHczSjZ2Y0tIK1lkZkNva2J3MjNBUzdNNUZKUTZrTjFmalBuN28yUTF6QkwxeXBmQVdoTUNUOFRxUVA0K3R5WnpHL0dRakNraWdzanBKeUNuTzVHbEpPcWtUSWtTT2ZLTDltWlpPSXRxYW5ySmRob085VUJrWEJJL1lTamlYcXpvOXNtNFRCOG9Pb00yVjU1Rk5lSFhxVk9sQ0VBQ2F6bWwrUm1GTEJxY2dJbjJkZVU3YS81MEdVUUtheU1BbXBVMHluVWx5bEEzYmJ5Nk1oMGp4YXpFWTJKMlBhVzBRUWUwRjNmVkNWS2xNYjNubC9YQk5MNHB6dkd3bUFQLzIwaDRmanRpWlVnOEE1OG5GSEZnMmJDTExITWRqdFh6TE4weGhpaXl3bHUvQkhqcEhoZEkwMjRNZHVFNHR2SkdaejYwRldMV0FoV2RtR1ZHVC9lbHl6YlNpUTJjRmx4QjB1eklLL1hWMkNmRnF6WjUrU3ZVVTBRdWJDcG5wczFtck1QV1Y2R1o1elNxbWZRdmtlQSt1Wm50VUMyWDZNYmduSFg2YjFQNHpWQXJZd3V1eVQ4aEo5M1dSNHZLaDJGOHJHWEJFdVRIZnB0dStPaFRmQ2xVaDYvektiaWRUZ1ZUSlZqM0x5ek90WkdVRHZZZ3Y5cTl5d3d0NmtzSitSWDdDTURPTUJzRTdrYks3SWdvSUpFbDB0dHR1RHphaWNTZW9hUndMUVhlTEZ1TU84c1hBSlF0ei9hQWgvNWVTL1B3dkhLOTVlMnZjNFFXVi9LbDhsRXloRGE3dTRjcUlUSG9IazRkbGM4QTBsWHV2OVBCUzRiY1VOU1lFNEpRczFGZVNOSVJxbjBXbVJvUzJINDdPWkpBVmIvYUNRVlg0Z3RpaWttT0NmRG8rQlkwQlBoeVorMjlHeVQ3N21oYlhqaEFNcENTSC9PVWxZMkIwVHdOQTdvckZlcmRtYXg3aXFzcS9yQTVFT3p2aFF3M3FyTlBXZXBpcFBoNzNQdGEySWRwaTMvZVFIS3FkTktjVGhRTHdINGZFcVgwcHVpOCs2ZHI1a0tONVFTaHo0VHFNSnhXcGRmSWRqU2M2WkVWRXE5MWt4NXBiSlh6T3lXekpKS1BYOFpMMGNrN1Z4Vy9PcTFVbDQ2dlVEV3poTXFmSWRkaUFXeU1wQ0xyZEVpMkZNU1picDRMbGd0WTlYazFEWlRkY0pBQS9QL1AwM0R3cnd5SWdpQjVoaTJTUko3Wm05T0QycURMZFFzMUFVUjY0UGoycHZHWXFrMzdTL1I0NXhCaUo3c1dqUkVnb3B5N2JJSmRldnJrZjh3R1A1amE3ZE9TTGZoREhtbDVqN3R0c0ZmeUNEWHo1N216eXEzS3JXNVRKRGkzRjh4K21pZS9DNXdWZ1E1SXQ1dkhaOHFhajJ1M1YraXdiSjc4aFhMU2Z4MW5yS1lNM1BqNFFPQklTYVFaYnltVjVBVGdUMEhCOEZGT2Z0Ull4ZW1uamxWWWF5TWVCVzVPekJQZ2NiK09tcmdjZHVGMlFDM01vTGpiaE1LTEpPakJITXFVZFFGTzUyNTZUbHdpZWhhdHdrWmRxeGNaQzlOakZCMEVodFF2MEh1K3hFR3NWSTVWcm1lOW1Mb3pZRE00Y3FFVUZ2eGZtcjA1K0pXUFFFSkVqdS9mTXVTQTdIb0pLamM0UWVYOExKcFVhSVNKRXMyZ0RQVkJPOXVIV25mU3ZsM3AxV2ZPL1krcVFDMGNDWXFXSExRUDFhN1g3c2hHRk9VUjVuSExDZ3RLdDYrT0IrQkU1bnR2cDhzajlCWE9CVVRjdWIyLzNoRXBSTkJ3c2ZWQmc0eEg3R3dvMEVMTEhZTG03aGpXQmtyYUtXZG1zTnpwM08vYklxckE1YzcvYVpDSEU4YytIQXFyZ1JGcWZRdlgzY20yeHE3Q2NCbU1iZWplTmVtY2NwUnFzemMzeUovcjczRlFkczJGSW9UK3plNEtXRHc3OWdRZkkxcUVkUDhUZThXMWNXMStTR2RxOExRUk9vNFNLd0ZVSEZaTm9NVi9KL281L0NDUDhQVjBPL1QvUkl5c1NFRTdzeDZzYTRVQ0M4dnpmN29VejE1STcxZWVXNXp2Y2s5dVZRZGpJY0Y3VlBRRjBTVTByVHdTSDg4clpVNEVJSDBrQ1U1ZXZjL3JoYkdaNy9HVXlDckFsK1hzLzlTdEFQWUl1VHovSXZIR0FtamRGWGlpZ2FXQmdQVDF0VVRGMjM5aDJ1ZmswVU9LM3NldFJJR2J0eEJ4QmVNd2oxMkVJdVJiMGRpeThJdll3cVU4dzd3Zk9XL1o2enI2MkZnb0E0VHBtTmdBR1Y4Yitob2pZQUxJRlNjZUFJOTRJcThNTHN6OGQxUGlSS3NQNlNRQjNPZ1RMbDNmUTdWaEk0TzdYNkpCekp4N3dYZGJweWZTWXlLS1F6L0tWUjBFS1R2RjFKd2k5T01Mdjg2VlR6cDdJTFU5ODJsWFNkVEk1eEQ5cVlBekxoZUdWY3RIdnBxY0FKM3hYSjBEb3FkYlkveXJaL2g4V2M4bGNWbXQ1bzVUbHVtb21rTkxFUnRMWlZ4QTBSOENvQWU1NTc3TnREazF0cmxLbUluSVd0TlBhUG05S1dpby84ano4c0hRRGdRME9QcTJYT29uazZKZnB0Mzh6Wi8ya2oyNlNyN25yMjdJRlJHeHJ5SnlzNmx2RmRTdU5YSVY3eDhkMVpyaTNtdWE5NWNpcC94VFF2aUVZWDR1OXpDZWZOcC9ieXZodkpUZnowZVBabDU2b2xUeDY5azNKT05PZjljblljY09sbUI1amFZVDFrdk5Vd1Q1QlpSaGgrSE95TzdDNFRrcElsUnRuNkN5c25VejNLWnBLOWkxbHhtUzVLcStETGQvV3I0TEU3cFlzemwycDJ0aHFXc0pUbFFrTE1vTmZYTEgxc1lUaStFcG9pM0hNWGQxRE9na1V0VzVMWDRYZWJiMWZoZTljWER0eWVCODdkWWVVQklIZnUvdFdWYklvVncvcGZGc0NnM0Jkc1RvRStVU3pLRkRhcVlpOXB5Z1VkSyt4UjVaQXhlY2N4cE9QSmVwL2pxUkhXZjRTN2p4UEJOYnY3MEhVS0pmTTgvTHhGVCs4Y0pKRy83S05EV1B2bmY2UVNieXVKamJIcERWdHp3bm1XNUFXMlorOU8xUjNTbGJjanl3dzNvck8zZ3ltK0VFMHhHbWJ3cnMrTjJmdW01QjgrZmU2Uko3S2t5MThRZDAyVzVKeC9MQ3pITzM3MnE5UW5PMjh6YzdJQytsY2toakF1WjQyQ3U3WWUweFZIcDRYV3ZMU1RxZWdMR3FGQWlXNDJobks1NFJJaFd3WTZxYmRBeVZEbFpGT0dDV3pUQXk5TG5ycUJiQWVhUjlxT2kyU25sYlByTm11elZyNDVxclI5L1duZTZ5bTZoclBEWHQ0Vm1hVGFWZVNxQjkyQmtXT1hFa1NtRkNjazlWQVljNWsreVlYNWFKUDl3NUVQV2JVWlVsTEtzRzl4eGt1Vi96ZDBrcm9VZ0hBUk84bW01ZmNGTlJRd3VOR3lDaWZkY2FNcTZkdXMwQXNzNkFjM2c1Vkg5VlVzRlFPcjJLcjQ1R1lWSUhqaFg3WnoxR2RMbG1tdlFGWjgzbHpEeklObmVhbm9LVmFGRlhJV1cwUHM2eTRHNUcvcDd0MEdWN1JncjFqS0dMQ1l4VUh0dUR0U0tscmIzdGp4Uko0dUU2UUIvRldCV3IyVXpvK3ArSVp3NXhudlNPc3Q1M1VhQ1U2MmI0QldSRDhoY1BRQVpzL0srS2thL00yY2l4QXJmdys1aXZDNzFoUlM5cGFsdFBuQkhBaldZMHhXZVlGSmRqSENUWDhONm9yRHg0UjZNY3k5NFVyQzJ2NmRObG5jdmIvOUFTTHVwUlVvZGl5OTBhUUdHQXBwZUQ5NDl3cEVZTDJDUCtuSHBGVnJrWWZORUF5NXhYVTBWTlJqUHRSRW10ZTlTRVZZZm9qQThkWDJvcVg3WnVtekN5MDJBZW4vLzJRPT08L0JEQj4KICAgIDwvQklSPgo8L0JJUj4K + +#BioValueWithoutFaceBDB +BioValueWithoutFace=PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8QklSIHhtbG5zPSJodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXNvLWllYy8xOTc4NS8tMy9lZC0yLyI+CiAgICA8QklSSW5mbz4KICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk+CiAgICA8L0JJUkluZm8+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MFo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IFJpbmdGaW5nZXI8L1N1YnR5cGU+CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U+CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0+CiAgICAgICAgICAgICAgICA8U2NvcmU+NjQ8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk+CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI+UmtsU0FEQXlNQUFBQVdEYkFBRUJBUUFCWU1zSDVnd2NEQjRQQVZrQUFBQUFBQUV4QUVBQUR3SUFRQUlBUUFJSkFBRUI5QUgwQWZRQjlBZ0ZIUUQ4QWM0QUFXQmFBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQnpnQUFBUHdBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFEOEFBQUJ6Z0FBQUFBQUFBQUFBQUFBL0FBQUFjNEFBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUZmWWdBQi81UGZHeEFPelpINllyNnU5bisrbEtwZ3ZleUxHR3piZjlocHNZSGlHTlNCK3htTWVqV09yS2d3S2dXTDJTbXc2ejZ3SU5oZGdJQ0E4b2pleEZBQ1dON0tOLzBhM2tNS3Fnd3VLNENBOFFBMVBJQldRZkE1bTN3RmxrNzZTaTg4L0FlQUwxWmFNSnlhRmt3Q05wY0xCOVJxbnBNZGw3Qld3ZGJMdXZHdGpRcS9nTWRVQURnZ3FnSWNIZEwrSGxqeXpId1hzcVZ0MzM0ZW84eENxQ2E2SG9qb29ZdnZQeDdOZXIxNnA1azFCMnN6VmovblJoNXZkeTFIU3A0Mi9BSFZKZ0M5M1huWW1yS1cwY3NZVE9sRzBVWm4wMnVZWC9vSThTeWNRSzczNVhTaTJ5ZnhuTHJNNEV0NExGNHZtOUZuZFFad2szSkxCSmdnOStyTHN3WUNxdWNBaWNrcFArcFEyUWMxWmFZRlhoNnU4ZlZLUUFncVdoT0FYc1lBNE9Yd3dyOFM0bUpHdFZ1azBXTEZUSXJ3VGlGOUJXWjlPRkp0MlB3cXZqTGZtUENRUG0xYkRZenVlNThtU0VmdWk1bU9GYXVZQmNuMnkyQ3Nac3UxdkUvdVdRMmpVa05RUmpGZHRyOExwV3RVSDlhaWpISkVtQnZxMXdReGVIcDZoSEhqaHBUaGNhcXEzU0RicVF0MUZUVzQvZUx6U1ZGQ09qRnpBclFpYTA0VlcwR0lORVBlS3BBOFJpZEZKNStnTjh4MUhpU2VYYkRqdWlJV3BPYjZuWXlYbi9IM2Q4eHBvdzhaM2pkMEVpaFQ5dlZJbWRlbXRSYlF1b2RhdkxLTG10UnladDZTYlNwWVBBQ3pSL2RLQ2t0QTBIWSthL0wrWWIvOFV4WTV2UXlvZ1QycFlwY1B2OVpqQ1pOdFNiS0F1bW1EeG5zeUUyS0d2RHVBT00wVVRObCsvdXJPMFlCdE5teG9QMWsxbERpRlBmMS9yVkIwbjdnU2hncHhnSndtQ0o0VE5sMFI4c0s5VXEwRlFtWjBLTExCdkJremZuUWVUSnhIaFFrVUdLMjBZbkMxdjZRRWpjajVUSEdMcnZjd1Q5Qlh3STZ2Nllsc29KN1lxSUxZVGR6VDhja1I4TXNtNGkzZkhINE04dmNOWWRCOTJVVmI0NHVDb2RoREIyVTYxcmpZNll3SzlaczBhcksydG1XeVVvL0FCN2tsMWpTZFZobHpEcGxGdUc4dThNQnFQb0xXdU9Cd1d5T0o4WVFOWmZya1FEaGF5c1k0YTEycjVSTmgyakF3VWJ4UU16bEhYU3kwcm05cHdHMG9OeCtJaEdQRkRHZEJLeVU1YkpJZENWeCtNYnZicWRicGlQb2hKTHRDeVBjNHpSNDJZTlVYN29qQWN3VjVUcDJ5eWlyYldoQWJDV2FjeGJBYzl3bTQ1ZEI4d0ZNK3hmakFEa25kTk91SXh3eHRnM1llTzl0ZmtTWWlQLzE1UVJXRkU1NnB1cVBST1FvZ1dpcUcvcHRMOHc4YWpGb3BzOVAzTXp3L2ZlWlJ5WllLdytWZ3RiNTBVdkVEOFl6S055Zk80ZnhLbVZWd2I2L3pzUDZCOE5ia2tobEVCd09qNUpORkRYdklWakVZNFZhUXk4YjNqc3FtcDRGSFpCamlWZUlNTmNOd0RIUUQrR0RzZi9aSXhKeC9mSHB1OTFpdkFFT1h2UTVaQUhPYmM0MXFpZ0RudUpLOGNOQjVFQ3luT2pqRnBXdDFNQjhpM0FsdFFHZHpQQnViUmViNDhNVkZGNzgvY0ZlcDR6K2FYQlhaV0xDOXo0cW1kcFNnTXFJYjQwRmNtd3k3VDFuNHJEaHc4Y29OeDU0THNNRmhuQlA4aHQvS2Yvem8yTTVpRFI2TGlJRTBTeGo1bnVlYmRkUkplbWxRbE1DbGFGbDlvN3VyZWdRZTBzMC9ieGNzaitjUFFyNWQzRnoxQ0JtNk1GVmhoejV4V1NXV2UvOVNUVFpPNkx1NVZZWi9LVTA3Q05NRTErcWxaejN1YldQRWpjWWxTL0VXdkFLOGJGYmZuQ3VVYjdhbjZPZjF0OVVKYWlRSkVBbWV6aVREVUozRnE1YXZ1TVBTZm1SKy8ycWw4QkZZRTBlek5ObmZlTEpmTytySHFkT3lqeEIvUXE5V01WQVd0T1VjRm5HYkNHdDRsWlJJRHEvZmZ1WHVWdk0xcTVKL3hPdWt2YUxuaHdkOXhBMVcrL2x4MnNFL1JnTnVzV01tMjVPdmlON0o5Tm1MTDR1UzNiem91VU9XNDVwaUx0cGxidDJIS3JKTTF0ekh5eWR6ODJ2TVRvZ01qYW1KMDBSY3RabFV6RDJ0SmRJM1hEOEdueWdIMUNTaWhSdHVvUWNOSWVrenlma2htd0Nnc1dudjRjbEZ4NzMzbVBZUVZBMEtXRFlyeHE4aHg4ZkRNZ0lvQk15V0xmU3VuOFE5T3ZBdE13NmdDS0N3RGVuRzhUZUZVK3R3MGZPNGR2dSs1TG5MU2lvYk5lbTZ1bTdhYzNLaE4rMUpONVVXV2dxNFdQOHFBYnYzQVpjMFJOSFRYcWoxYWhWekZNbG1YWEVkU3daUEFQWFRFOFVNNTlDVFVOdE91VkJyY0RSZEEvYmpRc0hJM2VOczVKSzRHVHF2a1Vud0p2b1YxSGVYcFlHdjFaSkNsaUNCWVVJOXFydGcvU2NCVlhZVDZXY1h0STRWdVYzR3g0Um9aR0JrMk91SVg2azQrcDh0UVc5L29aV2JzSUJQelA0cWo4SHhCeENUWGJocFRzb25BbjEwK0VsTlAweDhLOG9TbEcvd0dyVjFIdVRzYW0xZnRqSjZoWWwyWnhvckxmQ1d5OU13SEZ1eDNSTjI5YjBCTTYvVEwrUUUxSWpmbjdGTUlGaGQ1Q21JckJHeFZlTFFCNDllUDRnMWYvQXQxelRpRlh4MXJlVVVFVk1UcTE2VkFlMlkxWEF1NEpBZHhUUjZWc0FYZEU2Z29SYlI5N3Z6SllIbm5oQlFoQWtHYm54UlhWaWxFN1J6bStwOWoxNlRQUW1aU2F5Z0xJc0FXdy85R0kvanp2TWhzV2F0QWxvZjhjY1JOUzdteHZwcVJYMS80UkJoM1BnTXlMTVpOVXlHdFh0SkJmVnFpMElJa25uUUt6KzZyN1ZNNDg1b0QrWWNkU2pzcUlvM0x0cjYwRkF4Uzdxa1c3MGpuajcxYjIvYTNibTA3cE9BeTk0QWdldzU3c1B0SnpQT2h3QVZMdW0xTkdrdkQwenkxN3lTL0ZZSXdlVkM2VU5HM2cvYlVyVDZMVUhZL3ZpaXNPRTB3clZYTnJCNC9yQVFxakRYYVZOZENMSFY5MlVQaE4wOEZxR2dYSUFtODltNmM3Y0EwdHdmaHVxR2xDamoxQU8vWWRkRTdYNEpCaHlKRHh0bnNQY1FwVnl5RkJuZGUvOWl6ZkwwWUpnNzFoK0dlcC9ScTBZVDZjWUhjZ3QzWjRzc3NiMUtzL1pMbVZjbnkxQm5QSDNjU2JQL0tUMUIyT1Z0SGkxZG91RkJBUDhJTlBuQ21jY3pIdWVoNldmcHNHSDdYNUlWUWVKdm9lemMwL2lzbEdGZ2loRFpTQ2gyS0diNkR6M1g4R0pIcE1oWWd6K1pkT2JvK25zZERVMnhZdm5qRjhhV0Nzbnhxc2diZG81WDV6Tzc4VjNDVDhjSGI4Y2pxYzgzdUg5TTRuL3dZZmd1UXBjaEQ4c1RDeFJ5MG12bGxEMXZGUFNrWVJaelJnSS9NTGthM2x2QitOczJ0QzZ4NXA3SEorWUlDbmlBNm10YWRpY08rVzBWcldRTE56ZmtCanhIV2MxUGpyeSs1d3dQc001OExCeEdxaFNiWmdybXRtS2c1VlpUNVhxNStMSzNQNjhDYms0Sk84RFBPQUZ3aTFWbEhYdnNMMkUycUNEd3VOYTRzMDZvTzdvSVlOd0ltL1dLN2c5SWxEcmtvMkVJMnFwbUpQQ2ZNRFNXTVI0c1poVjdrUkdVblA4N2NMWXQzdlFjaXZDYy9yRFR1a3BoMVhYcVlMcDZKTUdoamxSaGxjUlMwblNHSzlGSFduaklzeDZyZ0RRa2N3NjB4dzc1QkJOSTBRSU9OUnE3THdpRkM1QzVTWHN4NGltYmNPdFFWL2lBRHlMSkxOUnF3UG0vbHJxb0NMMFVvVnNyK01MUjl6cmJyV3FmVm1NbDZvMEpyVElqaDl0TGh3ZkREQWlpVEdzUUpVZVM1TCtIZERHN1I2MlRBWHJCUVVRbXNlbVEvZGJPMXNpOTJNU1V6eEV4bm5UaStjQkpEVGlwWURvUENkeGlqaHFEOGZ2R0lJS3kvTmJ5YjdnNndBUm9WS0xJNlJ5MzJFamxjdENKZDVNejU5RDRBa2hDa1RRS2tuSjQxdTBFMUE4WUxvTVlGU1NGWldJOFUxUjlRSG5waFFhdUNQS0w2MnduK01uRlZjK1RucDNGcWVGU0Y0WkJuSWlpaXp2NTlsbTBhcytGb0dnOFZ4anY5bTNkLzNzempmaVREUWcyNHlteWc2clFjNDhSeGZZUUFURjBZV2EwTUF4dmlkMndMZTlpT1lqUjdISysyeEhvemNaRU5PUmFXMlV0VjRGZVgwc3JPaWF0Y0NpSGROd0plY1BYL3MvaTFLNlJqdCtxZmtvUnhtYURvZWdmTnhlUmZXVmEvQUNIOG52bVNEY1lUN1hKL2xMWXBkTEtNbWVJYkhvWkdacE0wZE1FT2FCam9IdVdFeWxSMjUzS0kxeDNRSXJEZEhnK0VNMHphTUNLbFgybDVZbEp6SGlpejh1bzJWQTJpS0ZsYSsrZjI1dHVidWxOVVpzaWY3R2JvZXdVMkpZUk9yWUExTHVXOE4xSjlaVk5QNnpKTDZpeVBONG14dHl2ZC80WjBWOTcya2lQdFE4NHErWHNSMk9LUFBlK0MxVzliU0RsdklmSEw1YW1lbFUvTkZjOUlEQ2Nyc0NQZDlrRFdVL1ZyYVJSTDQ0eEM3aDNIaUlWTllwMVhkejBDRnIwUW9LWFFidmhuckV1cHBXb3NHOUhFdjVTbDZkemRjNklrUXFKTGtmMjVDNGNZV0N0VDgzbnJOc1JoZDIwWXNBS2N1TTE2U0E3bVo0UTRyZ3lIeXRIRlNES3VUbnpUNG9ucGFqR0JpR1JER0QvZEd3bG5HNDY4WjBURUxCcEd2VERXbWlrOW4xTGtVaSsyOU5yTFVVUmJZNHNoNERZbGIvd1dveGhTRFNXdXQwZ0ljajZyb1Z3TTl2UjVEZGNnV0xqNjhxZE9uZWhoNmJaOGFpdFlkYUR0NGRWRG1oc2JNWEQyNkhGSnVIL1ZDSENyMHZEZHBrbDhmR1JVYzJ5ZC9QcHl5QkVnRDRpZnIwd0FLL09odFJpR1I0aGFQZVROa0p1ZXNUeU1CWFlROVJLMlIzWlB0WU9aemxOMUVFQ0FtYnRDMlIveUY3MkUvcFVSVXdKUkJITEpFcEZnaUFrNGI4YnFjbWhZRnpSTVI0R091VE1xUHg3eE82RHNYM3cyY0t0WUlBd1huSmFrSVZCWmdudHlhcTFjYUlwWTRQVzVRZEpIcG42WjRXdnRrTDhmdkxhVUltbDdPQXVEKzJERnVHTCtWalh0L0pBaHJTTVNzMXN2eG5PWkU2ZWdSVkdlQTcyTFNtOVZkL1NNNElWQlIzbUJyRDE0c0cwTTd6SjBaWjY4elpySE1qL2NwMkRNTllUT0FHL1c2NldJay9rQkdkaDE3S29SL1hBNlEwMDRPbFREcEhNNUs4OTB5ZGVscm5BbkU0U00yQ1IrT1lJdkZrL3U1WFQzTkc3UGw1aklQeVR2ZDYrZ0NJYk12WmhjSVdHZTJhQlZSMjdSR0RVQkRXQWR1YnUrRUpmcElqeEs2d2FCZjk1NHhadTAyWENTZk9oQWJSU1hVZXZMc3dpMjlHQVh0d0x5NFhHZURjYW9nVzFCd2dpMENhTHlibWJFMGdLSGZyRTNTVUhFQVI3MnpKYXFqTTdnWEg3VFdQZ3V5QWRHUWEzbm5sYThEOFJtaXEvcHZMOHZ4Nmw3eG84TjJQbUQyZkVOZDlkTGJCS0hHYkZtd2JFaGlPc1p6YS9PWi9OMFFTWklqOU8wL0luR2twQjJYMWlDYzk2bHNoYnJwRlY3UG9Kc1RjME54aEhvaUxzYXFwMXNSdUp4SUpxek1rVmlQWjBCaG16OEx3K1ZNaWhaZDBsd0t1QUFDUVFNQ2ZxeXlyNWFMVUk2WjRZak9McWNiaktwL1RwaDZ6K1c1S2RjWXhSdU5RR3UrTzR6N0Q2d2dyc3ppakpUS2t4a3N2Ymk0aktwOWpnTzh2SVdRNWdDVVpOaXo0UW92RUxZN0dyQkh5dW5hbFBhNklPWXFRaXpWMzV5M1IvNDVJRHlUZ2RueG1BYnd2OUNFZjBKbGZXVHdDandDUEEwSVM0a2JtTDgzbnJ6S0c5L0MrSTJOQkR2MjF0NGovUXc1VE01ZWhNcHA5bTFkYUNyWlMzS05wMVNObVk1Sjc2bk5ZdUVHREpEblZSOW4xY095TWtCVTNiM0RqdGtEbGtsTEVtY1lKbnpoczZzaGJWK1A3YlF3TXdVcllDdkVHdDBIbXFsY2syMDVEd2lTektCT1NwMDRwQkY2MFRXK2szOXcrRnJvbTk4U2FTMEppaHpwM2ZIMDYvTC9TSXJ3NWRMOGhvNTcxZVNkS1d4emRLRzJPemx0TXczTDFJR0RPbGFueW9pUnVmWEpwc1hncVBhRmZyWEZ1VmJFYVNlVVg3UUNNb2xOTUpTd082OFV3MHVhMkZyZEIvWFpWZ3g2UjRITEtIZTE1UnNzdUd5ekEzQjlhOUVleGJNdWFydzJiRE04Sk1ETUtjMnVmaFducys5dDlnYXdQOURHc3MrbjFCVnRYMGtKbWZneDgzWjgybGUrS2dwUXppU24zaU9YamtTSVZDdmlFTnpQZXpMWDZoZk5DbUtVaU1wUzltMG45ZExRanpDT2pOTWRZeXBDOGMreWRTVndTRThpYVBTNGpJeWRJL1ZBbGUwOTV0Vm5DTHZIVmwrN1JFanFxM1Jvb1dIKzFHRm5hazcrcDNIL0d6VlF0UEU1aFBoNk5Vb2I5WHNxdnA3LzZXNW9PMzBNY241UDVLUy9qbENiNTllQTlCSnRqcnZwaU01VWJQSVk4cEFxclE3YTNQSjY2WDRTUUVBYTYyREhYS2xBQXRSczIwRG9FejF0QlF3NVI3aVYyWjYvMlNwSU45SEQzSWZIaEhZK1hMNG1DOEdsQXByKyt4VXFkcTdRUFhBR2pJWmJKdFR4a0M5MmUrUHByTm8vbE9VSysrSUNSVS9IT3lOMnEyOUZ3OVMrUnlFM3FCa3lhR21pV2U0cjZpOHl3WktwaGdwQ1duU1AzL1h0TVR4SUtXRVFJRGNyS0xYeEUvTExmUWs5TElQTXJSZzYzNlVBcHdSK1RIZTlKSkhZZUg0QWpXQ252QWNtZHRmWnQ5TXJsNFFxRVd3TjcrZXdqeE9SZXlFcjllRjhscEtaaWQ5NmZvZ3kwaWZybHlxTmtscndCUFFzbk13RnpEbldEVHd5TWlFVHovR3lzN0NxZ3gyWldFUVhFNkdubFdHMUcrL09sVzlZeVdUbFE4QkI1eHdUdXRURHljaVlrWmxIcjdvL1FyVHpZMWg0YkY2UVNydGFqTHNDallTSHhhTDJ4T0hXY25lamJpSmRBc1orY0c0MlBNbjBybzFWZVh3NXNEYWoxOHpMS0ZYUW1ZM0tSVGxtK2xYbyt6cDRCUEJYN3pVYjZ6LzNTUDZVVlV0dExSVkR1dkNaN0MyQkZTc2V1YktuK0Nia2lUU0xUMFZray9IOVBiYXRya1JnS3pncjdjT3J4TVU2eDgxb2dsRGoyZS9wWjE4NkdlZEQzeUhiZkcxaUdtdWpqcFFvTEZXOURxWGs4eld6aFFObFBLZDBhdDN6OHh3eFBKTVNkU0VWTHl0WkdodURsbzZKdW56U21CQW5mWjNzTjN6REhjQmZiOFlyS2x4S2xNL3cveHhjRmhaa1FCaXNSSG9KRDZxN2Y4ZGtNOGJKcjAwME93MngxbTIvWUdKUDBtWTN2S3JlQitLblcveS8zTDc5WTA0UW9ybVh1NDdtSURsM1ZRUFVpNVI5NGFNZEQzK2wvSEFYQk1hT2V5QWlvNkpHTG95R1dGdDRSOEZHL0krblFwUHh2NnlWQXdzWThFWlhHYVV1S3EzTy9iUG5nSHh1TkQyNkpOTkVEN3R0UmQyNktSTVNpUkxEZlV4WHJ6bHY5YzhJMHdHV3RUTEhwbGRXMXMzWjdHdldTcGpzbUV0RjZFZGN1Y2ZLdEJZUTd4NHNlMWhPSm1vWUY0eEVyK3k4aEFSWmVIQnVNdTJmUTRaNTZTMHEzbHg4MzE3UGxDVlcxUUkzSXFDZVMzQUFpVTFDaEJ0WXZpbldoQy94S3BwZXp6eG5YRTlBWkd5eWhoZHpsVFBrcWZWbWw4RVBVUitPMVc0cEZmOUVWeDBjNmhxSEVGZ0FCN29JYldSTWpKWndxYllJRGY2TG8rVy84aEVpOUQzU1dJVmx2SXdCTWdMOEI3TlI3ZG8rY2o3V05HeWRzL0lEdjEvalZJUTVVYzAwcVJLaUpZaEpjYVU1UFd1VGhWbVJFWmhYa0I3cDU1cUNOUXNycTZ3QmNPemFlcHNkWVhFODRsL3NqZnJiOUp2dGU4QnVDaW1NOWR2LzJyOUp0eVkrRWI0Mm4yVk1ncTlKOTVCTkVZWVcxYnNtTjdLNDZjSkp3MUcwNXFXOHBhSVN2NTBkZW51Ky95NVdCZitDbjA2ZmtTaXhwdng3b2J3KzVZTjVVNzYydGNGV2x2Z1BsUGdXNVhTMUlsaWFNZU1OaVVZUkJ5YllURGxDOUNvZS85RjYyUkE3aVB2akxEQ0ZiNEVBUGhUbitVSW5HRnkybzhwbzkxUkFTK1hEa0U1QlkvSFhyWFBaRmgwcHVYMTd2NHRjNldOc090VEhSRmp1MllyZGE1SFo1c0ozNTh3cjlVL2M5eHdkMHhnSlFlS3hnSnNuOHlSRlkweUNja0lnREhxV2JWSWtVU2g5TWFlQWhlYmN1Zkc2YlRudGFNekFGOWlqMmhTeWFpU3pGQk1GMFRMT1ZXMGdYVjJIWmM0WElxemJOWVErRHVmSjRQWTR5d3RGRkJUOVV2NThVK0M3aDR5TGYxTTVFWCtPT1h5cjRhTEs5WUM5aTU4aCtCM3d3ekY2U2FRdGxPalBaK2s1WHVxV3hvcm1PK3hMRzlWbXNySHRIdlczV2lpS3RDeWJGQlNKUFJDWWlkM1BaNjJydENkeE5qNUZTem5WSG85djBENCtzWDhJbEd2cXE0T2xMV3ROdFFwZHJIL3pETGlua0ZOMHRTajBSM0I2b0FKMm0yNUNrTkFMY2xIK1Vuam9tRmgwWGdnY2thVkpwYWt6aVZhTGVJcmNLbEpsZlZITHFaeTYza3AybER4cjRRUnhMejdNMmtmYmR1eVZ2QmJLSFhLTUc0K1psT01hYXdzTnI1YWl4dnJmTEZITWV1b2xJQXpUNHQ2ZVFPckFYWWozZnFDR1ZXUTV5dEsyTmFzemJMbXZtYTFoRjVTOXJ3SGthV2pSdU5WenFic2d5MCs3b2IvMmZTQkpzU25BUHFmSmhsbUZaMzUxcjBjdEJQSWRUOGR2TUo0eS9xNnlJSkdzdlQ4aVpDcXMreDJvU0tXNm5zM1VtVzUyODVwOG13aHNENTFtZC9SSXc1QUFzTkJCL2VwQTl6MWhEU05wNjhtL3JhN0MxQ3ZsR1lNNVVXaWpkb2tUYzA2Y1ZsaGljZnhROXM1ak1JRUNXWDFCdnY0eDR4OG1oVWYrbG1SaC9rUTY3WVlmMWNOOGRPREMxbk5aSjBZM3JpQ1MrakJ2M3gveU9KUGwzVUNzb3FoVzgyeGpaK01UVU1sSHh4WmNKS1N2ejF4bmMzQ1pIMm9vYitJQkVaQ0FjRlh6bGJYQ1JtRHl2REhnbE5kM0dvbjBRamNzL3gwYlhCR0hBYVUrU2poNERHa1hPcVducisycE5rSlhrZG9UTDhaWkp0Uit5bC9ZdXBhWXhtQ3UvbGtmRVV1all6ZXBNN2FrU1FoQkVldnFRVDlYK3JVL2ltWkRxUHZ4Qy9XakZmZmVERnVVTkZuNU9IN0UybEl5RXBZVjRBelpYQmFLckhYMTVLU0h6dHBDVFpFeVdIUWtYd2VjQnFQamR1T0o1SEZaMzdsazRoOHVubVZBTERrSndyYk5vNnRtQ3hyQ2FmK2FvTVQybUthajZuQ0ZYQXFhZHo0Y1BkVkhqeTlHZENaRmppMEJYUTQ4YnoyWDZ5N3hUOEpEbU9YNVZWV2VFcUdEZ2tnMW5lNTZua09RK1JZd29KOTNsclhsODdUeVhUd3E0NWJIUHQrTWtTaDdlbVhIQmxkbmtOb3FaV0hhc0tydGpsSDRLNi9MYWduZVlHdEpsRU5BcXhxZG8yVUFMNE5kdXAxM1pmdytubnMwWmdSUFc4L3pXbW9wWVg3aG5xQXBLZ2I2ZVgzanFFaVZWZ1FUZGhJSnBRMUN3NmgvUm1MKzhwQlo0Z3drVHBWM0p3aVdNY3RjYlpaQlRkc3cydHBhdjFrUjNzQU83aDAwNDMvQ1hwL3RwVkRaZDZtT0ZJcjVmb3QxK0FndThzREFHUWljTzgwWTB6Mk1aaEZwN1RVQ3VhM1JQL0Jobk43aHhJaERGcDBhQzZ0SFJqQ0tEeEdqV3N4NnM0Rk83NHdGd09lYmF4cVdudmZ6RlRUaTk0Z2VpK3ZDZHA1bmh4N0drRzNMQ2hRVUVTM1h2TW9TZldFSTlaT1VGZEVKUzE5VmZGTzBXeE5wVmdPdjhvWWJpUVNTTTZ4N0gvUUpuQjhtalQxLzlzZWhmS3dRUGk3WnpYRFJyU01LaDRTYU1yVzc2WW9rTjhNeHkwTEVZbjVOQ0FpNktGa0VvYlBDYUhPNkVZdlY2RWVUZW15dEdTbHdEVmZicklxck51VTdNWng1ZjUwOFUwUUVlOG8vU1RsdkJjT0RpenlnQXZKK0FVQTBoY3JmZjh0TWYwU2Q4b0RNQXhqemNOZm80aVY4dU1jeFZaSUY2OEpTVXhQa1liZ3JYOVZpa084Vmcyb09rMFJpZlRPUGcvUEVmQ05OS2w2R2p3dW9zTkpwQ0tMOUhOdkRpcWtObmhGc04yK1RoZ1Y0dG1KMGhuOUpQdVJ6RWg0andPaDRzL2F5WjBiZjlaWmlocUNYVDBkd21ObzZvZDRnSjNuZXhvMWVOTWE3VUo5MHhZVFN1M2dvNHZPS04rallMNkJMMUpTbHF0RlJVUGF5bXRuRklYTEh5TU41QUxsVjByY01hTjVCc2crVjRFYTlsRUltZVcyZ3ZBT3MxT1NTYzNwcDhjeUlZbHE3MEY3WnBVTGtQbTBQQnZ2N25FUjhHai8zczdScXUzc3NFMDJRVmZITXlMZlVIZmZ3WmVhTWZqNmoxWmlYZWNtdGRFNFd2ZkFnbmhPSXVWN2h0U0Y5UkZiVlozTnhIQzk4Nkk3MWhrSlBqTW9BNE9CaXZoSU8rRGxhTHNJbWYxWUVTTnE0VVZENVd5R1pwTEcrMXhXMjgveGhjR3oyZTh0U21vOHFWTDFMbkdNRkx3V013em1hMVpNQmd3SFY4SkNKekcrVEJ6Qzg3TTNTRVl6dlBqWUsreDBkQnhBWEFBSFc2VDdva0Z5U0NRWnZ5TWlmcWxqWmVmTHVTQWRCVmFBTVV4UFBvaTlPUmoxSnVjK3l2MXVaeEpzZTFFTEtnaDJQOUV4UHlweUIvbWdCYUpGOGpXSjdSWXRSKzA0SnBqVzVmdmxYZXhEb0tXMUtmZ2JPYnlrT3NlWUwzT0kxVEF5NnFiSHdZZXUwdDk4dzVrSmUxQmw4RzlHMW0yZWpsWTgwcDl4b1JRL0dTV2lUWSsrMWFBbGNLZ21jRStkOVNlNFhQS3h0ZEV4Q1BLRCtML0s5ZVNaaEgyNTd3NURoWWFTVVg2cFJrVnYxK2VuTkQwcEJQOTd3Q2JrS0hLRUV0NU8rYy9abWRHa29OcWFhUXc2UjFnWXU1WGc1WG83Y1VlUGJlQ0tEMEhHL0loVm1HSU11Njl5UXo3Z1pyV0lyYTNiVVlCNnlGTFhtQmxJUmhTU1BYRmdaTVArUHpkczdpUFphZ3dRRmpYN3IvZy9YN25XM2lVTVRUc3Jlb3hjdzgzbmorWUJQdmFuYVQ4clF1ZUxtQVdNclI1WFJ0SlgxbFRiZzd1dm9wZnVDRWh4Q2VPSG1RNWlJTTMyTUp6cVNUZEVJaEdMU25uMVNVYlBtOWQ2MFRSbTFTM0NhR2FuTTVOSVo0YUVUd3JxaDdrSG9NS1VGNHJqOWpoWmRvbVppTXYyYUk2VzNPUThzbW5VNmFPbWcraElRbnNBZ0V1QytTQ1liWWVrYS9wQWd2Y0xzQlpsMjMrTWs2enlQMG01N1dQWTdLZHBqT0JTcDJ1S1NrQkhjZ2w5Q1Q5YWxQYTdaYkJzejc0UURleFJHS09TZE8xbk9jQVZrQVJOSEIxdVlCSFBCKzBvS1lHeDVGTFI3N01IeEdwNXVzYTFXWm9xSUtRZkNGaXhUZmUySGgyVlBlempzd2JWR3NLMnl5bVNCcEFTdXRxV1RyTkI0MWdYeURlU1lwYUVDNUtKU29aU1k2VmJhK0FnSUNBNXZlR2JzalpYOEhwZ2RhcmVqelF1akIwcHg3dVpsNmpWTklvVlFVOVdjM3FwdlFpS3NNY0dSV1ltS3d1eis4RDhxSkdML0JML0dWVlNTYUlqTlRCdmhvNVFSdDltc01rdS9yZXN0cjBoRUlxNUF2WDRmOWt6aFkyNEZTUnZXVW9wemZMZXpveWhTOGM1UnhFYytpTXh4K29jRGxoemZZekl2eksrakNIT25nOHkzQnEyOUJkWGpjMXJzL2QrTXh5dktsc2YvcGF4dVFMV295Q0RMZGtjM3NRRml1dlgwQ3pZR3VHdTlDd1Zlbyt4NkFDNkxBYzFLMTFqMzVGdytFVUVtdE5sNFpwd0ZqNlZMc2VkeVMyRytrd0IxTUpnZUhLYWoxa3lMUUFpcFFnSFNwenM5YnJkejZIQ1lHdWdTcXJtU3I1MGFURVJHQzVFSFlub3BDTlFKUnZkM2VnQStDYk5ZNVBRUnpTbDBTRDFROW1YT0pWWno2Uk9mNEJqRnBnMkhwdHJtMGdDQVdMZEQyVkJrRVpvQkdzenhZK0tWMU43MXVzMHVab05Obzg4RzlnK1JkaElGekl5aHRmZDBvZWNJam1RYTNGU0RoekFTamVEdWpRK3FLa0pQdEgvcGZXUXJsUGJsdDhQMGlRRExXNDNZSXhtRENOS0tQdmhYWWFFVkdtK1hhZ0gvNHVxWEpRTkZ0QWdQU0xKOSthRnoveVZtbzN6NVRpbDZVaWtMSlRiT29QVFdOb2kyTTllb1BRcGpFUmZ6bVNFNlVCa01KWGU2Sk5lNUIwSlI4aVRqU1Q0SEFlNDk1M0VpMHNVc1dNTFRDVXZXRDg2Mmp6TFNoRGZLUDRRMWFJYlY0MStrTTRZMWVYSXV2NnJsa0FYT3lDWEdnVkVyTVpnOCtqaDZQaWdoaTE5QWxqS09SdHlZN016MzBDZSsyUUhvdlVyWG5tMHBydnBJME5HNnFpOGE4Y0hsZEpadWpzNVdtWU5VWUozVGpKbkpoeVV6U3BrNnJ0VitqUWdWU0RtSTIxNGpkVVNSdWRpOHk0dTB2bjJkWFRmbzZxRjRFU1F5MjhCUmZkNW0veEFLNCtlQmFsbHVaSEw5c3V4b1c1NkViaWR1OEFSa21zRTU0REF2VmRXdXlEUkZpZWdQY0NzanBqZE1BQS9VQTVWU0RhYXlsSHkrbWhaTzN5MkNZMjBXT2dlNDNZbUswVTNISDBrZDJPZER6SzA0TThqNVVUV1JXZVZaWTJ4T0RFUlk1UFcvTytBbVhvTFJma1ZkZ3ZVQWhpeE9qRDFkeURmb2dqT1VxZm4xWnE2dFBHTTN6SEpBNSsxT0QrZlRveUMvSHhUaG1DRmFLcmtwVTIrTHRja1dhY1NuNm83N3RBYk0yaHZBczI1Qzk4QWMvZ3o1MExzbEhEejEvdzhqaFljQlc4U1l0OER1dW1DOHZXeVE5R0ZOeDVqR05QeW5KOGJKbGNRQkRyMzJvcEt6NnRqRndjY295NHJPdlE1ckhibkIyRjg3U2ViVzVNSUxuZFFPekRNVmpZMEpGaFlKckNaekxFR2Q0Zm12ZWRrQ3dCTG9UaUZyVlRlZ3VUUmxJL0orblNqaCtvUmlrZG9RVDhMcWlHeFVDcGZSMkdYYlpHeVd4dWRZUERPM3hyVmg5Zm03YklKSU9EY3NkS1gwRzdZVXg2UTBrS25QTE1xWlpYdnJRLzJrUHVFeWcxTjIyZjU5MVhMQkQ5QXRjSlNTdGs4Y1RpemM3TGZuYU9NUGlYY280Nk5VYkZwTnJMUEthMUh5MFlhZXlEM1BlaXRSM2pEMkFwT09hQ3cySUw3bEZNTituVjlha09rMFlZQmVTMW1TOHE0eEVFQzNSNzRQUktzaWU5U3dWV0VENWY1a2x4dnRYOHYwdmZWb0QyVHViRW1Qd0l2cWN5enMrdzY5K3Q1ZkRNYWgxemxEOUR1aDF1SjZBUkI3RlIxRTMybDBseFl2Mkd0Yk9lVDFrODVLcGxSR2FseFRRWXpncVBsaW5RNjFuaUo5L0tZUWZnenV4ckNPSVN0aXhFSkZRcjk1eC9EaWplYUNXZWVXNjlFbjdmQ2NWUEJ0TGNHYk1odmRKOUx5UGNsRVJ1S3VkMGlGbTdzMjdGZm5ROERkN21IcVdyb2xsU2NRRXdJVGpxL1FBTEVsNVJvU2s0MDdJM2tmbGQ0UnpRdnljOXhhd0RSTzhLRHJVc2ZCVWtZdjl6VGJsNld0eDhNSzNQa21Sbm9oMTJJRU1GS1o3MmY2Vk9hOWJIbkNEbk5NazRsUkRCUWFMY0N2VnorMkgzN0JnQ09yTitvVGwwN1NmakxGUlFDQTN3TzBaVjVoemxiZkZZMlJYc2NJTU1FcmRXdllSVWkxSVZVNzZNR0FabzVEN21RcUFwOEt6MXNubzJCRWZjVmIxYmhjcmVZMFZlVkFFNk9odlNhOWVGbnZ2YXlBdHgzMWg0VzQ0OFpDb1JKKzUvOFV0Tjh4WXNhWWI3YkIwdWxqVEx6akpwc0NOT0s5VnoveGJWbVd2N1lBRHhLRlFzdGdZRHU1aktaL1U1aW0wSUFPVU50UjFOQk13YUpwYmw0OE1WYXBaVXhXWlU1Sm51M0ZDVU83NjYvTE84cmVnQi9wdG5zV3c0Y3FjSmNvcFEzNFlHWHVyTkRwTG9NTEpKVk03Ri9PREh5cm9ySjBFcGNPTEdSY2xjNmRIUDNFUURSeEFjempja3hrRlJMQUF1dXNYbEsyZ25tckFDTDdwNkJTM09nTjJCWUZFbG0wS1BuckZrd3c4Y3lLeWoyZlRmdHJDeDdVQlNpdERQaDY1M3pmT0VHS1Vack4yanJmd1hNdHBwMGdLYzB2bk1wSGpaTTVIYzlTUis1VUhXcUFCZ3psU3poUHBMOUkzMEFTRUd0OWpVU1dEa2F3azk0WHZKZkhzSGRURHF3b0ZJT25Jdmx2RzcwM1lBUy9DK0NmeGtCNUFkZ2lac284UXIzSXBRdEJrY1V5aDVSRDRHbm9lRjhnZWw4RFZwSmZHL29kcDZDREVLVTlld3pYUG5XN21Hb0FOR1R0ck1PVkZXV0ROVGVaa1U1eTZwQ2krZjZseUhaZWlqNmd5REtjWGsrKzV3c1FVSDZpOXhOWk5EZVpyendOYkl6WkhEeUp2NFgzc2hYNWtpc09xK1BEc1JwUU1CYmxzTkJVRjY2Ylg3bW93U09xZFdOSm5wOVNYTFhHMWZxSC91U2orOWJiV1prMFdmTUVtdFpDZUlUOVFyTGp2TjIwcWVkT3BUR01KM05mUTNjczBUYVRtYW1pMFZZYWM0ejE0a2tBc1g2WTFvU2NNdEFxYVExd1p1bXI2QnRkWThaNklKOUhDRENFZDNGbTZhajNyY0NxczZDRitMb2hwMmFkS3FXUlcxdm9oQ1NoaElqLzhSTCt3UlJFUFlpemdzdmJxZXR4WEtXTVNKYVdVa3BWanlEc0FMVURIUWRTb3BvTStGaGFFTkRnRkZ1SlZZUGtpOGtvVEFoSlY4QmY0MzhLbHVFNDJLQ2xpTnNUQTR6aHNnTTBYQmZRaFJpMmlha01jZEsrS1hIS3Z0cWJvUEVKejFnWUZaejVIdFo0WlR0bEFTRE0wNE80WnBjSE9uWVh6NHcva1JqM0xHWWN4RWowT2hGeVcyYm5HYlZWM1ZKdXFraFJJMnBPM2pVeUxFTTdyQnVlRVYvMjhkWkM5RVhsY2d3TytZa1NQMVBhd1JNaUVmM1V4Tnd6Tll1K3E1WlV5SkxsNVlYSElQZ1FmZVNobk10NEFLcnhyeXZaT3Y5aEdNek42Zm43KzZ5WUtFVHFLS3g5UWhXbDUxY0xXOEVITXJxSGc5NWZjSEpkTHUzdWRaZERzZCtFZndoQWo3MXpxSVdpYVZ5VmZhdVlxZ2Y5TTRyOE9jUDZPbldKUjBHbE10SlF2ZlJxcUM3QlBzdzdibFZ2TlNuTlBzNFdYdXdwaXQwT0R0alpNTmc1dmZQTEhWS0RzRWdvMmVMQ05GNXA0eXpwbUxBektuWWIraEp3VHozZUJXcjk3ellBY2lCTFNjbU90K2k5ZGlpV1Uwa0tHdnJMRkNjcTNVVDI5OHl1cU85ek1tWVliVVI0WjFqWEVmWmlaRHhGUDR6Qk45d1Vlb0lvV1RaQTF6S0lXaWpGaVB1eEMvZC9MMGZPRFJsUUhOazkzOVpQcjlsVnQ5aTZUNnlPbkg4UHRTZjRmWHZpeGM5ZnpMNzJLVVBpYzltazh0b1Z0Z3RWNUNVTVg3M3g4anhSV2I1LzAwS2xSb0s5S29sQ1B4YjNDMXJzK2xoN01DS0VQZWZBT1ZlNkl3SEk5dFZLdUZVVjBhenptWFZGMWFxK1d0azY1U0NwaHlKWGRpYVMwNEwreFZrcWNGQ2VocGxFcFRlemRiTjRjbm1SNE8zYUNwVmJvYlY5V3pnZzlpWFFXMlRpd1FuaTlGd2taUE5aTTZqUS90L2owZXNpS2VxcXhnSnREWjVvSmVqeHI0YUxvTTF2M1RQTjZISXFMeStndlB1Wk5BR3hUL0w4cXVPRDBxdXlOa3NNZGlTWisrS0N4MzdrS1V5R2RiODExc1FwbzR6cTZOeVJSaklUVUJUTDRqeHlLR2JUbjFkYnZoMmF0RU5vRmMwQVVqMGlMWlo5U05NVHhOdHJ2Tkxsci9KQ2xSbHhIbTJXWTUrWlZEQXhMazlic1VtM1A0TysrY0pkdG5DWnRicVhZYitQTk5oN05xUkI3dzVFeTR5L240R3lPa0paZytEQlNPdjlYR3E5ak5tYWd3VjVaUzZVM2c2bnZsSUYyMjhGVDB5eUZucHJ0cFpoYkNGTG9PT2U1ZmR4VkIvVWRjTkRQdllFdjRVbnhkT3ZLSXYveDJNMklEZjY4YXZySmozcTJxUThFbW1uc25aVEFGaXdGSmh0N3YyMkt6Nk1mdkprR3l6eEJzRWlvc25naWNsdW9ldzB5UElvLytoSWIxbG9nenlzaFcwd2VsLzBGU0ZHQUNDb2lPMHVqL0hBSFd5ZUhqUS9xVnRNUlU3UjJJZjI0NlZCdU0wM3ZuR3ZtQTFGd2Z1NDBLd1Y3UnhjdGtQUjVFaVF5NnFRMFZ5YWwzK0tjS3NtL1JiRE9PczAyT0NIU3pjM0JOOElNTXVVQkhKZ05LTVRJbkJuWXhPOElVL011S0EzbHpmVUJsb3BaeDAzdnNnZGU3WEtEb1BKSGlSdlR4SFZGYjRkdFRscFN2dFpHQTNLcmRCblA0MTJaekNtM1o2Z3AyczhNaFFkaUU4amlMbE1sQU9LbGJ4SlNaZWJ5aEhzd2k1UDdwVlpBSEs0M2hwSzUvZjZ2b1FLUEZaa2U1M1hUQjhPU3hUTEpyVXBCVTR0cG1NcHFNWG83MkZVWkp2cEhLNzBTaTVnN2szT29IKzE4ck9iWVBuT0FGMmhhRFN0Titnb1pBcGxYbm40bEh6MGRTVjdLTE1xNlAwalV2RlIwWWlLVmRNV2tZK3NqSzdVaTJGWnprUG9RQld2TkFQWUNJZGJQRUl0OVN1Y3ozSU1EQkJIemJ2Tm1wWWQrY2Q1OExJODg4Zkg5R2FoaTNJUnhia05KYitUTzZ0WjZVQ1hvR1RsVmFhUHNFUWh0SThva0N4QWNVeXpFUlhEYXg4TDNnTEtiNURlNndubi91S2JvTUpHM1dkS2dXVXNpUzVsdHduSE9OODZkbUpCTU5EdzZRZGQ4RUV3dVhqS3FJZDU5VUs2MVoxdEgzckpSWTkyb2s5SEtmNEVlOHgrWncrMDNjY2FkMHFjeXhkaUVLQVpxYm9kR3RocDhRMmFNbFQ0THpYVjd1RWkzd2M4UkFPSldneExzRldMV1FaRG9HQkJmZ3QwQ3dZZ0U2R1pvR09YaDhFdVJFT3ZyeFJTYWNCZTBPTmNKQ2VHQjI2c1QxUjY4TmxNdTJFZEVoZzZ5U3ExME0veXNYcHA0dmJobEFBQy9kck84Sm5ROUFINjdvQ2FyOEdncTlOSm1vaDdRaW52Y2ZqS1JFK01kN0xSNVRPVFM1KzB0bVo2S2dGR0toYlJCeFp2OFVxemhvVlF2c1dWazkxR2ZIWGRUQXJRWEhIWEkxcmdCYUU0c0pRRU02MXh4Mm1qY3dEdlhTQnIvaVdYeTVnTkFJeGd0WUZjY0YwSEMycXZqMmk5T2hlVXNOeW1YZFpXSFZBMldKclFPQ04vVWFzWS9lUXQwOU9lWXYxT0YrU2ZLdmNLM3o2eDh2dEhZamduS28xYXhHMmNVS1VsWHg2aHdSMGpaenl6NWFlbmxpQW9sTFltMkgzQWtMWFZFNWU0dVdkKzRKb21QZllyRkVzamRyYlRFZm1LaStXeWJGVHorTkI0Y2hVQUV5K0xFa0pRT3lMenFHMFMydTNyMCs3Rk1kSXZDTmw1UTY3NWlDcWo0ZlVPNzZrUnVBdzNaV0J1Y1c0ZkhNRjIvaEtpM1FwZ3pST3BGOUFiU0oyOWVtd2RMNTJ1WWJIdnlyQjQ1Z2xEd0x0L1RYTEc3NEdiVlpwZVM2Nys3dDJTQnhydEIwUDBhc0RSOUdLODFyNlhsdWRETnNadEY1S0FZWnROUVpyTk9vbno4M2EzTUEyeVNDUWlCb1BVVlFRQUFNUDJLam12ZFhnRjliZEFqZTRXbmxXQ1pETzUyTTNtQ0t5eW1hSzJTdEpCWmpxdTlPYWJKTFVRRmF0VThHN1REZ2hOdndsYzJuZzVBSXdsSEEwUktXWHZtallwcHY4Zks4TVA5ZE95cWxHMWpPcmY3ZWRNTWYxaWdZdUtMaU9IZExaQjNxZHpIRFNoWWZwRDc3dzFYZFBoOWVGSUw5MkRjckJ2M0JrMDNWdnY3V0FiVXVPSzVENWM4ZEFHMWRZS1pGeEQwNjAra1V0NHgzR0dCMUlmMUtBS05xcy9Vc0JHY3FoMXYwdWdTTE01SGx3N1duUW44ZXd5OW1IZnNaZEkrOTRZSlgwZ2lwNjBrcUNEMU9CcnNBT2pJeGVwRzlZNGFjcFlLdW1POWlMY2YyL0xRenJGakVXa3pBM3g3VmZ3MkNnMGtiOXZzLzJQN0ZEUnZSV29uMTN1dDJ3cjViK1ZBaU1BcnJNWEFsdGxDWWgzalNtZUhtWHRoOXpwM2I2N0ZCc2d5aHV6YS9Ua21PbjlsN29ELzlrb3FHMTF4dVJjalVlWk5GNG5LZDQ2OVNPTTVHeFc0Y1hiOTk5dnNoV1MvdGsrcmdLM1RleElBQkZjd0ZuRzZGMktyZVRQeFgyakZEL2dRTmV6RjBFY1Z2eEtrcmJXTEJyVm9sUkFibkQzeXRkeE9ibUg0RWdJRGo1TXBMbVhSS2c0OXM3VjZnT2xLblB5UWhkRm5COFgrU3gxRzh2Ui9OdzI2ZnZQY0ZBVVVOOVZVYnBtSzh5RVpZdjNTQUNBUEdvSzMxUFMvcmRUV3ZUclROM0w4VVc5Sks3N1BSdVNCS1YrSVN6R0kzN1RJZ01tTnZGWnJlMGZaYkRIaWFiamNuTWI5Vk1uL20zOHRORkFxL3Z4R2N0Q0tyajFPRkxRd3o1MmZGMFFWL3UwUWQzdVlEWFp5NTZ6TEtIOEpDOHIrQXNQeE1QUUwxVmc1TjJRc3ZrbzFIWUk0OVFWQVZacDJhTzFhWmVkZG9jenlIK0F3RTZDNW54UlRYUGhmd1ZTbmVwZzg0OWx1K1dxMjBRdzRCb2F0dERTNWQ1NG5lenhrU3FtQllHeG5iYWF1NzdzSjZ4VlRRYThKdGFEQitrTmR1ZlVUcmkzVE95elBOWkdNUCtOTmM3MU8rbGlqK0g3eVM5MmhxTEQ4TWlRbEFqajVhM0hIT3FZZ2I3blh1N2tOdG43NmRMZENLTEZJcEpVdXdQdWJOaEU4blVIU3pjRHFhMmpwakd0V2t6eW81QmhCanFoWjc2b2FFT29IekRXbmZMbloxT2VKcDBPcytQVExiWkNoZnAyTU1hZW9RSjRIQVgvOGFlbGw5MDdpeHI1SW5xZ1dLSTVzOFEzek53TzNnNWh0VWlRejNHOGQ4ZTlPNU52YTVDekNNQXVwL1NweXI5QTRTMUNCQnZJb3dtM3o5cFkrSk4rYkdkKzZLSmFIWnJBdmt5bjByL3RlM3cwVEJtRXRyOVYzSTljcldvRWQzL1g5aUZYdXVHd3c3blNjdFFWaFNZRE1RYzMzbFp5ZlR3VjVuUWxzVWRNSmV1TjEraTR5aEFzWmN2VUtPUGxadDljNEsrN1NMSStBemRBWmZlWHBLZWl5dkEyWHFscmxJWVdnTGV3cWtwOHkzVi9pcVEwZTZMNk55N2hBSnIxZHdzSjBkUmdUNndsWVJ1WndHRjFlRURHeDhmcU5nSGVDMmc0eGlGUkwxek0wRkpQWHB0Vm9pV2Y3RU9uKzR5RlFCc2ZGdDZpNm16MnlCWU1Dd2RmeHg3cTl4aHNEL2RPRUJEWFhubS96ZUR2Y0s4azFqM1JrSlZpUlRwTUM4b0plKy90cmVtWkRKY25SckZTSzNsR0sreDRhbnZmY25aL0l0NXJNN1NncTlvenJNZ0hsREZkUGFJT2RQTU9Hc2xUd2l3TWZ5WnlaZ1Y4VXdwQ05RVUoxck5JbFBSaTJCb2ZETnh5MFJWYzl1S0ZmMlAzWVZLMzViVEdlQWlINjd6bVZXNVFEWm9ydlBXenF4bUJOZmJiTDQzc3ZpZEhib1JFa01qNUhuVWRobzVFKzdYVVM2MHlZdkxORHE5RGZqTjYyVGhTMmp4ZWZ5YWx1UnpJWFlTRHpPaHdWeXpuZUhtd0J3L0QxR1E4VUpNa1QvSWhTY2l1U202SVJ1SlU5MWdCY2lNZkVFU1hiZ0tmWk9hY1ZBUTg4SytYRjRGYW04RGluS2JhdGE2cFZNMGtmK3lCd1h1a0JQWG1rS1gyK0I5Q3kwbit0dG1QR3ZDcWE4SHhsWjNoS3k0N2ZIUHBwNjhHa3pjdURVWi9EdUUvZFdNQ2VCQVBENnZPa0g3Umk4Qy9wWVN4bnlCN1dHOFpHamZaUTJvOVMxY0VLdXNzWGlGK0VmOG1leFdmcXJ0U3JIZGdLNmlyTE9nT25PaVhUcEpQaWNrRU5US2Fla2E0V2ZIdzREVlNDOVh3Vjd4eW1KaXI5N004a3UvWUF3MUtQNTFoM2tpZmZEbWQzRTB3cUNacXNGTk91d1M0emFJS3RtZkdocjVKdzV2OVdkcUxqWnF3bzEyWkFROWZrZGdhU3pWSWtlTVRGeXNuRWpqQUEyZ3lkZSt4dkVuOVg3UkRGUDVPclFGaGNVQWdNSlBIZW5iOUk1Qytab3IwdXFSdGNiNHBUSEhsYWdVUStsbXIwNDBoWVNiL3NMOHdVS2tTOUEzeUlWNUQ3ajUzRDNDYWNyT0RiekYvZmF6Y1U0R3EzL0d4SDRIMldPZ29tZ1ZwTnhmZ1RDa1Fpc0lnb0pMYXRKUjloS1FURUxlaUFzK1JjaHROaEFTMjJoRWdFdXpQWnlWNTBtVzhGVk05ZWlKRGt1L093YklweWc1RVI2SU5WYUh6emdpN2VnZ2RabFFnSHBtdDA5WVA4OGZEZ01GVmphOHNucElLck1ZbDQ1M3g2R3NFQUZJMCswYlFCSjdUengvVkZZTE9KSDJtTUVQVmZmY0Q2clA0QW5GSzBPQ2pOcEx0UDBiSElUb1Vndjd4aU5iRXQ3R0x1UG1ScjVYRXo3ZWFVWFR2VlBIZVh0Sk0vOTd4OERnNVlzSDVSOWNCa2VVeWsyY0R2dzlOSmlQN0pXazVIcXBmUGRFV1Q5eVEwUlRaRzdaZG9adDNhRitCOFpNSnVNb3hvOHdHNkdrVDVjRFNTdlluUmpqdzVSZFFYaWYzaTVLbDF0NVc5dktWRzRHczdzaTl4aFhZbTJyZ3pmZ2hDT1RieExYelFERHdXZktIK3F6TUhZTWpRejM1ZXVCTjYyWnU1SXIrTVdGeWZ4QUQrSTB0VGFxendCakdEakYyd0tmbHhGWWRyRkxFR3FKY0lsM1pqVHRnSjRwMktoRmFFWkV6N1BCQUJhM0kyQXluR0xPQ0ZPRDRjbGdrWm43UytDVlpCaUYrODE0MTcyT3JNWVVSRHN5SVl2Y1Y3YnYwdnpFSEExcFNtdnVmY2xjQTFBU1NZcjlSOUViSFE3MEs1WFRZaHk1bWJWVmQwMHIrem1yeFByeGx3WjlITXZOS1NQU2IwREVZYldLd3AreDRQT25OdFl3dUdMQm9HcGE5S2xHTWxYVjJVaSs2QXNydjdIUWlaRnlJakIyb08zcW1sclhWbHcrQ0oyRmdiL0J4b0NmakdEbkZvUFJwUEo5QVlFdnl2SGFBTTNUb1Y5RGZnNHZ1ZEE0cnB4VGJBZm50THJsU2dUbXVVYUt6QzVVNWg5YTRacnptK21ndC9jMXUyUDJEOTYvb0tWQ0xZZ256QTRhanFFZjBMOEZRUUtsamNuaFY3WDJqWnNiVUlBVzhSM2VBRktKMDZqekY2QjFicmFRZWRZRUd2Ylo2OWk4aVJIY0xBWFNzRzI0ZWhRcm91V1ZpRTlRamU4dStrN0I3N1c0U0JJSGpmbytnQ0ViQWFJdjlTelNmU2hTNVN1VmNYRHpLZmlRV1ViT1JmTjhLZ2E4Mlo0RlVkckwxVUxNM251aEQyVXptcjdxTkJPNThEbWJuTDRQU2hFT0d6Y0NVTE9CSXg0Q255ZFIraThtcVBDUjMxUkVRWVdITldWRjA0KzFUNC9sOVd4N1p0T0EvUXZxeGhMaUE4YmptdzFKUlFuWFV6Q1pVSFRHSE0yakdLY0JlUFVIb0Q1UjNMWTJBNHNPSk02YTZNdndPM0lWOHRXbVlkSGI3RzVJb004NVRrQmdOVWRBU3U2S0VLVjRYa3JVR2ptZGVTaGRmMWF0aHhmQ1BlY1lIK1prbE5jZ1JSdkdyZG84MndWUUJSa25menNwSUEyeGE5NXJOQW91VUxibGoxeFlvYTM2Q1RIMEl5NmV4aFI1Q0xXNlkvOVdpMzdkTGt2ZitLUnllUTVDS0ZqZmx1Y1ZxL0lMNjVrb0J5N1g3RzQzakNta3phUHBra2ozNTRxU1NXV1RteCt2dDVuY1BwbEF0ZmFnb1VwRm1hK1JPU1l6a0VSdUNJdWwvSnpHZE1OcGpDT2pLWlFFUno2d2JhV2tFeHUvSVZUdTF4WXlTMS9MQ29zdUZhcmlkUWprMXZIUmJCd2V1aWtSU295RnNqQlEzOWhkMEhIeDkrSkpXckx0STI5NTVRa1BOdzU2T0RINHBuYm1NQ0J5Uis0cHc5cDVGOFlnZytGRllYUlYzVjhlb3ZURWwrWGdzSUhnbDZpQ1JrVjg4NTFzdWUxRmU0WVpLYmU0eHc3Q3lZZ0NzYjRSNzZSTitOK09wYkM5TWs5NHVRS0JSUXN5Z2JnUm9VcllLYVlhNnh5WDJ4VDZMODZURDliZS8xaFRReFdobEhqbFhOUVAzamYvY3lyb3hkbzQ1MU5DMnF0VVA3N2pOMkZPVzVQdisybG0xcDdPMTk3Tkd5eGVBd2VhVmNZL0FLSlRyWS9uVnVZY2hzS3dpZEdGNkxCVEtJcDUwSWwvd2lXTmNTSzhCREdxR3JlUTcwckV0cjRDamJmcXVEaDc3YjRRbXdoajhWQ0VKTU8vMUVEcnpTU1ZqWmgvZnBwTWtIUXJOOTc5ekp5OUY3SVdWVEdKNk9SU01rTUlTSzRKcDk2L0lVRE0xVnVrNGhZSFd2Smc5bUxuKzhndm52aGt2aFVrZGtPNkpTNVdYY0c3RWtvU3lyRjIrVDZlb3ZqMXNIM3NtUEorK3VPejlRMmRuVFlDTStDdjVLZHAvbUlmN2dvVnBlc0V4NmNETFlIelhseUdHZmNYbk4wdjBjMCtmaWE4aXl0ZGhVQjkxVkx4TlI4cjkweU90MngvQmdtWXVHVmx4MUtFWEd1MGFEaVh5bklUYk5wT0xQOVBTKzkwWGp0NktLd1B3MnpBRFZ1Y1NoR2daem84VCtpekNsNE5hWjMzU2VpM0Rxei9yOS85YTBuMlluRmJCSDNZYVluSFF0dTgyM3psYzZqOFhzSUxEK0ErdlNwWURhWXFSRGpnejNlTzM3djZzYitLQWY3ME9yZmtYalZhWk51YjEzYWZvM2N0SjZmckYxMVdtTDAyaHVpUno4SlN0RzAwNldLVGE3WmZ0Rm41UzJtQ2N0eDNHem0wUk1TUGpIY0FGVTZsZzk3UzNwaGtvRUxXQjZTeGxHalphdW5ybGZJaTFFOWl1WGd5b1dwLzM1d3prUlZWS0JBTlVHM2VsOWlWR1dVSU9vYVhYcGJlUG1nZG1FbEwzRVlkTjRTbkh5SUdZS3RzWEVCa3QxaTFuUDlzUktMMlcza3NvUVFDSllZTVpoUTZ3TGhUYmNxWlFGeDRBUkVLK3dDQ1RWNC9QSU9RQTBKL1pLU2xrVHY1S0JNOE1qRTkxRTB3ZnpyTytYMEw2cnBmUVhrWkw5ajBvRE91Nkg5UkpLQ2VNSkhLK3FIdWhkb0NPZ0JDdTFFQVV2TUkwOWxEOFhiVEcvVXdxR3Mwb3BtLzFEc0RkOHVYQjVOWkVZS1VhejNPb0ZsUzg2M2NnUlFHV2h5RE5KNFd6ZS8xYlIyV0VScnNaalpMc1JUR3BUWXV4NmRzMnpmQXpuazVxL1MyQ0dZMThYcFdESThYUDJ6OHkxSFNteVAvVU1VWjdXNVJpSFQxbkR3WDVPYnFKTXVyZzVLRVpiMHYyaFR2YU81YzRvTlN5QWN5MkdRaHVOMG1xQ3NnYVZVK3hyR0hxQjRJVGh6dkNMMEY5MWlZRngyQ0Q3Tk9ZNGFOYXlUSklDZ1FXUHJHS2xPTGxPdGVVemJhVndFYzRsM0xqdDhlbnhveTBodW5tV1VOcGZwdFlFek5oTHdmWUNxYkpKUzJlMGtRUlZmODl3a1Vscm85NS9ZYS90NkI5Y3NOcEdld1lTWUttM2ttZkhvZExaMGtNVlRCMlZaY2NIU1pKbnA1OWx2c2lldlpKZ2M0YlJrVjVDWE9sU1B1QmFCaUVjelhoREd0THZ1bkJXL2I5a0xGWWdkWVl4cnVPYTI1Ym1IWTNWYTltZVcvMnY2QWJZcWFKQXdXM2ZyRlBsbWkzUnBud3o5bzEzNTBFUmhBODZhbmFUMkFkOHdmMCtTaW9kWjRNdWNyQk1iY09ZdjZRKysxMDBDN0NKZUNSaFNCRm1QNFlQcHJ6YVlTeVlhVzMvSFFIdlZlc1lOL01ib3RvTXBRSFQzRlNhbi93dVNPT2N2clNySkg4a2tadldhclljTnZZSG1HUEV1c20rdlFtMkpmSkJrc3JROUJQMVFvY0JBZTlRcFZITFJ3U0ZDbU9HbkFpNzZiTlRaRlBzTzVzNHpEMkIzZC9IeFJGcURObnhOZG5pT2c4aUhsc0sxNVlCaWx6cmU1bDVQUld2WnA4S3ZLZXFNNHZDVnR6Z0lGTlR2ejZsblBlT3loWWhXTVVzWFNNK1k2TVNaUWxxOG83b3BIOE1wWm9lYzhzT0VEVVdHV3hheFRaL0p6ZmY1TjJLS05adXhOZlQyMHVNdzFpQnVoQ2d0enVHZ3Bjc3pqYWswdFU2RitmdVQyZVJTNG1MUG00ZlZOVzltS1FMUStNSzVQSE1UQXhRMGpBQWoybWpnUjNOSXFoMFVZNEFEb2JNbDYwOTVqSU5LRHVLRjY4WmFPQ1VRTjVqWXVuY2R2SWwyWktTQmM4ODc1OVVJOElhWXNWUk5GSDJRemg5WVNjbWt1ZkFybGhRRVcxekNIeW1rWEFaQjk0WUlMK1owelNpL2dJbEpwOGdNcXRHaXZ4bUdUSCtIRHRxOVgyNVQ5OHBzbHR4NGZtNko5M3FyWlhJcnJhTDJoRXZiTTloSWkyWGErVlhacWhtMVVJVkdDdHMrOXpsRXplQmI4WXhqaENDVlJZZUdCaGZaYjJjMHBhb2d2aE5IMGIzRVB6OWcvMnFGaXZTRXdZdDY3aGNRdTBkRkdSYmlUSnljRUZYaml4Y3dZTHYzblEyeEE2SzlFdkkyRURobUkyZGxRajN0Zm1DSE5QdlQzY2p0R2RZVWtxNVVCYVBSZ29EbWh3K1p5VWRPRjF5WmhteHA4bWJnWi9WYkRCc21tS2ErMFdxZTF5NVMxNTFMekVJNHBrL1kzNkx0RWk5WE5ZWVdMT2tmaVBxTFkrRmg5VmVaaE9CdHFTOXo2WTdKOGc4RG5aT2piK3N1eWVsR2RJc3ZzQytuMXB6Qis2bmd3MG92blRXWi9XaXBMM05nb214b0EvdWdmRnFTRS81QnBVZ0QzenhlU3ZCUjB1T2NSWExBSHAzNkZHTTVSUUVsSkFFbXlLUmt3b2pnbVVXKzlUenJIMzZWWWhSb3AvcFBsaXQxWG5uR1VERGFaKzhxdTUvNDdtUS9jSnJVSFpyenh1T1JCUmJiODV6Wmx5QVVWZDdjVGdTNUJITXY0aWRCbVdCWm8xZFdTaW9kcm02VXE2RnJKa3FGTkRQeU5Zd1lkeDMyUmErT21jcFhuLzhrVEUzdHB1VjJEd2JhRmxwbGUxZmtCQy8yZFJhT1NSaUJZUFFMQ3ovVWZjaXpoUTlXUm5JS0s1czRjV3IvZ01ld2h1aFByZ2ZGYkdKY3NpUU1BNC82NTR4UzdXYWo0aHh0UzB6cUlJYk5VZjBUbWdZdWVSUVBhSGdxRk5RWlh5SzkvdHV6MWJWUm1WMS94cUxtNFFVYkh3eEtoSVR3TlduVVNJQXVvYlBaSmkxVlNMa1c0T25kSXJUWHFaSzBXMUtLaDArckZyZjVFVW00K1RvdnFuMmYwMmJuVVp0ZEoyVkxnU1R5eFdseUJHTjN0NE9SbW43bmVjMTF5VDI5bzZTWXp2c01MUVZGN0dOQXMvYzRWMElGV3ZEMkFIOVlSS1Z0dDlLME5qcGZLWXRlYXJ0NjhiVk9VZFpvV0JXMFNHdFN6Z2U5QjgyZCtEamoycHlqcUZwSDJxQTR2QnlEdGEvcGNPaW95R09uczR2Q1VPM2dITVpQZFJZZUo0a2k2ZHVuU0xSMWhLU2Y0SzBOYlo5SXZFU05wa3hEM0pGbEhXZEoxT1hFNFJWbEt1OGZvcTVENll3Um8zWXdiNitrckM5amtmV3dyUjM1ZXo3U1EvczlHQTlHOW5McGNaaFROSFh6T2RHY0UwNlJkM1hMcS9wRStSbHBMQmZzZkxrODZuK3UzMVlhTm9mNmZqVm83cGdGb0xxbGVXRHFxei9jaUlyMmp2RVNIcUw4WGUwU0FaMG81WkxtSjhzSjRtQjloMURwVlpmaUJnTy9YcG5KMVljeHc4NEIwcU9obUY4a05kVlRKMjBMOXk0aG4yTXZFd0VoSTliOVhOeVdXZG1jQmp0ZXhDWld3Z2t0bENRcnlYcklEUWlmaUFQN042dlplYlhRY0JZcmw0a1pDTEZVZjVzK0FjQkRMUng1eG84VG9scmgzKzBwaUhxV2svazdLbmNFZnU1Kyt6Unp5WWt5WVIxTHZMRHc1S2ZpMXQyWS9EZkY4RlBEdHdXci9CT1ArOWZ3d0owV3pkSk5acUdTenN5RTZKZFNvSEZNOXpIcWJQbERETHljZTh2UmlnU0RYd1pJbjBJekU0azkxVkFUYS9pRVNQcnp2SXlTcVAzMmhHMjQ5M3dTY2hsaWl2SWhIZTh0VFVUVndJazdoTkxBRTc1QTlBNGRJYnFCcGI4QnVMNzdGcFhrUkFJRXdWR3VVdXVEcDNHVjJNQ3Bob05aWC9QaXRib0ovVHhDVngwUWVpUXA4bHVKRzgvSU4wTlA0U0RBakw3dk1MMUt6YXpzVENxV2FvUEtycFRLeHErVzlSTDBVaDBsWWFaZ0FkWHhESFNqUDlMVkVIVTgvYTB2UktxdGEyTDYxcklUQ0VCL0FwVWwzd2JxbU1hRk9xdE9kRThrYnM0UkhDS3JVNmxHQnpCd1MvS2gxbzBFRm16L1JHQktsRjR1UlZ0RW03akxXQVRZYlQ0SUlRSkxwZkVqbmIrOWRGcUNuMVc1dXpEYSt1NFRaZmsvN3VBZk5GMXJwYTBWV2ZPcVRuamxIMEtDVW5UdVhuLzlpT1FQUGZvczVweC9qL1dpdzdrSC9BK0VtVFRIemxocnRTZkxncEZOK243ZklNSStMVFB3dkNhOXphbWlhYXZNWkZiU1JFM1E4dDZhSktyb2JQZmFnVnRUcTFyczBPdkhYTjAzN1NBS0Zsc1NWSTErRVllUnR0WXNJU1hYTVVIUUNzVDYyRzcxMlRNUEMxZ21SZjhxUUFhK0dlSncwRnptM0RrUnRVVEhZTm9DRy8wWU1TMmFhMzlOVjJtS1NyTC9JVHRmbXArY3pWNG1jNDZHN0IzSmlvanBlYWI4L3dMbUpkSVNiMUFZT0kyRG1XSHBPSnJ2Z01zYnJDeUxWeTEzWm9OaHlTbWtJaWZUUTk5NlBEY1B4SUdRT2ZWOXF3QVcwOStadExxSmZ1ZWZaQW85MG9aYngrMlkwTFZ2Wmdwc1pJb2lXZUs2OW9FdnlWMTg3NDVOdXBWcjFtNkh6bWgzdGtURzNTT0EzMGtGTVJNYTljc2xoZVNuK3YzSDBtS1o3OXFkSElDblNxempHelRjY05kYm1hL3FsdU1ZcFBZMml2VWRMYTREa1hlOElnRzd6M1dvcklzVmhpS25sUGFPeHhpc0N3anhua2U0V0ZTcVQycnQ2Vy9sdEp2QzNTcElnT1VETUpyWkhoUWRReVg0SGJ0VzhWTnVTdENrZmVjQkRjRkd1WFVCb1AwdVpDZzd2UEhXZFZiNGhSVW4zQnpKckFlV2xod0FqSnFIZGhVWlM4UlJpM2xuY2w2NUZlSjQ1NytBZ2JYSC9VZTJyL3VscDlQbXdMNDM3YjdVUU5VU25LTSt5UStMd29NMnp4dTlMKzVnMlEzakNmdzR4VmNVQ01pRm91QmdHQUMxNUR6U1NmQWtSUlR1ZW1oRWgvRGM1RlUwa3RoWTl1aHI5a0N2cWhOUTJFUDFpemxVZUhONzluRmlnckdwbjF3eHIvSldoa2pONnRHS2kyaG91d1FyTnVwWSt2cW9NZnJ2b0JtU2FVSWlIZHBna0ZjN3ZEQWJGdGhyRUlqUW5FVEN0OFhZc1dQYityNVdzaGJYbFgxZUoxV2pQeXJJcXI5bm95bmpHUUFTYTJuQTZyRkdtMnJLRWxwRWhBakN2Y2Job0cxQk55NmlzY0JUdC9QZnE3dGNjNVBFQlQ0bXBLaEpmMTJuZXZBRmUzUEx0eWhyYUc2NnN5NDZzdzNkVXJlVG9qalhFc2laeXUwbEF3aXFsREtjTDRQbXhwNnV6Ym1UWTU0Z2ZoeCtBSkU2bjdhMmFEU3Zoa0JrTjUybFF0OWxlN3ZqcHE3MHptN3JteUJ6SzA4SlRJa0ZoSEZXOW1LM0JKRWcwQ0hvOVd5Rk4wVTloY3hRdGMwLy9Pc05HMmFDc3Y4ZTU3S2hkV0JOenprVUtSV0t5dWhvRjRXQ3ZKTlp6NDlrVWZOZDFZcDNxVFZBTU1ucjdXd1F0MzdDL0ZUUjN5YjMrbEJiRHZaWUE2ZzhRMDEyV2xma2JEY0M2NGxaTmdmQU50QnFab1k4VU80U2JLcnFadGg0bVNjTys4azM5cmxSVnc2Nm1FN0tMdWhHZUZZM3ZXWjJvWnBnNG5mSy9nTE16ZVJ2cFloM1Z5c29OcitYRVdURCtNdm8ycWVhN3V5Tk5YVDJiR2ZhdmwxbGRNdnllcXFMRWxldW5lZy9rbkYySTRnelpmZlZJTHA1VzAzc3BNZlBTZ3Z5MHBzbHZ3R3MvSU5lUCtBYkhKeEM1VTkvdXF5alkxbVR3bTFocjRJVEkxaUttcDNrbjQrREZMQ3hOdWYyMHNMbGdGMFgzekE1TVpUQXhDT1NacklxZVNpOHVGR1Y2VFE3WTJvOTVndnBXMy9hdzhOSHl1Q29qSUFicDJ1U2lBbEZPMXRTdk9mNmcxejVpRVJROE1odzRRb1R2Y3R5dEE5RUprVHRuUXJ5MWQwb0U0ejJUZWpBWVZ2MWtNRUgycVRZUmc3WHcwY3lHM25FNytSYjd4czBCVlhkckJibTdqb29Za2c5V29HSE1JU0VSRkFNNmhpOURiYlZMVXJ5UlRmUWdaZHlyMWxIOFI5NUlSNjNobFRKWkc4OTBzMEtiRHo0TFNIY1R6RGN5dmxzMG02M1V2YXU1MFdQT2t6MDdDNzk4MEgvSU1mVjQxMCs4Qk5HUmhHcitWVlJ1eUNBWnExVmE1bEp1ZURBYkQxNUlUa01ZNzVTcllyVktOaUZCL0pqNkNGSzFLOXZtZnk1MGV3eHAyTE4rVUNNQ2VKaUdvdWpNYjBPcmhnZFRRa1BZNU1ScmwxK3dsWm9lSkdaY09BTVhQd041ZjBjR3psRWhZWjBNMkdUY1VQcjFBYUsrcGttWkJjTTFwOHNTZTh1ZGtkSUsyS0xwQ1c3dzNlWTFaVXgrM3dQcTRMK0dOODFJbkVIcXQ3cnEzNWRlYUNRUHZDN3VpeU5aRWlzK3pVamVkQ010d0FzNVN4LzZQSjdod2RBU1NId0l4SDZseFh0MTEzVWFBWXBKNkVvMDVXaUI0R0grRFlEZUd5SzUzZmpYbTlGV3RFbjVjK0c1anV0TVdaV05MUnl1aUwvSTRCazhCZm1KY0ltWkdOK0YxajUvVW1YcmxyeWlZZzR2eUllaDREQktGUmVTS2Q3dVhubVJsTTc5eVRJYUxvNHJlSC9ldkNaTEVPaHYrcElybkJjaXVwU0JTU25pMlhOY2N5SnNrN1pXSHJvNXJNWk5HN2hIRUVEcEo3SFB3SXZJdmxycllaMkdUb1FzaUxWYjBwNFlab2duU2xCelp4MGhQTk5sUno3cEk3L2Y3TnlLTWlsTkRZSDAvMURNL0tKb1B2MWdjTWZONVFTMXEyN3Y3aUFSMTVXM0JCVWRCQXFma0lZZGxZUEl6ZXhBRUQrb3hqcUozZ2ZhUkhoUmR2eGszRys4bUg4OHlnRzdoZFNuVkFFbEhQajBmS2NnR3lIVnZLU3laYVFxckRKVndYTkZ3SWEwZDNxWlp3c0xyZGJYL3dOZDVoSjhaZHF5clo5RWZlUXl4ZWFzNjNNUm5kMm15YnBRUnlvZ1pJais2R2pZdU1ubFJnVjRQRG1CZEhsQjVaTjlMTFhlQVJZb1k3bkorMnpRY21xNXUwUm14cm0wdFJPNDV1SmdPQzh1dHZ2SUpFVXZxMjYxZWk4ZmNvUDEvaGR5UDM5eDNoM1VNWVJHTUtsYlI0MzFPZDNnZGpsUmtPOEtVWG1aREhnNVBhTC9ZVmRCNVFXOHArQXl0RU1oSW8zTzZ1Q0dRY0o5RHVyRkMwVGVMazZTaFAwTG5COG5xbkhVMkVqWUx2eW93ekhZYXMxUXVpQUZSa2ptT0ZtTEEvUWF6UnNudks2MW5qNnVvRzg4bVljeU0xNnhINjFsNEllR1d4S0NrUHVJRFF4UUl6NFZlVVJKbmhmbzBEamJqTHRTM2EvZ3F5T05QYlJrblZvaS9SZm5hSThjbU10QWZra05wQTd4QjV3VnJDUVBSNTljbGVCdUFmSEpwVnpFYzI0SkRUR3IySHphd1FnQkRjcjBqdmxwakZxcktXeGEvOVN3KzlNTndzMFN6N3Y4U1ZHOWlPem1QVjJnNldLTENIUi9UYTlRL3VqdmF4ZmZMOVpENDh2bE1DT2c4YmorK2xLbCswY2FZZDhlcFlldlZPMTB1MXFhWCtMREhSRDZJRXQxTm1vNEsxR21hTEM1NUpKdWxMZTUvM0NmZnJIZTVrVHNRd0ZiWldyYmV4cWtIRXJYeVM2NmJwZ3Z2UWdnRHZTSnl6RDdaamdLSUdsNXovVFoxYkJ5NkRqclUxQXM5L0Evem1Yc0xxdkpDZjVOY2o3TnMyMkowMk01T1BSTEs3VzAwNUtBMGFZbE1nYVkwRkVDMENTNTFFVVpnWWNaU2F5cjBBbHdHVjN0eWpockpIZkRXcks3N0hoMU1GOVd0czJtTnp3MEEzMUZTdGpHQXZpNXdQSEsraVpCNlIwY09PeTlWYlVTNFVFS21UNm5iY2J0K2hFczdPbmpKaTJmQ3dVZTZtblZBNm56Q2c5dkwyQXlHeWdrRUxIY25NQWtleG5kTFF4dkx6V2JSYWpkODY3OEdHK0lMblZOcU5uZkV3b3VCbGxCU3ZYOW9uNVdRSWVUSlpIVXd4UmtPQkkxVCtoODdVZWErRUZTWjkwL0Q5N0lTWDhyRUxrSGlaa2NrcUQvVVkyNExEVHVmWitiOUhGcXZOWUJhdnp5djhWRWJqZEg0RVhGRk1XMk52UFRFd0wyRXBOQVRtZGlvSjhMZ2ZENEtGbUFHeUJnanNpSEhRbW1jQlk5dkZTUDdHeGl6MzFDUlV1RiszSkRvaEc4bWxzKzVQVWR0OXhQRHN0MVZvYWVYTEdacGs1VVZzU3FHcmZMTnpiYjlUSXF5d1JVQUlodmxRd3VzOVRpVlkxUjBOanJFQXk4dnJCTEVLZHk2OFh2aWZudnVhVlptOGs2aHYvY3dkK1lmY2wrQ0VEL0xENUYxUjRITitoS3pYTzZPSm5UUEdFSjU0SmljeDVLRnl6dzNoL3hVYm1qZWpqVERncVN5c3FBRXJwMFhZWUd6bS9IbXJ0OXJRZlphRjUyRSsyTWI2VGJjVngzL0xXOGtsdmhsRWxhRnRJaVZkVjF0Zjh1TngrQUI4cVFVRERlTnpoeE1HRnc4ckpHVGQ5K1Q4WXRtQytqSm50TkdLK0JFNzFBNmJPVGdudUtyWjUydEt6SkZTZDVtcnNsMk5zc0RpWkdjTmFnTXlrRUhHLzY3ZEhQYUgvYjJoNkhhZzl1MW1Mc1J3MzdiUDk1dEFtZUEvTDFkdUhRU21tK3hLMWtNUUhUb2w0MHZmaDk4UmVSUFBaeEZQTmdSMStLdStIc0dMWlZPYnpKT1AzbkQ0Mjh1WkRsWGlJUDRBYk5yS0NQSE1EQ3JVOFhqKzF2L2xaQU9oeWJyMkZ3L1FqYVcrdUc1Q25Gb2Y0blJwYzM5cTNydFhTWHgyYUtvNFd5Tm1HcC9MT3VjdCt4VEIrVlY3ZjlwbXVJc3ozNDU1Q1ptOVFKbVhiYnFxRFBtWHZEazdINVFoeEQwUUIwR05uZDFDMHgzTFYyVk5pQ3YzUkRzYjZWUUdsd3FnLzZiR3A3K3gwd1E5dEh5MjFlVEZYU2VvQ0FzeVNQRmdYUEx3SjJpQnZScTZJNXNCL3M0S0RiQnJLVTh3UzN0Z3UvY3Q3VURXWThtdmpzd0F5YTFjYitVMElzMHFoMEp5NURDSSt0OFRFY0Y2UXI0Vmg1VEZNdElnVkRlOWk4Ylo4eE9GTnRHczVSZ05XWTc5amVaeUlDamN4TUM2Z0lwdWJtdExZSjA4elZLdG5CVVBFcXNhaXltL21PSi9NTk1iT1pFT2k2Zk1UTHdlMGVIK0Jta3FPMXMxdzRONmtocHpnM3lIRzBHck1NQi83TzI4Wnc0T1pJc1p3TnU4QmVCeEVCeVJObnRyR3FYc1ZZTkNDZGp4ZUhteDAyZzZJVUhYVTg4SmxlTDIwZWgyT0haTjlqbTdLTDI0ZFV1UjZIL1k3K2RPWEV0dlY0WGMvZm1ZZlNXcjBEdXV6aHppYVdHbjdHRUFRTzFZd2dQSEU0dWIxaUVab1JqODZEVDM3c1htWVd2OFc3bmhiZFpLV2xhZjQxaE1JeGRrTzl5Yk1haE9DQ3A5cU8rOHlOeldnMDkySWVBaGZ4L1Q3VVNndkhQdktUb25DTkF1K1RNZnRMZ3pCeDZzbDJiNmR3czQ0akpIRmkzSlE5aUZPMVV0MFltTWY3bVZxTzFOOHBOc0poTXZQazBvR0t1aHBTS01NbG1BSllCR2x5bmhzVDFnVnBvK1RDZzFHekFjNlBkZ2hGV3NmUnBob28vMUVHZWFqWmQvVWVYenViQmVSWW9rSnExS1l1b0F5NHpicHNsMUlXVkJTSUdVaUY1SUtpVG1veE1CQUQyc1lqU2hxcVdHK2hGODJFdTdLZ1ZJM05UeExjeHpWMmVzVVh5Sm9kWVlPK1ZRd0tyTTlFak0wVFhOc0EwOFMyekwxYm5hK3VIRlZVWmFzWW1zWVVvR2Ntc1l6cmRrQW5VQ296WWllaXdNeklQck1FOXpTSmZnZUgrR3JxVi9BNWpjM0ZjenI3RmhaNjQyc3ZSbHIwTWJic2J6OHM0cFF3cXRrMzliUmV1NHMyeDl2a1BMZkVJTEhYVlJzeTlqME9hTTM2RlA1WlVxbm5RcmJmVG4vZXA5c0N3VENYckZPU3JrTlVnek5zSldLUmJpZDdGc2RvYjdQWm1ncEZZdGx1ZGNhR3A2alZFd0FlMjBhTlBKa3U1bFpVL3Nralc4R1hJWE1hRFh1M21reVNwdHVubWNNUWEySHJTeHNaR0hZbXR4RXZqM2UvWWVnc0owRXlzNHYrcmw2ajlka0hTUXJ6SDZMVkY2NTZTZkVzQUxFN0ROeWNWUjhRN1pSNnRjbkhtc3VNeWs2d0FvQnlpUjVsOW43T21nWHBqTmphNUJpc2RMZW9DeWRuRzIzQzF5MEw3Wm5JY2lNRjJBaTNzbWQ3c1BpOXlBTWxmTlNzNllXRUhOandNK240ejE5c0VYbHA2Z1cvWVd2cE5OcWYwOWRDelE4NGZBb3ZuNWxrdUhyQjJlSGxlWlp4MU9FTERoVnN0Q1FVSC80WG9BR1hEYlJqak1PM3dYYUFxbHJvWWQwMDVXTDVxbHNKRUdQR3hDeUZPMGYyTUtQNERZcnhRZDZrdldnTDc1YUR6eXJPaElwaGJUT3NHTGZTZW1TN0h2blBHdW5xOUpEQUE0N29uNW5QQy82OUJ1cmpBbWswNjFxNE9yV29zRTlacFhPcnFwWUtPbVh2UHVKZEJUK1p1c05UZWx5TDQ0UlNEMlFySlJGeWZuNzgybEpNR245SHJnZi9ITVVsbzlkR0UzY1ZVL3dWdStxTGdZNTlEM0J5VS9ZU05JMnBHRFV5eUZ3QWFsUmJLWWRhZ3hsTWdHem1zV1ZBelc1K05IRXliVFE0S3RoUGNvd0dUUkppMmZsUE04MVA5b0c2WWVDSThxcGdpSEx6WXo3RnJ1eWNnV1pKaVpHemtHMU8zN0VnMlI2UDRQd3paRExDeUprNlhIWjRUdE5VRy9NYUh3cGIxUmRIS2dpcGg3MnNwbzFzaTFybXZWd0l1WTRqM1RSOW41RVR6a0dIR2xTcGZQTDFEVzFzWjJ2VEc4bklVbWlxME5tQmJxaUk2UDRoRHpDR3NtY2wycE1aTlRnQjFXWmszdWE3WjhyUzJEN0xaeHJnS3BFbVhNOG9hS0x5OGdJbUIyYlRDa1dBVnA3Rzdsa1kwVXo3Tkx0YU5IeWx6YUV0VXA0Z2dXdnQ2Sjl6RCtBU0E5eEZnYzJFdkZhdkl3MWxxc0lKYWUzNTA0RzFUV1BvMmkwamVPWEI5djd3cjNSalZkSnJuNTRsa05iYUltdnJsU0N3TURGSjNMNzV0ekRqWW1Cay84STdJRW1nVGgvTVZNYndRbW0zbEZJblVHNW9PVWxtSjRyc2tLSUxkd3k5ZDlVazdibjVUZENRT0IwZkg1Q0tzbzRjT1RBWUZQMEFMUzhsN2s5Y2JjZXp6TlhZU0QxNXpiVHB6aEFvMURrbnlZN0lRamNpU284amNyTU90TTFhUjF0NSttODhRVm9PZTFwd0xtUFJyanZiQ1Q3M0NDRjJScExoSnNZa1FNeUFadW9xcmhjYm43ckdPbkxEcFRWcDdqZFVjSUR1Mkx0WVZROWFocWFjUzRpNm9oRU9WVDhhM1lxYXBFOE5rZlZWMjlyMkxWOEdDcjA3dXh2QTFjYUJqY1M0eEZqazJYZEROT0J0MmNJNVRRKzZpMmgvTkZDVmdCUVRQempQeUtBNkw3NlNVMkRiem9pa3lwOWttWUdmN1UzRGJFNFk4UiswMWRhNXp4aVBPVHkzNVQ2VTlTclRsVlJ5UWhkbU1paitUcW9RWHdicTFqVEpNTEtWMjVIaXMxdDkyd1p3bDJ2dlUxQmgvYUtUT29VdlZ2eDVaK0pkVHFYNmRodWdLNWdsMWxvbG1haTNlbjZCY08wUVMwdlZ1c1ZaQXViNVU4dnltUFd5MWh5azNja3h5Q3FhSW9XSVJOK3c4ZDk0V2tLR3NmS2RSL0xnQi8wemxkSmN1VmE0MDEzVFlGNDZKS1RvUEtna3BpQmNha3hXcDQ1YVpDNUY0RXorbTZ0dVVxT0Zza2tDVUY3YW53VkNCMWxSYlc0UTd4azEzOFJ5bE12Z1NXYkFLeUdvTm1keUpoZ3BDTWlpSkhEZmU1T1RKMDJRM1BFajMrTGhrbm1rbGh3VVpIN2swZWpZejFuaDA2dTJPb1c5SHBSTFBzOXVBcjljckhYY3dQVHJ1bi9XMnJsVk1jMDdySEt6WXk1bUkyZzlFcG94SmJxWmRmSytVOHZqRHZwR2xVMnhFQ2RrRHk1cVkyMjhMenRScmhQdVNzZDkrTUY2eTdDY3F1RjhLV0VidlV0VDk3dHBPVUM1elBSRG5lRk1pMXF1dDZRbGlPMHE1My9YdUZsbmRMVGFybG85YzlWS0hEeDBNRlFldy9GZDdQaWNQVGsrWjNHUUVhUGR4VjcxY2s2enFRTDhGQU9ZS1JaRk44dFBFY3BMSjBObExWWmRkaEJobUJrRUdwcmw3TVM2bWtNYmFCbkkrbnNtRFhjUGNpalFFOHNobjFSeTJHTDNwTE5BaWdUL2lDa3crdWRKL2kvdDE2SmRnZ1BjSERFbVB1TlZZUVcvZTBVd1hkaEUzSXFET3ZyMktUMzdOeFMzRUtHdjBuekZUbGdlcmoxNzVGSkZuNkUyUUJ0NEhGTEJjdVZ3Nk1mY3FNOFhTWlp0RTQvOHlyWCtGaXFiQ053U1ljaHJXVVNtK3AxOEJsOHVDNHZzaVBkL0w2VzE3MHphRUZMMC9iUm9qVE8vdEtweVlISXd6UW5qSnQ0YWFxTjh0RGswSVVSWXJ4VzcxeCtaRHVMYzZRUFl2VVZwTDRna2U5RFNzeDZOMUVrTWoxMWxsRmlTeWhJR0NKMnROQWtMOFJwNlBwNnpML003bG5UeEtvVk12TFZ4dm9JZ2t0NWY1dit1NnJUT3N0SEtMNHZUdFpYblZTdnhic1dSSkttSHVNelpuM3gzN1VlMXJSMjZhdzRPcVd1M0xDSFNUZ3RhWWI2YzRnbXBNakR5TUVpdlE3Z3B0Y3FTelJhc0x4aDhGVGFFeEo1alBIMmNtREFFRW92VTNBc0g4VjdaS2p2WkplNjdWWTdJNkxmZ1I1NS9GRmgvRzVtVVVZM3V1dUhQVjBZYmU1SU9PTHR3Rit2VU9jNjNJS0FyMzJ6L25iMWQzdWIyMWJTNWVZd3J2Ym5QeldqRElKenVWbStsVG1yVklsTzVONHhpMnJaMDI4MW1ydTlrV3l2ZC9EWXR4TWl4cEdlZ1FCTVhyek0zN2lNVjBsOFRWVWswQ3oraElSMmVMTlV2TlRwTWhzM2RxdVBuMWZPempLbGRhNEpyTko5elpQdHdrSWkvbk8vNmlEY0VFMktkUmsxUzlnc3BUVFFLZjI1eGR5ZVlOQnNFZDdxa2RlUlNYN0pKVXNZcUNIeEdqcThhM1VnM0hvUk9XT2M4QkxtVGU0M1lNbUZoSm1sOFg1bUdkVmxrK0o1Q2Y4UWpKTGJWK0twSmRPUUE4cFZFbURhVVJEWlhObVRYZTFhdXhvUXhoQ0UvdWo4Tkl0UlVQT2RCRi9RS3hvam9UVzM4WEZBVXNFNEZITE9LQmIzbExFQTBETThtVUcrT3ZzbG5QOGtORUp3NCtqb1FhSThRZGhsTGJ3dzEyeHMxNk14dkhqTVNiYVY4eUtzRmVNUnRnMGhMczFkWER0U0dxUUt1cUtLSlZSM3NjSmVWZ1d6NmFQbDY4N1lsbmkrMUZOMWFLME14YWhoSWw3akpYd3N6dWhyRkRHbmNoR0hzYUQyR3JqbTlqai9RMmtkeVhpQWs3ZG9xYk1uanowcWxhZEtuckdyRTJrM1NGRVYxWkwrWXY3ZnpiTlFIK0dKOUxZL1dwMHNVUkY3YU4xZEZiMjRqME9vcloyblYrQUFrT002TlNnRjBIVVBqclZrY1h0Qzc3aDREQ01BTkZQTDBROWtudzIwNlNONlowV0oveVZZa2dGWm40cHJYR1dNUWxUQk9HLzFLS0p2eFBhdDJpaWM2VlZKNDVVZFVLUXNmSnFoa0hKUmRySmVmK2plUDAvNW50UElTQ1F1TVFYcnVrSFBZcUJpTnB6L016RTlUZ28vRzJ3d0tKTXpUZmI5TE9WTmVIWE10VmhWbXlqcUpZUGQzQ1JvMCtKcGp1SmdqdXNYWVRKRU9DYlZNTnhKRUF5UGMyeHBYSks3UitUdU1mNzY5OXk5eGdkajdnM3h1MUNqMVhHdTlveGd5Q3ZNYUdwZW14SmtFS21oSDdxQ0NLay9iYmRLM3E2TUFjNmVpOGNWakpqRi9RaGJwMUM3Vks4b1VpVnpiV3dQR09MSkJ3ckpYeEt5bSs0aXorZUNMUWMyTTIydVVvVCsxQS9ybkpaN3pkdWloUUZOVldFa29udVlCUUR3cjhLQk9lVTllZ2ExSnBRMVpQTnkyY1JmdjdleS8xVStDUmVOZW1sdHE3bVBIbWJpUnM2cVNNMkZzUVdGcUtoQnVWbGN6QithNE56aVNrNVRybEpqc0V6RzN4T2FSV2VSNnY1ZWZodm0rbmVZeTJ1SnRJdXRmeUt3OUVDWDBCeWJFRk12NXFyS0xPMjUwbE9jTkl2S0I4Qjh2WGZXK0FtWHZFT3dOR29BbGM5QkxKdk5VZWw4NTRubE5VM0ttbStIM0RZMXJRcnB3cTlzZnJZMEk5NklpZFBGdW1aWkZZbnd5OG43NFFjdXpWSHJORk5ROUF4Q3h0a0J5YWdsY1VBZ1hHTHI5WEwxSHh5MWlmV01aSDcrS2UrcU1tREJhcE9IN2JTTG5SRm1uV2ptNFZCc1k2S0JKOWx6cS8zb3BMVm1xdkt1VlFIeDVvL2xCQjJ6SWpnWjRDaW44M0VuZ2tESjJTMm4vTUJhbWg5ejFWcjQyU1VJRU82ZnlaQ2doSGhqSkx3NTZsZllVcE1KcmVMOHI5b2dKUU5RYno2SFdHaUp5RTNOcFZhWWF3RFNKeVdwb0p3UXVUVWpneDdJN0JpQ3lmMzhPNkhDOFV1dStKQ0xwWnhlUGk4U3REa1JqSXBMSlc5b2drU25iUERsYjcycGJUV2s0RFdobnpWUW1VaDFJU1B3VUc5ekplS3d2WTF5eFRIdWMxK1ZSdEhtTjU1T29lLzFhOVBMMzdwanJ4UlYyQUJTeW5SRXBlSU8zdjcyRkZnS2xvS0I4L2t5cjBmU2lUZDVBeUZrMkZTYXUzUGxMdmY4T0lRTnBJaVZKbk4yVkl2TzZieEpLMEFabTBqNkxLOStHaXJ2cVU3UUtZWEMzMnBYUGwrekVidzRBZ21aZ2RrVkhCUWI3OTA0K2FXekRiY3duSEVsYUNEY2JieTNtdVI3MEh0bmFuREFTSnpJVFg3UzFSZ3p2bVcvQmVPaHArb24xKzlWSlQ2NFA1UGloRVRCWExCZ2lYbkdIOTFWeTJmd1JXZ1d1NG91RTg3NWh2VFVYa1RSV0pqKzRUMVRLanI2SXdLZzc1dmUxR0FPbHBnOWxQeEZySHFhQ0E3ZVZWTTdwVlNrNCtzWDYxemdDd0VwUTA1VzRQVUo3OWgrVGdwWG54WmdQMkNjV0hRRGFwREVTTU9qK2JiN0xRZ29RaEQ3NUpMYUVxbi9aUG9kRGFFM1k3RS9xcEszQ0dqTHJkeHh4c04zSUtZY0hNcHFvd0NuK2Nsd0xNMVUxdU9udHA5ZVNhWXFzK0xHVHhxN1RHRWoxL1htdjBRVmtLWW9raElneXAzeFM2amRPYlkyNFZOM3BsZTdoSzljTDZtUE5iNFhsRm1NT2dvYkJWSnJaUWVUNGNSZCtqcjdKbjRpUkFFVnlBbit4NXRVRUpIOXUzK0srUlhDZlBKbXQwZW0vd1ZQRGQ4YXZDU0M2Ym50U0J0ckRoQU9BU2NYMEJGeURDR0NTMkNuWWp0c0dQQURIQkdqR25MYkFqRTJBQ3djUVgwckFxRE5GczdacXZxa2w1SGV1Qm1xc0pZQTA2REhZQ2VWR2g0Kyt0T3duWTZoQ0EwdDRYWlBEd2dIa09kL2hxWTNNUjBUTFJWL0dkWE9UZlc1bndUb1BLMGtQU2pzd2F6SXc4a0o2Y2V3VC9JZDRjSUNpM3pHQm9FUk54ZENEblZaNXRxUnpYWUZia0dkbis5ZGhkWVU0Q2Q0YU9vK0tiZGtUVm9jbGExUmQ3N3Qzbnl5VTFYRnVUMFZnRnBXMlREbFY5TW9sZEFzaWxaSDB0UEZjam1UUHFzQ0U2NGRpakovVW9rZG9sUkNqZ2ZmNGlVR2dsUTVUN05rbTFlTE83K2FyVWVtTFBqVWJCdEVIb05Cd2dkWk1vMHFkdS9KQUJ6ekhGUVgyamVtRnFBTTlXa2ExQTRhWHJuUlU4b00rOHhacWF0RjZMb2lFQ0VVQTdVWTVNODJyd25UZksvemRza1lJSDRsUmJTc2FqQzJZVmN2ekRaYk1pMkJUbTFncCtweW5FVzdZcDRxa1ZaTFd0NmNKM0EyaXkvNjFJUWRibXdsQlNQRStpcGRrS0dzYlpKNytBWkN2R3lkM1liSU50U1FSNzRBd3AxOWhzOHdURkRFNlJNNXV1TFpJSlh1YVBrT1dYMUd0VmpOWityZlBRdDhJeG9rYXRFNU5pelVtTTIyRlU3RndwYzFTOWZqK292RU5RR3pUMnljdG9PWk5sQWJleXpVZ3VteWNBdHFnc2FXRXY1enpvcGl6ekpEUXord3VDbEdFaC80QUpCOUJhalkzNVJ0WmlUN1ZGb0JKeEd2ZDlYVndJY0FXRVJ1UzMrK1NtQklWWWZhNDFPamRtV05qSitQUDhhQ1gzbVNrYnpMeXVkYzVzZEZDbEtHRmQ3Y3A5MC9XWWNaVUpuTkYzcy80cWxhTUFhOHNsK2FxS3lNMndHa3M4MTlQTURkZDRwaWMraElrZUlEMFVrOGVJY0YxcisvbFBna2VIc3BwUkxQaEh5VzNaOVE3SzlXTzJVSGxLSmpTeGt6Ylh4NzR6K3ZLK2djRDB3ajVzOVpPaHlQcGlpa2dCWEpuMUJ0ZFJCSW12ZmRTcGpsL0V5MFFLeWZHT3RpRjFXYy9lS21MK29CQVA3bDZ5RFhFQlhtdU5rNmhvdi9FZnorZEkydUF5QVZLcnJLSU1GZDV4OHRZcUpyTWdFeDBIcDRYd2dERG8rYWNUb00yRlFFUU1PandmU2gwS082b0kwUDhwR0pocm9wTWVMaFdwS3piRklMQjAyVEdQWkRtTGNCeGRmQjBjZ043OU9qaDR1My9TMkQ3V3R4YktOS3g5dmZLaVlwMFE2N2QzOXE1NXp4azVSUzcyODJ2ZE9jMm1QS1U0MnFuVFhyb0UxNk9vOFdaWVhEdU1DR3NXbVlHa0d3QzROaE9kU0oxUVVINkVOZjVjWkR5ZWRTOGpRUHRHMjBQTXA1OGdmQjlud3N2YTJBcTQvVkFvZlY1czlhOHJ2aGtZKzF5S2puUkJiWWY5T2NIbktrSlAxc3V1NVJvWUVNT3FOVDAwblR5RG9hSzczWloxMlFWc0JMVERvWStwWWoxSTNHQkpMeWdOQUE4KzlRZHBMdWxKeGxnQmM2SHB1TTZZV3RWdHljd3VOb0c1WERqcnU5c0RLVnRCcXh2WTlvbEJNN0hFZk10SHg0Wm1tUXRZSjBOOWUwZC9JU1ZEdlB0bCsvQWlHSEtweWNCY3MveU9SU20zTVQ3TjVBYzA2ZkN3SkV0bjkwV1RKUERNcFp5UTBwWER1ZkZZcHRyM1BBaDlKVDRyYWwxeWNVL2ZxMEJZQVJMdUNySStuTWc0bHVJdWJtU1BnYjY3N1lYOVhUNmtobTVnOC9WSHQrMEk2RVk1enBZUVhqUGdaaUFWR3ZQYzRvbEtYMzVMMDU1TlQrUjRsbHZjL0Y2WkFWVGZDbDhVSGhYTWNxbk9FcFFZVEVlTzNwMXFvWkhBYTB0eEUyWE43eTJkRk83dXU2WnNrSnNhc1JBb3YrRFFHVWh5eVFGbENEbmpYMFdqZm1xZTk1YmJvV256eFJVeDk5N2FISkEvUTQ1WUZEYTczckIvRmRhc1JpVlVJWGJzUjJEQ2FqRkJVc2Q4ZkRZcmZmRU9VTXQ5ZDd1SVRGSzNuRGVOL1RyZ3F3dVhxTUJUWlpObUZ3U0RwWkxvMVY5TnQrVUg2cWVZekx1YndOUCtabmJBZTFTZzdIOVRiL1ZBdU5ua09hR3l2NVZrMncwZDJGNjVmQlQ5dTRmclAzeWh4SmYyU1QxSUMzWjBMV3VqbU9QUmN0aTNEdDdBL21BcE5ZUk9uWjJCemFvZGxKaVZGUjhLL2VUZFlNMjFtcTQ0VXBmZTdwRFpOelk0WTVmc3QzbktpTUpiQXZES0I0SW1UczFjY1FaTXhISmRTSEJRQldEek81aWNzbG9ORk9BQlR2VHdaUm5RSzNMb2RUWmc0TTdpRWE1QWh6b1FZMnNpemM4dTFhVExxbU4vMmxqVW5KblFGY3BKMU8rVEFHNm5IaU1Xc1NaTlNZekNvNlhWV1Bpd2Q5UTZneW1xQmg4U3hGUjU2QXNVa1FncWU2eE5KZFVDT0c4ellTN0hHL1h3STNOK3ZHMEx3RGZJRW5vUHN6SkR2UjVLZnlFSTJ5SlV3azByeEliclJmaEZsTjREYm9tZFFBOTkzS3I1N1JNNTI5dXd1NWF4Zk9CeTR2cFo5QjlKMzRORVY1bGU2RXN6OGtkeHZ1RzZDc0ErVWdGdFlzNCtQUkF1eitJRFNQaEI1NGFqUTVCaitiMU92b0hvS3VBcmI4eUh5ZEtTOXozd0o5Ylp2aVN3SDhTVmNrSW5lbXoxN25WYWQ3N2dDVlJyOEJsbVBCUk5ycUQraW5LdE9WZGtGTVc2TldGak9KeVFuUjI0VUFITW5LUFEzQnhxZ3M5V0dIRnlaYmkwZWt5d2Z6M3pxVG9jQ1ZCdmJtcldBVkw1NnRCcVR5VThZYlRpdCtZZVptVTNrR0ZYK2o5bUx5Y0VNQWJ4ZThxL2txU0k5YTYwWmN0R2VBcnRxZHliaWFyZjVMeFY5NUNldjkvci9hSmlOMyt3dnJZSEJjbkc4dXRrZ3YwOEtFVmF6OVR3ekRsMWh4b3Fvc0RMZkVMbi83eEFOUGtJU0VGaEpmQ3ZtQkhJdUUwaE93eHBzNG03M3A3d2ZUK09LSXVveWpNMHlZVG9aaDMvdnczeVFxRzY0WGRQaDhjTWZyK2dlNFhBc0l4STlLaXo1UG93OTUyWVIrUDhtYjhSVjJ4eSswdDlkenl0WnhsUDloYVRFK2MwYVcxdmFjeWRWMGEwWGNYTnRJVkU2dVlvb2lQRnFBdFp2bnhVaEtYU2tJZXArRitNL2NsOHo3OVZsTHZnYkFDSzNxT0NrSi9jNVpsV1NTMHdkRVhIcGFUVzVpOHZidmJyN2hrMDlKVm9Td0NWRVplVDVVSTdSNnZmZmszSFpTVmNqdUtvUkd5UVdPNGNDMGRtdWNSRHp6MmF4cll5QnNONkxUc3A0V3ArVjY0K280VFpSbkhkNTQrR2Z4bks1TUdLdEU5Yzd2bkd4cVpoOEJ2YmdCeUxKVGFZdUR3ZVJ4RjNMc2NRNGxMRmJDV2xRV0lMcjNGOUtjaksxdisySXUrNUV3NU93ZTNzZERnMEgwZ2swcnpyNDNLT2RTK212L2NOdFNEcGtwcHV2aE5zM3dFaUlRQ05qdUhUcjNObEJIT0tpL3NLMXZZM1pwajk4WURjNGcyVU5BS3czQnFKN0lZc0E3QzVDUUFpVi9BekVSMGFVcFRjUkhzVWpSeGtGMEMyNFZyckxtMDVhQTFPMTFVTk54V1NmS0RNU2xIY1d6QjlYZkpMR01qRjNxRU1jSjFHNWZUSXRMREtSZGk1L2Fvd1BIVHczcXBLU3RiWWRZY1RRLzVWSndlWldEOFpWeVp0ai9RZ0Rra1lOckhhVHIxQW1tSHFRRThNWGNQYW1ndTRaTlo5M1FEb2tBbW03RG8yN1g2RXhJb3Y2ajVJQzZIQ2NMY0oxUWdXY1pHSDJibVRIZS92M2lNS21Cc3Uyc2xUb0dUTGU3SnNiY283Zkl0Qys1ek95a3QyTGJIOVY5QWhBNlFFTEttUmk2L3I5bGRnRU5QbEc5aHZQMzVWNmhLdDBVMTMyV1pKendjbEdsWnIrMko1cHpDaDZ4aWNBTFVFUjdxU3VOUGhCSXZ3cXVsVGdHaVJTVWFSMHpqSVFtWC9qcVFaSEpNQUx3SFh5cE5VeXVWNkgxdTZPNnV3MW1pQkM1cUh6VHZsZnBiaHBlTmJ3TGRtcmNTN09CdTJmL2Z1WVY1KzRNOTFLZ1M4M3FZdFlNd1gwY01FUG1TTlRVRGl4UHdIblZUUU5CQmxVeXF3VVhQaVFWTEhscXZpdzR4RnlBaTFVTzg2cjQwWEdaaDlIQkdXUFFwSjdmOTBleHY5TzhoaU92K05xRXFaeUlUZmRDVGkrK1RZa0RVYkcyakRseTl4TEMxaVVXU2lGUEdwQzM0S01OL0ZYWHNyRkF2amtoTWh2d29nUFYvT01vUUhUaDRIeTI0cmlNSTE4YkNveDFuUW1ab0wwRUNqOWpMUkVLTy9QeG84cnZPWVF6Y3pKdXhSQlJwRnNRZVk0U09Sa3h1WGxQTHN5TFZpb3FwcG4rTUVMV1ZqUFBaTG4wMEtRSHRSSVlhei80cmo4MVBjWGUyMCtIRnZ0K0FZei9UY2ZzbHA2U2NqQm5CMVdwTTRjcVJwNGM2Z3lvS2tvcFpqdU8xRFRzQkVxdW1uQXZSRDlQYVZNS2JqUWdTSEdFMGRqQlF1Tk5IQy9yR0o2MlBqeE9tMzdqRkNYL2hjRHdJNEtHUDJwWW13bVFkK3N4L2xBY1pvQmZXQVBXVjRCajNLNEM3dlRqOUxtdFhQV0dOczl6YktoY2ZEQWlyVXRPWkxHQm9NUWdKMU1UNGlKMy9ET3g2d0VTaERwQVlrdkR4bGszRFBXVjFWLzFwYVc1ZGpvR084N3NWQk11aHhUYms2NTdSTXRuckZtcW5PQTFzd2Z3aDFocDlQQUpWTkFaK3RrWHVFc3UvenVFS3E2WlltamNQL0tDT3M2UTRpdXhseFpzUVZZbXJzTVdNcjBVWHNLaWVxakVLQ2FKQW0vdFVxVXRQTVpISDhUTkU4MTVRZGQ5eVZIdkJISm5BeW5GbW9BR0dwbjdqRGFUNzM2bzAyRXpkTlFXb01HMmdENVlwK09pY2wwb05taC9BbVQ4Zmw2YkY2OXJjd0NXRm00V0ZXZU5xbVJNWklVY3FtaHhlTWVWNS9MRUliVzlQR1dtb09tTkZYU2hYTzdKZEpJd2V4eC8rb1gvaFROVjI0bTFyQ3R2SGx6d1JySG9HeHNFN21wcE5ZTk8wV09XQW15NzVkL2FPaUZ6M05abUc0N3ZnYlNQTURLYjNqcktCQzUydEdjdnNwU0lLZ01nVmhlTmV0RUFGWG5HYm9KS0xRcmRzQTFXY2FwT2N1ckxRZmFVTnl6NWNVUUR3V1FFRHNZVUlnYWsxSkl0YjNYeXp5NHcvTld1cGtPU1BCZVo3dWp6OHhlY1h5alRPRHFidkdPTU50L0toTk9xeHpkbktYcUxiWFVVdFZnUWlwblVzZTU2Q0tvQUorQkIxcFJ4TVdHRFUva3hNT1NXS2lldlF2SmNxV3NtUDUyTk9iRlZWOG9KdWphb3UybU93K3lrQndCV1ZvYnVCUlA4Y1JQd2dBbUFjYUorZG9JMlNzUkovYWZZQzR5c1VMRmVXdzJYV2E3Y01nR3FXdm5FNkg0MStJNitRR2szbDRITVRZS2JveGtGSFFWRmVoMlVNSkxCWmFIQi9Dc3M1T0dRTDRkWnlHdHlkOFcrRUc0ZFp3UGpJWlRNbFBtajFhZEV2TThjZDR1ck9WY05VUHkvOUk4Z3BMMHRwd1cva0VNaUpBUmVmOHR0T2piQ0h4ZSszdzlENENiaVZteGt2QTFWUXpOZXV0U0R2b0VMTkhueXZ6b0s1YUdWck9Kd2JpVWxlQThqV21FTDNpTnVKYlJ1UTNxNVlPeWRkVHNqWUpYQ1IwYzI5bUZYdms2NFNEMm5FS3V0bXBZTXZ3WFNUSXVJTEtJekg0Q0FnSUNBZ0lDQTgzMi9RNzMyL1ZTWDIvYUQvdjliOC84SDJGZDl2MlMvNy9mSC9oNzcvTjl2MFN2OFBxWHI3ZnI1YjdQc3o5KzM3RDc5bjJoSDdmZjQvWjcvVGgvWjd6WDdmcGJyNnZySnYyZlh6NzlYMVZQNnZySmYxZTNiK3IyOWdOaUF0TTZRb1BxenRkQlB5ejB1T3QwWjZRVjVLM2szTmRkS0Q1ejRvc094dkMrYjRsaWVXbkR2cGJ2cCt5RzdmUVcvTXo4R1l1djY4aE92SjJJL1JYNkk2UkczZDIrdzVoaE45MUtnR0lxNTZISFErTU13d3RhNy9HR2pQTzloNWtEdkJ3N0pUSGxrMlpCejl4TVJBaDh6MGpyMTFuL1JVR0hJL3lVV0VCVjBvbVNYM1JWQVhrZnZkYjVGMDZoNkMxSmYrcHhvVEREbjJuaS9IYUZTWVdwRmJtSDRDbWF2ZElsOVN6TmxZR2hlVkFTdDQrY3ZEdHQwMTc2NDVYNkZ2cHpYekU3UDF1N3Y0Q0ZwaHRNVVhSa0FTRzBBMVNoa3N0ZTI1bjJPZ2ZTalhQZHpVNis1RHFxdkYyNXpBaFpFWktYamc2TjZWQjJZNVlrZWt4OTVBVnRWSERudTdDUDJmTjVzZnIxcTI2RkFaVHpMdmE1bUtiTHpFMzVsYzBWcnNJaGNqVEZoeVB0cFRPYmsrS1lpZlNram1uR0lCa0xzQTM5N0Mzek1SME80ckxSVEVodGNOdHU2VnZWOE8vaGRPTWdCQmFjY2t1d3RDQmx0STE1RTBRQitPZlhaTUZ6cVIzNCt0N3pvSG1IRDZUZWViOUxpcWZrd3RtVXY5R2U2Um90czliK2d5ZFlrSzdpR2VHNVE3Sk1nTFJhZWltYlRaZkVlKzdaeXdTc28rQ1F4ZkxSL003VmtEczNHQ0tSaUpRS0hvM3ppczdFM2tPcjVMWFhBRGtBVW56UHhCVktiUDNMWDIxZnlTNU4zdXJqMXhTZElJZWxZRXRnaEl6TnBwYnBQQ0VDdnFkekFoUjE3bGVzLzZpUW1CeXlneE5wRmt1d0hhUzA5dXVJU242U1p6cDlrZ1pqbjg1R2dkTUkxV0FUWURhblZWNDFrbktRTzVodzErVndMNTM2N21sTXQzQ09UdUpaOUFjekIzbjMyWXhKbVNTZXdyNW51V2JGVGtrcWUwRXpJNk4rQTUvSSswNmwrREMrNUFxTjU4WTI3eWVBeFJJTGhlU0krVzd6Rk5Rd2FaZVlQN0RlL0RIVjFlYldPMFQvUC80UzhEV1BwQmF1M2NTeDM3elN4Mk1SZnIxNVVrQkI2U0YzaGdIQ0pFVlhFaUVabDByRzQ4ZzhKRENUczllZnFRaWgzSzVVZ29kMDY4cnJZVHJvZURwSkQ0TEo4TGpTTzBpd0tpQjh3c2lsbDkyMElkZFNPaktTUEt0TGpMTjRsNGhpYTRBVC9lNS9VNW1YN3hSa1M5WXBicTlFcjdRcE8ydWpxUVV3cXNmUGxrYXBBUEU3WWRNWjJMNldubUl0dzRCY2hQTWU0b04xQS94ZGFWbjJIbjdCT3Q0R25OZTRVN0RXV094M0tiWFJua0RrTWFuRzRXVWN3bmxka1VMMFdsNzRNSUR3NTh0MHJqOHJLRVBMdzVmK0M3VHdxcXEyYVZYSmg5YWthN0FUUXVsU1hYN0tYTnZ0R1JORGFERnpPSmxjYStkUzAvMitZeWhtV0IyL3MzQ25pYnVET2FmSjE5eCtsVnp5QUdHcUZvUVFFNzRWcTlJaFh0eUJZcmpOcXRRR0xIaGg0eTJjTmZvUXJlMzYwVnhEcHg2amJrd0FobFpzOXRjVnFhaXh1OG1zSTBKZE40VldMMjlMYi9xUnFST1ZiZ20zMWdEamdBOHArWmx3eUpBbGR0ZVh0YjhPZStyZUgwNkZNQW4rWld0dlVRb0Rpa2cyRHhTSElpMFNxMFRaUFQvcURZK3FSNFhUcHlYWkN2WEllMjZJZ0tvMUVubHZaM0doZjlhdHdQZkt6RUdWeUMvWU12QWVZSDBwbTl1TjAxeFpkYUsvWWFqTGJOL2lvcnNWRE9aazJmNHd0cmliM3YvTytoWVMvdW52U0o4LzJQbmxPNnZLRXBmb1EySWE3Y2pCcFBDckxxTzJtbTZiOE9hczdqSncxeHVkSnlrdElNZU9mQXEvdzh6TCt5Rkd1YlF3UkRtUGJuSkxqbVI5UnJqTitydHJNcGhQdVZlNWVkUzhPNEZPN0tDQ0VLbVNUSWZhUk8xT1Rob2hBT0pGUGV1SE9wTGNDVTE5UjluQWJoQWQvT0w0YmptYkZyeHp0ZDYvYnkrUDRsNWhDbWlTY3lmdUJSeUxWK01lemR3MzJsSnBMR1BodzZraUx2dUhJNFZEZW93TEJqZnZYSTRmcTBiSXY1cFJrb2VNOEtDb2tsK3pnUkYvQ3dLdXZSNjl4U3g0NGpyWDlBWSthR0lKMURJMlZDOW4yU0tWTnl5V3NzSFhPdTVLQzQvczllRGt5TXVHejFnNE9Jc2h4NmttYzFqdlRoa2EwdmxLRC9ycVFNWnJPellQVXVhWTRxZC8wQmZPU2ZlOENwVzVoVkdNM3ArTVVPdVY3OGF6Rm1PTTJnU2VqcE0rZnhSeStWMnFCMERIdkwzWEFOcnNaKzk5ZFkrY0dwU1pVR3hUNE5kK2s1dk43blcyTVZjUWhZMUFNb1Q5Zk4wV1BZaVhDZStaU1dnRGthdnNWZWd2NEVZL0VoZTdkMmpqVjV3eVNKOFVwM296YThYS3ZKVnRSd3RjeXlSNkptS0RyTDFDcCtJK2d5aWJEM2MzMGJpZVlzNDExcytkNjF6ZTZxTHVwSStMbWZTdGl4bkZoNzQ4U3RxRVorTVdvNy9WQVZSMHErNGJOTGpFd0llMEJRWGt0L3J2NC9saWdkWjhob0Z2Qzd3cDh4SVZSUEhPaTUyNHR6WVBZcTUzenpiODhYTGxBcmdlbEd6aFhtUS9KampTclhKYmFCMWFIZyt2dWNYeGs4ak1tTUVOeVBWNFFnWFpCRHhZTWxsWW0vb0pBdkk5VmFNSU1jenNTN3puMExaMzh6VkY4RWtqY3F1MUsrenhDWStEaWZ6aDVnUGdYeC9ndk1hc2tuTXVURklxaWFYbkw3L2d1WUhib09kZml4MTAwNmZ5RmJ2dzlBZWJGUGpWeWlEMnZGYkl0NU9uS0pmeXZ3djdpci9CZ3Bmai9WT1BTSTViRGw3dEFuKzEvamJWR1JNTWV2cGovTW1mTUNUY2E3RmR5R0crSWJOciswUnFHWUdlYWRucHJGNk1ZdmI4QlQ1NUVydVJwQ093d1dqK1EveThCNFFyWUorWE93VkVSZm9RMm1ZMVEzYmg4bWJmYU1ScTNqMTVKNFJ4U092OHFXQ0o3SXBvRWFaZkloRG5raXUvT1ZjcGtqOFFUcGdONTFXRmJEeFM3TmNwN2dJQ3hTQTRTUnBTeW1NYm5tSEZvWno0VlgrRnlXcFl0eGlua3BBb3VGZ3QzTlBUMUtwYWhOaEk4eFBkbDc3RFZjSFBCZVBtaVBwaVVlTXFVeFlFYW1yWC9MVi9XOXo2a3p3aTMwdVIrbzZ6TEtWa1VFMDhBODhjanNyL290YW1OaXpkY0x5cnZDS0N3QTVpd2dpVTg3WmV4WkQreDI2TUFsNG02Mmd2SjhyMHRMTzBFRjg4RXZBdTNPVGM0ajhLSzNhaUdPM0VnNEFTRTJyU3dGNkl1dllyU2VSdjVrWC9SUHorc2Vtenhhc0x2cFptZFR3RTVSVURKaXVtY054bUJzdDg2T0FTT09hOGlpOWdwSEx6MU9hQXJKbHBQbVliellEUEhEZEZna09iWWhFeXFaVVBMSzhZdksxbjljZlhveWl4OHdKbTVQdXJtWGdxeUcvb3hwWG1QNlEreVViQnI0L0pwdS9GU3FTWkczMk16MmM2VzBSZkpvZGR4WjlXOXdaZ0ZxYklSZWI5V2kwZkEzVTlhcFgvQXVpakltUFpnMHI1MmxXS1QrRlhVT0xtWnRKOW5RL05DcStYY1RVV0ZYcS9MMDhpcnlCWXA1QzRzVGFUdTE2R2dUeGpEcjRPUy9pQU1sM080N1hIaDRDODhwU0luRUlZcXQrZ29FN0lNSlFEa1pvd3pmYUxsZGZBYWkxVElSSng4SzNyVkUyanZGcTJzMFNzZmpVNTJqUldsR2ovQzNIN25ZWUlRL3cybHFWYmVyTGNOMmpiZjhzaGdvQ2tDTlB5SGJxa1MraG54QVNmb0NOOVpOUFEzRTRUa0dzV09GS0RZVDZmV2NKNkl2eUhabUF2OUlXeFFZU2NIVmZJeEZydVQ5b3RZVFZlaGtzSDFrMllqeG85RC90eU0wSkpZOXlmNzVnTkZrWi9keUo0bmh2ZE1mbW9CMnM5aGU0WmVwZk9DcHlid2ltRFdFd0ZxMVkwbEhaMmt1c2ZhdjRzbTBTTDB4NDhDa1NHRXNmZG9xTVhJTTlJUkwvUWk3SVcveEJiQ0VOSSt4eTZWdjcydXF2Nll3SXJncVU5OGl4cGJveTBwZXhseW51SEZwMklORmtBcUVCTy9pU2lPYnhQemtrTjlwUkthN0VWbmU4VUFuMVpoRHlQK2I2UUdkc1BXdkVpYUlmcWkrVHBrUnlvM09vSXljQzArVVA4aWVoR2J6SjVzM3NLejBGeit1ZGNUNDYwTFZxZnVSMVZYTEJoODExL0NHb0Z3S2pzSmNzMmltVko0NUI5OWQ1dWc2SC9iclVSdUFibWU1NGFET2N3Mld6eTBvZGlYcXlzTzIrUDhXTXBVV0RPSWZKdmpOc1pPZVk4TTFBRjFib2xtOS9md00vbnFFQ0ZEWS82TU90YVo2MGRoS2x4dllrVk5RVTg1Ti9VWmNmVzVvZUdzYmRmUmVTYzhnajNlaWVBbElYVmZ0VVZQRkc2RTlxVTczLzUrWkhoZTk4bWw1dGtrQmVpUXN1dmdyaUN4c2RnZ0tYTkRWazZFdXNmdWJMZG9UQzg4NXc2aUZXQ0JaaVB3ZWwvZ0dqVHhHd1pRN29NaXI2a3NmY1F2VERGOXNSOFZ4OFdiQlkvejBkcW9ncEhkK0RWZzlSYjRYY0NCQmhyUEF3RGFoY3lxZ0pVM0NDQUNDOFR1OGVzSElqYnZ4aXdVTUl2VzNsUU9oRDJBbGdhMG40R1kvVFFaR3ZocGZuWHgwbGNiMTEramFrOU53ZGQzQzI4K3hFYUxydFBrRDRYMzRlVE02YWQ5T1lCZStBSDVXaEp4WnpzQ0Z2bktyVCtySzM4RCsrdkdrNXl5N01raVJTUmYrUlgrbG5OWi9KV0NXNnJwbWtEVzBzTXVISGVScmVsd2NxMFV4cVZIS1h3WlJESVBWZzhHQlE5eXRSd2NsQTA5Q1FyWGtTYjQwKzVhWGI0SXpvZ3F2NTE5YUxOUHh2amNCSzRQdzFYaGxmNjhQb2RUNFpEQTFYVWRPaE1tRmY0anBWTzlCenJqT2ZsS3QwQU9GeTFIMjZXM0lVc1VQTjFJQ0NoYjdwVllzeGUxR2MySHFXSjJNSGUyUC9oRnIzaHVBUkE0cWo1dllTQ0pORGFVQm5pZTg0RHpBT28za3FzK0VoRk84L2c3b2VXcmpaSU81anB5MndxYXU0MFg1V0kvN3B2cHZMS2wyQkNWbFRNSUJ6aGJ0dzNUc3JGeUpIUUcrTWdaSXlHNWhkcmwrMG83RGl6djdsVU1XVnJkbUR0NnJVUEZhb2JWNG9RRUQzc01IMXJRMVd6MUUrWWE2NkZEWXE3UWVPcU1PeUdKSlg5UE56SlNYVTBNT2IwSHF2Mi92cEpDblB0cTI4ZCtJZUw3ZUFCbjREZENZb0pEejd0YVNpTlJXVXYvUVRKWFhVdWRXaTY5VGw5MHpzZm9Ob1RqUWg4bWtBdStiNWtibHF5MkR3MXk0aTA4TWxwY1lOeDd0LzhiWStsS3cyR1JBd3hHem5rRTdQRG5Fell3d3FicUZOQVFyRllKQ0dwYUVuS00yeS8xbWdFd0s4akN0MklWZmdWc3A3UzVMK0pyUzg1Q2lwZ0xtNVpjREtWYXNIWVRVRExRU3ZnUXFZM2Jpd0V2UTlseFhzWnZWdnpSUTNwWXFQcjcxT01iQUpGSjBhWUQ3bVhzZWMwcTZWWTQ5Yk40eHd1ZGFqcWpCSnVtd3hLdCtnS2k1OEFOalU4b2pDUy9qL004elF4TUpvdi9NamVyYXdUL0RCR1ExVUU2c0tTdTc1NDk2aG8wRmc2NDRYbVhkUU1jOVhYOEtuVEZKdlhPMG81bVQyU3NzTGNkWXJTakZLckhLM3pST2xBTDRWblE2MFBZNmZMUjF1VDNSSXcwcDVYTTF5aUJxY09MR0o2U1hBRzdTOUhsM3BiR2RBZUF3YkdCWDVrb0F2UWNqY2YyTTMrakRxZG01czZDRHpxT21OcEczWXZDWkNtbHJLZmZvYi83eEFkK0kwSE51Smt6R2ZaY3Y0cFVCQjZ3YTdoMm9kdXdBaG12S0RoY3VscER6MUhpbjFkOE9UM0psNEVKN0x2aEwrUWdCeGlpNHhxeG1MZHMrc1d1UmJjSy94NXIwaEovczJabHcvTzZZL0VJaExLVVI0TXhtYXJjMDV4Tk1XYWphNlMzbUdhTXFwaExpZnZFczkvdmNnV2VESXI3SzFYUWIyVUw0ejhBelpuU2dvb1k3cDVTMGFoaUNwd010WVk3UUJKNm5RMFltYVhhM3NLRWVNRUp6VzAzcWROazFGYXQveW5iZ2RKcnZwVk5tUGZpR2VCUEQxbEoxay94dkJxdGIzYzQ1TG1Qa3B4Q2VISjJ3ZnAvVU5PK0dNMU5oak1DQlg2aGFCV2ozMlFzdUtqREc0R2Ftb0RVOXc1c3ZFK251VVk4d3pIWnZ3QWJvSExLdVRRL0FiZlZJVitlUlNiTW5xaFdZajBqZXlaMUhsRW9EMnhvWFFVaWtMZjFJOUFuYlcwMkZYR20xYlZkb1hKZ2ZKNWZ0TnRRbDFjM005K0RMMWxDYTVMNlVkUDZRTytabDRjbG4yczUxNFIvdFJHQ05QSm05QUVjMzVrQjV0OUMxblZmL3ZlaVY0Y1g3Y0s3SFV0TUF6NThnZHUxaFZaZldvZW9VM25qbHdmbmlEUHpCR0x0QUF4eXlDUDBuYmViSkdWcXlaL29qTWpzV3l3SXE3a2Jwa0ZVd2duemtuOXpzRlZpTGkzekpZNFhUMXQvRTFna2V6Z0x3c0QwalhYUkFjUkZnZkt1R2xpNkxNa1JaVG56OG56N29UY0JiWlJEWnM3OHdITktucmhRa0htd0YwekZvVDYvRkRZSE9mcVNEbThoNkZVUjQrTzNZTnF1cVYyVzNNZHBDVC9QbnJvaWhxL25NdmVnT3FNWjJKOXFvbHF6ZnoyTjYzNGtoSjVNTnRxa2FGdFhmZnllR0toV21TT1k2MlJhbGRzRnkrNWNYeGEvQ3VFMDQ0YXA2TTUxenVuQVdDYTRNaDgwb1dQeFV0cUowTEVXWXhJOUhMdEs2cytOLzNhODBNQTZVUWRBbUg0eFZaVnJEa1VTME9aV2g0QUNoK1dpbE9BRnFkTFhGdzVrNFlyc2trY25KRTNVYmt3UHNMTXF1cnFpNTFOaWNyQytXUldRRkV0OFdaUGlwVUxQWENQK2g1Z3EzZzlwS0pBZTFvbzM1UUJjMVFwb0RQWHBWSlNjU0VqOVgvWC9IZUo4b0Jkd0pYYk1xanVSNUdUSlZaWkxBb1NuVEtJZHZQckNvbjlxTFNmcmVFR0pmM2hoaG5PZ0NvN0lya0ZpNitjV2s3RFdSbnBWK0VDVE9HS2hVSjVrQ29teUMxTTIva2hwUnlxZDlmZEs3TkxWc0F6dTVoNnlFSExyeFhPNGxLNFgxS1Z4NGtNNWhiL1Z2UFJldUg2MUxzSjlOaG83S3VDUXdjOVZOeWZxZkNjYm1tcUozWUwrWWhwWlVKSWRqdk9hWEpRQkxyMHZ1OHplZ2NDZHN0VEUrM3kzU1ZnZlp2d0hpTHk0d3kycGh1M0NQdFFsaVVDM0tDMlpUMlhacmxDV0Z4M0dTS2pKNjZNZzV3cnVkQ2pnNTQ0djhmYVFibFUwZ2NOOUZocE0xT1I0V1l1d1lDaGozMW51eFVJdXFUZzhGdytQWXNPc0xYU2kyc09XNHdnWm1XQ1FTejJaaHhxQjJLQzVJYXhTZldLMVJHaVdpNWg0QmtDUEpIaVRVb1BCaEhCeGRvT29qNEpaUEZuK1g0bXpBT0dmL2VTRUF1RXNObHNFZ2w0b05aSTNlSm5nV3FZZ3AydVdJTDYrSGNWc0t6MllmSzRWNEJVUXprLzNEQzlWSDZSK3gvV2xPQzVHT05qRUFaRUV6SnpGMmkrRFBSRkNadHAwbzQwbmRBb01mVTlPZm5jVm1qNGc2NHIreW1mWm9NSlFMMHhKOHBGcXlhc1UyNnptYUpOSUZmUUhRWkE5WTNZVkUvbGZXZWkyOGo3Q2RNc3FDR0QxeFNtQnpUVEViZWhFenliUzUyN3Vja3kzTG1Uc093d29CajN3TmRxRUJOcGQzK1dDbXNndW03b0tiR1REM0l4VEtXTWlSMTYzRkxmNzNnMEFoRTEvQUtDV1lHTDloZkRGWWUreGtFV2xiRGZHeTNlRHNhUjNiYkFNeFl1UXBKdXptbXhvM3F3eTBtdGp1Q2RCRkltVUJoeHNnRUQ1ZEI0ZlZjT1c5ZjFjVUU3OEp5dFBiUVJrYUZjMWwxSHc1Um1tVmJPZEdpNUxtSzYvUmVNMlBTRHd3YnJ3NTU2VjRFb0RNWmZBVjQ4SGh3Y3ZxVjVSSFNUQVdVRmlUVjJSeXZOd1hzV0RzMnJFYVBaaWZWUFBIVUFocEZWclRVbEJMRDgwUnk2SU9uV1hDWFlDZ1VCVmhZdUkxcHVjcm9La1dtbzI3ZVNoZk5UUkUrdXpYd0NMVTBIUFBSZ3R6YkVTVmFON2RzbXU4ZjJVeFg1TVJZTC9hdTdBUkNad045RVFXQmJQdGFER2V2ci9ZYjBOeC9acis5NTRDd0cwWVQ3Q1pHZVF4WiszeHFDVTdrcGhDOEpubXBSQ3gyRnNBOEkvUllrbHNOOTYyMnZoZEVyTEFUZUdOc3FoaWhYNXlLMmVyY2hUTEoyQmVmWGZiM0dpMUZuaU1sM0gzMngyY1lHNm9LN1IyaVFxMXFyRXhnRzJOUTZ3bnlNWXVEQ1dWVytOeThsMG5NS2NQTzVETk82Sk1hcWx4eXFUTFUvK01mSG80Um5NbldnZ2h1YXBDMDNaVkEyN2tBMGcvUjFoS091R0FWL1FadDZ0MUthRFBnVnY2eW80WnZMYngyN3FTYjN6V3FXMUNBbHlKS0wrbUZJMHp3K0NEZ3hVeElaSUdEQnhlY2dMM0NRdUE0VE5qUUdoRDc1VWxoYkFob3UyOTJMWHlwSkZYR2FoL3c0czNENzJtLzU0ZXppSmxTemNrbkJCdVV5NlhRUUpKeGxVWURRZmFZN3ZhZmd4eVAzeDZzWXpxWkdOcEMzdUpmTE9tWW5NY3NEWFRodG9KaDRSYlhFS2x5Tkl1RGZkay9iVVNteEFuZjJJMGFyS3NtNEhQam9rcjMzcVVwZW11aGxrZzVxMGtzdkU5MkhZZnBPeVgveUVQelQyR2d2K2h6TGxRZCtCTFF1U2txZHVrTTlPeFFEejhsYmUvMXp6TFFqT1dnOHZMUWJOczB2WGJsSmx2T1dDQzdncXhIbWRXaEZROGVjQ2xTUHJVVHMyblh2d3NyVTc4YTdTUHo5cnhxRXprZ3lvZ3NyN25OUGdpNTZrWSswWHJJWkwyOWV0NXVETHAzd2VOODhTQjdoVXBIcUhab0owT3FzRXBFSkc2UnJmd3d3eGNSVzBwUFFQSThLTWsxUEplRE9KNG51Sk9UYXNpMGNmZ3JRSlArak11YTZabDR5cy9YMm5VNXhHRjlLS1lrQ01CbTdzWlpWbEY1ZFdoQnZsaUdXYVl0Mms3ZG5iOHVZVHlZS0pXSlptYzhxcFZQcTFWTkhWTGVUSm1OMFlSamtmTU9RMU1JZ2wxVS9DZnhoWDZPNXBlSFQ2NS9xWmhvdVBkRTdIV09RUm53bEtYSDVJdHR3UWsxVUZoR3ZOZkNiWmY5dmFpdTVKMjhselA2Z2RxNkNqY1FrWXhjUkNsRURiZVlWYU94Sm1EOVBrcVgzQjZMblM1bStYbldvdFg4Y3hUQ1JSckpCYTArMzJYZzZMUGsxNXlYWjNtR1YrTTVENCtwOVRHNTQzSkxQQi9td2lsS0dJdkhZRFdNOXN6M3VDcEI3QUpSUmJNck96enBuZ2xIRTAzbHNIampYS1BBcjJRTkl5MExWTG5BR3FmaWFqb3JqVFRNYVRCMjJNak5rWVh0NmdTaEd5dFpZQ3o0T2MrbzRUa0ZHNkNwQkpOMU96U1dVNTFPODk2aTA1bUVDUG1zbktoQnZUQUdkck5sdnlFY1c3Qk53UVp0WWFkYmYySnArT0RMNGVNeTZrZERVUUlmcElheVNIbUx5SHNQT0FndFhsdFlWdGZyUElVOFBNaDMrK21QTEhCeUkzd1plREhQcGVSMUh3UkdSWUt3OTRwbW11a0JwRkk2YUdkSUsrNHZUekVOSDdLV2FKTmdySGpuKy9OR2ZJSkMwS2pGaG1QZEdWY2NwNVdrekZkYUFxeUg4V00zcGZMUGZpd2hNN05GUGZqVDMyUFZUaWFxTkIySFJnWEpEWFMwdTJVMk83TnpHMXVLNnI1RmFKZ1cremZwd1dBaC9IV0s0ZUI3eXlDYi9VK2g4d3R1NUNWSCs0SDQ3QWw4eldXSXZQMFFhTU4zNWRGNmJRa3V1TGM2Rng3TXJqZDQrY3JReUM0N0krUHNhSktjTXkxelNFQld4Z1pwWlM0MWlURFRBTVRqTXNUYkVUMTI4a3QxNmNnY2swY2R4eWk1WlRRZ3dGZ1dFQW1Oc1VoOHA3TllXclZoL2ZFb1ZMOHA1Z0ZBYStOYllCUWY0emI3ZGRla3ZUbFR4bWlFVlcvcmRORUhIbDBDY2ZsaDFqK2tVb090NG12NlMvVC9Gd3g4TWZSQ0llYUovbFJPei9ScE1OSkRNZXBhMGEyKy9TS2pJKzNzZ1p5T3pEWndMSDkxNnMzU2ZxU20vaGg1Njh2WVBJdlBEV25xYWZsd0hyeDN5Nm5uTVJWdDF0bjN4dDZNMGhaUFN5V3BEYm5OSzg1aUFVc2VVR1pTbEpRTTV2ZFc4WE83THV1NUxsUzdHeU8yTjBpeVk5UjlIdEMzWmszSXI5Q1lQOWdSRkhoOWFKUVVTSDh3VmZGQk80UGZzVXRrQ1ljQy94YldZSTNBYS9DSnNWSmcydGh4dGdZaEJZYSt2ZDJUSmlvQUFPb3h2SHRTakU2Zld0R2FsZ2VlckxKVHlETmdLSGZ2Y0l5NG9xZWlhR29yNWhseUhDcjRYUkdJYmhNSkh6V2V1WnFvMzBqSlByYmpMdW81ZThJQ1dFa2lxYmV4Z3ozWnpQekJ5NVpHQWE3M1cxQndpbDZXbHl5aDZpcDloWVNWRHArcFVuZHhzRUhSMWpIdlpzZmpyd1hzMVY5M2oycDlXd2pSejBVdCtobDN5b2lWanFydnZNeklTKzQ0Wk1kb2xxUXBmdnltVjFoejRKN0llcTcrcDdQelA2OVcwcWVEb2E0VWJZNStJcms2dERNMnptMGZNQ0MxV1RzN2N2SHVVd09MWlUzUHlicTZ1T3p4M1oyTGdDbDZ3SC9MZGdjdm84aUswNXJHMHNLOFlZWmd3YkhhWk1FbElicTJLUVpNd2VnczFVdTZ5TjVJRHZTL0c2d05uZ2U1K0UxZ3Y4V3dpUzRqWVAyM3BrMThDZUE1OVkzSGlFL0pHWDlDcEhNcnRiOWd4RXpVWmF2SmRjV2lQQXFFdTlHL1p4dkhWZDBPU3dBeS9ReTAyTFJaUTFIbWRNb005Wnhpa2NBd0QwdDNBbFYycXgvVVp6SHRZWXEwOFdydVY5dUVCS2FTNXFYeE9pOTRYZHZkRDVJNU5oZmdCN2srT09GanRBelRyY3d3QlRUT2djU0Qyci9YYzZZclRiRnRNU0pGcU9BZ1V1RkVXK0tDNmhVbWNpUVZXckl5RlRHcUpXcjFTN1RiTmtYZERFV1AxdDF3ME5rS1lWS3N0bldUMTJ6Q1k5L2Exc2hFeUVvOUhkaG5pdkN2R0VvY2Y0VnRQNm1rNkJKL1FwbnhLRkVzWEtRMEM5ZkZHc0sxMnVlNUtVUE9GYyt3K1BaYks5c2VoNFBSVUF4ekozMll0QXBVVENuN1hDdDU1bDRnU1V1QlYzS01qY3BwUFg2ejZ2TnJ0R2FzZjNEQ3BTUDNRZ1lsZFRSakNsWWdsK3g0azN2cFV1YVU0QVJzd1orZWU2Y2hPUE9SekRlY2ZyZUNRNnJWcjRjUjNIU3oyNkVqaDJ0OCtDTmdoRWZMc1ViQ0d6WnV5NFgzL2toMFNheWFxNFU0U1VpVE5GTTBWVzJWbkNBZDRBVFhkWWwxb1ZwQWYzbGRMd3VQV1Nmb2x6OXZRM1hNMGt4WTN6Z2tjSy9GdThCaXh4Rzc2VTVDbGdWS2FoUG5MYUVyNzk5bFpGMUwrbytCSEhGWDdSZ0NnYldiNngvaWkyM1JmR0Fra3B0L1dWWjU1MjUrU1ZjenBLYWNRZHFDdlpiQUJCbEJkdkp2aysvazlGcE5VUmZ2NmxNNzlIemdYQ2tQaE5XNzFJbGlqUXRvcDF1VHFZMU4vVkFmaWNVUlUyNEo5WDhVY1o5OEM0M0Vqc2VSZjduQ3ZtVTF6cktNek5sL0x0Q2IxbXF5RkE3VVkvRWtZbjNORTYwbzJxY0I2eVV1OTF6aUpVcVlsS3p6RE8vUnFId0Jpem1XNHpBTkhKamZ2Z001WFoxenBJRlFTdU5xaEFQSTlhQWhhUUp0TVpyOXBEc3U0eWEzLzdrQzVnRktmbkkyOGt0YTdaSVhXVHpMazFIKzdjRjZYNUxHNDNONG1hcWJkdEpnRjV3ZTQ4bitiVS9vQXUvWENEY25RV1RRQng5bUpHTHA2ZHFzNFJGT1d2U3pRalRlaEEvMHBjUnJvYXpIcFRUb05uSzhwVWdGd21SL0syTndXRTg4WitISVN1VXNhM1o4eDB5S1p6empuOGo1OHlQdVhXenorZDltdUJ5YmxJVks4cHdKN3J5MFA1dSt0Vy9WSGNDR25aR1BLOUtEbFpYNWpKdFpMRWxFbGVoS2Fsa3hlRHNMZnd1N25QMWY0YlNOcXlNcGtQQnFYMFJmYXdyTmxCTCtZZGRZS1RuYUVQYVAyVk4zbTJTZ0l1bmNmY2g4dUxGQlh0cGRaS0pESVFINUFnai8xNzFWSTdUcGh4WUhBUG96a0FlZjdmR3FKaDFESmdXWXJZMVlCNkhvWTgyQUd0TFNROFpZejd0V2FjL25mVWdUSDlFZXJIUW9hdFE4a2ZqZDlEVW9jUXhibzRKYWZCR2Rubjk1QXFHUTBFUEkzTmVKNFpyREVJS2tyQmRkV1ZkdjhJL3Z2eTA3TTVZWC9zVkVFendIZDRZanNaRU11akdPaEF1MDdtcUpYQWdSV3ZaVkNUK1hlMHNLRWhmL1dEb3pRUkFPV3NuaFdwTFBoSDl2akViQ1N3ZDNQa09YK0NkK2Zxd1RLRml5cHEvQXNuZXIzNlBKeG5JYy9QU1dKME5aeFZGdGEreTFoZU04ZUlqM1pGT0dveGN0Ty9KdFMzTUUrR2JrUnU1bmRncUYzNmhGYzIydTBmUkhXRVFyRzFGMkJ1SkZlbWN3ZDhqallwVVJzMnBSbUdBZHA5UHlvK1p2NkkrZ1dReDJoZC9kRjNLUEM5bzdERTZ6QUd3c0pETXhMQ3E0Qk9DaEhEN3lHdG5mU0pKS1loL0xkdzRjSWluL1J1TjR2VzVCaWJUdTliVXQxRWUwc1ZGeEgwdzl2UHhheHNHUmhVQmFuRTU5NTZTeS91S3JzVGpwODR4SDZheDNWakpvNG5DeGU0V1E3YWVmVW52NnpSQkhCWnIrNXlVR0traEdzb1ZUTzZYNDFDOUNXazVCa21udUF4YWhkU2psdHRzQjhxZDVLUXVqRHZkUElGS25ob0U0OG1qWDkzWGpFSXROV3Jkam5zbytoVS9mN09VcE9XZWx2alBMalBHdVRlUVFoVGRqOEtRUnlmcnlYWDAzTk5lTkZLMGVWVkNGSFJuQ3p0TytPOVlhNFVyQnVseThiUi80WE1EamE2SjNHZXBJQUp1ZjkyZE82ekR3VXo5UVpxaVkzVWdqZGljMElPNTFGNUxpY0k1RERFNUxKSkI1WWI3Wk5rNG12NFFpbjBlKzUyYUtQUkowa2Ixb3BsMkxkODI3aGVqamM1T1MwaUVBUFhlVGI1Zk1xMXcrNkV2N2NKN1VEOHduTDZKT0lMbUp6cjAvdzJQUlY3VFRjcmx5RXM3ckkxbERqRVNTbFJkNHJ5cHI3VUVJWUV1NkVCdllLQU5zU1NpbFBvQ1ZKMktIVW1oSWw3aGNTT1l3SU03QkNodTF5aXBWckRqUldUYWcrNUZSUmxQWVBQQ09ibFdERHZMdmZ1YmUvMHNpVi8yQnRBL3hEYTVNeitLYm9jRGhBZHZxVE1WVUlEeEJrRW5XMHVoYStlVHpWcTFteGowTFdha2EyRDREVTU4SEgxaUVoWUJoYkRiUlR3c05yWExxVUhHK050SlRJOTZlc1hLcHVlSm5nNXRuYjV6R0UwbnZvRlgzNVU3TjZUeC8rQllzMFZNRjgzdGl0TjRvK3VHNzg1cElJQW5xd1lmK2hkWjR2VnN1Rm9zMjFQZHRzM0tQZXBUN2t6STBtaGU5WWF1OG11bWh1a2V2eU85b244TG94dENFQU5lcmcyTmlKVDY5QTJJUHBYWmpQaHpuYWxpSnVvSkhOd3NFd1ROS08wcjNxR0ljTWM5RzI0eVdZOGI1QVczbkljb0d5NGZZdGdkRTRra0lpMG12eUlIZWRrbWJBMy8wSDVvbXJDZTZtanNWQ01TbWNmd2E0M1ozTGYvMUhQU2xCODFibG5tdzk5ZDNqWW5xSXVvN1RTaHlpaW5LRzAxMnVxdC9uWTRrSFVTMHZyM0RpdXEwUUI0YmNMMWZhS3NoSm9RNkRNdVp1QU9qZDFWSnhQbmlETmtGQkpIbVptaXpNbVZsSlFKMnI0SWxsOU9tbnMwczBKZUVhNmNINDQyNVBoRjd4dmdPTmQ1a1gxQmxVY0VLd1R4eWdUQm1vRXFCOHdFWXJOcG9UTDZKK3VpaTdmWmZBMlgyQk54a25ETGtwK09WSWFtQzZXNlNucEc2Q1hJSDJGN0dSdVFaSDUwanJES29mU00xbzZmcy96SFRyK0xOVmpLeVVnZDk0UVorQUh0MFdqdU1uaWl5SDJLcXgxbkc3QWdSNU9FenUyZTRadFVPUEw0UGt4NG4xeUxsOGY0Z3ZxbGp2SmF4amNOWFdacW80QUk4QnFoUjFWNGtTOThYUCtlQnRoQnZGdnFGTUR0a2JSemJnNzFSOGpMM1lEOHU5QWRnZVdmcGp6ZW42QzRPbkg0Vm00MDZ0ajBNcW9CaW9UUEF2UFJSREYvVTBndG15QVd3eDJ2TXAvdHJQdWhPakNibDB2MEZueExwTW1KeFZQSDBwOGYwcnZtR0lOc1hQUFZBQkw0bWxLRFlvSEhVUmN3eVUwb1dHVElGdW1VbWNoVGNOZ2hOcDBLVTRxVjZiMVBTT3ZtbWsyVEx5N2hSREhQdU9VL0VKRmRwVjdwQlZwSmN3R0VRbW54RzFLZ09LV24vTGt4VldpQlJsTTZZMXhrbXNTVWVUQ09HSXdldkh4akdHbWtHWUdUUnVSK3Myei9wZjhRS0VKVm93OElqdy9oMlR3UXY4TFJjRks0ejVueGx0NXhYMGI5WVpjZjBrMHRuazhVZEozSGFlc1dhZjNCRmMxVitUcFgrYTBORFVCdmRhWGljWk01Vm1xY1B5NUdpTE1DQm00NllQUG9obFJXd0Q1VG02dEdMT1J5aEp1d2xaWkVFQkFORnNUNzBaQ1phRldQQmFMNG05WnZSK0lNMFZNVEZaT3B1MFVYL3I3cVoyNHNuSlQycUo4UlZYSlJTMC9OSmIyczVuMTJqUlRvOUtPUE40Znc2WS91RmlER09xVkhFalRVRGZvaGpxS2JVYUNNU2QrUWdsUHZPZEFFM2Z0UlNGSGRTZGxjVnJ0Ti9haVJnZlA1VkxTeVhtSVFkZEZxcVI2RGttSThDL2o5TFkwd1lpTTNkdjJVcXBqVndDYjVRREdLY0JyR3VycDgvaWVEcFNWdzcrU24rS0p6STJocGRUenpqbmZnbHo4UWdRTWZsRnc4cmVRYkZKcldiWkNEZzcxMUU3RG1Zd3BUK2lQTWNUSnowendiSkNCVnBFRHgvZFVwRnFDNFRIRzlvMzZTbFIxTmN1VU5LUmxyWVZPZFMyb2RMeW5LU0VnZXZWbWFoUVd4ZG1BamRERUJSaVhQajFjMHZTSTA1VWVyd3NQNWN3VXdkZ2JKR2xITC9ST3RxTjJCYnN0czVYTHpvNWdWUTRHY2R6ZkNNTHlpWkNMVDhGb1JESEJJNWtlbS9nTzI4ZGQzbW5tbU45OTdOc25rWFpKalhwNjhXNFF1N0F6YjdobVdFQ3NiT2lIbmgxZHB5YmNOOVJ3U3RkV0RJOXBOTGNod3dPQVRiSFZzYnBGcnNSSmdGeWs1MzYrV0xHWWNXUm5LWk9lSDJwVktLMFV0U3E2c1hoRmtXK09RcVNHQThpbHA4clo1Nk10VVVqZng1RjZPY1lPQU90TzBRQTJhN1NJWG9qQ1lCQk1LUmJ1ZXRPTTVwWE0rUDhOM0M2eE4wSXNKanRDbUdpK3hnRVZhdHVNN0QzR3gwSHZtaHRjNzlpYWJMN0FFc3RaMitEVXNQRkk4cXBtWVkrL0FHS1A2OFN0M3d6Tm8xN2x3MHJRMXpqbmZDendTV1c3TG4rQSs4Nk9qdmlOUFJyMW96bzd6OVlYY3pjK0hVaXJNbzBMNG9kRWo0YnROakhFMDJDV1ovVU5zZjdUMVByZUxmaTRtSDNFbkhmd01mZjcxS2JNWjRaUnFGdU5DZVZTUndTZFUySFArRDRTSzd6ZG5aUkZFOGphZEJ5ZWVaZFJxazZLRUhIZDNkQm9yQnRDOGRlLyswYnZFOW5PR0VLZGJZM0hxL2ZlSUNyYzNiUHY0Q2dRaWJOQkxZdXdUcGtiWHo2TkZOaVQ2RW5CRVhSczRYNVRrTmROYzd4TjJGTjhjaWdoYVJNSjI0MFlSY0dYS0lKWVc1bWJmMkM3ckV0VXNxaSs3cG1GOVp3NVRnM2tkNHlFS3A2QStrMW5DRC9PaEVqUTFrU2ZWdW9wNXl5bGtpRXc2aDVpSUdUTVQ0dVJJSVJTZmowUW1ueGF5d2MwT0Y5dzFMYlQ4MXNtWEhjcVV6OVRweGtMVlhpblVVQW1pdFYrbGwwMWRxVEhTSmp4MjBJc3N5UkVoU0FIU3VFWlNRN1l5Z25SdzBEdklraDZObHZadWkwZHFIZHZpSFdiNVdBWW03MGxTVXRzcmNtYlpIbTc0cUs3YXRKdjBTZHZZUHBlRThzTzByWm9qRWM4WDF5QU9WVU1GNTVBZDhXSndnOUdMQWYxV2JyTUIrTUhUOTBqdUFQYnMrbHM0dDdHeENyVVl1dW4rSUJ4R1VVOVpHak1DVlFvbVhwMFo4cHNhdXFkbHJEL09tOWJPd1Vub09XQmZOQ2dQTC9tTFJyc0tHakZEb2c2ak4zcU9MVnV0YXhwL0ducVo4UEFuWGpFTldjUXEvU01QM1U0RmgrRitzeGdNK2dWWUVkeGlsYit5MnhBeVRCM25TQlYzYStwc0pqbFFGZk1TQm5pRlN1cFVPNXlkOUlrSTlTWGNHS0N0ekxGOUplM2M1d1NzOFdUeUZPaWpqTG1rOUxDdXgxV3lhT2UvclUranNwK2V5bDdFNk5BL090cjBUbjNJeVN1SlRsSE9CV2dwdnQ5bm9xcDV6bWlYazVLc1VocXhWdnhJRm1DLzE0aWNIRkNQbkp5dno0N1h4Z3hUb1phVUJTUUdqUzV6VGxzVWRBUzNPc3lzY3QvVWRkUjZGdTE1OU5aeU4wYnlkM2Q5bVRHeEI1TEhBZmxXazdPQlhxK3NjYkZyYlRxb29Dd0xITGt5eUVWWHpDaXhYT0NTak9WYlpwTENsa3hOZUpuaDdHZGJsV3BqMloyZGlqQTJYSyt1WFZQa3pKM3U4RVFYa1dCa1NXMFIxeGoyYkJWM2g1NmUzdi9IMlhzY1BVWkN6RFZ6L0J6alk5YXVWbE84dHkyKzhqNHFBYVhyVmhZdUVjdkF5eGJaY0taZnV1ZUczYTd6akJEamcyWjRwMHlVclFmZDUwY1JReVg1K3NTaXNuRE9jZnZzU0Q4UVlRUWZOSmpvcTdza1d0U2pXaVdFUmdPcjM1MmUyUG9uazFGWk9yUzhjTit1d1hycWU5bjVIS1dsRW0rRHlPUXNLcVdxc2dNVC9HdW1FeURZTnJ5eHVCSnJCb1VzbWlUVXZqSXlnNFZWWVZLSDZKRUNiL1Y0OTRuVVM4WS9FVDNDZE1FZ0dtbkpTTmI4bUdham54U25yenR5MlpwdzNaTWNmems3dmJsMmtZTmtkZDNud1hlZ0hEREU3TzZ2cVVqZ295cTIzZWJ4anB4M2ZKVDFsUUNNaWtuK2pIZmRUSGVqcWdjQWUzY0ZPSUlpR2lpMHdYL2RWM05OeTRVcFBZTjFBVXZZdklIY0s2VnZPanlMSktzS2JBZmdVVkdiNGphOUhDQXJSNDNSSzVLNGJCbEh6Q3VTY3VvclFuREVaM1JiZTJzT0l5WXdDMmRGZkN3SUJyNTR1L3c1L0pMODU0QkVKRUJHUDhhbmJZeGsyejMwMm5mbDNTR1YvUGZTelp6SXlXYXVsdW1tMml2VEgzK1ozUlMwU0lHM2o5emk4SDBsbjI0RmVXMzNFc1dvcXRaa0NOS1kzeDRMTGZsdGlUeU01VU1TdlJWY0ZJQkFGdU5pWUwxOEF1cGU2RnVLbGRsbVhQWFlDUnpqR0syOXNRaWI1N1hVVnFzK3NGamVOZVVLS1Ewb0dsaVVvSUlCbnM1SzNodWdya3hXT2czY3JadFdxbDNqUEl0ZkRpbEQxRDVyS0xZU0FjRTc1SnFhR3V5VUFidnp3TEhqcHFpbXZXaTlsMENHOVZRWFBUR0E3VHF3L0ZNaTAwYW5udnlrUzdoYkZ6eVhBWFFocXdSUVU1Qk15emtJRFhQbUZrUi9mTlVEWHhyT1JaeFczMEhoOVhUcFNBRnhuRkNITCtmdWJiUWFoK3dOMVZNNzJ6cGNFRXBQVmFLdFhmTVRJOEJCbmE0S212bm1RQ0s1TW94VDBjSjYzcXF2WHROUzgxQUJna2dkdWhEVFFuNUdRWWJBTmhHNXBLaFZtMHFXL3JRbHdoRGdVTCtWOFlDNXR6M1VvN2oyTDBoK0J1M2xpMTBoSU9aWXVCUUpLZm84NHNIUENvOTVnd0NCUnBqbGFua0FDc2ZpMGNkckp3V2h6UnBWKzdBM1ZleVBoZExvRTc4Rjh5QUFyaE1pL016U04zcU5sT2VscnRzSndieDVmOWJvL0pQeW10bUF6V05mMWhra2JlSW1JSUFGcXdlZW5xZTJ5WnZVSFZSaUs5alNobGtWbDFXUFVUL2NrQmZkMXlFS0JzZVlvbTJWMnJhck5aODVwQkNpeG9XNmtaaitmc2QrODRIbDlGMENFWnJhL0dmeEdrbTdONVZDTmY5b1RDWlE0eVpCQkZ0dER0VzhQNkowNmdDcXZuOHFvY0dodGZ5RTlFMGNRa0lGVWk0TXRSdFNmdW8reThWK3hFQlcvcHlDaGlBaUZGRFhOa3I3QTdSNWQ1SzREMWZiVmtabnZJWWRTaDZ4V21DMDk0Zll4Skdkd0g0WjJYaGI0ZEk5M1RrVHJZa3hLL3FSZytFV1N5NXhkZUJOQXlpMm5GS1JTQWV2R0x6L01UaW4rVUNyQUNQbzRqWkRkTi8wWWtlN3k4d25heWdFS0dIeXFUeWpFUlVGRnFQYTR4Vm01RVdLcDJxQ2J0ZURCSlFhMzVxaEQvSnBKaGdOazQ4NndTQjR6Ym10Z1hjYW5rUEcyQzVVN1FWYjhkdGxjMTVqQUVNREt3TVdUMTU3T3V6T0U5c3M0VUdWR0dsS1hYMktHTXcvSHZGOVZ2dG1OV282Z1E2eldVZ1JvY1dzSnpaWHh6MGZWTHB1MUxOQUI4K2tYVENSeDkyVzBGT0dvRUdGM0ZQVmxSTUdEalZjLzYxUDVIUEV3VWxBS0xreisxVjN2OWd5T2NRU09qUnRjN2w0OFU1c2RvdWY1RHRoaEJMQ1owb2xqOFJDSFlnNDVGRUs1TVRMVmZJS3JWaW5SdmZWa216aWJEaE5CZkluYm9EWWlzQ1BGbkRVclcveHY0RTY0K0RyRFR4aGhRTWFpMFdMa29rQ08wUFBJeHNBSmNZTzJCYkJDS2VnNTVCcW9nRThWdUlRMDE3dDF6VHhSMitSclk0Z0ZDMjN2NVJFTi9tcVdqUGx2UFRyNWZveGxxbWF3U2FyNW5MQnJCcHVNN2VOalkvQ296MUdrTVp0TjU3SW8xMVhDZi9COTFOclZLWWwzMWtENTI2OHRuZHRyNEpscENtU2Nsdm1pWFF2ck1yNEtwem9lS2R2d3FpWDJjSHhNOU9SRnJZblJmdFoydmJRU1lKeHdxdmpoRzJFRWYvVk5vbDU5S01LdjkwNENTSzh3NkhVaWF4cVZPRi9QaWFHdzlYdXp5Kys2ZFRtcXd2YmQzTjNwTXlGRG9NVGg1ZzVaMTFqRGVNUFUrOXB6clVBRkpuUy9yNXFwR1lBMG9uMmxFOGEvQVQySGo0ZytIUjZtUmIvRUg5TUpqay93OC9NUUxzNlc4OFo1U1RjYnN5UnV3SkplTndHYzBPQkFKRitJVW53SW5ncHdXY3RZL01xZnpFUCtMR0lncDVaTTRaNWxTWHhGQk5lbEQwMHVzaGRqbjBYbG1WZlVXUTI4VmV5b3BtRVNiRm5Idk1PSlJ3N1g0Q1V1U0lGOTg3RzhqVTRubFNRbkYwU1NLREowVmlmRTc3cXNLdklwMDVxa09RTm5TYjUwTkRRR2taQ1pkWjBoMXhoRE83ZHZ0d0F4QzRlelZYRm1jUE5YOFZwTkNkMUkzRmQzOHFVQjJMckpBWTdnWnZ4YjE1MXJ6Z3kxMjRNV3JNSEpKblo5MEYwTXNxRmVQWkZ4am5FN2FhNElPVmdVM2dqVnpNY2ltT0lLc096N3VJYWlPSHdkNDJCaEZ1L3JtRTRpNjFrV0lQZEdDUGdudjNJL1JWQjFjL3lTTDh4OTUrQzY4V3lPckwzeGRWdUVHRk9yczVzZ0R4c0tyOFl4ODgrTFR4TWQ5SGNuRjlyTm9FdlNKV1Q0UnNSckRrNVNRbU5FeDNOZjlnTmhVdlZEVlBSNFA3L3kxeFZkYXhhb21adDFhNzlBTGtYUXFhT01aWlJ4MDJzcTRlemVIMkhOL3BWeCtwbU9FSlhMNVBmczNXRU41R2ZEdHowQ2RzaWZUMkZFR1hteE5COXZqUERiVDJIaHRldHI5bDRtQXhBVHhmd1k5Wk9LNVJTU1A5aVZIMVJRZC9lT0JSUEtrSk1FTDNYaFowL216ZTRwU3F5NXR1NTU0anNRcG9TUXFEc2ZVYzh1NmZXNVhZelZWNTdyZ3lQZFhwZFUzQ2UrVzB4MVF0bWhCVnVCaHNiWUtENTVQRDExRmExb09OSUdDelBkYTJkVHgxbUxramZhZFpjdlA0OTY1RjFoNnEyNVpSRHJkc3JrR0pTckFQWEswUVFzcmQ3R24zdDBxMW1mWi93VmxzTExmaHpESkcwZTNpdEh3TFZaaDlTNlNjQmErU2JndjRsL2pYN3lYQVhaSTNNTHhFUWdPL1hzNlgvRmRpUGZiRlFzTnBYL01DbnFGWkVrTTgvQ3lYVDRxL2w5SzdKL3N5VndCdFArRG8yQ3VUVFNQYmVtVzl0OFBwaHdNMDhvNWdmU1dvSmNQV0lLcWwxUXFxWmJxK3lDUTdsK2JsenNodGhoUVNzUmUvRHlWdHNNRlg1Zlhqd052NjluSHB6NFgxY2NSV05DOEg1S212SVNMdndtaEVXZkRmYVJtSmVpZVpzR2ovVHY5VVhNMHpDQlhzcU1nZFJHWkg2OWQxRlBrdHo5cFY1aFhEUTA5V0tUZUFZdEpieFc2NTJ4S3ZOWkdpS3FNMFBaRG94U0FVZ1Y4YlZoeW9yR2FvV1lkYVROWjNZeS9PTU44NFkvNWxjcVF5WjZ3SmxPMWdjNTlOYTNLVEhDbWQwYzNCRjNrUnRvYjhHSDJPTjBKSHp0K2lSSGdTWGc5V3Q3OFk4djBCSjh1WDAxWW03UDlmVE5aZWplMUdZTmpPTGxlMFIyUDh6dG9lVG1aOUxqOXRBb2QxZjlra3NsTmxoRkRCT2Q1VVdkK2lvdkk0bG9IeStDd1k3NXlmTFZOT3JYNHJGeWFJUCszOHFYRlAwQkpDYVF6UUdTTFdvN053cTI2OE1iWGpCQmJ1dnZMUnVpZ1MrVC92SEIrSk5UU1RMUUJ3ZzBBcm56RDMyd0NhWWlLWWdhaTlUakJZcDlzTVNpaUFRUFpqdEE1ak80eDR1ZWl3d0tqVUlWelRHRFVmKzB2cHZZTUhLaFlPajFQL1BJd2d6RTIxQ0pLaDQvUjQ3SjRJMEwvdjZMaG1ha3hvcmRYcEk2WDZXekR1NlpKVWhyVVJuTGxrMVNzaXQrME5CcFBtWkJNRi9aSHZtL25lZ2xENCtwYTNnWGs2d0EzcUR0VXRtZ3lQRkREeEw3TnVqazVQRXJaV09FK3YyRGpaUU1rek9PMU02N0JST3hBYk52OWhmMTJMYzFZR0g0VHU3Uy8reGlMTFBtVGNPUE9NdUlMS0VEcktTQVZ6aE5zNFpaMktqeVoxRlFkUzhiNTdWU3FheWk4SnNhUDdzTzFINWtWMWxaVk9Ia3lGMVRxRzZwdHQ5MHdxaHlYeWF6SjJ1djhuS1FRL1lLWmJoc0NQaUJiN0k5R1ZrZlpNa0dTejFBWGRaMVZoQ1JuUlg2QlE4NnRReDFoTU5mWjVGUi9uaEpaK3FodVVOWXJtNy85Nm44Yk5UUzZ3SnlSNlRoN2svZEdWRnYwS01xMUptVmp5MmZhVTZzWjZNMnRIekg1S0tGOXdoMnNRSkorVlNwT0dma0NpdHdKZS9VUGF5enBiZkFwZmxWb1E5ak5MdjRqMGFGdVBJUmlGd010ZVdna3R6WDdrWktLSU1Ea2M1ZzFwbzlWSWZMa0U1ZWxwKzZIR3dDOWJqUDhoOW93dmwxei9iVkVFVkppM1Y0SEZQa25wRWVRVEcxaENzQzl1QXZDYXlLOVVXajhWZVE0V0ZvazlpME15SVpWN0V0VS9scENhbC9zNGMrWStycXFuVjAxVWQ3b3FjNFZjdldvTDU0QnNTdy8zaGNkZ1hvcDJxVzNSRTRKYnhLNGlOWU5FdzZLZHUxUlphdml2VEowMSsxVXgrRUU2MG13bzJpRnd3RFZWbVNnQzRuSW1KMC9McVFUemtYbU81MklISE41NDRoajlrNG5rTHhnWEkzT3NQa3p5elkyWUtOOXNtMk5tR1dHS3JNSVRuUStHVjBSNFJMSlBtRVBrRkE2a3ltTDY1QTdSL2dBaHlRdWhxRnBpVVJkcnhYSTBrbXRKNE50MXdZV1YvaTgyVmRIRGJUZWRwaFRBM2FOelZ6VkNZTjV6Nk80WGdxRHIrVE1IcmdBZllWbGlkK3BCKzZRU0xzTERuaXBMZlRXMVkwbUI1aG1Mc0pTQnFCWlNaTDFCZnpjMm0zL1JsdkIwbGlnNmdwTVdENFlIV0cwTDFNMnBFYXVxN00rSXpaMC83dmkvSzBjQmNuR3lFZlF2Q3RFZnBPWlF6MG9lNVBMWFZrekdHTTJaVS9Lc3pnMHJlcXQwWkdTYlpaM0g5R2xpdDVpbnJHaTNhdGJJa2loUFNEYllMMFRiZ1RScjVRSkNyVmlvT1lpbjJNUGNncXpiQUtmeW9VQ3JEOEZDUkhUYjEvUkx2WHFaRXpRVXpucFE0S244NGMyaXdmQjJ6ZHNTNTNBS1RZZGZLcXh0RmxhQlBRK2RaRDNzajJpaUIzOFh1Qm9aWWNDMXM5bEFlZ3ZPZlNUaC8ybmZpMzN6WTBqVkVDOFNrNTVoUFo2VGpxZnJtQlRwZjU2TmdCZnFRcDVpbERyUHJlY1B5VThNVnJCeVpGdmRuU0N5ZUROVCtIWnZ1MzJlSStqNThDd2hRNjN1aVhyOGJkY3pmcGRkOTNDMjNYaWJzU2VOQmwrdkg0QjlqWHFKL25SdlRGc1JEWGFjSVRyZ1J2S2dmaU81NlZkaVRPaHJzOGlGSW0zQkpXUCtRQ1FJYnZ0ajIwV3FjMFl5bHUxTkVNUzVpUmE1Wnk3a3ZoQVhKVVRCQktBN3dCb3Y3RlhsL1JtOHBmRmxaNXNXUUJ2U2xFaitLWmtLVVhESDRDdWVKelhVcnhlTGFiNVVFMW5WYjVNRlR2Q3dmVmdQYUVzWUpGYU1kVkQvYUFML1kvNUxmWThFNGJJRWdNYnl5MFpMSERGMHRkOHRNanFZMjNic2l0ZWhkTEJ6d0pyUzZOOXNTZDkyQUo5d29hQ0JXaXg4YjU3bFQvUVR1K05wc0k2YVMxd1BIOHRqMlhDcHFlVGdLbkhvR2srNGprUCsvR0FEZWM4bmM2WDdJK3NnQWhFM2M4bitGUkVqZUtBWmd0MldHcm1XTTl6VEZYbDNicXdaMFQwUUVKT1RLZllUWFFMc3l3NVRFZjZrRVdZVUpSaVRBWml5WkdLVVVPb1VVZjhxQm5sMFBsc1BldHhLSHVmUmgwRnVhd084NGQzQ00xN3RpWUl3MDVOM2N6NEtMNW9peExwd044aDRob3JTUHdidFBNcGRLTjBFNlg1SUVtSU5udEVRZWtHMXYwM29lWkcxV3RVcmVoaHBGdFloNlk3VFoxMDZlS1M5RFh0TlIxb2Y3dnY5eENRMHNrSitsRVdvU0ltODBFVUJMT0JoVTB3ekJqd1dRNmtZT3RsMEI0ZGVYeGFmZEF2cFRVdGRlZ2IyaUhDdzNRVzFJSnVtanJEL1pNUFY3VU4wWTBnQzJtdmRUOXhkY1FrUzEzTm83WVp1REpENi9FUi9zTGlPRCsya1lIc1g0dDFEdmlJU0VML3B4ZnlPbmV1K1E0MmYvT3V1YzlLS3lHa2o5MlZZU3BjRjhQNHZXNHF0bHJsZjFjUWxnYUwzM3NsQWVXaEc5bG5xMWJaRi9CcklOeERWM29KL0t4NUVOUkxqNFJJWjNMc0RnZGFRb2VBWDZTMTh1bS93Yy9UYU81QlcwME85Rk9sUjhWUE1ZL0ZKNXVCVDBvNTVNVW9WQU5ndTJRanJoSWV3L21KUmd2REVpb29nUVBzaXNja09JQkMwRzljZitVbjFPai9YbFRITCt0dmhiZHByQkxQd3V0VGR1MWNsMmdnL2UvaFI4UmN4WkdXWTdYTlJNSWdveng3RmthWldRL3RUemRIajVCbWFhdjhOb0JwZ011UVZXOXhkb3h5VlRuV2JpM3pIc21ZOGpSMVhMUHA4aW5QbGlZck9jQ1FDemw1NThldDhyMXpTc3ZaSzNKa2p1YjY1cXdrMUNIbGF3Z01YdzRMdTFxODFrUzBuMDNackNhRFhzN0VpVzZSNG0vYkhMaHVyQkZSY1pnVDRGNlZneEdWcWRZYUVSeTFJMTg1UGtEaitZN2dBaFU3SUpvSjNYMWp5Ti9ybnF1d1R5QjNSRFF2dk5ENzJDNWhHRHdnOW5uUUxqZ25BNEMydXFYSTB0K0g5MjZYa3FZdEcwcC9iTGZHN0dxUVV2U29QQWZNcFpabVhhTUZyZldzNGRYTEh4Q3FtcU1DNU5xcUpuc0JtNmZ0Y3dnTkhLUG1RU2dBTGRiMnEyS1J5M2V4am90RUk4Q1pYaTRaVi9wYlpERGdBb2lVbmFsNHlmVE1QSHErcE1WNjNmT2JsQnlNdjczRSt5ZkwyMkw4bmdibHlQVzZ1WW01bVBRSmZqaTh2TXZzNnBNY1pFQWp3eUZ4NlA3RmEwVnNYWkUrdk1yaWhqV3JoeWJxZUl5VHJ2dURIdnl5MUhGTWtkdHlRbXVPcUhJWDRxN0hMOElFWkxtaU9yMW1XK0tSNWlYZFJGWFdIeXNiVTFyRWtjSFNCRU8yOVo1Ni9lRnhRRFdiRVQrOGN2YURwSWRDS0h3bys4dGNPcnNpRzhOdzcyWGxsWktnZGJEZUxFMDNraHNzdG0vaWZHSzJOcFJjTnRrYUx2R1RmUHozRTRSQ203OSs4UEs2RklpSERuTDQwL2dGRXBMQ3R4ekIwbDV6ZW1hQUJ4b1VLUStxd1N3cEJSa0pRSy9sUllvME1IbmdoeFR0eGl1dG9uMTdCNENEOGhBUkhSTk5vbEtlaEZKVjcvMUt1anFnQmFBTEJtN24zaWdOSW90ZEFodjN2NitTTVM0ZWN3L1A5aHBsNUozQzFSTkZnY1F5c0gwcXBQUWYrMmxzMm1BVENoYWZrNVVrTGxnOEdZN0c0NUtXV0d6QjZ2OFdvRWFoODBQUGhaakphamhYQ0ZQbVRPaVpMMzJZYUNVeVdYdmlZVTVmdFAvQUlEWjNiRENSNUZna2hCUU1tVk1vQXprc3Voc2o4ajdGL0MrZmprWUlFVWlTa1ZHODdRaTBwTWM1S2RyUzVCczJpbTMrdFE5anBaSGNTc3VqMGRHbkM2VUtla0c3SlVQRjVKQkN2MkwzTTdaMERqMlZHdmoreklXcHY2VXBhOFRXbnY2TlpLbG9HL3dla1pGd2dKQzdjVWczNld5N3B1R3NvaWRhNmpGTmZkM1dvS0pjM3VsY1VIMVA4RmNJU3RjYjJjcUdaWTZENkxhbzlreTNTWXJUdWNQaTN1ejFoRTJKaTdJRGtKRFdsZzY4ckNrWnNiYlUweFlSbzFKdFFFN1k3b3d4NHlzcXc1WXg1eFRpNVhzUW9lRFJ0QXU2UUR4MnBqYnJBN2k1TEhwTTBOQ1dyak41V2NxMldtSnF3VFdtSk9LanpHTkRMcEJGY2F5eEhwbUVoMStLdkdFR0hCQXFnRlRIV3p4ZE5OOW91SjJNZHdGRFNjbzFzZnpVREpIZkhpMGpCRk92YUJOQjJKR0dqcVJ0WGtIU3RrUkRQQzhxRjRlbHdjSFUyRjE2ckI5ZFJjY3ErdUxyczNhK0VHazcrYzk0MGw3NzNCZDliZG03WUMzVnRxc1VDWXpHcjhmUnJQbEQzVTc2eUYxM2hkVksvbzZWNlpUdklRNGVUSlZHMExJc05tMmcwWXlOMWRGb0s4S0IrSlgxUFFxdkhBWjlrOGFNUUJvSUV5QldYdHNGNitOdXdYUHVGdHhkZndUaHVJZTBDcGZScDFNY0xrNjZiNW1CYkdUaUxNNDFtM0VwWXhpRDNyellzZHpibmRBVTRjUkI4TEg1dzF6QkZ6M2k3R0o2OEJaams0bS9kMVh5dDlMNzVNRU91a3h4dW9HWFZUWHkxaHR4dUtDU2hBRzZLOWpWSnR4d0dwL1pERzVTc0JCZXdCTC96ZnZkSFYzZ2d1STIvV29HOXBrSjhVckxyYjFDc0NrTGlXYm56a2JsVUc3YkQrbXVXaXlnMXZvWSsrdTB2NU1VMFZPNW1YNk00OEpwWGRNd3djMjY3YWdKY0RLV2ZabENCUWpkajRZWE9qRitlRTk3ZFNxTW1wNURZSk5rNDRXRGd3Z0pvK0R1SW9GZGlvaW5XdUZOamdrdGtFU0FDeFVxd2VqaCsyUkt3Qk9GaGZWRjgyN0c2Q1B5UmNPcmhyQnRJVXp2em1sOGdBUzArMjlHMS9TWDc2MDVYcHdjYnRGcXBaZ0VsWlNVb3Q1M09PNnFXMzJaRVRuQ0FCdmt4RStWUmxrZkliZzRwWTV5eU9tQ1ZFenM2ODVDT0dhVGlhMFNUTTZLbFp0RktIb2p3WjFGcEprblBZMDJlV2djTUU4NmVzUUR6ck1HNFdQcVRBa2lLOFdSRmtjSnQ3c0lmZnNWN3djNHluRW96eUsxTlNibGoyams1Zm5DdG55RXhIeFN2NGZaRWkzRm44ZndEN09vbFhjeUQ2ZjliZHpDWE5QblBXREtqOEpxZFdnZnpYTExTZ1MwOUgyb0djM0N3cEJkQ3pCUVQ4Nk1Fc01QQWpaUzlhVzdZSmtPb0JmZ09nSHJCZEs2VTRFS2lnU0F0L1V6RGFJNkRmaXk3YVVKcVluNXNHbzhwMG1OdHNtMkxORlpCSWEvUDErYU9lSG5FZkJBdlZTV2VpWk5sVEE0SlRVQTNZUGcwQlZxenFWTytYb1VTaUw1K1h6ZXV6cHdmK3orZ0FPK3VwdXNIQ29MaTJWRmx3dU42NjNka2k0eFdQa0I2UG9SYSs5UlBjTnMxN0ZlTU9hcXhhYld1QVMva3hOeDMySE15Y3dhdDZOVEZQNmladTBwWXRqbnYyQm5ONnJwYXRiVDh1cWx1NmVXSDJkUno4bWNEd25FbWVteTg4TyszK1luSEZEME5lMHhVWDhkNEFhTTlPOGc0Y2E2eWpvWUpHc2YrUFpGeUNsSVNCQ05pTGcvdWs0SWF4WG5Wd2Y4alRZYlErUFVqd1JGOG5CdEd4bW5nNzdjRkhTa2F4VWk4SVEvMmFMUitHU05GMTdxdzlPeU9JUzRyY3UxTDAweXhrSTh0emlaQk0xbGMwQUw4bkpOUGJVK2FkbnNEeHBsOGZic0o5eG9TS25TSnplUUVXcTdIWTFjNTNPMkc0c2RFMFlTWm9tb0Qwam1oYVJCL1hzVEZLd3dxc2JCbG5NdTJ1MnNlVC9xbExld1d6azhWZzF0SjdnQjROOGMxaEdpaWFGUVZkQzQ4R08xWDByd29yZW9IcmVwSFRYV3EwbzdzMVlka0JueGJwRTJWZktveCtaOHhrWkFMNHR1QWFiOE1penZiVU1IWHRVNXV2dkI0cnRZcU1zRkxkNXBSQjJleHIzaTJqc3ZxSGp0M3czZDFiSVZOdExBZ3BGNlo1bkQrcml6ZzlacVF4M05uZ3FZbGdYVERXRUVMOENqRXRhVFBnVjRoR3V5UG5ya2lERUkzNWxCTUUrbHV2d2w0eGxSZzJxeldQRlZPc3c3aUJJdTJXcUYzNCsxeXZVZHJNS3FWRTdoQk91MGN2RVU5UzVaRjVUaGdrYlRJRDdHenFiRHhvVXM1eHBRei9ONklKSElVS1BobGpKUlI5RHgyaEhXemtwL0pEelZLb0Z5bEt3YTBqRWtxaE5UaVJWeTFFaTRSTGQvL0pjVytxYUNKb253Z2lmRnFGZEZQcW9lTnJXNTFiS1h2d0xMc2hpNGNhRXQvM0xBMWViSThCWisrQWxxSGJYZlI3SUJCWXdlaXdYRk02UjMraEt2M3A0blovMGIzOG52cTQ3M3FMUlo1UXdpYS9HbUZYeThxZVRqT1Nidlcvb245REE1N25ZK25kRERsbUFnQzQzTjcwYmtTNzA3S0JGc21rMlpjUlNZdkRUVUdyZkN5SFdYSUxDSEw3M3RuTnVNNjRiTmQ4d2wxSlg2Y0tQODdycTFOM1FHcG9CeVdtRHFvbEswMSsxYTNsVGh1Y2ZFVm5HeUw5NCtnOUsrc2NFTGE2TS9LQVBYL0pWcWtRYkpOelhISjFqTDk1eUJoRm51bEdXamVLYjBKejRKakNRenNES0lmY2x6Z1YzSHlsRVc2NVRyeldFNTdPRjlsYmFhbGthZzgwa0FLaHRMbWJFaTlITWN3NWVuSSthQlArTDBLR2h4dUd6OFZMakhVVktjTU5QOHRlaURFVmFFU2pLZXUxdU9pVDE2bEdVeE9XL2xVRDRGWm5DYld3V2RlcG1GbW1xTVJQZXFQL1d6a2FLdWhOUVFYaFhyNlBUazJrYzZEWGlhNGZxTmY3dGpPWjR5L0hiZG9jNGE2aldPTEdVaXlxb3lxNlNPR05NRmZvaFBaaWlrdjhoc3VNd29SRVUxZjJlMFBOVnV4d2Q5Wko2WisrRFVRNmZhWmh6bWFwTm1IdTQrNGpZQVJIZTY3N2NuSkZ5bnozZG5IRXBwekRNNFdaZExDb0F3NVMwN3hMUk5aRjNrOHVmT2lCTnB1M1FBYmRicDV2T1huZTd4REhybkhhQU5vNDdBMFFHT1pNc2t6cHB0bE5ObTIzYVYra0UxYisrR0VITGp5QnNqZzV5QzRrS21zVGZUZlZSNUluMGlaWjZYZHNBcVZhenhCSG9zUkZhVUdXeXlGUXJSRnFTNExuaEQwTk9vZkw5b2xiVTV6blRKK2R6VU1makZzbGhnQVpIZnNLVFhlUUVPR2RkRzRmZUdtbmYxMVltRVZsbFJnY3g2NmxNOHhmblJiUU9Eb3pJSkRHU1A0SW5lS3MvVDBMSkYvOEp1b2RjUDQ5K1hLMXMxd2lMQlNMbWl2am9aZnUzMCtzNFdRcE5iSzFCZmFMRVdqNXFqY3JxMnB0V0dBMWFGK1BjTUpzK3NJY1ZJVzRaMFpHaVBVdnJKRkRxUmVWaFZQYWFQUGh2V1lUdU1OeHRWenJTWmQvZExJZnczMC9mcjJ5Mkd3dEdtVXlEUnRscHdva01UNmN4RnF3SnFuOGZNZnI4c2lMdkhFdFJsTWRNbWt4cThPVGd2WGRNT0tETnlOVnNxMUdPYUpHV1JqRGJ0Vm9UcXoySFVwUGpvNWhHOGQ4VGNkVUNLajU3NW5MaG1lU2lnQnNBcHNyTEl6ZTJEVXRCOXpPVEdrRWp3THVWQ0o2OVpoaVg5MDczQmdXcllISU5jN0J2UndXK0R4RTRNbVF2b0JXMENFN3JJdGNCeFVtYlRJZGhaUjJVMW55UDhTMC9qWVNYQ2ZUbXZZcmdRMFlROXNla0ozOXpVTDNvQ0hSbklDdzQ1d3NjckIwN2szdHpFeUpBTDR6WHBQdFZpNUlWNXNPRmpJTkQ3MzZGcTBvV2lFcUNRL2RMYkJubEZ0cW8ybGd5NkhUdWUyVjlEYjZhNytQUXFLNWdhWnB5cm1pbmlvdEpWa3N1cUhaNzJWSXlpME9MRDBYbkdjT3NzMUQ5ZEJQNGhQRVdNZE1sU3lyall1TkZKSEFDU2JDM0QxcmdPbWJBK2k4cFpNRmRQYThxT2lwckpPenZNZVpORXF3R3A3TTVJaGxaT1hGVi85Ry85RE9lVzlacktVK3pBd1dHakhwS290TlN6Y3YxcmtibVRsNnJkT3p6WFUyejBzZnR4dERpN2ZxcmlyVUhuMXA3ZWxPakhhSGk3bXlmb3cyWmlpSWlYY0tab2h2WUF4NEFxYUJaSHhrZUtwK3RZMWtRUG41MC90Z01PNVR2VmE1MlpJR0xzUkRoTlR4dUFPQU9vb1k0a0NsdzBjRGNWMTVUYTlpMmhGam9NT3FTRE1sd0w4VnpiTlJzd1RpempSWU9xaXljZ2dIZjQrKzRvNHZnUGJxT3hkZWZ2N0ZZbXdZWFNDMEwrV2RDeGxVdGJFMXpEZGVnN1VXZnM3cE9KQ2RRak5FQmorZVdhZHdpcjhYYldyTGJsUmZQbkt3cmhpUDdzNjZmaktsK05CdlMvZ3lFQmJhMlVMYndTdGZUazk5emZ5ajR4MmV0RWJ5MkFKaWlDcHFGSWtoK2lMUUkrdllsNWxiVjUyTVZwbTRyS1NhenlFM1d4VVdyOTFMbXBwa3paQXpqT2drdHQxdEVJYUZ1UHJsVHhVN0FTM3RzRnlOakdZU3ZRRjR0K2ZNdkc1NjZWaUVqZ3Y2enVZU2o5Y3RUNkhFaDRLSU95djgyYlpkUDBYN1NNa3EyZFV1WGNTYURZZ2ZaTmRWeHZ1dHFzL0w2UFlrZWUzUVZXajdTRXBlanQ3OHc4V3pEcWFyQ1VCMHJzZ0NONDFCUzcrdUZwNGR6NzVLalFwWStBK2Jzd2NlbGQvRDRxZmhxUU9OOVUxRERMcUtuSVRpNExBK1VvMEhmWGRHNnBtdkZiZmtpckZIZlFXN291eDRpMHRydzVRQ3krMG9icEJDaS9sU0dTQkllQkZwN0VQRktNVXlDeUQybkVvMEMyUnpGeWQ5SEc4WWVQaFpTUlRIZW0zMmgrd21GWEJreUdGclVJVWtIRGt5dFdKODBxQWd2dll2ZitJWkZpM0dZb0dCNDNuS0NLU0E0ZGJlV3pVZmZGSzVjekxFVlRsWEF1T3BLdHZYQ0pOSU1UV0hwbXR6eVJXME80SVBxS3hDL3hJRkZ6aWNaZ0VtVHNlQzlDUkxnYjQxczMvWitDNm9xN1I1NXhzSE5kTWN0M05OVkVuY0V6V1BmSTdoV0ZwYjRGMjgxcDd6ekhIM1FIcytTSmJadEJBRjZxVjJTeGVESE9SVTJIZjlTL1lEMnpYODArSlhiOU4zQmNyQkhOY0pETFh4UjZ5REkxN1FJbjV1emhyNE9oK1JIOHVTRUtWTHZNWksvb3U3K1poeGlKUjJiUzljR3Y3L2tJZ0ZtVEpNVHpHWUl0RjhjbnBBZkp6Wno0Tk1WMytqLzZJSlF6blZoRy9PNHRBZDBjaElieVZhVzhlQjEvK2Y2YkE5VE51N0lyZnBRWm54UzZRNVdIRGJ4emNjaU9MeDliVGFYTDFtVVJOK25LVWh5OGlydmoxOTZJQy9VcHlkRjZZU3laZWV2ZmI0aHZyeGlYb3RvTTQrNVY0bnY5SEtjN3VVNVk4cnBwV3lQdE9UU2FlRkxjTzQ0TzAwb3NYQkJrVW5SRytQUzBSK3d4UTdMTnhvUk9PVUhhRE9hZDNyK3dQY2cxM215T1VOYk9CUGRJclh4Szl5dHNGeDNpWTFGeURSMnJKenR6M1NhaGZIRmZ4dmJHMDdyTGlEcHN6RTBQUndtdERrc0lJYzVHYU5DcUhkdjU5OGEyWDZXNStMa0VQVnA3QjhMV245aFphU2ZIL1NJZEthdUkxKzY1V2R4L1dKeStyVFBSeEJaQjZDNC9FdlBSSUFQTFhlNGNSb0dsU3FhSi9pSlY1NEpucmVmaGhwUnY2Z0xkd29MVEJ2ZDBsUnc2TnYzUEZoMjFDdWtKZjBIcnZnODBGak5icE9TbmJuWVoyT2NrenVpVlZydEkxb3Q3UWlBdEl4aSsrUjNpY3pQYWxHNTlqTG5zeFFZR29DV3pZYTJuZUZFdkVBWUdQYmJaU2J2UHN3dVNBdWpidEZkalU5QnN0MDAxR0QwZE5iejN1b1ZPRkVDaVNvOGw5RGEzdDJCOWR4WDhKOHBaSXpKRDZ4WVJJaGxVcnlkVzYyYXVEMEtHZ1pCQldRV2ExRFVPbExmQ2grNmhzZkhqNnFyKzk1MGQraEEyYldYQ0toaWdQeDhZL1pER2hBTUY4NzBPQ2l6eUJXR29LU0dHaDRFUFJQRnFSU3FZZHVCOTdsWnBTQ2F6RENEOXBRRkRnaVhqR2E2RzBTYW1LU3F3RGtzZHgxUWJFMWp1T21scG5INThFNWFLOVFhaDZGdVdRWS9jNHpsSklMemZFc0ZJTzN1U2hNVUJPTWhVM01QdDhoMS9MQVBsRlpkaWN1dlFMdzdJekdORG9rc0dMREFPVXMwbWlMcTZWSGZGT2JGWkRGY3NxK0ZjaUNFRmY2ancveDFsSlV6UGUvVDBheUtXTmZxL0IxNWxYVG5mZzFRcXNOSkxtOHhQcThKdWE0akZIMnp6SGJCaEI0dGNEMUtKMjZnU0d1MEVVMDRndFRtVERWL0dCOWRIR0hzRVZUQlpoUE5MZnI1dGQvME44cmUyUmtQMDF4TGc1N2h2T1hBZXBrclpWRDJIUlcxdW94ZlAxSG5NN09ISUlKN1o1VWc1Rmw2aEs5WHpSTVd0VnBscmc3b0gwMGQ5cHQyQjZQSkhGN0tVeVZ6bFovYTRqNzlKZ3dhVkJRVmhkd1lOdDk0bFovZFQxSm02ajFncVhjK0p5NHA0aDZhWndFOFcva1lxbnBEMDAwcFZBMzFHeVJ6VDJMTjYzQS95TWQrWDd3OFBjUXJNYzhkTjFXenBPNWhMUGpENXJBbTJhSHlQUjZEWlM1Z1F3b1hmeVd6UnRnSDBoKzMzWmNOenlkLzhidWh0S014L3FZVlVMVUFIOTZIbEZTK0xiSWdnRlVXYk1SQkxLbk0xbGhGSVQ2TUEvSmVlVE5tU0U4ai9DTXQ2QlRpV3U0MEt0b1YrZUg5d2hMcE5Td2ZZWEo1dVF4NXNFWVp5cGVRWFBqR2dYb2NORnU1NVU1R1ZLTnJUcTJVQXVLNTYrMUhKRGEraHptY2tCWWFsY1Z3ckJjY3NQL2JMM2pleXU1MmYxUTNMd1l0dElWSEhJa0VXSzFLcnE2blpxVndFMDVPNFcyS1pJNnQrTSt0dG5CUW1kWksvb3kvektNakV2L3RpNFVEUzlqUXBuakRJb3FjV1MvRHAvMXBlUDFsSnhna2p2RVVTSTVidXpTeEYwRDExMGY5NnB6QzV3WUVkVjJJM3ZOK2I1dTR3UTNjUDRta1dNd2ZCSy8yYzhUZnlNQ0pvM21QemQ0Y0pibm1xUkNwV010R0krQ25jNi9CZ3lnNjdmVHZDRUNmNW5KL01xMXMxbTJxNXIrQjQ2QVI3TmRiWGM3MlpJdEp3cmVyL2JxYnpjbHp3cGVzSUFVMGlLRzFWeVBDMmZxYjZKSDd3SC9GdzdJaVNxU3YydThiaHpyWExoUGpyWDluQW56MUxLbjNEL0Q0Z2ViWTVwMFdWdEE4RDJhNC9mNWdscUZ5RkdUTms3T01BY1l1WHVsYWcrVDJzS1JvQ0F3ekk0RU8xR1BoZnUwNEMyS2xEanN5MTkyVHRQVnhmd0Q3ZlJWcXc4ZkhZWjJNWm9qcjFjL1FhRFhCaDROOHpoMitDL2dTUW9MYWdJTnVTTjVBWkRiVmdxS244dkxxdzNBcFRUTDdsMGM5LzJDYUppV2pmbGNEdmNiZ2VIVTA2VkFqWER3SXV2T0RVTFJUZHNyY1cxWExubjBXdmRpUDVON1Q5QjhVR1BGd3o0MG0xTWk0WjBXMnp3K1RMckp5NHBpTDZObGhGZ2hBZ21ob0pFU056c25DelpTdXljaG1GNlY2ekplOUNGK2FXMzM1S1lHZHFxVGdJMHJlWkoycXhUMXdWRHBoYStnbnlNd3I0TU9XR2FZM0JvdUlZUXFDYkp4RG9CSjJ0cjFVSW9hMnFEZUpaSU9kL3hjRHRhdDh5VEU4MkxQUXJ2Ykg0TGxOQWRWMHgvdWU2SVRMTlJWMzA0TFAwME5UYzFpck81NVFudk9XdnRXVWdnTE9rdWRPMDI3MGMzRjdBTERXR2RUMTFCZUJyTHJsL0lTVTE1TjNnUFVxOWNWaWRTNkhxK3NhZFVxdjl5VWxnejVOZ09KSVZQQ1hnaE5GaVIxa2ZYckl4TnZ5UnJJRU10Q3ZyY3JnVE92TDJsZW1VTGJkVERwc09EckkvSmZzS2ZKcEdhY1hFSStyMTlDaW5mYldxa0h5aXVMVFNsek0zN3dwQWpHUnFNWkR0Z0NETGVBN1JBUUI0eEUzTVN5c1FrU0wzeDVjaFp5YkFhOWRWN2IxZGtwNGZYdktyQW5FQ2JJb3Z0T3dpNEtRV1p0eG5xYVMvVzFYUkJPZUFrY3VkUDRNem9MRjNaK3lkNjdFSk1jSllBN1pMcG91M2NsZWZtQUVTMndtVnQzNDlEM3UrTEI4VnJUUXNqajRzUmVMRkVtVTE4V2tXcjhmOUJNMG5IR1A4eE9UK05mYmkwcGxwZUpCRXZkWkltYmZucjhyMzMrZDA2UHdMQXZncmJHWXVjWTNLejlUYnp3Yk9USTlib2w4RU9HbXc2NFlEd2tWczFucnZ5U0xiZ0FNdHFINUpQWXlteEx6TS9namFHczJ1d1N5NE1aaXFnUE5lczgxWGJWeWVSdlBKU3RqMVNPM21OWDlaNXJhUEFCR2hLWmJ3RlhFcTA2VnJQTnNmRVM0cDczZmhyZ203SDdtOXlXL2h4d0FWeWx6TGJBbTR3Qzg5UUxub1VJVnpoYlp3Qk1Ra1RIalNLZ1JWUEtyblNVUklNeFAyYnkrcHdtY0tXVFF0dWF4cDlOc3NiWmFMMFd5TitIdk1lZHduL1p3bXpVWUt5ZGJiUG5ZeEVTTjJCWXZUald4TWtCUDhnQ3FSVFFTdXdUbkU5WUZpOGJFcFEzRElZenJZR3lCLzBNOHN4UENKYTB6a3hud01wWXhtNjFKazVLcWF2THF4YkNrbjhHQjJlNkhJcngyZVc3V2hoZ2tlcEJ6VGlySlM5S2VLWWY3UTJTckZTZFh6aW5rVEM3VGdQdkxEL1NGUGRseGNrMkxURnFoZkVCNGVxOTJQdncxRW83dzl2NHF2TUZxeDY1TktMSHV3Z2ZUUDBmdlRtMCtHYUl1czlETEwwQmpKd2R6TTB0cUQwMGtsUE5CempHcG9DaTFRd0xka2xVWHRpRG8yM3dPaU9HNUo3eHFxbzk3anRma1kyUjFhaVRkWjd0WWhLYVlQQXlqbnVETmtRRmtFdG1IUWluSmJrNnBDS0ExTTM0SnMyenBHSzJEcnVnWEFkaVdlYXNRRDZnVHpYRGRQWFR3NzJnRjF2Uk50bWl1YUZkWlFkTjBPYy9zQ1NYNFUvRm5pUFBrd3hOenhlYmJodWhXeWkxSmRObC9lNzJNY3h2YTRqcE5qNVZZRkpRSDdPWkV1VXZ2aUR4akdLQzZlMkJpOVh0bHNaalkxSUtxMFNDM0ZwaUJhTjNnSnFPT1IrUlJGYmNROERHL3VVSitheGpyTTczVXRvOWFGRTJyNWc1Nkt4MStDNDRuTVY2cWU3ZzRNTWJwckp4TDR1Q24xdExGa2czUGpaQnBCNnlBV3FqWDByelBoMWQxSk9PQ0tYb3c0SVU0aUlRL00zM211WEhvejhFVndld01GeUhOVEF0NTRhd2xVejZ4R0MwNjBHUlhiSDEzT2puQ3VvbnVOYXRDVzduSlhxbUFlalczaWs4TTNjOUpiK3dlb1QwSklSMUxrQ3MzYlJ4eXBGSVZXNTJVajQ3clBBalpDaFVJaitMWUhaaDRSWkRaZFJDTmNLN25iVlp4NzgvbUM5QWI1OXhXaExxOVZicWV0VHFFdnEwclBXTVJneTR2QXJlN1I4Y2s2QkRSK0owTlQydnkySDNMYmZNWVd4Y212MlRYUTRDQ3I0YWdxRU9FMVBGaW8vQ1pqSjJpWkF0YTBvVE81UFJ5RTk1SnJ0UENZdUg5QlBEaWJXeG03WDEvOG5wTHhWZC9WM2JCamw3VEN2R2VIWDFtaWhKNndGOXl5bSttcU92MGlMcVM2OTM1WFpMYzJ3Ui9VWWExM1dSZHBoVm93OUh1M2g3Y1hubFVtNXB2bVY0NHRMNnN3OHR6endWNm4yZlEvTEY5bnovUDhKSnZYeEdCdzlqWk1HeGF3M2IxZUtHb1JkZTZIOEhPUmxlaFZVaEsrNHY4VnBZbXJYMXlvZ2lONGJocDgrZ2VkeVlXY1dZMGVzS2JQc2JpeDdUM2FyYy92SzhFZEZPK1FPZGRHMGxra2lQMzFFVk5Oek9oMnBPQUttNkV5QmhzLzVnc0k3c0hkVFIxY0l0SkdjN2pkUXVWR0g2aCtPRGJFdFZsWWphSUFhSDNLc0FnODE3cTlSVU5zdzhMSmxaMzY2VTFGRFBYcm8vWGJrbHZnYTF1RFZqb2RjVnBhUTlsYnlPem1MeDlLcmlaQnh4dTk3U2ptMmFiUGdHdjlJSm1PalUyOWdxTEpmbTVtaENpV3FmU2NPSldyVVE3WnUycmxndTJkc3l3Tk9TSVR3SHRYTVh0a1BYS1pJNEpBcU5veVJCUVdqVjBPWVFtVFNwemg0Sys2d0NFMjBZSFlRZUlrYWdVWE5oV2g3bG1wcUFDWmc4VUlneTYxa2UwYzROUk5JTGR1c1MwS1hrYnVvR21LUWs2bUZRUDkvUy84K1YxQmlmOXZwVVd4aktMODYyenNmR08vL2VKbERpTitEVkNxMmtaemRiUHZOTmxYRndxdmVxdnRtM21RQUxxSXpXMnR2bHNZSWEwVW5oUlpiemp4aXNMUm9sOHhzVnBUWUZsc25GbFhmQ2VsdUtMQ2tVb2lOSFM0MDdsTlliN1Z1L0tBbVRyWXZyNnNQSVhRQ0hpK0NZUVRjeU1aUXpHdW53QllEVGNNc1FheEVFSC9WM1R5cTZsUmovakhEQU5KMk5yWnp6QitzWVo3RzFNcnRJUmp0MXNRZmY3c0hxL1hrMEp1SGNUbW4yLzVVMTdCRktrdGV0ZjJ5Y1EwbHNOME0vWEJxQVB4and5OXBId2VMblJCN1hKYWJOY2lSeGRvREFiSVhSdG5Yd0VYSkpjZk1uSVNJaGt2cGZXWW45bzVpTEhWVXQ0czlqcEJJNXYwMng0VmJ2RTQxcHFPY3RaMUZhbGptc2VSLzI2cmxBbmpwNTNxNXlCaDFrQVlBYXNFL3ZsMzNjbHIycnNDSzZ6Y1F5ZmgvTE0vVmZoaVQ5UzViemV4Q2ZodUNBNDU1Mk1OZmZpVXdXOWpvOTdhcEZjU1QrdllGbGswRW9Gc0liSmp2RUpid21YU3NRWG95RXJoZzBWNTh2Y2pFUTRWL1JiMkhRR1AwNjluMlV3ZHc4TGpnSE5iUjlDbGdaY0VUdDNEK2RHN3RIRHRLLzFsaU5xeW8zdjlIU1ZxMkRnU0JTU0xwcGQrQnduQS9WczE4RWxmNUZleDVrYVNDMGF5anI1RDJiYjlzWTdUZm56bjlWSGY2WHkvU2REcnVCUjN2aENYZUU0NU1FeThDY1lGZ1NhRnhqNXE4UGZDSzlYcGFUUmNuQnd6M3pQNENGUnZTTys0ZEoyR054SDFaenh1SGNPNEhYL2ZpQnhtMHVldFh1d2sxRDlPamhnYjIwK05KaVpwbFRYeXJ6NTg4UTh2akJvaTFiOFFSZCtobUliZTkyeUJhaHhtbC96bklmSDA1VzVFZ1ZKWERPYjZUUTdROUliMnpmUWlNZmZVQmRMelBtL0dKYVVzQmsyUVFoQU41RGpKUThmWFV3R3BoUGhiUkdLVzIwYlJHL2krdGE1YWN5ZnBJZUJWRXdPMDcrRVZDc29pMGRuMVp1Rng5Z0lqMTlneWdUTEpsOUM2cGVHMlJuc1pzKzY1OHJ6Vm1nQ2dTRmNTZjBlTlgyblAyR1FOV3kzb0owbW1YZTBzS1NJYXZobnNrUmtwd3VzRkJDV2hZbGREd05RSWE3dlV3NWg1THVvZVU2dVQvT1VVMzFRQXZFYXI0bGIvaFdXVnYxcnlOK1pmSWVsR2lXV1dxZWE0dmVTV1lXUDhXL0U0YzJFS0I1Y0E4aHQ1WHFIM2NrQ2hEdnFOcEQ2S1Y3bC8zZm10STlEL0dCbDF4SVczMUNFSzZGdmhPSDg5UTYvRFNndVJ6cHczN2RXM1JqODZpYTdKakF6S1cweVA4SUQ0VGFXR3J4REhTWWd2eVZCMkhsT2ljb1NCNUFqYkh0amk3b3M5cU9MWUpTRFB3dG45cXdKTllaNzVDMnNSSHZzNUY4RGp4YnJZNHdra0JsWGNsMm5BS2gxOGJaQ1RyWDRMQ2xWUXRQK3JkSVlhQnMrd0tsSXFITHNGVll3TUV2TDJ5M1lYU0g0dndUcm1QQzRCMWNFR1NTSnlnV2RxeEZQbUo3enY3TTUvS0R5S3dlZ1ljOTJxYUl6RWlMekx2dXV1RTZCOFBqN3dDWlo0UUhyUUVDcHNIQTVQa29Va3p1ek9SODQxdjNkR0pVRXowQllxYVN1VFJQSk1WTXh3Wmc3enZpNG5SWlIvU05RMWRncFN3RjQ1QkdxU2pWekQ5dzVKT0pxSkZGTzg2dGVxMnFBUmMycUJIbXEydit6M1AxeVVQSG9rNTdNL0IraFNtMXkwby9OS0ZQa05iYlBrRVkyT05Odjd0SjI0KzhZZktZQjJ1S1JBU2o2ejBCQ3JOWWwrOFhPeS9tZzBKUWNGWGhUZm9NeU13QVA1RUtSNU81QVBxejVCVXRNbmRjTG1hN2sraExHRHM5Wm1jZWtFVGFqdkRMa3E5K2FkTHIzZ3JxeEY4MWNzcDlpMkQ5R2JlNW94QXdqREc5dXpsUmwyNkl3dXpYM28yclRKTUQ2MCtBK2JsTWtUckxpcGRMeVp3NzM5SjBtcjV6R2NzUVNsM0lwNFdueFlwdVdtSHNDaWVKekJPQjNob211MjZjQzdtK1lqQmxKblA3SVoyUmM2bTZSbFZTMzdYNTJBWi8wUmdZd1RHWlRBaEFzLy9SQ0xGb3VQQ2F1dUw3WXpocUZ6Y2JpQVA5VVNPYW4vZERpQmZNcEZ5RmxQSnh3aXJCWVppbnhLOERTMGp5cFNvRnZ2dVFOTWo2czR5eUxjSElZcEd1Z0Z2ZGlJcm9GZGExM09KZ0Z0WGVobFp6QjduS2pmbmF6RThJdFIvemNDNU9sMWpraVR2Z1Z1YzJPK0o3dlFkekFCYTIwdVh4M1piYU5LWXpLREVjejNhWWpTODNuVkhYUzhXb2lHam0rSEszNDAvZnVuVzNaKzFTNE9rV0lLbm1EczVZQ2ZpYWl5SDFqVm1POUVOejB5SXdPRldkdVd6V0RDazhjNENkVTdyS2o5WDJuYitqQWdKRHJaanlHbmY0MFdBSVNEdG1DbE5GeU9ZN09mOGc1TFozNDdhU3FFZDgzREcwZ1g4QmM3WnFDYUF3RlVvWGpFSm5ndEhoNk04UmI3MUlvaWwyU0dqcWxGMnV5dXVrbEprajBqS0FBdHJVcHE4cUJveG9WUVJ2USsyZ3pFWjlESUNPZXVGZkhrWXNkK1k2K3F4d2RVNXNXcVlta2V4LzN5VVhoc2trbEpYM0xjY0RFakZoZXRIV0tyL1pXc2Njam1ZK3c1NlBPZEdGdUhzYkdTZWN5TC9QL3ZMMFVMMWpRVFgvaCtXM3k2cnJqejRHNDlFblZ0SWdEUkJza1dXd2NOaTgzY05CVzVYaFhtR2ltTVh5WStkb010NlFmcFZCQjNNVnN0aE9CZlE0NmliV0p3WDV1WjJCcEJEZXlJZzBPWWVQeU8rY01Ka1dLdWlHWWlLMW41WFQwblQ4SW0ydGhjeUV1VjZjN2NYVXNteEpSWFg3YXppSGV5aDBGOW9KRmJOUExVZTV5bkw3bHRqV0RLMzJqSDZ5bmtGKzBPbmdsMnVQWURSbDZ5Z3BWTkFkNitKMTl0MEovTE1pNG1PMTloZHc2cTkwazBxU3BaKy9TeGxNMFE5VzY1MTJtRlhZRUZnWUNxYlRzSy8wYlBxa0hCQlBtVSs4ckRjWllaVlZiY2dHWjFyZGZId2FxYXd3V0VmeU81SUw0WVNtNXZLVmtpUXI3WnJUZmRaNTFYTndFSDlxdDZ0cEZhYzFOYjZUcHlJV1M4dXJuSDNNMzNFNHdoeWxzM0g5dVhhbkJVczJLaGhZYjFjeHdnZnIvWG8yR2swdWgwSGQyNkx1cWlYVHREcTM1LzVBRlI5OE1EVGFrUFVpVXhBZjZVaU5IVU16Si80WVpZOE1PS0tKMnY3Witqa3FDaFBqM2ZCSzdMUjRLYWNVdGFCZkhJSjdSYit5NmUrQzVKVHdvZkI1eVhlbkNSU01pTzZ2ek1DNVFIa3NXZWxYa09PTmQyeFFmVExXVHNxRkpGWFpLeDE2QXFocktWcml5Yyt2U2lyK0dhN1R3NXVMaGlVZDZqT3ZNeXBhK01CSWM5M0tvRkQyK2RpVlF3ZmFmVFRZMXcvUk82dTBiWitrTHpPSnFTTktUODhPcHd5VmpnWlcwVGVRYUNqM042Q2NueTBqUk1EcVhRWGxXU0l3SkNRS0NjUWFpMnlNM3ZoNTdObk1KSDQzMjJ3RlV5eWIzVCtKaTlZNWJxUWh4cGRUK1YxWGh2ekoxU0FoNmRzdXFLL3VHUGRSdVRaMGkxL3pHT3V1ZE1wdXFJSFBGaEV2anpJbHNUYkx0ZTJqOFk1VkgyR1hKRlpYTjhWWkxCbTA2OHBhRjVINzNTSHd3V1VQUEw1SVJ1aWZrSmhyWjJRRksybTlzRlllZ1FSMW5yR2dic2RUNllldE5hQ2VWZUdTMWN3MjMrOFhYMUR2SXVsTkFaVExnVmRybWRmQnp1azBKN1VURUtkaEk1azhFWXViVFdvV1V3dXg1WVEzejRkQzhkVDczbHE4anFwOWNNU2lFTzgrN2oxNGFFelpiN2xEZVkweXBLR2xqcG1pSmRuS0Y5bUllSW9MS215UHZBVnBDSFlZbE5jZWlrUkl0dTJZYnc1bXpVU0tjMm40b01GMzQ5N2JyWlI2L1NOR0tNT0IxSVM5RlA1VS9iNWJRNVJrOWp4bVdDODh4TnF3VHVlVmZXYS9TdWxnWm0yaW5CMUEzMjNVYzZUanB1UTZocnA2YzludGpkVEREdkZ1WXJCUjR5NlRuWkY4RVhuTE4rUk11YTdrWFhIaGpIbVVkU2N5eW13cFZ5bjRzUlFkNjJwSXRIdFRpL1B3M1VlUjdYWWNqdzh5SWdBekFlbVlITWh3d3FQSlh5MnI1MmVpbmpxWmZQNklPVVRmaENTQkxzeHNVZzdTdVJnTW8yaGR4RmhCR0xxbFBrTHgvQk9oME5UUjNWbC92STZzUGNwQ1V4VDFMTktYTUpTak9DNStFQWdQNk1BT1llbUlxeW1BazUxTlVJRlptbTdRaS9kdHh4Z3MyVThFZ1Q2d1YxMWp2Ymw3S0xXRGFYblI0OUgwenJoQ1YrNWFFekJ1UVo5M1VqdHpnQ3J6QVpvSVJMcHpKZzJpUVZ5cUM3Mkw3VDVsYndvOTRXRjQrQ1R4YTZZOStGcmJGVzBDbUVPTDF2RnhXVXNXR2JTanRHL013MXV3ckU1TUp2eTNhcUZmZ3RhcG9ydXplRnZZSkJoVTZIT2F4RUw2UlAvQjVObFliUXQ4RVIxU0Z0MTNIdmVVQkp4SUlzYnJlTDBkNTUzYTZYck1ydmI2YkQxcUdlWVN3Z2J1UHQ3N1hsb3l4Tm1vWGFucFZTVW1RV2xFa1hsb1dZVGQyV3ZsSGJDTUYxbWdwT3o2SDRBemw0WDRIa1BzR2trOG8yM25zOURKTHZNQkZ4dFNIQ1V5d1E0N3hPTGxkejJEam4xSkdGNjRKbFZwOHk1dHNlQkJXNXg0cE53OSsrWGVYYjRUU0psMXZPY3FKSWllUTJMS0dHZjNqZXVrbmZkR2wzQldBa1pHLzFYaTVHeEdKc1RZZnFGVGVIRzFsNDI3UklYWXNCWEZac2Q0aEJpd1F3RTZOQ2NqajdYY3FEK2pWNkZZNnA2WDJtYmRJdGRBcVk0MEJRcjhkUVQrMU02RFFNU3lnY3pZVEo3SVVwN1pUaXBPNklkQjdXcHRnUFFmazgxYWpINW4waGRUdXVYZ01pbVY3Z2c0Z1FkTWtLQWpDUTF0L1lLbFNCSjlUN1BzWjBmN0oyOFVlV2pMN21hSXdWdWVVUm4xWHlIdW9nYWJHdis5SVNEQnFnaldKQWJ2ZXJKemo4cjh3d014OWs2RkQwWmtaRW82bkJoNFpKUldDVUcydTJYOXFBN2RJeHQ5Mm5UWkwrZTdNd05sRnRuME4yd0U1dmJsNktDTzJFVXMzV2FLSWlHaW5TQ2Roa3k1S0RYdG12VDNRTHZDczM0dDFyM0NOVk15alNGRDE5MVBaQUdJaTBYdUhsTUd3enFTTmtZRjRTM0NNRVRVTjM1Z2xjdVdwU0pkREVzcXRUM2ROcUJnbjgrT3dFWWM2OW5qSTZPbG95N2ZhSkV0VWtWcEZrQnp0S1BLZUFhZU56OEdrei9hZXpEL3hJYmFPK0dKajZxc2g0cGUvVDJicDBtb3VVSUg3ZlhDa0dOdjZ6eGdsMFBaRlVsRHN3YWlGUytUc09aQzRhbWt3S2FITHBjQncxeC9Ncmg2ODNQc2VzQ3Y1TWw5ZFFZRHVwamJpbDZCOGRhcUJLWGI3SmVqRjZOS1prbjVoem82cmVISW14Umd5akRNVUw2QmFyNmtaZHI3K1ZZVVl6WngxZk5ZdUZybGl2VWp4dWc4K2g5eUtBVWNyUllYMXl3VzBpbzZMQjdteFJSZy8wZjdubnNjQzJkM0tFdnVFRXA4dXhOd2g2d2N1K0ZlM0wwS1E5cXNKUU82NElrUVFxU1VBTHdsT3hMdGVUeVVzY0VjdTUycEF4WndjZ0RrNVpyVG9WNHJ6TTNMVEo3aXE4Znd5LzZBTVNsSGtLaDhCYkRVM3k4bVZ1czZjRTRSQ3BzZFZZVG4vQUR0ZFhzbEo1TDVvT0R1VjFSdGliVDhSYzQ2YXZWbVBHQmgxRzVjckFlbTRqc3FJbnZ1eEt3bU56TTJSQ3VDbmxPK0JqUGRZai9VNndIek5KakRKelRHbUhtV25uTlZySkJxOXhkd3k5Q0NBRjlkazVKbFRlWkZwNmoraTB1T1RVbDJqdmJ2RzdYSE40cVhsRHNFRkh4bjY3VXlOZUYzUVFUWnU3L0g3WWloSUJzaE5wdHI5Rm81UFV3cTZJV0E5dmgwWTNSOTVOMDNadUxWdFhrTnZEditPd0xkTWc2NGp2NUtjRWxhVFdvK2tkVU1IWkd6NlkyRmxScDVWWFVqZHBhSmY5RFB5QVJxN3dNZzJBODVNRHNVZ2JtdmNHRk1tQkRQOWZKSGhqcUI3VkpqTy9NQ1FPTlBlOGhsQnRYL0lKcFRXOGhCRFJyOHlBRUtqSUcxZm9OT3JLZm5MYTFaRHltd3lMWDdwVlV4V0RaVE42RytweGRXUHlVK2dkTkN1aEpxbkppOG8yYXVrTk1lbUVPMVQxNGtiL1VRcGNrUmkxbFd1anNvaUNXcVA5TVc0amUwblpWNnhoZ0JlNkJTanU0ZW51c0g5Q1FZWlhLZ0JUVVVQZmM0TWRSdDlmOWRqaWdxVDdWUjBKR3hXVWNLcUYxZG9mL2VtUCtaZ21ibzVrUE5id29SZnpQcUIrbzczZERiU3JxTDJRU2ZwMFBFaE1EMkxmVzdOOFlIT283a2x1blZ5VlZHYzdLZnE4N2h4MlZBb1JpNW5qd3VCWE1KQkZoL0lydlh0T2pkUklWTThick9FSTVYNnI4S2lPQTRWK3NjUFA3d0toNHBPalE0YURTbWRDYUtHeUNnM2xsWm9aVVM5eUp3NHhkeWxoZXA0THNPL3p6cGpkVlJuK0lIbGR4R0JRdzB4MXpTMGdVeHVyY1pjTXFMMW54WXlYK3BaWDdkZmE0clg0c3IzZ0tTS1VTRHNoK0NxSlNxbHN4bGRjZmhTSlJNWUJjdUtZa3BVeThkbm9KZERLVDV1QXNLV0lmaEdhdnVxTXhGckYyd25ySUl0TzRDL1ZPMEtQSUpWRkI1VE1ITmlrQWFXZmd5bWxXaFVMd3JERXIra3g3YXhaZ1pCTVdzcHN5bUh2ejRnRHYvZkZJTGgzTGE0TlhwZ04xZ1dGMExwSWVXVWpvMElOVXJMTHRUbVpMU2wyanpXRUdUR0xTTVpJSjlPUW9FcXFmTjlab21tRjFQQVdFUGV2WDVIKzFiSTIzV3hacXNDY2Y3UXpTSENNZmdpNGZvcG5tRGIrd3NxVTJOT1pCdS9lUGdXMWxlTm1mYWRnK3FwK3VKUlo3WjQ0blpnRWhpQm12TjYzd1FiaE9wbGQzZHpTbGxCZDlkeFlUNlVHRktrbmNLR2hBWEJOVEZCWlJFcEhieWdRaWR5bGF2d05NaWRBdHF6U3JiNWJLRit3UG5YNVZ0Y2E0cGkrMksyZmRlbWpBUjR0dEM5K0V4K3A0aDFSV2FEc2tmbyt0YVFpOC9RK1pPbCtGdU5IbkRmMjlLM09iRlpqaTNQeEM1a3B0RnVkcytOWEg1WTU4bnJJN0JTMnFaeGR0M2NoR3FCcW93NXo4MDc4VDFHclpRbVl1VXd1NFU1Q1BrbVF2Vnk1UGtmY1NUOVJLaWZEK08wTGl2NzBTZW9pSXpJSE5qYmFvNWlwUlAvUnNGZjVQMzk1M2cxY3BWNStmMlRjQnlJcUFZc3RDM2hpdVFmbkd5TElRdHFiYXIzQ3ZYRC8rbXJEQnduZVg3UmtCTmt3L0IzejM1djJNc1E0TDNkaHpHQ0NRM1ZpeG1hM0VvWXk3dmVZdmdNRGVqNXRBdkUzMXhyclBKTG9kUlJQYUZoWVFzWUVqUml6Q3N6U3BaSkpQcFlQb29uRjFmUE54eWdBZURQeU4rQlY3bFh6dE1YVy92WW5DMHcveGhvZ3NlL3UwVE51QkdONXgwUytRbHRtcEtyUFVyWUNoZWFpbGw4TzlEMW1BWjUzTlcwa25va1ZQaUg2N24raXdIYnN1T1g3d0xTN3ZLNTVNUDdxNytUVXQ0V1JOUGpxUmI1bk05WlI5NzlYdlFjcjF4eGNyblR0YmpKTzRiRGYyRTVuZzBveGFPcmQ2VzlyQzJvOEQyd1BLMXFYRHU2UGN1dVhBd0UxeU5JUzVVU0pvSjlqSTZYVG5LSmNqVnNZMVpTK2UrTVEvNGpvdHNkdkFlT3FvUWYxUmFEa3ZnTndDUTc0RUZzY21XaC9SK1g4NWJnR1I2WitocWpGTGNRaUh0YklvRlZRdEt0ay9ESCszV0J3dEE5QWlxTC9sK09mbHRSZ0Y2SGdxU09tVjVwOG1rNkxuV2kvWWl2NUFoZ0dxSHM4ZmlhcXVuNmFGU0lINzI4dzRDczlFL0ZiK1R1Qzl1ME5Ldk91WnU3aFZtSk9lRFB6eDgzZEpnd3pTZXdsaFVnVitHLzNvMlQvRU1UcVZzNVZZK2RHVmN3cXFnZlRqMFNOUVZpZGpqYnltQUY0TjhjNWNHb2J1ck92WjArUnZveGE0RURLdCtBNEh4dXBWbGw0S1dwYndkMmdWR3Y0R3l6OGRBZnQvUVNOYWgvSE5zV29UelFrVDVQVWVQNzEyaTkxa2I1VDkrV2YvSWNGV0JsUFhUTFViU2FTU1NPZVB6YjZOQ1BxWFUzWEZPRXBjSnNlNzlaOVFPS1BYbU9kcm02eEc2cUx1TnZJeU1pVnJYRkFNOUdWbTM3VjJpczFXdytXNStIWlErc1pXM2FERmpDT0o2ZUpBNXRoTGg4bmJUZC9JRzJDWE9rTXltakhabmlvK09qMW9hVGRPNEorZGR5Rks2MCtwQm5ESFJpWExNcjlyWVE0OUVGN1J4Y1NwWURaTDFqWTBxdWkzc3YxUVV3WnlKREhGYlB1N1BpK1BhSnN5NDRJdEN2SDdsYlJnVlpBWWRyeC9PcGl0L05tQzlLL0xpQmpvekxCSnZpV0lRYmFxQUpRNWl0KzJjdVQrc3hVQjYyWXphQW10YVNpZFBmZ1c5eHQrZmJqWUhzRnhaMG50eGYzbjd5a283bUhmZmFKMm9WRUZxckRvNTY5NlpyRkkxTXZOZGNRdHBYbHplWWRJT2FQVk0wTjJ0NFZkMXJ5NzgxbjZqVGRHOW51eDhsSEM1RnpSTWhQK3c5MTNHOUYwWWNEU0cxUEEvQ21jTW4rTGtyYW1SMDRlV2NCMk1HdFhabnZHSVFPa1ZSMnFtSTh6QTRSZlY4UkluWTNCTHF3UTcrVFp4NkI0eWNqM3pOME1KVzRlS2k1M09WdWNndU1TNGdOY1RRWjZFRVVrcld3SlltR2F3SWhNaWFZZTBNaXZxaXJkV0ZCSml2Y1NWY2ZsZW1CVldudUVSa2w5UHFiY05WWWpRYjhDR0lJQjJRVVFFYUI0elVtNysrZENjUFlTcVJpM1l2cTdvczlXQjgrYVUyQ0h5L0ovNmFFTVd1ZGF1VUtFcXI0TGZwejBCVEg0dkJNU0N1NzQ3QXEyb1VvL2oxTmJaVElFdFhER2lubTVmQWE4UVpML2NoenZXNlNOMGdPTDlhWGtxdWtNV0t2VE1QWDEwajR0UzhORmVSeVpSRHo4T1BkWldrTmlBWVMrYWtQSjVER2NFMk1raGk0dVVCc1pvaVVjczFLd1ZScTZBdWFyeGZhMnFjMXV4SW80QWMxLzRGZzhmcmE2djIyOU1iZjJDcm1qRFFCcXRlRERvNnpIMTN0cnd1bFlrZ3ErU3oybFNKelFWdmZMVlF2Z01tNjA2MHlVWnlrRmprZFhJclM1SXNvZFROY2Q1bENnc0Zobit4SmxMSjV4VEVYeE8wNzlCMUFXRk1Xa0J3QWh3dDlvUEFaZUhRUW5qSmhWblJ6SFpnTmdpcll3SkhTSU9wS05wUStYdEJXZGF1Z3B0K2thWTBNbkkwMGlka3k5cnBjd0VaQVRRWkxjZHpKVHhTd09EaXhIeTZUTUhzQUhzTXQvVWJHZkE4RWtVbWR3a3g5cllOS2tJR0VEQmlIbHA4Qkp1L0puN0xCUlhMcUlTbk5uUjdWSHQzbGNwVWt6TlFGc0cxQkI5NlZodFVINFM2TytYeHZSWWRpVmhSWUNHYm9NTkdPdE82dXZsbmgyK1JBMnVCT3dNOFNUaXRKb3lodmhycnVRcmNDZjIzcXBGSzd6QklMcStvNlluL3R6bGtsUmF5c1RwTCtYNWE5RjlQNWdtSGV6RGt6bnZ5SVdRNGFSaDNHWmhzY1V6RDZlM0tkcGhLT1NnUWhiN28yWWh1YlZwL3FHcUNmalpQYXpsNzZwUXRZTExSNUdsbmUvdUo0YWsrKys3VUlra3pUejgydUtLbE1qaitnY3U1RVFPUnRtWllTV05Wa2lnUzJsckl1eHUxM0p1YW4vSm9XQzJWRWVaemU2SVBIQ2E2SUlaa214U2hWSC9vdUhVS0FXMG5VR1VSVzFNblM4eU9PSW9lOFlUSWZJSjVRU2FJaFdqSXhqOEhGVlVOb1MxZ3dzU1o5dzJySTBKUFJ5VTZLaGxHNm1YZSt0Znp5NWVjV0IrazlCa0xDYmI5TGIwMnVCU3c2OXRwUGZhVXU5MWhRd2dheHVUQ096U2h6TThsdFF4bTZQU29FNTlQNVBEdnkwZ3EwQWV0VEJCWjFZMGRSbEwxdlpXamtNc0gzWmJ3UGdiMHBOdjJPM1RJdmtkRnpDaTh5UDUyUXV0bUlxakJONDc1ZUFMMjN4OGhYSFB3dVg3MUpZajdkY0F6U0FpMC83ckFwdERHaVVQekM0YmluM0ZlUmlpTnM3RkxiTUZaZzc1QUlWSmVaVzc2UFh0Ymo1QzdlbmlwTysyRFVPNVhFSXJVWGxTK0RHSEJ3RUFYNjNkaWtzbjlsWEp1cks5aTMvYmxMVnJURVNDR2V4bGZOWmZteE01MnZUeW9va3QxZnQ2eUxqNnFWNUZnY0NYZVpsWjBsSisyS1MwcFV4Z1ltcWIyNUI5WmhYVmNHRGVkSjZxZ0psSjJncDkza1EwU1UzUUo1YzQwM1NqbXYvRld6TFNtbXI3dTkwTGhpN3hTMHVPZkhNd1QxWlNlQk53blpjWHZoYTFVV01kMmVzQy9DOUVlRHI1UmNlV3dySlFyU2hPU0pBZFU3NlZYOHlha0IxaFo5TjVicnN0cDFPdUxsZGdmeVlVT256eXNoQ0ViMGZaY1NrK3ZRZzlITk1qRHJobjZvQ0xNNUF0aU9nQ29tWGZhSXpyU1ExQjhyVXVuU1RKV0NpY0pPL0sxMjNMYkNnakZRdi9yZ21IQTAycFNZU0FhcWNrbUVhQXdWRDBWVUFKZ3J3RmRDZWxISmJUZVkvQ205WWFYblM4ZEZ6dTN1dU96UkpEQ01ZVzlrb1B5ckJCZ0R6TEFoZUxXRlFPYTljb3Z3cWt5SU1QNnR6VXJBclZlRTVLNURrblZHNDJsd21EYjBTRnFBNDQ4TjAzTmJOVU1EZGZRTXZ5WWt5OFVhVU5XTHRhdjk3REllTGl5TDJqT2NqQzlBT2Y3RU5rME4wczE1dUFuRkwySitscjZCWjk2cktESEJjd0RhSlhVc3FhU1IwZDBRS3c1N1k4QU1OYWpmdlhDMlQwYVNYQ3pYMm5iSko1VkVhQVpMWW5QaHFnNE1yeDRndFJXSWdaMDN0eElnWGU1YkJHTnR3eGpKdU40S1hkRmROd2ttS0w2eXVwSjhMRERuVlN1a3RnY1lGaVBqL1lNRENxR1ZseTJ2VmZ3NmU3UjBtbWxmdTBJN202RlFWUDJucGkwNXFCOSt2RUc2ekxhVDllbTd0M0dMK2VsVHBqZXFETCtGdmtwdVd1MUtZTnNoT3owZzJLSi9ZNWlTWEpGWnkyWWkrd1pBMVBMcEN5UnFwVDB3UGRReElkN1F5L1E4ZW1aOUlKVGRzRzZ5bHoxWXJpZnJ2ZTd3eFRqUmFsT3pvVjNDdXFMREJDWWViRFVOaXY1UW5Nam5BU2FzL1Vac05QUXZFdVg2YmZJVXJYZ0ZiV25FZzcyTWZzM0tZS1F2S0czUEVCVGJEeU5UcUxWcytmS2syeE5DS2RhcTlNcGVXWjZiYkNqblNWc2dHeXVPZXFhdURTa0hqbWxhbUhXYzhvRkF2bTVnRnVZZHY3MUhPQUx0RW90NjVJNHgrZXltSEtLVGRZTVViUzhKRncrb2h3WFdVNWNudUVkNm9nMEZ4SGpRYlpGQ00zb0VMT3hUZDFTRS9zalpXaHhQdXlwSU94SGhSQVFXdjZxWW1oZVY4TEtQc1pkOVo4QUoxTXE5bmg0ZEV1OERoZGRrTWJRb3RxeHVUUm9KV0c4NXZJMjFNVFN3Q09vN1B0MGROQ2NtdmJYUUxRajEzNzJhSEtXUGRNU0xReFAxaXFBdzlZdENiT2VOek5XR2JBOEpPWWRMQ2pqM0pPWVhLcU4xeUlGNytMMS9DOEVsTk02T0ZzSnZzYmM5VHBES3daVzdkQ1J3OUhFK1FTVElxakZmM21MdTlaK05PZlRObElUWStIK2ZJY2RCcjhlRlVUVlFMaEZxMTE0Zm9yVlVadU9DdXh3RkhDb1M1RzBvSXZ6aEpla3RLVjUwRllLQk4zLzVBVHJpczZLcVBETjRqYXFxWVZUNDNtSitqRDg4dUROZGx0VmluY24xMzRyUG9vQ1lzWnoyOHpoK1A4ZkQ2Q3ZtTk5zTmpBSE16UUJ0c05NVUo4dGxRZnhlVnVoMEFOajJOc2xjek9TejdWcFZnOERZSm85alFZdzFZNGcrS2E5K0phdUJSeHVNVlAzSnlNalZyOFAweG1XOVJETkFDQlZvWkFKblE0M0xBNmtSelh0NGNOM0orTENFVEFyZVM1T3lQVDJvendFTnMwYjgwdGNTZnQ3Wkx3bVM5elVKMXhFdWdiRmRmSUxRYXl5N1lrV0l5dm1PWExtSWRYeFpCczIwZTI2a1FsUHFzL3pScW0wMG1IdDZNeWRaOUh1LytOZncvTkt0UlFCM29FOWU2K2RkQUV1SmJLZFdWdERwMzhVaVlITWtZTW8yc1ZncDlHVVgzSFFNL2hYLzNjZy9CcjI3UndkWlE3Y1ZvRkNPQnpnTTI5MlZsM3NmcFlKb0loamF0SGc2c2cxeTFTaGNORDhtdkRRbmR6cXZNQ2xsNURuVjJpVlFVUWs4S0ZpOUVwNDJ5aE9NdUttOTNrckNqVktEUlNla0lrWTg4elNjLzNuOXRCaDNEcjJuZ205VlZCN1RHNm5TUUR6Z29TUlZtVk5LdE4rY2wxZnFCT1g4TDFNVEdOcU1zN2JObncwY2xHSzA1Z2ZCTTk4MzRnUGNTZm5qNEhqS1VMV2JTblk4TVlKNytmaFNXcFNjZXQ2Q2VVaGticmFyRDM3cVNNQzVlUXBsdE9ubEUxeVlrdk51OC9DcXlFMVZORitWbzgzRnAwaE5DWHRiVnZzYnc4SFZORFVwR0duUDh4ekYxZ1lUV1JsZkpTZk01YnYyTnRRT0JSWjlYMUZzcEdJcVVxNXM2THBucG9FYThlTE9ocWtXUkRmak9ibjhHQ3dBeW5oK1RJcmNkUUtBU2JUOXNXRU52SWFuM1RDSVViMXgxWGd0b01FVkEzU0N2SVNLZUZ3bU9HbFdpMVY4NEJ5NEJhQUkyVTU4YmdjbGNza05RVTRycUpFM0ZHUDIzUjBNMnMrSnhlQS9xQjEzc3dlNWRZbVU5bWgzQWsxQnEzczZjUFR2L0kyTXJtZGpzT1B6MVpOb2UxR2ViS2xRM1NFcVJGL1MzdE1mM2g5YiswRGw1a0FWd2cyUVBjTG1JTUdRMEhndlZ2VVlYU2RHQTJYN3ZSTHU0Zi95UitCd2t2eUdjcnRNUjcwVXlsK0pDSXBsbGN5b1FvSlZGUG9JT1Fkc0wwSmRnaU9iWUs2Q1lKT0lPYStqUFZRQXVneXkwalh0YjlKbmQvRlNQTlpRbXZicjB4ak5tRElONm1RazlXTGV3YTJGOVVaeFRqODF0b0FCRVVmd3prbUhVWGx1amQrb1lleUxMT3NlOXpIczVlR3ZWczlQNzNOMEQ1VkdxS2pJTk1uUDBsMmxFRkh2ZG96MlRYVGlFVlZVanVMWE8rRmtlaGh2QXR3RDFib3RnR0xlSTZENkxHdXNwQ2hkaTdiSGlUSDRDM0lldXZCaEFFQ1lOOXp2SllSNXVibkVnUGNVNmVMNEdNY3IwRThHY2hXYWVRbkxxTTJUUTNsZFJlOEZva2l1Z2ZyWCt4MWtiaXVhRWVHYi9GVmpPZkprd2FCcHE2U3NUSXE0VDBMY3ZJdGFmTS8zenRXT2pRZm9VSzAxNENiQTBUQlRZdlAzVkRQQjM4bXUwNUFRSGZ0M2NtQmU3M1JlenM4Y0pscFJCaEU4Qm1hY1Z1bzhmaTloQkdLNmFqYUpiUTFjT3ZjSzZqOTJVVit3cFFLYjRkQnluRFRBSnBVNVRwQlVSZzFTeVpDeTdWWi9iTGkyMHc4K1dydlFuQTlNbVZ6emR5VExxWkcyWUlLT2lBTHVOdnhTUXNWekRubjN1TGZPa0JhYnJtdUVCSWRDMGtCT0hmY3ZJQ3VycDd6MUNjTDBSTE91STdkNUlIUXI3eEtUbVcvT1ZocUJYMVpGWmNKdUwxSTl6bnlEZ1NPa24rOVVIc3JQOXp6d1daNFJxQUdtRGJ4Q3RHRzZ4WXJDdlFFMWQxK3VZYU1KQ0xpRXlUWlNxSHIzdzJrUnViaHdpN2FTd1dVQ2VJaFdBUHJEWnMvdXZoZXhxc2lONXpVbFBpYWd3T0hKenh0cmJKZ3B6NmFjWjMzK2E0S1lSeS9hNGVLNDJyWFJwUHRQTzVaK0F5MUFBYkI1dExTcVBmNE9vMk9nRnJPVWt2Qld5VVpLN2xpUEdINm4waElpY29MUFR1K1BuSjRDNmNmc1owRjlHdTJSN3N5dEt5eldFUTd4Ti93QlFoT3BHNlFBMXNQbStEejgyYVluTng4TThoSVhsNCt6Q3RWNXZ1ODhSRWdCelpaK2ZUeldHTWM3UllWeWtOc1JqVHFXeFI2UCtLVVAzWHlFL25EQ2U2ZWtYUTg4NmJiTGlQZTlUZWZxdDQ2TVUwcmszNkJRcm8zcHlyTjRCZUpaTGx4blNYYWYzWXpaT2g2R3BiMThtZlBQY1lBN24weS9sZjNIbGpBZjhCWXNLOS9kK1NOODFGelN0K1l0RkV3MnNyUHVNZXVITXQrSGRvdktsaTRobTFGeWd1L3I3NWMyQWN2TE9OT1hNL0tvaW9SYjB2dXFDREV5MXVtUnhzSmZpOU95NEVBd1hNZ2ZuYXhqa1FiMFdmejB5WFBub0tVSDArSUdPekd4ZUxITFloT3REa0pRTXEvMkZRSjRRdVBuRzBndTZIU2p2SGNKYW5lck1mREpVYlAxbjU0YkhsZ0V5U2E5ZE54bVV6TVdWMC96U3grMy9ESFVpczBzcmhNYjV2NUxIU3Erdmw4UXVhbVFQeDBrdnhYS3ByOXlwa1Z5VThWUmNwZmpBVnpCM0FNa3kzNGM5K1NrNEErVmtUNlBEYlhDSklVdkgzUkduSFB4amRqdDBJdzNvbHg2dUVOS2tsZmdNdU9OSkV2SXltRGhFcWx0SnZwQjJ1bWZzVVl5Kzh0K2Jva3hXOElQSnRSRllCdXNLMjVORktIcE5xdXRhVlF6dFFSWm5idEVhenQwYVoxbUZZMjZXNlQxQVovaytobi8ycEZjN2lrU2VzK2Zoc2dCZVhHa0ZkQVFlOEN6QnUwZnlIWXBXSWFaWXJYVlNJczN5V2lNY0dIZ0I4YVhEeU9EVlc5VTJ2YVhvY0RJa1FzUEpVeUlNU1lmWHZtd1JaUDc1Qm1Xd1hNdDA3dmlGM29xT3FPNlA3U1ZGKzFLOFU1eWNQaXAxN2ZZdW5VSHA0Z2RPNSt5RGpEZjJUcW9MRUpIWTZ2UFRZWnNOanBRR1FHTXZYTnJma0V6NmxTSnBFUGtiN1RNV1dPWFdVamIrbHhjSTF1MHJCRXFYMmE1M0kwNkcvMVdwOXN5YThtVWlyNDgwQW1iV1VUTEhqWFpOSXNMNXpMWkg3M3V3bHJsS1lMMEQ0L3RTWVhHa0psbWRZMnZ1N1d5SFl4T1dMSmt2dzFHWm5lZi9iOUJNbk1VUWlNYkQ4djdkSFNNZHVMYTM5QkdjT0tocWNwdHpUWXNjQW9XMlRtMWQza3pXN29lMW82NzM4TTh2SnBBOTMybmwzelpkZHEyVGUrM1VGaEU2R0xndGNNUnQxL1I4NEJrcDErWXQ0UlBFM0Jibml0L0t2aGVkLzJwTWNzMnlmSFN3NGNNQlNyK0dLREJCcGV2SStqTzVyeXN4TFZEckRjZ3lxTHpwTGJ5S3RCOStzcE0rK1NMY0F2RUZ6QVp3VHNNNU41QVhld1RIeG1yMXM4MWFHVHZ5bDh6Snpna1pqQlZ0NmRtWkJlMUY3d0JGcUI2aTI1cmZ3Q3g4Z056czV5Ry9FYUw4UlBVZ05GSi9Jbit0MWlVUHordENza3lKdFl6TzNvQUdJSlRXdDBZN3dJVUEzMGFoYVY5TS9zY1IwZkNSZEdOZ2JxV2xSdVlLT01nS1BQQ2hucVJUQkRUdXpVb2FWQldHTWtzcXI1bHJzU1MzSVc1K3JZYU5zTUdZdHZrUHU4MnIzY3E0WUREck1yWU4vSStJU0gxVUVudlZDQitzSWZ2NzRZU1pXbnlVdkw3b1ZOSjNWV2xBMlBCa01BeHM3cVJWNjJXTEZlaGpqazhWcFdYMHhnWWY5UTBsWE00OU55WlRtY3VTcko1bUwvejd4Z3N4cTAxdWYySVpxLzNEZkpidlpBeDlGbFNFSHlwQVlYd2dZSDJ4a1hmNVF6cDJQb205UytET0k1WHdsc0hXYVZzd1h4a3NhZVUvaURpVmt4bmRWVHNiWUdleE5vMG1yRFJyVmFWMzRCQkNxWGcrMlRxeC8xNEt6TmtsTmk1M2VJeHVhZ09UWnZleS9aVGpOZFFwNVZTeURMMU80RVR5TDNPcHc4citJWi9BNE9aNGJxdytpc3VDNzJBTUZBRmgvQkZ5ZCtVMk90K2tWV1E1ekJ6VnVnMEs5MkNMa0JzazBEbkQzWWFSeTJaclpwUm9QRTBMWjhvc1YvaUVZTmR6VytFV1BvalJReWRiOU41SXk5VGl1UnF2Nk5PNEtWazFnUm1TT2s4V3JnMWZ1eEdadVhidzl3UHpVbkZmRGtjRXg5dktxZzRuQkNUSW5TWEozZkE0ZjB3c3VsQTMvMW50a3hUYU1CTWtoWndLTmdtRlhCMTg5Z3JpZmNxNGMwZDlMenpNYjZ0dmlwNEhoRk9sM3h5RHRVT3NZL3plMlRqZDRtT0dKWmVtNktyZFZYSFhFMlRmbEYvem9EQW0vbU5tS0lnUGU3YzRzMnovZmRCK25DdWxxY2tGTDhNSUg2aHVONWh0Q1l0TlFTZzZqZE4rNS9FTGFzd2JOelo4aEYwbTZTdjVWMENkcTR1cUlUUWg0Z2dENjV6VkhFQU1JMW9XcExoZmkvOE1LOEZLbXBMdDdaMldiWFRVSVpYMGwydXA0anJ2TDRXYjZDZEMvS1VkTnJsRGtmS1N3NXVGY1ZkcUpuYWFJdTFTUjRTbzVXWEM4SERTWC9UVVlCOUw4cU85WHJKK1pvaFR3RGZiREZOaUFtdXVaVEIzV29ud2V6WkpNOHFnbm1qTG94Q1FDV29nOW1ZL0hSUFYvbzM5VTFKakNMYWZNTWJyeFRvY2NuQ2U4Nngzbml5dDA5Ti9oNjZYZWRtRDJsWTRJRHlkUjcxNDRnc1cyQ2daWHoxSlJUZjRTdGZ3ZHRwMkt0WFBwdmp6UWlFNUhQS0RVOXY2TTdJTFV1QUtxMWd4NmZBZGxnU3JSc1JFMHF6WjAvWDdzQlpaSUtpOG96TzE5K1ZmK1ZXRTd1c2IrS3lOam1BOGVJZGZVV1ZQc2dreHhsTU5MSjVxZmJFYlN1NUxYeE5RWjVEVGh4OG1ndTJTbGw4MVRaaHF2dzlQOGVLUjBqa04vUzdSdmgxN1BGNThvUk9qSHFOdEpZcDVmM3JvQU1IeVk2bG5lQ3ZZZXJBYjY4MjlEcTFlZVJzUEJJWFZJbTVaZmV4ZGJzRWpLUzNScVovZWozL2xCbzNCanZCeDR2WlB3WnJsdCtDRFRKblNpWExzVFlEbHVNL3ZrZjE1L2VxZkZIa1cyMVlMVDRzYW4zWnBkSFM1RHBzZklVTS9OV21kWWRKY1gyRng4b01ob1h0VHdHWDFLcUxNUEtQN1BETkdxaUxvWkV2MjFDK0VpRnh6aUVPQk9KZjMyT05QbmdiL01FcE1LakRFZ1hUbzNDZTBzV2lxNjVWQlRtUjY0YlB4SElHb2g5ZnYxYWQ4bGFmWkdqNHJWaGZjQkdiRVgwQzYxQ1NIdE1XbGxrTTRvOHhPS3NPQ0MwUEZVaG9YOEFwV2NpSjdoNjhPMURQamMwbWI3NVBEQnVZa2JFak1RMllvMXNqNjdOdU54TTh5NnJ5ai96eTBnT0hVMXdkN0lEY3dIdjduSUVqN0U1eGQwTzdhMm9nV3ZRRU9kamJPMDMvR25OdUpUTThJMVl5S05vcWw5T0tVQnBnUVp5OHpUaDM2aWZZZDJSRGlKRWZXKzUybnNWTXBLTkJkcllOaWRYMFgzTXpKSmxwNHVjdjJvWWRhTkZiVHNIM2w1WGxleWVEMmxyK2NCcFBIQW1VL1BVOFdTQWNET3QvZ1IzZDBhS3pFRmZIRC90c3htL2ZTSk5KdzB3bnNtWjEwU2lROWlHbG5BZklXUjBsaEZDR20rRjhuV0JoTEljZEZWMTJaZllGUWdjY2grTlNaYnVpM3lKODl2eHVaV0tXcnd3NkEvaE1vU1dsVzRHdzFOeXhFeXVKQWp1OG9TU1Vzd0hKTmxyRkFPMG1tcHg2Nmd1K1o2cDR4N3JxOTRPcUQ2Sll6SURhSVhQc2pDUDhyTjNqOE5kSkIrY0JYWjlDdlViNDZ3VEFSM1I0UVdqYjI1QUlNeTdtd0RjZEUxcDkrcmVKbjFDY0FMYk55N1B4eGk5cVJSVnBSSTNyTFRLR0VtLzlrUTdSckNWb0dmOWhKa1d1bVhNTDloTDB2bnhwTTkzbmliMlRPV3BUL1U5ZUcrUXh0ZHdOVm5NSHA3bzhrMmR0WnBsbFoxWkJTb294ZzhUSDZKZXFST2s2NGpNZzN0RDFZYVNrbXRZQ2RuaVVycGRtaStQRmk3dUpWR2dVRzZybTNYZ2xNT3ZJYmJzZ3VadmhSSnNRa1BONjlWc3VQRms3akdLanMxWlNhUnJkOThtcDFPbzJ6M0FzQjZxbW1tTCsyaGx2WGFFcXVKSWhpOXgwS0ZBMm5mdHRXL2o3QnJnN3R3MG43bUZqMm1mVE4yNzFtaUtUSCtIU0pvRkxMdnd6WXRqTEdDaXhuWTZZOFdma2VQYzZ2SEw1VUZFRkVXR1pCcHZCWE0zeXBlMkJrSVRwRlRJSFkyRjBPbnFqZ2Z6YnVOQXhIQ05OV3JkRDA1aHhOa2xGMitkZEc3cE1CYllIYThqZUdZU25sZGVPRnRqOG4xYmhidVJVYmRtckROM2VWQnoxcmpPeDZsaU51a21lYXJRN1RKeGNvUjB4dXVaSVNNUk8rK1N1SFRYYktnU1VVYUo2OUFEQThoOWFTOHg5NXVtQkl5UklRKzBJVkZHWnpyY3plMjU0Q2VqMVRYMjJKMU9rSGR5Q0szQktYZ2lSM0dqaGVYdlppdDFmOVZOcUtYUjJvcWMyRExva0ZqUXZoVjlKVFl4aUQyckZOSUp5eWdWMVBFSjFLenNBbURZcFVSUzE3ZmlPV3M0VllJb0VIVUwxbS93amRHbTFZL3hzL0hEZCtoOUVSbi92OXlsQjc1Zm01SUFwaDViRlZyWWluTkoveGQwMHgxUWVCUk5PSkwvR1RqVkpicmNJR2lWaVA1ZlpQYTVraWNPUW1XNEVLNncxUC96YjFMbDc5dlIyQ0VSdVZxTHQ0cnJOSzFNQmxRUUgwUm9VUHpUOWN6eWlHalQ3ZERxbTN5d2xSQlV0SFphdDdzWWFSTlJNRTJyZ1Z3V2pTeFJtRFlMVTJkanJ1QlMzUGlCeGE4ZlNTdmlDY2hMRWhkNGxZa3d1NFpQVkhxRnVqQVZzdmNlZXFNdDZmNysybUducHI3T0pTRTNmR2FrUkRTVGViRGIrazg1VHcyeUtWeFFocnM3eWdIeWtadEpSdEZyOFBEUFd6Y1pscXMveStIV0xiNVpCRjZoeXREd3lacWZXVVV0Z1dJamdTN0VpL0NDM29Fb3BYWGgwbDU4MElyM1BZcTNhY2Q1MkpxeGV3eXBuZVNBaVU1bisrbkpYRThFWlpKNklIUXRGSjF5cG5SdzNabmJIY3VVazVXeXRFOHQyN2xKV201bGFnMStIQStGR3l0UjMzb1NPMVN5UTVhY2dOdTFjaDlzaGJ5SnpnOHhtZ3VrSjRoTCtsRW1Ua25GbEZZS0VCSjF0MitqaThlMy9McU9sZkhvOVRRODArdUFlL2ZIcGl4aVpHZlMza291bngzMWdHeWZaYnpsOGQ5dGE1NVNjd3pWQlJ4RmNPRFNWbk8yV1NYeE9xUTJnTnIxWFFZemVSRE05aGY1S1UwWHVyNjVIdms1blF6WlFlWHV3dmRsb3B1M1l0YldZRldvYU5hUSsrbkFrYnVtMWdFOERWUWUvQXRTM2F2emRTSEdCUUh6UUZhYzc4UFkxWDdHc0hCT240d1hFbFVyUG85MzQyN01LQnNPaUhBZkFTUTVOYlJWS2l4U0lNc2wvM003dGhjQTlxRnE4SExUMVNQN2l2YWhLbXFicGl4eE5HM043NGRVWGgwRDdvZWdqS2dqNWcwbkVtT1BOOXhXNkhLQys4bnBBWmMyU01VSSs4NU5aeWpWeXNQajdNUVE5dW1nRFh2Z0NsZVVuclhMN3dCblBOZ3ZGNkJJVXBJbUZ6NGxFWi9mOUdySE9HSy84NlZldlV4bFIrVkI0aFRzQkplRFRweXVLazlRL3QwaG03djBNWlN1bHgwWERuRzBTQm51RXUrWEllTmlkRFJXV0cxU016N1JkSFYyUW90TXpYYkFqUEdRU2dpNjJ1YmVnblpYbXArYW9aRVIvRU9JRThZL2VVWWp4dE5HWHJVNURsakJZQkJocTFlRDVRamlrWWpOZHRFdFgvWFlaY0NoRHJ6MFVIV1ZEOWhFdE8vZVpvY3o2dFZ2OFppSjRUR29yZzdUWHhaTWQrYWVJamFuQ3ZGRDBSTU54eXlRSlhRZU84dktNVmJkdzBmRXpQRWk4NElxT3RpRUlMTmNZemN5OGhqUlFEakRPSXpKelFnYzlYejFTMnR5WnBSOW1TNkdibkdHQmwvVk5PTitYRmhFSFpFVzJJTXozbk1DTE9ybmdqb0RYOFg3Ty9DZkhTVHhwampJRFNxeSsrLzBvcnU3dW5JbUtmTmlWK3BQWE5xSGU2eXF1bWFOcXBjaDJhUlVyN3g5M2VkZmdDMm9XejVYaHVwN09QMnQ3b1BPU1kzVVVzdEJaUy80Q1RJeGJGTmR0V1VNRmppYmhOQUlEMDI0eEw0cEFaWWJPMXQxSkYwTHNLUmw4dGJQRldSdEhuQ1JFUmF6bzVNTEkzaTNNQ0JGNVNoN1ZCZDJ6N2ZXY3l2RzFQUFZ5MUx3OU51QUJzcDlMNmxiMnRPTExaTkUrczFBKzBXUTBGSURmZXgyK0ROQWpjS1VGSjVJT2I1UUdqUzRJcE1Uc0FHQTVvcmFpdUVlNHkxS3JaM3J5bHJQQkNNK1FvaG1sV3NPVjh3WkNlOFgzV1Q4UFNxQ0VEb3dxWEl1NTNObFZ1aE0rQnExUWVMTzI5R3FzSE5VWndEZkpuNWx6R2FLZFhVU3dNaUlCVTRYeWtOVTVoUkhRS0J4M2VXSlEyYTFxZlg1YXRKYTd0ZjhlRGpwcnR3VnJLT3FkNjZMZnpYdXBLT2U1aklrTW9lQWdCZ1RvZkRSRGlVTXBVQUhNdmtXN0JRaFZhbEh2RnpSVUI0OGhtOUNXVUIxSnIyUWI2M1REVUgyWUhyeFd3TEl1NTh6SnhmanpnVUN4Q2dZQk03ZWxjT2M2MlFhQ1djWG9CcEdPR0FScS9iVHB6eHZUOWs3MkgwU243YnZ5ZWt2aWJrUXE4U1V5U1hqamltWm9XMW5EM1RLU3pzRlFPZ0JoNWh4d3FtZkYrU1hybmJoUXFhamUvWTMyMGRpSUpaVUJyT0tWOGR0Y3FnWUJHUklOTUhSSWZyYUt3UEtQOCtLSFp3V1Z5OVBuQ2lOcFJZa0VZTm1zaUF0SDl2VTZDRzFjamdxalFxL010Mlg1VEttamU1OTB3dHhnT3pFVll5VlVKaGUzSjltNUE3TXNsK1VoTmRrMDc4UFg5VFB3aEpPaGxBV21ZOGI3ZWlIMmR0aDRxMS9xRXJRc2FFZXNGWkpBU042cmRLcnRmbWtiNFhsMDNVWHpTZlhSdmk1NXZZTzFoNk1wUjJSTDgxRm4xQkdiTVpxRkZVdmNrd21va25SN0dZWldObSt6QjU1N3JGUDFEUVZsZ0ZDbFlRNHhLaTNlUGlBMDRodDNqcVhkd1VzNmlGWnVKbGtOZG00WitFRGZ0T0lNVkFKVW03aXdTdkdLcVhXWk9HR0FjSVg5bm1NdmFWcThhRSs1SUN3ZEpJVnpGdVdHZzE4akZOQ3BSNG51WjZkaXdFQlIrd0lNOXJkenBYemJZZVdZVXFoSzMvTGQ3NWRocnFuR2dFejFCM01hNWw0VmV1ajNQeENzMkhWcUdvQzFlU21vMGI5b01LeWJXdzdtWmg0Ukg0ZnE2bk5LRXh2ZFR4QVp4VjJEbFpQWTh2bkhZL0pEV0l4RmNqL0owY3pCejgyVld3eG05REtyeW4wb1BwR250Ulh5NHd6ejV3R3hmdzRldlBCUktrL2RFQmpGK1N0RzZWMFYrZk9PWnlJeHhxWFYrSHhyQ1BVY0ppQ2Q4OURjRVVtblM2YWRrMzFqNzhXL3JRWXRBZDF6Z3RzQkpLWHBkMTV1QzQ3Ulh5SzJyWTU1MnE0VTFwVCtid1o5ZG9id3REeXBndE5QWHBQcjZSR0VJSFZiYm9taHprVjEveExVOURrWWdsdk5NdFdpZ1J1VHUxeVY1TnZIT1Vtenc2UER6UHNDalJlSmdaeTFyZ25EMFd1ZWZCSmc1Unc3TllyVjBlWnpRZWJPWHVPZFlMejFZOU95aUNkVEpMOU9pV216ZCsxeDNvcHJsRXYxbjU2RVVsWE5IcnhJSFphNW1FYlVzaVhHUmhkUzA5ZUNka2RqeHBMb1hyVlZ5UGpvL3BaRTFrQXc3TWhqVHFZUkVrZUhkYkQ1NXNzNkxpSXViWWJqeVF5WTAvaklzdmwrc3lIYXNVNGdwYXpxYi9vSGxJRUlMK0g4WFdHQUZOM1h6L2E5c0MxRkJpcTZxVzdnUTRqMlVETnVnejA4c2kxSXVFZ1VhVkR4ckljMURXQVNEVGNDblhFdXdwVG1aZjBSY3hiTVhld1ZHV3YzWVJEL1UrVy91WEpGM1M1R2pLZDNyN2ZpeTFVQ0N6NHEvTHNkaUNZT3RrK1FKNFErbHZVNEZRcVhYeFFjemZUbUVXYUE1VFlvMmQ2dWl4WktPLzB0aWtHNmkvb05ZbnNZcmhMRTd6NElrUDVxSWhRWU0wek1SQSszZ3Z1V3pHS3pwVHlhRFVPV1BYMmljQ1VTMHZock55NDBqekF0MlQzajR5aVBSUDBBNDF5a3U1bE9ycXQ5ZG4rNGNhbnJXY0RkL2FFN016YjVTY3ZzMkRKRGhmUVlvdWNHcXB4UnZrUXYwN2MyY1ZCNHUxRzNSV1l6elNBbHdSSFN0WWthemRqY3VKdUtwcFpRTEc4QTNDR0Vnay9CVmx0UGJVTys5TWpFYTRJZE1NSTZscmFFL2RjOU1NNVV6NnhTUjJuUVErdzBCWlFEWUJnUGF6cDNPeXZET1N4cyswVXdhMkt2eThWalB3eVQ5TlFNd3VWd3d2Z1RYTWY2aFIxSmw1UVdMU2EySWhHM0FKd3ZsMEVFbkZleTlyYXVleXhjZUtXZHQ1QlRVWjdIN2tsb05TL1lkTHpUUXVyTnNsclI2eWJaY2p0QVVtRDBXV0hwTmJJNEV2MmsvelQ4UzB5QSsxNGRTdWhFcnpsM1VTSTN0U0Myb0VINzZITnVWdlcvcXNxOXo4dE5wOWtwUFRPYnZKR2JxOVJPWGx1SUVocWFobStpeDg2VDY3NFJiMFpPUW1zNk5wa2ZYamZRQnRxbTdDUWhPejZ5dmpRNzdBdUx4SWJVYW5GV0VSSjBobVhEKzFqMktSVGpWby9FUVBFaEpOdFJNN1RmenVQMG81UnMyVlRRNG9QV21WWE1GQVA5QllBc25xai83Ym9pSTIxQVJkYkdwWXRRTXEvQ0RqWHc1ZEF3ZFR3ekZyRHpoME5Fb2VHanVIVWVBckpyZFp6YllmajJXRjFHbjE5UHdlL0h4YmVVTm00SlZERlVHeUtESDFJZk9FZlJGdkxVNnJCSzFCWHY3U2ZGb01ZWFJrWkRjejdKcFJGVmJ1VTZmWGhKY0hHWjhhSWxPTnJJZVhTVjhTSWVZYmNWWmVNZXlHWk5mUjVEbGI1OWFkdTdTclNKS3ZiQmVUQ1hzdlRwMTJpTjFqZUM3V2RzTmNiWHVkUWtaOEhLMG9kVVp1L0tyNEZqT3YyZUFGdkJiaXUrQTZZMlpkSEtXbTdOTGQvVkcxMXRtUGdnVS9zMUVUNGYyTTFOK3l5elprUlp2TERmaVQwSjBTWnh0MkMvRENicSt3Q2N5bTE1elR4VlZqdXR4c0RWOFY4UGdzdDhJZ1JDTEEwMnpsSm12ZEwzL2hnbmtXS29SNEd4dEMxcityQnhBQXIyc2lrblhRRHFQdzNzWWluS2hEZFVENmxlU0owMHFqV1kyWHpiallhVHhUbUQwQTBoVGlNZVEzWkpqZFZ2Q2FLTWJNRUNIZkF0MzFTeTAwVVhSbmJqQ3FZMGowNDArQWZ1Tk92c1hhREVicXR6RUVSQkowSjF3Vm1taFE1VTJzc3RKc2p1ckZaVGtvbGJNdFk4RjZiNHd6VWtKYktHYWRIazU3cnkzN1R0Zm4vYUhzaFNBS3NZekpZUElZMzJkdXNBY29ubXlJcGttNzhFWXhiOXhSOTkyZW9NRDFZRHJPMWozeVdnNElDVzdYSUdHb1l4SUo4SjJ2USsxazhmTEI2K25PVWdXRlZhU3VVRG9VSXU0a3RGR3hUeUwvd00vb3NqY25HMk81aUQ5NWlmZ1hzcS9KemtwZkFjY1ZRc2wreCs3a096SGtjaFoyUWlDazJxMld5YUkyUDh6UlMyQVN3YVBoalZjd3NGODg0dzR4Y2FNemcwTW4vZTJuL3hYUkU1SFM3aHdWZWhkcjRzV0dNT0RSbks2TjVUNW9nRjVuNFNQcGxoZ1BsU3VPR2RMK1JRdDhoZ0dRZG5wUGpYRGk1TEhOUGNJN2RsMUI0TXM0UFRUdm9YMER4OUtLRVFtTitoYUZDN1ZIYjNESlBLMWU4aHVYRmgwSnVUcDAwVFFlQnlIWko5ZzQ1S3MwZjVmczZIZUNFUnA5OXlVSjV2SWxmMEJFanZTMkZ1dWdkNTBYbzFKbjQvV2hiaUlYSmU4d2JpMzg1TnRqaU44OFYwWVRGcnloeVg0bGwzMEhsMk85YlVXUFlQZU45dzFFQmd1UGd3S0hIMGpjVjdWWjJpdG9hc1FvUEdGb2l0VzRyN1dwRTBaZWtsMGQ0aHM4Wjd6c1ZHdk1uQXJEdm83NXNqUExGcFp4ckgyZWZWTUpRTEU2MzlFbUM3YnpGdGVMNVFwWlQ1K1pua0cxNGk1QlAwQ1Q1NmFZc1U5a1AzR0FUSkFBYUxJVkM1V2lCcTdUM0cwUkpPbXEyT1EzR3puVUtMbWtXSDE2MyswOHhkdzg4ckNrazE4U3V0YjlVNHdRdXJ2S1dLdndBc1FDY2NvNDhEcnROM2xRU3JTNytwSGs0ZzBFRjJMTGoxTS8wWW5BZ0JhWGNmanI3U3JldDdoZ2s2ZnRqbUY5T3BLT0VycmIrd2FHK21kbmE1R1lROGJMTzFzSGtLajk1eHlXdm9Fc0IwUWZXaytkZERGTVAzRHBDVTBUVm9XU1U2blpVbGFmNmdIeTVQRExLRmc3OE9JUWFackJsUEFRODlDQTJZTDdlKzNzL3dib3NCcnk2Q1pyRTBWZ1ZZWldNZHQ1cXg5bVRDNDVOWFFLQUhIbHN5bDJpQWVLc0diL2Jpay9zRUVlZ29rMlJZS2tJVGpCdE9pdUd1cDR3amwxSys5WmdmbEV6WjdYa2w4bnp2OU8yZWQ1NGxjd3YzSzZVRVQ3MllSWGhrdE9LQjJrOVJIMVRDdjBPakVDSXY1UHFVbndNN3ZkUUZKRGxlazB3VXRuQ0NOdWs3QTJiOTdOWmhTU2pmZzhEeUw3M2JwRGV2OGZOeEhhY3NUTHUvWG13UmdvUXllSWRvU2cvQVByRlo0RkZWOGRJT2NxZk9EZmhKT21uY0xuTEcycUFvR005b21nVFlLKzE4SVdxUFY3ejNKeWlYM2Q0bnZDeTlsU1JrTWRDdSttYnVRa0xYNnkwMWhvTVUvbjR1WnlNN05jcHM2bEZaOWlZbytCZnE5aWwvVlZLczRZZ055TVFxK1lQNitOUlZrMGwraW9jRVREa3Z5dlJOZ0hCR251OU9jeVV6MzhSeEFuTE9qYkM0WDl6KzNZRzJQV1RsSmxKeEdyWFQxSWdzb2ptZVBDRndsY1JSVFdncWFnRTNTOU1tMGkxTzJtVVVqYUVwYVNZajI1NTlDTFN2OVFhdlRWYmVQcmJkajZqWEVLc3RVWnp1Y3JqSm1BOXQ2S0RTNFBMWUpZSFRITWt6clpncHZ2SnhuaENHbnl2QlJNVWwrZVNTOXFidDJZd0o4dHpFVGpqK0JsdmdvVCsyOHdRY3Rldm4xRk9BbVBFWFh3dlltM0tYSHl4cDhUR1ZnR2h4UFNLZk14NWNST3dJNTRuSlNYTW90dEhLTWx2VG0xU1dEdkxRa0VOQnJwUDJoZ0VmWVBMWmNJWlZDVmRVS2dLZ0xzbWVDdU1lSFlNVGZvN2FvcWhvQzJXZTN3d2lnZXdNTEp0Q1dYOHFhdzU4ZHluV3IrTlcwckhrSEIyZzBCd3JxNHZ3Wk5IVHJXa0d0Zk1DSDhrU1FwRXdpaFp4VnEzT0lSL3RRY21LTmNvL3VKYkc2Ym5IdkhpSUNPN2VhZm1zK21pcEE1K2lQalJaVkpjN3ZFZkhTZFJuOUNkSWdQZVRiaGhyMUsrQ3lGK2VreWU5M2ZSK2V0VjBBSS85T3YxazdnSHN2U3l2aG9rNmFjVFJYM2I1YkRJQlRPN1RLUys5cm5IUXNhYVBSNjVjSk9qdzNSWlo3VzBBTEUrQUNkcWxSS0lYUk10dGZ0Q05tQWRqZUQvNWMrYWFuMTBkOWplQXFaOE5WeS84eUxjUWZnQlF5UEV5M2duTmFWVk1mU3hjOENGcXlaM1JGSHlNVXk1UElQV0tPQjlVeVZIczhqK3llMkwrZ0dmclRod2Rpall3cUtkRTErMDZsbFFCRnJiQ2ZqVE85STVsQTF0NUFacVlGbENUQ2dNSSsycjFBN3ovdy8yVmRxZkY3M2RZZ3R0eUl6S2w1M3RtV2hRWkRSRXNJMnNHWFEyUDU2ZnYvWXFuektxT0MwR0lqdkFJYzU5YXc2endNQjBjN0tuT2pnd2M3K0IxUDFvcytvOG9NWDVqSmtHMWh4YmZZc1dNRjFzK01GRkduNU8yOSswcHcxZzBhbkpMdjNuUW0vVDFrbzQ0QWRicUw3eERLYzRZUUhlRldWNkVDdTBVd3BKTFRzTTRWM0pZVG8zQWNoTWhncnB4b3lsd1lLR1hmMGtTVTF4NGJEd1FVRzVxaFA3Zk1jNkFsdWZGTDFUYllhclZNSDAzZEtwQXZabDgweEpjT1I2b0Z2cXVkVEYxaExHNVc1S2RnV05mSVBpNEVwZTB6V0s0YjhRV0dGL2xHbDBqUTJpZXZ6SWtzcGhSM0ZOZFdpc1o3eUNVSEVMWHNaOHl4cXp0THpzemF4dW4xT1I4dnJXUVcwM3dQLzNmQjdwT28zK3lwdFFEdlFFNnIvajBRdXJiS2VTZTJqREJQdUYxREJYYVlEWlpUTEp6R0ZSOUI5Y3FqY0w4RklJSFNaR29vQVh2QWFTem5NMjVmQzFnY0s3aGxFYm1Jb1IzdXRDejJOOXFGemNSV0VrTnlid2dLSExzMmxhR2RkWnJhS2ZFdGJQRUVjREVVMkJrLzVCNEgyVjg5SU9vUFduMy9UK1dPdkVFT0dycDM2azQ4Zno2elpyWnJNZk4rZ3lub0dSbzNoQW1mK3BYbnh4a0Z2bjZhSDRhNzVVejNpMk5ycG9heW1BR0VuRVRrRlgxM1l4U1N1YjJPVzFmdlFyZ0ZDQjlIbjk3MUs0WnRPQXd6VVNubWtQRVdqZG0yNWVvOHg1OHhJek5wVzNpWGoraW4rVlBVUzVYajRLRUpyWCthcVZ3S015Y21yMjVPMVU1OUtEbzBMdzFTdTAzeVh6bldYN04xR2VqcUIwRmx6WjBCMWZ4QTB5ZVlmOTFTUFgvYmpNN1hOMWdMalVqWWF4eWpNWEhzbGlJNXdHak52eDVJMWdSZXRjVmxLMEtaeUVFbUozeFgrcUtiaWROUXZrdW4rU0l5c1B5c0hoSUhIWTlFZmhUaFN1OFlRR1RxNFhSZ01DL28rUmZESnVMTGZtdHJFOEFIVHE1enlFcTNYd3dqdy82TzB0bHVKSE5lUWpWeGhlSUl1U2p4MVlzbmJXZ09ScTcxODA1YStpeEZraEJ1S2ZiL1JreWtZMzlNcGdXSE5mU1NTelg2ZkRxSVlQSzlwQ2ZBRC9zMU96WG9FNkMycjhady9rdG5WcUJ1UW5OOXl1eUx1Slg0Q051dzNtcmhXRUcrbWtDWk1pZUMyTDhvc0dNWktBNGZDZFF3YVNxZDdKSk9tZncySmNMbG5QSEw5dTVCUmFoM3I2YS8xeDRRbzdnSk1Qc3A4VGFEL1YxL3d0b01OMjNDT3VJUVFadkxEUzVTWXFnWTY3UUpTMzVRQ28zbUpOdENWVGRSNDQzVHpBZnhFcm5oc2xKc0NQa3NuTUx4SjNoU1RWZG0wMkJZbG9BaVc5bC9KUTc3aGlBaVprMks0NUUvRXdycGRFaTlqY1Arak5SSkUzckYwd016ZFJ6QmpSZStPY0xOMUFXdFFQaU9hNXQyelVWUnNQTHVrSUJONzNnZERieUE3WFNrTnVleUhjM0JzZ0wza3NLOFczVVNqcDVMMFRHNThMcEEzS1VLYm05S2FmTUROR0txWWRDZnY1OHZselVCN0RWRlRJdmtGOCtkUldmalAvZWNueU9laFRRalVkNVJXT1M4eGNmNHArMmFBdDF1MFpEeTE0ZVBOWHNjYWZGVnFBekVSYnV5bjBWTS9oYnJNNmhPVGE0b1QwZk9RM3VHN2xxYXJvYzJmR1oxN2xIYUhEbjdLSXlZeDl5ZlJoQjFVbzY1QnFhb0QxcTV1K0lhZzZKQjdZb2pBV21veis5TUVKTENYMFBCN29sd1FkTTNRUHVGVnZiRmRXN2ZvVElpcEdUckI0c0UrQzcxQ2x6MXhlUmpLVnFvUTA3NnRlcmFZVkNBQi9ZcFl6QTE1dHRkMk53cWRBSmUvaXF3cngyeUlncTNnOEMvbVM2bjZhVGtCY2dMODR0bDlHby96UzQybTg3emo2bGpDM3MyQTNtdU01djZaMmNoWmp0VFBiMVppRVVLM2RoUlRhSmFaRkhPYk1ucm9QMWJaQU1jSUpqNkhmWDBxR3lLTzhtUlpGNFlRbElzVjlYVUpzSjNsNnNaK0Z2dE1maE1uSUdRNU9TNTlPVHZMUkxjbi8yYVU4MVo4QUk3ZDUybG9jaHRkem5QYkRIZExGc05zU1k3Tldka29vWi8yTG1lMjI2RWdFNHA3UWhsdnZ2U3ByT2tFbE51MU9acXo3eTNSa3lrVTg1RkNZRm5ybHgreVU0WHFyOGVnQlNxOHpySDlYQVV1R3JVcjN1VlJNWDJjMnNNZTkzVGlVSEljREFtNFlBSS9wYTArZTJHeFc4T0dHRG90N0l2ZXh6eHZOdkcwTmorTElmS0xPZ09iT2xmVjBGR0JZZlIzQzJEVXk4dlRaMlRQSVdxUG5uaHJTVk1Lak9JYVhLclhJS2pld2hHOVVXRUpNSUJPYUpCbDFYTWZSNXkvTS9ZTjY1VHJVNm1uSjRiM0tTc1FrK0tSZ2hhYVBWaUp3YzczRG5mb040M1dka2U3UjlibGY3UTBKZE41OGtoZ1c2WG1hOGUwb1NGZk5ZRy9uaC9SOVNZbGVvZzNVL3IvZTY1Y1RaNVhzOWlad3RHM2l2UExIN0wzMml0S2F1Sk5xWDBGK0t0dDdEVVE3ZkhoSGs3WExMdlRnSFNGUE9sRGRQUVFZVG9QbFdlZlJxVUEzb2V2SWZpM1BheVltV0JpTzBBd3J3dzJaSEhHQk1OdGl3eGV4RTJXYVhuVGZ4WEo5R1VGUG5kWkw0OWpEOXBXSXdJWjE1MFVIaU52YWd0WmpQL0ZHam1xZEc0Q2xLYW1OVHkrNlIxd2lEM09BL3VSdTJTUmNkdlVBWXZhUWtyTDZFeVZJM21uOEhxWm9qN1JZMWE1N1FVcmN0cXpnNVltRXI1KzRJcUtCTmZMOGhaNExMTDc5ZjcyMmU0WEd1OHdkWTI0YnpKZVFLOXpFR1ZpTzJPbG9VelRyVFV4eUM5RG9wUS9ORkVzd1hLeVNrSnBPL0RvYmlVS2pEQUVaamJWMGxydmp3KzJsdWpDL2s1S2VTTjFoTGprbG94UFVDcEkraEtaTCt4UmV6cUFhMkRXd2pHd3NrR0ZreUFydXZ2YU4rcTRFL21iMG1YdG01dHVEajFoNmkyWjYrbUJHRUZGdXFqZE5XVEJUeHhxcVpRbEdEY0d2T09qMGpuaWpOT3hMWE16V1VpUjdBbWhqcDgwQU53U3JsSEI0L3VINzFRQ0pnYjFXYTlmVjBXdWlDOEsvOFNUeTBkVVZ1RFJ4bVp5aTNxTk1pV1VvcG5xYWVqUG15emdOMlY5YktJOW9zL0JRMzVQcGxDNDFDQS96WHRqR290aEdQd1ByOEJnajkwOEdkQXUzcEs0WmhwWnlwRWMwQkJtdCt6YjMySFlIZmR4QzNBR1c4d3NFaUtwZlRyVVl6WnZ2ZTg1dUYxUlI1dWNGcXIySjZadXgrWVNxMEtaV1hiV0FzQmlDcnBQUWxnd3NKOFlhdDdvOUF2bm5jblRyTms1SXF5SzJpQWhYZkhWcmxuU0xUdS9xWXFxQjhrSC8yTWVIdGJ0OG5vWUdSaDlzSmlDUGwxdFBGMTZEelNYQ2xMWkdzdVBTWEp0ejdSMjJiN0tHUll2eXdzcTZaNFdvR3RaSTB0dXBLRU1CcUROZXZZaVdXQ1l0KzZIZ1c3UjRJNGlhSzF0dkRuTWFqaXZ0Z1Nrc3NFSnVIbGNXRi9DVlc1OTJ0d0pEL3F4UE5ya2RZdzNIYUhoaGN4WlRxVmZOdzg5ckpTdmxyenJINUlGUHM1SWQ0VHAxYS82elFzQUlHNDBuLzVCb0hCbDFlbkhBUEJ3R3NlQUorRkQzbGY3K216dUFnSy9DbG50QVpJeHo1Yi8wcHp1QkxZWW9uVUVJRXdVUGxLTHJ3VjVDNTZKVDNLQm9sUkdoUDhOSVR1UVhqaUZYNVBoSXdYS0REcnVaZWxFR3VZSUJ4ZjR4SGR4SDAvaHZ4NUI0UjRaMTUwVXRmSlMxZnFXd01Fd24yc0ZDVnB4YTQ0NngxUEUvcGh5RzVIV21Vc3V1cFd4R3diQmgrMDNEaHB6cnh0amxXdTdkalZhMGdJM0VqcGVOTHhveDhyeFdZekhnaXNFd0wrWGlvdGVSRjFySDFUQnUxcEFXNXhXMXFGcGUxWDQrbWlTT1ZSRGs5dFhCZ3d5VHh3L0kwTm9TWnFIbUl1SHh0ekVESVdwYU9YZUFIN1pkbGdVQjBJRzB2R2FWa3hJU3RpbzgvUkQ2L05WaXIyM09rVEpxSXlQbVJnYzdOTStSVExxV2htYzlxMXJYSkJUaGN2MVBucFVLQlpsYWhCNjRRV3FGY2hGSk9Xd0RCb2tXeW5pYmhjZW5nRXJrczUyY0wrUGkzVnNCdVExM3ZsejI5UW5YU1h2M1JWOTlCeDdmeHIrVlROWjJCS2d6WW9wNDczdDRnR3Zqb09hTHpONHB1Q3h1V092YUJDQkc2L1dWalBuZ3ZJM3hxeHlMYTY1bjBlcGFJajcwMUh6TG1BVUkvWXRnQ25zckswazZjL2xienBjeTV4Ym5lSHQ3NTBGRnpSdk5ZUVVBak5YSjlqS3NjQjl4bG1nbkNKZDNJeE9IMGs1dWN2b1FZRURIMzc4SytXMUQxQmM0aisySkpLaEZxNmZZNlVURENIUGIxNDJoZDBxczV4QXBhemZXYTJPRGNKN2ZJNUxYSUFUWTVSQVcweER3MTVQMTBrNXEvc3dYRmFlUHBIblRrbklCZml0Vjd3eDdxTU5jdzd5V1VXbElxQlowRkU5bllDNXdZTEorVkwxclN2K0ZLZG45NmpJaHdhWi9Gb01lWHFUNm1pOUFMSkFZTmFHNlduLzNUZk11MDR6N1FHTnF3WXU5dTdKa2xIZnpoaUhQdGdxZXNkbUYvTnZTOUtkK0JRS1NIdVRmRHUwa0lXSm4rTFBUSjZ2L2RNZWVxRTNXNFFJVjA0WFFLQUoxcWFYNTJ2Z2p4Qm5WK1BzK1Q1UVgwbEpySi9DVHBTL0FYVU9RazJLN1BKa25tUzdNSkdFOXd5TFYyRC9GUUEydFQ2dDlMamp3djlNVXZWcXZBNTh4MjhkS0QyVys3U3JEMi9VTitMTGJQbGwvbHIrY3RGVmdzSllVb0RjM1NvVS9kM2VVeTRxNkU2NkIyQ1ZObVRoWDY5TWlub0dlcFdUOXgwMWxHQmp6TlJDSUZSL29tZXcxMStQai9JeW1WWnpOU0ZsSTRjbjJxYVVNbFhqQlVhQ3RnMkk5amtIWndMNjE2SUs4M3VNQXRGR2tRd05Ob3hQK09jUyt3R2ZVUzVLWUNPRWJhRVNvUGc2VE1nMldQUTNwVDhaTXl5QUs1b3pZV1ZRN2ZwYUs0YnprZmVEV1B4TFBZcE9zdnhka05VYXdpcWxSZmxQVko3a05LZnJlVVZTVkRCSkRqaHRsL24xV0pYZ1gzVXBvOUhkWUlXbU9aeUFKcm9Pb000Z2wzNzhJcThYMjJScTNMdkRqMDR0WlJaRGtqTTN4Zk5jZ0tjT2NVY3dCaTQrMCtWWnhhZnJTbFVaK1R4TkdMZVNqRXRBV05IUTBMWkxuUWg5ZjgxMXZWckorcVhKMzBrTTNTTmNsRDk3bEtrc2FidThQS1hCUkNMZ0NSdVlOeU51dGNLM3FNUStOL3hpRlpQZk5kTkRueG1OaU5haE1mRzZmVkorQkZHWEIzQVFnMnhxQklPQXZ0REk1SmE3UVpzOVJENUFHU1FPME5JR3BNYzJRTVY5MDM3bE1XUXMxSURRQzVMTlJQbFlBdDdpU3FSRk5OdjhZWHNOYTBQT1c5QXh5NkFWcjk3aVpKVHdRVG9mQU53cHRaVzQ0eldjeEthbEtVdkN5bHNxdDY3bXpBL3A1dWlBZjg0b0hRNmkyOXFXejVVYUR2VHptRll2cDFvM2tEOHUwOWgvV29yVVB0UzZrVVRwOE05REVJaVV1YXhYN1NxYk85VVhCQlpQcG5rMkdaT0E1bUNDdEI3UGEvWGF2Y2FwYllnWjZ2VzJRcE9nekx0b0ZjUUwybE5QMC9tbUJLNnhMVzA1OURwazgwUFpCdms2TmZVeFVkemlRc0EwWkZlZTE1RVg3bjVFdjNFQkt1N1dpYnZobEdiaGhQb3ozMGZVdzFiSndwR29McmkrMlpacTM5c0R3eldESVNTOWw3R2dmU0tBSkVta2IxeHc4S2dCMXJxdG9kNldYYW1pdWx4ZzZvM25JcmdXUTV5MWUwNndjVitnbnVwTTMrTXhRd3JYVWFGUmhsQ0pCOWZhTno0ZXhjOUFZZm9OeGRMOUhxcWVQTGZDWUpOSGNDNHN1eitzR0t2bnF3ckxLc2tWRTNaV1hERjAySFhrb0xCeDlYRWZKSnBCeko2aDBNYlljQnQ5ZmRuMXNLaUxyWUV4V2g5d3dsajh5NGFDY2dxL1dLTnArTGNtSTM3YWttbG5XTk51RTFRKzNCd3FJYlRsZTU0MW0xa3lzSENxcndUSlZxZERzTFFiejlpazRYZEMzVlNZS2dUalVrdVJjY3drS3dQU2xGbGtnbm5aOGJ2bk5mNzlCajdXMSsyM2M5UFhYamtDV0VuR0ZxNXlvd1RqRU5zV0NSNFpkYnBnZnpMOVdSYTZnS3B4VGtlNVN2dE9lV0dlaVVpZGM1MldXNWFHYmNSNThBcWs3M28rc28ySnpReWQ4VDJmdHFSd3J4UjAyZHVEZ05DZXNtWitNWkpDN2ZodWlDTnVUczBqcmJMZSs3aGZ0ZmVYOEx6eG00UEdGNVFna3p3bnkzOUNoNnNRMlRhQit2cHcxUmIyTmRHTC92eURnNzJ4TzhsME9YcXVjdGczQ3VBSnZQbm55cll1eTI4Ry9KS1dkcmdOZTgzSHNrYmEzamwyUlgyby9PM2JrZDJxdTluL1dwN3ozdzF3NXBHWGdUQmhmU1h0bnFMNWthdmMySzgzSGhpRExGSDBBNmgwUjVYNm0xem1GYmZrQTlvVXdPUEt1aFBKSzArV0xqTXA5NlUyV1ArWHU4eEZ3VGNQRWlpdEMyWWxqSW1RTEI0VjlaWkQzWG0zc3JDS1dzVmtkUUQzVTd1aGRPMGZjVnI4cnJVeFplNDRSdm1TeFl3YkVKR1A0SDlpUzVMQkplSnU0VGJhMHdaM01iWStXTCtzRVcyT1lqODFMM3AwdC82SEJORmRkNEtBNzN6YjVOSll6VWU5V0RtM05vTHcyUkxtUGFud1hqYkl4TkRwdnN2bEsvdWRHbGVpZVBocklNVjQyUjVIVVJOVFRESUVGTUN2akVBUk5Rb250MjZHdVJRcGR6NXRlbTJENHFLdlVVNVBwWFo1WWtvUDRtN2doMjVQdW5malBXbmtxK1NOYmlJUHBuWDdpVnl2bGZSTTJPN2dDZ3VKYWlJRUpvMXgwNVB0TDUrUEVJQ21rTmovZjdvdTlyd3diTFN1ZlJUQldMVkI0UC9aeUw0bk56cWVacXNVSkFhdE5Ma1RqUVBUTzZreUtlSTQ4WDNNZkZDU3J0dWVRSUtxUGtzcldEREttU2RYUzVNajc0NEx2MGt1T3c1TWh0TzVyWVMyTFdBeVhnWWcwd1FIYUZaaVlHZnlMeVlxMUV6N1F1UkFsSS9sVktUcXM1cDM0SHgyWG9OOG4zdWlBREdkNU10bHNwTncrWUgzTUFVdVJyUGh0bWdWTVhkV0d4YjdPSHlTWkhRSDVhYTlha3R2NmpodUZHN3JxalcrSm9lU2tnd0plYi9mdmR1WW0yakFHYWppNjI5dmc5dDdoZzJDZkhnTFdoMXRTOGU2YzUyckNCbzdOa0tnbDJub1BIbTlXM0RJUWJYai9ta0tKWFRlRUN1a3dhYzhJZm50ZzJYODFHamx3VThHcVErdHE1OFArL1AvbGd5eTZ0dzRZa0RjaURMSkpuV3F2dmM2MUg0Y3hTb0xEaTAyTnBScEtBTklDVjNYcmhUV2Zjb0I2ck43dVNjelU3d0hidW43cVk2VVJpNnNhVTNDR1JUMUVESExacmdpQWE2dnJ6L0RGTWZZTW92WlhJU2M4VTZPWjI2bGlxTjFwTzYzRDFBODh0dXcvdlAyaDZYZldoOVZGNWR6cjdNclBNdWFrYWxaSEdEWFZQMDRzNjVHSG8zY1MzbXZOdTRUR2pZNXQ1bEswVFBuSXJjMCtCcEFrY2NaYlY5QlZJU1EzSUNDYUVVS0xJaFNXTis4YkExaTZZeU1sMW9XRXhNNS9GNjhlSDBGTDR4STBsWUZ2OUovTEU0cGFBeEVoZHFSZXJxZEVvZk1yQU9HeEY3WktMaHkrMVM0VmUxNkdTMS9DU2w1VlFTR3RWeFc3REdtVDJpRHlkQVZsSjhVNnJCMXJLMnhINGo1Vm5tWGZhK3l6elVRT1NSbUl2L1RWRUpvWHJYek9LdDZFcXFyTFp5NjFvRnZvME5YVUVudUFMa21hc2dPNlI1MlhZTWU1RGN0Z1BsSXBKSkFxZkY2cFZRSUVpM1drSEljdG45anAwVGJkaktQdkJDRXBwdWpkRGVuclA4QUI1QjFBdmN0Qm9vRlY2NmZiUkFOaTl1ZjlHY3FBb3E4L1NGRExPenJkRjM3Y3B6eXRXUHhaN2hVSGtQcGRkdytCemJBWmhTeXJ1TEhyOHBhZytIWEM0TWZGdXgxcFU3V0dVWmpBK0wxaSt3V2VkL3dXcGZOUk56T3d3Rzkrc1p0ejRGQjc5aktZWk1yd3VEbkJSeEVhc01VRnRQRE1kVW0yTGtjM0Q5MS9vTEorUU1OZldwUWt1cW9YY1AveDlrR3c0a0dRbFlnMWZ0dUVHY2x5N3dabFRRbTUwQ05oVm01Myt6Wk05QzdQcWFYWngwNmlyZmlTbmNETlRDRjQ5akRHRFlZVGNRWUh4cmR1TzJ5QW9BMWFCZk1lZnY0TlVTa3JrSjNYbkFsN1JXdDR0bGFRcURqY2duYk9Cck5qSDhWQlhrM0tJeXdBSEZwc2I4Z1k5cENxQy9OMHZURFVkZ3lZS1Fic1lmQ1E4N0F6NHQwREFEU01JNHFrWGoyQkZENzN4c01tRGtRaGFaMkVTcHhqSGdmMUF5Q0EvOU1UR1ppa0lPRjdvS1pmUENETDlQV09pNEJkU3lzcFNmZE5rSkhJREt6SWdSTEdQdGZadTlLQjRBUmo2NVNUYUlqUkhLTE1Ja05KL2VSZkFJaXlPSTh2Mk83Z1NVRDNmQ3R6dGs0amZEZ2t2a0w4Qmw5UWtvSnNLbEhOVmpnOGE1K2tMOTRQcForQis0Z3UweHFjeVFNVm1Vc3ZXMUZSdndQOEJYOUQ0STFZaDViL050WDBIRmZ0QUt0Und3MHlWRUFTcFpaeEtkc0JYQ200dFBPQkVLYnBQM2l4dUpGaDJrQ3BSRmxsajVpQzhiZHFab0Yrb3NzUWVjTUxPNk9oN2lBcGlHSEs3cS9YVkpXVHVDZW1mSjRtZmEvWU5FSE16ekFPK1AyYWhYcE9nRTNSdnZ2cExlZzJNRERyK1JVOGkveENuTU52MUFIWnBvT2wxWnlockovMmNMS1NUdU5FQTRHRCtXRitod1lLOFJPUXZIeThjNVg3cTRyejNwWE0wSmlCRjJxTGFBakpMTGI3enowK05iREcvUWpKQ1h6ZGxnZ0xnalo4L3FGSVpmUFRwTnVJQVZEaU42RlgreTBwYTBmVTdwa2dhVzlyVjJOYUdtak9wZDJZZDlTdU1BZE5MS2xBbWlwM0RVSG9mcWIyMGk2Ry9zQ1l2Y05YS2M3ajNuYmJOOVo1bGY0Z0U1NThYUjFHUFB5REF3N3BtdTRTMHhScmhvejZuUmZncndhT3FPdnhtOFFFVjFlVnJSSHlVK09JOG8wV0pDZllOWk9SS1FoK3htdjBKbkhNNWdHZzJydHg0cUpscnZEMmMwOGc2V25aQWwzWTUvZXVqMzlrN1dNTG1iT0Mrb0tLUlRlRE9OS1BiZndReEdNbjdoSC91ckEvVkdCRGFLSWRHWUQrdkw3dW1sZ21PbldnM2VPd2dUL0lNdXM5REVoaW9jRncvN0Y5a3dyaWFFK2ZEdEJSMmRQQm5Uek9OWXhkRWt3Zm1HS0QwSEpRaFFSVW5HWjZ2SUlyV3NBdUZ0dncxK1NvMmRCRW1kd2EwQTcvd0V4L0ZkMi9YOUhVaXJXWlozaHhkTEVlcndvS3Y0d2RzbmZab2hmdGtvWkptU3VlaXVHVlRjYllWejBoYkcxTUJSeFpXMzZ1b2hDSXlGenJ6K1lBZlBCa0dPRjluZm1KVUZQc2JBNWw1d0dGdVcwbjFEUS81M1JpK0x5VnBIYURvY1craUp2SGQ1a2xhSE5meDNvdlFCN3RnZ1didWUwWm8reFA5NFVqdDk0bGFIT3R4Z1FmU1JJUy9kaDBTNTZyNS9FSkZIU1NjNGN4TVVnZktFOUVvc1J1YVB3ZlFZN21uNmo3dFB5TnNQVEdUbHJNQ1h6R1pWOWhtL013SGY4QmZHd043bTY3UmoxM3FoSGFZZWpvQ1JUclFab05mRDlBbHZTS1U1RllGYzNnejVaOFEveTV2OXJxWkhnSmpMUFdkeXg4L01Ca2RLUEFsNWJiRis2cmZIS2FKS0VwS3E4S3dCMkVSTGlSTTVpa2N2OHJtREVpRlBUTVlwOWZvdGJkOGIrbTU0MnlReWNkeTZXU0hrc2xlekhVSjljT0NjWjBTNS9xWjdpSkdFWFRXbmdheFJ2cTFxdDFPZDVwTUpKU0pPdmljeXQxM2xQWVFYZG9hazUxTHdHM2YzMFAyVlQvaHdsZ2RuUVVXVkdmWHFYTGZvNk1HdWVFUTFDekZCeUVxVzAzNkoxeW1aRnEreWdzUklYRnJTRXdTckpCZHJOS3piVTlKaEo3eVZ6NmIvWFdBOGxsOFl4SUxQaUZ4SklMUlBGZGI3WGw0NWNscHJkZmh1V2FSZFozQ28zZ0dPTmFxSndOSTdSaEZ4S3Y2YVdCZjhkR2JWaGJqZ1B0cTFrS0FkTGZYMVhWZmhHcjA2bHFyK0didTJPQlFVTmN1WjdpQVl6ZldURWkyU2QxcjNxWXNLRFFYRnpXUS9pd09PZldhRlNyQUM5V0k0MDl0Tkdsb3o0ODR0ZmlhSnNRSWlTc1pqS3dzQ1NxZFpvNEl6ZXd2RjBteTFQejhFRFl2QXR4U2FCTjhwQVhacXBITlBjTURTZW1iYlZrNFNCd1lyM0hhTkRGZkZOa1FNNmZuVHNRQ2FQRDNpTitJZy9rZ1hpdGw1ZG9HWlZ5L2Zza00xTTVsWk9KeFF5ZXhvUnBSNFNDa3E1UW1EVHZLZi9jaE1OOWtmS3AxRVlmZUY5RUhoY2h5OXdQTlJyNGwzbStLR1NUTHE4aW90dFV3Ny9OaE5PSGNoS2ttUkFxWjd3QTNlNUdhYXdtaU11ZEZsdkRGNjVBZ0hNMElVSEp0M0NWbnJ4ZS9ZOGoweUJjd0dRbFpCckdnRE9wYm9ta0pZVFovMzZ3T0dXYXNaOHFkSDl3UXZxSEtCT0REcVFPa3ZNS3JpWUlCRnU0K081Y3hiRzJmUUQ4ZHA4QzdYVk50VEY2M0pnbzd1alMyNWlCRjdlSjdOYlQ4NG5uczJIQlRWM2hrZ2Z5cFhHNlYvVlNldkQwVWQ2d0U0SU5Rc0RaZkpqSnlGbGFKbDNrMitGelhLOVFTSFdHSmQrVXpJK2ZMQ0dYa2NOWnNpNXRqcTNyMElxYnQ5bTVPb05GQXRKZ3hwZnVRMC95VDdpU1J1RlFjK05PY1pKVnNxYlJiWENUbFJhNCt6bnUyN3JOUzI5R1E0RFl5VmE0Z2F2NWk0UThYdFUycyszREh6bVVWcmdZckhhSGlUVmJYYVY3dFFjNzhlMXBvU0ZSejdXN1phM3ZjbE5xZXFqbDJML1p1Sm1MOTJJZUtxb2ZtZHhYLzVmem5xZm5YRElKbFFIZEMrUkFOYnZhVjFlaVIwdkM1OHZBWVhzNEZIT1pFN1ppVXdZbVpDWmloWTdjWkgrdXMxbWlyMm1vUXk0dWdYSDRLNVdXU1I2ays5YnJFWStsZ2FNU05sdzJXSTFUSFViMS9WUnRnZWdBRjZGTWZ4T2JWeWJTOWFZM3hVcmNrV0JxUmRXU0w5aSt0cW45LzBOMmJHL1lNWTNvS29oaUx5YTJTcXFhbGNpVmdXYXEyd2NFOFdIc3dQOWlKSzFNaUtsaW43R3RqMGRTYlBHK2tMdVNQT1VkM0hObEU1Q1VWMjQvRHhPVDlyWUZXUEIxZnhnUEpvajdDbSttUTZ5dFNhRFZsZFlLL3hlQndsbVVJS3RBMEdCTHZLUkdkc2VwM2lncFNEbHlxS3Fpc2taaDJrY1BTME9nKzJFc2JqYU1XR3VTeFl1amtERGxUbXJnMDd4WGVuL3liaDFUY2N0YXhDdzNWUklqMXdxMkRlYng5MmJNYjZyODlzOTVNZ3hBYWJ1NllJT3lmNGtDeGlGbWN5c0JFMWNhY2hNZ1FsWnY5NDhsMnJwRU95Rk4xMTJpU09EWjhQNnpHb0hBbWdMYzN3SVA4ZVhUMDQ2bjdYbDIzUzRsK1NUb1N5U2lEdFRNb2xRWG1qVExlUHBobnNBMFZ6aDBZcjEwNCtMNHdIM2k5bVlQd2dvcmloak1PMFZnSnlRcHZmbFdGZmM2b0hWeGw3MTVVczJlNktPbWN6VUsvWjU1QW55TEw2RGU5NkNaeERpRE5kcnNDUUJIUU4xSWJJOWFReDMxbG1jVURQUHQ4L1JQUjVyNXFvUzdCNllwbS9XVmttU25vZ1BoWXJGSlRKaTA4bm1CTm40RVBJVWYzWlR0MWY0TnhoMDFEREJ2bkp2MHRXa1ZYNXBJdkRvTURlVTBzVExyL3MvMm1tNmYwVHJ4cDBQRWNKK0xUTHpxT0xreFlhcEdMdW9GY3d5N0JheGtGUzdYSUduNktRcDROcGswSnIzNGgzRG9Dc2VPajhuaDdiS2ErMExRQWlvbFp3RDNZbGFBRU9XRmtrcnZROW9yRm5KaXBmUm5TL2QxenllL05UZFRNS3lnK2xhTnNzTmpnTGZ3VENuMUpTeUNpeEtRbXFuVS9CNFErdVdseElUYzdPbHpMSGhqYWYvWEtWU2tqcG0yMDg1a0huK3dLOXp2QUdka3I4dkVvdkZCSmtzbFdGVkZXY0NVQWRMUmFLL2wwL2ZZT1g4Z2N2aXRKVkVRT0c0bi9DWEJtTmpqaVQvMlYvRk92QXZRcUtEVHU0RFJHT05BQTNKenNvTGdlMGJocDNDcEJZN0ZnWGpuTkl0ME10VitkVk96R2NVSjF6SU1sdDFQOHJnOVJaQW42ay9XanRDc1VOVDRIUkhvUXE3YUhqTXMwUzRxdTVXVjgvSU5aQ2tyaGdMdWtDSkxlS1pRajR6NHNwaDdJMlZHRVVvTXN3b1o5allkMERtY21LU05HOXMvcEl6N3NqamdSd2JjWVZVdHpNUGFNNmtOYUdiV1k5SjAwQis1eGxWdWQzVmtUTGtXRTdqbERPMHBqSiszYVBTbEdhaXF4ZlgrRXhBbkVOa0dpSW8xQ2lYeHJ1U0liR2FiZGpHTlo3QU9jWFcyVnNsbUFwZ2w0MnFrTHhzRzRPV203R0lkZjdrNlpEZVdibFdGdUl5TU15V3B3UHhzdUJqTDUyYmNybmthaGFrT2U3Q1cydXM3WGRHVzNOaUVzOVhYbm5yemhxem9LS0ZtK1RBTEFPbjBVK3o4bjBoWGN2M0JxVSt4RmduUW14Rk45eG5pbjBsR2RxNmpxRmhCZDRySEI0MWFnMCt6cEdhSGNnalcvOGhvZkZCS2U2SG9COFErbUVTK3drNEN6NEMrZUJDTnBjQ1JtdDlxOVlkeHFpVnZlUDIzWVo3RlZZMEtyMWNxTkhma3dLelJOYVg0UkdTL0JOb3loUVo0SzA2cllzbnJFZU5tQUlYQ1d0ZmFCT3loNnFLOERYY1NzQWxtcWt6aXpOUTFuNGJENGhyandkUDNkMi9MRjZWbHZXTTNJdHRjRmQxdkhVa1NMUzl0TkdQTkhqQzJaajNRMXpTRkloK1dJRndoM0tqVVR6eVBQVmZFK0t0cnVxdGhySmo2TkI2Q0FEcUcxdUY3dWtHQTgzS1kzODhoVFAwYmwycnZNT3dMQ2JSdXl0MlptY3Y3QW9CUVdvU0FpaWZXOEphREN4WURIZXZabCtUOGVYbDNOdkhNaUJqMURaaGZhZk11NDEzeHpMeTQ5Z3J0T01IdlRwbEQrclJXbCtrc3NWK1g0MjBxRGxqYzh2dlZ0ZlNrT1RCMEN0ME9aV0NBdHNzV0dBbWYyYy9IbXFQYmFVeUVmSGhiUk5zd3BRNTVsb2NCTmUzczRuVmcyZFdoVE9oOHZDZFJtMHF4NHcxTTlsSGZlc09WOEJmTkR1M1czUTUweUc3WGorYkFJQmdCdmNFcVVINDZ6cmE2Q3BNa3Y0K2kvSHdHMDVFNGhsNGhTK3NtdE5kdFJicHdFRFIzdTZlUG9oNUNFZUJGT1l1MnVnaFNJSjg0bjJkckl6K0FlUG5HTE1PWUJmMHhBRmpOc1g2UGZDbS85Ry9VWnBPd1d5MTkvRWdBUk5ib25YaVJaN2UvbnIzcnBFQjRZbVI2dTc2cFRJdGV0MTZvZTlmTmNnVWlpVWJYVnRwR2tJUUFKSE5DSnJqSGJxOEFPUERGZkJuLzJoNWpmaEU0VDhJVGhHZ0FPL29kaGxDQUZvK0dpVzhUNElzNlFmbEFmTGxpd3RHQXZLK3FEc05vV3ZuT2RnajVTSHRFdHhsTjNXb0VkZlNydWJ1ZW9Najc2UW9jVThKRHVTVE5ZWnU1Z2J6b1RHUTlpNVZyTzFYMHBxTE9HaG9vOExKSE11cG9KSGFZYnRYRWprZW5qZE1PbGN4OTBncUh3UEh5Qm1vWDR5bUhSZXBuZ0Z0NUk2L01xbEZKTmVYSzBYVS93Y1BwMXd6Q0FGQkNCVmJRZldSR25PZWhzSGF6SFFYSE5HK21jSUd6NmltOVI1eWdpMzBWQlRMYXg3UUxRYUZmOVhySzdnT2w2RFRkMkoxRUk5N2dxN0x1T1NyVzRySlJCM2V0cjQycGpldDMzaDk2RGNLZlMweWxwWVRmR3dZT2JidU0wMVZqZlhjbkxKZU8yT09VSEFUcERaN2c2TU5zeENnaXdPdjlRTHo0TnJTTzlhR0E4d2JkbTJVa1VvVUNlUWpVeWpqb3phbTI5RVpDQllteWNJcUNYZWJNcXNGcWhZZmhCSG9mMXdacjJPV0hCRDd6Q3daZ01URUluVVlOSURVTDlrQ0pvWUF2cTF3akhjR2dNVTlJVXFBTVdPdWxRRXlxc21SQW9oU0loREJtS1NKUm91NlFxY1Y3djBzNDBWRDNpR2J6eVZwL0VXdTRad3lpR2VWWlhxTjNqSzZodVFyN21ZRkE1S091OHdSZjR0UmRwYVhxMUxpQzJBc2ZWYUdtemt2Tlp6Z1cyWG1JMXV4V2RUTTRhMEh5ZFlJK2U5ck93RTd5ZFhlTDlRb3pralhtRllqQlJnNHdqTi9qZHVJWnBLL29HQkJkN3V1SDUydURqN2g0bTgyb2R5OGJyZWNodjRvWENaeFVZWHhObEo3dFg0cHR3RE5hVTNJQktiNWgxY01NS3EwUE1wY3JPc0gvbzNPY1p0L1RGMzY4YzhCMGlZYXgxS3NyQ0R5YXBMelRpcEszb01EbnlpOUFmT0ovYUx4TmJLblhKT0tBSHQxekh1aVh3V0VPTC9iYUd6b25QYWE3dnU1SkNBUkhxaUROLytGb25aUld1TE5KYUUrTkVHY3dyZHYvc2ZxZWZGcWFGQ3Q0L200cUFySTU1a0owZkh5R003SzFEN1RYRTJqdjdWMkgzL1pBK0RGRThDUlpZK1VPSW9RakN3N3poSnhsTzNMUE5LVERDTXM0YklVeFFSZlN5Q1pTbnEyMG5aUisyUWI3VWJpRXpnbkQvUjgzYW03bFphUzZnS0MvaXFlZlpnSnJ6WHl5OUtteEVNKzRMMFA4TDQ1K0lhaUp1OXRiaGFTOHBsNWdSTnp3NU9rYldoTmJaWDZwZlJLanp6UDB1Y1ljT3luUjh0L2EzY2wzTUh0a0NVUm00NmRXUHV0aVZDdHo2RXZHOHhZVFhVN0ozeUR4ZTIrT0xDNXd6ODErck5taEtwdDNLUEdnbTlNTVhNSnpmbVNwY01qS1h5dk5VdmlxelJOOFhEYlRnSXYwTHB0ajJQVC9YTXRiWVorTEZVTFdmR1VyL3pNcHFKSDYzQ05Ta1NQazY2NUpCd2xwOXR5ajlkOEpZS1hhaWY3NlBybmNJYVY5cENvaWhOUzBEbERRSVMxbllIVDJtQzJ2eFNNZjgwemVEOGYvbmRlczF4QURIRUNzZmlqOGtZT1NvK3A4ZFFjOHhzNDBTTXo2M1Zza00xakVkYkdjczBSbFlzbVRWeHFSUmtuR3JzVTVxZVdYNnF4ZUVqY3cxcG1LMk1lRmRrTzY3ZHZxK25samRQbysxMTczVnUxZy9QcnRvQm5wMTVFK3k1L1VlNmxpMGxSL0FYZGp1a3FxakRod0w4eUl6SVYxWkRSRnF0UzEzNWM5SnB6SWFQRE82aEJoQk16UnowaG9JMVhabjBrVUk5eUhpOWlQNG1jWkU0elZ6OE8vdWdJcVN6cVBKQWRTQWI4LzVwV0dDUHliNGY0S1dxYU9tMjBTS2w1bmFZWUNPMUR4VW0vS0Fyak1oZGk2cUVYZnYyTWJxTUE1Y1dNdHpRR2FnYnNZTmhwSEFkVHY3TUZEK0dPQnZIa3pnZHpOOVUwek56bVpUVU83TEs3MEJnc0NNQmNuZ0FKU09vWnFUaFk1STk3c0FwNXN5UUVsTHhSMWFqOXVVbXNjTU5qaVJJUnp3Y1dtdE9UREdBbGJaMy9oSERBOEVZMEdheUo5RFQ1SU1sL2ltam9oK0gwS2Z4L25YMVFOQ3E2aTNicnFVYmVyUENteE9CNkFidTQycnZQMmszOEpZWTlZUFpYSnV3MXp2Q0NIQ0V3TkZ0eUVKeTl6SklNSlVHVWNvV1RrcndSVFo2Q0VpRWJ6MlQvMjMyYTBrK2hoSkc5akhoa2RLWnVDanNrdkM1cGxTU0RuMVlHWFRjSkhneExkWHcyZDZOY1BuVlVZV3EvMm9pMGNYNCszWnVUZFZObmZybGw4a2JtRVlpTndqK3pGRENUVWNuVFBiZU9PbUx5ZWxsMDFFdktnSy96a3R3MWdXSGJRUlNoNm1TTVR2L0VMcHRaYTNwL3FmdE15c1BEdC9tak1kRkR2YTI3M050dnlNZit0NjNxM2I3VUx3ZzAxL0pobVV5VlhtQVJWU0w4bDFBUlpjTFlpSHFueWJXTzVNaWc1WnBkaitRTFRzbHMxdmdrY0tzLzB3OS9uQ3lSaUE1eGVqOFJPM3F4Tm5FVktkMDV2NUUwZEgrZ09GSjlQcG0wU0MybjJSZ1hESnhacWZBR3Z2WUZOOVVCbVJBTVZXbUFXOWNZeXh5ak15L2FCUHdqUEo5ODBYV1NaTTlTdU5HR2QweFduWFhHTXg0UEZhZXBrbTFmNEVXSG1iZEZJWmhMSzFwMklFeXYzTmhmV0oybWQxc3NTcWVNT2JjVjN1d0NkQ01qcjBVek0zMnJRRDJzU0xNZGNGeVJnV0FLbkN5MGdQNEpDbEZ1Y1FYZy9KbWlUL0s0UlBiQkFXMzlIVlhvYVVnQ3hFZjVtVk1zNzFoeWJQQzJDMTNoR2VwbktJMjllN2lvTWZCaGFMSlhKRVk5RE83MXVpT2tpWXpEN1ZIdk51aXo1SC9ORFBhZENCR2ZtUW5PMi9FU0dsVXFONXQ3VDBrZ3hCK3pDRm9McWVpT05yc3NKZHZ2Mnd4Q2VJNEw3M1ltMkkxVVV3WERCTXpidTZCV2ZCbkxtU2hQazhmR1hSV2N1dm5KdGdTcVVFMnpHTU5DMU9KL08wUlhrYnJRNElzQnI3b3IrQ2xUUU9oZm81K3B2Rkg1TStKa0oyaGxrbzMvSzF4TWVjUEthaTZSRHhKQWFaYlpyeUY1S0QvZE1GVzlPWm8rSmhKamVmYTIxc1FGUGpBb2FTWnh5WmRWWlB4QWxRUmpPRlJ0OEdUdjhEQjQ3WnJuYXpEbTJ5UjVaTVRrSWtkSXc0ZU5zYzg3YTBHVldnVVl2QnEyNG5uMTVLeTJVNlFrb3dxYlBqMVdVMXg5YlZQNDc0WkhqeXFHM3BkSUJTUGVselhtUUtRTVc4TSsyak5aZ1lrS1MycG9oa2tIbm5qVVRmUW56YmMwSlFHbFZCY1htRW8zTmo5bGlaTml1NzNVbTJXeE8zMjBBSnViL1ErY1hiV1RKekdhM3N4b0szeU9HYmM5aElnMHduMlBpOUdrVVlXWHY5aG4rR3A1Tlp0QTVrZHFDTXF2NDF4TzNFZFR4S2tlZ2MxejBNYjFFenlvNGJ2L3cvMnQvc3FwTEZOYVVUQVBQdURYa2JWYVNBUEhoY0JGeVJwSWw1NzdHREhsT2dMNEx2bXkrdzFKdVBVSmtHdUVscHE5dlVoR2k3VjNxVktpTVNuSzVQUWdYQkVySGUwR01NelNoWmtPWFpWNWZLVzZSMWR0cHVkdzFneWhQN0Y5NytKUEdyY0htbmRtVlo0R1NXSGdPUEV6WFplQjU0NW1MbStjUk81MlNSeHhIWGJJTDA4VXFoSGk3NjErbXZ6VTQrNzJWYzAvcDVCNHVnZ2hIaklmQ0tpTWlBVFdPdWZMTmV4Tjg0U2M2UDR0K2RFdmh5eTVoZGJaU0lTL0wza0V4ZUZadE9KMmtnVVk3aUZWMjdFa0diTi91MlRieHZCaUlZQjVwRnpuYyttcitPNFZKdkE3QjAwbjVib0tNMDArbUhYNDRLRlBJd1kwalFEUUlUYjhqQ082d1pDS0NOWkdPazBCSVVCbTNhM2hCdHFXS3VRS2J4UHdTbGZORTBtajhiOXo3UU9kYUw1ei83c296ZnVhT3hWN0xkRDZJL3RXbzkwemVzYnBBWkw2Q2ovQ01FSlUvSWFLb2wyN2FJNG5sSGtjbE9SYjZCTFNrV0psMkgwamJvU1dDd0h6VXBmOGtzcFBzZ3A3VFdRY2RVY1JIUXdsOFdZYlpQRzVEUnp2SVJEWHMzbklmdGZzRjBFcWt2K3dtOVhQWFd5ZzFON1ZrYjdiV2VXN1VUKzFFOEJ5UkxzMmlzRG9zeXAyUnEvRmxYaTdsaHZPRUdCenZpM1dSM3ArbVdhUlpONlJIUVFaZDVnQzc0bEx6MEtRSjRIeG1FL3JSV2MweWZvWDkrTVlxbXZYMGEwRGdFWDdacEgybUprbnkwa3k5OTF3K2VXQmlHdXhEUnEzTWFlVnhHeE0wKzRVZCszVkRYclJGZnVOVEIrdCtIVWxlNXdGWGxleUE4MUwwZW1ONzVMNjZvcEVCNlNqMkJBTXY5aEhEMGFaYXVLazJPbHcwR0YxbmRZbHJxZ2JEZmpMSWovRXNOWTFmaW5tb3E5aHI2ZGt2cGJXZGJXY1hLU0dwQS9ZVUtDeEFPWnUxaDhnWmpwQ1VJcWJEbW9iWElUM1lGcFo0enNncmtDOWtHT0hZNEVwR2dRZTBpa29IdE5XRGV5ekNIWlBWNFhsYUFCTHdEZFE0N0tscXVHYmlZUm1lMUM4Z3dvRFp2dGZnYjlINUtrQVVLR0JxZFJmSHBvVVBkbCtERWpWQTVzek51dHFlaE1qZS8zemtEM21GRGZvYTRMallPbXpGNmdzd3RlQ1JUamVOdWdKbWhiOTJ3NUJuSkZMTld6MXpSTlN0ZzhwRlNWakdHNFN4dWJOcDAwdDNXZU5kSnNUUzlpd3hrSUwyN2U1OTRWT3RwaGxTREFnS3ZHVXovSVpiRXUzcFh6NWdkeGRsNHdUWjAvQXFiVnpRbXMyeXp4bGJZNXZQdDhZOWpMa0kyaTZRNlUvMHhPc1cwKzg4b2hObmlpZXkwZ0YxTG9LSmdBM2lLUTFzS04xR3pubkJIN2FTSXp6UForbGJRaldsdUxtb0lZVndwYUcwSmVBMGc2SUV3V1VVanpaTnlRemFmWDhpZ2dPUnoxS1RGUk9LVzdtZ2hNd3Y5WVlpcldHYS8wb0hiVmFyQVloeWk3UVI4WTdTaWlIRHAwa2F5NU5LSXM2SC92aG10MU9wV252VS9kbjUyWC9ucUEyWUxmZlVmOTBHa1U2ZHRjK0VyZlVNMWtCdXVlZWRLOTBrYlF0QmpyWjZoOVVYRlpsSCtCUXIrUWtGV244QlptRnhmZzJFL1QwSE1SQi9idDdqSXl5bEJRQ1lsYVo5aXVkazV5d2tqd2JZT040WGxsNUc4RXhobU9uL0NvbHg1L2JuOURhR3lvWXpnOUd6Tmw0V243OGRWY3VDYnAyYjlMeWZFb2k4QUZTSFJCMGY5YzNQcVhmWjNSTUsvQW9lWUxGK1JTcFVCMC9DOXlCVG1rMFlBdHVRZHFmZEFZZmdIKzg0RXhWMUZLWEZONHRLRWhjTmZjSndUaWpIN29lMVVwME9vdE5QUXFTWmttZ2YwQVR3SUg3QlVnUGpWS05JbTFsdG92SEZsRVB2TVEzMnNMUnp5QkEwOVAyZTE2QXR2UmxTVGdKaDFiVUZhMmVITXlKeEEzSjFFNlo2eENrTW1rQVVYTVFRQUo4MzNxbTlNZVFKa2xUYUt5RGpBY0hUemRxcThEZWQrbGlsL2ZRYUR0N1pQMStUV0RPSnd6SDNQV2FWY3pSUXZWczBQYTJTYnhnSXoxOG51ZXc5WndDd3JQZjVZWm5QY2ExaGV0UFEvRVVYa0JFZDAwc3lPdHp2UGszMERoODNmYmRnZTMxeVVQNkpVbENQRXhEWkhTMmF1MG81U1MwRFVNT1pSNGxVa0daUVpFSjFvNTZ3WXErY2ZoWDE4ZnRvZzU5UGtad21ZNFdCWThOSTd1TmhOekl6VWIzbGtwTnRKdjVtTndOU0NBK3UyMFJNRExob3gwNk50WGt1UHZPeUFvTGZFTTdocGhyYldGSTlVemQ3ZVVIVThObEtzd21PSWxXZEdObS9HUFZjS3BzV0Nkek4rdU9Lem5SRmFmVW9UOGlDU040MnJHT0xHTDJrRWpDS1F3ZmRtNmhrVWIySzFHajFlQ2VzNmpxWjYyd1lUenkzVFlIQU1TV0REQ3BrYlNuTVdkdFhYVkpwTWx6ZVptTkhVZXhJU0JXMkVCWDdkUy9JdE5CT2N4S2ZJWGVZQlduTEh1aTduMXVnZS85VkxqdllsS09HSjkxWHJPUng1aUw1UFJza05USTBqV28zTXptdDA5V2ZBZU9wT0ZoZTREdjdNckJ3NG8ySDlWRWsyeXFGMStOc0NjbUtCL3kycEVoWndLc3cyMjZHamR2b1FBdnRPVEo2QVFHWkpVSnJkdmdRTVNzRDdpRi9mUDQ2Z2g2NWpQNGw2VzBGaUZNWkVaK0FkQmNXeExtYkpRMnlUelZtRXlwWnlKQWhGWi9VbDUva1c5ZFRBV08rYTJvUDVMRGNjSURMRndmZ3RQa0h3T0xLWVdVNHFpNStyRjIyUHAraklKZTlLOUdRQ205eEhLd1VLRU1QbHJqWU1KTTFhc0xOSkFkbHBTMm11eUR0RlpZcTRIZW9raExHTGFqK2xveFhqajdDajI3SE91TzRvY2VFZmp5b0tpeG1mRzZtSytLLzErOUxJeFhaK01Mdk9iZ1J6elJ6MjZvR3VSNWtGaGJEelVSM1FseDBUdXVJVnUrbWlYeDV2U05CRG9Pa1ZLdXhlNkNVcjFtODlGTTQvS1dPL0RqRUp0MlcwYmRGdE4wOHhWVEYxdDZtQkpFdjhxMFYyM3g3cktpck9rdkNnRFcrRnV1Tlloa1lFVkE4QnNTVFBWNjc0eEhwek5FdnJ5VWV6R2V5OTh6N0VrUGFvZkM5c20rZ3ZxL0pDaldiRVZGaWpIOGpOdkhsVlRkY2xHaW5wYjBpYUJOZ05FajBTY2dmOUxCeUNPc2ZhQkI2TGxPbldKMkxMeWRYd2J0UzNpaFlZMXg0ek80dDZNWnhSWHovUytyVUdQZmE0SFo5cHZPUGRXcGwvVVRGT2VFeGFlVE9lcUg5SitUQjFxWWdlblNPUmJweEFrQS9wN2dDS2QwNi9tT1BuYkZOUjZpQWhoWTVESUY4WVViREpZZHVoSjZlS1ZzYitFMWx1UVlLdHg3ejZEZUFPNCt5WCtkYnZjS3FpOEFZNlF6Snl4N25pbWduNCtDZnlIUVMrYlcyemNRS1ZnYkRwTDJhNzdOdkdyUldXQzJ5Rzc4bkN2N2R4OHl4alRRUWJqbVp2bXg5aisyZ1YyU2dRNWQ0MzhtSUZoOHljaXhWODFiOXZ3N1JVN3F4UUNFUjRZMkNBbWhZUHpRZGs2V1ducGtyUWRwSDZPcHVhYUhnUCtOL1dMdk5vOXpCYzZVWHNuWEJUbWJ6eEMrcW5XVStDdkJNNVVOdndnck44NTgvSkttejV2VUdnLzE3bE8zSVJ5d01lMEJ2UEdoMHJoTG9PSnBqZzR2ZVFPdmFkYXZ1Zk5QT1RROUdyRURZdHhDeXViSnljQ0dTbWVDZHludG9BSDQyZVZIZVhmYjR5a2VsWDBGSzYxTDNFTWRFMDM0RHo2cDB4cnlPSE5aazNWYTk5WkdwV2hLRXJ2UEhUYkpiNmdGTHJCRlBmNkdRUVY2bTQ1MVdpMEg1ejVaWXVtSGZtQ3hLQ0NvVjNVb2M3VExuanZBeDkwcUx2TE1UWFBIYisxYUhBMHZsMGxBaTRJR2hlT3ZMcjFTZllCSjIvZXlPTHB4V1RmNUlWY3NIOEpTb1I4RjF2eDg1bjc5Q3NXTkhoVnUySXMxeno0cmpLZHJvN0hObDZaVlpHK1prbGRSOS9lR1JQb0EwV2Jic3ZCdnA5bXdtRHZ1VmRBcWdNamdFbG1NWmg1QnNLV3hKdUVoUW52Qnk5Z0I5QjE5Y3RVc3FCbFhBMi9BcnB6T29YT1JQZ0FGZWFCWU1hc2lXazlLNnRKZ2RPdDJ4SkxyTmpNT0kybTNsL2UwbThnbXRSdFRvN1NORmI3RTRQVWFiWXhmR0trWTFiOXhkYmo0T0srT29TYnBzKzc0QjE0M2pnK3I5ektnZnBCRVI5di9tM2dTWVNwU0FTYm5iMGRubGNUSHN1QTJZZzV3K00wWE5MU2syZHdZUERZOEdSMjVzZmRQcEgzb0RPZ2F2SmxEQkZJYTZHWEFJWEs0VnVtanE2L3U2bHR6ZU4rYUtRa3hNVk9wWHRkclgvdWtBTkNLS2hWbG5PdFpsTjB1b1ZnMXhiMlU0QUZkaXEvU3o1MFVjY1BORFUwc1grREZEQ0RmN1Zpd2d2TnVub0k3T3AzQjdHaGtsbjZORFBSNE9zV1ovYWZXRTh0REJjTUVHeFdWVGQxQUM3SWJWY2c3eWdSWGtCcEVTclRybjZERVBlRmNjRU1nTHJTQ2NET1hHaGs5aEVGUE9kMlJBS3BJem1sb05VWkc5UW96b0hxTHZBdFQ1Y2ZIRzZTUWtoK1J1MElyU0V0R3ZsQVJ5WERTVlZaZURzam5yS1FXY3VSNnQ5V1VDU3JXeFdFN3NGU3ZXNk9JcUlEMXBUTk5wT25jcWIyOXd6YWhhVm1lOGlTM0toL3l3M2tSS3V3YW5aYzJlem1ST0JYcXltdDFZQnpBWnpMTnJrRDZJeDhlajBhc0I3Z2VQaE9wTDBEajUrUm1jWGJMT1grMzl4OHNpb1NmMXN0MG9pNFNnMlUwZDE1Z1c5c09ncS94R3hXb1hMbWR5c2FURm1kQU9vZ0dueXZscXJvckhMeTIvTndSc3ozUSsxeFZTa2tiUVpleTU4dWszK3JZK1RkL0pKZUdtaG1aMlZzTk1YZzFpZWdlYmg4NnY4ZXJOMm5GYmNLQUliTFN5cnpDcWNIOEdiRXY1elkxT1RmZkVmTTQ3Q2RTTWRiSkQzMGRwWEFaRThLZzY2cFhQd3ExdzlHWjZLWFE3WmN3VW5wbWFtNk9ONzlxN3ZvZmpXaEtyczZUZE5iWFBBdmNmV3hoRVJvWHpwNDNDeVJBeEJnZ0ZaMXgzdENjby9YUFFFV0ltZy9qZ3NoM1IyQlB3eEFZQ3drYytCcTQyVDB6cXdISk9pSFdWbndRSjZZYzE0SXdpdWlsUWhZcnZwVHFkNllGa3k4SFhkVHI4cHozRE90ZWE4a25xY1pEYzN5QzBBWkxlZDZ3RDUyMGd5bVpTaUMzS3c0YWdBY3owRFRTMjA4ZzRjSm9SUTZ5TTBBczhmdTVma20xRERVSWFqL0NSZjNBT2QveWJiZTNacnZKTUh4ek5IcVlQMHkwOW84bERXRWl5TkZsU2luMXVGckdKSk5ZVHNaaHNNNFg3Z1orMTZQbFZwMlRjQUZvRENBVXZYb0VTQ2IvRGVQdG9kb3AyY1Z3M3dyai9RMFo0ekhKL3BoN3RQVjBKNFU3UEsrRkd5Q2k0NFJySlQ0QUxKemduTW4vTDBwN0ErS2NRYTZBc1hKM0VFTkhvR0txVVY0cjA3dGVwc09xOUMrczhZVEgrbCtUSGtpekpNZ2gyaTVUV1gwMTlpYitCTU1YdDhPM0drYlAzV25nM3ZFRnBmREsraE9nRFRQZkxOVnJHRmx1dGlQQWJTM0w4NnBjenRXbElHdktySEwzK21jNlY3U3RCc1RjM2ZvaVQwdDhrQ0Eya2kxQXRxL1Z4bFhudzlGWTR5S3g4L3RMMUFvaEs2bUYwOC9hNVdnbUlONkZMRWRrQzJ2ejJaMVlqNERJY2x1TURIUmxoL2VXb1ozSHNwSmEvOXk5cWEzM1BJWW1sVXBQYm5sM2RsdC9BTlp2WjE2OURUZjFUUWFFem9BTCsyS1lRaUVnWWxlL0ZVRG03UXNPYjdoRGFjRWh2YUdFRFpQdWZzOVF6MUFFeUZNY0hwaTVQdFRxaXRaZUN1UzdNTmZsOWRJbmFLOGE2QmROS3R3aG9RMDlHM2tUK2pnSTJlNi90UnBUOU1tYXZKMTZXRDd6dHVVYm9nR0RGblRXblUvVWVmb0k3K2cvWGludlYya0RDaDBWUS9CbXZsQmE3VHkyZmNHaWZIVkhXU1ZCTzEyYUVrUUw2MUJwZEgweEprL1FJcjVqb3RiT0k4QnJ5VXduS1Y3U3NqTVBWcTVTZThldWJQZlJKalZOTXBPbm40MDVLMUxpVWdCODlNeERaNmFWSXkyMjBVa2RIb211L045QjFWUS9lLzdBekF6N2VHQld6cW9KbjlNUC81R3BueUY0UDhGOVgvNENBaVlIVGg3Rm9HYm80dDlmckFLMnU1THZkd0dXRk1EN1hRV3Z5QjBTVDZqQm9seWNUVUhPZG1lQzM0ZkRaZVJMUnh0YWIrdEJhUWloY24zUDhiSVd4d3NGVlM1WDBhZ0pHVWN3RlU5clBnMDZEV1QzemFUQzhMbDJrQWU3Z3k3eVB6ZmlCcEtCNE9URUk1cURVemhrV295SGtnbG9ZbnF1YSszUmwwaTVtYmZlQUovUDUvdHlHbTBsa1FySnZZcWpiUTl0TjBFbWxzdjBQejc1b2ZRMER2WXdTalc0VFRFWElFNm9hYjFlazhXYmV0WGdwMm9PamlSQk4wdm1hWGt0US9TVm9oc2NxVVVXNUFoRDBrc0xZYjlUR3JLTE84ZzNyUmNIbDFNQU1kcmdHN2dJYURCYUJCdGpUUGxyYlNEc1ZhcXN1N29SdTdldWRyYXhyRTdyUDVRU0RRYTE5aXAvSUk1K1J2dkdSSlBsWnB2azRlM0dPRnJXdDhRT3pxSzNvSjFUUDlSVWptaFludm1WNjJIODZFSTg0TU9QRXRNKzErZVV1WnFIRjF4UWd1d0FFeFdRZDBjOWM1RnJqWWJIcXZWV2JTaHNBRXpsSS9OM3BHYmFLZ2M4QVN1aHZFL3hTdlEvcmdPbUVGZHM2RWVZeWVnY1hNd2JaQ0YrellIRDNwNTB0WHp4cFFrQkpjQm5CcFR2N3N1T3dxWVNsSkRuQ3A1OFNRdGlNdVdiSUdFZFpXaU1aNHU4N2xUSXJrYTdMYm5Ib0xKT3F4VkI2SU01WjcxMVMzVmNoUndBUmp0MU05aG1KMlZJSlY3NDErRk1PY1NhSTFyUmlUMDRBTndCQ0NacEs0V0MwaGMzWTRweDh2ZzVKQ2wvWnFsU0g5VEdtR2xMR2haWmV2elpEZXJvcFhvM1REbkcvalRlRVRwVVlCMzBVWi9lejFUS01jTnkrK1F1OEZTK3NrVm9GcnFaYjhad0RGc1pqVGxNV1N3bXJMODBxbHpkK3ZnMlhITm8wTUVBS2czOTg2Q3Y1dVp4b2JzeTIvZWprMFp2RElEWVMzOS9vK2xFRUNhejNWNHpaeUdKT1A1YWl5VkVlMTNCS3ZlMWN1dW1rU2ZuV29VUzdnY3FMdVdtd0tGSzcxTG1IcGxxcyt2M3FrMjBKZGNSRXZNa0ZuaGZJU1F4SjIzYWYxak5FeTBjMjZLSUFZQXZWWUtvT0lpbmFMUnJqZkw5MURrV28xcWUwMEkyam9TWklvclBwbVgweDVJWlY5Qm1nNkFvV0orUTZWMEdHRFA2OVYxRnpZTzhaZzRUU3NYa3NMeW8raURtVnAxRk1PY3VlazNyQ0daNGY5NG40Qm1maUd1V2pnSVRIQmhZNTgwMmk4WlFrcHErS3U0NGpNOFduWWlLWmJlZmpGMjdaS3JLbE9PUFJHK1lTU1hTRjlFQ2N5cnFRS2dFYnlGNVQyeVFJczdNVUhiMG9lbGxGQ1dXanc5RmNUME50SElGbjRzY1c4cGNQOCtGVkhPcnhsby9FU1dUaDN5NSthbGphQlNyeHpBRWVUSFJBeko3bWUxYjhDbzMxSnZMTExmODJDRUJIdEwvcTM1SWQ3WlVsY1ZhU21KMXRrTVlJdnp0QjFhelpwd3RpcVlwcGhTMXRENlVobWtFS05vVXhXYVJMUGtXQjBKd2hIaVZ5MmphZmRaMEdCUVBWODY2eXpYZE1UdFd2c2srNWhJNHF6RkhjVWVJWU5JUmNMMUVtSVJQMWxFQmFuZ1l2b3VjVk5aOTNqUnM1TlVpcTNZV3hwaFdiU0JCQmU4cGpTUldpRkZLd3N0WXpFWVFxSlZpYUFGdUZKQXljaHJORE1lcnIxWG43Mzl2QWRsVzJHRmg0YklLRG1DQkFGU1B6YUFZSnhhNjRCbE54QUN3NllvbVFqZGFFSytOMHFyNW0zeFd1QUZYYUlQeGxZMHlrT2UwWW11cXdkMytBeHBXb1dtWHF3V3djNHBzYU9SVFN0YVlsdmpxS2l6YU9LQTYrSUswYi9OdWFDLzhNa0NkVHlEL3RjNlVwcWVubGxvUHZ6cyt5TTk3ek5NZEFXSFVVYVJjNUROSFhQWEVqSDdITUhWQXNtRGpQc0ErNDkrRWswa3VwS2o1TVB2b1I2TXpqMGd4WnNYOTdsWjlPazFtaEoxYW85KzNjUitycmtuL2R5cnpnWG5qUE1QVTh0Y3h0ZDFtUkJmSzFxenZJOG5uVkdyZVh6NjVObVRDQ1MwRDhkcHdrOEhwWC9UT2Y1Ym12eEMveC9UNVBiai9SS2xVYnpZMFQ2RnU0YTFWTFNJbXlZVTNKK2dDNWVvY1pKV08vZEJRTkJRRU41VHVpcDViazhidW9XbkN6WG1oQUYxc3lJMXo1d3hYd2dmQ1Baa3U0KzFoeThyZFNta0l4aTJIWXVnUWQyS3lRaXF6R09DRlFVRVhWNmN6L09mMTNDNDNJRzNLcDQzMjlPREx3OWJPZkVqbGRUeVNuRlkrU1dBSWxyUml0WXoxMVkvTzV2Zm0zRXFaNHBtekZYaU1mVzRoRUJzRksvejFidDNLY3RmV3ZMY21TKytTeUs4VThlVGZ5N1dPL0p0NVhXWUV6RDE5SDQ4cmVub091SnIyNndjcGwrMHNXbncwUlA0MW9tMDdBM0NhZ1pRSUlnN1NQSklBWkFIS1MwSjJSVmpnbm5MQ2NNQ3ZrSmtLa21RTDBvNFdaZDhIcG1LaTVmVFdHam5tb0xOdnVnREZaeFpGWEZWTUtuaDcxVHFFNHNGS1JBZXFaNWoxcm5EYlNHMWV0dkIxRUVHMDVsT2FqVVJZeTgzVmJVQW1WelM5ZjVmYzVUTUJWQnJrZ2hNc2ladXR6cVZTbzNrdDQ5TkE4cE82ckpZVTVpYm02aitFVVdBU1N4YUtGV0I0bmJYRDJiR0pzdE9ZYjJTUTNZR25ZZ3dVNTkrOEdhcUx2a0MxcVBMWjNaY2MvQWlCbXdubldKTTNqWW1PQ1RhaEdJWmZvbmt3VmlJNit1OUdsQkVGYXc0U29NeWJwekdOL25MNDgrenRoMXNXbWhHektyWGROeC9FdEFVMFIwd1N3eDVBYjV4ZUdQdDd2YXFnR01FbGc0VTIvaUc2SzQwRnlLdjlQZC82NmloMS9sekhqZ0dKbUtZWVYvcGRwcHBpN3d0NzVHSi90RnY3VXMvMEUxR1pZcHJtVFQ0dkMxMU42bnBzYWtJOHF4OUFmV1dMSmJ5TkRiUjlYb3JHZDh2Ynd6TnFia1FFVHRuTjBaamtzNGs4bTAveFNhK25zKzA4NHE2V092T1V6M0ttc0ttRjh5TUdneHFxZCtoVDVyMndldEhDZm9QSGZtNTFtd1hEV0JManBkdGNMNnJiRzN1WnJxSzBxenpCUEV2cnlyZU00TFdiREtpUzluTXpxdTRpVVNrWUpkcy94dm01TlFJaTBCN1Q3NVZzT0hpM09RWVpqMURkM3NIOS9NdDh0a0o3VWZiUUtDVEtWR3lZYjBjK0VldEkyYTFDSVFxWFlGbDVpWXp0cUJKVXZYcEk0YWNBV3BwemVNbjlzWk83VUxIZHB1NXBnQ1BOelB0aTR3OHcrNnB4MlVmZkZCSGFpY29MS2NjeHFvMXFuT2hUbVdkamw2YTRJSHpFakxzVmNuenk5ZDFiWFRabTVGUjNPL3BISkhxc2xpR2FKVUw3Q2lraWtjajVOdmRjZXpiL3ptWGpqMFE1WUxWTmI1Yk4rNnRWUHRwS3llUGVEYWt3a1J3cXU1dkU3RGFUOTZCb25UK2svQmsrM21vQVlCWUhCRnRzYU5sbmYzQXEvVHdDRjFhaU1YaVJMcG1PVC9JajAwVzNoQ0ZBbnBPWmh1cUN0enNEc2ZIOXpYU1B2MTNEWExjQ25QUnNjZjR3VjR1RTFUaENGOExHKzl1NGFRMmdTSG9ZSEhYdVg5eklCdThsV05aS0hiY1R2MVFoTWhtZFFkS090V0twL05oUzRVTWFRSHovUm1aSDhkN000a0VmM0VMeStRUGUvOVFMOFdKMnNGNWdIZTZRQmtmWUc0Mkl5WTUrazlUdmZ5N2ZPemNsMkZWZmQrS244MFlFZ0M1QTN3S1lQai9QbXllektBa3NYV2dyZTE3cndSbnNuU1dvbGRWTFFaVVRpYlBOMG95K2U4MXBmTlJSa2FUbHVJVE1ZV3g2bi9rcjFzeEh1dTRFWTNqNXhvcDQ5ZjlYVVlaWWFCbnJmOVQ0NmQyY0lRM3QyZmxsZEJmY3lnRUljdUFIVkdxTlJOQmFwZlEwOVpBcll4VlFhbktRQzBiM3hCSmJ6dkczdVZaUlU4c29YR1lxRXh2MU84Vis0ZS9zYSt6WitkVjltbUtDbDZwZmZhTDIyQWh3WGtPV0pzY0h4WnZKVzJyTDVQSzh3MUJBVUNoK21oMlovTGZvTTdrL3Q3M2haRWtIYW00ampOaW13Zkl2WHVRRGczZUVPczNyaDVRd3p1eW1MRnRUdFE1ZEFabklMTE9VamVwRytnbkhRTngrMCt4dnRsbjFrVi9UK01SdGxSUStKNVR2RktzUFYrZ1YxSkhieXJJdm5zR2g1Tlg4Si9YaFNEVHNFWGs4WWVpS3drU1dKRkFmdnFwUmkzQ1pUaHZLSkt4b2h4NmdkNE1yRUd3bUxSN2taUzJpRXdXR29VYVljQXMyWjFMOXJRbW9kMUI2bGgxNmFJSTdGZC9SUFFCNEx1R2xkT0p5WGlSdkJnRFFMbHdVY0laREtnOXVwNkJmMHdGczA5ZXZ6b0o5TFdvUTZkOXQzNUJHeDQ4alFYL1kwYktjMnlEUGFya3dMVzFUcWJnYlVWRmRtQzdjeldWd1JldXZjUXdzVlh2Vmw1VkhwZ1NLUzZISDBEMjBQczI0dFhnQUVYNmxhL2ptL3NDbW5OZ20yRmhSb2NmVy8yclAwY3FNSnVoc3EvS0pmRGFGSVVzdkdyNjd3VFAxK0hBeUhENU1wdjZkYnozMUg1dzhVUHRSRDJ4b0VnM2RVRVIrcmYvWVZ3aU14c09WNkJNUS94NXBycWhBb3pzeUpDYW43THpqNFZ0RTdIelI0SVE1Rk1SYWpsVFpaVXh1MlVNY0RUcE9VdUJUUUZoMDVhY3owekNIbldHRWZDb2g2QkJadEFFN0cyUU85ck9CTkluRG9GL1RIU21qUXhLcnZZQTdsM2llWHNIUERlYkhWWGxLTEYvcmJ6VndqNEp3aCttN3hBck1BS3RlQVRUVTBKT2ZDaEl6Q041aXpnU2RGWXc3OE5uYVROeGlCTFp4L3ZoZy9jaGpTMkk1aFJ1dE80WEV2WThHeG9FOVVtV2VqTzRDZUZjTzBPRjJsTG1FQ2QxMmNCL0hCbzkrYmVrbk93RC9Db0ZrSlZIamNvN2FFQkxvWDV3Z3cvOUZ0d1hEeFJzc2lhdHpLOEJRVXk2RGNkcGZQRmFuRUtJVGdxUWFvVWdtLzIzNEwyVVQzMVZpb3ZqVFJuK3hZMHp2Z3JJR3pvcFJhdnhILzkxRU5CY1FvK3Z4dDlZRjY3TlF4bzJuTUVmUmlWRGZmUmdxMW9yZXQwWkxTY1FuNmExVldPYTZBeEI1MHRsTHB0KzRDSHZHQnI2cTBhckVaZ3A5NzlHK2t2cG9EUDg0R2MxZXdtbitCUlg1UGtjbGp6ZzRRWWY2dHBYYms2Qkw4NThtUk1xSkJZWHlXU0FyYkpvN3dycTBlOFZOWGZFL2hHUE81aHdCa3BYbUNRaEpBNUUvTnpBMS9aZWRoT0luOGt0TGJkMHQxT0diUGQ3UDRzN3J0cEo5dlpSNS9ORlk5S3ZZeXVNNm1SWm9QeUt6OTFiN0hpTjR3ZXJPdFBlL21pdE5lYWhwQWhYcVFuWk1zREZwc0pFNFpYVGU5RGpRalo3bHhJbm4xdUs4L21RZmRMaHBlNVNTNjU4dkpucE84NFJINnlSOXA4aFA0M2VKMDJ4OUlvUmpTZ21jRUVDMjlyTnJzejF0VitWbEhsK0lySkZwdjRrbXlwTTNoWEpXbEF6ZlpRb1lBRjd2NTBKbjg3bE03eVViTkg5ajdHcS9XZlNnSFBPekJvazRzaFhkK21OdExIYWdrUE5YQ2hlRVJSVmJ6Wjdad2twL1hqTzE0TllSQm5SQ2tWaGpmUlM1RXpkOWUzWVJEMFYvRU9QdU1BZmJDMEgwRlh2V3BZMlJ1d1Nqb08yTzg5Snh5bWdwMjdRUk1KakxLck5EeG10NHV1VXJkVFYyc1llUzhja0IwM3ZobllwOSsvYUxNOGVoaE45TFpHVUszQlV3Y2ZnbE41Q0ZkcUxYWktLYnBwelJhZ0tNWHlSbUtCRk54U3JBZzVBNUtoNU91M2Y0N2tCVkRCWkRndEdBOGk5dUpGTkpQWkxXZXJwbHp2T1JTSW5VTXJScW5wRHg4NDFiZjlsa092YzBxWUx6eWQ0cWIrc1IvcHBkSGs0TGJGRkI5V2lhaE4wYkpmVkFtWDJzR283UW1UNXNIYnFnWnNBTkVxYjdPVmtUb2I0S0k2UVUzcUNUVG1zUEU1UE9mOWRvMW1zcWtjSjZyZkgwdVBSVDVwTGVVcWVkamwxZ21OY3lwam5CRldJcHNZK3VjaXVaZzZObTE1c1hhVXVFTFVxUktEcmxyeHJIZW9tZCtPOTRGbldIVGZBL21lSVE5Z2YzSVVSZXpsVFR5ekY3L3Q3a3dmOHg2RmFKanVFNHlkVEZXa3o5MXpBSExzc09CRTFaNWIvVUxqc2d1RFlKNC85YW9yUFQxUEFmN1V6T0JpTlpBeEZnZ1h1K1h6cjdqcG1MTWpvVHF0ZGNSRS9GRUMwSktKZUJoYmx6cStiN0RVdnFTY2pLZ1pGd2FRTVExRDdWN0RFM0E0cUl6a0haWDZkU1k4YnZHd2NaVjlOZTJxRFZDMVZMSEt0YkJWdWV3NFZsYTdtSE5iR3lWNmYwYzEzbXRVZE1HeDNWQ3MxeVlqd1ozYWdlcTFSK3JlWEN6T3pMNVpaZlBYam00ZEJkU05Lc0liakhFT0xjTEZ1WHBtZkx4ZzdSTVBJZUNxZkhlTWlEZE9Gbjh6UjIyRUZEeUI2QUJMcHdPOW1yNVhTd09Mb0FOa3VrQ1hYUTNWQTkxK2JmL25lcUpqZS9pTGN2SDF1Wm0yaUt1d3NwTTBBaFZZZmhrVzF4ank0YVc1S2tqcEJuWFFqWitjSUZFVWJ3R1JZMzhML0NiczJhbHBQdjJ1TjJ5bVlzTGNpRDRJZ1ZPREZqTUhUWkw4UGVHNms1TC96UnB5bVlrNE83eXF5cDUrM3pjdnlnTWVJeVp4VGtxVzVPOWV1c093Q2VMdE9DUm5EU0FpZlRtQktoUW9HdCsvMjVYMG1FcTJzR050dWZZMnRsVmtGc0hvRFdTWFlWUGZkTnBUNjEwU2pmZHYvZEZlVXhXbTFaeHRLaXZjVnE1M0hnSVhQRVBubGRVQlZBa2hPYU5PWTlkR1FxUmhlaEdEcWNzVDJnbHpHZXRYZVlBQTV2VjJ4a3Q3V0JkQkp3ZTBJT3pBSTgrNGQyUStaM0JVZlBHN2VVSk12U05BRnUxU1owUkZOWUlmbkhyY0ZCeXQ1WXNPNEV6d2dTSVlnOFBJdVJPSVltMEgxL282Nmd1eVp0SVJlYzN1MkxuSEVtZXREb1NZdlBZZnJLdDBPMndEZkxxeVBUUG95d2U5Q29jdzVZMFNHWVNnUVdxSGVJVzBYMk5oa09BemVqZDNrVzBMRWg1bE1UeUZmVWwvSml6OG5pdW9VWjFNRDlZK0F5SnVwcHVndis3UlJQSlExQ3JOZE1ueXQ0eVE1Qi9XWTFTZlR0UUhGajVjZ3Z5STg5TkVLaTlOSTA4VXRGdzZRNEZkcWZZdEV4emNFZE5lcXFSUmhzd2dOS0dWcVgyYXdSc0ZnQkxQY1ZzUXhxSWp2QVhwUGVPVXVZcENLNkc0alZjQy9zRjg3WWtjUXZZQ1l2MHFOODI0UHIvMVBTcmhvNmgvUEtycmZpSEtBTyt6RHJDVnpCYThCblpnMVY1cjVwZTJBNFY1NitKTXI3OHRlTWpZcGE0YUVEWmRqamdNaXp0VVhIL0huckFoSWljMm9uUFBtVHRLQm9vWHFLdlVnRncrWFZsWCtqeGo4VFI5bmlWcVVValVQcWN6cUd6S0o1NmQ2Sy9DV0R6M3NoRjFxYUF4YWhPaldtdHkyNE1mYjNDanhJNW1aYktDZ3BlWnI2dG5ibkE2Slg5UjNMbnZnRDJ2Q0x2QnhFNVJmUmZYR0x0U2NRMjdBdEN0QkpSQ2Z3aFhtUmdjL01mUHJWZ2FCT0UyeFlLS2tNZXlwSGx1bitzMmRLL1FtRElvTmdISzFBMUdRY1c3VGFIVndZZWRWRnJDME9oanBGa0xpUU1kUEdpZXNhVGxpTTVUL0VJUmVDQ3VBRDQxc2k5NTBSYVRMTnJqSnRFU0UrRm43UG5YRGhxd0ZJNlVXUnRzaGZZY1hTZE1TYnAwNzBpRUNFSGZ2UFNGVmV6WFUzZXR3dUVzTjNLSWVlbE5HNjBjZElBdElEUVdwaytKbFA4N0d6Lzd3cmZyeENiMUN5TmxyemFXNkhJemYvbm50NVZhRWtXa0dMcHViQXdNTmxZb2FXaE9reVcxdTl2Rjk4VXZMc3MxSkwrVWZDUlFaMm53MVFaYm95ZHo5aGlJMWZRN0lmdTM2TTJJbkkvTi9xcVg3cFdTNkNRbFFpRmtEQmxBeGQ5OEJEL3lFQzh0UTVGTy9EaDJ1bk9pZlNUeU8rdUxWZkRNUG9rdS9UYStBb3ozZ2ZnalFVTkI4NysvWGM0VHRWTXZEcTZQamRDcHJHUE44S3NuRitwaHdSMmdjWW9jM1Q3V1lIL3BKc1lsS2RMWWViUDNZN0pQYUlZeGE5Qlp1RGpaZWxZdGZMYk5uRVhuWjVnU24vRU9wbHozOFFGK0dOZWFsZDU4RHBJMTNFQSttczhkSmJEZW5jZVk5NzJ2TGhIblFaUWtDengzVnBuakNEWEJrOTgreW5EQ005cnltR09RbkE0TEp4cjQwRzJ0RWtjRyt6Z1ZMeHZBczZWSXN5Z2VmMGNvb3Q0RDhkRGNDV3V4YWEzK0czbnlUcE03d0psZFZDSWdFSzFzWUVEcy8xQzdNV3NPT2hCWnpPQXNQL1VVcjJQSDJmbzljVU5ZN0d2N1RBN2JhN0k4dk91YXdpMktEMVd3RXFYcTVpYUduNWdUbU1sVG9WeG1xd2FobXJOZnA1blQ4c2Q0NkJIN1Fsb2UwNW9qZG11c21KOUV5UXVKVmpkTW0zSll6UG4xK1cxREZaT0NRaTY0WkNNUTl0bkdOVEk3cjBKZlBvNHNqU0pPT1pvU0hzOEFxZDNoVktXUmhibitDd2RmWXRNWE53Zm1zU1k3RjRTaWkwOFpibTc0WFpld3JoQStLdzRzV2xhVk1COFI4SFY0QmR0ZHVyNEdWZFdjOFZSUmY4cUlNbzJGRW5VVHpPUDNoajBUUzNoY3JmSFI2N2xPV1Jvc0w2WHR5Tm1ZMlFzaFNZNFRSMHBzNUhIZ1JYaHcySUxYQWZtVUFqOGtVTU53MTRJVEFqY0NwazlXOUdDT0ZYVWJ6VG00aVV0NXJBaHZ0NElva08zdzJzaWdGYlNUWWVuSmU1OXV1dlNISEQxY1lROEF4ZSt0c1dxdlpCMjhjUjNZSnc5VlJOa0pnNlhuaWk1dHZUTzc1NENvcDFwVXRhUGR4S0UvY0xkMFY4bDI4V2ZCUElkRStPc1ZkNjdoTEJkMlhJelg0Mno4RUxwcFZtOU1FZllhYzhCRnExQWhRRC82dENRY1I0M2F2d2RlYytqSDRYT2Z1ak5vVCtoWU53d2Q2L1hLSHQ5YjV1OHVWaDJsMVJjUlhNT3NHVlBXYWNSSVUxcm4zWnNzcDZydUFITXZBRUNsV0c1aU0wM3I5Mk9RNGFFM2dIVjVRdlpwMUJXTDh0OUgwcjBzQkdieVc2S0QrK1Y0WUkzRGtISzZmWit2dmJsK0J5M3RpaGV0eXVwNHlSZ0dmQUtaTENHelNMVXA3bDZBbGJscU9uUTBOSkdIb1ZLNlpnL0t6ZUJ0TXNhK1cxeU84K3pFdHdSNkVBc3hJdWVkVXpzM2JSRVZaMXpOcnJFekpIQ2Q2WVhTZDZHVFVtK3VzNmtkY1A3cjhoR283UnU0eWs5NWdWa3kxYzVYZml0MmpmMzJqTk04NEI3dm5lYngwVzBjOGZHcUZPeTJ4ZExIZmJDRXk5a2NGR2x4SXJpNGFvK1p4eExhL0VGNkRBV2lVbmh6SUlMMnN1RjA3VUUrUFF0eWpvNTUxbTBnZGpwU0hkQ05zOTQrZnhlM2VnRkd1RllwMUVORVVnSjRHelU4eGtZZGdyT1ZkVDJEQiswb09icERFRjVpUWRXcjZGNWtTNXVocXVkV2lLNUlMTkhMM3hESENISUVPUDhFZnhRWkN3TGluZmdXNFZqUDdzckorTTBzb0hmQUh3M2tCSjRkRlZjZTBmYWw2RTRBa2lDREd6RHVZZnpYbHBObXk3cjBPaFdLZm9CTHRXUXhxVmliaXZOTDA1Z3dIakNsaHhXT3EydnF1Qk9nNFBNMTdLSGpzQzdWVnpPTjh4SzRmVzZNMDd6cVZOUVZPQlhIbDFkbHJCTlNVcytIVS9vZTZlQ0NLS1RVbEd0SmtmWW1QdEVxL0Z4UDJsTmRrVHhZcUY3YnQ0cTc2cjNJNWREb2NqdTVTMjhqTlZNNitIclB4N0VyajRlM25DdGVuSjc0ZWh2TUNPZkFRbkxZN0NiditSKzBTMlNQd0RqMGRUd1RMMG1ZSm5zeXdEaXloZUlqaGhDK0xWL3AvV1I3K2hlaDZ4THZrb0tUbE93bFRUS0ZJSDRoUnYwSDR3dXBlVHV6a2lGVDEwTU9EUkEwZ3JscGJEQ1pZMVdIOExYZHZYU1d4bVBvcnViMDhwL3BXaWRVZkFta25JUER2ZUcxclJ0blc1bmZLOWFTR0ZtbFdMR0RSNk1DQ2ZyMSttS29PWG81dmZSYWRHTEFLL0h5YnFDMjZ1a2Q3T2daYkNPbnU2L2ZTZkFjSWVja3REYlBzMi9teDZHVnBxb3FDOWZmV1hWVEdXK2hpam9HTzdpSWlSaXh6Z3JxbWRDakh6cDgzOFUwbjRsSGZ6L0hvZy9SZ01mcTdEbEZ2TzQvdGN3dXo4ZW5CbytvMEJvdHNNNXVqVzhjVUgxWTl0SHRoZU43NlVBdUFVcFNoVFBDN2Q0bTNwMEFPK1hIZnlYUmpyTFJHNTZXN2NqR09CVG9jUXN2cStVUm9Na284bXcwQ0tZQmxrWVRIamlJMjVpeE1xYXFrTkxPZmE3Rk82UXNENnBrM2NXQmJhT1h2UzJNdmRZVmVmK3BFT3lrTnZXclRDSUNCaDF6VFhjMmE4aDkrdUMzTXJjbFVuSC9IMlAxWUhSL2IwaHl2RklrUG1OMlZKWFNvcllNUFVRM0R6eHFGdTkzbmxVSGJKOXZNU0R2RGtZWVhQMUpEZnRvWWt3cDllUnh1SUo3SDd0VmJCUEREMjhWeERSTzBteFgrclFKLzZrVnhpQTVFU0h0Z2hJRkpnTzdpMmZ5Z1R3K1hRemRHeHZkNll5eHVJUG9hM1VXSThVbHdUcVVaRDNnUUlSUXNFUUwycm5oWGx3WVY0bWtyWTBZU3V6d25xQjhLblNoSTk2RExmYmlybFAxSXRoMFJPOEJqbExJd0pnbExpTmJhV05oNXlwL0dpTWMwc2lYWjZ0RitXY0NhN0R0WVpVRTNtZSs3aDZmT0JOVlFkNnIxZ3kvWWEzWGs3Y0VSeVZ4N0kyMnZaNWFLSWxldC9va0NyTWJ2NVN0bGgvRjBlaDc5MzNKMDBsbk5MRWo0ajNLQXV1YXoyOEd6NXc2SHVPVVhJbkhaK001WUgyMCtrZko2ajFVVnpYejhsQklIeUpXZkRzbkN1YWs5cDAreWVNSUh1NzFnOExHbk9QWlptTTg1aTFvM3JUVGE3QitreDdYWnNwUmQ5eE94azY3RE42MzdxSlVKQVNoemtUWkRtNTEwb3pSZVRjdGl2eTJHcm5rSk1xdGw1bmRpdjd6bnhOcWVTdFAxa0tnNndKYWdhTmp6amQ0QVdhTGl3ZUFlZnhwTmtESWJ6TXp3T2RNZyt0R29rZzV4cGp2b3NaZzQzbm9JYkI2YndrS3JYQVJxNm0xMEZhM0dSb2N5aFRPS29hMCtValdwSGczM0hJZ2RVaEU1SGFQaXhSUDJkL2xicEdMM0VSQ3hNRWlkMllEUXVJWVpoR1JOMjNQSUZrQ2hoY3ZIZ3B4ZzRlaU9iTEJrZ3RMU3UzdCs3STRmcXlyNDFPREkzODhpWDJLZ2hHVGhnRTNyMEk1MmxMamU5K0ZuU2NTWm0xSzRuSlBOZkQ0R3VyR2RaeGhSeXRCTVNCV2ZYL3k5YXF2UEpYSXNNVjRjOTh3TVZ6MzhJTEwwZ3NyY1lYWnppaEdFNXZBWFJvcE1XN2d5MXpoWllrVytRT2EzUmNFd2ltc0I2dmxLTFFRcVVEcmZ1TTBpSTd5VzhIZTB2aDB0RDBQV3llVWdITkpBMVQ4VmsvV2wrQ3RQb3M1ZjBKY3FudENESEpDc2h4MGcvU3V3QStUaGtlMnl3dlBLcGVRSFNXaTg2eGFzV0xHUFo5aXRSS0V1TFB5dE84NjVBZzJCYzFrcllqcHZvZ2VlK1NyWkNtVWI4T2lWQVFaa1lrUEEyWjcwRDh5Q3NHQ2M0RzRuNVFJdUZhTmI4UVdLQXFSNHh4WDFQQVQyNXVHYUE1NmxFV1JsZDQxQzcyamw1cTlCUkVUcGVROGdSTktjWTN6ck1zcE9tc09RRm1ybDhtZlh6eWNNQWU4QkhMVmNuY1F6clRITHRzTElVeHFya2QxVnpKVDF4NUJJVHF5VVZmNDBvZXRMd1hFQkltMDl1ajVHSmQzUEU5YTIxT1A4Z21BRDNOMTE2YjA4MElqeXNyWC9CZy83bzJmU29Ia0RIcjZJdC9RMnA3b1BJV0dWNWQ5WDZFTVpSdmFldUdsdXhUOEl4U09xNWRvK0dFNFAweElNSDdwR1J1b0R1eUZjZStNMXJUYTNDTFMzdnBPb0ErUzhwV0paa0t2QjI5S3M4YmdoQkgrc3J4Q3c5T1h2MERwdEFobkJUYmdESUYySkpzeVNaQ2NGcmVSbFZOOVVLcUp2Z2FKdTRWR25IemIvQlNKK2dLT3U2dnhxWmpCWkdsSitHRTVaVnZmVUtBVGtpL0wwQk5MaTZCbnk2eW1JRnNjN0owQ0gzUzFmOGZJTE9CdlFuWE1NMWtadklvRzNuSHhtS1FCUVVQODJBazZaRWhmYWtkTjRpbmsydUU1Y2lCWjZtWWFCS09udEd3QWg1UzU5V0thVlZ0VS9tZGYxaDNjTnlSZDMxN01jdXNQRjFsWDFIMFRjVkV6aldLUi84NUt0RXBOREhHVE5BbTQ5MlMwdDY1WmhtVk9oMjkyclE4THlOUnh2aWZ5TlB2TUd0S24yS3hqM1g1N0dMcVhEQXA4clRzVUFRZGg5N1p5MUFVMVZ0SDFJNGN4VVl1MEhYem5iRFBQVDhPTDBzUlNUbTBNcVp3QzF0RzM5MFRrR2NXckZUM0llS0dBQ2JQRWpwcjRMcWdKZm9oTW1CZ1BXeDJIZmtXRUtSOWp6Q1J6cjZwWkZGdjZCaFBWV0hsQTFTcG52V2hEejZ3eUVWc2JIREdnMzBVR3BYOWFOSjBpRGFtVk9sU01heHVsY2Z1ZHRjdTR6c3I3N0xRdzdHb051MnJnSjUzYTZ3QlU4VzlVckpLTVBlRENRQi9LbHMxWlBEd2h3OWJLMWM2SG52TUF2c0VGUWRlNlVUb1BVRkNmUDBIa3BRYUROY1NFYkYwU3dzcFdXRXhUUGNIVERmN1hXN2R1ckNrVm1qOERuNEVyaURZT1lxSmFibGgvckJ6eW0zVlExZ2V3dnFMS1VQOGhvUVQzUW1jODFWK2EwY3d2Z1o1Y1NTU29oaUZhdnBvazRGYjFRT3J3NmtPeVNKQVJNWXZqYktubWN5TjZMR3pHcGhkWGRDbnFoVllmUmR4ekg2NXZrR2pyR3VGVXRhL2NSL0NaS2Vkb2QyT0l0RDloTTJyZ1Z0a1dUaVpuY1FsaU9ndkZPR1didHVEcjhwSktrYTA1ZERFVWowWFFYUUd0Wi9nQjJxenVjNXhnS1FkamVsYlA3YTZEMFF6aS94ZlVVbThJRUp3ZDQzZ0dTaUZwM0ZXcGxmeTVuTU1kbnY2VkdCUDNEalNqd0lqbENITDQvRFhTZkxrMXVzWS9KZ0xWUDY3Ukx0dFpHMUJpT2xIY1Rxejc1ckZjZjVEQWF5Zjd6eHVzZmllVTVtSzh3MWRtNWRSMUF4VVAydnZ4Zm5XdHBSeXNJR3lEc0dIN3kxczl5VlJXOUFaOTZORHhPZ3JnbFVTbDhQS01YNXQrbkUyeEQyUjJ1QitxbXRJdDNHVWNEUWxyK09uR1ZiSWtOYklST0kwR2Zyemk5RjJ1RzRQdHBIT0RaNFJKd2k4SHAveWg3RzRwb1kvaUVjMi9YTTVyUXNrYVR0V3JFd2ZoTkJETG1BL0JmdGdyWSsva0xORmR3bUJzNkNnWWFDM2kxUjVqaTVkZUV5SFVWMGp4T2FQdjdPQlBXVUFmZVU2dEhFS1FwZ3RJNzVtZXVCZnZPdmNwMWxFaEZNcENacXNhakoza042dlI1TWIzZG9ZVGdHZzIxcXBnT09KMm5Fd3REUG53dFhOUkFSdlc5VmJrRGlPN25PTVFKNHQ5U2ZTa0dVQmQrRjZ4OFhGTjhwWGFCM2t0RUI1elppdlRFS0FKZnNHeFY1SWVYOVdvK2NlNVlUeHJFUHJzQWZrVEgzUW8xNFFpSnRRS1dEeGt0Rml3QkVoNndmcERwOVRDbWZwQTVKbE1ONEVaZEwyaDZ4RElqd1cybHlSK01OKzRkL1pUNHl5V3ZXci8wRTZRQzMxWFBUMHQzNGREQWVLZGVaY2EyYnNQWHE1eWFSSUhScDR3c25vbTFiWHlHSC8zbGxjTStHNlRPMWpVMmwzcHQyaktIT1RkSlBkWjd4MEZMclhMcmN5eHd5MlJXSnpHMGZWbEJaZVNZaXl2V3Mrb3J2NWxFaXBlb0YrU09pZ0x3V1FNZ3YvZlZITTNCWTFKOUZrOWg3UXd3VkZ5elZOK2w3UloxVlhCMmV2OGY3U0xJdUs2WVFkeEoyMWJZYmFFdXp0VlIxTGFmdCtSQm9DUHVkZ2l4M2xwMlhHQjdYa2pqV3JkQWZkZUJ2WnVSSHBNWXR6Unc5UUY1eGpIbTdRekRyTjhOa0xDYi9KaXFDajZEcWdkOVE3bmNiNTNEMjlBWE94OVNwTEVVZVdjS3dxdG5oL2lxQ2hiczVlbVdkc3JZY1ErSjEyM2Eydy94aGpCNlI1elBDb0tjVi9rNjQ2dng0U0UxQWRVVjZrZ1hlYURiY0ErMERWeDdrdENPazhpSkhHMTdkc09CaXRsVDRxS2tPY2ZRdEZUTVo4d2FqcTgxY1paWDBaWE9GV0luZ1lMUkViZ2ZsL05ZTmN6a05lL3Y2N1A1UXg5aUJkV0I3anZiN1U2bXpZNTNZRm02TXpOa3gwT21Rd0ZrTkZVR0ZJSjNLb0Q2RzZMbEs5VVNERWswMUx0Y1h4VWpPck5WcVJ5NzZ0eFpSbW5ia1Iyc2dZVTNmNG5DaVgrOGlqVE9SMXdzQm44YVY3UktKWVJINURiRXk4Zm9wNk04NzV3RTFYQU5RRWlaZS95bk9HK0Q2elRLSnVCZHluTDMvNEl5Q1VyNmF1czl3d1RXVElXNUZEcCs1MFAxeUFpd0tnZnpacExFcE5BU1FsbDU1U0lSY1c4UFJUdG5SZWZYLzEzUDEzZWYveERGVkI3OHJ0Nk40SmJhcGN5aGpFaFZYeWJWWjRoMktxZDVRRExIY2ZKejlpY0k1aXNjamJQdWJZanI3L1BXMnFMMmwrRzRIVUlSU3pIS1VuTWdKOW1nd2dEeklUaXVDOXkvQ3BPY0J0ZGhEMVJEU2lPeTY3Q3JDdEFSYzE0TW90OTRpZTVnZnZFOGNZUWliNXZ5cUtGRkJqa3pFSkNBaHdXVVFpYi9ZcE5KUUpxd3llbHIrSDBKcDNuaEZ3SkVnL2lBK2JCYUl5d2tYbkJmVlVrTGkvSUV2ZE80TllRNFc1REM3RVdDNzExVmJnQ1VLSFNlRXFveUVVZTJDSTZPZWp0STQvMTF0UGx1bTJ1elJSb3RId01nN1dMUmd3R3FhZ0FzLzRZWStMUmlEaDhqWjc0NVRkcDFpSGJPY0N0ZURRdE1JSUE4NkxBckxPeGJ4b1VSNDEvMFRQT2JRejJyaDhMR1g0ZkJLVXNJaXFJT2lYU0VQTVdjYUhsUUJ3Tlp5bURYYU5IS1dVNTFYa2p4TlZNTFhtaUxLVUFzbXdYdmVuNTlOL0E4WCt1WHdTZWRsclh6NFpVOE0yUTJYMmtHa2hZUTUwT0tuQ3k2YWpPUXB1bXBjZWRuY3Z3OURNRHJDL3NUOU5SNFJEMTRvU21FOGlZTnA3QjJEZVBtckQ1a0hWL2VHQzhjWmlxOUtML0hzM2svSHZIKzdoNW5yWHNPenFNZUZ2QXAvemdZSHExRUhlMkErYjkxV2E4OFZ6Tkl4UTE1VHl5TkdIV3ZFaWpJWVIzd0Ywa1ZURFhyWFZXU0tCVC9aTkNjY01jS0xkazFlRTR3V0hTNW1aS1lVYnFWcVZrdXZYbm95dGhXSlNuWGQ5aWh4Q0dRWVFGaW9abWxVMWxBaFd5L0psY0VCZ3krWlhKVm5zaVZLaXB0VUtWZU85L01RV1RUL1VVSEEyQ2x4cU82NXZQNlRGT20yb0xFMTJBTTl4QzZpRUFtTTF0aGlvdjA4VjBtZTZKVTNKM3dOL3UyR3Z1YWx2cGRlNGI3bi9yM1hjWGRZRjA1UVd6MjZUQzl4OENHRithbFEzMVoraUdSM3F5bU1Td0N0cWRvak5KY25sR2ttQ05IWGVsdzI1dkFKVmFodzRkdEp6Zk51TFVZcmhCbGp4UmVmbHBTMkxLWk1aZnpwbkFzaG1oSEVRS0c0UFBLYnZaZFdUYkhlaDRmc3lOemxOUFdXd21GTHNEdi8zRUN6Sm9aZjBzdTFqS1NhYnV0b080anFFbHJaQXhWcCsxcGhFMERWUG9veDhLRUxRTW1aQjJHVzBjbjg1ODdLNFNZbnlpTXBkSHdpUTA2VVRvcnQzb2J4UmE0cGh2emZIaGd2bGRDSU9zZllRWTJ4MVlVK2w4RlYzc3Roa2RtKzVtamVwTDJJczlhTVRyenJLanhzbW10UkpDQ1hrNnl2K2k0Z1ZyQVFYZFBCVE0remFkLzFKR1Y1c0xZaVdlS2pxM0p6LzB1aytCYnFnMzQvbXI5MnREcGE3WXpLdmdRb1NCb1hvbG04eTJqc251S3NodThFMWlqWVI5L0RGMTRoNThkVnpPTjBFeEZkdXJHK1Q2NDRqSmdMMFlYK3lkSUNzMmNoL0F0OTF3S1JVOUNQbGRsWW05c0cvR2ZJYThZTVBqYWJPRW11SEJUcytyVzZmcmhIdWt6dE5IZ1dHZnFEbmFONjhtODl4blpTMXNIYWU5NForSExYQS83N0YxVTFsR1lDK1l4ZEtacTBQTklVSmM1SjZMMlE3TWlBREhwMTJkbXhmV0J5VHAwYlBnMzUxajIyVytrd0pOZGRrQXgrV1N2ZUFWeVlocTRHUExlNlBYL0Q5K0tIbkN0Ykh5bE9BZDY5OEYzWm9ZRksvTmJORmo1SlRKbE5Hc3hWWkVWUG5QU3NzOHE5cVdpZ1FVcUpxNVBGYWJjbXBxdThKR0pDc3hmUlZCV0dZMUhMdEVTRERZeTM5WFFuZmdsY25BdEI1KzZaWEZFRkJHUk5qUWtST0NoQnFTWk9lMHAxNjlqVkJmK2xra2tnWjNHZkdkYmczQmZVb3QrMWVtOFc4SWt0dk1mZFJwOTVTWkM4L2pOdzBpTmhwTWJDV0pJSUlCNDRjSDJvRHVFbnR5N2JQaFpsV0hiZ2ovMHZ4Vm5ySlE2djIzS25LeE9SeTFzZC9sdThvZm1BeDR1L3NjcjE5MTRqb1lFVlcwaXRESmRlUzFPb3k4K1o4M0dDZVdIdGNleEk2K2N5ckRIc1ltekZlUy9GV3FyOUU0UGlkZ1NkKzVGUmdpZlU2Q1A0UG5OWFp2eFJ3Yms2cDdNNFBsRXV4RWNSRGtyRWlnR0dwOWF0aXk0S1JJSlVTdHFISzM1YitKayt5SVJWZG9KVWRUREk2S0JhVmgvbmovdWtwSXE5WVh6cGFiTG1RdUFPOVlqTTc0TSt6R3VlUk5ESkZ2bmt5WWxPWGJzbVhmNllwSE0yRk5FVnkwQVhwYWthTGE5UHpDZlJTUFlwQnBDTTV4VnE5R2FIMkdsM0ZzT0ZOM2xybiszcnREZlFoc2JxMzNpb1o2MW5hTnI4Y0JuaEJFTUdXS1JrWkZ6SnczbXBNSGlUZTlnTHhGTmtsb1M0SlpOaDlYSU9WaHJjQXMzYkhpelN3bmJqWFJvcUlEeHlBRDFHT3NkbitSU3FVTnlObFlpbGJiSWJDdGZCbk1uRkNwVjJlN1dSNU9WRmhyZXdCUGk0V2VsOTFudVZWY2F3MVpMbjhVRXpheWIwV1VucktIRU5DcjBXcFJ2LzMxemM3N2pROG5uUnJoTkZKRmtsdVZVUUl1L24vclRDL3dKTzFiSWt2WDBHY0d5SkNWVXgwaGwxbHB6aFFNZGJZc2lVbGsxVjE3QzZDT3RQeWswcENqZzAvRytNUXlYVGZYNW5xMFluejF3bzVuZVp0WkJ5MW9IcVV0Rmc5VS9tdFl0R0dTekROWWpNZVpWSko0V1ovcy83anFNMFlsTnpMamppMytyWWYzRHB5MHMydEJXRWZONXZWSFN4THJPVk5NV1NaT2x2Z09zQUNrTW04K2ExdjZPeGFRM0J2OWRrcFhRUmFjVjhnNlo0Nk1CMzcvTWl3YXY1bnZMQVl3MW1OV3BXdEJOTm92YXo1TE4rZFJGSW5TNFJxUDV6V0htN0NoU3dLT3g3dzJSYVM5eEFrbHlmZzUxMkYyQjdBNlk1amhTQ3BGQXcxakwrRnBQUHRQbnVQVTFCRnhkSUlrWkhZQ0NCY01ONDkyWmNrSUVUVlpHRnorSnRnVDUyNEpVSWM5M0Jxdktnb0xOeldkTHg1OEYrNHNldzlKUVUrdTVyeldVVSt0V1EyYWlKVldQNjQxU3ZmRFZFV2VPNXRkVG9VLy9Qb2NDd2FnbTIyMnJWWE9Db2Q1SCtCdVRoSE13d05tdXhlT1IwSXFZNGVodFF3a0VaV2hoVzlVV250WU5kb05zQmROSjErWTVQdzRCYUZBM2hOK1BxV0FFdEhWaXNIckdkZnJPQUY5eXkwUlV2TjhKeTg4MUoxWi8rZCtNMG42YnoyVmltSjBsbHQ0cDZQNFJ2WHlEZG9TVWFRNmpTc3dmdHU0WDRLN3pFb3hBa1dzZ2F6ZXl1TzFxa3BjdFNsK0FUTHNRakRpWmRJRnptZW5tTk14UmFKaFBpMmtndGxvSjFXc3krdDh1b2IvNDlmVVVXUi9sZ3FSSStkRlpTNEVxdnppQVpueWZiVlU5VlhyNkxXVU9wY3R3ZXl0K0Fsd3ZsS1phVTY2Q1RRWm1ZRDhNTmJtOWpTVnVaVWRiKzFnV1hlS1ZmRHRqS0dDSUxFajNBcVlYMDM0ZktlSElLQ04wcTA4d1ZmOGR0OGNOcDNhL3NwanR3cUxaM3U4WWJBbWNOZ1hoaEhwT3NNbFh3REowWUhxSFliLy9VQ0ZQWmJIYS95OEZyRnoyWWNPRHU5c2hXc0VUQ2RxTnE2bHYzZXgvdmRReDZPNGlOZVNocU8rNjd2ODMrYVo4OEdZNXpVcHpwQXlxKzZZV0hyaTRhdkNsV3NlMlJvUkk5UnJRaWlHM1I3UllueE85OXVxMjIyQS9KMG5vZ0k0Sk5vTHphOGxIUE1ndU1WRWdUb0t5OVB4cXI5Mjg3YVVYRC95UGJYUlBUeEdjQjZqRE50L3JyVitoU2t3MklXMWJUelhsaTlOblR0ODBLQzh1cGRUaGI0emdKaDBJa2FVcXY0WUZRVnBJY1h1bjZ4dHc3T01UOTR2TWE1alRYTTZneFBKYXJSdVBIWHBucS9wRjNzcUNwYS8zbytOaEd2Z1lVVVBtcW9jNDdCYjJoNXhmL3UzYi9DYWYzRFBxZDVhaTBCQzdoUENWRXZCaGM0c2NyVmc1SjRXaUduUjhHVWNoN0RTTUZrR2ZwTXcyOVcvbzBhMzNOdjlacThYbmR0bWsrWEVvOXliT0hvZ0I5ZHdHN212bWlReHJKUk52ODlndmNqZ095eEdmdGRPUEJ6Mmo1MWM4TkJQSXJtam5URE9XcHZHbXg5RWZZZFFrc2Q2RUZHSEFKWm1VdHkvbEVOVENjcUlYZEEyY24va0dBZkdTYk8wSHJGZnU2R3pXS1oxRHhOOTJxV0ExODVqZy90d0RvRE9reGNBRGJkbVA4dFh0eEFyR1lkV1NpYnd0YWRGRERwM1VkeDhmc2k1aS9oaDRtdjd6dUR5NmI4L2Q4NmxpbDliOHhUSmpoWWtPR2c0Y0tYUHVzdDhmVVhhWmpudU9xVC8rcXM3SkNMdm5mN2FWd0lIcHlENkpVZytCZ3JqUlV5TTUzMXYvMlFBQkFCb0FRQUFCTVFCQUFBOEJDVEVDQUFBQUFBRDhBYzVBQUFJQUNRSUJBUW9DQUFNQUdWUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZzVLUT09PC9CREI+CiAgICA8L0JJUj4KICAgIDxCSVI+CiAgICAgICAgPFZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU+CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU+CiAgICAgICAgICAgIDxTdWJ0eXBlPkxlZnQgTWlkZGxlRmluZ2VyPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw+UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U+RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0+CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjY0PC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFYNUVBQUVCQVFBQmZqUUg1Z3djREI0UUFQRUFBQUFBQUFFNUFFQUFEd0lBUUFJQVFBSUlBQUVCOUFIMEFmUUI5QWdGSFFFZkFiSUFBWDNEQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJzZ0FBQVI4QUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRWZBQUFCc2dBQUFBQUFBQUFBQUFBQkh3QUFBYklBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFGOHl3QUIvNVBmR3dBVGZON1VUZWdzTForL0RQakRqTXp0bGtmeWtvT1Zza09PNnFhR1JlSWpaZDFJc2xJZ0s5RENqTzVpQUFlRzg3MkE1SUE2RVJkLzdTcEdmaW1BZ05TQUFaZC9qOW1pekJDaDRnQjVEMVoyQ3VheEtzemJZdFdXRGx0amJ6aXFNOC84Q0lBOW4zVXBSb0hKYWg3eEYyUTlJQWYwdGV3RlV2dVdQQVNGODd2QU13TVJhZWgveFVSbGdFT1NvWWhacGtNaklqMWkxbFNLVTNZYzFEUHcwT1BFcGRoTVU5Z2Y5UzE2V29HeVk2aUE3ZHhnTjlEVHdRMzRQd25yUmh0SXNVNklJVVB5aUEybEdtR0E4VjFIbElEczJrWmJhZklnVDJqTUhTQmp6M01Tdm14cVIxMW55ZUE4SkhrZy8wSXZhMWZMTWFzak5KQm1mWEwrTURlSWxWZjFOc3JTck5BMnJzdE5teHRMWlVaNUkwSmFaYXFsRTMwVnNlV1ppekd5ZDM2Z3NnQThMUFFKSFhmWWRxMUR4VDFDeEtON3g0L0RnQ1VvQzZ0amlDelRTWmoyTXFVc0lkZjc2TDM0dmRMWWlDODN2elA4Wm44WnA4aDQyVTZWOHFxQVFRV3FaZWgvS2wySzhVNlhKYnltc05yQnJVZFJ6Y2xKc1kwbWJqekhBU3dheC9adGlJVG54MmJpSHM2NzRUc0NseGlhWlBZVUtzZk5HNDhqdW5zeFNWeWlmTWFNV3BOQUpVWS9MK3NXeXJ4NjZ0U3VlM2dDNnRMbFBKRzJ4UkxsdWl1OThYWHZOV1owVmZPekFXZXhoLzhBbjEzNkhUZHZlSklDbGNYY0EycHdEOUE4bld4Rk1McmlGeWlDRE9lQlNJUE9pN2RuVlpOQnYwNTdqNENtU09BK0pmdTlBUXBQZk03VDY1RnZBS0w0ZzRHYUMvNG5uYUwrcTNISmxDQjFMaFlzVFVtZTdUTEFVN3gyZm05ZGhtaXFzcjVtdHZscjJMNkpKaldmMGNrR1ZYTWhlODJER010U240NG9jdUcvZWZBa25hUHJ1OUJ6bUR4MXkyVE5abDVFcVZQYUwvbHZHaGRwWW5RenExYXRHSnB6cHFSSHQwUldoZjlWTnhqVUNXZXpBK285enNLNVUxcGRUSzYwcjNJL0ttdkM4djhIZU9oSmhQQlVYWUZFa21SdVRKNHZsUmdwY3JMSFZsM0N4czdjTWRlZy9nZXpqaFJjVmZPZGx6UFd0Vm1ZaW9KZVFSbzRQOTBCSHpORG9MTmhwVW5XQytuVWpENmFTTjFUcC9pVHBoSmVCNWpidHY4SERWMnVFbXlnSjJHVHo5RWVlWG82dnFGUjR0UEpjbThQMlQ3ZzJ0bDZMdWNRVUlwV0xOY29URmpuWGRyUmxuYk81aTZsTVMxVUs3eURicDZNREt6ZkpHZHdYYkdWdUpkYVUvOWViSUt6Qkh5Z3pVVTVqbjB6MGwyVHpzckljMnQxdUxxOXQ4UTBCQkJzNmMzazNuczdqRnVCQkxpakwzL2FpVlAxNU52WFUxaDQ1eVlJNUkxS05yUTNtUTFIckorZTZPNUZJOHEyUW1uVFFnUUtGVnk1NzRGTVVYbHo1V2dZMEJRUFRjVG4xaHliWTZXRGFYNTFrbmZqK3hNQzJrOVNTdFZCRmlHM0NzVStPeVpyVFVGT1JpaUczbDI1eE54d1JyRGhqWEZ5VnE2T2x6eGRrdDNYZTAzc0ZkNGQvdUg5aFZWTzg2UGNXdkwyQTduaVRnQy94U0tndUFETmtveW02dTZvYTZyY09KUWVRSG10VWs5TTcxamxTY0JhalhpQXJNUUNrMzQ0ckN1bG9Uejg2TmZPaVAwcXFGRkI3bkY1bS80M00xZWdvR1JzdFBWMFV4WndSVEp6elNSVS8xTmJoUkE4N0Q1Q3BrQlluL2xHalR5OXNPRG5vdFJGV3ZNL1k0OEgrU05UdXQ4UVA0YnM0N1dnb3dJL1EvVEd3UHJGanprSlpPYkY2QWRCQUgzc0xFdGZ0MHlqMDVPazFHemQxZDdKeTRHYXlDK3VIc25LRWJzUVJaMklvR0Q2MVgwamljUE92ZHRiSHNEeGNJVHJoQTZBTXNId0tFVnBXb3FVRmtrOTlvZmhhbm9hd2JKQVV6Y085MTlkKys3YkxUVEdEQjZqbmhKNDFYTzMwYzc3dWZRNzZSNlAwR1JLN2kzM3JBKzY3VUNYN25VWjhKN0VBem1PNnd0T2JRcDd0R1JXY3BHeGNCKzZWRHRlRit0eE9GZGlXaDFCcDhWRFM0SmVRaDNxcG5raVNSdWcyUTNBTUhOR21iTXgxdEdSUUVRaFJWS280dlYvWFJwN1JRVUJmd09CRkdMdTZaOVh3MG9SMmlrYUJVQ05RTnpNaHNOcFl2dlZkci9BblFsVjloRzdoNjJETUJFTGFNMTdiNVlLckFCTFVGL0NTMW1FMHJONjczMksvekJ1M1Foazg1UVM1Vk1hL0pJK21TbzJjM2RTbjc5NStjS1lWdDNBYjUzMjdrdVArbVk0WjB0c3lDZDBEZjdiUGdxdCtJQ2x0SDV0bmpSRzNJSnBzTitaeGh1OWFoUnF6OWlMZlMxMWhXN05ONkZoRDVacWkvYVZ3MUhDOWFhNXEza1Z6UHlmMGZhdEk3MU5lVXdWMitnL1ZpNlhYRmZpbmh6b3BmNUhuK281MDBFZ2hXcFR2T3o4eEdLdXUvS2ozL1FPQ1Q1RW1sSzJ6V0p6MFduNEhvTCtwTU1xbXg4emh4b0ZycU9JVEFkVGRnejlGbTJlcXRJZjV0TUN3L1dGMHpqUzBwak1xbElKZTdsVkF2ZjZrNS90SDArWlBGbjZJMm9NQVErak14ZEYrYUNYcTFYYTBjc2ZHQnh5UzNIYnVjTXpsQWZFK0JXVG56Mnh4bFlUdHdvVnRxeEFveFVBcVlUUlp0Qk1JWlNTbVhNN21vVk9VaGlFMlhtV05MNlpCR2w4UElHb0wydm56N0YrSG9qQXczYk5UUTY1c0psazdWZUI4c2RJSjc2VVFqanppMlJjc080S1gzUzM2TG52Sis5SWh1QUQzSnFtS3JEdUlNOWFGUTVmYXVkMEpXMjFuOHdZYjNVSnJIUHc1djAyVGsyUmFZL3NsZmcvOS9VM01PRWN3aXZmR2NucWowczNiZ1FOczRKR0JmdVk0R0p2WWpLWHVxbDh6OXZ3SVNOMDZzQkk0WDFoSlUzUWhuNXJoTlE5UVozVTlDeXdOU2dGYmVFcXZEVTJzOEFPVWdsMjFScm05SEY3TzJ4ODVhbFZyRUE2VnRVZmN1TWhZdmljQU0vMVNwc3B1L2tUazRXc0JvekVSSVZxL09Ta0lSWUVoR01TVUlpd3FncHk5ZldHL0hPV0NObnlra1U4TXFFUWdieHBxV211QTJ1TUEwYkFtTU04S0ZDNmp5Q2VlcG5QZ04zcGNOSkNvbi9rT0Z0T3FUSUZuSjVBM0FnNHBqSzRMZFRkQzdFODd5UmhvNHpRaFJqNWdiZzhPM1o3UVkyeS96MWVGVmU0NmFoVU1WcTdpYmZsWmh4NnBPNjdWd1lPNHgzUEg5bFdUL05MOVZsTlM4Qno4M2JHWE9sVlpibzNrK0E0Rklxenc3aUExamh2RWo0YTNGc0JVQWdoTTg5M2RzMk0vMXpENWorY1NHeHNvZHprSkIxWXU1cW1ydGJ5TGEreE13V3VVQUE1QzV5dTdTRHVSWDV1c1AxZTk2S1UvanpOMEZhM2pEakxyUXlYdWRNRDNHa3ptZGVIaG53VnYxMjVPU0R4M1VmVTVRTFlVemd0VlFybDFaS2ptdHNuVmp2WXdkV2t1bHFJZFlUWWRVZThiZ0h3VU04RDIyVG0rbkx5M0NvUU0yWkYrYjU5YTN5SFc1Wmxab0p3SVhyWHJhSG02R0FFMENnQWlDTlRKVmpMUiswODlocXkzQ3NEeFlrK0dLZ3NJNU4yeThzTEF0YW5lemdSQ3FhaXhKTjkzZDJZYm1OMFFtRENhUGlsb1hxRGJjYmhzTXczNVJHcHNRTjZJd3VjRHIvTFpOMm4yNjJya21tWFlqMTQzUFZwaUFsUisrandNUkdlTHIxdEl4T0ViY3JHLzNvUlFsREhwcEpoN1VrNXFXVE1CeERnak9nUVUwWTBPVDhnbk5ianhOdTkyUGZNZEVPa2VNUitodEVrN05ORUttL21tYy9tZ0dSRXRwWlQ1bEtQU0JDbkIxK0pDTks5dko4cmpKTkxsTm5ibXcvMGVMbHE1SW1hT21LQlI0SnMvUk1RME9malRqenoxMncvT25ZajJGVklsWW9seFJyaDUzL2o0SGdBQ0hjL1ZCT2tUem5rcU9uY3A5bGU5NzFPRzJlci9renBLWml5N2lidkpncmh4VVNsRWpGTmg0ak51YTF3RnZrdlZHQU9Ja29aN2ZNYzlkRVdpenR1TkQybVhudFVnUW9JSU1GcmZ3eGQ2RDFWS05aMDltNTRBR0RpWklXYWdGN1dJSkNSM0QzaHB2MEJKek9xL3Q4a1RvZjNJeHhJdWtZajVQMkxyWG9NTTJRb2xrL1NJeGpjSW1EZGZncUdkMEIrcjI5U2NPOGpxVUR3VGlyVUJKamVPWUtUMzRyTkF4K1FDaGYvQVZ4cXNSakk0cUFtYkJpWWQ5OWJpVlNwNmJQSE9EQlFSeUtjM2pCNkRvY015TUN3ZjFndmh1SlZ3bXhzcEc2VWxDNzVTQU5Tak1qWGZLS2huNGdvRzRIQnNrbG80RXJJMGJPdnBIOFFyMFh6d3lmWHhORzBPdENxTGNxZUplQndlZ2laTU9mL1Q2eGZzU0VpRUlld3RYTFkycmlkUnJVOU5UUWNoaEsxdzRKZ2JkZTVSQnp2WWw3aFhQVFowR3JKRmFtMmFVaUVjZFJMc0VpSkRIU05YMWc1STNEUjljYzB2K3BibHBVbjgwekg1S0h4OGxvRENyMEk1UnYwL3BoQzhQOHRhUVpQTk50d1I3ai9MTVh0YXd2VU0xQ1VQbnBacDM0WldJeFJGZnFzV1J4TkRjTGZxRGZ1YklZNXZSWmRjV3kvYUJ6Rndla2hJTVJ1RUQ4L1hFWjB2ZzNaNVJScXRpNzF4b3E3VU5NS1g4MHl4OG94dGs1M1VjdXJJcElWbTNaRzQrb2hSeWQ3WGpSZU0xMFpzTHRFd2ZjYkZ2NGZmOVpmSUs0cnBFMHZMdFN0VE9GNHF6YWVjcG9QNmJMK0ZPR2JrSm9GMnJsWDFwNWwzL0pSV1o0SEdmTzV2VE9RTkNvZUt6ci9MdlluNnlHWUI0endObS82U2tUM2VBVDhEdXNYL1RlZmF5bEpNcFdMR0kxMlJFZWw0dkhtOTgzYlVudFFaMGZDdGp6YTZ3QVN4ZEFhdHJFVXUrSldKdk1pTkNZNXZPUWZLMUorb1lGV0RTMXNlVEw2ckhva2p4RWpqcit4Zi9QQy8wL0E0OTN2TEJxWTFlbmVvaVZrUFNjaHNRN1pCN3h4Y01LQURGZjFBWlFpaTkxaXJnWmdseDgwazdkOCtQbjM5cWFhUGxCM3JZZWtiNGNUOVFicnNJc2pVeGxydkFkNDMwYWRkc245b01RZHlCdUhJSENCZkxwbld3STdBTDFwcWVSbFVPV05xbk5CakpnUTFYbVlGdEhVUU8yc2JqK2RWWUcwSTZOelZFdlR1cDJqRVlZTG9nQkhlS3ZWeVhJWjM4ZnB5REVmVEVuVmw5VzhFMzRBUXBHOWlzVDFSR05IYzZVVDBWd29Nb2tlakp6dkJLNGpIK0ZjQmdCU3JsZkpKekdjTU9MQkJZaDJSWkdHMEduRWNwTXVHTERualorMEhUbXhORG9WQW5hN0pWWDdzMjZDUUw2RTk4MFAyS2hNSGhDOXkxOTdQY21KVUJlUFhncWFRdDZMVVlpVDRkOE5jc2dkT2tuZDhHcC9JWDFidEc2L2xIVldNTCtwaEJNTnFWNjdIVUZUUUZZTUFrbHluUVROajgzeHU5NkI1VHh3cVNXOE1jS1BRb3lrWjRKVVZIdXNWRTJlcDFNa3hCVWFlM0h5YkNXb2RlaWtDZXpIa1A2VUYvcDF1NHd1WklOT0JValEyWkUvOGhTS3BVRllRZFlLYmE1MEVvaVcrWFpxSVhvWXFmd3JNS0RuWDhtWTV6eWlWV3dOa2lIb215U2NGU3ovSUNUV0cya2ZTbWdXSk4vb0hjdFhiMkdwQUdLdVM1Y0R1ME9zVzFSRlZKbHZVZ1lEZkhESzNCVDFwcXJNWFhjNjkwUEFHVXB1U2JyWWdlcm5DcndBUlVTMnFQYW9vTWtpL1dIaTVWVHdPaW5QQ3MvSk5pYlZjVDNyTDhOSjBSV25mbjJiTkROWE91S0pkSDhicGFUT09WcDlVbGdTY2I1TWN0Ly9BZ3dVdUlWWWVCKzBzSVh5N3htTktSNUpEcllsVHJoZ051T0JZOWk0OTZ6Wi80VkY5TDZRSVcrM0tjOXdWVi8raUtiSFcrNzBqdkR3VE54cmUxazJtb3dEdU5vc0ttUUpBSFlDZC9aUHhCYnhhOXZrOFdueFpPUCtCa2F0SXl4bTFFdUVwVW5UbnExRWlqUW02aHdVckhGSjZoZi9GOXRITDY3bWdwWVd0dXNyZTc0Q2hSaUUwdjBLWWZTcFI5UlgwSDA4dUtvZzI3VXdBSFEwYitCNFNYaUQ5ZDNveVp3Z3RTNlhKUHNScUhVNTRQY2xMbnJSRU9BUEJpbDVEZVZNU1Z2bUllWEdPUWRqVUxnUzJzWFJmSW9YNThFc0g1cUk3OElqVWNib2FyTVRnUEkxYWZ3dzdvTUh4MHFMWmZseXZzYU5STFVhb3cwY2NtKzlWaDJvMVJmS0RxUzlXdG1VS1hLSjNMMTcveXNzSmd6UCt5NEQ4OW9ZK2psbmJQS2hJb3Vlakoxb1NlS2hvYWJCWHlBSWVmWmQ5ZzFFTGpjcUdlNEN6WjBKSTJaYktSTTJDdG5RQ0Z4RmorY3pUVEw4UHBjeWtGQTFKZ0l3NnB3QVRzbi9lVUJ0K3FHWjJWeXJBZHhRems2SFlDVFEwODVPQkcvbmhmZzlUcU90U2NQRmVkUEJTV3MvNE05bVBkcmVFcjdFZ2M2SCswamNQUEQ0SXJTRE03djhYZTc3RVZWWncyaHJnMm5FUWJtaW9nbGFtUGdPTllpMFltU2UvbmR0T0RMQ01nZjF3TTZuNVNzUkQzZmhORVhYYTRaNllkMC90VmFtYTNvWk9PWWZkcDZRT012K2MxYVlsRzNtT0I0dkY2Uzh2RXE0UEFoNUtWWm44MmlzWXBEZkVnZzBkMG1iQllIa3FXbmhha3FVL0ZNN2tWaVhMdUJ4UjI4a0hwY1EwQWVUVlMwUk0rQ2lleHlnd0lPczErVUJrQWw4dDd0Y3dXb1FVK0trWTJtVkxBRDNrM0xLNXliMHc3bDFmRjZ0alM1Sm9XQlJQMlY0c293b01ZdzQ5QXdsTXNpY3FBZVZtUis3Wmc2NDZ0V0lhNmFwS3NXUDRSeFZnWklRMHpJRUgrYlZlZU9nTzEzSk1KUTVqT2lNMjRReU1aTzNlc2lVZmp1eTF4WXBzbFVpVnZ0cXp1MEVwMXFrMHdpNDZJOUxqTkFxbDgyTlMzMGUrTGhNYzl4SjdzdnBFVzY5MmFHUVRWUyt2Tm5sMHczSG85ckpzbVFPOEUzeGt2c0NIQnE0Mzh1cUo4Q1lWZnJEQm1zRStMbkZzd0NMQkhJTWswWXpGbG9wMW5tNC9SeS91OEJMaTlvd2tVT1BXS3dMUXNLZkpUODBRNEtQYnFvVnhBekpnd21rc1FxVnJiRzVnVmJIQlVlVjdNSDVUdHdsZmtYUlYrZWtmczJuSzhpeS9ISktGaTI4Y2xPZktjYUZLU1ZEQTBnbXl1Sk9zS1VQcHZDUnF2TUREZmRzeUF6dlIrVjIrd21VYlpEWkdpb2x6UlFZVnZNYkt2dnp4OVdTSTRjLzBObEFSdnFOZ0NNQnV2OXJlRDB5amx3RzAwMENwcmpXbXM5bXNtLzhHL2t5Y2NoSkE1enVsdTRjOU5VcXBtU09aOGtVMWJ4Z2pMRzl3OUtBYitRLzJZbkwzdWF0bTNNR1VWNWdnVWNRblVpQ3lGeUtkTjZleHhhdzltU1phTFdnam03ajQvZ0RZUU11UHNpL0VWQWc3M2tTcGxqSEFuL0FBS3hIcWVmb2pHN3orYTRzanlmRVo5a3A1cWdXQmtiek1BRmFXR29ZV3EwL0xqNjRNYU5rYWw1T0MrMXRmbHgvTzJHMFJvaEdqQnJ5NVVYUFdmTEhJc3ZuRXY2MStnWm5JbHN3dURSK2tpaTB2dkZuQS93UEJxbjJ6S0ZPazVmN1dNbjN5VnJROHFlY0huRUIvWUE1bFdZWnpNc3dsUzJzU2M4Z2d2ekNYc3NQOGtHcWozSzhCdmFCNWx1amJNN2hTeVhDbW85WmpHRnczWjJZZGNycGNEUTJVQURMamU0MDI4M0pRQUM1d2o3eXR2Y2QxK2RhcUxncUJhSm01bkpoM280d2lqL1p6cDBnYldjWjZiT1R0RHVyVkJKSmRubjBTQ2tQOW81YVc2ZzNlTlVzNzVzdFJ0aDBwOSttMnhZNE1Kc00wV3BJbmpaZXNzVGFVdU81c1dQaTdpRTVvc3Jzcmt2NHZqdjMvdW9ndVA0VFhsQTZrbE8ybzB2NVQ4MDVCQVVkYjdPVklNaDRrNUVXWklKMFNaTjk0NVJHVU5UeWFaS1FBY21EcDRUK0hNd1RaeXBlN0ZTUmkzTVIwNTJ0azVWRlFuVnUwdXJYalVuTC9kTEJZaHZkMkt5RW12Y0Z6ZUIrWW1SYlJ4ejIwZjNwOTFBUmw0eUJBQjBkZ0hHcjBZRDFNQy9PbWFqWnp5WjEzU01JNFRuK1YxMzZjbWJac25MTXpHNlgwVk1KSjVMdkNxaHNWVkl2eDR0R0pIeklONG5xdk8wUVRGd25xR1FNQnY5UWVqeVFHMy91TUZiOUl4ZVp5Y0Zab0J2SCtHZTFsejRnV1ZSVDNXalRVY2ppOCtYZ3VFY0h2ckx1VFc1YzlPODlEUkxlSitJaElMQmt2dE5TclE3bnpHWVdVWXdMTTNnZlhqSkdRUVRWb2VIc3F3bUJTUEtjaSt5RE9Kc1Q5aEtQMUhWZkFTcHhmVnR4dUlqbFNxZDdFK2x1R2thc3RxeE0zcHRqWmZ6aC9wSCsyRWlQOHlHS0lnbzA3K1RReEgzdHRtTUFWYUV4N0FVT1UwQXp1M2tpS1UveXh2b0Z4NXFUU3lNOWF5OFRscS9FdE5idU1lQ3M4aDFRb05rZW50RXF3YmM5dk42Tld6dUxyeEZENHYzZmluWDFtNTl6bzJOaTZ1cHBnOEpwcjY2UmMvNDlVUlJQUmpNaWZWVXlpaVo2Wkw3RElacVdYYk5pK2RoV20yVTlkY2cwcndRSnZqb3duL1hOaFE0dkNJZGt3aHVOSWpJUUVmVmlwSkNnU3dMc1N0d0RKdUJvTllvUE1ERFozSnIrc3Q1RC9PRmRTYXZnc0pKUlE0QURDdkx6V1FXMkVwOXVGMHBZamh2ckxHcWFYdHh2OTZZQllSWEZqc01ocWFXWk1VZEJUU1p2Y1dYdDQ0UjlFdnZjYThDQ21yME1STUxrbVpwazJRYWRuTjVlSTNOKzRRNE9HODAxSWZJbXFiNzFjZzFYcEtFdXR5Y1prVWJLU1ZNNk96RTBpK3BRTDBtajhGcUdIMHV6RW1oaU9FYXh4TWJlR1poRXdxYVlxdytYeVQvWWg1dThXblFWV3Z0TDRrNDdnb1ZLUTZIUVBvNGM0aWx5ejU0MHBRZCtYb3FwN0NFTHdQTVc3Ny9MUHUxaEYzYWYxaFN2MllIOVZBRDEvdnlISWUvT24yZnMwdDk5R1JUdklka3NxNFF1NzV4LzJsbDY2L2lZaGFNNEFkaE9DdC9QNGIwUHREbDF3dHY4ZzgvVVBsT3dQRm00U0pJc1NOUzVtWUI4RzM1VzZrZ0wrcFM5WGFNVUNVY1VFN1RwU0dwWGZMcnNhQ2xkRy9mUDlYakVCRE51M3dFQnZvQnllVDdhemhzUCtvcW14V2dGWWtIWWtLbUZNNG45TmR5UFV1WDN3VkFtcGcwSmFaczZVeDhxYjg5SjZrRDVzS0tKT245dFExRXBHakpIMVRKTlpTb0dQelhKZExuRUZTR2NTRG5WTnB1eThmUTJnUVFseFBjc2NiajhWbDU1emtIWlllUHdWTjA1WnQ5SkFVcWtYdXZySHN6d01kWjFib002U1MrZGsxd2tvUG1xbTNvUk50WXZTV29STmNhQzBCSzZidENqYmtZSkYvd1UydFZadGQ4NnU2SGRGZ1lrSzAwNHZBMUlkRW0zMTlHMjVkb1Erayt6RFo4WWZNbStyam1IREs2MUh6VFNneDNTNkdrakxZL1lhU1JQbDNjMVVEUjM4Vm9KMUJOd3NJZWEyRGJ1WjRWd1YzNjQvc3d2L0N6dXVFQ3pMMExucnVzOWxmcGZ4VlJ3VDJoQmwwRUdWZVNJREp1YlZEYkIrUHBjY2xqYlFSOHFYemFmdGVlZG5SbUhJSDZqcnpWSVNDdEkzNFJUOEllbUxWRFVFV2prZXBRQmNzVVNRN3lnVHBNS1dzbWNkbVBydjNvak9MZWY2Uit0SHFwVFNvU3VqRFRIZ3EyQ3BZY04wS1ZFUDdIdGFOMjI3Y1hJNHNWUFZRM2JhLzg1YmtRT2Nucm1HQjdMM3VxVjRZeDVyZDdOTUtEcm93TWdMTDZSU1VOYTFiSmsxU2kvMnBRc0dNOXVrMkNTbWZla0xIVGFBWTNJaFUrV2RQUm9QYTlqNS85eUxXdEpBQy9SMVNzUzN5K0EvZXh6UUJCaWhIMUc2Zkwza092TnA0UWJuRzZROFdiL0NHK2NSNTFnREthNVVXbnZTbjc4OUVCVERFQlBMa01BOEd4MVY2UWpjZklESmRSZnlUR3dIMXQ0NXFBRTRJZ085MER0bTdxK3BGUDNvazhiR003MkNtS0ttcVF5emhFdXV5YnZ5NDFiVVUvS3VkYjB3c0RBbm0zQXZlNFJDVUpiK3o0cTJFaVErSzMxdGdMT01SQWpsaEJURzAvYlF4eEJ0M2t1ZnQwSUFabnpTZEZzVU9NcXRmRkROSXZrVDc3ZGlVWnNKallYQlR6MWh2czNxeitCbDFwZUdOckR0SHZsL0grNStHaEdJMUd0OGJlNDhOWkFhSit3b1JXcE9FQllBVmtJK25YRExVUGpTVUkvc2s2VVM4TklmcS9iTlN2SmIxSGRYSHFvSmtDUXptcGc0MHF4dG9ET3RIelVoZG40QzVsVDQrMEZIZ3NUNGlNVUhSOFZFZENwRVNtSHlhSHdCR1pNUjRQYkVYTXVac24yTkEycFZHLzRHYmZMdzg4ZE0wQlhNQm11U0NjM3JpOUdJL3p0MEpqbkRVSDJscDlGSnFzNWVmblBqdk80WEJvRkRiMi9IT0J2R0QwWS93U0VXcno2L2xwbzZzczNRQkc1ckJWYWJnNXdMVzh5WktaYXlwZUxaK3VuR1VZVU9YRDFQWWpENXdVMk55dVM3bFRqd092b0NUOHBFOGZuVFc4VW8wUE5mRFBvU3kwQVJpWmpPVi8zN1BDNitrWG4wbzFtM1RtWUZPV2ZXYzROWUQzc3lvMVlrazU4SSt5S002TFVVRHIycmJwRE9NWElZK1NQR0JMMGVxbWIraVNqYTNwQWhXMG1icll1ZlN5Y0NWdnM1V0VqQlNRQTEvTEY3ampTUmFmQ0tiTkVpOHNyWFgzQ1VSS0lxeUhtSWptb3Mwdk8rY0licUNvTFFjKzlYMUZsZHpXQ0lJVGFZSEtaQ3hBdEV2b01OdWQrZmJzR0kramgySDY5MFNneVlkcWdJQU5HT2dxRXB0Z3V6cDNxUWJrK3paWnRTTjlVU2x1V0hUNzg3QUZEU0dXNzRyZ2NHWGlQcWI4bWdQVjlKaUttVndwKzJaWnhBZm5EbFhPNUpFRDVkYUs2WmxBVnNpVXZzaE05eDdCZ3RzZ1JGUlFVN1hrc2Nadlk3dDFvQ0RJK1NHNEpPUnpRdzZxWWhFMkI0ZXoyT1FaQ1lBMGdGczZLOEU2M1QzQWdveDN4V2k1cmJ0NlBRd2tpZEUzY0s5cjV5YmpHSnVxM01Tb2hOZWVqMlVtNWJHRmkvUW9wSDRKV21Vemk4OEFkUkl4aURLMmp5RisyNlJGZWhLNXZSNEZWbUhrbHhzR3ZURmR0WEFNU085b0tpbzBSYWVWYytaa1pmRmdDelN6dDBxNTNVQ0hPRjljWlVNdTQrckhZc1l1NEZTUDdrbitqYmF5ZzhzS3RMQnloa28wa3Y2cHhJZ2pEN1V0Z3NFT0sxVy9HV1lwbVRKeHRpa3JJbGtLUTRTSjlzbWhxMjZESXNLZjRzWkd4L2ZGMEhReUZ4TG1nb0M2Q2NycGpwZTNPMldZbk83WkZCdll1T3hRUTdkNTYrNkxCc0FtYnZWck1CamxQaWFSMERsclU5MUw2UnYwZUNqUGNtMEp2ZTl0dFVuMUdoTU14Q2VwRXJyZjN6d0gvWWRVV25HRUtCN0l1Um0yZklHVExJRG1KNjcxc2NPbkd3V2RnL3dpUlFIYkdYWkluMk96RmI5TG8rbmxHRFZaYXg4MTM4bW5MaXRHY1l3TnlWR2JzTm50b21FVFI2a1lOWHZ5cEFBaHdjU2FUNkZEWVBCTlcrMXZGRDlLbXloMktGV3A3YVJYcTV3VmhmUEdKZkZNRFo3S2hPOWNtQndwZ2w3SnpHb3Rkb0hwQnY3Z3NESUk0UjE2d3lSQzhURFk0ZTFjN1lMRi9FcWZGZk40RG1aRjAvM0hQcUQ2SnNLY3BDVmEwTUNWSHZ3eGRhUDBKaGdZYVI1RGxDQm5lenFlc0tYVzFHd3VycVQ3a2hmcHJ3NUQxMldqbW9FRklmM255d2o4Nm8yNUw2R1ZlQnQ0QUVBVk15d1k2ajNZME81NG5ISk01RmJoY3NBVXBKUkdUVThKRGIvaU1yVDFWKzg4S2s4NXg1amlTMU5qOUdpaVIzTTdBMzNuNG5VRkl2akpCMURYY3ozZHNwbTNsdXVVWjlsNVNiNGxhT2w2RXpUUElubHBiUWtZVm9UcnJUY1lyVmtpOGRVamV0R2ttYUludVRtRmR4eVQwaFZrNWY5bzRvWS84eGVlNlBEakQvUWhqeGNQQlUrY0ppMWNoZmtCaGNqYkRkQjJmd3AvUVdjVk4wNy9tdFZGWEhyK0tzUVNyVmM0ZFhOOXpSMitOZkZjK2xnTEluTW00VkdyejFvZUlmTFpXZ1VnSVI4TkF6YTVYWlBWNDQvTjNCd2dlSTNtMFBRVURicWxtSFl6ZTA5SVlURG5UVTZmQzVtd0hzRyszNi9SKzdnRkQ0dEo2ZjF0YmF3T1NSUWJQbFl3amVCSnYxVHdvOFdrT0tHODRnRjFrRTloeThraDd0NFNaYlViWkZmTG5jNjYwdGd1NTQyczNseGJaOUt6eUFsc1dPMzhrOVQzNHFrRDlXcEFxYU5KYWRibU96czNJYUFKYUJQYk16a05Gb0RibjQ2NmdUMVllZEdMcStXTy9BVU9UeTlDTmhOaUUrbUp4MkljT29FQmdjTWlkRkh3UjZvY0NGdDdvazlxRXZmSTBSRTdWbjVxRFhxbnFocUkvcXhWOG1KVUtBTVBvM0VEbTB1QnJYaXFsMFF6MWNpbjNJdzU4UVlrVlc2ZEsyUjgyK3J0U3UvT3NZRnNRM2w3ZkpQQVpBWm5yUjRUbGNrNzFzVWo1VXZEMGtJNDNRNFc1bVJURDJna2kyL3FuaElDQWdJRG0rclFBNUxGVVhzNXY2R0lNeTROYzAyZ0lEVlA4TEJKVE03M1lDMk8zUnNETzIxbFg4bzUrZ0tYUlMxU1J6SG1SREVMaG0ra3cvZkw4K3BpVW8yUEhQN2RaU3RQbldSbTBxSG1BSEZSRDZpWlNCRFBIeXQ3K0lZcVBoKzlyWkF0aUhlOVlidEhEdURNcHB1YWMxUkxBa25vYzEwTE1ZVzdlMG9NT045YlVXOVJtQ3NwU1dZckIvSDFBTUFQMExOK2h5ZDB4NDA5andlVlNFNDVMT0U4ZUJ4NnV6eXM5SVVTeDdkRVlLZE5kZWZqbEdicVdidjI5UkxmbnJNUHFyM1NmaURIQXJkTTVScHVnK04raVVpeVQ3VGpoUFV1Y1hsRmFRRE5kcHFCdkNRcXJsNHg2WGhwNzlrVkpYeXNBSGdxdGljNjhhYXFneEl4M3BDWkpVV1NVOGJCQUwyVFlEZ1IvM3BIYllIQXRTaHZGSEtWYXc1U3RTaDdMblhjTWVZZkIyYkVoSHJOckFYWEdxbzk1UGdDdER5UzdaWlo0TVNpeWlPVHdrOHFJTXUzQ1dtMGNpRmxLSisvSXlYZHJ3Q0MzTjBDeUZTVTlBdXBpaUZ6QzdIWUI4dTBUbC9pVFoyZ1pKc0JZNEtrZitiRkhHTVdSWCs5Mzg2UUF6WWdqNmhLVXkrM1FnUFlDZFlHd1QycEE4c0t4cHJyTFJWMmxrQmhZcEgvbUw3bWt4L1dvYStMcHF4enMrbDE5SCs3M0VVeGVwY0pXTUJMRFVlVHFnUzhjTkIrS1hxNzViMDZvb05ldTE0THp4d29hWVhxQzlrTWZVMTBLL01YZWJIeFczUVo3UTFtSnhuazBsamlRUWhGOG92dnZJRGpLU3lGUWVCUHRBNUQrN2pGZUpCTVI4NnM1SkQ5c2swY1RUczZPcjI4Sm5DSXhjNUU4RHQ1d0J6RkprUzBCQWY5RXNxZ3JyMmFPeFhWa01KaW5JVEQ3bjRibFRreWRwdHdFSDZvTTJYcWRjNHMweFB3RVc2eWlaTitSMkZFZ0tQaC9oOE84OS9pSkVxYUZXWFM1ay81ZlIxcUM1b2drSGYxTDQyOVVTS1RsbzFIRDl6bkZ0OXBVSHVsbWw3eE9WLzZFaG5ReU5iWkZLU2JGSXdiOUdTU29IODJYbExXUVlTMG9WNXpuRkN2ZmZteklPQVdhdXdocms5NHIxMDR0UXdxeGx3QzFvMGpLZjJ1NWR6TWpsU3ZYd0FZUEdTNHJSTXJMWms5elVNeWhNcEkvMlJTZW51SlZrWk9XekoySTNralFTTVhqbmdVRE5sRk9xbHBzOTRaT3krTWs3OEFUTWplUjdzeUJqelBuNzFUOHAzMnlrUG5rT0JjeTYrTDBrc2xPOE9VaW5jajI5ckJhRmplVmszVlBGL3I4T3ljc2ZlSXo0YjVEMFFWZnE4Ky94b0ljd2ZFY3pnSEhKcmRVNXUyRndCbE9WRG9JOUxTa3VoWmFyKzhvQ3lpUnp1eFpJZGlETzJTSlV2c2MrS0pkQTZTUnpZaDFxRUFuOTVoYml5NjVQOU5qSndVR21XQlA0aExaUGM4WGZkT0hmK29MQ0VMdWdRNXl0ZEVFZTh3UjZjU2JXT3FuUUVTUTFaeFhYcW56T0pnSzZMU1B2SGxaVVk1Q0dVc3E0dWgvS08rVUJkcFZ6Q01rRUowVGFxRHhDRXp4Y2xiTU5sK0I3WU5kUVlKbjVIZTUzbkZOVUd1dXkyTUNueENSaSsvL0pHdkRVRld4T25hN3I5c1IzYk5HaU9Tei94RE4zSnF3NnEzdlprZ1MwNEY0SVJ5dDFzV3F5eXpWcURmQjYxQlNxaWUwSGVmK0RQMnRhY1ZvOE4vRkRYcHhLR0VKcFNMS2pvU0I4SnVVNWJ2VDYzc3NqY1JSZTF0ZzU1dUtCbGNTUjUrMXEvOXo2NmF4TnlUcTdjeSt0TTFORFBtYWhqRDI5TVJseE83bVN1cERvc1dKQUI2S1I5TFoxNC9CbkUwK250MmMwcTFBMjZPZG0rVU1RblduejM2Q2hwTnJOMmd0UWROeExLMkR2dGJkYmh4aHpsTkkxdGhraldKZ1lIWkhVdjhZL052cTlIY09jQzZpaXV5UXM3SVNVekU4bk5qT3RpdmZXNnE3TTJmK1lXSXAzUFRjbk9RajB6OVVuM0ZGcWhwK0gyRDI1eURYbnR0QXVmMmgxRDVZZ2lRaWw0MDM3a01MYWZGeEk4M1k5RmNoeGlaWjlMTTBhaTc5bjhwZ1EzbGtkYUVuR0xrb2d1N3kyUkVzWCtRck1lUW1nVUl4K2c0YnZONHZjTzAvRUxvZ1dPTThpUU4wWWl4bWJrYk5kTzVjL3k1VGdkVG9YcVdMbm9PRWtxV2R6ZG5penJPOE9FY1Uwa1R0bW5sVDQrY1pNeFNPanI2S2pTNXd0WkdVUGhOZEY0eTRmQzJRWDBLQis4YVZSWG1aZ2VvYmRnU3hjeE5pQXJTWmM0eHB1OGIwRzh2Tm9iSWc3UUlIdjRZa3ZqbVo5ZWk3L3dZcFpvTko1TzJBWFlCVHBKcHlmUElRTUpaanVaQXp3OWp5STBUdWpoTWptV0N6VEJIRGh4NGtmV3daLzFmcVlRbEkrak9NT0lCUUdCYjhITmk4czRQL2JuUzdVTjFld0lycmplN2dtMm12amhHMWxLaUIwbExwZDA4SGlqZWorRG9XZFpZbitWcjZrcU5CbmVEMGZNQUZ5RmRJWndZUE1XUkdXcEFQRnE5RCtFVWgxdloydGM4UzVJazI2ZC9Sems0UlRPa3N3N2pNU2ZDNHJiNHVYa1lwTG94SzVIMllXd3hTL1hsWHowblRGaWFXa2NQcy9kWGF0SzByWGRhNjA4ZWVvVzZrZEE5ZUVyWjR5R25NSFpvbVBVNk1hYmIwVlhCaXl0bGZHT2oxK25NZm5QcXBuRmp0TjdDcnpKMnhNYkFiN0Y5S0VCTHkwaUZ4Y2hiZEZ1QUhaelcrZDJ6bGZ6S0FIL0U2UWF3bFR3ZkpKMFVoRDZuRm5ZejJ5aEtTVTdPL0FCakhZaTNwMGtvZTdGTitFeWN5cVB1aUljSTZOd3N1QlBmaXNRQzRBd3lFWEE0eGNGM3RGdUQ0RzNZZ0R1NzRmWmtqR0FOUzdrRkxGQ0E4dnVPL0FKZ3hjR0pLV3F3NUUwZ0psVDhmQWg2MkhoNzNMRDBkWXVEcVZkdTZsQTA4N082UE9MMzZTcHlDYWVaS0lKWGpvZFF0a2F3b1U0VkxrWGVrU2hKWTV0OE5naWdlSnVWVzNrVUNyMmRoamNreHE5Z0lFR3Bja05pYzhVbEFPWmJoaFhkS0ZjeGo5emxxTVNaK1RHenRnNHJQV3YyUkNjbG9iQkN4R0hGTzRWRzhudTd2eHIyYmwveXRpY3BpREYwTm5MSFJndFRZSkc0Vk00ZStVVlRRbjB2WHBMQ2JSTnlvVWJSU1BRQWZEWUJSWDk4RHp4enZJd0cvR1pXZGNuS2crRmwwV0w0QW4wWjRWNzlFV2ljd2JSQ1pBanVKUkZ4L2ExQnEvUkFFQjhsYzhHNDlnN2NuMFFNRW9ybGwyTFRzY0NaOFRSU3R0WUtST2NJQWdkbUJqTCtXUWJXRWZTVndVbFIyaVZFN2d3TDFiM0ZsbkdpRUtqTWcyTG1rR1Z4UzlzUGNabG1LeC9nNG4rSGhWSDFvRXVxR3JrRmRSSksrcnMySGdvYXJEbWJBR0ZMYVRTaHVrUWc4Z2FPY0F2ZlRBdm5yZ0k5R3RRdVdleTBySUNwdkpBYmVSRjZlMDk0MkdFVVF0MEFoQm9YQlh6cHd3emFJME5IT1IwaU1neGFUaUU2ZUt4ZGQrNXJVU2x0S3FHRTVZckMwTnlHMG9FNHpBT2xtdDY2cE93OHNPMEFsWC9ScU1lTjdzV2ZMTllQZU5FeFM0QVRUNXZjRExiQ2xpL212YlVLTVVDSVY4OVdpcmlUNTUycStBRmJSNUExcVVyczJRYW5zMTlpZ0RsOVNpeERJemF6SjIrV05pdGFNcCsvQTVxR3U0dFdabE9WMEZvZm9OanE4dFlmRnFuM2d5R2dwbGZlRy9GZTArWTlTajBPNjlJVWF2UG9ESkhJc0dEYmpEc2hSY0JRRVB3SkdBTnZSVlh6bFVXSnJqLzNYRnhXcDZQWGxlNjhqVGVPV3hDME5RRmhhTkVqWGhRZlJLVXd3WXVGcHlUYzFzWCtMMnlMOWVmNzFzblNNNjZ2WWNzMUVRTTRYVlNDSlNwSWRQbGJkeG93VjBNeC90emw0NjVFcnpvK21XWU9sUE5kWW1NS2h6VjNJTEhmbWovVGZiMVVDS1ltamxaY2l5OWxZbWVmeWl2alhTdHNPTWh0SDJCVXR5VEh1TDh2SS9XV0QvV2VYMlV3UDJHSjlqTUQ2MHY5V2xFK3NxL3R1RS80YWVmZnFmUDRXdUhoZ2pzSmZxd2pKck0rdEdoYUIvenU3ZEFoRHRoZW5vUWl2MzVJdXVZcXRmUFMybVJBdmthSkJnbmZma2dpZ3d2bG10MTJGWXMzTHpIczBFNkdMcFEzSHVrQWFQMnN5WU5NOVJ0cjhVaTB3UEFTaFE0L1dQZFNweHRiREZJT212Wkc1NlVYMnpvNmhWd0puR1VOMFBIanVIS1RoeS85dDhqRWxoRzV1T2NtWFJNOWRnSG9CRTJKTmo3QmNrOXk2Y2dLUEtPYi9Vdm9MUFhiMkRWczdSL3YxekxoWWJDNGJKWmM1WGZQbzFsQVNrUDV5ZEhXQzRrc3BZckM1c3BhRVFGeXNnSXBnVzU3K2Q1MWoxWGNUYlNybE9XSm5LYVBVUHJhNm9aV3ZkalJPREpjbTh1OTNXQytuOFF1RnptMDhmby9vcWF3WithTlRvZDMzWDlzdHQrYjRYKzk2dFhEaGdySWpobzNGR21udEFNVzVXVTIyck5lYko2SG03OHFkQm40MkhJbDFEQnVZdTllM1JOTkpWaGUwdmFFNGFTSVVFc05WV2ZwMTl0cE4wek5ybFJxaEY2R3pBOVpFUTBrQXMvaU03TEdkaUxIc3hjVElTM2IvSVRKYWp0eVR5VUJYcXVqRVprUjB1UWVsYWpscXhDd1NXaXJDeC9ueWpBK0lNNHZoZXQrUSt0S1hZdTVCSE12WWxLZ2hqRncvRFJJOXluWndqNWk2WTQ2Z1QyNklabVNHcVhleEgxMXlTNkx6QlJDNDJBaVRkUEN6WElnYUhYTDRjVkhEZzl3TlRpd1ZZLzFKQUlGaDdiTmtrdkkvUDlTQUlKNkpKWHBZS1daaTdXQlJzVmt6R0l6NEZQTVA4M1ZRYVQybXVnSjhjc2drM0s1NlUvVE00NmF0U2xvVk03YkE1dW1QTURzTEIySzZBaDF6Qy9RaDlsQUt2b1dBQk4xOEtKTTBWUTY3MjR0eUlNeEFnUGNQREthdHZ4Z1RRSEZpQkpnajk2M1h2MUlGc3lsQzlMT1UrMFNBeERQOUNsLzA0WkRHeW9UWXNQSHREZWpKNWVQaVd4QS9EQkd5VEJad05qQlpXSXFwSTFkRFpJRDdYaXlSZGQ4MU1sLzdkNHpxS2E0SDNxN2orMm9reDUrb201OEtpSTUxM0Fldm5xb201ZWliUFk0dlNVSEN4YnJ0czRDZ2NKNzExS0FkSXRWaVZIUGVEbXE2SU5uaThjYnZaU0RuOG9VSTg2bGx6K2RINDdZeHYvcmZuT2dCUFBtazZLUTUxZ2p3RU9LY1phNUl0VTNWZnJrOGZKYzBMQ2pCV2t5M0hFZ0hLTFlZdk5hWUdxOFJhbVpoRGFRSjVpN2tSS2ZveFIyRHk5S0p4Sm9EMHp5b25Bb2JlMGlVamF6T25LeE9LNzI0M2NqNDFTR3ZHUkV0djIveFF0YTNMcHFFMWNPYkUvNnhlcXh0emJid2x1MGJsK1cwRmJqNmlRUzRnUkNFdFNjVVJwK1YwbVRpelNCaEUrQlZTSTFWY2NLN0lBNjFZME9UbWZoeE9KUEk4Vm9jQXVhNmkvZWtXdE5mb2o1RlNnVlQ3d3g1T1hINWczYnYveEJGamFRQlV3eXI1SmEreW9WelduMmdNNXk5YlBHMW5QWWRVQXo5WHNuMGZLZnNQcXcyaDFQSlMzaEdwbkhoSXBsTks3emNqM1RWVUV2elFCY1FxSFhMQ2dBNDE3empTTVRzVHpzU0JibHpKRU5ISVFiVGwxU1FRelR3NFBsUnQ5MW1RZFVvNjJqdFREZUdFZkNnckVtbEIvSHBEc2ppbkt3aGJsL3lkd3paZ1htaHZmc0UvblN1SEtBcGVYTUtnRDNaSU4raWtuYmtQWmtFcTE5Qk9UMzV2bHRDcjlqK0RDcnFYYTF2a3RCaTFic254MmV6OWh2enZ4eHRvUWQ5OElwTWFJMzVJZlQwQUtYbDZYYkpOVXg5UFhvMGo1MzFDOHFWMjVBa2h6MklEOGdBcnE3YUhZVFkzcTFwd3Z5NWhkREZneS9YTzVwZGhzTnQ5UjNhcEZkOXVqa0t1UHJKQmVxaDMzSEROZW10bzhTdDgvU2Y1VWE5eHdONWRGZFJlMnQ3clNGbnJ2a1RYa1dCVlhNV3A1Qm8zMnhFa0hwRWJYeW1kcW9HVU9GWTNJdE15Qzhydm84SnplMksyQ1A4dXRmTkxaMThVUExMOWgzVXo0TW1PQVIvUENsLzZWemVqclVycnRtb0IvOEtRa1d3Qld1YVRRNWx6Y1FpQ0FwNkYrdENYbk1sdXhocHNBd0hiSXZqcjRDVXltalM5eWNvcHJIZFM5YmpZVmVVTWI2S1V2S3ZQM0hDRXFTSmZrZjh3Z1cydjdQYk9zeVVmUXJNcW53dkFlNENyTVJqY3RLNWxuUmhEK1VXbm4zUlE5V1cySkFhOUxYdWVzOHpITTFVaWJCMkJWM3VRNVMrZ2g2RDdGK3pzVnM3SXVhSDg2UHZTK3lxT0pJZzZOb0VUZGYzY3dFWVlTVWIweXBpTHo0MEpYYjNYQUZVMFNHYnBEQ25xUkRkbjFGVS9ya0k4Q04rOFhsZjJhbklPMW1BOFZTc1FibkJrdjZ0cTRMV0RISXB1dVBxNXJEN0RLYkVrbU1yYkNJa1R6bmEvMWJxN0g1K0tYOEd5dTlERDhneHJHbHBUZUhsSjhoYTJSeDBvY0lXV2tQTlE2UmFVcFVxN2QwM2hrRXJCS0c4R2h3RitmOWpLek80bUIrUG4xUCt2clVkeFp1RENCWGNSMlVIWjcydy9TdExNY2x5SFc2clBVMlp3OWJ3QlM3R0ROOGtvTDRUY2hJVHh5em5FMVRKdGlGWDdSajZJZmEyTFNJY1JBRUVuVkZsL3kyZXlSUGVzcU5OOEZFenRwQW9SSkhhU3F5VTkvRHc3bzM5M3luVGhsYUZQdktEc1YvWmpwOGdOSkNSZlF6bW9VVEFxYi84SHRrS01YVlhLQm83ak0xa2wra28xUlgzYTZiU0kxNnVoNVdOTWdwai9JMzdVam03TTlQdFhCdVNCdGNYa3FhV1FxbUQxS25ab3hwOGQ1Z0F2WDRUMVFHa254TTVFWGRGQU9FMEEzOW41bjVjOUVhTUJyMFRvYWZiNUZCVmx4eVNpTjhxQU95VXAwVUYydWVaTkFLMUZNRmhjRFN2d1dqem9hQnhDeVQ0YU5KVndTM0tWS0xFdEpWN0tRRHU3ODRPby9SaEk5Ly9mQWQ0dGZlUEJ5aTZNajdPYlcxNUkrV0xOK25iWStIRytMdkFvRW4yZmRjRlNJczQvMUg3MUphS1REbGVZMER0STM0d1grcS9OTzJlQ29uMGR1M2pRdDk2NW9HNXpTUVBSN1JZRDZqQUkvQ1ovSnYxWDkxSUlJbDZCOWJpN3Q1RGpzSjZrQ1pWQjA1aisrc1VSc3FrVFJxYWcyWnZFY0JWT2lDMGZVN1BIVys4SEJ3TzlYWFpzVFVpN3JieWErMkZ0cFRuLzM1MWNsZWFVYXI5MWl6RERJRW8vWGkvQlNNbXMvWEJJamRMeHlyV0g5UHJVc0pFc1ZzU0wvTEU2T3R1STQrdXVEMWIvQUtoMWhad2lWTm5xMnk2ZVJYVCt5SEFaVmxpN3dWcjZlSmEweG85Z1NacjhiK0FIOFJJa3Y1WVRTK3hCTzJKN3BWL0VZNUkwK3lnNEsybkdaOVc4enUxT0UvQS9Ea1diWjFHRkg1LzZqa3lwcHNrVzVmaUZyMG1mVnlaMFF4SCs4VXJVYnk4dHNlN3VkT3NoSGdkVHFMbHdyOVA0SGM0MEJCWkdwNmdpYjUyUERYcW1KU2hYa1ZTdDdpMDBEUDMwTnFEUGJkSEdvNDlaUTZmdjVOTVE0YndwTUV6OWFPQWhWaUxTbXdDV0VRUG00TGdUek9BVnQxSzM0dHlwQ054NFBXYjJ2WkNqdXJhNG52N090TVBGdUtFM1E2Mmg4T3VwdzJlTm1sUG9NYTF3ckQ3WUFCL25OUnhjcHZLczVMWHVEYnFSRmtLSmVTdTJMbFc2djh3OVY0a2VVSjMrZkdtRXQ2MGFBT0d6S1kvZm5NL0RsZU0yMmNVRDlpbmI4YUFvUGtZV1NBS0dqUGM2Q0hVQVYyR3E3ZUxYblFIRXp2MW05RktuQWk3eTUyYXFyK09pTFZ5SHI3d01SMjNscUVia0ZTeFkzVkNROEYwb2UzaThlelBDNzNmSnk2a0Y5Zk5OYlZxYmJoWjFuTTRaVmtHMTNCWFlZdVc2emJ5YUNxeU5xaHlHZWozUVlFcitEVkRvNWlUVWZpWXBhTUJQOVowdG9sNHBjNk5OZlAwWkVzbTllRllHWDVNWTFEQWxQRjRWbHpiYzBZN1RzbEx3QmswbUZUd1hSVFBLeTNYeHBMWmc0WklXTXo5dTYrcThmRExXVzMyRFBHNzdzYzJJemMxVzZqaHREdkdTWTh0bkdySWNZSktmVmFQbUxESzVJNEJYNTdpYVJqSmU2cDRQdlNVdzBwTlg1K2d4c0dMMmh3aHJaMWZRYXlDeGlYUS9PdG5FQ1V4TTBxSkQxa2poYVhEYmRTUUhNRTVOZlNpSmNjR2NGOVNBUjg3dHdSRzh0Sm9CQUI2WVFGRFRRVUpnUWZ5cUgycnQwcU4vZUtNQnJ0MDFhNFFJSDBwcjNvRmdlZzgxVndiWlE0NEJPZEhaL3dSVG1zYjFOM2plWGdhQ0dyUlMvSEw0cEpXdmovVzhEQk5FWTU4azdJS0M0SWxld1pPV1BQY3J1RmRYNDNRcERnN21xQ0dYSkZad1ptdnFaaUZ4d01YUFMrSVdtTFl0bGVHSEZWU1laVUIzNEl0TVo5REwrNy9MZGQ0S0ROalNkNTNjM1JDNElxd0xuOEswMXlxdnhab0xqYkNzenowQW1BUWxRbVVIMndnQ2VHUzM0WmpiRG9tUHhzNHNkeUlidFAvTTNXZ2F5L3BWUlNud1NTeWs5bUtvaXFkaGxhNlhPc2hyemMyMVREeTFldVUvMzBPaHlwQkhDUTZyWnZLRVg0cEtWMDkycFV5bkZadldObUNKZjgzWnNZckl4NTVBNlhkWnV6NGNDaFBTd0hlOGNxbVRlWFBWQmVSSTVaTXFHTXVuUktQV2xlbUE5bUQrM3FESHozbm5yVDFSZGFVbmNrVTBBbktnbGowNGIrakJZWUdWNDBLWkorczQvZEsxNytZRDA3N1hBcGpCRnhZMlM0WkRkZm0zOXYwRkJ6NTd3N0NrRVV6eStVRzNqMU9KaE5FL2kya1pqM0ZsQ2U1VU12MkFVSi81c0dKbnoyN3FUakp2d1ZzVU4vMzJnQnB0dUxqeFhTMVVVbFNTajMxYVhCbVQvMjZhMUc2MWRuUm92c1pRUnFlTWlQMVZuZWhKZGlkS3U5c0kyRlBGRktDVElld24yZC9rM3o3OVJ3YURhMDBJVXdyUU5KbmQ2dHZtZk92eENHZ3M4NzYrYWo5QnNlZzNtZ1ZxQ3Vwb3d6cEN0OGJuRmdUTWs0NEpicW8zQVdwams5NlcwcU5sQjMxZCt4YW1oU3B3V041Mk54ZXlySnllVnA4YVlCeG5EVkczZkE5UVNoVjloTW8xRHpwS3JURjQ4VEZtMEN2a2FuYXlISkZ2VThBLzNLalF3cEEzSXloU2hNUStLZVAzN0p2S09Rb2hQcmxhKzBQNi93S3pEUWUwanpEWTBjVVJxQVBlZms0WC9kWXRnb2VtemVrK0xxVEdob1UzRkRkODQydzYySGg1Y3dTMmlOdzV4RUw2UXdVODFwMi8ycTA1RWJJOTliaTd5dHVyYlp1VzJjS0tuUWxqU01tZUMxT0tyR29VdVhTRWQydTZQZHhTTHpWOURjV0dWK0xnd2Z1aFYzTXBySk9mTHFJODhtbGtjZE9MaHowZWdSUW9XYVhvYUZnbFJMWE5JaDdCMDFVYVcveTZ1eDNvN2pEOGpDdG85RFRuZkE4aFdvR3ByTiswYVVqV0F5cG5YVXRJWGRwbUVhanc5MkptQlBYNXliRElxOXBHZ2VBK3VTc0MxQllpQmkwTkZBSnQ4bmF2NTVKMlNVUnJvRytGdHRXYWRuQzJlMWowbzQyQ0pndEYrVnB5SkZ4OGlTRHgwNmM4VFpkSElpYlRLRTBXWXp6ampOSjBNRDRiWmtHbGZKVlN3czhUanp6ZXdmMkNaZXFXT3JxaDNzKzdEWjdCRWl4VlloeDkxWTNGR0dvODJZN09DbU5nYUZ3eU1Wd1Q4WDFtRjZqWTBua0pCWFdaVFN0cEdBMGJJdUZYZnczSmZsSWdKODlJNXFTdHpOTzBPMTV0TUxkZDlXZDlWRW11MFR3WmppNzgxRE95WkN2bG1STmNjcFowN0wxOElnY29lSlNSZ3hZcFlpZDJzNnFhNTBYQSt2K2l1YVVTQ1duZ0syOGlmQU00ekhrOVIrZDRzd2U0QnpCUWs1NkNBaEdRdDRjQjZhVi9mNloxVWtUUm9JTGV3NlhDbFJpY0YxSDJTRnhpaDl2SCs2M0dDcDZySGx5REhDZU40bFY1alNnUC8zblg1cDdXUncrTTk5MzhiWGtyMVNDZ3F1Qitxa2FZQ2wzdHNUdjRQMk93YittcDVSajNpMStmOEhVSVRRVG5MbG9WWHFEZWozRFIrMmw2TU1LNWorWnJ6WkN3SnVTYThxa1NHTlNaWlAwTHJSaEJndkxIdnR3cldVNmZBVDlSRFNuUXh3MXhJVmhTUXVSYlNJb0hHc1RGTTBFekpGZ1FRd0NLU0NPTEtUaHBEam9ZekpHQ1NUTWJsb2tsenk5THhndUxXeGRYTEpjVEJrTWJxSFA4ZzdTeXY4TGxyRzBtbUVjMjUwd1lOUmMrekxNdTIrTUpVREx2dVB6TkF3T1JnN0JDVnlMTnRLTzVXUit6d2RnZVNkU1Bja201VThIelN5eXVDTEluTlhpY1IvK0V6NmtYTGhwemREMVFCK2dBYk9YcGxCc2JKcGVTUExDNjhIeTQ4M00xZkR5Y0c2OXE2QUlHWXlaUUhRandkdE5Zak5aRGZ2RkdaUlRoZnNobFpDaFZ2YTA1Q1hWUWtXVkhjb2lrM1pIMnlhSHJQMkIvREVaUjBXNER1aCticHVqTTZnbEpxbklKVjlNZDZkdGZ2UnpiQWZ1UkF1Y1hiTWVCN0V5UWRYMlVDSkpBbnYwdll1dndnbVpvdE1RK1VORUNlc01adjJDWDNDYWZyTVRveVBiTHhxc01UcFdnc0thWEJhS3N2TmdiemhlUzVpVHBKSXdXNlczTE0vWWpxN25pMXY3cjNMNlgwR1lDWUIvNTZwaUZ5b2ZhRXl4cnd3eTFlREI2MEo2dEhmaWJZQlkvZ0w5azFoZFM2dW5RcndBM0JxTDBJNTJRRCtKRG5QQUh1Mk1hcFVBa2RsS3RJR2JtZlFxQzN4dFMvbS9JamNPVHBjY3g2a3RpeU9lQVJZRzJDRjVKUThlQmtQbVpOdm9BMmtZNmk3bVJYMUVqeVhTWEZqby9xTCtqRDdyem8wY2x6MDljQVNBdUlsNGdPWGxTaGFCbUZoRXNRcTVFcWppaFpxQ09yUitQWXpQRTBWOHVWRmw0TERGYmgrQVVIZmt1bElpRXg5QlZQdUwyTm9ScVhoYWJWNWRQMnBQcThQYUhwUTNzRm5IcS9xWU1hQjF2U1drUGVEbnpwMERhVWxnSXc1OWRiT3FKK1k1L3lNd3UzL1JMNGJpR2k3UHZuK1JNeWd4MytkMXV0VURvRGFKZU1ucW51U0puSVVjNmkxLzZOT1ZOWXAvWFF5eFZWRTZJMlZJbUlnWVJhd1ZMSHJtMmZwSU4zZkg0QUk2QSszKzZ4NmduNkFNTEZlTnNON1V1ZVFHZEJHOE9vemVaNFR2UmdmeFYvMkxJVXU3RzR4OHl6Q1ZVa2dkZ1VPV3poNXZXN1RHeXpBWTE3NzA1VzVtMDBZMWMvZFRMdFBwNW5yVDEyQmo5M0RwM3VuUjBuSmhXaWw3OGpCTWVuMlU4MFA1VCsrOTRxM3ErOVdDZVZYSnc3RXVOZjlDUTcrdzdHMnBJMU9NcWlBSUhwZEJVOVpyQlEzRkM4OWs4OVlMRmxOQkVkSWtMajc3VThOSnh4QWNKR3ZhSXlmVTJRSzJnNk1BTENqQnZuK2poYlM3RmlkRHArbGZiUXdJUENmaVBZU29yZVdnc3dHNEN2R2hTQ0p3NDh0L1JtRFJPU0hsSGE5M0pLMTgwUTkzTCtiZW1KVU51MUpOMkF6RldmNWJENFl0cll4aEJraGE3Rm8wRXRFSkt0N3Fqcm1NbWcrWW52d3FkM0Q0bFdjTzI3eUpkemNXN3Z0eHJVeEJxaFh6cklIdVo1YlhqaU5nTWJFRlZGVmxNaTFpRGo3ZE1WMEdLYkwrQnQ4VXVFSS9kNy9iMW8zUDdPbFo1MEcxZWowYXpEZ3hrV25WM1grNHFueVk1Tld5blhrM21jdTgwMjlkVlMzRFkrOWY0T1lEOUVzTXdSbjc3TkZiMVNSS2NIdEZXeVBYMURYL0FTU05vMlN1N29YYVdCdkI5TC90UmhXdm42WGQ1anAyQ1Q3YkZSdzFpY05jSVdmeWFsbWZVOWY5T1NMNTlsSkhJcm5NSHEyTjVjMU9RcCtOeTBoMmRJSTB2NHhlMEZwZlBIc1VFN0pvZmV1cmxLTG5SWktZZjlUMkcrUDU0YklncTgwbWQ0QkYwdUdZVUE4S2Z2ODdNWG5yZFV6MEora25GUU56RXNNekpCVENuZFhLaUwzbUFMTVg3WHZCZzdUVFNvMnhHeTVoTzF1ZGhINlJLcTRYRC9OcEVlTFlRVkdMRmpoL016bEFaK1BwZ2JzaDJEVXdOSW9GTHhhL1hCUlU5ZG9wUDU3d084QVhsQ2hVTjRUQTRwVXVSRzhRZm43TlNQdWUweGhuVlpPc0V1N0x2ZVpCL0txOWFFUjV1UktzeXMvTlFnOStSR2RabXdEdHlRWE9BRTFaOXZWRkU4Z25lKzNiRGppb2k2bW12RFRqMFpDblUrenhadEovMWlKbU16S1pYYm1SdmUzeW1YdklFdld3RGlMakw3VXdwbGtsczl6TUhRbFJDTFgzYzJxYk16V2J0T3pRNzF3ZlRzWE5hWEhmR1BBRkZCZ200Z2hwZXdjV2pjc2FxL0grZzhGK3ZpaXR4YTlBSjRCR1hrdWJDZlY0dlZoYmk3VmFnWHBSWUVpV3R6aFZKQTlySHVZU1VlMnBIMGNVZ0dhc3BTZDNVNGJDQVlzMkdwb0FXcFcwYzlHQWZ6YW4vandsUVQ4TmpDczExWmhpUndPN3J4SS9QNzJhRlFXd2luY1hJVzB2eG4wSkxCbytCY0c4SC91MWllSnl3ckV1RHU2bXBkMmpUTmU2QWhjelU1ZGE3d2U1T0xSdUdkUnZ2UjV6S0krWERRVU52aFhRN1ZGQ1RkcXoyd09EQ0FRSUlwL29HbFVyd1ZRKzl2ZTIrSDVOK1hNQ0tjcVhHWXVuOEdWWCs1anlIVkQrKzdlK2R5YjdkSUpROTJPM2hGT0dKZGJINzloMERBcWVVcjhJVEtaNkpqNktYVU5ONlN5UHNuNTJPb2c1bEh6dkM5RVBwOS9RKzhrUG02cHFTcHhhUEd0R1lhTDdNMEpBb3BvSFI2QmhoRWlLd1NjRnVMcTY4UDJmZjNzNitabUlXcEdpUUpEdHpJMHYvU0JUNnVMM1pTbXVtSkplVmhvRU1VeVJYS3BUQUhmenY1NS9vQXNEMFhzR212YUdKT0xLa2RzWERiWmZPWXBuR0FHdEYzMWtMUDhPUkdiQmJvOXFhdjNVNXVsbWZhOGliWGRKdmE2NHlmaFNqdG85Y1RPSlRvNUR6L3FZWFBVelJxWDQvZUlkejlHa3p5ZEVPbjBmbTRxNWhWY3pGT2N2Zm1lUUY3TFJtYzdlSDhReENralF4Nk9YdmpNbENRVGdKdXBKejR0WHA4VUZOb0NCYnVVeElOanh5N1h3MWJzVXpJeTNNcUlHWGtFcGlLNmZsa1dpQVRiWWRVb1Q2alU0TFlUcGpXd2FianpwS0dFK2o3TlVDWWFpOTM2c0JrYkJmejVJRFU5VUUzZUdaN040NFNOVUlYeFUrb01WZkUwZHMxSmZWakxtdytpMkR1aDdGYnV2NHJSdmpDSXVqTVFVb3R2TGg3QXZ6WllHR2NucVpWeStwazdZdTlVK0hnbUxyc0Zkdmx3eGcvdU5zS0k5NG1KaHYyOVpHa0xUdXRyWGsyYktoMGkwUnpCSmZyVzR0VXRBSnFkNWo3cnoyc3h1andVek83SjZRTE5oWm8vSGpRdUZoQUgyQnhsUGRJakhaL04rRlBIb2dmN1M4K0xUL1loay9wTERweGhaWUQ3QXJPYUdBdzludDJmWjAzSzlrU0FtQkQxRDF1dHF1SGg0NWtzWWZSK21CL3N1eFJXN2N1bGV4VjhDeUFXblY2VnB2alhNRWF6WGQ2NmUxNk1xZlRpQ3ZSUlVMUHBrbndONXRLU0E4VjZabnlCMGEzdUVEUHNJUXhkYlI2ZG9sdkhPRi9mU2JLQjBVUHV6eHQxbDdTUkRNOWpIbFdaQk1RMGhRQVhCWDBLRlFaczBMRGltMW14K2tnR0Nnc0lwUTh4cGM2VHZ3NHB2YjRFNVE5dklSQ0ZRNUNmbTR2MklHR2NsbzUrb1hubzhJMjZkWW9aTTRtVXU0dlV1blR0bXJNNEZMbW1PejM0dlZGNUpHOFUrVi9zcGM4SUxyUlJtazJDdVIvNEoyTHBUMU5ia2lyUUlCZWgzYWY1NGJRRkJuNVc5Z0pDaFkrTGlJbWdNS1J2dUR2M3crK1kvVE41alFBcWQ5aCtGTHNaejZ5NE1lWm5vaFhiZDBhNW4zMldNb3ZlVkh5WG5KTnZEb3VYZm91ZjJUK1JyMkp1RHQ2TGIxOS8wNEhHc2ZjQUFMODVoY3BqTGRWTmhSYTNXMlNhWjliam84aWFXU2lpYU54MnVnMGFNWnFGeE9RMEczTURweGRSblJmSU4xNG54RmowdUorWmpNRWw4Y28rVTJiVUE1bGxUT1pOa2lXRXV4MmVoTndQUys0ejlFYjhsZEN2YWJMQ2FlcmVOUkJCb1ljaEt6WmZGREtSb2lvNzY1cTV4eWNBbjA4R0pqUk8xeC84ZGFkRyt3dXBBb2tMVTNZd1RDS1pNakNHekpJSUdqOEFoR0NDTURseHhxUXl5azhuZTBFRWxlRkNxK0JYU3BzWHdoODd1MS9ydHNEVXFnV1V1S1NYenJsV3JkOTYzMS9xcVVucjlKaTBkeHNSVWxMY3lrNUJ2ZkIwa2RqRjBra2lNOEFmejF3Z21mTCtNSElndGNPazR1V1JubS9PdzRNSm1lVGtDTFJiSThWVWZWT1EyZDlPZEx0MGdZMXVKSEVNOUlDK2pwR3hERTM0aGYwaHdHbVcvWjR1YjRqNWJBMG9KakpXTklQbCtqMmo2VXBTZVNHbUZiQlorNnV4VWNxYTdKQm5lUmJQTzVSTWdZRWhGTGFzOWdaWkJsbit3VlVUdGJFRU1CVi91dVpZMHVLQ3RkZjNoWFVHeFgveDhZVm5SREQ1N2lqNFlSVTNKbFhWemVFd2J5bm41NXVuRHZ2Y1BzVkw1UXBaMWlZMXQwQmpqTzIzRnFxdy9nNmRVelNMdUc0RndkM216bDdwR0VINGkyNXZaNkI0NjlaeEdRSnNiQzdrTXA3cDlKcWpmNGNWazhBTmFsQ2RvZGFwcDV1L2gvSHZoUXVPQnNLMGZ1am84TnB3cEpvZ1U4dkdtQ0Y2cnNUMUxOSjkrUFNQOElSWTdTMnkxckhweXZlYzhrQnRNTzFyNmozYTVISmF5c0xqL2ZDVzIrVXlVbjBaRTFsUFQvbjBnL1FDSDVmZDQ3cHppYTV4bEUxNzBuek5ydFo0ZjFrbnBsU2c4WXBka2RKbkhxeUhZUlI1VUI4MkhMRFBZN2hUWjB0cDBDN2E4RHRKRm9mb1lRMCszZmhDRlpSWTMwTVRWeG5ZYXRtZ2gra2JyclZkV21adko3QWJOeHF2NWx4ckl0Vm85azZWbllEWHdGbCtTc1J5RWo2OUUwTG1hY2s3emFYVmZrNEVnWTFoTnJCMWYvd0NZbm5RdzZ1anpmVFY5NHVpeDlXUmY1M2Qxc0JFNW9qcWNNSi9xeWZVaGpLMUdiT29wdXJKdmhLNG5kNm1CVEQxTjdVdWgram11MFlobCtndHJsRHl0Q3Zkb0JXamRqbUFzU2x0cWlFanNaQld0OVRHLzJSRzlhQ25xdVB4aHc0WXBxWE5NZm03TlZ5dk82UTR4cjhDd0FuWXR4RnRidGd5TDhxQlJ1TnkrbjBxSXBDdjZidVJDRkxMaHhaT2IxUERHUlB4SXdXeWVENTdkNEtZQzN3eHlsMG5ycS9KcUU0MkdBY3dkTVBpZ0o2VDkwMW1qTVNlYW9QdUZUdjNZWCtNMXBKdnBjU3RWMXpjVVFDQytjVVkrV1FPTkxUNWREZjNMNTgxYmtMVGJKMlJDbFF2TkU5MWlvREhPbkN1dDhiUzZINGdKT0VkeUxpNi9nUUxhdU5POWgzYWpGUk4xVTQ0UlJVc21SSmEwODJMTHd3c3JkU08veTVPY0tCN2JRT3lOcGZLUHNVQlZUVE92dEF4MTVwaE9vRVhHeUNndk51K2lCNnlHeTdZczZWUW1wUGRLRDhjeGY2QmU0aUZtOWNWRmN6MHQwaGtTRVp3ZU96UVVuTFVoQTBqbGtud3hqQVprbGVvWm14VGUyTUgxVkl0U1VacExScnY1YmYydEY1VmNIVHo2UDZsQ2ZsMHM4Q2xZTjdrK2RPVGUxOGhseG1ib1lMNkRaeU43L3hNNGNlenh4Y3V6M1IyblFlRk5wMThVRmVyaEhKTW05N1lqRHEwaWY1N1Yvd2ZxaVZnaWdPTHV4OTZVL2FCNFA1aTE4RytKZldaclFqL1doRTZEa2podzhGdHRINmJKMHorQlNLY05ZYkFTZ1pjcHR4ZFMwMjN6dUZFUk5EcHkyWmZYTm1zVVZZc0FIakFVTWU3U25BcDg4UVUwYkRkaGhkRFZJNHJrWlZGV2ZEVldnZFY3dTI0NnlrVzVUSUJZVlRYWnJ1aEFaRCtWdThNRGhpS0R3Z1JUeGdYTGpjR2pLYjlNRXlmK05CNFY5aWsxSGw4VWNZTjhmbG52dTROM3JHL3U1bVpySnMxdTBoTVVlK1loc2hmTFNlWDN4Y01UZmFOMDBNS2oxMnU4aVRkY0ZlN1NBNDY1ZXo4aGNkYnBkSEx5aWNPaEdLSk4wdUQwVkNzaXVhYWdKa3RKTVFkSHJxeW5QK3g5Wmx5R0dyUVBJeW16ZHk0ZGdrZXplWU9EdWMya3ZYYlIxUUhtZ2VvamZ3Qm1JNUI4STM4cS9JVVU1RXJ1VVdiYmU3TDdmc3ZqQ3RCNkJpTVdTaTc3OHoyYmluSkdZY3FjdWd0aWhvV2JQeTdLSU50K2VWYWZkb0U4cXBIMzBmWkZEcDBRcXhuMWpDUFVLcmlpOGpNdVE4dURVejBieDJOdHVDeHY4ZGl1RFJsWDdWb1VPd0FNbTBROUdmSHBzeTZ5Qy9WSWpNSi91c1E2eGFoRWNTMW4yU3RvOGRrYUV5N05IdFBlS0drN1kyYmFjNEZkcytIUjlCTTU0WVpuZ2RTcWxJYVRIdVFwU3p5ZDRDckVoSkpxSkhhbjV3VGNwZElvZ0IwV2ZxbjJVbWQzRjdpQXJEblJFLzZNWmg1YlAxVVJ1OTJERlRHc1RmRU9YNGNyOFRqb05Tc1dGSkljUTdtOXIzY00rUEV0QjZ5MEUxTVJjK0pjc0d5OEJUSUN6a0REdmRtZ1ZXUTkzNjFrQm1Cd0RyRnRmTzlHSFJ6elR3emFQSzB1YXBnQVpVV2RUdTZwT094MGFPVThSYWh0WHhROFN6UktRUVNuYU1LZVUrTXQzRytDYVh5MzZWb3I0bE05eEVWWm5mTER1aU95RG4zSmZEc0hkWHVvTFlLeTduamNzU1IyZnlTRGNaVU92USt3cWRGODBSV1BneC9VUnZRMDhKSk9hdDNpVXlpS05USXRqaU1SeXNMK2Z4bFJBTzRpc2JaVW1TVkc5T3RPTS85a2FhZTliTDdwTjBiTGYvSkpMamhkemVnN1RSaVNuREd2U2VmSXc1T2tGSy9vTU9uR2lDeDQzcW5rTVJLZ0c4cGI4ZXVFK3dvby9ncWFTc0xVVGErY29RSlB6cUtzOTNvZDZNTzAyNndiWlV2TFhXbHE0QUJQZDBmT2pFUXdrYWZtSTA5Q3o0S2lXNDhBSURhOFpQNDBVUDkzd3JIWWZ5U1VlYTNHSkppWEFJNmdDd3Y4TUhGUUhzeXZLSjJSc29iYVFjK3hWdDJ6L0dxakpXVzFROGUySm9CbVRyd3M1UmJnOHJoT2pIa0R4V2JPamlWb0dDSitaYjlLKy91amhRNGdRWUIzWkxRMmJUK1dJdUJxOHlmVURKeVl0cDZGQkMzUW5nVFdnQU9rNnBtaHFqYVpSeTliTGJiUEw5U1FocjdqYlZEZFR1bGRUU2c5cVhzeHJHL1VwZy9WQ2pXelVuV3d3YXN1THlETnVyT3QzV05ySUY1M1EzT2k2NnJuSFVqcmYyMVE3UGNXOC9RZGc2eWtrVDhwb0VWYTBIZGRUdnQyZVZPZDdaU1BGVWx5VXZyK2NrM3VPTUg0TFdHNWwyRTdVamhtb3BVME5BMXVoT1prN0hubXZ4bHdSbTlNd1dEa2JjU0RBT3ZaaVNIZmcwcFNLY0hLeElGd2lkZ2hFWjVEa1dCOU80d3FsTDNlakZ5TGNNL3FqMitHSzVkK29XaEJGWUdwYXlaQ1dpcW1KbktRQkNBMXJoS2ROc1Fub2lPQVRHR2tQdjk0K2dlc3ZMM2JId2hNM3JJc3JaeXpGd2k1RG95WEYzU0RUSktXRGptR0hzYXFUM2s3dkNzSm4vSGRZZm1yeG14SC9Gc0hSRjBJVG40N3ZtM0Z5V0I3RTVrMXV4MXFibmpMU0x1QTQwOXFQR0kxNnNxSmRBZWdrMU13QklRSHlGb0RFMGlBY0hJRk9tc0grSklkdHE2dWtmUTdza1JCNFBuZHVsQUdIWktTQWF0akloYkZ2R29xeGUyMnhINlNVMWNmZThXY2Vac2RzaFhscTJQbnp2UXBGbExCRUdYdnJSalFOMjR6blRjWnhSQ243elByNjlseFdUUEpRaFNkbDNTNDdBdzJTdmhWbzAwK3hQT3g2MUczNUxmazlBaWdUR01IQzJuV1JtTDdESnpTbmR0cG9NKzZlMkxFUUhrbzBTUzhYTEp4VkVKb2VEWW4wT0htakdLSzNrdGtIRitHclJXQWdmNHZDbE1HQ09OaWpMM1R1ZXExaGptQWR6WlJ6cFlaeVpiODk3NGFRa05DNWI3cVJvRWM0b2puSktCblBaMVl0ODd0ZGJrb1BYUm5XaEcxRWtsWGc4MHl1L2ZNL05TbHlIY2owdzVXQWZvelU4K2NTZHduSFNNUURDQmJqMGRwc2VDUXpzYmFBTXRINWZXelo4YWNVM2xSWDZUUWljUE1uZFczUFRLWHBvTWdJYk83Znl2d2FCU0x1OTVjZkhWQWovdHptSVd2YTJKd1dYK082Sm9Bd2VJeExBZTVxOGJqYnc0eGNkdWdVZzByMFdYamRGWVFra1RQYi9jc0FHZ1p6NHVsS09Pb21vRXhBS2QvVFd1OVI4aFg0VVQ4N2tzb2VDMkFtMVVnSGZqOE00N3JXNUZEY0hMaHFqaUdydTBlOGVuQmpRTWdtOWJaYmFtYVNrRkZDMXBIais3S3ZNcHpNS1QraUV1YUZiQzd5eS9IY0NzL0QvVjRHcHUyT3FMcWtYbTR6aVJWQ3BNTFNoRVpyeklESTlVcHB4RDc5TjY3MkxKWjBURWlUZmJNYnpKRmNWTDhWRnlhVHczOTVKbFV1Y1htaTA3TnF5OVI4RzQ1ZTBwMHA2a1JZYzdJRExxSjM1OWxzcTY4U1l6aDRsbW51N2p0bFJkdCtFdTF1VWZsYVo2by9ydmE2YlRiNTBWT1JqVGtMWStCUThVSENSSEdRUDRvTDNiY3FyeG9vTEdQWFRsY2l3SXA5RXNvd3FxYUM2SHJIWjJCRXY0RGZTZ2pMNnhEZEduQ2pjWDF2eS9hRFFvSThhejYvUmJpWWpsWE9HTDVXaTR3aGwxdk4yYUErUHdqNlBqWFRZSXhyUDZIRnBxYkRob2RhM3dGQWJqOE00ZEVxakRmVzM4ckdhRitkZFN5T2FrKzJxcjdMdWYrWFE2N0taK3pOWVZnUHRUa1BKdElrdGg0ZkNqL2JVWTJqV2UrNmNpbGF1c0JkQXFES2pkMFp6eW1kRG92cjhLUUIySXlYSEQ3WE1JWlI5OW9kRlI3TFpZRWJJejRxanlGTjNRSTNvblB4SlFsa0pxSXdacG9OeStkYkhCQ0tTbWNNVU05eHpjR3kxS3ZWS0M1ditEMmQ1Q2VkRE4wbFZIV2xYM0daNGE1VmJJR1FibHdyM0ZEV3J4RG83MDB5OUNCM3pyUFRQeCs1S0JVNGJVbmJsUWY1dnBBb0ptd0dtck1QN21aeTdMRnFyRUw4c1h6ZmhGOVR0QnY0V2NubjNBN0dJVVE5cHVNRFVWLy8xdFRpRzMzbEF3bmZTVGl6UFRubUFMcEw5VzBia2lWc2d6YlB2TUhabU84d2k3ZnhKM2t3eVhZRzNlTWhUcnROUFpwSG9lUisxMmM5YVRiTVBKd3NBOFRjVms0RnQ3TUZIRDNoWHpDZVFnK20za1p0VzNRUGQza1dndmlzd2lMdmEwak1hOENVUTlqMmRFRUtUOC9MWm9WclFWeXA0N0R1SDE2T1g0MGZiQWVYYW5GTDFTUFpPUEpCS0hkNWFnNlpHM0NjZHROMVZLaDdrSWFUTVNvaDB3QVkzUWMwTU1zazdBdlVEcDgzbjMvWDNOS25nUFRoYVFldGtHRGNPekphMHFiUHNpUXdiaDY5V3RmL0luM0NpVEdSWmwzZndLYW1nOC9aRGRFQk1lUDM2em81ZGc2OWxlSFZ6U2ZLMVpTYi80T1dlanJPYjVMd1NtZXoyUW9UMmNGVHN0VW1yYmthdUY5RVQ2ODUzT0FqRzA5dVJiUzhNU0k2ZVN2d1dtcDVwKzJPbkc4UmsxdlowZnF6QVQ5RjRPdXBlRmF4cGk5bERTa0ptU1VqTkRKOXJmSnRDOXdLV1l4ZVNreEV4eCs0ajllZVpXTkw5d1VqdmdlZHBMaXQ0TndCRFVyMjBFOS9lMm9pVW9VWm5VNzBnNEhNdEFRRHFsRFI2QXN5cjZybm5Ra05odVBoTFlwSC82M1VFaTR3OFRGUHUrQVZabG0rdXFweFJzaXJCTlgzWFRNTE9hL1pVMkRLV2dYbkZaeEl5R3I2SjQ3YU5SRFQwdkR0ZVk3S1lxaFZrdzh2eCs4S2VITUIzcDd5cDkwandXanFnNjJ2NVd3eEg5TUluOGxpbkNhUEU4bTRJS3VDSE1acTUzbFI4RWV6Qmt0VWR0QlhpSTNUTXkvUVZBVjl5UjVvUzQ1MWVEUDRNVERYeWVJRGMxNTlQdUVia2E0aHBOTVRLb3lpRnY4dnhUbWRzdVB0ZUxGdlNYeXd2NXpWL3V0cjNjaGdRSjlnK29SbGpGVjlxdlA1bHRmaElrMngzNk5QNk1yUFg3enkwQ1RKaFdXMHo2RnM4anBXK1RpVGU2cWFHVU9WVC8wNENRc0F3cGtTU0FYNDl6TnROMFlVd016bTl4bUpEZDMvcjBreWdmeUZkakJOTlVla3FQam1HUEhFQ2E0aFdaYnlQTzJPTWp4eDNDN0ZNZC9sT29nKzcwcjI0UGRQSktvZWZrSm1iSWY5Mm11d2JjdktVMDlxOWlzby9lSFJRcGZ1OUlxVndFNkZWVjdCeWJnQVU3ZWpURjRXbGh2K1dBTHh5ZGd0M25xaHNidElZNCtEWTJNdlljN3FveVpqOW5wcS9MUmRod3F0clEyREhFRVBxUmdERTl6cnZYNDRvUTlwYkFsQ0V6SVNEemdXL2ttMXpyYkJpYW9pK3FMUUhKaVF0UTZrZkd4ZWFPclJVREZwcVVWdWtkcXl1WTN6V1lvUDdYeXpGZ2RRUiswV2JnVXhrZGpQMHpwWEdQbEd6dmZtais0L0ZmVjRtNWNtd0M0OXFNeGErbFpYNDJEMjE1TStaVFpzS0JBMjBkQUZIWXVWMVEzUEZ5cTZDM0JWaGhLT0RmTzNEb01mY1dWSTlrN0loZitNanlwSUhpWFk4d0t5ZnJLZCtjM00yU1piNEpEY3BFQkxyQmV4eTlFSVNweHo3STdEWHZvYlBEelNWVVEwSXQrcmRqeEpKSGUxelNSd0xIN09WWk9MZ2FIaWpyTWtlY01ZYzZ2bkhBcTU1eC9MZ2s5NzJVQWtoVnorbFJMT3plbDdodDAwZW5nUVcwanp0Njh5RU11ZGNsK1I4bHczM09taU1XMGlsSUcxRXJJTnNJUW12bjRDREdrNkdOR3k3dFA5K0F3aWVyN3B2VlNGeld6NUZBa0RVQlpOQ1E1eThVaTZKUHZjNGJvR0dMWGhybm5QZHp3SXdrYnlzblJOMnZna29BZWtERXo4UENkRjJTVUoyaGc1ZitBVEk4eWZBRnYzYWlMK0xpU29hRCtnaVVyV3JGVVdVNjRpaDlwamV5aVlIS2hnaWZwVDFSdFRESjR3bjBaSFRJQzM1QVd0eDVLb0krVmtzaVU1RHVudHJKdWtGTlQ3d1M4cDFhY29aemlkYWgyNVQ4SzRKbzN3VXhaMFprWnpYUXpoTmM4bTBhSFJSY0h1Y1B5YnZUQk1pbWZRQ1RIZngra09NVWsyQllaelVXWmkvbUtKWHBIRXB6V2wrVnZNaUZ2TERERC9tT3JqMVBjelI1WER0ZnRoM3h0eTdzbU1nWEQ5aWFVN21CUGpYYlE0aCtjUXdKZi9RUGlzak9iVVoydXlaNi9UU0R2bFJ0LzZ2S0NJQ3R6ZmlCTXFRNmtKK3dxamhuTENvSXdqa3VYdEwzTXg4QnZTSVdXeWVwOFdrZzRUdjltUjhwaE04bkNOWWhnWERiZlJFMGhaSVpZS2F1UGdlMlNNTzd5bVZBOFRoUVBPdDRwM3RqVlI1SjVIOUQxczAvU2xRTCt1ZzdFVUduRkNld0Rhc2o4eXlYbEx3WDNPNSsrcXJDU0s5alRsLzRhTEttdG4zQW9uVkh4QTl2Z25VeElWT2RqWkZNZjF2c2p4SUhKMysvZlBQWVZSVDZ6TS9Bc1lLRll5N3RFZXJ6V1BXOXpOVFVFWW42WHJUM2l0RTlkMEFkY0p4dW5HRkZSOGxGZ0NLYkZBYjlYTnlqcDVCa2xMZkdSQlVwOFYyeW85b3dhcWx3QzJhQmRjVHNJanJXTFVzdmFrOUx0YzFwc3FzOE8rY0s5YVZMcVc0OHc0T21Da0NOdDFxc3NPK0J1bWhlcW1lTW1SL2puVnhjdXF4a3oySWdoRk1uUW1OSmJtTlpuVFdyQmF5YWwzWHp0KzdhWUVHcHgrTFFUVzJkTm1GZDhOUVZYd0QwTWZUbURwYm1Xc2VKWndBMHhHRTFYODRLVzRWcGMzYmFKbkVlR2djditsWHBGZzZSMnFGS0pMQlR1bzdoTEJhUWR0TXNZemxraVU1QkJWN01sTHlMeTE0VndONWdhbW41UnBTWWRud1dGdk5YdGpQQmgyOXR6SXNtZGxZTHpFNDYwTzhCbmxHdmRsYU5uT3BKVUtLTUxTT2JaUjlsRnZFTUxZVXB6WTVnbFc4V3g5V2lYQUR1aFhFbittNVJOcklaRDNBVkF2aWVaWlFJVXhOWGduNVdTQ2ZDbDdXL3poNHRlRFZ1Q2NiREVqQWJZQ2Y4eU8rNGR1VnRrb2hsTk9XNU5JeWZnQzJPZGUrQzFpSXZnY0p2QlRiZ0hPMDF4L2pJejhROFN3alpnQ1hRUDZoMnlHRjRLN1lOWDI3aCt4c2ZUZGc2OTJ4ZENrbnRrcnEvM1VtVlY2RWNXMk1OQWhVZEcyRDhNZVZhNUwyVGVsdFphL3lXN05yQ3JmVGx3VWtDOHE0YjhzSXczeHMxN3FNd2l1aktIT25rRHFNdGhRT2V5RGRWVDNLQk95UTBZUXhLa2pRalcwOUVraFVBb0NMcFNuejBoRGtFVmVQODgxU1pWMGZHMXVKckNXb2ZZSkpvbkIxd0lsUzN0L2VZUGhsTmduQVRrelBWL05sNnRYREpSanRFNGIwckgzQUk3eGVUcHBwaHZuMFVJWmJpTDB2ZWJXVlFrSW5adGxFMHdPdGFmWUkraGMvY0ZwcGF1SjFPVTlFUnM0bTZPNUl5VUdzSEdnRmhyS1gvRGoxYytKZWVwQkxJOEdWYmxjQnVmZ2NQYXh2WW9aWFVMbTkraFQxUXVxaXo3Sk9LUUEvQXZZSk0yYytGQ1ZaN0p2NXhrc2pqMkpOMmRpa1VKNWZJY3hRZm1pNnRzMHdMTGlucFdwZndidkZGRUpjU3B2enBoSmtqQXdreGUva1U4a3FYZ2RieEVDRmdQajhjbGJOdTBUTE0wVHZQN3RTVWYxTTN1cUNUSXdkNjk4c1l5dzlxdFJqaHNyWVV1OVBqdzNHR2FVU0tOOTkwQ2cvaWRYQzhpUTNXWnZlM290ZVIzeGJmTWduMzc3bzVJNGpWNVZCVFVoUmgvUFlMbEcybWU4VTgwZ1AwTno2dWxmN3NIbU0zT1ZWQUE3M0todDBYeFQxTjFEN3hKa3NoWW9jeU9IdVNidVg1Q2xsUmhJMS8xM2NXb3BNNHFsYzlCaXl1V2dRbkszZ3VOcE9tUTRtSHJWTWRyTVJnVDdOc2dRSzhnallDcjdTc0ZKeWpoTEhpM09XejJqSUhhRTFTbUNEaVFycSs0eE13S20xd0tQQ05iVy9vRzJEOFVDSit6SnVBTG9kTHRwRG5oRmRPTWxKRktvVHJKQVNkdUZVUHpUNHVlcFI2ZEp6NjVzeTBKbFZLa3h6QnVwemw5TUdUbGZ3czNqMU5uSDhJYmpzaW5XNjhhdlQ4bXMyMTBmU0E2bGFFZjFDSjNENjR5SFh4a2t2d0swRTNvSmdRZzAxbU1YWjVxbUlNSmYzaE5lajRUUHhjSWhXZUN4Vi9NdFc3bTNNNnB1enFqYjJUT01wbll5WkxEa2lLY2hidFpNMjZVWGFObEV6emVObnZzTzFZUEIvcTZWSVFWbUpMYjUzRUNxRmRncUZWVzNUamxKSzREeTBUZkZOMnlLT1hnNFo1dytmZGN3NldYM1FqN0x5am9BcGlIdHY5Y3c5MzRoNzUzaFhFd1V6TldPNmpFSGF2U3JDMElTejd3c054alA3R1F2aGl1cmZrUHNIaHVqNmtPL0lWdmI2SUlZWnkyYS9DZUZIWnhuUEtndWxqWVNUZmRrU1U5UEdoSDdyVCtZcnJ5V2d6N0gwalE0dW5oSmNzM0VLaTYya0g4RkhpSmlZcG9qSWJtSGJjMnNSMCtPVUtmRFBXSVAra3N3eURGcVBiQXVlSUg2UVpZSy9HbGowc0VmbVIvZXVNN3NycmN4RUU4RFhjeHNDUUk5RmpobDUvOGNRRXljTEduTWI1Rk85bndaT2d2WTRRbWRlYXZVQlBLbFVDUlhWd0RYZjdrWUE3N1lyRFE1djl3N2VoVEdOMmNraWM3MTlqeW1CR1ViR2xjMDE0cHFrUjRoV2dnZmlHWVk3aVMzV0FYcU1wUERJZnkzb016cW9kclh1dEg2U0RiRkQ3NDVJb3lkd2xPcWhYc21Ka2hyRHhNcGI1a1V1N0Y1ZTdEaHZ1cWVaTVRoT1V3SnJKT2ZzMWtGSmg5QXQ1S3Q1d1lKUitaZy9TTFNpeEVWUUdnOTVQVE1kaERsWFdkK3N5eUtpbWJpK0E1SEJRVjh3YmVXOUY0MHFrM29oQmlIMVFUS0ZVaGJidmFTU2M0ckxYRnMwSDlxZ0c2elFSeTJYalhSOVI3TkJPbUxldWdOSU1lVnNkWldTZmVlUlV2bnVIcGd5T0k4TVlrNWZ5b2tlVmY3M29ybThhZngxd3o5S0hGSjc3VG9BTEhoN0VrV2tlWUlWOXF3QVcxQ0wrNWp3VllKR1hRV0xBUFVRSDhlVzdhTE1kckNqUDVUVkMxYkJpaUhLY1k5SWg1MzRWLzVtbm4vVTVET3A4THV4VmdyaWFPSGJ5aC93TGVVSkg4N2VBTElMeFdrWHI4L1ZPb3NFY2g5S3JtbmdUa2k5ZzcxQWtvdkVzdTdQMWJnaHNwdlo1bEJ4S3VIUVJLM0wyNnhaZ2UzaXNTSnJsWmpLbkhQNTNwSDRjcWJsV1dpNXE0SGhkT2YyUzB1MnVkdWhVM3hPeE5PMkhRQ1UrTkdxZlZtRTJUajh1TGJwN2Z5TGcwYzV4TTlGRXVqZnM3UUVkYVJUak5hQjZjZC9NekUwR24xRlpYOVBIdUcweFNUN2hScFhxbzExRGZsNkNrQm1LRWpsYzZNeVJxWXhSeUJuTGhJbHBjUTZMa2RMaENDd2JwNkxId01kUmNJNUo1SGVCME02VVBua0xrNDNLbG1ZZnVXQU9UbXprSy9rWFNGYjhKRC9PaGV1REQ1WlBreHhrOUI0NnNibFJYYk5RS0M0YmR2MlhXSkdrcEJ5VWFoNGhlUjZIVW9TN05wVjlGaCt2bUg4WUZPZFlQbXBTTjFHUE1Pc2xBbHdwMmZXczIxcEw1enFIUXpneHVPbnJrVWpoMXNZTzlyMFlHVUtZZElES3hPS1RUVm9vNnZIMm1oT0h0Z0NFbVhMSHlNaE51S3BTMzRRU2M4c1hwaGw2V3Yvb0h5VW43SVl2akQvYmFvdm5QTlRsV0pOK0tEZ3ByZ2Q4RVc4aVVDS1MzN2pmcERwcjUxUWMreEt5RmxOV2tCU1g4dXgyL28zQWtzWTNHOXl6cEhSVk8rTjIwTGJYRys2ODZSUzF1NDBScXJQZzczZ2JCa0hlZlBNRndmclVLdlVMOW9jMS9ZWHp6d2JVL09UeElyYUtCSkRzUGhodm9lem01dFFKaUJVVlBMUXJpS3pjZEpwQWt1Tkd5VzdBMHBQOUtmT2dId0pLR2xxK1BWZ3kzVEFTUHRUQWpjZ0xWaGRIQ3AycEtuSlpTdGdVWHJNQllZYTM5WnlEMXpIUWtLUUo2Z3dSSElldWxGbjZERW9TUUtiM0JXWnBwV0NncWMxZmNhaENrMEZWWTBrRHViNTgyQkVYUHZKTHd2dzRnbE0zUXNiYkR2SVZvMlRUVWFlZFJ6SHcyVEhpZnZRWUxydm1wZU9UVnNGYzRYcGFYSlh4NmZqOUNTU1lzcWRRNzF5aGRPSGQ0b1pGZllKZndmNHNVMysrWTIrZVdwdGhTeTVaUUxMK1BYQ0dNVGhBMm9BZHdReW8zdDRqVk41YmpuejhqUjUxZ0V0VWJ2UTltazdMSFd6dnRVLzgrZHB0b3NRMmNiV3FTOVBVMGxtV0Eya3RReWg2VmZWdTlXM00zUWdETEtNQXozQStQMkZ1am5MN3N3NjB1dnQ0R0JuV2FGSnpnZlByNXdpbk5NVk13ekQ1UGQwZXE1RTZHbUxHWGNHWEE0SUQvYTdmQUpmU0R6cUxVUktET09scVhWUmNob3VkWktYU0pNb2ZqRDkzYkxUVVdmZTVUcDdkc25DRmlYYkEzbWJ2emx4VkVEUm4wQndDZDBNTXU3WThHa3Jzek5STDR5cVR4RFBoWW14Q3BYRlRxOHhNZDhGY3dPSnZneEprNUc5eTVIM2tlbDY4UUNNY1ljWFhQUnlhTHA4cnFYK1IzZFc0RExSeENpVkF0alFrSVEwODdmenBCZnZQOXBBVS9rNzk5MlJUK3Y5T0NIMWFXYXQ4REdwOGo5SURPVFc4Z0V2SGc4RTRHbkgrY3lDeGFFOC9nTjE1cTQxcktpNzZPM2psRDZQMWpUaGljRW5UK3l0Z1l4OGRqWjA3M1dTYXVLN2t0OFR0TEJNTktvR013QWVxV3lkSHg4aUZVaXhvZFFaZ3VmOWpBMU1WS295L3Q5QUJpZzc4YjhLcFZ3YjdETlVqU3h1T0RMZ0dOalA4Tnl5dzNmeVRiQzI0K0lwNXVmUlQrQ2Znb2hYSVRWNXJzQWhvbndQWUpkZFlhcGVMNVptM3Vodyt6ZnhYTUY0eE1MbDhXcmhWM1YzWitFR3RWRDNOeVZ0SUhCa0ZJcXNBS3ZmUWs1aENDVk9XUDRTT3AzMzl0dVo0bVYyMGJieG8vOXFHRVpYbGN5VWJuOFRoN0JJdnZEaUFjejd2ZDZPOE1vU2NlNjZOdVQ0WHY2cUQ1QnBseWdzY3p6T0l6RkhzdnJkQXNKbTMvSVpKUDRWUXpmcTVMQzByM21QOHQreHVLSmtTNEpES051Z0JrSy9wK3RXbktiVGMwMnkvOFJPRDRsYU5CSElPd2J0a1BDaHdFbFRYM3EvU3RkdWtyMDdVQ0RkVmoyZTVxeGJBQkZESmNoVW1UQzJzcGdmd2I0UDlkVVNTam9vMWdkT0JVM3k3czA2bjhyMXl3WnB5MVVaWXpoYU0vcTVmMlhhU3hidzU3MnhNTmYxTjVvZy84RGpmZGpJODRyTC96SFpCODdoWjhYR2hUVThCL2QvVzVoNjZXRzhmaVlJNndlWGtncTBvWVVWamYvMyt3V0MrRTgycXlnVWwxQTVnZmlKVVdKbldNaktTSmhiY05PcUNoSUhkQlB5K0l5UVNGdWkyclJWalQwYzFGcitxRGhjVW9wQXlGK3hBaEJITVRlSDhwak5XWCt2cDN6eWpmM3dqSFpCNGdXZnNURFpMM2pGN2pubmEwOTVrd203RThUTTQ2Q2JmNDJ2RVZDcUdWKzNieU9GeVpWQ0FiSHpDVjdUSyt3QmVscGx4ai9zNFZycGpNM0VsaTVnV3JnaklTMHhDTEh6QVl3NzNDbDdOK3FYbDhyOEJlbkpXbXprc09YSkRjbGEzeU9TOVZIcVNFTjhGSm9sdC9mMmJLM09QSGt2NEg1VVpEMFRidnloaXE2T1p6bk9XYzUweDZvbVF2WHJqaXg5czdyRXhNcDEvcG1tYmxEbnM3aHAxWi8zRkovbDNmbk4xcFJSUWVrUFB6YnVIQVFDRGp1dXV1eG94R0J6L3BvZUd1R3FhWW1ST1FlQXZwZ2h1ZngzOHBQSzlFV3Y3T3dWVTR6U2ZsQ0JJVGRuWitldS9KNWNNMU9LSWxteE0zanFKTjk1TCtpTEJjcVQ5bkJaaDZUYkdRVk8xTVdzNFNuai9RTGJlY0hHYmpJZUR3WWhRdjB3dEEydmo1UkJ3MTZoK1NBYUlSc3RQVHlqTlFPaEtrc3VXQWNGdjR4eGdocElEVHk5UGJQRXBPZ0FOK1FDK0ZvTEZpR1FPUlk0S21nb2ZiSFNydVluL0FOZ0FmWEgrcjJvdmViWmZicUFZeC96VXhaMGwxczdLY3pldVhRMzR4bnIxdDNBU0lBK0I0SXNqaWcvUGUrd2pGRVlMbWVFWDNUNndYY0RHcVBnVTc5M2sweUx4TnRCRGgyMFNhcUZDNHIrN2taVGhpY3N3QmV6QXAxOGMxYXpNRU5LQWF0QkRsZnJKRkZ4NzN0Y1owUHBSdjNKYUw0ckM0bU00Yi8zK1VtbkpwMTdUTFY3clM0V1ZQSUZRejFDaTQxVDVySzlDYkRIMmdrWUhJSnFtOExkWDhJcmFjNjlLTGpVME41ODBLUWtGdW1DUlIyZURsZWJnNk5ad29VaVh5ZUZzUG1lbVJiUkw0RlMvS3UwVWlxbzNqWjZvdTYvUDNyWUp0STZBVW5BTU1pRE9xRmIwQkFQaGViY3BZRGt3dENvL1BFdWo5Tng5SmZ4MHlteTVpWWlXRW1xb04xdjhDbm9yM0lOWGRIbVk2aVdCYzJGVDYxSzNRTzU3bnNKcnVQU3FsN3lJaUZYVStlYkxaNnJMa25TeFJ5SDZ3TEwrbGd3c0NLbGRhZ2dBVWRRYlREa3BXaXBubytiRDZ3Yy9XcXBGeGU2bUI3RTFabjBDY09NNDlneGh5azlMaVRuQ1Z5SDhKREgrYTJ3VzR5SzhaSHBuaDZ0Nmo1M3ljRFdtU0JTWmtBU280OXZ5UTFVQ2NMY1NBQUk2WTlVY1IyQVJ3b083VkNLNlhkYk9pV3I3REpKV1Y3SVVISTVpeEQ2MVpaVEdqNHFHZVh5S2ltZGIrL0NWY3ZqdlNEUGoyMVV2TmozLzBETm1ieFUyMnJxYnQ2blhUdFV6REZDWWVGMDdVZWUxUmtIQXhGcXFPOThRclFEcE93RFR2b1FWdXZDNnRpN1NEMExQVjIwN3ZxZDdKcnVOYWxKa3ZZMUJxRFRmekJReXNjaVU1U05WYVNucS9aU0UvRHVKaHJkTXpKNE13eG5tWnV6UEZXL3FBRm1zbG42bElZV3FKVHV3c0dZUm1pMStkVHpLMFpVcFh5Z3FrdGpreVM1QWY3M2hzNG9paE8ybG10bjMyeFo2RWxXUmZKOHByZW5EczVvRldMSFdlbTNsV1RtM2FhWE5wNGwzSE9ITi9rUTJWWkdEV3N4UWJ5eGhpeEZqYUE0c2YrclFGL2piOU5CSW5nQTN0QlZDUzZTeVVkVDhjTHNGeHB0VjhJSzFBMERxWEdqOFBuOHdHNkJJSkc1ZHhMRXh1SU84MUw5c1FMVkRzL2hoRmdVeE1BNEd6UTVuZWFXRGg4VW5HeWxoQUNpaWxmUG0zaHdaVUNndnpFVllkeXZ4dGw1cWhZY0VnVlM3WG1PUFFBVmN4ZzV4MHRDaVM5dGtmTVRiaHZxZXRSeVFRQVZQa3FjNGMvRjdCT0ROZU5jYkorZDlrTE5VSFM5cFZoa2xybHJXb3FYT0hZSHgrakErbXRkSU9KM0hEOG53QTdWbENUM2R2SlhFZnBLZE1hTUpuR092OHNxNHVzbmpOektkbmhRV1BycjU0eVdENkl0aUo0c0VrSVkxeHdtVmtkVnFOVWtMZW1YSXNUd0lPMitRZFpOYTJlNkVQL0dxSkhzS3JrMVVnS2tITVJBWllvbVhTTnBUejRsQ2ZpSXd0cUJXYWllaGVnV1I5TE9GaG9CL1FNU3FrS0VUNUxCS0ExYTZwWlRzOTNFT0VIUmNyZE96aGVUTkVSdUFpcUVlTTdXY1BtdnY0cytGRjZobzlwSFdRci9WbDF2TzUwcjhndHIyVnEvbXNxdkRjSXQ0c3o5M1MzaFVtM2R6WjdWSWJudFZadGpva2MvWVdyYi9uNFRoYWhoUHE4djJ2d2srVCs2eUhJUU92R0FpaEN2OGNBNGZuY2hXcjNTNGU0ZVhxb3NuSkNQWGtqYVFEdVZsZnp5dTNvbldpZVhFOUNUV0pWSGM5ckt0RnFNWWl6ekhtY2hMb2s3NlJyUEprRm92bUcvT1ZHZ2NLNmJkWlE0aFl3ZUZvenZ0MllDWXB3YjJCMVg2emh2M1dOMmI3dDhNS0ZGS2dzK2V0UG1MV09NR0hxRUI0dGx1cXVyb3V4dE4wV29pekF0TytOVmw4ZHI3VXlPekVQcVZHaWxjeDNEbWZPUHdkcFVUckplMmxXcmdIempmUmxDR2xNNGpPMHVxb0ttcktUMzdhMm5ob0ltWm9DN2NuVjdyNWVCLzkrL05IdXU4WEdGZE9TcFJFU2VkQm0xUTZweG9hN2E2dEV1Q29tRkJtdEMxQ1dXWExSOVBRcVBBS20rbGxnMXRHTXBYclozbkViTGp0MmF6b2owMWxEMTR2OXpSNEpHQTdtaTc0cCtVSFJEUEpzbEZvT3lDV0pDOVU0ejNGcGdWeUlZREFieEN1djZaQ3Q5a3Z1T0oxYVhVRU1DK1lhMjZlT0JEQTlCd3ZSNVMrUEhaZzFVVFNES3FldURSOUJzdFE5REJISnhFN0x5SHRRL2tzckpicVhhUnVFR2FFTUF5Y1I3UkVOVzAvYzVHMElYSCt2Vkc3T2dyc0hlT0hDZUtycURCaEhUVGQ1RUtoWUNFejZLZjE0WTNQYmJ5SDd5a1JTa1ljVUYxMTFOYWpxaDVQdkFMcnJ6ZW5tVm9pWUgwQzB0cTdHNk1tUU5qOTVOL28rckM1ZDA0eXZkREJYcTI2aERuYW1QOGhTbTRlOWRXUEo3OW9lU2psK1pOM005RGFWREk4dEFRLzk4WjVPeVNFTk1xcUlXdm9zdWYvTThSeG55NmZMQytuTENlOU1FTUlMc24yVzhScUo0RlhCSm1IdGJIWHVkUDk0THdQMHVhSTZhUzBzcnRRQ0EzUUNKeEdFcmk5NWRaZ2ovcjZveUZCbkJtS0RURlI3b1FQZHJyOWpWUEF6TzlzZCtmWmdCYzlidldRajJLRDN6TklNalEyVmhUa1JtRUY2djBqbU1aV1piZER1dVRBWnVPUU82bk43bHc4VHRqMExyVENDTEcrMGx1MGRlY0pNRnlBbHpIM2FBazFXOVVQbEI1eGNlcGV5VEhPakFnbDhtWkJDRlpnVXJTVG1WY0tTQ1lrWXI3SzFyZVVza1d0YXZvdlAzbGdTRTE2SGRHeGl6VzI3cThZLzNjTnRHUG1HK2E1RkJJdG91YnVQeC9yME01cVQyV2trNS92QlMvSTUyRkRHSmJ0RXBmZjN6VytWWkZDZ0VEMW9EZEhrTVVlOVFqVDZBWHEwNWJGbFhLRTlaM3AvZ1pYNlRBZ0FuM29aTDJsMFA1ckQxQmQ0YmR3U2VNQ3NXNFkwK3ZscVFwbi9aNS9XWjdoQWozRDM2RWMyUURnWENTdE1Gem11VHU5WnN5M2EvcC9PbVNFUDA2TG9ESVlNVHBnaTZxQ0hycXV5RnVxM3hOaWczRzZnRlUzZ0srTTlEUk1uWXRWNWh0b1JONTZEekRkVzM5OWUydThOelpBVFA5WjVaSEROOHFrZFY2b2FZWGJXYlZ1b0V6OE1CM01RWmUrSkVRa0JXdUNPUmZsMHlRb2ZCQzd6aHpDQ2VpUUN6d0VJM3JGUU5UYlBManB2MHBySm5QYVJyOG1vRUJMbHRVK2NtTUpxeXRMZGpSaUNKL3c0SWlBL1g5WHJzUDZxK0lrWm1HQVdMN0s0S01UdjJSbzR1bUZhODRaazhlb2IveUN5Qjl1dkdvazAxTW5qUTNLK1JETEFjNkd0Q0JISkl0Wnp1bFJJd0RXd1hOVXh4Vit4RkVrZllYNDVXY0ZuV0xzY3dxVVRlN2lEWitsQzNiRlZHWUxvYllXblZQc0RFNk1USVJtdTBwRHl5R2dkcEc3QmNNbnFBTTdLbEQ4TjdQeDZITFRlRjg4WHpGeEppcGthbHN4Qkl4bWg3OGxWRVRjdlp1TzEzaTNNZTFDVjh5MDZ3b2s2RENCaFpkS3JKREFEZUdtaUgxME9EYml0Q2M2bkxxZjZGYjNBSUhWK2Fvc2hsTnFOdzdubmJmVG4rVmprd0svSURzZlliY1lCd0hFR0pVNnpnWnVTQU11TmEzSTJuRDhuUEVrZ3o3UHgwS1E5d3NFdDNUZzFDbUpINmZLRUFuODhPSk16R1E1dkV3WkhwcHFWOFEycDA2UXBUNXR3eEFBZnZtL2ZxUkp3WjhDRmxta3dQTG9RSWFzdFNEUWZ6cU0wSjNWQ2Y1bWxNUFZyRmR4RDJwVWdDeVdJVVE5UGVuSzRHL29kczJydVl0N3Y1RmFuWUpsc1hLR0s0d3d1UDhqLzJxaGpiT0creW1sTVlLbmxyNmUvV0NrQTQ2SWVTcjZXZ204dE53Q1J6ckZINUZicHFudWE3N3plRU5FSExodGJHdThqUXBJREdrRUdMNlJOQUhvQ3VGcnpCY2REMHBTYmltM0JBUnp5VjBXNHdIRG9kdXZtNERsN3NEVGNnWTNUSjVLZEx2U28wRXBBbG12TDhteDNhK1hRYUhRRUZhaVJKdUlRVHpvZjdLTDU3dTIyQ2RoZ0xkcENzcDF3M2FtVmh1bm1wYndHUTg0ZVVBWXJZdWROK3NlMmV2aGxwZkVITXFTMXRWTWRuQnJCdFUwTjdxM2k0bEFHVkN3WHpUMG5EK0N4YU93bzlIUEwweHEyWVYrc2RoM3RoZE9WTkVyMjBUR081WEtzSDhjK1JDeHBTQ01QNkt3cTI1WklSYmVNZ0tDNDNpOU9kUVVaODdwNEg3d09SL1hhczBUWWp6RVRvNTg0SGoxaURHbDJnVkJJU0RwZHlGaUtrTzllMGw4bjJ4Z0s2N2g0UUVKemwvNDFjWExvQVNOSCtLMEduYVFaeVJhODFRY0ZJWXdTUTZoMkZLZHZxUHMwTE83dStpRjl3UkhaZldOVmVVWG50Qld1Q3JENzg0NUtxKzZYK01YKzFWL2Vic2NONWpYNjdCcWh5OG1lbEovVUJwK09vVG9xUVpxUXVVVlJ1b3pHTlAvT0hNbUhrSHkxK1R0dFhzWVhyWElvR2tSOXFVQk1NV1hjRDMxcmY5MGNNUTVlekRIZkxzM2RHc2JZZ0UweWxMdDdUYU10TmhRYktlUGRWMXl5Z1VHdDF5ZFBvaXZHSm9NSjhPTG9GZnZVWHBicCs4cFZoZEhhdHNZUkhQNWN0ZTJhZFN6RkhITVR4Q0pBejROR0ZjaE5RNGJpbUhDM0R6aVdLbytKbWpPMlIyZ043RTdSdEthWEhveVBLS3FScDhVVWhrMG9xNVM5N3BHWm0ycHRKeDVET29TYXlMTUNOTkZDWTc1UGNOSURWUnFaYlJQRjBvRnVTdm95T0ltZXRvOXRTVkZLQ2QwaCtiZDlSM2VkaUYxZUFiOXdtRXRRb1pYSW1qdlpsaVJ2NElIWGt1aFcvclpIRGRtVmdwMDViQVdMNW5DK2VwOFlldWprTmdac0JteUFVRTVlMFdBTGpVT2VxOXpSVlExeEM3WnJ4Z0c0RkRvWkU3cFhCNlVieUJJZ1BLSUU5dEpVQzlKbTFtQTIveFpkS2M4T3lxcTIxRWJFeEhPbDlYODdiM0IzdVI3Ni85UGtRZ2lpVGNxMFZISTNsWXlTbHNvMFdhcHJlZjllb0dDcFV6MTdGbFJNVkEyekhiUXJLNExjSXhjcjA3Q0ZEYUduMlBOMGFyVmFKck84N3FBSEN5OHhVK0ZhMC9Ld0pYQy9rbm1Sekd0c05nbWN2QWI3dytHL2M2ZTd6YTdKdDd2Q0xOUGVrRGZLNE8yS21hMm1hK3FwWmZ5d1ozcjViSW52WkEralFJNWxUSjNQQjY2SXl6M2VDaG8vM1NPU0pLOUVwOUxpQ202RzRETWF0N1NITFBxV1dPWXdvM3lGNzFETHNnbVhUQWd1SmFIeHV3THVOQll2WW1HTllMODY5clk4WnQyR1FwK291VHdaNVJuaklsWFBYYUVoc0p4b1N0eXgva3U2UERhcXAxbWVxZjNpR21GOFNOSzUwbUFrRk1JTnZYcGdtL2tlbjlJeTRvMVI4d3p1L21xZ0ltUWJOanY5alc2UTRIL0ZCOG9ZVjNkd2c3SGFoZzRqR2dUYzVOTEpSTEFlcWFwV20rcTRUUllaQWlPb3lDWjZ6djRnY1g3SW90MGxaTXBKdTRZamN3a1FEbkVKQ3paQnlXNGY3UElObDQ3SkM3MkZBQXk2RzNJQ3NBRFR6ZVJpZXhEb0R3RDlaYjd2bUdPOHVydWEzYXBldTVoL0ppeEM3akdSS25wUHpqMUdyVkp5QzM2L0dNOXhya3JQTGRVbFlwSFFrM2RveWpjbEthYXd2RGtGbEFCYTFyM1pxL1QxUnZKZGlNbk11V1V0eXdHWi9iMmRacVVySUJUUXJINU9Vd25BYlY1TXA4VUVjWXRYMDNqd3lLS2RMaUNhM1JqVTBMaGVDYW9PTHhES2FScVphMTZKTlBDSHFKZWloYS9jOERmbkxUT2VKVDJmWFdaSnl1dnJ5UUl1YW5tejRrMDd4VHY0eXJXYUtNSXNoaVkvclJ4clo4TTNTT3haay9jN0tWQ3l2SnNhbGszQ3dQd1BBdStWMHVRYk4vNmhqbXFwYThmWjc1RllJTmU3SDNZWnVWdDcwWTNXT20xTS9BM2J6OGlTcExRaFdxZFlRTUdlRkFnbTNNUkVxY1pCZVdLWlpWN3RIcWwwNFoxak12dTJwVkVCRXBkSjUxTXArWjFIYzJ0aklEZnd6YktxMXdQWnRiNjYzUEVKeWVFd1pubHlMT05MM1ZlYTdUTk82aFVpMnE0N3huR3BZUXM2cTAyWUUvenhGOXUxbEVrMzJYcDF0Uk1WTTh5UHFITG5uWDVNaHYyRjdnZmFVK0U5VnlscFlYbUJEYVo1ckhqQzROTVI1ZWE5VlBrTTZHQlJxemNVKzM1ZTlONGJJbG05dzRVYmxDZXhSSVdjdEEzVzNZcU9YU1NwaTMrOXhwNlJIdFBGNW00ZTB3cHIyUklMWlkrZERoalh3Q1Uwek5NM1ZXSVNKa1o3alRBejJyYWxkLzdKZFlnbUdubDk4KzY2UHRka1lOOG53d0FOUW8xbHZRL3JNMEkxUzBrdUJYV1krNjByTlZ5SUx6NGc2MWpZZG1yVTJtMmpEaG5Xa2FBZ3MrVTZ6N2FncEdtZHdBaGQyMHNMb2dLRTE5VythdnZrWm9mVENOYTVyV1RpY3p6WWdmZkdLejZYV2FGelpsRm9JNHVHRFE0bThFemZtaVprbnNVeTI4THpUazBEWDJqUnJ3dFZIdzdsZDQ2UVFNY3Q1RXpDa0JXR1EvOFRJeE1QSmZOOFVkMlRmd25HZjljYzVTa1FySlhxTjRURU5EZ0tmREtTZWVPN1BUWHhZWk5Fa2c0ZmpDWUovdXpmaGZkQ0VRdTdIaU16OG9FNE5mZWtGa09YNFd4cmljSXpIVWxDSmduL0VWY1JTUGxxRmVNSitQVzdSYjQ3SkRTSzJ5a3lnMGtjbFlWQXd5NzZkdW53S2Jrek5PK2hIUGV6dzBPRFFFWHl6eDVQdjZFRTBvWlRLUnEvMm5CeSszQzk5SldlS0M0eitWb3hscExtdm8wdE0yQWdJQ0FnSUNBZ1BQOFBwcTc3ZnNjdCsyN2Y0ZmNEL3YrNnAvWjFSOTl2MldmNy91SDkrM29pdnQ5TW0rMzA4cjZpWG0rMzZZYitIMmt1L2JmVjl2MmU5OW4ybTM3ZXFIdnQrMUd2cyszbDM3ZWsvOUQwOS80ZW94UG5XY1A3Zm9mL3pmckhOK25aLzdmc0Z2MmZZLy9WZExmKzM2MUMrbjlpTHYxYjMvdDlGQytyMFo3NTBiMDhOVXFxTERvMTNwK05RNzlIVm9OM0dxR1FBc1FRR0tMMnhaODFyeHhOUFlDOEhmY1NtTDZTYlFoZDBBd0pQeElqM1RPc0tmbzZQZFBtRkJhakIvTjdkdzRTKzZyd3dGc1lWZ1pvaE5mNVZ2WEdpcDBWKzRvcDN6T3hmYnQ1amFncjBENjFyQllOK01lUkFuNGN1UncxVG5uYkRoWWx4cllDRG9sajloV1NaTGYvSG9zcE5lcW9zY2FqTTFWNG9DVGwxK1pJc3NQb0tneHVKMmZIaVlaSWRnRmllRStyeUxFMmRsbFVZVkV0dWdkcXorTGozTmFpenllZnk5MTcxSHA4QjNDaEMxblhFRS95bE9ObFo5bWpzMXlOY2wrR0lDellBUDJ2cFVhdklrdSt5UjllbTQ1bTlVdXhZcXZTYStjNjFNNHA4N0VONFpDWnVSYkZtd0JUSWsydm5VSkVvQkMxQXFWYTZYVkFyMjRSTFFuVXI4Wllpd2x6aXNZQmg1aTZPK3R2ZEJNby9ROXh6WXcreGx1TDQrWC9pVEVUd3Z5WjVlbXA0cWNIcDlkcWlaaUhHU1lOZ2x0bDg4ZTA3NEIwY0tOcCtvOVM4dVFQNFpydzgzQm9SKy8velN0cHdTLzEyc3RmTDY5SDNZTm1EYTg4a1IweDA4VEFocTR1SFZJNFN1Tmh1Z1FZYkFSUXVkc2VHWnNHRTJyTkxoOFZXV3ZkOENOWTFhNktEejZ3N2pibFBQTmVzYmJXNXZaY0cvSkswMUlzSFdlVVN3Mng3ZkVmdEd0SzlIMEl1dVkvWVlTQnVHSnhCOE1QT21DRmFUUk5KY0d2UlpoVmdLZWJUZTRQY3FyOFIzdWoxUU5URDdtMjROM21FcEJaTHJ5WEM0UjI1WnZPWWk1d2tQVjVUcXJtRTZSSlBkNllEdHFZSmRkQzhYUG5ld2c2elkxbEpLRnpzaHVrditCUFNnRnZrVTdNL2FCZllhL3lHSVg4Y0F5ZEhFYnR3QitDd1FUQzFoajRVdUR5K2REKzZWb1FFVzQwb0FVZUh3S1dHTGxxZ0FQZkh3VGxrVHhuOGJvcWV5dzN3dDZpN2dFYUNSc0xNeTkyYWxBcUs3cm5uR0w2eTM3OFdzNnlFRmc2ZU9RaU5uTHplOHVqM3F1ZkI0MVlWNkU4ZWxaQVJxY1pxNitsNGtXTWlUcEtiaExFclV3L3EwZm9Sa01TQlRIbkhtVFYzbWs5bHFGQUdWQUxZcGY5LzdhbGprc1J6TTVEVDZUSUdEcisvVGRLeDRpVWFPYUF3VXlnMWZER1pXUnh5QVA1L3FENkVOZ1VFS0NXNlZiVnpVSm5OOVNidk4vQWtjNERoTWZnR1Jnb2xucnc1ZUp3SXZKcm1tZ2hKL3dpRG5LNXo3M2JtaHdQcmNmZWw1Vjh4QzUrVldneGYxK003c09kay93clF6d2ZjeDRINnRVV2gxa09BNHVVNS9odGhMYTdFQjUwNTVHZmdkaWhCb2FxUFpFbHBvbFFQaTRDdHlvT0tpVHBDRUJGYUlpbk1qOHpSaWRaZjlCK2hIcXdSTWhoeHA0cUUwRnRDR2hBQmxBSlBtWjZLYThkVXpMdGNlN2J1STAxWmw5bmxENkwyRXErR1crOXZtanpaK3laQWhnZmVPVnkwTk1JZ3RlQ3hsMTBFR1BQZWpWVXU1bHpqSXFPdGd0cFJvSzArWGlMeDZRbVZyOHhlNDdsTndIYk4wZ1JRYTNHR0I1MjllcjlLcHIxVzk3dVY1N1JqbFRvaXZYQ05pUUxWWFpOQXIwbkxoM3QyaDl3ZGpIQlJvU0lGelY2TFNjYmY3MWZOa296eFg1OGU3enE4eTBSa3ZQV0lCTkVOcE5DUjU1dXh5K0FNd2VwSEZJTHFvYks5RW5LWmh3a1k2K2xQeWZrYXVzWk82UTN0RmRqWmZ2QUZMbVhPMnpnNWpESDVaeEFuSXFRaWxaY1RSN3RsT2V4OXBodXJ0RVhyNDZuT0phdFE5NWZOVmVuM1BqOExMSG5ZZ2htL1dFL1BZZlF3WXE0ZEZTYjh6NlR3RTJ1N2o4bW5kZm9PL2ZmMmFzSjVTeFVCRjg1b2NRVkw5MVVVRG9lV0FFNTlXc0JORjZBSjJLNzU3eGdNMXdqWGlVemFiMGFaNzZRbG9PUVpSdWN0Y1QzcnpJbkM0N2J6aVNrN3VLWW5GRllselpSNXMxWThkQjc5U2F6Ui9sUy9raHFVbkY5WTkyL0pYQU9CTWpkZE5ndDZnRGVlNndoMVFFaWtmUUN1bEs0bzQvWWJkbSt3TDYxWUF2M2tzeklrZ0pvNVkvL0xZQU05NzdxSEd4NkI2UGFIWlIxLzZFZ1NjRDdOTmg3eEljcFo1dW1sUTZQOXNrakgxa29GRDhXNEpEZzErSWdCRUlYU1hBRXNkRjBtYWJFdW0xTGVJWlJRdEFibWgraFlCaG1lZ2pmcTBHbnNmWVp3NGxZUTU0b3htUHdZK0xKUHNkU2xBcFVZMG5ZaGRuT0sxSlEwRElha3htK3BmMlk0NFlHT2p6WXVvRFFIV0lWenFXWmhiSkRQd2JMREt3NjFKVllPQm9acFF3Q1VUdE9VbDc3K2p4aVlsNnhIck14WHAwU2dTcy8yNEVJb2FOVTlwVElBRDBhRVQremRGTEtRT1hKNXQxNTdTam5COURBL0tNYlJjWlVVYWRlWC9YZ0cwSEJKYlpuTGVWc0g1T25jencwc3FhNmxTVGg5aWFoYmJ4VkJCQ1YxVG4zNGk0bytsaXhTZWsybWIwc2RzUExiQVVrWlpKTDNZVEZtSE03Q2R3VVZEczlnbHF2dXhvamVKL0R5UkplOWw5MWN3N1BjTVlwK0t4UUhqb3cyWDJRWllKTjBScCt2NDJNOFphaW1Edkl0UktsR3E2RzZXYUZtcmpXRzhNWkh1aTdSVE5vRGNaU2dhWGpFVmJ0TFlxY1J5dkJobnd2a2E5NTdGTW5ucCtlZnBvVVROZU5WMnpFVXhnNmlEMHpRdG5jQ2x3NWlqWUlndE9YYytSVVNCbWxVOWl5ZEYycXROZW50VWFWQ1NrNDNpdzRFMG53bzdKQWtMSkkwVk5TU2NPeE40ZTh6VnVUUjdNZnduZXFMcWQzN0owNktNMGZUM0dYL3Q3T2JrNEVEOTNRdHNDK3A4NHFKelJXelZOVUhIcUh1Z2hZV0JMTXo0RGMvd0w0N3Q2Ukcxb05WWURSNXIxTndQTUdmNExOWm8vL0NSVWpGZVVCVVhUTXZZcTNPYlBkamUzRFFtcGVZOU45UFZFMHpUOStONHcxejNabFE0bnJXWHd1NDNyTU11VllRUkpwMUNZSXRaZFNzWVRiZmZ5UjZqR1VVMFhSZWxyYW81V2UzTTl1TCtzOGdwNS90U3hqR2l2OE5XOE9DSWliMjYwVzZjbjJpYUVCbUk3OXBEOVhtb3FyckM4TGFVeVdlZmYwSzZ2VUFMUFk5YzlXVlRoNVcwVGF3b01aTEVhaS9rTnI4WlBPalhBMEJiNGpUakR5NW1hOFF6OFVPR2F0R0Mxdlg0Q1krS25IS1d2WmFhb056MDNIaGxQL21jbmc4RWp5TjdERDB6YVJOY1lCTnZMOEs2eG9Wdm9jOFo2SG1GcExwR0FrUFlyTm1xTTcxa1dURUNqRG1nSVY2aVRnSWl3cGcyVkhyZEw1RlJ0My9QMGdpTlR4dDdwNzRPTGpYQ0ZjeWF3c1QyUDJCRkVxdkIxZGxUZ3pJVXdFUWpMUVhJT1NZMTEvUlRFcGJ4c3V5SGRDZ2xwZ1pYa3J0V0xKRGVUVnVpSmdpOFRodHNzZjRnc0xIMEV4dmQrbWRiZ0tiWjVyclc1UUo1c1BKNVZ0N25wYktFU09VditLQTFqODhaSjl1VUFsMHgzYndGVFMxekdyTE84c3ZqTFQ1VVZ2bmRrQkZLclFVc3RKbUhyRE1UdUpqdWpmRDhuTmZ0QUZYRWFJaDh3Y2JIQUNwWXdvMmQrdXBSRGtoSGFEcDczVlFxM3d1ZFpZQlNLNERCSUJGMks2ZXJnL2NGcjBXSFBDL0JlcGxldWNNTmloVm9nSWlKckYxd05zRDhVSGNmVzFqZEYxTjhDdXNiNzBDQ2pzYWcwaVZsQWRsYlJqa0wzWDhPWko4b3BxVDlJOFR1bUorL05CNmdVMjlUTS9RcHBMQ0tHNitnNUJIMDlIWE1mNnR3QXVOVUV2a1NrTk96d1k5UjVudjlCcURVa3RNZzErT1hHTjVROWFiQVhXNFJEaFcrdzdZVkxUTFUvT2FNY1Q0K1hwclZTcUx5cWJMNGtuWGlBbWRjdEE4YXIySHhuS01nUmtkUWNGSlAxZWFTWHhZNWhrVGZJSmtqcHJlOXMzazY0enhEU0RuVlRvSkRDTHNoZlZjclZIVE4xYnd2UFhLZTFYdmd5eXdFN0E2QVBGaWRDeDQ5am9QQk9ueXU2SVNycVcyUlhDbnFEWHhsWXJ4VlgrRURRa0xHdkQ0eVJaTVNlT3VvYjZCUStiSm9pTlppMlJ3T0tlNlJadWtCNVZqdm5zMk9nb1M3Rm9ITlp0bkFyOHRLZ0hQOHdHakFpRXJMeUc2U2JDZEd4RXlmbTN1NXhxdUZ1Y2JVRUxhTkZNdURNRmFnUVVqTWpnWTlBcXpLOHdPN21BSExxUm1uVkl3b2JzdU5QVGZCSjdOU3NkL3JRUkF5N3pLSjUvcHg2cHNHdlFWbGdlYkdFQUltOERPcVJaRVJaMnhFYXVhSEt4R1hja3NTN3hmb1g0TGhwZy9uQjZLUXZuOVpnV2VJN1V3N0xqeVNqR2VEYkRaMGtaV050UFdFNENUOUZ3ZEJHcStYL0VHZlRNZ0R4Ujdla3p3Wjl3anVpczFiYjhWSnRFWkMxR3psaU1oZWN1UzZDTm1xeVM1SEthTnU0VTNIa0t1dzgwQWZOMFJZNHR0Z0xpdFFyWGpPaGV0N0lUcTc1Q0VnOWFXNytvNVFxanJCcHdpbWplcU9Dcyt4cTdPWDlCMHRiZWxheTdsd1JJNjBueGovTHRiN3NvWFJvSEJwVGtuZE12R3JlNkphZmVRNk9WV2dhWVI1Y2Erb2pXUDYyOGFrb1FMa1JVejFXamI3akZESUxERzIvMWhVSGxmVkJScUlGaThSMHlqaFJsQW03bStPVW9qSVAxSnl0dlpsNGZCa3JrQ2NyU244MjJUaEZraXN2aHBiK2VFNXNhd3hwdWs5T1ozeWpGNDNKTWJhc3BNemUxeVc3Y1FubHIrTmZHN1FaQi9maVVhTHFPU3I2SFZhMXEvd3ZEQlNGbFVhbjAxc0FsWjdBRXZ1bng1d3RqZ2M3clZ3eXVGdTA5UXNIaG5vcHJuajEyL2tpMEVUSXBkWTNtNWxtQVo4aTVObUJqNnRGNUlXVTBjSENldUlBYXBCem5WNDFTOURzemVldE42VlhEeHdqODR6QUdJNUtSVzBremRCaFhGQmw1QzloNU5JNjAwRTdNTS9sSzl0RmxkQlVqMm8zUDJZd1JsRlhXQ3pyajAwdnFla0tEUEorZUFKYkRYcU9CWmRYMlFrM2VNWklaTVJJaHJOK2UyS2hDYXBaSEdVbW9DNmFnQzNrU3J3WGNTWENOSFF0eHNZb0loZTR0UWF5b3R2UnVYWTlrb3lZbTJCb1BodUVKY1pMZTl3S09BSi9uSjNweTBGczI1dnZldEF3SG04REV0VGxNYkN5cytnM1MrZVZwOEdPY0lGb1NGNGFCUjdzWXVoQVN4RzJPaTFDY0RhazE2Y1RLenI4OUUzZ3FmZ2R0bXk5MCsrTmxvaU1wbFIzd1pVc1lQOHN5N3Zoc1QzYlZZWkFKMzNKaVRUY0NMNzNuSmlzck1TdGc0U251ODZ4OEdIT3lzYjZWM0lCbmZsSW1uQzE0OFpYNGdDUGF0TmswT3BySjJCeldRQTVwS0NORktmcHA5djVuNytIV2FoZzNzV1ltZE5yalJVQmFlYVBZSktxRXhHVFZMSmRBenFDdFNuK0U3N1JXSWprVDN5UjhVNjcxNUpYS1I2cUZRRis4UUppNXhrMGs3Ny9hMkhqcTl5N1ZmN0FqbE9jOEZIb3ZUekJpNDhFcXFsQjYxditqRkZRZFkwNitjNCtoWVEzVDFCSWRRcUltaXZnV0hYWUZhbzRzMXk1cStRTUg3NFZ2N2EzYUg2emxrcmR2QzB6UDJXeUZGN1VsSSs4Y0huRDVIUmZLZ3Fra2hZT2hNNGl0ajJKQU1EZkgrOTBXUElRWHJUOXBpVlFCajlqZXFHQ1ltMVRvSlduNWhmcjJWN0YybVpkNFZqMUhxT3FPTFlsaDUxN25qWWFwRU1PTUYrenFqOE1QRHhqSUw3SDBLcUJNcldxVVhYaGM4SFRuSnp0Y1pua3RkZXV0aFNXZkg5ZkRITlc3RklXTTdodkxpOHY3THZBaWR2K2hmTFRTZGk0TnNzZDZ4RklBZEJ5c1dMQ0xub3R2NmZpYXVUL2lSVk9OU0FSTjlwNlRXR3BKcm9KYWsvamsvVHR4ODdmbmFBSXN2M3hYT3hrUXNmY3RBckk2aUtxSDg4Z28vcEJENEJoSEY5OFJlK1doZ3ZHVUR6OGo1a0ZiTTVaWTFPUktXUktOVWpYdnlkYjVMOWJMcGRaVTVjMzROS1NqeUYySnJCM254MVpCRXM5cnNoZzVsK3pFQkZpRE04MTQ5amY3TnppaDhxTndndkkzcVFiSkZMRDBlQ2tyZUsrV2t6QW5SMG40ZzVUcWhrQ0xTK2dmcjQ4Z1F6cG1sTGhqUzJ6Njd0SktKYTZmK1crSkIyODhyK2YrSFpWRGxzeUNtNkYrS25MOExWa2VvV1k1YXFJanFHeHVzbDIwWGdINHlCczljZFlpNldDNUdxSlFaVFRVZXBndy9MR3h3anE0VEZQMzVucE5TbkdtdVE4YkpyeFJkWjBmbEhMQU93djllK0pvSU1NOW1qWHdFTEtWQTdDZkJoTXJMM1hBYTQ0dkw3RklpS095VkF4SklJelpoOFVRZGtJTlRQSm5iRmFBUTl3cnk1T3pjRUdlQTErNyt0L2E1Q1dsL3FuRGFvMzZwR0FLc3R0aC9NdkNSWXVVUG5BcWlSbG5SalF4NFNnRytwVThEa0xFQldWMHEvdDRpV0d6K3haaTFvQjdPUlluZm4zSjR3bVh4aHdwczVVTnNuYStYb0phek42WDBKOGF5MUpZbFhiVXFmY3ZUcllrWWNULzFIZkZHaitKWlRNdzZwSE5pem1hTEtLN0NXNGltTXphN2xhTktKQkFIUmh0SkxCK1BkZWpXNmc5MnpzRlhJOWZzY0gvQkZuTDdkL3FNM0tzclBPNjQyZ0xpUU8rN3lTT2JNN09uNHU4VDRmWENEMUEvYVZzS2tSOU5SUkRMelpNRitsNTdOb2xnSlIvdEw0dlhLVTlmaVlGaWl6TjhQb3BkYnRNTzAvSTRYMUJqbHlRQUxPTjdCZmxGWlNZOWp6c0lBdE5jN1hNRk1idHNaM3ljeHFEYmdZUDdoamIxSW5vK0p1WTdZb1U1REhxREI2ZjJzbjhNeHFRYytyR3Z0Q3NqelBQd3I0bjN4dTJCd2tHS0MxMkhqc0tUa1NEREQ3TGRobDFzVGFRM3NTMDVINXExYTZJTDFEbjgxblNDTTk3V1NURS9UNkgremUzYXV0eUNIMmZkNVN0U2ZUSmJNV0ZmbjhkcmRhekZUQnUzWDlGeEozRGhrTElWeG1UZ1lpcUJLd3ZuVmRYSXdBSCtJbXBnK203ZEl6YVRYMDlSeVI4OXNhRERBYzkvV2kvYmJpbVMzTG1iaGxtV0pvU291WmhZTUgzZFlMTVNmRTByemtEZktuQXVGUDhMdVhUcWpVTVZYbUx0TzlKdEp6UHdLSDI4bXBTOVRmUy9lVHN5Y2RnRzVKUlBJaG9OMHg1WHJwZFh1cXczUVh2d3FSZTgwaVJET1BBSWxOTWx2MUZDd0dSV2xwaGRhdy9yK0ZzaEc5RE10dGVPRHJ3eHdkaXVZVWxUbldpbVYvQ2FIVEpiblFCYWJKMEJUSUZuY0l0bHppL2E3Qm4reDJmRnZ1bnZWTTUrcXJTbUNvNzRVZnAvTVhOdXVmYytsbHR6TFdOZFhqUlZkdnRwUkN5K2xEdTlZV1JQOXJ4T3I1YXMzekgrd0kxWEtiWXdjckEvODI4R3kvL1BqaUF5Z1JQZjhzTEZmVGV2UUNJN2hJaEhwWW41R1dudWR1VzZMek9DNGQwNk9uMVlVVUZVM0hyOVNOM0tHMTdvaDVNclZ4N2lkQkcwWGZLcXZzc3ZkY0g0UDVZQW52YUluS1lOb0luRTUxK3Jia3NBZDBOUllvcnNYZ1JGQ1ZYT1FiajFKczlhTkxQVXFTOGkwY0ZVUGt5blRZR2Evbk9vRzlCZDB5em82Tnora3NCb3UxMHdKYUlmQUlyN0w4cjROaXpZanRxdWhPcHFMWWlkUlR0c1hBUUNkT2NqK2tCVVFsQWI2Tk90bHd2Y2RmL0JXSmlzRmZmdVNjVFdmbUgwMlF6WXJWNkgvZG9OOFpleHN1YzVYYVJXSnZYZDd2UzluQkl1RWRZbThtQkw2TUpOVnduZE8zV3dPekhOUmlPa2cvbUNOOXVveDFETFo5OTIxeUlPUWZiZTBOYVJidVRnd2ZjcFFPSlpHbnVOSjNuVDVCbzh3MG5CVXBOMGthM1NwcGZDWGNVOWZHT3FvanlqRTVTZWJENVN5UDRQenprTGtkaUxjTGx4eVhKbURtSVN0VGxuZkcrV2lYYzZINThSaFlqckc3V2U4U0lPRGZwSWsrZS9Mbkh3SW5DYjYvUVJkWmJYUmw4eG8yTjFlQVJaekpoVUplMWJYSjY3OXF3SGhpSGJjbmZqU3pLVkRsenVSaDVaZXVyOTBWT1lLcDF0bTZsdlA2QWdyMWtOK1hvSXV4aWdENlVnaTJzL0FDbG96Szc1Vk5ESjNEdDlEUFlqRE1ndnJyaEN2VlFXUXdHUGd3dC82L0pGdHdjbnI4VDJVOWhFVC9HMzFLQThHLzhkeVZ0VlZWNE9JL0hQbVV0aGpPTHM0VktYTldPNTFCUzJSV2VkTEd1cVU4S1lSWmFTaWc1TmpqWWtudE9TcDF0TkhaOU5SV3dJajBjNmtPL0p2ZW9HMXNhUlJ1RWE1Y1ljSUUzQWhsZWNxcElRR3dkWUw4SXVHd1Z1Y0xNUXVqbmMwY0hGUHE3dVRMTmUxRlh3VGhuTUg1VGFRdWpVTXhGYzc2OTdkS1ZFbUJQM1J3QlQ0WHJ3U25vajcrMUdjcWJ4VjU3dkN5cTl3cWNtRlZpdGsrUWtXZDhlSUhoTk5XQnRQeWYvTGdSek8yWjVKYi9uTjBDUEI2aGtHanBXamRQWndNTEFZQ2lQTExzSTIvcFZIRUdJcldqdzdtbGtBY3hhSTZ1VTFCWml2dUQ3a0NKRnJKWkMyWDZaR2RKM0htUk15SmhEN3dkVDVVdHpJVHBmYUFqcmc0ZEtPRnhuVHJMZnRvRFFBUjdjTUEwemdJdDZIVWNXcXZQd0pPbUY5d3FYVkZCcVhtd01pOFE3Tm54NVNIQnZJbFVtOW9WZm1LQTJMNXFEZis3RXYvZWthTEordnhaV1BtcHRZTXMxNWhHUkxlenloRmJXQU9ocENGTXlJYU5LOFBRQkNadjErQnYxVERhWFBmM0tkY1gxell2eXE4eDFhTUo0VXpIZGZZWFZaei95WXR3NG4zeC82MDNvaTAyeWRQMjdPODlRT3ZJWlY4TUJVQ01jczNxVTN5NTY5ZUsyU0djN202M1lIa04rTWxoeXR2ZGVSL0QvdUVxZnIwaGl2Y0NYMXdLaEVJR1NaWTMza1MrMC8yTWxqSnpObDZpeXJKMjEvZmtHdEZyZHZKckYrbm80ekU4U3plTzhXK2VIYzZmK0dmaWhGcU9DYStoekV6eENRbjlDMDZzNnFyMDJ3NCs3ZlkwVzBwVDBHTFVyeDdYZ3FCK2h2SG92dU5adC93U3lyUnRZSlA0S0VMV2ErUkJWTitEWWdaeHJLWEJidm5LV3VlcnFaSHpiRVUyVlNXQXN5N0xCSllCcTN5UElXSGZ0QzNRYnNQZmJqMlhzQ0YrbjMrQ282S0ZvMGJJY3NDaC9RLzRlUlUwb0pJMG1CVys2alR0SWR4STBTUnR6VkxaZEdwaXYyM3JyNTNXQUlhNUpIcFBtMmxLRWx6dTZaVlBuMHc0NHNPeDVBQXZQaWdKZ3AzN085N1RkOEZSY093T3F2WmZ5WG5vd0hKcWpFR3dyU0RVQWVkeVA1ZmFwZGEvb1drVEJJbWVIRFhlUy9DbFpFbzBSZVFYS25FbEdLVlZkTXdxTnlybVY5eFFaczJkZ1FtNlpoOWRwN0tmNWZWTmJUUEViY1lsaFdhVjNFWWE1TkxFbm5nbmdBb1U3eTZxbEszQ2lSZnpCdm0xZmpVQzRhb25XSHFyUDFDbVZTSEg5eUpVK1NQYXc5QVdPTDY2YUd0bkdqbEgyNVVnQjVpQnN3cnZhblROYlFLVU53UUdlQWcxWTZvREh5Mk1VZUJaN3ByY3NKYkZqVHBlQzNrSDVTeTQ4cjRjZk5XNHpNWkxEN0UwWEgwTmNxNGFjLzBCN2hyRFZOTzVvME5iYVd5RFhMVjczQ1hkNG5rRlhhZmtRb2FLWEIrOHVkckpHTkg0SDcyL1YwL29oVnBvb3pnM3lCWGhvRlE1dXA5WXVqWExHdHpZZkw4dWt1bFZERHJrOGVaQzFZRTJha0d6czdzYmNzMEQ4OWFCWXRYYjlPOVJtSW91bDJTajRaWTMrM0FHcVg3ZlpTczdnY0NNVjdnSE9YRGJaMjNFS21Namw1N1VqRmNSQTg4NncxZk1ZMGlBNkI2aWF0U0JmOFl4SlFWaWh4QWFsVDg0ZXhHSVROK1ZLdGUyOFB6VVRVRURPbmZZME5jN1RWWlFpVjlpemdNcHk5bmgzYURET0pFb0VyM08yRXgwRGVhVFMrdW40RW1sdVFVWk9tNTZjbG1ZM0NHeWU1ck43V3pLNXRKZHAxMm80RjMrQU96bCs2VVh4VFZHdjdOenllSmxPRkVrY0ovQTVFSXpWYnJNN3Z1SFk2L0J5WUFjcWpSWk1vcnJLNEcxOXRyQmRUTUczbnNrbWZUUnpGRmRrMCtkbDNEektLU1pyZzhQNXVHdVZJQVp4cVl2YmgwdXpUUm9GVmNVSTFzbVZId0s0VTFwSDAzK01YZWoyNitNZXRTcFQwOUZFYWgrZUJNUXdYbVVSU3l5dHJMN3RGdHFLTmQrTDVBa3cyQUN1NGVDT0Mrb0pseFVWMnlYZEdaZ1N2Qi9VaXJ2azhta1pQejhUTXJHcFBpbG5NRUxDZk9lSmdSUTBXQ2R6enFRbmViMXZwWW56UWxQaHYxa0ZXbUdsKzY1Nkp5MmlackxTVHdCZnI4Zks5eFc3QWRMY0dIS3RIVzh5YWVuc2RSQ3QzNm9vTlNwMFNzUEdLZDZaVDVNaXFkeDczVXpKMFBRNGVMNFQ4UEFZSjdhb1h5WjFxdkJZMk83eENka3VQYjNxdW9nMUNWL21oV3V5bW5Lc05FZmVJelFqeSt2c0psRlQ5STFRRlRZK0pza3dVVDJKaUMyVTN2d1RPSHgxMWN4dDd0akhIcnZydEFaYlVWa0F6eUxybWJOS0ExcjFPM3pGMWlzWWxJTEF4THdkMjZzL1h0ZllVSDMyVjNqNUY5QmR1c0ZtV3RlY0RQU2VUS3AzL1dTRnZXZUN3NU9iZEoydU5IZXJ4NllRYll3Ty9XYTd6WHFHS1Y2VGNnRisxbXhtTDJ5S2FjbTBES1pBaGpyc0dBZ2ErV3BpZGV4aGRzd2hBbys0dDlPKzFGcy9qZ2Q3b0xmUFgyVjQvNWY5MXhWbnVSYWlzaFAvTklUclo1TndTMVdWNGp3OEdmMXRndFhPQVR5VlhtVWxEeUxDRFZlbTRDelZ5SkdwUDNxRE9CY3h0N0lFQTM3ZW9GeUZKSTZqNHBVMGZtQVZ1WTVwaEhUNTJQcVNyQTdoUEZjY00zeHpCdFN2NzUrU0dRMUdBbUh0TFlSZEtIdUJHY3dlWGpXOXlDeU5sWHo1Y01pdWdETnhDN3FrVk51d21JbzN1WUtYUi8rSkhVUkZOVk1YU1BrNHZYWmE3bFZkQWwreDV2VElVenpXQ2FTYjNIWXhLdG8vbzJvM3NDQW83OGZyVDB5KzUxb1NjQmF2NTk3NjdDcVJyaTNZT0Z2U2hMcHJGOGpoMEF0aE1STXl5cUZHVE45amQ3Y21RTUVtSGxwMEtHQzk5OU9ydW1JY2tuL1NWWGFJU0liQlRiZ2pxdUdVZnhWT2hqbTZ5bno4dlI2cHRMdFowMy80TndlYmVreDk4cVhkSWlIL09udEdySXBuK0Evcmw4cEdkSHkxTGtGQitWSlhnYUk4N3hVU29od3lhUUU2b3I2OGhzd3RoMWd6VHo1aVM5d1MwM0NiQ3NwTkViSHpWSmtMeG1ia1U4SHdETUJRSDRKU2NBbTlmamFBbXh2QXpGTThBb1dScStPV1drM2FrNnhGTWlONGluVVl1OTJ3ZU1EaHg4akRZb1didUZoR3lKeHdCUE9QdnNJQWRROHZ1NHVYclB1bUpxcUxRZmtobEtKc3UrTDh4Q0tVQ1NtUFhqZkIzRkpTclRzMzFTdWV6bGFlVXRiNmF4Uy96L1lmTElsRW5UN0lTWVc4Zm9MRmJOVnYxZnVLZkEzQjh4bTM2ZXJUMG5pb3NxWFZ4SG5nUUowZzBhWk4wYkloeEZmUTB2VTN2TjJuRWtXRGsvMVdRZU8vTkI2aFQ2RFpiS3Zybmllak53Vi9xMDRrSlhlNWZjVGpZK3ViMzRuQ2FyYXVPQ1dDMmN0SUt2MFFuV3RKdWt5S1ZvYmtkT1lwMWZpM0NVN2wydHY0bDFZYTVRVlB1a0tPTnhnNVVxbklOT0poZDlsSWJlVktYOVp2TDdWczBRVk9FdXFCZ0ZMNWptNG50QURNRTBxVlBxb25ETm5pVlRMM3RrRC84SE9hM2VMRFJyUW5wNldnaUNNb0RsYU5uTW14dkFJMjJtNFc0TVd1cEljTEJpK3o2eEZWajJqRDJzaGttQS9aZDJsbEdZemg0WGpKck5vQkFHY2psa2lmRXdOQmtCM0lLVXJPbUVaOUk1REZ5SWVkb1RuSHhUK0tqdVNNaXduam5ReFllekRueE9BSStSdEZldU1PYW5VZDdOMDBEbFg3d3BJMnBDYVhyeG9mUHpPZHh1QXNIcjM4aGNObHhwTXk2L1NuL3BvenZiaHA2NXR5YTFTMGNuMXdGWjdmNjFDNE93bi8zb1p0VE8yQnNUTkR4dzY0WUtqbTJNN1pBRkRvbFdpQmRmanlHSnZjaGkxM2RQUmh4Z1haYWthYTNxQjgzYnJDS2hCNit3K0VkKzNFbkxXU0loVG5DT3NwcmVJSWJYYXpJY2NPaUp0U3pzaENGT1EwQ3FhTXJHeUYrQWV6TythbWVSc2g0UDF2OHZrOFBWVjNtcFJVNmJjcE1EMlhvZ2JFSklQamphbUQ0ZTJuZkd6NStvTWYwL2REb0ZIZEZuKzE1SzdjVG5sOXZKOTN6cTVUaG00aG1NakZpMFBmUnJjNjR2SWFOWnlSa0p6VGxMMW5DWlJkUkl0aWcyTVA4Y2hzSnM4dXVDODdXSnZ3SXlSWDZ3TlhJakhhdlBzeDZ5Yk96cTVUblduWHo1akpaK0VYa00waE1ReVdKclROZWcwSFJuQ2wxeldBNkEzZHZvMTBWUWJRMGlQYUpwaU51OVozb0RPMHd5MnVZdURncERmUjQxM0MrbWpZVWJLY2NhakVVQ0NPazZRaisrZ1VSTHRZb0N3MC9mQzJiYVg4bHRWbTF4ZnBVeVF2Y2hHcjhmc1dxYUs4eFdtbC9hbytDaTZuSlJtcGxxaSt1czhVRnhLbzlRbDBrSmdEcWt4RDhxbzFlNVRDQStNcExQV25GUUxESFJpbCsvaVNuTUZBRGVvWE9VdGYzUGFMQVVhT1lOdUdXVUhjQ3FqQU5yWkRyRCtLRHRRQW9uNFpRRFlrUTFBd0VGRk9oWTR5aXcwci92Uk1qRVBlTlMrS3RXay9wdkVRQ1VEc0dIT1Zoc3djdFcxdTU5UTd3bDd0ZHAwa2NNa0RhQ1dkZ0xKWDN0L3JCcG1VTElFeDlPaFRTYkd0Z1E2cjFKRzdoQXVvcGNRdExFRGhJZmxBU2luMklOTUxHUkh6b0xwV01qWFAydXNMdjNMSy9Xb211RFd4RWp6eGgrS1doZmVaVVYwR2ZOY21RZHZrQTc0b0NzQ2ZmQStjbTJuS1V3ME1uWEMxY0ptYlBncFhwbkR2dXRBeERwU0JHV0NCT2NScllsOVNkK25HWWZvSU9zT3Q5dUk3MkFWMG9nNVl2MnJUTVNMUUdXSWFxblMyQTZYWGpSU0tweFkxWDZWU2twVnZ2L1NBWmVIUXVCMTRvREE4Snl6VjVYTU9NUFVxZ0N1Q1lveDVEb2tIL1RUeEJiaGJrSmk2ekNsNmZvb3FETnFoQmNreVNvbWVRVE5OVjlxR2hrOUVVUXd6L1VGODZ4OW1Pd3c1dzhEYnBzeUpremVhVlhKUmRndW1sVFNLbGxwcXJObHZrSGMzZUtpWmVlNXNnMHp2YnA5a0VYUlpLVjExdzZvY0NNVGJlM1RQWExUN1FpSUtXZnZUWTU3Vnp3WC9GMEs4WlUxaW5JcDNodW5WQ3dZdlUzSzBZaERpZC9qS2xRM3BocXR2aTRpUHNERUlsZFNkQTNWSWxiMURCbDZSRW5PNHEzZFhRanRDUm42eUNhL1JjQkxTeXQ3T0gvRXpwZktzTkdsWTNuUGpqN1MyMFdHajFEV3hTRk9oNWJtS2t0ME5oY0Z0SnQ4TFJtS0RJNUhkYlZ6Q2VqYzRDL1hMUk5ZbGlJc3hKZEkvWXkydVE1cDlpa21KcFFhQ2o3bkxnUGFraFlXSEZGYnVyYWVVWlc0Uk4rcHVOM3hJSTZRMjJtdk1SNi9mRG1ReVBYNWh1WGdYYXhJWHdtaTRpbjNzUkEySXZzNlpyQ1QyOEljbDhYcnFHaC9MdjF1OFZsWWpORmxBZnRQbW5MNlNGNFNWSmp5cHpYMkR4SldvVzV5QThrUWVIVFVab3VINXR4aDFRYmV4VWpuaXI4YkJLZGlubkNWZ0VNbEpKaURRc1ZJZ3pIdkhZSG9nc0kvREZJTkc4VWthWFFXMG9nTVdTRkRFQVp2cFBKQVRTSTVXUFAwa0V4R1NwTzVJalVGdEszZEY4dnI5cHRUa3NkVnlHOG11dzd0TWUvM1BvZkFvRmJhMjExMnlyVC9xR0JQcnZaMDhDSU9OMW1DeHU2b3lKQzFucXRlcVcwSlg5c1R1RVl3R1NqQU5PT01XcEl5QmQ1eklDb3FFU2Z6WDk4bE1EUWlzaFlGRXllQ2VkNDIwRmsyVFpWUnhvdXlncWlrTHhPUEdKSHFlL0xjVlc0ZVhVbnJVUnVhN21mU0QzUVBhK0EzWlIwU2lzTEZGdzRObmlPTFBVTkRHSEcrWUk3VGZlc09Pbk5tcDFDd1pkeHpVM2RvYmlOcUl4Ny95VkEyTUJXZTN1VnZ5MXZqL2MrajVpdkxaVU5EQXBKN1RmcUFzT1phVWZOa2FGbGp0dFhvVkxNTWdRYnpJMHUySGUwaE9aUTRXMXFWa0ZWejBxeVRqbXNXUlVwSDBYZnZuODVPSEhWVmZlWmdTRm5PSDVGbit6dlZkYjF2ZzdublM1ZERWZlliWjhybXljUmlHczhzSEFxRzI0Zm1qRGxiMlVSZVdRN0Fna2RaeE5GZ3hUYnRmZ0YzdXkwUVdHSEVuWEtGQ3hsOFRhTEthTHJtYzUxWHFiS291c3lnK2E5dVozL2RPaEdJbFRyS0llSWJWT0l1aUpZd0w4N243MjM4cXh4VWhLTE5NRncxWVBPclZKcGx6YkFDTHdMSkN4RWRjb3hTY25FVjlCWFVCKzYxcHFIaTB6TTc1U1pHNVZ1YlpLWWlVR1RvbkI0SGtnbFA3VFd4aVVWRm1ySnJBalNYaXN4a3BJZUxDaUc3a05ua0ozY0dRR2JudHZ4MVlKZy9VYTZrRkJqQmJlcVdoOGJWMmFSaXBrMWFpditFK2FjMnRxK0t4ZGw1dnU3L3hOWWFwM00yc1dJZk9xRFBjaEF3NzNuSlJORzV2aVZoWExTZE5ZWUJ2UFg2Zm01N3BiUjIxbWtxMWRaMXNLZk5xYnRyT0ZjQjgvaDExSDFNdWFaTzdLR0ljM0xwajRQV2pZQWdLRTVCTHo1SmVvVUtxYVYvcExyUWdPc3lYT1QvTzV1dkMwT1VHcEdROHV3V21FNVZrQndwOFRqclJKL1VCMEd5alhXd1Z4UDcvc3NwYWl5NzA4SnZJQ0dVMFN1M202R0FPU1RxZVJabVptVUI0WjFTdFplR1Z5UzZCN2F2enhKRWhESHBrZVNEb05VNGhBTmcxcE9EUmEwdDB5c3c2TE5nVHUvWjhDU2dna0dpeHlEOW5kMzlRVkdFRHE5bWNQZ2RsMkpSOFlwbDU3ZGR0NWphYnphVHhsUWRNTVdiWUR0cWd4YmV2SStubkp0Um0yLzBPeFplSFptMk1QN3FYL29iOVRKNDA3OXZjQ0RBNUpLblNRQzBlcDdpcG9BUFNCb1dzMWxYRFZ2MkluYnJHbnpJeU5lSmd5OGlVRk1yUjZINnpBMzhMNGYzMytxSjFqb0JHdFRNRlVHcGdXaHI3ejN0Lzc1bDhIbXE1bzdkMGpMNDhyc3dDL2dvaXhhbEdsN1Y2NzZSdG15NUZQeittdy9PRXpIN1FIUkU1K0J3Q3dWVVk5TlZxVEFGcXk0cWlmVFZIdEJGSUliZUtHeDJEMmQwSFlZNmdPb1NrdUE4cmJoLzA1UnVOaXU0Nm9talNwYVZQVUM1VXZPMTBLUGpZL0JxcU91UDRTbVhEVXlkVVFDV3h5KzZyTEFsdUhxWVdaSnIvREY3aEN2Skx2N3JpKytnNzUwdEJXUjZKMEs2YURNd3o4T2g3V2hGNmIrQjlvdHBOME5vQ2h2Mk5lVEpVbXlhbGFqVDRqS3Ayc3V5SXRRMmNORXhJYUk5cGRLMW81aXo4SmFWN09hK1ZyR1FZNzdYdlU2cTdySkJ2ZktNL1p3Q1RvVXJPQ25IL215c1BNYmJ5eHdXTXhscUJuOCtQcmlCMkFZYkpxVmRPV0hHcy9NZURmMHY1VWwvVXhDQy9JRTB1bkllNkk3UklOM05WUmtiUFpGODNrK2oyanRxUkU1M3dQQ21NdFljbzczM01vVWh6UktwV01wYVVPcFIrUXZqRk9hM3M5bDhnZ2pBYTQ3alU1ZnZRbWUrMHNBKzVIN0dOamdpYkNzazZIQVVaTmhIQUZPdkdDaTlPeUNHWHA5R0J2cTRYdENJZDVuQjRwVDZFZlFmY1VIQXRjaENVUkpYcnRXWjdpcWp6ZnkwNWtPbkJMb1ZCbUxGOXJnVXRoWjU0VWcvSTBmaFJCekQ0dUNIczdxOFlmaXlVNjBvOXB4RFdVR0hOZkREcGxydHNhNk5nZlpGMkQ1RWhJb28wcWNJaUJScVFxRUhEdTZjbUE1MFpKcEZuVml3TFVSTUxxQWF6VStua1Zya3BGUUJFYzVIN0NrVVRWMlZOTXFHYlpReEVpOGlDRS93RDhZQUhUelZIRGlhQUJzYlg3YnFZdEFyYTQ4Nmo4bGlKT0Jlc015MnpOdE1MNUZXWWcrei9DVmNUakVKaU9DS0d6cTAzdzRKeXBCY1UxZ1IzNlQ1NUFmUzNic25hdmhIUFVyY29ZRGxFSks0QXkzSGFkYUdwWmlyVHJFYlFiU2krQlczQjhjUE04TWtONmhsQVVXWmp1MkdjNFc2cHpKLzFKK1dReUM3K3JSSkpRRXVLZ3MvUlRlQXZGbjZwbzFFcGN5TDVzUm1SMzRNUlZZL3o2bjZraWxUZlhqeTlwMDR1UDlVMldmVVJTMEg2Tk1wK0Fqa09GdUEvVlhHeGJrUmh1TFdrdjZyUGR5dXg3R0RwMnJ2bHpleFNJTHRIclN3R05LQ1lNc1I2QnV5aithNnd2L0wxQktVZjlsT1VNOXdGY1JsKzg4UUNRaFRTRGhndHBxdlFZaVczbmJlMmhyb1lDaHpGL3Z1Y0JJOHEyMzNuQ085T0FHbUJqclFPZ3VzbmdYY2JycXA2SGp1N2daQjRybzd2UlU2eHdWd29NUk5JWWx2a2UvaWZ6cTFKZlEwa3hLSTdXblJVVjFnejNoZkFORG1oblpDdGRUK3luTHIyRTBwbUtRcllGR0tHU3ZQNExFbkdUY05VbndvaDFOSUgzbXJKN1RRb1kzbHhBZFVNbHhaaEFFR1FIZVRrbE12dTBrd01wM3pjOHRmazVHdXgxN0ZacFZhL2thWlZzTGo1b2JrWHpMWk5Dcmg5YmNKNnhpeEk0cTgzdUgvbDFJaU95YzFhWFFyQlFWWTlmOXdWWk9wTnpqbWNXeVdZRXN3bG9ZNHV1ZmlkOUEvUFppbTBYcFRvY1JibVJLTWlKcjdYb3pjNlZZNjRQMnpOK3JRSndkc0NhRlZHRGpOVVNsenh3WjhlVDU3MVplN2RFZXRGTHR5TXNwM2s2YUZqMFlSYWI4NXlseGVGNUVTQmtqQ3VIRTZJZmo0dlBGSWNOT0phWWZqbkNkSWtMcWNndjN4azJEcmlpMTk4L3pmV1FyakJid0NpZUl6dHFWUFdDRTdsamV5OEFoSVZVN292cnZkakVZNGYwVVVtOWdPSjg5K044VXhJWWZpRXdiZFJLVUlyMXQySENGQ2o1SEZHY1BocXppZnV5U1pjZ2JhWC9ldis3TUpiSS9ZQ1hGUEFubGxSaUJ1U0trWVk2Tk5SQ2t2a282SE04QU41OUl0V0FTckxVSjFVYU9ZM0N1R1pzc0g4WFI3M2xBL0k0dnJISFJab2p4ZlR4ZXFKc1RHMGYxYlpkNUlzbzNyVElQMjlLbmNJYUNPTEduVzJYaXA5Vzl2QktoRm56am1jOTEwdGxUN3YwOXFHZ0kvR3hNMWRwUzJxSkVyS3VUbzV1dXBoeU9jTXpSbVBVVXRKbEI2VTVPRWtOK0dJQmlCeVBJVzQ2ZTNmVjl5T0RRMVZyVmtxRnFaQlpwWXd4eTlKQ0hQWGgrZmhoaE5TV2lZWnQ1YXVUT0FFUHBvanYrc09YS3VQOTF5b3gxT0pRTzBUNmJKTGhVY1pOZWYxUHA4MG10K3c1K0EyVWZvcm9XVGowbWJkaVB0OWFsSGtiT2hENGhOM3BOQ0o4WEFyUlM2S0ZKUzArR1ArNXdVaTBVL0p1WEtybGdhaWFjUklOMFJzaFo3S1U0TS9MZTNZYjRrT1pDdVFkd1hxRGh1emNpVkFDYUpYOUdlSVNubWRySVcyOVN2SHgvdTBML04vWXI1UEI4UkVYZjR4Tk5hUUx4UW0ra2lvWUVYdlZkRis3cW9pNThvcjc5TXZaS01aYmdEMk5NYmUrdXVEVlc5V3BYRTcrVWFlWWlIV2dLdW91QXhSY0ZxMFJZdVJWcGVsVEJxUFJoeCtidnFTZ0syMUFZeTRRcExDR1R2YTRUakhiYVFUUndFS2JFb1lEMjdiUU45MWcvNGl4d3FwZW9YM0F1V2NtbEFFUnBwcDcrU2hxVXRDRUlTbTREdEtNV1NMQUZDcDJmM3A3UlU4MGVrWXhSREhyc01DQlBGQWVyWmJiUnZtdnNkenZpbVF4cFcwc0RENGR2WkZzeXQyREJmbXlpVURRV0Eyam1xaG9pVU52MU15dVQ3T281VG1SaUtJZVl0RGF6c1gwUHBRK0hmYW5FY1B4eURoQ3pqaW44Q0p1dE12cHF2OWl3QVBHUmNaVXVZTHhheFRZVmZ2ZlBlNW9mdDkvNFZSbWM0MnV2RGVZYitrNjg0UXljWG4yMlo5MjBoQmw0SHFyUXA5NWpYaXJoYWxiRk14TVA5WHE5bXd0WndVTVpCdkpGTWZlMnhpUDQrMk5ReGFYcGl2ZWRHMzhSTVdUVHRZWHpFN0c2UlBjNWc0RU52N1VYbnExNjZDdll4L05ZcDBzdTNubDZzQ3ZsRTJXU3V4TVcweXhIMzlaMU5RUlZFNzdEcDI3U1VRRWo1c3FWVGpzeklBTmpROXVDN2VXQ2RGUHErdVZ5YTRjSWdRS2FyNFovRS9NSkhlTU5HR0xpUWNiNk5jdkwyNmZXTVJDZWo3UzN2WllRdk1FTHQxTHhXMytTWHZRZHpXWUE1TVBiNHgyU1EzV0tlRW4zdmxSazFXUEQ3bUltNFhrcjRrbnh5ZURyNGZIY3ZVNnZRZGsvbzIzSnFzcXFlRWRucjhGVFUxMXh2bFZGMFFJOUx1TG1pbVNDWkpvQ0xtaWFVK0YxdmoveUFNOE9ncENCTDZPT2hMa1NlZ1V0Q2ErbXk5Z2wrVnorOVBmd3lZb2diRVdSbEtlVC9QMjN1Qk5sOWxmNTV5MXVVc3JlOEFxQVdCai9KNmtzWnJVeWxWSGVnTndHbXlmbzNJZlBmdTBnQzE4cnptdVUrck9LbWJ4ZXVnYWNRNHIzb2hxdmVQOU9pT1JHQWlmMWVlWjdFeFZ4T0NjU0VWUmRWSW02WnJtY3V6d1l3TWp6dXZlY3VxTWw4UUkxdzJuY0lKcDBSTTZFdDd6N05Dd00walorMWlxdTh4ejdPS2Z5ODV4VzJBWUtOWGFGcUJRRzBEQ25tclBwSlBSM2JiTXlkUHpFZ21DSkpoSG9ScmFMcVM4UnBoYmc0bzE3THczN0VONUE1b2MraUdOeDVFRzBBdmdTM0ovNGVRd0R2Y3hPMkkzaXl1MGtpeUZ6NUk4RVJjZzRIR0wwRU9YaytDN3RkU3N2d21JTkNzZUVaaHRWMlFhSzRHODBvRVF6U09jWGIrZXU1SmZqS2V2YlFOY3U2UzIybW9vOEtWaGR6QVVscTI4dlY5OXJBMWM3N1cvaGhGK3lKdzVXZzg0dXlLS3dpZGtLSVRjYzd1NkxFVXFZQzNVdXlPN1l2Kzg3bnhUb01wSDlqY3FXNTlVU1RjeGRhYjFOK21NbUFIVS9qNG1rWDAzU2dzcUR0Y0lHeXpYY0UyVUhvQ1FLRGNWbDVVM1ZDR2NtdnFLUk43VTE1Q2ZrTVlJSjhwVUZJRXdiZ1h4aHV2YmV6bjRtMCtWVHEyeDNRU1ptekxOc2tMbUIvSzV0ckJCTUR4MmhDeWFlNmtGK0JTamRNOWUrOXhoYmJIRTIwQW5oRlJVZVpXLyt2bDEram5YT0JzcVpvL3BKV0xBSkI4bVVxaEZ0b3pQNVlzbnFCUGZWNnBkZXd6RVRaTHBkeTdWOGNHSXoxNHBtU0RRY2NrWlVqTkVHa2Z0MWlhckwwb3RxWTJBc2c2eDBrem5UcEE4OVNDbzFCMUVJM2M1Y0tLZzN3blJlanJNR0c3ZDh6SFBraWw4WFBIS0F1dHhwdW81UEZKbG1VdVN3RGwrbWtmS1Rva0ZoMXBFRmc3ZHJLLzBkRG9rYVg1RGsrZmJlSzhydGp5cnFmNWl0SDd2Z1NZZmhCcEV6eVhkaWlCY2FGWEpaYlIyWnBMekdlRzBoUWc1MW1kNTMzNVlmVVc0SVJVSklxTmVndGRhamZHMnhKTWRtN3hkbEg1dFI3ZDhnWFVtQjluQmlldmsyNWJ6K1pCcis0QndHUm9iZmtobTl2ckpQRmRPRVJPbVZVdEF1c0c1YVVJMFRyWkNnZCtzb1UyeTVib2lCeG9xVDAyK0szZ3pTcmZXaElGb2ZJVmpMbXRYbDFWc04yalYySlRTa1BQVWVPbFVCSWEvUVByTW5VLzhFeWNxdFNCc1NqN3prcG1jbko1RGNXc1VTS2g1NkorMXlSU3FXenlDclBZZG5QVllSVlZQSThlUkVmTkhqL1JtWFJzUmVoaWZKVi85dzJyTDZmWnVPYjdnNFpUemZJbHluRHBKWk9IdXg1NE5LNnlDTlBGUUZXYlBSUzBWQ3d4WmwrNXozQlNJT3dRVDM4WWluQTZidE00aFkyNjUvQi9zR014dW85K0VjUjlJdDJPL0lzSllYSWNLdU1qK3VKM3dHYzQ2SC8xR0ZqVlJQZU4rTCszS2ZmSjQzTDRkS0NiYjJMdkZxblBvNldNQnlwVWJtV1ltS3hDeFp2S3Eyd3BKQndZZEltUWZIZU51d0RSa0VaMHF0Y09samNqUUNsWGkrMXVKZWRqcGgrYzhXZlpsdUI2Q1doSzdPTU1Fb2V6VHZSZFp3ZTVYa3d4ZStmcmNSaVlRVWtXWFpwQklwcSsrbHBiNGoybXJhVkI1NTliTmUvVmgvYVY5NVJsTmNpVVZzVlN4ZDl6ZzRlT0FYQmxvN2FyaUp3dUo4ZHdJb1lnaWNFZ0FTUEdrYlFyZHNjNUM5UFVHYUs4Snkzc25ldldtd1I3djhxSnRLK3B1bEVyODRoT04zWWs4WjhuVjNFaUJZTVVKZTd1K0QrdTRYb05KOW93TVNqZFJJOUplMXB2cmdWRnBlSCt5U3cwazhOMU5JVEltWVAyaVFRblJ0NTRDci9KSDJFanNUTEUvWlRpUllIT3dUOXVkaHgwUDQ1ZHExV2hRb3IwUDhlTTZKMDNtRVcwSVo0NlVjQmZQVm5IbS9oVmtnL0hoRVZHcVEyVEN1Z003UW1hK3VkQlYyT2l1MkdVQ3VWcnhjc1J2NnRab3VRWjlheUEwR3ZoWUJFQ1NmdlVjUDI1TUttMU5idmU1ZGNzVm5IdUhjTTFHc00wQUVoUitpRUlTZnl0R0JZZGc2b2ZuL2R2ei9NYXBtcTlCSEJqUnB6eWhSSU9vZEVNRFFRL2ZBR09XZllmRFptU0ljVXN5aGdidjhTNFpXQkF0c1RCQnF5Y0l2UFIyNjZ2R3BJa3JIdUUyOXNGZk1pdDkxTWM2YmQrbUFDWjVRdmtOOHhLd2hiUGNOc05DZ3lrTGtneGpTbThQVHhTWEc1YTFwK2RsUmxiMHQ3VUcwTGdldlViNEkreXVJTjZ1bURoTVVtUlZ4clZmL1ZWNlo0UWE2UENLWVdzbHNPcnZneVBpdkhoNFN2cVhvNG9zenRTQlkyUUNscXVIL0RwazlTQVE1WjZMUTdnUmZocFNjaGZDZFVDdWNJNGgxWFJIUDA2NjBLNWt2YUI3N1JTWGNiU3RVWEFvTlVKNUpCWU1XMiswUnJwcGVMejdTdXQ2UHhJbWNRWDlFVGQ2SUhuZmNnMm04QVR1UEVObXRodzdveURvbEl3OTRyS3R6NndxU0JBaklZemFtbGZScnV5ZnI3WGJ0M1lIVTlEZjN0Qm1jczdCUllGYnpqTGt5TVZZTDVsSDAxUGFxaFdZRXl1YUdCMmllZWZxelVYK24wOE5mR0hXaEYxbHprdlNzaENodEpCTWhld1JFWWY3TFpCcjcrN1B4NzZyRDNsSUVEMmVuREhIOWRpY215RERoRGxQZ0FudWQvYVNpL0Q4N3FwNGEwWkFoMlk2REJpQ2xOSUNtZWNlYW1FWFczVy90dU1jNEx4VERYbHBRc3RlUEUrODhKMElCRmlYaVlhMVN4NERDeU5JUUEyai9ibU9LeUN6UzNzKzdCTGxodkVLTE9YNE5oUEp4QWtrdEExMmFJRUtmUUpHZDFDM2w1ZjdDQkFES2VPNUZhWWVxbFpWak93bUFFWGUvNU5SOXkzNmxLVFkrK053cUVTY2xLL1k1V3N1QmRBWHF1R2Z4cHVPT0RHaUNROHU5eS9rRHV6RExQT2wrbFBhTldlZU9uR0NzcVdBOFdiblFETzZDMng5MGZqZTFTMU91eVNKNERsSVpWaDZZY3hXeURsT3d3Nmt4Q1p4WVNBd09oVVU4aFJuRnA3RzdqeXlSQ3RoM3NTRnU4bFA1ZklDNXJnZVpnbkVhc2dneUlaVVRscFI4dC9PbHpOc3RLZVNMenI5SWpXbnN3V1RBL3VrQkZnaVBDZGxxb20veHJmNktGdm54WTlFTmpZYmUxenhodWlZUWd2TUh2U29FR25MRHJrVkNNMTZCeWlkbkZBbFBia01jWGpHdnpXcFBBS3lTVWhZVGQyUXVwZWt2SGFSazR1MllhMlNVcU4xN2FUWjUrMGRiREhFQUV6WmhTZ1J1QW9pZDhyaEZYS2RhM3MxSkdWbWpXclpRMlBwZFNQWnBueHdJL2VJbzExcjdpTkZyRndmQ094em9IVTJlSXFmNE9mZWZDWkZZMHBqMnh0U21XUEpETkRHRnJ3dVpVNC8xNmU4V29OL1llMUJzNnZIblVhdHhDUXM5WDk2dnRHTm5PaEdFKzd5T21tTm9XbEFRbGNwZHRZSHNRNm1TeWdaTnh5b2ZPdjI2SjB0S01MWXFKRUlUNVNlMU90TldSd2NMQTJpMWhIUUU1TTJjalhuYlV5b2xOMUp4clE1MVdOeUdwT1JkRmRmSEl1aTN5NUh1MThva1NVak9heFlKVTNDNG1ac1oybFJyRG95U0VmMTJDeVo3eld3NHpnelJpeUl1dW1nV2tyODlzZXN5SDJFQXR4VnNraHNablVmdnhNb3Z5S2VrOUNZS0hFTFZ5TXVuWUtOUDV5NVFUVjFDaEdIUlVCMFVsZW1LRURMSENZYXorUnpmSmoycEhxT1BWZFB3cDY4YXNac2RrTVJuZjBRckJvOTZ5SStzck55cHU2OG1ZNDRZL3lCSk9SK1RxY1JmbXNxTllYeUlqelFkQXFTZm5HWUNKQzBrWEdlYkVBcFRQY1JxaHo1TDB0M3ZpM2NVclg2NkdxUVlXSU9sUFFPRkZQd0xnVll6Z20yK2VveVpPck1CdkNlYlQ3Z2p2OVJlMXRlYzZhbS93UG4rYUtXL3h0bzQwMDRrR0pZM0JsbXdtM2lGSnl5RWVKN3YrbldZZWtrL3U3OEFqcGdMUFQ1NTFqaC82VG94NjdUQ3ZkTEw1ZGRlOUNBeldzWWZpRmIybHhZUTd2UitSLzVtNWdlcGt0WU11NkVqRTlRbmUwaVVwRCtaWk5aT0duTm5PeVNMWXYyS1FmS2xjbHBmSzhCM2l4WHU3M3NoWllwb21TUVgrMUxhSG1SSUVWcVJIeHc0ZVFjd0wrQjJmclVkVnNrRnFvY2g5dVRRWGViQWdvRExEQ1J1TndIQVNLQUxmR1R3MmdmTmFLWHhPMVMyVkxSdGV0cWgvVEVaeklXZEhLc1hkY0ZoK0F0eGEwMjV5T1NVcUY1dGk1N2I0S04raGY1MW1VS29RSEJlZmI2ZVFrVG8yOGZNbGtDaTQ0bEdxMDF0T1p0czV6YW5yVXVQcllGOFRFRDJBZjk1R0FicTcveW1RQ0JzTytCK1dMTFVyaERsa1EvZXBZZVgrUVdMMGNMdWVPTHR4ekZoNi9TdVhMWTFMSzF1U0pnQmc0emc3a0p5bnk5Yk82YXRpTC9QMjB2eGxhRWYvZjcwY3Bqb1l3L1pwN0VYL3Q5NlNWWjRiL3FVTWNzL1lvZWdGL0hsaHRGM2hUbHhpUWxUbzdoWDRPRkJPQnJIOE1JS0swVjNEOG1NdDdQMElWZGJJd0UrWXBYOHFnVG5hblo2TS9nN2QrOCtxWkxhUDdQdXZkUTlrNkRKU0hENGFnYStFK2xBeHlZVm01NUdSSTl5VUJHc0ZYVGE3Tm5mNTlFendPLzl4dnBUbmpObWp3cThDN203Nmh2L1kzdm9mS1NhMDdvTk55V1liSC90cWlpWnJaYVNzd1phemhYMHh4TC9HRmtYcFFQYnJxb1FOZEk4bHZJWG5MejZxQ3hIakxKRG1tWXlCMEhtc0dPcUpDT1ZFT2dGK1U5SDNyQ2JWcFBWZW4xYk9TUWdGTThKMmcremZHU3NmdDcrMDRlUW1HbTZEd1hZeXkzcTZYbnJuN2o3T21XUjlUQ2s1a3FhQkRuYk9nR3FZNHoyUmVQMW5GNDkyVVR0c2RVaWt3MVJ4TFVvcWhhT3M2NXEzM1lzK2gzY3RsbG9XVmczZ1hmYkdWUHladGVHNUFVbWhVVWgvdU9BYy9FNGhvaXBsa3NuQTRkVUJDaDBzK0Nhd203OHNwWTF6S3ZnRHQ0VTA2SEtteEdqUmRFcWlhZDgzekNyRy9xcHNEcE01KzhldWZEZTNtTWd2YXBUNmtGUnN5VDRGS3FxdHVBRngxVHNZOUxzK2dlTytyQ2RZcFViRklyeVZTdjhVMlFkdjlwUjBjQm5ncDhnb3N5UTd1WlkrckFRQzgvT3lRQW41NmV0S1NMMWR2bmJ3VVc5eG5wcEppeStINTNVRnhESUpCWWRYVFMzRW4rbXFTNTcvd0w5bHZoQmdFY0FQU09tV3Y1Rzk4V3daLzMzSHpqbWU3anZOVjVXZWcvQ2o2QUVMMXR5Z3AvRVN0aW91TWtndytaZ08rdVp1MXFoR0duVUM4WW5CVmVsay9HdkMycTJNZGxTYlBWUTNCWDBWOE9qUnh6ZHR4S3NUMEdsUGNoa3VEWE1IakxlYnlLWmdQdU9wUVByZVRCbU5ud1NVSjUwKytFbXBFSkFSOWZJSlpaMk15MnR1ZU0zM0MzNklNcHVGeFJaaDFuNDlCWTNYVllSaFZsYlJyTUNsTkhtS0RUTDZubktKZDRIVi9GWityYmplNVE2dk1OR0hCK0NQVUlIblFIb0Rlb20vaXNldDBmOWxFbVB4SXVjSVpnZXNaejJad1M2VTZJdi8zL09KN1lpY2VIc3hob0xqeUVXT2RHdkowVkI4YVZmamJJM0pZYWxXbUVRUHZwa1FSdWg3S2kyVEtQUFBic1hSeklvMitBSTNiU3hKVkk0MUtyRHZiS2RMeTlrb0cyeWM2R25nV1NlN20wVjlDVVBnY3doS3lsMGQ2K2Z2cHltbUpPTTZSd0VoS0tyUm5PcUlDUXRrdjArTVpYZTZrbDBUTHJvM1kwMGxwNk5RbXJLcVZGdjlWZXdEVEE3NW1KcldZc1F4TFluZ2ZLQXZzUkI2N3VyaGtvTXF0REJHSzhyQ0Z3blhyeVVZdVd2Q3pWY3JEazNBTEJJaUlCaVpmRzJhSkRBb0lSdW9Sd2RVdnFsZ2lxNStxbDVWZ2VtTERYRFIrUFNTK0Z0cFk3eTlERktLMGdtbkZSN0FoS25FN21oQkV5RjBRQUs0Q2FUMVJ5WWhFcXVjY3N0UnFXbHY0TUNaQVVpeUxpWllOckE4WGtuMGw0OHk1bWhoOGpIMlhRWlVrcG9oQUlkOVo4N2lkS0VJSVEwUkhjeDZnakZ5UE1PQ0p2ZXg4anFPV2J4UU9yRTFtVko4eDNVZ3Y0YUg2ZU5uUDRMamdRWnNhQ1FCLzNUa3prNXRFSUY5OFRUYmlZRmswUUd1S3kxUmR4aGdJQzl0Q3RJb3F0Y3JIaWhhMmdJcjdaMlFXRFZheHpYVXFNMXhzTnVKYVBvakdrK3RvSkJQRXRRTGtMa09mR0ZKNTI3WENwMzIrd0kyOEVXaE1QZ1g2OXdVd0x3ZnRzWWpQSGpwdzUwS082Ujh1Wk90WlB2WDBNenV2eERWUkRKYnhwN2F4UnE3TzBRalNFTnhxOXkweERlaThQcWJKUDVpYzQwVlgrbWg0Vkkzdmlzc1RjWExuRzNZbFY4a2xIQ0IrcEVDbDBRd3FzMEpqUi84MHN6bXhjOVBXaWlhbUhteS96ZDcxTnpaZXRRV3dPT085QkJLVm5VYmdSUnhRVndnc2N2Y0JER0V2WGkzazRGT1hDRXdOQ04wU0lpZnBLWTZUUFV4VmRjdndndWd5TTFVUUlMcEpSL1BLWWdHOVQyaTRJNWhpQnZEbzNvTStZKy9kYTZ4TGJ6dk04b0psdmhUeldKM002SXBxbDRMT3NlSmNKZDdZZUs4ZjFpcWlTMU1VQW50ZTVPckZpQmF5SUpzNUVHeUdoekZtaXJwRVUvNEI0SFRHYlo4R2ZDaDU4TUN6cGFoVHNCZmpjRVZheXdnYzRYUVFkWGJIWlJLVjdhdUx6bDVBOVBoMldZV3BRaVd3blM4U24rcFlUU2lYMXRzSlJheTg1a3RqWFNGVGxuU2dscDltNGZSQXBhYnU5VzlFUFZLWk9zbE9SZnlGYnlqRndoVmZhZVJmakJIWTd5eUNxMW9QNGx1WmhHcWpkcmk0Q0ZxNTRCVmNrQWpoOXJDU2libVNLdi95SXR5YW1Xa3h4ditQOThWNm9wREhxVnhwOVYxTXVlZHhvWm1IWlk5RTQrUkdBYkNLa3F0YnBidys1ZUVMZ2x0MjVzajVZY0czNWExWi91dTdyanlsTXVldWg5Znd2ODJiczE1eVd6dkhSUHpoMjdlTUxGdWp2ZWlGUm4zQUZ0aWFSQ0gwYkZ0N0VGVlBWUzJjRTRkMUdZQjBaZUV5Qm12aGUzREU1TFlycEpBU2ZMV0VwYW9CbGRJaTV4ZFB3YWxsMTJTNW1lbzV1UnVpZ05reVl1U2JEQjh0QTEzL2V6NTNPRGM5RlBGUDZhVVljc0Z3RkFFb050YndaMDNyeHlvMmpHWVc4cFpWeHQxWDV0a1RTRmRrWWhCTjJLVTdXSWpGSWNyUUl5dlliMFQ1U0tDb1REWm9OclI2aUVyWW55YmNxV0ttdE5oenNHS3cxM1l0YjZqL2FUY3RKU2F1NGs5SFBVazUvZmxPT2RNSXltcStWeFpaUmQrTEZlUDZpK3Q1RVlZS2tmYURmKzdPdWs2TzlRZFhqVlo2NThUaFo0VzFic2paZlQzbzFrMG1BOE1WeUpyMmMxN1N2SEFMOG56M3lZbkxVZ3doemZzR09iYUEraEJHSDAwYTc1dG5GbUJKOU1wYTNjYXZlYjdXRkFLSkRnWHlwTzhJZjNVekh3RE83dUpzaU5IajZMRUI0QlNRMUh4RGVKUXFld0s1NGpBUTdjN1dxM3Y0M0grdTdQaURBR0Z6THNMK3NIeW0xODA1cTdLdkJIcHFVU2FxMEZ1U1k5TlFSTEhqUERqOVpaQWpVdTQvdUhlR3kyaGsrdnkyNVkzeVA5c1NiNzRPZzIrMUljSHoyTzNrMkQ3N0pTR0owbUV6V1RBZndJRjdjNUswdzkwQi8vZ01wYnV5SXplL2JzYWtUbUI5VVkwTUwvQXlBWktWQlRZMGNucmtPaTVBSWNkZlV5b0h6SHBsdTRaM2hlZW1qWTRsODNwak80S043T1RkeTZFbjI4M3dibU5aNm1Nd0NHaGc0eHBzTldDa3h0UGxhU3Z2RXVTSXpnVEs0S2kzQ3JuZSs5UlpFd3RUVHpWckVLaGlac3RkSTQ3K3FpNCtad3FQYjR4SWNSYUwyMVoxV0NHOE9NeUJ5amp0MGJLQjJUTVFzcDRtaXFhM09hU2NWVTgzV1BBVmRHbGU2MS9FVlI5d2RoUWJFK0JvWUhQSTE3SHVKQ2JTbEtPYmF4TFR4aWFvRkVLZ0I5TElXUnQvSE9iZkJPWEpwbnk1Y0tGdkpiaDA3alJmOHVuam05aC9zaWtKNHNrZ1VnTHU0enF3ajFTTjZxOHVZNEtKRUluNkZ6RVFnQzhDQ3BFYnVTUndldFVmRzBmR2prNmt1UGUwQzhxVHBLL1E3UmlkdndPY1F5eDF0V3JWaWpya3hNTzhQZnNVdEVsdUQ3VjdUUzUxNExQcDdzYmZaWWdycjY3Vjg5UnN2ZWN1UHdKbUVRZ0tLa2RFQXVSRFlqbUM1WGtmYnI3M0xTNTA5U2FGNWdPeWNtY01vb1hNcnZCQnR0eU1Zd0VVaE9QNUxZd2s0WXZ0QVd4RWp0NUVlYjFLU2JTeGY2WXRBMW1zWG9KVGhFVzBqNW5OMzRwTy95eEhoSHorUEpwNWx2T3FqbnNQaERBWDhwWVk5WUQzYWNOSVFDTHVNOUxVMEViQlB3WHc0UjlHMHF4TkV2MTZDclRHTHkvanp2NVdKVXhTVkZoSUhMaE1xb3AxbDNpZmx1cDkvRTF5dDNBRXJYRU1jRXArNWgvZ0d3a3ZVNmlocHhCc2R3cWNpek1KdSt1cExoQ0RlL2pUREpsaUNKa0dNTjJWbHZvYlV1WDRFM1dsSzJDZnA3N0E0bUJNYWZKTnM4TnRmaHNYckFqMUxGenZHZlJZMGtmSXhFRXNNU0YrNDA0U3NicUlZTUFsRjJBTDJaY25pMzd0b2RkQ1kvMFJxd3hLOHNTRWdwUGROY3pWSFIvbWFycytrekhyWXUzakxraUtWK091MklKc011RlZWZWliSWI0dFFmK3diTTBNRFIxV2JNc1g5a3JDM1VVOE90aGxQQlF3ZEZVM21xT1VBeXpnY0hUa0J0L2djTzNkTzh2UkkwczlnT29nVjl6SzNmdFJpMnRNUGdaNDJPS1FmaFo3c0NYN2s2bnVvaVNTRVFFa1lZSmVnL1V0eDQwbkoyelNSMldkejJ6RzBIQ1N0bmdJZmthSStaQU8vdDRaSldSL0gyUHlkallJVjd2WDlWZ1VoUEZ6bXNlQnhXY3JhelNnaUJQOHZ6VnJWc0R3N2VnMHNOSVBkNFlpK09mUDkyNnE5MzdMMFdEUStYQXVpZ3FrbmpwTS9XT2ZRd2pxQTJaNXdXM1RlWUNCVEl1K1U5YU1HTDdWMlRqQ0p3Z2VXQmlCeGEzZTI4MjZJd3hsQ0VVT0lNa3lVYk83VGovUDhUZmpsVlcxcTJSalJjV3k5bFhCVTVTcnJLK21QbGpVcU45ZjFNUnpLQjZRa2VRL3ZYQkFpdVhpbHpGb2l1TExyV2l0b1hLY2p0c213RVNmWDdjdGVBT3JOT0RuTXliS1pWWFIwbUgreS9uUHZZYm9tOGxWVUlIWldURkFBR1ljR1YwYWRFeVV6bGVMb3BodG1POTRYVW1GdEJwZTFzUmo1Y25BaDBQWndKUCtBRkV1T2U3SjNFZGkxU1dpcXBIdzVMN2hDd242Y2VTQUlLOU4rcWdMdTNOdXB6U0d4ZkE3eUhlWUo5R28wK0IvMnBNUG9zemc3MkRkM0t2VUJQVGdiMi9hMlF2SWd3eWlObzB1T0VVTjdPRGpOWlBSK1hVclBLZXpXZXFIY1lEUHJ2K3d4cGFqeDgrbDFWS1V5Uk1MQ1kzcVZXNy9LeXZEVERRamNTZ3NJdjdSVG0veHRxTnNmK0V0UldkenhxamVKZkhDQjJQWjdveldhcHpWeXhtM3pFbVRZUGhSTmtBWG4rdWV2L0VWaUdFdDB2VGRrYXhpODN1UGdCU2VaQ0h5a2g0VUN6N3V2VVhkVXBvbEVSUTRjVTVseWNLRFAydzBwU1poS1crNEJmRzdXZHUvM3laNkVrZDQ4dWYrN3owYm9ETmF4VmxGR2pJbE84cDhGOFM2cnhJOCtsVmdmZU1wVk1jd1lvZ2F0QXVnaDdQRmxUMXpxaHRZMXVpekM0dG9TbzAvck9lbXN5b09USlNBSFhKcVgyYU9ZcFBSNlFWcDdVQXpRWmV4OXc2TFh1aFJqRld4VnIySmUxUVZpMWZuL1RlUks3aHBscG8xNXhocXAyRXJwQ2FHLzRqQ0hEcU5XdW5xUDdLOHhSeXVZekJSei9OU1pvU2h3NWo5UysxRUI2RVdCSUU4RFRvSytxMEFudk1jZGJnT0c4UFpFWWNlOWVHYWMyWVU4RXlyV0ZpTzF0bmcrZ1lMNHFoZWNvNzNUQ1JCTFl6Yy9yKzBIeHN3R29lem44c2g2c29LWll6ZjAyV0xZeVdoQW9BRGtGL3JQTmgwV1JaUGhyTDJ6VEtNbTJveExIM3ZQTkVWQW5lOHZJWWRQaHU5Rkx5Vi9jQ3lKakxlSXNvMG5SV3hublRMTDBmRFRRVjVBMk9JVkFlWUtqUWYzOTdMWC9IdFc5bnhzTnVzcGhKYlkrY1E4eFZua2pMS1lkRFMzYkxnOHZUTXJEcVNJZnFKeEkrNkpSSjM5MklTektITmlvRHpYQWVDRFhVNFM1YzRkYVlreGtZNkY0VHNLbjJFMjVPNVZBanFTZ2VtMlNvVEdidWQ5bGUyL3RGY0VCb0NteXRjK2dDUjEvWk91eHpPejRtWlFHUjg5WEpPaGE5WXkrNHZXemRPaUU3Z2RNa0JnRExPa1ZHV013UExCbWdvNmJHaUZHRWo0U1hoS1Z5Q1B4OHdzRlNVVm9IUVI2bFVyaE5RaHM4RThYMm9JTUZWRDUwVVEvNG1zODY1emZoejEzQWRBV2RtZGh3OHpUaGl0RlRqcFlBbEZoRWZjREdjdzBVQmpxT1h4Kyt6a0xtdFBTSmVySno2TEZyckNkajByVVl5UWZGS0RkT3JaNEdUMlJ4OG1SUGhVbmlsMTlvclU0Vk1UNklSVVNkUEhLUmVyQy93eFZDTTVSdDVHZ1NPbUxTRmpHNWx2RXdhSXE5VVZLSm50bHNONTQ1K1V4N0ZXcjBoTTVxL2Fyc3NENnNaYzZzZTNzZ0paeHRQUmcxWnJ4dEUzc0RKeEtkSUZlcnVWWnVobGxTeWVLMkFOWFZueXBjK2xESUhlNG92Rlk3VDd0eGI2MWZzL1pUVnFCK3RVelhxK1NjUlhYL1IwekUyNWdQQTducjI2clRYVFUyOVRNRHNBU0h2SDZwZy8vUkhGTlAxZTRMOWlzS2FnSzF2ZjEwNklUQ0xPNjBHSjU3MUcwcTc0WWZUNDM3ZTJaMUpxTlFsRWlzc1hUSFhkU3QvWVhUQTRFanBTS1NVYXZZNlBVNkloWkR1bUZjRWFuMVJXMzFaSDZ6VnRNN051R2w2dnFqSjdTVVh3SHBaV1RlS1hZZDRBazZ1bkUxTDRkckZPOXpJNW5sZkRBVGRYOVRpOWd3ekdWSjAwdG41TTc3OVVTVUtURzhicFQ3bGYrcm05OTk0L2FlN3BXc3NUTmlsN2FzalFmZjIydGFkcXZYcGlPWkxpUzU2R2xycTQ2M1crcFQ0YzY5MTZ0R2EwT2NkL2loamxuak9Jblc2SkUxdVg0ZEdYY1l0bkNFRDROcjVzbzIzcUZUZmFFOG5yK0V2akpNSUNmMERTY09yaGtRWkxPZXhqNWRjSzN2MDErYzB3NHJhRDdpQmZRN2hLY21QUXhIUjE2c1RjSnIzSVdYMFpTV1FPbmlJUS9vcEt6Y3NkaDVhanJEZE8zRXBlMWhiMnFlY3lSYmdCRXNleE1XZzJYZVBoZ1dHdlBCZ2pMS2xGU3BoMGdqSFJLZjZtL0djeFRyRnQ0dmVPUnl6N0xFTkl3Z2lad1FRM2M3cldJKzJ6aEhINm4vc1QxcEp2TXZSZWtNdkFLTW1NRCtUMEt6VHUwa1hIdy80RGtNU2pQTjBIRGhuT3BHUTlkR0ZGTWhtSmJxMTEyeUJWRWQ3WTAwcldrK2RUaHc5SFJmcm1XSFYvOVV4VFBjM04yZ3BONHlseHhCa0czVkJKMXVLUFVpdUtaK1BOTi9xTWp5RXEvQzhqbm1BRUVZMFhuNzc0bmJaMFRzWkgxdjZtMk5uYkFvQ1ptcnY5UmRHelBXbWZndUl3RjErM1psanZXeWk2NVUxM25NbndIekdkbzdEK3VBWVRyUHN2cHhuK3pNSy9wUUNXVnFqSmJ4SFRNTVpkalRQemg1TmdzMSt0cFJjR1k5NWk4Ym5XeE9nYWtWVERBTTRqbEFJM095WlFYUE1tcWNaUVpZWnQ4ZjNBejRtcnJVMVMwTnM1UFZoc0ZWUWF4eFRlY2UrNXBOa0M2dFlKWWJIVk1rWWM0a1FmN1IwazJpc2ErTzJGKzB5L3B3c2pqejFwN1VKeDQ1NDlMMVV4b3ZWU3BnOXYxSGxEK1pUYWJSMS9yMnVQb29LUzRDWHBYTTJlVk5LU0g5VXJpdWZJdVZ1cUhSY1B2RHpNaUEvZmN3Wi9BUEsydXBNczdaWnpHU2cyQTJlQnZudlNhY3NsamE4VkhQa2hQa0VteFFJY0tQSnplNzhGTE13dEFxbDNQSGl0ZjI0M0lRcndOcTd0ZER0dTFONkpFTzJtZ01OZnRZYVdFcWc4N0xXaFNXaWRGTWo4SWQ3M1oxZDdVOU1PTTk3UDBqNEVmSFFPNHlZSVFqczJGRitOaGI1TjAvVlVZZTVKVVRYdlJXZTJwaU5WNE9uV3FYcVpSNFltQ1k5Smxpa3UyUG40RS9vVW5GNlp1SU03NHJzaFVKSXFKQzhWcXVKTHVEZEJSMWMvQVZ0Rk9kZkVhTUJKalNaQ2lMWU9nL29WYkVISE43eWRRQkF2b29FTUQyUU44endWMzV3TnFsQThtTzB3NXZaNktndER3SzMzL1dVVFlVZlNwVTFmRk5HaXdJYmZKeEtlWGV4VFh5RC9WL0c1Z21KS3lpb0p6Z2liSFZRK0hkeEZZQTdNUGZzYWs2SmE0VnRJZ3RJVUZFdUVPdzRTdnQ3Y3o5eDFIeDM4aFozbXNSZERCdkplWWx1OXFrUkxSMEl1bERUUzVzNm8zM29SQUtEai9CK1VxUExOeEM5WGg5SU9QbG5wSnpYSlJpekRrck9Rd3orOW4zaGlmUGJISWJmWnJ6S0VaYk9hRUpCdHpHS2VoUTM5ZDJiNGdaWHpTQmlocnM0ZTVWTXBmTUxpbiswaU1qbTdEb084b2xEUFY0aEpjY3pGZDJqTlByRUNjT0lEVk9RZjAwME92R20zNWYrUktJMlJPS1M5bTZ2WVpPejMwSUVvdjdTRGY1U2EvbGNZZnJIeTYzeWduYUh5SEtqMndwNmlhOWhScldDc0xuV3N4ckxpTmhKZytNaHI1aDdDTHg2R3VKWkM2UXloYWYrVzl2eWlGVGEzRlhvMTV5cjl4NC9LOGpja3FRL0k2NDdyUi9vYnFpVTlvRWdWWkJDc0NIR2tkRnlKVG9qTnRUek5neElTS3NjMVViMExLV2R6M3hldzJzWk1aRUJiNzhmZEJOK3NLNG1STTA1a25xOG5DUnE3Z2ZOcWR0dk1Gc1lEMW9GSm4rZDM2eUhQUkRUV3lVNHMvTTVncG1QMjlpdFliVmtrVTBReXQyK1EvSnBwRnM5UGJ1eEpQVWp4TnVia1oyeGhFVDlsZkc1dXAraWpFVGU2ZUpNVWtvTEhSQmNtc2RtKzRqK1FjbFVXeXFGQUp3TVpVWWNCdktkQ2IvaEYwRWxoMUxzbmRUcFZrd2VhV29vZTVrMEhUam1SVlFZV1VMWmRUZUlBbWxrKzNaQlNMVXdyekpIeEtLN2d0ZGVNdHJxdVJjOTA1YmZhUUlxMDNCMWNRdmRsaUVTRTU5bTYraDlyalZUVmdXZ2pYTmVqRDFNNnVGU0RVVWl2clFwamJIVVZXQkhkdlYxYzg2djVZdmMrcTlDbmVxN1NVY1BhLzkxYlNpUVN3RTVOQ0U0UUlWbjJ2aHZiU3pQOUQydncvcFkwV2hVYjc2a3M2WmhWOXVEaXlSUjVWekYxUDBvMldRN3BWMmRxbEtMTHFZNjgxM0h5T3NFdG1QRHRaQWRIODUxU0Y4QXo2V25HUkVHbTVSQXlNeTNqWkZISXF4R2h6NTdoRHZuQmxVY3hGekJQR0RXcXEyVEZ6M1JSMFBIczRiYTRxckVKdkhFSktyN0J2OUNLbFdrT3dWR2JsU1p2R1d3QldqMDZHOGhWVXFZRlZ1Mnc3N3pmb2I3aThqR2RhdVlYOE9iU3loamk0ckdoTmhMVjY0T3FsOC84cnlHZWhabXNhbTA4b3FZMVN3UXRYWmxIVXVoNTRWQW14ZFpOdWFCUjlFYzMvUGI4WWtXbEUyWjRScFBnajJxaTl5czl3bVBlUm1KamsyZXVJa2VLbUxBQUdZckpYZzNGUy9yQ3lCL1ZYQkJjSFpWUWpySWxPTUExeFNyTzZJMFJBdUd1YlJEbkRUY3FlR05PaGY4VktselRMSHJEYjRTYk9NQzdsM0w0WlMwM3k2Z3ZBb09MZnA0djR0MnhOV0I3YStrMGhKUitYNG4zT014cXRPbFpLVWZRdU8zQmZVRDJBblR0a2lYbllQdFJ1bnNOVFVjTGJZd0dVb2ZzM2tRaW5Xa2VwNERSVGt5Q2dZaUNBSUR4NFUyV2kyWVVyOWFGdG5XWWRTWHF6RHdaeUZCNW53SmdObVk0NFJ2NGdFOHFvTXNuVjlPSklNTzBseFNEalF4enNtRWlHZXRFQU9Uckt0SVE2eTRJRVhoQ25WY1hmYWt0eXdTNTZNdHRjMnpDVlFmOE9XVHRQWWRhMFFOeUNjMklNRGdicnRTM1hwWFdRcCtlRE5DSCtGd3dlemhKL1o3UnhHR0VQRnZOWkx2TjNEcGQ2MXd1NjlwSU5IZFJMU01mUHZGbUhNbU9TZTBaMHRadkNHQ2l5WDRvQk5mNUpkeGJjRURkY2hwNG1MY0FpSXI2ak1iSXNZTjhucWk4aGRFOGkyY1plWTNGMzNtTDdRMkpRbmcvclFwM2cvUHgxKzZpMjI4SUVDZzhxenorVGJSVS9uelJYTFZSYjRoWHcvd3ljdEJNVkRIWFhqdk0yZHlRZXpuSmpWaExTbzBCY1BFbXJ0bWFsTVoxeTNCZjZrWFNIaHVtZ29kZisrSzJGa29KR29sY2VnVVpTLzNHcmdWcmNvd3o0U3BScWM0TXh2alJPenRrUEhFKzBMUFRUbHFITFp3Tlh4YnpGUkU5cG02dWtWdEZaM054ay9qM0JJOElHSmcrSDBjWDBCblE4SVQ2WERZOVRJZW9NVkhVWWc1d1BVaTlZTWZVWXVtSDFNZGxHSUcvSUdOTUliSHUrbGQzQWswNGlDMDZEQndNMnVJcmxBWU9CYnVNUTBNMWtuN3ZRaGxxK2xjZitVVDZyTWtxOWliNTM5WEd1cGs0aUhxRG1KZlVGMFkvb1VzaGxRaU80MzFDaTJKSGkwaWpPdW9TK3piMmNuMWxCdTRudDBPeTRJRTAwNTkraGZ5YTB1VFdJb1I5TU5yT2ZScTVyNGNEUlc5K3l0ZW9zZWhDT3BtaXcxbWtOT2lTeHNISkgzWUNTOGRoV2UvVUUxb1JHSEFFQjlUZ05XcE1jSG9yK290Z0N1SkpSK2JVNzk2S3I5ZTNHWDEwZW5rRFk0eGxJaS9LT3F1LzYzNHVPR2FmZ2Nud1A0ak13U1FpN3JjTWxCMU54RXdVM3hIdmI3NVV6KzNtQTBTM1gyeTBtaStxSmI1cXVpaTk1dWhEMFE3YmpyZktiL3lRbXRtSkJxdjZVVkIyTjk0V3NjUmdJdjhHaFpoRjhTRjY3WHA2a2xWSWxnMW1Fb2N6bE54YmxDeWhWaCtqczl3QkVhb0ExRzlHb0VFYm9EMXRkaHlubnRQZ1RRYVlPbUEvcFRUMFlOaGFtQUtVMlBPRGF4UlFHQ2FrTWhIMUd4bzhxNWxhT0l0d2kzYmY3L2hZR3FYZzcveUsyN1grMGo5ekpDMVNpc0MvYjQ2OFExcEFmNGxDQVNMTGFtaGZaYVA0enBoMkthUFQ4Vjhzd3B3OWdFR0Z0ZWRjamV1YlVaeXVCdXA1MmJ4TnliWlpqb3dyb1IxN3pNZEMxYkhsejBPOWdGZXIrS3M0L2NyVGQ2aFhMMTNDdkhFSnNXaVVsbVNIWUZiSTRlRUQ3c1VRaWgzVlQ2bWxCOHZMVUQvQVFJQndhRVQydUphdW4vcTEvbzhyYlByVjVmb2I0eldIM2VubllSbzd3U0xNN25zNWZ4NWptNGViU3FBTEtaeW1yQTJ4ZWdrZWoycHRtbzFaQjZFbTEvZE1uVFNBeUE1N2VhNEpXY094N2E1QVloNGRHalVISmg1Sm9DZ0krODN4NDZBTUZwRWQ0UWtKNmorVWcyRDFyY1RTSU1rRi9RUnRId2JyZWUwUUdyRC9UOFpwRHpnZnY5bVk1WmNXc0pNVnBpZ1IzbVVRT1JKb3pNSDlnZjQzaSsrSFZCT3VZeUpIVzFlSEFFWXBzRDVlV3ZISG1SWUFtY3paS0NQMW9ra1VpZER4SlQ1UHl6YzRZVlFGam14R2FNUWEyMHRJQzg0TGl0WkZIU3VwUXdGM3UvaWdXbkg3dEQ5R25zUGNpU2E3SE14NFNjL2dtMHE5MGhoUVlyODNmOTJLTG0xakNUUEVVTzQ2MGRSZTEydldDdWV1aDJlVHVUc0V6RVJnRGJUUGJSYzIwRmwwL21XVU1OdUNXdFlwTDgzTXY5OC9Pd0tpNVk4Q2xrQTFhNmVocGlXQzN1cDdVUStuZDh6SXF0ckh1emxHUllEdkdDRDdEVmI5by96Z0hNMW52MmJzb0JkbURSOUhSSEdONzR0QkM5YWg3NWEwTFZQVEFYR1pZUjZDYWI2ZVpzYTd6TWI2UWtmaHhPbTFOT3UzTkVoM29qYzNmRzZaQzhMVk9VUDFnUWRjQWp1ZkhJOXBkWlBTMlpacnJmdVZyVy9ZalRhWFFKbjBiVzRqRmI1OGR3YXNRTVh2L0M2ZkZvWTlQMTNId3E3RElyYmFCc3huQlRFQ2FFNmVFRXI3bmxKNVFRUWhnOTN6ZmREZzQ0a0xrWjFRaTQyY1BiSWluYTJFdm9pdmNETHlZZ2FoWG5LRlA1aFdGaWE5NUJmSFhNNkV6aGdDckc5WCtBbTJucTFzUzBWMnp3Q09QS2tHdWpzbXppbkQwRWNRbzJGei9TTTlQak02ZS9FK1dEQWxHZ2RLRS95RmowckMyU3I0QVFJSjV6WlE1S29LTnh5S050L1liNnRlYVYrM3MxVE1qaFZQRk0wcXdLQ0dVY0FwaWF3ZGV3YTh6MEJxUjZnd3lwUHVwc2RJZDViZ21TMUEvTHBYRENYcGpSRnZIZzdKdHBFLzF4SStZRmY0VFdXd1VBOU50S2dqYU0zWmRkRFVOTDB6clhZT1loeEtXMXVNdnZvTGFmWVZwSWx1Rm1uVGNaWldXZkMvU25NMzNTQ01Cb0d0L0NyUGFhMnhxRXNqaDRnTkFJUTlHaFp2YXZxZkpRVm1vT3B6SDlvUVh0dmtMdDZOWjNsMTV3VHVDN3dwV3Yrdkl1bG9rdmo4N3RUZTdTWW53Zi9OMHVEbUN1Zzl5MTlVQ1hselVzanhBcDltRzMzamQ4RzlxMWx6bW1OKzd2TUUxUmMrNEpBVzJzbUIzL09FT2pYa2luNGVjanprSkFrNnVsT2ZIZEZnKzNqWHdVMEY4NXNQd2pibFJNWGI2MHRITUV4UDJzamFhczhwc0xQOTJjd0NaVE12MmVBWGxYUGE4S1BhaU54YzJQa1dBcmszYys1Y2xoMTVXMndod1B5eCtBVVM5aGxnUDdxeGJuazNUaVBVTG8xdGNoQlZvamFtVFowMnR0dnlVQmtNb3JSaVI5S3NxQmpYR3NrRllaMDdGbEo5cTdsUjVyVGZacXB6Zmt0YXdXKzFmMm1pYWZYODBMdWJidnpSVHRWOGF0QVFvdkk1QURBdmZ3bXluTkI0enVVSnIxOERLS1lDTC94Y1Q0aWd2dURZbkVuRVhZZDhKNzB4b3pRMi9yL3hOR21QaFpnUzRQOFJsaDd1NmIyaWNFenNGc2ZTaDZXc2k5c1loM0VoVVRyR2kxLzFRRTIvRDJOT3QxSldqY2VHZk10eFBaeTlBWjB4WTdxYzI0VUhWOWhrQUh1WUF1K2ZxTUdDNWc4TWprOHo2TytRWU5mYjJ0UVJIOHpZM1VNaWsxWlQybHJSMnhvV1plOHJ4TE9kUXZYRllIV0xGSDdWeW92QmRUaUltbFZOTFNHTHFzTTBlS2hGM2UzNyt4ZXBUd2dNUVpYRU5Ib3UwQlk2c3V4TUdpamR3NkJsVnJjbHZMc2ttMEJjY0lNMi9NQ3RJN0lVVHFuS2Z0cWNOQlhjTG1XbVJVRk41N21vUVYvd3h2cE5UWkovNVpkUUc1eWxFUENRQzExMzRQdXVOTndRNU8yRS9FSXI3cG1uVjRabHkvZUR6NzM3aGt2dUVxZFgyM3FnK21YemoxOTdkWGJ4b2ZlUzNxSE5IU2crZVNsVThIR2ZlNFB0akk2V0RBa0dZZFFJODR4UVBhS0NSTHcvdUduTGMwS3dxanVUdm9pVlpDZjkxWmNubGVyRitMcURDSGttWHM0SW5DNzlzaGd0Y0RmWTRBZngzSCthN2dNNXBadkltK1VJcENPTWM0Q2VlMmNteHpwQ0xIbWJSRHFqMkxTTWQ3NUg1aWNHUmxXcGo2TU9INU1tM3NHTkRqQVBPOFJYZjRoMmRrTXVxbDJYcXFWV1BNVERNbVIyNjV0dXJ3Vjl1WWtVN20zTjY2UFg0RGxkTUlCdXNiemZrdHZPam5xVVNQOStjVWhxdlR0TzRxQUJScFI4Y3VLWmZNTlZuMkQrOWtMMHZldnFieENFMTR1dGp0aEx2M1QrWVpIdHdmSUxOWVVLN2J0dnVSNmxUTHlGK24vaEpjSmJuYjZkTWdJSTdxcDFxZVdLZGN3djJJRUdIckM5U2o3MDJjRDFsRXZLMmU3aEJvMDVjYVkwRFR6aUFZNVBCSnVpOHowUUFKOE9YRk1LaGdJeXdIclBWTGNoK045YWU2b1pUOHhTa0twUWN6NE9VZHhqTXJJUW14bkZaeGxvTnFzc1FUNXZFRGhVTWY4bUpmZTg3c2orSy8wN0NoWHRLM2dDbmhCdWFpamdPYlJocG9mM0Qzc21lVG1YVmpsdGxiTmVCajBhR2N0Rkg5VUowRThGNTBIc0xvZHl5bVlLVWMxT2hIM01GY05qUmpaWWZzT0NGWmJiNDEwNVltZ2tJVDltTyt0bm5OQmY0Sjh0eUhDbUpKYzd6cWk0VlZsdnc5YW92Tjk3R2d1U3IwQzh0aXZiZ1BTZldqZ2Y1cEU5QXJmM2tEb0pDdCtSQnJ4amU5OGt2bVQxSGxkY3cxMCtkZHFJNTRRVjhURnhaYndSU1cyQlRjYll0S0EvNjZmcHhKMmNKejBYUXcrUWVGVnpmUlcxQXV0NXhxQURHcWd5MEZuZmZiOUtzcllpODJJZFg0Nm9USTBjVUdPb2NURlpaenROZG1DcHoycWs2QlVVSmpwb09UUHd4ZDNsdGxvVHVVSmtsaFZ6ckpzbGZWb3RkUFBaNUFHQnA2RGx1bE1QQ1MrUmNhdlNES1dTaVpDaGtLREtOMkVJMkFwV2hTSFpGUkV4a0VGeU1QeWhyV1Y2dGVxOUZFV01qSzNYVGVFaFhpbHlaN3BxMVYza0ZrRlJ5STNBYVlUN3RCeVdwc1NrWnVjM1hJczFVM0k3THRPbGluWVhqbGdIVzZGaVk0bWRmQmZDRWZoTXpPYmVrU29iNkFLTk1SVFh0YlpOQlZiKzN2aC9VejAzdFBwVWhCaXJqcFVxNGlKL2VjTmRHZ0dzTzZqUXF0QldsMFV4R0xNTjJ0NnRab1pjeUNZVTZEbVNIL1Bsa2V5VGJGeGJac1lrblN4WXJPcER1MWtoZU9XOHQ0OVhkY1AzQ25HbkZpb3BUODY2dkFVODJ0eEUzc2N3RU5oQ2pFeHlYTExXMUtaMFZMV1o5RHVMK0c5bDAwQnZ6TDl0UFA0Z252cmlnRnBjc0dEMC94eWtmQksrUXMrdE51b3dudzRBQU83SUlld29CVXh6L0tLbVMvV0Z4RzQ1YmQzZzEybkRsZXY4eEdGSVF5K1hpNFFRanIrVU04NE1rRkRLa3pXUmc2aTZUYXFmTk9waUowWitGUnU1N001dGE5eXBEcE03Y1dUVnA4eTVEeDUzSWg3dG9XRjJDbXVKckRKczd4K2RsUDNHbDk5MDlFU0RrNlJnaGxWUkdVeGl6RElyNHphdWI5cTVQdDZuV0t5VXVmdDFtZEJZNnEzVlZoUE96OXdGS1dmek4rMndKd1B1SlN0bWl2QTI2MzZYV013VFl4REJIYWprVUVVY1FrNDd4c2UydThZWm9vaDY0eS9iN3dPZGV2RFVqbVkwcXYxZVdJOVhnYVFPdHM3ZGRKa25VeG9yanRnakFUNHMwVTlKYnR0U0ZJTFFlLzFZdDNxVnZZQVZucExBYW5DQ1ZWYks4OFVuMitmdE1YVGUvVTJRT2pyRHNLWDRyT1l6RE9PQXJTb3hLVmJEVmxoOHgwd2F3Z0lXR1RsU1BDbExGN25oM24vOUZ1THpGdUxWay8zdFBsalB2bCtxeGpMOEp0UEpQUmgrakMrZ0twNUdSdWVOMzJhRklXRXBta2sxbll2aW0wbVQzQ1ExRDVtUHowNUZueUQ1a3Bzb0dYdjkrQU5FbDZZWGFSUGdiYW04TDh6VW9ySElaeVBnb2lUUFZhQmpqR2xQS2ZFditWQ2ZFeElXbGZ3aWNSZ2ZwM3VscUQwZlFNTkdqL2syRGxyZUFWZ3pFRTl4TmNjMVdzVCt3dzYxNytPa3k0MDFDMCtNUHd3TWduclVtY2JxcnBlYkY3VTRST2MyWkFtbkZqVWI2M0IvUnRuQ2Y5VFU4WXBqNVg5dTlsajcvWlc2SjkveWJVMkhmeSsxd3QyOXJOMEZja0VJREorKzJpb0dheHlGc0hEWTdWZTVEajlEMTh5Zmo4L1NXYS84c3gwbVJMMnlaRHZ4VDI2elo0cG0vTUFzcmJLdktDajBYYkRFRDRiNmcydzd1Zzl2QW9udjc5ZXhIdUFZRHlEMU5mcytDaXlpNWMwRVgzcnEreE1VckpGem5hc0NpelRCcDA4U0svMGtsd25aVDZsaDhKVmZmYWpRdDR0MUlTc0pLaG5jWjlrVzc0S2x1SVRERXNXbHRUdGNlTVVxV3NxNUM4amFERUFOZlRkWXBxWlZKdlZNdDBNNmVzNzRDdkQwWFBKQ0E1SG82WlVkeFJVVGF2RzNPc0lncFNidEZZN2NlVEtVNWVqNlgyQ1gyRlNXM1RCY2FRTkVsMFhnQ0RVMUtvWFdROEoyeTdKcGxLa2crWjhhTUx1b3p0K2NoZDBEMkZNY2IwdWtFY3NPcjhHRzRxaGJYV01CQ0FET1dNSHpzNHFpRzhUWE52Y3FJbmtocXZvc0pjZm9sb2FlSTdPR1RiOThoN3lRQWFCNlVwUE94YWpJTTRLZGtNZUF3S3dzTDNxNE16MDNwWGk1czRiSE9GOGlRVXhwZ2ErUFYzN1h0R05ja2VyN0RUMWZVODlGR3lZa3N1eGlhTG9pZUhTS01hRDhXVEFuUmFxWjVDQ3VuM0l0dnhQY2UrZExMWUp4Rkp0WHVoYU5tY2ducEY1VmxVRUhkUXRTRVBicFlJb3EwQzBETlF2aFRHRXpoV0gycEQ1VWlZR2NGSnFMYWRrK2FIbk54czlwZWlnWFkwSEVGUU9aODNuZ3g5Y2lzdUxwUFhyNVNhd0c5TE1OL1BrSFZRdDUwdHIvaWI3aVl3VEFyY3BBV1hPTmF2S2ZueUg2QWg1T2lRa0NKeVJyaFIvWXFTYW9rcDVITnVZb3FBeXE2aCtQeHhzYmxsZUx5ZVZTdE1WSEJxb1NPbkFSS0g2c2hSMERBbmIvTWpsRTVLTi9LbEI0eXR3bmtTMkVsOExRUEhKZythejBwTVJ6ZlY2WXdnUHdSejlGRzFTRWRTZHUwQTJxSUdUUm9keXJiVk8wNFBPM0YvZjBuTmxaV3QwMFQzSkJtVDZha0VUMWxZWVduUnZlZGlxdFl3RWFaajc0WXpISUtjM1RiUG1ETUQvdXRpR1BuUkxLOFVaNllDVmkwL216d0V5QmhNQjBOb3VjUjAxYWNnOENLa0pGNVFWTFpnVEp1ci84QmhIYTBWckZEc3NndDUzc0FJdVc4RHJhR0VySkcxN3BpRFc2YzBwRVBYd2VZWDVWcVUyY2xsQStRdGNUU1I2RVorek9SV2FUTjJoTXh6SjlMR1hnb3pKUldlNkxGazRrelA1Q3pmbkZBNkJ4ZkRlZ3Y1MzRoU0d0OG1WQ0Z5Q3kzOW5KQ3hGamtmTy9kd3BsL1R6SnpBdkhhVHFJUTFCNVFaREFNV09qMTFtRUNkS1FqcCtNdEtSU0p1amtmRnh0MXVqUXdzVTZBWTh4YmY4V3JtcFJTQk5UWW1RZERBNGQrbTZGRDYvNzBQcSt3eWNaNXg5Sm9McE0zaGRvcjBsa1QzQmJhZE5VblVGMGtwNUhFMFh4L2h1Q1l6SnBrU0trcW1FbHpZdWZyUlRLQ0szWUhDamZhZW94Uk5PcnhtUXdJb2hLUzJmc3ZXMjFYOGc5eWo1RHFlRHhrMjhocFQ4MzQ1S3VNcHNTa3V5aU1pSnhSaXJKMU1jNVJkUnpBS1dzZkxLOTNjaHRyekI5OHB2a09lS2luclNvM3BWblNoRDBoVTVmK1BNcDV2dTRTMEU5Z1VEbDEwbEhITVlkQjhjSnlvQS9qTUFwMG9oam1mVW93WkQ2MERmei9SODlaMzlaTFdEKy9hc0t0VHBnOWNhVHJTbjdsbUlyMDBMZ2VMNUl4MmllMGtzd1loSld4Z2tMSG5BT2IwSHNaQUxEQ1BIYnVIZzVXUXJFbG4vRFMyTmczeko0ekVZdVMySUpaMFAwNlI5VmlqeVQ5Qmgxbysxb0d3Q0hyQ0QzOWo0eUJZZlhteE9WTk5tS3laZmp5N3JiTnJKd0xTbW14d1dEN291NnhaZDV6Q1RlSXI5aXExUVBmVDR3OW5vMWJObVBuM0dNU0RFQk9aRUtaclorc1hodVk5ZFYwanRRMWVVcHhoY0p0ZnpBc29CSHVncWhPNkxuWGNoZG9FeW13Y0hVQnhJV0tzdlBOMDV2ZVdsM3Z0ZVJTOVd3Mlp5NGMzeThZUXVkVDhiR1I4VStsck8xdkVyektuYURUL2pNbWRuRis0a1prZTh6Sy8welorOHdSSmhNNXhjS250dVFaSW4xczdEOHU3ZjlyZlFzTUY1K2ZSc2RsYmR6WXNjL2liY3hsUGRvU1lkWGtyTy9SWk4rUUVNSUJWc01tZEFtbDRpdXp4Q3dkL2F6QnVzM2IyMFVwUi91UlMwUW5aLzQ1N2NsZUV4a2FWa1g5aTFKOWl4WFVraEFWRGJuNk9hOExHSkFvQzMya3R1OVZGdEhZbEV6L0xtTmhVTTNVbW5NVzZSS1c0ZFJhTHkzNXhJSU9jb1JmNWdQYjd2amJ6UUcyalVDQVJUcnp0ZVpQanNjbmp5ZGJITWdWMmJpc2FrNDNXcFBuTkhtYk84VEViTmdBUkxXZTVrSG5kbEtCZkwzWDVETS9WVnl2WkJyMUhxZGhVcjVCOXZMMHdyRHd5WExFWUwzR0tXd0NMWFJDa0NGZmFuNUl1TXg1NTY5QzFrTVEyb0ZqaGl1QTlRa2J2dVB5OXlkY0c1elo2UVVkVmcxR3liaFFaNHk3QWhpRGZLZGNnbWlNdWFaR01QUEZKcDUwS3JnanFIQVhLSGl5QVgzZUVDS004TkNIQ0tyKzdLa1liMHdMWDNUczc2Q2I4bWkwN2F3Nkc0Z293UEdIaUVCV2lvaFlxa1VnRWM4dkN4VDFhMmFaZHc2cXIrTGs0dnJ6OE9XOE1OcDJuZ21pQWVqVkdST0FIN1g3cWl3UFlJVmw2cXJnc0p0MnQ0MVJnS3A2V0YxWFp6eDZlcTdhUTQ1c3FsQzZ5TWhUZWtQREhMS1d1cUxiUzczMGZCQ1hnVGRsNmxPckUxN204VEhzaldxS3NuNzR0S2o3NVpWSHdWMUg1NUJWaCttWDZuRTgzV3d1VDg5S3djemsyYVNXcHNDNHdnNDlYVlVaR09BQ0RKN1FUelpXaUJYSDBlRnZ2aVIrUUxMRHZJU2NjS0t6MXA0dGtnamJ2YnNiVXc3MlV4Ymc0b2lwdXFhUHZXR25oQ1gwa21lR0ZtdjNycWtQaXptTno2WTVWK1psblp5ZFBQWWtPYlFQZkZEVll2WUM2SVRhNS9FWStBbzBscEV0STQ2ZEk0ZWdRRWNiTWtwZ0daeFRLSURLZ2p1d2lqL3RPNnNGbnZtUUFhRmZuNGhkZXZTcWpwOTN5c3d3VVdoekZxSUtoZ04zWktZUFZrZHVZWkJ0cmdOQlpvdjJvV2J5UFF3aHVjcWRPTDBPOG5WRlN3Z3ArYWFSdjlQL1d1cXoxQUtHQ09HSTgxMWhiWHFpbmJ0M1R5eVd2QlQzTGNmZUtvMnN3Tjh6UVViUFFTa09UYkJDb3FxWTZoZXVEVk9tQ1pBSDBMU1VSeXVSUjUwTDZmZTVCMTgwdS9mRm9MNzhIMnNYUk55UFo0cnE1L0RJK1BrTUdKNEhkM2tLdGVKRzd5NjFJZmZuZnN4UlZFSituc0ZCY3RuUHNqckdaRmdIZHkzU0RxMWcxbmNOWXQzcHBaLzJsNnl3WElTT0gzRVJrMU5LcnZTd2FWV096Tk1BQlB4SVZLR25yeVFIY1AyQXRKNkJIb25xWDB6eiswTmxPdTMreUFSajdrQzFURjd4TkpHMHlzNCtVMTFDK0ZweXJkVjg2cHJ4blEwQnMxU01Oc3lnMmhjcDVYZkl6RzNRRmxmalhHQzY2UDUydk5oMm9aRFhQNU5oVEw2QW1IUjIyR2dhbjNLYVl5RTE0L3NPU04vUVdjbjRuN0krWUl5TkJTVitoTHh0VTdBZmxLTVhGa3ErcW5BNVRuUHkyVE11eWZia3kycEdsZDNjUzJONDNKUVZRSExSMjNwTWRTZmo4NTQyNFdLcmlOWW1LU3g5Y3gwS1dvWkZzTGZ5elpLMGZmU0h4MDNlUkU4eUVzZVFGTGRGWWxFdmZ1dXR1clpZR2J2YlhEVWdqRmFXQm5aSEI3NHVKRERySFVpNEZFRkEzeWM3VEFOeVZub2Qvd2prNWdIcWExc00rQjVzNnRJem5sUzlxb3VYMmlxMUZNakpWdlp1Y1JnZjVvZ2ZOUlpZREQwS2IzNmJzd3VrTzYrVzUrYXIvdFFUSjAwdzNDdU1DTmwxUnQ2b0RqdkNaejJRakR3NVFvMHZBNnVRSlR0TnVKNkhVRm5ubjcvRVZqNm5na3lJQk9Eb0hEbXVuWnlDd1BCNFBrWkFUUDFqWXVRanRBcnJVcWc4dmxuOVh2TTlVM3RoSG82UE02UlpPSFVSMG5iSGNQQUtJaXArMmN6K0VOOUJXTzBqbGJuK2NsbkJBdDlZRXh3cXN4NmYzeWppVmoxU2VITE1XbUNKOXpVL2FEOVc5alZRTEZ3c2ZISXphQ0s0Vy9FSnd6Rll3REVjcHh1RjBpSEpsUUNubXgrTHdvY1BrWjdteHorelYySlJ5QnU4VDc3aU1nNGJDUWw5T0U2aTg5SktRMlMyNWxiNVNyT3FibkFTTWhDaHphc1JiRkN1cnBUbXlSWUN1TVpTSGZScnpHd1BkTnpYTDAvdE5VNmRPTXRqQm1zR3JIQ2w0L0xwN0VrV09zeDUyQ0hkRWgwRll4c3NDOTNQdGJZRVRZR3EzeWlZd0hPTi9DMEtpTkNHR1pqbENVb0lXSURLbzBLVlFWZEhZTmduMC9LYmdJcmgxaURGRUFwQmdZODNTRVZDZGtGK3JPcGYwSE5GTmtxa0NLb0Erb1plSWxaeUkvd0Q2dldIbXlUbW45Z3ZZK0V1UTNEUkJ6MU8vaWZGNVQ4SkpiVlE1bm5RNENFMDNaeUJ0QjRMcU5JRzlDT3gremN3Mm1IbTk1T1M4RGlJUFg0ODZ0UnUvaG5KRHVUemxaRGUycjdXZ0xNbTFQTHFRbzlSa21CdFFiaWY1QlpvY2JIS3VVVlRyK0ZTSTZpTndBTTVzNjdGbHNPQ3Vmd3BuMWxRa1Z1YThjRk9obnFPZktqYThNd1FHeTROTDBGMUNTWS8yTUFPMk1DSmF4YnpMc2h5TmtXY3Z2YlhWSVp6OCtabncxdCtKc0Q4YWlFWitmMS91Y3pNemt0VGo1OTY3cGdkczd6VUkxSTYvaXQwVVRzT0lnNnNGM3lINUNQSjRnZ0RpQzM0dDJxQUZZQWdRVExBMzhHUnpQOEV0SEcxSS9pOXc1MVc5TXU2NlNMbHV4M0t5M0tYMFJzQW5NVkdITEhpeDZGYnlRajBDVWdYcWpvYnVFUUh6UzJlYnN5OVNWUkorQVJxQUFSVnM3YmZXYjcvQnV3cEtJYm8wQ2V0SXJiYTlhV1h6dUhpeGRSQUlzM0xXSVd3SUtZSWcrcS9OMHdRMXpBaUxRZjJST1VYQnNBWE15ZHJpc3RTdlhHaUgxdWVTODB0dHFkcGlMYyswaFN0L0ZNalNpbStaM3VFZG9aL2VIbXplTGxzVk0vUzZqRncxMU5PSlptZzQvSHpPclRPVjE5NlBMK1h0YWNCNkhYb1c0T1NBaW83REZyMzVuSnNrWDBrQVB2WG1idTRTSVc0THBsR2NkdXhhTlJGMUx6ZHljcTVRaTR6a2RjTGp0UjhVTXZDK01xRGY0ZjloWUFhTXZ5ZExqRytwU2o2VEg1SGlIeDZpTkNYdUliWjVrTmRDSTN6OW1kYTNrNmJIRW80amJtR05aZHQzdVMyci9jRUc3NWlFRHQ5d2NxOHFHdmQxY3dnaWhtZk9DbEdQSW5FNWdtS3VkamtjV1h5ZFhxd0ROd3I1MVUxSkYyV01TVExESHplZ0Qwbm93TlR0V1dpTWZiaG1RVDFiL2lMVWcvZGc4ZTBJZnRMdEF6OTBEbzNFUFlYYkJsUFl4aWZjSE43dzhodUQwaHZ4eGtjNml4Tm1Kajg4RlpMdXY0SFNLMHprVTloNDlvbjd2aktudmJMdk1pa082Uk1xMjJkbjdadnN2SWprOFozZU01OU1BQ3hZdDk5RWRCL0p5eVdobVRVMitxRUN3SS9haU9Jc0pqbEdpNUdCMnVPNDN0MDloY3pLSWVqaFhUbit2UmJxUXI5NmxLeWZ1b1BQZm9Ub1UwSmZsek9sZnN1SW5VZ0t3cHNxdThVbTNRdUllZVd3OTlKNDgxN3dUTEcyVzIxcmh4MWlSRURTd1VnVVUyU1lGSy9KM05PaHp0SFc0bEFvREhCejJKU2hoMW51QjVrQ3hFUVpLYUhJSzZ6VHRhRFllRFFyRVczYVk0UjBkR2ZzRlppVGY5VDlPemtaR1kvSCs2NXp6S1c3ZzRadGVJVkFGT1Q4bnZyWTNuNVJTRHBZazZob3FJUWJoZEhwTVNzTXBxb3hVMVh5STd3OVgzSmZkTUtwdkdSU1JmNnphbkNuL0NUNXRxZy8xVVA0Z01FM1IrMG1VUC9nbGdqdXB2ZzdnRmRHbUtVdUZKK3Q0VkxXZ3BFWVZnNUlFUTNrNVhDRlRvSVRRYmJQaVVGL3p2bDZrK1Buby9XMktqK1Q2czJGRDhuY0I0THlXKzJGeGhuMnpmaUxIVjFTNmxaZFhaS0tPaWpncHdNQWh5Q0RPVU1jNGFZRm5oOHNjYTdKbjVKVkQwTXNlS3lRcEJwTWh5VkpzSWZrSWNUVXBCd21rakxMbm1zZlUrcy8xdFExZm1YNHlUeHpyeGZYUFZZNnJJelkzWWRhMDFGVzBqNk5GMmZneVhZQ29WUUxlUHZUMUJPVStiVmpBUldmNlZEYTdGaVVWZGs2ZDdFajJ1dTIyMlNVc3V3NE4xSnc4cU9VeWVKaVBmUmx3Q2hEeDJQOGViemhtUkZaREJwa3V3alRHMHN2eXpKdjFxbGtKWWxoajN2cEEyb1BaMW1NZVdHeVBuRnU2dWhkRTBLQjNqdEE1eHJjOUNrc3kzeUJmVFFuTVNLVmkxaEZUM1o3Y1dhWGtVNTc2elRNNUJXVmNJaGJxalBVMU54R0crSzVXNm9Ea0VSMHRsMU4yRFl1UmxqUjA1c1RVYVdjZGpKTUdjaFZwRUN5UE55VVR1dDJ6cGtlRHk5NENOVHFhczBOUXkyaDBvNzVPcHNyWmpGTXBnUlczZ09vKy9QdWg1M2Jacm1rVjlWQmpaK0NNZVlXK0p3NGdXQWJYaU9hOEVSRHBSRnZWMTRMU1JCUXg1bCtEVXJBTWE5Q1FKV3dnWC9RbGNHZ2d2aVBDRjFCa01ESG1lbGU1NklWWlZaYzdYcURRTDZoU0JUTE5WTG5lWmxjcmlhb2lDWDVBTjBhS21Xbkh4bXJtbjh5TU9yaHhVSUgvMmZmVzUxczlzbk4yaHRwT1FlY3BNSnAvYWhJMVNHdGlMUEZYMnhpcVBiWVhTdHNpZHpGZVUrUTZmaCtIaWo1YklLRGxYbklKa0lQTW1pQWVkL3N3cXZCL1cwQ0lsczdNV2F4aDMrTnVwcURNSVp2V3BobUs4cHlucHlKNHB4VS8xRUxtOGtLUVFGMXF6VWJ2MWV1K292aUV1VjBQM0R3RCs2YVJrTERtOXJqSEFqaDVWbndVM0t0TmN4MVVSd1B1b2ZsQ2M5RmtVaWFwdHFXUyt1MGsrZDN6MEdlcWpOYUZCdjArMUVxaDEyU2lkYzhKOFY1ek5qZThHTjFLZUFGWm5udmdXdFRUSndmVVpUMWNPVWs2eGEwRzAxZGlQRURFK2RBZ3NDcUFZOVRUMFNnc0U3Wk02ZSs5Z1JidENSY2ozRW5WODhNVVRBSnR0QmFpQk5mK1MxVGlDcEsxMnkwY0VibVB5bDZzSEh5OFJKUDlXUlBpc2YvaTlqcXRXd09HeGdwaGFUN1UrTFJiaWR6ZC9qOGRJcjE1MkFtZGNiKy85VER5Q0YvMGExTmdNOVRvbVBVam5ISk54ZStDYU1mbG5NNjJ6ZEUvWHhvaGZ0UWp5Y09WcG9Hd3RNYzY1ZUJYU1VkRVN2a2VoaVBZbDhXODdYRFlVeit4Si9jS3ViVEFrZXZoODZaRGNtOHJVbkNRTVQ5UHgvRnZYRE9LUUhRc0YzWlRaZ0FGVEtzVWJya2tsNXAwZXFRSXRoSWFUdzc4cXd1RlYvRXlZRGQ3UTRZQVhnR0N4MWxMSlVSL0IyY3UrcGN5OVZJQTRRaERWdHF1ZzZJb1A0dDk1V05PZHg0ZkhIZUJ2OU1WRGQrVWM1QkpEWTB0NU1QdEQ2U1N6RGcxeEkrdm1zQVdlZS9ucU44M1JGZDVVOVVJTHMwMitXL2ZuRkJnWkxPUGJWc0JqUXI4MVdtZEpvdjBoTE1jM1NxMlNZOHRNdzhrZ0xHcXU2bmRGVTM3SytIVzNETTVuNmtvRDk1dlp2QVJJYmVyajZFNUllL3hUQTk0c1JqSVFLQWRyeUdpNDZnV244YS91UUgyN2l1YzRCMEdOb1BEWXJvTjVjcUJJWG0wVVNFNms0R1BpU0hMeG50ZHFDVFY5Z01oQi83WnNTeTZ1UGJsQWNnS2VwK0l4bDIvY2RNUzdzeVVkOURHSEtSaFpRMkkyQVpWaVFoeFZSa1YxSUZKK3pvdExYL1NaVDMyOGhVa3J6RUxvNlpLOGlRTUFBWTBCVm9ES0o3NGFoSTFXRFVVUXUvWVF0d3BsTXdadmlwQTZEZlM2S3YwQS9CZGVMS0xDSTduRXd3RFVlRXNUSnpHSzlOa2xUZGpUd1FqR3lSdzBRQXN3SmhSbW0vYVVWOFJYTDltczROWU5seDd3ZmgrZks2Z09OY0FZdXBtQzZFRVhrd2FnbkZaSGJkeDBtclRUNzFyaXFHZHBhODMvK24vZ1JlU3puWTJVL1c3a2FXN2RXQTBtRm9pdVBBZzFDUVl1Tyt0WkR1YXE0RHRyQUgyclQ0ZG1YSHZYTnVvdTNMV1RiMW9rcXI0VG0wZWJCTGplQkx6cXNlY3F5RjZ1VmJJVzJSZEJkeGRrei9WTnUvTHFDM3NzS0FHU0RGVjB6dnVjVW5DbE80VmdXS1RHZk4wc2RaWmsyeDVyS2pVM2NYZ2NCMFp5UVBKVTFyWitxcDB2NWpUYTRmWDcySUNuamRhWDVPVFBxek9aYzVFdHBsN1c1N2lCVDR0Ry9FOTQ1aFJjS1pSMlBjd1Z3ZzQyK2o0R1pjcEVzT1VRRTkyeVJVTjBuTmg5NWRzdlI3UXdRWWpFY0F3TmRBTjljdFYwbUlwOG01b3E5a3J4aGJsYmtiaU5ZT0Q2M1dQb1ZpMEMzU3NncTE0VENRRVRTci9CTmJkcFdTZjhzSEcyOXcxcTdyb041aG1JVEEydXpKZVR0d0d0N1BDUXVtbVFlSEVjVmtjR0JQbGN1WlRxWEZsNFdKMlRWQ1FVVnEwWFFydWdUakk2MDhtN1Bhd2d1MXZLS1pEQkRtZnlnMDM2OFNvaGZCUEVnNnBBcHZnZDhXenF4Vy9tZ0xNVmRlNmIxbTRaYXBnSFI4TEVQeVV1MytYWU44dVdHam5XVThXa2N4WFIrYjdCTWxBalowUjF2dXo5d3VnWlNyRmtSdDNETUtqZ2JtcjJxMXB2YkRwQ0tHbW5wQ2ZkWThkb01Hd3hYN0dkU0lyWlNRMGt0eFlFaWE1Q1lxbnBsSzlmaXcwM1Jld0s3MUFqT1F5KzdDdkhNWWFGVjFlYlJyRTVReVlxVG5iZTgvS0RLUjJWVGI5aDY0RFJQQXBuM3hsWGRHVXlYQU1NdFVweW12cWUyS3lrTEpmd2NHcllXMVdudFdXMGVSQ2hOckhlR1B4UnJ1VmVsak4vMFVZUWNvbHFKd0p4emJuMWdMZW5MVWZMVVhpSVM1dElCalpqNGNqMlFDY09ZRkkwNlU1NkNlWGlLVDZuazZ2ZTZBR1Y1Yk1SSEJORURjZm83aG1ZMEphZ2tqMmxsTU1Wb3djU28zV3JzMmk4RTJGL3VmL1RQVnRiK3RnN3hEcHJEUFVWbWJkZE5vY2w1VU5aYlRZMFJ4dzRtbVlJSDg2QWJzUHhMdkFUNVVIS3FtVzBvbFBYckNhQmF6MHNYSEdXZzJmWVpTUmlqcFY5VDhLejl2OUtqVUtQSXdTSHZlaHpYb00xeU40am0ya2RudVV3Nyt2OC9VU2FkRko3UXdkK3JvNTQ0ejNNRWJ4OHVLaGEvL0p3NDNWbzdKWm9GNUVBSmNNYmFWczVvWlNaajVpbUdTTld6S1N1MmtIOVhyZzFOVENaMEx1VjMzTU12SEQrYWYyanlncVltMnhkUEJuZ3NQeUtod21DN1Rab1Q3ZXR0eDh5L1RvcjNZWHFZNFBQSnBMZ0Y2TXNEVUFjc01zbXhYZU94Y0FqcitEVTcveU9UQ2ZLekNMN0p6VnZuTmFycmh5MUpWWkt4NVFRUlhLWndIWTVlOXNVQmlRdTBnU1pBNmcyR29DaVV4Nm0vTkN1RUsyb204WDk1UnBxeUZmYWxPQm5wK2h2dTRPbGtxZXdrV2l0RGR4OXRTOWxLRDdvQkN4T0xpck5YVDRuT3RvZUFYN2RnYkE0SmtzdnRGM01pTE9SOVFNQXM4ZEdoQU4rcFJWOTZYR1hCUk8yUTZLb1VwTVJ2QVF1WndVbEVzVTBpT3BtVXdQTnErS0ZvMEVsc2t4NXYzalE0aXV0c2tMb2JUVjVFaGFCUkxUVkxFMHBERDdaUlB3T2JxUEFjaDNHMGErSGhlbWNhcW82Z0kvYm90UWU5S1BoaVpORXBIM2NTTHFkZ0hwLzlTWU4zWERVeWJEWXN0OS9SV01OL1BkMm1QN05CNUdTS2hRZzJtdFl5SHRETmcxMUpwYy9PZ2dHNWdRdFg2N3JTQlNtM2pKYnREUnpiaTQ0S0pQM1d2eFJVcElFVUJCbkRqZTRHbnR3UGRCOTFGSC9jbm9CSkZUVnBOSHFyU0o3WkFUZS9PY05ka0Q4T2pQTjhsNS9KakFqeWkwNWRVamVnNHVhZDU2blROM1JwYWRNT3NhaWprQStxalRHbE9Wa1N4RWtpblRyMnhNOE1ycGJRN2xLdzJKbmkwR3hzck50MXY4TkpBamUzYnZCOHFyWW1lQVc2VUpCUFZnN3RFNGdwTk1nTnFYTnBaR0FtTVpKQkNMTS9rVGNJZGN0Zk0xYnVDYzBZcFJUbjROYzNKSWdMcWgrdHlSNE9sSGp1RTZLSmVaOEkrWlJsekxmOFlvM2dldGUxakFOb0tFRU13Z2QyVDF2aldsdEZQOVBlUjNuMW9jM3ZmclNPbks0USsrODJoWWdlMFdMc2xtMGc0eFJUa1liUEFIUHp2R1VwVTd0LzhQOUR2UHk4ZDZwUUJ2d25qeU9oWGE2TVdkUFZpSS8yR2R4d2RodkVJUFoyMFI1UEhmSjE3MmNWUDJ2NDdaOThWVGVGcTNqZmtwc25jWndZbHI4dVlzeEpLdzRZME9UL0pMa1dQTTNFN0kramVBTlp4d2d4RzdoQm9iL2NMVzVHbTZlUEI4dTVJUjNwMEtHUjZKSE4rcDlVSjlNZmtSMnRFaTdodGU2OFk3UE9ieWZjQ2FjVEpENzZWZlh1TEsvWWhVMm5tSVF1SDVNem51YmhRbEhWQm1RZkFTZW1XM2R6b1FkbHdjZURmUnMrSjFkOGJ2ZFlpdUVObEtFYmZpZElHeDBZZjUzUmx3NVRxRVNydzY4b1gyNmxwTzNxQWpheE5sdSt6OEN3QS9mdzFXZ21QZEFsMTdCcndWNzJtbHpieGJxaG4wYWE3MmRMSTMyZXBrcFRHZnRmY0IvT1ZSNE5IMnpHSklud0ZVSnVtQkFsdElxSkV5TEYxL3g3UmQvVGhSOTRCL3U2RWZ5Ym14WXdyZjl1S0ZBOEkvRzlsaUtQeTdZU3Brd3ZjM3NOSjh6YjRZcXdtNUMxSUhIMmhPT2RKRDMrTjdDWUs5MUF1c2lJSXJhcGVPK1JST2NDWVVSbi9iWkZRVEloRDFBRnkzM0FrRnpSejY1aUF1UXdVbmw3WWt1UGlmVkZ3bm9zU0d6NXRLS1B2emFVT24rb3Baek1EUExFZElhNkxuRklOQWRzc0xxKzJvbXJpUHJzejlBUjVueVFoVStORTNzWVUwZW9tUEFpOUs0VnNLUzBvMVB2Ukw2RHl1RlZKOGp5YjNGdjhFUStXbERLZk5vTHMrUUxlelR0ejI5OVljemYxejFiWmdHd1UwbzlyK0tjdGlPLzZZRDFPQXk2b09zS0RaU2tGVHJtU1pWbjQyN2hhQ1VIWUZpZ2FIUEIvUW9aRzBvTU42UW9Za05QTXhNbUhXMU53bEhUUkRNaDRsOC9BS0ErWE5ZVTkvS0tpUmFtQy95V0syNE1YYWZlTmF4OWNVT1M2YXkxNWc2Z0xQVTdNYlVvZ3dyNUxtdU1hcCs4c0c2cmYzV1lFZ1ovR1RLTGZqTER2Q1VHa2d5eDFMbGovUHBwWVprdVc4QkY3R2ZzcWxvZW5LaUZjWjFKY3FnMGdOU2pRQnowUW9UQ2J2YlJyNU9aNVpyVjJxWmVwSExOT2d5d0pScmtCNUJXcWlqN3RBNVJ5QWZtQ05wNUlVelVZbjY1S2dIcUFXbktva2M4RkdvWnh3OFhtOTJzKzBHb2pLRERTVFNaYk1uUHd2OUMyamxMZ0hxdUEyWnR6Z0NNOG1nTTNVY1BHalZFNndaSG5jSTFhcGx1VzFqdWJubEo0dWRiSDhWSXRzUENxWHQ2MURtTVNiR3VLZkxjYTBKUXV6V014V0dHdzNMWllGUXBHZ3F5Q3A0OWxuTFZHcG5rQmJoTGNGbzYrd0Y1ZlVKU1RieWZmTVJCOGxRemlKRGxLUWhuYS93ZmJKU1BENzZMOGFqS1d6NEJhWndiQUV1ZVhmbUFNV2Y0M3E2aGdtZUZaY1dQUk1qckwzbUs0QmlZZTQ3R3k5M21MeWZFZlM5S3ZjSnZTbFV4Ny9MQVY0Mk4rbUI5cW16ZGJwVWRVUWtvZlhwTzMyTjYvM3oyZFQ4bXFsWlZhOVlrMUFhNHpMbElZeklkczU4TFduNy9Ca1RlNG16YXB1TjJ3MWY4SkpvTnhEd0cyVVJxZlVma1ROZklBdHFPRlJUUzZ5UUJPclJMSzVSV3BBRzVkU2R6cHdxVXdjelkzRDhPZ3BTNndDOFFDNVRNVHZzeG9ycGpuZWp2UzIza2dBekxlMDJnN0p5akh6YUIrSjRxZmNVdHB5TWVRY2xadXJocXpobHg1cTNtNXgzMkJDdWNFUlJ4cHNHSEI3OXZnTENUd282aHV1MmcxVW8zWG9kUk5Fd1p0RjhmazNOeGlMWDVkZTVBUkZIMExmckFsRGxJd3AzUmNEMGxkM1hoYU9Id0sxYnp5SWdUZFJVSUxDV3RMbEh6Qnk0K09tRW9wbTVLM0dNeVJFV0RQVmxzNkV6OXllcVhNSS9NVXYxcmJwTWVGalAvSjU3emlJbi9KemlxaEZsM0NNeWJJY2ZTRFdCNG15ellVbDFycGswcjI0b2xEcXpYbUJPZ3BQMUtHcTd3eTJiYlBoZ3Vvd0hnWm0xaUdTbjF6b05NK0h1c04wbmZtaUtla1hHTGMyNmk2bU9tc0Uxa0ttTHNMZjhORnRiRnlIMUx0TythMUVZcE9NaXlDNWZoKzNOd3VYWUh3R3VZZnVJVkFlSEZ5N3hyQUFrRWF4RERXbHU3c3RSclNkMnp2a0o1V0s1NzRNdE1qU1czS2RNd1RSVFFGaEs2dTJpaldpcGx3Si9jU3FOdWZqQ0NuWG1PNDZ3U2t5MmtibnNRU0RGT3d4ZzA3NmR6WWxNTDZUbkN2bGNHcTV6SjMwT0g1VldGYVI1RHFuUUlKck9WbzBvMUh2dHpwdHoxbHlXZlVNbW1FS2pRdnMrajBaa09scDFWL0ZsVEl5NHNucmlhWUFpcis0NFIzSnkwaExoN0tabC80NzRyZVMwNFhuc001VEl6VDEzdUdFWVB1NHN3eVRUNXNRTFpHWC90eitRTkRiRWVXTzNtbTZhSU5vQkw5c3UyWWh3VG8rdFBCTndjMFNqZjJ1MzI0N1FHSzBnL1VhakVKZkZzQjlSTWs1QjhMK1ptOWZKVjJCdjhDbitBWEF2bXZrNXg1R085aVlUcVpqbHZhY1ZUZEdMVFdPMmZ5UW9XK3BST2dybzFzMFB0TGFwazVaS0xub1g2ZjdGMVl2SEI4SUpvNjhUMnRBVXdpaHhiT3crMHh1QlpEUVlkaHdiNzhDQnhEQi9vYnVWME1hY0JEenVFbUVXMVdqMk9vK2J0VkE2cjVKczEzZU03WUVCNHVGZmRiZHMxVk9sWDVkZ0dYcUtCV2dNRlVNdzZCTlNGS2dQY3EvVVdmQksxT3NXcHIzOThubDVwZU9yK0YwZGNZV0w3RXovTUVtckpkS2tsS1VSUVFiakc2bHF2L0l0ajNwU1JoWVpkT05xMmJDSVI0Z0lxU2k2VSsybHEvaHpZazZFMTZGTzI0TmZMY1Y0SUhGcjlscXhoTDRzNlA0eVFCc0JlOCtjRTdUOVRsOTJia0JzN3VNdUZ1dGVtelBBZzR1YnBGVlRCYmlzMEZFM3VRMis5bUJ3M0o4RG5ZYzNtL3FWV2llcmpBM28zcHJ1dFhZTENhQTFSYnJJUjFkMGFtYlVGWGV2ZCtPWUZNV0FQblFPMTB2UGVtMVZHKzFDYytmWWRMWkpmNUY0MnU4U1BOa3NTNnZuMUhyMmhVeFluMThSSFNBUERLcFFZOVk3NUhRT2VxcjVFd0hDQ09JODVneFVlclAwM0hzbndRV0ZUWEt1OUFsdHJNYzNaanJjOFMvaEtrSXVIT2ZDdnBNdTdhQkdpWUpOQkNzaEVONXVxS1FpcGE4WWFzblZML1FrM2NXSGtuN2JYckQ3THQrNFhUa0RMSktzZkxFZzJlbk9JQUJRbGZkMlpMbEVmektvZTdZOHJ2M09Na2duSThlSEJ1SDAvT1B5SEU4ajVBTTJCcUJDZXRPNkdaZ1k4aGg5QmVZWUtZeldoMnh5bkVvMkptTWNlS2hBeTkvTjJoQm5GUDczempKL1RXS2VKMlpBUzdIVTRBY0tzNWtWTDNNODFKMnNSTEVrenRUM3RkK2ZBalhWc0prQWFocGJFb1F6Zks0QTNQWE5xdzRxUUJwQ25ZWWNzVmt0SlpnVXFndmRrUzRVRldwR2dHaGJmUk5QQThJSkNGRVJDMGdvWk5nbHZ0M1JIN1pwSzVrVmgvU3FvQmRoZjlQMjc3cHovRnVxa0lCUDEwNU9aYWxiTHM1cnFyR05zMjRZLy9pYnM4RXRpZ2k2ZXl4amdsZDl6LzBCZTN0Z2RYejQ5TEJKQ1JQNi9semdaSFlrRm9jOFo0a094MnNhUVBjUmRVZjRTZVgzKzBsbTVSVHZSQ2EreVVWZnJpNUZuOGZSR3BualFkNGZGaGlKUGorOTRONVRyc3hEa3liSDJFZ2M2SFMxOGVoc1ZPYW9zNkM1MDJKcEc2YnJmem9lajQvV3k4YXROeTFwRmJSN0lHckRqc3Z4L1JzWWhlUS9NQWNOcEFBeG1qbGppUjFOZmlZWUc4STYvSXJDNXVjT2JISTgvdTdWVjVpMG5Pb2pQRmtNZmhhSjJwVWFOUlQyQ1Y4dHQxelh0anA0a1hmZUFoYTlvYTRnbU1QUEs4T3RsMllQd2tNc1hQaDQvcW9VSFp4dWZjcmQwUHR0dTEwU3NSVGpOMVQ4M1FNS0VoMXNoOGJybWFzY1lkcTFRbTBSaVVSK29PVkxxb3F0RkxnbmNNQks1djVGaktpWkoxMmhlT1BPcm9QWTg2MGk3UG9lTXRMRlljWmk4OTBYU3A0c0J3OWdHRUVINFRpWXJFMEdHL09JZm4wdXN0cUdYdFhtWXFZZzJ5UDg0eElJKzNRdVJKNUhXQ3V5UUl6blR6T3FFTXFPTmJSYjFNQWdPY3dIOWtwVjdSelo1UGxCZURnM1F5RitUTjIrM2F1bUo1MUZsOU1zQkhxaDNaUWlJVlJyYnlXMDlUaDcvRFJDSzlua2RaZzIwVnJleVZQZDRicDVQZWpSQnhVdEpNZzE3WXNKK3RsMnhpWXczL1dWNGNhbkxESnZMakF3bUVOWE9RTktwczNUUzZlQVhVaGtBNTdEanhtWG9CRFBsdER3VE56TkhnV0FET0NXeGpZaDMwNC9wWDFOMThJLzdSVVhtN2l1bHR1RFZCam81UHBsUmlOOGNOTFFkL0RkeDFyejZWOVRtYkZIRmhJR3hpRC9FNFNaSTlOaW9Ka2VGSmFaK3VZTkM3Uk10UWgxN290QlhzUWJsQThwYW01T1BzNWhmcUl5UFhEcUNTSGdycHhwRnlPQUNxRHVmTlR5cFhYUVFlVFhzTTQ0cGJ0Q21WTklTVk15L1o4S2F3RkZ6d0d0dDdUZDhNMTZsbkVOei9SNEkwTXd4dVdzZk1hSm41RVd4aTNZTXhYYTY2VEJPMENlNzVVWEcwbjBoSTdxQUhJUXV6S1ZnTnp3WjVMQ21Yb2pQVkNPaDVBb3VBQkwwR0l0Q2lmVnI0dVRRa0JqS2JqeG03YWZLdjhOWTZua1dpZ2hKekRHQmpobU9xSjJHNkw3UkpKa3FuSHRGaVZ3Ni8wNXB6aFE4SVQ4aEdJMVN1UDZtdWVlVVNwandJTXd3QWpzRFhSWlhhRjBDRWlqS0tRYzgvSHFpa1V3SysyQlpIb1djUGd6UnorN2M4UjVxSFR4UW1ZRlN0b3Q0U3NDYktBTjZvMDN0UU5teXJCNG8xSjZQdjRsN0htblNwLzUxaWNPUHZlbVVyRC8wdDRsbFBFemNRdWZxeDlWWkpHM25pcDRoV3JZdmE5SFpURVhEeDlMUE9QZVhzVy94MnY2aFJLdlF6SHpZZkpvMTU5TUZvN3VLZVdKdWZsZm5OclNqYUxlZlllZm1QSkk1c3VvMFh0S0U2VlhIQVczSjRpVVAzTTBJZ2RJcm4wNGhaUnhYMGswZjVHTE51T3JJdDhaU3JKUFlyWGs3RlluT3A2UXp1U1Z3WWZ4OHZVSVV2cHRoaWZXcTFuY0FhNkpCZVlaQ2dqMFhWd3VXU3lJUktkTVR4WVcrOUk3bmhheTRaTjJiSExpR3dHYWZjeC9yazNaTE9uL09QM05tak1Wbld5RlZUa1BXNUJTVk1Ub2RYTWxCRUkrSDcwNnAxLzVvM2RQODJYRGFOa3MvSElQV3pCVHZFUURka3FGTEovUkZpNEpiWmF2c2lLdnpaVVdVYUVyVHJhaHFhTm1NRVRwNmxRaUVMQmVhbzFzN2ZKWUhSNmNlMWNIQVYyNFF3OXY3L09qOTBQSWE1amJqajRhVHB2eWgrK2RYeUJ1aUEwaU1WVjU4RUI4TFhhMXpiKzZzVUtSUUYyYnV2ektZeUNnWHE3cE9TeUtyN0dXZWNqbWhsdjZyZUh3SXhuTzcvc0pGa3FCMU14UHh4bDQ4bkFYbEtsbXNET0Z5d0R0VElxdnlMa1FnREZhS0kxektrSkVnMTlvOEdoRStqZVJFc1BsM1RkbEhNTTI4NC9tYVlsaS91NE1xK0YwUE5KUXdQMTZBQXpBRU5vdUdOSEg4amt1cTZ6NjJkSTNQWVlNYzJrSExnYTJ2SkFnK1l3bWVMWU5WYy96UThZdlVGZUNZK0JaYWs1VVUwNnpiTXpNQ25TNE9CaE1CWFFINWUxeFJFbDVhbHB5c2lxM1A3Zlg2N0Q2ZmFDd21PVVRMM2lqYkVOY3pFbzFod1NvL1dXTjFMZVV2aXZsaGx5c3EwSVU2SSt6OGI1bUNXWmpKeVN0Tkx5NE43OFZBSGVyWjFJRmJmajErMW00akQ1dTFGYUN1a3BvWXBJa3VQWmExVjQrdFVFVTVQRjlPU1hLUVZUT3piZHQ0R3BrU2txS3dRTGhQZjV5RlVuY2V3RVRoa2s1NUROdUJXVHoxcW4yK2lZdmdibzB3RTZxYzRCT00xby9ra3Yyc0VUZWtCRlYwVWlpV1dGYzkwcGVhVE1vaWoxOEQyZ25wcThDdnlvSStKYk1RbnJicEhyWjdCQlVhVFNhekZub2g4Y3dsWHpOcU5EcDJvQ2ZpYmNMSlpKZllsWFNIcDdscXV1cDh6WHpialJaNDJQclBwMm9yM0JqL1JnLzVKUW9IRXJPdVE1VGtGYkxqaHFBeGF0N25aNXhUcUdINzFNSDNlUm9OcTYxOWpMSEhEZ2kvOHRXRi91NGVLcXV0a0dCbGRFeTN5ekNUbmE5YTlrb1ZvL3NaTHNvYmlYcmxTcjNTNjNCWGRVZ0RyU0pPSjZvUTVoT2RCbmRSZFZGck1WRzBmUkhTM0xSdm16MWJVVk1wQ0ZJMFg5eDdBaXRibnFiT24zbDZWcyt2b2plVmdZZGU0cGxoZEJMOWZyeDBpeW9vdFUvcHNnZ0JMeGEwS1ZTc0lIS1MvTE9EM3J6MFN3L2FxSjhxVStCdmlwcUF5VFJXVWttcWNtTFdpZEY4WVYveVBEYWVoWUwvT1JtNllXa1Q4OThWTTI5N283aDdjWG8vcjlxTEVQRUt1Zy9GMXpka2VVNWlDaVk5RmJJSmtMUEhNVCtMbVp0eHh0MCtMTE5SdStIdkt4TjVNVXUxdkVpZTJTbVJkdlEwYjMvUlVSNGdqWjRHdWVvUlJucUZ6VVBvRDBJSDhyaVMvTWs3cVdtSDlFNGE3VnAxUVdPekY5WFA0bGNuYmV6TkxpNU5aeUQ1MEVETm8vd0RqRHRFL2IvZFY5WG9wWTZleUpaYVB1R0xuUy9KT3dXWDh1N2hiWW9Kb1FJRVZnNUZoZ2o1QVdBK0NGN1ZJMmFCLzNubEVQVXBzRGdLVUt4dkVWOEFpSjFoazF3S2crdWRpSXlueVRXYUV3eWp5ZWIyczI2bUtINGZxeVpiT0ZWRVNmU1ppemVlREdBSHFaUk9kRlBDSFhLVlVOWmtvMTROQUd2N3VpU1Vsd0s1SURURkxYSTN4N3NUSkJuMnRDNWoxYUloNzhtR3ArUFNzcFpBMmlhalZuRUhvaWkrU2JJMVdIYTliTzlIeU9TcjB3QjZUazN6VFZaM0RkK3hqdU1pVVFaR3ZLQlpMQWVFeWtpd3NUTm1oUUI5cmIzcHdkOXh1ajR3bmh6VE94QW9wUUhrc3FsRGtkWUtFYmluVnFMZ0JRekRNMU1SUkJWdk80Q3pPeVAxOXVHT0hNUGdpWXYvQStjUlNpcHZzeG84WThVS3lIVG44WnFSb1JVVWw5clZvMTVoVWVBeXFpd2N0aXp6ZEpzYkdoNUpuZHgzMlpJbURWQjNUR0lsYTkyS0hLK01WdjhJNElHS3BvNWtLRWhkMDNrUkNqRU05czE5VGZ5Ui9NZGxBYnZiSkI5MGJEK2g5ZXAxSzA3Ry9yL0tybzB5dytBWEpjMmlSWm5uL29Cd3BvQkdxNDFrODBOMGpJVGZMN1JpQnh3MUU5aHN5bkpZa290MTdjeWtsclM3Z3pXQ3pub2pLajM5TGZvaXppQnRHZ0xzSkk3cEZpS1JHajBQTFBFWDRzWkJKSUFMTHlEdVVHMFlkMi9UUUZpYUNyL0xScVlEelFLYTgvd2wyT0FOWjViMGI4dHIyZnVkRkIwUTEzR3ZHM2t6MkU1c3JPN284OUhuRXJKazcxcDRlSERxYTlFbmcvZHNaSUhwVTRYcnNzOVFXaU81R0JPK1lYc0NYemJWb3hUTVAwSGRJZGVVem9tQnRaSXc4OEtyL0F5Z3VJZnFPWUJ4bmNGcHFFbkpVN0JtNmVpQUp6MnJvc1hvc2lIdGlvc0NZSGltMXRiTzgvT2ZEV2FMeUF2MFhtdGg5cFNRN2I5NlJqRXgwTjlOMGw4L1ZwT01LZzVSd2FFMEpOUTkvdDVOL3lRVVlGZC8xSmlQcG5hMy94RmpPUFdheStPZjRlQ2lMVkY5ZUttYS9uTXdrejdmNG90S1FuV3o0ZFFwY3hRbWJ5cGh4aGUvVXpEL1QzWnY3SGg1YmRpMXZqYmVab1B2VDh0L284b0l2eTBqLzJUdm5HNDd1T0Ztbm9ITEpzK3FOYlJIY3M5My9uLzlCcDAwWC9BVU1oSGZraUx4dktLajBsMEhBaXVCbWozRmxxcVJVSVQ1YzdwL3ZDTGJwaUN6YmUzemFicXo5WCtYclhkWEpCZnZpRFBOWkZ5ZkJNNEdtVWZTT2JIYkYyb2EwaDY3VGRybTZudGtjaVZOTmJKck5uTVZONXo5cmU2NTdyQTdzUFFEbExZTHpkQ2FOSkVWM3VhK0l0R2IxVlF0SkdleVZXaWh1M3hacFZ4QWpURDRLbmtLcDlaU0M5MlNjdVFuQ3dYTTl5VUNkT2R5U3hkR2ZmY2VtMkM0TnduV3U1Q3EyNTJiY0tNOUNUSktaVVhGalVGSk5qWFducEorYkhlcDE3aUJlQkFQSWxaM3Roa0VUMmxia2RoMnFEZDdSYmduOTl2d01CZGozSFdJTVNmTkhiN2hEUThGQVREVWhTak1PZkxBV2lkSXVyQ1cyb2ZJTGlwNTFFcDFRck5YN0h3VUtLbVlYMjZmaHVxWGNnTWNkd2RMaUdXY25YWlE4azRhSlpzQlpPOEhWVHFYTGRIdGZLeGRKVmdIZDVRTmNha05hKzVIVDdNdDhNTFZjZE9xYVhUY3R2dlZVaGNvUVJ4VHVSNFQxU1JadWllSnoyajc0Y29UUDZWQUpINGcwNlk3Q1FHd0ZVK3lHWUd3elA5bVg3Nzd0V2dmcmJ6NEptK0FTMjN3T05pamZCRzV3dUxTdnhvQ2lNTlZuR1ZIWlNTcjdBVHZyYnlVNGRnVGJUaDRsWFQwOTdWM3BFVVF2UkJzaGYzK29TSENXVUlFUHNGV0JBSXNuUXRGT0pZVnhoYkxzZCt4SVFrMm1KckFiS1JvZmpoRDJhcnBOWmRPaERnMFZrdDkwbmtRTCt3VlllWHducUVOY21NM3p5TkFjR0RMaG1GaGwxWTU4NVdxWFRqRHN6WVFpUHQ0TzNQUWJXaTI2Q2l2bW5PVmNmNGY0L1FzRzZsd2UvY1JVVDZXa3hwVEs0S28wQzhlR1M0Q2l0SEZNRGpSc05rK0pTMHJVOEE2NmtHTFRWK2xZR3JrNU1nRGp5WTcxUW1jczZ1SGJkUU5ua0Q5dElJanpaUjlTclUzNVMyQjBhbC9mZzZxNnF6TmdqUHdWSDdmdVl1eW5iUjdEQlpkQXFMREJLYjcrUHNWQVMyb3RQU3E2UlJhVE9YdlJLWUgyekRDVDcrSS9uRklaRThQUUVQelFJbGp3cUU0ZnJhbWoxUENFWjR3TjZNb0x3ZEFkTHViRWp1aUpialVwLzloMmNvRStJNGJRZnZtYm96TUY2TUgySzVEcHAwaGxvUWo3c2NKVjNXZVIyK0swT1ZhZEhNL2EydjcyYnY0SGdSUGhrZFR1QklnNHhpNkJJc2R2UjBML2FPV0xxNk9XbWJjbnM2WXR4ZUdxbkNGa0hUakdPUlplSUhBUlVzZkZPVTdqSlUxenJuN3JXaFVHa2ZITlcyN3Z1UEduaU12VFF0S2NHdVVXMENhTDBITG15QlpjcTdEV2J1bVprWFhGT3hCaGlUZmo2UzZqNkpGY2tXaTNpMjJQNlFOT09UaVV6MjFzbmlMaXhlOStGbWZtdGU3d0t2RXowNDQvbXNzSERqc1cwVkF5UEZzNkh2ZU5XK1h1TGNvVU1tWmlqLzkvMko2TEFZMFdPZm1iUExCallSTnZaTU9oYmYrZ2MvdmlJV2ZwOW4xa3M1aFN5dk1FSzlkcmFhRWtYRWh5clZFTmRmemQvclgwL0syejBIMTlwaXBuVkl0SlpDQ0h1ZER3ZnZ1dXNaa0JqL21PeHBJNVBBNFNNRU5WOTMxQ2RaUyttL0ZBSXgzN1ZZOE82YWxwQnRFSS9Ob2RNZmxiN045Yy9DQnJrT0ZYOWYyTEN6dXJRTU5LSlM0VFNJcGQyc1ZsRXZJTjFHTnZTR3pmVzllVi96aUtRcjVQaFJLeFU5RG4zaGF1blorditBelBaV2JlZ3NyS20xNytUNGtrQkk2S3RjalJQcjk3VGhrUlBZVVdGWTVFR2hiZXFGVXcrN0RUZVBRUTcwdlBZTVNjYU9CQXZxWTNETDdlRmI1Y0ZzbHoxYzg2ZXZESlJZU2p1d3loWm5wYXgvYndvVzRKejNEUEYwVE9XS21iSHo5ejBRYjFGaDcxRWlneERLbUFCMFd3SlRMZXExcCtOTVdUM2ptRHNGL2VKOXZubjJkbS80aTRidVNOb1V3bmJneGgwNE5CcU0xdksyK2VlY0NGRng1d0trN0hSMThmVjJrN1BQNCtEd2ZHWnFEL1VrRTBvYllyWjVzWEZGQ1dBZ0ZvKytTaHM1bXJKWHY2dmtqRGlScFVncWFLTlhkZzFVd1NEeGo3NjdCd01vcnowdEsxVUtGRWxFUG5ISXoyQUxraTNyUC9PR3VheUlxenAzc3RYWEE1czFreVpMcmdoRkhzVzlwL2NSZnU4VXptamNYSktaSm5TVTBiZnRzL0NmT1VQNmgwbDQxYThpVjRra1JReVRQd1Q2OTQvWFI0MDFscTVNZkxVZFpHcmRTbElEQkQ1Mk05cFkzd2k0M0FnV3QweGE4SUkybVpJQUYzWXRPQmlOdDJGVGU5OWdyL3ZhTnJWcnBBMkxneWcyT0U1MFhydytSektJWndVa3RIU0VEa1V6OTVSUHhkb0hpR1NoV3RoSXVZem0wVDZzQ2YwWmZRWjI0MTdINzJENE5xbXhodUZtNGQwa1licTFXVmhyNUFTNlgxMEVXdm9SUFpIbHJ1aXZ4Tlk2Ullucm1TbEJMM1orVkxwZHNRTjAwK3BSa2xvRXhBd0NrazZHVTIxM0dEV2lVc1pQd0J4OE5YcFJsbkZqZE4rNlYvb2E3d3pFY3cwZ1ZGQmhOWVdQNTVacUNDTWtNL09XT01OQy9Wbko5K1kxWE1jclBoNmlYYkdnNWdVVU9hWlVZM0dRdk83LzRkVXYyRGNmTk1NY1BTZXN1c1ErRGpRYlhRTmlqM2gvRmQvbitTQ0F3RU9JNTZ0YlpReDB4ZjIrdG9VcTNieHhING41QWowZXhKWHM2d2Y3dXRoRWs0VWdubEIrc2t2cVBqalB1WEp3V0tRWlo5aEZ5RDRtNXVzUHdoUFBaa1Yyclk5QmprbW5Ta3ErT1Vrd2JhbnNjV2dMWG91b0xLM25rSitVUEEzOVVEYWFuZklMVklqeEtldXI5TExaNnFseGdNNytDMm1uZFE3MHozd0Z5ZXV5dGhWcHdHRGZ6azJEck9xSXlYK3ViTUkyaEdpREFUdnkyY0FSbEtlR3hZb2ZWLzBiZURVbC9MQUFiMStxTWVvY3N4N09UcEhKekpGNjNRV1hiVTBWSk1CTE9nQUI5bkZURFZMTFJoMW9vR2VPVkZPcW14dUNUcThsRDNwdEVHTDRQeXVGbTNhaWZPYlkyVGlLT1licStXRDUrRW5jZ1ZEc3FvRnk0dFA0ZlpTQXg0UFpYZllJOGVrbGxoeE15bkVmQndPczA3RUlJWm5pTExJMFJ2Rm5pckswcWYrSVZRYit3SjNJMEVqZ2ZSNk81K2pFRThFT3RZMURLT3cxZm1ubFlna3BBb3NHeXViVC9VY2N6aWRvYjc2ZEpwY2J1d2Nsdys4TFhNQXhZTGNUVW9iSzNPTUNPdzZMYk8zSTlpQVRHNElhc1FOZ1ltcFdkalNkbmxQWHd5aGIvY3VKQVd5cmdiZWhVZHpjRHhvdUx5VVM0blEvMmwwcm5nS1hUVU43ZG8weGZhWFV2eHZERnB3SjROMzJaMm91RGNOWG15L0F4Z3NBcmdxRVJVWkM4RysxUXR0WVJZazFwWDZPVW9Ga3JjMlpRWTZsY2NPeUhiejN4YTlnSVhGa3NSeFU0Nm1ETWpnZ0R0R096b0xlL1NIS1NFNWJFT21rdWNlTlJDVVNLUkVoLytJbGQvQ24vTE84VWRMNWV6QWw3VWN3dE9iN3dtWFVDUk0ybGJMbW9rVlhCK2wwV3FRZHI2Q0NUT1p4SU5xQ1Yrb0czVXpHT3JrY2hrb3oyUlpseDdhSEc3RCs2c2pjWFJZa2hjckNHZk9pano4OTZhRkU1aDEraWl0clF6anlMQ2lBWGd3YnNTVUh4UUp4cTFra2dZZmU2VmgyRlFTbjkwQ3d5ZU9ZTU1vRGdNUGxURGNKTTFVbTlYMll0eGtTRkdXaTgwOEpMS2ZSZkcvbmFlOFA4djBUUEkvSHlzL1pGUHV4aS9OMjA2NjdrbXpCSkNKVC9jaXJCWGVCSXM0SlhrWjlJK21BUFAybTcycHpwQzVscDgzYUJCOTBpb1JDTUowV3RSUk41RFlHYmsxTDk0T2IrNzNSWkhhc3MwOXdkM2IyWm56ZDRIUlU4V1dQYjIyTXk1Mzk3cmxpL2tiRDBQNlRwKzNXRUxHc3hUcEFTRVZldzEwUlJIU05NZTVUWEozVUFJaDlCSms3a085UFArb1VpVWNNQTBla1grS1JaRC9qcVFIWGE4N3V1OGNOc2pkYzUxNUlGb0VvWlBFZHIrdjdGM1A5NGZsc2kxOTBPb0NjNXQ4aFZtaWJRYmlrT3VVOW5rSVpDVDIwUnBMdFIxUVBGeUNGMDE0L2FyVi9IdlNIUmJid3dJWThQaXpCSnRmOXdBaHVhVERMWGZzNnhWYVFoeElUUTQwVlhKcFJFd01GSTlCNmdZYXYrQWw2NUtUM2dDVnRRSUEyRWhhamdWcjZWNFR6ZWhpZzdNVnlGV0ZoZWlaQk1MQzZqdG9LTnFIUTUwMG9wZE9reE1VZGZwM3k2bkhvNGpCS1NwRjB5cWFtUXRSMnJ1SlZ2Z0EyaEtZZjkwemFwTENjVGduSzZDK1FFWFlCOVJ1c1pSakJ2RkhqZWdrTFpMZndLeUNiOW1CTGNkelBMUjZsVHI1aFR5NlJwRnE5WkllbFR4SG5TOGdqWWgyNXpnVWdBeGw5M1prZk0reU1RY3E0aXNhNDFWREY2Z2lpZWh2c2tKMFRRMXEyaFJVbkV0VTlNYjB1RmNCd2NWNUdIeXd1RlM1UzNBVHhrQWQvdFRwN3hnWHMxVHBSQmdrQ1dRdUR0TnQzWnFJaWxvaStjZHlxYUxwTE5XdXh3cTJUU2c2RDhLUjJqSmNxOW9VK0pYUVFub0l5eTU3VDZRUW1VR09sMzdkWHkxYk9oTEo5TVhFZ0tsdjFlMFBCUnRTbVMvSVRPTy85dFVoc3hxajBZMUtOWWNVQlh2RDd6V1VEbEQ2YkpFZlp2bjd1Nkx1clUzcTFqK2QvMDJFcFpYalg1Ym9zTUt4R3dKQmd6QUR4T2pWR3FWVUx0MlgrWE85eUlzMmxoMzlpMjhCRmFZWEVPay9mSmIzOURjT3B2WWwrWThPanlCRVhYOFFsRUZqeDV3dytuTVVOcFVQeEh4dzc0L1NjMzJ5S3BMQW4zY1hRWTJWdG9mZlk1aFQxb0tVZEdFSWZVRTNKWnNORVY4aERaUmtRNFRoR1VTQWw1SzUyRmhmT0JtaUY3Q24zRVAwNEpLSDZ6RXZ5NUpRQzhBN29sWmJ4bzJlZVdUK3M2a1FPV1l1bkJIc0V6WEx0SEJ6WWVpbFNmYlgxWXNMbms2TlQ2OFRYa0h3Sm95NXhjVlNTR21EMDRBcmd5U3luK0ZVdWMvQ3RQcGRiN2ZTeTdsS3c5YmY4cWxFWi9QTWVPTjhDZkk1TFBySUlPOFd0cFAwQ09nb2hWYkIrZGRsTjJ6TXZkZTdqYjhPSFRDbFBhT1d5T2VrTEJVTU5zQXBVSjZvdlpGRlU0ZE4vaGYrQTMxRnlseXp4d1VSeFN4Qkw5M256dGlXbWNGYUpXamtGWXR2Z2MzT1JyNXFKK1VVVUZMQUorcFgvY2MwVmR5ZGVwT2dGQXNqNUhTbUZlVW5WWHd6ZE54Rm5yeS9GMi94Y1l3ZDBNY0c3aVVVUUFqU0VFYVJNamd0NVYzUGQ0OGowb1gyYXk3Szd2bWxvcm5HTnR1a01Kb2xyUXNzVm1LMmhpczYrcHpmYXQrUEljT3VIUndpUDF6ZDVnVis5c3Z4QUJxSnF1SmlyL2RTSEY2RnJPa0dxdFlFZUlwMUhCU0YyZU9rT2pFVGVqQkhhQjFoT2tRdHJRRk1XdnhLSXo2MmNPOUQ0QXVOKyt2VFdnengxNHhFdVBvd2U1a2kvczNSVVdJWXVjWnY2S0hST3F5dzcxVldmbDVpUUwwdHZvcGQxa29obWM3YWc4QW9XL0kzdmJFQmR3OFZkKzlqaVFPaG1IRmROc2ROVGtKTTdUeVFONVl5OXVDSUdTdWNMaGd2QVpQUFhkaFdOaTZmckRBbWFTSXM3SXBGN3VML0ZzczdjRDBnWkRtMjRRUEFlS3NabGVPM2lyZ0FJNGJNbzVseGM3dm1kbkdabEFYKy91c3I4ZU94eEc2LzBzM013WDlKWjNTUnVaVm1yWk0rVksxdVBURmtKWUJTM2ZLSitoMVZnR2V0QnF3ei9SNy9FL3pRcjRvSGRRSDQvNU1Mb1FnTi9NcDIyVUQ2c0tpSWY1eU9jYko3R2wwbVRDcnhYZkZsbDBTbDZoa2hudmMrZnBaZDZJaW96RE9pV0x0bzZMZUNyZEJ4OEFVL0ZrcnV2NnovTC9TY1B2VjdxdFFaUXVMZnBwSFU0ZXZRUHRXdnRnYWxHdzFmWndCSkFzdzM4QTF1eGVaWTVYbWxuTncreklZZWFiSzgyVnpSQnRPcWZDdW5mb2x2aDFyRng5cHM3QWhZaDdFcTNuUnc4WDBtN1BhdHFhRHJHejl3b3hmL0tMcklTQnczUEtCQVk0NmJUdXUyUzFOb3hPTmV0VktUSG9XRUFtUHlxcTJmMmJOUDhoTUw0blhmU09sY0FHUFNhTVJGUzkxRWo2UFh3RWJvdkx5Z09IanlraVZTTS9SQTF2L2NwWSsyUlZhNjMxMGlvaVNvMVpNU1I5MHVGMnRmNlJCUERCTnFHUXJ1bVNzM1poS0YzZjJIVFdkNThWd1IyTjRPNHpPQXFPSkZBUXNTUWRWeXNMRzRMRG0wYkJaLzlSOVJNN1MvU21nVGJTQlJLTVF5WWY2WEl6K0Z5dWp0aEprdlpmWGUrOTd4SSswRnJ4dHFXMC9jcTRjSUpnU1NGSlZHRDFHZm0vV3l2KzhOOXRSNUhCZ1RNQ2YrMDBkM2hhYytxampXRW1ZV3lIeGs5UHFQczhiTDVYUGUrZWtJQVVsSHRPR2JJQ09UMW5tbHFvMmdmNytkakhpUHd6Q3BDUkM3TGVYa3oza1RZWHpTb3F5c1BTNEp1ekhBM2ZxaEFJRzJWTWV3VWQ2TTVKQ3ZFeTNyWkNwdXYwOXB0T2xPb3k4RHYycWg4R2pWMktpdmk2S1RGQzBwVFM3YTNCbGNEY1BjL0Y3U2RJbDR1VUxTMTNWZ2xKc1hXTlRVMExTN1dwQ2l5MG1uSkk5dy8weUdJcXZMMFBlakRmQ2RoSVkwaVM4NkxlN2I3NURrV0JuRFdFV29vUzJmZ3NWQ3J4aHk3Umx3NGV5OHBZQnlaUzAxdndibHNHRW9QdkdPcTVKSmNpRUNZajFFVHN6b1pxcjQvZm5pVFBCc3JYd29tOFlnZXFmR25QUFA3L2YxQm1RaklWcENtak1DczVBaXFxV3dhbmxKVnMvemhBWFlzVTQ4WnFyZGhCVEw2Q1ZHWURSRk9iT3J1WlJqZ1BoakVyMTFyQ2J3L2p2aEt2TG5sZUtqVFRqMXp3N29XZk4xM1BFRXpTRGwvaElhbzFrcDJDTEpBNXhKeW9rN21qZnp6cUJXMEhBNGN2d0VkUkdTUVNoM09kUG9sMDEwZlRKRFE5RzRnL2poRUxreFVJQWpWS0F6bmcySUM2dG9vTVRqSFJaaW5ZajQ5dGM4dHFqU2tlTlA4QWNZK2M4UzM3dGswV09qY1c0eitxMGxxNVE1MzJubGhCRlVKMTNVZHJaKzl3SlVoNjh1ZjBMZDZCWEF4czh6cWozaHIwWUsxZXMyc1lrQytYemszK3FISmF5TXdRNjJYdFhPOHlHaGZoUHZqeTI3clp3Y2ZEVWNmbGoxeDhwb3dSQ0IwZ3VSQ2FoL21aWVpIanRmdmxtM3ZDMUd3R0dxbFNvVGZLeVErRGpnblozeXYrc09YNEtYanBQMlpXM1l5eHJLUnV0Wmlja1ZGQXlVNGlzbkJGSHdiTmdxYmVjWmh3WUZXT2RnQVI1aVp1NXlLa3hKYkF2c0RyWk9DMXRNTDhSNGJvTGYwVnRKcVNNZTNJRUJod0pPaGl1Znp2OVd5UmJZbHNYUTdoOTJHR3gvdEkrL3BGMzN5Sm1GUHNUTk9SRW01WFZDL2dpbVJDZVlyL1hua3dWRFdSTUdRQzE2a01XN0ZSY2FPZDh5bzJQTkMyRU4vOWdWdGtZU3lNZis5ekdXTHk3OE11M3N4cVFUQzIveXpRNXFwUjdIelB5VER0cDlhRFNKK0MySU5ZZE1zcnZVdmZqWG15U0phWU02UXFySEF6UE1hcXk4dnducml2QVVzNnhtSkVDMGtoaTlubTIrdXZ1UHVaTHMyK0F0T0tjbVFxV095TjVJMVVyQWZXQmZFS2U4VldNb0lHTkNkSzN4ajNGUWVCN3Vyc0YyWElTTVBHZzdMYk5mbGRoME5ZL0F0VVBHSVduczlpS3diT1BiQnh6WTAyTk1kK3d6U2c2bWo2eXhQbVNxUUFjanFhSktyY09kamxkbVRORHdQd3YyeGtPcDlva1MrNGpXS1F5MVd1dGt5ZHJXKzlMbVlaUWcydllETUg5U2tPQkY5WW9qUTFWcW00R1JtcmJXSjVKR3hqUUhIanV1cDJuWWVKOFJITGdLRTV0bVpkdTdHbStuVEd3cXN5ZzJkeHBEaDYwYzYrdVZ1UVpQU2o1aThyNXM3aGxnU2JvdXJBdXRUWUhadnlQU0pTQ1JIQkcwK0Y5d1JUZXR3bzk5OFNhNkt0Z3A2Sk8xMnpwMmlwVEY0T3ZiNk4xaWxNNXVKbGpKVHVCL0psUFd1NXZENVdYelVaNFdEMGpNb1VMa0MzbUhtbjM0SFNqVnk5ZEI0S2JDYkhYSTJ4VUlXUDVKZ3oxV0ZQanl2NFpuQ3l0QXdDNlVmRTVZcS9ZWXBrTGxWZTVFdVovSWQ0dGh1a3d0eXUwUlVXREp0NDBtUURWNmpaUyt0Qlc2UGtwQlFuK29oYWhxSmJkT2lMUUpGUlV2RkNEVkpBM2V3TGFYN2FPS2lXMEg1WnVaMDYvVGZ3azI5QnlnL3dYTkN4Wi8xUXptK1ZacjYvN0Q4K29UUXAwem1IcTJBWlFyMzk5OCs2NldacVVsc0hIenFucG1YN2grMnJFb0IySmRNM3BzN2x1MFc1Y01TcUtiNCtsSDlidUovY1pwNWxURjRXVlJsSm5rbHloamhuaFUwWHZkbjdkeUZicnJFYWVIVU5EK2lwMWRkRm5hQzFTeGVSVDBsSmdGeWVNbGM5QkRpWGd5bUlqRUFkZTE0RVJRbVluOEZ0NUtkL29zUm5JZzRTU0E4L1hsNnM4c05HaXdiU3ExYVNLWUJOSVlNTlJhQ1ArUkJBdE5pSXpRVjlmZm4wRExrclhvY0xkZTFvZkV6eFhPa3lDU2NMVEhDajFsRWRwdHFiL0lJbGlNc2YyUnN0VHZmM3N0eXB3eWExd0h0Ny94K0RYakZJbXVHWHFNdVpaZnN1N1VOQVBoT2NoVXdod01LSm9XMGwwaHgyTS9wdVcrb3dXVmZ5cFB5OWpjRCtLcXRjekZzRzlTV2lrNVpQbkdPdzR1QTEwZ1V0NDg4YVJhQmtiSG05WHpPZ0xqVTdiT2x1YVl5UEhMeVUyTTkrV1JxVlVBSnJTNVNIVnJvMWhkbGc2ZGdmWGxGZkFlZjM1cXQxRWwvTkVGWXVGZEtWUGtzbGFPZmdDRnB3Q05yS0RHSGdyL2hMTUMwQ3JLaWZJaTc0QThpUENsdFZvd2VlWi9Ld1cxRTA2RnE0b3V6QTMyRjN2ZDM4MzAxRjJYeG93TmF6ODg5Vkl3WHY1STlBc1dDTE1TYXRNcUVDcno3dXQxUjU1K1ludjRpU2tVR0dENlpBUWZGSTVPaEZIQnZmSzNOVEk5QjlIMzhka0NiVWFTMm5oeFV3Z2huWENsb1VRSHIxVDFaWUVJWklTQkU0SE5KdFJHc014Q3VUOTlMWjl5MUcrQll4MWMyR1JHUElEL2xtWWJ5QVlEbXlCY003RUpEaWd4SlVoYUFBTm1PMFdTRFJaK3haWnQvK3h6UlNJNlU0Njg1L3kxZEF2dlNyL0xxc2ZPSS9zOXVRYk1YQXhSSFZWYVNTY1VaK1N2TXhST1pra1NTa0wyajF4WFhOaW9VUHYvVStvMjIwYkV0amlkV1Q5dFp1VG5EMnRTdk1iN0dibnJNVkNOaUJnK3JiTWJwVURYREZFampudmh6SVhKWmEvcm1VZjVEeXhid1lrNk9wclJxQ28zajFOWFBkOGpjWDVSMk5kWGtkSEhrbm9kb1N5aWlqYTdDOVRWSTdPeDd1dU9rbXQrNEo2OGlEMm1VK2oxdEZ0Z1FySWlaVjYyOFkrZmwzYlpjUDYzMWNGbFVtYUIrRnIzaHdMOWFENXZzdFhZS3c2NmFMbEFBZlVtM2xKeW01TWVxc0ZKV1pOR1Q3RldaczFOMFpTRDRJQWxDdmZHbzZ6QzZ3c3A1M3FiM1lSRUJNK3hzUXVIZ1d0OWY1d1JyUXcrcnF5MFVyM0E5TWVHMUlsNkZOallWK3VUNWt3aENSalYrc3U4UWZCS0I2eVVuS0p5czdMNmtZYjgrOUN2ZHUzazJuSm5lN1BVcnY2ZHhlVlNON0JOUUpEY2d5Zis0QWo3azEzZE54SlY1aWUrZTZlQklhR2hmSDF2M0dRdmZxODZWYXp3NmVMV1pkdCtnZUMxSU1teVJQT2luN2F2aWUzbWVtdSszTjhXZHlQVlg0SkJ3YS9CMG5lWFZEcUxGeGw2Z21BWnVnSlVXTC91RDZCWHFDWGVTZHpKOHA2ejRkb2lDdGxNRjBIZjJiM1hWdm9KQ2tJZUM2dWVCVlRPaWk2MlVCNHd0a00yN0NMZVFNeHNDZTVlcjFjdU1RQTRHQktmeU84RkZsV1RrZnFOenMvT1gxT2ZQUFJVclB3VWF2dVdNeDRDV3RBZEoyYTIyNE5EUlQvSndWWFE0SEg5azVqR0grazFUNDFtaEFQVnlLK1hSYXE3Y3l1eDdpTjQrMmV0VlpwZ0FCMlFNR1JET0k5K3p1MHpHRmsrZDZ0Rk5neW5xM1E3VlI3RjA2MUJuUFY3aVgwSGFzekRxa2ZNTkEzNnA0a2xxUHlsbjhaczdqSXgzakJrRlRtZmpEdFBETkt3KzU4R3J2ZWV3T0w0V0l2U1dFc0t0L2RJZ2tPSGhEVGUzeEtlZmI4RFVqUGdHRnBFOGxsVWZUUFpDNXFpaUxoT0VuRForT282RU5OZXZSUmE1ZzhjcE8rZXNlTENjNWNZa0JwV0UxSWRBeTBXdEpDWU9yT2gzYVhTd1JHSjNQOHRSeFlaV0FZUiszM1pGNkpyUC9RT0I5VFVBV1l2bW54b2NrdHNKR3lwMFlJWnZIYjlXalhOcklkdHBOY3pwUEpGVEV2eUtObmFJY3pldCtoMWQ4c01Ub2VXRDc4cGxCZ0xueEdVYTIzSHA5YmlDK2w0WGw1YXVXcjVQNUgxalN2MVdyaFlwa3BvU2NSRUQ5SzZaSlplVUtZSHRIODBUbWZWc0VRaHlzS21uUGVCZFZ1dmVpOHQrcDZwdzZJcS9hVWVZb2IzN2svUU1Oa1VVQ2pyQ3JpbXZnUWxYVDNZMnkyWkNnYk5EN0l3MHpYUklKdW9IdnpwT2J5akM5UVZkWUFWNnZVTUxybytYZERySHZPTy9LcmQ0MUN6eUVBVkNjUmU4cjNmY1NINFdSWDRjWmVWeUUvUTRVV2RyTU1IdzVDTWhsVXNudDlZWWVoWXN1alVmRkdMOWJ2SjZxL3pkQ1NXbGpna0M3NmpJMmY1WmpFbTU2dG56MnM3dzkvZXdwaHZQc0FUWVZhSUUzODlValFBZjFZajdFWE5FOTNVNDcwNlFET0o1dlVMZXRTckFtNlkycjI1NG8vR1BxdDhhc2tab1NRdUVIU2Q4OGxwWEZZWExrMVJTbXJRWFkzTktDRzFEUk0wd0MzaVpKTExERW84MzgxM0pUNnJXbkMzTUd2Z0JtbDJLejZUU3dkMXY0cUF2SWZXVEhCV2dtaVdyWEJjOGQ4UElZd3p5a2R0Q3pjMUdFUTdhWFNEbmZ4cFdERXZNY1hjb2lPVG5FcjFHNi9idkVhVVdoclByekVFZUdjTllxY1ZiaHl4L1UxRnBVVnpSSVl5QzI3MnRocW1ieDZnQ2lHQWxmNmJoQkdrRnAyOERDbXlIQWQ2a1BDZWNSRWVqTXRIT3pORHB0VThNWDFLZHg5amZKTDJjWHR1eEZoZ0Z1UmNHT0Z0TjJabTNqKzYyaDRLQ1RDMjRmSUlFRGdDZDNzRGd5a29FbTl6SVByU1V5ajlCMU56SGMzMkQwV3A1aEsxMFhHSjRiZGNKWEpSREJHeFQzcFBtNW1aWjk4RkFWNmI1MmZSYWlSQmk3cjhUbng5WEdLTFl1aUptTmRJNkw0VkFNRjVoMTZZZ1R0Zlc2eTJhM1JhV3VST1dmeHFxcEVCZDR4bXIwN2xyWjZQd0lyTXd0T0tXMVFxQ1VyVUJqb3UxMjE5OVZ1L0RzYzg5am9GRVUwZ1JENE1PRDNucmh6VHhUdWFtU3dQWS9hdUtvWTJJVzJzOUt5SlZkNXFHMmppN3VRZkt5TkNIWTBoV1RTWit5K09LV0tLdFYvTGlZSHJlcXJySDg0Ri9PSTNnakZ5eGMrMzVOVmNpeVNBUzFDa24rYnNIWVI2YzZxTVBiR3JxYXY0SXNYM21kZGJ5RFBDUi9oeUdMbzB3VHBIbUFVdVhmVXJ2ME05SDZyRXJBdHkwL0VlQXVKNElRVmpWRFlHTDBaMWR4cHExb2hjWU1iODdEdi9sZjR0ZTIyRnA2NnRvM2RsTGJIY2N0M1VPZVlubGhZYTNLWW11WVVuaGw3VE9RMzgzaklGd3RRWHpXejJuTmJvN3FsZ05PZlprYUcyN0FnY2tIT3Qvck9hOFJMdlpaSWJwb2RuTXZJc2RQcnArMDR3RG1zQXE1YXR0ai9JYjc3TkNuaTNyNmtZM0kzVGhPQ0pXSFBYS1NlemMyZ0JwbjE0a0QzUTRRZlBCOHVpbEFVRWF3U0htR0JvN2JUb2s1WXVxSmhJLzk4ZHRqSW9hb3pRVjNFNmhXdFJCdHdqZGN2RlkwRWFlVXBSZThwdWlER002QjY0bFZSUHE2Q21NeDdaa1g3M25GM1NuTFkxN05XMmpoUUNpdENDanhTc3l1SnRIaS9SMllCVzBNME5QTWx0dzk2aEdaOWRiYXNzenhZWDNDM0k3dlFjNWwzNTNuVDVRdUV3TGJQVEpkeDhvcmdlamY0MVExVzFUSjVyRzhvdEJKZzRqcmEzL1ZsWTN1anJwODVJOThpVWkxQWxZbXY5TEVSRjRrNXNFYk5aaE5uSitVajBPV1lrYWk5eE9lTUlvUk5FOG5pN3lDWHVzcUxzeEE4LzFiSi83NE50Q2RoQnhMWTdVeWkvTWRUU0gwdmZ4UEVaK1FQU3BpQ0hWcE1VTUY5M2dhYm83azU1TkkwN1BOaGlqcmtmVTNzcmc0c2FLZk1QWkFobGdVdWErMTNxdXpBZXhIVmlMTXFJZHNqSTQ3ckRZSElXd2tVUEJJV2Rab3VhQlV5VGx5V2IxZEZBWEFLa1kvMDloYXpESFZkRHVlbStWVnNRQnVyMW5MUWpGejBlK292bTlEallFdjhXY2VMYVhNRFpTMGRWRTIzOEE0djUyazJPVTluaWcvZWp6UUNaNFZPZTRhck8xaGxsS2Z6NHNjY1Z5NjhjUmh5MzlkRWxEZXNwYUhQZndlY2VXWDVKa1QvTko5d2ZWd1praWRFdWhEaGh5NTREMTV3aW1jTGFzaDJhRHVweUVqQnliZk5EOWN1VGtZeGZ6ZmIxbmljZTRLS1Q4ZVJ0VXppVFFzRjJYM3ZSeTEveU9HM2RvcEwvckRleFNYMEhQYUNXS2pVOUpKUXM0dnBsOUJ1Kzg0d3N1VkFTYzlOT3p0OEU5L3JlS0RreVVjd2dYTnNmdTVSbmplZk5KaHY0ckVRMldyNElHdWtyMUxLU3VyR2t0eSs3MVNnNmtsdUJmalp0R2Eva2cxekxNc3VaR093Nlk5V3krUlVDTmRlYTluVVJMbERBanhpTTZIa2h0UHVDOEJRQ3ErNjBHYmJrdGpCcnFpbkN2RUpveDJOSkVHY3I5OXdyNnpuWnRlUGVRZFZtTTNYeHY0ZWY3WGR5dkRNKzBxSC9NTzlIUmJsVzFOTHJRM0c3NHhFVzBuRnFRNThGY1U3VE1KYkVRNjdaZ1dac0lRek8zb3NFYkovc2hjR3hCc3F2bXVCWUsvM3RxVWt3NkNTUDVrS2JtMHFpT1IzYU1uR0ZoK244dGc4bTNYQ0N0bWd5WndnRDhhSVpNY3N5b1YzUi9hb2pDMi92eXphdXBKVUduNWZrdG9HcWFUbEtGNjd1OFZQd2xZb09DMkx0Nm1mcnJJL3k0NG1uKzdtTXB2YWdITTllbEdSUGJTbGtMbnF1eXh4UzIvdHA0M3cza2xwNlBYTUlhVGJWbm5COE9UT1l6cjBoQTFlSUlqZzJ5Tk5rQmplSk1ySHc4dUNUemZGU2tNTmY4WHJtTU9XeWVpSFN6T0VGRWxCSlZ4ZG5UVDc2ZzJyMU40VS90cU9LZ3NTUklDSjArSVBLOVJYZ1JxSFkzdnpnUU5DYmtjaUtITzh1UjhVWW1RNmgwVTNsYkMxL1Q2czJ0UlZhc2EveWdyU1lHdGlRNnJQREFFVEdZeEZ3WWtIUFdKZXhUcktVVEY2d0s4ZEtwcTQrQm9MakpnWGFUMDNIMnMvbHJ2TmdGcGc1MzJ1VSswZExyL1VKaWhrZUlYVHcvQjVUdEN0ZnhGZHdYcklTelNsd3dtTS94MnN4b01TS0JCTjFZenhHR1A3b2M0akYwdUpMNVlVWWM5NGJPMDdhK3JLWW0zclpIcGFxd3dqV3F3MTNpekhZbHExa0poS1dhQzRSbVRBM0U2bHAycW80WEUxNlo1aUhaRWFiSWpiL2FhWFdUQXk1TkNRVVdRSS94ejRFSC9WbWttSVg2QlNmbUpEaE1OMDRIYnJRMzhrcFVrMVBncWZTMmpJNUpMczhKb1BzUXlTcGlqdGZ1K3g5S3UyNW5JS2N2ZlN5eENVdklHM3F6WkRKanA0TzBrNXFiM0N6RFVPaGMzcVVpVXhiY3hjU0dvemFyejNVQUJ0b3hRcXZ4OC9IRVQ0cWFERE54UWRuMXdHa0Fnck5INWtaZTlOa1JxbzNRaGVKVFY0N2lPRWQ0TDdLQmN4aldXTDJYT2YwOVBIRGJXdWw4MDdkSlpTOGVUeFIvc3ZSSWZxcG0zOUJ6QVkwNVdja3VuRFJYUUIzaStSVHVnMTVoYXhzalNwOFoxcHRlWkc4VjY5eUtQTnVROFplYXVjRllBL2ZzTUxwZ2ZBNUxWcEV6QnZCbzZRUkJweWdZUFpHWGN5M2NuMGRpVjRXcmlZNGw4UXlSUFR3YlhwMFVKZXpnOGFiRkU2NmtTbXhyK2ZHRDVSQlgwY0dKYXRuN0Q1cGIvVm9PSXJyTjBWRzE2R3lzdHBzSU5pWW0wV1dCY09NMW43aUE2c3NLWkRQcEJHUXNBenZXVEgwYWtsOVpXV28vQUF0L2xHekF2OWpoQlF3T0hYdG5FR3VNbDFKTTJ0UUVkMVpYRHRjVFhSUE9xS244RVVBM0FmbjJXUXNPbHZDcGpaUkkvK3RhaEg3TW9WSHN0REhtU3FoRERoMitFRXNHQm10NmNaWFluMjUyVGxyZXRJL1JuWVlRNURyTFYyQ0FkOHF2STVLcGMxU3Y1cXFEYWFqOU8wWnJvOGtnR3FzZnhqSk5KUDZzRHlPZnZGQ2hCWmZOaW9DTzJWZmxBVTNoZHNyN05ITWJrQ3d1T2JTQTlqUG1GYTFTOWlRaXlKOVNDS3lua2lIVkFGRFlNaW50TjVEKytlaUtEN3lTbU91ZU9iKzZBQUJPdExheDVHSk1BcEkxUFJCTjVFcUN2OUdLUHZscXc0TWoxaEZIWUJZcjdHY1ZVZGhWa0wrUk9XcFpZYlhIdm4vWkhjMUhnRHk2QmxPQU1sSk9xMEl5bmQxY0FNN0g0clg5Rit4Lys3TzVhc2JjUGVSdll0Z200VUxCZGsyMjBVd09vVWYyYmsraVh1WlNxajNMS2tpUDc2SGh5RmhRNFNRTjlmaE9ScGdFUkkrMzVnTHU1eGtLSjFXOG4xb1AyNnZWdExja0VsVzR3ZTFxTFZVTzBCaWUyM0cvWGlyb0d3a2l0RDJ4cEhYUWRtWS9HdzQrZGNpM3JpSzhaR0M0Y2pwQ1JZUVIzZHkvSDcxYjMrU3llUFl6cEUvcDI5aGZKbjcvd3psc2VxMWc0ckZlMGp2REVSRjRsU1lOR29KeDAxbURRRStGc09FS2x2MXlZbTdxdzU1R0NZTUV1STZmZmJCUzNvLzRrN3o3cHlSVjU5M0MrVTAxVzdoa3FVMkJaUXlUM1JuWGM2NXd2d1hMSHBFRTU3VVJMcTByZEE0aFIyUzczVHBNcFpTbE1aTC9CaUYxMFYyMXZDaVd0TmJFOG13Y09KNlZHczdEbnZXK1ZSYnk5bTlXdTJ0QXAxRTVXWi8zOHQzYWpNQzRIVE55RkRGWjd1blVYek9WZEJRblZGUWxldzJhT0hCL2lad2pLdmtmc05iTUFNOHFLd3NwQkM5bUZSNmJFNEVGMzd4RWdYTkNyMnprT2t6WFVxU2x6a1JtV3FKcW5UU0JyQTNMaGhkVkpuWEZhK2RROUVUb0xRNmdZbnM5MzgySUlCaUdDZUl0Um9PL2gveTFZN1QzL1RXck9BbnlSY3ZuT01tOVpqVHI1bkZPYWs4R1BiU1MzanNrMDlualN2SFM4Q2NJNHcxbnRkdmg2cm5ITmZsK3Nka1VNQS9DQUZscmdEWEhZZWtUZGV4RFZkcmgzajN6SGhuWk84R0dSRnd3TFVEWjFrYjZzQWwxWnBvUzN5NGxmbTlLM0VLcE5tRDJBZHhqMHAvUWtwaGozY0RpRXZSRjdHZWs5UXBjbXZ1bDBLS2hoSEZ6YTNyNFQrY0s3M3ZrakVHYkFUMmlJcVRJV09PUGtSNmdMTzJrTWpWTjdOR3hubXo1aXdRNXgrbmxiQnNvSnFlTlU2UFh6NEJjMXY2Z1BrZkNxemNVZ1A0WkNuMDlsL3pLNXNybmh2ZWIrcm05b09najZqUXZncGczUmxXTlk3UEI5NUFIOTRpbHZyZ25FMWpFeXdmUEFCcVMwK2Z6N1JWcUJsYWJRSm1hUy9NWndrd2pJOUxhOWpSWGo1QlNmVXRVWkhzbXp1MVFPbjhBWmlqVGlVQm92TDcvajRNNmNXY0Z2QkNBV001Q2hybEkycmlqV3VOSUdPc1JuTldvZ3NRNEgvcGtwTG9QM0ZHY2UrSFlTV2hvVWRBekJzRUE2MVA4ZUtPSXlqdTdDL1AwM1p1Q2lXdndDSW1xanMwQXRjelJzV1dnalBmbXNWQTNJemdzaUNHeG9naWpoRXgxeTJpcXM2NitCVzczSGJuaVhGK0tyWi81ZVdROWpZb2RMMXZRQ0RVR0NJU09lZDNIQXNBMlNaYU42eTdVN2k5RC9YNllNRWE2UHdENnpjazdVZCt4SXI0REljeDJkQUpnSTU4d3hxQk90Slk4MnVyV0lnTzQ2cWRyZFFmQVBVbVFtdmUwdERIVFhQaEpUMkMxQllyZExlblJFUFllcDRudXBWUXVqNjZxTkRQaSt6cTZxdnNKanFOcThwZlVpMkVCNG40N050SEpsRDR6bVdyMUpSYmUxRkoxZnVlTmV1aTZRSjRrd1ZBd3NBZGw5UmFQek45eWszY2hudWtiT2RUWm05ZXlxQ0JSUWJJM05LeitiemJrRHNvcVFydDhMSHRTSHN2MmVaQVhIUVhMbUdXWU93MWlaN2xxZDk1MnBhTVFVTXc5YWpSNmhYc3VPZ0U5U1F1VW53Wk13blUvWnA0RmFpNVc2YnRzdFN3bU9HRTJtLzFBSjdyZkZjWDdZTk10ZHRNc1RWeGhSQ3BxekVKZ2tkZE1zSytzdElvTjJHTEh5b3RJTnRYWUwydks1YVQxSzQyN0pxNHY2bXVZU1lmenJ5NEtzaUxTOEx3UmpJRDU3LzEzcTZkMEZmSXlZaWdGMkFPbEIwNStkWHZ1MmROQk1ydnNTZG1WbkdOMjZMaGdHcUI4ZDJwb2hVcnQ3eGI1YTlxSDZGZUtydlNYZ1ZtNmlDakRPdDROVXNyQWwxT2JqVGgzNlQ0alIramJOWFVvdEsxd29zb2JyRTlLeXJhVEw0QVFYZDExT3p6c3E3dTh4WTBaem15MnpERWJnNjgvSUgyZm1ObVNPTmpGWTlHVEU4bVRMK3lKRCs5aTJxbnpBU20zeUsrN3FkY1JOd3g4OU9tNmc4UGpDaW9HcStYM1p1ZU9XYkozL0M5WVA1Y1ZJQkZFeUcwQWV1RW5DRFUyQksyTmJhK21XaVFOcWxJQzN3U1l2N3VzOEFMb1p6bDdHUVI3bkxyamlVTmxQcndGTmJLSTgyWFI5R214WjdYQ25VcWhTSzkwb0FVb3RaM3RQcWxOQ1Y3dTA2eFNYdTdBL2F5WmsxbW5nN1JoUTR5dG5BamQrQmx3Vy9nU1ZxVkJJN2plZ2tlaEw2M1h4d2JpdmN6NEFZSmtWVlRNOVFnZkRYZS9hcDFNNm9jZ0VUdjBKd01RenZ4K25Pd3pmVUNINTdxdDBsR1ErdmU0MzBUN0V2S0JKZ0RiditmQ2JRdE9wQjhUMzkxUHl0TEhYbHlWcjZ0b0JGUk5aK25USXltaWxody9mekJ6Qmt5ZFBXaTZmdWVENzV1ZzdDb0ZocWRML1diZmJHTStJQzc3bTZORmNMUnQ0c1VSSUtwTkZpZlJYRmcydjB5dmtTRXU1RG1DVWIzUEsyVWsvZk1FdFdXUllmU2tXaG05SXJNODdmWFZscjF3SjZ1T3VGZ1U5ZnZSekovMDNIZEFJSm9QNTRCZkVoQUg4UXI3anNyOVl2VkVLRE5BbXNYL3grUTZQVHRGS1RNUnFMeXdxY2dIMEkrNHpKalhEZ01HQkxjWG8zeHNOYjgxRGIvcmNvRjN3OGR3UmlqbGF3ZVovVDBKMGRUQ3NZUXZqM2p3OS9mRkJURmxha0RUbWwvNzlPSW5lTURUSitWWFpRUThDczU5R2hNR25uVnRIMjZqYU0rQlF5M0NHVGFQcnhDTG1IZHpxNkhkblEwQkRpcmdPazlHaDByclg3aHJ2NkxtcGFNTUpjb0xYR1JHQk1WT3FjajhocjlZekw4bnVmVDAwamNuT0w1RGwrWTNueXI1UEszYTJkaS80RUN0bjRYbFJFTDBiQjlIK0RuL3VCM25zT204YmorUmc0b0preEtRWHpEWDlEWWxaSzRpOTBlNGwyT28vZGhrclp0NStyRlFheTRVZzU5NmZaREZ2UnRHZkV3Sm5VYlNrTll2bDd0RzM0cUt3d3FicEZSdmdkZEhZN0JwN0xxOWR3SXVjczEyZDBjUCtWNE0yQW1ONVJ5VXcrVDcxODhwNHE0QUlTZHVWa3Z6REI5dUVNTEJlTGJHbGFHQ3d3NEQwMjYxcm9hL2t6d0laTEpUM1pJYzRHNEErUVVmMmw0cVRXY1I2NlBQbEM0MFhwS0tHZllpMHl4Y2lUaEFKbHJZbmM5b1picFEvNXhUb3hmOTJwK0xaU2hKQng0ZE9pMnQ1ZnNxQ1lPQnQzTVd0RmhLcG9sL2tUR2hZR0VHY0Q3R2wwRTl4WUdGTWt4RWF4d0VpbVFrOVZYcjVnT2tGMk9adWgwTW4yVHU4NTZvL1dYeUNjVUlZWEliOHVHY2N0Tkl0ZWVvSFczRGd6MG5xbUNCbEIwUC9VSWYzUlRxbTNHTlFoVFRZekV5NXVWQVlyTmJYTHoxNVUrUGZ0cTJYb3RaOHR3dUxpUVQ1aUE0UEhYeTZBQnY2R2VhMlRKM2pVSTd5Nmk5VWhobUNocWhieVdla0RldVB3OXcxRDhxaGJNZVRCRDM4QTBSaWxoelVlcXI5QkRZTytvU3VkeUFxTUhEUWg3UmdoQ1Azd2N5SFpVWXY2V092MS81Y0h5WC9YY2RIWlpLQkxrUHBBODYyWDJ0aGJ5c0NlWWhhZlc1VEZoSUIwRXc0MTlnUXpzVHk2VGdlVSt5cHg1ek9iNlNzK0xRUlNwNWEvMXpTQkhvSHpuWWlZbVJhcVljamtCWU90ejdwQ0xNUzBJSEUvdDJGVEtyVm5mU3JPRmtBM2IxeEYveW5sZDZPUldxUUlWK2Uxam9OQWpDVDA5RHlMSzJTaDBlb2ZhTzhiQ3ZjcDZIUGhqRVV6KzBIS1AzS3BsT0FQcS9RdDFNNlZ0TVpzNWFrWkFxMFZiWEdsaFp2dVR2VzFaM1NGWlp0MWtPMnpaNnhHeUxZblNMMUpPdE1KR05tYlczZDRwWUxCZlFjcXQ3R25aUmNSU0F0aTc3aDVQRGs4ejlzV0JEVWFISUdCZmJQR3VndHZtZFF2dVRHZGx0OVdIVkZOVFgrdU1PRks2VGlhNTl4TDRWYUFueHdKdXNJcG9ybGd1WWRMelBRZjY1WUoyOUdEaDkwSHZyb3hRaXpSSjMyallqZUkvdStLaWNxaHZKcUdyQkN2YXlFZzBkWTl3WTh4RzlqT3dOSk5TYm9aeXBDcEpWVUEyYjRKc2tTRVg1dEJlRTFta3dmaUg4dzBEZGU5OEFUQUtPRk9qWWhEUnVzSWtFR1BrNFBYNnFONmpvZy9jWEI2NnBGbDdsd0pCZ0FIcU95SDdPb0tvbGJFYVJmNE5qblRKZ21ZTDhZTmczRXZjMTdiTWpGUnV1aTgzSjJkK2F1QVRqZGo5OGFNeFFyYmgrWS92dno3NkVwdURRWmw1K2NvN1NKY21BeUFJSTBQeG85R2pEWjdDN0lpbVZWL2kwVkVnSVVwMjhuUlBEM1BmZisyYit0VmU1akRYU3dXQ2FMS0NXV3JFTGUzQUhROHQ5dklqZEpqMTU4LzE4b0tvZkZObFMyWFZ5Qm1aN3RtcXZSemVSM25xSTFtUkZrS0ZLSXdvelIrSmpwWWpKVnM0Q29Oa045Tmk5ckF2UjRUcjNaVFk3aVIrNVMrQ3g3NFNhWEI2RElmdkV6akJLamYwOW1jOE9qbmU0ZWtzaUVodTVmZmNNWjZDdjQyUDZ6eTBZM0lTQ0xicWNzRW1WZmtUMUxMMnhmTjFUV0tER21SMEJ5UUpNdkVNVXpmK0EzbXNtdjNSalBXR21Xbm9raytLalNQenN3Z1pUK3BmYy96eGJnSko3dFJ1WjBRelp6WmtMRWhyaEEwZXErd1gzVHY3VmJXWXUrcWNRbnd3d1BhRGV0TnQxTFZLeE42L1B6VU94dVlpYzFkSHNaU1p5N3IzOG1pWWVIV1lpUDlnU1ZTTkp4MXVYcUkybnBqMFAxQWdFZkJiUWcvbTJvdFdQV2lnU0I2WlFrSVdPaFVnNGZoQk55dVd2NU0yOHAreHp6VGViemw4a0U4QXhCRHpLeXYwaldHSStiWExQclVvSVc0VUNRWkQ5N3hwaHdUdktpMHo2bEp2amRTemxOd3NjZVJlbzdFSWJGcTBxNTljTWlxWE9pcXNWQml4QnNVdWU5ZmFpZE1oRENvdGdQcG9xYU4rTnZicXY4UkhKREpmcFErS2w1SWpZcDJuSDZyUHhMY2l1VWx1bEtxWjBZaExyTEVoMHJETWNnNnkwQVp6TXRQbFZjOVFZcE1keVhlOHRtcnFJRThpT2ZjV2Z1UzQ2ZWVwbXFjVGNySG02b3RsMktaZVc4ak80czRTZjM3LzJ4d0pITGo1eWFnSjREUGJNQVNacmFWMzk0aFIwVTJPY2grVGN6QlEwa1dqU3h3UXQxSmY1andiL3JkRDVqWUwycE8wR0JOV0RYbnV0TjdhcnQ5TGtxU3FtRFA0Nm9weHJISzZha081YVQyVUlmeXkxWjgxZE95K1J0c0RCTFdXejd5eFJheWZxcnd0c01PVk1hQmduWjgrVjVGYzROQVZVYUcxYXVzRngrZDIrNFBvN1hLR3V5QVlUWHpIVXVxODB1T1JKTGpSZkdzUWJWeXVXdlpFZUVuT1Mya0VnbTZ3NXIwOUViYmI2djRGUFJxK3RWWTJkN0t6ejFoa0ZIbW1heGNNMXRteXVNaEZBSm43VnYxVEJGMlRHVmh5dkI2elozKzdIT3N5V1lwZUM4WllTT1pGRC9EWFZIOTJaVWEyR015WHpHUU5NNnZkdlBLN1dNSTBWMlJiaTVPUDZCcWx4SldsejZ4K3dza1JDTVFSUzJrb3RjWWZqRnZOQXp3ODFuL0FaQW9FK3Z1ZVpqd2JiZk13R1RiL3dkbFNPOEZEQVRObXFkdlNLUWtjVVZiakhuQW1IVFBmOS9UazZRbWluOGY4QkEvMlpRWXdNVEJuQTZtOG9FclNDMERRYzJPMmtuODV1T0ovTkNXWXppcVVFNE9PNWtURkNTenVsNGlaSXZnYU5IeW4rbmg2MWNNbCtIT2lMQUp5VWozVDh1em9RWUNzUTA5YWJoeFREZkxqRGFCQlNCMkNVNnljM0FUY2dONWEyRmpBRWdtUEppRmVCRlhwTmxTYkczSHVoQktVOEx4VDBBUFBlOWN4VFUwMEhDNmpPcm8vVGg1S3l0SUFpTVF5dWFFa1prOTRWeTcwWjMzK21oYzVGVzRvTjhSOENJQm9ZYnI5RlZuS1pldlVvaVAzRmYrSlV2V2VRMXA5ZFBRYXNjTkI5Q1lrcXhKdlFpb0xXZDkzUW1hR2cvRCtyYmxaanZUdHlPOW5wYkZQOWVpTEFybFgzSUZJOVB0aHp3bklZc0E2aHVjT3oyOG4vTmJ5Q0RKdjFwRks2eHQ5eFpaUDZKZ0tQL0Y4NUJSZlFyY2xpY3hUVmRMSE9hb2xJY1VBT2NRSjB2WHA5YWlOUEc2RmJ2a2tLakdHMUQ4SlE5ZmZoQnRDRzZEVlRReUR2dExVVWhpSFdIandMNDVOak5tTkVxTlFLM0RyV0FZb3RvNUdTMEtCalN4a3JCQXdpd2RYUDExZGU2WU9EWVZWWllQc3ExV0VlSVBHWlJpbFo0OHlHUkZQRkNBN1I1ekZUcjU3TlZZWGVMK21NWFBFb2dVakl0ZlNNTUxlNjczblpBWk91WTl4ak1ZeFhpZXY4di9uQ3NGVjVraC91dkhIR1FmRjEyL2hheXgvcmdNL0pTTHZmVS9FVENvUjZzb29OYjFOanFCZFd6eXpPWTFyQzZGaHh4bENWR2diaU9WK2J3Myt1MExEdkEyNzMzc3lDb21PcFVUZ3JNMjBYVFNJNWhHWDlHdUpER2thdnpqNkd3UVVzQXlJY0tRTHJ1WHRYSzR4VW5BSEQvTHU0RDl1N21CV2NBNjV0UmhXeGE1M1lKZ2ZxbklCalFWWjRqVkgvWDRNYXp3bmQzQWJXRnVQa1B3dW1nbFVaK2dMNFEyR1pHOGNmVEtBZFF6V0pIMkM3SGNXOHErUWFHSzIzeVA3QnRTQVkrWWwxd3lYYmVRYW1IR3dKK1k2Tll4SDVVc1ZnMW9NSXppK0RVcFpHNU5LK1pPZ296RGFJU0NaVHg5SWFlTjdoTERqT0ozUGFhb0dhQnlIcGhQc0R0QjBGR05TQTZOc2p3THBoemhGOXU3eW01d0UzOEwzYS9ZcXE4NHNyZkFuYUx0MGFEeWIyQ3l4aHZab0pXMmpUbVp4ZVJsam9jMExQdWdJNjBlKy9EcHBSK1Nvc1pVMXUvalpmVGpzRHM2NXprQ0F1K1NuL0VSa3ZTYjFvbXYxRnA4RTBsUEkrWG5KL2htTytCU0ZMaHJQUjh2UDBDb3AwRGJhU3JCKyt1ekJOSjE2VmdVRnRkZXZKNmoxTlA1Y0o1a2hJdE5RR3E1SldHemtDUENwSjd1b25VcmdXenVKQjBzS3F2S3hQSmM2VFg4RFpDU2l0M0pwblptOUZmZFYwRUFOaVc2QUJKOTM2MkU1ZGRKZjN5K0UzaTJTZFIzQWliWnJreDJrVW9ZU21pcXdWTERaS2ZvdTJaaktuNE91K3pqaUY4Z0R1Wk55L2NwQUhIRGpoL1UzUGk4TmlWUm95cDY0UXFZOXh4RmNOMEN0NS9Sb0NpMXBrR2JlZVZrSnVsdm9ObUxXT0thbENzRktEUGJrMkRYKzFIODFFZ0JLVk1UQ2pzRHBHRmpiRXREWng1eE9QVEhJaGFHazY4aXFKZlV3Y3BMbXhuVzhrTGUzdjhEL0Y5dm1aNkQyTmdSSkwrMjZUSEdTNndCbTkrdmVwdHdlOEFhYkN3dUUraHFYSXJKNVRrTXU2MHVrb1FWNXZmSDQzaHZnS0RIQmljY2ZkVm1rYzhpa3hFajErTkxLZXVWME1uUUpQdGd5QmFUem1YQUNFc2ZoSTJEUnp4ZFJJWE5SQnNTYzA2OTZ1V1p4c1I5VU5Wb1daV3BBSFhLZmtXRnNPNXlubnlNbUNRWENHL3ROUXJhUXQ4Tk9VU29RYktwZ3paR0c0cktnQ0xCbzhXMXBkSnBIeWphclZmWDU4eVY3S1orVmxLZUloYXJLdit5YkJYZ0FHNHJ3eGxuYkQ1aVdadkg2QWFTa3dhakZsU2NhMmdiSnFSaExnV2RzNU1ySEF2eFhjM3ZyeWovaEhOVEVjUmIzWDdEMWc3bXVqb2R2UXFFTThrQisvNk95ZXU4MmFFWlU2UVF4MFNNcDZMTDlDU0NTdCtGRXhvT1ptTHgvYlh6WjZ1YWpPU1VjMGFVV1pSd2tlTzZmVTU0Q0FLRTdTQXhYaXJzUHd4cTAzeDdjckRyd0M4R0tBaXJOaGZ5dkkxTHBHRWthakRCOE1QL3BxdWoxQThFT1hoc0NjK3BiTDFzamNHUGxtcUdTaFlNZ1pma1FZTmJmTWVDOEJRbTRrUE41VVpJQ1UxN2xJamhvQ0VxNnNSQnV4OTBQNFZDeTZ2V0lqVjBjR0tLZ2lOMVEyeTVhSlZtTWRuR3NQek5rVXQ5VFB1ZDlDc3hiN0UrcmpMVjNFY1NOeDI1RWRIU3U4M0t3cEU5cC8yM3lCQkFSUlNtckxSUUNGdSs2Y0tOdWNQZUpySVV3TU02V0p3eWpTSWxpaU5RTFRLMmxqOE8xRzlrZUJ0TTdtdjZ5NEVyeDk2NUpRQzZFVmdrUnFjWThYNm9CTHNQQmdIZnBUaG5nTUY2SzFIdDRiMVRXNnJEUnhDem9PQjNlY0R3MTBpSTlmMmR4Q2o4cm1uWEhmVzVvVE00U2FNNWt6c1FXbFhzaTlEWXZGaDRrYkhUR1ozdkNiRjVGVTdOT3dVUitaWjlZWWxtdmtsTzdYV21iWUdoSXF0MVlUSGdEa0J0dExxZDE2QTRpQVI1Z3ZWN29ZRmVGY1dUSU55ajU2cFdJbGFSbVNIdmdhQUZ1ZnVyekhmcDkzV2VoMm1meEtGTWgrRExkRUdwUGVGMlhZSVVvUjBWVlgwQWF5Rm9TaCs1b2lQQ29NZFh5cjNaWStDSTNqeGhTMmNWaU5GdUV1ZE9MY2RSMWtaMGZsUDFzZXp4ZmJoMmFkbWpBMDVlNm92ZndobmZIOXEzRWZESThMdjFGbE9BeitZZFZwUGFlNVdZUUZUL2YwYlMzR0N1WkdBZ1ByaXcyK3hwYlNVTjRSRVdBUmtpZ1YrRmZSQkovZWlLVEVTdm41d2RNRUt6cWdlR1paUzl4OVM3OW9YUkhBblRLQUpYN1VXZ0tteUdhS1ZpTTZKRFFISVl1RGMrUk5rZjh5c3pNdXJnN1VPSlNSSlZFYTJ6cTh2SHdrb0tIcWhLSGZCUU45SFNWbFBmRDlha1RQa0RLNlRyK0wxQkJBS1E4akRTNC9waXZBVCs5WFpCd1lSa2RLTEFzcTRwaDRKY0tkZis4aHZ0RERRWGt6MmlFRHhZTWR1V3JiK0Q2OUJCMEJoYng4MW5iR29IajBVQnpQSVRQRVJpR0VQU296eXJKS0xweTk0VS8xR3dXWjBzVVVxWjRYV3I2cG5WUFhVNXRYRWpFQVRNTk9PUmtCOEJrMzJUSGFtUlNoUWxrOGNPQTltTkNrOFhzVzdPcWo3V3hQYXdSTDhNVnk4WkVWU2FuMGRPL05IeGZ6WjNxM21HK1JiN2cvekUxRVpTSFpBRjlvQTN3MmtGbnpXQ1BXVGY4N2RGN29mZVA4MnozUUQyQjdSbjZRcmo4a3FTcTJVK1BYWFpHbWdscitjSjBsY3psM0t2QWcrYThETVNDMkhSRzg2eGpqYTRyOTUva29zZzZLMXNMREZUMW5MTUhhMDhlUW9rd0kxdFVTYkUvV3hBaUhZV2Z4YUFsT2JZUGZaMys2a2hCNndRcVZkQmQzeTZZcDF3aWYxdUZYK3o0dStSdW5wWDl4eWdudGZnYkgwOVgrR0xVR0E4aTlXaDFwVVpsUHJENGhKMnRKMmVnMTZ6bkdJaXhXTklMY0kya0ZpRFhxQm94NWY2eklXdUl5MnVrNFF5MGhWZDNEZWk5UzB3UE13dGRqNDJzNUwvM1EvdlJBK2tTUHBkaFloWlc2MWF3akZiVEZWMXdoNm5aRFoyQ1F1bmNSdlQ1VTNZQlBZOW04MlFtNVVSenVSVDE1UGN2RGd1TjI4OUxHT3BySFArRDF5dkh1NldTYXpkdVhiVnRTTC90dEROU0lzdHQyMVdMbHkwaWZtS2E1RDc3R0h6SzR1TnduTkRLd1A4M2plbVN1Q2xETGZwdjkyREhWd1dTb1pOTjJnMWNSWVBSeXhIRWg0dzlnVzh2T3RVME5EdmlSUVBNMkZZSzVUYTJ2VjczYXA5SkRCcjhTZXNuVlFrL3lUeDRGK3RNV3g1dFI3Ty83dzBST0FvVllvYWlpTk9oaWx0QkhWRk96a3FmcjlkQVNiSGNqQ0prVGIrNDZ0ZjU1SkYyMVFIbDdwNW4zNktMdVVyUkplcE5mUXYxaFZ2SWdVQ1R0Y25BdW5nZUNiRktzVXJKeUdyWVZYZWFNSERZT2ZzS21hWSt4a3dNZnJsbzJCYldJbGd6dm9PaWpKS3Nac29oVWVXTFFoeWJiSXRtT3FSek1ITzdGNWJRVjRycnBqbzUwN0JqMWJ2UHA4VHVSL0xIL3hGWnZqNkoyb0taMVZuc2g2WE4wVmVLbnc4eThlWnZRZUVJQXF1Nm5WRjA5MFJkdVF0WitzVlExNDlwRXZkMlBuNDJWR3dNcmhocEovaEtjUGpueDZWQTFxcU9HcjRiNTR0RUhFZnFpcHNqc3IxRU5DanUzc1NNUWNwQ21neE5yWWpXczZDVEF6cHpxMUdwRjB0Z3BneG05QytoMVZlVVV3QnZjQUZnbzJsa1hmc3Z5MzhjQklkcEtnRHkvQzA2QkhIQnpIbkpuQnhocWkzTEdoMm1XYnBpN0x2QXJVcHJ4cmpKUXhhZWtSRHBZcEE1TWxqWDhETVlVTHpxV0xCak00elBNUzFkVXhJajdwK0cxQ3ppTXhlcXl4bmtTZHNZaEZrV1JLTnV4OEdTWGMrY1Z3aVo4aGV2Yk1lM3pFSG1ETFdndTRxajNRbFI3VnN0OENoNlYxZzBqeXcwR3BDRWpOcHpNWFRjaXRlN0RmeFg5VXM0ZVpGT3BJTGdBeEQ5NVdXMm00dVAwZm1rS3Q5WVpJa2o1M0ozQkNiL1lXR0plaTdXZHl1em1sbWVHTnE3Ukl5RDBrSjk2TklCMGhRQW9uUkN4ejk4UjFTZEFHVHFUUDZVSjJKSyt6R3B6NTlja3U3UU9hbEdlV0pIUE5HbUg4Sjd1Ti9vTThwNFM3YUJVK2d5REd3VWdHSUxlYUpOVERiN1REN0JyMk95UjA3cFBhd0ZuUnhUSjZjWmRMOHA5Vk5zUkw2V0MrOURNL0RuWEFtc3ArZTF4TVIzM29reGJSN1o3em9TQk0vMld2S3NjblJBVTlLVjczVjNjL3lMTVcxejFkY0VhejYwRXdmU1YwU1dMTWdHM084a0FSOFMvOElzSWc2eEFCM050dStvaWI1Z3k5SHdETlZnODJrYkdueXIwbWw5THo3SCt5TDZucjEzSEdOQko0TGVyeHh0K0taVnVTdUlyblZuRitaMjFKNldPdnJydFZVR2FsclJ5aVRoWW1aYWZjaUpQRlNjams0c3BDc0NiOGhwLzY4N3ZWOS9xUkZ3ZDNoYzhXQVdrSHgrajg4dHl3dVUxajQ0ZmtPOVo5dUI5UDg0dG1HU0lMTnNReUpLZlNqbTJueU5LRmo4NjQwaGF5MDlzRXpYNm4zUFVKT1FXSnFPVWxYWVpYbzlDSFNLcWIzL3FpVjF3anQrZlFhMjRtVnZzdWtDZXh3TnVCdlZzcDFoa0tjajBSL3liUGdIeGo1RHdOaXYxVm5sWkVaZ0JWbzRYVERyWXdJYzFnaGRFRzBsekxWMllFUnZiK1hNVENWRHNYazd4QXBPYitRcE50M2k4dEdXVUxhVVk2Y0JvaGRpSG9KSm5TTTQ0Ti9OeS95dzdaTldZQUpNNWNtQXRJenpOSWxMY0lyQ1BnNU91ZGdlUXhoR2k0NFlNOTN2QUNuOWJDY3h0OTMzZ0t1bHdGQnRER3hmcFFTS3E2SldSeUNpUkduWkRubmhIVmhjUXo0L1krbEd5ZEtYb3N6QzcvZDlFSkxxUnNLU1djbVNJa1pMOU9nelhOZ0wwRTJXaXBRc2VKMDFwK0tEWWtlOExudTIzSXozNi9RcjVaM2tJYW41Qm5yWGppM0hXTjVKK3dzYkl4V3M5bmxXamNqaEpHcFhGcnZnMnB5Q2hwNStPb2E5UllrdTBwMG9ucHhRQVpScmw0QlpoYmRRYU5EekZHeXQyTks5d3p3UStGeGhOQ01NazI5R3hHVnlhaldubjB1OVJqQzJBZzhpcFdjMExyajFSaDI0OGFSWVJFbHJRR2dROW9LQ2xqZWowK29Zb0ZrVHBKWTNYemZQOUk1bTVSalNyZ1ZDb1lIcDBZTWdoT2lLQ2xKNGdwanNIYS92VFBYNmNGaXFpOGt1RFNydGZjenNlVXloSE9OR3lXSCt5ZHZ1WDMrMjJhanJYelJITEFZOVBMZlFyblN1VXhCa3UydVlCNm5vV3VjWDVJbFBTcURuc0M5NmlaQm9Gb0w0YlRram5rbTNlSld1NEY0MjgweE9HVExPNWRUeXl3dmJmWDk1eTJhc3FjU0R3UklVbEV0TnFiN0Jqd2RzNUdvWHBEZ2kxV2JIYjk3RjhFY3JzNXhGUWtPTjZSNkUwOFB4SVZYRkI1ay9JeVk1WmQ4TG1BYWVwWGltMytNbExYMDNlQXlsbUNOS0dQaGgwSlJSVUpBSUk5dnR2ay9uY013b0d0a1VCRGRYQWpPdEo5Y2Zuc2hHenVHTnBzQ2d5aU1YcGc3LzBkT1JhaEZWZzFnVml5aTRkMTc1K3grY0xxVG0wZFhxRlN2bVhWNjh4a2xEUWZlNDlVbHZWbGs0RnAxN3ZZNVBMYjdTQ1lzcnZuMnF0VXJxVWYxU3BCYmpVa0FNeElOeTFNTTJyejNFeGFFTGY5TnVXQXFhcXVVV1BEYjl3d2I0dTMzc21rN3U4dFNnQnhPUGN3RDRHRGF1TS9CZSs3RytNUkRoZy9WM0ZkZ2t1dlNwY0NMcE9jd1pjS3FtNHBiZ1RVazdBSUVaY2RVR2VLaXpQNG9UbVpQRjlyM2RhMWNiOXI3S0VldE1oY0ZBZ3diN2NVZFhNbjMvbXZOUkJZOVh0VlUxY1g1YmF3dGFjcGJ6VWlEVTRZSWtBQi9WMkdwSlpYU2RyRU5xOTNjdjVxS25udDhLZ2tJMDFNcXNuTG9DbTlOblROb280cEhJUDFXb29BVGp0RWJva1dhUHMwa014K0JWZmF6WnJuais3ZjZ2WG5xTmlXUHJyWHVxNjRjSGZjQzMwTzQ3aUhyUVNPMFJDTzdXZlZIbUpNRmpnNHBoK2V0UXQ5Qk12UUd5c0NUcWdTckQvcUdnUERCNldSa1B4VzV4ZUl4eWNWK000SkVxQ2xKK3NmSHZIbWIvbXlETVc3SkZMR1MyQTFtQmZ5VENtWERqZmZGS3ppS1p6dlF5eWxMMzdtNTQ0L0Z4eE9UdDlja0cwUVNRSEljQWtQeDFaTDBkYU9lVzRrUUdjR1FDaVVpMzNENzNtbWhUTEdTcU1vOXYwMHFuWlZNLzY2ZmwxUkZncGp0aHpaRW1mRmpXaDJONGoxWk5JandGWGRjRTJDN1VyelBpM2gxODRUTjV2TFFmZExEZEJxZjJBTjZwK1Z1ZG1CSUpONFZMU3hldFgxdnoySnJjS01weGVJTVh6SXplUkRDZng5ei9pbEtsM0l1Zk8rZ21hN1BFTHpmektZSWxET3ErUStpWUhKN2VJNSsxQzFFdSs2Wlh4bjhUWktuOENnWS9MZU9rOVB3eTR1N1RNZFh3VDJyVDVDOGxUMHNoSytxTm1MTXBvbEFPd0FrSVZBYysweHJUZHQvZUFZSTR2UzNNMXNId1N5L2xSQXpqQ1NoNVBBQzlQejM5QkVlS3RweitZNzBUcEJjVnJMWTdmQmkyclpmRmNMUm1tVHpzZWdBVTJWR3dpZ0YrQ1lUNThjaUhPaC9nV1QrTjUrNXhyemxDU2dhYkxDVWVoTENJZi9HQ0lzM2ErMDlOeWo2MzVDQ0M4NzdPTWpKNlhUM0NNdTZQaHk3SjRZeHh4WkFHTlltemFNN09UdDQ1UUJvYXVMb2J6aTQwckJMRjZRbEVSTXVkaHZ3OUgwM3NSMjBTaVRLczlvMXpyKytpZnA5eVBjeUFRLzU0R3JQRkg2SitZcVFLVHBYZTJGT3grSVRBRzJYeURNNUJ2S0hqSm1zWlV3T2o3U3c4bHRYSCtxN2VvWlhoZDNVT043UXlEZVhveUdHWlRMbTJzR2tQeEFyV00vTXl6dHpQZE44SEN6WW1JR1ZZTGZZWE1MU2hJMFh2cTF6bnNkUkIyMWVvNkVtU1lMY1VTNGFDanhkRDRtNDM2b201dWpiam5USXhDV2ZEYllyVWc3M3lsK0ZKdGxhcm9hSlBObFZiMEtYUVlLdW9CZkZEMDNmTmNlL3JHSUo3ZVZLTVFtYUJLK0FVTzdmWitRVzlNWnIyWW9jTVNneGIxT3htNi9Bay9teVFWNWtQQ29CbG03YXRiekFMZktINjZEZUxuakZyeHZCOEpoMExCY2F5WDEvMGc5bVNVaGI2RGpzVXBWMkFPMStWelNBVFNNVmQvOHg0RUtkcE5TV0FkM2cydm96cmJyUUJmQWxValY3WVIwK0wyWnNtQ0FYamY5UjJEMytTdkxmOU15QkdqdkFVNFR0Z1plTDd0UVpldVJOQ1diL3pEdjBzQ0d4SDRjZVVUL04vTzQ2cHM2OGxUVW56QzMzbmwzRHNmYmlPVW5PL3lmV3N3TFVLSVBFc1BKR3BjRndTem8vMkowd3NTcHlqS1psZ0ZOeVQyUE5oZU8wRWZqamVaOHE2Y2o2OFM2UURRU1NNbmpBZEZiMHdWeE9KTHJFUjlrSUpNUjloSW8yOUVnSkxSVXIvNTJjVzlwWmxIVzZ0ZHVwUnB2NHZKbUFISzRDNUlrUUh2aG4zcjVsY3V1UUREUWtHMEFkRml0Sys5Vkt3Qy9FSTRNbCtSbitmc2YrMXhWK0ZKNlBoVmgxNndpRXFOc04vT3Q1MGFlTU9BZmt1L3liYnlIZW4yLzJ6YUlCYmRFeXd5TEhlSVZnUzFWbW05aUhmVklRVDVFdnhocWI2MFRRNitLWVM4UWR6S215WEtDNHBGSlZrNWFkNmpnS05XazRtbGdCbVNJcDlOV294S04za1VXdEtUVGE3S3MxT3pNUnliMmFCT1IwN3JFSm9nRmhzazFwTzRNQVJKQmlDWUI0VWZFWlRXaHFhZVFGcEYxdXg5K1NLWktwcUxhY0VwSEEyU2VpVS9OT1ppNEhiVzRkYUJyc3dGOG1iRnBLaTF4b1ljVVpxVXJSVU4xMy9tcnNaZTZzQ0I2MHFDVWtCVTN0WVlUa0xKaVBHMVpoa2oyQ2RPK3MrMGpTTHRURVVRR3NyZUhvVDJRbG9yVkx6YmFQUlhYM0RiNG5TUENwQnM3cklId2JQOWpTZ3g2bW9uR3R4NmMyYTRSL3hCMVlycnpNdktialVOSlpBdTlVb2gyazRLTWxUcitDQ1pxdElMbUFWUXRUekZQYnN0RlZHdkNDZlJEYmNYRDlYVi9XWC9WRXowMkdqY2Z1NUpJc24vNHRnR0xObTdwSnhxeUptZ1BuUUhJRkl2R3JZMHBVc21ScjdSUkRvRllSZkxVR2xvY2JUdU14Q2pFWTFtM2hEZXI0R05uakNoV3dIQ0thaEo4a2tibjZ2SDVJUWxucmZQaEdWL0g2Q1pvMHBaMXowU0VqcTdFaFJuMjR5dDYxM0U2QzVTdm9qWkxPUi9TeWpYS1Nha0xCUWEyMmUzMzhuOE5Ea1pkdGJIZmZRMHd5V3RlTUs4dnNENjNNMTRJTW8xYXdGZWlteElMNWVUL0ZNVjBpNmdlVmtidXY3R24xSGd1eENESk5YZGpGeStmVnY3NVBPVWlGWWZsME85amdiT1ZCb3ZSejZGU2hBT21qcG5FTXRXSWhiNEEwYlhVa3ZFY1lUY1NOTmJGOUdCUUliTzhtdjhjZmVSL1Fpa0ZtRHZEaGYzVkJZU1FPQ1ppTDdXYkJzS1VIZjFLUWFzYTRMdjlNNHdCVjJ3RnJOdVR2dDNaK0lRRXhGaDlhYWpVaElDNGhNMzhRN2liZTRTcFhBbUUyOXVFTGRvbkZqczc4V01wZy82bTdpZkhVUGJzODlkMkxoK2hJdkpvdkRBd0k5bDhlNlNZbVUzMkZNUjYvakdQMU5xVDBOckdyNk9aTldlT0ZjWWJvdWw2WGE4SytLbmtBbUl4bTlaemtYTVNORHE2TFZLcXBiUmxzcThiWXRLbjc3SDRqZ09EQk5PTUJDWG1ickh2dVY2aUhValVkSlhVZE5Qck51RFdCcUYrNXczRGpocElIRHQrMk1sNVIxREVnRHlka2xIWG5nL2JxT1JXSHpqYmtmS3kvVXFNRWh6ODBHTFg1OVRDQWZJMXhpTi9Tb2txdUQydGNZR3A3aFRPbThaeVpkK2lHU2pIQ0UzNk0zbWhPM3d5OXY4UkVFL3JybVUwRm9iaFlZMXRTM2lsT0xDcFZVTi9MQUQ3d3FLYTB6blVFejFKMnlSTmFGQjdRMmI4dkM4aEhIS3p1MnJxNE5VcVMxV1kvRTZiUllBcWx6VlFqcUlZdGUrd0Q5azhkb2tFcWtERnRoWmEzZnJ3Z1dHZTR4ZGJSVHYxYzIwU1dZV3FVNFIzU1FLRVpsQ3dOcVpvVGZKVDhuQVVQbE9uYURqRnlOdGpiclR1QTFsQ1dCelBFSDhMNURKYmJnYlVYektXTGV5VmtmQThaWVQyVFpTL1Rwa1YwSGdDMkl5MjRTMXZIVzZTNktaV0x5VTk1UkQ4R1gwQllRMkRPaGxDbURoSFRnanl4NmVOdTg2eGVkRnhYVG5LQlpvcGRUUkJ6YWZLdkRIeE43aEdyWVBsMGVyZjh0MFVwUzZpWW9SZmNDaEdJbHI3djFLd0p4QjJIMHBBc2NxTXVGWmNYRE54Rkg2Y0l0TXJDTjZCcVgwMklMeXczOS9jbGRLR083WGhXOWNlZWFVbTE1VEtZbUEzakxwbGF3Rmt0WlB3ejFCaWRNU0d4OUl1VnRNaXdvbXg5ZE04a0VnMmN2bU01QzZYdFZJRnNMNmdDMlJhblBENUlqRldxYUVDWXJlbm1yaFp3dTZxb0pxNkpkZDdYdW42R3JuR2k4U0czNHV1dHlMV0lseERaODNCblV6RXpTbzFkZUhXVTBVUUhUWDQyL2VJakNDSmNuNWZLNzZtaUJyVHkrR1BxWHRwTWwrcXpKM3M2OWUvVVhZT2hSSVZqRlJLNVdqVXd4KzN1V2lrWGVrWmQzU203MUJSQ2tWL0FNZ0VodFQwaWg1dHB3dFVSU3FmMkhiNlNsckhsVUZ2WjRsays5RmcwMUFDWnZ5Y2paNXVySk5GWmUwOUtXejJ5Ym11bm5pRi9QOTBjTnM5Z1U1WmN2NXlVYVIvMVZQd1F1Q3ZhVHhlTFVXKzBxRUlNd1dDNGlPR0w2MWJUT0FQNzREbUEwcVJ1TlRVTEJRaXNkOEFOaGRoOXN5VFpUa2ZCWnJKakRaRmQ5bGF1ZnpkbTdMTmdscDViZGxLRU1GSnBEQkMzazhUZzNkTUNvT3BMdzFHcDA2YjgzSVNJQ1M5ZUN6eE1SZU43WXYzYVR0REZUSWJXSWlXMjBqNmJ5VnlkNEtSdE5rVXQwb2Y1VllueTYyTjlUd0RsOEJkWmwvcGpUVytRVGhYdGdVTnlKZ2hXdno5a3NNOFUxWFlyNWliOEJleVpVTEZTMVBJTnlIMnd2OVk4Ry9CdmIvYk1PYWtCSE0rVnE1aWFMeTNiZW16cEg3Z3lLdFUvbXJ1MldydE5waXpjdll0ZHNtaHpoZDV5QXFGbVhveGxQQnQyaXM4U1dtR1R0NUh3by9XVEJJUEdJR21ySjB3L3M4Q1pRbGxFRFVRV0k5WFMzUE5vbENlMVoyNEp1RUdZYktDQVA2TjBSQkx5TTl2OEhSSXh0SGhVNzd0cjJRWkxjT2Z5amptRkxVZk9Xelk1eWpxSGtRZzBucHQwUm9MSzhrRlgxRXRzQ3JKUUdnbmdmRnV4YWRDeU9jblk3UHkvekk1dmxjYndTR01yYU5vQ1ZXTmE5K1NhUjZtV0RNeUE5UC9mbVp0bGRUTEZ1MlJTVzllY1FLL29PeHRQa2RPSmh0RW5xaGdlTk9jZFhQQ3E5OG91dm9FNDRCdTdDTjR6b3BYR2lpaGpuK0U4OUhNNGJMcDA2SjYwZlpxVnFlNVIyZWVpbWF1UGNXVVA2ajlhbHN5UWw1MTdDK0MzcjNycWhsR2plQkxiVkw4aEhSZThjUUpKUHJJVmE2YTRQODA4TkJTY2xJWGlpeVBGaFFXc3JNRmRLVXE4YUJYSnJRMUNYenBIODN0dm9IRnBvMUcxKzNOT2UySGtpK1N4c3djTEJUVHIwMmwxUGJNRERoOUlraXhrM05tWUZBQ1RUQnl0SFI2Y2tQTU0xQVltTERxZEtEK2E2THd5aHBGSy9QTENHK3VXNkRXWmg1c0JCWEZaZ3BqK2svdTVkTTF2cWEvd3Z5cXVRSTFZMWlzTXBjRUM4RC9LMDYzdCt3YWJnbmpFZ3ZMdW9SalY2N09YeU9nRlJTWkM5NFVsbnR0dmlKYllBaXVTZ01DaWRwbW5BOXp1TzdmTXhZUmFhM25ZRDhFb0VFZTNzNUdXL3M3bmlzS3oxMExpY2g3ZTdJM0lrY0MydHRQYWVUNDBiYVZDaG5tSE5VZFBLRjlsZjY1SjhmcC96YkZRajcrZUFSSVlvcmdYWVc4VjlwMUkrZ0pIU0xkK0pQTVFKZWNjNWlNNHNGeWJUWHMvR2hDeFdYdXpKd3ltK3ZlSFlQc205M1dTZnpiVmpUeFR4ejJpTzRwb0p1cEFNekRZK1Nac08waTRJd2ljQ0g4SXEyVFZmdzNwc05yZDZnOERzLy9XYUNnMnFxeVJyS2REd1p0aU1ObzZla2JrR1B2ZWduYXpUa0JUYWRnc04wVllBOFdpNmhZTkQ0WDVmN1hVL21YdHRFTVF4eExaaHo1SlBDSTJrS2dJRlBZYjYwV2pIMDRaTTZ4Q0dMdVBqRTZVU0tDbGJBYmZIenZFc0xVckx0MDlIWGw3RUZpTmxCSm9ydVZMZmN0bnNDbWdYaTB6dFpHR2lBNHE4MSsya1BlZXV5NDVWRWtrUktMc3JZOEFjYTBtcm1NSllJK0EyVy9EY0tIU2lCQ0ZicWsxOXNqcUNQV2ptTmhlNUZ6NEEwcmM0MGpwUXl6ZzREVzVTUERudzYyYlZKc2ZyNFJyWWZNRXBKcDI0bW9uQWpObG05OWJGS1hkUHdjd0pRdDNJS3lZdGhTbXpGODYzeHJDSTFVaUtxTnFYN2tlOFljVGxVN080c0NNdGhpR0IzL0VzbFRVdUJYQldLNkdjazFobVJwT3VtTVF2Rk1kTmV3UXNNVFkyWDNOOUdOc2I2Y0VucE50ZFVvNjBPNUV6YjFGaTBHTFMyMXRSSVRpRXlvTmRqNWJ4WGt2L0o2amJvS0pMVWw0L2xYRkFuaS9BUEtvYWxBeUlEbTlMeDd1QytBcExVYU53U0RzOThXVTAxNXZnQ1M4aGRsOE9CNEYvV3NqTDZHNlZXOEVtRUw0M21MbDdEVGNOWVFaOE5vSlpJeTcvbTJuQVFod1VjZWYzb2IwS3dmdGdPdU9FcDlFQ1FrMENJSkhDSDd1UGFuMFdLTFVYSittbnZwOHpXL0Y1Tm9NNFYrdVZGMXZpMXAwYUxuUHlaMlZNY2hWcEJ4ZEVET0lPV1Jlb0lMeEpiZk5tSWlvYlpqWGxsWjlxWDNPdEtqb3JZWDB6VTlkUVJ1MmFaa2FNaFR1RzZOaHJQOVJTOXZEeHlBWG9XMlBJUFpGSmNycDR6V2t1dTN4QUJxcWV0UEZ1ZWcrRWp4UEZLVFNRNjdhVHRsY0l6Z1B5S3F1QlRYOFBPU2R3eWVmeWhzdHdNTStkQlhlOXRCK1l0YlB2UE1CV09HU0ZKWDlWek80OFFSVUNERFF3R1lUbGtuV3haeVhvaTRnVVZwUXprSXBybTFOdjh6dGRGYmUzM01PaEZIaU5FaDFwMjhZNzNxeDhLYU5pZ1JtY2RkL1pWckFxZGtVWkNIQlloUVkvOUFWT3BPcEZLYTR1TVZXUmw3aFUxbE8vOThRc2I3Ulk2eHowZlNvMHpzTldaMElxUWt6ZGg2RXYwZHZva3RiVUlPWWFsYm0zN0xVblQxUDBSZG9wamgwZjdBd28vM29aWTNUaUNHTkp3RHlGTEZwZGk3U3h0MzFsUWtoSDBxaGx6SHIySDBQUWp0dEZFaTBXcTlLaW9ET1BKWTFJUjVUSjBkSjU0NDhUUTdOam5Wa043SVhRZzBEU0V1Q21kODNLRUxNQ2hFUTFxSnJXL0NCWkRoTFhJQlJLakNxbkkzVkQ5R0Y3cG41cXNoU3hBWFJhQmMraURwOU1sYlJiUnExa1ZneU8yNzJOMEhpNml1Y1lvMVpGd3NnTlNNYlpQNmZ0SVpTTytEdGx1V2E0b3pYL1AwTVd5TEFzbDVJWmNoT1JNYWtUanUzejhCdWZPL2hTMlFUUExVYi9oSFM5UWVLM0xsS1VMeW1FZEg2cE5BdlU1MitIeHZtU1VYZkFiM2grOTJUeE5VL0hsdFF5NkZuTkJQbi85Sjc1Y1NqbTRROS9VOWppcGtTUTVnMERENGhHZG5HdjI5T3FRUVk3eis0UVN3alJpZnNONUY1c1dHcnVsQnd5N00raHdsQ2xlY0lLTWF1SDl5UGsrUWZQQkV1NUJXNHNpNWdPVTRWc0tRMXV1YytBeUNjazUxQkd6c0RxNmZPbDdoYmJjV2xSOWg1c0U0U0FPZTFiTm8zN0lQa0hnYzFMK1pjTzZ2dCsyYVgxeEIrRjlYUE1OOEdPekMxeHlDb21DRWU2OTJUMklIdVlsU0F4QWpQMVVSeUFMNC9HQzJzTDgrUHAvQm5udTlhaUdWV2p6WFJFR0FwKzZGTjhEQ3hBb3UvTG0xcjRCemcza0c1U2dYcGdKQmU0d1hLM1NuRFdKaE4yV25Nc0NsMEFKc3lMeVgwUmJualA1dk5IdEVuQ2ZJTGRibkhLQTBhQi9GS29FcWV0NlZBWXduRUFRUFV6ZTQwV0k2SWRFcnJoNXRleXZDQnd1R2p3YzYxZzJOTDBnVnpXSG9GU09YSTlhV3lCMFljNmFuYjZUWGF6d2pGeEVrSGdKZVdVQVlLYmhzT1lMMFZ6dDZqYzZOTFIwYW5KYVRueEUrT0Q1WU4rNDJhQUd4WFdVQkx4Wk5uODZiQ1ZjVFF6L0FZWnhsUi9wTGMxbEZvemNGYnk0QTVQVDV4VFg1TlU2WFFNajhlMVIvVGI3YlAya3lXYUVpNy9BRHh6aVU5UW82ZFYzMzRaUW0vekdvcjdmSURFRmFiMEJuNFR1YTI3KzJYdWpUckdxSFBnWlBUaTRZMDdsR1R5UXNFeGk5cXRpUUxhUCtMdmxMSzlKR3ltUjZ0SUNQTE93MGd6SEFieUNTbWJnZjVmTnNhRE50b2c0QjdoM2hjVjhLdHFWN2R3NXczSXFjOTJoQk5FUDBPcVFpZEFWbTdkSWZPSG1zRmpHaWZseUdLUXdLVFhsdXU0YzRBd0RBR2QyTm05SXpGakN5Z0VQREpiaXRPaWpxN0JRUDBVYXRCWVI2b25NMnZZNUw3bzA0Z093MVo2Y3RUVkhrSDZ0N2ZGeGxCZm51d0xMY1llZTZLYWVJZ2dybW4rYzljMGszZ05IckRKV0dmYnpXTXJ2V3l2WnBpNXU3UjB2TVVaeWt2VUh2dEp2NG9TZSt2MXFCMWl6QTRTSHYyQXpHOXM4bFVrYnByZEJyUGpxUnI2QW5mZHpmb2NyK3pLRDYvSERQUTBDaHdzZm1rQzA2WmtKT2VzQzlnWEVLaFRRU3RWWmJiS3ZGcUhjNm9mdzZ4Z0dYWHRocVUycGZiMlRiTWJLb0lPNGp2TUU3TStCN3EreFh2YVg4OHBSN0NQRUx1cE5oTldFa05BaUZlckh5ZkpEcWZBQzRZUG84cFFMeDhhR09jczJRc2ZDSmR0WTN6ZEFjVTA0c0FPb093QWxKcGFxSFVSdFhuNjZwR0VObS9HQ0lTTmFnTWxXdzc3QjRSL1dOLzFCYVFtSUl1K1NyNEYreGFwaHFKMW1pNVcvdERMVVZQZTk2NXdxMEd0TXpOcFI5TTNZK0JjYUhUd0N5Tm5XM3dqUFhLV05Oa0l4dnhxVkVKaW81V25MVmhxV25mRUJnYVFsQXJIUHllQXZ1MnJKS3B2elVBQWp0ZE9CTXpOTHk3K29uZW0yT0pjTEhXOUFsbnVKZVp2R0s5Mlp6R2toQzBENE5Ca0htY0hXKzdFbFZrMHZPN09aNmZubXBFYzBiUjEzMWc4TTc4K2dBYTBaQ3dyLzZpeDJpMTBKV0EyNkFWOGVaODhvT21FYnVsR0ZXaWdHcWhIMkNCS0prR2dhQzV1WW56YTczSFB5UEZQYjNyWXpZTlE4Q3FNWWRyY3NDWXFxRGZTUkkzV0dHUmFXa0E1d2FsbXd0NDNWZ0ZrUVZLallZdVYwangzR0U3OHdXa1EzMElsWGZZUFBwRGlIZ2RVa0lsazJ4aldzbTVTZUZtVmsvRTd4VG5BNFVEVnFacWpZZXlheEdaMUd2dXlXMVJGdTJkdk9xSWQ0ZFpiTUV2QjFnR2txWUtyL2sxemIyTWJkZHl2d05VTWMyeXNReVJ1VzRpQll6UHBsMWQ4ZnJlSWZYRURGY05QYW5DMERrMVZzZWUxakdua0xqRWJFTU1DNDZMRFg4RkFveU9Fb1FKejVnWnV1R0N5cjgxRG5hMlcrN0Z6Zmp5Uy9EWlVubk12ODYrSE1hckc4MU96Ym9EL25uOXRRWmtsbGNVNWVpcytTRGJZRURYYjNRRjFuYlMydmJPdW9zdURQVGRoSVJGQld0SndNSmdGKzlJZ0lTVWg5WE53aWNjOUhHNk9MUFl0NUtNM1RmSHd2SkhneHdtM01EUzlRYjBZeWxYcWtrZ3BGM2d3MUE1ekhBaXVEY0Q1WVVFanJnUzB6N2U5bERWRmkxMUxiVUhZSnp3Q3BXbUVPMERKejJtZjRwd0owVi9nYmVpUk5YQmlDc3JDSWJuSnprVzBkUFk5blJKNXNHUmlDa2h2dHc5eVE2RHVobjhmbUNxZ0hoK3Z2RUhtSW56cGY2REdnVm9yWHlrSE5aTzdJSzBZbUFPWGhMWDV6YnVPTkYwdUh4cC93OGxPa3FpVUV4TkxTa1NYOWVnaDdzODAzbUorNElla3Y4bEpmTUZtcjZLRXFhWjBXYkp6dzdTZU1RdWJSZDFQa3JzKzQvRWU4WjJGdjVvaDlnczEvdE1ocVloMmNYeXVJcDRPWGt3WkZsR0lCaTFoeHV1aFBER0lMOUV0OXZpK0gwbDU4N0ZmVmVkZ1dHK0ZKREZMM1ZPZ25wZWs3WlkrSXVPY2w2dXBwRTZDTHA4MzdsQXh4c1hJOTdENTFsRWhrdjk2YmpBZno0aG9HM0haTFpUNnRjdUNDRVZRL2kzdElqYk1aQ3RIL0NyK0syUytETTlzMWFmS0dsNmFzZ3JzQzZlQVRiMGVuakJYeGVuZWpsbjV1a3h6VDRrOWVlVUhwVDRmd3hhWXRoRS85OHhuMDZCRXZKLzJpRGUveHRiRG85aU1iZzBzei9SSHVRSUd2d2ErblVFUk9yZWpCSmU5V0NIOWZTNm4vYUdWZTIyRjROU2tyZ0xYM1FsYURhcHA2Y3o1TWhJTGs2ZE9EOVdoZHZ2SXpkeWRBY3BHbjE0VUFvdTFBWHlzNXU4TUIvYlYycnFVck54cHVuRXlWNS9Yd3MwYWluYmJjdWE0UGVac25yVk11UDZ5Q0V2TGIyRk9tQ205NnNzUkhnSjZzanVaZG1kdndaMWpBenNiczFCYkFJaSszdld2OVFDdllyVkQ1QWlua1dtUzNpS2xLUVhsQWV0eXdRRm9QUjM2dWdmTXJSZ1dpVnFaNUNObjZsdzB6WFlpUVZCS3NIQjJTWjNJa2YyYjRIOUFGYjdyanBaSStJR0YxMVdGU2MxOUw2dHFEK3dEenpFWERBK0Nma3dLMlVUWUtBZkpaSW9GMGtaQWdvb2ZjMGZqS3loS0NaNTNrZVpxV3kyMUtzNHVvaTBEQlhPREpjNFlkVzl4UGVQQzNCaGVHaGE5L1hXYnk1aVVkaWNTdVZPY0RHdDY5RVBUYytMSFZWcldzRGN6T0ZwalY4TGU5YzlqVTk4bzBCZzZRSW1paStVdzZ4aW9IYXV6MUJmajJRL1A2SFJZTmxZa05MK2F3cGdzd3Y3SjV2MEgvcnY2dUtETDNhTnhVWU1QUFFMSERRaTR6cWs1b0Q0aDg3cHZUV2VGc2dPV2h4bjhxTFVucDg0emUzKzdocDRKWFFsOGtMSzYvQysvaGx2Wk1LV0t0dkl1V3RHTTU0dmxvRXY1TFpLN1JaS1Nod2VyL3ZxQXBxNUUrenkvelRUclc2TDJtdWE3d3FzeVgxUENpNXpEQzZ0TVpCOVFpY2VvYmN3QzZmMzZKT2ExZGk0ZlpGYjhQNmlPRlBXMzM5cUU4bTZxK2RqaVphYXdyWWZZSFM0NmJYL0ZqTGY3SGZaSllySEZiL0ovallVY0xwZnlsWFBoS3lMdUVIMGJPaXVQSzdVT3Y2cDRMNHZGeVpYSExma1c0QzBhdEpjWmJKdlluTGFaTitLS0h5bzE4TWQrZk9HTXJkeE4xdUJNR3VYZ0J4b092bjF3TVUzdElrRFRCUk8zN0sxS0c3bU42VDJOREk1REtUeGNmTGRrNFBPM0d4NHlkcWRjUTFLREZoRis5MFVINzRTYS9IcjhSY1h2cjg2YlR6dGxmN0dhK2YySTN5cFdNSmhhdnEzS1dOWVNGamkyZ1QyU3VXOXZ2d3NOZE5zdmlWczdIajVlS1B0bEc2RUtHMThqbGxXaFhhM0lsZDlxcHd4bzl5N01vcE0wVjFydmxYQUk4ZENLM3d5ZGQ2dDhCaE1pVTdzcFR3NVJZUzF6MmU2QVNLOXJzK1BEMmRIcDViL3Bpdm5nNXFvL014TFpZc09lNElwNkhiM3VtNWRJdkxad0lhSUxadHU0aWMxeThJNlBNSmgzbVMwL1hjMkJ4UnY0TXhBY1ZJNDc4Snp5cytqcTlMNE1LcFM0enZKS3E5R2ZkaS9PUlM5T1hQdHFFdENKSXl6dEY5bG00Snc1aEJMcUhRWUM5NStKZUhHVHRtMVc3eWtGY2poQ0Vuc2pKWTgybm1ONitaYW9vWDRTbkcxMlQ4VWFuV1lpbjVHT0ZOMGJlTnB5NVRLc1F5QWM1UWs4QUlsWUJzR2lMdG16SDc3NWxXTTBBeTZTYXRwV2FONHd5ZlhKeU1ONHM5RDgxc3NwaXIvV3Q5QTZnSU55ay9KaVJTU2FKaEd0SmdOQVdBSGo1d0ZiVUNoT0RiV3pSUlJzNzRmamhCbE9yMDdwNVpjbVBRdXVFVE1GTjJSN3U5azVENk1OQXJ6dFV4QVo2WEpKQkh1RjZWUmplZjc3ZS8zaUZLU2RSRUN5MEs4NjZSbFVERTU5ZnFZUDREdmxCMFFMRE80UEpGYnBJQXFKVjhjMXpPUDAyYkExQ1JYTm9vQTVyeFlFblhpYVZTMVhpbGVydmtORGQzTXd0SU5pck5JNG9WaG5nTWVqZ0JOeTVaUkQrVXRrN3FQSlk0by94YnFWYnVucFNVRmhZM090Q0d4TjF5T3NNRUF2U3lSTEJJVHYxNW5CcDZPNEc4NThoTVNHbTFSVWhWcXpDbmNDTE9ZQ3U3d2EzbUpvWS91R25rWTdzYmdPbktDUS9vTEs5SXA4dCtzclV1VitLblFORTl1VTRFRTY1Nyt3NlR6ak9pSUthQ0FDZ2VOaHllWncxTWlLS2NBTnlvWUpUVUEvSS94dmU0cmU0ME5CeVBCSXhQbFZhaHFWMStXK3VEeWNzQW9WSWw0WXRUQmlDSWxYQlhNOWdpZHVhMjNXN2dFekNCQkRRVkxaWndwWHE0UXJQbHpMbHhUMFV5ZE9hZEI1QzRYU2JpNWVsL3pLY3VYcGEyTlNFeHlId2I0bnArSmxqL0JaSkZNMjVadzQ0U0V1RFlRMDFReitEL1M0L1dyZWVxNlBLQ0l6dEZ2K3BUa09sa3N1aS9ad2RpaUJadzlOS3lLSWZpZjJzM21iVkE0QjJ2c2NmQVE0eUZnNXdmdjUvajhyc2hRaUJSNTd1bGttbm5KOTN2VzE4bmtTMGpyZlhqWmtJVGlFT2lzVVhYU3YwWVRHbzgyL1JpbU9YZFNiOEJTRzhDcndZVTlLZGhrQVdkMGZkTDlzN2pZY3FmTk5CZFBORmREZ1JzeS9RMEFXQXhLWmNtWGhDbGU3b2oxSU5yZjd6THcyNldIVnAxdWxLeGRuOWFWMURHd2JOMzlQZnZQRUtVM1lmZlROMFNSWkJ1V0x0eUJPNVpPUTVmQzdWUWVCUklqUTJac0N5U2FabDBaUVlVeExwZTZac1d2QVdqd2tKempaRFhBOW5XejZBcFFnS0twL2ZobE80cVE1R0J3K2llRUdQMkVEZWtVVURTdTA5WXhjZ0drOWZ1K0RaZUluaVE1VWt6L0xLaFhrL3VCd0ZHZVhMOXVpd2tNVzJsRSt5Mk1kYzFNK1RhdVpRblpjNlpQclhubHZmUTBxVkZpTzNSeUxJTzRZYTJsYWNOUW1BNmlDTXJTV2F4aWdsOEtVZ0x6eWJoTXRtR2x3RUtKM2pNV3NtNldkejBVR0tPOHFLZjFtNEsrLzRQQ3VoQWxSbWJ2Y0xlN2dTamZhT3FZb1FzQUpHVURFUWl3Z1Q3MWUrZ2pmS3ROcElOM1BIcU1BazM4SGszS21yY3FxNS9rL29JeG41Y0k2aWh4RnEzYkZBZEpCMlM0VzJiU2RTeXNCZHhkUXg4VlFVM0xvVzBTbTErdEdKNWtjRU5yTlJzQVVxelUrRWxLNFJxRllpWGhTQnhhUVE4WW9VcmpyalhhNjA0Zy9mdVNuT0NHT2N0MTJqZlhObERIOFdnV3NjZWd0WW5ZS2tTNkxjcWkyWG1MQzNDZ29OWitxV3dkdDFpRGJYdW1zMzM0V3JyZGJBeVF1VDhEQkx1YStCSjhqd0ovZ2NFZXBsRytpNUNrNitGTFlTSGdDYkMveFNHcWtYRTlwQ1VkUGJGUjM1aExDbkNDTlJMYWZBRTl5a2VNN1pOYmo2bmQ0QVNXOU5XUFV2ZlVYelJCbEdObDFESVV0dlJKelIzTzFtZjJqVkJRNmpvNXpBL25OdEtpZklVUS9SOU14Q1JROHpQR1lFb2h4VWZWejh1RHBQcGxLZFpVVERldWJDS21vcGtVbU5saUNOUFpEWisvdjVGR003V2JTMlU5VkJCUkY5WUtHS0sxay8xa2ZZV2ZJTlJpSkZoYlNxOWxMSzhqdDZ3QnRZUi95OVhTWDB3bW5GRytvRzkwNFFmSnBWaEFCaGVWSmhaQzdHbTJza1E3WlJ1U1doajhkM2tuRFZpei9GajRPbzRpM25ZaXlFWTRnUG1ZMmlRN2JPVUlnby9HNERITG51K0NRYTBwdjNJYUxIUlYrZ3FyUjJMbG9XakxUbTBsV0d0Vy92NFk5NndQR0s1V1dEMFpxalJwMDZtbElranVtdmhoZkxIanZPaUl0c2VneXVWcjF4RHFYait6L0JId2hCUnB3RGF4YkkyQTdCdlAxQnIwQWNTbXJhZ1VLWlpPY0c3T2wxUDBFM201a1R3c2ZGSTRac3VVZTFZczUxblJ0cVNPVU9lNFhvU2hmM2hjS25FR3ZDdm14UFRQdGxkNGRaK2RDWDU4MlRoQUJnekpTWEtIYndQTStCU053Y0pTUjREMlJldFl6M2d6Vkh3M0dub3E4MUo1b2g2eUgvaVF5T0ZHQ1lqWHIwR1ZoVytoYmdiNzVwWUI5Wm1XZlY0Z3R2SlFFeEhoMWVuY2t5VUhPUzY5L0lxSlExTmlOKzA4K3BxdGVmdzlNWDd3K05RZ2pMMTBVODhHYVh0OU1uUGIvZWdSckVnY1JRckxFaWxjdldTN09FNjhVSlRFTXBjSXBDaFZTT290eFhDc09CMktaTDVOQ0xRZmk1NUpVYmxPNUZ5dlZuS0NMRklvL0syZkZPcnJMWExodlJkdG5oSHZhUExIRndYNnJ2MWZSd3RuZmxneEZlSVpBMW9jdkU3bm15ckRldE5zVzZRMTFWdXd0Y2U2U3pyRmNGekhRaU1DQWVRUTFIUnFieHhiQmVGUmV5eTF5RmdRWDg3SmZOS0poNXROZWNNYm0zZ3kzSkhKeGlNcHFaZ0crelhVRHJIQ3Z4eDdhcmxOT2FJZzhzZGw3NFdnMnBRclFuZGg2Q3lqR3NZdFNPdGZOMkVJQWlnL2N1MWxSb2pZMGhtSVFiUHJJZ0xLQzN6UUw3ZjBrRWpmeWZwd1cxL0ZBU0t6UlVCVC9uNTloWEhlOWR0cFF4QWtTMzRScHhqUS80K09hVm1IUWZqdG9WcE12S1JoUHBBbk9hdVpZdy9LT2xWcHZtUWVMNHhhcWlSVy8rQjdIK0phQkFEYmwxbmpJRUlZQ0pCL05IdW9hWDR5cUlPek9taXBXWWJwNnNKWVA4bWg3VEFpdXdqTDFYbm9RN3piN1BZQUpTOUNaMm5COWMreTVZQk9xVE9JZjZkMjNoQUhYbmZnYkVwd3ZBdnBUcEdrTFFNUWl3Y1VEQ1R5a3hIZk5uZk1CYWdNL2Q2YTZJSWxGUE1Wc0t5U2NzaHVNOStXeFQxakx6b013a3JvUGFUL2U0TVdsY3dOcTJ1UE1tODFaM1BrNGdjN0h5UFluQURscmd0NVYvcllhY3ZMWmtVQmFSeE0xMnNpQXRVaGo2SHJJei9NR2s5TGZqaXFITzl1dEU3THQwS1J3NVl2T0FiRWVVOFBwdm1YK1hScml1TW9ZdXkrUlBHbEI4dmNLWDlxTUkyMGxqeHBiWW95aFdaeVJ3a3NUNGFGMWVwQkV2MWVDOWtabXB5d2pOdGZ1NWkzNVJIeEcxenhRWElkbS9ZV21EVmF3T2lCMzkrbk5LM2kxQllrMTVkUDRvOTk2eUlzL0N5QXlxYUVGTUErMjBOZWJwNit0Mk9xdU9KY2Fwc1gycU9yTFp2ME15RDhabytmTnBXTTR4c0k4UE9wUDJsVHZUV29CU2VXNytxbWZ1Y1dkeXZsY1NOYU4veVdjUkQwSUdaY2NFNlhuNVNnbTVmaFlzamlpQ2xTYXppQ1dtaXZFNlJRV3hWRzgvQ1R3MXhVc2duN0VTaExIUmRXcmVqdldVVjdUTEh5bFBSUFpSTCtMNVJRSTloTVpHVlVDelBneGRKOGRNK3VzWDQxRkdrNE5SeXkzTnR5dE1oL3V2MzAwQUM4WXNEZG9WaGkrM0tBb3lrS3VweW4yQTR4ejM5dExXS3NjQTRlMUN5QjVnQ2VsSVc2Zm9aak1LZWNJNjNVWk13YjBYc0h1UGlKWmpXeUU0aXQrWmpjVkMyR09ZQ1liVlc3akhXWFVES1ViVTZzazBsS2luckdDYUlyNzI0c2RpZ3dPeWVzS25DNG5hdnFHVllGWU9GM0RGVUhrQXg0UnlrVW50WnF1RS94VXh3L0ttT3ZhN3pHUnR1UG5mbnljcUFQaDdzSGVVTWVraS9zRUFGWTFZaGhMdnV2dHVkbjFSTW56b2NGK3RZSjJaZ2JCb2RGbHkzWi94L0xOaDR0WDlHYWpjZEVPQ05JTnRXTFNXODZoUzRIRE1Bb002ZjlvT0pzdVFEeXhDaVNXcEgxTG83UDlUSkExa21ncHpaRXU4YXhWQTBBVUdXZXp0ZUlFeUFKOFlvQVNFZ0N6TGszaEwvTXpnUDNnZXoxWHZhbWcvakU2aUoyZ1l0T3FxQkxuTlVDeTVYWU5BUHBpejkvd0xsUVZsNXFGU0NDenJydDZJNXFscExrTTZacFQ5WTBvUTRncThEalh3R0pwblk3VzV1bzVJV0tLcitxZ3ltUlg5UjcxNzN6RmUwM3ZERm4vRXJES3pTN1hYSWthWkxmS0d3bGwrNHlGUTFON01VV1BOYnZDYnZhbTZRM2wzemt6MVpQbEtWSGFGVTRHQ1RRaFhOYnBMY0V6T0Q3RnJJbFdzblcvaWJ1eW1qQnBaUU1mTEJsQis2YkRQVFphalJRdUY4cnBid21OM0Jaei9pekdHYy9BVHliSlFCZ2g2UkxUMm1jSGhqY1d1U3pkT2ZieXl2UVJweXdPZzRPMENBdXh4ckRMR0VCZTJ4bHA1WkVBaWxQckV5aUdzZUNORzMwTERlRGdEbkNJNnRIeUVzdkFLMkFtenRhaVlzWTJBUk54Ri9acndYS3FiNVB0bitlSFZycFdLN3JRU1lKc1pseU00SjluTjR4VTVjNy9NcGxUcFpud0VrRWVCTGpNMXZQNS9TTGczOFE5S2lJd3V5dnQ2dzBTcm9IdEJRTnVyS3V0VkFmeUZVZForNU1XSi9YQUIvMEZsZEkyZzRrZ0V2VXRsVVQzOFVReGVxdHVRaHJuNDF6RnBQeDF6bkx4RDNOMHExbElGVkdzbnkveUNFR2M3dWVIZFhZSGZxcU1GQ2dscHlJREFEOURpbHVzeHZpNS9aTnM3L1VnZkV4SEZveHJKeVl3NHZGRVFGdXc0UGJkTXpVWkUxeTZKT2RyZHlwWXdYOXE3QldGb1RWYWhWSno4UTRIN2JJWldTS3JYZERQdzhxVW01NklZNDNUcm53WnU5VmFLWmptTGR4STNmZDBvaHFIY2pid1VxajdEMkQ3ckUzVmUyaU80aWVta3pOQ0l2Tlo5RUdVek9mQk42akowa1J3OXdwdTlDcmVQcDN6a3NacDVEYmR1dUlkRGVUei93cTVXY2R0WDR4VWQ5YmxGUWpyT2c0b1JiRVFxakhBdzJkZ1VXUkgyaTREQXVpU2V1aHAzNE1HVEtoTVRYT0tFSHRFZ3IrQ1NydEJqb3krcUJpZXZzTkxaaVdtQWVVUmEwayt0eVN0NndnTUluV1hiZG4zRXZURDhzaEhZUTYyeWYyLzljdG5qc29UNzA5dVl0QnJOYjFBdVFQZ2JlOTlRK2JrOEI5MWErS09LZFZZQ2p2a21MYzUrYkdmY3FlbDgwNWIvUFlLdWpyTzVYcmN3Vnc3MzZiYXNTcWNzTy9nOGNuNVNBcEs0M0oyeFVtclF4Mlg2L2NMbkdhZUdTMEdDSzJ6V3hhQUJWd0N4Q2xQWVVsVmZZMlQzTHd4c1lSejJscm9wUThDN045SEE5dVZGMFJtbjRIbjZ0RjFBMFAwS0U1a2sxcHpPUUtCcXkrb2pnVGkyQ3cyWUFVaTgva2ZnbGpoeDMyT1gzbFN6TlRTcGJDWXo0VzR3Q1dndThXZll0ZkFudTdvR2I3dW1jYnlnbkJQZ1Z4cCtINU9zQkViYnFuMkZQdTlidnljZXNFWEwzNUZZY0N1a3VoU1plTEpLRFQvaHVCanJveStjRjZQeitSTzU4dUFJV25hUE5YRlhvcm55Ri9LdHFzVkJ3REJibjhIR2tIcVpaZHlsUTNCS1AyUzYxK1VPSUNpclhKNFpxcHZqbnJxbHIvQTN2UGlUUm1OMjRLZG1vd0tyYTZBeCtTUVRyUGNKMzZkeTdDQkR2RmY5b3hhWm91Z0RaRUFWUksrdjFYYjdUbUhtZlFtMVkwZnl3WlBROEoxSEVLYjhIVlZCelZ4dXllMXdzRTErSkxBOGxQekQxNjM1VWdkZGZkMlN6RUhmNWs1VUdIS2JaYjRlS3ZlME5WQVZtV25VR0FzMUZmVFZvOWlOZFMzOUcxd0NHUlN3VjdFY0dQdzJuYlpObGtObWRzdlhqVDlLWTNxeTFJSHViK0JpRysyNkhqdytON2s0RVJGTzhEZEx4TXQ5bG0yTnpNSTVIc1RkYk1zdW1sNDVES1pMOTA1elBQWG1WSWRKUW9UNEcwbUFmanAraGo4MFRqQmlZVUpoSWhWMzVmbFl1azZPdXFNMUpOYmVadkt6dklka2RQblFaYkFRcG9WSkg2VkZOdXBLbFZnWkFXaTExU2R6bXEvVFBVV1dWYlQvYUxNZ0dPRk9KSXI1SWVNb0VjZ0hnTXJOcWVkL01BaU0yZEJTOEFLZndubjNlR2xFaWN5ZnQxL0JmbE9FZEoxQkh6VVJidmZWZVRrWk14Zkh5cW1NT0lqNnBBMVBvOS9TdkdLWnlHMmQvbGRsN0hRZ2xOQTZVd0J0MXFBNGVqL0dTZnZhUnU3RTlYMFllendCSDF5VU5sR3BsWlQzbEZycmZhbDIzdEtOd0NXUmNxYzR2S2RCZTNtbTh4czU2Y2gzbWNWT1pBKzgwZndoaWhmTlcxOGJndGt6cmdVellIRzRBeDlxbmxka1I1NWNSUDN6SkxTTXdWdFNOaTlocUxpelRnZ0dFdGVMY29ucnpmeE4xQk41V0dqNWw3TVFpVFZNdFR6YmFYbkJ6WExTV0RBUnQrSjJ0cEVneGpNZ0lpdXJlSHRZc2RWN2h2bDFqcjZNb1NueVNpRWNSUmd4aStkTHZtYk5LV3BKcnJzZ2N2R2pnS2RPZVptRTJGb3YvRWZuSWVPTTYzM2ZTUUMyYktBemU3THJmSXo0M3E2YTZFTlR5NFNPYWdqbzFGTlVkaHJpMDRtTlhDME10NHlReno2NHNHZFJxSit6SnUrRVUvdmpZWVJlWmtLVHI3bDVqc2ZMR21UNlVWbHpKRTQ0STMrZndpeXBXMG45bmxIc013UTMyeTQvZnFNT1ZNSDlra0xMZVBmSEJQVHFTaGdrczQ5WUtDVnZGSUxaYjlKREZYZVlXTjRIL0ZlOUtuZnNtSlZlNmRMbkdYb3k1VVMzaVhtTzhVeTFlSjhLT29BUGVEejR0b1M3dmFKNmdadWhsREpKRXoyZ2pBQzBoYnpjMHArMlVtMmpFTStrbklSV1pqK01WSlp6R2lxMmxySDRVeUhOaE1oaDd5eFlUYi9jeUd0eVVZQTIxTVF0OU1oMkNwOVVsaXlDMlE5ZlZLUzhZZkthYTQxdHc3WUJXaEhqNXNMT0lRdndNNnZXbVh3ZVNQMUNwMno4b2M3MXc4MTFncHNmMUJzSkl6UnlCR2NmYmVoRVkrTGVNeWFZSzR6Q2pPUG8wcktyM0ljTXkyaG1ldENIUnNGUVNuSTY3R3UrK3hZZDFQYllOT0hRM1FOaWRrK01MQlBGdzFTSW02RnA1di84WURCMEpwMG1UVTNmWTh3Zk9QZnZGTWN3S3Q2b3dBbGFLaGVXQ2xwN2VZRDFYY09wYTJXbE52R0VWL3hxRXMrKzZLOFlYSWdZeUQwb0IwUUxEalEzVkZqWE0rUFRxQ0RWL3ZtanJmbWtsYjgxRk83U1BKSHRWd3UrbWt2Q04vdFdiOU5lL1h1QklUN2VIck9PbjNzK1BnVXFWRDRteWRZb3MzcDdZK2xSSlAzdXJxTHR5WENXUWd0QUloZDBtQ3ZRczdaeHVMK1c3MFFyenZZdGlMWVN4T0JoVWlwNnRWSWJuaE9rUlZKYmlGTFU3UkhJMkExTFFETUhlRkpXbmJhcTdPU2ZPNm1EcTBHZGpnZ1ZUTTNlb0ZGM2sxOUcvWURESHFXc2EyWW5IZzNIdWJ4aDlGM0tJSXBTd0JQalB1NG9mR0lTNUxCSy8yakJjTlA3UHd5YlJucUJZUm9vaHFRUDNMY1JXTkc1bUZaWFVKNDY2djNxOUNzbnlHRlRDQ2hKL0dnWDBvSmZtM1RCUzFWbHhCU0VJTE5uSXZVUCtOVjNPZldFNEZCTkhsUG1sS0FMaU5aU0ZJVndEeUxUeUtjczY1QTVSOGQrQ3kvVkNjaTNIR0xzQndXSmVZM0ppMk1GRWNNWTdUdGcxc3UzRDRBTUhsaU40L0YyOTJwdjVpTEhHRDFXTmFxM0hEdmNjMFU2RjVGSFJockUwb2RmSCtZck9xWFM1RTFvWkFNVmQycmx1RFBIUERZcjNEL1FnMWNnRE4xRUFqb01nUmdob0h4aTdNc0ZueUxUUmpQQjZNVUZWc1liWTJuK0tLbXBBMGJDRW5Fakcwc3g1NnNNdFFPeWtlN0Y2VHV1c21HVFo5VjFncytXY3lVSmxUcGdUbkg5ZktFZnd6TEJPVUZTV3RsT0llTXZxVmJIMTA0MXdPRVhCbzdRUS8xclVNbWFHL1poMi8zdVBiNE9xQWIxcEpNWXp0bXFseWpqakt2Q0Rxd2gvYVYrNUdnMDVXQmJNZzdHbTJFbnFueTJHUjk4blJCbjY4eTFqQU9NUjY0bkQxd2h1TFJvK3BWRXV6TXI0K21TS0RjOVpyNnpjN1ZYU2tiWHhSaXEzeU04ZVplYUFsSXh6cktqd2toWURjY2VCY3dCbUpVUWVuK1h2VlFnSjRJVTd6a3FJN1luRDBMcFk5UWFZcHQwdHlhVW9pUzlkQzRSVmRodnN4ckEzN3dEenB2dDlwdkFXTUpjTmh6OTF5anZvSy9leVJiRzJlSkdBR3FFbTF3bnd6Sk9TMC9OZ2pyeDQ0M0c0Z3NUZnNzYnpUSzlObGJEYzVFdUpPNnBrbzVHK2wvbGZOTjdSTnYyc01qYXRtNE92UjlRT3QrYzUvTTNwQk16L2NoRGJVbVpEb2VkN01hRytrMUhIWkhjNW1yWXN4THdscmtuSW05MlBLMWk5dm56SDg1UnBCVDRmVjJic3FrM0JCSHlaYWtkNFZzTU44aktkL1dhc0RNLzVSb1c0dEhieElzY0RSblh4M0pwWlZTb1h2MXVzOFJ4RW5EdjU0VHpZTzNrR2hRQXBqTXd1WDlzdU9maFlMQk05V2huUUlUUlNnQVV6OFl4aG00d0FKNk5kNTFTSzhGaVJpenFKcFdjYWZmSHF4Uk5QcmEvY1d6QWgrTmVLVEs5eWdnSDQySkdzcmNNTnNiSFZFVmlONlFGQURnL3ZhaHJ3bWtTV1htQ3NKZnh6QldaQXF1a3FmYUtUN25hYkVMem51TmRsNGpUbEY4SFp6cWlQUUl0bm1UOHB5UjVYOWZ1Q3dpUDZ2L0VHVy80SG5sVFJWcUVJU3k5RGMvYzUrZnJQUVRjQVNJSUJaTTNEWFFGd2JWS0cyaEN4Z3RuOFNKSC9lTXZnY0wrNENxSlJrMnJzWlVqTUFZTTJZM2xLZGpZSkdDRVluaEFtY3EyTmN5enFXc05BMUxlTFNZNE50VFg1R09GOVJFL29Pd3FSN3dZT2VmMkdDYUVUSWFzRVpMMStKd3ZmaUh5VUJTQlNlYUZ4ZlN5Y29ZVExJVTRaVlduNGJENFU2ckwxTnpDL2dYZ0VuR3hhMUg4bjhZNld2bGg3TWpGMzd4U1RjNHNZTE02NURJUlA0OUFBMWVVVUhYa1NNRG0yQTdjN04wUW56eEtNdjY3bk1WMU9YNm1kN29UOXZKL0xHUUpNd3pXV2ZHUzFHYXhHZkNhQzU1TTE1S0ZGZ2lNcFlEOGEwRjZjbzhIdytnQU1wMjVYWTRVUG5xRUdrTXdHSDluQlBxT3NnaUFoOVkzTkR0ZE9rWkFVN29CTFM2MzBBdy9vd0NBN1lneGNIYTI1VWdwYjE3YkZYWC8zbkR0S2ExeGl1Vml4OXdTT1Fxd0N0bnVGNTJ2bEdoNTNURENDMm5yRE1pcFBuSmZaUjdKdG93WGZPZUFRc3llUFNNWXdNWkcrd0YxWWtycVdkYnV3b0lKaFlzWVl2QVRpWFc3dktBb0Q0N2lKb1NIQzFIRzVSa3Ewc2NuYVgvMHdtY3Zsbm9kNWRlZHJxSGIwT3RYV2NaS1drWkZqS2YzYWh5d3gyeUhwQU01L3BsdEE1MDQ4bFNEd0JwOXFPZndKL3pCbU94K0RLeHowcmJhd1dtZEZsWW95WkhscXhBTC9LS3NFbmFrWEw4b0dIdEp1RTJGdGM2REFLNlhTV1FuVmZxQXE5QmRsRnFGSFowcFV5TkdUaVY0dEVNUkdwZ2I1c1VGcjNDcUdkblJLNGdYbGxvQWhUZjhBendlYXFBT3M1SzhPOE9TdE9ISzhqbE5ubWIxa2VGU2x0Sk5ONHYzUGNYVTlpS3ZyVzlKV3JBMGhiK1hLY04wS05aQ0ZDdU8wRkE2bXdzRVE2M1NkMTZzSGpRVGRYNVdzSHJiU0FxdVFiUXIzVnFHVm8wbXE4Q29EandHbUs3QjI5OWhMZFdkWGs2N0FLME51ZVNJbnM1cERoY3YyQmFaOTdDNXVDOURUU0NQdVNYTXh1c3lQTTJyTms2bHNIcEJVZlEyYVM2d1k3MDFGcmtsWXN2RnpoSlZVTmpwVHhwM0REeTRzS1R3dUFqOTlXWFB5MUJtOFp6SHpXdk5aNi9LMHVMY2VUcWZZMkVUbmM0YndONWRCWTZRMGxlUUsrT0lVczZLcExRVzJlU0NhelV5S1NnVmZWMHpBdXNNc2tHM3IvRGYralVqN0E4Qk1pb2xNWTM4SzQ1T1N5RnIxVG1QV3ltd1pseFhpcm1HV1ZjWlZzb2JRZGVPSzVKZkRXNGdzQklNYXJvV0RJdWhreGlWenRNUFdnSlljdTdxcHR4REhWZjlod1VNaHloTzZJRWVML2paS2NMdzgvMzZka1hHdmN4dkxIRUFGWmJkZHRlZHJHZ3pBd3l5d3dEWWtyUVFhUE13a0t6SmtFWkYvNkwxcnBnOVNmd01OUDRCUENKMmxoVjBLM2YyRHFJT0k1NG1LcTVxSXNWRlRpMVRTUHV3ZE1PUzVIWHEvelIrYkVEbXIveWk1MGJnNmFFSW5TQTd3MncxNG5jTVlXV2dXZENucjNydUdWdmRpTDdSelRHT3lvOUVpWHl6V1R1RERzSVpVWWFmSCttV0oxMWp1T3pQTXUvNERFN2dnS3pHbmNFN3lFemhGTVllS2JTeDBjU05VSUhZN09aLzhtTGEvTzFzaWtSd2RRUWRpcHptNHlxbTRJTSs2MkdYNmx1aysxK1JidVdFditTMTdMN2paU2loVkdRdm5QZUVnQmVyazR6N2hzUGZUc1Eya2czUCtzaXEzZFFpR1ZuNng1TE1SaDBoRXRhbVdhZFRLcDk2ckFid1dKemhaYjlvSkFWQ09FQTdHejhjdjA4SkRkU01TUnJNY0hjUDdzcjJYUDdzWnQvczl3VjVRQlJDQlc1dUlFTVpJU2xIYTRyaW51L3QvTVR4V1ZzWHVhVUd0M3BMTTl6RG82V2dXTEVuY0tGOGk5bWM0YWpnWlZPNmpoaExzKzlOS0N5VXZvNzBhSWd1MU9IclVQMFpTRU5oMlZrbkZ3SFRmTWg1MTRTdC9mMWxjRTUyNDFLNGYvM3MrTVFBbkpRNks2cGV2NVJ6dklOalRsUnpXSmFyZGdhSVdXTUY0MUg1NEdkZ1p4bGpBT1hkVkt0VGxkVjd2MnFoaUkxem9uNTVWOUMwYk1EbVFvcy83VW9odU0yUUlQR21FT0tIcnd2cnV4UU9Ua3p2bE92VFVGNkFVVkRnUTlYSTRiWUgvS284ZUdDcndEam96WkhVZm1Kemsvc3NTUnNRQkdXK3Ivd1E0b0FubVloQms0QTVKUHNEL1Y1ZDFmTzdiWWpHajg2amtJQzR3RG9vOEl4OC9MTjNzcXAxbE9oYzNQbUs3Z0xoNkNrcjdDTGw3ekFYcXJxZktOTE9tbTBNTWc1bkQ0eHh4K0l6bmdvUjRoaFNSTXdRNHVsRE1TY2ROUFM5OEd1R2pWcC9NYnVNU09NRmJESUxmMHozZFdLbVpUV015d3dxM1ZkUmR5Y2IyVGovbW5UalVVbU5ZQ0VmK2E1czAreXc1Nmc0MzVvaU1EZ1pnTUdmNjRVYTAvUTgwdE9QVUFKSWdlNmd0aHV1UW9DMitSamdiWENJMGFUYS8zekFOeTVkdE5HNHBXTTErT2Q0cGNHZE92cElVVmRsekdNVEhGcmVNblVXaXdRcHN0MEhYS09TTUNQNGlsZDkyaHY0L3IxNk9HR095c2ZXN2dPSzFwVTNuNUI5TnMxL0trYkM3eENIU0MzL2ZsbnkyZmZSVThQa0tleEQ0Q2I3WnAyQTBuMVphbDRYRE1kbTRmMU92RGVzUFBTdmZzUXZpUkVTNWdWeVVhaVV3Z01lUzVWWDVkRFBPSmhvQ3VXMFU5ZmJlaTRLK2ZIUnAwbWcwRjZKMW9XeVptdUtpY3FLWjF0MlZFYzBDbDhYSmVkUnZ3ck9RVWt5ZVkrdSsxNWpqeklSQmR4cmozM3hoSWZnd2pVL3BSZVB2VWViNXBQT0dadXF4REp4dVMxTjc1emJOcnFyL2FVK05lTlZOUU5DZGVxRVJXNjA3Kzl4cVpIMnB1a25YZ3dxNm1UUHJoaTBSMmNTVHJOZjk4c2xsLzE2bTRhUUlSMzJDREFuMDhlSUUyVG1BbHNTSDVhTXRFM0FETEN4YlloTHVSakVuT3V2eXJ0ZWxjeEZGUjdINFlHYTQxZEQrSTJrTXQvWG4xb2xvWjhpL01ZRitqWXNDVlRpb0tudHNYdUhrWHlNOGszWmVrckxZNlVmS0RaUmQvQzV6bEppczNESVplb09xaXBxNHI4cE13VFhDL3k5R3FiS0prOXlrTXptN21BQ09IRzVxWDVLMTdPMkRRRGVpMGMvK2RiUUNLTnVXbnRBRXZRb3oxYTdXNE1rR1Z1V0NhMXVrV2FpRS9pSDdwd3Z4QVlMTFVJQTlHQkxoM0pvRDNGUU5qN3JWOHlOSU9BbTZKaUpYNFloVUJZR2lsaXJzMWI0c0ZzOHAvYkRTR2ZjQXFDWDMyQmZFOFQxclpnRnVQaEdoRXVQVXN6dFFZOEFISG5ZQUp2RWNKMzFjcnhmUkRTNWFEVnJQQ2txUlJyc0lxMFVaNnlraVdlMmluekQ4TEZmVFhET1JHeiszOTJoUDJYRVRkajBPOEZ0NEcxY2hXaW5HWVdKMXQ5NUIvY24vYmhnZjAzL3dqVnptOGVVVFJxdnpDSmN4dVVPQ2crd0Z0VVA2emRRb0NVTDJOek1MYUxBMWt0d0lvTS9mVFlGOWd6NFc0eEpGWCtiaC8yWU9sWjhEU3lsMFVXRG9QU1JKY0d2bms2MjJ4VUE0QnJJK2hmdzhDS2MzU1h3ZUJYTkVXQVhtUHBqaWkvdGRmUlB1MVRSN2tDeHhEL2lrdk1CSFB0S3o3NGwrbFhDMHJqenZGLzBJKzdNaEQrdDZxWGhTVFZndUxmOWJUaG9WRjhaem5SY3RXRG9JU2hCdGlQOUFNdWFoWCtBVnhPU3hBRERXbGJFTFpxNi8vdzJabmx1SjltbVl0Y0RYOWorR2dVZEx5RURId29zSWQrWGVXT1dNWHVBY2pwYWRQY0xEWnhBMHpkUFIvVENXUmFBZk5TN1AvdlJCa3loaThtNEdwaVN3WHUxcC9aWmdhZXlJdjdpRUhyUzlyclZBeXdqYjVuWjhrQktJUUxVMzJmOHliS0gyQVlPcTNOOXQ0b3UyQVFCQ0dMTkl6NFc1Y1JiMkR6ODNQWnRPRjNWOEVWRkZrVE9hMXNJMnNLUnBXUm1GczV6cVhqZUJscnQrSEhka1FzZTJpUGgwa3JRcXpFcTJFVlV0dGl6V1cxbnNZc1RtcFVMWUpmdldDK0ZYaWsrWGsxVm5rbGREWmpoS1RRb203OXhESSt3SWZGaTJ5Uy9tblhJczQwRmhwTndmaE1uZWJoYXdsTXY0azM5QVAybHYyNVNEakpvNGE3QnJqaGQ2MERoUVlicGlhU2lkZ1RMZHBWNmZic21XOFd3ZzVXVFBYQUphUi8wc3NNRU8wbWlOcXZGVDd6K1MvaW44c1BtdlA1cjQ3dk9PMXV4UTBHSFZrSlByeSt0aUs1UFJoWk5XZmNyRyt5N3RaU1ZRRE9XOE9CTVJzaGZlUkEyQ08rT1Z2S3I0ZGZndkR6N013ekJkeVhMa3ZTUmlmUzhwN3dOUXp0L0dwSGlvT0VFUkpDd2w3ZGFNMXdSN2NucWxNbUFtZ1Rnb2dxSVVBL2xGNkg5b3lGODZMdW5LbUUxaUpMa0dISFRHWit3T05hN01LRWRJREJzeHRja0pEZFlIcTBNZ0JydkVCUVVHeTFvOHBEbWVuaXM4TWlzbTMxYXZzV2N0RUEvS1JiZXlUelMrREZORDl5aXloTno3VEMvcGNhOUFwY2lXSDVuaE8wQklmcVhzRGMzbXlmNEdCL0ZtSlorL0I1ZEZXVEFlcDFmVDRwNFBSMGhpRHF6c1lDNXV3REVLVmlZQ1lDUS9nQm51M2p0enpab29jWVpQNXZNOFArL1NGRHZRMG1ZVUptWU14N0xZbkhSNm1abHlTQlJZWW92Rmp2ZjhuMURiakUwbWI2T0UvdDQyOVVFYTNLK2lFcXp3TkV0SEhIMjVzOXpTaUcrSG5PVnpaK1R4VDR0VWxsRVlVZzIxbnhzeDZjbjlLdDkwTzVFc2p3WTVvUFBxODFxVFFyNVJvYUtlT0g4a1dETWwrT1A1azJtVU1RSGMydEtZVFFDNXEyZkRlT2hDUHhFdzdCMnY4cURlMnBNc3B4ajV3d3dQOUNIdER0QWdPMFhKUDV1clZoT09CNTJSeC9kSDZEajluRkdkZDNCWmFKaVQrVHgycDdpUzczNHlNMGxzekdWQ0FtNGxIdEthUHBKWWlyaGNoYnJmWXMyWU1sc1pxeDNPUFJEdmg0Q2JGQ29HeTN4QkRoRkQ4d2RKYkpCMGVYdzFnbVA0cm40L3Q0MUwwZzB2UG1pbTRUNmVEblJ5RWlTT1A5RE9pZGxDdDZtamFseS9uZC9vbXJaM1FKTDRubmw5WFB1VjlXK2Y3Nmw1dWNxcWNxbjc4U0J2U1JodkxqeW5yU3VidjJUa0VkdmdnTlpIeFdMM1BuOVhjYXFET0F0UVNYVmd0VURwRG1lTVRJOE9ERExVM2ZTOGtKbEMxZEFtUVVlWUJhcWZTM3RDWi9DRHZudXExeHc1aHkvU0t0L2FaKzd1NDlQcDFwVXhDMFYybkxaYXRGSm9wZk9BcXVWbnpqTWVSVlUvR21oQWZ1cGtvcWQvMW1SZ0F0WmZmNFo0Y2M2dFdjN0NwRndLSHFvdzJ2WDhJVjB0OC83THprUC9IYVB5UjlFRzNmMDU0anZZS3dwYWczTHM4dU9jNnZKYUpxd3pOSWI5bE9zT0lXZXN3aVJIMlpjUExnZWhUbk02OWRMZE5NVTlvQzRaZFExTW9oVnBncmZqSE1sSm1kN3pDSVc0a1JuSVVGclg2VE9vUnA1L2t2V2tWVytmRUNRckZrRENPUyszS1YzSjJOZzVlV0E1QmJ0TzA1ODhIZDNyQjFLcEdha2tKMDY5aXAwaTFERGFNc3MvM3lEdHE5ZHl5czIxWDRiTlZRQnBTMlZicjkxOHNDUWNZK2FjY3V6ZEYwSFhtc0FIcjc4TGxEUHpKNmQrcHdENEtueG5WUGsvMk9TSUx1RU5FcC9uaUt4L09DeUxLK0RwdDZrbDZPbjd0eGZPdm5Bc3duMS9RS0JZRzBWeVphWXBFaDVlUkJXUDdMbFRFaU5YTkdjcGo3RE56SGlaWlhRNWk4WGRQT1NWRnBTRG5tcGZJMVh6VmJPQklEMGV4YUtjRTJML0RPU3NwL3dOeTl3Sy9lZ3BZa0x3cGI2d2xPVWdqVmxGcUlDQWcreStjMnhnMmZsYzB4bngwRi93UTR0Z3ZLc1ZNalpJYk9qb3N3NmxkR1gvR3RKdmZodkhLWXMvS0g2RG4vQzFkSDB6Y3VOaFdtMHFJZERkU25JaUdBdjByZU5OTTREcUNmQmdyU2FZci9BbUlHZmo5dmhGOUM4WXpPdzhsM09ZNkRuVmVXRlRpZi9aQUFFQUdnQkFBQUU1QUVBQUR3RUlPUUlBQUFBQUFSOEJza0FBQWdBSkFnRUJDZ0lBQXdBWlZHaHBjeUJwY3lCdlppQkdhVzVuWlhJZ0tEZ3A8L0JEQj4KICAgIDwvQklSPgogICAgPEJJUj4KICAgICAgICA8VmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9WZXJzaW9uPgogICAgICAgIDxDQkVGRlZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvQ0JFRkZWZXJzaW9uPgogICAgICAgIDxCSVJJbmZvPgogICAgICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk+CiAgICAgICAgPC9CSVJJbmZvPgogICAgICAgIDxCREJJbmZvPgogICAgICAgICAgICA8Rm9ybWF0PgogICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5Nb3NpcDwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPFR5cGU+NzwvVHlwZT4KICAgICAgICAgICAgPC9Gb3JtYXQ+CiAgICAgICAgICAgIDxDcmVhdGlvbkRhdGU+MjAyMC0wMS0wN1QwMjozODo1Mi42NzFaPC9DcmVhdGlvbkRhdGU+CiAgICAgICAgICAgIDxUeXBlPkZpbmdlcjwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU+TGVmdCBJbmRleEZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw+CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk+CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU+CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT42MDwvU2NvcmU+CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8+CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBWUhiQUFFQkFRQUJnY3NINWd3Y0RCNFBBOUFBQUFBQUFBRTVBRUFBRHdJQVFBSUFRQUlIQUFFQjlBSDBBZlFCOUFnRkhRRVlBY0FBQVlGYUFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCd0FBQUFSZ0FBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUVZQUFBQndBQUFBQUFBQUFBQUFBQUJHQUFBQWNBQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBR0FZZ0FCLzVQZkV2QVVPNjhJZE5rMmtDMVduUW5pOS9Ga09aQ1NzTVJBK011MUxYWHAwNVhFSysvaUtaSkpHTXZ4L0k5SktOUkZLWURVQU0zWDdiV2x0a0VuZ09JQXVaRTVhcGs2cnIzTGlPdDhtRTZtR2d0Y1hDcUE4U0FqNkg3UVRLK3ZGWW5yemY4bHJKREh1UG44Q0FBTE5xSTFBSm5pRzRMVWlqQnI2THRubHNOVXBPdCtPWGRIREx3ZWJnLy9BOFpzWndCRGtwcVRJRDI1M3lSaExCeG1KcStvcFNicGxCVFFnTTFiYThia2dOVXBwOTFQcWE4NCs1Q3ZBNmVWbTdtRzlhaDkvYTBoNThhRnVVQzdURThFV3FMQ3V0RXZQY2NkaHFXZjhwNG5xRUNsREx2eFR6ZnlCemRyWC9TZFdVbmUzVG1IeGsxSDdNb1l6ZHhROVpOV2VJR1QzeGNDemhrUzVlZmhjNkdYZmFrd2orUGhZUmUyNWs5b2haenhnTXllbzhVSVdTbDNLcE00czFpM3JxYTZzRXBJS2RQa1ZGTythSWR5eUlzY1JINVM2ZDMxby9nYm5HeXV1MTNhcWhOTmdRTDhabDhacDh5Q0pDeHJsM293TnBwYTdEQllJV2FTcXVmZ0x0WjFJUkFlSmp0M0V2aXNrNnNlL0VUTGpkSlErTmgrZ1ZIRVZRSUZVYVpHSW9oYjZkUzVUekVaQnIzMFgyaElRSW1wcTYwd1JEcXBPWFgvTU9FT1NjNHYzdGJUWXJIbWIwYWpGNlQ3am9jbUpwcXpKOGtpSHNDTXcvdUxRWnlyK3NUK0FrenJ2T0J4VnY4TnRBMWcvMzUzTU5yR3VySmZSZTBzUzdCRWcrZkhqNkNhTnBqUW52WUp6RjRKZW1GOElWNHF6czZUVUM4VjU3bjlodC8wN2N0RHZ6YUthdUNaSVA5NjZwdHFHQzhuVml6NGFPSVg5WFdjTTg2ckYxU2d5MjR2aTA4ZVZyd1JmclhQem1OaXQzRHprajRkR3FqN2lQRjZVV2NVR3E5ZDVaVDJlUnVBOEQ3NVM1dFlWL3JpUkhrNUV3dG0wdkp6cTk1MlcrV2xJQmdUUlB4Z3RjQXpmOVJxaVRURW0xOGtyQmNYcTR4UWFyQ1ZCVEZDV1BVa2l5RG5yZmNvWmsrRDgzR0dPV3A4bGtYTC8yTUVIUnlvdVpjd3UzUmw2L0NvUmxKNDlOc1ZTTGRadkRQWmdjbFNHcVJPU2I4Nm9rY0Q0dGs3V05ISENIZXVsOEtZdmZINUJXeDg0QU9OdzZXWDFwVnllQ1FzN0JhZnNiVXA1cU1GSndTNkZSWXlia2xKRnZ4ZUhONC9ISm84T3VaVGorcTNuTjI4SFJCZkRiNUhHNlUvVklKRml3bWxmcUpMNmRZcFFZa1ZnTmJTeXN5d3pBdDI4cmF5NHZ1emtYb2w1ZndDdlN6TmNjNTFOWFE2M0R3UkFxU3FjdjJ2L3BqTGZWb0RwaGdzbFJoSzA0b0hLeEhmZ1ZDZVJwdWNQdmE2U2s0Tm5IdnpMclJZM3MxaFc0VkFleGlwNDJNR0I4eGxER2VveEtwbFo4dmhYSjJWY29aQW5wTzR0U3dFZlpMcEtiUXJabUR0K1BnclFyTjlpV25HVVFldEVrdEhYMFQ3QUNtZ0JvYWg4ekJUMGs5YU1TZk5yK0U0MWhTRDUyeUQ5MUpvbjYyeTNEQWFXVWZWeXJJeVVsQnJ0ZjNkMm1xNGZaL3dLejNqYkttTnhLRGFXSUJOdTFhcld2Y1BldzBrTHpQZDRHMHlmV1V4NVdCMVlQeW9WOHlOZlFwUVVtN3NPejg1ajdXZ2w2SjdYU1JQNk9IWTZ3cjlKL0luckpab0Uxb0Q2TDQ0Qm9TRllUemJ3R1hFNTNVTEt0MVpUM3pjaStqdVVDbis0NjhJaXNYbEhyUW5CTnk1OExCeHB3YmV3aVJDazNaR2ZWTzh4OG01bnBPOHVhTUhPc1YybmV6cjgwejFyVDlDazBZRkNTWWdpaUVTK0dOc21EUmV6QWtpVUc5bFNQUWJ6V0U1bUU2cmpLM0FWSjFMMnZiVU92T3puSXV0YjNoSWtLU0Z4MUh1TE4zUGV1K24vV2RVVEpUdjA0elVqK0ZpODRkVHFaSjh1OFpDS3ViZmgvZi9LRC9MQVpUeWhtajR2RU9JU29qOTU2WUsvZ0J3UDBJM05XVzA4QU80VjUySDRMdWliQ3g4LzFYTytlWjYvM1hOdGd0ZlRDS0R4SDhMd3BqODFBdHpvbUFuREZKbTYwcDhJeitWUlI1eVBJc1lPaWNHNGx1UVVSU1dUZ1M5aDdHekVpekVranovQ0d4S1RIcGtyM1NneXo4amFlQ0M2aFVuenl6MUtoL0g5Ri9KVGN1RTlsSjgremJySmNQZzNSZGFsWXlHTjJUNUp1Yjl5ODBMMkQ2d0xuVUwxbnFjb2R3OW1kZk1LM2N1NHNnNDlsS0RtZkhrc29rQ01nMUp4Z0RjQ1NzcktzSGpGSnk0cE9QM1dtQTVHdFFrRDNOTzd6VzJ5cWJ6L0ZhSExQZE9WUkJTMzViMzNkbm5OR1NLZ1YveGl4OVJpTTZnRDNWZFZyek9vNWxSVmNXMjFSVHNhQ2p1ZEhFVnhZaFZlR2s1N0g5R0lRQ3d1ZXJZMCtvYXNra081dkJJZDgvbmQzSTRuQjMvUnVEMktub25nV0MxcXRwUjJjUjJ2ZUdpUlJxZSt4eVhFcjJCU1BzVDB0Wk5zbkcvQU1Ka0JheGJxSkdhbktmbWh0aTh0dGVVZmtiUHQzUlVzTW9GTVRNekxsdVhFZFExYndheDhXTTNPd3pKcmVkL0pPNXRsM21wTDNmOXZjQi9tYjdtK0ZUcE91Vm05eDlpVTVjYkJjb240SG1aaWJTY2RROGcvU0hWbnNsL0dNeHhRMXhvdG04UEF6aWlXcWxEdDNtNG5ocis0dXBuRnRWbjBLemJhZ3ZrMEJReU1UMTJIc0RHVGl6UDJMZXI2QnRwVnlacVh3NTMyMVhqU0hjRU11SGE3NmpiRWpUR2lJT01XdUNIZUkvbmJKcE5jQWJKSEJLSEI0OHZVd1BuK2pPV2tTdVBlRDdXS3ROc0Nzcjh5eFZKUk9rUEtWYnI0VUNROXJ1VUlMWjFpSC80TzlWWlZuZkRrWUxCeW9Rc2orRk1XS2ZBakttNGdpV3p4b1dCYUZUWlRVVDJqODlmbkpQdk1xRi9VZEpkeE85alpDWE5YOHNBd0ZvRFNySzV3MzhiL3l0YU9tRVp3dlhteDVRT1MyUHVSNEdLa0IycHdnb0w2Y1BQMnhZT0c1bkJsVFE3Smx5SS9zVDBIcEVLVm0yV2FKTXB4M041ZWF4c3h2YWFpU3VBeTlUbDlEaWNIYUtndWJvcTY3TDdQRUJwZkI1Y3VaSDdhdHFrZU1aNUhHQ3NMSG1WSTQvREpQV3FMd1hTcTBTWDJHeGpvbmFKRWN4bXVraWptT1hCN29NOElFV2dUM0h2ZGs1MGFiNXBmUVhDUEpwTWYxUURWa2JSOTJvRm1LSDY3TmFLd09kWHdnSDVKcFZUdnBkdUkxZmtkTFU5amY4N2lEWnFUK1dMMUduZ3JCTmxIVk1SemJEUG9NTFFRYzlRZ0tGZmdPZFQ1NmZvNDlXNW9EdUc2S2RBTVhrRzQ3YmxXdUZienR0bnRzdHBZTy9aUnBLby8wN3lxY3F4cXZybkhRWkVaREJKYUdKdmJJV0U1UlpMZE0xeVR1YVpnWHN5MGJrSnlTMlNzcExzUUZic2JlYWNtNTdpbDdjQjEyeElKNVZ5Wm1qQVlickRMTWU5UFd4bnpKN0QvajVTc1p4Z2RXemJEaW5jamdEWlFZYk5rbGNsQVBYckEzK2pieHZWZlRXZXpibHRndmJYVkVPUVNDdElZUk0vNVlLTUlGN3VqVmdaN0Jrd29aK2tObk11REVTdXk5SkY1TUtNdmduaXFFM216dmRvRnlhUjRPclhWczdKTXRWWWZBN0JnN1FIOWpHR1FmS1JHSUFsZndrd0dKcjIwWkFLQm5jTUJCTUtGb3dhMDdxSzlVQXNhMGgyQ2xQdlBQZVVXNHNuNnZydkFOVWdoZk9XMFJPZXpoYlNwUkN6RlRSNFlUMjF1OU5vZ2JRaFdQUS83ZnBiZjhaQ3dBMHZ1SzV3K0lmTjZ4Y3JRa3k1YkxHVlRPcnVRNktkUGRLM2N1dlhiRzhDWnBUVWdjL2tqcFZ6Q2xXWndDZUF2eUxyL1NvRVBHSUFKWDduUGFnU0hOYnkzZ0JNcXVOWmRiME9WRGdGdngvUGJKMi8vbkxrbDhSUjNobTFPQjRRSlovRUNiY3BoSVRPeG9XK1lsajlXSDhmREUvYkJvQzcrOTlxdzhvU3p6ekFBY3NEUGQvd29RbVBQOVhDREozQzdIZmdNcCtiK21iK1hvNk9BUFlWb3diT3dzSUsveWJpbmhHcW9Cc1hsR25VUnBjSVNQbkRBTlFSeXpuU3F6VEhNRHNHdFdaWERkVGpBUXIyRU1GUTRPbDZnNjQydDcvK0pRWmtMUmlOTGRJVnVTVjJFNWlqeWo4b2lpMWZDWHJNV1M0WnI2ck1zV2Y4MTQzc0Q0UytJaXhFSklobVVMb1Jpd1RLcGhCa1NtUVFoY1ljN3A4a2ttNExYTGdzVWlxWmtNL1JCMVZid0U1UkhpM3NiOFZXL1ZOQVNBdkRqdFRJWktRbVFaTXVJL2hNUXp2enppSjhnWEdrZ2xhWkJJeHNRS1VubUh2c0ovYk1kb1A1YXQvcHVDd3M3NjNwKy9YOHE4UDd5MlBocHFOellHT0lWU2pTemJlY3VuT1h2WFowMmpJbWw1R2tsYTBYQUJpMVlncitSZVhPWTJxY3BvOGxMSURWbEpianhKVmp6OXVydTZjREtrRk9FK2s2VEF0Q08zaEVVek9NM0ZscEJ0bE1zaFlxMitnUVVyeHZSbHpqK0Vyb1N4NDRNaUppWG5uckhzM2xSemVaaExnZlpBRWtFSTBKc2ZBc093dFprSEdPM0tUaWhyQm5PQTNnL2RIVGZnVWUvTWZrUkVqVW5iUkNUQ1V4UzdEL1NJcTR4QVBvN2lDT0s2QzdFUndnbjV1K240K0syWTRrdGZXRHdEUk9XZnZoTE5kTUZ1UzRTcjhIMzczZElpUE80T3k4bW9WS09POFEvaVA2cGh5dkJocSt5Z2p1ZnRReE5vYXh2clVpbW5UeDh0aVRCdmVtVS9qVFcvOVhRM28wbzhRSis2TVo5c3E2L2FxRExaOXZTNy9RTCtvMG94aWsyS1loK3dwSk9FMTQ1Z2dXbWZGSjYwS0pWVkUwQUh2REpJeHR5RmRJMmdoYUJNcnBHVVgvWEttQXZiZUw3TnNyWmxwejU0bUpWNmswR2pDZGVZRkJIQ2ZRSUpid1ZLa1U2L2VLSW9RWVJoajBwWHJzcm1qdTBlM0FUVWNPZmFKenJDS2FYTHE2WkVpR2ZOcm1CdVZISGgrQzZvYTBXQ1dJa3loclV2aEpKNXJYakN6VDJhV0tRVDZoc2V1aWV2U1pKSUtuUWVwMXlWNWlIZEVpK1N3NmdJQ2RtQVFWZG44VmRuMGNGOFBIMUp5R3AzTGNmTzZBVlN1cWl6b2lhdzhUaXplenZIUUZkN0JtT1U3dG1ETHVYRkZGVjFFa1NiYUZMOEFaMFlNVFJYaCswaEZLU2JSK0NRbmwweU5FQU1lSGpoL2ZIcWhwdGdVREREOWxmT0hqNW1DQ0ZSSWNqWFd6VHpML1ozL082cUx4MEYrTi91TmRNSjI2TFdZK0t0emxpRFVkb2N0ZnpNVG92cVpWVTAxalMyeWNTYzFmZXlrQUd6Z0tybnYrSDN3eU9JMmxGNVZOSVdIcjFtNk1SbjQrOGNJekRZSFA0WXNOWUhMZ3pqZE1rNk9sckZHT1FsTHdFNTVOdVpYanl5ZkhEOTQ5SjlYVTdJUDRqS3RHeTNPVHZ4TWF5eWNUZ2YwSnNEVDRWUUtQWjZwMVV6c3FUYmNuZkFjV3d0NERXRmZTSWNoOWlGcCtreGxERis5UUtFY3J5YXRjZlg3M3JpUUU5NHNuY0MzUGk1M3R1b3p3OWtqbDVPT1h0SHRQa09xRW1XRWdWQ0R4R1o1c2lPQlFhWWNxS3c5N0toV2FBZGYxVVRzL0YySXVKUUJXNndNYUs5SHFMRXRoSnduUHg3dEZjaW5KRkJyTnlnMFIrbzBscVRZSEttSERPQkhPZG9rc2Fnd2lPblRuTFA5QmZNTzJOOC85Q2puMEtRL1d4Y0E0YTB0QzNuR1F4VmgzQWcweTlpT1lZVUpVMzB4YkUxaFBJT0hiRUE5NStMenhwbDZjS0ZBTldmNUtPbmdERTJGWmFhbHNkM0VFeHF1Z2tQbHZCV2JpdTFPcE9VTm1lQnBDRFluRnZEUDVJNlBTV3A3cnlYM29SUFdvS2NudXoyQzdUcGhadUNrcVk0VXB2alRpdzV4NnAwY2F5SkJKL1hCYVBCWng2ZFZGaThtUzAycUlzQjkvRzVWTnE1c3lkNldjOUZ4WUdvbnlvTk9VRTJLeHgzaGQ3QVV1Wm5hY0JDRDY5amM5aEVSSWs1b2lPWE9LMklXdHR5Z3lhT1UwRzFoTEQ3YzdieVdRdUFGMkVESWJDU3dPRTY0VzMyL0FLQjNVRU1DLzFQS1c1YU9rOTk4b1QrRUxjbGE4Z1dhTC95anBxb29FejVuZUU1R251emF1d2NOcjFkTmhOYzRnNkRCVXlXbHVFTGYvTHpVeVRKVFppZHA0dUdnUnNVc3N4QWxIc3NEVUZPUmgyMzgwSnBkL2FZWVlQNEEzSzBrTHBIU3lwOTQ5cGN1RU85QUVXejdna2ZHVUxqc1g5Yzg1QlhsRVdTaEJONHczNU1WWlZhYUlFNWFSTWlPZ3YzSk85QnJ6c3NPeFJSRC9QYzJmVzlieThVaXhmQ0JmMk16Z3dEdHp2YUhTR0hxM3NFVkl6UWRSclVKMXFaeTM2U2luQTlKb25IS2VEaDlZYlNYNkdxMzM1RjBCYXpNbUJnb3FIZ3dQakkzbisyR1pIVVpORkdjUmVSTk9BazVTdk1sZjVlQmVWNTR0SERWSkI3RGRwbXBMNXgrUmRDQzZWQ3Vla1lValU4VDJKOWsybnJVRlAzYVRLNkZYRXgvQTRscURyYVFlM1BkSG9YL25kanVvdit0ODQzUDl5Wmo2Vy81VUdGZURvTHgzQ0pvdWhUeUtLQWhhZHhLME1uUDVSazFIRVJkK2hPa0JNOFBpVmJZWXBnd1JwSUZRTC9SamYvbC9NVlhzT08zeW1HVm5BN3N2S2xMYUx3VEJSZTB4MWtyczhZNklEYU1UOUNmY2pyN3U3NUdsbmtld05Od2NlVzZ3Z3poU3Q1MVJZK09rYUtjbmhQWVJLeGVlOStqMk9oRjBKUHFKUUlzQ2ZoYUYxR0lmRWpQbDlBMHIvWHNnanBDYkl2eFg0OHRaTEEyZStMVTB1bEcxQWlQT0UvYll6MmJDeStZcGdxUmdKejNGd3hob0FaNWlvazd6UWVFYjZUWlFlM2lGNis4QlF6ZGZqQzlPbEZyR2w3ZDB1VEhKQ1ZxbGFhVk5Ea0doZGg1RGowTHc3d2xBOGw5bks5R1AyT0Q1UGMxbWRVQkh3MmFYd1UvekdSVmdnNDJnbHRsOHBvOXcxWGV5WXlhSGFSemhqMisvMndOL1R4bDF2TWtjMFRWdUt5YnZ3ejlYZW0xMCtDRTBLUVBERUh4c0pqZ00xdml2QUV5Y1R5Yy9TLzhOTG5VTzdVcHd0QW0xaVY3Wm5TMWw5Unl3RUV3cVU1dFB2Um5YNjJMVzBRUnBKR09Bb3g1bTRFRkV6N21Id1ZtaEgyZXZVb2VOc2hzV2ttNW52a01kSGVZekxyRjR4N3paVDdid1ZTck9QdXYweWcrdW0yWVQxWXBJa1BTVGhWd0NhaFEyYmxTVnNLZXR2NlQrVlVJSXlFcmZBSStlcDdIN0xaNkl6TlNaZ3hoVUZiOVZldGtxRlRySENnYlZuTzJhTUIrdkdsL1JsNzM5djl3TVlNNTVkcm84RSt1YUtKR1RRRkdzOEtTMUhIZHVXaE1tcEU4cVBwc29KMlQzWjkvVzdVTmd1eWQzclVyVEJPaW1ISnd5Vms1MVozR1NudkFtd3Nra040Q3hlZHQ4SFNNZUt0cmh0L08zYnRPOGhlMksvNFFlZ0JlcndOR01wZGpFb1NlV0lYQnZQZVBKS0lqUUQxQXZuRUFuUStaMGFMQVhSd1pJeVBxbE9kK3BlL2dnNExjRWVMcGNKNjhTR0NTYTlqbFhjdzFOaXg1TXdTT01Md0tEUzhaczIxVmJzbWpMNEJ5czZoVFZkK2c2UDFNcHBTV3hhUUw1SnBsZzlOSVI3YmhLVmtWdUtzTVhJekcwVDhkUEJMYVBvRG13ZjB5cDgvR0FBWEdCWTJncHMyQnB0STJtSVFuRTdpK1F2aU1wbXNzQXFtWmtDR0Rmd0dKVnAyZWEwRnJJaFFBUFVRM3Z0eEQ2Z0ltZXpJY2VjbERVdkc4QitFWmtrN0ExVDluNjBpZWhDN2VFMEltby8zaU02cldtMUJlekJGZlh6d2RyUlBrNlFlb1BucjZGMlNyZDI5N00vcy9pYzRNSDJGVHM4eGF3L0w1cFFkaExiNlNHUFE0cVpLbGpsOWZKOW1ETTlsQXNBMHZRMElIT0RZY0t1SXM0dndycXZiUlhyaWZ1OUhJdUUrR1gyeXlqOVVQSmhValVhOE9ORTJNNmxyamtGcjNBSDdVWng1b2NPSEpVdGVCaWh2a1VPZHREbEdMbDdscVMxRVlPdlZBeC9GWjA3RDI2bkJaY1l6aVZ3RWlqb1FSdHJqNVVOSm1CZVVGZXVHdmltMnFLSklYWllReXJUMzB2ZnNwQStHdTRPa1huRmlCYUMwTnVqK3lteit4Y0U4VDBLYmQ0dGlGcnh2ZmhMdEIxSHI5bDAzTHJIUUxvazdCRFlGQ3hRQnRPUm5UeUFqZGQzT2w2ZXo5YVhtc3FDaGdGeFJuWHBkQWZDV3hRVzM2bmdkWHBjTnM2azMrWGRwOGE3d25Ydi9tcFNrL29kaUN2WEtiUUFFYndNQllUd3Y1b3Y2N2I0UWY0b25vMnRKeDkyRVUwaDlPcnR6YjRQZCt2L2o5R05WSklsL2RUSm13OWRUeUJXdzdOdGRuYzQ3VXhMbVVpbWpCb21jQWp1Y1ZhYjdQRWtzN0JFUktBZ3lmMm1XL2h0endNKzlIN1Bsc1FTZW5QQkYzUW5PV3FRQmZLSWFibEJxN085d040MFREQjJmRytFMnlISDgyMWI0bnIvVEdWSC94aFpSWmErNHYxMGV4dktvYnZieXlnc1FPbmRhSWI4NTUwRXRLdVZiQi9pRFhKcFBLZlc1WmRJb0ZYa3paZDdYZGdnNmRadHpDazgwTitJMHNUQUl0TXo0Y09PQkFNYkF2bDFWaXo4RHBXOCsvNDFHUnFKeXR2L1BXRVg4bEtkZUVFVjhLNTJTZ21ZTDBzenc5L0R0OFpFQ1pXdExmaVhiQzROb0FldFdad2xUQ2IraHVHVml0VlN3LzcyTTdPNnRrdVlGOUtldnFjNHdxRk1UR0pheDhKRWhIUFd6RlNXb2kxQ1JYSEw1WFhRa3U1QkxXT1pralkzZGowbHV1amFiZlo3enJDNW1LUUlraHJEMW9yWmo2M3J6ZUJwK0ovT29vdXZUM25SMVd1T2hucEh6MFg3ZWJLbHNvb2NGalprUWZqRWRzanRQbk1NTkdrYXpzbGFqSEZFSmc1YmM5WXg4dTVlMXhUWEF3M1ZLWU5MWG9MZldSSUVxeThjUEdOallYTkFxS2xCTWhmMTBtVWtJb1dsVXJMWmh1SU8yN3FJYXBMUVN5eWxwOTFPUEtpOW9IckhOQm5BemN1bTdzZ3lsZmN1RlZrVU5kN2g0V2N1STVhVkdBRlVFS3ZSSU12cUdTNlpadlJkQTMwa3pCRjM1bThHKzdWNWhBRjlrN3ZKb2hDTE1FVXVSSXBiaFN6SHU4V0FWNlQ4M3M3S2pBTWVtZUh1am1CZUtLWXZzcGxDdC9JUTQyZzlQbjFZUGROaTNQVFNYTGRRZXFSdU5UVVFwUHhXcjN0YnhZMW91NGNUZzltV0FHNHp0Wkp1YlR5dVZ3a01FTm8vd1FVUmZ6QWdaS3lrMHJyeEhEZjQrK0lLVGRDMDJMN0dmWkYyYUJ5Vkd4Tm5MczZoODNhdFMrRjJUZHJzd0lBZkRkeGZEQTFBWWtubGF5M0tEOWhhZ3RMTFg3d2tuZnFSR1NSbm42cTZVNWhrV2FXK0U5ME5vQVJ6NUtzMEJvM1FVaFc2MjVpVzBOQ2NmVUtIcWI3TFVSSnRYZlRRTUtheG1mK0VDWDZBdDM2NnREYTJHR3NCUy9nc1BuVkE4RkVSeExQQTN6aXI3R3NkcVRkUXVudzhncUZhdWhoUWhRa2RpVmd2MUNGN25QQnVFSTQySWRpa2tFSFNvU28rRENoODNJZXhOMVlyZGhXQWVBTWNZWFZyRlJmRjBLSHh1ZzQ2RFU4Vno5Wmw5K3dOc0dVenkxbk9XcHhUUmZTTlF3ZXRKY3AwV1FUbTR5WXpjVkdZbTZLdGhtYVMxNWQ2Ym9LcWQ3WEs3WGt1YVFsOVQzbHg4Y3pMMWFQRG9RSnlkVXhNRDRNSGhsb1YxWm5UT21WMW5zZTE0WFZiayt3Mnl1VUZxeldmZndNeXFwbTJOVm1BV0ZMakRHN3AvdU5lakQ5L1k4SEZIdW1nN0dEUUg5NUZYTzB5amFSTGlvVlBDNEViYTNHR0dqOGl4b3dmWGg5RWhxS1cvZWgrb0s0UWJWblhjYU5JdHRZZWZWRlZnVFJTV3Evend4YjQ3VlpWdXc2cDVoSHBqMUJSMlIyYnk5U3pyaVBWeXZjbytqNUdmOEc3bjNibGhXN3FjM0l0Si9Dc1dHTkpqbHdlZ0ZLbWlwdVh2bTBDYjVmYW9qYUVUUXBqcVkxTlpGVnJ0Nm4xVnFuOTJ4ZlppTVlmeWNSYWVPbk55c0FxRTI2L1NYcHhaY2FTRDlhdVVYcExBNS9MRXlzanFzSXZZSlRjV2FLbHFGSyswd0RQVjJabnJid2VwZGhRMWdCTVI1dGI4NXA1OXE0OVNYRXIzTWxvMzVWU3lBendKYkhlMEJvU3RRTUIyRW1jZnRUUTE3N1ZoK3Y0Tk1Qd0taVWU0N3JTSlNTTFhPdGwwTnd0azN1dTVGdGM1UWNxRkZTdWFIRUNLOFRWb2JlWHRiK04rcWpMM1dib3BKRDAzZHhZeWo0RVNtcVVlS3dKVXN6KzVrQ3p5RHNBM3lFYkpLdTg2bW5DZ0JYbFFrQ2o2M1RHMEdkVjgzSS9aL3lZS3VERUlabXVZQ2dkM01tMkh4WmFMYmNmRmg3YlNNZzZ3alJzWG1qYnVJdmlMWWdsVGhJQm85SjAwQkhrUlZ5M1Jmb25YUWYzSjFWbWc4Y3NWaUljdWdrbUtuUFVLMVhZN1hyUkpHYVByRGxwY2hDaTFxTGpZUERlMmtTb2VQOUcvTkFLT2ZpamtVUjRPUC9iTjFmVUx6a3QzdEFleHE1YVBpbitPSG1HcjJJMFpUQ1Q0TnNJcXVmTFl0TTZuWTZQNnpRTWVDYm1INDRnVzNaazBnYm5MbXpqY3k2WlUzZmswaUlXRTJnNnV6UHNhbEtUdHp5QzZtK2tNVHJQZHpqV0ovUTJibkdSQ1pVaVA3WmdVMU5rUStpU0phYitkRG9FWVFieFFwL1pzU0ltM3YwbHhLWTg2MytpNzV2Y0dDZ0lqRUJxSGNvRFF6UGd1bzhMTWNHVEUzY2YzZDRvaXF1dzI2S1lpc1VmV3hOZFY2dDEwdFNMcXdteFgrMXJXK1U3azExdkhrbFBJNE5jTWgrSkxXNGFZdUp3QWhIMXYxMmtkSVU3c1hERm5mTEZJMVU2dTlGYjNMaG43VHY0Mm1Mc0t1V3BXRXQwd3hCeW1qek9WSlZXUmx1OWtHZzlxWjkydGNLbWluTFkvUTJiTUVOR0tTTDhCbEk2bHBDV2x3QzBPS3h2VFE2eTVpdHlIL21iZXg5Yk5Bb29KMkJvaURnQzF3WllaQ2NleTNPYytiYVViR1Y3eTdIRU9NTFQwNitReDVWVFIwNUhXSkZpRm5DSTlEQ3U4MGtTL243UW1RbVhNNTBVZDJhVy9uVUdjU2svd295OWNvU2lEQzhDSUxIVGQ3NWNudGcxbjduTXM2UW12WjVvUEszYlpPbEVkd1RqQWZaRE1aWDMvZjFMR0kzR1dEMmhoNVQzZXJicEhoc2FBbzErWUlsUjQyR3lGb2NVZWV1TURjWk9lVkRMNW4vWTZTb2xDcFo1N2lMUHV3U1liQm1pWWcwcVJCOXVUREU0SG0rYUVxc3NBVGlBZExqaFdaYVpPa09pdHpDbmJvMUg5SVhhMlYyR2UyZ1NNMmpicExsWkVEK0JFaHg0MGVEQzZ4RUJ0YWtSRzcwM3gyNGxxVEozc1g3dVFtd0NLTDhVNGNlaFJ0ckRoYlduTkFXTzE0a2lsRlg4TVkxV1Jzdk1ENWtXU2ZidlZMak1YOXFKelUyelZVMnFHNk9xMGdKeG1PeEFlZ3E2YVZjdHhrUWp4MVd2RnFFOGdoWk9iZmZ4MVFtMTMrRmMrYWdFaFoxQ0hpbytRbmozbnZ6MzBXUUhmSHhzaVVNUlBNWC91N3owM014WlNLcnZCVGxJZ1M0OFJpdkJqR1Y2TnlaUVd3Qmt3aVhRV3dTYU9vOFV3U1BTSDkybDloeFJSZEJ0bnNZSWRLc2lXOVVsakZxZ1IrVjN6elZiTnIyR1JFbWkzWlBmT1FtbWFla1o5ejhLS2EwM0dXbjdZQzJ4Q3N3TWhybmtvMmJUUnBMMlA2U2h1TFhQU2poMDduNzBXbDJscXF6RWN2YmpwNGQxSUN1b2xnS2I1SWs1eEF0TmJRbFFJSVlxbm9FMnR5MmIraHhNRnB1RGN6RFhkZG9uamxaKzJjTkhhS1F4cGJOT094WjhaZC9BRjVlOTMvdDZFdzNMd0hWd1ljWGJzS2NmdlVMUUtidmYxOEVlWG55SlA1eEcwNHA4UzNiSkdSQ0tNRUNmeXIvU3c3WnhWUkVSMFRPSkRuTGkyWTVzTysvTHRBL0VlMk5nMkFLazgrUHVDWmxyZkFJbmgzVkI4ZjBaR2UxVVBrbWZHY2NsbmE5M2hqazhUWDZ3R21idTI0YTRFb2FsaHdiYUNDZEdHQWhGaGF2eHBsb0sxeG9sMWdKbDdpbktURzByeHF1dzVFbU1nTFZIdGpmRzFaZXRuOXJUc1R4Z2tzZXYrb1U2OXF3dEJ6RUVNd2EybVZsZmtOOExQOGx6clowMWl3Zks5OUxVb0JQazJQcFZqdGhmMGF4ZVVML2JSY1lReGdhOGZqaVRBZVJEcU9HK1NMUlFaNVJ5MXZRaEFKTGNBUncyei9DYXdJdjljQjI0SitUSWRDWVZMVE96WTYvb3RzOHFQN24xRlJyY2dPOFlnUjRQUkd3Mm5SQWZCaWhxTUt1Q29aN0tWcE05VnRMRVBubnVaK3dvREdTd1dZdG82Rnowc3JqVTc0WTRRN2MvUU9xdkpNWElybGd3TXN3UGFuNVlmc0pzakRNVnhvWm85UlI3SDJqRmF6RjVHeXdqVDJ5NHMwSnRObEFyZGJZTXFZZ1VLcHpPT0dBZ0lDQTV2cGtBT0RranhQWkV2WGlZUXZqREhxTDVqRVEraTBicTh6KzRRQjk5YnZDTFFUUmpuTjNJQ0gvYW9CVld1ZVpZSU5vZ3F1MGc2UmxjcUJTR0tleWJ5OVN2Ny94cUhIcEc4c2NlRjdrcEI0dlJKdzY4b3N0Um15aVZiL0NscExPYm1OVUVMd3htdUpQRlEraXh5eTFqelFtNmxnQWFBUWxwdkNZeG13RmxsVUIxU2t3a2FLRmZybWg5TUJ2cVFwd3FoYWdwb3pwZitWMlhvSGR5WnU0WjU5bjI5cEFKSHRDWEdZV1RLQjNDRDgrMkEvY1NKbmdMeDRRYUI1NklHVHVzakhiQ0pvSkMwNW1STXB6eEZ3OTJZSitBMkplMEV1ZlFwSmhOYjZVQmNNTUhwYXZiTHFackVNZHhkVURaWjVuSEJQTUVoSGdXSTFXWHVXeENGRGxHc0pHMEVSYkFBb1l2T2hFNk8vUEZZbnBRQVlPd1kwMWNwUk83RC81RVdpbEIyNlJrK3hrSWZraGM3V3V0OGM1dWdvV0lkWXZDaUJ6czhndmJLT3RWbURYVDc1Qkw1MnAxSVd4bzNDTVFnZFhwQkpmSDFybVhOUEJNVEg2bjRNcEhXeVNMc2J0ZXZLMTdxQUxpQTg0ZjZmSGM0UEhNVDYydzVBVzFadGNlcXlGRlpNSVhyMGRwdkJGRlp2ZDU1amN1alBoeXlSWEFlTDQ5bkMrNkNpcTNMZFJtOGRLeHhnSmVhTzZCbWNQZDdjQ1dTbzlBSkpYejBnazE4SkpwMEd0R0FWNGJXQmRKNnoxdVRITVVua3U1Uy9CU2tIVmZUeGZlc3RoN3VsL1Jwa28wNENobktPNnNySU12MlFqcHFUM0ZVZERTYVVkZE5wM1NCRnQveFJIeGZPdmlMczBRSCtkUFJ3UWxST09lRDFmNjFjT3E3OXIzWE1KeS9JK1JDNjBIZmVlajA3a1dIb1lxZHN0N0Q2Sk4wT2MvcDRsWVYwT3NsOTB5T25OblpjWGFjR3p4djluNjl6RXN3VjV1SFFJQXUxdlFvMUN5TnVXaUF0SkJTZmxaV2crcTlMNTZzeHpEbHlkdURaNkdsaVZVVC9FMk9IU3Fld0FwNldQajZyVTlYQnUxQjhMUWlja1Q3T2ZEMWhPRnA0Mm4wcGVjcG0vczZXTGlZV0ZQamxSWjl1ZDFNUVE1QnU4RlF4QnpocTF5ZW1rN0hQeTFKT2ZhODJabm96NVpsWDJrSTVvYk9hZk5KdzBpVUoxQXNnZWMwVHlEbkNvQ2t0Smk2YktkQjBMSWhyRWhCaGc0Lzl0SmxMcXNsWEt5KzFnVXVabUFnaDFxZ3loVkJycWkvQWYzaVBNeFlXeURPRTdqckV1b3BHNVBPR1QvcFNvdGxCZjh1dlczRlF4V3E5eVVEWG5PWUZjMzhjRTFqS0xsU1Ryc205TlJiUWtQQUNNd3RCbzhKc3pOOGJDVDc1bjBadytPbmpOMnJ4MHRwWkpNYitjT1JhQXdvM0NVTWtqWGxuOW9SaFFFYzZwL3duU05wc3Y5cktpbHNBVzkxYjVjZnplZ2tvL3NVMVpzSnZmQ21QbnBqWDVBY0I1dG9kNC9RUFNvdmMvcVBublZyU1k1Ukc2ZTIvTEVUZEx6cWVOR3FNMjJPZDdYclJRU1BCRm1CNWZGdHoralJ0ZDVEd2RXY0pUYk9TQUc2aFBNSjVYd3A3Z0l3czd4L00zMzA4dmpGaFFFRWViM1E2c2ZWR1BTTzkyeE4xYkpPcUlVNGcyZHhIdHVsaFl4ZzRpS0VORWNpZEI4bzUvUFpPTVI0ZElUU3prb3pRemN3MHRXTG9ha3A5eDhVUGVuN1duTzZYTUltdG1CM3IxZnFhdnhTOFBpVmN0NlhlMUl3aXlCUXpRUi9DUTdJNnVjallVU2N2c3FGdUd5aHlCNWhJdGNvbHh5NU9oZy85anJzODcyNHVGU04rV3BzYUFsL0p0RGdJVXlqYWtTTWhaYXhSUVN5a3RUeHgwOXhkVjJkOW1rVUlnb0xTRnNnWVV5bnNxa2ZWMmxEL0FzSDFPdnhxQnhTbTZmamxFaVQwMFg4VjVoS2FEdHk2Z2RvWTVZSHYycE9qWUdXMm9VbThvanpuQytFYTdVMkdzRVNXbTA5OEtvbFFLUElrTHEyajlaRnRIM1BPcHhub0paQWExTndzUHYyOFAveDBmVURlVTBSQnZGOWJ4VjJLWDRjclZwaEV1dklESlhYVVBZekRqL2pUODNWWDB0YkEyZUdabGRGaEQ5ZExMWS9QV2JucmZXK2FBbzhlZVdObTJZRE1DalpxUnllYzlxV3FtQkx3UWpYeXZsVnROa1BsR3NROUtWelJDQnlIMWxrTEhxak03M3lVR3Y4bDZCSUprVG5KRW5KU3N4a1RMbTlSdVMzMDZ0OG5iakozNE5MQkJmTHltekNZUXBoYTdkeVFuZ0RRcUV1QmF6b1AxVVBsbHB3N3pUYXNzUWJGV2h2SFI0WGN3cGdlenkwVGJUYmFTVUJNOXc3K1pqV1V5Tyt6cmN2b01RWGFPdDN4MnVGd3hJTmVlRGFiYzFqbDNwQTlONm1kSHFkNUdxUVV3dTZNNUd6UGNTb29tUzBFVGV2ellaUkEyOTRTZmF5dktNbWllTTR3SE44aWJPWWZJT2lKcjlFdUFQS1Q0clFFQ1JsKy9CZ1B1OWc0QjBQUmdQeUhVNHlsUlg3aGd6eXZaOUhlbjh3d2djK3dwczlqVUFEV2tGcGg3MUdNT2tTMG1zcFdIcUxnbzk5YnhDd2pCNVdqdG4zbUxvQjhwS1pQanZyMzh6MEhCV2hVQWRsa2ppdEcycmVEd3kwTUZib0xLc0I1cHhEUGpXSkFDMFZOMkZzV1IxNnhHREJsQk03WE91aGJZOUI1aWhwU1dyNit6VWk1bFkyZjVhWEdvdVZ0eEtlWkcwejBtZGlvN0NzbFhiZ3JqOUlsV242N0Izc3c1NVptR0RGZmZWaXZKOWEveWF0WlhzL0I2MVB3ZDFFVUM2bnYxN2ZXNlNLWmkwdndJZ2UzNloxbWx0M3JXNEZKRGYxZlk0V1g4WU9BeFRrczNjZEFmK0E3dDVRLzE0MkpKazRWaEh4aWJKZUg5czVUQTVIbmUyM20zTlltWHh6NUI3RHB2eFA2QTRoV1pRQ0NqYXVuMDRxM3ZmMGYrcVJneTdRVVZURUs1NUJjaElaYUxiS2ZZWEE5azI0enNTT2tHNjc4d0EyK3p1VjF3ZE9rckJZMEdVSEt5OXdXb3JpM1NlcjJZSlo3RlFYcm9HTzl4amJjMXk4dE5zemg5ZzZGR29ieW9ObmU3SnU0QlNkbFVzNTY2MWtTakc3MHF0dG42SmcyeEpTdXJjeDBPVXhSdU1uVTBLQysvSUM2OVgvcElxaFQ3VENPQW04TUt4dDJpaUZjVThNTHlXeGJaMHBRaEJlZlpvM2JUVEJPVENhOUFpWE40L3dnM21HTWp2Z2hacVl3TERQS1djcitCRHRhZXgxTE5zR0EvWDNWbzlOdGhNdjVGMHZTYXVUVnNkVlBjM2JQWnpkZWU3YjNFZTRGcTVrUW9ET3JaNlpGT1RpRy9DSFl1UjJlMnJLYTM4YTM4K0t2eGEvcmgzamNNaHVya1JCdFk1RVl1NWVnUS93dUpWSVRrNXpGQkxsYnJJR21ZTXRmMWltV2ZxUGpmSHMyY1ptK2Z1bEJZeUV4ME5pWEtBTktvc1lKUUI3L3ZzQ1pvdVhyTHZqaHdwc0duZXVqeGw1OGowMkJnWlRpZ256U2ZqcGJHWUNiS0J6c0pnN05jaEp5bHpyMS94VEhmcmlOajJvd0NEWGlLN0dWMzVYM3YxMlhTRHNIakxWZ2g5b29hT1RNR21iajN5RFlHVk1ZT1plNWpRMU9URkovNElhK2k1R1N5RS92bXFGZEZCV3JyQU92bVdSSEQvWndyZG5PMnpFY0JYL0dFbXBMQzRiV1ZoTUUxZmZSME94WkNXM3FPQTJIK3hTb1Noc2Z5QlFqU0phREFsUVErbzRZVHBrK2dPM29Ia1RwN2VpUWRKdW8wTlFVOXh6THJwdzJ5RDJyZVdGVUtPRWhUd2RNQmpReDdpL3RLcytMU2lkTElBYXZDclF5VVI4SWdUK0gzZ29QZldZY2wycmxKQWIzYmhnRG44bnF2a25vOVZsdHpTKzZkbVJkRmxCZUF2c3BhaXpLWDg4RlhjOVkxcld6Y2ptUWJnUmZ3S2dEM0xPcHR0MEg5ejZUajlsOXZmV01jZHNaanhEQ0FXSURFTHJwRFREMjA0d0lEWXFyR0lCb1gzcTFmbXZmVU5rME96UWU4K2wyWkppOWwvZDEzNm5Qc2ZSS0JSMmoxVzlzdy93QklRYk9OcEFIR2xqZG9HVHZ6VGRUMFNjTGlYM1JzY0dOSzZ2MWpnU09EOVo2MzVmalBiVFJQN2MxMnhaVHduVktzSjVVdGwrR09WMytaMkZBYURjMWpOQ1dtenQyRkZucloyUHYwYVZTVHRvVmx5S0h2b2RUL1h6WHdmcVc4RUxXYjJTcWJpSVFJZ1Azc0VvN1hWU0JoWnNZZXd1cUxxZ3VVNEFOR1MzTnFmZFZoMzFxY3VVTmJVRTdGcGI4RnVZSkFvSjQ1TDZJL2tpWDR1OTFJK0N1VW5PWFdhK3ViY3cvVC9hZkVadGpudHBCV1gvc0xmWG9oeWpDZ1dkOXEwMzVQUFN1dGV6WGNjaGMya1cybTUraW1FU1NnbVl5ZWNUVmJEdTNCZVIxNkNjRjdNL2ZaRTNpc1ExckJkK2pEV2RQaUVML3NRdzM5Zmx0RTFQMk1KZnJhUDFxRS9yYVAyTUQvVm5SOWllVDZpKysyMHV2dnZ2N2RYUGZmZlFERzB5Q2k5MmNmMXh4cGZweHNYL0RSTU5lNlhVU2wrcS9waG9HQVh3cXgwNVhmNS9ieHMzTUlBMVlmMzRFOTIwWXYreXNySUZmblpWNGsyQndFc0tNbXFpNDBvSVdxQnljeTlLNzJyZmtDOGtlTkkrTTFnakIzdkxKc0lKN0NkUEpuem40YTVzbmtGdXExbkZoLzdhbEp1cG1HVFlSSjVWaDdBVHVFQUFsNzhNd25DMVkzQngvSk9ReHMzcVpGVGdMQkxmQXBkOUdNaVNQZElRckxzZzZBRVZJTHVlcDNQS2tGd0p6QXFmRk9oczRvdVBvQ3hwdnhGbUgvQjF1K1hiV0FpRHNNdXhLZnlIdkxGNE8xUng0aHg2dVlyTDFRbUNPSjRFNW5IVU1UNVRqUWdqSks4eFhLait1elVTV0NlaDRXY3k2YkVBYnVHRWRqbmNZNDQ4ZU5EYWE0OThEeHhGTWRlN1pzOThvb1BUa0ZJSDY2MzFUR0VPc2VHQXkyZzNIMlBkNWJvWTEzUHI5akZHS2FPUE9QQjlnWXRPaHpCV01kWm9HUk9RWE0yMVphL3N6VzNLRDVIOHZJUlE1RHlCUTFTeEFUSHlGa0FYMjZLbnovRWhiUzY3ZFVoN0tnRi94NVp0V3paVkJubnpoSURNVWZYcSs3UWhYaDZabFJrR3pRdnRaMFRFeHVNSjdGK2NlTkZOaUMvYnVXbzkzOU1LdC8wd2pGOFh5Um9RREt1TXcxemkwVy9PbHNpaktyeGY4OUFiY3dZMkdQQk5XNXNKbU52TEhpTGRUTGlnV3dRdVBxRDhWeEJOeitlT0xzTWFldUJkZ3k4VzJLbDBLRmZQUXV0S0Fob1JwUkFqMStldkRTWVBLTU0zazRvTkFmajJCcGozc1VEdVNhdmdHNjNEMDkydDl5c05zaVFxZXMzUTYzc0IzR0VzTlZUTXdpUUhMaE9ZVmZwM1dwVGo3bi9zZWg3NlpTeXNXbkRLMmxuOGN1dm13TjUvNXFOQ0U1ZDN0ZUgzNjZOdmd4NllSNHVJei9HRHIraC8ycFBZaVRSMHZBejB6K0FCSEMzRVhVTSs4dVRuZ3hEWkVsWVNUeFJrYjNNY2dPbVlnZU5wTjhSN1NvNWlDczl2dDFxRnZYaW9ZSjV3ZzRTbk5aMDNtS0NSWXRIaTZHa250K09iZE92dGRNRDVWZ28xbWtiUmNNdjhLWHBDOG56d2U0ZGJZdklYU1FaSjIrTERDc200L3VpQ011NktoODhiMzlvZ1lkdmY2V3I5Ung3MjFBTm1KTTFyZVcxOVg2M2g3ckp1d2J0cWk0dCtnRHpIUk1CQXRSN0g5V3VEaGIyUGpQNkE5QUFvd3Z4cmY4NjJiaGhzSS9Yc2wyOGRrVGU4cCsvWXNNMnZvSGh1NlJUWUFGNzYyb0lWSkI5M3E4UXUrK0NEMGw2SkRIVnp6ZDl1YkIyTG1tV1B6WWNEYUI3UnVJT3MreUdMSWZQQnV1MElZV3Fna2lhQ1U3U29hclZLeUppSmZZQjd4K053Ym1Uc25RV0FZQVZpRU5LVnFRU1M2TWxLSTlmRmUyN3pKR3grL2pEV0dIYitrVFpzWDNXSWluRmUxV0E0TlNkeTZRZWs5Q2p3UFY5ZEFDVkdWQ25wQjBtNThwY0FZK0RoNVJmOGliUHZqdkgwSEwyZExMS2hsTTFxV2greTRlUlpRSWVhbmZTVFIwbVV3bXVkcTl5NzFScTlLTWxaajVMa3NyUWgzV2FmRitpSFllcHZ6dUsrRFVxckRvb0ZXWUFvaDJVa0NxOExkWjlNdi9VNElHa0R2Y1JVcUtYVG1lYWtLYnU4SjgyOExUQUJJbmZ0aWtNeTNJSW5yOXNJQWUxWFY0ZDBPWC9BYmt3RXZRUVlFOUIyYmVvWVp4Q2lWTHR4cHU3cFN5Tk1GTVNkdDQvUm8vb2NYTTJRRm9WL1BxVjBUL0JXaFdXNFN1b1NTd3Jkcy9JbklObHlKbFJoZ1RQemk1c3ZJNGhFNnpSNlh2UjhXSEpIT0wvaHg1VTNFVXJiNC9ZZy9LUzdxLzA5QnBNQ1NvTit2WmZiWUpzZHMrVkRJVjBRajczUFlaMzAxWGVRdGN4MVdpcHdPOHo5Uk5vaGhjdU9PbCtWcTRHOHg1L2VlU1FRYWpvSkVHNmE2OG54dUdjOExWdFFLTHJGRTVZeGthZXB2S1hvWm9iaW8xRk9zM3Q5Vk1Wdy9maXZZbmdkL2toSE9hZytsSElrcEkxaS9tMGJraUZNSWN6ZWVsaXhUd05MYzlSZ3U5aDdIZFMxa1BrdWFnUWF1cnlmOFppSkhMcERMQVhqZWRNamMzWHJsMEYreHJIRW0rU09TWDR3WnZpTEEva3Avd0U5UXFXOWxTOWVhZVBDczlMdytEWklpeTdVRjM0cTAxRDQ1OFA1L1ZrZXl3anJtZmltVWNrNXNlRjJLSkFMMFlvemU1UVdkUCtiUWNjSzZCd2JzS3FwSjZpVUZBQk9DU3RQMXliOUk3cGp4TDAyeExhclFPbzQrYVFjTVJ2alNOMDFaRURiRkFHMUhrUlppK2RUbDliUUhyb2w2UlFUbk1IM2xoUEE0NzZuUnAzZjd0Umc4OFZJQ0dpWXpzeThPOUplZUJPeHhTS0VYNE43T0V4ZFlkd0JMOUNoZnRlL0J1dHVnZ3ZCR2dxV1E2SnA2UmEyYTFBbXp0QjM3bDlpYm1DWUUwa1VwSU1OT29OcVJMS3pvUkV4MlhnMUhjd1NUZUpPaUEveFMraWVCK2gySVMranphV0kzWnZqQXNYbzEzR2JRRHBpN1Yvd2ZKQ3dJL1czOGNOdEVTdWFFV2MvaUh2UHBnY055RnBUN1hmQXlhM3FOY2RHRlorZm5TWitpNk5rSWhlV2FmcHFiMnBpSi83eXBSRWxBdnBta0x2dkpEcXRQSzRLa3ZqZFR6LzF1UHIwSTN0TlBYcFVlK2V1SWZ4M2V4TFQxSklpN3Z0dzdQbHJlT1hwRk1hNkhKN2ZpbWpDeUlqcisyYkw0M0J5ZVNjTHVhY2FMbnJSWkFIc2Y4emd6bWxnWUVVRHU5bmlFdzFpUDRtWjZyWW84UGxuVVBIWUcvRTg4K3ZvbDY1TUtkR1BOMHVVREdkMWtHN2F0M3lncDV0N2Noa1Y5TVhYV1pLVDBUZ2JyL0ZJdW9HNVZVV0RHb05tWnBQd3V5eFRpeERKK3o1Q3dwNnNKS1VUeXJ1RlFUbEZVOUJBcnBaL29BcjNTd3lEWWF5bFp4citnazdDSG1BNml3RmQ4dXVNS3pIeFFrZkh0dk5RSElZZEtLVnBmU2QwcGk4cUo1eUdlbVJVVm1YdkxUZzErZHZsYjdCeE0rSDlIb0tVcmlSZUxVSXdsZ0hiVHJ2dE9yeXNXdXZIMmNsK0ZaV1drV1ZDRzhseWEweWRoMklsK2Q3eGRqcDVXMy9VVlNValV1bDhnNXMzS2NvS3dzMjd4bTBnUElEY01ERXBSM1dNUmFKR0ZRbzZDaXgxT3JJcnUzM241dzZ2ek9jdUpFUm11MHEvVWFrRzE4L2x5bXlNQXAyT0lPMHZIVWYvcVdUTEdMNy9yRGIyMW1Sd2VPNjlDc0xzTVdhNzlaMFFBeUduaU9laVJXajFlcHV0Qmg5U05sTlZwblhUb0lWWHJHc0FMQ1ZITGw1NmJmd2Y2K0xMbUlQdW41YXBLR1BPTXgxS0h2eURiYVdaSkQ4bmMwWm1UQkNzd0xCYjVwQWY0VS9pZWJucnZVekp6TjZtSnJxTk9PNTJGRUVyUGsya2hHQm0wQXYwSWhrRjZFa21Ndit2bmRFSlo4dnhKWDNBUmtKazR1MXhPWXlmOHRRb3NJa0pOWXhTZlhxM29iOWFZOXYwb3dOR0FNdHBXejBmdzl5Y0c3Yk1GL0JBV1JIWlZyWGdDY01FWFZ2TU1reVVmQW51R2NZVmE2VVlYbHdlekdsTHJSaVZwK3J2aXlhZUNHMjU0eUR6WnEveStkZThXOU9PSEh0c1Y4Y0dpNmR4Mjd3QldEUmtvRU41TFFjWnMxelBEalNQcDRCdmJKcFVvMUdSVGNUZVhYTGs0NUliV3lwMWZlL2tVRlliemhDRWNKQXNkbXJVS3JpRE9xOEJHMTkza1pQa0ZmVHBxM0dRckxzU0JwTGJVT1FEbVUrMG1lakh5MXg5K29FNC8rRWQyRXdtb3FBSkd1RE9yMGJWTERUc0IvQ3gwdW5OSFhObGRIeG5obThOa2Y0MDJCQ3ZFekU2MWpiRHpOSFR3UmViMUkyajRJMUFrcTA4ZGNEN0xyY2d2NEIva09udmxJWWNWcHUzMU1jb2dwRmNqMnBXUjB4SlI3MzM4cnZKQ0lvdVZIUHNta0U5ZWxxbFlRdytKRng1THZMMEN5UU5KZFA3bmV5N3g1cERqVXp3dmtWVFFNZCtIM1Zub1V0Q0s0Yk0zZXlSdmw5bUNxNUxZUGV0QUNBcWhqNUxyQlNtNzQvZmtoUmx1NkFneDJJOEFBTldpSXBkY3dsT2hiOXRkeTlYSldBM1pUVDNOSkowcXBGVVZwVEx0K00zTE9GaUlha1loWks2bnlUVWhyM1pJajA0ME9ickptNWo0UzRCRFlRbmpxWFBxbEc1bGFyeE10WVAyWXVaQmRoQmhlWWRsNk1WS01WeXlZd3FNK0h5VGQxVjlscjFGTjVVWklzWWI3djJXenFRQXR4L2tYUTlzUzgzQmZYRHdkMWQyM29XWmRud3A1YmlKZGt6a25GNXNUOUhtQkh3WlRjR1F4d1N0aURxOGEycExkOGRHeUkvTEMrTDBSMnB5WEV1THRDZURxc3gyejRJZXhjYzVpOGJYRWo5OGdWMnFxVXVWWmRuZWtmK1M0dXV1eEFoMHNORy9QWUJMeGZZMmRUcHg1VldJWjVuTkZOTitvWHppSFBzWmJ2d05ndnJySWxCZWtHQmpjWWF6VEh5U0k4VVNudE5RZm1tbm9jWTRPdjh6QmQvSkQrcDk3NENHQWRmSnFzaHlSZ2RkMWh3WlhIaFp3RWdNK1NhK3BJcExDdEg0bkhuOTJLbW1CakhTclgwRjdOdmRvTVRxdmZGZ1FxeFNyVDBzWTVHWEFrNm1YaGZIUnZFdTlMblNzeWt5RlFadmpyVFVBdGVTSzFnYXNLVS9ZNmozeTRrWDFVS2ZoSzdDcTN6MW8ySUREcnVLYnZmUFl6WWVBN3JKQmZwTGVvOVdFNG4vNFV5MGdUR2F4UXAxSjZiWG9vS0Iwc1lqdWRCRWJlNWlqNkFERG9lcm9pNkxkZ29TRyt5OG5mQUJuYnR6ZzBRZnhSa2x0YXhSNDlOK0ROeW9ndjQ0YTZEMmNRZGhLbElRUUZhcEtENml4THRYb2ZGZmw1M2tFZjgrNW5VOU04R1ErQWlqS0dpN0NYY1BhTG1GbENuMlB4MVFOUTE1a29LUm9CL0E1Q3lyM3VJMFdQQWUwQ1dwaTRVQXBkZGJCbDVaTUtzUk5HVFAxQXY4SjZkOXpnRkQySjk4eFJpUHFJWk1IakpqZVMzTEpsMFlGNTRXSE9PYStUeitqTEwxTHRaRmR2c2MrRDZSaS80S3F4VklHQUI2TWJZRFRVbGpnU2J1d2pxVHFBN3Q5ZUhDbzROTlgzVWdBNkYzN1JobjdOSHZ6VjBMZzhXbGZ6bHFlc0ZvekpMd0ZRWVF5eUY0SjNuWndON2t2S1dEVGYvcndWSmJlWFpJNCt4MUErZWRKRUJQZTVHTldsbFZOb2dZL2lDMzJhQU1malI2S2gxQytFSlQzZWJRajZpdGYvQVpvR3NrZk5SdlZLTGQrZk5uYjRYb2FzNzhRbTRGTktKUWtPNi95UDc5Z3FDRjVoaEV3OSs4eE5idUdWbmNrSlNpbWJNdGZiaWNTWUJVRkdudytNQmNWazFvbTdLc2dEaDZLT01LT1hFNSt0OHNYLzNPMEZnbEcxbXBjOHIrQjdsUS9Nemg1Uisrc1prSXRGNmtqUFQrZHdtczhjU2hkV2xGeU5rRWlzZUdScmlIbEM4ekRsekNIblNEZm1Gbk5MaWVnR2t1anVTWm9iN0pvWTd4K3F3Yi9hUkRnZVNEQVcxWVpveFcxTEUvZWoyTm9ReG1UNXpUSElGY1ZyeVlHOW05azR5QXh4NUsvYlgyS3Jzak01V3BZdjBCSTI0RnJsWVprR2xUbHpYYU5QVTlmY3ZrOWNFTVRSWEptSCs1THRMaFk4UUllNmFGY3NvalZGZ25DdEdJRk5rNEZkVzFzd1VieE5vUUlWQ3cxU056OTUydysyVk1qb3kwRzVJUHF2TmlSNHlQL2Y0Q1JkYkt3OEtISDRManJBejlZT0tpVDloa3BFR2xRUXVmM2o3SjcyS2VSYTQrZ1c3T1RKTEJIQnhwSVZGWkYyK0lCZUhjKzNwWlA5VHBmYUY4QzVheHpDNVVaLzFlR2xDZTMrTTdrc01hdVFiekNvRUtDcXNpKzFnSjhoMng1VHAzNFVVV1hNdGVEbnJtTHVJaVVnV2xjZmZVUVA5K3E0c04reGxZajZicE1RcXE4Q1hoYzVZU2twdDIyTm02Y1UxbldsaEFPS0JraTVOTm9sN1JZNkNTVXRuV281UjRjNlpLU0NPbXVqZkVIemxWUytTVXFwWkVDK1FiNGoybUVwaTJ0V0ZDSXZnaWtmaDM1eXNmNlRYYjZDNlZqR2oxTExVZDdyRW5MYjZES2ZsM2NEbjJXalRHNGpDVWdDQnJMR1BKWEJjWTUrMGl5SHE3YUJ6TFVUODdEbXFuMFgyQW1Nak9Nby83cksvekhrNWRieUhZZ2EwRXNlRUl0WWdXa053Q09JOUIzZi9VcmFBVDFDVXhwMjBQNmk0TmNCQUNLcFdPUGNOeGVXOUNDc1BvZU1UTWxhS1IxTEJ0YzltZW04bUpNL3N4OEVrU3YrdGdFUDlkcy9ta2VIdTAzQzlKKzJyNmlySGhrV0JBaHQ2WmF5SU1GVXV6MDgraTVWRENZeVZoTVNVcGp4SFZZQUo2YUFGTVpjWU93eU14djNNZy9hVS9TbXo0cWx3S3A1YWxndmJDTkJqYmxDS0tuY0JLL1BDUHNlTDVsbjVFb3R5SnFZbUJHakR4cEp5TStGbE92M0RiWDJyY2NIeG9PZVhRVlZQTWJIb2E3SXB4M1ZpcW1nWUhMT2lFZ2h1UW13bjZ3bHA2bVU2bWRWdjE2cTRDYTB5R1dIL0pGTFhWSzJRWW0yNThzdUppRk9LWHIzVDI1eVU4dVpNSjVtbWh1QkN3MExjUFZBM1p4ODB4Vmc5OHJXeFlQT1dLRWlXL0NWY2dHbVB0VEExeTAxeGszcGxNTU9HOXdWT2xJNm1LempDYVFDVGxaMjFlWnZmUlpCcVVFNGRFb1JuRmxEaFZiWjNjZmdybE5MV0VVSVFFUjg0Szl2YlpqM2NPWi95L01YSXRnTVpIV0R0NjVYSmhFb29PNTFQeUt6WmEvaEIrSlJ1NFNEM3FlbDVZdEg4QXp3RVNDaW9nUFlQbXRDVU9naWs3VWNWVmd2YXd0cStaTW00M2hXS3F6KzRRUExQOHFVVG1oZjJRNmtmODA0c0VoZ1BXakdOc2lBMzFaY1hKNEhPT29tTC9hRmNZMnJYeFY0WDJHMWxNL1RNYmJwSGNNTTF3QkxpVzNhOG5rOWh1bFRDYW1KS3JzeXVTRzE3MWRNT3JNK2JPRlRZd1FDY2hsdFBRR3E4ZjUwOEtwanE2R3JRdENrbjg5QldHOHBtZlBBRW1xQkZtRTVkM2U4b3BJSGo5OXBYamFxdlNKd1QyT3d4ZHR2MG1FdmFSYlkwUGcvdEk1Q3lRL0xQSTE1SmUyczVkNHpYYi9kNkpXT2VCVVJ0V2tBck1FVDBWLzdhR3lnaWVBbkx5WUora2l1aVZVUzhxNFdHS1lGRWRzL2N0TkdTZDdKS3lRL1FZd0ZGQ01sejlYL05OdWs0WnRYSUpsR29RWVQwc0ZWQTRNTy9odjhwV1pQb0I5MG5LVnRQS0plMGxUd0ZVVWE2RzY3WkRMU3NNeGJMa1NMQkl4dEk0ZExKZVZPbVVGdEU1MjZGWG4zU0c5ejNmNkN4ZEFUU1NITGRiY1lkaE85SGhoMXU1alo5QkJwYlZlMFQ4ZzBDNzNnaWxacHU0YkkvMk1waU9wSzMraUdWckZIRnYxVm1xaDJoZlBTTGpyQWhaZ2dMR3lDWUtJTXdKejNkWUNQWWpDZVJIaW84Mll3UmZtNUZuT3IzTUdJWjlwUmwvekl1dHNuZEZ0YWs0bkNQdHlFbXNjaFdLQy9sbDFGbjBaRWxhb3dWcVJBQi9WMXJYUkM4Tk9kU0UrTGlnSWJSSnI0L0xZU21ET01hYmtOY0EwZGVCbjBJY0Q0aEN6UzZ3bGtFbm9tSnNBSk9pZjZhUUh4RDJRaXNBbGEvNDB5UFlDVHNkRVV0SEtWTG8vSW9lcUVtWHVBSldpMmU2U2Nlb1c5SHlGV3g3c1RYYWk4WW9yNU84QTVzcGgwWGxtZml3K0dpeFErV28ydkJiZWVNSlpsYVVpOVRzSHdESEx1YmpaL0FOcS9yTE9aMlhVSnpQTkEwZjkwb0R2TVBqaEFRNGxvZGpMNW5VR0FHZ3QyUmlWTkp0VVZQSVFJT0FWNG1sd0M1V0lxeWZMYUFQOWR4b3krVUM1bEhMbHlUKy9SRW54WXlBYm5aa1hwazh2dkQ5UUQrRkZiRDQ2TFZpdE1xb2pRVmFTYUp1SDNKVitEb3BQeWZGVWRBMXZXblIydGdhY0VGRjNMaVZHL1hWeHU3Y3hLaXcvTFFJRHlJSWNkeWdhS01MYUNpdXVUYkFJclNLSE9kYzZXZ1piSTNOaVJPRnJucjUydDdTcElsSEFvcHBmSVQyREl2RHZKVUpHeTZWRTIyWHlSVzlVSGVwRUk3b1dpeWs5N2FBMytlMkdFT2svUVRxRUxsNUZyRndBbHVqeWZMbVNGeU9BZHpNTlM5MC85NWh3VFJ6RWgxbHhUL3h4ZUpQb3c5WkI1MGo0QjN6aUhzSmlJRGFvVThLZjQ0YlRTc0p2bGdyS1FaQnJIMlB3MHNWNkV2UHdWR3JCZzMzTmZKZ2h1aWplSGo4VVZuMEFnZjJQVEpsMDczbW5TNGtXYjVDKy9zQ2Rxd0V6dFZYaDVIbHFkVUdwbDhmSWNhb2RnRHM5N2ZDZ0R0bFBoMGxIRzZSSmdCaVdSV0Z1RnFHZTBBa2NjZDRDem10d1Ztemh1a1dwdEZ5clBvRTJEVmRHdVJLbWlGY2VOVVhOMTI0UzhxS2lHSDFiSkJvcUlJOFQxYUpVbnNDbWdnamFkOHlhZkYrMHBHUmV6VUgwY202OFBlK011NHVzVnNEbG5GYmF1VE5rWEl6MkhDdDcyaWpqWUpmRmh6emo3ZFV0aEFnTEUva2RKMU5uK1diUEdOajZBMnN1UFg3SW1iRnBKVWVoQzNDek5tSlpNbWYvV1J6blV4cTI1bmNxRzFJejQrcmhndkhUcU1ydzJZN201TVc0UnpHdGZpODI2UlowOWRGMU9NaUdlb0ZxRjNjZFpMd2NsR0dTV0lUL0dsb01JRnJKOTMvSzVJRC9Xc3NBNFFoa3FoQnV1dk1sV3ljRXhwNU0rRkNBSThzZTFaQ3h2RW5WZm8ySFMxYndQS1lNM3F2T2JWUnBSd3Jta29rNUR3RXhsUWFRRWR6dEp6ZTVCZDhwNVcwaVhLTWc4WWZwZ0FNSFMxYzZSVXJndWt3MEg1SnJKRFF3Y1VOMWhuOTN0cmdzb2hKdTEwdTNnYXNkUkdSTHNTU20rdWNtalNNdGhTT2FSTEh2MWd2dTJXOGVpVTFwOUZGaUpLckovdk1SOEthYlVWZmg0MUF4RlpEVWd4ZGs5cGhPbkNvVE4wZ3hPQTNLOFN0VUprLzBTL3Mwc0VldHVkQlBDdzBlTkNLbkdLcHBhTlVYejUzWHk5K3VqNi9QZkNlREpucWVUUVRrV2VBNjEvaEE1M1g1akVZZmtBMHpSMm1Cb1ZvUWlMQmR6aXpaOTdHTVdrNnhrdWZsWVBUTUdiSngyd1NtbFllTXRsU0NIc2JvT1ltcXpHTHlPMTlnZFJ3NVBXREZrZ2QyQjlkS1ZiMitPWFBpaXlhRDRVV2hIdWM1SVh4OUFKTWkxWklZMnozZnEvYmZLbVo4ZlFwWmNqRk11MkdtWjVaUXhWM1UwWS92RHF2UjhmYVVOdElGUTFGYVFlRGRpSzlMM3hNWTROa2xvNnRpekUxMURFNXhvRnZnMUlnVUpBRUptSDZMb0ROZ210MS8wQURXYmYydlovSDBjaEtzWTBzZlRwMGdpcHRPK3lTMnlDcHFLd0xGVy85MUQ0Wi9uNUZqNHFVSUJpNmxvMko1UlU3YkpwaWZpSFlocm1JLzZDQ1RHSW9ZZGdGVk1rRVJOZHloNFVTM2Q4Ni9LV0NHMDNDemYvcFE3UU9adnNqWUdwSE52L1VwRm95bHJjV1paREtlZDdsbWpndkpQNlZUYWZ3NVZ0a1JsN1JEcEwyTFhCZ3BtOGs1QTB2Nk9VanJqYWVHcFJmd0FnM29NKzJWdVh6VnJxbkFXYUUyUjBQZ3QwZXpzQWlLU2FDditLL2VhVzhkaXJCRmZSSnJzb2JKN1VYNGoyOURtdzVQdDMrMTFsckVuNkYrcDA5RWxpY01tSkt1WmtXdzJyZzBZeGJOQklqWUQyV3BvZ0R1Y1FTM1p1VW1NUmd6QkRSbFF2SE1WdkllRitaMHFWRXVTTldNYjJrbllZcjRJa3lIRm9ielpTUGQyZFhyaGdoa05DUGxCYTcyMUl0cGlNaGZBd04rR25SdnBzZ1YwSmdWUkYrNVhNTHA2eThxZzVpL3h2TW94MFlodlVWODdWTXl4QmtZc3NRUXRPdTNCOWg3UGM2ZzRnN1lnZjV3OEx4T2Q2Z1h4dlM4enBXbkZwbXY0VERLbXVCS2l3ZzFzM2FzNzcxWStIb09mdzZrb1FTVWVSYkVWdklPWHNQeFllNS9nR2JSeHkxcXp2clFBOHhVU0lUVGxhNCtlWkUyaGZLTjNHK0Q0Z28zaVQzMVh0ZGxmbHJKUkxnVjdyaURXQU5UU1p2eSsvQXE2bkVsZUFrVXNUMU5Idzh6T2o5VGNNdzFodVRIU3diNm1IV3ppOE0vZ0VtQ3Q4alZmL1NSelZXSEQzQmJLQWp5VGJRTGpNSllGbmRkVzBYMEFrTGhUVTRMWmxWUktYZHRmd0xFVEVxaC9KS1BySW4xMk44N3dVMzNjVUFGTUh5UHN3cVVrMDBlZStNNUQ5cjVkQTY4YzNIZE1OZmY3OExtbTJLenB4WVFJSi9XKzBqVmREak4yZHV2dlEwR1AySkZmMUtYby9wS3dqS29zSWw2NzUrY2dlVjMxOVRtWUVhTW9NQmsxZUk3bjBHd1Y2c3NXWkI2SEhrM3V1WkxyN243VUFlbWFjNlAwZzFmQmxleHlDdkg0SytReUx0SUpVK0xsandXR0JqT1BvaElybmJTUlpGZWphRTViTWhMczI5OGxSZGdOaHh3cTZod29qbXVFakFoYUQzb1NrdERWQW9PS1k1ZDkrYVBxNVVwL0pmTEtGY0xTeXNDY05HMlJMd29naHNTeFc2aUhHc2dObVlIY0VRTFl4THJSZU14WU0rbVRQZk4yazhEU2RSSUxSM3ZCWFBGNHFZZEczTGFlLzh0b0VPbVhKd0ZGQjBNTDAwcHNWanlUdlYvOHk1Q051WFZlQnJRNjNhelprT2lQMkY1dFloWVZPZUU4QzVvcGJNdHAxSzlXVE4zbUF3RUgyaWF1NlZnQTR0R3Q5R2JyaElpSHZwbGlIeEd2aXJESWhKV0MrdUlOWnFORlMxNVA0dGVib01KcS9LMmJNa09IUWROU0hoaG95YjlUbHdldDJVeXRWbkd0eWtnNDdOR2NwMEpNSWx3Si9GRnFGOEpCYkdDcG9VdFVsMTZSOVEyem1WMWZUVWMwOCtKd3dtNm9zTFovemNXRnVuWlNRaDNEcTZSZ2RqUWlnSHFYQ2pldnNyVThRWjljWTJGWmtsK1g4R0VTRGUvTktDVE02MXhpZU9rVytxZitMbktUTk16NWxGK1E5bHdGMUw0VXFibFBacnRtaWs5cTlVZHpTa2M4R1hRRnRaUjd6UzBDd2tYbTU5S0wwcG1lVTNWQjdjbENvM01VbWN1OGpKUkZxcU4vZGZ2YnZQRnpFVk1WZUNIdDl5c0ttSGRvalprbVFhV1JuSWluYmorYUs5ZFR5TUFSNEg5Nno1MTRPdXd1bHJWUGJuS0F2TzdLRDU0ZXJkUUpEekluU0tZMjhwVTZNdTVJNC8zbk1VSU9wcURONjBDN3JHb2xzeU1zQlFlMEtDMmh6U1pGSHJLN05VdVlvVUZ1Z1JoWkxaSThDWG02cm1OSk10S1FqZHZkOHNDVU9QT1pVY0MyTVk3OVNqTGNxT2F6NFY3eWg1TnpFeEFvRDBZZUZQdmlZWXVCNjIzdEZWYVN0MkJ0WTRaalhpamNKMGFuZlYrQVpMeXM1ckEyM216Q1ZDTmN5V2hiQ1BxVU93bzJGcW5ZUlhtWEJZZG9zSEtLZGRrckZYL0dqMG1SSHBCNWpkR2pmeSszdVRScW9TTnZTbXh1cEVLUDltMTkwNVFUcWJUNmxxQkRwS3k4WTdzTFY4eDB3SEVpQUJsTTVYR2VOeUlWc0xlcW9RZU9ZOUFheG1mdnQ5Sm1NVFR4MlBpSGVzemdSc0VwOTNqR0VRYjFhMjZscUlxOFA4SkIwUmd2MmpYdFd1aGFyVmlRaE1CQ1Z3ZFJPZ3NpTTVLQ21GbFRIT1RZaVU5eVp0Y01SbGdESVQ3eFlpaU4zYkFUSDVyMkpZdjNpWlpGNG9aN3duSEtIdm1ZV1hTU3VhS1NDTExFaGNybk96OXZpaHZVRFFrUVUzNEtULzQvMFczSFZzRCtHNG1tbkZrejFwL2QvZy9oTUlXSzhzWWowR3Fma0F5MXNFUUY2enFNV3ljV2RQVkN4aWxsbS8rSWFQTmhMOGtSbTFLL2xkTnRtVHh1Q0EwcUIzS0VKQ1dEU0lBeit2UHhqMUZITzZmNTQyTUlodWxWRUdoSEhVSEd6UGd5VjBHMzBxdjNGZUlxVU1FTGR5eXd6UURqV2F0cXFEbzQzRmJwai9JNmJLVk9QeHQxQ0p5VEF5MVB1WFdMNzdLeXVLWlFjYU9nTWhEYWFTL212T1gyVi9peEZDUWFLcmUrM0Q1RVN6VFFaRWZIbzFXZjhZR3lQYU5KVW1jOWt2bmtpOFAzMFUwdzlWOVVMOThzUHR0T0x2TkFaaTkwNy8yTW1yc2ZVZDZtZUJhMm15U0VaQUYrQ1FMTk96ZEFUc09vdDBDdWpnSTFkZWVzRGpwa0Y5RnRrMmhRZ1JxYnVkeEZPdWZsUWtteC9rRHRJbDk3dUo0bXJ1bkhLR1lxQXNSWnRSY3JjTWxxNVVQbnZwcjVHTmUwQmlCVTg5M2JqSXFUQzdXUWtBcWZiSmM5WTFrcHRPZkZ4ZjVVcUhUSjJBUVpqazRQaU95a2JYcmltbm1KN0dqbHl1OE1vN0pScVh0SG1kTTVva0c3bDlUbmY1UGN6UlYrNUprODl0azhQenp0SUMwbHVqdEhHZS9FOEtPbEZpTkQzR1Z3djg5RWJvQ2hZR2hRdFMxYmoxYWdiRjdpUXRPZHpUbHRRRWcvbklMbHhYZUlFeVN6SGNsek5DeUM5b3M1LzZQMWJsOXBDT2hlSVhZbGNoZW5IWVY1L0ZFN3M4TWVpcUw4a0JySkI5M05BMXNGS3BBaDNzTjhzaWlxNlF5Tk0zTzBoU0RzRUxOS0tjeUN4TXVydWMrcStBSXhhc1p1WVg4SnBYNTluTXJxNDczUlhxdFN0VGptR1E1VWhmekRzNWJTSzVVNTdYWXRxYW5sV3ZmZmhCT0h1ZVJwNXVVOWh0M2FEN0twM1VwWEk1SnB3OXJBRFlMeEhBbitRS2htOCtIZVp3UFQwMm14ZnFiQUUyNktZMlk5OVI2M2pET3lzU1BPSjZHOGlXMDR6VHYxcVJHKzBiREdpZnRQOTlMaHhod2xLVE80Z3Z4NmViTXplanhFT1NpdlVERTNpdzBiQkJYaTNiMi9JZkd2cjhmYlZjSGcvWUZUTUU2SUF1RnJmaytvRHN1QVRTM2UvQ2JDSk1ZeTBpOXEzdTVOTmViUVpUYi9LKzV6VTZkZGtCWnpNWHozMVR6bUsyNC8wbktsMklxd2tFWFF2eXlwbmpoQzEwRVlCTENNYjZyeUVUdEV0aDhjZEVLVW91cjYyRnhKbE1xZGtFWGplZnRiYUlBSVJrSUtldXRQSmtuUHk1NnlRRGxjc3c3dTFmNzdRNUVIeEtGU3FIUW1TSTF5bmhpc1pqWXFTZTNMdzBtTVRpbUYzbWo1VDdhRkp1dUtuQVRVTm1oT1J0VktZUmIraXpTem5ZV1JrR1JGWEg3bnZ2YmZKUFc3b25UMzlxQmx5bFpkTmcySmtPYXc1cGs2OXQ2a1JxV1lYVzlnMHY1WVExTnRxY0VnMlZKRVd6NzE1ajZ4eERaMCtvN1RtWENWRllnUmhqL0tBSE1kejBhZGxBTW9VZzluaUcxWlEzMWx1SkRrRGxuSXdwYzNnSWxjQllQR3o3K1E2ZGc0WVBJc3Bzd3hDRG0vRjBhY3JMSDcrTTlUMlhub0RCWG9zNmdsakZSZnlGVVV1Y05tNzNiUjNEays4TTd3NEhsYndBRzZmNGdyVE5keGs4NlQzMXJWNVpabVJLZy9yWnJBTSttc3cydnVXYzNrQnhzaGVOdXlzNU9xaS9ENmJkeWpWWmYzeHY2VGRybVpKYmtnY05yRnZWZXJQbXZkMVlvbzRLVDdIdHhOSUhzbVpHWkxZdGJweGdTZ0dISnk2THk5a3lvQW9MR1hvRm1Iejl1Yi96eDRyK0dsRDBPRE9RaXBreGRhMDlrc0NmYzkreDF3U001Y01zNmZJdzVHMGZiUjFiRlJLMS9iU3FxN0dOSjJKdHFzMkIydjA0emd1U3VsSTlFbytnMHNQZFpLeHVoWlhZN3QrWU16b2tYZ3NhWlJEUFZ6SXAwNndiSllYL29lRVdUTXhlY084ZmxKdWl6Nm5LbnQ5SzZ6THgzT2dlYUhud3JLekZ4UHlhbEo5ZUFJSDRFM0ZYbGFtVHdrbDR2a1ZjZ3AvNGV3dHpRUlo4N2ZuWlp0MlozT2lROStQZlRIVEpvS0QrZmRETzByUTgrOGFVTy9ES1pmN1B5SENnbnNLbFVlRHN5SFVadFNMVTU5bXU5cXdhMjY5OFd3NWRRMkFvZStVb2cyYWFVL3VwV0lIUnJyZnNCSmRzS0U3cWZLTDA5V2tpaFAvQ1hRWmMyNHJTNndJUE5wcGhwTkp0MmhoU1UrTlV4aWRvNDlZWGh0ZHkyYkUxTW9vWHFCVzFiRzBTODlnNGx1eXlSRVB2YXMrZmJEMlZicTlrVVRKTlhSZkx2OEpKdDJRUzVqaS8vRVd2SDhmZXFvMVMrY0ZmTE1zZ01TNHpabWhoQVI1NmNZMGFJQ2dZQzluNGNsbXJOQytVSjA1eHBZN0M2NUlkclBaMWhSaWFXMzA0YkZnT05VNTJtS1R4QnhmWk5mVWRsRGxYVU5yaVdMekh5anEwWlBydW90aTMxQ2toMTNvby9vSy9RdUY0a0IrUDNpMmZxSVdybHJWb3Y0QkpoRDBxK0x0OUR2TkgyNDJJeHBQRlhST283VGxubWNlTFdDd2paQVBFUUlDMExCM0w5UklFT29oVVMzN3JWdFhhZjN3a2YwV3lHU1l5QnFmNEpMNTJqbHhQQmlDUjJSWjJuaU1aTDFRckhoVVpHQW5vTHhVREsxbFBNMEd5MFpJdUc4bVpia3ZOUUJQNnNzL0xUUzY3cFBIR2lOTU9hVGo0eFZadEVTQUx5OGN2ZUg5VnRWbjY2d3ZQQmpwU1hpMWdCa3pzM2lJVkxrSnRFU2JGVGhKNU4zOVhRc0dORG1DQWh3bFk2QzVjWXRhVnRaYWEyak9mZDFnRFVYdWJkWlpIbTFkMmxUOVl1ZWxqZ1JLSXphK1VJQ3FLMXl1c2hsT0kwMEpyVmhBdUJtWVJLSXVFMVYvNmRlYTY2WlVHR1Zad25pcVl6K2VEUitzRHl3VnFBYmtYTGhBempEalFGN0ROS3ZFd1MrWXN4TldDRy9ldklCaGVQaVpISHJDV1FPdzg4eE9DS092RzgzTExsUktySnR5S1l0ZkZmRGpMVnFVM0VyeU5lWEQwTlJncjNzS3lJM0liNTBLVko3SExHSEJsVVNzVU9NY3I0RG5ZbS9NcS9sTG1iUjR6WFVQTDNleDAwZWQ3cDAySjJNOGVFZXEvY21wNGJ3M1NIcUlnQWl1WE54QldnMzYzbkpXd3dkOHFRUmNqTW1aSlQvY2J0OVhqQWxYTTlhYlBhUlh6Z3NzKzdqeTdkKzk0UUpPNTlHRVVWYUxIMnNrSFVhNzRsd1RMNnliRGRVRlpBMDYxalBpeDFMUTI4c1RNK2NROFBZZWkzMGZIMisvRVFyL0k0U1VQU0pMSkZRazFrekJqSDUxNWtacFVFVXJ0bTRZdjd2Vit1MTkrVDhaS1NpWDdFdUttVis1OU96ZnpLMG0wSHNOcmZpM0ZhOWFVdkxFUG53M29zSzN4OWxJUEE1aVZoam9ISXI1LzNIQ0dUWGdzbDlrL0FoT241enJpd3RldURjdlhwZ0IyZElha0ZGT3MyTHIzUjlzc093cTY3dUx6cmd0SFNwWnFwWk85UTJEOFRSWU9ZN0huY1k4TDVXdFNNc1crTnhpZGRMSUpRdDExYnhKRThrZ1hCVGd3ajB0VTdLRzJhYVJUOTY4YTJvcmJMM2hXTXh2OFhtaFB5ZlZUSDE4cnV1QjlwcTUvOEpBczZ1WXBYUW9iYUIxOGhCZnJvODhsS3lpUVJ1ckRKcDZ2UGpjMzZjMUhVNERCMDdNZW5GZlpLazNCUDRPdGM5VU5wYlNvNzRNcnZ6MmlXakJuaDZEa0F0TFlKNjh4OEVUbURVZFBha3F4cnN1Q3RablR3KzhqZzhNTWx5Q0F1QlloeFRqZ1VNV2daYSsvaEI4MHRhZm5DMGFsQWFhNVNCci90bGlML0FweWxGbE10d0duMFdHSDczN3U0R1MrK09zS2dpZTB5TU50M0FwZmxRcDBJVDIyM2crTnZxOTl4NXhTVTZWR1lkUWk5WlFUYy9yVERkNEZNZW1CUDAvVXFnMG1wUGtteDBNejZOajhETjFUUmF0ejgrbmxORzZwZEJjMlVBUDhMU2x3bFBwNlBLYVo5Y0pkaWFQSDFLbno5MmdOd2hUekkxempkd2Y5cU5rMndtaDFPMVJ3RTQ5ZVZuVGFYZFJ4bmZhd1haU0tNcHdLM04zeVkzZ3hZamRleUhLQnJYUTk2bWRRUGFYbVN1WmtXRDFLckY2V3pTT3JYL1lTMm9JblpXZWcwVEJ4ZW5kS28xWDkvSHJUR0pUQWE1RnF1L05UTklUYXhRU2ZmVmNEaC8wTWdWR1dzZFhWRTNBV1lzYlVjQWQrWjJ3MkdhL1N5ZzM1bVA1aG9NZDFjb0s0Rm4rRS9qd3ZidEUzalUwSGdqUytnZFZhRXhPN05JdzFUdm5QNE8vay9TSWwxbm1RdWlpdEMvMkYvaytzMG5ib3dYcWljbmpsMHBvK0puSTQyM1RpdDFHQjVnZUhnTDVqU1g1eEEyKzhnQzV1QkdYY2Q4eEQxT3VwVlVFNmNsZmtLQXR4QWRMRDN6c1Nxazgwb3VhbzR5VTR2TkovbXZNbGVWOWllSThMYVBPcEltcFRJVUZ0UE14YmJuOHV6cnRKTW41RFNNcVJJSDJodi9yMkdhb3pwL3N3RXZrZVJlT3ZQTVJnayt4SG5mK1FXMXNMUWFCL1V3ZkpPbVV3MEVmN0pUcURvUUc3M0VoYTlBVVFXbHdHVG92Y2xXVE5FdVc1Y3psK2o1RTIzVTJtYUxUNmF0bjF3dEZtdW5RWnR6eGpyZnlCLzl4TE8xSUQ0UGlUWm0rc1R3UWhtbGtrbmJqN3k4K2hmSm5ZUm84b2VpL01HKzNyWVEwdlZsMW41VGo1VWpMMlZjeWtVazNsK1J0UW5RcjlYellEcHNiMmUyMlJGV3lJNWRURTR0VkRJK0RCbExCWDFhTjdUSVR4dTFFY001VlRzeGFSb3BDREg2WWRkbFFVTzlkZ0JVRTlvVjNySGJlYzNOWjlxN0VPeVBqZ1FwSWFGWlRzV09TZlFucmZwakdQanpGK3JxWlBQbzJFN3JUU1Z0UUhFWUcwWk9HdUd5OFZta0d5WDdka2hSZ0VUNytsL2Z2Ynh4KzVtQUYxSmtqSHN3b3pkcUtmczlqd2xMYWlCdnRBUmJpa2szbDhFTi8yYUJ2UEdEa3RyTnZvalYrTkgwQmQ0WUNqMTJ4alZGcEZva25uaTF2UlpzcDlSNG5PU2haZmRnb29nc2R0S0VVYVB0ak5pcFdMeEEwa21SUjd0V1VOeTJKYW9ORjRWcS95Q2hzNW8yTk1UYUVSUjZ0bElaVmticlY4Q0xtdm52b3VsNm5kVGlEdEdScEdveDBqOFJOYVByR3B6VmIwSVc0d29xb1JmdE5TMXNNOXI4aVc0WjRjVG16aEZkZXUyblcyRHJJS2F2Z0ZkR2xCUTNqdjVYdER3SWhCWkhXMUk4SjlyaXhoeld1SEtNMXJmRXY1TkExNTMvZUJIdWYyZ0QzNm5sMzFtRjk2WVA3dW9LNnFhQUFYODVFbzJURmgzOXFpK3FYcGxERVB6bG9VWDNvMkdyNDk1VjN5K2orTnFFa0JhOWx0bWxRd2piSWZ4ZnVwOXlyelEzUWg4bjEzbHU0WHZSa0VRNENFNWdQOVljbklsNS9VRUtQTS9KSk5YbDRUMjcxZXA3ZW1BSlI0WkdWajM1L0xEU0tLRWt5VnR3aVhXQmZsVlhWckxLeTBQVi9nNlVoanFmOElqU2U4OHJXYU1lSHhkOTBUQk1yV1VZWWhTVFNaVENhcTVxZHJsNHJFdHZTRCszMDMxOFlBTXhBeW5NcEdJQTlmQ1JDZXR3NzN4ZnhlRmd3cVRqaHJFRFNZdmdtc0lwb0JPRHMxZnQ0R2h1b3BDSURKckh2dnlZczZCRThXdDMxZDFGTHM0b3RHL3BwT2hubzk4eHNFY0FsUGkxT3ZCWFJPVEtud3krb0x5dFVHK2dFSG5NZEQ4blVSL1FIMC9kZUlUdFBQeGlMU0U1azI5OVJQMXhWdEsrdVJtZ1grUHFXV3pNbFRLZ3pEY2hVeHRnRDVNWk4yQUpkenpaTzAvVkhIUlV6eEZ2bEgvRVJTUzdwQ0tydjhGMzJnbzQ3N1dDc0hWY0ZKWlRIYWJrcDFqekhibWNIL202NURQMnFrUFJxM2lSOWdRZFB2ZWNuaDdlaDNxak4wei92Nk4yb0RRbzI1ckYyTHY0dUk0WER1clBaYWFBZFRqUUdoUnczdnhvK3dCcGJUc1l3eVkvQXVoTEFzcUxQZ3kzM0J6a1RNWW9zOWJPcjIveGJ6ekFlS1pnT2lHWkRBbVlYQkxKQ1h4eTdHK3JhQjg0dlFJTmJPdDJlSFF3M1F3bS9oOFNkaVcvMXI5eXJVcWROemZ1dDdER05JczlSN2Y1QWRmQUh4UGkwRTZxdE1wRE5lclhuSVFXZHY4RkFUT2dxM29SZ0VPWW5tV3FiWG5POFhuZ1lFeklDSVFpZGJRVmwxUnBBQlltc2t3OUd0M1gvUTVpMXJyS21XQ2VPZE94bVMrK0x5ZzYzc0gyQlJwYVlwSVpocnh0K3Qrd05Zc2p4bHZtdjhrUHdqQlNvTmdQSEtwaWJXUG5rR2ZYMytsM0g4WS9Ma0toVnVjZkpFWEk1UVdQbmJsalJKN3ZIM2dWTmZVb3p0S2xIU1F4NGJqSHJWbFRaa3lTc1pJNUFvRHhRVzF0SFByclA4TTlVZjJPcC8wcVRDVVFIUWJTQkRFRjlzcjBibVI0MzNFYzV2Nzl1TnBPeDdtV1Fwa2lxZFJlTTllbnpXWnQra25iRmFuSWk5cWcvaVlXTit5bjFwY3pUMThGUDQrUkt4Y1ZncjdMWnlrN01ZY3ZkUzJSZUZWdCtOZHFkelRDSGVSbXlIdXBvZVBzbXBNQkpqUS9OY1lUdExJZnVMR1FxTkFCTDRwWFVBVUVQZTMxU25XY0E4cjZKOGIrK0xUQ0U5eTY1bktQeDRDdzB3SElVemFGdEhLYlNlUVE0NzFqRlFRVmZJRmZUamNIei8yLzErSWx0ak5yTjhGVWRGaWIwNE8rcno3Y05FdHp4aTkvZkQxR2tOZ01pZUtabmxSOG1yaFdlRlBDQzJJM2pKR1VjeGVZdGxuSWo5anVBUFp0SVdzaFR1SGRjdCt4RG9qTGxpY2JIbTBsb2xURjYxREJSaTlnWmxIMHc5Qk4yRHY3bERLc3BHeGN5UzFGWlVIY3ZzMld5T1dsNlNTRWN6bVI4aFVSVnYzZmpFTUc1cE5aVUVVVXMrcko5Tksvb1FPczFwZHZ6ZFFnSUw3dEtibXlhMHdBRmZOck83MTdQUFAzbVpWMklYaDk5ZjV2ZVNVeTZxVml3bXdaUW00TExBQkR4b3hrcVFWYnAwakZDK0hRdTB3aTB0QWRpbTJ1akFnTXNoeWFMR2taaldaLzFDVTEyeEZ6NUJmcjNjcUhTeks3UGdUUmFnbnpleWFzTmcvVm9pRTAxMEt2WEUxSE80RGtaT1BEc1N0ekp5RWRXaVVGUUxvZWxzZlJJbkVTWXFZa0lHRnEzRS8zMXc4RGpQeksxNEtVbUhqYVVYS1FEWTkvM3JIQ0JZK2JtNG9vaFU4d0pPRnVwU2lORTlVVEN4aDhmdnoyTDlpN0xpRm41eFB6dTJCeVlzTVhPa25reWU0TjNUQ2FwYWxrUnd6Vzduc3dVL1YvZ05GZXdXZ211ZStIYjdJYmh0VHVHUDNPN05zbUNUUkhVaWE0WUE1cnMwWm4zaHF1d1pIWnJaTjYwcU9BNEJobUJNMW5PVTJkWUFsQ0VZQVpzVWNaRVZpcXJ5YTYvYlJnY2xuS0tBLzMvTkl5WUhERFUzWWhkZEhRSndaQ05WZ3A1OEU3N3F2bzVtOW52eXFRMWE4bHJNb2pHRW56SkoxVmtCK09nbWdmK214ek5kaXk1QUZqR0llY3IraHRNZkR5UmpUVjhwcFJzTkthZlFSTk1aNDIvSzh5OXRqMU83NFd4NXYxQWFnQ0FSWVVVTC9iRzdrTVJSeUFrZlpZMHFTMENCYUtjbjhZRjcxNnIzZHU5QitZdkNWbWhBelJhWGJVd2Z3NGtGRllDUVdqQWlPcC9HdnEzU3EvdkZiVDN6K2hNZzZqN0lPekY3L0JYa3IxSm5heXRWWUVvK2hjaGtEa1ZObVk2Qm9BT2JwZmFSUUNqRGJnTzNDaUdJQzNqMS9RT3RhNjFwRGk4WHBEQ0grVWtueDNzVXIyRGRkcHV3c294bHFuUjlmMUxWdWJoQzFQSW81dUFIc1M2MmY4VDlDNzA2NVBCbWNzaEpaZkpjVEZockVPRFQ2MWNEQlc3Y0poc21iRVhBbzhYanBaQjVBUEoyUDBtVVF1OGM1N2sybXgvU2gySmVaY3I5WXBNWVBRN0QvQXFla0luOGd2ejg5WlNDNm9LZGx4cUhGQVBUWDY0eEVFOU1Ja0tZU1VObHMvV3VZTGxyVStTbXNISkhGMnZWRnVCYUNoVTJUT2lQUnk0bW41UWlCQWVBWWdFVkhUZUdHd2Z4V2lBTTFoNnFHOEplcU43M21WYjkybG5LVitENm4xUStiek1hZmhDZ2NqMXAyN1pTb3BJN3BVajhrUkxSU0pwb0VmYVpGTDdmeTBNYWtQM1BHbTRNdWxqZGVjZHpsMTZEc3lsMDVTNjJwYkxoR2RXZUVWVHNlYngrR3FsaHdBbHdhK0NTRnZEelhtZk84SmZOTXhPOStIWnJsc25VU2w5VFgrYmpQRUpOQkpNSVpTcE9iNFhXa3ZmV0ZCWThNMlVxdlZHclpxTER3OUthd3hCOFhubmFjVEZOMzZCUUIxWFM3QjliUXNqeEtDSzF2a21UbFlIYUppYmRCU0x6d0dJYnFWaThONUc5cFZVOG03a28xMzZUMS9RZjhibTluU0NSMm1Obldya2s0QmF5VlMwQjE0VG95OU1TcTVVQWFTVytNcCtUZEpsQ0c1ZlBUbG1QZWx1cUVwRU5hRjJRaWZDTkhwb2hxVERPK1N4NHZYTWVVY0FyVG5wUjJzcUs4dlhKVnllbUhDT0FGSWI3MHdZaDNQZk5YY1c4cUxRMUs1MEExTzYzUjVPcEUwaUVPbW9ndVpwQUFVQmgvenpkSURPTnNBWGt1WXlZbjdISTlQeFQyMnE5WjFoam4xTlkyVUMzdFp0NGNONXZ2UlNDcjNBMUkzaWo4ZGZ3Mi9JUVJxaFN6Q0l2NXV6dGlMa1hDdm4rZk9idFROY29yOXA3V2FDeGZnUlNTZDZXVUlER2lLeVZOeTJWbmRrZElFTDNxODhGcmZrSlN0SUFlNHRJSlRSUnNSVHNPYlVGSUwvMmNhL2RGeS9CQzJBWEMzR0xuZVZaSlJGZnZ0Nk1XMGV3Z1ZlYTF6Q2ZHaUYrWmxUeE1pQ2JCVStZc3Q0YmRsTWVsdlc4WWNnWDRUcjhtQStiRzJQZHIzQjE1bWJtbmlRb3pjbWhoc2toa1BCT2t2OXdhSEp4OXpXUUdQQmtReVg2QWlGTVpCbVl1Z1kreU9ZcXA1anZ2c2tPVXpYQ0tCS2NwU0c0MUdIRCtieGxYRDJxY21EdWRsOXNqQlBZa0dFY0QwR0s0NEdSQ2oyUHJ5czliWUhDdnBQY04wVjNSMzVWQXp6NzU2S2ZVakdZMnJYOENzRktvdEt6anJUZkJVQkZ5dERBdzUrTWtuM0lQNEprcnl2ZUZ1QVR5ZmN1NUE2Yzl4TW5iYjlQTHM1OUpRS0YrZVN5NzRwY3pKa2NPS1BVNHlmOEhQaEdnVVc1MTErYVBxZWtnZW1FOWo2dnNrc3ZQR3BDVG5CTzJWdjhESnJXSnQrNnZqNjVrSlhhS2RFODVtYitzU20wcmc1dGtrR1prK1FRWDN0MHZKTm1hRzB4bURhR1JNV2dxaEUzbGczY0xFMVNtNjZMOEJIMUxMZUMzV1pjeXNCd2hDNGRsc044akpGYlZyb1M5VDZtSENRcTBhREd3dTFtQUE2emFxV0pnSHkzak42UFYxeHBLemRaTFY3cHZNQ2JFTTMwQ0U0L3kyQzFBN1ZzVFJ6ZGdDU00rN3Y0L2pJdzFPaVVad2xrMU9vWEY4MUxFVElWL2plLy9mNmptUG5BNGJWVjU5eU9mRnJuYUkwdFFrclNqYi9MUG0zZ3VZN3kxNEt1VE9USnVBZmlPeUplVnplSjJDNUY1STVYRW5BZE9YTFdoM3U0aVFENFBqWVVYYmJjMHduMG5QS2ZtRktFTkdYVW9HMGxKSy8xNThJUTZOWEFUd0EvaG05R0tnSjlrWjZwbGZrRXVZWnhDWW1tdW1DK1NVWXlhd3YzNWxJMjNzOU40QmNpbTRjQTJXYnJQNi82N0dWTGNuZXdFUU9JNklxM2RhNWpnWHphQ3A5bDFNRkI2UHNIWHBZNlM5ZzNpV25CNGZRK0pIaHJvS1RQamdMMWRHWUtKL25WU0xxNWx6QTFiWk1vVVdEZ1dtOXQrVUNEajlNSXZjQVI0N05hMmprbUpVNTVnNDljOFVvSmhxOHV6bUdvZHlIdWFWL1ROMEd1RDNkVU0rNnd4MEpyTnBTNitIUFp5VHNvaDBCYTJielZteWVMbWw0RXA0V1VCNmszTmVjUGtFc2lud1dYdnpobm44YTh0aG40SFRLU0tjTnpuVFBOM0VmeXIzVFdzSm9rZ2x2TnFLNDgxK3ZDTEFZWDZ1VXlGV0FKUTVvKytacUxvOTZPd24yTmZPUGFXNG9BQ3g3ZUs5d3RpS0tEL1AwY210anFnSlZybG5oYTZvVVBYbHdhQUpqZExTRTlqVUtlWDFDNlk2RS9vYnZrTm9iM2pzWU1aaEUwRFQ3dlVtTUVrdGNzVmRjSXFUb3pFUkFud0h2bUlhd1BVbE8vMmpNYk5rZjlPOGhSSjdFbEwxQTg4amVsa1c0SDM1NktQTkREaS8yaC9HRlZGQUEyWFdsWHkzLzN6TWxWUitwaWl5WVVpVWVEVGVHUCsvSFZmZklCaVh0dHphZ2RCa1lSWGNBZ1RPWXMyeFo5Ty9tQnhlWGZmMXREREE5WDJqQnFPbmRET1FEZzJBeld5NHpFUHVQOWhWTTQ0cEJzUnIyTTFuYUJ5UWdGODZCeTN5NjdvakVKTHpjRlY5RzN0WEFKc2VDU0xJLzZSbnpoalBtd2J5b0V2aWhXb3F6MjIraWhBeldsUXdWU2Z4dXN2WE1rajl4MFFHeG1wUTRHZEFINlRzZGtsbW16a3dhT3BIcFRuV0hVMVhSbUxIVG1kdGFUV1B5VUc2L0tSVDRjWXQ1YTI1aHpud05KdzgwYUJIcUl5dXNnai8wYWpOY3k3L3lZY0daUDlLWE1DVDlQMGkwMDAwUjZtSWxLQVpvbG4wVzM4Y3dJZzZ1NVpOT0N1U3FsZGlURlRhbG5JZHFWUU5XNEFvZkFqbnVwelFxRC9kRTJpdmJzalpqZ1R0NnZIUWc3WWZTZFltT3N1THl3SjFPclF2T2doQnJ3UTBRK1QzT2I5NjhtSmtXcjJ1OSs2a3FsTFgwL2ZDLzJZTnhwT0QwSmlkaEpmRUI2ZVV4L3gya2hzNUhvaml3SjBCTkh4OGlUUWZDQVZzc1YrWkd1S3g5eXZBUGJTUFpTbE5NWVFYR3J0Z0pTcUFJcGxaZ0NoR0s2MUFIR0F6WldpdzVWZ2xORXdZOUpUeU1TQUN5Y1g5alg1NlVzQU5nWks3L2VidlhpYVdHV2dWVU1sV0JLcUg0SnlJOE40TjZxUWNiR01LcFZOVmpxN0J4c2oycjZHOUU3QW1kZVkwWVJZK0FCMGk2ekVBQm1OWmRwUUVCNzlPRzR6U0toNFVSUGl4ZXVla0ZCb0dwc0YrQkpXbjd1ems4REowT3cydHJQRDNXL3VHVU90aldsSUx4OGtBc3VqZTVzenRtK1RxQnZHWDl0VzBPZ3FHVGwyMzVXNHNuL3Y4UEU0UXBUQzhPZ1lBOG8rcEMwM3BuUVVOdEFVZmdaRVlkdHExUnFBdHZSVjlXdldHNjdFNUIyVlJMMjdSc2ZFTWEvT0pVaWdwU1RrcmNrRG9USzJYZ0FWUkFtSXlYODRzaWVYSDB2Mnk1U0loUWlUbDVhN0gzclRQZHlBYnFwZGluOG9sbThSa21GS2NnajJzZk1mM3JOcWpSeUlnYWYwNUVHSjgzNExoWEdIWVVTeCt0NGtDdjV0bkZYU2JIcnZ3Z3RNMVRCS1p5czlVamFsSW9yeG41cHRjQlBOU0xqR2l0MEZ0cFd1eXdrdDdDWCtMclQ2ems4bjM4NDBJWjIzTVkxYTFiVkczVWZUaWhyMlljMC96UDdSVVpmSEFzOXU4anhza044LzZEOEl4eUhIT2c1cVJWQjVGbUJhdHJJRGY0NnVadG9FSWxRTGJpWnpZajh6YUplZmpqQnFSdkR3aW9TY1REY2FsUlhRNEhJS1diR21WREU4ZXcwbktSR1Z2MzlweGlQbk94anJBZU5HUU9wZTVLL3p2TEpSVmphNUExanRad0M0citZVUR3Vll2Q3R6endEeUFrYU9PWGtWb2ZGamQ4cW1yQjBrblZHekNoMEJMb3BtQ0RHQTNhS2pyWndtQ0VZYlJTcHIzd1MrV0tJbFc1Ymh1ZE9jTUZqS0laN1RqWU5ZNURFRzBoUWEyQWhnRG43RlRkeEh1YW43amNYdzNYem5lVkxlTTdEcW5VRnIvUURnbWJiU2NiSDRXZ2ppTGFkTXBhSE50V1p5d2h6OC94NDRBdk40blFkdGNaWTJZZk5ldkNCbmQzTDl6T2NiTkZQVW9Zc2Y4YXU3cHBvT0NGMzRNcHc5OEg2aXF3UVpOeXBGYWxPMU5DTC9QTXZCMzdhU1RNSHd4MHFLMTUyZjcyV1VGVjBRaXJrUy9qOU43UG1PSHEwcHdvZG1aUTFGc3o3TDlFUnBRVUlEdFd5VE1zSHQ5a1pNTXVjbXhPK0JURU5hRVdyUWZyMDhiVUF1WXNzWFFWK0M5QnFneC9pT0l2NnI5VFFiV25ac1dhbmRHYXNHS0dvWTNFZVFGNVU1aU9ZT1hDdmhNcFRONHJJNVpjbHVFVUNWcU02anRoUGJ2SGdQNWZEUXRmZHJOSGl4ZUR4RDEwdkVjNmJUZXFKUmxCcDlUdjIwRnJheWNtL2FzZHhHbWlnUGJ3MGljd05VY08vZWo4NFp4Z0xYY2ZoL3JRY3A3L1plWGtjNWhIMUc2K1loWHZVaHcyRjZ1dm1nNzVRSDgzenord2NTUmVGemtub2pzRGZ3VHdEZ2E5ZEgrK3hBRWdpWHpRL1lZQ1dGbVZpODkxZUxkNGd1MlJEbXlFWmZsV2pBWDkxY0d1QnlTT010VVNIa3ZoUC9aVFRhYzY1M05qalR5dy84dzZlelYwamU1M3g3ZEVuZnZrT3dPR3pSOWtuUEFFeGM3ajAxVW1LcWp1dEt5cm1RdEhtSjl0WEZWMXZQWndERkdjZlJHQ0tsUHdmT3pGQllzdk9zOUsxanV2bmU1ZjRMV04vRTBGMkM0RzQvU3k5K0g0eUFtS3pmbUVEdEdEOHlpQTh3K0VIVjVVTENNMlljOHQ0NlQxVXBDNThiK2xFN3EyQnpEUVc4U0ZWQnJzbkNPWEpZR1RjWHNxaSt2ZlN5M0liZW5nUlZwOWliQStsbWl6WnhEU2R4RHlYYjFpSUdaZm1vOGN5MkVwRWMwbHh3d1JVZEFoak96MjhSZ1packdHQ0ZXeXd1Q2JJVlNRUzJVMnhFUGJ1YjZtOHlzc3dPbHR0K2o3cDF6Mjk4M3JyUmU2VndFTGpWMkNrSUkxRCszVU5EZHdpZzkvUXdFZ1FtdmI4UTM5Vmp1MllrbTYrdkdwNXh4TUg3K3MwV0RSZTByMGpGTk04YUExNEx0L053WWtkM1BuNWJNaGRzODBUZ1B3T1o1R0RWUmZ0WDVRM0NkdzB5ZUJ5aFJHT2ZFOEFQL2pKY1BuOS9YM3p4Z2g4eFFjdnFUUktZdDZvSnRzNnVZblo4bTRGa1BMdlJjc3JIaVNPMFlCOWJna2VOSHlZTTUrWE12ejc3bllFYVEyc241NEY2MWhuamNTSGVWOUFDZTl6ZjZGQnR4dTkrVHR0djZrYldNMi9HMmtFRkc5Wkg1dTJzR0JpeTVEOVhPMlUxM3p5SGQvMzY4Uzl0OXd1djRUOUNtN29iSFlYUTF4dUpXTzRYb0Rwc0tEcFBFb0taeFBCamtxU05hUTl4aDVKOEIvUUo3MHJpbFlCSXZKWVZrN0pOTnJJMWtXU3hGakdFTjBvTmhQcTd6R0JzWUxEUThZOGU3MTNGcEhXNUhSZ1d4bXU5U0ZoblIyZ2JOYnNJQVpFRkN5dEQrNjhzQmlGVVo0WVVCVGRtQU1VRDNaQUZQQWJacERobmpNS3puUlZnWXlSK29yT2VqYXo2L1A5TWZkYjBmd1BnSHc3Y3VORHNSNVI4Zjg4OFZ0N3pQTDhybjY0eGZ0cnA3b3RTaXk1Q1pxSE8wSHpGUGNDdENiRHF3SW1SRzRibnJNVytqTzNoOWhyakdGTnJwMnllbjFyQjVDcEF1NjM5UERqUnpyMHNOc2p4Ny9OUmpJbTNlZ2ZvOUdlOUFmYXpVMmNQbTZITkpYVTJoWXJUOG0rYWJ2SWdtcjBDR1ZUb25INSt6dEFxR0ZIZjRoNUE1d2t5NDVrNmF4MWRoU2Y4emc3RVpSWUdKdnR3MEt6NmxqQUJ3NFdCTUxIcWhtNGcveVVRVHJoU1grRXVPeW5WNGVMaVJBRVkxUDl2RUdBbjcrdUl5TExwVXBTTlpXWTcraHNCUGJKR2RqZFZKMzRLZDJmaGFjQWlhbnVPVWlXY2pXN3FNRWpwK2xvTW9Yb0IyMkY5RXcweVBoSlBDS0RtNUtSMUcrV0ViZngzMVM1S2Z5dVBPRHhZSWNrQmM4a01CUHU5T2k3Mm9JZVBDOUI2NUMxMFVnR2t5dkJyYU1oUFpCQkxRMTlRNlNvYm9Ba08vUUU0a2NlelNhakFUNWZLUUlYSW5OWmoydnpDVTg4Y3F6TUY3MWl2L3RwS0VCN0hyOUVLb2ZmNWJQM2pmVDN1cktKMk0wQVY1TktGQjVEN2h3dy9HWU15OG9xR1UzVStFZHk4Z0hoNWp5VGJIZm1qdmt2dEdvWXpDMXUxVTEwZW13VGZocUVDYzZsaFZoL1FISTFhMytCK2dnd1pMTnBFMEZvWFV3S0ZxdGVCQ2pRZ1ptVVBwOWw2Yyt3a2hnSHVka2c5L3hPc0gxb3Q3SHdCUmY3RnpqWlExLzZYWW9EdmxRV0JtRnRTZjhreUViYkJRMk1VQmNMY1ozYWlNclJoakg3R2NTR0w1VlBmbGdWekx3OGNHbDZYRzdIaUh1NWI2WGxnMS92YkQzdEFPeGV1S3BLb1BZbW9MaTRmRUlmYWFOMGJBc3QvMVkyYlR4NmJGdmJkZjFnYlBSSFBSa1pON0RheDFhUXRSRUR6UC8xSjZhYWhJVnVHMFRZbmpjRDRzWVIvMjlKcThwbW84Z1F2YkdKWGo5L2RLZ29UR3RNWDY2QnRnbDJabmVRbTIxWTcvVm1zdC93RGl4OFlLdTROT25UZDIvWG9yUmFyUit2NXp2M0VpVTZTNFZYZDN6VlBiVEM4MDNwMW9MaTlFUmRKZkQzdDVlbTV2WVBUVWIzUXJocEdTQk4ycEp3Qi9Tem9aQWU1WjhtdUZwK0N6U0grVll1Q0R6bXZyK2wyUlBueHFRNnJtMTczdEtvOTVNb24xcmcyZUNJY0o2S0g1ODhjRzF1RWhDRGdLSmdRQml0WnFtd0Z5NzZNY1lyOUtleE1xTG1Nd2k0L0w3aHRaTWpXOUlMUDZreXVKN2hwdlZBK3RldTNUUUhtTEFFUTV2a3hWSDI5eVJabTBlaURwUjdjRFl5ZnJ0UFIvTFpqbWp3UGUyR0ZnbEREOUxTUUcwaGx0QVM5c0dGSlB3OW5DSStXRmJEYjlROEFuNnR3TDVGU1k0SFRuRWtWVnNCaHV0MlcxOXZvMFdjM2NNTHo2TXJWTjVaK2hKR0o1N1lqNDVBSUoxdWxHaHMybHJEN2d2SEpsYWZNZVdzN3ZCdStGVm5zWEZ6K1NHcDRYYjFlbmJBNndRZjNha0dDVVJCcDhSV1RSekUzZ3Z6TmV2dnVxTnBxWmVIbCtCeEk5Z0tiSUlJODRNMW9vOHF1YnlhWEJSQVdGY2xJeE9kNkNaVnQxVnA4WktCUWZ3OTR1T1IxT0lsNTBKZmFYYStNN1Q3c2I3YkVWWDdrYnA0clV2OGhYcGhnY1FkakZqUGVLRGN4OE9MVUtQbUN5QU0zZnBKR2ZqUEtzNno3a3oxM2hrOGdvdGVNUjZuL0NtL1FWNFpURmR4RGhYL2cyK2JJQ0NsaHNMRTJrdDc5ZmtGUDFJTzVha0M1ZnBwaUVoQkVDaEZJeEJmaW9EeDh6VlpLSWpHWjlhY3R0bm44YzNSOXpaelJNdzl6WnJpWThaUXZTWXF1dFJZSzMyTThHSHlnUllyR0I3U3NING1PNVVzeExndWRURGlDY3ArT20vZUQ5WnFwVW41K0xPTDlYUDI3RnJieE11VndoTlZzSDVTL1pCUUhPZkhweEd0eE43dDdWOTJwNDZsQVVIQTN4MWN3bGN1MkpnMFI0ZWVKUXgyOXdTNHpjS2UrL3oxV3I3L2MySHdZdld0dE4zVk5pbFhyQWVyWHh1QXdzQy9zeXRLOXFBbjRySE5GUVVzbkRnOFRudUVKaUl1eU45ZDcrcEV0cHFXTWlKbHhHa1Y2RTkxSkpiOTlINWF0Tno3Z0pZKzFHMk1nT0JEUUhTK2VrRlU4OFpIM0dkRm1ncy9BL1o5NUdSTE02SFcxYzl1ZjNGTmZmeFRaNkJhOGZPMEhCRkpuMjdaOGFGdFlMYUZZVEsxSUJMekh3VHdDYjlaaG1pZ0VTQ3M1bzBjQXJBVHRXNUNoV2RtSm85UlJPTmx5TmlBRncyZDVaNWpSclFRVzk2MWh6cmovZllQZjhUbThOYVorVWtsd3k4a2Rzem5mcXVZZFNSeW9ueE5aR2M0cVZGdndWNElKOXdLN3A5Nm5tWUM0UXdrbzlpdVRETUhzZ3ZKS3VaMnkyUjBOdFFmamJKWVB4TytkeGFDMzRSVUk1eW8yS1R6VGUxMWtEaytxN08zMXJxVnRiaERRaFVPbTBkb0hPUEFKM0hIQVVDWFpFQ1laMURwVE9mN3dESWlqRWVRTW45R2FTZjRWN3FjSVVkM2xJR3lWU2FpdUx3WGh0M0VOT1ZXd2tXRm9XWnd3NkxIU3IxaTJPdE9jUklPemN4QUg3R2VsWmY4RG9FcGo3OGtDOEZCOHhnL2oyU3B1SjJzNENTcDgzZFBKenNkNXVsMW1yOUZHRjhFZm9DWUVscVJ1anRGSWJCb1Z4MTV6Q3ptc2p4ODVKSlFQYW4vUkcwYzZKWVdzcVlsVGIwNTZOYjJid2hwRU83UWFEb1J6UVBTYVZ0QXlKVG1LaGphN05mTmlSdURVemROTnJQWGc3ejU5UVlXY0JkbU9XcElWSGdWM0xpbCtGSUtiMTdmaGhERkczclBUKzR5SVlkNWhMK0tDd2R2QnhNRHBKdGc5K1JtK1dxejBNeEFYaG4xeXlJcFdjb0l4YXZRZHNmbVJycXNZTW82MHpDS2dJZW9oQ1dZMmp1eUJUN0NjUmpVa3kvR1k0Vy82RWhsWkQxVjZRemtqQVRRMElZZzdFc3BoS3Y4TVBuY0pBK0hTbDNmaE1MQlpMRWFoOVBrK0NCU0tzQlZ1am96M3lrZlpoN0YwS1JxaW8ySVNUN3I5eWdOSjZjZjFhb1F2WWV0SnhPeDlLZzBLRWdRamFEVEhrcWZGRE9XQW5YdjFsMk5XcWIzb1BzZnRqZkZneVdFdnZFS251U2QzRU9XZUhaQjJTNzhlRWFYOEZpalZON2tjSzhQYXpTT0w4Y0Ixb0g2ekpXYmhXYnRhRFdEaVpYYUxwV2lGcWVvWmJ2TzlWdWdvcy9XZ0JKQnA5c3F5c1J4S0E5R1JuNlVQWUZFM0VJK05meTJ0QkFHck8zSWVqaytrWjRtYU9FY3RtUzNFM2syVTIxNkxXbVh4ZFd2Qks1ajNYazFvSlRzZnlpcGlhbWUxdFR0c0hDSXpOeE9kZmJ1bXBKck13MXlYZUJPQzFDVCtiemFOZlR2QURRZnN6ZkhrTmdzRDF0S1BpUzRvalJJNUNBS1RvNmR1N0liMENSSEdkRisyRXF3djgyZGtLTnF2eFFhR0tYUjMwOERIV0txenZrdFFzblZvS1pxblUzTmR0U05XNUZJYmNvYnpPVnlqSlBZOXZudnFhM01XZWRtNmdNS0x6eGp4REpPbmd0WGVRRHoyekovOUZUa3ZoNlkvbTJZcVUzMENWMllONW02SlVKeTNlR21MMUI4MFovY2N2NWlIZUxWeEVybEFuWDBxa3g2S1hpaFVNRHoyc2hNcWNLQTZvVDFyOWxGbjVoeDE1TUcrYmtyYnN0dzJyeGdrbVB2cEtKbmFydHRObGVKaDhWVjYydjVTWWNpbE1qeXZzSVhITGFZQU5jU2p5NlU0bmlEbDRDZ2hNMitWSmt5YWEvRFZTVDdVNGVweHV0ZlFNY1RsUDBYR1JIVjdYYklMSm96ck5MRDFLeGh0WWpEbzJSajNiVDZqdUVGNnJySmxyRmpqMmhsMDh5SEdCcmdwOVl1eldLbGZ2WG9JNGJITHZhQmJYdkV1QU1wMWdRUjYyOE9hN0ErSGxxNEV4dG9MMTB5L3NIRTR4Vlh0amUwRkhOZDhlemx5UDJqVXhxQWJHOVBlR3NOMnE1YnNTek84Tk4wSkdJU0RsblhGaVQzWDVLR09GMUZiaW9hZVo3emh2eC93TjZCYWR6aWgvcEZ0NXkrYXVoOENvWUZodzBhajU0VnltQUJnS2dXNzVHYVp3cjZHWTdjR05SdEhwSmMrZDNTRXluUE5yZ2RpTjRnVWxjQktvT2xlZkFjalpBYkNlZmhTUm5UU2lZSlMxMVdpaG1rcmlOM3dTNEw3bDJ2MlpyVUJzVmhyOWYwNUx5V0h5WVA0ZUlMK0VqNkJ2N2haQWtnS3hrdUlMZGdvVjR1U2ZNd1l6ekxmT0trS1VJWUZZNS9hM2x3ejQzczM2S09NeTlFRmN5WjlzUmlHU1hHelJMK002VWdUMWIwWFRweU5VZ1NRVWlXR04wN2FRSnZPZStGVjNSdnQ2dkpzU3NZOGlWUXhnQVJNN0NZbkF6V0ZGclRTaGtSOW5ESU8vSFZheC9idms1OUExRU1pR2liTi9FNWRnc1BnVllRQlhOeGlCNlZ4ZWppcjl4R2lZNXRUZ0N3UG9vTTAzWUpRSmlKRnZEKzVHNko0d1VtNjcxeXRRSGVYaHg1T1dzR1pZOTB0ZkhEdjI4UFJzeUJheWE2dUFHR1prQzFYZEJGWkJ0Zm85T2tCY0tEbDJ1cnNZZWlURXNIeXIzNWlJM3V2ZkRDUWEyZ1J1bTVQTEZqTEZ5K3BPYllhVW9qY2lRYzBFZVNldmNoTndjRlNkWTJWNFZNU0RsK056Zk1td1Nic05HSjZhSnNiYVBPbnpoMkxRQU9VRzhuTjN0L202SWNPS2FsUjdRRUdxZGIvYS81UXVQME9mWXBTeER6NE5GU2FHY0dJaTVTRUtuMFZLdXBCMVdRMlBMdDBVbVgyZHlYelZBQlRwUENGRjduOFdrMzArc3BiaEZqWFBrZlFSZm5zaXBkVFpPdStiQmYwdEZXVExLTENyUStjM0VQUVNPT1Q5d2ZNUkd1clJmbVNtZWxXaWxhS2YvWEtOeEFpVFRVbHhERGpNcFVaWVlkbFhPNTc5V2NTZjN6RGlFQW5OOUgrb3JHTGxJSW1DdXlja0ZaUkNyNW8xTW5OMFNuc0xqcEhKQnluU0lwcGk1dUJZRmZMN1JEWElJQUN3c25Tbm5pYTQ3d2tMZ1puaHdJS29IOEpFTzVZN0V4bDNOdSszcDdNYVJ6aUY2SWl6cnh4R29BVVVFb0NQbmNsVTI3K0MwQmRCWHhRd2VjYSthQytXcFVSMmhGbFNqNCtUdGQwSkJnU0E1K0FnSUNBZ0lDQTRuenNiNndBa29xcjJMSktnVTlyVForaWhoQ3ZQYnUxbWFNSTZlYk1GR0dtVUFSS0Vnek0reHNqZzN2MTRyREZVL2tyT2RZQTRsajdJeHdHNkRFQ05yQmxkUFcvS2ZEL0tGTU0vakRIUUovSTFreDh1NXJTSkErMG1nSmszWU9IeUVUYnhKeHdLVzI1aVhlb0Nja1h3eVRWeHUyOE9SRWltUkFhNGFBZHBUOVkzMi9UQVgyL1R6YStxeWZzMit2Ny91VFAyZEVIM2UwdS9mODIxLzM5UGw5dnEzL3Y5ck9mVlJmUDhQcDhQNGZXaWI5dHJYMmZaby92KzNoL2IwUWY4UHNyZjMvY1c3OXZVbC9EMW83N1BjZS9iVFBEK3o2Smo5djBxbS9WWFA3UHNSUDJmWTIvcTNoLzIvWEMvcyt3UzM2ZlJiKzMwNzc2ZnNGL3FvYlhQZ2sxcnM5bG5hTmZ3am1iU29MOWNQU3NxOWtHRjBzaU10aEREdlpZb2x5MDFXd2JZVDZkRnB4U1JMMUJVdTVGdVBLRUZoR0lkaCtrTFJBUmxXMkRjTGh1M1Axd01yZ00wWk1XaGxuYWw1bWFjSE5ZWFNld1p4cUYydjQ0NzFyVXZ1OU1nbm5tWUF3bVNCcmszOENIaTB1bU02ajVHaGRrSG94eCtZMHFFT1AyL052SGdFOXVuSGFYazRjd2ZJT2UranQ2aEpsWUZ0anRwcDcyYzczNzdLNHU5Yk5RcE90aGRsVmhhVXpNQnBTYWFuQng0aFlOZ1k4SWd5NEhETm1mbzhNeXRkZS9lb25NUnA3RytkYjFYaFh6OTllU3pIcE00aWVXRzhUQ0dLWmZ0eVA0eG0rblZ6MVhkSUFvUURPYWNpb2JzR2NVTlpPMDZPZGtDWGpab09Zd2ZSY2Fxb0k0MnowTGlyVFhSODlQQjRpQlBjQkFmVTUzTDE4bkFsSkRjT2VveXRtZkRCaGVkWlcvc3pqaHNkTnNSbmNuWHJZZmlQOHN4MVRTMnZVZFFFQzFKYTY2b2NObGNwUXZDRnV1aHRXYWJLSVJoUXRVL2kyOEJUZlMyVUViSEhxWFVKWWRDdTQ3TUZIbDEvbnljUXF6Ukc2U0c5V250bm1yWlZpOUg3S1JrTVdTdlpPdTFXM1M4MDU4VEJKT1F3Z2lyZk9CVzFaekQ4dkZKQy92QzdUVVpTc3gyMzlwek9xWDF3eDQ2RGY0YmNvS0h6SnJSMStDdG0xZ0wzNEpZN0VhVTJMd29IR1UxdDhNNC9ubkJnbk04Zmg3U1Fldm1rejhVT290Vi83NXZ1MGpqWFNiUkdDSy9lMnRMY2t1LzB6MWZkelhjc0R0N2htSU9IZ3JnTlMyczZudGtKM1RucHBvbVIxaG42R0lSR2FVQnc5eHA5aFBTU3pTbEFKM09GOUhMd3Ixc0RicU5OdGh3OEgrUDhNWnhXd1VwNWZzdHpxZUpQNlZuMTQvSWt6bTBFUzZjZFdJMVRQY3kya1l0U0NxdCtoZlF4UXRGU0JEeTJaeHdQTVVjSTBTMi9LNUZlVWd6Wnh5NEVqeFU0bjdyUEtBZVhFSTM2Y3dHOGFqOG9iODByMTBhb3F3SmtuOW92b0JLd011dlZOK0tmOWh3Smx4VDNjMThqVDhCU0YrcGxJWkhXbVdlUGpQNkpMdjdvRmtqbTJZU2xlSjh6T0pvVTNNSTNEWWhXTmxWaFFUYVc4S1NwVE1WMmdEVmJheUZENVF0Ri91ZWpxbU1HbHZKZ1p5U1Qzc1pLdjJ4ZXprRDdzUDQxakpTcHNuL3IvL2Uzd2w0bnBRTzV5Q3Jsa1lsNTFQcDlDbWE5S21sdU40OWdMeUJ6bGpYTm5iRjIzTWVRM0FaVzRPdm5QbERtNlBoOU5pamUvYVFPRnNUZDlibUZpWm1ERDBKaWVGN3pFbUZERjJqVHkyeWMyRCs4NVhDMksyZlVMems1OS8xRjUwTTVsMmhLR04zWEkra2g0Q2NDSGFTTGdqayt4QXVzNU5PcERTNEVpK0NKUzhzTURWc0Z2WC9Eb0RkK1BkaG1IeEU4Y1RQdmNQUU44QnZ4ZFFnU2NBYWtET1ZzcHM5QTdDbXhJQWRSUEc3MU9LWUhBUHZpTG9Hd3BPN2dSTkNPS0dQZ0hpbHIxaVNpWTBlS25HZHBoUldhdjNyejViNXV2aXEwSlVJdVdqc1pldDByWldtTEh1TVp6bDJycTk5VzlXVTNLRGRlek5ycnh4MTJUeWQrYlUrRXdsbjVCVjdEK3h4NVdnRWwyMTV2eWsxTDVLSEh3YzVBZklnd2FFVzNrM3JOaXhqNWtXUk5XU2I1azVqeE54NkNBdlZvMmF1b3BhK1cyU3BoTHVhMzNOaDBLZERNR1RMNkZoaGFVUnZsWHhQcTV2UkF6MURJUUNJQ2twWkZQWXQzTUEwR3RMZURqRUkxenAxZXk2bnIyQXVxZkFzbkVleVVFK0dkSHFLM29vSUJQUHJESzVmak5ueHpsc1VQdkQxS3h0ZlhBd1A4VUdtWVM0WUk4MW9BVE9kbWx6TTh0T0pzejhOYUhOMi90MGI2aFhEVDhVK0VQdEQrSWVqdCthS3RXSVNTeVBxdEN1OXJlQTlYMjRvR0laZ0pGajh1cUxlQzBHQ1Z2ZW5HTHVKMHNjQ2pwRUJkekxHTHJLb0FmZ1pRbm1Zb2UvVjBVZjZNM09QUTlNd0xGcWZzMVR2Q010d2psbHQ0OFp3WnRrSmFrcjRqU0duMUdoaGJzVmVCenMzc1dvcldrcytWUndCS0JFeVFvM21jcG5zNzF4L2ZLcXdXQjBjS0ptL2wxck1jcFZnMHZ2NXJEOU5xbjM0eXJsZ3VyZ295KzZqL0VJamQyazdoQUhDckd1TEVrV1hlOVVIVWNiYmZ6MlZnLzdJMGRKMWFOZkpqNGJPc0Z2Mis4VmQ4Nml1WlIrQ1RmMlpyTXN3U1RURS9SZ2pXQ28vdFlscFdJL1VVaERlcUtCVXFpeGt3YTB4Qy9lMVpOL3B4Z0NwYlVpRTNQdDJLTXpwd3ZTcG9RMEdKaVRoYTBlS083UldGVDlzSkxWYWZMWGZTbUdyTG05R01KV1JWR2pNRDNaY2VPRGtDdDZDM043VW9oODBVRS9sU0lUUk91ck4rbGwyWDd2VWhMaHZSSUNIb1Bmbko2Zk5DNDJOV3lYbTVadk45cUh0S1pVT0Z3RzBNOTVWbDdORlV0VkpDWGxmSHZpd1NGNkFlSXZKaEtoRnJzUzJYbXMyTGVGN2Nya1hUZ05qbVpxdU9lNE00STAydnI5bG12Q1NxTlE1Nmc0YStEOEhaK0xwcStKdUpOYkRTSlNEWjhQNENrdzRaRFpQU1NNdExWdG5qdWxtOGRCMzVNZ1kvSUVnOXluS0l6aWFCL2xBeXhkZDh5cWc2TE9uOUxISnVNYUkzb3MvMWpuWFdldmtOQlR4UTJTNUtLUFh3VkdyU3Y4dDFFTmREUnp4c0ppRjB0aklhMHlXZEtMSFhOWTUwUFUyOFRLd3RNelhNK1lTYWJJYlpMTlBlSVlRV1dMOUZ3QjE1aFBBZkg2dVZjRWk4U3M3dzJsUE5rMFd3Z3A4M3RjSWtTZitJZGl3VEN2ME1zR1hUN0pNRzFYMVFiaGN5Z2FDZlhjQ3pyTWQ5TStDU212MzRhY285Z3FaY3VRdEhORVdzVkZjK09vTmVFZWdBYklEaVA3NEVWL05Cbi9mWmRTUHZ0MnA2SXVoSXR1dk9aVk9PUmVRZUJuSmJTYUVCbGJOK3oxUTJjQXMzWUEwN3d5M0NOdStiNVhCQktUMGIvWk9LL0VQQ2kwcUZHdHNkMzRXM3IwTnZRc2lyaFRLbVlRSDVYbVQ2NUpVZzlWWkt0R29HN1BNTW5iL3VZMzBucW9ZUUd3TVZQY0FlN0k0WWdOdHVSQUdSR01uUW9qWTBjaXd3Um5EYXdhUWZiUGF6SlFHWitTU2dpMGx2WElGbkZsc0kyQ1dIWVlxZUV0bHdCeWxCME1iREl4K0w0MUY5bmkrMFJXRmNnYUpaUUMvVzF1ak80UU1teWNXQU5rcXFNSWw3M2lXcE1yL29EdjkxYUNxTmtkeUo3S3B3bjlXWmxQT3lBZlZkdk9NdTVHVzFDS2kwdUVNWE11ZTd0QlJhaUpFdXpTQWprWkt3WGVQVlFXWnpwTU91SzVIaG5VaUc2enpzVURyS3ZnZGdJNTBjZ3R2UW5aTkpwYzNuQnlXTlRIb1dyY2YwNThpbUJrcGpwL3A5YUtaUVYvSFNqRkJSV3k5UjJZVkdLR1NUblNqUXFwUGZkWGFzU2RRc29SeEN5dWc2L0F6eGhCSjJRVzR0Nk4yTG9RbncxaENLWVg0M09wRUJ2cmpuU1NLNW1LTHRFdDZoWTgvUEpWK1EvMkU4dzE2NTRrU0FldFFnMms0VnJrUjYzcVBCaTNIK3I4aGxuUTY5ZFRFM1BQc2xwU2IrVGIwRHlGVXY5T1FFWDI5ZUI2NEhOa0NPQVk3SFVJVUVFZVF4ZjV1eWZvVlg3cEs0SUtDSTdXSCtibGh3TVQ0TVYvckFCa2VUWUtzNUErS1k2SnRUdmkyUDZkTHY3TEJadTVqcWlVMjU3SWhEVGU1L3hSZ0dsV3JMSS9CbEhmUStIa0dtSE5PU0pzWXVqbUJEZjdTeGI5UW1PeHlYNGxjbzNqbVpZbXJMZDFSMDdyQkxIZ2R2VUd4Z0g0VmdiTDg3R0dMUXZNa1U5K0lRUTdZYVFJd3J4V1FneHh3SXRDTlFXc29TejNmdmFPM0hiNWx2NnhNZnRSOW43VDJSWTVnNEFPYmp0ZmRiWnV5aVU3MUJJalBvWVFNcVI5VndzOHFYSzdUOXhjZHhZRGdvaFB2dGs5c0VTeUc0Y0RiaEdsZ0p5TVNjTU1seE1ZekVIdll0L3RhZ2dWVGcxY2NkUDJBUHpwZ1Q3KysvVDBhYk0xb0lwSERIQWlXSzdqYy9YWFlIajhVL3J2VEE4MExSZDJITlczSjdPUld6NzZYZFpsZk9DcmlaQ0tSb0JsallpbGtVYVU5K3FtYnRuaDNxQVFUaWtTSFBycWpXRmVuRnpCVGlwMTZrd0pqeUdCQVJmcys3eXdlL2w5MWFHaTNZdVdVZWNaSTNpN1pLNzJzSmdlNWNLbDNvYW4yZU1LVGhXUC96d291clNwWGc0Uzl4L3VNQ1F0Wm1EdGJyb0JYamVaUkFxWEh6dmJUOVdMMU51VDhPVTF4blJrZTFvZ0kyMkVTNFVVbnhQUUtIcEZtR2JnVnNwUi9JQVNna282REIrTU5oQmNTYXVvWDU2VVBsM0plRFBjVFU2UlB1aW01ejhBdFNKMEpQRm5YK0hxUDlnYjBkbzFMSlcrR1p2RXBDS3VuZnkvbDJpZDF3a1c2YU8vMzdvRlJPcGw4ZGphNk9IeVB4WnEwdmpWNVQ4NGVBcVlqL3ZpeERqSnN1RDV0TU14bFo3TTNFZnNucjNJZkxuemxzTFdxWFV1MWJyMlVqTWprNFpJQWFvN2gvQmY1ZTZrb2hkME1pdU55c08zZW9yKzhqL2hVbi9DYUFUTHJnK2xhREdrMXFwRXhibFFERlRCZW90TUtOcVd5RFZlQVNVUFlOSEdycjE5WENOYWdpMDg0WW1IMVVqQ3huSEpjb1U3TlhGYTduNmJtVDVzVFZERjhHZ21pLzhzVno2anNBQTdvbGpidDJGY3BSSW1jREtmeTNMWnlYMVh3cXVxdjliNHJUUkE1Mm45cWVCNDdSeFoxWURiRC9abEdCaldFUElqSVBTbkRDL0F0SElaMnRXM0c2TDNwWUZlcVNTTmk1Z3FrSS9qZDNTTGM0ZW9nZ3ROMWRBT1pmeEhOb2tWMHRmR3ZDQWdTVXdMVzZIaVpxdW5nVTFwOExZTFpDdGpPaVRkZ09LK2VBK1FYZk43aXJsUm44Y1k3VTQzQnNCYTlQMVJPOTBVb2lBUk1zWTRic20xK3BFTjRrOGF5VEZicEFUMzBtaDl3YVFYNmdEV3dsU1JSdXdXTUFielJONXQvWklaNDNaRlJNUllJcWRGRUxuWUpSWEtWb0dhQ0wwNnRrQmpzNGNubE5hSVZFcXF4andRQ1dVUUw5aW01NUYreEx0U1Rld2VkdGxSKzhVd1ZzYTRCTGg3ZEhVczJtc3R2a0Y1Q0UrbUVhTkpRYTNtZmJNejJmTlhGZXBMeTIzN2hpWTRCaUtRNDR0MWhxbzh6UUwxZlpRZ21tcGNLUWF1MTM3cDhScFdkVEY4aWlCL2czYU5IcmdMc2FDYXVOMGRZT01lRHdNOERHeGNpUUl0VGtsSVZwYkRkWG1EZWdpVElGQWZVODVNT2h0RHdLV2JuSGR2NWgvQWNOQy9ZZUVvd3NPdllteXNYU2R2SW1yREtsank1L0tSalMxMWY4OS9aVDFibUFYdUgxendmUlJxNHJJOFNPSTBlUEZqQWs5L2VDdC94WHZrZTRvVGkwcnFkUll0MzhmbTdzeXdrbEdmdWErMlp6c0ptTHhsREs5b3RwRU9OcWNZS1dxYVAydEZMTnVHN3hEUVUvYzFIbUZCZTBIQmZ2WTFsTXVDa3pBODNhMUljbS9veGMxWTd0emhiRTltS3lzZXg0dFUrV1ZkMDlnWmkyRlVnRVUxSWJzN1FzVWR5ZXd6REVvcUpDNjU3b0dna0JiNzJLWE1IU1hrYWVXRkZ3cTRZVWJ4WVVDMjlSbFZ1dXNXeTZoL24rTVo1anFqOThaWEsrdmF3SExHM25Oa3ZzdlFQRHRkUzhuTkRsNDBrSWNKOUNaZGcrODJzU0FOWmsvSUdXaW42c3FBNHhsRXRBYmFsQkFYc01xN2tEdDA2ekppY1QvSFNoNGZhUWtRTEJLY1JJNnVJVUFGbDA1SGpLNDVwSlk1aUxXREVUd0FLZzlnckNsVnkxMXQ4QTgycEwyczRKZDVjYmdMeHdvMTV0MWpOeUM4UXJFb0NYWnZRYVZ0cDVxaUhmNzRsZkhxaXltdjJ3QjRkbUFJRXJPaGtxQzh2VzRVSmRIUjAzQ1FQSUphSjAzSzZ3L25kTW8xQzZsSGZabmJJaHNXei9tVUVWOFpKNGl0VVc3dG1kLzRlWjlYQXFzUCsrQTRHQjUwdHJSM2FtZ0FGVFNpN2F4UWJDM3g2RWpwdzlQTlB1K2dOQ2Evajl2S1U1SEt2NStRMVdwWHQ1dFFHK0dSNmg1cVFpL1JQNGY4QnpuYlAxSDdNZHBGTVI2Q3BGTUN6U3JoMDFPQm9ra3krS1BkNXlKZ1E2RnFxUEV4aWtxbVlIaDFONVpueWpmZE81Uk92ZWZnTmwweXh5eTljZmI1UDV1LzBBdDFzbTllQzNHeUJuY1JnNm41cVVtb3R5eFlseld1UTN6cGljMHZEOFpqa0lTeFN0ZVNaemFMZlc5SFFKdjZsbm9oVnpVV0Uvd1NzWlE0eS9qZ1NQM0dyQTBsTnJqRWpFYUNoTzEwTno5TUcyQzhsL0Y0UDhuUnlJaUVremZZVEVnMk5zZXBqaVQxU0J6SlJFNXRIeXlzOXlqUitDUiszenNVcjlueVhLdXQ2Y1VKaytzYTJCMmwzcUpWVkUwWmtUb0VjZ0pjWGhBcTlvSG1ramczQmc0VTlMaWRDZjBUMHVVcTBPNFgzdWJwYzR5MzZSWlVLOEZEd0tMeUhudElwL2lJai9sWUZWZk9wZXdmTDZRaFlVdnhiYnZTaTFQc1VVbm9FcVNEcThlR1BJUE9QTUhQSnJoMEJKRHVDMWlVVWZlbDdzcDNpZmxFbVFmek1qNmYxTitTSWhuU00rZUJ5NFJGaU1KWW9SMkJZM0NPR2ZlZk42MmlkTnFtOTB3MXlOSUY4aERxRk1GUmVvMUJYdk9BYVdwd2FzdUdEcWJ2NllpTzRrTnpteGJlWm5kZDlEOURReW5sZFRQQWFLTFc5VDFrcHBsOE1PMWNPcGNlZ3RaWlpjM0pvcFA0dURSU1hNb2pQbmpqempWOFdtVUFmeWtCTFdJeEl3ZkUxOHYrOTlwK0E4cGxOdzFVamQ3Tnh5MHhCK0RHRGkvYm5nQmtzVmJGbEd1QUcvaCtHNVZNYkhVSkIwY0F0TnBUT2JRSHZKY2VOczIxTmFMZ1FsbU10K2NEQVJSb2YreXVOTzU0NS84bkpFQlRrczR5T3J0TXhoeEdlYk54R01VK2FlN2NIZXZ2dkRYT21Pd2pVKzBXWlZqQ0hPUzNFM0hjYk5yQmhva2hNU1NxSWhiU0lFaTFWRnJVUWVJS3JvQ1daeHZmaU43T2xCNVJueTgwRCswSnVxa1liQ2pWeEpuS3plVXFGalNuWWRmVXVaU1o0YjFsVDBOamFwWGE1Y3dIZkZXZlhQbUk5WWNBMUZhcDRLQUZUOExyaGt1MUg1YnM3V3ZGdXlaVFpSSUNyUzJNRHp0bnN2eHNXNm9sa0REUVA1ei9GUGtNTlN3WXlTN0g2NVdrMStsWWVJd2xSMjdtZk5zQThyS3oyMm5iUkJXQWNWc3p1UkJOWlo1Tk91RnEvWGNuYVdJbmdJS1VGdW1QbXJsUEJFSHNWODUzRlBOKzU3cFpMdFJ0VW5DMU1RUDg4QWtidlAwUHNYQ0xxd1FxRzFsZ2oxK0hJSlpKdk5CaDU3RmhYbGNXVmgwMTNibmkvamtmZFFSWTlFZEo0YkRxVzk0WXlQcTM3emdCb1F2ZGVYSmVvWklIckZyTWxUYWxpV01EbGowTWVGeDJHRzgxM3ZJU1JHRytXbi9nY003NHRXMXk5NjNaK28zOVZ6Uzh6R1dvWXpjbjRLdXNEa1B5bXJ0Szd5SkQwUUEzNkNuZHArcGZtMmM3b3Bmbzg1clZ0bHp6NWN3LzNDSjBIbi9GUGE3enNxbU5MMWF4cEVZb1RHU3pCYU8rYU9aSVc0Zi9EanhjN0ZZd2VLTW41V21teUc3dDg1VTNSQjc1Z2g2SnM3WGs4aC84SkdtY0Z6eHNPRHRNNG50dHEzMEpZTE1zbHFjZEpzaVBQRytRVHRCbEJqTVVoeW9Gb1BQUVBkNHpuUUR0VXhISE9oSmFFNCtUODN3TU8xTUdzaGxqL2oxNHpiT3ZhRlJ4VWN2NWZBZnhVL2dKeFVySkRtVzQ4Q2pNaVNKQkw0QmU3YnBtMnVZU3JEME04d01rdXhTY3NPWmNVZDR0TXBnUFRyTTJaNlFoNytETmE4eDgvalVuYmwydDIvQXl5WmxSeGx4NmI4SlJjSnRId2RORjNNV2JBTDBnZmkxL3E1L04wUVpJZ2wwYkRuSmYwckE3NUNUNGc5UlBUbCsxYnZtSzVTdEE3dFpDRHQ5ZUszQ3hXS0VBSzVWQlBuOWdMckMxeTNheG0yZVNRQlRjYTYxUUZHemg4V1hnQmxUOEQrNlBhVjcwbUZjZithb0xpbW12TXNFUnpjR2U5d2hYbEhyUXB6NUhhOXJ4UUtNOVR0bUpGZWJTNlNzQnRaSzBvcFQ2WlhkT0gyZ2pjQ1hjSHNnZ2w5c3Z4bFhUR1ZuWGdQdGZKK1RDVnpaRFZUbVkwUzYvZ2lYQVBGaktjSjZzY3FlKzM1ZjJ3dXdUQnQ2c2JjSzVSb1hRV3Y0NU5qRDBibXdtcDVhS3lXMVAybmdpNy9wY3pXREM1UDJQNWtwNVZnbFlSMklGekJINXpSajVsY0x5K0JPNC9YTkJ6Vk85ZmVMTittb2lXY1M0QlNzODZDS3BqQTFCVnMwYXNkOUNleE5zdE0yWVFGREt5c1FITmY2Ry8wN0tyY1Y4MU5NQXdqVGRSNFhhOFNFWVdBdXRHM09wSkhzMmhqMUpYTFV5OE5vRlByTUI2UFJMY2FuWitZRUZsTUhhYVZUMHl2R1FYamVxQUVIMUV2RmsvSU11WGp0U1BuQ2g5MW4zQ2tBQndHSzZib2UvQ2dDaGRBVXF5S2xLV2NsSncvZ1hiREo1VkEzcWNzMlJEUEsyb0YxdThJRWZKdWhnUDk4V0tUaXBRWGs1dHo4WEdBa0lPLzhiYml4aVFmd05SSjJyeng3aE1JVytUZm1zUU5NQ1VJcytEbTkvTlJ0R0xNa2dFU2VxSG5BY2hxOXpVR1dvQnY1TFNCV3V3QVF6MmlTc1ZaaFcrTHNRM3BIanZPNUVCVHV3MHpyTlBHa1pmb284eTF5M2xPdXZkb0RNZzg4RVVpSUFWd25NSUFVbCtOUFFMcUNFWUtsb2I1REpTRmFvWDdDL0cybTJrUmNWSTBIZG9hZFdtS0hGZlRsWU11UEhoUUp1cThLb0JpcTlPUk9rNTMrc3dEQ1NERnU3RmoyWXFoNVJEUVJpWjk4aENZcUxPWkVxUFhYM0RsSGVaR3VKN0ozc0FVcDBucmc3YU9DYWhlZkx1QkdhWENrMjR4N3hCWlZLVDd4NGZ4ZUI5OGNoWEkxKy9Ta3RHdDh1Q0x1TDVFaENZNTh6Z1hTZkszZEFUSUZEY2NGNnU5eG1HV1BtRk5wNGVSOGZ4NEdPQmhpOWdUUklWWm9wdFdUVGpIdEpFNHB2M2lhU2FOek5NcUxLWXFuei9hYjNxUG1IZVUwY3YwV1hxNWR1cUg0UHRoc3EzM2pSVjlQRjRrQ3RGMFJPUU9CYnczcGFTZjhRMjhmRUhRbTVnN2JEbjJCV2Y1TjhPQjFBNnl0REZqL2JTSFJDVVBKOUV3S2hRM1ZPcGtBeDN1aXRuOXgrZnpLYWhMZVY0VEp0NFdvTG83dytUenliL1lMT1BreFN2VE5QMkh6MEl5SnJiNDF3cHV0U0JQbTRqMWE3WnhlRDZNWS9GTVhFYTV4SDJoRVdFREdKbmdyU0EyZE5jdnlNNDlKaWVVYWpUNHlLYVl2ektmeVNLbDBHdHh2d1pTYWMzSFFRYWZKbld5c3NKUXJHYTVudGRsRFE0TGVaczlZTUpGVkt4enhBKzBzSW5BL0VqTWdlR1Bvak9VdCtYeUcwcHZ5NG80eXNweWVVN2V6SmVVT09QSmk1dk83RGRTRmJxNkU3R0NrVC9heHVmRVR0eDdKTlAwUkc1TDl2T0plL2UrL0VnUWoweG01bnNZYVljZXFtN09YbHBkcGN2MThOaHYyNUt0UFNRYkFzbHhCRWNvcEpxV20vbkhKMTkvbnFSU0V3S1dsVjlvaDFBelhXdit1VDVCTG00OHlGdW9ZNjRUczJQUkxhRFVEK1NzRXdWUTBLOHRGRTVPaVRFS0NLeVo2UFFtQ1FPNE92L2FCMFNRYWl2Y2g3OXlhU0UvM21KT0l6YkEyR1dPZEw1b0dzTkxzQ0dzR09HNnBjNFVQUCtydXkwUEhPNm9HSlFDWnNmdlh2NklEaUNBMG8yQ1JZQVVnbzYxU1dBRk0vdVRydTF2c2FxVmxTOG5VVmkrRkpJVCtmR1g3aHhJYzRkb3gvTE1nVmFPdEZBUlBRVjJqTC9hZGtBMmwzblFyYU9teVR1d1BLZkU4eXhOQ0VYeStrUHBQN1VoWlllYlJNZC92bmJBZHpoOGdsUlNyMFhpcVJKYm1STStTNWs5WllobDltUm5lTDZxaHFSMy9DK2w5NU1DZkQvaUlmTXQrU0pkOTRGLzkwUWh4ejlpZGJpNDhGcjc2MlNMNnNlQ3V1bllVaCtPRXRta0FNREpBU3RxR2tIcFVyN3phS09Tc1gzWW1ERlAzNHJEQnR3dUoxTnhBZzZoZVR4MkV3d3gwYlBsSmx0SHpVdm9wL0c1QlNuVkt2OHUwdk9sOGF5U09BQ3BBS0VteFUrUkdNVDNxY1BYc29LZCsya2szN21tMlpqN2JFUzVuQ29PT0hNNE93VmxIWHVWWFEyYUNlczNWcXV5dUhreUNrZ0FFcFU0K2VKQjM4WXJLNE9OaG4xY1pjeEVpalVLVURITE1iQkRLc09rV3FPTFd1WXVUM0REakpQRlN0NytVemZ5Y0hPS1lTbmsxZ0VWYS9wbXY5L2hpWlFuS1hVUFhJWm9zci9WSklLUEtWNmROOVpReGgxNEtDaUROQnhGc1Rma09CbnlyWHdTTXlOVTBwMHlrWVc1RUU0OVNoOC85VlhJUGJrMmU3TlBWQ1FwbXBVK1VyK3JBNm1BMXlpK2ZrNklPUlNRcVZHZ3RpTUZsbkRsS05IU0FrNDlSd284ejZUNHVrVEd0WFp2R1dUT2h6dGgrMzVRbG5DdUp3ZUxNdnJJMGQxY2drblBITWE0OUw1OUFJT3JhSU9FRWFyRGFheGFxRDFPeGdISVNoSTJPZjBmeDFoVWdkSUdNMUZmSWFwT3hNdS9jdXprZzR4aERzY2ZMbTlZSThhN2JDYmhlbHRZNzFIZ05DYy9DbEdVVFNMVE9GTlNMbFdjUzhZd0dETG1sSGFhTFNKaWdZak5TT2JFakVJWFdTNjAzMHl6N3pFalUxQldTUk1SbW1GSHZLRW4vT29WdzI0TWxKT1ZHSkpVcTBPV1JMbkhRL1BiTGNnTzNqS3h1NXVLUlFuSWJsQTFaZjI4YVRYbnFzNGtyODA1YnlXZ082U25Ed05pVWlHMWh6cDFaNmFxc2tjUFIvdjliSTNDdlZ2S3ZuNFdRZGovMFRwZHRpNWZLYTdPeFJmMUdQMTQ0SHl6Nmlpa1hvWlkwcEkwTCt3ZG4vTVhuY1FrUFlhdVoxZVZHVkZ5TmJpajBJWnByQ2UzcTBLeWxVSERXN3BDOWRYR0pEQkhtajQ5NXhWMGhHWFl6czhWUlJlRWpPbURNRzAvMGpXSGhYSThvZ2J5SnNDeTFJQjNTYm9XN0NweW02ZXo0aTNIMHlxWE9ISnVUWVdnaE9EY0JlWU52TVBISGQ3R3FTQ2UvSUd3M3JuVkN6T3RBcjJEYmhHY3llU0w5OCsrdDZTYm5VazZsTFN3ZS9DL3FucjJDWWVxR0h4RFRjU2c3TUhZZ3ZRcmJxUkJvQ3ZBZWxCTUVXNHl0c1cwVVRyd2M3U2VKc2VPNndoVituYzFGV3NtNC81aUdDZXlnNHA3NE9haEdtTDhKbjZ5ZUhTLzJKWGlLT2N5OTB3aTBtTzNUUEZhOXpLUXJVbFMrRlAzUlBRYlloYWZQVHFOekZxbG04Rzd3d1VvWE5ja1o5RE42NWtVWlVvMWxsdjNvL1ZMVThHR2FJSW1ONTRCa3FCM2ZNZ2dsMXNTU3Z0YlhkelBmVkxNNCs0M0NVa1RUc0RWUDNwUFVCa2R1L3doeE5UUG52VStLdmp3V1o4aG5Tc3BFTitFc2FwVHhwYjJnODBXTm5la1QzMmFwZnphRzZ5Q2g3RmFiSFVQK0NjOWd1SzYyelVuQUpBaEVZaU5KWlB3Njc3a1RhQjMyakhDVzBUVEgzczRwWGlNVEdPR0M1M00zYUM2U29FL25SZ0FJMjJvRHIyZWhiMWJueVVNd05TNXM3cjduUVdobXpERDBoQTkwT0ZPazVGbkVaaXRJVkY1L2RrR2FTb1JMSWl5OGdhTVZtbUFnRk1aNXgreFBEVmxMQlN2cmtYdHJFT2t5N3dKTXNkVWhOVG81NStwS3hlWXVOYVNNL1AzMjFGK3hEdWc0NC95cmE4R0k0ZWNDbVZldE9UUHlDYzZjTFphdjk2M3JGbXpDTnVaMC9jWUNzYXliN2pHOWNDenhTT0o3djk3K1pla3BmOGVxcW5ZWEJsdkgxYjBVaWMzR2lXcXBsamlkYTZNWkttdElvN2o5cDBPQzBuZnEvZFhNUUR6dVltMkVRdWpXSy8zMzZscXBhM00rbThtVFUvWVVzZzExSDlnWXpVZC9vWDJjb2RiY2RXRkpxeGVpSnNVcWRNb284NGVLSUUwSWRucG1GMmk4R1NiaCtLNHF3MmVxdTRCWSs0dkpSY0FRcGF3WEhTMG5uTmcyRGU5NzczZHdhSEtjL0s4a0hqSVYwdDdiclg2K3VScjFOZUUrRUJ6T0pvMUFwVkRscjlJdUtyTThuT1plVFNXaXQvVGVhMFhDTU5uODlsWEpXc0piNWxMNnViZEZpN2o3SzNXNW0yTFBaVC9QUXcrUCtJRXJuM1JYRkZkTmRhcWc0QmpzeGY0YTcxTWlrUWNoVDF1L1I3NHVuVXNpNzQ3WXB4U1E2bGN0QU5KbndPWno3Q1c5S3NadS9PcFJ6aTVLZFAxMElub3BwcUNuaW9xRW9KM2pOaCtRbmt5aVdYbWNUcy92ZFRveGcvNEFWc21VUFRZcWVSSXJhVGowM2hRdllQZ1kzdEhadEtsSG5WWVZrZFFnV0NhTTdXRjFLVGZmclR4bU83TVVmaGcwZEpLbmx0cDF2VlcyZ2dDSnlkSTI3WWNycGtGRi9zVDVoTGxJeGExeVBuVVN0YzhUdlROazY3a05ZVEhYcjVnV2x2VU5YTDBEWE91TEJlUFRSUEh6T0RLL1hsdEZPRWlSYmtQTGFxWUlPQVI3MUxTVDEzQWRmME45elNmRll1cmg0b2s2NlNpS2tab21NMnZpU2VzTzVWbm04TkM4aytHSS8xanlUYndpcUV2R0xuQkFOaGR5RGtWbm9QR2d0UlRKaVk3cUlZWjVNeXRqdFUxa0djRUJKTWRkcnJveFZEdExvcGlWRlNEdm1tU0hwdHlYZEFGUWpxZEZoRnFPNkovWmJscEpBRGpHQnI2VENDc3R5bEc5VDZhekViajArNGhMUlpwY0hiYUxrQWlzV2xOejM1THhOL3BmSmR4bDMzTVFwelNHVHp1RlBHWkp3T2Y4dHBsbzZ3M2VtOTFYSXZ6N2JHMFFGMnFqRXBOQ3hxbXY3RXFUR3lPZmdUZktUNmVsL0wwTUdOVjRtY3N5bHpVMFdTNWU5emRSaWhPTFM2b2Vnc0c0eGx0ZHlHMUtFb1M0VWJLRHduR21pc2hoM3JxeGxlQUx0Tkx2emQySXFiQnBETUU1T0Vkd1p3aTBvcHB5NzNXcTdSTmFFM1NIRkVTQURJTG9BZSsreE42bkV6VVdseHBFeDRTd1BZMTk5eWswSTdKUm15NHByWTBJUEJxVjEveDBVUUZPOEtCc0ZxbEhrczZmbEFNOWl3eTZvd1IyVzBncE9WSGdXeThycXBUcGsySEU5SkVpTTFpcFMyVkdRQnVXT2pmcnYzMmd4MkVJWkxGT2ZOdW9IcFNXbnVWTTRSMStEVXEzUGVHdFFDaVo0MkJqTGNtT3dHNzB3TVdRR2swR0tUWHJlMXdoK3hkTERoNUNSN1hxaitINlpSdkpFN1dWK29xVElvSVZJQjd3V2I0cUlDL0xxMDlLRWZ0eUFxTEZMOUlVT0hkMjFrVDV1ckc1Y2JDMWg5c1dnVFgzNGtDRXN5ZnpuNVl6aS9KVDhmaHUrdGE5Qy9wQ2JqdVVNM0l0RjNFeHFmZExRTm94WGRZd2xIY2cxV2E1cWlkd1lsS0p1YloxRnY0dWJHWlBpZzcxV04xRllzNy9hNm5rVTFqUEtKRjZoU3Y4alJFL0d2bzFMTUlnNEgwSzBwaFVhV3JpeUlJK2t6SU1JWlo1eGJVaC96Zm5EczNkU0xPQ2tXN2VKTTZ4TzZhQUR3cU9DRndkR1ZEQk41bXBmekR2OUt3ZEM1UHM4a01lZTB1MmE1b05jTXZWcjNxYWdtdzlrWVdRQnJGRGozcFk1UlJ4R2IrbklsSWtqZVlud3ZMbEFsRVZjaTA5bmpocGVoWEtJa2hsbmZwbHo5Q0FmUTdNTEU4TVZGYVpDR1B4VHoxWmpGR2JZNVRzNmJVcS9mVlhrUzZwb093Nzd0aDNOTGJsRW1XTzJMcWFBYTdlYWJsNE9PQUg2YkNEOGw4YWVJbkVLdjNnL2VzY1d3NmRPV2cwMTByQ1dpWjVYdEpyUEY1c0lvY2s5NkIzanBLRlFETGhQV2taMUpyamVZZ3dFODFPTlI1Z1pETDdRdVliMXpabXRoSGNNL09xakRXOXZzZmlNMTJOcm1PRXBlbXovVjBudWJ5clA0cDNhYTVHUmViOXQrcEYraU9RVkx1MmtQYWg3TnRMQjk1aFU4Nnd5Uk93a2h1eko1aWJDMDE4TXM0ZkcxaWFRR1g4aUUyckhkTEVLTWR0ZnpOV1RPQnVtdGlvSFRFcFpsY1pPbGdJdFNBaWl6d1RBdGpMZWdzdmRrdEtGTkQwckNIR21CQkFyQ1B0VEZoYlp6dTFUTTVIUFRoVnpEVmdvVEl4WGxITlFnejJENWNQbm5IMFY3Yk9idjlnZG1DTmhnVnp2V0laSjdlT1JwVE13eFB1WlZSeHlrYXJISEd2U3hSNCtzZE10QkhBakpJNWNHQlI1RmxhQ2QydjdNMFVEZ0JJQnUvaUN1SG5NVWRER3NuWEJYMTBFalB1ZHNseGcyc0lMSWJUVElVenNTdnlHa0tzOGV0TEVjVWlVWnNkN2hSY2ZvUThQNVltZENvMjJ6Tzl0VGtZOCtoNlB5ZTlNZXBmZTl5R2wzTS9kT2hoTGVERlkwMFJXTFEvYVNhZ1ZRL0RNWldnekRFOTc5T0ZiRXQ0MnhXTkdJSS9FQWNBeUVWR1J0YS9PR2RkNkJrcktIbVpjNyt2T1FDQ1N2bHA0YVhrN3FnVWFLVUoyWXE3TGl4cHV6blFXTXl6QzJtL0RkSWc3L01xNXRJejRjVFNadE9CU0FKWnBHZk41THB2VjVQUXhSWGVoS3EweHRsU0VFOGlMUmtMU1ZZRGMyME5jNkg0ZnV2SDdudkpTdzdBOEMwYVcyZHRDbHpnM2F3Ym9GdVdMd1FLNzRnQTdpblBINmh1Z1lFcUhFcUt0S2lwb3dOb1BRTU0zZzMrRk5aTjhoM0w1enJzb2hUSHpIWlhvVlZsLzMzeGhsQ0FMMHB4dzFab3JabEp5Z2JaTC9DWHFrL1ZwcnZ3WmlJeHlzV09PSXkzU2liT1B2S1JUellhTGlyblBKa0RWQ3cvamZ2YW5CdDAycWp0dEVnYzdqK3BvUEFpTDFxTWZqL1hjb2pCMnFySUMyNjFKU3FhSnA4TDZiQUptTUtMVGhQcXkreWNHZVhqWlAyeHZrUDFwTk1CMFpKYVNudHpRREt3MUcwNkRYSHdRT3A5d0Q0UlVtaGpDUm9xT2FtRVc1Y0ZiTDZUM29pdTVtMHowWk9hZFJOU3hWd3VRcmxZYlRzckN1TUdBRVY5VnVsZHh6ZEFuMzlCMkppb1U1Tkc0eElZRTNzYzRvYzFmZ1VQRFFEb3d6WU56RzgvNkFNdFVtQzh6T2F4RENRKyswdjJwZG9ZbFppRDFvbFhDWnlRUHkvM2RnUkhhbnBaUWxLdFl1djVRbTNyR2dFUEhBM2xUekVxbUlCT0lybEZRM0tkVEg1djlMY0V5QURhSzRTL28yMWk0N2gyMHJKdXI0djVUanh2djVTMlZzMkNZTlcxUEh3UnpERjZKT0l4YlFXU3UyWGJ3bS9sU09DTHpHUVkzNWJxWmk1MmtUdThvbVNKRGF1ZDZEcjh5MUFIUks5KzJYblY5bWJoSGJZek9VYWt2ZGgvR0FIZmxtYTZRZVZkc25kNVJkWTRtMlhaRkpCbmgzdWIydXJYOGkydC9TM1NBRUJ1UXhzdHJmcnFqV2lWMGs3cTR1TEZEWG9tb3FvcDd3NUVpV1d6N1BmcFUyQzJDRGhvWmVsTHZqMXBsZGorL0VxbDdJNVE3U1B0Rmw0akRzbCtaRnNvcHI0NUw3TXZDKzRNMmZWMkc3RXAwNzJORGk2SjNsRDdobTdvL29DM1p5a3pXelBDcml2OVcxeWlDRUdlN3N6akRMQlZCM1l4dXI3U2lURXdBSTB6YkthQllhQnRlT0t2WXlsanQ5MFNBUGt1aUhNYVNsMTRmU3ZOc1Zzbnd0bEhSb25BUm5Wc28vTGVVVFFaR1FzTFJHOXZnUmo0bE9Zd0xnaHd0VmZpWWZVMkp3c1gyZzVCK2xpTkM3WGRiUTVoc201OFdsQnBHejhyRDFlaFUwSXVTM1ZjMU42YThRdmF1M0xzcDY0TE5UZWVBOHZXWDE2YTcvQ2VNV0grUkJOdGdiQTZ3ZGxKTlc0RTE1Slhoekw3WFJ6Ym1HM0s5YzYwaWhuZTVnSlRTMm9xcGx1dXRoN3VuTjl6NFlydUN2MmE3NC9IZjFxcHFDalVCTVZjbG0wM0RUTWVVNnBWYzd3WFJRdlBNTEVIU3gyYThsSk1TbW1aNjJNdDNHNVFuTzVMT1U0TUFNZkd3TUIvTjZlbmFRMGM0Y1dVWUJFNEp5bTduWlp1bVhPQWdBM1NUeDZlRGdVblhXWXlIU1Q3L013VFRHKzFrZlpIVVBVWGpnRmJURWdBVTVLbEVKSDhBVlZZbG9wVDhRKzVPd0RyUWlFRGlHZDM1bEpJV3NteS9sSHBzeUxaTG5pcjByekdVdnBpdUt2Q1htRjNnZUtZSXdsK3haajVIalNmcklvUDFjaXhEQm4veGQ0OXN1MHBsb3M1L2pUR1NNaS9Jekk4VG5JTmFIbTR4K0gvdFYrRHdUUVEvckhCcnVyV3dRdW9oOXo3RmNIMVc3UU1YejB3UUNBRTlHYi9POC9Ld2U3VTIySzJOc3dVWnRCQmNaVzVLeTlsM01qZ3ZHYVBuYkJGM3dOcXBuOEtqck1CM3pSNVdSTkVCc0c0MVJQZXBjVE96UCs3S2pQMWNDVm1ZcXJmOTk1UlBOS1RMRnhyaTBuTE1wRFlxSXBENG1Ha1lzbnJWckh2NElkd0diRFp0Wnk4amJuSGxkdjljRTJCTlhQV29tM1kyemhtdmtuWjZ2RnU3K0taSGFOS2VuYVg0cDBRdlpQUk9XdjhJWDVOZmwzcmZpa0NVYjViS1FjbWxtWjkxenhQQWg2bjViaDJFdUZWaTFjandybXVXUnlmRmgzZm9zM1RFUnh2MEdUSjhxMUxKSThYRmU1dDJ1MGUrZnc1VTBFb1lESlpRcUVKcDBlU0E3UWR5NE5CRG1wUTBFUDNGSi9NSzR2WEIyRUFnT0tMYWt5Vnh1bXFxSVdSSDNVY1lYek1KYVVKc2hJdzZEdCtmMHlkWU1acFRPRGxXeGsyTWdSZU9SeU90N1dsYXlhc2FwaVdhckJPMjBPdFJ5eE9EOTg4RG9DaXJzYjFGUk11dTFwcFpnQzh0N0syb0VQTjVPYVJrTzBXaUNQRnh1Szl3eHdZQ2kzNGdJWnQ0Rk9kaUtwUFlZVWhIMkxUSldrdlRMaVZ0UE1iVjJ3Y2NSU3RIRmkyRVk5TTgzaG00ODQydWd3K3lLTDlIdEh0YzBLL3hST3RBcnlKTHJtVVdnUTB4S1dZeTBJQStjaG41YS9jUUR6cmVPVUpJQTdiR1F6b3RaclZ6bTcvdGorUnNVU3NVVWluWUZPZDVPWkhCeHZiWmc2UWdjcGdwdFU4TUhzazRLekNBOVRpM0lhOC9JQzR0RmFwZGNLeTNqZ0U3U2thWWovOHBRamRTaSsvdHkxcGZsb3U4TEI2YjlHb1FKa0hjbWtkczFCTUN2a2twSURSbU85MnNQVXVnUFpsWjczM01JQ29xcmZIakNNTmpmQ21UWi9VNG9keTRvK2pLT01SeXdXYXRwTVNzY0xXeXVGTjBLV0lVc1BiMlZsTENFOVZBbFVWaTBuOXRDYmsrSkZBcHVUd2tpRW9KQ3VqVzV2TndiTkN3dUZOMURvakF6dnkyVjNTeTZHaklOTnJBYmRTYlF1N2FYeG5LUjA1RDdHZVZXVDZRaytxQ0pWV01Mam80Zzl4T21TbGhiWnFDT21oem5pUVA3S1J4YTFBUjArK2kwdStEWjVxbjYwUTBXTkNlc3k5K1ZPeHJNM1phTkc0UE1oVWdaenhRYmZpMno1Z0txYnhLVFFkaXZRTVF2UUUrNzhkMTRobW5IRzRTRFFjS1k1bFpHeTFLbTJWeU8wU0RockVvZjdYaEJnU1ZjZDdqdDd4TXJvSzg1VHVBS3lneGhvUE1VZUM5aDB3Q2F2S2FTTnRRU3BoVUJGWmtqZUVpNGcyWkwyaXR2WG9RSnUwMFZseFE1VmVVcmVXS2dTM09jSTE0bDJ6VG1ZZ1BvaTh6VGNPRlYreHAzYnRqNHlidmoyTS9pdDJtN29sdjFsQlZBYTJWVXBoY2xXN1RGUVFjQ0Njbmg3ZkZNVko2Z2JzbG5VNEFydEtFcG1Jb00yd01oYjUwVlFnYThnU3k0M2E5UTZNSGFZdXMxTjJObGZNMWd2TzBWOHBpbGdmVlNnUVpZTkJ6T0dRUVlxVXMrL0ZmZkwwUFNlN1FUaVB5UDBwUnVsN0N1MFFYU2ZmQWhpRWI2elN3UlBoRnhMR3crOHFSdWFhZVNJVUJtTEkycC9yeHR6a0tJaC9qTkkxL09wbmxSa3Q4NERZSWhXZ3JwUTdKdHdhd2JWMDNiRkJpTXYxbytWQi93MEQwWjM5dVovOG0wYkxFK0h4dDZCZ0pXNk5TQzA1ZTVsUGFGcWUwdnQ3d3p0QWVQays1YVdYaWFoZUtIbFl3Nkt6WS9sejRjbEpnNEJHVEhVczJveWN6dGRWWTN3c3hzdC9YWjB5M0J0ME56bXhycVBmZTNvOG9ZUXN2Qm0zNTZjR3ZMN1JKcGcyakdrTHBxVGluRmVBMGc0ZE1ObDhYMjJVSDhyTWJBZXJzZDRMVFZ2bXhMaFVTNnZSbGI4bVJXeWIvUnFybDZPUnhCQ1dZUnRtU096cFJwY0I2ZjlXbyt0Ny9DR1UxTVNkczNnMXF5VXlzQlRpK2t0K2s5N2dTc3FnSGJzRitYYzVBOVpubGdtMFNtUmIxWEl5MDhBSDFsUkgwekt0N0d1RCtoRnZOaVRveTA4WncxUEpsdEZRaEJIemNpQ0dCVjJaZ0YvMlVZVlhYL1hBVVM4YURaZVRET2UzdkdMVmYrcGlsUEF2aXlrM3liK1pNR0JGUndGUWx5eTUzcytFWVd0UGFxaTAra09oMXdWWWgwYmh3UmE4Zm90L3N4UzRreTZJL1VmYS9sUENKS0pUSFFLY3hCM3Vnc3FnZDZQR1BoTytIUzd4cCtJRDZIcmpJUmx0b2dnOHU3N2ZpVnNlQ2xMTytCcUN3RmxVODJ5YmxxL0lGOEdxWVEzVWthQS9vVGhDVTZoTTJ4UWdvRXlTd0xLMUgrUzRKcGVMZjZqZkNLMnNFU0lxN3A1ZVBlVVA5dzNJL0gzaU41bXpJUlpvb0gycTVTbEF2MC9BdlUrc0R0bmJTOEhkYVFEMFI1NjZlc3ZmWGhxRUloTUplTWlBNjkwdFlkc1dCa2xvc3E0ckNyVXoxWHhWQlcreFdUTWI0bXpCaWppcTZwMG9lelg2ZkJUK0o0QVBwOThnYnNJQ1NqbXJkaUtvYVZZaFVnWG9xTkdHdXVkUDlqL1FmU1pPVGxLSDBCbGhnQzViWWZ5RzMvaVhQUWIvd2hqcXJva1dXRjNLeDY0Y1hUcHVGVGtyTnlhRlhxelArRmd3SVV0Y3VhTzJMMks1K3Zta3BONzFUd2VSbHlwZ01VQ2x6aFZtM3RKa3ZOQ1k4TXhDUGszN1BPWXF3N1NCZmVObVRNRHdYUTl6NW0zTmZ1MERiU0MzRGQ0aTBGVU1TbVNuMHNsYnNKZ3g2NG9LQ2NvU0lRbGhEWHNSR1hPTXZPSlFZREhHNEYrMXk1RGd2bUUyNkpmcWxOak9oWUEzdnkvRktwNHE2aVJpeXJvVXUyeFo3WkpxNWxES055TEFJa1M1RlRuSUt6NXJyUFRYVlkyalh5TWVwNUQvWGN3MGV1WEY4My9rZkJRdmZsK3Z4YWoybnlLV0xuTlI3NHhYeFMwd1QyK2F3OUhjLy8xcE1WRk1oUzI0aWF4dEY2Q3F2VitYNkxSbTBrbjU5VGVYR25qZy9JRDNTSHVONFFpdFFtK0xzTjUzdTdvcUxPYXdoS2xQaDcyc0E0bVVOR0VHdmtvTFhBeUYveFd6UTJyUjA3SHBJaTlUd3JTRkxQbHRzK2pSTHA0WjVibkxnRUhBc1huVStsQ1ZUNVFOQnhYKzdiQjZBWnNiR2NtbEhQVzUyajVFaW80N1VCOTZVOHdqQWNRcWtNakV3QXpEV3RqNEdGSmVEOTdrMEZ3NUVzTENvRFE3TXRpL1pkZ0hjRlVWejZoWTlNQ21laTlNUFZXMjFDbW1Ja0c0SFF3YkFHaXRVRURld2dTR0tRek9lWmpEQ1kxbDllblFyNGlqV0tIb010WmJkbHV0WkZnbnI4TTFCRkkzWXlqNytxVzBHcFJxM3FHVHg2QzhqSVdmSGEyKy9UWGd0SktLbXNvQTdlT1ZFNXROWExwVXhjUkQraDhvWXZjZmVOUmlySXFNalF4MTlzVENVQXpDWGFPTFRPd3FrRThKMi9DNmpDTEhoM2QwbVp6MS9mWkNMMk0wTzF0RjhTbUJBNnJwZVUxNERsYWxRZEpDd2E1QlZGWnJRREJkeXVYWlhjQ0p2S3ZMc0tKUEttcTFIUlBuMi9kR0xsK2w0cU9MdFVMZzVnZnQwQ0VnZ2NOWnAwWEFjSDl1MWhLNEZrRFkxUTNBZEZSN2V5c1J4cFVSNUNoMGJTMEtkN1NQNHpDZUZub1ZYSHJreHVGazhib0hlakVYQ0NobzYrK3BzTTM4bnVuNExUTGpTQ2dkS0lpSlBsWTV1dkZZNFUrM3JwOE95UzI3WVF4M083U2ZxT0pOMWxHN01OQktLV3NhTjJDc2MyRzN5YmJkeFhNQ3doRzFmV203TzN5MlJHYkZ4SktNK2hpaUIvM3BYVUZ1TDZIS1I0TEJDem5sVTRaQ2ZyTkZsdVNzdUcvcVNLRG0vRlN2Z1g2d1ZuWFpvOUN3ZVhXcmNrdXl6d2tVcFZEbXBlWHVlSTFIWDZWbWtrOHRSN3lZanVVK0llbWNmQVR0ekVVQVdzSWtUdUNHOStFeDZhVUlrZjA4c3pEckowNDVsQzdWZ0YwWG54ZDJFREk0ektpbGRoVTBGaEd0MkVUWlRBdmJvYXZKNVMyMXNPQ0FrV2tLSlFFTndXOHNIZDIwSDMySnRJM014K3hSK1hvSjh3d3JmMlZ1MXVTZ1IyWVdYM1ZhUmlmdkNBMUZHRGdUdWtoT2tDcU12cDNJWWE3WmJBaW1vL25zOGduTWJpVkVjZVM2VUU3dzRsWjJiR0hCTUZ3ZjNBQ3psbjNha2hRd24zTSttdXdROEQvVXFqbERaMm5nVDN5cHVFWCt4NlUvQnlieFlDSWMwWUdlUFZNYmtoYUpwWUM4cFJieTVySGdaM3hrc0VlNmpHd3FtOEhmWkptU2FWdUpDKzZLaHdvT3NJTGhNM2w1bE1lT2UxQnpUTmwxUENUN25UMk50aFVETmEyamtEa3RXZ3JFU2JESWwvWTNMNjFkdjdUR0lWVEhYWEpVS0swa21HbE5HZ1ZUODNFMkQrZ3ZvV1NjMUFudkVkWEJQMWpnLzc4emd6cW1lc2M4SjVyS0lIYUdmK2lTSjBRQjBNUkpKMjVJR3U3OU9tME5YQjFod0ZuZXRLUGVPZDdvUGllWTdmMnF2Q0kyQkJrV1V4SFR0OGx0a2syeThLQ0o2UE0rYW9qSm1lakJYcmlxdzMzOFNSTVlibVd3UjVtTUpqcFpuWW4rNFJzb1hsTExDL3g3TllQTnZ2QWZNSFFXVXdHakVJUDFHc3gzc1VVY2x4YjQ0Yy95SFk1Y3V4UVEvY0p3eTNuTG42SEJhK0NYZ2JaTnk0SThZRWJxSlUzWnpmV21RamNqZnFtcXRBT1dNdDU1WTZqSjNFSTIxbS91TnVUTmJMeTV0MDJSMkQ0U0VOY2VsYlN4TENCRGRxTWZjVHkxNW9ROGdWcHJsaFg4OVhSdnBKSFNIK1dkcGpMNmQxcTR3V2ttaEtvdnpYdWcxK1ZoemRHR2JjZ09xd3RpeTd3MzV0eWRDQmcyZlNENkx2YzMzSC8wbWc4emlqT2NISzNWSnpLZFlnYmRXWlpzOWdjSktLZkR5ZFRuUDROc1h6Ym9XK0JJaTVRWHJUaHdFMThIdGlhVHZXdUhXeUdOUGVGWjZEOCtMaE05a2dmOXdpZmNsUjl1YzI2S050YzlzekZIeC9McTNvY0oyc1RzRGliT3NqMDBUSzY2dHZ3U1NoeTZpcWcwb3hBOGh5NGlYZGMxeHpUcUR6V0g2UHByMWt4UmU4N2ticFdCQzRIS0QwTm5ESEZhMWRmOGtuclNPVXpLbS9lZUYyY2wreFJLbW1kWHFwSHVqMmlNd0c1d2VVTU44UXRHUEhWKzNrR1JjVCt6VGI1MHdDN0ZzU3FFNm9jTjdBQ1VJc0Q5UmJLZSthTE5mcXVoT0xWWkIvRy9wOENLVUFNNmxaKzNZUGRRVFc0TDBhbXhkUndSczM5OS9LT0FrRjhWOGpaTzQyQm1pdzREbGs0Q3RWZTNVNVZPRXU5dXIwYjZpaitKRWU1YWZERUhaS0d0SFVWdDQwVGs1ZWJTRjVZWUNPTm91SFdvM3paNFNQdmMvb2FhZzE1a1loMVMrUXMwcnNGMU5VMlZYc0dDRnJ0WjUrcUw2Y01FYU0wTjlEZ1BUdG42Vjg2NXJ5N2FrWGFFSjlwKyswdE41S1UxOHlrVEZhNCtmT0E3VTU3OXZjVitBcXMrcXltb3daS3dudzVIOVo1YTIzVUw0elA5MmhtUjBWRHlSaGMrdFkyWmkxS0l6czdPMVNWTEJOc0dDdVlUYjNZbUFKSjkrQU9CMTB0MnlnWDZOOEhJQjZUa0RSNnh2cjJCdmYrZVl3djlUelcxVytpQXV0TGoyZldlZGRDTko2anJWZ0V5YjBrcVVJbXVlRHRYbXpPUFBibkIwTHpNdzlEQmt5WGkxYkh5QmJhckJrWnBaSUhSWUxab3NiTnJPdzNyRWhmOExGU3FobEkvejNhR1o5NkdjOWRQVlBkSXpMZFJBeXMyZks5SmZ4aEJKTmljL0lkV216d1k1WEQzKzBvMFhHQVZhZkZZVkdrcXBQTVdjOXBnNStaU2NzamxLV3Y1UjNzQ0lyMzlVSHZTRGNBeEtHdGxxdHRiamNscDRQSU8wUkxwOUtkaDRYckxqQ1FoNEYzZlREU21mb0hyQ1FMTllyOVFHaVFHU0hLeEI4RWE0MG9keVFxZHJmTkJiaURDT1p0VUx0Qng2a2M5MmhNVjVyUWlCOUp6WlI0YXMyWlA4OE1yb3M4QkpnNis1MmEwS2hxb2dLUExjZlZJQWordVJnTXdQTmtia3pDMjREYW9ZYVNzUmtZS2g4Sms3a1RwMEszcmcvcURKcStFL2xxY0NodU1FRjZQTnpVWE5ZNEdrUUxXYUZGSDZVVzIza29DOFJaM1RRWkV5cnpiVGRTYkI3cnZiNlEvOGNLR05kYlJwUnA3dHVHanhncHFDMS9EOCtGYnJPWUlVWm9yNFlsNUdjR00xYTZQYWc2Qk9YUDhzV25IN1JDWEl0TnN5eFVQcGdrcmphVUQ5ckIyQmp6WE1UYUZqWTBVNEIzT3dzcEdhMDMzQndxaHdaYjlNQnNzMFdPOXoyN3JKTjNUQVpxdUVwazJ1YThVMDBvcUFkR204VWJNcGhtKzBGenl4emVXU1hudU50cUxVUnNKWHJBdEd1Z3pZZkM2d212Ylk1S3l1RGhSOWZvY2YrZW02dVI4dVZGcHJ0bFRJVDdYaUJ6Z2lybHUxZ2pmRkhEcWs3WEhvS2g4VlJtQkxteGZ1UkJxU0ZvY0FZRzN5R0lXcFAwK2hGa2tyV2RCb21CRWNsV3JUVkJHUzFic0QzN1RYSnFadE54RGFzTU1NdTMyWndzLzdvd1dIb1VFWmErTkUxaFd1bVRoU290V0VmTUtjd05qcGw1eVozMDR4WVQrdDFPenZXMnV2ODVaZFFtRHhSWlpPUWl3VEdCNGYvcmZCcjlsclZ2bGp0NFowWUxJVkI0T2dPc3NxUlkrYktYZ3ZaMHVFaUZVc0JmWktuL1ZtVkx0b3dKS0RNMXBZdjN0ZUloK2JDWnZWTk9MZ0gvMkNWd0VKM1lJYmNPMFdJRUlDdVJqa3VoQXpMUmlBdzFCcGE0TGJCMXpWdzllV1ZmdDFwSmRCWnUxaXdIYlhDNy9oQ3FFeW5IK3grZElFNGNONWI5M2d5UTBjckR2QzI0cDJwS2YwWU9OSklkNFRLNzNhWW9mT3dLTWxoOXBoL1puKy9mbVIwWkM0ampkZEZValhXUmxMRUY0ellSS0c1RVFpTmN6Zlh0Z2tmdmttaUdYZGN5akRqM1RGNzdoWGMvTXNBclZVY1ljbU1SWXJxR084aXFGdy9wUndONnplSXJZMERyRHZlWE41TkZUbXlxM0NXcU9SL3lJY1ZkcUs0V2FsNW41bWFTTGx3L2Rva1ZFRkxWK3FLVXRPem1PMzZ1b2xoei83aUNBdXpoVDV3Mi9zd0IzaithYVpCY2tHcloxdkh4T0hGNTZIYnEyL0tOdFRJTjBzV3Q5MGZkdlJJcVdjcWNRb0VXZ2lFcTJZb3NXZ0hYSmM3UEJuUXRWQ2E3OENtM3F6Y0ZmNUhScmF3UVdvaHVBTTdKWHhXUFo2dVl6T0cvOTYxSEhPenJFbkcvNDRxVzNyZEExUnJSTytHOUV6YlhEb3VYSHdoekFJYjM2VndnZTAwRExCeDFaTkJ5SXl5NUNIZzdwcC9CYVpmSVBwNlNYb2Fzd3g5S1ZxdUw4a0l6RjJ2TTI5RTdaQXBoTUpraGtkVkR2Sm1RbndtQ2NIL3pDSFBtYWx6NFU1QTVIOThJb0NscmRVRkMwRFJiNmsxREc0YVVtaUVPMDJRMHlDNldnN2dFTTdwcDZjV29GM3lrT3YxZmpDZFRpaSszOE9KVFRjL1pYc09qRUNITlNDNGVnOXN5MURuVG9WMFNKd0VvNmJNeTNQc1pkSlJSMm0rQ3hueG1vMzFIOU5xc09qaWp2RWtFSjFTUXppMklHbnBDcmk1Y0diUTFVSXlteXdMOEZzV3QyaEdUeVdJSjA0RlZuM3l2akJVWE9JQXBxdklVd3ozQ2hxdjF3UklZd1Bjc3NaR1l6VzNid25XVG9ZT1pCbFUzVXVKbXYzMURxTWl4cU41aWpKTC9FSGJiMEtNczVHYmFUS0VtVnVtQ0pSNUpuUTN5MW1VOXRJQW9VaDdmUE9EQk1QMHQ0cVp0cUQveXpHSDNlYUVVOUJXUjFCT3BSVzVsc2JXZGNUcCs0TXVPdVh4Vkd1ZGt1V05SU1BVRFpPVUlnTzIrTTRDUmJOWFBTakhtQnRhVGZmS2xIcGluVXhqQUVybndjcWtXMTBncGljZmttM3YyNXpNeWxwSDkvbWF5UmZWbmtqNFF6NXpqaHdqTXoxZ1piSmtMenVFMk5Oa0g2MWlCZkloR1NLL21LWE1relBkYzVQaUcxbFZkL3R6NWZPK2Nma21qcUZzQzdYYVpUVmh3a2hhRXFDMk5LNHBsTURQV1RBTldvZnBwOC9sVTNrbFlUcStXNzdyNU9NRDlBOG45VitnbEJCYzhnN2ZTRkF4U29wN2lIWllheWdQdkVVTXhZclVTZG5jK0IyV3pRMXpmRzI5cUZnQVYyQThoOVZVaWxSUU1yWXY5bzR2YUZObEpQKy9NNmdqaFllWDNsQU1veFA2M1Y5K0NDb3g4MEk1WVJ6VDMxbmw0empQYkNzVklZMHVWMnprbFh5bGhiSkVUMGl6TGthS1JkRmYyS1BpTHdYaHJhcG9vd2p1S1ZjSzNtQ2hyK1A3U1NpUHh3TTBCc0srV2g3eVRpNmIzc2kzQTd1bVRWZ1hYOFJaNHQ5Z0dlODJWS1Vlc1Mvb2pnZHhkMnljMVl0T0s1TXBKdUh6NVlhcnZ3amF1UHlkRzAyTHJneXQ3My9aYzFJWVMxTkh1eDluMzBNRDdLMVhROTYwY29lU253WUo0ck5RbXhyNlVWNkt1SzVPK2hzOTFOKytza3VzdlRhaE9kZnlxWFFjUlVRMjZDeWpDeE1HQ0g3VnJwRmVtZzN0bkR6RlRVSE1WSW9uVUdzU3JGTUoxdzFwSGtqY25SRTYranV0eWRWbW0zUW8wSFh1WVkyazlWdGJkRGhBNXRhZXp4MDk5b0ZqKzAya0Y0V3NSTENKeThxSThzUHBzMFpkRzRDOUp4SlFRd3ArVGVxbk84NHA5Q3FpYldsUmFwOGMxMGpJUEJvSmxMWFBBOHY1cVdmcHlnek9VOFpGU2RBY2VBUFREcDMwK3MySmVhMkcxR3ZrVDh0THNNalFLUjRmWm5ybVdPTWlmc1RnOEtxYnBFMytpWDdLNzJ1Z05pdlBaTEx2RHZ3OUVoU3N1enpyM0ZMZFBFemNQZmVtdUZyQUNZcUY4LzQvMWMwd1RaUDc3a3pPcHR2amU3WkZwU3M0NThtOG1XSzB5cW1xeXBKSGFRV2NHNjBOWDhleE5VVHNQbU5ZTjB5TTRUdDQzMWRoalRVQUI4Zk5VbWVCSkxiZERGdEw3V1M1cFhBS09DTEN4bUM5elRQWE4zTlBibzIzb3NTUE5LK3pSaDdzcTZjRW85UW9ranNRaEZBRWYxT25tdFMwb3Z3YXQ2RGdwazZJT3N6U2JsbUlCczQzN1gxbGhpQWZMWGN5WUNTMG1NYWNQOEJPOHZSRXBQY3Bmb2tzRG5pWTZ4a1FKTWdLVWNlOWcyc2xSc24wcThkcCszN2I5SU5Mck84bys4NVZqelZtRjVoN25vRWhzSnpEbjltUFdjVzZlZFozMWMzSytXZHV1SzNUQWV0ZTJ5OHdqdHlxNzJKcTVyMFMwYzJETllIdDR3UjY4M2lmZmFHdmx0eTJ1ejBnVXpFWWtxVU9NY1RjMVNuOXBaTGVrQlFJdWlEUWJIeTg1Uk9pSWJsNGFFMG1MdkJ5RFdVK3ozQ0t1RHEvbVlWM2lST2ZKSjdpRlgwYzZyQlBNbFFLZ2ZHbXdYMEFyazlZaG5Ib0p1TU9LaWI1Um9PdnNiTEw2a1YzUUcvOXR4Q1MzR0loTE45dVZmTmZ2Wm1iM2Y0UEIxQ2pwSmhkWFUyL3VvYzdWc0ZuNkJWR3I2NEFhcGdoK2JCTC9GR0tFM0lLSzdONEE1U1hQZVBkUWxJY3hyUHJ2UXhheHJZWmFDSXkyb3RMbjV6QUk1TlBNV2RKTWd3elZLUVV5V0ZFUmtQWnBQL0daRUw1b2FkNit0a1h2NURzQ09rdmNBN0I2ZHRmcUNTZGJOVy9LemFTdVhiK2ZkZnJUcUkxbm5kUDVJZXo0emE3WDdFZnpubUVmVG5qUExDU0xsTTlHWnEzUmo5Zm5zNnhqNFR4VmF2dnljaW1GbjgxTWtlcHVXMWxTV2ZnV01iYm56TGczZnMydjRiVGxHdG9sWUJ3RVBOZm9UVzN1UDdnTE1FeHhBWW9KREhrcHZJU01rYU8rTHQrS1NNVnEyOXhUQTJJczF1YjB5ZDJCb3RsVzJLQmh5VWI5S0IzUUl2dFZwWjhUQ2ZPZks1TkkwSW5HaGJ2Y1lodUMzSXo2U3h5VDZqeEp5eWhaWHFuTzJGZnY5RjhaRkRtVVNKSXpKT3FIUWZHRGNPcHZJc3h6bE00cGNPMk9yTmtYQS9ieW9GbXdEZEg0UmVad0x0WkNtZ0VFLzdjc29IU3c4blFWbnYzS0EzakQwZnlPek5PTGY4aXJwbVByMnR6RFJ6bVRBVFcyanlxZG5nSm10aW5FM2ZYdW0yODVRc2ZrdXN1c2VFRHd0WjJpQ0RaNFd5U2k5amswdHZyeWhKbW1TT0lxMXlGdUFPYUxOVGUxNU05SWFPNDAzdDJmeHVPWUY5VHB6dVRsdndINU1uc1JrZ1ZEa2hvVWd6N1dZMG9hZC9nUFg4RFNwTWxKdlJDenAvak43Szd3ZFNhT1hkY3h0NlBDK2tNaVJoeVlJei96ck5zK3Uva3FOTWVSSGYzK1lqSTNTUlZYT050N3loK0tIUCtXdHhqdmg1d1hXcTg1TmF4Y3hyQzYrMHRYN1QvZGlva3U0ODlHSzJodXFUUWpxaHRTVmZyZ1J3K1ZNUHRVWVRBMEMvQ3Q0cW5wQ0NvMDZreUl5OGt2ZllCajRNYUdsV0hzbXllNERqenpKQk1BRnVNNmFLdDBzVVYzdURpWCtGOWdOU3NDd0w4dTFFWVl0S1BkOTNPaDBhcjcwYnVTbTBBZ3JxSDlsUmpWaXl6aVc2L3pjR3pERXQzT214azZpdnR0aG5DdUkxaExvaVVTRy92bTBvVDlGcUxWMXFaTFFUM09FeGwwd2VvdENtYVA3VUhIUTIrRnQvdnc4TU5kZENWalhVelZiVm96WmFXdGEzbUFBTW1BZGR5TzQ0VURLWEJBQklPQWNEalBVVm5uc05BMWNTSnBNWW5uQitlelFLdjdSdGt5MGtqM1dVQ3gzTmZPcmM5emFEVUhlMWNSOFhEZmFCZW9Ga25JWGVFZzY5eHNmNlBJWU56OXh4QlVmSUNldjhhNjJRTFJESVhQdmN5UzdWSHlOMWE0M0RPU0lSdTQ5OUpJbk1wdmFQM0kyYlNwT1ZTNEhkNDlYSENMTnhqVnh2WTV2NU0xMCtkcVM5aENidUdEVnpsT3ZWUXdYbHdubG0zR2I1K28zS0xxN3JSdVo3enVVblY0RXZxMkJDQ09lOFhiVXk3eXJIY0doVythQzduZ0llMThsQ1JuRHVydXBIVnE0V245bzRkendiV09KUnBGUzdxMDE1UDZzRlBVMTdEYzh3WmEwczdZQjJ5UUp1K1o4TFpHUkFpYTl0TS92bHBvTkRQYWJsQXFNMWNkN3pIUHJJaUdHSXFYckRQcjduQ0QvVXE5Y0ZoTFNLK0NXMUd0YTZNK3dPbUp4Vks2NHBBTXlnZ2RuU2hUbUhrTjV3TlIvT3V1andUSXdzUE9mT2VhNDlWRXZacFNQSTBsc3lSdmNRanc5S2VKcVQzR3R4eFBPN3E0YTRjREczTE1QS1NObEVicytVbVd6ZVFaeG5ldEQzemk5K1BtNTI3dlc2QXAxMkFUdWJQSzJvZ0gyalpuaGhzT0d1VW44UkxUVG51MUw0S2YrQlYvODlmNFA4Q2Y4bU5mOW1hYXpMRWZsY0tFczJsMUxVU1lHL1dwS250TXlEbHZJZHBqaklaZTVoejFVekhDS2RWckYxcGVpQUd6aGJWM0hpRFlMeEY3NllqMTE5cWh1T2tNS0hWUldBbE40Ly9yYW9kZmVtQnpnRHJXdE5DYXR4ZmJuVndLRHJQL0tZeTkzcEZoU2FYWmQ1SlVESEFwWThjR1hwSWJ6Z08wVnVNcVRRUmR3KzJxbHF2Vlk3eXZ1NEE1elF4UTNuRVM3TmdRM1laRXdxNURlbEpEZnFuVGlMb0NQR0dPOFJxM2JxMUhYOHkvVkdpRGpwOFo1bDJja29iaW9Fem43OGh1L3ViU0JQekRyajhGSlVaNjNYakRsSEkwVHBuQklDUEVYeXppMGZZRFJvUDRSVGp5MTk0ZUNjc1R6bWc0VTBZNG5oSTZkb1Q3cjQwUmV0SFBTSEF2TTFod1VXMlhvaFNvbk54QndlRzVWTXJ4Y0Fqa1hyUUNLM2p6M3VtdDFRSy9XZ0tNcmVTZjVPbGF4QU9kK0hGNTJZdWJBL0xkU3ZwNmhLbFlhVzUyY2VmMXovZC9zbk10bGNEQUpiU2tHWEZXZkQwaVBWNE1tS0tEbEc5cEtDUXdmSUNOZG1FM0VQK1FBMjMvMG9LRWxHQnRtYU1VanJ2dEFEQm5oVXptbUV1U011dHVVaEkwS2lVT3pBMnBmcmdkb2g1ZHc4NXNlQXM0Zzk5T0JaVy9VdGtQVVIyNUcxTFpyQmtxMzJxdnQxWlEwZVFNdjF6YWtBTmRrQStTRGtIQmVveWJWdVdDbDFwTDZNeWw2Y1dBSE9uNzNIbTk1QWMxVUMyMjlTOWJ3bDZteGgyWGNaYldLMHc4NmJVaFNaSCtJajRQY0JvTUJldE9kWUVFZnhiVktoN3M3bS9vWmZ5SGdNbXpkbURCa3F6cldsZXFBZ1Bhb21hbU13T0hnSkRTRHlZRjlOSWhEblRDVWhlK2E0bEFua2NhQlQxMFJWT0poZGsvdy84QTVtOGkwWjY2Q3VOWkNjbUlLUEpOUUdVTUREUkgycFM0QVk2dkdzM25KUXp1MTVrU3Y1UkVxeGRuNWpiM1NubFk0aUdlWXpIbnVjVjhmYVRVYVg4Z0RyV001VUI1YmZBSHEwTjNZNndrMENoeFRQN1RhdjNPY2JsemFYTjhDL3RCT1ZRMDl3eGFKUGZqcWEyMVFxQmtsM3ZEejd5YVdiUWJYU0szY29uNEdjTUlmRkJacDlFQS9RYXROVFFqREgrRSswV0JIRmQ2ZFRUY2o3elBQQ2NKWkJWbGE0WHA0K0U2ZndINmQxY3NFM0NoUEdEZWtyc2gwUzVxb1d5Y2xMbGVqWXQxV1Byd21uYUJJUDFaT2wrL2Y5ZEZXbEtpZHJqUDJWS0RzOUUvUWw1SkpIWFZnNXd5amJLd0k0amFjNE55a25LZmdkZlA4SndpU29MZFNWa29SUlZvMnlxZmJFL05BL0ZJSDRVMnA3dGRHMVcyRGxkRGMwU1lZS0JWTng0bnpjbFJaV09GY0cvZGQ4Ymw0WWxka0k2ZTNaZy9ISVR2VGc0alRRNzZBS0xSYVdKVTlJOVozMFZEM25BSW9RQy90RExEMGxtcFpTS2ZsNXZzbTdreGsrL1lLR1lFR2FRUURrdVpCSUI1NGVBNVBWSUR0bVYyU20rTnZ2TVNVTnJaUGhUQmlibnF0N29TcWR3aG9TbTZEWVBMSVNyK2RBOTAya0RnUjJPM2ZDdkowa0ZxVWM0eUhkSTN0RVJvcFpkY3RYMUozVWhlZE14a00vd042TzRueUp5eUNDYzVwbU5MSGR3QUg0Q2lZVkovSDZXbnhVTkUvdVpoVDlzaW0xWEVKdWVlcllkWW5iTjhOaTlmN01udlRFbFJHQVBRUDQ1UDNjUG8vV3k4eC9aM2luOFNHWGo4NXlyK0pHb0dHWkFIQTQ0YlgrdzMxN21rbEhwMUdVSzk2ZlMrbEF2TDhjUEhrdVZONVFhNnpKRzB0RHJHUVdQdjIzV1FlaVZhQmFYSGJBNTJ1aWIrdlpNcjRKZUtweHVBV2dGeUwvZnh0WFhtYjg4MWdJTS9RMDdZTUJXQUtpVEthalZ2YUZmYlo0Ym5UelNsTXplZDZRSEJLWGNuZ2h2dUlXZXhOcWZkUEFlY3pMYno0bGlOT2ZkRHNrM0RJeDJVRE45aGZyTDB3TU5UaFAzV3c4bFRycXFVSVIvZDh6UHFTUXhkQnZRYk1neHlXNmdnM00waVNXYWdScnQzbmRxRUt3eGM0L1BIdi9WWU9ITUtwanAvY2RBTEtqdXlFMGVpK2hGbk9raDhkZGtWSEdtNTBod0Y3QWl6YS80V1hBekhJL3hPRi85S2pDY0poVTdpS3JLZHhiNXZqZHJzWlJVNm1SMytPaEpTVUV4bW5pSkRPQjRCbkJ5czlxTUNkNUdHdDhpb1NwOGJBUVRuMVZCZ1M0M2t3WDc2RmVoRWx1a3ZNWlRTNDZpRUlUTkl0OFl2Zyt2YmlZMDgrZENYamhtUDltbks4Mks5MlVLS3RhUis2OFBZNlJxQTRsb0FUZStmVlVlZkc5M1V1L2g2bTFKNHBvY2xGN3NOWHI4VWVjb1JyZUNzQ2o0U0w3a0pvWG1NUGZFZWprNlppeFBWMG43c0d5Z2IzZTFoU3A5L0NMdHlPU2l0T0d0WkVCTENrMXJPUVFGK0VvRmNma05hbnYrajQ1SDd2c0hoRkZZM21EMW1iM0xibjA5ZFpFWjNLeUJvWWVwOG5MQTBWTTl3VlB6akpHdWM4MkhuNmVxeG5MMmRJUmxoZkx0RENWN3ZEeHlRanZvVmFXWUxXOU42dHdXYW45ditDKzRPYjk3Ni80cWFYTkVhVUFmb2YxcXh4MEV2NVVjOTd5SWpFZlk3YXA1WVB6bUU2SXZaSkhES3JNQWNHNS9QWHJiRHJFNHQwUXBuLzhpSDZWSWp3bkY2aVFDRkQ2dGg1djZkVEFWZmFLZGErTnpEWWU4L0RUQzc4NWtoMUZsN1JqNmViU3VFMkJCZXFlWFNIdlNmSms5bUxlNlpya1hRcExsK0N3ckRRRUJLQjZ3MmlWdjljTFJTSjlnT0RnMlV6cWRWdWhMOUhReWlXSVZwVDBLYnBYbmJtemlPdjlEOS9ldjhGM3NkUDE2UmlTbWxFaklzWWJ5VkxvNXpoNDVtU0h4MytWcHRrSTRwMjZtY3FtdTF2azZKUTJQUlBqQXlnT2xmM2lhN0FUWXdLb1BGQnFYd2wxWVBKaDVnakdTMXRIbklKNUk1Y1BoRTQwanJSQWloeFdQblNzb21DNjJ3OEtxYXJNUE9VL2xFWU9GY1F2dFZSRWliREdzd2JuY3o4Q0sySld3OGhjWFdoZWxRKzF6OGl2cWFGVVZBQkxlKzBlWjl2VTBaNVBSbm45OWRzSlVUbUEzRHVadEZuMTBibllDWHQvZ2xSTy94MGJJVjA2ejVQTmhxZ2FhcE5YbzFGei9HWUR3V3ZLUTdtcTg0bitMd2ZMZUlTMWJtelF2MFpSSDNlT2JVWVkrRjdrRXp0MUk0MnZvaEtLb1k0WHFzekdYTWZZSzF4TWhTYWs5S0J5VXlPckdBdlVXVUJmb1pUTzJ0RVlsb0RJZCtaUnlYSlNyWjJ0R0Y5RVdPSDFQdnRLcVhrQmJkYWdOR0VyN0FlMUs3aloza01BcklqUFRnS0FqdnBRdWp2UEkxbEV2ZStJa2phd0FwU3ZNc0ZJY0tNOTg2NERyTFBVdUg1SUNOZkFPSXpFb3k4dHRvWnRJUHlnVkhnMXN3OXBXeElINFoyL0h5eVd3WVN5ZG0wNW8zVDBNcE54OFRvQ3IzZ0lTU0htenJsNW54Y1RZSk1WSDQxbTBDS1V5bTFsVjdudi9mZ1J3K3ZZTGRuQVBJWDhkZ2JFcmFEa21peWNTWUFCL2Z2UGZlWUY4YnkxWXVKNFlmOTdEU1AvZ3hwdGtVdENHTUhRbmFLOFZhOXk4c1d5aTZQTnYxbm5IMHNqOEtsY0FXMlpNZWlBSXFtK2orUGc3dFEvTWVzNUxaZEhMM3drYUdMQldLbVk2dzZ6NklQMzZUUFppTHRGd09MSnFaRUlpZVpGYWkvdkdKM3VFVFdqOGZ4MUl4Q2g3RHRrWmRaYmZHNDZDOENjQzRkbTR5VjBqd0JZd2xBU3dlVVhNd0RlNEtmRTZ4R2xoSitYSGI0ajlzQ29PclRHNzRNRGFxK1lEMSt0QTdqblFVNWQzc293MHpsd0RiT1Y0NHZkbXpiMStDeXNLeGd4cjVrK1ZUQTVoekM2bG1IQmxXd2xPRmVwSXBwdm5nODkxc0JNR0VHVE55TFFFSnNSZ3M1NkhIUDRVbXczUTJmRW1kVjhld1lVZGRpSDZTZzRpQi9pS00rYUdWL0NkRDQ4VFhERlUvaU1EanAxc08wakVFSTFpVFZwNnJ5Z3lvNUlvSDRibUpoNTFUYzJEdVE3UnptLzErWkwvcjdGR2ZYdlpLZTNvcWd1UHZRQjBCSTk3d2RPT2E4QVEvT1E5b2dCL0FKNC9icEd6OTVMRHlUWW5tM3NybURrbTdpVmRUSnhhKzhDemZSRGVGdWRvOHc0bEMyQnVHdGVOM0lIaHMvYmh4MmtJc21LbGtBRm5KRHV5aTZwbHlkaWl0ME4rVkczN0JXS214aWlmNkhtYmZnODVqdVBZb3JJUUxsRlU2WmdZekMwQ0VZaHNBbGV2S0JPVVRHdW0zYktqTStUNUdXanU0eEh6enkyN3lXd1k0cW40WTRCQkJ5NEQ3bFBlaFdOK1czU29raWhRMXNRcVNjVGZFNjM3elhYeCtHdlVnQlFzN1IrdEUwSHN4dXdBUGg0eXBNZlo0dG5STWtwWWJkeVZYR2trNXZyQ3AxU3ZkRFQwTGtGdHVxcGRQT2NRbnJTQUtxeFpNSHF4NDFqTTZVWWVHS05tNUxRM3J6dkFPbTZ6YTRUdlJRNE5KakhOeHl0WUxldGVobnZObmZIZWFOb0Y2WEkvMVVIYXV6dzBqR3NGdTdEWTdjTmVPVVJlTmJVTHB4cnhLZEpBQ1NBb1FJVkxvMzB1dzNmbHBZOVlWVzIzNGRQL05CTFk3clBDWWswa1RXSjU5ZEYvRWRqYUVMa3NyaFh6T1lxTVdvdnI2d3MzbE9TTndsUmxDYktFUHJwOCtKQU14ZlFsa1Nxa3BmeWVqVWdxRnBsWWMybkZ6eEcxN2NFVzI2MEkwMEw5bGZHU2lwVmsya2lFL0VFZ3d5d3lFUnZlSzBGVW01SWhOVDNDVzkvejZQbVc0WUZ2QkxkRVowMEM3OEJ4K2pjR2pQeWdZRnlBenlYNldKMXRjSWptQUxHa0M4anlmNzBVRU41OXluYklpN0FmOHdLNkREc2JsaHZ5ZjlHeUltUmhZL0tON0w4elg4OGVNclp6eXc1YlhKdTFkcGpuYnNvcWhFd2xIdTVSSEVNZDZsaG10R1BzMFlFNENCVDRaQVJHYWV3Z01KOUw1RS9laFQ1UE1adjZKQnhXWjdUNWRicEdSSG5LTUVYSElaTGRDazh3eWRtUGZ5d0N4V3lPVklzQWxPSi9tRzdRR0l0clZMSzdhQzgwOTBodDdDQ2tyelY2TVNCa1IyMlBkSks5SGt1bGgzOEZPbHZTMVgwSnd3bjR2UlNmU3FKM3VITG96SzZ5b29FNEN1Y2JYdEhXdTJmcDdDaXJtSU5vcmlGblRkenc5OVZXSXYyY2xDQTlnWUFWTVkrakJFdTVCaWhuMkZKR0VXK3dHcGI4MjJZZEdYcFdhcVU5QmVxdG5XUEU3ejR4MWhtbVE2RG9sVHRZUElzaVdPRldYZlpyaFQwSGZGK1VJdTh5elh1NDlYWEFNV3FST3NlOVBEMGV3MzVETVJQU2JzdTUxSjBWOUVrMEpMK3RqWndtY2poTWJQbE1jaExqYTJRdEIxaEliVk44ZWxoWTFPcEY1SFBwZ0xkZk5ITTNEV3laRGtJMEo2U2Q3Q1NtY2JEWUpPRE9IY3FibmJLQWtrTzJaOXVSTGN4cm42UzBlRGF0ZGVaNkJ4SnArRlRxR2ZWMi92K1BrWDhjZUM1R3N3VFZ4eWx3aHpBN1hEOG1iay9nb0FjWEkzT3ZGQTdxUHRwOFBMZHdEbk1mSTdrYmNKQ1hFS0xwYis5RDNoRmNub3IrWnpHRlhzZFp5bklPZUxReE1aQnc4T1JHc1BDV1ByNTllOHg2UzRGa1AxS0l3MVp1akozajJ3WEwvQnZrVm43L2Q1bGhBc3VBY1lSZm5zTnMySlV3MVBrSTVMWit4S3JNSlEzRXJzZnluQW5NMllMV0RyUEkyOFFMRTJFb0IxMW5tSWlwQzNEb1Q3eE95cU1VYklja1d5dXVQeWxKZGVGVHRCRWtWYml1d1JVQkJXL043RlNHbGUxMG1zUXUzZXI3ejRGd09SeDNQdFVDL2FKOVAxNHk2d0NIcGVTVDhtNmJVbWxvaXdaNGpLV1lIRW9HUzJSYWRZSXdnQVgxUlNLWWtUSGpiNC9PTmxpR25EWDlIWEFUR3NKcHp5YUFyM25vNmR4RVVMQlB2NjFsY21QeWprSno5WUFsaXFBMEh4NHprSTd3TDB0Tkp0RDlnTmppMGk1azdWajlIUUc0NmdrSi9HT0J4WDVoR2hNcE5EQjBsbUZ3VEpCeFpoQnJWQ2FWUTcyNlo3bDhPbEJ3QlBjd3RHL3BEelZoVXcvcWswaStRREZmVXZ2WnE5YXNETG9lVXBJbEx3OFMydFFWa1FZZWc3ZGpOaFhwVldqQVRyS3ZmOUZTeWtIMnpqTmYwS0d0anQ2RWNpSXQ5djJPYWVVa0xHUkVZZjJRY2dRZkZ0Q2YyNDlrTDMzM0Q0elh1TklPUmVtb0tTSkRxbmFIb0ovVm8rUC96MVdrUnlGRVZtTHhPVU5WTHA1U0ZZdlpoSXRzUGNOVGpyeVFnTnBjaXM4U0hSV3J6c3lOaUhqWU82WGtSemlyb0JDVi9UMVk2a3VWRXBUYkpqM2VUZFVFOHUxcytqQ0lLcENneEoydStRYWIzVk4yT0xjblpmRy9XSURZRGRWRi9LU0N6MlgvRkd2dG1PQTdPTUR2SEphWkh5L1pwSlUvajhsUnF3bHc0TVlPcDRBamNINUJnbElxL3RLRU1WSk1nWldsc21BQVl5RDBnS044dVN5RVVMUW5BWjA2dDkrZmNGME5jRHBaamVqWDV3djZReW96SDgzTnVTYmxNRmJjYmtYTUNuc2l4VUc3ZmJzaFdqakpvQlk0UlliRy81NllrUHltYVhQeU8rMUdJcXpIdnlFVm1BQ1FjY0xFNVJIendBb21GRkNJVWpuM292MFZFZ2x5T2xzWGEzQXJJY29Rbk40UWxYSXRxd1AwVnN4TTZ4Z3ZHR29IWDVlazNMTFVSZWExMUZZTlhyeUROSUNuY3BMTGhTc2E3ek41RWNWanNpdzBpc1d1Wk1BVU5aUmYvbGJJbUxmNEpnTE1yZmF4UWdaSlREMVh1bnBRVFM5U3VpN0crS2p4bmdIMlhxWmRRM0pjcVhzaDhQZzFIM2ZqdDVhTVk2bVV3eXQwN29xM0tscE5zbW1ZMFZZMWZiZHpaMVVCRytleGxLZWx2VytaejNuRHd6cXBTUkswQWJHQ3g3RE82ek5TMUlOVllHVEJoSklScXora0N4T0F3b3R3bXJBMXJIVDY0aVMwamtseURYRkxCQUpLeG5XYVFnMUp3Uk9jT2Q1eEYwdmhWQ0ZqVjEyVXRua04wNUZ4R3ZZUUJPRHZ2eGZ4cGxuN05VUXlQUVc2V2xITWxNZzlXUmIxMnB0TkN1YUVEZGZWTTV1NC9kdlJiaXhTaUk1eUJyS1lPUXg2OVVZNkU5d0NkK3pnQ3JuYi9zQzF3dkppVUp4cExRc1JYbkNJa0xZOTZNNlhIQXEvQldWdEo5MUFVL202Mit4QUNVSkZkdFV6VVlaSVJzSVBld3c3M2ZPbmRIellaVVNIcW1KeFhJUSs2YUpWSG9mT0RjTnlZdjVVaVMvdU5LK2lJWHVtcUkyQTNncUtxMm5IRjd2QlBvcEVOM052bmYvTkhEQTBjREZ0U2RTYmdxSlBZQVJKYXlsZ1dqQlBCNlA2NzlKVWtpVjNYU3E3UEZWNXdtWmJwR2hFWkRJcDgwaW5hT0t1am5XN1A5MHlpUU5xYlByTTdDNVN3Ums1eXp6SG9MWDlWSEVDUExMKytCVG0zYTdKdlVlM1BqcEpxNVdMOUtDcG9BRWZ1OWhiaE9wdlFnRk0rdWJvMkczd0p6aExPTlhjSkl2TzBoTEYwYmRxQ2c5ZUZqWTd3YWdGY05TdlN1WnZKaUEwU0I0dEd2bHZrNkt5RDZTTnpLT1c5Z0JaM1pGZ3E1V2liL2tXamtPSGV1K0lhVjVsSWxBeTZidmdrdi9lOE5LWXJEMnFESlFBbXlkbkUzUzlVZno1VDRiMXVJNWsrWjRwM05mc3ZuSElVZnp3U05TOGhoSVdVRFpqdXQ3VVllcWxiRXhTVWhPSTZSR08reWZWVFFUZjNiRWQ0d0poQ0czckJNM3FsSzQvUWU4ZzByV1VhdHRDa0xXT1pTWnpNelhGclJ1eGJGMEVpSWJCdWdORTBzS0pVa3RqVWtQbUk3bUdLUVUzam1yUytabWFkQUdORkxZMStVcnVONjVnV0E1RFV4TEluckxPRHMzS09uM0gwMjk5eTQ1MGhvY05kUG13ZWF2RXRCZmRKa3hXNlhxSlkzWi9oWGdQZE5sRmpwd2tDR2VyNXk1L3hnVEIwR1FTalptdUJpTWhIa3VrTm14UldoM3gxMlVHZ1F0UllQeVRuZ1BQZVErZ3djNWRjd3hsZy8xc05UdGp6eDV1ZUN1SmlJTFErZW8zMFc2cnFyaGlYR0psWGhRV3p5dHZPZ3NEa0xaY1BERE9uOWtTTk9KWVJOZUhPdHl0TmV2MG5ZRmV0NGpIc0dRN24zL0N4b2cwNEFqNFd3MDAzVnNKNk9xTmY2dkEwTmtNVVRrMkQwTzIrOHAwMkYrNGlndDVOK3dQaFQ4VXdCU1RiYVpmOFNjMEZxekYwOVQ1YkFUY3o4c0FUcTNuVmlyT0R4SzJHUDZWUjYwMlNkVkNncWRYRkl6R2lHUUEvdlFHZlZFbFE0cVd4S0M1RTQvOFlBQ2pkZ0pxZW85WE9uVjJqOGdXZ3Z6WnA5akxkQWIrMDlsUkhsMjd1WW1CNzZoWE4xNXRVUElHd0VuY1FrY0xydWFUeGFnb3o2RkM2cU0rZko1UnlGN3VuQy9Ic0xrQmYwRXRZZ1EzNHhLSVpoM0hQSUtTTzRzRTZJcXp5MGtXa0IyUmJpNEczVElpUGg1NS8wbEFpNG91K3ByMkFYaWt0TkNSOHErS1hFWlhrZnZVZFU3K2ZVb0pvcmg0UGFMV09WZHJTS3ovWGdUZ21XbWs3NzNJMERNUWdMYTZ5dlVHQkM2WDRGL0dvSXZ3S3hxbndFZEF6QnVmYjZQUHBjY0o4bExGV2I0NmMxRWpOWXpJakUwTTVxM0RQRjYweXQ2VmUwS3V6YkFtYldiWGdlZDluNUZRZ3laNXNicDc0dngxamVBVTJlbmJCOGRQSG1FSVdPNDM0T0VjVnE3Q2FaT3E5OCtBanM4ZVhUODF6UzRaTFJ0MWM4N0J2UHNJb1Zvd3h3OVhidDdnVElEbFNzRkMySEZ1OHFoQVY3SUpqMG9nZy9tQStDejRJdnFXdmVsNnRCTi9pWXVwcmo2bzViUGFQSStEUHlUdWJnTEVoYzV4d3dJZTVCL1AxV0N1UWptVlR1Vm9NWTU2RzIxRjBYVU53UkVjKy9MUlcrVHliZHBOVTA2aE50WDBVRFU3bDJ1Y2JYVjl1eEM2d29ZSmVPNnpqc0NoN21WN09teVB5TlJjVGRtK21DOU8zRE5rT04reFhuUllrZFVRVXFMZ1FpNEpSMUFMMXE4RVdsWUYzY3gzRisrOTIyQUtsb1lCOTlOQUhvQ21zVXNxanFOVVBGb2pkZk4zL2VFZjdURWJsNjgzYTB0NDZqVXhIYi9LMFhVamFzSXNQcEJKenY0bDExbmxDay9xUVBxM0lVa2RFcmxlSHZsc2lrc21pZDgyWGtZUzA2WWFGL1d0MFJBT0FLdkFwZmxnN2UzOW54REgvTFdzSWx2VGkwWWtEbGVXUnlVSVFHeHdUUWNsc0Fvc2h6M05UbTBGM0tLeWkvOFFRYjFSOEkxd1VPanA4d29ONnFlOTlNNis0cFVKRWpCZ0huUVR2Q09wQmgwNXlwbEIyckw5TXJEdnNOa2dhZHJmY0ZubWVqbkt2YllBdGZoU3Azb2JtWm40cjBKOUxLbzJ0L0FFZFVORHpmSVZkMXY2SURjeERsdFI3bnlJeCtQSk1sUWpJNGh3aGdFalI2SFNWYnM0MlFXbU91RllkWDFsbkhySHVValllbWV6ZzhQOGp0eHhid0RaOVc4Wnd6cXBiZHVaUktIT3dPQzNZYUNLVVlXOEhscDdCNXVTTVEzM3F2eDY1T3FHMVRHdVRYQ21USVRPcmFYSHVRVWFEMHBBRnFZTENzOVZrOWsvQ1M5elhyT1pLZVFmTVB2Wm1CNGFXWEdjTTZ4bUxLckloNmVSYXpBOVkrdGZSV2tvd2VCMldZSHIvc3k1OSsrd29jVkoxNEczUURiUzNWM2VsaysvY2xGQ090aURaMGJiQ1psd0t0aWYxcWJ4dnRUTnRBNEhvY1VuOWcrRllzUHlkcDk4czRUL1VBL1hsajBtOXNlcTJuSzJpbWdGeE80cnNIWHNQaStzUloyeXRiTGlnWVZrMEZmcnovTnBHenRjSDIydTM4U1BMdFE2WkViZ1JKeFFRMGxVbHF4czFOTjk4ODRxV2liemNZcnBTV2FFeDRmNXljRkQ4N09wUWc1RWtQL0VnZTA0REk3SFgyYzRud0R4WThNUENyWFpEZHdNRXZLS0RDQTNXVnVnSWYxN2l3Ym1VRFJFak9IekEvRUhFayt3YVBSZ08xT1kreDNqaTg5Z0lwMUlLR0xoMlhYYU9YMWg2dWlWOUlGT1NCQXJYc3VVbjJYcmEvcGlQOUtmRHBEeFhmcFlTTGhkcHhnQUZTWlQyOGc0Rm82U0Z1TTNlT0c0Sm9CTTZWZUVyRnFBWjRldXRoWjVUQnZ0MC9sSlRRSUY5RFRDN1lTNjVQcnhpRXR1UHVXTUhHcXlPb2ozK1M1YnIwVzZKcFd5bE1mNFNsdUVlZkl2MUM0VE9DdmJtZGVqay8rZStmUTY4dC9MM2pBdzZQSFVBaXhGQ2JhY2lPZjBUQzhtY2xmSEdtUEhQOWNLeHV1ckh4Yyt5QmlETUl6R2JiYzhnUzFBQnNtMmlkRml0S1grRFc1YmIwWE5YL29BT3VIM2hBeUc5OWsvRkVaME53WWpzYytJenV3SjJIZkNsRitUNEUyWXVaYXkyNkVsc1J2b1BMeXp1dFdmYnUzOWJpQWJXV0dvSmxWSUNmeW1NQWxUNWdaQkNoeGM4dWpsZEVIUGZBQ2xVQzNRU3NUMm02SEhGYnI2VUsvbk5wM2VsZHFIL1JOUW5mMk9IQkJZU01HNXdyYjR4RVdKb2hpcC93TVpNWXd0a1lIdHo1VDdRZzJESTVpN1gwQ2h0elBvZDdycURNV3J6OWhRdkZvZExQT1FSR28ydjc3VUgrcXNiWmJOQ2w1RUdZS2xON2p6NWZxd2wxOU05ck9kNU9jU2hZSHNZNzVCaWVoZENzWC9pZTJiR0EvRG9PcUx2MndrS21TRzh1NXhMUDJPOVEybkdDZmxVbkJrdWNPWjltWFk0ekJjcEpOU3pJTWlsUU9yMmlrWnpHQ0RxS1pDNmRwVklMSDJKd1ZSWTdjZnhTekkvZmpxSzNubmNwd3JydFZsb3V0QXVMVnZCMWJJK3JyRFRZZDExVVNISjE1cXdSOVJVa2Y5RVVIbURjemQwK1ZFVjYvc29ZbVhyMENBalZibEd4VlZjVzV3OVl0a24xRTFOYXFQWkc2ZUxRcVFJNTdOY1FNdzh0Q0krQUUvZWRVUHFmRmxHZ0hSK3libEdPS0dubUtBdGhza2hKWlRvaEQrZG9KSTdFcU5TRFo4RVk3M2YyMFd1eGVzUExvVjJOdzFqWDBRcGlDZTdBM0xIR1NxS0E1MXdMdzhuSHU4M2ZqTkNUWUhXM0hsZnVkdUNmYjVXKzdtVFdScmN5aEs2b3V5UnBxTUVyUFJDclJIZ3F4VEpWWEV5Q0xmc01zaGY5Ynp0eVJxenJzcG5CemJtcHZoTE1qNll5WDQ1b2pVQ2hkUTRlblVNbFpxVmNJdWpZQWpVQ2h0NTdHNDRJUTBGUTBoOVB5Z0pmb1IreWhSQVNxTnY2VUZuUlExSmYvTjBSNWFyRlZNQ2c3THE4WXN3Nk9uZ1lYYW5Sd0VJelpkQTJ3UEZPcVJGL3NXSjVVaTAyRnNLMzFxbTlhRElXWDFKc3BsNEJpMjFudjdhTzd0NlVqUlBqWEdaYldRS1BVYmZlVlppdTdLcVo1YmNXUEh0OUNRVlZtQmZlWjc3VHgrc2Jvalo4OWxVdld2RlNYZ085ZXZURDl4UGVrL1piTHdrb3Q3WTZUQ3JYUXpKV3F0aElaUi92MklrUWRERjFUQ041RmxWMFlNZS8vY0g0a0dLejlyM2tTRzR1VE83Q2RSTGRFMTBQNTh1UTVBWHk1cmlIbmU3aDF6WDVDUksyRjlSNEt2b3FHaE03UWErMDNsbHFFQXBadytxN3A1L0NMNHVIS0cwUEhrZGxLMit0VzRSelBqSXBXVnI4ZWhQY08reWNnU2ZDMWx1bEhuTDlac25nVlMzcE1JaXFFbE4vN25qeklrdGtZTll1dzF2NTdPTVdTRmFGR29oVEcvU09DTEcwUEFTTGR6WUZGa05WeVhTa21iQkNTbURlZ1FCSXZLZUpWSG50TUgzTU94VDR4VEJWWk9BNzVzdkJrTHlxTnJuUmdnYjNHVGdMVGNDYlZYRDRxUWxib2FmWkNBamUxR3pRMzlrb3MxVitwQWV6Nk9maHVseFVteWlweG03VTNZc2NEbXB3MjdES1V1TG1HU05Kc2lLT01qWEpvRE5ESVhkVVVPQnBlNTczbUxxV1VpN0QxMW5ZQmx2SVlidU1KZFB5UXZTMFFzeGhtK2JYd1NsdVFTajNXL2dDdzRhMTRkMVBvQktZWVgvY0E3NkRoM3FUa3Z2aHZyemRIc1luUmYxby91RU5NQmhZQWkrb09KeTkzYklrbkZURGtoOHRKMWVvZENJSTBkemxmMS9JTUNYZDVLRkdjSTUrYW9DZHFTK1lhQlRxcU9IK2o0aUhoZE1xcFBDeC85UThobHkxWnNZWm13VU8vek8yRzM2MTRRK09IM1V2KzZ2TVZ6SzFuSnRUZVJSNWhNeFFZTkgxYjF2eURmR3E1T3Z1N0E0SmlXZXBFUW1kNElWaHhQcGpxRzVsT1VyS2Iya0EraFVIR1g0MGpFbVQrbXc3SmdOOUVyc3BRdmxyTGpJT0crVUpVdDVsclBlTk9tWjFNajlmcXh4SHpDQmx1N3FqNnpPTFNCaEQvUFFXd2NzejUvSk1VNGdsS2M3YnFWU21QMVZlMnVRaVNXeHJOWVcvTXJsVlhkOERROExYMDMzcmFlanhIUW5zOFJoNDZ4eUx6aGlMS2trekZrOGV1ZjZ1UE9jYWdHQTZrMnJrdExPNCtGdUkzOHl6dW85TUM4djh6TE50b1ZXKzZCbWFXYUpSZlVIOHVYSWZ0citMQ1JDSzZBN2oyQ1VLSDZqR0dyZzFvaEh6bC9aUWwzREErT1UvMTJpNWtIdUdrN1hkVWRVejBGVU5vcTF6aTRRMGUyU3p4K0RsRmxVL1ZmdDVaUjArYkVYTldjM0g0VHBiUGQrdFM1K3ZFcFpqMExNRUYvM3YyVkFTQmhTdG9walltUEhaMzllaU40UjZCM1p3WlBDVDdYa3krQzlPMVRnck10T01aK0V5K0lnZEkwOEVaT1UrbDR5Z2E5V3dUVmxvMzJiZHU3OWdQeHFyMG54RnNnUTlwSkdRS3BjMWVIVCt1dFU2b2VJZG5zYjF1dWVSVVc0WFI3blczZ2tyc09rcGVhbDQrQy9tbVJBaTdUTkJNbTQwZWppeCt1S3JtTE5sTXRET3hQWnZocVJSYmY3cnVKM1c2RzdmT1lEbFE0eXlJQ1NaKzBxZzl0aTZPdFJvNmFBdWJDS3UwcHQ4a3J2b3pBUUR0bHJvSXpLaEEva245RzhJdmh5U2RsNldGTGhtVzVYOURXNlVLbk43S1BPZExkaXFUUlFiTGJqTWlrZFJQR25tNzYwR1V5VEliMjVjcU5qU0lqZTBIOWIzNTVkQ1ZrNzNQK0xtNFRrYVF0dU02M2xkUkRHNjQ1ZDJSWjVBYTRTN2MwRFlWQ1I4V0N6a2dtNFhjaEtvN1BZUlhLUis4dHNqVVp3SlpSbzNFUmNGVy9sQndzOEt6RWcwdlFpSjk2aTBLbDMwL3dwcnhIbnV6cDc4MEora2VneGhPQmN3enpJeU1IVG9EalFvS1BlQ0V4czdEOWRmdVI1bjBHdXU1VU55Z290dDl3TnJTWUkyZ3pIbGN6U0xNRnhtKy8yd3JxdFkrWFYrSWNXRHZ3WDQvazB3ZjJTckt2ejBRVC9NSE12aG5OS2xQQ20wdFpsWXV4QVd5dzBxdnNkMHRPdXBDMUtiUUF5MTdmbjBFaW1PYlU5QmZTSUZlbldIQjJyVlNuT0F6OVZzc3FKeTJsWkdvYk9EenhyeXh6NGhSTHJ5akRuOEZSSTNjQWxUM2cxVktwK3dPZGRqMEcvdENpNkxiT1A2ZlBvRDVKNXpRNjZBUHF1aHdudHJTc2NqdFpjd21LSEJENGR3VTZTUURKQXBOMmNUdCt1aDRDVzAvUEdLRDdSdFhhZWU2MEh1WlozYnRRK1YwYlBEVjl1R2gyTXliNFp5WXhIZ2ZLbFZNMnZYZ0VkQzBiZ3QzQ2pTdTR4RDdZbnEyZFI1V25HbXpGZXVsakdwWVNsK2RoazdjTzhjTGM5azNjbWxsanpkZ1M3YU41TWtqUkRDUnlGampaenFlTk5lbDY3Z1Fybk9jc29BdkZrQ2ZRZVpTRW5wZ0h3QXNNeEFxV1IvdDhVdHJ2MW5WZlo3eDEyS2l0MU5VaTM2VXJycGg5WW5YVVk0c0x2RVZCNUtQZ2JDN0Vwb1FERVlrTVV5T1BKQXJLeGthUERDeG1ONUEwZGtXbzBuVU0zbTBGRU10aEJEQmMrcHJ0TWN4UDd3eFVURXFDRktCWmozcmFkcnZOWEZNR3l6bllWZE5qb0NUamhPMlEybmxRbmJvbTFmYnp0dUt0eWJEblBPcGswRFZPTjNBTmFXVHZraUgyMzEyTUlFREQzRm8xSDdkOFRHSXhFMlZGQkNsUWpCZDFkOUROcDZFYS9nOExqL0pJZ3ZUOXJSYlh2TzZsOVByOHNaeXZ5K1N0QjB4bWFvNnBaQjdXcE5XVTYzNXk2RWxwVGZLNDF2ellWbFZlWVlFYVVpU0graFlOMjd3WDVrUWpTaWttODhBM2FsQzFFYjMyTFd4SHJRbnk4WmVXdmQzeFZzcVIvU2d4YUR3QXlJZjR0RWthMVdKdWZBR0lYcVV5VnozZXo1UnlLdER2RFpoVmhNSXFWK2xRSUpwZWdmSTc2SkI3VkZLbWYwL2xyUTdzUnhRUVN5Tk8yOGtRc0tiRUhpeTR1TXArdjlvQ0o5ckJDbU80UDRsRzhidzNEdnF1Z0oxUHZHbHgxT2NTQnlBWEEzT29MT2N5N2paNGFidXlya2p0ZEVDUjBaRllrUFpTY1p5RjVlQmgrTUQrSUZIQnlxSktZZmxENnhJdW5RYUVGKzFMS3hBUFRHZDRic3hGdDhMdGZlbDhKYlZEdEd3cnJsdnlVTE1xN1dyTkV1WlE4MUlEcnQ0bXNqZkx4TEZXYjBxeXZLTThra1JZYjlMWjBBUUpLd2pWRk5hN0ttM1E1V3lHMnpka2tnRVY5MWduNmlpRXJvZVpsaHJCZ0d4WVIwdWNrZWVnd25MUUxRdGQ5SHBhRFIzYUZCMEhmZWo3Yy9HaFp2dmxzbkcrUHJDR01pdm1xL0oxOUJNT2g0SXlnQkJ4MzRXNEZleUJhL1dGMWNBcjUySHk1aEE3aFQxd0F5VjRvbGVSUGpRcENjaGM2TGJFY21UQWordjR3Q2d4bGlaYkJVMkpvQnNwc0x0R2p1VFZaa2FuZlgrRFhSQ1Z2SHlOcmJZM0FrellOajNWbzhvSDBWM3l1RzA5RW5ibjcxeTVtNzdlK04xaFhla3ZUM2dqNzNhQ01zMWErTGNYdVd4d0xMSkZrK3FGOHpvdTV2WFJJQ1dwS0FISVpvUHBsMlBvMFJyMmEvYWhVQk5EeHk0NjdValR2bElnejdNdUlsOXZYNDJpdWFCS3FneVdVenBlN3FicHlFM2lvQkpSUHcvYWl5STBWbXJWM0d4enZDQVVXUWtaTGRqT05JUmZEK2NLbDBCdk90dVFjdFRhcnYwOUlzbDF2MU5RRzgvRWErbm9WRmx3OXBwOStYTUNoWmE5QUM3ejQ2SWJIR3d1NjZUdVM3eXptaFJvZTQvMVY4RFJ6M0VycjdZN2FqbnpEdUt1WVFoRll3aWNyZi9HNHBFY09TK3JjZUR4bDhaRzhkZkZwT0dvL1lhQjIxUTFmSDdoM0JtbHpjaXNOdUlxQUFVNXJwdldVdW9ZcGM5cGVMa1hMSUhUZjF0bjFiQy9ic2Z3WW50TnNOc2ovSW9odGVPMktrTHQyNDg3cWUrSmJCZWNRQ2JjSkIxVURGK1FpdE5NUlhyY3M1NEY2UFV5Mys3YllEc1Ewd2krVXJGaHkvS1kxSEdqV2I4bmt5RFZrN2pBRjRxQzVOcGJyVzdvMTdwWERkRkkwNGR3R0FBS2d1NldYdlVhUiswTElOWlVMLzhhWFZ4RjhzeEZOTGZIV2lVRjM2cVlWd1dabmpZanNPYkYxUTF6THB5Y3lQRFg5SDlnczBxSWc1K2dzVmNjdVhocGJLRExNbGFrSHVGMUZKV3Axd3N5djFnYmlnV0lvOHRwNmNMTkduK2dDTzlCWlVHUm1XUGEwaUwwbXhodDdScnRsTUhiU1gzSzJSUHdTSzRHZDFtclFEWEVjMTE2aUFoMjB3ZGFoN0lYRmhPZS9DOUdlLzYydDRVaTRVemJYTGIyckY5K1lEYkx0U2o0OGR5Rlkwck9WaW1IQ3NUTWk3ajhKaHN0ZkpEVndhTDlDU01ndjl4bmZXeGg5ZVdHditKT3I2SXF6TTArZTNEaU1QdkZzSHRQT0pYS3NIYzZ3RmU4QTNYMEsyK3FLYjhYL214YVlBQkloRkwreVJIbnpZV2xrQVI5MHVHVDNpMHZzTi85M1JoMGlmeDZ3T1VMNGNNci9PS0dEL3Z3TUdGUll0NFB6NEh0THkxTkNlbFhkb29hYVRvejdZWkZsdWl4VmdLemZjL2w4TFEyVmJ3RWFwQmd4eWMwVnRjSGE3Z2xpOUcyNTQ2R0FNUXd0R25qYk9DZ3ZVSlN3UWdWc3NvSnVoZjZFSEx6QjhNWmNBa0RKbGZsV2NnUHVPV2YzTFJzQ1BBTk03V0thRlJWczhzRXpBV3FCWWJxWWRjM0xONVBKaGpTOUJYbVpkR3h3RElOYXF4eDJBYWZOWXVNU2xrbllkMVpFa2lwL1cvU3VQM0NYSHFCd1A4bDhyZFJUUWFFTFZ5VVBIUjh3UWxXd3JueVQxaVltREUrT0ZkMW1ZVG53ZGlIbUMxL2xMQTU5MFBkUnhyUjFFbUpNZUhJMVJtZmVPOXpKYkd2WkpDc2R0emVOYmVHV3JBOW9FQ2VlalZuUEdyNWhUMER6WE5kVjh2YkhGaXNYWksxV3k3ZUxxUkxjWkliMlZNVEFnQkFvL2g1S29mMmlaUmVTelJWN0w3TU9Ta1g0ZVp5Y1JWY2llQUdnTWdNZWg4dUdIVjhhb2l5R25IZnlSTkJaUk1uNlhMdjRsUjNNMjVBV21zWEQ5YXVyc29mbFR3aUtLaFdTY0VwaHZUdVBSSlhJdUFvU1J0ZGZ0SmJvcitncmJOaEFoY2VseVpYVExZQm1idDlzWWZERW8yYnMxWkk4c00zQTZhZjZFQzB5UVQ0K3FhM0J3VDhIM0x5Q1dwMXpldEFRMjhxK3JFcFdLZG14VkVtM1h0QWErWUlyazQyREY4ZWZnNEtTSVFZTVlxWVlNdnl0N3V5SUgxWk1lL1hKWVk4SjhGbHdCQUdQMVNROTR5VUxWNE5acndLWFFBYUJsZkVlZWV6TjhzeTBBNmFrbS9rMzJmcDl5T01aT0dPbGxUOUNVR3krcWlPUDZZSnFTMi9SbkhneHljOWhEbXR3LzN1Tmk0dGh1dThsZTFLQ1ZDaU1mY3pDTGxXeHl2c01YVlpscWM0VEt0M3liTFdta1ZxaDErZXBzS0FTL3o2MU1YaVZwem9QRkZ2cWQzdGh2aENpNk82dExNd2ZRYlFvMHdjeWtNcGN2Z2pNaGNrNWMvWVV6QUNkdXdhWUp1NFVKMVhtKzdPVy9Yd01kLzhGb1grOFN5SWNkTjQ3bDJFeGdRbHp4dVBTOVFPOHJuc2lRT1ZlaFlRdFpvTjhxOXBvdTZqenVIREtJekk3cTRISHNhNkFQUUxoalBWRUx3NzZkQjQ4cFdNaVB1bzE0eGVvd0JhSjc2czljZlE3ajh6STJNZzZpRjJmRC9BY0RJdWcrU1k1ZFBTVXBxOFFLYVI3R3E2V3dmVzREUVhoTHN3cnlveFl4eVdkdWU4VFFKZUNsR0JRR051K0d1NFV4SDFwL21LK3FCK2c2VnZkbHdyZGR4bUt2amZVTXUySlBWR0FYMEJJd3dFNXdyTDRBOHdCelVxYU4xaktNRjFOemlEdjA4TGhZc0MreUtGanRDQnhIKzJvVDA3OWMrL3FDZVFWWEtscFZaU0IrZkU4cDFpbGo4TUlWbTEwV3NWQzRlY0ZBQVhoVWRCeTEyREdvY0RuZVB1ZC95bGZsRkxPcXFMSStRaFhzZkhjKzNRN0pOM0pXN3lLVmtCalpwWG5Za3hrQURnVWhaNm9MaS9qNnhNT0VKTWgxaHl2NXlWUHlnb1dOZE9uME4wMGI2K1gyV29Sb1lNT3A1dnVPQzl3Sm1BZTFDekxlQjlpZUk5YS84Y3hzSjhHZy8yVUtZQ1lHbE84RDY4MWpWeW42elhiSCt6MGVCSVhBMmFaWlJHcDE2ZEZEcmJsSjNzWis3ekc0bk45YzFubVBuUUZCL2FMNEE0bTV6Z3VUaDRiZTFPNHc1czMvMENoRHZQVkZmMGdpeUlxUThYQ3U4NmhnOW5DelVYMExZS2pvZXp6YStzVnFXTGVXZWtNWVY5ZDdTT2xRQ3FuL1dqRk9ER09TcXVrZVBzWTMxVW1pa2I4ZTdzbWZRdDE4QWx3OG5oMEh0eUExbWZmbmZIemxkYXFreGFhZVhxNm1yUURPME1zbHVkVHppVFhUdSthUCtVdlVIeWhqQUZrK2xvM3BtVXRWalVLaGN1WHdFQjgzQy9JckpMVDFPYTM2dGdaNmhtWFJFbzVxMy9NT2RzT2VOSlpKZXpCbXJRakFDS1FHVWxxUXRvM3pIVmtxOWpvMlZXUUZybmFWMk55VGRCVytzeHJKSXRzd2RsK3NCZEp2M1loaElhdkJ3a0lDUWpGd25mcnN5bmh0U1prbWJRQTVYaXBWb3V6bVpsS29IV3paU3BkNnkyL0oxcGs4M0EvVlVHcVBTM0N0UXFiT1RzcUhjRWkwc0tCK0pidEdCTXVPMkhpVko4a3JSMnRoUlZZQ1NkamhrbHRoK1BIRzVJODB1aHFUNmZRMXJvUjh3UjF2WkpUT0xsb094VjA0bFhnZTZGMWtVaHd5K2VIWllBOElpRFZCR3g1SDVsYTRJbW12VkFVNnU5RllRZVM4R0JUQk05Mlk1a1cwelRoRTBxNHdsb1NaM1lPTThyYkRJK0Q2dkg4VUFUSVJQd0lIdklTSGYwazB5N2FWVUtiSVJNbU9SOUEyY01mUCtqdk5UeVh2M1JPQ3hEeExJZ2hOdEpDb2pzaUExaW5ZSStXazB1b2thOHIwaXRYWW53QVJ5VmpINEhOVFNXWG8vZE9PWFhKOG9CbHhRY2J3UjFGTnZGbEI4VDgzbzlQOENlR3JyeEx1cHdad1VuS3l5dWJoWFc5Vldoa3NnMHZwUkUrbFdtekhSQ0x5SmUybjJwdTRpYno2a044eU9ITDQvUk9TWjJqZk9ETndWc3JZRk0zbkROYVZHamJVbGhFSVRFYzdBVXMwK3dYUksvWkxubE9COXZrLy9XcjVENEk3a2paQWErWkhHQVlEUS8zODdVZ0Y3SXlXUDN2QkY4eUVJVnB1WEN6Z3QyZmpyejNvVnc1VlVEZWFmMEptNm5DRE5FaElSSmk4MHllNzBtMmZJVTVwY215OU1Ia05tSXpLVjBUNkk5cEdUS3NlV3hTTytzWHJkLzBqcXMzTXd5aU8reUdhd3dhb0xaWEZxQXpRRTV6Z3NtZXdMYXdzRWhYNVZQMFlHT00rUlpjNFIrY3RQeUZxL2RGOTR5VnpKbFJRcldMTFpLTFhKMzVHUjZhN2RuQys1cWZJeitEM0lFMkUzN1hkcFJrV3VqNThNNkNsT2doazd6clhMaWpXTkQ1ZXhEc0l4TjlNVGR1UFN5NEljVm4zQ1g3R2wzNlZpNUhNSTZ0alVRVVkxT0lLNWhGSUZ0ZThGYmdSVDgvd2ZIZjhIVUxrUVRCbFc1UVNsc2NjR1I4Uy9hQmRRQ1VueTJEZDB5TWtzN1gvOCtKWWhscXdoa0NmOHQ5L213WDc5MUlUdHAvUWZ1ZTdIbUFEMmUwZGxKSnQ2SlR3aDVlclFtMEhpN1BCU2piWHJZWXVXZWtHR09EejMxMUZ0WUJYdEM2eFZ5OTVZaU1uRlFXWkVyKy9YY1FiRmZoWnRYSmZ3R1BneVBGVXM0NFcyVEtmSktJRmJVMGdYTDJzWTJIWWJhYU5jMU5RY3VYUE96dnZDb3h5cVNUU2hPazVabXNYWWVvbzRmd05qVWR1UndlVktGcE5tYWVPRE5PNjlzcXlXQ3lsUkYzTVhPdFVYNkh1c2Z1amt5ekRINys3Vy95V0MvMy9LeTRpanE2TDhsdEI1a28rMmcwaVVLSjZMWUVhVlZQZGpQUnREMFlnb2M3NUJwbm8vT3JzYlJyZFJaazA5K0lIQk5mRnZUVDFoTWMyNUU3T09zMlJPTnVscTc1NEJ3Z2Z6WWM5dHk0OE5ETWZJd0ZOSlAvTFN4enp2bzg4ZHBFTHhqZ01KQUpPa1JxRDcrT0FnMGN6QUJmM0l1RUh0YTFvVkMrTHdZNmZyR1pqdmJEaTB3UzlMSmI4eXovWkluNVF5cFRPTXJNMVh0NVdmVHhIckw1VEczdnJMZ0J2SktsUjdyaG9GMlp4dWc0U2V3ZzBtNWVBSTdKU1h6ZmE5aUZkYkNRaVU5OUxCQUE3QmRLUXg5NFRqWjZtcHlCcUhOMmNBWDdyODQ0MjR1Zlk1eEJ0KzMxQTNWc0VRWlAxZ1RUUjhDUTJPMitNUEVWSVRsSnpQNm9WUm9VdVArWkxtUUtjRG1UNVF6VkNXK1dqdzFHQnJaOUxmWHZ6RFJYdlJMY05lMXFmUzNuUDFDL3JWdUtXL2pBVGpGMlNuV1RLOEY0T2FlbXBGbnlBWnBCWDE3SlVjMmIzeE14Wmo5ZGI0QmorcFZYWlFCdEd5cisydHVCSEdVTzdmblFzR1RtRnBKT2ExTURKSFF5Qlp4aFNUd3kzQ1FwRGZmNmw4aWJkNmJWdDlXZ085TmFTOWNZSzIrQS83YWtXMmxybDNSMDY4ZVJYZ3FiWGd6VzFpMythdUZJN1ZUWVR0a2gxTlFiVW4xUzliOEM2M1k1WG4xS1dHUUJwRDJESnlmWEZVbXV1WDJaNHZIQXFuOGZMazcrVzBpNFFBMjlUbGxhOHlsMkY4N1piT1gwTjFmRWl1aDRQQUN3TjZUdUxUYnpuTW1YSWR1Z3pPWTU0RFcwSUcrQitYODhtRzhwdE9nVkFxMlkxVGF6QUNpK3hmU1FML05hK0R2M1hoQi9vdHRJMlVsYUVubEp3clkzVUV4ZWJNbGthak9TZ1VWZlZoeGl2SmNhamZIakdtZHh6Mm9URWM2SU0yaWx5MDZMUWtLT0R6SVdIQ0RVdTczUmw0RXBBaGRXQ3dCbktOb1Zkb0lQQnU2Mk54ZDd2TWVwekFuQjdUZmJBR3I0Rlh5ZHVDQlpXc0RqMzJhWlA1WmV6cHFpV2ZWV3Vybkh2dWxxM2hRTEFxM3lmanhFUkJkQzVoaHkyMWo2ZzNKMjBQencxTVE1ZTk4d3RZUlY5U1FZWEFyeGRKY0l2dVppb0kxaGFIemNTRWwrZGx1bHFacjNhQ3pzMTl0QjZJMnRIN1prQ0ZZNDNrVUwzL1hGZUMxK2k4RXlpdlRPRFlCeVV6RU9zbUNUVHdNRmhzSHpCcExqVkhSUlI3L1NPbkJ0bW5QL0hobkF6UGhRYXJhdHhBVjNxdmF1TEI4K0YyazhhTkRQclhodEFyaXBoQjdFbTBiRUxIeTZsQ2x0czExRnNzODhMNitHMWdYbnZtM2Zia0V6d2tSdjlmOVdFQVlUL0JBcHdCK0M2d3Joa1ZpNXdRdzZISFFJOFhQOXNiTGlGY01sN2QyUUlOT213dWNsSUY2c1hUWXRwUlJwUTIzN0dycWJrWTBWZit3WFRpWVZ0b3NNMkRidklOU1Jjejkzb3dVc2pnMURCNVhvYmNIRTBPbGZXVGtyZUg4VXAwcWxpL3E0V0ptUEpMLzNkS3krR2dLeGVMSDQ4MkxkRVdxdFAvZHY4NjBVNUYveFRKMWx0RU0vcC9YRWRHWGMrbDduWDByaTM0TlhiWEhORU83bmpwMWJiS2Y3K3RWNW4rYVBEUFU5VDEzaStqbkg3cWxSZlBGOTZsMTJzSnJwVGRkLzhoVG5Ici9TZk1zRGRtVXNMcjdxL3hwbWNUSzlBd01JeDZ1NzloYXd1MnptN1loK1RSbDZUU2hOSmdhaDlIQ0RkL0pNWE9zWU9MMWRKVTVnMS9LS3AxYk5uc0puck1rdEVYTXhxaVc0cVM4R250S1hpdXRJYWorUE4zS3diNVV1dzRpc2htRjFOZTVkbWE3QWl1YW9NMDhSLzZBL05qZ2txaEp4TlZqMVlNTTBRSzZMTDhvdUFFYWRNRWZQdEpoWWRkWlg5VnhnczVIM2RyQ2dlbDBuUXhDV0FNclpZWWNhR01tbEIyMHhBNGpRRlhBQkM3aWVRN3VhUTUya0VGUjBxVHJ3cW1ocERMQlNCOEZ3cGxtaEpOM2Z1dlROclhsRWU1MjVvVEhQQ0todVFlR2tVRzJEWW4zUGlOQTZnTWhuVHhIZy85TzJqRm90SzR3aTdGN0hUbTA2OXdqVnFJTTUrZUNyMW90dFlEcXArN1VQT05qSTU3eFR3Y3d3S0VocGY0SHM4NDdodDB0QkZEV3o2bE16d1NtU0xURHhIMkQ2UGdweVNLemJDOXdIUzJ0bUF1WXFJdWFrWktMb2VFZC9KN28weW45OTVxM0RzQ3lVY2FLSUlBUjdveDJqdUdNTE1MZkQwT1FQSnp3NmMraHVWekxPWWJsQ0xlVlIxRDdQWktvbGtVVmFFdjN1Um9WeHdHaE5SMnEzcFhSei9RK2tId1hLTFFYbXBGczZpOU9zYS9veStmdkhQbk1IL3BmYzZveFExUDVoNHBCSGhHQlY2U0tWaUE5VlJGcmp0VTRXZ2UyZXYvVng2cDBUTElZcE5BR2NTcU9NbDdITCszL0g0dXI1NFYzWWVZb3RnRkh2ZWZ6ZEFBN2F4dXMwaFJPWkVJMXlYMkN2ZDRvWHU1bzRYaW54Yk9QNTBJR3JHdG1xZGxQaUhUTVdqTDlJK0JuOVdrTUtaWUUyQmlOSDFqQzNPNEFFTGR5QVc2YTA0WXRqNll2elc5TGhHNGplcGNRWnFScytDOHFhK05BK3hUUWxxWStyTHNXQnFua2paV3JQMjhUYzJ1VEN1VFBaRytwazZ5UjJxRlVSMExpY1JTclI1LzN1dGVXR3JPcC90ME9zYXU0VTVJYzAvcGxWY05seFY5WXpXZHJNRjJ0TUVGK1dBeXU0Z0xrRGZQeUUwUVpiUnV4V2V2QlNvTHRWQ29GRDNqczBVWFN4L2c5NzdpQTNXM3doVUwzQ1dtSTljcFZCOGVqWllyVkhRaWdiUnFsTDFMVm5LZTA2YVJ0VnphZDNFU1dMRTNCc3F0T3V1WnBOM1JsRUVZTlNzYnJsSGNoSjNKUE9EcG45Rk9Hb2V2M3NETXVGbzRxUkJIcjhPVW5UVXAxL3M1T0RlYlg3V1BaSW1qU2NKamVnVllnV2NyTnZDblFIN2lLUlRHR21lMVhudjd4Nk13aUJnZE9TV0Rrdld3Ti9wQkNxMDdVR2lwSWxQNkp4ZU9Pc2JLbzJ6cUtOVUd4MElWN2F6VVltYWRWbXloOHJZeDc3ZjN5bGtRY2JiTXlveld2Ni9zRTY4ejYvUU5XWnVzbGlGYmRIbXNGaDFXVGhKeGlSRjA2d1lDMHQ0OUpMcnV2akJoRFduWHJrNGVDTnRIMmwvY1BNMm82SXkyWU9FNzRzRkhqVEZtRDVYRFFzNTJZWkNVSFdJLzVWZHZXWWZzNzE4ZHpDUFhRZFRVMzgwUGdJcXpmSGJ2Q3hZNHp2OEVDc2djd3NqMy9zZHFUbSthNUNoUkZHT0tlcFVZdlhBNjZkQTJFS2dYTldVZXpuYmtNYzFEdWVwZDdQeHBhSGg4cHcxNkxGNXNhcmVZamFHclI2YnJ6UHdwd3BXancrOThkd3FsV09BbDRZV0prZHJkSGIzeCtabEh5UjErclF6N2NMaXZCOCtmRmkrU2dDU1hvZlRsSnl0dGJvOEVrbUdvai9Rb2dkclkwM3NMK2hEWWN3a0dVKy9CditjRUNQWjFucmpVR2I2d2dxZlVSaXF3Q3hyem4vYUY0cXB1U3dqbXI2ai9TaEVDaDc4V0laWksrVnlBTDRKa1FkM3FWWnQ3dmZGRCtWdG9YMGFxdGxwRVhJb3VQL2hta3VyZkhZZ1U4OW5zM2dueXdnZjdUTDJtUkl3OXJuQkpZMU5aRmlpU1VhOW1hOXd0VEQyV09Zck55Q0NMR1IzV3RTVklSY1NmK244QjBRMzA2bnBRdk5nOVVjSWs5WXJUMEdGVVFJV1pualNwcFZreEw4N09aMTFseU9pa3l6RFdlcDREcnlWTnlyZDE4MUx0OHJ2UU1tamRlVGdvQkgramdTWWFrcWdPVDBCcmhTNE1JMUMzQVBYVnpsazhaTUVnRGg3WEVFOEg4U2Q0RGhBTlcvUFFpVDB3ODcvMzMxdlA3R0ZwZVljZWhxMmYyNEdMc2hxYkFTekVMVjQ0UVNNOEJNcVNmWWsyV2FWY2VKM1lRSllNc1FNcEt6Yks2Q2ZQcGZveWpVdmtsNG05SWZxanZBOGtmOTJWSW5DTTIwMjFvcXNLVHNDa0xmcnlBd2hERnRIK3hyUE1ibjBneHdVUGRKYVNhZEFSOWFzbHlsOEZ6WGxwbmFhRysyZFE4SXlpcWM2WGFoUncxMHJra3diUEowcFFXTk5LaHM0amFqNjN5QXB1cDkxcjR6K3pTSHNwTFBMektwdTNkUDZDd2VEWUVyRjdpUDRObTNZT1RuNFBhcU5aVEoyUzVnNk1zelhGTEZXQTVxSUs0Z2dQenExUHVQdGl0dVU0d3BHMVRoOFFpVEFPeDhXNmZVUEFERlN3V3ZwSTBJSFhSYnVtSldsRWFJd1BPV1E2T1huNHpVZThzeFMvL0VpcExxbDlMVEZRc3Jyak9wWXQ3ZXZ0ditqd01XVnNHQVZ5aEFKOUlmbFBOUU9OK1I4STZWa25FcFk1ZFh6NzRnTW00eVhiRHNwZlpNM1NwNUU0WHV4RzBBREJGZFVxdVNBaS94eG9lSXoybDJmanJpOVRST05TYWVXN3Q2R0RsYzBwRDl0NkJhaG5EMmtINmdLWW8yVzlnMVN1SjRXNXRVNWtnNXF0N055ZEpzVk56WVNhcmdSMHQ2NG5sbW9nVDRab2duN2h6MkEvSHFMUUp0cnlDT0FEeGplOXFQaWxaSWErcDJGNHplMnFpanpHTFFCbWFvNzVIV0JDZmowQzV4ZXlISHlacUdmcjlXc0hXN01wSDVMWllSNmlia1VOSGxHejF3NVVlQndadU00bHp2YTlWTElaNTNsek1XWWdMbVRocmppWXZOcVUrTStWNDFjMVFYczVjcmp0NitrbzZRMCtudlFyWDRhS1R6UVF5Y0hkMEdRWS9ieGRCZkVGZ3Y3UFB3OUVGcFY2QUppeWxTTkRsNWpLWithY1JhWDhCUElJbG1LSVVoMlBTUUdESjE5NFgxdWVNWmk0bmJiL0dKY0tEYWlnNisvNHlNUFl4MWQ5K0dHMk5LY0VwNTF1WEkxSTA3S25LZlorT05IdzIyMW03OWdaaGl1ZVBYSkxvT3A3RkN5UTdqK1cwTjBMV05TbmRhUlB6anUwVFdiUjczY2d1WGQvZ205cmdrOGVyU0F5VHVsMEQvYk0venhlZmFjWTBYM2g3eCtsZ0ZpVXNzWkd6enN1YkJ3K0J1eXlMKzQyVDZRbkV2U0ExeDhDUDhmNUoxemRtUjREcWgyTisvclc3THVtL0pvRmtpK0w1SER6eXBsY1g3aGN3QXFBS2orTlNka2NpdWhsaWw4WUkwWHNoNlRmb3JpTVdZQnJQMDZhZzhKTzlvanBxekJpbk1oUGdhbHFyV1pneXNObWNyeVJpOE1zRHJIK2tKNTJwWS9pcEFoeXgrUlI2SWc5RXJhVnVuc2t2ckhKMzNHYklqT0dRb1ExYkxnMUF1SlFEUmU0OTBRbGlLejZjZ0o3TkkreWxyREdOcm1CWFhzd2tHbFErRmROOEcybnJwNElDK3FnWSttZGJjOGI3b29ndDNWbVFJQzJpUTZhV0k3ODB1K1RpbHdpaldsRG1MbEZ3Qk5jbDdlTlptQjFQOW1UOEwxbDRTUFF0YVlSMWJ1MHFUMTEzVmsvSFYySCszaTVuRUx1OEVlUUFtbHBUcWlYZDlzU3pNUU5hVzZyOEFlNGNBamVuckpjc3Q0TUxXZXpLdVBqUmoxODg5WUQzTlp1Y2NMQUdlQ3ZGRHlJMDZteUUzeUNRUUMrVHpyNGhucnlZczNRVHRmOVA5VkoxRHhlVHBJbnh5MEsvdDVQeVZ0UDM4M2tZclMzRTJadXdIRlVMYzkyUXRTSHlBZzNNTTF2c1Q4V3NaTTJYRkpNcHEyQ2ZrUHhKWmZJcEdIVXVkTG43Yld0Tlh4VlNPOVBoWFZ0SjRJRU5NeEZoTEpvaU80THZ5a3c0RlZ3WmJsY2pDK0lxeGNZcGV5NlRvMTFEQVBDYUwxVzBjQ0xNYVlQTnphbFMzT2VJcGxPNHJnOW1QNHhSMFk0UTNqcjNseUJOUkl2SGcvajcvOUErajZsV2tkMFV3TG1JWE0weUVjMXZPVjN4VGRVWXQwSDVrNzMvcFlNNmszK0liSFRva3B0MWpYc3ZXSVVJN1cyUVZlMm9KS1duL2JYQW9keFFTVnUvZUl5bzVRZFVuZGJ1Q2hjeE5waHJuaVcxSXk5WGY3aTYzdFVPSXRYUllGU1lITThSdHpTdVNUdG1PNjVpWXlnK2dxNHVxN0VsYzBGeHQrckdqa1NVakVrRWlXVEpXZzMvVmtPVjU4NWZZK24zOVd1d3JtS3MzRDhIVFFGK2tZenFlVWZCV2ZjbFZXdEhxMjZZdEpLdnBVdDBreDcyTnNPVUNHSThBTnU5Q1BPZmR0SW1HYks0UEJLNkp4bFpwdXBKMlY1Z1FyUTBtVXRseTVWN0srOVlZT1YrU04zeThIWUFpS3pTdWNJZ0lQOHB3M2luTlU3cndVVHBUdzZMMlN2d2U0VXJFRS9YUWtSQ1NnTEw2bmRSSVpxLzJ6aGREajZZcDFTbkVYR2tBSEMwMUREdnE2ZVhPV2VMK2dCZjBrdzhLVjI1eGhiK0FZT0Y2Ky90Rlc1aHRhdE94aEI2UGZoNVNKMkU3UnZkT2xWT1ZlaHk2dktsK3JrZGZTVmx0WngrZnhMTkVQRUtGdFpPTjliME45ZnlBZDVwbmlmaWc0TDJjWkpMMTQ0UVYxZmw3Tlo2ZnVTN0ZHTHNvLzN1eDV6UUw4NDE1OWFJT2t3UUJwRm80bjJYK0ZxRXQrN2YzekxZSThSdXROWTNYSDJuRkNENnR4TXBIeVFEWGdMVmhKdkRKbFM3Wk1mUzFpenZ5NUQ1TW5UMzlvbWlDNUYxc016VEFhOVJTVkRnbzJaZGhzZkZ1cmNPekRqcE5mSk9nUEZvLzg1OGZHWGZMMjR4bXh1ZENMSy9UQzg3TDJWTlRUT0p1QlBZcHNMM2xPL0JkWXBWYkszb3pDZGxvTVVobEphNVdWcGJSTFRvQ29mNGUwTUMveng4QjB6Z0NQWWNaWHZ2ZFQ3V0hKMUxveHZWUGwzWEJJNDBybjR3bTR1Y2pBUGJDUmdPdWZ5Nkt0YU9nTmhtS21CK2V3QU1ETi9yTmdEd25EcmJRcnY1NFpaL1M0WHlMdnJSUDhQN1pQbzJDY1liVzVIdG81elRxbEZQSXR1K1hxVFBiTmhqcXF6VlZXL2FjTWtiTmFYeXBJRnl6Yy9WaGRGTnI4L0MvNzZsRFBHMVlsZ295ZUZCUkpxQVlXNDIwVmpaRlZVV2gzbDAvUUFvT29xLzJ6YitiNVNMckliYUFwOXVVV09XTkc4QzZZSnBqRFlDelZHZXZUem14UkNVb3kyOExjc0crN2RoWC9vSnplc216Vzg4bzJRTlJCSlhtZmxuUkdjYmcrSElmMTBlSzg0ZS9vSktVMkNLR01NTmlHSVFTM3REdVRKT2tRRTB6QlFTejM3RXZkcmhGWnFJNTVQc0VJdHkvRW5Id1RJR2Y1WU41Qm05ZEViUXg2KzIrUHd4a2cxa3pHQ1hUQVZMWDhuU0JUdUJsNEZsUHN0ODZzcDRtd0dPYzU4UGltMkg0R083VFNaaC92bDNWOTVNeHFnT1RnYTRRSTJNQ2cwelZLSHVaM0lIaWNDU2hvbXVqRE9vYlZDeDFVS053dGZhYnB3NGdhY1NYckROTGpzakNOa1ljL0VST2trTnJ3YnVDYW4wZEQzNUdNWHVIUUZsMCs0SDBONC9QanNhMzlyTkNOcHAzU29kSHhMa1ZoZ3VyYnFqVStEVThSTGxkcFRaRmJDQ0dla0RUUytrUnpReDhjZEQ1Qllzcm82K01pV3pvQkRxTjFGZDV1WnZxWXRlQ3VYS1RsNTNTdVV3UmlscmIzNkNtd3pYOWhvUHN6RGRVUVRxOEpNVEo5QlRmQzZ2U1VZWmx3QXlpUEhZanpHVmMwK0RCMTVaK3E2Vk9nMk5UV0VRUGkvN0JLWEtFNy9GMU1yYlE5cmxRdjQrZWkxcEt0NjZ0Q05oYVFUT0srZzVLajdsSGFjRVdYMmNZMkNLWSs0MmQycGZxNThaQUdHL3UvNW1EVE5xcDNldzdpY2FHQit2dHFyUG1CR0ZiMnF5Z09tbElMdDhoMGZGVlFhWFRhZW9TMUhoZ3Zuc2NCWHpaZ2Z1VWpQbkRyS1oyV1AyRS83TDY5bHVCYkxEaWVPcEJRanZOMkVUVWtnYm9oeUttUVA5dkVwalRUZXJXM2g5SWFOMklxd0J6MDFNbWtEVFowNkc0UWVPbXNwU2J6c0wraXVPTWluT1AzTWRMam9lV0ZiUXp4NVM2YzFWemZVaGdYNU9QTlN4ZkkrUS9ld1FnaW5lYUdBVG90QVZaczlwSkxGRnI5RHNMRHFYdUlWZWg4cXgrQnd1T1hQUU9oeDlHSVA5OHJSSVJqV3pOdzNSRXRpRURQMEV0Sy9ZMVRvSlp5bk5UdFdmZDZGT3l5ekJsY3FCNWNHSnhtbVdrV0hRbWhpWENTVmwyTnVMVVdlVEtWeDRxaUxhV0VDU0NxOHQ1ZCtEWWc3anhrUUo5VDJ3NWE2eHR2bGlHMUszbmhRVUhaVkJGNC9HbHMvUjdXa3dXdm9QYjFtdU5GM1cwY3lrcUs1a2J5YTcyQ1ZaeEJERDVjeTYyazNmZ3RHZXpvS3hnazU5N1ZobjEvclJ1Q2pNOVNpK2tSVkNxNnExTEptWXlJSjNpRGxuR2VSWHp4MHdZQlJibnF3TnRBTG5HSUt3a2NiTlgrczd3MjIrQVdGeVdndkJpMml2VTNndXJxS3pHVVhrZ3E5enlnN0MvMGtJQ3UxK2NadnAzMUFlcnlzUVRsSzhEd0VvL0g1K0x3bnN3MUxoVlJTT0dnZDRYOTRvenNQbXVOQ0xwNjhDaWtKdm5hajQ5bHRMcitNb1JLVjRnV0RPdDRQd0phMktnZXdnY3JEVEJPV1ZUVDhmTVRERlpDdXY0eXRLdCtMdU12cUFLLzBjS1dBb25hNjg0R04rdmd2WEluYm1vbnQxQWw3b1dnNmU0UFVqcEJwbktnWFRPNWQ0TFJ5c0xLWkp0cTQ5VDdHb2hFa0k0ZVBjTnNXcG5iSjc2YjFIZnFTNW1ESHVKTGJXd3dqN2oycEdXeGlmdUoyVEJnb3h3Ulh0ZERzWDFudUdlbk9DZFlBenhuZk9uRlRVaE9SNVVSalFyMDlibTRGbDhxaTd0ZkZEQTVnbkppVzBmME5VL1dtc2xnUXM1eTB0Ym10VUxHaUFQWHFUVUJPN3QwMHhNYXFmV1JUWEJ0UWc3NjA1Y2h1V211U2U3WEpONzc2OTg0dTMrcUxCNEI0YjRVYzcva2pNRWsrVWhsUnlFQTRWcmxuVkg5Zk9oeXVlMVlWdExiWC96NFpETkhyR3VpdVAvTU14Vkh4aE5HUUpZN2YxWjRETktqNitlNE1GVC9zQWtxcGZzQnRWd0ZsOElLVDJJUWF5OTNVakRjaFhWNG1tMytIRkMwbTUyUzFraVhJWkFGRUlQOE1MTUF5VXJxYlNxTWRvZU5VZ212YTFLU0Y2djJtV0p0YVhnQTJkcm03azhhcE1yL1ZMUkNSRUF6RGJIUjVRQ1JTZHdLcFp6L3hsNVRINHNZSXQyOTZ5L3ZwYUovTjU3RUw0LzRwRmY0YWtzbTFvRDgvL2pneUV3R3lYUDNmNkNzT3h5WTB6MXhrNXpVdXZzb2UvQndqV2dnZG9WR0ErYmNVSnZxRkZMZ2xIclQvUDFTc0lETkN1ZWQ2Y0R1Z0xyRFFzVXVWcmlVWExMcnlGc21YMWFCeE9VdndDd3UrOFNVWlpzQk1GNENnNk9RM0M4ZGdVR3RXbURpMURldjFXRDhNL3pmeFJyd2MycmY5MzhZeEhsRS9FdnBPZkQ5QUgyRjZQNVREamNsV2lOTjFCb2tyMG1MSE40aHdvcVkzbG5Kek9hNGxDcVArNnVudWQ4VUIzbk5hOW52RTZwYjZReWdMU3RMZ2dhRk1JWEkwcmdGdFpkbzdRZnQvTVF0Rm9ud2QyKy91ZEFwaThuQ0pubDdsMEVYTHkwWlBUOGl2Mm4yN1hnc1JJQTE4WTFSUFFKU2FtN2hadnByemNudHdkekRsNDB2RDNDazBQeDY1QlFUYTZUUElOaUljVGMyenpwTGVCWStXWTJmYTZmb3BIVGw4YUF5UUM1VWhEMWptTk04TW85R1JQVzZSM3hibDJiZWRiWjZIUnVhc3VwU0tnRVM1NGdvdmY3Y0FrSlBqbVA2YWxpKzhDS0hJY1BoWCt3QkU3YXRpejdRSDFxRUxrU2VueFpoR0JpUTZHWXE1WllVbU0ra2kyOENGaG4wV2xPa2swdWRkdnFiZlZDZWowYk44T1duWnJiYS90bndhZEJKMVhFM0FVM3FVRTZXSzVTQ0doRDFDSUVMckdLclRjYU5sWUI0NjFjZUE1Wk84Rzl3dFlIOU5ub0pDejFlckdWWVNVYWJ2MUh5RFBxd2NhZ1RHMmRneStOV1VtY0czYllkNFVWSUlRQlNhc2pudncyblNteUhxUGY0TEdwUjRpQ0tZRnVIdEk5Yk1aUW82VDFReW5yakRHZHRlNFhabHNmSmNDNThKelJtUnplYm4wQjVrZmV1WVErQmY1dHdDc1pNNjhVNzJWOG1GMzJ4WG1uSi8zTzRHcGZmckZWWlJZSUhtb1M3Q0U5VXFoR09lUXByQ3B6WHVXNmZ1OW83aFlzblpRb0JsUFJVbVp5NzlsKzN5Qi9ZT1ZmZkJ1MnVsbTM4cjVmeGo0NW96UGhXZVJneGZJZW05VUcycEVnUU5BSS85RWNxdDNxc0R6TytvcTR6MGxENkF2UVlBN1JZN1Q5V2UrQXhFZllrQnk2MnkxTW1iMzdlMFlWNTRlRk1lM3hLQm9UOG5SQjhXdHJQbDZpTVhxUE5EZkkrTUt1V01CTXNGdG5JSnQ5clBoRWtiUEowYXBBQUpkb3h0akh5NnF4c1pSSC8vYnJCTGlYYkpDbTJTelVZeitGNERta1NNcE1icEdpbTVLd1VRbE83QzROeE9GS3ZQOXJqK1FSRFpPNGl1T1A3ZFBNY1M3cndaY2tEWWlJTHN0aHRuRE1pRkErZ1dHRnBJM0wwWmpOZjFEVWd1OGZlQWFZMTVCcmo4NE10Wmk1d2RJalNsNHZPcDRXZmgzVXZSVm8xNXk5UWsrQkRhRW5qWDQ4SlFwMTZaRVcvR2RpZGtQMXMxbzFaWmp4OHZWNElSNVZocnhMU3dQOEs4a1IzNHNYcUtqZzR4NENxajUrbW9kYnJQMCtrNlpNRDVUMDArZVV1Q2luSFF1Yjd6TW9FWmtIUUxQd2R6blJWUVBuZ1ZoaE5KSnFScVJSRmhLWkNzclJqWVRsMGJJZm83U0JjOHJDVGhSM3NqWnNDQzJPNC9abTJKcXlCWjRoV21ucDJrSTVvdllYYXY5ekZVbWxOMnBwbHVHR3RNWE14NDFhMkhKcThxeVZtdDZxZm8zcVlTcG0wN0xSNk5GNXF4bSt1VHZmUzNZVndnb2M3eXdVQ3l6SW1zNTlaYlpNUE9idXUrNGpKcldQY2dXNHoyeVdlMlB5UHByZkJhR0lPaVlyUWRyZDBUT2piRCttOHM5TWJnNm9NdjEwTEs1SGFUTFRMbDVUR3BpekpNa3FnWm82VUJxRlhDSGJ0Q29mVTM1VkIrcGZqeEErNzhIRURYeHFPTnBWUGlOOHZBTmUxTldtY2JwNUpVZkt3VkpyeG9DTjlxS2toWjFTb0VkdTBPeHRjQUtPUUVpU0dmRFFlNnFQeFNYZ1JDVTZuU3hzL29hLzF4SHI4Sml5ZnlkUzRJTTlKa0tOODM1dk1QZGZyaUtIRDRoNHBuanVBMDFsQk11Mms0eVpxd1QvemVKTnlndWpwMlpMRjN4TVUvaVh5UjJmVzg3K3ArNi9wZjRtRU8rMVhuZlhDR2hyeUFmUTNYeEJEd2NoQTJZQ0lNVDRQM0ZoaGZJdW54RFJKUDl6ZDR1ZVpDbjh5YzdqVjdONi9nVUZwRjRsTHZkQXJtS3ZIK2RyL09DRE8vbEdmTGVtQ1dnTmxMOStieGxXMVBNTGJKMTBEclpJM21ocW4wZkFyekZqNmNTei92aDI5ZWh5WDFNczEzRk5OcENzODVlODNHaHArTWRpdmF4UUtQMHpmeGt6SWNmaUJ5azJSUXhSRGw1VGFWcUhRQXVRaTZ6MmFDbkczV25YN1JIWnRvc2FiRXhYaWtJd01qY0dHWGlORXFFRjFwWGxJZFRhQXgzdFlkMjArR0Q3U2JoQUEvQkpOUTlGdXFCdW1nOEo2Y1psRzBLUGtBMzlEaDNxcjVESHdGaHlkbVg5cEUzVWlTWERnN3hoZWFXZXpyQkYwOWFzOWREbGQvdDdEZkVFSWtsVjVpVytyWFJ0QXNCSmJySFpsUDVuSTdFd1B2aG1QT1RYRW5uWElwb1ViZEVoYTR4dmJRMWZWenQrOFZkRDd5SWptVmI3VmpOL2dtdEdTeUF2ejcyeXZHSDRyT1RobHBldjZkbzZjQVRMejNYVWRLWGVsRjg2ZW5GcEhMZUlmZ1FqdUxuSlE3ZGFaeHZiZFArRTkwUmIrRTI2aENyUE11MlFHOTZuT21NMEtzdXBWZ3NFZFZnMlFoYkZxZ1R1TUp3TGxCd3JBcG5VYmVLNmR1K3ZNZzVpbkNGNHpWa0dWTml3QjJKbXdHdnJQWThZTVU1U3Q5alVnR0hwUkplZmMxUFRYQjh1c3dtOU53bC9pTG1JVFJ4VFpFd2ppZnphYnFSNkR2Unk3eVZSU2tkbTB2OUxrUFpKelpSV0hEcVU4eXBqMU1pM1dybVVpeG42ejREYVFLMHJVMkw4M1NLYi83aXE1aG0rZ0Y3WXZTQjhaN3dCbXZ3VEEwK1pVYzZsckJIUE5jSkorNE5renRvcmtvVUg1OHB1UTJSUTgvNldYS2VnRUltdHZzS3ZVYkdWTFJjeDVmVTNqUXJoUUs3N0s1R0F6Z056MUFHeHI3czRyWldscjlWNkJYbkw1MU52MTFaeEg1S2RIZlgyU1RpWXFaWm1FK09SYzkyTld2TVVWVWovVU9KY1h6b0ZQSXRCdnAyZGxMUDd4VHBkMnRHWm1iSUtPTEV3bU1nRjFTZmZBV2Zacnk3a2xmbjFqMTRDcGtRRjhTQ2x5ZForV2NsaE9wN2R6K0FRbmkwNWVvVU90ZmJOVGZxYUtqekU1Q2V5TnN1eWFkbGc1bDZHcHQzWDVpNUpDQjZWbjhWb3JOaCtoQU1KS1dsUE1YYmQxVDVnWFE5bXFha1VlaUQrbGExUUxRaHlXV0paMVhUb2ZNTnRjRDQ0UHYxaFZkZEljaktCb044ZThleGRBc3A3ZE9kUlQ4NU40dlVubENmY0cyaml4TTR3TUU0dS9keHFaRWlyWWxKNFkyWlcyQ3pSV2VjazMzWDZPNDQ2eW4yTnhwVzNRbnc5NG95QTZ0TGhuWWk3OHNEVFpPRDJTanVxVnRpY05LVnRKWGQ5b0lmRkJBcEhWUE5Kd2swZ3Q4aXFrTGlNcytIcE9TdzlsWmVNZzQ2YkZrdWZRbFB1R3hGejNFejVWTkZsN3pJWkZ3ckZtd2h0NkxaQUl1QkZqaTc3dDRXbFNrQ0xDSDRzN3Q0RkZrb3d1cTk5SXVzSWM4TkpSUy9oRGx5ZFJ2czM3NjNBR0VXNEFKZDFwZzR6S2xDdnJ6RU13TTJoUW5wUzlvVGc5VllldTVFUHQ3QTVhVk1EK3dvTERYR0hFVWZTN2hoZ3JXMDV1YTZlRFZBeEJva1VOWDhQR0RCby9UVVBwWG9nM2FiNjhNS0MwQUhLd01DOEVsNm1ENW5RT2F1ODBpbjFHMVhnNWpqVmhFcWRDeHM4T2wwSnEwYkZoNE5IZ1RiWTBzc3ZpZTJHMnFQLzhvNTlJWGR1QlQxMVROYlhpdE0wRkZNN1dUTzFpUTRUa1VaMml3M0FrV0lieW1BZFhQUm5CT1pwci9heVN6U0JlN2lVa2dpNU5pODRlS0EyaHp4WXRYUVRUZFU4WWpGZnRiRmdCaXNVcEJuOEFHRThqM0hxM2t0V2hJYktzeFNHaEZsQ1g4ZlA1a3lBd0ljd3lzQWhGbytwSU92d05TYjhXaVNTeWRzWGdaVEUvZ215VVg0Vzg2eXU3N0hFcXJHWmMxYUdveDFGVndiNXlybEgwSG5GM0RLVkJMS09BdklYR3pGWnQ5VTNYMWR6S1VzYUU0UjlrUjR3eGdoeGNiT0c5NDVxalNKVXZSNXVtc1VHTmVCK3JUNFc4V2laNGUxeEl5MzVma0VBRWZtQnNla3NEdTBENG1yaVJ0WUVpVmgrczVveDB2aW1nSm5WQ0hlZ1ZUdEcrMWJBUE5tbnd0Q2pPVU9tMzg4MmM1M204dU5Ma29RWXVvY3dNanJLRkx6amp3bnEzeVpZdjlvMFlTTzdWTU10Slh2OVFDOFFUc3N1VHUvMm1MbWVUMzYvVXJmSVMyVURIRnBQN0dwVUhtZHBWZ2N6QjIzUld1MTZjS0ZJUG1DMyt2K3BsVjAySmJvZmRENStOc3dvZW1OTTNzU3E3c1pOZlVSQWlJZzRvb3lLajYrSHVmd0tVZzRXUXF3MG1vL2lDd09udWFKM0RyZUZtdnVPalBqZnVUY0dyRjZKNDZ3M1VpWGVlVFhMV1BPYTJYaloxTCtPdzNXMXBhOXdHUGovZE52WWJtaG5kbkJ5ZXhXS2lRbDZuRFMvQUkyaFpmOURMSnhIRU5wMmEwZmVZejJRVkFlS1NDK1gzd3VRa0UxMUh0OXhoWGpNMUI5aERjRHd2SUNGT1pJMCs0SGppTUhRUXoySm9GRVhCR1NvRzhqelZyQlRkdGdQaVkybTRjd3RkY3p5VW14d09QM29saHFEdzRwSjFKdmRVMEdCM0JRWnVrU0VBWHAyZlQ0djdPbUt0OUFHZ0V0SFFVT1VWSHlpT1JEZ0pvRTd0KytLd2VodHoxNXE1SWxqdkdtbkVDVzlkampXMEpxbjFLVFhHc0FQMFN2eFg0ekthTVRtY1dPYmR6T0JtTUY5VGFNcGJUOUdMV2l3SHNJU2c0eEVXUlFtUXlKWXlGTGZveEFUSFRUQUNvRVgyRGRGeHI0NGZDc2JtRG1idTI4YWhkd1BZcHVUWkdBRGoyd25iYTI5QUI0aXRibCtHNTdwdWIxc1F6cW5ucVJDK2NRb1lmOGZwY3NONDdyeENWYmhEV0dGd2FmS1RydkVqRGF4RUNWYXVHenY0SWlzT3lqR3d6N3ErNTBtbmJLMHhXY1Y2UHE0TjNaSGF1Z0NYTmpUcDZBSjI2WmdjaHdrL2R6SWdLbkZIb1B1QStQemhIT2FwQ3JzV2dKL2pSOUpYVS9NeWczcndwNG15bHpjOTJqaFRnWVM0RmZHVmFXcDQ4VHdwZVhFNzgzbEZ3RHRXdVJ6YTMrOC9TeFVZWHNGRGRTb2FwTmp2M1J1Sk42WnJ5RFF5d3ltbDR0anc4UXZPVStVK000cHY4MWRhOTFESHZLZDIxa1c2UmZCOEF5SmxsdHlqWG0xTXhDRUsxWjJwMzAyVVN4aUkwQUg1NGp5OUFFSkM0aXMzcHJWZ25vMzZtK3E1dUpFRjhub0o0cTBFdVM5MGZ5L0p6aWp6THk0U1RsT0RpYjd2UnRXSkRTMUUzNU5BRFpuUkR2RmdjZWdaY2lCTG53M1pmMWZyN3AyUC9IWnpyM1o1VHJWOXNHTHU5VmRPd1prdzc2anlOeGwzZVpQSk9neittN0M2aTNaQ3ViVU84N1JhN2R1Z2w4N1R0TE5LZFdnQm9IY1BSRjFqOGRjU2ltbm85dVFsd1ZDNS9vN2VhbzVzZnhibEtUMjdOSUxUS1UxeDVQM1dLeFUwRjJ3WlI1YW95UU5oRUk0T1NMTGQ0U0RxeXoxeWtYZng1bXYxMSsyVmF2Mk0xenZXTW1rdVdTU21mU2hPNXppbjVTOVMxRmN0eDdOMEZoSkdiczdVa1FKaURKa1dMNWxmcGFzQ05aMGtiSjRGY0RxT1JmQkcyYWR5THdyVnp3L0VneFFIT1hxTFBSSnBTMnorSkk3OS9ZVzBOZHRybmFvSDFFNjd5MnZhZGJsY2tjUmsrYTFCSU4xeG5qeUNUNEs5VC9xUUU3U1VvRFFSNnhqT0hFMWpVQUtFK2Y0SGlzSEwyTiswSUJGYlNsYWszKzlBQ21NY2JneDdsaS9ENk50UDh0K1Z5QmNWMkh5U0xTN01CT3piS3BwZjRqOVY0QlRFM1FBUmhSeEVCVkMyTy9SWGs4ZWttUzBkUHRTS3dtc0ZLdjhMVWJLaUx6cDRtU0YzWURFNHNtQUsxK0U4c2hrS2tqanJhTU1FaXJLUXFERVF3V2JVMDJGSW5TTEI0eW02M01VUW03Z1d0bFIzeHYxOTBkeTMvYW41MXVwZGp0eXJkWXppclhjK1NadG1Nbmhaa21PQnFwQ1lSbmZzcSsvVlpWU3I5ZTVQQitqZ3lkUzU5NTdEbXQyWDZLaG8zMklLa0tPb0o3UTVrWS9ZTHVyYms1LzNNc0Y2Wm1lNGhLRit6YVNHeE1nUkJoNFFEZEFVMlg5V1Z4eUVORXVyK2RWcWErdTFxdGQ0UFFXdVk1MGhleXRNbHZBUzJHOUpQdGo5cFBMQTZHSllscTMyOG8wMWtlaFJXWU1RbVdPV0svcGpoZmJRaVdrMno3d1RsazR4bjNPVjFCZm0xbE81c1VSZFlyaThzNWNOOGVnZ2VENG55eUJ1czM3cU9JcVRJbWZqTUI3VWcrQjc5V1JDSVdPMk9kaDVoYXM5K0pDcVR3ZmZ1c20xbnlhT1lhbkp2WVhTY3NsbHdSNHFId0E3ZXB1YWF3NHRISHhXSkFXa0lIQm9mdjk5UjFCRGNSb3gvRi92anBrQ1hmOGdHTm9paDJ6dklsUDh0TzJNdGxsYUZDT1FNaXpKUENsN0pmZG9mSVpxM1hmZG5pSHBTRjlHaC9CeDJteVRjUmpuZU4ydldub1VFZU03c2IzQTUwaGVCTWxXNStXQ1B0VUd1aVJjR3hBc0NXMHk3eEY4eWVCeWNKZ205c3NCeWxuV1ZLZlVjN2dVOExTb1dXaTFqd0tVdGhjL2JLSVlsUlc2U21PZ1hyWjVNM3dFZERjY3dNS3pDZkxTcnY0MkJGcTc0Z1p5N2J6aStZajEzaEV0QWJoQlFJUDNwc0NBV2F0ckhLTXpXTzJ3NWt0cEViUjZYSzZsNEdpUjRNYzk1NnBpUUViTmY0ZlNsc045dzlFQXBGSGFQd3V5eHNMUUhrd05BdkMycnNkVGVZV0h1NEQrYkk3ZHhRY2VjcC9iQVpsMHhQd1VsYVVjUU5OaFZOMXhOMkZmeWZWdUFNTjRBSVMzTXZ5b3o2dmc2MVYvYnF1alVlVlVhbTZBNko4dTZGU2FXMUY2YVFvNWdlZlZwZTNRbzUyM1NDbG1ObVViQms5QWlObmtUdm8rWXczMDh2WmlXN2t5ZDdDcFErQ1U5RnBhQ3BzOW9XMG1abGdXTUFrN3VSS3ZQNlo1NFFZeEs5YmkrUno0SCtrZkZvOC9Dc2M3TGdkSWNSUjdiSUZ3U2xueUZFazE2MEdoNC9nZVdtcEt5RXVKbjVNNCtkVzJ2ZUdhZFBIWUxKZWhOdmF1R0I0Z1RLWmRPUWFERU95WjVjOVRjTTAzT1UvOVAxdVV5SnBrVWpMaDNpMGxabE1aemRVVlNaQjFQOVkyUUl4UU1yNGowMHRjdEJxMHliWSswSEg1YmtQSTRQYS9BcXZDa1hkY1RtSTg3VkhFTW1xRWoxQXhhNytiSVRRbnZQVnNSVWE3VkgvZnhDcUZ6RlNDVFVKVUZmb1dqOVYyajdxTzN4YUl5N2Y4OGQ3QTRPSlJBTEU5ZWcwYy8vTTdBNVgvNStwNEZZU0NFRFhtV25oWVZzZjVhRWFPcHBrNnhUZXR2WmM3aElQTlN0R05HbXdHSjRVNUluVjBWcTRzK3VoeDJYTlBPaHk0ZXJQRXBqNWYvUmJpMS9ISnpsREJDaW9aLzZNays2dUNFaUxoQkd5QjFpbWoyYm5oVGRrQUZ5K3FDRnlDTmpJcXBOa3RFeUQrVXkyZENveG1za0Z2dGozZmVpNmpLamNqa0JleVBGWUlmM0dFMitQOG9PempyVGwvbkcxaXcvMmZneDhEVVpEcllHbWpmZTlwaXZ1TWxGWmhYdlZJOHBxc1UxU0hiUWhJeEd0WlJubG5YOE0zUEhSSnVQZUJkWFV2MFo2eGwxOHBhbzM5R3h2OWhwZU90bWZ6OE9VVWZsWDRyOVprVG1sYVhQMnlVUHJ0dTdiY3d4SVIxNnNieUVVSm80eXlNZncwYnJsWXpoTkRLNiszNXY0V2cwa0dEdGRkL2tzOWVZRmlXcEpXeXByR1ltYnp6ZHlUbVkyMEtXWEU0WVMwUWUwZ0Y0NG1pYVNOeWNDZWhZdGFjbzkzR1FvTEJjMGl6SitqV0tIU1hEZXR0SWVFWXljd05WVEJhaE14NjE1MWRvRm9id1FndmlneG5CdmpkZXZTV2NHR2k3ajVPWW12NFFVRURSRG5jbDlMM2lIb0hPbzc2RU5WYmRxaW1BcXZRWHpvcHdHUnc1TGZ0MDlOT3dFYmFSMUZRbytnNllwWnJ3djF1RElKc0M2VjZGZTZhWnZ6ME1jZGhZQ0Q4c3h5US94b3JjNnljbUYrVHBvQVFVa0lwaXpOR1Y0eWl6QXZNdktiTFlBeVpDMmt0M29SQkVkdzYrSDIwalpiK01iU1lsMUtaK0o1M2FWU3lqUE1CNkZCTUNwRUNnTlFXb3dWSkVaZ1k3LzkvNUpzQ3JXS3VMZnlxWU0rOXhZa2poL1NyRCsrUWh2azFOejIzZGNiNmFVLzd4cTZxYWNyRjZwQmsvYk5vSXRqYlJud1RWdGFkaHhRc3YzdWJPQmtnZTFweTM4VzNvMGRZaTlJNDFxMnppazJTbkliTlA3alJZSklMUVZTdVMwMXdPSUVzM0Jralo1VExHeFZwR3Raa0Q5UGFMZDdiajlrbFNXVlByQ01DSDRQR1RtR210N3kxS0oyV2RxQkdhdmVRRVhFNjZ2T0N0QXlXZVZtRkUzcU9DdzdITnhhNDg0VERhZDJ1Vzd2eWVsWWc4cDVjMmRTVzdzMHBpYVVVMThGalA2Q2NsUHdWM28rSEcva3htMUJJbUU2T2loQVdVVFZHRXBGVzZuL1FiSDRBN1J4Qlk0RGxKN1MraHBMakpnQjV2NkVvMzlnMFhWenJzcU9Oc1RhcThEU21kRVg3cHhidzhIVStkdk9mUERvbDdKU3ZkM0hPK3ZpT1B6QjZZM2tBeDBTQXVWOGJOeGFSS1ErNHBESjdubzhOS0I5VCtINmk5UWpPUEZtY081ZmZGS2hRUXR4SDIyekxXTHFWa01mbXZLL2RzblNOc3RqMnltbXplZ1NvWWpWdWJZSW9SSHFidmxHelNac0VIRnFkbm1HYkwvQy92dEduM3E0TzNYOVhEL25FWXBjeUEyNHNocTFrQzRzWDh5ZW55dEE0aWlmRHRwN2Y0a0Vzem8xay9KTDNDS3BnQWhwSGVNVVNibmU0YnlkTHhBZGx6UTZ1bmRLYmtTSjEwR3BEdHdXV1NvQndWOEVUdERSaS93a3BGSzRyMW5pNHFXREEyUkE5UlVUbDhqbkFrTnZqTy9WaTYwd2NxcTUyRkUxdlFtWFVOd2VpMVpITWZNdUw4TjFacGZDY09wQ0d5M3M1b20vSGVsMmo5bGlyV0tHRmg2bEZXdVBCeVNzS1lEdHZVeENkOGE1QVk2T0NRaFB1cTNDV2k3SmR3dDBvdC9WWFR5WE54QnEwS092ZG12dm5SWWVzS2w1a2hYQ3RlUDlBRkxaNndKT0tydjVsKzJ3SUpPcVBGY2hFekFVUlcyNUg4a1dmU3RKanpFV09XTlJDVGUwRXpNMHBxSUZkbW15UmpRSHR4YUVvQzZtb2twQ0t6Q3pQRDlBazRkbVZNQmt0TS9hUENrcmJpNDJJVjZHUVRSWWtIOUNxblFKbWtSVkJnNEF6NWdCR0JEOUIwNGJKSmtjL3JsRDdMVTVjbXpsVXpnTDh0Uk5vZUlPZ1k0T2NZTEp0TUlzZ3E3b0pDR1JRT0hSOTk5RWVLYldXZVJ4cXcwNGdLS0laNU40Nmt4NFlUc2xaZnVsdXN6TGZURkVoM2pEZS9xeHhPazdvcjJTYTlqVEV1aEpZZ1IyVkdOWmNnMjR2RjhyRFVxZEgyWGZyWGdrbENoVG1VekdBQVdRU1BOZjJHUE1SQ3dNMUZGeDJQRHFHT1A5K0NISkQ5dEIxM0NUTXlRNU5CYUlybXVVREFaRVo4RER2ZDhGbyttTUlObFZDeFViMXRKRVRrcGl5R25hTmpwZ2FjREZ2RjZVSjhjaXljT3BrSnZoRVA2b1dRUU1qYmVab3daa25jenBrL3hCOW9kTXdsdVdRNEdxSjN1NEdPeUJvMnA4M0xrYTBQMFliOXVHUFEwQlU3RVlGRzNoRFlQVThEc2xydkI3SUt6VERmN3ZtSUpJbWYwdWtIRURGeVovSXZUVmkrZXIxWnFCUXZxSDh1ZnEzTUNnaVQ1dWVsaTdzeDRqdVBtZzFiNHJITlQ1dk9td1BlL0pTbXRkZVNEWm5kK0ttT3BNSWxNTHl0OFlTemQ0UW1nQTJNZTVYRVJWeTVBNFRsazVZcFpLeHp0OTRxRDFRTGRMakNzL1B4RU5ZUWtPSFFCNVkvanVSc05rR25rQ0pUTDRtYmM1Nk5VUE42ZUhrR003STc3eW9GMndKSnR0UTNmdXZZdmliUHVDbGJuQnBJUGVYNmJHQldSd1JWWHdvWTFwMXU1TEk5cE1kSDNsZUZMeEFzZzlVTWNkdEJjVm15ZTlNT014Q2c5Wk5aRGFaTTQ2dVZFK2d3VU9WZXhuRm9VcG9Ya01JNklJaXpWTUZ0RmRJaDY5Q090MlZ4SnpBejZHcFZvYkowWVFSbkZVTlpOcHRtdnZoVXVuNFVrV0VYWkxzSjdFZFV3WVdGMHpHL3dQWkkzSHppaXhqODZkbTBnV2I2ZGdwaWpLaFozT0xTY0lSNmRvYS9Pbm03b0NQUHlpejE5UzFLNkthSlNGNjBLbTlTcm9aelJkNmh5ZzN3M0xlZUp2V1VBS0Jmd1IxZnZIUlVyZW1laU42b3lSbVo2WGxPZSt0YVQ5cS9JSlNhQnZhRGFMaS91RWFXaUxWNHJGTzJlMi9TSlJpTlM0SWx1ZFdZTVBsd0lpVytWZ082R1Y4TXFacjZKZC9NdHYzdnpYa1VSWFZVakRFdkhoa1JMSGIyYlJFWWU2SWJveWVXcVJ2Ui9mMitsa2k0ZExRR1pWTVhobEc4c3grNTN6N2t6U1ZaUmxtditIalMrNEswZ3JWcnBKOENGTkNGWnVlYVV6RnJoSElKWUZxMVpLeFQwekwxZjAyMmZxTW80azlweEk2ZFk5U1BlcUhYZnd4SEZRL1lKaTYySE9Rd1hlVmE0ejdUUVdFeHVIREhtYlErNEdid2kzaUZwVUpweEVYUmdqSkhwM3J3UmliWDhtaEY3QVFMVmJCZ2ZaVFNkY3FxMlJDSUpZWFZnTEJxRFI1bnJkajliMmt3WlRSaDdtRHdKZklOT1JPTGo1bFpJQVFxajRNdVlQanJJRTRxazdVQmNBbkNXWHRuTEI4bnVaZTNDenpwMG1HYThxOHBuMXhGOHdHcXJNYmxwb3lnM21NMGdRZFo0TlM3d0cyMVNMU3NoK0hGNHpTS3dXTjNHVFZHR0ZEUVZBdVZ1OFpMVmgzZnNNcnBNcy9aMXR6T3VPMUphNm1XNWxpNGxBSjFFT0hqNzZYa1dzSWFvTHFuQk16V093R05tMzdaVHZZRjQzeVYrNm5MOHdtMjNGclNNNjhsQWFSS1RDa1VnUDd4RmVQb3NGYy95dnZ6Nldra2JUU3EycXZ0WCt0MmJ2dGhnQ0JwR0J1NndmUWZCc0Q2QXA1MDRnTDRPcnJLNGM5RDRML09sanQrV2trZ1UrWFdldHZsbmt5eFBnL21UVkZtck1CbUtmUERKTGZuMXRBaG1RMzYzNGNocUNtajJWUDZ3cmdWaWVpRnVUNGhHS2Q4MldKTHFJVk9zMjdLNFJsWk5URnNvdFZseEVrQVhNbnpzcE1LZloraFgvSnBoZy9icE4xemsrNFMzQWVXUkJoanVMR1gydzA2OGdJdDMveVorRmQxYlJaM2M1VjVlS29PdlpZNFlXaGRRaEhoNXhydDk5VWJiM2ZRWm5MUkpuVCtSSGNGSW1mZTA5VlVCSDBQT21BelFYK1NFUzUrVWxxM1BGVVI2WlVJUkM2MFp6enByQlRZQmZNVVNzQWtDK2hPNWhxVllZQ0VMeWpnZUhDbWRIWXh1azhHbmIxT0dGSHBFMWtuVWVWNjlUOUExd1RnZ3h0OWVWOWZVcER5WmlQaVJNcjNERXAxZFhjVDJsVlJRWlFUMEJMUVJPUUkvVnNOaXZqcUlDdytKM21aaW5MYUlieXNvcUpCM1RZTE9FbHlrNWN3emJLQnZqYU1aTUdBYnIvTUdEeEg5N1NjNTZTbnZtUDlHZ1BVRjdMQTVZWXc1SUVVT1I1SmM5ZTdMTURsMjRTcGNwUURXcjhDdGRTbS9KRFJLNk5OcmhVV0FxRzFMQkF0SXlnOVdxRWZOTW55RG9aOWpWR05ZWjFmK3VBMVV2WDA5MU8xMW1ha256YitvNDR1cCtER2JiVFhoczlqczlzT2JwNEc5bE9rWHZ2bEZBS1lzNTF4MTFFbHhVVVNZS2ovek42eXZMY2JXS3JpTW9LMUs1eUVYTVJqN3hJQXYwY1B0eGJSL2RJVnRnRWhEcDY0K1VER2pseWZlYzFpTzhVNUhyaTQyNU5kc2RaaXZkRjhzdDJBMVRJMDFJQ201ZmtFZW1oZmRZemR0QTNqclIreGt0ZGFxbTZ5a2FsVU5oMVQ4U3ZUVURDRWFOUk1uV3FzK3licXlsYVVEcWxrSFJnOFVyNmsyRlJSV05LZWcvVmpyR3dLbzVKQnBNb0Y4cmF4aFU3U1hSSHFaTVRyTFdVR2RoNGdQaVZtQ2xxdGhhaUxKb05tbTdnM25wOThhZm0vTFpMNFFkL3JxL0orbkt3OFM5d20zREN0cERxd2szVlRWajVHdEs0MU5QWFRWVTJ2UHNhelVQdUVlU1M5UkVRbWh5Ny93MEI3d1lwRGNmZkt1QnFIc1I0dlhncUE1RUxTM2drTEIyNnBPY3hweHpEQkZONTVDZHp1WUwrS2tCQUY4NjQ4M0kvaWQ1RWJUYjdWUzlkaHVTRi9MOUY0Nm5GVVNzUlgrcnZMMnBqZXFXc1JrODhuZVVpSmlzL015MloxYnZmRkliOWVUeWVONEU0L1FUNnp5c2xVWUpPYmU0U2lRaWV1ZHpFNVlGa2EvWkJmMysyUnlpQXlYN3UwUVJDdytYNSt5OFZlWGxuZ2lnSUN6ZEE4L3d0KzBTK0kvaUVVTG9wNXlPeitJNnlPQzdjUEVoR0NSZ0s2RHhQbEUrYkl4aEFJcGVCV3RMRTFLZElHaEQ1ckxRQ3diQ0x4UVYrbFozc0hSVkpQcmF5SURQRGVXZzgzUURmaE5uMmgxMkpCL0dWS1NpY2xCd0dqa1J2S2ZvYXRraVZyQzFMN2xEdFZ5WjJFYnhsdGlmTytXV0E1SCt0T3RQeHQ0dll1ajZUVEtZL05pZ3QvTk5kaG9nbmtOcm84SGxaYjJtRmF4MllSNmYyNUxES2svY3pQdldTaXN3em1jV0hjU3A2enJsN0pXTzNwUVE4VEVhUUN0bUpVTWNiN3hjMmU3dVgrNlFUUmVOaUo0a21ISzgxNDdMMUFFNktraUk0aHBaNWVZclJoWjJxeGxqUXIzWW1nNFEvODhOdUEyNVpqM0h5MXFBeWxaSDgzVzcyMUZPbnhUZXhmTWcvdUN0VXozZ0c3ak1Fc0xCZ3N2MG1yK0hCSXVqSVpPalhpaTRkN1BKcDJhYUdsSm10eU1GQlg2dGpoWHA0SEFjWXArUUFrM0o2MEQreTFBNk9ZUXFkMElibTdlL3FZNG5pYUZmeUdrSjNyMmJ5WjRwRzRDK0ZLS3lKTmVhREJ4clJsSlBUSlFhQm1HcGt6MXJUbXQ0cmNvSCtHckoycG14Z1JrKytvOWxvQ2hFTVdTaHc5MXNvNmNRRmw2RHJZbUNjUFVNZml3Um9IblhpaUNmWDduSEZML29vL2FkSFgrNnp4dHBhMFQ5UVVpYktEeUdPRmlyaEFtc0ZDWnNNbXY5blhrRlZlOU0xVFk2NmMybE1CWW9EUFVTaGIxcTU4Q0ZVZ3FDZW10VDJFbmdBS3Q5MHVqUDlYQms4T3ZPbSttYndQSWNyTXVxWEhpUGxKNmNoRWFCTXFUaEJnN3ArS21pQzE0dFVzNUIybmlwVzMxTE1JbTVkTFN0ZVQwdW1RSHczNytuSmxRWnFvSWJUTnZpNVpoSk9HSjVOU3Y4YXBjeVBjTDlML3I0TU5DeFlHQnArUlNOalpnR0pkWWR2OTFNY1VIUTFLRUdBNFdmTEtKN2l4MUhObXJ6VkhINkEvMFFXcTQwSGZjYm5BZm1NWVIrcGxuZ2Vnb0wrOXNkdk54VnRzMEZjditaRkViWmdDM1VXdWV1blVPb2d6NHBPQURjeXZIN3dPK0hrQzErVTRVK2gyekd3T3N6QXl6OXFKb2wxZUx5UEVRVFFFdUo0alIxUWltWEV0ek12Y3RKUzB2ZWtMU0xtTFBpcDJkZTRiOHZrQUhlYUFjaFFSbVVia24rRTFjdGI0cm13cVlkZ3p1RDZHRVZocXY4eExBNXB6UTIzQVJSMlZoUzEvdFBzQ3VXdnVCQ1BWMVJrdngyR0FkN0ZuT3hLcW9VaXBJRC9CcjJtVmdqQStTU1FISjFVQyt5UVFwQzdrRkpoeDFwbW51YU9UN3JBU1NVdGE4MDZFOEl2a3ZjWlMzemFRMDRqRG5nWEg2S1M1MmtObFo3OW9PNElKVEdUbkE5aVZjODQ2VVJtYXN5SytNcWVYVGowZHFsaHhyQTRyREZjTHVtM05HZUZsNTN2am9ZOGxzb0Z6ZC82aTl2S1ZDU3hJSS9QTmhqYWU1NXBHMW15RlNqVXF0enhSMEdIbVBlRGZuRFFON25ERlpUQStPeks1V2dkakd4akVCWjAvTktlTG1CNW1WNklFOU9neGprWSswODRKZVRTYVU0Wkh1akZRRTdNWFI5L1IvY0dIMHozajBNMTVHQWw0YWNSMHpuZmd6VEFtOGNlL3N0eUd3b0dXOGpob1lYMzVndEYybEpjdk44b2Z0eHlsK2pXV2JlSHNxRjBrL1JNU3RhNEl5aWp3MWJFZk0xNVNtQ2ZPTGxsN1pLTVNhTExtTWVXSGpjZzlkcDRPVVd3bDVmclB3ek43OW52TEVsTXgveitYTWRtWVVyeUhRWU94WFBpZTJ0VU9CSjN1SWtFMlNaOCt1R2Y1YXd6c1hjSWdXaHkxWTN5cFlVWUV3OExPcXB0T2ltcE1mb3REeHBYMHNhWFMyVjBFVWc5WEl3RGJ5VnQ1ejZsdDR6MzE5ZHRIbTJybjRrWEhjQXhqZUFaMHE2aEpDbm5nNkIya21KdE5LNlRSampuYnNCK2x6cy9iV0dxV1F4a0RJeTBaYm5zSnd2cFVoSUVlbmpVbmxZUURVZncyUmpGRVBYNEtGSXRZaGRCa0ZSc3JIYnBMcGtFb0k3eC9LbktzcjVqQlpQMk9qQjNBbDh3RE1vUU5XV09OR01jRE5wNFNXNWpQUkxoMnNFUlE3cGZzb05xNm0zaW1ZMHVkVVNuWWdIWGlkdWVpRlM3NGdsVytGNkJMV0hOZFZaZUN1OGJvM0RocDhrYXVwOXJZV1d2WkNyTEV6aUlydmgzOXE4VTFhQjBEUWdNWTBQZlNSUHZsS0I3eFptVzFWTkhpWk5ZWDFxSGFvR0M4ZGtPcGFRQXo1RnkyVVRXQU1Uc20vemxZNlljTEU1eC9WbWI5bGdCMEFleGwxL1hNZm1meXRPL1ZGNjAyc1U2NmEyelNuRUtrK3JObk10ZzhYeVFzaFAreFJKNk8vQWJmNnNZUUVUbWRmODlwRG1ZM0VmdUhUVnBHKzAvMkw4dWhkVzg4bXFIZmovQW9TY1pqa1NRRHQzSnZTMWlIQjBzNGZrNWl0RnIxbDFKQXlEZ1Q1ZHNxQ0x6MFh6MDhBRitSTno4aTJhNVQyZzQ4cWdna3I2bkt3bDhhREZOeEhiQndMRW9RZDgxcFlSRDlqYmJnMk5KVU8vc2ZqdTR1Tk9pc0JJTWdLTHpXeDNHejVDY3JHNjZuN0FLWXErKzF5WmhHQkc0V1d6NER2dHdYaU95QVFkKys0VVgzRS8zVEEyazkweVpsdG1ZdFV6ZjZ4YmRoWGtEeTRZR3VZV0Y1VjV5VlkzNWhmMUlhcmt4OTYvdGZqN0RETytlYlVZYzIyUzFNYjNBWTNDTFdSeURyaUdjQXpIWllPaWxFVkszQit2VXBicnVqUEJCWmhBS1JXWXhTdWFFRklpeG1HVnZ0WE42WWtnRkNCRVRMUnVlL2s0SDk1OEN4aU9NZnd4UTBlV2FIQUx4bUNUa1BwcUlBNzJDK2RZM0gwVkZGVW9FaW02M2c1blJ1bldGdDREMGNka054VWZubzdmbDNlQW5SY0hIQk5NVm52UWFibUFkYldxemptaUlBY2YxRzR2d2RGTUtHUXNQOVhVUFVrbUJBTGxZSmc5SC9IMlNGdVZFMjlDZmVWazA3OG41bXhvMGJkZmFyOG5vRWx2YlA3SzBnSjdGNzNMOUVDQmxCTUZIaG5haUJFd3h6M1lqWUtkODhQYWwzQVRoZVRRVG1aUCtnQmxtNmJGVE5TaHZtY1VwK283SXNmZElWYXYzc1RudjYydmZpWHpqSUJuUkJSanJsZzRsVlVWbTdNdlJDVXFvQmFtUjFtUEVFemdXd2hkVnNhNlFUWDdpek5xL3BUMytkeVpWR21BUEdQbDlJNStwVGZOQUo5eDRicFErNEdDZWpFZERNMTd3WURqQlAwWUxxckpSejltU2x6Y3poQm1wS0xMUE1JenpLQ0tPMFFWQ0JXSUcxRGVpTldhc1RFUTFDYlRVTk1IWUhVZ0Zzc0JFdEh3clVoSjNEaCtqT3V2UTFLV3c0QlJ0ZlY4cmM4SEJMak0zMXRMU3RNYlhNL21TRDNsbmQ3RDhSaFBQbFRQOUtWVXQ2d0piM3VUWkJKckZ0ZFBJd1VRd3hhSlFDUGdqcEpHRXc2RW9sWmY3eW0yRk5NdEZFMnR0UE84RzF0cUdabnpZL0RoZC9GQUNrT1M3N3VUOThlQ0VFMGEvTFN1aTZMd29WdUNtSFlHc3BLTXNEeURwOTZuTnVERU1GbTJXU2hrbEp4dnEweDZVa0VPcTFPZGErRzlJSXJYKzY5VEtaajlkTmxVWHM4OElsS0xCRWlmeTdreU5kRXRxSUpqOHZ1dEJpN0hKNFpNdDdraW1qWHpZeGpMSkd3ay9YVTUvTHd2Tk8wYlNQNmtFSTVXL0JvU2NJSWp2cForZ3k5MTJDUlRVdmJpSTlsc1dpVHoweFAyc05VelV3MjNPc1Y0WEFJVnBQNXRxdnY5Uk1vRWdZUDhKYVNLeDRPa1d3UkpSd3dYbEpTVXRBYWhycmtGelZTTGlPUmh0emMvZEpUVE5pUk8zMjIyLzVKdkFHeS9sbzAwZlBXeVBNOVFyQ2VnbXhwVVRyWFlmWE9LY1FTajM1TzRUajdYaHVQMy9hOHQ3Skg3OXZXK3JyWnJtN01ndGlKQXkyQ2p6cU1XZ3VTalNVVythdDhMRzZPTzBIZ20xL3hmZ0VBOHk0SS9wS0FGSFh0bXlwYkZpVkFIdDlSeW8rZFJ0ZnJjaWc1cUg4OGxzcllBRGJOeW51N3ZwMzQ0dTdITGx6bWROVGdaVkJ5SVhwdFJIS1pmcjVEblhEcFV3NkNOYmpMRXBrc0o5dWs3R2ZtVi9PUmxiRitvUGw2dDdXSjA0ZnZNZHFCUkFqaEdHZmNoeXJZdW9TYUdiTXZacjE1aWFTNGxSdndrekJtcUZ5Sk13REF1WDVzUmZyRWt3MmFNbGlGdUJUYjFhR1lqeHM3aWhHajdZbGgwdngxY2J1ckg0NXBrWFQyaWxDM1JKekovMkhQYTlldWtNQ3dkSjhpckxJbzhlQVRjWXlwVEI5S1dpVGF5VmcveVROcDBia0JOSmhBS3RsWWFSTFlBWGNZbEJoMEFVNHUxMjJua0JSTkUrSU9pTThqR3V0N3doUFpKclF1NmNwYTV0eW5LN3JPVFRJNldzRUJVaHFMOVJ1cHJBbEdhQm1aTmtBRGliUkRhUjZaazR4YzA0b3RNdmYvNnc3cnc2eDRaUDNiVHVSQW1kZm4yN0VlemI3S2Z0SnRlQkNWRi9xcGRHS1BHNGpkYS9CNnJaMlZBZjlPSFR5QXBEb3UzcFM5VWNiZXVkZjFUc1diZFlzaGhsa2pOSWVHekxXK1RxR2hmaEtNSWdmSjNqdDk4VE5UbUFaTDFrZ01tbWx5RWdXUDZ0SFJNOHBXMFd3Q3FMNnErSklFalVZckdJbDFBbVEwL1NjV2NiM0pOVU9nci9JYU9waW5RaHJTMVU3N3pkL3RiWXErYVRsTkZSVFhNNEduQURqbkVLUmhaSEFEZ3FRR3BubTh3NjJjb0o1bENCSmZlQ01mZjJodXh5UGtPN0NRVnZSVmJYWTNoZ0s0QlpxVVV4V0RNMmNYRXdONjhQc1hGSFArNktpb0lieHBudzR0ZWkwMktqb3VpdVVYc2c2T0lNRXlkTzVndlpoSitUV3RhUFpnOXJhUFgvQnBCMEhjVVMxa2E5YUd5MXVSK0Y2Qmc5VkJDS0RUcmJLMFcwenNCWlZkSmVKNUhQYUtzdTI5ZGpkSGtqNkZzTnpsSVM2UUF1Tjk4dTI3UnlEMm1EYkg2dmo0V1VlZ3U0SjJZREkyNWVvK09DNUJ5VHB4dytHeVJvSHFnNnpjTzlsZUNUK2pWeHdnV1lBS3hQSG56OFRUK2FiU1IwaDlETTZWbFJPUllZSWNVSXZuMnRTdkR0c0NNb1Y5a0Z4akl4RmRvdVNHMjVBQ3NLMUxZMElVYldiSlFCWjRUR2lnV2FjUnlEWTk4WHdRSjUxL2tUVDZvRnJzK2RYZ3pXRTRkWjl1NGM4d0pXRm12dFg5NzFnRkNtZGlWQ2ZUUDlYRDREb1ZsR09FTittcXUyV0l0Z1J3emFLUU42Q1ZqelI1RUxPZGhNTkxBaUFKV1NtbTFCTGlUakpqRUNyN0RHaEQ3cFN3Rko4NFlTelZwWnh6ZUxWOXd0bUh3ZDhBUzF2M1Z4bEtIVU1lWm1jQ2s5VWtIMXFQSS94ZS85cW4yd2R3ekZyY0QraWlGRFVHMGhyQkV2bVRYOWxldXhienZ1NHFEb3dCaFcyUG9QZks3L2ZIcUlzSWY4M3Nya1Jqbk1wVWxReHhaZzNXelkyZUFaTWdrRmMrZmZxbXFLVnpES0VGb09rNXNqN240Y3JUOFJaTzJWQnVnTm5DQml6L1JsZndGTTZJcG1lcDk3S1BOalFqSnYveDNpZDhlNkMrL3QvcUwrTzd5algyQUVjRlF1MVZpRmY3cXltWkh4TGJNdTJTSDFIZ0VtNm9jaE1NSWZERWdBcEd1OVVNUm1EdWxINCs4TXZwblpTS1VBc3Z3OWhHKytuSEVMMCs4RjRjZ3NnL1RqbkxJdXVWRnhxOGJVek42eDNvQitmUzRnd2hva21uM2lJdEFhdFBiRlU2dTBBQjhNVmV0SjV0QkxaaHRQL0szemlnWlJEY0ZsTXNVVFIxUlFZZExhQXBvazl4VmtZTUorQ05Kak5IMW1wdktUT2s3eXNjbTJxcmIvUlJ1bkx2OHl6TGRWRFRQbTY5ZEdJZmlWSFZFSWZGaTJLMGJkRnZkeTF6R3BsN1VNM0Y3a2RoY0tZUFNjRVZXSG95Wk54c2N4V1cydHB2am0vekgwTmhtYS9MZFRSY1hMVWpTTk5DWFRaNnNSbldwZjVaKzBibi9aeEVaS1hhUzEyeithb0d4anI2N3J1SmpjWXkrZ3E3Nk1PUHBVM2xlWXB6Rmo1b0ZCWXFaSjErZjJPbGNDS3JyZjJja0duZGF2dml0QnZFTmQ5YllqN2NuUmRlOVpiSTNWWk5oN2RVOTMxVWlDYUtTVmd4dndrcWpoMUtqSnBDYkJWc2tMSU5qdEVNQ3ZubkRVNmlsdjlleC9TRTFTOERHOWl4azNPbVJXaXhmUUpVdDRteDRhdjlpYlVUMGFnZklPNUZ2ZTNhNXVMNU9helZsc3NGZUdXRWJmdTVLSEVLRXpJQ3M2Nk4yRzBHU29pSStIV0NQeEFUcWZ0VVd2aG1hM1VMVHAzMDI4SmsrbFdqYXpXbEJOUmJXSTJmVU9sY3g1eFg2M2JxaEpZd3J4ZjZKN2lhQlo5L3E5WXBINEl1VVgybXExeE10dy9lN251Z3QyZ1JCd2dlR0JHSjVDWHRSTDRlcDNFTkw5MnpvRWZuVC9NVnRuZUtyMGRza3JnbXNuQThLZEUvMUJVNlpOeVVhdUJJMUs1QlhTUjh4L1BXWWRhMWFBSGdwMXJveDF2OE5wSkRldlBKVXJHRGtqQmt6STVpaHJPVUg3Uk1YeG1qbGR5SW5YcmhDS284TXdwdHE0NFhUVnhzdC9aRHVWYlc1eCtFdVdLeVA5aFhkRmNZVkk1eHZuUk1OeG5UTG12Y3hpNkxaVTM1VC9Rd3pmaVZWd0tJOVVreUswZWpHYVkzcjFiR2ZiNG8xUW1XMUp4Wk4xL29VeXh6SkRDQUJxVy9maFVxMG1XNWIyc2JJZFBQVy94K0hRTVNzN3FLYlZkc3FZYUJkRjVFTzUvUXYrR2VTZ1J5ZGlLOVZwdStGV3VCaDcrNnZqdWFMQnozdUhFSDlwOEpKZkVMYVAzNWRXdHNlTVBCejk2RW5hM2lQcXQvaDdpQnJsY1BmZDV2bHZIYVErYXVNdmcxYmhrd0R2YU9nZEcxdGxpMUFBTmM4cUZGTFVpdXpTeDZrc2pvUkdqWkhiQkN4b1RoK2l3RHRsNkt5QzFDMFU3Vm11cnJicHdMT0JrbnhUQmFiVWdQRUwvZkRNbmZYMDBDekxobUtjMjEwR2p1NUthaVdKcnZuSnBpbk44VUlZUmVkN00vZW5Pb3U0Q1Uvb2J4a0llOStWWHM5SjI0bCs5NGQ0VGJNUzFaNmY3NlFBZ1hKL2QzQkIrR1BMSThZeXh5enVGTEdYbGowWGRqZkd4dzdQa2NWaHlzenVwR01TMkkzaGRmMGpCTTAzMzFkYTJTSGtZeUZsTFE2N2VqU0F6N3NCMXhHQ21RZ0tod1lhSXEvckZiUThKWm9nR2tIZHN3bTR0dTM3UEFtT2ovRjI0WDZTalZBK0ZDM3BLa05Tczc0cG4xNUMyWFh3MHBmNThrSVNrOHR2azhIMytiYmtoNXZyWnE2NWlPUG8yS3lKYmg2VGNucjR2MFBrY2pqYzUxeklaTTFOVmRHd3oyUlc5M3VKdXc0M1RDMlhxOXJCTU1NdUhVSlVFNENFNHFjWXdlcTJUWXdCU1ZOVHNzMnhOdHlHTVAyVXpGcHZVY0xQSUM3ZCt3OGR1MDFPcTVKNjEzem9nSEFWSlB5Y3ZPR0lqYnNraUh4RDJoL2FBNUhoQis0M3lFM3pZbm16SDY5ZEJldi9FLzVMRUQ4dWVCcFpsVmVtZmo2Q0NWZU1qT1lpUUVyVE1DSkZqRzdYSXZTaHRhdDV5czVFV0wzTjlsQlFyOTlKd3B0R0JLUzc0Q3Zubng5ODFrMHBDY2ZkdHNYL05xek11SThZZ0QwcmIzanhwa3JsRU5OTEc0bGNNeDdYSGVzSm4vTURhQXA2MG5jd0V3Tlp1a1AraUlJRjJxVjZXaHo5THA0RkE3RkkxOVhPZzk2Qjh5WTFGZFo5OVRRcndTUUF6V2RRY3dzcTE4ZzRhWVBJaVludEdyVWR0Y3ZZL3QzVzdPQnRNUUVYaWVnU0pFQVJsN0FZUnpPSTBrSEJrUzZLOGdyOVNhVHA0Y0ZOZllGM24vTEVYWVhUYno5QkZjTlFBMUdFTHdmQkQvUDFCOHVoWHNpVDNDellBN0xwNndwTFRtRHpXVmMycHZrdHJPUlZLTE4zYnlMYkR4MmlzVXQ1a3VoaDhwWFhDK2I3OWZkZitBcEI2VHZ4ZC9JRWw0TVY5WnRNSCtPNjNHTVpPLzg0eVY3WERDS3ZLdjZCZkRjRmZZQ2pFWS9mRlR4ems2a3JrazYwVXVZam5IZmNnK2Q1Z3VjeHVpY0NNODhyOVpOa0Y3NTU5TG5SejBzZ2NCRVVtcnh2ZHliaHRYbHJMb1VSN29pa2hPT0NoZHVHOUxaeG1rU01TR2paa2h2MXh6Q3c0ZVRmWXF1cWgzRUl4ZlF3VmZSN0JrK09WM3pLMVYvSXgwZW5SVUtJYVBHZkpPNWVKRUpxM1VsZ0kvUi9QdVFoaCs0MzlOcmM5bHZrWDJuWWtFRytleTdTTTdhNFA0MjJhVkdyVWo5Yk9YVWkvUG5QMitxNGgyL2ZYR1c2M3MraVk2a3BzTjJWVXZKbjVKU1g1OU9FdHFmNlNpd29nLzhTbjVHd2hWTllLQWM1dEJneStSQkcrREt4TExZcHIyV0RFQnl5NG1DTjlZSWpYM3JEV3JXWDZFSU1NS1FFS09wdUpneDc5K2d0cjhkZjRtV3ArTFFtRVVXeUQ2aTdHNVJtT001Q3ZJdFcwT2h0K0JGQzBhVjhDR3ZCVjgwczd6MDF6cTlDMlordU1VeGlub2JDSnVpSUNQYVdtbWhqdGs2QUNlNVBkL3BxYloxVmRGU0hVNXFPV3QxSnJESFBvRjZTcG9leXdUTUg4UmQxSGxNamFLV1FwZkJnS0pBeFJ2TlpUanFTckMrbll4azVBME1FdXppVDROMTZFQ0Q2Qjdqd3FkQ3M2SkNva25YZVA1dzBUOXg2dml3a0JuK0lsQXUwNGg2dnl6NmhxOFNsWHNHWUdXT1o4aUtnOGh4Y2hzWmJFWUtHbDZZUlNWT1NFVE40TGg2Nm43Zmhka25pNkFmcmx4ZFVzMUIzOU9HMElDZ3BZdjljRUxGQkpFUVlzd0NxVzZ1TytNNGdrWk56SkJSdmltT1hQNnBNbVdCVTErMTJKc0cvdmUxOExxRjkvVmlrTCsrSzhnWlQ0U0gyQnZQL2JWc2ZCVzkrKzEyeERnNHhZdXJTYmlXQW1GMGVwTWZpZm1qNjNORW5tNE5CMVdzMTVXRWtyRjdOVCtTc2JZaWtkWGJKeXhmbmxRL1g4cnJKYlA5MEIxZlI1bVY1ZmdzMDNIN1BYZW9pQ0FuSXhkTFNxSU9TUUlZTW1zS3ZDazJ2eTBNSVVncXZvZDh2bHQ3M2I5TlMwcjdNT0FaS0p1MmpBNjdqQlZKVGljYlJGZTlVOHVKU05jaENKSU1MMm10SzgyM1RwSEh6MmdWQlJBWWRkN1oyNE9vWGdaWXRmcHF3ZG9TcVIwMWFYYlltMnY0cllCRmx1L2lEczg4cDBkdllUMHUyRWI2ZmhYTm1FL0xCcmtKcllFVFFTSTR4MlIyWXlRUWVzNWU0L2x4b0FFbEFpQmpETjFNU0NUeEtkVWg3b3lCaWdWZG1jdmtNTG1xa3B2NEFQZ3Y2TWZYWkR4dEZlWE9Bb1JhZ1NsR1dubnhPWDlqWUI2RE9LK0J2U0pSL3p0MTkyLzFmc0k4akY4dVhaTC9kOFVVam0zVkpnMzNlVDZ3dENTUE15Nm9LbWY2T0NuR2VmYityRzZqZ25ickIxVk5EbWNsMFF4R2xwVVBoTXZlMU4zY242NDVpMGUrRUtma3Y1blI0Vk11L0tYV3luSVVaS05GWDUzR2VyWmtsRXlURStLY3ZWdXpnVFhnNUNTdXY5UFBONFRTRXhNYWRaaU40alVTNTFsUlFxM25lcm52UzkzYnJ2YmtUTjliOUdEeFpSYVd6VUlFR2E3RkU1ZUM0U1F2c0lxMjcwTGQxY0oxT2VBa1I2UGZURWpqM0JPL0dzei91WXowdGF4YXdzbjlCcVROaHNLZDlZOU1JMHM1RVFmdDVESzlaY1N3TkNGYnlzaEs0UVRvN1hPTk9CeHhDem9DVFVEakRjNS9JSklDaVN4enVtQXdkOXBxeHVsRnJpL0tHZm9DT3lUb3NVT3YrclVPNXIvOU95aUd3Q2h5OENpMzVsNVNBS3UrS1h4ZXVQR0F5b0lrQ2tJVGpDZ292K2F5cS8yL3JZK3N4M0RzdGs1cXMwVGRHY2FUaWZOQWZEWUMxTnpkaGluekpLYW03RG51V28vYS82d0RXODhEM2V5NjV5N1BBaWQxLy9wbkJtaUZ5MFR2WCtTTUlsV01vTUVTUUV1ZmZtRGswNGFKWGJZYmNsWW9BZzFlNStUYXNEc2pzYS9EQTZaZlNyWExWQTc5NkIrOXF0aGVlMi9xbmdDQ3BYTS9yMC9KK3E1WFMvR3QwRmVEbzk3V1VsazE2YWFuK0gzQnY0WFY2RHk5cG9JLzFMT3hNUmFOVktNbzdNZ3p3UzgzVjlkT216M3I3N0JhZzVDOUR1bk8wUUd0dmlxNVE5WGc4amZ4TlJWYkl4RFRCNTcyT1dlRGErT1VTeFBoTTQ2ODJ3azFoaEM0TzRsODI4aUIxbmNWUzJaeHlVRXdYK2w0YnI3ZmtWVERoTVVrTVFubVVJdm9QQ3FRSU5xaVJPV3I4TEZsdUlLMjVaODBXeVVXaVRKblFTZHFNOFRIMCtHb2JoM2lLaDlMVXpJR3hWcmRQb1RkY09UVUJPSXpvS0dWRnptVHVsTjJ2aEw0WDY4YUZjSlFheU5jR0ZQaDY2WW5ncjRSNDRmd20yRUlVYzBzUTVjb05VaHBibWN0Sy9Vb2ZFWXdxL2lvMFhUdnkwSmd0dzYwYTJiUWRjZlVMUjhqZ1p2bWlmZEpkYTZYamhndFJ4aDFzUVM2SGwrNVRFWkt3M2NHV2luWHgyUG5rV2VhUHErSWRickR6dElzVmxQUlZSd2p6Q0taZ2J4cGdjY3pRbnFSTWlnc3ZoRlFtVW52ZG9mT1M3UThubzd6SFExV1RDNjVDQkFEUVE5VW41aTlkVUtwNjF6Qlc4OThuSUZPbG9MMXZ5UWxzU1NOTVpKM3Z3dUdmYU5jd2Z2cmI2ZTF5N3k0alNFSWhOajRTK2N2eXlvMTYya0JhY3FiTWVOQ1RydllxNWhwbml6eXkvR0tORGZHL1VBZWpHNVcvcVhMeDA5eDJsZE9HL3p0NllrVGtNay9iSGFXUmVIdTJzUTlCMm1ZbXhxeGhQOVZXK1NLZXIwU3BHSDFVazZQenQ2SXV4SGJTcWxra3A3ckI4dHduM21SWnkrc3lMLzhtcWpRWW5lMU5xN0ZrL251TStLRmhscDdKNk1nT2ticWVrQXl3YkxoK1F3bkNIa3REMWtIdUxRMXBMcDd5Qm50ZnBTU2Q4S1BPK0E3aUJhVWszV0JzV2UydmlCOHJ3NzlvdjdBTHkyR1YraUNWVE1SeGs2WklSTk1aTzBVZmx2SkdMdmhWcHViUGNXY29PTWF2bmxFM2s3SlNsYVpOMEZCak1Yb0xQaGtpNXF0ZU9xamxuWEFmOEt1VXhpMysvYnlkQ1JSNzIrZDUwQjFPYjd6eGZvcmx6aHdJVWsySjg3VlFPM2ExRk96YjJMSEFCR2JQb0ZaNTdzZS9CRTR1UmhGYUhMc0Y4Uy85L1ZNRUN3eGF1REdxR2NFcXBtcEx3NUdDbjE0bUUrUkRQRUk2V0lyYlNMcHcycmxRODFqeHJicVp0TXVoZk43VEhiZHAzSmt2dGplNTl6MXFKcFlHeG5CcDJiZGgweGwxc0FKUWt6RVRJRGh2TEsxN2UvNU9ySVVUV2htN3pYV3lHKzNGM2pYWkN2TElQWm5pamtQYkI0aXkzNVpuUHpvUHZ3aU1WcUMzWkFxcjNoWkYrMFl4TVJ0RDVzOXRqWXlvck40ZCt0Ylh0RGNvNnlKUEo4eTk2VVBmUk1wblpYTmwyVW11cHBiVU82cHhmRk55UnhhQ05VSGJFbVZUZ20vZkhLdlNMTW85cnhVdUYwTHJoU3pqbnAvQmVWS2FvZlpjNHB4MVJvamxYUDRyU0lBWURFQWZmalFZMkxGVkpwRzZHQkhrOUpzZUhZbXpOMTJWcFVEdEN3ZHZGVnRnUkxRWVNRZmdRV1hzWUtwNG5sMG1URTFTSHhvTzA4YTV2dGxlNXc1bjNzdTVtbGs0cU9WcU9TTk9NSGZETTh0dnVoREZETHMrOVcrZ1B3dGZXSmpCUWxwL3ZBblFDazBRcTBPLy9mVXZBY29YNUpDLzJFTS80VFZweTRLSUMzN2VIdDkvbkZVKzdpbExGdm5mQjYzNE94M3k5dnRmd0lPSERIRlFHSnpodUJwcVAwVENEZW42ZEo2MmFVSUJ4enhzOUtlckU1SWUxVVFQUEl4OThMMTFNRERoK3VNYzJhWWlvSjdEOGFiQzFSOE9HVTVYREhmd0QxNVlZamM3OE9Wc3IyVlZLUTlNTlRlVDZacGFsb3hXc3MvVHh0RnE1WDNhbkZ5dlRaa0NWL3RqbE1LdkYrQW9Lc21NWHV2aWY2MkFZbGxBUUpNbGdLMnVjd0d2SWNMUFBWcmxtaExtY1pOSmVQRmhHb0RGRGQ1Y0wwczhxall5dDFKZE1PRyt4dS8ybmdoaGlNWjlyUnpPN2trSyswWUdLQ0ZDRFkwNHVKN29lOWxvSE9RajAyNUk5N2dpQjMvTld1WElyRk81S09SMndsbWFIalpBREo4Zk9mdERGRUtiSmFPZFlyQ1Z4eCt3TjBmUU9qYTAzOEVzV2dIOW96d1VTUHRKZ1MvQXVNVmxvOGpCYmJaaFk0aUtScmxPL0Q1QzRoY0hMdk9CUExNK0tEQUxsUGQ3akZ3aDEyWWhBUi9OMWFVYXhTZkVOYUIzeXVWbG5BN1ZvbUpTZVBaUWtHS2syMW56TEFIdDFjTDFZQURFVG5hZm95ZllnL1YzOEhGWG10bFBKSFpjZ0Rkdi9tZ2pzM0l6N2w5cHBSQU10RUtXK3lsQmpSZmExMDV6U2d2aHZPVUdYOVozakxOcnF1WFhRTERGWG1CU2VUVCt6QVdRL2FsRVBMTldPU3ZWTDJPOE9FRm0ydTdxTGpRZ2ZLZE5ua1F1ejF3SVBxdit5MkRHVFB5eFpxOTlodUNaSGUzKzUySUYwVzJrU1E1bGtpZSs5MnlvandiVjBUVmZKczNIL1cyQ05OczJvaG81REVlUy93eFhiaTZiajBMYVVNa0w1SW4wZVFSUWkvVXkwYmE4WURqOW94SjI0N2RIOG9rN0ZqMHZvSE0ydVUxeHVoR1MyaHd2K21ycnJYNHJPa1VhcmFoWU5teHlleHNGc0xCenNPUktEM0phOElIdkxlTk1pdXl5SkVOUHVBSlVQWDZDeEIxQ0V6Vjl3Q2hwUVBINFpZaWZDRmhMRjFJUXQ4NlpQeDYyZkdpMUVkMHI3dDBuZnNWeUMxKzJ3bGVtUE0vYUlrNGdoamx0VEtPRkhmVkkybmNiU2RBUWVDMVRPOXZxNnBUUDZvSjR6WEJkS2picTRzczkzbzVRaXNQTDBaeTVDVnN4b3lNaUIzV0lRb29UUk1xckZRSTFoaXlIb3RzMkZ6eXk4NFk3V3dZTFg5ek1JVHJZbjdLTWpwQWk5QkNGYThkZFZhOE1WQnNtOEcxOVlBZmtlQ0o1RC9OUkNFOEFsRVhITWtNZWk5TVdEVTdZSWp0UnQ0Q0ZTYy9hTnhjRmpsYmh2K1pRaEZ0S2p6ZG9LK3ZDRjgybEM2NnNoeHBFK3R1VkoxWkhtUDUwN1pta01sQ0NhaUlQcU1DcWNJWlVXUnhnVkxxVi9CUktLdEc2Mnk0Y2tqdnBNNkRIWWF5eS9RNGJUbUpFOGFpQ0RCa3NHaXJ4QmJRSjJQZXRYR1ZTWTBaSnozWW5GWmhiYndDaW01eVMvdXJGcnFEYm51d0pDRWF1Yk13Zk8vWWc1VDNYYythN3d3S2RuZURjTEc3UWFTK0hCWlZ5ZExUN0pVY2JQUnF1ZnBQR2xKTER2czUrY1lzVVBDVDdBWUlaa21NTXNyYVB1aVFoMVBJVHlJd0JDNTVXQU5ZREI3anRxa2huWFVTWDUvc3Q4UU1pK3NJZmxEZkVtYjFpQWhXZ1RlNE8xckFQZ01CNFJtR1VtR3plVWhRVlVxZEl3RWRCdVUvekVSbWEyWk9KVmhQNWFjd3RvMUtwY0VweWdyOTFOeTgrOXhtUytHSElmWHEzWnBFQUwvdWtkUnYrS2YxSWdNcXdETzhpdXRHSnNvRXFNSHFOUXJHNThkeGlyRmRXN0h4dWcrL1BNVkpRb3NVbmh3YWdYVVJKZC84aTRFYk1xcDluWFBoZGJyZ1NOeUdycVErKzlpbXBzMXUvTGdqcDRSUVJlRXZacWFGWnczLzJJVkxuSW11V2x3azhWci9RKzNaaTdrbnJrMnZNaXg2Tk9CNjR1Y215QzJTTU51b0NmZmdUWXpTaGovRWNBVW1BTVRmaGxNS1phOVdMeC90MmNNWGdROTA2dlNKcGFqb2tqSGc0cE4veU8ramhlZHh1WGZ6eS91bHdaMHdOcm1vcGt3SGlHUWFyZTJ5MmhCTkNpQjZVYmR5dlNOaUZLcXkybXZmZk5OSEFLTmcwd3ZaOUhMbGZZd1p3TUJQWlUycHUvM050cE9pbUYvaVg5cEQ3MUxSTlV1ZFVCY2c1ZDFTRnpHdUJWMVNsZVozRHc5UE01WngwUUdIak5xd0VTdTVBVm9jTzVYaitsRWxBQUtaajhaSEdGZ3VSSXhMVkhzZXlweVpRMC85NFAvRGtvTHloWGhkb2puOHYrMTBMNkNwQVViRkpvd1N6ZGRCWVRQZ1YvT1VyTWQxT0VHVmxIdlV2d0RGU2M1Uk9iSmlvTU01dkhEYWlhbDdaUlZTT3c2R1cwb2ZiYjJTTUNFZEkyOHRYM0lNUnZveGp4UVhKRndzcGRTL291STdxakdUZjVnVGtaTHVNaTJRSXYzZHdXSXlwQ05LMEFPS0p2WXNZYkVYaDl6Tm04aEhLWTlqTUR5VzNFclRONFhiRGFpKzYxbFZTdmNDM3EwYnM2NXF1NXE3TXJuU0toaEg2VUdOVW1yTitJTWtwYlltZjlGWWpVcytKSjM4Q2t0dnJiT1BPbjRpMUIvU1lvcElsdk8wMjRSU0NkTFdlakpZMm1NZTFBbGlNNFlvcGphY3FyOUZhb3hQL0tzT205N01ScUdaSGJYenlSZEhXS3Y5ZWgwK2ZDcS9UcDAyR3FwS2Y5MklFK25UQjhFYVA4anFRdlVSWjdDcWI4a2Vtd2VIcnI5WEhxWEJ3ODVITXl5K2dxd1VocXUyUzNJOHVMM1l3cVpneXRxc1F1YVlvOURPeXhaK29XLzZXQmlwVHM3eHhpTnExL0NIYzVGOXFBOXp5QWtNSWl0bGdUelg1dVBjZ01PWlpiZ01pa0w0Nm83aEVTWEIvMkdkZmROV3hWUzF2MXQxU2gyWUlVSTJPOHBaakJIVDAxclBrTDdTeE5UYUxBcTVzdXhtV0xlc3JOZXBtb1crcWUvUmJHU1BOQmtobG5CcExpTHN5emJLVER5UkZRUEtLM0xIN0RZVmJhZlJQRXFqL1ExakFYMG1TQk95cEFhUXZ2VXNyYjNoWXNUaFhEQWtKQnJ6dHBmM2tTaVAyeXVFVVB1dDNybkc1M3pUTGR4SW9IeC93ZFZlMlNpOE04VjZUcGl6WG0rNmVRUHdBcjFvbitGZkVuZ0hkVldFMUJybEhqZ0dFeUlsaVFGSlB4YUVSTzkyMzd0eEc3WDZJNWZsVUlubnR6WWRxenJ4bEhrZ0ZMeWQ2QWh3amp0bGd0TEJGKzNlM1V3YlRDNjlvMExvU0RTdWhsK0VWQ213M2ZlZnBqckFrcU1RNTc2bFRvMWZ2WWlnUUdjVDUzd3NueFVNck5VWDA1eGtONG5FSU81TFB2TDdWS0k5NzBiRFlRQVZjMDdNUTdQc0ZqS2VmKzVkR2toUGdsWnd3MGVHalQyYnU5YTluY2x0TDIrZkRlNUhpWTNiTHhuUTNmS1d2UDhFUzdiS2pEOXJuNTZsRUFGbG5VTHNPQndlOEtSZndLb2Q5UFhKYW5FOEtMM2V4RXFYNFU2WlZQVi9URzY5ck9hUEVBV1NxKzlJcnNLdXJEenlqZ01LTmI3L0VGV2o3N3RVK1dkTkFJQnJQSHYxNW9LWHphNTk5M0VBUmtEcnZCcTUzdnV1Rk9HelhjS2lEb0tLK3JRMHVZNFBza0ZkTzJBMUtFZGg1RUFrU0duaUYraDNjMkVTRElDbDZUNGZ4ckROM3JWVnBjUVFsb1NraDBES2t5QjRNODVXWVFPelp1ZzZYOUUwN2ZidkwwZVJBcHNoc1Q3U0FtSm5XU1FtZHZ5a3kreEdzNXU2eFQrQWwza2tSbS94VWtCQVNJZmh2Rkk2VmxwRkw2YzA0ZlByYzdpOG9FS3VxVlF0Y2h3U1B6SmFzRnBWWXY0L2l6Z2JFQjNBV3VmMmlGcGMrQng1Uk9takt2Q3UyblZkdUJPMmR3QmlXWTBVMXd1T05PQVNaaTZ3OW1INGVGL2NRVlBGeDlIM21meUJQdnZhd2xuenorSHpHbXU1eTNwU01MdDU0M1FYbnFhQkFoeHJUUExXcFgwUGwvSEU2czQyTzVNdFluYVlOd1pFTEJCREkzSUZ6cEwzaUNORldlWGcyMlgrSnFnSTdMcWVlQThvSWpBMjJ4cnBJQkhJZnlSMjRLTnNVNjhtU0hYQUFZS0xvb2pQYnFtMHk5VjBsN3l0Z3QvQUVMdDRjYmk0a2Y0d25pY1dscDVVN1NmSkdYdGVXRDJKWVVRNEdzVXdtbFVWTEVhN2tnendrcnJBSjA0M0dJOWQ0RmFwUTdZb1grNDA3RWlYaDh2RUdhWHZjUk9vbjI5ZXZPanZITHNjY1A0bDdvdkppRVRRYnhhNHg4SUZ2YTMxV3FNelZYa3VuVHl6MUpiTHZDcE1Zd3N4VHlXemQ2bnFkbjJ1Y000aitRYzBtQ0FUZTVuL2ZFM3ZNVko4emdvdEUrclZzeW9nQlJWOGRWTisvU2s5ZCswYWcvWGxOcW5Fd3lWa1h0NHRSRExqa0psZmVmajBzWnBpMnVENHFoeVRxOUVXQ1JrTytYeW9lQ1RBZXZ5MkxuR2EzcW9sN1dHZC9yVXVDbDByeFVSK25jeUp5S2VVc3VZY0p1MmJkYzQwV05XNG91M0VwSitBOXg0U3NQMWk2WWpUY2NYRFhQL0I0OTdyaXJaY0pQVzlvV1pLald3aC9QUERTenI1ajNCSGx6TUFnRVhxbTcyTE9sbjR6VStBY3RCTDh6bUhhcnVCbWhiTWFSWHdlSTR6dWFBYXpENmFUclNJeGl4RmdZYUVaU2VZNG9NT3RCejMzRFprZ1pGZnl3OVZFUGFTdzRtNWs0SEw3Tzg4RXNtSWRGdW1ZMVJCWUNsZk9jOTRwTHY0VjFSSjVZTTNaVmZXUE5qYUVFL2x4ODZQSlBCU0JCQytKMGdZNmFseFZYOXpRWkRnZWd0TG13T0IwcUJhNkl1L3V4TisvRW9FTFFTL1Z6OVBqU1dDbTJ1WENqYzg5SWI0eHRDcjlBcG5wZ2lzVlZCRS96K0Z0N2JuZjRFNno3b0xuRXRWWW9Qa25YclUvb1FBM21HOTFwZW5ranA0clZmMlpGRWp1WDIyN2U3VEh3TzFNL1Rhc2pvQml5YkdZUkJ4Ym5IdXZxZ3NoVTJwTDA2b3ZZYVlicVc2OWYxMUU3Vi9kcVQ4QmQrcExpaytId3VNK3NmYldvSGxMUTlCMlNMR0pNUUNLSjJPYjVTcENEN3RWMjRNUTFBc0tlQ29DZGQ3c2xCRENTajF0bGp2Sk92eXAxUGV2bk5DcFpoUWxtQWVXT3B1a1l6bnVQbVpPOWgwS3dMd3p6QVJSL0FWRzJNaXRRQlFIR1N4bFFCVGlKdHkrSTZXL2pYY25jNHZaeVJ0SElpWTJmTElseXJDRldCOFlha2xjNm8vNDFYZkdQb0tJRDJIOEdSaXdVMEpxY0JXYUthanE3bGNwUFl6c2pqVUhLZnVDbkI0NlZURnZLdUd6OXRNTmxOekFJckdTNnFDNGJLUkF4LzZPMHNDYkJsS1BtbDZiZnhVZHZ3TEVsRlV4c0hYV1ppQ1pEKzgxOGtPb04wbDZkSjB1ZTJTQzNPRyt4K3ZuVXJ5RzZVMTRlWmdlaE84Y1dadk1FMThXREs2YjdDVSt0QnBzYUZ6VGcrSUpFWFYxVVZHMmhMUjVYWFFzMXlZVmZDdUpPVmpZYUsxb1dNcWlJNmhDZTkxVFNaaE9Od1ZSbVR1WmpLZ1RpUWVZSEYwRkNLcnQrUmMxM09BVU5DelhvSlpkOGVWaG1FdVA1TWYyUm9oVUIreXlaaCttWXRrSkh3MTBoR3gvNi9Dc3dTTEk1MUNtSE14bnhicU5XdjhGdzVadUNOc2MwY1ZmTUxMYmR3Y09VSE1kR1cxZGk0YTk5b3M4ZmZsV1cwcUYvVWhtcElob0NBNDU4VGxVWnBWWU1Mb1VPcmNqWmhYOVIwMFlUWk11eEFFbThReEJPVk9iZkNaVVNtN3RnQ1pYbVhkb2ROWXB3TnFVZHd1Lys1T3dETmZqNzN0bXJXcnVQZHBvVjVkN21Od2s0RkRzM3RidHZpOTYrSnhSTW1xTXFJQ0kveUczR0pnMEd0KzMwM1NadndManpXa0JpcVFrSVdTYmhQYmhhcUVSOHd1V3FyWGI3Umo4RWliVTVkbjArZFpHSDBhak55bkltU0FhTnlReDF2a0JZMW9Id3k3WkY5RGd2clphdFJtOXRBSXNrSG9EMkN1em1odllpVEpyQlczL0RPUkJYeWpkaXQ1THZObWxuU2VZRTU2VjIwQ3VkVXhRaDFpbkg2TWZsbGdwbHlKZDJYb0dFakp3cy8waHpnWERmZ21YQ3AyUU5MdlhNdDEzM1lOL0JVTlovY0pYNUZUdjNRRytld2Q4cmVhQjZOc3puZDNzVEhlL0d0d1YzaVRFcjZRc3o2N3FPMnl3V3ZrOHNDL3Baa0FyZkZBZGRDaUFaay9mTTlEYkYzV2hRd0NQQVV5R1NuMVhxWHZ4Q1lndEp1VlNFOG9kSlJjZE92UXlXTkFtWGE3NXpkVHJFcXp6dUZpVXpQdGZXRTlZMGtmMUdGcXlydXFpYm9OTHl0TjJ0Uld4QXV4clU4aURuQThNMmNJYVRsekdvWUlBalpZN1lVcHlSZHk5Y3pZM1BPaWVmbm9OdDlXMkg1L3BTMUs2K3RVQzZyUmYyby9vNjZmdmRZbHp0a2JsbEFyVUtxRmNNOUpEQjQza1ErL2xvS3pINDVTU3g3aHptcDZ6NjAyUjF0d0YvMWN4Z04vNDFXeXp3aDVYenVFWlJ4UEtlaHN6L2NuZW85Ym52RU5UcXRXUnlRbWlKa2RaVGgxTHJ3OEZkSnpKZHB5R1NleEpLa0EwSVJJL3lQOFFVWndqQXp2ODRGNnUyaGtrS251NGcxbktmam5vUkVsR3VRR2pDU05DdXVENVQvSTNtWC9SNXF1T3M2RHJUam9PUnBFWkN3NzRIK0JnclQ1Mlp2aWNaeXRreldsdVFGQ2c1aGdBcEVzRFJLeitna3F5TTR3ZXlVamJrSkdoTnNLb2ZBcmhoaWIxb0lTUklBU0N1QmFTRDFPN0VEWFZrTFNxc2VjdzRuYkVzRG5ZdGZEYTZDbzBOTlJxNk9xQktMVEU5S2RFdWhUbU5tMWp3WDFLVU5sanRVMW5vM09vd3dMMXRpNGkvR2pHK0xQUjc4b0g3VjRqeFpJK3cyd1oxelVQNjFER2g2QkJKMS9FT21QcXVoaFNDY1lXY0dBTjZSWHZGVzg0UzNqS0pjVHFoT3lwV0Q5c0dBZjhNK0NZVUllVkxBQnpwblczeXhPNXpQOWxsSk1DanBlTS9SK1RRei93MmNJY0R1bHIveG4rMHNKQnJraG8wZm9Xam9CdVhwYll3NFVNT2l3dTlZRkYyd0lPVlVGdHY5ZlE4M1pYV0gyNmVsNnBaaElsNDc3T2VFbWsza1U1NGpMQ0QxZG81dDduYjZEOFVFc21Sd3pNc3NicHIzcjE2TFNjY0RNTzJ4TFB3THlWaXg1bHNpclBobnBvSldFeUpkUEJNTzdpSU1wRjJFa3A1QXNGVjJwMjJ6TGk5bU9jeVdMSG90YzAvdHEwdFlRS3dKVHQzUy9qblkwd3F4c1hab1NFT1R0Qnd2ODQvM1RDMXdIaElKSmlnV0RrRUNQOHdzOXlqcXp2eVlRSU82R2o0QXZDdmU4VjdSbDBVOG5FZm1uRUNRc3VjSmpyQzNURDhpektJUGdPZkZ5bHdWdllWWU8wcTBoeGJ2eEl2OWx1YnVraWo1Y294RitsOXFjNlkxbk5WcUpQL0NQblpmeEtaZEc0MURUT2s1d2hOVHl3KzdmZzhZV0VXUFcvUlBWdXRZdUNDNGVoYzJlNmVwM3VVbnU3Yi9tY1VuMk1uK2JmZ0lVTmVIdEJ2ZDZNQXBPT00xak1tUWs5U2N1eDh5d2sycldPR1NtazBNZ0creDBvUjRPTEwvNzc2SjAxRWxGeU5WZWQvdkZqazVvM3REbUU2cS9zWFZGVDJmaWNXUUZxWjAyQjBpenlzZHgySVBRRFBtUjMyb2JOeUdxRWFhQzJjd3BwSm90QmRoLzE2VTBVd1pzWlpLWnJjSzhmTTJZN3lFbDM3TzEzcUsyc0lzak1WdFpiOW5lZE1leW9wSlBHVlB1QkFwSWN0MDZpYnhDeml5MFA2QURwYVdPVFVhaE53QU1KWGhPRUkxNkowQ2xYc1N1aTV0dnV3UlJKVmFHQytmZlZTeEZHUDN1WVYyZG12eG8yWXZnTEc3TWJsU1NNNC9telUrUWRjcEU3a3U0V0JoUlRpczZhYjdtYUg3dFVIS3hCak5YYitIOEgvMk01VUtGSnJHeU54ZDhUaUtRT3VMakxNTk5kU0hEYnYxdGRHWmVwTTA0UVExb2V5TjBaU0ZzWnZxTFRiNTBxR1ZLQ1J4OTk4cEFFb1M4akxRMkV2aFhKVDN2RmFwVnNjSW84cFR6bGsrQVRUOXAxVnBBZzFpUk4zVkdkQlB2TWcvVlBxRlFHcWpkNjNvZnVmY1VsbEd2Qk11QzRKMjZUd0lKUmdSY2xCU2FwZFdGSThSbzVVYjVPT2tIRmtHZ1FPYTBZdWVKZ2J6QXd5M2Z0U3Vlc3FHSG4zQURtQkEzOHVHY2tCYkNQK3hjbnMyRW5sUU5zdWkrVkhJNHpPU3R4UkRINnNjc3pzeVpha2M0aUp3aGJOYWQ5dndSNi8zQ0p0dDZPRmpDMEVSQlFZMGVjTy9MR0tYR1dJYzFHRVBNM2xCVlhoNXlyVzRpSTBTMitwWWQ3bDBLaUErVEZENTl3M1psVnNnell2UEs1Rm5vdmw3M1hkaWxRbE9KQUQ4VWpUTTdsV3UxOEd6a0xMeTZMUG4zYjZZdEs3b2dnV0RhSkVOOVBPS1lkK2tZSU1DRSszVnhEbnB5RndMQ3pHRjRPRWJVRVFSSUg1dTRqNDI2alV4WFJSaUNjOHVwWkdRNi96bFdsd1IwaEVEdUFDWm8xMW1WanMyaGt6b1gvVjRsZWlYcU1Jczd4OW1jd2dpcjJwdVY2UzByc0NuYTk2MTltcnpBN2JtMXU3azdzTXg3Z0ZuTEppV0RoZTBtTGx3c2N0YWFYcWxsdFg3SVM4S2J6N1JTenpzdGx4SExrMWEwN25kaHlFMk55SlJqSVRWdDE1dUJ4U0dSNjNqdFppQnFrTUFnUm0wbzhTclhaNTRDeDJTNHd0eGVQS3RCTUVPT2dXUXdjL2pjNkNXZFRKbHkranorNXRRUlZTVDJJSXBTenVDcFd0aXZJTVlwc1lxUDZEVW5QdHd4VHczdXhCTW9CTUE3ODZRbUJrSFdNQzlBMVFreTBuM1I3RlhOUmxlVkNCRjdtUlBtbS91bzZqYlU3Sk5XZVNpMWdYa050dHBqVkd1cW05T3lRY1ErZS9PaGJZcjZNQzRyYjdyVnczK1EzQUNnSW5PaEtub05FblJvaVV5cCsvMGU5YmNIVHgwdVVEZTAyZENBdTlCSUYya3NqVXRzR1AvZXYxZE1BblNPcXAwa2x2NWJOalE0WjE1VGhTNy9yMkozQkluNVEzOEs5bTBPNjV6SG1FZG5YeHpOTGtoQXVTWDU1dVB1RzFZczRiQ2ZEa3FhQUs3QUtEbm9qTHVsYTE5OFRzYjhCSE9UK0lEaFJoaDdtTm1lcWtMTlcweldjR3BVeldZeUNiSmF3ZmhSUXV2Q29qOXpFelhSd1NMUGNXSG5KQzYyUjJTQXhzd3VEdjlPLzZKOVhQYVREU0hiUkRlZUpJSVg0ejczY0R3NUQ3UnJ4K0diMEpjTmVQVjRaZFZZM2dSd0tzM3JUbjdMczJkdEVJWkw2UXNsZUs5WEM1TkRrbGpIQjNLRzJGOW12MFNGMllVUEdSeHY4eWovRi9kM00rRHVrL3VWaHJQRDF0dWNnVGFobFRXWlNYSmlST0V2WTVyaXY4c1BsWHdaQ29tMERZNGhwNDNSeTczcCtIMFhBdnRRYjdTVG8yRVhQWjJicERjb25OTWdxR21DN2JRYlY1dysrZUhleUZXd0NjWU5Ga1BVWGFUWTFxYlBJc1MxQzJML1ZjOENrUkJYb3VYNGVZbDVwWFNOengvMVkzZG9JWlUrbUd6SGhmR3NlNVd0a3E4K3BMM2F2bHJoMXBVTEpWendrVVlvZitOSlBDbXFNMnllREgvR2cvWXdGaWFTWjBQeUpMYm0vOFB0dXJ6ZGZVV2h6Tkk3VExCL1FFTUUyM1AzcENMMTJkSUd0SW5iUERmalkxbUZzMTk3ODVLMFdxdkZER0NJOTF6YXl3YllEVDRaWmNRYzJ3dGloYUdRTThIRnpOMGZiaGRtNXlNZit3TStNbnhhbUxPQ2tlTkJXbEZvUmw0cXY2T1NPUEp1cXlBQ01TQXprSi9BZllGK3hYZjV6RFpid3l1K0EzSXN2S2JPZlJldnViZGN1UWRNRTBpTVAxUVhaUFJrRnRzZEJvcXRrUHNYajR1dUZzamZJbVlCbDhTUFVzTlFyZVBFOThKTS8vR0F6WDJyNnYxS0JhNFVQTy93UGhUQlFPSXNZdnpzRWxkV0I1STVFdWs4R21EempHSm9iN2hOVnd6N1FMZnBiSUtKTStzTUpJMWh3bzljODVDTnVpeGFVRlZzRWVHNDBVVUhJQXFuZ29qamxocXlhKzdvMmd0dHVVaGhYOU5oRkFSLzJnakRhNkd2WkhMYURxbnJDWkx1bldOL25mQW9vazlUSkZ2N3JHMjZRc1h3bndJejJ3cTV2dFcyT0MwTDU4NUcwd2Q0VVo5bEliSlRya0VFVi90d2dpd2tpOCtlY1VNK0x0VHlZQndiWlM0ZDlLUFdZRnY4ZTA5WUZkV2VYTXh3TEVZaGdnTXRwcG9RbEtzVWR3YWE5V3VZcmgyS2dLUUtIK2VPSWE5UzJPVmtCcC94SDRKeURLZkVLRW9TUmZOZDZwa1Bvd0hsTGx2ZDRoRjhFbzZNTGhrVnZ4cFlvSVNwUWkzN3Flc3d3QlhjNEFMd0NUMVp5QjQ0b1dZeTNxREYyRFhWdzhKY2RYdXNqd0FnZHRyZ3ljU2YxYktIU1htdm1JVzc2TVp6RXg3azBFTGVPRHBML01tVnRZMFRTMG1pczREcTNyOFllZ0x2TE9JS2oxMU16SDMwTkE3djB1eUQrMGJ4WXFOcW9SQmtwQTdIbWx1bnNtSE1NN1ZwU2JmWXN5eEV0MGsraytOMDlSck1IRWJoVFU1cjlqaHhiYVNNMFltZVJhK2pmQTRSQkY4RWVLS3BtTUllUUQrT2JHZHAxNlFtTDNFZmxHWnlsbnVZd3BqVjc4YTM1SlJVK1RkUyt3K09lOTQvMCtJQ0IvaThQdml2bW80TklFODhtNHFQWE1MR3FaQnhTVFBvbjVMTk91M3Npbkwvdk5JL3FMVndUTWFaUm5EbmZYQmViVDB4UXlxQ040NE4vTkZWbHRVL3d5UUwremtocGlZRWZMMk8rUWZ3N01vSWpGbjlyMWFUaTdWZ0ZBd3lKSXdHUFVybUNOL0tQZVFxQXRpQ3cxSllSdVRLcVk2M0dGbEk4SU5wWlVKM2toSmZLeE5yTFcwajB1bjV4VUVmOUdLcXE1NzhoTURjcExMSStKL3Jzck0xSFJJdHdIVjFwM2gySDkwaUFhb3FNMHhHWjd0NW1QaUpCV1VUeVA1UzdYYlhqL1dHNHlIT24za2tHZkorYkRhTW1jYVE3QWRmaUoxN2dXTUYxRHFaUVA3RE1TN3NjYVdFWnhSZC9CTm9Ua085SUhDcC9ZZWFsSUFlWFV1bUpMWjZ0OXNrQjVRR2FUWXJXV0NzazRvdnB0VHZXSUhacWY5dUM5NWFPaXdiN0NJcmgyVUVUcXRnUlk3VkN4UGFURUN3U3JuVWN0ZXpwY2IvbGg5NWMzNnhCNW9IS0V5TmNxSEU2N0Q0cU9EVkpiZ2d0ZHhtUi9Wd3FoV3JTZ00rNWFFbjFuaXVicjRldXdqMXFTWEtHVWhWVjdtQ0pGUkxaY0UvTjhXOXI4ZkcvNjNxRUZTa3IrZ2pQdzJUWkxGNVM1N1RYZ3RyQWwvdDZncXdVR3lKTmc1SVZNa3c1UDlBQUxrWDBLaXFFdk4vTDJRcWFMSUJCeXlUd0NMYXRQV24wOUMrZTdFL0JIMTJacUJHZ3hKc3g2SE50WFVoSUxWUzNqaVBkQjlSZm1GQ0IrWEZ2bTAxMDhua1YycTAyUUFZaW01R0YxOEVhK1FpVEpqQXhPb0VFRVdLb1VIYTRKdk4zMlNlTWJGemhjdVFwQ0tpUXl3MlIybnRTbld2SFhqd2hPa0t0SWtuTENPTG9pT0tabHlRb1RJRWZVMDRzMnRjTEhLTTJoQnJacTJpSG55cXNnL0RCV2UyT2Q3Mldia2JVd0p1TGwvV2N1ZzZyTDlzVFlzV1Z6em9zR0tkakhVaWFpaEpTcVNGTjV0aHJNWkNNMW1LbU9qMG80Q09MbkRSekpQa20xdFlmajh0LyszbUZOcmxRQkNBZnozTTJONWJKSU9IR3QwaUhTbCt6bVFwNS9KdUdPRFJCSUZuSU9VVVRyVytURmVlcko4S3REUTdYQjBxYmlMNllOWmJ0MFRxbW83TnZ0VFVDMGMvT1FsbGZEK2F4am05TEVkUzA4ZWxDankvUmtWYVRLRFpWZDVNaXBwd09YOVc4OWNubHBCUnpFTm9rcjA1NGRsSTNDTmtOWkFwdURtZDJVMkUyajBncFZqbDlWdmRnbytpK3lDSkJham5CU2VLUHhudUFaTUdkUkh6aTBHYWUvdzN1YzdEcWtXTDFhVng4dUFWZWhTbEF5MWxSQnZZR0orUDhQbndXUUZUSWVoazErT01KaWRabjZkYVg0K3I5Q2RjMi94QUdJSDh2cFV1d082blZZU3pBWVFyWWhwQUEydjhjVG45Qi9ha1lhTDhrcjhTZTVySmZsRy9SVjk3MXVibklnTmp3NWZ4aUYwR1NrU2VwVHpNQnlWZ00vc29jVmZ0RmU5SmNvaG1KV0ttNkQrS2dvQVQ3TG1lRnBhYnNQbTVtYytWRjN5dk4ydUdIc3VjTW8zNFFTRHpNb2F4U0IyUGJCUk9tREE5UVE1a3B2QUZCMTJxOUYydG5VMzMrRFFBcVBjOXIrdHVTM1NhOTBVTjUzUFhTbndTbnNScFdOMG9kS3k2ZFFOSnNRYXRkVXFiUmlsbnllS0dWN1RDNC95NXlORDZiNnp5d2xicTcybEhZTFc0V1BYUEtzWFU1eFZDU2JtV0E1NmtJaVhIYlUrMmVQVG5CZVBrSXF2amF4QXpnTHlnN0JwQVUrUnNzcGxCK3lEdFVNM3d3cnU5UjZQbDI5U29aWnZrZFlXNUtQdzIzR2FHM2ppZkJaenNTOE56dTZqRUZLeitzK0xkN3lmQzRsL2RtNDZsTkVmYTVDdklxMWVtOVJRR0VYQlA3Uk1McXV1UVlNZDJJeC9kVjVRMEp6T2VRc2toVXFqQjBNNXc1dTZzK2RQWG9lSTNOaE1qOVYxQ2tHZ2E5Y0diOEVMZWRSQTlhMmpWKzY0QWl6Ni96M3REV1NRSXRiVHVMcnFXNjdUVzhscWpBaE1od0g3dFVaeGRPZmtNb2JabzFyL0NuMXdQOE5ISFhQSFRPendPY0g1Y3lYYmNnVnplcmtkRzFkZmZ3QUxrWWxpNW0yOHpSRzAvd3ZJOVpWU3ZZTFkyajFDYUxtM05BQTU2L0MvcDZsQlk1UGM5Ni9Ld1pqS0VOVkRFUDV0Y1lUYWJsZDQwWjlZbFhCamNaTFQ0UU5tdE5rZ1ZGMkNZTEc3WlBQMzMzRk9FZHlMc1NyVzhES25JK3Q1WFZoSUliOVBRbk9wT2lncVNNaU93eE5vZUZiNEFLRWIrRkZYK0NaTGpkTHQxTitkUHVrcGkvQUxVWWFnbEZFTXR3blV3TXIzLzdJaXNqOHpGSG9nendlY2N3TDNOYVVCMUtrOUM0TklnY3Z5dGdaK2duekJLdHNrSVBHdFNGTmR1VDRrUFZTaFZSYjViNUo3alRvUHRuMk5FUlhOUW5VM0ttQ3hvUzA3WDhMdk5SM0d1cUJpelEwdUZxVGNZUTVsV1Q3VmZYd3NNaWRJcEJWV3FoaDBmeUZvVVlkOFhLRlJNcE54YnEvUFVOT3NuaHU0dTRBdTFLVi9PaGxqSkViSDhzVHg4ZXRMdEVGMnhKNXlkZE9qN3ZKSWh0T3I1Z0tYdWs4RTBzTFdNcmtWa2gzM0VGSURnWVM0SlZ0aW9FYUEvNWJZM2VxMy9rbC9TRkh5Sm1Ic0lqNGxLbWhORjk0ZWp1MVBSZXQ1YWI5ZENROUFUeCtXWWVBRVUzR1pKemQwMmlMUFZ0bW5mMGJhVnU3ZjVEaUp2bUc2aDlEN05ScFBKQnRQaWtPRkdFdktSUTZpRkk2QkhIdHZzcjBpZ3c3MzJOV0J4TEpmOXFKVmVmWXk2bUZmdEhKejZMREY4NVJIdXZlQVJhL1paMENaWFdjMlcycEd0TFRXMWV3STVzN1puMTFPWjdNR3kzUGk4Q0hzUldtZTcwWVBlUnlpbFFnSnhkbjNudk0reFJBbWc0aTNIQzVoYjkrRitCR1NYUFplSXpzZEJtN0xTc3QzUWxiVWVRdTUrY3R5ZUtSVEJ0U1B4eUtud1F1Q0VwQmlwcE5rcTlUWmwzOCtZdWk5amVoZTgwVGVSYmZKaUFsemZubEk5cWxYTjlxOSs0WUlUbzg2aExUeHBLRkdZM0RqVm5YcDVoTTZYaDlpaUdGU09IOEhPZ1R6VjRpTEljd2VBelMxZEY4ZUFYWXR5Z3pHWC9DN3dmbjlUYThGQ1FHWWFVcXFoSEp1cmlCRWt6K3piVFo2Y3BJSGE4NlZHN2V5L3pHSGYvRTRBSkhmcVBXaEpydklKV0swbmNaWnY5NmJNbDVJWVpFSi9XN3BMT2tkT2dvbnpLMVFsWk1qQ0dzWnZRWGZZTmt5VFQ0NzBHWEQxdTFaeDVxRkQ2NG1RR1pCLzM0UGl3TkZybVVIZGNxUklGcHdsaml1c01VaFFtWklnTTZ5Q01lZlM0ZGNjbVBEUFhYS0cyUzZmSVAvdC9aRnI5MmRuc1cxUGtNTUpjc3cwS1BlSGwvelZlV1RDeHc2WFZHc3IwNUdKNk5BOFpVL0RLdUZKcEdNay82bmNGSWFneDh5bE8xRGtUNkcrUmFsZXovMVZET1A4Q0tIZlkzOWNJWmowVWZpTEMwOHBUK01NbG5WTHVCMEF4b0JYTURPMnVPMzAwZDd2QytwaHNjMnBNNlRaaXpwOTMzeUlrN2FrbmQ5cmNVU1poMVJ4cTRIRWFzNlBDU2FMakdLWG1TQmRvVmttWVVEenllUFVjaGFyaDltRXBkT3dNd1lVMHZiS1JFMHdJb1dNS2hnczI0QkVKTStvU0luWktSdVhUR2paeElSQU9SSVNYYjl1WGJ1WWp6MytVdTJGRWhRbVhhTThrVk5XVTd5NmxKRGxDLzFKUUFhSHFMRUlGdE9hRk4yNFh3a2lycFN4ZlcvTDdMZWFYNldjSk5pOTZqUVVHWVcyS0M1QXBsMm8vV25CUkx1YzFPeXp5YUg3eW5ZUnJ6UEsyUE5QOVRuOGlHU0dKeGJXeEJlYWZVdjQveXhuMy80RmNpRHhpemlxbzJvZDR1Y1c4Nml5NlhIb0UwRGdOdkNLYXVBdHR2N1lVRml1bGRDcnhIZTNtUkgzL0phZURBdWtDUFRPQlE5VXBlV3loWnpUN2E1SXRCajFxR0FMUngxckRxL3g2MHdNd1NyQUYzd1NSS2FlRlJPTDZCcU05N3RoNnpKYytpRVZwRDZIM2gvRGk2aUN5bnFmZ3Q3dy9ZWnNiWSsxb002QWpwNEMyWTl0TjBkRENjNUFHUlgwdDFZVWRRQ1hqWHA0MlZwM1pneHBRR2tBUXhrUU51MjU2QnZQRDU3ZzhVSzhXQWxxMFZHZ3c5OGlvbGdXRDIvNG5SSUJFVzU5Y3NhNHRxWmRpV0dKMC9yb2lzbGhwRlRuNVZTekFZYTVwU3lTWU9kZnV5TmQ3WjhSUXRSNkxtcDkxQW9QdlQzeUFCQ3Q4UzVHQm5SSGcvcFIwd3NRTW5XV3NBS1B1RCtVWC9IcUx2d0xQRFI5bkRMTzYyUDVKMjU2VmQxYlZCakdtaWVhcmsya2RtVmZtUDVjNXIrblBSeWltd0tRVllhWURNMGZUS2N5c1NwdHlyUkJqN2NibnhLNDBlby9FMW8vZzVWbkNTL2YxbkN0ZEh0UllTT1AxYU94aVZvaXNJNlhFc1gySjhvWHFEQUorNGh5czRxRzVMZ01QM0cydUY2Uk5SbEZXYjIvOXo2UWxzdG1YTUhwekdlQkVjMmxTT3B1N0M1L2tPWmxuK1J2OXQrVmdqTkFtaXhxTytjRllhSWw1TXBxcC93cHhaTW8xbndNTVdTWW80a09FRldaaFBWL0tMVDVRU2svU09qQ3dIei9jTm9nekd2d3VPK0JjY25QVzcycUF4azE1UUVqbStpNlh6QkxKZlpUcmFmdW1mYXowVnk3RzJocjJpeVdCdnh2SktxZE5nRC83M2xlbUJoNDBXd0NJellESFh6M0ptZHlTRnpBUnFOZmd4MzB6Vk9sVlpOaUJLTkVkTE5hVmZYYTZzaGxiUDVyNFZ6aDBuT1c4SmJsbVpXV0JOQVJsRVE2YzlvOW12TFhYcHJQUDlYbklDT3NOREhFVGZVMzhxSGxvRlVDc1pCWnVLTWJkaXQ4Zk91KzVSTkN1bEZjRkQvOHUva3IrQ3IzQmNROGY2M2tHVmQ1eVdyaTBFV1Bjam8vN012ejFnL3g0bCswNGJzMGVMZVp0QnkyUFhBYTNYY1ordXQwS3hybkFhbEVtQVFsRmlYKzNneld0UGVjY0xreUsyM0YzMG9xYlJLOTkwSWlsVlN6RW9CNmFPMmVEOW5Ha3A0MXdqTytPSEU5Q2hxT3dtZWlSVUZFNnBBQk1hcDJmbjFuTmdnQ21PazRLd2tldW9nTU54SUJwdUQ1T21reVJTYUI2Mk1oSk84ZTU2ejJUWWo1TC92V2hhS3g0Y1VVbDVQQ1k2dXQ2SVR5Qytkek9oQk5PNWlGdlVlWCthTURQZi9LT204bWZyTTRROGF6THJvTnQ4NFV6ZHlDdG9PYlVGNXhZbStGOUxBTXFzeXEzcE9wb3ljMTl4UUxROGE3bTBTb3RxWDE3SGdsOEk0byt0UmJINE82R2JrQlV3ZGtkQytPQm5sR21GMWphMlFOUThRRUt0OG1tZkt2Z05HQTBiek5MRE5GV3orRjBnZmVQbUM0Q05sdzlXalhVVTh5SERXakVjbjdxeXlUSm0xSzh1TUttbWVPeHZPdTR2MkR0YkcrWkcrYWY0WDk5Ull2TWh0THMyb2QyaHVLSzc1czVRbk4xMzMzR3RibktmR0FmUnNQL0REUHJtMWw4M0tTdHJ4RDZrNWZOQWxicXB2WnA4U0pZNFg5MmpWMU9FSWRON2pGL01lQTNrRWdHNXJ4SjE1d0g5OWtBMUFRY1RCVDNmOEU1TTRZNjNJMSs1TktGK1hhUGp5dWVzYTlFU0xSY2RnNytWT1pYK01FMnlDdFVaQ1lsdkpmWjlHRjlwV2Y2SXVlT0JtTFVJdEFwSXhYbHJTM00zd0ZzTitpWE1NV3dycUpyWVVzN1B4NEFOWVlSNmZJVmRZVDlBNlYzZjFrYjFaREpyV2FxRWZFaEpQT2o4c0ZwWEUyT1gyR2ZlQVJ4dG9uZU1MNzhtQVk4ZVBYc0lzMTR4aFdzMGNuK2JlWGpCdVV1SWkzVDRnelpZMWVDamZkZXBFZFp4YmFUdFNrRzJBQlh6WDEzaTJBNnZMZ3BCU3dLNU5kSkZIVlgzcnJUcWVCQlB1dWx2WjU5VEtMSDRmbG4zK0lNZW1pY0tZUmJwKzVyOFMxKzliK3ZTK1piNHM0dkFSUTJWVGdHWWNYSDQ3Z3lWT0FMZ2JIK3BwUWhPYnJzTVNTb3A3dnVBVnljYVZwbHN1c0N0YWthQ283Z1VVYzJGK0gvRUsxTmRZVlUvZTIyUE9xNmhGZXlvaFZETUJyZFJvaXdiUm9RWDV1WEMvRkRodXp6ZjhhNnBJWXpHMklTWFhiNE81Qkc1Q2ZEYjZmV2xzSkRaa1g0NDJzc2xNd2F6WVo3MzYwaVpqajZlMFNrOGFuRGhUYlo4dzJoN1dFSjVTWWR2UEVmdi9MeEFvR2pMa2NCcjdwaVpTNTRRRnl2d1l6N0tJQWkvZXljbEplWDRsRGVZZ3FLR2YwVGVDVHRaM291cG5HSVkzRWdRRDRYMWNES0g1dDVwZVhYZFZ1d3FDekIvemMzejVIYWQvc0I4NnVQRm8xZlpsWmNpeXlCTWdzaDRGUkNBekdYNjhmbXlueVVka2xSdjUvZWlHbGZNN2dLcFlBSy9VYjdHUnRsdmRESlJ3blVwc2w3bmRjNHlOQ2ZYUHpuYnlaRjZWYTFuTkJmY2lrYzlrZEVESENYckppaEVnYmdwOTZtY2FOS1loVVozanp1N05hQWpjMytUdVQxRWk3cEhJNDRqY1dGdUg2alJobmppZFRXeEMxcG16N3RKMEhtSWhiWThXcUhROWxZays2d2pVamZEZEt3c1E3VzUvOGd3cVRZR2FJVXRQaXVCQ1NjSEs3MTNpazRFRFBSa2w2YThYMHFPYzZ4YnFybjV3OTdzOS9ma0xpSUpGdXo3QWliYnNUMTFjVllnTXVaZnpyMmhKVG5LUy9QWElzSWJEYlhVcCtlNzgzWk1mYVMzV0NJdzZDVXlNUTdWOUdzYlZQK2EyR3RlWmJUWmw0cDdoZ0NCTFEvSTh0cjFybmJYWjRibkxTcDFVUHVBUlVwb242dXduM3plRmtFN21mNHRTdDhrSTRscVl6VVBveXpPZWNpYmIzTFB5KzViSUEzdHppd3NwelJqSG9DaXBUaGx5RXcwelArWkl6bERtK0ZBWTVpVmJReTY0NUhxYkFXajJYZTlGUlZDQkUxZmd1TDBYbDY3NzRPQ09sVDJDdHZwL2pqZE8yRVhXRml1dkhKRHhhai91djcvQkpFdUtBbGNhNC9OamhBdEtvNlFjbG4vYUh4dEswLy9QVTg5dk12OVlUdFNZVnBDS0pteXRYSjJYOXZGODBMV2NCMUMzM3I4UFpxeDhxRXV4WXQyTXJOc3VPcHE3a2FIdTVTQnBRdldoZHBkTDhOS0M0NlIybzA5aEJqRWNab2N6Z3paY1l5RHZtT2hPeVdrZVQwM2VrZWlBdjdtenZDMkVCbFYxMW8wQVhoMXpVNTJGcWFQaVIxWTU1M25VenhEUURNMmhxZFNnVTk3NkVuUmxCbUUrbmVpNmcwT3NjMjlGYmphQjVGRkc2QlVpbEQ1RGhyK2JnU3lJNzZsNE9rN0x2cjk5SytnbzJIQkFZVTBtMHE0ekY5c1hBaExjR1VDUlFRZEJqNEt1MXN6Z2p0azE0VUFPdDdGaFlYY01PZ1BKVWl2K2Q0VERJZm1GOXVBWHpYUmNabklLYm81ejkyRlY3V2d3OXB2OVE5TDZrY0R4NkZsZXh5N0drWm1CM2RXbkJrS0pEbXFEZGZZdVE4MkhiUTNzdnJJbmlETjFqSkNsSEFKa0R6ZUQxcmFOWTVkQXhFcTBSeWRiY3kwMFA3NlZmZUpkOHJtSjhqUkhKWjhFenNLdTBqdDFESTVmMWJYWkVtSUlRaWVkbi9TdXNaaHBBRHMxd2NCaHdUYTc5M1FYMEJ1UFd0R29hcmx0Q05KU1NnOVhMV3VEZ1pHVGp3UnM1cDVPemN1WEU2bUxPSlA5ZzJFWmc4RXE2ekt6U0JXU3pENEhONnZwMFR2b0E1TlBETWp0b1Vlb3k5eGdFV2owYUtzL0NCaEFrc3YxV0ZsU0hGUERINVNrWW5GdExoY3BXTnFpSzByVE5QU2dhRnZPUEgyK28rbEIraHRJd2lVd000NFpYblo5djNWbXBJYjVVT0Rjak01Y0dNR2hrNThNWDdDeHZiNHRHaHByQVZBS0l2OGlvUUlTQlI1enFZOW9rSnlxSWZPZGNya0NPbTRXUytWeStPMWFlQnEzZ3hsMFNFWlp6MEtIczBwMktJQUlTbkNiSUNWeUo3QnBCWEo2Z21RM3UxQ29odTdQdWRhRXFGc09icUhLaG1KaHVTaGxZbTRwM3NEYXNpZmJ0ZTBJQTUyK3ltNVRSbElCTEx1OTBDaEswbStGYUgzcEg0NWVKZVJmTHIzTzcvVmpFeDJRQjNIVFBuQjRXdEVEeHlEL242ak4xMUhqcURNTUlkR2NKemVJcEwxcDB1Z3grbDB6ZG9HRVNmZmZNbzUwZkZHQjFxb3grdTdQbUVzR3pGTHJKbGdLMXJySE5PdEp1ckt0K01ZNEt5a3l6NlhkY09SQWpxYXZ5ZEV1T3RZWEwvRG5vbXU0WXgwMkMyd2NXRHByeVFrUG9hellVZk9rby9GeFZEeWlpK1VnTFpYOVF2bENDaXpEU24veXprUkcxUDE1R3RZOUZJRjhqaVd0Vk1jeTRhYlozZVRGaTB4S3BpSzB5TkJZRy90cVJWMVl4ODU2bFp2NnFGam1TdWRBMmMwUThJb1FxT1RSM3lQUThJL2Raa2Uzbzk2Yjl5VEhHc2RLTFc5OW5sNDRRNFM1UU0rV0dwdmRsOTFMQXROWm9DWWVtbG9mZEwvVWlmVW1WSENwb3ZmQlhRa1BIZWNRUVBrcnFTV0VjMHlKbDVuMk1HSDJybkdqZG9GREVRb3RWL05nc3BXaSs3bkw1MEtKMkNaSmY0TWZWeXMxdFZZRkEwbms5aDZNSHB2L0M0Y2VNL1lsTzM4bFp3T2RhbUJDalZDMlFzUExtb1I4Qnl5YzN6amNKbGpXMkdzc1lRQ1UvclNrMzNnN0pCSzluczNZdERJMkJHMzZ5bFVxa1I5S1hqbGFKaHA1aUxqVHJMeGpCMTNBYThSemRUVWVGMmVWcXlON1ZyZWc4MzBpdU5UMS9hMUo1ZDVZL0VNa3lselJCSy9ac1B3MzVTZ2hFNkpTZ3I1bnFaODVVeUdPdzVvNlZCYjBENUtjaFpsOGJJWFlyL2FCRjg1bFpKaC92TDhEN3hXUGcvRUJ1MTFKZXdyRldFQ29aRzM5VlpMbEx3N1BlSG5qNEZ2K1ZScXBjKy9qcHRGOGVZb0FINzYvWHVTdGRZY1pQaEFPWDFWbEZwRVNhZXdRek9qWkpabVVNc3NwZ1Arb1hGRVNadUl3c0piTmRhVDdCTWNqWWpqYkludnlQSmllYW5DeTJBU0poaHlRcjJZZjlZaE5zWkk4WE1yZGJWTHVzUmY0QXI5WElOcGZ4dTZoeDNIeVNRYTFjSU81aWJSVk0zanNTbVJiV1pHcXlvTGNiaFJOaWxLSUE5NVVUM0ZPeTJvaWtQaEpUZ2ZZdHNoeUI5c1dsSW1nOTVlSTk5WmFxb0hvR2wxeU9aaVcxZ3N3cW42blF5ZUZmcUNMWVFSVUJBQWV2REVydnZncTRucWZmY3ZIeTFYaGpwRGxWQk13WmdKa01LQlBwejR6SWNOemV4ZlI2YzYzZisyeEIrRlIxNEZBekFBVlowREV1b0J4STY5REl5cG16YkxPRDBCUHJnRkw2MlNIWjhFQVd2eDFDR2YyQkE4MTZuY1N5ei9HdkRpZzcyVmxZU3R5UVJNUWlySlR3dXdNMklEL2lqbC85bDU2OS9FRytmNmhnUXFTMVJFb1YyNzZzYlhmUUZ5Zno2dXhkL0p3VzRpSDloY2FyZDFiK0tOajdQWEY0SmZ6MWZ1NFNCbm8yQi9EVE1YTjIzQzJvdXptaHBTcmEwRmdvS1NIZDVwcWtaaGxKd21HMFpTY211QS92Q243cmtRM1Jwc1U3Ukl6aTRmU3ZSZlpvcmhkWHZ1UERVclNvRW9JT3YrRVpmczllSzAxeGpBZ0VUU1dXaDNERVREYnR5eGljYU02WXdlMEtMZXcrZDRXNFMxOU9RWld1Qkk2V2Z6US80RDd2S0dYdVVEMGZzMHNPayt6Y3ZUa1ByaUpsOWpjeUVKN1pJbVZobmJVaG1Ocy92WG9ITUNyNmUxU0lFblNaTFRaZE1aekgyc25iMmpRZDFXd202aWR2aXJaejFhYW9ZdHRFWVdRaG9EUFl1Y1JDUjdsZ2owajl1MUMwWDM2ZFpyVmo5ZDRxbDdaQ3NvUTVZUmprRG9PbGY2WjJCRkk4cnd1eHdOMk5hcE5MN0VPM3lNTk9ET3BMaWV2bGI0RFdDTCs1dDRJNEprbEc3eURyRzQ2aHNsRDhrSmZkOXJhRS91WUxmazFSeUc0UFh5cGEvdVFQWHVPRC9GWGtFWjA4RmFpS2xTL2VaSnVxMytVdEtKM054WmdBZGluNEFFQ3FaaDV3M3hNZUU2ZHlWeTEzOGw2aE1JSkZmU1NIVzZJbW5IZVY2Yno4OWdoSWg4ckxIb2xvYXJBeHdKaEtpaFJ6TkZnRWw5MzBabnRnZEg4SlRPM3RPZ2lYeFZkOXQ2eHdqMGtKMzR1QU5td2p2RGVjZWhrOFRHR1hxSXVPdDVhWXp0Ync3Q0drMlhKa3VnK3I1eVNtTzYycG5JY0lOWWRYV1ZJRW5oN3p0ckoxbGJybnVUYSsyVlBxWnorVjJLaVNBY2dxRFAyV1ZwVDBJMlo0QXZWNGsySVJMMnVvSHVleCtyc1NKQzFaQ3dIcmRSQUF1b09uSGM0N1paYnNQUHdHWXFZZG82MkVSWEt4aFEvRTZIYmdlMlpUMENBdWV2MHpjclR0b3F3TEFnekZ3Y25NMkEvUk5weEpORmQ3RWQyMUp4RW15azQwOWExOEErOWRBTS84SUhXVU9oa25qdENrOC9wZ0VYVDNWNUc5ZWhaMnd3ajlLcGxzM1o4MFZLNHFjdEkwY0ZWUDVxNkcrVDBsa0Q4VjRVTkd3WWxtenA2M0pEdUxoMWRaY2Q4WVFMWDdvMXl5ZjhtdzBabEdPbnJ6UFRpdUVvMWo0THpGTFQ5a1BnV0JXOUg3a0xtZkZDb1kvZmxXeU93K3p3VzZEaWtZbk9nQi9Pc2ZmMXY0Tm9vN1QxYzhFcTFxZWJEMW9BbTVidE90UTlsWDJERE9jY2lZNHd2YTdXWTN3UTMvWjFydzBSZVl3WExBNFV5YXlrUHQvMzZ4WVRBUk9Vak5wc2IraTZpdll3OGw5cm5IeUdFdlQ4dG9jb0h0QmgwTUdhWnRTNC9KSWdIUmloY1liU2ZDaHdSemZGd1R2RkFSbWl4YTFMRkxva3JrTldiMCs3Yk1ZNzk3NGVFMEhEMGgrd2NSSnJlWGMwdzYyMTJiUW9Zamc0Q1lyQjFnQk5KbXpKanFuQkZINDVBSTIzMzU3TlU4OFRqMVZXWnFpdE50VHBTMCtZNEttZkxoV0Nqb3VGQWdzcG1FZ2ZnMENoK2pScUpHN3FscHBiQXRTSGpVaXlmMmN2Y2RrYWNLQnVlK00xNndZVi9uSnRzcGlubjVRZFFPdzkyZWpjdGJzN1ZWcTM3ckdkYkhkTWxyQVVSRlFtanpTSEFoMDlZYXltWGE4amQxSElYTG03bnVaT0p0KyttSVl4dmw0blVHbDZMRzdua2JZbzRWUGwwOUJicFFtN3piTUdybVVoTUV6NE5pT29jQ0JNWC9sa3FOQkhvcGx6SlNETFNSZVQ2dHJDUkpxV3R3Zy9oTDArcXB5bCs2OTE1MW0zY1BiNWR1bTkxMms4Q25JMUV3WHdqQXFwL283NHJRTDhWVm5uNmN3YWtqcTVuN3dkelZRRThOZVp2ditOTXRBSVRSR0YxR3BRb0l4UCtvalp3aXB4WXJCQmFQR0pRVnlzUy9BRmF2ZUYyaGxUdERpVUV6Y3RxcXdjWE9TcUgrUEYyaGFUQ3JEM1A2OFB1bitrMVVWL25CN01YN29VT0tINSs1UXBicnFXZStBZThOWGZNQVlyck1SM3F1THNVYklBV3dOT1JEdmFkRW9hVWlieUNYc2tDUnAvZnlEOXJDRnNlOWsxOEVaZHNqdzNza1VTODl1WFA2aVMzTkY0T3hWNE0wekhTUDBPK2tLSHV4cXlzUDlmMXZFb0tMSExndUlRRWowZmtDYlBVYlE2QWR0NnNGL3JRd056dGkzdm5qY0tIelloQVdCM2ZrZDZsR3ZJaU5zWlAwRmpzK2crVCtQaGx6MnVJMkNkcVZmT3RFbENTM0k3bzRiWlpMMFg1bTJSMVh6S2U4VlpOODh2dFJPcWhrQWdEWmFmRWJwTDdLTmJEbTd6b0NaMHc0Vy8zYzUrODBnRXNTUDdXT0lMd0c5Q1hxQ2xEQXlBU281ZDFlT0grcXJBa1lyQ1pwRlBpTlN1UjBlS2daeDByN1Z3Mms3SG1LOW4yRHA3NWdydUFWK3VlSzlNcHo0ZGM2RFFTRUJaQy9lNkdzS2ZjV0NVczlOVE50RkcxWlZBUkVYRXhoRTdzNGFTbWJZZW1kYzVaV1ArcU9rNFdRKyt0ZVhCcDljTnE3TllkOGVjR1hJN0V6NUxCNmlTUzBuZnZDNFdzV2d2RWhmMnU5RTRXWjByd3FCTEVjNEwvbWhSaDREcEF6OGovTmJzYVlaYkVzQ2NyaTMwdU9SRWU4bTUraWhseDlmZXAwVTl6MU1FZFJHaFFKMUcwendGNlhCMy9lRFExN1Bnb3FDcnFCSjNsczhLM2p3VTdsSnB4VmsrZnFKVVAxY3JLNSthMkxEQ244dUpjc3M3YytKNWM4Wmo5VWlUL0Z3RG1YcC93RWtoN1JaRTVsREtZQWh0L0ZKMWh1QXZJUXR3Y3lIKzRINVlNQzhvYkxheDY1VExUYnNiMGJjRzc4bUljbkxDOEJKZjZ4YVRwOFVmeVNXQ01pdkhNNTB2TFVvaTZOako4elE0MW1ORnA2RWN2ZUorcnJFMU83eDI3QVEzV1hZNTBqdkEwcmc1OUpaRjgvUGhDR2xFbG5mYUl3SnlvTHFUWFQzSWhyVHo0SW1hZ09CejRxeElZaDRvWVdDdHR6RE90SXZNRkxZdW0vTHNUR0Fhc1Q4V3FEVXFSWkkvVFNYSG5hbmNnMHJOS0UvV2QrL0JMVFdpOXd4djFMZzVlUUxueGNMT1hIcklOWVc4eWtLZDZVdi9SZUZoQkFkdHVyVzlwV1ZqVFFHb1BGNDNEcWdyMWxjanJjMWFNRWt2YzU4VGZjdVk4UDZzc1BzbUNrZG11WFNJUzA3V1B2dXRQVUE2L1ZaTDN1NGUrRW1tc09ucmN5UlUxTUtkSlRXTnI3RG5GQmZJaVJWS2VZTk9Db2RtRXI5b3dtRmRRK1psNU1uU2JSOVNMeFpPUUg5VmQvUHJhSEJMaDRNUDFaK05kckN0ZTlHWHNQOHBEWWgyT0FNWUwzcUpTaGtCS1Z5dU02WUptay9mMyt6MmtVOHhWM295Q2tEU1JmMk9zZmkrQ1ByeFpQV3ZIaVFkREJRNEVTUWs0c3M1WHFBQzVtZ0xacjZaNWVWbGtXaHVjVVgrNVNzQzFYL0FVMGliTStGUGQ1RlM5VGV3N3lHZE4yVldCS2xUcmlhSXdJWHJ2ellkVWpmbjJiUGROOTk0K0tZNWl3dFRpKzNiV01ERVEvZXZZQzBUazljTm1neHNMZ1VSRGJOWkx3OEVpMVBBa21GSGIzMTJqZXkwSXBMTTc1dElTNU5MQ1VSZ2xUcnRvZWRSSDQ0b24vWHlpMExiU0dUTU5ybXRRTE1FRmRSdDVMbEt2bGZiTGUrOElac21QS1NHQmFNODhGcUIwdWliNy9WOTNjYXNOeHdZR1IxR2lQNEh0b1YxUkRGbmhYOVlJVEpNSVRXbC9CZ1doeXpIUHlZeEp6UjNmT2wyRXB5Umg4blFDZkVPWVNRTS9pRjZzblptTHprVmlPZUtRa25OQVRPODl3T0NrNjBCQWJjYnY2VmVPVVNaWGxJbzBGM1hlc2FPcFZPV1lBVmNpL0JuTWd1ZGNjOEl2cU10QlFadHovQlN4R1ROc1hNVDJlMHFYdTQ3VExBdzNOVXZYM2QzS05ucGRYR25WSWVOZXk3ZERFU2lWb1NvcUZlam1BdjR3NTcrSEJaZnlLQlgwK1o1WE4rTWthNi9FN3YrYTlzNmxPUUVHelo5TFRydzFrOXc3RWlqc3dZMWFYcGtDcU00Y1FaclFicVBtNWNXQTdKZDVESkZocDZERmd6b0JaN0hnN2E3VkVleGxxZHNqYk9VL0t4dGR4dnlHUWlPSFliQ1hmaWxiY1U4M1JncG5UVHJKRll0cnMrV1hnOXBEVjVjempGNFhRMGdPNktVUDlzaHFPL0ZoOUtKdmJYcWFZSDNWZ1pYVjlrSXY4NGZaVXpLTEhUMUVmZ3NRM2tRTnl1NW1hREgwUEJYdURmSndYR0N5SnhtVi9ZMUZFWUtub2psbi93WVRnZzBWM0NUWWZ4cnVBSW1kV3l5NkdIR1NGek93ak1xK2RVTXBLRThTSHp2cS9ocG9nK0xPc3dLblEvcVRoSlVxcWxkemhUcEttTm1nRTZLRjNJaXFJbWt4UlRLSTNCbE83cTlrRE1nd05KZ09VTHV0RlprdVNmTjR1OUQrZ2l1WURieklUWmZIV2VXK09rRkJnNUltdzliMW5rSWU4M2l4MmxKbU1mUWsxVFNWUjJzSWRNYnpUWjZ1ZHJSaGhDZHdFbXBVb1FWQXROa3RkTk42RFduVmRIZ0dzUUR2ZE9ULzIrRERzSXFhSHVBUGc1aDFJRkhLRlFpNG9OZzJBNU9XaTh6K2xiak05U2kvUzNLTi95RzJ3L1Y3cGRsdjYxeG5GWGVZUlVXVWdvbkJCMUVYV3JwQytYZldVTzc2dllxTE9Jdm9nQ0lWQzA5elNZVHF0V3dGQk1XemVCT29hUjM2K1JSbUY3bVN6OEh6ekhLdThTWTN6b080SDdyZSt1Y3Y2QWNlQitlalpYbFQ4ZE44SXJaYlJ4ZHU0OXhuRmtQUkZZRHpTU1FsUGkxc0o1b1djSndQZ2xzQkdiWklBeXYxK01wUEFtbDQ5R0hydjhGMDI1NjFoRHFySDVGaVIwTnhmWTMyMWlMUmJ4bHdVVW5pcjU1RzdpTkNqaDRTa1VRd05LanQ0VktFUzRwMWZTK0lITFhiMktZaFlETWxpb3B1SXhxb1dlRFRmQ0lmS2lIRFIrOXB2Q01mSzErblNzb1VKK3RPQjg1K2RXVk5GUVJUMHovdVNablR6UXlMeVA2VllnbC92dHJjeXVXYndBdEtTeFovcXJOZmRRVXZGWjIwQStveWNhUGFOTGtYR3lOVDNjMSs1MVFwZVRlalYrYXV6ZVpwNk5XRzZDaFA4Z2NNb0FxTkJ3QnlzNXoxL0JJZytNYXd0bUVTK05qQVJnUHZtTWtCd1JSTndMaDUycGQ1MFZjWTdIWGdYWGQ3WjY1UE9ESmNyajJMMCtKUDhhbHhSNjNuU2tnQUdnZHpjSFVvbHFBT09rR29WNDkvZis2OW83L3FnQVRZM0x4L3hvZkY0eGR4dUtmVWlqWSt3elM4d204bndQWW1oNUhFdTQzeG80dE43aEk0NHRvZnQ0NjQ3L2MvYkYxSVVnUUdLVUZpYTcxdndEVk5XT1YyVW1pM0FzMVpYeTFMeWFpS0cvNE1MamI3YXRmRGwvTElzM3dSd0l3Z2RheGxjWVBPZTFEd0VMZitpQTZKNGowWW12OVRzVDhrZGZGOHQvTGJ5ZUtwaDRuQTlBSzBkYnBVTkc3bnJZYTFBYzhsVEY3MDBWNVJhcjdlaC82dnBCRVM5djA2clIydlJPUHRZSkdxWUdRYkxWLzNBd2U4VUNETHhDVkNBazNiU29KbDVXMjRaOHBXV01ubDhVbG1GbnpXV3VOSHEzVUhnQkd5emR1L01NLzJrTHNHVHpQUXJ5TTB0UXZiTEd5d2ZyUGtLdFlSd004NTNFdisvNGNseTN1dXdtZXJkeVhTREtqeit6RzdHdnhmays0MmwyOVFaazNBZDRHSndlejBKaHk2dU94c0FFbDlXc2JXdE9ZdGgwUFZEWUNCS0orbXJoTTJNZWhHNTE4MFpvNlNjTmJsUEdjZWJiYTExNjQ2K1REcS91RU1rWE9JZTNFNVlDRzVON1lpTmJ4WGQ3MzljUS9vQzFlQzQvcURwNTVmSWp5aU1EdEpDdWJIMVA4SlYwV21TVkluOFYwRFdPY2pkYldycUxJNWFEWTFqYk1xaFpQNy9lMldJcGxubjdqNEJQcnJTZXdSMkxoa3gwMjBmNG1Zd1VneC9DYkxnVjY2RmN3eWpzRHlrdWEvbHVNZXNSWVl6dlAwN2lUc3hCSkp2d1VVQS9ZVmdRZFhxcHcvQ3RCZnU0Q3Y5ZmVmZVQvTHpCcFJ5UGZ1M011alpoUnMrSjFWZzBTc21sWmpZOGZZSEh5MzJ0YVlwMUdLMFpaWDdBeldpQm9TVXg0TjlRa1BPbEhrTjFOV3p2d2luQmdrMmdvUEN2MVZLNU41cDA1QnQxYUFFZzFPRGtJQitwakxXaURlQnMvMDU5NGI5ZE9aK3JnZzUvR3ZBNjJiMCtSOGN1UzhTQnZSeWlOa0Zqb2VsZjRGam1ORnUyYWZoVnBnWkEyQ2ZNek5LT29wck5TZVhxRkNjQjQwb28rQkpvZGFnU0p6Ym1Jb0dkMnNvdTY2ODlqSlRiWEY3MXIzUUI0SUZqSkxiMjN0N3AwWkY2S0xxSnh0VEdNRFRwY280UjZ5QmZ3TU96ZTJ0NGszdWI4TTRJS01PakVYdDdJZGxieDBNYjVxREFib2o0bVpMKzhjVHh4YTl4RjF1V3hidjNjUFBwSk5YR3UxTDY5VnNBdzY0WFZ3OWRiYnhFeXYwa1hUTTBXUFVoMmwrd3lJNVFIY1MyckgrajZYVnBDdmgrbVdCdWtTTTRMbEljWC80SUk1SHJWTnRHczgySHlDUjdOQUloOGpZUWwyMHJFNXN5OWMxQ0ZTbzNkdytaQmJsc0QrSGxmNXdNdTFCYXFWeDMxb2NySnR3OFlMNzJIbXFNYUR0WHg2NndoQm03Ymp3WjRESjVTcXh5S0Yza3BOVEM2aVpNWFVCUWtvRStKcFBnRXpYYkpjWjkzWVhaTlUxTlBQOUJoVzFMdkFzYkpYVTdDbXRHNVZ4L3B2c3BESzNucnZ5OWhSZ2RkYy9CQnRVazJBRlpHV1RzTkhMR0Y4SWpDYTVtRlNXa1F0SnJ2ZEpaSHVuSVFjdXc0Umt6dVF0bFVtRmZtc0J1QXI2aElwVDVaSm93dHJjajIvdmIvdG1hbHRJSkg3NXc2aDBvRUlWeG83RUJWRHcrLzFMdWtHbGkzcldESndKeDlVZk9mRENXMkdaWFEvWVlqNjBwRmpqRkNzSkRXSnRhc2ZzQWR5WnhMVm1VUmhSYTRGNXJseTJoWlVrNkdQUDZOai9JM2FrRGhSS0FBMUlxK1pjcHpuM3F5a1RrL3Z3Qlo4b3FpUUt1eXpoY1B2QXl6eitIckxlZDR2UnRUVE9zODNtVUwydzh2L3A0VjhTOWJVVkRYU0RmdS80eDhYNitDYU5WSXkzdXVGdmtRL3BEMWZGSmlvWERPay94b0pvTlhJWkVONGlFSFJ2OWFQY2dNWk9UN1pueTQvSXlhaUxJZTRoWG1iYytVbll2bHFmNGpBd2M2cXFOOHMxU2dMVDNyQmxKYkw3dmxiOGZvQXRFbSs4UkVlVHNIYXFyZmtDb1ZVWWN0RHhoUGxMYmZwK2VNNVpibmdWMHJwbCs5a3pacmJnK0REWmo4ckFrNnJKbUN5UHBxYXNVTDJGbzZVWUJBZWFBaE5IVytiVG5oWEkxS2x2SUpHRWpBOVZzTXNWbXEvWDlxTTJTdjJmUGUwRWEwUDhBaDdtd0VtNXBlbU5ER1hLU0Q5anJkY1A0ZlZpV1AzV1QySHFQM3ozZUVQWDF4R2grUVFWSWZTd0RoU2pnanBJcjIxbkZtcWVNaFF2azhNdWJWN0Fuam1SSWlNTVZwbEovMnk1SWtGblVPclphL0I0UzhpL0Y5Z05IWVNFMmVDL0dmazUwSGl1TWZOZ0tTdlpKS0Q5QTd3SHFOV3dtWStiVE5sdXk2MVNMSGRVS0JqejJ4V1Vqd1IvYnZXNFUvVGI1UzMwNW4wQXhSY1J0LzFnWmdzcVZobzZ3U1oyZ21aK01COHIzcm8xNGZRUEFqUlZzbVNPTUNUbEZucTVmclBrbGZFQzR0WFNWcm5pYnpRUHRPVnBTcjh1T1c0TXdTY0hEdTJCNE5yRDcyaEh2cnVpZFFIZlA0SkFNOGcwY1dHcURNekZXSlpuc3A3QlFmQmIrTmcwQ2dheGUvV3BiM0UvSGFCNWQzMGprUnNkeU9ySEdwWWFtVmN4SnFoTjBsbllRcG1udXFxcFZQWGpNc2VodktHZUpJQ04vNHllUStYY1JKYUx0R3h3Z3FueENqQlRRcUt1Z05VSytVckVqcUJZSUFuSzcva3ByeVBtekhxNUxSampzZ2ZadGhCK0MyV2xGVDhQdnJVa2p3ajFrVUVYK2VnTVdnVmo4bnk4Z0pyR09KV3ZyUkVHbzhkQlAvemFjVkt6bmNhQ3NZdjgzZldiR2pBT3FEVEUzQ3ZpM0JLak4vYlRXK0FxRWorbDJMSWpYMDRLMXc4UjRuU2xXMEx3RHVJYjlmaW9id1BEZEpGdSt2MTVzRHFSdEcwRmN5b1hqQ3Y0L3pYRE5aeVl1WVpsQjJEQkZZS3lCcW9mUjNQem83WjlQUU9NT2ZHbjA1aElNcHF2Q3J0OWpObXJIWHhBQlIwQTFZamdWNkRoUy9PbkJvMGZrREh1ZUxlR2pPUnNyUW5jK2tJZG1JYmd6ampIRjlsYmt5VWpxNHNpVWFyWUNuWU52dkdMYkRmRk1ZeUlPcUJNYmN1eEJvSStUc2RiNlJqa0hvRDVzWkovRXdKckViRWs1WnkrbDR0Z3BGalFjS0VqS0V3U0ovb01jejNDbEtMZGtDWjZnZGlLRWQ0cjN4QVBLVjNLZnROY1BjQkI0Z0F3a2F6cnFXdkVoZ0FGcGpNNVlHU05CV0dXUUQxVndIQ1RYVkJiYjcwcm42a1V5aEpENEtmNklQZm9RN1EyTk9jNW16dU53VGdDb01xWkp4OVBNOUVHcGdTUEY5MFBEWDZSOFl4NWUyRFVCb0xPakNXNU40cmpMOC90a2ZwM0ZWQ0JCQnlhdWdzQTNseFdhMHV2WmsySWJVWWIvTUVGdGFEbElZMTdvZTdOWlBweUJjV25aL3hwWCs2VFBub0hPRXdHcmdSVGVHc0N1S3MvZVdpVm1zRkZSd2x0WHU4SXhHcmVubTRxRmtLaEJqYlFrY254MlBUZDArQkF6VjZzS01kRWRCN0lDcVBLeU5iaS94M3ozazduT0dHc29xb01oaUcwMkFBemU1bzVSb0Y4UWZVamFaRk96ZEYwWklzUUE0c01IdkVoUmlWckE0N2gyY0o1V1pucGJtSDA2TGxzT1kvRmcrVU1ES0ZtTURDQ3BSTkk4d3RkajczNWtFUzBBbkRDVll5ZmRNeURQRTBVSWlxeHZzL25kdkt6ZFBza2tOd2k2WE1laGs2MWVsKy9ZRlM4TENaTWR0WkNUSlQvNWFkWTR6eE9PZ1phWE44Q0xNdkhuWVdoYW9vNThEYnl1TCtQU0ZBTUw1Nm5NbTl0Nmg0UUNYTjFsTXRyVkxheng3b3dyaWkySmVKUVI5UDdHaWlORnNDVGsrdTg1RU80N0dPd2xzMmNoQmRRaXVzekNoTmtjZXJ6RW1pUEhnQUM2OUkyNFhRcGdseGJ2dFhCZW45VHpVVWI3THc2b1BwWUx1bTJYcGtOWlczYStpUDFEUEVER3pSRFRyVndLaW5uV3FwYkpsdjJZMWZ4ZFV5WGcrZmVEeEt4Vm9JSXprNUFtL2h3ZnlUTlVybEVCUGNncWNCNzdXUkwrNlN0VVdqM20rRmt5VmxnUFo5QkZIRTBBNEd0cmtlVUlsM0t6VnJhQXdwVmxHb0psMlUvT0RqNVJIZUNKUnhzZmtjcm15UDZFY3BLQjVneDB1SWNRQU56NXF0cXB6ek9jVHRiUGE4SjJjTnRKVnFIbmFYbWZtMTE2WEc1aHpjalUxZGw0eVBVTVRickIvcDJZNXpHODVPRDB1cEFLckFrcitVanJ5Z1Y3WXVRUUQ0bUxTb1NXZVdFaGxodk5pcDI3ZURvSTVITW92eWtqL1hXeHVxV2E4U1F5RlJkYkJkeis4T2hidjNEMXk3Ty9SYkJRcEU4YXlRMFJnS040aUpYVFVmdFk1YUppaFN1N1VtTk1vVkxmemhFOFBzRDZlK3BmUWd6TGM5TnIwNGFhUXlmYitheHNhMWY2LzBXUzN3eWt0UVZHM1lpRGUwam9uYjBETU4zVnNYZEZjQ29GaGlsNVAyZEJ5eHZJL0ZBL3IzS3I2OVhwTmhvT2JIWWk0OTdqWFJvWVN1ZEJZTzBWUDhyQjRIb2tiS0NHR0hxOVQ5Zkk0VDdiNTU0emtkTFVUZjhsb21ubUNzUXlYT3F4Q3pVQ0JOT3VDb0lBNE1PRnMwZ2VlK0dhV09sQmNzUWwrcCtZN2x4NGtQa2kxUVB6NjVVMTFBTlhvR2Rsa2l3SGgwUEhHUEhQZXhSRWhlNlp2TzRQTkJGQkFqZW5HL3NBcFhKbVhYSmIyNHZoWkd1V2QyRTdVU0IwODk1Yk4yZlNsVzQxSkdNYTEvS2lWMGpNUmVuK0xhRnNrTElrNFhNczJibEc1ZXBQVkhobXVsWi9zVER4SUZuYjFlQUoyNTBmKy9zVWtiNndyWDh5MGxWOTAwV3Z6SEZJTlRqeGIwN3ZPZVppdlFmQWdUM2djZGJOaTA3ZFNDNjl0aW1TYWlMTm5GZWZacWZqUE9CdUVBWE5qU3pHaGtwaEV4UDMrVWtjbWE0eEx3UHFvVi9IMVZtUlR0eXl3SDZzNjkrVmtybllQYUtqMXNMQWhIbmhtb3duRnF4ZGZhLzV1MmxERkNEMno4WFgwdFY0NmhZeDBSMndBZUdrTVV6QVpLclRhaGloSkVsT2dSYVY4Rm4weEgyZWlGT3locGFSYUtMMDExVE9LNXZuaEFyY0txM2lZaVZLREwrai9lbmYxcEdma3U0N01hODhHUUF2Mk5KQlc3SytTWlAzNkYvLzJRQUJBQm9BUUFBQk9RQkFBQThCQnprQ0FBQUFBQUVZQWNCQUFBSUFDUUlCQVFvQ0FBTUFHVlJvYVhNZ2FYTWdiMllnUm1sdVoyVnlJQ2czS1E9PTwvQkRCPgogICAgPC9CSVI+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IExpdHRsZUZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw+CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk+CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU+CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT42ODwvU2NvcmU+CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8+CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBVWZwQUFFQkFRQUJSOWtINWd3Y0RCNFFBZ1FBQUFBQUFBRTdBRUFBRHdJQVFBSUFRQUlLQUFFQjlBSDBBZlFCOUFnRkhRRURBYmtBQVVkbkFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCdVFBQUFRTUFBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUVEQUFBQnVRQUFBQUFBQUFBQUFBQUJBd0FBQWJrQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBRkdid0FCLzVQZkczQVVONHo5RTlsc0hEbXZXMGJGemNhbmVoV3dQVUp6aDNSeExodVBBejJsckpVRnRZeHNmNnlmOHJtT2RSOWFsSTVieXY0aDFaYTlnSUNBOHBneWJJdlJsUTdjS0VGcTZkbDNVWndhdkxKZWdQRVE1VmdHeDJZQ1I0SlhhSE9vUXRVWDYrdUEvQWhBeUtMVEljblovMjZ3OC9oMjFYZHhQT3dNSmNWaGJYOTlEQlVyM1pBWnl2emZ4MVFBT2VlbmVUUE9BOFBURXFxZjFQbU9GMkpuRi91QW9WMEs4QnBUQUxhUmVQOGhJS0g2MWJvMElrWGxZeHZnenViUVV1NWtwSnhnMTgrVUVpb0laZGRBK21nQkh5U2c2T1VwanVPTkdKQ0c3M3hlcmdjUWt1STdNREorL2Q4NzZwSGpzb0RFNGp4SW9zT0cxKytaNDJ3NVdaeHhtZWQ1ZmgzUHoxT1dDRDdtU3JMWko3VzVpeTRLajVjVWdGUmw0bEVBend3QnV3S1NQWSszOGk3K2xjaU1hOU9jRFl3cHFlU3lkQ1VZZ0FQOFpaOFp0OHlBQXh1MncyYXlnWjgxeXFKRzRKaTk0TmxZWGp3ektRRktTaWxuK3FjOFB5ak5xS2o0SWFnQ2xPMGFWdU9MeEdCQTNPQlg2a3VCLzRmSUlrNmhNYzNXUmNlb1ZFNUpIMlZSYmJERzNCYTFkaVQreWNOYmZ5VkRaaE04RG43QUpmZmVzSk41WkVHL1BRRTVURTlkY29oRkw2RVBZZTVwYTlkeENWdTlVZFBxOWNPQjFSVTJRSEFJeGtibmcwOHR2em1MT1BQcFhGUFZycXVBZ2ZjM0JaaTk1VmgveVZPMUlKMlZPVkVWVGVabmhnZlI0NFBHNkxINWZyekdFVzFOcS9ZTFhRWEw5UEJqR2kvb2Z6Q1RCUUZLVGNsMjFXeUE4cnhib0g3N1ovRWFJR1hiZmVzR0VmUjJFTEtDVjZkRDlTbUFPZUFZd0FScnNwSGpneS9DWU1vUTZqWXZoaVNxQkVVb0dCci9HR1RhU3BLMmR3YUllb1FMUk8rRFJzZVpvSE9lNkdCMThmODRSSE5OR0tWQnpDck0wV2xwZzFWNTdkS2FaMkNqV0ttbGE4bVhDYlhOWUVnTkUwRmlQakZnTmM4UGg2UUkrbU1JVkRmSUI1YnA1ZTNqZDdNS0VNNFp4SGp0V2U0aThscEZVSklITVp4dzRUd3Bpd0RIc0tMZUloL1NiMkdCbVdqV2N6eVdFMVZtYnNxNEorWGpMcVNFR1JkTWd6NTBqUDhwMTF0T0NRWWpBeFRSTC81U0dXTG5TZ0piV2FVSHJYOWR6T1lWY1BOTGZTZ1UxUldJK2JpanZESmxNU21Dd0JCWTJWNVNvUXNLZVRkN1FGbnA1ak1sWjZ0OWU3U0ZYNDI0MFAxNEdiZ1pSNjJlaGVpclphaEVpQVdqay9jaUM4Q3Z6alVJYTZiNStuZmp2em0xQndiVFM5cFRlTTVVd25HamNhOXAyZ0pvUVJuQ1pRY0loWFN4b1o2aiszemdRZnIrZmVGdzZkYmRZUUZYV1EyZElDcCt4N3V4UlY5Mk9rOVRUcU5Rc2h1QXhHSWNNeEtVbXViTGEyODBqTXdkRGtkaStYTDN5QjVLUmZDQjB3YkZCRm9BUWlsMlV1cEVkY2k3YjlQSDhoNFZtc0VCRmNJeHV3bnREM2MrRDAvbWFhYmdkOThUQ05qUHVnbjQ2aVFSdEJjMTlrbnJsQ000VlB6bmw4NkEvUWg0dzlZS0VCanZYS3JQTkp5ODRwRDhOeWxob21jUGFDdGd4WTJPeFo3M3lDbGdMckgrSTk4MWRMTkkxSk5UM3pDbys4QnlYeU9OUmxROU5hRnpiMEV6MlBpUFNCMi9vN2FoQk1QdUxMWTUwS2dWdG5YR0xRN2RXUVI4ZG1MaE0rS2tEUVBLdE5tNGdOd2FPVHFWOTBXOEFJTzdabGlSaDF3bTVZK09WbDR2SDQ0M0ZaYmJyckNyWlEzVGdYWDdIUnVtTGdJbnE0QVVYcmtnTWdYd3h0QnZmMldHNXMzSHE3R1R5bUtobnNXSmlMRHk5NFBWYXZzYWo2QTFQd01xQmNYczJsZGVYOFRTM25XOHJrbDV4TXVvR3RXbmppeUtOQVB5K1RrUFhBT1pBUEM3ZS9yQUUwbFRDOHo1dlZIQU5lZWZFcitSRWd2OGpka1FHdWs0cncrREs2c1VNL2lRbDh1bmtubDUrbHIrQzdVeXV4NFJ2a2VwM1lFOHBJY2lVeE1vb3pzTFJzd01UUitMOE5zU0x0cHJBVzZ4T0ZlaDhyVVdneXFiaFQ1UE5QcUR6YTB3TVJuaGJRdHU0bTNqbHJPTnhOMmp5ZEY5VjQya2ExUXZjaFRPRDRUUXVxY2d4Uko0My8ybE1Td0xQbzFPZ1JkZEZXNndXajgyalBtVUFOMzBleDlDaThBUHNRY0RmMjBSQU1OVWNQaFI4VFpHMHdrMzNJMGgvd3l2Wko2ZXphU2JtOWtRWUFwYi9NbFdLeHVGT3hDTTJpUEtYMHVSdXpWeWc1TjZFcHJ2Z3laN2JCNjIxZDZqZk5YVGNvaU8yc28yZEVmMVQ2UHlBSURuNUhRQ1lUTGZyQkdOSTB6c1FoNXZ5aVl4SkxMWlQ3cHZUcGswOG5xdG5CY1M3eEt5aXpFdG9LSFYweHZETGl6eERtVWgxcGJhb29mOVBQWlhPMnRQemlodDZRTzhyV3dtUzBJTTgySFRDR2k2b0d1bDVWeXlMSGxSQ0IzRENWdXA5dGpiQkJjR1pJRGxjUXVjeVVTdHZtWTlTOWJOdG5KQk5UVnlmcW1ScG9yamVrZU5IbjdIVjk5MVdOMDBSVVVDQTZ2ZDgwL3hpYytKZUJXNDZKcHhuZkFFcks3amZ6Z0hmemlxOW96WC9GQkhIYzZ3TEo1WUJDKzFzSVFNUU15Ukt0T2M2M01SS1cwajRDdTVwSHN3cXdFdEg1V1BOVXhHaUtNT0R5ejFOVytRQzArcjN4Qy9QR0NSVW9YSzJ0dng1NTltbDlua2VLWDRjNTlRdmxwS3lOSUVzTlF2U0E1TW5ZU0pHUVU2NC91bE03WFRJdTZKRXF3b1p0N0N6UWR1a21pNzJKK3NzSHdVS1Jnd2d1eGlpcmRveTlmM1RBREhjRld6MnB6ejU1bnlNNzVsQ2NVcVU1dmk1RW1QOXRTVXBGZjgzYW5qM2tjTWREYzN0MTM5Wjdpdkc3U0dqbjVGZlpVencxUk9TbE9lR3ZRNncwbURaczcxcDFXRlZTaFFHUmxpSGgvTHd3bjIxOFhTeXM4a0NvUHlwcVpzNjlSUVNYUlRYSVQwa0dmd2tMazdyWEo1VDhWY25pRGxpVUh0YUZ4eUQ1RFU2c2xUd2VVdWs4NUc3aXR3MSthd1JvdCtqMldqc3ZZRDNRd2RXZHE4QmxKd0c5cVNxWGdKOG9CNm14WGpXS2dKS1dQdDBiMHNjZ3Rid2hud0ova09hWlF6SlV5YUVBaGVhYWVERzM3SGtpSHlqT3VBRWxPWlNXaHhmVWNMdUEvSCt3d3VPeHptcmo5djFGVzFYNXZqOElTZTUvSmlzWEw3aWdYelhIVjF4Rm9NTGVlMWFtYjJ5NHBQaGtuSUprZVQwSkhyNmVlZWFnMzJzdVRiSUVqR1RYRWc3eVJUZ05Xa1hsZWg3SkY2NVQ5RTNmd005TTZ5aDRiUExIRm1JVjRDa1BMU3hIWG9NbXVzeVlGTnMxemxzQ09ERHMxMWtjMnVjbkxSL3hBSGorc1dFVEFLVi9kZ25PdDFqZVhNWERoLzdab2RPeVNDTXBXVnBhM2dZbDc0clMxelBIQ3laTWtMa0FkTXhJQ252R3k1ZmxBcFV5MmVWc3lJYjgvdnEydTd1RnU3dy9KbDdyd21LbERLTlN0YmdDdmlFamFMeFZJR2JOdmhwMGJtSGlTS08xWGJ3eDVodEdmdSt0Tmg0NkZITXR4b1gxOTVLbHIxd3ExUEYxdHFTS2ppVS8ydm1kZEpzd3pST2s4YlpwN3R2bVBiYVBIZTR5ejVnZ2hURWY3WXp5eWZxcHptbDBkZnlxS3RXSHYzOFMraUtNRkladHNNWG1RdkJEaXVJYjFXdS9YRjBUd3JNemVZSmR1NDR5TnBpdGh4NXRMV0lZSDM2ajIzcVRkQmo3ajJtQ2N3TVZsS1B6L2FTanVmMmd6T0ZUeE01YU1odm01ckNzbENPdFNicU9ndlc5cERZZExreXNSZEdLNWplZDYveEFuWnRKd0R4T3Z3ZVZ2bVhWTFZYQSsrUGZnWVZnUEVDdzJWaGNTTGptNnBnSWI1OTRYTTZFYUpXbmJoSFFBd3pCMlFYbTRzbkI5S0hKa3VmRUhOM3RqTFZwOWEwSGpVa3RQZ0l2bE9xYXI2OGNRWDBZK01IN1R6VU9WcTRuelo0cFp3bmg1TlZKU3U1VE9pZWhZS0l6eG1MTk50TnNYMWhOUkMzUndTVndpSzhxek0zaGxRNkk4TC9CNFpsM2tjbVJ5Qm45NVRINkY5aUpsTkIzS1cxclNCRlJDT0owaDZHcjhKYjlTejkxckRSTThjNFRGYlF5M0psSHM2U094OTI4c1JLM2ptRFZzMXRvSDR3L1BOciszRGJ0bzZKK2ZwQzI5UC9ienlEWlh4d2Npem9zMmNyaTRkRzB2aG1uTWV0djNCOERDZmZ5RHkxbHFuUURVZlpxanNUTkZxcDJHRFZmT1VEbXhRajBVUFJZRkxmekZ1TmEyZWZiRHorcGFvVW9nNzdydCs1WUh0ekE1d2tQR0VaTks0dTI1TEZnM0lWTWNpRm1PSlowd3ZjVE8yTUtLS1d0dGdmNDNtTzVaeDBXVnRaM0VyTC9WQzdRMHJGdy9rbGNSNnl4QVZWbHNkR01OOUxsT2hEQ2FERCtmcnVycTZ5eVNqN1BhcVZ3ZGdsbnp5RUZZUEZsR0I0bjRkTVgyZUgyWi9SUVdVWW9vTmxucUVGNHRpL080dzRIdHRWeXBXVEVEVmdSaVM1SDl0Y1ZkcDMyOXlpYVdkM2JCRXkvdTR6WEd1czBmaG5PTXZSSTJtVGx0TDJlM1daUXBNbzZSeGJsTVBiSEZZNFZoS2xvLytSMGhHUzJsU2txeFNSSUtsaTBVbkUvMG53WmdManlTc0NDK0ZUYWkwY25FNDExY25aK01HVVpuYlQ2REwvTlA1Q2JKbm5BRWlTYjFDbzl0RGg3MnZ2YXIvYXlFb2tMWFQ3Q09kUFVnZHVFY2hWRk1JTUxSblhzaVgyV3gyaExVWmdPVWQ4bWY2SGhPakZOeXJ3dUZEQ3JJNC9WOXYyNGJBRlpobUxpSlRuNURpMVhoRmkyemt0RnM3cXR4ZTJNbjN1MjRlVmlBc3M2S0djc1dka3hsd2Vkb2pWcFhlTjN4anV0WnBpSTAzdmFzTStVSzJvUUxNa3RKNFBKZ2VPc2FxT2xhOVBTakhjWkpuRkNOVWpFb3JlZFMwNTVHT3R1bm9EUU42bVhuV1ppcHp0NXBKb243bTU1eWVTekxuOVoyQTl6UnR6UERENUdMaGZnZVMvR2Y0Z0NldHI3OXdQY3FlWVlNRlJURkJiVDA3WUNFRDl6L3VTWjR5dG4raUpjY2ZBWXJJQVB1anpYS0RUTmxYSFlzUUZMS09scTlDS0oyZlFrMXhVcjQ3ZXFseEhlSEFFU3RueXUxOW5ybVVTZDhpQTYyU1BZVE53dXBKUCtjVzJPczYreWRLMVlxeUJ2VkRUR1E0SklidGNUM2JIZVB1VmtYai9Dc0xVVXgrMzFUTzNxaWs3d2F5K2hwbkRPZmVqUFM2RGE0cUI2OHJrNzM3NWRrcjUrbklwdE9LVHhVc2svMG83ZlNrMzlaTklBRVJnMTVWbkxoN1NhMGtLcEZ4TGx2WEtaVTFvWDZTd29mTmxnK1A4SEJDQ09nYU1DWDFQbjBKblYwLzZtWlpzZ1prazc5a0JVamdVUG40bnQ5MzdKbFRkeEVYc0dNUnk5VlBFdjFFUHJ5QWRSYnJEbmY5MUg1OE1ZQWtKSUpTNjBibEJDb2FxTThQRWNtTjVMQ1hWK3pGWDVVcFJxdzdianFEWG9YT0hqNUc5WTFyRDRIUWl3Mlg5ckNkK2wwbzBvTzhtOGU1b2xqQ1d1WTM5TlArWXMrTExlejhTV0xJdFhsYzArTk5rNngyME5jZzk4VWxFM00rQ3RQQXk1OUV6bk1YWkNnOHpWKzRlWno1Q3hwaWlVMVJRRnN0OG1ialpscnJEbExjWTNxVjlKa3lWenZNV1N6eGZ5SFNmTEVhS2pzRmM3a0dORWppWk9Lcy96MVV4Y0hQN3Rodm0vZUQwT040UlB2QnpnNGhRR05VT3huYUZjRjUvSkVLUXJiNUxFcFpGaHZnNlBxRXRMUTFCOGc5eHNDc1d3UWc5d1ROYWFBbXBKZnM3RGFpajIrSjNKSi80TVJWNlR5UFlVUjVYT0dPeFV3UHhiUHJnb254QmZBMDlWd200ZHh1Qkk1OHVhNk5OUkxkNmxabThSSnY4ekpRZkZCdExGZ3ZmaXg0MzVIUE1XdmYzU016VnNyeEMyNW5hVjEyc0hxNmx5UVpBNTlTd255SDB3RGtQWXdOM3dLM2lDQmVSVzhSYjFDNTJQb1ZObElROStGWmI5Z0RLVmx6aFN1RkU3NU9DRVV5VmRPTGg2bkE3S3QyTXlIQ2Z5UFU1Q2xHblFRMVBJQW00VHBTczBaR29YU0RlQkxtd1FrZitOeDcxNEJYY29rRUZXZ3ZoVTZEN05VSzdwR2FrT3pncTZyck80VFN0dVJUbDIydDJwQnUvMmxpUmMwRkNQODk0MDVRTWtMR1hYMjNEVzN6eVplak90bVJiVnh1Nmo0ZmZlZ0xhcVhINXFLT2xacUt4SXNCZm50RU5GRkwxazRuQjdjdU1taE1UUXNtMWpsZy9RdUZtby9YQW52RjV6dUlINkhURUpjUnlBNXBZN2pDREVhWHU1WU9zejE5Qm1hUVVpRDFmVm01eWdRWTA2dnQ3d0dQV2VDUyt1Rll4cnVJeTNJYXpNSURWY2NJdzk0V2t6eDlUS0IvbUtQc0xtaGxhend5NVhXMExjVU1FT20ydks0SXlCN2N6TUNQOGtVM1JVSEExbGtibFBGV2tpOXVkUWRaYnljVGZvMGFoZHFYQjUwYzdES01TZU9ZRWFOMXNrdlJScW1DT1dQemRmam9BUlF1UHZoVlhYVXFHVCs5dFNBT05QTlVXNE9MWW9Vd1hKdlJWanI2YXlLUEkvbU4yZ0hPNGlRRFdkLzlsSkhDRVRLLzhXd1g2ZzJIOS9PZnBDU2tJVWl1cndsTTlsNmFqOUZ1OTN5d0thVm1RM2Z0NUxJVjB1Z0hiZ1RwMWEwVU5iOTRtakNWUFl6UmRPcGhGbE1uakdJSmIzM0xMcGloTDhVQlgxbUx5OTZBbW96RzRSZVpsMlhrZUdXVStVbmxkVzhMRm8vWmptUjhQNzFucWVHK0xrQmcwd08wMllNdjh2K0NiOVhZWXh0U1NhRmNqKzYwYUpwN25xSGJ0dTliNmFlV3NoL3JCQzhpWllmdEhSMUVzb3JjK05KV2tsRlRwTUZJc2JGMm5iMkZoVDdOTFppTEhQOUVZZ0V5Vk1Eby94dkhzVkt2TkdhZU1Ec043OXdza0hkZTBlL2lzeUlPQjFiUTJMVG1XMHZnalFTMHpKN0czRWVjSWlYUkFRZTJzWWtpM0VjNGdrNit1OU9MdCtTTzM4WEphRzltNTFnMlNEMWNGakZKSUltWjQra01OTzRMc200QlN5QlJLSy9jK0Z6S29mb3dNeGNNQzc0aXdyaEdJSkRRbW16RWx6bXo3T3VvdEo2S3JUeWhFWk8reG9wRGFUZ1I2c1VkQVltN0ZscmZPRFlSZ0dtdkRDOWtNcE90N29SbzloamlxU05kUHFaa0NoQmRiOS82VmtGK2FvdFlEZ2I0b2ZHRW1WVTVMdnVXVkdYaHNDOXlPejBuRVBFQmtIYWZPNERwei80YkZsM2VSR1hzRmJaSXRyUks0NkRnUUkwb2ZOZm83ZjNCeG1hcEsxdmdsQSt2ZlhlV1FBL1VkRGJvcVR0U0hmTlkvTE9panU3RGRna3pSU1Qxc2dXdE5xelc2Sys3SUtLZkxwNzFFMUpYUDh6VWw4VHQxN2JYVmEvOGJLbU9xcTdYLzRFeXBaVm5CbVNSNm5tbkM3SzU5TVNma0ZIK3k1eUpJRzRTYjAxdnpmbjJKMU9mdWVud3F5VjVKK2JOcU1IWHlLWTRObU9MSFhOc0pqRHFzLzhxZXRwQXZpdk0xVCtMdms2VjV4Q0M0SVc2Zk93UnA1MC84QUwrT1F2R3ZJdHJQSEQ2SnZvZGVRNStjaTBHdHRTblAxTnRCYko2a2Rhb2RSZmZWVEE1UDgzZmgzQ3U2MkZuMDhLQkFmc1lpaTM5WDl4QitXdGsvTzNVZmtPcE5aTjRjdXhQbitmNlhOcnBYQVNDZDlRM2lwWWFwSHBzekNWVUhSaWtkTGQ1QWNNdHRyaXJiWEFubzMxbk5rK25ReHpJRld0MlFKbkExc3VSOWpreFo3eHV1TXlTZFEyNHEwV3ZXZFpHS2NZanhQRTcxd0NjcGt1VjVJTE50S2RWRWdXaVAreCszM1lKVVczQjFsc0VncFBEQXZjZklObzcrMVJOcGk5TjBXRG9nR0lLOTlFOUt0UmdDOE9ReWFXdDVBS2xBODJzVFByNXl1R25wV1FaQm81T3FVblhlbVJmSXNqQzFUSmx0ZkVxVTcvVXhaUnNYMU5EVWFNZDRaMDJNZHI5WXEzd3d6NzNWbzJlNWp2bmNnY09aa3NrQ3NLLzV4VWpBcmRSa2xXL09idXgxRVBpQXU5Wi95Y25paFVQWnN1SGU1WlJTYVZlNUNVZTlaVk5JTldiZ3VXRUNGeFlCcHFyMjhOdGhDQjFYMVROMDlUS1M2c2ExOHhSSkVFZXdjam1lQWl0SGlBdUZyZUEwak1jdHFtSUc4YzRrdlhNWlFJc2NUcWliUitpc2JVQ01SdGRFMmpDZiszZ01MdUFnV1ZVY1dVOFV3U0pDV2VFcGNzT2xRS2tNcDBrdzMxYkJOWHEwUE9RY2lEQ1VTWS9aakMvbklQRmcrcGw3REFYUk9lektxTVYvUWRLdzVWTjRPajJ4V2xRV2NtTHVLeUFEVUh1bHhSem01SVFZQzZuVnczRDIvR3djbFRJVjgrSlExSVBWQjJmTnphdExrREgvTzlRRGlQSmhBYXg3YzNibHhzcG5TdldUTWowUnByOTVsVzhValZzODEyc1FBLy9YcFpqUGVXZWRZSlRIcUZ1Z3FzT1l5WXJJY0dBaWs0VU0wNGtGQWttRWFMQ1ZFWHl4TzVxRldXN3pIRmYyeXhHa3RsM3lFOS9PV3ZGdU9RSnI4UlFqWE92bHN4ejVDTDJuOUFUWUpkZlFjejlLdjlNazR4dm9vNFJrUEtQV3dIeHVVb0pEK2JVamk1VGM3a0FwczIyQ1ZuWEtEamxQZ3dBV2swbXFLUmxsTEhkalp3QU1lTlpYOW8yZnAydTFlWCs0V053aTVyUXZQajR3cGF0aXRFOExBb1BMb09POEt1Y3pqMnlsb2dDMlVqS3ZmcGx5U2lGbnVsKzZmam1IRGhlVWpic2ZDL3lTam1CQkpVNVM5ME5vU0pZdzZUQ2ZBZUxXU1ZjZnhLeU9nMmVOUGI1RlJOVUp2UTR2MEgraTdmdEc4S0xZaG55akU4cWd5aGpqcmVCMnR3Wnc0aHB5ZTNIbVp5OHBzNUlrT00wV01qS2NpamdnNjZFMTgrWE9wdjd0U2crcDFsTi94RG9qYmtia0JPaVg4OGVMQjZFUjRoMWZkNXVlWElQQWFCWDRPNlEzQ3drM1BSMlBBU1F1d2p1ZGNaUkdaS2k0cDNnQ2F6dHNVZnpqLzdKREpFbGhWR0NRTlVZbm1aQXVDNnUxTEpqRmRGL0ljRmpxcXJRK2h1cFVwUW9FamQrczRKU3ByNE1sTnoyMTlad0gwVE0yN2RzN2xCcjVMejR4V3I1aXc3aGNReFJDMnNkZFRjZStCSC9ia2svTEtWRUNuSkhKcVlzc2FoRnJ2emM2L2FRNS92NG9YOG8ybmxuNCtpRG1tQXYrOXRDellIc1FwUkhaVTg3N1JFK0hzQU9RbGlLWnFDVHJyTENkRjArN3NhRVVlcE5ubTdFajRCM2lOQ1g4OWNOL1BUZGcwS3dPQzBjQWtndTFubU5jY0xhRUxJbFRtRzJFVW0xdmtjUDVubk1iVGlYdHM1eVhNWTFHRWJiaHJZR3VPYzBFM1dIeENMMFQ5NlVSM2MyZ0xNRG80Y3Y3Q2t1MW4xdFNPNEQ3dWV3aHhZTjZuUVRieFUzNXNqVjNKU0NqODgvck9ZMXRBYi9mNnRMR2NyS2hBRXBBeE5PVlZyYkNBQ3krakhXUG54OGNkVUgzd2trdFJOYkJNYzNJK3MvVG4rRFVSVkQyYm1uelcrT29WZE9kdzlTUFE4dGx3Y2JFMkE1bDFqVndjL1NDbGduY1hYTGhCNS82cnh1ZTAyb2cvYlZ0YWdzeGt4QURnOHdYcEJReEVadjMreGN3dmw0L3lMSGtmN1VhNlpDYlRaQS9aRzN2V094VlpFcElDZzd6SkZIdjR6bHV1RmlXZXNNdDRmVHFwZDhtTzhWaXVPU0pqcVRNOThOaVpXT3pKY0dSNTAxc0dxTllqQnZuS0pOemt0bzdDTURJWDVOeDFoVGJJZDl6UVNuTDZlZDlGY096WnZyZXZMNlBGMkZ3UHJWeGZnTWpETjM1MjNZWlBOT2VpNlppalcvL1JqeC9zWFVOZ0I1OTh1Z3BwY0ozVVVQQnZReVZRUGxHYmJXQVp5OFh2eDNubndDM2RBbXMrazJSMTVGNWs1UmprTWFwRHNNSXZhaHRwZGRLRDBoL3lvZGg3V3RlOWQ4N0RsTHYxZjdGMmI2MTVOMnA2d0VzUjB1ME5NdTVKR2t6NUdoRGU2M0lOVVB3M1V6dU9xcjNqY245c3NmMG5qbUQya3BNb2FlMUdVaHc5ZktZNk4vWVQ5MzY0OWROaTNodVZXTllwK3hGbW5weXdIbmZPWnptRzBuVkF1U2Y5MTV5VHY2bGt1WG02OFB3aGVlOUN0REhOLzRUaWZTQVhtQmRxMXdzYjdYcXIzNmVYL1J5bXlQS0tXMlpNVmJPTUs2TkFVZ3lLVTFzRHhLL0xTMDU5SjFQcENRcy91SFZiZEkvMDBreXRXcDc1Ny9kcGhDVGlQenRCcFNlbWkrT1lBQmdtT1NUVTg5TTR3b2EwYzM5b2NhZUdEV3pGd3dPeTlMb0xTR2QxZDhGRnJVRU5rOEYya3ZqMExUQnltbXlCSk5YMUZBYjJJMmowQVlxVWtKem9BNnFvMVhkajVWdURRb1J4b21PeWJpYThLdjNmakk4RDlyb3Z0WG9jMkJqRm1FWTZvN0dreVZPek5md0llVTdhRDZvbWhzSk03ZXhsaTdtdERkU3ZuY3FQdHFqZUNPZC9rSWhhcWVFVnIxQk9taWQ4d2lRVmh4UmV4SmdQMmFrQWtNSm0yMXRnTk0vSzJyREpDVWR1R0FqN016Nkx4QTNlTjU1NVJrWFlmRGtVY1JQdDlQMTNJK2ZRMmkyTXFlQ0p5SXFvVVlrVm43S3FEOWNKdlZ0WWtZRHh2MEk2cVhVV1dhd0VPUjErMWg5cmlmdmVSQlkvb3JNS2xvQTVFWVhXN0hHYm5raTJualh4a2YydTdmTXpPVU11NGR6Nm8vckNZS09GVDgzVDU1bWxlQjFaS08zSFlhK1Z3d2x2TldaTUdRdThtOHJyMEF5bjc4eGh0Q1IxWXR0UUNxdy9OU2o1ZHM4ZjJrang0MForVDNzZ2trU2N2UEt2Vml4MkFWVm0wbEJlbWh1SnNpQUZyYjYxVVF1UE9OWHlHa0ZWUFVWbFB2dmF0WE1YbVBIR3l4Tkd1NldZd0NBM2pMRWFPMTBiT2lpd2Z4aXZscDRDZEVOUy81RXEvSXN3UkpKRlFjZGltMlJKbzh0OUZyMHRaZXRwcEJYNHVEWXh3UGJGK3V0RXV5QUxHd2VYRXR0M0VmY2dUSHN1OTNuOUdQVEs4TitGaHh0TWM0Y1ptbGhSMW5NMi9sMUFoR1A0Q0FnSURtOVdidlFKdjBWK0Y2NDZZVnJlb3ZFdVR6Mlp6bDFqOFcwbGZHTVlUUW5BWTBpS25semVKUXp0cWJHMXpyTjExcGpVNEtzK080c2tTMEx5UmNTTCtWSWxPcmkyeGxvNjFOTzMraHZNdjVxeVhiSm1WdCtIKyt6SXJpUnRaamhRSVNhTlZ1Y3ZVMHo5S3dZK21MYmNGQ0dxc1J1NVdRWFdyTkZHdlA1L3MyR2x5bEdVc3o5TGM1d3RiUW9aLzJOUHYxbWpLa3p0d050dVVZemV5ZzFScHdVcERSU1hTS0xVZTlxamFsZzlta01xeWVnT1lUeVdPSXFkVFhINkdPOXlrYjI2ZFhMd2UyYWZrUWora01hSGMzVjJRZlBreFJJaEhZTlc5MllrZ1ZHNmoxa0wvektYWGVTalRXVGFhT0tRaG1aY3BTSDFOZzZaK0tscnNMNTRQRmlkVlprUEVBa0JvRUxEdGNyNWRNVFUybnZSb1JLRnBsUmpPYzZyV2x2SUtMV0NMbWxOaHRFMzZmYnpJZFBpb0xjRlo2ajYzdjN1UXd0ZnQxODQ5djJNUU9KT3l0aGtZVTZROE1IYTIxUzgxNTJSYWIzanZhcUZibG90aUpMU3lrSXNYQVRyUVJPeWtUTjRGS1FKb0crczJDeTZuWlBjNnRWT2FIckREY08wcXRGN005YzFwNTFETGRRbjUxWW5Yc1BvR1JOU3ZMWnkxaWhtdnp3U29SU1A0MHlmR1Qxd1plYUR1VnFlK2l3RmdTSldTNnhDNk9rK1hCMjdwazhIcEw3dzNKWUxhaHJwQjhzd0tEc2ppN2pjNDBsSTJhZEZZaG41SUpCZU5CcFZWUHQ0UFQzV1plUjF2a3hMY1U1NVNiMmpIMWU5cENhTjVETkN4dDBaWEdlaGg0R216ZUxHbEdubVpHa2c5MzEvemhjWlBPV3BqWGhLTUdDL1pLcWc3K3o2Y3AxZGwvV3Vpa0QxTVFITGlBU1JsWHVPUFRsTUd2Rjl1cm1pMG5EaTArc0hBUC8wUHJrTk5aU1N1bjZTQThBREpzYXM3VjVkcWNFU1NYYmJWTXZmOHJ2UTNlNnRDN1VoZC8zVmhCNVV2SW5tK1Y4SzFhTEg0dGh3WVpFekJrakVSeC9SSmhCVDRSYjdUbFJ6RmhUSDh0cmN4T2dPK3RMTU80eFhxa0hFbDBTTE8wN3AyRy96cG9XbTVPc1dNdllwV2xuMks2cHdOT3pmOWdYZDFXL0U5d1k0amh3a0dSajhoKzJSdHh5aEtSMDJqK2tweHo2VTRkdHNnMysrTng0Q0w0UncyT3dDMlBtVGM5YjZmVmY4eW1nVFhOWEJHZi9LNVhHVFdYQ3NjZW1odDFaUTAzaGttTVJFNjl6U0xZOWVwTlE4YzBSZnREVHNtMW8wTStIZjhLaS9wMENBWS9CMUtKM0pZcnJkc1lyanlsdGM3bmxhL3U5cXNwZjhXU0E4TzAycjRmV2lxUXg0eVNqVjRJTzB6YUhmMHVqZ0E5NlZ5Wk1WRjUybGNGVU9IcFVmREthQVVkcE1ZaUN1bm9mcGxxR1JqR1JnTHphcTBVempwSFRhTjljZXE2OVVxeU5DTU5Wa0xwUDRBY1o5K1NvNDAvUHZHWnQ5eHp2Z2o0L0U0bFNxNWNvUTZGWEd5QU9scXJ2R1N4dWJDalNGUHRPZy9qREVDR2FOajFackltczhuU3J4NzNqMmZ5VEwvOVJ5QUNDTVpXQklNanVjd0VUeWJYaXZLUm0ySUFFTkh6dGlWenFiN09MSnBlQzlsaHpPL28wMWQ3c0lrRVJYZThPaVR3QmZTZjZNc0FyMzcwd0JvaUVybVltMWZJY0Y0UDJmRnF6dFpyc3BUckN3OGIvbjNVUWZnUFM0N28wc2twcjNNM2tMSTV0VkhjZXZpK3plWGl0bjRjaUFrU1ViMjNrOEFqMllBMnNYb3lmZk5QZndrMVYyeHA5VEsva1ZRbTg4TjV4U2VDdnkxVmtZNFoySUtzS29WeFZTYlMxWUs4ZUFlT1k2WUZVdTY2Rmxua0lRU2Y1eWNkRW9kSjlBZHpkWWQyTVBnL256TTFFZm1FTlg0MjdhSzgwT0pMT0l3QllJWG9QWTBGUWZpbkJya2pvblY2aU5MSVZzYmVrU29NbllzS1YrSVM2S1lhaXptYmg3azhOTnhLTEJ5ODdzQ0NES1p3Z0lEbjhoNW4xQUlnamUvbkNTSjNlZm4wYmhYWXo5Wmp2bkRWdHQ3akh1bFhFSytoVnVSZVdaZmh6TmgwM3oxVm5LMGt6TDgvSktVSnd5MC90ZmFXQjVFSnZZQy9mODFSQ0hnNVU4Y2JwVWlURjdhSDlrMjZ2NGFWK0htNUcxMUZ6TzhZMVhtTXhmYy9aRnlab1RLZmlWZEZCU3lkZUtpSE81OHlDZnVWWXArc2RPc0FTUjlpdUF6ckVTd2dnRlZlL0I0Y3h0N3pmelhjYVlkWXRhN01qLzhyNlppcjVGRXJ0ZTdGZVBncXJUam1ZU1N3QmUxeWFzSEcxdFdoM3dNQkJsMzlQR2RiYXZ1ZXBhYnF1NmpiZ1JzNUlmQURCRm9kRnNFc3Awa1dkYkR0T2RpNTB3cG1JbXZWZDcxNDJZYlBVYmVlMk41Qzc0YU5sU0ZMT0VGZlVVVUpQRk5Gank5RUxNeCtlVXRUejJCZDJrQzhEM0pTR2VrTHBBZUYvMWR3TnhHdDN4dnY1OWM1RmQwbXI5aDF2T29qdTYrNHVBRUJJUDJ1N0s1V0VoZlZ2VCtWVXhqZHdKTHFMbG9ZV3piMGNYMER5NHFmNzBWRzhEcjliMG9UZWZyS0FXK1JSOUp3WEFCKzNDc05SVWVUTFZPdWIxdXduektaSFRzdmJPRmh4T0hPQ1RXS2JNOWttbmFscUREYmxWUWU3SFpISzkrU0tXZHpIL2ZoM0FhUEFEekdCRm0wRnRWdnE1bVZzTXNZT25xN1VWTUpuSWd1NDVBVm1VZ3lOWVA0T3d6cFY3SHU5bUVSSk5Zb0NvZWxhUVZ2Y0tTVExPaE02VUU2RXFDL1IwQ1dFdlJ1M2l6SXRjelhUK25CVUI3TmZtZEJYUElaMjJ2WUpuT3RwUWxmNmlwcmN0SVBlN2xrR29uWitIZWxMVU11UXE0TFp6RzJCZXB6aWRqVGIzME5WTHMzNHpPYXBmVTVRQU1Jbnh5RFhSUDl1LzlHcjBsTHlxNER2QzhwYTd1Rkk1U2thMGZxczlSdnVWZ1EySjUzM2M5RjNOdnY2TmtJVmpCTzVvdU4xNVpPeUk0TG1RcVloMWZ2ZVl4V2cxN2Y3eEExRHl1VXJ2cDNiVythOHBPTjM2aXQ0STFXNjJIQzVidmVSQzZGVGdWeEVDd1hqMTRHSEJLTGNBYVJsejEzMG94anZGeVdXazBvOVg0eHJzRkVxMGF5VHRNWW9NeHpwY1NzdFFiZzU0WlN3REtycDR5Zm1wQVZmTWFXZWFRV1J2dkwwY09mM1l4RmY2TnJwTUhHNlU1TTVaZzl2d04yeklPbzRrRW41SjNzZDZNTWxJM1R3V2Fla1lhZWtXdUpnTTNVZHUxZk16MFhrNmYxQmZodXgyVVFpRHBqc1FleUU0NEgvMjBrVmt2MTJBS2tQZllFS2NwdlRwaXg2OGRtMmxaRU43ZmZaaGxBOCs5U2lrSnNjWThhMFVFSDA3TitadVZGS21vRlBHK0x6dnF1ekE2ZlFzOEtINkM3cklSaGl3ZWN6OWVUR2lWT0gxRkRqMmI1UUVOMUszcjBvTkJybVMrM3NwYmQxSWw0cStNeGl1MmN5SU1UaCtrcEhPVU1OWW5BVjMvT3NtYnJpaDFlckxzUEQ1VEY0NzVqTlFXbnpMZ1dyYThrVkt4eUZIREhOaCtDRU96bVRqaHl4L2RhTnBKZ3RKdjJVZzZKU1RYZDhXZ1FRL3VSODBFSm1KcmVSN3cwdkphWHZ1NDlOSUxjMGpTakkyQ2JkaEljdU5VNXFuL3ZYTHBnUTY4TmVudytjQlN2RDZGbGg1Wnl2am9odVNYb0xBVGdsU25seUJNM3cwclpoQ3F4ajU4TEZraHNWYUluKzAraUdLN0NodXpDMHUyV21zTWc0ZTRqbjBlSEtXc05pMFp0RS83b2NLRTZ0cXVlKy9qOE1QejFJNUxRVWFnelFhOS9IM2g1WXhsQ01kWHFjTjcwMk1TTzV1TEVneFU1cVlBckhEVjBudDZDZzBteWVBRzAxL3A5bmFFSnJZUDJrRFJjd2QzMnA3TldOMW05bnRURVdraTJjYitpU3dxQWNvSUlaR1NJNnEyYk1mVzZ2bXJjanExVGtTK0wyOUFJbkN4NnlLRWpHSnRKRm02SVE1dkc2d1YxeEg0VjdNT0ZzNGZneHpnSmkxTFNGelNyWDVKYTllRkJ2bGlkL2hVRnRQdWRwN3o4YWZ1M2lzOWRWNElZUnQrMnE0NjU0RkdLNlhmY1ZYRHZocC9oL09FTDFLZGVZQjRUNm1uaGJTZjFUbEdoSUk3M1FpdElyMlZwcWdJd1pSU2pPcmRuVTcwYzd5dWgxbzVNS0F6V2t3eWQzNU9lUW0rTC9XVm0vZVAvTFBJUU9pZldWM3o2aWI3S0hXRDRTZnYyK045cEovRDZaQ0Q0UkdJb3ZraWd0RXE5V01aOG9NcldBUjFyWEhKcW9td3NlQjRVRmVoVGVnQkkxTE5kd0JrMUs2MWYvSmZIclVjSit3akR3dVpqVnpkMTZqanN1NjBNRUhyeWx6YUpSMGFZOFM0eDROQjVRUTdhNDU4MnlUMU4rZjFDRk5lSCtpeFNhdnl1VnBlWDcrVmU0TkpMTjZYZGthSmdveTgrRW56MnBBZWdGcEZUVFFUOTU1akxIMi9qUGRiS2JtTFVQekVHcUt0eUZoTEw4WjRvd3gyZFhIcXBhcC9TYXhCQkNyS0VrMkczTWdyMEpDZFdIbVJZRVd3R1V2SWFJRmx2bHdEd01qR29oSjNlelhvazdaZ0N5aS9VQ1hiUklVN0oxbWw5TGo5NHFKbllZK08ra0xBZXl4OTYvTE12OXVpVVY4cWJhS0h4K0VKT2s4T0lBb2lickxiY01zNXZ2T1ZINGRzTnMycWpYYi9LamUrVHk0TEtDZ09rdHVyS2ZqZ00yT1NVREd3RUhueGd0MzlEd0NxNm5RRnR4KythQXJzeTVaZ2VhU1Z0T0UyYklxaVpGY1oyRkdUbUdEc3Z0bm1UTzJpR0Y2d24vM1NrRTFPQUpnVUI3aUthTFNGOThiTURtQ2pZOTVWNGcya0NhVVF3QTJ3WlowNzBkOXBTNlpheHd4QXcrUzJOd0dNejJvYXBFdnhWR3RUb1FHWnF5ek8rUmdvMld6L1l2a3pDMkNTbnZlaEVjU2ZXa1hDZDBGOUxTTHRSQ1lqanB4VHdOcld4Y3Jya3pQZEVCNUoyZnE1Z0VISWNROFhZV2FFWjlaNUtmOTRXaDk2SVpvR251enhKRSs3WitkY3JzR09mOUxWbTRjSlh6ZEdnOU83ZnQ0VlBKTkVXOGpzanFWOHFNbERiUEljSHVMMnhjR25pc2lhUTRwbWsxUUs0b1BnSEYzRkNnRnB3Ui9sUGtwR1pKMzJkSE1BMGVha2pmRm1PaWxyd0tTVjU0ellzMC9GUDI0RXlSUDlUY09aNHQrVVdRNmNtTG8rY0xqSjZNSnBlMjg3YzM0VEpXaXA1RVFtWFBZQUFQamF4TE9sYml4bmUrRHpQSWlTY2IxWllVUnBFbU41Unh6VU50N1pFMzlEWHhTZTBXanJEbHBkNkZKWmRNZjVnZUVnSXJ5NWtEcDBzUHd4Mmx6ZWpZWkgzSk5acTFLS3V6VjQ1SmpsUktncVJoV294Kyt4citKODdycFA4OElPdHJhSW5MeWU4R0pSSk1aSldnUmVGTE5XS2FJQlVRVGpCMUI4Z25NZ0JqNkx0WEwvTVdCN0FzdngyQ2R5VHBCcU5oTlpqWDlMdG82c2FHL0ZPMHdLZytRelhlb3NxTmQxRGIvOWFIMkxHMkZiVzJZK1doRDgzVitPZ3hPUVpVUFphKy84OFZGaVpBVHljODVicVhpVGhIMmRtdDFsT1Vkc2FmSnNoMU1HbUpmT1RHRCtWekg0OUNNK0RVeWF4bDVLWEdWbG1SOXJYcStuamtTRlRnbG1qL2VDRGpSVzN4U2t0NDVmQ2ZUYmMrcnRvWC9DUmNuWkhDRTlVbVEyajdDWTZEM1B1dFhGd3JSSGQrTVdxalFBVjl3N1RwNXpjZktPSDVpeFp6NG9pbFBIY0gzMVdIdHYwelJiL2ZRNW1zSGcxMEZxTzdpbEV0UkNiUGFVN3liZ1krdmxtMGdsWXVWY1JNc040cVVjdGpFa0c1bjFFQi9BL2w1dWF0Y2tIRUJNbUVKWUJWMDBZVDZBRzVtWHphL1RMYTRrWExYWU9IaTRSSThOc3NwQW4xZElraFAxbGVtRW05d21laDBlNUFmNGpUUGYyQm1lalQ0Q3ZvdVdVbE15UlRrRGRoN1NSTm5sKzJMaEJ6bUQ4dE1PNThTVjZKYWhXdVhqNGgrNlUwc0s0RG1WYnhrTFBzamxIRGhRQkc0d1hRQkxjRGpGa21PY1BuUHliTitDQXQzejBGcVlmWGg2SWpDSFVraU9hMTgrcmxyRkt3c0RpOWtacXpRejYzQXB6VU40RHRlQ0R3ZExIcFFZcDVOSDF6T0sxSlZaZDZmbW5kSmQzcThNT3FVWWRsQkpRZUlsSlBRL1hLR2ZIUGdSa0FheUJhN054djRienZHQUJwcXlSZWdiYXVDUGJEdXhYdGQ2STQ4bzh6OHpHYVVIVUFTTmdYdjFhOWZWOGZ4SzR2SGFWcDJZUHlXZFduSW9CejE5TWIwUC9VU0llbFZPL3Fjb1paSmFTVXAya1crZU52Y084bDBnTEdtVjZONlEvRDQzV0h4RjhuMzI2VWZnTjcvN1RRR1A0ZFcvNjB6UnJwaTVGYVFXanhNL0wvTHFPUjJmT0NPWUlrSTdWMjMzY2JOZzdhSHVCbGcyYkVJbGdub3NhckNBQ3RCMVdzODRST3Q2RWxnSCtZN1dJNHNLcCs2WVRGL0t3U3RlRU8waCs3bEtNbWRuRlJoUUtvZGxLRVljNlY3NlRucDdDK0Rjb2E1Y2VFdlM0a2VyY2xvSVczSmlSaEZOeXdKbVZNeCtqZzB0ajhmRHREUWNrL0E0S2ZPcUQrNUVLVU1paVBpQUQzeUpjZDJvZXZDVmNvd0J1TER5K0d1blY4OE1tZUtqSWt4d3JIMTREVzlzMTY1USsxN0ZmZzdXdnRMcVdMU09YS2c4amNIdlM5Q28wZHJ2UjdIWUZGUHk5REI2Q3VwRitYRkdRUERQc0IyMEMwK2t6dEdJVDViYkJ6R0RhMGJTUXNTNE1KNmc3eDVrZlZ6eTNZYWhGa3RyRmtKdUpyRHltNGlkOUNLcDNQWndkM08wdXRndXdmbDVqWXlYZHlxWFdTSW5heWJjamIrNXNaTW9uSmRiV1F0eGJ6eUVTWncwMXQxVXdjZnkrQ2VJa2hzY0tCck1EbElBeVJod3EwVVVTNmdoc2ZhNmE0UHowYU9DNVp1MkNodVNGbDk1RzVsMS9WYTZrN0lIT1FnVUNxYjNpMzR0M2FhZE5WMmhYSlJyWWR6NFh2ajVxQTdtTlJkR3Z2M1pJc3dzU0M1MUt0SE1SdEEyLzh5SkxEMTRiZHlKQWFlZnkwaWpYTUltK1pvTzR6Q3cyUkorZUd4S3IxUmRiMHBob2ZZaFlnWS9CNTZPeXpwcTExbHB6M2orRUs2VGlsNURPR3VKVGxUNEtML0oyMEZKUnlDdmpPZXhWMWUyV0NBQmR6M3NMS1FxWVBaeGJDeE14UjhnckRDajMyZ0ExTVd5S1h3V2RwUVV0OUwvNnh3NGsvTXFacUxSeHEvVkxtN0VEWXY0bjIvSDVUdGJ3YlJ3bldWbjBkd2lpVnB2L0w1bjlHMS9va21yeU9USVpSSmZ4bCtLbHB6blZYTHdhYWF6V2ZYa3FueEwxWVZqRytHR3U5LzZBK201dWdyRVBQQ21CejBaZHdRRVN4WEJKOFNNc3BvQWYyRXdjQ0xYaThZNyszNnVxcG15bUJqQmtabkVKUFB2U1RwWGIwRlhUU21pNzZ2bTBnQ1lPQnNCdS80Uk9YVnNZbWNiR1RTVkxuL1NaOE1BM0hHNkNodkk3Zml2WitSWVlYOUFMVEkvUUYwaXJrVDBFL3pqWVJEekp0S3l1a3RWcjg4ZmUxSmZ6cXFjLzF2V3VubFJFUk9aV2ZvZGZHcDVybXcxOWZ3WWY2OEIwNEMyWG0rd2xiU09oWXV0Y24xK2Jmdy8xbzJsamM2WVgyU1RaSXZEcGhqenZxTzZHZGlQU05YdG5sK090Y2lPUCs0WW5RK3Q3ckEweWhhNm04V2FhWG1BVFVkdmgrSFkvRldjdHBuMlpON010REdyYmlLa09vTGpadFFPdXZhd3l6Lzg5Nm9xY0pNWmZpempabEkyVTJMRityTC9yWHFvYVBIc3lJR1duN0hZRGc4RHBOQVlUWG1kYUdZZk1XTlh1L3JWUkljUWp2eUdnZ2JxL2kreTBPOVdUYnM4c2dzV3Fvc3Nod3lpWkxSeXJQZ3F0cUVvV0drRjVoMktzYm9wUDR2YWZXOXdIaGg4RkpDaGFybVFxL3JxOXhEV0FvcW02Y0VUc3puejBwY21Sai84dUJWeFI5U25HM1I2YW5yYkZteVA3OXlEdnF5eHVHTUMyT0x4RHEybEoyUVdwK1NwN1hWMDBKZUZ6T0JteWZMQkkrWUw2S0VOaElwVFFiZFh4OFFFTUlpVzZMbk5wMWt6VllMWDFNamlEc2tMTm14WnJXWlFxQ1F0UTEyNGUwbVV5WEttRCtQdmo1ZktkQTZvc0gwUThEN3dWdCt6aXU2ZTNFZHlNWTI2dTA0dTVkaVpGT2g5c2pUUy9IYUt1cGNubmdSQ3Z4dEpHL3luVS9hUG5xNnlOSFZjK3VWLzRiTzRGU2xoemhpcnpLRUZqNFVDLytwMzlGNXlmNldTZFI1a2hEdHRYbG9QamZCZjNMd0ZmWVJrL0lQOGdzU0gzb3BmRzczL2RnS1h2cHpCU3lvWktvd3RjcVpFZEdlclJxTnZJYW9FLzZnK2IweS9xbXA5WkhwRCtma1c3ZkRKWm1UVTZKejBzMmY1VzR3bjdPYVpEVGlHU01qTEx2Sk1hZTZqVGUyU0ZhcUNSL3p3TFRVNUtkc2h2TnpiWGxMQ0hGOWsyMVhidTJYMmxCYThqK2VHeFNGMU5qSFJyUEE0bTJIQ2ZSbVo5bzJjd295UmFvM2E3T0lpK3BDRDBsREsyYzkvTkxJZlZYbVVGNlh6eG1hTjVsa0V5emJaOHgzcGZ4MXJWSHZldTBXL21zK09LMEV4VFFEYW94YkwvRFhsVHNnSDBzU2owRDdxL0Z2eTNRYXcrdGxLdzVXV0FYTkNRTEMyRWhvNmM2b3pVY2FXRk02R3JFTzZVd2ZhZmpIaFluK3ZJb2FIS05LVWRDOWRZZnVON1F5b1JMT3JoY1JvajhGZ1NNazJtOXBqL2VYS2tYeWZkTnhiUmdTYVFtSDJXVTBSdW80akVUSEZ2YndRTkdjajFQRHdEM1VrdUYxdnZUMk1ycmEyNUVPSGJZemhQZ1pZRkQrNUlabU81Tk1PeVozZlYvTSt3WVVibmU5SzViNDRJR3FCclJjTHNRb1FLaGRrdTV3SEFpenFOeGhLNnpJZk82d0srNzAyYmlPajM4VFBzOHNpMm5kcG4wOHo0S0xmS0xMTHdtNm9GN01BUi9iS0NGamc2QUdjc3hGVjJ1amtKMlZ1RXVZUkRiYXAvUmtRTnIvZkpqb3BUcCtEVEVYV2pNMHAvVHIvN2ZmRFBUTmkzNFRLS25HUmN4QU1rbWtRSmxvRHNMRktzN1ZmVjJjTGNXZ0xZYllSQmxZZDB4c3BWaWwvbUhzSGhPWGZuMWVnRHRITkI2T2g4aGV6c0FqU0VLU0VyeUExTlFjenJDYm1hU3M5U0pmWVczU2tHelF6NHJSSkxoMkRDYUNrc3g4YmIxc2JtbzlFN1h2aFc3aHJ3S2RWbmJCd0JNS284NzFFNWZ0d1htcE1xNGRpVmRaSEEyekZJa3AxdkJZMEZ0TjVOWENoUWlkY1Bja0ZYWGhtdmhWdyt5N3V6M3lQNExNUU1xREkzejltajBiS3ZJdFFKVVpvM0RzaUIrdTVxSnpHNTd3c3pIR3JpR0ltV2VINVc0bThmNFgwSDZCMEtZbWFNeWx1ZnpjTUMvbUtzRDhjV2xKb1RISXd4elpONFRhUDU5dHNaSHRGZ2F0TjhYdDVpZUV3M2NDUnpJZHdwcUpUT0lMejYxRlNaL1A5S2RyWnFyWi9vRVppU3dKMXdBMUJ1eE4yRWZvOVI4M3ZjU2Y1czhnbzRZTGpWbXBqWVlKaDhJc1Z2UWQrb2VGcHoyenhLN3I5aGpTVUhhcXFEazhkcEZqaUxubHBsQzl3VWtIUTI0clN2VGtpOS9HUDNkcUx2YkFVUjNhclVHUzBaTU1iZ3ErSFlUSUJKTnVZd3NzUi9EN1gvRzcwNDc2TStqQlNONC80Z2lvcnhWUUtJaVBVNVlyMkE5UUxqYkwzNnpJSDlUcGdHM25NMDFiMUxxZEY0RXU4WTREZVpTUDBXTk5YTGpreGw1dmZVNklNVmNseXFiby9zdFF4aVRnNkQ2QktjUFA2VFdpek5lWFk0UG1Ia0MzL2xpT3ozWHA1RmtLNzdSOVFhNk1yUkJpSHNSdzN5TGkzQVBZdlAyZ0JVeW9iRmFkOGtzK0doOFF6MngyK2dybk4yK0JzMEJTR2J5V3A1TEdQOTRiQjZVQm5EUENsTmY1WG0xUmNLeENxTzVZYjJVNkRpTXhkRHU0OUsyQXFGTkpCTDNTR096a3UzeERVT0d0bXpxMTNrbmd1YVk0RVBudXFhcXd6ZUt1a0lBSldlYlBMNUI0cTNtdFJTa1pzUk1hQXFUaEpUY3N2c3hyMTE2ZFJ6L1U4Zyt2SmxSN0x5ZEthNldEdVNNOXJoNWEzV3M2bXRaZ3NXdjB0SlQweENscE5idnpNV2FHZlJLUFRUamZOU1FTdnQ4dHFBa29raWRYUDJrblkvbHh2Q3Q2R2Zkenp0OUUvUGxqVCtRVm5ETW96ZnhNL0tTU2dlMDdwZnErU1pBR0JBUjFoWUJ5Qk11R2N2RHp4VDA3NXBoUS83cXRVaWZlVE9HTXBXVitBZE5xczZ1REt1YnRkUytTL1puODZsM1JXVXdmUlhZWFZ5NWsvcUhHOWF5WUtWbEVEckw3SzVUeEl3L3p6bUE5elNJbENyVG9tK0puMlJpUzNIdTFneXl5SUMzMVU2UlFBWDI0cG5keDdFaU0zaTJVRWxKVFpUenMwWS9uekp0R2ViM3ZvaUN6d0ZxTlZXUWhTa0NQT2ZDNXd5ZC9xY3BoajJkK0dodkxBTGVmQmNnMGdKVVFrbVc0WGVBVlZlcDhqTWxmSFB2WVU0ZS9VNjhxNmpiZnJKL0NVNk5heHp4R0tnemovWWpWbHM3VmhWVm1hQVluVjIrb1FPQ1JFUHJLaktLdURWZ2NLdStKK08wa25rMkZnTytrbHA2VVdnTEIzaWl4UU1ZTVVUa0l3Uld2amZMNUpkVWc2V0V0cGlPVEl2MGVIYm1tcEtab0RrLzFDNmMwa3JITTZTcmdzZklLUXZaNXdsUGszV3dwRTBWMzAraEhLRkQ5WUYvSjFYVTdHRlpCYlNiTFZiekxTT1NxaVoxTXlSWTdiaUQ1QUtFbEU2c3dIa3dHOEV3R2JSTWhqQnZ5RjJKcHM2TFd0cm1vQUJDbGE0U3hUMSs1ZVBxQ0h1bUc2andpMEIwMHNlOE5ZWjc1c2RTWXlIZ01BWVB0SGRUUDRiMFltNzNFQzgyajNPZm81NEZOU3kyTzFWYWRNN2JxYzZJeTFUWFJRdU5WNm1VcWl5djZ3S3N4ZDVSaCtlQVJpRWpkNUFvUkNEY1dvZkpOVGlZQnZUMnFITnBNd0IzZ2l1UTlUdHRvUVVaL0ttS2JrR2VETFJKL1RrdDNqMTJIUnNzK3Q3WUxXTC95NHh1RElzRmwvcllMcFhKREFQQUpZc1c5UTZidXNiWDQvS1gzSldvcGtXbFV5a2VDQmZIeHBmeVZ3d3oxU054czRDT2hEbFRLNmgxSUJoVVJFZ2IwZkxPbHJ4dDg0bkF5Z3p5ZmZqR0JuU0JUWmZiWE42RU5OalUrb2xDbmRtOEx2S2Via0lhMUc4R3dKQWdBSHcrUS8zUVIxazZPSXpRUzdzcUN1SVU4K2wwWGFLQjcvS2dGc2lDT3JzMnpXektyaGtGemhubUs5SVprSzE3eEcxdHJWZnpPcjlZak9CZTgzd1R3SndRT2RET0orMW1KaHQ1S2k3STRaRnVUd01qYjlxMFRvcW0xMzBtTWlkUnY4YjNYbFBWV1Z1SXBaQVNvdjAzVFNxL2M2UkxtUk0wdk5YZWcrQkdQSUtabWxvTDRTdlRXUUVtSGFwNHB3bmRuKy9XOWd4c1R5MXRzeVY1NE9wazNTU2JIQ3VXckdpbytHaElNRTFHVjdRR1hCZEhJR2dxOTRoSlpJWTJpS2tsUzRoU25pSzJ2WnlOcEFGbHJqU0JXZnE5ZzA3ZUtYdWtUOVp5U01pdS9rRHVCQ2poV0RTSEp4QjFJSjN6N05vbmo3Nmd6Y3lXbVM4YXNRZTZLellPZUxESkM1QVVhKytvUUhnK2lCV0tCb0pWRFd6WnFGSnJ4Z2FHSjI5a2tOd2VJWVFVTWhoUGFwdU5HSkpWNDN4dEFaY3l5ejV2ZEpCL3BDVFhJMklkS1pjM1FWdG9KRUZ0SkpMK3NmQTJTWk0yL0lNTkRKZ0ZhamtTWXNmbkFiTlFJeHMrODl1QXRKUVNKV1dFMDNVVkxoN2hLUWhiRHBqMlRUQngwK3k4RXVJZjFrSThqamhkSWw0MFpqMVVSWTUzMjhlTk91UFRoNEtKWlV0ZU5oYjhVem9CZ29PWGNNN0dJOWJNNDdtMU9yVnNuOTY5SVRnTUlMQWZodW9iZFdTY242eGR6RDFPSGZob0JKMlozNHlTWS9peXZIVlFaS0VqenR4YVlVdHFJaEh5Z29BODh5Vy9EOVpHaXZsMDJrZWN6OU4xSC90NndvOENtQ2UwVXg3TVl2NW5ScmlsdHNhcnZoWFA5aXdaL2lSaDk1QXRPajRZNjl4ZXJGWE5aTjlVdUU4VEQvUnBaRllXc0t3cXk4cHp1Z3NyaWVFQlpXTmh3RDB3RFE2TUhyT3N0M1Yxd2phbjkyZzJSUVJjdHY0SXlsbkhZSC9hRnJZNk9iZTdvY0dtMjFIYmYyQVhjSnZrRE0rU2k1bkZxM3BZbXpzcXI4Q2N2cDU2NHB0ajhRTkg3cGl0S1Q3NTgrMzhpakQwOGtCeCtnVHZnK1plU2o3dm0xUGZsZTJ3TURKZlBWYVE4M1JQWWI0SXhrWmRrMWZSazVKaXEwVmcrZzNydHJJR2pxcS9YWVFCZU54Wks3WE1PK2NPYjVjSVRudWkzWHV6OUEwdUtWTkkzODJTekVUdmRMeEo2MVJLVVQ0aWxZemRWUitGaGZGak9hS0lVUERpNjBsbWVCcGJ3Rk8zbHBMbFIyZTFWY1JNemNiOElWK1BsNVV1ZlhBaFcrSW82eTM3SExKQVBFb2d4cHZ0MEFWc1FpYkZ3VHE3QTJJN2pzMXZMVmRrS2Rtd0JrMjVGem9zYk1KYk1LcFUzTHJ2eFJMZmpWM2gvRkc3VFRFTXNReW5JcVJRdEJsdHBsSERVUTNkbTVLNHdoK3BxZ0pGV3FsNWZzOStSZ1VFS0duMFZhMU9GVzFvWjhmMGhXRmVkNzkyVGJUdDViZWp4amc5ejRoeGgrVkwvRVpYdHZ3QXl2a1htTld3dzNMNXhHV3BTTHlaT2c1OEJmY0RDUld1cG1KUE4vckFZSE5yNDhqdzZDUFp0TlJ4aDhBTTB2Mzg4ajBZUVdVcURpb2tuYnRNdG9wV1pVeWNpOXl0a1c2cUdwaXhkeDVEU2p4QUptdk1HSnJxM080K2hNOHRra1cxSXZoME1yWkFWSTUwT2NVQUx0b0JKa1FvVGtNeHFyZlAzNVRGMVJsNG96NS9sN0dKOWY1cHhOVlZXdVJLaUdTVkpTdGRKa3lxN1VEbkJwUytiK3czekdBVTNCRWlheDdLMVpLRVY3MHV3d0xKeThWQTlPUTZ1dGxaclJ3WEdJcGZSZTN5VmVJSEJjVmtIVmVwQnhIL3BaTHRUeHRhbUM5TThZUFQ4cng1Tkc2MURlVTBCdzdmam15VDYzUjVrdHQ2STR6Tk1MWmdPSHZsWVk5UTdhOS9Cekc5QktOWTJUV1g2M1ZEd0lZTGIvVFQrMDB2N1VVZEpiMHlYQi8vVXVSeElTQ3FYWklsV0l1RUxFZzdpck5PcWRUUGJETUtYS21nbDBXOHUwL3FqQTBMaWJ5UlJhNm4zM1VBaTBYYTRueHJuUElZd2dJN2FadWF0UkhqOGtxMXF0WW00ZnVXV1hDWHlOekNGamtITlpNRzBPNmdjM2R4S3RCK01SRDdRelJvT2pKOUtOckxzN0d4SUVydDBKQ05kbHlBVWkzYlQzZ2RudWFJdzM1eU5DUWd3YXNqdGlwWk0xWkNXbEliOE1lMVFTaTJ6T1hockh2OXVCREh5S3VEV3NpRGV3OU9ONEMwTlJJQ2NCR1NYK0hid2srUW8yOW9sS2VIN3gzYWpCT3pGSWZ5L1Y2M2x3S3RxNkQxUElrc1pMK0orak9HaGZCTlJlQmdnVlcvRkRLYkpxUXhVazdQaHExL3k4Zk9zV3J3amY1eTdoSmtYbzRMQW41bWlTOTBsOU1rbDZCbklBUHNIOU5wVUg1UThxVVFvdTB0OWdQaUZqVHlxNTd6aTY0TlBKR1ZiLzRCTk9laVFZaFNxWWpJNXd0S2xSUHhQM3NkYkpWNHNucUJCc3lmUEJDd21uUHp2amtacWc5UkNFUmFCdk9GbzFjTmF4T0FTV2wxajFGb25VWTk2N0o3em5GMGtTL1I3RUVNdng2c1JGajBnbkNUQWFRNkFpVm1pWFV0VXNBcUVkM2tnejRzUFI2SWpVZnJOMnl3bWlEN0tMaHN2Mkp4Mm1nQmRvZHJCVXBMZjg5ZklnMXBaN1p0T0VpbGJsUVRmQVg2aTlpbk5tMlQwRzQ4UEJUOEJjVzRzK2lrTHArTUJ4NC9BcXpXNFRrbzNPdWdhRmsrVGpxWDBwanRxR3JVRUUvdHZsdFRWVlVDUlppejllZS9FNWgrdkdHMTZJSFVFRUI0UWhnYU41aHJ2THVSK2F5a3ZzQnQrOEg1d0hrd0dsVXJab2YxMWdpdm5kWUFFYVNlV1NoNXU1Nnp6U0dLU295RnNjV2hYcHNDcDcvSDF0U2pOakZHWWNXS3Npdm50QTFqMzFyTEliSlFxcGRqWUwwNloxU3ZpeWRJKzhhZHpidlVnR2krMVlOcnB5NXRKN0NzOEFiNEdWcndsdHFQNXpPS0tHZldJNUhXTnRZRnN4R1RaQzNnNlJnZHIrSmVlRDJnNmc4eGFkQ2RQOHkvSHoyTlJXY1NrRnlWZ1BRMWpkRDJJLzlhYk5OanowRmlWQkUwTncvTCsxb0FlWnVYSG1xR3dlU1QwdXpCUXplb0N3VmREWTVRR011QlRjQXJENWx5VlZ1UWZqZGhLL3draksyYTI2U1BMeWI4Q1pMZVA1ejVYaWNxQ0ZyeUQzbktiMG91MTQyWTFQeTBBVVQ2WEF3V1VscWFuZ0lpRytQZW41T1FNNWdaVG00ZERCbDY3ejBJR093WXlXcHdXV3E2ZVNsMGFvZzQ4Y2g1Mk85QmliT2dwbmVWTU93Z0pYQUZOSEJLbWF2aFJzeWM4b3EzWThXZGNIUHQ2OGZSWW1aNHpoWjZHbGhtTFdLSXArNGY2SWVrL3VCSWRCYkhxSWJLa3NIcFFtL25MTVo4SE85bmdyN0VaTThEWjZnaUFKSjcxVGY3RGtEQkxDYkxXSGpYdWRoZGF1bTJ5ZlJVU2RFeHpJUWU4UUNjamZRRkFjOHF3OTFUSFhacVp2eUluNngzWmRmdkkydUZDcDJiUVRCSVZ1MDdsdTJZU0FLb0FyY0F4R1A3RU5DaDZscndSbmRqKzN1b3pMOVQ3VjdOZDRWSTJINmpVMHh3cEtoNlgrYWdOelRpbHdPWEtEZDBIeVlJQTV3dkliNUxPek9jayt3cmZ6WU5FQmwxYWQrUmJaa1hVMWp2ejNKVHEwSVJ1dEtRMTdmNEswMEQzZWppNHdpTlVwcjFrMmh2YVdhQkFkMnB6VGJLckkrN1BTN3hyK1o3UGd6cDJ5QnM5anJtOE0rL29hbGxrdkViNldXWEJVSjFlZTZGS044Z1B3bG9LaWc0T3lVenFxYmpOWEdyamFSR2ZtZmk3ZEdNeWY5NkVCYXRaY1greVE4bmpwOVJZemo5bmVlTEN1QjVJbWJ0bi9FZDBnbXhFVzg1elMvN1RrdENoNWwwQXl3U1pJS084VlpER1JFUU9TNng1WDdnbUlIWllNWmEwSnF5c05WV0E1WGo4SlBzYzV5MEgrd3RYNjZUdnluY3pzZGV2dVZERmsrdFBvcHI4Szd6NmNkd1JiOU9Ldmc0Q3BFaXRNR0FWU3d2TTVhbWdsaEpnZTdRdmVHRzNTZmgzMHpBcWhXV1F1bkNXcDVnZURGZGE2RUdtdUFIZG5LNThxZ2ZWcUJMWURrY2srNU5TMUpKQ3BocDhZMEdjUUVPbGh2WU4vTHo1R0ZBS1lPQ3NlRmNzbng2anQ2OUIwSXpKblVBWDVIZzR1RTZsWHpydXB1Y2xGWG1HRnVIWTBDZnRJTVAzQ1VMa3lkTG04bDF2M0oxVUNFdlIwMThhSklHZys0L3hHM1ZtWW1ERWtjTFdvQ0NCTUdZZDNaVmlpQUZJK0wveDdiRjBnWGdLeUkycm9DTnVpM3pZcFd1ZUIwb01rRkE4TmFZWmxpTnpXMzcrZE9qUnlGVHJsQUQyYnplTm5FNzFnRS94YkQycC9zZVlES0ZnTE1Ea2FKOTZUM2NCQ0dWeVovcXlmNVIxenpHZ2FTU0YxSU1NU2JVR01jK3pNUVBWa0V4MFJIeVVHMlltSDJzd1RNZmJtbmZ2dkZjMnhoRTA3eWtPQ3RrV2hpQm5GSVBpVVVCNW8wdjVCVEQ5M3dtTS8zVGEwYUtKcThEbitFQ0FUekgyekhma25aKzN6ck9hWG9XM2hqaVpVWUM2UXA4ak9rNUptM2JNUmIzUTcwWG96S0VmRGVmUGV3ZzhSVUN6TFZmTXhoZFppUkdvSlcxRU1GcHhORzMvYTcwQmUvTGgxL3dlb3RxNDN0bEYvZjRqUmpsb1E1SkpmWHFSWDhheWRyZmtoZzE1ZWdrQmxaeU00cmNaSkxjMmNibnhUeXdJTkNqa0hjVkZ2YTV5eHhJbVptcXBqSy9FKzVpbFBZaitvZk5Oazd2Tk95ai9uU1BtQVVPbHk4dGF1RGJ5dEFXUXNNU3VRNGxtNGpJUUlmTmh4b0VHTFlLd01UMFgycWk4a2drZUZxUG5YTHhoRlFvb250Q3hleU9zRVR2cFNJNE9MeGtselY5VzhhNEpuMnZ1Ni82ZzVTNHoycXRTNzRaL1ExOHVpdW42YzFLTGtwb2hyV1dYWnNqd1hnWFhHcFVJdkZNWnowQlNoOVZKRHRyNkVHSkdJSStsOVYrMzVEUXpTdElRbVVsdFZybGtHRnFKNC8vcDJFdWxFU1VnVlpDK0lpbmdTT1JaZGs1U1ZJemE3a2hMbEIxWUpNaGFaMUY1THFxMEYzZmhPOFZ6SzFYWXN6bUVkSjhZNlJXalExMDBFZlZ3U0JIRmtKUzlnM3JSdm5BajJiMjlyU09LM0k0eWNOSGVuQWowbXFLVDczRkExN1EybDB6ZFpJd2daQ0ErNDVqc2E2ZzdUemZGSE1Zc0hKdThkaDdkemd4cHpCUis3YlhWZGsyOUFZL0lQVVJGZXlPTkQweFpaTWx0VllOR1p4Yk9CZXNFUHB2ZmVUN3Jna3R3KzVnamp0Zkp4TlRsN2lKaWZXVTRwVENiZ2dmY0M0cW9oV0FYOUNleFgwWU4zbUFVK1NJdDJPa2NLREkzSGpSbnVPTWdaTWg2eDIyUEdvQmtIaVgzaGtvaUFkNlg4aTV6WVRDTGFXdndWMWhsNjM3TFJkdnRqSHVYKyt3Mkx3UDlUekRORFBYRFpmOHdWOTBLUjA5VUY3b2FZN2dzaGY5MzdkSnVPMnI0UENRL3h0S3BjL1NyKzVHNDIwcEFzQW83T0RkQmRDOWhIWGhWRWU5U3lHTWVwb2lqUE5hRlRrQTdPaUV6RzJOb09xNUE3WHpyb0FHbXhUait0N25qOElKdERoT2h2dmFiSHVQd1Q3aythL1pleFVMZTFlRWRPNzFjeldDRTROS2RpUVVjTm5NSjVEdDhtNit1MzV1UmRKcDJZUDF2UlZZT0JVcGpBUVFDa2tHc0xYUmFQNTdHNlNmY1dtSEVpREZjS0RuOXpvZlVvdHB2SDVtU2E0Z1B0akhneTNhakd3WGwyS0t3b0xIbTRCTFJJL0VtcEl6ankvYW4yZkticHJHb1BhMi84dytHMFBWZ1BXdjNraVN4UTB0NHBMMEpnZU05anU3bzRoZnMzRC8wc243TkQrU3kzdUdvQm9adGlZWlBmdFBPRGZabTJwQ2pLQ3ZhaEtTTWxJOUdtMTltQ3NNQVpNdCtOaFVZZWhxYWRGUkY4OUhvV0tHeXNqcmNjV3oyMFZvdWFJdGpsOFdEK3o3ZTNReEx5SVhwM2NiNFFBa1k1WkdtZk94d3FiL1RaN0VrNnFxQVRpb1l2cjkvaGpTd3djcjZtNmgyOXYrenloK2ZCTEhqLzhDOVJJalBIK3pBdDJWc2pabW41bTJjYlZPQlJTTUVUVldLbkRhN0IzaGNKWDF5dXRLTUJrTk9GN3dMVFZVTitxd3NjS20rVlY4U25xWG1LTDM3OW81Y1hRT0Y5NzFWSUp2OVRlR29tL2xWcXpQNk4xVWVJK0dyUm1XL3RaOEJUeDlZOWVML0JTdk1CUlJoNXVJdk5UTFNUTTg1aHBzZ0dkNEM3Tm5lNVlQLzYxbXJpOTdOVnZLMWUvVXFUdXJNdlVRemZZZ09GcGJ3TGFqdDBYMkdGN2dJNTRySUYraVBOdHlqQlcyRDlQQ2ZUSEJSN3E0L0tpVysrNHpjZDBJSUR3SFhCaHpKVE1tcnNPQ29qVGNVcVRZVWxuZGV5YVdVbUt1bFdRb2Z5Qk1HRko5SzZUbUpkZTkvK0FUSG90MVZ4U2hVcDRuRmtOK3NBMnZ0NjhheEpNa1BYbk9JM0lUeGhGT2RQaVFLUGpCaEg1d0R5bkxnN2N2dVRaMHJyUG9NTkZHcGg5VHlhakpWQ29nZ3RadjJXN3F5MjhSMEFhemhYaHJmbGh2aVBzeEdqV2ZYU0xBU1hzbDNVNkZmbTA0NGVKc0wwZDFROG50ZzZKNWpkWFB2RFpxMG9jZEo5L1VOM0FpeHNjcnVidzMyRkFMV0pZUDNudE5BR09tZGxmdlc0YmZ0cWl3aUJtRXJsT09wS09VQXNJTndBNGMzZERuRldKQzhXNkJYdmtBV3JXb0JITW1yU1o3V1FZVDU5cW5BcE12Sm9lYm96ZUJ5L1ZVRVgwcmg4MlFYNHgydEU1R0UrTkE4WHh3UFdnNHE3SjFzZnl0Zk92S0l5ZXd0UzZiVitrNXNvMGdTV0paaTV1WjZ1bUs3NWtLOFJJUTVJU0c5SzlYKzJxZVQvam5QenpyczNjWUtnOG4ySUl6MHplRndWSU9PcFVaUDl5cEFqTEZFbTVOQ3lUSXczckphQlNISC8yU0dRbTZsOStoRlp1b2JHTnpGYStzV2NLdG1jL1ZhN3Z2WFVUdnhYeDJ1a0pVMm1mRWRlWCtzVHdCdWZGWmRxQ0w5K0Y1QW83a1h4cWI2Ymsya3cyLzFjUlFaVlhJaDJ4d3hEam5iUm1Ua05FQ2NMTEtrd09vaEM4UEd5eE91ZGlRZkVwR3lhNG1aeG5NWi9JZTZmc0dKeHk4RDI3OFVYSE9ab2RDSzNpbUd1eExUWXZJODB1eXNmNGJhcnBiR1BqU3lDeGxscFZWdzdlYmpoNmk1MFp3SlJFM3lnZ01zL1hiV1Z3ZVdybXMxcXlyNURJSTVkTWk4WnF6ZHRtTzJEamQ4UFEvV0ErNDBXWDNoQ1hYeG1ZdUlUWTZESmVaL28wNjRWZEc2dTRtRkdxSGpsZzgvRFFKZm0xbkF3a2NCMWxZS1ZpZUFkRWNTdVJYd1NDQ29IODhvOGdUTndOL0ZQUnF4bXhUOTgyaU5BNWJvZmlnbmdoTHZlbDBGMDBjZFVEUGZBSGtKNEVBU2JvV0FYMkN4VnRkWlJya0JVNWdqcGkySmtWbjdzUE5kYk1FRkdzd0N5T3VXWTYxS3hiMEVQaVpLdmg1bmY0QzlKSHNlOHJjbndYeGNkQVBPb0E2OER3UmZCVUJ6bHd0N0dyUXg5RUhWMGNrcnhmVDc5bTBoVkJxZXRjNVluRGg1VzRGOHA1RkYvMHI1eEpOajBudXFEcU5EWjBCRDFmMGp1MEFsMkdjMGJxQzlqZTBTZ25rek9kQ0d3cUpWV0FhS2Zrc0NXZDFIT3pJVU9xTDNKSGN4a1hyeDdoRVR3cXJUSCsvZ3JLdCtwaHhJN2lESTJCdFRiU2ViekJpRmoxV1hXTEZWMHJkendEbzlvVEZrVmtpN3FpU2ttK3RrL0M4YWNXazkwd1BWSEJLVTdkRHc4WXVCQ0JBL2JpYUx4UDE1VkEvcncxSTZ0aEZ1eTJDeU50TkpzYTNWWklrdC9sb3NIVmM3dmN1bWxDSTBScUJEYStVSXRPa01oaWVVMTcvM1RSOFJBYjhXWStuNmRkZlhjazFraldtZmpDVkJYblpXQzMrZDUvSERyWE05c29mZFhQSzNXWDd3WXp0bVNWMnNTa2lvYmtyNndWVUhMdU9OSys2VEpFWFZVYzJaanpuQlYxZTJjTHNHMWxsalYxdFRRMGMvWS9JSGc2a2t5VDZOdEswSC9qTTh1bW1WcE04bU1IUmtIYzJabnBLNlhFWk1ldnpXTnE0T25RUEkydmNDRFlEQVRZdFVNam1OWGw5cjIvN0NiQzhUanZBSlVacTQwcm5zQnFRdDNzMDErVVhlajdEUm5qbCt4bjFFOGt5NU5Za0V5OUNLdWg4VDNmQ2JqUFduUHJ2ZEFJU1N2OG5DdjNHcWRWMmNhTkpCL21XYlJRNTVIbG83TDlyaWQ2UDU0VEpMUFN5K3dydUdpVmJHZURCbE0wSDg5OHhQYW9GNkdjVjRGWUpjeGw1Q0RrUUhuMVlveW4xYkZhTGRjNnhwUUpaS2tZZy9oTCtIcy9pbFFFYXU3V2lCRXkzaGNuZWJGckJjZHA3UnVEWlZEUHFLZzFFamkvL0hkT0tsYW0rV0ZWMmVhZXdiTkI2WVpvWjlPdDA1eVFGK0xXTU0wMVFGTVUvQ3dINVJjT2hWR2d4OXl2dkpiWllKTU9HN3dhV1RFdklqTWpQcXFZeVM5T1lWbUoweEJ5T2VaUCt5TFhPN1ZhOHNwSTR1TW0zTm1CdytIVXovWDYxQVFBZmxyMkhabkJSblcwVFZRaHdZSDdRcVZ6d0tya0JNWm02d25DRy9idU4xb2dJendROW0rSXQvNDBmekp5aVlSazNJSWU5SVYzWVpqV0wrc29vb0svVWNycUR0dDhtdEUydzFoaGJpTjNqWHQzV0RVMExCQTBqUWZSTE96WlpnTDVYaWlPanhRdHpjT1VQVkpxNzlZZDhMVmFEdmNySjIvZkozSmRSa2NRWDhUZjI5bUpVZjV2ZEJOYUVCWFZTcUtTYmlZWjN3aytIbzUyMmdvNFg5TjdEMkN6WGlxSElLK1BMYXgxODdjQUtGeDk5S3VjNlJEMjFkQ2hFbW42WXlvblUvOVROU2tzV2hmYVJZTm5keWVhL2VYcnR0bjhvbjRrY0VJNGFnbnhiY1ZYNEZkS0VlTzZ2cUdFZDVmdWIyMkdjcHpuaHYxWm1CRjJoZ3d0UFRObEFEY3AxcEhyQlB5ZXhVY3hIYUQvZGUvZTEvSVNpc1RYRCtNK0xGcE5kYktSUlBuSlhqSmp3REQ2N2FmOThmTTlGZGEyZlI2c2ZQRWtrM3RQZ1UzVEZ3eGpsRmZPc3JUckhSVFlGVktyMW1kOHlmUlg2dmJjc0RSYmRjRDM1YUVFSlMydzlabGdXb212TmdwakpKWWFqZmZ2MHpCcXAycGVsT1NIQUIreDE0cTR6Z2IwMFZ1Y21kRXRyQUp6TC82LzlRbWtIa1JSMVY5dzVQbjFsZFVOUGFyejcrV0lMYkdBRkpuc3JESUI5bThrbzNlVDNTaEFtZjVMd2RjZjB2TTI2bGpnT0JtTnA5Y09IRVM3VGViZEtodU5KWTh4eEw4b2tWSzF0Umt6NFE2WmNjYWx1eUJ2cnhHUHQrSTdEU0o1amorK3I1eVlvSHNYeFpxMC9wZkJjMlYzNngrQlphTGRLQ0VrY2hFVDdXL2VJWDFTbG1jbkUrYXB0NUxFYTRhR1BnbzlsQXJEZTl0Q29TcG9sVDBBWHJRVTRXZFNRdm8vNmlycm9TbWlkek1qWkF4Qnk0dG16YkVTM01zSTVZNmUrdGlzK1A4Y2wzQVcxWi81NEVSY2ZkSFRwZnY1c1k2L1MxR1pTZVZseGh3YllJQ01KbUdRWENjbWw4aXRvdTQ5VnlRYjE5b2MvRE8raFFUNWVnODZuL3FlczVMVkhtMDhtdUpTQ291azEwT1JJRDdET2dmZ3FERDNXNVllcjhXMmkvcDdpMnlOUG5vekk0S3hQU1lkamhXSFB3VUxMeFZXWHlqS2h1WXVrR0IweEpkc1VVcVh4YkEvQnB5b0hmckpxaytpN0JzVWl3T0pwODBUMmlUeDdBM293T2JlNXE2dWhRWFFnc3RzVkpCME5tMlh0K2JQTlowdGdYaDc3aW1nMkxTQTZnbTZQMjlGeFVuRWxLQjNaTGwreElWTTVTNUJFZDh2WlRVZWlKSjIvMHgyc0c5V2Rrc0V5TDVaaEc2N1ZvcUdKd3hxOW1nOTNVMFNNWGtmakkxVk1qeXM3dXR2UEt2d1dCVlI2MXhQUnNUb3hMNVNKdjlRN1BoMnlvSzVwcEoxWHpwcUNwZmEwbVREZ0g4QjNTNzR4MVg3ZzdqNlRwRTZ1RU82cjIwTXJsZ2ZEdVFpVG5DaEgrSHlQYkkyM0dHVkMvQ202eEo3bVFLZ0MxWW9vVnVGYmtJdi9MZW9GbHMwT3ZLbDE1bi9EL0JBaEtPT0JSWElJaENrOEpOV21iUVIyQmVJcGF5SkhhRGw2UHcyZ3Z0YnV4YitjdDRJanVSMFhWUXZ0L3gxV1h2YjJrcDVQcHV0bVJ0WmsyaERBOHRsQ3oyZTJqNHNOR2paUjlaT1lZY2FuOWtyWEZaZHlZcTVHTE03WnF3WHo3UlBZRTdsU2JiKzZBUkVIdFZIR3pFWHo0eDFaam5laXdKVHBLSHhwQ1Q4NWVEN0xSLzFjZlpwTEhHWStZaUcxQzk2amc0N3NxZ21rc3lPZHE3NFpDOGZGVjhNSkFhbnc4UHlUOUJoUW5YWU5IMmVlbVB5am52M3FWRWxncnFsUTdNWFppdlpIQlhiNnloWHRkdkJsVzd1bGtNS0VMbFAxTzFtdjFvL09MYkJUN01kQTBYMk51cmE3amNGU2EwOG5WVEprK3ZudXpsdmdsVklzYWRTMHlLUVdaNGZNZTRYSnpxWnVoTnQrNHltQVZBbkl0Uk81U3dMck5XYzdZSjFmdVA1b1hRUGpSVmxGQkhMRHYwbU9zZDVKektqMTlBQW9UcnpxR3JNSmlBdkVtL3BQdkt0WlNyc1k0dXI0bkU1eDJuNGxlUnl1Y1VrbmVvQmp1YnYzVHBBY0RrS0NSTDR5YTRJdStwWFgxRjRZOVB6aTU2NzRjQmZ5UkRCZU1IQ3BOWVRsUldPb2FBWElGcE5HQlBDcnY3QnpVSWRadDB6UGdYWmFVeFhMTTdQQXBKVXcyUW9aa2JtNWtTcDBYY2JCMUZUK2JkL1lRUUdDUVdCZUtQMkpwcThDb1lheUpFVytWd3FKczZyanl4OWdIWW5YYlVKeG9INVIzU0E2SUpnZVAzSng2MVhoWGxiUFY5NnVHbWZkaDBLQnl5QkZ0MkNEMTJMRURIWWo4L2xpZzV0Zk1IaENBamNNYWNob0pqaXVhRFkySVZsblFXZHVDbmxyMmpmcnQzSVl1TGNtRTNQRHFBRndpVHoxQmt6d05RbDd3WFRQdWI3aWtqc3JxdVFmOUg4OUJIUHFmOUdFSk5Kc0FpVEZZajRTMllYUjlQVW13MDFwQ1pOWE42OXdQZitUa3R5RmhKQm80YjBQVm94THpURnJvdFQxR3pVN3l4M2pEOVpSSng2TTVBY3JXVnFWWkJJUHYwWUFxRG5kb2daRmtGTGdLV3lkM1BRMkJEU2ttUk81am9KK2svVFlBTy93OVh1VFllNmJYSW1vbGllZkxDQk9SenB4eXlvV3lZd1Uwby9aLzdPbWgySEV4SVFyRGtXc2htL1VPTDlnK2hmelRSc2JwNTlIbDNPaExraEdqNW5FRnRFSFhXcUJHNVdhVzc1MmRGQno4UWw2WFZJUFZLY29MYUxNTXIwV0dQb21yVStPRE1sU24xOE9ubE9keWZhUmZtV2tlTEJwZEZhcGpHVFZ5M2U3azNGMkdiM1dSdVlTbWVMeGRYM2g5ai9jcWJlS1c5bHpma3RLVHBXdDZqbFlCZ1M5YnBCWGg3cWNBSU9vVmhwbjFEYS9QdnkvYXVjM0NGMEZ1MEluM0VDdlRCelRZMmwyUnZaWWs4cGw2VnFaclV0R2djRDhVL2xtTytsVDgxcDB4V20vS0dOeWI2THVpK2RHZDFaaVZkNGtQdHJoUkNZckpkUGVGVnVaMDR3TFFsVlhrMTZzTHNyK1ZnL29DckdZLytCVFR0bkJvRURKNXV2WWZ0SGw5VnBhZGwvem9UamlUdmYvUVpUcnV4TGlxNnhqVmpnTzZuSFJxemttSGhBYktZRlc3SGtxY3A3WVZQM2d6ckNySi9PQWt2K1FuRTBVYmpwZFFxcUd1bHJiM2dhT2JXM1RxZWJFNVNKTEVESHczanNDbVdOdFNQQVhXVDhtZGlIWjdyOXF1NE5VL0ZRTnFUTEoxOW9LdGVsL3kxM2RkMGRZakQyRms0YTlmVE1KZVhhazlwYk8wSXVwV1NGSG83U0c1SVV2VmVBWnRPR2RvNXMrVTIzWWJSKzRZOUI0d3NSSzIraDJjRTg0QmducnZQMDh4RkgreDdlVUtFS0paZHhDcjdNckVwZ2xHTUE0eU8wWU95NGo1RjFjS1RpM2I2eTFQU3hqanB2OWkrVDBlakhuR3FlbFFMMW51ZU50MnlmdmFYc3NTbVprNEpvZkd3WStNTEcxejQvTHhyejBMMGd6MlNrd21hUm8wVS96RWVzdkxneU5nWUhCMUdaUU92RW5McXVUb0xYT0FVV3ZqaUxLMGp0TnZTMzkzdmNSY3J0OEowUjZ3UEE0bFFrMzBZVmZQQnZSOWZQeWFIanpmRGgvbS9YbS93dTZMWEdDSk16QThZN0E1VmVXakk3c2N5d0M4MGJSREpPSnpMMTVaaU02Q1QrK3BzNWhucFI5bXc0cFBmWEtwVFJQNTc0a2wyU2M0OThHaUo5c2w4dmdBL1owK2ZiODlOYlhBbkhOZS9KbmZGUVZOaUlSREY1ODFJc2RjMTYvWFRDOFhvV0pmOGRUMU1vV0M4OGh0OWhzZ0h6dnM3K0Y2Z0tvOGU3ZUlwS1VoUmZUUlJnUml5VzhzSk54cG1YVTYyWnJGdjJ4YjJWdVNaSU9nVFJVbmEya21xcFZRZGREbS9DS3poV0MrMWF0V1Q0RjNRSWxQT0hvR0padDR3UzJIUUpjK3ZJbVZRKzE3allGNE0xdmhNOFNUdTd1Z3hmUFFjYWRMUDhrQmtKNUhFeEpWeGtad1NUUDdobm1ldFBQbktlaVJ5RGRudi9IZGM2QUpWZXFFc2pZNFJxT1p6S0FLajJqY2E5YjB4b3locEtwRXE1emhEaUM5bTRJSitFQk14dHdrVXk3cmR3RzhBUFFZWFpmVFgyR3F4R2s0cEJ0Zm1IaGNTMXAva3E5cUZuWXA3MlpWMk1LSW5Mekp3MmlRVTJXWkQ2dVF5ZzlXREROVTFLc1pkMHFhTyt3djh3U0VHSGhWUnVrWldXZnN2diszNEFlbkRzWldLYmQvWWdRMEVFTGhFV2MycUNiWm4wTGhlLys0UUNYL1FEMU5sdERUZXhuc1UySXpnMEsxQjFWSmpmQVpzYnJFWjJZQnMvdGdNcjlyaUZMd2h4NTQvK0xWNHpDODhZYWF6eEh6WTZQalY4RDBZdzArV0xwUEJXYmFMbWVnYXoxRWVIZ3ViYkhpNDAvWGdiakR0dUhBSFpmaG9nQU43OWpTd1RZNnNITytBcE92cUtDT2c2TGd0NXJmTloyOGptUmJJVTJxbTNod0pIai9WaEdOL3FWMFNVbTRFeEN3ZkVLSWgzTGttelBDVmxiMmJFRnBnc3NPdG9EUVU5cU1CWnFrdmFtN2JVS3hmL2RSak0yZ0xUeVhPK2w2OXYvenBLUXQrT25GK1BLU0NwcUNWZi9xMzBPRkJVOTJWZEI1a2JwcVpwalpZS0E4Q1NLY2JXWVRxNE1xaGh0YVNJMCt3Q0ZoWUVJbklWRWV4RHhQTnk5TFdJMEExZVBlSy9oSm1IblVtS3JIV05WVmFRWkJWTlg3c3h3VnNEL2VZNEM0Mm5TWi9rRW1qNE5XT1lJZzJVMVRXZHMrYXZ2VG5Tb011WkpRbU4vM1Y3MzRxdVdvWTZtVXIrOVlNWWdNK0gxNmhlMEtQSWpObU83TDBwT0VjTWRXWm9jSnRNMUc3SXNWa1BGMCtkZjFkak1yZnd5MXVINENEUXZpTkFKWmE2UVo4U1YrYzhnV0xNME1VZFRXZ2hRYzhNckRsOE5ZV2lGQ3VxNzEyMWF3OGJaWmdGdldTZXpmeFQ5aHhpc25KblFzWHVKQm1TRnNsL0VZb0N2ZG11K3NkSHNhSHVnNy9CWFpHWG1wRXNuUUtnUTFtd2h0bHM3TUZIRllMOUhkWVluS1RocStyeCtpRFl6NFNSeU5RVWVZYkdNbENKS0ljdDByaGhWaEJJNW1DaVBzd0N4Zjk3YXkydWI2TzlCMVJzbVh3U1FYK1JCMUZ4d1NONXp2YWRWQUVESnhzSnVZZWh2dXJUSzIva0YweHQra0ZJbVh2UHQvNlFMaFdUNDUwSGxGemV3VjFJVEdDQlkwMVIvRW0vWGFpclBrR2dVZnBtdFpwWWZDdldxbzhrSDd2Ym5tQTdsTVdUZTZjaXA4VE9HQzFWVVpFNGtwdWtDbm1EU05JYlRnbkdSS0M1VVNXNlJMM0NQV25sRFd5cTJuRlNrUFkzTGJGKzU2dzlWMGV2TkRiZkRYRjIvMkoyT2crdGU5MDlIQ3JJUzdreHFPWVc5S2VDWmptZWdsMFBqVnE0Z044UjZpYnI3L3Vqdnd5M0RCSlZMVVFyeitxZWFucHZDRTNJNFdOc3pzSFl4WlZjZDdZc1hQTUc1RjY4b0pjSU0wcWo1S0o4TXZjVGU4bG53UVpiVTlOdkxpTlh4b3JKbGxaQXBxaVFCeHYyKzFvVEZwOWtMUEFOMGNTZ0lLREJCZmd1L3hiY21FUTR3S1d6QU9qMi9Zb1JtYzhTVVppLzR0WG03ZW1OMWpINGV2bGVmLzVpcFRMU0w1Y0M2Yk9qRk8zeXBMSGNqaStBOEVjTDhSZ1ExMk9aMjlEWElHM2htcDNWcjF4QlB3WUZPdGY2NWpVelcycjFSc0pMTzV1ME9ubVNKVXhnajhxZ1drUndXNWI3enNsWGJoazllWE1Kb3VyT1BRU04xZ3hTaTJGSFBkcDViS1FoWDJkVmZUaGxkaExOSjdWUEJIUDJpUityeHljZXN4cGZpcFo4WDFWNmJUSEZVSzUyNHJ2YjJXQ2xhK2p3WDlEYjFHM0NsNWFYZXpSNTFqSUwzYU9QVGFPZFZmOS9SVjhPMHcxS3JLSElIVDIyM2IwK2JxcGFWNHpJSVJiS3pUOWpzOGo1ZnB3ejRaZlh0bGFYUjFGODBFdTUwT3hZcU1ocW9rOFQvanJWZ0tveTVrMWhqakwza3Z6aHpCZThBVk11NHgyVm9kQm9sYzFZVzlETzgySURXNUlHSkJLd2tQQTZmMDBLQldBS2I5UGlwZDltYkV2aFZvVy80b0JFWGlEYTNKTkkzOTgwSDFvaVgxbXEyclFIUXJCYmZaWVMvTVdiNk53cGhuTHo5Qld1TEpBVFhiV3ZDeEtXZmRrVDVWYUFPOHVWRVZtQkYxQlJJYmRBTk5wN2Flc2Z6UnpuT2J1RkJGYUsxRWlzNTM0TlFhRDI2WlExZ05jNmI4K3ZlaXpGWTMxckNyTGRacWxwZHA5bWFKRUN0UnlrU3ZZRlM1SHZLT1RzNkFLQjBsRGtTeDhwMkd2M1kvWlhHUzJaZEtqTkp1S3VnajRQYlNNdXJBMDBYVG50Zk1yRG5Lc2dJNGpyZnd3aGdnMEpZeG10bkFFUjFoUFR6U1pUVUkzMmQ0MGw4T0d6c3FRaVpFcDNNL3hydXNQRkNzMHFUdzZMSmdyRXU1cW9mbUhSTTFBNk9WWkZ6MmdNYVBFekdIZ3NSV0I5NkJ1ZEQ4TGhrK1FuemI5UzhoMGZyQWkzN3NRaWtEcm0wWjBpSWJmalpNQmkvaDF5YlZhMjJOYklZSzA1SW5pU1BCU2hmWi9KMUZyYU8xMy9YU3BhSXFrNTBYZWY4YTBHWHZxQ2tjbW1VcTVmUm9LSzRudXh1dzEzTktRZUFnWlNtQjh6VWNSWGRTa1FHYllJWmtkTzVhNUVBeGtwV0FnRTFHQzkxWHdlTk8yRVdYS0tUSGpkY0JJV092d2paMnZQU2FVVkF5V2tpaUdab0xvQUR2b3ozbjRXTm1FaVdEMkw3SktmSXZIRDB6NWtJZ2JhalhHYm0xeXpzQmY3WWwvNEV2MnpuZ3VGcUZTWjIrbmtsTXN3Wnk3bVB0aklXN1pJSENtQVVqRTNhUkRzNVgvRnFJZ1laRjFZZXBaVmtBc0VweElNR1JLZURZSWV6VWZCQWx1ZkNMWFdsZ3c4eThQZi93SzRZL2dmdC9sODJsZUtad2ZOMUZQTlVpUlJPSVFuYWpJZVlmcFFSSjhUL3ROZTJucUVjaEY1aVhLdjZHcTB3RFRpeUhZSTZBRUZGa0dnMldOaWRjUXlNUHBNdVZYSzEzcENwWDZ0WXYxQXZOcmtmVjRwMXhhNTNQQ2prbVpkU29GeUdUYU1jbnRCVmtHS2hrNURjODBuWVlERWRUbHlUZnRxK2Z3b3FIZ1FhRXlaUFE3M0VGay8wWmF2c0NOTU4wM25PU1VlZng1bzI2SGtTYnllM29EQ2JIdm9Va3NISUI3U3VjWnVGWktjclNTeDNKV2VBckF5Mkk4K3ZUMFBMdVNMVTdiYm82RmtneHd4WjlyTFZoYmkrb1ZQVTZPdU56cm1ITGI5TkkxUnd5VVVhcmhPalBjeFF5SkthQ3piV2dHdlZGR05KN0RicDhkMGo2Y1paZURqQjM0SDVtSjI4bVA3U0FKeEozYXQwR3NRRVJCZUMvMTZjTGg1VWhpc2lZU1NiVmp5ZFNtTUFtNFlZbjdVSktzL0tLeFVTMDVIV2pkemt0RG5nbzN0ZkRSRFh3bEwyZmorbXhwbi9CbnlxcGdYZTE3NkNTWDVhbS9uT0FyVWQ0aXpEQlRVaURuU2Q1d0N4R1dLU1htVjU3T2x6dWROeTkvSWc3L3Q4TXUvTGh2ZWdoSE42TisxblB4bUcxUmpHOFRIVUF3a0lHTmZNNW1XT0tsWCtON1BLall3bHVkTGdmeGxMTThWYnp4STBDWko4aWU2TFY4ZEZMT244OE8vVDkxN25JN2d6U3ZVNzVkQUo4Z0RkOXVoMTlDWG1BR2d5L2RoTGlKTktXS1F1ZllLek91UmVvZmxuU1R6aXh1eGxHdGlXRmQ2NCt1NGxkNk9VV2o2d1FyY3BncFBCVDVJUi9qVTJja1RBOHBQYXBiYWVHZVZsVUxjV3dOMWpDaDVucHFONFdJR3dabWYzRGZzOFVCNHFPMnhsV3FlWUl1OGEyUUoyZDNXdzdKYldaOWNta2xMUUxiQVdETEkrcjVIZjlSQk5IT2h0NFplSkkrVUl1MDl4UnR2NmJJT0I5L2pIUkdOVHlhcDdXZVBBOE1zMVRTem9Dck8wUW43ZzBxQ3IwRWI4M1lrR3lxK0pJTkg4TjZnZzgyamZqUDNJdnpTUHltbHpXSEl1RVVMMU13d3VsRmowakw3NHZOK1hxbkY2OWllUHBFS2dUQVE1MUh6RVRoNHZvUWxMc3hvYXhpSXhRMGFQWlJVbDJGNFNMNFd3eFNhc296RjhpSENaNkx5TjBZNklNU01IckYvaEk2QXdRdG50NnJwTDJJLzRHeXJNVkRvMzRiNnZ0OHdjc0l1eUUvVFFTbnVOd0U1UWNjbEtYNmR3SjlFNldIanFGUWVwZzl5U1NhanZEUTh1WHRFb0haUktRMGMwNWNuL3Z4bzRjUFZ4eDJaOUExeW9GM0lRZDRFeUtpTXFmSUtzZGdPbmlTVjlvOEwzOGF6MG5qMFVRZ05aS2lScTZtT2tEeXVxMW1OQ3EzQ2x5K1BYdnU4WGhJUksxb3VMR2IyZGRwTEUxanVUL3Azb1VMRWNDZklUb01oTHBxRVhOY0x6VytCK1V2aDIwUUhhV0g5ajIxM3RiTzFBQXA1WU9vcFpUVUFvaVNvU2hFSkIzVnNWTHRHaUd3OVludmcxQ3N5NnZoRytuWllma3FRdEVTYWN1ZmUvdk56aVNnd3hwSjRjQWZ5VzhrcGJBVkltRGdqY1kvSkx0dXorbysxbW5iTkRxeStTY2xzWlNOUEZmSEJKRkl2eGtvTFVaMDlUckRqZExzb0lTTCtxbjUzL1J1bnNTOXM4aHo4UG91SWozcExlRXFlRC8wcWZsSWt0Ny9VcW53ZEd5dGhFVmhzeGVyVFZHWkNyWjBDa3VGdERHYTBkUDZMWFlGYTdNbEVZVUlMdUdLUWYycmN0b0laMHN0RkpHUkluQWZVUjJOMW9PeDBZaVZ0NXdibldObHJHU1o5QmJEUHZOUm5iUFFqTExyMDYwcStMOHg2VDlUZSsyUFZWc1JMZHc0cjM0TkVHYVVGRGFCRFpFL3BNUnBBMXQyODNQZ2JOdWJTMC84SjdpTEl5VmRYVVhMYm05NDNVMWtwUFpOREhLN0tPc0RGd0xTVkx6S01FSUE0N3ZlejNDdFZneldNaVNhN2RlTUY0aXgwaHpjaklGbVI0UHRLR2IxeGlhN0lCSTFFMFliQVVkU2NMTmtDQWx0NGxueVptQ2NzbG1BdkdqMVJ3ejBQMjdtekFnb25lR2Jvb2h1RkRqRlVHNFZGTFNxYk1zeFE1bzFmRGhmdnl4WHloYWlwZUFsU1paT1JicElZWE4xczZ0ZXFKY2kwZnU3aTlZUGJMOG1zcFEyaXZ0eUNyYTkrelZENWVPc1VCaEc2S0FyTHpzdjk1bEtPYWhadks2bkVuQ1NhTFNxSG12WkJNUzgvc3crWWRMQVVWbkZZRVFBSmxXR3JmcDF3QlQwYytINlZmZnlUNW5sQndkUDZSQ0ptaVVMdUNLNVFnakhXdWorZWx2V1R3QUcra2VqM3RmVnRuSWlOMUViQW1lTGpJOUppK203Ui9hYWhsenJndVJkNGJ6bHdXTklqZHFTb3NUaTR3Wk80ViswZGNOUVVyM0sxMG5IOXdqMURBci9qVnpYKzVjUGF5OG56cDFMOVl2bjZMb1Jpd2hFVUY1eXBsYi9HR3QyR3prYWJ2VmhBZlVuZHk0bUc3VXlkaExQU252MnVlK2xvcUZHeW12dE5vYTVCd1ZVdk9hMUVkaTJZZCtGYkRmQWhqOVJhSUNITjcrTEplR0Q0YXJ1dUJiT3lYM3pSSjg3RkJsOU9HeXB3VDlaRzBYQkpjbTJBYjY4ekJacTJnR0xkenM4QjNDY3BVcW41QllyTlZHMU5nOE5lL2ovVEs0bDhabW51MWdWRjljbHBCdnpzN3hNbXBYY3hIcmJwSHNEcTFzRGl2VFQrZXJpNndmR2RLMkpoQkpwL1JaRmxSWGlBNVRGUGtpSDI4SERmK0kreHNwbkJUa3NiSDhLdWhHV1ByYmlOSXhUbkFtQ05XWXNjdG8rM1dsNzQxdzY1TWZrTnByOHpoZGY3NjVrUHZSMWx6UUxJVXZCQkxsWmM2TXRXQkphTE1ESDh1NWxZYm9RWkVxTzZPVG5oT3NVeUJydU1MY2pkR2lxL3VLQ3ZWSGlRbVNuQ0l0MFZKSzZueVFHRmhBTkduamc5dWdUZ3NhVXVGSUw3V0RVbk1qaC9IcHc0eklDQWdJQ0FnSUNBOHYyL1JVZnQrbTIxOVFWKzM3Yzc5bjNOWDdTci9oOW54ZmI5ampnZWkzMjlnTjl2Y1E1ZnQrbEkvYjlXRG42Zy8yMzdaUDh6N1VyOVNoMzJmWlQzMi9ZZDRIcGY4TzBDKzN1cGNOOVgwQUY5WDBmR3ZuRDMxZlh6ZnMrd3EvVVRmN2ZyUjc2dnEwMTlYVjNmVjJRQTlBQldvZGVMRFc2OHdURUlYMnhZVjc2dWtsbUdnUWJOK3JTOGlKL0xwWmhoZVBaTFk2dVZHWG12VlZiRmg3dzdPNVU2bi9FWVZuMlRQRUxTQ1hPSkxuN2l4dllxdGtZRUZMT3NkNnVab1Mwd09mbDNnZFJCTFc1MUo5SFUwaGVMb3AzZ3hudGtmRXB0bmdpVnVneWkrMUkrdXVRTyt4aUV3NDloZjdOekxaOEJaUDc4NWxMY090d2FvWk5IOC92eDhjL09qampOZXBUU1lqT3o3TTIvbFVoTlJhQlVsUFp5VWJFVllVd0FiTFVMMGt6N2s2bVJVVzkxQWVvMjkybU02SVNHM0N1S3V0ckhhSDVCZXAxWExSZks2NURjVVdPRVVYVUtIdVVSOUlobDRTRUdzVFFDdlRjV0dETzNpajRaeHo1NW1mMGJNTW5lWWxNaFRqeGtPQWpydzNVdVk1M1Q3bzNXcWFQNnpWd20vWGdXaVZQTzJDc2ljWm1TSXc0eWRoVTFmeTNsdDVTRWVwWDhMVHBLSzhNWEs2ZzU3VUxQeXlyUHFCcTRQUUpYa21LdHJZRVE4WXF5bCtqUXBTN2IyV0l3S2J0ci8weG94SHBvZ1k3RnpKOGVGWjhwYm1IaUdBVENZMGliSkxwaC8zdStuN3FyVkdwU3FOclFSdmlUbWEySVpMUDg2YlZUeTdHazBsRzlGQWJKc29xeHJ2OGpLZmNjSXpBTlAwMGx3TTZ4aFJveWJ6R200b1I1T3JIbDVtdlc5MjVvdEJZbnFLVVhhWHZmYXdvSmRYeXo4NS9TT3JFb09WNlhpMm5ETXYwSk45eTFkUUtaczRYdm5sbHV5TVFHbnVTN0d4T2g0djhFRUZlVnltWmM4c3J5dXdISVc1SHhnaFU4bStxSENHN3pmdWRwd21ZVjlZMFErZDlham85T1JNQklybzl4blV3eXAzbHlrQnZwZ3pNWGpBVkhORGlCYS9wTGJKUlM0dCtpUDlGVWI1a241QWFNTG01dnAxODFDR0J0ZjR0VTN0RWtpSWl4WmlDT0l6WTBacW9nSzRDYXhuVGYvZmNoOC9UYmtYTHNUNnVhMnQ4MUR4L1ZSUzdYcHJrWUZMRGpzKzRHdUwvSGE5SzZ0cG1qcDExemhDSGttTFRSempIZStMMnlQM1U1MWhDelladi9mSUNHT0RFdWlOTk9jY2lXRTlnZjBIV0VZTDR1UUhuM2E4V2FzVUF4MDVFS2hmN1BnTjA4Q2FCLzNCZHlsZzF0VW1LNWpIWnRDTnlPeTBiSFRNT1NTaGJnSWJKTUFJL2s2aXRTUmxKeUJZMUhsQ1VnUzQ3QmlyZHd6MlpnQnRYaEY2NzlIcUc1V21MNnZtMEVpd3ZWNkwzbXVVdi9Xdm9WMTljRnQwb3RObDhTSU5KbjJBTmRFWVdMRVlzUzdQajdXc1BqdEhqR2RUbmNEWUt2T0dWS0xuV1NoUTNOV3hJVFJlNEVqYXNFMytPS3BpZHQ5eUdVYzF6Qzc0LzFYdjhBNHlMMFJ6cmRBSmFOSFZFbk9BOWZ1dEdGOHdTcGpjMHdpVm1GdHFxd3Y3SG81Y2VGRjRJTllrUmpSTEpobDNJc3UrMDlCSkhja3dEbmlsaHZNdFZ0bWJxTklsamhHazhUZGwrNVZNSEFIaVcyZTBPNnN6eE1tSm5wMGROOW4weWxRVG52Q3VXbit6RFAybmdwUTJxMk55elJxZHF3UFFET09VdDUxZDdnUGc3dGQ1bHNJSEIvK2puVnppbC84Z0hFcnRTclhJTVZBK1UzTHk3V01nN0YzajNLa2FCWCthREdNY2x2V0h5cUpNNlVVK0t4Wi9KTWpNT2k4T3JXdTBMVENiMTJ3S3hLajZPZm1RU21TZFFwRmp1YzdPY3AyblBkUDFwaWVEdTRUMWRKZTh2Z0F5M1BFSHlHY0N3TXg0UUtBWnF6SkovZDFHVXo5TnVtV0RBN2o5UHBWSit6Wk5VbXJxWTF2K05VdHRrdFlFZ1RUZGJadnRzRHB0OG4zdmtnMDBMRkpMa0Z2Ukx0c3RoR2RJMGw3SXFaRFZNM1dZa1VPVG05cDFabVhtQTdrY0ZmanJtb1dVcm9QL01NejErbmw3K1JjWWRnMC9XNWdQY2w0bzN1cGx5aGNhQ1ZrTFZBTnVzazZWM3hLek1WY1dOclI1WHBjODZBMTBodU5zZldmdzBLRlZxQUZwalFzVUI3RFlySE9jY1RWWldKRmZhbENRTVloQzBaU0tEZ2ZFVis5U0RGN0NlTTJtTE5xZ1NpdlZ3cEIzbmdjVGlnS1IrZ2paT05OejRRdEhOSCtMRlBhRU1TQzQ4c0lYSVRKV2p5SVVlMkNCRnFMZjcrQm9ROWo3Qjg1RkEvZHhvTlR4b1l1dWJEQ0pxckdNTmdLMnpmc2NzVUExT3MwVjUzd01HVCtOUnZ2NHBsQjQvc3FOd0FYcWdTQlBWZGNqZURudWw1a3hUYVhDOWJiVDMvVXE3RlBVVUJCdGh4SkdPcVFMaWFGUlBhaHZPc1NFcEtMVUhsSWxQT1ZQbWZxZExaUXhjNkl6VzlwdTVEWFRpQzhZQkVUTU1XR1JLK0J5cXkrdlU0QTJkU0VhaUVXd2RqREZ3ZnhUOURwZWxGaUw4M0hNNUFNRG1LRkQ1Y2VjWVFjTmIzdzdSNVczOWhETlNqU21JamJqUVBpVHdaQUZRNmIvRGhoNXc3bUl3MlkrNTVkbjRMU2JhZkZxZFQ2Mlp0RjBDNHVIdlRlcHpQUnRqNFVpSmNWcnNMam1ndzJRYk03NXNvSW9SNFpOcktlZkw4R0ZKQVcyb3pWeDM4K1JJMzdsVmdNNldjTEgvbkhqODQwVVgyU3VEUEZrVEh0N2p3cjJheFUvMDFWblpseFdvRGU4KzVEMEE4UndLc2RQNGY1NEUyM2taK0xGMWNrT2UyNTFJZWFVYTF5b2tvOGVWUlp4MG1rSUVZejJzNWVoQjQwSG9oSEE4emlDNGNVZmJwMkJYVEpCTkRLYVBpVmk2OXNHZkQxcktuQ1c5clR6cUFQVGJFekF3Yll6SjRmMU1rNm1MMDBJQnZoSmFCMUZJQXFpazBNMnFqY2RydGNHeUdLSnhtUkdSRzJNR0RLamZqTEZnWVA0ZVgwN0FtK21PNFVUMXo4MSt0aFJBd3ArMmM4QTFFaW1uOTdQWUVRa1dUL09VV3BwWnpNQ2JHL2MxRmZhMHZhczZYUzdiRDI3SWNRd2lMVldROVZHdFNxWmRUTVlFSDlINVBRZnEvRVJ6Qlo3YVhaOUpuN0pjMTBJOEtzdVg5RTRMUTFkaWpsNG83eXNMTWFMOUtqYVRnWnZWM1daNVFzTkZxUzZIb3c0NDlVMDRmZWZuVWxWREFUTmI3eGtLcFJZUC9SYnUyNzFsTWEyRzErNHhjUkh5WTMrRDZidGxSMThmVEZiOWJvd1djYS9hbWlmVEJlWEJiQ2NDL3pDUUpVLzZ5Ym9peGhGcTZBUWlhTEJxN1E2NEJ3KzFOczZDU0FJRWp0U3lRN1EyK2FnOE1CeDFJMVhuUENDamxTRWYvUExIOXFNYmlGVi9JWDRKY3RLK3dIMVhpcStUdDFnR3o0U01kUnRoMVpzRnBQdFF2UjlJT1F5bWJ3c0hJN3pramNtZDA2QWNrNldITzRmc3RjRW9vQUNQT0JEc2RKVlpLYzhGM3QzbUhRUlZ3RldLRnBmcjZuVmNQNDNsRzA2ZUh3QTlpSENnTFNSRGo2SmE0QWFzOXpScDF0Tm1VcmVQakFzcmpXRkRmcGEwOU14UzJYS1BqK1lZWFlOTkNXVm1RaDdCUk9FdldscU1ObHArTXVONEM2YkZZYklXR2FGMjRxWXJ2ZURnVEp2dGluaVJtQ0N6WFV4WFlwYXZJTzQxUXIrekJsdys4MjhWaTV4L3BsYmhWeEZ2a3ZVNmswS2RtN2h3WVJzRlZ0S3BlNFlXVTlKMUVicTZZdVhwQlRnNUdaV2taWk5TeWxiQy9PMG42SjEyR3V4Tkwyc3A4N24zdWZHVnVQVThBTkhlUWFhSzFjKzkyZ00xWTc4MW9oZjBCaThvS3RpNS9CWFBqbWlES3d1U0RxclVxVU5mUkRtRU1NblczY0YwN2FrbWVzNHQ0V1QvaGFSQ0tRWnFqV3BXM0R1Ly9PV2tBQ3pHUHhydkRpZlp5YjEzcUFHS0ZvVWNVT3hYWHlEcUNZN1JSN1pZZjZrRVAwdnlRZmxQdDhoYTJKa2N5Rzl1QnVOWkd2d3A3ckRpeTg3S0pKR0RGdjRldHFhbGlDV3lKeHVUN0sySG4vQUlucjdwb3hUU0JCY1c5SlE5dHp2WlRvZXg5bUs4dVhaOTU2TmZRNG5iZjNkRHZUNCtydUpaMjFKUjNmdmUyMWRSQUt0aEEweGhkMnRmdVYxY1Q4QWs4Z3hRUmFEZE5XVCsxaUw2WTcyaGYzU3dWd241UXhIK01ja0h0RkkvcWtYSGxIYzJrbm1KeEZ0bkt0Tms3NmF2a1hyckJzMEw3d28wdE9ON2dQVGRMZU9pSnJ2UGx2RWllV2thRk1VVzNsa21veW1RVC9saG1NeURnYndHYU0xaVJyZGxHM1E2dTRaVnM0ak93NXB3QmZSdXZZRnJlTkEvYm43cFU5Q3p4SE5YZkFzejU2MnBLUlNHekNiOGlVN3JZa2NOQUtUSXNHWnRveTlVRHJNWFhRZ2RRSEt6VG9nUUdYT1BYamovd2szSXhFK0lGdkFnYU5JcENqT3R0ZVJlOUhsVkJMcUhWT0R0cm13N2lWRlFhK2t4Tnl4dVE5T3dPTW1IU2VKc1d5OW05RFh4MmNvejB3MG9iMkp2WEtnTkd2UzRnd3pvQVNJbTBsMWtFQ0c0Y25GUU1LQkxBYmtwaXhWV21DQzBSYkEzYzg3ZTllWnZxTzVxOUlTYitXclF3TW42VEZmdkVlejl4aTdNazBIQ2QxS2dkT3pmVWZzd1krcDJlRnZaajZIZzVJVzE1SWN5Y3RLTzNkaW9VOUlQeG94ZUJuWXZ4cVNlUi9NZytNVGh6U09qeUJObmxaV0s2RmZHWFRMWEZCbjVUenltMXlVWmdkdjY3NEU5a09zWEc1a3BQWHc2a2RMVVMvTmNtcm1idHJoZWVzTmh5Y0h1M0FJYVVsUUtNOENHQm1ZVE8zci9lNG9iVXZTUUxFM09Ha0YySEFtbnB5QkZNbFp2WVFxbFA4ZVRyOVMrU0pSVHcxOGZHdVp5V0hSNmJkOWF4T1hraWkwYXNnREk3WDZWMWlZWmZaWVJjcW9wM2tHditxL0tSWW9ScXVKdjRkbkVPUkNqbTRtTWRGMlR2MHNUZkRIS2xoSldEbjFEaEhSWkw0dTlrMDdxSFpJaWxrOWZ3ZDhqcGdyT1MwRVhDcFdEVXFDR0NQV2o4MUxObXFkcTh4QTRCZEpIbkxoaElXV3ZueUZ4VFFNOVNSY0c4TlNVeFlWcnNBQmxUM1I4a1V2azBSYlpxSUFTYU1lakt4WEREUkZBMFhpZTBBWVRJak15bU9LYVMxNGxvaTZpdkNoVHBqNVVjYlRTdW85MFJnc3MxTCtGK1B1TVllVU1MLzFtS3ZoOEZJcGxlalkvRTRkaFlROEZtMDhMSXRIZzJxZmVKVU5SRVpaM0ZCTW53WmRKMmpDeWQ2b2U3V0pTNzh4cm9CK2RkUG5aNUcxd1I5VGhpWG5zRm9uK3pqTUdCTlJYTnEvb2grVTZnbTBxbG9TVXc5Z3pqa09NN3dHdTlJUithWEpOZHZxRks1WFFpQWwxTWpEckpBcWF6R2VYTnJNYmRtMWtZZUVaRVNMb3M3aGRTQ0NNZmdWM1cxYjcxbitCTjZkNlNMaTNnVEQwa2ZwOXdVbmZqTExUMG5Jd3E1ZTJlWVdMdGZoVEZDYklzb2ZoUURZczFSTkVwQzdReGw5NDhwazF3bjdTRGF6VEJuVjFnS3c5VGtvNnYzR1pwMEJ1TURtMmN2VEw0NFZRSUZXUUpmR0g2V0tsM1FrNDVWWW1tMkN0WWY1V0RXaGdzdC9kajA4VnRldnlad2JLVkZNOXltUnN4RXB5WXVoTk5wMm0yRTJ5TTJrT01ldGsydVlINTJRb0xIMEZ3bHFJM3A0T1ljUGk0NE5KZ0d4ZTV2L01zRGRkMGVOSHN1UURCQ2RHK2hsQ0FRSXVibWgzSUtRajJUV2J5SlNkdjF5cWJ0bnFiWGxHcmxUNnQ0bXUrZWxMRGNrMlAwUDg5TUg4VDhnQ0JteUVFN0xBc1FMaUtSTzE4T2NTR3ptQWhQU3ROODNHVGp1TnRseEVSNkk4MytTUlBDVFlsckZHTzBJaW9BRGtrS1h1UlFxcmluMENhR0dUdUpWbzNHSXM3RU5Uc082V0VPbjIxNDd2eThjUEZoZGZYSzNnaVY1NksxR3RTQVRwbWdQRU9ZaXkyL3QwT1JvNWVaYkl6TVJ6THJ6WEpHdDVoQ0NET0pyQjVROWhQZGtCU3pWc0VSOU1LbWZjODQybWtoL3djcXZRbmJtbDBvYVZ1NHJjTUQ0S04vaS80TXYyVHMvbmxMMkljSlF5UHpRNEs1NTNybXc2enhpMGVmenl0WTduSm4xSkp1UW82UW5WYmk4ZFpYcGEzL1g2RDNVR0dLK1lPWDR2YlQ5aS92NjlGbldHMHkvSXIrdUROMnM5QzJBMFh5SHF3R3ljdmZVRDRRM29UdkVuUmFzQWthUXhUYlNVL0FGZ1JtWkpsa1Iyd1FaOWtGNE9MVzNkRFBJNHJaOHBuTlJYTFFFVmZmVUVCSlFqb0hVZG5vTk1kbTV2Y09xYUZtNmpRR3RxRzVQcEsvWnpXQXVwVk56bzYxSmtiZFhrR3QrNyt0aFBHYVRmbkhmRjVsSnlWdm9xdW9vWHJZZlZvcWhSQi9WK0VOcEswTDU2WUplRWNOR0lQOHpybmJ6Si81bTRFaWZ0aytwNlRLMHoweEUyeU1wMyt4ditFM05RQlFQeFAzT3oreklrTHFYaWhsemwwZ1FmYXdRRVhISjg1TTcvYlVUZUpOYkVWZE9pYW50Q2ZpcEZ3U3FEWnNrQ3owa3VSUnlmK3BWQko1TEFnZmFSd0dGcjdPRDBQUzFReFJnRVl1VEVnaGtCci9HSUMxTzVZeTlVcnVMdGRlSEMycy9jSkFXaDBnSFFKWlUrVWVIVWl6TWxJNkxER3FRSkJ0ckNzR0t0YURUTFh4bkZweWk4RFpvbU1HQnJRY3pkS1pkMXJhT0dmRmFvczhONjF2a0pvUlJWQ0xDTmw2SXdlQWtCdDZQOFh3ZTZGRW1sVXppRWZNSmNaVUowNG41bWdJWC9Mb1FSTHNtNm5zd0duNzR1S00vUlE4R2Z5VmJERUFCZUJzV2xoZ1draUhodzkvYlNUU2lOcTEyYmM2VjBTRTl2L0I5UlJuVnRjd1ltdHdXOXh0MWJNcEVWOUJNMDc2ZFpkakRhNGYxOW1TdXdBRDBxeUVaTy92dXpQSURoV3lRRUswS2VhZXZhUnlnMVpwRFlSb0U3aVpBN2lja3JsbkJabWh3WHZvZXNLVDBid1NRWGZMdnhuNU9yL2V5SWNoQ3BIS2YyQWNZbHJjOG1QZ2FnOVM2ajQxaUlhQmtMS2lOeTVtSUJ5NzJYWkFmQTduOU1qc1lybTBSYnEwMHg2aEJabm4rQ1ZYbHZsNmNORHZwOTd1dTkyUzArRXZFcXBRc3RaV0Y4T1E5YnpBT3pXQnV0eDdHbWg2OTMyaUpDdlh5SXV6QjJPZUZlL0VXR0V1OHR4cTU0YTY0MmxwZ0VoUGtuSlZSNTFXOUFMRkpuWjBlQklqZEg1WjF1UXhqMEtUS3RJNi9nQlBNdytYdk1aMFlMTjFLTjYySTh5bG9oUDJZVzd0UGxPL3k1SVQ5TVQrcXlLb3hGdFNkejFjcjB5UWNielpyRWZDSy9Yc2JqUVNsb0tnWXJJK29DZlVWc3U0S0VzdnRzQTF1VDZIODI4REJPSW44R29MK2ZqNkNjY2pyVHE4RUR1UXNJUVdMQm5zR1FWUDFNTXpBbXBOK1FoamRRaC9xM3YvcWNqbndWaHhHOHp3LzhRVkpna3hHUFNROEFKdEFoQWJlMDlZZk5ycTliWnRsanA3dTFqM001aURWaXBrOXdHUk5FVVZxNEc5Z2hycWx3Y2RXd3VyVi8zUDJzZnVETTlRRmcvb0ZWVytodlRaMGNvaTZOMGxkVW0wRmhibjh6TUl3K0JsSExHcHEzWFZwd3hZTWQ5d1FBNGJYOUlpeEhzam5ZU2syd1VMOWVTbEtYaFdUaXFWM2wwWENBSjhTbEtWOWFoRmNmbTlUZE1mekp1RUdyeWc5NnpXbDk5OHdpV1E4NW1LZmZxeXE5SGFHYnVzcTZTVzdNWkJuVEFtYThWS1ZNMGliY1lycXBvSHBPb2dmWlA5THE0cFliTnZFdE5SS3VnKzJlS0lEY05LbjJDQ05wWG12bGszR3FZSmVQN21CZkxNZ2FjRzFtU1lCenh2bUJzSm92b0ZGb1Z1Y3J0V0ZnbFJGTllPUzRVM1BNMWJrVElweVJEa1hQcDJwNE4xOXNtUnhIOUJkZ3JBYnpIYU5tRktyZEptNHhuVFdPeGtRVnZDK0U0OHQrZzBFbkd2UWVQSnluYWFBWlk1S2F5dEFlcmJzMWRBTldnQm9PcmVkNVhRZWQrbEFzdW0rV01BZXgrK1EzSUlnd0NxUUxMK3V3cVF4bEFaR3VqYVN2eUI2ZFNldlNEeklRblhnRDBSVk5aZEdlTzhlM0RZVTBsamo2SzNZRTltK1EvVkwxeHUyTGRwWTQ0MFF5V281N3Z6REwyS2VkdlRPLzBPT29zWENHcVh6QnRDaUNhQVpZc0Z1cStMSDJuL3pnd0FIMjdXWmt2ZXFyWEVaRnhuZDA1dUI4V3JFdk1KTEJwbkdiVC96MTJSRlJnTG5sd3lXczhpaVNsNm1oTE9zQ1JKS25QU2JIVDhJTU84WmN1b1JvQXNRVGxCaWlzOFVQZFZ3Rm9JYUxZV09idC9sQkxaeW5SRWo3cEhvSllWNldTMktacVFKSnRFL3BsYTB4L3czUnhJQyt1YVRUVkl5YjhacnlvOVZMMEtiR3NvNzc2cVlINWVvMmpUWi9tQWdHVW1TUTJQMjFiZjNoQzZTVXk4VytpTlpwZ0VFajN1dFJKVUNKWXRPcXBjY25MVzhPWEdzWm04MWVOS2owMzdOTjVhNTlvYm1iUzN5RUFhS0VlRFhPbis1Vkxwek1adjJ1L214WEhoQ3hXZVRmY2ZtOVJDRlhrVWR6Wm92NXJ1OUtlMWFCR2pnNkVuZzd3ajI3NnBaQkZJOXAvZXpoZkNicXMxNm82RWRYekRrdGhhN29TdlRtZXhobldJbktjYmNKTUs5T2tZeWptS3dPM0l6enVkM0I0WHh3T0Z5eHlSbFhHS1hiVU9La0liZXdEYU8yWEliUnNVaU12OGJ3MEcwL3M2ZGRpai9rbmVzS0lHblJEdExRWit6a0lQZU1ubysxUnV0U2o2aXVSOHQwTEtwN0hMTERaNXU3U2Yrb09UVmFJVGJ3bjEwYU1ueWtJU3JPWnVWZkc4dEVCRTNHaHpoSGtsWXNMcDR1QUpTY1Bsc1oycTYrM2c2Y2FOTFBwK0dIVlpqUWNZU04zSkZlVkphTFlHTlNRTWNydmpidnZYOEZ6TDU5cDNWdXF1cHZwdC82V3JwWmNBWHcrNjNnbEY2Yi9NQjc3ZjFhMUJ4TFdCb1lYRXhHckZOdU1SdWFxRU9QbGhYcTJWTWRzWU41Tk9tS0kvTEVYYmxLM2FIazU1L1poN1M0Z2ZWYkxFWDBnckpzMkE4aEhaZVFhTWFlY0JibGFKRENiT0lUVll3cXppRkNuNTlXeDQzU2g2ZmtGcDJLMC8xMG4rSHI0SUNiMk82ejVoRTgzV3ZhaEl6RWdVNnB1OFF0c2Nwc0FsMzYzTG0zemIwOUdJaFhHd1lySnpnUUtrWWVJT0FlbHpCdFU2bUtPMHVRTEg3TENxNFEwOCtZNWVsdzBadWljbUUxTTVLQ3g2dzBDQVRwR1ZFZVg4dE8vRHVvOFJBVTZOY1F2M1dacUhNa1gwWTJVOHZvL2JJdjVqYmJDK2QwbXh3RnlmTlZIMWdSdTl5Y3hLZjgxNXBEcUd1WWs0RmQyTTd2RmtDNU5XN09ydHM1UUhsMmdab1hqYUFOOUlJMTBESW5vUDdqcE03T2tjNElGditMeEVwNVZRZDMrTXhGWXRSekI0eitVWWhTMzdia3lJVXUxVjh4Zlp3SWxFSTFCT3dTTzZiWHhZRjlYUlpnbFhTV0dUUTNvelFtNmRaaWZlUWJjRnd0MlhER3VXbUQ5RlRvbmttQ1NIeXBaOFRaNlVIK1JHNm5FQ0VaNVRBU2ZhUUNCblBhZmcwWk40bzFNdllROUpva2UySDloWnR3TXRhNS9Zb21EQUxZZ3hEOFhFeDRZSlIwRy91bWN3VFUydXVvZ3JxdkkrbDB3K1JPTk9UZWlzUnZNZTFnWVRWKzRtSkNhdzdsN2NtV3VVRFAxaFpEcmdEdmM2SW5vaFdjVUQrWmE3c01WVVJLVVUyclBEckwyazVSbHIrb09PMndKN092TUt3cVNsRkVOYmxaeEdiMGJEWDFVRTBEV1RzeWdGTGtyd0hOQjQ4MHpXanJYVVQvcWMwTnd4M0tIOWlldldwODFXcFNPWE5SdjJTODN4aC9XMFVOd3hzcHl1aEZuZXZEZ3pXb3UyelpmRkNCOGd4cDlwdmE2RkVtd2VReENwcXVYV0tmNXVIbXBhUzRpa0lKQjA1bERVUmQ0c0RNMTBDQ2NrUVRKM1gxNzVLeFE1RXFDQVBvZFYrOHpaaXVUQ1YvNk5mR3F5ZWZqZkhqeW1RWGszUkdvelZ5L3REeXJpa2V5cFhoS0tDOG94eVBGRDVLUnB3Sm1oTTNVUktVY1Q2R3YwK0lpKzZKY2tOblJMRWo5QlQ5c3J4VnpFSDZyNTcxQkd6UENTWC80M3JYQ3Fldk5JM2NiL2UySkFDRW9SVDFibVdsWlJyL2hXdHNmZXZzVFdFTG5nNnVKTzRETk1OcitlRzJIR1lOM1g1dURwSEdjb3FUcXlZbWtMZ3dObTRtakkzKzFYZW94dHdJak9XSGdxZ1ArNnRXeEJ2N1krREVxcWRTalJqVXBrT0FjcG8zNTRBVFZmRjlFVjBDRUUrbUQ5dS9Bb0RtcGQwMzhOVm9xQ25sMEpjVmJjMHRrZ0h5OE0yZzFpNDdFMTBpQ1VhWnE3S2QzMU5xcXNqaUFwc25weEkzUGU5cEtUNVJGMHMxV1pkb0hsWlFTcHZ2NEJQdnAvdXo2bnVLNms3TTNTU2gyMUJZNUkvOGdMRCtDRFFCMFhUYlBTMmFnNElnTE55eXpac0NXY1VjbC9aMmFyRGV0N0ZFTXlIQWprd25WSFdySmVLd0hTQU5kQjY0L2x4VGJQS24vQWg1Zm9ZaFgvRkhZemo4L1VJV0pBR3FBOTRReWsxbVVuNmdZelN0UkJKd0RKS2E0dnhTZVZ0U2grUkdPdVJseGUrZ256MlpTRGU4VWc1TmdOckI4c3lSS0dCQndYclJJNERxLzg5T1ROTkhGVkVqYzdZZ2U1VlFnTmJ6ZnJ6TU14dFRUcVV4dHlsaFNyTjdWbXg2TVk0YmVVcEtzVlQwRitIZzgwelkvRUpjalVrWldFSm4zOGczd21lcVVlZm9UT05Da1FPYklsUGlPTjhFVlJUWHJ5VGdPZzg5NTI5N0w4WlQyaHJzZjI5N0R1TXBweng1T2YzSzVOR2FyUlNYa0FNR3NnOWY1NlhYN0NlcjFpbzUzY0g3Rll0OHpsSlJmUEQ0M3FQNzZpNmcwRnJUWGlqUjZRMnY0ZjZoV0RoYXFsRGZjQW9hZzdkeEIvTzVtYm1xUWlCVmRXUFdaUSt5SHZ0aVVzYkplZm96cUJLN1BsNTBvZWRxUndlS2dqYVBRUmh5ZmRJakpRZlVPcENuL1BGT21TVlF5dE5YYXFGS0FFUlVnZ2FjQm5GSnR4YUxiUzFIdlY4RG04U3lzRGNwVnIwaTF3UklLeVFKUTlpVHZHYThRR0R6eGQ5N3JlZk93UDc1bjYrdXNuMDNEYXpDaHBzU0VHKzZRQjRRUGpqZ3pHL2NQeFB3ZUgwMVA1bDZ0OFkxc0xBSGhVTTM5dzhMWm53ZTNCQWlmdmFXSXdIVTlEY0tSRkN5SmdzeEFTTTVvMWY5M3FzN1Q1RUVDMkV2ckdZdk9jbWEvQjF4czZFSEQxM3VlbTgyRW9UT0h4L0hrcW1LdjlCSUxyZXByRHVoUlY1VjIwWGJiK1dRaStsMllVdk1kb2RTRzV6bUNoRGNtTWtGY29mNXZlUVZJZXVyaTE1OTYzTkxkS0M0Q29hMUNWWUo5MmVjNkVXUTd5VlVNblhKaWwvS0o0a3NySU1WZWh4ci9mM2lKMC9DMkpvTXQ2aWJRanQvVVRvWWJSTXNtd0QwMDk1VnB4eWV5QmVDM1NabkhGelZZbWZWaGFkanVvZ1FEOUJ2cUZTY21tVlJIYkI4QytTK3UzTngzZmVUMXhPWDF3NXZuVVJHT1kvVEo4QXd4RHVTS1hXZVJkdThxRzNjRWVTWDhOU1RTTU96NGhNSFlCcWxRb3c3N2hTL0gwdHgwNGF0VmdmZkFKK05QeHBVa25jZWh3SnAxcTBLaytXQmwxak53eG8vTDBHOThqRVgyTlNnZE9WWEZlNWVxNDNjbUx0bmZRY3gzV2JKRTJZNjdra2xxWG9PZEhlKzBoU3BWRmFIdC8zOXRxUXRLZDVVN2Ztb0ZKNEhEQzNZUEJNbGhhdnliVnVwMURQUW1pdnV6b3RUSis3VklGOWNIK2ZMN2tTVDRTVXdtWnZ2emxkL1o4a3RDdmFQOE9odDNuWkt2UGgwZXYwbkxwd1RsZkRaOFRONEcrMjdrNlNtRk9Fb0lCVE45TUJDSU1hQm1EV3VqM1NIMmtLa0R0ZGVZeS9mb0NOWXZSNmNaL0hGWHU2cFZZVTJYbnpVVC9xbmlMdFVOTW5hWXM1eXp1cVYzbHFkME9mWXNlZC9jYklKOTlNKytRWi9zZjV2eHZ6TXVaQVp3cjJxT0FwWnlnR1lmaXBJdWg2OWFRSlFFTUJnVjFHdFpFUFd4c3pzaU1ESXVlaVNCUXhjTkJrUGlaRkovbzhVSStuem9uY0F2MzJpNEIxT09xaGFmMXhoZlh2Szg4R1c4aUt6VkZlRzIrdzNIb2FwNzcwMHRCM3E3TkdZSll5VGVjQjg1bnlvRzRkblFDSThNZThEZ1hIMVhZTDN2cnUxQXZsSHlwamtYV1ZJZXFkMzRlTHVRUFZIa3lUQjRobldrNy8zalhXbjQ1ZlloRGVuREdzeXc4VmhhSVlDZGlTRWdJVU4rclI0cWtzbjVZMTNFZkFzbExvaGFLZWFHbFA4Y0YrWUU5NjZDVGZ1QmFDenJCZ0NtWnNuWEdlYmpNVVdwSmd3UCtVV2w0OXFhNFNJN3dvQTlyNVhvZWFaTC9GMTU3MHNkaUxNUFdGQnVWSEJONUt0Zzd2emRwZDFPS3ZrQmY2N0tIQlphVFpmcTRZbXZ3SU9KeExaM2FzcktaeUxiSU1OZnA4TkIwOEdHQ2xmaE9yOXF6RnMzQ3dLZ2QxSGY0cmVEVExZRzFvUkVpc29tQ3lnV2k4TzgwY0NvSEI0VUdFNjcyTnpscjFlbGxUd3kxT3N5WFRGR0xwZjN0OTd1bzBDMmgrbkNudWoxaUJJVXhtVnZYNFlsNVFWUXlqR2ErdmZwbk9wTzJsd0ZuaHhhUVh5SUVqaDNvUE8zOWQ1bGJEMmQweHRlWWV6VzI5R29QcGtFMmJnemR3MzRzTHhNTXdUUjEvVitvb3Q0djhhNVN2OCtPRXZ2K2hxUWQ1OXBvYzB2L3puR09xN053MDc2bGwxZDNKT0hadGVmdlVBQlZmVDJidzMwenhBUzltYURGSHNuZVlxd2lKeXJoZ0NwK0NoK0g3SDVWcGcrUDB4Q1FkVExEczdlakU1OHFFN1d6VldoT3UxZFlNNjdxbi90b29haWtLWTBSTW9HY0hhemhibUNldThBbEJUQm93QkxZWHVITDFna24ybzBCeXdKNnl0dFNsamRDcFNJbS9ZZWhaL01ZVmdTekFOdzI0MWFoYzB0QXpYU01BUHlhRkFSMUxLamRuc28zdE9QcFh1SVl0UmR1WGFOejh3VjhRS2N6ampQTlhYRHcxYnlpT1pYc3haS2pPZWdTQkkvLzN0cVZKalZsWDF1b2FhYzZzNzN2NU5PanVPblBGK2dZRk1VS1FWOXBaWnpnT2F1b3VrQVd0ckRMaXBsWUhINytEK3N4K2V1ejNpRFR3RGFMZUFzZ0R3SkdMZ1ZMNENETFo1eENZYTdySVUySEF2bytTRHMvaEVVUTQ4YXBuQll6bHVjMkI3SzZETHVWNEpnYTN6dDRmMFFsTjBLaE4vQ3FHNEhlOXYyY2duVmwyc3NwWHpFMTF6aVBsOFpqbmNvWXlzMzRiQ016SFB2Y0FzTm5jSEtuVFlOSlBPaW9TcHZLNkhxWFV4NGVQVUsxQmErZ3QzRnZoK00wV0lHaEhZdWt1SHo3cFFsaDV1RTJidUE4SkcyM2Q5eGZENzRxS3FVS01sOUZCK0c4SjJRT1lxLzJYR0NPd01RbFd2NXBaa1RDTThwWUs0TTFxZldwYXhRTjZYQzlVdTFEUDRMcU0zaDNnRzJob2VZYThlUitQM3RiMERTd1lKcXF6ZzBZM2VqUi9qU3N0azVaWFhyMFdPTWNySE8rRElBUllMUE45ckU3Q0F3Q1FtaFlCYlJwZzBwaFU5bnpuYU81Qld5enZpUmdkRnZWazJNWWxrQVhwb2EzbFRoL1lZVkRSU1J0b2hMWnVBbUpCMmlMOEsvZkhEMCtpeHFNbTBpNVhRdGNLbEorUFNkZDBkQUtVcFhlM3o4L3pYcDZrZnJQWkpHS3grMnZ0b2x5MFljb05mQ3k2ZEJteFVTcElxL3BTS2FVQklQVjB0bFE1RkVJb3ZMMUhER1NKc21NNTRodGtudDdpZnBiamJjUTV3U1ZPaU4raS9FaTlLbmRvSER4NGxYcjZDbUc2Skord1NhTDM2SlFBc3V4Wnk4SDlXZUdVb2U4Y245UVp5YWMxdlRMcktEMGtaZG5pdFRxd1dzdmU0MXFaMnpwT0xFd3FNMEFJU2NXQzhZeWdyT3dSYkJlOGFGQ0ZhS21RZmRvcWJuVHQ0cVpoeTFOczRxUEtLV1FrVDNjRHA2bDZQWmg4SlRmV2p4ZkVTYnFQMW5zMlAyQmlOT1B4OUd2VVRvSXM0ek9VYUVRR2xDa2o0TWZiVmxESk4xMXQvTjZXeUttMzFTVjhJUkV3TlRtZVBjQXphUTBJUml2Y21ycUxiR29XajdTbDNoWnJ1NytmYXBwaWpyV3Y2aGlXNFlaVTB6ZFBoTlpvbVplNSt5bmEvMGVQdXNYdkIrLzA1bXhSaEJWR0tMZWVzbk9hVGxMd1Z5ZmlHYnBlU2dzQnAwRHNWMmw4TTVxS2tsUHo4RzNDNGRRK0UxV201WkNVUVA1RldDblNNQmFaeUQzRUwzc0p6eGx1L3BGVVpYSHVPck00azhzMUhCeHo5eXVKR1I0M2J5ODZTNzBoNnpKMi9oNUVjTVAwcjgrM2srdWJnU0NUcDM4cmpCSGozdHA2K056UjVERFVlMjVOVEFiQXRzaGZBeGpHRDlFTHkyV1VJMFEvVTl4S2VxbGFXZXd1L29XNnhhR3JlVzNDUGJkYjc3RUhKTzBrcnJKeGJlRzVBTnpGa2NWVGR4bzhOZTVNMjI3UGF4c2xBRlJ4eDZVVk1CdHhvbURmVldmNUpqWTlwRnVTd3FPVlBWdlNwbWVNcGYwYVFGNlRDSWdUanBUVlNLZVU2TWxKU1NlTkNhYTNYeWVMZE1rMzZjVTNvS3dERG9GWVdWMzNlTlQzMGNMa3FTQmZCZFArT1JZWXdBKzVvcnlvbWZsbzNjY0FqdXltRXU3a1JPMk5LWThZWnlHZXR5YTFPSkJlVUhIeTRHaFZ4Q2d1eTczZFp3UDVkR29lTzB6UUZCT0QwNGlFR1JmNisxdFo2RDJWUVc0cXl0M3ViRllNeGEyNytnNVhvWi9wa2hUNU13NWR4aTVpMmxRNlhydFRmRmd1blVvVitnMmovNXdDa1JyY3VzSkNXbGcxUHhMMDVsTGNGNU93OEhEL0JZU2xoNlVESkpPSjk0M0NOUlR4MjBWaHdiQVlydkJhbEg4UW12WmphOUh2a1M3cUsrU1JWK3NiNVF1L05TdTB3RldjM2pTblFTK29iQXlJTkc4SGd2TnhuWTFjSCtSekl4ZlFrbXhzMkVaN0cwNVBOc2dsVUJuWXBUMkZYL1U4bzdvRE1vSUVzdVBIenBVRituRmt0aGdmNUw4bVo5QUlHT3o1MkRNbmpmK2lQQ3FZY1RYQ0xOWTM2VmtYRHFCMWR2aW51cnFTZEJzbjlobWJxdzNIa0hQMU54MGhqTnpyMWYwSmYzcUVDRUgzMWxDdGlsNjJRSHl6WTFMTnJjTW5GbFZ0RTZsa3NnblhUL1pYMzAxZlBFVHRrbzBOd1YxU3hpV2hpL0liRVNSRTRIWWJDbTh6VStuNzlqb2loa3BGekFwTktrYjdtaWMvb3htM1MyZ05GYm1XclhsU1FoL0o3NTFGbEUwWDk5SW1mSUlsSjFrUjZPa202dkZOaDllRkJZL2g2WmJZYkovZWlXdGJmbTdJU295MzdCTWhua0tRL3B3WmNNaHdxTGIyTTV5WWtKZnNvaCtnU0pmMlNkUjhGMGpxSTVyK0ZaQWlCVG5CdHZTMFFhY1dkK0o4cmZzYVUrdlNESUNIbS9xVk5RSi9BRWVHNnUxYnQ3WEYzemoyRk5hQ1p3dUR2MDVLYTJkUTJ1b1FCUndXb2dmZ0hFdkQyU0I1aWdYL1NlQmV4cW5YUnR0SGNudVpYNElHYTFrS0EzZGpDM0NTcVJDYjExbkpLWjRRRERSQzd5OGRWeUViU2FRTmVQWUlYV01JR2Z5STZxUFIxOWF2dXlRSno4ZGdhd2h6WFpwdU1VVU1RdDlQNTZkWU5RaVhQMG9TZHQyN2ZTWThpcHBJTzB0VURGWmtLK3FGdk0zcWgyTGpnb3R6T0daYUp3Tkc4V2E2a1luZkUzL3NaTis5YlNRMUVwRzc5cVVUQ24rc2J6RXNsUngrYWFaWkhiZ0x5NU5RUDl0UTJtNHFaZnZmZ05xaDJ4Ykc1Z01QdlVZQUtCaWZ5SXE2OGhHeVVYU3RQblA5Slo5UWNFTlJTU3l1cFJrOW5RZnBKdWdZbXB2bTU1MVFVbTRXWjh1bDRKRWtkRjVDU3g4RGY1eU43RjBLSkl0alJxRXdOd0F6enhrRlE3cEVHY3VXTjB2Vzc4MUdTbERYK2E2NSt4YnJGdTU5Nm9jOUxzRCtDYWJFVEI1SkNNVjdLcklBZHprcGFOYU96QzJhODU3WFRwZys4OEhWYjZpNStxb1dTR2dOZFM5RlVRcjRRTysyU2JHTlpERDcxVHpvR0o1NlZ4emN2UGJOUWRBSDRmUVBHbkUzMUE5QWxjNWk3TStwTHVJUDNyVkJ1Z2lMRnNMNHlKMkJzQVZ3ZHE4aGVEMVl5T1NmYVB2alpCRThOb0luc2JPa0Q3WUJDWXhhZEJkS0NicFpSaEZYK3dpUjhQNlhHSTZQdjdTWWpxMSt3U1p5SlQ0QzdDNzN1eHl1WEVrNW54VllUM0IrdUxQQmFoOFpFS1h1NVFvdVc2bGd0a2NhTC9Ockh2c0c3T3JaYWZYTEdSeE9YWE9jRDYwTkFQczdKeUc1R0VTRXFJYUU4YjduNjJmU0lxWEVEVnJTUVVRUTJqejZkb2xsbDMzZlhvaHRlNDBrTktIaFF3VnZnWkQwUGU5YVJmV2VzOENnWmVLbFZPbndBMWh3WFRxZllRbGR3Qmd6UFV0S3J6RmhIMzAyeUFQQkdVeVdWdndzWVNYU2l6RHZEVzZybjBJdGIydHVOZnl4WWMvZXE2THdEbVVYWkY0UkJhRU92YWVUYmpuNUh6bFhqTUcwNnIzckNEUkRFbzA4aWwxNVpuS2g4TXFBVVVjUWZQL1lQOUpBNTQ3Y3BaeS82UjNsRC9NOG96UjdMdnRYelZjdm1rbHhHNXVteWYwS1JibzlOc0VrdmNwaHE5U1FMcFBaam5oUFRrbGlZQUdjcmk1cDQya2M3b0lrbGc2YVNoQXQ2bUNSeG5XNm5aS1hIV2F0WWFQdklnYmFDUHhGV0RvcnlGZWNvbndQRFVkRFkxbXdKRGl0MUNHeEJnL3lIa25maXQrYWlCMjVpZlA1UXdpSkpVelVJL2hLNEJYSnRRN3FSUVdhRVh2WmFhREVXQU1hQ2xIS1p0Zm55SkFuaWk0NkR4UHlqZFhHZmg0WHVQblRVMGw0QWF2dDk1Tm1OZmVVeXZseXNiVm9hY2VFNnlSL1RZWDUycStDczFqTDlKaDNiNXhwMkt3OHppVUZQVlpOVXkwMEZtalY1ZFpudkU5RVkwL0UrbGhUMGp4Y3FPb3BLL2g5bUxhTWFGOGsxbWM2dkE0dnQwS0YxRUNVcE1jdTZyZGdrMi9SdFl1VjJvblZuWlg1TG1Ha3o1ZzRYeUR2dm05UW9iMFRhMFNzdWo3bERrWEFSdmg5NzN5eFFRTEJ6eVVZKzBML3RON3NucWt6MXF0TUZROThpRlJzUlc0QStyNndidTZjSFJlUWNlVTZxZTRySFRQbG5HaEg1blBkWWpraUFERVl6a0xReWhCN2hxK2dCTHFYODV4SkxFWHA3Vlh3RmdhNmNNa0E2cEphRUduOG1FOWVIYmRNYWg4YXVWenJsUXVzdnZEcHpTVHpQV1BwYk1CamNuYXczTTY3OUNVcGd0RUo3REFOYkVPNFV3RkM3RmZrb3FiUzh2U1ZiWGJVaUJja056R2JLQnZJWlRxelVsdEp3cXo0RGhVZ0l6RTYyYzlGNTlsNU9mT2ZmWlNqdU1mdVRnQWxwRnYybEFiZ1cyLzFyendrSldkL2lZbUQrU0VuOGVnT1BITmtIYnlmNDRWQ20yZ29sTmo2blRXWVB1ZDZZTWlteml0akNrUW55L3FXNlNiTnVCaSs5cW96dlpCZW9ES2I3SlNEN2dTaHpaaWxwTlhvOVgrSm4xZHFqVlBpYXZvM0lnaGNTaTU1dXQ3YWlraDZncUFkSk5OUXdCRXV5WDFIaWZSczVralRzL2h6WGpLN1p3ZDZubmVBUjFtNFpJWlA3andNQ1NIQVpTU3QwamxQSGE1Vy9URS9BSVFMTWlZcUppSHpjam1NTlRoWkxqSDVlaTFxNzVBaTZPYVpWQ0N1OUlBanFRWW1xS2ExL2FxdjhvZzRmS2k3ZVBKZW1UWGRyc29WQStFa2o0VktjNGFiMko2dzZJMkZxWWo3VW0rek9BQWE3NW1zbnRwN3JzTnhLZDVuUmhMZ29ORFdFcm9lWi9SQWhiWjFieDZqUTRoU2tPTXU2dVd1b3pGYnRaanU3cTNTVmM3U0NTWE9YelkvRGpISUxTNm9ydFhqU0ZsZnVnSWJBM3RqWEJ0cklsb0czdUNDVGUva2hiUGRJbWl2MEdXN2VxdGF4Y2Q1cTR6dWdhS2l3TmJnaW4wVFViU0huR2tBNHJ3UG1PRWMySGxmMlNQaHY0SUJNaVZaOWg3bVNqclUyOHc0aFVtOUJiMktjbnVIUlNGdEthek1TVGN3RmtTVEZ3ekVJRG5iSWJBSWlCR3VNclQ1TmJDREhGUWRDVVI0WlFLQW11eHN3eHBXY1NJdW5seS9rTUJPL0lON3JrUnR4STJXaTlVWW1kdEcwczAvU2VXbHRpT1pOUnpROXFZa2gxQndIWnlVY1BHZmpwbUhyYTRyU2JvM0JSdlFKTjFIRFRXN0I1YjcxdnpMbDN3N2gyN3NTQ0lMdG56K3JZUTFUeDVHeEtLYVBBd291Wm5Pd3NDVTduQU5LL2gxR0FrUnR6Um9SVWFUSzhmcUxMWjhYa0lMaHBmVm1WMitJRXhPN0xDaDN5ZzdrMXhqQzNaTUJudjRVZTg5UDRoclYrNjVNY1BwVXFGc0FVdTY3K082SXdkcjlaYnVtRENOaFRvWFZMelBMRCtCb0tud1V0SkQ1b1ZOUjc0QXpxU0I2M0tCWkZHcHgzYVUwM0JpN1lYblpxdEhkMU1QUTNMd0w0RmptWkJhYTlNdWI3ZWZyeTZWMWdLK0tHTVkyNG9pd2JDbTNqdlV6SzJIV0FwUHo5ME5od05qRW04MTNRRW5UdkIrNm9kWHFrdkR5dGNDWEpMb1l6TnBTaHBveXl2clJ6RW01aThheU55SUJqVk52UnFvTWd2ZlAvVzB4eGFKbVJ0NEh3Ukl2ZkJTbHFtd2NzUWQxRkl6Njd2SVVrOTFvWXVCeWlXNUMxUW9KQ0VhNTNyc3J2NG5FR2txb3BHVGIydnBVQXZxY0VVZVRsdDVPQTJwalhxQ3F6c05aWXFEVnNQSmJEci80eEx5d0k4cHo5aG54M3gvTHBsRVZsUW10NzNHYVpianowWks3dHNaL2F0T1ZTWTFzUE53TkZzc1N4eXJnQjRJOUk4K1J0TVRNTWxCNUNHN2lZUndNa0ZVK210anM5UDZrdmgrckdCeCtUd3NoMHRUWlVVRjFUNjRoSXdqRC9BcU5aRzZkL09QbUcxc1V4K25JRXR0V09JSklXbTBZMVl4N0pqVWZqRkp0K01SZ2xNc3VIWk5kenN6ZzhaU3QvYkI2RzVyUFhHN3QvNHE3ZUFPaEYyNzhKNHpGc2ZMTGFKSkFicGprMFpNaHBySzZoVHhwR1Jqb3h2U1o4c05USW12bkwvQXNOSU8yaURkdmVYTXFUTi90UmIzb2c2VG1zb05HWFZuZUk5d09wUmErRUtwVFBWMkh4YUoyV2RNMCtaTjlRZDA0SUNoQ3N6ZEZFSitWN0hkLzRQalRWQ1pwVHhBSFhsUUtvSXU1bXFhYjRKRmZ2UHZWV1RjN2J3a2lEVHhRcVNTazhZQzN4Zmt6Q3lOMU4walpwVW5oV0FaY1pxSE9qOEFHd2Ezcmo0SG1hbk9xTmlvY29CTEMxRGZNRmxTWTBRVkZHZEx6Z0pCYmNra3hadXY1TE1VZkpJRlBXSURhZTBsdDJYZDBFMzZiMy93ZEh2NzdpZnJOekhVUjVuQ0pRM2k4UExTMWNaNTRVbDhqa2RoKzlLRkxFekZkRkRHZFl3QWFCelBnY0NCeFprSVRMTjAya0JUL280Tk9NMnhSMU5lREFNeFNOWDlVMHUyYVNwZVY1TTdIK01YZU9ocXZaYjhQQ0NVbUI4d2krZXZLQ2poOTNUUGRDSlQ1NXRjNVlTOVZmUXVqbGVaQTV6U3IwUzNUS3BkSEo5VEhybVBqdXZXUVZNUzY4OWlMNDVVSUJxTmdsb3FnT1pRN2MzUlN4VHVuV1FpNm52RHA4YUwwSktndjhBNkdqVUdKUDdoYWhKeGp2dHRPQ3ZZN0oxdUlId2txTTBwbkVVYU84bTd2VVorWDg2Y21sM3hHa25jZzVxSVhXc1VPMUI2YlhKQmplRVJ6RWR3N1c0aW81bnRvbmVWbVVodThVdW5xR3J5a0tHdnpHcW5qVkUvOVczRHNGM2RHMzBKbHVqYkgvWDRBTGE1WGZrVy9OT2xoNzBRSlhvQWllb3RRL2xvZmo2dkF0S0RUMFV3UXMycko4MXJrNmo0bTFGSDdUMm92ZmhFb0t3NU9paGlNMncxTk9MTE1URWduWjlyVkRTZnc4NU52RHluQjlQTHR2eFp3UUNPbTk0dnl3QmVzVThzaUpSTlBHazcxNzE0cDBla1FvT3FoU0tndnlxMmI2cUJzS2w3c2R5V2Vyb3RjQUxUWmI4T3I5a2FVOUNFbUszRmJnZElldU5CbHdEa1QvWWNHVUFvcW8zUjR6YVEveEJ2Wk9xNmR1M01wMGttZXpRNkY1QlErUHBGOEgzcVFZTE5oTVVzY21BTkNpbHJhaTZlcGRvMmY1MWpDOG96dDNGUnB4YkVKUmg4dzltZjNRWmxIczF1RGJnS0ZtYU12SS9LSE5HTGNiQUpvZndvS0Z2THFNbjArMm1CbUJrdHBWczdOTW5Lck1ldGtHU2h1TkQzMWdwOXN5THBiRmM5RVE0N0dpek1tcGdCTUlZdUZkR2ZOWXZ6M2wyQ0Z2cmN4Ync3UGtDNlg0L3hKa0dKUjZ6WnNBb0k1QkprdTFMSGFnY0s1bUMyVUwveHJzSEhueVJEbTMzbTBvNFJ6T01QbUdSTnRPUjRDQ1RvMmc3YUpuZlRLeERnU0hKcUw3aWp5VExwWGZVL2VEU1V4WEc3V0R2RUtoZjZFUjBJbHZQeE0vMEpTaGtCZFA5L1o3OHRBYnVRb0lMVFd4bFRSQkd1QjRERC9QNUlrKzNpQm56TUl2K0RXdDlzK1pJcXlJQW9nKzRqK1l6SjNwZ1VycFdTQU5aNEhjbHVYMzVhVXJrdFJOMHdsdkwwcm9STTZKYnVsYWJqSmxDMkFndVBQN2FSYlM4bXhNbWxRWmhGMVNsWTd0Nk1UaXVkRXNpYjlxN2VBZFR2cnFQNGhsTVp1WVhDSUhPamlFMnVSZGczd2txVEd1ZGVxbkxGNmxqZ3FYWDNXMGhKZ1U2bUVibjlxejRPZXBZMENham5WUlpzL1A4eFdQZE5hTDc1UXRnSWhRRytJQ0NZcWZxakpEMkp2T2JLekhsQWtjamppVnVEdWxjU1FtejAraTdnRFVtZkxSRXZMUk9wVU5MS2VRazNlajFmbjRBcGxVcjFydlFJOEZ1bWZyMDBOek50Z21zZ09TZ01OV2dlcTJmZmdoRFpHc2xSeWl6K3daUmIxazR0cEVlaTFtb25icVFwaVc3QzQ4bGRMeEJtdkZVSWRUdVVtQk02REJZREhlZ1IrVFp6NG9yb3BpNVZqYWpIUm5LL1hnSDlqM0ZGSCs5WnZIMHJidGZxVVgrYTAxVEtzNW8wT2F3WTlpMFFXL3dKK2V6ZWJVSzZjc2plYWk4OXF0YmU5RGpTY1E1d2IzaWMzL1BET2IrNC9mNThHOXVSQjNsLzMyYjZHSXVTOUZjSVdHQWtkTEVhQ293Q2FPR1psUFZWVVMvbnAvZU5KMnFUOWlydXVVdWpaOTdONHJWYUowRUpnU2lkYktaTGs4bDYzQXV2M0tvZjFHb2pzbFkvUG16c1dGVE55Z2JRNkdvMGplVDFiRUM4bmEwSTRyZnc2cHVGY2ZLSEkxclJKd2RLUEVHa2drbVFrNE44aURoTzFiZHdyYzZTVHkyRTh5MUJ4M2RrVVgrS0xldENyUEkzRlF5bkNjWUdQMEtnUEhydXN4Z3B1djBwam45aWFFK1ZXejRuN1FzRmUyOGhOM2hQR1BSU3REUmp5L3p5eklYclkvd1RjS0hYOXEvbkVTRTBBM0pYUmdyUVdLTzN3bFJHSmVQWXRXRENCS0dlL3BUd0s2R2F1NG44TnRqTU9TSFpIdXBCeWEyVHRQN0pJdUlVUTROY2FCVFJqU0hnRFlGVC9ZK210TXFxclVPZkFhRzd1aElsNU1wVHZNaFkzSWxJYkhmNytPSFVWbjl4cjhtUitmRCs2MnhZdWhHOXM2cHlXUDBSblQ1VXpiY2o0NWp3dUxtb0VSNVQvbktBQ0RDK2FxRnExbGo5SXlpZ2FZbDUxVGlVa0NKb0g2Vk4yTVFzWldWbm5ERnR3RDB0ZDZBK1htQktpOGo2OHBLRDFCd2xCWXRrY3Q4UThqZ3RPWGxFdDVJcUdjdFQwSmEvOHliSi9VMlZYV3pNM1hPS3d1Kzh1N3NJZjlWcVNnSWx4bHNKcFp0N0JsZDFUT3lOT25WYTduOUZYVVpjWXRwSlppcGFJMFNXeFRWMHNiclkwaythMFV3eERzUEJUbWtIMU4xVDJSYklReVBPdlF6aHMwT0xtbHFjdXJEV2pKVUNTWW5TSWdHOXRhRFcvVzI2UnZVK0cxZyt1Q3orWjdtcnRWTUlUYk9LeFVnd0Y4d3laQ2tsdE5sbnAwNWpIT2NNUTA1Ti81UldGSW54ZWZnd3FtbzlYNVB1WUZnbTJwSjQvSjhkTFlwdmkvQU9NUlZvMU54VlZnTWZoS1ppRUpKbVFJVGNXUE1IUHZXOWlaejM5QXFQbmF1cFF0Y3NZMUdqWnhjVjBKb1V0dXZJeDZyNUdBMmw4dWJaQ2gvWHlvdERwUE16cFFNYXpTQlN6NXRmMUxlOWVrTmJEVXhMQnJQOTJqMFRBRXc1VW9HWkFYRGlKbEhYeDJKOFQ2VzZaM1ROaW1tMHdZWXBvM2s1S0JNWm4rZGIwMS94TXZJOUkzY1ZWOVZqVlBmMnQ3alE2SkpVcEhUSFdaRXU1SkRhZ0Y0N096bWl0SFBYYkhJeDAyTnI2Z1RmeC84VWYyR1pPTG1aNVBpOFlBUmlSVkxNTThQb25pa3JYa1JQaW8vM1I1bHkycjAxY1VVVDdVdG1vRXRnRjlKd2pQMWZsaUlPaitENkk1VjlrLzZqeDZBcjVyNStsS3lIdkovMElmSzBiWk9saDNFL2U2d05BaVI4Q1ZpNTFEL3hnR3krS2VLNHhkV1g0dXpjMTJ1dXM0WFgvVVZRVEI2K1MvR2EvWlZ1dzdnUzRucEhuWDE0M1p3NTM3OFhRUm0zNTNhbTRVdldFcHRTMDZPVTBnZDFEWUFTaWFEWWsxbTMwWjdIZStPWEZKcjMxUDVFeXQwaVBkd2UxaHY0bkl2WFF6NnhZN1c0dndudE9PMkZkMUIzbTU0UFh5Nk1WWVVjVjdhSHZERm1laU5uRGgrekhxanZCK3Nza24wa0ZTNlFrZkVSSVFxQ2RyWW5QUUZudjZHamdSTjlnM2hLZ1YzeW9nL3pJei93ZjRsWjhZUUxCWUZpdEh0YU1RMmZRQ044cDhFdUgyeURpK21ZWjlJVnc1cTdjL1lHd0N4SHp1Q1RUKzJrSUVLMUdvbTNWNWZMbmdqUDJqNmk4bnYxemNHZk5rTUdPYmErcmQvRDlMZ29NK0NFVGZXMmhHbkZFS3daKzZPL3B5alBrWU5Teko0QlQ1V1MrTTYyTjE0a0lybGs4b1oxTWprTE9LVWRuc1kzT01VcDRjVy9Ua2c5Q0E2QVlObUZaWmsvb2xXS093OFRDbDU0NHZFeVlOQTNweHRRcU44WUxjL3Y0T0NrdStlNUc1a3JGdFFtSDJQWkFpN2NnTkhNZUhGK2t4bnlMQ1VMTWR1NXNwajV4cmw3c1BocElzODRLZ1VzYmdaTk9HSVd0WHdMUVNxaTc2Z0NBKzBEdHpSeTBBakpEREV4MUxhdE83OEtlSEtvZGVOWU1ScU5HcmlOL0tKMjJ4cFEyQ2g5ZFBnbklKb3VSMEh4a1ZFa2l3UVFrTXk0OThJb09LNEwzOXdKaWRVNkhlWnhVRi9xN04yNFlvaFZNS0dTRnZzajArYURIK3JSMjdUc3ZKcjZwK3JvczJCZmFjdmN3em1vajk4bHY1d3hRWTJEOTZVaTVaYVdmcHR2NmxNRi9vZGpYNTdCeUV5UmRBbU9tMHFyaHZuWEtyMnFPWlc0Z2p5QnZLeWN2ODluT0FJdGZSUGpBVXVFODdlc2JqNUZZL0t4b1JDVmRzUnk2YkpVRFZjbVJMZ3VMd2pmd0JzVnNodEN0T3NHUnpmeDk4a2lRbFhQSWFsTWVWVWx1cE1IQ09yWXd4M25WTDBwRUtHTldJMDAzMlZLN0hrWWdDR0ZUNzhtdTY3RUlDdFdHaDdPajlVM0RuSGY4Q0kwd3ZVVzJaVi9hbFQ5VWlzaXpQSjVsWlR4Y3ROSTJBZ0hkSUljYURBUHJ3ZzgzeVBNeENxbldseUk5ZTlKdms0Y0prWHNSUzRpOVFxbjE1T2Vja0ltbTZ5c2h4S29jUXBwNk43QjgyZWtNczh5NVdZeFhBQk50SzBqNW1RTXhnR3VTNWlnckx5T0IrWStXZjg5RlBHSG9kYkRQVUJjbVRtUEZySWNMRUZuY2Fmb0NtWnVZRGdtajV1Umo5NU45c3hvYldWUmRDSVFtR1BDUEVoUk9hTitzY1ZmcldrbXV3OUEvamF3Y0VWd1NzbXhNdzNiQlV6SGowOFhUdGNZcno3dHc0QWRRYXkxNW5CVG5ueXJNWlVVSVpERjhsMHo0dGk5WktvdnRmUG5Pb011M0ZYS0dmTTNYRC8yclJXajRtd3l2NEx4SUVKd2NNN0luOFJKNjN0dVhqSDZ1S1p3OFNhY3NPUUlCRHRRQ1FPblh1QzR3a1MvNk1ZK1BTTzdzd25NUHhZbWltN2pHcHJxZHBJY1NETmhTOFdpcEM2enUrRHRCbzBHdGhJMkRRKzIrdzlqSmp3Z1hDUmdCc2hCRWZ0OXNadTVEWFBSUXFLZFlMUklmMklXRkhxbFh2dVRuVWlFTjNoVmRpUEljN3hYN1p4K1lXdjhiN0svOUZqYkljRDJpTERqWkZhbnd4UUkzYlVuYzY3R0ZlYk5SUnRwUUh0dnRIWEhkaXRLVm83RmtWSzlmVWNwMEZKaExjMkVPNDIzOS9ndmFYVFN4YVE3M1F5SHlzTzlhSUNuSkZmRTVodTFZeStBblpXTGlGbEJYODBldWZBU3RLaE96RGNEQWMva1JPM1c4OWZobnhmbFB6eGtzbUxOejYzMGNMNTJzc0d2Wko4QVlmdXJFU0J2SktpMWJXM010bVROUnIvdFJwcktnUmREU3ZQS1BJV29FMFBqa3NWTE9paFl5Wkc1VkZ2dUhDeDNJck80LzYzTWdJY2hIUXBPVTE3cXVWVXVLY3FteHJ5WGFCUTRFMS9JUWVma0ZqbTBpdjJwcnZJVGpwZ1ZGS1NrTzUvVE5qbGZvMjVQZzh3T0FvanRpZm9PMnBPaWkxRFd2dm5UeVBCeXV0bmRSeTZiSzFxRUJCV3U0M0FFTHE0dE5KaHhrc3k2R3ZPbmNkTDN1aWtYMW93aTZsUWxGMWZLYzRsWmJUOGlXcHN4aDRiWGk2Q2dzcUk4eEFWa2NuZmtrMlREQVZDS3ZTZng3M252QWFOZE93RXFDd0xzYUhaMTM2VVh2N2JZV2U0OGtRcjExRGc3VUlvc1lCNGNIb1djMUREanlqWE9uckxRZk9pM1hFSmZpUDl6cTFDQ2d2ajNiMEpLcWRoMmxmZS8yWFVYbGNMNEJKQ1FLTTRjWkhPV1AyK2tjanFVU2lTWEIwT05nRU13QjVTbHdGUlBhR0lPUjZHdkFyQkpjWDZYOTFTODFBcmhrQWhtZFpNU1B4NnJhdVVrVEozVHBvemw0MEpMWE81R2tOY1E1YTZQWVBiYnBuRTV4bXFBVHAyeTlhQ3hKQnZ1cWJneEc2UU9RZHptNERIZ3c4clhpVENVMHVBWUh5bmhndkhIZkMveWdvTHRtSVYyNTBKalcvQUMzTFJiakErU3lZRU9RK1lJcXNKYmtmYWpqbHlzNlh1bDFLYXJJcHJlZGdVOFZoRjNLSlNhMU1iNzJ6TnlIUDNMeFE3ajN3dWJOMkFOdXNSSlRlL1JCMTc2dkJSOU5mZ2VuN0FWTm5OQ0trVXAreE1ZblQ3ZlIzWllDeG5VMnNwdTFmZTZZc0lHUG5aeEc0OFlRRVVuYlhRU0NOZzdONmtNWWxsay8vTUJFTWFYZDdLM0g3VzhtUEpHdXNob3NnM3F6MnI2c2dZT3liaG1Fak1BTnRUVUtkUzN3bFpLRitBZEtySENYZHBZUkFQV2x2amt6VVFtNDZLN2xCNUtUelAzVnR4RUc5MThrbStNbVJxajVJdExNQ0ZKT01GQlp6QjFpOW9nVGNDbkJyeU51T25yTEVKZzQ4MVhIdEpRd1doajBmdTZPak1wWmVaZFJlVG9CTDZoRGUwdHhWOWc5OHdVamFCY3phaDR3WFRta0N2N2VQVzg1RXNZY00zQXltTUhtbE1RMUZKMFhld2x1ZlozM0Jmc0EyREF3VmUrRjhpQ3JTbjR3K0VBTjB3eFg0THNiQ2RsbXRvSks1TEREczJuaWw2K3VTOGxia3hDbWdyTkR0NVM2T1BrS1FPak4vcWtPOHdsMzBTYTNxZ1RSSk9TTlRTUG94aDFWdEhjWnh0aTBFVkpjNEFEeUxKUWdxTXFqbzFoemoyTURZTWJZSXU0N1BHQUttME5xU2ZTYTlETkwzTjNDWGVzbFFsWnZvUU9XODlOTUJsZnpZZTg4Q1hQRnYrMDk4NFYrTTFyQWhRNGpVSkVUamgvS2I3T2pjTG53TkdieHRXWlVqYVBqOHkxSW9KN1poNTE1cGZ3dXJzL1VWNTVNbHRONHpwcjZIeHZYR3VPbnBXMlVDQnFnMkNiYXNIVmg4Rm13aGpjQ000RldGWThyL09UUGhtY0JVbVhqN1lkc2RHNXp0S0lPKzFtVEZqVXNhREhpUjBHaFdLV2U2NERmMWVZM1N1SS9KdUJ6bFEvVnJBVmY5ajBvN0JrN1E3NHVEb2QxS0VoWEJrK0hzZzRMYXFTNHdGL1RUSGY4dWNIWHBkQmQzZThSVXREYlRiR2orT2U0S1BQaXNoS25yVHJQeUR2MXRVVzNiZUNyL0VOV2kzVkFYZlFsb3h3alhDSTAweVZPRy9Zb0dadU1SRjRTaU9MWkJQWEkwdHVVQWZwR1Y0VWVVSlVpSWNGVWVOcDR4Y2lGYTZURCtmcnhEOHFvY0o0TjJJTDM2T3BMNTlPM1RTeXV0aDgzU1k4Wkw1azBBd3RsWXFnK2pjRUdRQ0h3UjlscTh0cFlmT3ZOUVpaOVZwcktYeGlDVDR0YmdjR09sZFlWa20wYisrZWtYbjJjRk9lOHM1RnlwL0JoQjJONGxiSFoyUkRXZUpnQ080VDZnSjNlbk5sOXUrZWpxeGw0ZUhNaHk4NXlTeFcrTjBrUHNDN0MxTGppaFBrVzE4bkRnTUpWNEZFWVcvYTY0T3RSZ2Q3cW9RTzloSE9sRFBtd0s0blQrcnJFTitYbUdTREw1UzRQSjMveUNCMWxYYzBWbHE3WnVmM1VSQ2kyRjZQOEJjRmtRMy9wei9pUHhGNHk1THFEOTgweFhtMGNqUHVNS2FaMm9rMHhvckpoSlpGNGlRUW12bnJGUTd3TU9aaEtiM05zSGpDVUZtVTEyQ3oyTXYwdFAxQ1IyR2d0OFUyTkdZenp5MWIvckRiZm91aDJwYmV3QlpSV1pkVDAycHhTc0Q0RHdET2VndXgwU1BMSkxxU0pjU1p4dG9QQzNuYzJMZ0cwa3dXS0s1NGVlL0U4UkFMNEpqYWoyZmNoeUpmakkycmxpTW02QWlTeWxZMUNNVnRFRVRWRXFIS1RaM1BUMFVVeWFOVmpuakY0eDRZUEF0aVdwK0pNT1BSQzJiM0JYN2M4NWVDcFNJVzlkMzBhb2VtSlpaaGY5SDRkOVZPTHVsQ2V2ZGc2NHVYR3RqNzNHY2N5NXBEcVVFSitWZ2tHZXpNTk1oaHFMbXRBVUxpZlA5eFJmT3JMZG14Rm5JTUo3TktTNmpkelF2R1lWeGxpbHAyNGsyNlROTk40bUVFeFJOdjRtck5LeUc1SlJyMmY5SXpjdXRyZDlGQU1uaUlEc0MwVnU4VzBqbGdOUnhmRTk0eURMZE8wV2JCNnd2RTVabnd1akxIN1duMEpjSmM2UHNCRFZVZmYreFJZcjgyR0xsclZzYytFaFcwTU82ZFR2bWgydll1SDhnVnlFbE1qMmoxbFpnV1ZFZThKNXZUZTVYZTZzQUpsb20vQkQrVUMwR3Z1OVJ4eUVBNWtCb1k0R0JEQlNRZGN2VmlGVE5CU3BQUXo0QXMyMWdvQWJYWmxnYWg0bGtlSkpuMzVKZmJuQWowT29WaHNtRC9qZTk0QnI1QVFkaWQ2MUpaekVaRllZbmJST3Nla0s1RTYreUxiQXdaVkdxRTcrMHlKSjM2WVhKZEloSkgxZnBFdjRwL0FiVEV6R2txK29mcW9YcGExOGhuaDVHL1NManBRMmFOR2xTVDlOZzFGMEpFK1lTd3RCbnhXMGhOSkhkemIwbXFhSFdZRjBWZGhUdDZ5cmplRlJvRUlyaHljSmUxWkEvcFlZeDQvbFVHSW1LNnFIaGlCVUY4WXg4SDNwdnErcE5vN3lDTXN3cUdTbWVPYXFiMlh1dWZmdjhVbnRpcDRLWnNYZ0VtUFF3NWdReGlKLzlMeG1IaDNHMFpYSUJxYkVJZXg1OG51MzRXbTZnTnRjaFMvbXNHUW1wSk8rUFlVUHFDNjF5N1laZmdFb3AvQzFCb3BTZzBkQytKRVJtZ29mV2hqMSt3ckN4Kzd2WDZBUWpvSjJQWDdWOTQwVUNjeHNkUTBYbVZkdDFsdjJDU0E0OU9KR1piM2ZHeEtJQ3Rkdk5MUXdaZXJaZmhNVDlXc2w2NlNCdXNJNjRKbkJtaXpQcjN6V0RYNXZPM3g0MHowQWxpbVdwQ0ZQMTZKY2dPRmRvWmZUYTZGbk5tb054eUdZMzZiV1JSeEQ3aTh5bVI3NFJCQTZ4K2FGdlhaSTExdy9DWjRKVWdsZU04aDBiNHpMTnRvOHoyOGZuTnFWYUtxK1NrUGM2cUp2RHNTYUVJZ2xDTzdTZ1B6MHpZakFrZE92bTdhVGFMLzAyQmdxYm54TmJTODZidUcvVlkzamt6UnJ5TWtMWlFralhUcnF3NlVOak94WksvOWh6dGFUb3NhK25Xa3dDVjduV1FXNXJXWGtyRUdWcjYreG5Da3hxTkk1QmtZS2Y5U2kyY2dxTGRZM1ZOLzltcldmcUUxQWxubDdmcis1SmxFNUU1UWdnM1JRTmY0UDZVVUp1ZnRtbkpXdU9ST21paDFISHBQdVE1VjFuN05ud3NyM2VxL29YM2Joa292eExta21xVXcrM2s4N3BLNUlpakZ2ZXV4Tm5CODIxQVdkYkdnRWR1TXJCTXNuczc2MjVvZ05jUGs2QUx0SnVBUG5NMFNJTWdyZ0RidEkyNDB2VkgxT1JmMGk3Umh0YW1ZUmt0NVpNaTdXbGgxb2ZoWCtXT2JmbG1xOFRiT2M1dElDYnVYSDdIakF0YkNzYy83cXA3YmYwdURURFB5b2JNZFQvZFovc0tQQlU2OG5aeXQ0RnYyam1sNGNlcFpOTnIybnA1aGhaRU4reXlvWkhNaEwvck9ZSTNpM1dTR3dRNFZsdkYxOW0veW8zc3F0OU95N0dOdEErWHhMOWc4U0cxN01IbGZRNTdrV294Wkx1bmM0TGpaNW9WRjZDeXUwZXNxa3M1TjF1RzRTVFNNcHJGZS9wbFMyN3ExNTFHMVJjbENtNndzdHd0U2ZMTGQ3WEFPSDJVV2N5eW9UYkZoUVRUa1llaWRIaWIrekFEckdyM05PRE05VTdrbmZQZmZjY3IwNlFRTmgwOVFGb3NTM1JrT3lqUjRUSmppQWxVK1gwQjIyNm5vMFdqS1RidGxwUlBYSi9LMU9qTTN1RTF0M1RlbnV1b2pwRDEvVGh5ZEJnN3MwbjQreTlJZXhpdy95V2Jvdk1ZZFkzV0NjQVYvQ1cxb3pyNk9pc0xTd2pzU2pNN2UvMDJSZkkvdEl0QTNWZndRNUtDM3N6UW5Zam1PQWc4TnozYTQrUnVxWlNweFM0SGhabXcxUWRCZysrMFdhNW80QmJwVTBVUFpSbk5PdVNuM3ZjbkZodys0UFBVYzFKY2prNXdIN0xjRzYzaTVxQ2hkcU9Bc0lqczgxc2NEaWJnMHoyR3hpRVRBY1dJbzRPZWVZOWdYSW9MblBKUEdwVGFhZGVlcmZ5Q3gzY2JMeWdRajNQL1RnUk1UMTRHdC90c292SFhFVEtueWhhQXdCdkQ4OElpSU5GZVo0MjlzSGxiaEN3cU02U0srSHlGOU5rQnlkQVJxWjRJbmlQS2JUZ3U2K3lZeGthU1o4ZW9jTXlsTUNZYTF3aCtoclpmRXJsU3ZwR1BvejV6QVVNa3BGQjRDT3BtVkdsRC9sRlYxelB0cWNKTFVFc0N4OThCVHl0bVFzeGxNMzJqNjl1VU43QzJZbzdZUmpzUU1CY0Myb3Z4S3RIeGFoKzhXSXQ0MTdqc2tLalBKR2paZE1NbHJyeXlGZUhvRUx5V0pabWVtUFR1NUdOUTF6RVltck11QVNsWGFPY3pSM0xVR3o2YUdkbXBTcVdzdngyWEhCcG83T2M3YktwWFo5dmVsd05FdEpwNHpRMTYwWTMxL3dhWVVCa1BJa0pjV1BEeldxVERiL0NWeGNxZExTRVkvMFBlZllGRGFTNjNyRFQwdUhXTXQ2bjd2c3hnV1dpQjBORWMyRGs1emEzai9STXhha3FVSjFSQjc0M3hhSWM2dVMzRkttWklVZ3hRcFdFZTZKd3VSZllhZW5xblFNdTNKTkt0dE14UlovSERSc3hkSkZpMU1OVFNvSExaVVBPVmFZQ2RSMk1oNGozZVNENW5MTE9neXJQNlUyemYzNXg3amoxNU5PNGFXZm5wOTkxbjdzNlJqck5SZzZxN1hwTHFqN3Q3ajBSa3pMb0tYb1AyTnd1ZFh2SHVyMmRrWXRHTWEyWndCbFZSUHZFOWNwMnlvWStOUnJRVjV5NFdCbXZsSnNNcHdaMU1GZmwyMkVFdVEza3g2TWZySnVhSmFBTFl3Uk8wc1FZdXZsTkRveUN3SytLek9hb09NbDRCWjZyMzVWZ0hxTUhTM2tsWkhpVmhjT1EyMS9WenV2TEVFdGtyK2o1NzFqOUVSMlJOdG1aNDArcXRXSHQ0YytNTVU0TXA5dFFscUxwUVNnZUtTV2x6YVdxOXdGSDlaUE52YWk1RndUbEVmUlBkL2ZvMUN3WUdhajI5SGRHdTVrNHorc1hjTmlJS2d4L1BDUDMraGI3VTRzeWJGOHRNODNIeFlrTnN2d2ZMSzFxbWN6aldDa2x2c0dvUEovZ3VzZTNReThyOFZ1SzY5UVdMSFlQNlRYWlpOUC9kaER5OE9MM3hsZ2VqZk4rQ2xYMHZBZndMZGx5dGR5K3lQNjhCbXVjNm45V2lWSFdRb3ZQdExOZUEyUk1SQnJITWpQd1hIUElNd25QeXpPdFplT1FxbDVFNzVZMGM4SC9XVW5wK3F2NE1MVjhnTTVGQkJ1aXJGUVYraDNmemhYV1VtL24yeUdWNFdRa25wQVNydUd1SStQSlYrL2ZyY1lBbXFWSEVKQUFqYUExUm14NUxjTXcxYmQ4aWFBd2VMdng2c1NSdXNTWkpCQllrYlkrZU5vcHZBTk1Qc05DbnV0c1diOGVSeFE0NTZEMjA3M0luQXFLSWNqWXRqdmk4V0oxTlJGTEIwQlkvcllDMUMzcm5nNVpQWUVNS1ZPTk9GbkNXZnAzNHppZW90YzUyVVhDcktKQ1psZFJsLzdna0xSS2s4Rk9zKzZ2Wld6cXV2UWh2OXNqV1VtUFhSSXBOdE9BQ2pQMEFoL29LOXFhK1J4Z3JWekMwbnpkVEtwOEpPVm1JejRTZEJGMHNjeERGUXJOVzRLcS9jTFh6aU9RbXMxSTF2TnlWTUlhVnFIbVI4Qk0rNTlZMVNqWjVKTm1Ba2Y5aUd5T2ZpZ3dGNEc2V1B6MWd6Q3FvWEtEVlVSNUorNmQ2RVc1N1BlK3BCTjdjUHlzOFZJcGRjWWVjcmRSOTVzTEFSK3Y4RVhVZHNKV084Q21uNlVoNkw2T01WL3lmSm0xampDUm44NzFRdjlDb3B5UUZNeVdwcktaSTYrRXlrU3J0TldETEVZSExYTTRsZlhoYm0yMmpVVWVSa2xoYmdPTEcrN1B5bWV3VElaTU9CVWF6dXByT1drZ0FmZkdjcURWMTlzcUd3M2dMMnl1VWF2WHgySmNLMVpoeGZWZHZyUjRWeFlWaHVnV0I1dEdjQjQ1ZUE5SWRIbmpteFhYb0t4S2Z3dTNMQi81RU9uaFlHbmxrWnhmNkZBVEp4ZHduRXlIVzBnd284YU5TOENjcHRuVGRKWVdJNnFhYzFCdG95b3VNNFJJK2tCdUI5Vms5SUdvVFRxdE9jc2dxZXRnZ3FCaXlJMVNscGgvY095OVB0NVdLNkpwTkdKczVrK1FaQlJQWVlpakxXYld3U3Z2THQvaDdsZm4zNEtrS3hUMFJQZWtSRVFqRlY1Rmp6KzhKY3RZNUovakRhQmRlcjhXQVZLS3A0bHAvVEpQeCsxWHk5K3YxSExlUW1NZ0lNaTk2WGFOTWRiZi9xbHhUZFB3YlA4N1lXOTFsaFFVU0J1WEJiZ0lpaVpBV0NlSFExYlFvWTQwaE5naXZLVlBybDhWNG9Vb2o5cXFNVWRabWM0SG9YaXk5WFZFeUFSTGNKemZodVpYNFEzdkJBdjRoZ0l2ZXZSaEdCZERQcENoejRKbEg0Wngyam5oMHdqY3ZkOHVmYXY1eWpyKy9XMFdiaFVVaXlrcVM1bm1XdlM0QkI1VjJnd2hWaDFJYjZhaWZNMFhndzF0YWh2SkJZcjAwdllZdFhuVGJKdS9LQnJTbXVIQU9KS05FcEh0RW5mdmhKZ3NvV1hhK2dhNUxRQndvbk1MSU9mNWtsN25vUnRQUldTN2puZWt4S3J2L09sNXB1UHpKSU9ZUUtUdHh4QjFXaDVNN3VuRkdrQkh2eVF2K3Y2TWxTZ1RkblBORThYZWROREgrREVYc3YwZG02MEhCdWd4ZEowbHJaeXdQQUVwWTlPZEtDMTRJMnNFcTlweklTUi93TEJrZkgrbjZVTHJaVlJSRHVaOHpEQVNVcHF1TmtBcjNpTDYyUDhZbDE1ZTdrdDNqVWkzR1BwUEFadCtiQVlqbklBc1Q0YTJqTTBCUkxNbGxmWll3cUVoNzFWT1VoNTA3ZEIrTTVhdUw4RDJYRk5iN0NEZk5xQktTV0tLTjhSNkJ5YjJ2bkYvcUNsdVA5VEZTbnVhQkVsODBIZUU2MHM0ejR0d1dqeDF3SGFGMklpTk01QTVMaXhsSUxPMWo3Q3VWYkI1TEJXRTBCb0ZCMFc5cDZDN01RRE5CdnE4V3hONTVxT08vajArZnRsZDBQTXFqaVlsUzJMcTYxUGJNWnVUV1lpdXE2RkVXc3IvQk0raUZ1L1ZNc2o4M1JWZ0VvREJ4bXU0L3greEpHaStLZTVVM2YxYXp2RjlNQTJVOXFzRTBrSG12VnZtRlhrK21FemhxRHplM1U2ZHZiR0hDTVVmQWdiaUI2dGxGNmc0NjEwVXN2bDd5QStwanNPSCtFNTB4NnlRdFJuSFd0UkFFaEdNUERCREUvV3BRbzMyOFc4dlMrQ3h3Z2t6ZDkvS25iSUFacFUrMmg3dVZVaEVkRXdqTDlPUzZ6alJTWkExZkZwZ3hYamE4YlJvQkVEYTRqT3VheWZBOE51bWdsN09JNGlYc0VXbkN1UnM3UlRrb0JZOHVoeTNvL0xwS3lRWEIycytPZnRYWlJoYmtkbFFrdWFnTGFMM1FPT1hIRDMvMXdlZ3VwS3RsUmZoSGxyV3ZuMzdmb1lnL01zVjZ2WXB2RDBVUjZJZFhNQlVWVzhJcDhJdThNeFlFWHBuK0ZlakJwc1JrNElrckVwcUUxZXAvQTNzc1JyZWlkNEtudnUwcjlYa0RKbHZlLy9KdTlTMmRYNUR3amhjc281SSs3U3o5dmdlazlwWExrdmNzK3lTZEtOSG9ySGtmZlRyV0g4QWJ4Ymo0RnJTZjVzQXJKbjF3OElOeUtYdVh1OGo3OFNFTW5PWUtzQWpKanJxOGZLcXRRUWZDMmQ1SU45ZUJWOUxxdlNmWERrZmxqWGhDY00wS28zQ3pMS01makcwUmdGTm9PTkMrZGxKUTgrQzl0NmxFVkR3UXZpa01pQzNDcXdMcDQzdk1tNmliRkdLVE16R0dERk50ZUVBWHo2SWhGMDJmNW1ORmhjV2xVVXNNQjlLT290WWE2TTdrck1NWEpBYjBpcmMzN3dIYVFWYjhhUzJkS1M4bURtQ081UlByT3Jha0VJSElqcENITUtSRmxUMHd6T0dXZU55emtwOHJHZnBpNzdUaEZsTUtOQ05kWUNQeXJYbXlGRVZTck5MVW53bk1PaVpvUEUzTTZQcElnRHNNamxHbkFDUFJ1UkVQOG8wN2wvOEJNcnYyL2JOc3lVZk83Y1dlUnVaOGl6aHNCRytqbVU1UzY0clBzTFdnTXN2eUdTa21tV0VzeDQxR3pUNERpaUc4SVlsbWVLWWt3SWZFemYxQzM4Vzd6a0RhRlJmbTdWc0RmclE4NWNhS3k0dGJZbXl5WlJ6NjV2OGYzRDhjcjVSSWJSWnJRNTYwaUtzNVJDSm12U08wQnh0SnMwUmZ5cDRYQk5mYkl0dVBsdG5xaHV4aEFlenkzeElieXRDVkJjeG4wVmVkdWtQRURhNnBoTGpibEhuS05aRDNkMFpRSHZJWjNVS2MraHE1R2c4TDVqN0N1TU9FUFc2OFRub2o5LzEzRkxwUllXdzhPWWJ0K3BzVGJ1UVBlbVNnblFHNFM4N2FtcWpEdjFCSUNkSURYMkJyUXRpaGNwNDJQTmhlREhSM09yM1dONFRCNnZ4RHh3QURrZkUyR1hnUEgrQkoySFZPb2RTK3ZDcFFXdG5xTHltbHFHb1BUZTB1b0dmck5xeVRPcnllbDhWTW9DVmo2T3NZcmE2QUF6Z213WDlrYTVlaTJvZkd6Y2ZKczJEajU5dmRMM2IzRzd2NlczbW9zM1hMSVNXOGxGOXVWYXNpS01oTGJzV0VtYnNjTGJLaW5ZNi9QdHA5WXozeVNIYnlTS0JiSnQ4bWpaTzhCcnRBYzFqZWI4ckJKM0tlUEJlSmJqNjF6UjRWa2F4LzQwTnJEUm1LVHdxTU5TWVhZazJnWnJwRlp0TlcrZ0krZEJWbVVObWU5S2RuKzdMUVNOaWVGOG1rYW9IUlV1eFIwZWRFUmdqSUFiQWoxdHhkTzh1ajlVcWRwbUVHa2JyQXJzdnJIbWloRE1GNXpjRzFOM0FiUzJ2QWdmUmloTjh4OFhIUUVEbDRMTXVVY3NId2RrVXRzYklDQ0dBa3l6bVdocVV3OXU1czliREIyZUhkSVV5TnpidzhFSHViekcvVlpQVktaRnNKelV6d2NNZ0ltQ3FzY0lLTGIwV21OWU1Dc1RYRVJxLzFrNG5YMGFVcS9rMEdrR1BHaGxuZ3RLSldETTg3TW1YMi9XVnE3NzZ4WGZHcGZXYzNqSElkZUcyM1U0SEN6ZFZCWXlzdWVJVTY2ZnRWZFRJQTd3RUF5V1BsUFk2TUwxQmxKU1dtbWVFVFdJZzdsdXFIVFM4bU85ZFVITldJbnludEZNOW9tUEFjR3hqOXpsNUc5NHp2ZkIxMkN4c2swSlMrcm9DUnJyREI4SE5mbkRZSWZWTXd6Q2RVYjJNN3ErTXpTYTJuRnhxMExNNWNXaXlocFZwclZNU1RGN1BYcUpjaGFCajM4MGpDVWViK3lMdGFWZnVOTUJ3dUhmYVpoYzdLcExXUEErNW9UWm1rWW92cmlJTWhRcG1rOWpFcmpsNEJpSVp3NXFnelpVdTNqcjFpVlBDc0hDcTJSbGNnTnNoMGFwMUI0Y0VZNTU5bFRSU3hmd3JLdUtLWTVTUHpud3lkZXdHakVxUDR5MTdaenVOWTllMjFQUXRlT2ZmUDBTajIwSnpMRUdKWUhYZEJlR1NVTy9PWVhyZXBZSks5VVdWYnQ1bkJROEs3NzlxN1h6d3dUK1JubjhlZy9LTXdGUDNjTGNlOTdEZ05xOExyV1hwVGJmNnI2bjBlN0N3K3NuSU42STUxUWhHSGNhbnAxZFE0aHNjNjdjUDdmbkszSTRKTXpsTFllMXJUdzNFdzd6VEdEdU16WE1NZy9xWjFsSWFTcEY2SVR6Yy9jRjgrQjdBaE9waG9YYnhRSGFiZkRkS084UWJxTTRsT1BnUU5tc1JoQUlUNHJ4WExvWmFNK1V3aTd2bEdScWdxa0V0bHZMTGxHUHpTSGFadEg1VEZJV3FIdGtobnlybGRGZ2JnbjYxamZyZHRPa2pUcUpXOUVSTDdwWVdLU2NRSTRNSW43VHBIUTBDYW4wd252a2hjOXNxMUI0T0M0bWtIcFM1TkN1eURkUHNBQ0k0aCtTNXVIMWk4eCtRc3NuaWJUY3FWc0JzY2JhYURuenhQd0NYcTZiVHpBNEdRSU91RXpJR3JFL2xCemprcE1ybnAxclJUcVJGNWJQV3ZiTUNoWXY0TUpIeDhTeHhuc0ZxUjJGNXpDQkVERk5kNTE4bVpzcHhsSlZZY1dyNTZ4TGFVRXlndE9md0FiQVhHcFRDRjRUR2lNOGNJUDVGSmdzVGJBaUhMRzFIZjZzQlNsY2dYa21FK0Vub1FyZEFlOTRzV3dxTUJSRVRRUTdrTVAvVGVwVHpra2RuakkrNWkrWnNpaFFwRitkVXBLZTMrK3ZMVy82cTY3cXdRWWI2b2grTHFneHZqUERQZDFyS1p5ZjZCZk9rT3ZLVjRaenhxeTJPTVl3RWhVZXEyMkxkTVYxeHZhNVJyNG1Wd1NpdzE0enEveFRlMTJlZnE5TDhtM3dvTVNLZG5pRDlWbkQzVXozRUNVQldURnN4eTBha3RwYzRNdmdIU0ZGTXJjNjJVbyswdXVCY0E0Z1NJQVZqRXZxUnhnd0ZxZ2lKZnpMeEdVbTdWYmhRWWd0VDMrbnRUV1JRZ3JpclVtQWtrK0lQMm1oYzZwbmhZbUVjdVNBN3BZMUNTQ0dzTklRR3YyQ1luUUpKVDNWeVFFMXhoNTZnMkNtS0FCMWRxTnM5YlJDdHRIQ0h3a0pjcm9ZbG5sNGF2VEJuK1llWDN3aFBTTTdZQmNDaEpxUmlCZzdHZ0hEU01iOUpOZ2o2ay9lM0VWQUQ2OFZKZ2JsZzNuZ204YTFGS2lZL2ZVTGFBTHZYWUlTOWdkOXlCVGtqTzhKWmttSDVQaVVUWW1zWEptWEFQVzRYMWRRM0Q2cFlXc3lnZSt4c0hPYmoyR2VBMEkvd3R4dnUrYWc2TzN6cGk5WGpzRnhOaUtrWDZhL1FBaFZQYURDM3dZNmJpV3JmTW56M0lZYXNuSkZzVHFuUnBLd0JvWUVlVG9kbmxEN0dXb2M4N1VzOXNFT1lLbkRrYytRdzgxbXZqQVArZExlSmhOek0vbDY5akVEbjQySjB2SExlNVVwZDU4cjB1UFI2b2Q2b2tVcFdpTGtuclZBdjQ1L0RhSTB5RUFZMHRFTndpOWpqVVhaU3MxSTIxN1huc1VNdzM1VG1ReEVJODZFQVNncHZUQ296bjBSSm1yeVBDazRlTWRNMlJpL0RBVkxkaG5IcTZmTEltOVZPMmhaV0tDRVhvc0RsUmhCQld1R2c1ZmlXVVNvZFJ0Y1dBZWh0VG1ER3dCOHpEY2hEQ0V5YXNPVVJucktxNG5uaHdVencxdUJBY3l5ODlvQnF1YUxwbjhCWnR1Ymh2QXpVVGl4YmtvWlJrQStweDFqWFRpQUtDZHFlUmFwMlFENXJtaEJhVnlqUy9hWmtFMklzaERnc09IblYvSDBWdXYrajIwS0RSQko5VHRGRldvZ2VqMFFuMWdiT1V2SWIyeEdkaWlQVjFNY2JoVjhETGNiY3FndHlUbUNCVk1CVlhuMkNxMmQwalRlQW83MVE4OEJMY3hESGFRZkRyR1RLOE9sMWZrejNvUGozcytobnVnVUVDL3ZHb2J3OEZRdGtFMkZaNzMrVTBBcHB0aERoTU1RMi9mVEI5c0lYQ0RqeDJnVjJOL2hsWG9naS9VZVozSGJhbUw3aU5ZUzEydEdWTnFDSWY4dkdBNDA2cWdlQXF5cnFzdkRIRUI2dWI3dUNqU0V1K3k1Vlc4ejhvQXE1M1NWVmFJbWlVbFN1ei96Mlc5YWxmZEtnZzdtMi9hUG53Z0F3Y2RteG1XL1VXclRXYWxTN0EvY2lSdFlDRElYeVhJQTA3bEhZdHhPTHJRcmlVWEFUcU80T2xqdjZWeXpSQ2xzZzlOZFdTa0pEeUtkOWIyWkI1S1BLVis0Tys1NzFCNkZROXFmWDd4dFVZY0hJemZGMTFUbUpoL0JWSUk0NjRSU01ZWFhjOXdjNFhiaUMyUHpjSFk1Z00xcUtSSU5kUkVJTFYvUlVqdnRvbThzemlPYTVGMkJiamJUMjNGRDJJbDZMOVFKVmZ2aXJVL1VBL3V2cm9VTU01S25NbDcyTW5MYjN6alV1THZPMFh4elVKeHRuZy81ekJ6WnowSmg0ODg0WFlmM3FFYldyQTBYNzY0UjdSbFdWT0drZnBxZkJyOWZiVk5wVHNrN3B2dHQzTC95VDZDTWhIcFdiMDkwVUV6VnZ0Qk5zZmpqYUpGMnRqVUdjUkpHaWUrbkV5ODNoamk2L0I2SC95aVBTdHlZNVlXSEJuMFlYbFdXdEZvQ2JtcXJKOUQ0V2wvaHdiZmtBcTQ0L3Jhdi96MHRRZWYzbC9Sc05iVEpzV2ZUd0dXbWp0ZE1Rc0l2OFkrbG5Bb3k2YkRScml4RHNleW1BMnpsd1k4REppSzJqWWtBRFlNT3V4dHFpczdPMWcvSCtDUDcxcTI4ZlIwTU11RXRBd1RodnM0Z1NJVmQ3SlZ4enR5U1VSNFpVUlBXaWN1RmpJaFBES1ZCMmdzMFpuZVFxdkVOOW12YmpEd2FxdjF2UitWMVByUEMrZlNPUDZ6bWd6d0xqL01uV0R2UTdKUHBVcU1HOGlialk4VGlib0RtLzJiQmlhdUN5ZTMzNjlPNWROQ1Z5b1BveW8xa1hhN2RuRFZTU0JDV2xZSlc3OWpwNE5hNEhqWjB4M0VOaWFrY29rYUlrbUZNQURXWTlqL2lwK2J2MmpEcmRiVE4vSUVGVzdNTEY5NGROVmtkaUZFQ1VkK1pmU2pWeis1MHFDenFOYjYrSktwcTdqWU1Eelhmdjh0cjdXZmdiSE0wcWNWck9xbWpVYUwyK3JwVW1DK3BlSEVsVXJNRXFBV3oycWRnaWIrZzBxZWFmVXRVaWVEaWlNWGl1UDlyMFp6enJxdlk5YXRoN1EzZjB1eUFVZlZFRFFRTEllQ3RkV1hVWjBXTVpCLzVDa08yd1dlQmZWK3JiQjdyV3hQaHVGZDJDcHB2cktKem00NHgxd3pHNjg0VWxsSHREcm1tV3VXU3NhWVJZd20zdHBTZGJpbldaZUU0S0JENnZxU2hJZ0lCeDNzOG01Z3h6OW5YaFFRTDNRZXo4K0orZklyam8xTGJyRWEyL0hnNi9wZ2l5azZOdUpTNFJMQm9xQlNaR2FOQjBFVVdoWWFyQXJOUDNVZTkvQ1VtdjRFdFJDWVV1Q0EyR0FNL3ZPMERGNDVQbHEwT0hiNHBtdDNSU2VUQ1VlaDB3bGZCVzV5OVU1SG85Zk1FQWUxZkUzSS84dHFzZUh6YmNOZEp5WFIyZVQySUE5NE1iVU56a2ZBSVJqRmo0Y0ZjanVQeE12eENOZ05uRXJ1V2RTUC9jakVpSDZLVGdXSXRRcGM4T29ubXl3aDB6QUVCSHZuT2NMWWM2SThGYWF1dXl4MEh3YUZUWUxkSVBMOG1PUGM5V2RtaWtPWHNLK25udlZVRlltbXhNRDhobzQyV1hLRmVOanp4Y1duWEpkbGFJeVpoaVhteFlJY0E2SS9WOU5pMXI2ZitKL0VtVWxBOW1RemE2a2l5eUI1QjhaRGFZSmxWQ240SlZDOFoyV0Z1eE5tZ1ZQV0hFblR5aGpucEhUWGFab2MzQzdSajlENGI4YVZiNlFFcThJQi96NkhZSVZXNGRQVzNuU2dxam5SMjhGWWpMT3MraUVtRXNKZ2tsMmVOQ1BhcTdrbzNnTUNFeEwxeitqVDZUU3FhZW1HRXpUQStha1hPakNhWHdXMjQwOXJyaUlza3lCcUExN3d6Q2phRFVlSkNtdHYrSVJKdG9ITGJzbHhreGJzUWo1NElNeVZyTjh6Tm9NZHB4eC9ydjl6RStkeUNLTkY5cmhpbmlzNWFscE13MDN5aWpXcGRsa0hCQXczUlp3b0lqUWNJYkJMdFRzTW1ya1VpL3ZGV1JGK2NEVjhzTkN6K09WS052b0lzUkNzN1NERm9NSDM1UlFlU25QMTUrWHp3eFJOZ1BUQ1h1WnVyQWNyc1diK2hpVnEwd3ZGcGx2RmI2dlFwRHN3eU81eTRoa1ZWRlBTSkFzMGJ6Y2ZKMEJUS1oxNDFqVjd1Q3ZCM0svWFFoUzRVZEpXL0xYS2J0aCtZcVczdlVJRHlnU1N1L3FId1pQZit1dENTSDl3YTJOSTJMZnZ0a2RRLzVOalBCRXkyeUdtK3ZXdlRDMUpxVURtaWJENUh4TjdZZml3U0txdE1lMlo3YnFPWmMvWFArOUVqMnBBaTErVmpoZlVBb0NKWCs4cnRxdVpVZlRQbjF2ZWFkSGx3M3FXZ1VOVlhLeVo4S1lFKzhyNU45WTl6S1JTcE9Ua0VmVmJlTG9FS1lUSGk0NzBIZ2pIb2hjTzhOUE03ZlZHT0xkZy9XWUhyeVpTNHpKRUxVbWkyN2xKY1FaSGRzOUVqZmNLL0szU1VtZTZXcGhMUTZEUmdSSUZTdTI0WU1YS1JnaTJrR3M0YlBFSVkxZENNTjRvQ0hYSVQwMEZoYXdjaGVhd1VQQlJEVFpSNGhlVHgzRTJQZDZWQ2FyOWIrbE9oZ2NqRVN4U0d2cVZta3Ftei9TUXVTRWc4dTRqbEMrb0FGSzdzUHpVYU81WGlGUHRrdEZLUDZDZ0JGeVdIUXdwTlFBMFo5VDhoQ3VVbDFxSmZKSzA1WW9DcGxGSFc0REpiVmR2RHZyNHQxT2tLSUxyNFI5c0hlSzE0TW5rMjZQR0svdTB6ZUtNVm4vai9JcGhobXBxVzVDR2trZXo2dVZrN1h3YkQyQnRGSjJKUmJXK2ZNZzBUOENibHFNQTJDYUhGL0J6OUNRaFd4QlR2OUtPVjd0T2NveThURHZteGZTcGFyOVUyVU9RbFJZQzNFZUlFOEVwWHM0NDVuZzdUd0NvZW92R1N6b1VMeFJRaWhWUW9LS1hROWpWMlM2Wk9HQWI4d0s5c2hFb28vd240eCt6N3o0cXNFalpkT1ZHbEFxanphM2VINWY1S3pETUFTSThDSzhKekFsRGRJeTNrR0Q0d3VqNHVQMHhwK203WDREcXkwbHBiZmNIcm5VelYrT0I0ZitYaTJPVk90S0tpejBxaUxjTXlSbjdCcFJYM2RKYlhSN1FvWm9ieHNiZVJsS09TSDhWQnNHQUc5YzRJT0hxQ05McHJzV01qYllYanF6ZmcxU0IzV29LUVdIZmZ1WW1QOG1JQnEzUGpPYjNnMnFXVEpDeWROWnM1S2NCWC9TV2Rna3hnZ2EyMUY5bmRPS01LdGRucnc5T3BXdGdvUUZIL2UwVktveTlTa01wcWNnYUpmdnptYmJraVRBMUt3UjlFSDdTMXRrNmNRZ2RreVZycXZJQzR5bWN0TnFFcWZxeGlHOFh4VkxxUm5SazJKb0hIODNEczR2U3lhSG5BblJCK210VXEzM1dMRkdFL0tZWWZQbE03djRWS1FlNFB1UmxWTjk4UGsvYy96cU1BcmVYNERRYmtrRDdmOUhEZS9NNm4vWUJiOFQ1aWM4Q3J1YnMyWTljMDMrU1gzak5tS2JUT0VuTDFpT3pSVXhXNzZVZGxXZElHcFpjVjhvdzdwVzEvL1c5Q2pteG9XT3lxaWxSaTZIKzhsNS95d1I0RzlCbnpzbC8zWDBMc2VZdXZldWJNRUFBaEpFTmxFSDB3SGFQYmhOZzhtc0tyV2VKMXE5T2NZMXA5eFZuQWdKcVo2QjZUZWY3U2diVUdpTHRHNmwydGdiYk8wRW1PVG9uL0c5RHVCR1AxcXdnZ3psMzUyL0oweHcyM2gvZ2ZqUllndmN0M0I2bDlJcXdEMVFlV2hVSXh0blZ6N3FWTGlTclY2N0xrbGVwQkJHTWFFNHlzd3p1VktzNndxd3M1TjNhVHIwbjErdVA4UCtpOGpHOExxbFBCdmR4cXdNOCtScG1ZZk1Hc0cyNlgxTEF2eG9razVGUjhaZVlJM1NtM0dyem0vVFM0anhCcU1WUWhxNnFNRXljdHBLc09nN0ZMY3FJRU9pamdjQjU2VCtZWS9vcUxtRDVsaGlBUFhpWlFRc1IyNWhIU2JPcDR6TFdqWm1kYmRDa1BETThiY2JJcFZlbnJyUE5vZit1UDB2ZWdQSEQ4Zjd0OUdBRVNScTQvNllOOHNnMlNnVU1VbXFFaWpXN3BFY08yTWg0NERoMG5hWG81U1dZNkY4eHBVN1VFYVNTWWI5Q1JDNGpUWGJ5VFJVUlZ1WGp1N0lXMnBFSnBjMldkb1hCSGJ4SjJldW5iWDdWUDdVcE5FcDd4ZUViQUthaXFjYWJQRFE0N3Nnd0ZxaHlNMVZwdW1FZVRzYjVDMXFSKzhNNDRNMHExZmlPQUJCOGVTZHZ2UWg0U2hoK0FLWCt5aTJOS0tDREs0Ny9XdzBpQkIzQTZvWXZxWWNQY1Z3d055bzA4NTd3QWIzbGdZa09HYVcrTTh5cjVtbTB5cjAxTkxIZFplWHlYZnBhaTRUY2RiZG0xSW1MVzlNbDdtSzI0NVlSUi9CR2xKbjliMWlPeCtWejU1ZjR0eFJ1c3RhWXF6c3dzTnYwQkxyREhyNzIyQm11TXVHZ0xwVXRyS050WVN5aGFsWlNuRVliRWppRVhjMlRRMWFpRFVHcjVLTmVsdER3ekdERUUzQ3hpU3JjTTB6T0hKUWlhb2o0b1FSd0ZGVjVBOFJwR2VGTXZqc0x1QXJLNnIvQ1NnNDAzcmZoR0NjV0pLdk00ekFqN1dpelVhNy8xYkc3bVRuVit4ODhyVW1OcVlCN3h3SHUvbEJoSGJ1RHAzTGdjZVI0dG1kRW1jMzFycmRVSGJMWXZoVnFyYjFSdWVNYUljOCtTRUt6emFOTzVHeVVaRGRrMWdwVkxhTWRNQlZGem10UDB4dTR2NlVCNkdZQS83d1IyWTNnSjRBZ2VCa2RPWGVxYlFKNEQyYXJqWE04ampBV3RZQ0FuQ01sU29BelNBK0ZnY01pOVhSTVQyMitDUUcrU2doRHBSTEhQV0hWWjAyRDZEczltUFYxaWllUDZJRncyalpiYlVIei9MeXJKWFhNaWZDYktobm5BY01haEZTb3dwMmRCZzBkR0lMZWtiTUJDSEVBSGg3RnVVYXowRUp2c1h1RW5INllIZXY4eTl6bE9kRmtGQXB5U1NPbnRwRVNaZmVGRUlIcmRjcU9wemxvYW9nT0w4QzNBeEZuMWdDTVJVOGFoM1hJZk41M0JNTmp6M3hUWXZ2UGdpWE5oeWM3WVFOWHZZSW5XakR2b0pRb1FyY1NkQUtZcFdqeWdmYU9OaWpBQVJmb0wzVW1JVE9zTUFzZTdyakFyY3FGZTJaMUpEdGVPcGIrcGMzdU51YjdGWkRodUozTWlKUjRUUklLanJWbWdKa3hQdUdXMVoyL1VNNnNaaDF0WGc2MmVsNkJiRUxYQzFOblZ5bUFoK0hhQlhnOWxmVVZNalRxeWNEb1BESHlFM2xtZFJkU2lEUWNxVnMvRUI5d29kTTZ2V1AwZ3Uwei9jUUZVek5DZjhabTlZZDZLOHdRcXRuWDVIbDgyRitVVlRSUnBrWHpFcVdHNG9RZUFJdXFNSVMrNlBCMTN2OWFvMzlqU0Zvb0ZORzd0NnY1Mk05QXFaQWJEUGlRVnYxLzdYV3VBcGhIdjFjSHJhTGJoQ2liNUxReVlpbENvbTZjK1F0UHpOWE9Pd0wyRS9pblNyMFFacnlSQXJrTHZXU0VBaExLNHVEQ2dQSVRKcFczRkZnZnVwWkFxU2Jna1JLUDJnSklaVSszdUpPUmljdm5IZkthdGQ5dmd6Zmd0ZWRIVkVvRmg4ZkhXaFIxQUJ0SS9xcWUvcEJNRExJd1dFT0FhTmdQTTZRdmlaWjBPa2NEUHR3eTlkcHhtZUxHc1Voemg2UjRMWkI2WTkvOE43bkJlMFJGTUFqTk9LQ0NZRE5nTmFrWDVnQTYyeTdWcXo3VkRjQUx4bWI1ekJoN2NweHV1ai9wN1o0TERmdVRDOFN2aUsvY1ludzV0SDNaanBvRFg4bVdUZEFlbU1PNjFZN2k1ZDNtRkdlOHQ5a1B4a1FFQnVGMWVxbjJxbEc3aEVyRDZlYVJwS1VUYk02czlXbmxyZUtWS1UveWZsSEUwTEVhdDZiZko2K1pBY1FWRWtIMkxUbHRKSTBXb25WTTIxcFpETzBaaW9zSHJNeXcvSnBqS2wvcE9BTERuYTZKWFZzU0NCcndoZHJWZEFFTFV4NStEaXBSVE9wRDlTcGVkaDNsZWM4SStHcWZhcUFiZmhIWnBsWjFIRTRBODAwTGdYN2JXblhTbHVIOXRROVVJWk9rNGZBdTlqdlE2OS9Rc1FTY1dQRUV5TGNGejAzeDVEUHZaeVlHR2pOZHBISytIcnE3cWpwNE5ONW1CcHovTEpOTUtxMXNWSStBTEZNbGc5cG55aEdSRmZLSjdGS05aRjhYOUJDRzVCNnVLUkRFSXNRRGRkTDU4YXhjSGdjVnhxa0hBNk1iN3V5RHJiMnB1bFRaeVRLOTA5ME9MUXJndXhJYW9qNzYweER2dkhicDNhZEU2T2dNWGlqY3R1UFM2UmNCSm1FT1hMMWNMY0NockVCaFRSMnpCZXNaaTdtNFc0UFYvZm8rMUM3dFZuVmY4WVNxUHJONGVrRWZVRzZuNVRUcVgwVlFRalMxVkFYamZWek1DS1gremRpYktJWFoxbXhQdUVxcG53RlNxVmd6b0pQdFNrNjZYdTdjUkZoMnJOcTFFbDJreGFxQ0oweWdlQjQ5SDcxN1kvcDg5eUY4Wjk3RisrdExwT3M1cU1ORWhRS3d2cUtZM0F1Q1NmNGEzMnNHanFvMkwyaFA5VHN2WUVteHJQa21iZTgvQ24za1FBTENjRzdPaVUvc0F2SjR6Q1lvTmJpRW9hTFFQVGtTSG1IWlh0ay8xYW9GYmF4S2R1WmwyalIwdExNWm00T2dpZythVE9PaVB0UGNoMk9OYlVLSURxZHdlcWJOZENySzZwc1kxOVZ1aVM5d1p1aUtZYkEzL1dvT2tuOEhXTzQ3dUtIeGhhWEc1TjVNaExpNHcrTVlyNTl4NVFLTXhuODNBQUJCWWorMFRHR3laRG9tOTlFVGlyamRVTDZuUFJ4aHVDenlMeUZucHJWN3ZINjR1aW9uUkJyRDdtYnVFMG9tVXJkY2JzWFZ6cUtiei9TRHB1NXJTY3pEc2dLeVFmWEdsK1Z1M040ekNDR1NBNzE4MnFpVjBmcnNnL2hYdmNUaHVRNGxIcTNLZGVGcnBJNUpOTWR4ZHMyYWx3ckNqdUN0Uk9YM1pvWGxVbG9QcTZSbHlWRjEwUjd5TytNemxGL3V0T0NJK2lzQkpiOUZwdjVWZEFLWG9Gd3M4Sm1NQmxJeVFvV0FpNTFyeU9PaHBjTGJLUFZrNWU5OW14NUxoNi9NejhpVlYveURGMEt1Q3dwZVJ6RTQ5MDh6K2U0Qy8zcmVudUVEOVlUM1A5S1FmbGVMUHNNQXVSUHRUcHBqSXJwYTdpV2xJSy9JY2RpOG5iekczbFJMT0hFS0xPV0ppVlFNdGJFei9FbGdsMEZWMjRKUHE0Ym5Fa0Z6dk1LaHRQdTFkWTg4c2xPbGoyUUJ1cDhnKzc1ZmowK1JlbmZUek8vWmI3V2VSbHZNTjVOMzdyNmJ1T0dsOGJmSGpZMDhyNS82TCtoUENZRE9yWkFVaFJSNTd0N1lOamlZa252Q2l2RVkxVVh0TTN3Mmk0Rks5RjQxczAxaHBTSzRmNlNjTWl3N3lEVzJoNC91RkJpNW1nTVFxWmY4SmdjdG55UEo4UU4rUWNEdnRaZmFaTzJIWDAydXlPcjRXdXdNb0hocWFRMTFFTUJla2Z6RDJFd3VxbVRiMnpBNnVzdVJyZFZ2bU1jLy9GUmpzNWZCdzl2Z2JDYUozMGw4UUY5Tnk0R3FQN1hIS3VhbXdIQjV2MXVWQ2w0VkphQkdLbkczRjRyUDJLc1Q5eDFiZHJiL0RDNDM0UmxhWWU3RERCa3kvQWdSL205VWZuTGhoYmM3R3dzaWVlR0MxaC9ISG96VnZKbk1XWU1lc3VkTTR6VkVqMmcyLzh2bnFLdm1OVzIvMG5NWGhYMjZLTTZPeDhJeTVGMnBSRURWZDVxZlhWOEpwSGkvVzIzUkoyekI4UlFEN093ajBLeG9OSUoycDFjY3FsRnJsbzRFNk5aNU1pbnlERWlqSjJ6RktBZjg0NDBjdlNLSGZLY2lIRTlVS1pCWUdBTGVzY0tuNDJqVjVqS2MvNk5OWnNJYWFRQkRpVXpkUUYxZmdVUHhNcEhVWExDaWtES3FtWmFnRlZKUFZjQmFUMEhtaG1vaURNWnNXU0srYmhJZDNvejRqOWg1SGZvSUNnckliZzVwTjh6aERodWVsSUUxalJGTjBONVRNY3dRVEhMM25neENuYWFvOVNhUXNYRnl6QjRmN2dMQzBydTlsaTg1ck9PdGxQcEt3bzZvUVFiR3MrWWo0YWR2TEoyaG9zQ2lpN2ltYS96VElQeTYweEtHZUhOWkQ5M0daRkM4UGowYmIydUpZMFJiT0pxc1VIWjNRakcvV1ZiQk4ydjhLVzNTaG1oOWRYZUt4VVFuQWx0Z1IzUDR0YnQzbDdqc1VFc3pwUU50aWRuRE53VkN6ekVUYVdON1pPQ1VsbEpSK0ovaVZOVytDNDF1Smx6MndEQ1BvUTFWZEczRmdXNENKdG9tNnZCaUF5U01vSmhvYU1NMThxSmE0TStpU0gya0gxVlgwd2pkclZWKzQwUTVodmFwaEt0M2phMVdMc0NkU21MaEk0Vm4rZkVEdzZnSG5BMVNhUWJlc0czdG5tb2RUeXRZeW5iVzRTa21Kd21KU2JTYXp5cUo0WTAzbEN0d0dXa1hTODkrR2kyUmRXaUpXdkl2MmxVMDNteEVGVTZXU21LUUZydTkyLzBaRlRxQ21oQUxMNzZ0dGZjQVpPZ2g3Y3JOYXVnajhtSnBHV3E0L29aai9OTk1uVzNpa0pXNHlTN2E5eU9rNDA0ZDFWd3RRTXFrQXo1aEY5d0ZvYUY5Z0Q0OENKWlYxZzg0UERDdGNJVzlwQWZPd3R3NGVMcStEeHBkN1ZHaE4yWjlzSlhHdmlhOFF6RjF2UnphanZySFRmN0N4Qm1JdFhjaHlUK0pqZFgzb3BubTFhR3c0ZmxyWkl1REFsRlhLSU5HUko5Tm9XRFk3YUdyQUhlNWZ3ckVxbVV2VFRNYWJZeFpDNHFWcnIwMm9QM1hrZElaNm5uclZrZEZuZnhsS1FXNFVxNktKOGs4ckdwM0dCMXUvZkU2UHdSaVFDT04xNTk2ck9meDg1K0s5Y2p5K2h2MEtkbTdJWVgveG9EeXp5NzJ4T1A2MmJUcldsY3dJb0oxMHN4RXpIeFBqSkVpMldwOSs0OU5BYnplRTVqb3Jzd2NZczQxNCtFSytwT2ZBeHR1R0lkaU5OUXozR01Gcm1xdlgvZzVCUHZaYmlOK0c5SFFuWko2cEN6UGxldGZqdmlRWFcwUDVBTzh6c1h6ajBlMVlFek9mQWxEYUNnc001bkdYWW9xVi9RSkoyUGxFTitpc0FnSUE0eVkwcFc3SnZzekx3WGxGd2kvTmtnVnllVVJjVnFPS24yY2NWelljYmtFYXoyTWNLOWw2MUVaSjc2V2tuZDIzVmxzeExMVFEza0NUWXI5S1lBMWhTdldsK0JUMk8vZStuY3JwKzZDQUFEeXlsYWs0UktqcTRLRExHVm80eTUxU1pwMW92djRWQzdnZXVmOWtsUGZoMjFmVEl5Q1dSaHRidDV2RUFaYk9NbjV1bnhITTZGZ0FSeVRCRGlMSkhNNGh2NXB1eUdHZmJkSkEvV0FXemlieXkrNTRXNTJUVlFib2VFdFk3bUsxM3V5Y0JWM0dFWURIZmZZcHc0VzJIT2hROGZmZVo0WldlV0pvUTdMVis1VVl1U0g4NVJtN3JwVTQ2aysyT0RvVjR3a2hoVmRNTDA4ZDArV1hqUzRlNzVITU5zV0NQNnVLUnVSWmxNMytuQytTTU92Qk0wM3oxWG56c1U2RVk4MjJnakNSQm9Bay9oSFN1UUNnZ200Qkd1Y01XamJzRE9YYlB2VzYvRnQ0Um5oQVdIbjFFQjZHRzJET1IyYUE2UmdLeFk2NnE3WlAzY2ZzY0xwTDhJWXBIdjY0ZitEM2g1MGlDNVBoMklhUmZrYmVOUVova21xaVAwQTBzSmQrNHJkU2lMclJXVitEdW5jbGhWb3paWnRTWnlFVElvK2FKazQrRTYyM1d3UGE1VXo2eVIyeHlTM1RjbFlha1lBVnBVTzdMODg1cXZsa0ZQeTJ1aG4xY3k1dThZSDRkTWhDbUltSlJpdjhGeUdzb2swSWJvc1Z4K2RXSFJOc091dkVjbWZJSnFIckYwaXZEMEVyUktwdkNNWVh6bE0zUjZ6U1ZoMFZuRmo0UUxJS3pNVElYR3BjUDRLSkdrcFpGTTJMOURncGRabW41WUU4OStFa21ZZFA0TCs5N0V3d3YrM1RsNmI4NnEwbGkrSFB6eTZpcEtFV0pqdS8vcVcxZ3ZpSTJKaWc4WGg5MkZlMlY4SW8wM2tQTFpITkMyQ1EyK1A1M3BScW5zK1Bmc0tvdzRvd2dnVXJNWlBHY1g3TlRTUms5dXBYRVNGLzNGdENkOEFMbnZZSlhURnQ4bVJkWjZ0OWJJNXNLQ0l1RVFRL3FFNzhkSjZsWUhrNEswQ1lWS0pxVGJma0JTa2ZRN2x4dVVZY0RYK0JJSk51MWtPOEhNbjBrTW1wNm5ZNjIyZlNwUkd4M0RRY2xCMnphdDV0czJEb3JFelVmV3h3NjNJL29qczVYQ0ttNWp2MzJLQWFxVWEvTU9DY0FuMU1qMCs1TmhoQ2hsWC9DUWlUblZyWDF3RmZmcEI4SElmbTBjWDUxaGJQdXNvb1gxVjdnYTZ6RzRYdW9ZdnMrMHhIQVFqeDdEWVJENW0vUzJFNXVqUDlrNkRPTFZYemp3Unpvazl6bjBlWWVFeXBDUEFqTWdXM20yeUFGMTA3VmNBcWNEaWFBRDFWU05oQ0tMdjA0TWN2cWxCa05Gck5QWCtjZkhidzB6QTZwbE0yR08xcTRpY05GbGlHM3UwZ09mNFV0ek5xZ3VzUUtHK1BTZ3NjZFRUb0dyZXpOcVA1dFpxRnVhZzNKSXJyOFVPZ01VajZVOS8vWWUwK2YzL2hBUXVqRVUrT0pNUDFCMmNsMHNvM1pxZVNjckNoMkg1VFlKOVdVQklSOUtram9STGFQMm1JdGJiSy80QVNsMVB5UElPbStEczVXSUlnL3p0ekVQbDVHMG1FdW5tQXNKdUZmR1dQRENhNEpZeXpoU0NaNFcxTVNJT0JvQUF4RHRiRUdKTlVVN0FQSndzUDlseFUrUlRzZUlpTWI5OWxVQkRWdG5DdGFkNDBrSGdDOTAyY2JaSU5NY1BEUWg5NzhBZnZFY2VBcU1OTm5VZFl1cmFkeDBWRzZTWDRZMStmQ29PMlhTVkhmMU9uRDdMOXhPSm85MTJOdlBscENYUkcxTWovVHJDZ0FKRUNobFhDQ0w2ZjNrRHBlQ3dqVUZtaE5JVkhPQ1pZV2MwOWNENG81WGhOT09GdGpRb0N3M201aTJkbWJ3cXVaaDd5aWxZU2E2Q2lSblFkQzhYSXZQMm81MFVpbnlsZHR4Z0VxUXk5dHRKUlZjbE5aTlNSTzBWU2lFQnlXb3F3WUxjUDVxSzYycDFNc1ZUbkErNG5vZnBWdmRzc0RmSitMZ2c5aHZINUwyUEtEL3RmZWZUdURGUllqdVlpMWpMZVZKaElHUjRUOW51MEMzY2JJUUt3cEN6dCtEZU5FNlEyakFQclRmUG1ONmsremdVS2JEY3VadGlyaHF4Y1I1T0NGdzI5d01xYTJtVXFINlhvOCtpYnYxT0R0L1lKYUN0UVMzVWhMN09DNGYyTDIyTFVaR2JZKzl0NnZnUVUyY0dHUU5uaFZLSG9GWkd1QmJGZ09uSi80RDVISjlzdG9EaytuQTA5QUxsSk9LOWJlVDF1V2FmS2ZOOEtHbXJUdFJNMG56NnJTb3pBUjJOTmhmN3RoQkZvYTlrcTMwQ0g0YnlibFl5YUxJN2N0TURrQlk4dmRFdGxXb3Zwa0ZYVmthemF5d1BXUTJVVnZ1aW51Q0FiL1I4bWwvUzRydzJJTlJrVG9oZTVqTkVsaXo5UDUyWDF3dEFTbkFrZ1lXK3Q3WjlYL3lMcVhnU2RiWHdHdFVnbmtWczlzNmIrSlpGU1cyRm9KazFQOHdoQ1BLLzFzVG4zVkxJMWNtQjlleXZCaXBZMjNNYjUrbWViY0c0UzRQTUtScTQvaUNrUXZ4UDM0UDhlUFk5R3lrczNFRHpkZGx0MWNaT3M1cHp3ODNnNDd1YUFjeTBhYUNoMnY3NkVQWDZSRTdBUTJuRTFOeldiVEQyZk1vUHRhdU5GOGc0TDR5b2tGdjRpQzlUSmlkM09tNjZtdXpTYjc2Z3ZEYVZVOU1VQVFyYjh0QjZLaVJNUUNLZ21ULzc5SUlmSFgvTGpLeWU4bVk3ajZzSGg5R0VIMnlEY3N6RVlTczBFczUyWGxGR2ptM0hIMUJpSm0zVk40Z3RjNnBWSXRJT0V0aXhMNkw2N0RGYkdkbnU0WHdRMWJwN3YwRHpuTk9JSEZiV2o0djlBOFpQdXZCS1pOUnNBVzlVMkVBN0pHWE1ZcTRVc0kwUi9OZmZnSzF4N0tDZ2ppQSsrOXd4OUdSQ0RYY1NkWDZ2R0ZlbGRhR2lyOGt2WTc5ODk0dDc5YlE3aVJzaWhXVVduT1p1M0JxN2xtN2xDdHJoWnB0SzZoRUFZekFKK1FpSjJRT0FockhNNzlKb2JKV2lXZ2VmN0RnT0lZUmhQL25rTUE1cmdJeTVsdG1SWEZYdGtpejZRdzBPWVVkV0F0NXplLzFEUllaVDd1cllSYVUxeE9XUUFkSjhXYzRpSzV4aUpMM244aGNReW5XZFM0UFBUUm9JbE92OGRkdWE1elZaanJMcm1wNGlYVlh2WUY1bmxuTVhXUVdMYmY0aHV5Z2hqZC85RExQc1Zlb2JwcE5kZEp2WHFMYUh4eEpnNEpjSTFCTFYzcEtrWWpWYzRNeU50Q0t6UjlHa1JIbHE5QTQvZVg1NVhsNjUwS1cxaEJsOTBnbXRQN3RLdE03ZUpLbUo5VEpidjBuNkQ3bEg1U0UyVWpRNkhvK0ZvQjE1TzZQQ0RQYXlycXAzYkJ6aHgrVFV6QXY4MVNuamtDNEg3MjIwakg1SWFRSG5nbGJMRGRxd3Z2WUtFbHhPWVoxL1VoeElFOGF1VVBQblFiaHIxeDRlNnhsSGNrb2RIOGc2QU1LeGw3YnoyYkVJMGxXMTRDcTlGb3dBazFQYVJta3dvNmlITFF5SWxmNTNFeW9TRFVyQmV4UmRYL3ZMYTFDdGtZQTdKcnZwT3VrS0x2U2Q2TERUT1pCQlNqYnhkQkd1QktuQ0l2cVplV2VXNWpsWUVYbjAvR0syaHRjTTNpNjV4VGIySWFCVlFlYTZVTTVRdkxMWVhvc1QwdmZ6N2UreTVRZWxFbisyT3lCTnVxSTJKSUZKbUFjK29Dazk5SU1tZXlXb0I2WUZFSzFPSW9sZ1ZJNE9qSHlZNVhkbkdFSmZGY3gydk9EaEFWU2d2T1ZEZUROT1hxb0hweWlSSjZOYjdPZnNZTEh4YTFib25EaG9acW84dTZGWjNiVCtMb28zaWFpZmN1VytMeTdsaytkQTd5bXZoaGt5SmZRdXRKcmcrb0xZUFRNcmpHY2s1VVZSWjg2UkszMlhrVnFNcW9aRk9nakw0YmoxeEM5d0pCdGowMndFMlpsNFVSR3E3WmRtUlBZNmRKS3NLNGtnQTEyY1FqUDlBbjhlRXZvamxJN29qOWFPakhXZjVTNUt3Q0pPM1E1RThzcXRmNWJ0a3JLQU1hakk2eGw0NmNXWWdNYmZzWU5yNXJibVhNUHZQQmV6bkN2OW80VmFOR3NDd2tjWlIvbW9NNWJMZEpiRHYwbVUzdmUwcWpwbzhRVElZamgyVmQ2ajJCWHp4SytCMlZTZXQyZXlmRTR3bDNjRHBsM3FxbjJWRDVJaGw1S2FISlJGdzlBWEMzNTVFWVFLQk1GZERyOGdWWnRPak1GK05PeWhOZGlVaXRBcGJqdUU0eDFTc3FUM3lFL3dyVmRINXcvV1lvUUtleFc2UUpBRWJUSEVhSEluNjFmR0hJMkcxZW96cmhibWZHRUZuMS84TDhIZVNJRmQxWG5JME5wbEhhZkFZR1E3WlF6dVdQUUMzbTIxcTRSVmNtb1pwRGlxR3N6c2J2SmVkUjN1Y3JMMnJ2bFVTcFhqYXVoMFJtelkrTnlkNmZJMHBmdUN0RzNZNmdUN0dZVTZjcDRZcmExYUNXQzZIOEwzZStMOTI5VUhFd3NlZTFEVDdtdjZqd2FGakxXTURDMURFdmdTcFBVTjNoMldDYlJVQU1GR2YxVFNYYmxaOWxmOUFydk1SbUNyaWhBdktPRnVkZ1NCQXYyYjZXS05YQ2tieUZ4ZUJ2RjZHOC9KWUpqM0l4M0pMSkZuU1lXVHkzZVZDbk1ZYjdKcm5neFc1d2NPYjE4bDk2dUVmMThkaUxPaGhUUlZIZG0rMWFWanBGMXdyZFgxb2pnNHh4RmxBQkhqL2VTc3pkdkNUbGd0Zk1zR3FHbmJTV2FVNkVwTDd1YmVKRUlvTUhQMnpPVnA2V3NMRUNrcUpEWWN5ZllyVG1wSy96VXp4VTc1VHZIUXFUc0hxVlR4NXkxNmp4STd5cit6dkk3WVN1WHdhZ0IzVVdOUm0vSTB5aDBpWW9RVDRLaXVQb2FnTEpRcVZtM0lMUnB0ZFFoRXhOSVpLZDl3aCt0V09rbGhkZERDRlFJeDU1VWcvUGdsSkNOVXROMWxNVWI2U21kNkd2L2g1Y0xGdlpqMDUwei9jMU9MaWJzaDVoK1phSDFONjI5dnBmS1d0eDNFVld3SE5rMEZ0RUJyV09PNTdmZW03VTlzWHB3TG5qcFpJSEhRdE50azhVV09WbGVMQmlCOEZ2eDQ0VFRIcXdEUTBuYWpLMDZxYkkyUHMwZS9nSmhvRTJUbE94czV3VGZncFRLT29zL2dsTFp4dGJkUjFMU3prUnMvUmRqOFdMNUNRbnpUblRLQUZFT3ZIWWpnVWZQRFo1SmhZTEI1aTlJQkNObVY2cXRqZUE0M294RVlHTXROUVNyUXFPSllTUUVZYlZWQVVYR2hLT25URFAycm8zSTV4Y0VkbGtHZ0JYQ1NUN24rUVVINTNhbGpydXR5bm5uMzV0UUJIZ3JJTW44VUdMeWZvS29TZGJFelNMeFMyUUgyRXZwQUZ6YTlNNWJ4RVJQY1N5bHpVNVJWL3R5TWFZYjRnRmRQdkRPQTFRSTBMSzRSVUxRVzlzTGgwemtJdjBrNjR1TWc4aTFFRy8zWGxQd0dYeG8yTVc2bjJTdFVkeGxXR1VDbzZreWhzb2ZaY3RGbk5NRk5UQjJHSXNralVBOXlhVEJzNXYwanZrRnIyTlBtMi9JVmJlZ01CNmQvOGNWNGtObVhlT1hpK0RGL3U2Q2NMbzltUitFQWJyRjhZeHZNcDBaVHRIVWJJVUkxb0ltMFhOTExRejIwUnNmbnFoZnRDYzVFZzQ0NktBaW4xTFRPS0c3ME5MNDlyT09QK2hqNjhrZEw1QTJIajBNT2RSN1BSRzBiY0xIWHZWekJvVWJzUm4xcWN2R3IxaWMzVit5eGc0V3picFp3U0JiTjNrQmIyY21TUGlFdjZOcUduZzRpd0RLSjEvaWpKNWxLc1ZBUVhORHV4aFp0Tkc5MFBIQjBFaFJQTlZjeTZ5a3lUT0tZSzBXYjlLRXFheW5RcnRrYzVTdkd5eGNOdkZFZ3VKNmNnSk9RZDY3L2gyaFY1YW44M1M0WDcrTWNaYkdDMG0wbkZUSUswSDFBNXNHMkxiL3JWVnZPVW9vdHBWUmp3T0I1OWZ0WDVieXdYeldBQzVUR1JIdVhCRy9UM21FNXJHSE84eVBhYitUN09tR3A4ejI5MjE4Z0FTTXpzZ0tzUEFlYzF3TzJvVWt4MGQyZU5ZUWZJNHN3eDlIREpCSHRwL2trbDZ2MFR4S3krdEk5b0wwaHZ1ZC9kVElvU3pPczdqNXI2eU5neUVTVGpVYVovSFUzMjhyNWxRVmdxYTRodytUVGtVdWNxVEp0QU01M1RMdHgxcjhlTWU0cHBUWEZFdThuZmVmOG1xNlU1L0V5dWJzdXBhY3BrNUtoTjdCUEdjd0pIYU5HTXBWSnI3VTVDcXNiaFFhcTB5UnB6WWI2dmhLQ1pKQnkwUUFneTgwRDhOQkpWbUc1SUh3L2JQWUFSMncxaGsvMHhsVHI5SnN3bklYQjk1dGU2bGk5RXYvakx5YlU5KzFPcEFCSC9CeGJmckV0MVJWN3dGT3I1cUsveHZ4MkFtT0ZwMEVidjcvdVNoYjIrSkJLMUUyakx6RzRQRHZzK3NEZXdudEtYc3IvUHByUFdlQTRPRWtyek04eXI5K0YvSjlMSTZRNysxVnErUkJ2WkFWanYrV2ZqWFIwNU9pcVVnZHlxbFdoN1VSN1RKUDB0aDZoUHZFblpZVFhCRFBDUUdndTRtaHRBVFBRSDJkSWN4MW5xc3h0M2QwT0x5L0xIY0g2NmJuVC9nUGNBZXVEaDhuUHNUemFGQ1FoNmg2WXZFM09SYkRMcHJQK0QyNlRjWmxuRnRCSGk0MGNzZGJjY0JVeDBYVWEzOHdQdW96cmp6RTR1Z0lXMTBhQlRxS0c5Zk5mNHhBSGR2azVUYkhCb291WjBHY1V5Sjk1MytNTVZ4NjFmTy8xSVlwV2g4djlYN0kxUzlTNE5URXY5VDErV0h6N2NTaTdMamJNWnJ3LzhpTVR2L1ZzekQyWm9aT3FpYnBidnpjQSttTXBSMmZIWmJOV055YU9peno3MEMySVJIT1pvTUYzS3lkSEdPU0dMbHdqcWR1a2NSOVRGV1VsVHFYcUxibjBjZ3RSZmNmSnF0WEZEWGV5dFp2aHBkUi9pOHJvb1Z4RW1UVC9tTzFUbVNKVS9HM2lVNE1COVRlZDQ3UXNQTHlYcll3TUlxQ2tWaGY1STZDdExQQ3llRXlpWmtudkJrdzlSR3gxbFI5c3Q5VXp5NExVSVFKeVoyZFZvTFNMNjAzTkM1M3h6bWgzaUJSNnl4WWZTS213ZmkxREdIQUxUZlRvblNCbTRWeHZpNHpwalpKaXRLTHJpYytpY2ZXMGx6Qjh2NnpaVnpvUHUyNWNHTzlacjlKSTFOamNnanZPalcyNEduWlNQeTAweVZvcnRSeXZZK2p6aitRZldldmx4Yjg3bUFna1pRT0YrZ25vRXNPak0wVFpSRjlOeFNVaXc1bHJEdjN2UlVQZ2xyem96TE4wZDVTaXRkbUlIS0lGL0VPWGxXdGhLcUVHNllCQVhweldCZUFMUWx6SE1VSFkxdWdERFNzeS9FRmMwTVErVXJkZkloOWNQMDVEYjJHOTVVUm8rSlhHNEpsOU1UU2dkUDR6WVBJMkRhWkhQbG1ZWHprakFHODJhaE1uMXdRRVhVaXcydE1LMVJQVk5RVStsV3V0aklYWDhDcU1aMHhVRWsrREw5MGNmQWpuN1pLU1Q5S0hOZWFCaWJoaCtUcjByNTBCRUthdkd0K01aVHRQZnpTWWFRa3VHZGQwR2Rienh6T0dvVGMrTVdZOVF6VlBFMHovQllidGJOYUVMdXdXdmhjZFlUZnlNWVkvelBHU09WTGp3d2oyUHZKQzU2M1hrdTBFWW03bk5oUVUxTGtyNnNCODNHNEdXL3FRKzZ6VDNsbmR0bCtYUkVETGVKVGpsUWdnNXQ1MXAwM3YvTkZPeWNjV0s3b2MyZHB1c3dER0w5bkhqbkdrSXBKOU5zcllZbXU5RnhlcGZBRnRML2NKbW0yRk1kUjdLSEJDNDhvVkFWNXVOWXFYdWJMaG1QRW9vQkhNRmMrWWtmazBCYlhlTmlObmRCdERXb082NHcvVGUrV0l5T1JVNzJUSFNPNEw1QklHdjZ5WU9wcitpR3g3bjNOVDF0czk3VElOVTUyWFJMRktxVDBzTDhXcjNKVktLa3NXQWRTanZidWlWT2l6VU1QM3VCYXhZNGFnYXBzYjd0eUloOVUvVHpwMzJ4Rzg0U1gwNG5iSlpZNGo5ck03TG1iNDJOK093Q3A1ZUNsN2xNbTFDdlM4ZjhQdm9hdkJ0VFNKcnAxKzcrSFN5bWdQS1Jid2RvcCtGSDlFV0k2bSswWDMvS0xTVVhYVEg0N1RtbHlsTExKQ2FFUVpMSXBuL2dPTzNKK1BhcEpMNWtYKzdjakxWTW5lR202WmJvVGtRQUZDU3JBUVdWNFMrU1ZFaE5Kbk1tVVk3UWZ1eFNLYmpyVVlMWVFYeE9HVld2bUh0dlM5ZEtJZ2drY3BLR0hLZWZJd2NpUTMwOHZSRWhuRDVnU0YwZkhYOC9UMWFkK2QySjdpK3VnbE41dFJleVFZOTJOVzFsU1BaNnhqNE01WHk4UGg5NXI0UHVQb1ZsbW5GMjhVaTVqblFqU0twWlFLMi9nK2kybDR6MGNML0VUV1lnTFZXQW1Idk5iUVR5dFoyQkh2ZGNDTnBZQzdiZWIyOUpFS1JDTzJ6OFd4Z2JDWWpoZGZNUUU0R0dFVkliNDE2eElDbmNCT25QeWxyVE91QkM5ZHNrdmRIeUU3TDFxandKalZhMkQ5enhZTmRZZXlreDR1am9oYW4rd1VCcGZNVkhOZmk2UmdPbEVFSjl2a25hWDVhZlMrY0FlL21wWkpHd0NwQjdWWGZhUnVIKzZPcEdrYjZNYk96b2FIMlRoOC9LUWxwS3czS0NPb3NHUW4xMEZ2aHZ1QVJFOVBXd1A5Wjlqa21LUWZCbUFwMnlOYTM3NERPVzd4RTB3SUkzdmNTNmJkNGUwVE13emltVE1iVDZUVUVZamc3YWpobC9tV0FlUXovZEs4VW1xSURxZTYvOUgrUFlpbFY2ZTJVeUJqeHJVYkFxalJyU3R5eWFYd0xRdDBPbmxtMzNmZ2Q0Ull2VTNndjlOejF5cDd0QWNYSXAxR2lPUStOOTA0Vkp3L1k4a2hFeEZYVjdEWXlIV1pkRGExUmY3dmZzTFBLekRjZXF6bEZLMVdINFd2aSsvWXFaZjV3Nmg4KzRINWM4VnY2bXV1K1pUYlUwdzF4SnJUSmtoSkc4RmxoTFJmajJjbGFUMnhPdG5xTnNadkx2N3l1WS84Q1hzQU9yYjRwbUhxSHNqZ0lyS3RxRlI1eTY2aW5pOHNlOHRuNHJSc2ZxNW1ORDVPVmhyYnJwbmlweFR6bjV3K0hsU2RMU0hhWGpZTnRnVlNOMFBmWm5tc2t5TURUVnU5TE1ZMmtxTEl3c2doZ3cxMThTc1dNSFpVWVZiUmlWRjFDNkQ2a1kxbXkzeDdteGRocFlQM3FKbVFqU3ZTZkU3ak5QZnVLRGI4MnhBM25DNXk4SVdQbzQ3QkJFdmtCOHlwcDBWY1pSdElaUjc2b0RaUzdxRFcxUFlpa01wM3hYaWZSYzloWVNzeitaTk5lT2NhWTU1eUdtSDAxbVN6V3YwbmNTWkVranRhTHF6ak1yd0NtZlhHa1EyK0hpTGVPTWhkSGZ3R3BxRnJhM3lkdVVyU2dWMmhWZ25nSjhGaU0wQiszWGpVTm41Q1BFSThZcitkYU5DS1h0c3FzaXF4MUw2UjRZc2txM1NiN2M3amVXU1gxSFhkeHZ4dlZDVGxrTm5UTnBqK0ZhSktoMGJPR3dqaktWMXBCOE1CYzEvc1owUnFzTHFKdDVsN1drSXh0MWtEeGVWQU9tYjFUcTFXa2hIbUVPUDdZQVIreW5ZYzlpaXdYdGZseDJBU2FhZUx1SU0xOEd3SWNrVk5ob0RJa3VnNlhEVGJvY0VhZkZDbkl2TkRKbFY4SksvS0p1anowV3IyWXNEN3ZybHVxSytGN3UyTU42QXgyeTZsWU5TVzNnblpwYVFNZkFOaVlmRk1xSjM1WUQxTGswSVBSRThFTmtsMUlrMEFuVk1mQ0tjNmYraXMxc0t1RVN1d2luUmdhU3JmR2RLRGQxVDFkelg3N1E2K3FyY1d2Z0NjY3d3NytiaURHZFdZcmtvNGw4MDBjZ1pvQy9VaHM2T0huYXB2WGM1QTNRcTF3eVgvMUE4WWRzK2d1eXR0SitGcHU0S01vdFhJYzVjYzNSK2doSDJNMXNydzJZQmRlUzNCMXFYemFseTRNa0wwblFlclJyYWNyOW5LYTdtQUd2QWxiU3Fsc1lvWXh5dkF6cVRVN2YxODNWbVV5a3B1UGVvdVA4S2RhSS9nTGd5bUVJV2JDV2IycDhKQ3NwMHdTeE5iUVBFMk1xM2c1VG41ZlQyZnpaTzlUbE03NHNPQXl2N0NNVjU4aXIyaVpyYlFPRXJ6djJSRUJMa1dhWWdtRytuOUpRaFlaVEhSL0puN1Z2R3RwbkF3MDhuUkowd0Y5SXRNUGZVVVZMeXFORWJJYjhKdTFiVE05cXVPL1k3enEzamRMT1BHTGVqdmMwWkRVeGxuTFpvU1dsWWJEbW5xMXlSREhLb2d5NGJpeTJCaFVDSDQ1Z0Y1aUxwd3pxdEtZYUZzSHp2SjkxSlVaWElNL2dGS3VXRkFqL3pzMlF1bjZYTGNRbXdaSzhIWnlUYzhrTnZ1Wmh1ZFpsYy8zMU9zWVBBT2hMbUY0dVEzeTFXTXZYVXZ4V2lPN3AzSDZWQlVRcUplb1FCSDZ2UzRoZjYraElnMElDbVFIMm5nVmxobG1YbU5OZXQ2dHRMcW5PTFgxVnBnaXZLVnh2aGtoalMyNVNrOXhVNk9NblVZU3VpSWhudFJydXBEamdRWnl3M21yaHRKclJuNXB6TENob3pSOEpUMnEreDVTenVaUllnLzJoUDlCNEs2MFVPVHFvY1d4NWllOWJhZE41WnlzVkZsUXVVUzNXMVpEV1B6RC9ZcS8yRENhRnBKQ29jOE9wMExZTHFodXNMMzQrVk5ZS0tVbGJRek13R3pRUFRta0txaGRxMmlLUG53OHV1Q2l5NDZ5Z0NTOGlWVWEwT293UEVodzNKczJuR0R1NWZHdGJSWkRvU1ZESjlXclZwV0gxZHVUS3U5VmNwK2lzbkw2V2dzTWkwaHV5dUJ1eDBoOEc5d2tDUTFwTzVZK2VKS3Z4dmVKU1B5SXlZSHNuMlhOcTVtRlBuVVFHZDQxakVyczhvQ0x0TFFpVEtuTkE3RW5wSlFNSmN3S3FieWV5Z0NqWjFFOWc2enZ1eTV1Q25SSTVOcG5acjdGTExhOTZYdUdmTzE3SHNoTHlCSjVkOWlSaHl5YVplckJFYldzZ1lYcUd1c1czUVVlc1Q2UXM4UVJSTk40bHB0MHZucDNJckk5anM0Y0NsKzQrZ3lMY2s0cktnSXBCMENMNTcxTnI1emI3VERSYmNkWjZnMExtY2RrWTN3bXBrNGVCeW04LzFOWHdZL1p3dVhKS3RBb3Nid2lMTWt1TGJzSnNVMEx5YWo3a2J0bU5TNlc3aWM0ZFdMK2l4UllWbGtQTzFQMTdrTDRNQU56SzZYb0Z1a1JnRStDK0tnUExxcnFBZmdIV2JsM2twYWZ3eXIzMm1GbkI3VkhVNHlmUkRQZHVoMXUzQVV6WmtkbkZvWlFYS3Fla00ybHI4eW9Lb3VUNXBxdmgyQ256MHFMSFJxVkdRYkMwazdRZDJBSlJSZ3pveUZkTWErQU5KUHFJOUlBY3Z5ejhLWU85ZTgrWEg2MUdONTN5enFuOWdiUDFMQTErVjhBZUpLa2tRbS9LeXZzUzFJbE96VW9nWXdTeTVaWTJPYmdPS3FRc043dGJ4NU5ad1hhdTZLN1BvL0R2M0J6dzV3T2VsNkFSZEpjQ1ZhUzJYRVMwOHUycHBxVVFPSlh2Y3RnTk94YXB4eU5pM2NPWUtRREYrR0hBeE1rL3dRMWpwTEhseldJUndSR1hkUjVnUzVKYm1ZSHQ0dWc5T0tkUk1iYXFjMFBrdVhYME9UODRUbGs5R3FzY3dsSkJwUERiWm9GQlRyaXB2d2hJNmVKZnZZWnk1LzJqUmFKc1JmNzl4cHM1UG9uNHFJNHR4RFplQWxxYzFHT0dhSC9ZN21sc0ZKTHl0WG4yTmZ5QUtIRUxNY08vaDh5SjAxOXJGT2Urbng3ZGtQNnBuQ2ZJbGhzS2cyQWdqd25EWXB2bE1lVDlIa3duMmY3SGkyQUsyYlFKdkhqMUJ2QXUraWYwblQ3K2ROdFpJM1k5T1NuRHZoSVNFMHkxWDAyMm96SVNIQkdyVmI1elBuN0NiUHFtOGsvcEFlTnBqMjdKL2d3MkRUdHJOTXM4a3BlTEpHVlRHNm92bUI2VFNHL1ZVMFdiUnY2QXQ1V3h2WXpKdE9PYVFzdEVDNXBBSVF2M2RPVHRmQU5HMXFBZUMxRjlyYjVuWCtQejNyQnAzYy9DZkZjclNnWjJQSGFjSE9NOWtueks4U09xcWxQRkNvSmN1S3IyWkRMbDBCQzhqL3NCYVVuMTdZbWRPRCtHVUR5NGt1ZDRiVTIvTXNRY0l2eE5uQVM0aW1pTmNpd2w5TzhlQ1RlUlpHWi9WRTg0WHh4ZkQxQkMrNDMrQWYxK2xuUk1xVjBtOWhkeDY4TnFOWU9udyt0R3pvK3ZQdW9hMTRPN2tqY2UxZWFFd2ZsdVhOaGEzMUdIR0Njbk9DbVllZDdwSWQ4ZDdSRSszQ3R0cGk0UkJWcFo3b0F4T1lsS1lCUGJKUFp1NWVEdHFSMThqN1B4ZHVBK3l6ZWhrSXdCTzFpWVJVQXE3VnhrWC9ITUJDd3crMmdzM25URm14V1NQM2RaazZGRU1vRzZpSDRSM0tGL1V0QWk2RVVqRVVGTjhIYjRaalh5RmY2L056VktibkVtd0thbXJ6OGRjdjlPenI5ckZnMG82QjRHalBTRGZTVEpxdHBPa1NNYWtYNE5JeHo1c2Q0dFZKdzBvSis3cXBUdHE4T2ZyLzFUa0wvTlBrQmJLTkdzbEpSd252U0ZNbDFpeFBDMm9QZzFVRGtzaHMxTTVCSlpNbDJqUlp3bU9WNEpMV3ZFaUJBL2NuMDJJUHpLNGw1ZUJKWGF0MDZDcHMrcFhMdW5YcTlLbzVIRFRkK1BVM2dJc3Q2KzJxUXVZQTdVODYyc0h5NEp4ZnR0NWRFTDh6ZlpLam9YMVVtQ2k2UFRBYjhNZG83UHcvaE5QbDVqWnYyTEc5Nm5HeUltRkpTaForMWM0c1Q2TTdNaldqRHpnVHlyMnRjakFMODhrQzJFTlRDSnVNUjl5ZUlXOUt3RExTUlRYYmdoY2N5N2NVTkl3SHlHZEo0U1pmQ2wxbFJKZ1J1dnVuc1FOUjRSUzVUMkVodmp6TW5xZTNrVWtsY0F2N0xCNXByai9IZXBoSm94OEtNa1JRbXNlU2wzQjZZUENyU1puaHNwM215OVN3U1F0MEgzS1hPdEpLU0dkdDFlQ2VoZUg4UkczWTIveTRKaXhJb2VDcWN4RUcvNDVob29oUG1FOFVoR1l1UmJIRWxLbXA2cEs5eHNqZk9GNGdabDRKSmJ6YzNnSUNxdGpEMEY3dy9TSGJwVndIYTgxMWxDKzUyYVZxalJ3UVRYVEF2eHc0STNSbEtQUlplUnp3VGhJajd0Nkh1S2ZEbTdVaTczeWxQWFVZNitMak5GM2JRckxFMmttMlZLUXc4NFByUmlRN0k3WEh5cXNUWW5NdG5ZSDQzYVJFMDJrbXI1b3RFR05vb1luV01aUVRISWNiME9ZTU9qY1JUMzI3TDNwNlhwc1h6NmVTdzlmOXU3N256Qk12L09raFcvZ0F0VTFBTjZ3WmgyVkY4R09UZ3hCbW1qVjZoSzE1T0l4QTZ2ZkZXRzBLSGxLdmpBQW5VRXd0ZDFwV1lXRGM5K3RrTTlHMjJEQzd5emZsVXFKVFNJVWNhSjNtcTZ1ZXEydHUzSmJ3ZXo0eEI0ZWRRdlFGZ1J1K2w1VTk2Y2RtM1Jhb0dyQTZZVk5lK3VEaGJ0cUk1bklXRS8zay9HUGdPTmpoVjlZZW9wYkEzWEl5T0VtZXRwVU9ZQkdDcUR4VDZzdWhtWXJRcjVwTlFnV2VMNXJvNi9qQyt1alJJWDRaZENSTlpvWHV2OGtVVDRYNW5QVU1DamVYb2pzYVBzaEdMVWxXZWtuTm9pWkhXZGtOZ2lFVm50TkZSek5sOXJlQ3llUlVZWTRDQTZhTC9ZVEE0MEs4eDd3aXhFK0FLcGlmSHRqQU1uN2pCL0xyMGFxZ1pzV1lYajk4SVFLUFo4cUhKRTd1RGFNRTJGWFVRRFp1K0czbkdlMFJBaUdlT0hlbXZaRktQTzFUcVNiSmUvRjVsbkE4Y1RETE0xSFVyTGJHc2loSUtEUFRPeTM4cE9EcmdNVFNaKzJra2lmcjQ4dFZBeFNWbmFUT2dwYmloS0czOUppMmxLNThJUFY1LzBpNXRRQzZQbi9rVXlXVnJwTEluVW5IbkJucWhvMGhRaWc0TTFJdHJzSXpmcDZGenhTWHRDYXBDY1BCMTBJN3hRSldVb3BZR3haUnF5bzhFRXFmcWZJZWpFbDUxcTh5SE9saU1uUEZwOC9ZSkVMVG5ILzJ6c2FkNTA0TFoyTEcwTkljR3p1Qm01anlYTWJqMFdubEZtaytGQkVMN0Q3QmhLWHVlVWdBN0NBWEt0YXp1ekF2QXpSQlNCRmVvUE9GbWovOFE1bmErWFUwY0NsVTlOMi81ekhsWmlkN2wyMG9uc05ETnRNQXlBanBEZnpxMG9iYm9INy9pZ1RIMDBBdHRuYnJYTHpSSjVhS2xnL3QzUllPNUZjWEpPNVpIOERXVWYvOFByTFF4TkVqQ1ZnelRUMURNVFV1aGV6bXJIVkQ3L1dYaVlQR2E2SGZWZ0p2WlM3S1A5d2JaR1lFZS95RC9MYWZNTlZ5akRaOURZNmdFS2lYWVhjNUxaUXBJMU5XWVY0cElJa2xOVDRtZHdFNG8yNHNmaHBEeFNMekIySnVPU203dk51a1RhSzRVM3ZiVGNNMys3c2RVckRPUklNZ253TUVGVVFmelNadXFFUVFBTm5teGZCYmJrVHdXM0h1YmJ5SnZSUEJtNkNtb0w1R1ZsOERzSFhvV29raWIzcVNUSE9rOEljWlVnVjhkZEQ2aS9URVJGSzlnalRHMThMOGRqdSs0eDgxVkdpY05Kb0tGcXY5ekNSTUdVRU9WVkNaa0FwdTBrOEovVG82Sm5BbzI4UXoxclpCd2s3R0xuRUVEcEZEQS94ckx4NEVjS1pGN29ZSlhCTGN3NFpJRVAxNW5icVBnZm9ueHE2ZGZsZm5OQktrZkJMZWNoa1d3cWZFK3dVZnltbW1WS1BLRVV2c3NyZU5QdVdGUXZxODh3Y1ROQnlCdGM0M0ViZWFOYi9OUlpya2Z0elRBbHgxc05QdllsaU1qNWowTDk3VkVHNitVZTF4YUtWYVZLblV6NzkzVTBocFpmRVFBWVpKS1hlb0dSbkxNWWtvMDNWVGtnRU5zVkoyWkw5WHlpd0dUS2JYSkZieEJqdGVmcFVSUE9WSkU4bi9wNnBQZmhqeTdWWjFDSU1CYjFtald4RUIyWVgreVB4L29qQWY0Sk4xcS9rZ1h0R2xRbWtDZW9STm1oUlFEWmlGcUJsZDUzMkEzaDdWUGUybURaa0tXSmxlV2d1WEg1bDgzNFZJcXkyRXJTUElkZ1Zva1B0aEdxalJZejRnYzlPVVp1cjR2NWk4NFViRUREVU9vRm5lVW53Y1dld1RMVDU4VUJIZ1dPY1NLK2pKZWhpYWc2aHJTSXZxdG1OVjduUm5TL2lOcWl4Sk1JdWtpR01VVTFyMkhFYlVFSVBpdDhFM1VlVVdxRE1OY0hSYjBDWE9PdGRZUFhNYmtZZHY2d2IwWUx0clU3dDR2R1dMUFcyWVhobWR0YkhtQWw0S3dRYUZaaGxsdnc2OHovVG5VN25DRzFUdGtDQzdna0FCVVBCRTZJODBmbkRrM3kyLzk4c2oxc3dqTUR1Z1VjR2NFeVVxeTdBZ1JLcythcEpiNHE4MXNySFNGd0JXZElYdlhDVTZtNkVub0JvSFM3NjBIT1dsTlNnbXNpSzl0OGJsMVpWdlRQM3RZSkhXNW9ndk90eFk2aCtkRFlPajQ1WkFNYXY1RFd2WWlIMEZwblhRR3dZUGt4ZU9KSERLdG03OGhXMTFrMDVKbDBtK242RGoyT3BjWEQ3aExBOHVZMEk4MjVIOVJ0Qnk4NEVCMVplZExab0hVQVF3elBLakw5NiswbU5ncmJCcW16VDVqOXdCTDJPWlhiNlFGRFcxSHZReGRxTno1ZG9HZ0ZuRGFJdys1VGV4REFGWWxSdG1Qc3BaampSWXhCWFVNRUFReEZpcFpTRVYwMEE5TUZRaGJJdTNxNS9ITmxNUVpWOUZHaTltcS9hZm9UMldLY25TWEZ6aEpmbmlZWmI1Snpkc3cxSnFEWTVoNTZpSnoya2VhaEQvUTdTZVVDclJCUHB6a1BMTU93L3hMOGdvNWdoWTlkampGa0ROZEJiSjNMN1p4Q2JyenNZS2UzMXM3Z1QvNW1Iay9sSU9hejR1ZEFZY0U5Rkk5TjF0d1JUSjlXTWdXMlMyZkNzZUxqbTNlZGxEeWdFR1UxTi92QTJscG1sbWFON0J6d0toYjRmQncwNW9RUkY1Y3h3RjAweXRMMEdpblJQTjFJcXBBVkdoa1BpZ2J0VEJpeTh6RWJwcXQ1N2V6cUZtZFVXTEh2aVJ0NDlOdnc2OFNQalZTL3pjY2dvcHZUU05Ca1JKOUJiaHRFZGpDNUd3cGkxOVVBV2RjUEl3SjVqSGpNZnR1VWVHMFV5bFVBV3hFdy9HK21uMTREUmZCUTRZNG9PQkhvVndFdkN3TmpPVnZVRXJUOStZaElsaUIvRWxKMi9iZjlBcEcreVFMUUMyTE4wME1FeE5Xa3JtWjBYSjVPODFoSHdkMDJkTGhTNGx6QUtCdWJDMS9kYitaTXpyUDNXL3IxN3VWd2lpL2UrS01Kb2JublN3OTA0WDYvWGt4VURuNVVieFRVZ3hWYTI5Q0ZlaFhiNitpT2RxWnJQd21UbW94WkQrSGMwN3BCblBJczhRMjd0MUFrSWlORTNSSndhY2MrbkNkak1PZWNxL0tGZHYzSTVNbDBtUGhQUUZyU1d5SW1kTXhSclZWSlZhQlJ4Vlc2Slk1M244eXdJZmVhRk40RVo1UWpTN1p3bStzSThKY3NGSm9BbTFCb0kzUDg0Z1F4ZGhiU3ZHT3cydjNCMWMzUE55U0srVFR5VW5BUGpKdHpZTjBtcFBZUmRQT0lEZHp4MVN3VSsvUTZnUUpaTTA0aU1wS25ncThEUGd2U3FicWQxRm9hdnRoWXVUYUk5d2tqSE5MRUlQdWhtdjdBcjhyaCszdkxOSFlUWmtWRmRuY2luSHhoaUZWYzdzQ1BZNko0TGFLRmJxOEw0OWY5M1pRd3BwSWh2NnF6SUl0MG94a0pkTzZ1bThCYk1DVXpRcDUvY0g0c3pGRDRUUjMyOEtXR1RkR1Ayd3N3MVNuSXNiMHErUUtreWdEOGI5bVlwZmZQRzUxUjd1NGZha1BjUjNLZyt6Z1ZOc2hoTW16VUVDL3gvNCs1L1lZdXBzR2owMnFtVVo2MnlsUkJ6am00eFpBZnU3UUxBR3hheHpZdzVwNW94bks3Z2lKREcydC9VTWsyemg3Sk55a3lOTGc0NGZrYUlJd21waFZzM3hBUG02cVNOL2RtZlN5S0krVWVqUDlBZVQ1RisrandKL0EvaHJsc0hSK3pNbGdyemRMQ1NRSjVYSFdHZkhNTzVWckdXc2pWQzhVRk5nazRmZ2tvSXpxU3gxS3oxOFRkd3Z5WXhTZStUZWw0LzZsK1JYTFp5bVB0eVlWbUxmaUFKOU52djR5QkhSN1VKU2FZREQxaUNUWFUvdHBvcWlMTXRqTVltQk5tc29hTlc0RWtxaGMzVlp3MnVuemJhVjZjRmdscVVDcU9IMDZ0bWZ2RW1hbG4weDJVUzlTU1M1UENDemhyelkxMXFWdml0T1YrSkhld1NlM21LbDN1SjJ0eGc2emt6V1hrU1lSWFZJelNCMU81TXBWZmpQZFFsOExWdVZ5R3ViZUI0dXZ2TFhCUi9zYVkzWFlmNDFnUUtrVkQzQTVsZldVNldYZTlMUVVLUEFnNVYxZExDWGZYSE5ZNWlaNE1tM3JDdHVkMXR4eHdPNHV6Q0pVb2VGTHRNaDlFQSsrZUVaQ0N3OVNEem9DakhpWlllOGZzc0dLRWc5MVFuZkd4aFdGN3FaVWdTZDN6N3lDVUJWa1BYL0V3aGNYRGFPN0VUbDV2eEliUXBaRm1yQUJxOVYvMWxNT0tlZC9MRWtsc3VRR0xKZ004c2F5VzQvRytrYkQ1SzczYi9Ka0thREVRcE4zZVRIaVBZaHJiNHYxNEdSUE11N3F1WW1ReE1JSEpEeHNvbzV6b0x0WHdrQnM5TFhqK2IrZWZ5a1JVc2ZuMCtVYitKQUlEeW9pM0cvbXhCSHZUOGhrN0h4RUlyU1I1UzBFUm5rR3RGYnJTWHlkVjlIbjNXdUxDcHhQVFpCeCtRVVU0QW9CdnJsakt2ek5vQXRzNGNvYXhQMDhsNEljbEpjZW94ejkxQit1dDliRHBBUUoyNDI2K1dzOUplb0U4ZmY3QzkxbndRbHpaa0w3a0REQlBBTEJRMlEwZ2pNSXhsS1ArT2JFOU9rNW0zZE1mWnZ3ZmRhZ1VTV1RSNitGazNhMlZ3Q2RCRXhhTEpWNk1Sa1BPNnBhTVJDUUQ2UEhaRHdLMXVnZHhBTGFlNzJHb0VMT3paamR2akd2YjZnMVU3dHhxK2E2Nk1iaTBsWWE3RmlIQXNSRjM0WmFGL0lNYTE2TGZpaUNhODhSbnhNZEtiNTZobzNwSXk4c0hUalZDRGlYMlh6WGJ1NnN4MWZsb0c0cGt4dk1YVGZwMXNCQ3psQ1g0ampLZndNaHJqV3crTXBCU2YxaFpVMTBIZU1JbHBZeHRNclJNY0NzSTMxd0RvcmpIMitTY0JNeXU0Vi9oRUMwZEg3SmpESCtxSmZMd3NzbHpkMjdBVEFrNE0yYnkyc3hJU3NxZk9mT2hUMUJSdzdCUDhNS3RoMW13bzZFUDFTMFJWMXNFY2JaeThlVDE4RWExVVRLb2hlQ0VIZVp4bE1uR0dUYmlKaXJ4OEw3c3EybXk1cTlDMGtTdEcycHA5a2ZZQmxFRGpDMzBNbUFTUHR0N0pPL0MzejlxSHRWck5KZVVRYlR6S3ZyVzVPb2VReEZ0WXYzeXRBNW9JN0VnWmNWa0RpYW54cGt3TStRSlBRTHBpTlprRUpUWnYyZ3JqZVVHWC9iRTlUaXpEaXJ3dUpKbFdLVGk1aGo5Z0g2YmlxakQ5S0w0TWFuN3M5alRjNDIyekNaMnZTTGwrNG4xNGIzMy9oMUdNOTBHMlRPU0kwVXJKSFZRaHBPYVZhMHNUNnZITkplQ3ZvV1duVlBwdXVZYndqbEY2U2I3c0JLYUVERTkxbXdsMlAyV1ZOWjN5V2Z4MDZZZk1XaC92SHJrYmlpcmRibGFnU0N0dUxMMHlvVUs1QTFsNUlpQVBtaG5hTnZ0RG10VlJieXlOWExIVXJsZzlUZnl6ZmxiZFJzeXZFM29OVTJ3c1l3dDAxbnJ5VHVlbTBQQzgrUGlXemVFNXJnRFVuV29mVS9mWWVTVHB2czViMXdSL1dvWjlwOWx5NlNlSkZwUUM3TVMxSFhuQmgrQ0pYOXdaK0d2UnU4Zzh3dFU2R29peTRITEdIaTUvUmJEK3BaQzBhZmdlTHk0Qll5L3R1RWZ3UUpWRHlVWGFhLzl6a1pKR2NhcnFtSTQ5TFptZFlVNlpwUU9jeGxlbzl6VjQ0SkV0anFUOEducHBIM240SmRmOVRGRStjeXBkL01QRk9LUzZ6TkFiZUwwNlo2TEdrOU9KL3dtSFRPVS85QVVYMlA1aHlqdHVsV2FreTlsOHJ5N0ZJZWxyMFVSV082RDFXTnBQcm5Nd3g5T25lak9IUC9LK0R1aXNWZkZMRG1JTjJIQmtZV2lOWFVoYzZEcW5wSHFhZGtaVE1WV3RpTUk4aDJRZzByZkZQamdjdHBYV3FVeVNFVmcrTC9hL2NWS0ZyTjREbHphTkdrdElQRE1JcWdibFF2dTU2NDhmOWFyWTcya3dUOGo5di9XVWMweU50ZUU0a2t4akdMLzFiYkcvRVlaaEluNU9keGpUR2NpcmViNC8xcVROLzVZVGRTQkkzRks4ZHRIUk9hL0g5eHhDdnRQWHB0a29BUFlYVWNGZ1pEcmdkQUFtajZqZHFiVy9kQzh0ZmZmbGtUWlVoQmNGWm84MnRVQ04rZnN6a1lFNFRDTXp2UFFTN21RNUI3YjF6U2FSRWw2M2dHZXZ3L1hyVnU4eFlYT3J3dTRXdi9PQ2N0Y2R2ZUM4ME1jOGxMMU9yUHE0RmdKVWgrRmJIejdoNkVjTVExaFg2Z1liajY1dno2cGk5Z3Iya3pYM1MrUklZOXNrNFlXYURxZHJqdE52b2JCbnhhZ0NObW1uRDRYeDRsTklJbmlDUU01dUJjK0xwWnc1aEZ5N3EwaG5DdmgyeVpwQ3Y1a0NPSDdWaXFySkY0ZDluY3Uvb1hzRUhZU1BCQTg3MlRWRWpveFJ1VWVqcHZGQXNjMGhCVEpjejNITmdLNnVKOTljSFFyRDJPV2xZTERranBFemM0d1NjdFRJZ2RnMUVoUVFlc1g0MmhJQm9yL0RtRHNMU29WZ1E4cDI2YUovWUMvMittNWt0QXpUTWg5bFo5cDJ5RytpcGpQNmJZSGFQNEd2OUtpSXcvaXc0SlF1NGZJcGZkSG91WHhZYzNJaUhCWmZOWnlQaEJHdWtHOU1hNVhKVHlwTGg4eGg3RFVkd09kaURjeEx3a1FVN3FXSnFqTDFRVTZkWnZTM1ZXQ3NDNkpRNGVmY2xmdkNGTi8ySWhQQUdTcDlFczNoNWRISDNYRmFnMEZHUzEzRTU0SC9wOExwRDgxcXRPUSsxbkVPRGs3Y2RsalQ2aStHSFV6bnFuZnI0dS9TYStGRkhueUZndTB6TGFYQ1NnVTZMOXMvOXZzM0RNR2Q4bE1Dc0ViTW1uOXhMOTdRNGNhNXZ6emIreEFwaXpWVTdGcENudnRZMkduVFNGUDYwa1l2Rk1meCtJSlJ3V1k3eVNWM3MrSHY1R3NYQmhMNkhoVHJKZXFVdGJmR25mT1UyV2VUemtSbG1aNW8yYVg2TkZHN09EUkd4dmxlSm5GUjErWFJ6Smt1bDlaLzh6UTdNdURzMUZkSFVPd3FQcXhjNVo1ajZIM2NYNHZIdTV1d0VpSWgwUW9wUmVjNmFEVjUyN0Y1ekJzRUE5MEcxM3piWGdOMkNnK2d1SythYnMycjhxbFVpRXhPUVVGQ3ZGZ3hjWWNLTXg3VEdaZWJDZGhvL3VwRDgyNU94TTBOK2p6N1pQSmVMZnJIL0U4R1Q2UkRVWVduK1hNUURlczZQVlpqN3Q2dmpQUWNiRWhTSVBFZHVlSFI0bG14WFFQME8zWTloYmV5STcyQ0V6L0xQT084a1krWGh4V0VRZmRLRkI3R0k2c1RvVzRxTHFGTHJaTklOMCtUUitJYWoxZkxLM3d1b2RLOUphRi93MFczekkxczR0aElKUzBIRm1kVFFzNC81K0ZlMzVvTDhBSWlsSVdwSGJrMk9reE5KQUpkRU5weGlFOVlwaHVNblkwYjNaWHlkZnhhc1ZRbjhXL0Q2aWFUN1ZiTlBkR0FnL2taNUJlaS93ZGE2N1FLY01ISEpXams2TVBpN2Eyb0NWUmtBV2xzci9KdjVvZWwyTnM1R3Nhc0pJZU8zT1d1dFlMM3lWYnowdzFiTE1IUjRUK1gzbXNOL2ZreWNEb1p3WWZRVkRJYXJIVTZ1dGV6U29tZERjZEhSbUxxN1BnSDIremtPVVdWaVFQcVJUbFhqODF5cnVvL2ljSDFnNnFWdDlEc1c3TS93RUZDSWZCQjJQNGZ2VWU3YWNwS3ZwaHJ1MmJhT1poaWNqOW5CWUtRUTl1VGx6Z01CdmJXUnFUdUQ3bGZKK0FJYnNKNEF5cjh6OG14dE9EMjc0bVg3aE9qUDdmRTJta2x0ZHhzME1uUitjMzdPUXdmcHJuRmZGb2duZi8xTzcvUTFpM0s4VXdWbHBzUDhVbXYzcVhBZTZFRnRNSG1wUEtDVWVWWEhveVVZMEd6cnZXTkpqUk9CZVpXNUFFdjUyQjlWdlpSOGtFaGhrVXhTRkRkTGlVRGhrcVZPcU5acGdWdXFEREhnbSt5aE1hMjl0dFlIaktUZ0hNY2ttd0x0ZzU0UkR2LzhHQTNIOVBKZk8rRVBFYkt2M3BsTEZQNlY2UUFNMjVRcWIvMFdVTVY5TFR6VmVoUlduOG4xZUpQMEFkcUpEYXJTM0RjUmd6bGErRnkrVncvTlhNZjlUTmdSS0pyUVJxdVl1cWVGY084WmhLT05oQmtwdW9Nd2lOaC9BSzJSQkNObzJmMjFWbmdhUHFEQk02NGVMWGtGemhLREdyZ0VLSDA0V1Y1Y3R1aHp4S29WRTdqQnZOQU0zQ1N2dnZ3My9SK3FScys2VkpGcE93OGZXRXE1aTg1MWo3b0tLWGtFcURHQnU2ZENLVUd5QTUvQVd6QTdjbWMvV0dMV2NSUzNiS2ZsdFY5MmhNc1EvWkJTRlZadk1mT2dZNndmU3hVa3FOcG9ML2kvdWJrdERUejljOVQ2bmQ0aEdzQnp3dkxPRXJMWnB1OWtqT3JPcFVlK01GRzJsTCtBcmliWFd6bmpxZzBYRjQwUHlQZTBwaFk0d0ZHVW9YNy9GN3N3a1QwL0tHc2N4cHp6d0hJR3F6Skh1a1VKeWlzOEpuRU5FbllLNDBldE5QTU5MbkprakZSWmlCNG10aEIxNnJiYS9oTTdBYWwxalkvTXZNdnVTbFNIVFNkRVRiYU9kTWRXdzhkd2FhQ3J1cmg0cVFaNzNYN0VzL3gxMWJ0YVBuMFdNa2dZWmdYQTA5M1U4VUhUMk5qU2xJQStOcXl6UmpjZk9rUGJlWm8ybi8wNXBPTjVWNGlJWGNXTUgwSmNFUmZDTURHejRaa2tWVHZROHpZTnhqMEZneXIzbHVURllkMEd3NThQRllKYWl5cm5ONnBrWVhvVURzQy94WHJ1MWhYanlsdW1kWnM3b1ZPWTBEZWhXeWdua0p3UHFZcFdLQ3RZTnp5eEZySEtYRXFXOWdqZ3p2cnkwdHg0eEtteHJrYWF1NE1iUnRqN29GRkp5SWNRMWVjZ3I4ZHNtWEZZZlNGcks1OTYrOExaZWc5L2pWT0hBVGZyZDF5N3puRU5QNUNGWTdXVEd6RUdFUWxUL2crS3dYaHVKa3dWMWsyZ2M5eGdxay9SRldmek55TzhHbVlVQ1BTNXZwOTRrcGpTY05rM3hrYjExQlFVL2V6V0pyOUVHdEpDdHMvdkpqUHBWR0UxaGVERWlBZnE1elVVL3k3eHdRcXk3cXEvdjFjVFJ6eFF0SnhaeW13ZVBDUVIwMHAwUGI5NmZyK05XTS93aHFzMGkwZGZOSVd6S2NnUS80WjlCWTVIbTFUK3RvZUI5dWdtdDh6OFd2TGRSZXFZcHJ0dWs0T2hoTUo1aFVteThIN3FHa0ZkeER4clgwcDUzKzBieTBlSjFCTUlzMDExNG1NYkUzdGNxc0NTWVlwNUVDQ0IzY0tMemZoaU1qa1RWMlBDenV0czVsVE9INkt5ZzNibnF1cVB4ZEgyWnFaNHk3UUtuOUlYbjE3eFZpTHR4RTZ3TWZYMFVQQUlIQ3c3M0huTnRuY1M3UFZxdzRkOEdnY21rTExhL0JRVDdQazU2OGhQZ0l0dGF0RTI4MmU0ZmwxT2tyNmdGVW9kR21yNTltcHJRbEp6TGhJTlladURZa2RpbFZqdW53SnVPVFR1WWFaalU2NGF3dHRiMDlLZmVxdGJjREsrdGdQUmJSQUNsaUwxWm5DemcrUlh6Z1hsenZFbTlWWXNPMWxGYVdsbjJXWXUyNFBJZzZhVk1ZTGdtSnNmbHp4NTB1Yll4dXBWSmtqWDl4SExESks5QmZkT29vYnYxMk1RMUhsOGpodndBU0xzRGVGS2JDY2UyTDZnbzJVeUcyM3pWeXRNeDAyVUhBeXdMdXVreGZCRk9PdWlxQS8zV093TkZGY3gvdDhPZVlnM2FOTGgrWXpvV25sZ2haRkZ5RHZKWEo5U040Qy9TVnQycThPZUhJelFVUm02ZUNVTC9TUVl1blVLV1E3MDZhRkxONVlNMGIwRVA4YXE5Nm45ZjRNYWhFblh5b0FzeTZvYVl3bW9zVVUrT2RaYWgvWnRXR2pNblBpelZWVmV4Y3p0QVB4VC9GTjFVRmUvSVZNaGYrR1NiTGdQTnRUbWxmUlZKNVR6SjZPRGQrZ21EQ0ZaYTlEYXRqS0YxTmlDOEtxTFNvZ2VKNkRyMG9YSWN0V3FXK1BsemFVaFA5c05MbDFSNkROOTcrN3NFSzJ0S3g5VENqS0Y4Q2ZlRHpma0tnejY0eCs0em1DQnIxbW1YK1VwZFZSSVVLVGRnbUk4Q2J2TW1oVncyVWJYaFQvS2NMQkxFRE1vK0ZTVDcyOTQ5NUJlNEdVaVpzUGdlTU5WekcrRXlPZEd6ZE5iRU4vcUlRbmt0ZGQySWY1QzJtc2NndmxvcHFrcGtBUnVRNWwybStFbFk5QkttSGU4TmFCMVdlUTAzSlZnMTdSa0o3TW5peUlJcUYwc3c3Mmd4YzJsL3JVTDFuUlEzZW10NVBNZkx3cHJiMld2ZXlUckxVeHp5OXBLMnZZN1FKVXQxRHp0TDRVUkpFeTl2VFBUYlpjTlNLc3lEekx1R2FJYTlJSFBtZjdiU244MHVyS3F1S0F3UWgrMVcwWTUwczFraUFhOVZyRzB2VFVoWWh3R0FnV3paU2hVd1FFWGdJSWxKS1BPbVZWeEdoNzdmRTdxemFsKzB5dzFWaGpUd2x6eDAzZ2kvZm50c2pEbHo1Qm5yRWFBdUc5cGxRa0RlYjJYbmwyT0k4eTg5d2prcGgxZDN3a2hZZVpsOVhGMHU4UmNkYVMrUHJRekkyUmt5Zjg2ZSswZDZLK1d0RXpRZ2ZnL3BHOXA0Tm00akw2RjZwZzZzUW54S3E3MDZBVHp4N2ZRUnNIekRwSzN4MnAwWXBJNTVMeUt3OWF3UzNhSG8rOU1yMmRMNkpNL3YzclRpTDJjRkRuQlduMnVxVnczN3BEMEtmNElkdmlqYWt2RmxDdzBYaUJFdEZvZHhFSGF4ZzBSS1Y0TmxUNVBzenJ4aXZYR2UrSC9PV010eEtwVExpWWIwV0o1N2RPOGtOdlBRbE1uRmtsTzJiRFlmQWppZUFKbW45MVN1aU1weXVueVpCanl4cDFoOElvdmVpTWkxbVBPWW93MHFGQjFPb3RNRzIrejZibmg2V0p5cXdhSXR0TnpaMFQreTYzRWovdTIzczlRRnpNdTRHS0RtV3dFelAxZE92Slc3S0RwaGVVNXZMZkpjaEU3THNJdEF6TTF4QWZGVVRRZFVMeXQxSWtrcGs4U25KZ0dxbkJuM0J1TXljeFRNMW5vbFZmN2NWbnNwUnBNTEtEMXFzR204ZUp4RFJPZjVkWSt5QjlKQ29zc3Q4dUVxcVhIaHYzTWdHN291UDJuNDBBeXBHYWdpNzZTRXhVclpoOEtvU2pqRVFEc2VuMTNrd3hKNzNaMG9ob2xXSnIzMEszTlhnalVYMUxZUHM3N2Y3WU9jNXNwZUZ2cko5dHRLYnJQSFhxVmRkYTM3WUNsTEt0NVA0VVZDTzRsdmtQUUpFcHdvOG5FQWh2OHAzN0R4MUxucThtclV0NjN4YlJ5Y2g4dlZzYU52SERFUHYvNFBhd1JvZEZkMjgzTlNYdTFROVh6WVNlb3JpcENCdnp1UG5WOUFOTVlrZUd6Z3JodnNDY29jL3l0ZU1uWFJCcWJYczY5ejVzcUFMUEVodkpXUFhKNUcvMGM3Y1B5alVVS2ZBeVVHR1diZFk4TzZFais4OGp1WTZhR2RWeW41VTRYbW0xZjZMWVhtcHRBNDFtQjdhajhISEExSEo5OWR6YW95S01nR01tbkg1OUEyUlg1WjhvQWF4YVR5Q2ZkbmR3U3pEV2NVOFdvRjFZMDJ2bmVjSFA4YXY3VVVNUUFkRXZuTjVxNVBmcUU4K21GT1JBMkdibmpFNWE1NHphZEhFUXF0cGxscXB6dy91WHBKdGVKV0FRUzJJU2JBV2tScHViM1EzUVZEYkRYNkVBaDRVTi80cGF0RnRtRDhTTnRrNTU2bVR5a0tKMjI1YnhpbmcxNEZkN3JnNk42MGVLbGZOMVhhZUcvU0dLR0o5NERVR3d2b2txcDFiQ1NpNC9Zd0dxRDRMc05UOFVvTGdpWXlQQzN2OG9PQnBocHlaMDJRNlIvZ2dJRCtVb3JKcjMyUE1ZYVpTZjJuQkZDMFBhdEkrRFM0UXBXTHgwcElMOU9JYzdJM3VJVm00RE00UGR4RHJtOWc2UWd0MG02LzJlZGQ1cWJ1aEREOU5vakM4cmpocWFqWlY0dFlhSDhKZWdCb08zRjZDRHlkWEh2c0JmSEoyV2oyUkZlcnlaQ0g3eVBobFdHejhqVEVHd21RR1MwTGRyOFdtRmVHYU5Dc21zN0t0T0szdmprL0xscmJPV0hlMkRTNjBETHpIZkZVYm5JUmNwRUF6VGJ0RGxiZzhlMlpQSDlMTTJ2V29iWmVPZkwyc3hGYThJSjJyR1dBR2FVUXkyTVBJcUJsdm5PbS94N2xqODZoQjU5LzI2WHIwRUswamZ0SHMvcy9QR3g0akVxaUU3cGoxY0FwYVdzR3piMjFOZ2ZkSkVvd1FUSWh5OU9qNVdEV3pvNWNIZUNoSkF2WHluMlhDOGtjc0RUTWJIWUJuNmltU3Z5c3YvWFdpZkc4eC80L1hOcTlJdUxkQ1M0MVIvcVJlaTYvRkZDUTdqL0V2YUFsNFBtVXFEdVUvMTVDd3BiUDFtYlNpTUltdkkyZERBdis2TnQ0dXFzR2R6Y2J1MVJtemlucWZvdE82RXVIalZPeENrQVh0MkZrMWlHZmJRS0llVGsrKzFia1hNRlRwOFdrQWt0dXB2OGJvNXdRZmpxVWtJYjYwL2JvQ0k0WndIZzlid0dieVpLTEFRR0o5N0V1L0t3aGdTbFNidTQwUzJUUnpyNUVzV1pUN2lpR0VIQlpsVzZPUVpqcGVSVUJYTS95RTkxcGlDMnQrSXBZT2pDSVZEaFUrOGlzcXpKZDR5ZXhXNzBXQUc4RzZTMFBvVlBiMHZzWVF3K0NkR1lRb2g3b001c3VsSlZ4aDBEcGx6M3pDY0tkZUZodEU0Mk9zN1FaQkpjbExNOGRUOFdnUVZYbGh2NzRKTlBXUnZrNlpNbW8zREhQakpnSTBMcnlSaDlkREdkcDhwOHRvSk0zbUZBZ2xqRnN3dExHNk1kY3pOMm83bnJQRWo3bHkzczZLaUs5d3cvbmRGVHFVQmNLbTROdE0rZEhRMzZlT0ZFcWMvRm51UExPbUF3emtwYVBQZzJ2QUsxZURyNzRnajJJZm9ZWndkclJVdFErbVFqUjI2dFdiVnBIbC9La25vTXNRSDdQNXhTcTNlVkxnYTNDSFZjck5kWlRhN2lrL2V1bFhVazNDUi9WZ1RxRDZZaFBhZTN5S1N1ZktxL1dxN3F5Z04yUC96WW0rdXNQTklzaGFVWTRvRnBHVW96bUdDY25mUjRQNVBzeFFEZ1dBVGpHN1g1Vm5PMHNWUVVCUGZDTEM2UGgvMmRDRGhKbkM1YWxKbllaOTN5SHVzTDBRR0piRUFLcGFQVnQ2WVNIYW9MWE4rZllyY3lzbjN2V0MzQ3VZRENheC9qTVRHMTA3WUZ6Zlk2b0tMUVdIUERqWktXeEZrbGJQSlhkT2VwVE12V3R0aEEwNSs3RTFHUk5lN0lxRithSTVtTzVnQ0VCWXgyYktyR2RWbmlzcmJ0N0lwZTlRbGpvWjIyQmRoY0oyL3RTUVJhYjZ0dG5YekU2VVVrVTVYKzM3NTVYbVVzcVcxWUFNMnZXR1A3dVNhbThFZDd4SVZkVFVCTlJwMDAyNUdkcytoWGZKamRQZzRsejZGb0hNZTdoQTgxWjlSTVZ1T2pJU25ZVWtlcWwwaUUvbEIvR1VuK0Y0aHNaRlJmbjVXQjdHZzU2TFBiVzZMdDBRMWdkRzBVbHNWekxJQXg1RkwzNFVESUd6MHRQQVptL2lxVVkrY3g3UHM0b1d4QVYyTTRYQkdWc0RsZjVTNU5pL3pURUQ4MGp4cm1Ia1hjbXU4ZC9vdjgvaW9qWEdWdjNFYVlKcjNIOFFobkdLeHZSa1pIT2dHYThuUzc4NkJVb2pYMzJaNDRDcmg4OVhTZlRGc2FDRXhRd29NRFlzVUo1dFhxdlNDR05ISlFyVDdUMmVCbDIrb1hxdTl6M1N3NmVIcC9ONGVSZVdmQURxZVlwc0F1cmRxaWxiOW13NDRGbXpmdG9YYUtybXhhUms2ZWhpZVZNU2lDamhhTEszNzYwWm5CR3NrS3ZjNGU1b3dGNTdQU29BTGU4YTQ3NW9HZFNZK2hoaXIwTlJRaEJoTXZEWFUxM1NBMEVESmo0Y2xFZ0hWc0ZsT2lCNThUWU9GbFVUeDVQK04yUVZQNHB6dXF2TDdxRjNJbmF1U284dXBSLzl3M2hDWml5MlptLzJzUGVRK1p2YVBJa2FJajF6dUhSVDI0WnRTbDdSTm9yVHdkbHM1ZUlYRjg3bXpkdzJ0Q3RCOExoNnE1RzdNci9laGpadlNuZ1oxd2VmVU95SmpHanEyWFYyQXozelh5eWx3WG8wcjhuYUNWTkNTd3Q0TEtGN1N0NUlJMGV0N1ZHTVo0ajY1WWsvS3A4KzdkZVQ0eld4VHZiV2VhKzNUcllmYkZ1UVg1ZXVKRjE5TThBN09pT0hwWFBNY2txbmJDMXdJNVQvWkY1YmhrYkFhWDlsaThTZk9IVTBSS1hNVnRoQXRBUzZMTFhXcEQ3TzN0Q005ZlFNUjYraVA5VDkrNFJGZWNSWjVqMHlHNjBWQkhXYzJCSVBzZEdlTjMvSk9aUUpubnlVbzI0UVBxOGlRaHlsL3RUdjhsLzZKNDVDWmlwY1R6ZGFWS0Rlem56Y3JjekJuTDljTzBiV2hmc01sSFFoQi9maUFHazNnVm5VQ2JwT2cwZ2VKZ3FrdUFaa0FReU5CTUE3MjdveVhqSFdkaEZLRzB2Wnp5SGhQdVFXUjBHRkVDUU1zNHpRQmt3dWdWVTc5cmNzOVZaYkZGNXB3T01vRTFPR0JRZEM4ZFdZNktQYTM0LzRCaFpIRzVmUndRM3QxamJUMlNEa091Szh1djFrZmt3akNNTGxPUE1wdWsyS2cyVkZFSC9YMWEvbXpQRGdZZ01KNWJGS0sxYW13SXdzT21PUTdBTXRyMWFLRGVzSWJkekZlOHZrQ2ZYamNvRSt6NUNOQzhyZXhtZXl1ME12Rms0ODFtT3kzazU4czRTOVBCc3lWc0duRGpKbGZZSHpPbVIxM2t1TTVZbnJRMWtVMHdrZWF4VzlTRG0xdEw0TWU3OGIrR3IxUzJVeExqZDdCQ1AvdkpJK290bmxHM0tIUGxDaEFYU2xsMElaVWJudXFUd1FaVWRWZE5yVEcvZUFVcU9mNENoVCs1dWMwb2xTVzhRazNHY0lRRXhwVHZmaTJmUXR3bU8reUg2ZVR3V1JEa3BSVXNxTzFLTm5XRzNMU2hqa3RMZkZDRktpMk9laTdicU9PeHdELzdwcCs2SjNLMGJXL2M1OXd0Wnd6WllrdldDeDh5ZUpmNVNxcVJMUFNRZFVRbWF0d2VNSTVXN1RkV1ovT1JpVE5LVUtaVGtneE9iNzdudGJtcEVIbzRjYVc1Q25BekFCeGdDNVBRdWxhNXJNZXE0aVg4Uk9DZ2RsNFlYSW4yZWltelRNdlBPcEtZTlJTRTM5bjI4UGxERDcrSlArUUt0Z0NzdCtmbzQ4Vm9XcU84QmUxQ25PbStRaFMwUEZNenh5dHpXNFdjMG1rbmt2cmdCcnJWOXBUS1BBTDBZLzFNUHVYMDYvRHlhbXdVTzVNQnE4SS9XRldKTXhpWXdxREhSUzJSaXhDTjh3U2Z1WUxiR3EyajFmYUY3Y0xVajBDUU9aWHVTT0t6aGFYc2YvUWVmQTBSaUNDQ25XWG5iSWpQcVozUWlZckpMSkFZY1NtTDNEaHJMZm5uZU5FTWt4MnlrajJIaFhpanQxRzBIWW8zajFJMk9Qdk1RMDBsZzRNTktNMzl6YnVvdStFUjNuMWxUU2QrUVNWTUJ1c3NyTnhvQ0RMTE1oVUxlM3VBUmdSaUlqMk12THRBajdJek4zRDI5ZCtJZUNNM1NQT09NOEw1cTdzSC9McTk5OXh6V0MvZjRFMi9zREs4eTJIY1g5SDQvMU1OQTVXRE56c1QzYUNuYlZrMDZFUFJWUFc1WnN0SFdZamhGUjRKRjVuMGhvZVJpZ3pUdU1jZUFRNE5EeVpTVy8xLzJWU0ZSL2ZiUVlxaFNHMlNaUHV3c2VCZmNYUHhUSGxmYWhlckk5SU8rV3RQVzcrZk5BTmxEbDE2RnJyeFhFNmhmNjV6QVlGMkVBTmViWmY2ZWpjcE1SWUkrck5qMk00dFlnaDVSZ2NVSE45OWNLMWxibno4eUJ5eE96VnVzZG9lL0tDakkweXVLZGcrOTVYd2FTbDJkZWFoeVVlUDhlelZJYTNGYm0vY2tMeEwrN0JoRkRrTjNvR0FNeDd6VElad2VrRFZZb1p0d0taeFE1Zmdpek45MHRMc01FUERWZmVjUlVCM2hGRW96OFFVQVhGeVFjdEVOc09hTXNYYkNLVWpNVmNvS3QvZm9sR0xlaVoyL2RhMUxHOGllQ0drb0p2NVYzdUV0ZkV6ZkJWZWlidElxcEZWYXlKdm1JK0ZQb1dYVjJPc0hWVVlxN0NaY1RVL2lMZ3RNQVh2WllDWmFKWXVodEZsWDJGWGFqUEhIN1F5bDg2VHlRZWZzSmdibWd6Z3RnSUQ4S2lpdi9pQkJ3MXRhTkZkSGxpQ2xlNThKUTlDZ3cwTEk2TDNtNVF0dkgzSFNaSGU4bnFmYTlXSS9xZHJsRXoreUVPRXhiR3BNVTZZSE1wNDlYMjcwV3VsQXlBamZQVzArK2U4d2VGSTVpU0l4K3ZWcmU0alFJVmtNdkYwNmZMemlUUFBzQzNEYk93R2dIMzVrT0E0eWZkMUhMZS8vRnN0aVJob09CUlY3S0d6K0tRK1pIK1A2SlBaeXBDOThVUFI5dmNub2tSL3NIamh6V1pXWTJZM0ZBbjF1R3h5aGMydUkxTUhuWTJNci9mT3dWTjhoL0RMMTRqUktRa2xXdHl1Wjc5eXV6Zmpndmxrb0dLeDJNOUlocmVHZjlRVUNRME5VRi9aSmlnR25ucHcwdE0rTzdmZHd2eVU0emR5dHFmdTRjdG9DcGVUVTFoYVRXaWVsRjFsTWtBTXFlZDVYSG1CRlo3WVgvUTdZdU94TmM2UjlJLzhYZmwwbkF5VTI1QmVkMXJtV2lwSkVnMHV2Ri9SVTZQaFcxR01LNTEwQi9VWGJFUEdTL2xleU42eVduR0xDQUtiN2d6cXJkaHlwUTlHVXI0RE9BKzRETE9WNkNYVzgvQjhmSCttVW9OT0JLNlQ5ay9WSVRmSkNudDVaNXEwRTdja0l1bEpIWG1IU1pEeXFiemJ2SW1TOUJuV1JkRE0rVkg2dElwdTRqeTN0K0JLUXdSRFdBU3pUVTZsb2t3S1lWbHhyWjRhRGxmVEZub2lROFU5eGtUbkozY0QvS01GbXFWWmJQRXByLzFrUGxVZUh6eTFIS244VDVxRVVMb2ZQbkY3a3E0UjZwWXpIMnoyYnZMZlRSTHZZWEthWG12OEp3WDdXL1lqb2NrNmZTeGtyemRXbUF5b0RIdXJBb0pBcnQ5Q0dvQmpHYTFVdGUxeDNLdGpKVy9BdHI1NUs4M2FXYythUkE1RjFqL2VpVmMvbFlzbTN1SXNVUUhLQmhBcEphQ0JpMkszL0thWUo1UVRUUy93ZjdOQVhKTVEvMUdYcU1keXZaODRtcU5JRXNoVkJwWjE3dzAxbWdDZ3JnWXNQWTBORlM0WGpzTmF3OExnOGJtMW1sS1gzZ2NTdEZDWUdTcHgzdGtqZFdGZWFQdGVlaE9GVXlya3hnZ2lBd0hwWkdYVmNIVW9rRVNsSmQ0dmhINTY2eS9veGx4bGEwWktOZTdoN1gxa0dCTWc3RC9FYTM1d3ZKdEtzYTFTUzU1b1VWUGZLQjdNSEl4alB4NDRic2xoZ2VGRzJDSHkyam1QanRIMUcyZEpGbmxjS3FYRnk2Z2FzSlhJSGJhZFhIc1NsUU5ycHZwRVBpYUkyTGxKNy93b0lDSUdBeXZCMWx1NlZNUGVCTWsvdWFuRFJFaERPYksvVnEwUFZDYys2TldQbGU3R1pGT1I4R0Q1eC9FbjlaS2RUWUJTU0RPTUVLemsxdWVseEJ2V3JHQ0xnWUN0QzNwVGwycDJkMnJ6b0x6U1JSMlc2cWZmaXpqTUF6NkJqWkgxOTJaWEhwWFE2MGVHUGVJSVI3QjFKeVU5akorem5CRDY1NWFDSGIzcmFVd3hzYlN2VEdPNEswSHFtM1d0ckJpbGNGZ3B2SzhaY29Md09ESnFXNFp3b0Q2V1VPdUtEOE4rT1dZbDg2UVdLbE5xbC9xOVlwbWhUcDNhOUM5M1I3clhucFplNnFhc1AvcnNWcHRMSzUwUWJKVW5RZWFtZ0htLzBiR0c4aCszUzZvVFF3SXVlYVJjSGwrK2hBOWI2TGNkdTJqaDdCUEtKWE9QMElqaTY1SnNXby82aENVc3R1YXo5OStuL1NrdTJDbTdCcEpWVTZoK3p2OXNjTGJDcVVPdTg2U2NHcnRpeERLSDBuL2NucVFSU3hIdythaURGYk9CdVBLZXBzRU9xK09NYWZpU0I0aEJMbkNCc2hvU1g4VkJpMzNwcHZyQ1VYdVpSZjZTM2oyWFpmRHpIeVBZWXNTU2FBUE5pTFNaUkdLaURVaXFlQUNKSzJSQ2J5TzUyQld1ZzJLZExTbzJKOUJpejV0bW5QaWNmR2hsSmt3UkJwUHVDMU1XWGIxanZhMkxTK24yb0dFZnpaR0xNaU4zaHdURUMyU2dzQXFzOXZMSFVnMHJWbnhPdmNsaEpJMjdxQ20rSFZTTE5nS1dDWEROL2hoenpJS3BmTWgyL1V1VlZhdFFSeWRKc3lRbWJoaTdUTG4zdHFqZVpjc1kvaEJYRlpHNmp4SUNxOUs5R0dDeFFLUDh3OVd2R0ZVTyt2K2xoRHl5SUVveGJTZWRmR05kMDJqelB5WUJUeFdvZjVrVklLSDl1Qi85YlIxZEJnR3puZmJ5bm1TS0lsSWVIZTBnTEg1YnlvMkFLaVhPaFNBZFFFSDdyYmc2V20xNUFBK0ZJK2RXbkVEZFB0MVU5QWcxaHhCTGFCUXJLcEdlNDdCRjg3OWpadzdHY1I3TE8zaDBDMVRoV21pcUZsTW1kK0RwdVhRbWFSWGpNSjlqTHZramdESGpvVTNNYmlwU2I5VkM0SkpBWUJMcE82NkhzWVpXN3NjOVhsMWozdWJXRTgxSkd6NUt5emYzK1BxemthbmFZSGNUTzVxS0hnWmx0d2NHTWM3RkJJQ3NucTBQY3ZyOTU4K2UxZFR6V0twZmFoeUlzWlVJVXFoZ3NXQ1lqRGJYVlFHYWxybTJCSFZ6OXJrKzlvRTNUNkozcWJwaHVBQ0luRk5JSjNNY1EvTmJmYjhkQ3ZMVnY0WmFrVmN6d1ExZzhLbFBzc0dhMGp6VHVxSk15ejJYWnRoWUJQalV6VmRvVlpPYVc1VUFXMDN1Z3hxcnc5Yll2djZoR203ZFBHRlFjREhyUjV3bEZEbmlDUG5hT1lxQldLSUNPWkEwT0w5Y0JkL2lPOVkwQVZZemFqYzlxT21YR1ZjVmd5cUVOZ0JIZENka0Y4bU80TGFUaEdWa3NSdkpNLzJ4Nnp2cWRreWNrU0ZnWkg4bXRVZWZwRHZWcU11UnY1VmJtc044VjZNeTRXKzNBWGp4cGZjSlNJYlR3Njc0TVNZdWRRbDY5d1REL0p1TUhMWkhmQm9nQmYvSndoZmh1dS9GNC9jRmRSNUJGT0J3V3ZCNXZQcFNEZU1XYWhTdHlGa1BXay9UNitPc0Z6a3djejY4bHlKKzVXTkpFbHowdjRJUk15aGFmZkhTcEl1YjI5dFY1aUtJSmFDME1yYXVobll6eWUwVTJwYkppYUE3NllqVzJGZHBkcXVyQlRxcXdLL2RENStMYzdaV0lqN0dGS3JFMytBdVpNVGh2K1VQUUp5dTcxZ3JjNzNKQS9wbHU0NkIreTJKb1dIRVpwRC93aUNJS1Y2bHJGVXBEQzUvUWRrODRyNzMvY3BWOUxZMmsxcUxvNmhqemNtMnQ4djhkWGhoUlpIN2NoNFBSZ2FKWGxpbEVZUlFrczNUZ1JmQjMzckYxNG0wcllrUTlTLzVqZlo4SDI1SzR4Ukt0OWc1NlgrNFJpTGVQRm9mRHhMOStrZFRFcG94VjQ4MlV5S2FkMzd6Wjl4MmE3OHkwUWtQWlFsTXFXdjBWc0g5eGwvOFU4NFJOdTNxdmtxM2xmT0g2VFNhY2IvSzM5UzRZK291Wm56bFFZRUxheXFjQlB3THlSejg4OFMydWpXVEUya3VVVHU1a0NGSmczWDRFSWo0NGI2SFF1b01KV0l3YkxacEUrTUFUbVQrenRlRkNUT0I5WUI1ZWFKYWh4am1DWEI1VDZBMnhjbGZ2UE5abkgzdUVtOU5vNHZvbFhBQXJ6dUlzOHdEeDE2Nm80MktGZW5NbC9lU29yaHpBYU1qQWprU1ZKbVFmd2lhdXhXS2JNV3dFVDJiQXl0KzhxcmxJVEtxZGsyQ3hEYTVsdmhBRmYyZHY5alZ5UnAxQU85cmVmKzZHaEtHYkpYa2NndXRsRVMrMWdld010blE5bHNzV1dlNzcvMGlza1I0djJPTVVwUEhDbzRheXNOSS8xdHRwaXFxY3MvdHM2TVN5d3V6REhILzdaeWVlMlVteUg3dDhqMWhScVVVY3M5MmQ3YXRBVE5rS20wY29oamRCaDl4ZWpvVTh6THk1RnZlWlNXeHZ1U3pqQ0dOODRkVDJZQitWUFZBNzcwSnVqeERZeElnR3ZKZkVnVXkzZDEvdjZ4UXpLSmtEOWtXSi9HZjRuU3p2ei96eG5TdHM2ZlpCL1JJYlVCbkZ4MDRYcUZoRE5PTWwyb2hRUDJTTG96TlZyZTQ0RVZ1Ris4ZGxTQmJIaU8ybkNCRnRkTVFNeDVMRU5oYjJhSUx2dmlNbTZ3ZTBaZTU2bXRhUGlPbTQ0VTVPYWpQbytLQ1IydFNrVFhzWHZpKzh1TGJSMllydVlIaG1xSVZiK2dGeWJ0ckFqTHdoTCtpejRLNGtkM3Y1aGxjLzkrbWpaazNFQXFTdElmQjJDdTYxc0dLejFqazFRQXZ6NUhqbDlwQUQwZDl3dUhtN3FMcUllQlQxUzJiZlN4STZyNVlpS3I1azJwQ2VoZHFoSUx4RVd4QjlZcktneG93cC9OODBNWmg2L3dWTUppd2NxY2d0ZDVDL1Vuam1CNVpjVkp0bGVQa0EzRGlLVm5UVElMZ2VCaFlkVE9jVU1DSmVnZHhIVEQvVnU5RnlkNEhFb2JLTVlDZi9aR1FQdmV0aEhCQU5xUUV0UzN1a3hZRXJjM3IxVGtRWUp6bUFzdkN3VlFmK2lvYVdaUGhRWHM2eVVocENtUDA5Y1k3cVkza09GaUp6TTlHeCsxMFNIVEpUUXNYOThNQS9UTDNxaDVtOXVhK25rdGxGL2hNK3VNNThWalBSaitaYzRTNjgrVEZ0RjhiclZuQTJWc3BVM2d1LzJuK2tMeDZ2UktkY1JVcEorMnBOd2dFUDdPdHJUaTNRRXI3U3J5SFpFcGFKRzJlYjNsRmJDVVE2ekIvWTE5MUt3djh2QTQvU1o5ZUhvOExDdGIzRGY4T0htUTJnbEtTOUJSbkU2a2FGVFpmdUw1Q3VLV1NXZDhEMWZlRG1rTWdMMzV1TEx0NEIvS25Bd3hOakRRYWlGMnBkUlRNNFVsekVJcWJGYk5NREFHNFRLSzkrOWQxZG1TY0lWWXVNRnRkczJuL2IxdDNaYUdNL2k2aUJueHdqeG1mNDB3SjdoNDlFWEJSQnA4bmVSNmFhQStqY0djc2hudVpnUUZwSzEvRDZOb0xPT3RwaUl2MW9yWUtUK0phQnpWUTNFa2hoUHQ1cG1DTVJ1TFoweVNMTjN3dThacXpDR1ozV3JXNGpleWFUeXVuREhJc0twbmxMM1dKcnJJeVFzemtpRVlEckVhQzlVNVI1ZDV4Zk96dm9PNG54ckRSbUdpT0YvSEpGM29tN2FJYXdUWExTNDRwemVVT1JCd3I1RlRURHpKeVdZRnVwQ0pqSWo2ckVRMlllR2FSNVIwSzlkT1NrREsrUnBod1cxckEwODhUWUNNL2FzTkplVTgvTE9DWG0wZWZiV3dYUHNhRGc4WTFtWW45RVVYQVY4RkhpY2R5cVFNNXp1aUZtR09IQ29pZkNaQ1NHM2FybmprSCtxUUxjbUh1WGl4U1dtWXNHZi9GZjhxdmZtL081cnRjUU55WGJpZGtPM1FSUGpPOEl2NXZ4QWR6UU5PQWNwbHcwQzd0TWJYd3pKS1N2Sk5RcWpJWGc0YU9XaTBjbzNpYkRoMjByc2c0dEZpTjQ2RlVHTFgrdlIrUW10N2p3VHpLdlc1bUd6SytGaXQxTUtDeG1jNWZSUVpQV0JjMC9jbXJ5UWhmZTJJMWdDR3ZUL1BLU2FiZ2F4ZjREMERrTkNKbS9WT3NOUkMxUlNyUlBCY0dmb0RmcVlsWWg1REQxQWhuWTI0LzBwQUNzVUFiUlpBeEVBVzFXTlh6SXNrMGNyTzVQUDRYN0JHWGdtOFQrWHZmN1lHMDRWakE0Y1pHc2JsY1VkSUJBaE0wWFdidFBaemJRK3llMmtyb3pIZFE2bDVLVFdHSUwrblpNRWR0WkJlWmgvRUFId2hKU0JzUlRCY0g3WURrRlcrbEw5M01JM0tpZFFVQmdhRVF2V0pqNitDU0NvMlV6MGRVVW9KZVhNdk1vSzlDc1dyY0FGMklhaVEyUm83OHNZMTQ2VE1Pa21SS1RUcXU5Yk1SS1d0RE52OFVRaVMxa2pXcHZCcm5UemVnaEJKUTl2NWl4OUJmekJ4ZkpHQ3h5Sy85am5aZTN1RVNZalVhTUFEL05ONlVxcUJLSFg4VE1VUGJKL3pDRFpyOUtZbjlDbGE1RlJGdHY5RFlEV25nSG9kTVQ5ZGN5TXMxbG1FZkdacTNhekM4SnhIdXU0Q0NRYlZqZ0pybDZtTzlxdG9Rd2NsQTh5Uk1YUnhzODdPditCSWFpSjJ3M0pFTEFVRGJRb3FxN0JXNnpIWm5seHBZSWtDOG45QW5iNldOOEtIbkhUOXgyVG4zNjcrc1NLSjFxU3JKSUl5b3o0MFdSQ1g2WGVQaG82Q29wVlZYMExkdlZiZDRwTG5FL3BzZ2l1ajJOMWVENHFDYlU3SkRoaHZVYkRKcFhLU0o5M3gzdENBT09xeHpVRHYrQzREejU0bzMrV3hoZ2I3dE1qUnphbDduUE5DQmlCSXVhNGprb096Q09TRVZCTWxIcGxsdVJSR1ZPK0dGQ2p5NlFDejh0K0dVQ3hKajdpQUt0ZG03SHFyc2EwSXorekVsamNNNys5WXU5WmNyN1dGM09TQmVXeFFwMXJvVzM0YmNlbUw3dlgxb25ZRjFjeVNyVSt4d0FqaE1zNEtJTTZzczhreHo2WlpIYTBFbEQyaHFYY05HNEd0UWQyZUNWZkErUEdVaXp6TFA4WlE1MDZ2dG14NmMrM3FuRVpaWFozYjM2QzVzamVrTWx5WVNFVTZWVDFmNzljU0ZNUG5aQ01FNk1zWmd4YWNoTEZpckZuWFZIMEsrYmtNcy91NzU4bWJPSjZwZTJvWTBIQ2RLbEphbXZUcTJjWHgrUndLTXorZFIvbFlQMjNhRUkxbi9iZWpJM20vekd4eTN4SzJ1RVdWMCtmc3oyWDJYaWlmTDNWWkJMSmk1STNLVkRrT0I5ZGE3b0M4Q1M3QnZyYzlSbVlXUWc3bDZ4VHp6WXVvK2QxTkhlNXNMdUVWSTh6V29ONDh5U0JDSFdaTi8zelFkdUdxWW9EVEN3Rit1bE9GK3MzMW8wbU4zL0ZBVkU1a3dvOTc4M2tMNW5ZT0hqWWFVd1VGZ3BqdEhxdGRXa1hNck9DTktkS1dERnp6djV2ZVd2NkEvYXBuUER5WUhMOVZTZjlEYVVRejNCaUs3elVVUWcwOVRJVWdLQ1RVNTAxVkMwbjlicFJmbS91ZlhMYTc1T2F4L0lGUWRIalV0WEFvUXAzaFJOcHBGOHFsc1JNWEc4a3A4QWNOUk5WMGNsb3lsTi9MRWhLc1JtNGs5TG9xcDRlYnE2WnFQT0NpNkNRZEdKTHJsZmhFVjNTc1FCdE9Cdk5FZ1pWTGtyT29XS0prcUVndDFMOFNDaDJ5STlqTFNxM1JSTUNqbzhsVTJxdGovcUpqenJpQWI5VGRIa2NoMTBPV1dIVy8xYWdreHVRV0dNcldHYURqcURvYjd3bGdFMlo1c2tlK3VTeHQ1NDRyUlIvcEVjT2tRWHNLaklSN1U1Z3kxT1FteVZGNGlxelhnczBSNUhXK1RPTGRyVTlrREFGdFR6MDBGYVlMWHhNakV5dW9IcE90T2d4elYza25NQnhoaGpFeVdKRy9DOTJia3VscFZJd0FjODBxRUt0OEkwa2ZvZUVlMEdOcHJtREUwRGtGTWI1cDE3Y0tQcmNmUE9qRW4zMTZnMzZ2Zy9WK0RpMWNlWEZXcTJubFpwQ1NvVUNDaElqNHFuSWo0Zlo1elJuS1BGUHN0K3VaUTJDQmI3cEJ3MHNHR0FVT2w0YkxLWjJuVUhSbHk4SktsVzlvZkRDM2pyMkZjaHNlQWdRTDkveVJxSEVyMHR4OGkwR2hQZXU1UXdGbjlEV25wbU1uZGliS3RxS3hVdkprWEdRVW9sd3hra0JyNUNPVzlROWx1UGx2c2hrWFdKSGRKcnk1R3Z6VUQ2TXU1dk92d1NDOENDODdpSTlZK1hQNHVvSWtJWWdvYXA1WXhQRm1xS1dSUFN1N05vRk8vV2Y0Q2lYM0RjUXNjTDJYVXZWQmZjNUJFS2ozSG14K2VOUVloTGNpK05wSUJIMU9nSXhuaGthdlRYWWlQNkwrOGh4Zkt0Zi9LWFZqM3lobWtYYVpkc3ptZDh4bzBqSUE0RWtRN3pycUhLY0VyRjRMQ0t4S0Y0YXBFZjVYanJ0S0prcU1ZWUlSRGdldWRkZURjL0ErSzFtQ3RpSy9zdjQ4VVpYWGdlVEVaYmJrS3k4UkFtcUowZTZheDRsb2J0c3BqYVJqYkpmQ1RVZ0xVbi9WNkxhdDBKUHdzR3lsWDJrcmxEMUxZbERLREkybnROQUZxL25kNzZyb3N3TVoycHVvME16RmlETEZ3aHhIc2F5UXRGckpkZjhkWDZXemI0V20yZHFyVDFaMG1rOXJiT1lGb01IY3F2SExuYWVUckMwNktaWURzQlNrcEhNeFdVS2JxOUY4OVNpT2NwaE9YWFQ3bUtTSkJUdXl5ZVp0ekJTRU5nbk45SURnYWZXQ2E1QkREL0FaUVdSVUlXRUVwZElsUjBBTzNhbUZvQnF6RkZtNU1FOE5IZTdSSXZldEg2S1ZBWlZTcXdOYnplaTlMSkU1eFJkaE0vRVBXN3pTVDMzeTExV3VSN01xTXJNNTh5eEUxOWhqQ2syUmlueXpPNzgrR0FLWGhtV0FBVDl0djU1aWNhUDRBYlVJTHlGQVJuQWppNjViVnNqdkkyb3RVTzBOcVRNeG8zbUtXczNXdGFTR2daK0JGR2pKMDlmMFlZOG04Y2Z5TFZSOExrQnRpeEF5L3FXQUdSS3lBeFREU3JDV0ZTY0ZvUUUwNDd3RXdGVndiblprTFdDdnc5ZkNTQ1B5Z2tYU3I1blVZYVBDaDl6cHkvZllGR2dNWVFZNHNTS3JOVGQzU1BSQmZmaW1kV2dnejlyeDBmRitNRTVBMTJmK3VOSE81SWRVUDNrOFZrWGNjczcxbGpqVHdQS2lnQzA3QWxJT3hOb3VGakZiTWd4VU8yTmNiYkxiMlMvQ2ZGemZDeHBTenZvY0J2OFdJVHllWG9WZGlpcEtnRVZkcTZKelVDZVhqRHlqcDkxWjVpVVhRaC9wY2ZQQWJVQkl4SGlOek9oaW5HQ21UajY5ZDNnRmFEZXVmTHpuY1dEQXF5bHd2TkV4Y0hqdFVuUlo0T0tyaVRVSnh0bzlLNWF3ZTlWSmQwYU1hamgrUktRS1liZkQvVmtoVHg5ell3K2RTN0VXdk0vMW5hV0g4eVZHUTlGZlZvWTN6TWxJSkFOeEFwZjVYZXJMRHp4TDNhSU13NE15WlpXWEtzL2NpaTFBUnVsS2hIVFMvZE15MURPMVhGcWVqcU11U0k2QzFvZ0ozOEFGTEwrd2JkRzgvd0Y3Ry83cHFYREhoZDVkV21tSmQxeFNKVVYrSGV3Ni9XRklCK3JPSHFpdG0zZjJwWDVWc0FlUUUvMWRTLzhoK0JEOTBYRWVQR1dDUnVSYXU2UUp1YWZiYk1WQkN6Y1BWdkExT3YwL0hLZXFUMitobUNEWTBtT2YwR1ZNMmh4bnNNZU9kZEx4eDl4V01oRFRGUDZoakNDbDVxbEVGUndieVpxRVp6dktGS0xzKzdybURod1BIbjYwRkxPVjBrVHczZXVNUGdTN0pjakxMcFRNVENIbllBMW5FVkFuZThSY0ZpQ1FzSGxVVjZBdlBxQ21RMzJjNnVsWGh6R3FleVk3dEdtV0ZCYWdkUjFhTlA3aGtBWWp0UDMxeXRwd3gxZVozOXp2YVNpeWRRSEJWdWxjY2tuN1ZXTXAvSFRjWWRReHBKaUNZRFZxbXhOYkR0b05RL04wWXBVdVpjRSszL042eElXM20vRGRock4zSUFYZkxZUVg1T2VrQlpjc2VmUENNSWtNWWNKalZxU0VlR3ZHRUVWMi9HWDdFMitCa2c1ZE1iQ3luRDdXaVFHSE9LUVJHZm1MOTZyanlBYWxMMFpVbDBVbUVWU1QxanNWYzFrd1VseS9nUSsyMkFIeENtU1BCOXFqNkJjZzFIWTY0bC9kaFVMQ1krVlRoaGt0bVFINkpQY1RJeUtiRHp6TFUybU9PS2Y4U3ZwZHJIMGRQZmwvdk5ITVpjMmFqZVNwVkhXWk16SWljVkR6Q2I2eHlQV25USFFxNTd2T3Z4RUMrM3ZzTmJjYVNUS1ZNMzhONFVNSm50TmNtdkRUSWVMZTZQSWNGNGE4NmQwYktrM3Q1d0xwMXRmWHM3SjBDU0VkNEdDbEtDSVorRis1aVg1RG9iT2hYcWJTN3JyYmdLSTF6d3JPVmZqSGw2dEhHNkNMQWNmN2ljUHVrMDRTWTFtUXJvNnJoQ1RIVW1jV0YxUzdDWTBUNHp0b2ZHVFRQVVFPUVJPODRsVkRlb2ovNEhKTXY4U1NaVFIxYVVMZTZwM2sxSGd6UmExSndwWVl6RUk4dVc2N1lnYitsZ3Y5bHRqWFlXcjRWRUNUTTlNZXg5eFJWT3AvNkxHU3luR1BFcFFqbFVrNWh4Nk5icjB0SmRQY2VmWkhheFRDUG05Y0NIZFVldiswYllDRHQrdzdnVVlxZmRVV3AvbERFRk1WRU1JbWRLRlIxN054by9Bak5jcTdGNzJhSTRGRWEwWllDbDJrWEtBS2xvaGdIQzRVbWV5Rlc5bFZqTUVWY3RjK2pyNFByeU9WZkIyWmdmQ3hIQXo2QlpueUVHV1YrUU51Mk9nYUlYTUdyV2JmQmlYcWhqLzBUMyt3THRqeGxMd3FmMXhsa1BLZDFTVUdpMXFGQ0FXZGpCZWVTSDB4WXNZaGwzTDE2WSszd2llVWMyUGEzNUVHZXM1YksyNUxUMDVnL1NKUHIwNnFkU0k2ek5FWU9XSGp4L0J0UkxUZ1NGVHN4QzloSlpDeDBWVzAwU2h4eittbDllUXZTMzRNZE84YkpLWmlzbGFKakM0KzFpWmFqbVhRVlU1QTBSeTF3bytXbldrZ0dsNHRwSmZOSGdwdzFsaTlwR1lSckorOWNDK1ZrYWhCQXU1UStiY0dHRlQvS3BrV3dsVFVMZy9naG5VQ09ISVgyaFdvZnpMTkdFZHZqY1F2MnprZ1ptUldlc1oyak4xYjVrcDFCN1c1MlM4bDZHY2dOckNxUUdHOFJlQXBxVlIxN2pjTTU1U1hTYVk4TjRiUnpFZSttSG5TNGtxWHdCdXJ0RlpyYXBnUUNzajZxSTExZTlqbUJTZkpmMzAxek91VFhqM0NyMDlTYjFZZ1A5ODNPNzh1NHhVSXhnMmNTdFJZWlRzN2VvYTlUVXJGVkhwQWZBL25BNC95NGJLQ2RyTlhLMXhKZFBOMXVqVE1TQVBmVCtTQW9PTkIxNGtFMGp5cjNPQlpESWdTMFNtRHpuR2k2cW01Y01CVnRab3RPYm5RNWtmalJ4dkh5V1lLbUQ1MzZYQVNWUGRtTzd5a0c4YkI5amRnV0RSTVZwaTRob1NJUUtLTVkzajlJbmQxc3ZDTHNITmZwM08wTW5JeHF1RXlWa3Q0UTNremtZWERyUWtTdE5kNEgwYTNOYXRHUGdheUx5NXVrM3AvYVhnWkRnaVUwaFRiUnd5OFBBR1EreGR5d0ZRc0tTYURvMythS1d0MkhhSkFEbm9XWnRIdkZFdnB5T2o0QmFkUXZUVkhnMkdESjlSMTlmVzdJZW9scHpCQlgyaEJ4RzY5a0w5dXF3R1FMSFV2M2E4WUVNVkptdFVOS1YydUJ5eGI4a0FSMG8zVVVlc1BtZUU0aEsxM1RqeHNvOUdremVtelo2VkVOWHhDTlZoazBIOUlCaXp6elJYNm9vOHZTOGc1SW9odzJmUkIxKzFHUzUrdmUwOUhIZjF5QXM3bFpJSkpKVXdmRG5lZzFvZWVWaGQzWndzMUlqa3N4c1dVTk51dmpyOHFHNXllT054UG55QnJJQXFWZGloNnlwWVd2UTljZzVPZjVxVmYzWUhWRjhxa3Y1c09JNGVmbnlGVGRXY0FlM1ZzdVMxM2xxNE5qSjBxanNnUmMrVGQxT3BnZFdSK095NUpLMC8xRUt4QnJweUxqQnlrZzg0NVI0WU1PcER0SzJ0WXlXNTloTmlzazNoQ2ZQS0E3MjRuakhaelMxWlUxYXhxK0JWdzVtdmhiYVB5ZlZtMmpTMkduTWo2SEQveFQ4dkFqUmRWMDRydTUyVlVmRFdRRFVmbXlNM1Mzd21BTHVDNVpIT0NkZW1vODU5VUFBNnQzUzlWRy9Fa3RhbXZPK3BaTUNCRU5WUjh0eDVxWWJCbkVVaUxDWmZkZHlGMXFNaE1VekFlZFk2ZVNKanVTRm56ZldHNUdpU2hQOUpuaGpOc0pTR1BiM1pQZlpBYkJFUks4YTc4TUxESXFiR0tyVDBiWDN1TW1uSW16ZWlKa2NNNVo2NXUvNGVHZTEzcVVmbjFNM1JSd2dGNWRoaks1SHZxZGxEelZIaEdpdXVkeTNpS0w1YUpoN2MvdmplSWJ2SFZ3Qmpyd2F0dGxvMGF4ZUowb1lNcUFKL1lzYlV4R3dBUk85aVpDUC9MMWM5eWJZdUpiOU5sSEVyczNWcVZPY2dKdmVqckJPbmRTbXVFcG83V3lMTVNNVG5nNEphbHlyU2pQRVh1bURFTyttb2VmWlZ1eXMwbEZBQmllOC96RWJMRGh3UlQzdG5CYU5mbFUwYzQ2WDQza3REbUxxZzZkcGNTTG9iTGIwME53czNFWHR1K2p0U095d2tXVk9WUERXTkgyd20vVXVwSm1JUFFMSktoQ1pmL0pUbWtlOVUzNlIyeVp4SFowU29iMHZNZ0NSV2UvbjNiVFZPNENmQUVZN05Ba3Fzemd0RnVqTS9vT0Jab1k1N2RUZFBHRmkwSXZWcE9PZFhQQWd2ODNORnFsU25XYS8zUkxUOFBVR2I4b1dvWkJGdXVmd0pBTE5RdXZPVHdlMHVUU2IzYmJwNFFQeERycGFGVzNUbFRoajBtekNWN0tJWG1oVy9JYkdZOGgxaENoRm0xeEo1U1BIcVZ0U3VLcmRXOVUzTVE2MVh1Y1ovR3Uzc2cvNEQ5WnZJUHBYZnJCbzVjZWxhcEs0NUtteXNwb2htS3M0WEI5YzE2TFgzaUp0RG00c1ppY2Urc2hGL3l5WUdaVm5teW4yTDlBSno5blVLQW9BMnZJZ1dSSXh1bTUwQ0pGUnVzS0tVajloSkw0V05YV3U3VVJUSEVyR0JYTmhRK2c1c0x0YUk0TDVKM0dhYmtHU21RdEZSdExnQTc2YTR5eU1hamZUV20xako5S3FYeWpWcEs2eWF2N2p0Z29tVlhpdTZPUm1TMVNFWXBVNmJnZGtiOHBlczhPcDhWaFJaekxMTjd2aEt6ZnFuUllVUWZOVFBKVDMzTTdOc1pZUFZZMUR2RU9aK0o1TU1CemFhbHZ1SGNma2cwWStHaFNnWWh6d0xUQUpqd043K2N6aElZb3VyaUloUEJUMW0rbU1nSGdVNHBoWUVDcHhrT0NueE1TLzIrSHpreGY0MFNuQ3RjT2pOaVFpUDR1TktEMEM5SW9DM0dCRUtkWFlBQmZxdThLVkFqWDIxZEVJblBIYXNhWjFrZnhacndTMWg2TnRhVnV0czB3Mmphcy9CVHFtQjZQN0x2eXZ6c09LWFRydlhEdVJIdzZvSDk3K1hPRG9NV0RpVk0zM3BXRkxrZ1k4dXpaL3FoSXc3ZGFSMXJiSHREcTdvSnZ2OU0waEh3WGtuRWVPM1crQmEyUS95SVJIa2wvdFJQTTJjNm9UUmpwN1RaT3RiU3JJTXBqQjdFNVpOL1JzRktJMVBha2VZWmpqcTZ3c3lWQWJLZXVUQ2t6T0RIRS9wYVIvNzlmWkZhMDN2aDdMUzlVMi95Nkk1cGl0eW55ai9MRnVIZjZrdnZPTnpwWUd4UEs1QklsRUtoejVQZ2w0NEJQMElxeDV4TmZKdkM1aTYyZ2FNWk50aVo4emVJRWx2SVFpZ0hoRWtWOWVCbzVjU3dUdldKd25IQ0Z3Uitrbi9meWdaK1U4QWprSGZiQm1CbTJIZ3U0VTJaYWFZQzZ2YTFiQXAxcHE3SllJUURYS1lwQ0U2d2JYTE9pajVqdWVOVG9WUE5ESUJsMXY1RmNPanJOalpkemIyMGZuN0FEVFZ3VE9uRzI2UDlJRjVmWUJidFM5TllBZ3lSdUd0emhySjF0SWhocTVYamlWU25CTnY3eDVxSHh4c043U0JsMklIZ3RFa1BxMWJDY3dzN0IxUktCLzEreVVzY1lRMHc1M2JoUW1ZSk5DaTBTeXFjdHo2SmZIZ3hqS3FudENuZWVJNXp6ZDhZZmJLUVFZY2NoOHNTWWNtVTB4SHl2RTF6d3QrMGJtQVBmYjE2b2x2RiswQy94UmpzWjZHaFZRU0JMNEsvdk9hOWE0MWZSS2x3eHZqYkxxS2hUSXpxN3ZwaWNDcUdxSmxhK1lrQnlmUG9vaW1tMjRYR2NOeW9rSzlsMDN1dUJjZzFoclZzTUJZK0RxYXBTaUVhRFR2M3paWFhoZ2I3RDVUUzZFbXViRURabVJ6MEgzKzA3RnM2UmZ5QXd5RHVSVmlzNGFUU0dXWEgzR0QyMjMrQWZWbW1EMCs2RUxHdXMvekpZdTdhNnpCWlN4SUhLSVFUdk53SzlqTXpPRjgweERML3hIVUhnOVY1YUQ1NnJGVDlWSUhGY0FqNjhSZ1R4cTFlc2FTMERIcUppbFNrbnBwRlIycmoxSnM3UXVjQzVzNzErNko4NVBlUUxFdFFGRXg2MlJraWs3NWFpYWZkVG9HTkF1L1o5bnFPaWd0NHowMFh1S0V1bGwwMUU0VUlBWWtoZm5BNmE4RmsxZGxocmNvL2grckl2VFh3OUN3cm1Yc1RqRHRDeGFGVzI2TjR2L1pQK0k4YkNENjdWQ092VGNmMjBvOGtMU3hsOFNNVDcxUFVGTHR4SWNtSitsQUxBRE5mSjFMa0hMR1ZlbldCY1ExcExmRWpwZUFPSjVXekh5WEZydGhpRFdmcnEvUldOb3NWWHVjY1E1TmJIRUc3WkFnRGs2dE5oS0NZcHo5L2hDTG9ScmVKRFNNN09wbU1jTDhhNC9MR2FUaENITnlPSmFDSk9NbFdOUGFGTzhDb2wrMDJvSW5wdUFmZENRWFlQS0tWREZFVU53eVM0VHAySWtoQzVHaVFtcWdMUUYvb3V0Y01xbmxWT2k5WWNNQXdqdlpiRklDNVpnTktkOWxiRkhlNE1lVXgrRzg2WkpqczNOUDRsNlRYZE8wUVFsakFRamNZTnZRN3djMU5LTVE0SS9XNlpEdGNaQjZ0ZSsrRUVaZTFucG1nd010azNhOGF0alUzdmR5am96N00vSkhYbDlrdlQ4SUxyYndhSVkySjV4SXZDb3VnTGl2ZzZjSXA4bzVUTWI0Q2tNdmpxSThDR0UvVlZYM2xQbWk4MkptQlRhc2FOVFl3UE5tNVdMOTZHT3dIendqZ3dBOUs5ZFhSOGhmN01zbDVUUWxBdmtmSlFrcnZVbjhVZzlUa3RGOUl0aW5UaTJsb3htdW1TemV5LzFFOVEzK1VyWHd5OHIzQTFHRC9pVkRBVS9Jck1iZGRYNTN2c04xaElQVWRiN3FEVkZHSGtNUkd3b25Ba1pocGxnOGZNUHF2b0EwTXYrQWxLcU1POVJidnBFeWpzV2hqNnh6NTZmWDlnbDhGN0ZMM0VRU3pBcmhaRDdDM25EcEFldktUUTBQR3IwQkFNS2l0cys0UUQwdVI3ZlRmV1hHSGY4NkFENldZSGEwUUtQMGM0M1NqdnhzVXRGUTdxQUJvbjF6QTdFQlBaS2ROeFd6UkdUYmFWQ1BqeXhsNXJISVc4bG9qNWo2NFZxUzE4dEp2emhBMDhJSDZ0UENKTlJBTlpaV1BYOEE0RFRueFBDb29tay9uRWJ6aExKWWRQb2prQmhrN1JNNXBOVzdLSUdhdERodzRzRUpxYy9DNGE0QmQ2YTRzcGZ1NWVtajBOUE4rNlBKTTFydllIT2R6WFpubjcyQTNTcjRGbjVhN21xdDZOQW1uSEpEcDMvY0k4cHl1YkJXZExNV2ZYSHFvRkZoSnBlTjJkdlBXYnd1ejVIU0UzMWNHOEVTRjljVzgxRVdTMU1xMlFSTkRBdEpIV1hRNFdtSWJldDBYU3FNTjdYY1RUSmZzNnVJenpvOXFGRWY5TlpZK1MwdHhjVXdMQUthZFpMMktONE9UYjJiT3AwZE1EOExPQVphU1FGZ1BlOUdyb2kwZllUSEdOVndrSXZqUlRWZG5hTkdSeWY3K3hRQ3g2VnRGMGx5Z0g3SnNXdGY2YWtocFRYbFVZb1l6d2Z3STVSRDhjV1RkUjd2V001WWVrVmZEdktCRXZqOVhYcmVhT2hNalE1dXZDZVc1Y3VzMmNNOUFGZTRkaEZqc0dodFZiSTAyYnZuYkh6V1JOcDcybjNKMjM5elNYcnU0cWxOTDVjVndZSDZ6K0hueTAwUlRVblc3Y2tDZjZzUEl1cjB4SXZpQWI3dWQ5ZElKOGRtTEVrdmRMaTdqSlA3TEZaNXJBcXFpNUZrNW5nZERqMW1pTVpHWG8vWWdZdEphKytiZElzNjZsYUNCQlFJY3d2MTV2Nzlna3RUN1lmK1NoSDZveWFocEVGZDM0cVpPVy9sYmdmKzZ6Sm8xY3lOdFRQOTNhUkdhamxGUzhodzRDanc5VnV4UldnbytKT2F0TERIanlmSlhlZjVsMXNzaU8yUWp0UDhzL0xFNWZuTm1TcHJxWXlqdDFzQUNiQWk0NE9PZDllanV1bGdJY2lPcGFERjZDdURsSDFsaUJFbXlOUVlVZm9Wb0t1c0RaZGw0Y2lBYlBtcytSdnd1TmZxZHYyNjQ3ZHphc3RyRVdHMjZWMHloY1FQbXJXM0g1QmRJU3NlRjh5YUJEQi9Fc0tTR0RCcDM4SHhpYWpSOHJOUEZNYy9pbUpBdmRCRjJBZEJmenowK05sZUlZaElPN3VqckpwT2w5MXFnTitSNjM5enpUTDJ2SzJ6K2RSV1ZGTFVaTWVvWVJZYkE4YUUzYUtkV3JodWxsNS9xUHRyKzNGdm4zK1FEYzRoVDZWbkNwSHBzaUwrdDA5QXUyeFBzbWEydklDazlRTis3c3hGTHMrS2ZmUWdWTEdHRG1RcDA1UVJLSllKNXkraVBPUVZENG1tZkVSNWtwZE1UbS9tNEgydFBrajRZUDJyZGVvV3FZZ2gxZHcrNFQ0U2t5YUdISTNrWFM5M3dlc1QrWFppbFJqQVBTYlo0cTNFNmVXUVJ4U0dabi9TYlFwai9wVmJMc28zbGZmVTFwSmwxYUFTZEZudnlLdS94cGZDYUQwWHVDaHRSVVpzb2ppN3hFV0JTZ1FQR2N3U3pLdTRidHM0LzVhYmhyY3p1YWJSRld3V0VJVjM5b0lqVkNhYUgvMTUzN2kySi8xallDMHg5c1NGWlRDVVMxYW01V29WRmZmaklvSDFGSk5Lc3RMK3F2OGRFdDNXVDhubzh3VFBJWFVlVCt3elRXZXQwSjB1akNLSVgybTEyc2FXdHM5MmtlUkF5TGxDVFpKcXczTmZlWlp4QlpjM3lMQ252OHhvZ3JkWWN6dWRkRXNad1loS1J0ZE0vcGtremljUzVaeGF5T3VIakYvcGhLeVA4dkxUdGsrYk45LzFNNm50L2wrdTR1aGlvV3NGbGZWa0xpblBkZm54NFB3a1FWWnBUVjVNL2JqMVhQdFczckJVamRIOUd3dDlya0w3SE1vUWowU0Y4YUNsVTU4dG11TUFtc05BRTZRcTViS3gyQk4vMjhob3ZaemJXL2lNYTQzenRtakFuVVg0bm5OaFIxU3RDeWN0OFRwZ29INzNFZHQ1dlZDVnhnb1VXenF0Sk1USkFPZEF3YzU5N3hJTWYxR3FLNmprMTFtajhXWFY5TW5IUWIya1J0dUk5eTd0dUNLZEZTcmp6SkttUFJBNnZBeDFJU2RwSGNDU0RldjF6SXRVOHBNcXFodVQ5b3J5ME9PbnUxU0RZUDhsVWlQNnBQU1JMcHp4S1ZROVB2NEJZbnB5ZHVOTHZXRkVXbkdFVVpPNEg4RzFuQUpUT3djRVJObC9TeFY3R0kxWGkxVU5Tc0hlaExPV2RER3dCK1lEbk9xQXFJY1FtK2pITFRWbGw1b1ZZbkxTU29NWktvTUJxbmxibHp0QmN4YURMVlMxczhCbStLcHhrcllLMlhqM05xTmpibXVXRG5YWXY4T0FCYktNVTRBWG5qV3kyeEd4TEVnOXNxU1dtY1JRM0ZTTndFeitEZVNtOEE5cjA5aE8rdnNJeWFCRjliUWJHRDBKWTZSRkJFMS95WjI2OCtJNW42ZGxRQ2F2eHR0ejBsaCt1ZUFlazFaWTlsK0xGVVoxYlU0ODRhVWdaamFrNndtcHl5Nm5zRy9yNWt0d3JCaDk3eW81WnFXWVZjRUIreUR4SHoxd3c2cW9lbFRXbU8wdmxDZVB2N2V1Q2RHZE9uVHZPczJjQ0xubyszTWNaZEtGU1lleHJGc0l3Q05Rd3VTVkZaQWpiRlRxMURlaXJFZHJlSFM1cGZRY096c0sweUhmQjlIRVZCdXErb1Erd1ZsdjZDYzd1bG43cTZDck5lRnNiLzlkNkF0TFpZb1dqeFVXZE1QVUtyd0t0SW14cVVGWkNyaHcxSkticUZaeExmMnI4aHZubnpzZU9HR1dKdTE1eW1LMTEvT3NWRXNaTWExaGsyTHdzV2FtZXhvWUdPa3VIbU02RDlvS3hCd3BCRGQ5d05XY0VETEJneU5LbmdFb0FrSEM0Rm5CY0xnQkxKQVM2QUtqVUlKYmxha3Z3Tlp6ZUl6MUNiTW9EcVBicHk1U3QvL0IvMHpYOFNLZmlac21TemQveTNoZzRVOGlQNlJYVmVGdm1vUS9PS2g1OVNVRnR0aVVOSWllanBNNjA5NnlsRFlQbXlnVDdkaEgxbTlpLzdTWHZSUHdqZ3FoNE43QVBWc2RKLys2YStmQjRYa1ZSK3Q5V0V3N1J2VkxkRW5mRlIxZERZSHJDdHlRYWlhMGxjR0xHVGEvejlxTGdTVjY3QVZJTVdJTC9KTm9rRGc5Wkg0WS9oV3RQeTFUTURRbkN5TXcvbTY0cytYQnl2SDAxZktUdk1aczdiMUNKcUE2djA3cThiUFh3UDR0cUIrRmhxU29yYy9TcEpjRUp6bFloQWtUbmdkU01scDB1aHBZVnJ2MFc1LzA4emcrYWhKWTkwOGlFMGdaVWNVT28wWGpKcEg3N3hhSmJzdEV6dFZlQk1oN0ozU1ZtK3hUcFUxQWE3YUQ3YnVabGpMQ3V1T2w2SWpyVW5vRlprbXBXbTRWWWRyT1B4Nk1BVGRxZEpQNzZMNG42NnhSZG1XSWNMR0N1b2ptZWs5cXBoMGYrbHJlRDJxTjluYXgyenpGTDF6S29wR1p1dTMyZGkzZ3hsYzNaUmd3aGJMZkxoWS9qREh1a2V1RExITUR4NWVUYlVkeXd1bXQ0Rm9raE4rOGFwVTJSRGk3d1YvMEFkejRKNjluMmRtdUs0Y3owZjJNSVN3T1orN2IwN00vQ2taL1ZWa2Z4amFvRUl1Q3hDT3V5SXJFbEV1YWxuUkw3OFRLZys2Z3kyOEJ3QTZMUDZPSGRyMVdZRzEyK2RWWWtFU0JHdEdoQjVoNFl2bm5nWENycUdnU0FYM2pvNXZwUFdONGl0WlQ3aFp2NGRSQ1BVdkkxNmtPMXVhNnFCb1VGWFBIMzQrRlk3Uk52R2NMSFNPSWtMWkh6UXZCd0JLNG40cnkzR1pNWWFCVlRtNExLVi81dzJzbFI5bDQxNzNCbHBtK0xEbkFON0ZXZWcxWEgyNS94NEt3ajYrTFA4T0ppZEFtMGQrVXdIRWI1czBocGZzcERVaVYwaTBDcU1MaFFLT2RrNnNrSDI1YjdnYlBkME5Ham5DMGliZGRzSXVMN2k3cTdDbFVkVWpFNnNJdlczaStEcXBRTlRZVEVycS9vdkVwbWhsRHFMVjdhUlMrd2dNUzVvc3hrbm0wenljRVRwYkRxVWNqKzVzeERzMTVJbkYxQ2FYTFp1ZXJaNy9hRUMzblJkRHgzenVvWnJNbzIxZTBmOVlMK1FyV3pCUmlKK0U0aURrQWJObzlpdy9oZlFlczhtN1Q2WWxvTWE4em5QQ0toMVI4WTh5NnV3UDFvc1A5aWZwSjZZcWZSMTRtTWtsR0k5RzdUUjU2MEk2djY5R1lGL29NTC95WXcxc285anhBeU9EZzFDZmhEaDZBNmt5OHdJb2FBV3JsSkZzSk5GQUp0ZHRDcjVJbWRVOVNpY1N0VzBXZWVFT2dwaEpCUUhweUFvZVhaQ1F4Q3RySWlXQlU1WTFJRjhyeXpVZy95WWZOdmlPM0YxNkk5dCtVUndybWx4Lys2OGprVjVHanU3cWxJd0tKODdZRzZVK0NpbEs4ajZ5TldidGRpZkplNnF1Z0RMRXVuM3BteHFnbzNaNGdQWGVpS2UwU3FIRy9GWnNQN0NlUGtUemhkZ3NlM1AvUm1zcm8vSnpYMm4yS044ZmdSYzZlSHgwQXU2ZkNOUjBsc0FWWEoyOG4rbXkwVVpPRTNweWptTWN6OXUzeHJJVHZnQ0p5VnJwRVptMDBhNmxQRFo3bFNna3J1bmUzcFhFdk1SbTdIdEFqK0FHNngzZVlBbllMWUlnSkxHMHROb094RjM4ZXIxYUgySjBERnBMS2hNaTNZamhyQlJGUTdmcFZxZDZ6TThOMVFXNUFxeXhkQUcrR2pZV2ZWeTJudlFwaWh0Y0dzeEV4ck8wNTlQNDlsb0s0WW9IM2lPRi9zS0RlYitEVEtUd0hmdTVGcXEyTDdLZnhpVmJzK043ZVlNOVNVZ29rdnkrZmRQOVR3N3ppSGxFQ0Z2SWpUZE1YTFdXaUM3UlBwNnFlUTJwbmxyREoxdlQ1dVFTWFc2TE9VZHE3bm1pTDVjUHErdHZ4YUt4bG5MWEY0UTkreUZ2eHB2dG9sVG1qeU5xcFpnRDNTWGFsQTg0REZPQ2h3N20wcE14a3UydHNvSzB4TjdPNU1sVUIzejBxeVRqYXF0KzRKOUgwbWNPVzhqSmdEWGhVaUthcVNpQzRCazNNZ0RLNVNTWVNQVGM4V2cvdDJKOFdHU2UyS1N1K3hKTDBiZGZQR2J1UUo2YWxoVnYxQUZTTHkzb0VnZ0lzL3Y1U0hzVmNub2NacDNFRDUrK00zL0pTd0ZvUk81M0VJYkZqVDc3VFBqb0RyNWlRLzFzQ2o4dUpSdjVmbHFGZUo5ekEvbzE5QlhKTGh4T0kvNmw5aXlZb0J4UzM5Y0tpUGlsVjN6c0xPdkh3VGJEdnVYMmkrODBXbG90RnhXVU9QZjIxMEFXeUxkYnhGUHlBb0hNY1ZIYVRqVHFyUTkxamhtNDBZZW4rSTJ0OWNwY25OZ1RTU0dlN2ZtY0dlS3pNcjlERkZ5RFJSdFVzWTRLUHNpUVdRbU1GaUdQYW45a05USnR0WkpBWnYzNHBuZUVCNVBnbUVCVkVEaklTN01mMzFNWWFkTml3QWZwSTZxZ0pSUlRrc09xWDFvSDNtR1Z3SDhrT2x0TDNXYWJObWRUam43UDNWQVBzQ2pJVUxmdXB4dEhQV2YvMlFBQkFCb0FRQUFCT3dCQUFBOEJDanNDQUFBQUFBRURBYmxBQUFJQUNRSUJBUW9DQUFNQUdsUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZ3hNQ2s9PC9CREI+CiAgICA8L0JJUj4KICAgIDxCSVI+CiAgICAgICAgPFZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU+CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU+CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IEluZGV4RmluZ2VyPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw+UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U+RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0+CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjcyPC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFXN1dBQUVCQVFBQmJzWUg1Z3djRENBcEFVY0FBQUFBQUFFM0FFQUFEd0lBUUFJQVFBSUNBQUVCOUFIMEFmUUI5QWdGSFFFMEFaMEFBVzVWQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJuUUFBQVRRQUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRTBBQUFCblFBQUFBQUFBQUFBQUFBQk5BQUFBWjBBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFGdFhRQUIvNVBmRzZBVHppTEU4bkJvL1o3cURGOEpubUVua3ZsTVpzK280N3RLK29hdG5OdDdQSjBWQWMranNkSU5jQnRHbjgvT3BFNWtlUkFUMHc0MVF0OExnSUNBOHBCd05EanN1bzhZRGROV2VoVXJpVnlkN3k2QThTRFpLWlBYOUZyalJVbmMxalp6OGlOdDJodUEvQWhBT0Y5NUpHNW9Samtnd0tHM2lTbGtIemVwMHBGRGFjTExCSGEzRjFueWRYRi96cWNUQUhMU05zZjJmYkYwQU1pbUJFMlNYYjk3MHNFblhBbFlTbi8xTGpvVlFKK2U1TU92MC8yZ2NEQmUya3JGdGoyR0Z1UnhkM2JpUXkzK3RyV25pME9tRzcyNXhEZ3ZXSW5tTzZZQTdJdmdwWlk1bkV4L3RUbDR5V2JtU2FCWm5SRHVjektpb1VvVzhkbEFQdnZZczFrTTVKU2ZKN2FsRnhOcW1LUnV3SkhWNERHTWxRQ280RFJYN0JLbklZS09lalBxNkJzY3RWaGd0dHVKdmxvWG5wekxsTFlTaUg0SkxmczI3K2ROdTJlTkF2R0R6TUpBMVJoUFZrNXdQOWlUL2xHK3JkS3EvRzMrTTErUWVuOG8vUklsZUdIWUU5cnlucXdOb1BvSzVXVXB1c0lUcW01MlpLRUZWeVowYjFmenZjNkM1M3VRMXdaeGsvOFhhaWpnT2c4M2I1K2J0c2Yyc2djUzNwZUY3YVZIdXdPS0FKN3dYZ3RDekVQei9EWG5ydFVxdEJwaFFXRTJHMU9KeHM4QmRUcWxtcXByYTdvNkgwbk96Zjc5REZlSU1QajI5OS9QSk1ZMVdNWmNGNWhXY1RpcEhzenpjNXRzczZudW9hZVJHU3pEMjkrcGxuYzdSWFpWZjRPZTNGVjk3c1BxSXArQXpxaWRwTWhsMDc3cFlxMHVvclpQWXpPdHZ4elVSRW03anFGeHkrQy9yZjV2K0FXeXRRd1kvQ29qa05INHZhSEQ0QTNzUXl0T2tSei9YZWFScDFtdWdHQ0RmeWdIZllUWWx1Y0d3RitjYXNmVUVuNktsMnorajUxbE9yN0hIWkJZTHNuVkJ4c0I2c0hxcDdsVVFqMmtlNkZWVzJldFE5cjgya0lBTXdsQllhcXVKMnhETDd2bzBXSkYvUGdTMWNZNUo1TnRBWHVrZGNIazg1V2Q3QndwVnBEYm5naGs1Smx0aTJsVUVjQlZDRzZCVy9WUHY2UjR0Tmh3aEMwNDVXUmc5eUppdjNFdGJNTWhXK1RwTUkranRrNEpDNWpuYms1eU56YUpNY20xR1J0SGoyMUhPUmFKbUtQaDNXdXo2clVUQnhLZC9OS2ZlV2R2TkY2ZElPek1EQlgvZGQxSlAyeVZhRmJuZUs3MFh0MnVoSVR4VitGU2ErWXY0UHI4ZXMzb0tiZDlRTElrck56dEtjYVZVbUxmN01udmNmenZZL0tUeW1ZVXBnZkwvTmtyTnFZcVkzTitOSTNmY1Z4N0E2NnZ3ejNoSjhETHBUODNCU0xzTm45NEcvVEtNY0c0NTZTVXRIazRpN005T2I3eVBzT2ZvRzI1R3hLV1ZMdmJ5UFNjVVNDV1NJa1dMdjI0UWlyaG1hdmwyVEF4bnpSQ3k4MDZFZ2Era2paRzV6RDhnemFaVXZiZHdaN0dlZ0R5eVlld3JZejBleVRZU1N4bm81cVRqTjBua1VWSUpLblYySjdmQXRBdGp3TjVmUWRENUF6THlxdm5pSHdpa2lSU0hsRGhaZjZmeDREOHlJZktrWDBxZ05RbkY5aG5ON01keU1aa1dmcFNCN2FrOTF6eStoNldhOHBucUdBVWdPZEVaOWw4VTd5TE1wSEo4OTZqdXVyNDB0N0VjUFJYZldYNStlckVWYVd4T3kvalBaZ2xDakRPL0Jadk01K3ViWDFZYlV2Q0g4WUJ5ZjBLenY1Q2hMejJJNjA0WWVnS2FJRWtBZXg3aG5XZ2pSdExnZVpOcDFvZzZ0QW5xOEN1T210dUFPTVNUN1dEQWxvdnNPWXZiblhDdzNydEtmQ3ROWUZDdlI1c3IrOVVFM0x2RWVXVjJOY0w3Q01QRDc2ZDd1YmZxTXdnRHNob0VqUlgyL29VSk9kQ2ZHTC9XSCswMkRYUHVmeFdwdkhXdDlUckcvSnFoZmhnUERSNDFTTm5tblc2aThuM1FMTUNHbEZ5VDQwTGdQeDc2WUFNVDd5NTZPRDM5aldOSXZsZkNiM2tzc3JCcng4bFM1dVdyVEJwK1VpVjV0NHdxWlU3ejZhWUJMY0NudlFmb3A2QjdJT3VucFZtQ3FSNmJSNk8zN1lVVXpuWlcvdWhhQ2VKaE55TjNHMURSdHRmUE1oNkxpWWd1TlRwUVpzT3BiL2JDaTlCKzRHLy9tVlpUMEpVdGdGcDlQeS9tcGhYMnZLWUhmd2daUUhRVnZwV2JweHRRWEw2UHA3R285a0NKZ3NFSlhJQmZoQWFWSDVCMGQxWXVvSWFKOWFEQ1RkRW5MNXk5MCs1MFlDaXB1cU1KVTEwV0lKK1ZWUHB1S0VseC9STUtLSkdvWm5JS2FsMGlGWUlGRXljYkg1TUNYd1RXWkNxNjhLb2VoNTBLcWpQdjA5RGRIejNUM1hyZWhKVmJnb242SzBDOUhpbmdtVFd3QVpyV3pwVVVFQUFGWWJKSzVQek1SeXoyUElSd3FkN2R4d3JMYWk2SGhkaVhCc3JRQlAwaGJPUkhMQ2lpT2Y2d3p1MnBRcXBsUGJPamNaa3p2OWhLd0NNWWNuajA3K0J3REI0bm9wRjYxQ2t6UEhvMU9XWkhKT2lKVHA2RFFjSUZlS3NaMUd6ZXJWbmZIaWd6SjF2L2ZaeXg5aG90N2dyMGl3TDgxcFprRVd0a241aGNwRy9icVk3NXBkcGoyZjgyUHhQblNjZDFRbytqUlBYOU4rcHQzV2RDQzNjZTEyT2M2eTdsVXJ3NnVYSVF0VnozVmdkVDI5TzBDbGgydS9Sc2xaVHNTWmh5KzNFell5eFlySm1DQWNxRHM3bVRzamZJcFNtUitCeTE0UEEyM2lJK2dGa1AvQkVtWlo0REdGU1RrUTZYN0ZISnorTjFQN0dBNjVIejBLVUMwaFNYRzRrZTBiQTdXcW5vRENVQUZjMTJJV281NDhnUU56MUV0MU5nbkdNanJIaXM2QW12L1ZiQTllamhSNHVMbkczZmlndDFkU0ExbnJVRjNNVGQ5NnFQUm9hS2w3ODEvT2pmWjZmWjg1anEyc1RoYnJQMEVGQU9iaVlWSTBFSDNHS1BrNG80VWprTzVKaktyelNVUDlsUHpoa2FGZHhOSUZZQjYvSjI5RDZJc0pmS3QyUElVQW5JMW51dW5uZXlGQlhlZnl1NjhDZjdISk8wSFVNbDVIMFFqaEVOTmFhc24zSlNDOTBKS3Bqc2FVTXVVS2FyMmRUOVlwajVyMjlQRmdWQnVXYnBTNVdRd0VkU21lRFVKMFp3M1lyMU1NUEFUcndWRi9KS3h4clk5WGFRWUJiZTlrdlNQMHlwemgrSUdyZ2w2UEp5N2dBZTBJVWVjR1FyRk8rZlY5aDFmNnZiZjMzTEdydUlmTHFJcGlRV3JoQTRNdWI5c2I3UTN1bTdkMXJzTjFZMkRwYUlXNXk2WFRkMTB5MXpQZStIMCtIQktFMWVPeGRzcndUajg0MjB0MVNXcEVhSEVtcnFhTXhyc1Jjb3hMa1NPTktoK1lJSUUrWlFiNlZUUm1FYmg1Yks2dVQ1bjZUUmYyRWd0UVV2VjhqSEpsdllqbmRKR0lWYWZzV2NkcjFva2VvZ2c0aElJZVNzSG4ydU5DSm0vcFBoL2JVUFhRTnNBQXdzYi9WSWQ3eTBFMjNKNzFqSHZXckxKQXRYUDlWS3VwTjExZ2F2VnNROU5IOUxaYXcyVDJ1U2RRMnVKSHJ3QUN2YllMUGZpR2VDTjNFZDZneE1menBsZ2dBdWtjMVlkUGh3ekFmMk1aazhZTSs4N2drWDVMTC9sd2hocnUydXBjWHkyMUNtRm1PN1lSbTdRZlFtUkMxYit0ekFaNzBXcktTOFlHYkVWYWozSWRFckIwUU8zU01SL1QrYmRDbjlqZ3JBZEN6YlJxR2VEUVZ5OUJkejg0RUpaL0wyQjN2Rkl3bm95YU1FU3gxV0ZyallXb3V0NjRsQlpxOW5kazFMVTFuWVMrNi9qUkxJOThVczFsWUtuUzBGamNER2x4UEZXRkpGS3BkSjR5VkowSjRQSVMzMWdDdUF3eDh5RzA2QjFQUVFxbHVxT3BHRzBRZCt3bXZzb1pST3JwTElKSjBaZ1JybkMrVk11WVBZYlNxRHJBQVROOG5hNHJEQTJJRlR5Y3BiZDBhTG5sYk5aYTI0WE5PT24ramVGVE82ZGkzV0liYWhJNzdDNzRONzU5bjdhRStpUTRsQXlkNHc4Wi90OHpQeTNFT0RNTmkva3VNdTRYSHdFZ3JtNzFSdHFjSW9hZi9TQ0VkL2FGQ3NFc09NUHRxMmdOQ2lveTB3RlFkUzJGZUczMDA5WlBiTTEzV3BxTzk0MUEwRExqNlMvbU90RmF6TllXVnd5OXNBNmRjbWpseE84VTZ3R1IyZmRkVENsVDQwT3RlUm1iVlpVaGFQSmxUMEtYRlJVRzNSOUF5MUkrWERSYWpneWN2SnNmNnRvRVhha3FTNEhwYzd0T1AyRnhZNU55K2JqRVpyTTU4aUtXYlNoNmtKbmExbmZpT2ZzZFJwTC9tek5mRXNyVisyUU5NQ2o4Yk1Ia2FXK1J4d2pjSk9HTjBNaWlzWVdLK2Q2S1d4T1M4MWw3VG1QZnc1RlFWT1hBWGRHYjNlRnRNTFZyMEpVcEtsbzN4UFFOdU1RaEs2Y1ZPaE5FRmpWbi9MS0xHNFNER3E1bGFXS1RJVC85bG5HenF4QTd3M3RCMk44Y00yY0laU3NlUlVjYjBjQkp4Z25Ma0MydUxSL2RxQ2hJdzdIdGc1MXpSNFh6Z1NRS3YwVzcrL1A2ZGRJd1Y4eXZrQlBLWkdFbUFPTmVRd210WnVjNW5xbHRtakxGZGpSQVZLS2FqUnZzOUNubXpUQlllU2Q4ZGUwYmtVU1VPMmFpSGtCQXBQVy9SVDA0U1lEa3FmMmtScGRGYXZwK005YU5DWmxhSFFJTDhYWlZPbTlGV1p4ZTkvdGZaYnIrUExybWcxcnZuQ1A4cWJrOVJ3M0MzSnRkYU1tSW4wNnRPOWJSbURuY2NEVHYrczVyOGd2T0NsUU10QzhIcHBIMVBCdTh6WGtVTUFGd2poRkNFaFBib2VHTkNWek5LUHQ0b2ZSUkdURFpjRW1BNFFMOHdUcWZtcFFyMGo1QUFqMnpEZVdDUEM5eTNRa3ArKzhmVVFzeS9SeFBKMm8xU055d1lWY3E4WTExdTYwNDZ3d3dVZlF3WjR4a2dmN0FRaXBKT1h2MDlYK0ZMRFRoVmpMUjlyQ0wxN2pYY2Q0Q2M4WGJGbG5ia3E2Z2ZCY3JVRE9PSmwzUXY4aUNHNVF0c1JBS2pOU3NVREQ1L1kvMEdpNzhjSmhYOUNBSUZTd2xHeHN4bGpmMllRMDlSVzloSWlhcWpuU1BXc1N6ZHZXNzIvc0hZdnQzNEI5bjZBZHBKczEyK0dwL3ZzYmx6aTFFOUdScURxeFV6cHV4ZkoyOEYvZk9uSFNuRGZoTDZtWDF1RW1MeWRxdEFJN2dvWXN2b09QZktvZU1kcXA0LzR0TXVUTkZzYTJNTmJybHl2Wk5nbWVrTnpjWDM5UnVDdWhReFpsOFU2OGVMZGJmNy9vUzJXa3dEZzdiNXlteklBNmNRaFZrSlp4bG5xOHVFVEJlWXZibzZzeWNzVkloc1ZnSVFxVVAyTldwSlg1dWFPcXhsalEyeC9wdHZSYnNQK0QxQUx2QlZSSmhzWS85RXVTbzd4Zm1hVEVSVkEvMlN1RTVvcmdORTRjd0tXeG44M2tYN2ZRQWkrek5Gc2cvM09aNys2MjNTT0wyN2gxRDVWQmNvU2ViMjN5bHNCT1hVSE40UHM4MmttTk90Rmpmd1FoYXlYS1orRUNlME9yT21YR3lUcnVuTS8yelR3cDg3a3BvWnZqODg4T29sRHVST20yQVRyRUlIR3NhcGZhNzh2M0NLZU1XNTYwdVhpMVA1YmR4NjdGRkhtK1Rjbm1JRkFvckluSWhHYVFMTDdubUpldjQ1eHpMQkN5QVdqaXJhNVZPckxTaURDYXo5WTFOeFdiOTExbm12RnYwcVAvU3FIOVpZUUtkUUkxN1padS9LSmFKeUlXMzVNdmdrcW83REh3QUw0MXNOZWF2d2IvcHk4T0lBY2JjU3lRN3dPR1NyYmcvNnBJcWpTUVU5YVdiZjBIRHFBbFMvQTV5VW9FSEJzK1hBVElaMGZQOEc0bndhNy80QWUxSlpPaGxFMU1XUmIrc3VEaGxqSGNyVXdMekRXUGdwb0pPYVN3QlhwS1lUU2JUZkJTQm00b1RrZ1JTcnpyeW0xak9MeUlvdUU5bTZIcXl3MUJ2KzRlckFMbC9IQ25POWhVYXJ5TXdaZkc4KzJRMnlZYUVoRTVoaVNwWW93ZlFEOFZqbmxIT1RyQkUwTTZnT1MxcW9KSGtaT1ZZYTJZZURmOXBiaEpUdFp4UTZJZTJlR1g1dEVPN0R5OXZEd3VJZHR2YnZMUVZMREd1K3htZVVNaVh2ZTRCaUptbURKN1BUdGZGMDNIeW5vclNoWHpLc0NFd1VGUWFldEUzM2Z0a3Y5THdobERPb2JRSnNCMVBrbm5GU2thM0RxaTJuTDFhcERZS3lhNmdQaU9RTUdVdU82eFJxWmNTbkNuem0wRUhYME0vOUtCMTBPSmZtcCtnR1FZSlErUGVHTEE1UW9JRVUxMUhqNUtSeURaREJEVzdSUldnemVsRlF0aDBoS3dTcjQrT0syNHk5ZGpjZUNRaWhGa1JUWlMybk91VG5ybXRlOXo1NHRQMm1CTjdLVlhQUUQ0V2YyWCtvaWVqeHhqL2lwQm1Paml2Mkl4NVBVa1d6MEpBSXlvN1dJbUdIbmpkTUtSZG5lampmZjRnVUxtOEZnUzBqKzlZaUlnQXFTbFpkTEMySWxkWXIyL1ZMSkh3bW9FMnF6a3hWS0tSdzJNQ1RXcElLMUprb2pLc1RmZ281bTladElzR1o3bHlDSHEreXErOFdMSURnUmp5R3NWa0ZXbmpuTDMrNmNWeWVWVzg4WmZhUjdMcTB0ZlpYVndLMTRqcjZrajFDUnB3T0s2TUhVb1VFVW42N1pyeUU4QnFTU2dKLzZvL2hmOXc5YmRQSHF2cjF3MStFdFFVYVJnNHJzSTk5R09UZmNJN0FtNWhTemlXeXdQcEhxSDBhbldRNlRaUytHWm9tdzJ5aDZCdHkxd3RPNGxyL2QyNm9ZNDY3d2V0Q2syNWZ6ZHZReU5TZllCOTRiZTJ5c3F1eHZ6cTRaU1NGMGliL0tiaXk2cTU5aUtPaWg3VnlUcXN3UkQvdHBGU0JEdElvbk1ZVFM1SExGbnJMLzJHejBRd0ZWZ2w5WVdBVzcxZ25zR0dFQlJvN0dzQ2RXK083Y3oxWENrd0J2L0o5VXNmWis2bkZpWHovTjlkNjhmWTJjZS90dkN2UnBXdnZrRGZkZ0tMRmxoaFhDa0JYZ1JLOXEyeDZqaXlXTXJFY1N0UTVKeElpbnVqbTJ2Vm04VnNOYzNFUUVOMERtcE42WnMyN3VVZjFnL2NRR2NoYjQ3ZmZmNnBHTWJLME9mclJlbjlpbWtBK25XNkFQL282UXUvNFBRVXlzUmNIakROcVNRSENpbDMyc3lQQUF2YklsRzNQdngvVWVxQ2RRVXljZ1N2UDVCWlFJMGZlRUJWaS9JTlIrZ0doWlRTaDY4dHU1ZGdlZXRhYkhzSVhVSlpRbmNXUVV5Y09lcTNtcms1REJPc0hVblBPckNhbmIzdDd6QkNUR2NTZzJwamJYVFllK2FSUnRlVkhxWklOZm9hUFhBRlFHNXdRc2VKL1dHVXcvam85bHdVd1VydHlzSjVFeWRIaDRyUXlxVjd5NDJGTDNRcDBWSzhrcjNncDZ0YmtCZW5KQXZFZHU1bit1T2htY3ZPcE1rR3F1bWdXQmhOSWJqcVpKUHZ1aWUxdVVJY0cwU1RTYzlVZEMvdlN2SkNnTnd2V1h1UWtmR2NqU1hmQTJlMUlyNWJlaW8yVElPcFhjVXVaMmRSSXhDNDg2MUk5R3BrMUE4MnpOWXBrSDV0SjM4LzNlY0lhUXRtTnNjSzBUemZEOHJYQkwvSjhTbU9JUEFQcjZ3V0FGbzFTcTF3K3doa21qUFMvdXNiQ2xsVXZHcGYwQXlWdU1Ldys4eENNM3BBemhDRkxmR1BISlRTWEJOaWFkcmdpNDV2L2Q5SHRkbFlwT1pKdkhkd0dmKzZ4N0VFUm13d3BiL1ZsR3hLM3BsdU1INDUrUFpZYm80ZmppenRRcUoxVFVPQ3FWZXVBUEgyM1NWaFkvd0MxcEJoSjJYeWhTOCtHZnI1bGZHVnM3bUk5Z3NZTVdzNVpJYWlCSis4S0NERVJCSnYxQkpRWEJUNGhNL1R1M0Q0aEpndUVHYktTTW1WYzJ0R3Z3bm5RY25KQ2FqM3Y1MWY0YzFKcHk4SEp1eEQ4VjlEL0cvbW1sQ3ZOS3I0U2ZtSmtNYlJkK1Z0VEI3ZDRnZnlRUXgwV0VjcXRqS1dVcFhLWDBwcnNFQ0x4Ri9QdS9aQ2NYMEpjbFRVZVdtc0xMd20wd2UzOUl5YklmakFqNnRMMHBIL3pyNytSK1JPZEdHd21DTEN3angxQnkrU0czNVU1RGdmNU40ZnhBUW1UMFIwTUlFaldFWHVhY0lVWjJzNDRkTDR3Vk9KYlNqVE4zNm5mNXlkdEVzMytYbUErVmJMREhYaXVzZGZrTFozTnVCaTBSZm92a3I2QUhBa1dFYmFEcStteG40SWExTU5MM3JDWTM1OTJXTW5yZFQ5T01sRHc3b21TZ0VHRjZoSjR6WHZHVVNlU2FEdVo2TEMvY0pVWTFUNDRsYUtNd2hUZWR5UGkwaEtnT0k1V0lhdkZMenQ0RkcvenJRMms1OUxVTllQRmliWG0rdFI0OU56SWlYZzJJejdhUnhzRW1zWHVXd2srYjloam1YMU9MZ2o5NzJPbDZPTVlIRXFyWTdZcmU1Y2Q5bnV1N09kNFlSNUJMR2JuL2sxYTBvZ29ZUDZqakUwOUlJYU5zdm1nd3lmM201TTd5RElEdmx5MmkrYXl5Y1VQYm9tYmtWRnJ0WkxkLzBCazJRMThLSzU3eno5SWNNandQODZIbmszT2lFbDJLdm43ZFJwWGVHbzlEZFRZanVoR3JHMTFydHFEREREaHJLUkJVUDRXbVhwQWZPczJ3bUcvdU45Ni9SajZOK1UzRi9Cdmk5cEVHM3JaSzZTRCsza1NQMURrMVFGM2FTVjZOTGNOVnhGTlB6d3cyUGppSGsyYWJ4RTB3VHlIaVZkV1NOZnd1ZFVJMTJoV1B2NEFYMktoNjBnVFB6ZTFQWlBJNUlNaDFYVzMrT2J6WHNIV3NyZjFCM2FoZlA4bWRzRC9ONzlOZ1lUdDNBMzFDN0Nua0NsWTgvOFlXUllYUStQM3kzUlp4N2llWXBtbGlnSUhMb1hGL3lRNlBqR2U3cjRIK29sSDgyK25IOWtRMG9DUVhVTURuUHczSm5BMXFXZFh5ZHphR2lVUDI1V0VxN3lYNkd6N2N1Vld6QW1lWWJreDF0REdmMnJmajRacVdlbW02SzE5N3QrMXl0RWJvNzcvYWErTGVRRC9TUzMrQ1RHZzk1c3JSTytIVkZWTHZzY0hSVDQ4RVo2T25XSFZMbC91bFJXdVVxVjloVFpMQm8vNDE0SVl0d1Y1cHd4NFFMU2xYd0NwR0IxVyt0MXFTc3JiVzE5SzM0VHE2dU1CbHhhVTk5Vm5KNWRxSWNFc1lHd0JKb2dJL1V2amdHalZDSFArVGtLNzlNWStnZmk4SWJndGJVN3dtNnFUY3NDQ214dVZPWEQzcGxvcDhISHkzQVIxeW9aZWh0Y2RIdEhqZDJVT3JHQWZ4N2VOSytmN3V0eHFPdHFCTU1PZTYvVDNtSU0xRDQzak5QODVSY3lLLzE2cjk1ZXR1NUlBNzVORVlialUwbXJ6VU9VQTkxNlJRUTB3bk5GS3RhUUo2TmN6SFRycEpYTW82cWduendzaGJpY3VCM2lsZTltUXRyZ0FWS20rb1BlRTY2QUNSK1VidUlaWUFiVkc3YmRWR1RhVTh1bE5KVy91ZWZPanRQUVBuQWlmRFY0bGpaZmNBTEhPaEo2L2FyTWNIemVuRWVYYkl1RzdwL3dsU2ZsUEs4emREZENnbC9MTC9HWjAzeUVKOGFkek8rSG1sa1lLMC9sMzFXeUhOQ25KUUwzNngzbXZDRXRWMHVvbVk5Yi9PYVZPNURVYUM3SFBkWi9HUnV5M2R4c1lKZlVxMElsTExwMW1uNnVoc0ZGS1l1Vm8wNkpPblNxV1RMbXQ5L2cvK3Y1Q1JlNWNDR0R2eXNxZmlYdzlkb0ZsVVNpemljaFZNZjhTcjNkWUl1L2JOTWtsT3Fzb1g1UzFlS0YzQlM1OFMvUnZvK3kyTWk4YnV0bWJFdXVHSEhoVVVNaTJ0S3JsRHlBUExVTE5rcmxid1FwKzJRMWZmcENBNTEwQ25kWkhGRUNDR1JualBjQmFsVjYzbkI4Ull6YWkyb2RPeS9XcFE1YlZuYVZsTk1NUGdRR0tCN1FYVnFGeDkyMUN6UDVwckwvR2NubzlxT28xb0VSVU1xOXRMSkt4TDdnQWVBSUZVSy9lUUtDZURIVVFGUVdHM0J1WGVxQWVsTXM5NytnQmFib1RwamRyelJBRlh1NWlpcVduVjYwUHBnc1hxNFBtWnhVL3ZBSUtUSEdoa3FLMXRXS0hzVXM5TG9aVWFmYjQ4ekp6VFJFUkFVYTNsTWEzb3YyQjMrbWd5bithb0lZTEZYYkcrS3Z3bG9RTThFZ05wN3RFclA4ZWRGT29XcnVpTkxxcEdwdUVmWlNwb3NML1YwU2lHWk16eE9QT2NFNGlvNHp4aWlxbGhXOEFwSnp3M1hiT3JsTjVyUFlUeUNseVZoakQ1ZE1aUVNiT0l0TStCclArMkl0OGlteW85aW15ZzZWYy9ZSUt3bFZZNFg5Yy9IbXhoWUxmWDY3MTBYcHNUVFhGa1Z2bDN2cGZxMDFSNVRYcnpjaUZjRGF1ZWJ5VE9DSXBTazhmYTRjVmpWOUxldlpWQlFvbmx1WTRqTVlwNFNReW80SDRXS3YrRWFhMEpuYzU2eEFQV2tuUmFtb0RUSWVVdGo1V2srL2xyNUJGNC8wZTdkK21iRzZyOGV1RVVaZnZicmFSZXlUSTRoZHduY0w1SVF5M3c0ZnhhRkVjUXZhV3BYcXVIZG1haGFiVUF2OXBDbDhMVjBaVzVoeEROVHphYVpJZlhIMzlleUZYT0N5ekplK0FJeUdMeWQwK2d3bXh5MU80aVphQjhRZ3lEbVRKSXJzMm14S0xnMFgwNVN3WW9GY2tYeHJHMkMyYVFpb1pWc2kzbDF6MlcrY1pZZjhtWXBtOGVUTHhaSjhvUXg5b0ltdHdUV3NtWm5uMURWWHQ4UjVjTGhabHhoQzN0VEFkWWxNNGp5Y1BaVHpJeU5PcE9pQ1BRU0RUTzhzQXVHSFI2ZWhQbWdlSmhNN05NQTYvMHU1Q2RhTTBUMUhxK015Q2Y2WGpjMlMvK0VUU3lDOXVXUFdza3hJc0llaW0zZ2VGZzViYXgwNEptenU4VGt1QlRkT2NubFZkT3FIVE5QOHdPN3NsNFk5NVZJWXdCOTRhRGthL3FGanZ2aXFJSDdUM3BaU2h3YUx6bDgyNE1Wc2I0UmRkYUJKdlZZK0FHa2RLZmdlcWhRZjdic01SeEd0TjR5WGZLTzZPZEJlNFlsR01USnladkF6VnJqNWhObndKYnQ5bzV3cEVGMDhWM2JNeC8xTmtBb0RmdEFvQmpDUnRIN2FXYitTL056TWxOZkhqSFA2K0hPNE8wUGJJSVg0a2RZWGpWaGdseUxhczA3ckZCc3M5M0JCYTIyK3E2ekF1VGtVMXM4UTg4dTN6WDhwbVJSK2UyUEZ5NTJXZ1BUNDl3VlhwU0tYNjBHa2N1RW8vdFYyZXhHa2dYb1hFN3gzU0I2SjNnNGRRTlRzQWlmN2J1T2FCRWRPaTJabGdxMXByc2dNNi9DbWpkbXZPRWVSdXlDdVpQN0Y0T1F6aWpCSHg3Y3ZmYnNpcEsvOHBnbWdaMHdJbmZvU2JabGx3Tno5RGlIWWRjSm1xY2RjSmpGUUI3U01OZmFqRGtsYnl6dURJc1lLUDI4YmNwcW9zVVBzTWsrWDVDWTlheTYzdzdOcFlhdDBOT3J1M2R0SVNkMC9tN3prTXlPWjArckhoYWg0RE5Lb1VlaGVlVGRDN1ZOOEVYa1ZvcDUvVU9YVitZeldOYjhLWlFENzhHV3d3SVRNanBOVG5iM01YeGhLb2NxYTNVS25uOHltRFFROFBkbUNpN0FWK3FvNW01MDcvSVYvbmJzVnFoWkxiek0rTWhlanZqejdENU04eDcvNnplc1BRa0ZlbHVqYjV5OFJmQU41V3EzeVROemxBRllXYk1RY0pwd2xVMkUzOTBYUVJ6aXhKbkNPalZRT0I1QjFEZDBGUGFKWTVIN0J4cnpaSC9VbElFRVpGOVhtenppKzRRbTN6YXUzUjVSL2lkcHpna3VJb2dWZW4vUjNVTUZWaTFUNlYwT250T2JWNHJyTnRRaVgzdGdmMUUvUUNKNXA1czB1Y1JQaU9KZFlzZFV2MytBYWJIUzhFS3NwUmFmSi9VRnVnOWxDUUNNRXZCcXgrNXZaWHdFQmZuL2JuS0RaN1ZWMlpYeUlPb1l6eTRoUzhuOFlqREJNYkdvWEsyVGhFY1BOaDNwcGtvemN3bjRoNUcvYWdScFZPdG85WnJXVGgyMEdXZkR1V0hNdnBPWWNHWEFmU3lVU1BNYzYrbTYzSG93aEk0bmoxNFdsR1Y2WDFDT29wTmxrQlNSQVRBb1NrT0hQUmZXL0d5NkQzejJuNHlkaVdEcmxWZ3dzRzJoMGZDeTBvMzRYRnNOTXRkTzZ4YjZqVkFPdlNGWkZXYTRoQXhVVDIwaFMzMUhkZERhNHBkdW5lNDl4amVlQnVDZDRUZ3ZudEo0NmF4cEx0ekx3N2tXcysxUnBBNnVsVklwQWY4eGxNTU1BWHlObDNnV05pR3V6RUFLWUxzM01OcENrZmMzaUhRMnIweU1KdnR2aFpkSERiWWlHYjNONnJvWm1YcjdSNW9YbFhyb3RmbjRkYWJ2bzVpMStqZVNodDdtV0h3bk1kYVltTFMyT1ZDV1Y4d3p4dXJTSUxLL2ZPSnQ2aVFQOGRUTU15bkhnWGJON1ViR1BzYzNRZjAyWjQ5OHZFZmpjUjI0YzArOTNwWFBwL2dJQ0FnT2IwZmJyYU9iMzhBTnRJd2ZoMlhpOTExL3pXNlZWRGtldlFDTEEzZmU1UlROdzF4L2JaYmdpeDNHRVNqUjEycUt5TW1ZU2g2TEZjaEc5SzAwVWZjZXhrOUhwVXdqSEI1VDJhT3grZnBrYm1zdVVyS1BNY3pSNlNSVW9DVGFWcGtIZEV3dC91OElCQW9vZmk2WEl3U0dPdW9mV0xqRFY3UXMxZVVwZzJwcE1LNHVXQXJBZ0tQUStuZHo4Ykx1WFdHVkdFWE1XZXNteTI5ODVhOXB5Y0ZZSysrc2tHMllzd0xhL1NKUjhyZml4Z3FHOUlQMnZjaCt2QTBpN2J0Ty8vUjdXVFNBUnlzd0hrazJPMWJqMW9TWUdpcUsyekw3R3Z5ZW5hMFRFSmt1NmZQVWlMOEE3WFlTMko2N3N1clp5aXZTSGEzZmlMZWJwcnQ0K053d0hrVzI0ekRBQVVOWWdZb0lFTkRTZE1aSDBrY2Rla0F2NDRMUjJYYTRHOTBQWEdUeEVaamtVUnRvUEEzaGtveVh0Uk1zZkV6cW51eStadjJVamdNellZTHZ6M3FRSHk1UHFSR0haRjhaenNVQUVDM2V2UHFTd01wTEs4NmNzWDMwUGh0eklVZkM4TS90bWh2cHgxYXhjRzQwaEUwN1pEQmlOUXl5SXhHWUdOcEVJbzNSemIybFY1N0V2Wm14TFRsZ2cwbGJpejNGWEpYeEdDZGhtV2dFY2p1a0NMUEFsVElGV3h5dVJRc2ZORUJ0SGtjY2FCay9oSnhWcFNzUVlkNDdOWXJtMlMzckZzalFHMTRuWUhQckJyL3JLdmlWZjN1RG5uRStYQUpKaVpHVWV5aWZqU3h4VkNKMVVBaUtldm9Yc05LR3U5RHF0VHQ4TWFqOTJMSGRGNE9RMEUvem01aDVMd2I4T0VkTzdOWGhPMFhwTUQxTHZuRDUzMk5Pak1sRUU3MXd4U1I4STROZ3pQU1dVQVdXZk5aUnF3S09GMldSWGd6dXVpU1dUbTl5Ly9MVnlkTDFCaitSV1EzM2ZlOE9RdDdod1F4eElPSUQzajlhV2RXczNaQ1I3Rkl6MGFwaUFjbGhZcWZEOWhNTmUzS2h6WHZFbFFQdGI3MjM2L2plbkEvVTFXZmc5TUZsK2R1RWRJUmpBdUM1Z2NUTVRhZTJrSkFWektXOTFSZTFHY2xaMm5IV1ltVTVibStVa3NNUXAyYWVuMW5JeEM4RDc5dFBvL0xubnlSMWFoTktSdkhrYmxrVDRVQk5QbUp4bHMxbEZPa3VjL3c3c0JraEdzei82ZUFFZUxuSm5vS2NGU1ZveU9na2hJbHkrMUxISG1seklBRGhEK3dadnAwTVRFeE9nUlRXTCtkcDJlcjhuM3JncHRnMUw5OFpldFNLSHducEJVSjdOTUEvY1FhNkRqM041aWxQWUV4NXlvZ1RPQk9mSjIraUpnb2xUN1c0UzFDOVpyK3Nuc1hMUy9OdG1DaHJwQ1dsSGFOWGgxL1ZibmhJOUVRVy9KMnh3cXR0dnJ1SnZoeGZhRC9tblVIUndtdUF4R3AxMWZqZ0tUMFYrdElWRExGeVZzVktoWTg0OVZ4VVlweXdxdTJLSll4RWlFSmpaNjRSRGxscEtWYm1sK084bWo3TWJnODdvT213bzBzdXp0NjhlVnR0dWl3ekphbnp0dS9RdXhuaWdadHhoeVVxSGdhK2RQV1ZrUmsyeUhFSS81eHQ1TWQwZXdNanNkZmhXZFZ2OTdYUlVwcEN5M3lYRStBWkNJZlEzQmNwcll1WXNnV2hCRk5UVy8zbmkybmVDdll1UkcvRGh2L2s4aGlJOUU2QXl0eDFhM1RBeE9TemNJV3lJeTI4S0dZRzNIcW5rY3NIaGE0b1NuNWd4ZE00RnZpam1IRkhWdzFFT1RHcTBiNHRwdDlJN3RpakhXejVyRlFobGRBcTlvR3lMc29pQWVNNFMvZUlrcVN5a2FRMjRTZjZhcTRDR29mL2haMGNwckdiKzVTUE9zSGN2VGpHSXhTa0tBMHNLakN4SHNodDg3MXlHbEUwb3pwWXJuWkEzSHY1cklWNVhLTWpZRDRXWHltRUFUM0U1TzRTbDRmU1c4VHFWS0hEU0RnNGhBaWlXRjlOR2RrZkNRNENIVkt4K016WGRKSXQ5azIxQVVMZm5XRDJ3dUV6TUs0OFJ4VWVORnA0cSsyUDRFZ1M4Q0JnNy9UQllwblVQOVdQbXZjcy9EQlI5bGl1Mi9PeGJhM0xFK2MrcGc0VVlkS1RpWEVnSzFLbnZRTEtQOVl5OE5UK29XS2xWRjZoTHhZZWx1YUsxSE5XNkRUaHdKQkdhaXFuNFRXU29CdE9WYzVxWFZNMkFlRjRuS3kzQk5yTG1LZG1yS3BMaUJhSElVRDdKUzFUUTlGWnJFMXF3SFpDSmtrRHdMU2dJZDA5bXhjdDlKR2RPbDNJNVI3VUJSc08yTHRDK3R1dGpKNytnOW90M01FKzFEa3Bid0JIUlBraTQ0UVZPdFB5YmlreHhoVXZacndXWkhvVWNqeWpDZC9CWDNqRU1zYXpKYzEwWVR5QjluQmptN0tPZWRCeVh0c2pSUFlPRTFFdmZ1N25saTJVd2RhaUhNN0dCYmZ4THltd1NOdVdWS0dXZk0wcXo4MG9LLzFrMmdrNkpSdVdQYkJCSXVHUnNZUUhPNGdUU0pPL1kvMnRVQlQ3dDd2Tk9nbiswdjNkZG4yQmxmendLMUFEYVd4eWFRZWM3TXV0VW1pZjFORWlGci9rVk5CaURoZGZxUGwyZTE3NGRrZjAyRm9DV0pvbUJlL1UwRGN1OHByQmZxMVVzV0tGaWZiNXRRZERqdHdrNmZGdW13eHBjeE42czQ2THJmZ2RXaStFejdOOWhVVDMxcDFQQVJjWFhRUTFCZzVta0FsSVE4VVlreTNock1rZERpdGVObW96UVRtZDN3QnZNUmhOODI2dUk1bXM5SFZDbE14djNzTXZkSTYvc0QxY3BxVDlHTlhWTzYyT2FJdzY2aVJ0dThIK3JjdUtocG9yRVRyV0I2ZnBMRFBFQnJZakl2am1RYURGZjArbnArcmxodk9ZQ1BTeCsvQjlOMDdtY21UL09PT3orREJ0YVYzY1o2aTJTc1NRU3NTaWNvaWNtZzIxUHN1bUcvU3NQUG9xWVE2YXVyUFVMTCsvNEhsVjIxSUdUOHlrSzByWE4zRHBHUCsrR3A3OGF1UXpRN0tqNXBzeVFRM1BnT1o2bWgybno2d2lNV0F6UzdYTjU5Rk53aE1ZMzBnQXQ3c0JRRGk2bUJUdHlLejBOU2VacVp5YXBBZytmUVhoZys4cUJZaEJPME5qd3d5LzJCNUlpTkQ0UENlT3BybjZERkM1VzNOdGRhOEpUMkdoSU1UNndUZk9OTEFnbUQvMGxtTTFpblgxaWh6RENwR2hGMUJyT1F2MzQ2ZHJMNGQ1M2l2M3pTOWlEM21Hb0djOEJmR3ZuOHdpZ2JnWFAvT0RMa0htT290dWVZZ21PMWZsZXRVMzJxWGRhWlRsZHY0NDI5K2xLMFl4UFpJZ3UrQWQ3aFFZamo4MFpKeE9DMERDR2lXU1BVbGJtRklrUEowcytmd3hYZk96V3ZzVkkvTU9JaFFiWDFkT2d6L2NlbnM2dnhZbGpJVFdrNXk2VlpvanovZFM5NmlCOVZlUkMrb3VWcFR0M2JYdmdTUFNkY21Ib0JUZ283RnF0VURwTThTdWNoV1JQUCtld240RjdPdFkyRmxtdjNMMmN6TGUxcGdtbEViMXcySjlSQUwwWmdsckpvaGwvQWJxWCtIUkxlT09IUkZ5UVpQbVgyUFQvMExSRWxHeVhwZTFnaWhTTGk4blB5RUJpUk5uUkU1cXFSYjdwUmppTnQyd2E2aGFIdmVDVHV6VkNFaXhsQk5aUFRpaHM3VW1yTGxOdVc2aWZqWS9UMFY4LzVLbCt2RFhjeWxSN2NxSGVESHlDK3UvZW1jT2RER0Q5UENIUnZTTUZ3ejZJcmhBMW10WHhmaVc3UXJMY0RDeVZnWnJ3R0Z3QitPdENuKzlSajRSUkFiR3VydUlvZE5SOWMrc3UvMDRORmNDblBTOGNKaXJub1VtaExGVkd0cC84enplenZnOXlZZ1BrN1pjR2NXNW5WUDFCcE02b2ZBMVEySGkyY0ErYmV0WEpGRWVoN2ZId3dmdlYyclM0dDFwNzBEeGZFUUtFQWY1TnBqRWpSeGZ0d25mQWhUbEpEajlCamRDakFRUDVCV1BNZlVRUk14WWtNNlVXcmV6LzV3TXJ6dm9wTWJVeS9CVDhCaURJZWFoMU1XZTZGZjRwV0lOelU5aGtHRndkYmZMVnpzOE83ZjFua2RFSUZXZUZ6US9RclYrb3pNNkx3QlRIMjc2M0V2N3lmelNablNHaTFKYkIwT2xXWWVoTkJTVDJGOHZhVGxaNzNJVks2dEhEQ1hnajdzOG03UVJTNWhOUlFqY0VJRUh5M013ZzRVTjQ2c2ptdHZsNkYzbkZTNExGUmw0MjNmeUpOcHB1VGE5V1dTR2F3d0ZXQ2doMFJ0WVg0aWg0ZGZXUFpZeEVpaEpWTFpUSGQxWGJ3L1dWYy9XZTc3S0hyNno2K3RZTjllanY3TkJuOWVobjIyb24zYWR2dTBmSDc5SGhRbmp5QnpFYWMvRTlxZkFJRldpR3UxQ0RwNldreVdvRHlFRWlZNzRhVis1d1BZVm9lR2hWY05STUlKOStrWkxNdTQ2bCtEbnFnT085Qjk2Unh3Zng1UlVQRzVUbjNnb002Vng4YXF6SzRGVjdHSklsaEhPSDkrbWlTbEZBODFxNzl0SVhjVXM5Yk9scXdlWUV1R0owMkt6NVUwTTlRbXlvRDZDM3AxZGFIKzlQWXNUODhIZ3JnSTFvVGIvNmtJTk1MZzMxV3VMS0gvcHhmVlJ6YzdtRmdyYU9HM0lNNk9ScVhIMVJhdGlHZU5oK0ZYNWNhbElzdnJQQjdQNS92K0NTcHdDc011RjVsUkpLcVpkSXQwdHFzZHVKcHlOMDBFV2gyN3dwT3BEUDdWOWZYNlkrODI2VVZPY1BSdi9SQlRCZnYzWFQ2a3FGMlQ3ODVhempjYitlMUVMV2ZuVlZiYkNwQnJSYkJseXo2dFJibTVCaVNkYkhYZ3JPUW1kei9RbXJ2cVNGTGN5N2RZTkpSQ3FxWnBnQXkzNnMvbVBReFZIN05WVEJ0eVZIcDloeTdmMEh4ZCtMc2ZYeHE5S1AwcmR3RU9xVVR3YjNzSUhYdlBHQnNBbzI3aEFKWFZYR0ZiTmZqRzVEY0JwV051NDFZVy9wb21CWkQzdUY0UzVoeXNoWEN5bkhjK29sL3FoL3ZxNFYvMXpFdnV5UjUrc2JoUXliczRMZkl3V24zb1hESWMzUHVlbHZhQ2Y1a1lyMklkMVJiQU9zMmM5aEozSHNsNjArS3pZaVNDcVgzLzFwNHJGMmhVT1dNbXl0ZHpPNHdOZ2hrV1lsdFlDU0sxL29YOXgyS3ZMSmZOeVVGZjQ5dXhPOWl0ekFJTTR2ZzlBS3ovejlWemk4dFlCRnNiY0grUitRcHRCMlQzOC9OTWVhTHB0UG5uOFU3VVZnYWRmc056MnJpa09IT2ltZWFkNndpUm9KV2dIY3pPQ29tbC9DeTRaci9NTmdQR290MVpuSGJNWi82QjFEeE5ULzU2dWpoNjZHLzFnT0lrT0FVcGsvYTRvNUpDckpXNm9UWE53L1VwR1BaV0ZtRy96dVVXck9IUEEwczJVNkJDNE9rWlo5TFhqUEJic045S1ozNml6S1VBVXVhOUdESU9aeXN6eStYV2JJZCtrZmtWeDVLdk5lNjFBN1dtVWdJQVZwVUoxeElPc1M5aVUyeWRnQUdMeDNCcCtaMXlFNldsOVBlQ2QzdDRmSnJmVXhlNElKRzFJNHN0a0JVd2loZGZibk0wMyt3NmMrbTZaTFF4VEFhakYzQXZsSTZLdGNnR1RrclVYSXBXNkpKdXVrTHQxM2tZekE2L21IWUN1UGNaU2ZLcC96YW0vZDNsaUc2YVFkWFJUdUJjSjFQQTc2ZHpTaHdyeno4aTBmdEk0cjRDSkZBOXZGcHNWeWN0Ulh4ODNZalh2VlNiRnpQb2VTSFA0aUdZYnhuQVlXM0lQb3ptb3M4U2h6N3h2QXZTaXdVNjArYWl0WXp3MHVTV1Zaem15YWNhM3R0VlZLSkFsWXMxUjJEMUY1NnlHZ1AvVnJ2M3p0UGQzcjZSRWhNalNvZzZSbWFrTmZsTUpFbmw2ODlzZUMwbE5NcVFkRlZaNXlNdFc5TjlBTThmcWJJL0U2cm4yMGw3L21NaXFiZG9uMXpOK1o1WEh0blhmWnIrRDF2d2NWS3ROaUVsRjI2Z1c0RXovb0tTTVdjWGI2dlcrekp0aUpkZXdKVStnRHJybXRVYjYvSTNZQ0l0czEvbE9rTG1icWpiS1g0Ynd1MVdkMVlZb1hiMWV5M0poVDNOUUYzRm4zNW5rOVkvQnQ4Z3MwajdYVGIxZ3NHVStUT2dEK1ZWcGRCWlJSak1iN3BjT290S2dYdXFMenZZc0NIUkNPN21oc0o4YkZnd21TY1R4MGY1eHEyVEdYZStTTFhvbmZXdkxGOTRjMFhWaEpNUFhLdWZEaEZtWVFkbHU0WWJqYWpaMG1HTTJ0QlhGbU1VcGpLL1pQUS96MmVlZ3l0REFtd1NpSXpaY1FnYm16Mk9hTnJrem10QzB0ZlA2NFA1aTgrdHZtcmRyVVdiVmx3ZHhUMm9qL3E4YXk4YStKcjJsN0RuYmw2TnROUHV2WDFuS1JyNzR4bG1PeWdhVE8rWERMMHlHdVF2T280aTZhdHR2aE03QjdadmN4WEhzKzhWMk1QQ205S3NVRHZjamgyQUR3TG9LQTRYSkpsZWp4cGIvOU8vM1F1dmZTSzhraTRrVVplSGduVFNOTzlmejVocG4vMzAxU0JndzVGc2NNWmhuQkE3SzRTRENuQ2N4WGlNM09XbWJkWVJRWWR1YndCUStRVTVtTmM0UTlMNXZ6SmhBQ25sa055R2k5Q1cxcm9veFhtZS9WRXpFYWxmM3R4NnJpVjlHdy9iVWtoc1VLeDFEMnBNNTNwS1RKYVdzYWRicUhTVHhVc2R0UFBIQVpyUXpKckdNdjVrZEJVeGd1RlpZV0Y3V3NWaXVvaXc1U3duQW9sanRpL0xQRmxoYk1pd1ZxTXFtaG5aMXBzeXNUQUw1SjdvTk1JdlpsUnFULzIvVndreDAxR3loTGFBWUs2eFhsb1E5eHQ1MnRmYy95UWZyYnFkK1BOZHBGQlFOYlFvclA0VXltRVg4VndCWC82U0hVVC9lemhkQUZYQ0RZSEhNazVpY0ZYcjFCL21nZ3NtQzJlTjlVTEhXNFYyWHlFb0pRUmc5c1Fyb1RxcnE5TE0vV3IvVHMvUVR6VmdaTU9YYU4zSFhkcTZzcCs1VndCd0s4RHhLZ0YraHRBQWJyYzltOWxRQTNtbXdhbldMY1ovVzdsV0h1WkxiUkFlQlNGekdJSTBORWNhSVpWU3lCU3JZOGVLbUxkY2d4L0lwMUk1UStRb01LejcwRWM4UENWQ1FzVUhLUVh2UHVFSkNxeG04VGQ2RGFaUW82TnFObzNiSURlVlFtREJPOXJKQjBQWkFXV2ZTb21SZXVyanJ6dUx2ZjdOTm5vZWgwd21wQktFT0lXeUVQNzBNb3V2MVRpMDhOUk10Q2ZEQ2xpSWpDOUVhMWR5L2ZFZEJwQVhGQ0FxNnl5U0hTUUcwenRFd3NpZjZsdFJiNkgyKzRyWTdyUjhkT01EWWRsdFdDdWd4aHdGQVJLb211RlZzSVQyUW10aytmYWhpU05tZTl5S0NOeVhwdkUvUDZ4ZWVKRm5nU3FuVDhQd3B4eVNqTXorWU5kTFA5b09rM3ZHWkxzUjg3NEpaNEU4dzN2QW1pZTZsczFaL1FqY3NISnZIWlU4Tjg4ZEJBdSs1NnpRZ0hKcDhmT2Z3U0l4dkpGVEFhdkxLeHZHMkE1WEJJdlZsWUtIUlhINm9UYXhtZ1NXM2xOZUdHMmlaanJOM0R5NXlSNFd3UGJTYXJ0ZzBLam9ZZmF1RFVYQlZuVHJRNDdPUjB5ejRjMVh2MEVkcFVBa3phZE9Tc3NnT3ZacERwSXZ5Q3ZyN1hZeWJYTDV3eW42MXRxVitKamt6UmVHR3g4VS9LYWtHcWo1Wi9MdVk2SXpPTUNSbmlwSXdiU1drSXZPNnc0NExURDkxeHlRQnRIbGkzaXo0QUxSR1BhbXVzUWtxdHZTVkdaNjZwNUNxRTNtcERwb1d0YlNyZTB2eUFjVmhBbkt4T3FrdWxJSzJianBrakxYUFdlMUJrck5kVzVVMmFoODJYRWtaWjB3VTA4ZCtuZEt4aGM2U1lEenB0MTU0ZlFJRjBsUm1zRE9tZzF4bjVKMHVYRVliTmw0cHBHemtycUZ4OVNDTElDSUZ4SFFxdHFiekdwNGNmUktnOW1kMEVrRjVTVDVRK3Fld0IyN1JjZkpFWXVKckJZSVhObFNsd3VZemFneHYwVGxHUVlVTy9LSWVXc1dZRUxIMExha0EzRFRESjh4MDNpdnk1NEJRNTIzR0FUMndrWUVUMWhOVzdVU2RLT2NOckc5dWRxL0NvVjRNZEF5R2tRRmpsVW1wdUs4ZThwaEoybGtrNFkwNGg3dHN4OHJGYjVKOU1PU0RwZGF3WVZ0UGtKOWphQ1hDbUJMaEdKYll2NGFxVkRpVlNRR08rVDN2QUlVL0VxSWxEa1VrVzhkenM0T2xvbWh3cVZ3WUJJN29XWnhpYzBOcUgxSWMrckJEYm9yWnA5S0hZZHQrcjU5cWpwU2JvTnNET21RTzZRYzNYVXNwYXBYTWJHWHh3M2hzY0hTYzFDbmV5Rm5xekpKaXRwWkZReFFTNVFPdGg0YVU5QmE5cXRYM2t2UkVySEFhamRMSUV4emF2bTJJM2t2MDJTb1U4VTBLV1hBUkJWVWtKa0xrT2djelI1QjR5ams0SGZpN2RZY1djNUd5N0JDeHpJOXBjaDNUcExYUmRuVEVDUWphMG1lUnZjSFYzdVN5MDFsR2U5a1E3d0dGdDdyZjVpNHIzWldrS2NBOE1xMmZac3JnODRqYjBQWXhDdVh2aGx2Ky9wcUFiTzdNT3l5R21nSk5WYWppMkh0czR0OFBxb0Z3OHhNd1llRS84MHRrcmdQWTJndWdTemYrVVZxYVZlMzg0bVBPRFk0TE9PL1hwalNXWGF5MHNsK055WjV4M1oxVHdudU5pL3VOb1oxVkVpUVNyM3BzZCtSdDZmTjRFaXQwb3Jkc0E5UlpPbnpSUm4vTks1aEZ2ODFBZzBGN2J3ZnBuYUEwT1N1bTJuVy9PMmVyMGFMSDlpcmRzWGU1QU5lVmp4Q1llZzdyUE9MUm4yYStveDg2YmdRQ0dOVkZtRmxIbWxrNkcyUnhYYmU3eUFhNUd4eE1VK3lBUEJURmtEcEdyS3ZuanlRVy9vZVZTMHlZZUtlVHNubmRQc3ptUE5RamliNFJxbWlHbXZ0R3hLbW9DUmM4MTZpRnlJRVA5Q2ZUUTcwdjdJUEM2d1dnTk9LVG82a1gzTk92ZXpON0ZwdjhzTk1OR3JMZTAvZDR5bW83WjVjSy9QMlh5M1BIcFVqREp4NGZMdnU0S214bmNEeVdwL3pUTFhJRzF3ZnY5bXFMZ0JHYUJ2SVpxM29Jd0VMRjJZMDgyMkdjRmwwcDVzb1NvbElYcGFPUUlWSGRWcS9aKzNhbmdjTnprQW85bzBGVVRtRnp2WktidFU3bkZSbklSUWM3SUlLUWZ3S3oxL3psekNKbHhSSEVOS011Q1JmNjZyQWVpRzBYNmpXSG5kTVFzWEtFb1o2YkdpWGpsS3Z4OXdQSWk5eU1MNklNZ0ZGcDdDZHQwTjRiUi84NUg2dXdCME9wYzFZaS9PemZ3a05GRUN6QlpaaHJUNWFnaVJ3cUFkeTMzcUovdnFuNGtxaEJja3FHSU1KcDQwUGVIM1E1RUxjN3ZuK3BTTzQrd2RnWmE4U0F4ZHdqMnBaOHZTeUQ2bE0wUXZKNng1dFoxcGE0SCtlT0tTUUF3T3BnRHRhWld2WkVzQnYrTmlkRm5jOFFJQlZkcGtqVS9Md1BkMHBlQmkvRDJYeStrUHJqUEJpa2FBQm5LRzhKNHdMR21YWjdSTHpJL3MvVmgySkVwQmwxTnBzb3cvelIzTEpzWW8xRXgvNHBuc0hnSHVCSEp4YzVyZmNGdWhWaTZwZXFKTEtWMG1YZkdYRnZOTENSSERYRDVXM29XT1F2dys5YjFkMGdjNnova1NyZlV6dG5uSTNTV0ZnRFFyU0tzMVdGR1ViQ245NmVYQmlpS3pqTjhGdmFqbXgvcDAzNjZrY0lYczZ4a205Q3I0VklnQTdHTXNsK3NhVHo4L3kyWUhxNTRha0d1TllWakZlY2dUUE16WG10aXlkUm1QY3hZOWpiWmVORFFJTitjUkJRb1pqR09UZ2hZMDlSRGZ0elo3bklmbkU5UTZ5RzJ1TXRkU3FLNVZySEdMZk9PZDJpSFFIRGxLR3N2UnVuc1c4S3hZd2FiZjlSdVkxZE1FQWdXUmp5OFVheC9pV3ZFaU9waWtXRnIrTGZZZ1IwbXBXRFpocndTeU1EVlNWQ0w1NGpNSjVXTFVieXVOandublU2U0p2VGJjYUpVR21ReSthT05lbG9pcmkrUHVoaG1GTUFaU1VZaHE3L1o1alIxZDdUZ2hvdTRDbHhuTStRQUZ1Y2ZvMnBBRFlDVU4zSXhGZ0k4a1BDTVdacFNKYVRiSTQ5Z3pDTTJ1Q3p4cHBjcUxkVzkzOEFKNlNuWWR0UUFkUGVST1YzaUtBRFpKTTl6NmF2cGhJNUZCZlhFNFVpcDZuelVyMkpXaFp5cXEvUE8zNWFxclNob0MzUGVIQzJpZnVNQlFBU0pqdjRnVzhjRS9udnRVdGVRSjg4ek5IMGtNNllpeDhHdUZ3RXA5ZmdZRE9vK01RREJRVGFKSTlNei9XRnZmOFlGLzVHNEgvQnhqQmxFOUZGRXNQTHVodyswbUFLREJPV2ZqZFJPWVN4OEJLMzdRWDZJVCtCTEZJTnJCaDhrcHJBTktXTDBUMEJpWjRYcHRILzA0S1E4U0xiRXY3THJFZm0vWjVvaks3VE1wU3FKeG5xeWcvclkwRERhbjhBbXFZWTVqcmphcjRvWG5MWUZ5V2p3bkZORk5PTjFuOEpXQk00emk0L2ptTy9zZ2dKWmJmRlVSV3lOQXU1ZGExWEdPZ1NIV0pROWIxek5vR25TNlN3b3dOcVl3NC9Kc3Y4RmMrK3A4eHR4VitvSzVVd1VPWkFFa3ZCZ0tXallhTlBxckQ1Tzc2cnlCZ0c5aXFxT25HWTJwL3ErM1pEN1ovQi9ZbFY2VFY0dmtTN04yRTI3WndNQkF4cFZFZllMNy8wclBhbEdCRFd0Qk1YbFFJMWtuWHNvSEtFOGQycmg0U0N4RXI5MTJVT1V1bGRnbXNxVnh6R3JHOW4ranhGcER0c2JOSXNoQmEvalZhaTk2eG1nRWZ6QTRHMkk1OUZHRUl0N2pUTmZXOElaRWRydlhFenBEQ2FkQ0lMSzdERGFGb0pOdytVNlo4VjMvVk1rUklzUWZXcU9qR2I5U0J0L1BFcy9qQTYvVmhGM2xPQjlUbG5raGl0K0l4UXd6TitBOTkraHF6eHFPK01NOFhZU21VR1ljdDBCbGozcmRZTnNmRE01THp5cnFCeWlyU0hpSHl2U2FpamhQQjVWTVovS0cyeWVkR01OUExLbVk1UThVV29wdjZXZ1NFNm5VT1JJeFZMMDJPZUo5Q1RVcDVybWtwVWJVbHJ5elBrZlY1WnZTV25WOGh0MU1ERnFWR3lNU1R3WjNTWWY5YXdEWXBGVHpOOUlYMUhCUFJRM04xV3lXK0tNNlhsMDB5aWxNWGVCUUxDVU83RHdUc2NiNXNyM2xRYWtudXg3YUhkbEhWQVVxd0dYVVRLdXJuTGdVSk40aDlPSVdOcEVCYy9CVHVqS3FtUWpsMTl5R0hpZXl1eWdhYXJ1TDlJaUM5QUlOeXVRempDK0VESkJ6RVA0ODAzTzZ3WjMrUm0vbWY1V1crNWw2RWVvL0huY24xSG5hUzRQY2t0aTkwSjdyVGVSSldPbWxZVnNwdjhUVnlEMkRzai9IZ1crWkFhaFRGQVNLanBZS3NjQVBMd21BUmNMVWQvUExnR0FRRFl5YkVac1IxdDE5QnprTGJZV3pRUkEzNDUxaUoyWnE5TG9pZkRBdHFQazc0SzdCdGhDVDJyZzFMWS85Yzh0SjZaRmt5UnQwNWdmdFkxWU1KVks2Mjh4RUxxR2k1TWFYcHJnMVFGTHlSaWpSUnF2cEJtSk5GSkpEWEpmU2pmVHYrNmhzTGcvN0RZM3gzM1RxNFUvMXBMS2NpdEx5eWdlakh1THo5eTZ3YkdKNUkxMFk4REF6WDNtYzBXYStsLzdtNUtTaXZaZzI0eDEzQndRS0JIdFU5NnFoeDg5TjBSSjdScWkzT0g3MnVqc01qUXB5Qi91Q3dmVGk0TlNUNFdzS3NrVHI1TVhvZXZRcXM4NGdIdm9aUDdUVmdxN0EzVG1BVVdaSWVrVGNPWHpYdXEwb2NQaGs4Y3FsZWZRV1dkS01KZkZ3K1Y3bmxtVm1LbVI4aEExR2o5bWFSVFdPTkVyZyt1b0tONVRzUUR6WkdkSGg3cXIzNEFUenlBbzZtNHZieUdMTks4WGtFZkdKY09ScVNwZ1R4WHloTGxKQVNHZ2EzNzVLVFZEVnBWekQxUm9OazZEaGZwbFNtZlZob3M3aEJVYVQ1MjZEaW1odjNhLzVzRzBJUExNRDNTVTYzTzNFT0xEa1BrQWtoWk94VFFxQUt2bS9NVDA2ZzIzQTBnRTlpT1o1bzlMUkRrUmkrSkJIMzdhVmFoTFNBajdWVVA4NjNLaTJsVC9xbVE5bzF6K0JRRjZNWEg2em96QW1UU0QwYkJVYktoNWxEaThJR3dBd1RDUWluVm9ZOTlxOEdTcG5oUnI4QkFZaElwRkk2MjhrMHRGV28zMGREZVBFZjR0bERqelg1TVhHNyt4blJ6ZGRYU3hMd3JXRmErYlplZnozUEE4RzNJUFFMdDl5RXNNMjRkNktwdVk1WWFUSDBuU2JrZnVjZjdTeDBzMzBuKzlxK2hKK0ZqM2NWRDRWOWRGNDM5UW1wR3lXTVhrTi90YlY0ckdIelZpKzF2Q0NuK0h6dzcxbGM3ZUZFWTdSbDhMMVVZRDdmTVg4MGFlYUwyakl2L1pnaUNGMW5NRmMzRm9IbzlEQTFkOW9jY0txazdHZUtRbnhMMHgrSU5HandnUlgwSlA5R1IxbG1oaUV4RDhqdXZoREVtU3EyRFBlVXliMnkySXhpWWQxZWhIV0hCQlczWUpXQ0lwbXFNYXExQlFoQktBRmkwaFExY2YwSnRaRWp6amFyY0lwL0hYb0NaM3BVaGg4ejI1czhWVkNaT3N5RmpZemJycFpHMkdrb1Z4R1NuTVYvSXhIb1ZFV2xST2xHNll4VTArVy8zYTdyMFlpOHVtbGVJZXBITXR4VDA3b1RlS01GUEZsM0hSUWUyN2I1YmhYWElNN2I5ZkJWQXVYRGQ5WTdDVHlPV2hJYm5kSGtBU0FUOVBlRWU5aVZoYTl1MzFKOXFsU245Yit4MDlUNWk5a3JoOGluWWROdHFUcmQ5KzJ6MG9nNis3c204dTUvQmpLSTVob2hpeVhWMyttTFNuTWl4RmhmaE9abXBSaGVMVG1zeDl1U0RXV252QW56ZUtLR1BXeUJYb2tZVzd6ZU9CUjZneHZhcVN6akNpVC9VOUN6RTE0WjhrczZQWW5ocVVyQ1RhS0FtbEVlMEkvZ2o0cHUwY2d6dE9sZmRubGZ1WXlsWUJHaVlUK2dKc0ZQUWQ2ZUcwSGFYY1lyNVFlU0tjNGhoRmNEMzI0WXkrdDVoQjg4UVROREFSb1NNck5pUGJVRmpsclVPMllXTkpaYTJvR2FSczdYUVpQK0xkaDhmVVQ0cVNKQmVtR1lpVEdHck1vS2lUaXNheFJ3a0VyMmxaTlE0QXdrdFF6bXI0c1NhTWk2KzJZUXN1T21tY1EvdnlOQXlaOUxLQ1NjYXBUUkcwRzRiZGlobXF6N09vdm9xc0FGRFFJSTgzL0JwVHhsWWprRmNZZHhSWTBtdVI2NFMzQTZDandrRC8xeUU0Y21nZG5vNDV2dnR3Q2ROeC9OeG1jZmNWYmkvNTVCTVRzS3VLejExT1UrZ0RQL25yZWx2b0tMT0IzZGZxOWNSdFhSdXlVbmZpcEhNbVJQbi9KOVIvSlQvSDlhS3NuMzhWMmFzVmlaaEExS3VHNzg5N1I4bElhVGtLait4eGhrL0I3eTZ1dGFWS3EzNFA3ZnlidHFQWkhRbkVjUzFldnJkbXlUREp5Qmc1YXZ0dksvdjNHN3NSMUR5Um44VERTTTREUVIwdGpFbW5OWmxtVUFvSkNrbDBXd1h1azVzcnlBZ3Rxb1B2TFZTdkIwUFh0WVA0aHRmbUtSQWpjZU43T1NScXYzR0Uxa3VTdkN2TzJVdmQyWW0rZVBVQm9LY0Mva3psdlVNNHQreFd1NW5kVHIzWUZFb1NkeENjdFhZR1BMQUgvR3dZNFJ4U3QvUDhsb0UwRkJyZG5tOGlaZ1lzOTJLRGptbmd5SjNwd1RtR1pqaEhXVGVOWTNZNlhzaUhxMm4xSFZuN0RVdFRxQ3U0dDdlOXRXSGl2K0V4ZmVDZmtHRDFvZ1NTKzRiL25Lek9uVWtmNkorbkhGUENFT1V1OWxndWZzUjJNQjZvN1orUlZ4bjI3Wjc3cE9uQzVXdkJ1eWZNUFhNQlVSSnBPakg5cjZRR0VqaEhkTWg5OXNuSk1WdzRkc2ZQN3FybVFSRGVOQ1BVS3dNZkFRa1RJdFhveGR2MWt1TGJCVW1QalR6NTByQjFrYVJLRkR6R1Y5TE5sdjNRVzZNUE9GbnlKSkNGQkpVVDhTNE9rQlE4SGVjdkgycjB2YXpSclJKanBjcVZCRnZ5enFkRVRTVFVGZkRuWHorZWVIY3pSTzg0dmdTQVNTa2h4NDN5Tm84bDAyWXZzdkhjNFZjSzZERmE4dmNpVWVTUzcxa1dzR2tVYm5Vd3VnT1c4QzdpVXJOR2tiZldDK0RKdVJLY2QwQkZGVzVMblNzYmU1TERZOW5oclhtMlEwbHQ5WWgzaVpqbkUyVHRYU0p4S3BtQVAvVXZOcXNwSXErUmYwaFduTHBFZXVqczkyWStlVlFrNC90ZlY4WlprYzdESGdONTRYWkZDaXl4OGNUYlZib2p0UU9kRE5kZUVKeUhkM3hZa0laZmhCU0dVczgwYm1nWUV2NW9uL3pDc01WMnp2WUFWLzJlWkk2V2FmUkRoWEJrNWVjdlNBVVB6alhxRGRmMWJrWjRxblpaNUpWVGFIRGZEa0tOM3FWb3R5YnNIdFZIQXo5aUVvSUlCQUVaeEJtZmEzOFpLaWliL1Z3aTNJSjdpckxpWXV0bllNNnQrazBFU09CbWR4ZldPOW1DNHNVT0huK1FmTnlvTXRIeTBaYW02NkFOR3NsU1JoNGsrbzkyWjF1WUxwM0U0UjVRK3ZtbWtjYjhvb08vS1NaaWVTZUZIYXZ6UmVHa3h1K2hwNm5LZ0hCZnc2T0ljVkJvM0ZSUzdYSmlGQVY3dTR1WURWY2VSYzVsb1Z0c0lBRDNIalBJd3p5QVcwMjVBemhWSXlOUlRPamJxQ3VsTWZkOWRSR1I4TDd6NXpLSVdtYVhlZlNjTjNlWEpBZ1JmWnR6MmcwTTVaQVBZVllEYTBPVDEwK09HK0pPZHRsWDNjMFVvNVBGUkNhcytOTTYzUTVubzFFS3JLRlcvN0FyUWRSRW9zUGRrVjQwK21XZkRFZytWUnlxSzVSV3NMalZIWm9OTmJ4dEFOR2RDSzJ3MVR5YXcwMTF4eWhFc2o5SHZRaE8zYTRWNEdiMkZoaHYybkhCd0FiVmRVV1cyNWhNS2kzUXdRdFpUNFVZWG1aYlhWN2tJN0VkRnIvM3V4YnExZ1BvV3J3S095eTBEVUh5djUyeVhHdzRlc0dqQ2RBY2ZuM1kwTVgyTHoxaklzUlJZZ21SRlVHSXdUa2Yrd1lsamRFeDBqSlIwUStVV092Nkp6bGFxdEZyeG9xOEVJZE1lT29neWpCdmphckhOYWtkQnZtUUZwY2xRdjM1ZTI4OE42anV3WitEalNOeWFid2tqcncyVlNRN3lod3ppL3FtSjh0dkMvem4yY0Z2a29WU2huY0pZUkJlczNnNnB2NndUSnNZY25BTGYyNFkvN0FjSHNmMUFrcEM4c3VxRG5hbC9oeEFJR1hXTWNUMnFpZUdmNm4ybnd6MG1hd283OXNUSDRyUjFKaVdBblpWVyt2Q0pxcDIwYy9Fc25Hd2hlSWZJRUJqNjN0U1dQWWNsTE5RSEZpM213RFZMSWlYWVdXSTVJQU1aRHVVNmpTaURtQUwzTTFmeWh3R0QxMzhQZktoOUw5R2xmSlZlV3pzbGxWS0c0MUpUWktCb0d6UnpCV2t6NTVUcnZFcUNURzFVR3pvY1hKV1VteDg2MGlXVE1tZjR2Wjd4VHBrZFdpT25DOWU3Rm9uYkVFTTZDSDV2THZSV1lpdFcwWWRRdG1NM3hvZEpnUlY5QU5vbzN6azEvMHlzUlFTVGtvMHFEWWZuUTNIS1NvekIwQUtXTVQ3SU5wUW1OZytqbUw1Z0R3c1J4cGxvdkRjYzFxcjVJdSt1QWFTdTh3VktHYTlpOTZhZGNsellpN2ZibzJhbzFwd0pDK3V2UXFyNnRUcExNdS9hcEp0VmpDOTljRjAzckl1Umd3VmMvemhjK0hFcHlqZUtMME5wbEVVbkJud0NPbkRZMUVGVWVlNk5YamtIb1FsN0FLT1oyT1ZqVkd5TlpwOHJxVG9Cb3J0b2tobmgyZDF2M1g4OUNyR1J2TXdsUkVDTWxqeTR0Skh6V25jN0pkYWVxaHJqOE9oQUduRVJYLzhGc0Q5YWZXRjdHSDV4M3hMSkZTUHdlU2NVYTVPdFBWY1B2WDdoN1NGZG5QTGpUMnNpRURMa2ZzaXlvZVZsQWJEdFdEcS80VnVES0RZNWVHSmsxQ1NRcDUyRXRSeDcrM3VaZHF5ak9yQ1dzZzVYMXFEb3hTUE9vK2tkYTRxZHVnZlFUcWZtWWErQ3U0TUxpL013LzBPYkZvWTFpN0NwU1IwSWVXcEFvWldUUDAxK1dJQzVNSHN6ZHBnNGRsOU9nbHNkWWsyemlRTTVqc1FSY2c1dk5NOFZGUW9FMFBMMWNSeU9IQ1NlTThzT2g1UEx1d0wxTzkwMFhGNi9LdjFNMDM0RTdIZ0hQZWdpSmdLMHMzTFo2bVE0bU05a0lhTWloK0lWZWs5RUo0L3gzaGoyWnp1U0E1Y2w4M1JwQ3F0SXpnK281T1FnUVpORFNRVFBUeVZDS0UwVnA1ckt2UFhtTENYajBpbFFhWklBcVhXY2c5YldhclExVk9XUDBpRnZqTkZqeUJVQm5penVnTVhWMUIxbmtHOWhhUWg0enhXMlVOU1did2p4cXIvUnVyMlBTd3QvcWlycXlXZTNxbTM2VGJVTjhYZUl0MUUrWFRHc3NmZ2laZm9FT3BydFo3dlZsTG45dVJiTGNuNklWT2dLc1BSSGNicGMvejRGcG9sVUlsNURGaXVsVXFWSkFLNkw2K0sweVBIUzZxbkNrcWRQZ0ZON2VJSDdaUmdWaDljcmZlczBBTUNPOGJsZ0FwbEV6SkVXNXgwbXlMbFQ4c3ZXNW5VYVVsM1NFVU5iZytndmN5ZTNXSEQrcGtReHRJOS9HQVdRYk16a1pWeStCTis1UkNtRld3QjBNRDZEdHNZVHRXVVN1UjNFMmJvSCs3blkyY1RsZlNYTUFZVE5OWjFIVEZIRmNwbkJsSHo4K09CNkl2amhDcERPUlhDUHpoNVZoUEtmQytEa0NVcFVtY2sycWRlVjNrR3lGaVR5dmhNbjFmdVd3cDNEVW4yZXlDZll2MDVTYUhSRXk5MmpNWVc0Ylo5MDZjWlFHVkFCMU1sNGErZGdEMTFXWThUWElaUkhEaHl5OFhSdUJhUDNzY2hSL3hxR3hEbFZWbHlIbmhsdnRJd0h3aUpNZ0MwZVVudy9ZbStFdVpSbUZvNGFiUGdkVEswR1QycXlodmlHT3RxbHF2NlJCRUE1dnJDYkRBbFBHNkxpWHNhUmQwQWlqMmt5VUM5UjI3YkVsZCtweHFVVUd5NlZUSEVzeE85QzU0blhtSHM5Z0xKbkxINWpIdTZ6a0NRVnppcGF5NVpzbHVTbWR6K0xWdnJQemUwOFp6Rmw1UWZEZ0xQVHdtMWFWQTVhWkdVQnJBMzVkaG9UZUtxZlpraU14elBaa1FXQ0piSFdIQ09ZNGF3NmJNdC90UUdSOWxnVUhVVThVbUt2aTlUYkVobEY3WTY0K0J6ZGFkV3M1ZVFJTlNxMFRyNC9GWkt6bzhVb1Qydk5oYUdhV3J2bGpmQ2NjZVR4MXZIVkw4NER6ZE8zc0poRnp5c0ZuY0V0SHo0cmY3RVNaUThyWGZIVUJyWmcxcjcybDJ4VU1QUTJsWkJTU0lWVTg2ZG9DNUpFYVNNeXNrSi9BK3B5VUlHQW9FYks2M0lHTHlpUlFvS3crUzFhZzA2K3Y1V2VJbUNlTzZPdlFvMFpwbHpRMFlUdVhqN29NQUxyaGRxV1NQRXI2bUg1WlVuZWszYWJMWXN2S3BleDMrcTExTHJHSjBSQWltQkRJZEVEdHprWGJnUEY0bktOazlnQXhGcXlqa0hsc0w2YkpNbUpudXpMY29BN3hOQVppUjRra2VpdjkvRkpZNG9HUG1acGtZaW1jSld4cmpIQmxhTXQ0TkxaQU10NEI2N0l2bnJ3bWM3akRqcFhHbzQwWnZ5eHVZTUV4ZHQralBqcFhpbWUydGE4YkNTaTFvUHpsZlloZmFHbjR5TkFwUENVc1NnMkxZaldHblUza0V1cS9TUURobWVDQWxlNHZiT24rY0RVU1lJdFVnSmVNamxrMm1YcmF3WDd1Y1VUYlBzOUlrbU9YZGVUWFNGU21EZ0REMnFoTmdGUFFlNldYUTZaYjJwYTlJdzVpQ0g2V2grMDhNVW0yb3RmSVlidVpGUHVzZkdTMzg4UVhOUTJGL3JCdlM3Sm4zYk1uUlprVWFFc01PL1VFMWRqbHNFMmFnaXJ0dDJaSXZBeHJkakpOMlYza3BML05Bb3NDOG1zdDVxUmtCaHdVN0xXWU9EQzh3aStMNm1uUThpOG50c2RpY21Ya2NVTWI0TUR4SjFQMGtVRGdUVGFWeldsR1NzYk9YenBNbWJ4SVhlZjNyVjI4dHprU28xTUVLY0ZqN25BNXQvWjhvK2tWRFV0L2ZqRTVjNjNhUi9RZWNva0IzVkFWeUdpWndKTGFCVjdhTngrYjZ5bmVtL2NjK05IMG1wejExQThGbUcrRld2VUhQdktFdSt5a0RlcEZtM3ZrSE16OS9UR2dNcVlwNWgzV21wUGF6MzdqV281RFkzbUZUckM3SzU5QnJHYm4yWnBaTi9kLzBnMGR3UmgvMkp5R0Z2K3JjZldEOTVCd0J4NFlnN0hma0dXZHo4bUZVdDZ2K25tWUJoZVRyY3VKZVI4dVh6NTJQVWh2YVlOSi9BekU4cUdWeThoK2lWY0ZTc0hReE9Zb040VzlpT09mdkIxdmR1RWg3MnJoK3o0d3BEN2xleWl6RWVWS3JKMnRYdXA1aktvUnRZMzEzVndpaWZ1WEsyL2hYNnBsTjBKM2tuUm1Ic3AxRmpKZGoraURKTlQ5K0lORHN4ZjJpdjdoN1JJUGYxdWFBMWl5SFo1OGkxSmdSamQwWm1vRUI1L0RkaGtVSjU0dGJCejlDS3E2Uis0QytoNzgrdmlRcDhta1NnVU1zdWlVVnVqU3NpeGR6UkIzVXE2WlVUT1NmTmtaZElUWUFvNlZDWDFTeDg3aGxNdURJWWcvVVpqYWI5RGFGa1pIeVNsMzMwN2RXeTVPSWdMdmI1cm1pWWs4cTF3d0N0SWRGY1dza0VpNE1DT2dCam5mZFhwOXFvTjBvSktQQlVETHJrYjZ1bFVidm9xVXlNWmRnZVRhYUpMbXhiMllFNFZnMTdvYzVuZE54LzBpV0l2MS9RMElVa3UrZGtGRUh0b0c0YkpxWVhKNG95SjR2SnMrOUkwQm42SDlLdEpGSGFHWVdOZFRsdDRMcG1UcWs4RzhtS1BsaERUeE91cmkxcHNrZzZ6SjhDZVdFNmNjMVFWMlRTODBsMHBUWXNEVlU3U0t4MUdPb0dqdE1WYldiZ0RSWmd6Q1VOMkdja3lnZzFIZGUrb3MrNXJrOUN1dVJqU1BVMFYrbkZ0UG5wQ2MyeGRDVis3NEhOZHlpdnJTektDSTVqeDNPQ1E5dnpsSjVQOFBTWTlibk8zWUtPdFlNbGRMTmpUaUxHU0ljWElKckNZL0Z3T3B6VlRWeFFTbjBybllkYUExNkMvOXlYVXYvOEdoZmtMbVZmOVpITWF3WEVYeTNFTWdKUEsxUnhJYThLeUdIdzJwenI1c0ZwUzFDNm9hM3BnQ1F6WVcxbE5lNXJLWWhLSnBSdVk3TVA4OVV3WEFBK25TNWF2ZEFZTkREK2x6RkFIb2lOV0g1aDNrNnpaK29NVWZsenlTYk93UkNOUkRKVzVrNnp5V0pUU0RVK0NHQ3hBa3ZpMjJnZjFSc0NmbEM4cWVoWHV5MEpqZGRhRjRrYktoRzhxdnEvZ09HYXhJUUpYbnJ1QTNSVXNZU05sM09XWktRVzEycHkwbDNMNmdmdjZQbDNHWUp6ZUNMVSt4bkh1RlNIaU9LNThFVmJoMlJXNXhhdzgxVXgyUXM4N2ozQTc5VDdDb09vUDkvNWZUZmgzUTluVzRvNmtMeG13L1ovYnRuTlBPYTZkOG14RUN2YnVhVWIwWWw1SEJUYkw2RWF5akJLd2JkQnlFaGNRL0hWZ0YvQ1NSb2NGZnpKTStHUVJKcnp2T3ZXaHpWak0rYzdIV1lZb2l3ZmZxbHJJS2c2aituL05weWVhbEZSZTFLeWQ5Zk9hbmlqSjhvZDdNRzZYVm9CR1RDbnQvYTVNaU00NmE3M0tqTlN5L1VOT0hRaDltWWlDUFVPZXI2UjVieXZQYncwUXJRUzRSR2wxOXNQd0EvWlR4U0puMGcydW8zY1ZuVkV4VUxPNHJiK0s4a1pOViszaGJkbG1jYVJuajlEcU1xeFovRUN5N0NsOG9OQitSQUpkOU0zM0ZOMGxTMGN3K1piRUIySzRENzJqbDZESlo1UjdTWlNzZU13YUhsbG51cTRQQWZTclEwclRGTTd5SW00VkZWcW9wMjZGZGh6Q0dzMmp4YkNsN1hoOWIzN0ZSY2VmTWY4YVdRVHlNTU1aVzVCOU54NGF3bFZKTGJkVllIUFhmYUdQL2VjMXVjTloyazl1RHlrUzN0cU9TOWdVaEl2MTM5UlVQaEovQ0NHZ2J4V25lYlZwVzZjL2htNlNVS2RkTEszdnBhQThjNUJMU2wrREEyOExHNHNldzVtOHRSVFExczRMNVlWWlRYd2hqK0NXK25yUnMvaENrWnMrN3hISkNWeVBYY3VTTGZwdHBNSUtDNHVGMVJQVzA5eEJxZ0xtQUZ3aDA2bkR4ZVhrcmFwZUhzMVFiRk5IQTd0WXV6L1pxN3pwUWc3N3ZYMjZMaURLYi9SUjN6UEJyd0pVV0ZEb3E5S3BURlZFQWd3WjhFUkgzSjMxd1ZFZ2l2YlRwV3ExZWtHeUtNOS9zTlJGL3l2c1JXR3ZIdkUvalozczM0N0ttRUR4RWVUTVFZUzZMRzhXWkRrdGRPQVRHWEovRTNxUWhXQWlENTJVc215eEtDSVhTOFhPdEVrWWp0S3R0RWhkYWU2cmVuaXNxbi9pMC9LZTNQeG9ZK1YvcWVsL1hrOW9qMmFKdDBnN3JEblloN2kzWVZobE10UHUycjlOUFR2Qmg2VWoyN2ZYa0FjODdmZzNzSzZwWjZpN1RreUl5SWgvY3ZPNVFNSENOZmVWWHI0d1JaS0sxNTk5aXF2K1NZMDNWSkRpdEg5Ui9PWW1JNlMweUtQZlJpSXZTVDVJN2lvTEZOTnZFLzJaaU4zWDZ4MUtiblkxN3BOemV1R2NUb2dLeTRFdGIzNm1KTXNZeHZqY0FFNmlIaHN5Z3BWclVkVnlxWkUzOS93MEdiSWZ3bkxIQ2dzbUZCbE14VGtEUzRkaGEzM0NDbUtNcDB1em1xZGxBdkVqeWdNcGRMYkxsVFZTNTFrVXNoczRpWWozREdtTThnaHc5NXNSdWJFa3ZETXdPQjVFYzB5blJ1Skl0dm05UzVPODBXclVTTmJHSTBVRFZ5SlNORS9GWlJKMnJXcWFDUmJ5OW00a1FjRUNTL3l4UUQxTithaXZFR1BuNTJzK1dhdnFXdHI1TDJYMnFQN0xQS0VJb21TOVYxdW91ZDZGT3lHa01HY0hiZk5WcHJaTDk3RGVvMVJ0R3NrYWFSSzFoenQ3MC8wNXRVM2dFTXltRjVXQXlzdGtmM09HZ0ZGcUtKek1CMHB5eWRQQVZsR0M4dzJoYnJiRTlVSGxjM1dCV2lXMnUwblJzY3l1bzcrVytWR2ZHd28xUmlPUGJ4bzBQMG1oUm9oU29PNlpvbzJRUTZvUnRPRmFLMzJqMnZhV0Z5eEhBallCeFJXa003YndjcEJpbjdiZHk3aTRxUXZTZVJUZUowSjdIOEoyWVBXdEFhVHBFVEE5RlY5blVxbVp1UW51M004bDdIR3ZKV3N3WGdJbWFnZjRTWUdRNXI2SXVXUE0xTkNjTk9DSmJRRFR2OGdUNTNWRTNRSVdHRGZ0VlVhRnNjaTBwa29LSXE5N2JlVXBZeHhHK1RjZjc1azBFUENQbi92My9YeVh1SG1ENlYwOGsyZG1aWDRhbW9UL0dyWGJnd2hBVUh5elUwbEtkbi9HcGZMUFczcHhDb29yenlSUVFKdUxUQ2dSWWRlYmhBY3RaMHUzV0sweUJETE1EMm92aVhWb2xHYlFGZ0FvM3dseUVtaWJjakpxQTl3cmJReWVRa2ptVXk1VFh1T2RxaklSV3hGSDFraS8rZmNxZ0tPaFllZFdVRFNKanFxVDYxTnhmWldsNURqUXlhOGlOMGZWVnl1cldCRmp0cGV5MGw3dHIycnhVQXgxRGlaNjIwUEtDOHRnNjFCVG1Cd0R5YWhFT2h3UDR6Y0tkVGRoVDlGQVNla2dDMEorcUlwMnpLeTZ1bGd3bHpCVzBSMVdTcmZQNFNmc0J2ZGt2Z09YVUd3SEo5MUMwd2dpRldrZW5Fd1pobFcySVB2Z3RjRGY0Y3MrSnBSSjJXQzVGQ2NyRjZVUUYyMVFEbWFhciszaktkMmlVWnZjc0Z4L2c5UDFSRHNVU3E2ZTYwZlphMHFSOGdqTmhZTm1CQTlCNUhLMG9YdU5tM1h5dTNaNE1qc1BucTFKT1pwR2czUVZWSnpYTnBSRzBaYU5BUEZJMUNmdTNNQ0Z4TVdTVGFQSS9FK3JFZ211WHNmU0pzek9HbEdIelBqR3pGU1FEdCtzbHMxNU9PR1hvZG1xcy9VSEo3ZE1CU2dKZFgyZW1MbWJSNG9KTjBHT3IzeG9zdVBvZE56bUt1eFBoV2FxNDc3MUZsSGcrbHRQU0RVL3RETTBTcHBrSEh1UG91NkZNZFFYNW40U0RQVVpaV2VIWHN6bGx6QWNrM0YwY2I1ajhHak83WmZGL3ExL01oNytBcHNvNnlJNXArVkFqUEFURjJESmNkYjV0Kzd5N1NQTk80U0pDUG5DQmcxNFRrUVhVVE5Lcnk3THhNQ1RiZUY5SFY1OThVNDJ0OGRraU1keHJncXl3UmZ5U01zdWpFZ0dOWm9yWjRUQ2V5Y0ZBKzZkNVF4WHpiOHliU3UyY01CekFXRUlPTUsvNC83a2FXeHBoNTk4eGY5MmpjK2FsQnBnbDhTaXFqS0JxZXdxd0VaRS9ucThucmh5QllSaGRJUnFrZTFOOVI1bDc3NGY5S01YZjBaam0xNEZDdkVQTmFqU0NPaDhnL2ZjbHFhZHFKY1dJb3Zya1VKN1hMQjQ2d0IzcVIreXNPK1k0M21lMjJGNDRHd2FoQnZTYWppWlBEWE93ZGl4N3MyN085RlovMzNEcng2S0ZsZUIxcWhPMUVXNThzSXc3NFB1RVd4NTFuZ2ZYeUNHQ1NIU0duNlVhWHduOGdabGNOc2xjQUdHZW5hQUpvSHg1OWtMeG5jNDdaUnVNQTRJTitVeUVjMXlUN1FPY3hxKzZOSXNmblRzLzFXTEswWUpIYVdzUzdheFBVRndYVCs2MCtwMGJDWlVJYUJBV2h5RVRjTWthQkNDMStHK3dvTHRJSXRJZmtSK2M0bmRyeEc5WUJ6SFpIQTFJWitxMmRhdDFGa1dHOFdrMXR2bTRMV09PY21XZWloS1d2MW94N1pRaHFnWTUwN21uY1JrNEo4NGd2RkViTEhoZFFFbVNYNlA1RmZjVU9JeEVDYllWNFh3dVJPVG5zMDdwdFZ4SXI3UkpQcTRrUTB3OG1OekZ4b1BTOGZlKzVabUhaamhIdkVxYk9XN3VTdG0vQmdGVFRSUXgvN3NkWEJUWWdlclpFVzRRejhLdWZLV0tmRnlUR1h1cU5pT0UwN2hJYUhNWXhvelJsR2lvZEpnVS94ZjUraHpVcGV5eE1BRkEraFZKUTU3ak5LdE5VZ1NJemduV0xPaFNLRVBic2F0YTBoUDBQYktKeXRmWU5GMHBocWx4d0owaThnb1lmR3BnNlRzeGRHR0t2WVBJMVhtTXkwYkRjQTVuTkxMeEQxc0VHbENMNDZ0SWZWajh2MkpNWkwyc0F3VklRUXprWEkxTDBsaHdyTlppeVdHNVBGWU5jVnJtN1h4aXhBWnVha1kwMUpQYjhLMmZLWnlrUnNQU05icTNDK0FIdVpJWElENXkycUpySnVkcVdqQWVYekZnRUtrZnA4Yy9uOUJ2VWxJKzBEVWxqM0FiYm5ROHpJdU9SMzRhK2Foam1QTVZTdXhIMEdMeXRjUkNodkErNkJKR05HV29WNFVtTVNqUTdZcWNlbkJKWFZUdTQ2T0ZrYlJaOTIrMEhSY1RjZSthS0VBSkkwSy9ycDFXczNvWCtpRTdKdm1ZTEZIRVRyQ2NTNGM2M3JkUXlUaHV0V3FEWGsvNFBnT05iSW1NWkRvL3ErM0JoK2RZb3czaU5PZFM5NXQ4V05IOWtXVlBtSytyR0xBVVUzZnNUR050OHgwOXM2ZURpNzQ4Mjc1RWN1ZzBKaTJXa2ZtMHdvdy9zNW4zOHd3eitvQ0tmRzBWc1ErOGp2VnNYQ2JiNll5aXhGK0UyaG9BZ005NUNoWk5FSU9mcnBrY2t1aFpTYThZTU1NMTd0aWlGVHJYQVJYMjFSb3g4aUNqSTFUaU5xaHYySEVRelpqY05jWEV3MEcvaHFmS2FsTGJxU0ZCY0NBakhocW1IUTFmclRVZkMwNExFbjNLZlRjdjRobUFuTzBLT0dMaWlqdjhNQWJISlMwK1loU1REM05KWllOc1dhTjBmTVJtZUIyQWU4NlFPc2hITFVDTldzN000eUdzUDl4MlptQmVxeGxoaWMvSk83V2liS2Y4TjhmYTN6dkZqQm9JNEZuUTl5QytLSHhCNTQzNndpNS9EcTlFbkM4M2ZwU0FBMndET0R1RUxZTDR1a1RsNGkvWUcyWXl1eU02aDB1cllTVUtGcDV4djJSRXFCWFp1ZmtIZFhGMytWejY0anZhUHdtekhoczlRZURoSWl4b21idHpQZTI2NUp2SGVWcmFTNFk5cUZVQndDbGtqNU9FbWxhek5yKzhUa1lPczFKUTJYTnZxNzg2MUt6T3Y5R1ByeGQwWEt5R1JvdTJ4K2l3NzJYcTBzUmhhY2RtaEhpbWNoQXhDTjc5Rmo3dHdmNWt4OGxKUkJKeDFZbU5vbHV0ckcrY0EvcVlPT1BwbDJVaFdiWnIzZUh3SW1qbVJHejdQeXFibkZCVUVCcE45UXptWVh3U3Q2WFhZQkx2TGJsVmZ5U3EzdnVuNmJqdkJyVUxONVMvT2N5Wk9NTlp2ZTMvMC9lZ3JLN0pVYVZmcHZHWlRqcEhOMFc0NWpmVzdoVEpCbmt1Mk5YRzhlRGxvSlBHVVdmS2dxWitpV0xQVi9YKytEcnJJSytVTDRUQ3c2c1NJNXV5cDBSY0JXWVdjQUlJREFwTHFkeUdET20wcFR3bWd0bmZnYlpZaUJ3T0lTUmNjTlRGVGVEM0t3bDNXOWRYTCt3UFNaOUdrU0FvWUJNQ1lpTlRGWVdVdFFtZVVIYXEwNzdSbkJCeU56endXTWNic0QwSnZMREt5c2FSR2IzNXRCUXpFQ2FMZG45bkR4U3MwZ3NXc1VTWDhLUUFYbGE5c1ZEb0x0QXp3VllWcDgwb3UrdTFObHc5Vk9Hc2ZvQ09Zb3c1azNHbkVtRVU0Tk11RjJVV09YK05mOTVYcUUxRmlVRTZBZTMreHBVU0FWbjJCRHAxRUdJV09XaS9QTjNhcmNsY1JZUkdZZkYrUzBiQ2c0N2tncWs3enpvM0hPL2ZNNjlEbXZ3WEZhMmlKNTNrcTFwUU5LYmlVdCtpbFV2ZXFPK1JHZ3RGM2xKK0V5S1FZMG1qKzRZRHRDWWo0empGMGwrNHFNZHgxVVVieVR3SE5SaEhSeThnd2xqNXJ1RGRKNkcvc0thMTY1Zk1ZbW1NTXhNR0xJTVRleGsvaC8rV2ZhdHJMV3Zrc1lQWVN4bytPclZMdGQzVFBwcEJHd0hFb1J6ME4rRXpNWmtDZkdmV2NRKzdlWis5ZFJLeFAza0ZkZDlxbGNaRlZHbDVFNFIvVThFZzQxMEFoSlNLVCtZSWpQWFFYN0liV2FMcmdPRVZoNzlOYmd1MWsyNEkrMWNVemFsL1F4SXVMQmd3czU0YVNJN3ltc2pkVTdxcUVjalVMMmM0aDUwWlZreDBOdGtIVURTVVltMkZjcFJZM2pjSEx6bk5QTHFvY0pQbWV3NkQ5blRnWGs4NG9ReXR5SDhFcCtHNVZ1b25hZStnVTB5ZjRzSDI2bk9hN1RhVlZKZlpjcmFsODE5MkpaOWxMVndkRjlHNVlhZUM4WVBubjFCM3V0QWZuK0M5WmY0Mnh5dVF2VFc3RTZiSTBYSGRvQ3JBWlJRTDd2aUdsYXdIMnU4T00vbXVwa3owV3pXQWw2clVrZWhwczAxZGJmVVdybnJWTHRNVTFIWWlGRWJHUDFNejhXMDBwQUxUZlhtSDZzakljRlJzaVJLM3FVRmxONGlpUUlrVktvUk5WcXVEbXpQNzl5N1d0L2llK015WWttWEpsdUg0Z3FOK2ZNR2lLdDI5WjJQVG04K0lRQnBRd2k1bk9JZXV1blE0dDJoaHN0YUwrcUduc1NEMjdGVmtMTTY2YmkvMzgreWFLOTRaMmhUUStaRWhuazFld1A0WTNrYzFJUUJVbXNZSXZvUzJ5UzZUWU42bkFJWmloL3FUb0l1ekF0OGpFVE0xY3QrM2hEWm5KU1ZUanhySnI4dFVranNaUzkzTzlFL0xYMmViTm5oeXdXMVVKdHhTYnhFNUFrQVhMQ0VYVkgzbU5KYnp4K2VmTkxYWi9YNXMxVjdpTWhlQUlVamp2YXlOT21nckt0aHpEU0xYdTlVTUhQRDlOcUNlVUpJYy9FVm5qR05QeTBrOWlxZXc5cDRwVFVhU1dHcTdaK0FtQlZhMnFkM2dwZTNrMU9PRXI5TEw3TlNkNGExemNXMC8wdmdEZ0JhLzFGdU9EK21JMmY1MFdLWWdtZ2F6L3ltNG1KTVVxNDVMMnQ5dCtQS1ZhQ0Y1UXBWeFBlV2J3elB6YS9ibzVGU0xuYkhqU0FMUDl3U1g4OGg1WmNERTRaSG5jRUE5bmRxSTdWemNNM2ExcTA5UHBORmVvQjludUlaUGV1Z25IeVVWT0M3MnBiR3pzYVI0TjRBeUhjZGxUYk5ZRzIrZWxtWUNKcW81YlltYW9wT3RDb2tPYzg3MU5va2RwcWp1ZzZDY2g2dzhEZEVjN3FjV0Z6M3ZCNkxIMDNpbEdnSHI4Z3RpazR4Mk1PZ0Z5L3ozYi85dndEdjNlZGxremR5NE1oWWdGazlZcGZTQ21YSzdFY0szTmZ0bFBYRzg1YWZNT25BUDc3UGZXdVBXRlpqM055VVFuK1UrTVVnWElKb1U3OVVWMkdQYzRiTWNxaTdKWk90QmdQbXJ5SCtJUDJCL3ZERVpvNkJCNk8rYjBtUzQxdHVWOGluYURwRmY4bjh5OVovTFpBSWtWN2tNc3pJN1AzbFhvUG5wVFRmK0NVaUxMNld5d1N1TmN6VUxYdlZIV0NYb2J4SU9wdEtXTkgxZXlCZ0hNd2VCTTlhWnl3RGp5aHp0YWJuZlIreHgvSExuVkd4cnhTSVdQYTFjZ1RpWHFPZDhyOUNkUnJFaGdrKytxZVlnVitkQzVveDdkaXBKVFNKQXlBSWsrUXloMVo1QURuSklubDY0QjREVUtKSFVHL2loODNPTFkvbk8yVTI1YUhXZzBiMCtOTDREb0VKMjRNd0o1Q0JQd2g4bEQvUXVQelA0TG1QdEJwRWVJenFoZWpUdDFBamZLRmpvQ1JkbWhpQzNINCtBbE1RMkhkUVZyVEJqREJGcmQvWFd2czZHL2J3V1B6aWVOeGpOWktwS1ZkZUpKQUVWL25hNHBYNXlEK0dzRHp3RG1QK1VmWlRDb0tkZlJhN0R3V25FNDdSbXdiejdmUFl6aGZYU05vTndRd0RVN0NrRDZiNjh2OHJpYUE3cEdSUWYwTFFsOTlpRWVKUzRENk5Eb1d4QUJQQ3lrdEtNMlozeW1od3NWYURlWWt2d1pMeHNMeXdBQkYvKzJuK3Z0VnFRYXVuNEl1MUtHSGVmR2xnT1BSRlZ1bS80QVFzL2FwT0FnMFZMZFhacDJydzR4SE1teDlNeXZTWEhtMURRWXg4WWcrRnVQOE1lNFloTTR5SzlicGFUTWZwV3MzNjBVdHVscHhIT2dTL3grR3RIWkdnTWJqSXQ5Z0tPWnNkZjk2Y2s2N3VWYjVleWZHamd2SU9VdDgwanNhSFdERnJFQXpsQXdXa2NsYWNkRklLZUxHR1JGdUlKV1lxNGFwYWQvb2RFb1k4TVpRSEdycitLT3o2K01hMUI5b3lWNW0zaDNua3BvVDI0UkM3ZUlVSHBITzBpR2h1bzFPYzhNcUloYkVEOEFJbVNoL3p6NjFPMHU3U1ZXbmxXbXdnaEJ4N2J2eVBRZGl4L2txWDBlTGdvZnorTnJCbVZoVk0yZFpLN2VUQWx1T0xxZWt2cU5UZ0VMUi9wTnJNL3hhb2xMaWZ3MGFQRkRZMDBaZThyaDVYaldmTFhGZGFvNkdEbEoybjVsRmxpb3JrQUo4U0cvM1FubCt6Y0JlOTBDWnFlMUFIMVIxNDIxbEt4YVNHZW8yTUo4WDgrZWlxRWsxNDUwemk5UnlnWlAxSi9rV3NGZGtNRS9FTzBUV2JyODlSZ3BrbVlzRDd0ZWV5NXczSjlTeDZtOVdmdWN3V1Q1M0w0NVJUWnpQS3QrOS9SZ0FLM1dLeHZhV1p5RXU5M1g0ZXF1aUtCYm11dGY3KzQydVRYdGE4dUdMN1FvbVV4WXFRMDVxcTg1YnY1S2xJbS9WNTB4SzI0THlFaEptR2o0M2VTNWdSb1lrQWZFbXp3eDkvMGpUT0ZCT3VvZHJxUnNMT1U3TURPcER6Z29CdHU2QzRVZ2tYM2pHMzIvS3RGdkpka091RlNqZGdhSVNYVXNNUU8zbnZ3ODhwdzUyMTh3dUFqWThOdE44MmxYUTF1Qjh3YWtQZlhnN2VJdDJVSjhmK2JZOUY2a2FxZmVUL2Y5YWprTDZTU1dDWFAvQjFKNUpNQkQzNDJNOFhjTG1SeXloNHU4dGppZVJidC9QSkhVMEZqSngwbzJySnBOKzJGdWJERGFrL01RV2w3MTVWRHNuc0txanNTTStob0VIZHJlR0ExK2hCZ1lrMmsyUFZYRzhwSFVDejQzcHhaR3VjaTMzaU9HMng4NzFwQ252SGI3TGpwbUZRQkN2V1h5Y0xaREJJMTB5S2s2b09iL2pqUXkwT3ptM3RWVDlwNGJFc3VEV3JCN2VQQkhYUjVJa0VtenJrRjR6RlhuTENXOXVDMW85ZmxsczJ6QlJsTDNwMmlzNDU5Nk5YdjdKdWtxN3o3WDBleTdOSjlpRGtXaXNSWFpZUUtDOG15SmtzZFU0N01EVE5MT0I4VE9EMHlvZzR5eFFkMkN1clhsVUE2ajRQREtIZ29wZVgyWHppTXp5aVQxT1Nib2lKWmZQUFA0RlhxOTg1TXFyZElOajVQZzY4TmlWRENVcmpzRitBQ29yNk5rNTRGYzcxcDEvL0FOT3F5R1Y2cVlGS0I4Nk1BbE9ITk9zUnRMZGt2dll5aE5XZGQrcGY2ejVReWVESDZXR2Y2d3Jka2dNaWlLRG54cjFFRDM3ajdqL0RuNlZIaUxVTythY3psSUp1MWpYaU05QnY2Q0IzenZQUFdqbGtVZDlBNnplUXBlNVlHMUh5R252WnE4Sy9UWGcwN1RNOUhxbEU0TjR6emRxdHdhZHl3dlJMeGlua2ZseEJkZFBvQjlDazhwdENKN3pzUjhhZEliR3JJWjZpM1ZOUklIaG81cm1maGdXVVMrVzg5S2pPNEROWHZNM2FxTU1nU3JxOHBKUDByUEgvSk85SDQyMEtCZ3lBMGNkSWJkTU5yWWt2bTZiVnJJUzY4d1AxTGN6NWx2U3A5djhHUVc3eExOQnh4eVovRzZBRVVrdVc3VDFuZG1kMXB0V2RQejZteTdIVlZIR0YvMlZOcVpTbWRUcXpyTkRxMkVIYnUwZ2VEdytJM0xzdkFHeWJxUzBkY0pzZENnMit4TXk1UGtreGJCL01Zd3Vldk9sUFRNOFQ0RGpQWm5DZmk0SEdCbTNiSDJjWUhRZHR2RzBmNWpXMERmREcrWkVJZDdVRC9vTCs1eUowKytib3hES2JMN1RNbm9la0crV0FkS0lWWUxrQjNaK3JUeUJmYnBscjJycnBxTW1kM0RvdkpMeGJMSnEvL1BCZERMeDZaOFVDSG44S1RLWTY2dkRvenlvd3JzZldEZWh3SE1qOTFmSmdJSGJYMFhKNHgwa2QvV0pjd2djQXdCZ29GMjRYbzJBc01NL0U3VEhQVTh3TU1BaWNwQVJvamd3WGxiU2M2UzAxVlVCUjU4L2NQQmVSUXFoUGhqczFkMi9MU0RqT1ltTm9PVEMybWJONk9YTWNxVmRXdUFiTWs5enVveVl1QmNkM3pmZFcwbzNtYWNUTnJoT0JSR3ErRjJPenB0L1lMWERCaUl1OTVzVHhOK3p3UVl4YmtIVk1kdDhuekh2OTViMW4vSHdRTEVMd2psWU5NSkF0WkQ0Q0JKYmpsMFpvTk5nZW5LUmZ3Y1dxM3hvRUxUMGVSYUpJWTYzdW9CZFE5SW8zUER0ODl3ekdvNVUvYjlOQy9ya1BpSFdaMysxRXVmb2tybWRSU2xXTHpJaVEwV2cwbktGcTZEb1VaSEI1dG9NLytPcldvODFqMzdnczk3V0l4WGdzQkV4cXVFZ0ZkMk5MWEJIZ1h0eDExT1ZWejVGRGFpVExnMkxtVDcvS2ZWVHdVNVV5S0lKc09vaHl4U0ZnSXVXMkxVR0xudElJQmdoWmo1WWRjckluS201SFVsbDBUbFpKbTVNZjBrd0hUR3Fyenpub1FMeVV6bnpGTk1GREdHQnpNbmxaWVdmb1FsRjhRcmMrWXFYSlhQMjJaNEgxYWExL2ErVlpMSUVZWEdDaVlYTit4eUFmWHFJZzZBREx1aUE2Z2FncFVMOWdQdEtLVnBqb2E1cmIvY3RvTUVUb3BIME5maHU5L29zbHZPUkkybCtmWFBNSUVwenFDajhieUhFN0VKYTBaYlNwekdSSVEraXJidzUyMTgwbnRZWnFpOS9ZcVBMMisyU0VrcFhqRitnaHZNVXlCOVV4d1p2dzRWcDJWTWhiUFA5eWRESFZ5Q0VsWjdTNTJPSDlxN0lWYVBYZkprUk1aQmxjT3N5NlNVUDg5TVBNTlRJVlFZN0ROM01KYmN4OUV1TER2TEZqZTdheHZsL1lMc3g3dWRlcXNYTk1HWFcveTNXc1doTzR0TWNCL2Y4dThRT3VUcXIrVEZxY2FoYXU2NnUzR1JDak5na3EyNUVQQ3ByZWxjaWFtQUV1Ulg5MFNuc0dUUCtGN0MyUG5YWHZrcTdxTG1ycmZpay94MERKL3hxenVZUktxbWpTZm5TRk9GSDJrU1BNQ3ZZOERyeXlYTW1pcnMxMy91V0I1WHhxYXh6dHV3eURjMy9aTitKRzRYNFR2b2tla1lZaVY5NGs5K3NYWUtHWFBjZ05jVEp1Y3R2WE9Eam45dUdNOVZKa0hNSUxLeEFqbzAxZ1RUbXNEWmxlWmpMb1h2SjIxTHEzbGx3ZWJUbWxaWjh5YUNxNG1RY3RUaVFwazRJcmxaSXBvQ3FmdWF2TkZ0dWN0TWNZcGlybUpicHlrOWZOdWdkK2RHT2lNVnRQVHpLM0FCKzQ5RUNDcDg0M2ZkNkxIei8wOUp4cVlJZHlmVVlXMENPZGF5M2ZaKzVxMVpabzIxQXp2N1AvTDdyTHljZGpvMW0wd3plbkpNN21sYUp0NUJldFRVb3Jya3E4U242aFhwa1c0YVEvWjkycWMxTG5MRE02RHB2eVk5aVJudWNMcDhZZUJmWTNDMzFmb2lIbGRkRzVDL093c3dKMU9HcWxxbWFpWFUxclVNdU5NcTliVS91dFIxSXVyTlVQWExUdHQzWXU0VXFxb1NOQXZGY3MxQUdjYlMraUtpOHo1UTYyVk9QdUs2L1VPVWlvK2tlbEowcFUwbVczSm4rWWZWaEJTQ0x2S2RtMjZqZC80eGk3SWdMTXM2b0NaRmJWWGxwTzBvdDYxK3lrWEhZeHpsVnlxYWFlRnlDVzlNdXZJY2oyOFFjRm1GbG9yb0drWHBSQTVab1oxM01PbUdKNktIT3NNUWduT1BkZGc2c29JNnlJekZ0eXlQS3NON2drOGlKQmVWZ0hkcXd2ZWVzWlh0a05FSkN3Rk5vcThSQy9kRFJpM0hqaEdubEJtSjdKMkw5bmYxTEp2eHBSWXRJdHZSREFQd2ovV0R5eGdKT2o4aWxweTVYZ0NpRHhqWUFjYlEyYkphckdTVldjUDFhbmE5c3F1dWZtYzhaTGZMZ08rbWorKytYclJKaytscU5xS1FmYThuMzQvVEpEZFd3ck1iMExFN084c1BYZTB1WDYvMkc5VjMrY1VBTi9aK0hnUjJjckVxVnh6Z3Y0dWY5ZTF5T3dLTW12azdKUzBCUmNjdHpmQVp3Z2Ivek9JbHl4akZHME5DK29lMG9YWnN3dWkyRVoxVXdnQ3VHK1dYVFdHZUNYdVJIdVVoRERYRE1Falp2RWJRdHREU0NwS1k1TzQ5NDYvYXRlc0xGS1pIenh2ODZ2dHdIaURnZTBHZ1pLRHNORmtrd2pITnRBQlBGRzN6bm55UlduMnlrUjkvNGs2NWxORWR4SFYxT1NRQXkrV2FyL0NsZXQ0Y0FEc0FGTHMvOEJxTWtpRmM1ZGhJcThFUzd2aVA4bEZGVFNVcHhHMzhTZXV1dEFmVk54R3FDTEVHRzNjOHdub1JCdFRybGUzV3hiUW1LSnljMitGY3l6SzFjbC9PanhCcndqU0o2YS80RUF2cHZCYnVsQ0xTalVETUJNaU1haEZXWmw0OVl4b25OSThrcWpxTWJiN1VtSEcwRDJsQjd5TGVlWmZZUVpSMFNXSXlUeldkazdRNEloaU1lN1VLazd6QWN6cTcyOEx6OGhyc2VhS25sVmxvanlxK3R2cHQ5UmwwMzcyU1hUYko0RWpCWXRWOUJDa2NGRVRqeHNORE5zQzNGcHFra1RQVEttNmtKay9zOFBJOG9wQmRZRlcwNUpFOE9MNEthaEFtR25hMGQyNkNwdENCeFFBdm8vVE9HUE4zbEdGMjZGOXBHVzlidEtsZTZ1S0hJRVFLNG5LYk94ZWRkcUk2RVRBbmJEUTl0K1RPZ1RJQ0Q0UGZDMUpwRnppSVBQM0Nta3BnK2xUWTlURkdXbld0Zm1UcnVYTDFBamdVN3dvQ09pMHVKRjc2blNmQjVEb0lLMnNJVkF5cG14d3dsSkswWTZQdkRkYUlaU29LdWZWOTgydGk0NnEzZkFnMkZZZXRtN2NWRW9ROXJtMmpHUE03cGVJRUlNaVZKeXlWUFpmK1RWbjRDa3lBNUVDZE1RRG5vay9OSGY0dGZCMzZnd0ZOMGYxRXAyYmNNYWplbUN6SzlvN254dWdTZGJEMWtKVFhodWYzNUJHZW1pWFg0WjlxblJscHA0K3JOUzFJQ1lzZlpaRWpXODg4aWF6aWVjSGFpcEw4T0taazJVbWI0djgwU1hyQkZWNjY2REgya2NEb1l4ZWZKZE1oVXp1MTdXWUZmZ2swRllaWi9jSkxCOS93bTRjazhSVExhS09ReUNsMWpsOXNmOUpPUzNTQ1l5VytOYUZSZXFVMzJQaFNvRXpRZmpPcmYyTURJb2RLcDhwM1dFeW1UQVB1Mnd6YU05Rk5zcjROYUJmU3pBcDY3RWNjSU4vdnh2RnhoakVGUkJkbUNkaldKM2xQNjluOUlJRVhoVStHNjR1bFlZUlEyL0lDUFAzb1RQdERsRy91SFRKZUxmcU5XTzRFVWpGQmhna3p1SVFnM2JKanROakZ6SGF6bUQ2Sk42Q2ZLWitubjRIMStRRVhIeDllQ2F6anM4ZWFndEtPRnpYejBEbGZid3p5NWJMNjNMTjRQZjRCUE45ZjRVWXJ2cUJPWXMzbVNrVklPejlFbk9uSnFnT1cvQUdwS2ZWejY1WHphL210TUFHTUt6b01PbXZPcktCemNxelJSS3VOcGFnbE1IQ216bTdZbFo3RWlOWXlFT1RMYTkrUi9GWldDeUhYQ1o1U012V0JJcHhkTHErS0x5dEV4elo5OE16NTBpSjVQZHRVaUZIUFIrQmZjYTlEN2czZ1lXQW9ZaE11VnRQK0grTFZqT0hzL3dWVkhTbjR0SVNyeW9hU0J6MnBDcUN6MU11S0R3R1dSTFVnUEtldUtOeXV4Z09zMTY0TGpZYUxnRWlCY3lPL0wzV1ZQeElGSlNXeFlyMnBRTDVOeFlTVi9TZytvVTFrUU5lMzBNMlFLZE8wMldvTlYvT1F4ZDRwVlMwTWdLZTkreXNROTVueDdobkVGV2x2b3dYcFZTTzRsL1ZjTXhHSjI4MDU5aUtKdW96YXJEYU1EUFhnTnZoMzh0cjhoY2c2dEVia0FHUDdDK0crbnI5YlJKNS85ajRrRjJJYjFJdGhQWEZra21vT21zb2w5SGFON3I1WTV3eUJxZXlseUpIcVVZK1UwL0JSa3pMMmdpNUxka3pjTW1waGJoVmZ2YjdlTmNnS3ZqcW5KbjBId3UreFFiVHNIUWxPNFpOclhKZUtHRTM0MTdNdGptb25QR1BlL3JNTVh6RW9HRE0rSVJGODArY2Robm8yY0dMdXdLUUJSTk95VXU3MW1sbU5Jd3M2ZHdUTDZ2eDlvd2pKZmFGcEVhL3p5aSsxNFNhU2JVUXRnOUdIYXJRN0NabU91VjFwNklraU8yYUM5VVUzMVpMdkRxSE5DVjI3UkgyYVNURVlSZ3pUclE2WkVla0plaDk2NkVXR01IUWczcTlEbjQvT2JjUDJ0Q28yU01HTmJqcy9MdGhSNEpJTXhzTjJkNmxaRVpkUTlIdFJkcU9EWFp5SE03a3RXd0hUZHNVR2w2dGpNK1RNVmJMVlVoYnUrbFhsZTVHUTQvakN2WWxRN0hYNGx2bGZ1RVEwMDdIVjhkZ09KWU9CLzhjUkoxc2YxbSt3RFdqZTdFZXVCWlh5aDQvcE1KaVQxVWNQMHQySXBob1dpVjc5SnNCaWFkejNna2ZkVDFLR1BwNktRUTZJU2NzelRMTlJHdk9KWFQ5S1lIOStPNVUyODZSWVF5Y2FhTFZhRXhjbzJEWTRRTkJKbWJDa1c1djk0UFRSc3ZpVW9yd1Y3eTFtQjd3WG5qVGNTSVNSV3VETUQ4WU81dlNzUzJNK1BkRnVOY3FlZ0FpMDg1SkVoazFOSjIyQlRJVG41M3N5bUt6cFE3T2F0bVA4TTNDNDViblFMcVBMb0pvRnprTU8vNjBNRnR4c2t3WlN6dzlMRkFQbHJmT0RPeGJJR2N6aE1CRzVLd2tONTM0dDlranlTa3J6d0FLN2t5Tm16Z2VhMHh4ZlFQenVzNUswVGRoc291cTVCeUxJZHJKK2dnUDRub3Q2dGV3L0tDNmFlRmJuM1JtQ1h1dXpHRlY2QWVuOFBLZkp2Yzd5S2wrVU9UWGVpajZmM0VsMVpGNVd5M2dpSkt2UXhoaGVoUWlUREZNWjNtYnExb1Uzd1EvVUMwV1dzcXMvOTdkZ3VBZ0lDQWdJQ0E0VDc2UGdDbEpONFJBNHBxN1d3Y0pxcTR1OXF1eG9jd1dxazdsSVk4VG10UGM2MlEwZjFIcDE0Uit0QVc4QXdGRjdjZTM5ZWxsaVNSV2wydlVtaEZmRnEzMFZkV3B1czVaTXBUY25wTmNya0pwODNrNEY4alV2akdaZXlRQjJ6Z3pPWDZ0WEtWdEFIKzdqbTB6Ulg0UVN5ZGRLNHFjWUg5M3pyK0hpejgvTHQyVHZDUW55N2VhRlJmUnh1QnYzZVBFaUo3S0cyYnJDaDNiMUdObVFtcXJIdXB6cmh4Kzltdk04dXZQS0JyR2luaVIyQUJXKzU1bVYyQ0xYdkwrZU9uTXJRL2wwN2F5MkVLY3AzSldSbUJJWnZWbGVxWm5yVzZCRUJoazZwbHl4SFUzQ2Y3VXQ0NVREMTl1Sk9NVjc4N0Q1bkV5TjZ5OGNxRGN0dHVObnNGbEFhUitBK2ZSSytoTUpUL1dEclBtTHdzNlpud0JLNmdBenBnME9xMVZJVGNlVkJick45dnRUWDIvWWlmOE9zbSszN1JINjdWZitIcUVkOXYySS83L3R1UCtIYjVmYjBuMzJkZk1mT2c1L2g3c1g4UHRaTiszcksvaDlsamZaOWp4KzMwbzkrMzdNcjluMmhHL1oyNC90NkdmMmRaZjdDdmgvWjY5bjdmclFkK3JxSC9OK3RTL1o5ZzMrcjBVZStyNnVqOW4xM1cvVjEvWDFiMVgwK212OUo4NTFWQ2RXYmVjc1Y2RThyaUE3ZGVBbzZlcXFNTnozVDRIRjJ6SktuRXk5RmxJN1RCTkt1SXZlYVV1T2E5TDVaLzZNVEc5QS9sVlFXeHI2VXZWYkljekhISXNMei9SREZBbnVva3BpUjE0aENDK0t4M2hEWTRRdXM0bVVuNVRzU2xSRVdGNVo5aTFTejcwdThnbC9XYXBaU0gzc3dRajFsS1JUTjRkRCtXUEZWd1I4c0xucGw3bTBQaUgzNUViVTh6cytDVzd6TnI0ZUd3U25mNUtpVTdqUmt4anZkUmFyc3h3bU9pQzc1N01nMzVNTXM5aUhQNmZRUkptNFV3Q01YWEtIUGI2VHJIcUVBM2w3RG1LUHZLUmRROHM1N210VVorZ09YT28vUncvRFNkS0tsdFFJK3BxS0poNC9BdktzWHJveXVuRHAyd0RmRDB0M0tySGVza05wZEg0ak93UnRMYnBTbU1ESTIwZDB2MXRxc3EvbEdNRTRaRE5xcUcxY1pIVTU4dHBNOTZ0bkxOMWtTeFJxQmVJYm85WGlWa1c1N2R0Y2haRHplZzgyYi9XbGZZajI2S1lmdVg0dXFBckVDb1Q4Y1kvZ1kzQzNuT1E2YVUwTVpiZkVhb2V6c2NRWjlSajlVZ0REVHluOEJiOHdOL1hqcG9iaDVoOFBLRmdEQmFSZlJRZXBHMkFsYzJjNTNtaGJHNE9USDV3SkEwVDZZeEl2V3JONXlxaTliZXduTDRWdjRKYmpSRGFNck5FMzZIN3J0N0VUOFkvU1IvdEJRam1Td0lEcHRiaXV5V0I5ZHVTVTFiREVDOHRycUJ1ZWVQTDEzZ29kbEdHdmlYNmZQWlZXRzlaZjhpNVdKTFdBWHIwZHBwNkJMVDBBQ29JdDhPWUVJMGROWTg3YUEveklDaWFTVVlTMmozM3pDRmhtaTh5TkI2eXgrZU5TVHMvMW9HVU1WaHNsRUlCSytQV0U1dmxjd1d4bzJNMERWMDZ0NEdVcEhTaFF6UHhHanVpZGkxYW5nQUpUSVJnVVpsODlacUxzd2JxRjE1SjhtM2dVZW5OR00xNGNxMGd5eFQzV29PU3dYMDFQOVdXZys3cnhwNStCN1dKcG9mdWFKaXpoNUNmUGhzU1I3UTlzRHlJSDliZmxqemp4L3pTa0g5a2YzOGtvcTBsTmNGdkdpZzBFckFNNkY2VzYyZzg0RklScTJhVndtaFFzNlc0cEYyL21DeDBTZ2EzUzVLc2VXa1FTNjNxTFhYWkhyak9CRXBpWVFBeGtuYWV6a2hSeW5FMU0zcEtDUzVDWk5YblQzVnlZMWxZN3Z4aHpEcXRCSTFBVVNhVnNUa25kNU84VndyNmtzMERsdmJwNDE2YXlUVzlzU09TbXBSOE0xREo3QjJuZ2hlZWJWb2RodlN2QVdvM1Ruc1VwejNueEQvUTNwU1BXU0xMd1Z3MUt6czNVM0hJMkhsbENyajUvMWc5R0pJV1lkUWZCaUdlZ1pCVEZFc3FISy9NSjBGbzduOVJna0tXcmZXcW81VXA2UzdCTFVHc0E1WS9SZEdVRGJWT2tZRW5GZGJuL1ZTSnpJa3g1WHpKZkUxdTVyWmFWc3FiZ2FJYzNaVEg2OGVHdnpidmc2ZDdhbGdreWJiQVdzQ0ttTDc1UU4wS3NBK29ZTy9wMEpFbThxVFBVNWdZQ0xSZmhrcGlHaEtUUW1TdGExQm4vS29sNmpYb25wcUsvTmZzcXdlRFJEVmdFM2FlOFA0YkZ1TkJTWU9UUHBOdkxhUnpQMjNob2RPVEowZkhubDV3bVd6RXdzYk53SGc5UGcxZXdXM0FydDJEb3dZKzB2cThjSzlWR0NHcjZ2ajJlTXp1RHNWRTlyTmR1dEMrQUxrSzhLNks4cFN0MXVjazVUc3NjZFRzTW9YMEdtSjZIc2xHUUozV1NLZlJwNVFRV1MzT3BYNXNhSzZaR2pmRVkvczd2bENHSWgxK2Uzd01XRXluNUticGlVYXBOMi9hR1U2WEJOVmVoeFBUcytqRUhaL01QOFZqZTlFdldSNXhPNlBxR2ZmZU0rMVE4cE9KclNBTkNpbWw2VVFacHRRZFQ3ZFN0a1JUY0pZU2FwMWZkNFg5OGdZd0V1ekZ4WUlVcjhoSkJtTjR4d0xkeDJJaFJjbU9uTDg4RDQ3cUFkRzlsSTRIN1J0Skx4eElDSUgrVnk2blRyYTExL1dxSHJMWXVQRVdLZ0JiWjMyZkpzYVhQVDRreTF6d3ordkNCTy8ySUp4SkZ6YTB6ZnRtRzNQcnQ1Vm5IRXNINXVRWjJmWERNV09GdjkvVk5ZR25sYVpDM04wQXEyZi8zNDJFdzhSUEp6UHMzZVRoRGpneUVvMURpd0JXdENBMEFQRDZiRjlhS2xZZkZmcVNvUURQVkNqYjRWeno3ZHdyWVNObjBYbVBvSjZ1em80SHNwY0RFSVlwN245OU45RVpnVmtjR0docXNQOGJsTEdaR25pL1MzSVlUVUNrK1NQZmd4eS9IQ1lPalovR1RJZExLclJUVmNXZUxMc2FEdlB6dDZiU0tzQmZzaEZlSXlKalVVRzRObVAySDNUSFRHejk2aHBxaVlrZDIxdWFLZGZ5SGt3cFRRTGxxYUZFVFhRc1RaYnZYeHZSL1dqelk5b0t1S1NyQUd2YllCNEtPaHhqM1YzSkh0TjRJencxWDFnOEsrbms1bXpiUTRrOG83bDZtbkE1R0pheEFYcnVndTQ1VFF4T2lzRkU0bWFUUloyb09oR3Z3bjg2SGt3NENIditxZCtWc0NnRE43MEJ6d1Q2TXhSazZOaGtoS0xvYzNESVE2QUxURmFVRXNzL3pZamVZL2VnYmhzd01GSFB2V1ZsaFNpZVBtb2kySm8xWXJzL3lsYjNMNEdyVnliTWlMTmptZVZjemFUamVMR2kyNFV6cSs1SFV0SFBZM2RvYmFWbGpxT204elAyaitkQ3h2NFdNanV1TnZzbjNvY0lUV3VKUnNJTXdtYUUvY2dva2cxMTlMS3c5cVpBZDlod29IeUk4N3FhanIxRGI2ZnhFTWYwVWtwK2VDUkllWWswcjBHVTdQcW1rcldNSVk5N1VCRDlBSG0wbWNuZEFJejQvY3V6NFBCK3lmTXlEaWtiaS9mZ3NuYjAzTy9oclorMmRySHkrK2FyV1hUT1dWcDRvanY1ZkFGREh2Q2JaVFVETFZMLzBVZUVPcTZ3UUlhZVdNdnVrVXlXM0YyK3dHd1lPa2Y5NkFjRnNOOUovZG9TMnc1Y1NHODQ4S0JBMDcwbDJMcDJpSVZZeFkzN1ZHcHdhU2x3NnpmUlFKRnpYcGhoWkJ3OE9PZnJXQnRDajQ1VXdSSjNTTUoySWEvTldiQzU5TXFyM0pTam5jdytsUS9sN3g4a1R5Skx4dkQxU1k2RU9HMjFsVXNVUWlraVR4V3AxamRsS0l6SS9ZZElFUlQvcTlJamxuUU1uUXNpZFNtS0QzYWRDaFdUM21UeWFhQ1dyZjJmUmRvSkZuY3JnZHU5UnhMbkphTWVNcDJZVkVzWGZkbTlQQkRzaDdKT1RSOVdsOEFKemNQeSs0RnlZczI2VjdSWnkwRFYzNHFlTUhab1J4dktuT1VlMkNLUEs1enFFd0lzZVltS1FVVjJaRkVrT3dPN1hFT1FyVDZXaU5VMVU5U1JYM3M0a0drUGExaTRVSEpMT3BqYU1xZGVKYnhIZm9aY3gwSzlTL0NMUDZiV1hOYlQ3VEZ5MC96UzV0S0xpRlk0YTFOVHhNQXc0dnFRM0lWWVQzRkJGaU16Qi9UcVVKNElpVWFOQmtCb3JDd1ZQRWt6Zktyd0pvc2lwYnpweXo3RVJ3dXRtYXJWTGpoSkM3Z3AySW9uTGdSdHNqbFFZZUNLV3dqazBhNlBJRGUzVTZxQTZNV1RRZ2kxV3RscEIyaWJ5UmExRlYySE44TkhPTW9LMk5SQ0N4cGdpQncyUk5mNTF6YWhnaFk5UDlQT3d3SksyVGFwSU9FS1gySWVNck1DRFIwZW94M2o1S0thekVyMTFRNFBMMUpMYkNNektMOVIzKzZiMU56L3hqekREdTBTVENiUVpBTDE5NjZvb29Pd2lXeVR3bUtjNmpoRGYzVjJJN3ZVRnFvbTl4ZExQcmpNWGRrVW1zdDY4WDRuNVFIbmxmS1dwRFFlVlF6eFJvVFFxUWpIdTd1WG1xYkNmRXRzc0FvSVBjTXdzMmxMckk4ZUF1dUUyTWh4ZU1mUXlTazQ2dFJPTnUwM2Z1VTJjVTJTbTZ2NDBPUnhtanZGbG5WaDV0blBwV01vcDd4UWNWWGNWZjJ2Ynd4ZWovWTlZbytmbHNtZm5BWm1CTjk4UTQ3cDdpTmJnc3dhQ2FhQzBYYXdRSE5DZVpQUVFjTWZHdlkxRlJVaXh6TmliTExQU2Y1ZmZsWllNaGZrWW53UGIxbTVEenBEeVVtclF3bEpvZzR1aTBjdk45dU1JdzNNQVVSei9DVWUwc3QvMjZ3TlhRaVJaNEloSUVGd3I0ZkZKamFqa0RvQXJLd3c5NG1RN3FnL3lpbHFQQWVTeERnd3hhYnZOK2pqYUU4S0VJSFlTMGQ1dkI3VEg5OFpIK1N1L05mV3BGYjFtTENIZHdPdlhBQ29FV2poK0hodTVPd1E4Vi8zRDF5cnZLc2lqMG5QTnZvSGlRYTFNK1c4NzdBTTRBRnAyL2lMVXpHWjlVMmk2MUJWYXhCK2dhekhIeXpnb0xnall4M0lWTk8rNVhpM2owVGFyS0NvVTVENGE1UDdOWVBKZm9Udm4xQ3ppemZMdGNuOFJneGd6ZHErYS9QWVlQT3lCZjY0RjlNeG9nSFlEdUxJT2xSa2lZTTFSdityN0ZLekxrZGtTeURHbDRRd2ZmMkh3a08zbkh3ejNnOEhVQ3FqcVVqdkg4eTg0MisxNExKZW0xSmhhVVl3M0I1R2Q2d0NnNWZJbTl0VCtzMGZ6WmJYeGM2ajZSUUx6TW13RXJiNUtKb0hWczJodjNMNDREWmxMeVhLQlhXRmZ0M3paZUVKcGdMVmxTMzJ6dnYvcnFJNE1NMEhNMkNFTnV6SmZuSE9nK0xpWFJmQlM3MkYrUVYxREFFTkRaSFpXQmk4RndUY0JXSDN0MkdVaHY1NTVlcHlEZm4rWmxDK2dVbTB1dWQ0dzdmekZ5T3dKOEdKNno0RTdtSGNVNlhYZlJibkJTRjVmSGJUeGxnWnFhQk85Y0ZleDBndmNsNE9lb21ETldGNG5GaWZZbzJJUzBBaHpONmhNWWVmOXRMUzRhRUFNSmFVRFl4ZjRUdlZIc2s4V2ZhRGZwOW81blJ1OTl6WFkyalZ5UytPS1h4cUNEVVVuZDR1cVNCMTZqYXY2elUzTWJ1NUpna1czNFRLMHFhYXk1V1d5QWk1aU83WHVva0F3T1prV3g2WjJqd0xUeXZmVCtibnRiSnVqV3RvZGk4S1VVcTlNdys4MUN6SEIzMldqYks1UG5PK3JOVTNrNWgzSzZEVlJSeDFPWmRNVDhwOWZHSUl1MDU3eHUrT0cvaDY1RlBRa1hSTnBrbGRUaUVXMjhLSEJ6UitEeGlUYjczY0FYcEluQUZwZU1qaVZQam0xRW5yQzlnQm9OdWtzWmlBRWQwdGxTeDZHOHR2ZTNieDFUZFVRQlo5VXlzbVZIak14bkl0UlJkNy84S2hrbnpoWUNpU3pxZ0FtR204MGdUaXl4RVE3OHpmcUdxYTFnWjIrNkF1MFJqM200SWhsVlZ6MlU0TytjaTd4M2Z4NmZ5TjkrK0VtcFdZQTYxOUJ3NitJWC9aaVRYL0xYWDg1NVhwME5lTWVYdGYzdlJYVlMwd0FHUkt2M3pGWnZRa0wrak4rc2IyQ2FiZHlDeGI2TGIzUVZ3ZjZER3UwUkxUNSt4bkhOMzFpVjMyZUFEa1A0V3RtY1dDdWVhWW9Fc3BLS055MkxMN3E1R3ZXcGtFK2JicGxHQUJielp2bVdzNCtqNWxVWFF2SGVTZEFZWHZUeUI3NkhuTnFxZU53cGVGZW04NUxuYUFkalJUK1NINFhiYmRjL0ZnbVpVOTlVQUgrUzJtclREUU42cnI2WEZXN3g4bGdFU1pkWWt3dFd1WUhUQ1JWSGFSNFZpL3dQUUVYbkd5YnVhMng3S3Y5VGs5TG9PZTI3NWlUWHkyT2NpV3dzSXZQTS8zZkpFVVcvT0ZKU2orcG1saUxnQ0FURUJONEtESjVOTjN1UW50YzJuYlRIMXN4RUFkcTh1aW94b01yTDF3ZFdVdWF0L0FwS0JXdmR1dnJ6THV4YzRVZGhXbmhMZGdLSmpnWW5LbWs2T3lKWGVmNGwyaDFyektMSHk2cDJqY1c4dDhWWE8zR2RtU2YwUGdKbWVsa1NDQ1UxbzBtUlpSVm5zWWVZODRCb29wZnhiaEozaTB3Y0pRS0dlTEtVTzVhbjhSVEZRS3dESlVoL1p5aDlCRDQ2Y0M4dnZpQ2FIWmVuelpPTUxDY3pxelhOMW5ITGpUbUtSYzR2aUtYeWp4UGhpWGFyeTNMakk4MWwwUTRSTTQ3TVcrU3pvYVBuZldJKzY1aWsyUUlhNmRLbWFETUlkSVdHaU02TlllbktlYU5NMXNhbzZhYTQyK2JKRmcyeWFEL3owd1puL2JSczVUdWlvUWJBS25LdlVmUXB4cERCRGk5TkhrS3dQQk1WMHVmZkVralhjWXV3KzBFOWJ5dGhGNzFsOURrYnloOW1aOFhLclN3ckRyYlR6Ylltbk1ZeEZrQWxmK2Nva2hGZmhtc3JuSGx5c3VueHJxMlNOU01ad1B1UkVrVjYyWFhvNEF0RnVMVE5BTEphcnJ1SVNDdC9nMEk0ekNvemxtTjBIMEJDMDAySE5WRFh1ZStlMFoyeUJJdTdleUVtc2UyMVZiN3JkODJENkx3WlFGdVBDemE2Z3VSQ0NxRWp1cVVoK09xNjlGUHNmQXRCeDM1S1A4V2FnRzUrd0twbGtQTzB2S0MrdGZuOHlpdVlXVHEycllVUlZOQ1RhbDRtMFJQbkJMUnFncy84Z3kwZXlVUHR0V05NUkQ5Z2lTUmYvUkU5TUthcm14UmREZUdnNWcyTFdBQ29nVnFQZExyV3NUQ3NjVGQ3YnhCU24xeHBPZnVDQnl5QnRjTzhRUWEwTmcwU210QWh1Tk85cHpkRXBKb0pJWmxjWTc3UEtjL203WURONzVrNTl1aXhGbmtDa21wSEpDaUc3NnVwU0ZPaVB6WmpReE9LTWwxTUIxTzN1SEJBb3o1OXFKTkwwSFdNM2U0VWpIalNTVVhIVWZicFdPSTlaVjNBaHNITEk2a3dLRk5aZ2xzSzNnS1VRYWVFcW5XUE5ISUJvK1d6RXdOckZIQ0hHS0lONVBVbm12Y0k3YnFPaExncVlxSjlRUmRwNmlERENmY3QrNmQ2V3I2VVN3Vko0bW5Xb09Kd29rYU9vaHRTN3AzWXJ3YWswM2dDakhOazdPdEJOUTh4amNxYTNkQ2lOc0dhU2dkMlBrSXFrR2cxazd6bHd3czVDU0srVmovbmVCWWIrR2tYN084TkNwWHJ3b0FtRzFQODV5VjRIeHpCS0wyTHFyc3lBRUM1bVA2UTZ2QWh3QXlLQmZxbjhaME9KV2crdUNZMW9WZmV1NlRiSmd0SnBYU1BMRkxrOVhtTEtSL29SQ1YwT0NxZmwwSWtUSlRSS1RrejdVeWNMdndHcVFTcVBPWnM0RlpmV1F0N0Zhbjk3VloxSE9STTIyTGFQbUFoa1hVaUt0QUIzMDlxTk9jTEFUUTZCOTlaS2tlaktWYTd2UXVBTnNPSzZzWGgxTENVbEYwam53NG91NnZiT1NTZ2lrYkk3eGg5TlpFbXNROFROajRoQ255UnpwZnVlT2JVQlVOeHBNamowRVEzd2l5M29DSk1DMzJkdnZwMlpxdklBcklhVUUzRWxhUEtBbDB6U1lIdGdGa3ltQTZPcmJWazRIL21ZeWh1MlcyZldIVWQ4V0Z3SVdHQmdxNGlYaEpHUUJWZ1hFbU9ubkU5cmFDS3gzQkZMdWxtY1k5K0hHQVdISDMrRk9ndzk3VkFGMXZSTUZYZGpMTWl0d1NacnNHdlZvZVhkYS93dFFpNUgzQU1YYm9US2l6ZzNGd25UZ3FOYXBqZC9KRTZ1NFJYZHV6OTk5SFhraG50VUF5VHlXZURyMzBjV1NXSkMranN5Y2ZaSThHblE0aGI1M2w0TTZSMyt3VTcvWXpYaHlLU3lXaGFCOWwzUmJnMXozaXFqamhWRHBDaEg3cFIrMTFlV1k4QzhhZkJhOG9Sd1dubnk5SFFVVlZFalY5VC9ENDFLL1kyS1ZNZmZGWEdhNVdmRnJpTUtUTHduaVAzUlI0a1pKOVN1SVVFZFdIOUdxUnhLTXN6OFFXNkpiWFRTSU5KcVRVN1M2VnFyMUpORlFwSHdLVGZ5eFFEanM2RWVQSExrM29hUWpFZk5iMVFPN05uK3lyS1U2aEpOb0Z0QTgzd2hOaXJicXBWbm9WUjFkY1hETFNxTEVoSEFYVXRXRkNjYUFMRk44UlpLVlozOEpmbmJOOGttODZIYlo5R1AzdWVzNlpNZGhSOTRzZldjcGFFRU41a2VianB0SGZXdVB5dk9meVFXMmFqaG1MOEl6WXoyWEVsYUtlWHBoMEM5SW1kRTdiMUNRNjlmQ3RTZk1jb1RCdElwNFlxWmJEUk9OK05rVnZxWCtxbzFEQ1hhbkt0dm83YmVsWDhSMWpjdzlvcVBSdCtqWmorQVlwUnRGSmRGVm96V3ptZzJkaDJnN2lNYVF4blJKUGROQW1sN0hSWG5yTkZ0UHlGRGNQY0dZOEVzcnFVdVh5MUZxM2pVZWk4MmZBdTMvMEZUeHJEMGlnVk5CcTlYR2kzcC9BeVplUjZUT2ZOTzQrenJGUVROVThuTFlyYjFhcEZvcmk3WUNMcUhSNUpoNCtQVE1aYUl6bHJkczZKK3phSGxwdHhmOXN0dm1TSVVjWEs3VlAzTzhZT3ZrMXl2R2s5ZStjN1NGNURZR2F2Y1VMdmpwVjdCTlFyVmU0WFNUK0ljUzVyalBCSEZSK29MYWpjN2ZaYkoxS3NlazFLQUpRbzJLc1VjaWY5TkVRcEQ1YUtsdUZ0dmg2NW5MQTI4S1pzeWZXZFZjVjZ1dFFCS2luYS83aHFOdWg3L1ppbUN0YzFSYm1CYXk0Y0o2V3lLWE9ycUU2bEpnY3QvOUVCaVhXWStNblMzeWE4cVpmajlxSERXS3dJbmZNbWlDU2lMcFFWSG1sTHNPbGtuMGtuK2MyUitxdDFnVktENWhXZjdlejNHbGlYZ2NZM1lCS1ZyekVBNEFpUTdhbEtaZ3RCOXdFam9vaHJhTW9UYU8xWVhwck5RZTA1THZIZGNUY1pOekk5bG9sZWdKbFNGSzlLSmF1azBVd1JyWW5zUnJmNUVJZ0U1bC9WazcxV0p1UVNMTVF4RWRBckVhMVpQajVCS21IMkRpT2hoZVczTUpGSkFWQkloNjMrRlQ2SjFydkRPcGU2Rzl6M1c5NEt0d3p3OGIwZUcwVm1Hc3hDdEp4aVpZeGZxcStTd000YVQ0OHNrcUloQjhLWHFTWFJJV2N3SnozYVJRMEJZVHIxanBPTm9DWEJEYjF1YmJocFl6WDJYQzYxUUhRa0M1K3pKMUhmSzkvTEo2TlE0Y1pwVUJNWjhkVm52cGNnc0hrOFJGcnF0ODB5dERJblVsWm9odXpPUG5lTklybEx5L0QvTUV1NGxGRFBLWmJkdG5oZWdxRUJveFhOMU5pTjQyaHU5WHJ1OUNpQTVwQ0VGTFAxL3RHbzU2cGY5Sll3OGEwbEVQNDF4KzErc2JSV25IZy9tT2lrVkJDdEYwTktWL3VnMkFvTHZrQ0M5eVdqOTN6bXgybHNiMU9MbzhjSmlYOEFFb0V3NTVlK1ovaXhNY1FhdGg2cW9hY2xGT01BRDNrbFR0cG00R0tCQ2ltTnUxd0RaTHBBdFVCclUvRlh1emI5a3dHNXF2SWswV09NSi9CSWwwc0pNaWw5TzByb1J5cXBFRWl0eU9CcFpmOXk0UTg3MEZzZEgwVnlqQXZrZG45MkZ1TUVuZGhNVlRUeXBWTC8wbHV4S0d0eGxMUTQ4U3lGRXRsaXh5T3AyNUxqU2NYMTlHN3Q3bDI2SkxrMGFsUXN2ZHAzcmVGbnphaHZSaFJFbjlaNDVTQ0drVllMZzR6cVd5cDZjVjAxc2pSRUx6Q3JTeG5OSFh4aGxpL3c5enBReEc5WnVPMW04OTM3ZkZvUHBQcXNraXdCZUZ6ZTNVSUJBNjEzT1dKS0RYWDNIYWVZcDNEbURuazBKSlllVXlPb0NmM2NSZDR5RW5BY0NBeWYxNVNlUTc2dWRHOWdNSFA0WFdQR01NVnZBNjdaM1NTUEE3V1VhVzRoSlI2QmlPbnMwU0hEWTFnVzZqMytBQUc0YTNESEJSZXU2d2o5U0VYWDE1N1J4RVcxUEQ4OHFrUGsya2xmcmRWaHZ4Q2VWU1NjVVlnWEhSMEl3WTY3WjhOaTFxRDRTQXR3d094L0dTSlIvQTY1S3ZTZ0Q3RHR5cnVpenBDcGpYcmE4c2hMa2JXVGo3NjZtU3JZQkVCd3hndG54SHF1VmVNcWVBNmsxcCtrVnBZMUJWNTBXQ3NwaEs1eXM2enVLZzMya2YxK0MrWVNOVXFjZWZ5QTVuZUNTYlVRVDNtYnFHMTVNVkVPbDQ1a2l3UWtuRVU1YVh1aVY1alBrb3c3YkhBdkdKdDhiNDg3QVJ3QU9VRC9GV2NSQnQ1VlhLODRpby9aUEc1S2IvT21DdVZsODVpNU1lOWJ3RnQ5WmxsdHpRZHVhU0NmODhVcXFIUlp3SjIrL0YzcnZzOUVuQ2kweERPMkNUTUVBSXVzWEZscllBN1hhZzBEUUpybU1sUVg2aG5ibXZUVmZNNDZud3VIUHpYZEJPZmFzUVdseDJRcnduSkdoOVp0cWJyaDJTdFl3cHR2dHdLcjk5elVlVkd4SzZUd2phZWZ5Umg0ZjhCbUtVbHVVZ0gyQXJDc2FKazZWVlFJL1pjMEpUWThDLzNpNDNIYlVHaHhiMCtkWCtyN0JNVnZvRHJVbXZ4ZDBTemVhejQ0WWsyNHc0L3pSWnRSYUxUVVBpWkFOc0JHZTNCL2hIY1NHeUNsZ1pXZ0RyMEMvcEJDaGppOXhoTnRCTDJiQUFaWUY2WVQ0Z1NhVHZIcVJQeThXdmhzWXJVNUZ0cGRTWVZwemVMOEdkSGpqL0tKRlR2UlZkKzUwUjNVZmg3VFFBYTBaY2RucjR4ellPSUwxQkdheTE2MnQ0U3pUWVlxcTRTemxGVXk2RzhxQXpVWlozUTJUYlE2L0xvTVY5cGJnUXVqeHp2RmVGYTFYbVI0VWFpTUs1Vm55cDNYNTEzcmJmcHNPUkhaSGJzVkNsZUo2b3dVWXNaMVErdysxd0JVRzRSTGhQZXV4Q0lhL2lxMEZtZXdDek5zREdxM2s3d2UxVWlyb0syb2VrY0lESFpBTDB5Z3kweDlhYjBNVnJ2SkpCYjBWZVpmblh3eVNGTmFUbERaQkY0ZmFhbUEvODZVcktmeTdGMklub0ZpWGE1VXdKNURUSEFGUU1CZkU5YlZMVjd0Rm9YOExOWHVhdW92QTZHVTBveG1VdDkrbGtObTk5NGpJSjZBNXBBN3hWQzl6M0hDN1dKbmtxZHdVQ3VaVXVCNWpScTN6dndiVEliNHIya2t0TXVjTndIb3hGeGZKOWtyZWo1N05icFMvUkdENlpKTEJuWms1cmdOTUdnV0ZnSU9EZ014aWM2WTkvcFNYejVrTHFzZEhBZEpHYVRpQWVGNXg1dDNqeHZyRVZ5YjZQNEh5cGFqaEtsTGtBdCtlOXJ5OUZELzh3RFZ5Q2tIdHcwbklMY004UkFDOUJjT3hHV29sR1Yvczk3SDE3b0xuUjJJY2VpK256UnVLTE9iU2ExM0NlL2oyak0xS1BJVG5Dc2ZqRDN3MTlqekV6WFk2c0tTVjhlKzV3MzdGaFR4L3VUZmVnODhJeVYxbEpScDVCeWJLVnE5TWFhVjg5VGQzMi9IN1Z0dDdKRFd3VDNPZCtGTitneGFLN2hqMmhzWlhwa0tWWmtTbjlIb2lTNnZDV0VOSklrNHN0ZjBreTBURkc3RDBJbDNibGVYZGNMVGxuLzZjSHhkazU4eEpPYUtuZHlTbklXWGsxU3krOENlUFQ2SUN0eEVjZXZ4d2NMMXFsbjVDQWVzdzllOWk0dTZKVk5YdTdTR1gvZW5LN3o1REFiYS9ZTjJ6a1ViTXM0ZldsK0p6VVhXS0dTOGk4QzFDYk45V1BmZW5LUGMxUDQ4WmxWMjRnN1NoWWJHUU9oWWRmZzcvQ1laVklVVVFCK0g3OG92Vll5VkMxQkFYWllWQ1R5Z290NUREUXZxZ21SdkliV2UzcWZrdnRPaU5JSEpRU0t1SSs0TFpmU1lYQ0lzR3dFb1VKWGl5NXF5U3Bua2NTaE5QeUhqZ0IvYmZDQzdaQWI0VmI5ZTdMVEtYd3M5b1F0alFoRGsxNDJtdnNITVFhN1c4M25MdWhUanhBLzAyZ2VzMWZkOGFIV1AyQ2tTeE5rQnA4amJ6Q3ZDMnZFNXNGYUhvZFRZSE1tN2c5UXcrU0hzVVgyWWsyRDFCUnNpK1NHcmQyRzE1SjFPMzc2ZFZvZWdYSEhZUjdZNnlkZHpwVklkSVVBcmlTL3ZHMmJlMzhxUXlNbWdWRDNlTlRPQUJiZ1A3d0VPZFpaVUpieXZ2dXZYU0ZmYm40SThwQXF1MVFIeFhKZUtIUmYxTFJiNTJXa2RYV0M0STk4NEZrK0JzbnY5TnF6amg0S05CS3UvcjBCMFY2SnUvVnFISWdWSzcxZVkvYmxsR2JVMVh3K3NYTE1VTWFlZUJRN205NkRsV2JIY3RjZ3RGZ2ZPV2dCb3M4N0RZUytFV25hNnh3NUFUMHlnUVh5d3lSK3FqTFFZelFIczZtdlRINnpFR0s4OVF5aEVsMFNxU3J0V2hOYlJpTmNxcytEY2x4UFFsd3M1cHpjVjRVM1ZHV042eUhHMnd6bFpJTmR6NG1IR3ArQm9sUUdSemV6NE0rUnhHUysvS2FkSUxUN0syMmR4OUxhTFdmRFdBUjZGbjFiT3BEcm9rZUU2N1htVHRTdnh6VTZRSXdVZXlsMUoyUjVYSk9WNkZDQ3B1cXdTcG4wYnRDNmNrMjYyVHR0WFRxNVh1MC9xaEZNdmh3eU81N0c4ejJGS2dPekhCQmZ6Y2FNR3J6R0FnbDAzMWxLU0xiWjFkQ0xMNzdhVlBFbm1aWi9MNGJCZVZWRFg2djlpVUl0RTkzT1JtbUN3WnB2NDdzR0lmMlI1QjFmbWVQdjB0R1p6RTRuQWUrazJmWFh2elpLdVBZWGZjNXdnbkpySFlLdDFaL2l6U1JKZldtWDhhMVRkMDlDMW55MGh5QWgrWk5NTllVeGIwNFp0UWhYQjI1cnRXTFlVYThwelREcFhSNGFFZWFYZE44RzJHYllndmJUTThuWGNQU1pON3FFdlFGdlc3TlRHb0hnK3BPcTRPRXQ2MWNzOUlvam1rdXIwNTRQZ2lGRElMZktMRDczQjVaOUdWQ1FuTjlOVUpsSnY1cU9iMStiVXkxNGVBekViUmJrR3lLRmNFRDB1Y2RhaEcrck5RWWc2N05rMEEvM0pMbFJoUFByaDdaSnZ3NHE5YXdiRVhHK0t3T0QwWExuQlc3M0dwNFdSYUp6enkvMS9QQVhqdmZ1NmNOT3piUDRNQ2lZaTZ0djZKWkdWalUvM3FnQWJOWFkyUHBTRm9PR0ZQMjZZK0VhRTdiamR3L3U1M29LM1BKTDlKbGx3QnFFR2QxZ3dVWlhCN00zZkpYSTlibDFxdVVZQU9mM1JtWEh4c2doQVNMZGRhQncvckNhaUMxNXV5UFBFRlZEZVNuWVdOK1lkbzkvYkFuYitZeUcweDVqd2RXWHFJbkNrSldsZFBBZld3bS9zQzRRaytSY2tLUDc4RVRmTlgybEZpaGxta1ZsMzlKWmM5YUpkSGNvT2FhY2VDci91TGJNU2NYdjl4czJRek5YS2lzcEs2ZGpIVDVVakhGWjZqQW1QVXdWNWRncXZLSjZmTVpUNmhQT3dBa1NleVZvSUI0SVBLWlphc2hocFk0VXJBamY5U1p6ZWgwcEFXc1JPcXcxNmtLRWJpWVQ5bzV3ek9HNnpwTmI5dGoxUzJ2R2FNNTBoMC94TEM5TUlOb0xIczZFbWF5aDk3bmRrc1dTdkVaWTJReXUwRnorZW9nY0Fpbmpaa3NqbCs1elVCSHBQRFdVSmJhSnY0dzl4R3ROT3U1bWdRZUExcG9Ha2xYTWNpVkFaL1Uyd1dEd09taWRjUkV0dVU1SkJzVUFOMTBQaER1Y0VlcHl1Yjc5aTY3VllXU1ZKUTMrTTNGbi9DN3dScTIyZzFYRFlXR0grdW5zT29zVjV4N05xSnkyeEZLRWtRSStNQUMwRzlZRmN1N2JZellIRjc2NHV2WUt6VUl3T3Y5alI4K1A2ZWx6TE5OUlFQWkZ6SWlxRm5JNnRibFY2VDZJdHNEak9OSWd5VkNqNXFkZlh1Z2s4UzhVeDBKTDZjc2x5TzdTL1pvVnhYZXFDRko4eGJpS3h6dE4wNnBjSEpBNEFWN01mcVdJcmc4dlRuT3V0Y1NwMWJqYUYxakcrNUNRMW1YMVJWWTBsZERubkh4RlhjczNBRnlESE81SS9raEhFS0ZrQ0R1c3JLS3hXSzdiYm4xb21zY2ZuTjBMUjhnVmpOTnVEMW5MbUoyM3Z3aUd1QU94Y1UrTCtVN1dKU0d3NE16UDhUdWh1eDhhamFVaGxyZHl6RWplQlNZMFZUbXNXNHhNNWc1R0V6M2E0elg2R1pwUDl0aGthUndFbEZsdHBRdjNZR3BvYnF0Q3Nxem1VM0dqNXpDcDc2c0xRNm1oTVpXQ0l5SlI0TTY5b0RlczlzcHZKZXZTdktJTS9BL1NETExTU09MVjhKSytLOFp5bW05cHlvZDhCQm50SkxaVmUwMHNQay9EQjdBNDFJSk9oT0NDcEgrZXp2dmErWmFVb3VaSkhxTS9IZE83VXlybGZLaVJpUG5Hc2IxZVhjQVZkRGI0WWVYNDlMRTNLZDZRZGtwNVRMdnBZQVFHT25rTnFIOUxUSTdiMXNmZTZCbit6VC9KdDdjSC9lTlJSTjJxZzA5TklmSTZwZW1wTE16V0RhTUtEaEdGbUh6LzRxbEl3VU5VUy9xSFNhREErNzNwVUNCMUhsM01STm04TkNOOFN0Q0RYR2tsZTBZdUJrdDVjYlljd0krcXd5TUlkajBGUVIvdDFTa2N4U2ZqMHlsWjZzZjFkWTBsRTZXS20rRWF5UHdqY09QUDZsakNNbUlnNWlZZFo2eGVTcHhzelhNWUF4cTZtbTlNcm9Nb21HbzVSZTZJVmIrZHdPVjhkUHo2UktESFhRS3B6NmVMaGpSTEdUai9LTy9DZllHTUU3LzJOLzZpejJmQW5Yb3kxaHlCMmhjYmsvRFdraHVMaDIwN1dmQ051TWtwcXB5TFI5c0hMQ0hWcWwxRGxYcEVQSTNLS0UyWmlTc3Y4Zk9IbjA3a0pKWjVyRzV0VTVEd3lLWTVZU3VaM1NST2psanBxclg3NnltcGp1eDdScmhYT0hoNk91U3Z4VjZ1aERoSERGM21OSlVKbG1JaGZqTlZ5NE1zM1hRbzlqbVdNcXJzNWtmNXZBR2s2MWFoa21FNCt0SnZRbE5obUFVcTluSTlLa3lNdklWZ2d3RXJGZ0Fqd0J5VGh5N2QyUzJ3RFBLYnNqR29nZnQwMTdhV1dLU3N5eTUxbDhRUWloZ3Vtb0FHdlFhb1FraWtjQnkzUWw1alFrVDJwd1ZnUndManJQZDlSOUNJY1BTUDVwZ3BVNmpzSVlRM25NYzExMjc2K2xhOGpHd3ZVb1BWMDA3OThjQ29MdDFxSWhUcURGTGFNZEY0WmpSczhpamFpdEpNZGNjMWZGREdtanJzbVNFUDlVWEtJQUlFTXlKVHhVSm9nNUhIZThadmI2WXdJWGR3aHNIbnMrMkdNK3FqVFBGU3c1NEtaY3l6NTdQdFlSZWphRVRtUmU3alRBWTJ4Z1dDeUpJZy9mMnNicEQzSkNRYVlZbTVsZW11b1QyVkNnclpTY1pLclBrTVZlUlFQejYzVWxPbCt5eGsyY1BKT1ZKL05VTnRYWU5XVVNmaC9xVktXRmxIWWtTY2ptNXQrbndPKytlcjJxNUZtM1g0enBRcmsySTBOZmh0c2VMa29PNnBPSHVhYm5iRlE1UTlxQWZ0cXNPLzdOYnhRMVVzdWJIVEZjblh4aE44UERXSTdyRzFpSlhpa3dBeUkrWjNoY1g0Q0RqdlQ3a0FYTytZVEIxdU55U09lY3Z3MUVvZjJxSkFWQXV5OHhEc1RWSkxMaVdvcUdkVm9GcDRHR3JWTFhGd0tHYk9EY29ZaHkvYlVPcGNsZ2ZCUXRKZnVxd241TDJ4NENDQkRwdUt5alhSVGNmc1QwTGlySUVhTmMvMGxITlllN0I3SFlQUlVpaXl5R1QzMTMyZ0R2dDRTRmEyVkEvd044blN1UUNDNjRZVjkybDMyS0ZkMjRZRWxDTk1CamR6SmN6M3FSR2lqSlV2WXZxTm93UkJQYXdidHJxUlY2S0dRSHM3VjQ2aHByQ2lSTGFYY2VLb0Uwci9qYnJVMy9VbEpmWlRuQSsydmpZQjkrZHJsVy9tRWoycVora0lwQmNwSXRvRis1SGhTOGoweGVHa3hUTllqU3B6U1EvU3FkSENoblVRa2NWMWRGTnpmNHNNWW9Pa1RZN1I1MnpYZ2ZWQ2NUYk04K3hBU2U4VVlFcTJyRGtiNjg0QlJ4OHlTY1RBbFBYdTU4NnRhOUtjanRmczFNR3JtcW92Rm1wRjdQV2lnditTcXZqQ29IbkVtWGhEa2lHVTFpb3NiOXd4WFhPMVpxendWUjVBWmFVU2F3dG52bVozMWJLOVBlN1RzUm1RUmtwSC80cHRlemlxT0NQeTdWcmRFWUtkVHdTTEZnT0h2RExqZ2x3SkhXcUxpV3J4ZmxFRW9Ccm5QQzhFKzhQZ2k0Ri9TQlBaek1wMm04ZnRiaVJkb3AyMjlMNnVlTDNiZDUyUFV6N1Yrc05lU045NmtnMWw5U3k5Mnd5LzhmWTNPdGxsU3k1T1Z5ZFhJdGUyNHBnUldabVA4U0RCekFUM205WjVCZzRQV01CUFNKSkF4UE9JR0UyQ2c4ZGE3UUtjdXpVNEZnd2ppdi9nWXVML1BpQzZVT2NDMUt2TTVUYW9tb0RyYU1Dd3dGWGlPalZlTGtHdlIzNm9Id2FmUDdDKzRJSmxnU1plMmlyTmU4VVROeTU4ZHRqS3lMQnNabjNzc1NySVJqbVIzbm52NmQ1MVViL3FuUzYzQnJsYm9vV2JXOWVhTG85d25Wa1dXcklPREtRdEJMaDJmTmFqWENEYktRR05YYmpNcVJadHRiQ3pTaWxzTzFPdElsdGFlWitMZmZla2RTMUhZL1p2ZE42Z245REF4djQzM3piNTVDUVFEZkluQU1rRVZwazRMR3V2Q0NuNVpVREpZUThySEhEZjNIV3hKUGdOTmUxN2QwelJTR3VOME9ENURMSTYrQlFzVkN2WGZjMWVEZ0ZDTG5oVWltWDdLeHAvOENncTZMRzNBNTc1ekd6ZFFSU29GVHljb2hlaHhEU09NVWVPWUt0SWlIRVJOaVJuNkVDMnR5NldIWFRBTXN6cE5LdWx2TGRwaDZrVXJsRzFtWHI1YUNSQlZXNnZQaElOdTJialFuTjBnZzZhME1xTEh1UW5YbEV5eE9PWHpzdWEzZ2I2V2s5VXc4VThGQjN2OVFNeHpOdkRUMGpPY2lncHZPS0d4aG1XcXpZdWQ0TDdYd2xDVVFTYlhMY3BZbGNRQ2d0TWEyanVreVhaWlJnTHQ1NnRnK0pTSmNFcldqN1hCaGtIRENyalB2TUhmK3Ivcjh5TXpzWXMvam5kTnMrR1lIUnJPV1NkOVF0bzdBK0VpZFc1eDF4d1VQYWZudzd4ZnNuY3RydkF6UFptNWdHUmxRMTJBOWpuemFPaVNPU09ISElZTVBWYjloTnppaUo4ZmFtWXJ5cnB3TkFHcElZM2RmUTdMWHA5bTRqdllCMjZFbXo2aEZzQWdtMWp3R05xbk1ySUZlcm5hNUh6eE9EN0hYVE9uWW5mMUs0NzFDUTJWUU82N2FFN29vMlk5blFITmhSMUVMRTd2UloxTStiTnNCd0JoL2JyMTZPc3plVFJOVVNpVjFOUHgxbU1vSnFVMFJhR0NNTEE5NkhVVXFoQ3ViaUdOd3NvOWUvZFN6YWI3VjNHY0htQUpIMXFxd0Fmd3dNRE5ScVRZOWJ1cTU2RU5rdHNWODM1c1M3aTNaeU1OaGtWSlV5ZC8zMitPZG1SNy9MQmNsZTN2VkkxS2w3OEtIa2xOem5Cbk10VmZUUXdYT2FWTFBVQVdJakZ0STBHd2xtb003Q0RDWFVHNkU0Um5UTG5tRkF3N0pobnZwb24vTXYzTXJldW10UWIvdmlJVjF1Q3IzNldQR1ZydGVRa2p4SGRBeUJ1NkZpSnZxK0lheWlRcUdBQlZwVHJobk1vYUFmWjVoMUVFSnE0akNINkJHMldrU05LdTFiZXR1cC9KM3dqVlN6R0J1aEk4NTg2dE5OMGtzd2hRSkxmTjRuZU9saSsvRnNrbjF2Z1ZkOTg1WlpiRmQ2a1BiWFc3TWFSRU5pNnJiVSt4aVpkZXFPMlBBeGQ0eHNoSUJmak9IYnI5L2g1RVFtcm16ekFzQWhHa3A5S21WTkQ5dklJRlNjY2J5UXBxbnpwWnlvT1VOckpiQ2NqZUJ2enM1eHlySXZwUHF4dFlKcFpCQXlqWVU4UHRTUlB0QkUwT0lhT3lSbjJ0czFRdmJFd3lzNmw5aCtQQ010czZBd3ZJMmwyeG5EQ1lLZkpIaXFLUzRXTzVFTzk3QWtlRVVvNWxVRUZjV2pJU0YrNS9xRGNFUXVPdkt5T0ljdVJaNUF5V1ZYRjRBYSs1NXRoT0RoaGF5Q0dDdnlSV25PSm5OYVNGeGdsR2p5MlZFZXgyeW5TcXh4eDRDc2xtazFFNk1QVFdlcUpZWEc1QnlmVklFWkxLMjdXQzU5b2I1Unl1cS9mand2UHlFdk1WTlp5QVNFNDhjUWs3Yzl6dXdsNlFXcWVYMEx1c2VDMThiOXo1UXdSQlpDcWJMMFdoTE5JOGVGdDg4K1R3a1pvcS94bnRla091V3N5TzY5V21uNjRVQkVadGJZTXJwVHI5cmN6QVVXbm5TOHZvRm9GWkdMbDJnOSt6L2hmc1kyVVQzQUlUaWtxRTE1NjlkUjM0VzNmNTNXRTB3VWdJUnVaVVpVVTFGMzZ4aWlURThzdzhNOXZVMEdhcDZMK0VnY3drbjZsRTlXMUg2K1BySzBTNTlPc3lUN05KWG43cFVoRjRtQnNIMmlicExLVXRFWkQwbERJU2s1ZWwxV2F4QXlScEhaUml0elpzcjR1VE5WUWZXNVBQazFkd0RjcnRmZW14ZFllazdaKzBYakVZbldzajRRZ21lNy9ybmlvT1NNRHVUVmRrMTRCVy9MTStIQ1dOaTA5YzlJNEJ0bmRvMldqa2NWY3krclA3aWhYME5sd1Y1UHBLNTNBMlZGRTE1OWtLWkh0ZUhjOGpYYVoxVFhqWHd2VitEeHp6YzA4cWhqQkt3RW5rcVZ4U1JoOCtYeUw0S3pWNCtnUHc3RmdaMEs5ckRsYndGSi8yeXBwUVVkUkhGRGp1RnJ2clRrTUN4ME10MFhob1oweHFWdDY1bzhOYUhsdHgyQTVIRjZKNWxKdHR3QWVEZ2llemxySXJnSERVTjNoSkYyMFRrSzlJSU9xMTd3eVFNZC9VZFF5QnBsSVNrU0R0ZlVZQk55cU9IMFVXZjJ6anphOFI4aG5hN3lzSWdQZXNGdlRrOFFEVW16V1BSckl4YktwVGw0Y2RudWlOb3Nla2VnZGNYbEFOakh5RHo0MmJYa1N0V2dkSjJMSzU1eXArYVlabnN1bDJGd3UrbEhFOUVxNUxCNEJJNzhqYU1nR2x3SDZFR1NWZzBKOXIyb1RxLy9PNWtwRzdtTHVpVUFENEYxUFljVFpWTHI3VjJVRFo4ZGZVS1B2TUlNamRBeUdaRkhWbllJWVlEY2d1ZnU1dmdFbURySHBISEZ1ankrWTFWamZrWUVSRmZiaSt1RWdjVkUra2ZESEZGZjRqekJPc1pTdmh6RGFONks1N0l3SWZORlZZRGxyTE9wSEhGek5HVnRsL1dUU2JYZW5ic2o3MG9YdTVtYS9sMlc5WU9wRHpOSERnYStqbi9YMXAyNU5Iem5iQ3pVWUdBTTE5ZzJ0T1hWMWlpanhPaHcvWWQ0emhRZ2QydDdLUVBNNTBSbVE0bGNTSDFHbFNIanRrVnBLdm84V2lFM0RPYUYzcHl0N0EwK1A1Nkk1UmhaZXVROEtaWHNUaTlJeWRhUXZsZXN2WTcrT0o1Q1RXcXpIdEFNME5DSUl4WGxxREhpQlZzbHRZWG5mUm9ybHdQRm5ZbjhpZlllOVNYRmRlUGc2bU9NRlBVdUxsaVFmTnFkeU1FUGp0bGNPMndOYkhzTWF1L094UDN2WEMvQ2tudFZoc0FzaUd2NUhnR0p1bitON1V5ZktvUUZkelFKa1g0cHNweWthQ0FWM2RtME9CWG9WQXNHOG9xUlBKMFVmUzhjMTBUOFB6a3VoQ2JWbCtuSnZ3eGFMMGUycXdVR1ZFM0xGaElvRnBCcXQ0dkx3ZmNSMjRDczhuV1oybDRiNndjK09UUDVIWmp4c3diMW9ReHJMd1FpNmRpUkJhQ2ZXMVBZWVZ2QkVJQUVYV20rczRMTmRpaHRFWnRlZWVsVEZFN0xvWXllVEVza1dvT1ViOHVnZkx1VklrRVFnWms0QVZJTThQKytSaUZyUklEM3JXRm56S1lUVXgwZWR6bFVaSjI3cEtmbEliNmxjd0hSOWRSK1ZHL3gxS1ErZk13b2x1cnk1dTA1MmoyV1h6V04xWmQ0ZGRtSzNvQ1I5MzNTY0V5clJKZnNteHBDdjY4cndrSFJEdHprZ1NYbDc1YVU0ZXAza0wxMzBFSjlLVnVWZXg4djFiUUtINFZ6Vnl0eFpvWnFmR3B4eWk1Qmp6RFZIQUFWNUVUdjNSMnRGSmk1VmQwV1NXSnZQWGtBQmYrTXB6MjBGVDhwa29UbytQZkN3dlhTWVU4b1NweDgrUFVBVHNITWVqbDdETlEwVThCME16KzVxV0RrdmNwM0ZrWElWSXRySEJBcHRRcnFuWHR4RWhtL1BDd2ZDUjlrNEx1NlZ0ekxaTmU1UnA2MlF3WUNGc29HcGxNQUpoajJwd0JzMXh0cTZmUG4yU2UvQ3RDRU00MW9xOU5Qd2Yzc3dLK1ZxTmQybWtLekNQZWhrQTliVE1hOFJCK0VmaDhaMWR6QXU1cnVDOHJpZDZ0T09XTjJqSTlNV0E4RHIxckJ1Y0FkY0l6ekdsV08vbGxPRmdEWXFxMEg0KzJ2dk03bmZ5ZHhObkhLazMwU3hxQkNzemxYUmtIYnhyQS9zcS92SkU1VisxUHZNeExMT3BYZmV6L1hXekhIVHluWi9aMjJJN0d2ckhQcmhBWTJweDhzN3RkOUI3SHJmS0pCQ09YQk9FU05Ec1hXc04zOGJtcmlzNWhpL05ZcWg5bUdiTytzSmIrYzhFZnh6RjI2YmxrS2F6ZDJHOFFjL3dSQ3dhbnFJQnJRYnJvd0liWjBwWTZWQlVERmJ4cW4rS3lKWlRKYnRaNXhUajhvK0RmYnBKY1VBMjZIeFFCcTV6anVtUXFhK0Q1d2NLVlJrcC9zNXF6R011TVIrUDJqUTFQNGg4REJSaTJ0S3RNc2dsL2RHVXBjdytDcHJuS2R3cWRxcFMvWXdLeU5XSTVtVGZxQTd4d3R6Z1hpYmxKRVI0b09ZTHBpSi9mTzYzUjFzMzZEcHZMRmcwbmNpSUd5MjU5STV1dzM0b2FNbzlQcG1RdkRvY2Q0STVkNzB5OHdJVFJxT0FHTWdoTkZWWUJwdUlUWXg4ODRWMGdUTGxJbVFqK1JnWkdhNm42Q1JURnEzZS8rOVhFakJXTmFZVUExVnZwNzdGeXdYVHZBTkRteXpYNHBPcHAyU21CMUhXbFU1V0R4THNlRUlJdFNKTmNiNDNNUjVENytoby94aHNaalU5K0hDYm9oVE9MWS9abEV2TFFjM2s4R0JMRFY1M2Vtb25sZXNNNGxwZU5OQ1VranBrTjdFY3JTejBXcDMxY1ZreE5CQU1aUm9aMzcvOVcwaEJRRnhxemtIKzgwcnIrdzRyM0tKdEdQQzlkS0lMMk1tblZPVUk1V2Jac2VRdlA0RVR6OVcwSmtSaU5qSDRvSEdVek9lQjc1ZVo1UjQ0SFlCRFVDalZMenpiaEw1clV1Mk1MS09iM0hPcUFtcUtXbS9udmtweWphNUFVOGFIQWJGMjgyWnJVN1hHN3F3RDE5bWg0S2RlMlRRY1F6NWk4VCs3Y2dEQ0t5dVN2NzZ5NncyMTAybkRSTyt3UWVDUk1CR1EzUkNqWUE3b2VlT3FwUUdDMlBUYmxjSndyVU9tVmxBb3psSEdrSDNwUFhQZ1lKajhUSUxRSUtYUEdOVFdkQXMzbWh1aEw5S2dDcUhhOWhuTlFmejFGQnZzMCtia1ZZSCszZVNkMThRY0lEQlVyN3hmTXdEejlCOUxDbVBReEpSRVl2UFVlQ3MvUk9LSDQ2OFJRdEpxSFR6NlVUR2lXNXdnekxkT2VwVzJTMkVCd1h3ekVxRGpIUzE4Q2ZtS3M1cjU1R21lMkVRN1R4eVJLOXdyRFdSdUNwVUhaZmxyVDJLdFRzWWh1ejB0OHM5dEFHclhxZjQvOW45a2xqMzlHUUhDUEkzOTRHelY3WnZSeXNhVW0zbTlMR3BiNHVDZGM0NndCdmpVUW5wZnE5eDEyZEFHUmJYOVBGSkgyUGo2L2FFdmU0eVVaVmcrSHA4UXR0eVBnOVRPdFY5TlBiUjRFdzc5angzNlduTUJWalFjRG40SW9CRmJINHRNN3RNZHAzTlROWmtscUt5ZVFxc2FGZGU4RzgxWEZNRWNwT3lRczFYQWJ2Ny9wcktQdWFyUi8rSEtnREtteWxiZ3Y5NTNZUWh2Z2pXQTBsWW9BcHFLZTkvTWxKbGY2S1RxeWROSWRCSkhOVzl5dzk0WWs5MUZLWHIyRlZ2eWNHam9QS3hiNzlKM0ZMMVVycnkrTFpkTXBhK2ZOWjRsSytMMmZTOXFZNm9BMEEzU0dmcWtvb2ZYZ2FXYkZoNzZSQm1NdnNPd2pWS1Bja2F4eTBmWFo4VWpWUDV1RDdPN2JFWWcxS0dwTEYxNnpQRGpNeWpSTlR5Y3Nma3ZDWElJNHBSa2pFOEVsNTZzd0FqbU9Ob0hBdmdTajZFWlh4NDNlMTRJSlh6S3pSM3FpU0N1eWx6VitDSVM4WnNtVkdDWUtrVmlXYTZyMU5aTUVOS1BzaGlmU2RCQlZ4WktkeG9MUzRYZXFPZ2hyZjZoTlRNWDhsK0doVk9OUGdhY2dRRnlQcWpjZHlHRmZWTDJzT1ZVS0R6Z1h2Yzc1MGluWDFOaDBRaEJMS3lyMGliUXBHZHpoTXNoRklTZ3RIQ1p4Mmp2Nm1ZRnRzV2xRVXp6ZVJLOFp5WTk4WThhdW4rVzdETWdKM2pnSUo2dnFRdUZSY2pqVWlzWVgxcEkrNGppWi9jTnk2Y1BZTzJBb0l3UjVUcXBkbDh3MEhJQVZ6V0lLWTBTcTFsay90YWlveDdPZzBhNVRJOWNUVkJQaHhrd1hkdlN6OE5VNjlTRmxWYWlVYWN0Q091eXh0bFV1RmVDc1NGWFJuMW44MmxVR2J4dk4yWmM3ZnJ0cnNQclg3S0UzTzdTSStZdS9zTnlFWmFnMDJGVU9rR2NBaHRsaXhDK20yOUdCSWNlWHdJMThpTGFTTGtsOEpQa2dYdTAxQWR5V0ZlTWN5a21iSzhkKzJoTTErQWZjY0RuK3Y2VDFxdnRiL0FoZzdYM2FkMUE1RS9SNlBaMjNDSEhTUkw5S1NjQ1VHWEYva0RIdFB3eWFkWU12dWhVSXFKU2pNeHpNZ1ZqUStxdGh2eXFRdzNQOFpPWDRkNUpkdjB1ek1LcUVkeHdGMUkwRThLUWdSQ1BVQ2YydGlzZUhjbW9zbVFhWURKWFZpRE85Q1lGYW9Ma2h5ZWdlRW1lYldvRlpZTXUzOVNLY0NITUw2dHNuakhBNmpvQlVqTjIyb3dXa2RjcVlwZTlqYytCMVNjb1JCM3A0VS9PK25pMVNtZkpSSmpnN1NZQ01oaW9tdnJVaXovVUcvek9Va0tKZVdUWUFPck1Pa1Z0MzgweVJaSlQvaFJ1UFg1UnhNOFpjR2V0YVhvLzc5cFNFUmFNeUdIcWRvWEYwanc4MXJxVG83UkV3UGtnNTNUOGNhQXdzeEk0N1NKQ3hSYXdDMmJSSzBmWFMxOUdLc04yRU1uamJtVTJuaGRKNW91Q0NOM0N6bHQ4M0U5SHJIZ0tNVDhIR2k0L2dMbmwxYm81RWttblAvMW1MaGY3SjRTRXc2WXBvNU02V2hyNmJpc3gwTGlFTTFHYVJWRU9SSG9pNC9zUnBGRHdDRUtUMUw3MmxzODNUUkF1RWRVeUdYWmU0RlQyajJYdDR5R01GK2lSYmFaZFBMNzV6eEZIYUlPVjAxYjlPRDJCb3duOVQ5YWVZdkhhNnNsOWdzN1ZDbU4vYlk3WEkwL3JnMm9lKzNLdUVYRTRGeWxjaVlISndwOG0vcnlWS2JNU0hlMmhDOTkrb3R5QlJOR2pJZktCMzdzOFdwaVA3WmZFK0FNZUo3TEJKMFIvanE0c1QvMVM3VzhKakhtcGJubVFrMFRKZzNaVTBFaU1jZTRRcThWNHovYldhV09NNmJnVUg5aEMxNlh4YUh3R1FvaEhkNVhRa3FZL0pqR1dZUGlNblVFTEFjV0oyL25oUHJGbEs4R2hFVjdFYlBjVDQwbi82OXNwVFFmN1lGalpkWVZ3TXlBTXBtT2pUc3R0VUlBSjFHVTQ5b3psS2JRelNxU3Jsb2hJWUZPWHNUenhQdzFOWVdFcVdWeFBLcVNpSS9EYy83SFdpMHd2ZGtkZURSUnBOZG1RYlF5UllKZWlaQWM4M2x6aWQ4bFZka3R0dVRweHI5Nk9YYTU1RUZGWG9XMTZET2RIT29YNE9IZGxsTVlRRUNkK2JwaFJXdkFwbjdmTnJTbWRKZFpBRENxVzRFYURmbi8yQ0g3R1V0RXZ2aFY3OFNXclVpa3ZKTFBUTkZaUTJ6eWhPSWttKzFTTEV3UldIQUpxdFFLTUJUcTN6Rms3M3pWVXR5L1VwOUZhK3dpQmY3Tm5VWDE3UmJDWUJiTnp4TDdYY2xRZkFlUVNLYklTWlFyT0hvcFc1b25QR256Q2dRVmZROVZEQ2R1UjJ6RkYxU3MwTS9OSk1TMFh1ZDhvSm4xQVB0U2Z1eXhOWXlBRnBKazV0OEpCeVhOWGMvTU1jaFBQRzh2U3Q2VzJSYmJhYjhIR0tOUFQxbUhPaUs5M2ZVRXJTMXRaSXMzYjV2K0VJVDdwbFRjZDEzVVBTakI2czlha0JCdHp1bXgreEJaMnhlSnl1RDh6SjhCV2pHVGhqbjVzNHlMMmJrSWpFRGM4OU1uVnZHRlBBTEhlcGRMQ25jdWdGR1grOHdMZ2FVNVhhejhwVGxLTFhHSjU3c2ZlbG0zV3B1L0Nlc1luVkpmNzc4MVZGdXlwbTNaampRT0k0VCtVN0k2SHVOMFErTVJ2NXZteDV2LzEwV213ME1pM2Z6ZWRLeVVpS0pKdVVFdkJ3dllLTWV0dVUrc055UndBN0d4MUNTSmZDNlF1OHRBMGdEcUE0dExmbUN0aWhOV3dtNC9ZemZDdTZqQU50QlFSN1duRmJoSGp4QXJzKy9ZVVhZbEhFUUx6NEUxeTVsbUxhblpiRkE0cEtMa3FIVndTV3BsYmhRbmpQZTM3ZytxeWFCUks1Q1QrL01VVG0xRmR0YmN2alE4V29xSk1jdGtNeEljd1V1bmxkRXhIUXo2eTVzcytxRHVJSU53dTJnU3ZTM2RJRFVUUmpxY05Md2JIZUxMbFgyS04wbkZHaTlvVXlNelpZMVZ3QUd1NG4xLzhHRExEWHJTS1JFR1drajZxd2srUGl3dDBaWUQrQjI5M0o4bnBuQTZ0V2NRSmt3YjZ1UVM4cHRXNTdJeFNFRG9ycmZyNmFqWjVtUVg4OUdoNDhBelNzNkVpZjFnOTQ4VXpNczc2OVltZ25EZm05WFUwZVlBNTVJcnJ3SFVZODJSWnp5VzdUeCtvYVUwOTNrSkNQMEF1eThPTTUrRE02REZyRFhaR1JRL0RQVW9rVzc5bkpHVmhWTU91Q2plaEMwWGlhci9BYUhUQ3M4ZlBRSWFhQThsdmo0Q0MveFVvR2Z4UnRFNkhmd1ZXMmptUHNiL1A5ajVYWnROaytSQkdTaUJCQm9XYnVTVTNSKzZjUXY1bkZRc2F1cE5yQUV1Sm9YNXhvMzRNWitpL3JLUktwb3BVT25wZmUvZHZxcytLSmFNNTQrSktMZ3F2Vkl1aVlCNVBFREtRZEFUbTFoeWxpWE5jaXBDb1FHaElncDFHcE84SU0yMVB0aCswVzZ1c2ZDYmY1NjMvcDV2UXpVU2k4MDV2Vy9qTUF2ekZrMnpBSGRCcTVUb1RPdEV0REFrZnpwbldRR1kvZEpsdEM2cGd0VHo3NDNwRitiMWZTdmx0T1Q5d0ZnK3BmcHVkOFE5WDZSc3dSb0xoaWJRTlB2d2FXei94RWVjQ05RQ3d4OVQ1SkQ1Ylk4VFhRYisvb0dGd3BVZ1VaV2JKaFBlYURBNmhudmkvRWovTjU0L2MrQmVaRmwvOXRlQ1FRM0hFZ2NNTkdMeHRPMVRsY0swM3FpOENOWllXUUxhSG1FS1ltNk9EaEJmSEt4R0NtRTBwQ2o3UTdTMW42ZCtHZkkvNlNFalYwa0FqdUtOMUlYdC8vS2VWNnJ5dWdmVUhGT2RINWQvSGl1L005SER6TUN4SzRWQTBPbHBQWGVjRUlQUlh5V0dBSmtMRFFXc3lwcCtSb1VZeGl3Z0xjS084NEdlRzdtcVdJcmI4dDJQdE8yYjNpeFFYQTZ4WkpYU2hhSG9CdFFSd3plcFVlTXBYSS9RT1ZJUzQvN2srYVFEVW5pQkJaMGM0WVo5VENVb3cwNjFHTTRFUkZZbVNNSW83YmZqUHViZUFSMWtRdWJCZlVIL2k5RWN1dFkxN2VibW5KSkFiRWREcGFRQTJ3RFZTMGwrdXloN3AvdHlFMExiNS85T01CemFFOWZ1dWhVV05hZEFBdkQyanlpRjlBNU1IWU9JcU1TUUwrSHRoS3FlSUVqN0lDNTZhM0dYUlRtYk9pNmIvZW5zd0xmampndkpKTTJuaWQyMG1MeWtWeUxGdUFpWWJ6MU1PQXNabmZMK08waTNJUWcwUlErQ1U1M3NtblNrZG9IWGFzU2t4REJMbS9TWEdWNzBNN21HdWRjY25RRWVuM09SRjU5c3oxd0JXNG1WbkliWVhhYm5UTVJhV1ovV282bmhPOG43NTZpeUVuR1NuKzMzOGE1c1g5U2dPSVBDay9VWVpOSXVxQUJ6RmY2OWlTdG5iOGVrdVVzQjhPNDlFK2xGQ2Z5cDhlNE1pRDUrcGFkKzU0dDFYNk1Rb1NxNit4MDFMY2ZTVkNVZlZ5eEVXY0sxckFZNDI3MU5nZmoyOXFlZm1NMXpBb0I2NGdveFpIamNaWnlkbWxVWVBiMjFYU2kxYW5wQzdEWFRDTmpvbUttUk0wNWZOUkFlRlkzSERhemZUSlhXdE8xVVExdUYrNjY0ZDhEcmFCQyswc0N2a2J1N3p5ekR4VGIzMHBxb05qVEI0ODZXRjZzL2tPN2FiUWNENVByN3JXajRoZ2RkUGxGRGowZDFpNFltQ3NBREpMdU5nZVdDbEdxNnkzSVFNcHhUUE1uWFFZV0lYc3YrSXkyOCsvYkJqQXF6VE9DUmNjck4zaEZla3prV3ZzbDFmbytZK05MNWFBTC9BeXJJRnBVZXZmaktrOTVXVXZ0ZFp6d3JudDVqRTR5MWRHUHZQUzdKSEREMGZ2TS9jdW5qT21vSVp0NXJ6NVdleThQRSt4Q2IvUW1jUlZJRjJkQlBUVU8vSWtTVmVxalJEQTgxZU84MFFmcDNiWS9hdGE2cXZRV1Uzd3Q1OG13bXVZZm5jYVBYamptNk15dWNzOWlkc3VzaitpZVBta2FlL1pqRFQrbzhtNjZndy9wbW15RUxEWHpST0ZJUkx5TEtueHpjcE4rRGRyWDRkN3pRSk5xYmUzclU4aUFMbUFrUUJ0ZUZVdHlkRkNzY1F1cUJuUXZrT0xXbjlocXRxZkdzRWhWd05XVHl4UVpOUGVlVUNDam96cWkxRURKK1VTTml3aXI0TXVHakdUb25BZ3JZcDdldFJoRHVmM3RUL3FTSHo3UGdweEU1RzdybnIyOHJGUFBER1kxeHpSd081NGthaEF5UnlGMkRJWEdQWWo4d2I2UCtxNUxoZXNBellpYkFuUGpFUXYvVDJ3RFVOL3VtbVFoemV6RnJNRXpBRG1UYjlmbys2aU9BOTd4b2FzblM4YXh4aFE5QzU0TnJDb0Q4SVpxaGtyWDhMTGl0alY5TmtZL2xYMm9DWmJrQVRpeDJLMXB1UlRCNGVzNDJhK0swU05SQkYwZFhKMkV3UUJlelVpMEhLRng1eG9yQUZPNDlFOS8xeUJRc3pFelQzdVRVSTQrOHhXdVFOWVpUeXFycmNKUmhHaGt2Vjd2VXFMWHZvOStSb1JORlM4QnVWY0lxME5kWDF6dmJYY3ZKVGZtMEYrRjVlODZUdnpsNml4bzdCVThLZWREQmZxczZLVlVFMmhQeW16TVQ4SVpycmxDMnoxbG9sb1UzejNyZy96NTBHVENFM1B4bU1YY1A5LzB2VDJOZjQ2ajVTQytBR00vWDdab2xwWEpqYkRLOTZGQ3BFT2hOR2FMOUduYWI3UXNGenBLWjZzU2M3dXhTOVlGZ1FEcUFuZTgvbmlyNkUxM3FVZStBUnc2Mzloem9ZRjAyeXh5M0hLSWpSdG55dzE3RHUxcERMRHB3OU42bXFGV0NXS04rWGx0MWpaelFFdjJTbEhacVI0bWxKekc2N055Z3h6THBVUlRTWURPWmppZU5wdmNERFlpRnR2M0xWTFBpMUVMdWxGVHVmaFBJZHF1dkx4aStaR1NET090OHhMZTdML0NxQ29HZmRRN0xXOFJ2SEZuZnhSOWlHV2pWQVROVTYwZHZtendjMWxvQ3VEZUsvTWM4cnY4QzFnVTJOdGk2TmFuSC9WRTRoc3gwQVRUMFJwSExyS00yZ3M1S1FmT0taYVhwQjJOR3N6YnBjME9xU0lvbng0bXRPRTg0cEJ6T2VQSC92VnNYcnpVM3lFVGRER2t0S3VmQjU5T0hkb3hSL3ZUYnRUQVQ4YTBTaXkxY3E1aXUxNHhzaURsZjFhWEdZc05JdUVNdmtJWjFRMTBEcHdRRDdzLzNJMy8xMW5rczFXcmlTOXVxVEg0cmI0dHNIWktDQ1B1Y0p5NnFzOTNsazdkNHdNZzBBT2JrUnpmTjJvQVVrNVJkQUJXTHE2eXBDb2hlWHNZWVk2M2NEQnFIM0JJZFVsSmx0NzI4eElBeXFmbmQ3dkNXUHY2RWJsOStvRGFlZ1lmKzdlTVE5Rm41dHNHMGkyb2ZGb0U3R3hNcFJLUFVIcE05djB6NnQyME1aUnN1ckg0Q1NJNmlPeTNmOE1DVE8zcEcxVVI2R000NFpYaWxtVlhuU2JSOFAzc2d1bmdIczNWRjNQVnN4WXMyRFpWUnZsKzk0cmR6QWlneEJybWR2d0N1K0FpMWhTRUpQV05raU9BT3BVd1FpWGVpa0VsWG1rYTZBemVzMXAyczV3NUY3QUN5bGhpS1VjU2RKK1IvWVlzcUtZZlhOaGJPTGxqL0EvKzZMRjl5RFhDdzZSVmFoL2dhRi9NNlRhUTd3U2hOQmgxTUg4YWV6cGdpb3hwcm5mbVNWRDdWZU5USlZXSU9tRzVCT0JLK1dDanEzOWF1YzZ1TjdZK2trQkp2dnVQdk9KMFFqU0lyWm93akt6aVdQaE1yY3BYLytBdXpib0hVdmxJQjZDeExJVzdFYnh2ZEljbHhQSjhNTUdzdDc1VTFTRm5lSG4wOXBucmF2c1hzT3FDS1BSMnE2bk5UZlh0aXJoQmhudjlyUVM1SXNXWVZBNm5pZmNLaitGWUtCcXk0bC8vT2NwZzdzMEtyUGVaU0w4TkRHZG15QmVvdGRKLzBFNTdiUXZiVi8wU2lEeVFKQUhOZUoyMXhTckxzdTBPOHlMbWE0dWE0ckhPTjEyc3NNM2JjSHJyRjRTKzVtdVQwTzRYWUhobUMxemlmb3lzNS9SQnJjZW5WcVV3d3ZESHpTcDN1TWlqdElCZHE2RHJQY0l1TjBKR0FLTFZEZGNQKzF5UUxiRC9PWk9zTENkU0pjQitnWTZXTlFkSDBoYUVESk5DSjg4dUN5b052NStPOEMrSStNblZpNXB1T294dGl5VEN1QW1PTk5zRFlXakpBWGlYQ2lTVXhXVHI3VE5hZ3poZGpuaVltYjV0cVNpc2RKNnZVTlhGYStJcnhUOU1PYWg4eC9hZzc5ci9abUF5cDNjWUVtcWhxeFZEcUQ1M2l5S1pyanB3N3pUVFdMUXlITlR1RGozOFUvSC9JaXZTN1FEbURKVHBLaFdnOVZVL1Z2Wno0a0ljdW1QSTNvd0s3STRMNmdsNGh3V0Nobk9SZDhsKytEWDFwRDR3Y3Q2a28wWW9hTGJiK25mK0IwOTZHZkJHcUMzZDlxYlBxU3dXWncyT09qdzI4K2ZIbTkyVnBuOFBOdXFsb25xVThVT2p6UHh0cERlRS94dW85TzRHT3Y2VzRBV2grV2thZWF3M1A1MVpyeEczeXJBNno4cGY2VitnVEErWDl3YS9kRlAyL0pOWXkvcmRJQ2VMSXRZc2pZZFpBQSs0SWxPbTFMYUUrTEFpak5NWGliQk5jbm5Sc3djQ3FISjRVbUVOQlBhNDNIM3Qwa2JmVkF4dGI2RU8wRmV3dGhPWnhpSmo5TDk5RkZvT0VxK3ZJY2x1NmR0YWlOdVlYbUl4NkxUNERzaGlONWVLQ3ZYSCtEK0MxOXVmSHk2QlFZRWFFbEQzZnk3eGg5MmgrdEVBVjd5VHdhZTJJZHVVaTh6dm1GMUFYR1dhNHZGeGl5N0NHRXNHaVJobjlIemlYV0ExS3NUK3JadGJaUE5ydmZiWEZTb3RzUXJ6SlMxcWhKaVpGL0REalVxSVBGTWlDMmxpSkFQYWxBVzRwdVoyYmlBbW5iZjIzNDg3VUc2eUUzT2dBZjh5N01WbHBoOWRKYjhMQTZ3ZW9ZZzhneWpuc2h1empNMzJtUWUxT2Z0azRabDVCZFNqTC9LRDEzeWZtc0NVQzA4Z3ppODkrNkFTeE8xVS9FeW1RSThzdnorWDB0RGpsOEdxR0RFRjdaMkVheGJObnpCeU1BemxlUkgvd1lTbFE4YzNkQ01UbE5SWWk2NTNibTUwd2d3Sm9wUml3WEh3N212U1VLdVRDaW9waTl5U0Vwakc0YmpPNjhNbG90eEx1MjI4Z0ZtY1VBRVZzTHIxTXk0bVhpTTVDc0FXOGFXOUM3UW5IRUs0aGFNY2F1K1ROY0Vtb3pxcUVHei9pdEFmQkI4M2Q0VnQzVkhCRkZnV0JpYmhVMGlsRm01OEZ5ajllRnR0Vnd6S0Ixb010QzA0UWdhK016aU9jbFY1aWxSVFphb2w1dzExSXFPeWpLNEo0TFNodUdNRGJYQnlXNmR0c2JCZ3hwelgrYStuM2V3L3FPUVZJZnFROVQ1bHNhVFhwTFlRWXZoLzFtVUszVGRuTlVSMTBNVTVVd1g4UFFQUnBlU3Q2dTAyQ0NxekFLUWdYTzNXMWRxNXdtWWI3YnFCSG1lNU93LzZRdmVZelVlcFdWdlYySyt0bTVHYlIyTjJqT1FXbUpPQk1KS0xGYzBCVEpjYXRxa3dCU3ZkY2ZuN2dtY0xZd3ZqejNxV0g5ZW9wcmMvR2lZVnZBVjYvYlpjR2JQajdpcWI1ZDJKRE5aTk4yWTc5bjJ1QmtZdVl2MDU1TUFoRmIxYTdaSHYxbzFBaGZoR0ljV2hkbWlZeFMxdy9ReWJYd3RCVnRPKzgvcVVXcmdKbEUyODJXVGFtMmU1SzZDZzBZbmIxMGwzb1ZubTgvdmx0SHVMMUM5Q3hreUl0akYzUGE3ODhYYlFTVGNTUEh3Qi9HSXMyK05aTGlnaUtoVTdxUzZXQW53b0o0WVVuNVlEZ01kSnhqbksyemFncXE5QUpzdndTb1htN2NXYll1b3FRSVdKWS9rZmtybmM2OXNJWG44dlJ2ZDlLTkl1NGdONVphUXlFaTBSMmR4algxdlJacUFXc1JqWUhlQXdNWGhINjdWQjk4ZkgrOW85eTZXUDM4c000WDdjZ3AzS1REZ0d6M202QjBWTEF3Q2NneEM2eFZsdUpwMW01dVFxYmppT3c5cEhJSncwK2duQ1lVZHJQVC9kWUI3dHpxV1gya2J4Y2VaU2FPaGdJTGZSQ1QxNFM3OThjQktmeTRoNEVra05BaGZVTURhYUdtbHpUTkpIRFVwWGVRUEc5T1dzdGZMdElqOXJUZ0ZhemxrSm1pUGNEK0Z1ME5yR0hyaDBjNERUVkhMQ3pCVHQxeDNGbllkcnBVRTlZZWJhdjZmbXFpcFg3RWFlM3U4ZTdLbEdjV3Q0czk4alR0aHpZYUhCaXJnWk0xUG9YNjJXK00yaXUwR0ZWbkVlbnh2dzFBVU03eDhXYnJhTW1pM2V0dWNEVThubWVHcVBlTjgxZk1QR0d0K256aUtKZ1ZNcFVCdmN3TmtpaVhNOWZYU3Nwa3hBclVWZlAzN0lxWmRkZ0trTkJza21FSFZDb05va3BhbjREUDhES3lUMS84Uno4VjljTjZTb2lhbU5TS2tWcGs4Z1B3N2dKSllscllpQTlreWswWVZwQVFNNzJKelduTUYrQ0ZLaXdqb0xYcTlKQkpIZVRmdHE0QXM3YnhpaW1uL0hKbVYwQzA0NnZtS2I5VWl1Y2VJYU5Ddm53SHlvSHR2QVEzNFBRbTBnNDhLVkJzaDhMbHpFSG4zMDJLVkxVMFpaQWhFaWZXQy9uSnNSMDZ2NDltU05Na3hIdXU5L0RqYmVYWC9iQW5CK3NORFZ5UFNwOHRheUtKaWtkcHpMaDY4WGpNcnlNdkM5Y1JVUHF2cGozclhrekk5U3RBSVdKRmxLNWdiMXBITDBrQW9mcFJidmx4L0s0TjczRkJwL1R1RkdFTlNydko1NXBMZEtrZE9FZVkvd0lzZGV3N2hRbHk0cFFwNTh3TGpBR1FFaGs2Vko1NGVHcG5lSDhLV0F4SHFDNHdXNktwbkdJMjR6emdWOUhwenNkc0h5VVNwODVZRFYyWldBSzVqY1ZGdXhpeWJLRmlvaC82QWtTYXNyTmVLVVhDQ01xY1hWWE1vOWdjVUh6NEt4eDhaM3FxaVZxQWMzVy9MODB2Qi9JaXJ3UzIzQ1JqVzhwNGo5eXhJWFNuVlVLZUNGaDVOaGlaeTJqZkNwaGptTXRRd2V2ejJrRkJJRnp1MFd5Q2ZWaENmMkpIaDJoSEU1d3ZoYzdnbHFhWHpPd3J4WlZtSmpVMUViWXNpWFF2VW5DeElKcXVVU1R5UFpPR2toMHVrbDVxZUhLZUpDUDhwN3ZjeFN6VXI0ZW5vT0hoRlFFRk9WaUN2dVBGaXMydUg0Ri9VcHE0Q1NpWFZ0TVVZdGpwbS8zcUJVbFYwaXFLMmR5K3FFZVhTV2Z6c2JHdmVBU3RaSG8yek4vdFpTZDlHTkNMTXluNW1VQkNabEtZei9XVlJVOFA3T1B2dGZBRjI2dTlHMVpkd2ZYNzkrV1EvNTBROUFnTzVkSG5lamdhNXRPck9DQm5XOUFuYVpFVFpJdnAvbUpPMGJaQi9yalNGaWgwSE9aeDljdXBqd1h0TndCbVBadVQzR1pjSjFFYmdWN2R0YUtjc24xWXAxT1JyNnNhZUdSM3NCcFhRVmZlVkJDVG50K2prOHFuNFRKK2FBS3c4UmlUSFlxc0E2Q25nM3BwSzJaODQ3VmNkOEdrKzAyVk80QlV0aDYxOFpkMGVMVW90VTM0enVCOGZQOVc3amZmTEorM0pGNWtzNFNDNVZGbGVUKzJGNmppQmVqajh4KzhSbFN5OVVSejVqWmJUSDBDbHB6OVMwWGU5OGg4NUJ1ZjBTN1RaQTltZUNtYzFhZ0pSSFp0QVQydWJuUjFJRmRmaEZ0MVpMaU9lSVMzMk1jTk5YelV2YVBWMHlRRDUzVVVLL295eG9HdW4rbkRSVm5nVVM1WnJvc2tyZ3RkSElnOWtFdkVLcWI5TldTSWcrazdLc3BzZUNUVXh6a2h2WmhuNDUvakdJV3hQaWZLOENoYXliUml1NmN6ZndLR2kvSktBTVhUbm9ZTVA3eWNIL1BSdE50djFRYzdKa25McG40czVMVEd5RTkyNUpGY0NzMGlRWllhUEFoaWdCRDI3K016czBKVkk0ZnJSMEpLekJLQXNYY0grd21vaWxtRVgwL1lBdmlsRDBOYlJ0L0dnN0ZHMFdlMHZXdUxtSlcwRnJDanVxNGozNVQvMUh1czlxRFlWdDVRQVF0R0g0WG94cUNabldBY2I4ZEVud0JhZXAxaHA4NUp1eTdvVjRYL1RZNXYzN01wWXJyc0NtejJaZ0VJYWFqTnFhMlZRYytqNDc5T05XNEJNUkJOL3l4L2V6QkcvNWUvL1ZOeU9vNG5oL1Y3c2NENHltNEtmVEh1RjNTZ1ZmUy9ZaVpWbWc4dkRKY2Z1NDRlYWVyV0hJYnl1Z0FRcTluamh0ODRwZnFoc0M2YlJLRVBqOEdieTB6Ly9Hck1uck1nZlBGU2ZQTTl0U2JFWVNGU1I1Yk9ibXZkako4OTg0bjJ4cjI3OXZlVnVvRzQza0RxcU5tU3ZuTlFwTnVzUk4wSjVYdTFwOSswb0JqdCtYemVycVA4RExOeGNIbGdVa0NtTFRPRWQ4ZmwyMjZWZzd6bFRQN0Nqc3VldkYvZmh2UmtTcHk4dlFSbVQwSGswOHdCeUEyTkR4d2ZoZHAvSnQxNDN1NFdqSzNkZi93cHZTRVVZSWZZZFMwcHM1QWxERXAwaVRBQVdpNVhFeHdWOS9RS3RLb0FZTVZ6MDhHYlZJbWZ3amxjeFZnSDlESisvQjMxSzB1RjdNdDBVWHBmOGNNTHg3RWVzTjZyTVZJSHVtWXRGK2pqZ0tmOHBydFRGdnp5c1plejkrK0dsMnk3TEJGV2J0V0NwdDNMK09nNWxJZ3ZRWTAwQWZoV2pEbGhDV1VoM3lZandoeDdaaHBETmVBSnJhbGpwOW9aRjUwZGl0bHVYeFpsNGh6SndiN0dZdlNtbFhhMmZKS2JVby91c0xiNkxSdEdiY2RrbXpud0cvdHJHcEZSVStPTGplUUFSVWpOeGhwTG5SckZWSG1tZFdFb0F1K0NLR3BKSEFmellYQWh4bHdWSzlNV29nU1hiMHJDQVBBMVl4ak1Rekd4VUZaNllUbkVrSzF5SDAxY1NGVHhNVHdKZERDWGhQYzJsTjIybVpZcllVZ1pjSGcwYzRjYWU2WXlSdlZ1UHlpOTVVcllDOTFnN3lYZjZvMXFpMnVqaHNHTkpMU3FzSTNlUHA0a08rMDZJWXorWktlN29rRUhjNUdlQW55Ty80OXRKdlNIa2drQ094V1VQY08vUUpaRHlKSnlsRmhIVUlmSEFMYmVFMnhXdnBTRDhDelNwSEpiSVRwZGZ6RnI1QWNxNWhJamkxeGhkSDFSZnl5MzFXeE5CR28xcWVQZHl2Q2VNaisvOFBtSHNaQ3cwVTBrRnk1TThWRS9vVUpYWjB4aGw2MVE4N0dEajhmM2MyeHkzcjFzWnkvWkJ2TG5NcUN0OXZvekhxVW9CcDZCTnUvbGR2V3p3MWwzdTV2YXBiNWlTNmFnU0RqcmFxOXhyTEp6Wjc1WW83SUJBdU8zb2huRFlwWlJjOXVPMnh4bnRqZE5rTktFbzZVWFRKa05paUxIeHZmMWdMcXllZ3VTZWd1ZXYrQXQyc1RydjJ0N0lTQWFKaTRwUXlONkFOT1ZTUVRRajNNaEpTWVF6a0tiNFRMTlBVTE9CaFgyVWpmMFgyU2JPcHpGOHFyU2dqbVFnY3lEeitpNnRrT056bXZRL1NUNnh2SkdHMHdYZGlDMFU1WHV5WnZHT2d3aE8rMlQ2SW9hYWNKOHF1MzhUWE9pTHZ1b284SlNIUnROTGRueWFXNmFZSTNObHg4WU9XVGdTcllLb2VXTTdRUGtObFVIbTZtM2hvRXV4UkN5WVlWdEoyQlBmWlE0UEp1OUJxTnFmRGVTQVZobEhBSGFucmttZlFUN0d0SHpENHFRRFRZcThFWnEzWnVHclVaRG5nQTRKbEQzYWNUUExNcFdkSm13Y1dBcHVON1RHb0tHQ0dRNnZWZUxTVzVFZEZLUExHTnpscUtoenk2Tk1GTlJ5ejRkQlVyRHh0MEduWDc5V1VBZEhlUllqUC9GTmFydGlodVpQVU1zcnhmd3NFWERvMjc1WFF4V0ljSm0vWHlFUEV4VFkxeGhVNXZUUnlQSmFXVHBPSXVzY2x4UlhMM25GaHpiTzJYYXRIM3hTT0xPdWFlWkZ4SVBidi9tYXFPaGlxK1hmRVVMYTlNVmZjUW1xTGxQSFdBRHFnR052YnJtaDZYaS90NFVIdlZKY3pKNGFOQXA1RXVpNERQcElRUU5sZEFIL0VEZHBvbC9kRUFsb3NQZHdnTG1GallSdWJwaTRYbEdYZFJraG1oL052ODV3WHR0U1BaYW9SemxnY3EyTlhPOU9nY05DMXJtbjZLajRrdWE3Zlg4elhIbjN0SE84VjhGaTdySG5udWpHZmk5aGUvWXdONUpuUjJhUlZUaUl3Rmk4KzZpQ1pKUEl1SWUzbkZzSXRzY0hSNmZiNyt3bzZsMTFyNG1Mdi9aeDdPalBRMWRTM3lGUzVKQkYyMkZxVWxUNjc5VkEzQktFSER1dWExQVVlN290RlZxd21adng0a0dJZkNhc2dUVVVDOFlqQWhhY1o0NWp4Z3Z0UEw3MVFpTmdJeVlsY3VIbzhoZzArK1UyamJwb1pWbUQwVlFqcDcweDJpVGtWT0ZnaTkrT2gwWFFjWFlJalU0N1BMR0dNdGpKRGxFK2phbzhRcTVDTVdGbmo1dDhheHMxZmlOTmZJMlhlbTN1SG1BK25EVHduZWNmN09ONExGM3ZDL2NldmtWRmZEeVprRldnZDk5VW1BcFBvSWJpd1lIeTVHTGpndS9jRmp0Y2hyYTZxaXVGdFY0bDVOcDdnZXJpTmw5MTA2SCtYQ1pqM3lVa1ArNHdMVUNnd3AzeVFaR3NHOGVZWkZaT25KTjJyZ0dvV25hNDNUZEFPUUtjbE5iUi92M1RMVUFzNkgxTEtscjVYYi9TQUQyK05mVEc1cDNGZlBjdjNHdFpybHJmd3VkWURkL1A0Q1NGK0pyWlBVRHMya05BMzhrb0NiUGlFYjg1WUlkbHZYcFlLNUUrVmpvNy95OWRNWWkwYWh2VjVMb3FLY1JsRW4rWk1RYnl5dkF4U2VJeGRDUUtMcENQbWg2dklENWpsT293ZS9HMXliNm5RU29STUt6cFhtV0lNOTZLek40eFRhMmF2MWsxeVVoT3BUc0wyYzczRkhtQnQ0U3RJb0xqNitkeUF5MDIvM3dWY1ljQWZDdm1aSWE0enFmZzk4L3FwTjd4aDcyTkNaZ2VnUTBsa1NQSjlXbTlqK2dQbE81T1RJTFZJMzFqaHVCTmNHdWtWMSsrbWtOMUpIcWhRZDcrUitlN0M4dHd6WnNKNEMwZEdsMnc4aTN1aUtlVjR3WUZVcUU2bFlWZDVTWCtzcURVV0t3Wk1YVzVQS20wQlNUMXpENW1rNzdtRnhSM0FqQzFuNUpPVm1VUEMwZTFYL3FaM2RIZ1Bta0NaRXA0eDFBeE1ueHBZT09iQWxZZVk3aWJHOWxSNVdhL1ZXNzJNcHhVYUlxaFRiaHY0U1Y3S1lwUDVpaXIxL2dUWUIxUVJqcXg3MkNCZGZpMTlxd3J2T0FpZ0ZKVTRwZXowcm1KYlJZN01NSUpndUlxekErcE9JS0VQOXlXdnB2aGlsUkVzYm5DcFRCZFRxZ2ZIRmk2RVp0NVJidXNrelFyaEp2cUJITGwzYWdxL1J0akljMmlyOGlkbVpaMTM0VDVtNEdZVFYrdmxlbStvRkVsMTJoNHJvMUxpTDFPNjdQcTVvVkRZdFFRUWJQcGVLWi9xV2I5aEJDSkNrdUlzQkQ5MDBtTUNqT3dXVUROVzZjUlJ3T1JaRC9XRjV3NjV4OEhUS3hPUXAycDU1SEhkMDViMkxjbjlBejlDL0pRNTl2RUtYWWM3OGhUUkhUcUFscER3eitNZGEzdStqRktOUUNNZDNuV05UcUxRVk1vNFVTT1BkdFM3UGR3dlNnTTJuc1ZXNDZlMDFzNTNBL29YRTJ2ajlIcmZxRE52SWlSRDUrTjZZcVpQNHJpZ056bi9OaXI2WllZRU5zSUxweFhFYmpZTml6RXBEcytWWERldWd4R2l5aC9iR3p1SDlNbWx6d25mZEdmbFR4bE96eVFnMGpTZURoVzQzdUluSVZkenpNT3M0Z2NXRDJQWldCcDIyOWRVTm9WTFJwU0laVjBITzRLbnBKQkF6UXBXblBBb2ZOZUxPOXVXTVdIYVlpQ1ZVTlZyU3luT2swS2RmUURJSlBIWnNWSEJhZXFDb0k4YWt2RWF4bTBNUmxsSjBPVnhOVUNDbUpqZ3BQd3BwVVdyVmVURHdkRXpQOU1GMkZPZmVrTTA4ZllidzNXTTkzZkxVMkdxaGVoV1FSQjhJOXVDbjdIYWFlOUhrTVpBZURENDNyMjdRcjZ2M1RSVVRBd1FkekUxRFlHUmNRa1RYUEVOcHZwOFYwY2FnYUY5dWk0QngzdEM2VFJ0RUFpN0h1b0RabXdlK1UrTVQzdFdqT1VxS1V3YUFtRWNTZG41RHdGVlViUnNqUjVidVlXYkdiMGxmb1BpVUM4WEVjaml1cmpJaTdMZDc5RS9tRDAydDRldE9BMHUxdGU5MXR4SVBXY2M5Uk5HQkNTbXJDYlFBT241andzUnRoSHBqNjlOVm9rM3NPcTFKT2hqdVNlSjFRNHE0L1pmNkpKS3QrTWkxL1hLdlBzZFlHVkRGWmtlRnJZcVl0bDVGZ0VsU09MYnBlbzBzMmo0RkRwQTlmZDhwNnI1NHBMOWpad3E5ZzhEWnNmeVdTMHI0em1KVm1zU1NKVyttQkZQRHJkeXhyeFNXUTEzaGh0RXNzbTV0QTViRjB6MVdrSUJ3L2ZzL3h2NE03d3NLOFpxVG42RDIvbzdjWkNqUFEzOGltTE9BbkVSMC9qZlBwRzE2TU9sdytkOWw0cXp6aExBeHFHZWFPTTlITTlhaGg4RTdyanBTYTBaVlk1TUl2dEg4SllDLzl5aXp6NE92U29Ob1FlWVJSZEcvQlJhTUFpeVdxL3lqb2tSRXVMWnZjcnhyUWN3SXFYYmVMMDhMTXBlYjlabmYrSGJpTnZ6OTB1UWN3ZElWaVdrNnN4dzNGY3BaUWUrandQNWVsRGVHL3h3NUxzWFU4Ykk3QTQxb2hpSFIyY1RYOUpUTnZvR3hMRDlGejM4UGZqQ1Q1TVAvVTFzL1dTaUEwektLTU8vVlB4RlB3Z1RsN1g4SEFrdnpibmxlS2lrbGY3VEt3TzY3by85RS83TVFsNGMyWldXVkRDY01kekN2OVJEcUFHcjIxaUlSQllsTGxPYVRndERzVE95dTdKR2EvcUJmSGFDalhVMjZDWHVRNHkwQ1IzZS84ZkNYVG40VU5KYUI0RnUyR3pFUFdZMFJGN3F0MkNLb1poNWtrSWpnU1FCcGxBcGp3S3UwUnNBRjBMZ3hZMm5VZU5ZOVdzQ1ljZWRrWkxlQXA3NS81d1B4NUZibVA2aWVEUFY1eVBoMzJZdzMyMDRoc0RuZUU5VTlNRmhsMTM0alVWRVIreHE5L0FZemNBMVlEK0Nmb010TUpCTExJclN0dkU4K2dpK0M5TlFUOSsxYUJ0S1pWMk1UWndVU21NcXl4Q0gvaXhsck5qZDJzM2NkOGFLcUNZa2Y2b2k5cTBGUU9lUDVpMnROT3pLendVS1dUYkVsUXdqVzB2QldDUnZvOUYrSlU4ZUpmMzZUUE8zeTdzZ0FKVGFQVloxUjJZcUMrWlAySG4zamFobzdRdHJYZEo0WmtqcTdFenVVN094OTZCamQ1L0JIUy9ZQmM1bFFHUTlHdCtxZEtvRGtkVDdrRDcrU014WituWnkvUjI0aUEvTlVzTUtXQnpvR1R3YjJFdlZIV1BLVUZiekdjMjNmN3pLR1M2emlnQVp0QTRuclRmSHF0WnFXZlU5NGUwaVA5dGhoS1lrazhIWlhnL3RNbjZzMmFPOExxSVdxaGpJUm5kMHNyZXppSWVjUnhpb3NsQ2FBdENtcVc2SUFtaGc1bnc3TE9MTHlRK2V1MjY4ZVJiVGJNaVdteEtZOU1FNWZEVUh5NytWVXZ0OElKRkYzRFEwOUo1aFN2Vk81ZU9pTFM4RjhRNU9jTnFHYWJCUTN3SXlwL3p6T1FZVEx2allqK3hJU3p4SlN3a0FHRERHUnFvWmJDcnBoMVgyMFhEZ0d0c21oN1lHbStKVHd3MzJrSjlxRk1zNUU0ZGRiTGlLUGtFbXNXbnIxbFdRSnhWR2h2Ujg0R2JwN1BqUnd1NGFGb2JhZm43UUpPa2J2eVp3UDd6ZUErYXVuUisxZjlZUGdBeFRXSE5KbzRidG1GemVlTzYzNmx3bGhGeWxiVktLcWY5RFJWUzAyZVEvTVFBMnBUc1F6TnZxZU56NHcxL1RaUW9VV3dnNk8xcnkzc1FsRGxRaFVrczgwYy8rZ3NGR21RVGFoUXRrU1doL2VEWmhXWUZVYVBkdDFFUTBNK1UwSkRicTVaelk1dFJsdzI5d0xUYjJvQlRTeG4rS3dMZDVTTklSRnlua01BVzl6Rko1ck5GZjY1MDhmOGR1N09QTitsNDY2dVFRWUthd1VzOXpwM0Y3TWpjc3puN3lITTRnbWVwSXRVZHl6V3dmdVZhcnFYL0lBZ3I5d2VyNWRKdW85blg3ckZKU2hyejZDNzN4V2diYzFlbGlJYzBqb2o1RjBYV09VQnlWS2lJWjhTRm1XbFpyR3ZZZmZBTC9QdXhNaVpXYjN1bHFwcDVEb3AvbXE5STFGdU9HVTBuNElEc250VTczME0wRVRWcXAvcEdHQlNza2p5bDFRK3Vta3ltNWNyVDVSckhCWDdIa3hGeEZQQm4xN2t5VDFKK253TXpQNFZ2YXpsNkYwcUptbThWOVRlaXFzMzhMb2Rjdyt4cWYxeld2b3BjZ0RsUmN3by9mS0FPTytWSFkxbXJtYy81SnlWMG1SRVRRWms0aVZjTk1ETTBhaGJWVVRnQ2RnczBtMmxZOFh6bkNPMmFGSzRoWEhPRVcyVHNFWlpvUDA0Q0ZNVzNjRUpUbnR0cFlHK1NHWDFQTXpqUjZxMmVaZzVaenp1b2xJOGdvMU9CVnhZNHJHSngvemE1MnR3ZndhVkdVODZUVC9Obll4RlFMYkR5N3BJcVhpTXkwMnhTdVVUb09vTGxEbmR2L0haQXR5TFg2R21IVUpxREFNTldVeTUzUGZFRmFVeFJMLzE5a0E0YXBUQ3cwSUlmRjRMN3diRDZSaEZ0TzRhK2VYNHF3TXNucVRPTTJBY3FETFVycml0YlpBbUZ3VTZoZU96OUNzWjZyNnhjVytCdzV4bkx4ZFkvN0JQSndpTXB4bExYaHAwN096QVRiSDduVzVZNU1sUmVwSzBOY1hBTnZIbkhlQldRWUduRkdYeGlTVGJROHdWK1JBb2tuL2h3RkZBZHdZZkxoVnZLOW5xa1cvRVR3Vll0Y1h3NXM0QXp1YTMwaHRNTGdobThWSmFZQkNacUhNZmJnZUxQbFhqN3NoUVpNbzBEeHdjcGVnaFF1dGV2MGIxUmp4ckhvWU9QY1NPL1JHRlBrMHlGSXhESmRJaHR0ZjN2QzFYRFpXaFdnb3BBR2xrbW90NUIrV3BnR0MrMzlzWGI4S2FvOXJ2V01FQUQwOTNGb0FsQmpyTGhVWWhOdEFYbm5ueGZqY1greURzcE1XRHE1ck5mejNSOEppbDIwZFZnRXBkUGdYOWVkYWRYL1lyYnVscXMxT1FxN1NTcUlBVTNSMXlSZVlISVhLbXVQUFd5SThpd2V5eFY3TG9kY2Qrd3Y1V2dVeG1jZXhYZmJYSTVLT1BtYmN1ZlJPM2FIMG1uMSt0NEoxc1NnMlMwOFBDanNkNXd2bCtGL0NnUmRZcyt3dVUvR2VXZEdXYnNMcktKSmlEc1BpWGxTeSsraXBtS2graDJJbFRMck9vbkR6MW11MDZBWndvZHRLWXQ3NngrUzdsbjBQS01yb1Z3M1RCQUYvUDNibkoyQkJUSnppcCtPOVFpQmxpd05vcWJWT0N1aDh1dHdDdm9FVjRqZDUwQk9XdlFUOWFGNmFHVWh0L3JHRVI4aGJCQ2ZxU1I4VzRWL3lzcXFhdTBmcDBVUmhLKzU1TWZDd0V5WVp4SDJKSVZMSndPNGN1Vm9IeWRZSE5qOUNrVUd0SHpKWGZsZ3ZmRE1wRTVBUm8wbExaRWtDSUpyNWlMVjRGMnRHMS9HRmJKalMyOWdFYXd1RFJPV3ZyMEp2a0drdkpJZmtmcWtEU1pyME04dXNLTS9zRHZGSSt3dEpFOUNORnBMekZ2ZTJKTm1PTVEyMVl1YjduMzRkYUQ4YzNHTmhQbW9xT0dLc2pZdW5pZm5RcTRTZCt0MkI4Q1VuSWZuTXZLWEFqYUwvYnU3ZzRRbGxWci9OWVVXeTdOSTh4NStLQUIxRFo4ZXFEQUh2dytkdHBudjNvY3V0RE1nYlM2N3B5VjY0cWQra0N5R0w4T0FhRmtKdUgxVzdLNE1qbVdWVWRSQmNod3dYQ2JBK0dWRmlnZmVZdm5mN2c0Z0k5dWVJZmcwMXVRVy9ZemlIU1ZYVEY2ZXEyc2RES2wrZmplcWtabTgvdnJCM0F4YnNrL3hRa25ieWhLWGtkRGsxQ3czLzM3VTRmRmM0Uy95RVBndHJIdmZMckpnRFVBeWEwWlJpNkJlZTdsektUOUlvQlVINlFqakc1LzBKRk05eVp2S1M2Slpsd01sazV4R1BDeUM1UFA3MTQwaGg5eFpobGkvSmVhR1VJeUg3RkZFV2ppNVdWMjBsM1RVZWovVEx3eFhVS1RNMlVVeDgyVHAzcTk2ZGpXeHVyQnp6ckVzSlVoRVJFY3lFbVljalNKQXRzbjUyd3RzeGo5T1J4QjI4cXFXdFg3S1ZlZk01WVgyRnRQT3lDUXBQcWxqRlVObXp0QzhkWVJGV01qTm1OZ2I5TTdHaGxkWWgvOWYwSmFYeDEyaE1ScDlBTFNJSWl4TDQ0bkVnK244UmtFOFE5MHpYczBoRmFVdGpQai90elZrV3pUWUdtNUF0aGphWDYvNlZVSlZTZ2J2a2NtdHNrSjlFdFZQOFY5YytKTFFEZHRtVWZNRnZQc1FLdlZmZW82ZktqeElwVXJ0eURodjZ5ZGFjdWkxV3lLM0pnRzVTUlB0U1pjd21mVFllL0c1ZkttbWJ6amx5d2RTRGJTRGlFNmVpRkRYK3gvTHhiTGI2S1NqMVNFY0dWWlFvSzh3RTZMZi9Na2RmamFZWVR5eW9VUkorTmhBa1U5TGtnbHNBWWVBekVIeWVWK29YeDUvMWNNQkZQczE4QWNLL3pPZGorRVp3TWdtQzNHVWFOeVFKN3A4ZS9lcE9VNU5USjBwNHByZDk1U3ZJUmlaVGtjQTNrbU5RVUxEaGpQTTRReEdUcjNlL2M1by9BNFJ3MnlRYStYRzVCaVZjMGFoOUo1SEtSUlZHaXhPNVNhT21JZFJ5QS9oUXlULzAzYWFxT2FSOVZIQjhnbE9LQ2FqOVF6RjY0VEhFVWxVOTJmZVdxTkJzVCtkODNaSjJZSnUxU3UxRU5rbm5qU2lXcTNGa3BaUjE0bGlKYnN4eGlydVlJemNpVEQxWElqUEh0MG9FS2N0ejgvd2sybVJrc1hpczJCSXBmMUYxSGtwR2dhMXcwWENPS2txSk9nUWF6aWZjdmpqYW1DenhpS2hpSEFmWDBxaitSTkc3YzVjMG94bXlKTm9pMDFCVDJRRDNJOTFHdE1ZVzZocnZzVi96VTl3QXBtS2NxaDE1R1dXczJKV0xqK3VUTTV5N011NlNFTGlCajhtSEIwMFFwNlYyeUtub1VKK25RelhNNEd6RjBnYjNMS1UzR1dhT05tdVp1MlB6M2pUUmNNMVdhcTgwTHM5dlY2OWhNalpjbjE2eitVRDhLeW5rVzN5ZTlON3ZMajZialNTRFZEVGlHQ3duQkVlWlJjQVphSVRiUVJibHBMSUd6TG1SWklPb0J1dnNoWGM0YnFwTVc4NnZocG9KVnh6Z3h0VWpPWXBLbVBoOXJZd0ZrdEtaWWNTdURKYXJYc2JlcnpUaUhHd0tDVkJZT0RyM0VNRVlreTFRL2owc2F1R2l6NzRPVXYwbC84Q3hBMWVLNmxjRkJNVzJYT21wTndMbGYwSndDa1hkT010Vk8zN29QVHYyVWJnU0taMElGNDdhRi9JVmhmRmdoNFhqd08rTnlxaXFwSG9saHAyL0RFNTY0N0ppazVTRkx2b1NnTUZXdkFqcXVrdWtud2xDZ04rUEl2aXd4UzdxbnlDTzgzSHp3K1hEcG5vOGx5RWhlc2xtdHdhcXl1aHdhL2RqWnM0OG1sdFJScFNkUEViaGMxTWlvbktFOFFjWWpYWTFCdk1paTRaMk45Sy9kNHpoVTUrTnVIWFF0YmZNR0ZiMGU3d3VzNXZkaVBLZGo3clJyYTRnZ2t3UHdLQW9za1dBeGZRN2I3bllRUmJMTmR4VWhZSHBKQ1BsdHJFWTgxYUR1cFhjZkZHYWJDemVPNllQS3ZXN0dFVFZQVkJRM2hDYlZ0RkdDUGE0cWwwSTlveHpCVXUwSHFXellFYVRLZjIrZTNNMHJEMFVsYU5oNmljSEhXbUJzbkZaS3hnd3hSZTgxemZ1aTFkVk8yYXZJcGd5M1NzV0kvT3BhTkNCaEU1TytWVHdkZVdRakYwcitiQWtMeTliUkFJaGQzK3VHdGJQaGJFb05peHo2OXNsam8zcFlvemo3R0UzNW51c2cyRVkrODJ3d2ZCVERXWThCSklLbTA4NU1MMHBsd3paNkFtRjk2L3FRWkgzWkZHQ2ZQV3B5eGx6WlFqRTlTa2dqVG1rbDV1My9ya2FwSkV0Z3Jkdm9FRnJHcVp5RXRiM2RoYU9rZDNielBmekR3ZUFsdE40emhZRm80RTJMSXlSS1VaKzhRUnlrY05pM20zdHFab2paUXZxRU5VUGl5dEdnTE9jdGt1MzBUQ2hENlpKc3dmZEJaa1JqS2tkSDBIK1FuckJVbDZrRERIa2RDa3ZIbld0c3kzL2ZPdkljWVVsb3diQWJkM05IcDRPRmRUb01KTk1wN3NSYmFvOVlJUVQ0ZWFORWd4bVd0TjdtblNEQThuQ0FldnNnOVA3eWRkVDNUWUhYYTdub24zRm5CYjc5eXA0bUFmbmJid243QzVKSGE4Rm0wL2xmQjJDR0dxSW95SytrRDBTdnZ0b0FYNDU4aFEzSTNyNDJ0K3RqRzkwZU9DUGk5anNIdEh1aWhTWXY4WUhmMTdnQ2pXY3lodk9aL09UVE1abUovNEc2dkdkTnZSTDhCOWdveFF5a1YvVXdNNWxoSmhrR0pxWGFYcWZ1OXBvbTFKR0w1N09HbkRxR2d3YVhPTE0wR1BoYnBMSmZsM1lPRUVMSGVzbW8vZXBwaXNsU21SdCtqMmphMWlpWURQWkQ1L0pYUisrcVlCM2pPODJ5NXF5Z1dhZjhxQjRYZWVlRzk5c3FiQ0d6WkpOTmo5WHB5dUpMVjMyMDVFQmR0dzRXSWNRSzlIVjlJSzhBY1pZVE5oSmJRVmJrRk5mTHNqZUwyTFRDR0cvb1RQTTBWbzJVa25CK3UzNnJjRUorMUhJL2hCUWJUVXcvRHF4ZVJ6YkxEcG8yQ05maTc3YnByNjRCbm5rVUdQdFZOaW9aWGRsaWFYUGhrY2h2MVVXQzFQb3NCRmhML0FoOW4vMGwzSVZpNm40cEcrRjh4bVpOTW00VC9jc1RJR1JSTDBCL3Z1LzdJL0NIcjJKWEZydmdKWGdPNTFJMXBXc0tCVjJIaU1SRXhYSlNHMnlnSmhMYWkzM3lON2VoL2VPanVveEt6cTBocUh0bmxzUEQzU0pFVE5QdDFZczljVU5MREZTdjVOeTMxVFFlSmN0Zm82bitmYVBBTUtEM25OTm03eVpYd3doZ2xPbW9Say9xWGI1R2tnSlA1Z1o1NVRZRmZwek9ETVpCZW9hMDB3MDB1WU4raDJUb0ZCOC9DK08rZTZVWGs2QTM5ZnJ3WjJUb281ekpjdW51ZGZWQ3lzclpCVjhzYnVrd2ozR2ZKWUtoT1gvRk9BRFdocGJScm9wUy81MFdkWGE3RUZjV25iMm5uTVFpdlpJRmIyUWNYWjNIOFJON2tsdWR6QzR0QW5mam1BdEFOOVpUVDRDdVJSK1NsamhtakxMcVFyKzdvNU9pbUxSTDZreFlrQWJYekQ4anBzRG1oU3F2MGQ1M2VtODRXOXBheWYrQjdBWDBvVUZnMHVxb0M2SHhReTN6RE5WdWhubGt2NEZRbDMwcTFsYmdITjNPSTZTV1pCUlNnY2k2YkEvZDJmcUVMN1dHaGJmMFhZeFFCUXJIMjdoUWtTa1hrbkNHVXNhS1RTYWl3TFhWNVl4TENyaVNCNHdrSXdBYTluZVl5MkZpWXp4T3lZcmhqbk8yWEh4M1Rid2ZpUVUzdUIrdGZXV3JPWkxsWmFabGdrZkRaSGUvL1V4MHJiKzZxNU5DQ2F3Y0JZcEYyTnhmVlZiV21SUGxWck1MRlZHbE9XdFNYTUtyTUUzUVU1WHRSSER3Ri9FODlINUJHYXJLa0NzVEs5RFNxSkdheDgxVjIxTUxkVGwzdmpzVGlqak10SG95aW8rMHlGVGV2aHBFSHVScWJseFJ3bi9taC8xZ1lzRFBXN09UZENWT0dmang2aTRLclNRZ0czSjFtSy9qQStwYmtMbUc2WkJZWWltNUJLSHNENnhQTUdyUmJLd0JQNHRna0lNR3JZY2RIK3ZGbi9wSWVjV2pPVWtjeHJ0NUxucXhqU3kxN1pOR2NvdkkxQVNEa0dQWXdwYXV2UkFodmp0ejB6cGJzeDJvRUVVS2lRRVZkRDQrSlVUV1Q1SHVyZFF0NTIyV0VrT3JVRDFBRGcrYmM0cU5sZmxMRTlnZnFROEhxT09lK1hlZFR0UlZvN2F5REtLbittN2VSTUtIWXFSL21aaXhmekxVNjhMQ3BPT3VMaTY4ZzYvUVNzdElUdms2VFpTQUdCVldrMVFMN09QOUV3SVJucW55ZFlWMEhqS3VMMHcrWDB2Vllkc3FwaURLcmNPdWEwRkZXQ2RvalpIaWRabnZzNGducXRsZ09XSUY2d0pYN2xkc05SbUZ6SXErNXZjQi84U0hCTkp0RFQvNjA5bFhZYk5wRTFPVDlCMTFRbjdBUUxtNWNKZzJhTHZZUjlqZVllTDFseW54WkhWSmlOVG9hdWV1azBZT3dCVjhub3F4aGVld1I3dWIybzdTTWpyU01hR2ZZVVpiUG5LSko0eFREelF5ZkdYTnNPTFhkSGU4Q1ZaK281ekxETmxUL2IwdUl4b0t3aDl2VmRLR3huNHF4ZDlpdTRTRlBvSHdLZjlnOHVDK3NCOEFiT1Y3NnE2cWJ5OVdwYmNyMFJvaVZaQ094Y2pZZ082VlhvbTZrRkIrbW13YVAvY29xenhFRnM2VGh4a0pSR1F5bFVBWWJRRXZ4L253TWN5b3psZVdIR004aHV4blBaMEwxc3puNmpOblJ5WlpRYU11THZBck9GRGNJdVBaY1Nub2hycWw5K3p3cDZhakxJTWR4bkJDcU1Rc0JPbnhOZ2Z6dmFCZ3djZkwxNFJ2aUEzTVFqRXUzUXA4M0ZyM3ZDRHZqODRJRHYzYUxDaFgxTWUxZE8raGhsODNkeWVaZFNJMEZma24wSkttNkxtL3ozcG1ndU1vNFoyUVFYTjJRaGtyaGVFRG1mcWZ6Wm51OEk0bjlPQUlNSGc1UTNzaDRtaFdUM0xGT0hRN0c4UlhtT1VCeko0SFN6L1VwWlZTeVp6Rko0bWlpbDBadkQ4S0J6RHBBemN0R2kvZW93Nk9RNDJqTzhGTGtzNWlhTjkzTE94bHdsczY0MXN5WGdTS2RheXFDU3dVWlNSVEdISmVwbjg0dGpZYm1ZL3I5Q0o2QlR0aDBOMGVGS3VFOVN6Mlc1YjYzWkRaNEUrUnh5WWlWd09TUGxuSnlpajJVZ2wxYWt3MzZFZjk0LzFKaXFLd1dUUG15c2grVDU5ZUFyc1FGN2x1UVdqRnBPb1FXbHcvVWl6MEgrT2ZPZGRiWFBDM3FHN05wV1d5eUpUaTYvaVhwTlBheHNJQWxPMG9tckUyQWRvSEFvL1JCMDVXMlNkUHVYdHJUR3hOelNwaWQ0Q2NGRXhER1ZFL1ZkSFp1S1J4VU4zZWtaYzRYS1d1VkVNSGZSNExqSC9LY3R3TVV3UDgvVTZiMWloV3lmMWgweVBvdXgwSVBaRjBVUFdrWVlMc2wxSlU1cFdpa0d5NUlJekw2OHpBOWpZYlhNTDY3czJ6TG9FN3Z2U2U3UXdYRzB3TlVreVRBV0hqa2Urek44NlRQR1pkZ3haRm9VZ3BYaVNBeHdHRTZaTGFNQWVwb1hEVE9zNU53WjR2QWpRZWtRT2I1NGpxOXcrRXl3Ymd3a0VpaVBxM1Zmb1MwWkNnQXJmc3BCbWtpYTlxSkJzdlRzS0lWcndSakx3N0xLWVhmNEE4VXF5dHFCQlROL0dZelBGVnZ3clE4Zk1qSWZhRFo4ek00a1NsakFIL3FrVUgxak1vU3F1cjczd1ZoSSsrZlYreER2alg0cmFhNEhpMzd1bGxTT2dnZUhJMXFweUxCNENuMFd2OFpnT1NiUkxSRXM0L0E0V0FqN3F5M053cUdSZ05ocGRUOHVZbStKRVgwSmY1ejFpTkhaVVMySGZmeXRQMjQ4VGdKeDRML1Q4U1lKL3ZuR2FZNVRRRkN2TDhKWjdmMzhWeEFhcFR6dVQvaW8xQnM4N1ZZZ2pZU1FldDRZbFpZY1NKSHVaWFJKVlhQalJNYmtRSXJpZFN6N1pKQjFEWGR3VVN6Q1RRNG1SSForV0pMVkV1R1Q0NHZDdWtPUmJFRngxKytPdUpLOEQyek0xMG42Sk9FMlJmVGtFSkw3Q2djU3AxTmIzeXExUEdRL2U5WnFFem4ySko2bjFZLzVCQkZRQzBHbW04WWF1bnkzQlVsblNQcjFLbTVEN2ZnTW5vWUwvdzZjQ2VHUFNHUklxUVhmS2x3Y2JhbGJVT2lZRVhxb2JOQkpoZm9WNGkvNXRGWEcwZm5ycWdUMm5SQ0tGcFgxNi9rYUFpeXZBYVJaSVcveVZBaXJxdU1FLzFtc2phS2pkTFc3WjNqRHRROVZBZTJOSDkxVmtwSUllNUxaa2x6NE1qeUV2Mk1vWGJmSER1VTUwZUMwc0xVeVRhWVMvY2NDS01DSlJJckVOSEE2THpmeG1pVTNBbTVmZ1YzY0F5bGdtNEh2bHdseWw2dDBHMmVpak1OajVYOW1MdW9XRUFpQXQreE1UM2k5MXhvazJnS3RoQ2N6dUdTWDBhbnRXMkc1SVNtZEMvNGxkc1NpZ2U1NUxBNDBON2ZwWHFxQy83ZzFiRi9PMFhCMVN6b0NPV1I4RzE1NXhaQnBaWG5EZkJVelVmYzBpZVlTbFQ2NTJ1VkNDd0U3cmNMSUlEc21Ed1JzMW5uOFk3cTljbDdmemMvdEh3M1NHeGFSbk5HWFlZOGxEWFB4SHYxN05ydFc4bDZzTkJjK0lCOTFIYXVkY3hQTEkrNks3RW9YTDM5ZUhMbzk5akREbTEySjhGa0JrU3NjTzVrSUh5Ni92bHFqd0YzemFFUHo1T1NENDdKZTZCMVY3NnJ1QUdSeXMvVS9mVmxPNTRETUlRaWJzV1l0UEJxUnd4OVVaeWlZb0ZEdDNxaFg1YTJERkY4eUZPdnJRcEcwb004bWViUnBCWHFVMnVVS2lvT1B5akFGbjZWSUJqVmtnTHdpd21aMjBMNmxzWHR2aldHSzdvNDhNRTkyY3VheVloR25sa2QxS2gwWTVDKzhJUDFVc2FNaE0xNURuM0NQNDZ2cWZYaWFsSjNScXp2d3dXS1d5QzJvam9KL2ZiMHFRbDdsK3VuOW1vK3V2WmFrcjVBdi9WVzZQdUhucXNCYzZRSWtVYjJpUjZ3V1N4azBZTWhtWDBQejRmWTdsME0vQkRMdXdnWFE0NVJTTCtLMnFsaHNsc0tRNWFJdlBud2ZORTBPWHgvNXUwWUF6dzZOSE1TMER2YVBFbXJ6UmNEZTZMT09SQU9WMjFrLzBXQjZCNzJzZXlVaHFGOXBvWEo4bElycW5ibS9CQzR3SDNZUC9iazhyU1U4eTVIM1pRTGFCQVpaRlBJTjhORFYzNG9RNDQvb2FsaWJUNUdiSGEwT2pjWFBtSmNxcktyU1I0YjNUb3JjN3hlNjlndzc3d0grejQ0UEMvc2RlRTN4Mm1XdGYwOTJveDd2dnc2R2pyTnA1Tkp6TXdDbWIyZisyc3ZLTjdwYTVUNHlJaTlxWkY3Y1JWS1BXU0hvODdaMU9JRCs0NnFoODZuTmJBVWMwcEFFYnNPNmNFRTR2UDBrRkZWYXIxSmR5ZU9WRmZ6KzZmSFRGODlZNTVxdTJ6eldtZ2xFalp2RVpHUk5Bc3paR3dYZW9CM3Flb1NjNHhtM3Z1aFJYUElkVjI3akViSTh0dlVZRW1yUGpLOS9zbDJJaDZRZ2o3NXE2RjJ2UDlyZEg3ZzFNU3JCdDVYZWlXSURCUE94M2tUNlVlYTlDWEs1MFFPYm5lMnNDMitoNVF0cEwxWGhaS25IVFJjaWRjNVRMZEU0N0NOdk9kK3c2OTZxcThnYmxrNUVjeXgxRU5yOWVadTQ0VTh4SDBBSDNLckJPb20vMlBpRW9xLzBQRXlzVzNoRHhsZVNTaDM5aGJUWDNIRkljSnFNSnU3cHNZWWkzMzBEZXFvYXZvaVRvOXdvOGJKR25obDR2amdaMkIvWU0zcjdYZzdiZVY1emJpb2x3ZWxLb3BXcEliVXlmMmx1UElxNDhKOGJSei9EYy9YY2xYZ2MxcGJFRjA4S1Q4d0tUSzc1cGNsbTZEWHZ4UHBJcld5VEh1RU4zaUdCSWRsMWtPcVMwbzJ2WFhBaHVYK1RFSk1CT09YUFE0RTZxVlFaNnl1cXRVZVRRZW1PdmUxeFAzQVFKeTJQL2NsL1EzZ2hpR0ZNaDJwdGsrZnJLSU56TG96SVpISC9YVXFVYmZaTkRWd1psZEx4Y21zOERzWUxDa1Q1YlRJUWw4dlZzUFpKUmpHdU1jQ2ZFV1JoWWM3dks5Syt1MWZYVGd4REZwbWhBWDBoaU1hSU0yZzlNYm90bUhxK0IwRzdjOFFieW1TZzA3SjlEYXpydTJFZGFsZmpGZTh6UG15K0FtcUFCVEc1TEhZZWthV0krdHBCWVl4ZWJWUGgwU3luZU55ODB2TWZVSHNtbjd2ZEdmQVVvOGN5MVpkcnJ3OFZCaThYS1F5a1R6aUVmTjMxRUl1MUkwcWFoN0ZKL0NhRUVPMWc2WkVGMmNPM281MFp6TjdaNDM5OEUybHM2RlQ3bjdwRkQvK2RwYlZvcm5lNmJrdTY5SkIyb2ErbDNXNDVvOWJUSDU4U1BValdqcXc5bmhlWE5paVRCVFdEaFpNMFdjYWhUc2llMERiWmhyOUE2eXZlUTFLeUY4MUdVektFK2VKUGdhdkovdU5tdlhwUXFxcWpwYXdqR2wzaU81V04yUytHR1Ricm81Zk9mT042NHA4K09DZ09mUmRNRWltYWVFVHZ4Q3NkeDkyNTVNSVcvUjdZcjlESWFlODdxeFhac3Z1N0VCc3lQWUdYaGQxbk81TXJxVk84NjE2cDlTbk5POFlGcS96UGJhYXA3bmZuSXNVZGUwWE85dGJ6cTFpUHhncXRoRm44WWxOQU4xbmRXYXl6enlCeHhPU3BlYWFYVE9JNUZlakFnU1lHaXNPUTVxYjFtVXg2RmdHWU81Z3R6QXloQkNMZ0VOaGczZm55MEpScTZoSWw2djFvQzJuUFNGR1Yvb3lmbXFQU3ZLOC9RQjJNeUFaMmhjdmc2aVZHZUoxWjMvVnFtNWpFdno0M3pnR3ZUQmFRc1dhQmdRNjBMNVBRUUJvSHFjZTdBdTJISEhtU3BDTWtDWHNIM2h1UHBnaWdpVlV0Ulhub3ZiUks2VDJRaWx6R0toelNFUlh0dXorMlJoUFFoZ1M5VS8yWTc5NlJiUkZKcGhvMUZ1VGdBMTFqYy9NYVlVc3hZa2Z0RllpTW5Yb3hMcC9rZmxObE9RVW04ZUVyK1BpUjZQUWJoV084QnEvQUtYdEE3VCtHNmpqZ1lTUm1mbEJhVU8xUHBwYlZJZXdVZTR5cUpUUlZjUXFaZVVFUnVwcmgranBvVmg2TkdNWnMzRVFqNWZLTTNmUkpSYU5QeDk5OTdpbEozN0F2M2FEdE45amdYejYvZ3kxcStLM1NFa3FxTlE4SldmeER0VG9vdWRXRDV5elNKRVI1L1FRbS9HOTZ1VDA1cFZ3ZVlUaWJpL0M1aUlucFc4T21WZlZCRlV3OWpUR2FmSVZ0SldEakdUZEZrL0JIdHQxbEdUN3lPeUY4Sk5tckRZdktCMGtGNlRVRXdqSE11TXE4a2FOU1E2Wi9rWndtVCtyUXlBTUpBeE1UZ2dJbE0xNENQUVlCbkVoa3M4TzdWbEpSZGZtakdqS01lOE1HRXlDaHZCYVlwcUlhWjZBU0tUMFlyUGNReFgyS1ZoNTRrWHpIcFg4NXFlRXhSeXROV1hiZmh6MWovMXVGVzV1WEowOElEdnhyZ3E0cnl6a2k0WUx3Q0xVMVloVVl0bTBMRlNuWHNEYmdKWm1wazZpSENjRWVuVksrM3JmWnFQYTQxeVZRdTJuRWlLTWhBdll4Z2VhczhsVTJHV25NL2tRSGx5OGFPWmRBenN4VEVwVVl3ZHRHUDd5YWlDYXZOcld3a2lMQTNyd1lBR2Z5eFJ2ZitKNzJ6d1dROTkzT2tUbTdKeW5NTE8zS3ZDbEcxOTZvN0R3RzNuQTNmMWhxTVZzQ3JvWTdSNGdyQVVmbCthSlNLcVN1cXdqcGNSNkVFdUF1d1lHS2w3UGZ3LzJGanlyZUVGeXE0MDV0T3ZlSEtsbksrc2ROY0tObHFOMm5GTXdQTklvMDB6V2ZFU2kyam5RQzdGSFVEVEtBa1pFOTZKL1NCTVFhTFc2WEFDMlY1WXRqSjFxSFFhV2NBOXphcXBLa29VVldreks2L0F0eWRJRE5hRGZlNmVPa3VNY1lKTC9OM2R6UHF1bDN3QXFIY3FCNC9XajZiYnpIL2p3ZDRuL1ZrbmJCY3FIZkVVcHdSVGJ1ZjNudWhGRVFybkt5OHFZbUxkckViN1JnWlo0d1l1Rm1MdllrRVVFUG9wSHk5WmpiUnJJU0JYOWtzdTBTeHI1Zm9UaEJYODVPaTVmVjlLSWpvSTFqVERnOXZrNHBodXFUUGpvY0JBcUZOaXdLNTZ1K2tudDZmQjdzZXZVc2d1V0lQajdaSjh2WnZNajVZbGlPZUV5SVVDSWw1QjdoZjJrUzRzU1A3dGNaS0NPU0VCaHpvTElOK3ZaZ1pCQ3ozcGJWVnJjM1VjSkUySEFScHlvelpOS1hseHJnbnU4VjJWYWNodTZWYU5pUnd2MWdXdjRIT1BCYTZDcUFMUks2RHRiQVI5UlZVazRZb0dOckx2Q2JKeGJqMHp2bDR4cXE0ZUJFaDlzRUlJUHVyVlFXZHJjcW45Qm8rYmk0MzMyUkpFWmhqRmxZSXM4NGxlblo1eWlHWU9Mejd6VU1RWkFpak5tb040WUp2MTRXZ2hxTXRuVmgvaGZnT3FGM3lVUkhRdDZyY3VrbHpFR2NwUFNWamdpM29ha1o0MnFyc2Q4MlZXTmJoVDk0OWdlZnExK1J1MWJkUmtXeDBaTDZSUWVDYTRKUmJQNUtSTVVSSGMxdXhFQnFnaS9GSGxUbXlnaXY5Mnk4ejEyTlVyanR4VUtGeTlGL0VIOXhUWmZPZVVtZmdWT3NmU1R1WGpmT3Fkb1EwSkJZd0F4MElJUGRSMS8xU0NzWk95bWFjcTNGOHJLY2R3SXZnSFJ1aE80cGxuc0Zud0pqTzU4eDJ2VldrQzJ4YlBYTUQxRmZyalBtSTdYVk5uL0c4dUdhcWVjT0ZKTkhhaDJaLzZiTW42M2NheTBsejhiYWFjUU9md3Fjb1V1YVpWeFBHM21XZkNMMmFvWk54ckJmSDU4TkllaGxiUk9lcUJJdTJEV0hPU3ZoUUxXVnhDL0VTNmpVdXlIL3dWcTY0ckNJaXF2OU13VldpUVVnOCs1V2ZYTHEvaHRkSlJwalFZRm9DaklhR1FCTDZkQU9jNTg0bVp6ZHA2d0h1ZG1EZFFSSzdnYU1iWTU4UWxaQlhzejRwWDZFakFvU2g0UkpCbjEvbk9SUGQ2ODdUNExGdzZyaXhqYjBGVXUvZXZ6N0hoaFlGNE9uOHRZWmZvUUVoTTIvQXJJL3U0TEk5UWE1b1pwMk1NUkkwYXZTY20va0V1Vmxzcm9adlI1VjFIaEozVVg0cXNLMmRXdUNtT0dlUEVsNFRpZjY2dlBRUUhyNXRvVHNTVjV5QkprV0RwZXEzRlIrK1NBc3RxYjA0RUU4dy9FNGNjOWV4YjVlUWVQUzJGeVdSZ242anJ6ZFo2d2FEMS9lNG92NVRUbmlDTUN4RUM0cXlwUmRIeG9wWnRvM0FOam1UbnBtTTZwQzJpeEZ1MWtmUjBTYW1qU25FaHhyUDlLS0hXeWdETDVCK0lyREt0dzBsc0N1anU1cEdLaGxaMnQybEZZcmdCZkVmcmZoZE0vMFlMVlhWamk3SThDL3U5czdBbnY1N0hSYy95ZWJNMldhYm16MG1TdWFWK2Y3ZW50M2hhNHc0a3RpWDFWZGpCejJLem9CZDA5VXBEbkNYVGJnSEE0VmFHSHpRalVYcEYxR050SVZINndxckFSa290SXcyY2IrdUNqdHA1cHNRb2VraDFkYS9mbWt3RDdLd2VyOS9wNmRRRE9vaU83V3g1d2cvc2Rva1BxZDBncEcxSlV2VVV5KzF4Vlc1NHFmVkVNZ1U1QXI1ci9iNWNzMUpPdkJPTENMaVRiZDExYXFnS0dCYUFWVE5QUVd5bzJhTUtNS0doVFIzQm05T1VjQ0FxNFZSOVZheGRCM1MyZEZCY1MyMUZubis4OUkzZjBXbytkVCtrRnFmdHBpc0RXRGxKL09TbHE3UEVuNUI0ZTBHSVlhT1JFcVZ3QmZ5SUJKMCtmMUNhOGkwVENLR0lTY2NrbWlXTWlVNXNuYndnUGRhQjhyanI0ck4xa3RydVhsWmpQMEpYdlRUcXlodFYwcnhBM2RQdFhENTRMbllGeXkzVG5reFZHTTRDN0NIZlQ4SENQMEpFWmVFaGpzSGZNbFdnVmg0TU5XQkd0SjhGNk0vUG9kQzBTT1ZnYkxpd25qNVg2dkNtUFhiVDFEeVorVTBtY1c4dkRDK3ZuYzhiRlQwOG1CVDJOWkl1cGxzZkVoYjc2SzVVMWp0cVF4MXFWTE55QXRFa2ZpbHBQMHRmQ0hKenRGbmF5ZFZQWVNjNCtVV25GaEY5UkE4VmNGNEJyRHJ0Vk14Qk4ybkRxZ1I5UG04RjJnWHM1ejNjMDF3blJaam9GUmo3TWlXQUlSeUN0L0tOaHJmcldPR1Vwd3JCeFJGMFI5Zll4Q2Y5bThzdktvbGVvUXhITU0vaTlGR0pQRFFHQUlQMGJ6anV3K2RnK1k2aXpjbHRIUlQ3Tm0yWkdlOVU1ZlZTOXBMNnFiUDkvRHdGbUFGaHo3MncwejlZcWMreitiM25OejhFV21KaEZyejRQb1ZSekhxakFRMkczRk9Jem13ZnQzYUFuOWptVnJmRmZKOFZIMlk4dXMzeFhxdlhsVzBZZm1oMnlCd0srcEUzdlp1cWhtT09qZXM3Z290Y2t3ek1UZVYrZnZPMVV5YlhUTlF3K1h2RENNVzg4L0xTWlNsZmNCeWIvT2xGbitXbW96UnZEd3VyVlJOcU9DZzRTWk9nZTdnNTRsM3NpUkx5Wkl6bVVTNjBlbTFiOHBYOTAyV21zQjBUTlgxY3MwOFMxWDZWWkladGFwRy9IdDlGUEdWdC9COFFETjVTSTlaSjY1YmtMbk9KSmFyamIyeXc3YklrOWo5V2VTZExGOWcxTGpwMHlxamtpdEJZc0wxL202Y2tIbzZiekI4UWRUVGQ3OXhHNVRuMU93MzRNQlJQVEJMRVd2b2hhSmFnUlFYMjJ2NjVEc2tHZ0J2SVVOQ3FzNWthOXpvaEVua2ZZS3RoMzJ6SXFicWlUbVg1bXE2bForeUVNNE80M2c0WjNiTWN4NThudG5iNW9lQUkvUkIyWjZZaTJYTmN3eFJDejIyNDNGMDhKVDhmRVNnNGkrQnJTY3VEZEFjUkdpNGVIRE9OV2FaT1huZjZrdk5hK2U1eTQxUWVpakY0VFp5L1B5VjhCNXVNeDlvM09uRURKbWlhb1AzbG0xNkszU3lYM1Q4ODYyUXZSdmtFRkFIbnpHNFh5OGNnalZ2d1RhR04zamtLaHJVZGNsemRTZkZUZ2E0MHlMSzdwb0JRcVZlQUVEdEtZNFZIWG1qbXNtekQzLzFQc1FPS3ZScUNIR1U4SGVuTmdJOVdpUlFpbTF0RktoQllUUEFZL3NYdGU0eEs4N2hmNDFDREltTGtqbmZBbDRiTTh5SVJpc015MVNpZDdlVnZnYmNtOWJ1SnJWZE1IU3pLc2tFTjl1S2xEYU9SVWdwNDB2em1QRnhRZllIVUpnRUVnNzMyd1VTbzdmWDR5c3dRY3RXYWhUTkR2Zm9INkRIcmpjdDhmMWhuSmJzRVBsZXBZVTRNOGJpVlZuV3NwS2tETzJvUlFFejU0L2pXcktiRlF4eEFXdUVMNUZIMXQ1TTBWTSswSFZ2RVVnZ3JQN2M4bHNLdVdWbnBzVXJFY0NUSzNkajZKamRCUDg5WHdxakNhbGdvaERVSFA3ZjgyUGtyRHQ2Qk5mcFFENHNHT3pWN3V1RTFMTEJGTCtIWVd4U3dQNkg2L1ZuZEJpbVhyaU9nN2pFOEpINnRhWXRWZ3NjcEc0NHpWdUhsSk9acjBVVGl3a1E4SDVzZ0JweTlobmxvYVRUWU9RQUxZU3IyU2ozVElJZGJMWUZLa0NsNFg1c0MrRW85VS9vVVJkSWp4TzY1Q1VXRmdEMTQ0S3hxSnBZTHNKekxLMnZidnVuL0ttTEorZEJ3UDZzZWp6R05wdWcxSEprK0FQTHk5WVA5SEwzOVRJQ0dDNUJBS1ZUVUhHcDUySkpXNDFRcHBKMjRTOFdBOTc2S0RXWEM3TC9rS3oxUHduenhJMUt4ZGlkVi9EZ0lRT01Ld2pLVDA5U25vcERDN0ZuWEFuNW9DMm5oTjhYZlVvNzEveFY4eDZMSW4rbTFiQnNDK09BRWhVQTJ2b0svOXdjUTRBK3Y5SjFaaGU1OXZmaDRsdEttaEFTZklnN0YxZDRHZzByOTN1RkR3K0xWUGMzTkFwL0lpZFZ6RzFYTzlZaUtubW5QQTJBVHl1UVkvZ3JYQjEyZTRMUVpUZHI3eUYzN3EvZUJrWjBSVEYzeTdCUHdrQ2U4bFBMUVNjM01ydFpmTjIrMzBDOXR0REtmdTczK2FFTUVXUUh3blFPUW1QTUNXazdBRmpmTUVYV0Q0Q0U1WVVqVFZQSmlWV2pWakkzcC9wTWkvTG9YWDJyYVAzNjVqdTV6YjlDV3BROUFTVU5Ob0JuL3A5dGdhc3VBMFc3V3Z6WE5VTmZaRmdrajdjS2Nta3BISndxWGEyeTFsdWxNSjIwV2hENmJyRXdPVVhCZW5YRHAzNy9oLzRJRnpHYzJuL0d6d2V4K3hmZUQrRTc0SmNUd0ZGaTUza2pvd3l3eFFuZHNkN3d6K21EOStVb05rM3ZhUStycm16Z2VicjdMdlovdUdCb0d3dDZ1OGdNUStqMm1KaW81SlUzVVM0bU9OTzJKbThyZThSdm50aTYvTzJQOFlQV3lCT01QdENEWTAzdC9NSGNqUHZkakRjSlBzcGNLbkhRZjZZdkRPWEJsRnJXckRVcWJtcHFTcnVRNTM4dEkxQmhzaHdNNWNaK3RuZDh6b2E0bXM2OUVyL2hpMS8xNXdHbWxrZ2pMRTQ4OUthYkY3MkhUemZQVU5SdzBNeHZFbjFoMkE3OWNNeEMzUDZwamxhVm9wc2JTYXpYWnovMUhJcEc2ZDF2SFR6UzVNYXJEbWZhYm5lMHAzWGQ3Rm1WSSthNnJFUkV5YzQ4cDNwU2V3YU9NSWdPaDE0UVRxWUFSb3VtN3c5Tm9XL0RhVDlaMWdsbzY2V1NSV2REYkhCaDUwTTdpcUdCMm9NbHJOMytkbzFhM2J4dzRhYzJFOEgzY0RuTWpGWjdRVVhVOXU2RWM0RCs5a01YSU9wRjJjYytoOFM1TkFReXJZTkFLbXRxV0E2My9oeUM2cFdoSk16NWV6YldML1dKUnJ3QUQ1RTF6VU1LQ1FEbjZVdXRjTGRCVERUbk1MUktMdE93NUxUN2lDUHNoNWl5dWF1Zzl3d1hSRGRtWW9aZVZ4K0owNTEyYkpLWUMrMmg2R3Mxa0hJOGxiOCt6aUorbGNuem8rOEhOcWg5NnkxMklNQkkzNEpYbTFTVlFLL1hlQktjcTZHeW1wQUhhY0lsOExjNnEydUdtSG9WZ09NTlJWdUFDalhhaTE2RmprRGU0QlBmOWhMSUJleFBLamduVC9HNDVnY0hRVkRVZFQ1UzNRNnBXNkd3NHFpaWNSSHNTdWVuQjc0cE9vVDJBVXRKZFpsRWloYnJ3ajd4QWtKRkFDemdxb1JyRnhlMkNRVlkzVmZCRzlzdDV4UDltV2FOVE42MCtKV0V5d0NDbzhrWUZyTXUyQzY0azI3VDdVME1ReDJTdWZ4MEtXOHowVi8yT1VwMHllNzNBMUlYZHJ2dFBVbWlBWXNoeFhaaFZyQkJIR0dlTjZLMUZMWlk0QnNLSnUxTkVXaDJtOFBMUFcrVER2eGVHSVdBUFovaDZzUStYTlAyNjFIT3FUTFc2Q1ZwMUcxSnZGZkJ5NlErQ0JnSGw4SzFRRXRReEVUejQwT01HeWZHR1BVM0oyNVYxb2h6bjNyMHBCZkFiYURHRGF0c2RGc0NzSGZCd2VSaDlpMk55T2s2N21NV0xrUWhmVSsxOXdhdXNHMVBkTThvODRjTzl6Q0tMV0s1SVUvYWpIdHdJUTVlZHFTQy9JSUtxWHlHRDlFRkJ3N1RGTi9FZDJDRGNmUHFyNE9BbWNBZklYYUE2VkpsS3B1cXlvT2F3TjNweUN1N0sveEIvWTJqZkdRZ0RoSUg5bkhrR3R2dDJuUXV1QVJYV1Q2OXB2SkNzc2FreHRsZ253R3o3bDRzL01waS9zamRaa29nRTFIUEJYTlM4TE1MUlh2R0lOM3M1WFUzWjNDMDJIbmwySHgzbzFubi82ZFQ3WU1qMlYxVVlSSUZNajlFUTZ3RTNaejViYlY4ZjNYSGJ6M2RwRHdLaTVlaXNyU1FoTHFHMGl0MkoxcytrU0dtNGFvQ2M1WURLQ0YvUHJlMThQN3JaTDNqSlo0dDdnMVE0ZjdhdTR0V3J5OTlIdnIyN0twSkFEeWJjMHBsb0cwQzBJZjhPRTV1OW9vSWJ1T1JkMUlVbGh0QmltcVNUbXBZTVM2UjR0dDRQYmo4S0V1L1lEOG1rNUtlMWdjNnBURjNRQ1ZRSUswVFZZeG1EVUVGamxsL0lodDNIRTJlUzQ1WE9rQlUyRU5USkd5UytVRUwwWlhzTlhGSDlyaklKWmYvNmc2cTF3L1ppdS9sOTRqZEdUaXgvV1FFVGxvVTFlM0E1TlRnYmFqbkkrOXJXMWRLOHVzTmVzaWVSdjArTHZINWlQU0tyNFc4RmxFd3ovZjRRVDRJaWhlOFlGVjZQRDcyRGt5ZnR1cjBxWjhVOVE0L2tmUHR1SnBRNWRjTjNlOStZVDN6RmM1bFdqYXBMMW1uTVJ2SWZ0anptYzFGZ3piWEtndmRqeXhyaWdaVG52MVM5L1drVCtaL1JwdDJWMURxTXlxTEx4a3czY0pMK3JGbjdwc0Z1bzhIczIzTjRTQjZlL1l0MVIrTHlsN3RsRFJ0Qzh1K1hTSUI1b0VHQzFLSHFGc1JZVHVpUnlEd21tZWNsakwzOFhaUE5ZUlprMi9jdE9LRzAyOWRSQlVEc0tXRjN0NzZ5SzVxY2JlamlSTVVPUlo2dGlmOXFZSWxxK3MzWGdTdGY1SHJyVTBTY05QMXM1U2FFMWhHcjc2K1RZSXZXSkVRMjBDZzY1VGVuKzJGZmdiOXRudGJYOU5PZUVROVcwSFdLbVFNMWM5VW45Z1JJc2hPOGxHNE5tcmVVbkVkWlYxNWxCTFRHSlRFd3RQYmliUXVuOVQ5ME9ZMDVwb0FxVnV2SFg4WmEvUWVmS2JqaW9WOU5DRGk5c29CT0pNVGUvZjZIZjM1SXpIVXJ5em01cHI5MXNReDEzamUyYS9wV1M4SFNxemZpeG5jOTN5RVU1dC9OTDhETWVGb01nQTByamE2clZjL1ZWWDgvbjl5S2VDdzFzNTBiZlNqYXJLNVZXcGNleXlYYkpDZzZIK3VrbHBPdHY3QVVob2g1YVNBWE1mRVRZZHY1clAzcXNJc2REc0NNMFJkOGpPSnlJcHJOZGpWdXpSeDFxS1g4VDZtS0VXTGRKQjBxRGJnRklYY2JhaEljdElKZ29tc05HYVlOU0UvSCtSbTFpNkIzdUt4NldyK00yVERjelZvZis4b0dKdmVqT244SlYvUXFsMjBTYjYyUnhuYUJhTGErQ1REK29HSFFBZDNxbFpHbEIrTmRRejZlZEFEaXcyd2hjNTJjYzFwWWpkaUxNZkxFZkNOS3J5N2srUU5DQndSbmxyWkppdkUrSmVvS2FoVWJZY2toWTlINjMzWkM5bjA5Q3NXUEcwOHUyMzhXY2xHM2lhM0NNUnNTZm1lTE4rd3hONFA4MHJ3Yk03cmVPM0Zha1o1NGtMQm54V09vY2pFTnJsWG43cmNjSjBYTlhUcWZiOXVWTGtLY2crbUROZzVmeXZPZk9QcjcvSm0xSSt3REsxd2ZqYmtyOWl3MzZtdGxJbTU5NFFCYlAzRHBoRkNDOHhqelA1RVFuL00xRnNyVUUzN0VsU0NTVnhSbWpIRGo3L2kxaE5TczJmbWlndWJaSmJpV0FoVEd1OE9QV1czTDJjdlIzWGFHNmRDZTdtMXhCMDZnWTJTQkY2ZTVwOFdyNVMzMXpieWNObElrYTloZWxNaWczUTF5V2p1Yit3VTFrY25UTzFhU0lNMUdXVjNIQjJCbDNRWEtqUXhDQUVBUlpvL1BvQWh4dWV5ZnJLd3hWQ0dZdUQ5MFJ6U3VScEE2TGJxUEl3ZHJESnpiRkUxd3p6enV2UEQrUjRlc2ZZSjMyRnJ2SlpOK25DcHhyM2NKRFlSbUYzeTRuR2p2YXVUSVZlQWxvWmwrcTVNUHlEbjRib0kvVllIUnpJbzhDNlI3Q0FQV3U1Smt6cXNEb0EvQlloWSsrbHJja1YzL1FNbURYd2FxZ0lJT3hVbVJLYUlHR0M5QVU2UHFCMG1RS293N3VjVTNkRUlzZTF3UDBqOFM0bmJGTk5vbFhUWjZtaVBuY1p3ZlQyRURRK1NrMy9DNGRaTlVzYjFFWm9oU25sOFRpdzdoOXQ0YUZrUjVySGsydDJnUEVvUnlKeEhUR01TamxDTGhUNys3S2RERFluemQyQldaeDFBVkYyUmJwY2Fqc2NlUEFVOGx1TUdFNEN0NUJ6NURma0xmWlZBZ0I1VmZVZHF2QVlNamNsL2NXMzJMSjZlcE5oWHFaQmhsZlFBdmZFWTlDWEtzYXNqanhwaVNDY0tFclJ0Q3ZVdERvRFd4WlYvS1UwVDdwbW51S3MxWWhWb2NTZXRRZHNERHRHRFhMNnZxSGIzOEovMWJOdWt5WnVtQWtWbHcycFFGc3Z4R2lKdEpZTzdzL0lqbjRhNXVscGFMblcxdVR6SXk4enllNVZiSThUMTlvbEZnN2Y4M2Q0cHNMQjRwYlBxU2ZCejdGUmQzb1hpUjU4U2VoSDI0T2E5N3phaVZ3eldYc0ovSmVvVlZJcHpDWmE3T3lxN1E3TmhxTU1nUFp3VVM0bmdZNSt3RUUyMG9ZWmR4aER5YWJQK1dpWExhQTQ5QzNXbDI2aG5za3BoY2ZJTWR1bGZnQ2JIbW5KdTN2Z2c0b09nVmd1cXVtcGdzTFdyVGlEcU5JUlpsV0ZGek1QVlNQOVVIYytGdzB4TXZRLzFGY0ZmWWJnOXcyTldqSzJoM1BVb0VwZ2dKR1kvZloxaGYvTW9kR3krN1Uzb09ZT0JHSkxXemw2K2NrTzEyeW16czF4cCtqUE9SYjhDRVNZdUd2bW96K010WVZOTkhZM1hjd2kyZndkSVNYaGFyVjZCOXJjQ1d4bmRDeEJQSmZXRDhDY21wYlBCaVlQZk1nYlJZL0ZIUUE5Vk5uS1ZKNlVBVms1TnhlZ3NpVEJENUpPaGdKN2QrYzBaRDNGUXZlN1FWWjhvWThMNkpRczR4N3RtK3V4M0RzYjI2Q0xrWEtocWF0bUh2bG9zSkpMVlRRSnhVYnFZVk93dVhGSGx1b0NmTzRocGF3LzFzQmlTTHUvY2EzZjJzMWlMNDBFMXFBSmZOSTRGWFpCZ0JDOFNvdklaUCtNeXdWTVJQT2dLNk5TS3B5RjhxTFRvc1FnUmt0c0lxS2tjY2tDRkhaUndKMkhENDJjdnpQSjQwZHIwR1FtRjhBZmVweWFjdDIybnBYN0g4OExXMVgrZHpFYUJqUUhubzRocjRpOW1vMmpUUjRERVZVSjFtT2ZUL3NQSitXYjE1eFJQTE9zeGlVSVNsaS95Yjg5OUJpdVU1VlhRbmZNZmJBWmZSbEpwNnI4Y2pQVG1aWDBLRTVMdEUyMnFZeURvMk5Rem0wNDdoMitpMUJPUFBVWmg1cWFVMnJWV2xEekFUanBCV2NnRFk5bnFEWTgvdlhnOG9pSzVzZW55UTJCYk5GR1J3eitMR1ExZjdKMFFpMFlrRTFLU1VnTmN1MC9lM0ZFR29OR1lmYTlvTk1XYnJVMVFiZEl4K3lXcStIVWZ5Nnpzd1UzUitZQjFUUGdxZ2tXbjFPZU9RaWJHRmJmTUtWMEFrRnE1SnFrVnlwUHVJMjdUdnlVOUtkTjc1c2V5ZUVBdU5GV0I2c1Z4VHhDRm9CaVlyZ3pUckgrVW1sdCtLbi9DeHFCUHphZHR4QXA0NURVU1NWajhDWjV5amN3dVRidEFhd3RLSzVVRy84Y2lIb3A4K01ITWRVaURrajNIQVZPNWxYQXN5TEpQMTRnNTVSNndIRUJwZ3I0ZGZ1eHU3VEE0blE3QkFhenZ6MEVoSkIxUkhSMHEzalJnZktQWkQ2T2YwaTFZWVZFQUc1K2VKZTFpVDUwemo5VFpzYUFDNXVvWWs0UHJvc0ZrcFFUbmJJLzJ6OVkyVERlc1VKMEVXbDR5UXlseU80RWJVWE9yK0xrZ01Vc1NpWjkrV1hCVGpnVk8wT0c1MnczcEdWU01qejY5WkNGRFlXNHZQOGpyRVplVHRvYlVBUithMGxURFhoMERETlZCdGFYbWVnenRBUWRRSVJhOVpkUVlxS3BXVXZqRkNqYzFybUlQNVBqckhrMTlHSjYvZTk1RXNGRk82aVhCMytET1ZaeVZSQm44NkhIWVlmUWNaUTc4NTVkL0ZSVWU2TU83R3F0T0pxUnQxS21NODByQ0dwdnFtYmNJcWt3QWlJYUVKT0h5NUU0dTVoT2JFN1FMUUpuYUtCVnVtbENhcld5UHlSbXRIVW05VWM5bzhaVWJ2eG9CaEJpRmF6OXhkT2tidFJrT3dGZFg0UndRTEJVWUhod05lQ05ycXNWbFo4WUI0YytQWFlJVUk2VldrL0dDYWpyUlduNFM1T0ZaYUZlQkxaVUpObzUvQm8zQUxkdi95MEFPRzhUdys5dGVrdjB1WjdGbE1zeVRkTjI5Y3hkRWNPd3dUelA0UzM3TjRnWEFnSWpINWpMcDZBN29PV3JubXVXV1VHeDBlVFJ2UzNnUlJDTytrOGZ1Z0U5dG5TMC9sYWlNNUNOMVY2T2NZdUh3NEV3TE9UUHlSbHBjZ2ZBcmVWYjR6YXMyN3lEa1VaN3NHZGYxL2ZJR0lDeG9BQTh2TGR0WUZBLzNwR29yOEJhMXZPNlNGbXBkbWIrRjVpTGU1UkMrY3pDTVM2bmdIV1R4bmNJT2dBNVA0L3JzVHJaZXg5eFoyVnJuSlFibTlwWFR0U0REdDVFamhoSnJoTGRrajBDTktpc2RQU090RnFJK3JleUNNK2ZrSlJkVHlFSXJsOUtZR0F2Nm5VRlVNTGtwY0FYK1h6TTd1WEdvL1lXYmYweUsyczVmVzZiL1JuRG91NFRPRHZOOHA2d095N3MzSlRCSmtFYWd2VHNLZlFndnZCVEkyYkNtV1d6d2M1RlNtT1VkTkx0OU9MUEhhb0ExZ3JhQ2dpUzVuSkZ2OWE5OVRzcmdjWVpFblhBVDBuRGJMajZxOTRuVldtS3pLSVVQY2czUGNJejR2WXJKQmFVOHcrdm03TE9BLzIvUGRHdCs0andxWmVwa1JmaGJPNlhwaXRMZ3NRWUlhNGYrT0lveWh3R1ZVd2l2Y3J0NGt6d3RPaTlYZ0RObkwzckR0ZDUwTWRvaElIaEpBWFpaUGUzc0NEMmltcFZMcmVpdXhYS3I1b2lZT1ErYWxUNkRuRnNOeGJtREF2b05wNi93RWlpZEJTTVozaUZCODdnaHh0LzArU1V6TWFmMDFGWFlGU2xVYkZPbWtvdjExSktQcHRCR1JQU09ublRpUWRieVY3YUZ1Z1dpcW9VSE80bFI5QjdJRW1oL3NvQ3E3dmpHYTJEdENZQklQNlh6YmppUUJKOEVmK0x0cTlWUDkrRDlpYzVtQSs5VjcvSTZrVFVaNndEZ3R3N2wxRW5jekIwc3Y5TlpSbEJGbEtRd3R0TVhmMkJmOTlveHphVjYzYVhvYTJibDYwbGtSU2loOVBkUEd2MUdLcXB5ckhrYWhkamt0b3NBVnd6dGxwcXU3WTRsOVh3OEdvTElpT3pvaVVYdlpJS01nZmNrajBmeE1pS0JFL2gydzErSm1GR0lKWkUzZlBZbXVCdVF3TzVDakZtaHhKbFRKZFBFY2srYURBODNjWEd4YXZYa3NoZ3FobWZsQjBjL3pudGRROVlMU3h3WkhsSmhQVzhNZ1hZNzFTUmNRV2tTK1ZZSEY1UG5TcGswa3FxWUt3UnVJU0xLdGJjNGFtMmVqa0ZncXJkSEJ3ZSs2N3drREZjQmxBbmg5aXFBZHJJZHJIRFljRnViNWkvaElqSXNvVGc2VnFTSU5oYUxpb24rcEZPZFYwTWVJT3ZremdyZHc2YXlFSFdQYkRtdXZxWG4zdzJGYW1nYWVDZjkrcnY4YkVLNG9qUkV4eE8vT2FubTlZZkVWQnBZZTV6TXA2d084d2hSYjltM3J6MGRoSWJrK21saEhGc1kvUnJwNDBYdGtZNVZvN1FJWnNZSGJWZXBFL0tvcGtOMFYrazVSMmJnWFM2RTdkME5ZM0NEUlEzeW9QSUVwY1pPLzMvMlFybUlZek5RcHI2L3NZSWNlRElEOGVWc1ZGZHRGakdMdWdMRGxOR2VlUVdQSTQ3bEZiN3NuVnZNWDQyN05ESGZHb0FhbnVjbUhFSWVxenQzcjdFR2Y0UDBYT09DWEN1cGFONjZ0bHJuSE9oMmRkaDhTM1lscFdURkI2ME44bFBXZTFaK2UwUnl3OHV1bE5VMDl1OUp2R2t3SzJldnZBdlpweXA3OEp0djVHMUpPdUtnWmJsV0VQT3VJL1NSWEt6QlZjUDB1OFBvOFFORHVjQ25TUGt2eWlvV2xGQUZiSmNoWnZBTVphQko2aFMxMnE3NWxSbXY4MW82MENoNlJVZFZjQTlwREIyTlEyNVJnVXowMStiaEZMdnNSN01sYVdSbnVLSVYvbzZaUXZHb2N1UFhaMkV3VXJ5SUxpc1FtQWFydWFCOS9XVkY5T21OaGhPTU90dzdmZlk5Sng5YmxpUnh1KzkrNmMyWFJiSVpQTzZ3V1dTUGVEUld5TzgvK0ozZHY4UmQ3S1JWQVZDdGtUOVNhUW41NzdDUVpmKzFMNEVCbW5IZTNFMzI1M0JNa1hDVXJLam9ZN0JBRmgySmZEd1lMQnVTNXNKQTVNc204QUJuWmxURFBGV0pWRGFXamJZUlovaUhueCt6L1RzNThiaE1OYmI1L0VXYWxValZWWGV2NS8weWlYcHk1bnJNMUZsM2tOTm9PS0l5NHlYS290cmVCc21mVFB0MG9YRkFIakpNbDFDNlo5dnF6cDR4RUJCNzhlcStnbTF6WCs3OXRpdHpzM2RMMThSZjlaQkFQWkpMWDhHd2pKbVpHWVp6cHRCenNnTDBZT1BDN3pJWEJuaXpPdXRWWXQ5ejJ6YnRpVUNoWVpDTXpNd0Z5aWhKRGVGQzlZMkNzVm1MR1gwWXhGRzliRzN3WnRGN0lQWUZPVjJ4TnFZTEVLVy9UZWVtYVQyb0tGNVdkbjZ0U0VIZHVlV1lyS3U1V1ZxR3Z2NHF1VFgrK2xkcjFsbFBSaytNSW5GVFNXYk9LTXowWCsvMUFPeDZWMmJ4TWRCaUExVGtCbVFWVVFCOEFXZTdVcVhWQ01CajNFNFliZVZBMElBendESDcyOWRKTXZYK0M5UTBpUXVKR1Z2VTh0N2FwdkUyY1ZLUmJjbHNVOXBKQXpkOXZXV3A0dVdIdm1IT083c2d1OUZHb1V0RHRma3dYWWk3bEZrazNkWVRqWVo4dUh5d0xuZFRwdStmb0VTQm5WV3ZhbFlidURNbjBVM2k5NWtBemJjdzlmWCtIeTlEZFpTNlNCL3lTa21hNU5xWUM4VDZPaE5uYW0wTlNDUm5wZ2h4eStQVUpQUUg3Nk5Dc0pTOVdaYTc3eGRaWlpPQnNMRExBTGduWm5mbHNvUXpYYnZOSCtGdVZXZnRTNmxCM1BKd2ViSGV1QTRyRjdXNS84dDhqdVJneG82TjBIbloydm4rU1JaY0xaWE9MNUtkNFBMRGZ0RHFGeVlSRXpVbnMwTEM2SnJxSkw3UWxsZzRuanpiRG8rQmlrRUg3NG9iT3p6TGN5cVdmL2dERXhaajhTTTNocDBZN2dyL2F3UExNV3pGNVFCa3ExQXEvbno2TnlEc1BKNnBGbmlVNmFRK3JLU1Jpb2RyNTFXZ1g1Q0xkTHpBa2dZaDcxOS9kS29kejVYL3pDazA5ZTNUbWhLUWQwV3dweW5EK3NnY2hSeEV5SElRVUVRVEg0UHpJdWZoZ0F0MzFLaDdKbUZzWTlzL2tGRGdHL3ZRV1E3RUU2cDlTdkpsNWtNU0JrZVpCbUQ3Vkt1QjNWSTh6b1JTbHQvMHJRa0llSFlIWnM1ODZENUtDU2k1REkxMUVDNFZPQmtiSzJOQ2lUM1dTd1R0bWg1cXNJTWxQZ0RvU2k5czZkNVZzSjRQTHUwRkVaU3ZEaHJZMVhjbWxDRHVvYTlpSkk4M09WYUdsV0YwSkRTeFlCYWlqbFFYaU52ZjJRWWN1NEV1VzdUMUZEN2VaYW1pN3BzdnNnZkhKZnZ5L3l2VlNId0laWlI3SVU2ZzgzOWltQnd0MmhubWlFdnMydFZUQ1I2TmhSN0phdk9EUThwc3M2MGpiRUEveERWejYreTB3RnV5YnAveGlnYnBpblV0bDhuVWlmN0pnaHV6Wkd1aUIyREFxYWpKTFhXWk5oL2tab1BnMnR5bDZrY1pjd2k2dnAveFlQSWFEUjY3Qjdqd0YxU3BVcG5DRXdOS00rKy84Y3NzSU5kRWRGUGxybVpzbmg2NE1TZFVrWk5LZkNPS3lJUS9HbGpYaDJRVmRINmM1bFNYT05ZQzJoQmQ4OWlyTml5OElGZTNrMmVnNlFreEhEZ201Mm5PcXVnT3EyNlRYMDk5K2UyWWdmbnVCcDBhbCtIMVhQQVlITzRQNWI1TWhPSlNZV2puaFJnU3paOWN3bmIzQWtPTTdNT1g1Q1MwYld6UTFQVTF0YTFRVlljUGR4R0x1UDN2akprNVVZcjZsL0lObzZmcys1OUZOR09Gek9PcHNCeTBsRG9tVkJTVi9qZmhsa2xSY3ZyNEI2ZUNPWDd3VFVkNkxDZml4clBOVnVSRzlOVG9MNlVBaE5xMnZJdzhsK2o0Ky91OFhOSlh0a1JNQ0tmR3pyeitDWmF4YmF1MXd4clJpVVZ3Q3VQeWpMdnprdHFsOXdjZjdVSzJhb2hhT0hteG1aQW1tekM3TllUYXJ0aGpobzJFR3Z0cmdqN0tmQSttTHlueVN5UHA3OHhZN1U3UzA2Y2t1UUNwMlgrOGxWOFBFSkpmTG5rNERQUGlYUm1nU2dWTlpoUnFLUFgraVp0N1hkcUs0N280QzlLeDhOTU1NUHJ4UUUwN21TKzB5WjNVdFFkSGpSQ1lrVVl6MlhsR2RORzVkMVd0Z2dKOGFBTDZySUVVaGYrQVcrT1JZcUppVi9lWDNEc2d3a3BDazhvZ1N5YUJ2SUd0TXFQSFZwNHhBWkJQZkorSVN0M2ptZVUyL1ZOeFBEaHVuUnBkUEhmZHdlTm5pSDJpZzAwOG9JSXpyeGpodGJQdUhwK1V1ZExPdDEvSEsxMm05QktKZzNRdElPRU1IYU9GUzdLVHZWVGNmeVZETXdYNmpYekZiTzBKcGJpWFhuVk1SaURhSHlsTit2NlNBRmFIOEpkajNOa2Fla1IxczRCVDI3K01ML1JYOEtqeDRNZzRucWRlSmllSHNjd0pGZ0F2QkVUWXBLVWFHUHRFem9WOHpmMjdyMW91NzRZRjJUQncwK3dWWHlvbCsrUFllbUViaTB6Ry96eTJ3UlBGYmZWdmpkWVRKRUVKRzhyMzdIeWFxbTQvUHlHZlN3UmRveFBnc2ZwMDhRajVhUXdJNXhXOE1lajNhRUJoayt6V1hYVmpZUDdRTkdUbm03S281MmEvaWZlZ2xQb1hQY0xwaVdZYU9qU0R4S1VidnJqemN1U1pYZ3JJNU50WElZNm45eU4xWWpUajRobkIxMEFZTHFiakdmQVptVVVQMjBlRXNiODd5b2Uxb1c4ZVYyZk5xaTZDWUsvck1HdDFNU1FVRUM2cTVOWllWUXE1WmNGUTF1d2twQ1dpVTV5MXNxcUorYlRsREFjUzBFamhkcTNSTGhXdU1CaUhBb3Jqa2ZIK28wMU84a1VWeFBLalV0RHNwcTArcVFXOG8rTzRMYzREME5wc21hbUpkUHc5S09sUldabTA3ODRIRHRPY0JBN3BFY1hVSkpqWjNGT0hoZXJEQTUreEQreVFMR0F4eWNtYmlvem9KcStaZ29JeFVtMzVveW5XUjNYMjdYM3NMZnZjNjdlem1aVE5nOTB0NkJBeG9hdFZ1NzR2bUxYWEtnU3BjUDdkS2NmMkRvaFgwZml4a2dSalR5OVRIaC9PN0NCbVZZSGRDdHNHQ2J2NXJoK1pmancvSnhTL2IwSmcvZXI1WWdDMTNRZEtUNlhBWTNFYmhLTThwVFMrUjFnUWVQeTBNYm1XTjVyc3JFdHpYbmRMeGtlcTNEdXhaRE9ObUF4OFdSRVJsb1lpZ2tXYjA2cDFPNWgrTS93ZklOSW1TRWhoSkV1S0ZibWxZVTBReFVvY0VvMTQxbk9ZTmh6UWViSjRORUZBVGhHTWI2ZDl1QWRyTmRoaWk5cVF5Qk9qMWdCY2NyQTJxcGdKZVAvWXI0N0hONEtoMDRQK2VZV0pIZ3U3ckVqM0tHWDVRV3ZUNEk1SW03WVYzRitod1Urdm5YWS81dE9KNTdLc1pSTCtqWHpDeXRhdXEvekZ3M2RrZHhNNU81NjY1bFhPUnl5M0VaNnRYejhza3I4NUpkbE4xWmJvRU4rNThJbU42ekl4NDY0L3dzVlhCeHFxejIzUnUvZlBLT3JIQjRPWFAvRlVRdUFpOXYwcGdlYjhQOSs3TTlmZjN1WXpmdjdJQTBwcmlyWHJzWm1Kc0JoS3pwbCtubFNncmExZ1ZKdjZRRTBGUktIaDNRU013TlNVRXlKU3FyczFsa0lwcnVrRDhnK0g5T28zbGRvY3pSOXZsOUhlOUlsbGxOMEY4dU9MdzFsQ0ljNmRadWovWUpXcC8yYUV4VFJvazZxM1QxUnQyMUlscXBVNTNUbU5OckJHbndjUDJBYzVKMnFKMEFsQTFYR2V0b0JwcXV4dXh0WXRkUC9DMmk5ZDlWdk1ZbkxBZlpyNzZENzFwSW1mdUNEVjArdUVJaHFkcEV1YUFHUDZ3ai9WRitPSmhucjFkQjFGbE9NbXlWZDNSamxOMGF1M2pZM1VWejB4cW5ZNDN2UUc3L2YrV2NNSThzU3VPL3A3ajR5aW13TXRnOUR4QTRmMENWZVNtQWRZKzNLc3dSV1NwaElFSGZvNFBhc29jU2RWdFd6c2dRZ2VZeGRIekZKM2FjRkZXK2VlUFBGeUxKVS9ZVjlBWXE5YWlCeFR1RndSa0NiYmw1TUdJRGxYdVRPU2taem1id0gxZWU4TlBBcnd4TC9wZ2ExN3JsZ2JGQ3grWlBpOHdMa2NFSGozN25ibUZVVHNMOEpyMFAyQjBhRlB4YnNIUTFsa3ROOU16cW5ZV2RnT2t5WGRqVjZkZVFVS0pPUmJrR3hCdHpQckxPdFc1T3BBU2tYT0lPR3RmRzV6UmIxbzV0cXFuRmxvR3ZvbU1mZVIySWRtQ1lWTmM2VXY0SjRISzc1dmRwN2xPSmNlRHptK3RoSHI1RC9mSWp4RStva25TU2NBYXJlZ3QrUWNwL1ZrVGQ2OEJMRkF4MG9JZmlZbTg3aWEwTTBMdGc1OEUxck54Q09PT0drUjd6SzY4Z2g5V3BMQ0l5YS9MZEtlNm1yVjBYbzVwSTJnOUplaDFEUHlhUWdwTXFTT1VPSGM2WlV0aDdmNnN6TldEUEE3TzU1WkNuSFdWT3IyNFIzWlh1WHROeDRna2lmWW1VMHo0QU05TnNiTzNsWFFyb2RseEFKNy9vdXpOV1BPK2xuM0F6QU14b2pxKzdpOWNVTTF4NW4zT2hIRm1WTVdiQ3hadjk2Qnpza1JSV2wzYnVaQ0M3eGhDbVJDL0U5NUNzNVlJcE5ITzl6a2gxa3EydTF1akZ3cklzK0hLZDd3eUlIeGVaVzFTVTNneHc1QTFGY3NtbUppR3RTdDhBWGh6K2R6dFJRbDV4NUxUQzVnWG84YnZTNGpiUTR6d2JJQlE0YzdEcTBOTmo5RzhHV3dqck1FMEhocWhFaHE1cXRJYmYyaTJDVkxWc09xMHIxQ1MzSThlemc3Tk1MMkFReDJicjFveEZKK2o4bGNKL0FNYkFwK2lhREZTVm0yTFUxOWZvNUFLSTk2TmlROWdqSitZTTQxZFd1UnprY3krdkIrQVZJcmxMTkp2cXBTdXdDdHZ1MXVrOXpVTTlES3VZaXRQeVFnYW9IVm04b2xsTk9RcWg2c3IzVjU2Z2dzL1lSZnRmaThId2lyYjRhc3ZqR2tiV2dveTZrS2xUekc2YU9ROFlmSGN2ZDBBZlk2emExNEZFRzBMTmQwRnkrYStSUXpQK08yVzdiV1dOc21oZTRKSlNQY08zdkZxZjUrbGRqbUxCc1ltWmpmNE1CNU9VVmhXVDlnWmNTemFxUVJqbUFiNk1VMEp1VHpsY3NUbXd4N1Azc2RpemIxYzErV3ZqM045eGUrL0M4dzlDa01MSDhQODRyUlBZN0RleUhsZlVndW1ZRi8xYmluNFQvelQraGVkazFTY0gyRDUwQ3N0aXRESXJ6c0pWY0ZpVGhxZi9WU1ZmSHRKSkJPOHphdHpUbU1EM0RwTGNmYjU0WjdhVFFpY0VqeW5oU2NJd3JDbWRVeXRZZG90czNkeHBRZnFDbHFzY3lRMXJCUU5iRW1lSkJ5RDh0S1VKM2RoalJsVHZvQm1tWUc4SVhSWERHZllMZjhtdHp5Y1dqOVAvTm5hSHgxemRudmxSc0t2Z0M2dVhXWHJuQmR0VGlsYlprWHhXL254NHg1ZkNvb1JMNlkzYmIydWJSY1pPZ2VlRmRVZS9WdjBmNkVTaUNacVpudnRDdFBmME1mR1phT1k5NTRYdmNmN0lNK1hwandpMmdna2FLeE1SMXhiMXpiWG5iTFh1Rm56bUQ0Z3lOVk14dk0rTnloM0lyN3VXV0kxRk5JSjJBdHprb0hQNzA1VUJTQlVrTDRJNGJNc1dTV2VuZTNIbGtWRjlxSXAzUVphQTEyeTFtbjFwbWRhQnFPbHU4NG5WbzIvVnpVY1ZCaDFsSDhhMWoxSGFOTDVFTGFnZE1CMy9LbFhHYks1MDJzTlRkcWZabjY4STJpZm56UzI3Y0xzcWxBMW0vMXo3Q2JiUk10Mldkb3N3c3JMSFBDd0JUVVZYVHB2THdOMlhndW42OG10ZmFDMWpiR0hUb0NQRkpaRlNaUy9ENkpWYjVCSkkvcnZhMUNsVzVhU1hla0M1Z21sSEQzaisrTHFST2lrNlRRSHFyd2s1enpWNk1OV3VsajNta24vMGJCRXZyekhKTjRsVlVDT3ljZTVNRlNnT0pUanIxb21ScURlYzJpYzJ0UWd6VEduUkl2SWQ0V0RtK1pWaU5OeHdTRjh2NDRaN2xwb2pvUnZSb0tNcnVISnorMFNkUXRhK1JPTGF3MkFPbEEzV0xQOXNyamtqbCtsSDZqL09IYWw1R3k1M2RDeEE5azVyTEJ0cG85U3U3MHZuUEYwQ0IrRWdXbEdKQlErQm9EMXJVZ0ZxekNpdFdhT1dWTnhUd0RBQWJ3M0x5dTVkWWZwNStnRFc2OGVJNng1MHdiUW4vdHNKZldvem1EeE55VUgxejJXZUpBVHdxSm5yRmI2OUFaT0R5K1pQOGtuQjFNYnJaUFRvUTF4TEpNdFIyUnNOTGlwSm9pNlA0Z0QrRG1FTC8wZXBVS05xcHUyY2tuUmtBWmh1V0RjYjlTTm1jdXFQME11UjBOQ1FhbjJpQ0FNV0tOVEQrdGR6eE9PZ3dhZHlYWVNESlhjajE4RlE4UXE3Rm5yazZ3dmFLTkd6Z1FvY2VBREczR0dCRFFIRTJycFU4dm9lOTE3T3lteVhJcXNOcnZSN2EzWEo4aGhtbnR2NzNRTlp0T1hTVmdXbGNZYUg3enoySTJLazFCNk10T3JNZzdZOW5lMlFGYllQWU5oZGxnSGtyczlOZGQyKzFOaWJkL2wvV25ZSmdoRVowV2VublAyaEh4RWFPcWg3STd4WWdONXdMVWpLTWtTSGc0dkJILzhiZ1dkR0VqTVovU0F2Tm1Oa1FZU1M1cUIxZDB1VVo4TXllZS9HSHFYclpjVjBlU2RaamxaZzExclFycmNkZkpLaUQyTi9HaVMxWUtLQUdjbzVNdjZLSHpYMEpUWEl3WkNLN3JyMzB2NnlpaERyeXoyZVZVVnZXTnhPQW53dWxNbVozMWFuOGN3YllkTEc4RDhlMWd4NUtGU2FqdUVpK2Iyc2tDZVZtaC9yR1Joc3lNWFNQWWtLemFDSzBkSGV4L1o5aUhScjFLYU9XL3EyeWdaUENaQnVHa3dmZ3FWQ2VrOGlzTmNTMFZsT0I1QitIdjJtUnoveDZNbWU4RDBwUTBINkJXZFFHcTVoOEdicWhQRHVaMzlYU01sTklKaXlEQzdVM3M2OGkxd204VFQzb25HY2cwZXNkY0xHVldjL2tuRFM1eHh0SzNJblFsNU1RNzBSbFVKdW1wN2FvZFQzNnB5Zk1EZjJxV2VWZTlRcWtycTRzNzRPV0VJN1BSMVhpTTBoeXhuUmRhSHFaQzkrcVl4cmVtc280eEF1aU04bHBhSXBxQURPRU1zOWdYOVVIU0tRQkMzQUdJaVhIMHd3NXQwellnNkx1amZ6WjhnczJBM20yRWpGcnV3dFdiSzNCdkowL240THpVTDhlTWNJTWp0ZGVUVnM4Nkx5Y2YxUlUyV0Zmd0daZTFOdmNEMlZlTjVIQmQ5ZExtRzY2L1Uvd2tKMVJQclIrU29peDBLaVJWTlJYRW1UVnRYUDQwcGFvUDdXTHJYYWhOYldlb1ZZeXg2dTc3cTZsQ3pmVWlBVVRUNnJHdUh3OTN4T3hkRDRTSzVSWGdrSmt4RUlVWldNdlNNWVZXdEFBSXNoT1NsUVJDcFVmWHpaeVpkL0RjNWdBTnBCdnpISTM4aytYeTJVWlV4aUdqcXFDS2FaT01nK3RnMUxJUE5NSlI1SU0yYWxWYjh2YVpZUGVObC8veWlzRVJrVUt6MWxURlZMUkNSUDQyTWVXL0hCb0Q0SnlLUWdzYndoZXVTK2pmVG5aMmJzQUJyVDN0U09EUkpxNVhhNk5ZUEIwMENYVldSNlc3NFR3dlRyaE5JQ29DYm44bkpwWVp2dlNBeWkydWdneUJEbVVBeTQ5SW9YZ096SkM1RU5HNS9Md2RNeDVqcVpUVlIrZmJGWlFNdVJMcXQ3Y1JuWkFBNnE1MU8rR2hTaDRGM0o4bW50bkpHK3ZRNjVNem5jM25lbmNYRGtNeWFLZml4ZjJSSjBWK2hwSHMrTGVLSkJ6a2dPMENEWHhydXdRU0lGblp6UmxiZTZBVUVvcVNBT3djVUFadjJFeWtCclNFSjFTbU44aWZNa2NPMEZuSTNheDBoaTZhem9rRHFjL0NWMkRMUC9RSkE3Y2V5MmJQMDg5ZjBRaGRxdjRWRTJZNmRMRDRRd1ZiNCtuZGVwY3puNEZNbE9OOG9QL3hKQlZDa2JSdHQ4d1h2bnVRZXdIamVvVFI2QVRYRzdEUDlPQ1dOVklDM3JkcUM2TE84czdpK1NBRnRZc2tiUHd5RWtoQ0NwODBiWmk0WmdBdjFXV0hITUdqa1o5bzRlU3lMOEtXb1Y0Z0cxelVRMUk1MmhBSG9YZy9lbWFhY0Z2bk1DdHI4aEdsQi9ZTmhqcExTdmRjSmcwOENJN0RoUUZPeFhEb2h6TjNNMElQdVZLMGdhR3VGSmtuVDRjQjB0Qk9oc0g0NDBhRzVqZ2oxbC9Vd0c1VHNaOEh6cXJxUGFoNC9lanJCcisra2FjWk5xR1pkakZ6OTBBUXFNUzVCY201SWtkWDdMK0F4YkpLRnZDQ05sK3F0Zmhna05pa2VhZXdCNVRpVXdHR1F4OE40aElBejZBaGFOU1JJZzlUcElsTWVLcUJ3TlViQTd3dmR2bGoyWEpHY0hSRnJCeUUrZjVKWk5wYzFQZkJYQS9KSnJ3YVdSWXAvYnF0bHozdk1VYjI3UHFXNlFyVElneHY0dkFnWUpQR2Q0TmRZYTlLRzJPc0JQU29kWmZCZ01ad205VlJyTW43U1VPMk96c0lyaU5iY01lSmtQTi9IUGxIMGNKdEJGZ3NPUkVzeHIvVUxEaEhCbEZkWjdKNzRFMkk5RWlrQUF1SGJWZ29KSWtKVDMzUUhIbjNpcFcwYy9UNnJ0OU5pOFdCK0xLL05zdW1TbEJqUTJLUDJnaDJpK1BwZTNna0FqdXdSeGtEUUlQQ05hUWFQalZ2bS85QXJ0L3J6amg1MGR6VytSV0VyOVluVkh0bkFhL1ZtZEhXaXV6UVMrQ0JSMXdudENvNEl5SFhxbnFWYkhTekYvNjNKc2U0QWR2eG1ZeUpKTUxRUlpYcXpOY2laYVN6SzFUNzAyZit4VG1nQzNvKzNFTHJRZVE3OEhzUkg1VU9hWHJGdDc4N3l2aEFCQktBTHptSm9yNFl1cGpLVzlxay9xQkZqSFlwZGdjaXhWTlFmZFVneWpFY3RiUzVZRVJkQ2hRMm5waVZoclF6Y3JSOEZ6cStTUG0remJoZktCRnlDRHErQTg0b21jOHR0VHFZRk1CODRMa0lxcUtGUmtibG9pd1hvdjJOUDdmNDRCYlVZQ0VuVmxmdjZlQ3E1bXcyTEF6bXE0eEc3Zzh3WE9UdG1HbW55NDdHcGh0VzV6QmVUU3JOWUJ5aW9qZmNmdmtmSkRESlZueC9YTWhneGhCcXhEUmtFVWg2WjI5UWc0d1pCUGkvMDdtTEdoTldnanJ4YWxNZEtsRFRFSTQvMnZFek5vZVMrUDNCQnkvV2R4Q1hQcSsxZEY2M0huYTlJL1Q1K2ZoTjB0Sm44bzkvSTBBZ0Y4NFVDTXJPVG5uQU5vS05nVkNLeHVHU1BPUFdwcGl0VVlab0swaWY4clFlK2RYZ214cmcvK3JJUFFLSWF5RVBCeHQ5YkN4NjlyZ09CaE0wMTR0c3VxUmczZEJhaHc1dkxid3B6WW9oSzI0WHAvSHdEbWQ0ZGh3UEhUT2xvTS94YlhkTGhYVDFJaFVNcjhoMWhnRFByQU13R3U0RGxZOWJmN0E2djBQb1BvSkhuWTJibXlkSUFJbGFxbTNQNXVHVk45V0pJdC9Nbkd4NzZuc0piSm1YbDMvWFJBNUVEaWVhVktnMHZMZlpKbVh3L1AxVUMzVFlaNHRreWU5bThNR1NaY0VjT1MwN0dWOVA0Vnc3QW5VNHo2dFFXTWp6L1JQWDdCVkhiU3c5N1IwOTlZbzVqVzcrZEZ0T3hTbVNTeW5jOEpwSjl3dXZUS1FhYXpHMFM0MkNjenFkRmtDdk9BMzBUcldFcEVhZ0Z6aHhiNW5KMTMwclkrcjhmWGhxZWkxRzdRc1R3ek1UUXJKNjA4ZFplUWkvYjhYTmc5RmlzQk9Lc2JDWGpsSE9kVDFySFlua09wUngvWW1vN1R5bGtzN3AvSjJ6VDJucHVtNXBIRE1ja29lQ040S1ZhaDk0RTJhajlvRkNvUDA1OFk1OUxDTWRicS9ETTRFb1FwaHlhMHhuTGhDVit3OVdBY2N1MUxiNGlVN1BMOFJXQTcxMTVYd3B3Q1NHbHN0eGFRckFidDF2Q3ZzY25ZTXhmZkJjVytLT1F3WlZlcThLZFAyMWY4aEhiUkJCK1JNaFdYaDNQem56ejVWOGs5aXJwZ3lrbVVEL3p4OUwrUklYZ1QwcS8vVVRaY2R0MDhBTERLVHI0bnhTeTNVZHFZR29tRXM0bHJoWURqazJjcmdVaVMwREM0eElhZ1JDeUYzLzlNdWtoZzVMaUhuelZVbjFMRmdWdmxkeWNVYXVqMU9yNVJ0VFhPQldsczg3SXd6ZGppYlhuQTlzd2VLQmRRR0tsQ3JjKzlTdnVXQ2h4SUhmUUhNVWN5WEx3UFR6T09maTAvanBDTDV3NTZremsyeFVNRkhLRzU0WGhGbE1GdDNvS0NFUVpHSjhnZ0VGVlBpZEV3ZUVoczVqMWFPZFdCNnZwazRvUmhvalJnUzVCR0xEa1JOYktRNnNlQXFVN0JkVUdqL0sxNlducjNiM082b2JRTW1DcGZNcmhWeklvWUR5VTZHSlprMjNWNjZpNUJZTHlSSlo4S2Y5cXRLRVgvZkVrY2VCYjlOa2FKWjdSbzZ4cGRuTGVYWkhyWHZJNjUrSWlESXFhSDh1TjZaSUUySUVlQUFJelN4MWV2OEx4VVJPRVFJWnBUU1ZJYWFud2k4c202V3lHaU1rblVtS1ZLZmhDaDR2OEdmQW90a0FidVVVKytXM1pxa0F0MVlvb0RMQ3VlcGJzV2oyNndCY0FUVFBaSERMNWMveG5DbEluVzhjdlNYcmYrOThndXpTWWovZEtLZTlvbXR6bkFVOWt2VCtkYUdIbEhxdzVYUXgxZm9BcjdvVG5ISmczTkdhUEVURU93TEk2Q3lFMlQrRDlkUVJHSHgxZldUT2MvZGZpQmNCQWNtUXVDWGNNMi8zT0V6UmpQcXVOa0VlaXNFVnBRREtUOHJRREh2Q01mK3pJNUk3M3FNc0hpMDNCcnJVYVI5dWRxQkxBVFBtc2xBTWlrcHQwMzR2SFpnRHMxTm01TDl1SjcyT0tDYWtsRHl1NFMydGxYQXI5aFJFVHlLSS9JcG4ybGZ4bjZ3cjdVSGFid0FZUDM5VjR3dnVYbXhGQ1Z1bGI5MVhVdnoyVmxLZzNjUnBua2pLOVpJbW11UWUzZXdsZkdXZWFOa2NFOVVxUWsxS3ZxVksvZmMvM045WnY0bStOd3pVWG1DUEV1bUpkeUtVU2VaOGNMUmlNa241T0lvMkhjWkVYY3FVM1I2TVJZb3d1WGg2QjNXYUl2Ty9uWVM5S1NEb2paMUQxNVVTK3ppdlRaRHc3UFErc3JOckVyalZxMXVLMDZzZENIVzFuNmFuZjZSVk5YbTRaQ2FxT0FsbmtHU1NpdVB5b0t1WUlTVGFSOWF5K2RSNlJvM0tiNHlWRklJbmc0VnczWDk5ZjFRRDJWRG1kR2dZR2Yya1N0YjlMZy9Dd3pYdW1RSzlIa0Zac1hTVUgvTVUxSzJ2QjFRSlFiZDN2aVJ5aytTT3pRT3FZRGZ3cDRnemlGeW1tVFMvcTArUFViRTZONzBEVkk2U0s0QmgwdVBKZlZ3bkhMdWJ5K0lwdTBqdFdJZ0lsaUJGOU0rcnBncS9QQnZPN1BXRHFjNVlVWm5YcG5IZEp5N3Z5SDRlSFBBOFdoUTgwUjdyd3lBNHZlUm5ZTkhCcU9nWWdDbE9QQnBHSEVvZU4yWUs3MHh5VkdVaEh4dUJRc1EvZHpZQzFzVjZQSlo1a0ozS2orQ2kzVk55aWFZZlVLNU1ML05tbjh0NXZndEg0R2V6Q29PNEJXcVVLeFFZOVI0eHAxMXpTK1hoQTdRZkpVR1BGVFNaWVhJQWxYQjNzcGlQbk9yMFc0UGRIRzNzNmtvOXE1RW9rbXc0aStUcU92TUQ1SmJWR1dtS2hyNjNKYXM5SW5ZaHUvRlh4b0hXQ3AzdGlmKzl5cEtNZXUvMHhreTYzTHBCNnN1SW8vMVg2T3JwYWE1VHRMUGQ1d0dWcEN6bnR5S0FVdzBjeEV3aVQ5aXVwMHFhOFFMOVlNZFpZdm82WG9wRHVNMm9LSjlRVGlIRU9uRFhWdEplT0RPNi90aEtyclJwL2RDWDdEQzE0RVNHZW0xOTk5Vnp5ZjRqWlUwOW0rejVLVSt2N2tQTklkSjI4U1o0dWZtMnZxVXduZlpBZ0FVTWJxRFU2QklNeTcrN240ZlBKaVBZbE5tYWRSYVh1YjgvclBQK05mTWFGbXpmemFRbWdmb2pCR0tIa3NsY0M0b3dBTkxJU1R4N210dnRpOG9Tc1h2NWthUy9pSkREbEZ3SGtGUEZGRllrY1ErdytYWUlZQUk2WXdURjg0My9OWUNoVy85RDZkTkRHaE4ybTN6eDJjVm9jMllLZFhvU1NQRWUvOFU3ZG1wZ3hZMDhqQkgwMlBuN1REYkw4MGNXQnlxSWhxUXRzcWt4bDRuOGlyWWIydVJxNlRPU0FVOWVzMldLNmoyRGYxTVI3clJRM21DTW5xSG95VVcwaWxJek9mT3pOY0tjYU5pUUF0Qy9BZXZqMUxQK0Z6M29KdWQ3V0w3UjB4di9hYWVGR0J5V0E2K1N6bWZCVklSam1sdGJzYVlibUFEcE5VVVNTQ254RUtjVFB3OHRybThjY2ZIWmd0MzlzYUV1WjYzb3JwUjhXQjA4QUdpcjJyVE9BM3ZWV3R2Ry9wOWRXYUdpUVZqUWtGQ2o5WmJJYUhOOUF4NnlHT3pkdEova3A4RUE3Zm9LK3lmbFhGdS9PTmZCZHBmVUJMa3JiUU5hQjljanlBMXNRdXd4SUZtaVp0TGV0aTVQUW16b0Z2ekZObVg3TTZIQVoyalBkVGIrbnV3YkYvQUZCL25OUHRZOEFqOFJYM1MwdC9xM0piRVNNT0ZBU05RcUlqcFNUSGdLUEdPalRYcis2bGxqQkFBbVQwVnBwWVZHQTkvMFNGYlFYRlRQQ2dScmpMczhFU0VWbWpDRkd1SjQ3dzMwUzdFT3YxenpaM0tSWUdtWUw0Q3VsU1M1cVlBSUJGNlJjU25VUDJnNlpMRVAySmZkQStCZUtZdU5TNEJiNHAvc0dlVWFhZjIrZ1JTSUkwamo3dGhuMXdjVU9LV1cvREVtYWlueGRzenV5NEw3M0p2WnhUM0lqaEJSVW5OVXdiL3BTaGJqVTV6ckxDUk5LeWtVK0JCYWt3SzE4UWttVjk3VzlGck83OGpFVDJ4aUhjZFNDV0pTc1NFU0N5OUN0SVZJSHNJZHlOYUZ4WVJkckp0akxxR3JpL3gwdTdXZ0tyQWxHUXhqWGoyR0x5ZGM5YW5CRllTZm0waEJXbHBDelJ4dElmNURocE5OWmEyQlZsNE1tK1ErZzlVQ1FZV296S0NCWDNsU2VQWTlEZzRTZEdzR01GWUZ1Z2J5a3ArR0pGSXB4TjdZKys1a2RvMXZpeUdGR0NpZVk2Z25GTFN5eVZ6YWZsamF5S2NjTHRQY1dTaE9NaC9iQWh2MmQwKzJ4djl4QkhKSkM2SXBVVEJ0aTVJTUJGc0lkS2dHL2M1ZTh2ZFdUbEx2WDRDdHVNOE9nd0Y4VjByak5nSzJONVdZd3c3SmNSZmpPRmNlVFZ1R2dTNUNLU1dQU051RHRvUTJZMVdQSzNIVlYwdXRUeWllVlQyVUVhRmhqajJSa2w0aWV5dkVLWm1QQ1N2UDUwK1JmRFRFdW1xY3hnM081cDRZcEJTVFhTaTQ4NC9uUzhsbE9obWFSaFdFZGx6VDBnYS9wZG5ITFBhUlFKckc0RW1KNnFSN3g4TFAzN1pFUmlqRlU1N1llMWxXMnRHZlhRVG5UbjZPM0Z1cXYzQkU2K3hlM3BNVW4rdTFMb2prN0VZUlI1TVFzdWRkZUk4cTRxaDNpTlF6RlV6NVhRMmo1T1NQTzB1UjRNL0FUdUp0R2JVb3I3UjRhSzNuSXIrRHpzVjQ4R2RxaUsvbjQvUGxHd3lZMzJUTmR5QTFjMnM3UER1eld3YlozZ2tQc013TytTT0NIYVZHaGUrbVdNelpoS2FQcUp0a25zY1lVeGo0bkhhalJzVXRxc0VuQkZDQlhrckxJN1NwQmpiNk1pbXpSVUJLNkdhYk1FQTFybnl3emp1VENPbEV0dGpsZWlvSDd6dXNXcFdTK292NjFQMFhWRUJqeWNSdlUyRUtXYnpLNUo3UWhPRm16TFg3NW1Ga0toSzJ1S2dvMmE0WUVaZ3F4ZG9CeTFtcElPV1VpR043cWE4dFc5RnlhU256K3dHMHp6bDliTjR1Ym42aytlY01aeEJyaFhQOHRKbWp2RXNrZmVsWWZFOGxPaGhTaDlZbzQvaE9kTEtIRzlrS1lEQlY5QzdmSU9UTE43QklGNDI2YVZ4OVZnSjNlbUNzSFNNY0NzUzRHRUpPTGFnSEhzbVp4MXFpWEdmRDlUNk1SVCtqUFdGNTRTeW1kZjVlK016Q3ZQRGV3YW1uUjVCakczN1pPNG5oazdBL0cyNjNiWWxxdXBSMURxMW4ySUNvRUtzeE43cVlnd3hTRkMwa09iMWxNYmV5Mjc3ZzRoamEyMWlTaTc0ZHljUkxGMkZnb0twWlA4Wkh4elowYnFwa0xYMHk1cXNEMHFLeUlDSjhQNkJ4bGxuQkJNTmRuVUhhUUJKYlAyMEd5anpIbytwS1ZrNHF2TU14TldiMXZFK1UydCs3ajk2V3czUWtKMjlXK2VNMnFDNEZydTc3YjdNbEloaTdpQnUyOCtRVEFWTnhsMFdscHFqTktLNVBsTkZaSmRyQ2lEWTJ1SjgxQ0YzMjJkdFp0Wkh1R05Gd3Y4VVg4K3N3ZTByQytMeTdhSDFmTGFXNlZjd0ZwZmZUVlo4aFIzR2MvMDhWTWZUUkJkVk5BM2J2VnhYLzkvQVF5eU9kRGV5MjJWZDlPczcrelhuaGlKL0xib1Z6SFF4NVJUS2pvSDlxRk9ubE9ZNStXL0RPSFdiUDRocUc5VWJrQ2Y4YjhOeUxHMGoxVWhzRDh6OWNjN0p4WldoSXJicmY4Z212Y2pyLzhrbDVuTHhjMmZHR2l3SnQxSDJ5WW12Q2tjaG9IR240WnVDNTNDNlh1cGpsOVk0bEpaRi9oaHp0VFY4Q0pIRGUzQS9qUjlOamZBRlAzVlZ5Q0NLdmN6YmpWTFpZc0ZsTVl3SVZLVVIyWlhwYVZoQmNncURqOFZWcnFmZ2xDV1FQdnpyRmtKcG91alBzSDhCVU83K2hCVi8xMlFVaHJ5ZjlGYlZhbXN3V3FsSlNnamM4Z3E1TC8rZVN4NS9kam1iR0hSMmZ5b1FHR2Nnc1hXSVdrYjBmWThyWmlWOWE1dmpmUG1CRlFESE4zZFZEa1p2bnU4dG9JMlhwR0MrdmpyTGVhaHgzZ1FxME5BMGNBVHBWNGkvbUFUL3cvYjUxWHZGVEN0N2p4TGwvOFBwSnVwaVQxN2Q1RVdWWEIwRyt3Z3A4QWFNcHZKSnM4N1RmR1dzRWdGYVExRFZMTGRib09mb0l0U2EzUWEzOUFvTy8xVVdJb0lYU2dOUTEwQWFpcm9QL094bE9vd0hGeHkvRU5NOG5EZ3dpUk9RQUdhQ0p1L3ZtSWFNc1lVUCs1V28xd1dES0UzdE1OcW02aUFqYURuZzdCOEw3SmpDNStKRmI5MnBtd0lpamJ4WEdkQTNVMkFEdkE1a3BQZnhsWloyc3FIbkdqZTQ3MStzTDhlU0RvVHJ0eG1RNVlHZEoxMEQ5WXhRblJHSlUzVjFQbmx6RHpkU29ORkZUYm9XQzl5NGg1Uk5OKytlb2M5RWZab0FWR09OVzZOeVBuMTRmSzF5VFpDbkVOY1MwbXpkTmF6ek5ydkVsWTRYYWk1VWMzcDF4TXhCR0RIT0Q3ZmVEdVU4UlNUcTk4Y1pKSjVXdnVpWXpUNCs0UzNzdWM0bFpGUGhiN04zYVR4TkJkaWRKYnJtdU1EWG80OFcxS2dybllSNnV5dUxWR2J5dmZoR1ZGcVVzdDJ6d0l4REw3U1pQcll1NEZOS25jbmVVMGdiVlNIcldOR2xOMHNialVlVHdPNjU5eGo1dnVpR0N0UVFLMFJpemg2eXRTN0RYOFBmQ2Q4anJwT2Uxd0R2OEF0cmkwNVdaS01HNDlyaWR3OWo3bzJWdkw1UGxIZkk1a0w0SnZybkxZS3dPaktBM1p0cm1jMXg3TU1hRmNMT1lFcmRNTXUzSzJEYk1rRDFjbTk4UEdqVlJGVDQxRDZpUjc4ckQwaUNudHNVd21jSGthR21FOG9nT0xqUzFkeStqUHRCd0dubFZva1B4U1ZrbVJJbEw3NVVOM3hkYmtMQTdjcWVxeHVBa3h3cUN0L3B3Z2I1cEdQYy8rQWdZVzc2NmdjeFFCRVBhTHZtTm5zYmwxbTg1TkVLblIwd09vZGw5V1N2NWJQTmVINWZqT2NwN1RQYktxSlVwdy9uOHY3Q1JERDdYVGVGYzJqeTdpWHVjN0dnc1JFYjYwNWtXSEhPc3V3UGx4alpaYVY5VFJSOXRtR3plbm0xQzBPQjBqL0FoK3Z3MU1VNm96SnNJZ2FwekVrNHlQeEpFZHM3Y2JFOURiaklvUldLY3pseWIwcElhWFBNT1lXVk9sSHNlQUVUS3NOYmg2ekZCV05sVDE1eHpwc1g5aGpwb0Vmb3dKNjZRV1NIRndJcEsxb1FpajExZk9HbGRKWWJIUG9GKzhmY0FjSXpiTUZicUZ2NzB5SFVqNW5wQUEyWUQ1WWViMWk1SGkwRGxzTHZMc3ZBZ1Q5NmJVZlBpcXB4YlI0YzV4cERxc01TNkNhZm9qRjlUMUFVenUvc3U2cTI1ZWVHbU50UmdPdXZrTEl4QmJZaldvNEJ1N0M2OXU4aytvNUJBNkhoMFQxTkpzdHVzS2MwWmdyaGQzaG05NERxSnpONXV5VHVjcCtERUVwVFFrVm9KMzA4UThvUytrc2N4a2hEUHJjZi9IV0JKSVhYb3UvSXV4QVoyL3djNGNUcGVhazJPNklhSFZrK051UzZJUmI5ZjcxYnl5TGVMY0o2bk9xbEZrWDhjRnFTRUhZVzBpTDFLRWN0T0tNR0hPMzJlbUErOElneG1CQmhZNVRpM0UxR3RBZUpiakwvZ0F1VjM1MFFhVlhud0poQ2N2QXA2QnNIV1grd3ZHL3hmaUo2WHptUHJRaGNuRnJtN2Q2KzE5bElTMWxwd2F6WUh5dUgrTXNpQzFOUHFFa09UTlh6WmtJSW9QUDk2dllEWU1MeDNIbUVVY1hwSFczRG1YWmZ3ZmpzV1JoQzRkbnllak15dFVaME1iZ2FmRUtQdGlzT1ZnUFdyRGJjRlJTVklocmN0QTlZTGpmcnhKMGhiTWpVcXp2TU02Y0dwY0prQWFUNGdMT2s2NWZPbU43Qm4yS1NEcWFFZ0ZJb3IzVndrYmtpREhNTk5UTVVQVkc1Qm9aWno4UzFFbXFzSWNURG93cjA2bmNUUTBLTHdsSmRkWDIreHA4c1lCRzJBZGsxcTc3S1JjaVIxeVVrd01kelkyK0F3QURPN0hhMlVDY2toNzJQcHArbUtGWmd2OUFERXYvRGlJbEJ5VFdycnZGQ0NPVUxab0JMLzd6TjBLSDdGRmNWR3llcERqNERMcS9SMWVqbnl1MXV4QXNGcUJydVM4SXB4emRONyt1M3RVWlA1QmUzSUZtUnM0ZjkvTGRJMVIrMGdPSWJzdERSRm1WSlJKSi9qZ3g3dFJYa3FGTEdNK1VnUndsRWZjVjVua1dzMGJaeWJQazZYUkdpYjZ6MmlEa0tUeVIzRjhZTnd2L1ZJSXB6aEhpOW5zWUFTNVhzRnB0OWczSjJOalZMSkhSMUJ2YjFlVFJVMFJUbDVQcXdnZDR5dmo1UTVmR1dtaTNhYU9ZaTNLRFM0anNZQzZWb0lsaVh2NGI4VjFTZU8xVjFRRW9HNlNtNzlyZjJGNndNczhSZHF0aktDWmd5MTdXeE4zV1FrM0NaYndpMFA2ZXVZcEVxRkVtTG5iNG9xTENmM0VqeVR5eVhKdkpadXdFZmhGZC95VCtFN0RnUVkvcCtTUXFaU2lSY1p5d3BkK1dRRTNpVWVnOUo0VmxGSEYxclR2OGdpbTQrTWJ6MzBQYnVtd1N5RVRWcFYwSXQ0WDcrZHdkOXN2dE5SejBRbzhUajJidnFMdXBaWXUrcktYM0JRbXhwdFFuUkVObTI1MDJWcS9yYi9UNHJXN0pxdE0vYVZmR09Vbkt2VitaWjVwaEY1NEN1RjFjOGx4UFczSXFVMldlS0psVXMxZ2l4OWpEd0JKM0JlbXVCUFVRR3pBanpFMmdhOTZGYVJNc2VCTzdTSWFKcit0SnN3cnBtczBRdGdPZHZPU0tMK013U3dNbm5BV0pzb3VLcTlmeDBDUXowRThrTTFRa0RidFNtWjZlMTZhUFhRMEFCb0dkZUp0VXIydnhneDFmbTZEY1F0UzUvMlBxY29NUWVXVWcrbmRwY0R2QmdQM2ZGcHp1MkFPQThONG9zVC91TmJuYU02bnZmbXI2aEpadjRkc1QycHprdU9sbmdma0IzZ2RlUm02enkzby9YcUppcWJzUXk4WVkvU1l3YmVRSXI2aVI3eXQ0TFRyeHJCWG55R0Rib1dCd3VnNVppUXlncWtRMWp3cGZPYnRteG45VVF2YW1NeitZbXQ0cFJob0VGZUlKeWRWTUpCc2NYOVZiM21MWUwzMDlwWGV0UlRjdlc4TEorYmZUckhhZ1Q5SDlTM1hsVlpoZmRydER6Y2xUMlFEQm5Gb2p5RlEzM3BuRnJaZE80L2RkMmgvZVRvWFIrK29CdkFIOEpDTzhlSVhtMWJHcVppczBBc2JIYjByTDVCeWNPNUNCbC9ncHFGOE9YWHdkQ2lEeGE3dWIwRW9TYStDMVI1U3k2Z3FkS3c4QUZLaFhHb3VFVFc3TUNTZUZhR1FRdzU0SFFTZjZpT3drdzVBRkNsMEpXN3VuQk5IelRjNzkyMDhsNW1obFNMam1wT1VyRTlESFl2ZVgySnBxN3JvcURUVVZUWCtxZUwyLzh2NS92SXRJQ1dyMW1sN0YwNGs4VXlSMXp3d0s3UTBLSFZRYXJjbUdGaTVCVm5mTWIvRVZpQkZGcXQxWlQyZVYrK2U1TlBjeVNJa2dQM09OckxYeFJ4c3FybTlaWUM5V1Y3Z1liL0FUd2tzM281SmJzbW50czVvNWJkS21PeFRpaWRCdG5GUWdXN3VTcHVSZE51TllYYW1ZdlIrRTh4WGgyUXFRQXVRNWZsZTEzSHVDM2JXcHErZDVtNWVpQ1BSTFZmZVpVQlpud1RFTHRaajFNNlQ5ZUJsaWcvVTNDWXRocUpMd1NUZUhzekNBMThXNlgwbVh3V1M5YkozdWZtN3g2Sm5LUDVJV2l6SnlCRDRKRWpCbjlyQjZTVVpMTnRQdDB0ZmtaWEI0YThERUpzcmRncjJBc3AvNzBJUnlDekZoOG9XcTd5NWdSUlFIVDRHcmt4Z1F5bXdiRjMxK3hpYVJTYlVwalQ1QTZZUkFycnlKQUZLWGRaY1RFMk5sUHhIRjQ2c2pKdmU0Sm1icVgxTE44K1RBdDR5NlFna1pqOXMvL3daeGU3MWFEaVRsc3Y5OVJrK1B2NkxRcnF0cHNBR2tMR1dsTVh4Tzc1MytPRU50d1lwd3hUNlh1eEpuQVBoZ0I4QTVOdy9tTWxXOS94RTF3dnViWmZTYU9jRGJHdC9uYUlLY3VkaEVqNWxMZ0hjMjJNZkRobTQ4Y2paS24vWVllNDdsL2RST0JrWHd6TElRUHVQbTl0M2U3MmZZVmVjalM3d3NzTWR6VkNzSXNULzVPOTdST1YxL3JkQmVVNGFxZG10TzR3b0NPZThZbkJaTjdYVUQ5TTZsaTE3MU9PcGRYcHp2RC93ZG5pemdyekY1MFBrbU82eFJEUkxzYlBacEdyUk11T0lCaWlHMWtNaUp4US9Rc1JJTXpqVFVvR2xvL09yRlU5TmFwYXhwNEFrckpDVUtqV245QVIyQzFJVnhXRjB3VVNYQTVEZWVCb0UyREF0WHhoK3FnNVA4S1VCSitjT1VWLzlsUDl3bCsycFN4M0ZwWWZwdkxvTmdUSFFBSGdsNU5XbzRtb2ZIVzBTRmkrM0ZDL2R0L21HVlhiSS9UQ0MxbHR0bWhYMm9oV2pHRWkzNC9MV3FXWE1zWDh4aGpicThDWmFodzdZMitZVzVGdmcwU2NHRDBCT3hvNzdGRDF3MWxwQ0RYNE9MYk1aQzRJNldOdUhLblFZNnZIN2plRzJOcnBWcEFZWUJyajVvYzd2cEw4TXB3U2pGYmY3Rm1uOFpwSjBwTWRyN2ozMmF1bXloS1YvM0lLRDI4RUhjV2Nrank1K3R3Y0ZjNkRtZUtMZVpoS0pVNE5JVzVNNHlhc2VHL05QWDNPcTdQbm5USFFiWlRMaDEzS09ReUx1SURWMk0rOXVRa0RtTG1nWithem4zODZkYXB4bUZ2RGZMWXhxbDh1WmUvblJuWU9HMk1PaHBGblRybU45UDVob0IybC9FZmxlT2FUT0JWNms0ekZrR2c3ZkhtczN2OEpIb21DU1QyalNudTg3SnAzTnhldmpRRys3YWxvdEpqcDZvemczU2lPdWw3SDIrRDJwUWJ6RVFlNVpwdG5ZdHNBSTBiaWtybTFURGRYRWZ0TXlhU0RENVRWZklLNENBOTJMeHpCRzlsa2ttSGVuMzUzV29sb3FCeVNGdUcrZHFWZkZENzJlVHVJZWVaWStoK2p3ZVBrK3ExT0RDWlVyZk9FNE94ajBZWmx5MzZVZlFndy93VnVEeVRjQ0ZRM280V0VJODVMeHpxcTUwUEtlb1EyN0s5aEpnR1dsbDNjSDFEbWJaY205U0wzSlV0bXVONCtCMk5HV2VWQzdhRHhrZVlkb2FZcmdlQ0F0RW5XRHFScFFMaW9TK3Z1YmpkczBQV1RvbnhXTHB0b2EzQUpoamQ1TWl1QnBxaFpLQU1qNjl6cmY0WkVqQW0zbHM4ajBrdERDTHF6MXJEd2VOeDF0OHRlazY3ZFRhVXRhQlhQSldEN0VUYmE3Y1NGU1hLd0pTUklzQXkzSmdFR3dQc1FIN0ZnaVplRDMybVpEME9POW1mTXkxRU5ja0NaQTRVQUM5TEVVdEllYzJtQ2QySGcvL1MyQ05XYVhBcVVtY3N1UHdIeDBNdzFmeUt4N29MWk9YVzZXTDY1QjBXci9GVTZ0ZWo2YlBHMnkzRklHQlI2S1NhWkRmOUtmbm0vT3B3d1BRektaZVQvMm9qcnNpT1lXOUR4djR3VTA5ZUtBSTdBMG4velZ5dUxpekpnL2JNdnRsbTRiUFYxZzZBRVpIRGQ4RWkyNm1uRDBmRG80eDMrd1N1Um44c1UwaUdsK2RGaDZubHpmNDMwZlVwdmFaMisrQTdiaGFwZGNTV3h2cWZtWERHRzNuK1VjZDBBZ2l1TmhEcCttNk40dlB5V0txV0ova1VuQ0VrTmR4V3A1bEVSVk03d1MyNllpWHptNG1JWkZ3S0pvNDVFaGhOakZJc2JodTdiRFUyaXd5RklZUG84Z09SMS9OUDhFRFpJelpSUWpIYTJuRFVtL2kxWHVqNzFPb2x6cW0wcWVGY3VaNmZVbFcra0k4VnJEdFU2aHRoQXNKOHVGL2Z1TmRkbGJ0aytBMk9pK0pIaG52QVJIUnRUUFRicHNsYlczY0NuNFAvb2djWkxlaEhXV2FqSW1jU1RpR3JmdEdmekh4OHhkMnBpWjJUQWFSVFVlNWV2RC9FejVYL0NUejhSbU5mZEZiRzAvOXJrUEp2SmJXc1hlK0pMQlBRdTBMQWx6QTVBMWV2aXVwVzNOQ1RyNUVKMU5uQ1BOeEhDTXl0UmN6Z2RxWXNxOXZuVWtqVWltdDNEaVdkNUxOdXg4RXVpMkc2SWYwRFdiNG1uSUZDcW4yU0dBZWUxZEIzR0NFTHBNUllHQisyK0RoT2xkb2xOSHdYVXkvNzNYOHJRWm0vU2wweUdZS05paHh1em4yUlYwbXQvQmh1NWJCc1M0aE5iVGRXV3h3WE15U25ja3p2dDhRbnFhalpBMVdQeEYzbmhRN1JLS01VQTY1Q2dGT0NZKzdoWXdrK2lQbEZIckNjTkd3QVBLanU1YjdkVEN6eWdXeUpzMmpVNTFwbWRCa014T3puYlRNRjlSQzBqNnVFNVB4OGlPcjVxR0dmZXhNTXg1eVNMejdOOUFzOHFlTmFvN3RraFg0QVlmZHZnY0ZleFExYUdxOTMvSGVDcTFIOVRkdENRVDBQbkN5Umx4eUZoTGRIbzFmVXJzVTBXRFBBbldSUHR2MnhhY0FmVVdYV2NZN3ZGYjlUWW9XZVU0dWJzeUhtRUh2Vk81Szg0ZUJ0UWtHa3BpTW5nV3lSclNnREJ6c3FYK0JNajBhMC9sYjBlNExneENqZ3Z6YlUvem9Zc3FoS1VhSGtVMjFLV3dLK2ZDUUIrTXB3bjdkcThYaVh6RlBLRUFPQXVsSDY2bXR1eCtoZ2s0b0ZsRURPWWs5b3FWTUtLYmx0Q25yU1NnbUx2aDhFVC9VaEZTR0ViUE55MlRub0NDeHZld2t1VUVscERjZWdpbCtKK2ZnWGRyYVBZVGVCemMvSmRaZkNwM2JDdTFmVVdSMUQyQjh0RmtvdTdmckI3RUgrWDA2eFYvakxTNEJwQUpjY1ErVTFvSk1GRXRNYjlSdlZNY0ZBWVQ0bjJTYjRPVEg0UityRGRocVBMTk5xTkNsQzUzdDhiYnE4TSs3RkJxUUlnSHNwMTVWNE43WCtxS3pVRlRSUlZhOHBKSEZuWHh6NnNRVnBBZ3pvNnh2WGw1eWhTbndWNDRJbDg5QXBFMHdUcHl0RktjaVZaamFHQTdDb2VZakNIL2xWdGpjckM2WUhpRXlVZmFqVGpEMTJ6aDhnaHJWSjBSRjFqZE01SGp0ZUlhMTh4RzFkQ1ZXZ082NXBZSlVuQ214NW4xaXlLaTVnajU5NVYyRnN3eXVpMis0QmdBMUU5TnhaRk1EeXFFckt5b0JUZ2p1OGpiWThCbDBHT0dRcHdBVnpSNXYzN2JjS2FvN0gveHFiaDVYOGpsaExGK3lIbkQycmVOL3QySDlEVHMzT0Y4TFN2VU4ydG9iL01kcWhpeHMydjBremNlQW9UL1U4MXZtbWg2ZjNMKzhKZDdZZlVncmF5M2U2b0ZGSnBNMysxVWVkY0dkQzh6ZWJOSXd5U0RnZzVMb250blZhRk0xS2FyZG1wa3luc2t4eEtrQmx2VDJjdmk5SW53L0llZDBzUEIvSjkzOGxxczlqRGV0MDVpWi9DMS9pbTBON0lscmVkaXZsVnQ2a0hxemdBbEVTSXV4MTFRRmEyNFZvZW52ZHF0NVhFZndkV1JkYTJUZTBjTnNvOVN1ajBabnZvaXNyZENoOSt6bVJNWnNBK1FuZzNzYVJFRWRZdHpseVdYSHpYTERrVDFEeURjdXJoRzFyRGs1b0F6dFpZWE5QenFWY1BCenV3RlU2akNpTHd5NlFKN25YQ29hSEhNRmN0TFZpQWRtaWpDcXBhdzdFOFRiYlU0NjBnTkZmVTdtTTgxWU10OXlhR1ZFeUlXUWtUeWNxMUpiQTNrUVpMK1ZONnhuc0lKdHVGSjR2RnNJM2xDN1dMZWZ6U0h3cFpPb01PRHFqQ0JOMXRjNEUySHExbC90MW5NS0xSRXZLZnR6aGpnWmRyNHgvTFliRGJxL0ZvUStmUDNTQTZjZGJKTmhDcWl3K2JYS1VBMFBxODhHdkNnSUJ3aXNxbkJuZ2JtNDVtcEVROG1UdzhXeHJtL0pacTgzektaTERQQnovanlaUUtkSG9tTXhnRGJua2pGTlE5UnVUSHlzVklDcVFuYkh4MHpLRFpUSVNFNTQxRkRZOHFYbksyc0NIWEtvd0lWMEFqSHAzdThsTWlqcFl0b0FTZHMxem05MmdxQjVqeWVjMzczUmlnRittVFRnMmdzbkpOcUZya2t3YzBoazlIWFFGdVprdlFjNWhSNWNpMVNKM1VCTW9Zbzl6N0lLWlhycmFKaHJhUGhvWW5mRlR6bU5RV25FQTJYY2N4NEdUMTE2WTFPcFpvTnNnQnRTVlVqSmxDR3V3WWZ5NEFVMXRuWlhFd21SSGprWDhmS1ROSWRkMUhnQkw1Y2hPNVpYdFVTam92cnFGdFhxeHJUUmhMQW9QZVVlRnYwYTE3eVdjTVU1Yy9XL0wrelBlclRJZUJjQ0dkRC9UY3ZNVFBkV1ZKeFdLQ05CaVNUOHgyY1NkUS9pdGZUL1hINDBIRVBkRUF3TE5GMTNOT1NKb1BkMHFvbkhRMjlLVnEwdFQvakFER3BTbkVWbFo2ckhjYVd6ZVEwL0RqOENlbEdRL0lweDNjcSs4dEhaQW8xU2w1SXN5d0hwTnJacW56bWF4dktCOUlsbGFtaHVpWDZKbi9ETnIyQ3k5cE1oNnYxVXdlMi9FUk9ldGxSNUcxakRud3g3TkR4S0xxOGprdTNZUkVFZzQ5YWxiT0JVclB3cU53WEwveUNuZE1oSlJoRnlwQ0ZJdGN1eFFHMmN6eGszRGVydS9JWHBrYWNNWHhnNnBpd3l3OHdiYlg1cnNEanA0QTlIMno2NVo3U0ZQWUgrWXJYOHJ2bVk1WkVNMGQ0Q0tOSHV6WGdzTURqWTdUR2hjNlM1WVFVbWt1QmMvbTI5ZUM0VUdic0R4LzdFWUFkZTV1anNQSnRoSzF4ZkVwb3haaXJHUC9aU1p5TVVGZXU0N3pzWTVnTGhkR0FVSXdXckM5NFo5R3J6dnhqcmxzTWhBRWc5dHNLUElPcjY3N0VWY0NLaHRocndmWDhMMUtpSVI5Ny9VbEZpWTltTEVxV1Baa012WjdvTHB0NFNsVU1aMEJHVVN3cjhwZmVURWVnRVI0K0dWdjkyQ2JvUXN4ZjVLSEFpNXkzcG15NVdaU2JmNjVidFcxVVFyZ1FwbENNaEdkNW9uNEp0dUFkRjhBNkE5RFc5V3RmbEpobGdDdWZzU2xZeWduRXVxQ3prNENPSk13QzlyT1FLbXRYbTJzSEVoZ0ovRklFM3d0MW5RWmtreG9UZzkrZUlUQkVsZjVDUk52a2d2L2JldGdrWWxWZlBJSE91aFBnRGdLKytpemduSExTY2M5YnpTRGpzTWF3OXdKTkxVNWcycUI1LzBqS204elY4NU4xRW1lRFhjUkdQWStnL3E3dDRYa2VObk1GTHZSVjEwU3RYdS9aL000NVg2d0t2SUNEMGhLZ1hld3BsRGtPWDIvTFkxZW5jaWN1VUFScktMNlp1WlY5ZlRCNXI1MldLdTZMZTBqMjgzT2xHRFRZbGpxbHM1T0FnNyt4SUw1SkdwRFJnOEZnMi90Q0duV0FzZlZZTHB4bFBsMGxyMlVwV2xSbUJOYWFRT1hQWng1ejVZVE94V1NiZTVZbktTWHAzaGdVcC9kN2l4aUFXRkkyUjFZZ3JqU0N3VURXWTNGbXZOZHg3SGdQMm1ILzNUSHJDdGxUNVpEYXZSNzNEZzlFUGxKSU9aNzJLTThaSEVOU0xkK3VsNW9QVi9LNlpxaCsxaHBsZFU1SVJLOG9oZ3pWa1hJMk9zWTIveC9va2NhKzZxckVVam1nV2luREZVV2V5Qng1eEQxWGJ5Sjc0ZHhpOHdHRmxGYnMyb3VIRXRPVkcrMG01WVpOWDQxbWlMWkRYWFdiN0ROT1drY3lGcjhXVm53cVZpcGg3VC9xYUNYOUV6Z0lvN2lZMlVqTVdSQTA1TWMxMVFyeDhTK3ArUjJuWWVvOEJhVmx0Z2xDWkhaelRzZ0duUnF5K29aY0NsaHR3WWU1dms3c2gxWk5aZW03ZnpnUUtwZ3M1OWlpaWFJZ1dsNDlma2VYTjFpUDFDb05NY09ldEtwU2ZVNFdZZ083aHVzY2dJdjlGV09sU1g4WTdwWllSZWxHZnFSVGFXd3FpTGNidlRlcmFjR3oreUlsR1Rydy9yd1ZBaG1CdkIrUmpDVE1QR2tpOHhEcnZHMDlIUmJDNGZ4eVRBZWQ3OE0wYjNYMzJ3dm9XY05YQVNSNkxOUzJOUGVhUXhwN3dyamt6QzVUSVdmWlpuNDlBeDROandyRGVLdjhWdzI2OElER0h5Mjl2S3owMmk1WEMycE9rRFRnS3U1YTZaOHQ0K0NuN2ZWV2h6cGt1WDBqNExIaFJiNVJxZG1zbENMK1hWcWRyc2xma3VOaHBYZ0NCcTdoWjJYS0RPeFBSVlhlNys4MzI5b3dwcEtZREo5NXRHLzV5UjU3WGVKTjNvQTkxTzJXMHNRT0I1Q09KZE9DVGlCMEdtKzhBSFZmY25qTHozbFJlK3ZYSWF6dVpwYnk0ck1ZYURiSWJBQ1pQVndwdllEMjl4ZHlGTzBJUDlqVlZvaXpzdHhZTkZON0dUZEdyZlF2OW11Q2RZcGROenVOeGtCejdtRHRvWStLa2R3Qm53WUhJQ3ZwK3hPbytmYlBqeE9lZkNTZG1ORG9GQ0M2anVmN21hcHYvaFYzWWlFUmxtRUpsZFhpZ0hCUTBzNWNJcjJXQ0xMNzF6Rkh1ZmRHejFYRjZLc2toK1R6VXBCUVR4YXNpYWZjNHZRVWJ6U2plSjI5ZE5jbjQ2MFVId1ZMc1hwM2NROTYwVlNXei9PRjVaMVpRdFdlQU1ST1dMTjlvUXliTFJRM244RitrY1RkZTk5dnpKbEVCTHEwQ296VXRtU0NxTEdGSUc0MWphS1pGYlVVajlpekJPS0ZNSzlMeU0zeXcyNkd4NE15RWlpRkUxRlhodGF4NzRVNENKa2FPYlJ4UFQ2VHhOOG9STUxrTTJOVVJpcElsUWhXSENvbHBqT1pXeitKQnE2dkV3a2h1QzhOb1ZqNVJpYmN2YlpTM0FnYkd0ZkVydTV3YngzeUpKRXlzeXVrK1BNSUl5RkV5WGpnQ1BVT2tiS2JPUUhhbi9mZEF2dVp3TGlUdXRQUTJYaVRBdnRNWGlFeEpDdDVlMVZRdmpvbVVoL0hrQUNERjU5dXZtUXRBZlZSYXltTE9kdy96Q243cm1ibnhWb2Zoc0EvRTgzZ2psR3RYelRDVVlLejRtY0JMWG9jOU9JWG5XOCs0Z1NDYlpnTERHM3duU3lSRmZFOHNNOFVZenZVb2VDeTFFY1NPRGpOVURSVFNUU0hiaWlHa3ZtTm94bVM1SFBOV3JZSTRUZUhFTmhFWmFlUjM0eHFudFUydmF0a0JHSDI4SWsxSnA1KzE4SkVES0tDR2w4RVJLdHVtR1BsdXE1RkpDT3NKaTE2QVVBZWtoY3Roa1pKQ3lsRXNnZmVlNmlTUjNMam1Va1ErMzJhZHQxbk1nZCtxOHRwM25ORnZ6Q05LUW9XWCtibTV3QjFxUzZGd1dOSHZMZ05BWnlYTEE5K1JOVElVTzFydE4rNjMxN2FGU0xwMStsTHRreWNVSk5SSTFUUVdsMGMwbXBVSGZvNDVrcWt1elBIdENwdzZmc1hCYkI1dCtXVFNEMWZubXRrOFRjV0hqRm0vcnZGbzJrc2JJVEdiVGhlbXNReDZibWxKL1c5K3c3U3ZoVHgrQ3JZL2lXcldtSW5ZdVc2RlEvRjFOUkV5ZzVRaGUzaEhOTlk4MEttNXFCSlVFeUxEZ0dHTlZ2UVpULzhaVGg3NDdQNlpiUWFGWHJ0MURSTWR2ejFrVWpsSXhKbFJNY3M1Skliemx3UzBxclpGb1VuYkVpUHRpMHFHaHZ3YWhZUjRvY1JTbWo4SUZLalFtaTlvUDNpTENkQjVsOHRBR2orTkZyZUNoTHhWMUovbW9qOExRTjNYUFREaU50TitiZUFpakhzMUp5ei9EKytlaUgvSEdsQkpZREo2QWZRYXJqVGphcll3KzlFM0I1bXI1NnV4c2ZkV09KZmZiSW8yeXp6VVQ5OWxWcDFsVmpSWFN1YlR1ZThlL3pBbzFLdTVoQ2VnZDVlQW5XcW5xUVR3U21FRjk4TlU4Z0JrUTlqWXI0UTZkMXRNNXEzYUQ4elJibjBndDZRcFRZZTc1Mi9qb1IvZmFVaE5PZ0E0RTlZdWNLQit0TkdpNC8yMmFScTh4TjVwL3JXWlBzMW1JcU5xRnFSb1RmYXZBSDc0dVlIQnlGWHdzMiswS09hcmNidzdwZ05nR25JM0dZR1Q5ejV0dzRuM2JISlRTMDdmd3IxUU9KQU5KV2R6UWhWUFVpRHQ4M21WODJ6NnJPLzA0YjRRZElkV3MyUDllMkZNRjIzVS96WW9zZGRoaEpDOE5KeHMzN2JPOE1SQXdnYlNVK3J1MHJ5VHNIUGpMdjQ4UWpmSjN4L1dLcXFzdC9YSWoyNFYraEJ6TXZXL2F5d1haVk1keVl4ZUpET1doS2d2TTljL09MLzM5S1lPazZmdjVaWmJPcGs2NXU1M2YvbmZIUDdtclBUU0IrY2FrbmxVUWx4ckJSSW02bytmWE9uRVlyNWdrQUc5d29hOE5tTmcwTStHd2NGOGVuM2NHRm5LQjFkN29QY3F5V21pR252YkErMDVWUWpyU0FSbThHZ1dCZGc2YzBzSHRLOEUrL1A3N0t2SHFuZ3hnYjRWTVRhL3JNK3lhS3FkTHJUcUN4U3ZYcWZuU1J0OGxsM0FNRkQ3Q3huYVpJMFovVHFnYkFjcDVqUzA3SlJhcjlWdDljbGNYZnRBOFhGQktsdnd0RDZEeXdtdFVNc2kzYUthWmt6MWhkSkp1ME8zTzdTV2pZSmxZNTBjVSs5MXZRM3NRdG5SZXZXWlc0QjdKUkM3WVZ0bThVelErdXNodWtkRlNkQjFZU0E3bkNZdjlOUkhPY3FNdDU4cGx3a1ZaK3JhMDNFa2JUaXkxREJnanJiL01uOUo0UzljZFFMcXVRcnNyWTdoNFZFMzVvbEJBaUIvN3BTend3c0hyajAzZExQQWdrYm1pVllJeE85VCt5eGViaUN3VzhkZlJDWU5zcCtMMS90M2RscVZONzlMWmdGZWtFeXZyMFJpVWpKcUVNcUxtNDJYWlFtSXJ4R1VFZDl1NG5yNGRrWnJsOVVvQzhkbFg5VUF2SmpreHNiTFlkdjVZNzU4enZ1aTNHUmhnQnplZEhvVnFaYkVHQnFKOWJGUUhsdlBLUzdFY1FOa2hWT2hOL1orRkw2OUVYUDJQZTZUbldzZi93MEV1aUk5RXhReXIzTGgxWlJPQ2lVLzZrQndKODhWTmdhZlRLcHhVN1kvbXIydUZ1NDFxREhHcExMZUtCa1NkeUlEUm5MclRldkx4dC82d09yVS9IOEY1TGN1dU5tL3ZRNzBlMkpZWUFXN1pyWEJOME5STExDcnV3VzlXbEQ2SDBTbUhZMmRRUXNPc0FmNHEzV0dPV3VYVkN1WjBtdlRIN0JNNjE1VnptU3ZNTDlOeGF1NnBnSHJFOHNUOWdXcnRiTm5XeWRhYTZxN01uQm45dDdPd0Vtc0VUa0NOU3VTbDlFbGE3VmVsNUFuZjh5NkhyUzlVclR1VTU1VlQ3WnFFU2EvRHhScHFqT0F1VFN4bFJMVDN2MTNVdW5hYm5GMUMvWUIyRjZCSXpEazFJejk4OENsc3o3c2tTWUNYL3lkam43SG4xNFYxYjJoZWVaYjQxc1NXR2pNbDZmdnhJV2ExZWtjdngxK2Q4anNPUjN3S1VwcHdzR29oT0RTRGdZc1k4dWhFVnYzMGlqM0ptV0ZvT1ZnS2xmbTVvZ1QzTlZ4OEdPVkpPWXRVTHV1a0V3djVLMExBM2N0UWFPWmw2NlpwQnFkSXFabkZVOTB3QkIvdC95b3ZucTJXV3oyUlJEVlJ0MnFEQlByOXRuQ0tUL29RcWR4bzZ5ckFEajBMVzAxZnZSSG8zQlVOSlBLSXZCU2xiOUY1eHN3MkoraFhvWlByUWp0MGdSWGRBTENVVzFtMnhQTlhmclZXZnNNbkVTaEZXS1QxNWd2ZjJjZlpucmo5QXo2N1BCM010MGx4UW5GTUFlRFk2dHAvUlpGOFpMOWdOeU9JUXhQaVVGZUlJUWFtMGJpU2hmOFppdFhhZFhzRnhmOFIyQlpaWkhLaXAwWVgxb0ZSTFg1aTE1UFV5c1VkbmFyVTJqS0hEb0FLTzltUEdHWU1PUDhCRmo2b0Z4UngrTVVHaVlham1tYy9WVG5hSXpNTHpuTjQ4RFVSK016b3RlbDJFUk5TQ1pNU2h6V0lITUREREFzbnd1bXNaajlaSEFnNndnK2J6QXdsWGtwZjNNZDNONGt5WEFRNUFqQ09IeXdnVG9XTWJScjhJeTJMS0JraHRKNkZZc0c3THljdHhMd0Q2dUdaLzJBeWNTdVBIcjJxeUpBdWY3KzNWenVOdmpEa0h2UWYwYnl1S3F4MCtSSElxLzg2WDJ0eExUU0dNbG4xNFJqcWZXS1g4YjhiZG53S1dabXFsOHk2T2pQRXlzazU1bytBZnpkNDNEbTRyaWZRTGc2RzhiSDcreE9FT3V4eS9wblQ2VEVZUGpCZlhhNDJVOVVTV3M4bzc2R0xKM3RhbmY5ZlNJd0FYWXlzWTZaNnZ6RjVXZ1hMZUs3SndJRGhvY2NReGhIdXVtM2dmRzdodXFNWDZlejlwSDlBbTJTc1NOaFhzMkdMSERpQnVuUG01K3phSGFLSXRiUmVYN09GNEZpL3V1MUM1ZnArZm9Sd2dmQmNpSytWYlpOKzM5aE1lTWhOYVZqRkswVnpyL0Ria0NOdjE4amVsdWx0NlhHZm12RHlNUzVkUXZpL1ZyTUU5N21iM2RXZGdtaVB1YnFKR0lmTWRKRUZQdnVyMWpESVhyWnRWMkpJN2FuM0FBWk9QSWNQODVqRFpDZXMyWUhYYmFtM2hsdSt6dUpMdHdsa1UvT3BxTmNFRWNKWXRBRGhEVks3NWZtNzMrQVhQT1hyTjNIRWljaWNIWVhZeko2MWYxZ3BDZUFMTWJDMmM2amlmQzlTZ1FXNnEzL1ZRNWxUOUVtOGNRV3AyQ1lxcGtLTFpBaHlmSU1hS01FTTFpNUs2ZFFLd21wQ2xORmdpVTdEelZ2UTE4cnRpRmFTOWUwVElTZHM4a1IwazJRZk1XQUo0NHd5SlBHQStZaUhHY25TbUE2SjYzL2ZnM3hLNTlrSjlsOU5vTFUxM2o4eEtNL2N5QU9YQ3pJY1B1ZzFWOEtOaFRaZmg0WnJOSlJRdU85enR4ejBDZERkMWUweDVVbWZKYjJ3angzdXRUWll2TjZLdlVvTU9nUlJhTmRWTVJiY0pZTjVJS1R2V2ZtZ2JaOExSSW1PU1hGWkwzZzcwU0RlRUdIeE4xVmtNandUeWhIeHBGUUJGV0Zjb2hMNEt0Y2QwQlRlb3RSN3h5dWFWbjhzUU1uMC9ZR1AxWmdNV1ZiWXordHRJUEpsOVBjZG5BNWkrQm5OdXBQams2MFpjSEFqRUhzYjRRMm9VMXBkMmVrN0w4QTFxald4bFNneHpwZVdGUHYrSjByS0lDcUk3RUNBaU4rQ3lMSmRCL1FOdnFUYm5kenhPQ05LQUJCcW5mNThmY2dqS3lkM0JUbVQrT1RYWnZPOUVDS202VlNwN1JvSnVPOTN1Q2s1UDlBblltbnNodk1samtST3NHc1pEK1duMm5BVk5JTlBaUjBON3FYM2lHeFZybDlTaFlRYlc5K29KK1NnOXdjeDlwcDNPcFErbjhWSVF0RmdlZGFHekdsc3RJcEg1Ry9RYjNEQ1VjOTJQWWhCYUYyUkh5M2hpSGdrUlV1NStXb2hlYXFLdTlaK1d0NURJTEp1UWpTVVlSY1hyRExTY0t3VDdJdFlKM3dtM0l0WEJFeEVUZW84MWtLOWRZYzV2bllVUlBra2V3WXowOGNqVHFxd24yMy9OcnJZMlR5bldWcUREa1hqTldrMm5FKzZIdkZGTElQNUJ5aU9IKzVCVHdSL1F2MEV2Z0pRUGdFREt5d0dFLyswM0Q3NnF1N0VLNVoydTV0WTI0WU5UOTVnUDJMK0d4OWJmdytYWUF4aHlPVmhCM2krZk9LcEtKVzY2YmlVRlduemhxemNtMXpjRy84S1NmdzAzdGs0N3dwaG5IMHQzc292MWUrQ2IxWEJRaFg2Q3FWM3Y5OHBrajJpZHBmTm53eE1sZ0RTMTdwS1c4K0ZOVWNBWFc2aGVhbmNHTXlMVmM2RFJ3WTZ6dHBHWHpCRFFRTlQxb25QVzRHcnhYb1V2T0JyQ000TTNvNENpbEQ2aEJKMkVPQVNHbUEzR2FqUHA4ZnFrOElFOXZZcWt5VUt3bVJZd1JzbHpya2FsemFtNDhQbkFlVDBleUV5UmtKNTg0UW90Mk1yODN4aG1LWVVNMTUxdjdZYXV0dVlYWFh4eUttWk5IeDVaOTNld0hiZUVEZjU3bW9LYm54Y0V0OVJaWlgyZkZoeTRwekxaM3pDblFtV1VUSERQV2x0QitjYTN6b1hFM3EvcXNGRGU5VXF3ZE9ZUkZ4Sm5NMHNFTXpqcFIyS0RwQWRwZkVQSkRSbVVBV3Vkc2JDZTY5SktBMmFuc2Z2eW5Md0ZhNzd1L2YxemU4T0FVSGRNb3k3a0QyUmRDYUROSHVmbWt4OWI3MXpqYldUejRQL3o1WWRWTmgzM2hZUHFyL1dPVU02a1dEQWl1OWVBeHJkKzhiT3B2UGIxcVA0a0d1NmZ0RW51Q3JwUlFHcTVhaXE1MDJQZDl4bHhiVXo5ZkVIQTRVS1hROEhQRmV3VmZ2WEtIQlRwbndkc1AyMFd0UXdGRTRydEhucHYwamxHeXZpNmh2OGVFY2Z4NFhUVUtHYmtkbVBWOG80cGd3RnE0cnpWUVptSFRjSU81SHkxdHRJR3E1OStGbVRhTXduQ01CU2NCSU9BNWxYRk4rdnlmdG5HUXhLZm45eXRsNFdSMzgvb2Y4TExFc1JYM1g2L0laSldaNHhMMEFNSUZSK1JpSEx4NVRHeVo3TDh2S05QazNIY1dYVVAzTXVlVXpOaTNmY1VYYkNEck9uYm1WVGJubGhuay9Hek1GU2RLMGFMUVpLaDZlQlhTcGY0R0x2ejBheGZHbWVvWXNhMHdETDhPNWkyYmUrVC90aTJMY05jeFhwWjVvbVlvOTJpWnFkWG9qK25yZnlTVlZVa3o5T1cwRC8wcFRuRjBnZktnekNmY3M0RGplaHRpVjNKbGxoaGtVNjRLTTJGQ2RWU29iZk5qY3k3NTFLcTh2QmJKWThYSG5GSnZjVVFDSVkvekY3bEJPbmlxY1Rnem1iVjZTZlMwb2tjMkh4TE55WU1YMlkrdnlLL3VWWER6bDJVUjdjVllzdHNjd2F2RXhiSkIwdWhkT2VyRmlHZ1BjWlc2YWhFaGg4b0hsRUMyWnNCTmNvT3ZTSG5xa3Z1UU5xMnovR2dScHdCT2N0Yk0vSnJIKzZXL2ttMkd6dUFTNEI5bS8vVDkrME9lNUNwbERJZkRyd3o5NXFJVXVaYnk0aVo3d24rOGk0dDJSNDdQN2R1aU9jdXFkN1NaTDVCNXIrZ1pocVNWNXA1VjA3SFlWTmZmaldiM1ArY0x5S2Q3UmMvazdOeFdOam5mVnNEamxKYXpUWVZrVE1KN1ZFdnIwUDJiSnpXSy9zcENWTGhRZ1oxdDdnRmI3MVJzNy8zQi9EcEtxcnhielRvanNJRDhqTWRVZTJ5d0tCMytRY0g3VHM1bXhSLzlYZFhhSm1JT083OTZvNFNYZUhqUk5pSjlib0o5NlI1K2NSNGY2ODJ6TDhXb1hNbExkd1pEa0FLN3pqcTRXL3ZER09yQm9xcjhYYWxpenFyVkErM0U4dDR1MHlicm1oNmNGUjF5ZkNjdnNnUllteHpnVXBGSE5rYUJDQXRmMno2MkxZeWxTN1NQdGxPdEtRM0xlRktFOUJRaHNjZ3Q0ZXBZNklRdDhDK2NWYTZUS21OZHk0dCtaWFgrK2hnMyt4dEQvV2tHenVKUWZvMFJ4akd5aUpYR3JFTk95SGo0dEZSY3dEbU43a1VRVWprWDltamhIZ1FjQVIxUDAvdllUaDZhYWRZdWUwanA0WkxPSDFBbDZYYWJ0OXFWZWlONFdpYVlkeUZzdHpERVlvVjZ3TkpQRWNUbFFPY3VYb2VzYjJxUGkxYmxSMDVSandPcFgvdzNoRjBIUk8yT3FsdzU4WmJDODdiVUdRSjZRMG9EZ3I0eFJYZHJ6dTJ0TEVBKzEwTHRLWDY3QUtuamhyR3RFSzdqMnBxSHJBcjZ1ZXR3Q1RVdHAvRnlna0FLcmErb0E5VkRnV2x6Z1V6NXhQejBSdzgvR3luSXQ0MTJxbGNqVUNON2IzL2hqOGloeURuRnVtUlpiUnQrZThRa0tDVjVlcW91dHo4QjM1UWZLQzFsNFA3eGdYYUdZWCtxb00rWGk5NHo1S1FNZGtsL3pVWHFwcWtSMmpnYVJpWFdmTGFyb01VK1NrV2ppZFVWdHl6TVZYeDlEbGtaWXBLRklYK3pURHJuR1A0dnJpcmk1UmpJQ0RNMkdzSVkyQXR6N0pDTFZ0RU0za21JdFVBKzZ2NzluTnNxQXk0OHhaM0pyaWxjdWYvNHVrSzYwSUZKZWt5MUh1cVl3aEgvYS9PdlE0YmxlS29LZWU0citmMnNsRkJ3czlxYzZmb25GZG9aNzRlSVNYNFRaQ1BrUG9LNElQb3BHYi9HVzdXM1ZQYmgyb3B6QUpjcElWdjRrc1ljZkhZOXhuRXlBamV1YmJiMlNNTFhSR2V3Y2N4aFl5MUFNK2h4dkRmQTJFWFhNbFBmckgwRU4xN1BQbFN0K0xyU2NLTlNKRHY5eW5EMmllTUczQ3ZVM2ZuRytwTDk2djJUVVNoOER1SnpMY1o3MFZQMzB4VzlGM0RGWW9waXExTjVSa2ZObzZOL2lWYlVVY2VwUkV4SVpMS3hXdFVTVVJWSE5HMXRsUGZGVWxaQ2RXcGZKdHUvYm85d2QyanpxTjdQeGRPbkFtK1VzZWxHYUhqNUlKZ0xLM3hZL0VjaTBjSGRVN0oxRmZFbzFvVjlPTEJEK25hUjA5V2c1eGRnN1l6TmJabGd4emdaclhiT3ZXeGk5SDVSSTVwWi9xOU1xOC85bWZYd2VUeEo3dlBTdUE0WDV0aG1ZaEpZNzJIUjMva2NPZUpZZVpRT1ZJbVk3N1RKODloNU1RZlVSeTNCRGJQdGN2b1ROQjg5SG8wdDk3UGo1Nk9MSTJ5WjRFVk9mb241L1VNM1NzbDFqd3ZqWjRITzlSZnN3OWlhamN3WFhpb3RvMFNHR3paSUZodHNrVmo3dFJ0N2FDa25nYWcrVUVzRmRFd2I2ejFLWGZscjUvai9LQTVISm9Vb1dGY0JYd3ZWZGNMS1RWdEg0QW9lbm1NUmFISTBCMjRWT1BJNTJKczB2RjBsUERMT0lnQ0IvVmN3SWppbzZ0UzlmVUJVczVOaWFqWks2VnBuWTFWN1J6VnErY3ZKS1FGSGZpalFncHZjNWxNM0RjKzVUd2E2Q3ZwM090Ylc5aDVZTVhXVExwa2pqaFduYzFUZmwwWGgvVEx6WEV4UU0xc2cwTXJoMGxudGxpSVhqMGZkVEJJMzk2QUNydXhPU2dsSlRVOGVtRjAvcytmZXJPMWNhKzFiVU1BNDNKVXR3WWRRQzEzMjc2bzJxSkdFTE8zTHR4V0lET2FDeXpHc0M2aHlKTnplVTI4L0JXVld6NDU0VVY5ZXhkaUpjbG5YUFpSdWdhY0FuN1lQUG85LzhOTkdaN1pZcXNiNmxEMEZBN3krTExSN1pxem9Pby9pYmxROExDVmczcWkxcThScmFwVmhXc205YTlxUTc0MGtoSFM1ZmxRUlNMVzVRMW1yRXU0MjY5U0xHWjdKL0UwQ1BJTFQwM1k4MDdSazhORkdpY0VFdE12Zis2SlByMnlhVUFvaUk5QjhnckEycGgzYUMvV3d2d2xqemxjaGZoWEo1WFZPc3M5UkZ5QUNGUEx5UVB2N29FZ0dZRGs5ODdzaUd5eDlBRU4xUmJZRVJJNkpPS1RrN2FyTWpxdWIzeEJGV3ArTE1XdzZuZ2tNWkJmbzl0RUFEaVhJOWY2d2hyb1oweXJSM0dhR1JiakR4Vm9ZTCt5dlZIczkxSXkvZGtvZGJVT0tpRjRpcWRYc0pxZUpLUHBZYldLWUQ2NHEra1ZlblhhUVNGanRtOStLMFBVeCtiQjBrMzBFbHYzalBpUjBFZ2o5WGI1RC9PL2dOeFljODdEcmJRUDZRZmFkRGZZL0JySHM1QlFPY0JNSGZ1eXE3U1ZYY3lSdTROZmJCeGV6RDhaczlwamNZMVpHRm1CODMyNlQrWUxvaW9xcUlmRVVXNlgrS3JsUFdzSXd3UjZscUR6U0EwQnFKdVA1S2Z5VE16UG52bWs3Tld1bldtWlZFNloraXI4d3hDN2g3c0RlRFlLRGRvTm4yeGxXSkVvL3hldXVsQ3N3Z0N4OUt0SjEzdG13YlBJZjVxSjR1NDBrQUVRZFFxS2prOFYwQlEvWEcrNjJJTldMOVpDNGx4Q2U5TlE3UGwzb1RhYm5DU2V1UWMreHU1OXZHMVNIWHduaWE0akFRZ2J4QWwvUlgxcEtYUk4xKy9PQjRxd3c4cHlrdDJhUDUwTTBWTjBqMm5Lc2lROHJac3gyaUV0aWVoQjYyQjE0dEVLZjA4VFNwTVhKNHlhUUhMV21pUXBrN0xmRktnOUEwZDNaam44R1NqWEczN3BtYzQ2VnNPM1MrYWJySFRGVk9WblRLV2pMWmdTOVp0c3l4cm9DKzl4VXJSdWdhUWN3TzNYRjBpNEpzN0tlcVNVSHFaRGV3RU5rSXoyYjJtbk5KdVl2OGhGbVliWWdUS3lRbTQzRm12MDhBbUtGWGN3WWFWNy9uN1JmNTArdUh4RzZlS05YcDVsY2R2OWFYTmc5eDhib1p0KzdvMlZ1ZUEybytrQmtiVmhSNElnRlZuUS9uT0NhbG9sanUya2tiMzFHSHJ0N3ZtQk5HekdGQWZlbHNCSjd3VHlMOGpjNWpEUHFubWJyQnJGYVUxWXlGc0Yyck42MnhuU3JJT2NQTHArbDgzaWd4T3MzOUpuOTBUb1U5a1ZqK2dUVlpwRG1tNTV0QWgwSXdWSGFxNlpkbjgzMHhENVlVQjN6TUxiY0dhNDgvRVdJK1hHWmtsTU45eFhxNjFrUWJmM2syKzJMK2cvdVBhZENiVTZHTExuNTRiRUNPbWd2QUt5RVRDK0FPNTh4TEg3L1hJbWNkRVFTRElTU0V2alNrUE1MbEJzRk82NmI2Zm15REpNakNreUVCWjE4Z29wbU9ibWpCeUNxU0hiSy9yVmJNTE9ZTzV4V2pkU3RSZXpnUUxad043c2lvYk9vQ2NtQUMrblI2eUVtV01vOFJqMmVoNWVjUk5ORnVQeVI1SzhlRm1mc05aSWdqeXprQkEzbGJZQWc4ci81R3FCMnVlN3lYZU5Eb3dMREpUS3AyK3lYcjdPeTZLaUZ2Zko0bTFKM1BIMFY5SFBNckdqd3gxS2Ura04vMFN1QUQ4VHpxR0ZtcHp0UUdVWnZkczE3Um5EMzU5cTl5RnoxS1VSR1d2d3VjY2lxSUluZnZySnVER3pJb05Tb1IrUytFeGtLdFAvU3g2SEROYy9oL3V2TEJqdjlZazRZQkhyamdSMWdwbmlkTGU1NnFianAxbURvbXQ5bmtTMUdkOTl6NEhLMkZoYkVqMmpwWUhCcTRSMFVJLzA4cTdZOE40dWFDTllUMktVeHdmaEh1VjU4MG5qVmtEclZlNndIVHpmQk9JbTlqNkd1SnN6eURWTUd3Uk1mOE03aytFSG5MYWJhM2NEcndlaTgxTGw4RDRQTVhVUjZhc01YWGZXdDdmS1hpUnVaSGd2YTQxNU9aaDN3TnFYQnIxMzg5WEdZTno4NThDNEh3UTR6S1paOHRXRDRNQjgyeFJkQnQ3RkZkQ2JVZlhDbGpFbWNWWkhVSUROUlVnWGYvQTN4TGhDaW5XYnFDSENjSEYxVlFwRVFnb2JNb0UvbGdHZUV5UytvaW1scm9oNWZ0MVc1VWNJRWRDWlB0Rk1HZzBCcGNaUXh0bkRMZVFFUG9WUnRuemE2K1ZFLzBuVnZ6azdJekRFUllRRUZTUS9wc2N1THZVMlFidzlPSS9RbWJDUDRsZkFQVHRndW1aOXVjZ21tZ1VYbUdzRE1oQjZERkRKSnVIUmc0UzVYTk94RzVQNlBVbjJBSThQbDZya094VWxwakJLWVRsb1AxdktSSEZxVFZoUjUwdmhuUTRNajRnWHcwalZ6Slk5bmY3dUlIcHNoU1daRGFrNkY4QjF5VktkdGVxbVFBV1ZacUFhQXlGdFJlazhZaWtjMlUwNG5EbVNMUGNmei9JdGZ4dk9qMktUR3A2akdsT1Vlc2praW42MVdpVFVyc1ZDdDlwS3VUeFBvclN4amF3MWVESFJPd3ROK3E2UzJWSTRONlBkdWFRMllxV2RwNDJTejh2cmNPUHJHNTVVb2lOb28zVUJTcVFYdGEwdy85SnNZeHozeVZ4U3p4Y0hXYXZhNVR6Y3BvN29MUkpjMFdHYzRaR0RKWlpSa0wwY09MaUFhUHhVN05TRjFPakxSSGxZQ0ZJemEvZTdlMk5RaStnL2dVeUQwdFRaSi9nbzF1amEyVG5EaWRnUlhGR2c0emltR3M0WXV2bXVuVDBlRThaV3dhVUt6bjhJVmJ3MldxUkgrb3lMc3dEdVFEanlFMjZINnBQTW5EanQ4cng1WURPc25hWlFXL1kvcDRKUVo3eVpNVmhjbnJvZWwxQXdITU5YUGorclZpUWlYKzhuRzdBSmcyb1lxcGp5b0I1a0VxOVRzcHZFeVQ4K3NMZnQ4SDc0SzFDbDBwaWdMdG9vYm9XemRocmJiczI2RVgwZmp3V01LcHN5NUdITlhwcWpnWi9SeE5vZzE3U202aFUrczdNTjBEZGMwR3pNOENJLzRlUzlYeGs4d3cxblhJNm1hNk9IbCtCTTAzRmIydHpyaHNZODJvVkZQNENCeFBCUDhhOHdwNmVDVzcweFRRNXZzcGdpemdZbldTSTNQMzR6OUZpbStRZHEvUmovaGJZRUxTNEN5Nk9aSDRDbEhpMjlyUkVBbFQ0LzdnZmhsRFBhWktNWHNDUXREa1E0citzb1Y2NTk1K05LeENVTFROMEtOYVNxVEIzUnIvY2toZTJUNHJudkZNZ0M2cHZhbFh5T3BxVUhNdXd5UDcvMDNIS0JFZndvb0hrdnU5S2JCd1V4b3ZSMkxBc1F2RmM1SXFienZlZ1lWdUlSMGZ3cXV2czRwclkvRnlYK0ZyazB6eEY5SG54MjFVbUcxSjh6WDJlbEZSdjJjSDgwdzlPZlhsc3RFczY0OTRNMmhhOEg5MnpyRzBKNXhKYWVMcGZDc1dNb28vdW9HWEgyK2JpaDVOSVo4QWZEVVdIa2JPeGxuQjdad0ZSVjV3RmpPKzduaUs1K2tFUFpobFdUcDN1eU5UQW5PT3FzQmxMK0lwMFFJbEtRMjJjUWVSem5FMVI1ckR2emd1QmlNckoyZFZTeG5TZHZyQUVOY2YyVmlZNldyZXkyTmpSdGlwdWg1L3NKOGxxMG5lVkdqRmk4VnlVZTE1UUlsY2s2b1ZrNi9XUGk3ZUwyaFVYdWkvSnZyVE8zYW9ZTFVLb3VVb2ttc3dsQjR6VStTU0c4b1Z5TjVGNzBxa0V3UGVNTk0rT3NaaDZtNXR0d0xjSmR1UldONHJPbzF1amxTK1ovREVQVU1ZRWZpOW50QWtUNDdUakhtY1hTeFpWR3dqVjgvUGg5KzF3dC9wdHdGU3FZS0NVMk5YRHF1Qk1iSHplL0VVRjRvNGFtME9jYUdianlnS3d2NGVPWW0vTXVLdG1yMlpDcEt1QUUrZDFYaEcySk14K2RBckZkTXFKVkFMc3VWRk8vc3FUbW4rRU9ZVnR0aWVyV0h5ellXRXAweEJ3ak03UU9SeTk0NnBZcGt3Rk8zRjRneFlHYzFQbDgvRGxxOVRrMEJCSjVoeFRSaVVsQjZ1K1Jtc0FxRTlFdmxCYzVIamRYTjhxcVYxUG9kcE1GUi9uK0V1WVVZdEV6VjJGM3VkY2p4TWlCTXhJOFhRa0dGWDlDYnk1dkttQTY4TWYxeGRQbUk0c3QxL1M3aTZqYUw2N2RubFQwMGZxUktpMFpHWE9HaEErK3JjS2I0dXh1OG1RcUNLYmM2K2lpRVcrMHFtMmNlMklsVDRLaVNDUkNYVTlyWEFxTEZrWEZDbDl0ZjVFY2NHcy9odFpDTW16UExnWVdYQ2RyZS8wdjRwM25WSzVqYU9LV2VHZmpxZzJINWdCT1VsV0VBM3Q1eWFsWW8rdE5oUFJtOW1LeUNmR1VJK3F2eC9uQUZEZ2JJVkxOL3V0NWtmN055MHU3eEpLL2lybW9qbVBmdzVRU1RCYXMxdGtxK0lTQ3pwaVF0b2I5QWkxYkh3SUExRzdpTHFXbDIwNE9kVHRONnkrNUN6T3RRcW9GMnZyRXJ6NUVsSEUvSno1V0lHSEJhbXhUNXB6RkxIYUFRaUtrMUwrNFlZMUpYNXZqa0txSkk2TmUwY2R0cW9lYndhSDBpeGUvRXpmRTlEWnZteWNVcHVoWlg0Nk84RldiRWRKNzhWWXcrNzV1Y2NsVUoxa0JqaVloVlk4eEo3YXJvUGtvcUFzeXJRV3JJL3RycG9YSjJ5SlpmaGRvemg0ZHVVTEJqVmNaUXRqMGJNakRjOXdRU0g2cWtWMHJ5SkgvYm04cWNod25zWFlpNDlnMjBoY0hHRkZFYUJ1MjRiM29xM2NkZWlwZGV0QUd3bnFPSjFwU3FybWRnOHJQUTBOYWRlZHpXR2xOVE9TYzJNc29lVzU4TGwyUjQ2SWZONk9NRm9HZW9HRjcycHpKVDlGRDQwWXRXbHFGdVBHTDBtenBRMklzaitWOGRqdjBCWnhld0gzRXB5VDhWbzBuVjFrUmFZaFEvTk5BUDRodmhlZ1ZkQzBKa2hKTE5FR3BSSzdCTEN0aldDaG5ybEFGNjZoQ3d0TlIrREc1SmVKMEZOdVNGcEo1TmI4dUR0Mk9ZYmFqaG9Qclpteis5a0lHNWVJd0J3VzQ0V1ZQWTl3WFFyNXJobXZOWVhDcC9nc2I1MUkraFlqbjRWc1pLOXU4ZElSdjZEc2hraEpyVUVIL0JUS1JRbW5WSlFJbWJvTzdqZUJySFpwOGx6Q0VldnlFMzFTYnhrcU5DUTZ2NjI3S1FySFBLZ2tta1N4aGo4YWRuTzEzcU5XNG13bEp0K0lOdDZBT2NlWmZOYnJYNnpNK0p4ZUtTZDVaMlQzS0M2VE9MMnJCNFBuclFHWG5FYjh6VTByUlNzNURRWFRVUWM0QzE4Yy9OeFVnbzRNVWZHY0N4VmM5WU9FdVBHMEZ4MUxsNURnb2dncjFOZ2N2ZEttT0E1Q1hJU1JCZU9taXFnM3BPK204bVZLUEg0eTRUekkrS2hFQW5OL0x1ZDkvNUNUbjVUbDdDNGpaNGQzS3U1OTlESUZ4NTZGbGUyR1h6RXczQ3U3YUFsck5yenZhMXorb0JGZDRkaFN5algvM1lDVlZkRTdoUWhqdGlMeG4rMlpyM0FRRGNLcDkzM2FhT25HRDVzd1RscW9SajB3YU1BNE1CK1RYTTVRSlJNZzU5d1ZzUVFJa1hKRGh6WlRjTDRkQmUvM2t1WkV3NlpRaFNtR0FEWTRaVzBZQjIrS1NubjlybEdoUHI3a0tJak1leDh2aHhnd3FXQ044RGxSeTZWVVNtR3J2ekNnaC9Oam9sMDZiNjJ6M2hGYlZUZ1ZnWjlBb05jb293OFlCT09nZFRJZktUbWxKTXRTekVqTXp6amRGakgvb1RENWVza0IxTnZhUGZEVy9hbVdWVTB0emJwRmMvSFo2emlJVE1JWkI2d05xZW82S2NweFh5blBwbjVWTU5lMjY1SkZjQzk3U0VVNXpDd3ErUmlDY0xZQnhZd0hFN3YwUlBqRm9wMnFheitzdVFoWWpPd3kzQzlJWmJBVlFLTE84ZW1LeHN5QXM3V25aY1VVTjJNdXRTZzg3Q2F2VS8vT004ZFh4ek84L2pmVzZmdUhYdGhqTGZSaVZNZnhtMWJVZ0hmT1Y3bTJTeGlGbVpFUFRvNE9iV1czdk9JVFhnZmJ5MkRmQmFLbE9vSVRXUmtGQmdJNW1CY2c5RE5La1FGTG9RMFVjMUZEK1JYM0dLU1k3MzJMcjZUditpU3dZZnUvaUI2ZnRlTzlqdVVxODd6eFZBWVlNZlYrWmdPbHF3R3dTNDZXZ1BCa1ZBcVM4RmQyRjJYL3o4Z09yd3VxdXkrT1FXL3BPTUlLTjI1MFQ3OEVsS2pqRDNlVmZMcWxYbGJBYTZudDdDL3BGcFNqYXJTWENGSjRMQndnSVUrdm00cWVYN21aQTdhQUNYL1FoZGJaRGZYZDJCYlZ4VmhFbitCT1c3QXBvcWlOa3Z4d2tvUnl1NStNbHlyaVpRVWZza3FLVm92MzhRNmtpY0tUZ0Q2blFjY05JcVdCMDFsUW1idGdlbERVZkhGTndrcGxGUmRYcGdIa3BqNkhjZHdDT3lrMFh5b05qUDRlcUwzaks0S0VoRGpQNzdzRHl3b2crNENLWGU1bTdiZjhaRjEwcHRPSXM4d21hWDY5Y29qeXdVVGZrUlJQN1RydXRwblgzSXVZOUdsZDkrWDd6YVpjekFudEhqL0hzRVBCblVGdm5XYk5wbWxVOUNQbTFPV1E4Nk43TXBsWjRCOElzWVZiTDNub0wvbGk0czl5OExIaXZSQUtTclNrTjN4QU9SWlhmSHhZYUFEaGpiV2l4bTlycGNmMmR4dlIyY3hzSHE5TlFNQVBNTnpOVjh0WXRQMC9jS28xdjlkNWgwa1VLQ3IxeGpzN05EVGhzdkpESUFMU0VlY09MOTlDSUdmZklKS0xvYi9EVTY1SmJBUGdYb1hTWG54ZjJZSVQzVDZyakI2cXpJdU40OE5tTjUzbVgya0JlTmJTQ25uTlVpV3VjTVYyQzQrUUE4bzBJdjNkOTQrRFNaUDZ2THFkU2lGdDljSjFsYkQzaHo5K0ZSSkdaV0JpVUsxV0owRFRLc2NDcUhWV002M3FmSFZxUndCMGR6Zm5hRUVPUlBwekYyRUJYL0hzNFpuYmZWN2FNVS91YVFMa1UxL010SEZGamNuY01ET1F5ZzZ4R3Q2ZXVDWE1uVGVpZ01RdnFtSFVrZjNLYWVPWk5MakFneDR4dTJNT1dwRzJYVTgrZWh5dk9vNEYrTWdHMVJWZWRHOENRbzlWVXlHS3dCVTZ4cFVHTHh2Z2s3ZitjRUJ4Y0tZY2NINWJ2cnNkNmNhaEQ5cUlYRzUzK3ZDWDlFaUljUXVkd1prdis0ZUVLc0NtTHhHWDlLamc0eGdzc0l0Nm4yMGUxMEQ3WENLaUpVK3ZLcm1RMkROUDRSTmRmVmYzQ1QxZi9XTTh6dXVWaGZiV3gxWHQ5eTdrUS9Pc09JNkppcGh4RTBQRWJyMWlDcklIWVhRRVRieWIzOEVnVlU2TFNzMW1aT3g3VFAwOGcwQXhlUmN5UjA3dHRMdHNzZEl3cmU3dmRlQ1grMTJBY245Y211UXNEVkE4dTd1TUJBV28xY0x4V29nQWd3eDZRdlNwYm1yRUFkWkhNNVJtS0U2NUpJQmdLZ2pjaU0vaUhPOEU1eitGRDFXQmFuamUyVU1WNkRtcDdpdUxqZ0l3emRFVmlzOGJPSFNyVnBESmx3a3pXbnpJOE1EWUlVODkvTlE4V2NqNk9QeUtCY0VFQWgxeUl6cjZ2cml0UndUV2pOeFJaWi9KTXlyR1NyMHZNbnU4Y1JkOEo5RmlVc1FZNjhWN3lPRXY0M1NreUl5MWRWRmNLOEdZaERYUGt3SDV3b0JaTUl3VlF0RUJKZ1M0Mms2aHdtTlhGSlMvVDM5MVMvWGdiUWVVOTNqdkFVS3FTOHk3bG93alpqMHMvUmpLUzh3aDgrazVQeXZEVGVLVGw5dCs0NTg0b3Y4YnpKa3daZDVhZVl4Y1R1WDd1bFBHWmVuYUFHekhtT3Zkd0JyOGxWR2h4dEdtNzI4ZEFjUTh1TGZ6YlVjdjFRcktGOUYwQzBDTURqb0VXYVI0TWg4V1Rld29RdTNkSEdlelZMYUV2UDNWRm1kbEJLQ0oxQVNyVkZaUXFQYTdXVGRkaU5YUVVqb2NiN2syQzJuR1llUWFQNnlzSUFPSkdYTmJFQU1STER0dHJXcFg5WjkzNFowUTNjNW1zaEtDZ0ZpM0xvUnpNT2N5V1FBdlBkaldVd0FkcHZPOGpvSkhDc2hxT2F6Zk1zU1hOVldaZ2JjSEdaNjVqZFZ2WnFkSEhreFoxWFBzWnllb1g5WGtGZlJQd2UvbW1VSFducmJ4Z1RQU2pxNmEybkFhUnVKVXIzUmR5Y3B1aDF0ZHRYUk9mNzFkUDJCb2VJa2JJMk5KaTZKbDQyVkFmaU56ZU5wRUlYV2RPTVB2OVowVlBGK1diSVFicEJ4ZzhMM3JuNFd0bFVuRXlYTkJ0a0lNVzlNWjhRck1iTVNCamhyek03UlZWQVg3MXhaMWd3QmxLWWtaemFNRjkwVzl0aU90OWtmRkFpZkVxbmxHVXZHYzJLeFR1SGdvbXZDaTc1NmViT3pSdXhxVy9kY0diVnN0Qm5uVU5MS2pRd2JnVW1sZ0dZK1VYVWM2cnpvQWt0Rkk2OEtWSUhHbG1CTVlOQWlLRVUxUzMwY2ZZa2FiVXhkL0hwWWFEc011ZURuWktVVytoN09OVVEzbFZzR3JxbnNqb1FpQjRxemhqM1d0NU85WlBBWUc2NXZLOHh5T2FRT0JTKzhFWHJvMlltbWpxbGdUMjJKNHZKZEJvMitQMEM1SFNYTnVMWHV5dHMwL1NGM1ZFZDBJTU1HM0hVOWFpemxLZndjb0xBalJ0S3lwVUpxdXB1Q0Q5RWJkekloaHVxRnhhMzd5bWdWNDlYNHlqVUE1WmcveENHVUROUkV2WHJoUUduRFppTGxNdndnNUZvOHgyVjhiSFA0a2xQZGJoRUhFZVN6T29OR2djNTdQVEJPVE9UL1JxN3YzeXFUWlZZcmRJQ0NCcWNkMWFGNjF5LytORU8veXRkakNDU09weHR2T1hBWFhVZEhXZVNTSDlzSEFZbHpWY2FpcEJleVVhTkRRanRLY0xFczh3L3VGOThJVzQ3bmticWk1bGZYcXdlNml5TW5DTTQ4aE9XemYxdzBqVjYwbnZJd1YwU0FrWURtYTZUOEhNSktaYkljUHZsQnZyTUw4WldtRXI1TzFkWURFVUkyMS9saHFPSlBZYmNyZmd0REl5UDN1MEs1Yi9tTUVIa1REUUkxQ1UxRUhXR0s2U0U4OXBNYWtiVnhGWHlsUWJUaFdQbnZCNDZLVG0yOTVLRWhyTW9kZ1NmZ2YwRVVkQnUzNWdMQkVNdzJETUxTaUU5OGd1bnBsd0FaNDVJYlBhdW5ZblJrY2RvblRTQmRkTHRmaDBZREgza2tKQ1BOMUE3U21SMG9QNWFIajJKSW9NaVRLVGgvOTM2d0NVaXFmb2dlcnlML1lhN3JzKytkakRBTmNqcnZIL2lYZGRjeldTUXZvYmE4d3VQcEd1dGRLRmpTZHZzYmk3NUhZZzJ4VkEyMlN5Rk1YVUlIS0dBcDh6dzd3L0thOU83Z1JieFpyeFlnaWg4NXdOY2NZbjNZb0FIVldnSy9QbmZhaEdscjlwOUwzUlp6b0JsaFR4WUxiK1V5TUNCQWRDMk5PcUllOVpPb1JzbTlXalNLNE9vOXYvVHVtRUJTK0FnaksvVzhJMlNLbXhJOFRwbEVWcE5JV0JqU3VjNWJJSE0rQ0E2c1FzbDVxRW9pcVBZOW43WEEvSW1UWUxaVlZQYzNsb3ZRcUhWOXV5eVNWRktFZERVbTduYzl4b1RMWHRzNGZNV2RWbHI3SkVNZXZwOW9ad01oYzBWbWNKV09HL0tVUjBXWE9qWWVNS0RWSEljZnhmQjNncXNWeWhCTkg5WjJud21McmhQdU9uK1FvaHljc09PY0RuUjIzbVFLNXRBQUlYcTA3WVpHNzJ2VUkyTEUzN2NXRXM5Q2xEZm55d1Y4TXc4anBOZDNZVEJldEYwdC9PcWpLeXFNSXh5eCtkSGcyRTh0TXJyZXRVVlJ1WmM5Q2VNOS9KVDhNZG1SUFJJM2grMThTNXdRcGNIUFlVYVI5QjNNRGh0Zkh2b2xVazFpVy9ydVhvQ1ErT08ySHJTNnRVVFc2bUd6alZIbkY5YWw5UUs4U2hOQU1nNTBwRlA0NlJWcDVPdUM2WGhGYzB6QW83TXpsNjBZS1pVaFp0bjlsbVo5MEwxemliRkdSQUhaRG9ud2kvWHl4aVV5RUwydHdOeUZ4Uy9qTEhLOS9JN0xPTlVZbHNiZmdjanpFM0JYYU4zcDZGMlBYdFZrK3FrR05MM3RBbWdMdXUxeks4TSs4Z1RWWTVwZ1g0SE81bUphSUtzMGRGZ2I0aXR1dG03N1NYd1JPekZlcXYxSENpd2t4NDMxUnovcVYrVlo5QmU0NDFrNkMreDkwcktaZ093S1BoTTNVdTlONTNhY0hZamdvYnlKdFFtUk5oVXBNNjhacjF1UzNHV3UwKzhVVHE1RTBZelN2RjZGcklVOW1xTkpJZm0xMVUzVy9Rd0dyZGtKV3h4NnpibWJHTGdyb1BHWFpsZHpVUndzNEJjZGZJdFBJMWtBYkxReE43cjNlTlF2a3dTdE1kaFFnOHpQb240cS9jQ0JKMFl1c2l3M3NLTmFtSTg1SkQ1NlRRQTBtWXJkRjNxV1g0SnNOUnBCMnBER1VReDhIZlZscEwrcWFDalFXWThKMWo0NGs2cWhpK21LMkFMWHMzSktqZldoa0VlOVc5d3ozdTkyU3dUVjFTZjZkWStBWEs4Vi9CM1VBWEtwSUMrV3l5M0o0MVZmVlRVaXRNN3hWR05pUVExcUNGR0pPMlIrSUxDb1UwdU5pZVgvQ2lTQmdSL0IycWYzTFR3Q3VtVTVUZWdaeTZGT1hvZjc2RXZiZG95T3IyS2E1ZEg5aHpaQmQ0OW55N0xJdWc5eVBHUmFvQTRtRVQ5TExDSzFCSnFzNHptNFcwdzFYd3JrOWgxdHo1UmN4bElrWXV4VzIzRHR1bGM0TGtQdGUzbVEwT1BRTE83b05ieDdRVEtxTHBRa1QrUHJtNk5temNpcWlvZ0dZV21lbXJxV1BSZVpDL3pvSyt5anVvRDl4MjB0VDc3VU9RRmhLQTI1ZUhrWUp4TnE0ck5SQ1NXcldkb0NXSXZXUE9MbDRkSEJSQTRROEliVUlpTmowV3VKRmNMU1BSNW1adlJrN3RxaE5zaEp6S0oyc0V0bUlWN3Uzd29aU25hek9LTVpTVGkwTUxRSXMwZEpBSjJwckZnYkV4eWdYQ3VVUjlLZXJIdytXNVlGUUIvOHIwRjBVMUhYeUk5enNRQ3l3bi8vMlFBQkFCb0FRQUFCTndCQUFBOEJBamNDQUFBQUFBRTBBWjFBQUFJQUNRSUJBUW9DQUFNQUdWUm9hWE1nYVhNZ2IyWWdSbWx1WjJWeUlDZ3lLUT09PC9CREI+CiAgICA8L0JJUj4KICAgIDxCSVI+CiAgICAgICAgPFZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU+CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU+CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IFJpbmdGaW5nZXI8L1N1YnR5cGU+CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U+CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0+CiAgICAgICAgICAgICAgICA8U2NvcmU+NjQ8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk+CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI+UmtsU0FEQXlNQUFBQVlqZUFBRUJBUUFCaU00SDVnd2NEQ0FyQTdjQUFBQUFBQUVqQUVBQUR3SUFRQUlBUUFJRUFBRUI5QUgwQWZRQjlBZ0ZIUUVSQWZnQUFZaGRBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQitBQUFBUkVBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFFUkFBQUIrQUFBQUFBQUFBQUFBQUFCRVFBQUFmZ0FBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUdIWlFBQi81UGZFeUFVTFBjTUJlVWZGTWhxbU56VHNad3NDdVpoNVN3bEN1T0xpdlN3LzBHR2RmVFk2NlNScHdCTHd6aHFqQXZabG01Q0lOYUFlZGtQOHIzdytza0pzMDc0Rm9DQThVQVJFaG1sbit0YU9GQkwyMkdDaWFFb0lWaHBCb0R4VUNlcGg3dU9LMXBXbnQrZ1g5VVdlNGc0M3FkcGZZRDhDUUJFTk5iQTU2R0oyOVFhRVUzYzhUU29Rd3p5eEM5eGVSS1VZSGRlYlFZN0tycnBYREhIVjRrQUpCcnEwcjJiOEpBSVdaNy9EN1VMdGxpR1NCQWVzZXlDa2k5enVPaFdnRkVGZTd6R24zd0d5TlFqZWpaRUhsN1AvWElqdjF0NzIrY0hONnRBUnNwVXNsenhyYk0waVhaVUxOYXFRTFBZOFhtNml2bVcyYVluNnVFc2RFVWZkMnNUY2pvUTFrVnN0S1JuRDRUaU9LOEpnRDhEOW5ueGJ2cFVNWlk0S1RTRzZWRWgwZmF6MjVaV1NNTEdPVzVxSTlCL25lY3NlQUdvbzJFWnU5S2wySkc0WDgwQVV4NXlleGRWdGR4bFFCOVpoOGlQRHJDclhjeVlKRys1alBLL1ZqRDZPS2RCZzdNWTFPcUEvR2NmR2UvTVRGMXJJN21CSUlhVWY2aFh2MEtBOForcXhRRjMvai9JRnhEWEtJOERZUVhQSERUdnZQS3RUUEhpdTRoc0EraVFtclJHOFkvL0dnSi92ZFhIaG5tcHd4dzBkdkpmV2cyd0hVVlZjMlM0YjJOZWwzNTY2eGlEUFRucjJtUGw1SGw4SmZGUmVueDlLdWJnZWVneVZsWmh0ZUZhTGl4OGo3dVoyc3pUaGJ5ZElmVWdLeXl4N1RCTEVyUWNQSkJXT0wxNHNUMmtucm10bmNIMHJ1OTc3TjFDZW4rUm1DTGlURWYyS2hBMGZQTEVOQjg0bzlsLzFtWnVZK1Jkd0xpSVM5SEhWck9tYUx4MjB4c0dFeEFlQ3M1SjF3dTJqaTJRcVB5Nk1HUjluYmZ1dUU0a3RvQ1d4TmNkYkZaWHRTSDJic3poZ2xBc3JwbU9UY1VsR1lXZzZNNGsyVXdyam13WHVSWE5RajRTYld0R3ZDQ3BnTWQyRGxENDRDT1prMDdNUU92cEpVNlZ0YVJBZ3ZHbXoxVVV6SzFUVXlFRXRFTkwzTDBzRHhmOHJjWHBjaXFXLzFqSm5BU2ZXZHZuNjlwRk1Ka3NmaG84VnNpajhkMUZic3JraGZTN3hrVUh3SnZXRDBEMW15blhIRkZJUk9keE5GbUJleDJwenZFK1UvMFlJZjlsdWlGQ29VMFdpaENWS1dZUFpManJ0cWg2MUpFdmQ5RzNVMTdQUXZSWS96djlzc0JwLzJKNFVJMWk5QXNPVi9Pc0VXMlVZMlJ6bkJZaGtTcnZEZ3FYSVd4UFRvNi9GOTBBUVkzbGt3S1Q2ZUV2bEw3UU5FT1BvU3VTNEg5bW1IMWN2SFNoOXk2Z2hqN1I1SkdKcnF1L0JEYTUxNERYRTNyZ00waml2Tlk0UXMxSzk3SzFpVllqNUhGV0FTRmI3SzRUNnVUUlhHOE5qY1JuakRZUVdHdVZDZno2SCtwUURFUU5sZE1zUENpK2krSVhCeFhwVEZCODc5MnVJKzNldFdhUGJnM09QSEtlcFoyNTZWSDJxZnhYY1kwTXJxN0ZWSC9MN1d4WXN5b0h2NkRKQnJDQzZ6b0xxdnhRQnJSL3BMaFMyZnFIeXBkdkx5aEhuRDc4SXNqcmF5Wkx5djlVcHVKT2M5M3UwTW5kTjNBOUlPNmV6ZndTVGU4cjF4Vng4bkxFSXJoRW9mQ3hzb1RkdXhDOHU1R3hMNjhvQi9vTXMzZTMyd1dLTTZDUG10ZmdDQXRtVnhkVW9CLzc1YUwwcFo1ZFJnK3hsRERDaVFCU2txRG9OU2dBMTkrbi9LbXpMK1FYbjBXckYrVEFLSWsvYVRuN2hMeWwyc2JBSUY2SjErd2JvMHpmSjgvOHlTZk1sUHpwb05mREtVQVhoSzdIa0Y0VEZSbXhsQWQwRjhrdE5ubVVqMGpJbWthK3lCT041ckVoUFEyZDhMYS9QbzFHSFVCZDc1aUhmQ0E5NFE1dkIraldFUy9IQUg0OWdrc1VZejM1UFRxUVR4UFFIcklVZ2hlWm43ZHZlNHlFMlhSMThyVDhmRVpnY3B4NTlic2JWRFhwUlNKSUFGTDcyNkxRMnlDVlByRFdLREFLdmZyMXhWMkdiWDNJR3RmdDJ3Tnkzam9Jd1A4YmZYZ2hucld5bzFlSTBTeFFDM2FWakFQNGw3dE40Nlg0RW1od3Y2OFk1bTRpVXpha2VxUEMrUDhaZFc0U0pCMGJxRHlEM05xb3NDK2ZZOUlCeWNYUFJLSHJJMk55MWZSaGNPd0Z1WXNML3VUZ2xLK1RTTWFvRGZCdFlHSUp0YjFyQ2wvNmwxVFE5bkVoR1pwQy9KTlNJd2lPTVpLV3ZwOS9BR1k2b3pOSFo1V0pZQ1JtVHYxeExJWTZBRXpiNHpGbzJCOEhFZmV3NGFJOTRHU09mNWhaWmhrVWlySklMMmdpc0FCMmIyOWRWeGhQQTBxTHU0NlNWcVVSTk9obUZJMnZvM2dtUFlURlNtSGNTUndYdVl5dTV3QWkzZDduS1o2Y1FUNjQ2SElKa1BJM09zWkRmYWQ3WkFLZDcyZ3N0TVVxRUY4OWNGM0NCdzEvVGgwbGhUdEZxdG56eFlzRmpaQjdKT2tSbkJNZTFNUUQwVDUxc2RIOEhSMVYxbVRuVVRxejlYaGlRV0Izd0xtWnc5UUFlOVhlbUNFSllnMGI4NE5wOTRseUdEQzBJRzdPcVVHdGFseE1HL214WHZqbjZoVVRyVjVvWGdvdk9rOUZUa0tEZEVPZnlHemJ1dHcwNVRBUlVKbmduTmNYZDZQNkVnNHB3NkNsNDNiKzNMaFpLWnhSZno2Q2drSnBhQlYrSldBTTAvWHZDZzBzdE80UitmYm90NGUvL0NGU1o1UUxXVVBWR2o5YTN2Y21SQk1LcnhEdnBxUWRmNStPN3RTbTdIODl5OWtHenduUzBxVWQ2aDNTM3hiZDIyckpGWXpNS1QyQmVCQXBabCtQR3dxcVVTN012Vk0waEdwbHdqT2JLaHhmeXhDaGNrcGVqd3lMank1cy9HTGJUdGJDRjJxdm1PZVRZcXRsYmdpWVpZbkZzaFlsb2kyUWx3YVk3ZWlXTjRxUzF5ZVN2SlVldWgwNzBuNUFZbUdlYVRtOG1EQ3g1T2lLd1ByQzBMN2pEcVN6UHpSeXVjS1Q3cjJTNDRVNld1bEdnWlF2OG9ERDljTlFWMDI0aUR3ZElSdHp1UlZlNUdrSGdFNGRRdUxVenlaVXh6SEZJdHNBOGtYbEZVTTJNREhjYTRIekNycVdwaHo3U2F5TFR6Uk43L2dhQnV6ako0UmhMRzEva2NUOU1tY0lMQ21CZUZNeEtMek5qTDhlQTZEL2NtN1dGSlZpK1V5ZlpqVTF5M1lVcXhUMUsvZVBVK0UxTFZWbHU3VnAzZWxEVWViamI5TDhXSDJXQk1BSVNCT0RMOXVUZWRFWVlzVGVYMGViRS92QklSUXQ3OHZYd0pSZ1JlbytUYzl6YkYzL2RveFV2VUpJNXBPb3ZablY2bkZ0OXBYeEtrZmxEWndGSUllSTlBUEJyNlE1c2QvdElBcFh1cXRpQ1dVNWZXdUtFdjROS2puRnRSZ285akFMUDRwR0YzUUkrVXV1TkE0RUloQzJGSWV1eDkrNjRnTTZwZW9nVU45Mmw5R0FBK1F6dWo2TE55MmhjdmtmSTFMa1lOTk5MaFdUS01xTU9qRENIR0QwYlNycE9JbzhVeE1kYzdvd2l3YkE0bVF0M0NtSy8xd1cvdUFiRG8rWkxSSEliaktYUmk4bEIrU3htMUNteTNrSXEvUlJ3WmJIaVZkNzM2aldldjdMT2VSaGNnOHQyYWRrc2xnUWp4YXN4by9WNUNoa2hzVXJJby9vcVBIYmN5TjZEb2ZWWUg2NmlXdHRVZ1F1OFNWL2lkSzlHelV4N1l0Mk5OSHoyc1lsNDUxcjVZUzZKekZzTnFHcmduaUs4U1ViZVNwaG9XeFJCVDJiV2tlSDZaZ2pKUElncWRxRnFJWkluUytjc05pR1dXVEhXYTBYQko3cW0vRVRROFNpbFZ0V3gxNWFLTFg2TzNVWUNVdzg0Q2I3S0lLYi9QSThxaUlTR2MyRTFlRFpGZ2k1VlhlUkxxdURESEkzZWpCWnZrRGhDZHVJWGhaSzY5ckhMaTA1ZXhXZEhwRjByRzNjKzZpSTA4b2tuZGNpTzhHSnRZRFlZbkRZaVpHbjBDOUo5a0thVzVsV0FMSDBNMDNmRXM0TVluL1VmWWVNQVRrSkVkSmhWb2RaY0dJRmRFSFJKU05uak84VC9yV05EOHFUUHFpQWJ6QnR6R2ZjRHdxR3hQeThnK3JVaTMzT1hjVlBzdXQ2NkRWWlRHM2VkVGYwU0ordmF1RFpVNzAycjlwNXBnZms3cFYwVnlXZFJWSFh0V3ZYYUlkdmIwV1NZdzFmS0lWT3lKM3FjUWxVMXoyS3dsRENCZ3VDTlh0RDFsT0NIaEVaOHpYQlMwL0EzT1M5eVZyZ3F0RVR5QU5hM3N6WS92Y3pYcE9XaFpTajh5SU1MbE9hRzQ4eXcyV0NSVkdXc3hYYTJwYis4QXZHcDBWYjdGQlN5UWp3ZlE3SHJnTkdvdXM2WG5BZWJmcVpkd3JwUnZuM2IvYWJObXYvWkNNMnVDZlhyemxMUVpYQ3NaM3N5anVXSklQeUN4UGJma3k2eEJiNVZoYWUzSGkxcDUvbVc0NGlQdmxIMzIvTDFib2ZNQ1VkNlFCY3ZWeVphdmtZRFJXd1RLbldoUnlscU0yb2p1S0p1TnV3UjlVbFhkZXdKSHpubmhHb2NtbXlCNDhkTEN0Wm9COFd4bCtDV3BWMmIvbGMxQjQ0cnNleWdzMnpyclVBVnhSOWsyLzdkejFTRUhia3Y0SlFvNHVwMlJzNnl1d3pDemFwNTZHVkZCZFV2VE5MS0M2eUdIQVhnV29vTC9vR1o5eGJvUTJDWGFsaUdoNHYrR3pDa3U5RU8xVjJ6a1JMT1h2a3lENUw1SEhjVm4zc0JIVHREN0Z3UjBrbXczdlZTVVRBWldxazlWdzhYUFN4WU05N1g5SzBNNlhBSUlrZk9hdzZvbXM1eldsZ2FMOXRBdDhqb0JTR3BRMWdzWGp5YWlPdjJ2YUl2bjdRbXFyajRJRm5GSWlmOURxUXZlNnZHOHNhdWRNUWcyYnJISVVnSWhXaU5ZSHlrVkJLbnh0T0lMelJKN2ZPMmI2OHExK0FCalp4alpVdU1QbVgvcFRZa211Nmc3TUhiSWdiRUZNN3NYMHdsZG1lYmlSMWVpRHVuODNtRGNDdjY5N005R3BQOUh6RlVvR2pqRDZUSWFKMGRTdHJmOTVpVFZjNVlrOGRtS29RMUlPbkI1eXExTVlwaVZmMDNjb2d5amtKUHhWMjZYOHJiWlplVS96Wm1hVGM5NGwwVWo0dUd1dDZJUzQyZHcwUm0wSi9uV2c0aFo4VUxVWXdFNkQ1SE9YSEdtQWRZVjYwQWpHdlI0RnNML2Rsckg2bWhyZFRPQWEzR2hibHFIV2RpcXhsVzVGakhlbjc4Rmsyb043S0ZDRk9jdWM2L25BWTM3eVFUKzZQN3FIazNobk1PaVFOemNzQVN0ZWovcEZTcVd6ZDFTYk9JNGg1Wjl5YzRhOEwrT29Gb2ptQXpiTE9Vb2tFVUkxQmp3UVVsQm5vR29wQU8vYWpXMiszdEZoUEUwbmRsSDJWYjVJUENzaXlWdU4yNWhrbkQzWldzaEFscTJGUE1vY2IxSkU3YmFlTEd0K1VtTDBHeUVXY2dnT2pPclpVeno2dnlwTUJ3YUFzQ2pVMXZlNTUvblNoRXhtdlFZblVrcG9ybEF0WWIxSFZqQ3c2TXRISGR3a3Ryd1VzZ2U1MXZERGkwNmxLUWRIMFZ4bVdacjVKS2lmSUlEUEJJcjdML0d1SGc0MFpjMHBqbFhFSmN6WFA2NnpodUxKZkF4anNPQ0VhYTRRdGZmV2FqSXRiTFcwaUxEMThhOFFEMWRHdmNyTlQ5ck9VR3c1amRGbTgvdXNid203K055SFhEOTB2ZVVZVWNTVU9wdjJVWXRwc0U3SlIwMm9iajg2TWhGd0lvL3ZoaDMyNDFFK1V0cUpjbGd3YTlJcERxYmUyV0FLMTNraXVHQWdQMzlmSHMwWGd0M2cycDQxdGRQaXJweXJrSnliQk9RTFZzMytFSExmN1RJNEp4S1NPUFJZZnlja3JXeUNmbS9icERGemxTN2E4WEFjMHd6OVpqWDQ1Tjd5U0VnSVdLUkJYQXEwMWUvWUd0MC85WW9yTGVlempKQnRTQ3Brd2xqOWVCRzNuZnc3b0IxN3RPUFFpaUhLaExSMS80UmVnRTZJdWtFMkJTelY3cEw3MVRvV2JqTS9PeG1nT3VXclY3NzAzcE04VDNiNkRZQ3Frd0VSbTFxaWwzVGxDY1BjTFhSeU81ai95Nmkvc1Q2OURHdTN2M1FyekR4WDRDd0c2TzNoNjI2MTNJSTVDeFNuemFQOHFCZkxwNEhwaHgyTDVDbituKzdTeDBVLy9idUZIeEFJQkE1QlBSRGVtV3J6d0lnYzJQSjQvUlk5UC8zMnN2eGtCbzF4RVNGS1liV3FkRzFxc3EySVhVZFAzTnBNQXp1bzN0ZWZncEVvL2FXaXhyL2J6Tk5HdFJQSDdteTJsZTE1alJLTDErRG8wVXNQTEg1ZWRnTVcwNUJOOHpNYXMzeW9UaTBOVm96VzE3WStCVGRFMC9VZEVEZDIvM055Y3dnTWwzKzA3WGJ1MXNSOFZtS1JqcWpHMUxsNzRLUW9HVVlQa0ZvQ2tWSDlaTDFlVnZldjhvWnQvMkZ6eXZaOFFmOW94bkRLc0MvSVhtelBTS0lycTc4eGcxbFcvUFhPU2IwdzhkRytOa2VBcXl1TWdEKzlGUi9OU2RPVVN4UEtVUG1LZ1VPVXlrTkI2TXlJVFQyeHVXOEVDZG80WmMyVjc0WGJkcDFsZGUxYmpHellrSGJhZ1lxTUpCYnZQZzhhc2x1Z2Q4RnNxblV4cTdveDNGK0lRcXY1VkpSTno2RVBqS1RIQUlhc01YZnN6U2pySzE5cWxGcnNpaFFRQUl6bzJPS0p1Z0hRTTN2ejlOWWdJdWFNeFZNbFNaR0xhcGk5YzkvS0tuclg5Q1hIMEp4ZldXMkJSdEdHcndsSEdTd29keW8vTmMzMEFDdFV0L05jakNIMThCREo1eStCTmdNdGREZnhoYlF2cFBseS9NbW02RE1mdnRleDBySjJpZHlaM2NZRy9YMG1zaUtmWVhaOW9ENldwQTkvZmV0cDcwYkw3K1hrUVVVQXRBYjNHMlFFeWc1NW9TaUVYdVdsWnNUdEF5LzdYUTJGQ3JETDhTWjUwbC95WkxaUjJDMGFMVHJNRmYxSU5pZ1NsTy9GRVkrU3BaYkN3N3hDQjBHTWxBVGFCOXRldmhKS3hRWTc3eVRjbW50VU91eFlWRzhQT24xcXgyWHBxZi9SNitRNEJ3NTE4anFlVExkWTNpb1dOZHR1MTlSbW5mRGc4eFkyWDhZOXcwdEIyQ0JWaVgwb2ZSbXljbXlDVmRScXhEQ08yNTlhYUFQRjBUTGk1L3dQYldjMXZscm94WWRUdUVrSG9YVEEwVWdLNy9wTFZPLzZsUGMydGxpTnpwS3UxY2czZTF3MkJCVXk4TTdjVUk1M0V2cHVEdER0U3dKVVhaaTVya0pzYmk5cTZseEVqSjdVSXNQcTVlWU0rNXJCU2VOM3gzVWI5RDFkZjU3a3F0SFdaa1lNeWVadzlDSGdMVSt5WXhEc01vZENLOG1qN1F1S1ltS0hQNTZCMEE2cjcxZGl5a3Irb0grcWY4bnhTUXFYNEZTKzV2QjJvR056V0NhZjhSVkZNcnd5OVIyMTgwdTRqUHJqSVdIRHVoQzhyZlllZG1nNzNyV3A4OXI0VEdoeVUvM0NPUUhVamdtdGMvM1FJVklTK3ZzQ3FmU2c2WEJLOElBQnpVUG85RXk4R1c1a3lwcDd4NnR4dTB3SzdNdXBoMWlLV3N4YmNTZFVkNjRMT3U0ZzhMNXF1R1lPQU94MWVtWGVEcExMM09JYnZ5WmVhMEhtTmI0Sy9ldUtEUzNzODVEQnJ5cE53M0tpZkVidE1tTUh5QlRhU0RlajRqNExYU0xRVG1KZ2tDcTAvSFMweHFLMGJlY3Q2aGtzQjMvV2NUbzhZMngvcmprSEE2dXgyOTQxTHBpMnRicXZQdEwyYW5UY0wyc2ZPL1NEOWdFMjY2Z0xyajBlTmpxZzFWdng0OUZVdHBRc3ptRm5RbVdOU0syVWpXZ3JhTjYyK1E0WENsMmpadTQ4UXQ5VnZaN1RDUytGM2RTcEVBekdndVVWRGw4T0hNTmNuckc5cHJUZ1ZiMWRKZDh6YmlXZlltdEdpMHhvYmFmZ1VVVm9WUnBvdDdURXduam5RN3dGNGhzL21pOTBaVktrWnNsbTJPbzJ6U1NoaFpwZDE3N1lsdGJQK0J2Q0RZdmFqTG1iV1h5UnhQaFBDQi95WGwySWJyeCsrekllMkw0bDU5OStFcmF1cjVtckFIZTNUWFYzY1BickYxZnVUSURIdzRvelZOR09RS3JvNUlGU05WaS9HQnhyWDZpYThBNXpuMjJkVU1QNklhY3k4ZG85K1VCckoxMzRoK0t2ZTBhd2NydE1VWVlkbURORGMrcEpveTBSNk1MTnI1VTJYS2k0dG1IU3lsZFhtcUpKa21xdllyZ0tqUEkvVW16d1B0Ry91cEFocnBJUFhzRDZmNUdaNXB2SXZFSUJaclRZMjVNcWlaOGVlNEtTWjhDV2lXdDQwMm9jdmlRc3JaMFhOUWU5MEFCM2FNdExmZ004c0o5NmI5WmREQ2ttd0ErVjF0VDhhUTFYWkFhVVFtUWw4ODI1VjJqTUwwQWZSVkNjTXZSTFZpK2x1MjEwd2lwQ2VLcUJDaEpQYVVpS2xZeEtSNytXTWRqSHp1eGNoVEtoZWpxN29rMTU0c2JlM21yVGsreEFEY3NoTDZJNnF5dFdqYVJ0d2RpaG5PS3ptVFZ6enVJNUhtemN0dURpVitvQkprbUZlMEtQVWtmQXVWOVlBVHdDK3RscU1BY2J1OCtxZFRzeHpYTisrYlhvNHY5WkdZQ2FQeUc4Nm01S3pkek0xdHRIcUxUOTd5b0xicEhlUTd5a3Y3ZWVaRGhoVkhiSGdqY2hMS085em43eU5rUWlPdkZ1OXdTSWg0TVQ1RU5rU0VjZUw0cEJPOWxnKzhnRnQ0VnVKWTh3QXd1SkhXUms1SnpDbFNQWmxXTzlBWjRndVYzSm01Zkl2YWtTdkhUV3hldGtWbldLSm1PT295YTZpVXVYNXhtYWFoVkJSTEQ1R3o5eWRhaGFoandsbVJnSnl1OXRKZWdWUHFvbThRWUF0aDJLK2Q0U0h3TWtubitvNlY5eDhWblFDMk9QejdGOURENHpKMmRNQjVUeTdwRVNEMDM1UVdPNnZZTmkzS251eis4VDBvNHJKUDFJakZmbGFucTFTY0dhWERrRjRKTjREbC83Z1JiZW1oRGlDSnY4MUNDSzVhSG9GUWY2OG9pRGZhaklvQ3R1b0RhU0huL25HUlUxM29XNE1xZDkvamJ1OVhJOEJoYmJzdE5mT1hiQmxzb0RjSmNGZTFPMDRSZnZQeHVmZlpMZ1JMZE9OTU1jZlF2R25BbjJGMzZGNm5ISmI5NXV0Z2NnRStzaDlNVEJnRUhvZDRkSVB3VlZ0OWpUeC9xMmlOWVdyNmpGNWlKYWlhdHJZb1FycmNybnVyODJ6SGo5UUpmdS9Fb053MWdqRWNld1djSU5JcUpqZzlieXRNZC9wVnhHNUNuMnJSUnJEVHRCSTBTWHphQW1EZUxHMlZ1RFRzejE4NldiSGRVR2xXNG9meUErbkUwNmlsQ2VYTFJHbllraFRHOUpLcjZPZ1AvYmFwWWNtallnT2FFZnJGSHJRYjFORlUrOUF2RlNOeXdTSUNvVzRHQyttTHY1UU4xbFA0MjhONVk1bVFKUXFhaUo3UmU2SThPU01WU283MUExVXhqaitvdjhnZ1VtS2RQNnZFeDNkRk1NdVl5cHhXMUFZQno1SGVId2hOaVFmMHR0SUhLS2ZOSkxpckN4dkRqdzNEWnRGTW5pWVJ6T0o5NUw4MWhBc0VaREdNZ1RZQ1d0eXRKZ3JMZHJIZ0JzY3ovQ0NmVk16eG9VU1F2ekRQb000SDVTdWVSVjBoUGI4ZWU4bzJobjA0VVBLTE9Oc0pHdEpHTW1jcldPRXZkTzBtQVFVREdIYkNndWVZTXFQWHFIN25iRFA3c3hoMHcrU0V2RVVNT0c1MDVGSzdLUmVSNWhlaE9BSEFsUnBtR3ZVd1MyUGk4T21yaUNIN3hJTTNkMjQwOUdGemxYRmtpaDB3M2RqUW1QT0Vma3J4ajBJMFZzZWd2bllYek9sc200UHJyeW14SUJZSWFvbVI5NS9pRGZQWGt0NXhxeHFOeTZSL1dVRTFKV2NIN21OOWJ2V3pkeWp4OC9QODZsbkIzbm5kRFljaGlZVC9wWmhaQmJRL1lLTTM1T1UzUkdJNVFDNmY1MFZkMFVOSTBybjkzRkhJRTROdU5FY3k3bFZzcVk5dlk5WTdyaDBhOXZOZjNGaFNpWWlGQ0ZaMlVqVlFUZFd1ckRmSkwwL1oxUjFvbEJXcVJEOU1IZEJ5VXdjWE8zdHUxSENwWU1XQmd4U2tmRXM0Wk1SSmg5T3lNeVdCVHRWVHlYaERpbm9qWU5nenpTc2xBQkhQWmJIQ0JEcEVFaWxuMHJveEppR1E5NVphelp3alNBZEdVL3lSQU1kdS9zL2dZSFlGcVdEbmRES1IrUUVhaGFDUVRvaEt1NTNWN0hwMmtmdkhSU3NQam5QTkFBWlREWVlOSnRISXBNaUVqWjVoN3hhL0ZvL1o2dWNnSnVOc0tSdEQwUXBQRE5abGNyL1huZGMvZ21qcFN3Vi9NR2o4VkJFTVpYb0NLSllnTDQxd2JGM2FKN0VHK2hmUGowaUlyeXpSZDFlVjhRMmsybFRWeUYwY2hGWkV3YnptWHNtMHViWi9RRjkrU1JKZlkxQmt0clRGKzl5dmtmS3pESE9vcFNsNFZVM2ZWbzZsbVZudXNQdGRyRmNnN3NWa3hIeWMvU3NMbzJxUElCZm5HWnpnWHMvSTRwV0YraWVNWmFIVUhFZUJwd2xiZEl1cXorNHFDWU1aR2N3OHFWeXRFbzFmT1RQZ1hWelc1NHJoeWd5RVl2WWhMbVlIU1lxNi9QRFhpZGtDQy9TRHRCbHVvYzR1dEh0R3YxSmFaYnhjVTlKejZSMUUrRzg3UnNhTUZreFhJUFg3L01CbTF0YW10c2FxVG9zMnBMOWttT2pIQXV3L0pIL1Fqc0pmRmRWWDJnYnV2WFdkbEZWclRpUGswSkVlQWtHYnlHTm1YMm5YMm4rZ0Zvb1hhL2FhVnNTQmxmL0paZlptdXVPemRrbGxBSDVpYisrNXcyWnQ0cVNWRHMveWRoa1lVOEVmVGl4aFNqaFJyVVhjcHB0bVROMFBkbWJmQTE4RG11cTBkS2l3enM4TG1wL3k2WGNicnJqZTY4eHFybFBuRTJaRW5jMndsRS9MUUErc1EwcDlVZXhQN2lrSUF0SmtYRHJyTjE3dnljbnQrZEFSY053VWQvenFTVXZtWmpnMDBLQjQzNEJCS1J4NVE2anpTTnBobG9ja2p3bDJyUDNCYlhRZWxRcmljUFpOd3d5Zno5L1dIN1M5dzAxQllIckk3Ym16M1VPUGVjWUpyeXRTT2R2RTJjYlo4aTJ2VjROYjIzT2c0eVZMTGM4VHVGSXhaeGJ5MWpGK2E1NnJzdVpIRlFxUGs1Smw2bWlyWXU5ZVM3YXdJayt3TG53YW4raWI1dzFzUFFaL3FQSFdSdk16bk0wUHVoa3ZuK3laWW4yc3dZaVJRMGJMcUtUUlBZRGVVdzEyMjRPOFg3MEJHTkJMVGhxN043Tjk2cVp1SXBTa2F1UjJTRmJPNitEZ2t3N2hhZXI2QW93bzdhYkFDMUlmeUhBZ1hNMFJtdW9QREw5S0QrSlZab00vbUQyQnZ0SlptelEyOGI0eThmejdYV2ZrRXZMa2gxb3JCMVM0ZWQ4ZXhpVjFPenErc1JJcUhCRml3MEdqZ2tiaTV0OUY3d3BEZmZ4VWVHRGt1VnVaaXBXTGh6Z3A1L09yejlCNmpKYXJiQU1sa0lZZnduWWdnWXdOSldpMjNoWFJ5ZzZlRUs1VjhqZFFIR2VzaE5TRkg1azJMQ1FlQ2pwRm5kQWc4YVBwdkVKaW1lMDR0SElIamdCaVlITnhPZXFQRlMvWDFLSnJqOTc0aWhHM21Ec0V3RitVbnFKdHFsTStLTHF1bjZabmVjU2ExeEJ5dUJHRlBOUllFTHhpdlRvbzdEVkY4cTBTYnFUMXlFaFhMd1JqLzZuNTliOXdBYjJzWEh4ZWhsR003Vk1QZUhmcGZVUjgvU2NJSk10OCt6NmRPWjBaamtOOW9YN0c3amNnaGlEV28veGIweWNZUnFNOTMzQXBYYVVkbUxQcWIzeURBbktFMCtQRngyTjJoYk9KTTNNc0hZRXlkUEVXZ2tjLzF5ZCt0NHZjQW5TNjgyZXJId2Y2RUEveGUvSW1KZFNSVjZaZVNRK0RoemtiRDlEdU80K0VaNDByK1RLZHFldVRzMENhd1A3NmhybDBiYWk5bm5WcWs3UU9ZZmJ3Y1RlVHIvWXUwVjZrQkUzbEhyRnM0K2ZGeG0rT2VFNURtbStTcXBIdFVxZEEyU3hIbjlYWVBJS2hNYW00L21ZcGIyc3VUTHVvTWtGcXBKb3R4TjZlME5xYlQyNGZKRnVLeVVpUkU0eWFzMHpJcFVrUGtNUUVpbVhZeFRIUCtZYUxGcGo3b2J2TFpMVnBUNlFaY1NsUkgyNEtDUUg3Y3dPcWU1SVBCa2tzZjhQL1RLdjQyZm9YMS9NcHN0SUZjMGI5MkpOZytPNVZ3ZTB0QlBpd0YwV0hweWcwdk1HWnVpcjBvckV3b1VHUWkxaG5PU3ltYm1hZ1hDSjlOMlB0UDYwWWdsbXMrZmFORlhacnlkMGdWRDlNeUtlSklDejB6TXY1RmhhUXIyTjdzcFN0ZDRyS1F3cEdscCtkLzMxT1crMXdzb3h6ZEZHMlFwK3M5OHlUbTF5ZTlmS2xjdmVwWjVTaDlmR1JsS2NVamdwY0VDZlZzTmxNZTJBUmZGU0JQVWg4SkZ5c2xJUmF2bmdaa3FkV2F1SHRnOHZIcFdybTAzSjBYcVhZeUx3MTQzRmJkcDdNSENmSUE5SGMrUU11SXZaeFRUNmFrWW5wRUJSeGZIdHZFZXZkZUI4QldJL3pZK0Z2TDRRSnFGNjBIVW45ZkxXQSthb203R1JoVHR5VHByd1A4c0xBNTZ4dktyaXRGajdUYVlpSCtzelVwcW1PcmxkYVo2REZaVStWZzREUDcxRjAvSEI1bVMvdytuMDhEY1V0ejI4eUJZbTJFNXZKbUtkbXgzRU1DcE50UVlvMnJzczIyV1lZdEFhd016eDBjRFZ1Z20vdFUxSmx4SC9ia0lUMTl6TTR2bEhra1FwcXlESUUxWHZCK1B6ZjlyV3VoQ2J0TnVkNUpmcm5RNUFzQjNGSlNON3BmaUxjWitidnQ1eUxJaTQxZUN4L2hIMGVWSkwrTTdXMC9hT0JBbHBpY3JsQytSNS9aYlBhdTdWKzBSbmlXSEJrU2V4N3pDWkFvbktoZ1RMbVhsUmZpNmdPMUZFZG9mVE9oVG5qNUFqMXN6SExFdjRIU1RwS2VoWGpmRWRGZ2kzRXorNjg5bDF5TWdIV3lGaGgvQkxWaFVsdzJHZ2tRRlNsQ05LbVBmOW9NMUhEZjRjajdKWFFCdVRTaVIrQjBBUTgzTFJPVGs2aThRRWRkL2JBVXFDREJzOHJqZ1hsNnlOOEtQN0JQaG9HVUNhVDl1UnhLNU5xZGVoQk0xaFJ6VEt5MHlCeHZ6czNDRWZHK2srWHVJNHNXeGREalZBVDNIV1FybExwTGZiNDFlZmdESEswNmxQWDVmOFJIc0tqMzRhdlZ5K0JjV2swNVJxWGJXS240Q0FnSURubjFRQTBkcDhiZ1VoeGxTeUFHNHBMb3JNOHRPSlQ3K0l6OVNsQXhFSGFRWk1mMElWVFNhOGNKanJvb0tuUDFZc2tsbVNjcmdVdEpwc1ZwUTVTV2FvV080bnFvV1lFK2ZzWFJzaEJpQ1dPT0JrODJrSm1hSzBHTVozUDNiRTJQVFAxQzIvRDNJNCsxcVBOT2hNTnExOFFxc3FDcy9hZHp0emZwdzNGd1NBSzhjMHdXRHhUbE84Mld1NThUdmpYc2lpdjJmVXVhQjNJcUJ0akVvcjZqRTNqZDlGUGtHdmR3WmN0Tm5ISGozK0RBSkRoOERFemJFUGh3YUV2VVdrYUNaTXlvaW5tVWN5Wkd2WG55U09rSHBURUZpK2lzY0tHQ0dRdmd0djdTMDVEWXlVbVBPVFVZWGxVVnRNUFE4QVBLekxDMGdPdllIbzlFdDROUGZiYXo3MDJkazNZWno5YnNwVkVqbXkyOVRvTDRLSHJ1Zm0zZElKK2NlWkNpL2ZLSEZWdC84R1crQUZPekJ0YVdYQTJHYiszWlFJRTd1QzNIYUp2b3AvNE9PcWk5a2xxcEpCRXR4enVCU1k1eUxCVEJYelB2MXpobm5vQnUxQWhVNGU1ZmtBbWgwQk9jNFppa3dSTkZMeEhsZTNjdUZEc0NJUXpxcWVnWCtYcXpFTzlXNUVadytjREUvZ05rM3FGclpnY0h4dCt4RzFwdmdRZThlejQzWEV3MkZkWlkxVlpRaGMyS2owSm1TUU5KY1Y5WDV0Z1BnQXY0cFVQdW40NkhFQUJXT2p3ZTFJRGRoYjExN2NoUHg4MEhVYnBWTTRHUlFqOGY5S3JENGNVM2xjZGFTSzRubzR5a1pNRnp1eVFqWHRLTTdVWk01d2tJRkZxU1hWTSsxMVFoa2x0eWJXOEdDQTVONFRrNVg5U3RuWmhNMjN2ZWF2aHpYTXdGeWtkNzlYanBEeGNNeE9sVjA0SEdNUktQNUJCUDRzczVrTHorNUJZM2ZISkxlOEl5VnJOQ1pXc21HZUgwMy9YVFpPU1M0Sno5cURpS3ArRHpWd2VGQ3JkTURLVkZWOGZ0UWptQnBBUFY4UnovSmZoOHBVYnMvTFBoeGpxNU5aMXFkVXpVMmdvVHkxZDFlc3pFSjBZWlZPR1BzeXFHZW4rY2hvWnpsbVNWWTNJMXpuMDd6VFk1UXZFdWVYNEx0QXVaS1F1cFBzaExoWFlxeHRyMDhSbEpDT0Z1ZHg0MWcxMEVJOThsRmw3Vy8xU1UrMmhRWGZLOGl0STZnSGxTb0tRVGpoZ1E3Njh1WHVVMmhJYXhsUmg0ZHNxVzBrK01Ld0t5SU8zbDZWMTJRaGpEVXhKWmh1S0N2cVVYMFgyNTBYdm05N0p6L3lrYkNzYjFIVkpTQnk0a3pPZzZYOGRMKzYwQ29odXlPMFlqazBweFdBbFh6RE5QRS9jYlBQb2NIeU83SjJiaFYrTUpTYjVmb1doczcxZ3pRbHRxKzF1cW9FVTZYRE1MMllXRk8yS0VEN1laZGorTDlNREt5LzZGYnFlcVZjcmtBNGZpL0hQaW5FR0d1TTBER1EwamR1QzloYURZSHN0d2ljSzhocHozdXFvSFZXUDVvZzdMVzU3VGxnYWtvUDZJeVNqV011a3hmK3Z6M2NWczJiVnR2dGFTVXplRjNmSFhxMHNSYVNNTWp4VHNLdVNJT044VUtsMjBzYzB4RnJrNW56NlYwbENSTmVSNnBPV3lvcS9ZQUdDbUpsc21hZUZWaFhjR2dwaG1xblY1UFRCMVBkSGVUcHNuYnNtZkNqcVlIOFlvU3dod2ZNbGVTVUhXZzJYTWpIV2JaS281R003L0MrVEpzU2FscVNGd2FEZ0hGVjZlUlh1ZDBzM1hOS3ZOUFp0QzVPQi9GczBIOUVZMlpEZ29BZUFnWlZVTGdpTktJYzNFenRYNWVmSTliUTVEV0hPMDBkVmxFaE1IWFVRcDJKSmhGaGc3ZDl2M2UwUlRoRENpUU11Q1pUY1pGQWZHSGdZaGRyd0UxRnEzNk5wOTIwVU5NTkZmU1dNUzVBQUpoRFlDU2dRWUxhVzFzM2RiZHNJWXd6dWU5SFJnb0M1dzYxcVVUdE9tb3VrYlc3K2VFbDdzSDdWR0dhOTNoOUg5Tjk0ZlVZTS9FT2p3cHlyZUhBRlFoS1pISFAzc3FoSDIvVXlDMm8vZnhsYndPelR3K2JrMTIrYysrSVZObFBldjZmZHdjV2dxZllQWWdWMEFySTR6MW96Q29HWTloMVVHT2wvNEpLeXg4Qy9tV3laK1JMUmQ2UGZMTEMwcmNMbE02RkFWcUVlM1g0ZFdkcm9xaHBNQWdYZWlaSVoxTzBESUk0WjZmVDdKb1haVkNCbUxRbGhUWW1abE9JMnliSDRhRGptbGVKZEJmMGgwM252aVFWcWUydExyaTNuTlEyZnIrY1VDZnNYL3lNaU90dHFCSk0wWTRpWEV6MjZxKzJoTVh4MDRpbDBDVmw3TFpZWVp3Nk5TWlp5clVJVGtscTA3MGdBSnNjV204VFZrWW04VXZLSmEvenRCVTl2ZXgvNjlkK094WTAxaGcxbExjaHF3NVRqbEdyRUJxV3NHbjVRdVVPTDFSZDVYR2RZSnJ4NmRVV3NwVDB0L3RtYnkxZ3pwaE81TkdrdzBDcjBNeDVzVm5wK2toVDlBUW52MWkrSXp0bkxzS2x6eUZjYWpha0FnbkhncFlocXhlSGFodXorSEpKQnlsNVRYd2l4czdpSGxJbDk2aVlYbVhlakFONlB4SmpicWczZU11b0RVakkyT3IxV1N5RmRqWk9Ta1VoREJHSUZ6M1k1ZzZvYnJiY0N3Yk5OcmhuNzFzakZOWHdWYjFZMnk4ZWVsRzZFTFIvT3RSZ0d6OFNLeTg5N0l1dEVOTksvbXFtWWNPWW10WU5ZUHE0NzVZa0xIK1ZNSjl4VmlCMTJ2VnoyVVBkU0QrYW9qenBTM0tLZjhpYS9JMTdVTFY2OTVIcUdZZjFFRFlrSHJXQnh6S3R5SFluMGlaNDRVTUd5cm9GYzQ1RWNKUnRNQkY4M0duTlkxc0tXc1JOUm9NaTk4cnI5em9sK0ViTThtNWNodGpFMTBrd1RJallZbUdsTTZ3LzlWS3JqWnhlcERKcXNrTmJXMURtRnI1ek9pNkdHR0s0V1pKYzdnNkZ4MmZGTFh4WTFBMllkZGNnZWFoYjMxdWVOUDNNT2M0eGRFMjFOMmw0WHg1YmVhb2E5ZnJrK2VHWnh0OXNWZWluL0JUQ0s2M0cwZTRzaUJhUXZkcDNpNk9kNWVjQTJadnZnWHJ3MmdpejA2N2xqd3N1ajhmeWRTcmxiZTFlZzZDTkxsdG1IUTBnQlJpYTVUQnRpdXlEb1RzS2plV0x0UmY5eDBvNVJDeWJ6ZU9RK0FmdHB4WUEvMXpTL1JGVnZpeVJaY2ttbTNRaVpVSE4xR0xqaW5Jb0FWMlg2TWlnMGVkR1h5YjRWRU1VUG1rSTBsVjZDNy9BWk5EbEVrUGJCblBzTE9zR09pblhFT3VqN2hhQ3BLeUNHRHR2cURtWXB0a1YzNGVmeCtKakx2OTBRa0t2bzZrM1lCSmNBUFNMd1YzOWc5WGhld2JDVXZ5eEtIMGFNbGo1SHprSjl4UEZxTmV3TWRCVWVJc21FSkhQMzc1ZzREVkFOR2JTMjcvdVl1ODR1VWFsdC8wLzA2RUlnOUs2eWR3cCtDeGpWUWtRNU00c21Oai9LcE5TclVGdjZzN2p3YmVUcmdSdTU3ZXhsNHpCUFJFajdmY1lWYkZQamU1Yk5IT3J1Ym9IRXZxZDJ1aU1ocm0zaW12aGVnT1FaWE53K0FwWXBIUUMrN1hoNjdGZmRUZ043NVRlZ1Y3YXV0bmpxQTZLSjlxM0I4NFBtUjZjNkE5cTBpNFlCc0RPU0NjbjNLa0g0UlFOWTQ2UU5pbzdlQW5lSHVHQTd2NElKSjlhOWNvN3RDMno1dkxEblA5SlN0QkFqQXFMZGpzR3JSMTJhSGdpR0xkQmhJTHp3dmhUaEhoNDZUM1FBOFMyOGdlSXhZb1JQdGNDeEF0ZGRKeGpTbHhRMzJWdDVvMVV3NHlTYXFBTjJ5WTIwRWFwb0FVQ3BHd0lDWWNuY3pCb04zaVowN2g3WUx3dm1xTU1JRWNwU1EweDg5Mk4xeDJoQnE2bXgySTFIN1VhckRZSExGREMxLzlrYUwyalFnNDllU1RPVTNyUlpTTE5tSWNLWWlRd25FL0NzQ0Zra0tnazU5MTV6b0VkQnlreHA1NzFsakFEVThnNVhMYy8vcEdFblNPY0Rpb2F2bWlXdHJIRXJJdHJuc216Y0FqdEMrZ3RydXUzT20vL0plcTQ5Y2poWG5UaCt0T0dLc09ldWNTUkFVZ2UwRUdqK2ZxWEh1dlQ5K3AxWVZqMGd6aEpTNzZCbmhZcktpeHhuemVOaVpvdWtPalY2NUZ5L3dHZmFyb2ZUTHNnRmQxMWh5VGdpOTIybUl5RUxvS2syNXhDanNLU3hadWRpMVNJV3hhVlBuVGF1RVBLbUsvT3JFQkpYM25oSXhkR3BLTEw5WkdsaS85eUJKY1gxc2tkQ0M1TEl4UEk0NmpUY1NhM0ZqbERJMjNlbTY0cGs5dFhKM0hRcnNwMlhGbnpxeGJpaThPS2FwTVZWZTZqRkN4U0M4Zmc2NUpBeVBvMXlBUDhiVWpZKzNiL0NUWEIrd2FsUkVqR29jMHk4UXV6cDJ5VW9MdlJOUnJDcjBwcmF5YkJXTWJScmJSWXd0ekoxYm5vRGIzN0pkNmVNRUFsMlJjbGQzZmdKc3Q5MWpNbVJoS0ZOR1pkTXNWcloxMlZkVlN0aDRBTHA0d3p4ZCtFMnV6U0k1RC9BT29GS3lHUWdvSGdPVmh5YitoVGJ0aFRvS2V2c05QWE1KZ004VjcraGIrbXoxLzFsRjVyRTlnRHgyZ2dCU3ViRWtESDgrVGlyelNEN3dPMm9hTk5CV2NwQmo4OE5reVRoNzUxUFNKNWZLbDBhaXhjcXEzMmdNZDlEVnlkRDJOM1FxNXhWMnpRZ2dXTEFpdkcrNmIzbmlXZWdpa0swRi8rUkpMcGRGa0w1VmpsYXV3RHdEYXoyR2NlZlhFa085bjU1N1ZwbXl3V3AxeXVqamdrL0hOa3M0NzllRVhveFBGQVBaYVRncDRJdmRaWDBtQ2NpRVZUbFpUNFJzREJIb3VkT3I3bnAvbTVtNFdYc2tGeFRuZG9NbmFWNUkzOVpTbEh6b2ZzMlUvOEZyNnlxRyswMCtzc08rdGsrMjArbjFGSDM3ZEsrMWRBbVhvaXdCbUZBbHNNb1JsVmh2VktaV2tibUdXR0gwSW9uYVJoSDFFTjY2aEpZUEdPbTFKNzRRUTBYbmRnMXBoNGdMYXdtR2Y1VjNJUmNyM3hvWHFRelVwNC96KzlJT0Y3YnJGUzZOS0pKb3RlVzBXNjRGT0l5YWpCaWNxNEd2VUpxcTlXT1JwRkhRSnlaY3o3cUhHd0hzMEExK2JoVWZvcHBoaU1EVllldkpJY2dHZytGM2o0dVZPc2JaNnJiaER5Sm5hRE95K0p3dURTRXRQL0h5bGRmZzg0VmNjZVE2R0NMWkl6bmhPUGJVTEtnWStXOW1IbU10TTNFMHpyVVEweC9ySjBGK2JVMUl3UzZ3MXBFSWlEc05jNm9VY1UxUjB6S3JHZThYNisvbkxJejltcklhR1IxclA4eE1HOXVuazgyMVJWZUtPWkgzUmRGVGpUVlpiY0NKUnFsc3Qrb3ZOOFQwRU0vajM2d1dJM2U1TGNTWmRaU1haM1QyenFWSERGc2JXV2lBOTdwWHhhZGViZ3lkQVdGTHcrdkZTaldhN1VibTFaeFZpUzZkSlNFR1JOVkRiMWhZL0tCMFgrbnVYUmNveEZwOENucGtYUzFOdzNGb2FRM29adVpWdHo1ZXV4Y29Kei9TWmMvZHJLT0Q2Y1YzajZuY0doRkppTVJzMlQ1S3p2dE5RbzIwZTdkL2VuSm1IZ1FCNlkydmtIbEIxRFYvcWVZTFpJQzBJTDYvc0dLZG52bnZ1VFdIaVEyRUN6VkJaQkZ3VGU3UGs5VGhlZ3hZNFlNQ0w1SFFpei95T3hHTUU3TkR6S2xadlo3dW5rWDVnMVlwNTB5emQvVTJmWlF0T21vV0dFaklVSUhqRGlSaFo1bVpqYUQ3VGc5cDhYd2x4V3cyR3ZJT1N6YS95anFtWFpQUmFtbWIzZzZRWC9XeUpTV2FlWjVwQmlIZ04wTXdDeXlsMjVFY3hGZ1hsKzRHeUs3RGNrNVgwUW5yelhwYU9zb1JNb2JhNWNvQ2JneVdyaDE1RjZIcU5vSTJmNmxNYUM4OCtrZWw2cDdTd08zMTFwelRoaytrZ0xYQjBMbkliUUd5VUxIZG05dys0VmNvRXhWTlIvRm5QaFljdHQ2N0c5ck1oNnVORUV3ZVNNSlgxeFg4Wi9DK1JXdlZ6cHVDekc1SkJ1ZTlOaWs2Sjdyd3hLZVFPdTl6c2JDZVY2d2MwOTN2eWtOMHZHUzRmL0xSeGduMjhIYmJWMzRSenFyVGVHYnA5dzIwVmo0bnlaSkRIWkJpa21IZFhjalEvYW5OQXlCWkVLVUZ1VFpyZWZScTlZMXJpTXZDZkQ2OE01L0RKZlpoM1ZRRlFGbzdLSTArQlRSUnJKV0VuMm9jV2p4ZE5MMlFGdVZnK2NEdm9vWS9DdndTK0lBMEtxRDdsOHRldDRKcjZoOHFDODlncDNvdHRnaWhQUzJlVUtYWWhRU090dVREaEJNbjZVWWZMYXlZY1BPZ2FDL2sxSlRrMW5OeXhpWkRLNTBjeXI4V3AxTDVvU0ZCVllpVFFTM2ZiS3hwL1VvemNzWHBlWWxHWHRMVGdhcVcveHBZeDIyQWxnMnlGeVQzZFhjaitOMVZwVnRoM2Q5OUFxajkwaWpWS2dacWFXUE9vVmZyeUFnQjNWcGhvRUZESjVFejZoeG5veXdpMjhMZWhKeWVtY2JLVHcvTXdCN0xPUmwwMUhHN3ZKNG9YVXQyZExVejdab2wvWXhZbHl1UzlWMWt4bFpRL2lZbDdNNHJpTkRRSXc1NVRyV0IxZjZ0dGsxdGw1bkFTVjlsdHgrU2RkRVRPMVJYMndzL0ljaG94VldyYTdjRW1WNW9la3N3Z1IrOVdWNjM5VTNqZlJiMnlTWTJPNy9vTC9PbFk5N3hLbURHSVpNZWhLczNqbjFLV08vWjMyVHZXWmJPUjRHanRneGh4bUV3WENsTGloS3hKaEVSdzJVMFFVcmZyR2drcGhwbkdGWFU3czhCVUJnZXlhbHVyUlBhTEVxQjZIdHk2SWxYaGZ1ZXZmMzM1bVo4YnFTTVRLNzg2SkU3d05KS3o2aXhRWWgzQzczWEh6ME53ZE5xTFhoNGVuZE5UeUtCLzhnQ1VBL3JJbTZUVnhpUE9ySURtZXIvaGVEdFBrbUpxOFI3N0V1NGN4aCsxWkFoVmQrVG1NTVQ1WDFkTXpaQTFMOTBhWWtTRUNxWUZOR2ZrMlo1Zlp3Wk82VlJPUmRMUHNNOUtlNUxKRDhEaTBscFdpUkxuY2RsSzFUY1FkUklIVjFLYzhhZHBGZktLam5PZVMvRWIxWHdIdXJVU2RDRWg2bzl2UU9rS0hqSEFEN0NUbHRBVm05STZTczZlYVBsbjgvQ29KdjVNTGNtMUk2YTFPbm8wbHRoNFVDWVdGeXpWVEZBZGxTV1l2N1pRMVF1aFBmSlM1cE1EY1hkc05sWVRvVi95MVZKc2hmaThnNEpDWlNXbXFEZnYyKzZEQWlmWXhiZytvNEFTSUlvcGUyVGVqT2ZxaG5vNk1wbTZLZEUvQTVsbytRalNURjJkSExwaVhmbFNWRlJia0FpWDdOdUxRa1pEYnVtb3crTnA5aE82OEx6Z0RoRm91SlQ2elcrb0pRNXdsTlhqMCthYnpreE9VMHZibVZjTVd3VDk3eFlOSHdRSFFLM1F5SGJBdEh2ZzZYQzFPemlONkNaNStwQXZRNC84d3R0K0tPOW9xMjRPckpLY0xYSkpzRGRyVEczQ29HZ1FTaFNEY0NTWUh4eE9ETFFiRFJObEpsaUNwNnRKZVFGNUlvSHF3WWZubmoyUTYrNk1sUHRneDdTSWs5RmFCYUZodmkyTXplbnN1N2RsanhxUDhKbnZMRzVMSWJVclVDUHJYa0VhMTJXRS9VYXh1SHlqSDBMeHJCVkR5ZWN2UWVncmtjSnR2S01XWUhOZWl6NTZ4ZWdQZ3J3OGhJNFEyVjQ2SGt3eVV4d3pqNm41N0VGMUMvVEFzY3g1RjhhVnovaWl6eFZMYXYzU3hnS3U3dEdmTEF6b3FKbFNKQmRvZGZma1plTElYeWpEZXBZL2MzQ0dwNVFCRlN0NS9pVUhxbnl0ckJPS2hFYmdPci9kRFEzNUZRcDlKNnBuWXpGSWgrdDcyaFZHSElJeXRIazg4V2xDOEhnMmcveUZvdFFvcVpMMjB6U0JRQit6TkgvaWVDc3FJVHQ1amdTUTlNaVlJaGRHRXdjMjRHQzIyWDRVQkJ3VW5sbldNa0xUY3ZIUVRIVGZmT2wwRHRZSzN2QUFjSVFEYStYeG85MUxkMGtPVy96Rlppa054bFRFSVRVN1djL0tybHo5VHRMOExScHY5Y3IzOUhqTTBtLzh5MVF2TXAxVnVybkxnY3lsais5em11Wm13ZUNQdk55OFNlMDFFd0ZNdTc1bkFLNjIrZ2VScEVxZHAvTlRSTDQ3V2pQVHRoenNwZVJtT0R0U00zZDdiZ1RxTGpLUWM1WGsvNUdIdWRTUmlaM2VPL3habE10VXNrWDdpbmZEOEQrQ25ZVzJOU09FQTlsMVFVcjFUbWJXZGh1b0FXVEpvTjZkUFpNTU9xZ292ZDZFdG1pZ2VDV1lLY0c3bnFXbmtLWTZoZlRNYjZPTWFFakRyR1Z3T2FvZXJBV1NwZ0N0Z3JxUXpHYXpmaGhXd3JKYTdtTGNIZHUwYUZ0dDVLNjdHUVJqdEJxS0JveG1BeVNBZ3kxN2Z6ZFFqYzhXdFRRNkQyOHU1RWVOdzlDYXlJMTFxN3daaWI1eFdyZHF2SEpNcGV0d1NyRS8yWkh6YXJBQ2JPWTF2eUtjalJjb3RtZ0pNU0x0eTdWZzM4Q3VkOFJQV3loK01sdlAvQWl0b0YrOFR2S0wxZnM2K0pSVTJkQVhWaThUR1FtUWpaS1J4cFVBc2M1cEhNOEppWm16VkNNbkkxRUZMclZUK1ZCQ01idkF1RkRNckk2cUV1WStwSWVqVXFhN2tNQmMweHVWZzBwVnU5YnUxQ1Q0RWhVWVlWMk9MNGZ0M1BXejlpT0RadkNOQk11YjZHNzhVVDlJajRtZXhNVzR1dW5DNHZqZnprMVdyQ2d0NkpXL3RuajV4cE9BSWJMUThhVS84Mjd3ak5zSmZaMU5aRzFGUUpGdXpxTG02aDNUek1relZsNXFGVUhEMkFWSTlSNWxuV2hxcVVZWXlTRm5XNGN2c3NhUnFkWmNsK0hFMjEvUDJ0UkhqTFhtUjdndHhUSXpGcHRUMUkxVjF3Ky9DZ1NlM0xOSGpTNnFZTlVWbEx6M0RNRU42OUt6aW5GK3J3RVpzMGxLTUdOdThXRlZQb1FDMDNLUzNWS3dTN2pQdXpraU0vZGp2L01XRzl6QjBpWnlXNk1PdXF4SXliZ1dTNjdsazVyZUtjRnNLTk9jOGZudkgxQkU0bVR1Vk9uRWlMd1p6ZEpYK3JGYlFpRGpwUWN2SlN1aXRwQnNRTER2T1cvejdqdDQ4RC8xdHROc09NbTlEdmRiV203bHh0aHgycC9iMGd1UHkzOEJoVjhoZ3p0YXY3eFFmOGVPVHJJbWJaQ0ltQnB1bWxGallsRlkrTkYyK3lza1djdG5XT2h0TTBUcHAyMy9JNlpWZGxINmM2L1RLN3dhaGZxRW51dnZYRWdZaVlBK3FnVjJnT09rQ0dNTGJiYlpraDZSNEpyK1lXZ0JYWE9yTFAyRENsbmdPRUN4UHVjNXpCRTN3alBYQ3pGd2YrVzRrQlg5ckduQlFrd0VtOWtITEUrcnorcU9SdnR2RXF5RW1PZjF5RUFseU9nVUU5R2pSdFlXbUw0VU5QSUV0aFUva0kxMGk4WHRZM1NSSWFGQjVtWWR3ZTF6WDZQOUdrKzJ3T2R3NUpVZ1Arako0UlNSZmI3clhzYk1RbW5lZXdIKzZBWGZHQ3BMeVYwamF5dm9FdW5aOEkzTEdiZjlSUVZ2Slo0ZkN2eWwvL20vRDJ1RWxuWlgvUUVLV0VsTDlDWWU5dnhpeERuOHZaUkk1bUVMOUs3YkJ0UVdVWjg3a0N4QVpISmNveEFnbC9oWDhyeUF0ZFM2ejZ5VFdkcTFrZG5lUmlKNWpCdGxJalorcnV2TTFEN29OQ1NWTzFGWFVtVmNSQVlHUmEzSEY0Y1lTMThIMy9rMjFzN3VNRnByOVlsNktianpiZHo1cUJrcjZXRkJtTWVTN2c4WS93RU5IWUVqUFVvK2JYZlpXRHZzcVBZbEZXc1kxbEVncVREWkNpRExnSHFaOHhEV1FoTW5ib2RMZDhud3h3dU10VmNTVlp3V1REdEFWazY1ZkJLaWJoMWpvUHBWZkJnM1Z0cE9wZThjT0VqMlBhRHRFaEl2ZVdXREs0cWxmaWlTOEIrSXlHajJzdEdMVDVBSXlrQm5aVmYwZTJyVGpuM2FHVWdlV1ZFVUZMUnRiUjd3MitqYWtBUHUzblRSeGVWWlVxbTJwU0NiYVhtWEtHc1FOZm51OTZ0QytxNDcxMEdlQUhOQmF4cWFkTkIzRC9XMVlnUjRiQVp0WWJUWHFwVCtwRHViK3c2VzdPdStSeEZWSm83bjlJcjUrM1pIbDRuM1RSWGRid1Bkc091NGlnempyNExqcXBPTXd4MnVpYlgxTDRUWUxObkN0bEZUSU05Z2NHZEU5RERCQ2FjUXJBTXFWWXp4SHpFaSs2VnE3UnNMYS96SU1xcWkwa1ZQZkJsekJRZlNKR2wwOGd4UmxQeU80dW13empTd3lmNTVFR2QyenZZWm1wd2RKd2tMM2pEVUpwaWFMZCtiakJ5NG85WHRTTlh6WXpTWkJ0RzRsNXpvUWVLUFNhL2tBemVoSmdNN0tOOVNoSnhKQW1BRmhzZGNrUkdiYWVESWZpb2VoRUlFK3MrMFBoQmtyejFZV1JaYWtBYzdMMjZoTGNMTjkyaC82aXI1UDE0bG5FWHhGUDMxakVkektlaHNkK2pMbEI2N25RVlhNd21nM3M4TE05L2xsejBoRzJ2WjlDbFFHbFBFOWRMTjR3d0VmRS80Q3YxRUVBalhiQnRqUzRldklCQW8rQ1JmWEdubnNrWGtPQjdLR1pYZHV0WVd0eElla2pqeHFsQkd4aTFnMm8wZktNVFVrSmxJc015dUZ3cWJnSk84eVc1M2x4THF3alIzTElib3FZVG8rR0cxUFpGTDd2NDlNKzFhdzkyR2RhMG9nQmdtVGpwTENGcTBJODQzRXF1TzdRNzdUbVJsQWhrdktmUTNZaXhNcDd0UW1oVGZKenduODBsQ2pDalY2QkdrNFZBNkFleXhrWlF5aFhsbjd6eTdpTXFoRW9ZckRPOUhVQmZDRG1ZbUNUOUZzSEFMZE5SczhvQ0FCcy9HNzBoZk1WWEIyYXpHeFdkOXdwZzhLczdsY3Mxa2xCVHhFbzliVVZUMUhDek5aOG5WV1pIbGpzQVZXbEJlRThLdWo4T25rMVVKNkFzZ1o3bmlTUWdkMmtNMmJFK1BuaS94UTdKUUtKMDNnNm1jOGtadnUxbkpuSzVKRFdIRlc0QnNKb3dBTi95cys1K2ZQWi9pUnBVdmJNZEFqekYrL1p1U2REQlpsTFFVWEFKM1dENFJjYUozbG04enpVdjk4VENjRGdsU1NQd3AvZkVpRjZSbjRPL1FKVFEydVkzTWVBRWs3b1FRSzBDRnhXQ1dibDFRK2FRaUQzQzNoQysyenJyL3gxUnN4ejd6cHRWYm5aK3NzTHMxUEpya2ZRNXFmWVpEWWFkK3RrZlFTRDh5WVVyRDVSQ1JPNW9VUUZVRXlXWEV5Ny9PN0k1MU4xRUkwb2xrZ3YvTk5JMFZnUzVpeG9kd3J3SEVraUhZRmphS0Z3ejRTblFnTDJlVEdPeldMS2RqdDJxd2UwcWdCRExNWU5FQm56aXp0TUFhby9IUEZjdE9OMGdwQnEwa3JwRE1vVEM2d1QzT0t1amtXUWhEVDRuSDJRM3I0VzZhS1ZXNkR1cHI2N1ZkTWd5WVU0eXFWbklrN1NjamVxV2twVEhpa1ZMOFdTaXY2cG90bk1qMExiTDhGb09MQ0dldTBBdGVJSEJtckh3cjkxRnB3dTI1SW1vTXpBdmdYNDF0VFhwL3pFSDc2Rnp6NnF2TVZNTWFmVXBPdFVXZEpvTGRadnE3Rk1mYnpHZDQ3RTR6Zk15ZFNoRE41Uk5GVlF0ZWY3bndYSWRzWVpYdFVhWGdNSm1vaHd6aW5UWnpZZHh4WUtZK1dyVW9ISTFFRDdKUlJSbStEM3paU0l0UUZDWkxVWTVmVXYvUm5oVUhTb1hRa2t6YlVpTDU4UExSbnVrZmZpWXJhRE1vTU1NSFlLc2hiU1lNd0Q0bkZCVkpNbFFBOHI5czFSUTBDQWs1Rkw0YW5QV2ZBRittVkw0bFNMdzlwdC9ZODE2cEtOVENGOFlueU9heWZEVHRtVktpOGxrVFFKeVhZOHVoa2lHVHhXZ2YzdGhRbVAwWkt6ekxvTDJGa3paeC9iT1E4d2JpSHJaWHoyWVIrSkM3eHJiRDloS0NuRUt5SCtWTnBBUnFCQk4wYmZzWE5LNEFjQnJIaFMvTnlnM1czL1dIRXNZeVFZd3Zvd0F0ZHd1SFNkS1paOU9jRDRHS09icWFRNGhCNnFjUmdNTmk4REtST0VwZ1o0bmFSRVpuWWtTY1dLTitlRHBwWHJleXJPZDVKc1F6VzlOYVpqZWZjKzI1cHVsRGZMMUZDbW1CVC9NcUtLckl0NzRTcGNOT0Q2RTdvQUplYlkzRDZPU1ZCUVhVQ0oyZlJyV1k4N3NBQW1MYnhMd01SZ283djgwb3pUTVorOWdpMWFuVXJNRStZRzJFY3RaVE9PMU1lQmh5TFN3V0Vjc3NvejVhaFdRRjBtdTJvSFBXOTFSa0R3MVREVjNrS0N1R2lMaUdDV3BrZXhJVTRsNG40cjFkcW5DY3hlY1pVbE9ObW82eXlXdGloUDBTRmRibnFlRDcyc2ViRUh0M01CdFhQOTJqSngzVWk4ZmpybmV2TXBNNFBicmI1dGVLK1J3R0lxU0NrWFhaaUp1SkpBWlgvRFJwVlN0akpESytGaVYzUStMNGk0ZE0xR0VjWUxNeE00ZERORWpGeStFK0FXaEdPb0tiaXByaU1XQ2l4QWZWRHYzdkN6SmVYMXN0OEhwdjlkWWVCaGJXUmdSa0k5OGlvU1psakgzOXF6MUpEbXFRNzhCbHAzRHNPOFZwR0VHb2ZydWE2OGRwY2czV3ZpcjUwT1dlNFBXVGVHaFo1bjJlMGNZYU15YTgvTDJwQ1pma2ZkbEFKUVFUTlZIWkdha3pCMTB6QUxOY0RwUlFjdzZjaGhDNlMzaWx5ekQ2d2VIK01MbFJlMlhpMXBBTzYxWDZncEUxV2NjeUdzZjhlUC9RUmZlUlNBcVRXL3RrZHpXckQ3NXB0TmpBTDR3TEs0SkJ6cENTYXE2NnRzNVlpelhaVkZRZHVjUlIyNUxOc1g5bEsvcXJtcHNiSENBNmwydUE1bDFqUkp3SXZmbWU4WC9RbWcxOHAwYnAzQ3ptQ285cS9PMGVDak5JV2ljdXFQMy9LaFlYTStBRWJTcWI1UDdGL3VaVGhFOVZHR3k3REs3NS93c2oyMXRHMHFkS3ZwOHdPT3MxaUF1QjR5dGNlTXdHZUV5MlU0VWl4ZUJSZE4rWHJ1Nk9IeFpIdytQS2dIVGkzMkdLWExZekhjT0VYejdadFh5Y3RNcG5VWVd5RE5rcHpIWEM5enIrK3FpMUZqc2p4dHAxU1B5a2lqQlhta1dyUVhqVkowUmJFMjY1Wk1pMkpiQ2ZnVmtQa0RLendwZEFhNk81eUE5YU9oY1U2c2J6MDFRcU1zNVpkZmhuZkEwblRMUDJuV0tVU0tHQms3RGRrYnRVancvbUQ2c1FxMllBSTBESjR6L0Y0YXBwZHZ1RFJTNjU3REU4Vy9qdzB0T3ZaM0poYzJWUSs4b0E5L2V3aTRuc0FHNTNoZnZXZG5GSnVmbjIvU2M0bHZkWjVhR01CY3pzR1B6OGxIdDNJK0VMemlqK2hmOUd5WHVvQnJXQlVIYTAyQmx5VmsxcEMwSnJybFBya3JIa0wzeWxXbUtwVkx2NnpXMDlNaU1VaWJ5bHpmd3pYTGZaamh6dlBYdEZDeDhsUkc1eU85d0ZoZWl0cFhacnhGRTBGaE5rMmxMZEp0dStTN1JjWlpMTGlBQkxNWG84Zm92VWNNTDhjQjkwSG5CSDkrSnhrWGZIR2N6WVBZa3ZJNlB6VXU5SmlrT044dlRBWnlBNWM5YjYvZkhFT240WDhyZURnYWIyR0c1WGFCVVFlcnphci9teERUb09xVzdEZ0x2TE1xYXNnYnJaYktXY3I2SHh0NnJrY2Npb2I1V25ERWR0UkJaWklyT29xZ290L1k3UXdVZDV1ODAzSHplOWVSQ3IxNHY0V2twZHBpYXdqOFkvaVBuQXZaVVpZS1lFcXgySHcvWE9aQy9RL0M5MklBcysyMjlhTytuWVhsZEZIQmlCbG5pN0hWbjB1Nk5SVVVEOVlRSG5yMnlTV3huSnYwRWNDckNZWVByYnN4SWZZNU83S3B0bk50TTZIZWs5SFRROUpnaUpCODFXTGtnWEhCT1hJcTAxMmNkNTBmN2VTenRFajRnZ21tTlB1K0g5YmhqUk55MXphbUJLQU85UmJrQTdyanNFTkFrOVhpeWtCU1VLc0JmRUl0ZnpnSjBDcXVNb2JuM0ZtZjF1V2VQZW4xYk1Md0hydDB0RDMzcDMwcEkyTGp2R3Z5Q1RsMldzcGdBbFFyTExtS0lNYlFsQjFiZWhoZzJ2c0VDNkNpSE9kekxmazBwNEJjRmU0ZzBDUG4ySkZ6K3J3emZvM3RaWEZNclRjc05xaGx1ZUl0QU1kbkVLeEdDOERrTmJEZjl5NERtWVBYNnJqZENEaVdETFJrTlNtam93R2wzNFZEeVVJU1gxYkhVT3pTNlZpN1NxdktzaVJVQVBuKzN0c2dsTlJuRm94Qm8rQUNJbnNwR0xyd0hNdUpOVkJhMDR5WHlvdk4wV1cvZndsZXNFQmZwT1BsWXgva3JpMXN0S2d1QXNONTloQnJZaWtsZzJWNFREbE1GTXlWczJXUkRCNmUrZG9CS1M5V3FFeU5wbm1tUStWcmU3UmNjK0l1OFdoWUJTMTNDTEZGTEl1SnVDWHR3cHZub3pqa2ZtSkI1K0pwbncyRDVxV3drUUdOUitYSVdkaFA5V2R4RlVvK3hzM3hlcHM3OU9DVFhKdmFxdGtUdm43Si82N3hRNmROd0NXZURIaUp6eFBtSTJsNEVyYXRHRk95eDQ3Z2Y5ZU1xTUxiWXdnNE1xOEIrM282ZlV4T1grSGxHYkp6RXJObUNFdjg1Q0NFbmlaRHd3b3pCaUhwS2o2Q1VXLzBIemJnYmR1OXZYbFJUZVNqTWdwd3lYaXdZTXdiN2tzZnJBNkQ1ZVlWQlE0cWVNbElHbDhJOTROdk9ZNSs0MzBOR001UzY0VzhyT3RrT2NjRmFvSWhvenVJTkY3RHJZdWhqcWhrMXB0N1VuMDgvTXBFaE1Kc2tmdTcyOVlRRk1MMGxTOE1FSGpreHpJYlB3cW52c3Vid09qbVFRUmdMaDNRc3dtRWdBUzBaOWR6ajFrYnAzeExnbmx6TEZqZitiL0RNUGJyby9JNHl6NlJkZU1xakk4NlRqK1gvcEtlQml5ZTdHQzJjZzJVYVhPeEpJSGxnY2pZRTI2M1lJanZ4YjkxM1JVYXhaYUR2MEYydjd5aGdDMkRVcmd1bExNcGY5ZG1JZzBtdmFnd0NEc3k3aXBKZkVLa29HcWN2N3pUelVKQnMxZ2FwTng3akZURU5oanJjZzVnQkJId3NlRzAvTHlkb0JTdTAwTENlczlXZmtxbzdaN3owZFRuZ2Q3OFJoMUZmZGZXS2JaQ0Ixc1M1WE9XR0xZQXZWYTBIbGYwZFMvaFBPUmRNbFdaZjdtZnB2MzZuUVRCUmdDQ1RKT1N1UmQzQVNQTEdXWkVaZW5YMWhTMGRPa3YzTFZERnlnYXU3OXM1a3l5cE5lOFltRVRoQzVlSVRoVnJSckE4b0t5M3VWZlA1ZitxOGVUd1k5clRFcnlwUGZCb3I4MC91SWExeExxQ0RxdXNRMFNuTWlKdXI4dStOTWhMV3k1MXdRdUt5R3BIVUlrNzR6bW1FZ0V1YVh1WUphMkt4K1dxbzdVMG55T2pXdmdJdUJZRGVHYlRvRVAwSnBmN2ROUml2MFpXbkZ3dXhUTHB6UWVBK3FMbnNxcjhEazQrdU84anBGUmc2dWl5T2tiVitaUGtqN1I5b1lqMnI0U2dINUNDU3RWcFlFZEZiL1hBWWNkMHg0eEJJYTVLTVAzdzRQSW4yaW16b3FNQTBncnZBOC9kSE4xWWlQT3Y3ZVRSeHo3Z3BET25oM042NFJtNERoYjFNc24yZktqaEZiWjV2N3h6SlphVDl6RlV4WEpXVDFkVU4wOFRlUmJJWnI2Z1JPV2NvWURqUGU3TkJEZkhWWWtrZ0JlUXJpcUEzVkx4Y2R6d3pLTEtaL1U2Q1BiSCthRllrZzJoZ1QwRnk1cVlVSHJGMHphVlU3c1VMU29PSEk0bnJMVjlHTFRlZy9rTjFDMzhrUGtBaGRBaERCSUpqeVMrajJKVHNqZ05GakhoSHIrSkRFbExPMVNHdlQ4NWloWS9zeng3OFkzNVQ5dlgxQ2huVUlEcmhTUVFJZjdONU9WVDhWVHVaQW4wMklrYXZnWXJBSVlvS3YvYkVzc09rY1BMV2Y0WnpwUmJZT1dPVFZWank0dE9PVHJLb3Znb1hwVnB6SzdnRkhYWm1vTld2K2svOFNGRzB1UVg5djNwKzkzWHNKWTB2OG1yTFJPMWhDcWdjSmhuMGE4WGZNRXhNNGYvb2NrbDdlTThjaERGMXFjTTRISzVuMGxVT0JFa2t2Sk5OUnh0eFV4TVZPeTJ5K0hyd21ZR0VQVWxwazRlRERvOTZ6dVA0NEl0bmFYdkV4Q2lOYVlhNEdlOEZNSlFza0FmTy9ZTkMvMWxHRVVqNmJYa3hjd21uakxZUWppTDVhVlBwS2VkQ0pnMzJKYnpxaTB3OU0ya0RZaUdlQ1c3cXo2R0ZnYS9JYmNWOGxhU1NxbEpOMDE0cDVjNGJsYk05cDlFOWpEbk5Hakp2dWFVRGpBcVNhcUYzUFZQbnk4am00aUV3WE5zdDVVVkZKMDF3Tjl0QUViNFAvWE8xQXN6MHhTZnVwd0M5ZldjN0M2c0VTRk9CQW9ReHZZVlV5YTRTbkljMDIxb0xNMHprZEszM0lQenVkNHp0S1hlbEErcG0wajY2MVR4d01yYVVsREM1N0twZFdUUVNHVTc3eWpiNGFUaTYxNUJpcjBSVDJDSkZWaS9aUXRHVDVnVzNiSnM5d25uRDFDVDFySUdIZDE2YzBxS1MvOTQreG1wM3E3VTVpWUxCVnhJQzFqRWw4UWlxMXQwSEo3TkppbzlydUlEOGZsUHJOWlVvZDFDZHFPaEtXd2xhWUNPWXc0Wnp5ZGFlR0R6VmM1NkczOXV2cUtuNG5RdVlXQ3ZkOTBhSVJOdUFtVnpLTWtrZENnU3lJTy9UendMOXpmWVVYVlNiay9lRWhjaGZsOTJZYUVXS2JiWTc1VXg5ZFV5T1NBa1psZm9CREtMZUZVM3ZWV1F4UVBLdDFIVDhCNHNHOXNtOUo1WmFVMGF3TnN2OFcvZG9tRHR5Mzd0RmtqR3JKRklmRmZ5NDlkRVFaUmhHdDc1T0xYQmRCQmN0RmZCM09PR3lubjg4ZEpPZmk4aUZLaVNnNDRERm5EaVNMdXNNMThkRkNObk9nYnl4MUIrSUZRbmR5bndONWd4WDU0bFlxYmkzRDk0eG90bUxuWksvOFFyVGVoMlp4elE1VUZWL21lck5sME9GcmR1MnE3SGVETEpNWDh5ckdqWG9aeXRmS3dmeGxlM1U5U2JFTW5pa29YM3lIaElqMmsvd1BTenNRcGI5VlRkYXhYM1UwcnQ0U2Q4N3hGYjBUQUZFanI0ek9oWnpmUURQZHN1bmhoTzVJZnlLSDNoVzgvMHpDYkRwRzRRQ1NnT3RGMi8rR3RKd2RRT20vQVh4WGI4MGVhVXBxeHlaNzgxcEx6cnAwL1NwV2lJWWNSNktCU2ttcFNPTHFBcmhpdDNlanRxSWJ2YTQ3QVU2dlNqOXVldU04Rk4wQVM4UWxha1VtTk85K2xKdWNPa3p1M2NwSTc3MzNtbHNtTVdVbnVmNUNaWXN3cmhTQ0x5TWJPUnlKaFErVkhld2l3bDh0MDY1bzlDNldjWGZhWmZmdXVLTkRkYnY5K1RHVCtueFVqazRKYTRMeWZEYU94OXRQZU9lSzQ2Z01OMzBJY2M0TVJFWXdpRkRRelJVdDlJVzg3eHBwWkNwRncveGVKU3o5L1RsR0E2MUw3MWxNZW15UElKNHR6emFEWWx1RXZJWHlsMEpURC9MakMvZHJiemdvb25KRkkvOXpHSnIydktITGNtVUFCbXlPNmQvUitYL0NLWVh0cUl0TkpMV050dW1zWjVKdmJab0hFdDI1TGgrcXcwa082eUhkdXFaNUx6cWpNSWV6bVRCYUZoZEJkNXkyT2F0TE9GQ2xoSVJHMHFhNDNIYUFqMnFSK3l0RzRwanVBTDByNWZXTEVZV20zYUpTQ1JWTkZvQXJnb0NpWkVGRXpCS0VhV1dLZndDWHhSQjFsM3VsbEJIcVJrbFBzb3dxSUx5TlVMek5rTlNYd3FYNzhLa3Rsc1Z0STZFZEVyTFVHNDdhckkrZmk1bzcyRnlETkJvNVBEMkthditCWjgyYTlMdG1ybU5YbXFHMTA3VFBkRHAyQkVCbmUzdTVLbzlQdjNLcVBLYkVPT0NOU1VBN05kb1dXQ1ZwY0lHYitqdTVQaXNvT0w4YXJzYzBJSWRjMmtydmoyTlpQVGtHbTJDUmRVUWNQTTVhR0FvaE9nYlRXZ3ZPenZCU0ZFeHk2VGlXSU45ZlJVbnFKdzMwdElIWFFaa3lEVHh5M1ltSzc3U1dVMzdyODhQUE9oWVBNUjA0cXNSQmsrQUJ0WHB2QStuNGM5YU1oWEQvT1M3NDVUaUhwa1gyUmUyNGhPa2ZYTTBrMHVjLzhJdXR0RGVHNm1SVGY4QlBIcmRhenRTT3FSL1pudk02QWxFZDBjaUtUY3dHSWx5d2tmd0ZUSG5ITFB4ZUVndkZ5QmFHelRBMHRCU0Iva3RsNE5kb0lnQWlDRjhaV1Y1T0FkalRCM1E1ZXJQaDNjTlVld3lhcFAycU9LOGdOTmQrZzRlRWt1WW9IaCtNaE5zdkVEQ3duZFFuTWZpenowMi9mVDQyaldQaThydnZFeGNkMmRBbkphNUQxL2lneHZQOGR6TDUrdGNxSytTS2U0VE9EK3ZTUWdBZFhQcDhMYWJrd29BendVc0s3SDVMWGd3Q1Q4S3FCZVQxcUpxc21yS21ERURnN1REYXBNZ1hVNTBCVEFtZlBnSlNaSjAxKzRtZlo0c1ZGVDFXVnJqeXcvZ0VGZFNLMnovRjhJc05DcHAxN3d0WlllVEtQdlZZUm1KS0lNbDI5T0lBcHNqZGNwWW95eGYrbmdDMDRibFBhTUlnU3ZmRVNBMjJUcHJoY3VmNWdnMy9PRXMvdEhzUWNBQzBuMWdqVzR2L0xsbUJ3VmM3K3Q2bXNsVVFHcncrS0xtRHcyVy9lQjUxUXZyU3pwVUdkK0o3Wm1ES00yaVROc1hRVE15TUNWRWh0VGJLZmZLb3Y1UGxBYmRVQXdxdGZIR3U1R3ZiblNuYmlNMGx6azdTSjhZWTFQMzRKL3NsbWVJdkM0MVhlSjVZMko2YTY1V2NCdFV3RzZibmJaZktSdlF3SnpVYkdFQ1liZHN0VFNPYmRKaE5FaExDZEFKbi8yVjJ4ZkxxMTBMRHJGR2hMQi9PVk0wQ2UzMm44VnRoVS90dVArWkNhYWh4UEtLNVJiZHltVE4vOWQzVDgrS1NSdy9qRS9BWXl6UjZpUTE5dm1OZXB5ZWJKQWtjU3N3WFhjWFhkc1Q0RHhtTHQrZ1Q1UWpOd3ZvekpPa1Q1eTBFbC9VVkpITkFzTnpVYnFoRDJNck9FZ0tlY2RjMktPMnJ0amdDa2ZzQnl2NVlVS25PZFZmdVk5MmhWR1AvTUhrcklxRXc0UGdoT2NvYkhzZ2I3OHFhejhSN2M5eUdrakxVVWR1SHUvYXAxM0ZrY3NKOHlkQ1FEZUw5U0YxY1FCVjMxUDBUZHlaNXdNWHd2R0x3TEdRNVlndGNLQWlmZkVFOEtJRW5QeWNhdFJLcldnOVEySEY1RlBOeE1wbDZBNGxvbXR4SmFaUGpyV0hVdTVmMTljcVBIQWxNbjdiK24wSllTd1gzUzc5V3lwQ2pybUQ4Y0FYWm9SR3dHSWFEK1hrV3hXV0NyQ3U3dDkvRHpMMWRLRHpZZlMvZTlsdGdyRkk1eDNhcnphTHVoVlAvWGs1SWJ6S3ZDN1dHU1hPYndiUEJ6VW0rWEQzUll4TzhQQXZBZUxyQkRHd0FRS3VIZnF3ZFowZVlYSkNUZG85Nzl5SHVVM3pVNFhhZExNUE1IMEcvS0czaU1mR3ZUQ1FENmxJVGovdFcvQWMvcFRKRFpBOEk1TEdCYlIvNWRFMnVPMVl5a0E5QmRVQTIzZjFvQ1FoQ0tIYWlERlVLdG55R0p1T1V2dTdaR3NYVDNoQVM0M2ZFcTJqU1hhaVpjNTl2SFlDSmRrMDdaUnZLRlFFTjYwR2JXQnhabjNpYWRaQWRwaUxRWHUrRmJtQlRBdENlVUJYTzI1bGQyWlB0NjVma1c5anZBYURhRklTMS9NR0NGSFBHT0Z2eGt1c3hpNWhGalpWUW1jd3dnTkJrdnh1UUl0am9vV1dJT1Q2MnlLUFRJLzhGNERwTDlNL0sxTy9RTVAwaFhHSCtjRmc5RmoydHNXUkRSVGNDZVE1MGdrc1FlU0d5R3prZ1BFTGVpMWtJQVBLUVlkUHM2KzJvaHcxaVJUNmNOZ0dRaWZjWDJKbVV4SW5iaWRzQnZEQXJoa2tlSVJ2dTl3ZjNSODJ0bzBWQ2ZvNUxnS040UmtqaUtOQ01lTkozd1BEWEwyR0UyRDMvTnZsbTVoRkdQTzFRSm5iUWtpcmdMMy85QzJuT0lsTlUwWTI1RVJaNlFqZDh4bTVTK3g1N1lwSDdJeG9tR1hBVnN6UDZKRW5EUkRRRmxOS0Vqei9lVnBJQ0pDcC9PQUJqeVRPeVpaU2FaZlpoSngvQmJUbEdyakNBTzJjOStPeEwyb0NRamhlWW92bnp1eCtIUXBrWWxnUFJselRzRHg5eVhhSXFpekwxNi9UUjNQNlNNRjdyQXpkQ0NXTXRRTWNqSXM0ME9nbTNveVpIOG9NUHU2NEw1VmdMU3UrQ1BMZ2t5UUFqSGVjaEhsUTNCcmwwUkx2MHdjSjZ2SFlCQkxBWExHMFczT3NDNy9ZcVB1b0kySElGZkhrUlNtMmM3bDVQRGRROGRNYUV4ZmMwSzA1N0F4eGdEM05MZUxmM290OUZCeFlnYWdjQ1BwWTluU2tQQnNDNXJxMWJaVHc1dk4vV0wxZDR3RWJlZ1dHTTAwbTQzQnlUZUNJVlZnRmNtVVpNZ3ltNzlsdXp0dFQ3VkxFVzFiTjZJNjRmRU1IdjRXcG9qQ2t2TmRmckV0ZGE2bkxjbzVOWk5WK21GRjlDYnhwTDJpUXpGNWxuVWVmUWNRT2ZXc3gzSkRkMFZhM3VRTHFkUmVKeCt2V1Z6SHJab0o4MGtsVzczb0FHZG9Cdld2MSt4ZGw0WEU0RWNCYWMwZUZ0QUw4c0l1R1A2eGhWWTJkVExyZzFJR3BUY0hNb0I5TG1NTkh0VGY5UEpWMnhIeUpUUDl5TzV1eVl3bjdSSDFxdFVxczlGSXVGOTBEZDZYaTkrenEwNUhVcC9qNVlZalllRWkwaTJramFOS0FkSlExeVpReEpKaC90WnAxdEd0NnZaQTVIRVQ4d3ZhVFpiSU8zN0NYNW8vYW5hdkpkaDVBSkQ3TFloLzVqUUZLbG9XQ3JEMnUzYis0ZDdkd2ZaU0ppZFY4WDdOTmIrcm5hQlpMTnJtN29xUUVPSGFLdlFheENaTDlnRUloUE9OVmZEenAvWnIwMVZzQnFiN1BDblRvTzlGeWI2aEdPRFhIeVpNTnJONkpaUURxMVdqK2dlQXhEejJDekhVV203dzkwUnB3b2JsWUVPMkdWbGRIR29rS040S1loeTZWMTE0UFRPdFRkbEJFWFVkVllTZnkzbEVKSWVzVk52NHg1cFY3RG9BOXAyNlc3MzVqcktMNzNxbjA5dTYvNDllaVFMc1M1dXcxMlBhZSs1SE1rdjJRRGpRY1l5NzNpeGFwakQ5ZGVJTlk4TXpFOE5iTlFKaU5PcnBkQTdaaWc0UldaY2t5T0NjQk5rNjlwWWpacUpwSFI0b2E0OU1wRExHUGtqZ1JlSm9YOWV0UXBqTzBuU2ZwNGpFbmxqVnlSMTlrdFRMWEV5WXpubERwTjBScGJXMlJ2SUhCR3JVUHpZTU9maHVqeklualkwT0hwSGpUQmF5YmJOeUFiWHJBeWxVcU9Cd3pCaG9KTFlOWXBtalBrdkt4OVRqY0l5QVo0alBHQkJSNnJBNGxCN09oTlE1dkJpZ0xCbVRWdmxXVmt3YVRmNHJKeXlDd0pRUVAzazZYeU9qZnVCZjE4clk4U0ZMMmxHMEg3LzFCb2R0dGNIbHZTYmRqU0pBd2tTWXFTQVUzMU1tQk92Q0NpQS9TMWt0NFptMXlWanZOOFJQOWdKK0pLcnY5NEtpMDh3RXNpV1kxOVNXN1cvQ3QvUTJCbFNOaFZvV0pJU0xuVHZmMmpGN2p0MVNhVlZuaXNRRldjazRIa0M4U2tDanRxSlpvZ3VnNXVkbm92bHJ2cW4xRFhrN0gra2tSc2lycXN2KytmYXlia3hiQUVONFVQZnYySWpMRXRwOXFxZDZnbTRlSnR0RGRrdmJEMzkwUmE2cFFlNXNVZnd0anF1SmxaanpxaDhjRHkvQmRhTEtNa1YwcEFyWDltK3U0MFIvOEJjcHJxVUQ0Y2NaZ2ZOc2hLUUY2UTFwbWw4UjRUS01xWEk4WTBENGpKcTZERmgwQ3dxVjNpWU54VmpFUDJuLzIyRnJSQlNNRVYvMlpMY3BVdkUwMFBaTWtHNUEzNDNsU0JkMzFwT0I4enJxdzRBZjQ2bGpBRzZXUzRYelNCN1pKWXIwZXZ2bVNKbFMyK3ZmcmI0bWdFN1lFazFobEdKYXZLcVQ1WnFNdDhFODNubzhWTU94cm95ODF2azl0Z2g2VS9KVkhlZjhnMExHWXQyYXpCbGxXZ00vNWJjQitrRUhNT0tlQ3I2OWd1aW9qS2hKbEo0N28xQmVlWHgvTWUrY2trdDdxRXR6aVlZcGxZSXJYbGVxL0lnOTY4ZEpnTk5Jb1g3aU1aM2tYaDNhVzVTbUlXZ29QTDhENmx6U3g0ejFLMG95b3dQOGlWUmtPZkNpck13UXFvV2ZvWjNJd3hIYzlaNTBxa0pHT05ySjduQWx3cnRTZWF2dGh2cEV5NGdDS2ZIeXZyNGlQOS9PYmtheGptWDkrdGowekZNTDdzWWZNRWpjQno0bmRhcEptSm1xV1prMXg3M0c1MVpiWlZtOWVDMVQvYjVlbEt2RFZrN2NYY1ZrVjlBWmZHSFZBV3BsNnBub3NtcTIwbmNCTWk5Mk01SCtxZ3g4dEVNcDhWVDZ3aDJmMWFDbXA5NzlYVE1Tdkt5aFB4bytzNGdVaHMxKzJwTnhEL1JoWG04emNJdjNaZTQwSkZjSDB0M2NHRWJUSTRGc3ZJRU82dCtQOFFmeW9TUHNjU2lHRkNVMjEvelM4b3UyYkZSOWlidXRuV094M3VoNS92N3FzSGZ5TkxsODk3d2kzRW1Nc2pHZjhBbm42L0s4U3VJaENFT3FQZ1ByY09xc3p1RFJmZjdjc3VLWVJzNDVsT2dVeWVOeWVnR0licHNRT2VUNDk1bjVzUEFhQ2RLQURuK0tsRDZRWXJLNVRKQjB2NEFhM3o3WDJkRlpVNjNab3VTUGhvN0h1dVk2UlZ6QktPQy9mSFpUUERTeW43a1FzT2IwMUNrWGUrUlM1ZzhYQ3NqbS82aGtEaDdCRnFCczRkRys0alpNN0EzWFVLbk5VL25KMHlRV1BSdnZVNkhuT0dNYkRJT3ZaOEg5S1R4THJkRitaaXhra1BySHJSaTAwMVBnQzFJbzNLWW1lL21hcUN1TEs1aytWMWR6TXhaWU9UN3dIbDdzVVRwTzFhdW9mNkhqMlllNGVDQVMyQ0xDR0VHVkRFdnVtU3hQNnlIYTJpdkFyYStMeVpPLzg1cVJ4cUhNNm05Zld1T3V1bEgxUVM0QUwvQ2V0bnFENWFNYlhJWlgwZXEvQkx2R2d5NVFTd0hOa0JTT3NqRXVkZXhXTTB2MW5GbG1hRlBHaFNpRWZTUUtjVmpGUTIwOW12NVRqREVGNkJFWlJsSjlNVktTdWxMVFBOTllseEN6NVcyR1AyNFRHZDNRa1V2N2M0VGZYR3UxWWFLSlVWMUhpa01vb0gxNnFwVXN5aUlwK0JxWndhbW9kakwxSGJGNjk2QmJqUDJUNndlYlNEUzZJWmVsR09KY096ZmJwZ2NQblNkYUZJa0xHVnBvRjFaeWtRcGRQdnFIUnVmTm9QQjZzYi9OVGRaUGswUXJhdDZ0aWg2bjc4UXhWZUYybXRFYUdsK1lBdkFOZ0ZiNjVsRStjSHJYMUgxbEdXWHp1SnRjT1hiN21EMHk5OGp3OWJiOEVzQ05PcExvWGVKNFBoaWJ1bkVVUmZVVjN5WWNKN0tqMGZlRjMvS2pISVJKa2JvdXFRK2FEM1YxR3dTenpZWTNFTE1VQ0haTENVREU4R2hoaWx1Uy8zd2g2VEg4M08rTVRYUGZJSG85M2lBUkQxRVMwNGJUOExYQmdRN1V1VzNjckJxb2twc2haSzdNMXRoTjVkeHFNeUl1bURvQ2Q5V1YrbS8xTy9HQ2RuWHhOYURyVGhIeG90VURSaVo4dlpndk5pVjBLbVQ4TEY3LzFJM2VSWXoyVFd6SzJQekxOcUVXZitnTmp6aDd5UlpMR1VKcTNEVldHbFBqcm80cGZ5d3BJL2pFZ3F6UGxDMHFuaUxjRHlkSWJmQ3d1NUVsTUpnb0hDWnAwZkI3OE9xdUdXNnNmRkgzZmNEV082WlJyamYrMGF0bkNXcG1SN3VOYkIzQnZMSldxMExFNGdzdTdROXNzQjZRWkl5VUxDWDZnbEdFZVpXNVJtNzhma3pMSlRCeENBVTBhV1IzaDhNcVJXRUtLR2Q4SCszSGJ0L0V6VUFvM1RRdHdDSWw0ZE0zNDUvVGxCWDFzN0pScC9RSUNDRG5UdHAyNGxUbzdmQS9vREc3dkxETjlsK2ZjdkFhSGllcGtUT20yeUdyZTBxcUdlYzhaMjlqeDgyTzIyWDhrSXA4a3l1c29zSk9RUEx1cEd0aU11aTdTZnpXSndxYThBMFNLZllQbWl0VUdoWFA1VFRjYVVDRXp2eXB6VWVNY1pUUFdJZnd6RGd6NExIQ0Z6T00weFNZQnZwVkNvVHRPRXIrYy8vSDhRT1BEMW1CL1d6TkczbkVlQTNZN1J4UHc4c3JsTGMzL1B0UmUxTXNvSk1XZmpkbnFndTd3RkFOZXB5YkFneEpzUVkzVHNmQnRZNmdvRTlmMmNMQnI4T1dOTFpJU0hGMVM1TGRJeFpMUFlKaHprN2QwazljTW0xdWxURm5icmpyMmtpa2VQVDVSRlV6VHpGRlpVcmh4eVNQaklWMkhqbVZkZVRtdDgvMVQ5ZTZ6Mm5tSFd6Zng5RC85MzNkSDNUd2J0bHk1K2oxQ1RnblIyTldQMHZJVjdCYzFVN0J1Z0x1a1diVzg4TEFQSzFhUzBLL0R5WSsreHlLZFIzUlV1Qml4MXNsTzFmUlNBdGxua00rM0tHMFNqR3lDV21rVkxCcDEwWnR5OUhMQ1o3aFcvdXU5QkM0KzV1RUE3RVFaeE5zbDQ5WWE1U2xjWVQwcHBDZUN5enZzTTlLKzFITmE4bFdVSERDSG1xM0FtbXFvN1gwZElWbGkzUTg5Qi9uSnVVKytWb3U4dnZ4bTI0bS9jM1k5UHNPWW1OL0Qyc2xpd2hLanhLcS8xUjRGK2V1cmovM1ovTFlESHdFZ09ucTZIRGllSlNnVy95bWNHYU50dlB6MmtTU1VHQ1IwclRGZVdhRkFYQXhtSHNLcFdxbmVKVllyckpGRjc5N2lWendVeHVhQTVVejBiYUxURk9qYUlhNEZMNHJlbHl1VWMxb21EVW1oc1lkemdHbVQwUnlLNE5KWHQxRTVtZ09laWJUd2RiQ0lsRE5DSW5uRzJQWk5ZSUU0bktFd3l0aWVabHhZYnBBbVpyaHhUZ2ZTallnU3NoWE1BSmVFdnltMm1wTjNlTzlyL0xsOVpRRTJPS1lmeHM3c0UxK213aDFPaFJaeEF5VnhOZHV3NEIwZW1KT0dLV0RBVnlTdUZBcGUvZERlWlVKNjE4bHBISDBqam1vazJHTXRiN09wNlU5MnFDUll2Y0pkUUttdENDK2VkeUwvYzQ5QzVaWU92dWIyclYySGlxL0xNNlBtV2dkdUxHbVJJTmZWVHo4dVExcFJLNHptVkc2cmI1V0t4ZlM0bnAwSHJ5Qmg3V092YlF3d0lGcGs0Ty9HdjlDejhwb1dRRmZLVE04STVKWkdFdnJGdkdIOTA0RGJUcVI2UVJ5dGZNV2hwdk5abjlGVnNqNTQvSUdBYVdCVExkMDdjTExSNVpqam5LaFZEd0tTMnZMcXV1Q24vU21rdm1QNnJ2TGV4TytCSE5EV0NaNElsdXhuVjErc0lPN1VDcG0rcVNpakN4Y2RDYTFYRUZFR0pKbzI1QzhMTk5zU3R3OGg1RFo5bXY3aWNGT3ZvZGVMR0dPR095RGJNUDF5cFE4TWtqVXZGUktZV0NhandSeFZsaG13dHpLeDdxam1PdDBTMVJqaFJzUWp2R2pZa3dlQTIxS0Y3c3NtMUZnYktKeHJKV2lVczlqM20ySHcyd0d4OUMyVGNDbE8vUnZRTm9iTDVudSt0bFRvaUluaXh5WGdWMlMydDFtamRSSjhVNjVxMWNBbUFkblJZZVhkVHZJcXhESnhzMGczRTlXeGpMNmlkSytsMmQ4YzJodlpUSkxLTFpOYzVyNWZnUGZlbUxhUER5bkFGMTlHMnRPWFlOdWJPeFN6R0l2b0hQTHM3elFlamh1ZngvSDRKMVA0RVlLNE9HOHhQRkVrdkcvbEM0UHRBV1U2S2hRSlROaWI1ZTNHTktZTWY2d2orNGNITjJuQjRiYThENnlpamp3T1NTRWlGYlh6YmFGZzRxbDljYkdUMmFGOXN5Yjhaa1hpRkxYTzRqMjN4YVhnT0JyeFBxSDlsVGpldVpnNEppNGc0Vm1rTGZsdHgzK1Q1SCs1SlJXMmRSU1FuQm91M2ZibUFzU1JWN0lubUliTXN2SVlLczFTZUllOUNRZWVwdit2a0FTWUZvV2s5N29NRWxESzRLbUVteHpCRzBJanJFS2VzWVB6czROWHBqQnh0M08ra0F5Tlgvd2tzSlZSMlhTdHlYUTRDM0VQWnV0Z2FjL0NML1RNQWhhWDVnQXhTVmNYcm1mZXZvSFNLTVRKdE9mSHgrcHRXdmlKWjhXYUFjMFNTa29QdFRTMjlzTFJ0Z1U4RVYrcW5EWlFibk5iTmFrTjVRaG1nS0h1SitEbkwzK3RZbHhiTVo1OEpGVVZyVVVtRDFMc0lPV2lHOGwrVDM4L0xHb1ZsZXBCSUVTckpldjd0c1V2TWFTSWJnRWZPVlh3TEI5WjRQQXQyMzZwMDBaV0w4d2JScklJU3MraUFiSnF0a0NzMi95aWIxUnNTZy9sY1BTUnphdjlXMXJLeUgwbzVrdFdyYUtiaUxiU1NUZmc3TTRDb0xDRGszejBXc1U2MkhUd2NHOFdqTXk5RWUrZEJiR1FkRXJ1WTlCZkN1Tm9kM3JWUm93bXZubDlhazQxTlMvVGhLRk44UEpSSzNWTUlrK05HZlBLazRnaDBvc0xNb3pPVlhNeEM1R0NLdXRBWHBobms4SnVpWjdDUDBBSHpDTjBtUlNMeVdLMkQvcXBWb01sUU1qSFZOWHR2NTRjZEpKQzA4Si9JemRwcUVob2ZXaE56U3hIQWdLOWpyYm5Bby85d3g4QUhzRmMwWk1YL1lET3RCamRDV0VmYWc5ZWZyVDZtd2xFckw4TjhuVmNuclJMWjB3SlVvbEtzWmhIR1ZlZ1VBa29DUTNvQ2RuMCtYSGRSK1FvSURNL1hmdGIyRDJsTm9nTFJkb0lHUUkyMk5CcVhxR2o0bm1heGU2Q2lrWmlwVWlCODNNMFhJaFFhVm9PeFhoRTdwS3Y1b0VtQTJYY3g5NFlKYnFMSG1Wc3BjRjRQQW54cEJsZTBKV3N4OVViUUp3NFRWb0pwdWtkL1RwdlM4MnVHWEFOWUJKc3BRL2FPMjNCc24yaktFMmU0N3kyT0I5ZG9QeVlWWndnaVZTdmZKMm42Zmw0RlpveGpzQTRlb1pyRGdQb2FQSUdwb0lJWnBtcnFkS3BONUVKZFhWeUYvTjhkZitKTkJrdGdNSUthRXdnN0xhRlJkMHdJbGV6VE9lRTUyclFRQ01jTlh0NTZtNUxYeDVJUWZqa0MrMVFuNmdmOUVqbW9MUEtCQWdsQkFLKzNwbmxTMnRQbnBJOGpSL2hxNm8rM01vcjhDaXlaWGJ0c05kaGVpZkR4L3JuS0dpb0JZRmdZbXFnRWNIRmZyTXR4elN3Z2VFRFozd0VuMHFEMnF4R0RXK3BLbEZnV3IrMVpoT2s5c1VxTDBHWGVMeXI1anpjL2ZEVlZmVnVGUkYzS2pycjdLUGJGMTRYNU4zWU5XZHRVWXE5eE9CcFhhemlSNnZrZGZoSFZ5SWdPaXg5QWpnTW1GN2V3RkJHZmhjMzhsVDBrZGpVcUsyQm5qdERqZUNheXl0bFdTVXFFTWVZTUl3Mk5xM0FKbENEVUZDNmdVSktsN045MGpqQ2FiQnp4dGdxMzZnT0hUemVmek10eHpHckRXV05sS2Jvc1R5UHcxK2pmUFQxTndPUSs0bjA1K3lmdUU2OU8vRWJmNXkvVEFBbFNPSGZmYXpUeTZteFJ5K2RJZHRxc1ZJa3ZWV1poYkRzSnlpbjEwZzN0bWlKaDRqMUlaaElUWlNRQk0zQmF0YmJuMGR5SDA1YlpOdnJxQVAxNEFpTndSZ3VjbzZKbmpqY1l3OWxZc1NaS3dEcVVzOWxPRFlvNC9TZ2FzYUNEVmVqYm1aK3UxNGVEZ05pb1BwaXg2Qkt4NC91eG5yOVJkdnBNQTdZUDdpOHZxVzhNaDFEdXJtN1hMdjJtNnRTY2hONXZZOHdsNDVNUms1NnE2Qk1hdjQ1d05EWlMvMi9rRFVpWVkya0Q4b2g3eVpVU2tobTY0ODZoYWJXUXVPWC9ZNVVxaXRQckt4RDJDMm53WnlCY2ZsS25aNkxOL210RUprUjRpSHppQ1JtekJieTFva2ZmNDdOZk9yR21pbG9xQzVzRmRlQnRMaGJqOHBIT1k1MUtrTlFvY0JjcElHR2NERVFMOUtxbERrOHlPVkVIUUdWb2E4K2xYMTJQTjk0R0gyRnRBMVBFZFB3SFVGZ3U4a1U3S2lCcEtCdUFlYUJPN2lWSHFBckEweXEwaDZ6MU5MK24vdmVzVW85U3V2TmorcmoyaVJ3TFdUV2NBaE1YZFBSU0htUnA1Zmk1VXlnelpvMkFCTjdYQ3JGWVJieXllK2FpbWJXcmJ3YSszeENiUEZMNmZFS1dGbHV4VTlzOUE0eS9ZcVBnL1JuMFlKQU9PQXlkSDhoRDI0aWxkLzR2c28wVzFINng3U0l4YUNBUUZVRVVmSWdTRGpvK0lVdkNVcWRvSlU5eFhJdG9TS0pxanJ1WWJ6L0hRc1BjdVRpVk9uNjFsNWhDbjBxTUVuSjhVSG5JSFNyT0txY1d2Nzh1S2t3TjN4S25qL3ovUUlJMmRVdlMxY3NKQjVXMnlsRnh3cTRoa0Q2eVAraGJVckJrSTlXekdBVUFEMVdKWkZtbWZwK0RIUU5QZU56VEdmWC9IYnBrTHVZRG1QS2FsTUZ2eFFMeUZTK29oalh5ZmFkbklzbm5ZNS95NzJkQUZHa0hvYnFjU0ZxcDJGRDZibVFOSEN2dUNrZXJLSUY3VFJnUi9pb0VJUTczRDB0azJpOXB4M0djMEVCb0dxamRPbXN4cFpSNXdMSnZvU1RSTzUzUnB6NEdaVGREbGRoSTFlZWpRTStlQzlYQnBkS1JHZ2tCMElja1VDcDhVYTFqK1ZGV0VEMW1IUkdnUjIrcVRmWnF4b3g1bm5ncE1mMVJMSTBIWFpRRXJkZEhPRFk1bS9RQ3VCT0ttU3Yza05CZWRRYURXMWRMVFZVVnNweHV0NXJhdzRXaXh6WS9VMFZwVUY1Q0UzblVVbmI1d1VqRUNqNTdQajIzY21GdUVBaHZYQXhHQjVRc0ZhWEhzQStROTFSNlpzRUZVVlJpdWh5YlVjNWlJcHp5UHVCZ0U3WExtUGdkbzBYc3BTQ2FJLzlJV1VnUzMvbml2MjZDYlJ5UWw2RExQOTM1QjZrblh5dFI0bk92cTVjTnM1bFdJMXJib29SVC9TWTZKK3ZWeUlDRS9QWUlmdVZqamFrSnk4ZFZXUHhXUEtRZGJTS1pxTmtjMUhqcE1DL2xYMXNWNlZWMDE1SGk0S1hLMWJ4Z2VaQ3daSkpFLzM2cFo0WVgvRWxwVTNjU1E0a1QxTGlDSjNvRUpJY1VyaXl2YUJpdE52a1hpUTdLNWxpeDdnL0dITCtTNzRIOEhwbVZVeWJVcElPbit2amdIWG9Eemhtckw4Z0JLZ3Z4c05pVjE3aUtpdzZTUSt4aWRpZlRaMDJYK2toaVZhMGd1RVVYa0pFTDU0QW1FYVhXcTI4amFIeC9taWVzNXR0UFB3YllDeHRRdjNpOTY3cjNiT2dUOUFEUDUxTTlMc2NMQS9NZGd0SW40TzZtODl5Ri9pSGJvLzFKMlBHZDdiRVVZZ0hhSk9EcEpLYjlYWEE4bXJKeFRhZ0tIR1hzU0FxMlloYlV2QmpGdmcvcGhHR1JuRVllTlA4V2RCdzU2MDRvaXVnYk5tVGllYWhVYkV6NUVUcHFLUk1QVW5iTmYwOVA4b2h6dFBSRnkzZllpUHBob0IvYmdsRk5oZmNwV09ocUl3Nm1BcjRyVU1IL0FyRFRIL3FleHpqQVJ4dDdveHY4ak42bHM4NEdha1lVMjhnSVBjWjZaRVNFWFQwQUNWckVSb1YwT00vbU1SU3NnRGpwL1BTb2ptM1U0bXE5d0pJVWlPYnRhcUZGaUJHbm1GQXJnRVhvajVnUmZaVG91M0dJMUlpU1B1SldYeHhnVnBXMkw1ODZwejl5aC85UnhlTWJKVkc4cW1CMWlkSXFYRnVKdHhMMHBwcVNDKzYxVXZKNjRpeHFLN29BYm1DTndubWZVVUxFNDV6Z2VvbWQ5RU5jVTZRUTBDRU1OQldMQ1U5cW16NmpsRCtydzQwRVVZczVqUENoMW9icllZdTVCTW1ydktYclU4VjgrcDkrdEo2VGtuTjdFcVRhMjdrckY5VS9jTjNPSzFYTmY1eUxQblF1OUFZQlJITUplWnRhV0xzajdCYzdTR0xDcnJ2L2Q1ZEluUkZpWXE4RnB3MHh5dG9mU1M3SW1KTVBFOFh6MWVHY2pONVBtU2EwUlcvOTZNWnluUjh2WG5rN0dubTJlSWVYYWlEWS9NOEFiZWlZUnZxY1FyN3dYQStIbDNtMXBhbjFla3JmNFJ4WE5oUU15OUZrWVVpY3FSRUl0eW53bkU1ak8xMXBxMll6TkZFalNpOVlycCttRFREejA1ZnBLZXg1dEMrV3g1L21xdzFqcWs5TFhsMS9maEpyQjJhSmtIc09iRGptcEQ3d3ZLd2ZieWxkRWtvRlpUQUdQRVl2Y3pjb0l1aTZuU3NNVW5scDRwSWpPYXViaCsyMm9GQk43RkxNb2N2OEtBZjZlVUxGelBKc0xVMHpCUEVTemJDNmY4U1Q2cFMzSmo0SExsTHo5OEJnTVhUelRjejBKSjJOZmI5UXVna2pLRUR0ODF0RnZqRVhRQnR6VWt4bmZUeVE0c0o4Y3RqQzhTcnZDNDNURDl5Tms4U3hOSlJDeHpUNDdBTkxJZWkrVFFVVFJybXZocjdWR3g5bXJvMWVCUnBDbXd5cWNOTG93Z2NBVStFMUdpTklpNE1YcENkSlJGQnV5cFhXRlh1OEZTYUZSLzVtYURUTlJwSWZVcjlQcjFhTzhOZFlud3VLOU9sZVBYRTNkcW8yWVdKWmtBZkcrM21aMFRYaUhUMzBXcGpWc1hGWWJhSm0rZ2V5ZnNhVWNsOWdLVVRlRGhnby9mVDNObXUyK0VsVEVrelUyaGhvU2RnN0EyaUM1UWN6ZkROM1NCK1Uza002Y2YxeEZqeDlsSnhETitwN1haNFZ5K2djRGV6czNXWnYrZzJVa1ZjbTMxd0ovdjhpYnNRRkVCNDR5M1NFVzVoaThIa2tlU2Y3akZmUG5zdnlubXV1WktDbzRBZGZQOGZHZ0RxU0hsWityR09sdXNEcDlTS1JhemdGQmJxOHgwL2hLQWozZ2ZMTmZEOE11Y2lmZjNpNVE3UVcwYmtKNG1LRHUyN0tCNWJDRWdYSVVpU09rR05lT0k1aHF5MDFJRUxOUjA4NHAwSkV4UjgxSTkybDNnY243VUZiN3M4bWF4ckFuaDhWWnI1RjltVnhSTm1zNER0MStJaS8rMlEwMDFoeHBHR1hrOXJnM2lSaEs1N2UveUx1cVpyNEZtZTFEaDJaUjRxZ3RVMklyTzlKN0J4c2F0czlBT0xkS21uQXMwWnJSbGgvVFlaK3FyS2tCV01ia2VDZUp4N1JqR1loYWY1WVdiS0taVGJwK09BbVM3b2FEWlNuYVFSTmd0bkgvQTFtcVo4SDBWUHc0aURna3RxWjRrMlBDWS9pMmNONkRINmhXSHVrWFdIL0tZd3QxVXYwdFVPbVhQZGdodUJyM3FpWDZXUGwvRmRXdTNqdm9DSTR4WGNDTUVRNkYxbkh5bXlVSE5JSzJ1akNHdDhlYUJQd0lCNEtqZjlUOWF1ZHdxQ2VBalpndjdhQVBOTTZpUW1RVU85WDBTc2E4L011VTZVN08va0pxTlZMSmUzY0Z2anpRSVBUY0VTTWpYOFNyeUdPQzJnL1BGbTJ6clBLMzJHTXBZaTZLVmJXQkF2Vk00RlpEbFB4OENON0lsTk9KTVFHR3V2VFhGUVkxc2dkdUMveE9YR3dLWkUwNmxqR0ZMbS9zbnR4UmxrVlNpUVpwcnVkdlMxalZVeWpXTkNTalloYVFVSjEyTm1IWWVLSHJTWXlsekpadEFyZTNOam1kOVJsRjgxeGErc2VRLzhoMkxLNFFPODFEQXlVQ3I3cGRQeFFWWDdYbnU1S1VOQXJwVWxtd2J6QU9GSS9od2tKb3BYMDgrWGVOcG16eVNORE1VWjA0QkVBSSttYmFjZFFhbWR0RXJTZFJnaGwrUzNSNGgrSzU5T3Z6OXVMNlljRlBXL3hlLzlIZkxPZmc5Zk96a3VZVDRITGVHQi9mdzd4dVJCZVg0djMyT1dlV1ZKSjhTdUNFTHJhcC9ma3lkTWNLUHhqcExKcG1uNFlzNlYrN0owUlUzd3FHSVhSNU1McGxCUE9mMXQ2NHdUeUVES0Z2VEl1dk42ZThHc3VJcG5RaHowUmFKcFdaaTgycmNvRGNHdU5RWXc3dlRySkdiK0dGK0wrZ2IvcFhOTGh1YkZGR2NJV2dHUWJobENwTGsxVU9kYU1GZnJ2ZVZjbjJaMXg0Tk5YN1dSZFhTZ2xsMzN0ekdRUm8rREFldEV0aHZ6L1IwbnFOcjJ4Mjh4d2tsRTNXYlpBZk9oUktwVHJCeXE2SDBCc0phcGtIZytMdFN1bkVuNlBaajRicnVvYVB5bUlYVTBKSmpVenVHNWRsRlQxV0pFOUNpQlI4QzlpYjVYbHhrTGtERWd0WFREL1lvcnE4aUtqRUk4WkNDVXo4MVF4N3FaSktKU2swcFhCVjROeGdDZDY0a2EyVEFJazFTMzhuWll5bnFsRVpVeFQrNCtaUjlFQ3RMc0RkTFVHVjdrdHR5cndURkE2MFZudm5idDBYWE9kK2F6Q051VTZtU1VBdStWMWI3ZGF6MDJkQTdJd3dqZVJ3TSt6eURYK2FUT093M0hlWSs1NWFKR3RZaUNPUUNUTHlkcWVTSHp0aDFucjNqN244L2pFbCtQeG1GcVA5bGpNWUp6QTZPTGtkZ1BvKzJwUk9WKzlHVEhqTkgwSEJud0M2VFkvZWtkbGs3cFNteUZTVEI1ZmZnV2hjWWNtVVlPQWhqVWgwUmUrbG0vSEszT0xiNCtPYnh3cXhXSEFMSkVKRGdaVDM3NElkenU5bHBwdXB1djBOWkc3cHNLT0U5ekZHU1VxTWdmN0JyckZ5b1AyRExlZG9CRjhtWlpmRStwRHNDdHRoR2wvdzdseVljUnVndVJ4RTVoZUNjOVdPMlBXVkczc0YwcjluVmtDRVQycDZYQzQybEsrVldqOTdkNXdjYVJBZ1cyNlhTRnByZ2NNUTUyVVkrR2w5UTJXTXo0Zzg5YWVKdGo2TnIrOCt6ajMwUEhwYkZYZDZRWmh4UnE5YlJZV3ZySUEyMGsxL1k0cisxSWNnVUl6UHFNcHgvUC9BSUprNWhwcEN1UnB2cHplTEY0R1dFSUIvMHd0WGNpSU04c1FLamZ6TDRHcWh5RXZjTXVid3FFZzRnRURIblp4NlNVVkt1YUhGUThtK3k4YWlxenVjZ3BNZGFzeGhYUGdjSHZaRWhDRHUyUllXZUI0NHhEcjl0TlVCMjdybHRpRHdjUnZ6ZERhZWZwaDJpMnowMWIzbVprUENBRlRWVk5GdkFUSVFualZpR0YzeFVETGZFclVSRVh2UkYwU2hrRllMVDVYanJBditINDNVRkg5U1dCUDZaVEt1UVUzRWdjVXN0VGE5elBWUlVyeWIveGtnYlhOL21XS0ZoMlNqL3V1RDRIcC93cHFyNVNCVnRBenQvY21pWEQwd2VjcCtUaFJENkR4R1VoeXp1cGM5TDQ3cSsxVFhiNG9Rb1lwb0JNRTR2OWlmTVlwc3JXaTFCdVRGVGtDamRUWFZ5U0U0SVZ2N3FkRjI1MkFTZGcrS0hyb2pqWENwRzJ3NmxPSWRYWlRLL05PdHBZc0JkRW9FdHAveWxURGI4MFBPT2xhOUhPbWQvdEkyaW54UGRPUDU5OFZNTjZSbzIrOStQNTI3NjhPU1FhSlJqa1FtVlNZVExNTWV2WEI2TGpLd3BOcWFOT1VHLzIxZjN3cXpqNW1HNzBJajBkNUg5TzUxWExBVmdxRDhsQnVwbkV0ZDZZREpTK1FxUHBwL3NWb0lZSm9IdmlGd01LSHpLNUxZWUNjK1V3RitjRTdFalFROE1LbXE2RFVkeXRrVnFmOXZxbU9PRStMb3RKRGNmR1JJYXh1ZmVSeUpvYzVWMTI3RWZpZTNpem4ydlN1eFF6OWlpVXRFczBsRHRGRVd5ZDBmbHNsSEkrWjQwOEpWOUtuUWZYNTY1eFVxRitNdHpLb3dqc1NwaFlOYmFWVENJYWhweVN5SW1MdzVudzN0NVBCOFdTZXNKVmZKVW5nRnVQdytGMloxMm94L2NYUmNLQUQvRFg5QVdvR2lNL3FrbUo3OUhKNHVDTWJ1dEN1bU5XMmVlYzRpcU9DUEVOOXpIOElvKzZLeUQ1SkFrR2JTYldaRGR2TEk3NWZ3RnlCZUNXb2sxVnVnUlNsdHErcnl0ZXQveHI1azJjTnlZcHhhTVpYL000c3VtRFA0bUdMUVJCMGhlQTF1Q2dFWjJtb2tXSmpnY1p4SHdrNmVWZlQ4QzFVN0l2RUJLRWoxVjAwQnBBa2N4MlgvQ3MvZTdUTEFQeUdJRk5vV3lvVXo5Yis3ZTZZUzM1YmZtRm9TOXBBNDRCVzJJeCtMT2kyTzA5ZHVDOVpmSVl2Zkg5UUgzU2xTanZYcFlKWWRzRzJ4ekp5WkZ1TGNHNWNodk1udGNSUlhEV3lHNlN3QmpzVkdMVFR2QTcrK216T3RmNnlXY3pkT2I5cDRQUWF6YVo2SGNQbG5JMm9sczcrMTcvbTB3ZDFyUDVFMFduOEhtNW5mb3kwdXJNei8zaDRBRFdxTk9hN0YxNXVOZVhUSmdiaXVXbk5YVHg0YnkxRE1PZkhOZEtRNHhubHUwYkIrM0FINis0dmQ3dmhyVWU3WnJOSXAzcUM1TDhOdkMvSGlrdWJ0R2s5N3JuZVBDc0Fvd3dJdjVhK0N6c1NZRWpqdTdMSEFVNUp6U1dQQUJWb2JwOUtOa2NYdytxT3ZENzd0YjUvcTZNdHlLYXVtYVpVcm5paGh2SHh5STZOU2dqTHBpQXM1MEZDUHJvVW9yVWdRaUs0SFNDb0pxYUFsMXg2QVE0TWFSSGhVNzJzRFN4djNhRGwwZy9NSElIM3Ixc0cvVU1aMkFmb1FWQTRYdWxoOTZxcGxFdk03UnlzdDEwVVJ3YWdEcytsZ0xmTUJ3TDBLUjNkSlRzQ0RCSXY5UzlaNEdNa2g2OG9SbGovYmgvSSt5RGx5ZXlCdVhtbXNreG9CNzl2S2pPU085MFVKTkV1ZzVyVWlpSldvbHVMeHVKM0piT2MrWEZYeEJ5WGx6KzFxWHZFZEl6c0V6QVl1RVErbDFCQ0FmY0tOZWt3dTNkVys1YzJWRDRhT3p4eHRCQ3dPTUtQZnIyT2lXYTJXd0VXMXJBRXgzaFJtbHhpSndwTlJ2U0JZTHdIYlZkNWpYeEppbk1PT204L0ZNQmdrUVV0NFNTaGV2a0JXTCtMVFVmZERtZGw1dlpxcE4xcVZ3TlRaSjdWbWVwRitKREVSNHlXYk5jT3gyaFVpMVUzaUhTa05yZ1psZzJIaDhHcTZiL1RiRkIrSllZQTl3N3Fta0pYeHdTcVdya21TYkcvYnJNRmJxU1k2V2xub2JnanpWSGZ2RkN5NHJOUTllVzJmSDh4UDhmYVRsZENjSXhEYnUvMmFMV0R2bnkyYjdNcHNYbWh0SGdGcUIxUXBOM3JhRGovVlhTbkMyZWE3bHlIc1dKVzF2WmxScll0THl3QWIyQjYyRHF6djU5SG9hMlZJZzErOEZqbFdObHFqcFMvSWdwVXptNktOcUgyb1l1SGkvZDFBcTd3eXBNdU54cGdLZ2g5WnZNNFR0aWdtWkt2aVlseW4rWVhtNVBjYURkdVJPU1pzL0h6VDlKSE5icmxQRU1YZ3paalBlSHpVUEg0YnBvTkMyMjNsWW1oRysyckFaYnJXWkJ1SW1HeW5xeC9lZDlPdnNHU1FnTU9idlBnSDJ4VWdVeUw2b1VkTHVJUnVVcFBxUUkzVjlSNXJmVzR1RlJWeDd6Zmtzb2ZKMU4rT3ZFQUg1dlRjaERqQTlOa3AvVDAvZTlwUDJCYVBjK2p2amZUdzdrVU5TbE1RdklZMG9BMDVlOU9WdUk0cnR1ZElVY1NKWFhwQkNmQ2pDeVpIRHdYMm9McWFZQzd4d0EzOXI4bUYxOXZFcHd4WmxNUUdqS0lDbzM2ODNxVkhHTW8rRUE2ZndYcGcxU1doQ2xjdW5qMjJCd1NHdnBBV2pPZFordktqSEkvdEpBUE9QN3J2Z3I0Wk4vWlg1WHR2NUJPc2hWbDRBUHNENTNxMWQwbExtWWl6cXlxMkpyQXBpZEg4enk0MFdrYXBSdnY0TStuRlNIUUxMaWpHVVNQNkRTRnZ5YlJLS2Q4WjFqMCt0eGRmY0NsZGRqTzcrem5LS0VVZkd2UW8wVDJOeHR6OVNyZXQvMmNmS1BlMXlUY2xYWCtUeUlHZklEYm5GYkRlbjM0Q2szRldORTQ3dm5OWUVwMDBWYkNhQUUrYnpINlI1YkZtR0JXSTR0bTBCUDBEK3MrMnB2REprbmRIa2Z3UGhZc0RSOVhSZmNJbWExM3B1eEhUMWFhWlNEdEFIWlFCcDJsNDZGK05TWXZHeFJhQjU1VUFYdlZqc1JZUkpuSEJEaXZsblliYzBnWVdEd1FOcG1oTmI5MlRIdVQzUnloSFR2a255d0N1WStTUGIyNTNvRmRYL1RYNldzMzJSSzhFaVZ1YXI5ZmdJQ0FnSUNBZ0lEemZiOVlKL0Q2TkRGOGhQOC83a3UrMzdITDg2M2Z0K3pKL2I5V0JyNmk3OXYxMGY3ZnNKdjIzRHovQjlWcmZiOUlYajg1ZSt6N1hxKzM3RzM4N0x2dCt6a3Z0K3RoMGZJdy9oOWNSZmI5aUgrMjcrSDl2MDhYN2Zmd3lmQ24rejdGajl2MWQzNTFYKzM2MDYrbjlORnI1MVg3ZnFNYjZ2cXBQMVdPeURZejlFbzFKRElOQ0pVOXdLS3FGUlZxQlN4NWVkdEJoYzhMZTV3ajNhOSsvR2xOR3VIdWFFVGkyeEh5MHdmdUF4NVE5N2tBdHFKRU5Dd0ZQb3ZLWTZWUS9ibnN2RjFvdzVsRUg0QWlSeTc4bGsvdmJGWFRjT1J4WVVHbXBIejhnbDR6OTNGTXdLaEx3UFZ3WndhOFpyVlU5dk5WQ0lEcjRRSDB2YjZNamRvb0IrWUY1djBkOE5qbWtCaU1rV0dZR3ZSaUZtRGZEeENNOWV0NURjeWgxWnM2V0NjNDNRRUxMeFNxRExRUGgzcHUrQWxYOUFlYnVDbjZld3BBOGJma2Npek53d3Y4Ui9tTGFrbUwyd3JVelRBbU9aQ242TU4ySDc5MnM5eDlXMk1yUUlkSFJOUnpYVk5yTHl5bmtDZXZVZkVuckI2S1RZd0hCa003U2JUMmREdGY3K3NhVjlSMkh3OHZuUDhzL3RvSkJFaEVmYkFkSzVBTWJMUnB6NzM1bzhDQVpaUzROU3h0b09zWUZFQnFoZ2RpTTVmdk9JTTdQMTQ0bEpxRGtQd0RxYWlBUmlITmJVR3J5K21qVi9mYnZCU05CL2RscUpGbXUrRDltR2Y3L3Z2dFpmam5UaDkwY0I5MzhKelhNcjMyS0RhS29XRjZacUl1RzBPVzBkcy9xZDhKWDh0SDlCQ3VPa1BPN0RwRDFlU1cxaFovVmlITjNQQ3pJMGROTGRLVzc3ckl5c1BsK08xNWl6V0JIRXlaL2t5d2pVWUV3WVhnc2dDMDVCNTQ2MHpLUVh2dUZ1aExzSVd6Rmd5bldiVHE5VWJPWWU3QjlxVy9IVzYyZGc4RFZ1ODRsaFZ1c25SVXlWMVlsRGU4SVJIZGxSenBTdGRMN0tZdjV5dk8zamNMdEhhK0NzSDJHUkg3Mk9EaEgzbHA1Qm5qaHFYbk5jb09ZU2Z3N3Bsa0lMT2dmeHYwN3RuOVEzdGVGWURYb3crRUZvd3NqbnBGYmdSSnpFQmdnVlF6dlA3R2F1QUxBcVBSOGdjKzhVYXJYejMyL2t0YllGbjlWUEJhenlvaUpjeHQ2NEZUbTUwL3N3NkZ2OXJqQkYvVFdNcDUxaEkvL2tUbWJmRndLcVZHV1hENzdtbFVSWU9TN1N6R2MxQTB0OTJzc1VhRGptdThlQVRXZEhPcCs1Y2tmWXdWOWJEV01UVjlnWHQvN2d6THlqRDkrdS9HUElIWVdhVVBSRlBYc1p2UW41WmJjd2cwbEdwVE5YS0pKMkRLcGJneWFsZWRGUXhxRHVtbml2eUw5akgvRGlBZnpZRXdqVThyN1JkeDJleEdVYnllZ2JPaVg4T2diUUlUV2FCbTNNbjcwQTVzSy9wNzZ0MEF4bDJwb1A2dDY5a3htSkRmb2Y4azM3ZnJUbTRoS1JwZ1NCaGx2TkRLTVlOWmFUZzdmOGlKYnVxaWNQcHRMaWRGQUo3cC9qTm5abVBsL3JLUU0wL2hFTTFrbTFQWVRvWUtyc3Q0OVNDYWc3K1dzckMwd1I1TEg0WEk0TVh1YUw2cXBuRUNuQU83MTBNUzVoWEdkeG4rNDB4VmV4MUVhOVNNc3NONXFIY240MG54aDdoaTJHbFYrVG82dUdKaUkyTnh6R1Q3VWpUY3JuWllxOVNjS1ZiNWcreEdJazhNU0daSGZSeTQvVlowZGI1YXZPaGROM2F4dnNyNXJmZ0U1TnJDVVE4WUFqUDJGYU92SFFTQmZIaVN4M29wMWZPT1g4UEpjSDlaZFFoT3BjeFF2V2ZzV3V0SThrTEl3RWx0UzViaDNJN1Y0alBJYVM5Uk5qb0o4bVBGWWtpdGIzMEhYeGN2OUVjZ0NaVXBkdXdORzFzOW1qbnJyL3F1UHp2ZGxYWkZTZHJRdmQ3SFZtTG5VbUVsR0RrVk1FWjBBSmwxZlR3ZENqaTIyUW16Y0l4T3AzQzhBaVhOOTdkR2JzclBYWWY0cW1BUU9melJ3dllqT1lKN0FGcmIxY2FiNE16cEd6VlIvUzgvM3J3TkRjZFZrUWszcDJGWEpDWUZEcEJxUXBoVGJ3TWt0NzRuUkxoL2hUSHJuOFZxN3lRUEdLYlZoOEROZi9xdjRpQ29yenNXS2JQT2d4bTFpRDIvTFlvTVl5dDdIc3RSREwvOWlpT1FzbjJrSkFvbU9OWXhIYjZ3VkF6N09CVmw2UzRZUUZTVC9rT24zcnl1QUdkT2lJakhoS2ExMkR4YlRHQ3I4TVdaRW5MdklyVndOeFkzbC9ybFJGam4vblVPdkoyRU5sTFprYzU1OHVEM2gvYXc2L2x4YnYxTUhkOEVLQ0pZS0J4Q2R5TTBoSks4dnF6SC9OdlFKMnVkem5NSW1saWNILzZFb01NeklxTGNZMUZuSm9CY3hKc0d5d3JMeW1BblN4OGI3UEVzYVVBdXdXa0hsdVV1aTdVRFIwK05RMnk1NGdoS1lYRHA1TXFYQ1BYUGVLblRqK2NjMldiNW1zdVM5RHdkOTJ4b3F5bi9KYW02NEsrT3NXY2RPbU1TWWhNSjNXUlpSdnFtcFFHcFhVMy9NbVg5cFcxcmVzY1lObFJuTGNsaTZWNjlXeUZKVy83Zkh0SU9sYmZGY3BHMW5sUE5kZkdYZnkrSS9mNFppSHBmOGFBdXdKbXVYVXdFRDR6ZXZKMlNZVitucnZpS3RDTE44MzY3cEFQd093VkE2MmFsVjdHWDFjNFI0WHBjbUNydlhlM3N2VGg5L0FNcVdwUGdpMVpUbzlyZ2RmYnFOeVZkWWs0UzUraVNYbkxPZjNjUGFwVTkrNHBQdjBrekIrcHdDTkpKekErMUorZDd3NWt2d2szY3dSbHh1YXlpK3oyWlF5QUt3RUZ2T3prZllreVo1OXFOTFdyMEw5RmZoVmxQNnFDOGM5WHY5OU14N0k4SDB0Mkh5TDJJdU5KYUNaaWQvUk0vbmZpVGhpaCs0ZnFQbnBXcElDYk5VK2dMa1Q0R1lFK3oyc2hGMFBQa2JuOW1RTndqNk1TTkhkcEkyWkhOOTNhcE9JdEZuMTVYdzk0ZlMzeGpkNTY0bFZvZkpIOFJKMzVjOW5RK01aS3Y2K2VSR2pvUmo2NGc1TVRrUEpoNHFPL2RMZjFIdzVSYmRIQUh6MU9TQXRialdaOHJYaXdmT1UxU1c0RnROTHlyVjd4N29tZytwd3R6b2d6S0hnZFplTVI1anpHcTEvQ3JTQ3hDVFJaa1F5TU5MeHAwU0VSdnBCd2FUbldVTEJPeVltSW85dFZKNG5KUlFFUkFPelNGMTdGWTBHUVVLVDZacllvNFJSdzhqYk9KWklpV3AyZVl0VGxoRjZaczU0WTVONmhMM05FbmNTTFJNcTlOa2lBK1pQRHJqL05qL25ESVZLNm9kNzVwYThNTjYyNFl3UzI2Zjk3NHhBUU1BWWpTbkowUFNGMDJTMmpyU1dlYzAyWUN4aGJkV0tVRkp5b3Jzd1VlT2lRc0MxQUpqQ240SHVnQUYxbDhEQ0VHWDE4OHo4a2JGTWYvZ3B0RVo1TTRnbkZrR2xoTkhUQ0JhNGlSQlZ0WjhQek4veGVEcEtBSHcyWXFGaEdSM3IvczdocGwxaHllSnlYQkpmb0lTWE1JNGpFNVFNcE5xR3pQZ3dBaHcyMFJwSHk4OUxtZE9SODlXbGNQRmRPZEwreFgwc0NhS3duanBUREJWZTdzOXd0cHRJNStaTjlRVHdaNW9zVjhmdHArMURMR0dQK0dYT2dpMkRUUFdCSVpLbC9mNi9FUEprZVNyOTdyNUUyeEpFeXNGNUhtWjJlMGIxRXRUM1hTWVlxZ29LNVhFY1F2OHlvajBrZzZOckRxMWt2ZHBOL05MQS9WVGdadjB1L2dSbmJLcXA5dHZjcUJDcVJPYU5xMkxDaUIvS2ZLVVJ4ZEE2ZGdBU05ES3c5RTNUVnVIa1pvSjBCeXJVZk5TUXBnalpIcTFSU09jcHplWWlQTVFIbXd0MVJnaU50c2VncGJaUE5wb3FVWmxxdjZvQ2J5VE9VZEpqL21MYnNNZ0Y3Rysxbmsvdys1SzZ5c1c1VXBiWVd5UDEwZldRMkV5YklnUWZpTC8waTFhV2VBV2V3V3Y0VDhUYjNvN2N0MnFtRFFXVDZKVHF1MEVQOFNEcktFMXNEbXV2U2IvRDdUYW9LYXF6eVBLQ1o1bkVqNHN4Tlh0OUtKUnRHT1d6QXNkOWJMTUxRZWF2RTJ1UVk2eGpFQ3ppellzakdodndkMHBXelo2Q1dhYmxxT01VWUxKV2JHbkFrYXQ1dGZoaHYxR3JYQVZNSHROVzNaWjFRenQ0M1hXVG8zR2p6YTFFSXJZVVFNcDBSOWJzTUgwVjIrN2pYOEdjYlZUSXNZL0k4Tnd5NWhlZURLTnFaNTQvbkpDaDFwYkIvVUkvR01ycmVTS3pnUG15MnBsWkJTUjgrL24wOE0zK3AvdEp0eDBqUUVvU0xDanordTkyTGEvUDh4MW5ERGZpb2c2OFVqZnNQYXVOaGh1a0FGNTM5eE1WVk9IVDNMTEhWNUs0bzFySW5xMTM3c0tNN3ZDZ2NRdmY5bjNydVZPSm9NNjIwRUhNWkxEdUlKQ0RCc1IrYTZXd0NzVWN3MjJTdnlUMExWZlV6bmFLb0tIbmZXbTVjTjArUC9FY3JwYkZ2Z2NWb3RKQ1R4cDlsc0ovVkVUZFZOWFhYcHZuYTlraTJEUFNaTHVHN04zcE9uOTA4V1pKcWhTaGQzSS9NQUVTenF1YmJUZi9CTStCRjNNTjVzazM4UHVHSDF6SFdTbWkyZjNwOWNBY0w2cDRNK1NhYU5yeUpkdm9oWm9ZK2JpczdDbWJuYjV5aXIxR2JxRjBPelFaQ0NGYUIxdEtveHRDKzRxVTU2NFJ6YU84QTdIMVhuaGl5VUtwOGhUTUY2UlRpQ0diN0lUVTY3b2lCcDBJZGxJeVZQTi9heEV0VmV3dDZ0QTE0Q0tBejl4TVc2emZ6MTJvYXR4RWVPUGZRbitHZU9acGlrRHI0TVVKOHZUeDk5UC9nMHVibEp4aWZMZkM2NENmMCtOY3AzWmNlNTB5QzE3UG1jaG01c2dsNUFBb2lUZTJFeHppdE80cTZFQWEwWXpPUkxyaWZkQS9xMzNWVGp5WWkvVStXdFNDZGt3Ym1XR0NZMTA4TDhyQ1ZaVTlZTmdYbzN5MkxtL1VIbkZIVlI1QXVpQ1V2MVdWbmMyalNoNVpxV0hldlFwTGlBSXNqaTJwTVhmZnExWFZqWXNLY1VQUHFPRFk3YVJteHFuRkZWUjM5M1pvSi9jbmdYWm9oa1ZxZUhkRW5yN3F4THV2N3FGaU5aYXh3YjBzMkpXSlU2YXRzYlpRQmlrYUprS1pqSzR6Um9xUzY3dTE1Wnp1TEpNYmNOamZsNDIvdk4wVklQNlBQVUJzTzA2TlRKTVNPMzQ2MjN3M3ZHSlVONzluK2pRUTM0N3k3NVgvcXNpSWtWQnRVbEp4czF3RnprM0ZOMVdMaXlhUlplN0JrL0hValhpdHhPWGE4QzRjTUUzMlpNUk5XZEhrMFNmR0JXUElrZmlDS0lka2ZVRmJwemNrU2xSMUhtUUl2L0N5cFdBSEFjT3ppMWVCQXBvVGdGQ0pRZzAyZ2cwRlZScU9RekN5U3BxSmdLcEVBSHBOdnVEc2hGcVNWY3I0RkRzdjlyL3Zob2NIMExFbVlnSWlzYm4vT3NOZktGQUFDZ2NtYlRwZCtobDdFdlVta1VpSTBDcGRkY0xQZjlEdEl5ZE5CRjg2UlVILzBmSkJmMUE3UUhOVDJZUDI4dmtpckxDNi9oK0hlS1U5WXgxckU4WVhGRUYrbGFjbFFIVTBVUXR2d01XOVJEZUxkT1BaTVlmaDlPRHk0eG5DdkdicjY1bjN1VE1IeEZycThhSWNMeDNvdXl5aGwzTFpJSGRHNk8xRTR6amxra0FzT1NBKzdNUGhyN3ZVV1VhYkpLRlZqZXJZT05DUUREK1NWNjNOa1FUOWV4S1M2STdOWEFWYkVBSDNnUHRWTExFRFRPZHllNnRyekdBbFdIM05wRjZnTDRySm1sUWpmWmxXTGZLeThReURBRHBmOFppT1k5WjBnTDF4N1NZSDkxcUFPZ1ZuQysvT3YrMWNNQmF4dFRHbzFmVDFuVzJaYWdHdEJoTE9HVmlSMkJmdWw3cmJNNzdwNkE3MlZOZHBSeW1yYVA5aDJHUHhSRVlyTHVtcmVBeEo5QlVoMjNNcjNKMGFWQk9EZUpSY1UxYXQ4NldyS0RMeVFSWjdaZ3hMTDNwMW5zTE9vWXZDemRvQmhHbFJiWHdKUVZDUHlxTVhxK0hhOCtSVUw2WWJEdFVwQmJERHdVcUVZSTFrcy9kZFY5MTBBN29GRktKdXZZM0JLWEVBLzFRV2ljR0grQjJKZjhoS2NDTm5mVDJ6OExDZkgxRHZFZzdqNFlKV29LV00vakZqUHdWeDRUMHQzaEdPYXhBcXpLL2M0MlF2bURXVlVRTHA1WTBZY2drWWc1TFg1cDV4R1lkbGlXM21KL3UyUDVxbys4aTlpa0xMSmsycGdieFRMMEF1d25XRE1rKzZLWlowb0xXNlZzdld1RWlmYnJLaFcvRm5BRmlYSXl6djk2bkU5cXlxelZvUkl3SDgxREFEaG85MXNwRnVuQzFrMzludHdidTM3NkgxUzZWampXcEdid3RYMllFTkp6ZEJNRno1VXZEUGFsajBzZDhVMWxSNzRDL3VMeEdkY1F0NEs5RlQ1TGxnZ2ZuaVg2V0tnMG5QTER2UzhRMFdnTnRzRHZRdFMrS2lEMjI2UTg4TmZETHk1aHhNeDRwSWZWd252bjVoVjZDS1AzYkN6YXBRLzE1R0pPRXBCR3MvdWF0dzZXTDcyamJhaFQ4dFhocTJvK29yMWdTZnpFdlRyODIxaTBNdDBUYXBuRlpxM0l0YURTUUxEMC8yMlRkbVNUcm1QVkRRK3lyMnBLZkxLRFFZd2lidDE3eFBPZ29aR0V6N29jTTVZZGQ5Q0hwZ0h3SDM5UnQ4NnU1bm96OTEyWDdhaGt5VGM2bUVBVzIxUGVLcWtVNTlIVmVBMHNYM0ZFQmJoSnlJd0oySkpmUUs1aDQycFVuUzhNaVBFSk9yUUJLbnZ5OEhhRjRDaGpXOUlXRXpORDI4RHJEUmR2eHN4YmNUc1lCSnNVbXpmVmY2eC9uWWhIUGZiVlFJUi9ZcWFPSTVLaG1UM0cwUmFpSllxek8vOEs3S21MVVBlWFZJLytVUDdPUGVhNk9YajNNdXQvR1JreUZkM0Y5TzBBTDc3SHl5SWJpWW9nZENvd2lIdm1pYmRKWVhUZWFXZ0F0SDVZZ29wQzZHYklMTGovVE5UVnNDbjhvandoS0o0SnBGVDJyN0VNTmI1N1FReWhNS1VZK29Oa2Zuc0FxRURFN1NFdEsvcXljenZYK1p5aGtPelJ6ZUtXMHk1YVB6MDE2UjMwVTB1WXl3V292QkZ6SzE2Sk5NcU1HVzdEbXF6a0V2ME9hNS9wU3BJZzhRTUFYeDZscC9pd0Z2Mm9HVEUySmk4V2VEQTRLTzNvL0FOd0V4Nm04dG9lTGVONmFnSHEvZXV5a2tZeVI4b3UwclJXZjhpb00wZXU2MFUxcU02U2t3aFBUcll4VjNESisrWWY5TXIraDdaWmV1alRNWU1oYXl2bFNRSU9aMkJFU2JDTWtvMUM0a0FXZjdZRElRRzBvUE9MTXRjU1NsYkZLUlVQYzYva2t0ZjJheStyRGVkZE9ZbnBCanQrczBjMjlLNDZERXozVlFCRk1TektaaHBEalV4MTdZVFN0MExSNk1UcnlCUzkyMXVFc0hYeFc0YmYvVzhrQjZmUkYvcThTc2psZ2NLWE5tQzQyNHhnRjVPMUVxL0J6aG5EZFdHOTd6R0VRVDh0T3VoTHMrWEN0Q0lJV05Jd1VPeWtzdk4yOXRlaVpsVjVrZCtDR3BUTzFhM2FydHVCamluQWlEeFgxaVEwbDB0dE0vV2J1aFdHc2RrQ3FMZGxkamt6SVJVL3c2cndHdGNEblYwQy9DNTQvTFdyekYwQTNRTXFNYzBuR1kwVWQzQlA3REdRakY2T1hXeFZWREF5YU1HRFdrRTNNcXNZWHZZd1NHVDRWMmhXOHQ2aVR0UFU5OXlEdEdvOXVYd0dXVmpUazg3SkVuaDFDNGJkZ2JVTUxtd2VGQjJobGRvNTFFSU5zK3Nia25GTHFOMW9RcFJsSk52VlNJTzdIWm1GWEdXdVZTelpMQTNXUDIyWWhlVTNDMGlsaUozUE5oaWN6dndFTWNUKzRzUmhNQzc2c0VzL1RZSDVWcFVwRVVpUnZmWWZraWFaWGp0d2dYV3F6VDZtYnIxNFJ6UEd1RTdTc2svazJyTUNkaGozRGxBNDFaM2pCMFF0M1lyTlZJdWgwN2g0NHZvWDNUWG9Tb1NjWEZYTXhqRFZwMnFmZmxzR2Jib3Y2WXNldnZWY25BcnhYQTFqcHdMZzMxeGtXbmhMT0xKejlsR1M2WUpzaGx5SHhSOTNINlNWRDFiYng1TGlOZDVwMnppL2diWmN5bFhKcitOM1Y5UU8xU0krVjkvaFJHUWczZFl2a0ZCU1gzR1dha0YxTGViRzFvMXRra05nemhIQTU0SVNmWU9LeVhGTkFLcldxZXFEWjNSem91ZnJjK1FQbXh5NGwyMzBaemhoM3Vnd3dxVThueXowMlJVdW9wVjkzYzlxWXlIZU1DeGUyaWlVdWozaHUyd2I5cW9icnRkSUZzUm01aXBSc2RZS0d3d1htZUg3KzZPSEJ4V3FKVHFDR3lyOXQ4VWNURXNmOW5pdGs2eUtiY242aUpqWldyTnlzYktrRkFCM3FObWFiY0ZXb05sTEV3WUxFUm5Hd0oxMk1PaG5VbjVYTjlBODBEU2MzTlZNWjRKbkhFTkgyR0owZE1JVVpDQng3aGhLUjlUS1ljaDAvc1NPUGJsNHYyd1kxajJrUG1xOXRoMmVNNUxYZzVzaE0zWmkzQWJZY3UycHd4NHlwZ1daYyttNXgzNmlBUlhDcnczbWo3aHNMTDJub3ZjcWJZS1pjaG12S1dsd1dZN3JIMHUrWURMb2JPYkZFLzBqTGVXbythMitzTWVrNDFBcVZXT0I1MHhqelJsVG9SMFh0YnJMMHp1SHhYelNwc0FWb0tNeEpJVHM1MDY1Q3JJUERIeW4rRG5zM1NkN2tKUGRJL2dmV1NmMWFEZUVGUm1WUVhCRDNYQ3VFQ3Y0Ny9WQ3MzZUhxeE1ob3Q0QUhlTUpTTVFUOHNxRmprb3J3bEczY21aU1FVYnhCazJJUVFHWHpNSkxjNHMvRWJ5TlZLWFBCb2VEVERnbjFlVVVKVEE1T3E4K2NoZjBqZExuTHh4SGRtSTRJa3lQUDVwQ1UzN2htUk5reG0zNHJ0K1BZdExFMCtScHhiamxtM1FQQndNa1k4NHJzWVhWZGdISFR5QVh4cm1aWHhiN0JERXF3S1pCOVBLQld1MWlqZExDa3ZwNWozSHFOelRjMmd5Q01uV1ZSOUc1ZlNXNEJtdjNuSG1TYmdEZFgwS3Zlc0hIRlVveWJUTys5NTdOZEJwakJvem5DUUJKOUxLeFp0ak9rMUpJTGNtMkxXUE4vYlpqUzRCYjdpSVgveExHOWtIaWlpcEtQRWY0Nzd0YW1FdVVpblpNeGZGV013SjExeDBRMzBUUVcvZEZlU2Q4cmpmRWFQYytldTRZSFRwcUlwMmMzSG9HT29YT1NlYWQzc1c1K2oySXNjYXNhSXJhaGN5TjBHbjBDUzVHK1NsdjFKN1hpVkNmcE1jcUd1ZXExS252b0lSYWgzNlIxdmxpVDRDdjNNSDI3SXFqZi9MRDU5b1JBRGxGZ1dRM21tSlEzVGtvcktPaEROZUh3V0hiQTR4VkVaRThWT2p4OXI3YXJ0czluc3lIZEdlWTlQa3Z5bExHVjV2Y2Z4TEkyMDZnT1hCTGs5em9pUGRwQ0c5aHIrQ1NLeDl2ZE5FbGxIR05GNVRGUlZTL1JBQzIvMDVuaUdUM0FZN1JCRUw5Mzk1Y1lWaGtXckZyRVVwazRkdWNoanNjZE1KU2FvUjhvNmMxWHNUaVV0NGNodmRrdlYyWGlteTNlSzhQL0wyOFJycCs3NnphekdTQmRiZzRBUmlIQUpyVVpCNkNTWVJYQllOMVMvRTJneFVLSlJkSzJTTUE4N1VBc1FaSnEwd0VpRThzeGlnaWtzNSt3QjZLUlRBYnZjTktIQllCWSt3UTJmYkI5dmtsMXZYNHBEamFpRkVGQUlBSngreGsyNUx3N1I3cjNyWHJZR0lXZGluYitVSnNlMFZ2b3AxazJhd0NtbXFsa25RUWpUMUxmS0VsZURwenZsRDZteDFBaHp6NStMa1VHb3BBb2h1WTJOcUVTbitEdTFQWHJ4VDEvWXVMb2ZmN2hLdExuZmhEZ2hjQ0RhOGE3RktUUmhrVXhxZFBuS28vMXRzRm9EUWJIclJtMS9ya2d3cnk2ekFZaVdqZmdCRnRFaXVsL3hKbjA1SDBPWC9yN0NGTXZ0bFg0ZGYzdFNnM2xLazRlY09RVzI0RDRhVTRFa090NXBPTDFXaDcwQU5JZVA0ZnpvOWhFK0RkYVpYVG9MZEhQSVdCY1VNSVJOQU9HbzdIN2FEUzJGNjh2NVNBdk8vcEY1ZGNPdytoQTVzL3RJdS9IQm9Wb0JlWERzNGxjQ1VucVgrY2NlTGpOdUkrS3VXLzJXYUEyZ0pzZEtpRnNqVHN4K0kxMEE5ZFJ4ekwwaCtCSGFxY3lMZjdFUkdTNFJvTVM1cEJyeW15TEFZWXVkKytOUDAxTytHZUxFVXFiSmcvd25OYnVROEJrVERDc01tNllYVzluYnIzSEV3eHc3NjcvMXpTK3M2RUZVYVVnWGJwM2RTTVRpOTVqRS9GSDd3SC9RMXp3cTlyeWRMN21Ed01LUE9SSjF3c1Bwa09TK2FJWHB1OU1VcERsSUY5UmVxekRuazk3N05YUXphdUNKV05QQ3FtbXYzZTRlTnBjTlM0dmtOUkhoM2VGN3pReHlXRE1xM0JmaFo1WEVjeDMwRjVmKzFCKzh2SVN4MFkxWFRGSEZwbXFqYXo0dlgrTisrZHAzY3BWdkFQMi9RdHBtaWhHTGtWK1JaTXZQeFBkbktORkJqWHlxSnJtV0xyN1Qwd09kS1l3bEtTVTVlbUNRcWdTSmVRSW41UTh6T3hCWFJhanhYZTdlOUxEUTVlOGpqUGl2S1AzV1NYRVNlNXlSNDZNT0o2bWZGdmI2NktSZEU1T3pjcmZUOWZLWXhLOWZWdzhhMkFXUklFK2I1WnZ4QlpIRVlVS3owdWlTdndFTHVicDE1L0NyRzZtZlJEek1NZUx6ZDhxNVZpWmFlTXNCRmNUTzdUMmg5OTI0TXZPdng4anVOZWJVNjZEeVhnUzdmWkY0UDg2cEVaY2VWRGt6YXhURmJmRjQ0TmhSQWhWdytSaG1KMUErejEwSGxpN09vS0RweWNaWVY4M0hDNDBuVUZPZGFJcHBtRTJxM2NobkEweHVjY1pCd0hxQkQvV2I1ZlR1N005SWtvMTRtajhvZDVSUmE2Q2o1TWxRSXR2K0poVlZxRHFORGo4b3JRM1lVYjVTUzhIMWgvRStwM3kxY0I1TGhIQjRSL2Y1TDR3UDMydUtzVW1uUVRnb0J2ZysrSTRqV3NPdWx5dnhjRjFuRDNaSWUzbTM2c1ZMMnZNS2JOL2J5WEo0TmdZZGJwdjZYVmxYbDE4VmdLdUVVa2tuRUFkbWROOUNQUzlOMjBlU09mS0N6NkpIN3JVa0pya1JjdEZ2aWpReGtoejdkNHpWV1hwTVlrTEllM3hsK2Y3emtKbGJqczBPVE1iR0JJdllMdkg1eUlKczhscEJpWEtkb2VHZmRBQVJ4SVNtWFRwbXFXYm5GT2RBd1ZSQ0U0TDFhNFFWZk1ERElXVjhXK1AzMi9rSkJhWVNvNXl1WXBEOUExMnpsV25UL1lzanBDSVJ6bTZFWUd5Smo3WWVJTThpQm1YMmJqZFBmeVlnRFFsOWhtVWFjM0VQeGp2WlQ3VFRFRHJWWloyZ3pkaWwvVDVzbkJjY2tiQktCRWIzYWdkdzI5TGwvVVdaMEN4WmRMWlNaNnRMall6WERZeWczOEM3T2d5MHhtVElKTlp0ak8xTmQ2UWJMSnF2dUhkaUFGem03L1FiaG5oUUJrTnJnRXZRTVVkYnNvKzlaakpKSTUxQUh4cUk3UGhQN3BMZE1QeHFOaHpwdEZOZmx1RW1rcEFaL2FINGFLTjBzeUEvOEI3Z2FwOUtzZ3llVzJnNHFMUThmQmRyU0ZzVUxOdXJJdmNoSWtkTnZuMHFlZGJNb0JuaTlxRXdjT053dzYrV3BOd0NhQUhOR09nSkRINkxmZWlpcW5zdjVGQXZzbWRUU29uWSt0TWtHNEo2M2JaVXoxSEE2Q1BOSDFrUEhHNXN2elBoRnZIN0NJS1ZydW9ZakVUTFZuWDJkRU4yVzBkUGIvZm0wcEtSQk5hTS9tN2IzRUpVRVJkMTBWMm5MS3NGeWZUME9WWlNPNDlSNzltRVRWaEVUalJ6Y1FkSVdSdVRtTmk0TmpOYjV2QmhkZTJmWXNMb0V2OXhrTjFsTDNsY1FaR2hFOWN4d0VDc2MzNU1SeEhuWDU2a2ZiR2ZoTHlCQWJrL1JaSW9QSHFmTU5Ya1dENXJPSHN0V1RxM2NZUm9yeUZaL2FEbFhVcjJJeHA4aEJYSGRXdUZ5NzQ1NjV1K0YvRGxzaVpxTmR5NE81SnpEZFdJdGY3VDZCNGFzaXZ2OHllR2lQdGpuYnY5dVVlMUUyTDRjY0Z0VTF0dmRyeE1MSkVaOFhKNmlVV0hDYnhmUXc5dDNTS1dIb1diV1l1bGZWQ0NKeUhhSGplSGR4QWdkUC9GZm42OW5BbThZRFp4K3JQWWVrU3VPZWxJMTVWWFJ3NWhvQ0kyb2VpYjhiQjlwWDZYL1BqOWRKTWJudldTTGtRdDhEREdwaHhrcyt3YjNOeG8yT3NHTVJ1Tjc3QThHMm52K0FNVnU2ODlTMy9FdTRDbmUzN0d2WWN6WDE3VmEzdndxSlRJcWNzdzZYVGtRZnp0Sms5ZnpjRy9DZE1id2tXdmVESTI5c2tJelByVFFDVmQ3T2RGbm0zYkxYd20vSnNscCt1Tkp4b09NQjJhak4zQVJhNHQvYW1aeXk1RytNL1o0a0FCSE1XSmQ5T1ZHLy95bStQWWxFbTN6Q0FyaGovZHgzeEpoMXlRck5WUTErY0dCbzh4WkVKQTlRSkZraERwOXFXMmwyNnBDMDBrc0t2bnVpd3BOTmdnVjVxNzBtREp4MmltMUFXUGVrU1ZNci90MHNsdmxHQTN3Z2o1b1JWS0NIeHNySTFmcWtKd0lmczhJUy9tUFM5NHNVcTRmNURoSWZBRVR3cDhqb2JLRm9rRkJNUXhjZndwVzh4c1VzM1M3ZStkMHJVV1oyQ3h5aHlkeVo0MU9IVGJjcHIvMEx3L0ZXRUZKTG5zQVduUFcrMXFCT0tUaEt0SFhXNzZGYXZnYnJQcTM1WUtrUjVyRm5lcG4zN0NqZStnb1NBcVdOMmh5aElNNVNqb2tSblRXTVJYN1hFc2FtbE5UU1laTEJ0THlBYnpBVFd0WExicFB4NVJFZEc2amxOSk1tZE5DRFJTR0tvMVVCdjY5V2pzdEVPUktKMWZGWVhSaVlNM1NwZWxzN3JROHRDdEsxQ2FTblhxQzR5SG8zeTZJNm1wZW84QjJXcGtRNVpmcVR1YmdnYmg4WVdRcmp6eG4rUGoyRkRDNVFIa2tGbHc2ZGVzZk5xZGZ5VEJ0R0VFTlkyWTUvZjFPMXk1T0wyWU9QWFpNU24zTExBc2lObTR6RU1oR1MzOEp0aUhKZ25vNW1TeUhtNEJJa29oMU9vREF3ZlVMTktsZFd2cnJlMjc4ZmREM2U0R3lHWlRycXBFblFreEEzSmFqNWVrR2wwWGlmVVdCRnVsNFFJY2p3YlpIM1g5ZlJqdHFKYVFpNmJCTHhBUXRVa2l4M21waDBsSEZxTXhlN0xaNlZZd0hFTDFIaVhGOFJQdEY5SXZ3dlNmWnJ4NFpDQkZENXRMV1Q0WWh0ZGhNc3pjSzVWZXVkSjN3RldrMnd2MktNdHFVaEE3N0VOcGtiRWhnWUt5SXVWTDRadlR6N2lCSVBoRGdwVzIwYUlSVGpDc0ROSWlacDB0VWc2QVVqUkVYMUdZNU0zVlFaNUhTUnV2ZDJzL0pPSmZ3bjdmSW05VXZMV2hNR2RBWWFsbUxBSWd4cW03My9IY1piV0NacS9kN0YxdGk3WmVxenNya2tWK3JnajV2Mm5MODc3UE5RVVp3bTN4dDhKMW1pWWlxSEpJVzRRdE5JcTA0TVdPOUZWOWZyNEhFMFF6ZTd2U0NiajdZNHozb3ZqNHBabkQyUlVFY2FpWU55ZXhZUXcyd0taMG54c2t5OTNZNTlZTElERWJDV2R6eXFjcVdaVjRic0luV1pjU1RuTTEra2tUb1dCYk1ndzNoU2kvbHFYeVpVQktkb1cyMkdTSjFCNWo1QU5SdGkya0pNNlliVWxBbU9wdkdoTXNNT0VwUitLcWhEWWpPQzhUV01tOS9PT1VEYnZidzBmTDdGRHN1NzRTVzhlYXFad0QxMHJKZnV3Y0JmWEd6WUZOUUZaY0hmYnFoeDM0enltM3ZKYVRTdTFuZEc3dVRYMHdUNXVBTWtXRDN3Zlhsb0FROXo4anpWa1ZiaFVGS1BXc3NnWGVyQndUNDRjMUlmWmQ2N2h2N0g1ckYwaTNSU0RkcENMRldPSHZTOStuQTIzalQ2c0dBMkFnTTFJQVd3NkVzWXlEbVladHpuOXJXK3l3aXViMW53bFB5RlA1M3Z5SjhsSXdFdS8wSWcxb1BFeGdxblU1OUwzTEpOSmRoNnl2TGF3NU5UU3NQN0dVeFJPMkc5ejhOZlJEdlB2VXM2clRSVisrNDVpK1l4aUlHWUpVOGNpeEl4ZVF3SjBOQ1J3cGEveXAwdytwekcwZ2ZGbnZwRzduY2JwRWJPNi9NOEJsaCt2cjJUSHROek5zMnBBNjBDUTZxaHZoTDBxZTNWS0VmVFpNODNsd2JpWE9mMGptcEpYcU5YNDZ6VFZvRTJGbTdjUEgrdDFqV2ttTDJSWEIzTWtkdWtVeks3Y09na1p6OE1xZVQwSVN3K3RjNno5UHRibzV3VXVYbGJwZ3hxaHFaV0pjNHF6YWI4bmpVRzFDNUNiZ1dWRCtobHNVVlpRaVVEWjlRWHlKbUE5SmlMZzNWMEtuNGY2WVdESGZEWE5EdnlSbVB4UXgvZ21qU2pHc2RNb0VSMFM1OENxS01FTExyandnNHhHTzVGU2Q4ck04ank1RDlpWDJnYWZoOG1yNDVIRGJZc2xHZEY2d3UxMS9oRTJLRDBDbzRmbTdCMis5Q3dtc1daMXg2UlFmT21LYzZzOG5CQ1dxeWRPb2VIRFU0cCtRWERBVDVwTVBVOU1JRFJlVlVxT0JGS2o0WHRpRGJYQ0VGc05rV0NUc0FDbFRjTUQra0crUWkra3h3Mnl3bEplOGVQZ1NpdS8wdVZqaENJUElSNGFwbGR6bDJ1dENJT1BiYjREUUd6NndBZHVQa0FzbC9pSjJmUXlFZ2lFR05CYm5FWk9tZHVDVkppeHNEWlRtZkQ4bnVjTUpkNGg5b3VoaEtBZlFYMks2TCtWVTdsQktCYkE4TjF5dTZ3WlJuZm50VWw0aE9jc0NGOTlCUllWdG9NTjY3dFRUWVg0ZkpNUTFNbVhnbmI4NXB4ZnlwMHRrRGJRQTZDdUc5N0ZlZXkzWWRMRlBhUDFBNzJXWEE5bitVLzQzZnZoaDRXNWlkM29iSUppaFNBMUFvUFA2Wk9Qd3B4RGQzSUhlL2c4ZzUwSWxXOWsyZ3ByTjQ0VCtjREp2bkJENlhQNEx2SEJ3NEhPNlVHcnc5U3R3dmFYdVVmTkdTNk9nemZ1NTRjVVhNazZRQitBKzRrbFBTVS8wQ1dWYmNxWm9xc0FWQ0hOeFlRQ0d5c2tTY3hGRTNUbTNqT3pGWVNueWlZSTBza1oyb1E3bHEvZ3YyV09MZ0VVNzY0dzlCMXR4aDJnSTdhSDQ2Und4S1E2c0pBVzI2aERnZzF4YjRMenNqeENYMXVrdGZDeVVSdmMwTEw4UnE4OG5RZ21FNnc0YzU5Z1V0c1ROWkRQWGZiUHZqdU4zTi9FOTNrbWUzSEp1Rm9GNFRRWmdwNjMzOUdxbTNtdkN1aXdUb2hTM0NBOUxtUW1vS1RKdzVDQ1E4Zit6Tm5pYlRvZmQ4dDhHZGJzNEwxL3kwNHdadTJ6SGNCQWN0dzBYU0lsaU1BOVJiTm82b25ocDllM2gwZEN5NlJQOSt1WFhtYXROck9qN0kvVGZMVldnaG5lcmJYdVN0UjlndU1ReWttUWJnRkF1ZmJhZjFiUVhjWkFEckQxOWpOZFVJMTREWms3MGx1TDVvWkxPajFTQ1NtTEt0S3AzUGM1VThiVXlQNUswNTRaaEFSbjhPQ1ZmQzJsSjBYWHZQS1hESXhZZUlMbzU5SVJ6aXRwMjY0K2lnOE1VN2NqVmFZVWYyN05oRG55SlhpYWNDQzJrSUphYSt4Q2p1dFpUeXRwMGVob2FYbGhpTDFEUHpLWmgzSS90UmZ5aDVtQkw3dzd5NzdReXN4SFlyL0Q5N1o2UlRUQ29EZ0hZR2RVM3dLYmI0VERVcUY1Nis4NzA1eEVGSldxcGNjUzZ3R05yVVJnSHVDanlvVjFXMmtHK2psbGZMZXllZFFsbDM3UmFsQkg0Mzc4VWd3eDZYUmRldTMxa1hsSFQ0VXB5R0ovMjRrVVNHT011S1IyUTNlOUdmOHNySXEwN2lZSEg0VTlZUFh0a0Z5YnkrTi9IQXJXdHpYeFZwc1I2VVc2TW5GNHJSdnJaSTBXbUtjRlBxRUdWaW8yNG9QVitnS1UyY2hTSnAyRUlvdkZXRTUxM2haVTIvaU1vaFlCbEhqRDFnRCtyeDlvbjNYSlUyVnBMYTJmK3pTUjhnbW5VM2xTblFIUElXMWFnVnEyTENPdnlRNlI0TkpGWERoL3hEWWpnVjlsL1BxODczc3NRVXQrOUJSWWtXYmpJYmJuWE5qVTl2eW1TVVZzeVQvRHk2NmVVcjlBRDBTb0RZVkpVVzJLYzJadml5WlhVWm5YV1BHSXNmbnNoK3JYaDUyYnp2M0NFNjlDTkJDSW52T01zQzhjUmZ6eU90M1EyQ2d0Qm93R2d3QmVFYXJwUXRPTWo3SE9qRkMzeXo2Sk1TUHJDaUFwaDlNVXdCWXdrbDNGemx1V3hQaUxyd1ZYUVFmUm9vVWEzWkM1cjZpSXpOWWxlZnN3SkRHaUlNMW01ejJNdmJYRVdieWE2RXRBVi9ET2dKa21ZNk9QbFJsbVZOUENBeFJnRnRFelVoTGQydS8waEM1eGh6WVZ0WFV2ZTNFbU95NE1WOElXR09sRXgwS1luMjY5NmtuUVg4K2ZJV3VUUlZmaVQvQ3RXZDEyUW1USE5Cd0svdzVkdlIrWmV5WjZTWHBRbGlQaTkrRFFJQlM4Ry9iK1YwYVlZZW5tRytQNEhEN2hOZ3lZOEZ0WmZLb3ppeU5CazhjbnJzNDdXNWNBRnhheUZrMlZzcEJwV1lSVSthRWljTWJDNE1hcVNleG9YT2RBd2x4dGZqWVNkTVFxbndZS000L0tlbWFDVHBSWkgyWGdCNFpBOFVLb1d6bE9icEVoQUMySlpldjBRRUxKc2NkWGZSbndBcVNPYW8vSEYzVXNGam1XTlJqa05XemQ2dU9ETGRxTzYxeTJYSTFndVI1QjhoeWNBc3JhWVlBdWkySWdHQUNoaVp2U094NmtLekNNSXhTUXdFb0YvRXYrSEpOMXF3NXdpMzZ3bW1lWVhUeVF2MHduODBzMFdNYlp2K0ZFNnhyTHRUbmpaNHhVMnJGdUlzOS9SRlhFUTZXYWJiZk1Qak9MZ1c3UlFTdDI3WTY3dHJBRHFVREJyM2ZzZnJKa2N6bWZmdVJPcTkxd0JLVXVQTThoc0FNeGZxUVZkN0pNaDlpZGx0VFRtdGlXOGhNMGtyZ1JDdnhPdjN4UW9xa2IvaEF0ekNOdDVnM1ZHdGVqSmNuYlZHeUJjdm1tVEQyV1RKT3F5b1NLQjl5VGl2Y2Q5ck1aOXRsWWhjcWpzOXBrUnFPTUx3L1dLWklUWCtHeTZWVGo5WTVhL1NpUndaSEM5ellVdjBmWWpzZDkvb3FaWlF3T05FeUtzMTc5clUyM3pNZmcrVEtQem9jMlZuNDVOSndyMlFHUUpabm5QbUJIdUFSZjBlTXR0UmNFbkhkT0VpMW9YM3BFdFUrMGhhMmliRW9tSzJyN0h5UnVmY0w0MmRLbURUaDY2cjlwbWs5ME1idEpjVkx3NlI4WHR0cHFhMzl3SCtER3hET28va1hpNTlZQzVMMGdtQ3Bja1FGMUFNV2R0Y0VRZHp0am5tQmhPMUFUc3ZPTVoyNzIyN25OK3VnSFk1ejE0ZnQ3NXoxdFlrdXJJc1FqbXh2VjJIdHpiekVJSmxXdTZOdG9QUUZMRmhtZE5lRDc5UUtaMGE1ekNFcDA0WEMzZ0VPR25XMEQveGpoaFYwV0NiaE95MTNhRlpmampjQ3ZFaWtBbEJGV1oyWE9yM3NNRkZESEZtbEUvbVFNN2k4VTFrb242TThNOTBRMGZYdlEwRE9KejZkTkQ2WXBtWVJ0N0NXUlNWSmFoK1ovaTJvaUN1L21vSTkzZVBxT1c2dzZsUCtBakMvUW15TTA2WFFuZU9QbVFTdFFjOEdxTWJSd21PeUlLSk5NNmZzbnNCd0FjOU0xNlNVTFNWRnR2SzJkdGVTaDVEbmtSaXdKRDlaNjJBMG5WN21kUDNhT1BURkhWQWMwajl6YXJxUkpFRnpKRDdoK1ZmaUs0RCs4cnRkUGNrcHlWbWJiTFQ5YWNuVitHOFdsNXhtNkUwTmtWeTZJTHhhUzRKbUx5ank1TFpZSk42c1dYODF2Z3hnYUZqOHdrZzU2RHRyM0JlaC9IZnpSVGZBczU4eWp4dkVIYWNNTjMvODZ0SWpCMHROZWVadDFxN1krT2xGbFV4bC9NZi9PSHVuL1lMSnQzeUMwNzlZYW5EUnlGWWdsdnVQK3VCQ3Q1OHlPNnU0WldRaDhzcUpFMEhjaUZIdFR1Qzk2anA4TzR0YTR1bU55dUJMamcwTkF3QVpjZ3lqbEVUc0NZemU0Q0JMbTFzdVJObkY5eURFQkNkdXZJdEE2RzZEemI2R2hzZmliZ0x0WXAvemwvcVhtUXJmQUh2NnB4ZzNHOHZtYXFkQ0pSdDRnY1JrVmF5UGpJSmtQS2d3Uzh6enlLQUd4WHNORm1vRUxWd0xjQ3I2YUpIdkVZNTJqaVlvWis4azl6YlVqRGVFQ3o0ZkMvdkhIQXRBeWFMTVlzN0lHbDZqQll0ZDZUbGs3eTdscitwTi93OWRsVE5OdFJmWjc0OUJqd2dBUmd1bk0yN3BZUDlUS0k5VlZWc3dISVRaWTVNc0VLYmNIdGNqSW5PNng0djZETG53Mmh2eGFjRFExRldBUnJUMG9qcjVNR0VvYUt6MFA4SXd4WkdIQzdWZHZZTDBHVnF1c3FLcFdET2E2cUZjaVl2cHNnMVk3VG96YVNmZmYvWVdxK1R2b3ZKRFJXWWMxek1WcHlZbjM5QWZzNTcvS0xWcTVsVHFESVRvKzRoNElKSkhyRWExeUxmaHF2dzNNYWdNaWZoOWU0SVRldnc2OWNxM0Q2UE9MelN0MHU5cmZaL0tjMlRiMjYvZzFOMzhjcFVWUU1aZEhvL1FLalJtZk1ZNC9ucTBNRlQrU0g1VUdzOHpMUHVrT21UaHZnMVZQTHcyWFNFV0dMUVpyT2RIYlZzZWVwcm1VZEtTL3pLS0hOejB5Y3Yxa0dWUzNneEN1a1p2OVRVUlJQS0RXSGpLNGFxYlM5REVUc2w0UFA4bkMrUDZRY2thUENGME1qNld0TnpRdDM1WGIvalRIRVN2ano3c0RHWGY2V01YZExRRUxNdC9Rd2xUOUc1dGZoWjk2SldPK2Judk5OUTFER29LZjZwRllOWGZDRGR5cnIzS2NyQ1pRVWlGK0lWNS9PYi9PSGxMdjBjZmhldG9BeVBtOHlGeklGUFcyQXpkbDE4ZlV6VzVrZCttYUZKWURKSEpTd0ZRZWw3aERpcHlxMjg0YmE3eWw0Nk55NWI5ZDVDOGRmQ1pnYjhxNVgxNUhyWTFOOStvQ2JUdXhEdkJnelo4UU9kNmU5QWpvSExWdHdTUDRmOVExaVNCY3FtWXJJM083S293ekcwK0g1ZXVsSXE3djNuU0hoMWVwYzBVMFVBOWw1b3k1RGFoWDdCYlJZUURtUTY1aC9VUUszUGROTUN0ejI3MytwZGt3bmEwTXgvd3R4OW9hSjFQR29NeEluSGRYR3lCMlVrMytLdjVsMWdaYWY0OWVRc1BENGFIME5WYU11eDd0RmNFcVR2bUFBdExqdERlTVJvdzdJd3RsWUZXSUtENUdvNmdKamF0bWRTRVlwV0oxRHE5ekJoRHNZMTFmVW93Umw4QzZMdm0zeDNCWm53TlBTSUhQUy9Jb2xtdGNnaFU1VmRDZWQ0Wjd5dVFrQ25KcWJCQXVJd01oV1J0L1pNa0JtWDVDVk9naWtiT2FBbWFnZWxscUJVdVp3VzVNQWFyclFqTHRTQWRSVGwxam9zL09iV2VVL0ZwZWQvOWd2Z1pobmlzcWt3YnpsZ1hGY2RBV1lBeCtiS1dvbWo5SEkzUFROZTExYzYvRWp6cU1VWHpPTVlxWHlRZWxWdWRjMzhpeUtOa09wTFZMM1lTcTMrNy9scHgzaTdqVVRYZ1JDWEhjTXM0dk56dFBzSTlzRG5xSWpaS1pIM25hM0tEU084Qm0yUk9JNXZ6aGJnZUlhVDlrZE5ndjdTME5TQTZab2xmcUg5NjF5LzB0L3p4OHZxMGIySHJ2T3JsWXFjajdPRFk0cnNLUVVya1MrUXRXYTJRSmhkcFdlWDA0dWlUWW1OYStJaHU4T1plMkdVL3Vsa0E0eks3enc5MmdKU3kwMjZMSVpvcUpaVWZTVGV5Y3lqelpOMjFtNCtZTnNub3BmNlVCNnc3Rk1xUkxoa0VQdC9zaDFrQ21OK3VnU1psd3dvUmRFMitwVnFOZ0RMdi9lay9GMDg4TGpWQ0xzc3duT1E2U0JPdDU4aHlVakdwbHVlRTNNMUVsZU9CWUU0ZlRxcm5UVnA1aVBGeGxEU3RWMjJtaDJoSVk5RmlSSWxvZFl2M2E3VERqZ2VGYlAxVlZ1dlg5SE1RdkRJNVU4ZWVOUWkzNGlNd1VmOHUvMHdnYVQ3b1pyY3ZIbXVsQ05ybTFkRWVHUXhwVjFPMUhZTko2VGFMN0JpS1BUblBtNW5NekxiV3RBZmVvWm8xRXlhZU5lM1BsY24zb0xlclJlUExWbzFKaDQvVFpYM3hESWhPdjIzQTgwcVpVMDlLTS96K00vNzI4TzdsT3NtR3IwSlF1Ky9zYlBnM1pLcXl5dWlWam5qaE5uWFBDcW0xVUZkbjE2WUF0S252UllxVlFLSk1DdlRPWXFNeWdmVW53TlVzaXN5STJiNGRCUWd1cjZ4WG1HbTRrQ2VodlhqeWlvc2lBUmVVdnZEQ0pkc01UeTVjaytXa24ydVRhcGRsWU1CQVVlRkd6c0ZkejJoSjJiZVEvZzAwZWsrdFRsV2JHM0N5R2VDL1p2RlBXdjkzRGNMbmtSL3pvc0xvb2lkR3EwcmhBd1ZwbThnbTNoZmh6VURFNzRSVzRWa1dsMlUzRyszUU5lMEdySlRFVnlFVEhuRmhJMitRRzF4UDdqOHFkdW5FS1YzcFJGZVZZVnlHNFUwd2w1di9YMUVPbGpLOEtWcVpQQTFIWmkwbWdqYlpJUlFUdHY5OGdhdSs4TGplNisvRi9zcHorTTMzTWdDLzhnK3UrQkxuSmZQUGhSNk9RWkN6bytJSEd1STNURmx6REpMMUpHcmU4SmlTWW9lemczaXhiZFRHSkUrWk03UkJYVkNSd253UmE4LzN1b3dVSnk2RlhBdkxqK0UzYWQ4RWc3ZjJaeXd3RG9VbkJ6UExhNUVOMHEvemtLdjRwUVoremhtZG9TSTlTQTFNdVNaL0J1eHpmcWhaL3Y2TjlkelptdzMzRHczVWgxd08zNC9aNWs2WHE1NWNibEZWVFlNdm1xQWYyU0hpNXFmZDdGZmtEczY0RWFJQmU5TlduOU1aZGY3RmdLY3lRYzNKSGtuRnFEUjd6QlRPMnBIbFRzMzJ5WFQyOUZiZWFQWjJSRGovRUNTZXdwTmJUYWVuQUhyMS93dWRVSzFKM1lDMXZxVzY4ZE54cU4weDEzZmthVXE3THkvUVRLRkZoa1g2cm5VSzdEOTBQa2xwYmZFWTlRTjVBNTVRYk1jaXlvTFpmbUlBSnNkY2hTVjkrSXEzU2ZVdytaRmJkd2VOUGYyRUVPcXErcmNSSklxZ3FtbjY3WTNLWlF5MWZvRHhLQkpsbFhWWGpucE5tWFlqQy9sMktYTm9yQ1AxSEU2U1hlZzFIYVpYRHFOZ00zQWp6dVJPSDNTM05xRVFzREdDVHV2Vlk1akpSZ2wwVWJIaEx5eE9pVFNFaTY1OEplakxlTGZ5QWU2WTZCK3NUTk5ZQ1ZKT01mbVBxR2cyTitOc2RxTHJPTERraVBobEpvbkY3Y1Nxa1BQRTVhK3RXQS9CdmdmYjlJdGxva2xRWTdKTVZWd25IUTBjUFNoZlk4R3o4bHpqMkZnazZ3bFBLVzg1Vjk2R2FqcGx4bkovckQwTlVFZk8rL0lmNkZCcXNBZnhNT1hGWm1acCtwS3lvV1Y5RjZKMTQ4V1Y2U2pXR1g2Vnh4WVFxK0VRc0xQbDJWMGNGdkorK2QyRmE3WG5VaVFPeGlJT3A5aGVQOGVOUytFWlgzS1JPU0p4blJ3bGd4VGRIMWYxNHlPYUF6RDFPUVIrYnJqTC9vMEQ1bU9KQndmTnlRNVpTMzlvV0RhcytBUzhacmtrSVlnWVpHUHlMMGF4T0RENnVYZHhWTTlJWUhQc2lpaTZ6SFJhYTk5NWdqdXBKeEgvSGE4M01ob01UWTdScFpaVEN3NGxDQklCQnJKWW9GNnRWVzROL1dETVlOak54QXA5SVJaR0FKUUZ6Z0NRcnhVckFQSnBwZWxnT05hSUVhN29WVU5JQmtlYmE1NWtEaUJXbWJZR21QaE45cithZjRsbGZ2RGxmNVh3dDZOOHJLTmg5YjViRkRuczhGc203N05zbEI2dCt4RzVkQjVzeFE4RW9JKzVxZ1FqM1lwaTRqMG0vSmwvQklqaDEzRlN1enM0YmY4M0hDdUVyalp0VWxiWENCZlVaV21OQTFhQ0hscmRsSGN3WHUwOCthTjhwcUlGelVScUpycDVySktmak1WYTI0RVoyNnYxSjNOa1V6VHM5TFh0dm9pUzhSTk0vdDh6UHRSRmd3YkpDMWJLWmRtWkNCL1k1U1dFaFpMUGZMZFkxVHlrM2NkeENLZWRkUHZxZGc5MDZWb3NkT2gvMFowcGVSL3JMa3hTL2FSaGpZMTc5b3Ywa2s3a0UvQVAvQ0pYc1cyWnpES2NoM1dEck8vS29kU0t2STFFeFZhblBualR0aThqZDRyeW8xSEZVczJLN2pNT2dUVDEvTU9XWm8vbVBCeFQyVnpoaSt1d0RRUGsyd0tuK0tZQTRCSFhFU1VRQXpraVQxV0tIVW1RMTdENHIrYndZWVVOcWVZNk1xVFlXYWhoNlA4V3FKaThyOStUQTdIMWF2VUNHSHoyM3o5SnEvYThZOHVwK0FHNUkzckIwN0l0dTdKUjYvZ0R6dStaTDBlV0p3QjJuZUhBRG8wb2JWQ3BRNkZ0N09TWSt6UzltK1YrVDM3bW1CdVFSTExSVGZlNFIvQlVKbWdxa2dvWmdOK3BFV3R2QmdncHBUN1IyTVJYMEN1OUszb0JXNDFDalAzMzhmWlJvaEFLY2JubmJJWEVBVmNpbzBGdmlySENKc1ZLNTZNU0UrSHJ3Uk1PcG5ndzMxS2ErZHowdFR0OVQxaFRjRytVdFIrV2NZWWVadW5uSi9WSVUzUUdRM1hnQlY4dEliaE9LQXFZZForVlg2U0Z0cHNsUG10YjhaMW12NHRJS3JPYm5zcFVJajQ1SWtxQ3V0U0doL2lJcC9LbkVZeWE4S1NrN29BZ25pZFV6SmJHVi9qOGtRRWNxWWNwWGZXWm1IVEpMZ2g5R3orWm1NR0owQ3B2VkJBY1lXbmlqcit2WXdZUCt3MXYrKzJZOFA1SjV3YXFoMDBIV3JRbHdQRlRKVnFhd1FlZEFObUxRZjd0azkxTDVielZxNjRvMXhqdjVPcnF6MWlIVHhpQWUvRVo3RFNaVHRldmdYSWFXcHZCS0tSeWNQM0hTeS9jUjdHcjhrbTlRaXllNkMrYlZDcTM4Qis1ekxPYjZpOGdNK3JYWkdDRnc0MkVNTTZLRnRicFZnV29uRGVxclpaeU9aeTZXYWZaUyswSy9rZXdWN3BpV3hudzN5MEhTbVFtOFA3enEwVnM3cUpjT0J4Lzg4VWdUTnJwbE9QeWZaUXJFd3EwaFZ4L25UdUU1eUd2ZTc4SFd0aFhrRWlSeHhKQ1hDS1gvcXZvV3p4eVNYZEVQMWl5WWJHa2JtbmJibE8rWDl6N0poNFZPOWJJSlVUcHJWOTJab2Qrdi9Uc2hsQmZhREpncEVyVm16N2RKVXlhVTNuK0pXNmxpS2RWWGlOVG1iMWZkdDZYQ3liZTYyWi9MNkxVQlhPcURQR01SVk15bkw4YzVWT0tOOFhzQkFqQTI2MHAyeEhQOHJzSlU0QlQxc3RVL0VTTVlYdUZxdXFpYWtUT3Vab2ZqSytUbWlMekdMZFVCcUZaOEZIYzJGZldqc1BNR2NTbWFWNzhYK3pKNG9yTDB1MnhFdkZIUGxzWjVhbFpjaW9KTGZyWjA5SlMvUTExZFpjdkVTbUVxd2FnMDRVOGc5clRodjlCUUNER1BhQmVDR1NPd0c5RWN6SGVocmVPZUdHWVE1bG9iL3lqV3JPWS9uT2wyMUg3cnBkd05FZzQ2Y1hpc0pVbGdkSlpBWEhlcEZMSUw4bnpLRTNGY3grQTh0ODdFZzNzVzdVcmFlalRTOWtjQW05YVliL2xlTUJqNE5nQXRXK1pEbzMzS29mdGRUcEpuUWtUaXpBKzRPNHBPMUJYVjNpZENXRHg3YkdvaGhMV3Y0OWovenNtQXVVWmdiOWN5VkozV0M5UDEyVURsaVJtSEJwaEtZM1Zoa1VLK0htWE0xMitLdEY4NytPWDc3VFBXdU5RTFZYWkNvWWtnUGlKVEZnRE95ZmY4ejVGNUtFVUdkMXdEMHYxZkhEK3lYWWxvU0tCellHUGNQS3NTQ2hiakFQN1RTa2ZmMzlOSStWalZzaWZGQkVvQ1ZIT2lBQ0c2REZOOGIyRlFkMUd6V1phdUJnRTgxRHVFYjExamtTbHFnQlVZMGhuekxTQjh2VmxUQTRmZjQ1U0NtUXNtU0JlUUNVY0ZCaVhpWmV6bGdINjVzNzhFbHY1S2g2cHY5S3ljTUNacFlESS9yZXQwN0N6ekxuWS9GODRmT1puVzJGVWNkSG1PcWhxR1pVczZrWUxObjFKaTVmU3hoWjRpSG93RjJjTDgzZFk1R3BGWG5ySS9GUDF5M0NxL2QwdU56MWRJZ1FFczBxdEZrWjk2Wk9XWWZzNTE2UExzVjcwYk5nYWVOSVB6ZytsQkMvemVMTFFZWWFsWVZJQ1piUmxSQTlqZk5IQUZqekVDZkVRTXlYNVh2NWMzSWx1MmhvaHNZQjJMbHlSa3czVURMcHZuUnpRckUyZFVmRW9DcVFpcUV2c0M5UjdYaUhNaVRMM0tOanNNRjlCY1dJVlNnL2ZKS0x4UTg2RTdCbnBHVm4rY1ZNRXpMZ0xHZjg2cms4Y0RhdVNkR3N0c0F1ei9WcG41U2Zqdi84UUZqK2FqaU9icXZpZkRkUTNPZUdYa1JBTGhOZTRRSkdMa1V1SmNOeDF0S2Erb1hXem1TaUVOaUJoQUs3TFBlYnMwaExvSGdmUXdKdUloazJmb2tVQUE2eHdVaCtIT3JGdDd2Y3JFUElmNEJtaXNkNzhTdkRRWTN1T0lqamxLNlh5TUdxN3V6K2lqQTB4YWNWeDZHTFczZnJKSVZRQWZvWExnUDJ5bTllSXZDci9hVG5SQ3BqTW1LNGQ3VkhDMHV6K0dBc1l1SElLaVY2ME05d0hla2VGMFVhRk1HZ3BzNlNrUkg4UURJallyMmljN1o1c1lvUkRiQUpmZDROaEd4ZzZzbTc3Mk1sZlQrdEh5eEtMTjB6SjAyb0cwSEh6UjF6WnJkaVEvMFVjNUlkeWlvbURwZjA5M0IrUmRSdzBUdHNOenRyT2p3d2hHeTEzNDFvblVQa2x0TFRPQXlYTEt0L3IyVFJtYnVraHRGWFBCM0NiazBZUlhlWWUycW10UTBpQ1N0OFZ3RkdwQ3FwbUNyTlVXaWh0WGdncWtKMnVDNmQwOFdmUzR2UWxaSDRySnBOb3Y4NE8rWStSTnZJbFFkSjBCTk14b1dUdGt0S1EvbS80bUwyNFQ2STZSWnVPTTBYTTY1RmhSaXdDdXRVeUhZbVU4bkVmSFM3a1JkSk5tUENBU0d6UUd1WTlVbm1ZWVpqV3cySVFnY2FmQ3RITytiOHZzNjNiVDNKWlQ3SXVaVmJJMG5aTUo0QlFmVVVyY3V5eVU4eWw1TUVTOUdwQ2RTdXk3Y09XUnIzelpRTzQweVl1WFdEeWVJRkI1SnlJWVlBNjdQM2NLQ28rcVF6VVhuby83eklNTU1vdzdrZW1GYm5aM2xEWlk4bEZ6OGlPUEkySGVkUElPNVRlV24rSmwvN1RHN2dwOTR2bElMUmNMUkI3QTIyWTM0dWZKM2NOZzgyZ0dzOUYwTXMxMlVvZmlNcG9nanZ2d0F2bjRoQ0RyN1Q3OUlaemlxMGtZRitkUHRQVnRVZ3dFU3dBSFIwY2JJMER1M1VzUFBYeTFGdzNIMHBDNU40U2U0ZU5KYkhzVTFJMEFrazJnM29WZm4rUkZZemVPSWpYMEh3aU5SQmpDSThGUWtZZ0ZJUC9aWjdDMDdjU1VFVjBOajhicFJrL1Z4VGVzRTcrR0JwNmQwRy81WHU0R3hNa3FtSU9UcnRNVmlLSmFnOTdpZEVoUldzS1BJL0k2UVVQb0dnQWZRZXVVVkkwQXlaTGpEL2xkc0t2NUNVQmc5UlJQc2RLNk1Nb1l3aFNHaWJndTljdWhZK2FKcXB1MEtMc0YzSWFRWlE5NG4wczY0VmRtVWQ3dmRYSHB3cG0zY0dueVhGeWFaaHE1QUw2QmRiRmp1UzIvMkJGOEVNVXd6aW5wOW83aFdOdE1mNHlCNmZudjlqSnQ0d3hZS0p1REc1WnN1Rk03SXlvSDgvVTNhWm5uNWUrbVdKM2dqTk1Rdk92V0lmWVMwcXJSQlZVNWx1YUMwZFc5NFlRVlNuYVZHVU5VY2VJckRpUURQSUlRRGxzcFk3YnVBcXdaWk5iTnNDMnhFQjVrM0dlZEhzczZqekNnT1dlajFIbmdoQ1JlV1dvYzZpYkpyV010TW1FMDVuL1pHNzgwU0NsYjZIZWd3aVBSSmJMYlpaMCswMXFJOHhFS0E3VU1nZE96Q3I0eTArZVk4aEJmRmhZWUphOWJxWVMyd2RoZkVFVjZDWlV2Vyt3SGIwc05CYlQybFBRY1BPQ3hWUHFFKzg2d3RRNElTOXZybmdadzdiYkExLzZmVEVpMFQ5elI4NkhWcDkwd3F1d2p0cmJZOWRxZ1MwSFkyM0l1dFJLUFB2RG9leWtZSlNMQ29wVVpoWlJhRExMajhoTlV6bHFUMkcvWnNxWDN5ZEZDQ3lxbG1heVBWWjRlWGx3RHdPVFUvT3JJN0lsSWFSaFRPZDJTVGhDRTQwRGs5RDVrdlcvMnB0MHYwWXhLYlF3cUJMc1JxeW8xelpjemNaV2phNUNxYWNjUUZ6N3F1eERuTGFZL1owSEJwVngxSnlVYlJFUkljK0tvYzRxanAycUNuWTRGWUhoaUVPTHZZUVBtT1QrZGJ1QzJDcG5Wd2JDQ3ZLVWh1RjB4MWZRbm44ek5yek1GM09rY2xickd1OGRwYUZpRzdhTUk1bmVPUWdmTnZVOFIyYllDaVpJci83VURId3ZkQys2VXFPWDRha3pIaWpYekVWNFFWZVgrTEJJcnhKZzBqOG8xZnFjRFgzQTF6Qkp5U1llRjR3VWlJSWFhNDNXVy9HbnM5cVNMRENVYmxyZG9RVjNNOXJlSzlBV3dYbjhlK3B5OEVXYVFoTUxUaVFieXY5SDhLd0ZsU2FSRVhNdjlmcXVMUDk1OUtDME5TTkhiOVQ3djA1V3RxMUtNZWhaZWdpcGR1eHU5eGtpYkVQOUtsK3hVbUlpWXlyTlVyWTVqbHlKdFBTMWR3VDc5MEhydjgvblM4bDVWWjZxVnRHMnJCLzBxdHVRWjd6OHFlV2NLelhDRjRObXBnNEN1K1dzSU1ZYy9pYkVkK0NHbUVHQklpZ0k4Z1V5L3JxWFY0dkVnaEJQaTI1eUZWb1ZTdFVLdFcybFZFZFNUaDROSS85R2czM2NWRFBxWmxqZUdtYWtRU1RNMXBqdFFValZYdXZCUmFjRitVMEpyemtodzR4QjlzaWZZUWNXeG0wOXViWXc3SVVwVEk0aDNHZmhtNkRoc2w0YmFyUlUxRm5oQUtDZjNpSkIrWFFPZTR4YVVnVTRGT1VaU0JUTzVsb29zeUdQOTNQdlNaTVAraEhZUTh0aTNSdkhmWVVqVDFNZDM5NDJvZTRIdXNpTDcxRE03dG84dWVSRjFJci9CQXpIRkJNOHc5VzJTeVFUemQyc1JwTml1ZlFIeGhycW5aMGxPWTl2NnZBd00zWW5jUUd5V3ZJTkRmOXBEQVpqUFZuNThOU0Q0NVVBUU1MVmNHc3NaNDllQU1YelpaZGwwY0xVeW5MdXJqQ0F0TlpEWWRpbHU4TS9OQVFkSjJXZmllTFY2S3k5Z3NUaXQ3bGNRS0RFeUhFOGlXNnkxbjYzaUlhODFucXJwM2dhc1ViOEFJZDJma1hHWkNUWUg2MGo0ZFVaRnFia1ZFMmd0azZoOWkyc2NvOEpJUkhJNVc1a3lxaEVqUmZuZEg2ZEJRU2F3MzYxQTJ0VGd4VG00WjhOdy9wVldVdHU1VHh4VkZPZ21UZWJLQmZkZEFKY0JXelkrZEd2NXhRSlRtVUUwc2xIQUpQRXVaRGM5QnpSVXh2bjRiR3gzblN0TW9BSTUyWVdzQ3hCRzFjS1FiaGtQWWtTSFN3ODdHcTRwbktOZFRwUGZqKzhHbkNPVUtnd3JGSXMzS2NqM1RWTmtKbnhFVFg2a0xoaDNpcmJtdnZZeWJwdHdRM0ZxMUZ1cXRiZWFlZ2Q0ZGFESWo4NHhlVUg5R1NsRXV4S1pvWm10eDhMT3N0YjFZMDZFdG41SDNFRTJZR1BKV1gyQXRMcVFjNWJHenJnV1lwQ3BNd1U1K2d4azBYZk5TWDVTbWwyTmxlQWZjQ3AwZGwyZytFVnA4dGhIbHZXbVA4dFBqSjJIY2xhME9CcW01dTlIcUgwcDhNem5vODRsNzBlZW01QThxUzRVYTRjWmxiMFk1TFBLd1RCb3Z5VmUrUWo3MFdmTlF1SXVBMjhFSzJQZ0JJbjVURzlFUTk4WTFscXY5OHpMVFUwNEsvQ3NHdVVmVk1tajZibmhEVTVuby9Od2crbmRKSngwc0ZMS1NEL05QU1FvaStodW1MRnVqYUIreEVJWTlDa2ZXMDAvZWROSHQ3WklvNUd3c2dOMjVKMUhPTVYvaDBzbzZ6UVM5VjFVSFVPdzkvZmlLWE5Wd3VoUmhxRlZHeUx0RDh6NFdDVHhjbHJ3U1lNMU96b2p6cTA3SGs1eVcrc3IyRUgyRDYyWW4zeHloWXVNTHIyTjlEOTJQdUkyb29jMzhkSVZtTnBybkNTb1c2VitpZTNZbTY4bTB0UUdoblNnbW03T1ZZN09Fc1RWSGx0WmFJWm83cHdRV2t0cWJvUGxuYUR3Z3Z1R0ZCb0pWMmVZb1hQOHRiQWswT1FKNFFLRzFVZE5NcHI2ZHhRbTErQmdGTnZQdGIxSm9keUFkdjRITU9TbGRYRW81dS9OTmllNWlZYjFWQlFibEE1QTFWN2xoZUQ3bXBuZVdxOTB2cFRydHBDYUU2MFE1NFEzcFZPTFRVU0FrR2hOYzVDVlpFREZwWjNVSG5NNTB1U0QyWDErdklJQ3YyU2N5ZUx4c1RTNTZkVGJBcmxHdk5heWhCL2tpNXc1WGtaWXBaTWdDWDY1NmVpL2Rhb01hV0wyTmVaUDNCWk1vMUlYVWxPNVAzb1RSOEMraDNSTmN1WnR4SVVKVW9lT3J3aXdtZlZKWGtFeEFBaWRFNU8rNUF1MHJyQ250R2pFY0hZYmovT01ETDFRYnUrV2FYVWZKbUsrTzhxRWZMb0NQZ1pFaXoxTDNDQk1sZWZ6Q2VPYmVTbGkzN3E2ZWsrQXZYcWZseElOWWVmOHV3M25UUjZDRXI2SCtsTGU1N2JsZXNxK2p6M0FkbGVvNlBCcVVQNU5LRVp0RjJKTkY4cUZxcHlXWVhacWtuaHlIVVJTOW5PMEE0c0FGTjVhWThOYXRMMWZDS01OMEdjZ2JxRnpuNW5uWnlZT1psdmZ5RFVGUmplandEaytVQUhPTEdTZDRXWk03d3FHN2RwTmxVbE1kQ2RMN2xYWi9MSGVuWitMN29WbUhWRGJ2eTEyZW02VkhsWTFvZHNDRlRDeExMTlhGR01HS3oyYWxlV1A2UlUyZkVnYnJRM0RKSEZHNjZQQnRuQkhmQ2o3M3ZJOHQ4OFJNV1E0YTJhU1JoS00rZng5WGRsRHpXQXRNbmY5SGNpVkpleGdiTFNUK24zR0dFVnQ3V0FNdGRrN3hUOGNFUGRxRDl0SjdGYkgyNDZEeEl2V2VCVjRVeU94T2FuSUwybmNPano1cVNTcnQ2NGJUdE1sVEtHMjJHU3duT2VKNVpNMlJDeXA3dmY2QUhzU3VHc0NrL3pINUhGUWlnNW9CS1dKajY2N0dPdW4yVy9RRGpyeUoyRmZnaVJNOEFpTFJ0TlE3WkJZbHM0UXROUjFyTXFBZENGc2M0TG5MTk9xRlcxZGVwRU5GZ2xDZW5nTVI2MlFpUStMQ3ZaQXcwUUNQcERwcS80UGVQc0llMUhkc25sbzBKcTlITEcwbFRMT0M5SE1pOUhiNGRmdkRlSVZiUmpUVUFKa3dTeFNtUEJqKzRYMW9GczRqRUpKdnQ1RHptbG1JajVWSW9velFuK0RpZGpkaURiR2dZRjZIUitPSkdKWTJ6Q1JmQ3YxTlBjU3EvQXRpSUZkd0hQRWp1ZDV6aGYvVUJCU3VTZmp4OEZxYTdQT2FkWlpjR3RXMW9SRUtYUzFseXVZSGVWRWt5MkQydjdkcmNTK1ZDbHZjdnNNNnZVRUxJUjNaKzhRNTVCdFA1UCtuWlNnL1EyMENWRVJrZFkzQStHbktZNWtBWEFaZm1ML0ZxSzNKUGNBdGZ5QkswVGE0MDlXRlRlZGFBdHI1OTZ5cC9oK3o3NDVCVHp2dlRhWUl2eVlTd1pMbHVwa2pCMU0wUEdKRUp0RkdrNklYOFNpY2tMZmlYQ2I0QkRvakhlVktzakE5dTB5bzk3d3hzek5zWkNaNFd3eTBLeFAvU3ZycFNwSTc3NTV4OVMvREpOY05NLzJsY1Z3QUhOQUNZR0lHM1MrWlpWSm84Ym9QRVZ3eUVsSVV0QXhuODdGV29nUDhObGNzTGFLbThsaERLb2RlMndjQ083dW5LS0o1TVBRZWpKNUplaUdkTmswM3RrL21DeS9USXRpMi9jb1QrN0piY2hwL05udU5ucG9NOEdzZkxydlBBbk1JU2g3aVRnamVybm00dE9EdkgvRDBrdkdXWWRWUWFuRG1vMkFhaXF2bHg0ZlphU1ZXVkwxODZxRUdqdXIvekdENkpLQlUrWVRXelA3Vmh3eUJlbVpZTTM3Qy9IVnY3WktML29MNjRLd2JzY2hqWjlvblJENHBXK0RjN3BHaTRNSWc5VVN2azB1Z282bEltOTY1Ukdnako1bCs1SGV5OWpMSlJSdXBKS1ZtdUxMVWZub1lTR3crbFV2RU1ReCtkVDF3emc4Q2VzVEw4NjF4YmVNcS9NeE1qUGJIS1hOdXdEb2V3OWEreVg0dUJSdlc3bEhGcmkxaFFKUW5Ra0lXeElBZHRjbmtyRGV3WmliTldLbW9mclFiTmV6d09PRkpmQjh4ZTA5amRUNitlQnNpV1Y0MytCZTVYL01raDdDR0lJUXQva3Z6K0VwSGhWS2IzcDQ4c2pic1ZBcFZBbWtiLzZTN0V0NVRmZTdoN25wZkxaR24rM1M5T0JhWnhYWjhvMXY5SW1TK1NWQy9jWnh0R0RPMVN4OHhXazVJOUpiS24yZEZqY1JkNkhGc21wRnZpMnd1bit0c0NWSStGMUg3OEdYQW9ScDlVU3dIL1hXU0w1S1dXNnJxWENGMmVHZEFPMXM0d05FYTR3RHh3T3IwRDNGWlQzZytoU2p1eWZjZU9WYUgzZUV3S1czendvZE82TjU0Sk1GaXp2ekhxN2FMM1RZY1BoQ2dsZG0vQThCU2RyNjFRd0Vtc0swZnBINGtDb29VYmZsZUh2ZGZMTFkzbmVxYWFsWVBoajdOMmRad1FyZTVBT1g5dHMrMk1JN0I1YVZ2SXBiTFRKOEEyVTVMWjFqcHFWbkhQeFRVbkJ5QVF6SzRzYWthOWxZQmRlNlFGTnFmM01qcWR0SHlWQjBKbUwvUWVjeFA5SkZKYXZocHNhbHNSc1NJVWVFanlVNUQ3aW5lUXFGY2FKclUrdmZnamJ5L0x5R0tzdFFRNUdpTWlSZXZUUDNHd2xmUi9xU3NaWVJzMkFzOEdrVkYyUk1kQzRNbzRLeGxDczEvYklTTWRWQUEzTm1hUFdUOU40eTFuMkJGK0dMcHYya0Q1bVc5SUpFQkp0dFJXRlR2Tktabmg0VWlVNEZkenl1K3p5MUFGY29HYnE0QTNzQk5qODNnTGhEV2hZTVNxRHZTdXBFeUdJR3VvU210WVA4b05GKzZtOEJHdDByaWttckUwTGdBc2tTMFFYQlJWbDhpUnRPVDRnZ1lmaFR0SjBVMmRSME44UG1INm51NUJ1STVPNCtjRnBRVFBOZlhKWGZJSU1lR0paT3JNa3N1R0N2bVBEWDhhckUvYi9Dc2NRTUhLTnNBc2Fxdjk1RGNBbWhRZERJYVM4TVd6cG5RSG56bG84MFphTmhRb1ZxY3ZmbmFkVEFxNW9pK0RGQmJadmxZbm9QMENhcVYwRDNvdUg1V1hsSHpKMVpSRUg3TUpJQjA4LzEvc1FPOXRMRUhDUnN0Z3pMd2JQcXRYN05adlNRME9sMUxFdkdsVFZhUHZUL0VMT3lNdVp3SXdqd01Cd2o5Qi9JZmNkaWNZN0NxQ3Q0YjNrNXpubDVGTUsvUFF5MktIN2xudGRWVWQxNmRZcDBDNkgzMkx2d0NFRXhzcFgxWmh6dnpPSExzRDZ4cXg3ZEx3S2d2ODd3b1BEeHVKL3kyUlJCSTJ2TXdsNklTcnQ3VFBwTVFJeGMwbjBHQ21RUTJacjBobXRFdEljczB5S3FmNCtXM3llU1hFOStPcXYvM0FmTllHS0VVOHVCVVpLM0toa1hCSk9kNVRFbXY3OXBkS3JhTFV1TURtWTNIS2R4eHhEb01YRHFzY1JkLzRFd0NSY3BrREZuRTEwdGpmbS9pZE84Sm9HSmVkU2JWRC9LNVViM1Q1c2hubXhFdjgxZStTaDhGMHhoK1dDS2RrUithRUxxa1dnTGMvR081ZEpkcU10YzRGT21lZnE5RGR4MTVSN3VrcC9FOGxweDdzczgzR0VBa05MR0NTOC9hSEVnbkt4T2ZGZUQzKzliV0NqbDV2Rm5uWmlGSDQrQ1JpY2tJTDZVTEM5UFpnVzlVWm5RLzNRR2Q5czF6UndTQVBPTlpQQytCU0YxNjY0RU5QM3VRTlBpakF6UER4cm5iMFd6bm9tR1hITVdiL21DVUFybTY2Um8xUVV4T21iR1RHMXBWZjhGQ2p0Tm1WY1pvZS9hOXhIMm9rQkozOGhJdTNhcVJhakRSNzl1dnBwRTl6OG5MTURKbWlGUVBnRUhVT0taZzljcWltUk9zQjVaeENFNkxrcTdmaWFKaW9naVhWM1ZybWVuNkFuMVlnUEc3QVp0bUtDai9zT0FYNVViVWZqbTY0ajArS0pWM0I3QkV3dDUyYVBSQmJUc2g4ODJQOTFLemNyWWlJOU5ZejJFSlpQbXJDYzFScUxGVnRoNDhkTVZ6eENHb0pYOHkwd21ycDJDTGlmR1JQUnBCYmtsdGx0WHFOUnlOVTl2TEJLZFpkQXkvU2hvQkViRHJMRkN4eFpPczc5SGgwZWhYYW9HMUNIWFBlYVVTK1V1RG9WVGtLTEozcU9KdnJFWEFxQlE1cEx3TEliQ2w3MnVnYWVkYWNmM2ZibjJJWXFFclRwTnlzOUR1UU9jUXlFZVQzeExRMURrYmRkRnUrWUQ3enREejBVb2UvVERreFllQmRibWdrdEpKVXphblNHbHhZT3JpVWFhb0g5aDRzcXhjZHB0cER1c3VnRVVJMEN5UjFacmk5ZUhnYmxONHdkZW5XRWllMThCQTd4Tko0aGwwalhlWEJLQ3I2YkFVbWlFNk5BT2FlZG5ndng3MElmdjB3Wlh2UmVRWHZsdEJUNW8zZ3dWMVYxWEp4ZlZnd21KNXJ0WDUwVkc3RWEyMkFaWGpZdjMwR1FKanhyNXVueVdIWkdKVlU5TVNRbm5FNVB6SkFXS1hSU0EwaHdQZFgrWmxiNU0vWmpiV2xkemdvZ3lvRnFya09zQ1piZDgvNTYzNjJDdGJFNTJLem42MUJxMFpacTJoZXNSdWgwK1NRNE5mT2ZwTTYxOEpWTW5hNHlzaTdPa3JuVkYxWitnc0RReVZ1ZVEyRGVXRVdnYXl1ZzYzd21NVkxiWmxsU0JrSTJIZjJocUJLRVRKc3RNSDNnVGJyV1N5MHM2V3kxdW9PTVlDQ3dSUXJCQXhoWGRROEVuSVhSbHlCeHVZbTkxZzVSRkRLS1FOMzVLWmxZSXNKVmVOcFNHVmtUNWNWV2IzL2pjaEs1bmUvUHhwSVhPNlNzRjRjaFBleEZZakdjQmp0QU5VbHdONll1bDRDc2VnMnhoNkFGWXhpekN3RHRSa2xGTWlRekhoTEtUUkp1T212UFY3Y3MxMWhZakxXUDR3WHdCQjhXYnQ4eStHSVVueHRPeUJXT3daM1BoSXUzNzdPbU8vSjJKSXBZM0JnaHFYQm1zdkdscHFoZ2lTL1ByZHpBYTM5QnJDZThiamxyb0FqT2JETVJGQ0piaUdXRUZ5QmhDK3BuUUo5V0RraU5YMGpiL1U4ZTgzREdRYnFNLzNHZ1l5NjJOWlM1VnQzeDE4OUNJOUFUYzFXbUU3cHphUmlqL3Z0Mm13cENmN0RNTko2OEl4NFFVRUd4dXFvelZDc2FBZyt5TjJPTk1UdWNuMkFKR2lVdnBjRVo0RnlPZ01XNk4yTkgvQlpueFA5WHE3VnFWaU5WWkFKcjBoclFRTTU0SXRTY3RrWFJ3c2JQRkVzb25RcmhmVVIwdGwwRWlMU0N6YVRVWldZUnFOSktRbmpwWlg5UWRZV28wS3dNdmhpbEprRllIZmxDenFWNmErV25jdFN6YkZubG5IbzE2SklhOHc2cjRFcDNITm1zTHF1QlU0NVgrRUZCS0hJQXUwZjBpY29kTW5GeFUvOTJHZFNERDhyU2FoR216NnV1TkJCdWFUems0cFFSM1hEcjhvd2ljNG52Z1VtM1FxaFc1MjZHTjgvYTFDL2g3M1BQZERMSytlKzU0TngxU1g3RGVTZzhjcUlHVmJaWE1EMWhOdXBBU3RwSWJGWDkwL0V6bDUvSHlBYnBRV1lMQTRqTkNyRXc0YzBIQlp1MUVGQmNrZGwwZ1VtUHU1LzU0L1FBa2J5N0VkUFNzK2IvTXIrWUE0U1drT3lsTzBONHlLeUtPbGFnZVB2SThhOTJQSkNQb2RLdGRSRklpY0c0R1Q2N2c4UGh1VEpmK3JzME44QzNlWXJwK3daaVJzbURza0RWVkFPdU5kakFIWDB2UU0weTBIVmlWSjQxZU9neVRTTzhzaEdWVENuY3FtQkZScm5pZWxTemNtSnpUQkxQZHNJOWpNU3hyangwS2dWd2hrZE05V2U3NmxLQk53TW1CeDlXU2x5L1VtYXM3NjJuTG8rcUtXSWFHZUFCUEFXTHNkODc4dEN5OTVuOGgzNVdRWEpCbkZaQ3dQbkRUZzJmNjRkaFkwSGVHOWtXbjkxU3NYNEswVkRBbEJTR2JleWd2VXRvVlVVZDFSQ2JwVnZXTkhTaDYzTmp3TzJQdGdveUdqMTFvVmJPR01HMVVITEhPSFMwZDE5RmtuYlU2MEg4UWRtNFhONFJycVV3aXM1Q3U5NXZQM2RIbEthRWVHK2xBQkpJTWxnMGdIY0l6Z3FUQmJjeFRKd3hGdDJ1d2dmdWx0Z09UQ3o5bHBuRllYMG1hdDJoUVlUbXg2T0NyK25KZ3R2ZGpzMURsOGJBUEdtUjE0OG44Rkg5SEhCN2d1bjcxbll5VmlYanZBeXhKMGJaY29HOEpubi9YVnlyVnh6V1dQazVwU0hUWERYamNoLythY050SEpxSFFlKzBlajl4dXBJY3pRNVovZUpkRVM3eGlKS0gxL0hocHJCMFNGY21aeThoT3pxR0R0NjczSnVzNHNDOXRQQ1N2Ri9ja0p0MnZFTml1bFcwUCtwdEF1MVN2NkRZdWk4c21VZFlvdjNjZzBTZmRDSXNRZUpZdk92OUNxcGNueElSYVdiWjhEZzVBcWxzUzY5MFQ0cW5nMDhkNlhrOWliMC9OR0hrR1Z3VU5CSnU2K0dmbmMwdnFkTXdQRVhVeHp0em5NUjNjb3VQYUFyREVIeUpRVEU1YjZJbTRXaExqSmFWMUpBUWYrNFhna09YK2hYT0doRTExY1FtdE5TNHJNZk84a2NDU3IxUDNCL1VCcUlhUWp0elRsWlVNazRXZTloZGRGMXlhNGVocUZ1RzFVdXl1a0l3U0RwWk0vS3dyRE5KcmNra0xYYkl2Nm4yMmZ3NXdUSWhtd2VKTVdXak9vWUFTZ2xOSitPK3hJdU4wVE9mQXc2Y2dSNW5zSytVd3dSbUtTOGxNZmdOSmMwZG53bk03K3ZzUVpaeFYxQ3VYMnl5YW1ERGlySnArSFRjdElIOHBaZ3BrZkpTV0FuSHZ3U3ZLU0hrYkxLaGtOOFVVZGN2dWgyblgwWE16UVFac1NkSFFVYy93N0YvZ2xGRUdXSHdGM0ZYeHc3MFc5Z29pVWdoM050L2lGSGYyOWJRNSt1Sm82S3FxQ1AwWTdRTjg1NDA3cGs3blg5bC9YUEFQaXVOc3J4TmVtcGt3THFxUEp3MXpYYVpYcDF5ejVMbDlZeE50Qjg4MCt0RjNaekMvRmp3WjRSWTdEOCtoQlcyQWxWSGpBeWFGVkpueFBWOU42c3hXa3BXYUp6a3JXb1Bjd25hdTNrc3pTcHk0MDR6cHFLeldYTzBOdEFSc2FzcDA0T2Z0UTRtaDA3S2cvWS8zVmJiNUwyN05WaXI2Z0lUdkU5dk9CYmZFSzNBcFBVWFRsbjRlTUFrMmNsR2xJY1JLdUE1YjBJZkdPUC9SM0xTWVhvZ1ExZlQ4bnphRUdSNDgvOGlka1Q5NG1wK1oxT2VyRkdqQ1dWMUxQYXZHMHlQaXhEK0F5cDlSUWlmMTNxcTZobGFNS3pZMlRzOWpiNkhDQlVhWmJMVzdXcHVqNWhHemU1c2k3OGc0Uk12SVlPdVRaczZ0VEE1TDI3V3p6Ym5wL25ucHlOVzBic2J5N2l6UE5WaTFqUnZWZEQxVXZkbjhUbXdXU1lud3B6ZkloLzdhUEVrcjBrcURSSnJTWXNKM2I2M1B3a2xWekowT2RlWEdCTEkvcHQyajI2Y3VVZG5DZTZpR0hlLzZad3Z0MU8vRWxmUDJ1VWlDMS9XbnhtdTRoME16RStXNDFWMW1rMDFaQmc2R3UzNWpwRndWS3JJZ1Z3L1lJR0hsNUJscHRlNWEvYnVmN3VaZjRpcmNTNVMvdm1zTE9pRkJuM1V6eGMrVElrUVNPUDlOY0U4RzNuTHVLZHRWUlFZYUJLWnJoQTNCT1dPZnc5eS94RjRXMUJxRnhZQjl6Z1ZVeW51d3hkRHMrT2NkQlI0VjEwdTNEdUc4L2g4SzFBTTM5V1NnRTdoSWp4NktrSTAwbE9NanZMN1RFT2ZzSUhESWlJZGtTaUVsMWdkRVNweWs4bEVLbStxSmVCYWEwNHU1VU13RG5uYWVYVktQRzFXbVlPanBKeWRad1Q2QVIvUFRUT2M3eE5kTXJiSlNjbHdiWXN6RklxK3Z1bmRXVWNoa1N6VzdqcCtNbERMRDNrMjlsSFh6N3RHWVFvMEtLc1ZOVGVzdllyd3NqT09FeklVVEpJdmlPMjhja29OaDNJdjcxa3Y1dGUxRUViNjFiS3lsMzYrUjZVZlVHT3ZLY1BnOS9QeGdlaWljbC9zdWZCeHlQVkVTbUN6RnhDUmtlRFoxL0Nhem55WEhmOXE0TWVudURrcW1BNU1RaUZteTVyalFKazJrcExleEhhTEl0c0ZReE16NXZURU0xQVR2aUFrbkdFSmltV0JHL0U2cUlTVEE4cUNwK05zQUw3SUZpSWtVNXJRNEVlVC8yWFdjQzFCdnZJUHFydFZWN3lNaDN1cXhvVi9ZamEwSk1SQnVRR2E5S1o4cHhaRG1qa1pubmlDZkc5QjNybE9ISXMxcEFGaWxyRWcweDZTM1dpREZZODFDcHZJMTI3NDBVWW9wYXZtWmg3NDN3MUFGenRWN2pzU0prRExEVTdGTk8zeHhaWjBSTjZ3ODhxMmlsdlJjOW11ODdtOU8vOUlhS0VVN1d2UXFBUXArTkU0T0hPZGxmU2grUVZKQm4rY1crUW1HOWlodkFnYlo5b2xCcXhqSWUycWwvTFhySVJOdTRua25tdW1FTExaTUd0aG9QSmFSNkhLdmUrL0lQSlNDc2V6eEQwcHNvbzJjT1BsNmxVNUhsby9oeWxyazFnU1QwR0JSbitqb0FLSTFhaVErTzFaRHphN21aK1R6ZnAvZUtBQWcrRW16UnZCM083TGJPZ0hEbDQ3cHZoTVJJblQ4NEJ6VTJhVFpFV2pMWDQ3UlVmUldPdEU4Y1pwN05hd1lRUVRKT05WVEt6Y3ZJWVU2RTRubkVML09IMmlBejA3RkZWRmkxYnlCQkpveG1GcERkOHZxZDJueVk0NXhMWEN5UmZQZU00akl5c3N2cUovdDV0ZlJyV0VKZEphQUtHd0F0N1BYdUxqdkFWTHY2VUpLTnAzOHhrd24wdys0bW1BQW51Ly9NMm5NMFRweU51TnE5c20xNDRCa1lOKzlvTkpHMXRjOGVTNFg4Q2c3V2IxK0tzaWlidXNSemM1azFXUlU5Q2R2YTFldEhiYVYyOS9IMDEzQUw0MngyOUVvR1U2NWZoeWNLR3FOUGk1VGNTTzJNWEF1QmVwdWZRZTRIVHZqWVhpYXdPK093cDFWSXpIcHpuTk9HRytyQ3RvVFNjajNiTExib0UrTEdQZWs4U1ZuVVdWSmdyaXhiVHpTYm0rQXlIT1BHMHdiV29QU1A4N0d2ZWlIK3ZJK2NOdnU2clZFa2srSjJqSHd2VTJUSTRUb204SzFRRUFpUkEyZFFOZkZ5QlZpMGNhY0FEUUIxQmVveGVVUjRNd1hqYnQyRjBKQ1g4R2ptYnRQeDBFOXhHK21ZNlVHZGRZSzFzTnIzUHJuOTUwUTNFU2w0aldqcU5YbG54VWVTS0szQm9kdEZacTE5TDBDQXlkVVVXMDl5SzdNSW1RK3RSU0lWM3lkNUxJY0pZTWRvYjhvTTFQY0Q4TStwSXgvZmM3QXVQcG5mbnZkMWtRai81dUthYmJjTFNVcUdubXNNT3pqeW5Ga0JaekhoSEVSNnNKV0FjTGRWRWdSSGMwanErUHNFaENQdDJ2VXdkeVA0OVZnTENJc2p2RzF5TkF1cVdTeHk2R0kvOGVXOGxCVXB5UGNIUlFJcXlZcjZzcmdVQ0RqeS9LdHpZRlA4MEFNRkZXb1dTVzBITUJuZ0ZSeFByNmFkSUVEUWxHc0wvK2F3ODQ1cnQ3WFovTGlxWFZYUWt2VHQ3dVY1VEJPMUJ3clpXWEJobEU4ZEpnaXh1NW1VMERYWSt6clhyMlladzVZVm9NTGlFM05XblNHMTJlM214OU8vUUg2NUdIUmY3VHp6WW52dHgxeU0xU1cvdVQ4bmo4RUZKanN1NnloSlR6SEkzb21CclFqcjhQemxpR1dDQXVhVzJvTWpHZnp2bDhJbDdaTEFqTkwzZ3hiWUVoSy9uc2VZTWcyZ2QwMmR3ejA2R0YrN1JCSlJWM1VCUjJvN2tsWDJqaTA4eXNrNkNueUZqNEt6MWgrSWxJS3lDN0JmV25FUmQyUDAyY0YyZE5KNmJFTEhyeHRVb3Q3TVRkNFJZSVhnNGNXUmlUMzk1Ym5nYnpZZnY4WnpkZWR3MExLYXRtL2oyQkkrL3k3TzRaS1NDSkt0dFplZndmbTM1MERWd0w1QUJtcnFWdjh2enp1T3VmSWpSNXlURm9nV1Y4OHRVdytsYzBsdlpSRnBGTnBuekd3UFMwZ052eG8xVE9Kd1ZRei9PVzYyV2Y4ajhUbFRjdzRqR1Y3c0R2d2V5MjdNWDFobzRmdGkzME00dENQT0IrV1NsT3FoVHhDd1dtT2xVazZvQVpVQVBsc2tEeHh4Z3YyZUhFR3g0b05sTWZSd2VRdlVRRDJtejY3aVFIeE9oVUd4QjZ4SFpFb2RqSERldHM2UnhoSThJaEYxS3dSajFnTzNBZms5S0FmcHN1ajE4M1YwenRrSEQxekgvU1dLYzcvM2daZStyTEZOMmdoaGxoL2IvUEtiK21abGswM0tjUHB6Y1FxWWlONTlYSFlaUE14Q2RTWDVoV0loRHZIbUd4UlhBcDhNQ0t5bDZxd1Q4bEQ1eWdSbzkveEM0bkh4eFJtK3pEc3lEdG1pK0djaGR3NWNSQWY2NjlUMGJmVHYxMU85ZkVkUWhBRzB0RGJvT1VXUjRxdVhEdGZDVGxhNXZ6Z0RrRnAybFdEMWlJNnRzUW5FbnNFcExhaXFtcEh0eWVqTnB0ajRqUWJHNXBaZ2tnUkNFcGozaEZiS0h4UGVubWl2MzFVdmlEbklGcjdOTjhoeWpkQyt3TzZXbGkxcGpkdXY2TFc4M3paSkZBdXVtY0s3TlVtTVNRUDNlWlZ5Q1V0SHJFdDlkNUlCSmY0eWpGaUE3ZTZtdnB5UnBSbCtMYW5BY0hLTWp0RXl2Q1BBVEh2UmtxcllmRnNra3RVYmVtUzd2aE5TOXBxZy9yMEpxMUNSZ1hialRmV3ltdXJNSHZldEhNbjFYWm9EclZQNGRWYllVNXdGSExXMmhGM2JzQi9GTFg1V2NnTXZzZnpDRmZVaVhoN2d0YVJ0TlpaV01iNTkyeTVCMXpsRmY4STlWVVNCSWpFcDZCejBFTmpxSWMyN0lKdmtOZklLR25yaGR1VTFOcVdHd1JLUDNTR3djMWRYTlRRekZpOHRzSnRLTnNvR2pNVXFzM3Ewb29hZ2RtdUlIVFdBNjVPbWxMQWRFK0E3TjhLN3FsVlB0eE1tWmIzVE4xc0hQSU1DS1hndy9iTnhOZzFCTGxzditHT3BFKzhzUlFaaWE4czdqZmR0SkpubU1aNlFweGlqSTdsM2I0QUhFaGJiRTBRWDBpVXhIYWZuNDUwVUlxT0xFYTd4eTd1M3o2VG5XaEUrYUhWZXRRVS9nMG1OKzMzZTlqdi9DUnpBUEczbVVGOWJ0a0Q2aHB1KzQxdVd4YkYvcGNSajR0NXgxdjVvbkUyeVJHc1JGWFhZZko5MVo5dlg0Ly9SWk9lcEtydWN0NlY4MVJUa1B4eS8zNGFLcXBsVVAzT1Y5UnFzYXpUYW9hZGNtZ0RvaDFEZUt5dEdPanlwSGhNS0Y2SGt5NDNUdVR1cGdMUXR0VnFtRU1Pd2VhR3ZxcEdCalBWS00rQXJndDNWN1RWU3VhY1JRbnh0ZHdmQm9tMjBkeFVwcnJHZml5Uk5ZZEIrTFVRSXQxNmgxQ0l2NzdUaFBudkpwQzhDQUlaV3ZveEZ0aGJIWkRFVEV2YUlEcEQ2b0JpaUtjT29ZU0RwbmJhemY3c1NZcGQ2MlVJaHYzazh1VVAycW8xOFhLdXBKdCtDNXdQMXM0MU4yVFRmOXVyWDFZVGFOSjFJNWRNellKNEJlUnQwY2xkQnV0MTM1dkVxWlFHZ1ZxdU1OQWdUU1RtUlJlM1puZ1k4ZWJXN25PcFg2emJtaUtXK1dIQWhLVTZxYXVnZFQ3a295VEJvWjRLZlpHSnZONnhabUtmbE9XakVOZ2ZWRU9iU1JMeldWUUpjQTF2QlZnaEM0c254K2l2NGNzdzRPSmlKYWhOME9YU1VrUUUwYzd5Z0dXU2dqWVNDTW5EUHJiMTk2R0dTd0M5c0Z5dXRMMDIwc1F4c0trSnM4Z2JoMlNXcVZqWnY0V0FtdEZ1b0JNQ2Q2eGNaMFZaT1RDRlNXVnZWRmVkR3I4cUtCR3JRT1lIWXhlVDc5bUE3YlRNdTZ2SWZNYVloYkJCWWF6RkhSWERsODBiVjVvc2d2ejhTVitpMHpNODJ2RUhJcE9BaUY1Q3VNZ2ZyWnhUTm9iLzRCc3lCZVZKSG1LREVqcFFaNkZBNFdiRFhVUUFzTzg3bjAvNGg5ajVPSzRlUXNBMlFac09BZjhnd3d5blRPUWN1RGxieVREb21WdEVnL3VuQTQ4WCt6ZW8wVmpzQnl1ZjBTWnRDUksxcDVRYjAyRUROek5QZFFndVp3elk3Nm5yVE9TdnEvbUY1V2dIcG9jZmpOMU9DdmdRYXVJeDJ0THI2Z1NQOG02N054cjFJR2ZGNTUvK0tDM0lCL2drSmQxbTVqUFh5SWIxWjB1aGtNUjhkeXFReWg5VXN1SjF6OFhTeE1EbWVkZytXdFhCR0pWMitwZGdlbDkwTWdIWXlLTnh5aHFBbkQvUjdialZEVHZ4K3prQ29BdENqYlR5ZEpGallnellmU1BFUVNhVzVkRnpZbkYvU0NSRXk0VlhOVEJZVWZGNTJyZW1wMjZqYVZkZ2lwWk5KVEdKOE91WUlNOXZlc2VraUoxQnMxV1lBMUgxSDZva1puMkN0UjJ1bWdoMzFiakF1N0hvTmY4MDNTWW1ILzZPRVFMMG9tb0tRb0xPeHJIZ0VoMjRNY0h4Y0p4eFI3eUJoZXRnNHBSTEJ1OGQrYVdNQkUxQ1RoeFkvTmwydUx5SFdxQ3QwWEE2dzczWDVUeUV2OWdKOE4yZysyOVNITmZlaEI2T1lPcWx1YW5wd2thYWFOR0xmbDZQb0ZKWGhWOUxLVG02Q2syZ1RrZ0gzZ0M1Y0duRGVtNFhFR2t6STl0YzlQenlPalJTRG1mZ0d4N1B1ZldCeEJ0dlc4MkJ1ZmwrMHNwTDRnelRKU3ZrcGNUOU12Q3FjbGdleW9CVm43L0xZYkNGRExKWDZ3U01LdXZObWNPRE9MVkxzUXE2akZPbkQ1a1Q3Rlo5TlpOOGJySXZibHMzU1A1QXN6Zko3cHdnSjZpL2dBSm1zcmY3ZGxLWmNFKzBOby9pMDVwQ2R2Qk9QWFVzNzJubTNyaFI5Z2xNRlFoMitqU2pnQm9tWGNLWWdlMnpzYzc4bS9aM2dWRWFWdUM5YnpvbTRzLzZQdUFwaG5sYy9wanZkeDh5aTJERUh5UWVORlVVRXVjTlFpNmV5dkVnVlFyeXI0V1FDeWNzQnhGYlg0V000N2pGVHJBRGpnL0MxWHY2VzBGTjhHNE5ORVFYNEVJSEd5aWR1UDBDSm1wVFliMzlUbGx2SnptSTFFelVScFVheUNNM1VhNEdqeDBqbnd4QzBaSDkyalZHd203YmNHRm5LbjNiQ1BkSUY0TzdKeHp5dWwxV2ZXMHZlNXQxb1JPRE1DS2dxTlY3empyUy9QZzRHMTNEN1M1T2xhQkJoNXhrRElEcDRSVG9yRmxiUnAvSXBmS3hGRE95WXp0czgvdmN2RCtnc2M5RUFCSlJGK0tRWTJOd1FrZS9KMEdRREtMVDVaOVc4UHprY3d0cnN3dmRESlR1c01DTVZWbzNjcDltemNydFJtZmFiZjhVNEplTituNDdEelA1a1hYL2sxYXNkKzJJR0gxWURPa0FQR3Qzb3ZaRjBKYnJWK1RPeUE3VGVHeE90ekp0K1FXSXNFdS93Qk16YzFKTzAvNitiZXVUTnRBVU5PVlNpWSsvb2ZlK2RIZlIrS2RxTTROZmJodFF3clNteWtYUXg4KytrSCs3amoyMWZXSC9XUW83bFlSbTNQYzR2T1RSU216TExkVEJxTU1NY21UbmdiZFhTZSszelU2L3hNa2ZQUnNkTHk0WUFzalZ1WDhOdWhPWjJKS29pRzR4VjZqbkdLT3BGbXhnUjI2ZEhleTdyeUR2Skk1Zy9Td3NvVElVRkdOTDY4TkcxVkVSYXF5OEU4d0pBc0t0dkp1ekM0dW1RNkdYblVBaGEzdXNjeEV2cndpSmdOejRIeFpJQnRFNTJBRVpCR0J0YitPY1FoMkRLVDZMWTk3dVJuVEVPOEpiczJzaGMxQ3djQXZ0bFZQY2lNSWF6SSsxanExbHQ2Y2lmdUVldFVpbmJhL05YZ3daR1ZzLzFmb0g3ckZvS0R3eU1RRGdxT0ZEMk9pUHZGR0QrYXh0Nzgvc09sNE5TWTdqZnlQTkU1VDd3ZFhWSEZHZFBDa0hUbTNKNlVjcFZST293M3lLbjFDZDRUWUFGR3pFaU5pTW5OS2t0VG9VM3cvcXpud3FtaTVVaEkxS1FLQzBGZlQwN096RlVkbkF6cnhkcVdOZUs0dlZIVXptU09zUXV2NjFsaTArWjhlcEFXc3VaL1NaU1hVVWR5dnZaT3hqamowVkduWFZsQ3E4MFNlbkxPTTh5dU81OXNZd080d2laWW91aVRlZ0lZbTdiTis4Y3NISW4ycVJmZTFQODNVNjExTTUzK2VSbEEyeFVQOTJaaG0vMmEzV1JVV1ppRU5GSHNjVnluNEppNnVPWEpFcE9EaU9MekVoVFd2dy9rN2NwYkxIUFlXbDV1Wi9ibGUreExFVk82bDdBUlVDSDY1cDJnOVNha3NHM3RRTTAzWHAzdG9LSFFlUTk4NWh6ZVJWTG9Wck0vTThhOHNuazkzMmloeWY2UWhzV0RhOXhzRFpyajdObHNwSWp1U1VzbFZWcjFDN01kMFFTaitXTW5ML3lnOTV4Wmd5SFFhbGZEK2ltSlhybHVEUDY4V1ZkRnA0Q0ROTDdWZk9WRG1NNEMyL0hoTDQwV1gvRTBvNDZDQ200cHU3c2VKblJadGlBTU9Ma1hJTUQ1L2pxT2pSY2I2WFZCRHQ1U1dVK1lvUXdKYTR2czk4UTdUbWxQRC9WYVR4UVhQTlBKdSttMnNob2ZDTzVIYlZxZEVOUGkxRXlRQ1kxcktZSjlSZ3VGM1VWbjdlYXNDNFoyenlsdkVaR0pVSHVTenNMdU9GL3JYUExXUFd0QjR5cGFCNkx5VU5pZHV1Ujc5MTBhQWhxdDAzUitJWkJzMUhHUEtIUzlLeEhMQ0R2cDY4L0NjQzdXVXZzYmpwUXpwL2hBODhuMENhSTJJektlWnl1RHZOcm9hU2ErZmtISS9XN2N4elF4dFV3STU5YU11MnhQeW9mOWoxRnp4clJnZ0lBWTZRbTB5NWFXU1FGNDBVUG55Z2R3ajQvU3dyZGtqcVBoL3VEbk03dDZlRU9SbkRkbi9DVTBUQ0U4RFZKbTV0K1RzaUEwTmhuZVJjTmM1WDFoTW1HS25pdlh3bUlXQVdNZk1FczZVa28xTDBiV3loWUoxNHlycmpvbGRSVlh5TG5VVFBpeHdrUzFTVmxNV0hvd2tVTnFrUFU4Ymh6VzN0VDQvY3d3YVk5dEkwdHZORVhXMitTWkdHeGRZd0Y3TjN1ZElQcFhjczBWclp2R2lUaS83UlBVd2hGcmRRdm5rZ3JtQytUUkhoN2k5eVpXOTl3aDlSZ1FuOEF3NEY4UmJNNWtvd0J0VW5NaGYxYkpjQ2hTNjFrR1BDZUZOU2FGSG9SSVBFUlJ3c0NxTmlpQ1lGOW1DbW9sQzg2THVVN3VOc09tR1k1OFozaU5OajN5UzRydGlCMU92dVNrMC92VDViTmsyYnhWVytMMHBZWldaMUM2L1NhZ0RFNWJnSnFEVlJhYmNtMEVHaTVqRlV3TmNRNlREQ1pKVDc3L3BudFMwb0JEczkrd3EwbUJTeENYOVgrQzhNdDcvZXgzd1RxMlBHUjAzdXlqdmMvNmV6a0lYR0gwMUlhRDR2V2JRci9iQzhhd3VMQTdRVG5VcXBjaWFOWVRvdnhDOGZYdCtsWFdlVllkR2JiVlcvNEtmSFpHK2dJL3Z3aDJ4bmNwN2Rxby96aVBVekVNT3VoeXBZOUNwMElSNkpMalVETW9KdHdKZTBGa1ZHV3hiM010NFdPL1pDQXZSc21HdDk5a0tJdVB0cnUzTU9abmQzQVUzcVJTb3JoVlV0Y05nL0s1MVVxSWgyZjI4QTk1d05Tb05lRUZIZ20zNXZ1Vjg1UStUejEzR0JRbm9sUVU2dDFubHRxMHU1S085YWR4TnA1Lzg1Z1NMZ2FBLzdnS1BnckRCdjNvK2k1a1U5RmU0MGdLWGlycEozZ1NkMHBjTm5MTUp2ZmQzdXlqUmtRQjNWUGJ5SmtyWVpaVU81OG9EVGZuU1g2VDJBVE9pam9JTWNyMXRMdjh1NmVEcFhNbGhoM2FwQVE1QmF2RjZGRmw3bnBXRDZVQkRCemYyYXhxZnRRTGdHWS8ycWk3aDdFUmZjWm5CZkxZU3phL2JjZXVPcmt0b0tONTFhODYxa2VZQlRvczJUY1hHdVdWNEtoMEtYUW1HVG4ydWp3ajlwSXRYWjg2RUp0c1N0aWNGenh5MXRKY244cDUwQTZHYVNSYW9ZTklOdEJ4Z0kwdE00TFpNc2RiWi9xb3h3YXJIbVhQai8wb1loTU5ESEltQ2VHL1QycEQ2MUJVbENXYVdmYjc4aW93eVAxYVdaNlZXbWtlb1B0VEdtb1I0MW1WNGJnT01oU2JVRlkrZkdDbUFYVEVuSzRic0FEUXN6N2Y2TDZ5SUNmYjFDUUJra0pKd21LTnJ2bkdTblpJRUUwNTRhTEo2OXN4dElEL24xZlFkQWg3SUJKZmlvWWZCUjlER21sc0dCYktTaDNTQ2g2WUVvb3lmOTlYWUNDTW9oeDlwanRTWXMzSkI2S3hLSWlvUTgxWm4ybXFjQ1puc25YamJjR0ZPdWRXcC9KOUMzZ0l5TjVmbW5zMWNsemhUUlU1MHhGdVVnbzdUeVc4UDRFb2l2OXhlL1gwZFRGZE52WDJHL0JXbUo2NnE2WkV2YnJKR1ZyWkkxcnAyNHh3Q3R0Ri9MbHZ3VkJkdUtTV0ZDSzNJUUMrL2ZRU3pzd2FITURuRjRvcllmVFpBM1BUZTRtTG8wVWluN0lFV0JoODYwRE5kKzVtR2M2WXNGbllaaG5iT25TV2VYUEZDbEVvUzFBTVc1K0ZKTWdSbmt5d2padkhWVmlUWDhuaHdpanVZd0R5bjdQeW5kVUVDUWFpL0FjY3cvb2w5OC9zeHA4bGZQQ291MkdGS2JpVVFQZVRhUVA4bU1kTHdjYXVlaGJ1Tng3RlJPRkRQNVp4NmlGWmZ4bkIvUDZNMTFBYkMxNDdEeHhGL3JmbFQ5Ylk3eFp3VWE3MVVNNXgxSnZ3ZTFkT3BMU25pUTRZSjNrSW5VUXNwQ0hVQm84bGNXdThNbTRMZU1lMk44OFZNU1B2Qy9PYk1oaFpwUjdIMnBqM280UTZGUGVPbEdWelpJelFSYzNNaDBOM3Rkdy9rdXhRQjBGRG5OZUlIQTZ3czFmVVIxZU9LWmR5QXh3MENxTFNIb0YrejJjbFU1UlJ1OFYzMUdOdEhGQWNmdUZ0YUF3TFdYeWVlZHQ3UmE5ZnVST05hMFZ2Y1NRSUc3bi9QMDNxWitUMDUwelUyazBLQnY4SXBJRndTWHg0Q2tVbU53TmZ3QlBIbmJMckkrNzVWQTR3WDZYcFBiVTFjQWcrUGUvNTE2VHRwZnI1Y3hlOWlmZkFVaG90bjdWQTNPcVhpdGk2TXJXVE54ZWNPNlhVUWRBa29sWEpBSlNBTnhYMnNiUDgwZVZsa0lIZERESmxVdGg2KzhKdVhuTXJsM2ZnZnhOWUdnU1diMDkxYk1NUDRwMVN6WHBNaEVpVy9mZTdQS0JvMEpaczJNUHlBdzRkU1dFYWVzQ2lMd2MyWG9FNS9CdG5MMmpFUXJuTDhzNXBrdmk0K3V6QlJEcXZDNG1ZSmgyeDI5b2FQRzlobDREbThqVlBsaWtuOUNPMzI0TU90ME1aUTNlWjZpcC85SHJFWFNxL0MvZmNJT1U0Y2ROUFhHdWVxbVJzS2pkdjFzM2JkTzFZWFFqcmcxUjZDb3k1V2tlM2Fuc1o5bWlBRHU1Y214MWU4TWliTHorOTBBOW8xbSt1ZUpTNGpnQWd6blRBQkpqOTlaZGRJb2F2Z002UkYxblJxZC9CVVNMWFVVK0c5UGc3SUJ3ZzBVbmxXdDZOZHlJNmdqVHgrYWlNM3p1UHFvVll5cEs5SjcwYmdhL3Z3NmNCUURoekFnaVFNOVV1RU1wN3Mzd0xCRWlPeFAxVFgyUWNtNklYNXBudHAyZmF1MEtvcWVPY1VsSG8vWXRtMEZNcFlJSURGL29jOHptUjE5NVg4Mk1IWEtCMnoxWEEzUzVCZGVpQWdJNG5UODBkQk0yTnVwY3B5OUhOT2Z5LzdDUTlDanF1ZE1yUjZmcW4rbklld2EydTNWWnZqbUF2cUJkVlJOT3RabUk2bGpBMmljd2F1SXhBZWlFNDJDYjdSTWpXdE1RR0JUUDN4dE8yamdyT0RpU1E3aDZQMFpZTmJvSlhnbFo4Y2hWK3oveTkybUJOQkNycGxqUVYzVGhwZjJ2RDJLQk5UamgweGgrWnoxSFdYZnNEdU1GaEJ6RHBrS21IZ2hGemVPb1JBRk4vbDFJR0V2SExPYW5RUE8rd29yV2R5NFVYRGtUelpOdGtpOUtmblNoNjhqZWJHTHZlTzl1K3pQK0wxUDd1djk5OVlzUXFKbEZYTWFsY0pmdzROeE9YT0FRdk9jYjFjcHBEMVFhOHM1T3AxMHdUbjZsdmpWY1YveW9XT3B3c3BqVDZ0UmxtbTRsUDFjbzErcURXV09kRU5QekpnMFhmaXZrUUhybG9TQ1I0MmY4TzdSWTRRa01oNmJBaktvVFEraVVBRmtxb3Zvc0JkRDJrZmF5QzJ3TWZPSGNJWnM5WWNKSE9Ib2E4T1RwZlgrZUFpUE9EZFZ4QjZKRFRHUFNyaXZmT1JjdUt2M3dUNzdBZDNxeTl2bytabGpvcWVKNTE4NHZ5cFR6SVE2dXRZTCtvRm1wWnRpN3VZMVM2Q1VLMmVyOHN3ME9DYWF0TE5FVXBzREQyZy8xSmUrZlNOdHl0eWhsVndweWpGVTByVFNVZ0Y5a2ZuL0NQNnVFclNvQTR5SGxaVlpIeWJPQS9QYmw0Vkt0SGpVcW95aGxyQmMzbWhBNHVSandJT0RHLzlFZnVFTzd0OXRUb1VnT0hZODEzVEI2b0F2NDVQaUhlbWU5L0FUOVIxelAxN3g5VVpzZEpxNlBKQnQrYVpXNnpnc1IvNVpWNXRQL1dWK3ZJZzBOTTIxZ0dnb01URlFYZGFJQmJ6MmZJNkxsY0gvdjBGUzZGODBNM1Q2Y2dQQ2NON0RTcFhWMjM1Z1Q0Z0tTNHdwdFU3S0dWVzFRRnZDQ2pZZWcxYVBrSzFwa0c1SnpSb3V1WWR1aWtRZzFzUWxlSDVsVkdoMVQ2bytWWVZVVDRIcm05RTFNYUxYajlweHYxZEdHaEs4OTRMUk1aVm9vdzBTeEdDdVNNaGhvN1RST3puUmNGT2FBRFQ5RzNwTE1oc1JGeml6c20vQkxHTnkxbHRoeklEbmRSTFY2TmZTajRKYlZLc2RkZDM4L1ZDL0hQVkpaTklBcUM1SGh0U1V0Q2pWSnlISno4elBBTnVkWDNWU2FQcmp4ZjhuU0VVNHJISm9TVjZuTlBaSDFvZ2MwTVBGbmVreVFlVmhic2FicGw3c0VqR2FUdWZyUHM4UEVGVzFQc2N1OVJGR1NzaE1JR1pjRXdRMVlMcENCUVByN1hUME9vZE1ZTFZZek5XdmtFd3RHM0UzbmZncDFRNG1zS0src2I5aHc5UUJPUGNGYnhEUWpzUGRVRitFVnpaUUpiRWxYeGZudGNMaklSSllKMkl2WFNMZWdVWXRnNmtETVBqRkpzalZzUERibVlzL3hkSUcra1BmNWU3Tk83QjNoaUZObXhoSkh3KzAyMUE4U0x5aEoxTEtXSWlTVjM1L0s2VGxRUStyT2MwcDgxcXpjTCt2ZUw5WmZsYVNLeW1yMW5IeEZoZTFHaHA4Q2FVNFg3dTEzS2UzdC9yK1UxQmM5NzlETFIrRjNROS91SGM2VHZ1bld3UXNXZUtEMkt2QXMzVW82ZUpVcndOSTFBUXhBVy82L3lFNHRXT1gwMW5hcm1iSXFjSGU3YzY2dGh0TWloV3Z6a1djNytGUThIVjdHNGw3K1RGbXVQSHRCYTVBQmt3QW5ac1p0S2Y3NEtPUnpvSEgzWlFnZjJqSGVPaXQxMUNzbTJOUzBVMlZjbUlVSmJJaEJZdGQ2S3Y4ZDdOeDRUeUNvakwrcWFIWGpId3JIeU9MeDErdFA0RWxXbDRLdzQraXBiRzdUVk1rd2RJQnVhSldiYVVNNDZWQ2Y5ZzBvNVFiMVhwVWFTbFhyRUxnRVQwQU5mMFVJeEF3b1JhQVdTS1pidklKdkxkQjlaOGxRanh3UjEzcUorOEpDeWpSV1orS3JzTU5UT0pnN0E2QWY0clQ1akJTK0hnSE9zdW1ydENJcko1Q0I1K1JKMlMwMUtZVjNkdmFLc21UZ0hvQkdoMERpTkZIUkhmZll5bGVqN3lPTDdXdThyR1A2WW9ac2FNU2R1V043UHJzdUpQSGdUSitRclNwNXEzMTVZMHBDUVlsNGRlOWJ0VkxjQTBESWMySytuWDEvZWg0d1ZnZHlkWU9JZVE3eVRlbUtENVpRTmhySHUrbFlNNDZDTmhSVWw3Slllb2lFKzRsRWRPOG1HcEwxVEdjR3pKMThMWG8wbzJJb2hGS0wrUHlKbFJkNC9hSXgzUGtSUDYwVDVLVUoxdXlVMXZXbzR4aGRZWFZhcEFMbEJJWWt1WUpEaU1yS1d5eWJRZHFKMTl5YkR5MitlZS9mVzBPYTRZYkdLT3Exa0NFODVCYm5VVmluNlAydGw3VHgxSHBRbW9iNi91Ymw4aFE1dVYxK3gyeGpHeVB4b0ErSnMxWGhJS0M5SFZTRTAwMTlmU0xRUzV1Zmo5OFJVWVlxQUN2Y0N2azRyZVNObTdYNWwxTW55ZVNEdG4vSFhHdWU1Nnhta3A5SXo2U295RDI1Zm5pR0xEL0ZZa1dCa1JvZkc2dU41dHFWbHpRWjgwR29Qck5JODJLT0s0aXoya3hQR2kyM2pvZUxqVUdnVGZlenFkRWttS1hFY3pjaURBYmRtUGVxTnNaenZxbWZJZlhiUWxTK1h5Qk1rR0N2TWU5WWNHNG1LRnlSQnlXNUYvbHF1cDNyMGZob3dXSzZYR3p2YmlDUzJNYW1wZmpJdjV2SmpTK3dHd2FaMDExeFpxZE5sbFVMUGd4QmtCT085Q0Q2b1M0NVJmcFV1cmp4UnhINzhsSHBvTk5ZLytUMVZlQlNvMDZuSHJ1WENPUktJdE1YNkg1YkpaYlhXWjl5T0VWYkc1V0hXK2d5SGtwdEk0QlRsTThmYk94SkRYTGxRTm4wd1lReEJvbThHcGlXS0NWNVU0VmNMWitFb0c3YjJzRFd5dG1vQnFIT0NEWVNKd2svWWR0cDBYd2liUVVOMXpTeTRZWGdmRHRwN0JIcFNXb1I1THpDY1pabzlLVlFFTTlvTEFvR0krU3EwaHZhMGJ5V0xWWmpBOWdpa1pHa0gwMjVOZkw1Z1c3N0RiWTZpSGRvMk8vZzlCSVk4L296bVZyeHJMSnVaSnBvNnlIUzJreVlMY1o5WG5hcnpNcE8zWkFZelFBanlEdTFUeis0czJaR1VWekJaRjZTQm1RSnhaNjRMdTJibUZNMnNlNlE5eklScDBLNG1iNUJLWXFKZHFlSEhhYWhRMFRyWnFyNXpiTVR3T2VvbUZRTWg2R2VhQlF6bjVFck1PUEpYL1B0WDhvVWhGQXZQNU9abHdab3d4b296U2d4OGp3NFZSbFJSWkRISjBTdUdVeEFGZlI0cjdZekM1emdwaVUra2E3UFd6L1JyRmEyWi9zWGRRZTBZZWVVMFgvTVNBVHo3dlJ6MEtGaDNLdG5HM1JKaDUrbFpsTldBSlNWOGo5SExQc053RzZrdUNVTjNwUCtISThQWVFKWjArVWVoV2dzeTI2S3UrTVBuV0tZRjF6YWd1dTM3SE50SWFEd1RSUUowdnNLcTNPRVRNSTluWmZSUUptbjBKcDhBWEE4d0IwOHhuV3FxMFgwKytFdjBiWlRPZjBXVFZ2aFJpZERkbEVzclM1V2ZxakF6TUd0U2h6VWd3c3NPQ0E0L0RsNUlPM2VlczNnTU1aUHgxZU9aVWpNQWJXZ3NGRHR5amNlVk9mL0VyNE9iWkpjNWsxRDNaUmMrS3lJZFp2bCtVOWx4OHpBMmlYTUZjWExMaTlYdVVuY1h3MHRVNU85RStUMHlxaWtHcEp3RlRUTW1qUUJuc3pJL1BMSHNhM3FPSWVCSExzWUJlZVkxTlNuZmI4cTd3cVFNUFF3NDBmdHJEV3pnUTZpV1lPRjMrU0k3L1pmUFRXOEdXVDlxWTl0V2R5aVRkMDRnRmJQemtwWDdQN0VSdU9Vczdpb1FRZ3lpTDcyeXBlb0E2MWZvN1R6c1FDd1E4eHVWT1o1bXFtWnIvYjBhbVNEVkdNTmFZK0gvTjZ2dWF0SnhCbXNOVkFKaTVDMm9OMTNoTWE1MFlNVlg4ZnFoajlKRTZUcFp4SGF1U0p0ZU16aHVmbXNlU0tzbDJ5cjlOZVJGRFJXcDlPRnhkalkrRU5jSUtNTXorTWViMnF2RFJYbmxtS3NFcHdFUDZmdUdnV0ZxWWhwbVp5LzRvbXdPQU5kQktabWVkN09HRTZvUGE1UG8xZVhyWmZ5UFpjWVpna1dsZW51UnJpamp5U0d4bjl3bGRrRnJRcFphWjdOejc0S25SQ2pETm5yTGo2ZEdvL1dtUE5KeFVwcFBDV3FrNFBIejFmN0JLMUlxZlZPRGFPWEdvT2xkbmFlV2NwSEczYkRvaDlDbVY3c1NOclRaN2gvaEN4bVBObmRpT3hhWTdVSDRqYUl4ckM1R3dQQ0ZRZnpEcVE2dnVkbTN0TDQ0Q1dhTGt4QjJtMTl1bnRLTzEyZHBISkxtc0FicEZNZ0I1L0xSYUN2ODh6SlI1WktCZXZZRXQzSjZiOHprZVVUdWRpRGtUOUpnK3hZMk1PWnE4ajBZVGthbWQxMmpMWktYYkYydkIrUHVCZVJCOWlJeFQ0NDcwRENpQTlSUzExeENxNDF0eVQ5aFAxZUw3aGE4MXU5TzgveS9Fai9KeThrU3phN205R1dVREVDbmxCejJhcy9MNGxnYWQvWlZvTEtVdUpWTURjY2piUlZKVHliM3BhWHRKN0cxYjRKd0liZUhqOERPRnlvekRjL0h0RVp1eDJWWmhYbzVXOW93TXl4UFpsSFFOOE9DZGVBRXdOQ3VGOURUWE9CVzhnVzU5elNZcU1uZnFPcEpwcHVMeWNQRzVTSE9aTEIrOVpwRlVnMk9YVjRnNVZUaUlqT25BakFpSHM4UzEzS1RJUFNHMS9NOFZkRDBhME5zR0hGYmhGKzNoVUtHL1EwN1VOM3p5WWdlM2FWU0Z0U21nODBWeW5pRldSUXhqSXBDUWtta1MrNUIzT3dheldaRTJoYTdmVldZNEtkb3RLMXVjNTZ5RlFnVG5BdTc0dC9qMkxjdW9ZeW9JblBOaElZdVNEV1B4aVg1ZjE1ZmlJYVhQL2hEUGxpUlhhSGJ6QmhFT3V1eVpmV0M4OTNseSttaTYyc2h0aEUzQjZJUWhTbFZiS2tsUDMvNzJycXRRY2dZcEZoZHpnK1NsbVZCVjBObExiclQ2WXo1bzczeGtkdkg4K283eURac0R2TkJyWWhxblAyOVIzNnhQLzEway80VFFBcEZDOHppOFhFS21LQ2RnNjlSR2lpeEhIVEFJYmh1bmpXYmVPdTlPUTZIQk43dXVZSGV0WWhJRFhRK1hqZnUrd1lraENmUllaOUVoQ0hoVTAyU05yL2h0MEI0OW9VZFkzR0RsTG5pQzJxR2N2K3VYQmZRMEhDbnI1Mi8ydk0vSWJCR3hCVWVzMTBLc2VtRnFiRnRhR2JUa01hUzE3Q0k2ZEhHVkU1dm9XMUNSQjB0L1p0eEFxNUtwZCswVGRLTTdhYWE2WE80S0VhM0pwbVE5R1RyZmpjZXd5K09XbkR5NlBqM2lTMndUYVlNeWJEQlYrMVVCR2J2bzJRU0R0blVkdjN1ZHc4WENpNjVmT3lORGswZWtGQkxZTlZScXhwbjBRNEsrVE9oUGZCQ3J1ZjhZUVZoRm5yNmZ4NnBJYmJkNUFuNDc2NEVGNEpINWF3VmIyK1V3TWJDSXNKRUt5MGExQm53eXRpdC80TmpXQ2Q5MDAyQXpFeG5na3ZmMWJVWXZFcFFabG5taFNoQzBuZmpWd0Vuai9TRmF0ZG5qK2JXZDRjM05PdWhkRk4wR0E5STYrVXJJakhTZFcwUUF1MnREV0tmQVhIZk9qaFUyWkxaTGlQZFUwb3htR0l2ckdrQ0NOTjk4bEhQeXpRYjJZK2syQjFOTGp1VGlpOGIrajhhYy93K0grMVNHN2Q3b3EzRG9QYXViSVFZSFczQTI0K3dRM1hjdmt0WERadXIrUGRoUDlYUE5zdFlLTkJLMHRxdVZPNTdjcnBzUmNTNTFSRUVkYVpDSTRwLzFLdk1pcXgxNTdGMVNGNlpNeDJsUldmOURHTUk0TzByamdWMzVoeFlxNk1vVXd4TEsrenBhMnhLMnZuYjNrcVNtVXIrdGdsSENOL1dTNHpKMUxwc2Z0dGttMWIyR1RFbDl6ZGtTYjJJeXNsVGVFQ21EYVA0MGozV2pvNmszZVNjNUVXWmZkOWN5MzgvR3p1WVovTmtISFJndFIzLzhSWnp6N1lkYktUNzJoOW1icVpaNVE3aXQxVDdya2haNkRlN3JiS2pPaUQzMUZqUmhPRENPTE0xN0RVQ3ErWm5QS1p2RzNYZ0ZCUjZXV3ZpRVlxd3pOVWtwMnhIN2hyRzBCU0FXZWM2SW9MOTBxRS9jQ2Ryd0syWlZoT3crMFR6VFFSZkpoVzh2bjRCK2poN0NGZk5mVHEzSGk5RmhWZ3VKcjJkeGlya3U2QWZpbWlWM1ovRFdpMnJXb08zek82WnNRU3pja1gwZ1JWZ2F2eUlhdFpmeHg4OEk3WmVtRDBtNllkUmo4YitqQkV6N1RNb1c4Y291NWRVbStjeTNNYVowSC9WRXR6SHExTCtQdHdIRjhvOG1RQmFnMGwzSzhJWmtXSS84NlgwU0ZBcmdnTlRUV0x3RTFZL0d3Q3I4dzM0VFZpL2VPRUJhVGlVR3pUVldCUkVnNHV3OVRCMENHZkhvRXg0Mk9PdFJ3WW1oMVdDU210V1pkNWV3TW9FMWxjcVJqRERLNlBaeFQ5Y1FCRGI1WlFPeUFhQ3ZXNUV3NGxnS25uZFJmWnJ5MGFtVzE4RzJkaVJYZHZJdUhEbk1ScSt0VTNjQXZBa0E2cVBrUDZGbXZneGgyVEhTWDdhdlFtRDVZYnJ2VnRCOEcrWEVWSjNrWVpXbU81YXRBSzRmdWVVUEZLalZRdjlkNnlaeXk5cVVIS1JhOWVRUE1tZWJIeDVkOTNWMGZYZ0xZQm1uTWdoVEJYOTd3MXZFSnQwTjUzQW1Sd2tCWXgzS21raTFoeExhY2NnckhWd0RtdEcrQ3Z6MnVCTDkrMnp4UDRtTDhPQ1YxWDRDYnhUQmVKSk54Wm9tbXdYQkM4NEFQYVJ4SEFxZ0MyU0dqQVdaSXdHLzVlbHUvemF2a2xhVEJqcXptZk1JNSt3VkZ1b2U2UDBORFFrQmVWQVM4MVJRQXlMS0luTmI4ZlozMWZ2V09WN3VaNm5SWHdJVnRuL1JISFRHbDhSNlFld0tCKzd0RXliTUY1Vmg4bzlidDdKSmpOSFkzbXI3ZGhzd1VNNllxL0I2Q2NHdHYrdU1MY0UwelJlSHlYaURiZ3VoelFOajIydlN4SzU5OEMwVjBQcjJrdUhjVFJ3U1FMQk0xRXFqcmNVdGM0ZXRUa0UvMllsa3hLZlFSUmhYRHRDMFQ4L0diNzdoWUdRbzRNa0phbndJbXZoNVlTb1hZYWZCeWFrQ1JhN0RvM25HR3NteSs5T0tkcldDZWZXdzF5eXBXQ0FieW9KQUhZOFpNTXh5ZEtOaG5DV2E1NStDSW1UcHErRzAydXlMa1hueEpGNlRLUE4wYUFOUEE1ZXZMaFZFQ09la3UvME9PK3NER0FKcXZFbzFvQlh4endqbytTNGJHTzRLZU5LQVFlV1oxaml1aGY4YmMxank1aFJzWFU1LzNxdzd3OXdMcjV6L09GMWxhcDMvSGtWckRYOXJVZWxnem95WGloeVZOVVJqeHNyNkYrZXBNaGpUb3RHRHo3ZjlHck9nckxSSWEzL0Iyd1Y1blZFQW1PMDlRQ2g5emxzWXB4Zm5LQUc3NGJwVm1jSklLNXcrbk1kTUpLSnFaM0RLa25EUGVBcWVnV2NaclBzTW1EdHEzQ3QzUmptK2hqNk5TVDVyKzZ5Y3pmaXBkMVBlZVBSbXlqVEdISE81VVRWcmV5MGk2NWpKbnphNzFBelBod292aEFUV21vUWVROTRuM3ZGNDBRYVJVdS96YnM1YnJ0L3R5RURBeUlJQlFkTG5Mbzl4S1BJT1VvMzNqajlZV1lqNE5INjA4RHhjQUpsbVYwUzMrRmo2b0hYeldPWFlYWXJuaGVtQjB6WkJUaUw2UExhSW9UYnRwNzVEa3dWK1M2QmZ3dHFEM3JVR2dYekZoNTNudVpqRlQ2S2xRT3dhRVlBQ0M5bTNzNGU3MGtSdk1aQWRud2FVYVcxT1RQcnliTWpOaWhrSUlGVk5TdHRPdmlaaDlHS01PWFRVdWJjMnJXSzVQOUFGM2FkUEJ4RGhRTXZad3NSakZTV3cwYzIvaHVKRTdxOGNUcEFkaDRrZEtaZDhVbHljT0J6TWd2bUpEMmFpUXZUenBCbSs1MnNuMUNMQXRGYVZEWk9vWGl0eHk0Szg4b0hKWFBqUmZNemRCdUliT2kyUThrTkN0TjlGenFCM283WjgzVGUwemFrcFpxQVpmNEhTdXJJVDVyL2tjS1hhNXhCK1FPd3NBeFkwbkJyTGY5dG9xRnBFR2c0OTJxUXNUaktwRGFTUTJPS2J6YjRHYUJqVjFWcC9oaVNsdGFqNFFCcitTVGlqV01YdzJaellrd0RFOEFqa1JIb2hpV2tPV1c4dTczNzlFYmlpUGJkSnBqMGdZZkRNOWJSZ0dyTlkrY2JZMDE0eEY3Nlc2WEU2am00Q2NuVVNWQVdqSUxCUEJmV2xVekV3NU9qSG9DdXdkbGZVWUc0dEx4WGVhMzVYakdBUFVHSzNhYjNDYnBFcmIzMStidkwySDJaWUp2R0c3OWdJazlobUhKSWRaS1JjTkdJanJVSzY4YkxGSXAvaHQ3N2dia2pZZ2JBRTFEQlI1VWpvSnB5QjQ3RjBwTXBCb3BHN0hEcnQvRzVLSHZncGo5c2gzbk9za0JZMDNqbDJHWTBqRXc4WDRPUUd0N3Vld2kvWGRka3BudlV6WmJ1MDVMVGNjWTI1VGRRMEhuSEkzamhVOWh5aVg1UXJWT0hnaEJ0dTVSYVhvb0VFTnlCSVNZakZYcWtMd1lVaVdqMWFMMTY2M1VqVnNXTldMbXdHVDg2cmZDQzJ2L2RqbjRGYk54OVhiK21JNEU3cFF4OE1YVzA4WUUzeVpWS3VWVDk1S0t2L0pRQWREc2dud0FSekxTNFVvUTFxTkVWU2ppdDIvS3gvbzNqVmpRRkVKcUFINUNwZC9zZU9wbTFHT0g0QWJhenVGam94MlY2S2YrQXRlditCTkZuZ3VNVS8rUjdaNFhpaUxWT0NOQVBXaEV5L0l0VWVZQmZqOU9GRXRlZ0QzQVVmR0x3Yk1HN0VTSWlrZlpXOUZrTEtMaWpaVlIyMmFONGZzVHQvckUwQitXYlVzSlhleCs1V2ZrMm5EakhqYSszMHltczAvdDNUZG14WTlGMmIyS3JFWU05a2oyVkZzUEloeWVSaUd1K2thalhzMCtYVlhVT2M1aFdlYmRLT3hFdFdaM1E3Yk9ER1gxT1NocUZTUEtOYTZHU0F2ZXJVS2NMUXYvVUMrb0JtNDJhNkVaRnYzZ2lpU2JiVThkS3YwMkk4cnpDcmxGa0ozQlFXdENZN25icWFOSWFpcXNVWU5ScWo3NElwK0VxZXdvelB6K2NjMFdvZDlPU29aOWFpa2VjdlAvMjFOY0NOeUhTM3NBN21yT0Q1dlhuVm1EU1dOVU9lMGFhbTNrWGFaOW1yVGovSlQ1WGtEdXM0Q2FZb3F0QUxETkl4SHZYZEpicWxodkhLZnpBczNEbGsxVUlTN0l6bGFjYitFazJWd01WSnR5dlNFQnpxS0phSjRnTlpOS3ZyL2xhWWVlcVNZbStKNXhUTEhBa1lyVUU4NGFPRnlZUGkyNUdzWGNsOUwrVndvYlQvZ25GNktHOTFsVmJReEE1MXBzVVllRmpvYnRabzF3dElPcUxPdjFpNGpqT3FHbzlHbUpudW0zNnljZzNOMlVBWnlRdUE1dG9tRENxVVI4K2FnOU1PRVBIcDlOR3M3bE1pcGZXa3grVENJZFBFcHBYRElZMk5VelBDL2hMY3I5ZkJ0WENMQnN0aWVuaTNWVnVNZnZmTXdXaUNUVld3TTg3R0lhRjhWV2kxc0E2Mk1nem1OWWl2NDgxb05SV2xOdGdacU8rejZsQ2l4cG5tWVhTMGREMk05Y0ZseHFZa2lDb0lpV21qY1JLclpyVnA4OXI3THJHaWVrSUdDS216T2VzOEpPV1pmRDl0Y0xSSGJyQzBEeGZReTA1Um5SNjFOV0dpOWZVdlcvaHFhM1VlbE00Rml2OXZ3RFVvb2UyN1JUcUs1cDd2dmFSYTcyWGhTTzhEU1FieHVXVyszbGJWMWdXVWpZUWRvMDNpeVl4RytENVFZWWVFL0JmaVh2UHozZytQcmFaMU5pSko0VnlIZEFUbFRXQ2lJems5OWh5QkVmM1VOeVF2OGV4L2k2OXRkMmNaeDdlL0g0ZEhmYWpuVHEvRThFek9vQTUyUit2ODVuY0pzTUcwV1NPblZ6azdGZ2tqdlFPM093d244Q1IwS3RqbUVpcCtwNzBQQWhnWGRySmVYdnhwdHNrOUlPaGp1aE9ZREIzL0lNTzV6enlraVVESUszYURIZzNMMUtma3NkM3ROd0tWVkhCUDNuZStEMnFWNWdzbTBCUUY5QzlBSnlOSkRBbERlU21MSEI1eFVXbVdkaThydC9TUENJNlZ0UUZMNGZod201YnRkS0l3a3cveEk2Wit3SmNQRUx5NXk1bU9zQjh3WTJURG0zd1Rvcm0rZXZ0WHJEQ21uWTMvUmlwZkxJeG9wditCU1RlcUlsQ3pzaTJtYWdibndGQmN1dXJ6ZTFpL3ViS0g4SlBBVldjSU55QjNna3RnZS9mb3ZIMC81U3oyd2h0THo2U0lIQkNHa2xmeGxwZkcyZ1RPdnY0d2hVcEVlUlkzdVpzSVNxcVlYTXZXWWI2b05LQXNIYlJ3dUgxWFByOFdiMDA3YVhtUVBqOVZYKzJ3YnVDQ21hcDMwVDBTMys0Z1B3OFRNOFR1SUs4N3lFRTZ6S2twVllQZDZtbkUwMEFPbm0rVnZtNVNneUJXdlZIL01yRHZMMGFVMmoxanRyY3R0R1lDWFNVbHhyTnVSZU9pVlowTWxrOVpvd2ZhamV3WlRtWGVFanFGZWFnTzhzSi9tZXM1eUI5QndZUkF2MHVYZ2VTTXdDb3dycjczVmcxME5kV3RIdlZMNlNyVm1XVjhiRFhmam5iT0VjYzB4c1Mrd0V5SGdkRDdwdTlHT3Vod1UvM043RVZxekxwM1Z5V0d2aXJOTGsvTS9VTEVESnFCLzB2SllaZzkxMWhYcGppWGZVZWNoTEl0R1dMdkYrK0ViYUtEZ255Y1pZUGpaekJ4M1hGYXRRYjNGSDhjbGtwQmtSNTdQUWQweFhrQjRNd3grNEQxamhWd1Bhc2FYTGxhNlRyZUt1UmVXa1R1bnU1TlZtUktzV2t5RXEwSS94QVdFMWcyWWI4ekNSNmI3clJUSUt6alVzVndaTXZ5WnFZMXNpWG1FOEh1S0V4bjNLMWdqK1hLaVplN0VadEJOTVJwTEhadGFvUTgzaFlGZVJBZFd4U1RERGlBdWEwcm8wakdXUUZHUkhmcnNqZkFSbkNGb3lyT1VTUGVSNzc3YTk4RXVQdm8wSDhMcXc0UEtRWHlNZzNEdDRTendaYjd1K2wrOFkwOEZ5Y3krcTFyWGRsbndkN2I3QVVINGtPV2xBNEhFYk5uZUhabFJBNWdxcHpCMllKcGFFbUdnTE1rZ2xVdDkxN3M2Rzl4MVlheGZ1WHpzSlUxWmpnRWJSRVB0U3RTbTA1aDdhVDJBQ2J5NVpmUUdEVGRqekRWZ2FNelpZcFJFdVE5aGd5OU4ycVFMMmVoSWljT0hsMTl6b1NoYzVlOUFKR3BQRFpCOGRhdzJkWlBQd2pDcjdaalN3Q2pSTWQ0bWlNYU9iZXQrTGFLSDdYWXJrNXc3RVJBdmJSZjM0eXBoTlFFYURCNnpqVWdadlFya05DRldoWHZiS3pNRFJzN2dHVzJEN0J4Z3o0enNiTUp2cVlLNmg1ayttR20rWHV1L24vZTBBSDdweUFVdzN6bmh1alVWVlFjNFFkNWc0bk1xVVhUV2RkTWRjL3JrUitQN0lzZ3FWZnVWd1Q0d1VGR0hGL3ZMQngyL0Y0RUdFZGlJWGxSd1Z4TFNxWExCUEhGakFxbzlmOUtkMXBQYUI5QldoN2FDQ3loTWpBVmtsenBmWVNzQTdkQ3I1T2dwbUJROW9MdWtaSVlFc3NXN3o2TFpaWHN5OFRsdXFSWXFpVGhDdnRSZEZlczNYbFlWTjJEN2Y4cEVnclVESlVpa0d3dzBhUVJtaldhZ1pPNU1Hbm1CaE81WGJQRjhtWURBN2pTSU5QSXZWNUd6WlRTL0R0VkJndDhhckR0UHdMQ25ZZnJxRldLS1lnZmMwbVBPUVF1WmkrUWl4TVZIQTlmS3UyTm9WNCt2Q3Yrck9SVnhSNzVpQmw3YXcrRkJWZ0RGNHdpTERrNCttMFVNSUlqbkZiMm8vZ3lFSVdUcWdlMUc2TTlsMGZHUGxnM1ZvOUV5NSsvZ0JOV3cvRGtoL1lYNTBYSGRJU1BGQklETEpENCs0KzJLejJ3R2JCaExmRm15N2tjRmtpTjJGZm1VTGVDTHkvVllZazRvOGFOT1dXSGVSd1c2dWFoUkpNSUtnRW1wWEVJdk13ZllJWDlidEdwTS9kM1pJU1hqMEhJL3EwT3pSc2FWRnZTU09CVG0yR01MZStUbVNSTHFLbVF5UEpBRXZzQ2ttZFBteE8wNi9aK2hnZFZsWFBXVlhCNUlwYWtaUHFxbnAzcHV4aEJjTCsxblJzeVBOZHFvdnlLNUZVU1VTeHVVY1JJOExSQ0xqbGZPcFdCRkpjS3JoVTRnSnRjMkV1bmpYWWhtTkt0eFlvbktSQ1l3cWdJdXNHSWN3V3NyZ2ZwdjA4VTBjeGE5Uyt2N1NERlJTMm9zUGdLaEVKQ3RBQ2hjZHhQRGo0bk5ycUpzMHl3L2swN0oyL01xR0JsOXBCc1FhcnVKU3VFbzd2NURiT09taVNzTmlWRVh2bVd5d1hzSytaYXhzRFpuUVArbTlGejlpdVBXV1JnQmluYTdqSUNVNmhWZnJqNVVhOFN0R0hUV1N3OFJkZDJrcUE2MlE1U2NmaEVtbnZHT1Z1amJOenJMcmdBY0lzZlNQa2kzU2xGS1p3bjBEdFZWVmZkKy9KSVZYdUVYNVJOZFJBQjhXekpna3ZkSG5scjRpWnBQQ1R2SS9HaFpXQTN1ek5XVFNkSzdtWTBscCt0alRnemhQc2tRbEpQWEtnMHFtNGdsQWxyT3BrWmhCNjhFS3F3UnBkQ1hET2dtemxGYjNqeGhRcU5tN2ZzZkN6NXhSQkdtL0cxWDFDdkZKWTBJQXp1eVVWcjhxdXZrYkx2T2FISHdlRzdPWFZJTHhBS1dYZXVvVEd1VDhvQTMwWS9jQ3RHNjR6aytnbHJRTXV5SWFWcWtvNXRkVjRBZ3JJak94a09vbEFjQkZGRU9MdHh5M3pHMjdPUXB0VXFPaVRHSXl5NXQ3Y0JkdmxoWS84OTBESHllMWd5VDAxbXErbUEvYW1XZmxBOFg4bmlFSmV3NStNSWNMbGFiejJ6NWQ3MC9uMFZzdXdGc3U4SGhwV1d3cVpwRG9ucWl4ZGxiVUpONUljL01UdzhnNlh0ZzUyRGV6UUFQa0JMNFp3cHJkMzJLYlhrc1JCY2NHS0pPNzYxRTRqUnpEN0l6UWZKb0NBT3RzUmVDRWIxS3JmN0NqSDVqVWViWDJNNytzcXVZWG1WMWQwc0o2OXNMQUNzRUFKZ0JObHB2SW9qVWtXeHdvTEhjWEVmdUY5Y3I1MWNpNFJlVnUvWm43aGdnbXJSTXlRM2E2azRyN0xqL1lTQ2dham9RTHI4VldxRjE5TTlLVVREcWZqa3kzMWFsUERxMDV0R2JRbk9SbmYwdnJJVXp1alVFR3lPamU0aWhGOThEcGNjdWRlN1YvNDlxQzJJR3NWb0M0WVpXeHBlRVpJclEzNVVvZEE1WlNyM00vQ2dXQ1BKdUt0WmdFQmZMbDhmWjhlWGo0ZEkzZGg1bjBETnAxV3NLQ1FXdkVZeDdSdEYyVnJXamxWMC9pcDVNRDFndzM0TExycnFZaVA5d0ZlaEpzSGtPZFVnZlNJd1RjekdvaU1OMzBaZ0l3WW5iQjlOZFJhbWUxOWZtcktnYVNxTjFHR25ZWFEwb2pwMWdNQjY2VXJuSzEwM1B0VUJPMkphUWg3dWdGS0w1RFZ0Y3pHRUVYSE5pQ1JEWGd1OXJjdE1DYmxzeWo4YzdENTF5ckR6dklzaHdMeHY2RnlNcXZVQXBzekFvaGtjWTh2UTMxOVM1VDZHa2dWcWlKQ2ZwNmZFTVFsR0JaZGgxN29wU0ZtSjh0aHBaaE1sUFNmMlFOQUxqRFFKbFh3ay9ZYzQ3dUMwVHpLOEMyd2lTTjRJblJjK2RpV0lqMTNucUxoS281QW1KM1dZZTd3ZTUzcUg3ZlRsL0FXY0ViZFUzUGYxZmp0NXFBQmFoYUp2b1dLWGNwUlFtZGhQYXEydFNGVnBKSFZoSklURG0xMEsrZW02clMyempHdDcvRTlhUE8vd0pUL3VoRU5BYTZqNHdPaS8ySm5JYjhYeHA4bHlXL25Tb3hqT24xZG4xeWhRNmRpTWVKV1JmN08xVDJTV1VqTmRBUlZUV2htSEdpMFBaak90OXo0dUZzdytUNVRrWWFrK1pJTFpCam1vamRMQ0RHT0NCVnZJcXRhMTZqaVNJdE4yM2g5TFVQc0dkZnJSNW1tTFpWR29DZFUvcm9WV2tkRHl0blNGZzhtbkwwbnEyM0ZRY1pTTjJ5Ym9KWE4xT3o3dmFRWkRUNHAreEtWSm1LZFJicGx2MHdCK0E0SmNYaUV4c3BNTlhONUpsV0JMQzNwTmR3L2RNNU1lVGRaU0FpdlJIUVlUVm1XL0JWWCtpUDdaYnNjNUFDL3ZnR29PaVYrTkQzTVozc094aktUU3ZEdmpQRVNSWUFnUkM0SXRFSTFQRmliV01tcERnenBtdFRkR1dOMmNSNFJKeXJyRG85bmJxRGsyOXR2cHR3QmhkS2RoRTN2eHo3U05WT2x6SXJtaWdVbTlRdC9IZkNNb2JBdU9waWNzbGE2UFk1T2JjV3o0cVZuVHd2V2hKcUErQmUxUkFGVG8zV3FTazdnem5ZWFlhQ2dzdE1aTVducHlKajA1cmUyaHovcVdPOEZacS9XbWVMQmpSRmVKT2hFRDhHWXpiazFKSHVvaFQ3UlN5ZXdSeUc0MkNTMG9rRDdDUTlwdmxUZzJxWDU3OG95VXR2aVFUQWpYZVFiaFVaa0JPZWw2L0EwdzZyR1A1clA3R3ZRZ2JJZ0c1a0tLYjNnMjc0QjdpWHRqVkRzcE9CVHdCTnBNYStOeXBtYXdsSGdmY0Q4K0hVTjlBSGlKeWpGYkVkOGVlcUFXWjlmZmRibkVoczBFUnB3Uk8zUUlRL2hEejJweDVJdXBTUStlSEVIRUI4bVJRb2tFaERXL0N3R3doTmhuNE5FMmhXNDFLbjMrQmM5NE5XaDJ5ZE9HYjFZQzNpRDJiQkxJNzVxSHMzMDZQZnNEamtqTXpaU3lXQzNDdzY0QkhPUWtYNVlLTmN6ZHc3MVN3ZzM0VFB5RzBVSm80TWdkcGk4cGE5dVVVajJHOXp2VDhvNDJLNC9vVUZ5N3NjOUpFdWNYNlY3Z1dmWGMzY1pLenFJZURpdC9EOVI5UnZTUklvQWVvVXM4UjRZcER5K3JRR1lHR01YSkNmU0JlbllINm0wVDhGNnQ4TWpOTmxoV0c5Zi9aUGZZdVd2WE8vQVM5eXh2eExUYUxUdC9OSnU1OUcyNGhZWk5uUThYWllGWGFvOGROcTNrTVdwanBTYmVnTzU1VXplVXVNcUxXRzNtc0prSWR5SS9lNXNMVWt0K0VJeVBnVm02SVQ2MEhPb1ZhL0Fsb1Q3THQ5VW1SZTVoenp1ZHdrVjZVelQwSURnOCtpSExybkQ3bDcrYmFSRVlZZVVVRWZKek0yQWQ5aXBTNnRaVVlkZGN1bGE5MGRGYWRMTGZTdVdOSE9EL1BkbE8zRWVKcGdPblBjRE9wY3hPSndBZ1YySTB6YmRIRzFCVVRzbkdvRFNnQW16N25SeGJ4SU5Gb0VNOU1ETU1qem1NRmNzMjNXdmpBRUhydW5zckVobFJlRDFEaVpCcDJPMHJPeVhIZlFSRzU4VWhRemU1TUp1bVpLQ3F4djk3aVQwL2FJUElrTU1CeDA1UWlZSlpLRnQ1WkdEY2RSMjBia1pZMmVTRm02M2NtZGZWZmdyVEVRTFpnZk5tUnRJZllVeEFNT003MUlRRHNsaXZSdklqYWg0RnJiYWZrM1FwWEJCaDY2ZEhZODVDeXNWZzV4ZURwdXVybmRjVU9QSUhDaTl0S1lMaktCYjArSkZsQXBIT1M1NVJBb0tWdVV5ZXNwdEp5QU1SeWNMOWUxNTgrSVZXaUZPWWF3OENtQ2tWTzlHdTVBMm01bEdjRE9Bd0E5M091Z01KTzlNcHhVNG5rTlBrNG91UEM1WkV6czdrMmZYNms3dVhrNGxOTWZmbUl2ZC9GZ3dNUzRkVFRoZW1DOExhbDlzeXRhUG1YanQ3TWFENzYrUEM0VzlDTXFwTytZL1kzOWZyRXJjM2JFdVNPYmY3eWdaUm5aWnBCMlJPSnJpaStzSEk0ZFlqSitSWU9GZ3ozQ01YSnlFWll2ckZMdzd4emI4V1VqNDVRTC8yVTJ0YmlVbUo0Y2ZRdXd0N1ZJK05tWXd5bEQ2aFJOOXZuYWFwTFhXSUQxOEFNZlg0OVZJZ3p6Lzd3a3dDMUkwbXZheG5PMEtpVDRYdXgzaVNTZjhabGdCMURBTXprd1hYYVVZam8vNWVqY3F1Y3U2clJQQ2tKNlppTmU0QTZrb1hIaGh5ckVhOEMzUTlJT0NldzVadmNWUmxLWkNienh5VS8yRWhBYmRvUThuQWxQZjhNMGMzMDJ4THhsSXVuODlMQ0JyTHI4bUtaS01JbGw1SzZhMFMyRkhGVDJKblI2WWFacFFTL2hYWG5vU3JqclZZY3JYbkI0N3F0Q3NUVzk5bkpLK3MvQ1AwM3h0N09XQVA3NXJ1WE1MUy8wSzk1TnNMUFVTckpKRktDUmFybUJHMktTQjV1Q3FheHkzcHJoMWVDTEZyT2NpUWZNdk04V0trVm5aT1krSytwVC9PZUdGRHIwZ3pla0hGdER1TUxsQ2VWbHVJMTR4YyswZWVXalNNd1M3RzdIMzVqRUJacW8xSy8wTVErbUx1RHdVOUZMbXgrZ2lLdmUrd2JYVE1jMUJ6SUJqOXNhZXo3WU8zMnlTby9uRTdWM3Y4YUh5NDVRRGJHVVI3dG82Uld6MWRPR2VSb29QNVUrRFlDWnB3ekd0UTlDWkVWMmxaSWZSS1pncDRYME1QL0F0RHBhRDdHS2ZGYzFlc1ZSV0RqbFlROW8wMitwT05lZDQxRVhvdjVYNEtlNmJ5UEdXV3BXNXAyQnk3ODBYRHd6ekc5ODJvM25mN0ZEclVHMjZZWklaajNxWExKQ2pFcWliekxXMDRtcFFZZi9oUGpiOFpFdGZNeXdvaEdWYzlxT3R4RHVtcEtnaVYvUEkxRWgzaVRaOXNzWlNINmFLckpGbEpLalBVNkY5Y3dYYnlTOFFydjNFdTgzYmJhTm9GZGI5Ym82VllSL3FUL1ZaUjRpZjVSVUxBM0RJcWc4RDNUZGY3Q0hvTHBNUmVUSy9vcVZ1N0QyalY5NUphMi9zRVlUbHpsdVMwWkRpdHdZaU96VE02N2Mxa0Q3ZURqMndnUVh0Wmh2aUVJNGlqb290UGVEbXhwcERCZCtVemQ5UXdSczhDUHdhbUxvaWo3UndCR09GT2JJUmdZdUhhcFNoZDR5eWtibXRIemJDRjB6emx5UU5JblZkOGV0aFdmd3JQSEJRYXBhYy9STmQxbUYyaEpQQU9FNVZxNytUS3gxYnBmRmpMcFY1OXEyenE2eE5nUVdyTWFwclN1VHF1MUdxWmFhSWdNOS9jOGZjUi9RZ3R4dUQ1TnliWjNUWjJoR0UwV3I0M3ZqV0U0aXlPaGt0OUJTQXc2QzBpbnl6cVY1UEs3RVIwMlNSb1c1MDNBNUt2ZXVVSTJPaE1OVHFWL1lMNWhUNndCZVNaOHlJTkhRYm1sR2dmaFMyK1ZRNDZMSjRJOTdQUjNSeVZ0Z3dtZUVZTGlqZmM5RkQ1UE56YTBDL0VtbTZTVEVWc3NjNUNkQis5dHptWFBQWXltRE1HaktBQURpT1Juc0pDcHBkZzRsYUJjcS9GMVc4Yy8zckkxK1VaVG9CQ2U0M3NObWZQOVBnY2NaOGdwRytVYkJ6ZVRVUlhjSXB4emc5alJia056REkyTXV3aitmSm82dUNUL0xhNEd5eVNveUFxK1BjYTJ1ZFRXZ1R5QzJnbW1wY3B6Qi9qR1dyWlhXOFN0M1pRY3VXN0lYcVFCcE5hTDV4TXlETytuUzNyMEVuZmM5MzFYUjBHdTRGaG5tQlVMV0djK21MZ2tCQnlEelpvQXhSa3FRQ3VQZ1pQUDg1Q3BHZm1lclFRby81U3luZnEyZHExZ21xb2o3U2w2bGsvNTd3UG5PWXJrZjR3Q1NVN0tsdzVlQkZrMFBOaGNGRXBkRjVXblRNME9vMHZOVnF5UHhMOTU3eUdHZmxlM0h4d3E1YXZxcHB1d2tLZDBCc3EzUjdhdlZPVTBJZENkSC9HVVBRVXJiWFVwM3BkTXhnMmROeXhmMlRXWlJaVlBEeG9BTDZhL0hDOWxUVXNJRzlFQ0Y5TXRnRDlybnFGU0hBdE5wbXJMczZTdU8zTXdjZWFHeWM2YTdJbGVNOXBPM2ZOdjJXTU9Cb0h6WHdZbU5KRzdRMUdXUFlGaFdPdkV2QjFUNmF1RGxVNU50NGFiTkRWeG5nYURQZzRyWDlYMUtIYWk4ZkpreVdZQlI2WXRGNmxsM2J3SEtsWnRBMklNT1hLV2krc3JkajJTWFdRclhqRWRRclFRd1FONlBQSk5OSWUrK1B3TGpaaVlzb01mQmpLTVlvelR3dS9xMDVXMVRncE9UU24wWTFIbEpzOG1JeUdBSUdSZUgzT0x2bWd0SFRtQTBsVkF5WVpwRlRRZFVDWlNzRHJaaTd4TkFmbGhLa3RhdGlxdXUyMkFZTkFRWjRGSExXb1N6Q0NRdHBWenM4cFBWb0wvT0ZkZk5pQzdsUitVMVpMUTg3dGpJUStaZ1NHbEhvcmtENEk3dGdPL3RFRWVYOWlTNzNJenJkNjJ2eGFsYnBGcWZoZW9mYlNVa3dscDNvbDVsOUVGaE1DY2pXSTgwa1YzMG83MERXRjZoVUp6SXRkZkJackUvZEF2L3ZmS2VvOGlQazdxR0hLSVIvNUJkUU1EZnpPZkdZTGVteGVqUGx6Qk1GWExyQ2JUSTBTRkJTWDFZKyszWW9xZEtxL25tSXpXZjhnY0VGd1hpMzM5L01mcWFZVFhNNDQyMlBzbGQxd0NMY1ArV29LbTdQYlY3cGRHVjZhQ3llUW1wWG1ocGg0SEN1MFArWVVCWWZ3bW9udmRoQmRjWHd0M1YwSnRrSlFPbXNnNU9zNGVOb2IxL2FJZzdxcXh4UmQyMHRiUG9ZdWQvUWdnUUFmRmN1d014U0ExeGh0Q2ZLUXNmUjJ6UFlicFRuaUtyMmF3SG5yZHhJZUZrbjJnbnBLTHA5VVVMRzlNWHRXMEtVWW1FeGJCazJ2MUZVNHRBeExkR1R6Rk5aQmYrRkl1amFuZEZyZXdZcGMzWHhDbUFQNkxESi9jRTNwNUYwWW91YXU5NnJGclgrcStUYWp5Z001NGNnVlc1aXlTMitZcXdvWk00QkVlNE01TXJBejdUYzdlMExpUldJOTZFeFRpQXh3QnY5cnBlVWMvekl3NTNlMmFyUE1Ob054WkpOQ0ZueVJwbmN2a3RtU2loUHRCdGVEZ2JSM0UxYzUyUElWd3kzZlJRT241ODBCT1ZJRndzb3NEaWNPaXQxK0h3bjNzVWlFTi81UVRyVlg2Wlh6bmUrb05IOVhrOXQwNnJhREp0Nklmd0RmcGZOOVRHQzNWcENNRXltTE9FcEdaTnZtS2hLWGMzbXpCamYxTW9tWGJFQWNFUS9kSXJUWFFaYVQzZGdFdXp0TmNzcU5paGlZUnc3ZVpDVnVGc3lKUGRpaFZ0NGpqOWg0NE5JbSt2bEhZRjdCRExyb1NsYkRqQWM3a1hWS05WaGFpSmw4TUtFTDdIbkoyM0E3SE9PelUrQ2ZFcEx4QkdYQ2c4Qi9aWUZ0U0NrRVp1NnNTNzk3WUNnbHVHT3dzSTlSamViQTFqTFpiVHBVWnNrZUJERXA5aHZzNGtCSTRQWGV3eHZSblJNZVl5WkthVkIzQjBEd2x3OHhLOCtiWGRQV0Zha2Q1WVZxYVhDRTdTeVRUS3lDcVllaEhlTkxPQmw5Z3lxNXFZRkJXcWd3WVErWGt3Z010Wit3eXFjRWdjclJvcUpOcVpoejFsdzRGZWN6cG43dngxNUNtTEpXY0NsM0liT2xzOHppZDdIQ0UyVVJZUWMvNTlEWHBWQ1hLWEI1NjgzZGQza1QrNVAxbjdzdytOT0hjOXlRN01POFR0TzNMYzJEdjN6UWtDalRza1dJa1RIbGNwdDBWMEpmSVZQWitPWXFwK0FQUWpQNlVCOGFGUFhiUXUyd0toZnlKWkozcklwMUZkTmVzYk1oMGlYZktvME1ZeDZBeUlYQjhRWng4K3Z3U1RZOEtKOE5hNythTTJxZEc5VlA1TWp6STRkU2huWUx5enhxeWp2dFh3SVpXUnFYakd1MXVCc2pzNHVmSldiaWhhUGdEQVlTYnNZeGtTMWpzUWtHbHp5YjZZc0JhSy91emRMaWEvRXJNL3dXN29qZFlpSFU3amVlbWx4ZFIyNGtzcFdEN2NodlhQVTgvM1RCZzM5NUMrVjV3SjdqVlVSV1poTE1ySzNidUJGN2hWb2lyZ0lFemNJRkxNQ1B1TVNNSXZuaTIwU0FjNmdFWU1KN2dUTndhN0svSlJPNU9zNWpIRnAvd2N0ZHVUSmF1WE16M3craDd4S2lhSmM2Yi9LNXU4bkh4S3NvSDNDK0c4M1NnTVdSUW0zSGk1TXd6Vk9HTnpQSGo1YUVLTENRdTY3SXNlRnBMd1hMT2Qwa1JnMmZNNkozNjRWL0lWT2drYXpzWnI1V05NSmhaQVE1L0U2T0ZPOVpneW5FaG5PbnhhbzB3OEhXZkcvcTFQYWhkeEZ3bGZuMHVDT0RzYjFueENlMUpidWtFVUl1aXQ0RXRyZ3JzUE84dXdaMkRtWGZlUUhSZUE0QzRhb3puYm1YWmZqTVZxMklqdE1MV3VhbTJEWGk3cnhZamJhU2xpbWhGaVVMc1RKUkpxZE5IdW55aHVpSDdHZktnS0FQaXZVVkcvamVmZVQ5cVN3Wko1d1Z3eDlRWVJkc1dLR2lMUlVjWFNZSHJHYUZ1Q0dHb2FVOStsTGYyQ0RjV3dlcTZmSURhU0RMbUU4VVcyMkh3L2QrYmxoVlBvdTF4bTZUMVZmaXhHQWR5Tkp3cVBqY2ZWV2xOSitVUnNjR0pHMngwcGI2dG4vQ2Y2K0RLNjlzakw4Wm9DSlJYay9xUTc1WmtLSjZvTmVxZzVnZWxyNG5vRFpVZE02MnlnampkSFlSd0FiKzdmY3BxK1pHa0VDcWh1VWVUNjJUUXIxYUhGM2NjdDF5T3pDc1BMUlBpbi80VEtrOTVkVCtGa2xPbDdqdERnNS84dk52OUFjcEpKWkF0SDY2ZmE4MzA0S0p5ZlpKaU5Nd1NTOHp2R0hFcGZjVjRibmhGSmFvRjRmNHJ4aXJGNUY4M3JvODV0UWl0MDhudDhvMjYxeG9wdG1qbjA5d0h0OHB3aHovU1R5cXZHU1hkYmxYNlgwVVh5UUI0WXVLaUhPNUZhbUNDYjhibWhKWFFQMWxqaW5QcURqNUZ5NHovcE9Ed3VEcjZzNW0zTk5PcEJQYjJLZkZVUE9MNitRVTNkYThwUGhqY1ArQ3F1NGhZVG1ySyt2ellkbU5tbWt0OHVzZitZbElHYWlYZ0o5OTJ2VGczbFE4WmVJdnNLUEhRWUVvVHJmTHNNNm43N1BmdFBPeUF3YmhvOTV4ejRNcEhtVFJyWkZxaC9VSDhsNk5yTDNTNXNzcTl6ZGc1STN6RllFYVMrclBtVm84ZEZiZnljVW02UEtpMjhOTG5IdWNEbVZ0QjlSOFpSbVFSTE1jc1YzcW9KbUora21mbVpmU2k2S3lqS2FoblA4eWYrMEpIYU1tSzJIcnJROU85WE5vU2phdWxSUmFKRktiZFJlbkZjM0xzRm9ZaUhTYTZHUEtUTTZHQ1RCbjN1VkpCRXNzQTdRTTJBcDE1K3dxUFNRdUV5OGNROG9YMzIyZzUwL1orTkgxRGwycXd4K05hK3BOYUhQNU1yb3ZqS0NvK0FZeFpYbnpDemVnblZ0STVpU0VkZnVYR0lMNzhGQ1ZaNmp3eWRrcGpSRVUvWVVCNzQvY0lSa0tmYVlhUzYzV21QSTRqSFNucjJuT2FVNUNobDIzQXdhRGpMT1NOYTdBN0FIa3FnYkZpbk9teCtYaTZBeGtXY3YrZjVyT1dHUGVjYnJBL2xDdHI2R3lXOWRuMTVOYmFKMUtLNnNSZ1RTMk93aGFzU21CSEJTNVhrUjBDang1NnBEUXVNSSsxem81Qjhkc283eGtKMDEvVUM1dWRQTnBkZmdaaU1vYUlqTmhzMFVuNGpRTDhTaXlWbzZMd3J3WkRPbHRCeXJmQStUczdFaytMbmJqQWJGeFlrQ2QwbkdSWDdTTWlKTUpER1hGUzFlSkZFd3BPSFdub2ZDM2J6SERobmFpb3llYXpxbTdaOE5OeFNnUWlUWTRPaENkK0VDMWZmMHcwSW5mMWlSUjRmaGNoV1gvUHllbVh3bW90Rlc0OHhHd3ZVREo5Vit4dWU5TytEa1luVFc0Qkc1TmxISTlUYjZnTDNNRUJ1UlRCREZ2bDBxbGVzVHlpWHlGZHN4bmdkaUZ5LzRveGZwZXdlNWZmalRUaTVFQUR0eXM4bEVsT0lrTUhrem15WG5SRll4T0FsZWt3V3B3VStBT01FOFlacWRZcFdvYlNqWkt2ODNRTk4xbGVHajYyNmw1YmI2RWxXcGRsUlcrcVdwQXpuaFJYcEt0a1hKaUdHUTVJWVRwSkYxN3l5Sk9SeEgxejRmei93a3pScUxVTFljV0lwd0RMNkVqU2gvblZYQ0VqWDJ3bk1DcE93dksyRGhDRy9kL0hNTTVjYk43OGxocDZzWG5pV3FoT2Zrc3YxRzRsTmRrVDRUcnpmSHpXMStHVDFYNjhRUjVZNFJPZnVzcFZlak9Ick9vSG5WUkRQVmROeUNOa005UER5eHhUOHZGTXV5SVB5Q0MvbDRQR0RxL3FKKzVlS0JlZFREUzlJRlVYVDVHdTVka01GYi9WR1RkcEYwTmZQZ2VCN3JLRC9yU3J4QmlCUnBUeXFzM0hucGl1M0xUS0cySzA1VEwrUTd6S3BkSUc3NGNreFp6NEwwNWdXdlMzOCtiSFk3bGFzMllVZ1pEeXpSbkhDRVZ2QW5hL1QrelNlYys4aWVlU1dpVU1SZjNNSTltM2xpMm1jUjRWaUtqYllMSDNpdkhsQUYyUUtITEo0a1RMeEVGVTZiU2ZnZGJveFBjc2tBUmZWbml3aGk0N0h2Um1RcjNOTGtsdzBpaHU0WGc3ZENCb2kzcStjSFVRS3dhbjUrUkV1SFhiZFovSzdBKzltYU9wR3Z2bU45Unpad3I2eERhQU1sYTNlSlBNd3c1and5cHA3SHhndWpOb2hvNnRsZ1RoQjJRSUVPV0hyYTJKck1sNHpOV3B4S3dIb203RE5wNElZVFpyQnh0dHpCTG1udjJ5RzBHYWI4UGhFTWFBZzk4dDZBelhveWpqL1QzMnRUZTAzSDFIWHlWMlVOUk1KWjhya2UxQ3JKM1hsRTJUQVBUaXVsZi9lMFpkMWRiQ0xhd3dsbXZDd2NmajU1Vi9jQk45NzBpMERHdFordXExbjZjbFVzMTZFR1Y5RG5nUDgrQm4vcVdZa2M4SXhyNDdwR2VtSTVLWFRCMWZ6RFphTWhWV1RsZVFnalV4ek56YTFrQVBCcHQremZ5Wi8wa3p6c09jMTY3SUV6STV1SUNRVk1rMmZ1dEVNUTFWSDBjQk1SNDBtUjdjRzR2SmdWY1N3Z0V4U3RySHpXYjlacDlxTWVoMWJBWkhTRnB6WjliY3ZBNmdKV215cVREVXdocTA4d0pvZkZsc0dNK3ZjazNNaDRGeU1JczNHbFg3aWtjdVNNWmhWdGdWSW5LdHRpWVlteHFSeXd4U0pNdklaamwwelZMdUhRMzN3VHZldU5LZ3l3NU9BUHdNMnljK2FzaDJ6UzFjdG1hSDNmaU1ZMVExT2wrdXgzcVpFMmQya3BvU1NLTjNlWGNCUzhTZGhKUjgzSmlIOGVTNmpZdjUyV0FURXEyeUFVNFF1WVovTjVSd3E2dnIrUmtoSytHY0lYaXNtb2pRdlAzY3pnbUNWUGkzSVZ2YU5kcHBOY3hHNk9LV3RvM1ArTDh0ZE5wMWU5VjIrT2YvRDM5b0NuNWFBUG1iQWdOd05jL0tCZkxPa2NZaHI2MVRNR1htS2FMRVpEN2ZJdUxsNC9NOGxBYk44dzNvWVg2NHk3Yy9lSVl1NlAzUzVUbURIU0lnRDQzbURNWmMrR3dqc0ZwS2U3Tm5OdCtFMldGTkxlRzhWYlFTSHBKZWNvcTZLbkcvMzdMOENINHUxU1ZQcXRQcjZOVkhuTzFGR0o5ZnZaMnpSZm9YQ1kwUWpRejhDVitjUzJxczJPcnZ6amdaZEtpbUdYMEdVL1psUFVzQ2MrTWxjb3lTRzBmNnk0NktiT0Y1NGNobW15RXFwbWF4TXdYaW9LSVd0YVdRYTFnMVhHVURuU3JiLzE4SjVJZFhOaHAzdHA0VzBBYmRuTjNqQXpWcThFTWRLSjh6YWUwQlBDV3Rpemllc1RwWWg5dlhrUXFKcW44TDBlZFlKengxSkY2UzVla0FsTld1OFZCQUJrYVNlbDdNRVo3T1ZRSmZZQkVXaEZZMnhPc3NiK2x0TXdManhPMmt3M0VDcWJITDJDNXNwQUhLb04xQTJZdy9abDJDRHRzN3FGTGd1dW9LMEtheG5BS21lMUJYdSthcWFjZlpHN2VPZ1pKRW5rT2VRWWR5QWpRcDV2UnpTSnh2MzhPRmZwWm83bk1Rak1uOUdjNC96L21YamliTE5KL2lTVDE4VDdZblJrUy8zMXQwUmh6SjZnMWwyNnNicVBQVVgyTlBCb1J3VFR5Ym1hVll6RnRWOWdod29jWGxwVVdacEUzZ1dkcEFsU0h0d3BjVXpuL1JLbSsrNVpYbm1qaVY3Z2dqbWV2UzR2alYzRlF0MU5EejJsNWFNVTRnMzhKa2dVbUZicnppQ0wyblJndGl2NUxpbG1mS3NsRTdZdXNDc0VVeUN2QzdYZGVJUlc1WG9vbEh4YWprTGZmaS9tVTlWQVhNbDJocFVneC9ObEU4OHQ1UWo0dUNTcE5SRk5rZDY3R3FiZzFWaWE4S2tQc2pRcnJCc1prRzI1MXF5U0dpSlJsOHlla1ppSEU2Mjd0S2FDUFVNbzRlOHN6d3FzNnBnYmJBa2YvTU1wNUw0eVJvMUlFUC9OZ0FuTlUrNWpQOGtMWDFtdEFQYjBiSW42eTRyckV1a0h0NmVmd2RSMnZlSW8rMDRpdGN3RWRGZDJxamM0TXdjcTB4Z1MzR2tPazhScHdrbnFubkdLQnN4YUk0M2pkYUlMb3haempBMU02a3Q0cWNoK1d3VXExd0pWT0RxVzNRNVdDYitkWVVoYXB1YnZDNndqSGt2eHF4cU5Bd1NrbExSVXpINXZzeHQwN09CdUVkSHFzVVYyZ0RPb1V5YWMwVVdld3RDNDhPaGlvTW55Q1ZKOWlUVkFpbzF3UUU2VXRvYVZaUHhzcVVFd01Hbjg5WXlIQ2VPMHR3cHRYeUNyVTQ4UkNPUlgxWGs5M05RUmRoVTZRWm1DSnZjK1pzd0NOcDlXVG4xUG9nYzAvNDRWSm9qaiszYXZmZGZuUnhsZlhLaHZkaFo2T3pRYVJ0aFR2UlkyM3VFWEhja01HWTNVUmpjS2pzMFRNeFloR2d5NjdWSWliMWRoYXNkbGRVU0cwZmxiaThKMUdDTElxOWFNeEZMK09zMjYreGsrWnJyVURyYUZXN2kzREZvN1N5d2VsSDMrcjhUNExPbGM4anh3K1FLYnN5dFY2ZVRWTEFUaFE1cFZUa01mQVVnZ1F3YTBLQVNaVlVhekdTZEcraUJaQTNwOHFhM0tIS3I5aklma3BuVE9HN2lXNmw5OVJZek1MdSsvVE5WcU1iSVA0NHVqTGJDUXRXb0h0RUV4b3ZBY0RHdFBmODI2Y2wwdHFFMldERUZqazZuS09YcjRoYkdXR3YwY1lYVjc1b0hocXhwb2dwMzg5dnZaVEZCUGpBT0U5aWx6TnhPNWZyV0tTMW1zTlJDUDhjcXhia29rZjFIVlNHeDlKM1VOdE1ZV1IxUTNZMWtZeXdmMllLRWpaN1lISGtWYm1Yc3RGdWNKblZRUys2eURDNU1hTjh3ZUVNWjVyNEdPclNBd2pWZ3FJMnU1eVdvWk5scHM2TXJSRFJUbElOTFZpRjJOazlKcUptbTJtb00xdVZHb1pMZ2gxcEFNZ0dBS1YxaFliWTAyUzhPWTlhcnpPOVVuS0sxa2VJdnZKQkxJNHpyd1pBZkxjM2IyQjFJcHNxS25hMkFTSnl3a3QybFhJTUh0MnNCL0lmVGZDWHVIenhBYitkOURsQWRPOHkwUHdnRlFtbUFVRGhJWTFkL3h0Qmh4bVpDdlNmYkxrcExNaElSeDRlYWRBN3dtV2k0MkdDTDFRclpDQUdJRmxmUjRpRk5ZUE5QRUtvMy9xK0U5SFhhb0dJSnFQOGpLUDZXVFJtdzB2b0poMHlJTTdCSENXSHpEUGwra3FnUHRRY2pObDdCenJQQVRJSTRBTTJ5RGxHWDJueW5XYzRWanFnbHVOT0pWanpVSmc3SVhzV3NUckJ6aU1zanYwc3Nrb3RDWks1MVlmV2daNU9jeEhTM2hEUi9uejFvdCsxMGxzeEhsVldtTFNsYWVoR1Q5cGg5LzZzeHdiQWp3bE96ZjlVRXhEYklBOWg2UmhzSFIwZVp0Qk5lWHpWTCs5ZTlYY21EV0lSNDhhbHJJY0daN0gwNW5JdFNMMHpxcjIyWWZmdVA5VnJXeC9NQlZFOUpSOW0rV1lxNDNvNUkyNGhrUkViTzNtSWhpa1Ayd3BBR00wRmNGKzRiekRLNUh4dUxXS0w1bDY3QzBUYUp3LzZPRVRtL0VyK2RMQjJQM0FqMVJudkVMalJPaGI2K25ZUHlzbXppZ0NwcHJqMTE2TW9UbHlwMGRNUWZPclNsSXgzOGtTTzMyRFFHbTNkdVQxSC8zMDM1YzFlOEh0a3BOUHJFZSt0UjJ1ZXdLc0M4T0NwUFJEZGZuR3B0RkhCYk56QU5SWFBsT2FhdHFuSUtRMVJ3cytKWXFkQVducjhkUkdQcjEyMUY4aEJKQmo2Z0pIVnZ0TTZxV0QxbDczTStkYTEyam1CQWpVMHhaU2RqNGRVNXFFR1hsMTYrTFFOOGQ1K0VTSFVXNWgySmE1azdsU3p3OG55WjZrWkN5Z1RKVWFoR1dQdyt1Y29sSm9xclZCbDZpdnZmYlVaams2aUZNY1k5RExtSFh6NTNlNDhvWWdTOTNuelQvL0RGRUVwcUUyOHhHM2xISWY5OHpBa0huRWxNRmNiQ2F0WEhKdGNDTDA3UE5mNElON0RGekxJWGRDb1poUWxReEovVU5jNlczVEVVbGpqelNwWldZclZWQnR2OFpRNnZyV2FkZW5TT3ZGdkJNL1RHUktZeUdoWmNaUXkxSGtjQ3BVLzBIWEh3aCtuNzBzbUpCclNGeVU0UU9OWmV3SmJla29VM1VETTV5MWZ6QVg0bGlZeDBRSG5FOCtta2hLaUpmb2UwV3c3bjBhbU96RDRxZWJkRlVOcXp1cWlPMWdCcDhNdHBFbWVzZ0VCa1huZEgyRlRmNmJYWm5OU2IxWWlKWDFjUFBoWU9NbmNpK3VSQlNKYUVZMnplTWI3dnhyemVmdGlYVTRTZjZlMWtzNENVeitkNFBtTzNuMWZVakxtbm1hUXZJaE9jRnZlSEdSZi9NZUk4K05yMWxnL3JPQkJvVEtmdnVSZElpT29pRmJwMlM4c3hZVmRiSzVMbzA2WnB1Z0dGMThwY1psM2MwZGFpTHdCR1hSbk5VbGs0QUpBNitlY0JaNWxQTW1MU1lDRTNmMUZaS1loOERneFN5akRQSmZGb3lBTjJuTFF0UDZJSkFJK3hpakN2MTBFQXRONXlLTkFTSlg1Yk95WTNIL1BxL3ZoSEk4VzRvNjNiVFZ5SVdZRTd5RlVnTkVBcHFWVVNyT1ZpUllXbkc2c0hUMDFsaElKQnZvOTJJZHlVSXhPcGo4UTU4TFVOby8xT1VKUEQvSTIzTGZCV2QxdVBMUGtBNGJFNUpEeXY5a3VIRWYxYlBDeWFDeC93TitidzVxb0hhZU5IeldhbVo2NUJzcnd0bkxTMGNPemZvYkUrUEZHdHlLSTIwODBnMjRjcERrUDJ4c0xRT2tIMHVVNzBPdkN4VGsvbVAyWGFDV3RtVXhzZG0zcXkyenoxckxUS1VSbXZFME4yRUZUbnFkU3hxbHh5K1JPUXkwOUhVUG8xWnlGeERTSDZFR3dzdUJFU0hVN3IwbmhoMjNwalp3UGN5aDY4Mmp5SnZIaGE0S1R2RWp5ZDdUYkRUcWdqYnplT1MvVmtHTzQ0Z091K3Qzd2N3YUZsTWRYMkRtMEppcEQ0dHE2K0FyS0xROFlsY2V0OC9zaEZVVlZCWlIyVHFPeHVQYlBlT2hrNVBZMnhsdDVvK0doZnVNNm42UmdmSGxqQXlyUTl5RGFVWkpVRGM0TDJ0VEZEMTJzaTU4UW13Q2NUd1c5K04yTmwzVENlaTk3VmVTdW9IY3lCY2w4ekJWOEQybGhpa3JwY3lURUpuYVV3dmtWdDhVTG13aUx0RWtJU1d0Mk5qTlNuSTV5c01QYm5Ha2pmenJ1Y1VnMjlDbDJtTHRPaTc5OXl0M3dpaE14cGFRNDUzY2JZMlR4cWpidjQ4eUFiSWtqRmRqekNBSHl0bGtyWFVEcWlaZnFGRTdsUVZjdm1SNWd5bzdiQUVlWUdRNWVSNWRDMUROQXNqL1lPQlMrSmd6VTg4VzB5QWhCME05UEhLRVcyU085c2RWZklKTklBaHZ1SWE1VWxuQmxDVnZPSWhaSkxaWXVFaHJCK1htNnlkd29DME54OGlGcERLeEY5dnlQeUx5V1BFcXJHY0FidjlzSUMzWWs3cWI2YnlCVC9xYU1mSHJDOCtvNFExb2FUY1J1QmNsUTdtbXROVnQ0V1loSk1OLzFnNGpOR3d6UDdQR3NKUU83MFNwdGhkNHIzbm5aaDhKeXRBLzlyc2RPUDMreHF4cFJMRDUvR096MkhZanMyMWRJUUlHZzMvbUhqakF4aDQ2RVp2bXR0SW9jUUlaUzB0V2JUaTM0SCtqQ1IvV0hBOHRkUWk1WDZuVXd5K01TYkVFbEVBK29qOEtIVmU5ejRiSlQ5a0xBVUExaWhXZmNoeURzUlBOOXp4Y1QzaFRaNWVaY3E3QTRwUW94ZzFOUHE2a3NDcFZ1bDVldnZJZjNnMVIrVVZlNndGSHdUUURWMzVWM2p0Yyt0dW9sb1JFb284MmNrU0h3WDVkN053blBaOHVlSzBKdHRKOUx3cTJsdDNKT3U4OUQ5ZFFFWTF5UGFsWXl3VGZQdFRIakJwMGZSdUlwcDR0V2VQRkNrcDBZNjgzK3dVVE9yNHAxd2g5RGlPTDNFRnNFWXRKS3BTalpGdklST3JnYVFCMHUxZW03Qzlmd2xTd3pLZVZJTzR3SlBTZXk5T2lpeWFyUittc0laL0pjTWVlL1FVZTh0bmNNOEtnT3NjQTZ2TzMxMStBSmVqcHI4bkRNZnArcWprc1R0WXhqUkhhRWc0RkwwbHJ3TnlrM3FUTjdUa0JKNytFWXVhRm5BWU95N0xib2VhcVV2UzNRRGcwU09aM0Q0Y2JjV0FTb0JMV05MVyswaVFTdFREL2JwMHVRdU1rbzltaHQ4OWR6dWRUNG9HN093b1Roa0s1TkFiM1Z1K2NUS0YwYUgvc0xmbm45ODlFK3NmRVp2RVRTV3Q1a3UwRk5RWGFOY1pJOXVwbWp2YURDNWdUNGlaVlh0UzF4SzFRRWc2U08vTmVMeWNpeXhVR1M2ZTBrM2FzMTJNdFFtdk9mSFFGSGdCenZMY1FGNEVxTkxadTZwU3V0cWsvMGFtaXJSMjdyNlliZmEwcTJTamRybi9GZU05NXVEb2ZyYWZQUWY3c3V5WURmNzh4bzNycVNudHhPUW5nWFRCNFpDbW9RVlltdnR3OUZqaFlSRkhzSGl3TVdydlB2Sm9MUWNzamlTRzNMK1h2bWg4MVdRNnZENEhjRGtzcWV4Y0FmeXRxYTRZcVFSbFVCZ2JTaDZVWm1QaXdMdlVRMENqTGtRSjBnVXlyVVNwQ3Uya1RxczE3ZFZJeTFIL2JXQWRDRUpkems1dnd3cmNkNndDeTAyQTNDZWpDdnd4R09LZDFWZ3RHd1phK1RkQTJTSGVmbjQvb3YwaU1aRm16TnRJWFJFQTNmdnlocEZrS2gvNmJuUlZsQzB3eTlTUkhXMm1pRWs2YXY0eFFaMzNMWUZTNDJWbzM4QkxGTHJEUWZUcWtpTzJ4STdUbmt4cmUwd0hMMXNjeEpQSEhpQ1NVRzBhSEVVNXlxbEp5cEZTR0VOb0puSm9SNTZBMHBxWjJuVjVidml5NEkvSmZWTmw2WVZ3UFVXcS9sMmZ5QTY1ZUNkVW5LL1JJUEdjNDRpeGdqdHN6djZZZFdpYy9kcFZlc1FFVlkzM3orUzJ2S1UzL04xUmVGdG1GRE4vWGtnakpWV1pwTzVpeFpBK2ZHT2h2R0ZkUVUrb0R5aEJzRXljS1RmcU8wanZMVzMvMmk2RGk5MFErQXB6VjJ4WGVUUW1veDR1RndsQnh2N1NocFJSWlYwZFVpYUVxdkI5ckRCa2d6OGIzMmh2bk50UnY1dUY4SUhDNVBSdDVtUzRBK29Mc3d1K0Z6WUtNT0MwdnFtMmt1dG1UYkZSY1Z0Wm4vbUN2Z3U3WEJSQlJSeWV6aUZnbnloYmJpNmE2WDRmYWdWYjV3Q0FqQWFOeDZZVEdMdEFpMnBURnZSOERVYmtHV240Z0l0MWxIb0VFZ21jMU9uaFkxU0lxZ2g0QUZXMHB4NmxvazBMSnUvdUI1VllmeHVuRWVsamltcHJoUkFqSGp6Z0pWQkRpdzV2d0x1VVY5OTZPRmw2OC93QmVyREhDWkU1VnY5MXovVEtqc0I4M1N1am5TalhXTWFnbERFMzNNK0lYQ2thWmJ1S2p0L2xvWUl3YzdrWnQ1N0xQSTd4Um9sbm0wWHJUOHlOdlBqRlhXQkRKV2tYc3E3R0FSbFMwcVRIdFk1VFZvQVkyZCs4Uk85YlFzb2hnRFZ1dHI3QmFPcTMrMVcwNzFNem05RVBPM1FjTUNEWjNhQzJkaXppSytIQTEwdjQyYkxGT0daNnd6WDE1TWN4UjFtM3FrdFA2SDJnZDBmcVBSNWkxYnRhMC9uaWhsTEh1alFNSGdxWWlYSVBzd2ZVemRuRFVPYVFwRURPeUxpdGN6bFVUOHpnNmp6dUx2RzlhUzExZGxmc1NCZmp3M1MxMTRGb1EwbENuYkh3QWx3Sm95MmY0ZXpsY3Y4eVJqMWdqSVk4ZEx4cEVNTDBiYWFkd1R5TEJwOXkrNHAySDY5a1JNcy9LQnZyU3ZYZ0RPMWFldGIvVm1ldXF4cXpjVVB1OXk4RXhobXpqWTNBejBiMTMrRU82QVpDNnFpbTZhK0J0TXk0cmwwN1NyUzlrazlza3hociswTEttamVrRlc1VmRkZW1mZ1Rpcno3MnIxSFRRdnY4NnhtSmpVU3NVa0NVdk92Z3dkQ2JBRFVIQVMxbzR6UllNK2EzblU3Vit4VzVHTEpQRlg0c05Eak14czdlODlOMzBSS3RiaitWQ0NCekY2dDJSOFlHei9CcldwSDN0VkxGbkpXSmRsdnpGQUlOa0dDc0Fhb1R2SlVjVWxJZlZaaCtQbWQ1OWNnbmkxbHhEY0xLb1Nva2NienBEY1hLclk4SURMcWZxYkNrSnRxRmkwdmxobTVtc2dLSVZSQWJrOXQ1T3BURXk5QTR3dHc3MWtUTE0wdW0ybXM4dVJHL3VuRitvRnFXUk9NTU5IVGtnVVdUNTdpNnpvcjFWSEtYZFFaemNSWFQrMjY4NDFFRzZ3bkMzOEE2SVZDS1FWdjNpelJlSlpKdVNGR3Y4TnhXYVlOYmFNaUc2QzJWRXZSMmEzTjlUR1YwK0puQ1E5dmxtLzNvVHhaQ0J4ME9Yc09vOElxM1J0bXFFYWxFL2RmRWt3dVIzT2JqRU1ySmtuaWtZbGsxeWlJeU1LVERNS2U0WXc4N29FMnpqcmo2RndqNjhseG5MN1laaEZFMktUK0JlZWxnRWg0SmNzWXVqOGpEb0ZhZEw2c3ZQb3E3NktVcVIrQlZVaEdia2ExK2cxd0JFdFM3R29KN0Z1d2tuS2luZnB3UVQ2UWJCL3VSNlgvQmN6QkhudmFwaWdMQ1h4N0hCZDE0Y2szNTN5RTdBaFlXZ1dHQjBINGRZYW9NVVFFNGRXU3ZxYWE4d3hRZkdsMVRVdlBYKzN1TFJQcVRNODJLV04zWVRXNzc0QTlUaGY2Nzk4MGc1YlZnRE1EdG9SOGs0V1JvaGsrR1dCZGdmZ1hoaCtjR2xXUlpPK3ZnNGp3SVNKcGZmNWNvY1N6U1p3N0xkTDQrRE90SXJBUjA1R1o4SkF1YjRjUjdvNDE1dzk4ajJvVDc5eVFIM2RPdDdiOUdhQTFyMnpiRlRWSWJSL3N6K3JHaHd5WmxlTjRyMlltTE9iYVExcDl0N1NxUkpuR1plWFZFRVQ3Z0ZpdlNsMU55RnA5ZUJEc2xlSFVmMis5eXNZeTVPWDdiMW5ta3FpejZpdzFWOHFjbnVabS9CaVA4SDVTYm9taVArazJMdGc5aHpFTEY2N1JUNDdtT0ZxZnFaazNNanovTTBBOWx3dVNVZlN3Qlh3M1d4aFVUK3dPaTF1TFIwZTBzejV5dmordWFDOXRHemR0a2ozTVlVZE1kZkdUTG0va2lSb2w0NkRSelpydGVna1lSOVB6TWxIUjBNOFdQMndudnpNYXV6alpNRmxybm5hd1REaVVQN2FSa0svWno3NW5NQkt1T0FWMlpBY2JpaGtQZnNTU2FHRDNabmE0U2orUVFRUTdPZzNzK3Vpenp1L2lnY1lUclJmaS9nWHRBZWdRbjlXaFBtVFA1aFo4MzBiWmxLTk5RUXZPbzhOcFZHbnJZTFJteUhuWmFCMytvOHNWeDF4bER5dzBZbTBQOXJmOUhJdGtDTEl1bEs4UzJCUmRnTDRVOFhHaVJCSFFlK1h6QmdtTDVOcFB0TGkxZWdFaDdacjVRNlg3Z3dXUUNsOW85ajFFRzFWUHpEekd2djh0QmVLOGx1ZXJScjRzUHU1aG91NitBei9EVjNJRkFtSDlTeDk5K2hZYjJtTmhnZlFYdGsvQjF6NU5PTk00bnBmWXdHR09ReTRpVUVSNW9MMlFSMGJSRmJXQ2lpVVhnWWxLOGM5SnAxZ0g5RmltNVlRQmFCVmFyVnYwdmduRHNqbnh1Y2pVMmRhVWtFQlBjZHkyc2NBTDNFb3cxSENMeW5BQzYwQUlmdCtkMGpvMEV2ZTUzSms4dnY1Q3dWZ2ZVSmlBcHBIMzN2aUpVNFVURGNaU0ozcnNlVkpENk9pd3VtVFZ6aThiTElNRGpLZ2hxTlpDN2F2MjVYQkh0R0VPNUFOcWUyR0JGeGNLYzlUZ0NKajF4T2pic210Zk8vcE5VLzFpNWZZZitFT1dQSk1sZmRHVjkrelZwL3hiN1haMEtxWld4L25DRUJPZkQ3VnlYSGxvVnUrRFNTcVVtNFFKbFkrMk9oSG1tUlI5cytHMEhPd2IwSTRVZkRCZGFtb0NiM2pGTlVtdHgyajhISktESWNJV3pBWGo5ODczbWpjeHI0eHZVcnVoYUZXZFpiS0QvL2dEVjNFd29aenkzVUNucUEwTVhsaXpEU0V1NG82bzVUU3hJQjIwQjhPdnA4L25KUCtnNjBhbCtoU2RpMnFMaE12aUNpNFhhWjRCUGZJMkd3ZGRwdnFUc1lIcTRVbDJPZDlMUllheUo3M2ZKend6ODlDMWhqVGkzaGdSTTFwNmNJTHNWQ3RMS3U5N1lRL29MYklJRGVrTm4vWXhPUUx6QjBnZU1hYWR0aER4dm9kazFkWDdrd1hKVHd0Z1VxQ081c0FjTERGQjlBSjNycldpMmZ4ZDBJL0NKK2RXM0ovY01GN3ZsSTJURkQwaGtuUUVnOEJ5dW02bGgvaEJBd3VlaEc1bDZ2c0M2YTlrQVVIanQyUEhOMjgzK3c1YkZyZDd0VGFtaVNHbk1KaFBVT21lYzhtK0pvaHBzK1RQbzdEQXRETGxiN1JRL2FNVVBEeHlqUmVTVlBEaUovbU1USWxHbk5icUZHYVZZT0hQRnl1bWh1Y3A3dVpkS2hIL2NJM1MzdGh0T2ljTGlYaWNhdkFZY3h6blZTTDhvYkt4ZEMwcFJKNUFEdENUNnBGNG9LRnU4TSs2Q1ByZHpZYnl2WGtsb2h1NWxpaUNpY2NvbzFNN0lKSGsvczZlZVJrRWhMYW9lbTJLL1VUdWF6eEpXR3JJZGpVN3dLcStZZGd1dlpkRDZDQ0JzMnE4TG5vbmxzRTFEOUpnZzJ4SmtGTUxCRFFpR0QrVXh5VE0wamZORkhBWWljaGtXSCtKL3hMQjgrR0R0dm00cTdtNFBDLzFKMDJJMVU4TWhoVU9xcXg0NFNBald3SWhWUVNKMjI5dG4xNkJuUTFFM2owakI0aFhVczFmV1Ivc3MwTDh1QzdBSlBqU1ZCcWJsRFJLV2pMZDJhK1VKdisvODUxTkpUZldUT1FuT0xIdmR1aTBWdGFGb1ZNbXpGOGt5ekFESHBnRHA4aU01MEpFbm95RU1VTFJTdFp3QTdiTk1KUkxJelRBWTZqamVXNEM1Mi9ieWVOOTVTdWtLSGtaTVh2OTFCYlhZQWliTm9IQmFaaFRFeTVibkRrdm1VSk1UUS91WW5YMUtDWkhZUTdyMjdRWDNCNVovNjFzVThDVTVTeGFzQ2pib0ltV3IreXFjZ3RidnlKRFQ3VjU0QzNWMUJmbTQ3TmIxRC9zZEpxamJ2cmtrSjgxNUs2TEZhdmlmSklwbDBFaXp6UzNEV21UUVFDVkdTSU5ncWMwdHlGKzg3SkxvS3lrYk9Od0pybGEyYk5RRDN1ajI1Y2NBVHQ3S1Nra0Q2QXRxd3Q3OTBmOFlLdW9rWlNqYmdhTGF2N1FCWnJiSkhveE9CUSt0d3pTRVp1akVYcHZhUThNbWI3dXQwTEMyckp2dmpiSW1LZmNHaTNEazJCWWgxaXUrWFJ3SGV1aHJacEhVOUlzVGtlUmZlcFdmS29ORUx4T0loR1Q4cldDNDNVZ0hMOXJGMllpcENSR0tqamFTSTlBc3BtZlc5SDY5UHAxTEswSHJRVDBwQ2RsQmwyZHByV3hyaE12Y2gwTUFCd0pocGRKelBWc1NCVXgvTFJaTVZhSmtzMGhReFZMOFVFdUZDcmx3NkdRajhHNnpjMjJLV1RST3J4S3FDV3o5dVAzSHZiQ280QTA2NFJpY1NVdEduelpOYjN4L0xzdCs2Wk5ja3FEMWJwb2xnMXp4TkhzcW4rK3dmWnd3Q2VzZDA3aS8xYkRNSzUxRnJrSFJXelJTQi9aS3B1T1dMREc2TTdwRVdoaFRrYXNGYXRoZFpFU1Nnck1xVExoWTArUmlkT0FzZHNLcmp2MHhVZkNPdUJYRFUrd0lVeDREUTFITHdoaTllRkhFNUJ6UGlyVVVYUDV1ZTc2VGlCUHBMbWRvQm1qb2g0STd5MkpnZWRxVERTSDBQbFo1ZzdWZzdsR3o4RHVybkl5bXFsVkQyRndPNFRNQVlGU0pJZDI2WExUNUpqUFpsZHNjWktKY0JaVWp5VXRQZTkrVlVKQTNzVGo0K3Fwa0srTkUweThmSEM2Y2o5SEpIOVhCRDROMXdmTzE2MEtQR2cvQ0hGNElvNFlaVEdXMUdhVll3WEJJR2kzaHR1Y1h0VzBEUlhRWFM4d3l1Q1pFMitVZi9XTVl0ckt6Z0kvZEtVRzBtMXZ4cVQ3ZTAxc09mTGdvODlmRVljUDZRR1hkb21OWHF5SHJqdzA5RjRUUk9KY0J5ZUx3dnF4TlZISml1dUMrV09mSURTTENVY3JLc1ZuSi91NnpSdHFHNjVPcy9obkNwVDBWYno0cGRMQllIMlVJby8yalhJYnFjM0dnOWhlaHV4VjF2ZGNtTlBJeUVxWVYxT0kxVjRrQTRhYjRUbWdWNUtPR3N1Uy9mNXh4dHl4NVQwQzQ1Q3AydGJXbkRENEZ3cDU4YjRTR1o1UEVuMHNFemlKYi9CT3VjNzFaQ3cveExzWjU1VGlRWDFRRmNjK0lBSFlwempWaDBNZzA1NFRLVzgwaHEveGZIVENPaFRGTTBhYUJibWRnTTB4OWU0bVk5UXR0Nk5aaVQxRGVIaXEzT09lbGJsc3BSY3JPSnl6Z3pEajlPbjZ1WXNWZTVpUndxZW16RjdTYmJodHpEbzlieG5iQUVueHJobERzSUJXZ3BQbUF1WU5wY1Q4bDNneGRtQ3IrRnNQVWZJZVVZZHV2MlBYcWZxNE5FdU9iZEVWMytQeEpFWTQxNWdSMHYyYXhOSWlqZjl2OTJ4Q0FWV2tPcjdGZDUvWW04b3ptZ2pSblJ3RVF0bkVYY2EzdnRnWlQybXI3MzI2bU5EYlkyZS9vaVlvOFp2dU8zOHIxMjFra3laVWwzbWxsNVVGOXhKN1hhNmNrWFJoK0tyYUZUZ0svN0crVnZvSHA0cE9lcUhFSG56dnpTN3ZkcnBWSHNuY1ptQVlINU5CYzlCT2JJRis2QW1aY2hZUjN4NHRndW5RRzMveTFrc24wOXIyaU9idGJqSjdWTGhWTUIrdEV4WlRmRE9IbFhKVHNDYVJhbnUwUzhvQ3Y4ZUFqeFcxeE80K21ndDVMajBWSHp1QTBqazJrM0hmVFpud1dnSEFQbVYweFlaK2p6K2ZqTWtJbFBHOWFmMkxqdm1OOVJFZjlLNWRwZ2V2S3ZpNUJRWUpIS2JWaWZRYTBjRHVRaDRML1N5QTZjTU9rNGZleUhNYktBeFdsb2ZxTEU0aVpCTW5HL3h4RWVnVFppRUw2Zm9zMkVNQTliSkFYT25WdWRLaHR0RWxsNlkzb0x1Y0V4eVpZQ3VyVXVqQ3VmL2crSUxiQWlpdkkwVWVSbTZvSDJUcnVBRm1paXFOMVV1Wml5KzhmTUd5Mi9vRi9vYVJSOGtiK01ORWZ6UVFVbmZTWG9JQkh0Ylh6UXRXR1BVZzFPTCtXVVY2UTBTN0RSK1pkdXBTYUNkQVowWG52Y1ErYWM1alBKYWE2UzI5d244U2M4TmwrakJJTHQwRk5hSG41MHROL2lDRFpxcVgxVk5lWjViVjdySDR0WEtNN2FHTjJScThvaXJiVTdvMzdNTmpDdlQxenlRZXpRU1ZDTlFGOXo1a08wdXZNd3lCaWJTVGVMVHlVeEVJdFJmamI5dll3eHJIZ3ZrK0gyWnhDN0F5dVFYMlJ1TllqWXVtYjJLbTM2TUpCaXFOTGxkZTNGMDNYMjQ5anovdHE0UlJEazNIbmh6dkpOUHNJMitPSDgrbnVuMjRBQ3lQTWVEN2c4UzBUbmIrbVdPK2xHaC9wR3ZiTmI1aWdxcVA0Z1Z2SGdKSFRFSGpSZzM5QmxPS3AyTGthUlpLaHhmUU1WRkY5Q1pTNTM2aVhicFRibCtFOFdzZFlQZ1ZkQjdkZkw3cGwycEhucVFHd1hxeCtQZzllYU1hcFBKMncxcFA0c3NlRHE5RjFPVHZ1QnN6Smdya0RFUHRQQytjUGloYVNGRnVSUDBKaENIQkoxeEZrZHVaSHZGd2x4NC9ndllPa3djSU13NjliL0FZRDZlRnhkN1F4NDRTVUJVOVVnT0JCTUV1d2ZKcG9kS1NsU2JoOGNCQVBKZ0R6RWYyYjBqcldVd3B5cW1ubWg2UVZXM05TOUI2WE9QdldLUXhRc09ZMll1cHNwdjI2ekwvRE4vM3JxNzJ6Wjl1VVhHSGlwMHM5ZnlqN2VZSm8zZ0htSGs1OTQ0Q25WaEJuWHRIWFYreUttQ1RYQmxJQlZqUWVaelhzTlRwQnFsQlMwMTI3a2YyTHFlT2VTYmxyaHJLMHExUzRBNHFEWlgvMXNrR0tkWDNiRCtsamtNUGt1SVUwNVVobTlyaHRQSGdtTmdFeGtocmlIOHd2UkFzOGFzOGFlQWdESU1VM2dYWGxnemFJeXNLamRJbXFOTUFUdUIrZWNsWUdqam5DWCtLTmVrK2V5VUpvallUN0p4ZVVoMDUxMjh0Q1IyQnVRK0h5bThVaW5SZ3A4V2hBSDZsaEVJTm9FUjFpbStIeUIza3dPMkdnNklwRXZ2RHBhL24rRCtuM1M0SXdURUIzdFNxWXVWUmNadFdiY1ZpbytHakxjNnVIb1hTRTEvbDBSekFlUnplOWNlZml3c1BWSUUwV2RvUjExSnltWERudlFqM0R0QVNrQ2E1QjQ1RklrUUQ3NHBHRjJGMU9HOUxValdTS2I1ZG10cE1uNU5CWE9jMDVKSSthS1dLMHpHTHBsVXVJR0hlQUJUellFMC9VQmFyV1pPWjJJTWs0OVM0aUkrZmtjQW1zTE5DVXMvQ2RRSWxvblIvdmlKYkRqM2oyQUJRR3ZURk10YzF5MytNa096RUtJNy9vTG93MHp6VTV1Y3ppVnoxOVdvMVpETXBRUjNFM0tXQmpGZUlpWUFyQk00V1hXWVpPOEUrc3U0NXBKUXdRc3NjcFlNdjBRenk3U1FVeHdFdzlhcHZyMTV4RXFwem5PbTFRY3FHcXB0dVdBRUFodDhzRnZQL04yblVNM0tpSC9VMFJ4OHhPaTA2a0ZMbURLcnppN3pOVndyOEtaUEQ4K2lsVlZ1Zm5OL3NWUzdsVkVJeUNJOTBxL0xEVmNOZHpCdU4xNitDRnB2blBjNllCTk45KzdWcWREd3ZWZ2dFWnk2ZmZSU2t1VWZhcUhYZ3FJWWVYQUNTZHVKWmJMRkRrSDRoNi9iL1NNUDJmaTFIM2h5eXYwVk1jWHBzcXRDanVlQy9qcTlGTmdyYmJLSXFIK255c3NwclJwNkRlaDdnRktGOXVodUFveWdqVWg0ZkhMQnBndTJvMjl2SWZIUTV1OEV0YWRWTVVveWMrNGFia1hiTmNwaFBOY05SeWk2RVZqMjZYUStEZmY3OFI0Nm1QREpubWFRSVk5UVZyQVZqS0xaR21RVDRHR3RGY1MvMnhqS05ocGU4Qmg5QVpBdHV3d1dTTnJIUEZhdHFHLzV5K3JkWXFvekhzcVo5enFkbTJXN0tIaDV0eUpneE1waEI4MDd5MXEveWNyZVhDSVNieGdLbEphbkxGUVc4UzlqLzdUS3pRekRLR21uVHpuYUFYMDFGdW9GMGhjVGZ1YTRsRnIrTDlQQkdneVVFNGdSblF3M3RJeTcwQUVoRHpkVndWSWR0d082RUN6ZXBySlIrcmlZeEg2VTdOY3h5OThzMFJWRWdpanl4T1oveDJhVTlxaE0yMENHWUtTK25rbXkvUVV3Wng2bjFwMVJ6L2pnRzZ2WTlsTk5rMGlGR212RTB6MU56NVI0amRZVUhrT3dEdHhHMEMvQWNnL085aUVkci9qQXJjMTc0UUhqdHFYeVp6YkR5bjlQVnlDbENWYWNtVjdISitUdzdiL0s3cDdHcGxHR28xbnFzNEhzQjN6TndKTW53NUhFRkUyV2lwczdiVFVCQ1R0TGJvVjZZL0xUS0ZrY3dZNU0xeDEvR0lFbU5SS2pVQVVnVTRZYStzeUxQN2RpL0ExcUpCSFMwNlZRMVQ2aW82dzVyQWY3VVVZWFBzWjFOQ3VMdGxLazlqR1ZCNXhpRTlCNGwrL0g5dDRVVG1YWHNlQ1BxRVoveXZ1dVhYYnBndjM0MWZndUxVTDVCeXdwUytrMkVyaVVZenUzb0NZNUV2WXNXZDhqMVlrVXNNWXF3TGs4eDZMbG1VRGxiWnN1Q1d5NWhmbkE1TmhWNDFRMnRNdlk4d1ExNHZDV2VoaEVNaDlzYWxWWUsrVjZwQUlzdUF3Nmd2YTRKdll1N3hMdFFFaTB3OGpnMDAvREVMZVFWeDV1T2p6cGhFWUE3S1BNV3Bjak5VU0lBUWVJWWpEY29MNTFndFVOZFJtNlVIMWNTOFVKSmZhVmZwOSttVE9GTUVyeldQWFZNdC85MVpwSzM3U1JneXdMc3VoeUtMbk5YendGb1llemZMc3BnQmwyZ3A1L0dZNWRLenN5U2VvNzRzQVNXbDlMS2RyT2M5UExGUmMyaklNTXJtR3gzNjFvV2ZYYW9jdnkxajVWQ25OR2o1dDkrZDBPd3E0SVB4dHhpVlE2U1k3Slg1dUhvVUdodzRLZGR5WGt6dU1hbCtlZHk3V1hmN2w2TGtubis2cDZ6MCtic0pkM3ZzcHNjV3dXUEZpVGMvcU45Z2U1U1FVdDBKeVBLdjErS2NDbHQ4dEozU243MytpcmRNT2lhaGM0UUN4Y3ZDN0ZFZGlQVU1LWGFWVzdJNStLNmI4eGtFL2l0bk1GSDBzZ0loSzRQYXZ2dmFtbDFkTlNMTUNndTZ5R0lNVG5wNW9vNkQwS3I2Z3BVMlUwenA0ODVzWCtrK0Y4QklrMy9wczZCUFJ0YW9ZVGVUQVR2ZlR5RXRsOGxGbGFXUTNzdm5vY2l3MElBVzhQV2FjT0lUejRuUmhucDBhSlI0V1duNVR0MitwaXZXMUZ5OE5sNWNSTElSalFMNWtVOW1ha056Wk9BYjJRUDl0UVRZaWpvMzBid1VDczdXWWo3NXdLUmVFY1BYWW90YjY5QjBUQWtSVEt3bloyazZ2UWRiKzJmZzJHZVJqMjBvU203eXllNy8vRVp1YTVodDRjc3Q0UG8xMUxtb1MxYm5RaVM1VU96Q2NoSDJYandMcklIbHI3YldBeTcwMW1qcE1xZ1JZOXVzcURSUGJSZjF5WVB1RkFHOCtDSzlmUjUzTkNIUVRpMWt4OFhHL1JXSGdxRVZXOGUyQ2ZGY3ViRngySWRHM2FVejgxK1U3dHM3VGpVVUhESWx1TW1HNkxhb1FaN1ZhYlFGUlkwVXFDK0ZINVpmWjNYM1AyM2lSUHFMdnYwTDhxUmMrM0JRVE52eXlXRmh0c2FQazMvTlJzQkFaZjRLS1pwbGZKc2c4R3FKdlMzemw5VStDVXo1QVY5ejdNNzhvemF1dFlTcGlFS0dlMlJ4SEV3b1pGS1lrRkVsak1OMHQ3NWxpNFFqYUg5Nk53T2NEa25rVjduU0kwaGxhNEpDK1dLL2ZmcjY1ait2UmdQSkxRbWxQTytrSzBxVHR0cVNCUTM5L2V0TzhNckhPTFlCeGgxT1JPdmZobzhOMVFYNllnOUtkVERVQlFkSldmcmhNMGYzdjhhaGQ5NDFCdWlZT2tuZVdTN0Jici9CZktXSXlZdnBKaEk0VXJnNVhHaVR5Y0VJZzMvbWNCSUt0RDlxbEx1Uko4UGlSQnYzN1I5ZnJOREt1bkR5YXpLVnhaUW9JMmZxeElCRFg2Zk4vVG01T2FyeElnY1NFWGpVVFZjU3dqNWs2MThLQ2dYM3R3Und2eUtFK05ucW1TRnZTNHZVdC9Vemlnc2Z4QkhxQVovenAyZ1hTUllyRDMwTTYxTUdLeklWM1YxZDgxN0h2YVlyVEVCb21TTVoybHp3M2llWlVyZVVmSmsxdG9iZENEK3pubG9ZNFJJaVJ5Z1dVQUVKbkJGMVdVRm5QbnJEYzY1eUV1K0R3cUZpS2ovSk8zZXBMUWd0ZzZzVFpKamgxclMwRGN6TllYcy91Mks0aDVCdkN3eDJ4OEZWbEtjcEF6SXFKSzVUR2d1R2Q5TVFIZlBIWGdhVDYvY2xVZ29JN2JiNHJLUFA5NERKL0tPK01oaS9ySlQ3SnhNMTZGNWRobzBwTHZadkxHUkdaSGtRRVB2OU4yWTVxTVdtYkR0UW1YYmFlMFVqd1ozT2Riak0yakZadTdnRHpISTVPaGxSd1lTT2VZZXpLUXdrd3IzTEhpN2xVQlhUMlp4VUN4ZmxNN3NxSzVPTjZQSGdFTnZLNVNLbkE1K0U1WktEVDBXUlpFMjA0RmJXTnBYYnNTMGNublJMV0ZsRmZkek5BTk1VQzVrSDJSRWRTaHhEMWpXTTI0ODRJS2RoVndIUFV2a2QxT1QyTGlKQldYaFpmUVRSZHlaM1BmUEZmRWxlK21sU3VpUTRFZVQ3SElEdzhTNmxhSm0yZTcwc2psMjNhYUlobk9NbU1OemJubVpyRzNMVXpsWUtlbHpySUtVN3l2QW9xbTFuYzVuSStyR0NsejVRakF0aFhucmtqbEN5NGkxZnR4SFVQMjU1bE1lbFF5Yk8vZEhtam94USs5YTNaZGpSQzI4ZGxNOGZDTmpLVmJCOHU0dlRwTy82ektqb2tVYTNCdkxwdktTMStNN2dnU3R3YURHZXRGcG9LUnRPMDhnYVBkQTZXME54K1RIaUhCT2FPbzd6V0E2c1d5d1YreVRTbi9PUU5ReGM5N1p4a2RDanYyTDJTVjUzYmlEMnhPZDhoU0FDQ0o0ZUlWZnJkK2k5d2JLcGcxNHJZdFZHcFZmdW9SdDBGek84QmdBQkZ3QnRlRVl1ZUJRQWF2OUJFaFJzLzJ3aGhQSG5kWGxxSzRlOFp3emFnY3pNdzRVUVVXb3o5MklxaFQwbjhCalBQTWFrMExjS2lYUjV5Vkw4SUZtVi95Rkx2SHlvSlBSZjdlSmJEV1FEc3oxMVdxQ25ZdkJEUUhIRmQ4WUlITmFXeWhtbzl3UkFGNjRRWHpxdkwvZzM0cGxnZlpqOUZkYWI4YW5UMkdicEZSVmtuUnljVzZFMFdQVlpoL2MyZS9hRjVrSzUyVzgrWlQ2UWNOWGtFTnBNcDJzYTJ3a1lDYzF0dDhpSFhEMldnOXF1RTRHcTZucmlId0ZFeE5STlVXREtiamc5N29lSk9RNHVXcmwvN3ZPaGNTOXRIQS9RMEljaXZjTTBrNXBSaWxaUG5JWkRld1JsNzRTZ1NMc3dkMDFUQWU5bFhnVFBncGFOWjdpampKdkg4c3ljVEYxQngrOVVmZ1k3Z2hPS0svSnplMDU0NFppalorZ3BmSGNtUkJBdE5hZW9jNXNFT1ZNeHV4SWI5WGx5bUVwQXVQNXdZZjFkV21oRG9SblpyRUNEaSs5U3ArR0R6cHFxYVkzMGgrZUVSRWNjY1Z4SFVSWXRhcUs3MHFtQktNbUEzVDRDVUF6WndvMXJaeGZHekprdXlkNXAzV09yTndHVnA4bE1rUVVpQWQ4R1hhTTRpbGRKa1J4VVB0TVQrSU5mWXJjL2c5WWV4S21IY09Ic0FTQ1RIUE8rcGVMbnc1N0Y0WVd3TjZVZ1FaMWhNVnlmY0FwL3pnUVBiSEJrY0hoV3AweVhtNEhNdTJmYkJ5VmQzak9HMUgvZU41QVdNYjFacDA5ZjI3aHZINTU3Uy9YdnF4eWdWWnF3RGRKMlV0Ymk4TFYwMXZKRHVnWGt6OUQva2FYWmtYeEtxOVBDa3ZlWkZlOThVVjJPeGNxUmYva1VMbkpLODMrMEpOSlVBTkZWck9Wb3k5QTl6VjEzVXErbjNSTWtFZ2VhWEUreC9MRDB4WXZvVUQ5VVpuM1dIbFhjaWJwVkdzZWdtdVZyRzZvOUd2cjlNNDE3WG5tYWxaTFExWVpZL1JiV1h1OHhjRlRNR3ZDNktRVk1peXhLVDF2Q1ZDRHlqL1JCSTBMS0xEVjM0Y3gxamRiUTRkMFZYcjhJLzVRaUhUakVlNE82ZDVCZkV3MHVLQzVTQ2tDRmtoM2xyQjI4ako3K3VUT2N6ZUZXblR0MjJVSGYrcEhBS2xicm1YaUhEUTBCa1pLYUZlWDkwVXhnVFRFVU1FMFVNbTNxSzBCUDdjZENTVUtIUTl4bWdoZG1xamlIcDFlZFV3K0hrYjJueVpCL1dNUzdTaW8xUFNzZ21HaWU2S2Y5M2V4ZDhtdnhTckJEOWl4ektZK0tiTUNVRFFQMVMvdXdhT0pubWYxZGNESkFESDlrVGE1WHhpa2JZY1hvcUpEbGYyUE1CUG1ub0ZXaEcwa2VpbmVkMkxiNHNnbFBtZEF4eE9tS2pqUDVVTkN2T0xiQWVMLzFKYk0xMlpZeTF0OGxCZGNMSlZSeWIxeW5yQUlDSTdnNGFYTHQ3QWR2Z1MzOG8wMmg2d3p6WnV2Ylg4d0ZYY210UnRQa3VGNTdQR2F1QmlaOUgyUEJxUjI4eEJSamF3aWsyQkYwU1dEdUhodDFRMVJoZXFRNnJHM3FvMkIwN0lFaEdMQ3NmeFR2Y01VbStNRFlkOE5BK1ZJOUc0M0VuZlh5Vi8yUE03R0JtZU9FYWMwN3dhN1p4WHRuTWdzOU9MTXNhWUk0Qzd6ZTBCUzFucXRRSWZRS2VYbE11dUpJNVdJRGxDaVJuZGNjSktpVkhISWJEWVlocTJOdHZJQUJLV0hJVCtPL2YrRGNkaklMREh3bW1mM3lIUmJsR0pscThVNUNWald3ZWkrMWJCbm91M3NQVWU2R25XOW52ZVpoaWRFVE1BT1ZwTllMYlUwZWMrOHpKdnNFUWdoTDlvMmVhaEtacmc3amJSaExvMnFQeWUxaklUZUZEVGUxQUgvQlZMYlliY0I3a3BUbVh1bmdEclRIVHI2djluNXdyZk5OSjlmOEZHWmJsYVZKRG5XTExxSklRTnZzRzRSL3M3WTd4bk9ZOVg0UXpkUmRzZ1JhS3JBVHY3TnZYZWFIYnJKS1FGUFRHUHBzcU8rTTZvU3R5WUFWWVNEemhkczd2dElyckJGNTh6V1o0WmVQR20xTTcxT3ZVeFdBR011OXVqaG1jdmNXa1FtbFhqZmVBQW90TmwvOGdYNUdQT2h5SmN6dlMvc0J5QU9MaWJRTlVObHpjNExraCtoN3NYck9WWm12bGlaU2hEMFF6UGNKU0NDRmN5M29scklqQWU0QkRadHlrM1hLOWlPelFxYzk3bmNqYzB4SXJkYzUrN2tKZElDd0wwcThRNnNveFpScDhaOTREbEEwTkFBdS9waCtJT3dkYUg0WVlmUFJSYVBTN2V0QTRxdjBhSGNTWUtRVkpsZExrRDBmRS8yV0ZpZUd3T0pPcHNwNWRZRGlGZE5oQ0pnMERUdC9Bc1p2NkZTNlUyTGN0SWJmTnBCU0xhanJ0c0JpUTFtUEhlYnplTlg1TjEwTEVSTnJSd2VSOU5FQk55aWlTckJ3QjBvaVRFM3QrZ1MrcHZ4a0FwczI5M3pYTmNpSGJMWlRhcFRldURXdldmcUhzYlVGL21wQVl5WlVhV3NkdFhQbk53Zy84aFJIL2ZkNTN4WDV6Z2pWK3ZwbVpQYk5pSjJJYWk2dU1jRlMxQXhTLzFBd2h5cW5TWUVKZVFrV1JGb0FUNEJENHN6WU1VS1lCU04xbDlZVjYxcVoyVXlvQlJHemtBa3o0aDdIWHZQdm0zNTdoNDRUTEpnY2toM2ZTVGc5S25PUExNSm5XV1diQUoxODREcThKRTQzQlNndmp6NElJVFlmQ1U2Rmg4QytVVGlzbFhLVXdHUE5CcDgzSzVzZmRRZEpEMXAwbUp1SVBIUnBwQm9TZTNJcm9acUhBbWxFREdOSVBFTm55NjFQV01HZUs2U2dQL2tHbUtXcWE4RzI0eEx2VG52eFZTeEhtQmFXWDVNUzZSMTc5ZTFiN1dLMm13VTNEcGZMMzgwNGZ5amNxT1FhVXBReUFjS0xqTUwyaDlWeHJxVG5LdUp6WXdNRlU5YXJqNlZyV1ZjSHVQV0VUUTlkaEg1bU0yMFkzMUM1N29kQVhuNm4raHo5NUw3V2cvd3dzNzE2OUpXZDJ3QzNlSHdPeGtTamI5b3hMQ2swMHBTTCtLOVF4V0tuQkkzazZJN2g0VGpEN1dTb1JDQzc4R2pTdmQ3aXZTbTQ0bkhjMXpDMFp4MFpjSEc3ekQvNGFxQ21KaW5aa3liRTlvNlVHRFR4VlF3cGRTcWtEL1F6SW5lVlV5dXB5c1JLNWVKRVdBdGFtOXY5MUg4NDk0bFIwT0hNU2xOSE5QcUpoTGs2ZEVuMVhUWjJYRU1PaUdEZng3eVpLN1hBZ3Ntelg2K1JBSFFuMUxKQUsrYkQ4NVlCdVI1Q1ZpdWYzRml3Z3RoZ0RyMTZ1ME5ZUFRGNVN5dkVXY2p3Rlp1c2ltNEc2TllERVhUd2ZQQjRrL1RFdkpBWTN5M2l1d0djOXk0VjJOdExRbUlSVC9qNk01WDlYWkc3M3ErM2t3ZHVoazVlK3ZGc1NReUsvcVRobDVkVk9DWi95em55TEpUQUt3RWhRdWdVTWVCc1NBVmNEbU04aG1JRkoraFEvdVdRc0gvZEJIT3hHVGlRcWpYZytSNEwwdmZYYkRuR0JLZFM2UlU0Ly9KMjM4dFR4NTBxa0grU08wMmtRUUs1T3ZhcUNzNTBXVy80WjdrSEtTVERMYU9xeXVEaGVPL2FBWm5JZktUQ1M4VzhFVWpDUUc3OW1INFhzY0JzRlNsbWl2ZExwalVFaEhxWC9CSHRNK2FXdzhwbEZGRE9wdmtSU1BWaUREVlZleDV6aXJnakRIRUt6ZDZjb3JHdmhBQTl3VjFkVEcwRlE5NFJheFZNZFJiSm1LeGlpRy95cnd6THdYWkVVZlkwVWJiWkovaU1jeW5ucFRZNWpkSUsyeVpscWtOaWhtS2N3L0w2MkJvWHFYbHFQUFdmVHJTd0lRaHE0Wmk4eVM0bGxDM1NjSGorQVhxSzZEeVBQQzlRR1ROOTlFSXp4dGdpSkNOZkt1NUppQkVWMnoyYkhMQTFVVVlabkVaRzhKYjFEZjlUclFOaEV2aUIzUlVRcmVFYXJmazJUdFNBZ1RGVU5pL2NNRjQyVzMraUU5ZVQ3Z3o4Wnpmbk9IMjJLSlBxUjFuOHFCb1dFQThUT0dweGFZOGFvcmV1Z2YxcHhNL2hVNURuMnNlZzNCLzZTTGx2RUlUMnJocy9kbmJhdElYdC9ibmwvSWRTVUZFeWd4MUV1bnJGZ01XcWQrRS9BT1A5VUc4VEQ3N092UnRMUHVMaWthaGFZVFJ1djhUb2dKaGlBa204N2pILzA5VnFUS2lsSW1RVHFub2NTZUVMV1pLSkZEbEt5UHFzNXJMY1pOTmZhRjJQS0hpTWIvUGx0Zi95V3UySUJtbUUzUUdsVXhTU1NTQkdWdkt2Q0EyNGFmNUcwemE2Ump3RTdaOEVqWk85OUQ2TEkwKzBBYnlxMjFsdktrYVh6b3RCUnVtdURDUUU2WWlNUXprVmwxakE0c2F5eldGQWJ3aWNiY0lMM0RmRzU5NHo2eUViQjBXcFZZZ0xlbGJ1QWIrOWRGNlRpT1h2enp2RnZoOEZVSlR0azI4QWtzZlIwaGZuMlp6Vm5KT0xHbUdOejAwZHV6Z25wR1RXeFZDQ2JwS3JaeC9RcHJzS1NMOGRMVlhnT3RsK0lXWDlmR3V0NVlnR1diSWc2Nlpyc2pDS3dHVEhreE44QVdiaUpjblIzNTRuOWlqRjJkMUF2cGVpeUM0R0NRRlA5S0VYWHlPVng5bVV3VHY3dTY5RWVsa0pzQ21wNGVXWmg3cVZZeU1OaDlKVnlYWEtWMjJUdnNqbkx3NkFJcGd3eC9kZEFONUM3L1dpTCtZRkhkMHR6TFhNbHF2MlRiSXIxU0k3VFVROURTdHI5M2dHWDZVSWpzalN6L29jY2Q5QXluamxmVUk3TzZTNTFsd2xaV3hVcGlqZ1FER1ZzRktYK2VIZWYvUDR2VE5NY1oxQXkvQnVRRmpzY3hhVjNYQkhTbkdhQ2VLaGlpcDh0UnFBcUpGYytYYkZCWmozSnQvN1NYcDVkd3FyaXg5U2QyVVZKL0FvT2ZwY3djY1g1WGVZcm5oVlRQbFBZZUxIS2ovRlVUOXplTzZGSUthaHdJdFNRS2RXRmhMU2NLWVBxbERnaDhUcHpERkxGWVg0cFo2dFpUVU96TjFTWXI4MDB0ZEZLTDVKU2pJOEtueGhSTjRsLzM5SGNPdHhYc3ErV2EyQ0w4eS9Xb1gzUSsxSStldjZxWEsrYnZmaGhUVzFmM1hIcWE2ejBGWDBJRTRTK0FWa1BYSlYxWVg2VFpuVlppa0JGMFZTVWJGTEhVbUxtYTBOZmxqU1lWUW9PUkw0NHdDV0hKY0YzNHN6Tkp1RnZvc013bGMva01hQmtaU3EyWkJzWHhERFExcndsbmJUTFliaWZiaVpUOVcwcHJ5ckNrRFovSWFqS2JhUVlHZkpqZjdiSk91WWR1VW9aeEZOVE80Qk5pdFlkRzJPREc0bEduWWROVmFPV1lCWjJMek5McTEvOUN6MFVXYlFpYlRXcE9JUGcyZkQzREVwMFN3ZEkveWdBUy9SZGltYWgxbG5tZ0ZKRzcybnova0ErQkdHeVJrRzN3aS9HL2NFcHQyMGNYZ3NXaTBPMmVIMDdmWlc4eThHU09rZkJ6QTJaRTJENTE5VmZYOVJQYzRYNTA3cm03VUlaNG9xa2FUTVd0U21WVXJja3VuMC8yc1JCMUVFbk5DckdqU2d2K2tvei8waUFTWVRMcmxvdGpJbmlkSTk0amUvS0lsY1lpMUMrQlZOWjUvUXVwNjNnQ1JFWFBSZzd2UGxhV2Z2WDl0TklvWFVSY1Erb1lzbmdOdVEybWRpZXQwUmp5enloVWtuNUlSYWZHU0hNelE1NmEyMUNYZ1BmYzByT21pOC8zNnFGbC9uaUlmV0NPR3N5YSt4UHRtL0FQTFo2UG1qVkduOFBibzRFQVNmSGFtM3BjM1FsSDZXMDQ2WE9jSGFDNUJSb09ONEhyWkx6UENkKzFrNEx5T0FyZy9LY3paWG1yMGFQWldkU3U5WklRQit6RXREZVFFSHc1eVVzd3lsVmRYenZsdEJWYlJ6M3FTWU9sWUxYUUV1cWwwdTVUZzZjMXo0WTVhenZvdzcvWm9TTjYydDRvU21wcXpodXRPMU1rN1ZuZjRGbHBiMWNEbzZOQWhPeUVUNmxZVjFkUVNVVW1QbHRCakJZYStadFFRLzBYOERUNmY1cC9CME0rK0RrY3dBbmo2VVFiZjhyVCtrWG1nR1M0RHlwbDFyQy94UU1JRDRBZWl1enYxREZUMHVUTTNpbXpHSEhTS1JRRWRDekR3aWNYR3lZR3hvQ1ZHVUk4cDU4K0JLbXhCWE55QWdwdG42cGxVc1lSQkV1SnZROUYyeVhQUkt1VXRxQk8zU1Qvek5zSGp2Q0tVQ0VrMHdHT2NIVnpFMGJvd3pxVzNoNHBxTTl2OUZrV0lpRFdMSklsSVNvbmpOcFhkbTIvZmFjd0F3TzNMTjBKc0QwN0NwWFFTSVNqVlkxTitUNHE2dExuSXNxMlVwVkpkZWFST3oyZDRNczU2MDUwZGlHTDRIL2ZwMFMzR3cyaHVTb05NN2lHYmFCbStzRFFiWDIzd0JSN1hIaGlNVWpJbFJyaHRHUzFJRi9wNFgvR0xSZXVQRFVGTklDeVRUOGwyb2FoenNQMWVoaFNsaWlpRG1YeHpWZnkyNkt2ci9kWHFqc0JYamZBWmZCSlVxOEp0dkFJcFcyQlppVlZLVzJWbkVpYXZBc3BBZ0cwcmdYQmNVK0Fjdkt1TmJ4REhQa1IrVWUrQTNhRkh4UGpyUEl0b3pvaFFNbW5vN3NXTCt0aHhQdFEyUDlXYWlYS0dKRHlUUG9LWmwrS0JWam5uNi83d3NBSmVIUWdQUVpQNmtXU3hUNWRxaFJXcDB4aHJvQStoendUdENFZzNaZFdFZi9oU01wc2xMM2VjdzJQQWJDM1J3RGg4bklqdnVUOWNDbXhEcEQvWG14OWhrN3o4eHE4Z1lQWHl3YjRwMDI0M0pISXdVcWs2Z3RZbXozSzRoejNkK0xXdlhYK0tqSWE4VkpXR1g3Q2pvc1dCcGNUdE5kQlJCeFhoMUhRRDdESXljbnI5NjM4NzlzUEhaMTR1WHAvM0VSWnMzZlltVTlqakEwWG9MeGpkOHhCRGJjaDUyek93bGdSTDN2YUtWZ1ZpY3lyMTNSenZWZUtaZ0Jqb1JGRmtOL05RcDFsQ09VTU9EOG1VRUVuQjBWcEx5N3ZlRCsrcDZKU3F5SzMzNHQyeVFJWEhhSHI4MlErZTdiSEh1NUFPVCtNMkd3UWRaUVpVVTZsa0w5d09RYlhPSnUzdEpPeXRLUFh4UWR2ZFB0Nml5bUw1SFkrTDMwNWtESlBYNG51ZUtsa3lLQXZwM201RVRaaklTV1NSdytoTHhHdFRBT0E3VjVGbE9zMnE2MXMrMmZkN2lHTUU5RGhpK1Z3aGFIU0hTZ1hzMXJjOGppQm5udzVkdFlzL0pobENFSy9pbk53cFF5c3M5NEJFQ2pqM09lQkJCblZnYVJUaGI1MHR4YjVDbFJFaDFDU2ZNWVFKMTk2NnlETzhDMkZsQzc4dm5Gb3g0d0hndktEZ3Q4MnhsUVpHbERYRTVsSDZKMVpRVVl2UjAwNUEvNGtWSFh1c3ZoRDNsQ0txUHZEZjJtUWZiUHprR0xRTXh4bVdLOUptNlU3WXpMdzUxY3RFaloxdCs5Q3dVQUsxa3BXZEZxRXZaa0Z2MVpXbm1XVnVMN09FazRDZHFvNm5lemZtN2M5R3VRUms0Ri91aExMSE5jQXhHaFplUVZ5b1VndUxKeElJUzFlVHRSWG1QNTRaV3FrV2JZMWw5RTc2NFRHbGxUK1BTempjTUh4Y3d0Y2JGWHZvYlFhZjNhTnZ2NHd2V0RGMG41U0ZwT1NxZVhRMjNBV3hNRDlSRDU4RUFFak10dzZVOFFLNkcvWG5aZkI5UDBoQWdlQTQ0VXU4QTJlMnNuMmtoSHozUUxmVk9iQXF1UkMrREkzekg2SlNZK2Y4Y3lCbk93ZnZOd2FDTVBaaUhGUTVWR1VvS01hRHk0MU16TWpZdzk1aG1NOEd1M1VVVEFFTXZZNUxxQmtNTkdUa0xHZWhQYTdKcExGMVJMaWd6ZzkwQ0NybGNDMGwwZ0NWd3dSaWU3ZEpaeUhVUXdGak1zUk9aR0xMUVo3eDU1OEJYeFJaUlVyUGNnbUgvcThwVHNWU2dDWU50TUxrMmpWV0p4RVZCNDRMUG41dVZkQ0ExQTlYaWdCSlZrR3BBQk9sd0swbkZGNWZxbUltN1NsSmpFejIrbktEa3pmMlhjVlUvTGlQVEJvZXZ2Q0EzcXV2ZVVDV0NBd1UwQTNYZHY0YVVRQ2oxVVJUaEc0TnNSWGVvNHZYL0sreTZ4RzIwMFJNeUk4VW5GZCt5bEwrY0RtU0xyTHRyL1BKaXN4ZEs2RDFQYXB1d1R0TEJScmdiMkEwZDdHTmhKYkZ5K28xTjcxNVN2Z0hGV0ZNa3U2ZC9oWG41V0RMRzBRZW0zMGVncnhjUGQ0aEJDRXlNYjZaSzh6dDBXRlVZaDNVSnpyaklXWEtoTlJCRTBpZk1MQXhjZE1QQUlIUmlrYlkyeFZ5YnFuNVh2TEp6V1k1N3N0UVA4TzVGOGNET2Z6cjd4NFBoaThjVnp5c1V1b0RmbUs5YWxqYUFUaTg2R0tIb08wZXpFSWt0MWR1V2c4M1p2dzVvV0xmWXIzanFNZms5U2F0bFl6MTIrTnE4WGdYWTRMelVBWWJPNWdkdHdraHdmWnQ2WDU5dTVhSzFZRWVRM1Z4K1ArQU1aNUJtTHFNc2pqQnZZTHVnQVJpTUhCdnI2Y3hnYkdQa3B2OExBVkhDZDVVY0sySE5jSTYvaXprTXVoY2dmR3pDeFNIKzNpZ3dpOHlGMnBoOTJzN2pWYi8ycFc3bFVjTVZyeXEvRkU4bHlUYWxCV0xIWmYrOERNc1hpdVc1cGtYSXRWTzBDTVZnT3g5NldraTBGK0k4M2JXMGJnRDhoR0dBMXRyYVRPcEJnY1g4eGxCVG91QWUzNzVPMStiVDlvTWFURTFZQnB4dHgvQm5EZEk3bTJ4ekI0V1B6Nm54VFZZRmZ0YWM2WE94QllyTFFNNTRNMXVEMU9QRzBpK3lpU0tENkE1cldMcjYwTWtYSGdBQ1Y2WlduMU9FQVF2N1dxRzB3WGl2NzBEMUQrMTk3c01MUS9MNGxUY3dGaTBBRG45NlVnY2ZVR0xGQjVKemlBblZjeEJ2am52OUpGT2pIQVMrbVBxQXBIdGFvblZjcjlqZktGaHlGNkVlYWFIbFVGWU9IVGIyRnpVZjhtN0dwYm1admN0SWRCazQreG9KaUY2NmNhTDdhb2kxNWc4RWlaUXNReG12T3k0V1JXU1NoK3c0djVtS2w1T3BkaXhKNUU3QjJsMnZ1UlY1bHYwVWJ2U0Zkdk12c20xUUJ5WS9pZEI0R29tS3VDVnBFM2VWZXFUT3Z2UE4wWWVPcjhzT0RNQVJvdmhvYng5a2tpdElLdVhWZmpWQXkrdkI4c2xvcWFCanJSMWhnUzdXU1dFZDU3N0lpTThlM2J6bDNmL3hNYnBjZkx3cEpBZ1VQRlZZMTBKMWRSMjZkeHFXRS8yMDNpQm1KSHFtS29tcmhNYzh4Y2kvSFY2NjI3bzlmcG1XcTJTc2F4YmZiTy9MZUs4bWF2enpYaHN3TEh3TnlXMDhhVCsrc3VIcWhRbTI2VVA5WGE3YkVaVktvb0NJS3BsWDY4RUdLOHFhUUZYSFhuMDhzQ3VSMyt4OHE0bjc3RS9yL1FTZ2I0dGJXKy85c2lGWitIQmtQZ29MMkVwaVdpV1Z1UmsxbTUyelQ4R00wS1JHU2JQOXJqODhnd2xlQmRHTG4vV2JOSDVBTUxma2lIczlmYmY1RTZQVDJJcTZXY1hEem1oV2VRNkpNdTlNMG94OHVxMWZtaDVvSTVnSlhuQUtjaFIxclY5dDUxUVNHQjJFcHlJemkydFFwTGhpclRqSVFCSG9ycGExMlBRZHBZdDhGVDM5QTF2eWFOSjN4a2VrM3BEV3g5ZWF0QnFWRDZBZzVscWhXdERBS2N1L09JbU9CRVZHb0laZVlEQmQxSGtsSGFDOG05VWpqbFdDZlFMbXlnTVhkbUVJRjhCZ3ZRbXBkTGd3NlRmelBGOVpWc3ZSaVpzUWhqZG8rRzhqeERnTzF4Ymk5SUg0ZEVWTVhWVG50dzhZQ1J0ZDk1cEduL2RrS0h6NnowZG1PTmJnQzhXdW4yVzlMN3BSeVJMTWc1M2RwU1NNTC9aR0tXMVgwNmJPUFR4SHBOYVVIQWNmK0hSUW1KTHJocUI3QTZ4U25ucHBLNlowQnlEM2QyVzMxWUVPbWtQN3lKVVUrRmczTGpkMlNFbjZKQ3Nmbk1qZzV4Vk0yL0NkcC9Wamc4RWJTa1orNGhqT0Z3dkR0U3pRNzMrU2oyZDR1VDk0cWQ0ME1uRzVDNTI1RnBnd2dlNDBiTGtlY3RmU0t6ZVk1Z1JESEFFWkVzRkVkWkpDYTM3WWJqZnJxSW5wWXNJYzVRNXRvK2NRL2Q0a040OGNrVTExQzBUYjN4MzhtNk5sbE1pUHJjWnhnTE1acmZJMCsyQ0ZiYXMyajUrY0NQS1BEMHZabDVld2RTMnVIUFkyM24xRFg2QzltZDlsaWFmVkh0eWp0Z3JsQVpYcTNnZ3BIY1AxZCs2NDZZSFpJQWJSSGdqNzVwYXNUYzVaY1pPWEliQkdiWit0T1VlL3EyU0svYmx2aVdjaEVjbG9kU2RYZUVsQmt3a1B2MFdTbHVMM3hwTGhXVFFuZ1VyVGVMUTRqNTRDMm41cytPQ05MN2JTNVNKbVNoZzFIUzFqenZXSEtRaTVqMnlndVI5QlE2RTRMSzd1eGNyZnF2RSthT3J3S0gyMWhNTkJCWFlXdXhMbElsSDhLU3QwbEd0akowQ0IrUForcko2UklDa3RDeU5YcVREME82UkhyOWFiclBwS285K0Qzbk1tTk03aXYvQmoySkdsbGNtcVZGQmZraDFudzlNUTZRS2l3dkdYWnl5YTZ6WVNMczZxelc4VGVnc0lMcTNTYUUzNmxBdXdzR29CamFmdFg1Q1Y0QTNJVVdGdGwvTTE1STVLK3lpMVJUYS9jaHBMVUdDMExtSk1sZ2pCK3BQaGhLbS9GblRtaTRMOS84NERnL1RsRGFvMitIeE1SSzF2K3pCaDdhdnk4STFXN1ZmdmczM01FNThwOHZTeE9nRER2RmY5cHl6NFRueUUyNkcvdEU2RDlDTWZKSmRKMDhleDQyajBTbHlNMXdQbWRxWG4wOUZvVmxSdmpOZFRIMUFDSjg5ZEw5NFhxRXN3d1lZZE54Z0pKREEwV3BjblNkNTFpSWY3SlA0bFNOeU1PVEx6dlYwZWtyek5XdE1WbWVJS3JTZlBSMVUwVnBzSVdMV3RPK0NhM2hmaXBmUGxJcTRka0tTcll2clFmV3VJTzFUdVdCNWRRRDRTeFhHam91SDFNRVA2dGwxNEpMWDloUFpYOTROWXp3OEE1TzZrTkpiUEZCOGVQbkpSbW1tSXYyeUhkc2x1MFdTOFh4emVqZlVQbEVjVkFTNFRSSys5QWlRTUkrVHFSYmhsNno5MHZtK2FmVzNPbWhjdFlVQldCQW95SzB3eVF4THVNdjZZRnJIRW5ZeWZLZk9UVVowZnFEOTQxcHphMGxoc1kvVE11RndoRWtzU095SitYK0J6VWpLZDFNRWExSVA5RnRYaGtEckJmRHlGMDhvaFR3VjBUQmYzR2RrUWQ0Um10OWwxY3NMU2hpOWdwQ29BRTZDcGVPbUtIV0loNlllNm5qYlBUaC9STGFEYituL2RmQllkUDJsRzlaVVhQeUpQK1dUMCthVzFQYVJ6MXpZQWNWUExtaitnU0VZaFNvQldhNy9heE41RDg5bldRWXN6d1VXenljSzdld1FEK0FoSEJQZEtOeVExRFFZdlVNaWVwRDcwcFBMY1R5NlYrSnBLai9xcWxSenVlRS84b09EMjhQNmRZR3pkTkthYXBweWRNTzBSNURyY1RFVFBHQ0M2aERCTk1kZ3FzeDd0Y0hzRUhlc0QwblA0WDFIajJhaWkzb0l1R01oemxNVWNQQ1Z3RVB2ZDNWL3hjalYxRnM0aW13Z3l5RVUwcE94SWthSDd0UmFnQWJNSjZyNkxRWUYxcS9tQnZyWFhoVEczUytYdk1PVnl2elhXWittRXdNZ1RZRDJRbWhpYjF3MktmNnpuVEV5UFg5dTF6dHFsMDBWNGp3ZjhNaEIwdHc3b3BoQldWWTJBcTlnNGFyYXlFNXJLQWY3cE1QMFdkYkZSWDA1UXorNjN6SUIzMldQRDVXRVBCR2k1TVNjbWZIUjZlTFd1RTFMQ2ZnR1I0Zi9YZGFBcmZ0cXcxSWFGWkFEdy9tWkwxU29zbWFZNFYxZDdtdmhCdE1RZCtuMVducnJRQzZxdW81SXhuY3pGRVZlbTJCckdTemlGV3ZhNmhtOEg1QjUwaWpraEdBUVNBTmN3cms4VHZWWWhJZmhueExyenIzNGlMVmxodFFnVENyekZzeFhUUzBrY2JseWNqM1Znd0djVHpwYUZUOTNGY3ljelI4MmZiZi9pRERSQzZxL3JqZDNDbmkxemRmbE8ya29OelNlQXA3aHlZczR3R1pkc0d4cUhmdEtPSkQ5SHRJQlphS2ZnMkp2TmxOcjNZTE5Kalh2WHMwMG12ejVzRkF2OUZjT2xlcGdEa0xSdlZCKy96cnp0WGJybFJuV1oxcUF2YUY1QmVPUUJBeEk5Z3RzWmVhUDFSc0doQVJXMkNGWnpzeG4yLy9rTGdvVG91cEFRRUFWZFpBUjdRTVpKUGVEcGVLazNFOW5TOFVORHZlc3N6S3BoNVhlUHFHK3UxQUZwS2FVMEo3RWZPR1I4TWNGYmQ3aHdZaVlJZnViS0JDaGx4QmhiUUlHenhvdDNWUDV4a3ZHMm9nVDB3amlRWUpmNVYxZDJWa2JGQzJhVlZQUmM0WGt0bG9xVG8yeG5leGlwQmZCK2FhZkFaZjZxNUErZ3U1MGZ6Ti8wdmZrckpGZUp0T1NEeG9wUDRpK29XUGY4ODI0TEo4ZHZNZitBTytxMmVxMjhGS3V5YWFobjBoRHRXUTJ2eXdyUWh6SStiSnZHR1RyRFZWbXMvTmw5akc5ci9KL2tBS3BYbnBkSTBxMEUwVk02RDYreHB3VFUyakVQaUx6OTNUNW1RQ1AyWnhtc0FnY0pFb1Jzd01YVkV5SGJxaFlPUTErRUc2OW5KRzJZOVhQVFJQL1YzYjZTV0o0dTg4cTJIUm5PZUw3QnE1Z0hwQ1NZOXZleHhXckl3YkNEWXpMT3J2Y3M5b1pMQnZZamtYMCtTY3kyT043aGVXUFR4dVVYS0lZdVhkRDE4MlFXSEM1Y1g5SjRsL1h0RTZ2YUNmU0ZEWW5hTUlrZGhoUGpic3E5dVFYWjZQYm5RYzJkdWlwbWlBQytzcWJnU3JNdEhUd05JVmx4T2FvYXdaenk5aURCVHNFTy9PWjcraWEvSkFtSGpXL1hjREJGTUhmZFJvakxXTi9CTU1yc3ljRXZOdWNCRGo4QWlVbWIxZjhobHJSVjczeEt0OW5ESkNwbXNGalpibDk5ZTZYd2RNejhPMEFiU2xseTNKL2h2alk2Sk1ORGk3SC9YaTZjUTg1TzlnTWNCTDlsRkNmcStNZUZUeEl5a3plTnhGcktjeUQ2MUs4V0Z5M0tONDB1K3VsTnNzTTZEWmRRWW1Ba09LeVh3Ym1sYzBHbXpCSVFqNnhtRVcxOXhuTnJXN2dGU05LZWowSmtxZWFXcW5hZ0E5T2s4QUd3SGR6emNZanBFQ1M3aWtwVnRteXN4VzNpVURVNXFzUEFsMWxaVld6U2ZaWVpMUEcwSFJKemoyYkRrQjh1YVIycFF4VXIrUFpRcHZYaHBzREFQT0xWT0dKYk9HbTlHWU9VYjJKNkNOSi8vTnlKM0ZQZ0xGa0ZWeEVWZGFqWE42eTNpc3JkbXhKWjRxNlNNY1BFdW5HNUkwM3RMRktpZFF2Ymt4NVBEYmNMeERBQTZ5M0JUMFpWL0lVdkorUy9sUXc5bDQ3djhzeFNSSG0yQnJxNURQa1B5L1hmYWRheis1V0pwalFVbXhIeXljUEpjUHBUdkVFY3ZrNXFIMjJSdHQ2aEdVSE9XcVlLY3B3OTFINDZsWFJIUkI2WUlxQjhhM3R2ZzhsUHdzaHY1S1hYZ1kzQ2poVjNvNjduL0dOSVAvMFZScHVYMytGTzBVNU9ZcjRXd1BQYStTZHhjdFlIN05RQjR0SjJDU2Zuck9ZM2piSHU1NlYwZDBKcVcvc0YwMlh3S3dXRlZudmxmbmNKVnJxSThzVUVyenhWcC9pMjVGRE5GSlYyOWtHMCtkcEFEQnpCdENKcGtsVDFLaExIZ0F3dXdMRXowRlRTaXc0M0RZSGpWMllQN3hzOWQxR0RTU0JLK0VDaTZtU2FPWnZiUDlVenhQN1hKY1F6WXFzei9nNm9nK0RDVDlybUJmbW5MUmJNUWFxdTRsY0lQZ0hPZTNUMVYwcmJZUG5zd2xvOTNsa2tlZSsybkswdEJ4c3NYTk1sbzRQVE0wbnJVRlo4eXowZ3hyT2hqVWgrc0hMVFdXT1pvRlVTVWdCYVJqMWJFRnJEbDVROEYwRGQyWDlDZnpVVFl3YUc4WWFPVU1OSWlBVXVyeFFKMGRGbit2ejhPTzdEYzRHT0VtcVo4cHFiT0dLT0RiSURJR2Z6MEIxdExKemFLNEY4eVEyRmFnUmF6a2ZrVmtkZXI2N2QycHladnhJekE0TjdFMVRyQUh6RmdUQndqdUY1SGVCbnBrTEhtbkczVEhsS1B5K1V2eVpZRVA4U3NLZy9pTS96cjB6UnFaT29WWWFIb2lZalAxbEZ5VTB3K3dpRk1UeXFKNmtvQWMwY0lVbnhpL1lkRW5icGwvNE1qQ3BGTENXRXJRdTlCODhlZktQSkhhZHo2OWlrODZQbDFzL0NqTDQ2TVYyL3orb1psMGlIZC9OVXpLRW85MklKbUZvQkpxWnA4aTJoanVVYmZIM204Qi9TWnRvOUY4QkNwb1Z5WDNtZ0MrdGlDRGRUTFN6TEJXUE5BUEU1TjRkYlBlKy95LzBOaDN2ZGRXVjd6U2lzTlBiSHE4dVoxR3hicXAveldMNGsxTDdsTU5pUFJuODdrbUJhOHV3cU90bFp5dVYxTldSdTVIa2RpWHRIanUyajR5SzJ1MkZINnJRT3EzaG5tZ0dFNkQzTzluK0xhNVVTNTRDZklUZDdnSDFVZlBtU3c3T3l6V0NzTlpqYlo1Z05yTVludE5BYVpHZWdBNVFxY3A4M1F1ZE9oT1hqdHFiUUFKclRUMFUrN2FRNk1WY08vZE03T3pUSTJzN1ErWHpnZnVHdUhwd3ZVWEhXT1kwYVNSclB4NVdMaHVSV05tenVmUHJuekU5SlIxMXFtOGMwWUhuRkRReThJZ3Y5MHN4U2czOHFJWnB6aE41VHhuQ0c4S2JZRUxENEMvTU1Va292TGc4b1ZqZnhZUURFVm9YcER6clhUNkdNczJrUnBnWVh1a1pBeStzNlN5TmZwQm5jQ3JCVW5BU2lRR2t4NmlVcWQzd2FPNmNXNGFNUjc0L3grSnROcjNaQmJXL3k3cUQxME01dXQ3YmYrcThyZW95blZ0UDhFdDN6Smp1em5hMW9lZWMzTnRsWWk4MlN6TnppdmxQWGR2YnlrcFZDMFJDS2VmSkVzTHlKTDZmOG5Ja1pqb3ErSUJFTHlQazdEK2NmZnFmbG1STS9aRDhEdmsraXpMWkFkVFZGbDljSzJQNE1PVXhKNkF2VHRkZHhHNmNhVlpSWE5SWkRiNUZPOWlNZXhTTmRKeiswMVN4eXF4WUh4bzNLc0Z4WHVwYUdLaWdZQ0M0MHowam50WGUrVVhRNUZtSlluZHE1ZHhTUTZueXRYQjhPU2Q4VjVCOGNPSFh6bFZDanozQ2ZnSEpJdUJ6cmlPRFhqMURhRnM1TGNSSkhFenBVRmpKR1BwOUFLVkhVcGJPRDV3dkFRbmNUdE1mdzlXTDk0azh6T0RTNDFqK3lSRlhpZlVWY0hzY1NwdmhJNzVKSGE3bUg2Y2tRZTJ6bEN3UUJtZDBjMnJLQkN2ZUcrWDJqUXN3WWtSUmFVREZjL25KYU8zZlYrWlYrRFBxYnh1bDA3OE1JRFdvVk5HUXh1R1I1VnhVOERwd1pnUTVaV1lHSUd5ZEpZOHJKTHRZdlBmTDJSQXB3cGUzNC9KbUJKZlN2RlBjUUYwaXVrYnl6eklud2Jwb3FSUDN6RDlvU2lvWWRPVGdsVmppczJtQmt6YUxmWDFtSmRlbzVFd0hYMmR6dEtoRzZTOC9vYkdUVzhlN2tETm9Hd0Z5UWVKNnpaNzQrcHNadG5nZHhxRE9ITm5acDd1UDVvZ05BajBheGc5NkN1MEhYallCNHBRTzB4MHNqaE50c0NLMUdOUU41ZTJCN2F2dlhqOUNBZ3NaOG9HZ0UrWFFwa0RZK2J0QzhzR08xeUFuazRNWmVSTHNOblV2NmlrMEszTnR4TVJ1UlpnYSs2YTdINExoaStwdUh4bUYxd0w0UVJ4UE12UnZCbEwxNlFEU3BHVzRuSWJyeW5acmkyZjAxTDRwV0NlNkpHRjc2SnQ1aFBBcnlvSVNzQjczTkkxT1huSXdaL1Q1VG16MEF6T1d2ZHNzZzlVUFNQUWR2aGUvOHBGYmVyb3RURnV2enRuM2ZYaVM5ZWpKNVRqWmFiVHdQRUVBeWNiU0xYdWRNUXRtcTYwV0Y1blI1YjR5bVRSRjQ1NlplM0RVRlBoRzRuN1NqbWFrVk9VczRLSjg0YzkxSTd2Y0NYT3ZVZ2NVMDJIaG9NOFpRd2ROQzIrYThnUEV3dm5XZ1ptcWsyMXhzalRoMDdlNmhPZloyck5iZHM1VHIxdWZmN0cwTVdaRlFic2M3VktKUmk1NTlzZFI3R2ZTVDRuWWZaWExmaDE1UnVyRGRlZUVNWURmUVg5OS9oUWh5Z2JrU0lFampoNW1jc2dzbW41eTJnNXkwU25md0ZrM0Y1eE5PQ1BzWk9sM0NVbTcwRGROKzdER1VGbFpVMEgyYTJWMm0rbG16YysyOEJkcFNZcGxGeDdzR3BXNllOYkFZMFBvVTlFMnFhS0hrdVZjM0NUTndxSUlRNnJWengxdFU5UFdUVnRMVGZWZG5kN0pwa0xONkppMHhIU1FkM1NrbjZFYlh0T3JQT3pjWHdoSnNnOE5qQkl4MTVqVjVZMCs1MEdDU1JoZUpZbnpWdXhReUJQcVJtb1RSekN2S0V4aW5ybDVaeWF0VjlpTHpySXE1NXplN1FJOUdTVktmZVJoV1RiRk03dk5MOGJYRGdSQWVSNm5sRW9KUkd0Z1NzK0Z0Z3VHRUpIS0lzdGIySllHN0RQei8renFCT0hJZ05Ubm12MkZra1o5b3VxSlNhUG5ZSnNWVkZVdjJmS2pJcmRITS9oQ0dsQ1R2U3BoSkI4d0RncjdzRVJ2VkFTZFM4SVoxZzhDYm45V00xdHdnOE9DR0ZUUHkyaS9kNWVYYzhIOFVOQndheHg0MmlUdzhORGg2Q2VpNkZSNCtjSHRXVS9zS2d0TzJJTmdWU1RrQjJscHFsak12OFBXUzEyTE9ZcE85QnRiaVRwRFBLckhmRFFtYWkrREZLREgvSlJNU2xJdktuSmJXOGU0TCtlQTB4SVFmVDREMzJERER6aUZ5M0FDT0ptTGtEbGF3dUxZanQrdmJPaDl4UXhxMWJ2TXdmQ0xHREhwaVVJT1Z3VHJIUk5nZE1nazZKN2JHM3FlamlSVGlEa3dTeEx3Tnp6ZTNJZFlhQXlSWE1OL3hZeHc5YlNDSTRpOVc3b1oxcHJGOHQwN3FtSDhTZGpMVm84OXBlTWFIZnZlTEUzcitLdDVTeDlYTnBXeFhPeHJleTI2eDRWZmhMcys4WnJvQ2VTMHZwR24vaXM0ZEZsbVhzS3VJWm9qcmI3enJpQVZDMnd2QUJYbDJmK050NHl5RkVzSnNCNjQ5MU11NERyakJtWTRUSlYyN0VVMWFMYUF5Y3VYZCt6dmZDQnEvNGs1bnNLZXlRNCtFLzh4bmJ0MlZFcDJScmNHVi8rMmU4QTVjOUlGblY3bHltelYrejU2TThnNE1NOFpCVVoxY2EvRkM1S2d5djVic3hwWk1XRlNLTDNhYnNxaUZ0YVVCckVLRCtNcGUwWnc0LytscDNnYjN4MVlYaGt5bHhYTTl0b2dtdGFQUUlQeEt5RDFGTHBiL3FzSVFHclRpTDdyNkZsWk9xdGRES1NKM1V6TVRZK2Y4cmJEMDV4VHkvaURyeW1aV1NlWnpFVmMzOGJ0cHQ5K3Q1NVVOWFZuOHNpSEVxV0dndS9nL21QcHJJcWc3NGtlZ2JwVklGTDdDdnBvMitVRExqTlFMVlJQT3dvNDRvNjRWeU8zaGRqOGFBNEQvMnRiSWswMHJBOGpsQW5BdzRoYnlwWWdveElhVUQ0RU1GNnJTZit5dVBpRExJVEtyS281VVg4OWpJUys0bFBTVUJJK0lxdEk4MWlxL1RSc0FpMWNXWndqQlBIWFRqZG1YUFVESDZ5djlyY0RaM0pBR202aGlYUmZQMXBRMDg5R01qVzQ1ZTFaL2VmeW1WbGhIVm9ZY0hRamxLUWtwM1kyNU92d1pVMGVKM2VybFdMQXQ1WmFlcEZCMmZKOFlaMzZFL2NDaFh5N0IrTTBzYzV1V2R3U1kzZHdad01qWmgvMS9iaDdydGNvbFIvRmNpTCtXOEtiLzhFRTVHR3grOTJvdVkxeU03eHo0bzhrOHNlTzhUNGVGQk5KNDh6SVRHb3M4OFVpalFYL0NyQnk4T3JKbVR6Ykx0QmNBUDZqY1R0UVBkcURLYWcvaHppbFY2Ykl6cThvOGErN3dLMjFlMU16ckhsVk5RNlYxVVJkZGZDUWx1clV5MVlkeVlRUmcwVTZ4b2k1TU10SVc1cHQ2bnpjMTdKdTBrNEJkblNVNVdwc0MrK2oyQjBIUUFFZ1F0OGRtaTdpaW82TzY3NGtza29wdTVCSGNqU3dOcUY5NTU0aTBhVGZ5MnVkOHozZU9TaGlZdmdGNTN2ZGwweHB5cUNBcU9tN3FZN1JHZVF4YUdSaW4vVjVtUnJJNXZmbC9ZWHN0T2lmWi9PZWQ5anY4bnhuRXhOWnNxTUVzUStnamdxdWhhZGR5ZUdlNGhzcTJGSmtUdy9pT2w1elU1NnRMWDlZMmRkQWJwd1FBL0xESzNaTVJrZC83WUQvOVd3ajJqTUMxWEhNczV6RTN0a3l5OFdqK0hHQ1JXTURXdjdvaXpad1BHSDRSSDFBNFdqVXQ4ZCtMK2hWT1p4NFN0NENMeEZ1ajZmWVBpeUxLVGMyelljSW1GeDdwWExBekxCSndiOGoxUVp4NkZZSGpJUWFtVDFEVlN0OWNyUlU2T2wybm8reExUNndwdGhxQ3o5cVNUWTlBNWRocFRqL3c3aW1BNDEyWmRzbStLcXlNTXNmZ0w4eFFJcDZ5SVdNQkNTMFN2T2l4RTIrZUpwalBnNm9wNTV2UzZKeGd0SmpPKzhJb1EzaE9pVmtlV2h2SUI4c1djTU5zNmpjSmJuQ2tOVE85V3BIdzZpWEhDdTBwTGhRQ0NQY1JwZTZzM1gzd3FTL3I3cUhLWW12OGFwQ1VRTDI3Skd6VEhoYXJnallBSDRDM1luZnlLTkZzc3dtVmxxZzE3VUR6TGJrRlFsRGJVNmdaRFcxTXdNeDRwQ29wcGswbUIyMTgveW44RkN6TTJ5VjlXenByTS9DdmpCRXBUdTBwd25VaDJ4b1kzZnJjcGtyUDl0VFVUdjdzM1JSU01Jdk0zaGI2c05EUzZHcjVFSDhmK3VmUjB5dkFUMVA4blczVER5Y2xlby9OSXFuU280TkN3Nnh3ZFFXK0NHemRuYzZSeENpcVJrTjEvUXl2aER4d1NhV1gwQm54M1pmZlNBdGNpaThhRlNoSThsU3ZuU0tOcHlHK0EySTJXbzNJVVJwdFlKUnQ3ZmhFdmI5cGdCQ21ob3JsWUlWcmNOVVJZTHg3RFAxRVM0cTdKRE1JQmQ1cjNGWEJ2cXNIWXJJWHhaa0JsWkxEV0xKRUlITWFuaFF3N0ZEUThIZHNrdkFOQXNwM29OamFYdVB3NWcyY1djNFF1M3c2WWhuTEhyeUJ1SmRvc29XVjMzNGVqckRMV3NSLzFrMmRqMnJ3aDIwYWc2N0xvNkcxSkRsYythS25FUmlVaHRLWG93TVFNWkJZOTF2ckZ4c2xGWjVOaWhrV0dnKzN0dzYyd1pYUE9FaFlxNVpEdmZZRHhOeFBIb0ZOc2E1U2UvME42SUFJR0gyN0IzTktGWFV4d2xsdEtwK1FUMUlUSEFYdnpQbVFnY0FNWWw4bkpENlh4SWlFbVpNejhEYVlISG5ZVXNJTzZ0eHcyWUxzWGVJM3NqWUgyR0FxSGVRUHNzNG1OUlZlckxEQTdZRytDYzU3MmtHdEJCdWtxek5EMVRxa29IcHRsVGozdjZ6Q2dQZ0V2MjNWQVZmSVVVOWViTGpIMVlsSkFkVnRGellEVkpETTdPT2NiOEdNU2pycDNTSkVsaDFHeHY2bU1iM0VKT0VYUlZmckphaE1CS1QyMkhWdTV0NFZsL2JEN1N0NDNkK3NnNXo2dUNyb2RxVTVnV2txWmxVQXRTdXptbzN5MFp1QXVlQjdubXVZb3Z5bllpQ2xiWmQ3L1NUVE5neks2U1BXZ1pRWGdYK21jMktiY3Q2QUZZdTE5bWxUdGUza0Q2T1JUZ1JtYUVVZUxPanFlWHdRa0U3aFNneFRIdFgrejUrODJRQWZKSEVwOFY3bFkzbnUwMjFURHlBMllmc21NaFM3ckdHRTl2b05ERi9GbldTSWZFQXloVVF5RUlORDR4K3AzWTFhMCsyN29sZHgvUXZBUmZhSUh6UHQyRXRvdGZITWJ2b29jWE83SDRRMHhPZ3VJTVJJbGVFRU93MFVJQ0pSVUllakJmR2tYaE80MllscVNKRUxVOVEvUDFBblY2YS9nUnRLRUxmN2g3VVNqK3VvNENIVGtOSHZWR1U3dUtYT2FEQXZ1TjQ3OFFDaVFnaVQrU2NlVzFEZ2w4d0w5cTNOUFg2TjgxdDNHaGVTSWh0QjlVSjIwclNtTWtqUFlNTG4xem5PcTRkbFd3bUFFNG13NGs4QlZzVmxJNXNrbTczNlhKZlhyUE9aS3lRcjFGMjRhV1ZXOGhuclpveHlpd1JYNmZGU1RDalhuYmU4MkY3cEZzaW9HNXE5Z1pSNmt6ZzROSDNsMlFlZXBXS1dsb1ZPM3BpdUdVa1dqaUZsVzRUcUVDMytseTV5NEtTcitQcStrUmQrd0VncHkwMkdLL001ZlJ3eHU2TjdPbmV0NUQ4UzNMbTlrc1VUNm5TZ1duWTBEcFZpRjF3Q3lpTC93cDExOEJTcHArdHNpRFoyWDVwbU93aTBJckMrZzYvSHdrTCs1OXdJZjJLTmlsTk5rSHRpd1hCcm51cXhVZmlHdGVFZWVkZExBbTJvdkxaVDZTZEY0SFVKYTZId2s3M1hJcFBVR3I0alliaWwwNmZhTFRHK3dERXQrUGdzTnhrZGU5WWFSRWZRT2ErdjluWUNaQTh0NFF0WU4xaDNWMXEwbENZSFBraHY1Q2hUUG43d0EvQ0lNc3dlQ3VXYmZjejNpK3JFSzVOZlJrTWs0aEVCbE9LcEZkZys2VTRadkFzMGIySTNGakIwSittZFNWOWxIVzZ6dEgwZ1I2eGZoMEFkSDBnZi9WOVlXRTNkSGlaaGk0SzNaMkdoTU5WVFQvVGFmQTl4cEhHSEN3M2laUG9XNzhqT3F1WWVjU0R6Z0NXeXppdjVNNThEdEQ1eXVCYWIzWkdIcWU1MkpIYUlDS2pIejg5TmxCcDBjVUVMN3YwMUNIMENsYUkra1R5dWZmcWtQWmNTYjJRTlRTamVqWUYvOUJFZi9jUkY4ajNlTHBTV2RVRW1hZTZ1d3hWVGU1clExbDBCRDZlWjgrOERqdGVYVVRDSW9BdjBUdVYvUEs2NTJoUG9SL2pjOHV2dFdVUnVFK2FsaGdMbnR4T3V3V3pPSVhWV2Z4N2hDQ3BZUHR3TVpMZjBaQmRQVE9FZjd4QzFBbnVxejJtWUkxTEt2b2V4dG9kWHhkaThWM3BCVjJoN2JnTEFhYlRiY3hpZ3ltVVk0Y3M4NmJYTXE0ZW9RWG1rMTlOVllOUFpBTjBXbG02bXp4SGQ2UHhPNS9GcEl6NFpjL0s5eWFreTcrQkh6T0FVeHlJL2ptYjJGUXRGN3VqK2F3d3A2ME9MaUJ2ZTBhaFlvRGJzdWVsNDN3SmZhWHN6cC9ubDJKQlNQbDlkSmFWckpTOEw2L1A4MWxlSGVqbjZpTU5vWDlhK2c5K0pSWGRpeTVNeCtZTzR6NkVzdy9lRkdkRzNLQTZUazBBdmRHSFNpdG9oSVZZSnRxNTZ3R014bnduNWRBWVBoT2xqL0xheFVwMGpqRkx2NERkVkhzSEZqc0VWcDNpVFY4RTdqUHAvQ3FlZFFuMENwOVQrUjhOdG83OEg2cmw2bDFJV0R0bktSUlpBeGdvQXYrZjRjQ0RneDdLNlE0ZkR4MHRyTEN1ZFVSaGVWZW5UT0pKbTJvcWRSK0RmSGhpeWphUm1udmZma1NXWncxQnhaUlhFaFI0NUF5QkpJSDhkaXpBUHpkRS9kdkUxSWc0SDN3NmFHdm03K1VOOFZ1dStUNDdwU0ZJUm51dFRHRnp1MllMd3h4VkhjQUV6b2d1OGxzVmpWcnU3VGE5OHdUdFpTWHR6RGVIZUNMMlp4WlgyM0Y2NW5CZzg3d0NSejNxdnYzMk1WajF3Zk80VytYRVlmZ1VKTGZvbGpuNzBZMWZINHpZTnBCLzBldHgwdXdVaEJBb3FJUm1DSDlCb015RDdDZVFBOEx5TzVpQlNmNW5hMkxBaTR6dlVwVzBxVUgxUWM5SE5XU1BVS1cwdGVLVXBINWV1Mk0xMlJSM0hhYlBKZnBUV1l6WnJHNEFneVQ4OC9mNVE2R1NSSFQ2U3lSUUg4OStxaGl1OGhYNGh2bXhacTNaRWIwRVY4NkwwRUxYV1Y1VUU1NE1wdXJhY3R4TStEbEVmV3NjTUZoaHN4ZnMwZzdmcWtDbko2UVdrRHhqa3hBa3h5RERhL0xUVUQwcDB1eFFWSXkwRzBRdG1VbUpIbklXRVFjSkZoM1hXcmMxaXgyclphY2lxbXhXOHRLTEUvRXBmY29wdzViTE52am5rd1lETVJ4Nk8xcnVIZFdSd0l3TVE4Vmk2SGkrajJaa3lCUjBIWWpTR0pRdktKb2JNTU90c2hRSElvc1pQcWgyV01oaGpUVUZjYitzejVwK09FWGhFZGVHdXB1eVRmRGdieE9JZWVNUWZKRVE1S2dLdzdHZUU5SmMzdVJ1a0d3MEZwRk1qNmFnaExBKy9hMStFU1pEZWlYdGQxVGlVaGNvU2dTR0I2SlZPUjd6QUpMczUrT0JWdVZvcWVQSEoyQ1lKUmpKeGN4V0EvYUdJak8zMGNEekQ5WHJubmlqQjF0TjN5UEgwWGtjNCtSS1ptQlBTWTE1dVMvVjdVVVd1N2dsSjI4NEFIbVJxTTVTSFJ3VkdCaHJUTjIvVGlnM0tVTVNqRE5JVkY1SXVhUHFaRVFpNTlEY0dlenlEd3pBenM5QjFFQi9pRG43R2d0cVZscmxZbU90Q2xheG1DSStwazJQaXh6WU1yWkhleEVxUndZMVNYb3FBTFhOemthVFRac2JXb1gxV1JjVHN1bFhpaC9JWEZwUFl2eEVhNkFGWmZ4NHhsTk16Zk9JdVVSY2J1KzZxdmhhU2hmaCtYdTZTa3ErVmFER05hb3VLcHhZT2I2QitBKzFUZUlJRzdMM01SKzVIdFVURFIwZ2JjTTB1S1o1NFBia3hBRzViaHNINm5IbVErMUc3RWZwZG8xbDVjSjdJSWNIaDNuR0pXc1lsM1F2dlhaYWhKdlB4NVU2Sm1MUXZvUURKY0ViclFaNTIrQzNSRnIxMXBaZC9NVVVSdjN0UWgxMi90UEIraHdyMXNtTm9CVWY5bE1TYjhBQmh1MDZ5dU5mdWIrUzdNN0RiSUhyQlJtL2ZFQmZNZWZtVllVbmdnSnAzeXVZYnFIZ2xRYjZDUVZtSHNlanFhWjlNVHowYXJDRXJBdXF5R2srVWYycmo4UUFSWmk1cUN3bnRDUDBmajBLM1FveEpsZ2ZwYnRrWkdIRlRTdENBR0JLS1kzOG5sK0pLOU9RRkZ6UUxnU0toUExORG1ySGkvWnNIR2JJZ2RTendDL1pXOXU2aW5vN3NuNElVUnUyQUNUOGlGVjhDanBHNnQ5dHlDdk5TNTFjdTlTY1FzaW45K1ZSa2pLZlcwQ09pblhOVWpuNXQ5eG8zOFhRZURjcnZqampMUEFrRUlhU1RRazkrSUVIN2NSRXdFNkhsYi9qdjlTT2ZkaWtmclFsSlpxQTkxeDJEWDNjWjU5cnhZbUJiUGVHS3NaTkZJT3ExU3psSnJCU1Jid3BHYm5UT0lxM2pZemhwNERjSklibDVremRqcFprQ0lIVDh2VnhYZ1lFYnBwYUVjSmJzY1BucVZGWUNNd20xUDRzbGI1MkxTN2JUN1I4REFDVUptYi81bG9xUVBUVVZwWkNrQ2lOalVCcEpNeE50NFpxZDQ0eWwvMWxibllDcnpZR1JPc0RmZS9OcnU5QTJ6TjN0eXhCZmhvZDNRNzlTcytMOG5MWnFaZ3MwSzBxNUh0dUZqQVUyWVArdkFMRmt3RytpYXV1bndBTjR6cjI3U1owakE3dm4xclIwM28vVHU2Y1FvTDFPWHFwVld5dHFtN08wMEZrNFhvYi9zdzZtQ0lYUzRNMHBTc2NaWWw1MDFOR0ZibDJtM1VGZlhzUHdncVRiWkhGNlhCMEdqdVJUMElmTDFWZ2I0ZWVLOENnM3JPVnNtd3JoUnYzVlp4c3lHaVp0eFlYRFZxYWY0VGZEb1JSR1RnZkk3eFIxUGQ3aG0wYmRUdXlVUWZ1Y2hlbHlLdlpIY1ZHS2NMVDUvNW56NVVIMlh4L0ppdU5KOE5SMUxUZ1FxWXlnaDFsMTVEUVE3eStDcG1BZ0EzWGVIS29Tc1Z0R1J3YWh4SEJ1VVAvd0FrNHVHYVhYRGI2SzMyUk50K3BJbVV1S0ZVWVlyQkMySXc0eXFHTm9JZDJxQmdTWGpXWko0TVhOVFI0dk85NUlWbkMvYWdLRkNVdjlvMGFmbno4WlFuQ2ZscUlRa1VBcFRNb0VBOElwVnBUNHlhbS9aRy9rWHJ2VGNxMWt4TTFGUHZ2VVEzaFdLYzQ1TzQwUVozRlpXZ2NzVzFUdi9BK0cvTDZqZ2FmWGVCcVIyaEFoZ1RpbE9kWUx0VFB3ZWtvaWNwTFo3aWZjZ1FpL2ZjZEFmN1kxQjEvaE1lSXM4UG9YTi9zNS9zVkJUc1U4QmNiVzgwemg1MkpTOVA5LzVCNnAyaCsybm5qWU9zNlZVeUpPSlFwRmN3Q2wwVFVsUEo1bzJmNEZjRHpQQXFqYkF3Y3AxakUxR21uZVkxSW5VbnFBWEJjOTZsQUZqSFB0a0hSeW1HeWdsakZoMjFZblMzY0V0MFlEOUtzdFhVYm1kTGZGSk5ZUHM0VS80cVlueHRIUzR3ajJRWSsvSzVXbzN6Uzh3bEU4Ky93bXduT3lMdk5ISS96aXJxK0l6RitSK1A5RmtPSmFEZk9qVDhzTlFBeGhVbVZsS0R2SU5KMTMvRk13OERzci9NOFB2cFFQemRRNldvWkxyVDJyRE9UcFY3b3dtYUladEg2UGtJTXZZa3lXV1hObzFMc0hCaEh0dzVjaUthSXFZYXlKcUY3ZTdPRDB2N2pvaW52bTYvcHoxdVI0ZFNKcCtXeDZzZk5sNk1TcTk4VmlBek9oTFpNY2RBOWNldmlRTWNkMDdnT1IrSDVYVmZaZjZyYWU1dGRBaVUvVkN3MXYvWUs1amF4VHdpa2o2OTlZa1BzZXpSMVdtNUM1c3NmNmhXSktUTDBiWW1yM3BHZ1Z4SnBLd0IycUIrcTVxd2VaRVB5K2J5YW9JWkVKNDBocXdlYkZObkRMS3M5bzk1dkpwL3F0TU5aSFdiaHVhWTVjdEREd3ZZZjVVNVptY3UvaFdmS1AvQ3UxbkIrelRLRHhWVUNRWGZ5b3g0R0YvQmVvVDlaWXNncU5tVzBkQmtyUTUrVXYyTEozc09Pd1pmV0xuclB5Q0l0OUszOGE3V05QclRpcnFwbkRIeUYxWmE4RmRUN1lJc0FQU3U4YVl1VU1vOWszY05xWWRPRVh0djlHc1pacVhKZTBJK2Z3UmpjL1FVTVp0N3lhOW9DTzdFcmVMUjdDWEhRemdqOUlGWEFJZDNNeTJjL3pLUWdDUDhkSTZubnNGN3NNYkI3Z09BT295bDFVSUR6VGFXZHp2aHIxU2Nma09JZEpSQTRzdU9Vc1k5N1B4NW1sdEdxcEsrSEN2UDQwVjJPRGxMUWFrU240MFByZVVmaUFDa1loQUlXaXBqZGZxUGJpOFRUL0VxNEtkRUo5RkNKMnRxRTR5dENWMXFmZVdUVzZEbERFbUNaY1FtUVJiclBGUlVaYzRTakhKYmw5N3hKait0dUI1Y1FhbEdNTWpBT3BQeFozdjMyK1pCZEN5UVQxMXpYWDg1aTZYQk9kY1d6UDZoWWVRazhTQWI3U1dqUVFMbVVXeG9nQytHOFNNTHZKTjNJUWdlUFkxY2R5dG03Q1Rib05hWGxZL1N3NTRKeE1rTDZhVzZIQkduYTd3UGJyN2xRVEl3cmNURDg0NzdsR0Uya2l6Z2hEOVo3bVlySk1DdDFWckRXK3JKdDlvMEJkd3EwNTJ2L3BqT3J0b3NwR3poVGl4aTY0RFRqd0FRdjZjYnROKzF6NENDekVBSjdJdHlMVWRtL2pPbi9BaWVtTTVqRWdHRCtzbjF6M0JEUTZnbmxsSldNYVhnT3oxSmFNTHIwUHk4a0E3T0FNK3k4L3ZOdWRFcm1xcStCenNqalRRNzlud0VXSGVtQVZsSmx2c1p3a09IZnlWZExDbU1MUFN4elBXZWs3amNvWWVINnhvY2N5Wm9yNThTUjRZVlo0ZG45ZEdqeWw0VkhPT0xHcFhjRFRxbGlWcnptQWY4RWJnUThNL0tZem16MFFhOU1uWjJ1TWtoNU1JQksrNWFqMmlPd090TjZvc3FiUGlTVkxudkNONG9wUjRWR3VTTjRPMEFxY1J6RCtqaWVveGlyOHE4YXhTbUhOU1JDVjJnZEoxRzJRU2ZkWDJ6dE9uQ0p3L3BXZkFLWGVzN2JSVk5ZNmt0MnpmUzA0cjFXU2FDSkhvRjd3YThwODd0YnJySjdGdGx6dFVodGlWYUNCTlc2SDl3Y2hCNnE5M1dHZlpqdU1zRWhlV09MMHdUM1pEOXpmM1YrWGVyYmJOdCtLVHdqRU5MUW1sUVlWNnpiK2dBM3NtczdxWEtidS9IWjZwVW5ManNHNmkyQy9LQklQNWsxblpoWCs3cXlra2tPTkRSKzFXRFZmcW52OWZLNjFaaGYxRElnQ2ZON0o1S2JLUGJkLytVK3kyQkpHQWZIZEZ3NEg3aXA1eUJncDVsU0xTMWlQU1RFamdMMURTNEE2eHliMU9jYXhCRWxJOHJBb1NvVlNEWW04QTUzQWE0K1JZK1lIU1NaaEtLdFJNOCtXTVNYa2RyZHVFbjhGT0pZVFQ0bXFpYlJWdjZnVVhXV3VleXdQWXdzbnEweWJUY1lwbmdxaGJ1RDFuVWNzSEUxT2s2alEzeWswSHdjbmJNMVFwT0lIbkkxQkxKc2ZpdERkNEdIcDZJdTMwZW8rbVM0MGZQc0wvZHo1SnliZ1dRaFoyT2pzUUdJRklFSVNXcCtXZXBuVEl2clBqdzYxeDdHcVp0V3hvYWI2MUw5OHVxUGFUalBzTGxmSFNXaFBUQ2dkUnFWVE1va2MxYVJCdXkvYml6L3kyVFRXUWlwOUZMd1NxOVRYcXBseDhPbFBPRkU0aDJSbDNYSjdRRVY5Q2dSWDAwSjlzcXVVNUJqckRSckQvVzV1eFNpanFTQ0tlVzlzdmxjbnM1VEdJLzJJVWhXU21oWkxGN3M1TmpxWTJHYlYrYzltSFZ2UXAxWWl4dENCLzl1R0x2cThFYW5xbnJQTlo0SmVJSmNTZC94eVlBSDl5VTU3VTlZdFNOeUF2RnU1ejhZckZiZVdJVE1LSi9kK3M2UkxrTXRkR0I3MHF1R0t6TkpGKzlCOXZMcmRHMHE0NGNnYlBsdmhQWXZTVHlMMEl5a1IyUloySEpyVXlybldic1F2VDdHLzBmM0xCUzgzcyt0R3ZPM2VJQlNRQ3crMTQ2YnF3eE5PT21OejY5bzFQTk55bThzRDZWaHl2RlJNcjBHQXJWUDJZZEo1eDlyWnhPOURJcnR3SlJ6RmNraFgxY3RiUno1MEh2UllPdkppQXpoUHRFaGhlTlJXOUREakRPTUVuaWJtVENtVmwwVUo5UUFxendpUTM1eWVUTk9VenpJakNsZ1NKUDBaTDFwODBJVFVkSUdXVDI0WkVrc2JqR2hiL1BPT3J6a1QvTHp1cG4rSE5ydnFSZXFaUUt1V0I1eXMzcTVieGFSMDIxODlTeEMveEpkR3U3djl5OXdpdzV3T3ZJVHpEbE9NQ1hxOGk5N3A4SktEQjVCejFYTTFZU3U2WWlxcEtqRURMZndCSHZUM3o3NjYwanJDazV1dnlJNW5GV05McjA4ZDhSYzIxOWdXMDdsZ254VlFHSVhHTXFjZGdmMEM4cHRZTXcxMEVBblJ6ME9IVzh2Z1lveHBBVFd3L29CT085Nm5yYUpNS040R01adStiNlM5c2QvZ0d5S0Y0aUtRS0oweGxRdy9idDVId296dW45V0FXeHZUNU0xS01GMXViY1R2N1JvelZHMWhabFNtblAvVzluRDFNRlpwSi9xdDFrMlNLT1ZWRFVLbi9UeWhCaFBseFJERmVDYWhJSjRXaEUwYmFFMzJxN1dPZTZTYVpYU20rbXpZbzY0K3Y0WWtuU1MrMXN2aXhaUGVlRWxDODQ4bzZpOU5PYlNZVlpaZUxKTG1rRmNGWDdCTWJGSzMvSGhMb2FBY1Z0UzZwZ2xVVU5YMjRrSE9hcHg0RURFYjd6eXlJQjBQWUtjU3liWDY3VDBEdnc3VnJ2WlZNM0RtcnZhd3Z2OU1ROVJka2xGRytTR1dIRm45c0pjN1Rpb0UzZnVrVFVyaUtWM2RaSTljazRiNW5MU0VhY1ZSQ2dMeU9xdlRjckJDeHdBcjBISXJ5aVl1NTVjT2tZckI4LzJFSFpGRHRhQUxxYUloWkh0NXQvQVVpQnM5QkZld2hmc1lTU2lkUHJXbHZRbmdKSlVrVnNQNnJCcTFRM2ovU3ZjMjVmTTkxLzBFbzgrME42c2VlVTFjZmE2Qk0yWDJBWHdIQmtkS1paRFpSK1lDaElYZHJtKzdLazVLTGtUUGtTcjArOTZTZS92SmtHdVFTWjNlN01pZWFOYXdueGF0VGRlSXZhWHZkcy9GSzRsNWhuckZCdWVEYm53TVpCV2loY0tHdGcwQVlHSUx1czNrUU8xWDJoemxpSFl4ZUFlT1Uzc0FuUWdkeDYwVnZmL0I2ZnFLcW4rUEZqYXVPVnNXWGNyWFVaT1JYTjNFSVJLOEs4M1BEVC9IaHdnS0RESjRmYVYxSkorclhxTmZJQ2FvQW9FbHBqdzhHbFpHK2phS2xIb24vZHUrSmRhcC9pQmRhbisyZ3BwSFJDSE1qK1dhQ1p0dlYyQVVjZjZsUTVVVGNvQ1djb2lLN0VrT2ZHdHFOR1Y4emhlaGM1L3dEQitmZDgydWVZNHJjc01id2phWTR0YnhoaHlSRlFsd2VhU1BjNUZQam9kTzNTcUloa0w2OUw4RVBNWHMyS1ZocmRsRktFZlRSRlk0eHBJcS9PVURsYm9kZDUrT1VVcTRjbElkV21YYklHSktIN0RUdHF5T1JSRXByUStyWDVSZjU3WWFrcURobS9sdy9xZ0ZNaDk5dWMvNDFlMEpldklvalJBSy9uMUYwOHpCOTlkYjFjaXpYQU5tdnFseGxsV2xsMGFJTmFGN2VzVUlZVlZCQTJiSFo2MG14OEtCYTVrNERkNXpxRUdSaVNoN2VDZlRtQTYrNHArV1BtZlBOZWNZQnFSZHRabExDSEc5WVpEWjQ3dDhGUlJlOEQ5STM5S3hRVjlUMU5rZGtaeFhROWp1U0hiR25vdC9IVHpPcitzYkZVRFN5TjBmT1FDS2pBOTZUOThJUHVHdXNMRHZsM1V1TUhRK2tPdjh1YSsvKzBMYWJsbkRKcTF3SGpOa0ZnTUlSblJQUzJScU15TklRZ2NKTlk2S1lzS2dobkVTVjFMQzRSQkJNb2xBY1dYODU3QzMxb2FUUHhxczVDTkIrZktiK2NnTUJTRXNEYVJjUjFsRURDRVZ3RFBSUlJpeVhMcUN6MW1vT0VncjRhVzlhd2VCOU1mSW03dms3WTd3NjJSTkYzY1QxTDF2TEZKSFlnQmtKb092QzA3NGI0OGpncUJqMmtqVGd0bDN3c05LOGlpUXFzYUM2MUV0M2JwazRBOEozcFcxT054TTd0d0kydnFya1lQcTdXZ0M1RGU1d251aVVTTDkyT1ZkbTZ3R2RsVDRIMjdGZytISjZuK00yNkhuQlF4S2FOOXdFSG9yYmdZd0hxcUxzM3g2SjBRbEhGWk9CR1hyRE1kUHJURTlxdVA3ZzRhRHRvTmltWllUMkpQM2pyRzJXZHhRdWNGWThpckpkR3ZRRW95MjJKdmtqeGpLZkJYamRQOUFuZkkrNTNWb1ZKWjNZb1FEZ0pVQk15RjM1dHZqZW1qWkhIWEhkV3RSMWU1allHakZsNDQ2WDZVWC9JL2FidFRjNVp4emhSeXRlRzVkYkQ2dmcyc0FWeTZ1YkN0NWxKc2NNM0o3WnJsVUx4QkdnMG01NW16bFhHRE5iOStocWN4Mm1xb0FQRlpjK3Z5Z0dFeTI4UjRiYnJBTzFvNjNqTHVxMjJESjcxZ0RRbnV6TUNhQi9xbjhFZW1tUU55L2ZXTTRGdWpqMzI5S2FzQmozamFyY0gxeTJCaGFIeFg5L0RwcHZQKzVrRGJ4dmVCamV0WmZ1MmRVMW9DSnIwbGppVy9QUGNCbkR3YkdSZVFxUGRQTjE3TlJaRXVMd0ZwcFJkZWNhUkEvQ1VkRlRCVnV4M04vSERLRWdRaEozVUxnSUtQNHFkVjNLZVlsY0tJV0l0WXpYNExqYnBJcnQ2RWtFSjJVODl0K3lQa0c2eEdKT3BwWS8vRC9DRDNWTHVHT3RGdFZYZnVQeURjV2NtOFpmbDFkcmoydHh3TUdJelJPMjBWK05COVQ3dVN6WVRuWWFvSUhLV3MwY0dRckJaY2ZWWXBmWVVIQ1hJRm4rUXF4eWZnd24yRldxVWkxWm5JaDlNN1NkRE5pREl1bnFZcmEycE5LdGh2WjBBSUpJdFFzR2cyRmZRU1BnUTdtNU1mbmtyM0NTeEZOVHFQQzdnWlhTUEVjN0ZVLzhsdzh1UGNIRFRjSW05Zm9jeVpzMEFlak1LNnVWRm45ZUYwaXZNbS83NWNDbjdJQ0JnVE1ITC9oWFV2RTh6ejNXOGo0ektOdHJ1Ni9BaEFqbktxaDdWRjVZLzlrQUFRQWFBRUFBQVNNQVFBQVBBUVFqQWdBQUFBQUJFUUg0UUFBQ0FBa0NBUUVLQWdBREFCbFVhR2x6SUdseklHOW1JRVpwYm1kbGNpQW9OQ2s9PC9CREI+CiAgICA8L0JJUj4KICAgIDxCSVI+CiAgICAgICAgPFZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvVmVyc2lvbj4KICAgICAgICA8Q0JFRkZWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L0NCRUZGVmVyc2lvbj4KICAgICAgICA8QklSSW5mbz4KICAgICAgICAgICAgPEludGVncml0eT5mYWxzZTwvSW50ZWdyaXR5PgogICAgICAgIDwvQklSSW5mbz4KICAgICAgICA8QkRCSW5mbz4KICAgICAgICAgICAgPEZvcm1hdD4KICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+TW9zaXA8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgIDxUeXBlPjc8L1R5cGU+CiAgICAgICAgICAgIDwvRm9ybWF0PgogICAgICAgICAgICA8Q3JlYXRpb25EYXRlPjIwMjAtMDEtMDdUMDI6Mzg6NTIuNjcxWjwvQ3JlYXRpb25EYXRlPgogICAgICAgICAgICA8VHlwZT5GaW5nZXI8L1R5cGU+CiAgICAgICAgICAgIDxTdWJ0eXBlPlJpZ2h0IE1pZGRsZUZpbmdlcjwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw+CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk+CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU+CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT43ODwvU2NvcmU+CiAgICAgICAgICAgIDwvUXVhbGl0eT4KICAgICAgICA8L0JEQkluZm8+CiAgICAgICAgPEJEQj5Sa2xTQURBeU1BQUFBUG5GQUFFQkFRQUErYlVINWd3Y0RDQXNBQ1FBQUFBQUFBRXdBRUFBRHdJQVFBSUFRQUlEQUFFQjlBSDBBZlFCOUFnRkhRRHVBV1VBQVBsRUFBQUFER3BRSUNBTkNvY0tBQUFBRkdaMGVYQnFjRElnQUFBQUFHcHdNaUFBQUFCSGFuQXlhQUFBQUJacGFHUnlBQUFCWlFBQUFPNEFBUWNIQUFBQUFBQVBZMjlzY2dFQUFBQUFBQkVBQUFBYWNtVnpJQUFBQUJKeVpYTmptY29BQVpuS0FBRUFBQUFBQUFCcWNESmovMC8vVVFBcEFBQUFBQUR1QUFBQlpRQUFBQUFBQUFBQUFBQUE3Z0FBQVdVQUFBQUFBQUFBQUFBQkJ3RUIvMlFBSXdBQlEzSmxZWFJ2Y2pvZ1NtRnpVR1Z5SUZabGNuTnBiMjRnTVM0NU1EQXVNZjlrQUJBQUFVVnVZMGxFT2tkU1FsUXdNZjlTQUF3QUFnQUpBQVVFQkFBQi8xd0FFMEJBU0VoUVNFaFFTRWhRU0VoUVNFaFEvNUFBQ2dBQUFBRDRUQUFCLzVQZkd4QUpWT2QzeHpjWWp1MXc2NVZGaEtwbnZQRGYwMVYxVmdOWitSUG1ZOEYzSS9wT3hrbjlLK0dyTXF6VWRCUGZKb0JvZ0lDQThZQkhIK1FEdzhHRWI3UmJQeXFBOGFCcnpZSlpSN01hS3lIZ3djNU1nUHdKZ0QyckgwaWU4c0lpVlFOSFZoMDFTdFI2MUUraFVpaysxUkVFM1lrRVdKRExUa1ZYbVA5MVNhT3lnWGFBdzFDT1FiQ0lvRm12bUs1VWFSWlJBRVcraUc5S2pBdytYMjN3N0U4ZVZJVXJPcHlRTVVEOFNxL1pKdVM5dU9VNGNhNnVNYXErbEZwcGFLNlFoa0cxT3c3emJFdWpBSEhrSXFZYTM4U0lrQlZzWThzYVZGMnhNb0Q5c0J2NTRFeDV1QzNUK3BQMUJ2eGt2d25mbVVDK1JqbG9SdDJ6Z1Znbmx1Sy9mUFdlZUI1S2JUV0JQQXdWQjNzTFMrRUZ3RlYxakU3UHNBSmUvYmwxTFBiSUhPc3hBSHgySnl2S2dsZGdJc3djczNUL1JqLzZpMkQreXBFMTJISWZyaTJ1Sk9DdVBLNlRVc1I4eHRLdllJUGh2RzFDQUxUYlFiQURYRTZQa1dnQVNMQklyNWVUYnI3TjFpK0VwV3ZPVklERm96elVpSC9zOENsL1BMaS95LzI5V2lxRitML2RyN1Fwb3pscDFMYW9oZmYvRGxIbi94ZmplamlwcnVqak1SeEtMdGlubjFESmtNam8vSDVXaFBqeDB2RXV0WXFBL0VXTkFMa1RuU2dCakxKdlMxQ2prYjZjb3B4blZ3RG0vVTVVQWVDN090WEdUSzhyZUhGemV1V2dSUFRjczFHQ2NiNExyS28wRllERmR5NG1qR1lWMldSVGQrS2tFRzhJdFBYNWlQM1RqZGdwaEcwRWdOUTJwcVFIV2lSVkRBVVhIVTFUclY5MXA1dUhXQjF2aW1DQzVhZUpiZ1BCWXYzY1VrMXdpV1NHL01DTHVieGFTTUpQbjN0YzNHWWpnNVNpdlB1RUtWdnNROVZMTVlOMUFTT09JTEFJMW10a25uYk5jaDBIYlBOSzI3UDd0OXJCdjF2MEdoc1EzYlB5ejN2N2VqMnplZWVvbytFOEc0TkFVM2Q2MEtlUGdmR3p3eVNsVXk0NjBMaWtjQzV6Y0NneG9JV0RBRWkrdlgzbTBCOHFscS9iamNUQ1RBZ2FveEhROEErcGlCZ0h4MzFwV2RGbnB5ZWFmOXBhTmtZV29ZcVRpMzV6Sko2Qno2c1J6d1RnWnlFOFVIcllYeXBRa201RWo5QTJmNG44cGZmSVRYem1NTGRjb2ViMFo3UzJ5NnRmNllsaTMxSnpnMFN4MWpSRkVSdkNJT0ZWTnROY21EaWFqTGczTG1TcndXOHJXMUxsOEp6WXkwbHlsSzg5a0swQWluVGtxaG5ud2Fyb0lyZzVpY2Z2VWQzQmFtZVJ6ZjRRWDhNaHM1bW56d2xnc0xlWVZjbjRUWTJDNzgyVHRpanZySXVoT1NXK1FlcXpkQUJTdjQwZGVXZ3FFQmVJTk0vaHJhZ2RXM1VteXc4dmNsVkZDOGlkWnZaSGM5VDluNFBLdDJOTURBamxFZldRS1pTbENZNWRTN242VkgxdExUc0hZRGFQUW5PUzVhclRJOUo1czk3WDdWaFhSeWZwY3hHOUc5ODZiTVdrcHdkVTdSN1N4YVI2YnJ0eHliMmdsSk1qNkNHeWo1S3R5dTRyVGdoQzB1UlRwQ0NreGY1RkZSNVdQa1VTbHB2aTVJZ0pKaUFrQllZYk1DZkJhWW51VENmM0k5SExZNUtVV1I4cTlHeTY4dTJVMzZVdW4zaUczNzRMU3ZvNlR6Q2UyMmp5aTV2Rm1HRVN2ajFsNDFhc3lra2NTaVNjcTdqZ1FMSjdlK0ZtekFoL05ENnpiSzdKd3UrSEVGZVE1aGxyUnBxUVEzLzhwN0Jhc2tFeG5Dc28reWI0SitwMnVmdVJVVlRjdE84cVhjc1o4ZUdFblZjVE11TmpCOHh3aFlGQ0h4aTlWcjdxL29vdndOdDRmVlZLYVk0VExkbUl2UXRHbXZqMlB4SXdRc2c3bElvdlMzRnpqMVl4bERQNmhOcXBBSUE3b3VmME1kc0ppR2l3UzJ3Qk9xRTAxT2VDS3lGSHVpS1gva3l2RFlsNVVjQXM0N2xsT0ZHRXBZNm9iWlN2QVQ5WnNTRCtRS20zekEwUVhqdUU0S3liWVhUVmZYQUVRdEF2Uk1pQ2dJRStZaWtFVEh1U2NDZUYrREpQeTdZQW9od2JIcDc1eEFBU3lkVTE5YmtqbW56bG9DTGgxZzI1Rk9lTSt2VW5Jb3ZyNWwwS1Y1UDdRQ3M1cGJ6ZmFBek9TaXlFRUEvNTVMRFY3VHpBMmRLOE5EVXFQd1BGSVBxTVNTblAvdUJRY04zRTF4K3JqemtyaTNxVTIxYThhQ0o3SWdCaFpaZkFWaEZhdDBoMWZ5cVZHbE9lMGhpUlYrakRPLzlnWnZqVmxzUWUvejZuT3RDYVpVMXZ0OFdpWWtoMDNLYjZ5cVdwemhvOStMb2E3NXJTY3JuN0Q2SDNnR2hBbGhxb2xDWkRpSThjVFl4ajB3MTlUVWd5ekJWeEJQS25VcFQyQ2daU3Yxc1RDZlRvNHpNYmp2MVFzeC9nRUJuTUE1ajVDWDFiRktPcWtJODJZSjIvelF4cEVSL1NaRVN5V3pJUHhOYlo2VnhDSmN3UjBMV29WbVEzWmhQcmNHMUY2bkM1MEV1WVVaeHVZWHQvbEdzOW1tbkxSU2EyWVhXaXJNeGVUV3JsTDhUTVJiNUJlME13azNZVGd0SE5rN3FBSGo5aHFQdkNJMHRtYXlsQndlYThtWGo1bE5vd3VMMXdBVkQvQVlhblVhN0k4cHFPTWNBdFJjaUpPMGxlczcrRER2Y0RNMDFZdGxkU2VOdnVaM1lYbnZlOExObWdlR2J1WUhIQWlWTlBEZFVwY3JVTWp2YXhYWU1BR2d4TkV5bjFidkVqMTFld0U2WnYxQSttblZsR1hBclh3Rk4rTndpT0ZJdERvYm5tTVYvZGNxUzJCTlBYMmUrYW9OalFLeisyR1ZXOEorNGtqRGZob2RFTEMwNHdGelVGbWY4MXlybnZ4bE53cEVuVlllZ2ZMcjBZVHkyb2RkRGJnQ2dsVnRBZmg1S1BnRy9PVmRQNmVVT1FpMVA5c1VOSzllK1MvZ3FUSnRBOUZVbFEwb0hGTXdPWW84dW5YcWlqRDRvTXR4TlBqNmRBVzdVZkI4Wk93d2wwNEhXbEl5c0lWUmlQYk1iTWh4Y3dNUiswbGNzcWwvanR3eUF2NkVjWUpGU2pXZHIvY2JqaktFNTdXbldQSi9yV2V5emFtWnhIeGpsSFgxTHQxSFNnOWQzTEhWbWpMWnlRVFBWNnNHZzF2blJSeHc4ejMwdzJEOFFpOVJodndhUTY2d0E3ekNlZ1RnYmJzeTVqYWhmWDI2LzJaZTF1Qm53L3FLUFFaZm9qV0hYN3RtWnU3Nm1TMU93VUl5dms0QmJzOTVtR25qdFNUZVlMUkU1d3pkODQwRkRzUExNR0o2all2ZTcydEROUmQzU2JBb3U2akI5ZEwzVDhXdEkzTHdhUXdSVUppS01scm81eldsSWJ4RjRFVCtZM3BnUlJ0VHN6YUtmZUxpeUtOOW5USWNLSXk0cmFNVXhRNnNGZFNjRk9LenlweW1FdEI4TDNQRFpsMzgvQzdUM2F4a3JZVzBxKzdTVkVZenlIMFFDdHNCNHN6aFowbm9DeFlNdG9QdFhXc2ZZeWliRWV4TkgvTkNWb0RYSkU0YllmVkdDK3VMbVRwQnhCejZYaE8rU284djlaeS9VRTFnN3Q4cmJjL3pROFY1WlIyR3dKRUlHMFQxMXlFUlRkZVFEWnJnWkxkeUdHaW0vS2RYQ3ppdlAxZDZkQU5Mcnh3eGd4TW5SSmkxSWIxQlhmWFA5Mk1ud3paVmVPakF3Qk4zQytQQytrR0hkeDRqQlhxcVg3bkRnNTd3b3p2K1hBSEJkbk4vbks5alBNTlVMbGJlNk1vMy9Ra3hZdWVKV0J4akRPV0NLOXI1bk40alBMK1JRdStyM3lKcENSTUY4RVlqQW5NUmxIU3ZQR3kwSGFtNm5DRXMvZHVteUErb3ZzT0tBTkp6eGcySEVoenU2VEQxY2N3cVk5MFdhbmp5V2hQSmtTRGtRRkFqeFh2Qm14YVJrYWFqOUtLZDRXcGNTU3YrT3M4RTE0Vko3UmlvM3NnZGxjOVh1TFoxckd6Sk53UGFTRFFsZSt1K0pZUFc5eG5Pb2Q3RzlzSkFZY3l5dHc0dVJDNFVLVWo0TkN2dDJpek5HS0VqVXp6Q3NoSURxTjN6WVlaZXJNd3ZiNjBGNWFKQ1dsMVdCQ2QrUVovekFTdE80SFRqNlRkRWJyY0dhMmFrMzhIQ0d3OHNLbTJvZjZXM1d1ZCtXOWI2VThHTUlReitZT3Y1YUZZdEZQbU9MU2VvMk1HcHZZaU1pUjBsZS92dE5rdmlxLzZZNERFWHF4MDNnM0RpbWlrSU83NnJBd0VYWENGeTJ2RUJaTVE3Z0x6cGdUSmxvMy9JUkcrQlZScHhXRWhvSXJ6cTl0V2JtOUNNZVpaQkc3VjIvVXd6TzRCNXNFakxHaC9Rd3Y2R0kvV09vQS9QblBiWFhwRXZlakROYkx3UnVtdUJ5aGZ6WU1JQ0RISHdVN0EzejFSQW5FT0trTjBvcFFTa3FZVGVGOTFtMXpWWEdFTC8zYmdhU2I2QWp1L3ZpekhwV3c1QytUTWdNQzBXaERqREV1ZkY5RVVnYVNMd3VpdW9kYVlEZHdGMWNMNVNFSTh3WVBQNXJxMHR3NDN0bmtkelNwTnlCNWJIWElPODNIc2prYXp4UDc5NWpqbHU0MjF4TkpJNUlXUTJIcnBhN09URXlheDdqcDNySVRoRHQ2YTRBNCtiTWp2NXFGeGZRSFJRYzF6NzM5WjdyblRnT2tSVVlJQ3JYdlNtWG8rQmsyQU54UnUvVENOaVU0dzBrQm9qSS9MYTQ1SnRwQzBxcTBoc3JpRmkvNmtUZ2ZBVVFlK05pbXlPeW1PWWIwTnhxdzhYQ3J3aTU2dG52OFZBSDVxUEw1RlRSVlB6eldnWk9hYUdmNDhJT0kxR0R5OGJ6dUFnazBNaGhyL0hSTW9HemNzZ3czU2dsNUpuYzBLV2V2NDBFWUF2a2g4RHlRb3hlZ3EvUFVYdktMZVlmN0dPN2FUMStRRGVtREQ1ZSsybFMzdVVwT0kwTisyaXVjaHlIdFRUL2NBWEcxRWlxQkRwc2lpb1RmQThkRkpHK2xkRitFUUkwQnVXMVB5Um42STlBUHhsRU4wcmFTdWRxaUQzWXphakNLOEp2UGNpTkFyQmt2VVFWS0wvbTRRbXpzeGlza0R6bjZxT1NrTjg1NjB6UFh4OFh5NzNHMS90WFplRjIyamhrTm00U0ZQT0QxU3p0ZFFBelVqK3Q3Wlo2cFMvRUtJNURUSm95UFN5KzdQdHNwWnNxZFRmb0d4eGFucXNRY3JkYnlnSE1OcCtpenV5Tlc3L2ptMUdVOHZ1VVNxcWlxVVhOazJyQ1IzaFArRmw5UGw5a2RNV2pEZ2pvK3VUYnFEbCtiS2NYdVh2OHZ6MkdnUFhRVFZiVUFnNDlka2FqQ3YzUVJ2d3EyNW9zZ04rby9ETUN5M0R5dnYxVEo2c0FheGVrTGVhd1RPMk52SnFmMFBpNHg1dFlMZWtRck92eTVYTy9tcUVyQWIzVmtlMlVkRUtJZENpMjdZRXVITHcyMjlUR3VaRmdQWVQvTkxMR2ZVUmJZeG43TWVRVXQ1eFplVjBYOUtIVm8zaFB2dHBOeEorelZWUU5FdG5EREVGNk0rUUtGTElHS1dMUFJHZmh6ZEFhTlduQ0JIcmtqTlV6djlETzJwUUhXdFRoTERmWVIwU0Nid2l2STZUUHRlOGdUWFlseUxWL25CcG5wWi8yZHhiem80VFVqNUZtZngrQUtmRnJjZDMvNUVxYjJudmlwVHdlVW1EVFBTYjZwQ0VvZHNHaVE3cW1mQStDOFJjNEpGT09veUNISXJycEE4QXpDWFFMSGJ1Qm9wdTNud1dUTFJhRGwzREdoNG50ZHJTcmtpMnRWZEtlNmR3UkQwN2RWUUkxdnNEZytXQWdXY2RQQVg0bFllNXA3L21wRjlzaldnc0VQLzBHeE1rYzc0SVpOcXV3ci9tUmV3dllQWVE0K3NOVXVxRGxORmU2T2paM3BGQ2RNdFRSamdmcE8wMExnVm5RWHI4SWZFbHQzL0dXdVRwMW8wMVVxMjQ2Zi9pQ01ienZmL3ZRdktSNEZKQWg2VVJpbngxMDJoeEhDYndtRVN4WkVhcWkySDJPZWJwdlI3WWxrSlRvbkJSZC9lOFFTNk9ORldiUnZTa080TlF1OGI0VEE0NzVwZmJHQlg1dHArOEptb2FJRnFHTUExdjFra1JzK042bzUweGxiUFhoRldPOEdGSUE5bStTazdWeVBJOThqODBOZ0xJenhQNEY1bVlOMHdlUHRJY3VzeTk5SmNMZzVCbkFNY2RaN05VaS9jYTRqbUdMM2JXb1YvcGIrcmJhRVlRa24zeE1Yb2JZTnB4ak9oc25GS3VSbng5cnJuczEwNTh0cVZhQWZkOEdZSVFNdXpLdzdhSnpld3crOVJxNGEwUzlhUE9hZWtYbzRzR2s4cU5qWWswSTI0T0xQdmRoazRqWTQ3SDRJZUl6WEFFSnlxWWRsZkY3SmxibnlxUVVlUSsvWWdUSEpMemlrc2dNV1ZjL0FPQWtTMHFiNlRlR2pSTVhZUGxMUGFHQ01NNldJeU12UEt5cXRKMFNTWXdtOHQ1RkZDUzNmZXNROFhKSmtIWkZkZkVIM1plTXdMQUdDWjNZVDBzWHRhbjFtSGtZWDBHN1gwdFlJVzdYdzQzcm0vay9uWDlBZThFelNlcHVaQlJzYm44VG1rVUNiZ28xWHNjYjJsRXgvaDVDamVrSTRXOG8xbExaNysyMmFsQm1WOCtHcjNVditramVkUWNWMG5KU1duNmNkS2pqRys0YnhjcGtGR0NzRzR1dE5FQ0hwWnVjMVhNWE02Q2JnN1pDN2RVLzFPU2UyelNRUWdTNTVQVzFqMnRUR3hLTXNZZGpHbENpSU1GNndleWszZ055cG5ZUUlQWTZ4V3IyRXVNRlcvcGhzajA0ak9VRElReEc1OWkvMHBVVTVyUk9JekxWNzFDeEh0V2RENnRvNldxVFUzMERKZzNtNTNscWZlS3BOaEdTRVNOb29SSTQ1UlkvRDdvbmM1VEFOR2hNeVRoZElRenVLeDQyMUUyeXhnWGlRU05LQjRsSXFHVlMyL2FPMDNjZ2NsOWEzSUJhT3dNazYxYzdIcStnMXRFWUI5Q3ErK1ZmTlJvOXplVm5FZjVPdnpjbGJPeVlDM1drbXRHS0o5UDVtVldzb3dWVTZ1SE9hSWl4Y1dtQkFnMU5GQms3U09KaUsxdENFK0JZMmlhV1AyOEJzWXhZSWpxc1hyR0hFdzRwV2J1YzFSQ2lHcnJzM3BySTBqOWhGeUxna0t6SWpHT0dlc1o5dCtpQzVQaGFORDlmdFAwY1ViM1BQT3ZXWkpZTTRXRlAvYko4OVFhajdWU1NKdFg3UEkwby9heklBTS9CQWNVdzlFYnNkcVFkUDRqSFBUY2FrVEF5WTEzazRKTlloVURFc3dhdVdwcm5LYlIwUjErVEpidXA4d2VyWG10M21nSHFpcFU5SjZubVg1bEVuRjlwSFJQTWd5RmcyaWU2TVpWK09uQ0FJVHRVRE54cXJoc0dtSEdRTlF6OE1JSUlYeGFXNWVjYVBkTGlFVWZVbktKUzdzZjlRR291Z1dTcS8wd2F0RXdkN28vai9PU1Q0U29aUWV3ZFlFc3IzcWZLVGxVOTdTSzNDcmIxN21zYVdRc2p3Ynd0a2lHWjVLSkp0Rk8rbmxoVS9jMUtSZ0VOUFgxZnR5M1VtNkZidnhBWXlsc2JUdXJ3eVRHb2I1a0p2NWw2OEx0blhIUmNtRTVJZGhkZThCYmxZMDB0R2Z2QmU2RmJNaWtuZzltS01lRjl6N2d6T1hkSzVMTmNiTkEvOXNrNXl3SzZIbW04MTRwbU5qTzlWbVBocmU1VDJiTFR5ZWZFYmRQNVhUbXBNek5MSk4yMXNvdmtaR3AydUVFNUpyTjJDVWNGWDE5eHdXaldic3oxWWdZRXdCK2tOYk0vdTlzNWcyNjQyMzFKeDhaQms2b0cwSmpzQVIrVVVnMC9kNzZJeU1kTkxxb0FIeXFwWklwMS9TRXdPelQ3Rko4ODdPMU9qNDFRcE0zVDZJTURad2NteE4rRk5JN0tqYXloaHJNL1NFaGFycm0wcllobFNrQWpnZk9sNU9kei9ab3ZXN0FyNitTdlE2bVV0T2pMWlo0S2d6eWRYZnFLRVZmTktjeEJGQm9uMEF5bTZGZ1hVeHE5VEhqSE1lTDVvU1VuOEpWMXNCSTVraEZQZE1YeU55cmpMZzNQM2N6TFBCWDhzcU1hb044akErOTlDTlI5amFRVkFXOXE2L2JlYmxtd1VrOTJjTy91UmhvZXliRmd5TmM5Y0dlenFBc2l6VHNJYWRWWnZ0cU03azBVNStLdkt0L1lpOWFwcFhhSnlTb3R4THI3WXBLOUVBcnU4YWl0U2NCZlVUbXU0WStlak9IemZTWHBvd1diTGdVbHdzNktuemV1NEpHVTd6TEQwaEtpQld2emNBTGVycmhKS2ZPOEF3bDN4UkhpK1BsMXgrU1FLakJrTzBqRnpSY20wd0lrRWpGQWlsOGs2WmlQNWp2NkoyMzJTYzgvdXVjUVVhN0tKUjVQZ1Rwa3cvVW16NW5oSDVxYjZ0dVFaaklKS0pGRVRHcm8vZnRyRVNYWnRkMmdWZDdZN09HeVNDS211WVRzMG5IamxaSy9qUTJxVjZmcHV3Yk5rRTZPRWx0ZFRmNUxOV0tqT2crUDRPSGVpZjFIaGM3TDF6MUczSjN4TmRDZkQwY1Z2VGdZVjd4cFU1MnRpYjJOQitxUnVDU0Jyc085M01HNDdTKy9EWDRDQWdJRG5uc29BNVdKOE1zNGpZMlByVlRYQzQzR2luUStNbzZWSElxdTFmSlR6d0x1SEk2YkNNQ1ZVM2N3ZlJXK1FPa3F6U2VPTlZScFpCdEMveCtkeHpiZnQ2SEdubFA0eVdGS2l3dHNWN3EyeVBFRkY3MHU4WERXdU41bVAreWt5VkhkZk9FTzE1TGdPVS9Kd0hpOStpNnBjSVFrK1ltU2xIdFVvc0JHeTRkdGE4T1JaK1hUUTRYYzhyd1luZnBRaVhFczB1eG1jQ0VzZ0p2T3pnOXBZaU1XL2U1SW9sV3F2MzluTW5Fd09lUDFJUEtjRldEb1FiaXE2MUdLMDViRnN4VjRyQy8yNEcwZ0RlTnd4eXRDQ2dwbTFnSkhseXpLK3hmb0sweEQwQnhuZFRoSm51NHV2TkkzV2I3b3ZPam52UmdCTzNNZ203NHU3ZzlaOHJFWEJJSFJHSWxjU0lhWG1pRTUzY2g3cHBwUEZtTEJSNklDOHA1S2UvMGVGdUozNStGM1pYM29FMmRwWVhFNVU0U0JsenMrWElneGY3c0Y0UG9NTW1JT0cwZjVCcktMRjB2bEU0aEt2MDZUQnZpSTBoaEkxakxDNnV2TmZSNkdxcUZvZFJXcDdrQWtHd05lMUQvWUNNT01Vb1lkYXE4ZzA2U0dObEF1YUloT3RHNFR0bzNOZHExOGh0b3BYS0orSy9jNGN5MlR5WFcyZlBIK2huOE9rTis2OGI1MzlwL2diZk9CWkJYNkRFTWRtZDJ5WFBhQy9qWGZ3ZWdUbSt1N3ljaUVudVhoeWVjQTlNbTZMMWptYnFsSTZpem9QNEltKzN6S09CSTJlZGUyUWE4alBaL25Ic1ZSNFU5V2xwT3pWRUN3TzRkcncyZjJQekZVZkFDcjB3OEVsY1U2ME8vS2dTQk5yRmhxamFVVGtWREtrVXFOV3FPTUkyQTJWNC9MdU9waTZGdGVGL3hWNS9BUm02VDkxZEZGbTFYaFVpeWVNaG9WV01yRHhUbHdGZ1FJU3FWMXcwTzRTaUhyem11TVAxdWVTT0VZVTRuSk04MGdPZVd1QlV2VmFFRnF3MmViclpHNXhYM1pmTW5JN01KcENJSmtzZTJZOEJtTHlYbHE4bzRiSU9BNTd1MWUrV21nRzNHWURVTzFwTCtPcXBIekdIc2NESlVseUNyVG9XYlpJV3ZiTnpDbnRTcVRTLzJlMEFUd2sxZGFCN01DVGRGM2RYa21mZ3cwREhsT1VhN2ZvZ2FsZ29KVCtJb1B1VnFkaHpqUWdEY0cra3ladjQrQVA4SkkzQjRQbC9YazdzNmhZdlZBM2NBU2d5L0huejA1UndUWUgzaEk3MThSeUg1VFZuYnZlZ1VSa1hVcEZ6bDU4MFBtR0pyUWhoRnJudkNFRTYvVlZobTNvMFc5UkJvNHRUL2g1eVZaRUZ5NWtqS0U4V1RQbnhubW1wVmRjcDg3VEEzMktuY1pVVlA5WUl1WTBoVkdtdmJpRzg5cGp0R3NKQXdpNVgvWnpyekNpQ3NVbXRXeFdUSWVIbDFidVUyMUp4MDcyQ2dZeG91YVRrNkpHRDV2Q01obEhldDJtdEUyODFBYk1IWXFxM2UyRkpZVWdsVVl0TDFwb1R1VTJDaVhreHhSM0t6TkVyY3RVaG56MEtrSEhETlU0dEpZM1RrQ0Nud2xqZEhsVVlpSnVJeTB1ZExsQ3VVS2ZKZXo0aCtqbVpCNnJ0Ty9qbjh5a2JyazJ5eDQ3Zll5ZzFNdTh4UXBtd0t1ck4zUFh3LzJ3ajZJU2lZWVlqRTFHVm0xSysxbWREejFsMm5GZWxwSW1mTG5NRnVjRjJmVFZMRmNUSUFxemFsOU5yVFFoc3REd0x2OXhXQVJNQ0JCcllodDBNMmdQNyt3NVNuVVN1RXFXamxIaklnSzl2OVk1NXcycWoxVW9uNVk4OTh6ZDZXNS9MQ1Jrc0xUMWVOdTBGRmF0bTFxTWl6bDRZaVlxMFQwSWpXcC9LOHFIZUR2dVM2OXFWUXhHUUx6WW94aW85WXl2MW9RdlcxTTZoYUN1bVkxU2htdjk4bERzeU5VMGVJTHhKb2Rwd0o4K1QxSWplQ0pUVlJic0hybFpUcTFlb0VzWTd4S0Q0NTRTcXVRc3hsbTROYndqZHltcGgzMy9PS2ZvL0xmcFVJa0ZCSTg1QzN6bDREcVNoTkxucm45YmJyaHh3Y2xnRjZTQmpTZG1vZTc0eFp2VnpleXI1WHRjdDBlZXh6akJVM0l6Q0dJUkFocnBYV3JyTTQvTHZseTJkbGkyY1ZWdXFpNnFMRk1WUjAwSTNIcjVJOS9mdTNnYXZvVUd5cjRYK0dIMEg1cXdSUUhxT1VEaXk1VnBuWDlxcDk2MnlsaTVLL2lSbEtINVFBVnk1UUVCd2hUdHhva1BiQWZoZXZtb3VQNThNbDhhdk5CSGhwTG1xY2czV2pKV3RxN0tEbHYydUVOc0pSRlljZnhIY3lBM2dyRlAwbVNyMitWVGVrV0VwblBPMTg4b1cvdTR5YzV4WHJOUk5RYnI5b1FxNTJTV2Q3bWRNaE1aM29uMTNzRXFWaW01U3FweitvNWdGcmUzN2YxazlYMTZhZjJMZnZySVRmZnN6ZjMrb21ESWtldlpQd0c5c2VFbUtYZnhGRXE5RkFSU2k0MjZLYmVzb3c5a0MxTDhUWTdSNWJNNFRUWFYrZHhIWEtXVlgzNGNBV2twQmlmVU96akFScmtEbmlVOGpXQ2VKd2VxV2VleC9mSU1ua2pORjNmSTBqTUc2b0JsdGcrK3dJbmNHWUhJalk2cS9HdWJqZzZEWjRCb2lYck1Bald4N0VsYm82bW0xSnVvL1BxMmRHSjRSUFhoUXRIdUFHdDY0c3lkeURkQ3c4bVNBS0Zpb3Vmdk8zZHF0ekUwWWJFRGtKK1VPRjYxZEttaFphZmgwbXhSekdWdnJsU2RuUnBMb1Y1TTluUVBKekg0djZqZ1RMcnJqaGJSVUpMZTBzQlgrb2FwY1RlYXl1ZVA0YnZHZTNTZHdvY3dTREExSWp2cEl5bUdaa2Urb3NMdmhqLy9JZjlKS2ZxSmxJRXNJRnE4MmlmRjE3ZjR4bk5MNjlKanpxcU4yaFZYeXlxVFRCeG95a2R5eGdmSDJsbkU2RXd6bkJiVHNZcWw2dmJrSEJuN0tCWU9IWWdzZVBydkozZHovMWVKd2JweVJ3bEdZcS84RFJKdEYvcTBlOHdCcVJOVkxvRzVWSi9ZMXE5bjB0anRwU053N0hqZkp3OCtNakdxd3N4OXlidlY3b1FRV0NZNk45Q0RpMjVNOHZENUZucjJpUjZGNTNMMi8wTVc5WWtZOUIxbENxaU1Dd2diSW8xZTZRVW5UZXlpRjlFTG1JZWRCUDdoK28xRFRxNjVNYXJqQVBkeTJKYnBKNjNTc2ozT3gzcjYvVmVBMk1nNnBmRDdXcG1VUzQzenl0YXc5cEJ1Z3dTZ3hyK203QXVkVElwZ2N1d2FLUFZKN1NEMFlpbHBpK0NZS0oxdVBKemZNN1ZRcXFYbmpKU2VNTmRQVVB6NWdCcC9pT0M0Kzl6WklaNmhMZUNWN1ZGS0Fjc0hrWk82NFh4Tm5LOFRPVTFJZStYRGtNK3JtVHNRcE9wYWMzY0ljL3pYSWYyRjRsQkZaTlB4dWUwMnQrSDMyZGIrVXkxblFJb00yU2E1TU1hM3pXdGNqZmRVakZHR3BoQ2U4ekxTS2RlU1l5Z1RUMkxrdmsxRHE0Y3FLeFFZekpIOUtVbUJJSzduaDY4YXJrZWVoYzBRRytZUlF1REo5UGQ2eWl5NDVpRTQyaFZvdjE2eU5rWThzUmQ0MHgxU1RvblhFV0MrRk9oR1NqVTlGRVNablRLeVdmU3doNEpTb3VodWVPMEV2enBRZFdFZGRTOUcwVFlyb09rUzMzTG53NHl3UG40Z200Y0RSTnJ3UmU0RWJRYTFwNUo3MFJNSnljWEY0V2Fwb0NCa3hESVdQcXJCbU9zRHZyUFN0QVdSREw4RjhuSXNUWjlPbUhwSmdPd1ZHTzRPclgyQ3Nla292dEpUSjN6RjlXSlV4dkVLZVlRQmhqZVdwdllrY3AxVUJVNVBEWTRrN3prYUdDT3VlT3VibDhucm03VGRkejF4ckZqRno5MmVqb0VDSStZMkpXSWxrdkNrVUROQ1BPVUJQODdWNCtrbzdIWi9ZTnFZZ1NoNWYwUEpkZEk4eGJrMDliSFFJbU5uR0oyZDJGSWQ1bTdaeno3dXJYSFpWbHdMSWMveFF2bHhQOFIzRDNWZnk1RGdUZXFSYXFrcnBvUlU0dkdldFNPWlhhaXl1N2RmYjMyVWJrcGJHVHRoMFA0S3ZXeVc2Znp2OG5ocEZUQ2NNaktlbUxrUmllMGxqNDMzYmxmbDhOK0RxY2lBNEVIT25hTS90Y0RQNEVSVlZ1WWhjOHlMQmV2cDdCR0tuU01pV0xZc0RacU8rUEMzT1ZFNndnSjFXWDBudW1OOERXOWwvQ3lPSEdhL3F0UlFVNTJYdW9ucWVlL1RSM2hkdXczSUNMVmRQdEtRNmlZV0dhUVNwSHY3N2podFNMa25QaGFxU2F0ank2MkJtUDhTclpQY2wxaVh5dmNONUtFd1pid1g4clhZeGtJY0ZlSDVVK0JHaVRzR3g1OWhOY0R0a3JaREg0eEo4Qk5RR210MXZZR05rbmY3ZU5MS0xWWXBlaWExMSszUXpQVzJxSjZOQ3Y0d1FCdEExWFdQa1RwQVVWbjhoK3dwUExlcnh2OWVmN08rNFBveW9JRk9BN1RCUkNRTzViYU9TdXN2eTlOaVlVOVA1ajhLZzNWLytnUlpzT2pxMVRzbUYwdUxNSjhKai9EdUFiN2tBVmxZeUZXTit1cjVicE5RVG5ZV1dLL1dpMWNSdFRDU0ZRNm9vOElDYnFDYmZhSDZVTkU3WlFYYzFrUUJTVTRycmNUTHRFc0NIcUZRT0NEME5LbC9GdXE4OXF0SDBWMTJvM2ZJT0RYUWppR2Vrck9VdXpkVURra0ZVRkwxUCszeVc1N0tzQ2FMaVFQQW5JdnVENi9CVm40elVyRFdSSDJJbEM3YXdSUlJBQ2M1Y21rL3lienRkZm84aWVpTXdYWUhHZC9ZSlpBZEJ4dWlJNnhlTWxjTzhhYWJEb2FwWFFIc3Rsc3VlY1FyV1o3c3IvT2JRMEJ3OG5keTlya0d1VlIxWXlxR1J0MGk0Q2RZZ2xMdzNwalhEWDZLUXpKUCtwcUJwemhNK09MdTBaOEMvR0xpQzZkSWJ1MDZnQlhIcFlueFVZbnFMd2liR25rVkJ1L2puVWFNckNtd0c1RmlDM2t0UHJOTXRSOVZmWXpkV01IYktoMDhQUjRYYUhCRG9Qd0N0eUsxQ1cxQkR3YVZjTlpYTmo5Y0VhTGhXbVZ6WVFmZ245TVNSWGRNVHY1YUErcEQwUGF4cGkzQkZuKzAwQUpOZ2hKYXI5QUJwd3J1MC9HeG9JWjRMVW1oWWJzZUNWOUdwL1FIKzV5c25NTHNFeEFWYjM4aUF0T2NjcU5td09yOTFCblFET3NJdFZqSmhyYkZLSjcrRm56Q2h1NGlKOEtNeks0TlliRGJMaVBpMG8rc2dpdzlMNzNYM0RCSVN3MGNqaXRuRWNCdDlEdjZZcFVmNkRvQThtangxU05MTDN6d2pBbitJTVhQWFFqRTkrcVFLNkpyUEJpTk1qNnZXYUdjakNGRzJMV09XdFFrZDR2dkhoNUhpZVVqVGtxZ2FlS1J5eDhURzNtd3pSMnN2ZytMK0pVaUFXRVJyTWFlOGJ3dmtkYzd3RFdBS3VZNFBRRkNaVmhSOTNGOUtjQzc2RkVZaWZyN1F6YW4rMk0vT1Q1dEVpLzFPZE82cUxKVGhMNmh2YWt0eGNJTk16OTYwdFdjZGdxNGZRK3hmQmdxOHJDRjFBY0ZZSDZCbFowWjlpK0J0K3ROQktFWWhnb1ZQV1ZuajFLaWJCZHdmZkkydjBuRGRmaFg3dW45SXFyUG5ueDE0MzZneWQ3UHE2QU5VWHoxL0NybFdrNmdOeHB4ckZZMzJPT25VSk5UMDJOSWRFVmpHbmNtbFlvYzE2bE9oczZKdkVvT3RlQVNYaVNmQkgvUWxMZExITUF4eWdNcHp6SndPKzkvS1hHSXp3TGdGSThTdlhBZXF5Rk5kZ2VxWmhnZmFiL3cxbDVwRERMY1E5dkFlUEZOeG9YRDNNU2ZWUy9IWURQa2JFV1VNTmsxTjZWOXVnc3kya3MwNjRxcS8zaFAxSzVnYkZyR25rM25RT3R4Qnc3MWtsTWhJcmNXdXdHbWwyVElUdWJpNDBFVERWNDBiRDZsVWpYTjJLU0k3Y2ZNS0hNWEtYWUtWT2dJZU1SYVRHTHg5RHM4cXQ0dVhucVNwYy9RS204cUY1VjF1TDFNNFBBWjZvVW42TVdKTUpZUEhPaUdieWtJbnptY2dLUkUrSWp0OWJ3cHpmQnh6MkdGVzF6RW4zM3NFT3BQV1RCNHdadm9kT0pwYStmekxoR01aYUZJNTNZR2hweGpTajZIMDZ2cExCbHU3U2ErSVp5U2NuYU1RWHF4bENrdUxYODdIbldnd3RkTDF4R3d3RG9BRE9NRUFPZU5oc0VlTzFFaCttcUVMVVNDbUdMWkFOUjJwNCswdTM4bUszaTNwTmVLVzhlMUdqbUhDMmpOODU1cElXQ2FIcGo0N1JBWjV0SUgzZ3NrUTJ2VmlCeTdYampMRmRKU1N1VEFmVG51aXJ2RnJrNWpWVXA5RUl4RjZrNXo0TWdwWEZYY0NxY0Rubm9IdHpnckRBS0pTeGoyMVppSFVxRHBWTmV5eFAwNFUwRUV5VFV1Ym5IR3hGejVsUndCL0JzeVpDMTN0eSs4MW9HYlBtNlc4c0RUVG91azBUUG9yTWVqYTZDaUVLNUlCaDllUEpvbzVLY2tua2p3ZUI1dStOa3pja1A2cHczWXI4eC9xc0QzQTNicXYxa05qSkdGeVJOL0JwWmNtK0VOclZyZEIrb21hYjdKZndmOXpBUFhWRTZ0UnIrSUhrcmRCUXVienlab3dzVTR3ZGFlTnpDb05BYzBvQ092bEdUOEN3UzNoaU9rNkJNekVMVUk0bFNIanE5VEhQSDB6WERHdmdJdGlrdXo5WHQyR3FxVWtoelNRQ1JOaitGREllbVlOYnZDcklJSW5KYWVoQktSWXcrdFQ4WiswejhJNjhCNHdXMnNvb0VSVTNYWlVndFJBa0pUS2tHb2NKUytuOENYVFVFNng4WFdmVGZLS1R1NEFwTHRtM2N6cDNZdlVZRGc4VjAxWHhiUTRxNzZudFRiR2VoSEIzcnZEdzYxcXVzVVV2T1dIbmZ3Wkl3aUtaQkpxb05jdXdSY29LTG5rTmxGcXhCYkJtdGZtbVpVcjdvZW8vM2RuZDZNd1hIUWswYkdhN0FjUEJrR1lnbkhQMlVaWkd6QVh5eE1uMS9FeTMzbjEyTGlXbVg0SXRWMU0yU1Y0QlRERkpieCs1eG5mN0VvdFpoWW80U1hTNFJHN00wemFsbzh0QzFMMTVEenFheCtxOGtoQWQwQk1ldnZhUWIxQStTWXE3ZXREZ0R6bXgyekdOVHJGMzVkVy9kNVFsTGZnV3kwQmZwMnppdVp5OVJ4dnRBamhMSkFKUEZOWXQ2ZVBZRmVvbEpiUW1pdWpCZmNRUDdLSHNZWHFFdVBRU00vU2I0UEJBRUh4Z0xlaXE1SE50T3RFNCs4dFdaSFJ5aFFtbEFrb2ErQkxKbW9FSFZRSUc4TGF2ZC92NVEvQWViVktrZFo5WnpGb21tbXoxMVNaY3VVc2FPakxDVEhwTWp4NytRazVMZitkeUVkN2tNOGprclJ0SjZkdDBvL3ZrQ2hCNm9EclZTeUNWdk9vaDZJeDRLVEphbUM4K3BuaUtSdzZab0prWWNhZlFmdndlaTA5UHJ3YWlBSGRLeUQ0czdGY1RTdjh2MWFlQjRMc3VJRXo4RnpBaEZLRC9FbzZBOTZSTFowRHgwbmF5ME5Lam5pSVVtUEpGaFhFVE1yaGtPaFVDZGFsMWkzRnM2dDhQcy9lcVhNN3Z1V01zYlowM2s2Ny9tVzhZR0czTmZ3ekxLMHB5UVR3SUdiV1VwU2FYQWh2UDdEa1JueE5JVDVTSUhSNCtvOVVsNkxPV2tiUDJXVlJGcDZ2L0pvZmttU0hiN2F2ZjJJSWNzMTIvQjl4Ym0rd3FOUFlubEorWURJT2JVbXo3NjluaWtYMVorSThSSVdiYXRoMnhVTGg3aHp5YmJnNzRJTDQvbGdNVmxQVUdCcW1UMmExS2JpVjM3dk1BN1R6SXNYZ2NDVVJaSThlazhHbXpCYTgyRDVTVmRZeEI5dDNmT0I5bld2MGo0bGE4YjhORXQxdFhCM3Z1R2hQaVgzWGFsU3BpcEh6YUs5ZUtEUFFxc0o5Q3FoMmhtS1k3QmprVTVScG94cHpQZHNCbU5ab243bVZPWkJhN2srVzRwaUhQUjUyTFJKME0rOTdoMGkza2xnZnVjZWRvOXNicUFabzB4Qmh6bFZlR1QrenlCRkhLTk5PZXJFVzlEYUczbmdLdFNvdTJGKzJZa0xNNWloZ2tyUTJPc3BZa0tZNUdnb1BVZGtwdFkxMGVhMjZyVlR0Z1pZYUJFYVRDZDZneDNQclFGOTd3TG5tWFRCWGxGL2pTVWlwWkt2NU9CWTdNLzZsUXJyVURKTWh5QmtlcytYend4bGJLbDIrVktpZDZLZUo4Rm8yUlFlUVlUbkRkc0JWRVY1RmdKRjlrZWtaS1k2djZ0bjg4UTNiektjOHp2MUlwOXpzSnZMN2FPdXViNER2dU1uSXpNM2NjNFlhV0MrNzlPdUdTdS9NNzRYTXowM1laOTdiT3BsYWZXQ1V6cXBEWXlxV0s1ei8zYW5NcHhlNWc0NWlCbWhYWFkvUkJKV3ExaHpwL2dGdDYxSW9neUhLeUhWWlJqekZhZjgxQ09wZlp3bmtvdktFRE91MzlRSGhXOVoveVF5SHlTY1JRYUpkbHZZcUFsNXRUdXRYSGZZK1QwcnlCWUZBdU9rMGNobFhEVHBFZ0ZjbDlCUFdaUFBleGNxdHlKSW9ybHhhT0Y5a1FQanJDU08xODU2eVJ5Y0NETzhSTGl2a0dVQjRZYVBCZ2Q4R1ZyL0RoUXZxcjZtTDBYODNKODZldjdDUHkzS2hnR2JjQlV3VDczald3Wk1qalE0MmZpcWM3QXFON0NETDRzMU4zUHhzRDNyUklQbVdvUFdqODFtQlJHYmtlekRrNS9aUzk2bGpvbm9MN1E3WFF5OHY5d1VsSWkyaGhNNW5jVElJN1NMQTRmZ0IrMlNmWDlsdkI2cXdvY0JxMGx2OTZITFJhWERIN1IxYzYvOW1RdU84K0FIYU9rWk9QcHRtbC8zZGMyOThTSHNhSVBFd1dYRTVOU202K29TajdwYzF1eVRXRVhsZGlqYVZsSTA2dys0cWVnbmJybE9iOFZyMm5Cdkl1RXU0djYwbEZ3bUd2YzQ1WHlycHNuV2xGL1JrcWdaK05rMGZGZE42RHp3Qk1uM1h1S294ejROWFJhamwxbHhSNHpuVkd3MU1WdkxGa01XU0FIL2FWWFN5dmZ4VEw2YjJTR0pvc2JrUHRsdzhOVWpzdXJVNEFraXErWGNxaHJoOXY0STR4emh6RG1KWkVxN1NhWUJ5NmlIeFNBYmZXZ2FkRmtXS3ZIWG5ZaGxzMmFxTEZMVkRNNWRyTWZsM093MW5NYjFGN2VqTmdTY2pxdFNTZVExSlk3cDJoMlR3YXFBNmEvMEVIckIvUGxkZ1ZZZ2ZIeTFpNldYMUVSV080RmpFOVFLcUpVeG8ydHFXekZoT01MNnh2OVpFOVFFaUU0dURWUVdrWi9KcVVnRWsva0YwV3hLTExVUkFWOFcxekJXSTd2VlYvdThzd0J0UU8rZENTejhObytQVXNERklhTFlrSEhQd3A4TlZxd25DQTFPcWxaYTR5Y1ZwbkF1MXNUV2lMNWxNNnZiM3VkQmVqaHQ3SGkwZ0I2UGhqdDJyb2huYUdYcWRpQndmK2dCMW5PeU1rRStSbWZhYzY4T2lGemdyeG5DZ09SUVpCRkVIdFN6d0VVWW5lMDJyZ2wweCt3VndaZUcvRGE0WC9SZWJBSzBCU21jOG1ZWUxIN2lUYzAxWjh2ZjQvRFc5MUs4c3EzTkNlNG9SSHVuUHZJcUwwSGE5NllrNVkrS3VhT1hMek5GLzNJcXFsTWFxSG9MOWh1Y2R6Q2JDZC9lUnJFZDhycGZ6S0N3cml4dytKd3FndzJKNURoK1MvNVBzU0RHekl1WkZBbURSbW00S2ZjVXVxQTlpUVF0M2dxZ2pwTFd3OGRxS0xOTjZoR244cmN6N2NHTndrd2U3UmdYUmtKQWhZWHI4ZVlkSnJsSVpLWExFWTVXMGMzc0E2ekpxWENrbW5GcTAyVk1yRVkzZVhkcFdHLzJVQndtVUVYNlh5SjVtWnVOM0lmZ0o1eEZRN2FneXBmYkRDNHhrUlpqK1ROS3N3Z29LSURsN1l1NFE2VWc5aGVBS1NiclZLMzU4QXlKTnloZDlGN2M3YTBKL1RzRnNobXdoai9hekkrV3FXM1FmeG5Gd3BQWjg1clVPM1JpeXBkNjl4RDdHbHhrUVVzdWRLZ3MrQkExVmtxYlY4WW5NbkJnUkRtT2w3eWN4U1dSTWdvT28wYmV3RG1pM1ZMaS8xZG14TkxURnB1cTF2ZHNvRys5aHhSUTdvQVk4bDlkaktYN2VsRjZHdGRZSUdya2tvUGlaRkpPTFlRb29EaEk3dk1PTllyT2tIOWZqd0VXY1RKaWg4QjJqUVk5YXFIRm4vNWx5aVpPektNaFZaWFFtZ1U2VFV2bzVWa1Zac2NzMTlLcmEwR1JhalVkVlgxOCtOZjlpVVZqNXpxUmFENjhKZW5ESndMb1l3MHVtRXBRdTd1NWppV2x2enFZZ0F6WWx3elhXZXZONUIxZEJEUDZkY0NGeWRlUGNvNjdxYmhqTU9NdDdrSWdlZlIxMVROZHFNaFJyT3dXYkZISGZEVVNXNmE2KytZamdMWjlGWGVBMzZTWFNPaGhoNjcycGg0VWFNQzZXZlpJcHRHTkxzR1F6Z0dDVXp5N3JZSXU1T2JqcjMrcUhQTHFxTGsxb0hHZFJZbVdMdjF2RmNpTXY5Tnc0VjdIZHJwaitRK1QvaEpvd1VLTXFHK2U3c3JSOXRRMXZ1QThPUm9GZ3BrV0I4N0J0NHlxVmh5NU9GQ2gyNXlGRFVxZVVnY01XaE1BYXZVcWFuRWFNdW83VjNwUnY5L0pPNjBMS3U3M05LUllEZ3E5Qm1iTkh1dEZqRUtiNDVBdmV2Z1FTazNHUXpIdUVWSW1rZEt3Uk0yMFhuc1dKQVgrdzNtakN6RVk5eHl1NTlzVHNWc00zMTZoVU40ZE5FNVNUWjF1d21neFVWazI5TkFQZzc5Z1FrWXVSSGt1M3hJWGFBVTZSVDROYnFIYy9rQ3BGTjhYQk9YazAzdkc3S2plZ2ozYnNTb2RZZTVMbHZPem42d2phSFBYdmNaNFNxaW5rcGN6dHV0a1lHSnlESmpKZVZDYUcrZzhRZWkrb0MzTWt6cm5VU1R2RTBzcGtlQVlnbnI4UkJLdDIvaDh5a2dQODFiOHY2Nko3elFPRzFIUHFkVHJjaHJTNEtlakhjYVVFMzBFQWt5eTVlSkMvMGp6N0Vkc1pseHJNSWhDNURDSE95MmRrdHRGakNIaEJ6cytqNmhDRFlhMnNWVjBUMFhFUEw3K1JWRjJDOVFEalFLZElBV1J2bjRhcjNYQUNuU1JZYVkzL0Urd3duTHNKWlo4ZENWaTBUOFVZdEpvTTBDK0pvVld0TmljdVNJWEZOeWxoREVYY05oSC9MOFJBOWN4TXBRa2lzbHIwT3ZEWVMrQmlYMWRXM21TcjVHNjhTN25aa05MR1Y5RElWNHhYZ0lkMFFybUxRLzJxeWhtVXFlQkZOek9TK0VWR0lOeVFzU3lYVmUvSWd3L016NFdvTkdxS0IrQ3FyOTA0UWRROU0yVHZDVVBmaFRQTmF0bHczVkFGWnBjcU0xaVJkTDJRMXkvSlRDMTJOUlpkVE9ncWsvTG9aUUljaldZT1RzQTltdG1udGlqQ3dld3NTUFJzVWJuUzVYdUJpT1FSeGZaQWdXY0ZnQ0VLWit0Y2dnK1B4NXpkMlFra3ZxWnVobmZjRHVHSWFqdEN3RlVscHY1cDJjUmtKQXRMUGtTR09VWnl4OG1BU2I5YnREdDExMFF0WStFMXJNZzFMeVpya2g1YWdzMjNFVWVHU0ZSd1huK3dpTHFxcTU3aHk3NUtsMVhQS0hMNWprU0s1S2JBbTIvSWloSnd0dW5lSVZ5TkxDRE1MQzArM2tmZi9LSlVNcTV1eFFjdXIzbC91eWJuOGwveVc5YXB0OHk4WjJRcTBNVlBPMW40NW5BTk4wL0RjUDBUQm5UdFhjVEJxQlUwTGIwOWQ1WngzR3A4MmdmbW5tWHpwRVpQRWdNZDJTcEY2WFlsNXp2S0pGNU5qVi9XbTBjY1JCellaMWtDdjRVSjZpeW93dDA5UG13RnhKcG45QS82aWdiaTJzcDNYQ2dCajJ2aTVEeU51YnhIMk1Yb0VkU2JQN2xKSmxFNlBUd3F2VnBrT3d3c1c3a1VnVUtYVUx4NjJISFE3N0RxOXJmOFlzN0FUSnNVcWZZYXFRam9xaU5BdlhCSnJ1ekx6S0RTbU9wanV3aDVDQjZOWU1FenJiUkFWZTl0cksvSXdlOTJ6MmgzQXhsSFJRWVZ2RTRJT2cvbVBDaEMzNDVnTDVsb2JmaVpiVmxraFozcDdVMnZJaFpKMm9NRGJxbzBzT1U2cjI4bjNkdFZ3ZTlUZEFrZ1VISWNuNEFZejEwdXZZZGh4NGZZVS90UmpmNjc3NzVDZ0t2dDdwVnE5aGl0cXFKYmc4NEUzdWJBemd2OTVXZHUydUd3eEJRT3RpLzdaVTVqajlZNHlldnVWWitKWWRGUWYzZHREdlNSam5kYjduSUt4NlU2K1FacGZFU1QyUWhOVXhPakIrekYvSENLeS93dVFLNTgvdHRsbjVGNmVsSGRGU3p1clNWL2VqWUxZNWFjenJZNkc0cXVnT3dTOWlTVHFab0M3WFhVUTFtWWQrT2d0bmdaTmtGQUsxNUhYR1oyckJNNTBHdy8ySkN4dUt6cTdNK0FCNFdaM0plQy9vMy9SWlNsUzZOQU9VektQVmhkQmhJMjgwS09Xb0VpNU83dUZWb04vSEJhVk02dlNWQTgyTDJPWmpNOTdTZC9RVllIUmFMRkVkUnZkU005dEV2MS8rRWtMRnA5UjRKU1Uvb1d1SVF3YUFlRytGelMyd0N3dU9vSVZKamFhUU1aUGtuWmFGVDBoYWVVSWgxS3B1WXZ5YjVUaE92YWpSWG5pS2dRS2cxWXRHcE4vQWVRSGo5UTc3NXdFd2NDR0ZrUkFMT1Nta2hnMjBtV0JLZTZjZUJHRFh0TmlaakE5NmZ3WVkxQ3k5WEJGOXRoMHdoQldzaGNiYUZaY0xsdmlGZjA4Mkx1TVVud0hxZHdJUGtBS2NkWVdYdEpzMjFmQWFKOTBjaWgvQ3JwaXpUdkMxQlZJWkdKbzNDWjY4UEpTSWpIL1FrWW4vUklIYzhkL3NTMVNvbzVKVCtkb3ZqdXV1ZzFiSWpKTzh0N1lidUVBanowVFl1V1FZelRPV2VhZmZJSHYxc1JySGNBSENWYkQ1bjl5a0dGTHEyZnFCQ3RIckl0cHBmaGUzNFVrLy9BRFZ0Y0ZTSU1jMlh4amQzUnVCTzdTc0xTYnpZeXFwOEFNTzc5RFZZWnlEOHZhQ0tOdEYwcWZYdGhyNWp4NFZ1aEt1VGI0YlhKNUR3K3BCajBmV2l6ejlvUlhZYnp5bjc2VElaaEtBSmFtOGVsWE5qWnY5UU5hMXdydlM1cWZZQXZjQ3pEbEdMZFp0ODhrZXRiUnlWcmxpRWJoU1BvNGZDUkNmNUxONGQ2Y09vZGM2a3Q1L3JORElZV0Q4eE5FQnhOQ2wzbU9hZ3FKYU1TY3lrOXIyTTN1ZWdHRjJwU3htSWRtcEtYb0NZdE81NjdBc3ViTkEvYS80dklzQWJOSFIvRWxwTDUxMFJDbVp6N0RaV3ZhWnZTYUpreGdjRXcyb2tIcWV5NU9Xanh3RG0yd1cxNW80NGFpeTJEaUpUbjJETmpkdUx6Q3lHNHI0bXF0SXAwZ1E2L2lrYndMVnVMUHlzTzFUYjYxekRyNTlnQUovK2R0am9oMFhsUDNtQkNvZHAycGlJWTVpWUQzWEZLV3Q3T0YvS3VnYWVhdDAzYTltYlg3TitNZjRxZEV2Rlg3Tlg3UkpMcWp5SFltWHA5cll3Y1dkdUVLQyt2M3prS1pnWGFqVkFqZXVEenFMSTNFOHdSMmZIczByZ01ydkkxUWR3M0dvWjRlN0l4SUZxdWVGSDFSTWVuMStEYlpsZzgyR3puWnMwL21zZnVQYm9KSVRJZUhnbWduUkZOOStWdjFRRUdRdURhbEpab0xXWlFMVytlbTBvNXdWN0Z1N0g3a0ladktmVUxkeXVvUDh3RktEejE2QnZOWkEvZG9oa2xXNHBRRlFHRlhSTkJXWUZtb0NyVGNKS3lkUkYwYVVPSWRVelBuUS9HanlEbEZ3cGNvOTc5TEdYdWU3NTBENWxhaDl6OTU3K04rcVdlZjgzUGRhSGZ1aTFZTXg2OXN6N2J4bFdDVmc3VjU1SVovbUdrV0hkWmhsNU9MMmZBVHRLMGpaamZyQVNKTUlKb1ZBdTlVeWJQZWtmNXg4ZXdrMW93azVXVGJhbkR2V044Q1FnVnFFRjZXblZ2dURMaThEazIwdkhCeXFGQ0VZeHNpZHo2Uk9EKzBPdVFVaDJHbjNNbWoreGhuZTcydGpFU1FvNitzcGFhTitydTRQWkp6V09WbG5wNXRYSnM4dmpzVUdETzFaL1lUZzkvcTFLaDlaSkphUEM2REdEbE9rbEo3RjdGWUhDOWpUTFpMSGthMUtRTms5TmpxZlBablZOUG56cDlyYkM5TTFFNEFzTW9CYldEWGw0bS9aN095bmFkWW9HWTNibGVpNFpWWm56RWZVcThEMWY5TUpZRVRtV3AxWFp1YmZjTFV0L2Y0VUh6dDMrMFFOaVFSTnk1Vmw1bEVoQXpZVWJBSGkzMFZXOER2S3g3dlU1ejJmRTBKSU9UdjZlZXJHek1vK3Z6WnFaUjlXMG5jbytEMmJ2RWxoMVVSbmt3cjVMbFp3T0JqMUQ3RncvRlRwNFFyR0ErdHFMYmcwY0JVeHlPSS9tYWQ0ZkpqT0R4Ni8xV3hVR1JZQUtYcENBSFlDZTBvaEFWREIrQm11QlRoSEF6eFdqZ3JGS1pCb1l3Yk9udUkzY1BrMXZ1RHRYQlVZV3BjMmFtMmwyVEVvcTlva0lXekMyM1NZZzA4YkN5ZG5iZ0NWcWMrdTVPTU1NTjZWVGJiYkFRNnBIclpJMExCeVNpNmFrVmVCUUE0NFZpSXpFOFFwNzk2OUlDR1hUdUs4SmNPN2F2RGlCMmJtRGFJa2tvRWJUbk9vOEYwcUN5dlZ4bUN3UGxpR2Z1WHlqYjUrM0VXY0xJWDZiR1RodjRKZ0lMSHhOVmEzQWozTDVLY0FYcWpubHVVSDBhZlprbXJPbHlyN3NWTktINWxFUkNjVmFWSERRQXFyQVRuUjBmR1dRTDRsSk9scWJMc0lTY2hoK3liNEFlclVvT08zYnYxR213eHIxc01qTFdzVWtNNXdLTklZRE4yUVdBcDRlT05SZUhqMzhuL1VvZEF5V0hjR0JnQms5WkdJdkd0VmlRN0tHZ0Z1ZWFVWW5MT2JsMFZUbEt5NUM5OVRZNlM0VFI3U2NCdkpxYmhRdW1EQXQwRGRZRUJKY1RpUnpGTXlLQ1hEeHgwTEgyRnFpRE1uSk9VT3NmeDZqWG9iUWhSZFZPLzR5aWx1MWx2c1ducEUvdnpNWXRmcS90RVFlR1Rsb2w0b1puVnJQQ2VROVdiUXVoOHZTeDB6L1FJdktJakVuMElNYmhWcDlldDFWd2h0amNmZ0NxOGs2RzNmY2JVMzhmalpFS09hNlRUam82dXNpc3RCUktJRHkxODg4Um1ld3VMNTJWZUQxSWFjRWIzbnJmSGloYjJJYlpITHNjamZ4Zjl4UVg1LzlZY3llRFA3Q0dQTWlCemViN2FwV3hYUnJsbWNNQjdmcWUxY3lUTTRaSmJYeXlmRVNkcm5zUjM1cXM0aGtoZGJUZk9KM2s1bm93cDF3VFEyZUxobDFWNUdGK1BUVHN4K0ZJUWo2NlJ4UVV3TXJ0VzcvY1VNcEwxVm5zUDJ5SXhiWkR1ejAyc1VNQjRBYlBkZHR4NnlLL3pYR1ZPeE5iVDZsS3BFaHFacSt3Y2hvaU1ZbDBGZDFFSUZhVm0zTmdXUURQRVh5clA0ZWQ1dzRqMy82OUtGYjEvQTh1YnhHci8wVzdEZzRjMjN5MkozSXIrOVVmeithRU5SUit3NGkwTnNzMy9rZGtHOUFBZkJxMW1GcnBBUjlsL1pQQmk3VWhxYlBkUEJNODE1WmYvaDNZUWlrdE81US8yRWw1Q3ViSkorMjZhSzltblhFMEJydlNHcEtwVW1pNWhEN0R5YXRwbnphZ09uc0orbXBSMUN4L29SZnpyNTJvbUFZN05MT1U5ZGlVTTN2T2FUb1lQVWp1UjJxb0Ezd1c4ZkRSVjVndTdtNUtrd2phUEJ3OUJvejY4TlpwZ213TzkyQk5GcGR0em82YkZJSlR0cWt2SkczblBHV2NEMklMQ2dCeDllYmkyemJGcUhJR3RWK1RqUEwydDZpLzNBSWJ4Y2Q3b2g1aW1vNjA5eVBRMTczK2g5dzJ3Q3poYll3R3ZqVDJwQTBSVzRrQXk1TmVHeTFZNllnNHgrMjdndU9oNXMzM2poMHBwcHBtYVowRXhvYSsyNWM5S3JZc29oaTYzSHdmVFhaNHVaMG1BazRqOHhJQ1RJeVcyR09QMXNrVzlWSU0wdkZoK3pmSVV3QmtONVdOQjh3dlozczJOZHFpb2VZbFlNc05keXYyaHQ4ZVZUZHhJZWFzYTM4ejlpOFhHZW1vTjloSXR1WTU0WU5BQW51R3B3T3VyLzBHeXBlUm9VcDlKVHNJNXpEaTQvaHZYenlkaUpRYjRxMlRmWW5ZWUI0YWFrZFVqZ1EwQjhtVFN6eVh5UEo5UEl6MENSOFBjZjF3V3ZmeEMxM2NNQU5sU0lUU0s3TzFOMHNHbUNqUWJseWRpVVVqZmZuNzlRZDBnQXdJZ0dQUkFLaFJURG5zOXQ4ZVVBa2hPWXpLQXhaSkYxSTF6TXFFRUJyZEhKZEhlUm5uQWVCODRha2RsTTU3K0NFU3ZDczB0aVlKL0FSdmZGdUJwc3UyZEJyTTBabXhvaS9RU1BjbThxVy9YT3RsVFYyUjFxV3MwVkZROU5aOEdtMy9Yc2ViK2YyZkF5ZTZNeDFVTzIxTEdRWFhLMWYxZFpFUTlCcnUrcDMrb0tPUzMvemFhZjE2U28yd0hNczdOeVI0UUhJYVVFdVhXN2EyM0c4Y3RZdjJRL0prb2sxdFNZK2NVbDgrT29ZZkg2WDNmNmFQb2NJcGw3VHE5MWFnd1o5T0RORkV2WU5sWTJGU2tzTW8yb1oxNnNPSXQ5aDNaRUorQ3o4dXJmWi9lQUlkQ2RLUnl6M1BxWXk0d3UreXR3QU1qWk9wRndMSklwR3FEcTRvQTVhYUVsWmVhclVhRVprVnZGa3VzK1lxYnB4L0lJajBIelRRM1owaWZlcXRCeDE3Z0pSbEtsbTZKWU85YlJ3NUdPTG5ISkY1VkQybFpPZFRGOHplM3d2L01wRXdpb1BrczNtcUo1ZnRuaCt2aktVWXlOSVIyaGdHdFBHV1JkaUxMRzFTbUJJUjZFbkZxMGVBU1FPeUhXbmp4YjFoRWowS05HUTcreWNnK3Y4VkxZdUpCU2Rsc1JsN25wcW1HcEd4SmRQVjFzZ2pYb0pIOEUyakU0NlFqTVNwL2l4ZklEN3NtZGhPRjVQUUNnTDdJdnREZmN0RUtqalY4UzlPV0U2VXVnMWE2aXlOTnZvbENFYWtOL1pBWHVNWUR0eDlDSWJDNkJtbmwzUVd1VDd6ZUJabDVKa1dGS1NhNDg1d082elpMN2hBRDYrc2lPYTAvWjNqMldiZ2dETjFsT3lRQjkvZVVsRmFvcEpvYXNudXBUdE1QOGdKUWNOZENWVXliMVJxbUpSRE1sM0lHZE0xdk1sam42eU5mODJ4cWhzdHRFQUhGSE5XNk1Eci9CYTllbDFOZDE2WXVQU3FDcXhjMWdyUGp4SUxLdTVxMkM4TWJRdzF2cFd1eDBFMlJiNThLOGVYVGxUUjEyaVJPNkI1cUFLTDlvUVRsQXE0UksyVXFpRmtGU1V0azhlUGovZVpYczF5ZkxSbUpzMUl0akZRbnAvQ2NzQzRVY0I5NGg5MVBIeFdXTEVCbHFZNXkyZ0N1YzFDK1dDQ0M2ZDc0RXFEUzc3TDlpdnRDc0hRY1JENVI1bVlJTWhXWTdqS3dUS3FFTTh5UXJseGo0VFhSODVCN1Z5REpRTm9DdkFNQ3BaTW9jUzZOODV5c3Q1OEdtS2N0ZG5qOUhlSTRHOFZvTm1oZXEzc3U1aTluRFd6VTVnVkhmdjlScjFIQWVVUU9sTGgxYzljOUh1c2pDaUtUcS9aUkNkd2V0K0VHWFl1eVJMYmdsYWxmUEQ1aVpTc1dCbE81WFJvNXZabGpWdHNOdGsva01pem1hRHAwa3ZReEwyN3BFcHNjTUY0RERoRFk3cmtZSTRVMk0vMmZFTjlCdmZxY1ZZZlc5aWR6cDZ3NzI4RkFWYXVLTHM0VGV1NWdLNExLbjE1Sk51OTlRN2pMWE9rT3hKdS9uc0ZEei9Nd2NpYUJhb3FHK3l0bnVPbUxDRFlwNFdYRTc1Z2FHQTkwZzBBQjRtNGh6OEJDeGU3NjljblR4bTkzVlkxWWZaSVFNeGJiZElCeXp2ay9mSVE1QThuenl0aEpka2ZINXNMM01GRnVUUUlzMjlObkdreVFHei9IVDh4NXR0WFBnRDJmbFVXR2IyaXVxaC8zajBydjVrTkpxRVJVZXArMmZUTWVScTZGMWFWSmgyZ2c5d2xTYmhhUUNXVGVvQmhVRFhQeVVtTmVmTTVQQk1sMXAwUFFWL3JEcEpxeThnNWEyaDJvb0xBaW9iN1V4OEpKU25nTTlibE9uWW41cTRjQ09OZTM2a2tUTklZSGNjaWdVdnplVTU3TXcrMHprM2R1QmFNRzBMZzMxM2UweE4wVFVoN2NaamM5TnhkemgwRm9uWUF5UUgva2YrNWNGY1I0SGdGd0Z1azVYQm5mNVVKRHI2dW1STVF2NVZvUnVDNHJ5SVYyay9xdkRHbkVrc2NVLzFudUE5aWdpZEJWSDZWZkhzMXJmN0h5TTFPc1NYSzZIemNLQlNPK3NWSHU4R1UvSEJnaStLTmp4L0I2UkxtdWZZTExvcHB3d05kT25TZGh5MmpONDhIcjFLd3hla2N3Z0wxUzB6RzRIS25tMGFadHBEKzVXQi9QTzIvVnUvNk90SzcwclkySCtUTElXV1BreTF4MVdGOVN5T1lzeWJ4a2FBeFNiZFZLcEZrQ3UwYWtIUllYR1pHQTJHSTNyamp4cEdCc0tWVEw4Zmt1ZWVkWjBHWTVyaFp3VXVhYWU3MHhDQ3FmN1k3YWxFSFhEeSs0Qnp1R2hTbHR6eGFpZFBXUnd3VjJNM3hxMWtKWlRmWFZEbHJnZkQ1eERhZSsrZmNiL0F0YVdHdURhT1pIR3JnQy93Y0tlUHJLSUZPeE9rSmhyVXN1aEVWNEpNK082RHkzc1dFcFdhRWdieS9IK2lsQzdtbmdtakxpd2JhZ1I0Y2tIYzltWFN6a21rajJVcm1jMUxuU01zTkNOem9aYTdHVEQyRC85SmJNMVdmQ0VXcTZrdDZTaGhwcmhpZnovTHhZcHE1VWRBa3I4cnRNZnlRWVFrcVF2MTlBZmJMdUliY3hna0lweHU4aG02ZC90T2RDSFpmb3pRRU14d0kyczkrS2VIS29rNEJoaHdMa0VwdU5uUGQwNmdiMUc5RjVuVUo5MStuYnRkczVVbENEQjF0RWU0TGU1VmpqTXdIS05waHQ1UHlEQ1VqNnB6YTY5ZzRKcjBBaURwanFkR3NpbFNiOE1FMll2bGdNZEwwV1BPZGcybGlVZTQ2YWQzR3BYVEIxTFVmQnYxU0llMklOOVNLQ1I3MTZVMzN1T3NPNDE0bGxVVGViK0xKQUthSUVFNUcxc2RPN0tJeHRIUEZUZ0VBL1BvUnAzSjRZUHRQSWhQaUpqOG1SVHB1a2czb2JSQ1gzbnFyRlo3bTBBcFhSTmZhZjY0ZVhQb29KblZCemlrYVVlMkttM1FWYVVmd0NMczVYWDl2Uk9yZVQrQ2hBTm9lQ1NnM0haaFN4TUFZTmVraFl5UGhlWW03c3J2NTlxR0Q2NVdoV25yZXpQb0VvUUQ4WnAzZ1U0UExEcGJ2MHVHek5aZDl4ZFB4VVYvbEc1Q05YYXN2MExZYUhFZTQvajI1c0YxS29oQVFHeTllTjBORTUvMXFmWW5ZeHRCVVRPcmMrMHNQcml3VzZiNnY1dFpSK3R2V3phTTJPQ0tvMkF5TnZ4bkNneGMxWUFvTlFRRDZrTUFuSG03Vm9qb3dTeEw1b0hzVXY1QURVbjRtOE1ZS3lsZzAwRlRWdHlGbFV5VFF1dmRXWk9VNHhiVyttWHdVRTVQTzRXYld2SHFaRFNZazI1Tm40eDhqYy9mOS9KbE52cjJkUzdiVlpTOFlvQXZYcjVWTmZSTXFDSUU4ZFRIc3RaVjBxQUYrdEZUUUZ4VjFGQjhuWTRNK3BubkR4MUZqNGZQSGl3M3cvR3VmanRDQ0x3THZqZ1podVVKeGpsT0tOR1pRVGl3ZVFqNDBuM0JHSUdTdHp6TFhUdUpQQWpJdTJQMmRBblFrRUYrL1U1OTA2QldqeWVHTHJYVG9WSzVVSjlEUU0wUnBqdVVjZEdSZ2F5TDl0Yjdza3hoWFJjekpXYUFyNTVNZEE4clQwSUh5R0lLWmhJTXg4NTd3SHc3aG1xdy92eTM1VTVLek9IZFk0SWozdVFtSnhQcFpyYi9TdEhoUkQyYSt0b0ZZUnJpSExJMzF1bmpwN3R5TjBMSzdDK2h3VVg0KzBTMHZyR2szTTRVQU9SajVLU050OWtRUnNPWEhlUUJHVTd6Nng3UWdUTUFEYWMwY0tHVnpuR2pFQ0ZWSEVGNzNJUWNQZktHempiak81U1FuUlpMRm1KWlNjQVRpUjZYRnBZWHRSb3UwVzBJVEVaRXFzTi9yTm5sM1QrcWpiR1I2MGttdlhHaGdjMEFMRW1hTThGMXh2VXJQd2xjVk5xZ0djWWZXbktnUUhuTjBwdUlzZS8rQnhVemVlQlhmcWJrUGpMYytYenVpNjYzMEQyMlZMaE9EM21YY0NJdTMwcmdBVG5LSlo0bXZ6MHZvT1FtWjFGTWJUOCsvMFowWnV6UTUwU3JNUW45Znc1T1lIai9EQU0zRFIvd2wzOEZNcXkxY2FGc1hwdm14cTVsUnZRU0ZSWno3U1NpMG1TSUZCb294VEVaV2tWZ2k0dlRIQnBpY3B1WWF0U0tYYTZTckJCbTBacXkvTCs4R01GQkhlZTJadGNiZGl1WmxEYXRQTW4wM0J3UzhyQ1hXb3Vqem5tNUZWQUpuOW5DM2ZqdU1jYWNMZDE3NVlvaDVkM3c0SXFkU0lhQnVsbEdyTjZuYjRBQXRGdHFDa3JyZGR2b1IyUjZpT3ZoR2ZkWWxxbDgyTzluVXJ2MWJiSTMxMHNCZU9TV3czdE5vSXRjQ0szaDJZNjdQVEZndzROZmRTSmpLTHg5T21zcXNDRk42cXRBM3FjUjRwUXJqOVh5b3hPNTliVU04amZWdmVMUFJLSDAya3RrKzNYR2dKcjJOMlFGM0N5V3BtcStvN01nSVFoVzFPMHFwZTRsVCtmdit0N01HN09Id00vcHpmemhTK0lPRG8zdTZsempFd0h6bnlFZkFWWlNzaTF1Uml6VXRNS1BTMTk4M3A3cFI1TlNadXNvRHRobmFIVjc0OUZFMDFjdElQOCs3Zkk2c0JOUFgrYWdGYUtHNWg1VGUyQVBlbGlCODVEMjY1RUJWV3duWnBTZ1ZmSXFsUExSYlJ2bTBXcW5ZdUNUdDRBcFcxUVpBMHRIKzc2cC9jd09NOXYyR2V2V0pvMGxOMTJLQXBWN0FXTGpqUlhHSmhSR2VualJpK3JtcjVtVUJmajZqK0VHWVIybVNJTHlEN25rL3hsYXdweFFZMzEyeG5BWEJKRjUyQ0k2RHQyVWo0N3cyQWVkU0h3aFUxRjdJbHNpSW9seklmOFRzZ0dNbjhZdXR1T3UvdG5oVGlMY2JnT2k2bHJFY3JwSFFueW1xaEdWOU5GcVN2OXZVSEQ4R0prUWNmbVp0MW1YVnJVTXlFZzNlL0pyVVNTNHI1c2FCTkVPWXE2dmwxbjljbEZVZ1U3OGYyYkp0RGhGc3lGSEhvSXZjM1dEWlNNUHBLRzkrUlE4cDZSMzB3ZjQyVjJTYW1lOEpuWnM4Sm54UXVCanVmd1lyRFRPTlJ2WDdWeXVCODdkdFh3Vmw1R1JOMWg4L0ttSnYxWDZQNms4bnJwdTBlbitkSzNGbFEzdkRyT3JRQ0hTOW9DSTZDNzAyYzAxTFdFTkVNVzE1SEVzeUN5eVF6RlBmRTdIMkt2cXUxdWc4WU9jY1g1RjBjem4venRnTjZ3ZG9lb05BVWc1T2JPbjFJNit5YnM5V0ljc1ZUL2xUOEMzLzJvMTJkUmdrL25YUHlwOThya3Q0VVhVVm1UalVpUG9oQnY1MkZzM1RCVjNFVm1yZStsZ1MvdERGektYcUxmaVhkNzBXaTBkU1libDJnMkxudFAydDFBeHErTm5WOXU5WUlYTVBDbFJReDVmQ1JqMFFyYWt3VmhLMnoraCt6S2k0Z2lGZlhNNEw4NHFUaXJpNzVmOUZzb0V3K0ZPMFZFQXNTM2dlZzFXM1VwTUVwcWFsWmtSbW54UEhSZWwxOHJDY1RiQXpQdWRRTE5OK1p4d0VLSGhvakVEeDVjSDNyK2s5WDNzYnBTdkQ5RC9aZWhVVFhwU0NMQjc2MVVYWENSU1hxa2JBZHhlOFJOUGZvWjRsMFhnQlZ6NzcrcHI1TUZ5Zy93a20yVnFKTmFpUERjdUFYVXpwMTVRQlQ1Wk1jRys4eXJ1Y3RiSVM2K2xFb0NaSElFRjc0aGxMWGtremY5Uyt5VEwxMVZXZlFVc1lrK0xHQS9SWExiVzZBR012YmJiYmExU0luTS8yWTd3WG96cnRzM1FRMEI3WXJqYkVZR3M1YzR2cFhjQ0RsaCttMFk2S3VVVEhFb29ad1VNa1RzeENFbjV1SjJFUFppZHN6d1htMlVBNzlXNklMNHFuL09JNDNYakZGYS80akcyYmFnaTk4K2NLSGtLbTFHK0YyTHJxNjlXTWtPZ0hRQ0ZPY0NPQmFoY3h0RnN4ck5wQzNMTzZqZENrWWtOd21OZjhKOTFTQTZvSm1Pam9RTzhvVC90TTV5YVpkTCt4QjBTdXpRUmorZklLZzdoOWVCRlBmbWtjYkpza0FSdHFrYW40dWd1K2Roa0lUTXQzdzJyQnBVWjVwdXpzM2grWkpERVhqenBnVDRXYnpZMzAxdHBmNjI3ZHBjdWkveUMzRmVGVUczY3p4Wk9wazExWEdjWTFPcWZiUnh3NHR5OVYzS3psaVNiNTdaRFBjZEdxNGJkS1BMaEVicGNCSmlqUm4rUWVmVXl5ZHlEdnVYMXlMb210cWNRa1lZMDZyS0s2Ky9BMzRXMFpHZjk2ZGF5V2RJSTI4Y2J2QksxYlVmN1FjUjgwSVRSbFJKOHM4N2xPUUxxM1I3UEprTmxyRkFYMDhQeDBrU2xiRk13OWx0SEFhWG45SXNIR1Z4VWc1OWFTN2JJajgyMWJrWGp0KzMrT2RwK3JadnhVVXk4dE1INUFySnJZSW1zM0FQOWZaNHFwaWlPczE2OUdGa3FyVmRIM2V1WFpIWkdyZWh0NzJkMDNlZ1JpU21ZcE5iUHI2VzJGR0NFSmZMVzFPdjRuRjhTUDYzNGZQNzlUbXZHWldrQlhiMEpVcXJhaUdrVVREZmdLaDRXMVlNcXFqNnJqc3VDZFVkcWNlQUUwUTFXbmlLb0MxR3lsTnlsM2VwcFYra3c1TncxaUlMWVVBV0ZVbHpHa1BsT2FjTzAvZllac1FDSVZoQ0JDbVlBZnR5R2JzZENZVll5YXcvT1RzMUcyWCs4UG9yUEdPVHc4a0hqeFVUUnlPNTRBZUFlQUM4Q2xSdWNEWndodXl5VmRqQnZNb2NqNVpqd1I3ZTI3WFNqWjdJVlJ3djEzRWtXTU4vbno3UjZMNENBZ0lDQWdJQ0E4ZjIvU0IvdCtpcy9aOXViK3o2OTcvYjlNSCt6M0IrYjdmcE4vMFBvM3I3ZnRHcjdQcnE5KzM2YUQ5dnUrY1A3UG9aLzIrLzUrMzdDWDl2MU9mZlY5RWYrMzJZdzZiNExxaCtwcGw1cUVzRmcxZ0xwR3NTRWxWMkNTMVZpR1pjUEVlVUtDdjlaaE9TRE9KUDZUaWJEeUlvcmdMNW4wcU1Yb0NWQ1VvU3AraUZOeEphSUphaVZLZE1vUWRRWEIxblFUT2lMcHZMTmltTjVoTVd4SklVWDdkeGc4T25Ib2dnOU1zYVQ2TFU1bXhaWWxGZElVZHJUZmRzQjhjTVYxK1pWWGg0TUN6a2x0d3F5VWhUZjJjZjd3dERPQU1Kc2IxUHFkMkNESWhxNzByZmpqb2lCcE91YjAwNWFEZzRuZGV2Q2pQbCtvK2JPU3QvY2xhTHg1RWVCYW1SME15b3NBTDdUY08wUUZFY2RaR1N3RXNUN0lmZk5zUnZMYncyOEFsV2tGSEZ3VXRWejVQSktDQ2tKQzhtL2JMS3c3YTRrM2plZ2JQVVRUa1FzazF0VUZCdDZYVGtINElNajdpSlBGYkh0aXhzb1Z5NC9TM2RMVkMzSHFXM0I5TnVXWWJ1ckVZV2lSOUFpUWZieGVEZEZ3R0xHNW5QQm1FcnpveDZJc3FMNm4zUExNZDhxZ2pFM1Jxc2ZVTlpPUWdsYXNVNmZta2t2U2pmOEUzTS9UWlRFVTQ1cENEK056TEJlY3pPWG9rdExtQXd2L0Rqa0lDMUVOWHBEcHNhbkhaQ1BYbU1vTFNheENXRCtpNFpjcWhIZmttaXZ0UXEvdks5a3RVdFIxSDlyd25tM1hPNyt4a0pHNkpob1AzbzVHS05pemkrVXFmTXJEN05BeXQwNzVOUWdOU1l1c2RYcjloZDVmQ0o2QVV4QWx1bU1tczk0eG5LMnFjUWoxTFkyUUNmeHpLRnhrd1FsN2Y4WVpIQzZ1RVI0b1ZOTDR4aUZIUWc1OGpSdlVnVzVjTnpkeVFsRVZ6RU9RTGRtVnhvaGNhZnJCMURoU0RkcFpWMW9UM3hUTjlBYWloRFBBcVNwWmpZUkZCbXl2SDluM0xwZGdEQVg1ZzRsckFsYzlOeUk1d0JiQlpYSzBjOCtCWksza3BpV2kwZ2VBNmg4cDYvUUVXaUs4QVhXRzFSUlR0d1dXZmxSczdxOFRCWGlwKzRRc21uL1NPekt4MlI4SWdERlRhdWloQW9Wak9GUy8xR05jaWhKd1UvVlk1NHd0akw1aEtJMDFuWndHYXhGemd1WXVsa2hvUUlrYVlIa0tNZTJDR3dWREFlTFZwNVhOWlpLNFFzcStrSHRJcHRoRGhhd3pRcm4xYnVyeTI4ZkJUcmhNWWZNWWhBS1BQaUJhaDJYc3NvbTczaVBTVzRZQTRKaDBYNkY3S1pLRHZ5YkpzdHJzNGl4eGJkQS9WRlRKRzlRVzFRK2JVdEJGclF3anNmaUoycU1lT3NpVjl6NFk5WCt2ckE1SHQzZzdCUDlBcVMxclFGZFJYMzNRVElvdTJ6SzBtR3BXWG5zVUl0aDZkS3BCZGNUQUZoS1NsQWEraTdnbE9xRUJxTDV3cHJwZys4MnBvVEpPR0FwYUlrNDFqbVJ3VC9XdERiYzVMM2xsTVcyMk5jSTZTWHVhWm1tY2VYWWkxZHVpdVUxRUJPZVJWQTR2MXZaQTNBbDdXMVB4QUlwSW1hLzZQMW51aUp3UklkbnJ3bGFuUjJGNnNXWGVhMmdOK0gyTWk3SC9PUDZ0Y2RBSitFeTY2dXJNenhKQWplNTVNRTQ0UURDeTUvaUxZUHZhMmd6eHRZRkc3Tmt2SFNydHduWDBpaEZyaUhJR2FvUGdzblg4NWM4SU5Cd0ZTSzlyWUQxWmZOeEdiR2hIc2kvaDZUcnJrL0lNS09wNGlCM2ZKQmRBUUt5cG0wNytVbWkwdVNsMmlCOGJ2U29zcXBNajAyMVR5N0NkNVJnTW1YOWNGcFBqY3VHQTZwQXBqOVdSQTRsSXF3R1AxRjZFdEJ4dnFHOFFYQzE2TU1IUk5IZE54N0pHbkFqa3BENklkT01mWHdEay9wbm93Sm5DRFBsbGExQURES2FMeURxSk1JNmFEOWtkQmdEN2JhNWNBbVpFeEtsMVE1SzhicnhQaW9xK2VyaUh0WGt1WCthQ3JxZjFIUU92MDdqcThFd0RLblBOQThVOGhPaHN3K3hoYzR6OVRMVHJLclNGUzBOc1RidGQ0Rlc2NFpxa2prMmtraEZ4a0kwN1hCV2NEUWs0RUtLYmFzOE1WcVgrTGV5ME9JSWpocmhpOWdtSVBwUnhOVEJGZE9FOWxkQkptL014Z3FtYXFRRWs1SG5hMFhuREw5ODJQa2xkSnFwMWVXQ2lLcnAvVUtpV1EzUC8xSExmUU5vRmxzZkd6Z1BUd0JKSEoxMVpxbWNuRk9FRThGaVByL3BUb3lwa3lTaTdad1pwY1Ztakg1K0s4cXJWMmR3UEFKWEphN3BpbHhEQVMvY21PS2EvM0pkWXJsdG43TVZ2MVRpRGoyZWhCSXRGbytZaTRBMS9aUkxkOEkrMHJqQ2U2SVY2Mk1rRlYrMXNKdWI1ZUQ3R2VnTTJFRVZRTzFHUzRCSW9MeCtjYldxS2xaRlVwUTNOV3dRNFhOUy8xdzQrdFB1THpVbVdLTVFoS25rN244cVVzcFc3VEZNZGxLbWF2RzRpWDZqcDc1d2xoamE1c2lYSERVajZ6VWR2U2ZSM2JGcFVoZzRIVDBZd0drWUExZ21nRHVGYWdvWitYazFHQmQ1UmhhZURrSEtiOHdLU0NXR3RtQlFLWlhnY3F0Zk1lQ2JOZ3VBZGpTcUpZbG9aalVnTFVVQlRQWWVobUVkaDdBV3NQdzlRbWtxNzdBbUNucXdGV3BTZmJMWHN3NzREVzRoZGtKTHhYTFVFQ0VveXhHZDdBR0UzZWhhMFhKZ0FLeDFXOEJBS3NTYlVad1hPMU00eGZzWFZ1TVM0OW9JY2habnQ1R3BoZUZ4UGxJcXZIZEFUQnJVam5uR3RJQUFKWG53Yzd4VGhMdGdDTEdnT054d3QvdFBaWDNWamZMaldYSWNDUmk1SXI1cXZtRjdyOUdlb2owdktsVllBUXFxZlB3RE1sVVNIc05EcDdERW01amw1c0pqakRBTWJYWFhqclByRzcrYkFxRHFyR3c3dEJiMVZGeHdCcDU2YUwwaFp6L2xudHd3T3p2NVk2Rm9Cc2p1Vm00UXcxOUY3SEcxdUI3V04zTzBvV0tsMGdSNFJPTHdSaVk4TlJZdEpxbkdJN2NpS2ZrYXJFTU1GRnpqOXpiR2xuSktpK2wrclluZGRqUmw1WUlsWGN2Vk5MSnVJWkw5Nkphb3dNdmwzanpVa1JQUUtuNE90TTFibUpnKzB2TTZ4QWxJNFZKZnkzRjBFSFZvaHQ4WXJVc3o1QTNLZDFLOXZXN2FqNW1nV0pQdGJtOEtncjc0NjFOcjhkbXBNQ0ZmYlJDbVNCOTlLZ3BEQUQ0SjdLd2FicnRMQk5hM2Z4NDFuT0FtallHMG81SitkMGRvMEJpYlpaR1Mrd0t2MGVlQlBQdkxEYjNXZmIrOUtSK01GdlNJd0NqN2RRT3lZSUJ5L1JsWGp2dVJhVkN6cG1XcVNZaFRXN21DTmZJZEJtZTRXdUpaUW1ISWNCTEVoN1RHTXdYb2ExMXRad1ZOYnptTmlpc3BacGlTa3gvWWtsYmhCTWg1czBTdmJBS0tKMHp3U2ZyRFZqZ0o4Qks2WGZuemZTTXRXRzRldTRxOXAwSlUzSUp4YURrYTk2MC9YMWJGTmRzazlVZ1pDUjEwYit3NXB4cS8xZG93ekhLOFlGbU5qZmxoOUtwb3RFcVZ0dkdkdE43VUorTUd6QXhxUkxjaTFjQ3VUUDZON3QrKzR2a2tjS0hQZkVORGN2MzNCRFlQNWJQc0RNOHRMUWUzTFF2RHpyNmUvY3YvZkQ5Y1pkR1c5RUh6SmZMeHZHS2NtRmM1U3R2dDAvaURRY3RCaUQwQ3NmSVc0dXZIRUt0WjdJV1pBRjJLaDlLWEVFVCt0dlZGZld2MnBwQ1RPd2dlQnJJQ2hKL1gySm1wb0RuNFZ1WTJHKzc2SHdudThFbC9QSjB3Kzhpb2lzS2hINFVjTFMyWnppbHdYeW5sOTJrL0RZa01JblFwM05LcmFnZkh5ZGJtcHJtZk1ONlNaTmplSzQxTnp5MnJjSHo3WXgwSVJOczVROS9HczVybjZuZ1dBVGN1cC8ySTFxQzBIK2RSWlJKRzhxQVorVll0ZWxHRlhmMXd3dlRVWUtVdG95VE90NFBWWkw3d3RNT2RDWE9mNjdkOTRUdEJhU0d3azdMTW1sTDlhOWVFTVhHb2FkcmpSZVI4NTc5NmlFcUQ2bHlQWmpvbkRWdklyWlI5ZkQ0R0swUmlHRWNNR0ZwbTlzOE1pWHNaMGx2dUpCQVA1QjBKeWZvc09XU0NGS1FzVXY2amNxV01oRG9QVy9IMmpPOE9RT0txYzZRME5FNVN4c3JMT2ViT1F4eUlyU2JUTVZoamZWa0p3L1BvMWFLUU9XMEw4TExicmM3aHBJajkwMlNHYlBBTk5xaE5td1EyZEsyaEZQekJjYjdvZVdsUkV2ay9JQjMrR2FqYjdGVEJYQnJSVDdCV2NVMDNIYjdrTk51TmFzVDd4Ni9zVHdKWHV0emxadEkyZWxkbWNGVTBGaEFxdytyQlVCa1BmR243dVovZ1d1TDRFWmxEN2dhQzRELzNiUnJpNTFrUnBEdnh0ZlBtTUxMVDFTci9LUjZNM0xxU3F2MWQvclJSWXJ0bFhNSi9TTzNQM01udUhtUVlNWGJBbW5sTnkwZ0xXTEFxRzNKTlV3OHlURkFPSzNqVk1PVUdtWUlHMG5JM3V3ZDhWQTBtTzh3VXliZWJTS2dYajlFZ2VsMk5RVjY2bnVROEZ3N2E2UkIzT0xndUl0N25qbHZVSTZ1ODFVTGNqTitVVkZBZEFiQ2xqbjR3Zk0wRWtvLzFOVW4xckdvZ2pVTGFZbDFzV1dTR2g5T1Rhc1ZKTHRISDc1SzZMNk5YVCtqcnlVZFIzZnMxK2VtZzZtS2pBRStzb1hMcGVrMkZIUjRIemdqQzBsazhTTTR2b1BWUlNVcWRKanpzM3ZkdGZhRmtLa2FYc3dFQTI0bm1FVkNwQzRPbUtNd2lJZWtwV1BPTjNPYUk1ei9CTnlrMm5aYVFUSkhzeDcydkx1aW9NRDVrQityKy9Qc1RsUHNRWm0zSjgrNjhsL3hDVm95MGJwWG8zMWVvS2Y5N01ldHBreVpaeTdVWEdVdXc0ZDhtRWxPY0hyTFVBcENjMHJPWWl5WkUyUUMyd1FvYmo0cFNXcXF1Z0VGNFBjWmlBd3dBY1lON0xVNmN6bngvUktaRE1XSVRhT3dVNm8wV2VhenVjcHBpckJsU3RraStzeGp6cjFzcVNtSUUvU3p1RHBwd1VacUJJd2VaV0NNSmk2dTFHYW0rVForRVlMMit4ZDA5dzZIMUM2L3NxbmEzeVYwV24yRWxPek1xYjRaVFp2OE1VR0NrQ3dzUHprVjI3REdxc2NDV2QwSVNFR3F1M1lRSGI4eDBxZWRFYXZpMDBJWWErV0JlNjE4Y0hOdXk1eThoWjE2ZExGSlZpd1hrUGZ6cFFyQUNHaEJ0QVhiMmhoTVd5UnRHZ0NYaUFrUUpQSGJoYlM0aVF6VG1kL0pLaXpBWnB1aXMvMWdMakw0QjZhVnhQd1BmMDJkVDhtd2NpalMzNlI0Yzd6a3Fxbnk3bHZYWFp3MTZTQ21ZU2ltcmdza29Wckd4MlQzSGlWTWU3WWlGOGp1NTJUWjhlR2VTcmVoTUlMS1FBK1ZscXpwRGxNT1l1VDZxcXFKZVJBcWRUUmtSb2FOQStGS0xuTUw2Wkh1V21GTUM5cExicDRCdmZvY3oxNVpKSDQ1UWtiM2E2c05FSUxCUWxwbHdwd2c5MDVnUkxoYUxNK0x0MDVsVWgrVkFKZjBla0FiNXVWaURoU3lpZGs3Ni9EdmEzODJQaWhMSEovcUMrN1FWVVFSaU5EQW1kRjhYTVBGUVZmbHdWMEdUdnVHUlozNTdiakVya2dPVTYya1orWWVXT1ZScFFNY0hRN1hsQWpFeENDZHFYVUNtbnBuTjc4dE9RemdRdjVQVjFPZGJHbjlNV2tqTmpaZHhWdTdCek5iZFRhOHBmK3gwczg1SVFLWmNyUEhxTFcyMGVNZ0hEZFRPSnl2YTR3RnRmR1A5Yzl1cE40ZGFMd3dtUEN0dHRXR1NZR05WSGN1b0JPWVhxRFdKc3NSRTVQMWJ0b3hqNTdjNjREZnQvMDNxb3BzNmY4SWhOMTlOazZJNnZRTmhlakpaK0hWMmJJLyttcFdVdmJXazgyVXIwa2lnTFd5cm1QQVU3blU3dzJBSG5zcFVRdGxJTXBSNHZPb2twSElNVmZBN2s5VUd0dkZKWHdlb2c0VzJ1YkU2bGpueDVEVDJ4TmlidHlUNllZK3QwOFl3OFpTd3UzczRzTWhDVFdVaU1heDNJcWRtczZoM2gwc0xEc2wvVjZ3V2pRZ1BkRTgwWkFoRU4zdnRjZkZHV2dNbW9xbGp2eGxxNUVib1oxYjlPWjV0bVRub1dvQTlHOFV4NGJRbnE0NFc0aFEzT1RmNlJ3emZCMnM4REhmQUhYY1M2bmgrcTF2OWlYWFpxZ1FWU0paZFJCeWJqK2xVK0g5RUNQU21ZUlNYRk5hVUJrS25Qa0ZNZGxGSzZnWC9ENm5zK0hHWVhHNktvWmRLRllGSzU1QzdLRHM3djNDdFBXMTdxUWkycTlHVzdLZEpqd2UyK1VpNUk3ZC9XODJFSHR3ZGJSV01jZFVLZGdhMzlzdW8vRTR1ZnQ3NS9qRTVKQzZzRWJPYWIzZ0ZpWmpESnR1UGNtdDBTMHNPSUNRdzNhekJ1Z0tFWDNteXcrRmxkZjlJUGx1a2JETFVEbWg4QjdqeWVxVEczWnhuR1QxVTNFeHh0Uk9Ca2dDOFdUbWMzb2VSNEFvY2ZLTGdzMkJzaUpFWDVoa0grNkVzWk40MGF6ZXpUaFBOTWZEOVcxYnBrUFNyQnB2cStEa3V5QXJENlUwdldRTXE3MzNnOE5RdXFoN0FOY2xZRGRSVjkrSTNjajBYSElBc2R1d0w4cWNXY09aTG1ySUtUb1IyMFpMQmo2NlpRa2krUGRXVWMxTUpvYU9OM0lnNm56MVRWZTV3UnNPQzhhVWlUSnc4elNqZUZJbVNmS0E5UW5SM2pmWHlnaUlEN044QWpxeTVVNm5GUU1uQkN6MU9jMVpNcTFmaGNKdzBLQm9oendlUkxpcVkyLzRaNUlnZE5ia2NhS3lCRmFQaHd6ajJMb1EveXR6SHZISlEvcWdwcTNvWkFiU056RERPSkN1cUpxZmkvTzJvY2tFcGYrcktJQlBGMXduQVRKdU9lczBORzhVdGpQVDM4R3hEckpxelo3QnQ0eS9keXI2dXB6Vzdic0dUdVpTWkgwcTVMUThpMHVXOVloQ3lncXQyMkkyMGxDNFVoQ2d1Z3NGclRibTZWYXJrdGZRSWJ0dTBlWDhQc1ovcVZiV3ZNQzZldHppV3hKMWkvbTVNdXdqSkRyS0JzZkNIVVJJQTB3UzR4aHFjdEI1ZytZWWhVcUxuRGpQSUx2VWEwYjVtQ0FEMXFPSi9LdjU1SUF4R1pMOGd1Z0xyK2Naek1sZlFJMGdrTmtuRGE0cXZmS2lPQnNsMHYxTEh2Z2NoU1FiNG5sdFc3b3FYNFJZdzN0MllCczdlVzlMOE5TK3hhT0VGMG1CNmxBZUIwZ1Q5alJEWmplRzBWU2RGdFRNMUdpS3JKZ3VKY0xnQmlxRDFnVlRvbDRFbFkrTlFtLzdHQUo5NDYzY054VUZQeW5LYlVrUnpDM1Ntek1nVFdadURCWWlWRnlqclZWZXZma1hFMXpBaEtwKytwRllNTUVpRWt0bW5UWFJuL2VpV1FOOFBiTWFnZHhZUFN5U1dMWDFla2RnNDBCKzNvRHRxbnVxMjIwV29peFZ2RTB0UWlMbVM1Nm5IOXAveUZCMWd4c0kxRDM4WUp6dzI2elJ6NEJGVnlGRUhhZ2toWmZjL05oSUx3VEFMb0FBVStjaHZrQUsxcEQ2Y0JzZ2o0VlZML21DT2VOaTNHNHR3SE5ITis3OE5XS2pFY0VVcSt2ZEcyN0w5OGpCcXJkeG5iR1Jkc2FuNVJDcHBsL3hyeEtpeFJyWDhibElob2FkQ3QxcFZMZDduaS9rR0FjTDNGMFFtSXFucWV3RDM5dXoxK0h3c3NlTTkramd1c0I5UTFuZCtHNHlIVXBzTzNtKy9kSEk0RFc2RnhDUUIvbmlHbHZhL0MvaDB5bUpkOWdTR0VsM2dkNU9LK3lKa3F1QnlNSlNFQURvaG1weGVGWmQ0ci93TWZMNlFBc1dQUExmZHI4S0ZuUS9JZkNzMHBiMUg4QmkwM0pGdEpXTGhQc1BuZkVVL1JPKzMvelZzeVZESkg2SVNLc3kwM21WOWpyRFQ1YjYxS0dkRE4zZFM2bG1rZjM4K2RFbGUvSURvVzZOSW42YVJFalpsdjdsZUJ0S0xsN2NPelpGN3hWOEd0cGg1MWZWU3hRR1ovUFBTL1NYcnBsUzM3dnowYmI3eHRSY2pUeE42T0ZvWlZwTlN4MEJvSmlOcVAyWW1JUkY1L3lsK21FcWFUaWorSUxWTHBYcU5seHdlZS83eFlaQzhqa1FzR1NFZEw3aHJVaGNzejN5clpwb1d3ODhGSzJOem9YTUd4elBwSjNzUVVJOXlmK0hEU3lQMzhzU3dnemJ3eWhZc3RYMU8rWEV5MmhNemMxVUZvNTJNUDhMZVJHdy9EeXRNbUhSNml3V1Y1dVRKNE9SWGE1bEU4MysxY0JpWFVFTEU4bmlPY08xSlBJZFNnRmdPYzdodExuVHFGYW93UXBGeFhrU1ozUGExUytlR1NyMEhxWkszVEhaUU5EaE9zaHNXTFQ1aE1WVlZkOUdwcWIwUUlqalpiemhoc2lQWW9RNVpGQWpLcDBqU29PN1VmTW91Q2orVWJNdFR6c1VYcXc2bmRNMFpjL3VHNURJZm1HdHpvaW5kQ3EzNHIrOFpFcGNiMC9CUU9UUnJIeUVhMkJMdk9odGs4ZTg1OUVlcmxpYzRybjJRTEUxRVNwQ21QeUhNZU5adHBtTWQxeHNyc1VhTFFFekxweU1XdlJkNDVLRnZqN21jdWJ5Q0x5cWZ2MlExemdmdXNpclROREQ4Yld1ME9reFhuZTk3ZVU5Vmt6U2IwM0RCUWZEYWluUldGZWtUenMzQXJGdEduYVFabUdvQ2FWMUtYdFUrVUhjQzBMcTgwLzhtNWtpQlE4N3RnL1R2VitLbDNxSmk3R2swUmtydFZRRkV3b3l4TW5iSzhKNW11RjBQY1lkdWsvYmFSS0VjenY5TklFL2NwOUlSR0NiNlpVdXJab0FjeG1Hbkt0YTdIN1ZXbE5WalBDV2ZocEZoRHFJRzI4TFdpRlR4RjFxcHlrekgvM29JbHhhWUdUaHVIYWx0ZFVBVEN1N2w3NHhnWmdWbDlJQk1RRDFuWFhHNkpUbUk3V29Ec3NyY2VwblcvZjVRM0htSDVUcHF6RzgybktYazBnMjBzdFRacG80cWlkVDRvaW0zSUF5eWFTazVock9HNEZFS2pvcm5kcWNWbUdjUUR6OERSdXpNdWMvdzZMYUlvVGdtUElENGJsbU84bHFvRS9aZW5mNmxoMkJFMXZQL0d2c3VYWDVwZlRJeFUvdmRlSzdBTVI1Zjl2RkJQTU1iWnRWUis4NWJEQmpnY3JHQ3ZFMEg5eUs2bGUvZ2UvMHphRUpjTlNmZUw5VGlFTVJlNlFQQ2ZnKzNEaFhNdEVQOE1rUUVaZEV3RkZkK3BRSmFDMHhaWFFHRlUzcjl1dEpMYmpCTGp6ZDVlK0Z2S1BNZXFaYXNTd0J0anBEcU4yY0VCNEwxdm5QMTdIQWphY3FiNnp3SFVIL2NxbHYyQWg1MXZ2SkFpeWpSNGR4ZUE1Y2NaVis0VDFNbGIrSjVBWVQxY3VNaFl5QlFQanJxTm9TMXpSUmhzU04vc0l3dGVDUXNmZEZtaFZkSTZ3WjhJVk9CUDRiV2FkdTFETHdCU0wwL0ZacTU3NDBNUlM5eXB1UFdmbE40aHBqWjhzK05ZR0RwVk5Yd1BPSXpPdVd0cmlLaTF0akU4Z29rNEVQNFBoVkIydldMTldDWmZSQ1RPaGtoMXhuSGY0S0M1QWNXMm51cnpqazlhbWRkYndGZ1FiT2FEamZpc1pSQ3Q3a0NHTTdBYXpXSjFIOGJYYkNKTmhVc3VMQVF4Tmx2OEsyT2ZrUkxUb2dQdDMzdTM3cUVxNHROc25nWENwMUVlR0ZRMFE2LzFPWXg5Zk1aWWI3d0pJS2pKSGRYTXIzR3JVNEFPbHhpTFNuTVBjWTdyc0JWZWY4a2hsQ2hYN0FPbXMvTm5Wb2xid2MxNHdMZDQ2SzZENG9FN2JVcjlhUldPeXNQcDZZbTlPeElEb01UelUrc1pnd3E0RUEwbUpvTm54MWJuOE1rb1lqSmlJKy9hNmtmN1dzVkN5TGhiTWwrYjVCb3VETVBCM09WV1JDRjJKdVd5bVorVU40SjdqcXB0NG9mOXJmWGtmdUpuMk42cThnbmFQQXgvUW53WGlya0lza2xVZTEwTmZiWWdZaU5PVW9iK0F6QmZTcHRURDYwckMrRmllSGFuMTBPK3hQYzBNNTJUZ1BiS0VEelRNWEl5U1d3MkJqTldSWjMyL3BLdW1FK09vM2VCMHJQNGRDV1lEWWZlMVJCQzlnZzE1ZENDTDJjOThVQllXbGJYN1I5ZmtLWit2aEVabXc5Q24xcVpuZmFoUzdEcWRyNDlUa2Q0cXlmNjNUMnhNTVRvVGR1UitLYjdBY2Z0dzVqOC9LanJhMXAwM29OaTZLRVlnZVNoY0lxeTBrN1p5bkRvK1kxSzd2clh6UmRmUWN3YlFTUHU0ajJBMU93S3ZjblRSdFVrbEhvRGpSelM0Y1VpRXk1a2Z3NS9GWGRWVXRWdG8ycjhVQlRoNEREdnFHekVmMzlWUE9NOHl6WFJOU3dtL0hsWDdlZ1JvYnhJWS91UlVvZm04am14YjF3ZktpRnNWUDhsVGduSlM0TkQzYlZkV0Voc25Ud3U0eUZEUGFGQmJrVFBIR3FBVVBteU92WjVsRkxvQTRYSHZYQlRWdUVDaHRDMnVkT1hvbEMvazRYWDZQMk1vUTV6K2cvVDZWZEJ4TWQ1TlNIaUpTVnRubHd5YVAwd1lPaWtMUlJCM3dFRHRZZ2tGYU0wbHlvaU9QZ2FrSWV0a0tQWmMyQXd2cUlxZFY5ZjNHSUNOeG9vd3lvbVlDWXZUSXErNWdJbXdvbm9JLzhRelhsMU0wa1Q3dmxHZjlhL0RQU2FhajJKSy9lb2lEZFpOeE1WZklKNHlGY1JiN3dnMUZ2a1VVaEpISHNQVWdFUEg0RExZWnhJaUlUSWRCczB0SEQyelFvT2crekRrQTl0OGF6WFlQS24wOG91TVQ1b0QzVG54b2V1NUxKRWJtbTVYYzJ5NUM4UXp0S1hVOUVxck1CNitRWUNJZ0lrMjF2L1FLdkdVeXovallpYlVXTFMxMmJlNWpVdzFEdFZXSUZOQmNBbFNOUjZtNlpzOEp3Z0pzSnJHUEFEL0h5M2tTSEFJRnRhR21ldDU3bC9QbnRqa2NEbis4SzFDWjRhWlBmU09lQk4vMitVSzRCM29MbzlNcXlqRTA0WmJ2aXJoNE5zdW4rOURsUklNS3RxSUJ2VW9lQUFlZi9TNUNuQnlvWld2czZueGVGUi9adGFWbFFleFhDM2pRNHNrK3krREsxZVFpbVBDbmRycmJpZmluVGxOTkRBc3lCbVRBRHNpT3lia2pycU5ZbTJ4emFMZnNXVWJVZzFkUytqaStIdnhaQnVqN3c5ZHVsMTlxU2JLQmRjakVJMUFzbk1vYndxQ05lM21DcktROS9UTkdzd3A5Z0xaYkNlend5emtLSFN0VnRLdENTNzc1b04yZU5SQVhnWkJaYVdaNkVaUWw0c1NGc3dWbUJBd0Q4OWZQZkxVUE1RY2kxbVFRN0dZQ21XelVKSTVYQmpJUHB6TzJpUCtXWVRGUTFjb3g0NG5PSUpyMmR1WTBXVHp6Z1RBQnFZOG9EZm5GaU1BbC8zNXg3a05SdmF3SXNGYU85L0J6cDFYdmJZc2Voc2hXVkFpcFhERFV1RUFvMGdteUNzSW9aZFFWZ3BaWEwwL3EyekpyUmFVNGtpQVNWMHN6TzNXcEFwQzFhZnBoLzNCY29KNGJhbE1Dd3pKaWR2ZjltZnhZYmZJTWFmQitSNmtLVEdIeTFTVFNZaTFmRVAvUDdYQ0x3VEdtVEdBckNhUVg1eHQ1R3MxdnRjcy9QcUlFeEdwVGdCblVLMDRLaVBvUTRhWXdBaU9kMlJjSlZ4a1FLeXNYcjBrY0g5TWxzR013L1NnWmVVWG9tcnNhZ3RhR2xkcjdWOEkvbkVwUWV1M2xYL09OWnlWdDEzaFRkR2dBdWpHNWx6NVhVb05NcHZqM2hXdkJkbEtmY1h2aDZHWXF3dTJoeEdFV1dSdGc2b1h2SnlRSWtWR2FFaHd3dTFjM3JuOEE0eW42emRVTDhHVmdtU0JBVE5DZWhjMGRRTXlKcktrT0tYQmhaMWprcHkrN2g2UW4zbEpTbWlzSjJrRmh1Q1NIbFhQVlBwalB6ZWg0TGRrTlBjNktZdHNGeTRhMFlIUWtXVXR6b0Y1V1NiSndsTnlMdGJJM0RVd1NLM2xSNlRaSXg2NlBaS2ZlRi9QdWxXS0RVUVErMEJhYWNqV1dienQ4OFJCanRJRWhGY1lzKzgvZWdxTjFrTFE4TTBmakdQZ3dqQzVEWFA4RWRiQ3FFYXRjb3ViZ0s3R21GVFowUDdZWHU2RS9MZCs5Um1ZaDJCMkpZWG5EV2g4WEtTdTdrWlJhdjJPTFJ1TnJHM0E3MEFwWGJsVXprNDZSd0R3em1LSnlZUDdVU2tQNjFsZ25rdmRKQ3JqcVdXWnNwRjRJVzBFQURmaUJKL0dJSkhVNWprY1ZrUjIvcTh1ekVLSlRHRHNyYklIcjBoVG1RZzFveHR2QmlieHhBMGxQMUJrWXYxc0xFZTFhZWFQeFhEQ2lRbXozaGIxaUwwTVloNE1WNmRBcHJ1TnFXTFdUY241ZGp4d3A1bU1nQldhMDVsWWFERWd0alRlU0F1TmJ6dXlNZGFlcW1SVUFKVmtDYVI3MWNxU25FYnc0aWNVaTFDS3c3VWN4K2x2Vkp2aHlZRXJzZW1OV1crS1RWMy9GWkNHV1FsdXcwaVZUM0liU1Y3aExvaDNqcXVnTEtCR1NQWkhIS0tyMWRCTUZhSkVpUk9pVmVZTGxTVjNVOTFxMGlVQ3hIYmNTVFZ4VG5GU3krWlhtTXV2OFQvZksrdnV5cmo1R2cyQWU1NVVySG9tY1BVQzdNNmgydmwxeWx1bHhYQWo1WCtlVW4yN3BtTDRJWERCVjNtcmJGd1Z4enRwZmdQNHpobkNhMGxFUzd0ck55VmJjcUlrb0crUEtwdDdVcnk5VllqQ2NtTjFiYVFnaFF4L1RrSXA2a3pDZzBsVlplMFppUlpvWW95UlFtWFdZbjBrbHloOU1QOHMzOW5OaGxsdmZqMnJTMkc5UDJVSjhkM0V1TldmWHliQlVGVnBIa3BtQ0diOFVYRjc4RndBS1BFM2dHRm8wbFJTYTkrTjF1cXJDZkRpOFd5SktxSFhXd09CdWRDRGdmRVhTSStBeFArZTZ6aEVhVzhaeXdQTHdHR3dndXdpN29QSWg4clBlcHlQb0twTUdGN1JmUE1vSE9ib1FpcnE1RjNmNUFsTWllc0lhZ2Qra3RKMWpmM2xuMDdlOWtRdTFZK0tOOFJudXBiRUs3NndiWU9BUDVNWlhOTklZMWFRdlFuNDhHUEtVckFtaHFXNnExWVNZWGNrMDN5c2VReTdxR05VSHByTjlyZ1l4azhLYnZOcDJNV0wrM0dVaWJCcVYvL2NWZFdGaEtMQm5PUDBQZ1RRTFBIbHJISUF4bStuY016TTFKRGF1V0w4RWJrNFVZcjZGK1gweE9oYjRncVBNQ1FyV2JTNG5TeVFWZU9wbkQzSXZlUHc3eWJFRXRNVTJTUm9waENOaXI3ZUIwS2ZJNEZrMU4yd082OXBrNnVJQXg5Q2pFcXZ2WVVOa3ROeFRZU3gzWVpHdWM1elBhZVVGa1o1YkVNWk1TOXlSOWMrUmtlNTgvdk9PMG1rMHJYa3JlNFpTaVRwNWhwejNVU0JFUzRPUDFHQll2eitndWhTaUJSaXNrRUo4MGNzSUM1UkU2cXgyRThVQnc5SEJqOWRSV2FlN0JzTHVqdllzK1pqUlVuMU53bVkrV3k5VVhBSUVLN2NXb01GNDBJcDdKMFlkaGRPU29sakNLVlJLam10ZEhtaWQ5SERWV2l0eHpVakxJUU5UM1lIRWpoQ3o4Y3FtdEUweXFtT09MakZaUjlGYmpFTWpzSmlFZFFKUkEwOUs3UnMzWjBpNkZOTnlrUmpYeVRzYXgxVE1yZEwvaURjUFRoNlBtNnJiVDlJTVBRbThyeE50Q1FMc3A5QkEwQ1dkR0xzQjFwQkFibjdqblJzZEoyYmNjblI4V3Yzc002RHZuSkR4Z1JUUDhKV3JFR0xJNkJucklsbnZoL0MyT2EzOTJDemEzaU1SVXJ6K2FIOHd3czRHUlpxQzlMbFZYWWJaUW40Ly9WODdjckF5YXNsMWoxZHAxVUYvSkVQa0tTQ2MrWlRJQzM0VWdZdm80bVowaGl0RCtaUkx2SUdqd01QM2JBMmZNZzN3d0h0QTR1SW81cXliYXVtVURCTUlWV0N3V1FtVlNZa3RIMnM4eTl5dWdRMW5lWDVLdDRNbGZvODNvZmhxcG9Nb3AyeEdTdi9XNHZtRTF1TVA5T1ZLMlVJRjJCS3pSZllBUnNBanoxa09lUVUvT1B6bC9hS2cwdWVoR0Z4WTM1VHpMOEdNVGgxMXZWODBpVG1MOG1UbGZHYmwyMGIzZEUzTkJMYzRYbS85dnJpUnlQMW4yTC8wM0hvb1plcXlERjRPYmw0blZLU1FqYWdhSkwyWkpLdDd1UEFLV2tyM3kxRnZFT1RnaVN4bit2T0k2NkVVS2FGSmhFN25acmV1WVlId1RRaityU3VCTFppRnpxWkR4Slc4WnN3K0hIcmVLbldlVjlKeU9KNVJENnpBUlF3RHpNRjZlTmdDOUtFRjMrSzIzWHlZU1NaTEI1S3FXRGJKYmM5cWt1SnQyTDhHZllkOFo5dmdPVzBZbzd6TGIvV0dJZ3hFOWFQMHpaU0tyU0lpTDlYZG85NllPVjExV1BMVGJKWGJ2NzZocEJyZ3BxZ1pReTJqK0ZDc2IrRUFONW9BNThtb042d0k3aFFYUURvRWZrNVgwbS9kNE1TOXc4NkpoVnFnbDY0Rkt2eWgzSkk5SW0wY2QyK0hXbFNQL1czR25xRzJ3eS9IL1ZBYzdpVFpSbXlLc0pNd3d5aXJIY1UyNEJ1eVF0b0xzV0VIdmIzYURuNDFXQUJON2l2Y0NDTUFqdFdMbWFkSTlyOGlpcCs5NHpBMm96b0JBeFBFSUZhUnc3b0tqbXkrbUYzUTRJZlN6VTZaODZVWFlOd0lJbUJrcVI1aG0vcW9hWTlVT2h2WDNEV2YxM0VsWUtCNWxFemlkRXUySjdDVERiaUliSkE5eVNZbjlkaXg0U0diaWFWNk16SFlKa0RCcjNNN25NVk5PTXlZWFlWQVQ5ZHZxdlpLN2hjTU1UdXBsbitQS21GdGhNR1EzRmZURnA3OWRyaEkxcUJDQ2F1WnM0RG1MVy9nTjNnNjlTbytYTDN2cjhuSkIxVk1GNXp5SmRCb1JHZkdmS1FDUGV6SVE3aHJ1d2JwOC9NV09leSt2bWVzbTVRdFJWNm1YMjBPbEtiYkp6cFlMb3kzRHhBR3Nyb3NkK1dlQ2VobE5ockFvZEFSQ2JIeUlieXpFTzdmdlhpMm9qdTVNb3FPTGFiU2VkOEN4MEFMNG1aUnRPR0ZkcVBINTRlL2NtUEVCMHFpSUxJZG90enN2OGFKL1k0RTM1ZjJ6Y1hUb1hPbnNSWTEvVm11dWNPcnB5UnpNWkJLMWFVdWlIVU15cEVBVXRzdWVaZXJ0WlhNaE5KOE5FNllkZXFESDV5WE9CMittbytVUGx3TFRBbWlwMWRQS0pRTGdWRzZnbm13N2ErdTlaeHdYWERYZVlIYzk4NUhBVkVmb0RqNHJza1ZxUGova1hqUDlISHYvYkNkZW42M05sWjVram91V0FzN2VrNE9mQkUvN0hZdzFTaFYwYVFyOFM1b2JwUVA0SWk4UDltclA4MXBpOUVSSTF0RTZwV09LY3NhRzZEM3BWcC91b0ZiREV1Ym9GR05CUm9FWXp1QzloWm5hR292dXYwVHRIR0xFRVNWdHQ5NVNnbFVrTHNCK21uVmZRMG5IZkxxRnZ6UWM5a05iZzl6Ym8rSlIwU0lGSkk1bndRSUh5NEdQalhnQVJZR0p5eDJRTm81Sm9GWWpZcHRHZDRnMy9SQ3RQSXZiTUZINVJFSlQwYkhLMUZYOGpxVjIwTjljMW8zRkxoWjJuZjNFSEc5YUptSzdSOWNjNzJhbVlyMnZnYkp5SitwTUNQWmRhQkJLbDNRWkVwQWtjQTZXNElhV1dSNWVPTGoyeXUxdTc4cGNjcnNnOXRwZEh2aURHUHZTS09tM2lkZmdMQVRZOHNyTXZmdWx1cmpzd05KK1lOV3prVjhFb3NLMG1BMzU1aVJmaUUrZmplK1hqVUYzZDk0UlNnV1pqT3c0TjJJc3hjeDNQeWozL0JaR2VNL1NtQkJXMmFVTExlTEgrelFjaTRMREsvRkloTWltWWp5RWJYNHhnTjg2Y3FqZnBqZEl6WG9oZWl5M094cmpkS1RMSTRDc0pNanNGclRCcTdHWnNta3VDQXBLRG1OVDFzK0Z3TUdhMDdBM0MvRm4ybkRUNjY1Zm9ZT3JRMEFKWVJiVC9ZVFNMdHJrMVBXWDZjdHdHWFAxWmROaDVObFNIcGFUQmlVNTBVck1vVHB0NmJReDR3U3hSemI2SElQUFZIR3RGMjJwSDEvMTJhSFdWeFhLOW9hbVBoamVFek5NdHNQRk1qMnBxSmEwYWV3d3ZyRXpTdTQ2eDhPNFNrZ3ZYUW5YUnVndWxNVzc3aGdZQzJjejBrdUgwMTJaUy9LOTZFeTlYUzV6QXlGV0V1YkRjK29aMmhnb1lFTDZlWkNPVzZJRFFsR05Wak5KeTFGQkFPV3RuNksrbTNUVDRWZ0dwdTJkL2FQTmY4RjFmcUhDNGlWVTc5K2lhYkw3T2NKK0ptWlp2a1YrSVFQWi9ndFRHRW1IRUxuOVR1MW5NVkhKR0tHOEN3ekkrQUZFbDE3bnhQTmVmTWFsMUs5WkkwdllKRVVmcDYzbXEyMGVIcXVldmd4Qm9mcG9hc01NMVY4Z0FKMzRPaWFpRU9seGFUV1VuTVM1TFNma1ZrY2w0UnRrOEhTSlc4ZWk4dE1ENlUwOFBLNnlLRWpIWFhab3JmdWh3cDc5SndpWlhkZFMwc3R0VlNrZzRQOVlidE9VVm9qT04yNGdRN1JoYVNMZzZ2QVNaR010QmtEdkhlZ2FXRTRRZTJhNE9IOXZNamVlN3hxU293N3hhZmNTQUV6SnJkNVFYRnBPUzYxV25UUlVmUHhXVHlRYmpXMzZRQkNDUnBsSnhxci9LeUg3NjNEalYxTXQxN2JXTWpjWWZicVFFV0VwZzNVc3lzMWJQL1cyYUs3OWdVNG5VN0ZaYjMvV1p1SHlXV2tqWXhYYzFUY2crOWxUZ08wMGpWcHQxcXJSVjRTamlBTmxjeDF3Sks0RTdLTVpLd1ZzbXpFRWtmY3pXdHhxOTk0aXE2a3dMNUFXdDVKZ0NRK01jdEJadllPajdKMGJvaW1WUVJNS0tYLzRHR1ZFUVUwemJCQ1FyQkFSb05wYmVMVmZtRnR4RThmaHc5eUZVdUh0QVJEdVVodmViV2RXM3gzazFwdlQzdXpnd1BsY1JoYjlrdkNua3UrclJhOFlxaGUxRUZlZzVGVG1ubTZNV1FFcUpYbjZ0ME9jWlZNZ3VrWFMvelp0dGVVOG91dTEyYWhyMFMrTDNRMjVaVzJNeklVZWZZZGZxY3dqTHJxd1kvbk8xdWdHemFFeG5ENW5tNXZqREd1R3FqWWNobW9XSElzWXpFS2JhWEZlZGl2bUR2OGU4WGxicWRoM3o1eWdKRDlYL29qeTh1NHFYMVgwdHNRdGNSRVF6VW55Q2NXOWhLUWVkR1ZkUTZ1UkFiekRNL0g3MUowRzd2T2RucmMvMTdOOVAxNnJXQXBvTDY4OUhSOEh5Tm5kZ3FnckE3UTNhaDNHcGpBbkZkQm4vWjFLRUZoSzRTVXRjSW8vQXdoRmlIQ1ZuNkFxNFUwZFlhTkRMUDZ4ZUdjVzcxQzdyWXJIdERYc3dDOGxwNW15RG53VGdCRW8ybTUzMXlSOU1pWkpDYmI1M1lVK0gzL1lHbG1WOVlpWmJ5SXJWOC9JbEppRGk1bjFWaVFURFJxaWFTdFF4QllkQk9sQUxGNEk1V1N5UWwvZ1lHT2FZYW16empiWU10N09OaW03UStpNWhHS3VRNFpoOFVndW9yR3pMWnNnRzI0TU1EQXpJYVhHVjJ3MG9QQnJmWWwyT29NR3ROQm04NG9GVW0xam9RR3FvcXNWOG5ieDBabGsyUzU0OHk1ODJrNThCVnd3T3ZvMEJ3NGNKSXJ3UlpTTFFjS2hWM1RoV1dLS04ySUhoMjgwbS9hYVJ2WEdWWHNrV2dEcmY0a3hJaDB0ZktnWkJZUmpYS0tZY2xydGRWd1pENHVNR2tCWHVXR241c29VVG9xa2ZvQ2hVbnlUdXcwemNKR1orUENPaW9yMGp6c2x4MktvaG9UM2F5RnVtdmswazdtcXF3YldNUEFWVlFQU0dYNk4vdzZEYSsvVE50RUg1SkpueXFnUUdTLzI1QzdtYTJXbXB1aHNQRDh5YUZNTWZMNnB1N3JPVERjYjFNeTdVcUk5bHNnRndEU0owTHRjR0ZnK3ZDRUNjRG5mOHRydTRzYk8zTEFUTFcwZ2xLOWFVWVV6U2Z6Qjl1VWxDNERMMENjQWV6akpnb3NQaGd6VDZtamJQaUZlaHgzMzJzcGVJd3NDVjN0UGdMaVlkMW54WklWbGthalNvWlZZVXpXVWJzRUxGYU5jWWxMZ1ZJTnZkMzcxVjd2clRQSzNremdWcHltT1Rqa2lqQ3ZaMS9CVDYzeTBJNVZ6S29aSS9sK3gxaDVUTG4rT3RobXU2aE9aVldIaEErRkE3S0wvYmRveWE1UlkrK0I1ZWwxU0NkNjZoQ0duYWpXbnhJbHZHRThraE14Y241ck5DWnZybktqRVNPTTdQYzU3bzExVTlRZFl4ZFJ6eFFSczhPZTRrb1dYZUk3TU9tQ0l3S2FxY0cyWVY4YVEyZVZsMXFMUzIrQmdkRzBPU3lnNG1SR2ZlaGxFUEZxRHc4OEM1YUhzVkpsbTRreFJ1WEJOTmRTNnBkeG1wOURWYzlTNkxiSVFqVTFxWGh5bCsxeHR5Y01Wd3daQzkwdS9ZYVg3TWowc2lYczBtZlZ2TmJBdGdHbWVwb3VYRGYzRC96MldPbVRiR09mbzU0cHhSYU9tb3pDNWhsSDRaeEJFVHVRTHpiSnpYelduRkdnV1Q5d2Z6UmhNRzRHNDBSaVZvTmQyL1liYlVRYXR1eHIwV0ZUUzNuWmFOamlWaW5rUTgxUnhOeURoUzdBR0lOOWVmSm5aQWMwRTNZS3pNMUF0a3FzeUJDSlhZZGRJNkJoKzUzRkpKbUNNcVlEdjBwK2NTUGtuU1ZzekEvRzljVFRNd0RrWXlTUEZXOWNNY1NXL09Vc0RMSUNxUGprd285b1E4ZFBsK3ZJc2hlQUdmQU0wb2duay9HT3JxRXBxZkwvZGhvVnNxUGV6TkZGbkRXUlArNFF4bDZaUXFRSkJBa3BWRmtlUHh1SE9PV3hXSDYySFVJMlZESUR0YzNydDJUU1JDNGVZb3I2TnFhYjVhbUZSYnl5ZCtIQzhsOGZVd2VJT3pqYmpIRFJUYW9DR2ZBVzlHMm51Z3QwVTMvbDJpbURCdW42dDRhZCtTdUk4bmFiaUpBeENhbFA4QnMwdWgzTnFtSFpPY2VnbDQxTFpCQytkTTEzRUFRWTNKMW9CRjBSZTBZc3haVUlBMldOV3dMTnZIQnpOLzEwdjB1eVhyRzUyVjBvZ2dCYVRDQTNsWnhTZHJEM0xaL3c1L25zMTB6NmMycTRRb0FvWkZzb0Z5SGtFaFJHTGd0T1YyRFUyZHRSRTNFb0tEMWo4WDRxUkVyWWRjaFU0aXhJd0NsS2QyZGY5cTRob1BaNEFaRG9RM3VMT2h6NkJFTG5yZ0RLQ2JFbVVUbVZMNll3aXBYMmlEN2ttTEFLeW14b0tabUZNdm81a1hpdnR0TDVzOE4rYTRoWWZXMUJiUUVRc2FkT0FEYzYrZTB0Qkh3L09jM2w1aEJBcEo3UDMvVnlpSjlmdHpqd0J0OXcyTTRvMTN6UGdubVI4eDJkNHUwdHMxelVHREF5Z3h6MFUvVzA0MG04dE9Ldktpdnk0UkwvdHZ2ODRXSlpJUVZEWlhBemJ0ZlJOMzNpdnk5eGRYakRmT1RYQUo1NC9XMGlCL3RNbzNZakFLYktKWHlIMTNiK3BIdWE1ZzZpMXlyZVJHZjgwMytXMVZYS1hQaWNHTytwLy93V1BQbTZHc0NLWW45d293bFJKK0FzVXkwWjdRdmxSaVJWcnh1cTNNa1hyYi92NDA5NDdpKyszNjRPY0loTkdEeU5XRk9pSGhlUGdVZ09yQVdyTzdCWmc3SUc3TnRhVU5TUWFkV003bGI3R05Ic1JxTTB2MHBRZG1PdHc3OTBydmNqaGRhWWVua2M4V21CVXFYSHl0UFRmTTR0QWhCL3VpMndBMXVVVHU1YW5EWVJYTUI2bHFEVWdlaWR4U2FxZC96UnBqYVhDMER6UU1RTWtwYkZrU29XMmRhR1lzSGdHd2tiSkRCUGI5UWV1cFhzVjY4OGNadkR1eG83SmtwQXZMa0dqYVhJNW5XV2VZZjBSS0M2WkVDSVAxZHpsOVo2WHl2WWxiVGJPK2h0dnQ3WWtDNzJTaC8zcVZIQnlzQmZzYVdEeVVzN2lFTHpwWmlEVmdKRUgzaHhVRVJQeDA2U2FkVWh1aHFXTE5Ec2Qxamp0Wkx2NXVTOUhKTnVCWEhSRDJrRU5MclJYWWVoMGVSY1VHVmsxQVFSd2FVSXRISzRBY2tVUkM5dDVmcW9sT1lHV3RvZmx3ckVJcnhRdkdsNnEveVZKY0N5Z3hCb1BTYnFMVnl1bjJzV1Y5cUFua1h5cnhJRGtxQmpxSFUvUnNTOWl5cmJ4M3N3eG9GYk9leHl4a1pWMnJINWtsTGJYTU56R3ptMlFuVkxCZFRqaWZRMUlJWkRrb3hESEJkbE1OYUdvTkthbysvWlVBeVZOMkgrcVc5di9WS3hCa3VXeWJObTBJSnBnTUEyVVcrY0cxYmNpQ2FVK0VYVjNmMWM1Vko5RXZmODllajdsVElCS2lKbDFJWDJoWHNuWndibDlOYjAwekE2RndtTFBWbjVmZEZLMEg4RG5JVXFCczJjTW53ZmQ2b3o2TU9mWklER3JLY0ZqUWhHSDl1c3hiTkdVVUNYb24zdXk2YVZHZU1BTFBhSUt0dy9kcmpTUmlIUlNxZXFUZkNGUVhwQnlNSlVxbFBCWlJiaFlzdEI1am1IbHBTN05ab0F3R2VoNDZPOE1EeTBQYzNyRW01L21ta1VJZXdtTjNwbGRqS2FqL3pKeXg0NW5oa2FrUmFZZmpSYjNsQm5vUDk1dW1TdldLVFhrazl2RHp0TkRpZnFKYnNET0VqajV6MHl2UWZMK3N4NngzV2JNYk1IaWd4WjFDL0FpaEhvRkN6Z00vUzZRQUpkMHNFV3UydUxkWmM1Z1NTU1hYdEhrNjlFYTc3d0pRbldMSlIwUUI3dS94YUlXaGdFRWp3WTMvak5rZ3A4MmU0U2U2NERaeU1yb3dzWFpGOVJtVGFlWFFTZFBrQ1Rmd2dsU3UzWHF1TW9UOGoxdkdYMUhtYUVzR2sxNURIUkd3VE9aaVRBZVBIdDRUTUovWk9DaXNVRUpaVnBteXk3S3E5RHdSWmtJcExBelhhbDc4ckFWWjlDQzdLd1ZDVjNnS3NvbGVaTmJ3RTVjMk00YzVVV2lpV21jNWE1YWNqOFYwWnViTHovSm9ldmZaSXE2cVJRNmtsSTFPN0NRd3lrRGZEdjRYZ3VVald5WjhtNGdFeDVhY1hkVzZFd0hxQ0xkazlIaHlwb3Y0ZHNQdjhuZlJWSy92cDJZYTZQOWNYY3VqZWh2MjBramZnQ1poQnpyd0dXck0ycEYyOFRHaEdHMXRZanN4bzIrdGl3aHNXeWg2ckpMU3ZCeko2ZEpObUZvd0hhS3YxbFZtNkxZdzZNVGxOSnhmazc5WDRXTVY0ZmkyeXVKSEVoVzRQejArL3dEODIySGNHeUE1R20xVTRZby9CYU5iNy9waThjMmV0VTNXTTR0b1VpQWNIU2N4T0c4aXhYdnBtWi9Ka1BLWGxiTEs2YUtrcld1ZitwckxsYXBDWHF2aDgxczMxWmphZU1xVmNKdG53Mi9rVi85NkZVRnlCbHg2YVFkNUE0cXFlQUdZdFlvUkxJVDE4RFRUaEdTa09uZVVpODNaeVBZbFB3d2c4SG90dXFQY2lQWlJuYkZoOWtOTlZ3c1V4anhCMzM1VWI2amZXcHF1czZXOXFMMDQyTGswL3B3WEtHL0djc0hZdWk5QWdCUzdKSnIrSzVlRUlvK2RBNllHWFlNdDM5YkFIclVJKy9ibVNwTitzS1dVREFoR3MwdkJjU0N4NEZzcWR0VTJ4djdjZkQrUFpsR3JZKzNNeTF0Q1lvTDU4ei9BYzRCREptWFo3U0l4SGRIZytGNnNNZ0ZoV095WEVockd2R3NDT0lNUFpnaURHMU1CZzFVOVVsSUpKNFVoWkZBaUJibXN0YmZhRlpQbzVpN1B2VFNaUXZFN3Y5Mnl6L2kwWFRycG54VVZyNVNHam5UOW1leWd0OVFKWDllTUhOempiR3J6U3dTczdZUFZyakZNSHhpTTNLZDJoVzZlRTlUcGNNRTAxTTdKT21HT05HR2xMRHkxTW9vUmFselYyKzU4Q25oSktjR3h3Kzk3SFpxZHduU3gxcHNYK2lFVVRVd2wwY1hiRkdWUko3YXlJWmZ5TXl6RFpuZlJqT2MxM0lXZTdTYXFFdWlNenAvaUR0d25PaTFoL25mY0VvbXAxMFc4N2tMenNaS0JyNldsQWwvWjV6Ui9Wc3ZSZkhVaFJjYmg3bDR1NUdCWnBCM2drNzl2WjI0b3dlSFNzeExhWEl1N25JRldKMWJtZGhuTnNRNUFWVzZncDY2Wm5PWjVOcHN6NkR1MlM5Yms4K2lSMDRtYzIyVjNPbiswbThNUVQrSmNkaUhTYlBZZldOTEM2d1JHdFF5RVYxczVHYlBBc2lHNDQzTDRROE93LzhQaHJnZWF0UVRJOTNvcGoyZk5uaGlkdkxMTlVWOEJWWm4wQnNEbWZTUHhuTncrMUx6bkNpZnJvTEN1ajR0aWN5amg1WmxXckNzdGh2NVF4ZDdBN1h4MHgxWUpWVUgwTDNZZkRQVU5nTVkrTEsrWTkvUEl2anZObC84b0pxRVdWS3VvRU1sUmhaK1o0Y1UvUXlGdklUTFJSdVZQZXlabHV5K3h3empSMnJsenhZWFdncVhkZ3BKMU9LbjRselR5RkZxZHl1T0FnOFJwbzFldlVSNk9iY0kvdVQrNzNoNmVLK3MwV3BHZitSUUJCWklFNWRvbmFiNVhYdGhDMHNISENNS0MrdFM1Q3lNcnJhVUZHQTFPYTBIUWFXY2pEeGN2NHQvbFFDOFhTU3dYQVZhWFVuZ2lHTXlzNDVsTEUvMU5kK3hhQjN5cXdWZmFpcHd5TnBOdEN3bmZtd3ExWTZ1a3BhcmZ2ZzBaMUt1S0JWNmE1V2tGWlRNVDdjekFyc0xOdFdFQkQrNXJHVmU2RWxiM05CaEZaTlRrWjlEc1BuY3kvdnhBWmsxOXlrYW40SlMvZE1jNU1WRkZpZW9mUDk2cTZkbStzeTFUclRtUFdxSm5ZbXdVRDNzZzU3czIrbnkxNEEzbzlzSGgzbnplczFOcFVLempiL1QrcUVya3NtMWg1ckJpK1J1TTJuaUZvZHh1M0tRWGZoZXRORUhqQWE5SFk1WTVjQ0ZDaVBJZ3dacmdnbWpKSlFvM1J3K2RId1ZiVjdSUWR6WjNpN1c4UEl2YVErZFVJUGxhU1NJUnBkNG9jdTM0VWgzdDNmR3NKTUI0cEdWTTFQNnlGOVJuYzJEQ3hsaWx2SCsrQTdyR1hlUzdoaXZEWWVjbFNWWFh3Yk0rSnRuSnBCRXRocm9BZHl1SDdWNVRObU1hUERMYmoxZFdtdnZGd2hvNG5scVhUa0dNTnRrbFJINjlleVMvUTVtZmhqc1RVRUFNcEFFMW5CVUJtMXRXbGZrVUFkWFFMQlZ5a3pqNWQyM2N6aUxFbG85TE8vYWdXSkg0RWFtaFZXTC9CRjBGQVRha0lOUWt4UnR5M1ZGL3VtbDJXQTBVT0VHMjM4MUhYeHZFNXViYTQ5eTlKdUgyMENqRkxjc2YzWXoxN1o4Tm9GNStLeVZ0R2lLK3owcXppek5uUjJvZkd2M0czMTNYSUFRNHUyY1JKSVhaY2tRcmVqb291Nlc0T2Fnb3paNlhyQXkyTllJOEZ6bGpCaFBwS3NwUWRMQTU2d3dSbkxkWDdYc3hyZjVTdXlwTkVNVWQyQVA3NnJvT1R0bGRJOXkwa3RtMWp5Y05sak8xNFRNbVZ1S3ZYZ3ZUTXdNaVJ0WDNFU3YxazJqQVpsbHREMUN6UkU1Qmp6b0QvQ2UrSW1Xc0ZRVXU1TUV5VHNBU3g3dTk5akZUYlVSc0FvZndRYnIrSk9EMFU3MHF1dzhpMWpUVjVIZlQ5cGNqbFQvSnV4SFJ2NDRJaGZlY3dKeHhVOGh2bUFaSFhTaE50eUkyZGVwdllId0ZCNG9sRkdYU1VyTmswdExrV1NaaGVrZzI2TElyZkF5ZVRnaTV1L2VYMEFBM3dmaU5qUmZtMkRyQktMZkRHUHZudFRtUkE4VUhsVnJiUGV1NGNpcmgxV2NGTGo3M3MrNUF3Wi81VUxKMUdQc25EcFhkTkZGSHhNdWdkTDNpWHdUYlpadFd5em5GY1Q4U2pLL3dUZHU1RVk0OEgrVHltL0RtUHRkdmVzc2d3bks5Rmx0NFZ2YWtaQk1ES3FSSmswcjFzcGV0KzIzdER5RjhhcmtCTTBoamVRL2dwUWtBcGhEdTQ4eVZTZUhtZFRtQk81L25kRFQzcFl0RGxCKzJFNDIvTlNTK0lmN2FsY3dGL29PSmhDd3VGcnRUUE1FUEdqWitwOEN0ZlNRc1pkbitWWCtiM0FxWGhCMkhiVC9PTmtzaHlDRE83dEdDcDFmRHdIMHFvc1hNYmNuN0xzOCtId0lRaWwyWUVMOHF3cDFwSU5lRzZ2ZGpDbmNMb3hBUFAyVVNuZVROVmVDMFBsRm0vTXJsbDI3MTZpU0hoWkthb3k3OUlPQmFab0k2Z0FnblhZZlhQamZMN2czdmkxS0Q4WTVqMWdCZUQ3aUMxZkF6NnlLK0hiQm9RZ2l3Y0lOVUFFeEV6VWYxT04xK1BzRGpobUJuV0h0YlM2elJtd016QW43TVd6OGdzcUtoMUcxNEI4K001SWp1Um1ieitNcjFFNC9wZDBBdFJGZisvV2h3cDBZc1g1UU43QWcxQnRpdkY5NDRrZGkrdVEwWmNKLzBsdlhwZ0ZZRldmemxUT29JelNKckx3aGRWQ3VLSWcvSUpZaktMb1NMSGxSbDhjT1hUK25TNjgrTXBXb2lQOVNrRHMzTnJlSkdwQ0dlZE13ZDRXQS9IMXE5aDE0MExpR1oxM3NrTU9hZDV1endnK1FiSlhoKytRdHN1VUhoc1RqRDhjckJBR2huWGk2ZzhrZUI1cGQrbVlxcHRKYmowOTlkbjRLd2d6bDduUmtjR2Z4WHhkTFUvQXJmVm5TUFRpUmFsMGNDQTdCTFRTeHZlQ2txUmZHcFYxR01sb3N3N05yVmp5SEpLOEl1b21VeXpGbEpFY3pQOXAzTGFCRmZtV0J3WitMRUVZR2krYXlHVUJ0dFNoWVZFaHVidHh4QXJNNjlDUTlLNDZzMloxbHBlanVYbkZ6RFZjQ3pwUWhqcjY2T000TWVVbWM0cW5FTnQxYnczUldMS3Y5RkJKNGZVL3Y5UE16TExZT1drb2JmY1BXM0VoNG4wWjRGZ2JWT1hmMkQ2QkV3WVNGVmJua3puVkMyMFBRMkxZcTdBNFJyWVo1VnBuTGliV0VLM1JEUjZUcWRSR2tGWU5tcXJHYkJNQ3d3bjBBbnEyRVljSy9MdzNIaHJ1eEZZUVE4R2Z4MkJQSkpDTWUvM3V1azBOY0UxZzR3SU01NEpodkszTE9QeG5aY09BZnFZQm1WYm13SGJ6Sm82Rkl0aTBUbVV5ZTljazRHbythZ0x4SFU5bittTzZ1bUdkeE9aN1BOT1psS0syWE1SRFhGbXBaVndXOHk4Z3UrckErUUh0Rnk4cmFQZEZGV0RVTHVocXJFZ0VodUhZMW1PRTJ3bGcwS2JmRGxaOHV5ZXBsSDNQVjZJYncvU3FLTFlyYjN5U0R0cEFTREVja3dPRDZWK2FPdERsZzZPU3JTVWwvaUJiTElIYlhMOWpDbG9ZQ0pEWGZjdXhvNkNhTTU5bVVJVGt0ZGltNmc3d1Y0cndxWmkyUk1ua0UvMDBTeDV6UkRyWE5ZckExY3hpWnVvZzBSZnZ4bjByWGJ1NWZqb2dUd0MvV3FZTzNiQlJjNzRia0xCVEJJTFgrcHRGTWlBVzVod3gxY0JOTnkrTG1Jdmt2V0pmNEk0c3hWZUtNUjVkbjdyM2tGY25NV2RDd2xqcHY1eDZVc1huc1Z4NHhEc3ExUUZ1YmZndXMvTEx2SkxXV0lrRFlQSUZjTG9IN1ZVL3daYUtLNURGYlA5ejdDV0UwZXNSTW42dEg4OWlsQ3hlYjdXTWNsTTZ1Rlh3S1ZsWnB4V3pYREZDQm9IVUtmOTQxelc3S2ZjUnVJUUhhcmdVTWtLNU15elB1aWZMNTZQSXgwTFBtZGFkVFUyV0ZsMzRxZm1sNHN1UFhIVDczUkNJM1VXQmxlWWd0TEwySi9MS2VIR3JVR2dXL2ZvUDIvMCsvWEMvTzM3d0pwbXVLWWlyalhpUEpPRnRRU25CWE5yUllIR0VxOHdsQlNacllQOU1zYnFVZTNlbkhabmVkYjdEYSs5UzZSUmFUZmE2WWRRYURFZTBreGQ2KzJtLzIzSkc1TGEra3gvTXpRdVBoUE1xYXRaejBtVm96djBIU2dBbHV2OVJHN3N4OWdjTVlBZ0U2TDZ1YzZ1MlRPak02WkFueUlkTjc5VWtJaHowVkpuakNUQzFYdW5mb3ZwUjg1Y01zU2RLMUp5ZWtxTmdDcHo2YnpJbUhvWkdLRGgrWG5yVnBldVpQVysvS3gxY1RZYi9MLzNRTnJvaGNMRmlUMUl5K2NZK0xuSEtYZ0I3cDdCM21qT3JGRVI0Q1JhUkpFRDlkYlREUWswdGRpaGljTno5US8xNjB6Z2ZGN0pTNHdxaUJ2R3NjWDVGL3VkTXNPVUhsSmY4VTg4VE1QNnNhM2VDYjRNZndMd04ycnBOdXpwbmJGRDR5RndLSVh0RExlZjg3RUM1WC9vbnJWL2MzL09wdCsrTER2NkpRNm9XeEE5SEZqcE1qVlU2ZDFXUWxsYXVJN2xrbkZIRGczL0RXNDhXVm1xK3ZTQXJsenIvOGs5WEJLR1hTWEdnUlVUeW1ESHV0MGxGMS9teGpzd05qMk5GK3MvekVkV2k2MFJSWHhtc21TRnFxODkySEdVckRMbG94b0dWWHVUM3N5VWVPZ3NRQ3RQc2lVU0hxWHBycXBuVXZkaEZyakN1N2NHMkw2WVVscmxqL0Irc3pKWFJXamczZEZvWERFMzhKdGpEaDJJTzdLR1FkL0FKT3p6WDI3TnlKcjJMclpTaDMrWVZmNkdsUWdManhTbXNLNDNrMHRNN3pKSzBDL1QvYzBNNTJSY2NXVlpJeG1OZGlXNWUzWEhWelRGSEl6YThRVlV6eCtXZ29ZUTZXVTVhVTlaSzhXL015ZHlkc1BTaHBBREhEL002K3NwMnNCUHBLckgxcS9IdU1GWHJBdG40bkJoZzM0NDFjdnd1bzdCdTFTTlpRU2FySG9pVnFNRVhEQ2JJZi8zakxCWjZNS3k2M2VtejhHaWFJbnlCSGZYSU1sdU1XNlpTSnBvVnc2RzRYZHdEZ1o2TEVLZ0Fqbm91dzRLeVJ6SXNhYTJqMFJJSVFFVm1mNWplR2ZYS1NUL1VJMElQMy9Vc2E1WE1pVEpOQVMxYTJuUXd1RXM4T0dvTFREMFRSN1Z6ZG5UbGkzRnNGNTNaOCsrSHhuL0JSeWg4VUNLL0hYREFNQXB6djJFbHlxNlhyN2o1SXlMQ1g5aVhwOXZBbTZlcTQ0WlZRRUpaUUdaQU45ekNYSDNOWnJNL2FySXBtNW9TaE5PdzRMNnhBK2NtWkdHVWRpOGRodDI1Y05iRmRQSnp0TlNiV21FMEVKLzZHM1BiWEpVMEtzdEdLbXJXRmxSSDVjRDRGd1lwWmV2WFBjc3UzUk9nSC9KRDRpVDgzb3FTK09ocUFBOC8vT0poYnFuYytlRXlCaU43TFdtREJqVGRqbHA0bTFHcUtzOFNTYVVLL2JIdzJGVVFxcEdac2JLQ24xTHJGWXl0MTM1SjZjdjhZdDg5S1dhVGdDa1hVWm1JeEdhcVdEay9aQ0V5bU9LdUpaM3BZandGY290T2owb1pBMVJvR2FDaSs4MHlGaUtBNHpVK21kQ2ZDaGxjK3g1YWRET1FTZlM1SnBCdFpnTW1mTlhrYmJYb3hlR1hpRjV0SjRXSXNCRDRWUXorM2VSUjdvanJ0aXFwNzdsbjRzeFRqQTdwazVSajg4bVhSSE9mb1J0NFBmSktiOWNkM1REYnpjcjd4U1JNUmQ3YVlsbld1WUF1TTFlbVptdGd2VUdjZ1JtNUdNck5XOTdXTENhd1VvcnZ6UEgxeGxET1pKWDBZV0VzUURhZFJOYUs0dERrRnhVZWo0aHpTMW8xc3M1VkJNUm45TElyWkVjcDRIaVdOU0JGUFhudEVPaWNRK3M0ck5RLzVmYUI4bTgwOU13TzZiVkhrRm9va2xzbmZzY2ZxRGtPTHplamFGNkQwSjdQOHV1aVc5Ry9vU2ZJeStudVZVdkpFMFRuVExSWnMvQ28rWTcrckphOSt5SUgzMDloV3NvMmFmRjc2Z3cya1cwTjlkeXJDcHdoV2syaWJUZzVrZDVpcjNZeUhUcGpicWNPM2xIL2gzRDdSL25qamkraHNPTE84bm1kbmNRTEdhWWFUUUo4dmdNU3h4M1FaMHhkZUZYemQwREFucVNvNE1jcWp3bW5mMWp5a0hvMXNDWU03OWlMRFNCbEZjcG0yOFlKb1RQaFFtYmp0c2lVaTI2c25DYVU5NnNFbVpaLzYzaEN4cmJiUlc5U0duZzhLZUxwSDRJWCtqVTdxODBMSUpvRHVpWWpzUy9ObC9nMVdwK3hVemtISkV0TTRaRDlOTG9ISTdNVEIxTVFianJOd3B5VndNMXcxOUx0a2FNUUtzUWNZOWZmdWdzZTBHMkk4c014MW9QbmpFY2FMTFVDbWZnZTRFRGNlWU9PSEQ4Wm50UU5rSUpoaHp5L1dEa205K2VHNVlneDBtK2hnSCtEY3pNNDM5Yld0RE1ObC9mWnRnNXhRRis1WjBPZlRBd1NDOEFwMHpWSExOMHpYbTVjbnpZOUZaUG5XY0pCNGNvNk5BWUFIM0lpZk1HU2gyWnFkNCtWVk4wSjcxNmpQRVpId0FKbCtCdDZDdXhjRERlTkExVEo5N2J0ZUFFMGdOS1REN05pQWhtZlFkK2w1MzJPcTkrWnBhbWNmR1NWVVhVNnlQbUNGaTY0Y1loVDhyanN5blZNMGNWR25MYWlvV0NTZHBqSFVrQ0hNMHk5bEkzczEyZ3lEdC9xcmthUkIrYkhLWlo3TFRicXpLWGJ5Rm1KUlRybU10MVZpZE5iQk5Da3A3ejdqY1BWY2s2dDZoK210aHBEc0MwcG1GS1k5cWxZLzMzbGNTQ3pEbXo2Ny9raWt1UTkzRThoT0xMeW5ObVlRT3FWYUdmZ0V4UW5tYmxVOHh4aExUMDRqVk1UYjMvcVB5RE8yTW9RYXE4dUNTdWdRVW1IeHQyUFRLN08vQ1ZTbWh6UHNOb1pqYmgwdmFKdjBoVDVXbEYyMlZjSzl3K1g2a290YVpUNVpsQkJuckJGM0hvQld0M09mYUtxQUkyZ29vbG1ZczFpanFIK0NvalpQOFBNcWNlOHNvcWVVenBnQWQwdXNUMlRXRTJTRitOQjNuZUMxRWZzQUQ4cDE5Q2k4aVFmOEliQkQ1eUN6NmFkdXlHc3lkRWVQMUdQeGpQTUtickdRbnJQb1dBSUZxMSt0VTM4Y3l1clh2cWJTYlJUMndlM1lmcGE4UFlpMTJ0R3g5S2daSFVJcFZDNnJyZ2VyTnd3RzBBVkQzSlNjTk02VnZ3Z2s1OGozRzlhNmJaNk15V3lKRkwzRGd4V1ZzQkRVUXRWdnB2RWtxZnlPWDFRL1dMOFo0VFNDOEpjWFIxSkRpWkVodkU2by9XWUlmcTlFMy8wKzRLY2d5UkljS0UxbUd0a243ZnE4cjROSndKOGh2dU5rTXJ0YVIrU3JyaWt4SU5LQ0Q4RE53YUo4dS9QVThabHozWFB6RlFpYmF5dTlrdFBXeUpqNDY0aE54Z2FiYThzOXRXbGgrNEQzZVgrdm16eXlnNnFUTTkyRml4L2VsckFuQmV3N0dvSkFVcGx4STMyMlQ3RUVBck9QRlF6QmJSR3V3eHo5NnI2TUtBaEF5VG5LNUhabDVUeVp3elU4NURJZHk0ZEQ4MFVTQUVscTBaQUc5eDlMR2JKQXBSVFJiNEZ6d3l2b0h2UXhVdEl6N21QTC9Ta1R4WndreEVCN3FkcjQ4RkpqYXJyVWloOGVIUVVKUHZUYzhuUVlZOHJSdXBxQ1ByT213NkIrTUtWWVdvMk52ZUdIN3poci9mT1dPbVZJNmdEMkdxVi9pTklVZ2dlNll2OEd4bzYvR0o5SHhQTzNMKzFNNmI0V3BNVHNDZnlCemg5OG9HcXByY2Jhai9ybjNUakNwRWYyMmRCcHpwZ01lK1JJMFRSa2ZJbWtPaXUvVVRKMU9tZXZ5UUdDRUQ5QjRVNkJzSE1GdVo4Y3lIMUIyWmFSbWlRdkZ4VklzeHJEQ2xTVkdCMDlBbXlzQUdXVzlIenZ1YlBTL1RMN1daVTl0UVR5Y0VhdVRZRE5PTVB5NXhWTFRicTNFYm54TGJ5RGpDQkl2UWR3WWY4dzRaMmhzcCtCRnUwck5tVDA5TlA4SmpwaXlXaWpncHQxWHpreVZyZ1NsbWUyWTg1TkVCVWc4MzRwaXl4YmYwNmNEdWs5L2RFVlJvRXJuTUxTZW5pZFFETUhuemQxRzZMclJDNmxTaFkwSkNLNVlrRm1mK040MmcySVlSN0dkWUQvQm9OVHFEZHFySGRka200eTlqRC9DVHF1cFRFQzlENXc2eXQvdlY0QWpLNGtsTU9TRHBCUjhzVlBHS3hxdm9SWUZGRlM5b1ZDUXhuWU16NmZFSFlRMTJhUHVmdEFwSlc5azg1cURKZHE2eU5tNm9STEhXNDhKNEQ2aERoWDJUWEdOUml6ZFpKMm9vSXVoNjFvMnpyVGd4T2NpbWdMejljSlNzMHREMnMrcEc1bUV5UVJrSEowL3dFT3p4TytBYjFSaWhEM0ZQT3lKSHV4TTRjY2ZiZUwyaFVIeEU3NUJOQmt3WlNwYWlNM3plaEgwTVF6MjBnSmNOYlhTNGl0QnZXeUhJV1BrRzdVT0xJRjJTVnZEVkZUQ1YzVzRUT0w2R1pUUXdhSEt0RVdxSmRwKy9xWTNFWkJtb1Y3K2Z0dG4ybHYzWG9GeFphZy9iazNjaXNUUmpmRC91b1JveVIzcjFTNzVKUnh5TXRCMWI3L0ZwaHVDOWp5N2JyYi9sYm9sZEhrSUxSK3d3L0tCWGJjOVpyMlVxWkJDQ3lQbHFreWtBM2FGdjhucWQ4TEM2WXZxZ1NJaGdDNHdLaFlCMTdOd2NBS2pXSndyRTVYWGc5TnFZVDErWDBUVktHTEJEQmhBVHA0cVJWU3RibTUreHhDcnhTUEtMODNwVEMzNXV6ZEZwa0lUaUFnZ0pIM3ZOQVdYaFE1Tk5UKzVhSm8xdjluVTRpUEpzQ3ZuRDhZN2tOMU9nRXg0MDFwanQ1Nkk0OFUvbmszSmV5dHRSKzE2NDNQYWt1ZlZBWXFqbmxkRmF3WjVMUVRmbFIxZEdSNURMb2szdGhhaGdyczVMd29oZDRRVkZ5d25IMENValJFYU1RQjZZOTR4S3pKRmJqL1dXUVFKY0hkMDRydVRqVlEvZEdaQ1llRjhSV2JEQXV5R2RhZkdEMHY1ejJHRGJiWXk0M3dtWlNlSERweXBnWGt4OFhIOHVOR3BMZ2F6K2ZSckREOTVSU1FtUGk1WUE2eHN3OHdYdlBybG5SSi80TEt5Q2NkVlNjQWpPK0NhNGE1RGtLMFdxQW4rcTJENTZ4VmVwZ08vRFJ3U0Fyck1STGlNZWxWenZxVGJoaWkxVHVCNkZJK01vVFE5YnpzMGxiTE9QeERTOWxxbnhPUDNjaUtXd2h0OUE3YWdiampxdVlrNGxCaE1MbmdON2J2Rmp6Y0ZOcHBaVytGZUFvQXVwWFhJaVUzVXFVTTY3aG1hVGNPWXhydzRGc0NGeEg4T0gzM0ZRVGdUaDBmS0xJeXpobFpLaFZnbTZwdldnNWlUM2V1VmFxcmw0bEw1eDNjOTZKVXUzeEh0blcwdnJGVUF6c29RWFI0cjZId1M4Vk1FRGZXOXJYU1FnUkNFbThZMWN1TGxGVUZ2MHY5Q3FUeFZmMDVWazA1eG5XRlpaeW4rZ0tSZVF6czV1d2JubC9OM0V3VmJRckFZeTVpdGJWQVdFeG4rNDNsd3BxT2taazJMUjAwWFpKTDBuT0lScUJvMTltWlBhd25ldlgyeC82VlNYajU4MGM4Y0tGWXNjVDl2RUZmZnRTZDBpUVBOSEhucjlEaWhiRVlHVWFJdksyWnFlWWFacEhWcDdsOGxHTVBldlUzMnJjS2w3ejA2SUk4SGNBSkEzYkJlSVJ6a0g3SXdURG5GWTNIVXhxN2FWOVlQRXA4MnQ0RXIrSGpUNWk1alBIQSs4QVUvRFNueTF5Qzc1RjlZaTlseXYyV3hKMlIvWGY1dlJyZGhDeVY5QVRVcGRWQTEwTTBHV3YyZ0FVZzhJS1hZVUk5eFlQc0hXMWxHUXR1NUF4cHpsUkswaUxYVmV2OGVHRE02VTZhWDQxQlJZTDZIOEtTNmtncWJNdlVtTk5IK3grWnMxTGlpdUxTN01jQ043Ui94ZnFxNGUzbWNCdGNqTXd3OThHTEVsZXV5dDdwa2R5bEV2aXJvY1NDcmlQSnJBK0NBc1l0Y0N2UGtLWU5uNmVENkRZaVNpZGlyWVJ2dW5qejUrWUk4RFU4ODlaZS9rZ0s2N0NjZW1valVHOXdpVkw3S0xqQmgrcjFCQ1RSaDUwOVVsTVJKNDIzVm9CeGVSczRGVnJOS0hnWm9DZG9ZV25IYUc3Z3FuRldEVlUvQWFvWFhRblJiQXl1SXNCMWkzSlhvbDFvSHREdnFnL0pFWEQ4aFRYcjJnOG1TSjM3SUgzY0x5b3hmR0lPOFdHMEJXZTQxMlBhcy80OE1SY205Z0N6R1NmcVVLNnNXZ1A0Nk9FTjU4eDBUb1NOVW83S2hLT2FITjRvbTNpQU9lRGx2MmhyVnBGM01qalNJMWhiRTZpUjlnejd5YTU0N0NvZkFjL2JJYnoycHNmbisvSXdONC9RTmtNMGNOL0lxL3UyZVlVQXJtN0N0WnBXZmxtUTlKdlZaeTJiUWg1MkVrNzIremRHREV6c1JJaFdHZUt5SStmeDFtdS9jYnhyWGY4YUNyVDd0OWNwYVpCVXdqZkE2ZnpWVWtpZXVML3ZIR0FFdkhEckxPemdNYTB1T3FiY01McUNMQzJZdkRJcU1uS0w5ZDJKbitwYkYxbGR4T0pqOG1nejNsSkE4d2pHMDN4TVZxU1VkaEFEOCsySWFqVy94K1p1b2dzc3E4M2RQQXREa1VLYWpwTFZ0TTI0cko1bUNLVVBHeVhRc2RuOGdOVDJFRG9qckhQdXF1aGJISmZteTVzTnhuYy9iK2VCY01zcTV0N0tsWWpZQXgrUzd6UkJUOHFodDk3UEQ3Tm15QzA2bi9sblU4aHJzK0VSdHRmYXdaZ3VqcFhzdHB1SUhOV1p2c29RajJTZGVja2d4aXZHTUNpaVg0cEVmaXRmNFZLWVdlaHd5NnVzdFF0am5ZN2FDaGh6a24ycitSSFBrb0lBNGhsSTFmcE9yRUtlYVJ3ckNNYjBiR29JYWxPWFZvOXZPWTZRbWNnTTR6NmlvdzNyL2x5SWtOdnE4RWhKWi9QVlJtVmxDVXBRSTc5VHYyV0tLVFV6alRaRmduWEJZaUt0cEhPcURxTjBLRUxwUXNZSTlhMkFPZ0tyVlBPS2VJREFLU0hWTlFnYlNBVjdNREtTTlZ5ZGtNUjNId2c0TWFrMDJVK3J2RFJ0UUJQbUx3OUJEdTEvVUpPaERQVkhmU09nemY2Y0x6U3lkSjRJRk1DM0w4VDBiZ1h0SE9jSXBkWXBwaksxbEViZDFMZHJ5RU9PL3cxRTBxY3BldkNBUHJyQ1NTdEFwTDE4bzBmd2tobUwxckNRVThPbE4wUVA4eGw4YWxQRGw2WmRETVBvZGZwUkp1ZXlsaVRKSDY1TnlOT0ZyeXorQXBqYXRXNmRJTzVFakh2K2V4TnBOY1I5d2JlTFJwQWJaSWVvRGVxRk55RWYzVldaOHA4SWNiaGF0U0xlMlpGRlJNeUd1RlhBMzFIWHhGbDdraGRVRkdnK0VGWmVPVnpLZWFpSVdPOGtib05SenZsTGp1WnpqT0JidEdmcm42cnQ5b1EzR0wyL2o1N3dKZXArYXVxLzlFV1F5QVRRL2N0WmhWdUlyWUtZVFQvZVlRTURwZkpIUjJ0OVV5UVFLVFNjSVcwazJhNDF2cVNjaTE4L1FFakx1dVhvQVNmZlRVdTg0L2MzMkh5elhhUEhYL0crUnBrUS9VNEcvVUpNVUJEWkRhdE00QXNmT2dXbkpNTStHTDAvMUp2OXl1aEVaZGpoY0hVeG10OHhzSGVhT1RZdEVyNTU0OUZ6WVM2aE1obW84em9ZL2QrbkVFWjdLNVpXY1Q0VFYzelNxdUhjaG5rNFZuOFMvcWh2OVl1L2NZMS9xbFRvTDJ1ZHFockhsNkhyVFJ3cnFJcXVjODJFaXJISEhzRGdiZGlNWVlTQnJNdldwNGlaRW5UZmQvNTJpeVdzYVVFWkJxazRoeS9VRXV6VnpTV0dXNllTc0FmU0pFOUNPLzBKMGhuRTBWVXBBSTBxNXladU9UdU5vR0RQQTAwejRHZUp2akw4RDJ3MmFIRlRvY1lKTWJhZHd1UFpud3pEQUEwdm85SWQvRVAwQmQ1WlNlazZaZFkyeFQxUURkSHd4YmphT3RxUXZ6Ly9mdlM0eEpDREZybkYzbzdaQXF3cWFUcCttS1I2M2NSZWxzWklJOGRLbjJQL2drOVV2SEU4bEt1cHJZckpOeWpZRFgwdm9za0gxYURyL3RMOHhpbkV2Uk5ycXp4ZVFyN2IrcTNjRENkbjRmVnFtN2oyV3VEZ3Z0aGcwbko0ckl3ajNOZDdSY2FYbXE4Y2dXc2FmWFJkNXl2d3JaODBSOStUWW9adndwcS9WVFRZUHdHVGNnUnRtWlFBSmRnbUNTakVCQ2diTDA1cFZHOVNtM2JUYlN6dkdpaVZ1VDlzTmZEM2xrb05TMHgrbW0zUTlRaWNJRHFMVEp1VVhsaUNTdGRkOWRuK0l0emVFRkVTZWJTL21idW5EQ08zUkNua0ErbjFxL3dVTkJNOXBOL1JCVncrWkxWbDF2SUVKWkZCeWxhOE54TkxaSlBGT1pTS3JPNU51WTErWnMvUXhTaWE0bWhSSHEzNkplTXljVHpFL1dSbzgydjF0UktvK0lIYTRrUzlvQ0c0V1Fab29vM215L0hzTU9UVHUvQTloZnc4ZG5yVjV2TkRNQzRBck5hYWNTbTJVd005ZE5pKzNyTnFtaEczcDVMTHlwc0p4Qm1VbldldW8xeVVNb2JqVEcwOXhGTVNlNkMzZlZIYTJ4dnRvMDltTU1IUzZoTkIrTllpaHlhTWRQcW9jT3grTEpLVkRrakxCSk9tQjVlbDZ3SHpVNzJyb0xvaW94bUFram5Ia1k1cnk4MkxiYlVTUjJLOHpzTE1VYkxnNTFIRitzNmxwNDdJNmdrb2wvQy9BY2lidVV2RXRKTHJCRXEvak85TzlWb2pOdGJsMjhkZi8wVWJzZ1RDeXpHcitJZzRQd0JtdFBVKzVXRVM4Q2pxRFZMUHhxc1c0UVNzaHpESk1TOG4wVTYxVXNhd2MvVGIvVm13SktuZXJONFY1a0RTT3JndmpzdS8rWTZLSWFVM01zN05DRWpBcUxHNU4wNEZPbktjaDRKeXpOZGlZK0t3L3dwdmRMUHhCVkJ3RGNZZmJtRUVlTEtUa2x6dTNyajk5aUFKakdWTUFmRE5TclhVSlRVNnI0VnhGU1lvY3ptQThwWE96QlNvanZaOVNwVlZiTmxEZzJTYm10SzNJNy9vZ3VUb1Q0cGVCYXBMQ0JtM3haTXpMODdidG5TVWwzMG1NNlRGSW4zYmdYaWxjQ051aDBLcHNyOEhTYmN1RUpOa3Njc2dPeC9VZEdySWxpRmtYMUlRYmxmQ05RVlZKbm9SM095SDJkK21SNVZhOFJGKzFYTXBIbG93QkR6anNBY0dtL2dXSXVwd2VZY3Z1V0QyNDRreFVoUXRQaVJmOUtjd0lSSmdzRXNaSVUvV1VFa1lnUTkwMEtaWnp2REl2emJZNHFtcWIzU250ZldrblZaMXJXdVBLTzY1ZTlmNHlYZTZCL3ZvbUw1RDVyQ0xiZ1V6SEhVVXlKQ2xiVXpON0VGRC9XVW9vMXRKY1VqdHdKVkwxZmYvR2pvb1p1RWd3Ylo2eEozdFlJQ2hsUHRDb1doNUFSekI5ZUN1dTEzOEkrd0hDMWY3TnBVMjZLYzRlb0k1YzBuL1k3WlRTdlBGSVNxZ1FxUVhGL3I4WEtuV3BlUThFQ21nOGFFakZOenFvSkVtZ0JWRE5Gc3BPN1FsOFAxcHFGVGt4empzSEFaMURraHVlQUNzTUJCTmg5R2VPMXJNMjR3aGw1Tld5OENHRU44M2d6WE1rU3VDeFZ5Y3JTNW5tUjM2WlYzcEY5aGswOG91MDV3b1VyWnVLeFVTMzMvUVEyaHpBRmtlT3VMN1RMSUQ4K2FnVjFVdmlmQlIwTEwwWEtzUzdaRXFJU3BwWjlTWjFJY3R1MllKSThEVzJMWmdCSHM0U3ZSd2k4dXI3YVdmWVM5RnVQSW9LZXd6UWxSbnpKT2RqTlZoRWt6dS8wOXk2cUVCZ09VcmRkRmlVL005dW1RM1lFR0xodnpWeU1kMUlWWk9lSk5BdE1MdVFsY2E5ZHJFVTlpRFRwdXYxUkNXRkZITEJkZ3NVck9PRVU2Z09vakFvZEJOc3hmSWVKSWNrdGtNS280S282Y3F3NTkwYVJVL0VOclMrbXVLRmg1Zms2c0wzbXNTZ3ZwYTcwdmxsZ1NIU1BZRzBnZUVBVW91c1V3MFRKaWpsVmhidlpSVkRtK0cxMDlIaTFFamJaM2RaSWNDSnk1OFFIUWNnQU5xRXUvRWlIN0RYTEtOcnVXNklqeDJac0c0RkxxNWVXSVlNTmdSR3hpZUZvdWtWZHMwUklNRGVGUjFSamgxR2ppOHdINHYvYWtGTnVBaVlOaENqSE9wblBtRjc5a2N5dzMxVjErQnM2TnQwWFdQT2tCS1gwWUdtR3lmTzFKYWE0SXRJU3RiTXJZZi9OZlJsb3RhUlBUcnI2R3FaLzByT0NjMjRPaDA1NGNHei9BU1pyV0grdTZhcTBXWllQbTNma2FjTUtJVlRVL3pNdW1KMmJqcytyZ0o4OWVDcFRxUzdURFk4MnA1d29EbmZKcEJ2ZGxnZE9LTksrQkcydDl5cEszM1dzVWVIRC9DSlc1M2lueG83bEVJNUV1ZEVLMUR0bXl2RUk3N2pOUWZ2Z0RRMWd2Y2NoamtVWGpPY0taeVpEbFhXVzdiWEQvMkdCam9tNTNOWk9vWkRFZFdBT3Q2QzMzMmIzU2tUMWpvMjRMRjVHZWZLY1d4a3FZcjByUFpyaTJ4NlJtUEFQc0RIVlNXSS92ZkZYV2ovZndJYkNxQ21qQ3JXajlIeXlvaFdmMVFCTWV5dGhkVlVZUythNFlQUy94NExzeFRlK2tmVUNvdlhhMG4rT1ZicDh1MktOTDM1dmFmbHg1QUF0L1NFV2lqYmU1QklLM0UyeGZKVDNhL0IyMWF3R1VSYjlzSUZ0Si9ydUg1L0U3b2hCUk9BL3Y4MHloeUtQSmtDYlVRRzZaNTE1TnplMmZ5OCtYampSdFZEYW94dWRXeHQ0N2hyY3lzODFOZkhRTWxoaU9HYzVjaXBHMTZMUW04amJNN09jY1YvVEpGdmN5UTg2R1JPM1lEalZiUS8xOXVrWVBEcUE4YzYwZnZVMDBBWUJJWk94UWZuODlmbE1vb2hIbDlhdW0xaXJ1MmlYbFh6aGVqWC9KR3B2aldpOXRJY0VzVVhVVWdJU3N4WTQ4ei9Hd3pNRUZMT1B1cmtzTEU4bEFaVS8yRmJYekt1cWZoTHVYK1Irc2hOWS9qQUhPajFjaHg4SFd4dENQeXBpVllDOFhNdmtGMmI3MXZzSjhRZXBTbzArclR0bG1vcmY2dVVYR3FiRW8xeEpKMTlZYmtBYjAwaE9uYkFjRkJaMmdweUdDYVN1OFJabEpMNVZQcFN4UEgvbTVSK243STlTV3c4WGowYU9kYWMyTncwOW5YaHNMWjI1K2V6R29CL1VaYWNYdDV2cll4cUZGbnhqdXBRMTlJcU16Qnl6RktweVN6aFVkSjI4VU9NZTFGbk1hZzNka3V6TG5Yc1REQXdsM3FmcjdyQWdlMnBnZkhhOTdlRnIrOHRrOHBOSU9ocVlFZzZtNEl0N2dHRml6NDJQa2dJYWFMaHJQS0YvRFNUT29VTkJld1QyUFdyOWFqL043MUU1eXZJUmszQ2pNMXhaT0NRbGk4cU9nVUgvczgwQytTditYNlp2aHJhaGhuK2VSTndGNjJNQ0oyUmd3Z1pzSzdsVVlpK3FlZk51YjdZMzlGVVdOY3NwczVMeHRWZTNLYjZBOGZDeVVyQkpEZi9TaVNsZEsyS0pKL0ZlQkMrYzkvUi9MTytNdGl3dWt4NEtmcHoxb1IxR3FkVU1tOWVaTzJqS0hvb2lUYzBoKzMzcFB1aGppUEZGUGhlWmhXMGlpdkE2NDROZ2gwa04vZzBjR0J0VHpORHdhdGY2R0p4ZTVPdUxJQnJhS083UjcxUE5sRzJUTUtmRDB4QWdPR0xaTjRLcHIweGRsMnBTVjF1TjVsbmFFWW9hemFIMnVTUmRZcWNjV3VodDVxOEJVYlVPemt4KzJib2pjVDZTR0h4eFo3b0dVZlZoYmNkenVEOUoyUGlPbkdQK1Y3bklMamhBb2VtLzhVOWRzeGx1RjFtVWxaS0p5Z2x1dWVNS2h2ZHIxcEllQ0ZEYlJSbzB5Y3NIZjl0Nm5hbWN0QysvSzhMcnlEaDFScUhMYXVCNHNrOU1oWEl4Si8xUjQxdExVcXVoZm1SRjRENngyQU91VjBBUE8yWVRjMTYrSjJCLzhmdDVQK0pRSWhhN1R0bUNTUlR5OVhWRGs5NHdOZS9QcTVQQ0RrRk9kdzROM1hBdUNhbEtKSFlDQWs2b1FUYVYzVmR3dmxlWkFqTkpNdkc5czI4TlpyTDZmK3FxRmt2Qjg0RldEREFldjNoc1FZU0FaRytIbUhWVDA3a29oMjB4R3NyQUtGMU9kVEF5MFVESnRKekpnejcyaXVudWNPS1FUY2lnTExoUG4weXY3WmVXeDl0dVFlWWtiUGJkS3ZydlNJV0d5UDNod3BHN1RlOVFBSWpXM0s0YnZkZGdBdm1zVzhTbGo1KzN6WHFTcHJ3R0wvUDdwVzR0dmtvM3hvR3RXVDNPWjR1dkR3QzcwWTc0ZHhlUDh1bHE5Tkx2SFBuVFZiVW5ORW5HTS9NMm5JeEtBOENWMi9NeG9vNmE3VGJ1UXIyc1EzNUtKMlV3MFZFVU1JVHlDRmdOVjF2NTczZkQ0SWk0bUpLdXdvY0k5a0tPR2dBelRqQ2VVakp4N0dtR1BSR1UzVkR3WWFBNzdYdEtvZ080VmRTd2x0Y3djVHN1QTlsVXhac3RSMDVqd3Z4VXRHbjUrMHN5TmhUK2ZhZFJpUUNoVFEvMWt1VzVzcDNoVnI0RW56NlJSS3l6SnhYWXJCZ0pWMEluaVJVU0E0NUhjZTJiMFpZV0FlV1dsZTdpVWY3KzFzMC9EdXQyeklEZFVVZFZLVitLZm4xalZFbjRNWTA3ellPTE9JU3gzUEMzbi9CUEo5eFRwMC9RbEZzUS9jQmQ2dE45QTV3K1RTVTZvaXNaQUhGRWc1eUZiKzJrN0hzUjJkTThPVkxQOTYrZzFaTVBhTDZvYzFkTXdLZFl5STR4bVUvaE5EdWRGVEhCS3dnanU5dW9CK052WnZrLzV2eXZoZkNGYnB3TlVJS1YwSUxnQ0YzV2dxWjB0Q01yaUNnODJ1UlA4dFBaY3hybjlpUERmaDZMcHhLNm5DR0J0QmUxVXI3c2VpU2lXaDluTUo3aElrZTJOQWRndXZxRUE1VVFTZE90MUhRdkRYM0pjdkFIQWRGSEVKd1RobFAyUVhGSkpLSXpBcHQ4ZUVnbTFsblVoeWJzMlN3MlBKYTJMdmJaei9kN0F1TEUySUdiMDB1bDVHZjBubHdGM3dlS0UxZEhHclpIRFRSdGVpQzhTNkhSWllaWTRwSHBVKzJOMUlyM1dIS0pqOFZOUXhCZDgvYXNJYlQ5TFMwK3BxdURUanVmNTBCRTI3TzJRcURLL0tJVW10aUs1Znk0aWhVTEdVdjYyTDJnemlFZUkyODF6QVc3OWo1Rnhwd0VYZ0hxTnJkNFdjR2N5NkJSUGFhVUVKL0NJbnZQTWk1Z0Z4WXBJYWFMQmtQL3BzOVFuQWhQNFptTXNYVVV6aklaY291Wis3bHRuUDd1OHY1aGpDNzVRU1FnWHVBeHV2ekRiblRPYVhRWDFrL204a2RXVzRWUFFYL1R5Y29nZjh2VG9kQzBPUnBCZU1YUDc3UHVZRFNsWDJVcGF2R0NMTmc3d0kvM25ZU3FCaGFOaGt6UHNwV2w1Q0JBSjhIY01rT2NXdEdPTGthOFVUWXRiV2JZbzFtZkh5VmhNV2h2TlpEOTB2amR4SjVKdVhCZ3lmMjZwNm5IcmlsbTBJaHBFeFdrb1BmaFZHSUoyN1FuYmkvTGszaWpKWHlKRnZXLzhzcGh1dmpQMmZzVXQxY0piWVdleCtSZkNNektRcE5TTE93ZzIyME9mY3Z6Y05VRGNvaWRROXpXUkk3cnZtY1JNbW0yMFR5MEpxQzd1U09Rd0Z3L0k1L0QwejBsYm9wK2x4STJFR3ZpL2VVWE82SGg4UEdEMzgxRVdobUVmOGEvaWZEYmNSamZuY0pLTGVKdmZNeVRIT1AyNGZnM2xGVEl4SENDL0RwN3Jic2VrUGJEQUl5b2Y4L1FmQTVjZGJic1FlV2ljZkRPSEJZWmRjVTdNWHlVRG1sRWtTdmYzdlYvUWV1R1MrbkVKcFdZWGtLRUN4MGFaNjE1T0ZYTFJET2FFYXNsL1dXdnl3NWUvTW1PeTIwKzdZSmFtdFJCSzBFZkxVQk5saHlDRzFZUTAvd2hjd05Kb01WZ0dlTFhjMFY3ckdXakx0OFNMS2hJVEw3RHJLNU1mcDNzM0tKenNrL1hCNmtOZEE2OVB2NzRPYUJiclpLaVVGMlloNkt2OFhKcTB0d255Qkk2RlNRMUlZNGxKZkptQXNibDl3bWJhUWg5dHpXWUtEaDJWT0lkQmFNQm1RMHBya3dQNUFiREdpbWJrTU8vZDVaQ3Y5SHNSdGdTb0JMUENLSGhKbnVLZzgrUDllR2VKVVdkMzg2NmxOZ3NjWXo2b2R0MlFxdjVWcENWNitEaVhLM2J3QzE5Zy9DVW1FOElLN251WThkd0FIc3BNQjBnZExaOWFnWG5YQ29kOXZVSDZJRjZmSVU5d0w2SWhTdVNnaHFveEtycWxwbSs5M2FMME1YNEp6d3k5amNyK0lWY1ZnRU5OM1VGS0UvbElESjJCZHB5NG41cTJVOU4zdlk2dlYrSkdpd1ZrOG9VelZkQVZDeDhTYVVwcUNVL2oybXpvRnZMQTc1MGFLL0I0elhka1hRN0tJRDlZbFZHSm4vWmcwcmVrM0pKcHNJQk5vM01yUXM0bXZCYmhmbUJjb2M5dDRpNCtlRFFnV2ZvbGsrazNiUVJ5YWFXTG9oWm9MYWN4ZTY1ZVJZOWMwOWZnaGZyeVdxcnZzR3FyOVBUWUV2NERjN1BNQTU1aVN0WnNyc0wxeE5nOVNFM1MrZzg0VzZjQWJuU0hobnhnaHNMN0NEVU5nM2x6MWJPL0h5OHcxL3BTNUp6bkhaR3hOQ1NiNW9lR3RaN3dCSEdHU3dXNjFhOXVLZHhETE1hZGNkcUlEV21EejFXZ0dJR1VWRG1MTTlXSUd0MTgzUmJHUHQ2V3IxVUxJRXV5YnBUTEZaVVJYZnJnRERCdXZESUJNTW5TOWxZNVRnREVNZFIxZWZSaHRFazZoWVhHY0ZUdURpUnFnMmI1Vm9jcm5YTlpOTWxidmdWNWpXeEhFT1Q3S3VkQXhRY0JDMWVKbUxaS3lFazc1Z0Zva0k5OWtnZVlLTzN4Sk5GeUEycXhvaVhFQWpnOTJGUzVQNEU3QTdtLzNwVmIyQThTUHZxUFVHbzJZK2poZ0lWNnptQjBvT0QvWFoyM3BjQU9RVjN3M3h3Tmo1bVgyUEllTmlkRFRSZXhDc3UvVGVFT2VKZXJvNVpVL1lwQmQ0S0M3Tm0yMDdIZW1wU1dpTTFEUy9nSWZXWXJuWWZ6RFZnWjhSb015WWVMdXN1eUNyd2hCOXhSUCtiM0VFbTBDNXBNZXc2WVZ3NjdaWTIwYy9TL2l2MDdqSGc2Qzd5Ujh4eS9wT0lZeERscFNmR09QVXVrK05tMmtkNTBLeTBBRkM1WC9jbTZMVHVOQmM4ZmkwSDJ4TGhlMjl3Rm5wTHZtZ210UlkveFNRcnNrcG1JK0s5dnltWlBmMSttRDByT1o2ZGIyM3BOb0dRaW5tM2hjNFhxS3NnS2hrTVU0cDVqM1I1YnNYclduNFNndjM5SllmWmZTWjBGOG5OenlROFJXNnJycm9idUpDT2piZHJJVi9pUU5uVTFlemdqQlVlTllpU0pKVDBKMDNPSCtNVTd5LzE0TFcreUhYZFBEK3pLMDdieFN3TEVGWnRncEM5L2toekp3dUIrMzdKK2tSakQzRlQ5Y291VmJFV080bDg3QllXcWJPKzZwVXl2WlFlM1kyZVlSY0hwc3pzRnY4QXlhVGtNQzhzOVo1M3dmeGRZa0JWZ1RKOFhjNFFhK0tEV2psWjBGK240T25DR3M0cmFnT2E4ODhDcE5tRFBDR2F0dEFJUVhBWk1ybFJ0emZZWmt5aDFSQmY4TjBVZEg4cXNCaU9GQ0JzcVlieEFRWk9LM29uK1lhQXA2OVpQRmxlTE9EVDVNZjVpZm5ZWUJSZHVEbUlkVTlIMVdOekZHVFZzcDNKOXNiZzB3M0I4R3djczRtM1h4T2QyNWxXMkRBckNDY0VOK2ZRV3VYUE0rMUU2cFdDbmhSVGRwVWE3ajFWZ1MyT3pDWkoyZjdPR1A4MzZielZkK2Q4bTIyOUVEYWZEWHRkUFBQd2FEQVUrTmR4RnY2aHhZS2FsdEJJVElhZXdPYmpzYVE1cGlxN3p2UnYrQTZ1anF1dW9vUEltWStESG1jVy9venVua2xXOEo3NGFWKytCUGxoa1VTR3VKRFRCYnZ0NHlWcy9ITmYyaVhGTVdGRGJlL1hwRW1OaExobDl6OHRKeFR2TDJnZXU1Q3ZMR0FQQklyN3RMS3VIcnlqc3NVcnZOSUplVXMrWFNiMDIyZnJ4WHN5ZmZsbkdQaTNIS2pRZU1icFJyeDFwaEEzcWEveERRa1VOODdjYjJ5R0I4RHh3NzdOMXNqZndpdGtYbHJpMGVVMHBVWXVHWDNCZlphNCt5TmtnOUV4UDI0OTVCcndHVjZQUDRiUDJ4Zys1dHpnWEs2c21XcW1uY3p6Tm5kSm5OK0JVa0IzOVg2WVZVWDF2dm9MUVl0WUJXaTduRDJ5SWY4TlVHM1Vidmg2amFpN2lGWXlPak5RU3RIZHdoNnVXR05FVFZJNjJSTXgwTUJzNnN1WGxuTUZYTlc1NUVsYS9CZUM4d0plZmhpd2JSNnpZMkdZMzZaVHhRRXFlNGd1czFNc2x4azEzQnFpNHNHUEJoekM4Zml2TEJvcmtkY3V2bXErMGdSVDdyYnhKZnpudFRmc1VseWoyZUY0Vlo3TC8rcE91RlZzUUdRZm1nU0RLZXRtY0ovNE16SjJjV1YrNGFoYUVxY2cvSER2emdjcGxINDJIc2EyUitNZ2treXRSNGhTWFRuZ0xMVXVFallHUEs3b0ZBRGhYRHJhT0xFYmJNSDJXV0dhRHgvMWk3NXJBeFBGYjBkbEg0OVNZNjVGZmIxU2JUT3dSSkd6Nmc2SmN0bTJCTXRQVlJvMlh6WlUxM1dxeVRBYnBkd3JiWXIyTjRVZ2RSdzV6ZGc1b3JybS9qVlBHbGpwZzNWM2N5eUU0QTRrQnZGaDZvK0IrVm9vRk9nWjVyMld5WkVkR3RtbENpdXFIQWlJdnhMVDBSZ1JxeDh5M1hxWVNRTVFwK1VkbCsrTkZ0OG5ZR2tTclBmcVFaS3JiNzJlRy8rUUNuVkJZSnRnV2g3Wjc0c3c1dm02RXNxR1FmZFZIdXRDMW1FN2NCUUUxZXFCb1N1U2tLSDlQS2VuQStId3hrWDl0dnFQMWdyOENRZWMvN0NjQmxCeWV1T2k0c1BTRDIza1A1dlZaZ1dVMDgxTk4rUEJ5bWVmSjB5VlM3bjNKNkt3UmUvQWJzNGVWTHo2dkFZbUdVSmRCYmRwTDB4UDlRTkVQZk5oWldTSzVVcjF0ZXo5cklUcWJtcWF3bVJjMWxzTXMxaHY4NUpwdUVrcEJuSXVERndKWjM5OFgreU82YnBsM1l0YlV0QXRJSmthbnhGZjJ2ckhkWDJWUFZoWmN1N2h5V01sK2RmOEczaDZOeDBmR3NuQTBwL1BQMXA3WlhCL0w5MS85ZkF4ZzhhaE9aQU9NTytTemwwT0xkdVhvazFLYitnd041NEMvOUluMSsxSk5Xb3JZQllPSEZ3OTVGaXhTbFM2dWwvVkRxWUZXc1ExQXpSZEdXRkthOTUrbTdTVGNZblQyeFhyaXAxckN3cDcrRyt0MXZna1NDekxRUjFNVDUxTHdJRnYxb3hvSGt2UGJXUmU1TkNjRURvaGg3R1FSSVhTOHM0L3pycGtoSHhzcmNHaVB1dm9DYWdJck14dlZyeG44aEMwdFpSbnVtYjljNGV1azM5YytqdFJpa3BmemQyb1gxWDlSaURHOWY5UkoyMGZ1d1BPRVFsVjk2aC9TVGNmVEVPRzRrQ0ZxczRMTmpDR3hPOERzbzIwLy9NL0FOWENaNHZGeVViSXFYTC8wZkI4cTkrdmxnaDB2Z3VXcUxNNWo3Tks2Yy91Z0pYUHpoZEM1am4wOTJmYnZuQXU1eTNlTUhDeHRhUmhITHVWODdnbWtaQURma2RIWlIxWnhLampLUUhFS3VWOHFRR0ViVUswVW1DbnltTW81cnFnR2tKOUc4em1oQXhyYWtVN0hURTRiWnFnbjRDRThXZjhaTS9NOTZ0MUMvTTZXN1I4UWRmMGUyOFA4WHdDT1B4Mm1wYWIzZmNlK0hWRFZZNDI0SDBaVndCMGwrYWFIVGdnMVBGWmMzNVlsYlpkWXpOT0hUMnlpMzZBUVZsS3c0Nkdad2hLQVFsWDhRY3lRT21vMm45NTdOVEdwa1BWb1ZVMWkvNC9jdnY5bUJTZmtxbXdtTGVRS0EzMnNxb21vNTVrcXRnNCs3R0FZd3NDOXA1UE9FYmZZYkZMbTBNOEQvVTk2UjJiYndjMnJWQmZJQytMZ3JRMW44QlhuM3FkUlZ2U3Jqb0gwZ2l0NlR0em5TNHpuUUNTd0dNa25BUWVjY1NoK1VEcjNwYkRTQi9yT2FpN1lRWGMyRGVuOEt0VjQwbGgzMysyMDh0Nmw4TkhSYUNLdzdQYjNEMFQwdzhaWnEvSjc0MjBtempQYXpEWktaT0VZSDB3ZjZsWHBnUWxDdExDVGh2QWZpa2xxc0UzYms5aHRFbUtMN0hpMGsyUmhCdHRLbXphUUxaUGZGVjFCWE00ME5QZ3FxVkQwSU8xWURlUkJrV3AyMjhlZC8yYmJJOEVjWER3KzFpUGdWZW1WTGh0aXpKRHpIamdOaXA1RTlTYnlRUFJ6d3V2amg5R2x2ZVNrS2FLZk12L2MzZ3luakZSck1vZHdTcUlSZGs5R2xjRldZZWlUdDQ4VzNMaGkzQWp3MnpvMVFvODZQVEZRdTViT1ZxTWpiTUg1QXU3T29tSkd1amExdE9CWTNFZ1A5QzU4VjN6ZFlUN2NiWUZBdmE0Kzk4RFkrUDBIRThSSStwT2VkYUswdEdsVXR3NDNjWk1zTTRFb0pzRTBRby84YVUxS1p4YlJKV3gzeXk2bUhod0NqUDFyOUxiOFlzamVGRTB3SmdQR3lldjFBUW5HMG9HSGRLQVl6RjV5ZEdjWDVnQUR0ZDNBYjVadkdvZ3NOWHNiZXVLQU1oSEtlZmRmSkxZMndQRlViUjk0cDgzVThhN3J5TWp1Z1hCaE5hRVp2WWNrQkR3TWYvVCtaaGFVNEpJSGFOeXN5a1F0amhjUU9DMG0zV1Q5RFNVby9TN0NmelVnMUFhdUhYeVUrWlhjTnQ1QlBlRXZGSDBKOWpqR2luNFhoa3VNSUx1RjNhZHB5VHc1WjZrd2FsLzZWZVB1STBaNy9Qemg0ekU4a0lzTGhlYU4rU2t1U1NwWVBzcHMxYjhGc01TeEFWTWhIY0V4RytlTXVOZU83bSs5WW5qckx5U05wclcwNDRBZ0FQRURMeFJEYkdZVDRFTUdHWGZlMitiR0ZCaE1PazhpQk0reldIWTBwTUhoeDRXOXhFWm5aOW1vb3VnQnphdCtMQUJnUWhzZmZPbmcrMjM3WHB6Y3RlRWJsT1JzSFBHdk9UYlJiZFl0TzdUTUVlY3kxRXFEUWtPZzZVU21PRkxpV09rbEdSam9MTnA3MW9lRkc1YjBjN0RubDlsTWI3NXpNSGRXZlJtYnhMUWVMbkJGaWFMVGlHUXBjN3l2UVR1WXEwUmNQeTVIditPNGhRSXV3MElFZnUyUU9pdTA1cTNjUCtlMHEvTTBQZ21UR1JCWlJlWTFSdnMrdm1LMW1RZngrbUo4czZodklnUGNReTd0LytocVJUaFBMT1EwcUtmOXFqWFNpRVA4ZVN1TFFZYWgxUVpsOEhuVTBhNlJleFlNZW1vR1QzdmhOVHdTT3ljNzRhdjhQdE91R1dzYkMraTZQZjR2VVo1c3Z1ZjhkVUpDY0V6V2ExVXJDL1RaL29HU3l6bXhyYnpwNzF1aFdhRWg0VTZlMjZkendYNFhhODJnWnAwdDlvekhlUmVDZEZhbUM4Rkg2ak1kSXhFcy92THc1QlZBd1BCTFQ0MVFTL0ZiaXZ3YXpGV1BCY25VZE0rWVNNZS9JTVFCR2trRFBTWUtSNXgzOXRuMnRlWE1KdGMzZ2tKOXZEa3IzeVBxdXplNXNsZTFOUVF0bldNS1JrOTM0UTZ5Zm41dVdzbEF1aW1JMXhlckx1d3JzMS83bXZYUDMwcnJkemxJNU5iWm1uUUhReFNLVTgrTFFuYzlTd2U5eTZpM1dkQ2pvbUFRdExKdHRrcS9kLzF6Sjd4L0VoZk1Yb3hVUkJaa1AzNkpjMnhVV0pCbXJqS2pNRGNCei9Bc1l2endUeEFzT2tVT2YxWTNXbXFYSG9NbG9BcDNVSkY4QzdtcCtvaVB6dURoNUwxQTlDMlhGeE5PblVsTVhhOFBWTWVPazlIYU1YMHEySTV4UTBGeFJCaFJ0NWZrMWF6ZFh3WFcrdWJJWGMxdDgxb2lNQUY4N2FzbHNPakJVRDJHZFBHREF4MkhENVRjTjc2TElzR0dmL2lNeHNoSHpvdFhUQmJnYSt2YW5aazlYc21nZGt4NFZMeGs4UmoyMUlKR2dIQUdDUEJOOFZtczgwUk9iUWpXWUh5RXRGVVpVaUZFZGw4eGJ5djhIQW1SM2ZjV2dqK3JwTW9LdlFhd1Y2SXcxNllRYjdweHJWWmFzYnJBSWg0V3hPa1dDWm81dVpGZ1JvMmg3R1hSSklocWdKVkxpK0ZjbnZIRmtYR0lvcXR2QVB2dGpiVldYMXhmdVNTVFRGSitJTElQVVJOM3U2QkJZVURvdW54R3NEMys5VHE1QVpMTytZV3N4elJoUVVHSERsZnByV2c1VUM0QldmTlpsWHZYTkpSaU8xSWZBemg2VkpmQWppYUNSMmhvUnpwSkN3dlVVSWtKUkt0Q0hvb1NuSnBvWXEzTFZRMm1DTlZMKytlck1EZzQ5N0d4K0ptK2lUR3VpWmx5bDNSdnV1bUw2SndUWXI1OGRncy8rWWhtWXNkYVFOU0FmRUVHQXdPMmN0SmRaeUJ4Ly96RHgvSDlBWGRyNm1sQ2lSWlJVNFQraWlqdE1PWFdIbzVKTDRDRW5ocVFVZExKOEZka2RtRlR1SVJaREg2c2Z5eEFEenNLUW1hamV3VWloOHpUOE9pSW41OFQvSjFTdmhGZ3lYOXBBQU5RY2VIU0dQKzd2YTFmSFY3NzVvL1lZeW9kWEZvT21CUWZ2ZE1YZkF4aEI0Nm9xK1g0bmJzVzNtOVUyZ3ZlVXV3TEVLblE5L1QxY3RaQzAyVFJVa1l0SkpSYmIzY3l1S3lWcUtDLytmYXBDeFR4WkMxcjVXcGY4ZVltRVhKSC9LRmdGSm4rUjJIUnA5YktKZHR3SkViL1JXZktKR1FKSlQ5U1dnY3NrTTJsaUJkeXN5SngrTm9mUHFNVXVRNTRldHM4R0xmZk53TEIvM2ZFSzE0N1FpSEh3TlJCdURORVdPaEpFaFJvN29BVytCd1JUSlo3dUs4MEtuWVhPL1hTbjA5akltUW1yWDZVSVhDODFNdGxvclprMkNSRXJxZkxrMTZiSU0vSlBqcmhaeGFtZTBZNDMrNDZCS1l3ZWdNT1RJQWh3YWVQSWExRlRMbVBocWoweHFQbFpEVGpQcHZ6R3JQUkZ0UmwxYU93ckpXcFJ2L3VvN0pRWmZlTlZCSVErZUdwaW0xVlhOUnpTVTh0dmo3SVNGL1FmZE1paExxNm9NU1pFYkJXMWtERmoyeURSRjR1NzFKQ1NuY2N3M3BZNXlzNE9rZXF4VzgxTWxMamcrczFXNC8wR1c5Ym5vZ09vaU1ZM1J6cGtDaUVMSG1BaUczeXJVb2VLL1VER3hNc0ZTY1VkT3ZJMENGTTU0Q2J6Um9TRityMU0reFM5dnVMWTQvQ0pybDB1Q2YyRlNERUZQaDNMbzlrUUZMdTE2aEF2L1l2L0FzSTV4VHUrYWtxTVZWdDVkT1BhOEZCOHVEcHpSeEJlVFBSb2VFMmsrb2tSbnhYSnhxLy9WSHBldEtuU0JZSWlWWnhtUHQ4bFFMa25jaUl1WUNQMFhFc2FIdTJDcXQ4SGVDMlprREJyQ0RvRnZMU3g0SmNHNVlSQkhCU2NwNTFEeVN1c29HL01tMGE3SUpEczljYlIwakR0SXM2MHFsRTk2bnNrbHdsa2pCSXc5bTdJOUVIMmlacjBsRWt2S051NTNaUlZDaVdsUDZjVmFZb2RUclRSVllWL29rdDY3SmNJZGUyUURjWHlDWTllUHliZHNUWnRadWpLRklqUFM5RU5nTG5EekJmSmdpOWJWU3JaYjZzOUNlUjd4dytWdG0wQ0dEUkVlSkw2UzQyZGtydHU2TGlYbXI1UDE1MGFSOWVPK3RPNnh0MzhTeGViU2lEUS9wRWJweWVwTnhKalFYOEpPbFh5QmRtakJnSnltWjE0dDliaXBxTll6dUZKUE8wcUJLOVFodHNDbzFsaWM3WDhMS3BCbjUxeTdBVDF0bnZ2QTh4VFd3MnpQcEFKSC9sOGVaV3paaWtReFlZMUdxSzNUMjkwOWRWci94dkp2SDNVSXgxSlZWNEdNOGFnYjkwUDRmVzV3M3dRY1ZvSlJLMnBsQlV0OUdTbkEweGlJWVQ3V0tmend2MU1SVnFpbmh1cEFYRVFleE9COHlZSzFYVDRacVRDaFIwSEVLQnljN3daRXFxd2hoMUtHN0FSdUszWUpCQnZ3NGwyakhCWWdLVFJEOVpmUCtIWVI3NVBTUkY5Nzd5SzNWaitDYkF0TkhFdWZ6M1AvQUhCK2ZYdTdmN1VsZVIwdXNSRjROWGYrS3JZK1VKeVo2L3ljZmt5TmNmeXhqOUVBYU5CVHlIQ1kyMkxFajNwanp1bHVhVFVzLzVibnJXZnlaWUhlMXprSWhCamEvVGdKK0F0WmcyTWRmM0NhbU5xd2xiV0I4QnNkM3V2SmtHanpxT2hVcTIrdkd5NG9pd0pNUUJEL1pBVnd1UlhFTGpjRVhpb2RyVng0MmVZd3ZHYXJCUHNBbGZCU1B0SVJ0MlZGcGdBMTVlVW5oeGJYdjc5ZW1SVXVUZVlKSXhQYzc3Z1lDTDZQTEtoQzZzWklycmZpbEp3KzRGSnUrbXlMWWtPNnJLR2x2VUsvV1N0d1ZVc3F0UVNLbHZRajhWV3BuOEpORVZJNHRjNzJIRXRTYjZERzdOM0JiemV0bEpKeGptTEEwc2dHU01OWnZiTEszNFVYWDZFSllpNEJ3ZzFwNzNxNmY3cHNldDdQWXJ4bnZnZVhidm5qTkc3UUErYnAzeldxL3dRQkRLbDFCeVEzM3NsWTdwSlVwVHJvd1dFVnlscG9sRURzb2pmWitxYzFuRGE2VmxwVVVrZ0U4Y1U5djkvejQ5TVVleTdMRFQwYlJIY2IwZzlsajh1TmltR0lpb09oMm10SzEzNEhFTmZSU0Q2RVpPQUpwc2tXcEhXZEllQVkvZzhYUHc1RDByVndkeUN2RnAxQlNQbGx1TUt1RlBKOGZ1a2xaL0RJc1NqbW0zczl2dTJaM0x3UVlDeWdQdG15T2ZqN1NKVVpZS1dKTGMxcXo2NEJ4R1Y0RmdvcGtDV2RDTVA4WEZoWXhYcjR5eitJOGhYcW8xbnVrZzJSWFdqVytGR2w5Y1lQUlhBS01JVi95WGRiczRPSVlGQ3B6d0NIZHFuQWhKRWpUcUJUV3hXWitQQWRkQ29LSnFXc3VtVmc1R2QyYk10OVNKNnk2KzVFRHY2RzNhbzNKSkRoTk9zR09LbU9HTFV3bXhxUjM0b3lEQjE5L1FuTDNvcGVxZ1k2eWZFUUx4L3U3cG1ZSmd3U24xejJMRlhKOEQ5M1pFdEw5RDBPWGIwNFZSYlpxUlJjN3lkN3ZsK1JjUnZPM1QyYjREaTI2ck1ZK1Jzcm1rYnBxNVNYZ1lrdU15MGFrVlMwMzIrK1kxa1kxdHc4eFhTRFEyS21LZ2RMVVRhSU9TVXRLVnBlL01DdkE1UTlQcmpLa1ZnMkZXYllpRWVGaHBZOGF0QmtxSnp0LzhQSi9UL0k5OUlMbUNYQWtlOEJxUkNaZTdOdndMUXBaaUhJSHJjVzA1VmQ3OXRTQ0FqRlgwYVBPdnpoV1BsK2xWVTFEZSszQ2RCcmR4dlFHS2d6bFh0QzdFL1NvZG9oeTRaWVJkUVlUOEdoaWE3ekY4SUlJa1Z6NnN5YWhtUUltRlc1cFl1OTZFRGhLVzZ4dTk3REIybXpNTnpmT3JFZkZTcENtRXBZV2JncUZMdWJXZCs5R0RYOWtYRXdvTEhuTDBudURUZmJGSGZGZGx1UXZBd1lYUzRwdmN4MzBQUXl1MmxkNkM0NmZhOTR0OHdJdTVSWVVzTDllUkl5YmdLbktXdHR2Y3BtZGhSRFB2S25XMGo4TE5YNVJTVGR4SFNyQ0crajBoT1VjTitwOUZXaXhteEdSVXNnSHp2MzFSNW1JRHVYUkZpMVZWTXFmRTFCWkU4ZkpMZXFqNUQ1MUpORGNRKzZVVU1XUllDOU1ScG9MOG1OelRaTERrc2J3cGlpZVNPMWpUTkMvVUdIdmdjS1ZPQUhZcXE3WnRFSStmc1RhaU9JQmdGYnA0UVJLOEZUbys4K0ViaGNZai9STGtqNjkyV0h0NmM4NGcvMTNlamtycGhrT0FsdDJnN1RSSE1JYVlXSEgxc05nUTVzVHJodUVEeGhSOTRUN1U0MkZLK3ErYzFxRzdTODJ1SGN1b203Ymd1c2ZCS3RLa2JIMWloanAwdWxMZC9GK1VRcXNoY3lFa0xuVDBPT1ZqMnhjSVFPaEJRUjh2SllVeE9NZFhkaXY5cmczZjk3YlAxSVNDZGtSZXRmRVBJcEZoQ2RMOUUyMzU2NGpwc01uUjhPQ2ZENGNsNzFQcGlsYStqR0Z3VCtERlZ3OURZazZiMFNiRmtyVjJlaWpYUEtFcURKd0NOa0lDc1FFQ0I5QnJqR1ZidVJBT003R1BxcjMyNWFxZmQ5TXU3VmxGZUxoazJKMmVPT0xabWV3MFR6MjFPazBybEtnNlNUVEFENEJJVzUvSFJkUUtWV0N1YUxMZUpXRlF1dEE1QXZvVERrZnN6SlVMeDNFV1A0QVR6UGxUV3JUT3ROYVFuWjFFY3lDVGVsendoV1cwVUVFZk5wQllGTHlISjBzSVN6Q0pWVzZZSVdWa0dYdVNzN2RnZWlUQldEN2FZU2ZvWXo0RC9BTHovUHhVTFEvTHdEMnYzNCt6dGxVaHd1SUk0bWNQQzhHRVZYWlNpa1JjVHFQb2lHRzVZYll1NHJYNXM0T1NDbUFyejRWdTI5VXR2TCtXWFNCNXQvaWVIVHBQWmROS0ZTRFJmMjJEWFBGMENtcFJmQnZjeWFJRU96WXBKYmRDZzAvOWRNeVlHWS9IZUdocU82SGs5Nm9QNmVEQ2tvbk1tQkRFcXlQZGIzalJiQlhhdkF0VnIvQmRyVmJPYmhoOFVZWWRET0g3WnNGTXlzRW5RSnU5U3RwQmZvMU55L0VoaHpRVGhkREFRb0YzS05JcE8weDlPc1ZyaFlxL0VONWRBbVB5VjgvQnlqbWI1UG9xQ3FsQjdkNVNseHY0TkRVM01adjFtY3l6c1dSMjA4L2VTdmEyQXlGVlYyZTNGR3lkd2xkSHo0cUhRMllReGZPcHdxRGZxZG02bGtTcG9NMGNmb1RQOUVCTGw2U3d0MS9oOGx3bDF4eUFsR2ZlMmorVHhTcWsvRHFSdlZVTm05c3EwN1ZqQ3N0bGpnSzFNcFRnL3lhN1JIZ1lnVnlJQklYVy9YTnN4cUhIU2dtSHhEMWtlNm5tbTM2V2xpVmE5TmNqdGJ4ckFSb2Vqd3RqZHVlYjRzbU5qbkU2MnFsOHJFb1NzQVJUM2QwcmtvSTRxTCtrREdiN2dYQ2Nkb0NyeVhZd2kxNURvQWtHVC8wL3lhNGkrdDF0L0xGY0hsc0kyMUpSTXpCNHZyT3J4TmZReVJpVFJiYkhlVHY0WWpVMVJ4dFpPNTNhQ0IxTVZjMzZiOFQ2NHBiTkVoeUtQUFdpMmdvYjZHSzlKdVRQczlXWUdCRFE0a1o5MWFISFI4QUhVOTlzcm1TdkNVUVd6TGpWYVdmdHF5VXBsMWF6dUljRGxqNHpycExKMllSZ1Rza2JpckdpRVRpK3JxUzIrUnlSWkRIY2dSL1pIU0VFWnV0UFRKVUIrVEx2aEdWODdTRm9VSHNIWmZtVTBhMFNHK3oxbWZwZFFwWUZDZUUvOWY4aUdHYnliZUZSYlduaW50Q0NyTmFvRG1XdXdMeUxvS3hVdzVTSWovdTVLemc4bzBaWXFMbFA3RGQ0bnpTWUZYT0RVTTh2blhiYldUWU5zNnJrQ0NHTHVzekUvWWtydlkrY0MycXl4SkRkSFdpOWlyUVBNem5ySVFjU0ZuUmFGZDJPaldRcXBna2FManJKZkZqeEVNTTZ1YXNiU1NSNjR0V0pjam1ncmUrWVo1WlJtMEt3dVNVVGlWVGxTb0NWQlRKcUMveG00d3RESkFxZXk0T0hGYTMyVmhuMlQzWnJVUnFIRC95QUhPQzh6NXlRUkN2ZnRCbUNnRmkvRFMvUFhvUk9KTDhGQnpSa1FTbENKd1dvK3BRR2xxVEViWmQxQnl4QWpVYmNGUWUwTkV1TUVvbktraDdUbG1INFNxV1BVTFJVUm9lRGNyS0tBSjF0VWFkb1gwdmxTKzJxbm9tOUM1VHNpRjJpZ1U0THRvMFEwZWsySVhuUElFZjJ2SUdWbkoycGxNQ0ZyQzA2MnR4WGpUUG5YeFNab0MySHI1dktBYlJzRXFjNGlqQm9kM1lzVkVsV0luTDhHUk5wekFQeW5rbzRyS0QvWWFIdDQ4MFFrcUtycEJ3ZU1hTXVxYUtzR0lVaysxc3FOaWtQaWZxWjczaS9KODB6RTJPRVl1KzZpV0NaVEdFWHB1cnUyTkJTWlFORUpMREpicWNxaXcxMnVaU010M1EyQ1ZSY1lGNGRzR3lPSWh2Vk1vbUVPeGNMeVphcnFSNVJUck1sdTZSck9xeCtIOURSWHZsck44OTVZbm1xT3RHT202dDZoUEc2RDJVQWRNUUxDM25PWktISkJ4ZmZTZ1pZQmk1akVza2p0b2dmbDBTY0xpamtqZTFnTno0SmJ2ZXhObTRiTXg1Y0VFbGNNNFdURGo3TU8veUtTR1hiRnBpbytNTE1PZ2laNmpxbG5YMUN6Q3RNOWxVRWZiMldHa2VBc2pYQ3pzK1EyTkdvd0JJK2hpdjhQUVY2QU1QV3IrU05QV251LzNHZG1qTDJGVnp4OE9sbE5VbytqcHdIcEYxUWpydXF4eE5kZzhlRC9SVDZ5YmJQVS9OMHpEcm1QN0lqOVlIbVViZGNhaHYzUEYrcWF4TEZjanNNS1E1SUFmTG94dUo3enJ2RmgzNXF1UHpxZGdwNXdDMWp0dkNjalJBbEIzdXF3cFpZOFYrSThRUExQWHM5UkFqZy9keWFmMzNlM2lxRVlrN2pURzB4Qm1JWUI4SEFmbFBXbEhIVjVwM1IxTnJIbUFycTVNYzErMEEycWZsNFVkWkZwUDlOYm00MW01LzkrWlMzU3ZrZE5ua3VsOHFVaGRCUkhZRkwrQ051WXNhSWh5bmd4a2VDRE1jVVZmbWxnSUI0SUYxbmo3em9HTWhPSHAvUFZLZU13bVU0aU9tc2lUYjhrYXArblFRUERmajczc0pzZEQxQmFlWmFhc0hWN3pNcmlVQTFlTEpRcFlMU08wUzZXbnR5QkRzOUFKTTg3REprUDZYUy94R2UrcWU5QU1sZ0g1S3lVay9tSjNIVjJKZHBFa1BpUGRBOUVmVkMrMk5JN1g5TW4yL2hENlorUThuODZ0Ui9CazhMVlYwSjMzekF3V3NGUCtxUnBUaEVyYjdTQVY1K0Zya2h3Z0phVTkzdVJwc3Y1cE4zYkRQUG9USGNhMFB3d1NLaTFlZ1FwYzBXMzVlS0tRVWhFVGJFa0hLSFlyZGx1LzJsTEVPT3FVZVoyUjNnd1RVTjNPREdVeTcza2ZPdklZVWh6dEdQL0lNbFNWT0x1djFqNnNDd3NoT01DalZjeWR1S3FGY2x2RHNmQmFyRytReUVxQXhKdTdJTWpETnZaSTJVdE44MGdVTjlUN1NiVnRyQjlibWNFU1VDV01VZ3JJNzFKc3kyclR4TCtKdE9IQVZQamN5bTdybURxelJlVDcxS3o5OFI0aFg5WnVsbjM0STMyTkxCRmpaUlN4bENVZ1NSaTgyMzZTZ3ovQm1WZFhMN2ZaYVdYcXFpV3BwZ1hIbGNvckVQaEVmMFlSYTJEN0Zxb0h5RTRWclBVTDNoK2ZCVVA0WmtTOEdFYzdzMzljMWtBNUtyMzl0MlRXaFI2OERhbEc0UVc1OTNtNjdWTzgxbmNXZk00Wngyak5iRDBlY1BudUVWWGMrR3grYXVwb2tqT2padTBtRVlCeHl4ZGo4L2hRT0kxRVVoSkJGQit2aHFEVFhESkRRbWlVdXdnMWdtRG5wSnk4enB1UDNJNjNNcGVReW5CRk01TFVmUDdYN0lybWJJWU5MdWdXU3hLL25jQ1UzTHdIQlpySkFvVStrcC9lVUlnT0RnN243VXpnOXY0Q0ZOUEFHM1ptRU1jSmQ1M1VhUUg1Nk9hRVBkUTRrZ1ZYcEZZSWtVeEh2WE1aYUZxaUMxRldPcWozSjc2THFKRjRhaGg5S08xdTViNjRuV044MXlXcUpKcmVqZ1RlMDJjS0hhcjBlcFMvU0ZJbldYODJNUmMxT3VOTDJlV2xZaTI0alJYNGtiOFpaZjB0ZkhOcHY5SXAreTN3Mm9vM1JQakVVNFJBaUJab0x0R2taZS9Na0VQa1Nvb2ZjSUVoYU93NGJXdXRHR1JxRlhGYUhvRjhxb3l0VVAxeFZiT051RkpwSDBrK2k5MzUzQXljaXMwQ3lXL0RxUkUwazVqc3RMNmlZTzE5dXFHMlpQc3c3Um40TXExMUxrMWN0dm8velZMaEVGNUZ0dWJobm82RzlOTUk4YlVCb3d2SmZsUWxUN2cxcURueUU5T0JJbk1kdGVqQ3hEWkVSRTM4L25HM1NLd1VvTTZEakZYMk5INUtxeUZmbVlrZHJQQkFJejVuV2FOODN5REJzMWFPM2gvbGRZYTV1ODg1VXQwZWdmZCtKVTJkazdxMzg3UUpPTldKRkovWjFaaEtSK1FzeGdBdmYwYkdCZUZVdVp2NGk5ZjZqQUhpYnhteXBlZTl0cG5zVGhWZ1hLaGp0aERyanJHeUdtRXJmVmMvd25xK3ZkZTNza1lsVDNTNHJoNUZrRnRSRE83SjlrRWpjenh2dDN3VFo5OThDbWhzeGNKbFM1Zkg4TkVJUDNxM0JmVnduNDNOM3h0aFV3Nkw5Zk50TUFEbWJTVkJHMTk0VEFQRFRleXk1YWtWeGJrVU1CR0hMMHpwS2dULzFWb3JrSWVOSHZIc2szeCtrNE9pYjR4Y1k5akJ4d1NlSjJwc0dzT2tZSStTQmFrSlBPUWo4OG5INUx5Mmx0aHAzeVZSc2ZIQlZNU3FUZzVMaVZSd3BhZ3NKWStKUG1wVFlFbkR3VjhMY3RnU0hQdDRCUk9WS2g5RURVQ0VRUmNGalZJY0gwZ0dRNGh6c0xKdE5SWGllcEhDRmxvcm04MGV6RXAyVzZCcFgzL1VCa0ppK0k4TERjOFN3eVVPV01jak5FbDA3VDkwUmdvaVhOM1Z1SjRFRHJ3cEVsRS9IakNmZnlDcHUyQ0xDTTc4VU1jMWdGaHVKYnEwa08wY2J3RURYVERGS0IzRUxlek9tQzF0S0FBTk1Pcnk1bUM2QlFOOVVUUGwzRW8rUmxmNEtJNFFsMFRkc2ZLVG5OZ3o2MVhoTkszWVdCZmdNZVE2UWtEeC84NjJSTkI4eWo3TUZLUkQ5aDlHYm5tL1R1OE4wbU1kQk9XV1VnVUR4VGM4Rmx1VmphT3BHcGMzaWFRenB0QlNPaUs3R1d4aWpQbmdxUWczcmVFZEorcWJjSHlxUGF3YlFsNmUvRm0wYTI5V0lsUVhWZTRmYWxNc2dsUDBPSjMrREVvbDJWKzdUL3pMYUVPeXFHbHBHL2VBTVpsNWt6TWs2SnJqbmJ4TDBXcGpuWDIwS0ROVUh5citaYzRqZzlqNnA0UUR2UmZEaXllOXJRSURBTzlPanlhbmRyQlZIS2RkRzVKU1ZmNEU1M29Rc3lyc1RLcjdzUE83d1huZlBDVnVOczBub2RySUpadlFHZlNuVUV3WXFYMnBiU3RlckJEU3RPUkhEcXFDaERjcWVZYTdJVUVsRjJQeWlHRnR1czhLaWZmQ3JRbUVkMFhWZ3d1cy84czBFSG5BOEhOUzlwdjJmNWYzNUl6K3dJc1d0TC9ZQk9UdTRFZzdLWmJITlRDNnE4SVlKaVNnRDI3WDFLL0FYNVU0YVhaQVZZQWZxZFphbG5TYWFFVHFGUGRCODQ0K1N0cGFiRkk1WWRyQXZwUG41b1dMSXdiUThham04aitGWmRsMHl2NmJNbjBpTWovRXhJektYVlNTZkZQdy85Wk1LVUl0UFJ4aVE4cjE3VHZUWVhQR1JNRGVZT05BUjY2YWJGT1JFMXJZMnlZbWRRRjNjakZrdVdzUHQ1UXVaUmNxMDN1L1RySER4ZnBnRi9BaGpOTUdGNDl2cUhZcHlCdzFaVXJReUdKWDVFSUZUU2hDYkUyWmRUS1MyNzJuSW5GL3dMbm5od0lFOWtnZUVEcUIra3AvVzZSMkl2clBwOXA1bW4wVDhyTHB3SCtlRSsyVkQrbkVGOHRtK0E0WDVXRE9OK2p5NnNDa3Z4NEdlMU5TOUQ5MUJkSG9BYkZYcWh3N3pVaDRRWW52WWl3UUNZNDdaTm1vWDM0elAxMFFtNVNET0RSY0xNd0FZbXhQR3dCcy9ZUFNnMUVSOVNDeTRCTkl6UVEvd1J5N3Jzc1NkS0kxWVlSVmlIM1ozUVRJaG82bFpqbEJlM1ppb2NucGQ1UVFjSzJkWGQ4cHo1eCtEUGl6YmZoNUhKVS9CUjQzbGRSUkFvdE9RS2hDTlUwc2xFc3huNXFZUnl6NmR6amo0OTNRVU9yUGl0SmNicDF5SVRUcCtxeWhpa0w2T0Z4Ri9jSkZsN0JoRHdRZ01DcDgxVzk2YkMxczhTSDdCUkIzS3NCUXhLWWNnZVlYVGpUMmFsSDVILzFLeHVYVk4rK2hRL0FZb04xMWorN3diWEhPZ2ltdmdyT3liUHVyakpWR0xucHE0d3NTcWFBRDZlaU1CK2IzUVhZRGsxTEQybHJQZHVjQ3dFTGgvTGZaRk5iTzdsUDBKSTBTb2ZQUWdjTkhzdkpPakl3M3hZVkVSRDZTZjFPa3NnSlVhT3EwOXZzdHZpanV5YmxsNUxzSjFlYml0Z3N5VWFZZ2hreDAzVkRnM2R3bVhiTXhuRCtjK1JQcnBMbCs2ZDQwcHB3UHEwUUZvbWVTbU1DcmtYQVkyWnJZcm9XYU5GY25QeXp1Q0FMOHJldVRoSzl4TndnSHpvWGl5T3VTRUN5QUtlMkR0Wi85YVVwODlTaU9OaEF5YkErcjd0YngyQlpLdUhyUDNCSENFM2hJVHR3RGFrc0ZqenJhSlZKR3djL3VaTW55MWtiSHNwZDlFOHBxWDgybmdOeUh3UWJ6T1V1VmVTeElHTm9oS0NkTWMybkFDRStGbEJwTnVzelNKTHlUaTFqTVZlcTkwTDJVVTFPemRpSjZKUWx5b0hrc0JJVFFRZENOMHZDZStFRGZIb0pLNkZKWXhvUHlKYkV0bGdDQmlvTFkySWxqTVlPYzdpQ3FMZGY1SDgyV0UrWGhJcUYzK1h4bnM3ZWRGbE9aRno3MkhDYUtSWTlWaEFvOEJKdU9SZGZwM1h0WnJsWFkzTDlYRUJjckdIM0tjeStadjdsaUg1REE5Nyt4dHlKVnd3cGVmTWdzZEpMQ0JlNWprQ0JFS3k4Mjl3TXdxSkdBdllPTHlveXVxcXpraUtmOXNtbXdWdGJIbWhFU09EZEk4T0pjRUFrZURqNGtCQ3p6QUNJSExKQ0VDNjFoSG5rWUxtN1piM2JQei9QdGZlQmwwQmhDZTJ3a2NQTUdXOThhZDU3dXpUa2ZPY2dxcnc5Z3BqVW1NcDRTTklEOGhpSVNMTytucjQwaGptbzd3ZTlidVE5VTNyS29CVHBhZVdDNUxLK1ZKQXBMekpWR3lOWExaeXRjSG9rMWhoY01Wd3VvakhMU1F6NkYzeFlVcnJtRUJ6ajJBRkE3Mkt2UmU4WVp6TlROQVpBYjgwaDNzU1A1aVg0eHQ3L1dzd0tlczBNR2tZSnJhZWNhN2U5OFpoUHpOMExYQjJsK3ltOUdXTEI2dTYzdnEya0NmbzVBbzRXdXRsVWhrbXVzeEpTbHUrVVIrbXpGVGJZRjZwcW0xaVBxSHZ6Z1RrM1dsU01DRW1Pa2w1UGEwVy9YcjlqZDA3MXhZM0xEMFp4RzYwcnJ4VTJNT05SbUlBN0Q4dTdGeklUR3Q4QTE0ODU4MmJ4cTVyRVF4cDZVZW8vbGZHWTJjUGxZSmJxMTZlTEwrVG5Md050SzlsVTlXaUdUMXRjZVZSL1lhdFptaHJtUDk0cFdsQ0E1YmIvRWhCcTVyeFVRUXV5ZzIycHpRaWNHbHR5RXVVelBrQjlZbzV5OUpvdlRrRTA1NGoya3VlK2NEYUUrOXg0K1RMN3ZTU3QyNkxlTVdRd2FCZThTa1lUVTZhR2R4ZmFZZDROaUx1ZmY5Z29lYkRUd096bXBCSU9LTTYxK2RSa2toY0tZR1hPRFI2TWlXSlp0bTU4SlpHb2E5OGt5NS8rYWI0ZWNkSWhRQnVuVlhJdW4wNW5PZnZ1bTJMVS9Oc290c3RwOVVjNEZucjZFVVdoSmNXeDJyUjVxaS9WY2NBWjZJS0RrR3pucGMvR3hQSlMwcEQ2bmxoc253Y0prZDl6b043bUhPRTdmcUExUDNIWFVLYUNSc3JmVXdqS1A0ckI0Q215WlRCOW0vUTlVYVFlNTdjWnNqd3JKLzlhVVVyd2kxTWd1c1QySDNTd2E0NmxvM2ZoVXlyTHk0WW92TnNtbHhIZkR4ZkcrMWIzc0JKOFpKYU5Db0dVb0NTMjBRd2RHMU9KeHhDZVhSL3pnQktwK3lYZnpFZk42SU9zUXdFenE1dXNqOUpPZitYUit4dmNHNVBneEE5KyttOTh1Tm5oTnErdnhUajVQTDA3Wlo4bTVmNzdwVWNhYlpubURwa0VhU3gzMlFnOERDZVFTWmRzSXVpTmMwcGROZU1laFpSL01yb3lBNzZwRVIxdFhSMjYyU2I4c0VhY1VrRng1aUphWGtEbVB5Mkk0UkpNQzRuMlFWU2JXMjJhamFQeTNrTjE0K3dwbm5pbHNtZ1dwdElkamhCWGRNa21CQktuNVdLRjN5OEdsaTZwS1hxRWxvcEpGOUtMekVwc29UcEZDRy9oUGVETHBCd056V3pwb1lzdGEzYkxCdEpLQ1RCbHZ1NUhHMVlCTjM0TXhGTkYrMTZyNWJ3L052NytnL2NyNzB2N2N4a3dVZ01zWS9HT3M3Z2JQN3diUjZNVTBQemFCSnZNOFcrall3eDE2Y1paRVduTGQvNDhNOWswRzUxUmI5WE5mcVB5eWNuZ2xaaUNaTlBYb3VjdVYzWDM4bittcFpzUHdIbkFVUEZlNGpSQm9TNWdscTgrZmg2am42aXpHR1hSWWFHeGpzMWx4OEpQcjIyYnhadzdrL2dGdTk1V2V6MVpjVXdueitYWlJzNG1icjU0a2xTMnQ4bEVKdmhiMEgwVnkvV2xTT3dHekl6M0JXRXlkKzFuZTZZRGxabGdUVTdZNjFxUWJEMmVDOGdHK1NFL0U1bittaUdTUkJ3L08yTlFnaXVORmM0cmh2YVYrRXdTd1pINXR6a0JNMGF6SVFOb0N2eVR2Y2RRVHowd2pwQmZ4dDlxWGhRaXBQa1M5L1FrbHB1RWt6eDBPMmFUblJuMnZIazFzTEl2R1FsRXVOWXA3V0hMbzVjaUdUSXFZcitkcC92TUlTSzZITERyRnhrUlVmWFlTRUx2WElwT29XcVB5c1g3L1VMQS9tYWxBdlVHRDhDaXMybVM2a052amFtODdUYUJZSFhuRk93TU9uSFlybTJxYURiaFFYTk1YY1RaWWc0S2xhY0dGdTlIWUVjbW41d1ZyeGRTWjczZkN3Uzg1SVlXRklLaUVpZVNHSk5ydittaTZmNHdjbVpmZ3lzaEZUWnB2VlRJR3pOUDFIV1VaM2EzTHo5T2FlT25aeXQ1ZzFWei9RT0d5ai9QbWtseDY0SC9CSHBYeGlrZStjV3FSRTBGd1F4QjVubGRZclpyWVVobDZhSUJKOEVmbWZjV0ZRRGpBanFySjhqU3RaMVVlc2xJRnNzaWx0a3VtTHc3K3ZiVkpsV0VsNVh4a1M1d1FZdDFwZzZobHd1cjdJS1pseThhRGQyK2lKTW5vVmhGcHd4MzM4L1FFUEZtVldzSUhpb0IzSGw2a3Y5UmJzYnQ1T0RkVjVwSDRjbXhDZ1l4UTNtLzAzUVdxNGZCMWtSQXAyZ3F1OUI2ZVZ1SU5TNjFmUVo1WUhyQ21XOVh2aXo4R2tLcEhhRHhwNHYvUndUelJhMklDU1gzWFRhTFJwbHFxaFE1MzdWQmVwb1VsbmRNRlVrWUNSeVBHTjNuVVF4eEJHaE8zdGRrRGZxanVFdXpDNGtDam0wbmN4cEM1STFQRTNVZVlUT3RqTHp5S1dtMElWWFBtUyszOE1KbnRVMy9CK3ZRcEdta0lRMkErc3hoU3RTdkpaaE91S0IzR3ZMVDNOYlk2QkhNeGhYbVk4RFZhT1J1MHVMeUtOb1lDc2RUUVl0WW0zRGJqeEFQWXpsMlR6NzNUSm5odUlBQlQ1SGZ4N013QmxabnpVaS8xRmRvWnd3TC95VTAwRGNKd2lvZENTT1F6L0tqTE9WU3pVeVk3Qyt3c0ZsRVQ3NzFUeGdCNkc0NFNIamRRaitnVDNKeFJkUkpaUUc3T1JReWFjS1FpRkZRZmtBTFBHSDAyRFZROGNIZGY5S0M0aDUyN1FuTDVUbFFxTzJHTU50WEdTcDdXR2NSY3FQa3VSSmRWT0x6QThnajF6dzgvMnAxdEhheVRVVkwvWkJCYXhham9vRS9qc0ptTnFxajVZVUM3R3Y3cVRRVDFiYU5rekt2YTZLeGxLcFZnaXdJaUJGMUVRUmxZbk5hb0k3QzZ1cUlieDl5cXRHT2h3UmxVRFY5dHlNVURiRjhOZ1hnRmQ4UTgycnhPeFVCeGk2aVV3RWdyellzOGlxMzFlS2NzMlhHZkF6WUc0eVdoNWF4NFVCeGVvNlN1M2VWb2daTlVwekxmTEhaS211RFRqTWxRU29tcFhkbVc4RDQvbjZpcHJ2YVlKcTZhZ3RRUDdIcENvd0xkUERzeU5NdnZ0bkpaOFNsc2pTdno3cmFrbHRIZFJmZFMvNkM4dGoyOGNEOVBqNFBkalloZzZMUVBnbkJLblZ3YTRuSFYyODlsUXlLbk1QenlYaW05bjRjM2NvOW1mOWNsdnB3amNrT1dqekhSZjNwWjhUWDBNSE1NSzNRNGpvT05Sai9XaytYeGZEWlE3SWpXcEQ5SUVKVVV0ME04UkMvZUQ5VlFqRVNKN0xyV285R2VKSUFnU2VYWHVDK0hQb213UHFWTEZhM0duT1E0akNpYWx1MndsY2t3MUZmWkFRWWJqMEpvVTJKK1N4c1g0ZVNRU2V4eCt1MGRoRjNaR0QxZnZ6bk5wSVNSMitTTlRWVjcrWmRvV1BydnZ5dWlHV0laVlBXRHljSldjK1FuUnI4eEtZQkxYZGxwR1FGUUF5bkplK2pDc2xrbzhnZEo0UWl2L2lsR1NVOE9wNXJDNm5VN1djckc0UHZxb05NQ0JHdnNBWnYreDViZURvVCtPTTgzMFpndHBpZjNQUUU5UmVSOVlxOEcrdDhoanVGWWJQUTJUckZFS3JzZGhCVjNOSFREMSs3b1dLZVdTL1lrL05qaC8zaTNkTTdCaEFFWFBQMkRIN2JvWFo3TlgyNWZKQVZYVzh5aWMvVi9wRFcrb2QyWEYvSXZ1R1ZIWisyeHVZMitFbXQwbnNVVlhKSVZLSnhGN2xNY2dsQlFHSk9LZzZMS010OUZkbzQrdVpjVGlCblJTR0RFWS9MemJwUFlnVkpZVTJmejJTN0xGUDVEcTlvWHE3QkdsaXB0cWhwZ25mMmxnTktybTZKSGplSE92SXZKOWI1a29DbC92SlJ3elRSNWJwM0hRNTBkcFU5QmdMZ3NmUjlCMm5aUDYwZmhFaWVGQlBHaGVYaEZGZWRXOHR2eldIdGJXME9tQm5vQlkyWXNzYjZqN2JTSFRoU1ltdVdKaEduVkNDbXVySkNhMmpUQXAxdjZwTHBHZytjSDdmQ3Q4eWovblBjMkVjemdFQUZJdGpOYTlnNzMwMVhCRHJhNnBhVVduZW5NMzRZZnFyYWdxOW5seCtpSlluZFZ3VEVHbkR2OVJrU2JGdkxyejdKOU1tYXJmT2ZBT0lmcitEQlUzSXpiQXU2K1dmVHZTTGFYdjcrSmplNWZobzFvdkNNZXBoaWdURjQxODM4Qmwvd1FOQ3pvRm1VSjJPc2FZMUJsSjdPT0RCTTA1eUpGdHJHdjFQUDNZWkhicHlIclloMjFNQ0tBUmw3c0daWllmcEdBbU9Ga3BjODRJWkk1UmxnR05KM3U0N0loclh5Qkh1b3FneTRMaWJTaHEvOXJzVkh6SnpCQ2dMZTZPWC9SZFo5WlJNbzZFb3hPVHlIK2hJUWgvUDJ6NDAvS2dZOURuS0pKV1dDM0ZsTUFkeE1JWGhjTEYzYWtYVDVzaUxxbEhTaTdVN1BnUkdsQkZ6dlM0RjVaYWZwNkNNajhXWWw4ZmlKVThjMU45TytyS0VqQWpjY1JCZ3V6amszY000djJLZ3JQcENaNk9Xa1JMM0tUc2I5cDNMQk85TjI4RlJsWjlCNzZ2aXlFbVBHcEEyQkNrUWtVckdwRzQ3RWtHV252SjVJSHBvWjYyV0toRVpRQmh0MXhMdHV2S09FdE11RG9CL1pQM0MvbU14TWcvNUIzWE5ETjl1aUZERmkxZ3hiWE9QaVIxU0xyZXVjb2N2b3dFTDAwV2F3dzE5eG5NcWg3SG1jZVFPck9jdHhyYXJrQ0NhcHlOUkRUbTc3dTJLaW1DRWlGUHI1MDB1VHdCdzZmdVExZUs4U1dySFJMdnMxVVVaMVpyZDJFT3VscFJXOWZocER6R2RiaHNZNk9JUTVvVnl6TFNRaXByWFEyUlltVlQzK0dWS0ZDOWhob0tPNXNrczlERngyc0VNeFY4ekdPYzlXa3JHbVJLRnlwZTY4SkxLR1BreDdRZ1YrTFUvQ3R0OWl1enZ0YzE4WlJHSWgxT1VtNTNCdlM1bWczZm9hRXNFeTl3K1MxZ0NqVThLSE15akZwSmYxSnBNam5EbzhYc2J5bjNGSjFuWHlpVGhONTVUa0pMWmpaby90WEdGRWU3TWtqTnNsa1JMUVl6SVYxZWlTOWJIMDVMRENZU0hYOXZiNzN2ZVIzcVVLWTBkalJEUFhmbG1RRlQ5dzVSWU5oYzZ6S2dOUlFWeDY1emJTbHd4dzhUTEUzK3dZZTBVb2tldlNvZ3YyeFRBN25EbXVqS3d5ZWhBV2RXK2owWUltVUl3SGt1enY4Z29KRjNhUStQdzR4eFVYakYyM1RHZndHSzZha09xZEhFOEdBcEFISTN3WFpGQThxQ01LZ09uK0lZS2xzSmNIK0JrZWVGekdZb3JLelFwZEdKS1JqbGcrSGd1VHZMVmVHSXoxVUtpUXNlNEVnTFIyRU53YUh6bzBPdFIxalRvdVJvVXRLaUlCRUhuUTdxTWF2RjZob0RFejBEUDdKbnFXK0dSY3VqN2VpTFBZck5sVnV3dXdmdEdJenUvOWt3SWNmcmhaREFXUEZ6d0FMUTRNVFpSOUk5VmhQSFJ1bWlzTlgxS00wdzdCZ2IydWtUT09hUW9qbUJoS28rRStmYzkvVWZJWG5nWHhZK1hIbW45OVIvYmI1cUM2MXQrV1BGbU1KNnQwY083SkZSVDVURWZJV1E1c2w5U1hNMnJ0MGxpT3g5UVFkNEozZzZzMEN0eW5PMmMvTzZ0bXBiakhaL080R3VhZXB5SmZlWlBKL3JLSnY1Zis1VXNVb1FUS01YNVM5MGExdlhxNkFUM3llSlcxRTJLbXU1eHdEaWx0bWEvMWM2b1JtRDlWenBLVVVRazBDcFc5bFVvQ1BXRk9uSzU1RnBxLzJZaVR0RGd4V3c4cFlNb29pOXJyTWsvZ1ZhOXhxVForQVpWV3lFV1FjSmFKRUVtN2dBSjdIcFBOU25EVXpqRTZrUGNEVlNvWDExTUdBY2pLU0YwUVcwTU9pbDMrRGJuV1k2d1BNbGxUL0JybDZBMmhYakVuWW42OWtiV2ZZY0lIam0yOVl5T2V1VW5VR3ArTVprb2JacXlOWGdJVTdxMEY0VDVtb1JYcUp6QWVnN3RkVDN6QXgveGsweDhTWmtoSnM4Q0k2cmpvVDEzYW1SV3F6NEJTMXNjM3I4Z21pUUFIT1dyQU1iZmZQV3FwZ0NJWHhrUXRMTHFXMFZ2S20vMVl2M1BCYXJXUHd4U2kzZ2xjUytISGNzVkFtazIrT0NFVEhYaUsvcERqMmZ6L0RPcjhGUm1nT0wraVBlRkhEL2RrSkgvM3hxV29kRU4zd3YyNjhYZEhWaDlDYitEUlBrd1pUeTREVGpJKzRKQ1dMYTNPQ2lOTGNmOFc1aTVQM2ltWWdDVHJURU5URmFvY095MHR2ckN2TmhidzhiVHkveWJjY0RsZW5xU3JMdHhUTWtMcC9FUFJHS2g5QlFkSnRtYUNhbDBuZFUvenFQZUNGQ1FiS3ZObGJFQ0hmRjFJd0FlcmRxL0J6Uk5SYUQzaXFLdTByTVd4ZkgrcGEydEZoeU1RY0NOOVVweStIWVFUbHBOZ2dkZEpYQTNrK0p3Q3VCS0lWS3ppOFNvODQ3STVRVDVuektIMm9naGd2QUErQkVsQm1qUkxyeHk1QjVHMkllSXJadTJSbmZKOVFNZHBBb0ZxaVpwQ3p5aWZZaGFuRjdiRVllOXhmZGxmSTR1VE9SeXd1cVRiTGgrM2VNTFdycmRmeDdaUlBRMVhINjFCTE5vZ21hNlpra01OME1hK3JLUDlrM0NEcnBkcVFOako0TCt1UXQ3eXM1ZEFabDBkekoySEM3R0RQUWhsUzEwOFVmNDJpRDJ5WVBzVXY2Z2dPQ0pVMFNURkNkdVlvMGVHeDJ1cjZCT3Q4c0V6ZlBqMFZGUHF4RG1Sci9pMWRzYTlIeUVQbEkzb1dRRUc3ZDNkbVRTWUZtMW43aXNGbDhqOHhzMWRrQTQ4ZlFGekR0cDQ5TzJUWWVBcDI1UGZoUDRFQkM0STVHdFFiSkluWThDYzRyQ1RvT1hvL0RZazQ2R0prbkE0eG14WGFWSk5KRnhpd0JGdUJ6aHFVaDVMWkc3S0oxa0sxZCtHSGRXcnlDL0h4Y01SQkdKdGtjL2tWVFZrLzBZb0s3a0lydUlLekxxZ1R3NTVoT2NoNlpTOGpHdzlUOWtKbWVZbC9ITHowYkQ4TVBtbk0zT1pQTytUdmhYazM3NjJFL0JUTFZQaERQN0VIbmFIVU9MclJHZHdsVVhkV0VwMHNKdWRud1RzeVIvTnE3SHUrUTlST3B1V29UZWI5OGtWR1hSdVRwU0FNb29saWF1dENZYlhFeGM5ejM4NmNJNGVvVVlTWDY1TC94Znpjemt4dFJvM1VYRi9PS1czMjRORzExd2lDWFRxcjRtdmlVNDh0TlhFWTNsSGx6YnBSckN0TzhqYmwxMDJwSmFTY3l2ZFRGSEhCZGIxSXMzVVdIU3lqUVRoSXp5YlkrVGlUdmNXaDg5ZGxUV2dDZTNYR056UCtrb2ZJb0Y2Qk1qT0dJL3g0dWswMUhhaDZJdE41OUhJTUFNclN0MWY0ektuTEw3YzBVYURDNEwzaDJ0WnJhMXEvTmVZRUdXbE1QU3F4K1ZSMHB4RlN0THlZdlhtMDhzM3dadzFWaitScC9pL2FYZUVTU3ZzZjBOVDg2cnV4d1g2a2h4TTcvVnhxR1EzbFJPL1VETDJwUVM0V1RUdG9Cd05ralowTFJ4WmhndkpRcnFEVFlRS0pZU0NMZmpVY0RvRGRyRlIvS0o1RG0rdWE2a2RsRkVCMTg3a0dYMnVFTVRVU3MyWWV2YUdkQkdaNU1DRWZBQXUxc1Q3bjBCNDRLWmFXWDlDWEE0blZnOHRqSlZuNktzZGFtMFM2NjJTSnIzTmhZdk11aDdyK3lwWVhUaGFQa1FROHR3MW5EWTNJVWJkMHFoSWE1UFEvU1R0M3AxVlBaZCs1NFlPZUhOcVFIR0plM0pPbmM3Tnp3dms3NzN1YkRHWS9oWlNTRUIxQzFkUHZJZTB6RjlFR2p2STA5VGhZcVZ5SG5BNTNqVitNcnNQVWhnU0tLVnlPSWluYldVaElwTU1Felh2MlFqUFAyZ1lQd0dkWDBvRXVvN0JmazBxSmNlcU04MGpGY1dFNEhScmtJNmk3d3pQMVBaVERMK295dEVUaTNVV25WMG5HOU1SakFVcGlRaFJuY21xUzBYeDhWL0VGaE5mdGxJRmNaRkZVZVBJeXZLa2lzNS81QTRSWUdod1RrWGtrd3VtMi9aVjRneFRUTEJHdVBPdkE2ZTJYNzVwZGR4RVZsaW03c0V3M3oxY0EwZEk0aDhYTUhlTTZsUXZkeHpsOEtSTVFmUEo2bHRXUjlLSlViWkpjcWR6NzFxL0pXVUVoVytMWm9lMFQ2bTcyWjZTd0g2Nkl4SDJ0YUZ1YjBNTzFqYlYyZFlCaUphbERIcTVVYjdJZXJPOW04Nm5laldwK2ppSFJNb256ZmFiekppRmRJbU9sNXE1WHk3d1FVeDA3ZkFpQkJMZEdzanBYZlFKcDdpYWxGek5kYzdDUDJYWFd5WnVxUWpvbzh4RU9wUlUydGdwRzJwbUJqVkhzZFIwVEpuYlhmTFFHSk1VSi9idDYweCs0cG5VbnYwTnRqMVRaZWl5V1JoaTVmWmxBUXRLemRFUjBDNWVTcXNTTHd3YkplS3N2KzVTNzRnS1dRVlFmU2YvSnk2Z0p2bDJmQStYeDlwNGJjM3d1Y0dYVG83ZXIvODkzeGF6QUpFKzJZMUJlS1VlQzMwMFNzZXd4RXgzTlR4YW9CaG95UGJuR1ozai8zWjNnNUpiYmdsYk5ZR1J1elFQWGV4L2tlYjB5d2ZBYzFYY3UzNS9pNVV6NXB4S0lJZW1yK0R6SHVKREdBT0VOdUlVUENtSmR5S2xhb3BCQUxPemxZMjJlbEk2UEZQM3hiaGdhRzd2enFFb2tHbVppVnB6QTVjdjhINkRwdExNaTc0Slg5emZFRm5tRFA5MTRSaFJ5ckx6cTlocEM4WWVkSEVmdWs3VUNLVG8wZWdpUGFuMFMzcjNZRkJhdDRBM0RaKzZtdzRsc2RzR3FpWWhGTHVNaSswTFlRY3E5YlhRcVlpL1RzRk1HaWJoS3BkZVpMWW1VNVFpR1M1QzVWSU4wUVNwMGtuNS9nYWpBSjRxWUZKNnNRTENWVUd2ZlJCUmFyRVMwVFlxQU1xNlI1ZXFZKzYyRi9icXpab1BIdmZzRGEzQ1ZmZFhVcmlzZ3JsbEY3cGZzZC9EVTB1NThienFjR3EweWRGaGZZaWhHZ3ZCaUlmRHJzSEdkekU5UkJGSWplQ0l0d291TU1GclF2NVZNNlpIKzMrMm5tNno2dGRCZUtzTmh0YUpqU1hpbi9IUUoyOVJaSk1uOWNqWEo3YU83N0k1UUZTOEZOeHI5RmNIV0lhR0hsdDRaQmJtcDRSRGpyVFcvejRaRkx4OEp5S2lsU3RxTVNsMG5TMUhSVldKaU5ITVh3eDRVVkhuWk1IOTRHQXVEaHc5emV6UFhUQ05FRnhJSE0xSlJyTE0xWHlvaWxSN1YwS1JxcGNJZWgyaDVOaGpka0RObzl3bkVBclVTSTJVeXpsRHlVN3RWVGRkVHk1TnhuV2UzeEtuQ3NyNUhkRzI1a3NLVTBvRUFWeHNaVVNCS29TRU5TbUs5K011UC9zdXFtSUkrVkxoNmRWTERtNSsveWMwR00wcSs4eWZJTmFXRlNtRHpFZ3JmV2RZNzFMYjFjbXlUZ2UxUHAvL0hlMmFmdWlSbHhrSGd1MWp0aEp5bHBUeFJlQkxBYkI1VldLbnZnMmVZN3libXhRYW8vV094bWpqTGhWb2F2SlgvUWErbEl6K0pSQVVVbkJqTTJ1UFRyNlRCeWZvcCt6T1dKWWJQSmRYUkQxUHhhNzVCRnhDRDhPSDliS2JYT0I3SXBqVnVMSHhQd1NOVkFzR2JtanZJT1I0N3ZWblZpTllhdnFsTzNJSHFSUnFSaGYvSWdWUi9ISlVNRW01UTkyekZ5YVlvcFE0alpNSFBvK2QyTjdLdENTcHBXelVWRk5OVXZiL0x0azNVbVBreGt0OGRJSkZyNGJWclpVTGRDNTYvQWJLSUNRQ3FLUGhDVy9GSXRWUCtYTk1RdU1wbXpDc2ZTdzUrdVZNVVpFQTUxNWVSWHhtN1dFZVNxNnZDOTc4clpwM0lZVGtmREVKR0dYY3g4b3h4MWJwVTJPbTRYYk5qYysrZFA3bm1TcFdobEhZbzJvT3pQRmVlT0w0cTAveHEvWVBaU2pFK0grRzZMUUZlaDdVMTllR2ZzWUxWN0JkUjY2RktTeVBIRW5rZCt6TmwzcXBnZmxRMHd6N0o0UmNkVTNZcDQ5NDVCL0JlU3dPaTZlK0kvWDM2aUs2bTVGUjdIMDUwRDN3a0RGNCt2SldJVnhYbmw5RW9wYzhETEdyZHMydDI0Mm5ySkJ5Y3VJSjBCcGFmVUgyYjZOMlBHZGJMdzFYVkZzUk5jbkZISXQybzdjdWc2enduZlI2UUFKekFFaFcrbnd2VmhhNk1zSHl2ZVBhMmQ2dkljdU04eFZ2WisvVzl0aUN2NzZtY3dnZTJhRkx3TnBIVnp4ZlpyN3ZHVlc3ZGFZMUt1SHZ4MExDeGVwK0laNi95MnpkcFo5c0RVL0dHbWRYSDdTNU9xckFlOFdpczRNYjFMMkpsaU03YTVqSnF6MlUvc1RiMHl5eGl4aHZVUlRtZnhETWNHcFNsTS95blNVcXNWZ0JSM0xRUFVhNUZBZG5YdDVIZkJTdUJxSUp5Ti9Nb0JxMnM5dFdaYllHMzdXR0xKODBMczRWVm44VVIrQTh2c1ZtMmwvazRZbXZHdHYvRllqYkNHMmMvcStlZ0JTcUhNUTBuV2JCZmliWTlRK1VsQU1YYTMvZVBJSE5jMFk0SUt2RDRJNnR4b1p0dXFra0cvOHBvMUFIZC9aVlVydFcwOUZGVEs4Wk1MdXdKSXZTZDZkalRXYzhEZ3dkb241THM0b2E3c3ZOTWFNZVhQRURUYU1Ba0s0dnNERHlxbmEzMzF5QTJoTVhUdTRaVG9PNHpYdkdyYSt1VXR1cHhmM1lJNGtHV29sKytkRnhmeEJvRjN3cU5HNERkVlM1NnRYbGxOcVlxeXZJVUxaQWFwVkFHMHFSd1B3blcrdmxhQlJqNkRLWHN2eVh3bDNuRklZYjNDMnBCeDRyNllJdWNlSUs3RzgrdXI1dlh6QlFpcTBmblRFMDRDT0pDREN0THc5UkFtdVdhZDU5dUN0QkFFWXVRZ3hndy91TXpFNS80WmVvTDdvOVIrcTkxbEpadVNmRTY0bUVzQTllNzg4WCt3ODdhZDlCWm1tZitTWFd5UVVjRHZYT2g0QW1GTkRPcWdEeEIxY0VUMXJXU0xOQUwwbHVXa0l2NC9jUDcycVpWVFZySUhlK1VSUVJsZk05cXFrbTA2cy9QcmlKZmU3dUdDUS83MkpWazdWSkVaRWlLdnp6SDdDZSthaFdVc3ZJb0FVUzZpUVBGdDJTTWE4cE1kT2MzU2FpeTI3akNOUDRCQVVLaTMvU1h1V3RocjhQMURGbFJQN09HM0FvU1ZEcXlITVZGNGtOVUhTbGJaU3N5KzAzR1BDTTZNMmZ5bUZqZk1sR3pjRXowdW00Sjk4M3dtVktzRE1DbS9EVWl1SkFybmdobVRrbjB1dThmTno0a0JWbFAyRTJCdStpRi9VNUpsdVBSN2hFaHp2Wk4xMzNhUmhMaHZtbnJUcUxUcGljYWR6eHlsUzltM09uWjRTSk1pcFR6SmY0bmJIK0RkdWoxTHA0eEswMEcvTW9iUjBDUm45Vmx0U3d6L0dXaWNwTGdmMWNBbmE0b09kSkR0WHlwbFFxWURkRGhBcWVLNlBwTmhlT2FjYmdPblA4QUl3QzBIVVdpK1ZVUDFOSGt2azdFdWtmNVV0d2FBZGVYWG9CV3I1MVUrU3VQWHNIYVhrNzlFN3ZhK2psbXUrSDV6SHRDNW1vRFB4Tm9HMWFuQVpHRFNWVm95ZGJFSXZGcEJwMTBhUnU3SFlzTTVnY1RRcng3eUtrL1FnNUlWZmgxcXl6NFJPMnlJR2FONStoTDFsTkplcmhKOVRQTmlsR0FRVTBYM2hjdFlFenExaXlsbFArOEZDbXRSaEdqQngvWlZ2V0t2NDdLcVVCUGNYQ1pFU0dObWN5VHBrWlB3SWdrTWVFdmVGN29hUFFPbVZ3OVFObW1mYTN0U0tsZ3JVQkRQcFVDTUNWYVA4amRlQ0ZhWFhiSTd2RWJJUnZhc2ZVTjNFY1RsV3k5c3d4eEdMM25vZjUvRjgzbWN4L3I5OXM5SUV3VEF5bjNGMWdJY1pyeHFSYkY4MVRTQ1NQT1ZPaTRPTjF5Z1RucG1lRVllQ1p6amZyUkN5WWNNVUF1V3haV3FQcVNRbVlEYndXY1NIUzFpM3ZQNHN6dGMyNS95aUIwMGdlSmtUcno5Um9jTW5IQzRYVmNhN0l2ZDF2WW9VaTBwS2Z3a1c5RUhmaFpYb3JUb2hYQnhPUitSMjh3VnRDL2J3Q2VMa21jQTNHbmlpRXRSL1lZaUpoVTdEZDMxOEJTdW8rdXdFSGd3dnIxOHRyN0c5SVlwbjRlREpsOG1CelpuQm1zTzNJR1NVZjJUWG5ET1o1MWdqT24vcTZmS2tTdCtmbTk2TVZIaDlmZENCUXloOG42dVMrdGFXdlpsMnBodWxHSUg3M01WamhVejE5YWM3Rllkd2RKVDJOeTFBQVIzb1U1U04yVnJ6Snl2bjh2c1FkVGx6RHFBK0JFQzcxTEpSQk04Y0NvR3JoY1lOR21tN2FNRlMzYU1SdlgrTDFZaHNqRDhBYTFtalJzUFM5VTlvei94a3BtakNLL3k2QTFBcDZTcFdiZVpnTlBzcWxtcG1KNzMzd1RzSTJaR0NmeEVicjFNcS9vRWRPbWhTVC9oTFdCb1NsVkUrbmhyWUhMV0syWEMxQ3hnd25tbDF6b3EwekU0d1ZPZnRiejl5R0VZZDRvWHFzcmZxQzU4MU5JdGZuNVNzRnJUNjJ0ZDlLMktLbGpQb0JpUXJlSFgweTM2dU1IdU12N3U4Vk9uaUFOMXBpS1E2STZYcGgxUHFqTC96aE0rWm1BMC9HNTZmR2RqS1ZKQ25JaC9Nalh5Nys2bE9hZEp4cDRLcGxhNnRURU1WemU3SnV3Mk1GeExwTk1XSk1KV3BZaCtqQldVSUp4MkRTZUpFaDBjTWtiY1FvRE83UndTbXg0MjBIOE5DSmxUSG53NmVIUkdZakg1RExaMlJPK1JyUFoxYzV3MGIzbTN6V3RDSU1wR0cvNEIzVUV4QVplZlVHN0tVYThxWW1OL2hDRWN2ZDd3dTBOM1dZMG1WWGI2blVYUWIvSytrOWVLSFFSR2YwSnR2VXorL2g0dUVaRUJyYzFHeExqemg2YklhcFpGaTFVbklkYnZ3eGxESEtiS2czcGVVcE9TWmpjdWFZWlB5cG9QOGkvdTJyWFhrVEs5dVdwd3FmRlBaTXA0Tm13ZDhrT01aMTd5MUZvN0FQcVZFbU9KNGMxUm1jcGF4cjd1QnU4a1BYdVpOVkM4Y0Y3TjR4MWVhZlZNVE5sdjU0a084dkk2dis3NHRvdTUxbjNtR1NZWFBvZnRZczc3OXVTZlgvY0pxRFRaUk9tMWFFV0Q0V2IxY1ZCa3hhN0g1TGx5Z3Rhc0dXS2pKR29WWHJsVHRiM085RGJERFFrblcyQVZNSWgrWXVvbFhNcHlxSit4dVJOVWRXZ2lVNERzeW10d1dOaFIxVXB6Yy9WQ29wc0NvcHRJV0hYcSthdkl5NHh1T2R2ck1hc2t1dEVCRytlMmVYTW1TU1p1OWZwYjlDT2RkRTdXK3M2bTh3b0ZwaGNUT0JqYmxQZ3BZSjVycFAycFc2V1ZNa1pCRXhXaVpibWRxcmlkenMzdkFObWxxTGVQUGRqRnJvMm9QaWRCODVsa1pxK1Evc0FIWVBkVmszQnM2bjFHTFozRkFKYjdnL0s0T2EvVjhYRTlwTVRway9JVmFyS2dPYlJkWWZseU95TS95a0dCYWRubjUyUG90MTVqSlJIUm9WYkhPZEloK2dacUJXN2QrYXBNcUJTZXl3RGlraWsxZFBSaEhqTnRPb21vTHdxSGM0d2tRNlFDeUJiSkh1L0YvcXc0a0Q1NHZ4SUZBM1NyWWZMZkJoTEVrMzdFTDczQTVjeU9kdDhDQ2dZeG5RL3hBSXYvR2FEcnIza2xoUzNVWDRQNGxaOVNWeGNGWW1VVGpRaWh1QUxLc3lhcytKSTlkdW9rNFNGWDZPekxKc21HbDZBMU4zek40aEFsZXk4cVlNSGFCZHpLb1BZeFFPSGI1NHNnZGs4c2pTRzdzblA4a0NVTm1sNjFPdVE2ZkJUTmFOOTlkMVM0Z0prRVdpWEFoTWxTRUNtWnV5MzJGVWxrRmNwNDhCZTdQK2pZbTRkUmNwU25YdG9sUEQ4NWRvUTZNL2t4MGJzREUwRTdkWTJLdmhWZjZDM2NiMXloZWlMeHN4SG1RV1d3Uk10T0xwNkNZS2M5a0szenE5c1hyMG16SExxSnBFczRobEpqcXFrS0kwczA2dCtIaTV3K1RtMmY5b200bDJ0NGlESGNXci9tcVRZVjc5VEJndGcxMUFBaUloVHYwZGdraHA3SHZMaUl6M3U3MDZBOC9xdjhNV3NXMEFwcjVKMnBtK1VvcEFzUm5Ga1dtK0dWUWRRSHp2dXJuYTBRbnNmbEgvVXo2dUxWV2Fmb01IRkUwT21BQ2I5QStvWStaMWdsQWFHZHR2TDFDUzNUL2xoZnZPSWNvdGEwTy8wZlB2TFVYbVNMVUdzKzNZa3gyb1FZUTdQSmFyZUFFeVhOUUYzVm1XV01pdTZ3VFNBanNtclR2NWxTdDRLSlpabFlUamlVNWZRazB6aGpYUHV2Q0Z6UlA4SDBMMm9CRlh0MkJFYVc1TDE1RW4yTWFmaGxodjFPaEthQzJERk1yaDNiLzFVMVlQL3RuWUtRWG1hNVllcDlGQ3BJT2p3emsxOTh6Wk1TK2RIT0lMdHA0RVo0ekkyL0czelUxUHhkbHhlTTlaL0tMT0U5SEZRaFQxUkQ4aVc3dXZySUVRSzlyMVhmc2hvL1JTY0k0cGxKWnZPSEhDdXc4dFB0ODJPZjViTU83Q0VkbEcvTjVQM0RyOU44VHBCa0R5dEJOcEg3NTZlSDB0QVprblhuL280QW43c3lQQk1ITngydURKSHBFanlhVnVHMUlIdmNiRkdPS0F2UzNyVXdpUmtpMFZSZU1aOEhyVFlQQ3pyRW9HejlpUGp0T1J1Nm5tRVJQeExmZkovUW4waU14MkNlb2V3VnZnRC9kaUtXZ3RaUVdYakFPRGplaFVpWExmaHphZ2c5Vko1VnNLNDIrNVZiRXYwcTN3RUluZlZ3bWl3ZWVRelpTUUwrallGQ0ladTBSUlJ6SFBJcUdQdEliODg0WHJzRUttdWJoNFFzL1dzamhDbDNkUDRGdzk2U01TRVZBanBtMnUrK2lhcmdvZm1LNVB2aTV1Y1llWHpwN1p0cUFaVW4wVHkrZmsyY2hwb2lsaEdtMWRKYkcrdVNYVVZJSTRRQytIb3RCNFRaWHdKSzVpVklnV0ZBOVFYRFdTRDIrSDdGd2I5NWFnSzJ1ZW1vMEtxaEV6SllWdjhnYkRsSC93MURCYkZ1Z2Zod24vZ2RnMnZBUndRUUNUMDFPcThPWlpHeG0rWWhiMHFJQVczUWJ6UUVENThPRVZNeXE0NmRJQ1FxVm8vejNiK1NnKzQzaEdUZnBIWUJhWHY3YU01dWZvenowL2N3WEEzdTRnRWV3bVAzdGhZU2ppVytoQy9lR1Bia0dSdEdRVkhydE1JN2dkbXlCR2J3UVppbXN2R2R6VUpuekdtNTk1SW5DaXhiMWtvRnRUeDhDeXZ2V0dhY211MjBUYUVDbXV2a2FTRXRPUytwTFdDRjh2Sk55Wk9TOGV5SDA2S0hlazhzUTRXQW1rTGNCTFBaTUVteHJ5OWFlRmRSaVgySjRpbEYrOExRUGhPdTc5S2I0QWlNT0dlQ1EwR2Q3aGM4RHdNV004SkNuZm1wSzZuNEJSTnJOM21IUC9aNGVJbUlsK1B4QVErUm5YWERNeExiUm1TcDVXcHUxSURBQlBDWnhmMVorTHhQOHBkQ2swQTJZM3lWbVYyNWlyMDFwcWNhNXVEVlpiUTdKNHdSMVdLOHo0UmFPeVg5UHBnQkNmdGVPSjkxZS9TK3VzaDFtbFdXL09XNmhIUEFXZVg4elc4THkzdTN3bW1ubGg5MExPZUM1MCtlQ0NPU1JjMTk5T3NWblpMQ3RIVWpYOGFyNWdlRDdYcWJMVXVNWGM4c0ZlYk9GOXR4WUxPQytVMVMwUlEyd21JdStJL0VNc0ZSOGdjNi9tQXNVMDR3SU00dFgrM1A0NUpFZE1ib2J6c0dXK2lWNlZNeklaTUZ0OGcxNzlUcGkrSU94RzZoSTBKV2pUOFRvMjRBOTlCMHZudzVnNStqM1EyWmx1TXFqMzNVd1hONnFOZW1zbEFlajhKUTJnaWEyM3FxaGcrSDduNU90ZjcycCtKYXJmdk9YaWtaMXJxN0E0SzlJRTBNcFNOVmE4WmlpNkxWL1VrOGVHYzdYQUtEcmNNRVhTOEhuZjlvZzJFNWprOUcrQ1ZtN09oc2tEQWN4OE1Uakt2bDZMeUEwYzV1VVNORDZNUlJTOE91dmcxSzZsZmVuL2VBYlVlQ2ZtTnJNbUtjc2hURG9QK1ZadTVwc3VKUTR2eE5xMmRnSnFtSlZHVHA0Mjh2NVRYYlZRcGw2TEJycThvbXh5cmg3RGRxdlkzZEtSNWxMSnY0c2plU1FCQUMrTkMzVUZDVnNQZFJwZThIT0JIajNVaGFaZXRscndYU0o4ODBpZW1OazRaVVlCNU95NzkveXlQRFlVdVpuTm5mNmtBS0V3bTFvUkZXZzdWTkdabTJTcXg2V2kvek9NbHVudFprT2x1ZTRtMjlYd3FoM2N3UVFMQnByTEw4VjNPTGpOaVVRcFpGcWw2aUxPQ2JEOGxyNUxhMVBVL0Z0Tkl3clZHaUJETnB2bGFVekl1UnhsWG5GNEJTVG1DUUVqNG8yelRwVTlkUnJ5cFR3cmxITlRxRUhMU0RqdEdadmlHWklPV2RqS1pGUTJTMGpRcjB5RjcxKzA2cmJKT1UwYldrV29Ub0F4MGxqS0dNc3VzNUY0RWx3OUV0TnRZNXZPVzN2TUFyamUvdWlaTDRobkFYT3JabHVsVHBTYmtDdUpMZ0VXUUV0dHNTYlNLRTVsaHZmK1ZoczZML3FRZ0xzTFpNNVIxa1ZacTdaZFFqYkhwUEFWNFV1emdkVExteHlPdnFvVHlDeFJvNUM2VWVsbTRxWXJ4anZtS1hyamFmeEdyZjdFbFNLelBBcmJuM2I2L0pha3dPdXAwT3hQdWZMRm44NkJxODkwUE5Sb0xZb25WVDVIZGd0YzMxTFZiQjRtak5DcTQvMWpETE9Ib0pjdHl5a2N5R3YrMEtzbmRTZ1pkVW15cVV6REJMbCs2Z0MwUU43UTI0c01PSnk5SU9DV2g3Yi9WazA4MWFhc1dVS1RRaVNqYzdpUTBETTJId3pyOUVKc0VYUC9hbDVZT0hIbjBIYlBUaU9JcFh3TnoyVCtNMldGdkc0UEpGTC9YWjN3SDJLdUs4a01zRnRvSzFxYkpBaFRZbmJibllZRFZUdGl3d1Q5RHZXWG4vMEtPcit4aTZwOCtVTFh4aUJWWGx6TGpOL3lkcHRoamRNUmpxd21ZdnV6UWFKTWs1TXJqY2tCQnpvdHcySmEvTnNUYml5L0JON21UZE40c0gzaWptRzZ4Y2dxRHNNdDZNSVpjVDJrU0NYVnlxUWZiUkVKYnFjSzV4dUJ6Ykw3QzFqUUUxRDZKbklYaGt0SzJ1ajlaSXRNUDFhRlR3YktrclZ2eGhxUkp5TVRwOHQyT21DTDRLTmY0R08zajFYV1l3RHdHNFpzb0wwMmpNOGU2RVBRaVZ3U0UrSkpRcXJDaHZLUzZGbEVzYi9QUVo0SnFnOWE3TmczUVB0eTZjVFllbm90RGV4KzJ6cG1ON0g5VDhSYnMzeTF0MllOVXhqZWwrOVIzRVVlUk4yMG5XeGx1MkJYOTgvSWhoSEhZa3grMUJFOUVncWJHYXZlb3BKUjRGQUdEWitaY2wvUC85a0FBUUFhQUVBQUFUQUFRQUFQQVFNd0FnQUFBQUFBN2dGbFFBQUNBQWtDQVFFS0FnQURBQmxVYUdseklHbHpJRzltSUVacGJtZGxjaUFvTXlrPTwvQkRCPgogICAgPC9CSVI+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5SaWdodCBMaXR0bGVGaW5nZXI8L1N1YnR5cGU+CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U+CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0+CiAgICAgICAgICAgICAgICA8U2NvcmU+NDc8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk+CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI+UmtsU0FEQXlNQUFBQVQvY0FBRUJBUUFCUDh3SDVnd2NEQ0FyQXo4QUFBQUFBQUVpQUVBQUR3SUFRQUlBUUFJRkFBRUI5QUgwQWZRQjlBZ0ZIUUVSQVk4QUFUOWJBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQmp3QUFBUkVBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFFUkFBQUJqd0FBQUFBQUFBQUFBQUFCRVFBQUFZOEFBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUUrWXdBQi81UGZHMkFVTFBjTHM0eXpxMENpVU93aGRLWXU3QTBvN1dZcnhjc2NVc1dwNkpLYWh2Z2JraUlveFN3MHpZbzlGZllFTFpmaEJNNnJwZk9BZ0lEeWlJZHhOaUo5Y2FSZTlCS21jSzRkbWZ6QWdJRHhBR2JyS3B5bWFZUUwrUzRBbzZqSjdNajhCNEQ5WWhCZE5UMXBLSG53QzRRQ0xBeE5UUk54MVFEM2cyNUIrU2lOQXQvSFdBQVlyWGh4eDQxL3FpVFZrS3VtTjhMTnFEVjlsSFR3U1crQW85UVI1Z0FxZ25CUGJ4UlYrRmg5YkNHVEZMMnVMQWFLYTYxcS9LVEF1ZCttcW84TDkyZ2lSaGdDT3dtWml3cW5wRnE5ZFN3WlFtQmpZYkxLb3RZQXN1a0Y0OUZCc2kzQURBWnZ4SEhncmxuc2tuMXFFQ1dNTFlGVDJmdHovdkZBeGVMaWdMcks4ZjFHc0RReEx1Rzk2NWc5eDRHNGRNQUFjSVJxemh2c1lVb0U0MU9jRzVJMGN0Ny9QOGdBM0VDL2U2ZkVVdmo4WmY4TXMrWnd2Y0VuMHQvcEw1c2wzZ0ZHczB5N0IwaTRIUElmU1plTlFYUlBjbHQrR3I4aS9PNHBaMlpxbEFObnhCRHduejl5QmlDczYxTEt4Yk9aN0ZxMElDZzJRRjJrMVBGbE8zRlpQcDM4NUpLTlFCUkN6RGlFT3BMcjBFZHFINTY0UjZlM0w3WHRBZUtIZ3VwUkxPZDlZRGtIRFdFb2IyYWUzQktMc29jRFFENUJuNUY3bklOU1ZlUXVKUHRPOEVzWWRHYWJwM0I3eVVDTzVHMGErS2RvcDFuQlV4SjVPSGlKbloxblpQNGFROHpNeFNBU0xySlFIakV6aU5temNSM2EycEk2dFFiRyt0ZnYwWFJ1NkZLK2gyTFoyKzZaQTBVOTBJYUQxUExRRlN5QW02TmpCWi9RYnlXTnhGdjZXZFNxSG1yd0xOa0pWbHl0UHpYZ2ozRjY2c2Q1VjZ5eE5UV1dTcXBGNWx0em9IaFVhN0JDenRIQlZGamxpemcvZjFOUXNPay82SnJRbXgrRVNEeVEzdlNWSVd0SkpVa1RBUFhvbzdLcG53UnRhME1vMitMKzZDOENCNlJxS1g2dGcwY0FLeFh5OXdxQWhvS1ArRFFNaEx3K1BpeHZFRE9vOXpLRXk4ZEFvNlBvTzljdS9QVDRud0FJbnBreWU1bGZjckJMWHh4bEVhQjJzTGQ3QU1lai96WXJTakNFUXhBSUZ0YnhTS2lXVW5HTHUrTTJmM1J5MUtvbXZvRG5VdHJJMDV0YjRyb0Q2bGQyWnUzOG10S0VUeHdVNW8zMUl5N0VGQ0xvamtORzV6U2RhcUV6SktaN1JwcXc0bVRLeitUSXFvMjhRUWZ1N3BVQTFFY1JFbVRrWVBsbFZjY2V1KytOVFFzU2VrMy9BRTBsRHRROHJjWGExdU1vVGE3TjBjWHBNVmxmRWhtWFNkbks3ZllhbGcwM3JUN2VIa0Jya2tsZStIY0taR2N0NktBSjJFa25nOFllK3lMSjdnMjZLRDE3TG5uNGdFUzdaRS9Ib25oQWR4UkcvSG9tZlFuT0NiVmVYcmFsOFdoWkRIWWFnSHd1RE9lWlBOUGhFdmo2MUJ2ODdxK1k5L29SNE9VZEoxNUV4WlFYYXVQSU5heHdlWFE1dUJPOVg2ZmJxeVpzVmhQeU1uUnVsVXRVbUtQa1N5R2VMaGdRWEdpZmlpTDdubWcxUE9DNFV5cXpndllidmJDL2M2VDhJVm82TDUwNGhQdXJ3UDRhRHBXODRHRTRhMVJVN1h5WXhjaEtRYTRBbzJSM09QOFNFWEIyaVBNZ3Ruei9OWHBJYW85bUMvdU44WW9SY1QyRUYyZXFPYkZyMFFDdDZFcVVkMVkxNGFoQ0JHaUpCTWF3bmtVS0VOa3djQ3BsRWtqMytuWFMvZ2Vuam5DS2I5WDhuTlBuTGVQU0NObERISjZjUm0rQjdkVEdLQ2lkVWU3QUV5bkZUQm5VekVzVUxpb0YvcTRSRTlVcWtqdlh4SEM1SUFTU0VRamFjN0ZINzZ0R3RiMlVpS0NVMTUrbEpBejVLeGJYRzFzUlBJZnZER3U2NnBEbkZNYitGcjlPcnkvOURvU2FTT0VwakhQTmlxS1hKVHJTQ3JTRFRMTm9acTN1L29mdmdCZ28xak1OMmRuc1RTcHBNMmJhN0Z1Z2hnU3pJWm1DU2pCNDBjRnFkT2RabSsrUVRuSnhESTlmK0hLS3JEakNoMVVBYUN6Qm1HdFVUQnFDMkhCbG1PdFBDMnd4NXg4WXlOT05ZUGhQa2t2TUlDd1VnbnBmc0JaUCtDb1BkbEJ1dnRQTHIwWkthV1ljK1JZYXNmSC9hL3Vjc0RTR1Bna3Vpbk5UWHRBSWpEVDlESUVJOFlkMVIxb2t2OHltOEVjckh4a21HL0hIQTNjZFlMTzg2MStVOGRLTEhHbVlPZE9PdlhtdTJwUGhFMjlKOFhhQjRqK0RlYkk5ZEs1Rmx3OXN5RVQrd0Y2VlBnc1h1L0VKNG0yVHFMWjlOOVBNK0t5UE5rR1Z0N281MDFBMWJCU0JHdmNGSGZ0RGhORnhDWmltWVY5RjhvYW9jMnRQVlJYeFZvOHJic2w3MHhycWhXN055MDhEU054VmxXeGltTXFSbFZzQTlPS3F2UU1LWjZHWUl6bDNKQithYzJFM2RaeHVsTWc1YlZjVzJHTlQ0RjVBbUpYWFplVTgxY04vVXBjWjh4bk1UWEtpK0E2YzBqOCtUMVRzaXhOU05QWlNOajRLVTZobHBmbjc4cFluUDlwdXJwY3ljZ1REZ1BFNW1kcHlYTEVhcjNJQk51MTBqMWVDK2wrcGZBSEtOaDBGRVNFcmJRdlc4eWg1R3BraHJ2Y2lIbWNGWU9DbTg0YzBOemNFY3ZjLzBzWFlpMURFL20yVTkzbVlybXJobnNhdFdUbVorYVpmUENQa0Z4ZCsydW5uMkgwNStzUUNreWtJTUJ3UHJ1Z0FtbFVBeXJaTzlPc085TTJMdTRUVlliaE1odFpUcWhYN3h0Q2lSc25zUi9pMUs3TXVIMlRtY05VdmFCdnhZdStmcWpjbTdvQmNzQm1XbFIrYko0RG5lZDNWUU1ZUUFhQ3ZkcVhvTnBtbDArM1drSThKd0QwaXlJVTlXYVdaa3JsUWo5TU1RdWtBT0R4TEJyYS85MXFjSWRyUUhrZVZwekR1dVQyakUxd2U3RVhKVTNiRlFsTGxLOVo1Ykx6WVQvT0NNNzBLb1FPU1p2dnJPS04rTTFIdjRzd2NaSnU3ajdVQmh1TTlXN0Ztc3l0ZDhjUFZmZk9iRGJVWSt6dEpoQ0FsZ0hMUVNOM3RGbU9BMjlkNXFVUFVWOXhsOU5yNHk5UEsxN1E1Yzd4OGczT2tXcmxmUFdiUkpOckRBNjVTcVhDN2VSdFhMTUZDaVZpRjRNbSt1cHFUV3VTMWttMUFmcVBKSjRBeFhEU284VjhROEg4UllUSXBIYjZTZnlJL0MyQk9xN1k0SlpidDI5aXEyUmJBU0xiVnBCeFFLTnlGRzVlR2ZCc1NWVHd5L09vWC93cWVWMGFoSFFnR3RiSWMxcGtwQU5DZ0pMU3pEaTQvUlYybnV6SzVGVlJRb21KWld2TlNTVUxyaUlGMUg1akJIS2g1ZUFFUGFXalNoS213bWRWTHc1c0RreHQrem9KaEVHbmEyek52Q0s3VkdxT3FvQ0l1YWhKNGJRQkNYTXkyZlQ2U2dud0I0RlQxN0MvQ3lqb0NWTnFyUVoydXIvY3d1L0xMMGtwUkdwbHBuTjREd2JzU0xCUllFOGVFNTJVeUpxajVxSTQyOERLZ2FpeFFBZVlISGdCU2FkUXFsMzl6VkRvakhqRnBINUsxcXZZWHo2WjdmUjNUQXhMbkgyMnlUZ3czZWlIYUl2Z1poNisyK2xaZFJsQ2k2b1RoamVWTm5uSWZRTkV0bkpxdXJrblUrTTl3YzZRNFBQQk5CeDB5MzFENHJZZXA1eURHNXhhV2VIMzV1c3Q3TnN0Yk55OUpwdXIzclhyRjVTUEc4bi9Sd1Buby9WUEE2c05lRGtQclJzd0JFY1ArRU1xWWV6V0tHY0Y1VGFselR6TW1OdUdIeGZ1S2V5MEJ0OXI0VU14a0tDUDRSR1ZHYVBXV2grWlhpUWFPWnNQd21LN3VxSEowQWs3VWcwbVQ0dTdBRzcxY2taMXEzbHVQOTZWdGhaNWR2WTZMOU5zR0lUdGptQ2xLUWNWdEJ5MGU0ZmVJVEpBUGpsUVBLOWJPb2RNZW1pY2ppRkJnVWF6dTV1NndiZjlad2Y1UTRSMjhnODZUT0ZVa1RreGlKWnB4b1F3bVBmTmZ0Q1BHQ3duYlQ1VVYrWkdNQXQ2ZnRRWFRVRnU1clR3VVdmRy9VeGhNQmtMRFZYNCtlQVlFYzZ5NGJLZVF3ait0d01scnI3MzVZbWRIcWhKeUloR2RMd3lSUDJlZkE1ZXBpVVFVZ2hSd1N3Uk1YU2lMc3JxemNRWS9wRTFROHh2M3V0VFZWYmM4dnpKelFRWkFUWEFMeXpKc0xxc216VWFMNlZWWmNtbjNXQ2xQNjA3U3drSGR6SGtCejE3OEZNcWdJTWk5c1dGQ2Z1Y1ZJTWdMcndQd01PY21CUEExMFQxOVJldE5qWkNuc0FHSGg1YytZRE1WUk1NWnNzYUNWcFNtNHpXVUQ0K0xuS0VhU1dvbGpUM3ZqMkY0bTZaeUM1RnM2RXhZbEtqT3B2Z3lYNnorRUtiOGEvU2VnNm5CN212R1R5N2FvRVJ5NzkwQllKcjZMQ0UyUllPa3hsaTB3MEZ2UUpmV0c5aExXTlZTdmdldkxVTjV2Zkw4MGpKbGNjL25IYWZkZVRIUS9uTXNCSTlKVHpKVklsR0hkcE9FdDFZSEpCcTFrd2ZNS0JKRlREYUZhV1ZHZlRGY0gwYis0N0pZNVpOOWszUk1scTdoazZvOGh5anhVUmluZlBFK1YyVnlhbHFUbFI1Mmt6c0pnMU91VTJuY0U1bHZONTd3V0VVSDNqejRaYnErQkNjV3ZFOWRMeWpSblRVMDRNbkxlczhqbE4vREg3YzNPUklpY0pqR3oyajhNNTdXS0VvYWpXOVBmOHpFQjRTc3NuclZ5TUZadjZlQi8ySHBpekM5WDZ6N1JYSUZibk5qWFNxdXRZdVM2b1B4VjdpV09KQzZrUThvZ001WVM1TGdOQ2lOYmtLT1FxUWNhcUt3WW9rcVR2QllnRnY1cGlHQlIwVE5nbW5wRXlvNVo3akZPbWQzNGNYTnZDckRoR3VURG5KNDE5Tk1pSjd5MmRrTFBmTnZYSW1kZGV1OExiRlBKVEZWTStXcG9jM0V5OVJMR1VZWTlvUEhYdXZmOGdkSkpQSWh5VHU3ZU5yMUtqSk1qSjZzTVQvbDlDTU1lbEhZS3ZkY0dtR3J6ZkZ1WkFEb3pYb01XYVpwUEl5ZWZDWVdLaExTNXVXcnE0OFFyU0dNZlA3M0YrRDRGb2FHV0loNWIvYjN2Q3BQM25MMHZlUkY0TW1XTDVxY0xCbUt2OVBqbVVzOWRuZEVjazRsNDRRK1NtWExPZFNkdkFYbk9NdjFFcDZYTVdzWDhveTkxWWQvU0NEa3p2dm96dTZRdzJTeFRhditjQmlXS1JXakY0OVUrZ3FTZWw2dEhVOTdwdCtReHNaK1Y5L09La1lnSFhlV0hKZ201REdmTVRVcGg0Nmt4ZFZ5MERHRGxoMmRxNHNtb0plQUN1aERsNlc1Y2prK29Jdk45OWVvbFBBVTEzNk9vYjhwc2VpOWpNV21aSEkzMUt0eTdQMFBpK2xIcjZpVXdNRjFMNmt4SEt2d0JrRDRWMjlIeTd1MlBTaFBhTm1HYURxM1haZ3BLbTBxeTJ5eXhjcjMxKzdDbTZQQmx2ZkFHOE14Szk2NUx0eHpCUlc2RjZsRE9UbXJ3dTVnMmVuREtrTlVSRjQyMGNxWVJzakNrL29KN1I4REFyaHdOY0NITExsZkIrWExkbFhhSU14WllvbldSbWhReFdPREtmajYxR0I0V1lYZkhPUkxwdUU1bFN2R3JJdEt2eHJhYmR6Qi96RHoyWThpUWRXVWFlNXlPMThrNE1xSkdhc1h2UWRaK1g2dCswbDQ1elpXY1czNlU1WE42NldMMEMxWVVMeW1ZSjQzbS9OZkNVZmkzN0VlWCs3VG04dTBTcFk4N3BhS1VZdm5OWVA1anZadTB6anZBZlVjRGJJZEpUMldjOGV5U0g2NUp4anRPWDIwaVNmR2p0QkQ1blc3dmplNE5NbzBvSC9ieVRHUUxLdTVyRGtrcmxDS01wSjFjTXphQWo1TnVRVzlidjY2RWNVTHdNeXV5aU9Ta214dWtHZEVURm9VSktLZ29zbmNGOVVOU045NnNLek16S1NkZWh5OEdCUC9mWlRlTjVZa1J6OTIySkxLdW5iNmxqZVV2ZXpFZmc1a1hSYU5xbVNsZzFCa0hlSFNnMGVFMTAvbW9UeHYyVDlwZURkSUVCZHRKK1ArSkptcWtIeTlZc1hGREU4bzdTSmUySjhDR0I0UG0vZWRwTlVjOXZVMmRUdHJXYUlOWk1jNHNkNlRJVjltblhJSEJGM2xtd00xdjFVUmY5WVN5WmNKL0dOeEVVek9qc28raXNDdW5tVUliUk5UZFFUVlZ6MDdwOHVaSlE1bFFHR0FPelFlRGtFeHNQc1ZwbjN1dFh1dktqZTQ1MDdsNTlXZks3MVIzU1FROFJHeEtoOCswZEUybnF4V1ZiYTF0SzJHSjZidGVPK3hlYVVoUFM0Z2NaWFljSFhpRWlTMHptMGk0Y3FzaGszZG15a21TTEdhcy9BYUFwTDV2TS9WblBIc3hjME9DUlRmM05FZWgrWHpZd2NheU5tdlBYcm9VN2d4VkIwSEo4bG54bUUvTnc3TFFWcStWQmYyV0JyT0dxbVBseURNOXMxM1k2R01sMUtWcU94SUhhT2wxbnlsbTJxYnI3cGx5bFptRGpOVHQ5ZnRXekU2UjBFZVc4QnV4WWZISGxlMUJlNGhQRVkySDZybTRZdS9zRzAzR1VYRGJCeVVPQ2tnUHJiRVJQVS9kUE9MbnZ4eWFHOVZpbEppL3lhc0FCZ2lIVHU0SlBNUE1pdmxRUGw1QUNoRlVSclBsZlVIK0RHQnQ1MnNaNDlHcFp6TWpzMHFiZ1NnL09vdDNjcFpiZGh4NDQxQVo3bG8yVWNhcVlxM01JV0RrRzVtejNuNzdNZU1JVWtocUNlL3BZVU8zR3djNEYrUGJHVXMvalBWL2RMS1pqcnZFRmVWUmg0SlZMSmN5endDeERMcDRHL2NFMXpzeVRHR25tYkhuK0hFVTd5eWN3amw2NkU0eFdSWjhIRHN3QVlmcnRONXFWVWpoandCNE1Lb0hoZ0NFenpmeGp1TDJqWjdEdytTZE5nSVIxRUcraFcyMkdvdHVZemx1RU9ocVR3alExeXVCTENIeHVJcldNM0YrTmMyN2cwYmd4WTNGQjFwUzBBc1QyZEhyUEQ3dHdpM0g4TVJvRThwTjhWdmJEdjBwNVpiRGkrRUhFc3VrZEp3Q2pIQjkvMkxvejdXWHFMSmp4d0xjNGdyeG1ZZmk1Kyt1RUlJek9BU2krMUpwRFpsZ09sbWNZZG5PS0JlYkU3TEU4QWtrRU9yMVJja3FvZ0htZFJ5ckl1OGJmRGt5eTBqekxLanNkVEh4MnNrdGZtZjZBYWtOMXpQUGlvVXprbVpJSVRIaHJFZEpzY2xYU0NlamZKcWdMMDNRMVlPaTNZSHc5L1F2R3o5MGhFUktsRDBCTk5pK0dRejIwTU5iNHFMdVA5MVQyZitNbnZoTWJJOUYxVDF3NHI0SkdxcTdnc1JtVEtOYUJabkxham95cXdXbnp0bjcrVnBkRjArV2oyM0tUa0xmTmFnQ09OenVad0gwa2hXSldUbDBuVmNtNG56cG1qcVpCOVlKcWlDSE5Eb2xjRDMzYVFhUkl0RTlqQ05mdXovUlFYTHZuTzlqL0kwbS9mVVRpWTNvUjhmSjYvU1ZQdVRBUjErK2YxMlAyU1J5aXJvZXlpaStWUGMyWllRM3NCR1F0Wk9SSzQ0Tzc0M0hzVUwyWDN1bU9nT3pFcjFFei9XdVNHUGNTME9Odkp3Y3V3VndhVXJ5cFZZTDU3VENoOTB6ekg3K2RHdDlwNTVHb2Z1bUdYWHpmWFM3eGp5T0tHbGFsZzU2TVVwdmNsWTRvSlczOUxzc0JsZ3dkUkoyRnBlWWdRUU5QbmtFUFdrNjl3WXM5YitxUUdPYXA5dDBWcjBKcStLdmJaOXZtS2FOc01kaEpOL3pPM0NaRWIvUDBrUTF3anloaFovSHBvcTBVTjUrN3lpSDVQSHFKTHRIcTNrTHZoZGJoZUpjZWEwUVlzQUhxTjdSUHJoSnlJNUk5VlhJT1BOVDJiNDlBTDJUTXpzT3Zid01zeWUwQ0swdlZLWFdoS0dsVzd2WGQvMzlPRXBVN3FzMjNKYzVBRWZic1FoMUdwU2dsUlNIazlGTzBkM3JjRndtTVRzNXExZkZ5UUk2RXFKS1J3cGdHcDJzdGI3ejF6UzFibUFrSHJZbTF3NlRVOWJ4R2hiaWJMRkhNZ052UTkzdm5lZFpTWng3YTJBODMybk5NeS9KMFdnMEg4V3FXc3d1WEZZOVd1ZnVwbk85dGhzK1d2OU5UQm1qMytFV3cvOFBNc2NSQ0w5NE1vUDNLMS8vbmM3ZXZCa2hnWkFLMThTUUhHZ3RTNnFNdXFxUDMzR3hOOFlOM0tlTElINkNhcnV3ZUU5NWU4SmFrNGtiS25UcndwUWlZbjk4Z0RDeTRQSFpaMGloYjEyb0lpeklESkdMSjRmWkdHbWdOeVRhUVI0c2xqcndGdTBsUDU3NWdqb1RkNWZPRkFjWUpsdmNBVzZkdTJuZHZCQ0hXMDd5ZGpQbUNJWXpBdVFFVHF1azNhZDhNaXlJei9nZFYxQzUvT3o5clE4TTdTZjlHZWRlRWNPYkZSTXJpQzNnNG9ZWnBnNWs1NDlMZFNmQmRJTGo0S0ZlclhmYk90MUs3UFRtc25UNkJhTVRVRkU1bm9LS2hCUHBwd0Rka1BzeFBGa0F3b0ZKZnRlZ0lQNHhiK25mTGxsNWQ5TmpFcng2UHk2ZDdJZWtJUStwQThob3dzd00wSjF4KzI0SFA5YytTMFBGMy9YN1NpNzdxb3pleG53WHdvZFBaMEFJVkFPaHlsMnZudlZRNUNiOHFBbmh3VUFqRFJhOVBoTXowV3JWOUNaaEJtTTFpUWxQTW1vbTg0Y3hUeHZ4bVlmS2UweTQzN3FxSzIvS3N4SzA3WlljdFdSdXRsUEpjNGROUHlIRHN5T3BWdXQzY0ZQRzVobVBZQWNYa2NzeElJeUloeHE0L21rNXU1aHNWR1I5WExhaDFRSWE4dE5EYU5UTTl2M0V1OWM1SXJUUmtGNUpCT053ODVuaEdYQmZOUHd6YS9ia250WmwyWEtEYVVoSTdrem5JVnVobTd1RDZSQVlKVzRRTGJrOGNLNkVXQUZOWStKL0FrZHZaRXFyWHJaSE5vMk9EeEE0M3hHOTB0SHdIZmE3bk5vUjNYMHErcUF3RXFqd0JYdkxadUtIZWNtOVF4ODJSL29IZUJycm5Oa0ZCNk93TS81UUhacVNFakZXZndrSEZOazAzLzlqTHJxYUtyRGF4bHFVUnJ0ZWxaTko0VXlQVU4yNURkNFd1ankzVzRvRkhZbUZnUG0yVE1oTkIwSitheHVlVk50Y0tCeVZRRHZyN3E4cHVPSVdYeE44V3pLNW1JMmlLUGNIcEFwd2pSaUdESlpQS0ZEdjBQUEg1M0lTVUpPSUN5cyszZ0kzWU5CaDRnM2J1RHU2WUJxamtQaTgrenloTVd4anBVQnRGVitUcHFYcUpNNUhUOXloS0kyYVVWVkppZ0VOaG8vZVFFSXpoeFNlOU9EQ0hSVVRBTkpJZFU5NGdIdnVCeWowNytTR0x0NzlGaUhGVFhvMFVnRGNLeHYvenFIMk5BZjA4RGs0Qmt5VW40STFCbXBwZzBPNkVjVEN5a2JnZnpBMG1Db1FoV2RlZHJPQytncmpXaUt1UEllUjhQZHhZQlBEL3JxZ0h0aCtmMEcwbWRTRTZvenNEZzJ1c2NtTmRpVDhBV1A1cnlCd1ZNci9QR0RjbFFIMCszdUpBZ1hLS1VCb2ZpRGp3YU5PUDFMYzhHODZIVVdBQjhlZ1dNdnpPbGlFam5qblBhRzVhd1kreUpSaStNekJyZW5CZ1Jmek5KSTlmY2xiOS9YbTdOcDRiSTg5Ynl4Rm1OWmJQRjVkaVdVVENJT3VVcCs1K3lZb3BlWUsrUzVtY0tGand5LzNReVNEY1NDREtjL2tTL1VQYndzMDZGRmtuYXNsV1ZzUjdtNjVRNE5mZ2owalNyMy9zVk1qMnBzL3hSOWpFdE0yOG9Zem1CQlNVOVErN1hGMVlHSVVNdXU2ZXBMbmY2SzUrL0FwZjBqT0YwNXhHdEUybU9XZzBwM2FxL1pNOUZBVlpSbDk2MVFYZlg2Unk1NlhaeENVLzdrekNEVndtQmhOcllvUEN1TTIxOW9pK2NxK21wWndGS1czQmExalppTEJPaHYwZEd1Z053WjFIOC9OY3ZBZml1ZFdiNWsvMWhkUW4zOGhhZ3g5UmdYNmxDZFIzeHBJZ0Y4RWRYMU1oOTB0S0ZRSko1aTZYamNOY1VjeTM3M3YrNlAwTVF2YmdjVmtYK0h5Y245VDRlWHZQOFhoaUNIQncwaC91aGMrbzRZNUE5UDRCZ2Z4NUUybUFhVFZhWmZRRURESE1ZVzdKbW1xZmxUQ3JVVTRVOGFqQXFzY1RUZGtoTXhrVWRHMWExUHlEMUlUclZGZm5NMWxiTFphMjRRTFI5MWFta1kvQkJnWExZYU9PcWJsdndibTBpU0NPV3lKVVhQejFQVjltK2Y4NldxbmZuM1dHSmROQTBjbFRkQkE2K09vaWdQTnAwV1ZITlE3QitsN1V5UEV1U2VrTWVVOU5kTEViUi8ydHNCZjR5N3MyV25uOFZoeGxiazlUZ2FQaXQ5MDlVMU5NamVrNGxKU2pobWhQS3c5WG5MQldXYkM5ZUtPYnMxLzFqWjhobWgvbEZOSFovb2JFM0ViTWpxWjErcUNmYVVMTjltaDZmZmpDN2dCbHlkZnV6eHpHc3RVaTBHNldRck13MDVMbXVuMXdHRllJT2hPV1oxeVNUOXJuMEltT2thVzFkekUrYWhFQnA2TTYyM3V6VTlONGhHWUoyanFTZk90VC9RTzRJREl3N0UzTElnWkd2U215cEVJcUpzd3FHU0ZWbkdFRmI1eVIrblVZYUtWeUJyNis0TmtMV2hiMzdsemJ1UUVRMk91TnZYZXJoeUwrQk9EZTZ0aE5lcG9CWTYxSllXYUFDbHdQc3M4UFl0elBYNTVZYTRnYVlzSWtwcC9GZmpPNVR2RXNWWDJPcFNvTmdPY01scDlFSXdvcUl0SlVYNnM5RmNHM3U0U0dHWC91TDl4NDgyZEZyUWxrakF4TTdBMC9JdVZxOTk1QVRGaW8vUzZFMUlzT3hLdmRhNVdWVmZNOTMyL3RjT1BsQ2QxV250UVdrZDB2UTd1VW82WU9lVktGdTM5eTJwSjRJU1RFOGxIQ0E1dDNFeG1EQkwvVWFlbFI3S1FYeEUvT2VManZPYVlNUFd3L3RMcGtsMVg0Q0FnSURtK21nQXdNYTB5SG9pNk1HZVkxQ2NraTFZSzJsNllsVnlnV0pvblFJVXRVNHNOM3RaNk4rNmRrZXdqMU1PQzhaYU5SUVhQRnpUTFZmOTZVZkJNelp0VkZXQW9GT2pxUllOeVdSclRHdHJwWEo5RnJDVzlaZEUxU2hwUXJkalpieXA0U2RaajNrUlQxVWYwU0NLdS93UnBWTkhHeXY1ZG1QbzBnSS9zbXhiTDdBajFPaVdJVkFUd2FqRStHYjRrNHFNRXhzOGN2RG0xRnVlVUt3Zk11UG9aNTZ2QVBsaldoZFVMbnk1aWJXMW1hQ05nMFVieUEvRHg1QlJ6c3cwQzBEbXQ1bWROenZrK3J5bU1MVFZkU0FkaTFOWEFaVDJXL3g1SzhxdHg2WDNaZnpLWTRmUldCbDMxbWh1SmJSK3V6QU5paTVzZmw3ZzhRbXJQczJjUTJabExWYXpoc2pKVzBzSWdrZ1RBZGdyZ0loTndrOEd6ZGRuV094MEZQOWFkSlVZeFZxZno1WEowdkV6NS9oY0UzMXpWbTJWWUZTZEdheTZ6eUQzYnA5eFdvYWRwVUJUOHVPYkFML1dCOGdsZ0sxWjFSWk9QZmliUHJPSUtWQmsxUUY0SEs4bjFTcFdFYytGZmVjQWxzbitWVytYclFLNnRHRys0aTdRSUVzMVhYbEJVWk5aMGZ3dGtsRzZOR292UnVQYnFsd3pMd0tCQWR3Q0k2YjFadzdBQzlJZG9WVnNvV3hGVndMOFZmVHhKbHpmSkc0eFp6YU4zd3NLU2k5Vyt6OUJFL05PeFBJYWswZXI1eDBRck9VQnhFbld1YXM0Q2VOQ1ZIVWZCWmN2R0ViRHNCWmpaQ1JpU0V2aXVrM3IzOXRXdDkrMlpCYWpUb0IxQU9rMFJucnQ0Z2xCRzFnMTlIQ1BoU1ZISlV4eXk4aWduUGh4VzAxK1pMcXdkMHE5L0xBdk9PaFE0b1piOEx6Z29nVlVKSDVPRkdlNWVCa0YxK1dVdWRyeGNQTUxiOW43c2o2Q3hPVXZzVXN4QmRqanl0ZTlicXgzdmVmcVlEY1NGWW5sUnpHSENXQjl2NUFjVlRZWURRR3VUUjZkVmFlSm1JVjBIQkFTWmkxeVUrMjB1UHNSa3dOeURPd2xTMC81SmUxSzlZdFN1dGUwOENRclkzSE9TV2llZG0vdWRpTEpZQVBJeGRXa3k5VDBaRGhwcXlCUFRBOHhkR25nVFoyZlo1VkdqMjVBOHN5TXZHMUQ1M2ZqcFhtN3M5T2oxR2ZGOUJsMnRCbDFyakVBeFg3bkt1UDRpLzF4M2RBN3ZtNG9xcXRtSHArWkUvREhFcXIrUjVZUjkrN0hES3AyUVJXeDFVdmdWMUdDcjJuenJtMHRYdnNvU1J4VS9iVFJZSkhkai9FNzhCQUo0a3NWeG5oYW1WK3hkZTJCOEVDQW9UNGprcW1RdnBtU3JaSzg0Q2pLMnJlVXAxamtNaWU4a2lFaVMxdU4wNzJXeWtQU2F5N3dseWpPQkR5VWg5VU51TjhEVXYwRFNIak5rRmRyUTZkdGdSbGVMVzhRYjJBSlRlSDAxbjRHeSsvUlY3K09mcGpwUC9DT24zRFM2N1dCd0gwa0Z4TmY1dTU4RU5nMWF4eGdwUm9rUE9vb3Y0MmhyNVpXQkgrTGRURC9HMHJsdnVGM2FobFlYSHJNWGtESUNMaWNyTmxqdVdiR04vOW1tQU1Zc0FSb2tTdC9WaFNSUFcvMUQxa2llYi80dFRKUVhsYVdUay9JMVVVQ2hXWXJndEtGZGxMZnZQQ0tFVkU3L0owaklyaEtudDB0L0xJSGJRbSthek9TYUZ4WUlHc3lpc1g0L001UjVWeld4bE0vTE14ampSQXVCOEhrWTRHNjBXR3RBTTFXem1TREdwMld3eEM2a3BqYXQ1WDRKdjNXRWFnQSs3QXNpNjZUS1pDVklCdTlGelROY0FHQlhBZ0ltZWVlbHhtaDMwVktqTjBWL0wySU8rOWY4K2VHdktGYmU0Q2R2ZTh1NGxMd0VXTmRvTEhjV0kvYXRTVjhQaEUrMXBrVlh4NTVDSm9wNWNscXhVOFlXdVZ6bWxRTjkvV3dIMEp5N2dWRzhUa01NYk5CQ0VRdEYxaXFiZGd2aVZzY2o3T2o1UmhDaW41TXZJekEzTmtZdEVlSlRNMUNGWDlFZ3BZU0xoVG52UjNtbE9zbkNVc2FKQW85dVFDUWs5YWV3TUxsK0k5ek5WWnVqQ2hLRlVSc3BaRmNZS0J6aFlucWpBUUxITEVST3JNTm9GQlpheVg5dEIweG1TZzB3WXhtcWlMblB4Tk5BZ1laRVlaUHk4cnNmQTdZSlJHSW9NWWljeWljTGxVTXdQUTFLelNQSHlqYkJBaGdVa1FtSGFFQzV0TmxsUVE2VmdVMjRJazVlcHJ3d3p1YWZVNmM5NVU4RmtVVVByZVVzMUdGWDI1ZTlqTjJJWC83SVlJZHhpeUJ1SGgxdUlEREpBUU9sSTFlL3RUVncrYVZlK2F0elZtUFBhb0FwckQvVlI1V2pPYk1NdEwybWZQa05HRjh4WTU0cUZuK2VNWjFuTExTa3lKN1lFaXZ3SmhWSWJUWnJnNHpqYkFZcnJUOUI0cTFuZFZuUnhyVHF6ZG9ZY3ZZZVBQdVVFdDFUWFNiUFI0U3lmRXRJeGpmY2tHRUc4aFVxZnNKbTlPdVVkNlZNRlZFY2JiaE5QazNnMEE5NnFSU0FDM1gxUHBjNkZwanNvcDFqSFpFcnhaV2wzeVhJVzBsa2VNR3V2bXcrNmNwTU5SN0VJTCs3Z0lUenVhQkFkUmlELzFmOVRsRk5jd2N4NGZCTlNsYlJ2Zy9XK0pCU29lSDRVOFR0QXVib2xRWXU0SXN2bEtWbkZITHFyMnVib252TXRXOUl1QnR4OHR2a25ybnJYOWhncGJMRDVPdUNxUUlpdlUvb2ZWTnBYU2lsMjF3b0RHSjBxNXY5cmRVRExLQ1ZPcTRKbFB0QlhsaVRHN25NSnZJekRTTUNQNVZMaFB5Sjc3aUttNzh1SGpaNkJjQXM0SGFOdFhzZ1o1SFIxb0svZHBtdVJyUk41Rks0T2ZHR2ZZQjhGNk1HS1lVV0lrOXh6UURWOGg2L1EySm40ZzZ2Q1RiaGZlVVJhcWF3MERKT0xDcnA3ZWFOOEN5QkV4RUFObVUwcHQxMGw1ZXQ2RDlPNTlheWY3eEM2cXpHQXlXZTl2eThScFhDOTRBWk1uMHhkZis5ZWs0d0tjd1RsUnBMeCtCVy9yakErdXhvVTRYK016L0ZGazBldnA0TjFLZ2V1V2VCSTdiMlg3K1NpaVlRZFBjb3lnY1paMi9Pd3hka2RBWnRhRTVRNzdpNmJkWDNIVnFER2hGMEcwTWQ5alN6dmg5WDM4NklGRkF3bmpzRVpiSy9qeWNvbTh0N0hVV0g1K25GYW9oMFpTUGoydDVTMGNFNFhRUnhVNHl0S3NpZW11L2I0d1FVVmZWUk1sa2F6YjZrZmtQM0pUL0ZSQ0RoVUYraXVDbUVyYW9GK2NrMVB4dE5mb0tMSU5BVWxMdk4rRkx6UUtOMlJvZmttOWdBa2RuVTZKdmFoQURLL1htMmNTWTZTM2hFMm9STHlQQjFiSHZHZHU5VGd2NGUxVlBIb242SEJNMm9Edmd3Sy9XejU3ZjJWN2VTUm5kV3NYMkdtcGM1VnNmTk5ua3lXWjVScU85VW5jQ0UrakFMRWE5aGRFQmpwRCtiZnAzUjRDck10RThTZ0g4aTRxWk1rcEIvendTTStNL2FISzI1TFNPSVNHQmIrUmlOME9hVVBJKzJxVjQySURvakNJMzhTN1orQ2JlZk1DMGdQUHZrMjRQKy9PWGpRM1o4YW9ua0FWNENzUmsvdVBNMmZ5Z1Jyc2I1Q25lcUYwbXd4TEVFUUFJTEVLN2l1Y1BhT3RlYXV4S0FzaWNsc053WnQwbFdteW5uZHNpVzluWStnMHlUUnJlOVF2NXFtdU9wY216cE5VRnhGeTAzdG5uNFpwWXJqRUsxRWNRNjRNaEIreTVkL0xNZkJCaHE2RndxenBNZDIwVXdYYTdMYjhkS252TWlhMm42dmx1L3FNbE5tYjlaV1I5Ymo5bHl6NnkvMnhpYjlkSC9XWkQrbzBmYmEwWDIwYi9COUFGKzl2QXhaUWthL2Vaa1JlaWo3QTZsVEVueWRxZnBBdVB4enlRNTN1UTlvVFIxOW5ESUdrYXU1UUhKSWhnWDZuV0hPamtxMVlMUTZ6ZjBIZFl3SW12Q1B3aDJqQlpxdklYanRudzN0SlRHTHFwNFhyRzlUV3ZMMXFqT3pXWllxdzRvQlF5UVdUNnBNNlcrbWJJN05IM0t2VkR2Y0JCL2swUmlOYTlpakNGZzMrTm14OGszekhHd1BUYmp3UFFWb3Zpb1NyUm80MGVJVUl5WDhIcVhyWC9PSzJhQmNPN2FYa0c1NTJFeG9hVVExUGNDSjJTcnZwN3VFL1ZiS3J2dmk1c3B0WExwVldiNkZZa0l4dk01ekxPSnVRNnJWNVg5R1FwV01VZDRXWjJUWkR0aWNyeHg0c1U5R2NCenhJaGJ2SnNIellWMmxoVlNsMDJLdnhwMThGWEN6QzR4U0V6dXdiNUFzT016YStxUnQ4dlRWaVNQbEtUbFAyMFJsOThQU3FjR1FkMlY2aGtuQ09CamM5enpBanVnb210UU5IRHJXbGlTc3djdmFIRDZPT0RBNDBYR2RQUzhIdEg3SUhaSXIwSmtPQURsRjFtbGxMK0R3Q3h4SGkwM3l5R2cxN3FnQWd5MkFKU1JYVHA3eDJtZUczdXFnajBDOEtCeUpoT2tSaENFaFV1OTFYUGdLdFRub1FRVFZtTTVvSGsxM0c0bTJJVTJ0SGl3OGtxT3A0UXRIZVpRaThIN29LTjRPVXVSa1hOZ0xONFNsdDd1QUkzdGNDRm54U2hKSlhHa3h4TnBxQmd6eGd3dHZZZEdOQ1JpZGtQMnpURm5BTzFtZUJrYjlTTVlveFg2MzhyTUlieC8zMzBuMGpsdXVzZDY4OExEdHZ4Y01MR1B0MmRLdGpMb2JZM0I2R0RFVFFkMlEwZ2tRMmdHb0tnMnJEK3diZkxTa2NSditZb3dTMXBrbVdkWi9EZXhkWVhnUWtZY2RudEFKM25hdElwUzk5emJpZFJsbVYyL3FKemtVLzVzQXdHV2FCMEVLbkU1TkIrb1Zibm1CbVQyaEx6QTBjejFxU2JnWXdGRTREZEsyRzZ3ZWlEc1VsNXVsVGlRTTVmdmRuRmVXdkcyZmZIRmIrTkVrZnFJV083VllQVkJXQ3JxdDFZUWNIMUZMZjRhOUVJY1JONG9VV3Z2aTQrMWJjMVRMQ0V6cDVHUzRXcFJjTWdSSHhGYVNZdllDRXVPU2xnS1dpS0ROR3dRdW0zTGlCNEJKdGlTNVhwVEpaM3JtY2JBL1BjUGRoU3FqbElHWWRKaGJWeDIrZVNNRUxqaC9hREROK3g0cU8yVWlXMkVZVm1aUTljdm84c0xDSlBjVGhsamxBWUFPT0JRQzJYU2FlQ25mOWFOZzF1SDZMVlZFSUtxSEgzNVlLRzg2OUpmd2R2SkdzK3RoMUkyT2Q5K1BnZTlDS1lybXpzWnJ6RksxamFSaUYwYStJTFZLWkFUekJoOFhEeCtrbkxuNHdKb2NWMk9RNG5SZ0tLanZXQzNaRWpZOWY5YVBLLzV6WDIvRUNDQTlqb0ZlampaOUc4NW1VanJ0cEZCUnpEcDVOMTBWU21sRHYrUkhXdzlkWGZ3QldJcjdNNmdsdWVkT09SOGVGL3RUbEt3R25qWk5NZjRHRmNOS0JueEFLRlNtQ292eStQTnc5TTVWcDZ1YlQrWThTTmM5ZFB4SVoxNEd4TjJ5cVc3bXY5SHFVcHRFRWVoYXdnWFBLTXFubzdlQm4vWTd5RGdRYWZpQkpyczB4eFUrZ05KL24yQnlRb2N3VjFneDRPR2NRd3RvaGNxRmhFaEF6bFdhbU0xTncrT3RhVjJQek1PeCtOTU9ZcFdqSjR1bEZHaXBWRG9JWFVYNkxwNjdSL3FVdDdYdjV0azhpck4yUTFBVVdsVEVKcGhON1dOQ3ArTEljd09yZHNOQ0xsb1hBZjVtNmY1K2h1NUlicElvVlljOXNZblhuK1N3aURZYmpwN1dmc3EyK0kxQUhnNXJwc1BRK0h5L2hqdmMzVHcrbFp5WmlTcGtMN1pNVitsY3hBUlNwc210bmN1L01zVmtEckdraG56TFVwcGpweERxY2VtZDc0ZmtiaEd2dFd6OUdMeUhYNitnQ3JaZ2tZOVhvSXNNc1FQRXlMVEdxZXBOWHNVdmU1MWszS3RyTU5kZHQ4UU8xWlhvL29pb2xHbzhQMTgwcjl1MFBvT1RreXA2QVE4V1ZPYzVobTR0aTlrMU9ZQnQzc0h5RnVRanZtd0V3ZFRtd0IzVFlCcUJJajdma1NSZVRvMUhVYjJMNGFDa21EMWZ3RzVCamZNNGI4dXdTNWphOEYzT25idmU0akx3aUZiOWNYR1d3bDEyZUdoL0pOdDczeDdPeFEyZGtIM0F1b2VUNXlRdG1wVGFnaGxhWUZiU3ZEUkdVd3VkUzh4aVlsd1VicEpzOXlGUjFjVmRiMXlBVE9SNVlON1BHV0pMNDBUKzhCTGlnODhHYmZTZzFTZFp1aXkveFJvdlBwN1E1TDJ2Zk9NSFRzOTBnbXUwb2NBbUhqenQySzVzY3JoSGJSQkV6VVYzOWExL3FPWk5yNlhlMFdSbVNzZlI2cHRaRXRKbW5tWkVjOWF2WmI3bWlsTTFQTmZPMitNRUJ3VW1KN2FuNGdwNVFvMUFEaXA0VGVJakRZR3hzaWxzMWhuaDgxR3pJY1hjVlpUek90SnY0bzg0ajd2a0Y4ZVpkT01pWkJsWFBDd3dxbVlHdVZzeDRJMmt2YUQyMUczVWQ4aVJaZmk0Z2M0VjZDUWVmZGZXdWhheDdac21HeitNMSt6aGFGd2xSei93UG9UWWlrUXN3Z2hYR2Z6Ni9CVzZZZkRyWjNmWG1RWFBrVTc3c3BrZVM4dzlmT1VFTWdFeXdzVWliQXBVWUJQa1EvOWw0OS9UODNtNnZkdVVReSsyYTZSbm1ZbElFSXlOMkxXRktBTkZrWFExREJBYWgveEVoSHpRNCtGKyt0dUU0MjVvRFRCaXRiWklDMlpPbXdLZEVsZ3FaWmtDYllyOVdOd1hONklTaDUvZWF1M0IrQ3BCd1lKdUpLVCtNOHhGQUdQc2R3ckRnd1lVWHVzVzFXcWQvcEViVER5T0ZidjQ1OWYxU2pHMzRncHBVQS9YOFBZbS96NVpvUDN4R3hhTUJnK2FvR3JTYXVyMHV5eDA4Mm1iMHBYbFpneXgvTEF4ZUZxUlcrVml2YmM2Z2VJcG5mbjQ2aUlKRzdnUXpjc0lRRzQ1MnFvMWpDVnBzYlgxaXoyVWU1MW91YlVnaGtpaUhReDgxbVNJR2hkU1hlN1NORWlpQVoyUFlKblIrZ05mWlJaT0g3b05rVEg2b1Q5ZkxEeG5LUTBsemY5aHZmbUNWQmlLcXJTUWxKcGsrdUNReFIzWHRFcUpjYWlRa0tqM0dzUHJSWnFVMnd4U0o1RGRycUc5bnFMdkQwb1d3MDM3OEdtaXR6M3FId01BVDk5dnpnSXhWVUlqLy9NRkNxR0pxSzBLOU0zZGJGTUF0UGVjMWlQRzJxUGEvd2F2a0NEVEV4c1RoSVVqQktycTJwN1k5NVFRejkvWjNWcG9kaU1xZkxPVGIrcDFjblRkNmxXZDlPSS82aXpqeGJjVG05cVJrY2NWenZERFZNQk83SDY1ak55Zko0RUp6cHQ5aDlNWEtvZy93dHJneUJGa2w4WlBqV2pWbXl0Y09iZ01MV1I3KzNhZkx2MDYzMVhLVFMrUHJ0SWJDdGw3RHhtWS9WSTlFN2ZlT2NMZ0oyeXRuN1Q3WjYxUE5xUnRGLzJrR0I0NHhyYlQxL1FoSTMxeVVDcWY3RUtkcjgxaCtoTDd2a3BGZFdOZ0tvRDJmWHlMOFJ2MER1RGZvREtkZkpkV2oyZzE0RW44WUVhS0lNQld0OVhqVEZnai9kMENVUDFJK3lkRlk1OWpHMGMxZzEzek5ZZ1FQWU9ldUFmT0Y1ZGw2ZVdLTm14ajN6UU8vWmNsVGJmQ2hmSUdsSVhjQW4zSHhTZWFUbWVJdnBTZWNnZ25LS0RCbTFDTkRtRmVKeVhQTmlyYnE1MHM5Z0l5bzlVWEttM1lVaEpDZC82a1hjMGMyR1o4QXFmaFkzTGVSUGVIQ3F4d1N0NWFwRDM5TUFqbmxkczh2SG9UdjM1Y004ZUU5U0ZucUI4eUM3TmlJalRWTzY5SkxoQWdKaHhocnc0cTlWSDZNM204c2tRRVRJYUhpckhzQk8zcVRJQ2RsaklIZ0FhR0pxQ2UvYlhpWDJFYmZtUFpFMmlOcm1PVisycUlsdlZMbXI0ZlpLdnljVkhoOEJwK3IyZXdGbnRYeks3ZTFvU0RVejVRZEpxQkI1QnpxZlBrUFJYQ2lsSmdSVFZoaW5mK2lKSEhWTS9hNFZkTUkxbFBQSEViejVBeTlKRlkxeFhjQjRTMWhBd2dXUGhRRzVXc0dOSzRtMjJqQVNRMmhRMnRkbmNvUHYrNDE4RGNiSU5abVl2a0FHZURvQ2lzbXUwK2w4NEtMaXdzaFJEdjBqYUE0eGo3NEhGZC82dXBPY0xKMEpUaHFRcTRBd2FGKys5bVhVck9OS3FvbUdBcVFPR1ZiK0FMUFo4ZHdIU2w0MWhMZlJQQ1FDajFSWGY5amRhV0dIb0VjMStmVDRuYjd6MDhVU2dnVkZDZWZNUlo3Tlh0aGcvWHg0NDA0eURsNDFsd0E4Z1F2RlE3SFk2ZTAyZFhPbDFURDg2NUliN21nNnJ3dzh0WDgra3ZKU2F4MWoxM1QxNEI3U1pDY1RpcGl3NzFCdFh0TjRseExkQWQyQk5hWk5VOVVFWDl2TDhjZ2RkQlJ1RW5PL0Y0MVZHZC8wQkZET2ZLWW9IbEhndTRyZ3pRVHFzYmZyaGo4UEhKNWxEZWpuSWlKc3owM0p2eFlud3NCOTh1bGtVZElQTGhuc1I3VUVEb0NXYVd0N0IwNUk3cU9tZ3VOSllpa0tISHA2dmVMcVgzNXR5bzhCemFXVk9hTWdScE1CSFFkU3BGc0owWVU5cUlNK3FkdjVXWEQwVkw0MW51YURtNXRnUStIWWFOUmVwTHlVdWZTNGZIMGl1dCt4ZkYrcDZoZmh3eTdGZ3BXSkZqOCtKemZ6NzVBb0NibDRuUmZ4T1YybENmRDA4VXVDREZoSHpJTlU0VXZlSGRqNWRNTkNnelFwRmptVDRaNjZSMUlGWk1UaEhhMzV1dWEvclVCUG90Ums0VG5RSGtuVVRVTzJ1U3BySEZRdEZHL24zVHV0eFBYeDgwZjhucmszSE1vU2hWWDc2d2QwMEc2Qlo1U1RrQkYxTWJxdGgyNUNvakpyaDA3Zko0NE9JNlVyT092dGZaVFFYYVlMNmI3K1hVTmNaWGRjS0Yyd0NJOXRuQjJ3WStQOTRuOVlMdWtIVUZNZEVnbmx5QUJ1QWlKcGNhNzEwR0RnUFN1R0lpdktUWFhITk1IQ0kzUGM5ZS9tZGNaSGZ3SHJ6cEZUek5FWFB6NHVyMmdiN0tVQ0N6bW1BRnpTSjdsSm5xcnhJZHAzSXg0TjM3QlYrZVZRbnBoT2l2eDNGSDkveTlDNHhtTmFkYjBmK2Z4RjlucFg0N0dNRVNSck1Vd3NkM2pLb0xDZEw5TElDSUpJeUFoK21tU3o2V3JSYm5mWkRnanpKMk54bENHc21oR0hNUkJNVkk2QVREeXZycy93QzBtZFowZVpYSEs0bWxtWVMrZHRXOWtya3p1dEhTZTgrNlV0REpYcS8zVkxydmVDNGxKWG1TbTVGc1JmK25Db0ZDNWdtc2JVMDYzcVNEUktyY0xaVjFDODJiM2x0TEcyUE5oSVJ1cnFIUzdZQkgxNGQwaXJIdFNVeUl3R2NmUEIvMVdZZkpYb3FHam5kMW1tZXJGOGN0ZWYyNHRvRTdpRml5RlRuTVFyZmhONFlTcHpkQ3VBZEZicnpiWUs0U01DNXNmMGl3TzFsS1NyK1FhZVFneEFQS0czaUVnck1GeTZIQlRQLzJRbUVKbzFyYTc5cWoxTnMzeGFaTUp4RlYveU9pOFNwNFlKWURJOHVGWWQrMFFqNnF2YjRxSHVSZytHMnlNUGpnZGJwdVdUQmg2NEVTYlppMEUvZkNaMDQ5K2xINEJOallmc014ZWVRUlZucXhqY3EvbmxxUHZjZTJ0MlVDb2xwUjFaOFRpdk55SmN6WkF5ZjVVUjRlUkkzN0lsV2xzcWtXdW9HZVFWekhzZlNKQU16TWVFOVFMT2ljRVpreWV2RHhDM1NEc3JlZ2xFR05ZMGhPcCs5VW0yQjlWQVVYRWt1UkpDSnduR2I1Nk9KSWYrQ05kZHpmSFhrZWptTy9SbVhxSXNrVk5hVlA4NWpVa0NPOHF1Sm5Cc3JRSFRmTTNzc1hPUmErYnFjK0hiYnRZMnhlSTRpYm1JQVd0QTBFNEZCQm1SbDNvOXp1ekZqT1c5VmFVeE1mT0VUWnZ2SW5yM2dUSnBPNHhSNTBnTWdNUmY4dmtZTHpvaW03MHRUZnFwaFJhV2Z4bjhNcVNGQ1czcGRscU1sS0FLd3dRT2NYOVhzNXdPSTlvTWtJUlFEelNjd1pBTUd0TTgydytTTDF6WkZKUWkxUHN3c0ZWVzVvbTVZY1dxNzEzUGIyR0RZd3cxT2FGNU5CSmwwd3JESnp6OFp6U1VIVjhzRE45K0s5Y3FZenVYSGpjNHM3YnV6UlNOWlhUZXNaL2U0MldLNysvT1VUby9taWMvc2JqdDlBTzNYNmhrWHUxOXFYZFJHNVFjQ2lHaG00dmtXMFN4MGhIWjJVbE5jeEtrZmdFcU5DQitoaW9rVVJwbnA5U3Q3NWtmbnY4RVkyNTlSVUw3UnNqMGJTMkN0MVFqVFRFWHRacHhkN2JGVUxsRXRWeU1HMGxoR3hpM3hyVXNFUVhVQ283eDIrR3pyVmtFSS9yNG0yRElEcVVnUTR6dWxjQ1Bldjczc0VPOVV2UGhPTU5wN2FmQzlkN25lc0o5RVBYempPWFlsWHo1TXNuMmhGZnp2S0NLQUJSc085WDUvT1JOSk9EM00wM3Z6NkxxbkRKMCtiVXMyVDBycklHOHFEeCszdlR3b0R3QThBWW1DMlVzdUtrUGVhS0hqSVIrOFhrMHE3cXNRNXZkekdEN0g2U3JUMUg1dHkzL0VPQVl2cTJVMnlhbWJ0R0xCdm1OaVNERG8vUldwbS84UFlSbEJhNTdwOHBtajdUV2ZjMk1HdE96aGtrZHk4Tk9PemhROFVBN2RqQmh3TUJMa2I1T05BeTBZWGd6dmowWElqLzFpcmR0SkhRc29HNHloaSt3cEJrUWlEdkdmZEJsY1FldTBoRzVDcUFVdmtNSTlsYm5sVktYTXJ5U1NTUHNsd2xnKysySmlzZnNuV3prc1hvbDVDKzZTUHZRVXdrTjRqTTV0NVZwT3FMa1VLNFZUOUl6V2x5ZHBMOUpBNUQrRTI0cC9JQklsaXEvV2ZNR2tuUzBZM1VhMFAyZS9aU2VwVDJ6LzFYQllmZk4rUUY0QzZCRTNuZFlnVGRMWU1ibDBVbmluSml2RkgxZmpXSFhQdk44N1VmV3hjOVBPcSsydTQ1UHYxS2NMeVp3aGd3d2JiYllMR1RRbE5WNVdFemJtWGI2bXlXd1pZRkk1WExZTEEwSTdyRFdLbVAvZDJNNFJzcm9pYkFqQmZ4ZHVwMGdUS0pjTWEvMFY2MUIyLzhyckFCeWVkb0piZFVPdTZUT0UrWklja0pzU2w1UkJ6R1Zxa3FDU25Fc0JibGpSZklDb0ZtaGFwMWo3dUZPYkxXdkxWQmxZK0dYdWxjNUw3TGRvUFRIMVRoeFZ1QTRVb01BaHkzbWxodmlyRzd3ZGhsVkVGYnRJK3dpcFNNdUhyTFh0RkFxdSsyVjdUVFd5RXdtaUNJRzlha1ExbzJ6QmsyV2R4MytVcmlXM1o5UTVRaDJJUjd2cWEySUw2TUVpbXBrYW5XYVpWZHNadWRZTXJRSGRielVjRU9CRDFDRTBYN0FnVWRYckEwazVQeGduSjFES0h0MTBxVGZSeVdwNjBMSGJmZ09IWUx4ZGkvMFgySG5QbkdnbEZoeFNFZ1BGRkRvckNrTTdSSFpISUdWNnJJMFNWU3lZN2t5WDZNc2Nac0s5ei9NV29BR3lkMU0wYnd5ME5GQkV5d3B1aW5MdjFBZ0hjK2wvYml5VTV6YkV2MVh5Vy9lREloTmZFb1Z6YXVvUjA4TXI1MnZ2VzdzeGh0MllURk03RUZJSzZNODhaeEc4UU40dEVIVmJOQ1dFV1ZKYXFWeTF3UmZhQmNNRW1vNGFoQ3A0dXA0bnhOdndXbElQOWZneW81WDNJWThQTElzcVIwV1hucytobFhPVmNQSVRSN0lBcUZ1dmthc3hQRVRPR21kdHpCZ0U1dWdSWTVjdmwzTUpNell3MnFoYVN5eTdlYmNJVTNmbjAxRmZSSGx0NGtad0d2Y2FrQmJZQmw3WFJqRGZJSjNodjRXMmkzTTJNbDd4VDhUQXpORGJ3Snd3dUM3bERFcm1NWHF5VmlkRC96SDVlWkdwQ0VpWm13SmNxNC9xY0dGMHg1cUxQVU9NTko5dUlJUms1eFFVU2RRaVdFNXgwdFZRa24weEw3aVp1WHhPU21INkdzaDVWaUJUcG42WjhoQUpkZlA2cC91YkhTSGhqOHNnODBUTXFSOGJ5b01XcWJPclR3QXlHTkhjV2dTUnBvSlhCUnRrQzVza3BaejFDeHhUckNUalRsYUtFaEgrc2M5ZTdUZ1M5SDFEY3RCMGJDTmVUVUpYMVN4bGU0bGcrNmxIVTJRQWlKdTVCd2xTZFNCT0JXa2IyL0pzZWRxUnNXYzdQOG9YZWkrZjg2eHVHcFd4aUVCenV2aGp0MlUrek5FTmR4WW5YSnB5dS9BTlN2MDIydm9EdkJ1V0QxNkZ3bGhZcWoxeHFxNFN0NlNOQWxXVWY5c3lBamdVcDNta0J4RllPZ3Nvd3duOTJSdGgzeUZkZVIwR1NKVHd0QldGMkltNXZrSWw2VjZrTVgzd3hBZ1lMeVZ0M2QrYW9Halhhd1JCNFQwbDNPcFAyOTBaSW1QbEVFa290aGpnTnVFSFQvZ3BlajR6Ui9hODhLei9wUnFuZnpsbzkrWE93TnMrbE5pVm9iek81Mkd2eDJ3QURJQk5Kc3cyb1krVXV0SjNmZFZnMEVsdnE5bitjY1B2TENmLzNJdEtFd1RlMFhoWXRySFNEVjRnalduVjUyaGViUnF0LzlxckQ2TXgwZG53bGdqYUZvcVlYcnNMNnd3R0RTOTNpMEJ3M3JhK3JJYUpTSG40UDVYMUo4QnNtYUxCR2U0NHJ4UHBYM21QZkhmakFNRVUvWW1EOWZxU2FWWEJXaFNOTkRyMnk4UHNOUXRKaFlzT3Y1ZWFQclU5VWNvUzhJL2pHcDdhdEFxeGxtVVJQNmRYNlRISVBDbVJqSWdUOGJFemlaY1lkNy9XL0lKNjZNenJnV2RFclYxa1JFTm9abzAxQUh5bUV0SFpiay81NmtLZ2V5cTZaVDVVQVlPaUFqWkhudEdhaFR5OXI5b2NvZnNadkUxNDQ2WWFRME5oeFdQNFIxM1RHM0JITzhJaWNDb3lrcE1nNHEyR1BmSVc3K1F0YUhMYTNlWGxoWEx5Uk1NYVd6aG5WOVV3dU5uUkZvV3ZQNEYyZy9PQ1RDY003WUtpMHZoaFhVbEdzUWtTSy9yaTRyNGw2UmxGZ21sRTdkc2pnb2F4QVVBVC9XOWNHTkJoM1BwNkRmUE1WS2xxQXNBQ2k1dDFSMGx1b0puaFFuM2l1enVvTytHWkhRbDVwTFpHMTFlenl0V0NZV3pYSVJVb0ZxaThZVmFLa041ZTRuVzR2M0VKbnJEcVRCYkpYMi90MU1aOElpelVkU0xKRitlUUdJTlRJdkxxRXdvM1pMTEl1cWp4eWV1b0hPREw1eGVZTFoyZWtGam9DUkxqRXNDbzR6bFl5Y3EwMC9WRW5XRFE5MTdkOFdFbkZOT1ZWUWs5ZlZSUTQveVhmeEYxNkdtUHhqYm1jZVh0ZU5oWE9kVlMzdHdvSERBVWJ1SDM1L1dEY3BVdDJsRytqS25DMVdOQ21uc0lzR2ZZZzJubEN3R0JGc214MTN2bjN3TnVycDNGR2g5T1hWYzVHSGJZcldXZG5Nem9xSWxDY2pSYTBERmFqYWd5bTRTZm93NFpjc0wveGhMTTlGbkJmMlYzWWxrOTlod1lRdzhTdXRIZ0lLOGFQUi9ZZU9oRERCMnVDUjkyWkY0ZmxLNXJnYjhTbS92SGVLZGhkT1lOYVB2STBGQndjYnZvd25USm9qc2NUeVdBL2tua2hsdy9QdUsrRXdDVWxWV1FKUW9Wem9rY0c3T1RjUk1hS1pkYm1zMmNmYnlrTXptRzI1bzE2cjVKNmpQdlBiWjZhUHc1MmF6OUFma3BGUGxYQUhJa3BNN3Fra1BiMGRWTEdxSVZMNHcydm5vOTZVSUZjWEFNdkhuUXBkUjB6Y2tVNEhoYi9kVjEwUEZqNTEyQ2g2QVEyZlc5dkRkK2syY1JXaXVIaGpvYXNLdmRKdEhoMEI1V0VSYTFab0FmdjZCM0Q0SGVDQktOcnQrZnBiNzZEMDFqMUM0MXRzRDFlWVlPcHlwUlc5aXhtenJZdXBFcnhrVUpTTEFUTnN5VXBVV01Pak5vZjBDc3o4MzB4bktyUlUyMkRXNFlXK2tGcyt3WU8xdTBwSmpWbDR1d3gxSUtYWkgxYmtkcjZzZ2hZelV6M2NFeXVXcTV3bHlET3ZSbmh3MXMwZ3I4ZXpoTTc0eVpKcThPK1ZETE1Ua3lobW5UcEQ3RTZMWC96MWQ4TDk0c2g0QVlyV1craG5PTG9meEl5VzNscnEzK1JlUnRGeXFLR3Zya25PdC93ZElaQmFYZWgyK2dmNXZJaUQzTFJYMnNkbnRZZ2xFN0pRMDlEK2RVSTY2TDhCakpzVGMzbjhQb2hvb3dLMUdLVThDdUpRQmhIWnhBSTBCOW5tNTIvcm1PME9DQTJtenI2ZEFPbUVyckRVa2QveFpiaUQwV081aXd0SnRidnI1T3lmOGZraUN5cm5ScUJNZ21SNnNaK1BIYm4zUzRHMjkvS2xiWXR6bC93NWVQN0U1ejNhUXN0YkdHbFJLQXpVRUtnWSt1T2Y2RlpiL0ZUREhqSmd5eFBLZnN2V281TE1zbmNjQWlNMCs0R0J6eHEvMVpUbTBRLzNYenpLMStDNGpPZFY1WXp5Sy9nTmZaNWYrZkFISWM5KzBxSDRSMUNKZEhhVWtlZ2sreTlJd09TUVNqazFsNDhCL1pTaEJlL2lJQThobDJabVRlc0NYY0NWYWladSt3MjhDdHVBV28rNWZHT3Z0VWlNUkwweFJBb3M5RUkvZzlJRENxcndrMmlCamJzbnFWNkRKWVZCaW9FS0F0K1NzV1Roa2lqVytyMUtGQ21sN3FzTkZxSlY1V0M4My9FV3JONWZrMWR2Qitqb0psMzdZUmZqY0xkbEpYa1RrQWM0ZVQwVHNseVhHNWFRamhkWHAvdk9yejZyUzdHOVRvb1NYQ3hJeWwrOS9OTmxnSVNNSExET1p3VFNHQnk4YzI5OHdmVnNuWW5YVjByQXN0bGxvajBOQThYcXFGYXpvdUtnSEl0eCtNQVh2ZmszRFdHNmFXQnVpR1FwS04vNWo2SHVhU1ZLSTF3QXVpeGtRSFJDaXQ2bzZtbE5nanJiWW9ySDN5RC9DSkpXZFlHd2RuU2FUTVFWY2NpVDNxZ2FXeC9UaTU1U1I3MjV0RFpXcm96NVZaRHUvZ0h3ZUZKb0ZPY0FzMDFCclNiTDNodHkwTDQ1KzZOaWI4NmJBL0ZVUUZZQlBlYVBLTURTMWJCdzRxOTllMnl3UUJkc2dVKzM4bnNGdDY4aVVkdWh6cEYwU0dNSVcvUGNkUDkyZC9kNzVsSXg1amR4Q2xYUEVwdkw2dlZUYnpQaDVleGpScGNIeHZ3MDdFamFQanRIQSt4ZVg2RmVpb25IUzNSUWN4NWd3SGcvVWFuUjRsTnJ4M2lheFNERi9ISTZzQ1hudStlSm5oc3lZK21CZmhpS2xvaG15U29POG40UVU2VFRSTXFxcW5mcmFDdWxqOWgzejQwaklRT2lHNm9Nb2lHN3Z4UHg0RlppbkRxWHpWbWlsaTc2OWNabVV5bHZXMTB6Qm5hSFpOYkdjQW5xVlkzK0wyOWRFcmFVOU0yVmFOUDJsUGJCUnQ2U2NLNHhLdmZZTmVOQzZWY1dlSHRpcjhyQi9FSytZV0lveWJZVDZZMTNKZmxKYTJCcUY3OGxoRjNoUWxlaFhjSXpvVkNieXZLSFkyUVpaUWwyditTTHdoZ2hJNThtL2dQNFhXNUhOay85NGVPZ21ncEtyQm9sbjFlRWg2Ym10R0FoTkFya09aTFdEWXZoTFdTWjArZjdsT3llZm5GMm01dVlQaEhtTkRWMFBKZ3BFOFRHTHB3L0FrUmZuSXhjd3V5WkN6ZEhseWY2aERaQWVRalZKSUdGTWpXenBKM1Y0R0dqQWZ2c3VzLzFoaE9BOE5VRkR0WFhjOTIzZlhiY2NaZHNMb2N4RDV0YW5Daml3cjlqREpIYmVmZEtJUUplc2JGZkxZNGJJYnk0Q0d1SWV3aVZQNzdtWkNoQ3ZMMy9LRU1LbUcvTXB2Yk5oVWRuRmdJVkZVMmRsSmRTdVZwMS91VzhnTFJ2aWJ2bGtZTHAvQmtLSjFQeDVpNVR3cjAxeDc1M3NMdTB1c2x5dnZ5eEJneVBocmd1N3NERW9uTHlZVjJtWk12TVFhQ0gyN25wYmo1ZU9jTW1WVmo0T2pnSmNFZ3JKMVN2NURQY0hrODdNZWFSRlNQZDdBejQ0SC8zZS9QT09Qbjk1bU9UVnZGd09kd2NOZStWUjZ5cmZLRkcyZ2ExV3VTSXYxcTZtdWs3aCtFb2p1dk41VVhzZEQzN3E4UXNxTG1rQ0hUNlduaUJNeUcvM28yTmZQVkkwTmh2ZVk3cFpKTnIrVnU3SGtvNHFKa2VEbmhVTDNhTnNTUTBpRVAxM1E4UHlUQnZ3VHJkbDQvSTVYSUY1cW5qRnVTeHBaNkZFc1BoMFJ5NFJFMVJxbE5GMS9IVTQxbWJkU1AzVnpyKzNhMzg2cmFOUzgzUFpGN3hObGdZMzBYNTlwZ1JVRVVhcEVYdlpaYkZqL1orYXcvQmJlNm9qaCtJNWhZU0VwQnVGM3BRclB4QXEraUFsQldEQm1mVUx6MG1VT0tSNHpPRm1QK3BKNzFicjB4anFyL0hKckVsNWE0Z2FKUE5MQVV0S0loU09rbk9GT2U4M0hHOE5oTmw5cXphVzZQSnVmYzcwanlXR25FSnRQeVBla3o2RG5zTHRtcnl1Tm1lK21ock5WZ2hBa0tvK1ZseHFDcUlTSnVBdDVrRGxmZUQwSGUyOVlIL1RiUGcvL2hNanVTODlNV01IVHFYZC9oZk1Ubkp5ZUhwcWh5TmU0VzBUQW43TjhUQVd1UnpWdUNzaGNjMlpZYXFZMXgxdkFHc1BHZDdYN3R0S3U3WmpLTnQ1a051YXdsT0kzVnFJN1VkTkhnczZqVzl1Z1U5VjhYN2dLYnBTN2NvTWMwaGZneXhGUHZpT0FSbVJrMzBrVUFCclZ0MWdhbXZWUFJzRUZUWWRBaGQva0dnQWl3RndzcjJma0hZNlUzRTg5aDdtT1M0c3c1eVRTSmF2eWRmQ0pnTGJjdlg1dDI0eEd0R2FzNnNLZkFaMjhpZUUxT25ZTXp3OU5CaVZOZjF2aGZ4b0NjWDRnOGgyTkRYMWhqREx4WnNRK29wazd2c2U2ZVNPbDhLalM1Vy9GbzBtNi9OMkcvZHBhQXRpUVBHTGFNcGlYZFVoZENQSmxXREk3aFptM2JYUW8zek1udnd0djlGNkViVTBvaXdudVQ1MFF3aFB5VWpGOXFnUzBUSU9hL2pRYWNZSFNzdWlETisvSFdXRmFaUGVHUTJvR2FpaHZSRnBOWU5WdU50OUxYeWhOWTBmMFFwaExXeDZXSzZWRUh2cytMRkRIYkk5ck9VQXBjM0ZEU3prSmVPVEgrZlA1bGlOM09zcTM1cU4vY0l0NVJ6UTJoVTNaNy9odHp6Q2hPM2RucU1wOVZDRGw4cmN6OTFhbXpJZVpkR3BDdUxKZ0UvVWZqTVp4NnBxSi9hL1dkM1BMRkpwd3RUUWFuV2VoUlJRUFoyZzhvNWVJN1U0VVFQeGFKY1ZOa3NvSDlHL09hcGRxOWwvTHNsQjJqQ0xWODU2bloxbVlNR2xBSmtVK2dac2RxWU1LbjRpdHBIWWlVb25JdUVIdWRRYitVY2xITDgzSXk0d3creVFSazFic0szSFVlK0h0NmJOOXZtQmhrWXRnTmVUYlJobE9kRHRNYmQ5bitodzFoVXdnNFFLbldjWXFmbWhCeGp0YnFSRmVvQUJMVnpwV2E0dkRzd3pEK1krMXVtQVVKN29vZ1VvU0x6WlAxdWhGYThnVkROUXJWYVZ4aHM3TTUzNGpzR2VkaEhkK3gwdzNqY3poWTd6NVVvRjZBVGgxZjl6NmxiSWd1c3VVWCt1ZXp5Mlh6N0VHR0tYM2szRzY2S3Y4MEJ4L0c2bUJxZXI5QVBjbFk0aU1ieFVJUVFjSXZrL0plc1libFJlMWFKTGhUZTF5OGZ5QXZBQ2VvYXowdlk1YjdQaEFuZ0ZGSHFRQ3F4MWNpbHJRM0FWTDAydUF0VG02QXdmZTl3UlM2VXVzTVpycjFBU0NudjBYMUc1b3B5WkYrVWpLTXVqcWNSZkptaFFpb0VVTzdZay9uVlFwNkdyZTduWDhOT0tTVlNJeE8ydmFJcHU3cXFHNlJ3TDJycXVxalU0czJUTGU1ZzByOTJIZENyaDlEeG5sUkNvdmJQc2lsOFRDN2xKQkpBcThYLzBLVkJFck5CSFVNMDZsRFFaaXJ4enVPb0hWMDVINDMvakNOR1lWd2srNGI5MTZqeFM2Zk9pemNGM1NYd1RrdUwzQisxSWE0a2ExM1NEQlcranBGeDl4UlFvYmt4NnM1aGhwSm5TZ2lPVnhKSEJtNHhTb2MyVjNtUHpIL1M0S3hUdzdxVENESE8zdm9COHBvOWFXSUp6VjQ5S0o1VlVwaG9sLzJMNEVZdlNxOU1EczlnZWVPQ2VBZThhbHJWbSsvOUFTT0ZOMFBwRmJBRkFaY3ZUOUl5eGRUSXRPMzNkME4yNVJ4VHJ0dWl5b1JjNWh4dnVHbXhBRCtQaE1sVXRBOXp0V1JDazVGTCs5Z1NQUy9MOWkwUHRHbUxCOXBaTEg1TGtWT3UwcFpObEtYZzhGNHB4dk5wU1lEQUMwNllBd1hvUDMzQ1g1aW5abC9oRWlEdVl3V3Q2Rk5EN2wyK0g2SUZmSHJta3VmZTRPdWZnZFI3a2lud1B0Yjlyd2NMREt6YTBMN2tDbFh5K0lzK0pBK29oNEQ2T2lnR2E4eWRxKy92MWZDb2hOUy91STFHMEhKN0V2aFdhVGw5Y2wzY3hwS1NLUS9NUWJ6cWJUN21SWmhpZlVhU0ZhT1BhOEFLaE1xUlFVMHgzTGZmVy9EV0hFUUJheENkV3RGSTNqYlBxRUtncTFsZGFuM0VKdUFTK2pMUWlVR2ppdTlXTElvMVo0ZlYzTHd3TzdjMlpnRW9YenlXcVNJZDI4ZXlsV1FLWG1pN1J0S1FzSEszbFhqOGppZ015VEExOFVvaG1aMStzd3Q0YU1uRS80S0Jyam5HSTZTdkFoTEw0WGFjT3cvcVBrSmFXS2xXZVdsREszRVlMS0ZaMVN5NkI3czVwcWJuNlpWK3h4ZU84VlgrV1UybjJOQldMeDg0R1FYTUVGbnJrOTlWRE5sb0paZFhLRC90Vm83Zko2SU11SExxNGgraVVTb09rc2ZuMjNZSkZybWZTbFNZbnFOaGI5MmNyYW5nMHY4N2p2R3ZWT2l1UWN3WlQ3TXBtU2N3TDdnVDRwdjZRLzJmMXFwMGRaSzFJNFNrNFVvM1VpVjh5R3VIZ1ZFS1JCRFZ2V3NQbVNUWnFRRFFCejYxaVlGU05TR0FvYnU3Uys3SWVJcWNaTWhMVkg4eldHL25LL3FDVFNlRU4ydU03YUVzbEpuUTQzMWJPVDRGdGc2ZXFUWExRSnNuMmJhcXAzYlc4SFlSMzhHVGJidW9ia0NQcUFWWU5OZ3R6Ymk1dDZLL3laM0dXcHd1cWpxTGNtbWE2NTNBbWJEMlM1dmhTSVZ1TlI2NFZzSXFrWEI2a3JmcVdRYW9GeFVIdkJzdytZUDJmb2RNZVl6Zmc0SEtOMVNaTFBMeEV1VWZNV2I4SmVqcXJxWjNIVkgzZVFLUFFaYTE2SXQ0V3hHVTNhSTc0VDErQmVTQlp2TFQxd2tDN2Z5eCs4RFVRVXArNFBEaEdjYU1lVExHMWNhbGJ3b3Mxd2JybmVSUUh0MEljc1BRL0tZL3IwRkJCYnBHbU9KaFM2cGVWTG44bmZDNDEyc0d4RTFtOVFHTmt6TDdRamZKbkc0NDNyZG9FYm9yRzZaNmc5dzVoNTRBVUhSemJGNmVLSWxvYmFDSzhORFJKMFZxbXVRc0I0eE9mM2pHaUtrZ0w0YUxNeE1lM0dnR1lQQi8wVDZWQmtuUlNDUThBaENzUlFBbG9PR25MNnRyOFR6UEVwemZhZ294aUYxZFB5NGpUVExpeU9WZ2NXUHNTNWIvK0Z4ZC9rVVkxWkxveGwzOERodUJyanhGRVBYZnFXUk5XQ1VvMm5kWlBRalBRYmRaMHZVZ1IzbFBFaWJERHdzb2NWaWU3a1lKcXVWbWl4UzQ2UzhHSFgvWkI0bWlYZGM4TGROdFliY3BDWm1mZkdtOEZjT2FheDd2RXY0cS84cEpIclNXVWgrK1NHV3hBMWF3TVhIYkNVL3dyY1p2Sll4d1QwZXAwMXJZR256R05iT3RHYjRhMjJYMGpmVk1jbmM0TGU1OXpENWFoWXVvdGRUWk5MQTFkMk9yRFpRUy9pWEpsY3J6cTRFT0FMcS9yQ2E0d0JHL2ZtK1FzMGxyVnAvbEVUWEVWenJjZmwxUUUwYWcxZVFQY25mYUd4c2pnb2hSUElqSDErc0c5c1YvQTkwN0tDMGw4NFg2bG9JNjF1WTNPekJxMDRwb2J6ZHV1TWtwUTlDVnEzb1J4aHdQR1h2UUgzV0tEU0NoNVZpajRrRTlpWFlleTRkSzlKZTVMTExaVUFrYUNEOERwWkJiWE8vY2hpZkMrK1JSZ2xPQ1NhMGIxUnJKNzNzbys2UDlMQmxmdzNnaW1pUitqNHhZaC9QeUZLNC91dzU0UndwMVAyaHpKMjB3MDlwNGVEV0wvV0c5UENYbHh6YjNWNGErUE11ZGVUNTEwRGRySWY0VmdXbGlzQTVlSDBhcmswbWpXWmZpU1l6NVpGVnNvNEFRUXEveTNmWFg4UjExQnhKcm8rK1FjSkJuQ05maWZSRW8xeWRlb01sdnI0SVJ5VjZIU045S3AxazJkamlwL1h1QU1zQkJNTXh6bWkxSHFrcGJYdU1TN2swMFpMNWdMb2ljemhZc1RjRCtOZmFFTTFka3FLNHBDa3ltRldCNEJEN2lVeXJRWURNam9mL2wvcFVhZG1FWVdKS1FMaG1pZlE3RnAvQkFlSzJtQWJVRHBYQzFMWUFIb016RWxCenFYZjR5czVna2QvQnNraHRSN3JST1FDQ3UzWFNXaU1qRGM0bWVZVGN6c0w5UEk5WlpLR3dVWTRVVTR6c2E4aVNrWDFHdXQwSVZvOFRGU3BZS2haTlNnQTVmT3MxY2VzV09UNjZRRzJWbGthOXY3R0d3T2hKaWlkcmdXZHM2a1NMZHpwSnlseFQvVkVMVTZRUUhVeEl1K01lN0RBVnVTQ3YweFhKV3ZHeUNCekI2ektzVHJYV0xwVWkvRzJjZGRDQUoraC9Gb08vZlYxT3ErYnI4ZnhUTEhrUHBPcVc4U3BzTmp5eEo5MzFNV3VpYkdhSmhJWVorWjcyQ1Vmd0l0ajJKdmxmWDJMT0tDR1pEYXY0b3VTQ1d0VWl2VE1ZeFR2ZWZhY0N1NzYrcjdPVmdIdi85YXh6eUlWRFNwSnpiVjlySkYzRmhUUU56a3lOQWpzamJSMGdXQ3pSNkNNN1czeUpWUHpiLzM4SmJQcEg3elVDMW9oNWJjRW0zdUptMkt1d251VmI3eGl4R1ZqeW1SY0drQ3htWk5LTElJaTMzZDlIRzllZDIwbFIxWHB2ZEd2cWN5RkRwME51TTBodG9vMHplRkx0ZnRkd0lpLzJmS3k1SnlwbW1FV1c1RUI1Slg1K3lOQXRMSHdkTWhOQ0FDSUlFNGoxSUlRRGJaMXp6VDdUNnUycWJOQ01SalRucnZpaWlmN0tCMDJuSFVLdUJFcWNsWHlIcXhqNDZYbkhIQ3hYaTRHWENaeEQ3MTFuM2JGaUJyMm1uQXVyVHovdFBsSUxvbVpTYWF6bEZTbmRrOWJ1aFRBOVRnZzR5TnF0YVpwdVVVWnBTV09iRE1HejZDRjNqY3dQdkY0TEUvN2I3MXpWU255bElLUVpkQXJEc3ZjenAxSFZrSW1IMGk2aTdJRk5PdENMTE5lTWdrbnFMTitJR2hmQnpzRmxEVHljTE5TSG83NEI0YlFwTXNUamxVRUI5UW5WRnJXYkJYYzNnZW9BOGRrK2RRajFISDRraFM2c28rd3FuSkUxT0I1WmhpWGoyRkphZXJTY3BmNG5oWERIcW8zSDVzVkQ0ZHp2OFcwV203TTRGeDNKaXNQU01URGs3eG1iMjlhQVBpdU9mc2xHUTBPdzlJZTlKTFcyWTR2clhoS3JuY1JBakZRNXhjd2pib3cweGpJVXJYVkFIRXFST1lEVGZGekZjL01DTktWK3hidnpQU0dtYmdQdEdSVmdtaVpjdlNiZXVRUUduWkV5RGltZWZLRWViMjhZZG5NMldKSVBGRytJQWpkYmJydjM3SUdPMjd4OUdvMFJVVlQyZTh0SXpSR1QxejBvdmlLWnJhNHhaRDRJSDArUWpXMVBkbCtrZkpUYVVhaUgxSmtnMFlQRVpsY0V1OStxOWx2R2hkK2VMK0xRam1RRVR4T0tpdGd4M2V2WWVtMGU2bk54ZkQrM3VvTEdRS1hEb2JCMUsrMlpGODluMVg3SWhjUkJsbXRCRDRObEFOZFVDOVVHNkM0SVZWa2dpbmVsMzMyYnFQSlV4cjJiRjljNTF0a2E2S2dCRVpPNWkxSkJ0Z2dTczRpZ1JJOE01WnpjbWRwbWt6ZnN4N0U5UWlWRnpud1F2S1M1UzM3QWpzK1FOc0hoaVgzdG1jdXhWYndESE9KRDdoT1NGdTA5Qk5HMUFTaEhrK2xacmhqRWJhS1JQNUZiOW5WZkE4UjFYbjJ3SzRaSUt5UGRaRnRvbmxxVTd3dlVIcWtlY2ZNK01TYlphRnVOT0FWRzJKK2xOanZuaGFLUG1jdHk3M09yWGFxTFR1WXM0a3VHeHJIeTBueDFtVVhEemNSd0N2T3JjLzlUdDJwOGloYzk1UTFyQzFmOE44cWNBVmo3RGVSam8xUXEzaHJ4Ulk2RFNXWm9ZYTZ4OWsyaTUyaU0wMVFZcFhTdUlYSEtYYWtOR3FhVkFYUmpvNjVuRC9DbWsyaExhUHZKSFc5dXZGM1RRbm92MzloYlIzbXVJVzF0bVcxU2hkS3l0blQzS0JaM3pySTJpWjZwNUlFbzhBeStpNFhQYjIwWE9HdU1QMnBKbWlhblVoLzMvSGFoQm1IdmZiVzlUb3h2cjhKNlVCUVhDZUoxaXVLVVppejZobzNmVDJ6VG5yNmE3S3BHNmFtcGJlQlJFSzBJKzl0OHR1SmwzV1VXWkJYbWdhc1U3ak5yS2ZuTXcrK1BEcmxDbXFGYWU0Rm1FS1ZtVCs2TjVMQUx0Rk1zMGIxWVFKMGMweUI0UDhIQkJLNlBGNFRTL1ZrSjgwZWF6NzgraDB6NFZQeHZGMksxeEdNcDR3WXRUdDY3MGtVdFVMcjMzam9LanB4V1V3cTN6K0ZjT3ZWWVNTdE01RUQvb3JuYTBSMDdJL21UbldsaDZQMHR0RkN2c2FWMjBKVWVNRDMzeHl0Y3QrdGJWaWpTWWZ5TUFBU29ZTzYzTTNZY1NPRHgxMmtxOWtpVjY3a053Z1l2dW9GZzgydUF0bUNNVFhCNDIxcDlOaDZGYjQvR0luaVh0R0hLc2ZyRlFDajlpdkpveEZERkdPejBRNk1hZjhBNTRqVlpwME1zSktNM0l4VUxCVHJIcGdtT2JLWnc1R3Q2U1Y0MlI5RUdTZFMrTzRlYTY5OFJFMFppYXN3R1JBV1I0d1IveldYc3c3UTFXUFgvRmg2MEVERHFtYlQ4VmVWQkhFQUdzNzZSUlQyNE42b09RcG0zaExkc29iNU4xTTBJa0lYRDZGbGhhREE5aUMrN1dORE9JQnBrL0tSRHBKeDR0Tjc4VVFrTW9lc1owczBuaTdKR1I4eWozY2poWDZreWllMEN4VWtLSUE5U2FLd3cxWUV6ODNvUG1zRk5ka29DQlRkK0VEc05jem02UmI5bi9FRXF1MTBYWGY3Z1NSNzZaemVEUlNWWHdzUERmOUtveDZVVjhFWEpMc3lZRTdCSWw0R3pZcmkzVnN4clU4UER2U3UyWHVWVGVUMXNCSHNpSmJzTjZwSEIyM0hvNFRLSnJOMkxRV21nMGFLeDdZdzc0VjZodHVEbTJ5WHJDWllUL24zcmRYU2xQalJrdW42b2hYM0l3Y3NIRHpIaStQdHdKaXZabzl6R0NaUktDZFdiMHRtaWt2WDZmZFhLMDB6WHlUazRVaGRlRkJ1YUxkU3pwbzUrMGN6WEZrVjZtV3l5UWhXOWdMbTVjUWs1RjdzZldHSVc3N3FvZ3VrMzFUZ3o2c29JbCtCSjVEMnhmNmwrYmtIWERUL3lLOGZPYmhMT1dPSHpyTHE2dXlCTXByMGZsYW5sRkxuRTZ5R3lyUGR5UVZLcjdRcmJZRE42US9YMFhZMFgzUEZQeHZrWHRxSnFIS05LT01nejZReUNoMHlDdk9NdHlpVDRXZUhhSG4vaHozNjJrM1I3dFlIaFZaeTlpTVoyMTVaOXdvTjQxNXYyOEJwVjZORVJteEpRVyswYmFRZXVXbmVybm5wbkJET3JETUpMYVVLY3dFbytPNFR0ckI0MmJxelNHdWNaQnU2OVhka1JPRFFZVnQrOERWNDJpMVA5WjZpMVR4R25xcWFmRlFzaWhKeHNRN0Frd3d1dDkwREtneDgrUDNoV0Y4NlYzYncxRFlaSk00M2xxNkZIbE5ldWNCbkFhR25jbHV3Smc0UVNpYmdNeFRlTGl4SElsNS9VaEFXdzZ0TEZPSWpKZjUzSTRrdXl4NmsrK2p5bDdmc3RTWm1MZWxySVJIZ243RmtpRjZ3YjdERnBNQVBlN2lxTzRzcis3elRsb1R0SzY0K0xqN21jMHpsZjlRZGJTZ0M0V1E2aDhtVnNmVXoyb3AzdmlQYmphZ0pSbVJDNCt6UGRZeEhwSUloWGdtdnpTR3RUU0JXbEZxdWZucTVXbklIdVpXTUY2aDlIWjZVbXRmMnhHT0xiVCtKOFBWSXhTbHNDVm9JVUhnZ1EvOExsdkgxY0d4SkZHc1FmaXV1Vit4VzM0U2xRcFloWXdmckhWdWdqMHdtQjFnSlVPVmdPb1FYNEQxNlBRWlpLc01CekNoR2JYWFlDTW9GeVNIU1loRzA2UzJaaU5IcTBSVFlBN1ZSU0U3aWtyYjQwdUFlNjRNNmlsL2Y0aWdXQXVnaHV6aGxuY2JPbHNvK29ER1Vub3lSOCtlNEtPZFlqY1c0VkV2VXR0S0h2TDhtWmdzWTFqZGdpNjZncmFzamE1aE51TEpDb2ZScHlXUDB5cTV2enlOY1lVTWNCeW85OVc2aWlHa3MxdUJWTWRlK0NHVVVabUNPVm4xdzhhMnBRcnBjWkJWNTEzNFVhVDhyazU0K040M2pQeEU0blpOT3dwRlc3NVZkUXZCcnFFZUd3amMxNTdsNmtXQkNQWTB1L3M4c1pDZWJJT0UzOUQzemFQUlV5SlFweXJNMGNZcUM1bC9EQWdQV3RiYmovbElxQVJoMXhiZXZWWlhjZ2JTNGsrVk1rUTJQN01RWUVpek9XTmFDYWpBanB6M1ZGUEJTUllBVzc1UVRlOE4vRzR3YmpwQjltcG5HZmpiTlNGdGxvbUxmQWp4RzQ4S1IzdlVpOVMvbXdiR3dyR1cxVE8zNkJHRk5rMW5DbHhMTk54b0V3bTBnR2tNeWdmeWkrU3hCV1NFZkVjb3ZKcm5yaWJ6d3QwcjNibERUWXVFdU9xaE5yZmZCdHhyMVhMSUVxcW1CaDVITy9WMlRWYlljUUU0TVpCNkRPUFlibm5ibWl5eEdMcFV3TGRYRE5JNHVUYVpubllUNXR4VHNDc1EyVVo0clYzNEY4RE9UUk9aRVFMeHM0MHlGMXczSUsyNlpoT29JNGtnVUJSc3pWQ2c2NTZRTXZ0T0lVdysxeU1wYWM0VmpCTFBxb0FnQXNiOUdrR1oyRDZhRUkxRWRBZ010TU05dkVDeXV6RHJnTlNFeUdBcS9wbEZXWFIxbGdGVkdFcGZRZkU5WWNIK0pWRTFwRnNjVFNBSE1LL0ZOSDFHZnhPbkJDZ21MNE5TSERaa3JFbWc0eG41MXB3TzZWSkUzWkNCb293MXJBZHliN0ZjdS9Dd3U1dkF6SnBEZXBWcUlacHloTjl0eXJ3cHNzL05UYjhaNkp2V0NJNmQ1UnZuMlBJV1dOMkFmb3BWTXJDeWRGbjZUUHdaZ2ZWUytQQzNRY2dYSTVWeUlRUEpEaE5QQVhsWWR5YzFIY28vTU1rT0R5ZTVacUdlbll3c091RDZoMVF1NWtvOU9LU1RKK3FOOEgvaE56S0NCVUc3RFFwMVdCWng1bkppTmU4bWdKZDNiblhYak5qcDEvenBKNTZVbFlvRXdSTzdENjU1S283OXdDYlVHWlBacWdZcU8xK2lkSEN3ZVgrNjVtVkYrNE5uRzc0NjVIQXcwcWFjZjU0dUJHa2tZcEpHRTI3WHhMVE8vcHBNVFU0ZnFvUUdUTVZLcFkxbGtucmhmREFTdUxNS2ppTjA1RTE0bVhvOCtlZHBVeDlPUUh5Ni9ycUxmK0Y5WGlRWEFHMjJ2cnBsM0k0b1M0UmQwckd2WGxuWmJTODltellMeUtITXZweGRpMFFpUm5aaHhOV0lPbUxDVk9sbU5jbGY3eEhnbmd5cVV6eXI0dCt6cmJEQ2NmS3Q5bWY5VVdVOE5pVHN4MTFtbG5OS0ZscWlIa3BIZEJnR3BTQ0RsZFdHVHNuTzBvWVNvZ1NteTIvOXNzVlorR0lUbDF1aHR3MGFvV1RHMHo4SkVSZ2JRRHU0WnNWNkRDTXBJb1k1YXJPUEMvdlRrVjlDUUxBUEhlVWNvYUdNcHF1dnU5NkRUZ2ZlYmFiN3RNbFN1WjFucXdCRy8xcGp4NkthSnVWUDAvbUVsRmt6eDdxQ3lTaEpGRVZHMUZvWm9nd0E4cmgvM1hkd0w1VXplS3VqYmRmNDJ4MFI2bzRSOUlZU3pnUjh1bk9xWWhiK1UzK2MyUG5xUG8rSVBVNDNwelZNOEgzOHZUaWxDVVpycUtBZ3NVMTR2ekp2ZWlKalBWREI1MHFub2ZnVjVCNUtuQXV5MjRhVW1UV0xqaVlibFVobHdvT0RvR1NTOUljTlcyYno1d21wQUF1K3ZWa0NSMFUxaHhuYjVRRHNSZTM5cVpaZVp0VjZRdEE0NVVUTk1nZE5hckRQajlLYjNkdEd4Um1kc1VzZlc4ZFJwdkRld1hnRkZnU052bUQ0RkU4S0lpMVFndnhSYUJMNVlRcHNtSXhTNXNadE91VE4yYkxsdWZ4ODFqQ0Q0SlhjNGpJVEozaDZYaEludnhQUy92bkM0NGlrdjVMVzVKKzd3T3l5bHVCZGwxQ013N1VVMG9sWXhnbUkzVEpwWUpidVA4dmxWdktmS2dZaGtIRVVxaDE4Zlp1N0thRHFxWTBuLzJCeTJjUTBtQ0cwV3BKaVFwYmozVkNHTlhZdUo0QVBMbHVJYXFmbTJLOGg3YkNDWE1FamhWV25yQmNaWXFVRUtYUXBYYmlsd0JZK01Ha1FnQVQyeTJWUjNtSVVtT2loVUxwckY0T2o0NFIxUEhLekxTcGdqL0w2aFV4bW1kYlJ6M3lyNDY0aXZhRjRBOTJKczZEWEhCZk9GR1JPbzZPcHlsVi82ajd5VVRmVWlBbjBCdXhHbTR2bnQycC9zYk5iTjBZQXl5YjMxTzFISFcyOWEzNWhVVWpCWSs0bEpwWnIwVk5PV0pLYkx2QnMySzJiSVZKVFMyL3JKdk83akhCbEQ0TFNmSWo5R25yaGxFbURqcFRGT2Zvdzk2WWV3aDYwc2FmOHdpeTBvY0hMYy92QWNSUzM4dWJqK08yN09tNzVBMmRRKy9uaU9JTkhjQmhaUG1ZSXAxdk0rQWx1U1RVc3RFWUNXcHRIZWdpTk1lQ0dJR1hERmdlZVViMXovcGFHYU8zWkdzMnlzL3RCL3FPNmxNM25zenNDOGFjRzB2N2NLbStGZDNiYkNhUVB4eVcxZFJEZHNKY0UxSldmbkM5OUxaRUNGYnhVbTg5ZmJaMCsvU09ObXhjSXRta2kyL0VJMjd1ZXU5S2l3cE5kR3pQZjZic2pzak9Fc2FjeE9BVUZCdjd5ZHMyN1JVYmJpeGdkQWI4L2FQZVhyK1lKWlEyaFNDUk0yVGkzcmw2a2VRVjFtUlM5WlhyakVpTHB4aWc2bDdvN0hlTlU2cEVDU0FKdDcyOVh6Zmx4ZlBBZ2Rlb0NoSzdvbW15eUdNUTRqZVVZRndzYmcvQkhaY2FLUEZGV29DZkp6eTRVZXV6TCszb2lJcUVXaFVkZ3RGM1JTS1pMVDI2K2RKVDBQMnp2RXhDbzQ3MU91bUhqWXdnV3lpUll3R3NmQ0ZxbE5WU1RIaHQ1NFEzNjUwYWFNb0l0d1NHWlpTOFJwRUVybmFiOXN1bnZlRFJreWdST2toMWIxdWt4ekdkY1Q4OFdVUTZ2NnRycmc2WXBmcFJZSHVNK2tlV3QzNnRMQXJadGdBZkpSNzFxVVpIWjVISTFENHBURktUdlhlNmlWb1Q4SFI0YVhhWE92bEN1YXAxQ3N1NkZrNXI2bm5iYkVaUXlXYUZoeEVISFF0QnJXUEhTcjZVQWE1SzUzM1FLa1hDMlNmbnNnZUUzM2V6Vmp2T28wM2daYkRMR2ZkeGxldUh2RlRwV0V3dWpDMHI1d1dpYlgzZUZWOHIxS0NMRG45eU5QRmU0ZWkvQVNNUjJ4TG5JbUkxSzhRRUcxR2RNc2RyZm9UU3plZFJlOGIxTWpSN1Vzc1BSQXFnTG5OS3VpcW5FUG5kVm9FTGwwaGVqVmtLUE9xYUlseEFleFZrOWMvU0huQTFtQTVXbnJxUFBvTFAzdng3QUprYlhyS3N1UmZCeW1tZ0NFZ0VsejgxRU9mRTViMnU3ek9Hdk5sakN6YytBWFJ4Q1Yzc0dTU0dpb0VTeEM1UExaazN0T2F5Z0ZJaUh4MkU5TnpVbVdtSlR6VWIwQ20wUkk1dW9hVzlOUWJhNTkwdWdoNTFQenBydmNoMGRXQ1lJcTBBT3Q0WHQ0ZkRJektmRkdzQUFxeEtyMUY4OEhuWWc4M0s2bEZ0WjBZaEdaR3lXNnRYdUluWmlOcTYycWV0SW9mdWU4Z0JSdXZQdnRDYkFrQWFpbkJ2VTZkaUtiTm9DeHNzTUcwWEJtNXgvdGpJd1RGWkNNayttcmZUc3NDbXk5emV3MHlicDhTNWFkalh4d3NDNzdOU1VHUHVoVjJ5VXJFRVlyZUYyMHJTVjFwVUNnVmE0Wkp0bE5MQm1BeEJvWVNBejh4UzJXaDRZZDUxVUFOWGQ0SEJOdjJ3Nk1ZTkFnMzlWSUJBRTNudzN3dTgrTStDOXR0YVBEUFgwT2lBSFg4cEhwbEpIY0g1ZzFFa3FTbUx4NStCM3BQanVpY1JBcGRiZHVZV0tVbnNjV1NWRVNNeHNpVmNVRlYvQTRiRXFkVituNnEzWUQ5anFLTkxFc0I2bHI4VCtWUU94UW9pbEUzRVN4ZWpVWkFQa296QlpxWFkyRWN3aEVVc2dTYjVpSzVQUEF3YjlPOC9HRm5xbGN2MnU4emFDN1J6SmhqeTJQcG94TGtFVURMNU1XSUtBaDRYeVpKb1gwT2kzd3RxQms0NVRiZWJvT2NlT1VHM3k4R1JoNGQ5TDZoSGdjWTZRWjV6ZWxDVlRmNnlOUEplYTBOT0xvY29yeENUcEtUNEJlcDVGUTlTS0Q1RG12NDZsNk5qelk2OW1XZTNBWm1NUm5iam9pajQwZkFXZkViNUFHakdqYnpzRm9iNFNWNm1rMGpOQ2FyWGd4M0dSQnY5cTZHR3V4emVrZ2twZUtIclJ2Q3hiNkNiRi9SRE4yM0luTFM3ZGRZQk1ZUHRjRjhkSGk2bHRkTWtnVHZUa1pNbStCUS9zVzVad0hhZUJLOXFjWGhjdXMwTk12RlVTZWhtcm1aK3JXSGkrTEFyVEtRM3JBTU44N2M3RzUvWmZVVmYwTFg1UnlmT1JmL0dFVnRLalVZbWZPRDY0U3ZSWTE1dDYyc1VCVi91UE90WUNHR0cxMk9ycjVwVkZTS3drak9SV3RXMndCRnVtL01HRlhwYkdmYjIzYUVIM1ZtRVNJL013ZDNheVR1WlhTc1lYc3JtalU3K2tPc29aL1AyT2hmZ0pHaDNQVVBnSXpYOVluYnVnSFNaeTYxMXh2MEVYclVUVG5nZkNnUkVpaWpHSHVNL291WHVHQ3B5RFdmUmdqWUJwM25URUludGdXU0M2RWsrUVJySlNBclJzWmJDNXh1QkZXWitlSjQxc1c2azN2ZWxCQTQ5U3ZidkI2VkprRWZldzJITTBRVGt0N3JsQzhpcWdZSnU0eGFVNWJxMWRCL0xXRDJmRVVnbUFSZS9JNzdoUXFrSU1qOU1YNzRiL1MzSDlwSS85aWVsWnRSTGlrOVZEbXdwYnFyZklJQ1pFNnl3NTZaOGN5Nk9GcXdHTGMrTkhlOXZudE41OWVpai9SclZEU29QSy9zaWpESjRpSENpbkJ3clNDU3RyNjlxblgvdmNRaVFkNU04S25wQWE3dkJGVDgwcHAwcW1DaEZDN01mWEh1RFdjSHpwdzByMW0vQmlwSnBOeHlRd20va2h4aWh4TFJsY281ay9yYjJ4NkZ0YlJQclJoYS9TYUk4ZUtrNFdRZEszMDUrNlpOQ2docFh3bjh4YzM2dEN2MWMxQzIzaU9FSzVHRGpUVUE5bHNlRTBTQk04QXpmUW1EeGhqNSs1aEpNWUtiQUEyRmNUQ3pQTEsxWWFZRUJ0aGU5Vmd1UFZtOTlyajVqN0VXejJncGhZMmRBWWFyKy9HYk5uRkRxTUh3eGxpRW4wTW9UUEZSTjVnUjdkQjNZOEZKTThveGhqcmV6dDFuc2lCSFpYV0NRK3RrOEFnSUNBZ0lDQWdPSjdSQURCOU5FaGFPeGVTQm5aR2t1cnJuMm1ROVR6UVhUaWNqWWlXQno0R3NHMEUxWmMzMi9XRjMyL1JmNmZPays3dUY3N1B1RFAyYThiOXYxY1g3UHRVZCszVWI5dWlmN05iblA4UHJLNzdmcGw5UG5WL3dmWnEzMmZhWi90MkgzN2ZxM3YyZmE4Nzl1dUg3YnEvWnFHNGYyL1VFL3M5L3pYenBQMi9ZTGZzK3dQL1QxTDM2dnBsZjAvcnFkK3JTTDlWdGZwNk5EYlhjZVh0SENUWlI3VWZnOXBMU3dXc3E4WVBLY2xnd0JRdHhSMHYvNUROY0RYalA5S1lLV2MrdVNKYWNNOTlCUDhObllkVENnSDU0U01DSTVJM0ZjSUtCemdVV3pWZXZMcVBHTzFEMWFseXo0VStGcElaVnFDLzIrQzY5QlBERGhCdFpvbVNrZnBXZXdyVFFZSmYwNlEwNStsQ0UzWWFUMTlLQnBadzB5cHN2SHBOL21HNW1PblRyTzBaM2J0SDRaQzB1R05rZVRLQTA1RHl0WTJSb1ZxVm9xYmZIcEU5b2RHYUJsWEw1dmNMeWlIUlpNNFNGZVRhN3hZcm1BVllhZkVVd2Vtc2JxbWx0bnN0Q0JyQ0gwZ3BvWGRjN3BHcjNtNFVkc2ZlNzJYeis2MS91dmZFVGxIVEVvR2JzY2J4TktPdmsvTUowV1ArSFZBNDdGM0JVL0tVWHo4eWJJSDh2MHYvM1c3a1NTaWRBdC94Wm1IU0ZXS1JRNWpwT2R4SmVIVDZzVVI4R1k0c3dZUzVENDEvTjZhaXM0aG9ITkxsN2VETHJFenMweHgwdGpaL3dmTHZkazBZR21BSXpQOFdMNlpFOXQvanRKeWxVVGROVksvbUFIdE5RN09xTEsxNXI1NXhPV1pFYWwrOXFJTzZaSDBRSHNQWXdBd2JwaHozUzBoTDU4L2E0TnZ6Wmk2OFBxdmNlNFFETWFtdmQwc2R2WFNXMVpZOUpMN3ZzaGkzWW1SWEdKais2dnNGMGRicWcrTXFsTEhPRmU4TXNzc0sxMkpqWkVIaytaalBUekFnWGY0UUs0cUY3T044T2xIRGw3eXpFVzdMc1BhRWVnYmZkM0NadEJnbHVQN053YXROQWs1eFM5NnJObFlRQzlYd1dkRmQ5K1hBdk9RUFVzQnBPanFTanpINDR6RjFUWkovdTdIL0Z3OHdiTWo1ZWdoN2dXckFoTWJPN0l2L1BDRjJYN3pnWjJxOVVsZldMMW81cTdJdVVHR2VrbHd6WTM5bDdqUXhmRUlSem9KcnVkaDhlVVpaaDR4TURZdmt5RnRlVUZjZkhibkNNZExSRFdOQVB4aXBqS0tqZ21TZWFmL1pOMFFDaXFoVFBKRSt4UVB1aDIwcmJzR2xJYWUrak9RY1p2dXlvc2wxajduRXNJVXhaQnRHZU9QM0pqb3k0NVFEWnFhRG8vK2VHeWt5MU1lZE1tUnNpZEkydE5xWHAwZVFpbU5aM1hpV2ZUSk9XTW9WRmJScWhSbTJwVUdKcUQ4UjJObElPTml6MExsdVBhWW5lTWc3S1VUVkFFVXdDV1psck5hcC9ZSlRlUUFsT2dtalpOTlFLSC9TckE0ODY1M1d1SURGbEpvVkZtZXRRSDFOMTBmM2pKSkR5VzN6d2hoNHUrSHNnd2thdDdRWm5EVGxMTFM1eHZYR0ZpcTlidys3c1ZDbkl0OGk3UThrUy9WWm1jRmRIem9WZFo0Qmw2S1pObUV5UGNNMlF0d2RLUDNESmpBUGhGZTNJODBjZTBtM2Q2aVBXbUQ0VEJjUDI1bk9VcEJOTHRuNmcyTndxM2tyd0RIRnc4KzU5SEE5Yk93cStrQm9UbjZORCtoYjE3NThidDBUbVZyMlhSYmppUFJTaHZnbG9RT3owMk1haSswYUl3VXZJOThvWHVIRGRpVlZCQ1g4OXp0ZjRabEduWUJMVUU4SlZHUmV3SXdNbVpjTGZTQlZPV1BzV0ZiQzZ6SGFBNUFHSXdrckpWclpGODJjT0NDYTluUjhvc0hUUU16NjdRcVVJMVZNVnJZZ1VoTHZUOWErWVVQR1ZEaWQrMjVpaU9SUS9CdUVpY2VGWUhzSTVqSEIxbzhnWDdGd0VZaXluRXZ2ZFZUcVVlbUIyQ3FjS1lIU3FPbUwvRzhjVU1mdHBmNTNJWk5tUUZuSld6aWdiK3doaThjTXFoSVVxWHZ1SHY0dEJkb1h4ZW9MbWpsUHVWMmdhdHBkdENTNkFIVSs4S1VlT2dKbXdaRlhoT1RsTzEyNzQ0WGpwZ0h0TnV4ZlNjNWtuUHJBb3NuVGY3ZFhXcTdTVDFtRXVkRXJ1TFdhQkN0aFZNV1g0c3RUOFRaVlNHMSswZ1lUaHp4VjY0WTBIMG9ibng0TkVtY3pxenJHSFpISUw0V0lIL1c4emlBdmxkaE91SHlHUHBVcG1VUFZndG9ZcDZUR0J6d0ZOQ2ZNLzY4L2tuR2xQZWNtcmpMcXpZNTlJNE5lVytpdXdPR1RQZ3l6cTBya0hHcktmeFFTQ1M5eUl1eld5dUhCM0E2dW85U3VvZXNqWTcwZlJabXNZZFBPVHk4RWJPUVJCRXRlTEJXZktJeHBGekFjaGs3QzJSb2NGbVRNTDVidHUxVmhoN0lsS0pka2FmTE00R2IzY1E2QnpCVkpaRW12dyt5bm1pZGkxV2RNaTdVS3RkZHFZTVJGalA2TGhrZUJPaDZtUWg1aS82dWFWYjBqWmIzRmRJSU53MEJIKzZhdHdrVDIvT1NybXRSREV3UVFmS1VoMjVzaEpEUFdCSVdxV0JiKzR0MG5Mb2FYRUN3VUFhL2xSelhyWUE4N1BQTWNYdy9paUVLUkszWW9DMUJvYkRENUZVTTQybUlTVGJCUnZqK1dTQ3ZaaldYNVpvTGRIMDB1TFQ1QkY0bFVEakRYZ3dMR2xTSnM2NFR0OXBQWnJpRS9YSDNuUUR5T2pWNjEyNmFDV1ZEQUR1dDh6UjVYR0VMMXVhRnNxUENnajk4c05hbFpkSWxFbGIrQnpwbit2YlNXWS9KdnFxbWIxZTljaWhOZFpmMDlqS3h3ZmVmSm1saEhJa25oYWd0ZTAyMjlrY0ltcXBoMFZMTFE1akNGR1JiTTNvT3RYR1ZSV21aQzBQamtJY1NESTJ4NHdJOTZ4SktwUHU3NHpDcEZmWFJsNzZTNjBoU0ZXWGF1NkJPNkxWTTcyODhEa0JWVFE0dzB0UWo0Y0ptcUYybnN0ZGpmeURJaGE4eENvOGdHWDBYTWVMT1d6Y01OUDQ0TmJKbkFIT3FYMWpOeGNhRG1UMnFiZ0Rrck1JQTFpNlJmN2JKMGFEVTgxempZeWdEOGVaQnlCaGhHcHBPS01oc3pHaURrRTdabFdyWHpFTGV2UTZTMHlCcTVaWEQ1SFNyWGI2OWQ5TkEvM3kvQlUvVWRsUWxxTzBoM256Qzc5d1UzNFJSWnR6NUhtTGhnM2ZiREdpMnVJQnlDMmdyTUtWeHFNaHRsS3NqdWhuM2g4WHQ2dlliei9lb1B5eFVNTzM4ancwOEVDS3JWVkN5S21lZklFdVQxbzlFMngvdjFBd2Vvb2lVKzZ4dHROeHozbHFaUHBrM1BmRnlEMVR3RCs1aFZycE9wWUFrK3NUbkU3bG9uMjJoNmo1bTFoK0tNNUsxNFhpMm1WaCtlMGdvWFpEeTBoV0ZPZnh2OTIrS09oZEF1b210L3VBNkJpR1daVFAwY2RjUE5WREhyQWFkVmNteTdlYlo1NWZLOUhCWFRZOWlDWWVodVI0SUhmSko5bTU3TTIzdkJxRVI0dGNxZUhCL1UvUUFUVUs1T3JmY29oM01LZ2R4aTlTVkJWMjd4b295RzFJMFQzN3pzUVlFVm9PRTZ5KzBlcEQ1QUNNNHhTblNDZlVRc3JWRiswaGN2Z05EYmRaSld3OVVXVkFrS01XOGtiT2xEYjU2Snkxam14eGF3OSs2Q2wzaWRHNjJtUnJsUmZ6NlozRlBYSkNyRlhqYy9iMHdvMXBQMitjbDVTWGpnWWxWOFRuUTVFTVNKelgzSFdhRnF0bmpBM3h0cU5CZnRtMXlSbStQWjVFbHFVZ1g2Nys0djI4ZXIzMGRrWjBsTkVxWHBwL2FjM0ZkQUNDZUVSMG9LdmhRSXdyQU11UTIyZ296MS9ORHFPQi9semxUSlRHSWN0TUNlR3hxNkloMTdMemZJZ25CNjRuWVBwbVltTUVpamFwSlFvcy8zK0VBL1J4NUREeG55clB0UXY2d2FRWkw3Q0hvQkFOanN2TkNraTRHd0tEZkNHclZNcDJBdmFqUFg1Qmp5M0dITHIyLzJCMkRCODJjMXczTXgrUU04akdlYi90WnJncjM1TklXZnBXbG9zSkFLOHN6VjVHb3JuRjdPWXJFTGVPeGJuL3FwejgraWVoOFhPNFRmcWMzdDVGczhaZ05oMjdUUCtLNVRQOGNFaksxVHBwS2E2Q091NCtCQ1NYVlJXd0dTVDliV2RlRG1CdGNyVjdlSFVwdnhWUXp1NzdUemVUajRMd2toOElJRDFoamE1Z0drUmhnb2NUTVE2MllsYW9KS0srN25xYVpubWIza1pVTjBMb1gvUXFmRTkyaWZBWUtRbzkvd1AzSHh3VFN6dWNxMTIzSSthSFpYZ280UlljdlVvcW5xOUVsMzRNdTh2M3FmejdlbXVxVkNqL1Z2dy9QSWY5QlFLNEtRaVd6WlUwbENKOTNLUXZvVEpHak43M0hFaXNkVTJvOXVJTFl4QlEva3pCdEM1TVJudUFrNkZwR1F0WllyTUtVWXJKZ3ljc0RrTVg3SlNhVFdvbmFaRE1CenRFWElueC9hSXZNaGVVZU5WOE5wdUl5ZkVjYmxvemZSTjRST0pCcmFLbk05WEljeWZVN1BGeXJiTTdwNXFnRHBtNUtyRG1XQS83NjNYK1Q5UDR4Qk9jQi9hTW1OdmdpM3ZxOFJwU0Z4c1hybXpUUEZQNjdId3dEd1FWRWF0Z3dwNVRRb0s4WkhuUEM3OVhhWW9nc0QzVzlraW1aOVdVcFBkTzhDV01zNDNpZ1ZZNk1rcTRGcmt3NXBsWmh0NFF0cjBoNlNoMll6eUVIemZqMFVZZEd0dkNxdndDOThsUVNnSkF1dGt4a0RVZ05MaTJ0dGhiaGxoUk1TazNyM2NCekZnNGFKV1Ztbm5lSmhVV1V0UmF0cWJCL0dQbnZiR2drS1JzNHpZL09Pd3ZNWitYME5nc05tckpPV2xlZ29neUYzM2NIUWNaZnpNb2VldHFWaTJBZ1VnUFlUeTZkMGFWYXE5a013V3NPd3hxeks4QWVPVjJWNGhOWWF2OGNIS3VPVW4rbUlrakpXekNjM1A5d3AzekFCbmF3WjhKK1Rob1FCV2dOU2tsK25UQ2pRVHdTcVlCL0svRzJLS0xhY05ZSlFVTXZhWkREUjJyM05oT1l6cktZYVkybEdVZi9PVjJidFdQbERMYnhORnlUYmE5Z0VCc1M0d3ZNdzh3cWxZK0ViM082VUFNbG0zR1ZjdUhjN3drMjgvd0lvdW1hR0JpWjcvR3hSOUJ4Z2ZjQnhjbXlKR3kyaXRralJMSnh6NHdOeURIczVQMUFpSWRFSHJ6ZWZ5Y1Nqc1QzVUxDS1N6M3M5d2RzT05hNlVvRmZtNHpYajZrdCtORmFoNU1ocXM0VGwxY09vNFhMdi93UFkxbUIva21XYThjODI4UVgrbFpEODNHcis0S2lZVWFiaE5KaE9UeHRnNXRwVllxdHQzQkZxeEF6Wkd1Qjh1REdzNTkya25ydjN0UG81RzNkTjJuS1hETTM5TllQcXMrVHQrUGNqM3N1aGU4anl3b3dVUDh0M0pLYUZpYjZnNUxaclg5UGx1ZGgzZUlYVlAzQzlIeVNGRjhTZmJOL25KSk1Hd0dCNnlFaUVkalJUd2E5MC9oUCs1TGtuRGYzRW1Tejh1ZUh0bXc3L2VpZW45VitCTllHZFNjZWlsVU1rVzRRaVZrNUc1TGhZd2xEVHpKZkdtWk16cFQvRXRUWXZiUU1KSTU5ZTMzSU5xcDhISUdZMkFrdWZFQUJHK2k4V3BvSVJmOGFYMG9FVTMrUWpYQjZCRVZEMHcvcWNySzkwMHQxQmxEbldGWFprU0pERXFDYjIrSFZRZGxoZkh5VUg4RTBXNVBGdnUxM1NQenFLSHY2R2d2S1ZLS1F6b0ZJVENLZUdFa1RzbkFIa3FKaEx2QUk5UHFVdXdkeS96eGw0L25TVTloY2YxM2k4OHkvK05rZXh0cVc5WmR0ZHBNbmZVQy9rNnhscUt5em81MC8rQzYyNXNqUXhyL2RBSS93YzFURzF6SkNHd25WMjBkNU9FVytyRkJiQlRndFROZWdGOXlCTUZwOFdGaFVCd0NLZ2Q3NHJDWUVuUndUTkYrY1dvWW5qdUpoQ0Q5U1d6Rlc5UngzRlhtU0dWUlNUQkdBSEZKZTAyd1JMQzRNL1hRUWlzWmFodjFxWWt2NHlUK3o3Q0hWSzJwNU96SnhsbnRQNnJmTkFqcDZtNHNGWkR3dzBXNTdGSUxLL3hucVIra0t1S1lPSXNWNktuSG5mNjdiUVFrSFR1THpCYzFOOUlIRXd0UXFBY1hGN3BOVGIzUTNXMk53YkZhVEttSmNmV1BvZlEvbHZ0VXYzbjM5cVdWbEtFZExyd1luc1pUdW4xT3pEUzFTciswRXFDTTZrTklndDlla0dOMWtEVEhQL1pBRjZYVmJqd2FRdzFTcnF5U0ExK1ppRExnYVRva0JuM0ovbnVKSXJFbjhSKzFVWjF3YXUzaGcybVBuWUV1cHd5Y1R2N2VqSVk4Y2ZVTmljaXh2cWpwUlNBVlR5RXNNZ0xRWHczb1JuOVIvZ1NHcENQTnMvR0ZBNlg5Zmw2Nk5PWHFtWEY1b0Rib3l1MTA3T1VMR3R2bCtyL205RC9TNytCOW13aVRLOEpVQ1V3WEttK2V5aTdpVUtKb3BMODFWMHRja09ocEQ2cjZxc1JoR3VRV2JzZzVKTFZ3WDZiU2xyUFlHcmRMN1ExS21mSEFYaXVuTjZZMkpUTSt2MERBMVJoaUw5Qm9jRVJoM0NnVEdZM2VWdmhmK0dONnN5emtkMDc2bGZEdTMyQld0dHpPVDkwRG9tTWVGR2JTUzJBNnV0K2t6dWdIc1VuSU5YSXdVZ095eFhjNHFKNEcwUnFWMWNjNlZ0ZXJTck15Z3gzTXBsT1FXbW5OUnduWG02TG1JRkZnZUVUVEhyNmE5NUpRWXREekdFdDVCVWxNdEx1bytNelNjcFhhUmNkWG0zTEVJRnJoeDlVTzd5SGtHUU1ZNXB0VUhDMU42WXJkRW54Z081Ykc4YWRXVnhsRDVYN0czaGNuKzBSWC9RRTZodW9YZ1BQaTFXT2xmcStvRnZtWjBwZ3QxM1lKb2FtNlF6ZXpyRTNmTk5yc3JyN0hHTUtSejlCRjg2ZHhkVEpDd1FUeVN4ZU83S0ZleDRLL2dzL2MwblEwNlp4di9SYjRkeGJZMXNQUUJqY2wrV29tZXdrSTFQSkFKYTl2YmhNV0QybUZ5dnRGUG5XZ2podUh5ZXBxcS9xNFZZV09hek0vQnl3amRQNEZUYW13UHR2VXpxT1AzOHNtVHF3NW1ubVovTUt4T25LMDhEQUJWd3lyRFNRUDM0bExEZmdmMjQvb0JOM3NnNjBEMVVBb0E2LzFIMytUOGlxOW4rUjRaQmNzVlhmcWJCai8xUW43bjdqdUVtSjF3UEQ4V0lZOVllUFRTdVNGL0dBZVhuM0dGa2V0Y2VOblBBdXE3L0h5dzlGZ2lvMndzS1hmRXRaRzRxSVh3bDFhNVBIVFhMZUkyendiNExMSlJuMU9mZjNiSXdFRU1XSkhFQmdnaVJLQTV6eDBTa3I1aElWU2h4L2doQmprVkMzbnpXcHNwZURpbVBHWE1OZWl2SGI4SkM3MlhLOUxRNDU4VUFCdGp2TTJmeHppUVp4SFZvLytFZ1JVM1g3RWlGazhMdS9Ud0JrTVo3em1Sb1N3ay9tV2dacGVueis0UlFRS2NoZ2V6QjdhbnN4QVZxaFJyS0VSQ3NFQm96aXEvOWpzRFlkY2VxcUxvMzNKczdBcUtMb0lJR2xXWWkyNThpcTI0VThCZjkrSGVlbGc1RDNSM1pwc09UaTBKZnlpcU53ZVljdGZTdEU0Yzk1emhkdGJNZ2VtcVdLOG94WVZHcU5QRW5aRHpFQmVSUU9WZzlGRjJJTWpZVjVLZWYzaGNDUFVnclY1L0Z0MnVWcVo0U3ZnazBsSWY5ZTdVcFA0QTg1K2NnQlByUHBKUEpWK3YwWHZ3SWhEejJEWmpnbG1xOGZWNkwzWXdpUjBRbXBiQlRMZVZjSVdEUEJzenNUa3kxcy81cW5tbnl2N3NhNzV4cVhOcE95dEtSc2hJY2g0RkpOeUx1S1h5b09lWlRMemdzZE0wc2pnUnVETyt3bmMrMWQ5U2JYc3lsZWZUcithOXkyTlFmdUR2Y003cmJDRXBSRnQ3UGVhYk1xRGxVcU44YVo2OGJ4dHJnaXdzaERIMWFOaUlXQ0VSbHpYVjNXNXpkeEdvWDVTNm15ZEpQNmRLMjE4TkZlc1lVc3lXVkNKMW8wY2pjNDFLM2V3dFFaQ080Q2Rxd1lBSFpnUmtvMFdha3ljNDhNUlY4N0Ivc2ptOU5HQ0h2UEVHUTBRUDJGMXRoY2JrOS9raFNmdEljQzZoNnErTEVyai9hanYvSW5kblpoMm5EbzY4bTcvbkUrSW54Ky9VVWxMY1ptQkFBYjk0SjJvNmhQa1B6NXZmT2RObm5jM3RoSDhnMVFOUE4xZlJXb2E5cWs3RmdjMEEwcEM5ZEJZQjBuNzFZUkw4b2pUL0NUODNXWStwc1c3RVZmQUNyRVlHOVhqWnpJdS8rRXRFQlI0L1llZHpXT0FpNXcrMDJaS0Vhd042WURwM0RFRWlYNTluVWFONllTNEcwbEpVYW8rOEw3N0xYbHdtaGw0Q2oxREkxWFlzWDJyRGlXdjR1a1JZZnA5SXZ4QUdZbzBOMFRqUWNwZW5NeTZMaFdKaUJqSE5hdE5kVmxJUFQxVmFIb2hBQjRPQnRiVk95VHJreG1JdVpMdW1XUkdhQ29YYTFSOThlNkJLNzk1cld4QWFJQ3Iyb2hYdlVLVVJCWUJYL0dISjFFZS9wMEYxeXc1RTJqaWVCd3crL3hRTDBZMTdpUXBtK285QWNXMGlKRFQ5ZkxVRzVZUTltYnJlZU1vcFQ2ZzRUS1UvbEtpWE00M3J3aTRoL1hzblFJcmE2WWNaRTBaczA4WDBTaUx4YmhjNGs3NGhJOFk2MnJwNE4yODFrdCtneXAzMzRhL3RyS2hCQ1BmSTljUGViNDVRVWtDZDJyWEY3WVhQcE5UdkFvMVY2bjI4MXRPVjhkVVdmL0tSekZuN1Y5YzhISzh0Umk5YkJxSVhzZEJNUFloQmhnZk01TDJpWXM4YzFEK25PaFA2d3ljcWNwZGE5T1Q5U0NKVFhmOXEwZEVENWtwdkhKdHQxU3dxYVlUS3Y4MHdCeWxYVm4velFzQzNlZGJlcWxCVWFGZVV4aEpVbFhRbzUvTTNYUFdYdUYyenVORlZyWUhiOVcwUzBDR0YyM1h6QmRGYnNIb0pLWUNkNzE5ZVQrRWVKSERIUi9SQm1NRDBRZmphTkU3VlMvMnYzUXFNTWRrMnJyWVIyN3dWcmlJcnVpbXZHSzl4NjliVmE0T1dsR3o5aWlWMjNUQWsxd3lDZy9UT0d3RWFXcWM5T3F5OTVrUmFlM1M2ZkQ1S2R0b1VIYXp4UUtkTGI5WjErMldLRDhTNGR6Z1NiaytIR0d6ME5YNHFRUmJmTzNCcVVXdjVBTVpDVU5icVVkWk5pRFN5NzdNWUdaakJWWlZnNjQzNlN1dUpCVFk4anMzQ2ZlNDlUWkg1RWRORXhMUm1ST0pwU0liUCtJelJuckR0RWtoelJBMS82bk1IMnoyS0VQN3FUS1VibXAyRWZRSE5MbTNkeEhUK1JMTitLeDV6Qk5XckdpclJkclBtKzJUTEUxK0J2MU91bWcyc2ZwRzBpZ01oKzVmdjh1RG9pQ2U3eVZoRGRJOFVaVFhqVExZQ0RLcGRURjV1RlhIU25FTUl1aGREQk5ISjJueVpsMCtVdldtUi9YY2RZNC9oQ2JEbGtOMzhXd2IzZTVyTTBTN2s4NXh4a1c2WWNsa3UxUmQwdjVoanprUEdSbmt6WlZlbTRPM1Y0Um4yMVB3bW1VUUw1eVVQUSt6bnJLZlJieFBCb2pqbFlBRENsN2xxVEpqQlAvVWdaT2ZBZ3lHaU5wS05QOWxBWlVjckN2UE1rUGNhUXIxcHFCQlp0WXNreVZQNis2T3N3VjNtZDZjcDNOaFZuU0hFVldJc2tsRUVpeU1PWWcxcGp4NjE5ZGtlT1VZTHBoL003VUlvWEk3SVNYelFyRmRuTkVybWVyM2tDWU5OTUtFOUlMQk5yU1dkRXUyaEYvRHpFQWdveDJXSFE5MXkrSHMwbDFURU54bFNpVk9BTmZJRjdZWjcwRGVLOGtrNDZudElnc2RQK0JSMDdscUcveXFuLzJKdmpLNURhUm8rZk9nb3hjQmlxOWVmZ05DdXVnRGRubjJIR0k1NG9Gd1o1Q2NYN0h5SURncVdZQWNrL2dhRGNhVFZrNzhjU2k1dnRuaXlRc3NjcThFUVowZ3VIS1NLOFJQZFBTcjNuM3hHWXI5WDVYWjhwZkpkVFhOYlI3TFU3WThjYWRKMmVwSlFkRXZScStZc0d6ZmNnTVQrV0V3d2o5Mm1TY2tzbkY5MGE0UEUwZm5CT0puTHdYVWtvd1JIVHlESDA0UlpwVGxQcjhPenVLQk1UT0hldHNtdkJ2OVR5dmszelZITjlBZ0N5bHBaVmd3RW9lMmJEVzFxNk9DYU92T3lnSHVKU29uVTNxZmZidkxyK2V0SGlkMnNZOUZuVjFJUEJqTTRPSVYrNDNRdmk1TXY1d3dTL2VuNU4wQm5SNmlydG1tRm9zMXEvZ0x5TnB6T3ExT2JtOThGOUhGTXNkTjRQOW9ZTERhcE5YVkhWY1hwL3pWMXdSbGJSL1cxR3MwWWZOeTk2eUVzZnFLcFMyZ0tPN2Z2UVFoN24zUkRIQUx2Ukg3akJWeWQzbjJjMFRtbkZQeUtMSVRDc2JJVFZUT3FjM1FRTVl5cXVIYUpFUTBYanczTG45YWpjeGVSbk0wZUNvRGZFbGVxbFNIcGJnM1dDR1MvRUJNNGhOQ1lNVXFHVmJob2FiSVY4dGI2OUNwUVk4SUEyVHBKUzdlanRUZUZlSGRiZzJtZVF0bVBIb2FjT3k2VUxGbkp5T0cyR1c1VFQzL3V5NnpFVmJRbExMRmhSS3VtVWV5TDVVZXQwZXFTeTFnQTdDS2ZmVG8yNXJ6Mm1iQ2lyNzhHa3pTTERudkVIZTlaWTFhY3hWQjBHdWZpc3RVaXJRK1pEL2JJdFpLakw3Uit1OVJiMzNGQmlWTmpLR1B0ZlRsYnlacE1iUnB4Vmo2M0hIZnhVN1V2WTFGTjBQNFZOckVRWXZhVkhjUU9rZnpONmYwQy9rdjJabHh5NElJQjdIM3YzRkJVNlBBTGI5Wmh5Q1MxUVVaOHNzcUdlTFdzQWp6WVkxTHk4Wjd1dVJFUDNpcEk3M2JDdm5oS1ozNjVhQVFKaXJ2THBGRUhydUZYbkswQW02Z053ZUxmUWRaMFBmRFArNnJRUVQvSDJrc2RLMHQvcDR5TXVhd1FnZzM1bjNNRVBqWjlYaERJSlFER2dyb2lhb1IxY0svb3gvTm5OSk5WZmR4OG9Wc09uZ1VVMEUvWGlPZ1M3dGsyWnR2VVkyN1FDQkNUQVBkdS9JKzN1NTZIbVdZdFdINnhlMDdFK0YzS013ZVNJREVpM3hxcTByV1FqZkZQMkdVOTliNXk1eU5KWGpXMTNqbncwRURvY1NEQU5sT0RucnRad3oxL2pCVHBSN3NoRHU5VGVFcVhNSFR1bzRPQ3VIM2hPVkdmaE5Uc0UxUGVFQjcwVUwwZTJUUTNlN1RzdnpNZjUvRm11Q2VMdWo3aEJCS3FobXdnWklXV3c0aUpHTkVUem9IanJtL2xpWHJ6N3ozQ1NELzRZb3p3dFM3YjBjR1Y3em5SZjhDSGh2dDVQcGRsU3JIS2huMlJ5aTc4YTcrY1c2c1dlTUZFNDJzdDBkcW1teU5JVVAwQzdvRVNjWVNXelJoelcrbVpBWExmNmF2NERlYVdudkNkRVdHdkpPeGNITVMxcXdjdHFaVm82emxibDNYZWVyM01xRjMxTXlmSlFtV05IaGtVWmlZMU5kWDc5ZGlYWFoyMnArOU1CSFFFM09GT3JveGNMR1AxaTN2bEt6MGJLYmovZm5NTWkrMk5LYXJFaEkzQURQM0sxSUdNS3FuZHRCalVKT3dCWm1jK0dhU1g0YVV2ZWdDbE1VWElUV0JtT3hvUEFUMmhHTFVIbzRKWFBTZitJMm1LME5FbXhSUXhZdGJ4SXF1V0tnZ0FvVmVGcG9zbEFvMmxuNnZGSEliaDVOYi9SNmpRTVZXN1hTQ3VtSDNsU3BkcTh2ZXpVS0VTRHN4NE4xNFp0emxXSkY0aVRQeUxBZGw1RkpLT2o2Z3U0K24vZWxQQTdidXZPcU92anB3Wi8yd3VLNTFPVkk3RDliSTJvRCsxbUNycEhua3plUHV4NU5NT1RBNkxIY0FZM0F3MUdWbmJ2eWRoZUFaN3FuSjdSQm1pT1BIR2FKcGpPSlF6ajY2TEM2Mlc5a0ZSaWk0VnErN3BYYmpGSnZkUyswVjc5UGlGaTN3b1AyNTcwS2owL21tRVhQdVRxZzNVZUR3RWtiTVFJb21hYk9yT1FCVURnNHhBK0I4cjdtNzlUL2pPZG92ME53SDR6dy9iUE5PQlBESmpoWldFNHllb25xODdaVDgvaVA0N0NYVHVIUnQwWFY3Ym9QTlJ2ayt3NU45NG1aRXIvYlZEVVVpVy9yRDdGQ0xDYytnL3dzN016TEhuejhkS1I1M25pMEJOUWNGOCt3aWMySUlUY3VmZnJ0NnIvZTBSUFdXZm9RVkxjS1FZUU1VZ0taMHdMNmE3dlpVNHQ5TWNTU1BOc1h0RmpqYXl4c2I0a1NJNm5TM3A0Q1JHZzdVQnk0N3YxQml6NkI2TEh1UnhwdkNHVytpS2NiRGJ0dFowK29QdUpUZnFzR0lyRWRLdUR1aVZPOHNpYS9HZ1VCcGZsb2V0bW42b0F4dHdsQ09wZExUSG8veWM2WnE3dFJmT2RYcFlDbTdXU1p4MG8xU3ZvMlorSCt1TGFuWE9TUmIzbXJOckVoaUhJSWVPZ2pJdzdLL0lDUktwUHhYc2hFenBjWTd5b3Zaa2FVNW5FbEtSR1ViTEtOSUQ4Vk5jODdCLzJBemNxVE9uaHpXQ01HMXhWT0FyZEo3bGtKMkY4MVpWdzFidWlYcHY4TGdGUWxHVGZtTTJ2Q3Mrem1PRmhUbVNCMkVKNk1lZUU3Y1pjSjQrZ20vUkFtejB3QmZwL1UwTVFhdmZxZGNJSFQ0ZTJOMUd3MEFMa0lmaFlKSVA1YzlFeE5oL1pOYmtSR2hPTmFwdkJyOER2dGp3bHJNVmJ4V1JiNm5veHNrQU5WSkNvVlo5YmQzTjJsWkxXb05LZDhySU10NlB4K0phNllZOUVNeVloa245QnpVcHJvSzkyeHBnOTlzVXhoY2RuSnZzL2JYcEdacW50VTdkV0U4VElEUlZ2dWdOZi9MbUptUUxPTFFmTXZFYjFYcVBHWWR4N2NqcDBHRU0yWmlqSFVyTUdHdDlPOUVZb2pPYkE0UTVidkFoYnUwSS94Sk9LeVBJK3d4SkFqd3UyV2w3c0FCYXBBYVFZaW9yWEdYRjhORndWL2dpOUg5Tmx0aW9teFhJQTNpTkJsMmJZNDN2eG5MZDhmZHY4K0FCbXgyUWt2SEdPOVNZS3BhL3dUSUtrNVJ2dUptMXlzM3lzVThGUFZaZklLY3hIUzhwTDIwQ3RrVTUvcmlEMmYxT254QUQwczZiL2s0MHZibTdScm1ZRjRxb3gxdEpESURtMHFNbVoxREVUaEFRSUdiR3Z3YlhpdWo3aHo1TEpHMW1sUWlCajB3NXViZmlzUXFJK04rY2pZN09iQXJQSk9PU1Q5WVlRN28yS1JPMlFTZXZxWjVEbS9zQTY0V1RyRFQvVkNpVVREZDlpbU5sUnNRSG1aRlpOTTJmUnJOb1REenpzekpJWldtVGlhNFp6OVpKVWJwbitYZXpPL3ZKaXBsdjJRWEw0bWU3MGIySFNqSmRiZkZDWHNMUkc5elZkWVlWYmQ5RVhDd3h5ZW1RZjRQZUxoOHJJZzljK0dZU2F5dm9VenJEYk1TL0ZmaDdQZTNvNDlDd3lNUWJ2UlhrL3ZmRndqbVV5L3BUOE9YZVZwNVk5VTNjSzYwbm9WWmhPWVV5NlFZaE43UlBxRDVmWFFpUitlMmNKeE5PaGVEL2ZPTEFZZ0dmcUNLbXpvUlF3YTFqdXFteHJCL2RoQ0Z5c1Jhem1HM3N2dmp3aGJGMGZVVFloc1UxS2FLK3hwb2Z1YzFhSU1ndGNDUlVqQmMwYU1sR3V3Z2dGd2xtUXB0a1RLY3FxS3pHU0ZkUnhtNzJ0NzNRNmpUdmZTUmo5Y01yUHFyTEhYTHFKMGdpMGsyYVVPeVYxMlpOcU9LN2FFZ0ZyUllTVS9KQmpVYmFIY2pjNDJJR2ovZmlOYUprck83ckFNZ3lvekZDdlUzVVoyU0twL3dSZHVCWEt4eWZRdFAwcHNUWDJiMnQwY0lNbmEzNjJqSVBlOEJ2TXo4ZGFiU25wOFFGakpxTUhJaEFlSjJ2M24xaXovNlk3SHI4a1ZNamJNMHNUVmxsRFdiRmZSRUNZTkVRVldlTUZYUVlKU3YvVEFFUkkzeElNY3MwN0M5T2E4TnVqK1ZxQ1NoQk5ZWWhGcUtPQ0FFTGZZb1pYd3Z6OWUvaGI1VVRLS212a3RSK0lncHdjd1BXT0o0Y1FKVW9zeTEweUUvSmVIaFYrUHF5YS9RMEtoRmpMS3poVm10bEIyYWg4eEVLdStjc1Y2N2RyVHVSUWJzSU1pZEdhT0owbG9mdHMva01GbkVCNkhKeWcxV3VFOGVzTUZsckZNa3g3UEtLdzRyakpwTkIxTG1ZOUtWWnk4STNkK0o0NWQrNWVhZVRFTmVJTE1peVdibEdvL0FJWGt3QTVwRGtsQ3B2R0JBWWttNWpMdmF5UFhGU0plZVZTVFY5N2tGNHZDMDJCcGZwanRCM0cyY1Q4SjBKQVlCTW9uV3RBekFvWTZKNXU1anZWaENpcVhGQzJLdzE2cmdLZTQyZ1VJMG8vdURFN0UrNU0vZ0psQ0FtY2cxa003ZUJ2emRxVWFTdVE5d1hpZlJaYVA3cEVPRlBmSi9UdGNXVHdLVGZOdWUrWXFsVWFYSjBkWllaVjJUdXpKaDZueTFrMFNGb2oyUG0yaU9mZ1dnTWEwUkNjK25wd0tmeU9jL0tPaU9MaEFUM1ZzbksrdWNqaW42bDVWOWE3L2c2WXpEdmphWW55ZmV1VFFkbUtsK1BUSE93eVhpQm9vbzZGamF4OGVQV1lHaWEwbmV0SXNIYnB1ZHVpSHJDRTQwMDkzeG03dFFXc2NFcUVWL2dxWHQvZDVFMm9Cay9TVzhVdTJKbi8wNjdTLzVoWG5RM1pZaituaExtZjcyN1N0MHZKdjduak1nV1dxQU5ZL29ZQUo0VGdJak41TDgrVnZaS1kyYkhwYzlpMW90ZUYzK1B0UU5aMmdCU3FkVEVwMHZqYnlJVFZ5QnRFM0ZpYjVoWUlHOWpjVjJmNkprRDc2d0I3ZldyREtiZWM0MlBRelIvRU5RQjFoVmZuRFIvSlBBdUlWam4rNS9yV1h5TTFoL1JDOThaWXhFWWU2YjY5R3lCK0JsMXJSUExmNitxYzFHdy9hZnE2blc2ZCtmN2NTdFYvWVZQclNEN1JHemdKY1lFQk9EQkZ1REcwd1VrS0pnTmpLRzQ0WXZ5dnRLOVk3aUNkMzU3QzZLYlJFTzE1a1NuOHdsTHc2RmwxRnVhRUtJRzZMa3V2K0plVEtsaTdPMm43L1FxYXc0VHVSeDJDWjM2WElLaEJFYlo5YmxQVlYvTHkvS2hWWEE1MElub3FJaHQ4a1RNQmtKa2JjZkRveE5PODJoRzNJRXVXRjh2OVdNaCtBOHlMUnlRelVCZ096bndicU80M0hVT29GRFFXUmZiSFZiemhKUkpLbUttd0RpaDJBMmxoSmFIUlE1MHh2bUtqY0FrTjZGTkp0RUVZRG9HVEhTbzhhMklBTjQrQ2lrRXhNOXVITWpWNEVPMVowREl2L0pDcGpJbW1tbHlvRnhZMTZUb3JpL2hUZ3puN0FiSG14Z3Zud01jSkxrOWhjNUhjME1IZVpUNlhBbFVQZEtvYlRxSE5UTFdVVjdYRHgzR3dxOHo2TU5zRG9SakE3dzlKRk9reUhRMkFEbHNCUkRhSkRqUjF3UGk3aUdqK1lCUyttVncyeFZ3SU5jaWMzVnVQdk41eTF4RnRtemVlV2RPRGF6K0t1Z2hYbVZROEhHemw4QXNNZWVDc0FqTGtDcFFGL2pTS3hheG1OYXZDOUoxNVViQjRFWlBhRkNlbVJQWEZFMTI1eTl3MVc1TmMzKzZoSzhnTjl5aEhHOWRDWHEzRzVSQUpPVXVVVE1mZUJiTmgzWGd0TWFadnhBenl5WGFZYnU4aXRWcWpwTGFJMVhyaUNGYWJJZ0h2M3B5S3c0MU5abFhkN1pxNjNCUWNHMUNNb25pODJ1UjJwTzFINGV1UG12L0xRak1NMUk0d2ZpVHN5MjhaOTQ4aXFmSFMxejEwSTFWRWNod0t4K3pxTzdBQ0w3OXE5SHFmMGdpd0ZnRzA5ejlIRHhUY0M2SnhPUmlzcDU3ZTVkSFU4cklrSlBWMXNucm9sWXByalFuQmZ1bEFOc3paU1N3QUxra0haOFowUUZhQzRNbCtmMDEzM3NqbXZqeStQMTRyYmFwU21JZTl4S2cxcHdKWmZqcW9ETVVuTVVxK2lORkQ3N0NzMWgxOW5MS2FhTEZIMHFWWXFlalVoRDJVcUxnTHVVOXRnVkRhb201eFI2RFpGTmpTaTNNWmpnZTNuZlJFYW1EZXBUaE1ZYit0V3VodFpteEV4R1BNdVpJclJDYnhxS3F1SlhnNlUzZVFiZmFLeVJHOE1jdHNVdHl2RWxYVm4yNUZFNy9ZRnFyaWFoQzF1SGVwTkhablZMenJpaWxyWmlhQWhhQm54M0NLNXZCWWRnVUtGY0FJdnhoUVlhOEZhMjI0TE00aWxXNnh5V3hmcHd4dmM5ZUxwRlN4VStlOTVaTmVhOWZIOUhUUUU0NHMwbFpsR3diTHdnSjlpSDlsdllDMWtscDRDeE15dFJTbExjOVpJdng3ZDZVK3RvQWt1T1ZXYnhObFlUS1hqbDM3UnhsczRobUxJYzUrdEZKQWQwZFVtVjMxakRnZHUyNmlHR0pxYzBhb2dBTUtkTGNEY3lyR2loTXI4MVFZYkgyQXFjaFpBZnBKOG5jL2tjVkxEaEZpaVpOS045S3BBdlZhcDVBQWJEWTVabnYwS1A5WC8wUlJJcW8wOEhmR1dHNDZjUEI2VlN2RUZvdUQzdi9ZUEF3eEI1SDl5Mk5XeCtLZ1ZMS25xM2oydlhBUkRmbHc4RDBBQVA4YVhRM1dZK1B1VnE0blhXYnBkSGVCWnR1S1l4VGtUaWRwOG5GL0IwaDQ2MmpxZHlJczJndHhEbkdhTUg1T1IvYUhaNW9CbTV2RUxjbUg2YUw2RFBhTk1wMXBHQU84em85N3loamZKVGpzU0RPVzdXaXpsSVZDVG9xMlhIQVhpalBnVzBxNThoRkZFUEFVUDNJNy9KejcwM3dZR0ZVU3VzS2VRWnh5TVJOYkc0Y2dDSnBYeWJ2aEtPTHRkcWZtbjQxK0kxa2dUUGt3SjVJRStoKy8xeTJRdFdLdnVua1FmdnpDMy82MU9WeGwxN3N5WVkxRmVCNUZpRDhRREdmWmpEWloya1psWlgvZmVIN2kwL08wNHNmeFVFNDZjRlBrZUwvSU5GV1JiOXlDVlRzOWhWSExiK2k2a0M3ZWxLc3FtaThBOTRrYnQwK3hIVjZxc2k2RzNwL0pJTGl1ZTA4UVBwRVU3dHE4OHNuSVNxZ2tRKzlzY2V6c1VzOHkrd0JScUN4aVZSRHFnd3RsVmlTbFVmcE8zKzZoTDF6ckhlMGgxaUhRZmhnaVlDNE5XNWdWb1NGYURGV0lpS25aMWlxK0s0VHM0Y1pPcnlDMWhMZmMvcGl4d24rc0tkeXpaTFEzWCtjWDN4MmhFdFlBdHZncXhneksvbzdUSVBLSW1rNlA2eHVvRUsvYk50VVQ2ZTdSOXFEOUJWenNQQzhtNlhKSkZOcmkwSnhOVm9vQ2ZjMXRPQmhvVnA5YmRHMzljdGpmYkpQRVNLT200UWlUWmFrYXlzQkFqZ3ExbHBKM1Q3bVJJYnd3bnBuWXhsRVZYdFdTQ3ZqenZmYmRYcXd0SVUxc1FzdG9NaHVFQ0pHRUtKYlN2OUZBZDVqRjV2Y2ZGTHZMd05icnp0WnBqNEEwRE9EUC9NWno4UXgzU0ZSUDk0Z3lSOFV5SU43ZFdYVFV2dEw3b05wNG1hZDdWbFcyZlRJRkpkRkxPM2YrMXR3aDJ6emtxYWlZSGY0UFp5SVdrUFh6UVJIYlptZ09RcXpxa01ReGM4WE5KeVNic2ZDdzhFNzNXMUtvVndPbW1SbGdTTnJlc2VkU3NwMmRHOG80UnphcC9QTHdmRThteDd5azV6YVl2N2k4c2pRWlBFdVB1SWU1NFpxRXdlS2tWNE16dXRGcS93NFlzc256U2gvQjNPL1JOMWlGcWFPc01KMFVYRDFjSjBaYm8rdWFHVXVRcWY0SnhTZTVQdjdzelRvdWFNUlhsR2JoYnR6YWp4ekg2dWJiR2JpbXlZanRJVk5BZzNxNlJ4TS9BQjEvNEpoamt1d2ZPM0xEeW0zZWMxeklCRWlYTTM0bTc3Vm1EYjg1bDRWTkgzdUJ2T1R3MXZFZGRBVjVjelhxOHEzMHh4Qk1DKzdPNnIxWjZPZGtYUVZEWk1JY052Uk5ucENLN01MWHJBQzMwTlpKU0N6V21qaXgza2lEMVcwa2hyTERGd3dwVnNzWmdzZ1dKc1lBYXFOY25MNE16WWUvc1lCczk1NG82ZmlUTmZmTmp4dll4aThVRHBRY1BLd2RQTi8zSFVTZ2J3cXhhajhTMjhsUk5lS0hORGl3c0hqUmFHQ3htai9mSm04RVlhS09Oc3grY3lSbVJIUmhuWE9YT0lJOXRSa3FLRTdTUHAxU3lqY0R4VFlXZzlXVmF3eGFjc0FkWnJVK25NdzY1WjdVcll4VmprT295VzYzdWorbDJ0N1FvWFVCZ1pycjVlM1dFNDNyWjdJRE5FMlcxS1Fya1YvdFB1UWtDVXYwcDhXS1N1VUROQnBWZ1VMa1pTMzhGUkZMdy9vOWpZL3N3OHAxZFZmMkxtNGVqNHlqZ1JjcVY3aGo0NTBBeVpLNGZwMzRQOU43UzREaXBOTncxa2JiK3h2ekVhRGdFc1hGU29MYVdibXJ3RkIvMHpBaXRqejlxZDhYWUxURlVZUG93dGs3cFdhQWsxalRsTG9GSDE5NEhCS25yR2RTK3JNa3licHZVWDcycUwzblI4RWp3a05vK0oyYU1yVUhKNU4zUDZJbTVReFdDdkhISllyZTAwMVIvbFVVQ2FRazdYQmJESGNnQ3VnVTFra08zQUl1Q3RVN3p0NDYwQm5YVGRKNXNUdmhPZUFkN3NxR2crbW1RdnJmYlIySFE1N3V1ZnNiNURPL250YnBLbTJGZGcrMzA4SlFUWWFON1U2Q0FvNzYvWmNwVXRibFdBUlFheDRrRDhIUnVYSTF6NDIxWHgzcHpLQXJIdVNwR3FBYlZnaFd0anRXUUUrYzgyZE5xRFR1MHA5cGNEWGRCMEFPR1dGZHhNYVNncnI5ZDFoTUdUY2dLdnNMZjhidkJDN2lSMEEvbDJ1aXNEYktvR3F6OVQyaHFWMUh4L25JanJhTHZMaE84eWVPRmlvRC8xb3MxSjdNQ1EzVVRJQTVabHZucVZxdEZJRkkweERXNUZnWHZUam10cDl3WnMxbFZoYWljbWFsNWwrUURQZk0ydy95K0FRUUlCQUhjRnpMVVVFenU5Wkl3ZnpMK25tZHEzVWsvQkdNdVd3ckpHQ3F5MGEvRk1abEhDeXlYRFFMSThHd1M2emNIaDBLVU5IaEF3K3Flb1FPOGpFU09kVVNlRzBDQWtrVmtHSVhraWRsT1RyaGNXY2dMZmF5SStGN1V0K0JKdGFwS2xQZUR0RTRFOTVITnpnS0hEK2E1TG5BVXRFMGc0ZDdEdElobTJvKzZac3RmaVRHd2YwUU1CcGQrRFhkT1Y1dUd2MGdzdnBzL0x5Z2dzOUtqdkJFUW1xWFlnRENXd0Z5U1FUaGlxMDNOYmcrYVdIcGxqQTl4aUZnbGlmZENuNEdQQ1VkMXRRb2Qwek1RL0VuWmZQNUcrSVorLzduMUJlYWZac1ZhejNubDh6eTY3aG9ueUxaM0N4dkxpSzE2eXZ1ZzBOUG10ZG1CVFdTVStPUHV5b0d0OWRtcUtlNlF3NVlCaHVVMFJNU2VzKzJpVGFCcXFQcDZlaGdDeHBnUmExY3djcmJwcHhPL0I5MDdCUGkxbW9RaGtwU1c3dEdjbi9XVWl5QkJsQUFHU0FReHBNQkFqUllhM0hzQlptUU16c0VScHZQS2N6dlQwbHB3Mkp2bDZDQ3BvcWRocjl1ekNseXZXSGtmbXp4V1pNNEh0WlVFUWR0bHR5UjV2eXRmaFl4WjFlZGtGSFVJUlV5dElMVUFSd1pDU1ZRaG9lNE0wWGxKSTNNTGljMFY1eE12VDN3RUhnSS9lMFc4VlBGYlduZlg1QVEyOWJ4UXdDVmdUK3VKbjdYWml5MEVPY3M3bFVxTzVTeHZ6alJtV3U3YTdEdklIeGxTNjV5U1dHdGRFaTErR1lRSGJ3bW4rbjNJN1g1NUZpY2R1TlBTMUVBWVB4ODZ6MWZiREh2Z0FlUER1VnRnYWpsWFg2NklnODF2eWRIRkN5UHNjbGh5TCtkb0pJc0JuYTVDNkVhdEp2alF3Z1B5S1E3VzFhZHR3ZjdLSTM2VFFPUUNOMUZKclVGTkNKQTMzc3NnQmVBaWppalR3WVIyTzd2QnBnekZ5OU4zT3RSOU1nTjBSNEk0aVF1QUpDZDVYM1dVTzhOYStyQ0xjWkpBSElNVTg0VUZ1cXlDQXRSNko1Wm1tNk1iTFdDWjQzVzlmS2RxTUF3bk1YMDVodXFiUW5OV0owYU9Obmt2UmJqdEErUytGTllDek5YcXlML0VyODlnYlJ3dy94UU9Jc2hpOE11N0FNUm5VME5hVlRSbCswa1A2NTNUZi9haVY2SlhiZEdqY2pOUU9MQ3R6NVBkblBQZW1zQzBMeGpUNXNKcUJ0SC9kUXoxbEJpYTNVUmxFWlArS3VlS21mWHh2bXp0V2RBOGdtK2ZnSEk2VFBPTURCOS9NMGFNMGg1emdCcDFxRkZ0WllaeVlTWjdMY0M0dWtBd1czZDFJbjZ1TTIzODdBSVp6dHVhNWw1N1hRQ3ZvSnJ1N1V4WFcyYy91VG0ya3lSQTVXRG0zdDBjajFxV05UaHpUWlhxc01KWldFTUtLeUFzUWJaZVJIQ1hWcHpTQjlZQnlTaEhwNU13cUtEZlJjNkRVcFM2T1BYSi9sSWxSZXMwc0FWcloxUWFMOHlmc1RaOFRSQm11R2FDeDFRdXcvenc4cFNuNG9oMG0wdmZoRWdLZm1DdUoxYXpQc0tFN2JoQU9pNFI5ZlBvTmtYamhjQXJSejRTdzcvenhOSVFGSHZUeks2OERDbEdOYmRnTTZRcVlKcmdtN3RNUVFiZHJYNHUxRUYrem5UUGxLQkdDSk5sUDFpOEJNWU5EQ2xhaVVlVFMvQm8vUG40eE9ma29vL3prNTdVNjdzdkJnY0tBb01PVVVKRHp2MndEOUttL1UvbWdPeS9meVhaa3l0OHl2RnREdVdOSHltbnFqa2FZWmh3UTNPUEU4MWVsdjlET3lzZjEvNCswWUJNa0ZZQnExV2VvOHN5MHpNdmpnZmxTWDNIS1JvWGFZRTVQN1duTHB5Nm1BUVRSSkw3MkU4bjVZWE11RTRuRElZRHEwUW40bEpjOTAxUElwK0s5S0Jkd3MrdXIzNW9tZEhHVGpObnZRRHFSUFpIRk5nTjErcGt4SkNrdEhXNTg1c3dwRklqL0dQMUlGUXFMWkJHM1VZYjBvbGErQWRoYXZqNkRxK1BTWmdPWnV2UjE0TEdFcmhsTDJIb2NES0lXUUxkNFprQ3hkYmpxbjU5MlAxdHM4bUtBWThMajE0MDlMU3ArQ2lhendVemxVLzM3OG01andLM09ENXhTazFWWkVSbFNORHE0Y25MLzh5OEx5eTBtSmtYQ2s4WVlOU05wZ0ZDd1dHYVdMOWg5MzVMRXVnb1R3azFWcjhDOVJISDgrcGxYMk9yUmZ4eWFFZSsra0RuZUM0U3I1TTBXUFJYSkdwQW1ucERWTG1VRUt4K29qem16OS9iMjlSMGRoM2hJRHBUU3hpd09sNFFVSHFzWk5Mc001OE45cjQ5VVdZUXRTOHJrTVg0SHJ3a1NTZnVZM084bjVpaFBUbDNRSEdudHpGTjdyQ2RmUkt3aDFXbFJTS0NaMzA1cDMxZUdQbzhkdUZ6V3NFRC9DT0FkK1JrVXQxY3NPK3JsdjdVMU8zTzd6Uk5EUmo0Y2krWG5TSUFFY1p4RVI3aXVzTDhUVDhFQm4rbUo3aTl1WCtad2RqaU94MmFUVUQxTmdxcWNMS0ZYWGI3OVVXZ2lEUUFHWnozZm9mdGFTTWlCdXcvanJtbVYyOXlKdWZOWWI3ZC9sOURxRkJzTjF3eUZaUEVWSlZ1WEo0L3FKSWNkdVo3ajVORGdNbjl1dEo3aFJMQW9DbFJsMU1idDgvUTV0bE1NTDA1T08rR1puaDJ1REN4Q25FQkpLdVdMWjVxSnBwbHo5STZtVHpON0hIQUhWdlZuOHExU1VEVHE1akowQnZsdHFyOHowTjRvVHA4ZGRDSERJZzZwS0R0VFI3ZDl0SHhEMHF1MnBiM3ZDZXZLdG5WL0NoMUV4ZjJteDB5Z2lNZCt0YStHSWw5Y2M2SHBzSk5MczVWUlNBWEd1V0RLbnFjSnA0Z3NFZkk3YUgxbEJoSXRrY2NYYlN4WklNTTVNK3Q4RmV5dUkwbHAyK2pqQkhXVDRWbituT2ZkRVd2K0M4YWRFaUdhdWtoVFJzVi9KNU9uZjdWWFV1L1I4UUxwZkZBYWFhNnpkOHFVNVBkeXFSR3lmaDhVdWI2cUVBWHdxaEFiZkZHdEZsZGdTZ2pZTW1UUDFnL0RrUWVqRitXK3hPVGszT3hXclhzbnE2VkJnRXhkM3l1UHZlcUpsOEVPUDZqMWhwODJuTXBmREw4UExDaEt5OTJEUE4yVUJuTzh6dlRYU3BURGFoRVk2UFZ6M1dmblRPUXA4U1RJdWt2bkZoa1o5Y25QaTRKSXBreHNWT0U3QlZtV0tvbWpHRTUxOXk0RVMzbnJJN3lyTSs3L00vdE9xa3IvZmJSdmRkNmdtaklBREJSYzhjRTMvSmQ2QnR1Y2FnaGtzNE1iQmJDSzBCYWFWanRKdGQyOCtNeGM3bWRIbUV1Tmw2bmZ1L2Z5U20welluTFlXWUMzelI0OG8zNTdiNDhHSWlkU3JpT1dMazJIcUJzRHYyRUJFY3B2SWptRWM5cmhxekxPVE0vd3VIZ2FVWHF1RlVrOTV4eTNVR2NSZlFCL0lDM0hVY0Q5cTYvaDIyUkdtVFlnb0ZjQ1E3R1ZlajhEeUgvQkJJUENPam9WT1NHVHUvSEdoalpBWDBja0xtVXV5UG1LQUJzMHk4OXViL2ZOT1RaTXNpTXhMMlFvbVZPdndkYmhXR0R4N2VmQVFsclArUzNVY1pldWhpRW4vUzBxZ3ZUZGJ1MWRaS3huU0F0cFhiM3U2QmJ0STZQdU1EKy9SQTVvcXNqRWYyRVFFenQ2a1pUOWdyMDJVeWRncTY5MG9rWkkwMG9xd3JxOWNXWERZVjE2TjJRelBiWUlGNWR0RHFWUlgrQ3VEdllRUmZBMVFmRVRaSW8xSkJxSnNHT1RtMjVkcTY4bFB6bXBaQ2lmTmVEb3R1UThQY2kyREtFVkJ6VkdSOE9RNHRjYW1xRVI3bWx4dnR1a0Z5RlVLbFVwNW9LcUlkN2REcUtmSlBHWFNaMXY4RlhuU2FSdCtsajA2WHd0bEl4Q0lldXF3bGE0dHNlWlR0R3pST1haeWpTdTFjMEJoZlNzSnl4UU8va3UxQnNKU1dZays5ZW01SUNsRHRaQ2cvU3VxWWdrTWxpbEhidzY3R2JrOUpJUHhGVDgxdytub2hGbHRTL0R1QnVqQnRNdDFUMCszMy9GRjdReVFJTmZHaGg4OG5LbHRlOTc1N3NTaFYxMklhRWY3Y1FlYWRWOSswTWJHU2VtSlhUczdOVkh1aTJKc3haNlBMVnpQNitJWXZ5T3NmcENZeDE2dU9ra3lvTU5GK2lUL0wwSysrMUs5NEtDdE9KU3lJWTZ6TTQyWWFNOVpDZXhVb0lPNVFXVTA1RTZFU3crYkJpS2prenVkWUdiQlNvNGZSa1VXZWN5QkpjZHo2Tnp6ckNsaWpSZDBtcG1pbUZqOXo2TlBSRUY2UHhqRzllNUdkRW5XYWtDTzVyWUY2RUJtMHR2SDczMk5NU3RLc1JDN3pLV1FCVWNlSHFrRERMUjd5ZjhlbmRQV1A5aFRBSG44Uy9uN1E3UGxrMFY5N0h0YXJUampES2lDR1V5a0gwbWVYK1ZVK0JkVWNkcnlpQ1FXZFh4Z3E5SXZZYW9qaDZpU0Noa0VsUU9hYmwyR2xIMTdCWmIrd2tSYW85T0pkYStEOFA0Zkp5UjluMndTajg1Sk9lelhMem5MYjl6b0t5RGQvTVZJaEhpZHY0amNFaW5tdExNamg3Rm5NeFFNNkRUdmFZdlduaG1reSsyall3R1VCbFIweFBnZWNyUGJHTjM4NkdnSGR3bi9CcE9raFE1MjFwcEordFlVK09QM2UvOVVSdnI2SS9MRHhPbDVscG5MQ0U0MzZFUS9CdTIwY2poSlRpSXNiZnN5VHU4RUdZM3UxQnZlYTFYbTZjanZZTVFOOFpTVG1ONVUxU0ZhbjE4YzIyMkVnblZHNitGVWUySHlBNk1kZ1dnSi9Tb090MHBHTnVpVXBSdXlnWjQ0TGlDVWs5L1FQNVhqU09lbG1Hc1VScGJ1RWZZOXEzWldhelNoZExjVEtIYit3cldKNTl6MGxGMEZ4bmxlVjlEWjJSNWlWNUo3OEpEaDFXWWRCY29lZTVvMTMrbmpjV3JvUnVzQmdqQ1FZMHFIRUJoSnphZkQ3c05OTVU4OTVNbDdlSGQ4djZuN2VnbVhQNVg1UysxN3ZWeGFrTzVET09XdEpXMXpPcC90Nkg3WU1QbWZNUWNOTENUSThKTkwveTNyWnBCZjF2aS90ZW5jVjVOWUZReEZwUXI1c1p0YXloMVU4NkVpSm96Y09pNFk4MFJQL0NjMXZDUjhxOTNuZ2dRWWNBRVBCVytjNnhMa2FySmgyQ2N4N2h4c3E4c09NZ0JYdHREL1hQcis4NUFHeHZZOElzUzlReVNxVDczZExab0F0dlFhYU5TS0hFUEdxL2ZNYXd2RkM3OVVHNVpiUGJaOVhNRnl0bklwS3ptOEdMdVNXNHVNQkh2aHVmSy9LWkpnYW1idVBteGQwa3ExUmxQUXBnUStPTDkvZ3Rad0c4bTk4VEhmamUvcHcrZ1JveCtHU2h0L2RxdFFxMjFybE5kOG10QTlqb3dmWGlXTG5idmV1VHQ4M3RrOElhRzNVNGZrOWRyTGJ0Z0tvVUZseklxb0JQZWpUaWVhdmdFcWdtOHBwaFFISytEYW9rQXNNcTNSSGMzZGFoa0pPSCtlWjZaTHlUMVJlQStta3FUeXBuVE80VWU5VmoyMHBWYlRQOXpVdVhlNTBDa1Z2dWhoYTM5dFcwY2hXbXVFNGZXc3F2NkZoa2R0aG1YU1lxYXFMaHlXNlJwc1E1aGZKUmNGaTFwVXhZcGJ6cVljM3BKbE9SR1F1RTdjZ2hLUzZRdEt3SG5kZlhjNk1yU0Z4anluaXZHTWhtcWswSmNkOWtVZlFvMEErZTBiMnBlN0hOZ252Tm1Ob3Zad3dPVUJkbEJ0bWpvelZHOE9UUTJZWWF5YnRPK242ZlRiUTVUWWxja0hyUmYycnAvb1ZiSEJhbHUxTGdIb1FrMXBMNWhGSWhYaVhnbEJ5NXRPczR1MExHWkhFcFNUUEllUWZPNWI5OHNJNWlHa1VKSEJXbTB1alRBVi9IRE92b1IwdTRXVERvVUx5OFk1WG9yb3ZaQlVaMTVLTnpoa2VjL2R2VllkUFc3Y1ZoNVRmV0N6ZkZvU0ZLNk52SS9aSUZLVHg2bzFTWlc4ZFUwZHFsbmVKTVVMcU5tSkxjVkVQTjBPL3AzMmhKV1E1TVFqaVFTalJZN1lLRytYdFFRNzNHMmF4ZmxmZWpZdFhGMFh4L2d2YjVpRnRIdmdpczRUQXBEQkdmM2ZzdDQ2TURiRUVYYUR6VnNOenFGaDVZZExsdXpUVk85U2Q1S0s1VU1vYm9ubi9uL2VPVzI2Tnc5VUJJVGR4TkE5NDF1Y21vYXhwb1QxRkhpOE9IODBpK2gwS2tSNFVqSTZpdjlvR0xNMTIzaVIwNW8xb2JhSXlVU3g5K3R5OVpWbm5jdVdmWWgrc2gyU25NeGZWaEVJZEd5OXo2b0FYSlBLOFlHVS9UU3BEb2dtSk9mZi9QSnFJQWtwNmlqZC9Xc2NnRW9vZXNPbmFMOVZXUUxOZklJN1Y5L1BLSG1GMXdwN0RRMGJFSk1qaVRGZ1lBZy9QZUNNQWxwZlVNeGZzRFNQdkYxRk9tZjkwTnRvczBlcmRVTWdnMHUwV2dVK1NvUkM3Q2dIcE5iRVluM2hqWE1SQmJMVXJ0d1huQzBOQk9CdncxQzdmSCtVV1NGT0oyamNhUGVHVEFJeE96WFFjcDFuNTFsT1JuTTlLUm9hbm5hWUpFcXFnYmtBdGNZdUZCbTd4OWZRL3VycHJMbHZ2b0Q2Q01ES2toVkN3TlRRbTNFdXdaY2RGV2ZXQ0o2djQ1RUVaTWZ5MFpUTHpxcVU5cUc3TnBLM1JPbGtmRUVxOG1wYWh5S0VLdVBrUEJTaExsMndac0d2WklHYWU5ampneFZZdnU4SUt1bWo0N29kRWNVUFpJeldTa2V6UWF4b2huSGNoWVpCczNpQlRXOWZQZE1wTHQxSmhzOFVpbkRzWjRqL1BIVUdGZE9NejJMaGExdENqRG9QTzV6b3htR3dIbVZiaTdnWCt0Q3hJYU5CU0xBelNpNHpPVXlTeE9lY09qc1pUT1pSM3RvU1FQZ1A5WUpsT2xiWlZCc0NFaEJJb1QzR1J2OGh3bHNYbDVqWG0xQmlIK3IvTDZwcFNTOElMeFZVTEdFU3lGKzVEQ2tvdmhld3N0cjQ3dDRQR25BS0tRVTJMK25DbTQ4cUdybGhaVXdJcmNXUWZsemZkREZaamhZclFBVzJiWmc0WWhoQ3hnUjBNY2d2a2dqQU5ZTjZQWjdNdnVRRm5aNElZWm5IZkF4Y09CODFCUmJoUDhaTVZibXA1QkE5NUx6enRwWTlMTjFUTkNGV2pFK1lUU1hhV25UU0pjUHorZm1wUGVGU004VFNUQ3lYRzl2dDl5K0l4eUVjUW9QWmpnZFpOY0hKN05RY3o4UmE1SWgvV1NhblhKYTZxOXYxRkwyVVJIRXZwUVJvVElwQlNPelMwSzRwTlNUaFg0THU1SzJXZjVJcUtjSkEyRGkzVnNVdmVwK0M0VWxsckFpZlZHOXdSUWZ6STg1aTZyYnBQbFQ0M0lIZFFiWFNJcmZvQ0JBenkrL0w1Y1JSa2ZDTWpRWW9NSnZBbU1TK0tMNzJTdDl1LzNZZWdDZUZnOWpPVFJHeDN6ODFGcUxhTWlqSHVOeWxwaUN0aWZNaXFHcm8vQUdQWFhueU9NRnZqSkFCTHRTK01sUkJtRWtISUtUeEV0Q0RPL2MvTDBRbmNxOGtlMzlCUXlBeU5XSUpzbW14cGliaURXL0dKOHdRQndIRTN3UTZVVkcvY2VXVUNELzVoWEcyMHN4SW5oN2pzK3d1K2xwMW5VekM5bm0raTVCMVNhdzg3TDAyUTM5c09iRE80dHlKVTlNTHQ4U2tDU3RQMGNZVmtIT1JaSUxOWW1GWVlNcFdxUEFETVg0WTRHODlFdFN2VW9mN0ZmOEVxUExYMThHYlNpVmJiUmhGQkZPMWNTWGxYSk82c0NyVHppYndCRG1OK05YQ1VDVFp0bE9XYmpmcUQ2SmNnM0M4aXhHTjluR3prcDAzbHhuWGI4anFtcVRTYTJRMnYvbkkzNE1JWkhsVmhyaEcrNmd1QVNZN0twZTJPMGdGVzhZNzVTVFB1OE12Y1RNM2xBSHV0WVFMdG5vN2FyOFlNZFJHeTVzd1l2cklHNmtxbjBudmdEdmM4QkFXclVaTzVOOTYwQlMxUFBmeUprZHRxUDNiemNyOUpNaUpoYk1Uc25OYUZZUXluQk5mNDNhMlRwTjh1bVdEaVZwbU1TdzhXRkl6NHBFTXJSbFhaTEFPU3ZldzBQemd0STJjVDV6dFA4NUViUFNvOUF1cGZyUUF6REFLVWJhWUNlTEQ4aG4yWWhQcGJXaXE2ZTBuR2pheVl0SDRROUNkNUZRY2oyRXRRcUxEMU5HTDZtN0tnS2hJOHNMZjU3T1QxQkV0c3gyK0NLMmlZY3FyNkJXYUVNMTkzTWE5V3JrNS9JUkhORExFK0E4MDJqTE8wQUZMUmVBU1ZZV0d5aytuYldoSlEvRFJpdWtUWXFCdllZdzEzUWxuOWtYUVgyczBxWllwU09xTm1ZNy9WaVRPbnluRXZ4NFhLYkMxbTllQk5GejliamdtSTVyNlhac3hoWHFxSk1JTzhhUEJNNzd2MERUVUFyQzBjalVINnBIc29kczlENlhFZ203OW9VY1ZPbEdMclppR3pRbXhEcUQzeTVMVW9Ec1NyOFlxV2V3ZmZpOWxFVDZsWDBhSFRWRGZXbjNnSThLeUJWRW5TU0x3SHQ2WWp5Z0twM3F4blBmNGZjb2hoR1dBL0FPcFJudEJidWJhcWxodjJ5SE5QdEE3OUdlR05INHBKYmtxc1VFeWdhdTd3Yk93UjBPTFV4TlZiZmdYOXVDV2xVa0EvY1ZQcmxVOHR0TTBzaDBuVFFvMENaR2FwcDZXQlErcjh4d1N3VkdHVTRXQVJoSE5pZWg5K25WUjNWL0tKS2lsQ3p0aGUrd0dzNjR5dDMxS3ZTK0pyd2JBbEt0VVM4WG94M09jeVJUZGI2MXM3a0ppYjJZVzI5MEJUelk5cCtxQmZFUk1iU2drT2JHS3BkTUduUmVmMWsrMCswNENpcVgrbGNIZlYvZEU2a09EUXZGL1JyQXpnVzVPUWJmTTB1WDZFdUc3YzFvT2M1UDJFMlUyOTJvN1cwb3FQTUpjTWE2S296cFdDZWxjVE9NM0dnVkF1NDNpVGpOS1RTNkRtOHdIbGJwdjRNY1gvckJsdFltVVprNlhNanRnYWpRQXcvMWgrZjRYazYwQ2N5c29ZaW5ZQ3M0c0xjT1p0VlFwRUY1RWdHeXVvZk8rN2locmR3YWVDR2FjTmpid2NNQzAyTm5lVDhNOW05cVd0WWhjKzNReEY1RThGbm8zcGJ5WHg5UmF0MmZ5eFpWaWM2aTZEczdXVGFIYnZ2VWZ0bW5oR0lIam1IUnRMYk9wYlo2TDM1cVlucU9STGhFbEg5Rk5JL1VOcVZqeUJsNWltSmQ0WXpvcW5PNzFkaGQvaWJKRy8wQTBRK3cyNTVyNitXeW1rVDByb3ZkeVhvTTF3ckRnVVR4NVZYSGVGK3MvcjNiY29SK3k5d3pOOUxQZ3VCa2dvV3d5S2FXcXJaVit1MVNLcEliVDFoWkRlcEU0SmZrbWFrMHBYVVhURnpwWjRZYzh0VGFXMlhVcXZraFFzQktYYTBBZmlJTHlCQ0c0ZGo2ZHNOdEw0RmtxQy9YZ3pBNTRESlFhelNlNE9UTnpCNGhJWVhwcS9KMVJsSjFmSW1yY3JLMWNUMWR6azFldVVoOU80ZVFEU1BIZWtzRkpkRGYzRUpDeEpzSmZIYUdOMWZTU2VOcEpvQlFra05GODVBRUs5WlJaWDFqUVBOeENyWFgyZW41aklhVlRpekY3bEJwSk1oQUVvTHZRbllnNXNPdFVtbzVUZm1wTkdXaUFDdmFwWmJ2c1ZDaWFWWTlWaWM4OGpPMzd1c1dCeTRaRnRwQzVrWnlac2l5QWxkRi9QL0J2bWtMdmRITWZHYksxMHpHZ2Fna2lJUWxlQ0lvVXhDYm9tbGZkU3ZTMERCRU81N0NvcVlhc3Bzam5xT0tFbmNOc2VjdzRtRU92WkpJOU5VbitRblVJVWxGcUFBNml1UlVxSEc1eEpZdlF6M3liT0w1eGxRTFdBYU9hV0N1YjE2TVRDUlBhOW5KcGxtbnhiVmxEMGpRMGozSFc2dmFGQ3Y4RmhaOERKd3E4MTZFckJ4THBaVDZIZ25PSWl5ZTlwU3NsbmpZbXdhdVlVdDlrNGRMZ1ZLSjhqRE8vSGMxcE1lMW1ocFZMeUNPZ2FwZ01oRzN1ZkcveXZoM0RYbVkzWU5sK3VmUHNmZkdXUVB5a0d4alNNcGJXaGQ0dXh4d095RWcvOE53bzVwMzlZWjUva3lXV0NPNFJ0Z21IdVg4bGlaRjcvR2FJK0VqWW9OOEpjRjJYSjI5Ym9nem52ZDU5aERpRmx5OHhJZUFEVG5DTkdkajBydUxKcGVuQ1d5R0hwY0E3SEhET0dHUFZ1bXVQSEEyVzg2VHhVYWtmdWtDYmxiUUpzUjl0OFduZzBmK0ExTzc1VWp4TitGSjZ3K1FndEdBd05zK3NhVzdKemNwdit2ckhSY3NYRUVHUDZkMEoyZ1FhS0g2T2hEcGU3QVF6bHJUUkxMWTZ2eEs4S0FXR21EL0VDNktYd3Jod0M5Szg5am9pZVJkTFduN2xaTUcxbm5oQTNtWWMveEt0eThqdytzdk1sMTFNdkdQaFd6T0lldEFuanV2aE00OTlOKzZxcWIyUUJBVWtUbjluZ1loUVE4cjhtS3dya0VBb3l5eXk4N1VYcHpKalZJUFVkelhkM0lUQ1BKOXU4c1RWajgvcDNhQXlNaEVXL3lsU1c5R2tOREdMc1JPQ2lOT3FvUjUwaEVncWtpbTl4Y3V5ZmNDRUpMak1mRkV1QkJCcGs3bW1IRXVHbW9mWXBaOFdSRVRNNXkvOWRsM1VTdjdKWDVYNWdXLzNJTmkrYmRReW1jWWtNVkN1SGU3QzBUeU0wdTVPcmRFeC8zQjF4cHEzVXk1NTBoVGJsMHl3cnI5RmVDTllTUnlMemZxR2pBNUpmQmh3dENTMnpOWnltS2ZURHpQcktPRk5aREJTVXo0bWpYNlVIWE5Weit4UitKMEw2Q1hnVFpTYjBwcUNDL2RXd2IwUVIrSU4rSUJOV0I1TjBML3JLZzZTU3JJR21zalI3TEozU3N1cmsvUFlDSmo2U0ZjZ0RmYm1hRW1Ld2tITE9wRU5VQ2x3aVpNSzdsUXZYWTdsNmpnNWFNNVhoR0FwWWZ0ZWFkUHhVMW50cmtpQmdTS1ZaTUJqTjArdWpVUisvWVZ0YTlsUWdINktPMm9YaUREb241THhjNHIyMGZTWk1wVmExekJETlJpNTFmZm5GTEhidXBWLy94Y0hUZjlrRHhLd2o3VUM0OXRPUFdHSlB4NEtsRGdNdFduSGpsWm95L1JMVGVNWXp5L0IySnJUWDBOb1pTZDJoenFGQVlzZzFRV1dDcERoQVo0UXhXS1JxdUdLRVdlby9NUGduQnA3UmxIVm1ZOXBiU2dkNlBTR3o5Vml1dkc2K3dSYTVDUllCWEdBVWoxVHAyOHBrSTl1QXhmZmszTVVUYkx4TW9TSk4xeUI1dFZuUkZwVzd2TVU4OUFTTFU1SWJVaVVjczhNOE1sOGVaTG5QdE1qSTRSWW1ZWmlYN1duN0hmWGN6aDF1RnNrbTdZTmpjOFExcGRMTGtoSThjSVpzUnZTVUtEeFVvMHhieDdoOXBMRlVvSkFqY3dsQllpNFBxNmVYb2ZTOE5sS21LbkNqNk0wbktVaElBTks5MUVoUWdJNUppRVhtcUl4aDdvaENjWEIveGp1OTZESEdrV3JiRHd1US9WeG80L3hZb0JoVjc0U1ZaMUFhblZFTEJIYkc3ZEZoNDBGSGJ4Ym9BUS9wYU5sb0tSWHcydUVhQWhKYktFWlVNSzR0b240a2ZkMWpWTVlHYklEc0ZtS1ZhQ2VwM3IzZUlXdXhiMG1ncHJtUVZNT1c4WE51eUE4Qk5pbEhKTGNjTnZDcmtocGVSU2t1dDA1NWlIcmhUSkV3RXMxbndtRG84K054MG9FK21UQlBHaVJuUlJiazhqNHZJQTNUWGs0cXJ6QTg3M3BoMHR3bk5UUU5ha1k1bWhFVkVuSEdiT3FtZm9qRm9JSEZNdHA4eUxROE5US2N5MDNWRU42c1h5aFh1TTlsTExMSTNreklJRmpmU2N2UW5TeldqOS9yZFB4ZnY2Z3ptblFTalJJNCtxYnBieE53c1lSMFFTRFFZc3liMUp1ZUt5MEFEQVBkRG5MWWQxbzFWcDBrVGFGWFFBZ1RYd0YxMnlhdjBwRjNBTmQ0YVFCL21KNE9FWWdMQ1ZiZC9EM1paT285U050TkNBa3gydzFWTWJCL09PbllzRmJsWnlBNUtqZ3I0eUtITVhaS1VmOGttZjNBK1l4NGxERDh0OWxnYmh4bUFWZ2xvbFFkTzFPWldqTEJWYko3alRIVFVpY2hFYTc1SHlhWXRjNDJqQlZiWTNwSW41akxPMTBEWGoyUUJwRWJkK1dDVjNGVmtuTFVpSUVMZVFGV1hoQWJNMHVUL2srZGt6bS93REkra05xVlZPVDAyd3dUT0lURnhLTWNUMDA2em5WOEdlTTViNndaQnVwcldXQm9yQ0gwRU96eEdYN0dRczc4NDNJRm0ySjJ6amZOZVZoNkhKVk5vZmM5TTdCeTRMUXBncVdSUE92d2h5dkNob21lSmZYNU5PdURqVkJjVWRTQ3AzMFJVVU1oTjZUeTVWRmloYkEzU1V1ZzBmVDVkNnM2TVdLMjZyMVVYeHl0T0tUV2oxNDdxeU0yOVNmT21HNEtDWHlVdWdFMU5Hd0tJNEtib09mRVJHTm5TUnkyNDVEdS84Y2xTVTBvbG1vMjFhT3NLWjg3L1kvK2MxUDR4bnQ5TWVQSUpIZUFkTU1PblhkNnNST1FXZmpyZE9NaXRPVzdMdkxjK1hYNXA5VDVYQm9DQ1o5Zlp5aFZUcHUrbmZaakpNbHlrY0Nid2N6N1g3ZklpL2l3K044SVl6TjJvUXFvdFdXek5mWGNaclZYV0paRTlXT2Nqc0t2YW9ReFg1cDdZY0t4dGpVVDVXdnJ1K0pkenJYbVBYZWppcDhTd2svVDVnS0RkSDBNMlJ1YnZ5MHZDWFFLLzQ5WDI4US9KTHZobGwrQURzUFNzUWVXMHVXamNHUXFzZXd5TXBZbnVKQ2lsSkFtL2NySGN1c1JKa3Urak1DU3dxeUJHQk9aL1BBQmk4R0FlbEVUK1VpMG4vaXc0aTF2WWFrNzR5SDc1eVVGUWNXci85MGFVK0tiMWZyY3o4Z1pjRjFlUkhwaWRkdlAwTDlkNVowc25BVVdMZHcyckRqT2VEMHM4MGxrN1h6Rm5WeG42UEh1Y0lwcWphQTdSa2h3cXFMUTVYajRaWUxHYzRLWGZEU2w5WVdRRHZOb0pXWHcxS2VNUlZsbHJ5dWJSbUdqcHVHSm5ncU0zdGYvVHluczdoUVpkSkIwMlZmNUJibTRqMHVzUHVSZVp2azFwNDJsSGVHQ1RJUmxVWnBEV08xanBEb2lRRWtteDkxT2VXNCt4M2t5VjcweTVhTTE1Wmp1RS9FbmRyVnZnZmtML3cvbVBlU2JVQ3B0UnpuQWhRdFVVRWtYaG8xMjNNbmNyalA2OEk1aXF6STFqQkNmNWZjZ1diUVpISktKZnQ1Q01DQlpCbFNFZDc1SVl4bktGRG9HWW92a2tLZFlHQ0Jlc3VmNkQ5NlhJRXd2cTFlR3BjMVRWRTAvaWp4UDdTZUlWemhTSUdVcXUrbWFkb0pJd0FKMmFydEQzR2FEN0Y4aGY5YzVxOFljWVpER3g5aXBGMnJTRXE2WTltbVdYRlRsRm14cVAyT0xmbk5odkdjQVlJUDk5WTlwVVRjeUp5cTRvdU91akVtS2hZWHQ2SnE0WlFRRk9meWU4YWlTUUhIMDJPMkRJanVzQ2RTRG1uM1JWUVVFNndPeDJRaFdSK25ycW45d2NRUm1seXM2YUtBKy85cFQxU2l0QlRXVkROUmNRdEkxM1ZQUmNvZVYySWVYWFhSZkVmTjdFay9HT0VYblAyMVV3MjNNWEQ5ZmkyVDVydXl0UnloNGVRc1V4T051MVc0dkVydnJ0ckRZQXREVzhpRmxOMGxVZllTdU51dmk3RktscGVOR2tlTTBpOFprQTRITnhUVGlZRHFPTEFhaGhMYTh1MVk5STEyUCtmNjBYWWhpaVZBcFJwNDMvOWpRN0FlcWNBd1lHY0x5cFBMcGYyOXE2SjR1REVEOHI3V2JvTkgxOGtkVGZiemtDa3loK1I0U3VrajRvb3k2eUdLN0Ztckg3NXNzQlI4STNzeDFkZUpXUnQvT25jSmFmOHBpK3lBZXVFdXQwVUN6VXk2YWZQM2pmemUzbUJDMDIzdDA1NFI2NG54S1ZYTXVLd01UUTNld2RXUGdtRU9SWHFmRVNVWFZwcnJFK0pMOWZQdStSMlBFamtBL2ZEbDRSOGI2enpZc3h3ZU5nQThmd3JEaS80YTNCQis2UnFCWkFYM0MzMXJYWnQ2cExESjROODI1bkg3dUI2VUJQZHQ0TzhwbEhYanorN1liR2tJSHBaUjRRZi9FR3ZMVVBjVHR5TDYyUnJwdkRaTEpsZmllWXJMM25pTFZTOTFUWCs2bHZ0VHlaR2ZJN0gzaGtCNlBzaldNeEZhcGk2NXFxYzJMVW5DemN2WFJCOXhjZTV0em5qZGRhM0hXTHA4bEFyblpucWl3bUp4Y0VXSytqd3Ywc2VLcWRCWXpvZVcvYmMzOW9LQkwydXB3MTYveTNEUjRZak5Td2s5MkRQU1Yxcmo1Y0RMcjRRb1dlNG1OVXRIbW5WdXFwOC9JcE52RjVYbk5DSGFFZndHOEE3OXJnMlJNdnhpYXRzMDJ5Vi90S21hTEVIclhMcFc4WnFTUGU3S0tNQ01OUmFHSmVqS0lERG5jOWFkNWlmRDc2N0czTWRXQVBCVzhxb2lPd2d0NVRiUlVLQnhmMUhVcTFtekdLc0V1Mk1NNGV3WmI4MzZvRU5yaHozRnlRWEJvYzJxc0tveDhERDBweFdVZHh0RHk5QVV3dE1ETDBSWDRtdnVDVlMvV2NUQmJ6Y3Fxd1orMjlWV3ZmaGRvVXFXWUpSSVNGQ3RJSG9aV0RKczFrYTV5dnZBVUJiRE4wdVVySkdUdmlvVkJxbjFVWkxDSFBKa1l0RkxQVklIU1lxcDQ4OGo5RC9JU1pDUzRRM241VXpaYXk2S3NKNjIvZ3I1WDhIcHcwSkFYd3lsclZkVGVvM0ZQUmd0eWtnWlpucGIyNGlMSkRndkxhQ1BMYXhXdXBPeHVqT0htNnhQSlhiL1hvazRqeWZtL05aekErRXJwK3FXVjlFRmdkSWdOVFp1S0NqVUd6UGc1Q0pmVmtvbDZjSkRoU200QUhidlVkVmtkRmcxVm5WNUJ3TlRmY1NhZEJxZVBMZlVUcXRoOEpRRmtoWTZ5VDh0ekZoTU12eUJWRndsYmlXQTJ5V21mTjlCanhYTHBTRmQ4Szg2THdUR1Eyd3JUUW1jUDRzRGZncHM5ZHNRUXh5ekpPWVk3UmV0SW5VZjExM3NkcktpZlBMY2xSRGZvY3RKUVpPMGZBWm1JME5tVm1SQjJYT0ZKU1pFQzhETC9GbXR6SHhXdis1dWpIcDBlVlovbGpGZHBobkxEOWpDWUFzVjZINWQyeVhVd2hsNkE5QzhhRWZGaDJmTC9kKzEwQ2RCWUNBSVNTZlloc0FrdU5GaHJwZ3p2cktFK0ZDVlRyVldSVGR2akdoeGd5RnhuUllNbnc0S2pPUGJUTlhJQmZ5aGNoWFRVR0xqc0dtY1QyY3dVSHdjVGNyVkR2WElLeG5oRFVSUHU4S2cveXE1d2x4ZHBjODVBR2tRWHJqazREZHozYlpkZG1DY2NNckJvUm83c3ZybmpiS0h2UnNLM2REVDhtSTNDTEJsL3h2YzFWcU5BTFBhbEVNN2htWmJIRXdMUDNGMXpKbUh3WkpYdXdWKzdxdXNzSGkxcUxHNXZ4VGgwQ3R5ZEh1aU1HaThIcldOK05hWWplM0ZaVDhZUjFuQ0pXL1BQMkgwTGt2THZvZjdqeU1kUllxUFNOQmp1WG5GZkRvZWJlRFFlL2NkckdiY1ZXZHFFd20rQ3Z0NzUvME53eTRSMDhYZnhFUkNpMS80ckUrZExnZkgzM0lvOFlIQjVKMXJXVlhmdkV3TFhzUXJCMm5NTGllYkc1Kzd1Y3VyZkZoR1UrSGpOUW10UmF1ejZXYTMzbGptRVQ3aW01VXJFeGxtVkxuNUZJdE9TNmttcGJiZDBZN3hWUXFqNnhkRFNYN2dEVjkxMEV1cXY0Z1Z4L1k0cDNZY0lJTjFIdkNmbTJYY3hMeGVLTnZ0NDVBc0tWRjZSTFdIT3lnNyttbVVzalVtZUlweHFySGdOcG9QblZ2bGFIcHlWU2k4VGR2M1Y2KzQ1SmZjanJUanFDUC9DcnJBMXdkMXdBNVhFYlc5cElRVGt3SjJQMWlSdHJYTlFyMG5hUHZhM20yZTlNdGpXOHpmdHllMkUrbWRxOTV1VU1QOHJreGQ4SkNlRVVzVjRCak5mVFcwaFRrRG01OE5RV3duUm41U0lTcEErOGZMK2JWcWNYWm8yaEhQbEdPREpGQ2dYZGhFUXJRL0pZTkI2MS84NFdTYWo5djIyYjJXTzBvK1pwMU51eWpHbUZoUklxTzJteXJFdUdLUGZJOVpYRDJ5SVc1Q283WWVYYXZycnFaTXRvaERSMjNLME1QWFNLaGZaNnFMY1FqM25yUm15VUt2aWZIcTFWdSs0RnI1TllYTXdHMjhQc3ZVMEpyamxMNE11ZmQ2MUpQQXVEOU9WQjBza3lzSGpHeE1sZ0pmaUtPcjdBYWNEOVc1a1NrU0g1cGZJcjYvTVNXb2V0MFY1b0FGNG4yWjdrMWlHU3ZsalBKTHJPV2FiVWx5ckJKZmhkSXNtNmFUUlA3dWE1eEpKS1NScWdUSTQzaE9yN1BmanY0dElpWUU3VTlxSVA3bzNhK25KaEZyOHhEUXpkeSt0OVg1Z3J1MkdGYldnb0Y5Qk0zZG5hRTdQSFhjVVBwTGNpZU9NVStvT21GbExubHZ6Vzd2Q2Z5NTlvYVRCcTJMN2w2Y29RT29mUXA3ZCs2L1JYWmowUXpDaUFhb1ZlVnV6NUdVdWUzaG52U1Bhblozd2NhUVJCejdSdjJJMVRMVjRKeWVoWHlWSEZoMFM5YVF5My9XUHpFblp4dm1mM1BqNm9uTHJuRDVuL3lmdGpCZ24raXJBSVQxY1o1MTdweXFaRzVrNUpXMzMwaXJpMzlGYUN5TGdMZ2FBanVacGdsYU9CN0wvUitoN3pyWWt6OUZRSVRzRXY4d0s5TkswMm9IZlpiRTF1cmxwbEl3VSs3QmkrRkRaMmVnbWp3anNNZ05VQUlQVU9xeTFISGozTkovWWVybldDd3lkVGJjWFFQdWtBWTFMaXhUV3BaNmNzdVBMajR2ajNHU2p5c3VLNHQxRUlvQ3NjRUE5bjlzYkp6UXhlcSttR0tyT05LQ3UzcE9Ta2VUK2l4TTd2bUxjR0JaQTYyZVd0T0xRWVNpa3lpcVJKcXVJK3RrWEc3eHdPbVJIN0FzQzF3ZW00K3B6anFGaDd4bzZpK0hiWDlDN0xWa0kvQmJNby93M2ZnamtVbmJIaWVjOW9MNk9lSHVEbHhaQ1ZPTVpOYzdBOG1SeFVnLytjWGpMdkVzeTBtVEpmNnczeEhFUlRVL0EvdnN3a3ZCTlIyQ29XK09Va3h3eUtRZUV3RzFhMkRjWXVnU0VRck5hUFRMSjZSMmF3b1NBNkZmTjh3OTcwQVVBMTZxOGZkemVqaWZqYXlqeWx4TjFHTWZvcUNvVzBvK0tEaXpZRStnVUF4a2dEWVNvaktreThneUtUNVF2ZzlsYjNtS3I2V1p2b1ZhSTNxY1NlamhXWjAyVXF3UlJKNGVNZXY1KzR2dk9VQ1Bqb3NTM1pRTE50VW9EWjlrd2xuODJDMkdqTjJwSS8xblcwSXcrd2pLbytvUnRRSFFiZlhmTExCQURLcUFnbXZUL3ZRN1FtZmFLYWpyL3ppZ3NXV0NWSE1WS3kxMVcrVkdyNlUzM3IwNFBGSktaUVJxMUhjUW8yZk9uTndNdks4eW5kSVJBTFdyMDFPa0p6Y05ic1lVamlvcjlUbzAyV2d0aktKQWxsQzk3UHRaN0ZleTFoS0l4MnZNZmJ1ZU1zTDQ3N0NaVzVzSzFVUlc5a1J0VjEwL1FNTzY3SEJQWDJ6bXJxcEVjc1o1eGE4SE9WcXprblFYSlJ5ZHFMNXIycmYrS00raGlldVNCeHVObW9OZE5ocWV4TStOK25xOE9PL3pQVWFPd1RaNURXNDhyY2s2M1pEQkNUZ0dtcUJDSGsvelZKYVl2YVp1Ukd0czU0U0ZlU2Q5cEppRCtCQXUyVUpYOURESFlUTXBsTkxuVmQzVXZvU2JBN0xLVWRPUVU1OGV5WVF1N0ZsNkJwK1dkV0VvNUtjU2RNQU14Y24xbi9MUTdPc2lEdjRUZzU5OEdmVGx1Z3JtRUdsQVRoTEpteEFlcVFQVnl5ajVRVE12L1JkWXc4RWJTTW83WXhUYkYwamI5WEg1S2FZclVUNkNodFQ2dytpSG02dDNnS2NGQXM3czRIYmhVQXZjb3lxWk5jRGpDWDNsRmFHc3ZGeFFZY3N0eEFhaldLNjlzTzFIYXNRYnNXV3NMTmxWUEM2S0tUM2k5bU00T1ZRNVpwWFQ3SWdnSTlGakZwbENoNHZNUzJMUmcxV24vRFRsMFBIUVExeXFxSTZkSWVmR2x0TGhoeGVFRnFlM1RFV3FZSW9wdWJTVUdnMXZxOVljWngvSDBmMUE0aTZjcXBJUmZTYWxBSzE4bE1VQ2pickR2aC9lWFFVZ0hoa2dOZTc5SjA4c0lkTENsSElkOFhQalpEL1ZkcXdlRVByZDhvcWc3dGtkZElROVBMN3pMNlVKOUlIRDU4NHZHY2ZDWU1HSHZPekp1MW01NWYweDFCL01FVHFDdnNIQnMvTy9rRXhPQVgzRHBMMGhYQm80YW8yQVNuNURtbXlSQ3VWR01QUEFjZEx0SldwdTc5MkVlTjJqcTZPSlB5K0g1MVFKZjgxd0REcjBQQ1BTeG5sam5qNld5NTVNUGR3MWdLc1E1S0VUZXI4NzBzV0htY1BwSUVmYUJlNUgrdzhrbGZTUVFwYmZjRFVObDI0c295bmRZaVpZRUMwK1hTVmJvNExoK0FCelpzSGVSNXpuN3FRM2pEZlpGQkJxTjNwTDMreFlPV3AxZEN5QkgyUEh0MXNBMzZWSnVvTC9oa1lLRm5qaG5UdjBlY2lyK3hrK2pTelg2REtLVmNxT01ZN1VrZ3Y0NjVmNWcvT0RlOFlkT1djaW5qUVBJMkJMRk1DblJQNWxpVGRvUGxZODlueUh0Vi8wQnhjZS9OWEJ6dVB6M2UyRUs1TDJmNHh4a2ZsSmticzdjTHMzS2xicy9MbGRGYkxQeWVnM2NmRE01eWhKSHA5c052VVIxWVRaUjJLaFJFV042MElQdEQ0a3Jid3B1QXVTYkxwZlpJdEZmK25ndGRrNzRhR0F1Z2Z4eU9uK0dubWF1bXZnTCtNYXZCSXBmYllHUUJuTnlGV3lUV1E4dFU2ektTZ1F6cTViUDN3bXFvMmFkendabUxiMEFtSEMySHpycmwrZGFEbDFsNTlCSE5iSUNRRm8rQmVVQ1ZrYllOcTg0Y3diZGZUdktPTCs5YU4yMW5qYUUyekY4YXlqb0ZRVkd5YXh2RmJ1dUdRUXJnUGI0bUZPZGVsUjdON3FIQmRnUjV1MTJ1eHJ6TDJrUTdJdU1tT0pjL2U4Y29kdXoyWmJzMTBTQXVLSC9ad3pRdGR2eitvYkJ4b0tmbDgrTGtHcFJscmczL2tFTkpKcXZIMnF1eFo1TGtDMnE2aDBqZ2R5RE1NMktxQVV2dnQ0ZE45a09sTVFvRUdPV3d4MG1JOWtOL21mRCtwY0JORTJWUGM3ejI1Y2dMMGl1OENhUldTMkQycmppWm10eGlhc0d0bC9HbnQxK0cvNlNvcFhSRWExL0FUbVRVTVVGTEI0TGhKMTl5bFRJZFhCaHhacFdFVjdqVHRMSEk3Q003K0VUTUc0cXc1NUZOSlJuWHVyZzJOeFlWTDFteFVBUkpCMnpobHl4UWg2Q1RLZU9wdVkxWkVVUjFSKzl3TWRFWFowZjk1UU9QOXZkZDVkb1JFa3NKODJNTUdaSTFRWnNjRjhCSFBqYkFGVmRQcDhQZmFjRUM4aTYrcUZDa2dVS1pNWTJRenpvbU11MnlzVFJENmhmUXFTNzBtWDd1Z1BBUnNIRjc2UVczR0kveDhnUGcycFQvVk9UN1hXbjZEdlpMS21qK2k1OW0wam4wUjRBcGluTlp6ZEMzRnhvME9lTWJXNE1kRXdLY1pqYVRUaEVuOTFyRmpZVllnUk1OV3JUQ0dLTkNyWWkxNEZvcDJBbU55Wk1xT3lqM2ZnMGZEdStEa3B4STl4Q3BPdjlmUnRaUFRCeEN2WEJkZnp5S0wxY3IrOEc0eGNtOW9tYitBSnRLeDFXaXZacnVTNERWdU8rb0ZVaE1Xbklxank0RlhyNTJnV2ZIMFNWVytoK2JHNW5FQkJxRFc0V0tTVWVFWVladmtEb1FJM0I2ZEplYWlqampEUlBROWIxNzBTSGlYVzMwa1pLN0dja1JTa0h5KzB3WHpudkN5QmF1TFNzVzNOTGk5UnJYMUtoUFVLVXBuSEUxelBCbmNiNDJzN016VUxiZlpSMmtOSFRMM0R3cTNWT3J4andWUStsNnYzOHVjR2tOT09UNjZYaFdhNHFrblBoUnFNc1k2M1dNanJYMG9xOVdKV0Z5NVNlRk8yOWU0RjVsMkc4amkzVkwvak8vOWpXNEQ3QmtTK2tTa0p5RWRkaE9wZm1hNXpiZGtUSTlYZTRkYTRucGQvSlZQZXVPZTlsSHpjdnVFZFQ1cU5ISTZabmZSbURYK1MvbWFWV3BaYW5OR2lrRC9Wb0Z6dW1xRFJZcXhRMXRMYWxLVHZoa25vT1U0d1RLOThQNXc4bUZGOXNJekVTMjBMR2NuWVFSSDJsY0picHpISGtZeVRFUFo2dlFqTXloeUg0TmVhQU9Sem9kSkV5QkdNS0VUWnhXemFZYlR4TW9GSElCQ25sa3N5RmtnYmZJNjB0anRuZXRHc3NKQWlDRUFYL1pwd1ZGOFFnZjZNMzRjSHdLYTRFWUd4ZCtJazdRbWtRdXkxd3VkRXMyMW81QXBveGRwbVJVQ253RFl1OHBOaWZBMExvV0o5ek1FWVRzU0JBdDQzWVFtOGRPVkNzazc3cEFSN2pCeVZiVmFvS3NRZnlpbHIyS2hIRFNvaS9aRUlyRXlEMDllRml3eEVDYzFieEpNdnlHaXh1d2l4azQ3SGxTK3d6Zk5tQnA1UGVrUHNXWmltUXRzVVR1RGZHYy93eUt3ODYyMEg1L1c5SzZ6SFFtRU1xd0U4REMvejFpOENPcmZDM2tyMUFJTFh1eHM5bGZSa2piUDZMOGZNMEVpbk1uOWw3aHYwek1lNFBiVSttcFpocGdFU1ZRc2xxZmg2NTE1c2MwQkUwOFhxS0pQeTJYc2MyZW1FdENENzczcmw4SVhrWm1QcklsWThiZ0ZqeXNxMXZ2OUtGUUZ2a1VXUmdFc1NzNVBDdTBsRWZvR1lNTGNyU0h1MitCdE52cmQ2YmpSVm9uTURJWXpVTVhOT3RmYjdMRWMwWk5PWStVY0JCeVBjQllYMHZjaDlIV3RCMWdTYzNvQjNIYXY0OE5sY2Q2ZlpBa01YVjVhWnd1WWwweERLeElhL3ZzSzM5RS9OQzFydGVML0VselAyaDNpZTJ2alFsV1psUGJSZEVnLzl0VjdFNVB0OXlYOHVqaHNJTzJSam9MNUh4OFF6cE40cEdXczY4cUMwR1VoaElrQUx6QzlLN3JNa3I0enFYUDlCdG90Y1RzWDM2emtWNlNUbG1NQ3cxeThOYks5a1MwY0lYcjZEREVDU2RFMXBFOElqSG1McTFVUno1bGZ4WEVSejhzSzBzeGo4SURFMnBpUmR3MlFVWWhSS2JybEhMT29TM2ZMbVFhVkhsUFl4eDZQaUNaQTBjWDBKa3dCZWcxMGpiNFc1VW80ZzlpdERiVmpjZis3dWtKbW93ejM0Z1lrMEszbjB2YmI2amg1dHdtVWl0bWVlVElXM3N4RjZyYktqcTVrVVR6NVpESHB5dzZzM3dKcGtscmJCVkRPOTVmV0lWWWRiWVRtMEVuUGV1N1ZacmtiS05kKzVsTklhUStsaHZKd0xCdWdIMldCSjY1dld0bTBOM242cGZVUkt0T2s2OGlmSlZCT3Zod0ZxWGNIRjVid25HeC95bzBBSlIvMzMvYWFEY3NzMGdwWVRUazEyd0JLT2wzV2VVZDc2dFJ3UlJQRGx6KytJcjVzTm5BUm5DUnJXQmpLVEx1c1N0Ny9ITDZXNGtJNmxHaFJjSzFqTGtPUXlVR2U5VnhVeFlwVkdTWDlCTVkyUnIrTWUwR3JpTXFxVXlsbUxUTmViY1dVZ0lhWXJsQmpHa05vUkJYUmQyNk5MV1BiYTk4NlFYaHFyVmNreTRPcm1IcW9DTjgzMlhnSnYrb1JTakc3bHYreHA0aE1hU3AxL0loaUgreU5Cb3pQaW1wVHlUMGJwcW9Oc2wyMy9MU215bTZINDloMzlHM0wyeWFoUDduMGl2dDhpN096Qnhhd09jV2lmcVVmWVdjZG4zUkdNV1kweWsvcmNBdFhQUWZYMEVlbHk1bitrNEFkMnBiWGFESldubENTQkZwaXIxVUt4V2RhbVlsdjQxR3RTZUF0Qk8rdGRmSzFNOUtpWHFEWVorVnVYU3RSaG1QeDV0dU4wQTZDYllkQlhyM2puL3ZXbUVWT1VPTitzU1hJVWVoMXZiWUwzWlQwNlZiQ2drdGQ0K1ZMMkZFV1g4RnhoZkVzZmpKRjk4enhhNW9GaEc3RUF5OWF1ZDJabEU0bU5vc1c4UlIycjhHam9ZVnFxdnZIOUxBeWJwQndodEJDRXRrTDFKd2o0SzRwbEo4bkhHcm12MzVXZVRRTU4rNXJsYTVvNGtBRVpDeXRoL2NBaThWMlk5WTJKWWpVVTNnbXV5bUdlcUFnUk4wbzJDMDFCME9YeDlRUm5lSk8wNG1VM2x0TDU5aFIwTzB6aHhxeUgrNkhnb3picXhwZGtZRFAyUXFtVGNncXNWQ0FsSXI2K0w3THZ5MEVkdW1hdDR3L045YmQzTi8wOVNyY1hMajVjWEpOMFRrT2JpVXp3QzJwYkZORFc2aVJSVnFkRndmb2xVWi9OdGo1NWR2Mld6VXlOQ2RqQTQ4M0NNdEtzMFNFNnZ4MndIRU9LZnVRNmt2aEFBU1E5S0ZqcTBnTHc3WCtkV0tGUXhmUlIvcnlSQnhpUmJrRzVndGNuUnpnRFF0bDBkb1JGOHFObzVHS3FXMnZhcFFMWmRkaGZxUHFEQkFUSlJwejVINnRvbHNzVEpuM0gvUHUxWEdIY1JQZEVuSUpZK2c2VjN2SmZKb0VkYW8zWWp2b0t4MUptWGNJWm9FZCtEM2dqUTJGTDN5VjgxeXIwQzA1Mms4ZGtNT1ZaOVF1RXI4Y1lNSm5YSmZCSDhpUmVYZFphRlhzRERVVmdsUkNYRk15bTVWVkRMQjZTOUdIMDRlTHhsOExqeFpkZkdNSjkyZy9KM0Raa1p6akRaS3ROK0lRUk4ycW1TcllLdlV0MDQ4L3RmU3NqR2ZYZ3N3OExjUXhqSzNjSHBsUExHT0xpTXJxRTQ5b0xJMTU4b29rWG0vVWh3c1VqaUZWQVNVRG9PUkpnWnUwc25lYXU5Z2I3bWJteFA5bE9LaVp2RkxFSVV2bjNraW5YbjJrOUxIVmdqNnBiRnlLYm1CbWZLRkViZlhUMDBRcG9YbzYxcHJEcUkrVEFuYVIzQjc1YnU5S3c4cyt6RDg3Q0JsY0Y3Nk90WXBvMU5mNWR3UzNXMlAxQyswdGlwaENnU0dwaWFSTVFZenk3OUpYL1k5SnY4bkhCNEt1SEs3MHN3MThNL00rVE5UQlhKbUNGL012ZlBIN05jS0hKSU5ER2krZ1cwSnMzOGc3TEJDSW1QUEpJTnFlMkVpak5IN2VsV05FZFRjMVIwanFVQVV4Tm5GakhDQ2hrTVFPalNtRGZJNWZieVpWcjlPeW1CeHp0RTlmazVBL1lSZ0VMaHhEa3E2WU56aVlLVnEvY1dSaGUyd2ZKY25HZjdQeEVMOXJyVkhiRXhBMnhjTmx1RDJheElqbng4TWR6c0poeUZTbXBtdDA4SGJZV2tTa0hWaWxiY0hqa3VQNnZLUlY4VDJJTG1iRVQ5KzdrZ3ltMUV0Q1B4T1ZSNWt4dmlJcHJJaTAxYlZLRStBSVU2dkFpKzcvbVZWOGhZWC8wRWdLdjQ3RWJzVHFBT0w1M3I3S2xoWlBLMzBlNndBLzFmOFowVlFDODJlWExnczVRdlJxMWRNMHJyS3lIczdiVGw0QmV2UkY3OURyMVBhUjI2dURxelk4Z0xBaGZjcUY5VHliek8wV2NSbHg2d01qY0MxekFld0MyZHliRHpWN1E4SE1DV3g1Y3l4MEdBWXEyWVM4Z3ZPRFdaajFrWkZPdGxNT1VGMXA4UWVqcERaUjFHL2pHNXB5cHltNXpoaDhYWDRKbjlEK0dKaUhWMk1sWUJNL1Z3Q0NoZGpVQ1g0a0NtNS9TeWpFWHJyRFVPWnVEMGo2eVNEb0ZUa1FscG1KNXpOL0lQQkFCekZseXJMWmxpdG5WQTJNd2NzaVUyVzNzOHRPb3hTZ1grcjdGL0srbXEvalgzMndwbTE1eFlEeXpyUG9wTWx2QXVJWk1hbk1QTlUwWFhmamRrUjlYeDVsUkFJWDF3eVpzTno4bGpEVm1YUExOeEJUaU9hMXB2MWJiSXl6OXB6c3QyVnB1cjY1NHZ3MCtRSVFxRDFPWjdjSWpmdVBON3ZSd3MvN3hXcUVNMmVibE9sNGVHK2Jnci9nVTE1NVJrdUgzNjZpdE5Zd0laV2QrYVhzR2VXamszRng3U0IyWXROa09NbjBMNGNtNkVGTFlDQUVEWm5SSFFCdWhxUGxKdXh1cXI5UkYydERRTjg1NGpEMERvdWN0MTlCSVMzWi9lc2pOWE9mY0d0MzhkaGNjcU1Ccmt5WDZNbmJiS1RzdDhYajhjbTQ5OTRnSzNzOU1HVWErNlk4VzhzSWRkOVk2MVRXTklXbTNIZFM3dmEwTG1TZWFLRDFMNGMxZWJGNklzVzZlSHVNekdEM2diYW41Um9NaCtkSHZ1bVpySFdCeVVuVXdNTmZPV0pOaGk1bnJHclpFalEvSjFReFZoUTNsdE9DME9rTm1tZnN4d3lidXRRdjVlMTBMa2poN1RTZEw3TlJBZ0VqSWJOV2xaYklIVk5CTk4wSzlEOVpnbzc5T21HMzlOUlQ4NVhpSCt5eGlCOWcwcHBlVkRIblVtVFV6WEk0SjU2L3BIN0VqWW1jUGJzNmxqTmVHQ3crc3JTRWgrWER6RHhIb3dRUUtncjFVeWlnaGhWYitqWHZCMGlDNDJPalJDOEJpRzdSdE9CZWp2RjFUWDJEaE93RktLWDFZMy9iZ3JiVWpaeXBBeFcvRFBuRmNGODdWMzB4TlgxbkREWjc4VlRrOTFQTFIzMnM3TU50dVY2YWl3U05WYTdqWDNxNlgyNnFpejhBbUlteVVJK0xMeURod0JlS3IvelYzMUROb3FEVDMxaVllV05WOWVmMDUvcHNOK2xiUEpZd1FjWlRxWHFueG5Nd3didjN4Z0tZVnJJcGdkRlY2MVVhZ2psWjJicjFtMFpKOWpFaW9paDhHZkovRDBjZFRqd1ZhVmhmUnhVMnkxK2duMmZPajNMQmVUdGw4SXpldnpWRGdGNUNJeGdidThVWlREa3VDdjk2aVZQUzdRNm10NysycWo5ekhzOE5YR2plVXZlS25KWHg2VEd1VjVycmM3SEdOZ2dGYVVDNUFUT3NrOU5xaE1zMzNiU2xTWE9YOWRDMm1ZRlRCMkkxQnJRYk5mUityQzM0cDVQSjZjc204RVZCcmptMThUTkpvbmw3aEVGdUhnM2JDMG1XZlRIZmlwaTh5aWJiajdIdEdaR01ZVmpFWlJQazNOZkc0S2R1ZDlEalIxRjRlUWsxL0NFci9oU0tTcyt4TE13SndVZGRKRjI3d1p1cnBvcmpkQmpvaUxBTzl5NzVZdWxZSFIvNU5mb2REV01RVnNPeUwrZU5JNUtvYys1dFMvUDlWcEpLbStpMm5saVg2NEpYQWVrM0thanM2R2hKdmdpdENNaHc5cmw5NVNjU2g4WDJ2cXZPMWlwUmx3RlgyM2laUTRnZjY0ZGEvQnY2NTI2MmVNdVU1MmVHMnQvdXlsREFKd3RzN2pCWHUxWjhCb0w1SHlTNHgyQlBMNHptSDJpelBuWTMwQ3RSbi9BSFY4alJScFAwbXBKdkJvNmg3Uy9sWWJoZDBESGh3a09wQVVmUFlFOWlPK1lra1R6Tk5UZGVYQ1Y4TW9Zdmc1bkpIQnNPS0tiVFJucDVnUk5DeGp0YXQ0UGRvcHlUeDJwbDdCU0V0d0pkWXUzUlFjc0p2L2phUngySEEzKzBCbDJxK1lKSkkyRlVwWU9kcFNHNExYalpsejUzSkh3WVJVUHhFY3hFdmRNaUh0THBuYyt2VFFIek5pdkFNNWhlSS9ueE9MejZJTWcxUVU3d3Riajk3U1M3QWZxdmlKL2MvZEpMRmVPa2tFQ1BLZmdZWWFmelhtTHQwdXBlVGVwZUVsNkFXcDAvOHlidXFXVXdUVlV4bHNaNGZ1Ym94MjJpOS9KbXhMQndEa1ZlVE9wOThNdG9sbm1HMXhYNjE0UFRZYTRtVlozbEZ3bWRaeDU1MjNJeXZmdldiQlFjbzR4NVIvVmozcHpGeDMrcGJHWEl3MmsrUC9jYk5qNTg5VjI4am9ISlVxZ2hyemYxbUQvVmtuTFBNSGFnbzM2TXZldXlzdFUzMkIzZGkwcFRGTEYzK2Z6V1FvQ3gycFFsbWVSSmVNSy9aalVCOEFHQnFYOEcrRWt3MnM4dFQxUFNSVWoybVJnYnd4QUNNc0Fkd2JHTjRyWVVqMTNXVDlmdEgxbkhxT2NUTitZTHZibVZaSTZhTUhtNWVyQjNpMXpISDU4ZDRPLzZhaU9sUFUvVGRaVSswc0I4K3E5d1lZTm5nRThwQW9xYXhmZ3B4TUxJZWovY1QyODFqbzlXMlcrd25LT1N6Mkhsa205TTFoR1Nyck81MXo2TnJnNHYrank5b0UxeDZLWURuU3RmeWZnUXo1cFdud1I1bDdIRlM0Y3VaSkplLzBMVklnNFVkdGt2dEtuUmhsaWVVYmw4eGVYRlJwWmlQK0RNK3NrNFFmem9oaVJ2RVhqS1VwQzVjVCtPV2tRYmlQbVk4UkkxV3RHaDdJYjFTRWsxNk5SOTdVU0tSQ21sd1JHcUdWazRFWFVXMVRmWkl2VkVacG5EZUdYUm1YQVp3Y2p2OTdzaU9QNHlvMnd6bTZGdXhpb3pZRGV5NTdPT0pvK0xQOTdzenpyaTlaK3ZibnhENEczbWpDNEdwcWVET1d5WXJDd0NVVzhod2M3RDAwOStqNXYyR3BQR244UytoUjZqL2ROK1h3SzBKR1hJMmtlcmdEdzJBSU9STURBOXpCTVRtbFQrd1oxVWNLZFNsR0l6anJiY3dFZEI3eDQ2QkdPbUg5ejJOKyttL1hka2JHV2hVS2xFUUgwa1R4OEpKei9hNWpBMjlZZjJwS0l5a09EVVBEekUrRUViTkdkNitLTndsM3B5cTVjWFRhZTR1cHc5Q1ljMzNCckVjVSs0YUVrczVWdEowbEJCQTcrZTVEMzdHeHdoVkR6UnliaXpwYW5wVWIyeDdLQ3A1SnhESnZzSjZ5RGdlT2Q5dzlVVHY3WnJ2Sm9GdTBOMlA3VUhvZlRBb2NCNVJaSnU0MXA2NzUrSWl6S3ZoeDdVMStaUHZ2dmtJS3ZFVjBGa3JzQ3RLZnJpa0ZkZzdYK3JKYWlFN2I3ZXBpb1JneGZtY3lDcktnNytRckxJdFRyckRvMlM3bUpKRVZUdGVsSkVQWUJyUmVCVytSdlRmWEF2WGVUWmlwY3NuNjJTUlJITStrTXN3MWhFbktVdkNyZ0tRSWN6VU9qYzI3UGZMc1R4amNVTTVFS2NzYzRkYnZpSWM5dnMrWUk1V00yN1hIa0ZZODZXYWluR1BCcGJrMjlnaEdlKy9vRlNGNk1FWTVXTXlFemtGMWJSb1RyTFBHcFpyc3EwZkI1MDlEeGMveFA4QkpVSDZkZXROOTVhQVFjSXh3RW9aTmRyRmNTV1ZmSWk1R0dTU245RHR2V3ozVlZGaVVBUFZYMU1TcnNpUXBMK3lpWWtFZlRFMDFNYk9Hb3RSVUhuYUxhQzZxdnAxTXBtNzhMalJmTmQyN1ZreFY5cVIxdkdTSGZ2RFNUVE5QVEhOb2p5Z09ZOVdUUUJIbEZ6ZUxWZEIwZ3B3THMwU0dyMEU1Wm1zbWZqMHVxR1U1T0xLMDYyT2JSR1I5anFzY0Rjd2x2TEVRVFE5a0tBOFJuSU5Ocm9RRkQxbS9Da3FoZWo5cXc1T0lkOUY5QVlzamRYWXdPWTJQV0trYS85OWk5YUJQVlZZdHM2aUxzajhkUWVSUDVxY3BXRmF4WFN2ZDJBRGtyMFVHRkxzTzBJaTltaytkQ2ozdExoRWJ2WTNqelM4emsrL1ppSjVha3IwTlFsVTB5UFprdUFlOXZtYUlTRkd2VmhyTU5mdFIyUnAzK3VEQkdqZHVDMXE3OGJXMGU5VWZ4aUk4TVRwWWdlbnBIdFJsOXBFTEg2WnFwM0xDQmg2Q29hcmlpbHJSblNuY1Fld1QzbFgwa2l4QzJlNDN3dlV5YVA0c0hqV2VHS0NTekxKNlgveEduOTIwT294MTh5RTY1NERTRDl1TFVoQUltaU9CZVNxaWpKQXhBZ0I2UXRZRndqVGxCV1hVUG9xbXVyNjd6aEdKZm1Pb3pyWC9YVnpvaXBtZHRFQzlPMXVRRGdFRFFnZ0VPNkppanhXWXI2NHpyV05yV1VGUHBVeXVIRThKSFpMS2JBL0h5VGdaOU0xdG9zS3BQczRndjhpeDgxT2RUV2hCRGRiWUZFbnREd0pGZnNxbUtDU3lnd2JpSDNEdlVlYm9WOW16dTh4WDdQa3ZOb1psTEJWWlRLcnR0bVUzQjF1aVE5V3VuMnMrUU1lRDV6TkdMVmRQZDV6RGVUSjVEekZabkQ5Q0ozVXpiRklSMDg4Y2d4OEF3b0FMdTh2UHRMRmNaOE5WNk41WktLRFlKaEhHMlV4ODQyK203VzZnTWp0QzludXBsODRHTnZueVlHWVNzdG1YNkduSGJyNVRjakx0N2swaVRSeUJRRWwyNkRhdzY2TmZVYTFxbmJqVVdUNkthRUkyUzlrcG52dVBDLzBpYUxqWTJqY1NyQTF1RjU1WjFaTWpyRE80dHBMdjh2VHo2WHRlWmpSUzlLbXhKMjdpdEFMOGZOb0dSdmI0N0FjdnByV0Z5MllkTnNPdVl3eUU5V25hSHJ4Q3NvVlFoUGFCY1pCcHpiL2dpdSs3UUdBcy9BdUkvTFVpY2Z1cjFkRFVlUFBTdHJTb09ybFVFcXRqM1c4QnZaZDNBZ29iTTl3d1ZTY3BXRCt2UFdZaFgrMTFLYjhtYTRZQ3BOMjVJc2Y0a3hoaVZMYVNqTVlQYjlxRHgvczFZbU9JMjJNc0tlVlo2T2N0cTd4TFdwWmoweDhsK2V3MFRPeHd2bml2czk3L0VBR1VKTmZRUytFVFU2a05VMkwzVURwZENDT0JCWGdnMkZyL2t6TUZ6TytBbmw5L1VGUkRzb3Jyc3hxS0JQUWR0WGVZNUpCbnlMaWFBekVKTUpiVTZGd0dJR0ZuUkVtRFAxZVgyand4dTdQS0pJbXBRMWF1ZFFCTnVPNXhkYlhuK0xDV3ExSXV4Ui8rc05rRXJFTEE3ajkvQ0pYZVE4ZEljRVVPL1ZVTC9TOGdYeDdnS0pwQlRnZVFTcW8waGJxM01Wc1cxVFhrRzFiWC9wRjk3d3B6SjBrUytibUhKYWlRcDZyQzg2S0Npa2RtdWlPRDdGU1l1NUdPS0p1YmY4VXltNEpMK0QrY0FJRjduWk81OG5hQ0VUL1hqdk5PRkdWdk9VUjZaZlVvbjlaUzczdDVPRFlsVGRNRnRkWkVDNmd6UlJkRTc4UTZXWGFCQktNOTFoOEx6blU2S0tnWk9hc2tuR1NFc0F2ZjFpUy9YMGcxZ1dOcndPMm1tRTJnRkN0cHAvVnZxYm1WdTFzdVhSR1UwUXhKN3p5WlZtQ1cyNnIxY01XeFk3SXJISzlUZVl2WTg5ek1iY1hUVzNVbEFtajlkRTBPVytuMDhvMklPdTlKNmYzYXFIdlBzRHpSSmhIekdPWFdUS0RZOWpwS3pOVDd4aHhDODdoU2I3MnNJT2s0bGVERTIyY0lUQUlMMGlMMnhDUENaRlgzbitCSEwrZHoxWnhkekF0N1Jkby9Ea2JnaUxiVnM4WnhiczlTdEpReUIxUG45ZHA4aE9rVGxXeG02cTlGUHZmSkthTk9zbHVFSGdTbjZLcnhEbnNsUmVyRmNkWFRzQmdwSFpUTjJ3anBIbzAzNk1wRVFkbUQ4N3drc1B4dVBqN3VKR1VKM1N0WVNOUk1FdERpOElITkp4aVRucGlSb0Z1Slh5d2c2WW1Ga2VsMTNIOGcvVTFBS2VGYTBoV3hPUFhhWi85WTBBN3JhaUdSWTd2dXFlaWhVTkZmbDB2OCsxODBtLzdvS09uM2VSZm1kdVlwVnlpL3FkUkJKZzI4Y2RpWlBrZFMyQmRtRUl4QWtGWUdWdVlpUUJhcDl5c2ZjZ3JsbUFrRTVHVzg5VDJ0d0hzM3ZVdjljNW8vMHk5NTJCZnlDa2hKeERLeSt6Z01wMjN6UHkrUE1yamlFZ2U4UTFGcmtBbm1naEUraFJ2UDRZSm1XbjRqdCt3MUdicklWQzNFYUxHaHhZOVVVWEh5elplUC9QTkdzYzV0WHBhelpSaVdWM0NoV0hxVEp3akU2bmxBYXkzTkRSRG5PcWQ5Z2RVRWtiQWcwREtoTWVMS21BSWhWM3A3M3F2S2pxWGlUdFVBZFpBVEpEOHNNeDJuN0xNTGY2WFc3VVl4WXA4ZEJPMG9BYXM5d1NJVW5SMEJnWmp3bWVxa1dhQ0I0Z2FYRkxCZEwvbGo1Wk0yQ3dja29xRUo4c1RwRlVTVkEyVm9rYklMeE1tMFVxc0lpUzNKNmEzWEM1OHdSajVnZWF3bS9Ka3Q0UTl6T2ViSlRMdmFsYjJJNFY0NUhxbVZnK2txMVhGTjltMEl5TFk1eVV1NG1TbjBhUlFXKzZ3YTJ5eCtacjVpN1VhMG9UNXZRR0NsODQrcXFHamFCZW5ZMUhTNi9ROGtGWmdjMEJ6NUhzVkVjM1ZHRm4wVDM3ZHBOWFNmaFg0MjkxRDhnZ2NxWkdDaEJkYURCZW94cDBqTFE2bHB4ZVpJY1psaXF6VmJZc0NVaDEzMGdmL09EblJsYnJDbFZKb1FNeklqcVA3SnliQXVQV091QU1KNXVpVmM2ektDdHk4WGZVbW5DMklNUkJsM3p0Rjg2cGRGWm02SGF4QzRNMjFrVXR2NDVNRHA3TFhMOXZHMkZlZ0VGUGtzSXJ2SjJ3dVJxTG1BVFYxTWdlOFdEY0NrRS85Wjl2L2Fna3prSzJBMGtLRHN3bFhqUDdUbWJwUndHS0lGY0o3MFVEMm0reTgwQXJiY1Nyd0NjaHJjeDVXcUFSTUU2UGJvS0pmSXBhOUdjaE9kWWJMbVp6MGdUZHVQbUFKemYxYVJsdUVRU3RzemFyQU0rdTN1Z1duQW1zVWtkdnZVY2dHZWNXZ3JqNUE0T3Q5bFl1Ymp2M2pFc0RBTi9Qb3lvc1V6cm9xYitPT3UyWlF6YzlvRHMvZVlDdGF1aldjZFV4SzU0L3JBQmd3cExBTnZmOG52bzFTUTRUZGhnZ3BvYUJMUE96WENaREl0c2cxSkQwWmR1cjdzRFJmeWJKdkVGWlFUa1ZsK0t3SWZtMk5wOHJMOEdMM2t6ekw0KzdENjBZUVYyZ2c5Y0sydklDaGQxRzMrSDB2TXZpRUZBbDc2b0pzd0FkektzbzFmWTNWV3JScEM4STF1djNBUjRjQWhMZUUxcUYwTEszUXpWOE95RFlBK0ZjMHRKTHRIdFFmb25NMHFnYzJ0UzN2aCtIb0w1TXpwSVRiMGVuSlhKdS9rMkhxaGZJbzlKOWQvak95MHcwWUFRTUtYQ3FRNGNscnhEWlFuRi9sMWlzZkhTT3F2VjRCc1JVTGpmZElxUElONFJPZTZZT2JYekdiSTZEUzZVbmVSM0s5c09xSHJaM21VVCtTUWhFN1o3UFBYbUNkemY4d0pDMUhZY0YwUlY0T1JJUThSODFDSjIyRm1Oc25WdkVpQjBDSVEycEVaeVZnZ25BaC9VOWZEaTNRTXZqSmJLbzZqT0QxTnI3NVZsREViK1RkRVdNdUlhNElydUt0V2ZZV05ka25McS9zVFZQSjgyOWNVcXlvNjNBWDhESkdEdFZmNjNKL3hsZHFXZ0dmRnNKd1F0NDJFWTQwdkhqd3JIdHlrajZFc1RzVkkzWGREVkhnSDlFRXJQa0VmakszMnNsZ1dETXV1dnR0OGhDWHYyUDBLczhqdnFHbGNJUTlwOVlnYU5CdzlmQXYydkkrNFBwTmRVZkgyTm9YdDhTaUozazBnb0IwQ3QyelNsSldnZkEvcjJJa1JXdWFlQlJXWnljaGVvemJpckdFQllFZGYvODVxbE1tMG45S3hYY1hqaVpWM1RpZmo0VkFRdjBXc3kvTkpKUzloeGZ6bmJHVFVCenB2c0s2QmlYRUR0Tmdsc2c3Z0ZwcTNObCtRVlZheVdjVG04Qm9xMWtUcGdmS0MyWHhRUDBIaTdlNkp6Z2d1WE1KaS9LajB6QXU5OFlVQW5mNXhTd0Z4Y1d0OUc0bnE2YjFUZE01UVNGc1pneVVJaEtlR3ZXTCtQVFFjYXlNcllFZ1VCWXFtdEp5a0pIc1ZUNWN4b3BIMk9kSEMraE9pY2pvYXJBYkxXckhyWXF3emhuNHpEMlo1TDlzdWZxblhoKzJtZUd4RmlGSkE4ZFkzN2NlSS81dnlMMWNwSHRhWTdzZzZPb3d4MTFNVWcvM3NBdDFPR05WMzhYbHdSWlR5Uk9YcURxZC9TK0NHN1Bqdnd5VnRsRGNZUzYxT29MdGJEUjJZWkpjZXZtanNzVFNLcDErclhUbE5XRWJWZHRvblorYStqOVlnVWxLMTgvWmh5dWZxb2U1Qk9QZnM4d3J2bnN0QWpoNmx4QkpYMUc4a09lM2RNcjVZdmNORC9EYkpWVXVzYk9JM1FsK3RibGdnL2RHNmdYdjROSEV1L0h1MUJoREpYUWNWV2RoYjlpNzNFMzhQcjNCVHdsYXJVbzBOaGhZWTJsVjl6WEFsSGVGRGtBOFZuMkhHNGZCSk9lQ2NZNDExVzJnSUFYTlFnbHBUNnEvZ0Q4akVlVndicTRTWVZEaGpKUTR1azJVeW1vUHBNUmg4L1cwRzhqaWxiaHhoN1h6L1dmVnoxU3Mycm5sWWdkcVpwTFJ5Q0Z1UVQ3eXhod1kvR0JhQWZjR3h4Y1MzVlRuZWJBcENJVFIvM2NTNnIxS0Y2VUhXdU92NEZIbHYwNks1eFl6U2xSU2hxN3l5KzhGYU0wMHBGWFhCbUxQU05RTTNvVmNLQjBYVEl4cmdkM3BSYU5yM2xkUStqVUVaYzE1dFozV2srajduOFRXV0pRK0VNaE9WNHppSmxyK1Vhc1AvZUV6amt6RThqTVl0bW04dWV1b0ZLNDZKYk5wd1VuVXVqaEhwSEgwd1VkeERCdEhwYTVOUTNJODh5cDJNc0pmUjI5UFR0ME9YdG1zUE5mUE1XYUJXV0V6ZjlpNjJqTmNRRkQ1RUttRitORURmM256bmlTT2dtZTFZOXlVN0tQVnFOTmpxQmg1VlNhdG8wdnY0MVY4TSt6ZE5kaERKcjJsdjVSMGJwNkhnSElwaDR4UWhjcm1FekREZWsxTWVST1hDOEY4bGQ1TFNSb0dtVW5RdG9scEtMMmtoc3dERDY3SzMvRzJ4WWIrTklaWVd5YWhrd1JGVXQwYnFJZ1pIbFcyNXFsOVVxMDg0Mk9JRVNGWFJvNkQxcjBlRkQvY21ZNi9MVlQ0UUxpVFJQYi9NRjIxaVJiVldHM3pTNmpXclhQMjllV0h6OHVERXRPRGNvd1ovdmJ4ZUUxdHlqVEZ5MUYzRlMrWXhSRk9aREhMZEVNajBuNGNSOENLUWdsMFVGaVV2YXdJTWUrbW94UCt5VXpnZUdMNGNjYUVhQVpHRnV2dHk2L0V4bEhacXV1ZFJLUzF1K1BHZWhqSXFZWTcrMllscVdYcTRTME9YczJhTXIzWDlqQ2Z0SUl0Q3p2ZEtrVHBWZk9GeWV5RC9VOHp0Sm5xcGFlS0Nzd3QwbWdwNWp2b294dll1a3J2dWozcStMbEtnT2FQY3RMM1dMYzB1U1l2cC80bElCQXNWbEhlWC82WjBuamlCT1NXRUR2WmM4cWVPS3pOa2d4V2c3bXhvWEpINmN2NS9VMjhBUWZtZFFjayt1MUJkTGZJSkN1TVJBcHZlODNGUHhGSWdmZEJmVVdMU0VWRDkrMmdvcmFjWllLS1NRWHJvY3gzNG1rWXhNMWFob0lPWEN1b1ZZck9tYnFGYkJ4R05relFQc1BHblBmTk0zMFJPQytXSk9zemM5cWsvR0NzY3FYUGIrSE1iR29WRERaMmdLTDNNcFIzZnQ1MTFNeFR2dWUyczVzU3lmWDk2VGRWUHFQOHA0VkdRV1FjOFdDWjYrNFlMWUdGdVJ3QmRYQStzS2g3dlZ4RWNzVU1UM2FXNS8wMXM4d3QrZXl4cFB0a0RFSTJITnNXemRCOGc5bGIrOWNTNHZpbGRIQ2JiSkhheVJmVm9QMTMxV3JOVDNnZkJ1U0lKaFFJU0h0VGVWeldrbDlLT0hEYjBXRUJHYU1veFFnWEJTYTZtaFhHYnhxcHFFSDlYOUJQbUlMTk04YmRqUTNoczdvYm1PTmdrVVEwT1dsUWc4U0lJMXFlTjJ1K24vamJwQ2dEV2JFYTVJbEZES1dmTGZZL1hIRVloME5Dc2owcFRidi9HRTlJN2xsMjFTL01LN0xoa0g5UGJlRlBJZTVrempFeGtodnhhaGNYRjFFRWhCbzhlU0N4c0tNQ3pvWHg5MzFCb1pPNW9HOU84T293TVJoTzZ0ZXM4ZjFpVDRiYzF2NGF0UUF5SXRGVFNYYkJiY0l4OGhQODVPVitLZGpONXBLUlJBZTlRcW9kcG82WDdhRSt0WEM5V1hTMll0SzZoLzdDSE9TQjJxOUVLeStwVHBBdlJ1Lyt5dHJOeEdvQ001Y2ZXaEhwVnRDWnQ1ZUNKSkJRMFRrdWkzeVl2ZGF1L1ovS09VWXpSTWhlWVZ1UFNPc2l3MWl5VERDRUgrWWplTW5udlFmRFUveU11QnlsN3VLNXp6K0xrV1JYMDdvZUR3dmFwMDFCNUFMZW1Jei9TNm1RSzFIY2pJc2lURERybTRqOWlKQzZPa2tGbHVGcGduRDIveDIzSFhVMGNHbE9pNk0xaHBMK1JDSmtxeVVpclcrT3hLVENyTUpjM3gvRERoZ3hXaFBoRzFpNjd0NWo3Uy81akprcWUzbVNyNVBJMGZBYnJvQkJTWk1Ca1BWN3VCendCazBBZy92WDJOWTNmcDJrVDJkMHIyRGFYREZia2pTMTVBak1JaXhaRkppT0prVGlZdU1Qbno1d2FRd0d3N2xwKzl1OUZDUFlMdU4xNTdoRnlvbi9JOUZZeFhUVTVrZnNKajVIbHdDbEtpOUUyMjBhVDNKbUNYQkxKQXM0dEFvNzFVOGpST05Ma1JBTDFKS1czcm5rVGVOOVJ6anRSdHdDd25wd29UeTRsZHZNbTlOM0RBNHhlNS9ZdUFQTmZoaHl1akhYdVFVOG94dTVoVkJHZUdNZXA3b3V5d2VkRDhqWk44R1lqYnJHK2dROW0zZVZXTHZXdktoNEJuMXZ1RnVxVDRIWlpaS0VGeVF2U1F6NmlmS1FhNmFmd2ZxUXlIKzFOZDhCajRveU0xSGJsanRPbEhQdmIyOWMxYjZ5MkNUOVJsaE9IdlRqK1ZpSXJVN0FlWHBzSWdqR1ZKT2JrY09BYWNWQktoMnpWTkVYTkRzL2ZCbVZsUEwwL1RLeGNUcXZySS82S3FCYUQ3dGp3bkdud2FuUU5wY1UxQ1JjbTZWelF4NHRvSSswNjVHL0Z6WXA4YXpUSE9GK01VUGVqcVp0YUwyekd6ODNDcHQ3S3Nuc1FENUFHa05LcXRMa2RxcFZWM2xhM2Q5VzBGU2JObVpqYW9RK0NzNHpLRWhDcHI5czVEWGhkZW9na0RER1ZsT1RiUjhkTkN0YUpieHhTMUtyaGxIdUFOcXhUTUtqV3NUTmowRzNCSEk0Rnl2T3ZtY3hDYUdZQ2txSTNSMUcyWkcvNWRRMStOcGlZTFByamIxRlhqWCtkdGxiQlB5RzZHRTJJdzMyd2hoeDFtK2lQV3JqNVFOcU1NWmxYZjk1enBBbmFxSXRPR2hCN2U4RThURWkrREt6b1lZWmNNMUFMUGJ1M2hNdXhCUnRCYThMZUpNRUZGaXBjOVc3cjlmSGZSbkZlZy9EOWdFS2xtdkNNMEJDd3lROHdJeEphN0RZTEtTY2YyWHk4ZkY3cEVOLzdpKzZXcDFLUzN6VC9xVWI2eDlGNHZBTWpLaDNkbm45TSs2VXQzazNKNDNNekdLMzhDODRlVUluY2g0VWFWdFErK0tQb0g5SFE2S1VraEg4alk5Z0NseWI1Zy9ZTnk5R29HZ2lRd24ybXJydURXS2NvU1YycTNNWURhdWtQYXhJM3hwOWtRdHM3c1prcmlwNGIwU1gvMktEOGZZN2ZpZ1NMR0g4U0lQNkwvbHdFaFlXbW0rOWRJbmNQYnhJdENlYUxCU2h6SVpJOHFGcU1MK29SaThpKzZaUnFpbzc0ZUI1cDFtV3hONWVMYlV6K2ttUDBIbDBwZG45Y0ZWeUcvckJMakRUYjF0dUFma3JENlRXRWFhSDFFcWtiWXZwTzdWR0JoMUlSRVZMclZleXc3T25UcisrVk1ENUM5bmVndTdlUWdwMkhRUVZ4Z3h1ckRLeDcrVnV0cFlDMEsrRGNFRVpQWllJWmVVemRneHRRMVVpdjRRd1A2b09qT3VFOXV3RCtpWGdWMGI0NDZ0TnczTHRMWGVlNWhRZkd3ZjQyT01uSTNndjFSS0tvMEhsWTNPNTdiejlDbWZnRmFsNFY4ZENEOUZkNlE3VWx2RWhlUzJZVlBmN2E2aG5OY0tQRU5oNEs5dzFHVjcwazIySmt5ZGhRV0pXNE9LU0VCNUdrTEtDWnpoSEJuLzllNWdjTGZHZlJDVGwvamhmMlFqUFdkNkh5QTcwd0w4bW1NL0RVelBFTTI2bG5oWXhjSm1mZXV5SmVWZEhOditBVHdBZXJFNjRTcXMydVZTK0RvMEhWVWlTT2dWSjMyV0ZwallJMlFyeExsL3JKR2JtNkd1dFZDU0YvaGxVUkhZK2p0NGUyT0VCY0ZTYnlyZ3JITWJZZ3ZMdXdUKzR6U1NrcTAwZHhNdFFUVlJJTnJDOXFFcmlxMFlQT3pKUzVtWU0rVnBsaWRrYjlwWDFJOGw1bVJYVkc3YXd5V1FZVWcyQW1BV1AzSUpTcENCYTZmTW45bmxxdHJ0NjZLd0sxQkdXTE93c0VnZ0hYZ1EyeFdvOXNlMWxkekI3MlJQakhJYnBXbzlsNWsvcjlIdEpyQk45YVM4cGVlU0piRUhGS1R2RHdNR3NhZ3lTdVVBNnppWTMzUk8wY2dSdVIzR3BMakNueXZOU2sxU2UyaGdISVhORWZlUXI2UDdHd3dqcm14RS9nQ2kvV1MvVVJqenNTakxmWkRRVnQ1QnZNbFVScng4enFKWUJSbElKdkN2WXI4NkxxeWxveFp6aWQ4YUUxNDdZVWdma1F6YjNvVk9sSlJLNjhHT050SXk0TFgvcEhOUmUrKzZOR3IzSTRjdHdIeXg3R3l5OXdGT0k3MmUvU3B0K1dUUFZibE9YVmJ3OFZ5cUpGRWpXMnA0OEVWTEtPQ05BNW14NTZta21xNVUveDdIQmJoalQ1WDVBNllKekNpdjAzTlI5clk5RGFyUWpKLzlNTm1WbmhhVWlQTTNxQktsQWdwYk5McGJPTktYeUo5K2Y5Nmo0S1JUY0NKSVRuYzE2SHpFWXliMTM5L1UwNjB5RFVINnJNZVNrNzJWdmc4NkFJQTJRWVFtUXpleldxVWlDaUZTUmROQU45cWlEcTFHNkFWNnNDM01RRU9WV0lGVGxLeDBlNkhrSXJ2UHF6alNCbm5uR1ZoVzUyOHFpVVk4SG0yVmdDaXZFRWlBcnpmNXVVRFBUWEFGSDFKYWszM3h2NlVyeUUwdi9LOEJKMHp6ZElzZXhWeE1jL2lBNTJqUDVzQ2RFb0xxemtQb2FadmkxTmpVSFNHbGZ3OGs1UTIxY3dCeGJ5MDN6YU9DMkNaaUt6aXR2alZ6TnlSbmxnbnM5bjJQbWpLUWgva0JoOHlGUThlRm5UelBCbTlQR3pCN3p4NWYyVVZieFJ5anpJUGdwMnppSkdYSFFNZmhtMmtoMVpKd0FwY3doSkJ1VEhrSjNLenp4bHVPOG5NZStNUVArYytrOXljSFZ4cEhkTXBnbjVJVVAwSHNCV3BtTnNJdHcrLzFrZlR1eEg5WU1hWXpNOGUyZHp4TlkrK3IzZ0tHb29sZ09pWlVLSk15MzNMOGJXYXpLZkRDa2dYKzVWc2dTNzdpcVhNVFNhL3licFlHSmdCdjFJWFcyOVRiOTlSVjdPcjFlVjJhcEFHZlAvc1Z1Mks1dVQ1aGZvSnNEVi9COVlRTnhuM2FCTncrRVozSlBrbEE5WGRGU2pVdzlGb1pyait1Um80MXVKNXdJbVVOaUcybUdGSDJZdVA4WVFJY2hKYytlUHBRS01YVWNoUHZhdHlETTdaNWpCOFRybGM5UzlMZEIveG9mTk9MTmxLdXZkVGt6djBzcVkvOFpZQy9jR3Z2dVNydWVXTnB4UmlkKzNDZnlKUEZNc0k1Y09hdnJGMnRTSlJGOFJUZC9WM2RtaU96RW84V1ZRRDV0TEpKUVZ2RjdnenZlL0oyVXNBLzNuUlhvdTRWNjdOV21vMVRjbEtEMWowNThsMXRvOGxsT1F6a1B2SXRvc2RwazdQN2cxSXp0OTBwOHhVM2RqVGtra05QZGRKaVhCT1FoanI4cVF2NXNJSmlhbTVtV3B0QzBDejd3Wm1QckRIVy9kOVAwbG0wb2xNRHhOc08yUHdUaGp1R3ZKSTY1Z2FwVUIyZThKTlNrTFFqSXlsRUEvYzFld21tUWRnZXJ0RHJhQjBFZU9mK0QyeHFwVTFydTdoa09FQmF2YlFneVZpQUtwMUdXdEk5UXgreXdQVHZlN3Z4aTlrenhhU2cveFZPV0hyVitYbS9lK093NFJIY1VzeWgybTQ1T25jNHRwa3FWYWhsVm96NmtLV3F4SWRPdlBqVmJDQThkRUx0OW9kdkNUN3g0Y0lSaGlOVHZ3eDJ2cVQwRU9jRmRLeHpFN3RWWGt5SVNpd2kweXBhaFRYb3pDM0Jac0FuNThvSWMwSTJzUVNpSVFpNVhhYkg5OGVickpITmhmQjBVeU5vSzczd0lMelhyUytJK1cxM2oySy9EdEc1eVZudXY0Mnh4R0JUTGhUczBoWDFqSytHUWtOU1NZcytmSE5ybE1oUW91MDlzYVpIWUh4V2tjQ0xEUGxza3YvemcwazFKeVBwZ2ZuQ2Q4R0ZUSjRMc1FmeEFYcm5meFdaMTQrbHBoV2phRDZGbCtJN3JBWVg1d1pCS0FibjhXSFNPc3cxVFI1ckFwSUR1cHo0OEI4UFpCNloyMVMzMkg3RHJGY1IvWXMzNW1JY1didEFJcjI1cDhLK041ZWFtcnlES3ZDZmNRQUJ0bUhwaVlzZ1RtSWlOanBoVW9McUNOOGdQamgza1ZQOG1yem1vZEFkZ3pUUm41ZWlES0xDaW9SUitubFNhWXhGeXNMY3VaODBhb21ZejA3dzNTbzJDWjk1bHFFQmIwSDB3OFNnUjZPUzVtelBrY2k0eWp4V1E5eXhJM3ZNbmpYYjV0ZmxiQngxWUJNYXo3cXVjdUdGMnpKa3BWQWhhRGcyb1lxbkNHUW40emRmWFcyRS9DbWdOQTRQOUxyQms2NFVvdnlhU3VpVkxxN1BMc3ZOZmd6U0hXNTE4Uld4TWtjbzYxdlFQb1djMHlTZHJWd3diemMvT1krWlBXVFdXa2p5NEF2Y1lqa0Q5by9CSDA3RjhJY1JjalRKKzlqYml2STRIYnRNN25veEFPYms4VzB2SDg2MVF1RVJUNnJkWVBrQ01mY2JrRTJxSlFhcGVFT01zbmF0RXFZOHlCTlVpc3UxTzZLQU84RlQ2WG9sM3NOeXMrY3ZSeEozT2d4cEFtY0Z4Nzl3RFh6UXEyc3F2Nkx5cVZsQithWi9tTjAxSnVhL3pQZmpDOURhZ1ZDQ0Y2dFF5NkFpWWJjS2FhY1VYU1dZRVFLMFhhV1hyU2NHVnBveENLTzVEMzUyYXlrMXd6ay9Mdmk5eEt0amwrM3JUbXdxbno3NWtGaVc4TmlsQzNnVHNGYU5KZStpMXppUlIxNkFyeEo5OUV0elVUUys0MDVvZktndFdtR1Q0RGtYeTNpMEZWRWI3SzB0K0ZkL1NvNDh0K1RCODNCZXdBbTFMSEsxbTBoZzFFcHZML2J3OFlsQ1BrNTJZTDh3ak1HYjdPc1pxdXpMWVBSQlhlZXRMWGFha0xJcDllVm54VmY0enp1Vlo0MEIzd09XQm1zY0k5aWdjeXF1dEN6a1ZrS2xNdC9VQXFXSm1OUGpYOVNjaTJwdldpSWhHc2M5TXBBM1VLOFExbzcxaE9aNlpBRVlmVmMxMi92Z3NEbzd6YUZXZ1hMVGg0VFJvUFVHRWdPYm9uY0pocTFDdmZXa2xEU1JsU2FrZW9tcitUMi81Tm5RdTRKYjFTZGRWN3daUU9GT0ZyU0dqcnJER0lIT0hTbE4zSmRNdjMvMFBVUXhXcFJXVWpwTjhudWh5eHhuSzkvOGpLd3psME1xeS9zekZ4ZnBibG4xSkJpa1YwcENIV1Ixd3d1REV3TEIxSkpRNndxRmhWMXBPMXVSb3BHcjgvSmpWL3RWcyt1ZURNTHcvQkNNblJ4enF4M3QyeUlIckxoWmhGclNWNnQwK0hXekdTWmZ6bWQyN3ZzVWhHbjJGbU8wTkRVQWJCSUF0a1RROUpxYXkvd2tremNOM2tROUFTQzY4VG40VTlNRDBDWTFJR3BNU0F1dXQvQlpscXhLaHZSZU9GVUUrbm9YMU1OMlNDNC9ZcGpmMk9oa0R5a2xMT04rTDQreXFWYkpVOGRodmM0UW8zYzF5MzFidU9rT3F0a25INEFseEZJK2RvcnJjcmpTYVRvd1ZNNlF1SXZNNEpyZGtxK0pDNFlxMWFZSWM0ZGlLRHFnSVVHa0QxVEMrOU5jN0pJa0g2S1VVZVlicjREWkpHTzVQSFcyL0M0c2VFTGRGNHp0R0U2SGIrSWV4TE8wb2Z4S1ZUL0xPRitXMldvN09MSFFPMkZ0MCt5MWlNYXRjZ1k0ZHMzVm5vNDg3cFUzb3BCU3czWVg4aE9BWUp6YjM4cEs2M2pNVmlkZVJnV2NtbmZ4RWZ4eWl2NmxzcmNoQXAxaHR4a2dqMUFyUkNidGRNeEtneWhLRVYyYWFaSURhWEE5ZkMxdGdFamJJbnJIdE94aGk2dHNGWVhOelhGR2tkS2VUMWdDYkRPTXF2S1VKc3UrWGlnTWEwdHFOMXVlZW5RaTdXZXBLV2tSUUcwcFUvb3JxTFZVTDFHWUlITERzYmRWZUtnTmNqdEpUZGljZkY4RlM1WW81SVRzNkV2MUtyeEJSc3lvUDZZUGo1MDFUN01CMHJNQS8vS0hxcjlNaWpEcXhOZjRzYTI5UGprVlhWQXU3eW02SS9KRWErb1lOYmRiM0lLS2ROSi9tVWdPVGxrV0EreS9xSVd2Z3JvOUZCdDZKc3RReS9VMkt0N1daQTFlMGRJckttRkVJdzNTN2ZmZ2JJZHRvT29GUlhkdFFncmpiYU1BNE9jR2xlRVl1QkZpOUloZHo1Z3NQYm4waGsyYlhmRnBBS1F1U2pJNGo0VjcrRE5YdXVUV1pnV0VDV0c5b2VyTEdSbXozNW1zS3dRdC9idVlNd0dRNEZac0tDZHNkaG53Q091QzNmcnVHRHI4eHJLcUxDRHFDYmdvVHNZWHJQdjNRVGZQZU5uMTByb0NQWnRYU2RFQVJFQ2xyRldQdVlKUWdXcUdYVzM0Y2FxTVQxVk1tcEY1MXFWeFNISi9wZ1kydkhoVlRPa3g2Q3lNTHl1VXIwaHJMNmdOMG9XeXJYdlp5S0JJb2NQZ25obXNXaEgrVitITFp4dHM2czRNWDBXOG1odkpLWjR2ZGtrSXpTZVE3bTUxaVpjdzlUMzFhQ0hJYU93dWxPd1h5QWVwZ0Z3VGw0MzFSb3c5UHFnR2tPREJDdk9SaFhMSlM2T3VLMVlJRXRQampSMVNEVzFGWjVzNGJvUFlWWnRIUWdEYWlSN09BeSt0N29YUTZPaFg5OGVRTWk0akpLSUVIcXdTbWxaVDdiU3I3QXBWZEhkcExRNEx3dXFKQjBSMTdrRmR5OFJMVktvdjJuUGhEYU1nMGxBNDRpYVJjZHpSbEJOTXVBei9RMjVtMTdNM0pyQzNRRmRvcGdBTC9CR1k0cndOb1duRDBvZFEycU11amdEQVdieHFZQitUTU80d2QzVjl3SWpyYkhSdGZQRVVwOVkvUGtyc0JydjF3Mjh0YWtOUlF0OWszMTV5SVZJTDBZNEpmVkx2SE5Dek55ZHdHbGNvcytSVjZwVlFPZU9LSWlnUG9STU5ER2NEZHVJK2Nnay9pN21McUtNdmcxS3hzNUtoRjRaS3ZBVDdZTklFZHZxY3BNS0ltbVdFZXg4YUIyV2I2cGxKbmVFd3N5ek5jWnBqS2VDdS83RGxUSmRNZHB1SGRNZ3V5cFg5dERqTXR5bGhEcEZnSnRRSk0wM3VSV29DMCtIb08yWWZzdGZQeUw5a1FhMFp4TVVRREdCSEJQK3NhQ1FlblR2cS9MRXBycFBRaUJIMVV3ZGt2OXZ5R3FndW9aMUx3Z2J1WlBBRmlOaDJpSm5lcVZsS21JcVIxYmhsaFlsYmVuSVRJVWEvMmZxNXN4T05CN0JLZ0ZQQW9ldHo0SVdDREYxVjN2ZWRIVUUvWkN5V25SNEdZK0RPWkhCQkxwa3JlUTc0QkNjeWVkRlROQ1ptdkZmUUV4R2pvR3F1cUsvTVFaNUpZSGlQdHA2MTNLN2hJcWhnQ3c5TGx1dzlXYXBHS2pwYW12YksvdVU2RFZzVTUrUTNKWTRUSCtDbW1hOWdLWjNnNVlmUWVnZmYxQUlaZHFNQXZEbWlqeElNY2daL3F2NmU1NDRJd2pZS2NkUitlUXRiWFdCQXZxdzhIQjJnR0VsZyt6L2MzVmNCY3pBd1pQSG4vUXh2SFBOVXUrN0xKdE9VYmwvcXFINWViTVVuK2pWVHVJbFMxc2IvR0xXOEpzOUt4ODM5WmxRc09lMkgwNEZUNEptUVNMOFcxSzByNXpiblpHVEJ1MXdmVzhOVUUzWmpLa1NoelpPSmgyNDJJYUhudmp2T3ZrWUZYL0duZ0FSZjlJUzk1WWhaamkyeWk4TkVRdDNxTjg0YzVqL0VXemJUYktobE1XRDFXQndKUGNCalB5aWFzUG9uQXpGTmhGT0V5MC9PQ2Fzb1orek1nR0ZBc1JPWVpBSDVmM3lZRytNa0dUWThSOFRNcnlaRjNyYWJNOUE5QlkxOUNnMDg2SFIxa1BTaVlJSkZXWTRkVHBxTGhKM0RLemNDQUw4d2xxYldHcVRoOUFkZ3VyTFhLOUxHR2U5Uk40YXYvRW5TRjVjeWg0aENZYXh1dWNMK3NaSGhPVXIydGRjMk1yWEhoWW1pbEJQZjhiWW9iTXpZRUVZZTJJSDJlcWVubUY0Q3puMnpTZEU1WG9Cbis1TGIxZEFkQXpRaTFWMTdwTzF3NmI3WHVrZnN0N2o3REJoUnp3eDNmZkRYUzUzc21nMU9kbjJhN016cHErbVJxUkhJR2lvVTNCWHR0akJ0M0VDT29hdzh5NE5oSnEvVDhUTVR2SklGRThWemFhVzdoQ3dJV05UV1JKY0R3dFNpalFlV3dXb2EzU1pqQkxkbVRTbmh5RVJJTE5KcXFlQ0FTMGsrQzBqUHk0U0lBYnRwMEFJNU05YlZZczd0d3NIejdCQ2hLdUZTVVFlaVdZK3JiRWxrQzZ0ZzYrWWJLN1h1bnU5K1BRRkVLMUdSMUtTeU43ZmFjbWtJbTBMZ2RLSXhpc2J3MDRjS2x5QWNJZ0swTldTTG1WdU1iSEVSd2V4anRWYkJvemJRcnhNanBCVjV0ZlZDcjBnREZobSt0bUhXbkwrbElsVjZXajJ3TWFSaXBjZ3ZCdDBmekNsS1hSc2V6TkxPL3RYVFJnWEVxVnFNRmdYWHAzVnczaFlVSEoyTThhejdMblYrSDVIdm5sdVpUbW40dDdmcmJoZDNYMjBUbU1YYm9vSGFRdUE5dDQyQmJiZ2xaRDVwcndGSEdRZlZJbGQ2WkxvSCtrWmltWFlsRStRWTdCdVVkejRkTW1IZGJ1Q09RejdXb3d4L3ZQRC9tRFMwcGFkalNjTmpIVjBRUXpIbUtEa0t6VzJiVDRLamo5NkErOFhpcm5CRmJDWU1vMWhuSzBqK2JaVngzWk9qdEs5ejBJeTFwcUZvYXBBZlE5WHFIS0VJZDd3NjVwbVBPSENKaHJaNW5odWh3OHZCWjBrb0FIVE9xcXRIcElmOXBneTE4NnVUdldTQU83aUg1U2ZiMnFzMmExUk1rSkg5Mll0NGdRaTI0WXZ6S0g2Z1ZITVlqbEQzSGh3dC9BNnZpUVlaSjhOMi9zTFRkZ3o2QVd6QkpVbGl1UmdScWxaU042WVFraThsMUl0ejRqTFZTMlBPMW92TlltbzJZNGE5UzlVRmFCTVkzNUdBZDIxN014L252a3Y1c1NiamhRcVJ0TlI0a0Z2UWo0MWo5cy85WlQ2dzdjZWJ6cEljTDFpbk4rc01aWW91cy9tSXBMSEhQVmVEREJHTVl3bmJXa0lSSEw0enhQT0Q5bUxENGhMN0dmSWxOUEpQRFcvcnp2YSs4M29rSXBYTjZxN1JuQkdra0taR1hHQkZTbDAydTN1cFVwRzkzOG5hMm1Ub3JEWldibWt1ZXRUK0l1WXJTVWdWWEdMaG5LcDk2clVWRXplNE53RFFDQmJVbVRwTlFiMHJQQkVDS1J4bGprZ3doQ1NjcVl6MmUzZ2dRMnF1VnRwZzhHVDlmdDJqMnRXNTNzcmlDR1ZoSkdnOXNrS2lxTFlUY085YUVNVzJTT240SVlmelhJNVlRdGJ5Q2l0RXRZemNydzBMeW9GaUhsbDRJVzc2VUJ0Q001U3IzSnN0RmRjNlUrVGtYT3hEU2V1Mno2dmZoS0F0OStJR0dLREdnOTlBWm9TNXFyRm5LdThRK2JpeFVtdjNjKzFJZjk3cDJzOWN5TG9Ob2l3eGVabU8zUmFNUUM3RmxRSXJENzJteHhrVFZ4NldDNVlhRW1sQWNrSm1jd2EvWko1bStWZ0RGSjFod3RFejF3YzArZjdONEtlRng3eEl1N3BLc2NVRVUwSWQ1SmdpelhWTUF4eUFHbmtNUnRSVFNmcjFpMlo3L1k0RlV3M3l0Zy91ZFF5UTR5ZTQ5Z200YWU0OTB2YXNjSWtwQ014WUVzdWIvV0NhOHZqTkh2OHlyOG96Q1BxNDU3cmpIOEl3NVFSUlVzNGZialBSVk56TTFRU3RRamo2bmtZaDgwRm5XcHVaR2VETzl0Ym5kbEhhYXlJZExlT1ZyM2tFSFQxYW1vZkh2SUdLUSs1cmdiTlR4K01xenpaRHRMTkYvWU5vUkp1bm5YUUhkc2gvbDI3WTdIcnFzR1Z1S0lCK1Jnek5VYnVaM0dnMUlpU0dXcDhlUGtqeFJGWElMdlRwVnBkRGtlWlpjVFc4T2FwQjY0L211Rjd3Z0Y5NWRXOXhJRWtURlY4bFlxK3JpcFhFc1N6bFRqNkxIdTdVaG5WZ2pEbkFmMTN5bm5UM0FsK0NWUHpDYVpMNEVFZmc1Tm9lSkdxM3doaDRnbSs0Z3FLVVplVjBDOU9tbFh5YWVJU2JIeHRiN0RoR2t4Rm5KN0Q5SUo5RWF1cUFvdXg4T3B1cGlyY0dpOFF2TDFocTBRSURaR1NtcmFyaWJjNlNVbFJ2VkRhMU43Vzl1cVIybUNKT0tlN1NOdmRaaHUwakxrY25jajhOWkIxV2RqQ1dxeFZBQWJOcmo3VGFsWFZISjl4WldoNVhrRjBET29qNW1HVlhhZmd0c01mV015cnlwT0VKVXYwa2Q4UzRaT1ErNHd0aXdNYUswc0ZaVk1zbjlmYXd4WDFuVTFGYTJyMENqcDBrN1FXK282OUZpZ3VqM2t3UmNjeVNKdVV6dFRZcGpad0U1ZVNMc1g2VS94S1BNMWlyMjY1S1g0QVRjY1AwVXJEY241RXhBL25wYndvTzRVb05jWWZaTHg3UkR3N0FvT1VpcDFUdjh4TzFFY0lIOStiWGhwdEdWbGJ4bTNsUTl2cWdpRnhaYkJWbThyd0RUNXl6MU9Ka21EbGthTkRUL0Z4bnQxMU1QdlRpK1B3eWVXWFVtNjVNTEtndk1JUHBsYzZaNWJaNFlIQ05YNEpiRzlVQjNJY0MwTEE0YTljT0doNzN4MEIwdU54MWRORkVTeVI5M2NuUDNtbVNJaWdpV0hUSm03ZERVWUJXVVJ2Z2JWSCtpTS81ekI5ZDQxNXlQSyswSU9QMU4rejZ4d3g5SU95Y3pwMVYza1lRbUxNY0t5VVJYZzNwSjVDRG5leDgvWUlYWWNsamR3T1VzbUNLcCtRdDRtcGFRNitJQUdHb1haQmc3b0VhdFU5RHhqRmxBSlJWSmdWZm9WTlZaM1o3Y0VNSnE2ZG1MT2ZOclJuTTVzbGJWYnpaRVFtczZTdGpDQmM2RUl3QU96aDZVdHdHbHFQRUZNU0tTU2VsMXRTUzFqc3lNUWFhQkRpWjdhR2JMbVRHeDBMeFhnUEV1dWNXTVZ3eS8wVERMdW9FcGo5Rkk3dG5RM1BnbW9FcHBqMzhXUFZ3a3hpU01WREdkcFFXWFhsajhQVXNaanJNOFJuWmpuaVM5NE9TZ0w3akx1SDE0dGFCVWR4TjJSMjBrb1pjSFRFWDFGSjJETFBnZ2V5NkVTUTltUmhsMGpzSVpOOGYvV3JoY2tseXFOUitFRUdyeVNjcFE3M3dTNGp4SlpaRFVKZ1R6NFJ5NmV2VGFkaXRGaU10WXpXSUQ5VCt0K2UvbzVacFdLeWhNd3c3T0NOV1BsbkprbHM1NG5qcm1aa20vZTl1SWVuNGlhSjBLSEdtNXNVd09vUnk5ZG94ZWhtN1BEamhTODhKNHIvb0g3ZTF2MWFTMklPaDdJNm5ZcmNGL3JhTGxNSEtETTVmV1pGNm80czZodiswSUdOTi9BRmdWd3lMZm9WUWkzNWcyMWxDRGJnZ3RhY29CTTJIM0w5T0FJaU9ZdTc4c3d5aSt1YWlTbktPdmhPOTFSS2lyNmlJZ0t1TzMwVFpUV3R6cVJYVTVxcEtRRXRGT011Zko0QzdScGFXck9MRmpVUDNPdGhPN21GUVl2NnJ2L2sxUFcxT0g2TFNsU1hraHlvU3NseW8vaWNLckdrWFlkWFkwV0RGaGVmaGFVZVpEc21ib3hudEsyaFdaenl4YnlNNDRDdU1taVZtSWtyQldiQ21GTEgwbzUxbGZpM3d5Y3VvRHNQViszWkEvNkFhb3VqZmdEZk5vQ3ZyTlZnS3VQVnNkdTNjNG9TaHZaVnNCMUxPN1FadUJOeUFpYWhLMHJVQXhFQ0NwOUVnRUFmeTZRUXRRb251amI2allrcWg1UUYrVlBkTTJxSHRDaGdwK1lpRVpMbVYxQmFYeDZ2SVBJSGZtR2dSZFVoYW5GbGNLQXQ1ZFRDQzk2VFE0N0lRc0lwYUgvdVhFQVNwWU9ZTHh2dTNMTHRRcVlDbDBhd3RQbE5ZcGJESEpFQ0dtOVpnc0ZMTGxDR3Q4TUgrSytJVVdoUDdEMUNtZ2IraDJnSVZURXdKdmt1VjVGY281aXhYS2VQNDl3bktReUwwc0ZBWTdLZC9ISVJqbXhPTG5tMDIzQTdmcUdZejBuZ2hhNWloK0xyZ3ZLdWh1d3lGcnR1bzZodmx2NnJ0Q2I0TXYyTitJRUlvZ2ZxMitPVGRVb1BCY0M4d0hIRVcxWG5BNm1aK3l1SW1wSjlrN1ZWOTh5YzZoZWlxMzd5MHNaQmJBaExGdi9LYkJ2Z3JUMy92TzAxd2MzZ09mRkRuZkZrbWQ5eUZGcXFodEU1bU5PY0RFdVdUcUlmTWxjQU1Xc1BPTSt6Zzh1c0dPOTgxZ1I3Y3A4aGJ3RC9OWGVaZVh3aW5rVmRSdDdDaXJ0UzlTVkNXK0RnNGZyTjNDU1E1cGpOSjVmdWFybDRkMXFpeTdML2x0S2s0alU5a001UU5YKzYwbjRTckw0UGM5L2JtdHRXbi9ScmpTenh3ZFl6SjlnWjc3ZytsVmk0R2RnN0R5MStSK2V2enBnSFRkSDNITm1tWmtlaTBsd3N5bXVCK3pxWkluMFcxRHhLSGs4Zy9CUSttS1ppcWlLQ2R0TDVzbXJxd21vYXJHZEdhSkREaDBnZGYzdkJEVGdKbUMwaHM2OUJ1Rlg4M1d3Zy92NlJvS0hiTEM1SkhQVnRCakx4d2VHR0dENFRzOEpFN1N1MldKcXk4TGgwM3BGRFBRRDZCdGwzMmpsVzVza3FOVjMySThweTJNYWFEMjFqYi9SUVRDR1BlNWxxRFVtMytGaEQzNlZQTERZWjZYNmxwcCsvZitjMHRPWGZiRk9jUThOUmFHZTB2VUZ5MzRVTjlTR3Qzck9LcmkrNzRzUE9mVGtEYzNEVHhMWStGS2NNYnkzYWh6blhnYVB2eDlpOTVtNnlwSWQ0VDkwUnA5TWpOTEptWU5tV1BsYmNxSHZ6WUQrbk5kS2NxUTNuMnZBTkZTNXExZnh6a1NoUUdVazV5T1ArNUlHWDJHRXMwNXZseHkwSG5SZnFISHJzVEQ5eC9LdnpNQ1NuYWZEaXFXYW5Gc0k1ZmpPeFpsVmFzZGdoeWtTRUh2b2EvMEJzYTJVV3BBNnIyMTZzYVBlWTlGWWYyb3o5bjRWa2lrRXYwUFZldkZkYk5melRteXcra0xpN1RPSEoxbmhmZGdISXVxWUxHSjRsaEh2QjRUcmVLM3cyelF0ell3OTRFNTNvMEw0Si9iTWRtMzVaUHdUVkJOeGp2b2pKakFOYTJxemFoMWxjdFVEc0t3RnhjYlBsTTJmbTlRL3lTY2xqRDlpL0N2Nllab0pmUEQ2ZWdoeHp3bkpjOW5GUlRXelVMcDkyeTRBNVJlRk16bzZtSnBqVk51ekVlb1FIZjFCVG1WZnJkTVVjbk1pNGlXZTZrbGF1MWhtZFhFVDdla05EOEE3ckFReSsxc2IxMHE1eklsbGxsYWdIa3JIRDBzZVp5L0FiYzJvN05pS1FhdlBFbEhjY3FuRzlLS0I3a0NhTTN2VWJvNWpzRk9tOTJRWU51UmZLWjBOdVZ2dHZrMWVldUhlN2JKT3hPT2ZIMkFncFpla2QrRCt5Si84VHgwTjFiWGplcGhpaHlSSFZ1QXdJcHMveDNJMlVwU0hYejlBOEdPQ1VPU1d4cnJlUEVoT0grczc4Q2RidmlaWHhYOEJtK1lwQkNPQmpVaFhycFBnNUYxU0ptRDNqUk55TU8rQmtyNk5sSUVidng3cDRieGZ2bWJQQ1NCaUNYQm5DTFhCcTdNd1I1Q2ZQNlhoNnl0NWQvSUlHbHlsaDVXT1JTckNJVGwydnB5cTR0c3ZFNm1Ec2Q4TWFsaFdUWVJlRVdRNHVHWGdPdkJtbkU1U2t4M2NZbEJWMzdrRVVDdlRPb05pVHFDMGF4R2JMS3dzVUxncnJhOGxGcS83WGlpM1lhc1BpaUswZElqNjN1NkNISG1NdWhSWUorUUt1SHJmMUFjTGd2U1ovNGo4U3ROaFNFbTZrYzRMMWN4Umk0QmhmYjh5bnA2SVRIUlZtUG5wUnBKNld3NGRSWGRxeC9DRjFDQ2UwYkxLOWFXaWxpWTdWbUVRdzBqNS85cTJ5RnBZVlg1VnBjcUtOZkJRVlR0ZTh5U1VrMlZhZGd1eStBYXBmUHBtVndTaWV0UGliWjVWNkliSmpvMUlmbWl6eVhpY2poN2FDdzVGT21XZFpCdUhIVlVFdkMrV3Z1a0UxRXZiUFJTcTNZVHdGOUFROUZQTVJsUk5zbDFjQWt0TmV5NExMbWIwNjBhQjdjZ3lzRnQzOEJqZEZIVkFQbGZRVjhnYWlEQ3hvY2lRdXBoalBzdDNzdzRYVURVbllKN296VWVQWThyMG9UQ3dRVVdpS3QwVkZ6bkhQSWd2WjZ6MEpwQTY3YytZeDV4VUFnRWZxRWFNSmdHYzVvaXE3WWhaZUhWNjh3N3VVb3plTWJRSlZmZTBlWStOLzZxWmlPK2RDc2Q2WGNQSEVNOUxtbWVScklzR0pHK1IzQUQwQzRzRHBGbmZ5OS9VZ2htc21acER0dXcwbmxJWDU0czJBTEVlQlFMV3JPU3FaTk1vM2k4QW9TWVRtKzJQbGNFOStSQnRSZWlHaGhBc0RLY0VzUkl5YjViOVo5bjQ3bHJYZ3FlV0IrTXlTNnVpVGN5QnhUWE44OEJiUy9VL2dLQ0pwZUhkdVVSMHc2c1h0cFE1dm1WVStSbnh1VVdOWGliUi9DT0NPeWlHSU56QkRIYlpTWkpMNVF4U0M0ZkQzVDY5T3ZlYlhlcTJOdTBZcnAyOUFSVFRhUmNVYVc5d2xhRDluZ1FwVWlvRFM1KzdmZk9aa3JSa0MraHBoTERna3BteE94RmtmSWtTQU5tYUl3R2x2aUVxaEFSR2JRRHRYaTZFckhtV2h5VjExWTd4MUtCaU1CR0R3QllpaVpBMFVyOHM0cnFIMXM0a2xpRGVKaEZqd3dBUXBPSjNUaWhNeDBnUGRzWGFvTGlVY3Rid1hEV3ZsR0RWMWRtU0tuZUZ2TndmZzlMbkhqeG5tcUlJVDhDNnNEdlFyclZVNmhvY2pxeTVlVzMyWC84cHVLMkdwdEVEakpVWG8rcVRkdVp2SnBoeTBEWG41YUwwUUdFMnJEazI3MXpDaTVkNTVEck52MS9HY1NKVU1ScStsKzVRL2FVMnlJcUdZOGNNR29qdUFxc0c4bk5ORDdnUW04b2FNWGtaM3JTck9udnlMc3lGK2FYRGpOc0xRNVk3L0N4TTdZUVk1NDB2amxVajJ5QzJRbkFIRGtZNEVFaForTjAzMG1jWXdMU2xIMVZMTTc4Q3VXNjNuMUVJbGpmVVlaT2J2VW1XcWlIVEpDQVZzOGlCK1lRYU1XaEIwZmlyLzQvVndNOU8xNDVLYkdEeExVS3RwYnQ0ZDllVzcxUDBGSjNoV1ZHSlRudHY3dnlOcytJQlh5WU43RlJ6VkhQbkh3b3JuOWV5c1BpSmg0d0NSOGV4ZXR1c0U4ZnRjU20vMnpIN053cFoyTnBiU2lDblRrK1VzVHFUa1gwd1UyRXF5UW0vMGNwK0tPVk85MkJFRjlkSnBNNmpaWWlpMUsvUm9yMHpsZXlsYjdRa0pWUVJCTlpOblg3emVSMVNCcVlZbUtZWWtNYmgzeHJwK2dSa3gydm1Pa1RoUGxoVFNOcFMzbmN4c1h5UWhGdW8yUjZUZEtRRzJaOXd1bTFHMnc3MktXQk9UbnZBc2dwc2pCSlc4ZU9VSzA1WEtoR3g0dzFGV29DdEtneVk3Vk1PUjRRWW9oNDRHc05kMC96Z1U3dWRZVFdISHFjZnhWNGxEWjV0ZGdYSi9JenppSUxweEZ5Nnk3ZkpUSTRzanV0MDlRWG5kbElCK1IyWFUrU1paVjBmWVJMQWg0UVdiTlBmMGQxQ0FBYnJIMG5McHEwdm0raXRHYWpMbmVMZTRMc2NWYWM5MWRlb3RvbTd4MXdBZFI0QU0xR202Z29mTURHMFhYb0xFTHpNQjNOVWpzYitnK1RGMmQxVHJLeWlRTUZnUGU4bVNTUXN1a3EyOXYyUGZRV3liU2xIdlJsb3B4OUdTUnNzdjU1TTZ4NGF0RFJWdzhLUldYYXNvWk5LY2ljWTZxcXJsaHhROXJwQ1J0WUhQTFpuMlpMVjlIUG9oS0crT25ySDl4SGJKZ3c2eGd0VmFvNEpOejFIWDRIZnJGRFJhZnU1T3plMnY3OVNUVWxwK2h2OFJtdlpvWWxQMFk3OWErcXVwOHJkVDdPeXdrN200c3luMUM1QkdKUEZLMDczTEhuRnNiWVJ2V0JNTE5mQ1lDa1hJVG1qN2dySXdCNkFpOVpZbEExVXNueHF3Y3VQOEYyV1FGRzJYSHFzaDkxdmlRUWVhTTZGVzNOT1R0UkIxeXFkV0RVakRjWU5hSHhnNmJnVzM2QmFGMm14NFlkbFc4clFZSTExeWNlQmNuVDNhdGNsZHkxU0VNU1NaVS9vTm9VeEd4U0xzNm1NY0lVVVV4bERyeHpOcXo0WjR6NlhuZm9qUURXZUdZTkJrOU1oaDkvNmN5VFRLNXZLOUFPaVJleUc0L2JUcnNwaC9YU1lyeDRGQmRVSUpzK3M5Q3FqUW9kY0NsR3prRzR5SDIwNUc0NkFPSE41dFdDa1RHVThVMU15endQMnRrcmFhajE0bkZpNUcyS21BdFB4dE0xSUhQeUN6OStNTlBHRTBkalQ4RkFmUDZyUGllVG5iaWpQK0dLVEJ1NmhHL0l6dHhZWFU0Y3ZHT2VEVnB4dDNTN3hleDZVczZSMTRwK1FuaXdyK2x5RWc4cmFwWE5OOHNqUGpKeUhlTW9QS3RoTUNJS0pJR0NGRm5RR1BlcTgwQWFnZlY1MG8yWlh3MmNkNitaZy9oN29uc3BIS0Vzd3ZMR1pCd0tCRmRySzc1WWV3c0xQUTNmUlJ5ay8zTk9IY0tuMWZzVkorRmJYZjRVWlRYbWZVQkxWS0h2UVR2d01LejhBVVJsVGQrNmxxWmxpd3pQMkFaUlpTeGZIY0hDRzVXN0N2MVVtQTZ5dUc5T1RWL2VqcVV6bmJKZHkvbXdXd1ZkdXozZkp1SmY2b1RsRyszNWZORWRLY2poVzc5ZXNPOW9wcEVVSm1TODJPQWt4azNaZ2lWbVBKZWVIbHlsNUhGcGpLdStVVXhwRjNHT3IrOW1uMmxlU0dMOG45Smt5cEdRazRVUlQ1bS9Yc281bFBUR0l2MGs1NENQeFJVaEhsVllVRlR3OWtxbjR5SENOK1pIYkNKT0dnUVZua25XaldGamw1S3M4Y2FGTk12dGthNGFuVm43bFRrT0ZKcllFT1hjWFJNRnJQOEZjbjZiaGlRVGd5ZVlXY2V3NVUrVnZGckxDQmkxN3A0TjBodWpGRzlSQU12OU1XWEhCZXlhM1U1WWlmU1cyczNraVBmaEVEcG9zcEZlSWFLSm5rV3RkeUtDZC9RbitiQlRPOVA0QTNTTmZucDBKMTVETVFHMVhRV0ZidGM1Q1M1R1VqWGg4cU9xNjVQeHpEMUdHNEF2cm1GYUZQRW9WbEZWQmxpc1BUTmdNK3ByK1BMTXcwd0Y1SXB3emhlc2V6cXhmSDQrVkNLYWlKazRJeDNSQjNtc2t0VWZ1cEZBVi9VeWhsRWlQaUczT0R5Q2tKbUJuODN2Rks2OWhDNDJMZFFURzEvSlpiZW9QSzdOM3NKOEwvNmp6TVlsUTBPT1J3bUpSQVZGVUdwTE1QZmVGbTVuTVUvRk9LUHRHVzJoOFRlNXVzbGFta3NKMU8rNWk2MEF2ZjlIZ2lZSXdIbVpQTnBJcFRsOS9TT2dwZXY5cEs1ckVWeWx0SGJDTFdla0dEaU53b1RLRFZMN3NGSThGd2VzS29kRk4veExYb0xFRmNyTFM4cTlVZUJVMmlZSzdQeEQ2QWw5MjYxY0lUT25pR1JmQmdkby9pVWlBcCtvRmZJc2wrb1NDbStOSU5DY0xwdldGYXIrV0ZBTHZpa2RuVUV4MzNiSHh6cWxGUFMyWmNPTHhmV3poZGFYWEpsL3NTUzNXYlY1OWtLV0NKcTBtQmt3dGt4YkZkSS9TU2JIdkJGcmtNcGIwTWRzYWNaL0ZGRWdRd0UzYUdOREF4STJIaFJkYS90Z0FxNjV0c0VjQWxYR1ZJb1l4dS83cFJvVXdZeG5reE1ocEpwVFYwSVVCZDhNSVNENnhkRGphTE95M0VNWWF4VURFamY3NndJS0l2S0dpUzVMQUxJTCtCRSt3S0FnSWo5TVM2cGdnUVdLcXpjWDJSWW51SUJzaUt0Zm0wMVJaTDlnUHFBT0xrMkg2QklQbTFqWm9vSUhtVERzZmlPZFJPa3pDNXVkenN2NHh5b0hTYXRuOHdUZXB6Z0VqaGlwaTFhQzkvaUw3Vi82aG51OUhFOFBMOVgxYTNkaFY3Q1htOW5vRjhjZ2ZJOUUvMTJndTE0cGUxakNhR0wrYkt4eERIRHdncXBYbU1oNzB5QS9taVd4WWV4cExTdGR3Nm9UQXBzZWVkNWtsRXhzRHBvOGEzS2NvdThDcGd5QURNdTByUTg1Vm1ScGpudGxXTnBYQUhOYnp2aVpWRGQ0OXZvU1FMbG53cVgxdEhOZlNPaUJxVEFobDRVZFRHMTJIU3NPUWRDU0psOWF3UzVDYWhXUU5uejVWeC8vVi9DWDFYWWhNNWxuWGdRMkxxRUN3UlV3YmNTbmZMaTJ2cS9rZ1pGYi9wSVBTL0VaeFlUQ2Jwa0VHRkc3VXZyREd0M0FrTENEQ2VURlhmS2htSUoxNXBZSkNzZnVWeS8rZnNQVnlTekhnMTRXeXFXR09ZSS9WQS84ZmozSGttcFc3Z2JZb3ZwaW5jR2dPSlpNY0VrcDY0UXF1UnlTVkhUR2pDUm10MDJwVUh4NS9BS2pMbEFCcWFLZ2hKZXpXYWxlektSekhFS0VnV3UvNTNmZVQ2NWdQMFQyUlR5d2J5ZFd2WkRDK0Rzc1VsYWRPSkVSekY2ZFlMbDBwRUFDVEtVNGFWN3FPV0ZLN3BrTFVBSXRXTXNHcnFTRnVoaGF3U0IvOUk3UlhmdUYwNzBxRzJnV3F5b2JpMy9iYy83RHQwNEtBR2xlSlpCRjk4WVRrbEJkY3RzeUFwelM4b1pIcXBKSXFPTWhtcDZYMTlYaEVqb3F0TS9mN0hHSkV3NUZUSFRJQm9IVXR5RXBhYjJNMTNHdDBaRkQ0SEJSQXdsRmlNQzR1U1h2L05LWjJLdjVsaWhYZnZwVGU4clpzcERkQTJRRmRMUElLWWRpZXhjYm40UUFtZWRmZlpTRmhDRGxlMmZ5My84aU5VeUdaSWkyYUo4L1dmYk9rVXhRb0ZlYzdQa210eERvYkMvbmt6VlRjZXV5Y3RNdzZ1d1pjTzZCWUE0Q2ZYZlBpZ0VLR2lROXZBOUgvdTJoUmRySzdPMnNENUR0Uko2OFZYaGFWR2ZnVGdKY2V1OHlielBnRTZHVmpIRjkxaUIwK1NiRHRPMzkzTWk0MTR5UHlFRTNTMmUxMlVhakVqNHpaMVo4K3FrQmQ1ZkZwVGR4Tmc2MEIxSXM3VVpDRFlQa3dETVVuVmp2V2VKVThrSTd5SWQ5clVzbTNCWmJLaHl6bU5zWHl4RlJ4VzVzRzhHdG5FSGNlODFsNEE3YVhheENjem82c2F2VTA1NE0yTzZ4cUpTL2JBUWo3aGVvdFRRbWoxVG1LVWJQTVFjNldSVXlIVTVna0pvK3p0NjlsNTd3bVVubW5waVZhNlkzME1CWnJ0VE11MmRNa2hOWEkyVm5hRklra2JaKzZMekRBQ2hpV3ZENnc0bVMzUUVSK3lzajNncnVEMnJQODVHZVRqZG5TbUNhVG1NODVjbnZPY0gxVEp6Tng2OFhFd0tSRHF3MHFzZGdkK2hkaVk0OHY0dUpoMjUzR0tMUEpyRVFpUVZaVEFOb01lSEt1RUl2aFZVQjJBWkY2RG84RkJPUUE4cE5zN0dySFcxcWsvQmZ1aDZtampQV3hVT0tWVURYek5sTUNtVHBVTmloZzhXSWllSFp0ejJibjRtaUpLLzQ5UEs1Z3RMcjBYMGJ0d1Aya2UwamZCSlJreWJuaXBieTI2WEFSN2hGSWM2a1paTGtreHJ0dmRRWDNWaWFCZWg4QWxVTEFwY0QvcW1oUEJmQ2NiL0JCOGRYcCtuUkRuM2xPLzkrd3Y5RDRya2NpM2I5M3kyNk1TT09SbVQ5ODNZM1Z0b09jaXlVbVJWaThoTkloa2lPOGZ3djczYmFxUEFScUJDZGNnZ0lFMks5YVh5S09GdWg5N3lFbzQ4a09aYVJMTkhQM2NDYi9PZ2sydmNQQkRFdE1DTFRNck1JNEZxelV0cEl5eUVFRjdKTnVYOTBNNnkyZjhXcEtFdHpwM21ObTg3K0lGUkttSmhYbjFaVmZWd0VVREFmVlY0RTRvZXMrdmlEdGZPVGVaczIvdk1jSTZYbVJ5QitZMzFSUGk1R0hHeDJVZUhzRDdvblJpVnZIdUZRSXdKN1NtQllCd3JhU05Hdyt3ZC9rcERFazh5WFowVFNoUUZlNldaVEhSTy9jQWdOK2hiQWdNYVc5QWxmZk10VzBUWjBjU3k2RjdtbWpxYmRSNFpyWTNucjZjWllFaUsyRFdVWFI1L201K0pQQUlwdTRvSjFVV3YzVnl4QllZcWtJWnFxbUluUVY2ejAwWWVOV3Q0NHVVdWpmUjN4eEV5TU1EdUp1aVlHTlZwc25QS2sybC82b3pKUGJ0SVEzR2w4NmRFTEZjNnQ5VE4yT2IyYUZGbTBLb3BnR1Y5YTFrdXdWZ1dETE9ldVY3YklYM1pUT1lScXl0NmM3dlpmQjR3bGU2ZXc2Tko4UHpUL2dVZnhYd3g5RFpMcGo4cWlGSDBxNTI5Snh3VE93Q2g1cFBqclh6ZUp2VFpwbUVsSzgyYVJ0QmFJNFB4MGc3b2srbi96djIrYjE4UzQ4WjRtM3gzWmVnSzJsMHNDZTR0SWhPZXJXM3BHUk5qWUVRd2E1dUhVdVJGMnR1NkJrclhZSEYzcDMzSXNFOVN6c2VBcVBCWjNsc2NMSHk3dDJ6NUEzSGs1UCtuQmFzNUJTVjZBVjdJQ1l4WU95LzE4YTU1NEgrQ1d3MGxGdHpwL3FlSnZGL0NEL0VjblVKQUhmaHdOUkRFM1k3cFJXcUFxMURDajF1cGhMQzZkOFBucHgrcE00TWxJUHBQV1dFMkJHeEZVT0xaZEpJVlFsTlZQOWRBNUFCd0Ivc09nZlQwT1NFNkhVK1NyZDFscnpVUGdNVGF0bmFQQjlmTWhEWWVPWFRabVp2SDlET1pKcmNWZm5zNGM3eFliT3IweW8xYlN0YmhsN3VRYU5JRDQ2T1kzQUhraW9mbHhRM3ZNME5vR3V5dmpkd0VCdjVLNm1PR0hhaGRHdWtTWTJ3TmZmUDJtcjcxU0U3RVJaSlpVZFZNWERaTUZaWGx2SDFURWI2b3AwN0pURDNOc3pPaEtNYW1FWlhSem9BVWV3RUpGYjhEb3U0VEt1bTBjYVZvTzR4bHE0Y1c2aDZjQW5pRUtYNDNKM0RqRE1VUUxOQUlmaGplVUFWNUw3eDE4em5tc2NhTHdzY2p5aXp1WW1hSVdpV1J3OUtYVm52VWJyMEJ5dXRCcUZNdDgrcStLTndxV2s3ZmdIbm53eTQ2UXFKalp1dU5NdFliWkNWRkduTGRSZkt6UFcvRXQzVEFlMDVjV0dxY0krZ1JSeU5IR1k2Z2dQRC8vWFVUUktNL1NUWUhNUWlEVW9tYmxDNDNWV2w1VVFIMnZrMUEvSHFWRk9zakhQeUthOFpWVzJlS2xSOVVFcGJYVWQ0eGc0bDFrTmFNUDlTT0ZTcVZKaWcvTjVhcTRqQ3krQ1R1TTNxMVNpOHlraTBoa0RJR1hKOE9YSkVFdndyY0VBUFovS0dYRXB0VThBQnFlYmNRbDE3bzFITnVBQ1dTcFRBd2w5MU5XWHV6RVFrOUt2bHMrdG5JWC9WK2ZiYllKWHk5M2VwNWZSQXdtMTBhbnk5K1hhSDE3VTBVNEs3MnZMSTJIVDhnSGx1VTd2S0c1ZGtSdHF5amxZWVh0bU5PRURWUitnRUZLcTFZbVkxUEdYRjl4ckVNcm55OTYvcGdiWTlaQ2lSdkkyTG04ZHpYUDhrMEV0djB2d0xNZVVtalY3ckxHKy9yZWRLUWg3T3ZuSGgzOXU2NCtEVzk1akdJTXlXUXVuRmM4TWcxSTJRMEwra1BPemN5R2VCS3FVSmhrWG16SHFNaXFGaXRpNS9TTmNQNVRrWm5xcWdqeVBTV1ZOM2hnTXhNNVFtNnJVMkhLeVJqYjJiRm9mcFNLWEg4ZW13QW1mbFFMS2Ivbkl1WXVqZW5DbHdDTEk0L2JKL0loTkVPQ096SG5SZkJNNFpTeXgrZmVsTzliVkU4TXZmTEtKeHRQVkUxRysweDYrRjcxeEF0Q1BYcGlpZW9la0ZnelZjc2RjMENqTkFuUS9aTnIzM1ZtcVVBdmFTUEJuUGxvaEs3NmwwWmx0OVJUODFONk01UWVnTE03WnJRczZMaE1TQ3pDcmJvZ0FRaTVIb24yMENOUzZ5RUptQnhySTR4Mlh4a1VUOXA0czZob3V3YkozcVNDVkFWTmUvbGFRa0FjaEszdjUvOTlRK3RiNVJEbGRrMlpGazdVOU4yai9DTWZXY3NJa2tPZm9MRUhLdUNUMDUrNXQybEdSMmpOV0JZVXpxQ2xiZnIyU2Y5WkpvbE9nbGlSQjBqY3B5WmkvcDZqT2lKM01JU3drNGRCVFRBN210emhzdjloZzMvekgwdzN0ZEptU0M0RjZxTzNCbFhjVit6TVF3OWF2bnZvaFJaRitDM2FxWTZXcWZ5MzcrQkc0aVFIb2p1VTMxNzVJWWI3NUR3ZC9ucVdtWVc1aDlXSG90aXR6MXBBS2U0K3BhSHp0bnZwRHVqVWRHdnFvalhZdm1ENERyQ3dRVGNPZzJVWUxZMDAvbk5kZGRTK040YWYwYVpCYUo0aHR5Y1RxZloyWHNXV2E2L2lhSkwvWFB4WTMrYm5CVjI2YmtndFBubldwY1VhSk1UNGVNNFRzSTRkRkJwb2YvYW92eDQ5RjlPcEJWSEEraktUYTBWSmZrMEl4WlZ2T3ViaXNBeW1SVXE2bk40QjlFK0NJcFZHVGd2U3BJK2pRWFUxck1ZbE5UeXBsUmtJRGQvS1dMZWZhcVFmUlRwSERDa0Mwbi9KU0k1VTFlVmxZNkdhVG9Nc0pyS3lkV0crNHRlUmJELzU5ZGRvNDdxd0hXaDZMN1hFRzV1dVg1N3BkM0xWSU5tRjg2Wko4QzFPRWZSK2MyUG9WM2NMWXFpbkJKQkZhVUlGZUtIU3FveWl4RkNzMnlhRGRQb3N1T0EwQzkyL3ZJNXFKZUZPWHJ3QVY3NG9FaVRab3Y1cWMzRWhTd2xEdFpoR3pPQXh2REpKdnMrUndmMkFHRzJuWVpPdnB6ekhHY21ReFBROUtMTi9RTENDZzljRzdnSEVSZlJKdXU3U3RiYnFTWWlkTkhBcEVoTDUyWW9LRlo4K0tDSjlWTExnbzIxanJraG1kME9CZEFUVC8zSXplTWhVZWYyenkrNXNnbVk2Qmw1bjBoOHR0bkR1VkpyQjZNTkQ5UEtmTFBKeGVwU0Q5ZHpEZ2NxN1hKcVhqTktNcFd2MXBCTjkwQnJkVmNNamdjVC9QUm5TR1BIbTdrUFFDbkRaVHR0aEpVM1FQamdlUW15SXVGeThoODhvU2IxMDlNSG5UOGVQNVpTZUwzSzNrTzlKK1VNOW5RWjVwRG0wVVdRelVvQUdSUGh1N0tlWkFpYjFmcTJuNkY2TDk4SjZLZVVsVWJWRWJSQml2N1hVZWtweENjdkdEZXNRYlJIdXlkV2xxdER5NVk5OFZvWTZOTmlvbHA3WHk0bUtzSVg5andvLzZRc3gxNjVTYzN2QnJHREtnbUZPL09yRE5GM1ZjR1hhU25qWE5OblA4b2JEY091eTZKNVEwUGdPZ0hrampCSVNPMk5oNXVQdHpTYlc0VWYrb2lianNFOTZCSHNjcXlNOWdReGludzN1eTJQakxSQzYzRjRPYlB3N1J3NDBwN21lNlRVekZ0bGFVRUUrWE9TT21nNDNXbDBWNmlFVkJqRWhpVWhWeENiUWFWRW1VV1pPR3FUREVSdmJGbUhwWDZjeDJZcUIySFhnNGdadWVrc0ZaRmlLck0wclVmaTQrQUZpRmV0SHMyb3FDZXVlTFJ0aGU3aWdrOGxqSEpaZnU4bWJvNk01RysxNU9tSnQzVHJLaHo1enFnMk1RTnE0VWcyTW8yZEJYRVcrRWVQNHcwS1NzOWdsS295Z1BFVnl6aUJaMmwzNHQyY3c1aVVJQWhaSEdCcENuK05DaWYwSFBKMmh0eGhSTVhyS3c0WkI5VXEvVkQ5aVE4M2JYYU1uTmhYUmdyWnFGdHpzWTkwM0x2WGppSWhlc2pCTXV1ZWh6aGJ4cE1EMjdqWEk3dGhyVXBwemhXQllMWlZ0L1dNRmlISmFxTXZrcXZieFFBSXEyeldDUGF3SGQ2U0pKVWZ5SDVhSjhaUHRGbmNkNnROSEhTOHFmenkzQkJwTGtNMUxRdWVMQXZRSVlvd1lsOUtWNXBRWEF2eUlZa3JlU1ZYMEUyTnpTdDNhTllFT0p1Sm9vb2xUcjBsbGZLMmgxZU8rQjhoVW1mbEVzRFhlaG0vYVFvd2JPZnA5TEtvd0lZZUJsZGhtakR3V0tZL2t2UDVwd2VlTFNEaG51VWgyWmIzbjJxMSs3RWk4ejI3L1ZHTW5rY2d1alBnVVp3dzVMNmZPaUhWaGVPZnRhWFFiTnZsMXplbWduSDlrSkNzeWZkZkY1UlR6eEI2dzlyS3k2VlhEM3p6enRaU2VqMjVQYkpTelpSV2lYQksrMlVvQzVaUXFtR2R3aEViL1FFcHk0ZWdqNW5lTXB2UFpXNTF1c3R3Y2VvMEtyOWlMUlczMFdVdFpqamcyQXNkMlpHclB6TzBqY3Mwa2t3Wmlyb002aU1mOXovRTNlaXFBaERMeWJDNlBEd2pCc3AvalV5N0tpZHN0bGtIbkloN05ucmkwdk5XdnR5RmtEVnd5S0FFT2grRHFteFc5dHJDUi93c1o1cjd3eUwrVWdNcEZRWlZORkNTYUtoaFVoU28wWUxpbjB1SXBSNkRqaEdJZEFLQVlTc0pBb3VPd3k5S3FRYVRHeU9JcDhySkxBNXVjaTlydzZmVktzNFJhN2dZVDljakJnQWs4ZXozV0czRUlvbkFVeThRVkNtS0FlT0N6eDA1MXZVNm9XQ1VIU094VUUxVW0zc2lFWkVvSmNnWXl5eDlMcXpsZVV5YnY1Wk0xWnJFUHZXaXNtUWFiaS96T0pTR1lTa2lodHFqSkxEekRqNDhOdVFoeXprM0owZVZsTEg4bzJsTzd0RU1nNmMwZTRJWHdscjRBaW45UEx1VDFpODM0UWQ0dXdwT2dJQ00ySXFOZ3B2TjBRaHNocVJYVWkxRXBGcFJWUzlCNHVsTXdrSSt0cllteGxpVGp1Z1Ntc2RNVEpiRVpSQXNBNzFWWTd3NGtacUZIYWwyTlhJajQ1c1dyd1M1YlBJdEdJcFVBWlpwUkhrallGOVNXMTdNTUppcVV1NW9Dc3h3VUNmTlc2SFJEK1BreSsyTE5rTW9SYzdtajkwczlGNWhTMUF2UjErdndIUkwwblVLOFVEN3NLUTNxaThNSVVVRm1MUXIrWEFVRDNralZtZ1FWbk50ZDY3UVR2TkFxR3V6VnpXVFlsL0FSa3RiamR2ZTUxTHErRWlFYmFIYzJVdWY3V1dJclZKTG56aUpkMVNLYm1JeFlKS0JXN1AzTG1QSm9LcGpxYnF5R0xXOWcyQU4vTnlESWp1cVNUN2RUazBveVk4WkhaaXJDYmM0YXZrWnp6TENldFBHK1c2UTJZdkdPSWk2V2JBbm9FUFA2eVJxbjNvSUo4MitvUU1hUnlYOEtXMGVHQjNzMGZNelBIckltRGRCaTFDWWxSL3hKNVlyQmpGQ1l5YTlOSngrU0IzbXExaGtIN2NUYUg1S2I0VGpRQW1RVmJDR0d2NEtvekZ2WnZBN0Yra2JxOE9mNzRhMHhZUW5PbVExbWRkWlJXSkMzWGtKZ0hOWGl2czB6Z3Vhc0RVQURMRVlBc2V0Q09wczIzVGg2cXdIQ0R2V0dRdDRpNFFvTnRJbTBIVzNJalZKdFR2UHdhWndRcXdrYXZzdFBwNzd5YWdmaDcrMW1STERmRXJHWlpwM0NsUi9mQmpOL1c4V21YelZQM2NBYlg2OGsrOC9EWUlGUWFZaFpYZGh5UXVoVzZHTVFkMTFEZHdtZUpjNE1wV2FZczk5V1lrNUYwQ1VWWUhrZWdhbTE4dXpibldNK05CSEVuTnRGZ05kRzFSNmc4aGtVVldKU1FjSjlDK1BHb0ZwRHVQU1Q4R3RpMGpWbkpkL3ZXbFpJTXhWVXhwWExtRXJKNkxrbGU1TlI2SGJjRTB1ZHk3ci9TdGY2QzBLR294OHJMazJ1RDBIYUdxSVo5S0V6bGx3bEZMNlc2U2tJKzVScEk2bzNHQjNSc3pEQldoR3YrMW0xaHVQeUdINGdjMmJxeFZiSXdsRGx0b3BCUSs1MUhjTmFhTWRqLzB5T2dhQkVlc3Q4TmpIeFRXUUZBWldVWDBOK0JIS0JFUGgwTk1Wc205aVNsUkVLS2tGbTEwc0NpM2YrM05qY1g3Zmp1cU5YVlVIdTloOTF4MHczUERzb1dIdHFHVmV4M3ZQajNRcGR3dWd4TE56SDJFVHphUGxsRlRnbXc3QUFweXZ6Z2lKbFpGS2pFZ2dIUVZCUnN5Q0JBL082RXJ2MW5EM05YUkNLaForMjZyRjVORElIOUlrNnM0Z2pBU05wMjNZSVR5UHd3ZzZDQ1hsaG9QQ3RRTVo4Wk5Bb09JZ3JmaUQvVTJSdExEUzVlVTBRa0krWDd1aGRwdDdtMitjNkhNcU9uVXZjQU9mRzBQTjZhTVBKZmdRcVJxbU5WZXR6c1IrdEpoZ3YvWkZjaGtlU2Vkemp5a25ScFZLek5VbGRVQVdMbFBLTHBKRnNOWmVxYkJPemFmWVZ5QnVLYmFtQkhybi9DbUFiZkw2QVJkRHIrTUJiTjR2THgwaDYrNEI5eG1vUFpMSUpSOTl6SFE1b1FaSnljU3RLeTQ1TkgrQzdLdE1sanhVSTlIM3UrTHFhNVhsTTA1VmlmeEpnUGhUancwLytoM0c0dHI2UG9BWGN6Rm5pTFNKWjV4ano4T1FPKzFjcWoyUml4QTdVRzgveXd3aDdwamJXM21KNXlpOFFpV1gzODg5UW1iRndKV0NUU1pYdSt2ZmxWcXJXblJTMmtyY0tKYkdna1lhamMxUzlvVy9IeTFSb2tvNGpqMzIrL0VXSlQySDRqZFVrZGs0M0QwdFVIdk5vWnhJS0dvZlpQOFJPVFZtbnN5S3huUTg1OWxTUFVlVTJKenAwbnM5eWM0c3g2MlM3U1VDMCtaazlPdnp4RGJNZW45WWVYbkNNL2pHYmw3K3NmbTE3aGx4VFcxZmJiY2lVdDhLeXJSSFZHSXFZQThMZmV4a0pwTHN0TDRDWVVxNFdidll6RUlnQnFEU0hmdnJEbGRDWGJZM0w3ZUhCOHZ5UE16alVLT0x4Yy9xNWF1OUxyYmx5RWlkOHkwOUV1dU85KzN3YkswQ2R5RWh3d2FRa3lFbU5zNU0raERrVjBZcWRJTUZiZWxoTkFnREN0VjF5Q2djUmF2NUVhOUpUbHBnZDM0c3NxZXRnaEpLY011MFp2YStXWWhtaUtXNVoxNXFpMDRoT1ZqK2JuNGFUR3dzUlFhc0t1T1ZaSWVHZnpmVzc2eSt5d1pFKytadGFFbVdGT3RvYWo4SUhTOHJtVzRUNXZwSjllMnRsSFkzM1R6aG9MRG9YVk0xWklaZ0d5dHFqM0EvelR1Z1BCUnZlNEJ1dnJETndub2FrUjg5c1UyckF4Y2JOTnlpMmpRb0JDZzhhSENnRmd2Sk9aNkpWQzZXMFptcHZkaGdpKzcvOE1pRVNFTXVwUkZ3NWlnQmdCT1Ara0JKK29IenpqZ1FZYUx5S1VVV25xMTVZMzUxU1o1cUxuZEtKNUloWE8reko0Nkh1MW9oU3NVRUV0Y3VVQjRUYXAvZDhPWjBVKzhOZFlaWUJrUlhXR0tnV3NEdzNuN2F5VjVqQXVmWU43clIrSDNySVRtazVkN1FZVkJuNC94QkY2ZnR2Zkk3bkI1S3Y4a1VYMmQ2TDVOdG1WZVQxSDNpUlI3akZOeWhKb3pJYUNYQ2wySEhTWk5zNWtXNEFrV3pQU1padTAvYnQ3Ui9vNE9hSDNSTG93MG5uY1IrcGREckdTQ3NvTU9zc2NwbG1SaldCZ09vMjdXajdDK0xnTTJWaUtReDFBWEFsNFdoQnNiOTJaUFJXcEJpdDBZS1R2b24vZWtCYXJ1c0hsdXlmeE9JUHNhK1VkYWpSRmxWRWRvL001dXUwZ1FwRm9zbGp2YmxQVXBxSzNYaVl1cnIyNWx5SW4xREVUdUlsUlgxUEx5VzhwVy9FT3hNdkVlOWVuRVA4bk1BMWJkZ3gzc052RkZOTzNBZDZoYnYzMlBMc0V6eWJUSjdjWVBncm1YMktEUE9Kazl3aDlQZUdUakdiRFBteXlVQWdLbTFMWHJ3RWQ1L2x1NkFjeEVqbWVVNElZUWdpZUlJa1JkVDBteENyWDQ3QmYrSGJlYXZMNHZPWVRlTGdBTmlSclo4eXhYWmNOVlIxNFMxOEE3NXRLMnRUTndFMGRBVXM1ajlZRXZROVA5eExxbUlTR3RnS0d5M2I1WkhTTllBSWdNRFRoc3lGWjFaa3FJeTc4RTFUV2xudkNvTHQ4TEpmWlcvOEFrOURINE1FSXpRY2dnSEs1MmF4NXdyNkVQQWtJcDVqNy9HVmYwZlJOT1hSMEJ6aXVYZHhaV3dHVE83OXNSVnBxMzJtUnNwS1ZWRXRiZ29LVnJKc2JRc3dQd0E1eG9CbE53U0FrenQ4eGRSOW4wOVZoSVV6cGNGMjBockUveERTODdONHdrRHZpU1VuanFiclJqbU9KR1M1Y0dMbjNjU283Y1ZsaHQxQ243L1VudGh3dFVRNUlQbmFwRE95bXBFTUhXYVdUTTQ3L1RXaWx2UUVIeW5iZXdqR3kxblRQZ0EwV0dmYVc5aGVOcXdWakR6TC9Eb3l0SHVLTHNkUkdITUNybU54K2dGcVJKNjFmMis2bkdLMy9xeExScUtVbCtWL3A5dStmMk8wWmJ4d0wzWk1XdDA4dXZvMXlWTzJaM0ZLaTA4N3BTYjlIWFRZQXQ1MmwxZSsveXJNRit4N0FBOHRudGFvS0ltbll5dW9HMVk2NmJ6WTZzczlQRWVteWZBc3VXdmlGM2hQWm9sTWxzTitiOThNT2pMNXU4V1AwMVNVRThiZjhyeCtSR09mZTZmaUVMODNLcUhkRU9kN2NKRDhZSm45Nk8yK05kS3MxUnZ3NURiM3A1aGxiTjNJZDNNV25QUDhML05Tb1J4d0tSQVh0WTVSSW5CQ3hKWTdzakN2c2MyY01TeENPZ1ROa2hJUnlsVFpaa05PS1dTOVdaK1RrS0FaS3RWNjhvdXdHck90Qm5PR2s4SzhHNW9RbGxEUXhUNHZObDJBSzNPT3cwVitFMFE5SHFhc3IxclAzTEMyZmpsV2ZVYXNrZzhVSWZ0cTRHNm5iSEtkUjNlNWM5a0JqRkc0aXRlY3dkWUlnMFppNmo4dkdoYkY3R2lZbWV6aWlyMXptRFhJOVV6Q0hKRmc4RVByUXA0Y3l3QU85c3FkaVJ5R3Q4RVJ5WGY3ampFaEUyU0NZVTJUSzYyeS93UjFEcG1yek00dVF1TXhwNS9CbkVWQnNCUHVTVWIza0k3T1BZWHE2c25hSys3ZUNEeTFzUjBERmsxSWdIbWlmeUorZ3VLT3lVWFNhcDJjRmRyVnRHOENvTDdzaENnckMxRUh1RzR6TWh4aUgrdmErb3pyWGdvMktLcTBqLzhwcXgrdWQ0L1o5S1lsdm1hR2l1OURSSnZ5UTBhNlNNZUl6cHcvTGllWG1NVnNlbmd0bkdZRnFCYUt3YnU1cmFPZGgyeVEzTDM3TUcrYm1CbVpvZmlJL1A1bnIrY0FEdzdrcmdSUHVrdHVka3QrUitJWHl5b29OUkhFcGFyR1J5STBXZ29uWWlSV2dqSkNzVzZjL1d3VDRhNVM1aHdYY0JremRLT3RUTHVxOXBhOUdFcDdieVBJckVaUEsyZi9TcENxcDhMQVcxRTRMNU5CYXNCWkhnWFhWemRQQUYwR0E1YW9LUjVER2xTUTA1L1hDWHZPc2p6SjVSUm9qQ1Q3dmJIVFA0YWIrcUE4VE5ZbEIyZThkZnR2OEtETzV0WFEwL2UyZlJEUGJ3YStaUGtYc0p1SnltQzh2Mno2cElkZUVIaU9pWmJEbzN3cUtxQ29ZZm5ZR2xpVFR6UGZwL3h1dCtzSllQaGdrN3p5ZVhsV1Vsb3A4WnhET3VMUC9DYWZaU1NJRU05M0E4OFJDc0V4OVk2WTlaRkdKUzFvbVlMN2taOWpNR2VmR0pBTmJqbTlGV1dCaFN4UG5QNUhVSHZDV2ZGb3RwWklBajl6aXVFL255ckRVTmg1RCtXcEc2VkJhaUdPanVzU1N4a1p3QkFnZU0rdUNZamU0dGdOcys3RHRwZjZTZGIxS2ZuMER3S0ZkZDN1K3hlU2lkcUlDT0lJUlRRaEpISENQK3VrSjJ2b0hrbWZ3WXZGWG54VjllRGczMGRTT0VSdVNhb29WMWc5UDc1aVdWVUtFc0s2dHAwSDRzWG1WUEJPeUQ0VkQvTGtZTE8xYTdLUXdnMTZEMUNnVmdrZ0E0ZjNsYng5SmZaOHhvU0NzSVdxT2w4ei9MTHN0MGE2UUlpZDY3Q2tPdmlBeVlvOW5rRFV1WHZlZGRuVWwwcDlTMG5uaEg3M1RudTBGU1ZtT0ozcCtBdHRYOGRFSWZxMG9TMUFLQUMydFZBa2RqUkc1Nm1jc09xa2J4VzVJNEhhdnZtK1BORW9CcmExMFZBRnFkOHRCZEFXbnpGa0Y3TFZpY2svOVFOMlRacVlXVi9OaDR6ai9MZ3VRbzFIczVITVVld0Nzc3h3cTNiNlJsRUNNN1RpaWM0WnN0YWp4UFBqSHRmSEZzcHJKZWhwaEJudnRwMlpVQitJTWZsRnY5Ry9GdHIwMU5XNnZsN3J3RmptUDVNMVdHQ3J5U05MTVZZR0lndW1mdm1EOFQ4Yjg4dkpsY0FsOW9ZV3Yrd1B3NnhCckhCTmx1ZExiZEVWRU5jQzRzYVBMK3huaitWQXJOL1hoOEZ6N3RnL0NaSFlFV05ZT2ZPS0FPTndCNngxQU9IUHF6Z3JDZFQ0emFlWjlzTGhDdlh2M2NUQ241Z2J4bDhWc1RBOExhLythdmJadWdJMVRYazFVK2wvY2s1UERrd2lkQ3FJa1N0c3B0bFNaUStsY3JsclI2SmVOZkNiL0JncjlLTURaL01Na3FFejI5VXZ6RHJ4VHBmUlZqMm02TGVnODdIcm5UaHAxZE4rYXR6N1RhNkpiUkxxUUFHZUdrRWJpQWtGbmlaTlFud2xOc0ovbUlxRzU1SXVBY3ZDazJRWkN4N1IxRzNQOVErMDZVV25Rd29TMklObmtGOW9oL1Z5Z25UVGVHalFYTlhHaWVNZk5QenFmb3F6eTlJaU9YVHM2MmF5VEllMDVKNDNvWUR0SkFJVDNvRS9EVjF5NWVPcTBKaHZZSlR5MW5BZGxKOEJId0g5dVRCelBYZ0hpNVB3dUNuZ3duRjljbzB5N0FMbHF0U3RSWExTeHlTSVVhUjZ1dnI4M1BSd01XMXFBZUZ6bE5VMFB3T3NETkNoWTI3VnQ2cmdodUk3bU9sU1VxR3hrRSszMXBVWGNKcjlYd0VBbHJJaDNYNW1FTHdJTVMxZGdUNXEwUGl6ZVlXdmtmTWwvVkVJeGtKbGlLOXk4UUVMQXFTVkl1M01ocmdqK2dqa3BuRlE0QUlwOFJHN2NEOFprRW1pbFhrMDE4TTZ4TjB2WW0vVVZyU3ZWK3I3QlNBVnhVY2ZqUVhnSDdsMlJCQ0pmcHRNUmRGMUZrYkwxUjc2OXhueUt2VVdvZlhVZ2VXaGxidy9pTHNjRTZFL2V3MEl5T0RHVlVFcXdUK0ZXM0o0YW55b2pVUnBwTnZIczZWL2xMN29qbUVrYlpnOU5uVnJSd0MvR1JZMjd5QUl0WUx6MHRUa0ppSU9ZbjdxeEF3QXBuckRjWGlHZ0g5eEdpbkIzWGhYZU03T3A4aWdNZ1pwOXFZY0lRTzhLWHpnNVpTOGVtUVJvZUcyU3g2Z3I2Z2d5SUhqRll3YTlEMzJNd0E0SnhJRkRiYmVaZUhkd1JLaFovaWFHVzZ0RjQvZE96bzd0dTFaQ0I3T1EzVVlQZnhaMFh0bjU5ZkZBR1h6d0pWUkZ5ZnlTV3I0ZUR4WVR2emJFdkNTaXhjcUlteE0yZ0lNaDB2b2ZET1owamNsNmdtUmFYZVVWQkdZbHZwRmJFV2lDRklmTjFoRk04MDRmdHN5UUtPQUJITVBjVWNxSVhRa0FmTkNlSjRIc0IyMHZ1YjBZeVg5TUdnK1FpTkpVckU3Y3dXa3I2SlY2eTlCbms1MS9xemJLNU41SXgxZ2xKTThvN1VsN3daOHR6THhsMmRxTm4zV3MwYll1dC9NTlA0anI5RjJtRE9Za2dmZ2NWcWJsN0FRRW5STlBxOS9MR1V1WUpaL1FQejZXZGthY3VjKzFNMlhHNFpvZEp1VDJLTFExZ2VsNXErU1E0bFFMTHpraHBkcVptVk16ZlhyOThhVjMrNWZ6YkpKSTBQN2trQzU5MWJjSzJSZkNlcHNXTloxM3p2Z2M3NTV1ZUVOd0VJNk0wWGk4cEJaZCtrOVF4K2JnTXI4RmpWcEoyN0srTkd4ZHlkb0o2cXB6VEZzQTZVckEvaW9mdHBqc0ZsZ0ZCdmtnWkZLNGIzVXE3VUJVSkY4LzJTeldTNnYzUXVsOGFTZGdFVk1reC8rQzE1QUNseHY2YmJEM0d3b1FwZFNFRWxiNlRoeWgyQjVuV2I3bzBSOEJiZGRqbWlhVk81N3BXZXpXa25TRm9wZzVEdGMwSjVYU2tuOG9OWE9LbDZoYUwvR2psVVBRUmxpY1FYUi9vb2pXeGtWZkVCR0FVVDJDZmNEQUFyNGhhQWJBOGxlRGdmUkhBMnNJMEkrOXV1SUVxN1dVZ1lmRG0rbDlmbmZBVE9oWndQOER6TXNwVlN5cnJsanhERjE5NUc3Y3NnaEZwWUZRODBCRWpaajNvdTJ5TVJHbjlLN2NyQU5uUUZGQ2IxemxZSFpobmRNMUVRTnpCaXV3U1ExV3JuemZiZE1jSzFhNHNaV1IrWGtab1JQaEZVZzdSN1d0WFFYckJwbTJCRjAwMDVJREpTS3J3ODRCZVFUc01BR1lVYkVVREJtNGg1L1F3MklXU0IzTW1tSWYyamI4SENHYjFhS3EwalVrTHhNcmx5akJGbjJ6aWpMYjkyeVFtUGt4TVpnei9QakJicnFYNTZQdG5pMGFVVjk0b2FCRU9ZVngwLzVyY1NXNHBSeDJ6QU1ZNjJPTTdXRVZ0WE1tU1JsUkhRRWhlNzY4V3BRTjJGTnhMV0FUK0c0UFhmTG5qMjNhd3I3OEtxUTFwSVQ0OENKcHVOZStESnFyeCs4WjhQM1hVdTIrem9XZHBoa0x6eUhia3Z2RkN0dmowbVNIUFhscWlIT3BLSTc2bVpMRWNoMWVSc1JucEk1N3NDeDA0Uk5hOFpiZm13bVhvR3RkdEJQUDFQcUM1azNvT0tlYWExenR2OThiM0wxZnZLMm0zMW5oUTA1WlF0MStxK1grMDF0Vk9CYlVUbjQvaTZTcEZxbURDKy9NU1dzeHRJRzRSZEVHYytCemdoUVo0ZjBZWXhQVmlRWEtqZ0Zvd2dXSWMvcWUwajJIMy9YTWJRR0ZRSFNSalp2d0lqTmxSVkRUNVluQXc3dWhnWnN1NXZXUi95NUkwQnBScXV0U0pvUWZOdDhuSTQ2ZkhhV2Q5S0JXZE40aEZRK3RrMUFlU1RkdU13cEIwUmZXTDlQOWZoZlQ1c1RYdXJwMVJjOW5WZ3N6RFQ5bE1yM1MydVYvSlh3RU95MWxBemJOQUk2eXB3Y2tCQVJ4UFZJTXN4MFNXSmZISmowMldhRnhNRDZBMjByNFNCcFpWelNxbDZRU1FiaXp1MG5rT0RlZ09RYjNnVGZTQXZCbW9uUkJSMjNqeGlIbzNabUVYQmhhZG5QWDNiaVltWkZ5NHdIMnRvRWpiZ1Rmckswd1ZkNGdQUHVhTllMLzNWS2FjUzJYWmpuZExyYlRoZkVVaEVPa2paNHlsZUgrVWlQMkhoZlFsVUlBZXp6dGdXT0g2b0ZLMGkyTTZUeko2NkZaeGs4STU2cHpKNVcxV3pBbG83SDNLNkJrVGZHSTVuNGlibTB0Wm9BdzJnY3VLSUE1RTFQdDZkc2tiTTI5TkFXODROUlVmUFlGWlNNT0VnbGtBTGkvMTVtNGFSZXpuQUJPTk16SWhGbTlSUG5VMlRva2cwL3QxcHh0dm12dXBMQlFWL0FMeWNsNUhQK2tQaTg2OVJIWFUrR2RBRnBUczZ1VVpBUTRIbmF1RGZmSTdrOUY4OThsQVExWUVmcER2aENMM1VkaHlBZWtENW5ST2UwaEJpazFuV2MyQW1Pb3BNaG1HVkpVR1BtUjZNU0FtRFZTaERQRzlSRHg1MGRrODhTdFIxN0lUTUJZTDA3NUpnUUVRdHNEZGJYSW5yTGZEYXBrUEpGcFRWd2d3NVFxMVFMOUV3dFhLZEZINS9hdTlQRld6cmt4SURwQTJzb1NjODhxTDBPci85QnF3YVJjZUhERVBwOS9iVU5NWmpuQVVKbjA2eTg0VWpUU3gzbmNUanJDWnFHbXRPTDRid2w2U0RydnZkMHF6aDlzUHBmNlZzRnVSd0tCZFU3ZDVybXVCYW01ZjllU0RVQkRQZk1YYW1lSzNBdUdOVkFCTUptVDlremU4NEdUTU5sNk1tby8wWnRlU2xSWk5OT1NpYVdhZldZeUI1NXZmQmVKQm5uRVl6dTZ5VDdOVmQ4cmRwMnBpNk5JWFl3aldZRzhwVDMrdmxVRlorMmJPZE5GeE9tSHlwSzQ5WkNtMjN5dzhZbVo5QVM5eXFObkdPaEVObTByR0JZUWlKYWlHWDYwY1FOMjA2UUtaU3Q5SFBmcHRTUERTU0dYMnNCR2NZaGVrb1NENVpsTHhBdjhmaDRBK0xXZmlINFhndWtVbzVoaE1ja01rMStSYS8zQWlnSTNBQkNsZHpoWFh6cXlGcmViOWZZaFd5UUpibTVvejNNazU3SjdxeUErL20zdnMwYjZnRzJrMmtINSszOUtpMlFuaVBKcDkwcjVHeXZWSnUxclFqL1ZLNjdDMm43VmJYQkN1YzJ6OVBJWTVwNlBUUWtTbVZ6TGdKNjhRR2psTVZnRmNJcHg1MEZoSGZ0SnZCYkttU2pKdFppNVExVytaWnpOa0dnays5Mzh0NW15VGZTR3laUkhmZ1VmZ2pqYVZyVnhoQ21NaGFsYWExUXlDZWczNWZuZjBrVDV0OHEvdzlSdEdoUHh2eENqelE5TDVRSnVncDZYME04QUxGOTZzNzBQYksybnFTRnJnQWQ2eWlqbmZLTzBxNFJrcGM5RWFxRUpNUTZlUlpDSHllc1QwaDZrNnhlNVdQYjE1Q2lpY28rRWwvNUFLS1UwU1lMTWZwWmdKaVFpK1hHaUhSZDBTUVVkREdPR0hrUUtoeTJTT0o3OEdGMzJESzZCQ0wraElFRDJOQ1pyMk1oa0VDVDhSa3JGaVc4WVQxVHJheGEyTUQxQ3dITHVmOWdwbVhSY0xDRzQ1L0tpeXNOVVExRGd2SUNBUUROK0NNWkZZRktIa24rUnZzTnpZZHFHbU5zOE1rcThLeXI1SnEyd3ZFVy9SakJqK01tdmw4L2Zmb0VRTDFITUJZZlZaNHpqY3BoaWZjeDR2dzl6QkcrSjhkcjM1blVKRzZlWmI4Rmk0Q1lFNi8vUzNsWmFqSjc5MXZGL2FMSHRtUllCT3llaWwyMmVjeGJpNkJ0elFOZFhtcjNmS2dUS2dVRWpzbTdZMzNhd3RMK0FjcUxOTW5xRDEwbnFPS2J0Y0RHK3N4MFp3RmkxSTRuazRjTDVWbFZ1NktFQzdBaXVxMGJPbmcrM1Mrek9IelNLNVp6R3drOWdhdEhiaW5IVDd2NEdlc1U1UUJzcTg4V1RzWTA5YVFQZWpzYkhWWXV5b1R6M04xeUs4eldmbVorcVB1VU9JMUVyeFJoOUxHamxFdC9heFBuY3JaNDN2RC9FTC9BbGYzeG01c29tU2NXRjF0blEyUm9COGUrWEVRaGIycTJvbkRDeEtmZWlEclcrQXgxckJROFNESm4vek1jQko1VWtuWUxFNW9SdXNoS1pNQm5aTEdib2V2ZUMrZk9nOWtnMzJuYS9nQmcxMndSSXUyeXlXelpNMElvUUZXVHYxV3pKdWgwNUZmc0Y5bmIxQmNHc0Fuc2VmdEFzajRYQkdlcStjdTJONmsyNkt2NCt5Wm5xR3EvamhOQi9VYnZOTnVHM0dXMmh5M1NUVk80YjJCSmVONjJTK0FndjVvM2t5ZG5keWwxbFhueExVSEhDdHpSeld0UTh0Tm1hRFpRWG9WUjh4NjNXVEh4aEJ2M3JHZTJtcjY1K1pMR3hQeDB0Z2k1UmhoVzhrN1lNaHpBWE5QMHFxMkN1bWVacW9JZ2RYekNaQ1VFU3k3VWRDbjJmYVpjQ2pPYklRMEJudjBaTnlpUXBlUFFvbzg3T1FMMjdjK3Jhbkx5MnlRNEhDM1JuQUpzSk43aVN2U3B6UnZzQ0pCZm1SUVVWUW1YeEQrZ0NNWmxnSlhiZTZGbnF0NVFOb3h1d2lXU0hhTlJzODVMWHFBb2p3NGI5TTVSVk9OZDZNa1lsREw2bXR1K2FBZUZ1VmtuK1A4MFY0RS80ZGx3L1VZN0hDOTZ3QXUzMnZlaWQ2Sk9TKzBaUkp6WXV1dW9HWjBpczEyNm9UQ2hmbjgyUlRlckdXUENNUlFmMEFUUTdtdExZclpFNEhNWEpyRWdrR0VTSmx6ejlha2xHRXVSWlo5Wi9CbmtWRWFDS2hSR2h3b0gyUmdSOWlBdW9kK3owczBRdWNUaUltN0xyc2VRWEF6RzFiQ2M3anZCVCtCMExzY0ZLeTJIRnRRcXltcStwMWdpK04wdVA2MVdLcGY0MUNZaXRQRGxnNDZWWDJYSEZRaUtSaUpKYTQ0eENNZ2pvdFljamtzSkE2MXExR0krNjJKa2VwNVB3OHhickRzaW5uL2pYYlU3NnF2cXY4Mm5hcTczR2NiMU1yd1hadUhiNzR6ZTN4d2I2NFczMWZhQ3RuWEZaaXlwT3ViUnJZdmlreFhHci9NVHZaNmRoZ0JLZTBUcWhONU04S1VKM2JVYkkrZXZhVTVwTDg4Z1V6VmFVN0gwK1l5a3ZHNDVYQ21vdFg3RU5obC9wSHkzOUE0d0JscFZyZDlOQVA2dDU5SkQrZWNWb1VVY3RKNTlQejRzZVJYMlMxb0IzNFlIakdhbTZ4UGwvVThmM2czSzQwUU1YejhaV3pkRzBKOUV0L2g2dE13SmFzcStaVTlORjJ2cjVMNVNKTzJ2cGRRQkRvOGdoaXk2K1pHQk1NOTR5aGNlN0hBWW8wamFjL3U2QjNKdXYwcWIxYklTYlpibUFrS0QvMElqOXpUQUtCd0U0a0ZoNHZkVUd1U3huRnV4b0dmMVMwVEJMc0FaK3Z4bW0raW1oV2ZXK2k2cHJKNmM2bkZtL1hjN0FGVzFmZ3hlVlBaNkxrdVhtNnFPeDR3S3YvT0FNL2RnRFlQSVV1ang3eCtrUU10QlpLNmkxeXc5UVQvTE5sQXR3bnVLdWo4WVRvVG9zY2N1RnZxd3dQS2VxTmVmQitsR2pMdHlXTVR3M0RMeVQySWo0YmhmS2dSVllRV2tOQkJWUXJCYU1YaHc4V3A4d2ZiVXIxZGNGd054TDJHZ3dXVEljK3BIQ0dxbjQyZ2ZtOUpVTncvbjhiMFpVSG1ucEpOdjJDTkI1MjB1Zy8zUlpIL2NmbHpjTENjVU9vU0tQL3NSRC92SXNxRS9JQWJzTWdRRlpVWlVjOThadERQQmo3WFBHTHdvckFib0dycWdONnlDb0hKYTFRMEFZeWZ4dHl3eE9Tek5idWg2Q29zZHl6SlFudERsSDNkQWFFVXNBSWFXR2RkNllDeWlVR2FwSysxbU1XSEFCaU5LSkxodDRkbFlKOTZ5bTdxRnR1NUNWWnVUSnpNZzlaQ0hMb1IrVHJJaTJPUTl2TUFuWFhsck5XWXdDUEhPcFpXN1VoQ28yMFJIUHFWQmU1UDRMOUE0UDI4amV6UEgzRlFJb1VoWjFOUUxFdDRoM3BpV0Y3a05mbUdlSzZRR05ZK1NFOW9UYTFNdnc3cFk4NjNFbUhNNlFaSkU5Q3FMdGY5aUlJdHZXSXRYb1VFZEg0ZHVtWUJFZFloa3J4ZTVIcW9RUkladXpUNmxyNkhieVFGblRjaGdDUk9EeTVMTGhLNktycUhGd0g2RXVDY1JaUTczc2hDVkFOM0k5ZnMrWVoycXVtdW1oak5jMXJ3cWkyekt3UDV0MzljV0p5UGJyeW8vQTNoaDhaQ3oxS29pZVlGNTB2Vi9nRUFqcnVrK2dDeG9uYnNtRnA1QTBtNVZWRTllNC9UT0ZWR3JBcG1TL012a1N2UzIxejhFdXgwK3F6d29VdFBGaWRhR1BHVHY5REU2d0NFRWxOTUNZY3BHYXFBNFlzZTBDNzI2d1g1OXFtQ3I3dTcrbUtLSUxnWU1zTzdMQmJKSW1FRDhyNDh3ZGtZUVBBdnlqdm04YWtaS1FsM3AyYzRrb3VYTTVFeVJjS25BNTAwUDFIOHM0QzdUVThQMmN3QVlrYTBhK1VRTm9DUkxzZ1Q0L1dwT0pWUUQwV1g4a2h3cEJlMFJURHprUWFlVGNyZ2JzTUhiZWpzY0x1Rm5UYVF3U2tKNUZHajNJaFZrWXYrQUkrNHVyVTAybjhPdlNQMFZsZmxvYm44VkZQb1JlZG9tcXB4L3dRbWFFZXZaQUtjMGR6MjVUcEFYTDZkV1BwZ0ZMamQzWTdaNXd0eFU4aFJYZ3ZvZEsrUnVQRmZib0x3KzhZL205SFNWSGdmdXF4M3lQUDlCVWlBcHFLWDI4bVdrSWtuczN5Zis3SnBxYzB3MG4xclZISzgwNVlLTHk5cWlMZDQ1djZUVVNhTXR3VzlKOEVuN1U1Zlhnc0x6c0tqUEpvWFd5NmJnUVlyMGxXMU8vMW1XOEwxeENYbXVxb2ZEYXFmNkFzdGhWYll5ZmNRNjVYdXV1YS9HZnFqci8xS3lMTFJHMUI2RVBJeENkS2RSeTN0R1c4bS8wT0psMlU0aElvVHFIOVJ2VEs5ZkVMRnM4R0pCWm16M0J4d2Vobm15b0FhTXVzL0tDdFUwUzJXSVpXbzdrbnVuMitTTWJzTWNES0E5dUVqUkRxVUUrNVkxZG9UQzQ2Zy9vM3p0aGVkVFZWK1pubno5T05vVlU5cUhqRXBrR2Q5SGxad3lML2NFSng2ODJibEdlem9ISGtUVUMwRkt2MjhEVUNTQ0ViQlBIb0dsTVhFUkU0SXQzd0hTaExBblB4VHBMQWF1R1ZsU2t0KzRwSS9UMnE1YzJoeXZCeGVOVHR5eDRsWGRhK3hyS0lNcDkxakZpSUZ0WHFIb2luQTZyVmtnZGZsQ2F4aUlESWx0YjIyMGN0bjM1ZzVVZVFHa2FJbUJyZS9Vd1NGeHVOcS9ZQUFQQmV1ekZ5a00zQlY5NVNpVDdrL2cza0p3VjVRREdSRFp3eFFsTTZ1WExvUlZuT2R6STFGODRiQ3l4MVlaY090em8zWDR6REFKRVdib085TmdCbWVGQVpuMEhVRTRuTVU3YnR1TytVaGovYjhZQU52UVBZRG9EelRBZzUvZG42VDZwRGJBRW5rLzBrNDNkOFNiTHpQamRibDM0VlMwVTBzTlpNUGpuZlk5ejRwY2FOQU51aTRnaDRINU4rTTloeWRVUWNleUU2V2ZGT1ZpbkdVdWFJSlJ2ZGpqQ3YwYlJLVkpjQ3hHbE1CeTI1cUExK2lYOEpmQ25pNEY4TG1SV1dKYkdUaG9xZGRqeHJiS255SWc4aklxYXY2SlVSVndON1B4c2tlTWRqcVZVcng5bnlhMWV1Q2puSDA1ZlR5dXhMakdIOUJuSWR3RXpOVmtQWW5BMTBMMjFnTHEyQVBMeEVKVHNvY2FiZC8yNDRQVS9ockhPTjZBZm5VL3IzNUE1U1o4c0dFZytCUTgrd0RXT0JPcnVZZ3ZtQVZkdXZxRzlnQmZSWHlpcURFclVXeWxVWTBkRElyTGp6WjR1cXpQOXNzL1FMQ0k2emNvajQ0N3FwK2gweHlMbGlHRUNMTDNXdnlnM1l3WTZTZVZITnREOUtqMll3S3pFY3o4ZWxJdmx6azJnNkZtOVNhcFlBNWxjY3k3UXlrQ0E0eVB3MWZwa2JJYlVxemd1cVQzV2VmUTFOdFR4TldSSmlnQTMyYURnRlh0NDIzVjRFQ3FDc1ZJZkdlMW5YVzM4WGpGcEN5TU5BR29ZQWhVS0gyc1dQdDlva21KMVc5alhXWnBHZmgwcWhVTjZhMGw2SjZYalhRR3h6N0xuMEQ2Z2o2eUlnZ3RNRFJtN2hSTHRKYW1hQndwUWg0cFh1NFY4ZDNxdkJseXFjblJHNkpTdGlwTGZ2M0YyQmo3NjkxeHMwYVp1SVgzWXNjc21tVHBOZWVUNmEzelZMZmVuY1pOSXRMbnRWditSUlhnaVBKT0EyVFV2MXVjb1VYanlnM25aN2dza3lEZ3BUTHZJSm1WRVdWVXdSVWNZa2paemQzNU9RcVhkai9aSjRxc0VuTzlta1piOWZ4bFB0VDM0cFpZQnRKclhjb0g3cm9mWWxkb2VXZkUrOVloN2tsNFkyOHRJU3Z6bkIrYnZYUTlpWnZ0NE9uL0tLcHF0UTM0ajBSZVc5b3NEeTNpK0IwNGpmbEE1YklNYnhEZnpCS2RreittL2hQOVFsOUNyN3poVWFjK0l6Z2pqVlpxa0ZlTjBTRzM4dTloZktRRC90bHh5Njh3T25DRzJNbzZFdFRZcWFhNGRCeXVmSWt0cENyTFpzQ3c5UitzV2NEbzlQRForVGkrdjZOM3hHVDVFL0x0K1E2c0lCcDU5RjZEYTZuOVFRUkxYWEMweVA5VGxQRVAvTm5POVlUNGEyQnZENkl1Z1JpMmR1RTlhSnkwM29Nam1CMWVHZW9QcjR3cU13dGNGdVE4Y090bE9KZVNvSHU1dy93VjhpNS84TE01d1dTWWF5d1c0OStpUm16Y2JzMUNTSDJtUDFVdWtVZW9pM0hFQncxVEV1S1FMWW8rdDlhczZjTmZHZndtUjFabjFJK05WTVRLSXZoOE5mT2pKTm01VSt3R3N3MGJQRDRKUW8wZWNUcDNOc3VBenhBMTg3cjdsTUp6c3VEdXNtVzAza0p1QmZIT2xhY1h5cHhyRW1PNG13alVtMlhxUEZTTVdpellBUy92d0JlSEhFSm1vczU1by9uMjlQaDE2b1k1dHRUSTRkdk9tRXdDVmdZYnptZGc0M2xGdVlpaWhHazRveXZpWmE3clZWUmF5ZU92aHpqMnhHTUZUMFo2akUvUXgxUjZTUlRXL3oyZGl4QUQzcjdZSE9ROUg2TnBvc3U5dHM5bUN4Y2pETXI2c205cG1lYkpTcXB4SEYvbTNqMi9OUVRLdVU3TFIvdFQwdnhWbHl0VXkxdGh4VXdKSC9OZ0NFSlNkM084OUhGaUI3eTZHMjNFQ2IrTll3VzRDYm9WS2dlZ3lic3BZSkZMem1uNllaWUNjVWhFTWJnZG9XYllNaTVkenRZa0RTY1BiL3FLZWVuc1BPNFdVNDRENWxZR2d2c1Y2VjltYm5PNFhpREEySW1VeTFtTEdhWVh6TTdqcHg1TG9Ya3R2RG9OdlRwUWp3MFBRWDdOcmY4aDJIWU5vK1h0MzdSVTMzUStZQWNRMCswMUNyc0NjTlVTUUxnQUwzNXhsbjR3dHg0SlVsNFRZamF3dEZpcDB3ZklCZzRLbjJSRmlUYWVvUDhkdWNKbGVyYmpKVHVtVWdiemxjQnVySW5rMnNMMEZvVGYxV1RkMERLNkxZanFyNWtMaVlaTFFsU0xYY3d1aldiNU5FcXlVcmdMbVM0WXZNTDlVdDJmS043QktsQnB2SHI0czdQbzZPQm8wd1Z5aEpTRGF6aXJLbWs4Tlh2YnhpVDZyUjJLMXVHclFiOUwrSEM0THVkc05HVW1FZWxZTzFKdDZGdkNLRXVJRCtwc0FGbHFteHlwcC9lYmQ0OFJibnozdnk2UkV4QWRIbi9xaFd5MzRpbUVVaTZ4OVpYNFVYKzJxWkNQWWhMdS93SjNlSHM2SkF1SWdtdWs5R1Zid0R0cE85OVN0M1BtelFvRDNLZk5rWVBvUG1VNUd3eHlkOVFLamRONk11TWYxMVp5bkFUSUZzSDcyMUJVRjdtSCtkRWdxVE55T04wL0RoTlp4M0ZYMndiWDFLWElmQ2NnbzlydXNtcTV4d3RUbXB0NWlNbE5HQ291bkR0SEtORHdHWnorSnZPY3NPTE01QlE0TjF4VEU3Q2lTRlhUSVk4RlFMVWNERUVqazlmRi9ObGp3aENsTEhWYXNlbEF4L2ZrYndJcGRnWDZqT3dnaHZaa1hHSWRLNWxuSnphekhuMzMraWY5NlZlQkwwc0Z3WW03a3lURk13L1Q2VEdTMElVNm1vRkhkdnlhWWVNcFEwc2ozNDFzSlhYN29jeHcxK1RDYjFsTjh2SjE2NEI0MWJETnpXSnh6aWZwNVlBZ00wUXFqUU5iYmVjYk83aEFFbDkrVGMyU0Q0clp4d2tzZ09Gc3dOSkphdG5aQUF3dGF4emtLNyt3eXAzSzBMd25ocVc4bEsreE9NSXNRT0ZsTTZOYUdxUkl4WDJDcEZDeVZUZUtvRTJmZHRHd09Memd3dHhVUXMyeVpNRHdQMlRhSlhETmVEZHJjY2l2NlVKbE5IUG03ZGs5K0VRbllkYjdEa3JBTk56NXQzS2krb21SVkYxaDA2U25ON3dybFFScWJZQVl4aWxDNnp1eGc1QTVndm9uWEY0ZnBNbzFNVkNPUHJmQ0VHT1N5ZEs1eXlxVG52b0dLM3BQa3JsUTIrSVZQam5rOHZpWHFYcURhaU9JREF1NS9IQWlMVFBrT1dDZU1iSWNxeUtIWHM4SDlrRTFQU21sVkNoRkgvVGp3VXVEUi9tMkFOb28wN20wamY2TVNtVlZhUUtPa05QekY5bG85a0pwdlVHR1J2d2lINE1TaVpHTUYvQysrUG9MbFZkS2tvVkRpSXUwUVByVHlSOE1PZkxhVUZkOFozM0Y1MFA2dHVwZWZSd2I4WkE4UGp6S0ROWE1PYVYxU1ZHR0p5TzZrZGQ1SWs0SWQzL2wvRHhiOWg1RGt4MFlzY05WdURtOG5Qdi9UK0J1K0QzOTJoNHJ3Tm5RcWNvQkxTMlQxc0lha1J3YnIvWUkwNHRTVUlYNVFxaTlNS3YrNWhmUFFBQVZ3RjRKdWthbTFJdWVqckwyU01jcUdWY1hMMGRMU3N2ckp2VExkRUhHR2JUVDVrYXZ1eld3OTlFZHp0TGgyZ05xKy9JUXFIbzFWSmV4cFA5Ly85a0FBUUFhQUVBQUFTSUFRQUFQQVFVaUFnQUFBQUFCRVFHUFFBQUNBQWtDQVFFS0FnQURBQmxVYUdseklHbHpJRzltSUVacGJtZGxjaUFvTlNrPTwvQkRCPgogICAgPC9CSVI+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT43PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+RmluZ2VyPC9UeXBlPgogICAgICAgICAgICA8U3VidHlwZT5MZWZ0IFRodW1iPC9TdWJ0eXBlPgogICAgICAgICAgICA8TGV2ZWw+UmF3PC9MZXZlbD4KICAgICAgICAgICAgPFB1cnBvc2U+RW5yb2xsPC9QdXJwb3NlPgogICAgICAgICAgICA8UXVhbGl0eT4KICAgICAgICAgICAgICAgIDxBbGdvcml0aG0+CiAgICAgICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5ITUFDPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+U0hBLTI1NjwvVHlwZT4KICAgICAgICAgICAgICAgIDwvQWxnb3JpdGhtPgogICAgICAgICAgICAgICAgPFNjb3JlPjc5PC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KICAgICAgICA8QkRCPlJrbFNBREF5TUFBQUFhK25BQUVCQVFBQnI1Y0g1Z3djREI4VUFJSUFBQUFBQUFGUEFFQUFEd0lBUUFJQVFBSUdBQUVCOUFIMEFmUUI5QWdGSFFGZUFhc0FBYThtQUFBQURHcFFJQ0FOQ29jS0FBQUFGR1owZVhCcWNESWdBQUFBQUdwd01pQUFBQUJIYW5BeWFBQUFBQlpwYUdSeUFBQUJxd0FBQVY0QUFRY0hBQUFBQUFBUFkyOXNjZ0VBQUFBQUFCRUFBQUFhY21WeklBQUFBQkp5WlhOam1jb0FBWm5LQUFFQUFBQUFBQUJxY0RKai8wLy9VUUFwQUFBQUFBRmVBQUFCcXdBQUFBQUFBQUFBQUFBQlhnQUFBYXNBQUFBQUFBQUFBQUFCQndFQi8yUUFJd0FCUTNKbFlYUnZjam9nU21GelVHVnlJRlpsY25OcGIyNGdNUzQ1TURBdU1mOWtBQkFBQVVWdVkwbEVPa2RTUWxRd01mOVNBQXdBQWdBSkFBVUVCQUFCLzF3QUUwQkFTRWhRU0VoUVNFaFFTRWhRU0VoUS81QUFDZ0FBQUFHdUxnQUIvNVBmRXpBWkx5T3RIQ2pYR0ZmenZ6WlorZjF4dkU5cXc1Z01zVWtnSTc5WDB1LzByVFVDY2RNYXZwZ2xtdDExMUlXd2V2VUpYOUNBZ05lQVUyK21XRFVBMkNXK2FHUS85S0F0Z1BGdzk0UGFiTUlzZldNdU8xTkNrcVpyNXc1SFBwNUJZeUtBOFZDdWVTQmkzNEkzT0hHQjMxNVZaQ0UzNXhlL0xlNzhDZ0FCVCtsWmFIMjh4RXN2d3BRWVc4ajdhWGxYWFJ2UitpdzVzSis3SVVBM0U1bXZmSTFjWFNOSHhVaFlIM3dZVzdZSHlldnc4R1g0NnowNVJrOTBZQlMyUHVwdVFhRnJSMWtlc1lqWlBheDNra3VwNENKYmhkT2ZxZGFxY2UvK2ZCVlNXbFNBSitwdzRRM1RjZzY3clAzSzRiSHBvaGI2aEphQWZxaFpSVkJPeW9XZElxTXU1TFNhMjlUazRRQzVrTHdRYllJRnFYZXJKOGpwU1ZvK0dSZTZDV1RkSEp1NTA0dXFMamdKV2ZSK3Vua2RpSitMdHEvQ2NJWWFrSjFMN2pxMUNmNHM5K1hKeno2Y25hTDhpTkNacEl3YU5NQ2VaZjV1SElhTzRjREpqMTZIMUZaS1lXWXdpdHErMmNURVJRQ0Q1cEtxc2t1SjFYbjZxSjVtbnlTWjUvUHd2dllBR3VsanpKcjhZNytNZGZNVEFQWmdvcU0rODhSWFQrcE9WVTZjMHVKUlV2WmdKMEhLQjRzR0QxWVUwRkQvY3BoZm01TEx2ZVRQcHVNYUN0ZmtUeUpyZDRja0orZnhsdXdJZ0N6cFRPVTdaYlJwQjJXS0hFWjRFQWtIMHh6QzF6aElDYzhCYkRlTDhIZG00Y24vQ3IvQ1RRdm90dStYSjJTZSswYWphUExMU3ZDZG4vMHVXQnR5b3M2emNSd3FFYnBCcWsyR2JVcHlsMFFMT2Z0RE1aMERqUEs5MHR6TURXQmd5VWNvTjhrc2hkU1RjSVZOSm04ZWE3TCtHK0Rzc2xNSGZsOXlnU0Rxd2lvOElOM0FEbitsWk5UQXRoWXdrZVRzTWFiaDVmMlpoY01LY3BFVEk5OThVNFVKNHdvdXlFOWIzS1pxWUdTbm11STd2ajlWUE5ZbjZzeHZRS0ZxQjVhM0F5UVBSeGpaTkFpbm5BODU4OW8xckJDWC9pVVlHaFQ3QU5vSjArYkd6SjFBaU1WUi9XVThPTUE3RVphQTRnRGM2L3FuVDU4VmRTa0NrbE9yOUpEclpRZzkzRGtlYXZ1aDY5enJZS2NlekY0Q2MyT2daQ3NtRTBhaE0yY3M2ZVkybDkwaHZnN2hiL05LNVZ1VXdMcGJTZVpGU0pGWEF5aFVWbm9XQ213QjI4bkJWdXN3bWs3b1ZNdDVWWG4vYjA3ZzBrdlViRGl4cW54NDVJZ3FQWG1rR0F2M3V3MCtSVnloM1VtOFJiM2pPNDNKa0UvRThoWXdiR1l4VXREZzIzb0RYVmVhNGkzOXhmVnlReGd6YmczSUJqckd5SlZoYjU4Y2NEdzZzVXBCbXZRMmx0UXk4S2IzY2Q5ZldHNkpQcFk5Z0tPZ3B2M1pwaWgrZG1jTDRrTkEzNUVxOWpBc0NnUkM3TGVtaExYTERzL0hyb2R6dC84dldXUXIyR3JaUk9YR05rWCtGN0lyQkk3eWg1OG1weGU3NEFvenNIdjhNdWJEM2lBcU5qc1FsL2NDemlUZ2pEdW0yK1hYWmU5dExHZW5mR2xGOGhaVjUvSkNrN0JVT0RCMEduOUtpampQcEFweUlXdGtvT3QrZ3RNWi93WVpOa21paE45b2docEt2UDQrOENPbUV1clN0cHNLWUU5ejVuYmtlQ29wMTM3L1NzOW00TTRBTXVMSVpkRGhvNWdNM1BkQkd1YUpUQTVkTDNCVEsxeXJ0MHo3RTlnNVNtNWxOM0VqQVI1SVF5eTNqZGJBN2lzN0gxVVNjVkwvR2I0NkE1bmRnY1N2MmNBYkYyWlpreXN0TzFjYXRIZEdCV043Sk9mUmZmODB1VVd1ZzFNdFNtbW8vdjZhcGRHakI3b2NlTWREd3Q1MDZJeVo0WWpjV0FQeFFENHhobk1GUHZGdlhrR29wY2hXVi9VSE1tQWN2VVY3bjBwbGZlMU5FQVhjMSszZEMzak1xa0NML3hWVG5yVjFhWTltNERwQitvbVZMcXdvb3JzbnhXT3lPSm96ekd6OHFhL01uWDBzS0tKaUxVcHRDS05IMjg3RmRBdjhkY1lxcENMTmo4Y0VJWUZFUjFNdU1NbnlRaEx3MXhYNnZKdStTcjcwSUE5citrcnBDeUdYL3FRMUI4bkhhdE5Jd21vaXhWaitOc2dhQkpxV045a1AxUEdVYis5ODVpNU5JdVRIdm1wckVuSGRQQnFQeEd6c3FFcDNaUWc4STR3UmtQRmxMN0drc1Bkcy9IUE0zUTlUT2FQVi9VenFvUEdvZi94bVNoRlZVRFgyc3FBYXIybFU1bkdpcnN2MWMzR3lseXFvd1UwRVVLeGw3emxMSTY1UUUvU3VsVkxhTlEwSWY5UGgzZWtaZnltVTFwbWIyZURqZFliUmMwTGkzbVhsdjgrTnFWUWdlZVozaUowcFJpbm5XVGN2VkNjMFI3cHhTUFFMdGRTZEVEYjZZeDlMT2NXR2lZSnF6V21sMzRZdE5XYThnK1UyKzBsTTJ1dFdMT0ExNnFSc1RKTGpGZGYxWUhteTVTMCs5SnV6eHhGRjZXYnZmaTE3QkRFK2ZDU0dqU1lLaGtwSGtubUVGUjRJM0pFbzlMWWtDYWY2SUtUTjFGWHdxYW9URHNuN0JCbE4zSGZsc0pZUDVGY0pQYkk0UUVvVnhONzBtU0xvU3hsVEZ2Wjk1ZUpEQ1VzbHRDQXQza0FEblM4dXZCSDZ3UHJCQ2lYUEN4V3o4SnpVVkpFeTZtanhweFFjZlA2Ym10dDRQSTVJaXVGeUwvRDJndVFyVEdBbTZScWRTUUdjd3Z5WUdPUWVDVnBURStDd0FiVmx3ZUpXTEVpOG0zMUlhejA0OW1wSmVTUFFMQzhEMktlS3d3a0t1Wmkwa0FzVjVZeFlCazRaN1JlUkllaGhRangxWXNvQ0lLOGExQmsrS3BoQ1lGWjNXdUZFMXBVU2NWaVJIdEZXWHdWVlR2dUZPM29rR3ovMnk3RW1kRlZEOEs2RDZpTnpYTFRMZ2lPMFkxamJEdGN6SlVWV3hUVkhHS3I1eTh3MVNXNjFTdDhIWUUzSkl5OCs1ZGUydkdsMGJTMit3b3ZhOXJ1aitaaHJoSDNvRHhLS0dzdFEwR0ZldS9zVTZHMUt0ZkVqZXpLLzJwOGZHM3drRzVHazVKZlFSenoyaFRGVGVEdjQ0b3lHMGlpcmVlRmRkTnk5RnFmeTRHSnpUWUxFczAxdFhNa2FtZ2UzL1liUlhyMEZmOGpVS01kU21HUDkvamV2NldVMWQ3aklSS3lkZmNrTWM3WnFnU1FPZWtTWDV1SUs3a3VSRGxiTTE5U1ZzRzBOOExEVEJmZTRLY2x4T0EvWnhrdFRmcWNqV3dvRU5ZUTVKK1BpcHdXV2h3UE5pRXlhbkVaVW5tNVFReGgzMVFocDBoZkVTcWorN1BsZW1YS1htQ2lvUHgvMnRQdlJqaCtrUUp3SUVOdmswVkdacDJ2Q2ZYS2N5NnhTdEpDWENMejRpL1VKQ1dTTkxOSnZJQkVJNFJSc2hIOGpjQjM3T3JFVjhaNWFEZUZTT3NXSkdCMFNORG5ycEp1aFFoMnZHUk10bEh0VGM4ZHBnNVNucFJwa1kxSUpJUTlEUnQ4bWhTY0FHSzFBSmpZOW5iMHY3N2ZmZm8wRHBHR24zbmF3c0Q5Z3ozNWFuQ2F1VXR4alVuRVJpVWJtOXAxeHJRY1Y3Wkc5N0xqUEpPRU1XK25vL2tFbzlsbDVIa2ovUUZJY2doNlFldTNqRjlmbWVrY3p0NGhqN0JrZjZSb29VcER2cTNwZFhrM2svRWVOYUhuV2pWRDhiT05CK1VCREdyL2JmM09pQU5vVWhpQWttMndiaUN1VGE5bEY4c0ZZbHJzM1pwTEZMdWl3M0NjWUpRQ1N0MCtYVUdQNzZSdTUzTlR0RUxremxPT2VUc1ZhZjdGaUxkWXhua3pYamFhVjNta2hjNVV6elZ1U3d1ZTZkU2ZjV3lYSkZpMzFyb2g0Tk1GZ1VOTEdkb3B4d2g1bXlWYzNZa3ZCNC9XM2VHYjV3WDlWeTRIZ0lkN2YxRXI2ZHJEWGQ4UlU2NkNQZkRsei9mMUVPL25DUno4bm4xcVNMSHBCMkNPOE4yc09UcFIxQXJsVEpEcjViYkorQmlhTUNtYmVieDFOS0owY25sKzYyT3dqa2RtRlBzL2ZQbGpBR2dEcm1kWnJKUkhZVjVIMmFYd3pzdGkrUS9FNkZ4bzhia2R5OTdndXIzNXRSclFDdElUc2Naa3dKUlpVTFpPVDFIWWVWcXRrdTVEdWlJT29ZVGtyNFFVQTNCR2VaTnFseUlRbkw4UDhoZEVrVy9qN3lWc1JTYUlzcG90OThrS0ltZmpLNmVhU2RneGNUditBQkRUNWl0RUVpNkQ2UzhIZkhNOHRMeHh0ZWN3ekdHNWtidEFqMFA4QTA0Y0pGdjdpNGR3Smt1NDBjb1cybmxlZkdHWWFhS0ZyeGZhbFBldnN3cE4yeTFjemVQMFdVZ1UxQnpEY3JwSENSR3Rncm1pamlmT0tlcUJ3UTFBeFhQajZBVW5OSHhlbTZMZ0FkcVhzNVFLd3o4M2FGWllBVkpqY0JrZUxDVWxPSzFZb2pZYWZNYUc1YmFOYTh6eWMxQWZiN1NlVHpqTUEyeDg5Y05CV3VXenhtYVdXSDFZVzkzRG00blk5eUJwczhGR3ovdk1Mdmt6UjlCV3ZhMTFpbVV3a3c2SVJzMmhJeG10ZjFjUk14bTNIcGNPQlE0TlBDeUlUdmgvMFpSbkFyaHVjNFZGMHMwdVRTU2FTTXViUXJGWFFsQm1sc2VvcXp4WFNab2QrNWUzWkVxNEJpTVFUeWNtc09DNHVKU21ZVGJxdG9lcGFJMWErVXQyUG0wRDRrczk4Y0F0U01PcVFwQ3JjUTcrS1pTMmxONXFBMjdhazZFSU9JM2EwaXJ2V1EzbEZJUndGbVRCcFpGcnY5U2JwQnpZWFVnM0NIbEU2N0JraXVpVzlMUTVqd3hqb2hkT0lZUFYyVkx1NmFaY1E4c3MxZ1ZtaVJNNEJFaGpFVk9mcjFIYkxJeklTcGxmdUo1dXE2R0Rzc3hhNGtYUHNBYldnYmRVdllXNVBaU29ydVc4cE9rZDd1am9MQ2NUQTlSZVY4Z1gwTlNub0RZLzh0NDlVZkxYWkF5VmRCbzlld1RDZkw5aEluYWxZd05peHFNdXZoWTdiU1RTcEtIWEVDOEdDU290ODUrUFJPaytlRllXUCtYR1JHVS9oelVrS0hUR0RkcWlQMHEzdTNsaEk5d0dTUDVJT01nNU0vMzBOM2hjTzkxY2k4UVdWNS9hald2b1hjWm9La1psMFhUSGFONjk2ZnpXVk1jOUp6bGtZZTBRemtveGRiTVcvSEdUS2RuRGZSYTRIaGpxV1dyYUVETEtIZ3JXMlVZYmZEcTZkenRNcGlZWWRKZXd5S1VnclBTeDQzaG11SXR3SGZvTVVwbWVzR3l2ZFhtYnBwMEdMankwUHpkZVdLNURseTdVOVNWTXVmNzg1VHUyNXkrdk5mamVxbURMaklaNmw0UUNaT0dTbGFrWUpRdWdUNTZadUI3OERnc0ZlVnZ1NEFTNlFmVjRnWU1URkRBMFNjUjlJSGlLdUtrVUYrdVZ4KzJ0T0J5SStCTFFseVlpc2w1ZUc3T1V0YkpCbGFHekJBYVBXVmc4dTIyMmhZZ1BwZlNPc0k1VkNHUUNQSkxodVQySCtwN2dTdlEwbElNVHdMYzFMMkZwbWtCQjgvRWNyN2NZSHgrQjUzYXU4ZXZtTGJZUFh3Ulp5UlJab3BIUXBjR3dIcmw0cDNBb3gxZkJwUGcvckZFRTVIcEtHTWM4R2IvelBXYzBINGxMZExDbzUrTkFMeTRPYzZNc0pqOHBZSjQrTCtOY1pQQ3pFTzZsMDZDWlRTOFF0Uzk3d1FDa1BoNWxUYm5WeEFNMHBsS0ltUFFtYWNlWFQyNk9OSjYxT1RQUEticEM2c0cvME52WXlEQ3BoT1RyMjE1TzZVL04vQnhIQit4bEpONTV6TTJBZnQ5ZXpFbWFYb0czUXN4QnEwd3k5Ny9IVXhYaVJJWGdVaWFEOGNqUXFYcmJOZWlkeFV4N2tDeVBrazlxUkM2dGRvWnVNZGpwOGMvMXA1YVU5RWpUdW9hcFZSa1hPSHMwUjRLRkZmZjJEYnJibXNtLzVIUklqbDZZdzljZzRyUWhFY20vRnhsSUYwWWc1RE5wQ2pYcTQ5ZEF5Tk54UllRc2xBOW5NWHlnN0FVajgwbFA3YjBHRTBvenBPSUUvOGRRMlFRVGpCZng1RXJHMUdOK21QZVRKa3hNcFdlaGtDdlVieEdxZnZRNWRaQXVHREU4RTFoei9jNVI5aGZWUkU1SVRNbm5Edi9wb2lla0lVMU9uWDBqMjNvNXcwWVVVblBmazdyMW1DamVRd3dCZ1hSK0U4WkkxK2Z2Sk9NdkU2R3JYNGlLVkVUdEs4ZS9PTURkRTJ2V2xVdjhGZUxiTGdFN2U1bG0yNXpBc09NVFlkcEVZTU9nL3p0OXFpMG9zWHdrVGlyQ2cveDFnRmg5QWZKc3BGUmZESFZ1RWtPdkFRM203MXZLU0FZVWVKTHVodHUyOS9iVDlOUmhyeHhSZTZIUjlMQ2FjcUY0U3BaOEZpTzV2VHVaeGFBVFYwalRaaHpRSXVYSDB6VEJKUEk5V01XZzRTSDJtWitwTXMzb29FU3IwTnd3eGl6bU9PeVV2bXZraU94K054NnppaXNlVjVwV3VJMCtJK3lnaUVTZHYyM2ViZXFuNVBPU3l1UzdMSEE0NlRPbnJxcWllbjB3UW9MUG5YeWR0TVV6Y1BlbGdJaEZWL3B6QTNKSGNQRWpjSGQrbHBITDhZMTVBazRnczZzV293MjdZQTd3b1N4YTFIaUlQZDdZQnJzbVZtNmJwYlNxTVl5UnRzVlpsOTRIYlgrTE05OFZUa1BDMThmT0VZOThOTTBHdDVwWHZUUllhSHB1b0RMNTNXYnFSRGhSZlVya1ZuSTlRT2VnOHFDOTJabFNYdnAvRnRDZEx2ZElRRmVVZHRwZkFQR3A1U1VhZ3NQSld1clpGNGU4T29OVkZXMi9VTzBzMU5hK3dJb2w3THVLZXFQd0RkL2lLVnBlUTdHZnNYMjJUNWg2MWw4emRuQllJRGhvWlpDeUt0U0ZJQzFodVdkTm1lam96WWtDT0plUUpzc01MRHJUZFZhamZzcmovREF6V2NqVE55VjlnZm1ySG1NWHdwbVFscXV4enNpV0pDcks5N1Zjb2phM1RhRE5ZTmFBdmZmbUFWbEJYWm5ubmsrWVhFSmZ1ZHNxc2dzRm9WeC85WjRzc29uZmVDTEpmQkhNR1o4Vm11OEd5dWRsK01SRjA3emV3WjZqZjhwUFlaUHZRR2MvbVd0NnY5ZE5nelZvTUpDTUF4bnZ2TXNpQXp5ZzRSYWZCTExTeExubFBhbkU0UFRQQ2F3T096L3hQQ0pnRGNDVHFxTERndXBud3Rja2E2YUU3cGYwcmovU3QxOWh0b1BYMGpLNUxQdGNvNFpnUWZVZ05ZSTRiTmlORk0vSjJwUHpXWmZEWUZWOFNzbk5wVGhBbDh3RWpWS2FnMFlpeGljS0RXalAyOE83VlhFMDFudG0zdzR0eW82WHVvb2dHWjhnZW80SWVrYVNFejZWUE1rR05UeUtXMzJyS000czRLMUF3UVNUSUUwWTV6eWVYWno4Vml6My9mN1VxUTdveHlBQ0xabEZRWXB1VGkxQTQwZjhrVjBMSTNRSkI3WnNnenIwZFlxL0RzREt1TXdNT3JUNmFrRE50TmhCQWJXT0k0OHZhZk44SHg3Rmw0ZjlMNFNEdzljQzJ4clZsdTdmd3ZkL05nMmtoN2x2eGp2M1RDYUU3YjRwcms5YzRYalNUTFBCSFY3WkNSSWxJZmpES0JTeG9KVnhEdk55SG5HT2hCZlJZQUZReXRMeHowVjIzUmJNWEk5Nm9raGN0b3Z5SVRzRVA4WlhnWHRiVkpnaVo5Um5YQndpOTlOaDFtMmgvSVMrUS9lWWpURWpyZUxtaUIrNW8yTnFTMWJQUy9JV2NpdGtzUzg1aUpmd1dxUk42SUJFc2hsT2twRjd0L3BZaW0zQXR3Wko1Yk5NcW8vREkvdy9BcUNDcmRjdDdhalRtSDlZV3lwTC9aY0VHU25qNEJPK0dvb00ybVpaajJCT2FSa1FDTUtQU0QwV0NVMUQ1MFVkM1lBWkEvdGNzQkxOSVp3ZnMyUFV3OEtaRTB5WWxwd2FJaUx0UHpwK0pVbkpHTVhtT0NTK1I4SnNNZ2R2K09zTmZRSXB0WmxNUWhLKzZYRzM3Uk5yeEd6MGdvcWxRS29ma3FHS1dGUXJSRjlFL0VpaGtFRlMzS0ZueFBNTkRRNDUrL0hFUWFBOVJ4UlNJcVpoVUVyRmFYMmFyVHJXS2h3QldEWUlVa1N5SnlaRVZ3TWhoNVp3Z1FtV3BvTVYrVmpQd2NuS2V1ZmJSemhSUmplMElRYStsTDRFbm5HQXF1ZmlyTWtzbkdDeURHTVNzYUJIelVXVWVvN0JGa1Z0QTlwNGk0eXJqTG04THQ4Qk9RQ0hHYzhsd3IxVTZCb1BCRFhrV1hJUFVkRVFLenZUc3p6L1d6a3J4bnBxNjl0SiswUU5wOHRTYU1MTUoxTVl6M09iZ3YyOFQxRUFOUVFaL2Z1bFd2dGJsTW04S2x3MExHQXlpcHByb0Z6T016c0Y4aG9rdTg2akpseTJRMGZwOEhYSVQ2UHRoRmwvZXVRNTZoSEpUUU9lV0h2ZjFIdWNTTTRYVmhLQ21GTmQvK1BESDdrL1V3TmZYcDB1LzYzcDlXRDFQVmlvM0VlVElKY0NUeEdCM2RKa3g4Wmh5YldZcjhtZE5NQ0docktoNDdscWNlOUdFcm4yU1E4YmNMK2lTL1V6bFVEKzhlR2FQMzNJanlUVzBWRVVySi9ZMFQyRFFTNlQ4N3Btc0R5UWNaUTFMRHJCS0NmWWlFZndHSk5NdldLQ3k4b2Y5OGd6dUFNNldkY0srbFN4alJrc1ZuQlIwZVQ5SzUzbVlReU8vRm03ekRmYnlSNjVZTWZkVkRiUnRjdTdVRm5aWWdrTU9yQVNCVnFZUzRnUWNjOUt3bENGTkRvdytpMkZFSTcvTjdicXFwcVdUclMyeHJWNGFpNmpwM0hKMWhmSEJlSnQ3MXgzNjIxempBUVlsVVFPMGpZdkhaSGYvRmhuUUtsa2o5dHlRVGRLMW90TEVNTTZVWVB3Y2c1cjRacnBuNmp0Z3RyQWhPdmN4N3lvM3MwVzk4eCt1R21RS3RiYWxXSEZUVnJJMlY1NXVyb1dFMURHVkozc1o5MDVDUEFPWVpVYXhQRUZUOElRVC95NUozSm9samxuL1JiVEZSK0l1VnY2NE9WOVZoaE5weG12YmF2bStZbHI0TDJHY0dvYTVSWTBYTlpjUlZmdkZaZVhIa1VTNWVUU2x4N216UEUrVjlZeFp3TEQ1Q2NWTjdwMGlzbU1LWmpVVjR2YmQyYzJNbkNGTExnQmp0Ui92VHRlQUlrTWxZb3MxWldrUjhXbXFmR0RsbHRPVityOFltbzNXQkNsL3lmTmpjTkFSOWJTTGs3eStsZWhBOERzVURWVTJ2c0Y2cmNaMzVzZFR4b2ovZi85YmFIVVRNK29MOStHZXJ2ODdQQjhIeGZvUEkxTHpTYkZ3Qk5CcWtRb2RyOS9UNHFTWG5ubE9KODFzOXVhanNYOVRIWHVuNUFWZFFaeVF3Q3o5cFVlYTNlcDF1SzRFeHloRVo3T1JpWXMyYmo0USs5aDhKM3ZQY2RrL1ZDTG9hMkJGVVk2eHlwZFZsR25wOGNWQ3Jac1phS01IMnY3clBuSlZualNlaTZHSzVSNUFNc3dSWnltSFp0QXJOb0xSODBIL0VyR0M2T2lTYS9aZFMrb1QzRDd0Z2U3ODJRZ2MxeFEzNlEreXZLSHFGNDI0SW9oRHc2SnJVNDlzYXQ0ZkkyM1I4UjJVTzNPV3U4aGdtOUZjemxTVHNqWU5vbW8wd21TWTlpZVlGNURzcEsvZ2JyZ3l2Y08zTXc3Z29maFJROUxMWkF0dHdCcU1VZDU2dFZCQ1k2aWpnQlVBVklVK1VwU1RsY2RBNVVqUmYzaWZsMjZHM1l3Y3M1dFpNQjROV2ttWitiWWVLS1JNZTZOUG1BM0VhS3N6WEVJUWpVam94cm5pS2YybHk4WlN2QSs3MkFTdmlZSnBWR29WbDVhb2g3bnA3RHI4UnduS0lidkFQY1FEWTBGOGR1VzlVMnd0VUY3bmJGVGhFZGdkSTBvb0pkSWxtbG9mMGV1UURYMFBXWW5uWjk5RXRrSVdQemZQM1E1S1lVZjN0M081aWJPc2VFbGQ1NHBEU1lOY3RsSm5HV1d3Mk53UWQ1eXA5SHRyUmNOOFlpOENGamJPY2JRMUlyMCtuamVsOExJY3RnWHRrSENXSXZkRDBWU2k1ZGpkdG14UzdOYk4zTUdZZTdUZ0MrQWlyMFdhay9UcTJjaUxnTk1yaGxYVFdVOEVzVnlBM3NzK1F4REdTNVhqWUNlRkdLOWpSWVE4QU5PdVpOZHFJMmg1WlVTa0ttcm95UDAwRlF1V0szRVU0NE5uWjRjVmZyNVBiUEkvWDlDVG0wRkZBd2NnWVo1ZUE0OGlhYm5PZzN4eWFCUEgzU25LaE53ZTQ4Sm1CSWFHYnpWdVBXNkxWNjgyQWxBY3BlKyt0UnE2Vk80eWdTUVRRU2I3Q1BLWHdFMVdCKzI2ZnNuejVnR1huQ0dDZXR0NDlKMHhwYlI3R0J2Z1F2TFN6TndBckF1elZJbWxKNm1rTXY2Mm1yOWZad2dTVVdnQ0pHTkZRSDFPakxlcFdSNUFkSUlRak1zNjJXank5WXdsdDVWNDE0R0l3c2lGL2JuWmFzeGc2eHpiZ2lKdmxjTzJwS1plUDZHRnRMcXE0cGFPM0NEYVdsZTRwUjEwOU84UjN6Q3BOUTdLbi9YMUtqY1BjTEU1Tm94NXNqT1c4Zm5FVXlpZTVwK3dPZzJVR1RCL3kzZ05QVnBMQkxRMGhuejdHdUp3L0NjK1VJTlBnb256UGFVazBmY2VRQzZkMFZrdFV1SVozYzVnS2Nmb1VFUXk5MjZSN0NjUVlndTA1bnhZT3BZanhjUzB4MkFDb0sxcG9hcCtIQkdzOWxRWEN0aC8zZTg0SzZma0gzeS9zSXVvQ1IyMFRySGN1TmxMaGlnV0o2K1Y4LzNUMnlaYkxHbFhFRnQyN2tDVnV3YXBvb3plYTRuNGgvY1JrZUxFZ1RhWnB5cW44UmtaODQwN29xM3VPZ1p4enFTRGRVYXgrd29QbnA2dk42VmxXckI3b0hEQWU2VWlldnduRnR6WFJia1pveml5dFZSajFrVTI2U1p3RHZzQ3NmdndFbUNuK0tFL2toNklBUDg0UVhab0pXcUN6RldyRG40YkxFMzRRUDVHREtseWRsT1NaTUtsb2FCS0JkR2pvZUZPNTFocEVWVnluMlVNMXMvQ1BoRUJmVGRSN0wzVk1PNGtlYlEyeXo3a2NvRTN0bGRsSnNBdG84U3h1dnlrWjBYRXg4RDBSWmZyUGprc0hMZG03anZDVjRDd2tqZVhQamd1SnI3NG9KaEo1ZGh0dTF6QU9nb2lVN1pFTmZLQkVDOHNoaXJaOUtDMHRBNEsrSWFVd2E2ZHNuamh5WGQwbW42YjZhU0FyR2liZmZvL1lTa1lHalNPd0w1M1poNWliTGhtTjlHTHhNQnRISmZwVWZSdzdiRUpERnJCK2pJVXpESituRFp2RnE1aS9KcVRwS0tjazJuL0g5RHNXVGZ4REJFbmZROGtQZHN1NzF4ZDFRRy9Ua1AyM0lIOXZlMUFoRFRHRkhFbElkTWxBbmtkZU15S2t6MTRyYUQ2dzdlc0RMT1BSd1JhQmlXS3ZFTXVxNkovbGtKSGxhQ2dPZFU3WEg2eEYvYXlKaTBJWUh6bllVYVU5eVF0UzExMU01eHVKMkt5VjRuUDdScUw0VUVYWWZMVHRhRE1yUUdpbzVMRDR2Zk02c0p6aWFJV1hqVENzS2dkRlF5V3F2dTc2YkhJSldDcEZnOHVIUjFWZU82MHhYKzI1QU8xSnZwT0tzdkhWMDdCV0syRDlONnpMNHM4ZW1QZks2Z2FweGVYeWtVMng4d29QeWNGcElZNkFkMUpZVGx0UzJmNHltWk5pNFV0Ull3Y1FobEVZQ0VBbzR2bEF2Y1VBS1ZjQXAzVFdzUU9mYzN1UkM5L0h5NjI4dUFHWTljY1h4OUdHampBU0hYSEk2cWk5RlZGSEpxQ240WFhubjFDNW4yalpGNWkxbjV3c09SaXVnSDZINTJVeHUxOTZhSTFNOExrNkNvckZPZXB3TGVkeG4wQ0l0KzEzWk9INTVsOWVqeHVCYjU3Z0FkbHhEZ0xUV04yR2pFcFRMdlNHMjNVQk8ydjZiS1hYRy9UQTJBWitKZm5HYWtEck1Zb09ud3lVSGNLeHA4VGhJYlYwVkQvQ3ZXZ0xiMkRpQUxEOHpSSm05ZFVqLzVyUVV0b24zekI2ajcxTk9YT1BlRjhSNitZZ3g1ZkZtVG94bExjbzdUamxyckd4OUVjRXAva2pYTE9qellRUUkrZ3hMK0FPUHRseGRjM3c3OGYzTU54eU5EWVI4QnZLQzE3bjNLN2hOajFzTllUd0dBUkgySExMT2NUMXlDMnhQb0hRT2U2ajB4L3BCN0sxTmRWSS9yaTVtVlpMUmE0a0tGMzh5YVNTSXBzdkhvTWlZQm9aZytqTUJmVjBsYnoveWVSMmgvMXVmTFpJNERONXFHT3REcUVNNUZzdC94Y3BOYnFNSmNDOXk1RXRqSk1kOTRmSXVRMTRYT0UxcWN0d0JKSFVORzJiVzhMRWhIMXJ2bjhlM1lzM2lseDI1ZlRQRTd5OWN1T1VKOXVXRkhvUEZoYWl2Ujhoa1RWek5YUi92dnNDVEJaelZZY3lTZ3dXeGw4Rk45K2pTR3ptUDlKcEdnVXNFaThXTytwQ0JDNzhMTm5KMmdVZWVSVGhJL1cxd1pNN1Q2Sm9Ea0FYT2lDZnJIa1U4QWxHZUJoTEZTQ3JsYjRMSWc2dDRDclh1cTZ4NHdlU3dhTXpzMjRKRE1UUjUyTi9xNndGNHNRcEgvU1B1NGFKcUZRRU91OFMxMUYrY2ZVaEt2TnplTjNjQy9VVll6RWZDMndueEdHV3BnZmhBTVVuUHVDcituUlBMZ3NTekZFUnNWQVRZOXFyMHkyckt2U1ljVW9PVEdrTk9Fb3hLWmZiSnZzd2FYclZNYlNjZVMxNS9ZWnVJNnhTM0gwZUw1QS90YTFycS93bUxPL0wwK0VTSTVoVENkVGx6a3kxNk4wbEZSdVJjVTBPUzBJYWNLcWFTazVnV2ZaeFRzcEE0Z2NiTkRLY01zTTQyNFpSN1hNT1JTdGc1UVV5c2JXUGh0alZ5Zk1tM0QxMG01LytyYjVicko0ejNYRVVoTXFpUElmUEtTZjJKdVEzQ2lPWjVJcFpVK2t4eEJoMmZQL0ZORDlnSlk5T2J0SFUyQjZUaG1tU1MzVXI0YjRpYU82NXhEekVlYUJKTW5iMlpBOXdHTDZlNGtyQlVQRzFuaEFmWEJEZnFpVkdDejc4cjdQL1JDd2JFVU5QaEFFZEFzWmsrd0RkcDNWUmtYNzNBNXhsNGxkQ3pFeGhXOTRpYldTYUdRNEh5Y2Rhb0hpVEV3Rk93K0JzaWJjU0wraXAxMG9vYUlPb2cxQ3VnWGNNREFXVXV3ZkJ4RFV6bG1IWTQ2bHpaWlhYUkhoQzB5OTU3anUwWGNlRG85QnFsTWZqYlhBUHE5cXJBTFk2eGxDOFJOcUt4VkQvWUFGSWhXNXQ5WVU4cE81dHFMWnE4T1JQRHhUN2hSZHJvZm9JZ2pQNDdsQmVsSkY5WVhBS0I4VXRsTDIvQW5OS1p2bVlmOXZvWW4wOTB6Z0Urck9SRGtMSnN6ZUwrWXVxZE5lY0loeEx2Uldic2s0TFBTLzN1VmF3WnY2dHM3ZmpjcnMvZVRlalpHdE9LbWJRQXZIMThrSlpZL3I5cHYzOVg3UEVyV3JpSVV1YU1scVhzNTNJbTVjR243dnBwMFlJQ3huSHVkUW9IWTdpbk1SM0Q5YlBuL2NwNU9oa1ZsamtjMHhsTW9NcW5mUjVEYXpuNXE1VmwrVlVoajAzN1VOZm02clYxZDJDNnlKQ2ZkeHBUS3JJSFVGTi9hd2J1bGZzK09seUpIdHByY1htVHU0d0FNVnplZUxGUFZSaU9sSUN5WmRaVDVpZVJwTzlacXdCa0JpZzhkdlRIZFp4NC8wRGxKaGJKcURGUXNBRlgyOGlyOGtWNHVFU09kOE5WVGJRcE0xUTdrKzJnL1gweDdRUURPRUJVQVovQlVha3kxNGhZV0xCaHVNZk1nc0t1aGdzNlpqMVRDSUZsSU9GeldIYXh1L0RmbjhVdkhCZjBvcDRyRXV4NHpDOXlKUmdTY24zdS9ncmxGWHpSY2tiOHlhVTNaYkZsRWlYY3hIMGlFWkxqNDBvRVlCSTJtZDJQU3g5dG5wb2FFdmRjRnpPb2g1dytURzhyOUVMUGI5RHRuUEdCUmJKbTBieDJsNkVjZ3Z6QTh2YzJ1enBYWDlOMk0xd05EOFpSdXJmUitUVFR3STFKU25iNG9idlMxSlVDRnNkcGF1NHpFRDZvT1IyUlIzRlZxalBicTVKRjZlVTYrYlRBNDNDekhzaUw2UW9UdXpKRExiSGZIRVdlRENzTitibHdPWXRCWUZ4S1VIRFc1VUdlRWMyT0RJL2p5ZmFhQ2VGeXBzVDZxWW41QmQ0Vll0bTBxc082eGl4MkkwTy8yMWZSdnhyWkk1MFNXMGdlZTRDdVFqWW1TNDVMMXRGK2NqM1NyeUFQcWxDZ3VNSWR3OFhPalBiTFlyUUVJZ0dEak5jWW56NzkxdUtTaWp3bkxWVjNSaGt3WmtJdEZyVVNFelNQcGFKWWJBb1ZscVJueGpFanVZUHNVL3hNemFxUWx6YnBoYkVwelhYVVJ4VXEyaVZDMjdWS1VkT0h0Z29OdU9JNlgrQWJsZ2VJY0dQTU0zam1VOTQrZFlKazNIZzk0NmRWNUpJUFB3RHppSEo1endBMS9hREdJQUx6ZEF5Y2xsQXh0TDlIMkw1eGxXYnlHUU1kUFladHBaQmpVMFhDcnJFM2FqVHhOUVJKcGY1MVV0ZU9EUHBTZU15c05uWmVtTmR5SnE3OUV6Mm1FRko5djF5WkRXL2w2bUJmRlQwYTFvMjFKc3djcFZoZ2F4WWZJZUY2WlVsRWg1TzVabmJ6TVJmbUs5TEljSnlNcmtIRW95ZlBuTnJvOExBY3ladUt3ci9HOUhpOXBUUyt3bXlsS2lmdDc3LzBtZm1sNFdwY2wwMmZiWkxRZ0ZlbGczYTN6WHlPTklUMDlmbG9NbjUwdlVHQTB3M1ZqcU5pRFMyaGY4RlQ1VW96RnFkY2V0OXc1UTBlZVNTMi9pbVluVDVrY21YalNDbElObysxanhScHZwTUlEWWM2UStiSHM5QkthOThGSkp0ZkMzZGhjNlVmRE5ZRFlBdFkvVWhsSWZ2WmpWZW44dnhEVTRxa1BrZjIzTTR3WFFuTmo4VUVHbml2aVlUZEFPU0xTR2l2M0J4cUtjWTdpWTZpR1RoOTBoUHpOYzlWais2NXpqMHg0aUF2NmwyRjZwbnRaaGUwSjRCQ1VvUTVFdmJIZzhvSjVRSmFza3FCNTB5bStQdjlMT0tFemJoeWg0TGNnZHhNVU92SXIxY2hOMFpuNE53a2l4dms2cUorcE9qWGdnSm0rQWdJQ0FnT2VmWVRkTVozMXNBSmdJUnJvVWh6VjI4cUdxRU1ROUFnVSttRnBTUEl1Mzk3ODU4cXpNR1hnTkFlaEtLa2lvekFNdUh1N0Q0eFVNYk5obFI4YjlHa2MrcE5vUmZvd0M3UDFJaTVtT0VZRmtYby93Zlp0VW9MUThqTTU1QVI0Kzd3eDZPWEpOOEQyb3REaisxYXo3Z09KdkNxMXJOMWtQbmM0NGwxdWozVk0zWnJEZ0s2YWRuKzNhL3RwSUpLWUthVUpLbTVtYlZTRjZWYUxjY0RURW5Tc1JWWGFJWEZoWU9iVVRSWERrVStwVUFRUVl2RFhmeWtkVGh0M2NYQ0RwOU1kRi8wdGFnYkxQTFZlVTltdWo3NXhGTk9qOGVnL3hDeHJkclh2QlQrdEFiTW5jSG5VempUQm1nc3pqN3ZlSElUZ1NqTE9UL0ZHQllLa0pOL1dCczc4ekFuVEVPS2pxSFF5Rm5YclpSemVMQlVUMXFFYVRZTGVEbTNkZXpYMGNlT3dpYmpGbEpvY3pVWXEvK0FUNUtqQXI0cGU2VmhvbnJmU2lUWWgyRFVodk9aeWZaNVh4K0hCbXg3dHlFZngvOXU1TVRsSWNIUld4ZnpORzlwMHk3WVNaRERrdmVqbUpZUDlEVVRjSnJraXNudU96THZ0eFpJT1ZZZHdaSkZ6L05LbTFZV3RzRVoyd2g4TEJjUFcyRm1HMEFKbVQ0SmRqRHordGNkN1Qya2VEOUJ3L0tPajRSSFJjdWFNNDZzNWdzcEd2aUpSOVlOQk1iS1lHWjU4VzJZaWpsMGxuSXdjbXBnQW5lOEVXKzdiMWNNSWpCNUN4SG5nQkp2M0haNXJNZm1mMHc3MXRVLzRMRzI2bWthWjZMdTNDT29nVWkxREdUS2o4bkVpNEt2d0xtWlFNMThnakZ0YWVCd2dXei8xWm5YZ3lNRDZCa2drTGJMNElCQUJVamNnTlZxU0svbVB5c2NnTGhXYkNsR2xWbGdqazkzcUpZYSt6cVJlaFZYSE4ySGo2eGZuOVVnckpnY3ljc2dMSitpdEExdkZTM1dXVUd5OU96VWc3U2xnbE1xc0VWeEhDei9lYmloK2hxbSt1T3h5QUQzWSt6TjlYSGRPZDgwU0NtUE04bGZqM3lrOFJSMktCdFBsVXd5alZTK3pKODc5NTNrZXNSYjZJUHN6QVdCRWdYeW4vQWl6aEUyL0ttTU1PUDNQR3Q0WGRkekNIaDcyT0dSWU41d0dFc2d0eFphNEJwV0EvMXlNcldxem9wMkxZYndlRTJRUjFkNi9RN0lPY0M2YWdqSFBkeFBwa2MzUGVjVTVUQjBKSzFZUWUwek5CU0lUNFlabFZUOFkyMnFndUVDK3M5TzlHbXdiUFVmWlord0t0UFBhZGNOWnE5am1DeVdHNXFlTE1ybEMrZGQ3WVl1dmVndTNmdlNCZ3BMYWRETHNaR2FtRzZ1N0lsTkFIc1JaanFjbnJEZFpJS0Mxdzg3Q1YrR3JmdTBCUXlyZzJqWFBSaGZBVmVIYVJzVFY5WEpsWTR4VmZhSHdNM1ZQSmpLMjBYTy9TS2JSMWJYbU5QTkxXK0trbUw1ZFZvbk5QdDVFWk1iR3JqcDdzNE8yM29KckFsZ25nSjBFWHZZMENSY0l3bkN4QTZtbjc5TVFxZ3EvRHlrUFQ3bHVLKy9qYWtvclc0NVkweFZJTVdobGQ1QU02VjRhTDZCYVd4N2Y2dTMrdDFFMDhkOVVlc2h3cENTdWQxZm5mNkVFcjJGcFp3UTI4cHZtVTVBYi9QdmhuUzBpUnNLY0RhWFpoZUJnbmRLRVBpNnBJRFBPSExHcjRhNlA2Tk12b3hLa25GbkZES1RkTXY5djRza3MvaDZESlMrbDZhSHlHdFVvc0Q1bWR5WXBvbU9IWHVpT0RyUy9sMUxadFhDUXJSZmtFckhqL0NJMnZkcmt5V3JvOGZpYzlCekVGdWVZVEF1WFg2WlMxTThhYW1LMVNSOUNuaFM2TlJtb3U1cGJiVjgvOEwzWWxuSy92Nks0SE5SNUZQUGdIaFFzcnNaVHUxTy9kZVJ4Zk1uc1VLZTdlYVdaN2I2NXBvL0FNZTNJcnk5KzV6cTEwNmxITUtLL05JVUdWdFg2UDh0Yi9lcVVNaUVheDcyY3o5b05yTTV6VW1BaE9DNkxRWkVxbGJnSFJNWk1XUk9HZzZuczJTalM5OTdoSDBhT0FkdUZONXJUMnN4S1gyUEh2LzA2azZnRlZySkIzTElINzZ3b0pwa2lMTC93alFhd0dJM1dsUG02UEZLS3B0blVLNDVEL09udzRpeEpoU05jQ1NoZjhvVDZuVG5ITUhWRjVlN0lDTnBJWUxLVmhIZjYvTGRRNWRJcWZzZ3JLTEZYVmkvTnoxb0RBR2FPK2FEVFVuUkZ3a0VLQ2lVbXhuTHBoVi9Ga3ZsMzRJYTNpenN5WE9kbmRYUjBIbTdFM2VuK3FxbnAyYTlQNHlOaFl0L3BTc3J0cWF4U0dDWHZKY0tmdTZ6RHVORExpdUU0Q0NWeWkyZVBPbGhqUG1zNmhLMkZVTHg1THB6emNlbjVTSTdpa3Rra24veGtrVW5BZW9SbFoyR1N6cGU5d1IyMUVwYmFPOVZWUWsva3I2L0pIN2JUbEtqNnI4d2dWR1p0NmVUSWY5VXBYV1htSzFTVmtoQXBhUExTY3RXVjBocXU3L1JvWTZzcGVtZEpreFhMN3FNbkpNT0tKOERGTThLNkRPcnJFajloNW9XbkE0YUpRYVo4cEwva0hnbjRSeTB0cTM3T241TVg3OC9EZG5FalU0RGk5VVZlam9XY0dzMkVrUmMrQjA3T3phdCtaZEhXRG9HWjJzaUJzbVRrOE9VVW43dVFrbk8yVmlQM0lBUjVNM2NpU3ZPV0pkU05uT1pSUjdYNEJFSUVOd29hbzZtenJqeG9yWWN5czdXVHViTU9EVGJVUDduN1FzNHQ2eHhtNzgzalJxQ2xocVBUc1h4TFIzcG9KZGZwenc0eUJCa2N4TnhpMk5PcVU0bmN5dW1YZStmcWc2R1BsYXl3ZVZ1dVpyelBEWjRjZ0F2b3R4THNNZ01VMEs2NDdOTERpUC83NHAxVElWRnZRd0ZkdHhMMXJ3UjN2Y1dQR2JWZXFnWVhXZGliYlErVGFFL3M0YnFSRGdJK1JTMXVMeFRLMFVXMU9UdFd5aCtZeE5WUTFaTlYyWmJSdXFGVWR0dE1lZTNnQVo2N3BxTFYwb2RLa1g4Y0Vla0dMSVZCS1VXQnJUbXdyZjc1TVl6TjBYL0FVYzJNbzVwTmZTSnRGOW45aG16a3BTMnZ4bDVDZVdXMGdLb1lPKzk1dUN4N3BhOFRNazhiTmY3bjJzeUNkTU41UVJ5NTlJS3Ryc0JxZUhDaWtmUUVrd1RPZmIwZkdEbmVxcExKVTUxSlIxcFpXL1B4VkUra3hncHMwczliUzJ0NENXZ085YnV2NFo5NE5DODRZVXJUc2pXbWhGUHk0YzdhalNLVjN6WEJSV25CWFZSb29WU2owV0VDdmsyZUFKTFhZaFgwU29oTXF0c3JDNVhwVzFzQ0YwWUVoTVZFZXFBZ1FvdnhtSjRvdklqcnZSWkJVVXVmL2h6ODlsNmphWmNQN0RCdERlN3oxcFdsMzNDSWV1RjE2NTh2c0t0UFJzVEt4emM4d1VTbndhMkZoRmpRVGE5L3oya3VXUnhQWXV1STdteFVsUms4SUl4K3RBMm9qbUVMK0ZwMC8wdmZHUjlESU5PQS9UUXpWbXMzbkxQRWNlRExYVVlFZ2VvTXFRNU9ST0lQNnBKVlU4bEllV0FiRGt5aWY3THpPUUliU1NTUlNOQ0twSVNIdUxocHJzdFYwWDdtUy9la1hTbmV0eWpRdFBod1RuYUxMRVdQeW1LUmhSdnZkWlFyZEpJMUU4cEI5czVLR0dXT2cweTd4RS81QjlCMDhWTDVCNTUwa01ROC8zb2pjdUtoNjhzMjhMSjhJZE1sWHNBZVZHdndtci96bGJZYUsreE9Icmp6cmFTcHdaT1Q2SzdqZmZ3cG5PYURxcUZlNDdaMjJjUi9zR3lrcU1HL1Jzb3J2NEJRYzZHYTlpRlJKRGVYQmJ1QlFNUVczZW1OVWpVRFlrZWNpamhXNnAvS0xxMFNYbDBpWTZWblpySUpJdGVvcXh2MVgybWxKZlNJRzlZZEN4cWx1U2dtNzZ2eXQraEdySk9zenBsWjFKc1BaMU1HcCt5cVUrZExCY1hyMmd4bndNY1VzV3UzNG02b1RQVE9oZm5ZQ2F4ZEkyOEphNFdaRk8za2xpakY1ZTJkbzZFSG51UkY5NXJFUTd1ajd0U2p1cDFyYXJ1RVY5NGkvUFBPN0s2NSt3K3FmTkp3WVhmc2dGQVhRSEY4cG9tbWovaUpNNzV5YStCZWVpUmRKbUpBdE1CQW5CNXNwUEFEM2Z2OEI3T1kxbGpnSTVBVFhCMHRpRFZMMU1rUWowZHR4RlY5WkNCUk5lWXY3UGNZdkQ4ZytWTGxrRmpNNEdjZ3hITG5ySHFYOTVQZCtJLzlMdll6aGo0OC93bTdrU2doaUJqN2o4eEhhQmJaSkFnS1NXaldrU2RDcjdaZkxEekt3UlRtNFUzZ0JMRmpjQWdGbS9GVEZwc1JCZzNIdWFDR3MxMnBDdGxLRk55d0hPOHk4RVVjdmphQytTU0ZhZFlkbElnWFVqNFBja3dhbWNHU1VFdGtwdXBoNFVCOW9YeDhRL2hNTmp0M1pydnZsUlhSWU9pSkZZd0lqT2ZGaXlhQ2hrM3Z6R0xGdWZxRFkrZFFxNU5QYTJBMG1XQlE5TVhRT1ljQWxkeXh6cXhBK2xjaFZWWmFhY0NTL01QWUdVSHNGZkVWY2pwWXJBQmt6dEsxVXcxOXdkNDZXNDEwMnovSDV2QU9XUDlWVVNNL1Bud1ZvYm1jT0RQNWltM25JMVRiYXlIWjdRU3JBSnBCRXFzZm5acWpreVhlRnBDY2NrOVRyZmJldnh0UnE4dHlJbTB2NnozYVFoUnRRL2ZhdVRzekpDem1zQ21xbDZYcHFnL0FZSXMwSTBhaGk3TGhOYzVtWUxNU2h1TnBhckpGN2hjQk9DNDEyaVVPTGllcWhod1ZzaW5ncTVJWmxBYXh4STNMS0IvWVRSTlFOU1dmMmVabjQ1eWZHVnhVZWMzYWZXYTA4R0l3QVEySkZtSHZTcTNWOHh4M1psRlhGMHpOODFpeE45YVJSVFo0NUl4Qno3aXBIMXNGR1pQRUkyM2s3YlBPcENRQlJ0bGQxM3ovR1E3dEU5YnNlSEM0aVBMd2RPRDlwZjhvaURtSS9qTjhxQjNrdkVkbHhZdE11dVRadW9keVB6WENZTVNOdFdibWgrbGJVMGgzN1BOSmVwTFFHamJHY2FpbnRZdFZZdXR4Zit3Z3BabklTVEd5Qkp6d3pZdklkODZpd3JuTktJNk1udCtOK2dSTTdnWU5QZFZwcXY2OHRHbmNpaFFPY3FvNkVaMXVnd01iU0RGNGNJV0N5MnkxOUFKYXFiTkw3SEdWVXZzc09uRktjeURIQlpRU0l2VmJGeDZZNVJLRnhHd0kxQndxd1ZPWmFzQmwxcjZ0V2xaNnhmaGhFc1JnTTJXcWhkV0tlYUtoREJWKzFXN1kxck5iek9RQ0RkMXZJZE8vSVd6MEdFc1F0SjgrbEFDL1VJODBlV3JDRUE4ZFdBN0ZCZnIzVEw4VU1IZ1BpUFpGcWhwUGJMWWZmQkMwV0FEcmpOdlliNXM5c3FubGdBK1BjeGYxbEQzMWxlL1drcSt4am4xbE1YMk5aK3Vreit4bjMyMmNuOE85ZjkvMUNuOE82QU9nTlM0cktVQ1NQMXlHVGxyNktqTUtyZWhUT2NkU3ZMUDJ2ZkVianZvY0xIUVQ4djhEMzJDSnJvdWdpKzZTOHJoclIzbVZ0bTBUNTVKc3IxNVh2akFFWXJWdnB2TWhkVUF0VHNoclFMbjYvL205WHdKV0hSamF1eVp2L09FTG5xWnhSbWIybE1qN2pmVDlEZnlic0VrWUJVRStPdy9Cb0E2K014L2VaZ2dqTnNXYkVzWDRTV0NYNitZN3hTUmpoRzZDM1B5YmMrN01PU3BpQzdLNkdHdFBmT3BXOGlFcm02SHNkWkhEaFBBMGFIdEYvRi9NWFNFS0Y5TFRJZTE0TzBlVm1qL1RuTU5qYVlXYzFXcVpPZGRuS294cVFaT2dvLzJZcFlsYVplMTRjZDlLRUg3MzZJL3VQeUFER2ZKU3R6N0lwaEJwaWtPZjlvdURNVytYc1hqM3BqSHBKUjNCMGNhQWw4cnY1T0xSR3doWG5paG1uTGF3T1ZEZXFZWjlCNXJ0a3FVb1g0a2MyU2JhSDhjaWZQakFpQjF5Q0xYMzA4TE96aWI3MTd6TXA5N1N2em5LVVl5YytFT2dDVzV2Z3dld2JESzA3VG1US1BPYnVyeGFONFZYcDdkaEZiSTFyQ1hCOG5OWW9rSHR0ZVBaZUtwY0tpS3RzT252dnh4ajNManJ5MXVGK2VuUVJ2TElmS0hkekl5ODcweG56YUhBdUkxR0JRWjF5d1JESUh4WVFxM2xlTTZyV2pId01EdVNReHpMZTVYeVN5K0dLUWQwcENiWHJqK1F5VmU1YThxQTJ6Z0VTRkpkZm1ubkU3L0FHdE9pUzZsek1nVmRId2F3c0t5SmJWell2Z0JnWFhYSFFvN3Q3Z2VYcnBsdzNHc3pOUDZQOGgyR1NhT1dRN3hBQnZXTDVtQmdxd0pXeFNuNk1HMzcyMFR1d0R3OXRhZUZzS0ljMFBJNWdKaG4zZ1U1Y2RJYVJuYW12Q1hXejdJRi9oRXhWQktZbGFWK1JxRGdvcXMvUDJJa2FHSjdPMGxkQVFnT2hKL0pSb0RYVHhNVnlpZ0RzWE9BYzhBV25PcVJCMzMvSUhucXZrblpyNWdZNmZoRTZCSWJpL3BDWHVmV3p6TysvcXFPVXFsYmQ3UmFmOG1seUZLdEsyQ3hueU4yN1BETDhrNVpwV2NqQXJKcGU5YkxCQkQzWDJ4aGtXMTRIdVR4QXFhK3hubURSTTRvZTdjVDVRZXk2M2tRUnhlb0lPdFA0TEFwcTd2Z0xmRTVtYUM3Tm1sQkNnT3N6czM4L3d6bTZ2SzJvYnlQRFE3cUpDK3dUZ0RmL1pHb0l3MTdoUG4rSnZ4dlJQSGlUOTZUMXl1VzZhT0lqNVdUck56cEYzN1pXYTdVczZrWVJWTDhKUEd6Ti93L2FkNjV1VUJlLzFPOHdNcWpjTEJQdVpHRXp6cXBvdSswb2NYRVRiOU5jU09vcWxWNXdDZjdzMWF3blpwRzNnQWVPSFpTMXNCZWRHRWQrK1hlbVNuck8wUHhwZTNTMjUzV3V0eGZ3QWRHZkl1V2R5R0liNEl2ODBjUGl4NWtxLzB4eTlucVdCRG1HeDlVOGFGTGdOWkFUbHJ2MmJTcGxXWHJDaVQ4N0grbVZzemM3M3d0QXN6VWdMTUFXT3JoRGZYL1FFYWdZd3V3M28xaFJSMXV0d090bHVQTjZaMVVtMzBjbFBrNU05RFlQb0l3Zm1LWDhqK2FOVzhtZUp5Mm82T2NFdEJMelgxbk43M0tJWWFqSkNBWnRrL1pQSCtUQTN1UUZuZGIvR3dVaXlMUzdBVWR1L2pBMkcwcSt1NjRvSmVvczdxRWEwT1h4eXAvOHJCL0JrTWxBYS85WFJrWGFWQnd4cnBlQkxqaVJrUmc4NzZoc3lSLzdUdjZWeEx1Z3ZJSVFqUlYxSjFCTHlkMzNjVzN4M2JVYWU3VjVXOHJYRlRjR0RaTmFNWUtDRS9PNnFSVzRsQXZnNVg4cEU1ZDdSVkpId1kyekZnWlVkbkRUcFJjZkdjMHJraVR0c250R0tkZWF4V0tqaDJZMGl5dlBtQklsejUvZHBNV0MwTXVpRndGeFA4V0xwK2s0NnJYa09qZ1NrazJHbDNJeWtnK0hqUGNLTDZxZGNqc0Z4eGh1dUtvMldPUWdMckRxZG1reEt1bXBvMzA3VVdkcExoVmE3ZWpzcml4dmdIS2Y3THh2WnoxZnB3TnViL1UwdVY2VlRNYXVrS2RCY3B3M1I0L0Y2Y2ZPOHN5VnF0MXQ1RGszdmNXNlZ6c3RId3BGT0ZnMkhtNUNuTkUrZzNZMkxaT05hZWFoRmtsT2RwZEhGQ0RaVitUbnBTMVZzUFpZY0wwdEE0SVljWVJyM0FRajYxWFJTSEFPUlY5eTJXZ09iZm1rOXk0V29lWkdGQ0R0MkNkOG1oTFpoR1pOWjZqRkVULzEyYlZqUFR0UjY0NWEvZTVSWVQ1NkxBc1pHakxIdnhpS2hmUHV2Y1F1Skk5RmcxamN4aUk5TTdSZzZGcDg3eFA2T2NzYjJjZjBlOXlwSmZNMnpVRjEvZHhZRkpsSnh3WFBBRUM2bHh0YU5qMDlxUXFXbUNBZ1dKRDE3aVkxNXpQZC93aE94K0M4a0JEaC9DTjl6b3NFYVRnTzF5Q2xHSkw0TVdnSlNKcFRBcGpqYnBMeUpJWWoxK2NyVDhWU3JlMUFzRGZYL2RxVXZkV3VHd1l4K3lEeEFDVnZxZk9DdXloSEdSaFRycjdvRkpQZm5GYmkxS25NdmFMZVlFUGlESVlqa3c2OStvdEVNLzlndmJPRktmWjVCNndJRlNiaHVvbFlzb0JFNTB6MDRQeUVpeFNNWm94eVVwa1ZxVmJvMW5jK3hGdUNHa1hBQVlSNVpxbHNJenRLQjBic0w1cUcxdE1hanpaaGk1QlhUZUxKaTRZc0Z0K1hPOGJvdEU2MHl3WDd6cUhJSkwrRVFaWmVtT3JUZ05ZUmFIR0kvZWJFTllYTjdPbnUweUVuWHFBcW9jdmxnUy81VVE5aWpDNS9xQmdPcmJPUWd4a1FPR3YydkNJU1A0ME9iYjNWVi91d21rTVk4eEE2Q3VkQ015SFR5c0FPK1BpZlpFSXZuWmVFN0xtdlRlRzY5UlQ0alNocVlNa25lZk93KzFCeURMUlpTNGJ0VUtHdVBBUG9rVXZWZkRoOUxNMGhNM0FUWEJLNHNKSDRmd0g2NWlTbmVYYkI3VWlkUVg2Uko0NTZjZXA2aWV6U3g1MExsMEZKS3pxM083S1JvS20rUDJKd284c01uVkRyaGhLMG81dVJBTU01STFTcXU2amZrbFB0OGUvNkhtVktISGtvTmdwVFliTmpwTG9LZGlVdERVN0JiZ0xYQ0MwSXl5ak1VTHk1NlhqYjZXZitVaTl5K00wY0MxZ1hxeTZ2elJld3hPUkx1b1dEdFlWNUNHSktxeW56dmNPNlhjVDR2OFpHU0dleElmZE5xUTRsSFFRMzhBOE1SQUdzazhWd2gyVFJrc2dVbENVaWJleitYRmV5YjVJRGYyWE1IaHpuUUxMaXhLMHl4eVBVVld1SGlOTkZFbGp2N2ZydDgzbElZcHpPQUp0UWVXRkdOTW1aMnJRVG5XYmszQndUbVJ0M3BLU1NDdjRJc1U4VGVSNDl2djZ0Wm92NGd6U3JIVStaVVFvQ2xZSXY4ZUtraWlSNUlNeXgvYzJiSnMzZ05QMFBpV0ErWmVnMjI2azFMY1htRUVkWkxZY3ZuaE5lb1h2YzlOckdsVjFDOFgyQkU2N29DTlpOaEFFTUVVcVhFdGlZWG92N3lwRHlVU2xaaE80N0JYQlZ1Z3FEUzRIVjhrSHZzblQ2QnQydTcweVlValc3SGk5TDB4VnVOS0NGMlAwNUlOZ3FVL3I0MmFuaG5ZMmllSG9lTUdGWW5KdlNaRUVFYStNVklyWlZETFprMzFzZG9SWjllVTBpQlZ0Mk4vemlJZU5STWJJRlRBem1HQ1ZNRkFDNDQrV0RxUXFxakZIKy9wV1creFhJQy8yV0NmT0JiKzczNzZScXR0QTk4VWFicmNBdmFWUlp1NWVubTdLMlpaWEV6dVo5WFY2ZmFxN0hkQUNnNlRqZlFsdG5UZ3BBK09aS1pHQnQ5aWRHNjBUUTdNbHBHaGhDSnAvVEQ4Sm1LOTZXSUdQMGVrazdXWllSM3MyZFpNZDQ5bWNYdFcvN1RJckNRVDdTZmk5TTBuVGV5K3MwS2FUdUk3L3hibmk1QVJlV3lheHdHMW9MN1NobEJ3cW8rSTlFd3dqUjdUcjZuOTRWaUJRQVUyVnZFM1JvalkwQllzaHhiemNaejBjUnppZXhGNm83Q1VRdHpPNE5LN29aQ3pKWVptZm9ZblVwYm85c3h1NmlLTk0xaEhsbHZ5Y2g1ZzJwckFERThvWVlHc0gyZkRrRHJWMk5OQzNodHdsQi9OTDVRdjdHL3U3b0M4Y3RwSUNwbDNKNUpYY3RwYyttNnAwaVA3M2J4U1lIK3Ywb3A0Nkhuajl2UTNFU08xZXJLK0x3RFVZNWorKzQ0ckQ5dE1jR2pnTlBwYzE0Z3FDS0ZnUmpEWE54cVBtRmRacWNEQm5tOWo2YzNqWE5XM1lWUFpIRmFpdUx1TU4zeGxxd1VKRERkQnNscTJ2a2ZNdDRlZkdmUk5EN1dJQkJKOWFaZjRsbTJSMGhDMXRqUDk3Mll4eWhPSCtRdU9BQzdLWjhZZHNnVWQxS08vSWNWKzB3Z29MSFpNdlJOcSt4dXpqUHlkM1ZWWWlmQU9QeVowREdCUDNIRzJtQkNxQzRLQzJDaXR5dmpWeU1zbjF5NktLR0NXV3dueTdMc2RYcFQ5T2VHdm90Qmk3Q0Q4cG1XbHlQVlM2dWdxczcrOEdPdXBvK3BDSFp4QmhjdWlwZ3YxU2RIc0tCZURpOXIxSFowa0xEa01meXBuM0d3MXNlYUwxbGVXb2p2K0dYeWcxS0VrV0NIeGMzU1R6T2pwVmF3WHpuZW5IMXlPZ1NpRGZDSEZNeU5YdnkyK0FmcmxjMXNoekJ1WjMzSFp0Qm03SXRzbENtZzlqc0syTHBpaHVmYUdoMmxqcms4OXJLT3lHWElMbzl0V3NMcXZJUTBKbzhhOWtUWDkyblZuNHZQZHppNGlrN1BKQ1pVOTd2SUdXOXdhM3JUNnNpRzZGK1NRbWVOVnpwQXZBZ0NqLy9QZU9KVVNzbHlUZEZxK29EYkQ5MVQyL2ZJNkhVNkt5cmtYQnR6Ky9ERU4zY01QUHZTeTN1M2xaaklDU3JkdFFvOFl3b1B3V3RMRHZ3RExRZ2lxM3h4UkJTR2dTbHZBSHB2bnFXSUNEWHYyQ0lPSFphZU11UWNKY0xvQnVRNU8yMUhvZmxzTGFtbnlPcXNlcDkzc3ZURElNYlFkSzdhQjhqNFdCRlFNa1VkRUt3ekdlWnEza29IcFoyajRxazdxUlB0eHhsYXZUN2xYYUF1U2p2ZnJScHp2Y3UrMkV2YmJQRmdYU1BlWHNrZU1QWWRQWUpEZ2tmKzhIMXdQSmtBSGV6NGNVaG4rZHd5b29qcVp0T1BOZ2I3YkIvNVdCSjcyVUFIMUVvU0Rqc3NjZFYxYWFqYS9FanhNRFFTWElIOFZzZ3VyZjUxbFl2MGZTUFpURGt0ek5jVjZreU4rVk5UbWFaQTZQWnFKbUViUWlWL25FemVnVnlZcUNNbGtqNHVhdmdaUnlhOXFyTjNUNjJLaHFMN24vTmZKUXVscDZ4UUlQc0o3MFlrMSsxRVZDSVVCTDM2ZEZETDZmSm5TSHQ4eHNVTjRlczQwbGpxUms0TzhBek5xOTdmd1o0dzR4c2VrYi9NcUgvSy93YlE5czF0NmJEbHdneExOeDhmY2U2b25wOFdjdTJnMXl5NDZISVF3ZU5vY0JKWEtXZW50OTROLzE3L3hjM0JqS2JuMTdSMlJWMytzYzBjSVRaQUtkTS9yNHc5N0NpMkRYWW1oeFV4K05VMG9DNk4zbjgxcDJPd29jTyt0NHk1UE1NOUFBa0R6VVNFNFBHSC9ZY3ZUN0xIaC9tR2FIWkdiYWtHTFR5K0dBN1FaUmZMbVc1OXRYdnRzcGlQS1cvK2N4ZjhxNWEvREpIMUlTL0NQQmhTeWQ5d1JvZVlzWEcwckVRejN4T3RjekRJVUkvMXcvSEFOK3g4eVFsMzlEcVg2R3N0R2tlU3VZaUtpNHRXRFdmRk9uTDZrNm9ZSldXK3prRWtuRkY0TzRzc0I4Y2ZZNmtwdXJQOU93cy9UR2UrREhUS0d0MXMyUlVKaVVFb3d0aW1wWlZLMGRISGlmS2hyL0YyQ2tvbU1TTkhQT28yQWpUdlVNTXBKK1h0ZkJ3S0xkT0x5cVNYVjRQZWNNZUE2aW9nWlR0R05tMVp2d1JJaUorTnBDdWxFcEd2eFNzNWdXVHRCR0ZNRDd2K1B5WjQrdGEvRzVQN0w0MkZvSndwRWJhV2M0eEpDQ1M5dytJREtYb1IxZ3EwRFFCTmFNRlJUdEgvSFRPWjVaOVJrWVl1em9UbFJ3bjIzeDd1V2k5WlFybGwvenczMEpzU3VHdVFqVVcyVjhjS0ttbUVlRVdvVXNJbEdrK0hpNktka2ZWNHZodURiQXJZbjBPSWlRZC9IVXdvYVl2Qm1VNFpoT0lnMHVvQ2VEcjNKWndCUHdTeEk0V09YRFZaSE1VSGs2SlF0YmlWcnRaOTZDSW9lb2MyR01JOXFxb3ZkRVpFZzRGc3l6cmdGK2JETmtzMzQ4OVlIN2R2Q1c0eHp5NUtFamROVHpKWDRTdzgza1l3TDJ0ckJwVUYzYk1oeE82Q0l5aFg2dWNtazJUQ1QxRStYRmtyaGszZ0dCUllsOE5tUlNEckhVRFh5N1lxMGRKSlpyblQ5Mm5rQkt5RHpQM2pXMWl4VURZTnN0NUNsSno0K3hHbW9HbHBKV3VjMGNQbXFNK01sZzF4SXRFOFRqZWZyZk1sRGFTWis2RzljZWlsUmxjeWJmWlBDR2VTdXRua21oQU1SRUgrWTljeUI5ZkhOVVZJSzkvT1lTRjVDQzFzUXlhbDVoOWtETVBzL3FxTlZvckVCWWk4MlJCQ0JWeDVaTGdHM3F1MDBFakxFWXFSUFZ0R05rMHBFazR3WnU2enliUStlTmZQQU10a2Y0WHZIbDVMSmZhVmh2STJCYXdRQS8yQ3o0NkFOYnhIa3RRc1pNZXNVSFRPZVkwK1RiT3czSlp0YlY0ZzdiUXlIMnRqbFlreG81WVdzVTMzOEhzQzlQbDY0YXJGcUUvK2xtL0dOOHp6ZHFYRzB0eDVYMUZKZTVYU3V2SlRRbXNuTVV4eFlPbmxnMGxpOHBHcTUwS3dScUN5cUp0VDRuTmJrUEN4dTBEU1Rud0ZFaVVEUU16OEZ5UWRESXdTNkk4NUR2V2xPOXdGNFlKNytvSXVvN1BKR3VHL1N5bFY4MEFmNVp6S3VQTXRKVnFFRE5Vd1pJZXJ2TUR5dFIwdnl2MzBGcmsyblVuOC9RcnNzeElJNDhaOVVTZWQvSUpxODd6bi9nZHMrYUhad1h1TjluMTRVS0Y5RUlzYlBNU0tkbkRWVi9UU3NNeE1jL0lwWHFYOWtOdjIrcm5Ndks4R3VZTHNqQXJHeFUyRXJMNFpNU3hiaDZLNFVUSTl5REJGTHBrOW4zVG90WmRhc1BVVFV3Zytud0xDdWIxQlh2WWtWay9BOGFBV29RSUk1NzhPa0pGSTF5OW1lWUdxbnFUZU01Nk9nOEdVQm1WZkMxaVNTamFWbUtRTFNHQi9xZmRZNFZMTU96NUVSZ0Q3Y0YrVFlaNjlma3NRaGFUczBDWnVnbnBhTU0raGNFemNLak5JZndZRlQxY0Z2SWZjM05FUFc3UGc2VTJoMi9OU1d4bVhhS2Q4OWVlQlNIL1U2RDc0MjJSMkFrQkV6akhzR2FOY2hxNDl1Y0lBSUdjS3AvQm5ubXRTZ0Exd3JIaDlnYlRvaHUyUndROFdSQ3g5ZjRTQ0htcXFBT2RBV2t4N0tDWEVqc1p0QkFJOERaRDBJSGM3ak1HZ2ZLcXZ6cnhXeVE5UjJTUnNWNUQ2R0xwLzNXRFY1NWdKa1U3cDZPVkF5ZFpJMG5NNUtQTVNKMGhob25ZbzY1MVVnNk9FcDFjWUZVRVMvSlVNWFVFMXA3NFRENy9mOUg1VnE4RDMxeUlWaUczcEtQdVJMby96K2ZseXlSdFIwZmRBbFlqRnI0QnlnTkpiRlA2WFJQYVdxZXJ1dVkwM3M0T0lhMlpDdGI4dk0yanNqUnZLR3hvTWt5UndGMmZJYjJvZW92SEFuMWUyUVI4TkxMdnBhNCtLMWVsZ2ZLTUE4S2VCcG1MelZwUkdKVlFaY1ZTci9NUWRhUTlYYzE0M1FrNGEycWtlQXZWYWxZWmoxTDN1YnRMN2RoR1M4c3IzcnVlRGU5aEI5N2ZxaDBoK3Z1LzlaRGh3R2FwT3BpcWtQSVI1dE5xanRzYVR5enRvMnRhcWVSUzZOTEtaTWFCZ0YxeERRQ00wWFJpdnZLd2lpOC9zYXFJNnNiWnJaTU1sRi9iaXlIcGUvQzQ4SUxMWlc1QkdqYzd5dk1EbkxLTDR1bEJFYmc4NzR2TG9KV0xqRVhQZWtIS1hrUXUrc3hHOHhBSU5qa2s0b290Y2JwWUtQMDNSZFVQblBVYVBsN3ZMb3pRVTJqdWFLMUdXWTN5UWFMd3l3eWJTRTRLbnFnbDVVV0JpRmJWMm9iNWkzN2FEbnpKRXdraVlCNURDQWNVQld1TVgzNkxVUGtWczFaejJ2TGlpeUhZeXNLYjUyVHFrNjdEaEdZK3dzaEJoZ1RNSStvRTVZeXhQNXl5YlgwVlpwbkpENmpQWDh4Y1R2SzduSEdlcmd0TUMwVEg5anVhRHhzNFRHU2tnQW90bTN3QVM5M2NObGpUNHlvaGtLZ21TazBrNXQ3Vm5yRHdDakNQbEE3ZzVJb0tPYVdRdEhtSk1rbldlOTBSTFI2d3d2cEJBUmh5cjl2d1Z4N3d3bWJLYThnWWZiY09Ldmp4VWRNT2NmYW5ORDBNcGw3U3luZkVJYll4SXdoM1AxeUd0WjJnYXQ3c0d3d283aXJHcWd6N1dsWGY5ajN6bXRwYmhpZHo2ZXFZYzNGRFZoVWpQY3kvREhzbitDMjFvZENJQVNGR3VOdW0zQUFOdzVKckVaMGdqcWxMeWNSNm0wVG5HOFpIdkFXR0M2OE1ZOW1rYVhKdERSTnZmaDhSWWtySy94cFZpQ0ZQeVM0czdFenBlYkJud0xmblpsdC9aUlBrZGt0QngwQUR3SmplV3g2NHo4OUpvTlVhUFZYR3ZYcjlzWXNqcWhLdm1GbmJ6V2ZjUUdOUzA2dVhNSlgzeUtSbWVVQmZwQkNBaDBVa2pZLzZNK3NOcmQ0MnFZR0lHeHlUdlRKeFJaU1RraUtsM0RacEErREVoM2trTXpXcUZSOHZoblNnR2cwUUtuUUpCQmVYLzNjbU5KOGpZWW1Sb21aUS8zaHdwaDhPdGNUU1pRSExzTmFwOWtJb2k4ZFhqOVh2alZlcjdmaVM0d1NoTVNMcmljbFJIWHdlSFhsWE9sczNubi8xbWtSWkFKS1FlQkIxN1hxbzVUa3RIZDVidUJvcUNselNoc0pMdlR0a1I5U2ZSY0UyZktEeEJBM2YrMnozNm9jdGVsQjNJcXZMVFErUk1WdWdJd2pDYTExQmpxWkFPeWNRSWkxeU1qUlU4M3F3WVo4UFF5T0syTVpzSUk2cmdhaThyZWxUZkRDT0VlekZlMVRvNkNvTUl4YmtwMnV2SEhSUlhlS3ozS2Exb0lBRVFqdVpPM29GbXJUTXdLOXpIM01TNVBjWlRKMzFPSEpldFdDSG1GWGZrbFpRcXY4Tk9qVklUaThRREN2bXZKR0lDYUhxRTE0UlRaQk1MYkxlQ0dLYzgwVEp3c2xlaC9iRW8wY3lEVjdDN1pNMFlNbXVFcEJrU1V2T3Z4SWV4NVFiMVNMZGM5WXBIM1FWc3hjUGlqdi9mdlJocnUvL2NNdm5xMlpRdEc4N09TdThoZy8xTzhoZGliV3cxSjdFM1lhR21kWGE3bVVlUmFjaWdjRGxZYVlPUWJDOGVqSCs5ZkdIdGxNWEhPeW9kbEhsblV5OHpZS295SDdYZmluWXJZUjcweFBTNFZBWUppZWhtUU5pUzhCN1NNRzhMcnpFazhTUnUrU0ZVY2ViRzJ0S3lrSXltUUE0RjRCYjh1S0VxY3FacGcwNXRUM0o0S3RtMU1sL1l6blQxOElpY1IxaTNnWEIzMjlKTEpycFZIWFljTk9GM1BKcHp0bEZFUmVwUzZPdmF5ZnlCNHFuVDREdDkzMGxmVXRPVEtZR1VGdnhmMlFqRlF2T0tpY3RPS3dhOHJlMGg5YU9nY0t1SDM2YlJqRUVGQVNYMC9GcDUyWm9MZEpmaS9PNVNGL0NRTkZ4QUwvOUtTTmRVeWpYaGxhNjMrMVlUZGIxNGxOZkVIUnQvS1pQUlV5WGlFM2NxWC9VcWtna2dSOEJnclNvQldESE5rYlZKZjluTEVPVlJQNjBrSDlMYkNIY3ZXNjB5RUVoNUY3L0tJeGRQaFY5K1dhY2RvR0l3ODVTYUhrWnMyc3hLQjhSYkk1L1RPZng3RzMwN29YbDAvVDhicEhiazRwblExeWNjWDlWMEtkSGFwbGZZMmlqZHd4RWNCZWRPaTdmVytPbVRyNmtaQmRRVk54azNBL2NKU1NFMmVqb1p3eGZ0NjNmQXd5UWNRQkd3WjJMY1VRbDJ4K3B6a2p6OGxmSTJ6VFc1SHZWVzdwVDQrYmxjUTVTY2NoZStqOTNoZzlFRThURmxxOGhxSW1FRmcyWlF1MVFOT3lCSW10WFpodFIyWDVkditaUTdvd01jV3pFVVFBekxBVVIveFlkZjg1SE9abDdaUGR6a2VSSXVkcHptVlp5Z0hWZnZvV3UzVHpOQVI5czVQNWtGMHhKMmdtNXJvcDNYOEtQTlNtK3NCNll2dER1QXFHcGtqQTQ0aVdZSXRsNW50b1dYcHpWRkh4THlkNmxPVGVKV2tpMlpybDZOOHUzcUsrY3pGajFRSG12Q0V5cFZsdnlmZmZkNFIrU3l5eklnMnhZUFNKaFlVWVVhTGN0cXAwUDgyWFk0enBSRzZma210b2VBZnZPa3p5US9jWVJIVlZPUmhPem94SUtrd3Ayckg2cE8zaDlzai8xUVJtTld3Q1JRWmZxeXY3NTIwQlVKMGJtd01YZG1CcFJraThMWEVqRm90UFg0RnFicHZkWEVLakp6aDZsMW5sKzIvUGZ5MDhkVEh3OFI4OEs0NG9rVlBLRFl0NU5GUnptVVExOTNiaFU3dUlIQXBVN1BoODIwR05OU1llVXVlR1pkYTltNDY2dFltK1FKOTJQWkhjbFh0WnZiYTlKM2VjVDdqUXFJZ3VDWFh3K3pSbFVhbzNidnZFMUVqV3NuRktYQ0VBdi9GeGx6bzVFNU5kdXlmaDIzWWZSK2NhaTJiSGtBd1ZPNGRBZmtiR3pjYXExa01xYzNXYm1hSU9NV21VUm15Z054OE1nTXVQYk9uckgveXplWHpSZFBYZUhXL3ZTYzF6SFNiWEZ4R2xoeHlhSVB0emVEVSt3WG5NeWc4RitDSzNwUG5FVU8xaVdkemlsUTYzZk96RzhrYmtFNHBlaTc0blM3WEZhVTVoL1VQRHpJeXRzMWlscDZWVDJtQi9zeFVqa3MzS1N6SEpNaUVsY0ZjVFZwdEJoYXpwUDM0c0M5NEFZSzdnQW5aeHVjT0FuZkNsR0RKdTIvdXI3bUZDR3ZTMUkvaHBxc0NDRDRUNVMzcXYxSVdsRllTNWE1cDJCU25KM3k5anpLcTUyODNtekFncUlxZkJMZ3FaTy9rWUVubk0rTnVXUU1xZzQxMDVFb2JSaGo4T0VCRUJHd3B2L0pzNkloc0REUEFld3RJZ0RVK24vS0ZHL3VreC9XWlZWaTQ2RDZ4Rm9pZHZhdGVyYzBXOW9lY1lXOTk3aDg2Wk5DSDBsY3NHRUl6YnBVbkdDdHl1ekZhR2JHS3NhYXJKRVB5M0RGOEF6UldxNllTdWRFbHdZVDBtZml0MGd4Y0h2OFhJWGJuWlN5R1lYZmROejNkTExiNHZBZU9IY1VoQkw5MUx6MWNCUU1ML0JYWENKY1pYb1hyS2h6N3Q2bUR6ODlaVkxubXJqbWNuL0ZPTjZiVURrSmFHVDZJbGRWcmVsUktvNmtRaUVqZ20zY1RpWFk4dEJNS01rSWhNMERxOUNyQllkNjZtZXZ1SjFjRUl5Qk05L2VXK0g3N2xaL243ZEZuUzNMWFFZd0pkUUZBZFRWSEdFNkNRNlFpOWFHWWRaSVJFVHV2OVVYZ29JUEM0VFVCQ0dPVzBUR1JhdUErZ28rOHVWVFpLMzM1Y1FGYXY2N0ZIaEVRUEZsWG5pMlFtUFl1VHJrT2NVcmRCWTEwa1BPekRkNjFidThEbWdZWUhpVVBEaTNQSTZnQ2NIYXUxdk55UW5aR3BWdEQ5VG1JUXZQelpxWkxLaVI5TGcrY1pqclV2Y2xTbmcxdEdrcjJleHliQlBXb1lVdVpDVnJJT2FtaWZReGRLVDlNKyttL0FLMXQ2VE9OYzFEdTBReUdMUysvdzJZUU9rNExrUUIxTHovMWhkbWhvYXd0UXYwLzdVZ1pvbFZvVjVkaXFqUzBVY25iQitmUUpXd2t0NC9DckFldmZiNERHMmU1SEt6VlFrQVU1cE9pd0o2TWV6b1k4cHJlb29zbGZrUS9zY2pjN3ZBUWJuM1JkMjM1NnZEQVl4UnRpWEp6aSswZ01CWW1QSk5SbWlzK0pUYUltdFpBMWpPZk1sVmd3VXRmNllYUUdKZ0ZPVktXSWhnUTN3cWxMeDR4TnBlU0tpSTd0S1dhQm1CYVhjRkxrM3YwbVA0WEdudUhCK3M0NUYxTnAxYWtueG9wTGEvVzgwT2lNbS9OZ3ZkdFJCK1JINS9odHBJTjJnQS9pajI3NVNzSG5DOHZZN2k1dHJueDR1Qm9qMndSdFVQVERTK0xQNzJPZ3VyUDN1aEtmbHVZYnI4N25VUTA5TnFyNjQ0UVV5ZlpieU54cUlYc21OTy9WeUs3ajgvZUpLWjVMTVhzdDN4OFhyT250dkRPbE5ZTUc4YldhWlowYzkzbEFnMG9PMCt6VkZHRmNQcEVLVUZnMjZ5VkhvZ0tWRDdZZnVxTEJPeVozc1doYXlxeVdIank5WlorL2tVbC9HN1Q1S1YvWFJ2Tkw0ZzBvNWJkdGVseE9saHZIemhxL284aFVzbWhMTVcweUlZbnVHaWduYmI4TGYveUd4M29VV2hjbStod2JydXVsazRPc1JKNytQZ041TytGeWJJMXhnRnZRUU12UXVET0xRWUh5Ui9XT21RN205cmQ2MmpKQWJFdkJTelErYnJmZW03Rnhvamh2aWs3SzlvM0tKcmloWjhhTXNkeEpuTWcyTDFhSmszNEpTN3F0ajBaUE5sT01NMUtiTHhQVEJvM2MweUdTRFF5UytMWk55cWpRNTY3d3VMSmxUakhvUTMzTkhqSlVUV0pVdk5STDc5ekNSdUNnNnJTcXpUZGZPRmVOZ0V3ODMvQjJaaFR5aDFUajNjNFVESEtrZkQrTE16ODdLSTd2UmlJSnNRWmFxcmFCY2RZZm1uUkhNdERSSzlIaVFHOEsvUUlPRExObWt4aVYrcXQwbjhYMWpQQU5UWUNQUDhGRmJQbmRsbzlLVXhsQWIrWkhFYVNkbHF3cFdxczA4K0gyZFI5Y3FDMzVkakZWUFhibmhGdUx3Q3NJckpUcndiK1hTSnNzdXNwUk9LUXBhckk0Y1dtU0JRalpwalltb1lYamdWYWV0QUNFd2lTMDVTOGUzSVhQa05DUWlacG5tdzF0a0hKS3RWSkg4NWVUbW1mdkxJL0V5V2RScm9ZeWZ4cE55Rm1BT2t0RTJnWUpBNzBGSVN6QytqMEZZSTBxTFg5RGRjbTBERy8zZVZnUmFBVnp4RkFmMkhYRk5pZEwvSzRieVltR3BHOEZUY3gzWGRrdHhoSU9pakVHOHdLKzZ0TVBjbVJqK0FEZkpxZFpJYkdkQmRIZ0JTMlpMd1lIbGQ3OFJpc1JYTkNpZ0FYemFtanFuRmt1NWgzb3VQN3JadkwxTlJYcmNBejdkVnYzcWd1YUxxSUpEVjNrR3RQMy9lcXFhWE14L1p4blNubGdpeUxTcjlvWHVUblZZK2ppQmhhSGoxSXVLTHg3bVFrOVphdStKNm8wb1pUSFViS1ZBNHFtQzJhWHlPVDlUUG5LZ3kzQXgvbUoxQTRDcGxIWS80c01pdThMcW1vKzdXTUtyYU4yWUdlYmFCNzgwMWNaWjd6aUsrcmtHSzlTU0w0Yzd3bGVmNnJVMGpodkw3aXRkUDMrUUltbVB1NG83OXNZclNQWG5YN0s5TWtGTXp5V3Jpb2ZXVDBNVmhKMHlDemlZbUhrcG90N291NCtFUmdZWFdSaGUyWmxySjhWdWJlNDExZmJGR2hVTE9hR0xMTjdXOGlvanJCblpXU0RGMmhSWnNGcHliMWUrMklUMS96NXlZUjJtYW5OdFp1MEEyUlJiWmthTkxMd3JGR0ZaZk1iSC95WGlSUk5WbytGdGhPT3BRMlJmaExxV3lCMVc5R0pQcU1BMzJXZnJsY1Z2eWdKeFBuSTJxUDR4ZFJWajBXV3IwR2hxZUlweHJ6ZWNnTzhxU3FLSjBNd3c3c2Z3a3NGSGV5MEMzdlpqQldFTUpsbnozeXV1bmZoS1FMVDJZV3paTVZWQk51TmVFa0JjZDUvQllxcHcyZTFZNjNaU2NVK1E4WXpndWw3ZVREVGxyQlBaeHVxemIwRUYxNG1pR2dEbGovUzlGZktVM1NiODRNUTNmNm40TGUzN0tEK0VmZXR6c0oyR0hCMlNId21CRUxQSlM0Nzd2Y1A0U3BCVFMvS1c3RHRHRTlYZk5TWEhlMUJ3c2NIWTM0ZTJ1UzlZRHFUVVVaMEJvdGdmUFhLelMvcmM5bWhDWFNBUmhOZ0ZJV3F3T1FrUUtYc3NqNGFtclFFN3lTK2xsRWdXV3hoZ2lNQk9KU0NDeXhzSXUwSGpJc2pVc2dXbFJBQlRTSitXemw1WWlMek9aVDArdzFqL1lNSmgwd2l5eHYxbmtrU3I2RDVtNEhSYXhrV2ZRS2E0TEl1Z3hEU1NIdWM0aTE4djlSTitJamgwaVNsWW5FRjNzOVloVkdnVnNvVEQ0NFNlNVJwNTFwUGFqM1J5b1dFVnZlVGxkS0RXQklRTEFNRDQyUE9TZmFvbHhjWGpuanl6R3ovQ2ZLc3hVWTUyY1J3bnlUa25PbTlPbStpTXBnU3Yra2JkYTlTTUJoWnVKaFMyU1lKODd3SEpUVDNVZDFnRFo3L1pROERMQ3ljalRzSWtqbWo0eWU4ZlZ0cVdER2VOZjNLYXhibjV2YkhXTm5tVWY2ZzBaczJRcm43RDNwSHp1bklnOHcxS1VYV0Fxd0pIYWpXTW84aVJmVVNoNE9ReUJGY2JWZlpsY3NHbnBpZk51R0FtY1Fvc202NVhNS0x5SS8xaS9JY3ZDZWd1eGRMZVlHR0kvUWtzWTZnRGdackRSMnBuNkFNbTQrdHNDdkV1WEQrMTZXMnh0azBHVUplV0w5ZTZvck5QY2pWRXdyUHRhTFZNWlA1Snl6VzJzeTVoZXdUa2tFRkVjaWNPa09kb0xRZFNCZjBYYU5rZlJscmtwWWIyYWhWbEVBTS9sQVlyQnlGRENTR3N4WitRUnRzWE40SE4yTld0M1A3REd6UG96MGExOHozdmtsNkE2NDV2eW9EcVBPSlBnMEgvZk95UUtmUW83WnBIOThFb2xpL1ZjWmpxTEUvaVhCOExpOGY1OVZkdTJqdkJERFduRy9IR0piWitSNVBUMWJDUzQ1UmF5azYwU2tLcHZhTWVWbmhOWUdvY0JTREFvcldjR1hpdnZpaGtVQXUybGs0QU9OWTIrUG0rRms0SFU4SUYrUDVwOHBtcFFUcG8yeUFjU1lON0U2ck1ZL1I0ZmkwL0MrdUZDaVp6UTVJS2ZlZkl6TFNIc2krN0pEcmk3OU42VWJFQTI0M20veEErTkRpT2N2Qk80UmpWRG1vaTd1bEJrYXNaMFBJOWk5a0VBRjdWdm0wY2FuNFQxcWFCVlk2S0FSK2xHWXFJWmgwTjllU3V3UVduV2ZNZmJacGE5YmY2cEtFcWVqZ0tDRlRHTzVUQ29kdFZLVG5DODJNSzNUemNDZXJ2TjBvRERaTTJYK1QraE02UUhEV2ZxdDQ2RlYzSHMxcE43M2F4QVNqU0hjUGF4a3dvNE9tbktHdUw5L2JEd1NDVy9VUUloTWdWcTRHOVNMUWZxZnc3L2pFK1NSNXJVWWtOMjRCYWsraHJrdFVjdUJESGRJT3d3ZGd2UUlXdVNDZnNtZGloT0p0T0ZYaXJsdXV2QzNMV2NSc291SmlTNjZ2RzQ3dlQxdXc2Y0Jja1QwRmJqZnRXSDF0NkZ5eEtBZjBFRDVFbHBiRHVzdU43OVFQM0NZeTVkQlRDNFFYNys2cVJnRTFnZi9kcnh0MU55L2JtTGFrclEyVUZtYjJTcDQ4TnZodjJtelppdmxHTEtuOURXOFZqWmljMXJKaGxlbGt0SHFnTmpqYTQrYzZLUVp3Nm1YL3EzRDN1UWJaR0NXQ1dLSHF5M3JYZUJMR0wvMk1Ca3E1U2lhVUhYN0FVWWtrcC9wMVJ5Q2ZYV25xVzNEWkI4ejNqQVFMSTJ4L1B3eXNvUU5nYVF1UWtuUGw4cnhrQzVjVVVwSmV3Vm5Dd2V1R1BkOUtETHZCNUozemVRUFhaVytjYURHWkVqNUcxdjR6UVJpK2hZMnhaNzZkT0pleWJCZHU4L0JQdS8wT3lHTWNVK2ovT1FLRnduQjBZM1h4RkcwNDMxNzdKazJDOTFVbEcrZnhHL3ptYmd6WDZDUEhzeGFWL1pmNm9ESHp2OCsvYkE4eENuL3I1SlI4SXMyanNOUkJ4ZzdrRlYyM2JlWEtVNHl2MjFHN0tpQkJWN3A1cmgrY2ZzV1NsaGNEUkJMdXJNYkx4WUNKTTlQOGN2ZzJwQlJpZXhSRllmeWthVzhwV2VsVEFIVkZ4VUZubWtJZ0xMV2ZDRTg1OGVhcmZXNUswaGZxY1EvZmxOSzB4Y21XdXNwMnN5NDducXNvbDhZMHBoU1hwMkhSWHZVSGNlY25veFhiYlY0ZkNaQWFpdUE0a2h2NzB4MGlpRXQvZVJHZUR0K0srZ2FZMHoydU1RaUJPbko5Q0N3bW9TeEtXQmlHQndJU2V3MVpXWmpDdjJCdDFVc1ZudmFRaDU0bzQ0bEpRZFJRZmhVSEdUY0ZTTE5IeENFUitiaE9vUk1jNTE2b2NYRkxzL0NsSUZyeXhkd0tYbWtYTC9Cd2tzTyt0czBaQzE3M0JSVThBcldxSnJ5ZVIvM0VEUTkyVGdrWUpjQi80dUw0ZFlCMGJDZkxRYkcvUWRXaC81cVZWTGZiUGdPSkNIN3hHbzNjSGpNeE5WOWh0M3I5cWd4ZzNDb096WDYycGE4T1lTZDJaMTZ3QWNiYkRoNnBBOXZaMmx6VXBOVitDSW01TVNkbGgwZ2ZNWnpxd1FwMkh3YVd3SWJaOVJjKzFLekZTSnAvS3RGNE12d3lmdGVMU1J4R29nbmJhelhUMWVXc0tmdXNWT2ZOY1lNUTlEaEhIZmhUT1VSVmZFVHE2WDhQZjhFUlExa21JMVRLbDZZWE5ueElLQ3p1aTVZUXFJd2sxV09LcWlZZnBVNlNwQVZTa2s1RFBMMkNSUS9EaW02RDJkamJMNWlTRXlhTDRyVXVDeFVIckJQWEpPNm55VkpjS0dFa2h4MTlxdnk1QmdhZ0hXam9tT3RlbEtPaXcyeFZnM284VWxueEIzOVNrNGw3YVhtbENuTzhHeFJSZ09DRk5iUTlZWDFUOHFpc0ZVUXNQRUttalJ5N0diN0o5RnZzRnBtNHU4MlpDN0o0RE16S3czR1BTS3lTcFluSURMNFVwUEhFWkdVazl6N3Q0M2xFY1NzeCtFalVSeFNjSS92c1paeGJvb3JjR1d2NGRsZ1UvQ2Y4R21rRUtHZDRLUmZEOWFndTZUQ2s3YjljcUdlbVdoVjNtWUVqL0NrWFFtRzY2MXNlcjlUTThRaitjODZIVE4rT3MyeWxORFVrUWRrZEhCeUdNOUYwS0lZZldPSGNmeXRmdUpUSWVqV2VEQnBCcWU1OVZMUFVmRy84TjhYVDhCTEJ1NldZYjZPclp3bWdnSkd0Q2I1Wmh5QW9oMDZRQW11dzd5SVkzVFNRYjlUQyt5WnZFNmFMOVJIdlhlTGhXaVhzZmF6VlhHS3pKQStMV1VndGV3MkV0ZTk5d3dpWUc5UTQ5cWhnNkc1VWhyVkxNTk84aThqYTAzOUxzNlhEWDFPNU5ISEFUOWFVNStXaW9VT0k0aFRJSWMyS2FCS3ZCZXpyUm1yaXdPY1V4RjFxWE9aNVVoWmRuNzUxUWUybHNCWHBjYzd5SWplQ2JkOFhlUnE3cHhOTUx4VFVWYzZoajFuc1hGa0UvV3NWYjVJNmFNZDc5ZC9LWVZWQVdGZXNWRStPVHo5dkQ2QVp6QWY5TnFXS2l3WUorSGlqQUlZYlhmL1c4UXFFeUdhNkVKM1NiL1V3ckVFdDVUeXBMbkdaM3BZdXYvbldyY3RGMldveFh2V2J0NTU1aU5yTTZoakYvK3d2TDZFYW92ZzRHMHErWHB4a3k0dFJ1NnN2aTZvaExYZ3FYWDYvVzV1NHBNdWtPaFM3VDRvd1lVM3VTNytaYTUrdC9GaSs4WFpiVXdDOFdGakpkQW1BVXpGRlFvdGRnWWFsWlg2NXpRcnB6aWpETDlnSXlmcUZzK3U5azNyaVA0Rk5QZE5wZ3NRMEhmQTBieXQzaytoRmRRV0JnK3dUemNmOUUxdTFZRTNkNWtHTmpwVU9oVXQxa1IzQ21sTWZEUHBUejdsVnp6MVFRUzNrY2YzZ1czQndHTzhEdnJrZFU0OEQwYVJyS0RaNVdscG9ZU2tkZk84L2xpK2lYOVlieEQ5VHJENUdKK2hZdWJvUlV6YkdEMkV5NS9tblZnZlVhREs3dG5uVVMwcGhBa3Z5bmc5c1FkdEpkMERub3h0UHJEUVBWdkhGY1VyMTRMajhOYmh6YXlZbXFTejl1aWl3NnVOc2pBTUFNVURCTFNFYWlldllYTmY5TG9hQzY5ZW1uNk52ei9STm12WnFGOXVyZEhKcTI5bDl4Z2JhWGJxdkYyQnZtY1V0VHphako3cmt4UEdLQlpBVTdPcnpLdlloSFZwWVJRN1BaWlQ1OWxRSHVUdzhwSGk3aExodnBFVFMrRWlHZmRheWREcEZIYWxrUzIrdENCOXFGcFFnRXZMM2QzeWZNZGNJYzYzMHNGNjV1YmREMzF3UUZVS21EeG40K2FFVHoyRDcyaTFWWStBUERCdjlvbXhIQVBoMWUzbk1vcXN2STRWM21yT0Z1a3ZzUVprbGdkcjRNOENocnhMdlpIVDJFa25ib0hEY0xzRjNIVTV5MUcwbXdCZE84SkIyZU5DK0YxUloyNHpjQjl6UU43YTg1NnRUa2RiWnI3cEsxNEE2bWtEUkdqdE9UQlZMdlRVa3Z2NDVGcGtMS1pWMWJhSlM3VTUzL0ZOaXU5ZzZRdDNFeGY2ZjZRQitUU2gveExXSERuRjAzN2FwZU5KK3l2cldmTXVlMCtNSjF2dnB5a2I2QXlTSmM2d25jOTVGR2syaFZlM29jTTU1T250bzJwdDl5RzRDU091Ym85bzF6akdZUFE4MnF6bVNwY1NXMitVcTJxeFhYREpaeFJoSyt4dUxtS2ZNU2Vyd3owbkF0Yk9KQTdVZWl1UENTVTBZakdRTzFJWHJwd044RXRkRjdpWFNVdHdEcUgrQTFTdXRmSGdoaVVFTVJqclkyNFlxTWFPZzRXTm1sU2pQN25NYTRVU2lsdmpYQUVXOEJwbTRPMkY4Z1VIU1haaTh0VHJveHgzYW44SFBoYmhhTmdUZHc4RFBBbVZPMWxyOFJDSWd2QjFIelZrbnhQOXU5WnZnRVBhdkkya2tVL2R5YTFzUWZnWm52M3BPVXV3dmJTNTZkVFA4Qi9xOWNsbmZHdjZhL0pWOXQ2TTVPQ3dBRE95YmtzdGNYaGk5TEp6Mmd5UWQ2TWx1NHhOSlpGOXVMRnVFbmtibnNyYnFjU2kza25seHBMck9tR3lidVlmNzVvT3ZRY21aaTlVbHdPUnJxWFVUQmsyNDdvZmhZK1R5OWd0S3hiK3NZWlQvNmVoak10Q3A3aHI5SlMwTmlGNUZHNm9pQkF0ajhxVXkwSnhERFZrSGwyUlFoeE5OMGQyTTV0SmNsM1BpN1JXcEFZUXErQ29XSGY4WlJuSTB4SVRIemxnOEc3VUtGb1Y5SzV6VFBPSmppN0crQ1ZoZ0luNVhpY29Qakk2NForenhLUjlmajVQUnEwd1NBVWVXN0ltcVpDcXRvY21adzljQWV3cTJXVVBGTVVSTnBHWFB2ak5BNXU0Ui9oa0QrcjRzalpHKzIxdkw1em5sOS90V3VvUFdDOEFjcjFOZXR2ZC9rL3FSV2kzWHp0dElud290VC9Wand1cVV6MkVRSXFzWFFGbXp3bVRnOTgzTS9VbXlEYXRxMXgyVFhwZ1FYN2tqOUxxZEtDemUvVEpIczl3YW9SS01wMERnbmtJN2F0Skw2cm5MckFRcjVsazlYYnV2UnMrTXI0aUQvZ01GVG9yREVHQlR5Tm85TDlhTW5hdTMrNGtLQVM4aEpOUm1WeVhGWS9qL3dXOWp5a1RmdmNKblFqVXhOU0tLUjFFNWR3citFdjBQaVY0SkYxd2xUVFpWdGlTQS9SWnlBKzFFQlVjQkM2dU5jMzhiWXFMemJEeUE3V3k1Sk91Q3BWREpEcjZYblowa2Fmd01oMytpNmpmcVJ2bWJJcm9SMUVaTmtEYm4wdUNvM1dXMy9EMnVjZ2UvWjUvNGJNSE01TDBCMUNFdnBZRXl6bmhQQnhjdjk2M2lUcVZ0M1VKR1FOc3hJYTFESkpyNUtuN0ltRGZlZ3FSTVJ5bk9yNjFGYjhNYUdBeVg0bWhWOFhEM2JkbmF6cDFJY3BqQUpwS3VCR0FHNkdvUXcyWGs4MFVzS2dRM0hxS00yWmZnakxmaDhjQm01Smtzd2thSzVEWlU1cmtVQkJiR3RhM1BqZ1V6cHlkK016eTB0a0Nwd0VvNkxRN09URFlJWkhmeDRyQmFFWS9BMjBMRzNrenYyZndwV0ZML2VrL1A2ejU5Y29UemRLbTdpS2dFOEhkaUc5VXZ3RDFucnNNZ2pXUkhoNzRDWGNpeExXbk1EckJMRlV5MHZrY21WanIzVFBkUm9HekYvZE4wcDR3dnNZWktCWC9hQkhxSTlyOUVwVldYS1NKWEpJclR0V05sRFdCZTlPbXFnbmtwY1YrSGZuWmVGUlpSMEtzOXZsQ3JSNVNOOHkwNDllQzlyTklvT1hSS0JQSUcyQlliMk90ZldvNFJ2OFp1NXU4YXVvbmVZb1BucEpQYlJjLzh6c3NYUnZteTRDSUNVSTREeGtoVkdWelRIZ3FNaWxud0lWbzlDZm5aZGgrbHFPd3JhNTM2bUdScEJuS055Uko1RTFjQUhxdzA4Qkx6Q24xUmNJSUt0S3VzV3VRR1pudS9GK2JtWW9BZlhCZldQaU5wWk1rNDlwblozeTNieDJYYXIrSXpoT1d3b0pCb2xyTWZyNVVlZU1GSDc3ZmxnTzQzL1VTdHZRVEQyQWxBOUUrVDJsRU1pQ3p1MzRmTFd4ZmI0TWZ5eVh5ZlVIUUhCZ3ZZLzV2aklCb2RWYmFweDlCM2ZXN3JRek42ei9ONUxwQWZ4NTB1UTN6aWd4ZG4rS0YvaFh5NkRQbXBJZGRvSW1TUTlBRnFKcU1jVHA3Mi94amlpNVdKY0VUZnNUNFlDeXpoUDU4U01OcUFHSFpHaE1EYnIrc0VpT2pYTTJqKzc3ZCtYNUlJMG5xUUFwUkdQWG5sQjFvWG13RGVhYk9TZytZbnBwM3djenBGQjZqaUFiNEZucDk4d0cydlJiNDIrTmVPbEN6aXJFTHlrT1FTUEVramh1a0ZHVW05aEY5K2lPUUpUTE1IUmVWakpodW5EUGdtZTRBUStQN3l3Qy9TVXZHRHlOd2pwWXRoL3Z6Vyt1K1UvVUFNZkliMGF3M0FYOXA1NzJ1aHRIVUR0T215OUlYbGlYcDdTK1J5cC8xNHpkcHdEM21vWUU3c0xFZWFaVGJhRTBsMFRYYmJkQ0JYNnVDRnJGU2E3eVpSSTd6dEdNbHZGby95MU9xaHMydGQ5eXdvdmU1a1pPV0VHdG1JRUIzRDBjcHBJL0wwMHgzS043MUJGcHIwQ2QyVXI0bmdLendoKzE3Sm80b09DYk14d3pacjhVR3FyL2U3V1V1UW9rajJIVXVRUHhEZlRZaks0WkVpRVhsa1MwVjlTbHhhejEzRWpVOC9yZld6dGZ6YmlhTUhxRmRITGF4VDFYYVM2NFZqNTUxMEdRbVg2UHhzcTN5WlVGaU5pSzNLczBROThjakJuaFc2dzhCNXkza0NaN2p4MEJZUVFOUE1jejQ5NVYwMi9oMmxvTS9FdW9JQ0NZd1V6VWpQd1VVRE1EcFJvb0Y3K3I2VlVieVcvNk5JYkgyWEJlTXNRNHI5aEM0R1V3UkdOSUdORTVPbGJzWS9rTko4Z3U3MG1BRWswT3MwQ3lmSm1Kb2p6S3lndVUzL1VTOFJNMDlvQWxFRE5aSm9aNXc5ajRaVDloVXNKV2p1QU5NOXhQZWxSWFB5TkZtRXZZVnoyak9PaVFPVXlMdjdLMkF3UUhRdVRPSkVQNUE0MS9sREJEQ0ZscklzTnBGL3F6N25rNVEvd1g1YW5nOFlhbzZwdkdOY1NpODFvNzYyUVpMbk0rSk9RbVZNbmxPMzZYUkZZZmhseU5sZVk2NXQraGNRa1h2cktiSkw5M011bzJFb09JeDczQWpJVHdmdFV2WlY3VUFleVQxeW9rdGZ4L1lpWnM2OWJ5L1RHeWNYWTBuZFFjeUxrNzZ5K0dXLytBZS9maTZ5OXpqVGFtMXdpZ29maWdyOUlzRlZjK1ZmZHMyUkJxcCt3VXZjeWdmanVldUJJeWZEbHFhUUt0dTBMbzZ6cmNXeGhlK1JieEwzSjZrV0E5TmQzTktBcUViQ2gyOU4xTm5GcUZKU2Z1eXd0dVRUN3cwUDZRT2RQNHNVSWlIRjdLR0dQT2JvOG9xSG9zNlFBV3N4YWNrVzJYQUJ3bXhJUytseDlVSnNoc1RNL3lTT2lhZURoUllQUi9oNWx2RU5vZ0pFTUxTWk1yOXVpckg1b2VKNTcvdWdsbWhQZUZ4Z01paTJOMi9tWTcyaGltWjRyV2xoTVlYTEYwWlhWVWZFaUVubW1XZXhKcFQ1eTd0NXY4dHowVnd3UmVMNzlScUduOU8zUDlEb3dyZU5XRFpYZXZJSzQzbTh0aXJ5dElaSlkxRzZtZCsvQnRPcGJrNmlQbElFUTM2cTNqaHZyekMrcGNCWDNqdDBTZVFvNjNjazkwWVJzakZrNmMwN1lLOFRHY1gwVVNna0xXQzNzTW8xUGN1NFBJTjhmWFVZRENQOVYveVZJOU1EZ0JYQ0h3MkdLUFdVMFA4djJBUWltQUxUYnJ2V0tjbStnRHRObGlPSjMxZEVwMTZNSjNNOXE5Tksyd1JCUmdkZjlBTEs5RHR1R1RQSTdIcHZqYTVFQVUzT280ZytSNlJmSzV4N1Y5WlY2Z1daSWFFWldyZFJKM2NkaTROR092Q011ak9hVkVtUCtvVjlqSFM2c3ZtZEl6OFplcEhidENldlZ4N3RDbWNUcmtyeitDb3UzUTZjWXdHSEJuZUpESjd5RXk5K0g5cWduSlo2ckNzbERjNmhKYkp2N2QwQ1BzVWMxdzYyUjg0OG1BR3dDU1paMUdEbEpJcnNST2FUZkZCVHpVVUJmYTNZdGh0UTdkNWhCKzMwU2NySzdYVlVOSTJaRUpBRk0xZFFHNWF0bCtvZ0t5N3ZRMWJlRjN1cmI1MTRqd1BlMmFhaTBteEVQNHQwL0N1WVpvaEQxTzcwZVZWRFBNNjhDT1pzaUhyT08zajR6M1krSm45UFVaWlNFRmkwV2ZSQmpCaVZaT3lybXpGVzU1WWpXNlJ3RktLMVZEVG91M1REUXc4MEhFSzRTZWJEaFh2UWNBMlorMjZHRWQzWU8wQldpMXR1RFhSQ2hjL1oxWnN3RGRrckVlNkNicDVqS24vWkdNQTdGUGRTUmJCSDcyd0xhQXJYQm9OYjBWZG9HblBWaTB4NUNXTXJnYVl1OVpvdmtUdFU5cDZMR2N0YjJIQzlrWndoeHJYRnpLN0VTK1BXYXdQNUxuOXMrQVQvYWNrdG9lOEVqaFRBMExiakJKVlBnSnIyZWZIUERzZFNidGtVQVFNVkxQZFlidHpsQXVPcEJzZks1YjBjNUtYWlgyZy9kaFkvaHUwRUNvUjZlSnVveXJ4c1NKKzlZNUYybEpDVUpaUGlubnU5K2lyUTV4c1BpUGFzeDRIaEhlMWdlZ3VjUm1QMHVXb1F0VkhOZHdqaXV1VVJFOS9WS3ZKazE3QXVlRFY0TGNrZm56VUNDMWdtU1dJZ25WWWh6L0FkMllPNFFCYVN3S3JNb2xlODI3ODV2NUpsaHJLQU10azJ6OCttWEtzZG9BMG0zVVBwMmEvVTA1eTRjbThRUFpQenFTK2lZM0N2UEdqWVRHc1U2NlZncnNMa3JqckEwVDNCMGdFNFRTUnR1aE9wOVB2b0lUWGp2L1lMK0pOZ0c1N1hEYThXNThsb3NiTTA0M0NvZ0RBcE5tNjRML3cxRWRDMi9GMHFPZVhtblpuQlBrQ1NWY3BhUVpPZExFMkU1cXp6R2xZYWZWZmJDMlhLUGg2cURUOHJ3R2JQY1NUWlpKaERWWTdZUTFZOWdtOXJ3N0ZPNDJVbHhrYVU0bGpQR3ZaamNrUmh3dVRLbndoYWZDbXNBYyt3Rm1YVldqVWpIYmd1Qi9vdVBKaVhwWEFJOTJHelNtb21VbFFpU1JhOGpoWGV4Tzk4MUM5bVVib0ZhSFJNK2gyallnZ20rMmZEVHRkczA1d1NoM3lmRHUrc0tXSFRhSk1QaXBLYi9UeHhyR1ZjMTY0WmpUUW1MSVFrMVFZa1VnSTBuVnVGZXp0aCtrQTZOdlZyRjFGZmJjVmFxZGVIWTdNZ2F2clpWYmU5clhaS1g5K0g2SHJidmVjWW03VGhDWk9RWUxpU0JZb3ZQMXNuZmhKbTBzSWYvZC9kRFdVYjV0ZWVXdnFvTHRPaDF1ZDF2WDhwQ2cwM3YxWEcxRTdlWUpJdStITXRyQjZGcDBGZEpvazV3SUN4TzVIa3dRNEFML2t2RTVBOGlkcUdRRThTVWtLRVBnNDAzNjdXNE0xWjQ4RnoxZkc0aHA4RE5Yd2lzc1k1d2ZSaWdMNmdLZ0hPYmhEQjBDTTNKeEliaXZQUVQxTTU2Yk5ZeURTYUJNRk1kUUVXa3ozUVloaUtCdWVuakYvYmpramM3ZzF4L0pNSmlsUE1xVjEyczZldEltajlNeXo0cXlWRnJsUUMvYzNKYW1WdzVKcHBRZkk2SVlmanRmVWlON1B3N1lIVFppUkgvVSttenJBSHFzdWRqOUd0L1RCaExzM2dPWm53UXI5UDZEaUlrM1p6WDFMR3RHQWpGSUh1eVUxdEJyTGdDYWZBcHEraXNTQ1FqWDhyaC8zNGRvdFR1ZjZsTTVMQ2NwT0pwTFhMb1JBSS8rZG9BMXF6bDh5d1B4NGVXOWwvejV6TVM2b2tyeU92d3A4ZEIxM01WNlRIMmxLWFpQM0ZxU1VXTVdnN2dPR1cxejlyN3ZyOTdIOHA4bjl6SGtRdnE5YnVTZHp0ZEJTcEpMcFlobThLdytMRkgyK3FhQmJOSXZnMjh1MVlKcU9peFRyd1o4cm1IOGdPcm1xM1plSXZnUXVPeVpWNnAyc1pXWlM0MVh3d2ZGMHdwQmZrOEhaL3dEWmUrVnFObmZuMGNXNy9pSERGQTRVL3M2bE5mcm5CbGR6TzhsdXp1TWsyZ0lWQVRGTkQzZ3lrWG1oZmZwS0hiRWFNQnNxbGhhR2M5b1l0c0U2UlpmeWMxQmpCMFFYazNwTEpXZ3FpNjcvOVUvMlpVT0NkNUxzeXRTVm9ZZWNZbVhRaHRSQ2dib2txZEU4dE5BdmtFU3FWM2tHV0lSNFlBdVNPZUQ4UUQ5RlNZa2J2clppTDZubGVyR1UwZDlZZWdMNFdLemZLQTg5clEwQWR5c2FzUTh2ZU1SMEZRMDRrUGNodVNjdlJ1Z0hOSStxTFVxMU5tdHN1WnpoVlFHUDB5V0lWTWsxZ1hzYktjZjl5c0RzVEltdGZWaCtmdXFUNTh2eE5BSHJRdkVrNFpMc3M3Y1lWWjJmOCt3NENEZTNHYkhkNnMwTXJxSHh4Z2wzNklCMUtBa1BjRm5tV2hHTXNrU1BRa0RBaVJ4WW1maGVoanltMWthWW9TcmRsL1ZXV1RtYlNCYkNEamZIbEFpVE5BU09YdEFUdmpYNkJ1VkZYMzJKZE45Y0tQQWJ0MkdMOHNIZlhhNHYydCtkbHZFcWhic1NXT21tTzZBb2R5K25INytVbnBJWHBrSU9XeDY2VnA1ZUJYdHB2dEZwNk1NcTdMdWRiM1BmT3IrQUppTTA3SGw4SEtLbW9OcThvK21rK2JQblFHNGQxRElNTW1OaEQ4SzBhc2RieWgrWFdXYXIyeXpsWE5XL3IyQXRQQ3RkMzY2bXoxbVFYNU1KVGR3eEs5QU05Nm5BbEIwM2gvQ1RleWtQTXl6cndtdmhmTDFnVlJZZzE3dzVwOStDc1ZFOWRGZk0veVA1bDNvWGNrWGhkcjBjYXhza05WSGpxWkNTaXI4ZHZUb095MmlTNWgyN1lLRWtXU2lLRCtGYVh5WkNxZDBoY1JTbEwxWmZ4Z05SVjI2Q0FCbnJzZUt6UURvQXE5bGpaUHI0ZmQ1NFlwTjAzdHJZMFprUkRDcXZOdk4zY2tOYVg5UWc5Y01HTEQrTmppdzl2UjNWT1hhTy9mKytEbmlEeWhSaG13OS9JM2RTdmluZGthYzA1dlFCSjJFUm5GWUhoRDd1Q1NRVzQ3dEd0VU8rcUNneVhzQzcwUTlhTUJQZ3NScmFWR0tzeDZIRGtYUm1wM2REVlk5bzh3M21pTVdObHgyU0wzb1ppS0g4WmI0Zkl1ZzZjblVnQmI0THErWCtSNE5mMFpMR0o1cmpJcXVYY2VUQ0dkVk5PMmh0ckZkSUtnM2JIRXpRZHdWd2Z2SGJ5MkljY0doMnpRSW95endVTHdWc21kMy9pbFRDNkdPVlFlYkpEK01pZnJKRDVHbDEvMktrVGFVODlFMXhwRkJqZkdPUUQ5OW52eWl2OVhUOVBYODJZS0pxUFdpQ2hwL1EyRUtMd3pUdkNsdFpKSTR1L3F6aGx5cWZRUnNyUWJNVnluaWw5Tk1Id3lQSmdYMDkvYUtRbnRmMGVVM0FROTRmUEk5MG9uUHAyYWdyK2FKbG42VnV3MWFBSWN3VXAvZEVSdTBSalFlaDdPSUcwYmYzcC9XcEVUbDFFa2RDSDN4c2VjY3MrT1V6RjB0SCtsTjI4SjFrNU9Uc2tJd3QxT0xGUDVGdVJzZEdTWmZSQnRob1QybFc5UEV2RXA2WHdnUlcva0FZeEVoSVIvL0NvNDh2RXdrNHZjQ3NmZTZha1dJQ2UyQ1h2ZE5WWDhoU0IxVFZCK0ZvR2FRWllZZ0ZVZi9DenZ4a2tFbVpFbXQ2aUxhVHJsdDdaZmxzcjRvdnpwVFFwdldTK0dGRHNuanlCc0tna3IyOE9PanNUT1JpWkdReXdPTkJ4a3M4ZjVxcmNDOWl3M20raVgrR3lTUWpyc2lpdDQyeGlVNjh0MGdQR3BEWGRna1NDVVpMV0U1djZjcmk5QysrTXNzTGt0eHc0UWFtbnQ3NlppZUplUVdtYWt0N0dLTFJFUW11R1l4bmNOR01rTG8wVTVNWGFlMklpZ2ozRkxhUTBpZXZhT3ExTEZsZUpIUElGc1hYOG1ITDlFNjVCNmI1bWljN3dMdjdCZVRRY3M0QWNRdzh6bllkWmw2cTZRbk9VSmxlblRXRWhOOTFob2czY1JIREc5NzQvQVNDMTVHYUhJa0dyZjhKRGxDZGt2bElWTnRRUTFnajgwTjVQUkN2SUdLMkZsZlZKejV1V1JLTUg3S3N1WldkQ3BUWXVMSnhXMDcxd2R2ZmYwUk85eEovc0QzZmgrVW1wYzBGY1JPOURzSUdSUlRjeVkxSnp1RVNEcWlteDhjMzgzTEJvTkxDbUd0U3RtTjlRQm1NMGJHUDZ4dVp5am1oRktFYVA4YjJybmVmbmJyZDA0bGJ5enQ5amwzenhWRUU5Tk9LYk5kMVlaNG91S1dGT3U3OVg2ejR6bGgyY2RvWWFMYTVIRzg5ZGZabzNqTC9RWlpGVU9PeXcxUi9IdTZtUkdicGxFZDlBdXFETUZMKyttVlBYSU9mV1A3akhDdTN5cm5CbEFnMmt6ZXgyZVZIS1hyNE52OUFOZVc2M05hR0pUcDNoeisvd2FETmZJVFR0SUhzQ212SllXL0JVSHZTOS9lcVlrcWJSaGJ3MFZoeGo2ZVJQcmg3MGsxMTBDb25ISnRVdEFFLzF4MURTV0RWa1k4cWoyMjF5anZ3TEFEZDl6bUtFQm5nUy9EdWlMbnBSYS9yMzFQbm9kcFRRMVNkem9EUGdlTVdwNzBEOGpGNkZkRzJJZkNVcWZmUUJtMXMweC9WOXNPa2EwcFV1eWxjd0RZYW1MaFcwM0VSWXkveW9YL1FBNW9hR1A1djh3MXFMUXM4SXh2YWJ4UUt6bXpVcnRDNStUc3lwZXBwOGxYUVNZblpmeHU3NGJnRXpsZGZ3UFp5ZTlpWU1HZm1oTVhuTGIrNDUrVm4rVEhGUXp6YzZpM0dOZUsvR05OKytJTVBEeUF4Vkt6Zm5Iamw1TnBBaUdMVTgzdzdVWGw4VTl5NDg4eTZEN1RuMExQMEw1QTF2dmZEODNkNW9SaHZRaUxIVWZlVm0xZHFhb3g5TU5kME9OeTZ3dE1LWmZmS2FOZWZQMUNqZ2h4ekhRdmo2N2JtU0tjWTNZQ3dVOUlEUW5CUWlXYWlRenRvS2tYQVlodWF3VjYxd3ZrUWxSS3JKcnlsRWhvY0owdGMvMDMzRUFKZVRzaGMzdUJFQi9WYnFDTDUvTXZndUNIb0JmMlNDRDRZTlhHQ1YyWlQxVHpCNkNyZjlETTZEajAxQnY5ZkRBZWk0T25CS2hkUHNFTHRzVi9HZWZHNXliYUhmaU1JQk9iS2RoN1ZvQ092bERHbXhGUCtOaDhSOGFHdE1jT0dIVGVpTEE4M3pSNEp2MDlsT2FybEphMUhPQXJ1VmF1TzJpS25odnJIT2E1cWszYWNWRnlSNnVqa2MwNmZRVE42K2lUM09Wb1U4alIzWERjRFVzOVNwSEZ0cUprRHU5SmUzMXkxa1cyMXVUSUlXNUN1SG9vY2RnU1RJSWx0VUpSa3F3L21Ld0xMbXFORUZvaFBvOEFtL08xZ3c2b1dtMHJ4R2NOcmJ0RUtSTDNtMURIc3NuQytvMGx4LzVhNlVTSk1idDA5R2E4eXBIV2tqbXZDUjNqYWsxVERXbXlYSmE4YzhQL1czaFo0SlZQbFhTTUxtQkNhbmIycnp6WHJVUkovTDh3NnhJa1FWQ3FocVNqRUhKT1VQNm15am9MSzdPMzBldzZqcTlFbGM0VXRXdUc1cW9aNThUbUNrSHdCODFSNjhJZjU3U0VuQnYycTkwa2hQNjMwZEs1REg5NXdQdkJPb09jZEdBVzRxb0o5eUVLWHIrR1FCa2pxKzZZMW1wVlJxRUZZRkZOaHhhZFgwK3VvVWtUYWdRd080R1NHVm0zYWJ6MHU4YWJmRVhQaUVlNUc5VTR3V3dweit3L01LdXBrR0duMFlFWlk2SUtuWldjaFZuaGY3NFRNa0l1a0dHalhPVkRyNG5ubmNSUExGWWltY054N0JlM2NlWnRuUDNwOStkazFuaDZpc3k2L3FDWjRzUG8veXRwMHI4dU1jL0NYNXJFNFNjVEhpaTBVTGhvRFRaMzJabGExL3VOcWZWdHczQTNVSW9yc1d3czZPTHVBTmpBMVVqM1RyOTFYOGRSNlliR2xuWXUyNHV1N1FIaHlnNW91RC9mUTg3ZnhXTUVwdG8wV3MrVFFaZXRXZzJubHFYOWJUaEt4bEM5UUk4VjVGMUM1MC8wZGthWUkzWEVZM0VXLzRZc2Q4ZnNEbHNUT01VMXI5Q1hNelJ3MXU5WWVGdHFTeVY2QWs0UjNNcnB6SXBvNjN1Vm1pTmplTGREYVM1bGtKZ1dBZFJtNUdFQlVMT2p1TWRUYUFJS1JrMFUxb1JjWTRlZjZmbWFnNjZkVXJLM0dwRnFmUS82SkFjaE5ESm9LTjhpcGUzaUxEMkIyRlNicUJhT3gwSmJweGlDUWdUU0F1VU5TUmswZ05DU2toWlVacmNLbHNQcGpsbmljM1VkMFJVMzg2YUFYN2hwTmZZckZvbmF5aU5ld0lydmdNbWI2a09nWTQ3RVAyVUljZUs3cFdLTDBxQU91NFJycmltd1ZML2ZaYXdRZzVYaU1hZWtXaU02d01ML0Y4UWdsM01hNFJNVGVMcjVaZWV2UTZwaEQvbVNXM3o0ZFFsQnliazZocE1KRUE2YlRGaUV2akpsQStSaGlTTjA1TWN1OUZ5V05FejU3MCtERXBML2tvcVVORU0rTjBVcGlVZWJINTBuRzcxb2lJTGM0YmFIenVZZHBWWVpyUW5TMkNnajRlbXhBQ1I3VnVTMWJZTGgraWY4clY2eEFPcFpRK3R2K1RRVTNPbSsyd01pMnp5Y3I0SlZhS1N0bXpBWi9hdlhsbXdqM080cUdZS3RTeEpWSFAvQWF1cElOWDlBRzFPZWNUWkI5eVpaR2VUcjh3ZDZzcTN5OWgrQ2JKdGxnVnZteDh4L1pMNjNSNDFEUUM3RUE0blB0YjByZUdpLzRCUktCaVgxalU2QXVFVmxaMFB6YTI4L3pXWnlub01KNUhKL1pla0pRSlRyeUlYVVgzRWhibDR2aTJZMy9NaWtMcjZRVHBWV1NIZVBsWTVLMGxYR1BhZTFpWlI1OW8vWmVzWW56NjhqM2dVUjBydUxScjQwTVFKbzZkQzRuS3I1c0xIWmlXZXNLbWNDTThTTUZoWWY3YnhsNkxMcWcvS1hPcFRwV2pkUHlXZkNiODhNWW5IMEZSbXZ6ZXlFUE1Xa2dDR1hMdU9uMks2MHNZeWVlN24zczZOK2Q5YjhlaTQ0bFFIbHdOVHhMZ044WUg5RXErM0dqcUt5NDE0Zzd4WlN1dkdLdmh4c2NiZm5sWmVuaEUvOTNQN291ZUxXM2ZOQWY4dE9vcHlMTGt0SWxqYm5JRVl4cUtsOUJLWDc5UVAwOVZrbW1FM1Q0dzlzTE9uVnZFVklPSVBXNFFNQWZDSlh4bVlIVm93ODcrR0VKWGZEMk95VlpyOW40MGdlaURuZkdUcnhES2pZbDc2ZjhJUkJ3azYrMVphbmh1MzVzNEdweUR1Nk5hTUp4WHBrd3BUQVFqcWhreFJxNys5UlJFZk82V2JiUVQ0YWIzaWoxNkgwZWR1MCtvZHNOL2F5TUxiV2k0WHhhYnZvY0tIclB5RlhrNkw5QVBiT3Q2SXlhZTBWN0JSQ3Zzbll3Q3MrOVk1Y09TUjJDVVo2amNDZVZCcElta1JkT3RHQXVWcEdWQTRsQkY5bHhOWTJuVlU4NmVqWVhQMm9XS2ZTKzZFeURZMS9ya3RUZk9HcStsUXZNWm9HM2g4Wk84TWV3eTNpUGNZODZFMTZycUJMMWQ0Y1FEdlpOSWJsaEllaXlnSFQrSzY5YmhrMDdndlhxQnczMlJYQlVLbGN4cUFEQUl6Rm0ydW5iNE44YjBlZ1VoQXdHYkM3emgzRVpZVitEM3YxL3ZBRWxRWFV5QXF2QVVMSVhGQVJkK3RHdFRaU2o2N3FFczNDWVJWYTk1Wk9PZXp1SVNQOUN5NG5mUHVWU2IyNG5uRzZQeW1DV3F6TlJKMHFDUkE1aUtxTGNMcE92NHdWY2QzNXppMUdJbmJJUVVNQ2h3bHdxUXc5TS8yYXhYcEpOR2dNMngrZjIvdlFwbGlrdDF4U0lVeThxRDNjTGdrSjJGMzJ0S2xoYW9jbFNPVVpYNmNFY1hCb0dvRjU2cEprSmdFTDM2QjJrdWNzTVNXTmgvZHFoOHpLZ0lSZ2dLN1Z5ZUJ2NHNJZzNJczVvTG90UUJhT2dPeG9JaW9BYnJPN25qZzN6T2UxT3A1RnpIRjJOYWltVUc5c3NWeUpWTXBEMUpzTTVpSlEvRngvdGRONFlpMzNRWTVPTUo3WitVM2FvdDBOM2xUbGxJYmhXUlplT0o1Ym1leWlvN1FtbHlYZ0N0SmJ6STVwY2R6QSttZlgrTHFXZ1pJUjFYNFJyZUFFQ2tRd1V5MzhMZ29oVE1HUVJSSG5XRDI1dGFRcVRkK0htNURxK3FuN0RmU0UyZVpoMmxDRnk2Sk1iWFBybDFaUStDZloyYmxkbWF5NlRvNDVZK3ljOVFMamFmT1F3K2F3YSt1bkNETUd1Tk5JYUVFWTdjK0daWHVtNWQrTGFBWlJmQ1VaRWsxaUNnZ1FBQ21pWmwxcFE1RVJ0WmtKYlQ0UkpRbmd2V0kybDFudldiTUpNT1A2MFlpNHpad2FLcGE4UFZ0SmVpRjNWUXY4MSsrWTBSbjg2T25QK0VRVC9WM0xPZWxqUFAxR0hQS3VBamU2cS9DdGNieWhOTThEdy9zSmdXc2czNndhT3RVOWN4cnBTQ1N2QTg4aTd5TURpTXVzUTN2K3BLbllBZGdubFlrRUFYYjJUOTR2blE2TXNrKzd0T1ErdXhxS0c5WDN6MXc1bURTNWdNS2xGVnhTM0tBdGR4NEpoeERPT0JwZWV6QlI5ZG5QZG8vUDhGeTJ3STZNaDVKZ3JHdlN6NzY1WnVpTjM5dkNoc3B6ZDRMR0NzQkZvOEloM1IwUytQcUdrNXljWk5lRjVyeHl3OGZtMVNyUjZBSTZCeW02VmN1UjByRExLTHRBSGc4VWRndUxmOEJQWTZ3dFoxVVliblRFYk5qY3JOTmVqUDNMb29EN0wyL0lpMjFqM05hUG9PVm00LzZueVFMVUZ6MW5IL2VQVW9Sb0NVV09HUndvVVVrUFlUS0RuaEpDVkFFRFFYazZaSlluNFVObllLYllYbDVXV1REakRhOG1GWEY4T1A4OGRTa3ZrZkVMZk5qTGoybjg4djdGWndzc1M1bXl3WS9NMVZELzJoaU10ODZMYnRVRG5HYU1mQmtSdlArMFdNUjFwcUx6dzh3U2xoVFJjeC96WUJBdkRtRG8wTjRNVjhoU3RXTDBsVGRLQ001MlNtNUN0Sk5CQWliRWFXWGYvbE9zbXl5SVVSUUVZcHJDU0x5OFRreVRRYUlJaUtRVCtJc3l6MzN1cHJDcUJsaFBVaVhXVVFKT3ViSVhWdG9ZNHJPOUpOUmVHU2hVVzdlV2lML1JBcGU1b2VuQXF1RHJON21xV016dUo0TXRNb20wTnNlYVJLYTkwdUxYRlpTemtnUmpqYzAxTk1kTWtUL1JQNjc5cXBWL2JMSk5HcTJHU0t6RkRacndxbUg5SVhZMVNuMlVKY1pFTEd0QlRkMUhTaU4xSnNVQzBDMUxmYjdEQ0F3ODFyRlpIc1ozb1J6UGdSb2Rxa2x5WHBTbHpFTWExOTVKUnFuc0hxVVJSdlBKeWxQWUtmSzNQSSthWlRidXJHV2kxV1dHMWhtRmVTcTBuR3hxb1lLNXJwdWdOSjJrSkRSV1NEWERHNC9oL2pJeFdEcG4zZGxTTHQ5QVJxUE91bG1TU29XUVBjMk9yYkxZV1h5dER5V2J5dy9OclRKQ294WW4rcFVhWnUreGtxM3pGdW5rcHU2Q2ZsNHEvcWtNa1NVaG4wUXc5T2l4bi91Z2NxWlJYaEVvT05DTU1ZaTVGSVpUQnZ1NWwxNWcxdHJqcjZuOUVGQ2VWREh3SjNLYzVyRnNxVFRLN09yUEJmR3NDUFYxREhnMk5XRUpPaXMrVXRndG9iU21rbEplYXFiYmJwWnZ4SFBCNDZjR0JFRCtpZUZRZ2pNSTVacWFuUUliOTkwWjhzQmVBTkFESllWd0FsRjF0MHV1T2c1aWo5QVhML3JVYVpxaTgvek8xcEVFWmNkbCt5MGJrR2ZieThTTVZmcklsRmd1VjNCUU54akVmaEtDSTZKemtHdHJyWXRsVDNybmZ4cWJMUmNESXZPS3k0bUFHZW1JbU9vZm9xNDd4QXRuK0lYQnZ6T2owYnErekV3Z1lRZmxYSk9KQ3BTaG5UbkdVNjcxR0w2RzJRR2t0KzhrekpvSmhyNDJDS2Irb2daWDJ2SGRFelgyNkprRXhPenVxRXlnWHU3aWFxS3lidXgvS1d4YVp5bWErbUtWckVLdGlvZ1VrWUZ4K1MyWjFTY0VtWWNXaFNzL1RTdzU1QXI2Z3dUMmFNUmhJOU5yenRHblBzNWFIWDhvb2hvV0JZN1FpVStqUzViUjlsME9YUDhiU2hQQkp0YUt0bmxKNThZTlc0TzQwVGtEOFRrZkd0STdtZEt4QU9CL3BQemU4cFl3SlA4Sy9SbXk2dFZXRjIwd1pjWTcyRysrcUtJRkh6SEJZbDVxNFdoYk14ZEM5eHZpZjAxY0wrNlZBM1h6cWlzcnZTOWhSb2lhMVorbDlSYU1IcXdjSHVUNzllMkg1Zk43RDEvVENNcEFyS2xsMWZuejhtWVZoNXdSZ25SNVpQcnViRi9RaTZ1K0IvcThud1c5MzNjRlFEU2tJQWpqRDFUcEpqT3JMcGZya2FBWkZNeGNoNFRpMnp6dnEzeTFUT0dHS1d5ZjlUOGpXRzF6SVNZNFRkZFFJb0FZeHhyZ203Z1Jaek92TTBFUHAvaHljb2oyS0pYeXI2VjJJNWRDbHF2Rjl5UXU1WDdIellZK0tDKzhpdkVjV0diUTQ5U08rNU0wTTdtQlFHQ0FyeDZlVTh2dkVWZGptY1dwbXdYc2dzU1lTcWVQeUwyK2lQam5LY08wN3FiTG5WdGt2YWVFdVM2ZHZTUjgxZ0NjN2lSUWVieWVWT1Fybko3VktXd0FyUmFMYWp4bTgwUmJiUkEyVXR6NVBNL3Y1QXk5RXJWdjBTT01ReVFueWg1VU1JcDNxdW03S3RrQXdyTkpVMGZQVk4yK0w1U3VwSmVFTFpvdTVOR1NpcWlZaXVOb1EwTWVqeWRsSXE3ZlZrNjlRd296bEU3czlhTlRJVlZPU3pBL01LU0w0bXJXWUtVRmhoNkhUR2VxVUExNi9QU3ZWQVhCaVhxMlFQSEhmVjMrQWpGRERtRXpVUTlGSjNZQ2MzalAxQS9hd3VBclR2RDZ4eFpRWjhSZkZrUStQblJpTXgwb21mSHlCdHIvWGxPbytWOU5DZ2NWMURFRW9hYTZmTjhpYkw1bXRSZ1N3bW1SekZBYUp0VzJubkRSZ3dheHZpMlBodTZrME1TL3pkNUxUYW8vYlpGUytWU24zTmh6YWYvS3lVOWFTM2tIY2FOUSt6aUg0dlRGWmlqbmorYm9XVk1relRnZmlwOEFScnprVXBadlorMlRPWDhCT3l1eWthNjVUUkd2NURmQWRPZEhiUkQ0SjhkMitsMUVraEZ0MDBzYkllWmNCcHUwaDRyenVXZytZZCtJYXM1WTJ6cWhKeHVuaGhTdUFSNEFIei9HSGR3Qmw4Z1dSUnJScWMwRDJEV3hoOFYvdEV4VzUvR3EyODB1U0RKaWx5RURxQmMyZldNdXE5V0kxdmVBakpPTGNydU9tUTdTUmR3a2NtK0huSjgwb2Q3NWZDSHhubTE3N3l0ZS9kUkZrajFpY0U3NE9tcU44VTJzM09sSzZLemFZLzJSTWhlaERvOXdGdjF3Y1M2Yy9Za3hNN0laK1VKTFhIUVcyZEpkMENDYkNPY3c2c3dlR0tnT1MzVGk3Unp0Vk1uTG0vZEN4S3NIUFY5V0hhdTBqZktnK1hJcE9qVksrQlNEZ0t1eCs0UU1yN1RtVU5ZWWhRQzRsZTdKbzA4K3YwRXFqTld0RXRZbGVmZm5oQWMyWE9ZZ1dNeDVLWEs3WkJmTm9LRjB0WWNrTUcrV3gyVWZBakZXZng4Y2VEaG96TzJOYXNYUkloRHhTQnh3Q2pObE0zK1FlYVhlY2Yza1FMVjl4Nm4zdm9lQ0pmdTV2SDZJcW5TZlhGQ1B2OGlZZWZ4ZEdhOGttdm9DVm1aazJuUHJOUFFIVG5lT2RYNGc5eGhMbDFJcHZhL3cvSFA5QjF4N3VkUTEweXFxdmtwb0JYbXJsSHBOSG9pU01FQVlMempJeVRhVWlnODlWQ0JHYmJxdENocFpjRVhEaDlQNVMzaE1adXNHdVJhR0ErT1N5M0IwT0RnWXdPcWhob0RkZkRUcmh4WEQxU2hCajdUWS9EUzJHaVprc3BGSkM1aFl6QUxFYlpxdGFRUlpKNHZRbStuT1Zha0l0WXRvOWZDZ1BnT1k5di9TQ0w1eUhIL0gvOXZ3TDBDVjlNb0dUU2RSODRqRVVVL0poSEZKeXdkNFl5Y09XVEZ0RVNSRkcxcThnMGlCTlRKNmQ1ZjVrNmNMLzA5enMyYmRPNFV5cjR3ODBWRVVIUUdvWmhMMzdGTHpBck9GcXJZM0Q5M0lKTEVBbFZOTXNocU5VYngyaWRobGEyUDNHZGZleXJRRG0zYmxXTDJtVEordGV6UTRBRk1pVHJBdXlDb3BhMWVLTi9LN2FKcGpNTU1RY0I3RUdYMWdGZEZDNTZGUlE4bGVHN0pTeEh0VXZ0Z2VWT2xEbWxYYk9VaUE0TE1qTkluQkJkaGNQYUlCWnRtM21CWklYSDEyOE4vZ0lDQWdJQ0FnSUR4L2I3R1A3ZnJndjgzcmQvWjl0VCt6N2hUOXYwdFArMzdHYjluMnBYKzM2WXo5dmROK3owUi96ZW4vbSszMlUvNGZhcDc5dlpIZlo5a3YrLzdaYjluMGt1L2I5b1grejdVei9oOU1iZlYyOGZzOUJ5KzNxWTRmMit1MyszNnpUL1oxYmZzK3V2L00rd1kvYjlERi90K3NJdnAvWEVmN2ZvZzc2dXpPK24zSVgxZEhZRG5WdUNEUUpXV3Q0b1VCS1NJd3pqYy94MnJEdGs4eGVZNEFNVlBGbjRMRHpEWThLVG94dFluaWRLV2crQ1VSbmluZ2tod28xNG5vaVFkVUdUQkk1WDJaRTJhVkFTVzZuZjJ0dFFVSk1MQWNjdDlidmRBeThKd2MwRUgyTU84Wm9kQVZsOXJZUzJwa3pJb2ptVXJPL0lQVjZhOTM2Y0RKTGlFT0ViVXZJTm4wQytlUEl0dnJmVWZ6MlBjVzIxMkVuM29qTGdNV2ZLbVhjcWZtY29LalpZMHdURC9KeDA5SWdVYkhabUpmMy9ZMG1USjFBOFN6dnpxZHIxc3VFNlZaaTNVVnJxTmJOUUhpYjFTaytpc0NRYmNYcGV0eWpUVHo2b2lBYnRsMU83VExBaStTRzVTZm1JWDZOM0J6KzlQYVFSOVVnbzc1L3FrcmlheVlDbVpmNktoWmcvRU5XRmJVWVhtYUJVL1QxRWJiZDRLa3NYQ0ZXd1BmMHE1WjBJb291VENZaUhwcTVVOFVUVXVWejd6YkkzdDFiYWd3ZlFubUI3WEhXRU92N0kwM2pPTzJhWk56cVdhQ2U2emNIRWFLc2x2OTFyZ1JZYlp3YTJaWkt4YlFJUjE2eXkzWnYxWW55ZHhOdjlRZDhrSW93enkwZmlodUdqSEJ4bzVLbndGeEJEOEtQcUlkOUYwWlVJUlFoaXBSODNseUdZc0pTM3h2cDFNTThxSWpRb3IxRk1YdTQrekpsQ2ZsRmM0dEFmZEEzMjZkc0hIRy9IeTRvSmdhY2ttNlFaZzZ1dHFWVkprL1hUL09BWGpKNzJRRmZRNDZjVGNFRU1pOXdVYnBNTVhZK003dVdyZWdLV00vamR1K2xhT1JjZS9CRTNnZEVIUDRJcmhFQVFiK3ptcHduL2VudENjUXZCVWJnMnVvVWw1b0ZtOVpmbGFkMm1OME93NHVQcXIrN015TWljSXJzakpORHVBV0swVGF3QXk2RDVuekZFblhraUhteFZZSUU3NmhxV0ZCTHZKMHNKUTdCc2JQTkJJMjJySlBPNnkrdFo0Nks5MFEyMStZM0tvektWUTFNTm54RmdSN1Qwc0gxOTNEajBDa25TWEZhaHVmalp2WEl2aEhjY05UTHJwMTlQdTBiOGNFVk5xZU9ka3JwSlR2THJ1T1U2R0Fxbk42V0ZlYnI0dk40VGllVVp5K3YyYzhrSVhrTGYwYUd5ZXVyRktORVBINnFiZGNybldYeFAxNkJ0N2pnWURHSkdFSUZiSyt3aEtJcXltcGttWjlFQ0htWjJBNk81amdFcEpDQzkvYjJ6Mms5VUNXWktPYlpsZWYwN0ZrRUM0MlFMUEdkd2h4bnBRc0VDMk5BL2U1R1VtdTF0eGN4L1FwVndKNklpSEF1TUdzUkNxSDl4VllSa0RsakVnSXBqMTYrQk9aN3VEZmFvOUlTajUxUWN4UjZUZ0dveGR3QlVHV21Ld3lOTnVnd1Z1bVBVd3J3MUh1TzVjRkdVTnE5cTE0TWM2a3FZZ0ZBVG1reEpJNWZ3STZkOW1lMnc3cVNxblJTUXE3TTIxemEybEszZWs1MTZQeldPcWpUWlFkRHRSYmNnbkRGMUQzL0FPcEZ2bG1mbENNS1NMSUE0cGFkRzRFczdQRU13Nno4RGRLZm1KMU5tczhlZE9LMmVHWUp4NXY2dlNhdEd6UXZXL3Qrb3RjV0JKK0dLdjFnU2doVWNVUldhbERRNFhiNERvUmFjK3dFM0phNTdja3kyaW1TMzVpNXNZV0J1RFBiMTRSWDhUM01SNDBqKzRYbnVZZXNHUU1KNnhFSjRudmZ5S2xBeEFJeVRmWS82VE8zM3VFNm5pQnVyYnFzMzYyNHQzVEVxbHFIak5GWkZlUEM5U2hZdlk2ODBlc01VeDJpUk9UQlAwWnRzcGhVaWtMd2ExbFJYbUNrS0VWcVdXcm1sT1RpZWtUcllpb29iT09jOURwKzU5STJ3N2pOd3Rpc0tpcTVrTnRHM1JtSjNqbG5mQmEraTZ3bnNvandiYkRCa2xUUFpISU51M094aExyTDRkR3g5QU5OUWNkVjlSaWo0N3EvdGZtZVhCS01IYlp6S0hJUUF2YjlhaUJiTDl0ZG81NCtZY3BWNUF6V0l0cnNkTnhTN0k5eU1abmVzTENSTDZ5dVBNRHBsZjlVVGhqNkJXUXVWdERGTnFHMG1VNGp0YW5nSm9EeDBSNzMvRUNSbFlnbXk3T2U4elZwSlhNbU9yUmVCTy9MMFdoUUt4b3l4QWYxNDZGdFFDcWRNbWYwY21oSGJ5Uk9hb3NvVUpmY1lNekV2Y0xjY1hveUh4SWZORWt2aE9lcngvVWszL1pOaWoyWFNRM01rajArRlMrYkgxbThOR1FDSTZvejNJcTRsUHlNZ1dyL2t2bS9hRkNCWm80MFNOaTJOUEdMTE5OTHVwZEpnNVJvWDR2QU8wZlNmUm56UHEyMkNpbGtRekZIV0ZySXlXWkxuOEIxQ284ZGUyMTRSZUJqVTV3eXFoQ0w5WnFlSlFISzEwbkRzWlpYdWNXYkhleExzS3RqcE0wY1pBKzlOSmEycTAzRUo1cmJZTkxRRE1jMC9leW9MeFFWTnpWcndicVRwT3gvQi9yWUpwV1psa1lqSlpKQzJySzdHWVh3ekt1eGhTZ2JKdFlsbWtTajFPdGM0YldFaFZ5anVkekhFUTZkUXZ0NFhodFVpL1drREh6OXIybTBJUXo2L0lGc0hxRmlPYlFqaVltYkt1NHM1cEliUFgxc01Ta0FjN0cwUXJiZ2lNYWVMRDBqUG50UUh5L1pEUnorZDdFanRtU2tGTXBHR1pjRTBMNnNzSEdSdHF6SCtuSmNsQk1kcTVOa0wvZXJ0bUFZb3FCOUlMNXZFL0Y5SnczakRVamV2akVZK0puTlhXQjVtMXp2Ry9tdk9lOVpRekJublREM0sxTjJUNHNBaU5LMUdVQ3hOcFRLaHJDVXlUYTJzRStUSHhoem5FVjRCajhSZFhpM0pqUFJ1SS9jVDNVbmFVT1p1UHRNbEUzYlJpcWdzNHdmRG93eVgzb0tZeXNiUmowYzVCOGVHYXBCNlRFNFFZR2lUT2NweFZaM2MxVTZnNnhrMmxDV1NhcWplNmhCWEZJWXNqSWl4M1pHZTFwN2hvaFhNYTllNStObXBobmk3TGVWdFhESk45OE45a1FiekV3M0RpK2RTZHBLS0ovd1NUOFZPTldtVVdPVzcyWE5vN3UrTlZHUDgwbmQ3RVhtbHI0bzVjbmErQU1mOUs2Skd1bEpyTEdwWUVIODA3dDdiNC9PeDBMaHlGcjhJYTI3eFRxTGN4QXViL2dVMzBmbjlWV205bW1EbHR2ZXdlREMyanJ5OWZvOWtGZmJvbEdIZGxiQzJnaDV1dnVkRjNFWW4rTEI4dUIvdm50ODV6SGtHMFFsdW84Q0hLaThVeGxiS2dqWVlqellWWGJrbW55YXVVeEhRcGtxYTFjZ1pWQXRwbXl1a21FdUJjekg1TnpJSjRiMjZDdGVPRTFWaGQwUXJ0cUdFWEZpT3NFKzd5STR5bG1JdDY3ZG81SXphRGttYWtXZ3cwTGVCNVd6YXhkb0pmV3RLNGZocFF6c2FueUZqTjVzWmIrTVN2aUJRQ1Q5ck56TzJ3UGg5T1ljZkx0YWhGd25mYTFPREdvc1IvNUlCbHZlY0E5dzR1SHgzTk9vRG1sU1lDRkdHWjIzbEd1SHpONVl1eWNHcXczSEFrQUVpR0JsS2ZwNjJYeTNJSFZKM3BOWW5uMzMxTnhuNHdJMmZubmxaRWVpVFVCVGxxSFdINHh2R1pleW5QTEZEK0NXdmJYZXd5RHBBWHJja1Y4a0hKRkJCc3JuY242U2JZejZFMTNFOHFzcUtJditVVjVFU3hZVEpWNVN5SEhTT1RLNWkwWDNQMDVJMTFZM05iOVhVU214UXBEZjVIcUQyMkJaejIvS3JHVzR0NWROS0RSb2V3K2g1KzBSYnhvOElCSk5lMkJ6SW5sSXpyaVc0Y1pEU2s1Vkdiait2V0xYWEluclY4aE9ZNzZYd1lWUFh1MC92eThWUzJqVnUrNHNqUEJxMUlwMERuZlBIem56SlgvMVdJdndXLzh1bmdBQTcxcWRySFV0NmFHZThCL2ZwanZmZC9PWUtpaHRuR3UwbXRUQkpnZEZnWE9KdzJidWF0UDBXekc4bk5CeE9VUHdZMGRQd0J4VTQ2OHlBQjhKS3k1Y25zeW84YUFvTXk5T2duQjdLUmpJQWovblVuSWloMVVGY2NQTWVucG9pWXZsZU04WGI4RnJWMlBPRXVKN0lKYW1sVVN6eDhkcmR2Ri9QbjU3alNNQk52dW1kMFhaLzR4alE2K2RkYnVFa0xkVUdSc1N4SEFIQlpiVjQycUdvMTJvMFE0em9Cekc4WmhJTHpDVEg0ZnIzejBTeTJpM1V4N2NqUEx0THZJbU9xR01WVzIvTm5wQWpCODBRZnIrOFdkZUNmMVJKaEFvWTlpWVNVemNxNTdiczd2RFFxQm1PMC95aWNIRkYrV1M5T1FNQzJVR3N6aERPQ1ljU1lxcXNTd3NwbmhROE10SWNRaXkvRWdHY1BlcTdkandOTjV6dStzc2MyMU92NkZ2bVliQ3dIY1dielNwdk9GRU83SVRoY0NMV1dXSU1RT3orTVFPM3k3WndpempPSVpDK2FHcEkyRUZEWEIrV3BZOWRvdnFTajV6dHpiMEZheFVJS3puMkEzNGNNR2FsQ1NsMklubTNrK3RpQXowNmFVK0drZHJEWFQ5eVRKd1RGODh3QjY2citqVDUyaHZOVFVibFRRYWE0WDZXQmNDbmZNbEE2c2JrWFVQMXRRVDd0THg4SVNha1g3T09GME01YkR6aGtRajlHL3hNUCtQMVgzRG5iK1YwdWtZTy85R2pwdVhrbG4xNjRka2FuTWNSR2VPYyt1NTBnMUxDVVZlV1B1SldKY0FOSUowcVhua2s1NkNydmUwejFSVnhHUVhmQjJGemZFZVAxNjhSQ2JZb3l6c24xd0dVMWxTSE5GT3pIQytCcXByMFpFSDhKMmFDWjNudEdyUUh4U2dQemtIaExsTFZCWkx6NVFtY05PUSsyZ1hEYlBGQzZZWC8vUk5pUzIwQmg2RE5POW9aQk1sRWh5U09kM0ZSazRHS0hXUVZsZXhHVGFUeFpKRlJFVnR6S2g1c0xTWWVHclhLY3RETTIzYTlIZGZ0VnpKaS9UcEFLSm4zRXhTeStHMTFJV2RjejdDcXRzZXpUUng0c0Y0b2YzcFA1YW1DcGVxZVlrWlBONTJUdVhwTEgyZlhsTzBmeUkzd3RGSDlOOHhudTFkSy90b2F5RXljcGY5TTlxanYwU0lLSHA5ck5sOXVpdVJ0NzJBOFFkSnpqOGNJMHNlZDgybkJFVnE3UEpIQytHZ3plbmk3Q2EwalBwS3pVK1F2NTZSaGRrY3R3VUtzQzhNTWpQakpqMDVUQ21wak5YL3YwZUEwZkRkMU5KTjlIVk82RWFkbFVyTllKL3JibjFRV0JXRHFRUU5HUjhNNWsydFRzRjdRdnFKa1IyNU1JYkZJeWJObXpJc2V4Z0I4eFpVaGdVWWlHNlU1ZXlEVmZqOHo2NGFSN0lqMVYxaHBRVkNPZ0YrUVYzM0RUQ0hrUG9RTzI3d0I5UE1RcFpzdFp1Q2RTUkpRelZQaUpneHFrd3pzNnk2NVVpVWlMVDUyZ1lNRDJDTjlqWU1rTXo3VGhLU2diU3ZjVDZGay9NVVh0ZVYwMGFhSi9pbm5kb1VzNjlRTFNaTFBtb0h6ZEhRdHlDZUpwMHgybWgrK3p0QUpxbUFJeEQ0YU9oMFlaa0YvYUpvbnR4T1V3RWVYc1FLM3Q0ejFRdHFqdVdjUENSb0I3bG5VWjhNLzBMRDlSalp6ZEg2YWU1ZUpKUy9TdFVXQktwNWFQTmdMQk5Ta1pWWUJtckgvaUVOTkUwaDhXYzNhWXc2aWlkSkNnWWJrUzd4d0FhNkVuMDZUSitUd0E2R0RwN2VUU1lyUzFidjNtM1Uwanhyb1pRUENwMmFBeGRoNWN2SjY4SlhoZWRsMndvdDhpT0hRZFRWMkZRck1OeHJFTUgyWkU1engyZFo3RWZNbzBNeDNSUHpna1h4VjU3NS92cnA3dTIyV2hMVTkrRXhlN2FZOFNYRnY5T0pndHRENVgxSDJXQmhZSFNodFlSU2dEc3pvT01hdFhRTlUzbHZ1OTYzUXdpRGZMY1FIYmNuOHYzS2pKNDBBMkdoRm1RaHo1UnVhM1NraWJMWWlXOGJPbDl3dlNqbnVBU3UvZzZZV3RYQlBjM3BNK05rU2FJY0lwSU00RFhnNzdLSjJSSm4vcVgyVFpKakJoOWxwZXRNU0dLM3ZsNWFZS0NsQm1EaGMrUm8xK2Z1cjRWa2l5Zm1Gdno5elNVNTdlaVAzTkdwUit6VWRpZ1lNUVJpZEN3KzF2bkVvdEZPb2padGNGTzQ5VU9UbkFuQjN2c3Y1YnY5eU41QjVubHUxVkdjVUsvbmgwcDBSL3llcEpvOGFPQzh5YitEU29IL3p2aDMrdnN5V3h3VFJOMmtoR1JESGNVVW9odmgzUkpFY2VJTk53SUZmeEhPQkZpb3BjeXVONGlPUTBONjJpK2JncVc1dDMyQWZjaCsrNy96TGJVd1JldnpxVjNIUVNpdTNOL3lvV2hSMUFSODdtOEFtcHEyakFyRzN2U0g1SFFLcGduT1BjdmV2RTQrb3FMdUtUUkpvclB5cGx6bmRiSkFXd2Q3ZTI1dDNRVjRTZWZPa3kvc0E5US9CdHpaYkdZeDNydklYRVJGYXJvT2FhYVg5ZTk5Uk5xYmY4ZGtMbHpTQ0hsNFNJeDhFUEUxc2xoQ3JZL1Vsb216SndLNTRRU0hKdG9UN1VZRnlaZzlrTzV6MHQvcENCNHl4QWtFaTZrSlp6b0t3aHdQWmpEUTdxRVdEVzBrVVZZNHE3NGU4VHhmZDhpWHVETHlzVkVjLzBhcEFtTzE4RW1rd1NRWDdQaUJoQ2N3Zkg3eFhZMlljdmNoRzdjMHowaWh6V1FMcjIwaTdRVDI4c2o5dTEzS0JKNXF3NEtDRG5TTkU3WXhRRkJ3U1MrR095MTQ4eUVsM3JHSFpOaHo0bHA4RHdmUXJrUGJWNFZHWDcrOE5sZDBKUHI4OExrMEFsNC8xWEdPNmVBN2Q0MXBxNHVHR2VxbDc3NGRnS1FrcnZHVlJEWUZ4YmRMWGdqMlJsOUNFUlhKRXJkRC9qVlhmcklYa2xPZzNUSFh2WVZhYzIvMXViblQwTmNRMysvbGprMFlVVkVjWWpoTmRqWkNoSS9aMHpndFJxdzlYTXh1L0c3Y3czcmZLdzQ2bmFDaHNIZzNtWUVSayt4SG92NVVLWHRDY0RRNmdiaFdsaGRhMi9vT09IR0IzUDZBZ1IvaDBTUXpONy9MV2lMcndLUjBDUlk0alBZU2E3cktqVVVERlRvenN2YjZuTUMya3RjMmVLcVZieU9rOFd4MGxKVmw3NC80T1NSY2VHU0JyVnVReTNWSzlZMjJmWXh6WXViV0N2bHBBOXNYZmtkZlpkb3VPVDZDdUdKSUhVNldWZC9KSFJhdTVsWldpc0wxam94Y3NuempnNm1Md3BVR3NOZS9IWGZuZkZOUVJ1VTY5VHFPL1pLWmRLK2phdmU1N0FjZkpPRkRKNGhNV2tZbFE0d2FFTEpKZUthUGE4VVRZUkxVOFlqaWhXVlk2d2VhSmlaZS9oK2Y4VW1CQjlWTEhhL2gzdWhLTi8wV2V6Qko4aFVuVGxma3VRcVVoNGJyeEtvL0lBcHJvRVFkQlJNMWJDZGxtRUF2R0c2WlFVYmpjaWJyRlBQc1IySE9XemFWR2pJQURKVlBjNzd0NXJOTTRKNVc0ZXh0SkF2clZ6TWhBajMyaXpSUmIyOHRFSUxGaGZzVG1CT2FneHpsK2JEUHpPcXhtSGdvWFRHM2hGMXJuMFBJMnZKdjVHYTdBSzhIdVVJcS9GNzVOVlRyRWxHelN4V2RlaVJ6T3FQY1lyQ3BzNDA2Nm1iLzZnSHNpSWdnbzgwZVF6OTQrQXpXaXNMdkxwcHd5MThiNkVhMTFRc3FZZndIQUxscUl1UHpPeUF3NFprT0RoNE02RGtLRTA2VFB6Y0Rud1gvaDRpTElJcjdyVzJEK1RzekZ3QURvSUZmT1NYRzZDTUJmaEM1K3JmMC9Hdm9NZFphaHNiUFdVM3orWU14aHFGaVU1di8yQXZhRFVUU2JSTlIzY0c1eEd2RlA2RVRPSmVxQ3hxQ1piK2xZczNIY0ZnL0N5WHVERkdZSTVuSk1wWFltQ0lTMENSL1kyc2dsbHgybUtzaW9VOWYzeHhrb1BVV0J0a2l2L1EyUXd4cWRqaFZ1UWRXZ2N6RlFTOG01S1YzZHpTUGwyVkZWOGpIdTFESzJMYlA0TkZOUkZFaEJrUTdONEh1b1FNWDhiV1Q2RUlEc0tIazVtbjNmTGwxUTdoNEdmK3pidWljZTVOUDErNWw3bnl6MEU3T2MzTWJQK1JXazQ5b1dyR0FvZmZPd0ZING0wSGhQZUVpY2lZdE9BU1BYQ0tsakRWZkloaHNlMkwzV1NycC90WlFrTmtrNkcrMytPTlBTZ3BnNEF0WWU0bXloUHRaai9GSzJOZEVaZmVzRjhKT25iQ2xmdStoK1VKNml0YlkrSVliRnpVckZGQnZ5cnRUdmhhdG45S0V0ZWxxZVBqVG91cWJNTlVnNmNFWGlhbzB5SmVpa3p6V1FWdDQ2cmlwcmRHWitLNkNSbmx1ZVNVd2ZxcG1UMjYrN3VoREJsUkF2NEJjYndBWEMxdkx2RlBHUi90bysxamZCa2FzQ3FwT1lvZjZob0VLZlpETDlRcXdQZUhOMytPTXlVeUVKWXpKUi9HUTYwSGJCY2FQMGtrRGpucjFsNmxvbFNtTk0vd3ZqVWg3NEhoMjA1TFJnenk5UFc4WW5nZDgyZUhnWDEwZk96R05GTHBhc2xSUWtHZ25DdnBOK3l4UTROaTZwZGYrcU9OMVRPdWJJWkpwcS9ScEFyNVlUd25SZ1NCRVd2ZTgvb2N6YmYvMHNySkM1NnUwYmJKNHlZWDlFSk5MRnUxZzhnNXpieGowRTFlVk1FdHh6OTNZaEJhdFhFaHRjK3JsQ2RFNE45QVkyRTNSczhMSkVtd2pIN05xQVJNdTZ0YjF5UWNOWHpCKzVBY3NXTExYamdhNkQ0SmZGeFlLT1QrQStmNUNGL0dUTFNGYW1iQ0ltWlFuR2JING81WmZadEozaW9JZW85dThwTHYxTHg0N2M2L3JrY1d6RnVWU09NT2l1ZDdzLy9KSVYvS3dMR0p2VnpTTEJXY0pRemQydmtHd1AyQW1oVm1BOEwxaUgyYlVFQ0E2elFLTTVJVUYwcGFqbGgxT0o0cXVHRjErVDg4L1oyYW4yK0E3OFlmK20yc3ZoOW9lN0VtNHpUSitrRUl5aG8xaGE0M2liUGd2dVFuTG91SmpHcmk5Q3NpQi9iOG5UaGZSMDNOWjh6eHEyNVFacXVMTGFCVXVJWTAzZlZPRlhoc2FLOHNPNzRVSVd6bUlTdUJvamhyTHJ2Wjc5MHpldW8vaW1pYWM3V3RpNVNyZVkrYVc3WlU2ODc5OHRBM3dVcW5abEJGNlhndndDOFB3WnNHM1VGMC9lSy8zYXZTcC92MTNIRUY4RFNvOUt2YVZBR1ExbUZYVUlKRTRZbzBFUnZKc3VCemthdmxhY25yY1VNRlhKYjR3YVVNTDcvRHdnZWo1cWhDdHVtU1daM2dNRnFaRVFLMHVPdHI3bFhndlZGcThSa3oxMnNGU215Zm9RbmxuZWlicFNLYWNma1ZsWXpMMXRDdXdxdDI0RGNGdmlKV1MwQzlRQ2FzZmNvdkhyaXU1M2YvSGhSUG15bEsrZU1FREg0d0RKdURvakoveHpoUk00bXNBeHpxYjNLVjRlZEpGSnZqcU4zMGVWdGIrQmY5ODRaeXFrV3oyZERUMjdHL3o3Tk5Tc1ZKQVV1aUprWVF6VWFCck1HL0FoTDcyNnFZbUlJLzJlQWVwbTNZdTFQV3pDMVBoZWFjVkVXc3p0VFlMd1hlbkNPRXdCMDhTTGlRSnUxdnY4MkJNTUFFcVpyajBSVExpZ203OVpDZXJWWFhWbHFyMGNRdWJJTm9HY0lySWIwUncrY1kyRTE4TmNPd1pwNWRndTJ4VndiaE5sY3YxaU95TTJmWlFVVEVWQzBmampFNlZDZHlyeTRLVTV0eXVkNnF0cXp6bXViNHNXZUFKMGxoZkd2dUFvMW9yL3NuTjJRbmtveE4zTC9PYlpRU2s5cGhEWVAybFU2KzE1UUQrVkZSekpsbE00N1FHNVRTRGVmYVV1VnBsb2RrQ3hEa0toRy9HSWlCSmYxMUlZL1d5YkloMEptT2ZyVjBaZ3R6ZE92cHowNFBaYUk5Y1JJeEVWNlY4OGUveEhKbzlDdnNjd29aa3VmRHNSOWd3SHdhajg1MGE5SExxMmZvOWRxeHoyZmFtTjRkUVNqMXZuOGdzQWpjdFB2bzVjaE1CQUgzQmE4ejdlMFd3R2xkWmhOcEdlN0ZkVnJDWmtlUzNYMEJoUkNKYlJZaTF5UExEZnB1aWQ1dW5vUWE5blg4Z3R1VXRaVlcxS2NpWmd4Rkw4VWptKzFheHRhdHJaU2R3U01rWFN5ZDhSdjBZaGhxWjQ3US80V1JORVBZbUREV0FCT3JZRVc0SDJzQWR0VXlCdEVxcUdvVFgwODhOQVVlcC9BTUJGUVVpQ2oxV2tLVzluYmtCbURvUHhSQ00zN0lmNUY2djdwc0hBK0l6WVF0Ymp2c3U5NENYaU9XNVZiYmpoT0xDOVgrdWVET1Z3QUlkUlNXK0NTQmJPTjBSK0MvRENhZlIyS3I0QnlrK0VZQXRRZ3p5bW5Sd01sVnpOTGMzYytRUnd6eHlpT0JwZmZlT0tJNlBGNUp5Yi9NaGhXN1h0UGkvODhYMVZCdlFlaWc5ODdOdlRtR3BtRVJmTm5sbTJLUDdVdlUvczZKeTFET1hVZWNyT3d4WkNoTzlCcFBLZXVrbVVHV3BOSnQ1akZNcFprYlVqQU9FU3VxUG00c0F6SklYSmdrNmlLWTN4S1lmWlhkMjRSdjR2Z0lLMWZyaGl6NVl6eVc1bXdOMjlGMlR1a2psbFljZE1ka3BQM0lSbXlqTG9qbGtxMDJwK242TStCMzZvSStOa1JkTUZHZXBZUTVHYmQwWjFjUGc1c0E1Qzh4cjFmOEhkenJRZnhrWHNQZmlJVjVuL3Vmemx3WW9ENTVCSkhSTUYxUS9BcWxDWm4rZWlTRDdpTTMyanp0ZVVSQktRK3pFWnRseHhqbkJ6ajBydVRxVHZXUDJBaTN4TlpqU3ZUMkZzenhEa0Q2Uy9ETXUzSHE3WUF0R3FFS2ZUakR2T1E3VE0xL0xBY1lqYW5qNlMxRHoxQnF6dFlKRkM5SUt3eXJrTUo0VmZUK2o2aWk0WTdDZGY2b3diN25KTVd1TEdsS2U0MCtjbWs1bG1oSjJ3T1JtaDNqQjV1S3krSVhlUXpTUlVrMGZLakNjWGNCMUl5MFVhS3lPK29jU2ZlcytBTFRaNTdKY1NzVDB1bU1RVy9VVUZ2UDBvODFwYzFQTnN4YXVHWFBzN3Y2bHpSRVRNS3Q3WTVmZ1Ryb0NacUc4NFZjUHMwbzgyNDdQVisxOWlTU0FqaEIyWm56aWZOS0hyY0UxQ29VM092UzBJalJtM3lLcFZ3RnRPWVY2V0swMEo0cDMzT0JISmN4V3JiK3o4OGFMRWlVS252b3ZHQ3BXdFNGYzAzUkdZRE15bFlmUXpsK25QMk5pbDMxdHRvekFBOE5YOVBVdEN1ekdDMlhtYmNXam9pMjRDb2liMVJkMG1maFROWm9rWFlKajlnclJRV3lqRXhiejl1eG1nekc0RER3OXNZcVI0MjBaVGR1Y3Y3VGUrcnBEUU1HMFoxODRsTWg5Rjc5RkpKZy9DcTdscVJ4aXp3SXg3b2FEK0dpV3Uyai9aTGU5c3NaWW44eDJMT29MY2pOOGxNWUE5b0lCOVBKOTJ0OFFiZVA4ZWtJRzRvZWgxZXU2SDRBZmRXc0RQUmM2dnhqcEwwUTJIRDFVN1VZTGl6QTNTQmVJOGRMTU1BWXhwRDZQb1k3akFWU1hWdmFOYjRMRkN6eXhUNUczZFkzWjR6QkZpK0NYTm1hZ1BtM2g3d2pRRDZhMVpYSVM4WnpBM0ppU2pzcjdnYkxXd0dlRkNmenh3WGE1OFpXVDM1bmE0S29ldk5kLzZCem5uZzIreGxOc1FOVUJWc3hwdDRkVlJNcFAyaUYxSkM5QjhtMzBHbkZBN3RnbE5BZExUcEt3SjUzemt0N2hJNUxabTRKd0hiL2Z3QlZRZzJ4SXNDclJydW1QZE1mVVpPdkFZYWxIbDVUeW1vUHI0Q3lRTEYzRS8zcEhyOEdSbnNmY21Md3diVDZwTDJoVWlwVHBZZ05RcVhtVkZXV0NyclpjNFJpOHRkeGtnQVBOeVI2c25SRDcvL2VMMlRHNU8zUUoxK09RSzJaVGxrS0xUR05UWDR3b0EzaXpJQnhNcjNVYXNVVkxyZ1AxQVh0Ylc4NzdJZDhrb1pTYnB5UFgzbXJWQkU1YmZ2b29WUW1KVWZLSWdKUHpwVWM1VDFDbk0zelhLajV0UWNLMDF1bmNTK2xTRDB0S2hBYWRwQWlSV2xEMkdGUEhBVElwM1lHdHVybjk0cDNCNlV6VW5mZEVMMEprWFZTVG1vNGNuYTdMTFF3NFY0NFJCbWFlbkRaZ09GYTlGUkNhdktJRFg4U2tuS3hzSkNKMGd0OEFYQ29hK0RYRTVrZmltTkJLRlh0ZSthSHoxM1RBUEV2RzY1N1ZRU3hNUXhKSlhBOWN0enBIemZjWXBQdmRhZWozMUFOTGdZdmsyQVRRWnRLZTBWYjg2UWoxQUduRzViZDZMdFVFZzVOMTFZeVRLZTlDaGwrTmI5WU8zcFdiU2RsRXJLMG9HTUdtTkNQZFg5RXRpcmU2dmNVTEs3VFlnK1NIcHpNcFlaUUdzWUdmVzE4eUQyNDBBa3FLbWYvUGJVVzJxejJJbWN4b0UvNjFuTWVuQ3l5SmZmMGlxdDN3L3NjQ1lUWjM1RTE3TU1xOW42Y2dic0d2VFQ0S3cyNXFqMEwwUE5jd1hQcUQzZ2QvTThNNGpBY1RhUEgwWGpsK1JFQVZxcDdMd0M4ZzVrYTFnWHovQ29KeExveGpQd3ZVR1p6aTl2bmF2MFl0RUpxSjdHMktLanpyTkpDM25vNnJNRVpBT3hjcXJkRVpxSEJNZFNZSGJPM2s4U2h4NlFFRklVWks5ZGM3MllrQ3ZDdEV2TWlhMXlKY3NMMkVacTE2Q2ZvRnREcDBxbXVrZE9uOVI3OGN4R3k3SXhIb25CT1E0T0tuYXV2YXJmeGVpUHpXcm92M2VHRlFmenVTQkUyU3pQbFVlQTJ4dVpxelJ2VS9uNVZ5QUdweE9WcUtIQ2JNS3I0RXM3ZlI3OUhoeFVlYkxUVE1pa3FyL3FHVXZmZ3BjLzluMHpyTTI3bkpvcFhRS2xDa0hpZGY0QnZLaUdsaGVqTDc1SHJLZHhkOXRMU1VzdmczWHk4QlR1bEFkQnU1K0ZxRmlZR1o2UjQ2R3R6ekl4djRES0x2M242MFYyQVN1L3gvaE9tU29IeHFQTC9NOEg3Q1VUYk9jMjdsd1JjSng3eGsrNFFyQURtM0cxUCtjVThmOElOL1dhc05tNXlDNVVUQjBKSE1uMWovK0hkMldBRU9HT1lUL2RWY0tJVmJpdlRMZXFYak5sQjFpSnJheUNvWDZ0TU1oOWRzUWNRQVpieXdWWjArQ3lQalU3NVBFSXAvTnN0NUNyZWhKMTV6U0dwanZqczBvbGxNNytIcUIzTjIzYVJORWtIZXRsdFlkbmhibGNFY2FZUjY1cFd0bTM1b2U3dk1Qd0s4VWZDWk1FRmE4c1hjbUZ1MDU2d0x6eXE0WnhWVGRrSGc0Z3FBS0N3U1pERDZzSEhlcEc5SHAzeTV6aEl5UWxpZkJ0dEpOQnlzL2tmNzltdTRsb01pdzhpUVFCY1hxUDlQbXZTbTVRTDJ0UzMwK2pYNzhPc3Q0RW5XaEN3MWxZTXdBY0VhQW5wM1lMY3lJL09nejVWSDdwd1hFOTRDQlNNaElXYzY0a05GUHZXL2o3WktCUklBTlB2WERaQ2Fpd09hNStsUmprclZNd1ExbGJjYmZWQlFwbE9EQjMrSDB6SkZuVi8yZkJreEFNNWprYm1UV0pkY0JPYTFoanVrQUxzdVlmNDB0NzlheGlUN2hDUm5kaExzUHUrN0VPemt4MlU2WG4zWWFxUE8vclVkdFZMSld5STZOVmVsMU9XNWZVWVRXdTNBa3pVVkZTQ1RoV3N3NGwzaFpUalkyakdVamEreFRuQlNNYXVpWVJvZTJ5YU1LRTNmSTBNTUM4Q015NnFVNHBTUHloaTlhNnl1Z2MvTmdHV0FST0VnSWRJak9MRmhBVEU5aEJPTkVJTDRNVHNEczBsdHN1dVJ0cENzVGRHTVVRbkUyQzhpNWFrNWt4cERKK2llSEVVVGp2Z3RnaXJjMUMxY0x5VVNNMnlTaFYwQThIa2djZVFyUXQ2ZHNNSWs4eWJCRVhsL2hCYjZuZDY4N2dhWXVRNWtlTkpmS0ZkbjdXTUIwQy9aYUl3TkVVRi9IVlBoSTh6bWIybCtPQVJkM09oUWY2Uk5DdWJwY0ZZaWY4MzVpSnA3RUxhTE45ZktHTHdzTk9jWGFWaVQ4Q0V3NUlxbitnK1orc3E2b3BtK3RzNU1jcDE1Z1ZqaHRmTThVS1hLVEt6djQzTUN3clB6djBGWmNzYWdST2dNdlI2YzJqRTlyL2U3anYwVFkydnlTSWZvbUlzVG9wd1NoSTAvTE9jQUs5dk1ReUl2bkNEcGFIblQ2czFOaXcxd2QxM2FJdmszcEpncmpPUjNNSFBpcmJVSjM3akkwMGRhOWkzOERPWVV3S2VXUXZQT2hucHpwL1JUT2RSY1Qrbi84QkxRVU9FNUNKeDNSOVdWVTNpbkxkWCt3U0ozbEczTE5wanNkY0pvSzU3YWpIZE9DYTNnMGNTZGF3V3AwSXlzRHZoVWsrVlZnMW5pRVpqVUZyZjNtWnNtVTJvMmdsMFZORDVHKzNNR1QvV0NZYWZtdW5abldwTEMrcEtxUjRneWpQTTYrNm5XOVNkZ1JvODFEL2JjS0JRUVVGSnZZd1hWb1g4VUttNzRWMTdaNmlEc0M1dVRzZGIwQ1dlUHNkbXAvNEptSWVROHRvSjFrRE5rZEQ0QVNucUVrM2twaG5OZEhaWkJLOGo0WjU4RnRqem1UclZmZ1hxUjlUNnNHSWI3V3BTdkdYK0FJMmJPVzQxMGZRVWNjUnRUcFFOVzl2VU1WblhISXFZT2EwWnBvUlN6T25UM0VlRnZtaWxOanhjb1kva0FMT0F4aEk1QmV0NVRncXkyTHRCUGlVYnQwNHhweXU2MjZ6Q3VhbWlQQngzREljMjlocVZITFVYZHZ1U3hLeERNWjRyd3hIWEkrTlc5TlJabUNvelozenFUK2VBYXRvRGM0ak5WTzZWdmdSYzcwdi9xUVBpU20rZE1kY3VzNzVrSzBKOUt1V2d6aTBtODZycVZHekYvcXpXTU1iVDB3TGVqa1U2U2ZoZ3p3ZTB2d3JaMmNyTXMvRlR5NVFjNFlDbysvdTZmdVVpbWZmQ2d6NlRmNExrYTFJdGhkeDJ2REpxeGJja2dWQnhydnRvM0c3dWsvdVh2ZVVKM2V1OWZGa3ZMQ2xNUkJ5ZEU2Y2NhaVVPc01DaE9EUlFhQnAvMHVDVG80TXZwMFY2YnN2a0hKNGZhS1RUKzhXbXpOL29mMGk0RGlVUi9uSENPODdMR0Q2VmpmdmtIcUx2LzdiV2ZYZHo5OUY4djIrQXFiQkhPNnhwNWhwYXRkZFZVek1DTlRBMHl1VmZQcFNwL0E1S0FlRGh4N3NxdTBQNFVnVVF4bmxGQmlxZWZkS0drNkdza0RsMXk5STc0cUdKYmdMS3VWVGI5L2NyTlVqMDZCMWgzcTlqaDhyU21xcU02a3dTVW00RkEySHAzdldNbzg1RE5TS1NUbDcwY2wreUpsM2NVZS83bDh4Z1lLWmN1eG5paTRDUGc1Y3B3NTdKVFAvRXRCSW9mbG5QVGc5V3ZBdnQ1c2VzSkhYeFlxM0gyQ1owUWw0eFh3WEM1RDJVaXcrR3YyTGtveERCTzVrNlNTNHAvdTFtNWhFZzJpUEo4TFRxb21pVDlUYlpINTJ4eVhFdGpBRVVab3dlQ0VuMTBXZ094Z05nUDAvdUpaM3BWWUxOdWFkMU9jQW12NUtKQTQ0ajFIWDFHQkd0dEYzN1BTRnFPYzc4ejkvYVI1bFJrNUhTdSsvbTVUY3V1VXo2NXRFbkFaeTA0TW5DTjAwd3d3eVFoY2gxcURzYjdJYXpUa01xWDdNa0lPN3gzTGJiQldrOVQzS0JId05xR2pKSTJkU1kxNFhBcFhXMDlTc00zTmhSV3RybWVRR1dOMHJGL0RmWEdVQnpPM1ZQcmlLVEVlb3FUVU15U1doQUhPaEF0SkVWZ1dVR2NpckpPMnl4dkU4UXliMEx3a0ZhMEJlaFp1RHdlMTBUTVlPRHZuckdMcC9uUFhpZ3FzUmQ1QWNlUWVieXF3MXFkQ0ZlcFdSWDhkZDl2dXBueUs5dFo4UDRmQmlldjdyZXFHTG9MZFRwekk1YXJwb1ArREFWalZSWGhiN3NrbENjUStaZUdsQXlBWnFQMEU0bUNkc2NxYitUa1RZVm8wVWZscG9UbmZNNXhHNjgxWXVqMTdlNnBHUU1CTHN6SC9Ub1RLVlAyWEZqOUFvcy83aDZSeUpjcUFjd3FsYWFxSGwyc0VTc1JSQkcrOUhUUVRkRGEyR1lFWkVQSmwrY2NGaUxnQ25aclNMQ095WVBDaTAvRWovVWR0cVVVczZUcFhPYW1nbjBoWjB5SkQ4NHh3RzMrZFJkaEV5NmVuNTlvU0c0SGlKczV6UUd2ZTNRNVNsbEdlNU8zdUFZcmlxdExoV21VZFM5dkEzNU0wNlpTcG5WTGVMeG54aTVpMzY0ay95eTVGc2hLbkxhVGM2TEYwWXowL0xib2NDZWhWSkxOYndiSk1jVEtSOWxlVzF3SHVhdWFkMUp2NHUwOGlUKzFDckY1MGRQNjVVVEVuTWxzYmdvYnpobWEyVFRWazM5SStreWpTWWtzZ1JPM0JCUDdDY3JKTGhmYjEydDE4ZmdRYkY3cVFIYmZSMzZhVHBVQ2NQSkh5OTZ0S1lwM1J3YUhCNk5ma0pseG1tNUk5dEoxb2ZTZU9sK1VLMm9HYnFuODMzR1R6L1FPNVQyRjBmd0JjSjdvWWhoc0VwNHp2OHMzU1BacSsxZFo3OFc4RzRiL0JnRkdMSUVQZWo1UVNDOHBQdEQ2NnR1ZDZxRzVERVhYbmlaY25KRVlWR3B5elVQMDFUdFN4SzVNKzdmaFYzQUtrdmg1Lys0SEtVMXNkQlVsZzAyTVNTdDUvNU1HQ2lucElZMERXendpYVdYOU1wTUQyT3VTdXk3clZYZUh6ZWVmRzNsdWl3Y2ErcTJyM0xFTE43USt6NkVOcTZLMDg3K0hzZm10WEJUcVIyNFBwbEVGTmFPMVh3VW42c2Z3aDU4L2RKbCtnbmkwaVBRS1JwazU3dW8vR2tRUGhLb0hEU09wMm1KUjZOT0Jzc0tIcmxHT05aQVV1cTZzb0p4TjFhSlRsYk5uZkN4SGhlRGI0S29jL1ZXTGhocEJLY1gxMmpTaHlZU1VMMzRSTTVxa1pGWWpBdUViUmluc20rR1VoOFhHM0NRTks1OVVNTEJiNEVhY1Y4bXJSaG1Hb1RFTzV1RWxLVzFMd2tJQUczZ0VPSFdGdXgxTm1YenRxelhuYTZ6K3FtdlhqeWk3N21wL1c5YzQ4ZDYwRlR4UjFKTlRQNjNaSTNDV21zWGZVUTlJdlF3VE1jWkEzbG8rQkJTQkFVeUthYmdxc1Z6amNOd2MyZnNXa1ZlVHFNTVRrTUdDcUF5L1c5bmlkOCt3eTFBd0QxS0Z5UXFuSkJQUWd3OWMzRmZRUkR5d0ZLTjl6bDdaeFhSaDlxVmVuSTNwUkpoSWI0Nm8vVDRubkwxcnE3d2F5U3RDYm9tem8xa0krdFJ3dWZBUTQvdDFJamlidEhaeFlBWWYzcXMxVURBNXR6U3VxRUFWUGx3QlRGckE3WGFyNWhIT3N5dlRXVU0yczI2a2xZeUpEaFZZdTR5Qk15Tkk1ZXZpUVk1VC9EZkpWRkFwMUZHc3l3anhIN2x2VHd6T1o3R0hUbnRyajJXTlNjRnJIV0RFM2M5K3o3WXNTbWwxcEtMS1pBVitQL2ZxdnNGT2IrUEpGVU90S2VVcktUUEFqczdKakVmWlIvK3pxNDNoSi9WdDN4SlBMbHduZXMxUm1MdXpQdXJZSHE4dmlaMzVPbDNEZnIwd0xENTA1RWdZV0hPM3gxenlJcjJmaXU2REVHR3RXTHZoK01jMFhxbTNOQVo1QmczamdlSHNKSTUxV0pzZEhPRUhNc2piYzZneEZXVWdFZGthVzZjMy9Ldk1OdWlPOU4yV3FVYzE2aDRvQVMzRy9YRlJEVC9lY1NFUHplOEVMSkVsQVFvVWMzemtlMFZaMGVyZFExY1NpZFFUUnl5aUdBM1JoTkRyaVVkZXdRU3BiUGIvc2VYUHBnL0E3SGNxTnBSdkxOZ3Q1RnZBVzR5R0pHTzNjZHQxVEtUNXBOQ2VGUno5aWJPQm5yaHFCREpNOXVLTVpGL3hTNEljbUZnR2JTcE51NjhFYnRFeTFqRmJVWCtjS1hxdEcyZ0hkUjkzaEpOcDRXWC9OR0diWWJrM3lXYTFRNURsbC9DUnl5anUyLzJXdEJjTm5yaXQ0K3AwOGlQcFQyckRaSllJT056Q2Zva0dTOUp4bHpic1d3VFJlQVBvaDhjWGV5VGRyRmhNK3Mvb3c4RHJib0lzVjRyektvSW04SXFqbm1pMlcwT2tyaVIwVEhwRDZoZXlMcG9rMzB2ajJRNmdETHA3UVArVDlTM3FUbXVaUWxmRFlaWTU4VUdOaDBGZjVtdk9FbXFta2hpNThMdE1rOEFCWjhDdWsrMVdYNkhOWmJvU0FSellkUktWRWxOT2RIVk1OMm5vS0dTREp2cHJkTEtSMGp4aVBHb2tXV2V1SUtmNko1VXFTWTlVSXNzU0swUFJ0eXBTRjVYeXlsWVQzWGQxQ1FQbUFOOHRoaGNtODUxeFRLbnRVbUx0NXd2WGE5VzlEdzUxVHM0L0tKVSthM3RoUFBrTnkwTjcvUFJDYTcvM1kxWmZyMktBalRXR1pxVXdsQjcxRlZBajdURFlXMjIyL1pKTytKcGVYdWs3TmpKSDJXOUZLWnhrTHhoL3NES2Z0WFRuK2Q3a0tIeDlyMUtoOFk3UUwyMDB1MklKTmJxcnpycE5xS3BCR1NXcW1SZDUzcjlMYlo2ekU4N05oMGlsd2NQaUovbGprdzk2VzdybkNNWTNnWEJveWZJeEYyMzFpRGJweEp2VW13RjhMalR1WFlyVVQ0WjhzTzljaUQ5aXMxVzlaNTRBYkczd1BtWVZ4RkEzcWE3a0ZNQS9TVlB0dDFUMWc2d3BTRmQyRndxc3BoYWxWdlpteFJwVjJsZEpwdTdCTXR3TTMwUGoveU94Mkh3SUg3YVBLUW1jMEZNTWMzYkVxVW1DWWp4d0EzT2MwY0NaZTRlSmE2VDlaaTdtbmhRWUU2QlV5YnYvZnRoZW1makhjcUJUTzlrQUthVlVabjBINnFQNHRZQWhRQVhJRUVMaGwxUlF1ekFaMFVSY3FUMUgzYXl1d05TQkN5clBYWnBneU5EdW9RbVJ6MC9DV1ZTSkxaWnVnOTVZNGRzRC9ucHZuY1B0V05GaWxEZnhXQnJXSHFVbUlCcS9RUTFmUE1qRWpsSDV0UjJORUpmMXdnbXpBZ042Smp3eU5aelJuT0p2aU0reHUyL3p3YVpIdThUazRCaXJmOU9WclRCanVyU1d5WlVJY1J1TTlEM0FuTGdBaFArMXhVRjJMSWhmazZGUkZzd0xOQk5Mb05VQ3ZNbUgrWkF0cVF4Y3VoOWZQQ2pDMXAwdW9HaUdrT0N6d2Z2SE5OaHRsSkh6VGMxZ2hhZkpIVklBMlo3U1YrQVhrUWtEbkpBajBXbXdmRzVINDFNTS9WN2RqTUEydWl6TXlYaUJ4cFFBazhVTFMrbm9CQWdxVkIwVmNRQ3pDWG1FRk1kYWpST0tiOFNHV0p5QnErdWc3RGJKekpZUXRwc1E3Ujd3aEtxaVdBM09YTDJXYTBGWFBHV2Fxa1VTbGRHTlJsMmZiTGdFVlU0V2xRaHRxcG4wVzZ2RDgrdVVkdEpHMCt6cVpYWFpDRnZpcHE3SGlpRHNNYVJzVE1XTTZNc0ZMUnpFSjFqbjZKTzhWWjhYQzJFcFpOSDRDVjYwclRLZlRMOTNuQzYxNFRKZUVBNnNjSkw1TzBZODBweVVHeitWYm50N1VnTVV1WnZJcDRWWnp0RWFIZ3RBYUNyQ0JWalFJY2F5ZzlaZkd4SmpaWUtYekJQTkczVmlWZDlEcjRRZ1NwTnVQOEkzc3J1YWdKT2hkS3RxcXhtSEpiZEZYRCtlUmNwanZCdlZ0UHB2ZEVjOXV3Q0E5V2FWRSt6bHNzR1RiYkYwK2FSZnY5WlA3WW14RGQ1SGZyVHlnbVg3M1FUTnpNeDBIWE1XVGtyZHQ1RDhlUjBhUytMUkdMMEtvQ1FFcit3QlNTUlNYczB1cytYYWtCK0pydkhmVmVORWpxaEw4U2FKMVZXYTM0MWQrUmtYc2FNVE82ZXd3QjVYNVdGR2lRTWlSZjBkVHd1eWpYclhCZ2xKL1FxczBiUjhWMzA0MWN0YWtaeGMyOXNrd2ZUaGhqem1QbjRDaEgyNHRqVjZBbEkyaGcxVm1WMitSUFg4cGVXZkRaNCtRYUlIc1ppT2hKZnNNbHp6QkMwY3lmRXBFa0N3U2xHQVFXUXQrSldLYXJKVmhtcHZnS1Btd0ZTK0hpNzBtRmQ5eFVXSUtrZFoyM1VCWkJIZTVsd1N1Q0NodFI4aVgyV2FHTUFWYitKMERmcUQwZC8zdjROSXg0THQ5N3NvTGZNbkpLTDlqbExCRzlWczBGTEJvREpSU0tWN3hDK1NSOWVvQ29HK0libmVuQ2ZaUllrdlI4bmZTMW5aQmI2VnBUelZVb2pQcmljZUpiUHQ0NHB1RXdTdUsyL3J0MTV0MGZZdG9zVFIvZU5LNTI2RFNKVjFyaFRHR3ZuWDFqTUM5WVNHNi9DblI2elRRK3lyd25sTTBjeE9RRnRUR3VraFRDR2R6MGJTclNCNXFJR2V4Y3hRRGhrMytRcytLQWN5THBIWEMwSGlBSnZSZGlTSjJMd2I3dDdlMDhzREdyQ2I1MFN2UVNQNTBtK3VFeEJVNjF4L3A0bVFFc2JHK0ZDZEt5REtrOU8vYWRLMnZIVXI5WWdxajRuMHh5b1RzNHBJdUtVOHhMYm1uUjQ0M2Vwa212a1ZwaWV2SGdDaWtHSUVHZHU4WGd6NXBmN1F3UzZIeENzRFlwM2xPeGsxYUZUa3J0RzJkUmI2dHhHUVpqUlljT2YrYlQ5VG5ET1drcldhVmM3UnJLMDNHaW5UQlJENGN6ZjRuQkFjbHRNa0JHV2NzanZPa3I3SEZ5VHI1QVhhbVpJMTRtVG5naVhJakdHbTN5T3oyZHZ3aTRrVHg0a2E3Rmw4VVV2SThrU1RNNUJEeDJIMHBrM05BdEMvZk9mdTVia1M1Mkh3ZGlBR0VKM1ErOTV6Q1VLNDJGeTUreXloRDUrek4ySDQ3UDhkdnloU2VHREx5cTI4QWxPbHI2b3lrQmZwTWZVejg3L3JlcGtaV0hWY0xoaTNYQmRSOXJmUlA3WWVRVlBtU2FiMUFyWHhoL2VTbVR5YVZEZkQ1U01VdGlPeVpVTDRCVCtEbmorT2pNL3oxTmFUUjM0eXBNZWo1VUMwaEZ3L2xlTEZFK3pBdVBocGRNQkhSQzFOa1M4V21rbnBYSmptUkV1Q0JtNlppWDdqOVhwSURlZUk0OCtRNHhuZmRqalQ2K2k5Sm1IVUtwOHgxN1JMS0Q4dDAwcHl3d1BRZUplbXYzZk5PZ2Q4K3NxNVVsdFJvMHJxYzliVlVKeUNyUUNOSnJUUXQ0RG9RVXEzbnQ4WXhkaGZyK3VXcDJRbkUxM1lFdnUxa2FVREcwN096WERjVzBkcno2OEt6dVNTeU1sN0ZKWUpCSXY5eW1XS2lpWFNsZFNSazgvZUczaGoyVEVSUkRnSS9aMUxLc0RxSS8yYVR6Sk9HWUFTamxqZUpENXdDeFB4N2IrVmx5dUp0cFN3c2l6eTROZlp5bFZIRkk3R3oyUVZFUC9YVE9TNGx0S1RFZzZuMVMwZUJZY3NWSmVUUEk5WEpMcEZSeFhKNmhhNGNWa1hLOG5taW9WM054V2FJc0wySVJsVTdTRGE5MFhwOEhnam1FZmZHOFo4RFEveW8wbm1JT25kcXRCMk5ZVjBTTXZPSWRyZHdWWjBxS2QyaEZqNHhVWGpYTUduN2RpYVhHVlJ3VUVtRU96dXN4eHZISUtBZzFWRFliRGV5dStlbnBRdGgrU0ZmRXFPVDlnM0Y2Z0NUUHVTUlF3bi9lYmlYc09sK2V4aDF6VllvYlVrMGxBWGxUZDJOK0RTSFdzemxuakNlRE5IV3hqNXY4c250WE1SY3Y1SmxpbHBuUU1ib3hyUnRnWFhlc2tTSTlrN3pvTW9VU0R6TnFrTmMzTUlHU0k2WXRuV0RFby9LeFZlSjJrN05lTmh3K203eGkwTlJxbDdVWWo1TUg3RFgwbkRuTzVtSzlwNGlFRERoamNhRzNqWmxEOWR5VkhTRXA3SnpUNWorV0hONVZwSGovRzBEa0RLUlF0Nm92YVlXTGtxVzhIVzM1T0QwSm5PaUR5Vm9lbWZZcGtBVEdDTEZPWnRKWXhJUWJ5Nnk3OEZ1aFhGQ21nY1BaczZCdUZOOEUrVXVLUnhqK0c0bGlINkhodkhtREEvWXNOeEZsdktvUDhqazdvdFpUbStjckoxK2VsdVpsU3RuQW8vTUN0dE5HMkNZVkZjMHdEQW1MMVVvcjNiQ3dhS2VLbDVFU2R2V1NYTlJUKy9VOUFUeGdEWlBxMjJPQ1Q2emtDYXpyeVAyZnBLcmlaWDMvZHJiNFY3THlQYzRWODVVeFZ4MHhlMTRURDRlMkZkS1h6TW9PeGZwK3FGcituanZqWnVvQ2d6K3BoSXByYlovWXlsNHg5WkwzR0JkMFZmYThhUzg5NU04Z2NOU2hKNTN1N3RMdGRqejBGNGFFUjRFTnBKd1plSEtGYktnZThUSmgzTit2RmE3eWdaaTVCbll6MnIrV0IyUmV6SmUvTzcyRi95TWJmL3RuenN0ZExGNHdtOWFxcm5iNGZkZU1vNUhEVDNtZEhmVnUzK3h5aTZtUmIwUHVYUzUyQU1hSndSZTM5RFNZK3JTYklvcmQ1Nzcrdk5xMEE5VHZJUVMxME1VbjF3ZHl3bVU1QVZpZmIwR0pHdC9ZaUNPZEN4QjBZSE8zUzlHMnkvU2kxcjVha2JmdjRWbjl0b1FvcFh6Z213ZWZMeFE1QXFVazZpRFNtckhsMWN0MWFMQVRPdXIwVXcwQ2pxL1ppRDlhdHVXNFd6Qk9DWGpONHp4eS8zSFNsMzZaTmpla202QzFXWGVtNHlWenI3M3QwM3NIakpTRW9xMG1sUU5VcWRiZ1VXTWtUb1FwVG5HSzh0MFdEK0NCSGc5UmFDc25UcGxsdC9wWHRlMDZYQ3h6M0VZa3UyWlcwUlRpa0t4U1RWLzI4eFY3S1VRYkhEVnR5WWllT0wvcktLTUNkYkRxTStSUHo5V29palEzMUI2aE1vTlJ3bG8reFBudnpRWGdLUmc5bUQ0R2tpamc2RVRIT2Y0c1hDVGk2ZFhsb0phTXJIaW5ld0d4VXM4eEJaT1lMRCtETXBCNXB4MXpyV1huQ3VTS2lPNHhzdS9YSkx3SWtoUEhYcFUraDYwdjFWUnFNZFdtcFNGcEVtb2xWd0xaRHlhV1RUVFVwd0ZBS0Y0WGd6bHpiM3RmOVl3RGRhSjFTZzk0VEZkcVRKem5nT2VjY1JadFlyUkpxai9Yc3ZMN3J6Q0c5aG5nVmJWK2o0MHEvdWZVRVZ6VGtGVjduT1RLWmU0elh5QVE0bFprS0dmTDNTeTR3QTNNTGt2L0xqVkRXWmE5NkxRSmRhZ1FVNFQ0NGtqMnEzaGdsa0RubDBKejRjR3dNejlkQ1hPRzk1cVRNM1VjZDl6ZnVUS094M3VDMlJZYldDcTdQcjMzZ1ltQVNDSW0yelhJQ09UQ1o3Zk1PTGU4Q293aGRIMWRIYnNIMGpveCtJZXpxTnQ4YWUrdGVkdFBqdDR3bWhUSHl0TE12NXc3bW4reWNacmVFS3dGRExyZS9JMWZ4R2UrUm4wbUNiMnFsVnBaaWpyS0dncmswaEd3RzRGOGRvWmFjbWZMSUdlYXlnQnhtQzJpMmlHRDYvNDE0STF0cjB2Nmc4ZWlCa3U2VDhWUHBkTWhEbkhmUWZYU0t3R2dieDlIOC95S3dWUGdpNDJkanpiRi9lUmcwR2NURTlJTWttQUR3OUJFWTN5RXc0cHVGMWJYRFhsVjRQVHpjdndadlBMSTRiRGUrR3B5WXQvcFZ6TDc4S1BxM2g0MVRRSS9kamxid1hEVzF5R0pNeWcxZ1RlMTgrd0Zxei8ydG0xWXY1Tk1TZ2pwTmR1UlozN1J2NFhvSDM5WnBHTk5ML1lTMmp1eE9vdCtDMDF3cTNxb04wWUdXb25CQ3dndmVDOHNjOVhqNkUycnB2WGxORVFoT3hKVU5HY1lTR2s0RnZSZW5wQmZ6UlRBcDZlTDExZHFDenprTFZoQkRxM1pjZXBubGZvMFRWbDJERXhOZFRMTDhrSm5NNHhtUldyQWlWekYyUnFnQmhhMCtwaVViUGhsd2c4VzcwaVhZd3BzbVFlRzEwNVhpam1EaDllVW44b3RzdmpJbDJNQVpUZ2x0bDlDbzRLVnIvM01CYXd4MzI4UU9peGwreE9EWEFiZG9NUVAvY0cxNzBGNWFINjRqZUpSVFQ3Sm9qaEhjV0IrTFRqQVN4aTB6S0pqR1hXNCsvZmVsaEIwZ2syQVVBQ3pjUlpXMVg4b2ZqRURTVEhtUWRWdEx3MDRZMFVSZDdCSUp1WU5ENERCRjAwZ3BWcWJ2cnFwSzNsM3MrWHVOTUNtV2RJMFVJN0RTb3VOT2l2TmF4Y3ppZWExM1RmRDMxZFN3VVpHQU9lZkdTbnFlTE1lSjRORmFkb2dtcDgvZXpBMVRLeHU1ZGF3OVUwd2pHb1o2RTJRdW5ybWsyQXJzNHc0QkExR0FnMUtlSi9qZUh1dWZ2ODdWMUpmQ2JkTzlVQ21MU0hlNjVQMmNuMDN6dE1ycVZ1MG5GbGxiWm50VjB0bXhyaDlQN1NYckRiN1YxYlYxdXR3Tm1rSEFKa2p5Y1lQc0I0K1FJNjB6dkZLMXFSNjZubXVZMHNpYWtXK040ZjRDY3dHNEVaYTZyaG9aS1VvQ29uTmJFWWQ3eEN4cTZ2WTVqNkcxZ2lyZ3J4Y1Zua0U2Z3NRQ2pTemczSG15UHNhUG1KalQ5bnl2dExvMExLcEJwSU5LNU1NbUhMclpwN1M3cDhjK3JiTi9jaEViNTJ4eUpjckI2bFp4Q1BvR0FhSjQxa0t2UVphZE1BZWNtbk9HeTJWNHBodys1NnA2WkdUMVp0NFk1bUF1NXNZUk4vcTZWZ2JqV0MzdUwrRE13ek84dXlTMkJUdVZTNFY1eG9Fb3NLNmVBV0xwcXRCU0Q5OGd5Q3ZjUVJnbU12ZG1vWG5LeXlNYmRESHJVdGFwVjV4M1R4K2t1K3A1bXhXT0dyTWExeG5KVzFhMzlMM0ZBQ0hZRzY3WUtiRkx1bW5GS1NjWEdDVzNYMmNRbVk2L3ZBTEd2YUdlcGR4TG5weDBwZmVVTG42R2NiMnJaMHpkUHdnY1dnb0JXNnNJUEFZSHluTmVPdmIxYUNzTVVLc3A3aVpha3lIQ2ZOenNKWkhHM3VFVmNYWWcvRGVWTUhWRnpxU05QZmx6UjRCU3NoeXdBaGhGaGtxajBhYjhuN1htc1Y0UThkWVBaa015UFZRNFlaQmNMekdBTmtXakFKQ1BmaWZnZHdGUEVvN0RGY3l1b29Fb3QvSmN0Qytla2VGbTVFOVRjZC9oNnY3d0JtMGRaemlkZ2V0MFZvNlZRaGxUSUN2NXJOR3RJcnE2bEd2b0drRlRTU0IrMVBOSlQ3WGFjRFVJM29qK2dOQW40TlRmc2h2VEdQVWpBenorMlpDeDJjSlIzeGxkNGk4eHU3eTlVK3pidkV1RmRVdlV3RHBtamRMWmNoLzdwMFg0amNzVzRpZVZTVU5DeHJscjliZmorNnpVUG1QQWZOYkJTdHRIQ3VGUVhTUTF3dHVoRFhZaEswdEcrbXpmSUlCZXZkcTFLaUlKdU5HdlVtVEJ0ODlXUzJ4TWE1akRodWZwc21RdlJ3dG1WQmNPTU5WRnlpVnJMQWhnRXRSLzJmb29kUGl4bVFzczJUaDlVdEZ3aWFQK3ZnRzBGSnlZY3FwMVplL2N0K1R1U2xDQVd5TFc2dHl3QjM0UEgvcExsbmZ0L3oxV2pxTHluUTdkb3V2TE1PZnlEYW1KQkh0SVpzNFBHU2ZtZURFbDVyR01laU54ZmFqL2IvdzEvQklma3JJajVoZFZFNFhGdG5pSjJPVlBWRjYyQzNLNFdWZUlueUt1blladjMveWtxWjh0V0RQM0svTmhOWnFRcUV2STduVHJVVTEvSmFBMWV4c2RLZDdtODFCY2pIeW8zU3F5T0NUVWZqNXBTQnhLV0h2OHR5aEJmeUpNV1Z3aXd4T0Fjeitmc3FqN1dpS2hnMjBXV05YWFFKSzlsTGtlN0tYcHE4RkNoaFc1SS9PaGVZeXphNFZrTEpTRjA1NmdjTlFCVlY2dmNaMUFNaDdtME5FOCtlNVBON3VDTXVreituTFdhcWgzbkc3U2x4Q0QvZFpmY0tZaGRMc3g4YXZCb1NPOUcyUEtKVVkzalBXVnp5Y0tEVWluRWpmMHNtcDRybmd1MUpkSDBPaGE4QVF1a2RvU0hjVFBiSm5tMFZJVkd3eEkvOE0wL0RmQnkvSXdvTUwxY01SSWlsUFBNR2lmQUNuQ3hTNTZQNHlYcWREYThZRmZMVVloM2cwemF3bXcyY1d4WjhlZmRkVE5FRXp2MGM4Vm9oNEo1RnJaT1Jkdml0NVZYZ0J6SzRJa1BpRlg2Vjl1bnBPMFB3aEFsL2JCbENkL01QN3hwRWVnODhzOC9NOW4zWmhYeFZxaUgvbGNEdEFaSnR1S0V2enlaMmhwVi9mT2dkN3cyRHJzSUFnVDJvcGR2ZDB1dVk3ekpLYkUyMTA0YWNrQ1RvL3dHbW1KWkdPOGR2R0prNWN1amplRW10aExxT1hwdWNhRE9mVXZBWEcwME95VVkrRnZWVnNVa0w4WTdvUmtHK2ticXFhOFRkQkZDa3BkSTl5WTN3WkkvQ3ludER1MmpYUU5sQTJDWmlnckFhMVpQWTFqZTlhYUtMZ2lMdGZjdXZrYTU5bVI2SHlMOGhOY1BhYlJhVENYR3BQZDhDL0NjYzlVRDJCWDhjMHFyRGRDZEQ4N1JCWFRrRmplejRRM25BYVBUQjZXRkF2dDNIc20vRjBJU2krV0pZQU5pSXFvbEd4OW1qRjlKQWpxVm9rMGh5WVUvcGZPblkxU1FMdy9WUGlWS2w3cWlTUk9LWXZESEllbDdvMndRczlqTys2N2cyc2FyYkxUUDlUa2NzRUFsSGxYNU13TGZES2MyY1huZjVjY0c3TTZ6SWJHZk1uTWxPWjJ4Uk5uYy91WnpXYlFHb1B4KzdwQ0oySG5oV09mYTVKaDhvMG9HTFdyM3lXK2tFTnVEM1NiTDhla0hnM3lWY0wveFQ3K3RLcmh6NHk1VnJTQzdOdWNVL3lWeUk3VzhHQTBUdEYxYi9WUnNtYjc2Q1dlTFBNYi9WQi9kYTFsaVJTOThnbFlIdFdwZ1B0QldsdWZNTzhjd2d4ZW1YaThWZFZzeHJTNnM1VUU4T293SVpnSUNwYW9HT01KamttVllrMEFsMFRSd2RrVmxsc2JkVnFkR1RQd2xOUXNZczdSaHhQOHVOdHlzZUQwTE1pUU9xU01IZUhnN2g0VlphaWpGalJXQUJNTVZPYldGNTRGa1JWMlBrUzczNUhXTlJaZmZEclNXNEVzWmpMN3FBVHhFanpTOG5XR1YzUGhJYjdxYkpHT3I1WE56d1Z3QU5uK3Fhc1krdHloNWh5WUpBZ1VQeFA1ajc3c2lXeUFRRzNSd3NuN0Zvd0FpUHR5VVBkWENUUVR6WHIydHU2REtnYkJvWURzNXlObXFrMW1qbnY5ZFFXOTVnNmp0ZHg0QmZjTEx0YTFsTDlJOVAxa1pTNXJvbTgvbExTSFBxTVp2aWJCRi9SWWsxa3dFYlE1WkZBcUxFN0lwVmx2TDVYR3FkL216ZnFOc01DMlZqWmh6cjIwYWNIZ1hYd2ZJN3ZYa1B4YzJvbjhSTXRmSkVCenN0WVNpclFxOVlrK253T0VjK0JPTFJVOTJlYzJCdDNyZUxzNUNlenJiOXFpbHdjRk5YOE1CRit0d1V4b2hVQkxrY3VIWnlLWnFqNkJMeVJzeXBBVXBTQ1VYRXAvRVE2WlVJdDNBOXRld00xbTc1K0NmSUZ6WVI5VDZDMnc3a3BzcVg2ZWJuNThtS2UvVDF4SCtQcE5ERklnRXZzS05UcDJLL21BZFMxTmk0OExYWXd5cC9yREZhMUFtYTBrOTFIRkk4Q3JWVjVOVURzQW1DR3k1cGpoTWpZNGRZdGdwa3VMMXhHRjVjZnNSR1BaM2psakkyTUNrTHF4QU9XWjU5dm8yRmhJK0RINXRDT1I0NmhJeGF3ZmdIamROTXJTMml6aTN2Y2x1WEN5dmR0QUpHVFc1SGVKc09BUHNrVk5yd3UxeHgyM0VnOHJFeHFqZWRzUHR1VzdTRFk4bG1sT3RBQVdpSDUvT1RSdG9TMS9vM3BTc09VQW1rc3VZbnUwL3E4TGtZWXdIWHBIeXdYQXJCU3lqMmNnRTRkNG5Damswc2NhNzZkOUxzekJMZ01jZHh1cHZTV3ZYVm5mL3RvcklqR3Vpb1VmL0gxMFFoaE8wakVKdUJvc05MSmNVOFMzdVUzUmNYN3BTS3BFR05HVkJlV21zOS9lazF5Y3VXVmlpbDdYN1p6emJMWnk3M3pUSzJkdi9xc0s1eWgrSU9zc29Zb1ZzTnhrZTdPRmtQbWRSdXhWNDFFbUM2OGZjYStNaDZZQzZxMjExOTZ3c2J3dFJ5Z24xTXRtK2VvTFEvUlRzUFpPeE5zZjljV2pBL3B2THhsdXd5V05QUFF3UnBRSHowanZvelpoNzhZZDZ3QzNRNEx5ZC8zMDV3Ymtpb1FzUEVQSUtvVy9FQ1VuV0VIMkNPQ094YzRWWThpZ1FkN2NMMUlySHA3OC9uSDMxTjFDeG5BOTV0TmN0WTB5N2NWdFVXMW1JcW1TV09iNC94KzBhcUNuREVaZVZ0TWN4RzBHbGczeWZrejd5aFkvemtwUnZzVXc2cVNkSmdXdTNmV1c2aUpoQmNmSkFXd1FJY29RVXFKTHZzQUlacTRkUWZYWExqUmhTRm9IR1BTek9CWFljVFpmTGxNU3RvT2NXbWdnVjhRNVJ0UFNVdXdPNzdiREZTcTFqNm5OOWl1OEE1N2RjemdOS254NTRRWlhzUFByTkI5RzFaT25WZ1RmRzZTU0pVMXorU1VwQnFvWTFFL1h6WFQ0Y3V4TnB5eVNvWERlMzFmZWFCZTdKRndaa1dHcmcycytOREdMSW9ESjI1UDN6d1puYkpIWERxSmdMNVRsRXovRlhkRUhxK014SWdYa2tLd1dnQTBEK3RzTmJBdUlDdDRFdTN5R0NlWHZIbnF4K3FFR2dsVUtoMEQ2VTdpdnFNYXF4RW1zSjIyYkl3TGY3cEwwVEd0aWQwd2JtV21vamdQRWtVNFFUdnA2a2V1bmF2RldDVnNhMVpHakg2K1J6dDRIbVQ1NUJCdFFCYzRURy9scHpNUTIrdDVsUHA2WFpBMnhJa1JHVWV0L3UycVk2RWtOS2RxVVZZS1pZVVIxSHVPUkord214Y2taK1BvS2ZKcUNZMS9ON0xhdDVJSmhPWFdvTTJZWGVTbGFwekVrNUFXRXZnTjRsS1FvdWZqV0N0eVQrNmtVYkpXcGttUCtmNGw5VGo4NGd4NGV5N3lHMVR0SXNMd3hjVTVwcTdYdGJjQTNqcVB0K2dPaFA5MDlEaU8rbTcwSTZ4Q29wK0VRY0ZLWHBEdCs0bUg4UjZNZWMyN240NDR4Y0YyYlYxTUlKWUNKWVZDNThiOTIyUnFsU1RzM1Jsb3Z1NUxsTU5TMmxrdmZENktPOXp1b1R2NnBKQ2RtdG4rR0F4elJjUHhDTmhIL3hzYWNlK3hPY2tTSHpoS01ycXJMbytzUEtxL1I0Q1RlaEd6UlVVMHVCTjZBeFEvVVdqQ3liMzZwcUN6aVVyZTU1KzRVZkRhQjdiZUoxN0UzOTlGT25UTVRzNnlqOUorbDZZT0d3VXQwRHd4MjNKbnJ2T3V5WllQK0tjQ2tta3VkMnpXZFlzRGFNUXlZUFNHbm94NEhvQ3JseXlndTVyUW1TcWRXRG1UTHd0Z1Z2a21pQ2tZMm5SZjFjZGxYcnVxSXRPV04rdHA4T2c4aHF0NU1xT0t0VkJ3UjR1RXFLcVRwZm80WkFFREE4eXNmR01WbnkwWWtOVUEwMnpHRkZNMWV0ZCs1dmVqUVhodmhBbzhQaHBVUGFjWHZJSFBOTTArRTkxWTlUbXJHZkphc1FyNnpseHc1bDJLaWkzenpRa1dtRyt4SE14Y3dVSFZrRWJRU0JQWlpaMHJHdDJ2M25WOGNteUpEZ0M4V0lOQjNoNFFHcmlPNi8xNC9aclNHUTJCdVpidDJKTVNMZWJlS0FERHRYcVFNZUxWOS9tem5oUHZPZXAxWnRYaVRoR01oLzhReDA4NlNpdVByT1NybFpKalMzNG02MFBMU2VINnJDYWwxTFMzNzRWUWVmZjZrZ1FqaktBWFREM2tBRDYyZi9nMGU0YXZSZjlma09GbUtqT3FpL0Z3QnlNNXdpZVhjaWwxL3c1S0lLUHNWZHFCc1FJNHdLams2ck4zUUFUUk9VNG9wNFcrTVJnMVkxcnZuZGhwZWFleGtXWkF0eXduM0t0b0ZlanNYdzR0dHF3djc2Z1pieVpQWDhFc1V4WXNuYmQ0UXY3SVVuUUlPekJKTk5aVlhENm1JZ1UxeFZkUGU5ZEg4dUs5dndPRnRsTElXSXlOcFdZQVVJSThRNnE2TXhGQ0hTdFcwNGlUQXJwb1dZc05KVUpnQVF0UnF0bjJUdkIzSE0zamNMTTdJMDk4Q1lNenB1SWFsd1JlemRIWUw0ZXBtV0RPVkdzU1FzNitKemhCemJ2YjVmY3RncnhFRlQ0VExLbE0wb3A5YXVVd0F4czgvcVFxSE41Vmk4K2o3YnhNUGs5dVB0b3FJY2c4L3Q4dk1JaG1QbVlmRlVmeVpOOHVPSWMrcDJrdE9Ib0t5T3RjY1VXRGtmbGI4NWZPa2NKcmZIblhKT0hPb0E0eHRnaVZNRG5IT0JOQ0o5bG4wVlZFTWFhY2xmZTcvQXhUWHdTSDBzQk45K2hvdFJYeU9IVWlUbWJpTSs3RGhxNkNOd3h3a3gvY1hUODZKOWZFU0Zxa0xXemlvRHp5VnE1OWsxcXZCamVGS1JQU3BJRDdFQm1rYjczRHBZSWhXUW5rdEpjc2pUZy9tYWs1Y1RSSXc1WHVTMFh6NmdSZXBBWDQ1ckNzM2NaUUQ0THZ2T0hNNkl0UllqU00zMDNyWSs5Yy9UOU0zYXNaeGl4dVZPdWJBS04wM1R4ZEQrcVNEOHQ5ajNLMWxocldoUGgzL3VNRkNxekRDZ0RsOUFNRWRuTS80alRZQlREWFp5UFpNemtpcXN3OG9PN05GOWZLR2JuN2FqZTNKcitmc1lZeW5YSElkc0JkV0NBK3k4RENxY3NnUktjaWZGSXg4OVhodms2Y0xJNWY5UzdOOFVkU2VkSXZuMFhMUksrNjc5T0ZQQzZmbzhzMVpNS1dreVo0em5jdWFSS0V1dEtOc0lEMWszS0xCRncvczdqZklwV2VBQ3FuWkFnZVBUS0dDMW5RZzN6WEtXZTZEV0hkWTlBTUM1dkRZSm9xR0Z2SHBBRTJYUVRMMVloVndnbXVEVHhzNFkwS1dkYSsxV24vT2tORFhoQXdxS282NDhHa2lXRG5nYkpBRU40NlEybHYyZXdQclhMRlRtazlLbFNVQXNKMDZ0MkN2WlFzcnl3dFRRUkZ5QXVYeTNSOG83R2UraVRJTERNNkFOV1BRVUtTWEtZalVKZ0RNbnBuVTd6NnpteXRoL2lIckIvbzZ2T0VVcmxuWkNNc01abXF2VE1GVUFrNmdIM3ZtdlFjUVlsR3lhYld4bGhLbWF1QkdtcG5ZNDJaL3lMTlZLTS90bys4emd5WjNMZDlTU1d1ZW5yeXIreWJ2dGUxdlBsK1l1QmxKMGZrdEtkNTJTNVF2bXhxK0FIRmVUdnBKTTlFS2ZMbkVxUzFEZlU4MFl0cnZPNk5RcS82aHBtNXhUTVcwUW9NRTJKaE5EdmhKa0dHMHdvTDB2czdYOVFKemNlWUxnWmtxRy8xN1NmWHR4VGkxQXVmME5hNGc5dWx6eFNMZGZqdTJPcTdKalMrWGVCWHpTSEtUbGJ6NzdJcEV0UVYwTHA3Z0s3NW02NEVYdUxTbW41M2dXOTNlSngxZm15S0tjdm5nU2NXMXczdytld2hodmJSR2NiNi9SWE50RkFLS0NoVlNrRE4vR1lrQjBObFljYzFYRkR1MTRXVGE4RUppRmVCeVcxV0JhQ3N1RjR5UlZ3RmUybGdYR2NLRmR6RnBINDExVEdyNzZTbVYxSUVBeENNK2lSK1QrMUo2UGFwbXloWDJDVldwaVhFb2FDSENhNnpIaUhQUEFnY1oyUmFOaFZEcFA4Y1hReUhUUHRaNGNEOUVtanJFY1RyRUxyNkttK1ZjYjRoOTQvOWhBNmJMT1k3N1FxNDRSZzJHL3g0WGprcWxsT3lXSG1raytwR2R2ZmljczkxSE1yU0pIQWRrd0ZLZjBYZVFLREJxcFQ2YkduTlZ5RFRmK0NUY2Z5VGNrTjMzRExxcUQ0dU5SczFJV0dUUllxSkxjbjIrMkJrVUhiQ3pueHNtYUNVQVA2MVdvenFyOWs2VDBPdVhFMUZuVUtwS2JPSHBjWTUxZm52Ty96OGdUZ0FWSVpjZXBhS2xKaFl1dGp1NmhrbVA2TEM0a09uSmxvTFlUKytzenFoYVF1Sk1rcHhkcldOcnFzaSswTFQ4bXlhKzRmTXM3N1c3alY2RzEzbEY1aXlzL1VIQTlQTllScS9CMFJBL2lDVU5MNTlZQkxINjhoOXVjSzlJaWlVQkkxZmdzTGJVaTQxUmRmYU9jZnppYWZNRk5FVjBTNE9taXVoZ2RnZjVJU2txK1JEbFRqVURDQ0wyc2V1N1BHcWVYNzQyTjc5NHpqeHBaK1poR1JxUmhvYXJPSWRXMDFTbmR1QVZINzVGcUdXVXBXWEFwa2tQcXNLeXA0Ymh2MUtQWGE5djJxSjdIaHFiRTdCM3NpS0EvVjhKMkRnQUpsZXVmNDhxZDRsTjYrRnJBME5qOGVNdHJKTG81REJYOUVxYVhCTWNQODRBL0xzTkZ6eU9pb0RWN3FTMk5KWlUwekhIakVQZWFOSVp3U3hSdDMyclNCbGNtM1pIdjhHWGdZNUZSVFFua1ppcWd3enI0WUxlQmFEeTNQbHZlR1RnT1gzMUN5OVJYVmZlSEdYN21HTTJxeHBhcGFBN3Q4SXB2NVZMMFJTdThuNUJmQ29ESDlDdUZad2twQnpoaHVMQ2NZUGpCeVdOWUc3bHJUV1cyVmlBemxwcVFMRjFkaHUyUnN4MFFmL2gvZHVaNVZMQ2Qxb2dhM0dNM0ZIRUNiYjIrT3NzYmw5V21aZGJvdTROV2orbG5KRHNHNkg0MGNtdjZxUk56bTI3azVQVElWZ2kxU1VZTWdBbE5CNFViR1FybEJnb0Z1enREV1lYcWNWVVQ1Q3puY0RQcmF0OE1Dd0lsMk1Ec0ZERmJsZzA5NHo0U1VRTXppdVJYMGgwOHpIcmp2TGdmbkd6NHJQTUREYmlUekU2Q3dXQTJLeGEzZEZyMTRXNXNjOWo1OW5UNUdhWUZIeVIzMWtNQlV5TVBCVldhV0NuWEVlZytLOThQM3hiSmpTcVNzM1lsbFJSaFVmOEhmMVVvNTVoQ3E3cmJURWI0ZERzRmI4Sy9pRmFpdXRPclZMZDErOU96R0xvNm4wN1l0NTFPcmo1ZUFldEVGOEtqZGlTRThySk9HRkh0TDgvUEhxeXdRNUtNR0RwRmJvMjNXUDY2WkVISXdabmc0c2F5ME1NelRmcm1ma09IYkRsb1JhVHRZdGdxankxNG4yNGtTaXhYZmtHd2VSWDJiWTV4VFZPWUw0VlV3c05GanhZTVRvZEcvdGdIMU9UQjFTd2szRFNYam9weHRmV0dqei8xZkF2WW9DOU10ZWZqZC9sTDVsdXNVaHJ2MS9WbGpoWTdpMlFPdzdZdVhDd1ExRms1cW4xNERZcG8xYjFUa0l2STBsTGNiVzZKV00rRkxFUGtyaGZVZjlxRkhkS3JtdWRCMFBZNGVpUFYrMk5ka0x1dDdNciswMlBvcVB3SUdTQVpncFlpZXBVWHhzdkhSU0RkZEdveW5hUDFhR2JUZSs3MWt0RTN3d2xkREZ5SWtXQlpFQldCUmhMTzJ4THJTNDZmZG4xTzFBdWd3dGlJMXdGTG1ibVlTb3VxZWkreUo3bmFxREtnNnlFMFpxWEppYUpaaDg0S1ZqZ21yYUE5SERzem9UQndiNGloNFBXeTVyV0o3eUl3a3UvSHJxYTR0cG5BWjVscUdrMW5FSWtkQXJGVGk3TFJnTC9GK2M1VVp4dS9ldm5uNFVSdGtZY2tsVmRaM2ZMS1owekVnVi94SzFCajhYcjB5a1dwdkhOcC9PWHk5RnV3ZHhtb2t4c3Y5ZTkwNHZFeWtQUU1FT0R6T2J0a2tETGx3Y2ZiU0VlcXFmb1crbUZVSElhdG5STFVBSkQvc0NCSTN2ZithWXY1WGpsVWsvUG5qN0ZhY1FSNUNMZFlsc1loL1YyVjUwejBSV3d1SW9nakY4ekxVWk5EOUpRUThXSmtodXpQY005bWEvTUtiUzZvTll2WDBzU0ZIL0llYnN1a1MyaGVaSE14SGlDNkZ0UmlRUy9tYURVUkNMMGpMQjc5WXF4dm5NTGYzcHFIeXpVa3o0Sll6blhOb0w3ZjVRdkFvYjJVbVY3ZTlyMWFmNlgyMndMNmFINkJGT3ZOUFpIUWFBdWVVYzdSdDlWeEIyalcwakI5TmZQakdqR3owSEFCdklpc0t0cThNSllmQWNsSUJLTjVpeDFINGJibGR4NnFodC9Dc2hJdUlGWEZsWnRxZnMwOHduVWRkMzVZbHNoQ3ZUNktBcVRzWEpncEkwdVQ1azFkY0J4a0Z6TWlhbGJVWWFJU28yZzVEWTVPN2tkTUpkWXVQaXVtSzRpR2VsMUMxU0dxeFRtaVNIdGh5bjdJc0o1YVZOMjdZNE44SkRiN0NDVCtVQ0c2RW5iWmswVXh6aWhwaVZiV25KbU9mMnNMVGxIUTM5VWVyekhrKzFheDgyUXYwUUlOKzIza2JxSVdXWXY4SmpGRkprcndaT3IwWGhFWENUM3I2RnNDWUhVOTFwdVZIbkpCNFhBUXZPZlljdU4weXUzREpBODRJUDRqRFh2MnV6RjY3WVF1aHVFYUlvVlYrRWtCaHRHazVzZlZWN0pZNGdQWE8zSkY5c3JSMFdtVTdGMkxoTjQyVG5sRkRkVGNrR29YSlN4RXV2SEdKRkN5QmkzK1YxYWVBQmhQRS9Wbzc2VVpsZ2lhaUd5ampQSTcyM0xYWlc2QkU1NmcvcUFlZ3NESFM2RmlRQjdrdXRVM0FpNVlISElTV0I5QlBiUUUwYXNVZEd3QkJ0MDlXbS9KZEY2dnp6dTJwUlpPbXVIRGczYUZXQXR4TThUN1pLaWlpc1NSdlpSYlR4T0N4TmYwZTdHUEpRU2pQT0RtU3BzYmhSbE5IdjQzNEVHcUc0M1VGSWpabExVUi92TjIrbUk5RVF0K0NRaTgvQ2xBMnZrdzZjUzJPc3FxTlJ5ejB4OHJCOGdrY3ZuOTg4WGIzaENUVGZwSmI5bGFTVzJNby9JOHJTOWJaVTdOa2NZL1htaWkzcFUyb0xuUFdYWmhKa25CMzR0cWtSUS9QeFdTVzdXU21hQWVKN0o2VnBxbmxhdWpyUlZSemRLOXcyL1ZuZGo2M3huZlhFZWIyZ3Nwb3lHWVZaV2wzTTh2OUVCS2ZZUGRuY3BNTlUvd1BMc25yUzE1VWNlRGZ2TzU1bFI4NmNHVUQxZVRhSEZCSXhPYmlNeWU2dmtqd3NISXl6bVovZlBxNldwT2pZZk5Ec0VDeWFsMTk2dWxQUVM5RXMwSmw3b25LSDZRdm1maUhpWkNWZDl5b0xHa3JiODE5SnIzVEhzOUV5UDZhdTZYbXZlRm10SkgvUEwxM0hwNURkTlgwdFJ6aTNZTXJmVzJ2TUVRYnBhYm1WUVdvRkdBeUYxZWdGMFJrRitqNGtzdWNGL0dHQ0JNb2NVTm5ldVdNY1ViYytGWnM3Rm9OUXN4VzNYVDEyMUJoOURtMkNwdHBSU1lmWlF4WWN4MFJIREx2VEhiMWZCU2NVZE03TGJLU0ZUMkpiZVMzZGtPNlBnQ1B4MEJ4RG1EcXZmZTVNbTVjKzlqV2pZOXpSWS8xOW1OUkY2SmRDSFlKd2lNL2UwU1NoZCtQdDhYWVRqZXhRSGVrd1hzcXhKaENxdG9Fand4cWVLRFN0RHAvbjI3VThVeEErQkhZeGRFejE2bEloVXZCeHNYU0JDT0lLLzJqaVFOdHFQcjZTaW4yWitramh1OGo2aW9UaUNGOVdhaWVxMk9WUWM1cHlMRWovRUFCZDdrQWRJWFZzRVdybVhEeEJNOVZTaEYrZ2JiNGh0Nm1lVUJ5d2I3STRMQzNOSFQ0MXZKb1VKRElaSUxRMFdBTTJTaVJ5WDZId3NzZDc2U1V3c0dIMmgzbzdhMUhEWk4xdE1pb2NzTmRtYnVHK1NocUVLWkRYNGcxMzRicEpUYUlaY0l4c1FjQnlvbGdNc3k3TzcwWmZZQU1RQkpicGU2aEJJOHJFcjJLOXp0bm1SeDBVVUNCWmdKdmFVSXgzWFdJL0pNRWlWdXF2UUNlSU5EeFFtN1B5SVQzZzZ6SnJST3ljVWlzUjFxRXgyeVpFNktmNENOaWpRZHNHVis1VjZRclRVWTRLNlNIMmc5VDdqTTlYUW5qU1Z6VDRFdFB4M292N1UvZmg0allOend1VU5zTHBBRnBmMVZlT2lEUTlPQTM1VWh3T0JPdGFtVFpuZHAxWWZXaERzMmxoRk1NUmVXZGU3UFZrU2w4dk1vcnNQcDBOYTJhdEVielV1a0d4bUlVd0FGU0pVUTVFYy9na1pHUG9FQTByV2RMS1NRb0p3OXBneFowd1MrU3AxQ21wOUkzbzU5aWJ3Yzl5amJueGVJenFhV0REU0x4TU9UU2ltbThaR25vcUpiWk80U241ZzZJVEwrbVNidlE4NkxkMUZkZWVvZlhYa29tNlNGcEEycmd1WDdRQVlXNzdITU1WTWtGMGZ0L1hKRVdqNmk1NWw2MDBTNGpjOXdsZmlaTkFCU014NkhtbjdsSU5tZDBvNDhXUWNBcFkxRmNLU21tQ2FHZ3RxN0toRlpSYkJGN1MzVzNsQzRTcEF5blVqUFBnaFY1U0ZjUW9KTGk0NllMRnlud01RckpNVGNmNEVSWFEvMFVTalJ5ZDNQR3RmYzdGNFI1azM0dGxsMUlmM1BNeFA0Yy9zTXN5SVFHZkduWmtOTFJ3ZjBxQzdsV0t0SnpmNzFlWWJ5dHBSaUpaK1BVL1pEdG1ETlZQTy9qeEZEbDZXVm9ZMC9ad2I2NnMwQzF5RHBzODA3dGR4dnZYYnZuYmhxa3VBZkFOa0c4K2RmeHdBNitYV2VaSWZzODdIbHJkM0MycktJN05lRTErQWZldkRQVVhBMERJQjBuZktwWER5WkM3YThSUVNFcUxqZjhvQ3FQUzJpalhBVHEzaUI5OUNGanhVcCs1cUh0ZjJnTUdCanFiN2pLQ1hCT2VVY2N6TlIrUzBPdXVpU3NaYWowS1VUZ2dGdjdLZFRoRUxyWHRZZldGV2lwNTJ6Ly9GazU3dXUrOVRITDBKWmRReEx0alZpaXZESi9hYUIvNnZKZTV5Qzc0NUZoc2xJS0V5MEVBUjdHL2Q2N2F0bU5KWUlHRGVzSXZhNFhFellpazhBL2MyVGVFbTRwQTBsdUdPelpuTjFaL0pzU0x5SDZvYlZobkdjTmVtMUFUVlgwd0V6SytDektlcHlPZkNHcFdDV0FIWkRuRkh3MzZObUFnZGFwYncybTVscFR2MmQ4SWpPVDZYczVNZk5LK3pyajR5NG03TWk5ditiTVo0NUJIRFJubHNKaHRjUlZFVEZRbUhFRmhMdlhOTllhTWs0anZITGowUFNDWUNVTVZpWkEweUJMS2hnVEhxa3F3N2JOWi9DdHErWjlGMDBGbUlacjBmTk5pa1BiSURrZUNEYVRTL2JETXFLWVFnUG9uUWczQm9lSFpyNHNGamZTN1VHSUN0cXVhd3ArMTg0US8rNEJKWkJpTSttVFkwdkNlbFYrOXdrY1NJTnNCMUdDNmlXUWM2Wm5Ra0o4SWlIZDY3UDcvZGY0bVVmeXkvWnNyS1ZSNThlNjZGandmUFViVWRiWjFJaWVsUnhpZGRFYjFHazdhcXVMZEJLNzV0RTRJSzczaWZtbXRsc3RxUElKcmZtcnVvSk5mRndqS2dhOFRqd2liT1V3cjJIUk5uVlZ2S0dpb3Rldnhhc3JZU0QwSVM0NExzWThWK0JCckNYZDM2UkpwQzNGZkpEWjVPNE5Bd0k3U2NtQ0M0ejlJck0vZWN0RTBHdkRsK08vRW1OYU4yOWF1bVJZdXdZQVF3VlFPc1AzemNPMFFpVGFadFROUUJHdjRYQUNaREhMZFJibnZRb0RCdHpOVmhsdlBuSWZ3ek5UMGFXbmJ5Mi9uQ2d0ODZMeGMxR3VaUVZWa2pyWFFKdm4vV3lvTGdjd3hWeXRGNVovSWtjcnEwbXdzRUMvTGxINFpsTlBqVWpuaFMwL0xnNnZzRW4xbWg5azRENnRlN0lFVnY4eVJONWF4bSs3SlJLK1BGRDZrR1prWFdBcEhYN0tFb0t4cHlGOGY0czZxajhnT08raUhpcEExTU9aL2NYblk1VEJCYTYxL09rQXlXNTJYQXd4Tml3ODJub2twVWFGTDlEd241T2JBZW1SQzM5NWVmZlh6NVBjeGdySlVsL29rbE45ZlhIdEd6RFVMRVJta3NhZXNnWW9yazZCbkVpNHlCMW5GTXFGeDlBVnQ3dHhvbnVLNFN1NEVnYTJaZkEvOVZvY2JLL0JLTlJYRjAzdzlXaVpheFJtZ3pXbE5xSWhLNXh6QVcxWFdLdXpzUXVucDYvVitCUzZRQ3pJMjlGN3Y2SDdzWFJyVy9PK2dpcmlHUGdSK01OQldDZFNSVThuUFIzK1hFdjR3dENEVjBmVEdweHVIWjF0N2hKelNKSWdiblNQTzhXWmx6YzlsMXBpRnl2UlI1SFpMek5GOXdzWXRENDJucDF2SlNnakh3U3hTZy9VK1BxR21qSlh3cFM1Y2dGUE5PT253YTl2OUhxbU01V3RwUWphSnVVYkZ3dmVQSnB2WFRtQjIrMW81aWpPd0djLzhWSko5cjZyRVpoNHJzRkxpaGxNY04zOTZuTXphcEZib3padnUvektQK0VzMlVhcmNRVG1EbjNEM2FTS01HWGVXcTBkZU9OMUoxa1d0MWFXRis0R3VFbFduWHV4Y3NOOWI1QmhaWkV0ekVDakVWZ0ZMdm9Hc1hqUnNpTXNxNlBGZVJVY0Y4aWRTOHU5WWRaUnJMSnhLaWRUV21SUVk4NWgxZXNzdS9UYmVxTUQ3anpLL2tzTHNNS3JRRXRBeWthNVB4YlR3RllBb1o1RWRXZVdEN25tVUFveG92VFlweWRYYmZxUWJGM0ExdnRCYkkvelY1VU4vdHRtTjM4dlBIb3ZkdlEwYjl5NzJEWDRiS3VMMHN2TllPbXhraW1mcGdIeEJlRGV6bC84aFMvZEZkcVN1cUdNTGhEYVE5T29Ob3djdWVBVGd2Q0lBRjlRbkNTbWE0UVFEWkRiY2U5TGdMVE40ZW1USmlKOGtEQ3hxQjZrM3k5NHhvUGxmSlJ6SFNCWitVeFhkT3lkbUdZZGV6RytXZGkvUlBVdTJibEN2TUp6ZUs3WFJCcW9JbGVQTmcxeGFkTDJGSWlHSnp4anFJdmtKdGlFbVpwU2tPdWtPZkF2ZUM0WTZQQ0VacmFpSE1WL1RSZ1JsRGMycm5UenZtWEJabC9LZ0NBNFhYN2xBS3NVWVI4bVc4UzNScFB5V3RFSU1QRGZNWjlXU2dkZFA3RUFGME93YUdjZ2ZvSVJ1bEU0OHdKdlhSZkY0Y0dwUHhXcS9hQ25HdmxzeTAzMUpLQTdYb2IyMDNLMmFlVWlrbXFOZUo4QThOUjdhTEtnc2VkSENZQm5CUEFFR0IwQUN1TGtxKzdRUUNvNER0RkRlNVJBeVdoOUcyeW44eEZ5dzk1RXBDcDR6RmMvbStlYUE5QkU3OGVYbzB2UTlhZ0hSbjN0OE1iRmZCUVpXT1RNNWpJdmw2bUZIUHIydEQ3c0Q5OSttTjhoS2NKVGViTlF3eTYvYWRMcnRCREswV01aV2ZZdUp2SmFDOWRLNmRGdWVMV2pjTU1FTWYyV1o1OHZqRU5xRFNLc01wYWVnYWNSVGQ4dHNXc001T1hLUkZIR3NwWXdWTjlKaEpIOFV1bzkrODVGeEZDV01oVGdaTG9KaG8yU2ZZczhlQ3ovemNWRnBKNFNDdUlGZXh2NlBlT29MVjIrdHh6bjNYWDgyR3hzZmovODdMbU9iZmNZOVFKa0tXcisxS3dBZ3diTHMxTmVLNFk0eEVIb3BXS2wrT0VOUFB3czBpdWdwSmNSaHVjZ2pzV25WV2tYQUJhNWZxUHFtT0xMNi9sZVpVSHRNNmx6SGk1TnI2d01pU292S3pkS3l0cFNnWTVHdmFLeDR6UnpUMStqdnZ6SVBiZCtMVW84WUdDR0dHUGhqYXJFdkZONU9GK2taSHEvd2Q5MHl1Z3hOdmdMNFVDK29XdjhOQVRrZW9qem96czVMRHZFWWNuZlhlZ2JmVzNCRUt3NjJmUHhjcGVRZ1MrY3ZLMDdmQ3hDanh2a3VoRXB2SGVkZnFOZ3RpR1hnTFVhandhUmhvbkh2RDdMbDF0TVlqUUdPdGcwdzQ2blJHbVJhRE15bFNTRmdsQ2VZUytZTkV1ejNac0x2dlRNczVNdHNvaFJvNGlscE9GSkh2cTlkY2pYbXZ3c2RPek5ZUlJJVndJcUNVN1AwRnNyaVp0SzF2c1YySWRhSmpNNnRheDFkc0ZUenY1cG5HWk1WNnpLSTg1WVR3K1lYOGVMRWxFSnhRM0k5YVplTmxqdGc0dmpJcmFYOWdEa3RKTXVnY1dkZUl0RXQ3alNRMFl2YUswQVBGSGZvbVhhNWlJRUQvRFpUKzluMzR3RGhTS3J2eUhERFhiVmVLTkdVcEdUb1EyTk1qTmxnZ3BjcDExRWsxWXg2Qzk2MTdyODcvcEpadG5SZzBTTmZZeG9LZU1JWjQxa0pPakFxOXBvWEc5am5WdEJveGY5LzRYSkx0VVR2TEhQdnhHT3Zwc0dkdVZuMEFNQWdVMXg2aTlmWHN1em9CWjRleEozcFd3MktmWU4zcVpqYk80M1ljN1RnN1Nvalh1TWJrYjRabkJIdFZVNjU5YnZDdFVqZ0xPRkFZbWtHTExidnVBZzBJNWo1ZjdyRU1odnZ4cWpkRkhZeUtwdHk5djFyeXpIbklLRjVsUmJsTTRkNjA5RTNNUWJ5Q2tiK2ZiWkxvN3pxYU5lWVBGWW9PT3N1dGhvaEJETEFwRUI5ZmJhZGQxNWgrK0hER2c3aVE5RlFFMGlmRlYxZVNQNUV6TUpVTWlzdndnR3ZMOTVuZUdiTDdxWDd3Uk94VzVtM3djSzNwdE5OZGZHZmpUTHpUN21JQ3RYcHFBMjF5eTAwcm10Yjh3blgvUWhTYk1BeEEra3VqOTFveHNpdU5rV0l1OFJscHk0bDZCSjFYVGlSdndHdms4aUZpRHIxd1l4MDVTQTlES3MzeXB3OXprYi9jOURVUnFvcGN1dTZUMmNTYTVqbEcxQW9iNFQwMi9XQm5uYWRML0JVc2hOTWNBZHhxNGhiWktRRXNEaDV0a3hURldUWkZKYnpYazVkZi85U05lOWsvVkhPQWFEM2E1UmFqcjJ4bkpHUmtoZnBEZW1pRnZ5SDJmRHJPT3J6eUU3T3YzUTZobTRJS3VKcHdVckxuMVF3cWQ3Q0FSdk1ySnA5QldMZHZhSGYvVkN5OTZxUlNhUTkxL3dUQ1ZzNkR5bFpJUXN1NkI0U2RwbGMyTjVUc3NxRGtGa1hONVFkUWZiZTN6R1Z1MnR1Q0h1T1FXeHhhMVpxNTNnWWI5VDJ0ck8zdWFuZEhmUE5oYlN0VlVjUlRwQnNTcXpnTGRrdjJEZUVyTjhBQzRiK1VDSkJmQVB0Sk5GV2M1YXNQMVk3NVZjVXBqcTZoMVlFc0ZhSHZZZGFoQ2Vnd1VYS05VR1NUUmRPb2NhRVhwdDA0b2xJZnRYVG0rYjFsRHU3SENrOWU1clhqVHY0LzA1MWJ5V3NISkxoOE9NcWxoL0QyZzVxUWxLemJIc0wrRmJhUElsczVlLzJLb2pFY1lNb1pDKzA1eHN0cUtjd0hLYlRQOWN4NjJHZTN1VURaT3o2Q0tUYmM0RWJqVU10bkRCUnIvUXVIM3pyb3JWWUdVckN3WnhsMnlDdFE1enpTOEpROTNZUkZCT0FpOXZTaHJpVGJQODlRUS9jRUd2QmtGL1h3ZkNuNitDNnRnRzdWTzJIQmphaDZaVEJaTSs1L2RuUTk1QUZ2NEs2cHN5OVFwMFgwQkF1amkvNjV4bGdWWEZ4QVFxUlNaNjdONlBBVmdpdUJDU2RxamlwVnpRaTVVcmUyZnpEcklMQlYvNDhFOTYvaFNZOWp2UVQxdmxZY0ZvUkQxTUJSRmJJRm55M1M2S3Fic3kyVFZTb29jMEZtT1lOSkU5SzEzNmwxdUYzQnhoamFJOS9paUF0NFdEMWlFZHhDa1Z6cEdlYVp0UmNLNFhmcEdCYldhNkNKRHYxVWp1TmhUTy9TWTlSd25FTTVaK0JyZy8xeVRaOHpMN09Oc1dheGEvbUVpVC9VbkVlNmloQmpBVEZFYmY3Qzl3SjhnSjZSb3F2ektnTFA3MHIyd1FDdUE3cGo4NnhpNTYxTitNekJxN0ZmeDdpUWhHcmJnTXdrbzVROTdCOGl4eVJkbnBiYmY4NW5JWkZTM3dQRzFBU1pPYlhFcmJwWC9uRVNmNjZwZGRhdFhmU0RqMjRCSm8xRmNSazcySjlEK0lnK0dsemNkcEozSytmVkxLUnZLaUgyZnA5ZG5ZU3laQUN3U3RtUzhXNXJJWnptWlJUb29nZkYydUtjbzgyS1pZTjZFUVB0QkY3OXZGR01NT3FOSEhUSjNqSVBEeUpLM2VqVDRXcnF3Y1FoZjVxTEFlanh5cFJNdU96emcrUi8zVWpaTUxsWU5idUZwQW9DWFVvdUJOVlA0bm1RVlpTUkJzN0JyTXNLTXp0cWFaYUVNM1dVSTE5MjRqMG1NN0tzaWNaaVBMVzBmazF4cTFlU0sxbHF3RHpGN3RtT2V1K2VrTVFwTFhiWXlpc29JdHpLSXBybG0zTy94N0JTL01xQXRDZnV4cWJpVlQ5aXdUTFcxUlE4SGFiWFgrTkoraWp5T21pb1Rqb09JbExZZ2U2MFhPM21KNVRibTFTdGRRdFN3Qk1rclpJOHFGeERZRXRGSlAzR05SeDZlK0haOFI4d3QzYm0xYUlIR0xOanFzamtKemZyOW9ObktkWnZxdkRaTWRaZEQwR1dSM2NOeE1oM0pBNzdnQWQ1Vmw5NmhlbXFiTHBiSHNlM1RRenZuOVZRUHdsYldDZGxKdTJacFZxSFl3QTY2TjlEZE1KelBGbE1TdTFQVmxTRVpTT0VST0hRcmgrZWo2U2pCeGpDbW1oL2lEbjdjSFMwekNJK0NDUlhnWURIMkEreHJvNXFWQVZyMW1iRWM1S2d0ci9VcHBXSDVsM0R4cm5NbEhsc2l6SUtZcmg3eWZsL3BZWGU0dCtGQUpLMHNSNzNHUEdseHRNaDRpTUFnTHBFcFVmeDNtZFNVQjRqNjJlTDVUV0E3VUhkOStUck5tQWxNTGI4ZE4wSjN6ZmU4NDY2S0psc05veFBsdDg3MlBRU1hQM1phQUtDcHNpZzRYRXNJdHRkMStrNEY1RW44ZTZBUnVVVU1DUmFFY3pNOThVNmRGeWVvQmZFWnBOY0VTOEJrQ0l6b3FNRDdwL1lpcGFkdXJGaEcxNEh4eG1VbE1rOFJrUlB1TkVwWitMMjZTK1hRd2ZBNEoyVTBweXN3M3htOG5IZDJ4L25JZUNMNTFwakplVDltNUFnMTlESytpOTZXTy9LbXNxMnh1WWV0K01RSmRuN1ZRUm11Qjl4T0Uvcll3Rkp1V3RUUkVnYmJjdnlXVXBXNlo1UlNxZC9PR1o3V1IrbUkyVTV4SlZlSDJKYk84RU9iTnB0UkYyNHRqWVV3eVBpck41OHVQZWZZa2ZUN2ZJWStIZko0anRGNE9Ec2hmTEwxelM2elBSUHdoZzZrNFNLQy9VbmdINXVjWXpjTE8waDNpUlFJNzJjRGRsd0dNckZ3QjhUTk55akpERkVtbmw5WFJkbnVXT2kwYTc1b2dRSUlGN1hleDN0U0tUZWNtR2owVERNaGpXQkJIOUdPazh6UzZ6K3JCUlFRMVh1NlJ6SW5heWdmckI5TlEzd01FdUNsVWFpTi9ralFraVJEeGducEN6a1hpdHVFL2lXVVR5QmJEdUhTdm5JSElybG8wT2NFVVB4UWtON05HMWY3dGFZMEJ0bnpTNy9DaXIzd0ZQUkNPR0NiMzg2bWlqcGsxcG4wRzk5b0N0eFAxUGpsa2RTNnh4NDhJWVRQSm84OXppV2k0VTQxU3lUQlNDTTc3L2RRd0NwdDAwaEVQOFQ1Nmw3aURjK3QzRWRSMndUUFpUdmRCWEpJeXJwbDVCNW0xcm5qRktEeTFQaTdIcEczTndueGRhcWhISlpyK0NweTJlM0tERVJ1ci9lQ0dQdkFYSHZ5QW83Tyt5OHlsYTRZeklleWNaUG9HWG9TeGdQNkZ3dWtGN1NacmUxYlM1VjdnOEt1aWNwRTNzSWZhZ2JZSi9CcmxQMStkNEJJdlZ6N2QxdmErOWRhU1BFY2VvTWpUT01Da09Xd0NISURYUlpXL1dkOEV3cGR6cTk1cG5KaGR6MFpoWnlGcmlaU0VzVUxKUFduV3hQM2NlaGk2RDFnQ1R6RkpvdlBpRHBsbVZ6L2Rna2lEVmlXV1k0WHovRnFLdGNnQ3BtTnp5bStweHRzTWcrSUNvTm9UMjFjWVR2YXROZ2VmZkMvMGhPY1l1SWFyMzRZYUZ5V2lJTG1PSGFIVDNwcHpjTVhHcEp6Y1JNQzkySmZHcHJoSmgxbGM4dXRUNjkrYmtYRDFtc0Z3VDdtRmQvUSsyZ2ZpZldTbGNXTkxlbyt3eVN1cFV4dDZpNHIyTlNEWVdHWDNxVnQ3eStJRXRQWExiblZjTXBhdUZGMW9YTXZ2Qmg1S1NHUUdab3Z0QmRzUGNab3VnZm5VOFBWdi9QSUcwUnRscXZ2TXZQYm9PcXBEZlJZUGZLTjh1S3VOek5UUERkZmdwbVhsaW1NTEpkcUtERDVrOWF1Z2VxUGlld2QxTG40dlE1VmIvWXNsQ2VvSmp5M2VCT2tNSDRHcEhVc2dmTElZTjIycUM1VVlRNjhtanIyK1RBam5FamFUbzhYaTBYMnJnTHlEUFhKNkYrUHhxWDRnUDVUaDYrS1NSa1RqdDNpaUVXUm81YVBocm1EcWJHUis5Z1M4Z3RubHVVeUZZczBZeTUrYmUvbCtoQTZOWm5sY3djWWFDeWxXY21LMTBmQ3lzNEVlN2Z6M3lIelVQYzNzUm1MNVc4MzRTdnI2dUU4aDZZWkljZE5DQTdiY3N3YndFcmpib09abzRoZXByQjkvZ3p1bXZrMTJacVd5VGE4Y05IZVlodVdXNUdSNVFqM25DbFAxMEJNeTFOV214RUhOOC9JTUVOMkhBeHVHOThiOHFmbTNabnBsL0JuZUlaeDdYYUxPTndwMmF3TTNtUUNPdXlQZVArZEdmUWZvcGZmazkvTlZHQ0F2NXBJU3pXZ0hpYVRyNEduVXVTTmR6Y1d5SCtOUE5DYlI0dkcwRDVHNDZxSzhPWEc1dGZiUFVmcElHS0sxRksxK3ZiOXlHWkRmRUl6azNLVlpOWVJPaWEvb0JMT05RREsyNC8wVGZlMHU0dy9sMGw1V2lpTlVyUGxpL2U3SmYwQXhKUjJNQk1YckZNcDg1bnEzRUFnRlo1MzlCWEdVTGtMYTFRc3RjRDc4YnBsQ1NkQm1SeXJEL1N4UVZKTUpxMGJvRjVSbUVCck1GN0RHUmNiTzhacDlMbDNSQmlIeTg4S0VnVDkvdDAyM1c5TzBMNk5NMXBNeFd3VVN3MnN2ZGdjbVUrQW10R1B4S3ZkVnRjeDFHMlIwS2JVaHprbGNIZnZTSXZia1ltcTlYZFFWMVdOT2ZDRVU1Vmx1N0gvTjFxREo4SXRhL3NOSlgvcFNUenhvSWtMMHdIV3VmYUIxZFRUbnNCalFva0JjVlUyT3MwU3NnbW9GVnlJZUlxckpYVWxYL0d0UWIxdHBNVVE5ajVobmJVS0Q4bThCQ2M4akREcS9VM1hpSTk5VFkxMWxFYXErUjJwMit0OFVDRTZTZktkWUZhbjhvd3RndlJzOWtjRkdIbXJXVi9Xd3RxaEQxY3lxTW1DS2hTNmZtT3VCbkNFeS9ZRkI5RUVFcDZuZmpuM3Z3OXNPVTREUEJsRUNSWlNWZkFqV0lUK04wQmNpZ29renNKc21DdVB0MExZUFVwWWRmV3dJcENoU2ZvbFZEYm0yTDVRa1cyMmYxRFYwMklvT3R6cHViTFpHLzBPT0xENmxJT2pwWG1qLzZpV0xTeDFQeWdCNUNFS285aSsvU0lia2F6VGhOeDZaNWQ1b2d2UTFjUlZPZFlIMmI4RXRJM2R2WXpXSEdyM0Zpb3FjdE4rUTVUWkZicDh2TnN4eko1UURUeDVzUXFOMVlOOW9XUjlYV3VXUTRXMk9XaFI0UEtjblVuZkM2NXZtY3h5SmdMRXRXYjZrUXhOK0xYZTZ2SXBxdUVLVVpJR1ZRdVRuSk8ycWxNaXFoZXliN2RZNDduTlBUVzFRUTBTTGVwRnZGN0g4ZlBsSzhYQ21DVFdlQk01ZUREbi9MMXZwVVNhbWRFLzhVRVVhV2lzdHZYZExxSXR3Y3QrS09YY2NyWkZUL0hYZExNWnJBN1gyMmRmOXk3czB3QlpORnBOcEVabEh0VUxnUUV1b05reTh4YkNLT0Y5Z0lSdTRVbGw5RlVmRDduc3lTT2RxYUpQT1U2VGN6SVpTT0NlOHpWSjVwbldGbWk5MVp1b2k3VmRzZXFoOXVaNjZ6b0xuNmdCVUgrYTRXS0dHaVZYZ25CUVRwUHhiWjB1WElxTWtGS2lkTERqcktZMm1HL0NXV1hrT21BUDQ5dWcrYnd4OUtBdjhsTi83NzRUUmlYMWZDUFpzcXZPUVhuaDNxMVFnWmhIbVNBN3AzanpNU2d6ZnhkZDFKTURFRlJyZVh0V1AxeEYvUCtObXl5Tm1oc1hsSE5TMVBWV3RuZzhLam1TazNiWG5yZGthR0tqa3FUMUVSL2FBb05IWjlQb2RxSE5yem5jdkVOK2s0MGtOWnY4WTVjRmo0Q3ArK2NVYzdLQTRYbTZGWmp2RlBTemJDVlNlcDU2M3pwOG9iQ3Y2cklscnp2eEZVNWFXbVZKaER6RnBXUlM1aURoSUhVa1oxL3dRM2JrSnVDR2kzZkF3UHh6UnBXS3dQd2ZneW93VTJyaGFXRE9sSmF2SHZkT0pibUw3L05UbXo2blpzN0tOalNJR1dEQUI5TXUwTExpblYxYmJWRlhBQnJxQmtreU10TVZ3SDRKZHhDdU9lT2ZFL2pZc1RPRzRaRktZNFl4SmdnNjlaeTMzNzNxTm1kQzRORm9PQlJ2OXRMREtKUlZaMFVQNElGb3FaeUxrZ2FaOElUNWk2dzVuSXdVMXJGdmNTaEhlWktLTk9Cc3JIbW1ad0lTUktXV1FzWXFMVytmdkRZVEFEQ0I3N0gvb001a0h0ZVlUTzE4cnY1c21pSkZPZnAyUWhubG9LOXV5RVpuem9TZ0JZZjRNRXRUK1h6VmkwWU9uZ2ovYSt0VzdDU1c4TUhBVCtrTmRxRVJOK1JiWFNENkk2SzI4K1l2TWRmZUJFVFFuMmJwaEZrL0NrMDZUd1QrQ0l2ZjhRa2poTEZaZkZESG1GOTE5U2d2VHdONnhzdDlEUDBMTk9WZFE1VzJLcUxNb296MUNjU0c5d2xVdUoxcWJUTkhZRmtHTGVYQkRQZUIzanNhS2NDMW12Z1RqamcyTTNZNUlObkwrUzMvZE1QSXVmeGhScUVMRTZpVENYZ2xKTVpUdnpaYy96cVpwenZnU3JGUWcvR1Bka1V4c3dpeGk1OTc3bjRyK3dZWlBPeGVDSEI5VENnalk4SkxUbXBXaEx4ZHRmcFdCYTVLOWRTejZjOTJNVVRod0QvQTNpVjd4VW5xTDBlaWF3eEExVzdIZVJGWngzUzZ0V3MyZnFoUEgrdmFEanJzZ285c2Z5WGhLZnpsdmlBb1BoK1lqWFpTbTJKZU0rTUFJVS9VdGcwSitMZHhoZnhTZ2tvSjNKUEI5d2RlN3k3K2hKY2xnN2hKNjVLOVVhdzRPcEVET3lWWkF5OUdXVm1ITi9qVVh1K2ZRU3hhdVpVOGQrN2Zxd0RhTlFHNzZiZzNhVEdVTGI1Nnd6QTIzUllvYjZoNlRGYU5aK0JtVEFtK1RjWk9BMVNVNEgzU1dvMkcwbk10SGtGaXZWYStxdThVUU9FV1o4RDdHQ0t5emNZTG9ueUpTYk5BbWRrK0REN0RXTURYNzA4WE8zQlhsM2Y4R084aVhxd29Mci9Da01MMml1MFpVZUhzQ2hOSWZJUndYRlluRlRGSzU0Z3NZWC9kR2lIbzRsTHVNeGVDdTNZTkdvOFdpYUhOV3l2aFZjaVdvanVxYVowNmg2M1Foam13c3lkZmhFRGxkdWtKOFZnYXA3VmVVdjJBSVI3NjlseVFVQ2hkMnZ3WElreTYvTDArTU5GQWdydml2QlV6TWYyUE9pU01mdHV4TG93dndPLzFBcFo0bGx6c0s5dzRqMmRDWUZWRmkxVzFKMHBUYUJHNDdLK0lGTUZ5TTkremd1dVhHK0JBempVRFBsV29NejlDYTF0blY5RjFRVjVhd1B5ZEluSEdZNDdSbEFzSDlZT1haeEl5Mk5qdUFmZnI4Y2RHWFlkNGFJVFJqSXpSMEFxRjB3TUVxYmNSMDg5bXExSGVMYVhyT3ROREJkYlFFZ3FXTnpoV3JSNkxzRW1UTXlJN3orbkMyTFFFV3l0NzhTbVRsZ1A2VjFEOGYzbUJxcHJOYis0d004S01RV2U1aDV2NnJxS2JFai8wN21nZkhWNnI4NnpoOUYrRmE0aXZ2QllvdFY0STVsZktNTzgwQlJUN2dCb3FRbEU0T3RYOG54dXNyQlUxcGFDZms3SEowc2xlZ2V1UmtoNW0xckduL2FvSmlVelNKU3lzcjY3MFNJUWY0VWdKdEl6L0JOK0pkVWdYODExcTVtTUdRUlM3Wk45M1V4c0dEMUZ4bXJDSFNNYW11bUh6WGROVmViNzh2RU5UazhQN3dSZjV5Q0ZZclNRQ0NVQWZnNGJGMWFIWGJLeWFPdHZ2VDFLdmNBYUtHM0pzVjM4dEFMelYyRlRWOTRFS0c5YmcwU1Z1bGFvcHhFWmxKamN2VjdqK0U0YUxFSUtacVJRMG1CNGs0SVU2b2NhbDd1VVJnMi9oWDRpY2J5U3lVNjU1RUtjdmFubHN5Q3hCSVc0NWczZ2FFaUsxL21wSjdnb0gycC9nUFpMQUlVSVlQMGk0Ym5Rb2h6bUQ5a2VKK04zSExqblU5WDMzQ2d4ZnRhVmtRVjFXNVZHTEtOSVQvUk5rUXlwb0FOUFJvN1NnWjBDdkJraDA5S295MzNxVm1yV0UrWEFHSGtrYzZVNzdnL085bEhKZjJpZ2pjYjVjb3pyYVgvUlMwTlNwaHhWWFh0M0dJdmpvNjhaQmZlYWVuNjFHMDA4Yk9xY1cvZFJKZ0c5S01hMzcwS2JhenA3SDYwTHloMGorVWllVitHbklwQkVPcEJqVVhucDNsK1kvOWN5U3JLYVpOckdtTVR4dVZCSDh5T1ZSZCtXSnFJTWNFWjVXckEvYVB0SFFQaVppanFqWFNMQXF4Y3JDZTFDcFZoZVZGZWdKeGVBK29Yek1iN0IxdHJwS2RDVHpZNTZxNVlIeGRpcWQyVHZqbWZEYzV1dkhtK2gyK1JqeC9lNzhuVEV4YmY4RHhwRGFhMElwQWJmRnlnTjZhSDVvaDZxQ2R4MWpMRWsybEF0WnF4d3dyRk9lUG1La2ZTWGNUdnJyMjhKKys3bkRFd1drVUljTkUzYVVaRHNWbW1Cb1JlYis0WEprcVdFR1NmMThJSDJob1BVazJ5WnA1RUUrUXltV2drTEpBaXJZRlgyTmwrcjd4NEVXMytOTmpybFI5RVlqbEk0d0RTMlA1OXBuZDA4eFdlczBoZlc0NndMN28wdXMxQzlrZ3VqMFM4SklWenoydVlIRnV1cnFaRnd2ZG40dndJanVXUG9YNGMyWHZlRG5qWFp6VkxSZmpGb0xSZjRSYlJEcXRON01yOE1hSUxBOCt0QVZ4UHl2SXVpMnZ4eVJ4UWZXSUprQmhMZWdiWUxtS1IwcUV4dDdVcUVJcldxN0c2Kzk3L0FoYWpHeEdlejlGSkVtSkdJeG5UQTZkcmZkMkg3RHZ1cmg5bWdGdHRXYWN1VW5MWHhGVkhOdVpaMHRoaHV0NDcyRU9hSzFFUm5RYjV3ZUdvNjA1MksrQVJzbkRYOVNUVzRyOWtuY0dlbUxIQ01DNjlPYStsY1JLTm0vMUJhWXFaWFVzaDJTM011dzFMeXlYdU1PVGpnd3hmMHQ5UVM2TEFlRXJJaEpEN2pidXIyeU94Q1NYME9NOHpxOEgvVThEWS9LekhMd3ZxREZMYlBicUNoLzlJd0hJRnlOVk0rRDNnc0p0M1JNbnZleHkrWGp6Y2YyNDc2Mlp1MnJqZnczaE0rRys0ZEdWNVhwbmlpM25iWkZkUTJvUXBIQXpoN0lBOGM2VmF5MXZWY09IOTh1MzV4TlNDRGRoT3JFNFNwS05iOXAwK2NDY0FTaDMxNGtPeFNDQ2FrdHB1SlhETk5Sems1VGZtK1pUeU9yN2lpc2h4c0Q3eVdaRFl5ZTQwRjdsNWV1SU5kY0NhOTRFWnBkVU1jbDBrNlozay9VKzlQOTh4S2VRTVRPeVVVUHZKZjRpcy9WMVE0NDhkZ0tWbTJuM0NJVlF2L2ZYbzBUcUVtTmk4akRtRTdxZ0ZoMzdPaUtLMFpBTFBZaXZNVnJucThLNlVtZGdhb3MrSVJHS1ByMk9Gby84clkvOS8xTVRxdXAzTkF0V2Z2Z1k5S2RZSXlrbXVLTXVUL3RqVFZsVnZERWM2bC9vN2Z1a0VMNVFsOUFmRlBsb2YwWk5oRXBTcUZEZGs1akszRGZnUGpnQXlMVFNvR0lNMm5uajVpb0M2RXV3OXNvSU9iNkVrcTd1ZW51a2dpclFiZ3hZcU1XKzB4L2Rnc1cxamNLQUJvaTRzV2VlbUhOc0ZMcFdvZENTKzJqbE5jbWJTV3pXUzJsK1JhU2RJdS90VmhOenV2R3JzS0RROVRUTzRTSXkveXRjYzhYb25UUk9ZMnNHdzV1Wmp2eitZN0lKL1NoRk9ZVTBYd1MxR2NSMlQrQm9zc3MwN2NUd1ZDUjJLOTNkbVVnTlIybm13NkFNaG1Kc2Q3ZDFaelZmeEsxUEZwamVSTW9sTjdLSC9HaEtHajVpVW54aEREenVuSjlZblovYW9QK2ZBNDR4WWRPYTlzeVZSMGRGQ1IrZ2pFcXBRbDg5c3U4WFJtcS9DYnZaMk5HbzROYUp0U015dnFQY1lQdVNjc0RIZU9nOTZZRGFOMUpqSGtkK0prR1dUamR0WWE2azlYMjdLV1BZWDNnSEJaVFkzWWU5RWFNRWlna1lLZTZ6K2lMSlpOdXNWWlA5VVNBVWpac3JJNDhDUkhjUCs1UUcxZVNzSmowYWtFMnpZMFRkRHJ6MGFxSnZDeGRuTExQUWNUdkJVaU02eXdzMW9GRld0OU9ucjQ5ZDRBZFJpdlJGYnAwVGhIdURzTUlVV0pkQkczTEZpTjFXWE1kQVp0dmluRjNraC8zd1F4TWk3TEtDblVhNjNaM2cxWVRRWTluY0JLRFIyTGxodVNBQWxORHF5d2tQRmZ4OEtTM1Rmem1Tc1VkR0h3T1B6dktRWXp1Qlk4SEdBd2NWNEdLaEVqNWFYS0tTZ0pjZ21WRU1KM1pUbmthbkNXN3VpR2lpd0wrZklEZkpKZEZBYWM5TTJ1Qlk3WnJjbjJkK2k1ZHN3YkZlRFhFN0hOMHQ3TUxLNXNBOG5UNzZHUkZIbnpaY2MxWDlnVGNWdExyUEtlRC82Vk8xbVdhNGhjQ3o1OEMyV2lNQ09zU3pSSlN6S2FJaVVCdmlubG00dXZ4ejNwUmpnUElkNC8yVzQrZ2NuNWtJRC9mYnVETFQ0WG9XTDFXck55bTZjcS94ZjZ0TG41d3poR2xzTGp2UHpieDh5WmJlOW0vM2o2UHB0cDNLbGhoZVNVaEVhNzdRejlCT00ydGovZzJaNktqVSsrWm44WW9WcXNwVnVxcmgvbEx0NmdoSkpZMHI4dkZwbTVzb09uL29vS0pLU1pWcS81ZE9nNGhQSkttSnpiTThNOHhRbENGWVBSTldYdENiVVR5TzBHVmxONkFLQk9FaFVuS1ByempVMU9PbUtxVFpaNXgzTnNoRFI2YkhFNFpSck9ITkkzWDhYOGtOWndVSFR0bnkzMU92dkp5U2pCZ0Q2SXVBdThiejdEcWUyTG5ub1lBMC96dG0za29Wd0ZFZEZ6V0VOMEtSSE1yTkt4SWMweXNRNGgxRDVreTNPSFlCbE5rYWltMHFjbTh4UTdOZE8vdThEK2FSK01aenFyQVhnTUZ1WHJzZTBPSkNnZFJFSTIwY3gwbzZPUXA1WDJsM2pZZG5ybnlYbFQyWkJMR2lCVnB2b0pQMzFkNEhsMXN1NDB3L3R6a0tyZ1RsYXRPcXdXaVA2Wm0wRzgvQnRKWG44WFMvSUs2TUdtQnBhSzdRREpqNG41emlyMFU5aW1lTXNvNi9ZVjk4MldGaHY2a3JGQmpiMzFjR1pSZWRQVUJ0TVZqREdwQ3NveGFEcjZXeGtKcWJCY1BpL0dWTnhPVEhRV3BiNm5VWHR5UzA2emhtZmFDQXc2NUIrNjVlL2lkd0ltWkZJWkYzV0tQRjdzQ240dXoyL0NWVzNHZnVjZWtCVHFWVEJoUmVDSldaMG5SNzNJTkJCZjRsRmFFVEpVYkZFTkVtOS8zUFJESTNLc3E5dks0bk0rMm1HcHUxUk5nWTEzamFhQzJvU2J2SEhJSnN4ekFxcUdBR0dGT21IVUEwTjNaVWJjcCttTUJrZTZqRFZ4NzhDb3dPMngzR2kwWUM2YzdZVVhPYzBwNEhreG1WanBOSmhqUVcvVkpwZElPMjdVYVJkeTZKZG5hRklTT1QyRll4NVYzc3FGaU5YRENQUXRvNGhSV1UrQmVIenVHZVVYd29qZVRCa0lycTMwVHVjcXl4bE15TXhwZlBuYnhNL2IyUnVTK2dxdHMyOXJHWjdCV0FUNGV4bzJza3FKVGlZTEpVckdnVmtoU2JMaXRIK25HVmVwMU1kRlFlNzg2a296andFSTlENTZhUFUyZHJtcnB1d2tWRHhFbm9OL2JZWXA2ejRUeTlJT2VpNEFHSDg0YmIzNXJ3TEtmaWRQQ0kvUTM3aWxabXQwRHI0QkdzTlJiTmRDWDdSU1hEYTdkU0o5UFB0NmZyNFJWaGh5SzJQTU9wbEZtanVzd2lUMWJmMm5ieGFQUU5FTkk2dmVXMW5nNGZKZ3QwcElSc05PUGNQZ0dkQTBML2x4TTRqQldYWTBkc0p2WUdYd0thdDNmOGhraHIzM3NWM0M4dEVxUnVnY0ZrZ1NiR1ZrRlJhWjhIb3p0VUpNNWFqVzk4cHIwU21Eb1ZMTWs0MXhYOUhvbWQ2UGZaTnZhRzBpTE9JYVlrdVJpS2ZSbnFxaUpITllyd2ttUk9IZENnTll3STBXcURQRVl3Tmo5YndRTXhQREpUM21ZQ3o0Nm5FbmNOQ2d1T1JlSWMvWkJLekNKT1h5Y0t6c1c1S3VHbnZnZ2NzcG9jREdLRHRKQTZVYVhHaFZxUnN4Z3NadnRZRlA2bUtiVStTcExaQnN1eWtEVEVYNVNqclBOeGdKN0JUNUVkTUNyWFBqYllEa1ZteE95cWtNSEl5TkJGY1BSYXVjZGV4VDR2QWp0bHpscGlZdmJacmQxMHhlRkVoU0UrQlJOeXN4WFB5Z2wvMkViUjdSaEtxT0N0UWxxQVd3dEJGeml6d2xRdmM3bkgzVjZKdld4NnpDaDB0M0lBeW14R3lXdVovZ3lFeVRxWjVmVE9KRjZVZWtjYnI3SWJseVVYSkhEbFJmT3F1c3haWVgvSzViM0FLRmFBUGRaQ0dJSFBSZGd4TURYMGEzUmt3Z1B1VHFzZFlKOWd4U1E5aVJqSlE4UkFwVnJRSGRFUW9KUWtCYitJUlZ0MVhXRDV6bjlwOG5xc1dVd0RLZ1JIVXJyS2g3MHBVU1M2S0FDNnF5VHRIVEV0aVZwY2dmNU40ZFZnWXZzbDlhWkVVUURjcmNSV0V0bGgzaFI3YXhTM1prd1p5eUl1MWpQNHc4YktzdHdJM3ZuNkI5N0dTOUxHa1M2UWJXdkNRZkhYVFpxZWRhY0VTN1p1S05Va1BxekFRYnA0dzlzSzBTS21vYnQ4S1hFSGJHVVJ5Z3VzajF2eXYyZDFWTk1aWlNhemEyWUhyNi9wdSthclYwSG5pU3FObVRJb1hFd1RSajErclBCUjRVYUZDcVVWUFVHNmdESERsVVY4YWRmbVVVSGdoVE8vOXlnUTE2R3BKZ05ZSWd6UDI1WGJ5UFpLc09KQ2VvRGEwbU1tcjVIVW1kZERnMVJONENzb0hsQTJUby94emRmSXF6eE5obXg5Q1NQNk0veGdiMHJWUTRjSHJZbmFiSFdiWVpNcEF0NDhmN2JubUNnTDBXQmhjOElCRFlHZ3ZUVVM2d1FMYmhSOUY1cStsU3ZZZkQyY2ViMjZZS09HbUtTWTgxOTNNa1AzYTFuT2NqcityZTNBQ1MxekMydzYxNXNUT0Z5ZWhQMDQ0alVBMEt6Y1EwTmZkVTNraFhELzVHQkdyU1NsRmRpcjNteVFBbU1SSnY0V0dUWG1vMWpSbVdTWk9hNUNyRzl5Ynk1Mnptc2czOGJNczhCREx6cE8vOVhIWlh6akpQbFNTYTdlYk95TVZqMDhpK1FzTU5TZ1p3SmtnSGdJQ0VTTmJpRjlTeUdWZ2FCbEIvYlhseXZUSStJVjgxcUVUdDdCQWdPcHA3TFRXRkN3UkVZdlJDS2V5N0NGalMwMjRiRmU4WHp0QnBVMVNXSWVXN3FOa2dDNEZCdHB3ZG1iaE5kVVlMZlpVRy9TWUI5LzBnYTZjTkdTMGJoV3IwWDhOWDdqZTJwK0ZhYmhScVpVQkZnVnY1anI1Sk1WQ202bjhnajY2anVUcXBHcUtGdnFudnhpQ0JOdG1vbVMveUJDOGFUMTJFWW83bjF3cmdvalNnYXlKY1M4eS90MU52dm5BYUtOTXdaZFk1ZUJuc29JRU4xN21JTVJsZXo3YWIzTHdtV3RObmJrbmVPc0E0V3AyMmpHdUF6eFB5dzdSVmd0b0NBQTlDekdNaGNISFRDUXBEa3NjaEthVHRjeWcyUTJoT2VvYmEvODRNTFNnRldIYldHc0MvT202RFRQWTNBRHpiOElJM0xZN3FVYk9Hc0kwaktML2lIckswVzVoN1FzMCtuYnNFbmVXUWorSHVPTEZqSHF1YjJxSG1hMHJoNGU2SWwwZCtCNGNvV1dTNkIzbEpzOFArVVBRWFNrRHVXS3labGw5eEFlODhTY3lwS0FwaVUyRFpWT2VhLzhUd2l1NFNYZmxDOXJVL20wN21mUy95MTN2dzBxQzVUTVpKMzFmTDhWQnBkWUczU0JXR0VBUUNUVGhORkRnTEhSaFNsbzFVWnNSU0VjSG1IU2U3MmZkei8xaGs0UTNISGwwcWppK3FGWGFBLzdTR2w5OHhpbnhQcG5RT2JldUViU3VycjlRczdISU9lL0hiWWhrMGMraE9Cc3cxVk1RMTRzclJnRzVETTRRbWtJS1g2enRhbnlYbEp4aUs2SnJwdWI0d0JwUEZBdDFxWE1UanF5aE5wZjVVK05ocy83K0FUeGhvbTNrWjlxa2JRZzUzMnZ4MmRUUW9sMlZMbTcyL3ZuSC9vRTZLdlZWcWttcjRSYVZkVCtndERsVXdILzNoRkI4dGxzem02RG1Oa1ZsNE1aa3lJZXhZandxbk5wMVQ3WTJpdGUralBXWkJuN1lmaFowT3F4K3pONndENkl5ZVF1b1Nvb3ZreXBIOXNDRlR6REZjSytMWHFGL1MzMGV4NlkrY1pEMXRSWEZNSWplajVDTmR4dEdhL1d2OHRYVU55bWhxemltWmpTQ0N4Uy9NZDExYUJZdDRVblhDSEFSb1NqTFREUXJTTnQvcWpwbkpqVGZkQklsMk1FNzZBT0VQL29zQ0dTMG5RVGRhWTNKTXp0OUo2M3VYbnVMOVRkdHVtNTdvUDhESzRKcW8yQkxxOHIrOWVLeUJVR0dvaHg4NzJicXJ1c2VnSThONjIyTWdSbStyYWlEQ3ZpbTRzait0MG05eW1aaVZwMnI3Tk5xZGdiYmU4ZU1pS29UQVcrajhJbVF0bnV5a0hucThTZDVrV2wvWHExVjRnOXhSR1N5SEJGa1dYU3oxblNsRVJsSGhIbXZTV1hiemhxZm93SVhHU2ljMEI1cUt0aHdKZ3BwUEhuYlZvQVhoNDcyY0FmTXEraXZKMGk4TythNFZZUW1sbSs4dFloUGsxc1pDU3BuayswRDN3aDA4QkZHRFEyUHY5eUZQb0w5bDdKU3VSZjgrTkFGT2lrNmZxMmRTZTFHcGJKWU51YkdTTTJjcVo5T2V5WUUzSDF5VFBrdkRzRzRjNWtqMms4cHM5UmtCRHptUjliMnN4UFpmbzVYVlZ0ZWNtQjdvME9UdzByUDdNNElxN1pXQnZ4YnlEOWJueHY1Z2tFQys2emJWeVlQMGFVUlRyL1lQWmE1KzdEQSt1YUVleWtrQU85dzJMVjFCQ3BhMWcyVEQ1TENkOEl2VmQrOXA0c3VkanVwdE1EZGZvYVBsdTB2Z0xNUkpkYmd3K0ZYNTAwczFKMWFTU0FQQ01QYTJtL3RwUW5xeHNvbk9wSnQyM3I3cXdFcEt2eFJaL3BBa1NMbGZKZUExdFhiSi93a0hFU3R4MWE1NUFpL0NNbHBGZkQrR2NvQWFxSkx2WVU4bStwVThyQ1ZPcjUzNzVlUVN1ZFc0S3NZOEVYdlRWaUdoOE9QL3Q1YThRRmZLelZZaUYwcVUyaDNCTGZTUEd2Wk9HcUpLNzRSSlI1MmRRRXoxdCswNnp0OU9EcVpVNnZKWWFjMW1sdzE5Tms0dDFpZlBnc1B0Ylg2M3FUbzNYMzJublh3cEY2WFFqRHppMUJUOExGSWRvd0ZGVDBsTGdyOGxBZjNzZWtmTi9UQ1dteWJUWHBVcm5CY09SOEhWOENlVDZYdSs5ME9GMDVLYkRDdXAvQVBKL3BMaGl0aEFDeldjckVlL3RENmQxbWtsclI2b2NkK1dBaG9UNm9FV3BkcFJHOVYybGtMSVhPMXdTOVhJWDVPTHVmclY5bFRwWXA4NG15cjc4OFBFeHdCWjZBalNvVTJXaDFTczltUm1ob0N3b0RSYS9hRXFRVDhTTDVaRysxUFk4OU9BR1U3bWxiaGtuejJ1dG5sZ1MwWFM0ek5BRS9kdEtXOHJuRHRWaHRSOGNFSkdnbUJUNTFwcGx4blhnbS8rdzJiTW4vaEsrOWhWS0N0d0Q4SmwxcFdQV3pnSDl6MkQ3ME5iQ2ZEaTVvK0dxaUpzd3VjazdXQXFrY1Vub1FTbmZPNm1WSnIxeFdZOFpzNnE4MFFDSzJoT0JqN2VUeWtnVGcyd1VyOWhaSHE2QW9KZ3NSNFNDYk94ZFlMVi9DcjdKRWtpRGd1ZUIxdjQ5UGJQcU1yUWpKaytzK24wMjA4Ti9LbTFUN1pDbzBTK09kUlY3bDNSb2ZYM3puandyQmFtSkIxUnM1RGxvblp1WDk5aEMxcVNpdnFHV1h3c1oyOEhmTmhVOVdpRk1RajhieExRd1ptRk91UkRmQk5yWnpyUzdZWkttREVoOVVXUjNiWFBmUm5zYnptZlNrQldYWElGMkwwRmZjN1RvdkVQYXJVbEFYZlViaE4vamFZYldzOXNjV3B4MUtPb1Mvd3NBUFRDeHlIbEU0OXQ2YmVhcXBJbHB6Rkdqa1pETFo5SnZtSlJWUnBQbmxHS1VWMm8zZzNDNXJYdFFzRG9iYTVSSit2QTlMZW8rUy9sUG9YTHJBdDBLM0dBRmwxZHJxay91NmdBVUQ2WGRZMVFzeFZUSjJSNjRGRXF1bXJEQVA2Q1kxS3NCd09IRnUxMkZOKzdSMEY5d3gzK202aVNCODdVd1Rwekk1OE5JbzhrRHRkRFRHdWNwTDZGSjZQb0xyMkdvR3lHOFFrbnp0elRJSUFHVjNiL01FLzFDaUZqcXVsbm1ScytRczdLTTE3d3h1YUxNUkJIL1hBV2k3blBuSlNkMjFNNkhyVzE3QmlKME0xMWFlcXRFN1FJYk9jUW1QRUs3MEdYNW5OOWRSRFg2WVF4bzZwUHZKc29IdXc4OUNHY1FMSFUrdHlvQWFpNFpVTFR1Qm5Ic2tWOVo2ZDFPQ3c1Nkg0YjZuMng5enJUTTJLUm9ETlZtY0JNSUY5dVFFQWEvemJtcnJwQUtncU1LS0lxWnpKK2dlendKRmJxaC9jUWg3REk3dG05UG5wRmZqMXMvcEt4VEtKbjVDcU9RbTFsSkhDaDI0bFpONHFOcFFmSUh2aTlmYy9TSXp3d2dUcTVVMnJOa0ViYUVyOG9DMUprQ0hkWWhMYjAwQ2dpamlUYjRKaUdLVVZmQm5HRmRmZFlobzZFdDZiQUpwMWRDQlZLaGpSNVRVMnBBWldoZkk1VkZta05UQm1TN2ZBeGtwSXpYMm5UdDRDS2dHd241T09aVDcrbzAxbGRBREhSQ2xFQUlETGgraS92cUlJa1N4ZGt3eFozRlZRK1NUNkIwRldlaVk0bzhocWRVZW5NdWVKV29ROThvZFVLQmJUSlF3aWxjeDM2L0krUjJrbTRKNDYvZE9GVjkrYXZUdUVIaVRSSVdvZjJJNWdLSDBXVEh4YTNuVFNvMndCclRqeDJpc1NsS0FyYnJFT3p5VlhNL003RkJhemhWalRURlFibkxtbXlUQk1tQVFxTXhaRk9NUnpKOGtyMG9EM0FteGMrRzVmREplVXBMZGtkQnhSVXdPZ29tbmhIcVgxVlNtVU1ZZ0d0dGVDY2RqNk5lTWFGOThHOFIzdVYwRWlWcnBMaEt6SE5jdmJNV2Nmd2pFQWx4WG03ZjZ4RG04ZGZ3RCtZL3JVUVlBN2wyNmxNYzFEVmNSeGtvRXorVHN2SXNORUNzQzZXMTVadGprMEZ0cHpmVW4rNXBMa0JBeDI4N3ZXdzkzV0FiUVNyK1pSeXIyVlJnYlJwMnc5dnNFMGoyWDYxTWZjV1lUSmptVlVhWFVYOEhpR0R3K2VrQWNEcUhucStleXVHUU05RmNPUjl3aHdOVXFEbm00U0s5UHhzYWkxcXVjQk9LUFFSRVJaVTBPbzNFTStqdWlUMVFtakxIUUs3TGdxaGhlQWZrVkovWjhzbldib3g2aE9WWjg4Kyt2Qmo1SVdHWUZKOHZKL0tjdEFmSnRNWmJEdVVZbDkyZHJ0VXUxekZndVdMMms4Y0oxd0x1WVBKSk01Z2pLRXJDcmRxUzFJTmRxSHhqRmhLOVc0NE55Z3QyRG5Zek5IZExZYWlJSzNvQ1JxbThaeXZMcnV6MVFHRGZhT1dSN0IzTWFzcEYwR0ZiNHFncmxBSHZhQ2xNeEpINWR1TE4yUEtPN1RwTnNPTmRsRHNUSkErRGJobUluR2hjQnlzdmtLd3U2ZXA1ME9BWUY3QVZUZE91N0xUaStCc0x5VVdtVlczWjgzY3U5SnJEMlptNHhwTzQyTm41UmRVTzdWcHN0T3h3dWZxUVNRUXRHMktpTVN0bXhpN1JLUnpGald2V3FGNmpXMVFMNEk1Ti9vamI4eENWd0VPc3lzV1NqdUdxVU1oZlZtdVdCNE5iTHBpNFYxYytIQTJBdHBnMXlZcmgxeHUrbGhDQVJnN0hBMFBtczY1T09TUTl2QjdySVZNWlFlZmNSTjhjTk5FM3JyTVl5OVc4VmdKQklPU2hBc3hpQmxReEhkMElHL0t4SzNzeEFsUVpnOHNmNXZKbVU1aFJQZVVFV0dSbkJQM1ZRLzdHWU05NVV5NnlnblJNNlpoVE1IQ29aWW9LTUVlWHFPaVVUQzR6cVZvRFB3OW5qSUZ1aGh3cXpqMXV4TE5LeUc0WEdtMGgxSkhjWnFVM1FSRlR1U0Y4cmR6NDU2NG9WWWRNcmRtNU5HOUg5RFFRUzlEMVVuQWJHWnArT0NEL05IQUdlSzl1ZFF3UVAxSFgveFpsMVpHQkczbTNKY2VMeVUvWjFQS0p0SkdDMzdVazlkblFHNnBaMU5SSWRMV3drK0p3cDZvcm9xVUtUc0EzN0VveWtsWG15QWVJQmFiYTNsc2g5cFROUlEyQUxkZWJiUjJ1bDBLUVk4LzJ3RlhOTXAvZHdhcHd6WFJPSzBGYWJKSTJ2OUhXZXZ5ZmgzNFBaTWYyNEpweUQ1SE1mVUFaOTZlMThmdzlVVnpHV21qdzU0R3V1QmtVOXdncG5DQkpHMDFkbzJlZ2pjYUlhS2JyM2FDV3V6RlF4Q3VZYVR4Rm1oRTlOb1czbkUvRUx1K3NWTVkvS3ZWdG55NnZFUmtUOTRqUkd6TUZHdWpCZXNDeWRrdTBXMmhhQk1tTm90TEJSODhGMllGN1lEaFYzVEpVRTQveW1vbkhhWEhKSnlrU1hMbzk3VHpabm8xRmVOOXkvSWkyT0I0ZS9DVW9tSjE0a0xsa09jeUNOL05temdxL21EdGhlQi9iM256THpqSWd5akZycFpkb2hhYStlcVU2NjAvRjBrOTJNRnRxS0w5c0M1S0hKM1A5ZWhDeUpIUHJJTW8rVGk3cGw1WkZYT1gwcmNoU3NzY3JnR1lkM2ZtaVl0VlVWY205UXR4QkYvRkRFd3drL2lGTFYvRk9odTF6M2NJeFJuSWQ2MHA5RCt1dGthTHJaejBzaTZxQkFwMmFiTmhhSytzVnI2cjIxQ3RLUFgyUk5wcnJGd05nUHROemNmbzBLenlyV05ZQWlkNit2VDVscExxQjdLbmMvOXpid1lJVFZOVkI0TThvRnA5QW9oWWE1UkJpUGcwMENRRWR0UDQ1TlREM0lwR3k1V2JjK3V3Q0grMWE1SFl3b204K1hBU05DZEt3bG4ydkROenduWTNiTmJpL3M0MXp6c0ROZy9sRVVGaVRtOWtnWWpTQXhXaVpEZnBGSzNkUWJZMUF1eTB2V3NOWTZ1cWxJdk9YditXUzh0UXRUS1BPQmZxWTNnTlRmelNiYVZVSDJqRm9rOUdpUzN5Um1pZFdidHRlOHFMaGY4T0pnd2JiS05sbUc4aFhyc04zSFlVK3E1a3RObHl5ZVB2aFlRU1d3Wks4Uk5GZXo3eWJjdTVCUVFXVjNoQVJDT0pGbm1PVFRkY05sMDlqS3dWREhIdmlyRExUK01nMkg1dEZDRGMwTjBNd3VCWDBEU3NMeDl3Y0NjdWZBZzJyUDhrejdPSGVqUGlKSTlJNmw0VW53VFY1VEI4aE9ybmlsY1NEMm1LTGVRMDczWFNvalpUa1ZtcDVMdncvRSt4bDlIMEc0WS8yUmp1Vnd0T0txWjBpeE1OMHQ0UWE4SUF1SG85Z05QV0hDdkpSVnl4Q2tJSkozc1pQZ0cwUWlTb0srQVF4dHI4R1Q5ODFibjRQTnlCN0tjTTR2WFM3bDFOY0ZIUUFrLzBESVplci80Q2FFNUVqU3FlNkdPOHhpdDBBdEVOTWNUd3NocmpRbUNYM1l6SzFEa2NZNk9sclkxa1l0YlEwUGo4cVZYSE9ITVJFVnZ3R3V3SytvbHZ5ZWJqaHMzN3JJTmFwZWRSOEUyS0NyTkNwOWFDbXVaQmUwQSt5cVl2clY4ekVuUTJCVkpvb2lrWFNmN3NONmxEdkxONE5jZHN5NEp6aUZ3K3VLYm1NL2RkYUFEMm10OUpBOVpqM0E1ajBLY0Jpck15SGs0Y2NwWHU0a1ZLTVFiamJMR1U1b3hVdU9ZYkdhTmtIY3Y0NUo4b3R2U1B5MzFhN0Q1RDFYa3B6TURDUUUzREFzNkZHOFBiMVVXZ2JQZ0grS3o5ZVFZM0Ira1dnMW5mOE8rWFRZNkVRQjAxMmhwdnFFWE41TFRGTzdxc0Qrb1IwanU5OWJOczdQc3VwWGRRNzQxbVpPOVZJQ2h3YzNXdDI3QkgvRHNTcXpLY1hTTUhDM0p6QjloeWxyS2oxZFBuZzhOQTlBQ2tsZVlzSXlTYVVvaCtydFp5YmVoSXVLYy9aamFKWEUvTXVUN3ZRcE5VbXU4cm4yc0VpbVZyVGorS1RhY0hmcG1vRUFvaGpIVUx4cEZCWFZUcDRRc1hkZmptM2pKays5V0gyWEt1cU54ckhjc1l3ckE4UTVMd2UvL0R4Rmp4TWx2U2JGcEx5c29TSjlTU1hhcUVLRkZRUXg3SDNrbnNmOWlLSXhhTmNJc0o0T3JRR2NPUWFEVTBpQ0lqLzR0RlpleWRhdEdZbUw4eGMvdUZIMkcwR3cwNHl5T2tvRVQ0NVlLYUlEVVZjTDFubVF0L0VCa0dneThQeGZ1bjQ5ZlgwbytCTE1WamtaaXdGZzNmRVBHUFJzYUt6Q1ZuZkpST3FtQjhRa0UrWE1oVzFuOURGVUxvSW9zVC9peVkvWFhFUi9WVEhBVFVEMFF3eTBXRHlJWWxzcWJCY0VuTlBZUTBIMUM0UE5lVGNZRzFRbHRrd0JTSnMxTEdOSWFLS2RsV2hOc1NsY2FUcWZsWU1yQkc2SHFnUHFkSFA1RUNMNTdYU2YrUUlaai9pVHB0a0tKa1F6Q1hRZEQ2VWFlV1NOWmk4VmlmbXN2elk2OEM4VDRVNUJZa2tGeUdURUtxc29vTDdTeVdESGIxd3ZhZVA4MDFPTy9WTEhXNDREcGpYMmpJSnRPYlp4eDJPT3RXWWh2azVRRDFOTnFkcTBQQUdPZlhnQXhOK205QmpFK29hNWljSkc1K1NnMC93RTBJRHRwNWlRR0tkd0N6aWJDMGx2TDEyUWpXZkJhM04wVkp2dUZKM205dUE5eTRValJYSVJ4UGdGNElzRzkwalRRRUg4VHZzd0lhNzFqRVpGSzdHcjlSblQxN3FNTVQ1aTFDSHg1Vk81Q3ZSWXhIYzloLzExMVVYcnV2R3JwZjlvd3pKaTFRMCt1Ui9uVHRSeTJ0M3crdWVWWG5uTUVvZVpwakFOV2RjZGZDMEhqRzVWTXpxMVJXQXpFTGRGVjNDYk1MTktseW8yNzMzdWxMQmlEejBMbE10aXBVVUNSU1U5YlhiMVlOblA3WDd6aVFnZ09OVXhuRk1pc3g2M1JiUGNLU3U4d1JLRTJ1akZBMXNlR3NjMkhvMDhsTmFRL0ZsUC9IRXN6Nm9JeHBOb3VhNUhmSXhrM0FuZ2Y4MkVIbVphQWpheHZPR0xRMFlDeFdVZ1ZsTVphZ3lFT2Fqck9ucDlieFRocEFxMXl6M21HLzBpaE9yOEpFRDBEeFhHMHNtMEc1SGhyN2VYTDF3YUs3a3gzYkg2L3ZhckJsZmRSVFBKNlJwNVlxL3pqcE9UYmhPVzJwQTlkS1dsZExHMUJOTS9mUHVuemN1VzlncUlxUWtnQWt6RlloSDFmV0Z6MTFJL01nUUtRUklpRTBUODJRU3VmdzlUSVhIZnRwbEkxWFlwUTJ6RitsUm9WanF1VHFycHV3MUlJQ1ZuV0trS0xFMHRoOWdqWTFEZ0JSd1AwdEFpcC9LamNBSmI2UG5lVUpoRUt1OEFFU2REd0dLUmhUbEV1K0wyMDNyZ0dUTlZoYys2Y2ZPeXlMRi9FVTd0b1J5bmdOYnpHOWlSQVBiNXp2d0tGMFhlY2pvTm51OEVsRlhRamc1R2hjb0Y3VVBMcElETzhxdXlGNEtGNG9uOGNHejVreHRhY0l5aWRZNnppbURhRlNLRTJoVFRhT2sxRmU2VDVGWEFmc2JOTGFaaDFodkRheWNBMTdCNjVTellHRC9FZ2w0aFVkWGlGdENla2VYTTBxN1ZROTNlUmIxY1VrVGcrSzZ1dEVRRUdaWnFRWWdKeTduK3ZYWElxbmhPVWNIa05CaFBGMDlXVndXVW83NVEyZ21uc0NobTB5Q1RWZVhpcC93bENzY1JRSE53RlhaWHdUcU1wckZFTnZrYUVoblJRYjJDbkpza3R1TXc0dkJuRFdFcm1UVWlQSm5HZk1EblYvbkdYakRwdnhTbDFSQ2h0VkJCOHA1YjhWUm9vOUtoSUtmZW8xQzFUWmFNd1lKTVhDTndoakRtaldYMkxCSVFpWGlsQVZWVFptdTEydVJtUlZJWm1JTDJib3RXUHJxWDIrbGQxRjVZdlk1OHRJZzBSaUNFUk1LendXOS9wYWlNK1hBamh4cS9WMVJ0dVlYZFNXTng0SzdxcWlvSE8zZGxDdGxkUGduTkpwY2lYSldrdGxHUEl5OXFjeUpCQUptVmRNMVV5aTYrdENKc0xSTUx6RWFuMlhabWxlN1RYT0dManhwb21uWURDYU44UHlLZ2VISVpxdGd3ZFIwMklXYVl3cXUvcVZTZWFXSFRtbXZMMVhodHFCT2FpaUd6b3dpTkhhT1RXR0d2T3g4YzJ1bmYvYlF0MlhRKzk5Zy84N3R3L0Nkc1Z5UFRDa3hEaVFrNkkzTGpJZlpaeGtvczh1cEk0NS93ZVNCTHNMOU45OUdNTHZ6UVZJUDlIQTVkdG9nQzg5M1BEZHB6VFpkSUFYbUtkSnBVUFBSYkFPM2o3WE9meVdwaVV5Qmc4clVLSTJNWjIvRXp0UVF4Qm5rVCtGZVBMREkva1dRcFBqd3B4dVlmMDk2Z0h6QWRvTFZqUE5PZHV0ZE9FSmxMSWdBQ3VlR2V4cThlQU0vK0J1OVFDWUdlU01BU0xLMUpFbVhndzZpOTlzVVJlZEkxUGFadmoxejgrNU5EcUsrejRISkhQNkwxWURScCtoR1crWTY4UHI4dlBzZXI4TkROTGZLcG9mcVl2SnRNVThGNFZURkppK0FocG9MdGQxT3N4aXJYWXQzMVpCbXRtL2UxWVNDVG9SbHE5UHJDV3RaMnI2L1FHcWFiNkNKYnErTThvRi9KK3MwQitIdkpYU1RSUm5YTEZ4c01WZUkyRWl6NFFFbDNaNnc2d2FuRVNUUmtYZ3RHNHhZN01MY0VoRno3Ky8zSnJtd2tNSmZpdHk2QkdIQmZiZ1d3SE1zWGpiaDR4T0ppcURyZ1EwaU5ubUlGcUZkRjd3SGUwSG92SGYwZ1ZPVVFTQWQrcTRxalZ0NzNQK2UrcDZ6bEdSVkpJM3M3MWU5aVpYZTZYc3ovckFGQ2F6L0V4ZHFQZWFhTVpGRHF3RDI1dTRKNmwwNzMzd1lXc3BFWHRpd0hrNjZ1MVZ6enpudFRORStRSDRPd1NhL1dkL0Q5dTh1WDVDanhyN2wvVTZna0haWHRmczVKL01KeXgrQjkxMnY2V05IMEdUeVRtL1VVcFRFVmFzVTdibC82YVRsWVlRQ1NrMm1kS0RIcytHdHpmdnVVcVlEL1BHOXdhSW4zMy9YTlBxWVJJM204eW9OTnhjMzh6enVnZVo3SkM2QVY1aTgzRkZadU1yaXdsYmxIQTZpeW92bjJqZ1VwYk13YVdINkJBenBIMm5UZFVOS2FDZUtLMEZxVG8reEMyWmtSTVdXb1Ntdk5mQjc2eHM0YTJqaW80djY0ZWN0NGUzVmdLdHNrcEV0OVkyNkFMWDQ3UWloN2ZyOWN3ayt2V3VQSFJaTlBxTERxVDZORXVCYzZ5VldjUm5HbTJtMVhtVSs0VUtrdnBvQ0syUlFKVmc1S2J3QVpMUGpSN3lucC9zN0Q2WGI1K1kwLytZS0tpZUtQaWVodlpDVjhFZzQ4TVM1aG1WN3pacEg2bjVJWWtnaGk3akNNUDZ4MlVqTnVCZWNkcDB1WGIvRnhxWDlMVDd3NElaY1l2OUhOZ1YrUVB0UEZyVXlQbUloQWZxZ0k2cHRvOEd5NnNWNnlKN2dBdHJtSlQyV2xMWlZ3a1hLTlo0a21reW1XNnZ4SGdPUFRUd3Jnd1AyME5RTmROVG4yeVFKWi9ibkhEcmNBMHoyREpLNW5LeENWWjF6RE9DcXVYWTZMZTFDTm0yYVJkWFJOZzZscTdJYkFwcmlldVJ6cGI0SzREdnRtZDBtR1R1RXpFcDF2c0p5TFliWDNjZWJaZ2NPNzdXSjB4QWtiT1FxOWVEbGhscWFEZ2pVSDhmRHl4aHUzVEZwa1JlQUtrbGNscEk4emlBalBGejRKTGpHcVF2cktnUDNOSW92SFhUeXAxcVgwZ2lYWTBWVWNFSncrdFB4VUc2UU9WKzhUYUdvRDVtTVJZYjdBQVMycWxPVUpYcFNKa3Z5Rm8rdXB5M2FqYktyaWI0b2xJaDJTZ2pNNVF0QnBwVUxaRGl1NUVsTmxGVktmajJOYVlDZG5aRG9IbStGaXN1Q1VpWE5CWERweXBFNHg0ZUlFMi93ZjdFNHY0N0krelZ3S2t1V0Y2TE81ZWFFWjRsU0dFU2QxbmRTSEh1RHdGcjVMVkkwVmdWbDRnaWRmcytueENqNzRBOXdrTjh3S3lDem03VnJWOHBtcU5WQTRlOVJ4V0VscU1jcTBGejM4YVpSdWtnbDZhOFY3dWZHT1FFbXZnMmp2YVhsSStqRkNjYzNUOTdxM21yYUwybUNJWFY0LzAxL1hpbStuNkl5YW9kd3lNbXZ5b1NUTGZrRGliOGpMT3krbE5oZk05amoxUnVLd1pUWVJMa2Y0bXJlN2dRbkpOVUpvekN2bzRveTN1bmtRYVYwUUtrb20vSXJ5ejhBRVc5MXc3NFFjeVVkbEpFWnNnVk1PZGtnK1luV1hEUjJEQWpaM0RsS09tbDk3c1pLVjhKMlgrTXI5TWdZYzNFcjBRTHllZm9tbHhiKythL1hZblZVcFdBMGxrQmVEK1hDeUdmaWlGSjdoK2xKRkdnQ0IzaXFmUlAyQ09IZ05XOE5XRHAzU2QrTXpBRHk0WWZrcmp2YXpaT1JlU1VIRlY1L3JwVlpYL0ltN3hkQ2hMNlRwRkFhNTh5eDl2VTVHWVBpZ2JHMitXbFNQOHJySzZEYWMxNU1mRVhzVW5rWTViS0s3SjVQalhUMm9uY3VOdXkxUy91VG4wa3hwVUpRaUsvSzVxM2lMa3ordEVoUXNRVThDekg1UFBncFQ1aE95aTl4RnRaSjVMWTZrelJCOWNlWWV0aGRUeXV3eHdqZHdaVEQ4Y29tcEo0SU0zSXdQL1hMWUFRYUk4KzRiNlNGRWFka0ltZEtlQkhuSERmelRiWHQrM2xtR2dZUHkxZmh5L3d1YTlGTG5VTmJVNkxaK3o0OTllZ21HRDFNUUtaS1NERjhCVi8ydDYyZ1I5bG9tbEFPZ3htV2FhQWxxYXhmNlZXY1g0R3prM0ltbjNTd21LYjJpYnM5NTRzZzl3NmpNQVlBNjJpMlh0VUEzREU4YUJNQnBVdDBIQmQ1Zk5jV0Y1L3FSQWRyODVqSlVYWEJsRkROenN4YkFOcUdwajk1QjZWUncrSnlYeGw2WlNScnZ2dnNwNGsxMlpaRkNEMmFJRklsOXBvSFUra0Q2UGJMVk9FZE5xMTlmdGtRVCswUHRqbHlZVmF2TkhEOXhvVlBzcHc1NkJPNGI3M2sybGtuOEg0VHR6enJzYmROVDNudlY0bkpkQmhBaEhoQXZkQXJKemdwS3hEdjhPV0pnL0dnOW1sbytuUC9ENHY2Mmw1Z3NFYTBEV012OVVGMXVHMW8reGNRQzJIcTJXb1dGdUUvd3FUNjU2eG5kQlpWbEdsUmp0UnRoRUd1aTcxVG5HalEvZ2tZUWdwSXNmYmFuam5MdnBHeXpJczhzR1huVDdkSEZrbVMwN0hqM2F5UFUySFV6cklHSFBxczVsOXFxcHpzMlluU000YXJObGdoR0VsNXhicC9KY0N1cTNRSk1KNUxnazFpYjRNbUhiMytEWEtjWTlsNFZQaElKSGVEZjZWdVJwNUNIWk9qTVpmRW9qVm01aElBOHdYT1JYMWtqOEl5VHc2VkxJVXFtQ0hIQ1FKSFNYK2hkSUo5WkZCMEtZbWtwOHBob1FIak5MQlNYWW9lczlFeXJnUnNhdkxyU00ySlRRMHp3cVF4RFNXZW9OMUVicm81MDZIdDgzbEdjd2U5UDBvaDdTTUFHdUJsVEpsMWFuNXRDbnZpcVNMeXBqWjFyOWx0aVU1SjBVNFpRYlc0WCtGZ3RzMitiUTVUNVJ3RHdKRlA5eWNpbUFwNFFnQ3I2czBJRlkvZ1dSM2NYNTRISlN0eS9lUzB0blFGMXFJc1NiQ0UzeWlCMU9rbkcvODJiTDhTWTlyREZnUm5MM3gwdjlvT094NXRwS0N2SWxXaERkN25RaWx5OTF1YzhYQ0dpS1Y3Sk5OMm85ekhWK1BnL1J4bzl3S0wydVdCM212VE80dTQ4RmZjNmtKV3grcGlXRnczdWJ3dHhvTnNwYVlQSVB5Z3hCc29YVTE3SkZwMjRVMUw3M3Exc05uaG9wc3JMT1o4RTNEdUd2MTNwWlRBdFY0ck5lRi94dlJnV1ArMGF5Sy9wR0NPSDVFSmN4ZHZueFZkZVVINUc1ZHQyb0hvbkpYMlVKT3BRVzBibFFPUmVPV1lCSzR1bnIrQW84dkRhMityZU5kT3dHMmtZNytRczNyb20rY1pUUy9zZ0RRTjBTWE5waE9kSVo0WUh6ajlxTHRXUmV0WGQ5eHpzaVB6dWgzTmN2ejUxTVJRc2d3TEFZS0xpYWlVRDlFOG9jZ0tQTFJUYUpBTTBWQmlOVEs5SDlZODE0NkE3Z3JCUjZWYUpJZUt3dXp0dmtzbG5oVWJvUjE3NnB0aWZNOU1UWkhYdDZQSWxhbG4ybStnS0h4RXAzdkZJS3BBallPNmthVG82dDNmYkIwVFBrUWduMEhSWFlDR01YSk9aOVV3dTM0UVdqWVNnS0pGMlRURzZHSW94ZjhFRlBFbDNoQ1c2aFoxM3hCalRkZnlrM3JXR0NQMVp6QXBzNUJCaHg2aEkyblZSNnZSU1gvdURDR1lHczJhU3J1OEVrVVYzMEhMMm92bFBNV3VZWHJkNWFQdjRKdEFvNmlFMVNRR0lQdjZLdjBEeFNZWVZvWENIWjNnRkQwTUhxZngxVDBHK25JN2kvWkdhUWdSNGpxMlhrc096SXgrWXF1akZMNWkxTnZVeDU0bExLSmNWdGxyZlNkT3U2c2hZdVBWMTZnN1hrZ0ExaFN0ZSs5UTEyS2xqSXgxVGllYlZ0YnJ0TVlFOGl5WVBDQjMvUzBXWjN1WGJsVVA4N0VEYktuVmRpNmxYd3ZTbHZoa000SlBEL1RTNlh2VHBmODZ1dWkxaWNSZnhHaU9id0dmQWhzakhieWpQUk5Xek1QZFU4dXppM1ZkM29aOE5vL0hJRmpad2dWVHhrNm5CaGw4anUrQVg3VVduRFptZldmZFpyUXkybXFrOTdKSDdtVkxESVEwam9sYXhTMHB2TGxpWGJCSC9VQi81TUlPOUYzaWdhamZFVnZNaGh0R21BUGcyUStsQXJ2MzlDbGJGSnNMSmxwK3oyMVU0LzdFeFZYMFlVSndiNjFmYTBURDFqYnZlNExNTGpydlZJMUhLVmEzaFBacktmNHNpanlDL0YrWnhPaDFRR0NEZXVaQmRnaXNZd1FlTzNTdkszSnFjNU9ibDRQVWR0TDQxTVVTc25iTkRqTVhjd0xydStxQkxXMUdUYXNIdUF3Zm5KQlZkd3pseXhyejlHbHBTLzZUdVdxQkxuUkdWNVByOWJZa2hvUUdyaEpXUVlySW9sMDlpL2FVNmpoWkVic0hWT1NicjJ1M0ZzcUlVU29HaVdMOUMwL1FMUmhwTFpGTGZVUWErT3E5V3VLY0ZSUkRnMkdBUGlxU25Pd3IrcExtaEl0a3dRdW5rS3VYUGppeHlJdDl2dmlMbGJtdFhBWkNCTGFuNFFwR0hISjFXLzFlZWFlZTFCZzFEVGtiR09rL0dnSFJsWG4zMUU3S2R6bUQxQVV4SmR6bWh2R29IYUJpUEo2U1RSM0xodEpydTgzL0pYWDBJTFlXOUxUWmY1dERCd05VUUhYVjJqZXB1RTFDZHBFRm9jRm9QTUhleEVQaGJLc3hOWVA1RmtDM24zK0hLa211YVdMU01XeTZhSnA0YkFRWlBsRCtUSVlHM2N2aDVHWndjeVR3UzhmSnpHbGZDVFhmcklDU1BIa3NuQm1qZ1V2MVFjaGc0OGR5cFhKR0NLYmI4am9SOTA3RHVaazAvWkFiSzIyQ0dtczhjZWFwdzlsdDcwUjREQTN5UnlJSkU1N2ErQWhRM0J2ZFlTN01jL1d0aGsrNlA2dDJhU2U1Wi8wcjd4RG04dnZUUXA5UVFTNFRGWXdSNnFOY2ZydllRQjRhSGc1Vk9DVXAvSWdwWjFVVkhxcEpLc1NPSEZyVThrV01rVUwyYVJPQkhXcjZkWGpYZlQ0RWQ1b0RWTXkrS2Uvek04ZS9udE9WdEFaUmJNR2dGRG9ONUkwWkZxQ21mdEx1MFdRcytuOWxjQnRrUjh6NFBaUU92NVp4OFBPR3RTanhxb29ydGFsOWpsMjEwaVFUNWpzOE1YVGVQeGRhMi94Yk92d1ZPYjFyTkRKWDhHOVNMTldFeTd1c0NuZlJVSFlDeVo4WlBVc3dBc05IeEYveEZ2ZTJ4dGRYWUxtRmJNVUZVRytsUlZjLzBhandaMHIzTTFVZlZqSzRWQXZOY1IvejBTdGZKMXFzTWRaZzd6ZS8zVjJlTjBlNGtZL3RKNnFjZ2IyeENYNUNZOXZYOVJHNERVV0REaDVIcmhQanFadW1xdXgra2JCcGU3TUtwSkkzMzErWXZKTEkwcXlaTC9MUVpZYzhERXUydmNidmlIVUFyTUQ5cnl5QUtXaHp6MFJDek1tOUkvWEhMZTdLdUVNbkVzUFF0c252SXNJZ0EwR3ZXU25ZYXA0YldCZDlzU01Cb1Q4UjhTdCs1S25VSUFkZzQ2NlplbnovV1cwSmNiQWUwWXRHY3ZlaXVGblpQQmtmWDZTcWp0UU9haXplcDh3cDF0c2t5NThZQjVJb3JlaWVDNU9rcEcra0d4UkdIT2s3bHlmZXBDRkNQNkltS0I1WG5qcThPUXBHWk1kaHFVaXZIWEs4Y2pFc0JqK013Mm9vR2l4YlZXM2srSURiQzRjVXJCMDdrdy9OZUVNMnc1YWIrK2k3emloMTFIQklvUXUzck44OU5NRlJkc1JDM3RQd1ZUWEd6cHVJQ1VYZHRTZ1lUcnFGaEhMVU1aY2tuazNnRXNUaEhYeHhFdHhLekR1eWt4TEZFTFY3OXRpam45Q2s3eTF3RGwyQS9mNVBSYTBRYmV0THNqczBoVWVhdW9qQ20zR1VTUDVPUlNtQnRzakV6SE1UbkIxRTMyMys4THdLTXJVSVFGOEFHWkcvZjJUTWZ0WHVOazlNRHdhenpBNytJWkh6bkg0U0xVQSt0Rjd3cGtDc1B0SmpxTkE5Wi9xZkJ3VDdsQUpldC8vV0F3TXgrYWM3UjNwT0JVUG9YZlZsNFhQK1VjU3pFdWNva1BSUGFldm9WdnptS3JBSVhVdXRtbW1GNFFuVmhhUVhIaWVLcWJGVjlWL0RaZUJvbUxOaGtscHdRK0djbzBuR2E3WWQyTE4yem9tN2pYVUpoOTZBZFQ2OTlYenFtSFNFZEJQbG5CQkZjbVhkU1pHN25DUG53UzJlMURvaXR5eXJ2MVI1QkF1RFBOdDIrNFVhRlJPK3lhc1FtTTQ3WmxJRVl5eHZTbVRDZFlNMW05WHJ0U09nQWhBQzBIWE5yeWlwUjdrdkk4SVp5dE12bmltaG43eVhUaWN0UER1eEdZTDJBYndsV1I5TC9nQ09BQ3dXNDlndWQzbWJzcDlITHZDOXk5b0o3NFhHOGZLZExtT1Yyc2NjTlI5L2F0Q2FUb2piZFpmd2VCY2pYbXk0V25Rcjl0RlR5K3l0TU5Ralo2RFl2clkySVFJWDY2c0RyN3FDRHFwMVdXd25tSVprUGMyNjBlNHhpUmlodkhjUldVd0NrTTRvRy9sb3p1U0xRV0U3c0VPOEZhTnVCa25ZNWtuWFBCMzlkLzFKY0UrdVNIWERxSElrd3p0eDVqbDliaDBZZzl0OS9ySUwyWSt1ZzRQelhxWmFCWEhROWF4M2dmZkFpWTMwWjkyY1lVN1N3L3p4ZXhhWWVLQ1JTUmVwQ0Y3UDc5WWRDYlhDbWZoN2FvMXFLUFdNZEhmSEoyc0hkVUswTVhsRXJCQ1E4T1d0WUxScThYSG5vUTV1NURNRlhyZ0habzduTjNXdG9MV01UZTRETHlhRjVISGZqT2plakF2R1JTZ29BeVFMUmNtN3dPeTA5V2NBblV0QUZUbGhENUdldVh6ZXYxL3UwNjB2NitTakNBK3JlZ2pQaWl5SDlVSTNtSnViYnc1eFhYR2FwM3YrUHlKOCtYSlVMWFlHTU02dCtPdUdwZ3FpQUFPOXJMQ3pYTXBlVnhDMzdLSlZsaFlMNlhrYmFQWWhVMWEwS2YrZHRoNXl5VlJ0bEJGa0ovNXJVOWV3YXlzczVQc3pReXV3VXRCYkloeXBibVpFaVNrRDRiTkJDSEpnZmtHTDVUNmdmNERKaVA5ZUxqL1cxUmFhQlZFa1RBcEpMa1YzaHBpeFpLZlhWZGNlT0pFVFFwUzlSOUY5bzdaak0rVy9mSmE3d0Z0eVRmMEMvSi8xOC9JTTlZWnlwaDJqRFZEelhjYlJOTS9PWk5JaGZGT21uTHNoTVlBeEpZTEN2Rk03akt0SStrTmNBZTBsOVBlZCtScHBiSUFmQkZXeGd1a2FTTExTOEVybmdGeUwyYTFSaG41TTdDMlRMQjY3Um4rNEswcEY2cEtRdjNVNk51eGF0NHNWZGFiUXhWeGFub2VpY1Z5Zk5SNFBKYTZLc25VZTErdVBjMVYvOGJwY3EwMlRiZEh6WWJwekJIaUtjOUQ3ald3eDVBVk56eUp0WXNpK1BOZWFyL2Q5dUEyaDVWMS9mc2JROWtTZFBjTjdIdlNrNnFhWFJWTk4rbjZwVVpwbFozR1hUUkZyTXpUYUh6K0lhcW1wdGtNN2FmZlZzZXRBVlNkWXRPV3V5d1o5ZG02bkg5N3FucTV3TXE5OGUzWG1LTml0SUowTHJWK1c4TG52QzE0K3hkZGdEZGJGM2s4TjJoVEx0eXcwZTFlc1JGZjRrblBuSXBtSFV1bTNNc1FlNzZVei9EeDlUWTdWdnFBVXJQbTlyUTFrT0VlZDNrQUdjUTJpcUhsTUgzdmdDK2hqU2dWUkExZFpXU2d1SkFxQkpGZU1GNXVuZzlZSU5WVFhSK1c5OGFLWVdWRUxGay9HT0QybDJXZk9IVSthZzdGeTVDS1N0ZXF0NFc4Qlczb0NhK2FmOW5wdWpCMlZYYlQ4NUFwQmZYVm0zNU5MYVYyMzVmRVVGbVF4cWZha3dadFQ2R3cxL0JQLytGdVdaSWg2RGhMUDh6ZU43NkVDVmM4Mys0cnJveVBPN28ySlJvUmoxcXpqUXdPT25sVmg5QVBwTzc2TnRKNlQwQjZiMEdZY2E4K0NMWnQ0aUp6QXJUNmk3dTV6bmFtL3RxeTI1TXhIMkQ5Y0JrMU9FUFlGQVB5d3dMMmsxUDZQSy8rbHBFeDFOSHF3Q0R5MHFjQWNUWUpZZGQ2OG5DNk1KY0IrT2Rtblo3QnAwK1FZSHh6MHBGZlFhM3RHUWx1cS9HSGFldlpBd1RpMCtMYVh5NEtNTHBGZkRPbjN2TVRWbFZ1YTJHQklYSHJjcnVnSyt6MmFROHlCRWFuRzRXOVYvMjU5WUVuR0E5UnNvdUZTK3FBQkpsRlJ6YUQxZEJEaklXZkVWMXR6QTZBZjA1Q0N2ZHlMSTd5eXM4RFlGY01rbis0NHNaL09ISFE2c0hpUHI1UlNweDRtUkkwemNyQmRlYkIwemNIWVlnOVVsb2JyM0g3d2F3UlVXdk80NEF4U0JlSTQ2djlWaFBIcDQ1eExLR3BzZGszb1pPWHhFSW9OVmVYRlJIU3BzLzhaSS9jb3l4Rk1xeG9HVXRqL29PeURzRVMvT2JyWTBuSE9LUGVpVGlWa1NvN2RvZ0lxQkJ2WktLcXdjL3hUaEtHVU41WEJKY0FCdlVuS1pHWWxRNnN6VHJVVGV3cnFrcSt1S2tNbllXRFhDSCtEa0JlYVpLcmduTGMxd284dXAvUXRSVVZjUVZnS0xMNGV1elZSdGRXTmM5OEpPTDJiOHhKaHB2MXc1TDYzN2FTaExYRkFmSWVOQVdsTW1EUnUxczAzaXRnOUVaekhsck5PazcvamFPRHNjNlFWc0xWODNNeURnVzIrSHBUNkRSTUNKMy9odVJUVG82c3cxV3RhMU9LL0RvMlo1VDBncHRIeFlyem4xSHJ2S014Y1BTNVZCUVNKS0NXT2dxNmg0aDJYTC9aZjc1VFQ4SFg3SU10Y2V0b2s0SlFDWHBwUVlqelpnMDZZTEZYSXVVM05KMnlSQ2U5cHZuZ24vd0NyWVhIa25wcmpjY3JmY0ErYU1PV3EwVnhHa1RrcytLak0rdEwwcUtaUUEvVkdsN1dRbFV5Mk1UajYrQlJEdkNiaUE4MG5xRFJxMmhsVWw4azM3V055K084UHd5QjcwLzZyd25GMFN3dW9HTWxPYWFqbHlucTRSbXliWWNMNDZTb284NGY2a1NoOHpnNW9ZV21iSEZpQU5Ud0dxUW9Ja1VVeUxBZkMzQmNZcm10cFdXSnBUSmFEWUFLbnhLRk1icW1qaXNpL0dod1VvKysyczJNeXYvR1ErVlowa25uc3ZvQWdDZjhtaDZ4cDkxbHI2M2h5RFhhN2Y0VUROSytGaWFYSjJQWDR4VmRmS0tLa08xd09pS0hKeHFFZ2pjSlJMenpaSDI2Nmg0b0NoejhhenlBejUzQ29uQzlRWlNBMWhzbEZYY2p1QWdYRDRPRUxoT3IrWFZCalBhQ092djRueDRtQnVtcFYrZ0RXYlFuMlRLZnlmWWQ1QTFOclcxbEFpMnczT2dEblJyMXBnZ0VqZHZ2WkhqL3EzT040emF5MU4vVXdNallVVng1eTNHZ1J5VWdvMnhXdDJsMDNyTDBYc2dWL3BhZmZ1bjg1M1ZsREZMVjBoeXZGVGUvVGp1ZFM0aHJRL0pVaDJPKzZZK2xzclk4VFUzVlJ6WlErLzg3bWF3UDBMUVpEZ3RSSE5pK3BvejlwM0dnYy9jN1htdkxBVUJlYXVMOTFHWlR4bE0vTUpqN1hmRWZhYlhWeXNTSnBMNUQ5c1NzM1NuM1RDck1qWHV0a05na0FOMVlBMThYV0FDTjlHc28vTTNnZlR1NVdBaC9uWklkRSsydGxKTEVoVFZCRVk0TEtKb0wzQ3hxbThvWlRTZUt0Wi9EK2F4K05YV044VEpGZzJFc1NMa3pDRGhQcEhjaDl1RHpJVFNaWVhWZGVCajZjRloxTnQvUmJFcXZFeUhuSFhPSTd0RkdhbFlTVVRQQ1hjVUg3aTJlUW9oeWxERnFiU0FKWjBGdmE1eFk2Z3NLUzNNMmFXbFR4NldUeU5tZDAxeEFTSUw1Snc1ZDRCSHloNDZwZXgxaklXQis2b21qMjdDdG90bXZxMCsvbVltRno5RU13UWVZd1h4cm5jMCtWdzRsTWNXSDBtVTFXQTUrck5Hc2M3MStkTkcxd0k5Smxqd3VhaEZXU05ZdWVDWFlXdFUxTG85cThmbTY4RS9vQWJxMHY3N0xKN0RZb2tRWWp4RTAvZ2dQZ200K2haOXduMHBMLzRkR3V4VS9pdGwwY0k0SlNBUTQ4TUZ0c1pKYmxKN0NrbEhqQXBqUzU4QWJBajJYS1Y4VWN2QmFaV0Qwc3Y4SGZSaXFYMjNDTWNMNU1GSkM4RVIwWm5CVHo3VnJiVFE3K3IvVHBDNFhycHJEeHY4clF1alpZQVJNWDhFcWsyaXhpZTI5TW41UnFBbTk5R0VycEJ6NGptL1Z2a3UwU09xa29NU2IwVFN5M1hPdlVFZ3p6ZmE1VXBydmloeUFMWnh6Z2RFeHF1d2xRYzY1NEJFaXYyRlNSZGJwT1ZQc1J0dGtnMlFxYVRSb254Wm5aNy9naGJYS3JtMVVYVHA4R2FWR3Evc0M0clc5TllHMWt3bHZIMlMzaXlRKzc1bkp3SGgvd2xhVE5PRmFOMWZLMEFnd1VYQUtnUkR3dzFGbDRabmdCaHVGZ1dKa2NSUHRiazQ0T0xhNlBFZThlMHhQSE5SUlJSYWVSTndlRm94ajNVSG5Vbnd6YzB5WHNKVTI0ZWxxU2lhVjJta1l6RlJqbGFPZ1ExUDF2eGQ2M2QzMW1WbTRTVkI1ZWlHTEUxZ1B6MzBhRldGbXR0VFdHR2orSHRoM0NDNUFIbWt2RE9FeWRRbjNscm9HMUdKZ2MwZjVzbnYwSHNSU2J1RVhjVHRYbnJNSlpPb1JBdWxOeGFTWVhPY0JRRDNSeHB2L1V1MUE4YlM4YUlCTVZjcklEamo3dERoM3YwQ2lQSVFEL2ZUN1hTelpnZzI5NjZJRXNJZVBNdTBSWVdmaUhuaFB1SWk0MTA4MTdnc3A2YVAvc2pmZi9YRlJ6Q3kxdzQzVEt0ZEg3VjNOS2R5V3hSS3JtakxKNHhvRm1nY290SlVJYkV2dytCamxwNzREL1dSVGl5eFlMeUlmRnZiT0djV09yeFF5TFcyT3NsYTZFeE1nL210eXVQeHd4NGwzSXh4a1dSUmltbHdnZzlHa2hhV3NzdHFyR1paQzVGa0ZDM0d6ODFVKzlPN3Yvelo0YUNJTTdUaUNHMlFxdFJwWWpZdklqMXg5Y2V0ejg5TXY0SkNKRFNCeU1rRUZ1azQ2VkwreWNMbEd1WGhwbXhxb0ZjU0NqV0p0RW5BS2RXV09nWVhienJTUFVPZ1pnd3FTZnVNQ0RJTjljQ0dKc2pnc3dpSlhNaHdTUWFYbGV0KzBVM0RnY2JQbjZodkM2YnZEVXdqRFpsYzBnTVVuSFp2RXN0SXBXTFhJLzMzbENQckpzQ3pra2twcy81OThIb3dMdUttMkVRSlFXQlYvU2FhZDlyRVR1NEVkbEtZd040UTE2aW1PRkdHYVlvcjBicExxeTZ4RVBEUytKZndMaHdaakJPbTdwaWlMazVhT1JYcU9pazVuTlJVa2VuNVFhSnEwckozQlRrRUIvd0JxREhyY2N2VHpCekx0RkpsUzZUTm9VZlZJTmdVc2tUNlNoMkh4U1p1TzM0aXhtb3kvelpibmJCSzdVbmhsKzY5UnlPeEwrOWJBZ3NpNE84ZUtpc3FmclBwejBIR09oTzdYTWNSaUNHL2M0OVoxbXdrRzRpcDc1NmIvd3VLd2wrUk9pdXVsS2UwQWlFQjRXWHo4SlR4Rng1QzhRV1NkM25yMUI4Qzc2QXhnK3NQSjNEQUpEL1ZFblJIWmlsQVVHb3BKYjN0b1RucGhUUEdNdnpaQ0Y4bDRYZlVtZFo2bkh2TGtDV29hdWsxd1RpNDhrQUNnRUxyMjVnN2xtWmJJZTYzWHdjb0tQek9mbzZrakhnd1IrWFEvc0FmNTNzL1ZwQ25TaXNlWFB2WGdteW1ETkNRa3ZNZitCQlhRaWVFc1JRaHExYXAwWmRmVml1bEpYTjdTWTB3NEJkUDVyNFlxc25LWjRVcEFRV1pUNzlOYVVwbTh6eTBQeE12UlpBeGJMMCtvVlJWSzZlWElEaldnRmlkTHgvS2ZiQ0ZHdSthYmcxa0ZVd3AvMVd4V3VKcEttalpqK0VnTTZCMVExdFN3c0tMaWpaWXRHejZ3VU1nWHZPOWE4VFNsZTRVWkxuY0xVTDNnZHUrMDlGeDRjT05QWTZISENpUHBHV1BkSnpCWUVDTUlFUEp1dTdRVUYwMStzUThZRHZYV0NPekxvZHZwRm55dXlCeVJ2a0JrT3F2VGFSbWZhVnBzSng4cFBacWlMS0dqa2c4MFdpN3FaRmJJYVJKRHRlcVN5dFJYeDc3bFg4dVRMc0ptU0ZoOTl3TjVyL1lyQWJIcDRmVDF2bzJZSEdzZnFkSkwycXE3cGMvaHZBQjJNaXRncHBhWDZ6NmVIb0NiQlFMS0VHeEtiaVVtVElyaEF3cmxTZ2ZUeDFYbWVXUEV3b1E5WVNDT2xSeVFkZUtSMTUxQ29PdkVuV05CQmNxdVJURU5zQXFUQWxHUjNLeEE4ZjhIVEkrYld0MytEY0VHcWdrampRdDZOT1YxcDhzWG5FVWpGU254S2pMaFJLbUJpeEtvaHk5NVF6Z0c0eGJjVlJhOFpsUm9NUkc5NVpKOEdZak4vVmtyR0lRMEgwM2hBWXk2ZUd4ZEVQWFpWYTAxc014b3g3dUhjNkFDQm41eTdIbTRCZklkcW9NSzdqNTZ5RUVOVlUrVmFtakN2NEtxRlArWlk2TlhaUThGVVZaOHpSaUdoQU1TaWRJbDN2R0YvUW0rcHhTbkVsS3lyY0hCU1hESHJXeXFSUjA5dFBzQ0hXOFkrZ29HQUtrSU8xbzgyVXpmYmNlR3h6M0JTZzhPQjhtdzlqT2JqZE9mNW1lVEhqYjhUNFhyMmNyYUZBZE5qcHBNaWNzamlSVXRjendPaVdKbzVMWkRCYXpCV1FBUjk5T1V0eXhldmVDVDh5YmlwVlBMeWFaNTE5akV6bU1PRGdzUFZ2U3hpbDBJQnVmUGhIc2VMMHNvNEpRZk1mTWNnNjVOYWdPdVNhNlBMMSswQndWQUNrR1BnRlZBa2l4NlZNajJVMXBGYjRBMFpmQ1FMRlV6MkhZSFRsM2o2N0hMazQzV1pTT29WL0x1b1UvRVJRUk5yNjdNWC92SEE0M29uOWVlUzNMbnFURjZWTkFKU25xYXZteW9JV3c2WXZwYkpkYXhNYlVVUmhpOG5mMHVOaU0yT3NXODk0UUdqdm1sK0twcGI1VXJLeS9VYnJTOGRtN2ZYQUNGK0FiZTBzanZTSGNsMC9WWHUwbmsxWTZ4RmpTeTdRSi8yaW1wdExxZDdRMjJjK2VQZXJ1VURkc3Q5eXBQWVQwbnFiK0tZcHRxQi9pNDBITU9mR05Jd1ZDcUdiaDV6ekEvVzBjMllJcmV5empMV3dwNndPSVNId083MFBQNjRBNkFNd3U3NE9GNTlud0RzSmJaeXpPcitmcFJ4ekE3Y2s1Tys4OTBaYmV0TEk3OEY5V0hmYnN6TWl3M2JsTUhSdUlyWE1MYjJPeHFvQmxlYUJta0RkZ2doMjE4SU96cFUxY1E3Ni9MTjJDRW1oRlNtbTZPUlNib28yWkk2cGt3a1lXUjdXNElQNzcyTklEcW5XZXBhSjRRY01obUdyY2Y0ZzRZc1JwRnVwdnAwUzUzS1BUWmQ4TnNRdUloOU1XV2VFMXlwRXpMRVVPbzBPU1I5WjJtY2NWVjEwOHRxS2lkQjdHVUdRRW1iR1ZMdTV0RGJJQUszZWVJUktOd2RyajVQUEtvdlhqUThWWmZ2ZWNSRUtoMHBXZ3lqT2xlcXRkYlRVLzc4UnVlOFU3bm9xckRoWXZwbUlEeldzT0FiTklPQk0zN1I5T3lJYXg4K0t5d2FEOWRCeXRlc3VyaXJXS2lzQ01zQ3dHOTBwYXBVQm8yV2V6TFB4WFFkbW1lZnNuUHIwMjhBcWdVdVRSUFpURjZQdzducWZJazZSSmVPZktLMmpCVCtITVh0WVp6NmJxSE92UWhZVjBSQmFENDVZQUo0QTZwWEMwSXJuazRha2FncDFOR1NNYjlkcEkyUHZDSFRENDhzSnYxK2NpTlAydlFpVkdtN0gvZ0NCOUIxdzg5MFRXMWFXM0ZhS1NjTTlac3lRdnFmYlhYemZQUFlqcGJiYUwrdUJWS2N2ZkhGUmhWbW1EVHkzQ2tzQ2U5dEY5MDdtNHEwWjBTa0dsVm5sb0RvV0NZWFZ6VUdWbTZuWS84M1BsbkM1OWRzbGlxSklsQndFTUw4bmlJUm1CbFJiQXpUd1J6L0hwU2I0Qmtsa28zd2lnam5hc0srUWVLbGhlU2J0WW1lMFFBNFZJV2FIVkhMbWZnd1cxVk16WWIvMHRiSDFFZSsrZ0JtRHVrV0xsRWM5OGVXMmlPR0xhSkQ4L0NNNWl3N0RoZmFvZEVLNFM2MEt5Yk9yTzltMTc3T2RkYXgwQ0ozVDJsb3Frcm9tQmdXcGsvYXQwSmlTVldDK1pCK0ExdGVRYU5OL2tic2FQS2cxRE5SZFBNNEN6Mmlma2xmcjR1elpmTVRWZC9MWGNYSUxqSis4ZXNuL0xtSjNhaGY5alRJcWthSE5ISXBkeWZrN3JEZTdZcFAzR0dOUE9aSkRvQjFZb2lWckhOUmdka3UzY3NXamtyaVFGSUNJaGZzT1M1WkwzZ3VkcmZjMXhDc2pBTW0zczh5L0EwTk9BZ1JCZFpaMmVLeFJ6WUVBUVpOeUlMbzR4NjRvd0ZwRTNrcWNWY09XWFVuTHZDRXZFZlVNTEg0UitNcXZMc2FMVXcwa3docTNDUjBsQm0rK2hIVkdJVTQzbE42d0lZMFR5VkQrdzhGQ0drVVkzV01LN0tUU2t3eGNmSFBZeWlEN1RQNUswUzZHUTF4L0VSZFo5a29vLzRPMDFNZTdCV2tqaFMxWjYzUVBHbHI5dlY5WHVPNFpqcVZJRWJBaEZFVFdJWGRoa3JyWG5BdmRlVmp1R1VhOEozZHcvb0ppeGVUc0szeGpQeXYzRzFlK1NDV2Y4YytKRjY4KzB0VlY4TWhyTVU1bGc2SGFXKzlPSjJOZTFieGpFb1lPamdqamFVM1dUdElvQW1SR2lDUTdhZ1RFRHNtUzVrUGdjdVAwcnlWak4rK2t1SVpCYlgzUXRybVBvYTlUcGkxcmpNbVorNUtBNU9ZYUcrY1NES1NRQ2gwNjZIbzNXSkpZM05XRjZ5NElSS29nWmJkanRwOE9nYmVURUtDaVlGcU9jRDJtTWxyTXp2cTcwUFZqUklKc1BXYmc0dnpPeU9nRWJGaWFTSFpIaCsxWmlrTVFONko4Mm95N3BFczVjR1FodEhCSHRjOXVNWWQ1c2FWbS9mdUl3RFg5L01OSUd6LzNrcGxiMmc1V2p0T2JSWXo4TG13RFFVMjFhaFh4V0k4b2Q2OUo4MjFnMmw4SmRtWERiaEtlN1lqOUprWHdYV0hNdGxHWTFueE91WjdpaGFlWUlYbHRNd0hPMHljZi9WTlRZcytzNmREMFRteXVURC8wckRJRHJoWFBHRHNxUTk0U09ENUREMngzNUJlaE9LUk9JbVg0QjR2MEQwVDQ2WDVSWHZGNGUxSjNtRHlaMnVVcWhKVkFFY05zeW5mOG82M2F6bWJkVlN6L3RZcUZHdDhDMFVRT2tlTTV0SWJEb0p5TmpHR1FjR05LMWRBZTZWekk3R2sxRnplVjhydnc1VkJtVXFhUHpXNkxKRHhLRjR6WjRKZ3JoaExqZ2RjTmhyTEhYRjVBWXVzcTg5QTdMTzNyZlc0V3RpM3Y4TkM5a0pkTWVUSXZnNEtJamtCM2Y3TjQ1ODNtV25oNXRoOFhzZmhGWHA1OG1ObWJXc3pLZTB3cG9hd3pmYnhZMnl1S21oUkFEU1VPVGUxdENZUzNqWUVQbDZ4Z0VjZUplTUx0OHY2dTVvRnhodVBWR3NpZ0FySGxhUlhoYWFsczM3cVU2cFRhMWRrOVBIOXV5eERKUlM1djFCd2Vncmp0bGMyM2hGSS8rRnppY05iUEtFWVFoMDljaDd4SDhvcW1xc3VEWTVTczRtNTVpeE16MVFKeTRYN1FKZVlDcFU2TktxS0NMcDh4YUd2UlM5SzZYdUpYUExrWVFrbnhzV2xqV3E0VVRvKzNYcXFpQ1laNFNCcFBQT1MzRkVPV3o3Vk5rR21mbkRFNWhiTjUzTlJON2s2bDNIZW02NUVsSjNxcjhuSWNJQUtLbElPV0RUWnJxS21ZV3BxL1NEVk53OU1xT0NIV3cyTHFtcVZPelBoV1RmaHZYV2p3WjltN3VMUjdGOE1PSzRnOEdqU2ZxVUc1VVlqM3hiMGtuZEVXTGNjQ3pCZGIzTmRHektONkhRTUhTRFROSmRiRzZILzd4UFFsbGcvaUNNVVZJUFBTcGp2aHJSVzYyWVFSdU9Pd2c0Q3p5M0Y2d0U3L3B2MEZXTFM4QWJsSGVZckNEQnMzWmRYNVRGek15ajJjRCtwbHBGak9EdENLY3MvVDg5TFlQT0tHeWF1VVMyS3hMK09MbGl2VDRNeUVRYk0rcFJMSXF4K1g0dlhBT2N1MnJReWllVmcvendIOFRIRlBZZEVzL1A3djQ5MkVqdGU4KzIzd1lMdzM3Nm50MUdrYkZNdVlBbzVkSmVaSmZZbHpEL3ZlZGhiaUJRNno4SG93ZFFVYWxaUUxYSkdZd3RocjZJZGNmYURZZmc3WGxROURuQU9BRysyUlF6YW5JVHJYYUw3dDFRTkJNN1U4aW5GcTlZeGFRT3lzRUYyN2tjTnByVzBreTk3Zys2ckszUTI4OFMzZzRSU3pZejZMNVRvZjFFQmsxYXZwdGM2emJQUHJ0S1BPQmxpQzZiTDEreGt1TVl0TFFDWFhsVDdubUdJWDNSZ3gzQkFxWnNRR1dSUkZ4UWlFVis5bU9oeVNMWVJ3SWQvNUloYThHN3RiaWhTRzkvbnlYSFVrSUVYcHZhMDAyK0xSU2tpdEJIQzY2WFNnUk1xQWhHR2NpOUNVWUREV1BOYTVxbm9kZVBKQm9sUmthSkhsR1BvQ3QyUTlRaWJTS2wyT3d5b3JLQ0JiRGcvbzVzQWJXZmFyYnVGclF0ejNQOTVpUjVOV0NTNHBEOUludVFCd2xjMlFoSVBUUmUzKytYWngwc0ErcStUMTdWZnNYV3pVZWx4eHl2b1E4emVMUFMwYm51MjhtT0NLQWJFeUZhbUFCSSszRUpJOThndGR4RUpKRlN5ZGRHdHhPYzEzaXArK1Zyc3hmbzVlZldqYU1Jdjh3QjU0WVBZR3FHTXdBdTV0RFFuQTUrRXU3b0NaK1JCMVBhcjludVdhT0F4L2FVZHprc1hHc2o5dksySHVWUlZ6UWhsUjc3K2lhSTZtZ3NOMTluYWJ5dkd2U0hFbWhBREQvWWtmL0NGMnZHU3MzL3JNQk51NHVuVHNYcXQ1WTlyaEtROEdYeFdDY1U0Z3NrNlJFMXBhM1FSWmRvbS9SQXl3Qk9vbEFZSHBOVjdiUTNid1NTS1NjeWVodUlyMmRuMUo2YkhjZ0NrbHVZMVNHUk1BeVJUWTNNYit4emk0a1BaSVNIdkhDVWo3T3lGSVQ5aTRKTDR5Nm1FaW1MWVFsQU5OMGwwR0k1aGt6UXJkYSt6elozU01tV1VhM1gzWTBoQnMvcDVOc1RLUXFDdXhod0xVWFA3OTZXbGpabnlLRHlRenVOc2RFckpIbHB5M2dvT3BlQ0EzOTJkQWNBTnBqZTlyanR3R2gzUzNGQnhMN1RvZTEvZUZrNVdmOTNRVzVpSmh0TGJucGllVGFtaEdqdzhSajEwRGVSSFFDR2lXZHJreE53WDR1ZW9YYnpsSi9RZmxVZ0hTMXJLczYyeUs5RXdKWm1NbS8rTUFYVSs0dm1IcjN4MnBjcncwUUZHOHJhVWZmdEdGZnA0SG5tMXNKaWh5RDFZQ0FsbkErSzF0U3dIbUtoOHVIUU92M1BUbldJc2NDZEFQTjB2RG5jSVJ5aFZhWFBxVTA4c3JEcmpIdllZamFsOXIrU1JkVkJpcGVkZHpxZ09MR3VFZXhVWXlralllaytqZUMyQ3Z0K2oyZCtidit1citqVjM0ZHM5THZGUisrbVJyd1BVTXpHWmU3U0JyN09iYUFwTTNVSWJmbTVmWFZxSHVKd1hkdzRuRWhoVEtwZ0hKQ3k2dzI3akxTOUpnZDBlcTV3d04ra1lBOG5RbkQyTUIwMXU4czg4dFhUL1QwdUo1WjRlZEhrdVo5eXo2VFAvR2ZoR1FIWW04UTZVU0hFQUFwcjVRVHVUQnh1bDFNTm9jUDQwaWpERDgrYzRLZWN0ZDhMREtET3RxNStFVTV2ZXVhTSt0TzhyTS8rU0dNV1RrTUJtNEpBYU5ORFhZUmlDNnk5MXBVYzEwdUJ3dnlCTFduMDFLTXJjNm9xYzNYS3hLc2Y1Q216T2NqKzVZSlRBN1hqbjlRTnRrZThFRjJKU1RVcFhLV3VYbVR3TEFSaXRoTzZzYWovNFBEYnVwTUZ4clpBWUVyWU1saW1RbnRWanlBTzR6NGlVUzhhYThacS9kY3Z6QWkvSnBPSlBBZVJtWnN0RzdOVVBhUFZOVlQ4dUNpaFY3N1dZa2dmUWFRcU4zOFhERnR2T3FmQ2ZmVm81UkJEazZPL2RYeHRjVkhBaU90VGs0NVBCdEIvVXJLSDY3YWhwM0pYNTdCdFdXd2pWVmZlMzB6VFIwUTJ0UXpOUHpLdlVxLzhXVEFYQnZ5dnZvc0RsS2d5QnIrQW5ESVl3T2pCVGJOb013OHN3R1ArUllQSmFXOGY2QldmT2hxOWM0RW1POEl1TUFVMU9IVC9PWStWVThLYjI1cWg3R2VBTExGU2l6YXNpU21tY2JNRTFGY0dQcVNjQkJlU1E1d05kU3NXa0RXZXRYendDTGV2OE1JL3RPTHo4WkFMSm4xYmhkckczTkNvV2c4UC9nM1lORklvdG9ZbzJhUGdneHdjV2pRZUsxK0hNKzVueGhHaGdOcGNpeVIwd1BnNTdRYjgvWkd3MXFWWmtQRE1TM3hpK1JzR3lnSzlkWEpNK3NXMm5IaUwrT0NDODVZUkpVWjAxcXVXSXBjZHkxWnRGbktsaVlEeHNFc1RBK05yQ2JFNDI1ZmF0YXpLek04WGtZcnEwbXFvY3dPbHVPN3hicXUydzZ1OFNpdkpOSmMvYy93QStWZUJoMzlvLzV4UE1zZEgrS0NOam9CSmh2SUpSYlNOUXRBVUFmcXZkNjJKWVRTVUtodkxRdUE3TTRPalpFSzBQV2FPdU1YTjM5NmlYd0NoM0tzUGdocTJLSkhBdTh6QThGQlhxMHVGamN1citWVklhU3FtVGhTQmxkY0xCWjVXVzBOSERQYWZYUk5ZdXg5bHAxYTFsTitON09oNWRmWUxWaCtQb3c4T0cya0lQWUQ5R3h4bVcrQjM0YjNMeThva0JOOElkVURHelBiNCtVQmNFS0lWaHFKcWNMTURtSFYxWG9yUDYxZ1o2ak1TdXBXY1JHcDBsMXNqbFpETGZKTWx3ZCt5MmpjQTkxeTBvY1YxWW5IZ2R6eUhFcGtBa1ljazh5Vy96VXZlT2NVWE50Y3UvOHI3clMrSmpHbGpzS2JZZXhpQW5xTEs2dGJXa2NpRC96Rmk5dENrS2c0RWw4Y1lKMmVnRVZmQVQyd0xneDFsWkpxZURDV3lwcS9mQUx3RU0yakoyV3ZwaGNuYlFtdjZKUEFiVHRzenM0V3FJWUY5MHVmaUZjc1UyWmg3d011Vkx3UVJzeEJ5MzdXSzR3VTA5MzNjWDVjc3BoK3poM1ZGNkdFeGJhbUptTmZqU0pyTGlhNS9Jcmo4OU92YWtjT1ZTcmdNVWtpWnprQWhTZCtTK3MrZzgzS2NpNXA4QXhKa3JtMTBGRFhkczNkQmNiaTdWY1NtYnlWNDcwYnd3Y2E3bHdQMURZMmluZzhLNkZ4dVBkbzUxbGFtUDlrZFRPUlV6Ylc4cFhtYXgwdE5OV1ZGejVuejM0MXJGWnVpRHlYSFpycW9wUGVBMDRPYnA2REp4NDFwWWZtcUd2cmUyd1lKa2RBbjdWL2dWM3Qwc1BMeUNESUVPTlB2cmVPaTIvNXZyNlRrbVYxcUJMaGgyNGFnUDdqclN0and6Rnl2YkpNUkw4cU9YK1pBMERYUG5yQ2U1NWVuNks2c2JaTnd3aGQ5NktlKy83VVI2M1VKM0xyc2pBSVJpMUs3aFZtV1dxVGV4UzVQdnR2b3hJaHN5OUpTNmtmNnpJM3NuTzlOOEJsaXlYL1hmU1JBdmJYanZZQnQ5UDBST3NGa2VJMS8wcGxkOW4rdWVkWVZuVFZwcEpoTEx3b2h1UHVGS2hlUWp0dnBjaWpKZ2FXSUM0bEtpaXJsRk9tcDVJaFRaUGVmTGRKbHJBQm82bHZUcDRRSmR1YmNoaVpSMGpOUTBhMWVENTRzcTAwQzdnVk1HSndPcW1Zc3NPQ3J4TXVISjBscHZxQWNqeHFTZ1Jzamh1d1VLbmRoUGxnUFFPOGwvbFIxa1dFZGl3d1JZMFB6ZXE0UGdrQkVhY2ZQT0lQS2NwZnA0Znc0WUtyOUxDVHBCb25SZVlWL2ZDRnNvRHFEY0Jhb1FRNU5KOHlxa2Q4czF6K2FMRjJvZ0l0c1Axa3QyL0F6bTgyb1czNzVMV1RYZkdIaThzaWxIcFdQSk91STZ2ZEdWQlJIMXNwUGdPeDh4NEV0L1d2ck84S0pwOWZNVVpqY3AwcnhTRXpmUW52WGpxTSs4Z0Nid3Q1YlZLUVlMcDMzbHJ3b29NVDZxR2VjZzJ2MkVEaEhOZ0E0VU8rNk9oaVRhZ3c5NFpOaGdSNG5HYVYwUFdkc29WeG1EUEg0TlViSHhMQU5pT2FnRmpPTmJibVU2ekswOTJwR1ZSd1oxSWVkdmc5eVJyemdlT0J6WVRuRGpGZXQwNk5MRU5VVlBXTzlQMCtDQkdYQnF0M1ZoSm5oOHBuWUx4YzBoZjUrVllDa2tTTkFqV1RwZGFqblkwNnNxcW5pQ3FwNzhmK0NqUkFBUDZWTVVpU1RvWmhBTU5DSEo4VC9KRFpRVWQxemVJdlBOeVArVEswNnY4U3FQMEZpeFA1ek44NWlaK2JRSU9hbDVhTGg2NDFWRWNYVlFlUnIzOEhUSDRDc2VSTFZlN0NDK2pMSFRQYTlKY1ZXY3MvSUNjMWRNVlJoQndxK0dNYmdmNWlCbFNvUXpMOUNkMHBHQ3dVTlduaS9pcHRlUzR1L3NrV3pVSW9BRXlIUXZlUFR0SkRBQ3VzUVJhdDR6eFU3Vk85eDFxQ3lFR1pZNVdDTjZTY0NhRHd1eSs0NG5IMExqcG1HVkVrUXJoeExzMmhiUU92R3pZZlIxZGxVU3NaKzg1ejlReno2dkxIZmYxaTZDWkZIUmFnOXRMOWxhZmt6VDhHZTBQRnNxV3cwWFdodlBJd0FTc1A0VnFTVHRSWFQrYTdkdXRHY290dGcyS2lrUWp0UjFJaXBzWGRYenViSm81cGIwcjBwWU4rM3FDSlJOYzh6ZWJqZm9xTzQ3VHdSODRKRGtKZHYwRHFXNEhseW03dW0yaDcydDBsMzJ3WmdPR1d3eXRJRXkrbzFMdXlrNzFhQ0syQkRuS0lnNjRNQStYWWJ1cUM5VzduSUIvcG5MQlozMXBBY3ZoR0o1YUpQQzJyd3lVOFNOaWhMS1pBT1ltdnR1S2hTZ01lemZHY0EvUHhEMVByYnFIa3UvTmpJTmZxUVJlR1ZWSzNURyszYzg5WUo4dmJhdmRMNHprdnMxRmFyTEZLNDQ4dG1jZkpMREFUNmNqSEJibnMvTTlkNUhrZWYxZ09JNFh0QmE1UFpuM0N5akkwODlIeGJhVCtIRXRUNnlwWGtSNlZ3L0ZFcEx6YnNuUXFLdzZCMG52dHU4RHcwOXlmVFVxVWhCU1JYM2ZHUzd3US9rKzFlbDhJajBpVUNadUVLVi9ZV014cXN2RFJqT09TVmNiek5YZzlJZUFoeEdFVy9kS1hta0RLRHdVNnB1Mmw3SkpDK2tGYWdZOVFjT2hZZDkvRXFFa3UwSEdSWDlJZGRUZzI3bThROFUxSVZEM0RYQnBXWVd5K3lVZmRJMFNVYlcwQWZsMTg5dlJUd253Q2NnMy9XV0FDZ2d4TlJyZElFY1ZmS2tKbDhOM2l5bnlyVWZWQUl1RFJjOUJtR2YwVjlKMk5WcmRUcjhPaFRuOElxeFQxZExHUnlFZXE0TGR2cnVmcHdsekEzTjA2QThZOU9mY2Y2M1NxSjVuMEQ0b093U3RZSytrN3IzSlZ2NVJFK1grejAwY1pyMTk1RjNDNklGWDNmRWtCUmpRb3lvc0ZPa2RudTlIeVhyRyt3bVRKUWI5dEdlcVdWT0plVU1RMnRqYzl3c05RbEM5VSs1a1g2UDNXSnUxWVRGNjdRODdHNzVIVkZ1T0N0azZadk9xUE5yMkR0Z3hndUFBMnVGblRrTVRlaE96ZG1YYVpXOE8zemp5OVd4RCt2QnJXRHFVdUhIVklzcE5ZS2hQWGVnUllTcUxBY1l6QlkrYklzWUFSMFcyemdHZFpILzVEamdsckczZzVoRm1FaVR1bGh3Y1RuUDlCS01laVVFVy81bis2L1RsbGFqOEQ1Y2ZoNndXRTVQa3VRaHRPbXZXbkhoR1RuT1cxYzh1Ym9yalcwQXpVb3dVc1NlR2l4bDdwYm9TOEJvQjZ1bG9tdDVzWWFwbldrV1lZWDJUWDUwUXFCM3JVSndiSlpwUEt6VC9kaTVUOW14Z3pJR3RZK3kxTG1ZRjF4SVJ5ZEZRbTRtaFR6VGNmMXBaWWl1WUtWKzBqNGZTbG1XQUlhSlpiY3dpVTZiNnFNb3ZVVjR0SmdwYWlyakxVYnkzSVRST1RuUklBRjBCRkprTThkTzdtS0Q0OHJiMk9jL0ZCU2V0RE5zUzhHaGZUa2k2VVVZOU8vMTh0ZzBIN2FmS2tYb3NvYlh4Q1c1RDFXamJDK0xiRnpOQWYzVXU1TnFlcGtGWUNwQ1NjQ2dyYTNMSENVUDQrNW5qbkxaREJyUmx1eVAzY1AwUC9lVFFwMFJpWm1lODhtSTYzVTluVTNTUUV3RE9MVXVEamMyOXNSMGFrWjNGeDR6cUZJM0cySVpDUVM0eXhBNEhkWXVNU3hlN2QyNnBqS0NZUGlBNnpGVnpEL05NaUwveXVEdDd6QlpmaGt5Q2pOMjJRVjEyV01jZTJOenB3UzZjTVl3dTZjN09PZFAzM3oxaFk3YUgvTk1Pem1nVUdNQjVGQk5jdXp0ZDN0YlhuR0VZY01TR3FoMWpCL3pzR05OOG5KSEQ2M2N5dzRFK2xqdmV6WWpuMTFCOWNGTWNTcjFja21IYmdDUmgxNXVla0VkcWRjMUNZbk02NDV0UEg4cWFDY3kxdVBYdE5KUkRMSGJ6Y2dMRnBSV3RobHVnU1J5ZThhanFlZGNHTEFnS0hpVkVYQUdrVzRPeWxPbmNHSXhQL1BrKzhkb25ZbWp6bWcyN2Z3V0hmbWZMSWVSY2ZoMXFic2pzZ3hpOHk1WlB2OE4zOVpmOWx3Vm1mNjhVc2J3aVQwcUZXVEF0cmE0RXVrTnhtQWU3NUMwVS82dHk5dENhbGhFdWFNNlg1Q093K2lKaXlHQ3cyY1VGM3dRemliQ1NJYjVDeDBWZ0p1R01GVWk2K2gwcFVFVWlVK1RnYWxmajdraStoVGZEWXZvdTV0SUNTYjM4UlNSOEdsMU1PNThtRWQ5eUtwOWFYdE5DRHNUQmdrUGltSTNUMVluNi9lZ3NZZTE4ekVCYkhtdXpDTzk3ZG9aT013U1FTUThNVXhoK1p1Q0xxK3BkdHBMYUlUNis5ZEFiTU93bnllMWxjU2NpTEkvUFdObEJnTFIxYUQ4akhZR3EzYTJsOW9MT2NBTlpDa2h0ZVljSzBkMy9ESDFxS0pycm14a3VaWkxBcFNEdFVETVhjRGJnRG5WRS9tYzBnYjV2SFFUZmRTc3JvWjRNN3F1Si9memJXajREa3JaSDJqdFlNU0RxdGppU29xc2NXb2thYWZGTCtFOGhFVVVnY0FlcFJNZUdVNmRiVzhKTWJpb3Z5aFRnNXRQVGtGZ1N2MUkvWk1NZTNiZEp6RE9zWHdFV2hwUEpHYTUrN2I4SWNtdStwY2VMY1ZTSDQwZzRjT2Z0NjNmVmo3dGQzdmFOUmdQWjlwUWljZlFVR0lQMWRwdnpWVnhBdDNTeklkRUM0V2hrNGwvUUVNelNkSUxaNzZ1NHFsNGExUnorMVFHZFo3bkFJalErakxoN2NjeFFqcnZRUFV5ajBqcmI2R0syMzBEck5DMnkvV25xSUNKdExGVVJBS2syQ1crUlIrWW13MUdjVDRNeWVKMFVab1J4K05SclFYT0Q3SWE0L3BpMUxyaVA3YkdVK1U3NkdVR0JlcG1KZGdVdXpBNkJZSFZRb3d0MEtGdVd6R2RjTmdvTUR2QlNtUTFEbVJ3MHJkTFpZVlIrSmJMRGFuWjlBMTF0SlNPUmdUWVd4R0RUU1luVGx3SnFJSXJxRGpGRFgvdjVmelBnNlZWYlpkTE1yaVNwVU9TVWVabFJ3Ujg5aFdMOVR4SnV6d0xYa2dQTEcrc2pCZnM2YUVuVGRxM1FDN2ZYdiswV1kwVzE0RHNkb1pSWFNCdzQzNkR2VVcvd2k3WE5PZzR5Vk9vVEJQTlJrNmk3eUJCZWhxN21lQ0tUeUVCSWgzZE9BMzZBaDFyeUtFcHpuNUJHRVpNNENzZzd6bmZCQkdjZkQyOHBGeks3U01ieStuVHJlVlMrcnR6ekdBSGNCd3d4aE4zcXNHODV1WkxkRWMvcWNXTnBhZ09pT0d0blVqMEQyeTNJSXdOY1JwUmVYUlVXVFl2YUYxZjlleVhQN0JPV3BWcGU4TjRxazF4OWtaTm03VVlhNlA3ZlRiU2NCWTdWczFRVU1qRE1yTXdFcXJDK042TXNGWGZNZlgxc2pJOWNEU0tYazVLazdjQVJRWUFuQ2Z3ZGJSckJpNWtjY1VlNS92SG9EZUM4Q2M3N2hqb0t5Y28wdEJ4cis3R0JMRWVLNEFtcjBTSndET2ZCR1IzUVlwM005YjZPaGJiL09hbG9JRXJlNWI0dFV4N0d1aERUSFhjTERaM3FyS1dRN3NnaVlTTVc0ekdlcjRNOUFVVXpRMSs4Vm5FL1ViMHV3Ty9kU2J6MitNZzZqMlo1c3lESS9Oa1Y5YVIyMDdsSnYwZXJpelpMTzZHa0FYNW1kTWZNT00xdUNpVStSbkZuTElsQ2l6a1Y4MjdLWmFqZ040L09meWhjNXIrZWZjQXcvZUxGUi9ER0s5MGFwRTM4TTM1WUR1Z2U4cnRhWDRmSDV4N1lpUnhMK2ZGaXBKTUxnTVVPYmFxNVFPeGJZOG91TDUvTTZmNUFENE1hcVdGOHA4YklGRnRESkFuR1JJNzdONk1kY2VScmVFNWNSY1B1Ly9EeWI1ZjFlWmFxOE1YUDhyazlabFRCNlZoSDVrK2NHY2M0THJJVkpxODNKaVA1Rkx0TGdzNTE4NE5McEpNRVdNR3J4OFJ1RFgxVHYwSW9GblplQVYxRDJldUF4a0YwVTVyby8yWm9vanNwN0tKeklwVklxSWJPSkhGR1c1ZHlKTXRPb2puTSt2OUIxdWkrWXpML05rdHpmaXFlM0UzN1hFNFp1YmZXcnJ5L2VDdTZwV0J5MS90RWdMOVRJeGZzMW51VVZwUGpzanQ0dXZRM3Q1aU0zeTJ1ejJyQm1MR295ZGNMOWt0UHZWRU0yM3NTbTMwNGw1RkZLRG00RVJvLzZKWmIyZVh3UU9LZEdqOXpJU2dPNk1DNGM4M0I3SFJ6bFpVd1lPTkhmamRza0dSK3V5OW9rNEd4V0FLQTVhN1JwREZ1dGUyWHRnQzVPNklleUxiT2czVDZneWJIcnkwdE05dkk2czQwSDdXOTVUVVh0NjFNdTl0WEVxNmZSa0gxMEJSWU9rK1AxUVIwVDk4cm1hbXNySXU2ZzhHS0lxendPRUI2MzRhWGpFSTlkdytRazNTV2FYNTExT1N6NmZLOTlFRDdmUXFwRTNybHcrUFh3YkNoSXdVMXVZa2JxWUErWGRsNlUzc1lIdjNzTzZwZVNaREZscURjaTFTUUZ0MHZXVXRFdE1oVHdLdzVLWDRDd0hINitpUUVhazc1MXhheFE4d29ZczhQU2tOVnNsN3hrdkNSM1Q1QVI4anZ6OFA3dnZ1Ny9NdldpL29HdGZreGwrbzVxeUhHWVFReWg3VFUzSzM4MTBDUEhZOW5ocEhyeXBNTWM1dzIrczVTRVE5SGdhWDA2RkVvQjBId1U3eVVoNXVlcy93MTVNekhiS0VuS0Myd3NDTVpWN3lyVUtjdFlJVC9EdXdLTmlnRUNqTlNDdzJwbnJsOEJicUFOaEtjc0VkaVR6c3haZWlWT2Job0ZnZVVQL3FOMjdLWDRKcDN4OU8xNFBvVTQ5SSt2TEhidytudkNWanV3K21NQ3R4Z20zUnl1c2QwdXloeTVkelJQYjEvMmtSN2lNd2llZzAzcHBURG5NZjdHOHFzeTNocU1kTW41cEwwcHpQT21DOXlBT1l0VUdLNlAybDZBTFVNUWhVV29HM3NrZ0VEMW9vT1k0bDNaS3Y0aC9tdkk3d1l3aTRNWk5va3IvSitYWGZHQlplTkxISUd5WGVXUk9vZGx1OS90UThyNVFiVndxdVozMEdRcklSVXVxOVhHWHh5blcyQ0pZT1hTME9TcnBYa2ZmbU9xZ1c2eVF3YUdoVGZvbHRCTEdweUZoeFBPbm9saGdyeFJidkJtRHRjT0UrMyttTDk4Q0IvS2tFWnFiK25oTmp6WWh3OGhmSXg5TCtjazlKcFd0MER2MHZsTFVhZ3dGdzdIb3pTclpjWE0welFtb2J2aUFqTnAxWWVxZ2s0S1FzTmNrbFZxZjVvQjh5NUM5d1plbUxNYUFESThpaEd4dkIxeERvaTR6VmJJWllVY0F0L0h6bzRKbnFlTXhsRm1mcEhHL2tXMUxwZlNZTHpNQzY0T1FBR01QejRvUllMODczZ2tSbXdJYU91LzduQndMTXhZZWZuUHJ0eWdvaFJTaHU4ME56VjlNRFFZMTFuUloxbVdmclRYR3IvRzZ5TW9IN0pidXU0UjNTRVp1RjdxVUhtUFhRdDhYKzhkOFNwZzN4Y2RWZ2pudEZ5UVhIMWt3RmRzWmdWajY5WDEwUkx3cHIzbEM2aVAzUjBQOVhKM2lSazBUNjYzSEZHdUVLaXNxcmhmWmoveTloeDYra20xM0NLa2orMkZKeFFPeXF1WE9EWFNsbVYvSlVsSytuQVJ1WkpJeWxPeXp1My9ZUXVZcmFCOXBVY3d3RWtlUFRaQUk3VjdBeHl6WHRkK3ZnWlpVZ1VnbUFjQXd3RkRUWmRHUlJVbE56NTZlc1RzNm5IOUFDWk40eERjbkdIZ0t1dk5zZE9oVDR0Vnd6MllzbW5wTy9waThhOUtHbkkzTldJQlNlSXVWYlhPZEN6VVdzSTJGQlFSSlhjVTh4Umc2UTFCampQVGxrQmJ2cDV5eFFRLzRCM3htZUE5Y2lGYm1uQ2ZlS0E2bFFNQlVSV2t5amkvcGJrM0dmREhTQmw3R29KMFZPOCtpdlZEbVJNRGdhbkRveFJ1OE9abXpsSmd3MmtlY1Jtb2VNa1NBRVgxTThjRGs2Zi9ISHJrSkFPbTFtZ2VUZWFhYWpJWEd5aWtOaG9vNm8wblFRTTU3UzNLcjNlaC9ncFp4MVhGZmVyejFUWDdWUEowUWljNG95REpnTzZObFNMUXhodzdwMGtpb25qMFQveUxjN25RNkRZVk92Vk16a3ozUGt4NUZsMEJFd1FtM3NJVkxjcDFuWExrczJiMjI1ZnVjVll1aERSNkZ1Zm8xUVlQQWw2ejhocDFmaExGdUwxRjRBWkhaVG1YRWNiemhxRVNEZkFKcGd1N00xVEV3ZHJxTkc2My9vS0UwWUtyTEZqdDB2NXEyM1FsRTkvdkhFb284MHhHNTdObnFsWTcwNTFDeEtmSHkzSGY4L2VVV1NRUEVoRy9wYTh4NUk3SnErSm1zQWovVFFxaklocWk5YjczMG5jZU1tMTExbTQ5QmRXRWtjSTRqaEpoa1VPc0pRUjg3VnFXWlV6cElaODlUNitPSVNMT0RzUlk4ZysxVWh4eGsxM1l2SzJSb3BuYnhxRDlSbTJ0a3ZnSXJvTVErRHAxTnlCNDdHYzZmZXhqcUVPVTAyYkQ4WWEySGVocFVhTTZqY2JyQXRnVC93aExhVnpQRHd0YmdaNHE2ZjlrUnVwM2lNREl2bUZiRktmYVdPMlYwZURkbVBWM0k2S09UVzIzOGoyRmVLb1lKWFRBVGFaUUo5UDl5VXVnV2wwQW5qLzQzNDI1QlBraXNrLzJnK0tPNk9kQ2o5WFdRUmIzWGM3YytxV1FsV3NDbjQ5WlJsTUJ3U1lhS0FZQy9BWVVXOExBcGh5c2hLWVNOVmhqNGJwRWR2dGN3c1BuallmbS9ielJCc3FWeG1YMHlVYnRPazZDeTdOZElVMEg1ODZtdEhOdmhLcHljQ1I3Ylk4OWtPaTREU3UvQUExSzIxYkF2NElpbkdYUkFkVExudGpyTjFvbWJsYU5OenRtWjk5Sjk3bmxQN0FzeVpUNkJFaW55Q2gzb2V5ejduRmh0M2d0TVNpMUw3NEpqZjRNcStNMVNyNmh2U0luZmhWRm5hSHZWK043cTA1WFVycFFpSU1UZlFXTElDRVZXMVJZWHZXUWZPUlBUbWt1aWl0bHlaRFFWS0ZhK3l1S2QxSVVyNXl6bXBtZnRsbFRKSHMwMEZnY04vSEU3TEU4UkRPeFpkcEs3SlYyclRqQ0Zzd241OU5UeXR3dzdaT1hoR0dvVWtSQWE5QkYvSktJS0tlVGUwRnY4bE9lSkU2ZW5RQjRlbHdTempMQmpObFREZGhlcWE4dkZlbklXZ3diSWNBbUNIVUVhWXZkUkNVK2hwMng3NkR1YzY0N0NndHRmanFzZjdmT1FleGRRSm9ub3V4MEZpOFV6SEtUZTZJTzJBcXNnc0J3R1JsejRhQVUvbEtMbnRIMHN2MWtETE5LckZkTEErQTJ1NjA4UFo4U3l2VVh6bXVXWHZIVDVjWVFheUhmVm1keHJwa05MMzBNNEF1dlNOUTV5V1djaTJ3SnlOWDBaRXpJSm5wQnZYd1NIMGZzcisvdmpiaWRuam0xNzNuWWFaSkFLUkY3cDBoQlgzSUlKeVpDSFJYZUp3SWVrZ2h4R3ZXMWI1OEw1QmdaSmRPMDBiYnlhZlI3RUxyOWZITVl1Z2xNS2lVZXU1anFseWRqNXIvWjJpNkhnWE40bDJyOWx2ZDdrOEJPVWFkRVh1SkVFazFOVU1zN2g2bm0vTnplQWhLWUhLejZoNmJybk00OXdLOWU1SndMYWlWdGFUZS8vRFNxSmx5YkVTeU1LL1pYMHcxNFpWMVRCcG1VRGlFNFo4UzZpcGQ5MTg1OURicWVhZEo0cHJwcitFbWswUGwyaXhTUTJGTTYzT0MrOXppWjVmdlN5a2hYVWx2VitHdDN4bFFkZGpWVjVSZFlFZ3B0cmY4cVJrcnk5ZVN0Z0hLdWVsUmZST1NRSjV0a0E2ejFFSmwxSVRBcU1Ma2xBN1lzMnpqNmN4S2lpcWFBN2swWHNnbjlFNjIxMFhsZU41SG9JZ1BBOHhUbVZHQkt1Q0dTNTl2K25lMjNmSytZTE56RmkrT1JqNVVjYTJndnVac3BzMjJSTnRmR0diekl0US9VSEhwSFR5c1pzUmQ2emlEQW5XTXJybGpkV0cwZTRXeHl0YjNab3J1NTZ5UEhNZEdHNEc3R0ZuWGVudUF6MjVEeDdXZFhKT1pEK29abHlhS2VqVThBRzdhYVRNajEwZHJTY2lxWU1GMjFTNFdIak1MSWtPei9hS1JST2pnL3NoSHRaeEFPQ1pnak5wUnBHNEZDWnBUdEhLTWdrYXIwSVVqdEs1ZDVUYi9UOWVFZzBCcFd4WklzTmRCdWFRNFRXQXBkWktESCt2WWc0b05Ud1Ewb21GWkltVmNkN3VURFN4UmNncFRlR1pTcEJPSXhlU2VOZzBmd0hBMUQ2U1huTXhDT3JLNkg2bm9EMXhCOWVtbjcxbDJyVWwyZ3BMcUovdDRBbmFpbm03eFhQb0h2VHNjNE9uTDkzTU04SVNXSnRvTlIvUkNWK2Qzb1diamh4dGY3T1Q1c24yZmR5bXRDUVcySDVPN2tjNlBWQU5Hc0M5cUNkVmV1ajgvVWVNZEk4NWJpUm5heUl5UXJzZ3lRQlZtbGJNYW9ZK2YxYzErZVgxS1RRUk9aZFVwc3BNZkQ4L050WmNKZzZjcmlEY0NZUzZQVFhkUHZwTEJIalFUd3lQWUFXZFFPQzZIMGhDeWlmcGF1ZmNRN1RjUDZDSzU5UGZ5SE9XV1pxODlscDlIYVZZTTNKdEdsQ21OM2pGMzFzWG5Ydk5iVlZmTGJWRndzanhvQjkvRktPRWhlNWtHK2wxRDMrQlYrdEVYUm1ncVR3LzkzeEgvcGllckVkWURFQUtrSlh1SGo4Q21yUVU2U09ZK1ltV1NIVHh6THZ5bndST0g4d2pIaWIrL1RXbTdtZVVPR29yd05NWFpvQWd3VERLMHhpZUg3ZEcwUmxuMmFPcGwrWmx3RGszZ01NQlJ1YWtscVVUS04vSW5HR1BHSWJFNm9zV0NQTUNzRVJWUTJtZ3pRMHlIOEl5c2hvQnNLL2NRa1BnYXQ3cEdjQmZXbm5GV29TekJlOXJ2ZUl0NCtmcU1rWldEZHZ6UkZxZ2hoaEJIL0RQeEhvbC94MDRSenVUTm1yMGUxcmtTbHJzeXdkbnU3cThlVmVBVDc5YVlGdWtoV05EOHQ5UTFRNXJQa0MwK0VrQjFXTnlrSGVtL29qdGw1Z3d4elV5czJuZUUzbkRmWU00cHgzMnI0M3BpRzU5QUc2RW1mQkpndllvYWZ2aFJHbkVlQ05GRFIvTzliT0IycWZ5VnltTVZzenNJSnZwcHAzR1oyOWJmKzR1TDFRaitxcUZ4VGxhNXloaDlvYVMvMFcxOFVMQkhrK2NTOGJTRlUvazZwbFg0d1NTTjlMQ2IwTFZ2Z3Nya2syQXdVQW9WK2VCcWliNnI1NThPbnNmQmNWMzNPVlMyazlnNzRHOE1uWTBzaVlESVBoeW11bzJvZkRoUmdjd1BTZFJPTVpIdGtFbXNZcDhKaTA2VUVKNjc4SkJFWXJFNHVDOEJtc0ZDdm1RV2doWjFQSm9sSGw3eU5HeTBmbHRkeFNSWUtMUjh0YTRmQTNDNUd0S0xra01VNDlFWjJGWjRXekhuUWdqWlJ6SjhVVnFFRElOZXlCcGh1bFo5OS95N0pRN3gxYnp2ZTlqdWNla3I1RjJmdkJwWmZNa0YwVXFUZTdDblg4RXJBK1dXRlRFK252VlM0YWhGc0cyb1BNUE91V0NEQW44Q2VVVGd2MUFxcUE0ZGpieWgzTFRiY2J3c05YSUQrVmVuOEpLVEQ2MmN4VmhieEdZZ1ozMi9rcDk0cUlwVUdtdHdLUFc1c0F4YXdYa1VMVlozSVBZMkp3SzhOeUVsL3pxVS8yZTByUndhNTl4TDFWRW13NHZxZFBORi8wTHdOZnd2VU54bXQ0dm5oQmk3OEJGbFZXUmdPcTRacUJwcjZRWFVCYkRZSVJ0UFk3enVaQTl1eTdMZjRKWUliS2V2WEFkZzIvM0JHTzR3dUdpR2lqTGpzNklKTUpDL3hwazd2ZjN2ZTJLbGhjeE5NSzBzdi9GaHlqK3A3L1VqcStGUjVLbThGY0VxSloydFpKMm5vek9Mc0hWZWs1MStKSjQxS3loQ29yaUYvTmszMnI1Wkp0aG94NWNVamhXTTBQWG9qRXZBcHB5VldGM056Mm52ZkcrcWFQYldoWEowL2dYcXk2eHFRaDhYNDk5VDBNbzQ5TUpQM0xyRkNqalFaMkppazZ6MzdSdStpY3pOTTdlSHRVTWkrbzVURjlNeDBUNS9LZUNQTGVZK0tRMHhRc05IdmJHWFRpM3dmU2ZhR3RTU2VrSm4xV0FoTVo4Y05NRXdUUXdlK3BrSUF1MVJSbS9selNFbTdxdjhzazhxeVQrRW9WTC93dVd4T21pQk5xZTV3MVRFSEdtK2p0Nzc5bTJJRXQ1ak9YMHNINmJSYUZZVVZkZUpjZjhrc21pS3VCMjV4Q0FlaW5XaUtlMlZUeXdKcVF1QktJeS8wT2JPVFdtTGlMcXh2VlF1dE1vOTAwKzEvR2VBOUl6cUUrbG5YVkdWR1kxYWEvM2Mrak8vZjU4Sjk0ZFk3RU50Y1dLWklYSHdybU1KYVZvbDhzZEhNeGpYRm1MdWtnREErNVJ6NTlnZmNicW9QYjJaQ1RlZkU2UStGZkVQWlkwaDVjeW1kODIzN01ycnVnVXdmUTNrNnp2NytlS1A1UVZyZmtIVmU2MkhNeTcyUEV0RXVpQ2ZLUGZiT0VBcy92ZnRJS0xwYVJlZzluOU50TTFHcFEydXNkU1dodVNlMDRXcnY2UjFEV3VWU2NkellENnFQeGFYUlIwWXJMLzlPU2tBRDRIcnVJL1JDSXVFVFBlZ0ZnU0hNUFlkclhUK1RZWjhBSWdhY0Z5NHR0dTYxWUpud202SGJVbE4zKzFOZGJTbnhoUitwZUNFY3YrRHFiSW1TM2o3RTk0TGhBeWgrU1EzV01Ndnh2bmJDbUM0dXJpcWRKWmkxNnVlbFVocEhqNVpoWi9qdHA0VW9vRnZ6UXp3R3JTeTFSc2d1MHdkcGp1T29iQ0orWENneFVjWmdDOTZVY09yQUpkcmMxMkpDekRqUXdza0plMS9XcjJvTTEyYlRzLzl3YXFsZ1dUcVlUa1I0dHgydmU2dHA4Rk5URXNVeGp5QVlpVHRvZzB0SXJXNU1OQnhFNGZPNXY3OGh6dFd1d3hLamkzU3BuQTBVWkRvYVpzQU9ocDlSNWkxSUlrUUF3UjNTVlg5Q1lVdkdCYzJqSDJ4Z2xYQ3RjM3F6cVVwbFAvRVRudFYzamlBOENhYWlJQ2h2enpma2R3MVZsNkFoYVk3Qm1TclNSQlIvMlJWb1lYSmd1czBxRXlQa3V5OXJtcWdYWGNoS05VS2cyaDQ3cU9kZm1ad3N0c0lMRlNNN2NTaVc2ak5aMXlUNUFpNVpra0dhWDZDYXJpckx6WElEcyt0aUtpMW9NS3BEYnhmTC8zWnFFR3luZDVUZDhueUZQM1dFd0wzQWFubGVzUm9nSnB0V1pZc0xRekNFS1B1djVxNDcrcjNJQWRvTmszV2EwWmpKRnd6amJjR3hsTDFpdEdweTRDRS82aHppWW9mVkZNUkdLSlNuRHdHeG1RMm41VlNRY2RHNUE5YUdWZVhGK0ROZmhMa29hUW9IQURUUE5JcFZ0WXVMNzRRUldPVDZwSFV0QTY5U200N1BUaXd4TEdTOVN6RGJoVVJWWVBHaUo0VDZGdy9pUkFPNXdlV3QrTjM3c0VGWjZQY0RhcHA5NmNLWjcyd0JxTWJVZXRMQWRGeEUwNjhOYWQxNERKUFdCTXNPYWVzOHhvK21ybXFKV0pTcU1BcUhVT21qc2JwRXgzODNwN25kK0NqcHlGNDhpamFDNmJNaFhqTGNKL0pYQllMYmhJQWpiREpwb0JtbzV6SnQxUk81Q3FBYWhVbzB2VkJxdlA0N1NZaWZJZEdjZG8ycFlaQXdqczUzL243bDNzTnY5WHVOUElZWlY1bWYvU3p0NldndkNXNlBFM1ZHVDNJYnh4ZTQrYVNLSDYxRnRqQ3RPSjBycUlJUHVpUkF0U1QyWlZoMm1GTmMxWTZ4bmo1NjV1NGlYUkw2L0ZTQzBXc3krY3VWYWJhVkNyMHVaTldybVdja1hHUFgyTEpuZWJBaGM4K25aaFdnTzZjcTVTS1dhZktUVXAyT3QxTTFHTHgxUnpLYVdUbmxhMkFiZ01kL2FVTFdXbmpKL3duOE5WdDVEMnZoK2wzQmRIMEVTNjJZWkthVmJvWlBSZ3R1QTVrV29nWWtEanJ1RUFjNElLSXpRYWt2M1l0YnF0Z2QvMVBoT0lsRGdDUEp2ZG16UkNPU1lzV2FTQ3J4bDQvZHRZZ0ErUFFPQ3BmSWpzbWptR01Uc2pCU1hvczhBT2ZlQUsrc0RrdUNRR09KOXE2M2dtb09ENjNDbEZYMXozaExyaS84dkRjRFdQaStYQ292aUk3cEFMR3dzM1dCd0FtdE1FcHZDdzg0aytTRkpPb2hGa25rUExwMm9pRnZ3Y0FkeTkvOGl3eWEvS1ZnZEcvc1A2ejFIbWc1eDB2SmRkcndhVXVtcDg2NEJhWFMxcHpvTE4vYytLUGwyRWtoeFh0ZnBYWCt2RzkzNG9TVmhBMEN0RzBDY2pvdGJEWjhuclM5RWJUdHdZRGdZQWFGUG5mbTZPQU1EUSt3NTdEeUt5UXI0RkJkMWxJV1RjYkhleitiL29WRisxNHRHSmxocjREbE9VOW5uUjdTZ3pxV1FnclhuNGdKdllEdzBRNjczOHRCY0plUk1qQ1pBOHJhUlJHWmFJSCtNKzFlcllKcFprVDY5YVJzWXltK3dWRm5zdUtPem9xcGRJaGFPR250ZlM3aTM3anNCS2E5WEtkRjVoTmpINmp2eHZWdG1EU0tKbDdrMWhHd0hQa0VTNExVV2Zic1B6K09HU1VwWWx3aGdiSmZnc0N4OEpKeGtkaUVVZzRYbmlZL290MkpxQWxGWTVoYk04RUxZalFjL0IxdVVNNlNaWlJ3cThEYUk4VkZVNlQ1YzVhNUdIYlQyZ3JSZnBZNXJ6MUlxTmVJVmxyaGh2dWxaeldaVjZQR3l5MFAzaTczMzhobWNqQkp0ODRlbEQ2UDRXL1lIUFIvOHdyMWYybkdHaS82ejBCczZwZlFwOStsZW11Q0R1c3dHNmNCZU50UGczbDNaZTl0b2tMSkE4c2R4NXZqelJrMEkzRU5lTWs4Und3YVVQRkxkWE9tSVcvak1nVVorMCtUUGV2bTZXcGM1WCthWU11QkpnVzRQcDRBbmZYZmwzN3h0TXhRWkhUeituRFJKZEx4VG16UytCclE2aUxCRTRaelh5NHlqN3l5SThVY0JNRFhkYjY4OGtoOXVORm4rRGYyWXN2OFBuclR2ekFXdno0dHBEcjJtdGIxVmlpTmNGTlFKdmoybFBCNXJQd3VQendsVVNnem1GNjVoT2t6UHk3bmlNb1p1SXorMWtJRjI2dG1nb2ZuZ1V5ek4vbVRDNUIzNXlqeThFS1MzWG9jZW9Vc0pvQTNqQWt2ZVB2T1FZc25qakdYdys4TndKTGM0QzVtZTRZa0lzRU9kbFVpd1l1WmtaN0hnU1QvVmJvMEhGTnBrL0UxZi9CRW42Mmh3NUUrZ0h0eFpjMWhZSURWSmlHRGhrdjQyenkxUStKT2tCa1g2UzBiZk5UZUR1dDkwNCtVOVl4Y2x4TzZmR09SRGxacEVZR2pQUXU1QUhQZDNEU0pNVnhyUmkwbHNtZm0zTEJuM3h1RmZZc2NjZUxIZ2R2SE1PZWRLRW9HMU9HVjRjd0JlVmJtUnk4MndxbkFmdWhYUGxYM05lZ29mYkhac0VQeHpnT1dFYThldlZFSkdGZmpaVW9LNWU1Q0dwSlJEN3NZdTk4TTFIOG4rN1huUktGSHltamdTaFU2enBkcmQwb2dYZmtyd0p1QU5uUlBWSHNjTG9yNE9jcmVvdDlGTFh3QmljTmU3dmtCQjZibmNnZmlJaHliWDA4K3ptS2xIYUtUU1FjN1Jjb0VZcXc3UG81cjEySmZmTndoRUQ3L0JKNzhVZXZtWmpwYTBiS3hETEwxanFqRk9lRE55VXlRNE5nOXRWMVdCMldKYU5lRkhaaGU3dUU1YlNsUUtxazgvaTBLSlY2d3Jpd1hWeDBsdDBYY1hSMnpXRVlQNSt2QkJIMkVic2FNMTZGWmlOelprOCszMVJCODJrZFdYQ0prbzlRa3JPUitjNjV1Uzc4NDNkL2RFVkRoYitXS29wMk5MUFBzUmJXcGZMczBCTkwxMWJnNTduaTB4bEo1blM5QTd0eUNKNlB1N0VsSkVPbXFQZkt2Q1RGeGFLK1RjV0pwZHNXRWQ3U1VDWVZSZzQxdE14RjF4MzZjcmR4bWcyUFlCenlVQkF1UHpDWDR3SjdzN3ZYMDhiV3RNdDVMMEpMQWp6Z0t6a1Y1NFBSdjNib3ZsaEZqR1VFRE81MHNrWmxtYkR3czB4UURaWWk3Wlo2YytISDEwVVQ5NVQzcHp5eTdVc0dSOXJ2VEszSlVOeU1ZMVMvZHpZcDVmRkJPR3BKUVl1TmlwWXhHL1hkNlZkaHBuMzZ6WENFZlNDb2ZJeVNuU3FDODUxRGd3MnlKOENhVGM2Sk4yWEtjTkdTcUlLcFdTc1hZNGhqdmZ1REpxQmFKdUZuVzEvQjFBZVFuVEYzbU8za0VpT09aYUU5RkRpZGozaDB3RXgvYXJ1L1MzV3dBS2Rtb096SWdMWWVqVWlocW9jL1AzWEZONnJCUkV0RlA0cXk4RGVBcWVUNVRPaitOM29Ed0pwQTNsV2dwQ0V5SHNnaW5MdEVpM3JpOVVNYTVKNCtTSktPd29DU09ISjJFRFJBNlFMR0g1RGgraWI4VDdEWGlrTUZmcHMzOHFlSThTREZVV1dsU0lJa1lnaWMwemJkU1l1Q3FxRjVTTWZJU2U2UU9wZnlTOEdYWG5sYU05cEEwMkYrV2JBMGJJYUZheVVqZDF0M25LODk1Uis0ZmZTYzUvdmF3dFREVzcxdlZxQnY3S2hWMi9qNlRSR0NMMkYrNTRWT0c5bjBIUkpNVlFoK3dwOUhmZ1FvSy9PbEFSUTlmUHlPa1ZnNWV0TE0wMWZMWk5KeGFmOGl5dGZwT294aXlSOE90RDROaFFNM2EwaUhlc1BaQXhsMEdIbzg1S3pYeUtrZ2FMOGM1SlBWRHZrWFMxVHpMVG9tTVBRRkl0a25PWGovYUxkTGIxeDAxdjRaekp1SWlMR2MyejlsWnZHczJGRmdBVDluWG9zVzVBNWptd2VIclpQaHVBUVphWTNtaC9kaDZoaU0vSFE2cHpHcE03RHdKdU5GbVRaQUFEdVpBS3ovYmpCVm8xR2IraTBkVFpYY0E3OEkrVWVkc3dvRGhIMmhXeHVqZVNkZHNYVVprR214L3dIQ1VieUcybFp4Tmp4STAyVVM3bGZ3eEUrekJaOFc3UXVBb094dkVWSm9BYlY0dllEb0trRG9yWDBHYk9zOVhxZUNIYXhIclN6SGQzeEVlbEtDZ1FDNkZoWjIxR0dQZ2tWUEtxd2pnYjNmNHFUN3ZxejFiRFNIbDY2dUgrQVBaT3lxRTUxenhtSzR3dGVaTWQ4Rk1jZTZ2eUowYTZmeWg5LzBLQW1iNHMyZitkVWVmQ3VKbnhwZ0ZML1RnY2tkT0FxaStGeUNGS3BmU2lJalQ4MFVpdGI0ejlKdXpaQnFMYlRtd05XZUcrelFzelA1S1FPTldhN1NtQjhkV3pobEl5bVp5VGFEdUpta0k5MTFFUmF1TnMzdHdvYkFrd0p3WkJ1Mys3SFV1MzUyNzBGeDZ1cU15clNITVV6SmNNcEl5Nm5oMmszb3RHNEN2RVEyeVNyYXN4RGExS3RqZWUweEc1bUE5bnBzRlJXajR3dTNMRFE5RkYrR3RxSWZVVUFaNGdRVDZRTm82cG00Wi93dit1UGZ3VlUrVk1zYytSYWZabkpNdkpTeWpGQjFRUXFzSFRWT3BYdkRvYlZkbVZSenFGOVZENGhWL3cwcWIvZFh4ZUkwWDVaNE1WTUNqRlp2am53VnNyOGl4SWFiaEIwZVp4RUk2QTdST09zVXZYMUNUeHc4Q1ZVVXJzN2QwOURGb1J6aldhT2VOZU9FVC9PeC9yKzdqZzFJTVVSRWlsT2hyQVZYMkhqWWUyVlp0YVZGaDdUM3VlMVRLQmRVdFFKMm1wZlZEdHg2UGcvSGpuL3J0Q0NsbzRhNHVJSXhJYjBFWDdqOXB2QWhydU96MWJ3Z0Foem1pV3pWTWViVUhaamU5c0QzMFg2Qk14RUhvbG5qdnA2eFBJSS9QaDVEekxydmYrOFJ1M3JPa3NpdDBoeGY4UzBhVzVxc3I3U3pMd2FiR25YTWpEc2JCeVJ1REgxd1NoQXVOT1pTUk1RM2NVS1FOemExT2h1WEMxUE9QR1RjaWs0NTBGTmZ6STloY042R3RzTERSQWFoVGFvK3JLRm1XUERQcDdvM0d6SUhGNVU3NHhzMGJoYThWUjhBVXR5Mkozdm10dkdHVUoyYTIrSWgreUpoRzFYaHJHd2RaaXRPMFNJVWcxL2krRTBvR2dXdG9lUUJIL2FHeXdQY0pBZWkvY0R0TkZST3hyMlNzM3dXUVIxZUlQV1BjTXFlMDBobEM2bEFtWjZnZldQVmpQSzVLdXAxVElCV1hWeHpQYXBwZmdDSlQrdWdiN283SUVCRy92ajFtb1JpSUdmYytRaURRMElab21zZHExdFVIYXg5eVIvV3Z6YlNhQlhVendNRSt5N0Jpdk5KTFE2NWZlWlNwMXFyY2Y0N01JSlUvN2RCY0Zib3FWQUpYZjNBNHJ1enA2aWFoV3BHd3g4MWhpUm9rN0s4c3UwK2hFNnBWaTJ3TGo2d09SNDdoM2FObENpUm9IcmZlUmltbHVQOWhNNktkWGdkUStqVmF4anlRK2VwN0c5b3hNSG5VcVltV3E5a2YzVDQ0SnN1aVNReTQxYUZGSVYzVUptMDZOTTZsTFoxdDhMRWtINU5KK1pUS2JVa0lrZG9TNk8yWVB0Y2N4YXZoelFrS1B6N3VGcFdwd3hFMTJPMmcrUkpZcnJXTWZTU1hrOHpFZjBEMmlDNFJvRWh1cmY1TURPd2ZndlJwZUFtYk5rZUZQR0M4SmVPRng4bkx1U0VqaTRYWGcvMFFrdHV1Q21IT0pNZVh6RTlrejQraWxGVkl4bWZWbm9GZWpOV1JZcnBPYThWZHhBWjFKanBpRHhCWnBVODdDeXUxNzNJWURUTFQranhSUHpTY2l2STltVVIrbmV5TUNhcWhEd3c0QlJtU2N1M2dFUVd1TXQ4eVBhbFV4ZVJwQ2k3N2pBaUJ4L2ZNVjFYdUxUMlBaSHhJbDkxMUdQV29QeHhIVFVHTXRVN2NyamlwZTJrMHR2bWpHUm96L1UrVDV0N293L1h5OVE0dEg5U2Q2ajhkVDZ2OThWVmVsaEhkejNZdGtHVjk3bE1YOEtPSzF2Mk92NSszak16RmZqTWRyaXdLbTFWbWdTYmhLUkl5anBjOUlUZXdMWG01bkk3dXVrOExneUF4SEZScGxHOGN4NDFrRUh3c1BqTHlhUXRlcjVGOTBEbzF5Mi9wblRWMGxNd3V2eFphV0tTdFpCNEYvWUNZYTljS1dQdHdqNERqQ2J4eExkeFplWjZ2SUx4WGZhSjV1WmhBMndUdjQzVUpKQUU3eG1teEM0dzhSUkNSb3UxaFVaeHJsUHVFYk4zS2JMbEZvZW1ZU0hFTmhySUhyeFhZRjIzcjcvOWxhcDNCMndNeFdadTM3cEFDMTRSYWo1aEYzN3NOVjF3M25MLzRPNURJUXlHRDJUN2ZROGZmN2dDTmlYY2ZySm11V2Z2aGhCVXNmbFU1UXBIaXR5WGE1c24zK3l0aGJGbGxuYjZSYWw4V3RSSDFFSEpSbGpjTHdDazl3ZEpFVnBxM0VLVDNhNDFyR1phNHE2ZTV4MFRMNW96V3lFRU9QTmpWL3RieFh3ak5Rb1B4MmxqRFRTNXlORktqVUZycW8zQVJqd3dzaUdzcEpVWmIzTnh4dlkyODVwQzhMaGpDUWRTeElYV1RRdmRVU256NENUNllWRkdFVFNLWC9VYVA1S0RQczVLR3lIcnpsb0dhY1dJd0FzYU5jMGhUaGR2WWx1OWd6QjY4TENIUU82b3h0S3JrYW5ZOUVoK1RKbk5ybDJBVnVWUEVlczAzNnpXN2EvUGFUcU5zdy9IakY0THdtS0dSMTFYR3dReEs2cU1aVmJpTDgvVTd5RVFYbXZCMjc5aENERmJZdkM0ZGRlTjQxd1dTL0xIb1Qwai9NRjNFR01VN0pCeE4xajZLMS9wL3JtU3c2VjloTDBOeG56MCtmaFlXQlhyVHR5QjhSMGZEMU4wTlBjU3lFNGpaVjk0NS9YUVZSTGQyOHR1Vms2eEUxSG0xd1pVUHkzWUtZOWtRRDJKdTdId0lZK0NpYWkrdTJaRzNiWFZ4WWw0Vnk0K1VYUFdaVE1XTFpGK3NRYXUrem9WaUJIM0xuVFJoK2dGUUxBNUdObmhrYnNxbU03OGNKeXQyTWdaS3JsUXVOMkRMeXFuT3FVU1JnMnJIOUFDMG5OR3FLWDhERHc2b1g4UWd1a2orSVdBMk84dytBeWxQNmNjbjkzWU4zeVczUWJxSTZGbmZzVjBOME43ZXJlaGRaU2xNdnZDVkY0LzlObGJCaG9xMzc4bjdINEtaS1ZWTkdQZWY3SDhHcEFCa2VXbmFCNmVrYTBjUUZvK1JTZ01yKytYQWhkdzJWZnZQZlA2a3BDSlpReGZYRW4xS2dMK0dEbEkxK2xxTGQ5bGVsaHU2cXQ5NHhzUXRDQmw3UkFkdGVrM2hHbjNHWUtkc3lWVXRreDVFaFJGWFYwQ2E3VlBTU0pVWEhlUG84Z1BjMFVTaC9RZmJHS3BCY29aTmRLMGNaN2s5bjU4Ukg5KzJTWUZVMWRrVmx0eUVxLzJ1T21zZHFRdEMrVE03UWxFcW00KzhzSWMxdkExamppdkpBNlVFMUF4TnlGVWVDa3hYOWZvQlhHWDJEYktQUWdIaXZCVXFJTWRSSUh1dUpwVlFSTlpnY01BM1pLaHFlNnQ3NWxvZHM5YTJRc2U1SFVrSmNmWTJvSE9xYnlkeTg4MHdERFlncXNlRWpHVVBHRXlyQzF6K1pxMTl1ZnhsSFlLRnZZRjZSMHlKeFovUjZ3U3JIYyt5bUlxMzZQUkFYNnVNbEZQZDVxM3lReEhVVlBnNFJMSFN4anR5RG96UlM3bXRUWkRMN1pjampvdGhHUVJ0bUZkbjFUamMwV0JjN0o0ZUFQbDN4cVZ5RG9zUTR1bGx3M050bWhPVHV1d044RjBpbnl0dFpvMEx5Um9tRzhEZU1WR2hlQlV4dVZKYUhBS1ZwKzc0eXg1SnBZT09kaENMb3Nac0JaRzVhS2E4VEwwNE1GRDF6ZEhPak9zMXlpZU5HWkpXV1RWcXRtMmpSTTFXeGZpbWdEejRTcHRMQ1hxemxhWityRHBZeWtPTmZhbTdNMi84S0U4c3NxWEkrWklZNy9QZGQ4WHVhcnhOMEExaTRrZWRLZnhUSy9MMjRXOWNBd3pIWWxUS2ZJWVlleFRUNmFyUkFtQzF1Y1lDWWtxczkrb3cxWmNKYzhMU1VBQXJiMEFpYjZRRWdyWWlSbE5zR0lTMXBpbzhwdnhaTVZoZDRQSy9wOWpjY3pIUVpQWUpzTkdrclVwTWdybWZvcjRZaTE0OEd4OE40SkptRTE2K0k4ZWxHU0lFQ3FjckRMZmNGWlUvWlY1VDRyU0FHQ0lKd3VDK29iVDBBbUpUaW5yd2p3Y1ZDK2NpaEhpYzMvc1ZLZFY0SUY2ZUNDTEsycG9ZNWJDLzYyR2IyTlpDbDNnQ1ZnUUN6MlNPL2x0ZCs3aUFGV2VlL216dmI0R1luRnFrTkNrOFlMOHc4L2Rqck1nMkZab3llYWwzb25lK1M4MWUwY0VnQmZlV3dIY28yMHFhSE1RYmNPS3JEbTI5TGZNVGJvSDUzUDBhRW03aEhpazR5bmJ5UEhIdys1WnJkMGEyZEtvSUhKZmkrbis4eFErblNxNGJRb2krUjZ0b2pHWlFqY29GVXhTeFFPendRVEpIM1dOZWZ2aTJwdEdOajYwUHFaS3BGMHhRQ0I3VUhFeVFrb0lYM2VZbXRUc09uRUVPQWRONmYrdEszMDg4TVZ6TGFkdkJTbFZtdFVENzJKbnY1VWNVR0dMQThQaDBtMlo4T1NEdjU0RUEvMUpqbGorZnBacVl2ZnI4Wms3RUE2alMrR0R0bDN4MHZBNzBJQTAva2hib0ZLUlNWMUo1ZllmMTV2NGFEV1VjWTN0VHRudkF1dDJQbmJUWVU3azFvazYwU3hoaC9pMzdJUnR2aEd0bzdsQ09aeDM4eHc4N2FCOEJ5b1hlcEV1dEdlNkcxcDhvdHZPZFZ2WGZibTdacG5QcUFxbXIrS3UrRW5mSW9vaGtMOGdGQmlIcmxUOGZvMGo4M1gyOU9TSmV2bnBYNXFXQjEydDhWbmFNaHJzRVIzZTJLaytXelU2SVYrcGxka0c0RW1obEdzY1d2QW9FQXYyZStUeHEvRm5tUzZ6UmIxMndrUXBMblRhZlhsM0d4YnQyS0xFRzdmUGRrOExxalNYS09nZU84TmxpenhIdzdsSXg4ZXJDd0dYbGhoS1BPUVIreHpyM09tRVQwNFo4TWdUT0xHbHN3QVRCYkp6WmZQZTM5TXRLQUFnaVFUbzNmMUZHd3RURzlTc0loVlIycnBsK0dxZWVCWHBJbUR1V0pSZGFUU1A1aXdQekIzSXFwN2tVbWtTWjNvOXA0TkpzN2pUako5Q3lSYkNSL2NSTXdVd1RMbFNvcUNGVzVLc05oS2tzVzhGQ3ZhZTNadXZDMmtES09uL3FNMnBqVmFBVWRBVXljT0sxWnlXdTBEdERNa0pBKzJRZ1hwckNXRFpGOWZqRThGRU02T25SODJrZXRBUHdmWkNvakNpQWk4SUFPSmZYTnl4STlWc1NGZERySmVzcDVWTG5hN1hJS05FQ2tqaCtNMkl1VGZRdWUzTmgveUFCNTJwVllHVkcxaU1UdGE0eFVzVXBJMFNnYmtDVHJ2Ykhjd3U4bWVmekRFWXJaaEZJelhna0dnYUprM0NRYTFncjNmOW9Fa2lHVnM1THdRODNhK0d0TUFzNUhVSm9QdDdNQmd3RmFiUDdaOHRZRlcvU25Eb3F3b3pRNWYxdStoN1JNbzBpNXppT2hmYmg4YlpZWVc5cm9Wc1ZQakxNbFZoekQrUjl1VDh1M1hFZUhHUGpCai9Lejk1eEh0b0Z1WDcvWU5VeDNrVElLM2htVkgwcUJaT2pZbWpaKzhadmFmQnBGUTBkdnJqOVdOa3p0YUo5QVNoMWJjM0w3Q2xWTEs3R0RPSDJlaGNMZ3pDaE5sRTZNeUJZZStCbXJPY2hBTEY2RVVlTGlsM1dRUUsrdVZ1elJWdEZ5RnhZNlBDTGxYdHBqVXNUU1Awa3pmQ0VjN09raGxrdWFkOGlkMnB3OTNURjdvMHl3aTZ0RGtQUlhKVS96TWhHWXdhVkFYNHdQMUVkbHdCRHM5S1ZsVnVmWHZkSkIxYk94akdGL0RTQktjd3pxUTdVSkZadVFYUFZEOVMwelg2eUF2ZDNxbnNvNDFUMmUwU0tuVEd2RzlJeVlyckN2T3huTXN2U0NSemN4TEM1TGRlakpwK2Vja0I3aG9ldzZ0SXJqUERLZ205bkM3ZitBSVc4OEFWVkcrSVlEUXJIbkhBeWZDRVBLVllMa1F6L05QY0NJK0dYQ2IvUmtnMkppU2V3QzlCcklGclgzdFlOWTl5Szlzai9HTnV2OUN2dUh6TXJDWWNrdjY5MXhKMzV6Ri91bEl5VGJmSFhsTWZWb05tNjJZa1JYNTFkOGg0dFBYRWFZV2JBVEJJTWxtcFJDSDhFSW1Ca1ZkNUlmNDhiNVM4V2pDT0RXcjdaS3d2RXJOaGI1YU8zOHViMUZkVEFHNFFYZE1lNURkUXZoVnc1NGwyak1zbEtsbEk3bFBGT05lY24xV1FZT3BsQkx3SkI2dGN5NENMaEhCTDBicGhLM3RCZWFDSFZNeWNyeDViUjAycEJWdlRlU3RFMkxCWWxRRzIxcUU1a05nK1RyQ2U4OGhpVTY3dWZFY1E0enpraWRPN2gvZnRYQTlsWm5QcC8vTldoUkdaS0VnTU0xa1BwY3Y5UktYZnBJcGF5RjV5bmUyNVV1MHZYd3oxZ05zcjZOVUFNNVRIL01oT3hJRmtEa1QzUGpIUGpVeDRHMnVkOEVCOENFczJSSEY5R3BvT0pMZjBzSXJVdks3cithQlNBUndtekl3cVhRUmNVM2VVbHkrRDlOczZIQVkvb0tEUW5ZeVdzTi9URzg0U1M0UXJYQWt4bzRYQUNFVksvQ1NpRkVZeUE5Z0d0NDAyUFN4RVhiNXVCVUo5cllpT2tRMmNtWWxOWUpGYjRrZGxhU0dHeHhNYWFTZm9KelFTa2VqcmpLV2V4MGJhVVhsS3NzNzBzK0l5a0MxV3Z6KzNTNEhUQUVWazUzMW9QazFuamxHWEp0QUJWOTB2SVFjSDErVU5CZmhXY2dIUmhCR21vSVRJR0hYRlcvMTNPaTlVZkhyZnpwVzNxUzJZRStuVFlrOXU3MWFKTnNTb1NNcy9KZDBweThDb283MUN1Y1dUNnd3N2Q2SUhiS0l6RnE2K01mek01YWJIYWlQY2NXTDk3RmJjRzFWWmJsa2xValI2am5DZFJMMHkwTEZ1TWoydWdkOXFmeDdNV1NwSlRuWlZHVm5JakZla1lhMmFjd3Q0QU1MMnhCdU9ncXh5OTZ6bjN5WmxsNnZ3RUtRcXVwTXQyNXY4WURKc2l3bkRvQm9sWEpyb0MwY01oYVdnaFhqdlBGNytRdWxpdHpKN1BFTEFNMDgvQkdZOHBEY1llWkdTZVZTNVNicUhqVTErVTkzb1BLcW52aUJkWUZjSVR3b1F3RmlTNkVTYm81MVBXMVhhcmJzdnRUWUs3RjdRT0R0RndGZW92QWhqTVZjN3BKMnVGNmV4aHRLakVqcXMvWmYzZnlLT0VUT1V0MWZhelluQnZPdWc4Q3RtQ0xUUXpyNVNLZmhZQzdwRTVTNTNyY1I1WVdtaWVkeVYwdmRGVEdpcDE3aU5DUDVtSEZoNkwwYVJlRGszdi93cnhObUpqQ2g2K2J6T0NXZWYxRk9NM0FwQlFtNDRjRi9nVDNnUDUydjdRZEp4U2RYUG9Sa1k3YU1pZDduelVuL3ppblk2LzNocEdzaWx2eGpDcnE1MzUzZVF6YUMrSHQxRDBHNWhYdElSZlFEOEhTYjZLWDVZdGVhdVlhUEtxYVo5b3JnbTNlN3l5Vmo0a3VhK3UyRGdwenhwVEEwZGs2cHFsMDZhVlpERWtQUlluTnNVc1V0OXRya1RDZkdWcWFGbU1IMXU1M21rYTdUTC9EdWg0dEZzWmlaSU1jbE9OQVJ0YkN6cG5URkovUGxIZmhIcExzOCtlaHR1WGJKcmN6QStjcUpFMENwSTR2NGtNa3FJclB5UFJvZmVBVE1uTE9NQnQxL2Q2am5nclJTb0NSWGFWQngwb25YckJCNC9WejY3S0ZtaDNWelhNT216NzJmSHF4TnZ3Uy82Y09KUnJtdnVmdnZFUFpzR3BBc01hQ2dCM21aSnJKTGh2bWxYSTI5S3lGUUVMbjlpYVBNY3AyMWhUeHVXRkthN0FmcWZ1anFpU0ZxQ0UxakF3eGdqQVU0ZVIyMi9uNVV2Zk1INC96WVpIWFlzdXc0UGpLdm9vSXpPRGxvQ09jTVIxSHFVVG9yZHVMVUZRdS9yYjgvTkdPY1p6d1R2QnV2S2xNaUtFamFqTnp5VStNbGpTbmlON21WUDVaVTQ3QXk0bGJEbGR4Vm42QUdsMmZHaThzeTliZmZvNG01bzY1eFY2YWw2a3dvUitQdWFwYVl4K2FldXNYNjJoUDNTaWNaUXdPYzJSb2x5eHpkSG43Kyt1VXJ2YnQ1a1c3M09yMkZDNWIvdWo5NVQrbWc1V25MZXFRVkppMmt4OWl1UkMwTzdaMlRQUkpNbkFLcEVLSDdmSTkwNlNpNjNZMU5Bckh1OWxiMmtiQVhSMUphY1VqL3AzQnE0K0JJSGNlWjhnY3M5SXVBOE1nTmkvaFFsS0lWeUhna0NBeGw4K0tqL3F1SGpUTkp5OEpVZ1hBTFU5VkUyQmFaWmU5SkdpY3JRSjYxd2VtYjZqMURKSzYxRm0rZXkra0JqTWU3VXZhbm9sZjFYdmlKcTh3MVFCWTZkTkZPSnJ4RS9EYnNGbjhxb1FjNlYvYm4zSi94SGxrcDIzcXNaMTQ3emIyTUlUTWZ3UjhTclEzOUhLVjdjUFJ0UHdZWTRXMEhHUjhhdWlHUlJEek9QZDRvOFZyTHFGUVpJMjJ0bmp2R2k1eklhU2NvNXUyL09lSFhYRnMrSVAwL245R3BMYUpVL1VBc0Nhb1RRdkVwVzQ0RGM4aGhWQnFaZjZmbWdrcjYybnVFRjRLTVVqenJraU5nRXJmc1lQZHViUVZ3Z1lvZVJ2bWw1WHNlTzU3VzBmRlBOWXVRSkY3YXVTaDBqMXZpR1Z0TEJnRVFYZzR2OW5NTmxBN2J6N0ROdlZXNlN3TEl3OERuUFRxWlYrUllJQjEyYkE4Q1ZpT3YwN3Bya3J0RnlRdGNDK1FTV1Y5RWgyQ2NPZ0FTa1RBWjF0MWI0b3RBK3lKMjQxTDV6bmh1TjNiOWpJTC9TRE5QZFdNb3llV2dyZ09JMzQzSmhkRktMWUt0RTRlNlUyaHJGd3g5eEZwbEl6bDRxNEI1RHFocnBwc0JQSnNCTGt6WlRkZ3MwNlpIQVJVZUZKWXZUN256Q2xPS1Y5R283OFJJVkV3b0piV2lJeGRYSXEzZktJQnRZSGxZMVJXd3NlOXBtYzQ2THVjSDlWRDE2b1lpcy9QSXNOUndQWEpYYUlPanpzYlltL0tCS3ZmQmk1R1JqRkxjSXliWFc3aDdBYmxQUVdQWm9tT0YzRTAvQ283emV6cDFLOXRadGVKUURJbUM2UTZlQlZLa0hURWpGWmd6REhUMWhHbExsUmwrbFlzUDJnVDBtOWZzYml3VlkyQzZQOHhwNHlzR25GYmhLa1BFd2FXNUUrTUI0MFRDY29ra2RUL0JxemtVaTVoUUdKVHpXcjg2UDltTkVhNkE0NS8yS2tndEV2aDJaQkI2MVhPR3RFeS9EU244Wng3YitSZ2FOS3orQlRaaTRPRVloNUFEd0YwVW5mdTJRcEpwQzYzUGxIS3lpcWlsTGhTM1d2aS9ENjNxVTZEeEJ5YXIvQmdXS2daWE9qQTI2aHljMERTcit4aFFnb0lkSkRKaWFSS2NDaFVFTVNqUTNPV1ZXb0k0QUU4NWFHQnlPOVNtcUZxbTJWYU9GeElXM0o5VEcvVTNVNExzNEV2M2dyWkRVaXlMVXpacjhCQkUzbW4xZGJYYVAyYXlIb0NwU0k0S09BVVd1YVF5Z1FOcS9hTmVZVlNzM2dnb2IvUXlQYVg3aWJKZy9rYUJXS2hPbStEMFBMaGFoaW13L2dKSmFLcDlMS0pqQjJGQ3d6MW1KUHVYdS9VaW9obHcrRUk4TG9HYXRGemxFQmxDNjN4dStPZXBrbXJMNGk5OXlTTkVBZ1VuY29NMm0zSUF3cTViWWhLdjZMajNVMjBQcm9yalFYU3lVcXBVYnFzNWpXY29Lc2t2dTdyQVJXZ2hlVzZBM09MSTZIb3ZoNHpOd2ZaQmh3b0ZISHhsT3ZMN2xXVmdOaHhlV3F5ekpRREl5ZGhkdHUxcXR6Q01SZG9GY3QrQmNvZ1o5T3pwL1FEUVRHNFZVUWlZNGRuQllyT3FIOWZyVGk3STBiK3AvZ1VGMjNGR1NodUlheDZMRVFhNnlVOTlsV0d4ekRUeE95b3lnaUtjUEpobXVCTmZJKzdKeGoxYWlZaEpuOCtaNGRzbEJtTzU3akk4V3F0Ti9aVlQzYVBIb3RMSFVaZFBkQysrSWFNUWxEUzdsRXRaektlOVJqOE5meCtlS25wWDFMZjVXTkNZWjRwTGU1K3FDZG04eC9KSldMNzVNbGxUdmJIMkF6eWdmcmdmSEtmMWhCZ3F6Wm1EeU1EWU1oVFNvQU5uU2ZwQ0pqeHo3SDBqZjBjL0haRmMyM3Y3SVl6VUg4Q1Q3NGNuL0ZPd20zQlB5V2dCbWp4SmNEYnlycVRDYVc2U3UvN2N0RmszY2NOZ1hDUS9CQkw3Wm9oYlFHSUV3QjRYM2xNc2ltL2dCbHNzK3RkcG1ZamthdG83VUx0VUhxUU5NNWNpMDloa0gzVU8ra0VwMDRiL3VCd1NwOEoxa3k3WllBbjA4ZEdwMHd6ZGNEMmxHVHQweE9icEpKOGRRbXJZeWJRaEZSRkNJVmFlZ2RWUmIwdzd5c3A0UUZMdWI4YlVsWHpwQ3BoM0VobWViMUg4Z0o5QmZweWpPL1lVUFRUb01SQ2RTeCs3Q3BwZWlpZzhWN3gxeGY0V3BwYWRGRTZHU1NkQVFLMkRxZkNtVlFwa1JPMGIydXlGZlpBcjdOaDdHRWY1b3RMcE9BbmJ5em1aUDNKSTFPMHdnSmRxcDZ3NHIvUTlySmNnOXMwUlorVmF0aEYrYTJvQVQxcitkSEJIRVRucGVOMnZob3ZlQWQ1c3dQNTd0T0ZtT3dzWlVDSEU4UHlWRU53MzVWb3I2VWpCdnZmVnk0SEprU3E3dU41aWJzcmZibWltQk56eXQvSUtBdVpFQnd1aHZXdm01SVRORzZ4UTRRQzhScnlNUlp0L2VWQWhUVUMwemZUVkZqbUdySTFXdkNibzROdy9icGQ4QUV2a29YeElwWUdYcFRIbFdSRXIwMkkyVU9JVUF3clU4aGdrcVhLTjdqQlVTUUtyTG5kUElqZkdDclN4S2RXTy90Y1JiRm1KdGt1NkREd2tZYTNjZk96SXNicG10NStXSGJudkJ2Y3lyMWY2RHBTMVQ1Vlg3Rll4L1g1RzJnM0NKWW04NzdaVG1SdEpmVi93MVVqNzJSSXBsMWpoU2FJU0NxVG1BS0pKWnhlUjdXTUk3Wm1zQUhYUDNzLzNuMmN5UTlMSDRGVjJ4NTFpVzluRkxsQUxrOGFKVG4zTWZMY1ozeFVKYU95YVdGVlFCdnc2K0hUclM5bEVYTGNYSlNheUlQUGdlZTVIVDQ0V0hRb21uVjNielVLYW5ubE9nQW9IU01BYnRCQjF3UmV4L29jMzJtMHlFaDVOdTlaTmQrWmpKREFEWHlrdGdFcEpsYk05Ni9RSmdPYWRzaE9NVWdmNEN3NXdraG1wTmgycmZoTnpvNFlnVExyTldXcXNoTE9ZOFZqTS81VTlaeXcxZm5WNWdoZ1lKdFBaWk9LNFJ1Z3VUK05kekpyd1B4RTdpeGphZEdsRWYvUVUvVFpvRXZXSXE1T01Ndnp0dnpIQ1duZmFDMit4c3FMM3JKQ0g1VzB3ZkEyQjREaWpxbGJUTGNSdW16VTlrOXRRS1AwNkF1dm5yakJFamdTQVhheXhKbE1pU1o4QmRwYk95L1lhYStwM1BBNGtIZFR4cUh3S0JVNXJnNkRhcDVXelVmVWgxeU9jZU1PQUl5QlN1QnVPVTNSU1phaWZZajJoNVNSd0ZaZTFrQlhOQlZLaTFncTJSTytZZWVuSXhtSmcrSklzL3VqWElFaE1nTktxbVNjaGlVbnhCbHZsdmliK2tNM1BBNWVIWktCL29lcFhmTHNBSXlSV3krN2pBdlBKRmhEcEJPM2tlSTFoK1lROVJJcUZNdXBGT01GcGVaelUyMzVTZlM4Ym12NGVxZy90SXV6QVFYTnE5b29VZWRaTGxSakJKc2dDaVZieHBvSWRBZytDM0tEK0YrK0JieXh5VEpHRXJDYWtncXlmYUJlUnVIaUlzVzFoTUJ6U3YrMmo2M2dtY1dWeHhpWEtXZXNiMWRtbzh3MTlvOUFuMFpHdlJMakhHcDVBUzlyTzI0QXFwRDhGeVA2ejVlNjdOOHhONjE3MTVaK0RnQ2E0c0xoSFRmZUJoSFdwalRhS3JROGdrakdPOHJ1SDV4TU03TThKUEJRcDlMQ08wVWh4YllpNkRSQVpITXdNNlg5eWNBa005bUdoVWdRN1c0L2w0S1NFTmtEZm50K2l1T2FJK0ZXdXFIMmQySkVRVUpZNnBrZkZibjJERnM0aTVhdEFXU1h4a2gyZXJhbzBsekRCN1Bpejd1TXhGZUxGeWRhb0RyeXd1Mjlla2x5bytCa1J0aXhXS2RYY1BtOFpEUDV0dk5IblpoWmdWYmo5Z3krRkNtQVRTL2NRSy9MZmN4S1NVTU5pL0FWN3lxQWJLVDdqZGF5YVdBTDh5OGRMam8zQU1HSTlDUGxVM3dSSVA0UnlnYlB6cnI3V1hDVHNlZXordEtkM2d4RVVnWWNIUWhHVVMyT0pyeFRqTCtGbnprNTd3TWhtQlBTc1JERFBHK1RIYmVNSXRZWDdyZjhZRHQxU2wySzh1QlJwQ0tpbksxQ0FJbmhLMkE1d0tWamdjT1hRR3pscWFQUnFGK1VPSW5DaThPcnZWTUlHUGcwanNRN3hnZkF4WFVCQm9IMlV2U25ET0Vya1IyYlI0Nno1WDlvc2o2WGUzZkkrUGFSZ1lsY1YvUVh5SVE3UFpSWWFKRkIzWDhYTHBYMVFIMXZPM1BoLzg3MnBmUUZEQ2RTdFV1VjFKcS90bjQ1VlBHZkcwaHN6WGlHOGxrQjB4amJ1OVdtd1hsQnBWdWJyZSt0eVFxVGZQWit2S3hVMXVYUVo1bVozZnZyREJ4ZHZPK2RDckpiNW9WZktsQktSU1I2UUdEbGh3d0t3TkRpL3kzZW05ME1RWS9kaS9ZOGNXM0RaYkI2Si80WmJuQlhsdERGeHJleFp5ZnlXUi85bFpUeEZodEloeTdhU0V4QzgrL2RnR2VzVE1UUkpzNTArMFBNVFUyOGoxL2hvaTBDOVFGNjdKNEpRazN2VDBVZEN4R0VWM2l2cEZHaUEreVlyZHlQSXFuRjJHc1lsVmJsV2Z6d0o2a0UzNkkvcEtTWWY4K0lEZ1VtMkZzajF4RElSMVdaTWhIcmNTc2ZMWkhCeHAwbndmMG00c2ZTanFHelVxR1BSVmZPaEw3Y1pLMkFDSzBISmV2VUpZVmNNTzlqUTgrSFBwdFlrQ1JKQ0ZHQjcwbWMxd3NtNFRIaHZGYmh5Rm5LZzJzWUxpZG5jVW55QWREMjBza0wxampsSzBJK1NlVXVqS2FEWFU4cjdyMm8vbjNlaGJ5dWJLcDJFTW1TSENKYTdyWS9oZlZUbmRCb2xmTnZzWHl6WnBybmQ0N1NrQU5ZZmMvdzZvOXBxRW8wZU5VYk5kZjZiYlY1aWd1dkUrdytYS3BucXp0Qm9jU2g2eTYxQWNmL0oxaVVCWUgyNGNtYUJrc0xZSWszL2IvTEZ2blFaTzllSzYyemJSR0NaU3Zxc3I5dkgzS2taN1p2MUR3VDlReDUrZUppZ2s4RDJCOVc2b1FDY2hYSFEvbmVIT0czSlJ2WlcvMTRTcVk3TEl0R2tFZmxoL0tZa09NOXJ6QW9OOUNnV1RoY3N4aEhvaGMxK1ZuRXZraXVobXZrM3JaT2h2S2RtTXEyY3BEZmFjVFRwYTRRQkhuRGZEOXZmMjR6N1dvaXlKM0tpVEZkcTBUQnljcEJSeFozS0JLWHlWeGwzRVk2SktrbDdDVDJQb2JyRjVJazhWcWlxa2RZUU1Nb1l2WWUrWW45Wk1PU0Q3L0tJOXdPSWNTeHRramU2SDZqc3NGTC84MlZZWmVTc21sdDluR0cvWWQ3MUR3dHRlL2F6Qjk2cFc3ZHREZ1loTmZLalR5ZWpra01TSnVlL21BU3V1a0lidm1hRGxVRWZSZ3prdTQ4blErZHdZZ09TVyttY1Z2NGdISVRPalA5SGE0T3dDb2RuRFlUT0lad1lkNjh1NzlsSTFsSkwxeEdmZWRyU0ZzRUllYzNPZXdrYkxiSFpaRDdsVUNObDg1cnY2a3JiaWlGTDdiVnNWWTlQN3V1bFE2NlJqQWwrT0Qzam5JWG40MXNRQ0RDTmU2THBwSFlnTTNMNS9UNkFudldzVUY4VFZxKy9UNHhxN3NQOWNKQlovM3E4WDhUL1dENkNZSlNYanFqVjFLRStUVytOdzVaZXNQblZzTGY4b2pDQVZKMlVBdlV0U1I3UzNVZHd1T3lEUTQvaGlwNFJvb0k1eFpsQVRTM3d0Qjk1UzhPWUR4R3RBMHdCR3V6UG1XV0w2UWNXd3V3MWFZR2grS3ZQcEFXTFYvaWp3TnQyQjlzYkNMdngrb1hFN3RaM1VjcWxDcDJibFJJdmI1VzhBOUpRTW5iMFYwWWpjSlJ4a09ic25OUmpEcUZHbFlmWHlXTlc3M2xLR2JjL1FnelBiTlpsU3E5U3g4LzJWNVIyc1k0dGsveDVTaE1WZGh3Zm11K2UrWERiRlZqRzhGZUtMbUpvZGJweE1LSlVlWjc3cXR1SmF6MC9ncGY4UlZ5cGxEdlVlZ3hrZys3UDIvN3RlOE5QcW5lTS9iQlN5VXhvWEJhdU9oWExpYUNPV3hiNzlCWWxnbHRicGZhd3hRMUNsSndsa0E4MDNXa1pvRWhCZS9EMEpwL0tuQ1NaMWlQekowekkwZEJRU0U3YkpLMnVQblk5YXRWUEh5cXJWRlVsWS9mQy96WVNqMVArZjMvYi9jTkY5TXlUZURyQXc0WnJjYmNZRjhxY0pJeU9SMElGWDRoamZVUGpxT2NTUjVMRTNCeXVmVmlpMmlBanM1dXp0SUNnQlV3Y0NSbURnRUlRZVJUUm83dG9kcnJqNVpSYnEyeXI1QkhuSjFUZm5BM1JkaGtRWGtzNDhXTlZUSzdMNVJYWDVVaExmSkdlcDNGRUtRUlcrQVpRaTRoTHdtR2NCTENrV0tkZFFCZ2gyOW16Q0FHeUVpQjdSSVVqWTZsVmRFTC9ueU1nR0FITlBrS29TT2lGMEtNemI0Y3VySXdNRnJvZ1U2NmJLcHNxYWpsTFp5d2VmQ2x0N0c4aDY0ZVN3R1p6RWNxN3dUemdsbGRYN0ZySmdwQXI5WC9IMVNFMU5nQjVvQUdRTWtseGVsQ1VkcnFvQmlDMmtHWHQ5SkwwM29KSElUYmJZTmdBaWZpdmdJV01ENy8yZDJ2cDc1Ri9OWkFSTGpLWWNGQ2VOQ1hNUzRtRVY0RFRBSVkrSmN0Nmg4WXdpQnhVZFZROVRSYmtIRzN0UlowaDlhbks2VldicS83eTZxN1J3NG1aYlYxeVd0U0Z4WFlkZDcwakxTUVQyMzdjbGJidGEwVkt5SW1RTnF3ZmpaaFB5MDRvcmVzakFJMm8xMjg2YmowOUZjdVVpTGZpalI2enVvMnFIRjBnL0NacGMrZGZBZWZ2V2J2SGpDakNPdjJaSHQ0NEU3bUFDbWtXV0ZqcUUvK2FpM0E3R2N3ei9iWlFVZjdEaXlWZjBPSjlVdU94TmErU2lJUE5sdjl6cGFXQW1sS3AvUkI2dWc5WGF4SGU3bjRNVjcxbjk3b3NCa0lTU0M2WW1ZUzRTWCs1VlkxaGhGSlBMRXFodHlaL0pLaG41OEY2YXFBdjhkbXNrWkRJVzBONVVhcFQ0Sk9CNFoyMnZ1NDQ0RmpSVmwzOXNxMUxnanlCcHVnNGVwd2sySWpnd0RKWTRqenlpaFc0WGV6Yk4zMUlYV3JUR3JoMEtkendteTROTEwzUGo4b0lRSFQ2YmR4YVdxSXZ5NHk0ZklseUNac0RkZEpGeUtFNGw2eW9qYmY0ZkVOYzIxWWM0TFp2Y0dIOWNLZDhCS0s2ZTZTVzdLWHZ5bTEwckhOR3hJTmhXMndWb1NyVjFZSmR2Q0JHWGl5b3ZERUNoWWI1cDZ6UWxsa1BlZmRucWI3V3RnWlFtWlg0djNrSm1LN3cwNVBGdi9YV0JFUkJubEkxeG9zMnh1RUNlaG1UY3JIbEQzUGVjeWhMWW1uVjV2UDRRVEtHR2NNbXRTVVFaT0JCc3Vza3FmK2NJMTVyL2wwL0tDSWlKWWVxNVBiVmJEelF1bnFIT1AxMmtLZTJ0VEZtbldtdGZXZVo3MnhxaUM0S3RMT2h3eWhWWlg2OHpGcWZ0cFFjSzR4NWFEakhFbll4V1Rlbllja0dOLyt3Z1JTcG5nZXZoa0xEdGhXQXJjc2luOEhMYk1BdG83cE5odGpEempFK2w4c0hobzJrL3QyZVMveVZLeTl1ZHZGeXVMaE1iY3dHMFhDZ2dXNDhkL2lDYWdSRzI1b3dDRHRkdTBpbVJ3dGx4b1NTMU5GQWgrbFFramRGb2loVjdPaXNyVTBIWHMvejd6am1jQUlnU2pueXc3ZGVxVlVqTk9Fdmw4dnNjMXdSM0liOU43bEFWNzA5eUxtMkJFcHh5djNxNnJXbm5Od0QzNk5EKzdJNlFMVkt4TnYxdzhZa3JIcTQ4bzdEYkFOaFJWQWt4a0RLTnNEdFh5cFNIMWJwaVZJUjBObTJEeG9KMitsQ2ZJbU5UVFA4U0FzQklTelRVR09aZWhuOTU2MjJGRlh5d0RCdVlEZ3BBQnZqRHFVelZkRWoxL2kwVEdVeTdaN1VnVmRGUjk2c1A1b0pjb1lNY3hpTmk2dkhOeC95VjB3UzFlRFpPQjJoTzhzc0M2TWMxaEMrTVVSYVVFTHZrVW9nSFM2emZncnQvRXlOVHlmZ3BwZWQ0Y08yNjlQcTdKWDFJL09Pck4zWVZkU0lZbzZPZFVJUW1ZTXUvM3A4dU5xdDdyYjVaR2hlK243TE9ROHJBamp0SkxXVVBMVDBGc1dBUWpXSDNsWFJWbDRyb1BOZXBLV1VvTmp5bDMwL3J3Q2FhMWFtOVVNc3ZqRVVSaVU3WWVBb1RNTm9IMGZZU0UzK3BjQ0hJb2l2OVdwSTZoWHF5K25Ibk1wNThHZnd3R2lkNEMxdkcxcndtS0Q0TXJyZktURlNPYitYSlpDclZYblp1ZlRyTnAzZ3h1cEN2b210aG9BcTJZekhiTjA5UTRuNUs0N0VUZ25IQjNZWGFXT2ZrQ0taZDVLN1F1Q1RlY2NCby9QWW9UY3BmaWFLMkkwTitEcVh0S3ZhS2hJcldZWDRkTjVFSnZlcjNobklwcTRmRGdpYUhWcW5hVnpsdC96VlpnRzdzTE9acWdHZ3lOS25VekdyTFN6WVRkRFI2eWVENlV0RVlqRnFNdzFFcVoyZlVmdGhGOGhKeC9ZL0crWWRibDh6ZEs3S1NUTnNWc1U2K3NIcUFGb0RXQThscEVCK1lkZHdmRXBTUHAydDlVL3ltUmtYS0RaYzJoZHFhczEvQVhoVkwvSjdweXFTdkNuQnMrajlSRlVkUlpxaHNFMWJuZ3FlQldKSDZhRW1JTzFidTk4UDVHWUZiKy8ya3d2SUs1T0JxMk9hb0pIcGRTSitFenhkVEg2Qmw5UXpFd0pvZXVpN29CK3BlV2UyaExHc09qSEk4bk5Yc0svU2haNDFNVklQdEJKczdjNTI5S3QrREFqRCtsVy84Ums2RnBvQitVNXhZcVZGSDBlekUxaHdKSGZJVmVURFp6TXlBMnY2SjB3eU9DK1hROUVUYkl2Z0h6b3l3Ym5BRk5za2RJSUZGaDNjMlBzNXgvMjErQW5ZSTYzbkFoMlp0ZHBQczVMV1RJNGppWE1Qc1JxSU5hQyt6SkxISzFKekEzeU9QOG9qbStld0w5WDRESFdUVVQzVW92YU5aemxpanpaOWVQZGg1d1VLd2xYQWxLdUxZNzFIQzZNNG4rdUd1VXovUDVBVVBUQVhzZW9xMVN2NHJ2RStzcFYxNDZVa1BvQjNBaGpkM0pzMjkvaTExVlVneXVmalFsdUdFOFVzTnE0ajR4emJWOVpCbHZnVk4wbHFoK0xOeG1MSit2RGFVbEJuaW1JWlU2VWVpSExxalN5TWQ3WWtpb3VYRVp5TGxtdGovV0g3elpkemxZT0JMajU4elJlK3B2YVlycE5zU3dYT1NUZUVRV0JNMmRWRmI3a3VOK1VEc1YranRuODltQlYrSDR3dUg1MnhpN0hiTWxkc1VqbnE2Y0lWMVY0Um84R3F3SlEvSlhSY3BBanloTTVsRFcwTWxnSlJIMStUZS9WOEtRQ29RQUpjWlYySlFNZXVrWTd2WGFhWFVBZkNRR2dLcGdsWW8vcVJyZ2xBdE5YcXhlOURDR0tWMStrZ29YWWpDYitLTVRrZ1Z4M0Y5UkUzeEM2UEtHdzExNmtzMFhUOFl3b0phMHMzNm0xVEhqOFpaUzlKd3lRZkxBeFR6WGhtcktmdWMvSVJROEFmSHF4K0FsdlA0eDl2T0hMMFgzT0JSUDhJdW81UjhSQXFVNzVpM3MxU3RiNUV2VWtER0JFaVRWMXByY2VGTDRQbFRGM01KY0s3bDE1bGF6dFRQV3JjU1phL1YwQVlCZVR1dWY1U3N6d2o3NzdTVVp5eGU4YUFDVEZ2QXRJT3U0Vjg0ZFRsQ0UrQTBLSEpxMkxWVFlVdURidzR1dFNJSFNHUVRQUDdWc1F3aDZESW1CWVV5d01mYXpqM3kzMXJBRWVPUitlN2prRGtSWU5Ib3hVTTFYUis0T25WZ0RWaUZCbnpuQXA0TTM5eVkwRTdhc0pmdzNBTkVZU2lkUGovV0RMU1Bkc3lDU2JpWGlDeDFCYzdWTUxYSHZNY3lVakhvc0FvQ2VKMVh5c1BHREVNRmtVTU01djEyeWQ1M2tWWEQxQTZwM0dUN1ppdHdGNlFIZlp2RFU5TnJKSGU0NTVlaDRqRWU3ZVRncW01LzdKNHlpREo4Rng0Z05PS3pGa1NHSUxNbytCUnFxcyswR0VLWDZLeHM5RXRHMjVEL2g1aW1yUWk3VlIwRk40am5JRTZ2YWt2ak9hYyttdjQxZ2RJb0hMckZCbHNhT09maHRXR1dQN2Q3ZzVzNkQzVXB6ZWx0YVpnOG51eHJmZGs5V2hCODFCaGpMejRBd2Y4SkNEQnA5NUxmWEFvM2JYQWk2Mll3dkk0dW5UdGcxRDluYzF6UWtuSjZlNUNUSmwxTlVjMzljSDVCZmo2L2RxU3lMZVNnWGdNc3FRTmVKUzlQeWVuWHZGQ0M2dFB3dUZkdFF3K0lPcS9JeFV3dzFBekM5ZFd4bWt1bjlIeW1rVTBOQUFSOTE1VnhLNDJydktrWFBFbllubHBYcXhMSkNyeUNGK0xvRFFWZkt2anZyM3FxMXRNa2s0YzJFazQ0MkEvbnpnMHZ2ajlwektlRGVWVzNLNFlSanI5dk1HTzJIZ2JvbWd4NjRQbU1ITGFTSHFTekxyUjQvQ2d4Sk5STzJDelJlU2lMRUZPb2wvdmtDU1dINW9rRDEvMWt5blJrLytBTjhVazYvTjFkWE1JaFh5Q2xPbWtFMDBTMmxBNmZpWXpXUDhOVnVwNHFOeS9TQk9UQjhVVHZCUVB3TzZDYzg2Q0hna0JOaWhPQlMyRWZNaWEybThsVkh5bmNCVGtXL25VUGNUblUwanNIK3ZRRmx1V2VkSWZDYUIxTHA4cGEwbnZQTEZxZEx2VE1kK3lzUmgwMFJUYlN4OFkxdUU5ekZSVzRyMDdzRXZtNzZqNE04WUNMdElaQ3BvekhaRERMMnhJelliQXZQNTlQVXpvN1VTUCtJSlMxcGxuVzRhMDd5N3o1TTdHUjVCT2Z2dW93MUFmZk1vOWltS2VvQmVzNzVvMjNwN2JHcjV0ZUd3MC9wL1c2VnFNK09aSG1mWUJzQnhJMG1iWEVySTRFUUxVUWFkTXJTVUdNRDF6VEtmRldDZVlUQTlETm1OM25ZckhpSnIxWnFwTXZ3Q3RzNHdZT1hwUmdlL1E3bEFpYmpYK3ZLZFRLVElvRG0zb25VeEVRd3A0bVBsWnR6YmdhbldvbXFaaS9kUDVkcFJWT2g1SGROaDIxWW1hMUpNOHZhM1RMR0hLV1crWVhBQ3Q0NlpMS2pTNFBuM3Vrd3FFb0Y1RXNsRFc5LzJrdnBkZEtpOFZzaVVLK1JFL05qeVZlalBtSE9Gc1AxckFTNmNOQnYwOW5UZWFNdEZDVEJEZE1xdGhXOU5ZR3NibjFjOEh1V25wdTIrR051RGZNWWl0Q0IrZjk3YnpXRk1zTi82UEgzWXkyNm94Y0J4RWdWVXZZWUFzeWdvb1N1enZpTTZqWURySXhpVEhOa1gvVUoxanVYZHpxbnZNeWVXREJEOUltKzE4MnNsamJyZnFOMnlqbC90RjV1TkdsYWlFaUhCUEZyejEwTjJsQlc4K2owK0hkem1mSXg5SEFETkhwdmt1MnJSRnNkZXZxdUpNTFN0Mkg4NHhNaHFKVlpZbStuQ09rRmw5T3llejFSNm9uQjR4OXZxL0Y1WldYOUVnVTU5WVJCZ0ppT0J1R3JGZkQxeHl5NmFoTjl2SWJwc1M0SkFSaWp2RldZYXp0emZoU0ZTZzRQQnpHdHIyOTJKWFVHb2pXYzdDSHVhVWF6MngwMmY4eVJZaGtlenF2UjNSMmt4N2hWWFpNcGJMbkoxZ3ZQcjQ1Ni8wZkM3NGNDVmZtQ0lyWjA3WGx1dkJuYkpONDJvazNiNmVlVCtXbG11QlU5WDF0OFV4MnEzclhzTXRKVzRNUWR3WjJSN2xaMTVKcGVYdG9PcmhVTEowU003eWJ3WlBmWStQT2dhS0x4SjlzVDJCbS8vSFF6bmtvbmVNalJ5TU5PS1hWVnhZa0xDWmNuYTF4dHl3eUhJNVduT3paczUzOS9qNU5xdVpRaFRiaFBYdUFwU2RHREt6cFFsOWtya2ZSbW5hdFRHVzRTc0xuUWQvc3QwL2xUV0FSUnFCMDgvZ3lRTnZ5NVBLZkJrU0VyZmZZbHRlRDBka2VoVTZOWGVHZ05sdml5aWhkenlZQWFjZ0c3YWovdElLSGVYa0hKZmxhU1htckllUzBYMVNhUW1HNU1YZHlXMG9BOHRpZE9XWmNKcGdQMjltRGFwOHlnZDh1bmJIQVdvWkg4WHY4VE5tRkJaRU5UVFVIWlE1MlAzNnhYR1B2UVNZZjFqR2xHd1ZaaVZibm1pSEpIcGtTYkE5cW5mdGtIaVh3Uy80Q3dIM3l3R3QxZnNuaExONWhZYjB5VWpFd3MvaXZtOXIwVFJCdEs5OUdxaUJkSnR3Vys5eXY3K21xTXc0YTdVRlNIYjZLZFJWZ0VUS3NQaElIeTZBbWhxcVpWc3RUTkpMZHd1MEo2SXdha3lMRHNxUy9XSnlmdXhDLzVNdHc0OXgwS09aUXFuTXJtdHRIWFA1ZG9YYnRxdHNVbTREeTBMUERPYTNLSXNnOUpIeVo2NGVBcDdzSkZkU0ZNemx0OS9sODNUMVNwbko0T3I0SW1va3pHUlZEbUhKN1JKRWU4RTc0QjkxMGplcXlHTmFPaUo5OFZrYWFOSkVaYUxHOHpveE52eXRvL01KbGhQNFE0eUc1VDRuendFZUF3dVYvZlBiQmtNbk81dnpzYWxMa1pIa3ZwSjRieHJRTE5MY3Fpb3VBU2x5eE9Mbit2a0ZySU84bUVjdHZkajlTaTdrdDZmaHZmdDcremhFUXkrK2VoKzFETmFHelFGalpQWVc4V090aS8vVVFPZ0FDUk1Va1RuMHZHaHZOckhCZE5WR1ZtbThmYnpVUzdoMFpPOWwrczcwMnBhcTZ6aTJHWmlRbHRJdzlKd29RcUdRcTczTldEYWdLNmQrMlNjbG9ZR0pwZGo2VTZWOXFLeFBTeC8zcEpWWktidTJPZE92MVUveGR6RDBJekFtQ3NKVXdKRXBtcFl0cTMybWUxUnlxLzZZZ250YnFZdk1YRjh3K0luTmdZSFRtYXhoaFVHVWloVWxhcnVYRlp5QU1ETWxjangrUnhxZU9MNlkrdnFJL2VwZkM0Nm1TRmljaGlBY1dROWlQN1N6THovbG5qSUtnMnN6YU1yNkViaHg4Qk8wQmVoV3huZ2ZnZDdCR01rQ1M3aG9XVkMxQmNCbDJIQm0zb3JUVWJpbFBsa2JHK083ZHIrOG1zRXNxbHhGNCtlNDQ5d2UyWFJOWTZkZXdjd2NGd0VkWVNSa1RXVERoV3UwM25jcFNiWEdOWThTakRJOUMySkxsNjNnOVUrVEV0OERmRHJ5TUNyOFl3a1p3UC9zWU44WFBpanNhalFlR3VxYXYvYlZnUjB4L0d2UGxkOFp5RldNbE96WkxyRks2RUw4QXVsaVFLTUp6V0dQdCtoRDRqYjFWV1lTWjloOXgxbGJLMmFkQUE2dkxXL21rNCtGckVCeXRRUEVBamJIWkNDbXErWnh1Q2ZDYUVQNWZieC83TDNPZFdqTDcrNVpUZEtDSVM4RkRqN1VKUzJ4TkZRLzlIMmNhRE9qYzgwVnFhVmQ5M2krd291MWl6K3p2ekF4NFVxZXdabHVENWFZekswOEF1RDE1dVZPbk9hV3FqaTl3VUx4M1ZFTllWWWhoVGdXSWVhL2RNcVVoeWM5WFBTUTRESFJTWU42cy9DQk02ZGtCMXpyc2w1cURjTWRNbnIzRHVRL3Q2U0VtTGVIazVmeldkMkJLbkRaQjdsZ3FnOVRRV2E5SEZLTnhpbEE4UVJEYTg5ZzlGVHFRejFDRE94bmdwT2hHQldUdmhUR3VuT3lFOVc5T1Y5RFVqNWpmNmR6ckJGelNOVStNWGR2ZG1HR1JFMWY1MEhVRlNaODYvL3FGSHdSOXdBblhCcmRUbHdXQ0Z1clFzMTgrT3dxR2JmbFdEY005N1R5R21PR0xHTTNKQWk0WXN6aGpDN3JoVTkweUVxdkpNa1JJZmxldGJ6c29XMWJCaytLY2lHdmxIRnBXbzZIWXZybHpPYXZrcy96ODZ0V3o0bnpzbTBzTHE1MnRlbnF0RVI1emdMdFpIaDBvM2hrSzZJQS9Nd2VMaHRYY1U5R3BrODhLckdDWVpCY1Nsb0hTNTlWTzJ2ZzAxY3pPbUhYZEVFeEoyc3g0b0FJaktNTUdrLzJhdE11YnF1c2k5MVhXWk5Sb0RuZEFjSGQvdzlKeGVtSTBIV0Z4WWxGaGNaQnRIaDRMWVhaZjlpN0FzUzY1MWZxaVJlQVhSRW5LQTI5Uks2Sk1yUWZ5WTdjM0M0Wk9XRkpGbCtmc0RTSXE1Z3NuaWNUWHY4T0Z0U3A0dzU5a2VseHFCNno1MmdJRzRWcmVqZHFYeTdFYTFMLzJxaHJSNEd5ZEkvMFIzWkpLWFQyRnczejV6V05lODNuQ04xMGl1WFlHdi9mVjRkdXRRbVlRL0JQYXprNjNZZW5RYUV5MXhXRWt0R0RBVU01RitQUEh5VWFPWldhUGtsai8vQyswaDM5VURUVTYxUnBjdDE0U0pRSWdqT3MwZ3pTTzBPT1F0RXhtTDcwUUFtenNNL0ovVmQyb3FKeGVsVktWTkVaZzJuTmgxQzRlSGE1V1oxOG9QRDU5amxJeVdnbjZBQ05tL0dPdWtPSFBHdmVtTkxpa3ZvNGR4UnpBVWZtMHM2bDJYQmNTN09KMWxMWlVYc0lldEFUNWgwT1ZhaW1RR1R2eDdueVV6VC9iZDVPcXd0N3N3S2ZTekxkV3MyV0VyUExVblBkckRPUHFwM3VjMllDMzFIVElRRW05bG52MjRiM0hHN0dnMEFMYVJrbTVVR2d4bE9Bako0Y2d6QmdZZDBOVnlPdjh2QWFBdFV1STdMSEsrb2IzaDN5OUE3c2xONnJPR3NNc3hCM21jTmgwZjl2S1F3c1l3VlBGL2ZmMkZ4djR2Yk9RVm9mNkJ4dlhMZ2Y5ZlFZV3doZUlTYWJQWHJrZGQ5Y2I4UWZLRm80VkFkQXhLOE9ESXNNVzB6QXNWcTJaR0k3TllxWTRiTHFwQkNxVG9oU1d5MTMxcVU4QjdGd29wMjlBNi9QMlpvWTVtMTFZamRqeng1VE5XOGZJdkthcVIycCtoMHhKVzBubTRBTURSTndWT1NTK3QrSHBXaEMydHYzZDVlclVDQ3ZHNzVUN0xzREFDV2dUKzVVOVAzZDFVYmRid1pXZm0vZ2xoU0tFR082d2QxamVjci85VVdyWmNSWGpVakJNcFNseTJoUlVyQlVDRlQvSnIwdFRzNVBjREtIbzlSamNaYllZMTh2ZnNLY0dOV2prdWtsK3Vud3BLQzZPRDFxd1JXNzZabklJQkU5bGtFMlZRbzIrbTQxN283MlgvTkc5RWRsM0VEWmpKV3VNOFlucXE1RlV0TndWWDRQMlBkTU1SNE04dDhicGYwWWlreEY2Y0ZVRFlCcU9kT25Id0x1RkpWQ3c3L2VDang5WlVNUjdEdGxyU3RmTXN4QkorVDhFZExMR0dQVEw1a3l2SFRMaGNDRW5aWEFpSWZnaEYzQnF4a3FYN0xaWllvem9ySjQxdkdWdmdiNE5PUkVRVFlORGRDRy9Zb1Y5eXVHdnhzNE02aXVBMmYvbFFPUm82WlpPY0FxdVViblFxaXJRRG5NcTZKb05xajFrYkI5ZDNNK3BMYmE2anFZV2U3aWxPWHpvN3lBbVVhcStRQ1ZiWHpMRmxzK21qMTd6YXFUZ0VQUTRhaUl1VUV5d0tlbGV0WXhaNnMwWGprRzJSM0tld29WaTdOWDR6bnlLTXgrSWwxcTMrMy9UTGJ1L0lMaTNNaVZiUjZBRjZ5M0FTOFVBaE5yL1JZcWx6Y1VzcXpScy9nVllNdng2OTc2d1R6SVZsWmhKSWROb0NYR3Joa3lBekNpMklLV0g5cUNWRkM4eTQwZTFCcnlBWUpvamxGY0Z4OGdwdlhxekRDNFExT0JuRnVZdW1BWmNUajh0ZGs3RnJDZkFva2tTSzUwQ0pjbjJsWmNtRUgxaHhEOGk2UjRMKzBTQ0xwL01qTHlnSXg5ZEhMdGRaaW1kUm5PMzVYM2h3bkNpb25WT3duVEMxL2Y0OTFXenJZMXdkRGx3dG9rdnpETFhCWmVuQlBGb2o5bmhwU2lBWHpWQTkxdm1OYjdKVGNqcnpmU1lwR2lCTDBjdks1QjZuU29SU2tGd2tWdzZZWWFUbEVkZlp0SHhQWkZUbFJlU1NaVmRGT0FzUkVFdW45UGtaZXpnRnNzN1Fsek5nKy85LzJpQ1E4SzlBcnRpK0tkUGtmcTh6YVVMVldHNmcvU0RwUlpLUGJJcVNSSlZ5ZU9NZHRwSHBsL0JuZlZWRmFZUHl3bzQyd2lpZFovd0svU3EwaExFMnhCZHZEQU4zQ2E1Qy9JVndja1VuckovbzVBUCsrc1VLS0ltUHU1MjV2cER2UWtJeDBxb1RJbW9xRHFSd2MrUWRHTUkzWHZoZlY3RVFIUTdIT0ZjaXhwaUl4RWdOc3hBMDAwa25LTVFVSk1VYWxaZFFvSThFMXBWU3JjSm5VcFcramhTUzRWTFBiOXhKa3dIbnZpcW82WStMb213NDcyYUcrY2hQNzdwQVZTRkIwbEo2cklNeGdTb2taMTk3YzducThoRlUxeGpHcUo4elNwTVJNYzE2cXFuUWk0RlQ3Nzc3cDVsMzFzQzYyUHNjSmpnMDFsUDZZOENuV2JQWXpCWVFscWQ2K3FNUGlUY1B2UjVvcEZERnFnakxYLzgvYkhBSTVDdkY4OWtVRUhoZDBLNU9CaitGMWlyWjlSSWxrYkplZ3ZuVFN3N3NWQW5WQjBUeTc1SlY5T2tHQU10eVFIMXo2eUNiNlp4NEtWcmtRNE1jaEhmRUNsdFdOL1dESHNwVEpCb0R3ZzdjZFc2NWZUTUM5VlJHRDRYTkdnd0xCMTl4SGxLRUZPZ0R4bXJjY1VBY3RJTE1SQWxwY3JzREdQckFZNEUrMXd3VU45dHlXVmtETHh1N0Q0dGkzOFJMSHZtNFNOaWVlcExrVElnS1pzV1BvQmVEaU4rWWNDR28zb0Z1ek14Q2lyUzl3TUcyQ2NBUE9CQ2NiUDMrdDNVTlZySWhPWWRVTVB5K0l1a2t3a29NS2lvV3RHQlpaTkZ6VVpoaG95eGZqUm1Id0dVNXR1Qi9qRUlxL0JsVW0wWjZjWlVmakZ1RDljNXBpeFhBU2NxNGdreU91SEFLc2ZWZ0UxYTdvMUw3SkVKcVR0Y2RORWtkbUZPN3VTMUE5UnpTRnJGRzAwQVE1RVcxTXJrOVl4SGg0WGxNNVRudlpkZnRXK3ZxWmRNeXpMS1JQVGZBUEJwWm9Vb09meE80eStUQlpNS25zYTkrVENscmdDVHdiN2V6eldWU2dYMER5QkVYdy9zQ0tEeXVtcDVlSllyUjQrVkJaaW9ETjdpRzhBZi9iREVVdUUybkpkZEVKTC9yMmxONFZJdzBGajVGMHp0Y3praWZaaGpTcDFwcWl1amdsVmRFQ2xuc2tkZG02Z3VYTnJ0cENQZ0JUWUtoMUVtQXFhNkM3UGRqSUROdWRudE9kUVVmd1NVcE9KN0Y4ZkdlcFU3cjJnQ2FGaVliVC9MVUpSTW5vSWpXZlJBdUtaTDlnaVVZbHpOYi9IK3R2cUp6SWoxdG05N2V6bEN6aXUycnVPaEw1M3Vsc01Nb1lwUG9mYWpwSVZrSTRxQ0NWU0xNU2U4SXdXa0VWMUU4QkFUR1JKZVo1eGN0RWd1TWlPdGtXUThwSUtnaTZFMW5ETWVIcmNXbWRoVllDZEh0T3VIR2dmdU1JNkQ2SlNWbjE3YVNZM3h3QzFOUHY3SEdmdXl1WXlVMGtrQmNNU1JVN2VxRTlYK1hlTFl0MnIycTFKZmtTdXZ5ZWxWWm5XYXg0YXFpSjU1MmVPRk8vVkQyTWY5Rnc5RDFpSm5Ya2I2U1RYS0V1SGVmeW51Q0hXOHpHODdta0FhTjVEZHZIcFRyOU42ZXlDdjhNSmFnMDkwbUxONWFxa0F4LzBra1FpdU1TVkNsbVA0V0ZEMDJqZHl2ZlNtcDkvOFMyRzc3VjBsd2YyU1piTFZzcmRPd1BORG40am5sZ3pnRW4rbWphZms5NmJCMS96c0tYVmZDZ3VBR0l2VmpYNnZtMTBRWS9rVjBjVmx4UTh4UTdwdW1KNXRtTlYyOGhiSkpxMVlrZmNJUkZXdXU4OXQxWFgxQXdybUFDcWpQZ3dLRWpUd0xLWEpkemllRU1QZituNjZZRlY1akNoenRPdCtjKzE1dEJmcDRHNkFpRU1UMFFQVWVjU21RbXY4TjhKQmwzZ3dZdXEvbHoySFJaazQydzdaTk1janR4MHhJZWFSY3o4aHkxUmx1MGwzN1dsWEdTMFlySU03b0w3cngya2NGOTlBTG1YRXAwODZVeGp4dGxmTmJsZVVnQ0M3Sk8xa05mVVh6R3FKT00zWk5LREJjMzkrSXJJRXRwWkdtdUlIMXltNUM1U2VxSFljckd3clJROVlndkV5V29KQ0pzdXFwd245Um1vNnVCV2VoMG94RTFkQUQxcVl6eGdFRWhnS1RFNlM5enlCSGFmaGs3QUlidlJocXFOYWNUYW5DcDExeXBxS3ZseVV6YWRYTUxVcmhEZWkwZkgvOW1NalJKbFc0V2RCZ3VuT0dsM2lxWFVaeTRLRXpsMDMrVEZBOVVZaExqa2w1cU5FYkp4b3VLZ0oyYkpkTG9xMHZ0VmxUWS9PdEFOczRnTXdZRVhNNW0yR1NOdGhocVFabkpuUlowVEJqbUt3Wm1ET3FPc1h2NnE4TDN6U0ZuSFZkcUk4UmpWL3NhRTNQa1dLaUp3TmJuNkVxVjE2NzVJYnIrT0UrUkNXY29mUVMwMlU0YUNQWUs1T21EVDNkOTVDS3JBUEk2Wmc0OGJadmdIaUptV0libm5rbmRzN3ViNXVBdGhBaHZlZmlLeHgyYnVJb1M0d3M1RUh1ZGMrSmQ2ZG5QVDFUT1htdmR5NXNpRm1RSlNWd0hQcVA0NlFnVGp1M2lBbW53c09Cb09IdkZiazB1TDl1TGV5WHRXNEFjdEJkTEdacm0vaUpXU0UrZXA5NTVEMy9ZeUpFTXhVL2xPVFd4bTZVQmk2U0h4dnFYRDJlY040a1RUSk9SOFFoeEdFTWcrRGtpSndzbHBoeHY3TUVmUllzejNZVTZPRGpaaGdHZmlZc1QyZHRiTGVOTjRNYTVOcndnZVU1ckVHRjR0dXR4Y3BJR05pcFBaOXBVdE5xUzVWVW8zY0lQVndqbm1zdjl2OWg1OGIxSWlqZUNOQUo1M3JkLzF6K2hwN2t3Q3ZVVXVDaDJ5UU9RTGhZQjBjbDNQS0hjTWR5aGJzOTZnbEtrMTU1UXZOTk5ZWklTM0JLcnlBWmtLaDcyVlMxa2tnN1VLUjV2cWUxc21pMms4M2ZkaVplVitWN2lMYnJGMkUwdkJtejNKazNNRVBKOXlUL0F0YzFocFdNY09ySzNVMzFDMSs2Vk1HQzlRKzYybGtEY3l5ZldSL1MxNTlrSU5qSkFVNUphMmc5TSsxZWJoQU9LcmV2Z0tTa2hYcVdPTXpWVzArMzM5eTZSemF3bXlKRE01M2pMM0d3U3pFV0Z1b3dnMDc2UTdQZnFaS1puMzlFWVg0cUx2RlB0UVB4SmE2SnZYSzM5dXd0NHVuOVBvSjk2QTYvcTJTUzFHZWs0ZjBxWXpmbHo0SDUwYTBkK2t0bjRnZmVkV0dIdWVuTDRPK1NKSUVGNUR4ZVE1VVY4WjRoaE03NldMK2gwdnNYeGptYlZsRm0xTnltcHBjMHhQNFRuTFA2QnY1T0RNTzBEeGk5bkM3Zk45Z21kclp2QkFSZXJZN3g4SEg0SUIyWWttL2lUQTkxaFdMOEpVYlhLMnhTWXZxMnhWcWg1RXhKYmU5UzU4RUxla0NFaEFkeGt3NXNNR25JY1BOM1IyTFhoWi84RlF1WEd1ek9PcUtDY001UDNKOS9XSWFtZ3VlOUQ1Q3V2dlVybEhPRUUreWhVaW94L2xqaXIxZUpJWkJjNXovS2RwR1ZJVm52SGFyNVhTdzhOdnNlaEJvZXh3ZGw1ZThjZWdwc1NHZE5JUS9SK1M1am5NY3hTa0tGOUt2bS9CNVZ5elBDYmNtZ1NvRGRNMTU0TExCNDhGVG8rd05BcGVlTDNlcm12WjI3SGxmVHVqVVdEU3BtekhOWkpSaVRodCtFZDZiUjNScm42L2Z0WGRUTXl5YzhINWx0S1MwVkMvTkswaVFuRm5EcFBjWjhoMmNlZU1GMG9Tc2MraEc4ZmdrVFhxdkFaK2NJTE9TbnJXYktlbnFuZW1BSHU5MzgyajdPSWpDUmJtb3p4MFZqTW8way95eFp1YThGeTlHWHBSQms4SU81TEUzQml1Wmppc1BtNWVBdUh4T0F4VC9qN3BQS1V0eWljNkltdFlwRFVTR0xqQ0htVGdTaUxSRE5oN3JtZDdHSjBHOGI2U0VRWG9vRm5uY0F5SjE2bVlpVm1yS0xod2JGK2d4T0FTc0VLNFJhc3JJeFFaL21aTTNqVWtLR25jODkzS0VZNnBSMDhSRGc1OXpPMkx1M0Y5Rlh3Q3pZcHhVamx6NU03RXFiSXlieURxemlNRGc0TWltMlFybDhwOVRydDdxQVNkMG94T083d1BlVkpHdFAwR3FwdzVvMDEvMDZoajZJeGdhOTEwZzQveTdRczVpczZ0dTZZaHN3eGhqeVpTV0F5aUUzc1ZoNk02bitWQTltTlp0dkNpLzVYaHk4U3NKUnd1cUkwWGg3bUVnU0dNN0xLMjZSNkZNWVptTnFiUWY5OWZDc0t6aVhCZ2VHdi9HQUNJQVo4Tzl1WTI0a2llbXBldVk3Q2ZkbDZpc201cXVaNDBoRkorblNwQ0N2bEQ1MUphK0dKbEpQQ0VOL3FpU0tJVlJaNjh0aWhvcmgrS0pLaE9lSTNqNU9Ya285Z3hRYy8xMmFieXVBOG9BNFZBMDlFcS9FTHMvVUI5bWVtS3lHY1J5cTVmZGlNaytVSGJtZlRkVVJQajM4cWxTdWtOLytralRpV2x3UmpheEsyb3ZWcm1VeG5RK1FpUFlCODQ3dHhQZWJUMzRaU05YekJaM3FOTTBqdUdkUGErUWxsOGZsWHRLZEdLZlhGQnphMEZZV2pORVE4RFdJK3pTU1ExV1VaaU1QejYraktaT2M5aVI5bDBBREpzZ21KUDNiemxwaGxpTXlpM0d2SjNKTUlibHdnM2VTOXhwcXM2MFBhRTJzMWhNWG03NlhFZDZuVFY0enIyMkdabitydjRtZ0dBVGREQmtuNkxic3Y5NzNUaGJ5R2lqMXlySHFjOFA5TlRCbWJkN3dmYUNCUFF0K2w3VzU0NUtsNDFSc3E0MXR3RTYvYUsreHh4a09FUTZON0N6QndYT3ZZUjR1ZnVMNkVNeEZBR2ZZWGV1Z2k1WnptMXc1NUZLZzQvdnpSZE5EZE56WEhZaFI4STh2cUZTUWc4RGUwSnhsbkU5WEcvd2FoaDdLQk00ZTBxL2xKa3lPa05odFREcWJJYnd1Y0JkV1BGQVlPZ0Z4UEtTM2Fmem5FaGp0SStQR2JVKzhpYjdVZW9pc2g5VE5WQkluTkQvY3VwdTcyUFk5SlpZenkzcjZTS1lJbC8rQjVtTzllYzZVSTk5QVlBQ3VjQWdJcjRRQzRaMHFiU1BIOTVkS3BQS2tHemVBYmxkV0x5RmwwcVllUmVqdlZhS3Ewc1NCRmZMUy9jQzhZRlVzRmtaZDU3NTZkZTAzS0FDekdvNmpiTWFhaXJzR2FOYnUyRzVhV0NkZmhzT2h5NWpCanFDaXZiNCt5Q1lmVmFySEFVRnNPZ0t2WVlIcEJnbStJanJqRFZROU80bGUwU0VnaFFQdHdudEpZdmZPeHJkM3dKSm41dXlkbEVwTkZRVzhudFVJTndsWjdkT1ZjcUh2ZnZ0S2hOZmZqTEUwaE9WRHZJT2dZcEpCZi9SY01FVlN1M1RuTnVJVGRiSko3NEtiM1NzQ1JlMFlQVWt0bTVnZUF0ZjJKaUZhNUZiSDJ6M1dqYmZLV2NKbEZmMU9IOXhxa3BHbjdBUm51VjNGd1ZEd3JzZTR0citNQzN6Y1hvUlBiRDdBZGEyVE9jekI3UVZFZGJ0ZC95Vlh1M3M3RDk5N0FzTGwvZmxZSGZnRnhkVnQ2V0ZBY0tDQlFrVmNveUNYWHNSNE05MXdSc01wTTY4Vnp3VFVHS2VSM1FBZEgrUXhoNGdrV2d0VGhzLy8yUUFCQUJvQVFBQUJUd0JBQUE4QkJrOENBQUFBQUFGZUFhdEFBQUlBQ1FJQkFRb0NBQU1BR1ZSb2FYTWdhWE1nYjJZZ1JtbHVaMlZ5SUNnMktRPT08L0JEQj4KICAgIDwvQklSPgogICAgPEJJUj4KICAgICAgICA8VmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9WZXJzaW9uPgogICAgICAgIDxDQkVGRlZlcnNpb24+CiAgICAgICAgICAgIDxNYWpvcj4xPC9NYWpvcj4KICAgICAgICAgICAgPE1pbm9yPjE8L01pbm9yPgogICAgICAgIDwvQ0JFRkZWZXJzaW9uPgogICAgICAgIDxCSVJJbmZvPgogICAgICAgICAgICA8SW50ZWdyaXR5PmZhbHNlPC9JbnRlZ3JpdHk+CiAgICAgICAgPC9CSVJJbmZvPgogICAgICAgIDxCREJJbmZvPgogICAgICAgICAgICA8Rm9ybWF0PgogICAgICAgICAgICAgICAgPE9yZ2FuaXphdGlvbj5Nb3NpcDwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgPFR5cGU+NzwvVHlwZT4KICAgICAgICAgICAgPC9Gb3JtYXQ+CiAgICAgICAgICAgIDxDcmVhdGlvbkRhdGU+MjAyMC0wMS0wN1QwMjozODo1Mi42NzFaPC9DcmVhdGlvbkRhdGU+CiAgICAgICAgICAgIDxUeXBlPkZpbmdlcjwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU+UmlnaHQgVGh1bWI8L1N1YnR5cGU+CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U+CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0+CiAgICAgICAgICAgICAgICA8U2NvcmU+Njk8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk+CiAgICAgICAgPC9CREJJbmZvPgogICAgICAgIDxCREI+UmtsU0FEQXlNQUFBQWd2TUFBRUJBUUFDQzd3SDVnd2NEQjhUQXg4QUFBQUFBQUZEQUVBQUR3SUFRQUlBUUFJQkFBRUI5QUgwQWZRQjlBZ0ZIUUZsQWZnQUFndExBQUFBREdwUUlDQU5Db2NLQUFBQUZHWjBlWEJxY0RJZ0FBQUFBR3B3TWlBQUFBQkhhbkF5YUFBQUFCWnBhR1J5QUFBQitBQUFBV1VBQVFjSEFBQUFBQUFQWTI5c2NnRUFBQUFBQUJFQUFBQWFjbVZ6SUFBQUFCSnlaWE5qbWNvQUFabktBQUVBQUFBQUFBQnFjREpqLzAvL1VRQXBBQUFBQUFGbEFBQUIrQUFBQUFBQUFBQUFBQUFCWlFBQUFmZ0FBQUFBQUFBQUFBQUJCd0VCLzJRQUl3QUJRM0psWVhSdmNqb2dTbUZ6VUdWeUlGWmxjbk5wYjI0Z01TNDVNREF1TWY5a0FCQUFBVVZ1WTBsRU9rZFNRbFF3TWY5U0FBd0FBZ0FKQUFVRUJBQUIvMXdBRTBCQVNFaFFTRWhRU0VoUVNFaFFTRWhRLzVBQUNnQUFBQUlLVXdBQi81UGZFK0FKUVRSZWxQQkUvcXRaTVMyM2dkK3NhK01nSlJ0MnhsbExOckhpRHJwTVYxMkNRM01scDVWTTdvbFpTejBOSm9KRTBDbWVzQXA1NGFOdDVneFZWNERhWUFJd1A2TmZ0QjVPZmRORXoyUWpJbm1BRDRLQWdQRGcvck9tdXZPT3BPZkdUTFdVOXZKcnp1djluYmVOSVVmamtrQ3lVb0R3MEVtVzI2SFhROVZqTmJGVkJQOEVlK0ZNbGx2U1gwQTRId2R1L0FaQVZkdUZhcFRYVHZJeldvYXlGLzdGcHkyNURCOXZ6aEhDbktDcFZhREVuWWhOVjh5UEV1WkRMZm9OMEdpOC9sZ0hEeWVSMXNDT29WRHVyRjdSNXp2Qm9vczA5USsrUEc5VjIrNWNEck1xdUJPQXgxcU9zRE9LQ1Y4NVpYMzZER1RwMFlnTmo4aWwxWlZHUnM1R25TVjFoZTMxbDM2WXkybXNrdmNuT0UyenZhd2RUQWJqaEt1eGxwQUFwcGt5U3R6SHA0VmRURU5zblNpajljamE5c0FxY2VUWG9FSzZSZkdOVVZjM0ZvY3dtWm9Kc1NDdnVra3Uyc3AvZ0dUb0VuSlQ2bzlMZ2V4YWlUTTBwQ3hyRDhKQ2NNang0Q1ZvOU1SbGwycWpPbUpGcGtIVElUNjNraHYxNE5wcGhhQ3NqVm5jVThuaVdKZ1dTZ2NiKzVNSlkzTFIzOWJQWTNSaW8zdUM2SVpoVitKakRZZGVLZm8ybGU4WlAxYlp4VVVBd2g2SmF3KzhPa3VxNHp5VnRlbEJpL1h6dXZQOFpLK01vZk9hZ0lQOERVZThSblZXS0s3ejBvNE5oK1M0QUdXdndyTzJndk5sbVdadlJtUW1UaEJSKzZGdWdWQStNYmsySisyQzVhMGJlNjZCeGZueENGNlJtNXh3bnUrQy90SHYvRjIxSFV1L1lRbHd1cElHTzhMNWVtSWZFT2hnT2hydm1SZGt4bzVGRXI4NnduMTNRRkJzV3g0cVg2Qzl6K2ZXMW53c3pMRlRzQmVwRkFhaXJwdmxCUUZ6UUdUcFEwaXY3eVRFSDVFNGRpSEc0UFgxQ1pqaG1vSS8zVjRCbDhpalJ6UE1ucmxvd3Zzc0tkcFhkT1RVUThtcVpJVE44OGl4QThtREJOL1E1d2ZZaHMzdXZ5UEZUK2h0RVJBOERhc1VKVXVDRklaSHZxNHhtZ2VQcG1TMFpsa1dsUW5NbE1HZTVhUUFqdDBpbU02NlVpM3RhbjEwV3dhVDNrbzMrL1MvcHI4emdEK2sySFdxOERzQnJIS3hsM0lnYm5GdlhTRUFUMzdzQTZwTjNUVWhGOWFGTWgwSUxjSHZsVHF0aHd0Q1FJRE8yZW9kbzVOdFBzc0NhdGNPSG03ZDZzRWp2RTBlc2Jib1VMT3NZOVNIYVVEUjNBbG5abjZodEdPeTNZalk5aVpGLzFLTGx5aDVCVm8xQlRqY09iY3VpWnZVaUIxRG80clBrYjhQUXR5VGVCc3NLM2p1SzhZNWh6Zm41eWpIRzcybUpsSHpnRUoxb2d2T0Nzd3cvUk95UkhhWDVMdEZyN0JOUHVtTGxjRG9CaElCSXhXZEU5MytoTjFzaFlYdGFzSDdPcVlnTUlTbjRPamF0a0xSeEdYakZveWVCcmdGWXdjd3dORDUyZmdxdm5yZnNOZ2FRL05TNVlNUUFGZmg2RlptT1pEMDVIWWl3OVZrd3Ixa2NrYVBQeTJTZnUzUDdDc2dCdGErQ2FTTWI1VW1Tand5SUEwTXJNa1QyQ0kxMXNYdjZjVEpHNmhZUk1jRXFkUXFsNkp4RTgwN2NPcmZiMDFJWHhnV1FsUGo2V3pkR2FZbEcxYjVGRUxENGV5aW9VNjFENmVDTGE3MVZHNENqb0k3VXNZMFRXQTl6YjNNRlF5dmVnS0cyR0N2R3A0ZTVCQ2k1Vkl5UlJzaUNuSGo2eUYwMDZlUmZDNDJUcTNEdnBXbTk4RmREbzV2eWVxMGh0OCtqTER3RGZOeFJCREg3ZG13SUU4SWNYMno5K29QbHFqS3hrVURPOVY1M3labGZWRDc2WlBBZnNQc0JlL2VsaFAwOWZyVXRqZjF2N01seC9pcTlhWWE0a0RnMTh5d05EZnc1Q1FOcEMyY2g3NDVCRE5nMStINFRKb2FyRk9rMmt3dEM4c3UxR3FHNHVJVEg4WXNCNUVBZ0VkcUluY0Y2V2ptUVJTY1ptQXQrMmpIcEwzN1NvajNNcG9sYWxMMTRsQXNyQnpUY0p6TUMrOTQ0bjltQVhPc3pLZTRBWW1pUDRONzBYazlQTkdUUUNnUDRIZm03SktDT1pFaEpxaFoyU0RXdkdRN0R5TmlEV3plS1JsQWUyOTdPQ0NWc2x3dGlDZnY1SzBoSFlxMUp3cHZsN25zcjVkbmZYTjQvalZYUGIvRFdFV0lBQnpMSzVGSU54bktDZ2hPa0ZxNDBiZEpTeEVWNW56T3F2SnFTeTNiaXEvcnJHWC9aL2pRUy8wYXpxYkRnSEwwcUVSVkxuM3hlTFk0ZCsvZ3pMWmtEdm5JOVZOZEFiQ2l5cExBWlc2STNDNm80c25Ybk1qUytURUVxN2M2L01ZcjVUQi9RNlJBWUdHM2ZUUnBSUjVZcFBjRjdGK1h0c0k1QmQvWEVCNzUxdjdlYjFkeTJ2ckF5dE8yZXJHdmFjcTRvY2xMZnI0QmhLdmRwRDlEYUdtS0p2SWFrREV1ZUErVnR1QmpGNTNHSm5YejBrdHUyYnJsbkowOWZNb2tLSmZzY2hrZHE0M0xWajNFU2RxUE96cFpORWM1TGlweTErVTBsWG9YVnRGMkJVdm9temlUZEZzTVVBR3NnK3owRkpIWi9zU1BRRXU1YXk2MVV0Y0I4SGptNnFuMFR1RWxKb29KNzRvK1JaZkJjbXRzY05wSkJoMFdndzVQbHhiYVFPdWhYSEFiUHNZWEpVbnY2UU5JOERFbnpGZ0RNaDBYRTA0WnZSbHpKV2JUTnVocktIeGhLTnBZUzFNaEdyc3FUbUxZN1FSRmEzOFpKQlpsd29pWTZlQllRQ1lzVGlBbEVlbTV3em1ncDV3V0ZaS1BuOG9ZNDBRT3B2SzBITlJxcjdMMXBuTkp4U3VIZEhqVDBFK1VZR1BlUUUyYm0vNFFGQzlXSFVIN21NR2ErQmhIeHlXakJjdUtteUNTU2FjdEFQQWdrQ1U0Z25LbDFTNjlXSk9JMkgxUkozTGxHNlN6Y0FFN284Q2pEYXRSWGhDSElhY3BSUVRHeXRFdFl5NzBydmVqWWVFSnNuS0JEcnR6dnF2bmlRWS80ZVUwSU5pY1FEc05vUEtwYUVka3BULzlROGFJaTFuT0hxd3pjTVhOaCtsb21BQzNIcnpVSGhobUNlRWY4R3Fsd0IrRkZ3YmdvS1dXTklGZWZLaUZIVnFWUzFRWmRnQXU3cHNpQWs0Nmg3em9aQnQrdXU4R3F1T2ZERFMvazFPZkVtbHdzL2xTRTJmYVd2MmpENTVFazZ6ZzJ0MXNPRlVRQWFJWVdlL01xOUJuakhqa2taa0l5VnZuZWZrOTFvK1FVUm40cEt0azFNMk5CejRGcHRGN1ZJRkFVRDRVRjJCU25zb0tFeElZQVIwRU1LNjQvSEc4OW5OeW9mWTlBazJsUEthU1NubGlkWis2ZVR5OVhlUWhqUDl6QVJzWGExNVkzSzUwcnlzZ0d2WjlwQTZod3Q3SGFxNGwycFVrNmswaXhLVm1qR1NQTkhkT2dMVE9GdStPV091azhST25CcUNFRmw5amlCUHBaZWF6eXpPQ2lLU0pXUjBleUJzbHRWcDgwNndFWkhOTUUxUWxlWWNRckc0V0JmZ3FjSUhMWHE2ZG9vRWljYkhiVjllTTJFcVFDYXBmT2FzK1BJWWczTmllRno3clNDOE5pRkxJUnhaMVE1UDNWR1N6d3BsTjRITDZJNVBjelVCTEh5OXJqV0pZWnB4TzdxdWlKMEVwK1FGNVNMOS9rK2Y4ZzJINWNTYVNPS01heFYzZi9oN1owZHl3dWR1SmpXOEdNRW5sL29GUXY5bmJKbzRkNm91SEFZK3JRVXFyK3VjbUppWlZlYzdWLzI0WDVPWS91N3FTbVFuQStJUnJES09sRnBtclRCTEhvYTdaM3Z4MklSc1R1MW5LZ1J5OEV6bVhWd1JjZXpUQ1IwdUlNbG9hOUMxOVphWG1QUzJjZkpzbGVjNG9VS2lmemhTWnlqOFN2Q3FtcktGK0RQWlI0T0VvWGRsMC9rK3IyTktNck1oMGJuV05uQVgzQVVCdGdTNnZJU2w1WjNLYU1wL2ZiWm9sOHRrMyt2OXdYeG0yVVpuYVJkQ2RleFBjQS9GN2U4cGlVajRvMmtqN2dJMVhQY2RRZGJGZ01raXBPTE9SUUVQbnRRNGFzYnJqN2lKR09NcmQwQ1lVdnYyZm0ycURaU0lyNmw4aVVQV1NYM3phcERpMmJ4ODFZaEFDbDZwTFVsYUY3QWIrNHI2SklMeVFzYUJzdkFtbUszRXVEeUJiSEwyZVB3eFozZFFTTzZpR3B1VUp3bERlVXM0TGMxR3BENEZ3U3JZWFZBSnZsaXZYeVlBcVM1YTRyWnZSaTVuQnI0TmRVMnRkZmJ3cjlBUWhrMkRvektReXJtYzlSb1dVblcyKzdQSnRITWorbk5JK2lERjJ0Q1ZZM0VWaXEyOTlTaXlFQ3ljeXdMU0VQUWwwTVpiTUN5STdIWWoybzVIZEtab05GZzlLWmVQQkVWWVplV0VmVkh3TWJGTlp1dWRQOWJURmF4RU11Z1VDS0FKdnkzcmtqa3NSNzRkRDc5cTF1aERxRi9VWUtPRStzYUY0Q3R4SkdsWU55eVIzWWZQTHJYcExtRjY4eTc2ZERVb0U2aENPRnQ3WU96bGZHRkVxNkRqNmkrWnphRDNoN1FJT3lUYlJ3Si92RTdHV1Z6V0lVWExvZC9Ta2wvVHNXWjBJM1RzaHVkaFc3b1hVMks3QjlqaEtrNmVVd1ZSUFBFTkxiV1VaclBrWnZmYUZHclVsVHNtaEs2Sks2U1cxUmpxTlY4MUprVXZLbU9MZHQ3bFlrTDF3OC9zUGt1a2tmVGZVa28rVUJCKy8vbGpRR1NhaEtkR3hUUHBDK3E2NXppWFl0dWttOXZCM3RCWHhHWXEyOWo2ekl1WGErTHUxTk1YR0ErR3Z1L0Y5cTR4QWhoZzlQVU1uRnMrcWJLTUU2WHR4MFp4bElBek5nYVlmbSszbERIY2xTaXR4OEpBaTdMUk1YM04vbVJqcmlOSUp2OUFGOXQzMFU4MTFVWC9PQTJPd090Q24vdXVUd3RJOWdSRU4rcVdYRStYUjdaeXBSbkNTUWlXY0FKbWNMWmgveVp1cGhJNDA0TE94SGdQWnZWYVdXNkxPSXZHeThzYnkwRVdUZ2V0WlMzdkhvc3AyYndsSWtsQktMZGQzNGhLMDFpRHlPSDJ0WGlIVjlTa3ZqTlEzaTFpVVpuMlJQYzJsOXBMMElLeStRRlI2MjVtTTZ3MjBWajZOQ3VoZGNnbzI3NUxBTU9WSmlzNE90OWt6WUxFc2NScncvYUJ5LzJTTERydlVHK2RGbjZGcG9SczhyR1h6MnYzZ3EvNnl2ZFRkV1dMQVNDMStjMUVuZDFBMGtqc2dZTEcyZUo2Uit5WVNGVUFBZDV3bi93VmdCayt6M3g0ZXZQOGE3bUx5bU9NL3NleWJtbzlKZDkvRnRWQnN1aEZ0RzhVclVUOFU2eTVXVEVENW1sLy9aeEVqY0NNUGxnb0lWdkh3NWNlVGthTEFhdmpocERmOWJabUFxMFdab0luZFB5SnB2Z09TeC83UC9scGVNZ3FlT0Jmemg3ZEgyYkU1TFh3Q1h2YUllR0ZjdXB6d2tRaklaOG1lbXRHdU1BRmJzYmV0SlRpQVNCZHpHZk1kRUlQeUc5YlFqR2xjck9rYk5kVHlMRW4zQWRoQnRGWDVmY3M4a2FYU1BGeWpCMHRyK05rbjZkZCtoeU5VS2ZCZk9WOFZsRWM4enBKaW0yTUcvSVNjc1BPTmZKTTFDaFZVYkRUZXY0bHRSYU9sMEJNU25mODdKWGZ5cGRhbk1rWUtZdFdNVGpQMThxL3NQbFVBam1nc1pqZzk4bCt3VUI0eFZObzVOaDBXUy9wTGp5VjNSYzFyUGcrOFdENzd5bGxJNCt2S0xONjdDQlJQdDdUcGpRZ2JwYXdEZVZVK0NvNVk5cXVpZGpwZ1UrcXk5L0V3Tk9XT2E2YkZLMW5uc2QvSjhMSEpYRXlpWXlRa0U4L1Fmb3l1QVpuM09iMTd6N0VUTmNBc3U4aExGd29mdEVVOGdqZThlSEQ2NlBHbE9DZnI2NUNtdENSc1VNVlBjOTg4UWVJWEVmVW8rc2YwT2JhQjRNQXNlby8rRHQ1OGpXWUYrTEpBMUlvSHRXZWgyR0d0K3JydVdiQTNGRTdLOE13eldvVFVMckZnWXJwRWs0UmdOeWJiekpxQnpudzAxOStTU3ZQQ1o5aDFpRmxJdkc0ZXJnZFoxY0ZTRm94TlRocVVCa2Mxd2h5M2liK0FZV2R0UW1ueWp4MkNQMEFyYi9KMkJqWHlTNzVYbko5TVh1V2pyZnV4RzhwVlUwQVVQM1g4dG1EWmtsMlIvdzRmZHRmN1lQUHhJdGtCVmExOFBCY1VaaGYzOXl1M25oR2hzN2RVMFNPZm50ak91RXVjVjhCM2praDhEUEpWQk4veFlGbFVGMm1mbllpZWtLT3JMNkN5VndDYlhnU3pYMXVKWjdSVGxjb3RHSjVkK2xaZ3RQVkd6ZmhlSWtEekEyako5RmxPSXVocE1TcGgvd24rTkwyWS9FTFk2TXR6M3VwQzV3U2RrVVFwdDl0SCtNQ0pOeGowNVMxVFBHWXhtcSt0czVKUnBxZVZBdDAzTUt4ZUhyOWZrdG03UitRVU5idGtSbVpXeXg1QWtyZUN4S2lGb0o3ZDNqK0g5eDQvUVIrL2NyQTlEcXRySUpJZ0NsNEJ4bk1BODhxY2VpRmxvWThWZFBzSGVzTExmVUwzWWYzNUlVK25EQSt6UmxWZGhMblRtQ1dySkRoejVTS2F1SEtldzFVdnFFOGp2NVl0b25LUlppU0ZoQ1RDUzNtMGhqdWxyWk80VGxYMk1idTZEUDExZnBZSmhUSDlnOUFFeFVOUkJlaGwwWmNuaTFWd1RDd2cvdDRwa3ZsSUxnbmNwWk5UMy84aWtJV1FiR2xraWZibzZwcXRGdzNnNGV1Q3FBS2NjUlA0VXlDK29DVEV0NFE3RXpYT0NyaGlFZXVKUlhkSzl6SnBCTzl6WFRFcHNreXJibFBQc053aTN5MjIvWVN1Q0c3UEZvN01RcllKS1JicGRXSWl1SGYvTkRwSGRVbjZrV0hROG5PbTNxb1lTdGFNb290YTZ2Y01LNjFLNzBlKzFWT0pjaFlWMjNkSTNaUGdRT2llVWVWZThmcUJJd3lhWnM3TXRvdGwwbGt6Z0NGUk5DODQ1VzZqaWtCaFoyOWliQXg3RlVXSnpxZzVCS2JrSDNkcG9vU3JhMFZ6Z2dKMlc4N1p4UXpBVUVsRkxRZllPcmw0NkJnWUxPR0E4RTB1L3prbWRrcGplZyt1MnIwL091QzM4MGY4d1hSYXBZNVVqcWNrUDJPRW9uTGoyaGFkZXRRYlNDaC94ZzhrOWhlcU5aZmFyTUFwY2dIVnpCK0JxK1BVa1l1VUhDdTB0a0s4bjRVdzVrNGhlRFU1RG9Sa3RiQ3B0aURIMGhSa1pBdXpueThZclFKd09PUk44aGNYQnIwQUtIUVRpNytOdS9KMUc5N2hEWk0wbk9WT0JXVmN0OFNYUkQ1SHJMektGTjFxbm5OOEZwZHBxN3BxMXZ4NnRVUEFJdVkwbXZ6UUFyRU1oUUI3aVd6K1N1TmlTTTN4SGxKUkV3UDlYOU95U2pVaTB4Z2h6Unl4SDAwRmtvT08vd1h2UHNnbWRMNmJpRXBYYzl1Z0hvSFhRS1JQMjVYditzZjEvRzNtd1FkUHFPejV6eUJ4YVltZkZhUFhaYVRNMW9xcGt4cFRuZnhNbWk1OEtidzI3Rk1RQ09aSjZPVEJ3alR2Z2lnWStTM2NEb0hvUmdjSy9hTVhzN2tCQVo1MXl0aG12bFdwbjc5VDhVOHdrenVGUS9mS25vUkhrd05waHp1RVA2Y0lXWVlZYnRiUlNpR0d1SlpFd1J3Z0xqTzdTVGJ2b2xDbUpDdTNNZUhjOVRTYnpMS2JhY3h0UC9MaEVlZU5VTWVzQnpDNGlzYkUyR2JUajRzVzZRZ05UNEMvdGIxc2FLTkdWa0w0QnhYeitFYWpTVktHY3NvT1RyNld4bTFOcVlEbWpMRVZwV1ZTVTZyTEVndFR6amZCbnh6aUcwd1lpWWErN0NmYkFEUnlmUDhlNUVEMU1EdnZTMWEyTHArQkwyV0lDbXA3Z25FZllnZzBPWFYzMGF3cEs3MVYzUUx3a09IbkVaa1VVRER3VXlrc24xVEExemo0dXNhaDYydzhWT1JFU1Jqb0J2MWxZZnI1RUd2MlVNV0JaWHh4SW50bVV6NENXQmUyTi9BbWRtdVQ5NllHSk52b2NDM1o5aE13WjFRcnhMWUlqUEdSWHdEaTRybW5nSExjUzAvL1l0Tys2MjNMWEZSQzRQZWRYNnhnU2ZUTjRUUjF6aUhlbmFMcGlmRFlSZHJrZTVQNm85bmttV3dzRUV3YVh0SmE2R0lEZ08yZWdkK2cxblpmcnFKK3liaStxY3JEUHFUS25ZRUJQMGZLRU9wLzB6UjM4WC96eVB1bldaVC9kcW0rRjRmcGJVbUt5cUFvU1pCVlJGVTRGSFpReVZJYnM5UXhVQnp4dElkWE1zdThDdUpkbERTbTBqdStrUmZqTXhzZHM4eE9nd2tTOTdZWHdUV2x5OVhBVk8reXlqR3JRanJ1QitqS2N2VlVxakE2bXJ0a1VvSE5uN25zTjViTjJERW0wMm5LeG9PQkJHT0lGeDRsbTc5eTJxOUxKamxTOXhaQWwvNC9pZjhiRk9UMm1DOGNFeHRrOWh4S2xaNG1Bd3pGejJzZTdvc0dGbjFLSUtjd3pKaDRUaUduaU5XQ2NBSllIMlA0VVhHRUZxVTlYVldLN2liV3N5enZ6YmtIZzlpaE9KazlEejB5Qm5iWVNabXJESm80MWVlSnV6d3lUeFRIYnlGQUY4M0FVU0ZuclFHcjJCTHNydVREbk5zeUZOVnZOR3pRRmFyOTBEbDVJZXNuSzY5S0d5dHM1RHdqWGtOMm1ybUZ3SDBBNndGUkhoWVM3WUtUQjdlMzJMQzZ1eEJrWW5peUNyTS9UeWgyQlpFOXl4RERBZk1Uc2FqS3NkQnZHMDNlTHQzbk5nZnd5YjhNTnl1VXR4TXFrKzdxQ2hWa0I2cWQwem9ISG9PYnIxb0pTZGVPWFZPTy9TNDE5TGpIMUh2Z1Rwd21SWlZmYVhyV3NNbVVBN1pydTBockpVcFNCVUM4ZFFGbUlCdXhNbjRONkJKOGR4cStZUUxHd3lFOG5lNHVML01OOXUzMUo4T0xhZUpLd0V0Ri94Tm5VNStoNzU0NGRQekdZZGpBNzlsaU55ZDU0cnFjTk85MG5lZWNZMXJwK25iR2oybjFQcXFDSGRJamtZU1k1MkMzSW5DdUd5dmFyNTZZdU5XWXRqVXZTV2k0Rmlqd2JMR2VmeDM5WlFmQURrZ3Jpb1BGa29VVEtVZ3Z0YjR1ZFd2QkJKNjJ4NmJ5VGJ4UzRxaEJzdlVPZ01WWHMzbjJKT1RDVlFxZ1hpK21RTys4TkVBV0tOVnQ3OXUrODViUjVlcXBuYlRwYk11V1M0bDAyT2hITmdEck8zZlltTnhQRXBiUUFkZTR0YzhNdGpHSm1NMHMrb3J1Tkd4VHQwUDhSYk1tOHo5M1BEakVKR3RQeVFJZXB6N0k0ZkFnNW1mc0lEbGRHelRqQUl2T2E1eGxBR2NaRzkvdUFqbVppWVBKb3Rmd1lRaVdtMi8rTGJTT0tBZVNaZDIxRUVCQ2VUUnRNaTJuQ0Y3aTQ1bDJEWjkyWDNJdjd0bWM3UUV2YnAwMTlONnNuK25KODNqaUE2akdqYTFSQlRFeEREYWpMQmpDUDJEY21SaTBrVWdNQjVnOGlDNEpEQmprR3J2SEJxS0k5OWsrVmZuekh3R3M0VVZHdWVUU2NISDZwSFZMb1djZzA5d1J5NkxaaGg1dm5tWU1KWThGcEtmTXVNVm5vVW0rOE11VlY2YWxUWC9ibFA0djkwN1VvVjY3dzdpU0pJZElNdURHdlNNMXNKbENIeDlWS2xaL28ybDhsRk1wSWR3YVdRbEViUXZna1plazFjTTdwL2NyM1BLNHBRcjhOcDRVWDhLaDZrcVQvanpqRmRQWHVPOUFKa1YxVTJSNmU5M1VjaklKaFUrT3FKdUpRSFkzUUdvRXFWUVlUaUU1WVhhVjF2a3JSVjRWK2VWTzN0ZWJ4dHlqQVA2Mm90WkdJSllOdWtzcUJ3SWlnQUlUTWIvM1RVVGUzUjVkUXMxeTNoWkdDZ292cnNxblZpVzRXM0RzZFFUL2dQbUM0K0xFZHJzZk1DNzBmOFhNOGdSVUpENXdPVmIxMlkreStSVzgrclQ3NnZleVdUR254U0tvbVF6MVE0NFBVTDF5V3ZlZ0ZDUGh4eVpZMmVxZE1ocUZVZUp5WE9rSjV2cnFrRUk3Y3kwS0JBY3VTRDFQNHJKeGhaY0RGYmlEYmRxMUZMeUdMWWZPTTJMcU50ejVBalJ4U3RwTE9EM3JBODBLYjVNV2VLY25zS2VjdnJlZXg2VGFDTGhxYmk1Z1kwWDEzcEpscUZBbTdvVHlHRndyRGFPV3VLRnhqcHFkMVkwVkh6YVpnWW9xNWo3OGwxYy9BWi9PWnVvem8vQUxWTzl1cGFEL0EzZzdTNzRHREV0UDBoWGhOUHNyVTdla0hSTW5ycmRjcys5WklDcm9DWkNZSE5IaktJWnlRd1gvQ2V0ZVM0a3hGTk8yOXFna05OUFB5Z3lEck5BSXZPeHlQVVdjQjJ5RVppbVkrTUdiS2xEVmRFZXVBb3hZTkFXdjFVaDRZZUNYY1Rnb21ER0t3WW12RzI3YXZVVVkvMlFjU2c5WkgveEpHNUs4eHg4cEcwZFMwWlZsNFJIbmVlVXJGOWo1SEZaTkd3NDNoOUNmZ2QzQ1hYT2ZxTTFOU0h0dmZkNnM2dk5pSEdCVkVCUUI2cTJGYWhaanVmakpJaC93Mi85Y2JWSlpYSXlVa1QvbEpWS1NNeG0vSkFlbVR0by9ib2ljdWlpSW9ld0ZudHN4OEZ3Z1FJcTBPTU83b0o5VmdQeVc5THRvNCtueEJRcmtBNUJNekNmOWJtUW1xc1FHRWdKOVBDeFFqa3JVQW1xUGJiTGg1d2E2Mk14N3hDc1ZnZGtVMVFaUlJXa2g2NmNtWGgrLzRHS2RSdDVlQkZMT0luL1N4S01YeWxidzBCRjFpaVVUaE42ZnRuT1NNeDRPQ1doRVVjMlpWSFYzWUU1TlBaL1ZnWFpQaytGNXcyN2lreVpoVG41RlhVaTgwMHBNRFVIS2pGZTFwNVhUVU5pRkUxQktxUEh5ZG8wR2dqK2haU01jTHBwcWxYMldXUDVzelZyMlFBcktyTm1oMjJ5U3ZPMFNkRWdQdERFbU5PRzRKQ2VmSUJUM0gybVVKTnM0NWZlVTdib2U0OHVNRTMzdzE3blRZWWFONkV3Q1NjbWNBMFBUUHQ2eTVPOFdZRnJvRnVHRlFndC9pYmFwS2VDSXc5OHorS2JkZW5XNEYwTjQ5eVljeXNlVkxOUHZiN2xzZ293dU5CcVJvaHJKNjMzdEswQUl6a2RQR1JWU0hMVUdWZlB2clhpRm5TbnN1QmlCUmhWQnRDR3lCckwyNmE2N09QV2ZZZVl4ZzdXanl3aFlzZWN3ejF6NFlOT1NyTE15cXAzc0lBU2ZodVdLei9wb3ROdC92MWxSeWNYMkx2c2Iva2Y4MUVxamU1d3VVVVhLMnVsb2hyZUJMZkF6Q2F3eFdKWkU1N1BMVGFZV0JSb2FEM2t5aFc4ZUZ6TTVzclFOSlRYYVd1RW1zTXUyMTJLajV3eFFrS081QWgyYlIzZFhEaW1CNS9sQTBrTUxNQUhIWnRvYnFPU1RYNWM3ZjJQam05Z0s3T0FwS2IyS2V3azkySDBjOXN4YktxSjhvMmUwTTZjKzRDQnVsR3d0ZkJVUXZOMHpzNkNMZjZ0Z0k1cmFLTkd0Z2YzekxoRm1iK1owKzlJWmtKSWJtVzk0Z3ZNWE56NFVRWVh6OXBRMEJwbWRNcmVDUkIxRjdOT29Yb2JPdW9ORGo5MStlY1JCWElGR2ZIelRQS1dSeE14dEc4R0c0VHdxUXBubFpENlc0TUNKc0NISVExa2w2SGd6YS9wOUlCOXZUdkFoQXhGbGRHNHJKQnVkMmFNQlJUUGYvcVZ5Zm9yUTcxWVA5UnZGNXZqK2JQbVlLaERlTXlIRXhZSkZLRjhFYm9kczBzWHZoTU94dzFVcndnZmlDR3VIVkxaV243RE04VXMzSGVaYUVOeGJKM3hrQ0lZbS9aR2FBL01kR01scVVYcGlvai9POU80czJ4VDc0SG4zQXdlaEE2UG0rMFlpcDhxd0FOT3lDUno3RjdTNEVPK3JiUkxXOHM2dkR6emlxbjBCYjFkbkVraWFsRGxBMXdOWmxZaDA4U3JSMzJPdFhhMUZHZUNUZVI5Y2x2RU9MNCs1RkFDdEdNbERsNUJIUlpDWXBhRzIyWUoyMEVJWlVrSDdmTkxmcldMK2hZdWJxTzU5Z0x4SythR1dzN1FrVEFOblllYUd3eWhJN0xZc0hYcVNTSlRpSnVFd0pHVHRHSDRiZDJ2YWlyKzdIei9MSXhyTVNpTElXdXZxYVNDc25GNnBIY1MyQTVKZitiTWt3dXJ5blBiVTlNMElpWmY0KzZQYmgzQThMNVgxbFBjSW1GbWFTdjczVGxTVEpTNzV3YzJNazlFcDdNaTdIQlQ5c2tNU1pKWVhya3VQTjR1bVQrWEhXU0tBT2MrZjFKMVdmTjZIVGlqTFN2dGFWbVFxWllIQWZtQ3RrTHkxVUxlblRUbHE1Nm1TK296OXc2bHBxaUFIenl0QnNpais0UzNHSVdGaGhGWittZEJJSmYwb3hFYUVyaCtyTnI4YjQ0Z2ZVK3ErMVRjWGhWSDczeTlkakw3b0JNUHRDRjUwblVmZkduSGpxNC9NQnl2eW9hYk1lZzdrdW9BUEhpV3o0RE1IQWdHSWIvVmRza2lXVTdWcWNpTnowM2tjWkFQQXMxK1Z0dFFQVTlTNXVDMldDb3RiUHJGV2dLRjhsU3lVbzMzZXRsbXVEWjF3MWp5MURKdmNhQW9TY3ZSbUN2NkZ4MENISHgvY1g3VlNqTWJnN1ovODFxbXZSeWpnTzQ4a3c2VW5zb0o2MDdubGUwYnBqV0FwM0F2ZmtMZVpraXJlQ05KdnVmcTJxaWZ2Smxmanl2dWhoajhDZ2UvcGhwSjBVMEYwR004ZmcwVG5td2FMVTZmaVJlcXZiZkdjWlhRNXI0TzRzeHBPK2hHbDFwOEdOeUNLWFoxbndqcVBIRGNSTWM5UUhWVDZTa1k2UEgzMld3ZVFvbnhadVFsUzF4aXY5UEVEd3dvc1pueFZXK3JUd3NNS1VPbEV0Z1QxVUdHM3d5cDloR2pXcUpkQzlRQ3pQYm9oNmY0RlU1bzZCZ1pnR05SS296cnI3YzU0K1ZBRDNkaGczZ3ZBTTdldUl5cXJsS1U0akpuUEVSSkVVNlQzcHNSR0NBSlRYcUk1L2NWNXpjVTNVdkJjN25xc3hWVk9XdFMrNXFqK1U4NXVSVTZ6NlhsaHBIdXpnYVRHbkJ6L1BScFR4RFNjS0ozV041eEdVbklqT1g0RXNjREwwMGVXdkUwVmZDUmFJeG1ZL2NLeTBTZzZFdDZ6ei83MnhFN29MWFdoR1dJVDVJcEg4ZllqRDd0YlFOTlE2ZTNJUHR1cHNUTDZpWlJuYllhOEVDZUxRUE5xM1dlNGg4dk1mMTQzZHcxaEd6Z0t0NHcwNlhpOHhVMENwRUI3YVhyNm80TGVYcy9WRjJMVDliWE53OHNEKzc5QXZWQWRSWldJYkF5eENVZXdCcjlrK2J6NlZvSmpHSzZoOGdLT2NMelJQajErRC9XODZiOU4wMTRpZ0lIMEg5SE9veGVmVXBwWlNGQXJld1pTdjYzM3cxbmx3M2NQZy84eU5QdGMxdzdNNDFEMzVqWUdLNFRwZ0gyUnZNc0VNc3YvYnZLYXlyTFZKcUR4NHdnSXAyOWRjekRqaGpYUHZLamE5QXVYS3kxYVFENzdUeW92ck1qTW9mSDNVa2IxWFlSZVpST3BmSDZpakhLc0ZGTGlrL1FPWkZqbVNHZnF4Y0JWM0Yxb2drVi9wb1luMEFuWi9tV3dPMFNLdkxYeEpySlhocUN0VVVnSWNpZnNRaHhTUjRBVlBwUWJDMVU4T0ZueHlTTHIrSDFYZDBuT09Bc055SklnUnVJaWNsWktnMjRTTXJEd1V4a0NmVW1YWnUwVDdVNHVZM1NBWXZlYXJUN09GeFVqWkdCTEs4cndERWw2WmF0RUc0by9mSDhkR1JBTDVGSnkzT0c2cjFFcHAvejRBT0ZNc1hNOGhsd1ozdHhrYVJnTEFGN1VzMWVhZENJN2NqU1JPRVVWcmIxUm1aTERPTjd2QmFDNlRCVWtwNUR0b241dkNrcjlsYlZGVENKRWd2RzViNmtrN1h5UHlqc29zcHhVNlZTeDRXVEZKdG0zNzdSYmdBS2k0aDFKZzYyOWJvMHZhVXlLWHcwdHVabkllS1F4bXN2elBtV2RJQUFyNmpYTTFWRFQ3WWpIdGM2QzhFMmdPK2VmVnBtWVdBMWFIZnZCTnVtdEtkYlFuUUVYNkh0bE45cHRwWmJkaHJKeFVRN2Y3bldXeWozZ0ZmN0FhLzlwckxSVTI0RE1TTWkycGlNVVlFKzkydFhHTDV6Vm55K1NEUzZ2OXF4azJOUGxSOVhLSzAvV3dqKzVSMWV0UXcvUHh1dkhPd0lWWmV1T0ppTEFrREp5dll0d1ArVXcyTnZQSzNDcUlnQk9XT2IwTUZvMkh0dWJ4OFlCZG9tM2N5ajg3RmJnTXp0VHdoc2NETWxxdWNrZVJrWjJqUXdYcFA0QS9ZV2lNV0xpZkgyb2IyUUdFTVB2ZGJQRnJpbm5wK1Zaa3hLN0dBSWFhOExHYUZaWENDU1V4bWg1WDR5a2VhSVBVSG55WjI2TlZxOW5BOHlGNWNsdWNnN2UyMEd2N1hUVE54QXQrMjBYc2o3Vi94YVhlTGVWK21DckVDaHc3TGliNjM0MWkzcTd4Szhlbmk2ZEVNZmVtWHRMVHl5NENyWnF5dm5GM3haQnlROFdMbVNiN2xaY0FlTGRZcmZwbWhTY3ExWFFTcDQ4YnEveFNPZG8rTTFpRVY3MFJmMnEwTHl1eGZ6ZU9KVzlJVEU3QnF2WTEyVFdYckdtdmNNU0piRWkrS3ZPQVVORXEyQlZZT2R1ejZFaExVY2c2N0RIK21GWFBKbVNEMXErZXBQOCtKdmxWWHo5cXBBb1A1SUNOQkk3ZWxFcDJ5bkFqWDhPdlVZTEwxekc2eFpOUVF3RXlrbitYVmRlTmViNEtBM3lKNXhodTA2WVVUM0pOTmdoZEl5TlM0NW9vVXhUUXU0L2x6RmpzQTAvWDFHV002MG9TMW5kZ0Urb2ttVXQyRGFHdE4xcEFIVVg1QWhkR3ZYZWRwdEMzTlZhUUtBb2RHMjVSTXBTaVlORkhWZEN3ZEptM21yR3lUbkJEZFNwM3lTVGFkMXZPQUdyV1hGZ09ZSndZNUNjei92MllYcVRHKzMvZjBuTjdDUDVyaGNpNnJNUzNFOTJWajZIWXRNdmpHbVYvaTRHUUttaXcrUWF3L1kxcVRXcWJTUGdZdjJHejJOajMva2IrSHIvZlhhVVVqZ0VuSjBOdEdrdE1nVktYSWRVNVJOVnNQNzY1K3E3V1pDNjVBWFdnbGFMUjZlV3Z5NUhqejlHU2pJUFFTbWowNm9ES0dqOExNVHNDZ0JidW5Pei94U0lzMVFtU3F3cWpScGY2b0Q3cnA0V3hlSzNUOW1PU2JGRnpXMktndE0zTW9oWTVMMXFPTmNpTVUrRXRLK3Q1aExvSjNCd0RVK1VoaWEvWTNjTXJHRjNFdWJRY25TV0ZvR0dlRlRBdnNQcktVaGVzbjExbkxER0hJdUJ0bi85bkJKZmxiTk1jeDVxbXJKMzdyS2lnWWJpTVZvWk8wUXpKNG1BSUVOemt6MFVuUERsZi9zZEFwajJwdGdhTWZuckM2Q2hhOEVrUUtxWHpMazFkWUdFc1F0T0hYUEZMYjNFUnNsd3ZWNmhFU0lDTE1RRmlQYUJXS3BnY2ZmSmJxZUh6ZHh0cHlKNEVtYWJZb2djUGxydHJHWndSL0RZemtvU3VWbmlYcXdaN1k1d081Sk1HRWx0V2xVTUFNdFpOMGxuaHh5Z0lzVmZQdktxVDBxKzBsdHJSK3lCY1VVdWo3ZFhERkdFeDZwQ1JxSmV4YTh3NEV0WElxdldOT25WRHVBaitoUVBZZTBEU0hoZ1FLUTNIaENLYUtUWis2MlZVOEVOZ2ZYdENDeDVTdm1CdlU0Rm4vNXhqd3BCR3VBQ0tMbkUrdWszdUpZaVZTd3doemV1NVZyaWNUR0NtcERhUVVLL2p4TklnT3EzSEJLQjIwUWxNZHN4bUY4eTUyaytWVFQzU1pZZDNYaEZBUDgzd1dycmFicnVqa2xFV01qMUZUYkVxb2dMd05HTmNYRm9sajJtR1FOS0ZTdklZYlBPZVNVTzcrY2d6Qk9UWnJaUDdLQmhWUGM1c0Mra1BVMHlqVXpzamNHaWxkNEE3bER6TkFzOEFDZnROK28yckNkaU9zN2lpZUlLbGNqMmY1WWVrNzFBaDBWTjY5RG9rN2htZEFBcE41OGlaRUNtMll5MTJ6NjdnZXIwMlZyck00R01JQm1kd0hZN1A2VkZvOWdVU21hckFQUkVEQWk2aHNtaFlMTWdCR3JsTkNWbFNCZWY2bnhxUzViZHE5U1puak9FNW5YWE9nN3ZaUExPOVY4Zk1LbUVDNDFpTlErNEVSc3V5eml5YzJIS3A1UDVnOEQ5M2tRMGw0YXBFNkJSWDdYM0lsdXFBVnpSaVN0U05DUHhtTkR3b09Hc1ZJdkJRU3orS05sbEtOVFc0WDVidEZUZFJ2OE5uN3ZZQ1diWUtyd082dkRCVk5oaEZjT2FSZWNHVGFQRFdhYUdlaGN1TGhHVmEycDlxamtMNm8vR2d0Nkg0aWVoNGRTc0txWUxOOVQya1V0NmJ6NEhBejJmTXpXUW02djE1NXNmVlo5My9LYWxla21KNEZtVGN3MHNGN2phOVltZTFYWHRnN0VmVHZtQVJESEpXb1JBK05kUnZOWDljU3pUM0tyVkg1bDVMN0dGRmUzRGVRL0kyeVdWZjc4bmF3VXpNdlE4Y3JCYk9CcjVLdlNwZnM0ajhQVWxHVW1PVENQQ1c0a1FWcVpvWmcyN3NaVWN2U2lDMnpQdWhiYWttck8wMkk5cmQ1Qndmc1h1MTRGNXJyMnZnZnhscnF2R200bTVJYURWamhZYzJSTmNtMm01UzNxS0Z1eHZHNzFnd1BCckh5T2x1L1ZuaUJiZ0k1dDBOMUpHU3U5V0d0b2cvQlp1YW5NS2dCeHZUV2tkYW9nd2pIK2hTMGY1NU53U0NQaU43eHUra2V4bEpqZVMzUWxQSk01djh5eUx5Ti9pbGUvWFkwNUxrWlBrTU1NaFFYSUNzZXhwVXE4MDdsRDdZZ1o0dG1CVU5kQjBRTXBTbXA3L0JLRVAvMlpOcGI4Z2ZTMUNBdkZpUklLSThlT0hQVGFhenFXeUZKVjNWZVM1ZHk3bTZpSUZydkpOeTNmSkJMRHFzZ2F0YTVzcU50a3BZUFhoVXJPU1ZoWjg2cUJXTHVFajJYUWRyNXRZM0NhTWhjTmtMZ1FhcERGL1FpWDlucldVRm9zNHAxSVRtbFZIUTQ4MUlaVlhlYzBmWkszcWV4OUVCUkJ2QzhrV3pHaUxoYXc4dTh6UHpiU2E3QklTZHdxMFhIMEEybUJKYkQ3d2QrT2swSlNEcSt5SjU0V3ZpbzhvdFo5b0pqOTVhTDZPb3pYYzBEU1NnL1Uxa2s4LzVRR2sreThpcU15Z0RNOGpXNmJ1NUM5TFpLOXB6bU16d1RSeTRYZ0N3aE12VDZjblZqRWMvWkIvanJBbkZMQUlRaDBaQlZyU0U2L0ZBeWRXZ3FaNStoaW5xU0hlUXhaZW5iM0FhUWZwODdkMDlDTVI5OTNiOXlFTitSNnV3SjJEWFFhR0RmOXZFdHRrdGFJM2wwU29BaUxyWG9XTVo3c05WaGtlYXZpaUFLVUViM3V0Tm9UeWROcFhsMk0rNXY2V21aVXI2bzlJNEpxNk40VmJWenkwbjZNdVNPdmlWQ1N0OWtRTmRKdFhGTE82WGlacUVQbXd3bkVpS0NCd1AxZHE0WUNOeEVrMnh2Y0hUc3JUeWZlL2xObGd0dFlBWWduSHcvQXI5ODduSHVTeE03d21LRWdYcGQxTEdmYTA1elVEUm1BK21WQzFKM0tNN281a0o3WW1za21uTHNMWFZnSXNuaXFuVmFLNXRjZzcveVJVVy84VWpxWUErTlJBN1A3cnhYWkErU3h1dVIySGszS1JFbEFLTjdnRXlhV0JkZjhNd1dMOE9lQXo4RjJUNmJKU1JTVmhnc0ErRUVsQS9JQVRBZGpuWU1kTDZxWStpWDBBM1dhWEJlR2FQY0FUUGpsSkx2R21vUEFCdmluOEtXRDRGQzNFNVRISHF3VGhlUTYzSlRjSjVnbXpQWG5uNXBhSzAzSTNtb0cyMDYycWlQaWhQMmxxS2w1Y2lpNXhmRzhOVkl0QTVxamxSc0RNUGlralpqNjJCSXYxNU10RWNRZW44bnV1RXhJRmQzWXZkR2ZpRzg2dTk1MXRQSjRxdGM0STkrbzdZeU01Q21IOTJOQjlGc2lXNFpBN25scldFN3MvdlVJRjB3eDFmQ2dnOVhqU0dOYWI2eWNmalhyMHVmMnNiTkxJZEIyOERlMFdNU1NQa0M4QWJOVXJHV2VHNlhnR21lWVF2eC8yazdpNVNwbXBZRWk4bFROQThIbHB0bk8ycS9ZZGJlMGp0bkpPSGg2b0gyc2NmMXRScUF4YVZENDUvMTFDUlAxRzkySmo3d0xISzFKbnJqZWM1WG9MUU9hVHpvWnpxVkNZc3BiWUc4Tk5WOWM5cnJHQy9ZVThMc3Rzbks2dUlyV0x5UndGMzQ1WWV5cFI4dWQrU3Z4R0hTVUFyZW1lWmVNL2dJQ0FnSURtOWEzVitldWQxMi9COUlBQXd1aHcxcEIyZ2IwakFWTEhmVlcxaDdoSy96UEM5c3krYmxraE5YOWF3ZUNWeDlwRFFWcngxSFNFNlRWM2U5ejltUU9KYTkyb0ZlUndHT01JdHhXRm9ud0cvcldUTDdIUzQyQWdrMFQra0VTLzRiNzZTRVN0SnhxVXhwMnFKRTJSeEZiUmpSaEJtNlVtZVAxMWxwQk16c3VqWmgrcjVVVFkvWCsxa2tvWGpnZklWaVRMMUIrSFBnWmd1VFFRMkF6aGZBNzRyUFNLOEY2N2xYc1F5aUp1QXg4Vm44anVadXc4NXhwakZUOXQ5Z1Z3UU9vOTN3NE1RQkUwNmJKNHFWMXhnYkFKOGVidDZyaS92dGsreDNVY2FZRzRRTVdjVllXOEZHTjNtVVBWZTEvYWplK01qSmREWkJISU53dTkrdWdRdm04Z0g2N2d3YmdtVFVQQWJjOGpoSjdRbTNmMEZvWVZHSVZPeERJRndFN1hhTmg1NURxRk42RGhFaFc5NVBOWVl2Ri9OUnBSQXJraGNqcW1VT2ZzTW5kQWpzb2FWWGdLQjA5VW9KSmtGQ3kzdkdOdCsxUFBkZFVjWkVwKzJLQmp6NWUvZEx1Y3BCbWFmWlozL3gzbDZpY0tZZFhpc0NHQVEwejBHUER4Z2o5ZkpVcDZGMnBmQW9xdWIwM2ZrUzJGMXJBWUdPUzlxSTk0ZTVEL2RWQzQ3T1ptSDd6bEx0c1hjbGphc0FoWW1jSlNqOWw1bE9GN2VoVThPRnFJTDhkK1cxYjlqSVkxZWdmQ04zeGNFL2xJRHV6L1dXMjNIMlY3cWZLZk9IQmpVUjQ3SzBpN3B5bGxaU0cwRjY4ZlkyVzg5bHgrSnc4dU9YeFBBV1VhdzF0S2tTOXlrcHU1bWNXQlNJV3RWa015eXlrODFCRmdjelB5Ui9pUmM5aEcwUm9tTUNsNWZ4SjdLWm1WeVJodlJLUVB0RlpFZDdXZW84VjVUa0E2WUxlTDVYK3dUbUg1QzNCQjVsWmtLOWpZNXJVb1VKdTJ1aTBLbE8vcVFrUjhBVlVUa3NHV3hwN0djbUo1YUhvdnErZkkzWFBGZWpRK1JYZDYvdG5xY2JqR3FLcFkzcVdaVXFsSzlIcjFnOHowRWhhRjZEdnpnUXUxVTNQNkhGanlUMS9OSWZReEhEcjdiS0tNSWlld2hHY0J5ZUlUUmxUZ0NtN3FTd3pSRlV3VVovN1RpOWJiNmlnd1BNc3RGTFNCaE9HNytDUExSdkNvKzZDaWhxeDMrTk1tNE1QZmRPWmRBZFNscUJZWFovekxpcTRMcis0QmhuUHlKL2pMbWVBOW1waVVmcEh1UXZrU1ZNT2tEcUx1TmlXbkFURTZZelFlbVZYY040aGpjTEdkTTZ2dWxYMkFIOEtNWFVra1VBZnlta204OEpES0FJUGZrangrWGM4NFpCbmFMNVhFcFRNY0h1NjdCV1NzTnhxUUoySHRnNjJPWlhHRG9rZ29wYy8zWWtIa2pFcVdsUHNIZ2JNcWJPMkdndXY1STNJdE9lRHhnUWxqQ1hPS1BIOGp4Q3o5OVFKeFMrTllac20vRksyeTdtZksrVzgzT3FoaUl1U25KS3AwK1ZjZlNSbGZhVTEwZ1liVDFGUjFjZ0Fja2Jha1UvNTl2WGlaVEZmYWRZaGo4L0xBY2RuS1JramJmM2ZkME5XdGlEZU5GeVBSbXY4dVJQOWR5clo3RjJjQ05hVlVnekE5SGdxc2RKRmU0MW1wT01tbWtBUGhOdzdEeGpCZUFQc0p6SWxkUUdVeEtPbmxiNXNtcHdnSWFabVRVcmtMQ2tnRmZaMkNZVEVHWmdTUkhLa2Z3UEYxYnhLQzN0YU8wNWNrM1lEaTZLNTVHQjNYT3ZRYU5wcFJmTEtwMWRmdk44bXRwQVZvMnV4VFhIZk1UbEJJam82MWk4ZUtzVlplc3BOTE1WR3NXekR6YzkxUVVQaFdCamo0V0JRUEVWMjB0Zk9XMFZTS1ZNYWNwUGhmYXpQM0UyK3NGNGh0WFdZaG8yZjR4VDdobjJYUXJEU0NWOHVrUktMa0I1eXAxQ0NYWS9ZREY2K3FzVXYrOEhRcFZiV0dKaDRWWmh0TmdPZEduSlJvZCs3dFNkUDhyNUErRzhDWUMrME5mNURLZ1hUYXZsVGVobkQvUmZ3bzE2NHdsK2toSENydWxtclRpcVFEbjZDMjZlUlFMcFp4aUROY3dNYTI0Y05hN2dDRlg3ektGOEFyaWV6MFkrdjJMOTQ5RWN6emU2aVNyMEo1ZkpOWUdOY3habGF0bWpWNU44ODVlSllSM1VDcG45Y0J5ZFRlVmFDTEVEUHduUFRJQkk3MHptNmUvSzdVOHQ2cWxuU0kvUk9oL1RJNWZWdXhIZ3RQd2F1RkIwdGZyY1RYdVFyOTdNQmFsT3NBaTNpT3RZcERsTEg3TmtvQ01rdlp2NWgwaDNmRjExZDBNQk4yUkRSNlQ0VjJqNUhlaC9IM0lDOURVSWZNRVBGV0lyTlRHa1A0RzYzc0oxVEdwVEplYWZSbFZxZnowMHVDMGdobzFQMUFjWmwzbzlIVzl5NUFsbWcvMytmb25pRzZqS3gyZ3oycHRGNyt4NTQ3Q21qTENLOUhZb0JVckttM0ZDbkdkSXg1aTBURmJKWndXNVBvVlJWWjEzMUJjYVhCeWdzNTFTZjdaYytraUVLL0tBYUNUbmxGQVRwU0FkVGVVM2tFQ3JmOVNXU0M3VStrKy84d3o4eEpNdWt0c052ZC9rcERTN3Vtam9uYStHT0VmMDZJQWs3b015K0N2R29KQitacWttZVphcGNzalA4RlRWclRDbXdpeFVNZ3BPVTY4bkVhWkRMUWJ6cUhRc1dqWFgxQmVIV2N6NE5qTFFHY25SQ1lPbkhwdDA0aVZ6dGNWbW0wNlRJa1hPYmhVdDhFN1lHWExSYjBJd1NFQnpvMGlZQTRsbm1lM2M5aXA1djVGb3BjQU9zZldpL2s3OUplN3cyWFI4NEQ2eEZhUUM0U0Qwb3kvQy9DSFNvV0l3a3JBSnY5b3NSZHBwRzJoTHJkZWVWRmVjYzVxZ3h2Q3NCWTlKVStraElUMnJ6d2Nlc0NRNnBRWlZSbnpqbzY4QW43bE52Sit4UHpWV2Z4Qi9qMk1veERtcHFYL3cxN1VkZ3MyREk1NmRUR1pHeE1HcWZ3eDZDckhBR3lsU01MY0k5V2ZFMm9xWVlaYTZaSVlHd0U1dFV4UlByV3F6NFJQNmtoT0ZnTDR1eDBiSEg0d3F2dEVUMnZMWm1IUWlsUXhUQ2pGVHdnbXkrWW9qNlJuUmp6a2xhWXMwcE5PMkQ4aU1MN3ZaZ0doZkY2UjFMVG5Wd0N1eFdKN1NGem1HVUhXVWNQZTRpbzBHbG9JUVhFNmp6RW1uNHpDTW9va09VaU5BaEs1NWJoaXpZN3BaY2FGUmFYRjJqV0xFMlFqZGRDZzhuMHRWQSt2cDc3OTBOazI1QWZOUEVyLzFJc2ZGbEdPV2l4SWxCM0NKVXgzSjh1ZFNkR2JycUJGd2Faa29xMnVteXNWd3o1bW9IaTRBcWlQcHRMM1FiN1JNc2ZkK1FwSUoydUxDY1pPNUNDeUY3NHBrTm91S2daTU1uaXdOdTRnRFhMZ05aSS91Wnc3bmpkdUo5YjhqcVlvSktaTFRQMUtNMU04UjhyS1NkUUM4Qk9FLzV3a3h1RXJKWUpUa0lmejJsVUI0alM4SXBzY3FtRVVqMjhPWjlDVldiNVJGUVJRY1lHTHk5YUtML1BoRXl3TCtZMDB1a2g1UDlPc0J2NUxrVnRpSGxRN2t6UnhSQ1VWbjNldW8wVW0xVUJXbTFqOFJsem5UNmFHK3VlcDZvSTAxOWRGRVdyNnNBRjYwZFVvK0hGS3loSUlDVU5zWlg5bnBtKzJIQkJoN0FVQ0pCejBvU0J0ZjQ4NW12R2FMeG53YlUwNHNLbTNRSmNqaUFQbU1BSXgwRE82ZUEzalNibVYybEQrekkzTjMxbjRDWXl2VGtpRTdpMEFwT01LMnJDZlpQQ1JKbHN1Tm5UdEtzRzBuS3F1cEs3ck9mZzlSYm5mN25lQUt2T01id3FCRkcvRExLRnBFMUlBakN2M0JaYUxodlgxQm5tQ0p1WnIzdjBZZFo3dDR6eE9oNERvZzhtQUJuL1I3bnM1eVlLNkJpRGRzWFJSeG80dnIrL21LVWs0dmJhWmRLK3lNaWwyaGVSWHBSUkV0N1pxRnZUN0lZQU9md0R0RTAyb3dWUnprRWZyWEx0OWMzQUg2eWdrU3hRYzA1T3g2RDZkWTRRaU1zYVRvaVJKenNZdEs4UlVLMXBldU1wWFBMUSs1dFhTRjNUZjl4YjlPdTFKS1p3SmMyOTVKdVc5VC9ML0hweDY3VENpTkZVdzBrd1VjN0tSRExLT0ZxcXk2aFNDaTIzUk9ka1dsWnF2eWJUcTRVTmxFeDRaZW9HUnlTVmMyS3M4QmVZTytTRUE4Yk9uVFliOFVIVmZDa0wxTUNyVTJxS2s4S2dNVHBqZTc1QlBlVDB6M3dlWm0wSjRVdXFZVW9ieG1QWFI4QVdjTWQ5Qkh3djVSNFhxWkFYVXVQcmF1R2k5SEo5NDF6M0xMN2Q2c3NDMUZ6QlZjaWxlUGxoNU0zZGEySnFCQzBleXE2YW1aaGYrUzF1alhGbFBBb0hXNS9mSFVmZTU4RTkxekxSRkwrUUNKeVlpem5pVi9UMGhqclN2eGZqeFZ1a2lFck5Bc1JPbGhTNFJISE9Bc3c1QXA4emxjeWdtUnIvZlhFN1pxLzROL3lOV2l0NDZCWmlrZzZkdlFIUnd5d1VhbHVNajRXMUZPMDBzYVgzZzBkVHNBLzVFdzMyN2xjZi9yTWdGRXZ2Z0VXQWduY2d1YTMrb2Jhdmp0QnZpc3MyV3dRL0NKZ0kxQnV3VkN1ZEFGeldBekJFSjE1T2hscHpzNVpjQXlBZVNVVnA1dWVKZ2N0RjhSN3MxMW10QXU1TWQwczVhNy9qWHl5UURIREhYandUV3MrZFRJWm9yRDJ4bDkxZWdORFN0bVhUd3BYTzB3M0ZGdytEeUprQUlUWFpKU1dxL3JSOHFISlhWUmdsdmhONWtiK0ZjRGIydW4zTk13bk5VQityektYc1I2R2FqRzIxVG9SWmw3TTE3RVNYWCtuL0RWWklLREZMa0RDekRCelFJOHpIUmEyVHNjczZ5SmE0MTRreGRsSXZ2TjJsQkhGRC9ubmlpZDNTN3BPQVdtNzltdzFyWE1yOXJIbFZna05zSDAxOURFczdBcjlpTEpjZkFZWWRjdzFxOHlQWldlTGFGRUJaNkJoVG9MZmpueGhtUmYzeS9QSFdsRnNnMVZMNTdBV21UYkdBdUdmTGxtUTZ1ZHpHRm1US1FLZER4S1N4SlV5MU1mTllycC9DNVdTMmQ2Vm1wUkxGekNKV0hUMmFZMUFRWi9RS2d0azhvVXN4Qk9PMWFUTmZlTEhnc1UvaGorNjJVeW5Ya2tJcTFvQU9sdkJTZmNJd0VEeEc1ZFhXVTlNZzRhbW5BOHlXN1c2NnNjZDZNc2Rwd01PbEoxM0ZBTDlJQ0xtZ095RnIxNDhLdlJiNDRnUGpWZHRFbzF6M0FOSTIveDFpdzBUSVJmTVB1d05tM1NjSXFyZmZ6TXRrWE5GVzBpODRpdnJoSFNsYkhQR3BjT2x3TEd0elRCblpWTzdlYThvYkd5N0NXM1MrZXJsVVVBOUlkcVcvV2l5UnR3U0JrdWx2ckY1aitaMVJoNDBlOWROUkR3TmM1TTJacXgwRUFwWktBTE1laEZwdi9IVFlJck1RWkkzK1JaWGR1aWsrVFU2TzJ4QjZZMjJ0TWJjMVZBSEZMbGlGTUMvcVAwZ1VUY2t1b2FCUDg2eEN6NEdDMURTbGlPcXlZcG9BcFl6K2VVNXdUamRyNWdpOWM2clVBZDczRGZZMjZRZ09QUk5xM0QxQ2NCcXVraVcyNTNUL00rU2RvYzlTZ3JOOWg3aVRldUhGZW9FNE91NW1GRkRXbVNqTDR3cHZYRklieEY0dTRubm9IZWxadHJhR04yTnAwaFR3eTRnbWl2RHpEc1lPWjVkYzlpVVNkRGY5NnowQXdudktoQU9Zb0xxRjlONmY0anRmWUIrVEJhTmhreGRXeUxMbXFwdVNJOXVzazBocGVJQ1pCK05xZGNuZ3kvOWdPUTBWR3B0d240bERtSUNEb0pQQVJyZnpERHRybjVvQUR6Zm5OMURjOGRkRHA4czlHN25YK3JEVmh0OGgySEtNajVDbVhrSXJQTjZqNlA2VlRLOWNvRVE2cStoNjRxWDNzNFZnNjVhc1dZQ2pEZmF5VHVrbWc0Ui9GTytIbi9ONW9CVjVPVkROWkxuTWZMcElhYitoVVlNRzdZMXgwbXkrSFVxRWRKYWt2WUhuUXcxeUxHbU80R3VSSlB1c0oyZDFwOWNYNnVkYi9Jc2I5Vk9QWWgybVVGNmt4eC9uQ0kwRncvOGJMVFVIMFZDWEJkT2E4c3pTbUwrVjhVVGlnWkx2TXBkeUY4L1FVUXFQeEhWdTQyM0QxZTg2em5IRlpDYTRtS3FsRXhHOWpHOXQvTEpaNGtHOFZxZXNGT05iVmVlNko3TjU0NmRnYzA5S1YyVnVhNFl2SnlBbXpDRHZaU2VSZ0owTVhwdVZtdXdDL2xhejk4WFo5Y0JkcFZESTN5a241TnJIZE9yZlFhSU5nWGZtMm9DdGcvU08xK2ZXVHJzckpJTFc5dzQwRFl1WnUrQWwvdk5sbGR3L1EzQVRidGV0SXpHWnAxSzVrVzY3ZEhDc3kvVGpLMUFLbDZTY2tKQUpXb0pVbTJLd2swenovdGdCSDBsaW1nSUh4dzlqNTZQZ0lDQ0EwZkhWOENGa2pMVCtPWXl4R2lxRlBKeVdKVXpaYmtmemJCVHdtTXBvTTRqRlhZUXA1UHBZZ3dHRFVJM1htT29uU3ZLd2hneUxRMmxSMTQ1OVdwTnJJcVpNcWFjQ29EczQwT0d5Zk9jSkJRWDgwQlBWWHBhRVM3M1lvTUgwaEViRm96a0QveTlyejFzVDgvVDIybVlKRlJ3dXR0WWxPcjNHTmx6cnFWWlRFSDF1SGx2MXhjM0p1cmxDbWZwT0J6K2dHMEJjWlArSEpRYktIYkdKdGNhUXFxbEtUR0w1WmUyMnY1Z3FrMDN4cFU0SitZK2p0ZjJMNi9yTWorc3N2K3hMLzFaVHI5anZmc3NjUHIwNmZ0dEcvdGVmOXUzbXZ2OHEwT1RlU1RsaDBQeUlCV1BxZ2YweWRwUDIyOWd1NkluS2Nzc25mT0dkcnQvSE1DMUtZdjRnRmxTTUd4eFdCYlZqOEE1b1Y3MVdUM21Zb0dBYXBpTUJUMkVJYnVuc2RScXdYVEk5aHFpWkhVK3FYUk5WbGtkTkhwejRUdjNNREUxWmlBbFVsbnJ2NzNOS1QxQ0RYZVpRbWdoOUhwYU1GWmFEbURxV1cxeVdIczh1MVVkTmFkc25xOWdNQW10aVBZRVU5eldZQ3pZVVc3NGpwTnF2Qk9DTXA2Tnh2WFVFU3k2YlhZQys3eG9DaEY5ZHkrNURIWlVKcG91YThxT2hJTnVaRE5wbG5PUExGT0hQQmpBSFE3TlJEbVhPek15blNBQjhtY0dBM0Q2WFhKOW1MNXoyZS9KSVZVanVEOTB5K3pEWTA3WVVSaHp6UitwcFQycHMwN0U5ditzWndZMHR1MWF1UkZuUE5NWHlKQWZRU1ZmZXVNOWRJd3dwVTRRL3dXUUIrbEhRWHVrUlFXQ0MxQ3VjaDJZZitldkc1a2RnN0tVS09ySDdRWU85VG5hSHoyQTgwQVBZNVhvTllKb25xNlc3eHc1bFFOWUM2aWFZS3ZMYU0rR0YwVExCa2NBQURVeVNlS2hwZm0xY0VROTY4MkZqRHV0cGNDZWVUTGVKZHpwYjA0US8rVHBKVlpwenU4aVRUTWdjdFF0WGMwdmJSaDhCSytOa1RuUVMrZ1RwMW9UVlZDT1lmaXdEU1kwZlV1UW9CcDgrMmowMzVQQmFsRjZVRlJSdjdpV0hvME1pbEYxSjZlZmY0VEtOOWhYWWd6WGJlMXdjRkZnMUM3WUtqby9DRGVEL2dna3l5dm51Z1ZXQWlSM2lCa083cWlXVzJ3SVMyNCt6a1NoWVBPZGl1ZUlQMThZK0FoeXNXZVgzTVlNRXBHVTlVS2Q5YitEb0FwNFNtQ09janUvQjBpN2NFTWhFSUh5QXc1VTcydVEzV3N3cktVSkRRYisyTnE1WXlOWVd6OWlDUGsyVG95Tkg4U2hSM09TeVd4VTJEL1NMblA5c0FtMktKeDZzTy85c1B3MHp3MVc1cXhES3NxbXlwRERObDhCcUY1UUNKSUdhM2tYNVJRbzVabVJqQzlaL2VPK2t6TVNGZEZQYStwVGE5eE1valRiUVU2Rll5eHZDSHFTbWsxQ3J1MmE0RTI0dkZBd243bS9lSTNBRjVmRDZxUllQeW9DRDc2aXhDUnlNNTZZYU0xdU00RTdNU2Z0QXZZM1dPWU9NcHVZajkwYlNUMFpja0Y4MCtFOTcxVDFVTGlrK2s1VTdGV2I2V3J6TTlyOFd5czRIZXlLbk9uMmV5eklWcWlFb250d3RFaUZJWWtiWkJhcWgwOC8yMEZXUTVzd2N5SlBxMitycVZkYjlZdzBlUTVRZlQ0Z2ZacG9OTUN4N3NKR1F6Z0N5cTBnUUhsdDhmdkwxRVNiY3RIeFFKSlFhT3AzdGRtayt2Ty9MVFpuT0xoSkY2L0RCWDU0QWRRdzhPN2dmR2lhUklIWVZSUExZN00xekxlTUZNWGlSVExiWWZBcVkvblJkQ2QrYjloZ2VKUWpLanBOcU4wY1p4alhia0JHYlJNMjNLWUc4cHo1NStlOWhWUVhiRm90QWZzZzF0emR0SnE5Sk9lV0lsVWhBMUx3R3JJQ3BiUjJtZ2huR1FqcmpUUGFQNEErcXlJR3NyWVB5VnFGYXdZUURnWGpvOU5EMVpIK0xNYXR1dEhUL1VrVFlUcGpvNWhSSy9ZNUhGTk1EaDBsRmFhdU9JMUxtS3hwcGNnbTdSQ2sreEdUM0FISkJhZTkrcXd4aTl6R2k2djQyc2FmSlBKckNFSmQvQ3FqcFpHb2hRR0U0VE15clBzczMxOG0ycnRHS3I1RVJLWTNrbENBNFhQYXFZYWhZRFExWTk4YStWSFFZK3hESEdWSm5PRkE0eDhKWlRVZ2ZkYWJtblY2Y0Y1cDF0VWVKYktRRlViQ3R6WmZiVlJUbzhjZmkrdGNQWGNsbXhmQlpua05BdFBDa2M0aWN2UWRQdytxTVlqQUkvWjFocjB4a3hhbW5MOXQwcGt3U0dWeWRsVVJvZlZneUF1YkdHUXdSYmYyemdBZFhWZDlQdG8yTGlXdnZkWWo5OHVLcmd0dzZkTERuZU5zWitUaWs1a08yTVJRNlgwV2FWYzJVYk9kSnhiTDVMWmJzeHVSa1VHbnQraWtJOWhmVFR2UEFoVjZCdFNPMTlOL3FXNGpNbjc1SzBJbjJSVG1HaUtxb05aSG1kNzAzVVArQzRLbG5NKzlQYm5HejhvY3loSUtCS21HTlJqQUVUa0dUWEluYW9sNXdlb3F3U3AxTThGdnpHNEs0NDRSRjkyaUxramlBdW5VZGxveGNxci9RU25nZ1VPTlBrTFZMRU5nR2NXY1ZkTjhSS3BraElMVDd3WVZ6M1lMRFVZUVNRcnNWRmtFMVd2NTFFbjJmU1BSS2dqUWtwMkxsSTVHT3B6WUNhUDZUeWp6ZmxtcFQrNGppVEh2eDY1WFpCS0FmOTZtUDZtSGdVclNQcVIvQzdWYWZIK2NxVlRLQUhCNUZiWTlpMUJzMGN1UG1uS3o2NVBUSzRhbVpROE03RFVKVURSTUl6K0JUWTcrMzVMbDRLZ3FtQTZITXBBejBsM2NrQUlmcVBINGYwRnViWHRIMnVCek1pYkFqWnM2cXZzTno1dUc0V0UzWitUQm1QR3lRekdlSTcyRysreWkvYzI2bHNsRExmRWYzQlZrckNvQSsyMlBRZ2pZNjk5SHRxamxYZlZXa0lhbng5Rms5cEFGaE0yZmVoZkkxZGFla08xWXIvaXZzbWlNTW8vMU5jMUJqMVFud0Fwa0NSbTF1NUtUNTFWa2RSSm5Sd2lidHZ6VzZkcmx6M2k5YUJHNFJKdk9abzM2am9GUXEwUlNFLzFCSkE2WWwxeTZPelVwMmtMZ3JNcGxoQUIyN3BsOXlsU0hZejY4RkZZTlI1cUFGR25ja2VVM2FIKzJ1U1FNaE5qbDdDMFU3RUJjMnBoL2JsVkEydXpRWElXTzlzWFl2c2toa2FMbUs2dXp6eDRTa3ZQeFdPRUR0dnNnZU9wZVpuU3RoMXRvZ2xVOTlqR2JydEQyaStuakUrK2FucVRRVjNQZGZzRkpmeU5UZjhLVWUwQUd6Tm9EWnJxeGdVTHNINUNyZVNIdFJpc1QwbW5VVWEyeHJiQlh5QVE4LzA0R0htOGZ5S3E3Tnl1OW1ySm1mQ1NTUWtST3kyZXdQYVR4STlZbVNBeHpiZGJ4WnpTN3BmWWRvcG8vUTd3LzkwcWwwWjJhVGZOZTYzU1BsV1loNFBidnJkcVo2aUkvNFdlbXcybVBCZjZBNXVKMWZCbFd0RUhLUk9wR0VwT0dFcGE1NW9OL2pFTnM1UXlzU01UZTRwKzZVakRHMjU2YjduTWV2cEg3V1M5Wi9XMzFzYzM2RzhjalVEUjJ4QnNNaCtJbHE2WmdENEE5ODR2OW9kenRkQ0Q5MkFFSXpxdDF1SUN3UU52YkoxczAwSm1ZUzJJT2xzckd0NTN6amhvMmF3eE1FL0RzWVJHMGpYVWcvVGNCaDZROHEyOU9RRWlTcFU1SUtkVmxubWJtSGNid2xFbFRxa0wydVN3d2UyTDNuOU4wT2xDNVhibjg4aGpNdWUyODd2Rmh3L2MzL2VwdzlFZkl4Q2kxa3RlOXBvQlpBZG9MRFJGdW5OajdXWE5rTHZhdFVKV0xWNkxpR3Q4bFJxZjhyTDNCbm1LNS9Fb2RwS3NOOVg4cXFUSUtGVWtDMXhoVmlZUDl4OVR4OHo3Z25tSWtzcDJyVnNWNkxrT2cxaUJFNVdUT1Z5aEhsM3hMKzFpVG5jWXJ2d0xyQXBjclVPLzljYXFyMWIwME9aTm9nOWpWRGs1MG80TDNBNi85dmV1c2h3TlorMWo0RzZPQll6WUZRMU52U2pOWVltNk81OGNZQWluV2crZkJKRm80N1NDcTJyT0hRVGphZTJTSTUwYXBNQkNuZGd6bm1mZGE3ZWdOMzdBUWRqL0RYaFQwakRrYnNkRlBYcm9Md2xCaGRYQlpDeGl1UHdSaDJqT1lJdUtlc3ZNR24xZ3pCUmdzL0VZUWxSVm5pRHhUdnowM3ZvMStzK0V5dCs5cWdUS25kME5Yd25MME1JRGVONUh4QlJVYkhaNExUdFZnTmg1bTIvZUtTZmJEbXhVQjRtUDcxM0dyTFlTL2tQVGVhTndUQ1IzbFpPQXhvSGp2YVRZZjBjSjVUVHpHTi8xZEVONTJjcFJtemkrMHpEME5ZZkFNZzdhYXM2ZnR3aXJKMytuYXJaTEJtSTBjdEJUamsxMDBmR052SmFKVGVtZmx4QVZsOUptdUpzZjNVL2h5UStXekY0UjFmczFDb0lkc1o1QnkwNGlyOUNXbEVsYlBuSERkRGJTTnZ5YXBTUnM5ZWVRMHFDMGM5QjIrazJTbmhEMDVzS2tiYTlsM1pLcWxuNWZYb3djWVFPL0JmVDZxUE4xbjREWkdvMHFabzFWM01GRXVZM0g4cXpJNmJwNTFnZ0JXSVJNYzdDbmRxb2tVVDgyUkxrL3YxOEVYakR2Rkp5N1h2NGVLS0I2MndvQUdYY0wzRzdhTnpIMTh1L3lGaVVKd1NUWGwrWXplbitQdDNXKzRHNWV0ZVd1NldrUXNaUGpXVDhVVFA5aDJkSGMvWVY4bldHRko2TWhvTytnKzJlREgrMmRzcWhCelY4UmZ1M1A3R3pEWnNia0tjNXBhaGFWWGVhTWRiYWJLS2dWZUNMNWxWWDVpWnJGRm4rZ1RQOVVsSm5lTi96eUJ5cHl0UE1MbmY5ajEreWl4ZXN0R2tvaVB0cUhWRm9TanRjNU5mZjRwR2JKQU5IUGo5akNlYTNkQ0FJMG10OHl2WXM3OFUzZEFteWphQmFldmhOb0tod0ZCRVovcklocjk2cktuVHUzYjZoeVJPR2ZqOHkzK3pQOXE0M25TSmhYR3RVRmoyOElvOVB2Rlk3SHIwVFo1SHRaUlpzY0paMEZ1RW1FQ2V0NGpiZENCUGhUd1ZMZjBFRUN3RGgvRlZ5TnNoNUxnclRZa0xINHBkT1NycHVEdmYzZTZqSkYxQjFSb3BUdlFoOHB3ci9qOElHa1lOQXUrYTlrbEw0cCtacmxZeEZjQURCWmZIOHFDVDVhNWZTOVJvZHdvUktwYlJXaDZrTGUwZWtGYytjakRmWUhRSEhJOEpaWGtvN053VmJ1M0RxN1Y3WXFLWnJ5Yk9BWjIwcUNpMFJlMVJBRkQ0UUU0VmJpSlhyNnRUVkRQY2UxdWwzbHErZHdsbEFnV0krVFZJTnNpOENtTzh1M2djTHNGOTZiYVJEVHpvVkgrM05MYXFCeUZrNk1LMFJRcHBFQUMwSmM2QjEvenEzamg4MmZrcU5Obm53NlFuSERVMUpYTGtzVmxwNUgyME8xN0RHUXlwWFRUaWQ2dWVEM01vQUJmaXJIMVlzNzA2VmFzUTNwNlNJemthbVcyU1hiN2J3MGIzTCs4YmJaV3EwUEJYZ1VyeWJ0c0VCMnlUZnZFK2lVclREK1hienN6L1lvODBtRDIrY2luMEJDSU8vWStERjU2QUlSSk5EUG5NSWNXQ3NvdTRkMWhYekVad3J2aVdzbXUvcjdkRVBWcWpwcnoxQVd1R2M1WGdqdmcxVnZLdVZ0cUtsMWlvdnZtcEREL25NajdCb2JHbTNXUmpHR1VORkF4UEJkM3BuY0hwbWdHaGVuWHQ5STg5aUxtZm5hTEhHdUJsT0lWK05RSHZQMXYzcDdGY3lNUkNnMW1Nb1NpbDRYQ3d0VU5zSmxoa0pTR202L0xZeFBCT3VaQkdOYTRDUXZDUUIwVmhGZVorK1NSQXBLUlRwMGxYT0dwU0NIeUsyNXB1RUxrUzhweURuWmlIeVlLL2x2MzR3MFhzeUgzc0xUVENsRTZLOUxOa3I1anoyRjRNRUJuRTVkZDBKMDhBUkxaU1l4VXZqRXpCUmFuaEFHQXMyckp1dndBWkdzRkNJaXNsU3U2eWp5Uks1WmNuVWxHakR1MG1nMHlTYVRwYTYwaWJBbDlkYmFVci9wbGNMUUFxYTJkUXlnWndaSXZ1bGp6MmptTnV2Wm9paXYxMXRDL09xY3RyWTkrT3FURDVPakNQbGxSUy8xNkZzQXRhTHp4ZXhnMXdheU91U1ptdFQ1VlVYM05Rb3hwTEdoem5CL1plYk1QbXd4eVltS0dLZVRnc1U3cnNWY3RaU2JDNHVTUWJVdXIreG5tT2ZvcFpDK1BpY3c3UFBUOE9xdk4yaGJ6dWUyU2VNZTJZclJNdXZlcHVtck4rMXVTcU1xdU5qb1VWWW1NUTE2cGR2bEdKS05XNHArSnUwYTVLNGtsbzJJVDFCL0VqQ0hIQUpkZUZQUUsrUUtIZHhORkt4ZVNzZ2o5bDJwOWg4YTlybXRFckRTOGs4bFlnQ0lPRVk1a3N5Tld0dTlxZHR0U1BFM1ArZ0I3cGt4VlpkclhWUWkxYlpLOHhMbmNsSUd6WXMwU1h1U1M4YnNWd1FzVGwrZk95QU1sdnhvaURxN1JpTXkvVmJBejRWSU9sclpqSTgvdjhhaGNIdGVVL0cxTDM2bDNoVEFJV1U4N0ZKdnd5bitWSDRJWkZRaGtYeDhiKzdleW52enpNNmZWWHRFVkVNVHBWdVloZlhIR3kyY2RxWXpRZm9Ca0ZwdjJ3a0JvaXl5SDBCbFJaNFkrNVJSakY1K1V5dk8xWGJLVFFwTVFRV095ckFTQmxZUEx6cHUzVHl6VForT2NCelN6SUllRGV3YWthRW1BVVVlRktvUk9HeTkxWE5uVkgvc1ROWWFBazZhcHlhdEdMeE9uSlNBQXBkcDk5V0RhNWhNV2JIMVMxaEY1RXVUcXBUSmR4dmY2c09BU0QyWnAwWlUxV0N1OE9XV3JxajZDOHBybUtlSjdtMHlzYzhtRCtsL01PRjRiUDVBYXFkV2pRL3d2VnZtczlySXBkalpkSTJQaThQTW9ERitmdUNkTnBZTXdCT3pwcHcrVXU3bE9nWXhoYnFZdWVDTHFvMHMwQ0pKZlEzTmRpWmxqRVBzNStJSnZ6WWxKaExCWHh0RTJpeFI1V2o2KzBuWWkyZnA1Njlzc1NJVGtkYnJlMjdLVXAxZjhWMkhRU1BhOFhvdkF6NWZJL3FpVHUwNXNRNWVGeHRUY3JHY2NFcFpMdWNRc2kxN1BlL3lXUE5pQktFZG05R25LMlRjbGRVWnBUM2VBZTkvSXUwNVJ6eHJab2NuV0J2a3NIQWNWTGZUalB4Y3c3TGp2YjNIaXJxNk90YURUTkhGaHZRdS9RWHBVNUhXcnM2eWhGdklPbTdCYjZ6dXdUNHpsNlZBNk0xcGxJTkNiU0hxT0lVTHNaKzNHWVFDbmdCWDYyLzFiS2xGVmJyY2ZHNlcvRlZ5cnMrOG1FbExQa2VsdnJTaGYvSHJSejVzbS80aU9SMi9wWm9ic0F2aGRHL0JtZnVPcUd2LzNHVVdSR3lOMURSb2VKbHR4NzFaWWplVnBycUhvcm02ZzJjeG5hT2lyZWkrZDVpLzRzaHhja1ZDc2RIbHF6OW5ScEgrck5jNFJ2RUIxSXZnbHE3MTRCMmZ0YmFzOGdFNjF6c2tGL0MwL3YzRFZyNWVFYXZudGhxdDZxUnIvRlE0M3FXOTRTMUttMzRUZ0hBSm1YZCthZmFISWdqbmRvNFA2S3h2SjhxWlVGeUJ1ZUM0MlNQalNScnlKVGZpS2NOZG80bXhYVS94WWxFSlBodXB5YUhmdDdFQXI2eXR6WEw2Q3Erd21qaXNlZVJnK3dWWW5UN1Y5Y0QrRld6ZmU5VkpHNk00djd5a01TeUZGanRVT3ZZYysxTEc4YUMzbkNyeUxrYnprUyt6a0JnVEoyUEtMaklIb1JrVkhtWVlBSzIxUTkyTkpORHZ5SXUzWGQybzM0bVpjKzgwRHNBdVBwOVkwNGI3TkFWSkg1OGt1TkJja1FZaVBKLzRCNE1YMm9RMlRGT3RHMnVYd2t2Vko3ai94dis1RnJMd0ZTZE4rU1Q0OGlodE9yTzgweHVBUDJpc2pJUkwyZUg5VFZoTGYyZnVIVHIrb3ZKV3BHOGphc0ltbWFQZXpnUzAxVUMzUGJQOXlPNnFqNXBKc2hwTFFUUjE3ckNmNEtrOVNmSTRUckYwcWVKN2hxaUJKaDhUTWRlOVUzQnc4bFhVU2JBOWN0SlhhbVR6bFpxL01aQWRta1pXRTd6MHVzNFNWenhXTHJPd0h4Yk5kbXBhYncxVTBQYThLVzRtV1N4MUJCd2pONE5rRXhvSGhlRzJxeGJ6R0FaU3J2QTlrM1dCTWNKZWxTemc4dUV6UE1ocGRhWTBRQnpoMGE0UG1JZncvYnpOTWhTWEdZNk1oSndkdmFOQWgydzdwL2hEenpoU0JudTd1aVJHWkF0dFZRWjNNbUZzVmN3NFQwMG1lTGNBbzl3NnN2Tzl6b01nNnQwSVVsY09oZGlwOVE5T0w3bEFlUXhZZml1cDVQSUI3YW0ycWc2KytYL2MvZElVUzMvYWxxSUpHZjJVUlE2dDdjayt5NjJ4eXRCQ0kycDRibmlGMkp5a3RnQ3h2WGtMTHRPaThwSnpzdldZZzNSSDJvM213S08xUWF3d29kSjZiL2ZiRW9ieTJpOXZzTlUyVFZmYlBDM1k0TS9EUzkySWx3M2VtUHdmUlpYQ2NGeXN5cEZtdU1mRVJKSmdNS3F5KzVLNjBrZWl5QmdPZkx1ZXAxOFM0bFNHY3VOZDk5VjQxTkFGeW43SXQzYzloUXhNTWxvOXBLdzN6MmZEVURTMU5xeWR3WU9aWGxJN1hIUTUrNDlwYTAyOTVGSUtDYi9rbDRJSERmMkpBWFFQMUxaWmtmdWdLTStYVmhNd2FwWVRjM2dtdzJ6OCt4RU11SytpcXdKZkdBUUxPYmZaQ0VTamI4Y3JpVTBmMUhHQlRneGVuL1g3aWFFcFRKNWVPUWF4NWo3Z2FKZUIrREdzTFNzNWhRalo4cWZKRXd0dE94d281aTdmVG1rbUxETEFiR1R4dkJlbWxUUENSR0Y4VzZybDJ4aE90YVhocmRWTGFrdHR5NVJ4UTc0SVpHd1dQSDBpTnRBQlNFNVF5R3JZZzZ4QjYyQ1JOeWtXTSt3RndPclo2UExaOHA4YkYydk5NRzV1TGZuT2p2ejhoTENvditOaUhVUFlGTkpzeWV3YmoxOHNpaUNnbC9uTmlHaXAxZUtqN1BtOW8xTGw3MEsxaU00Y28yS0JSWVdZOXpmSzcwYks4WGkzTlJlMEt0WXpaNlU4YUw5L2R3T2phY2c4M2VGdFFHZUJLYXc1d21UcjBUR0Y2Nzdma0c0L3hzMi9zRklrZy91QkUrbE15aWUyejdkZnpBdzF5Nyt6Vm0vQVpTRkNzTUh4dUVTbjdudFNXMzg0L093Z1FsdVVyVzlkVEJuWGMzN3oySnpTRk1FZzdVaW9uakx5TmVtRFhQRnI2RkdHOHd6SUx4NUlpVEozQ3dXUHM5cW1hYzNrblcxYkZSbzlyNlRwY2syeXp5QTZnQUpQc0dMMGpGc3dkS0U3bzlQdHBJTklhUW16MXlKLzB6b3NobFBYUUEzS2crWVNuVzlzQTdzNUdhQ0l4MDRjdGxKY2diU28rVDl6SUdqcWRQMXdOTFdvOVh1T2tMN1ZScjFBWStCWkx1L25UcEZ2MGtlZ2hkaVlYNUs1UHAwSy9NMlRIRGVoNjNBZXM4NWxYc3ZtdGJBUkxtMmYyWmVHNzlSamdPRHhacFVNOEJCVVVLTU1PR0ZRTnJtQUVIM2N2N0xQa25uS0ZLTGtMY04vYjd0OWRRUU1VMFBJTzFWdWVHYkY0WENMUGRsaFVNWEtQL0NhZFVBMElnMVlLWWtCWUlacitOSE1mUUpPWkl3K05FYjl1ZTUrTVdjbTF6dnNTODRMMTRKcFdSQVE3M1ZVSWIxcm90NVlHdmFPNm1acTBwMVVHWUVXZmk0Y3lLanY4SW54UHRiOVFYVUg2WFVjcDdUbmVEeWVJNmRDUnduUytReElCN25jS0xpT2VVNHc3ZmxTOGVpdGxEVTNmMkM2YXNWUS92MzgxUnZWR0xwTzNVV2lQYjJ5TithQ2RMQnV2SytSMXpCSGNxZEZXRnMyRjFTdjV5MDNWRWpNUlJzcUJUY29ldjVTaDZjVE9DMFVQRkRkTXZVKzRXNi9vZy9UQ1hmYjUwTFVFQjAxYkRVbUc1bGwzTERjZ2cvQXp0TTFpQTl2Qit3c2tYSWE5SVZiMkhQaGFGazZvK3BnQ05Kbm1Vc0tlTU5NcVB2VFVTa3ZYYzdNeDlNc2VUNitSc1ZWOGRiT1lSMzBUd0w3anRkMkEwNlk1MUlJWmx6KzVoaER2aGk5ZTBub1RkZjh1aHdxamVSazR3NlVqV29FdWIyVEdJbVkyNGJBNUFHbFU3bmZQUTBidStGRzQrM1A5T2V1dlUwSmxMOURSRXc4Qi9LYm54R3FDV0hFR3g0eC8xLzFSbkt3MjFsTjRySkFuRVFISGZXZ0IrWFpjb09jS1h6V3MrTUQ4cjJEQTBOUGFrTG91L1Y2OWlhaTVhV0hMZ2JHNXBtMkxUaWN1cjlNSFgyZVcvZUh4aFFKcXFZUWJOZG5UKzFjaGdhSVVGNlA0UFQyYWhzazJ4SXVmbmlCUXRVTExpOWJWaHA3YkpBVVBSL2tETWZzOFVwRkxJU2hFeVVQRGo1UnlYc25nV1VyOGpQRklGdDcrOHRVcDhYelhRTDUwYnl2OHgzSU1HWVdsZTlpTnkvMU8ydlJnTGRKTHNsWXpnNFp1RWNrbk5qOUdlY1NyTndEeml3LzA0Q0NobVVJWVdFbFc1V3dPbkYyanN0dHJrZ2pDVGs4ZDhJMlJqRDluTTl0ak0vTzZMWWZwcTJja2xxeTNPaW0vazIxOEwwS2FRbXJZS2ZweVVGQnRvSnhxNjBHcGx6ZWJhYjJzRkc2b0lQY2hrOUdoV1Z6MlMvMDhoZEMvcmVmaUpJS0plY0ltNS96VllvZDl1a2ErazZWRE1LMnFZdmlmNFA3RnJLWmVFYmZqc2VOS0VZTWRSQ2l5endpRG9uL0pSYiswUkZXMFZGV244VmVNQ1B1MStma2ZSbWcxbDJNUFRNT3BiRWZmNFZkRkYxMmpHOXBzL0IzVmlIQVhiS1pYbEhHUzBhWkVzRkphZFJjK2FHV0tQQmtmTFNvTUdWVHgxeHAvTk1SR0k0WkNSTU05cnBtdmNHSVpqS2E5aEF3RldwOGhCQjl2WjIyU1k5RFNTUGQwc1lCUWFPWUd5WWdWdWlEaVZUQlBBdlRKNnJOSm53cFYxSGMrWjVKQXN6S0s1eWRuK3BENjQ0L0daUUpxYndEMkF6REFxY2pXdU5XZHljUkVLSm13aXBBVGpiU09UWmdCelUyOHZXdHhxSm10VXFYT0FuVzhOQVVVQytGaVRYQUFNbVlselFJaGJ6RnpPMW53Y2hUNXM2QU50WE9kcE9nSi9RY2NZM0RrMVNuTFNYVUN6dUJpVE5FZEpMMkVmVUpYVlBIcjF2TlRtOW1KdEo0R0NkZGQzeHFkQ1p0a1pMbFdnVTBoY0NwdUVtbjAyM0hEVjdYZmRGYTdpTXI5S283dFgzWU1RVkM3RDMzNjF6SmcrR2p4OHBXdk0vc3BCaUgySk04ejY5aE5XTmFlVVYrdmFNancyRWFseVFUSW5jMWpUcXNwN29QZ2FwdGNTa3FqNjZNdDg4SS9EY0xwcyt3MkpaZmw1RTI2bWY5a2pGd0FWRmtML1pOV0Z6NjdkSjZ2bFdhTHRRQ1pjRG15ZEEvOCtFVmNmL1duOWFPVG84NG8xZjlmV0JINGg5c0xBSVZHVSt1VUZRaHJMeXpBeEFGUHE0dWQyUDdjZE91cFF5TDN5K0hIMFVrbkZrUENZVmJUY0s3ZXV5cFFaSVNoNDRSemhVc3UyTlBmNXZQV0tSdWZwbG5pM2VVdTZKK05NWGRmdjNpWTdQVWZ6Y2Rrek0rVEJKeE4xK0lRSGxGWkdqSXhzUEdBckJ3Y1A1NnN4Zk5WZHZzcWV5QSs0MTJpZjBGbHdWbnQrNzRndmtWeFVMcWVnME5tbWUxNndVU2dLRUcrSGx1SEdLYnlBQmt6NXZudWJ3N2hVMmpMSkhmWHo0bzFpa1J3NzRGZlFVRlpOajY2NkNQcnhiTitkSXFTRXpCdWk0Q0FYbVA0VVJBVGoxa29QbzlvRi96SkxlcHlyN1FMK2VISTEyT2VkS1MyWnFHcitDajJCdWlrRlBwRDR1L21GWG41V0svSUN2ZDlEc3htZWFyWVU3L3pXRDNkbHdFTVRMZ1dqWEluSGIvU3F1Y0JHNHg4bEN4MUFoQTFpaWRKbWhXeGMwcktlVWdMb2s4MG1qYWs4L3RkbWc5K2ZiMjFVNmNLZm93T0xaUkdjQndLUGwvS0FxUENqdFRqZWw0dTh1djlxeS9leUZKSUVGZGU2VFlMWWZ4NVNRSndKNFVjOU4xTDJ4b0tyMGRPWFlsTTR3bDdtQ3lGWk5aNzFkcGZBQkY2TXBXaWwzeUZmQU9tbkJoNkU1ekRzUGl6RDZLNzBOWUN6L1VpcEpNUlVHek1ZOFVxQzRFUm9sTlZrWUhsS1g0ZEJsTGVJQ0c5N085eUQ4TER2QkZRSUdaNUhYTnlxR0xackR5T2ExVFY1YVJTWGliWUZUdHBoeTFIS0ttUWxBT3RTVmpacWhRSDBOdm5maU1MazM5QW53eGJMTzF5ejUzY09QWklrZHB6SkhhQjMyNXRZZkVoYUZLSmExMXpRS3hpMEREZzVybU92QVh6M0R6b2I4b1ZsMFFqSGlHK1lJSnprdWllQVQ0OGI2Z0VqRlpYazA3d0MwTFNOMG8waHNuclNMQ25XMXd4eVVycnJTSGtRQklmSDlxQjlDeEdrUHdqVVUxUVBMYVRkRFp5SUo2eUEyWDhVTzVNUzVLT2FYV0JlY20xVnZ4aGRYa1cvL3p5Sm9pZWkyT1VSbUdzSmQ0NzdBTkNuQWFyT21COWdQS25PWTRPRzYzUGp2NGw1RUkrUGFIbXdFTGNEWXc5RjZ5dHYyaTMrakY2YXJFbHpPTk1ES1U0SnpiaEdDUUdEa0poNXFNcXBjWGFTR3Rvem9FOUZYOXZxWitsUnBqeXhyOVU4cUJUdmZkMlltOGJTd2MzczMycnVxNzBrYS9vNi9sME0yejRkWGttNmQzMHVJTVNXc0o5MkNoTG1kUnVsQVM2VHJscjZHNm03Z1ZyUjVpZ0I3bE42ZmxZbW5HZGEvRDI2MTNYczMzNjFld084ci9DSzB2UjE1VE51ejdqUzY3aW1CMWVnRm9SdEExdi9IQUEvZHpUWks5WDgrY0JQeVpZSjRzMTFlZ2o2SzlUamdTcEZoVlFHUTBFZDMrblRJNW9NWm5ON1p2bGFwTUowYndUNG1yb01lRk1kQ2tJczRBYVlVcm9BMHhScmNNVHV3a0xuYlpWOXFuamVnM2U1V2gxS0tSRTFrajdUUXFNUnlWdWR0WTJyU1E5eFBiU25QeDZUQVNuS1BJa05kN2t1OUFmZFVPZFExRDI0Y0RycVlCNEZnT1EwZmZpRVc1cEVXbDdsQU44MVY2eloxS3JzWG5HL3ZPM3B0QmtpeXkrSFhjNXluRUpkRHRVNkYvSTRWSFpQbjhEbXhKNjdYYndwU0RhWEUrOXI4aTNaVlJHK2N1bU5jNmg0VEQzb1BMTWd5TzFvZnhtUCswN2g3d05ENE5CRC92MllXSzRLUkkreHBNdDByR0NkS1hoS3owRWtCajNkOUg5b1gvMTdZMDNvZDV4bzBaR2JOSTI4WFB4OGRUUlcxbHM4bmZLd21jbUw1aFcxbWgydXpEWnJkVU9HUUhyWVZ6TEYrWTZKYjNad0RPRjVQbUlLM3BlNEtscmcrMDhNeFpFVlptazVVczkvb3FWNFA1NzNWNlkxZEdsbzlmWVNnMEdsTU1pc01oZzNlVzZVdS9semZscUUzSmRzaHEyazRrUzdoWU5ZaEMxZUlEUVB1Uk9XSEk0eDZ6NHRNUVJwYnFUTEhmdTZyeWg3TnBESFFjYVM4RitlU3lmKzFwQjBQTS8wU0ZLRGZSQ25uWE95c2tCQXZGWVcyeWxyV2ljQkFERENqTDlkemZDcHYzeStBWngzTVpnYzM0THNPNS9pOTVRVzQ3VkVOK1ZjSk5menZld25WdU1XNnF5MDRZNUxwMFZIR093aE5JQmViZkZFM2FOU1g0L2pKTUVBNDB3REJVWU9mbWRrTmpJdTRoelVnYjZzMkM1a014OUdUa25meHVGcTZwRDNaR0pOeGZ2VlVuL1JFQy9ablpzdEZLOVJaWjlxZE9rbDBRWUg2ZDYyMlR6S3JJeUllZlpTOC90SlV4a1pyTzdtc3RNbXdwMUpDSjRERFBGeStnRmVGUGhEcG9hSjlZc3M0TEd4bFd0Y04yYWVYemJ4VURNZ240TzRYVjk3QmFUZFpkYUgyN2xjZHZ1Z3dnNnRIaEZWbUJnUVFPajZQLzl5eWJPcjdiTjI1Njd2dEVVbHNKeXVvZEV3YXJyY3Y5YXU4UTYvdUZxa3gwK1czWlk2NVhTZlh3blBnQk5wOG56N3FzYXdNYW1sQXNVQ2NwdDF4TzdFbTUwekhiaHV6c2lRYkVOdmcwSEpaNzF4Q2dFcnZLQjZtNmtRczZ0RFJQZ1c4dk9SdTlMbTdsY0VKQUlEbXJrZzdjMWNHengwUkZMYjVVczVnNmJscEkxbWdzdWEwY0k1RG10Nlh1Q2M0L0hlOXZYU1lZb2doZ3hqckRZYWNYN3N4enVySlFZeldSd1ZQV2JZYTBraTRsQTNkSHFwZ2tXYTFjVU5NN0lKL3N5VGUzMG1Ickt3NndRci9TMVMvd0dpZ3dyN0o1U21INEZNekpJT0w0SUl2VWdhWXprOXlKd0l5amgvMDlkQVovYzFHZFN0b0RTMXFPRlZ6YzJ6b1FqYXp2UE5CMmx4cE8vb2x0M2lUaElaViswTnBIYlIvQ1NGL2VxT1lvWXN0cDY2YjBOcnRHcEYyQUs4MHAzZCsvbi9WNmZpeENXZjhDSFo2UjVQTlhzakgyQjcwSmpXODFsK2RFd25hMWJrN0lLRE5IV0VKd2lmaHp5V3RIZHRRTG1ZMm15ZGgwY3kvTm1RVlpodFJrNkFzWU1kUGdMMnRLeStzNHkrOHp5Qk5KTFFsQmhvcGE4Nk9pUDlrcFdZZmNiTHRKTURYdFcvamtEQ2JYVGJoa1l6Ty94WmlxQU15TEMvaytIY252MjI1SVYzcEIwTmZoeVp1QmVNZUtVb1pwQ3VRcFZnL3JPREowL3FJU1NrTGJwU0p1aVowSFVId3JRWEJPWUx3RnFNOHdUaWVGQUxLNmN1OG5XcnVBZ3hmSWlQdkdBUHF1TnQ2d29JQWdCNHpET1ovTjljWERSeHRHTnpKckx5bStqUmFsUjZPVnUyMTRZOE9wRTdQZzh4L1JVcm5uQ282aGdyM0hOa1p1SHMrcVduMFVZWXc5K3FhVE0xdXMyK3lFTGdYd29ReFdlMDlGV240ZG1UNTJ2eDgxU0lCN3BGbHNaQ2xkNkVHWXlUSytaQzhaOHAzVDVnVmZEQUY2NFhUNjI2MTNGUTVicVIyOGlkZEFMa29TaHd4Y2ZadFkvZzB0b3V2b2x5cEtEQnlqRmREMFFUNG95YzUrdjBzalJPQ3NSbnB0T0NWNk96SzU3bWdqY2VPVFFjV29hSzgyakMrempmVzhZd1puK3dvRU5UVDBDRTlGSDVlTjB6VEk2U2w4TERqeHE0aHlTdDY0SXNyclBHRU5HNlpRcFF2RW1TMkN4M0Q4NGdWYldJSTVpWjZGZE9jOE1xbXI3UnZkbnBGYm11UFFRbTJuRDlhZlN0aS9HQTBIb1ZVVjRudGh5WXgzKzd0OHpNdFp2K0hXSWZtNmlrVlJmOWFObGIzajErS2VCUWRoSEFMLzF4eUIrRHBHRTlkVXFUSmZpVXp1b1Vjd3NMZHFqY1A5ZDVrbVl0UHFveTJ6MlBKNnVsZ29yMXMvVWloVUhGM1ZrVkNCa3MyNGRZRDlXbzRDbXhiVVkyTzB6WDZMODI5TmNRclc1L1hidXhVd0R4dGlxdDROamQ3dEtrbGhmV25NSXdMWlN1bXMyNGlCa2R4NU5yMnh5NjlWQVhmbld5N0NJbzVuN1NNdlNMN0xjdkk4Q09XTFJGY1dYMjIvOFdwSDJ3R0hTT1dKMUUwbUk3NXgrY1dJVlppdUZqYVd2V1BNdW1uZ0wxd0NpN29yUngzWTdaSVZVZHR0UDNzTVFWZzZDVCtUMGtHcFIwZFF6UzY1bFgrbVpCUWlPL2JIckdHL0hBTHJHVlhZeDNoQWpwZkwzV21BUWcxdU52TTJGRVFoOTkwRHBmZE4vc2VzRDhQbVExTXU1Um45RUdyNFJkMlk3SWJXVk12NWxsQW1Sb21KYklOVXo1Sk84TC9ZUG5aSGdiVndGWWRxZ1VwOUNZQXRrakxRV3ZOckFOSmxHd2ZOKyt5aVExeGd3bzYrQ2pYMVpOSkkrc1NtazJGTzdiNjlhbFNkdS9ER0J1M1loSVorSnJUbFpHU2RwYXp3YSsrajdQRXF3NzFsRU03Zkw1ckZGejl5T2l0NEp2bFNnNHlqSWRjY01MNWJWL2pWSDQrTVZBN1lOdFNNUWRHT1dNZVdFOTJPRGRyRnJSMk84RGhlZzMrVXBwNVJTYmNPNWJTeFVpcDNCUllmY0ltM0FyUDl6eThEdThxek43QzVJREd4TlZyR0xnU3I2SXVsWkpiSyszeGtVcFpyM3M2eXFnUGtQQTY5ckgxZzgyM2NFd3U1Q091MnJ6eldseGtrS0RYVVFyZDVyODgyOXIzOStGSnBOSWpGT2s3dGM0NFl1dVZXWTFmWUFIQnFzQllabzhlMFF2c1lFS29PNHRhNmNPT201MVM5U2lTV1JaWXpFWExyUzNQSURFZEw1VENCNXF5c1lNSXZqSzF3eTlIWFYxUXBNclY0SW8zWklSQWNRcktoakE3NldjQjRQSEFaRDhjTlZGWHBWUVpIRWRVN0NEN0ltQXFZYWIvT0VRcVdUYkVna3hjMzYxdTlhVGVTaVlEQlBOc3RiUU91UEJkWVhRbnRxWnlhN1NNcDM2MTA1blZvK01tdzh6RytycWRUMXBFdWE1dFBPc2ZaSjFaYUtHdFNQRUF1eDJWMlNwWjRKdU94WEszbWtiSWVjSE1kUlhuazFaYzNDQ2FsUk5vR1RjelBpbHNmOUNsRDBRbHJGVlJpZHltbkRLVjlGQjBqVXdnZGlCNEcyY24ra0ErVm9NV01nL3pSSENmR1lrYVlMQys5OVRsSnJGdEJiY1kxKytwZWd2VHk4bWNCRXNONC9xVm1jSkNFc3ZWMjNSc3ZaR21iZUNDM1I1TTdvS20yaFg5TTM1Ynk0Vld5Qy9ER2hGSXJQMllYVk9VaE54STk4WmFVVXA4ZEdMbDJYM2JlYnZqL0hMLzB1WHFhYmVGMnRsYm5DSWllUFVaQlhsekluZnlCakhQMUE2OW5WTVNDSE9GeXBEUjdjeXlOcmdZWndVUXJ6MEs0eCtqRmQ3WE5wclBWbDRMaXVJUVU0Uk15d09TMnNISWpZazZBUGRFRE9acjZBVi9MVVdoTTF2ajFKSjF0QitScFNEVGpGMHEyY3FmMkQ0dEEyaGZ4ejRobEtrRFZaeG5jSHFLSml0MXVHM3RYbGEweUtMMXpzTENHS0FQMW92aGdKYW5weTFUMUQyQkZ0ZHpiWWlYenlaT2pEQUxrS2ExTzZtcVJJVWRLSkJZY0lvUDhpWGxOUm53Ni9QMGpYVmNicVhXbWZKRkJsU3hmOXRFS29MQzJhOU55WFdYSWpOU0t0elBGTXNHMXlXMlRLK0owWVo3anVsZDIxSk9PbHFEVktaMjR5M3Y1aWlaS0IzOWJIMlluVVlmdktXZVZzcDZSRElobW1hTkdFdER3SHJtbWo0bjM2dzNUR0hzVmJpRmJFb2JQSktWRm5USTFUWUFMUm94RGkvWVA3dFhXbkNuKzV1TUVoZE9sUXdLNG5pS2JvU2RUSWxyL3NHaytFempyMHlmU3hkbEZrMHhxY0xWb0s1ZU84emZ4dngxeEtlcjd0M2xYeUdqcU5aUVB3Z25KNTkrbDJPSDFnRjgzS0VqTUp4all3Yjlsa2h6RkdrNGUrSHNPWU83UkdwZzhJcTFGYnVBT05xWEZMUEx1SVVnL2hlRzNHVHIyZk02MEVGbGNoR0ROclBqaTRKNWhXRlFzTUFCSDNCVHZYWkFIRlF5NjRxODVoaE81dzQvM2dkZlhDSEh3WnFqMSs5OWx1RUFoU0hDOXVDVUxmUW1aSGcrMDA5aEhRalkwZ0NuRlJnazJWRzdaRDI4Y2VLelI5a0NxaFpURURaaHlOcVdUcHZMWDVmSzRuTlIwQ2NhaE16cDhhWkNIamhQUnFYYU10dnJ0RmNKdjd6S1pOTjlFS1gzcjVERktvNHZxenAxUnBXOWE1TXlrdGtia01HY2ZtdWZJSEJkbDdTZFVUSFk1R25EMi90cWFqRGVXNlk5SHV5YmE3N0xUbkdpdXNnUnc0RUxTTzhhVTdzTy9kSVZjSTdmUmhGcHplcmptcEZhcnRHck9xWi9kTEp4a3hJRFpKbmhpblM0Z3NkMzdsbVpuNDlmR1pGdGQzelA2T1Z6TUE5MnFLeFlSLzRYbUlpMDdwL3hTeWtMRnFpdEtxdGV4YmN3SFpGTVhCUlRZblVIY0JFam50YkxCMngydkRoMXRyVWtuR2xnV0J4cXIrbWtmUVNoVGZDcU5ESWdobldXRlpTTnM4OHZ5WmhzYW9mcTJlalQ0VWVKL0xxL2dIeDdxZjVKYTVwRkU5SmZTYUlPSXA2ZGFhVExFUUF5TE5FVXd3Z0FHUVdlN0JVRS9wd1RkMXo2RWkrazR3b3pFb3pYZDFMRVFnTFFXSDFzNjk3WG1hRUhrM3dTUkxKTzI2TzM5YXBvbGI4M2dYNDZ6NWROZTlMRFBod2lTQXpRRFdBVEZXMGRhZUJCS3pRT3J3T09pWHgvV0h2N1A1NUlmSmtYbGkxUU52Z3E4dTBKRkg3RDA4M3B2TzdvSm52Y3FXdm1ucGQ2cHp5NnRINGF6WlRZQWtxanJmb0RMWmdxb3I2UjNWVzh2OG5MRzlQVFpvRGxCMUFWZW1KMitFV2RFWksyaVdxcjVuMDZJOVdtUFdFZFJKUG9PWEJaOWF6RHl1bXpVaURmOVVCL0VlSlJvekVnQzV6RktvMzBpQ0RmU0NpQmdLME5oNXlVZlI5VHFZdzNnRHh6TWJpNFRsdGZadHdMeUJTNmJVbi93RTJwams2Q2h4OU9PMTJqWlFFeFhRNi9NMnh5UWxHcWwvS0pBeHJhS0YzQWdlRWMycmsrS3B1NHBYV3dFOHBXTFFNZUhxSW8zRVlaWW5xdmpUS2ZhejhzT1R6c3VQQ1B1ZTdHTEo1ZXJxRnlpeUtXMktqem0xUnNTVDBIWHF4akRQZStyUDhyYzQrZWdObHpRVUtqTENNUWVVWXk0ZzJwTzZKaHllUWt2M2J3Y3crd1duQmVYVGZXaG9seDd4TEtxVGg0TDdFbXdTcmFENXZpOVVPeDY1TUdMditaYU1tL1lMTkI3SUlMVXZrNlVESDZhVDNZVXlWZDNnQ3YwbjlDVFgxd1MyNCtZbTZqRlduNlo5RXRtQWN0aERlLzNsYUI0K2tkU3Y5SFdvdlRBUGhVSXVYcFdOeGlJMWZoMHVreXo5b3lkbGU0bzFlN1NXSWl4RkJvdE9jUVY3NEtCTG9qbDE1Y2RxR1hSRGZWQ205VVFWSndia0g5ZXZGdW83bzVHOFJmdmZoWUJaR0VVNzdxaUtQMVpOUXlnSktPQlNrZVBLSjh4bGx5eHNOMVJ1Wkc0WHF5NUx2MXV4dFFqRjJqZWwrTTJiVmF2VWVDMU5xQzhTTHdLN1NvSCtwRTEwMHVVQmxUd3NOUERmWlJvUkV4UTRjRTRnTld1TTdvYllxUGlHRVZQenpOL0xXekdhODczeWdUTzEyb2hiUGRZMHU2cUJaNnZIQWNVbHIzWUV3aVlFNHl4WmlZTFZieFNpSjRDMGdTbXBreG5nanYzYUxaRjIvR0pqclo0dml2SzJrZmxpWkdmaFk2TDdqY1lhZnlIQzh3SC9rNmp0TXBkb0w2SU14TlA1Z0xncUhRdTFQVm9vcE5QVjRDQ3VYdTlTNTVtMXVxbXpUS2VDUkZhTUtaZ1VYQUUwWURmZTdwd2VIamJhM2ZUbENLTU13ek5jNjEwMnI0S2pMU3JPUlBOUmVLcy9TNDEvSGpjV0NlTldoYlVERHVSU1pNRFdZeFdaR2RYTU1TT0ZOaGZMTHlmbyt5YnB2bC85ZXpKazhBdDhBMXRJTkFZTHFwRSs0Z09jQjRPSWVHZVM3Qis5a204YlJMVzJHTUFRazlSaTdVOGc3UGxkWDIzdjVSOW02WE55eXl0ZTdCTjhNcy9BRGZ1am5nR3Mreko5RWxlUXRESHY1dnYrSlVSZUpIZU4ydHBzSnJyVW5DVFVZTGIyR0YvWTlQcDNwK2FVWm1ZV0NNOEhwZFRiT2pVcTVsNGdIdFUxSVh0YkxZaCt2Vk5oYldzdzFjUDVjNUh1M0g3eUxMbC90Uzl4TFZxd1dKdkE5VERxUWZTSnJSU3VzVDFvMCsrbmRVRDFrRHo3blhYaFNPN1pCWURsY3lKOGJJZ2RxQWM3UGQrZWNlUkN6eWFsSkJvOWM1SVZrNXhEd09zeEJKTmtLdkJidTNtdUE3ZU1zTDVpQXNJY2Y2UTFXWHVLMS9KWWdaU2tKMTllc3dveERyYXA1dTliV09Td0dRb0dzeThhRUhwL0t1SnBUSHIrZVJPa2JoQ0hEQ2piS25EY1BGVWdmZEtxc2dEdVQxejFucWFSZTRuTWEwVXhteFFZSFNiUHBNNVJxdmtuQ2FEaW92RS9NdFo2ZGlqS09uYWwra3J2WEhXZVVoQnZMMGxPWHZNMVE3L3U5NXA3RjFCZFBGMUtGVk83OExjbGloQXdtWTRBaW8zN0o0b3BhaWNSYWJwek94NXdmSTROL0RnaW95OUNKTjhzVEphUE1nOGJjM0NaaE8xNDR0RW5YaEZRTlpjL1QydFhMdUY1ZmQ5WXM3dG8rYmxYSm0vTEhManpnTUY5blY4ZVM1WEs0aUlDVGtMWTFXcGpETmVUems1aWlFekFtaGlRc2VOditoTEgxRGhiUG9BY05BQktkV2dFemlCektCam9rWVpxM2Jaa21Edm1yelVtajZ1aVZqVmp6V1NSZmZmMFlQWWtVL1FKWVVJM3dHUFc3VlBBdnBzNzh3UmY3QmF6Vk9pcjVpMnFVcWFhQ0luQlkyVW9kWkpVWFVWcmRBSXhTbk9IZ0xETmxVZzAzNFBoVmlXeFp1MThvZ0ZOREx4d3N3cDlQWitWYWlOVXErLzNvRGVRRS9VaGJSL2NVc3dhb0dmTWVzb2NkcmtqVzYvbmZLTFlCUlNiVjJ4Mmw3dGUrWkszR2dNSGQwRHY5eTE1bzlDQkZuRXJzYmpTNkdRWlJmeFY2Z0ttVnRlTnZ2bmN6Y3Vac2JNbmZLYiswUEhEb1ZkdmZwcUdnN3V3MHRVK0NlYlRqdmNJNWdhOC9aUWVFbG93STVLUHRGTTkxZ1c4MWxHZEVwTmlrRi9FR0VndjBSbUZwNXhNYzFqK1B1MDY2eXZLeTI1N1hDcXp5eW54RUJyRzVpekJxNHl3K041MklZM2tRcmpFSmx0RHFHWlEwQXdzRzJFK1hpNk9IMWp4RXViTUs3cHBGQ2FEL0hGamxmbk01TjIrUGl5Mk1zTGJtU3F4blRScWJjMFdWNDh4US8xMUNXcG4weHBhVTM5bXkxK0txS0lMbHFhNDVGT1lqeGNsRVloalZucGJCb2hhaTFlMmkrUUhnUkJOUzRYQnEwbU0yajFDRlN6cjFRc2RxcFNTdmxXYzgrbXhwcWtaWGRlZ2JsS2o2UHRjdlh4UEFPalFndENML2RpUjdRRmJ2YVY1TUVVZXV2VThIYXNHSStDcDBNV0FCVEZiT3Y4L3ZOaDRZckNFZ0pyRzlna1JGQ096TG10Tm9GWStTcXZPNVpEN1N5ZGJnSmNzclBkSjM5eFNsYWpDeE9nbEs3dkExMGwzL2EwbDZNSXJlc0FQZFRWZEV4SEtTZmI5RWkzSGJ3VkZPT1NsdXNmSklSc3FHd3pkM0RBWEk4a3RyaThiVVFMUDBvWnRVMCtaTFlZS3g1WG0yak9IbFJ2aGZ2TXJiNUxoSUhPSWxNZHdzbUErVnV6VUc3Q3NWY3E5UXpFNEN6Tk40QzJLTktmNXZKWCthYXpsVGFzWHVpMDNyMW1tYXFHRWhYOTJSYkErRHlVaG9MbzRXK2UxUEg3VzI3Zk5OWE9tcGxoT29KZFNRSld3RXM0c3lGTHFBNy83L1RKdHhOK0NlTWZtMHVhM3ZBNnpmYzVNY2szVVNXaGxTakhsTjNyY2t1cEdHZzB0Y1h1dndxZE9yQm45UmFGQUR5TWg1Vkp4TVJEWGxkMk9VNXJ1dHBrVzlmRzhDYTYrc1lOL001cVFIcDhBclNrMWdLc1NnVnJQQi91cXA0UWRxVWxHWmxYaE5uOHI0MTdPdy9rWUw4azJrNkVJVm9sc3YvMnoxSnV3L2ZadHJDMW1Xa05haWVBWEV4cC9qRS9HYjhjWjdNTVhZTWRtYTE4dFc2dmRWYy9qWUhBTmlMblFiNFRpTU1QYTJiSmd5dHlZNUtVb2FvdFlUM0oyLzMzbXg0SDl2RUo1dm1RSW05anZYait0WndtOU5leVZIc21mU2N4Uk03SHdZQkxtTTFucEhtTTNBa3A5UEFnNGJDTDhTVDYxVHl1QVllQVJMS1R6R2pkYzFjZWFqUWE3bGNENTJLUFhCbHMrd25pT1l3Y0ZENGx4SkF4dUFLRjFvR09pN25YZFVUb2hDa2pVd0VZMFZzdldzRWRza01vdEpzUHNIUzRabUdtb3VQaXdxMmxrcHZKcU5iaGhha2hEM0dXMTV3Y2hOZEhsblhYNHkzRzBZYW1MRStENnQ1bzN5UERXQUNvS3JCdmYvVmg1bnJMbENNMXJRSDdYUjB4bm95SjVWaDVweWJLeUNKR09aaHRPRTZKZTcvbjd6bElUaElUcXlnSnk4em1TZHRwSXB1Rm9ZREdaaTdwQUhnSnhReWl6SHRKVWROMSt2a2FYbW1XaUthcHhiMzVDQ2pKL1ExeHJ2Y2Nzem56MGpLa2pUSTVsWWNYVktTQWpEOXRZWml2ZU15c3llKzdXSTAvUmdZZmtaR3pITm5IdkgrRlg5TUtRR0JBdFNrYmQ1Ymw1dUpYUS9oeGRiYjJnNWJNOEF2emgrc3A1Z1ZqYjZkcXU5cDRENmhBckNrU0hVak0yRS9qV0ppMzlkeTl1dU9YbnZrc0FubVJhZlU5cFh4ODd5SERvVFN4eDBqS0U5d0t6RDdxejFkYnR5MlhINEhub1BDNjV6cFUyMXFtanZrVXlIZjRvcW15ZFM0eGs4R1JLT3JqN0dSVExLUCtydG5uZWV5Q1N5SFBxaTlnUkxXb0RXNWhhNEJyOGNUaDYxTFlBaU1Hak1IOFpRRnZPRm5hZjY1WUNaL0JsRXcwQzhIb2M3UXBkNHhCdEZNTjdNTVhYNVZiY3VndEJYOVdRbXIvYmQ3eTd5alRNaTg4YThETENCWExkWEVjdW9DTFNabTdqRElmbGZNaU5FdGpCQnFzTVlhQjcweGxtZmF6eFNFVWwxV3BxcEJvWGN6MHlYL1RTUEFybXBLc3ZKZkNzVjdjRFBtY2ZmcklDN2NVczVKVkw2YmsvR0R1OW9mNFFBU0pqYkdyYlppcFA3MUxaWXRjZUU4RWJCRXB1ckVsbWViYi9BL1ZmZk93cTFxb3ZhTHkrUWtjcTBBZ1lWS1B2QmhlOERsY21BZUgzVXljc2pIeHFicmEwbmJPYm4wL0FBeXBleHlHdWg2YThHRXJ6aHNCY0VhL2Y2L3F6TUlCUXRYZ25MbTZWZGFrYUZQMlEwQmpVRDBxVGxzbS9jc2k2RWswKzFublZtRXlzcWdpbkVxR0pQYmQ4MDZLOHJ4SmVObkd0MXIyUS94Mi9hcUdPcGlNcUxLVU9SQnlqQVVaQWdibEJTNjhsd2lEODZWNjhCd3gyalRKODlwUUF2am9aQ2hhTXk5NmRlbTI1Slg1VVhpUzZPVHVEeWc5QU1mZ3dWR0JTeDk1VEYvMzFPMWZpVFVsU2o0M1FGQXhzeWZEOWEwWlNNRWFrSGtjUnU3SW83ZHIrZzBCK0hlcXd2N3hBQWhRRkhnWlpVQUZMTCtmSkM5N1k0emhkZVdMTkdJZnMxUFhaYisrNERQRFJzdStFb0NxbTlCcFRKeHM2TWpPN1JyZFJORTRtbndQN2pHUThZbDRNRFZ5N05oUTVJWUozVUllNTN5SmlGeFQyc2VVYVl0dXNiM1o1RHBCSlpwV3FseUdEN3hQOUZtbUZGdVJ2TGNGZXR2QlF2RGViSUEvYXo3L2RXb0VHZHY1RlJtYzcxdmJTMjc5WTByNjVpWHAreEM2cVFJVFRONzVTeG9UajU1N0lFNCtGdjRBd1RVUDJabTR3UkRhekt0RXhFcXNVaUx3MlZDeDExamUxR1FRVFRaNjYyd2p6RjV1akJKZm0vcFpaV0VGUktpcVAwQXA0cVpHdmFEY204Z2NHcmUwQW5hd0tEd1lBNGM0VHFZK1FLeFlqbkE4alJCekpJOS9vRXZsalJyZjFWcFRleHZVODV3WVEvVHp3K2VuZmR5eGQ1Yi9qK3lxVitFbnZZVll3RWlBeDViMlFKcHdob1dyWVV5d0tkRkFneHZrWFJGVFZkYm1QQm5GRDhjazdvNHBZaUtQa1d6VklmSGxpUmFXcEN2bVhrb3VaY2JKNTdYVXRWMFR3eWsxSDc3eWRNeVYxR1p6M2JmdGlKaEN1VnFtYTdacCtKYUZKS3A5VlJUaWtJbkVYZURoYm1rRXN0cGFuY3V6M25iUWtxUWhHZk0zWENJcGluVnFmWWNnUDlacE91YVRqbEdUV1EvMDJTazRnMERHcXlhbUxBVm0xdTZRdWFudUV3MWFvaDR4a1I3c0hpQkFMZEZsZ1VhZ3NwUUJZQk9jTnc5WlpwTEt6S2VPMEpaTGhzNUdyMmRvdHNJdTFiODBMeVZRa251czh2ekwyMCtIWXBSaXJLOFFETDNrMUpuYWpyVUw1QzJvNzFhT3dEMHpBZWpiL2I4SDNvdEtVRXBzTzk0YkxjR2xXL3BVeFpxWVZWSE5WbHV6WXFMeTlvSkU2WEg4bWphZEswYldURnFMZjNUS005R1hHUnEyZk5jazQxZTlHWEdMQWdIZGNDOUZQVlgrbVEzaG44RW1nakdyR1NZalNndjRkLytZdVVIcWxoRDZ1bjhiRmhvNTdwSGhTQndPWC9Tck5rM3JyTmJKZ1dDL2pxeDRrVHh3SmRqaldjSzRyZkI4bGk0MkgzYUtmQ0FFQ084ZktSZ2luYjhKMHlrVlg5bE5TakpGTlF4dU5FMCtaSVdlZUFlWGZldXowQ3d5MGxHVWxBVzFQTXdYd2lMdHZIZ1BhRzkvdWUxZURtK05jNzQ5SUlidHlORkNJTVJJdGxRdzlvamtTQlc1cVlGbjN1bVVBSVlwRlhvNDNYd0pLTVpibVBQVDNLR3JpbXRCam9FREp6T1EzcHlsemoxWS9iNS85MTFqNkFzMFEzYzBxbjd2UEhvbEovRlo3Sjc0UjlmcFZxaGMzQ2tHb2lxSGFVRXBXSjRMSkdKVDhSQ09GMHV6ZU5lQm1UYjkrTjQ2YUV6cndpMFE3MXJDWGVmUmNrSTRlM1ljZncwKzd0Tnh0Q1Qva1hUSWZmbG12OU0xVEVpL0wyQ1lqbDVYczNmVXhNQi9nTm9ja1ArMzQ5akMrUnpSby9wSUNDWit1ZFhrTEJNTDNUbVY2bW5OM0tsUGRZQlR2ZzdsMk40QWRUalROaklTTHNJNmtRbXFteFJ6YVVSRUxrZGR1RVJYZlNqQTJNYmlWL3ptYWdaMW55anFtdjdnYW83MEtHdldsTG1QNjhIVm5EVFhOQXFndUlobSt1UTczVUZNdjVGeEloT2w2Q1dzcW5COUoyeDVCRmEzbVIvSEVWbzNrTUJIU1EzK1JHbEZoR052eTQrc0hFK0JacStPbVpya01rOFdHSUQ2bStQUjhyNXo2d2ZPcjBwQllsN0lOS2Y3dUF6bmYxTm8xcGZOaXdwZkZGWmxBTFZTZGdJeHk3QlZ1RC8zWTlOMktnTE5EUHE2VHV3YzNLZEdPd3dMdmsvcmJxdEtpK1NJa1NjNHRJQ2FPcU54cWZhY2xGU3hZR3NyaUZsQ3FzODFhUU55T3NWUko0dTdvbE1OU201bGdxcC9nRHR4b2ZiY01zK3p1RUhPa2lJZjkvNk1OSWlSMEdUc2lQUGZvUVFpZXhOL2R2RG1jbGYxV05RcFdXNlYyUmVGc0hsUWk3Y2xSR2JscUlSWXY3QTBOWDF0Nm5wc1JCY2N3RUtBelJVOWZTV1ZEQyttNENmL20yNDNpNmc1akNiS2M1WENXOVErOVRBTFZwTThRdW9oT0ViME5mMCsvMy9NWS9tL3RMK1ZGNUhBWklmaWhNamdmNjVjS1FBb1VGd0VFQWdnTU5kNm50RTNXM1pCUHoraGVvTUVTQnIvZmE4bkxab0tDOWlzeG5jbDB0a0xzeG9vZ0pKZnB3UFM2VVgyeXdYSE85WE5WWksxbng1UTZWcXcwMmJEUzhzZnFnMVhqVDExaXpiRGd1aWlZWkErOHpzTHZ6OW91VUJBbFM1S3pSRFBkcTNpZ3h3UWxJVWttOWNLWVRQbkI4M0FUdWRXV0gvMmErek9UaWdGSXhBRlZJWlQwUnFOc2hyTDR4cCtaclpVSkFib3ViUm9ubDlkbWF5NXZpYTVKR2s3U200V0M0QzEyL3FzM3pZakdFSEJXSVdrcmw3cTBmV0dPemNpdzF6UG9pSG94a1NGdGhZZVRKdXlTZUIyb1hZWmdSdFVWVkZ3Z3BMeVlzWEhQREtiSCswSm45U2UzdnkyYXdRWE05WUpvcnhzSkQ5MkVYa05qL1Z0dFByck96Q2w5ZHg2NU1NRDhwUDdjeEFSb01EZU9Db1FOVW9iNzNEQWp3WmVmZW8rV2NsNFY0UCtPcXN4VnlJSTQ4TEE4bUV3RUIxRGd0RlVxeFVydnRib0d5dGZndWE0azM1T1R1VFlMdEN0bDBFeUVGOXpBU1FGRG5jc0pmRmhpSkVkcG53bVA4OHB5NjBJdktWd0h2eHNkOW5XeEZDaW5qQTRrbkl3Q3B2K0R5T1pOTlJmZDBYQVN3MG1VMzAwQWI3NUNxMVlWcWFLZXpXMnlzS3NHc0hscHQ4dUlZempIZzY4bElPaGJ5VkM5MXVoaEF4aHFZb2RjdE05UlFaQXR5MjZVT2Z3ZXQ2L1RuRm13WFhDd01ub0xTMzZKMzMxUUZLMmIzR08yZDJNNUY0TkNnNWVWNmY3WVFtMko0ZVlpdTB1R3E1b0VlM1JrYmFmdTNjTHkxN3pxL3VFb1d4aVhtQ3M3dW9LVUY2VjRlaWVLY2hIUlBOakdzd292Q29xdkZFa1hCUmNXTjdQa1NYN1NOVkNBVHdKaHhnTlV1cUhVNXlFUGJZY25SVEs3eWJIOHlSTURZa2p0L1FkZnErWmVTZzJxcnUyblJMMnpGTWNISTFnYTVmYXFpQTZWd08yem9MZUYrTmF4T1J3S05HdXlUWEFKR2lWa1hFUDUzMnZHRUVGdzBJazdJNW5VZVJDeHlwRUlpcW5rTGd2QjdMKytETjJuWS9hSllQdEhRRFdUdkhuK3pRbldEZS9CbUlvMTRmajlZRlRZWE4wdGlLZnFsenczNzVEUFlWSXZjdEtvUS93ZXo4bmE1aWU3ZnNoazRrazVuWXhYWThCT01XZnlDS1RiZk5VVmNCMTd0YXpHcDM5WEkyY2E2aHU3OFQ2dVNiKzZPbENqbFNiQjdyVlNhWExDT3YzZFZEMiswbUYxRmx0WUpQWkh3djZZMnhqajRzbWpmMFVjMm12aDNqS01EV3hwUVdodXIvc1BqdVFmMDN5dkRsZ2QyV1l0bk1TdTAzWk5LVUw1ZnFld2oxaVdEN0RTMFpRbGJkcm9RMkNyM3BSeG5GZ0pYVG1CK3ZNZnMyeHRzY2ZIQmhaSzhsRnZIVzVBd1N1RWFVMzVmV2w0NFBCS3Z5anduc1NWUVBwWWNMRldTRlpRY0JicmVKcXZrWEhsNk1XT042WVRJYXFyUXQ5Vy9ORS9JWjRxZDd3eG1sVk5SRmhiY0V4cUordXEzeEVlR2ZCU25uUjQ1QURmS1htWGlMdW5UNkpFbUYrSnFyS04wR0tvQ2s3QWNtdnJWYWFKMU5BeHRldUp3anZKQ3hQTWxhclBKMVA5NnZqOGhLY0NsekxBK0xJMWNIbkplT2dhQ2RIUkJPMStLU2toWFVabFA4OXhZQk9xRldYakxIL1oyemczSlNmdnRUUkJoTDlKYmZvNGlUS1IyelA4azVVL1Vxd3RIem9YOFdVOGZDejRHWWpVSmZXeVJ0OVhRUXZ6NHpIM0w5S09QYVBOdW00eEE5SGdsRnF5elhBSDhNZEVyUFhac1RwNTliRVNlUXQ4akNweWgzNmxjR0JRR1UxbVZMRVNyN3JzRnZjRDhxaElMMGhNVS9HS3pyRldIWE1rQ1UvS0Nuc0pzTUJ4OXlPQVJ5WHVqZXlkem5ra3dRY01pQ3EwZkdBTGJVNGNnRnRuOVU2MU9HbzNwZlA3MmtManFmV2hscGZEVVI3U0p2ZHM2ZzBKWU5GcXFzL2tkdk5maFBwckJFbHBTajJGYURrLzBJZmRFcXNmNGlVMWo1TWIxcFNtK2lTTkZ4dEhmTXIrVE1ENVdOKzhsb0dFNE83cUNmVnAzMWw2KzBIV1g1YTQ0R004U3ZsR3FoWlNxclhDS21reXFhVDF5L0p0M0pxUzk5NGZkVG5TcW1qWmhQTWdxR3FBNnRhWitDSmQxR0JXR1pzTVgzaDNZeDhOTE94Sjc4WVVuM0hpTGxPd3F4U1NCUXJka2g1Um1vYjBOZG5ncWd0K1lxaDQ4bkpDWWM1anF1UmNDdHFUdElXaEoyV3VnN1VybFREd0FweDhDb0Y4MzFqQ1g4SGFsTmN5Wm1wZlBwVmo2ODFyenAwcFZ6elV2a1Byb3M0aEZTWGhWeU53c2hqMXJMUXpTVHNhVlFUTWxyTE5sYlZZSTdiakZac3FMS2VXNHdQREtoSGpsNTdrcHBvU0VERGlENW9RVDdWMHJEbUtoL3hlOHBwNUxabEs3TVR5NXAwbzNFOVU5TUFrWU1jYmIzclF0OUNOdlFZUDRBTHBCaDdvNm1RUDZVNEsybC9TVWFPdDVQVnJYYnROZkVYUlhOVHpkeGxGVGVVY1djL2FER0lzdDV2R05FZGsvdnJCeFFEV3lER1JQbVVnU3MxbjEwakRwK3pvTmhqa3VqM2dUcWhzcEkrbUsraFRUNXExcTB4K2hla1R2WkRiL01qbXhlTndPTXpBTzh5UkExdjlzOVlmNHRNS3VkTUxlVVVuNXR4WUdLd0syYzZ4Vjh5cWpQZW9mK0dOZ0FOSEcwTkNpVWw2d0hmT0MzNlU0R2xaQk51cmo1TlN6clUxMUtVMDJxS0NkdVkxc3lmaUdaWkphVk9zUXJBTHozQ1FaWE1hNlAvREJCOXVwTkZndFROeDZ0ZTcvQnlSVVN6bXIxYXNoOU8yVWdpUFpIUHB3aHZQR3B0aTNwMks5dUZ5UWVGTVEwRmlWcW9kb3FlWmxqTGFuUkNFLzNIV2RyOW4rMU5ET3FUc042cHBTUFUza2JSL0w2c0VpK21HTnFHMml1SG1wK0V6Y3hya2Y3Rm1tdFQ0bFB6WDc1eU9nYi84OGtuOFRrZW1kSU5RcTB6cHVqakpZS093cVVSWTE4bU1uL2dXVVNhemJQZDI3Rnd2b0d2VjhlK2Y5aW9rSmtQQ0JPOGlBMW5yMitYR2NTVEFOVFo5TlRPeUhXbkpncTUwbjJTc0NEelpYOXJ3QnV0TXFNRi80ZjY4azVTbEtBYUhPZ3Z5cktHaG1xNU4vbUsyYTVhM29LT1IreUI4cXF6V2VvSEdUaHJFdUdiOW16MmlrRXlmelJhbGtNdjFHUDlUWWhZRDZkb0tkeEtudGpkTHpmZVp2WXorN3c1cjJzZ0R6SHZ1dUFMSHhhUWEvS2t0TmpaU1VCUFZ1QmdDV25Sc2QrZG5ZbUt5ajdrdjVIRDlERnNwUGt0WkFNM3JqRE5QWXNQanBPNitMYXFjU1VTUEgrTEMxMk5oWUY4ZFRjU09LVjlKeVdSV3FzWU9UaGpFU1BYSGNiUHRxcEdCUEY3YWZLelMwR1hnd2N5TDdLT0UvRk5jK0xGdStoQUQzLzBEWHpKSCttM2UvMkMvYXgvTW42VzN2UVZlUWJzVkQ0Sk9PQXA3OGlybjNvdGNRV2dvL1J3MUNDNDRIOXY5WEFCc3FxdkUzaDJJYWJOZEVzVU9JVjNYRDZpaWUraGlkQkEydy9xNHJxQkJQbDlwRk9ybzk1ZnVoWVRVUC9nLzRxSWJVSnh6ZWZIWGVDQ0dWRnNsQVg4WlkvYzF3TERnR1JFK2tPWENzeCtpQWd0K0FOVSt0b05VcWpkZ2xCWTM3N0wvdU5zTjhZSVpPMDdUUWVkNFp6WVNlUXhoT0lIY3JRdFV6clZ4Mk5zQndDQUZ4NE1FVmFYci9jYm43MHZkYWFYNEU3MUtjNUpFYlNTUnJLcjA5VUwvUExucW03VE50bXVMWCtQZ2tqaVBtQjdNT3NHSGszcFhoRkVkNzV2NGlPWm9zVkJ4bXZBNGhhbTlESmdHM01XRHk1NE1jUTdJcU1SM3NTVm0xM251dER6YkZlajNJRWNkMUxQV2NEcUM0c2xaVEs5emlORkpHaWhTbUxVakN0aUVNVjBQZUc3WHBlQlAwSmZUTW0rK2IxVjA5Q0ltaENlaVBGK0xBaVVJL1NacmptNjJnb2NWWnpSQzFrWmhIU0V6YWlOTWtPUlFVc3J4R1ZaOUR2OVpVUVZQUlM3UlNacFVYNURYZ2VrYWlpZjNRVDJWOWZLRGpZSEdtY3dTekYzK2VSZnhreTN3RitoT1JIMlQyMkpFaHZkQWFxQkUxMUJNTmlJM1BkV2NMN3J0bVNDNklqenpRUVNkdFlsSVBlei9aRE9BWEErTWFSbzRVZFZVVnlWUXE5VVc0V3JsUXByRytxdVcveTh6d2JEMTFBc0xRT3VaOXFRMzdXT3g2WWR6K3dvUzJPS3pjMU1mS0Q4QW9tQUlmVklPMnBZeHp3ZnBSanRLL3p6bXlVdmg1YktiamhQc3l0ZkFBMDZqSk1QU0kwM2tVSDhDNlBrOGhqM0h5MFE4bHEraVFGaEh6UFl6QTg4eWhtTGN1d3BacjZuSXUraVliVjhwa2c5c0JxL3FEcjZCYUlUYlZnVmYxR2trRUFuN3Y3c0VSNXI0dTFSb1Rhd1Z5SW1uVm1HWDdmV3Qzc1VaVVdlbFlBZ3pDdXRuWmU3SnFiNTBoQjNpZE9FZGlNeU41OTJENmRRSngyTkZESCtkdFNJa0NFTnNiODArMDZvd2QzMGlDS2VCR01CcXN4dFU2a3VycUZXWWsvVUdkeUY5UlF1R1pWZW5uejhFK1ArN2cvcWc2UnJFTUwrdnI0QnBsY0FCdDZkcmVOaW5rQzd6SWExc1JBdjVSRkNVMGIwbU9PczB2bG1hSUhreEI4RlRQV1IrWEVpeDVVTVRvd1BsSW81ellIL0hIQmNwL0lKWXk0UTVaU1FTcmEweWJzeDRGcWZvRTdWdHhCc3VLY0VmZG9ZeHhvcXlQUFhCMHhhemhQb0s1MmFIV0NQcDMvWkVBN2hlZEJCNTZPb21jakg3c0dua205YmJHZWFnRi9nUElUVEJlYjhNZlQwdC9qNUZ0Y0xSZC95NmlHNXkwWVFPelpteFdQRUFLZ2ZMN1BjZmUzV3hjOCs2TjBvMzIzK3dyMlAxZjNHMTVaWE1hMzhJa2tBU2JCWndpQXlHSUtnZmEwdmtiNjBNNjJlclBBbGlnRjRyUmNXZWtNWno2TU1wQy9rdGc2Kzk1eTkxcmMwbk1wTlFPS2x0aVhsS2tnMmNFazN2L0N0ZVhmM3hscDRyMStYSEowQkVLRmdRZFErRUxkVlg1MnhjVkFhd21UejdVSGZaQUI0ZHh1OExxcE1XVDQvOSsvdVlnQTJONS8xbGNxd2wveU1zRXQzY0kwMis0V0VwUDdGdmFyUGhReUY3elBUTm9CeEdScWQ2QVQwSDhqV1k2ZWxxU3F5T2JWVEVpYkN3WndMVHQvWlZjYzdMMGMxL1dqTjZtSkJTZDJUZG1nQndtS0NkVTNYL3lYVGpCakovUmthV1BxOTlTRmlsWjc2T0RodzY1bkp6ck5jMEs0ak5sblFFQXE0UlhvWURldkJnNDE2SzhHVmtObGZUTzFpcHd4dmV0VHl1dmd5TkNKRC9Tam9Ubk94b0NPbDRYZ1RkWktMYmw5MUptYUJhUElMQUQ5REFVMFY1OHZQeEJPSHZ6bmdudFBsN0hubVYyYjdOYjVpNDJLY2hHSzlHVEJsYXNxbWRFMHVkeUlTVUF6Ny92ZktOR3oyRk50a2lMaG5VMXN1Vm43emRFZW0yVklFN0xMSnIzUHRJbWw4OFBaY2E1T3dRYkhKbHB3ZkxtRERCUHRmNzdkUHdIRGxwYjJ5SzErR1lRbkVXbk1XbmxvNUJTOVpVbGN5UGxtMndCaC8wdGlLMjVlNVVoMkl2ZDhvRTlFNWYydWFWbThHVWRxdG1FSGpKbWZqbzFzd1BPWFA4WkdkaDNLYTZyaG9TdVZUSjlvajd6L1FaMG81RUQvZmJNUHBFWnZnVGdUWXRkQ2NtT3dtN2dTTWh4RjJsUXlNNTFoRGNNa21FMWROMmN4ZW5nOHdvS2xOWUVuZG5nL1h0WW5xN01tR1FNYzFPby9qWDBlcDg1eFNSbkVOcUpzRm5LMTlLZ3huRVZwWDZ1Qjd6MTZ4VUxqa3RkcWNFZ0xBbVhwVCt1RDFKWVlyN2dxNm1LMDdocndldjM0VUFGYTJXODJZejZOd3l4bEE4MFFIbjRoZ3BUd0tQWDZ2N3BVSjBDNjV1dmJldEhlTmhNbXlqeldPcmRpWHFLL0dXM3lkQzI5SzVRU2J5ZmFZRVNXNm5lZ0N1Sld5TS9KZ0huNkprek5LWjY0Ung2bFFpSWZickRyaVRJcUovME1INUhQck9pOFpDbmptNkp1KytVOEZZRlp3dFNQVmZMSkJmQS9mRzFwK1FoMmxGeVp0cENQVGJnYzl1OXRaSC9kNVlvU05ZZjUxRTBUSzVjMjVmakVnNTFIWDlGT0Q0a0xpSmVGb3VBdGprU0F6SjZsMU45cXo0OHZPb09JaDhyT3pHc3JSWlh4RWlmektqcS91ZFEzQUtGbTZkemxOanVjVkcwbkZGYlBBWXhOb3p2VWJKYmxEYUdxRmVrU1FTbmVEcHhWaHZxYjhSRWxXMDJNQkF4RFg2V3N2UWZHVUI3NUZyZFJ4cVZjZDFZOU14c0szbWU3WDVpcHlBRG9MVkNySm0yTW5PTkovcGdOMnNEb1F1U1gvNkpRSGdBc0FDZ0V4WlViQUZEbUF6TVZwdVpRcHRUNW5ZZFMrbG8wRnlUb2pubkg1aFhHOG9za0tFMkYvTnl0Z0ljRkJNSEhBMzNoUWRWTXZhNmpMODVtbW82UzBrQktEUWF1WlVHeU5RUklSQ1dlSmV0dXdaQ3htWXpMd3NMUVdHcmMzeTFNZVVpMjJyT0VZNHpxK0xmWCtrYURac0Fvd2ZvUW5nMzU1WVVpSGJiUmJaWWk1amFUS3ZJN2VibG9uVnJlVURMOUdaMUgxQ1pkVHlrL1ZSVCtoZjZ5eTZUZ1RUMmpkWWZBbUdLN3hML044MkltaW4wNmkvdUJJWHJYVGtST2psakxGUmRQRHJHYnIxbnBKTjBtYk50MEpiSFk5RmIzek1HUVF6d29MazVESS9LR29oSWxQNWZJMmZzWVhZUTFldkJpZHpJL3hNVFZQVmZIWTRkU0hQNDQzVWxIUjRhMGVPWFMvYU1MRlhnWjJxNjU1L3pGdG9qQTNyL1hLUWxoOS83SWlscEE0QWVYS1lDRzhBYlMzekloNmZYalp2bGQ3RzFEVXFNcXZjMzROZnlCdkFNdTZ1ckIvSEY3cDNwTHY3bkFkdFhsQU5yb2VxanN0Ukt1dFg5WGJ0UHVzemhjcUp3VHFSUGphcS9sUkJpOE5NdFd4TFJ2VDVwWEpWQkg0WkpIYmVLTUphbXZWK0ZpOEVkN05KTFlndjd5OWpHOGY4Yk5kdE5yOGRFNnR1QXkzZ0tZallaMEhQSjQ3UnEzbHZWdU00Y2NBNUpNYTVFejRsR3ZhekxVZk1JNkt5RS8zTmRHakRIYi94LzZ4a3h0TjZwSzVPWHVQOXBDbHhheXU0Y2ZNTWM5R2NwMmNYUUg2eVViVkkzRStNdkdLcmJZUFNJcmV2QlM4ZEI3THVSRlFqVkxYS1h4RDlGZ3FITUx1eDhDenNXenZuL1NqcUVnenBJZDkxUVVETEdSeWhEY1BQT3ZLOXVSZGVUM1V6VGRPc2ZTWWZGYkR2QUhBVkxSSXhQeWVHdUNkUEtETWxHcWJQN2FPQVBSUlFtRTFycFIvZWMrT0t0aUYyVmpYVmVKV0ZiY0syOGZhNS9VSVE2alpSNTlEZ2ZoY1R4YlBXSlBJMUFhSkNmSTBwaVZaVFlXcmRlVi95RWJKR3p0U2dyU3d6cld5NkdaWG52WEl3S2tpMzJSRmMydmRjQ254Z1U2YTRPelJIU0RBNEZrS3hvUVNGNEwvZUJpYTlLMlUzQkhPMmkrTktDTmY1WE81QVR5NEdkYUdzZTFPQ0YwbXU1YTE2bHJCYm03NXRubDBmOGRNbTQ1ZmtMS3IwTjVBTnJ4b3NSUVZQMHpUWHlkSktPWUo0dEY1NlMxc3ZZSkE3UzlkbHhoNWpxV0o4ZVFPVXFQd1F4bkdOenFHdHNOR0Yxa3ZveTFCK1d5RmxpNVJQR3haeE1NSEs0RmNKRlQ5UFF4Q24rK2dEcDUySmFNdkdhZGt6dkUwR05lcHdFNW8wb0hNVGtWZE9QdnA4NDVTdTNGdk5KQXBlMFdqZks0V0pONzlTTjM4QUg5Q0M0SzhXbFlSQTB6Y25MdW1XQmRjY2c3UjZudWlIYTM3T09nbDZ0alFkaUVaQ1R4NWJUYkd0TkkrSGZQVVRQQldZWUpzb3lZc0Zxczc4OHZYV3ZHa210dEtQZ2FKQmppdUZBcnUwLzRqc3ZYRlh6RG51ZkRoQmsxS05OS1ZQaWc2UHRFMTMvYnZxZmR6anEzRDdiNnlON1llMGFwK2pOQ3pTY00waFVjMlRFbEZqWnowS3hNQS84L3JmeHlVeUV6bUpoVHVRMlRpazkydXR1ZTZNcnVVb0t0Yi8rS2w5NHdsQ1hPd1d0UWVJYVpFSGVnQ0hNMk9qWHFrQXFCeEVUcFVzbk1zZGdWMVJaalZKd0huSkN2U2tHemVVWklQd0dhbU96Ky8wNDdOOUEzTkpRK1kwUGxLakdGK3RKYXlSNisraGp1am9oaTlsTDl3bndrS1QzMWNoWUtZNmgvaDJSQnVjSFFBNXVqTzd0YnArQlVuMm5HQXJsZHB6Uk5xMjBOM0JmV2ZJMHkxaXJodGZ1eWtMY2laMFBMdmhsRHU1WFdyd3FubXc1MGJaY2tpSDJ3Y2pUbVVERmQxLzNVMDJrS244aWZPTzNxRXcwbllZMC9VYnZqVU9KRk5ROWttMjF4R2JpWUNqL2YrZGhLMGFDVDlkOU5vSTlaUWlPR1JlWDFzWnJMWWo5ckhGTE5HY29FUHQ1K0htQlY2dy8vTWhYcHFoUmZmUDBSbEYxdWlrNEdCWisvcEovZ2ZTcHg0b1RDR2VDQUtkVktaZDF3TkxYaEhMd3k0eE5MMUNyS2pLNFBPTWdQVUozSi9ucm5SNWE1bVRsWkdqYlh6S042VVF2ek1yV0wzYWRVcXZoVytpVC94WE9vNU12RU1BeUhBdk1EVDJ1eUg4a0FWS3paazFsV0MvRkpSdDlKekU1Y2RjcWlkcjNPbVYrV0o5S0s3Sjk1L2hzT3Z3Z2NRWUY0YzZ1OFNpMzFzLzIwZXRlZUJkaEpCRnNaNUxLb0dmOUVHWUp0TVkyNUpiZTlaa1UxOVJkaVlJMVV4Q05hcHlFMzFRa1NPZ3hFOEdmbmZSQ1liWXd6NE5HdlVzamFRN3Bqdml2cFFIT2ZpazhaK3NOQ3VKMDR5eFA5bXFkdWVhektKREpuOWJFdUljenRsYlNTSjlOQ09KWS9FUFEzNWcvaW9La1Fsd3AzMlg2U2ZTeE53SUJJd0RsKzVOWW4vRlA1WjREN1JKK21vNmJtaUVEZFRldUJOdUdXZDN4R1kyaHEycnpWVmptM1A2NGRVYWJ1WDhHSXkrcFJnSnUrbnlBdDdjWG16cjlQb08wZzR5RnpuRzJ4Nkd4NGhrZXltaGZrQWFyRTdYWEkrRTR0UnMva2EwbXRKNFdab3I1Rk1GSGFZZVgxbGFNbzJzTEhheGlTM3RkanorTkJiU0dnOE9OTXJlcVNVRDNzU2Z5RmowOVBHNlhnTU02S29Hd1lyQy9WNlhKK0tnbUlNdk15RWpyY1dZeEhuSlYvUGJpVDNrRTZhbFpTUk1XcnZVNFhIeHMzYVUwUFJ4KzFIVkZrQXgzWDNDU2ZUWXNQUU1wbHJZclBEcVRTMlRYeCtpc1RITjNrK0VySm9BYUhnMm5UQ0RqdnkrRTJEanpkMERBVktOMzA1Ylc5ODRDS2pZcmRiYmlwK1NPelREM2lHdUlHSXVlTVZRM3pVS05LbmhxTkpjSUZkMzViVVMwc201b2dXWG1NL2J4emxmVEc3dzFwN2dneUtqa3RveUpaRUFZcTV5UWtsc1h3WExmZkFKbTVwTkR2emZhaVZRYldrTC9IaitPSzVwUzRJQ3dxNnMxV2NLSEc4cENDMVNyWm41SEIvQWxUTWlMTTVxZm1uV0c5c0FiY0VsREt0bWxKU3d5RFpENEV3a0wzdzhWdzVCWi95TCtxUzI5WnluU3FlV2JJa1U4bTIwd20yWVg0R0lPOGtMYXM3UW9UWUZ4a0p2U1d1OUd2U21uUUE2dmhLVW9IbHpWOE5USkhXME9SL2h2NXV2cEovZzZpcU5iYVZ5YnZiRVhxNEtOT28vK1pVYVc0TWI5Z1lhdE8rYWlMRVhaSUxWTFUrQWx0V0pjcStwVFVYWmxRY0JXRnZzN1VocmpRd21ZZ24xaFlIK3Y1Q3d0TmNkVWpnME52NlBEb3g0dDZCT1BSUm5vdlhtNGNFNm1XUndBNEpxZFdNaUtNTm82MW8xYVlmT2Q2Q2JvSEFRTmhUb3ZNN1h3VHFPZ3VWUUkzK3JQZStwWXlwWkE4Y3UrcEpkVHl1YWVLeXh6emZOT0MyQzF0a0pBU1ZJTVJhOHVBekE3a0FFbGNpbHYvd2QzSEcvSUVsa3ZwUE1XeGdQTXZ6dmxZb09HWGx1UHVaOTVJbVpkR3ZTSE04MUNVQ1lSdnlmTjByckhoWmtmbmZRV3Y0ZnEydllLT3dkWDIvblZWMVhXWGhYUDk0eXNEeE1yVXpwSkxRTE9VT0NxN3pvTE1kQXdvVE1ybFVKUWVlZXZqdG1PeUU5V0xBaTBpZGgzZWlLeU84V0c1Q2NlcmFSbnRya1ZHL2dkSFNUTzFCRUVVYThVVjRLeERCSTBVamNUbnRiVWFrK1p5cTVuZ3FmV2VjSXcrOGE2bWEyNTlPRDNhUDM0L1UzbCtNaWFrWW1oYjllREY4NGdQYVhOY1d5MDlyUUdPaHlvcEtDUEJxWFBCYlVOcU9ISlNZUWRGaW9QL3hGcWFzUjJ0Vk9hMk0rQ1Bwd3Rnalk5SnpvTVBpY0orT3JnWTVYb0hGU1hoajRDYTg3WEtkWTA5VXE5SXk4My9GYmVnYy81dWk3NzIyZktFa01jdFhLMzRhWHVvck53YU54NEh2d1JQZXdYQkI3bU1EUXA5SjIyS2d5YlNudUtaQjFISFIyRVRTbTVXV2F3WUhLcHB4bTkvQzloNmlOT0lMVFVQTllGR3g3cm16dllRL3FWc3VsZnFCN0d3TmVwWlpqUHNlU1h0WmdSZ2dyb3ZHMHpaTUwybW9WOVA2UUZQNFlzT0J4ZzVkY2ZrbTNlMENVWDBIZGJkdXJTbUdsTHd0UEpYVERSTkkxSnArY0pHQjVmNXlodVhrN0lzc1JmaEsyc0tKR25SM0hlUUpYZDVjUUt6QmsrbjFHUlhSR2prZjJOajU3clFqK2ZoT2RNZlE0MEVyMWZQNUVMVzFtQzRmTTRpMk11NnRLWHRPSHNtMDhGSUFMU29KWnN6aDVOL0dyMzZJSkVXWGZtam1WSXpZR1JWd2pjbjRxWFFvZDZudUIxZjE5Um85cnJrUUd0SUFYU0ozZUp1SDlqYlU4eEFrNFRKRitsZVV2SDYvSkk2WFU4NUNSZWs1WVRkeTBwME5TWUxVWFErV0RVdVRwYjl0eHhtdUFNVHN6cjVuTnRPQXc3bGNjTlZ6L0ZVOC9DZkxWcTdHVitaQjhOOXUwTzZmZ293cTFRRnVkWWVhQnRhRFN2S0lhOUlwaUpyNC82VTVTSmRYWlVGbDlGQW13MzgzNjZmbXZEOFh2bWV5bUN0MnJWTVFvUDBSWTVjWFJ0dWdLbkJtWjE3bVlNUkxQRC9neDRDQzBNRzlmTzhYVk02NFlpTzkxVStPcThSRUpHYS9XTFdUa0RPTUVrTmJMT2l5UG11bytMdE5wU2lYRFVpb093NHI2ZVcyK0R6N0xSU1REcEZEaG5EQU8rUm1sU0ljaUQ2MjY4eFlVQkdmcXJPU0lyNEFPbHJIRnhoTE5yMTQvWVVrM25UQVBQVnFYWTdvU2R6QmxKdGVkdnVoSmw1c1o0Sm1DYldnUDZQNS8yL2M5NzBDU2czQTBPQzZ2OWhEUzJNQ2xzWmg2eVRmdkozNnJuamxjQXJzZDUvMm8wTlRQbVVSZ2RtWDVuOFJLRDliLzBVL1RBa3NkSUsrZStORlN4T0NEZ1BTN2t1aWl5YlZvZ2w1bTIrM1JRQWZtZDRRWlBYbW1VSnhpNEl0OU1tMGRkTXBHaWhOUm5FcXNjbDNoaFVEbHU1MVB3N0hvVVhhZCtScnNNUlBta2FEREpQbjFpODNYYXludkt0WERiQm5aR2diOFF2YWhFQkxDdm5wZStqTHFCK1RleGVWQU85b0cwdnlSN3BETEg3THdGLzJjT2c5WU83b1h1NDlzVzNPdVhwSHRtSG1BQ3ROOFNKU2JHb3dXblRjK2xqUkFrc2pMMUZQUldubDZ2MHF6L1oyc1oxcXg5LzJMc3dYaFNXRlVuTHczckVUeWVVZUtKcktsdkt0TzZyMUo4M1hpdEVHbk9rQm9rcHVFN0orME1nRkdNekxZZHFrdXZVbjY1eC85bHVrT3ZzL0U3cEtlOXZmZTJQVitkZ2tpRVhrZUY2RVhUakFQOFBqZUVNc3dhY3F4cmpBcjdKVlRhQWtndXRRYlIzSjd0cyt5YVhjVlA4b1RYWEJCamVTM0pvU3ZGMlhweTdtRU0vUXpscGtBQ3dyYlBEYjVaaXhxTGI3NDQ2VHprTHV5NndKbUdIeUYrL3JtaktiditkOVVDL3luSzV0NnFiYW9VdWp4Z0FCNmtRNGVCeVpkRFZHNUZmSmtRdHhlNTQ2SWFDTENTcEZaUERYVUJGMDNseVBTOEcyME03R08vOUdkeFo1OGY3K0Z2c1psYk9oNkhzeFBHL1I5dUFmNWxWRzR0aUN3aHRxWUlSZkJHbjJnZWtLNFRLTjk3NUxuNVdiZjhZT1Y2TTJBQ2lMTkZINzFoQytVaXIyNzkvMVA2M0NNTnIzYjY1YmxJWmVkamUwUmp1WDBUVzRUKzhtQUhZSWdCbzNOVXYvTS82NUVjY3JXdXpMVjlZc2NjdVFSekNaRUJZV2VHQ2dkQjBOd2UwbkRROVp2dGRSRjNxSHlKZ09SbTJlYW5lbm9ZK2h3WlpZZ3hpUmpFbkZMbm9QdEg5VmxjeTIvMDhoc0U3aVpuOWY3MkM5Z0pCQ3Jqdy95WTZnRDNsM2J5SXJXWTZmRStTSjQxekdYcHpZMGVBeE5nRlFFL3QrWjVnaU5BMStxVHVmc2pLa2JSTFkvb2pqWmxPUEtIN0RPNDQvVTJYdml3Y3JLMTlqVklHaklHZEtEdnVEZWM3eDlWU2RMTW41R0RMZURNdmZIQXFRTVg5NXRyd1doeis0ZlNmMkIySm51SXdJK295dVcwNVZZK1RFWjVSWlM5d3FaOWF4YlpXMXNjcHVzSHpuanllcngrRHFBMCtrSnZUWkF3RktuRmo1ODVMc1pSY05wV1FzRHlZb0JvTEVGMkVCNXB4Vlg1YWI1bDljQzF2RGVLWTlTZmpxdUMzUHFiTklCeEFqYzFGTlJ5Q1JWQWhTalJLWmkxbHk0UzJ4L0Zpa2F6M1QwZlBPbUdzalRUVGxkVWEwdURkemVyS3dtOERJNFY1WTdTWnBIRk1GOGpjdUdMaDNLOXMvdFZEcmJrRTB6dDVqSCt3MG9MMUk1ZUJjMXhkYzlhUFB0SHhWUUM3dU1jLzFLU3N3ZEZFU2YxS3VCYmJRZ2REU0dPaEhKMTQ4RFdTQWlZS3hJZEp3d29odlZPdVE5OGpoRnpPb0MyNlkrRlFpejU5MzhKN2hNa3JYWk5zcG84V2R5d3FEY01ab3pXc29uYzFVZFhxNzdMbnFkMHBSMTlYOVRlcnFGTzRSdCtoZWllUVA5a05nRVhDSmVoUmdvRXVXL1lHUHJtb3pkMjJtdDExTW0rM1AyekI0WkZXWEd3TStna2d3aDBIMHJKTFQzaWhsc0hTUjNsSU9PeHdCWGN1dzdDWUtkVFVjUTE3cXdoVExqbUNpdWlENXRqdGZLZ0MveDF0cXFhc0RhWXNBc2gySHNnSUlOajJ6bG9uSG8zQ3FzYlFMdC9ENitxL2RpRFVyeTZHRnRCQTVFV01ya0lwU0M3dW9OZGg3eWl6ZlhiMkFBV29DRnlCU2dZQjlsYjdwcWRyL2E0eitkWlY5d28wM3pRZHdiVm1sWWZwb2lHRlhWT2R2NmNDY01lWU1PdmVSVkphZjErWDhlUzRESkJ4TVMveHZaci9kV0M2em4vRTRNMFVEKzNjSk9qazVlT3FRdnZ0c1dmZ0JIM3B2Zk5pYnhRRDNQMlFqQ1M2WVNhQXhpVFowaVlnWlZhTElkemsxZjRXNnNPZTdwZzJqemNKak9VSEJwS2FvZTgzTUc5OTFwWkR1WFhUYjlLekhZOFhJUzZseVFwZk10NDJHNi9RM1o5TmI1T0drWWJUWHN0Skl6emlQT0RsSjZuejArZWtZbnd6a3E4d2FhTUpCdUJTZGNLQkZqYnF1R2RCRzdxRXBXRk42eEd3VXJkRDQzWHc3WlZxQ01yQ1ovM2xCV0h3aUNqUlRGQnJhMXJxNUVJdnVSaFN1Mkcvdk5QaVo1ZUMyUDdJazhSczVRbmNGaVNOQzFaNHpYOXVnM2lsVVhVSVMzcloyejNMM1RFVXUxdCtXdkJMY2pvZ0NES1lPUTFJWjluZnh4S2dzbzFNQ2RoaTBUaGpmQkRJcWNqR2cvVkQ1SW8rTllmeVFmRFZPbnNabkw1cDB4TGg1Rm0yUnA1VWhEOG9haW5yc1BuQzRucmgvN3gxWDRsTWRyTDRpK3dYeE5KcXdLWmh1MzA1aVRlVEYwTGV4bzVBVnJQcjJhRDBoK25SbDFkN3p0V0p4SFRIdHFEdkFNRDdiMVZHa3hxZk1QSmZmdlNXeU42eS9SZWxwUDZ5UmthWCtzOEplQksza0tQNHQzejExb0pjMmhwZGxhZ1NqQis0MDJ5cTMwUEh0WDEyOHZBRDJXKzhTdlUzZk9aU1BVcVZlenlVWGlKT3dQUW1WcHBUOUc4STZkSUZFYWRxS0RFcHNwVWR5TEE0UW5jcmdsRnlBTWtQZnFQSEdhMUdKQ1plZkw2UnlDZm5SR0tiZWk4ei9INmxkQVRzOHBidSs5MVpadW9mVXgwS3pMaVVzNE1CVy9aSFcyaGM2OFRnUGxVQTFFTU9GZk9ieXIwaXc4ZGpmcElVN3JNKzN5K3puUmZlTnNmUEdJdW5pcXFsWVJqQ1NWRUtUT2RScG5nMHp0dUFNa1pMMTlOOWVvVXU5WGd1eE9pYjBLMWMxOFBNMTg5ZUZTOEVXU2EzQlpBeXE4Z0k4ZEhEdnFJNld5ZUNaaVB4TnVmUWhoYUdHQUhublVIU1VCdld5dHRTWlFmN283ODJNZEI3VXNmMFYzM2p4WlAxMU1qeFBSc0R2bVpJRVlPaWhpbGkza1FjK2l1aEZpUWdsTjFlN0JCdnJRRnlUby85RlVnZGhuT0VoV1NOVnhpN3NiTi8yWTVKd2VtTjh5b1BDYXNTVmJQbEtuc3V2Uk1YQUhRbGMxdndJcVFhNGhLWmx1Z2EyUVBXc0pOdkJMcjU2TWVWTUQ5MkIrWmQ5SUsyUjRJMG1waUU1Y2hrSGdYbzNLWHRZeU55T0I5L3pRWTBaMUExY1d3UXlLS1lha3VhUThCVkNLeFRPQlRyU1AzakwrVXF0V0lpZ2xRU0JjRWVUZERsSWtJQ2NQOU02NFV2SGRDVjNEYjFmMEZVNDBDWVBhcXFJVThjQ29mb3gyKzAvekZSM0N0QmFuVS9xeGtYc3ZSV1JvMHF6YjgyY0ZCbVRQS3pCdk91b3c2Mm9RS3VSV2kraUNqUnNOT3ZNRjJIL3FIK0twekphNEFmcEpMbGVEdmpMY0ZvNkRuaWZZaGhjQS9PUFFhbmQyN3NkUTR4cFdOcHpnRlFCUWllejJKRWVENVpBRnI1TzJ5Zk9PNDNmWUlubmp2Q0lBdndOSDFmVUEzNWFWVzZBcDdUWGNBRnJUdDNrRHpJcGhrSTB1YjJDbUFzbnNJUVRSck1PVnBkZ21BdGsrcHpseVFtUE1XTU1PQSttcDNoem1sVWF4Q0QvYS9yV0tYMllkM2RGWTJLc1VmOTE1ZlFNYi9SM05lczJUMy9kN2ZnZjlaZkoxVEZpMTM5dWFKaXRCNVZGMkljUDNQUktXdWFCY2JHYUl4OEV1aXJIVjY2MDJjRTFYUkNvb3ptUTZzUlk2aU1vOFFOK2xqR1lxOHcvdGlLdWxhT2NEYTBZaktab1puOEFCNHJ6TEpWSDgzSVVJNWZSMEc5dGZabXJIY1UzcWZLbFY3VVBaQ3NGV0J2YS9jc1VFdFlzYlkxd3ZnclNEVFZScU9ERFhCTXRzVG41eUtNRW9JQ05VcnBxb2hDWm5DeEpKdU9NdnVVSnp3NHlueWR1TXVCYWlDNnJhOE9jUjZ3VzkzNlp4WnpscVlZaXNLeEU2Nzc3a2dyT00vSndtcXgrd2FWU1JvYmZwc0QxTzg0Y2N5L0M0ZlkxcUt1cVFaMk1nVCtBK0pRUVZlS0I1UnNsQ09LKzlRdGVNZVBYM2FnS1FzckhuU2tUbmt1VnJHQUhMRUtVZ1dxa1Nrb3FCMFh3SzlMMC82ZHJ0YlhWMnE4WUxWVGNNQWlWQWxyUkhxM0VnaUREK0RBWmZVaEIxNHZDZ09XbGNDdXlUbWpYTHdsc3FXbDJiS21PcVFpbUhqbjhQVE9uQVBIZkd4TnpqMnpIZ0U3WDg2QmpxTjBJVkxKdnJ6aUhVdTg0YlZoTzl2eGRuNzU5V2RsOFBHd2dnSEdVc1BIYlE5c2RwR1lmYyt4alhDc2R5cXBxM1ZwQ1kyeE16MjNtbWZXNFdKcTQ1ZG9Bd2pzYllLcEdxRC9lRzV6eWh1S2RVV2RDZ0tSaHU4MjljeGZlcFVyakpuS21qcmlBYXZDQ0FkS0pNMlZGUW9nYjdRaDI1eUlBNHhWMTllNkhwcDV4WC9XT1FsY0hZRXcxM1RqWnRsTk45T01GMUJONlNCc2I4cFFLbzdrOVcyRE8rblJpZGlxTWY4UTVHdEFsNFh1bHgrMFkyU3ZnamtiOXBsM05qamJmc0ZLNmx0VFpwZDFHdExJR2FRQ0Qza3BJcmk1Y3VtckpiVXV5a1NFdUFPQVhrUXFyamEvZ0k0QVp5djhTajcxUHhHeThMNnJtTEd4UTZaalRpaFFjTnVRSlBNUU9RdEdOMXZHRkorY0pHeC96cXRJenRrMVNraDRBUERuMitZZnc4RjdheG9sUjFBcXRnVjJkMHJFYkgrcXk1Q09Cb1VCZDEzcW11emowNkRUZDZJZWg3Mk1aejB0SnlNcFlrS204RnZJVGtjNnJoUWtId2tjRFpXZzFsN3RFVTB5cStyMTZBZk84Wkd2eUhxa1A1UE85Uk4wb0JuVmhEaXkvdHFPZjhaR2ozZmNZRm9ReHJTTE95TUNlWHVoeko4cTNxQndGV3MxdXlyK0hQY3lTZ0xNNldwTkxXUm9abTdQVXRpcng3eEx2bVRVNlZ6Yk5mRE9aS0w0SXVyRTB0c0ZKTThxSTFCb2pPTXc0SWxCRDFMZ0lDQWdJQ0FnSUR6L0QzQTc3ZnNZZSszdFp2dCt4K3ZzKzQ2L2g5Tnp2Mi9ieWZzKzREL2NQcTZmMi9TWi90K3JqdnQ5blBuK0h2VC93ZmJhYjl2Y2QvRDdLZjkvenM3OXYwMC8zaDlwNWZaOXd0djJmVTAvd2ZUUVgyL1dVL3Q5bVRoL2I3WDM3ZnJxZjh6c1A5dCt0bC9aOW5sKzM2TkQvYjlpVit6N0Z6ZnErbGcvYjlEMSszNmNQOHIxekR4d1MveXdyVzJpUktHOWt4K3N5MXFldnhUOVV3R2lZc0FuWlgxSzROQmQyU3VWSWNDclBWelY0VllJbEhBSUowYWdnckozNTUrbTB4UFZsRDZFaUpDVVhDcFUzSWZrek85bVhPc2hGUXhrcGxHRnNQRCtwZCt5ZUhCbWRtNWpZRlMzTXVkdE5CQmx4c1VNZzhHclRBRTYyaElHS3UzY25UYVZCTC9lOG12WURvd0IxQU9tS0hxZTc1ZGxHN3VZU2psWUF0eVpBR3YxRWNLNXByaU1iNG0rQysrY3lBQitDMjZpVHJqVjZCZk5CTTlzY2hOdnNrTG12N0Zyb0gxMW53dmUrU1JtRWpkcVFyYWlHak5JbE9CRXpmZU1WK1JETCs4b0dwdVA4UGxMekk0ZVlwRzQ1b25TTXV2ZzFWSzVxTnhEUmFCS1JLSnlkMlBMaVphSTFqN0FTZ3B3SGxlVXh1RjNBZVFDZVBYNWtoSHJPQkxUeThIYnhUaDFZU2VRQ1I4Y2haaFdwTHRUYURVM29MS0tNbFhwbFpiSHMvRjIxZEJucHJoMFN0ZVBIMFZIVyt5Q2ViVWJEMXFJMmgwQTY0UkZhT0hzWXZpS1ZDK1JVSjZZLzlhcEhFWEwzbllNTm95OVVPWXZQanFzTnNyaCtPSGVBVGNvSFBXRzNIWE1ySnk5aUhaSSt0eURNd0tySHUxZEZHSnptM0dJVkIxZHlZZHZEOGVUZVJlU0x1OE9YMEFNaitmaUgyNWptRjc1TFRMdjFZNlNGdlIwNW0zTitpbGhESUxsblRNZ1FJQlFUNGd3Q2VDOXU4TG83SWU0NGlSazk3UHJ3S1lSMHBxRHBmakxjY3pNSkdLQzhwY3VjcTVFc1ljVG5laTNjc0V2R2ZYbUN1eElEWkJyUWVMMkN1M3ZsRVRCczBxMXkyT2FxeWp4dzJyOTVJTEpEeTFIN3JEQmlsSFQxNjh6TVNodHZobjNBdlpkK0dvSGpRL2wzbnBSUkRkekJ1VzJ3TlVlaW4rT1NHZk5nYVJyYW0xQzhzSS9VbUVEcmNIRkVTaVhpaCtIeXRSbWJDOXlNR0NKdW1oaGlwY0Z2TU5hTnFQMWFGWnEvTmwxSmMvdW92d25obHo4RmcxckNCVjg3eGpZVkQxOXlPb3NrRmNhOFBBRlQyYnpFNEJLV0I0Qmp2YkFzVnRkaDJUeE5tT2gyUGRwdXlDOElIa3RWWm9rVmt0OFVWdkQwaTN1Sjd0bmhGMW9ibFJOSXdpWXVWZFlDU1pSTmg1V1lKdTNUZTlzQVl0dnNKYktsVE9EMGlvOEZybG9NSHdEcVZMZ29KeWppOU96N2JXSkFXM05VZGhlL1NhaGZlL1Vrb1JSc0JRKy9PMkNNYzVSTHpGYkVTd1EvbXNrZkFNaDk2S000OVRKdVhycnE5TS95aWZvT3FsOWZ3ZFVZYWwyV0RVTjBYVWdzanBoRU91OWFmalJQMnU4UEx3aXcvd0JjQzJkVU5rNENPRmVWZlBJaGlSRHhmNEE1Ump2dkpaQ2dhaEFmTXFxVzZZaGt2aDR3eEw5SCtEcTdSV2tzMmtYRW5DQVVpTWRCK3Z4aVBzVDd1U1Eyc05vRmlzU3g4aTRaRXJZaHZlaXI1M3NZMTVLRW1EQklPeGh4NkcrQnBKOGNwMlVLTjV3enY3cGpWb0ZVUUxLU3RsdDAybUVHMGYvdFgwbEJSTU9YNDFJZkpsaWVtL0RKVXVVdk1hY05aL3QwYmJKUnhhS3pCd1Zja0tGclhYelhOUFJhaGVsMWFmWEZHaHhCaFNoT2RJOGFXWVN2dERyZVdYbVNnTHdrT1R2SkppdmNrWXMrem05T3BqNCt3YXc3WC9CbzJ3V084Y2t1Y2h3U0VmQ2dpMGtnbDdOVFZlWlR3Tlo5N0hrRWo1T1lLcnBEU3NXaDNxMXZOb0FnTDVGYkdFbUlhei9TV1FMWW5hdjl0T1VJQmlITHVhczhVREduTVdNQ24yYkRCVzRzOFMzYzVOaHRNaXdyMnNkVEVvTjVzUnIvM3hEOTNFRTVoclFxSHJMRjR1WjFTNTVWYTljQW1xbjFQWW1VN2tBek80MndnUGd1WjNRSG5QOExxVWdyUDIrK0YrMG82Y24xZ000S3JBMXovZ2VkTmxNSGZiQnpMd2w1WVhYc0ZVTENIYXVEc1FyNFBMWjRRUVJ2b2ljclh5aEJSS2x2bzJ6Nkh5S01kUlNBM3AyVi9abFBFUkxpRVVDeGdqR1hyNC9PODJ4by9MZURLS2NZZGZMdXcwWGFHWDJSS01HQk5Yam9UYVI5K1hReEtpSzlLQWNVUmRVUXk5UjFWaXJaTGNDR0VRVXgydkhKUFNVWEhEMDdFQTBua0dTUE1EVDNHNmJPTjV6cEY5T2lDc2tUUDJGbml3ekljaFVUanRtbW1zUFdSV3JEemhxOHRYb0wzTWJIU2w0TUxTVm93YnVESnRDNnd3Vzcyb1hMQVNkUDJ6L053VTZxU2JaSnJYUDJ6a1IxaE1QNk80RW5qaVdWRUJ5aFpEb3VyQlMwemczNS85WEJsTkh6d09EV3dtb09ocXNlNGcwQmtORE5rQkdQZmhGSGl0WXlMZFI0MWQvMDR1Tnlsd0xnU2p1blB1RFJPTDBxSVlxaUNlNXJyMjBNd3pVbGVqNkhrK1FVVXlRSXJFbmNhMi9nM3hjRU9Ed0RQT2FjaEd2VEtERGdyNDFFODJ5RHdRQkk5aElCV25hVkVKQzNUS0ZwOXBOd1d5aUhxOEgxSm50OWNibGtqMEFwSXRXbUZkSkpHYXFMMDVSb2hUcTdPT1Bka1kwZ094bU81cDRxWTA4TmhxTVFIMmRMbVhTQ2h3VlpLRUMrcW5GVEJ0U0p3L1N3Y2V0K3Fvam5BS1BGRnJ6L09ZeVYyRis3YjhOOXlzOHdQWGZ6Z3g5aGlZZ0sxc05UZnlmcVp2YTcvV3FDajdIdWRqM3RUK2pOamlJQ0xTR0ZKMnJkN3Jabk1HcU9aNE9vaVdzN3p5RW1TNVgrSS9BMEdreThiZXhmNCtyTEwzZmNMdUtZOXdGdDNwc1dGQWsyUjhYZjc5RlFBZ2dZT2RSRWhFR3pIWXRiNXh0Q05DSzB6YW1VMlhXNVNIMnRJem1RemR6VDBybm15ek5sdk4yTGlHTkZzbGNuYUxHOXpWQjE5L09WdGFqY01VWlU4MWJZTitlcTloeDFoVTV2SzQ4ZWdzbUZNL01jUzJZSnR5K1lrV2F4Ymk4dWVsOTJ4c1pjL1NlbTdHaG1jdHdVT3VZcVpaVGFDT25WUVJoU3lGakVBNnNDRi9BVitkZGFBK2E2YVdnZDB1MEF0TE5kdFdYdlBPSmROa1Uva3hwNHJGMGp4TzYwcnQvUTBsaDYyc283TDMwS3JBeXM2RnYzUnF2SlFObFhaeHhYOHpaQUVnODg2RzFnbXF5cTg5YStveWNtMFZFczc2eHFENDMraEhiaVQxM3ZnWitob01pTVV3b0M5MDZFWTR5YlBhdkhabDhwa3p1L0t5VndSOWk2NXhHTGY1RXQ1TnVTbHMzektRdUd6MHBscnk2OFZSbWxhRE81MVUzL3FQNkUzbnhISjFvTERvZnhMczVYcGhCR3N5ZTgrVXFpRFpETVZZSmdBaFArNU0xVTA4QmdWZTdJWE9lNEI3MjZoWFBrR0FnaEQ2dFRaWkZtZHlMKzBMelpFRVpLNmVGQXkyeHF5cExIOGcvMmZsajFYZ0k5ZlVsblU2Tnc3eTByaHpMYTFGTzMyM1NINytJOG9PeVhxOXV6amVSeDByZ0h6Z3p4bGhSQzAzcE9hU1M3Zy9WWGphUHZnM0cvUzlRam42QTVyZmd5TnpZY3NUcGFqd2FoZlJXR0RqMDAwTTU3andyZjRNYnpuZnFMNENSeDdOcWVwalQ2d0trSUVRM2N3Z3ZPZ0VtRkJjZnMrQ0RxZEdYanZGRlJnemYvRnBXa1k4RDU3aUZxTWR4QitNUmEvVGtJZTRrclRmNm9sdEtyNkxtMzgvK0syV3hmQ0xNLzZqQUZjZWUxUEI0WHF0dGE5Rm9ZVDlScDBZRnhESnVwM041VU9sVnF3Tm13cHVFRDhERHVmRzU1R3haa2lHUms5Q2VPbVFXUE1Qc0RKemhsQ202MTNEVTQ5UndqRUp3YW5Na0N0VlBYTVlGdG1IMzdMR2QzQmYwRW1XSStXY2tvSmZqNWFsQ0VOK0xMYTRJQlN5U2h1b1M0MTl4Ykc3UVRYSml2TjhpelFqTmJPaXZ5NitjSzVOSzFqUEJvWVBUQmwyb2xIMVJKekJwQTc3MG5yUEdNY1RpRmMwTGRYcDlXcll4djlncitabGJpVElSa05JakY0aThrZ081Y0J6ZEdqaFRqaHdCMmVBUVNKc1Z6L0p6NG4wZlFIc0xWaGZyNUh4ZkpXalArMHVxQ3BGU3JScVByeFRaenBDSGN3SzdndVFENnlWWFZpQlpyV0VmMVpHdTJ4eDlRaUo3NlNFbnltZUNqU2VkV0xWWm8zQ2Zzb09uQmhPL1NGeUovVzVFZG1UMnhVd1RtZkRFSmNSNFdOREhTTHRaeHRJcng1U0ZqbEFZQnZscU56OU54Uzk0NkhYbE9UcVI2Q1pSZ2ttczlkcTNDRFQ5alA1NFBrRW9XeERsd0ZDbDlHaU13WElWWXEzR08rajNxRHFCLzUxb3NaaGVLcDZOMmFUNnRUdHVxWGRkT3ptR2gzRmdta01SdEx3Q2FSVmFDYWlrVUlxVzBTcDBlbnNDcmYwbEhMa3lscU5hcnV4b1p0QjJ1bzV5TkxPa1lvQklBR1lUdERrK3lqL2g4ZW9nQVo4SzUvdXdXczc4M2grL2hDeUdHajVIUkxQNmorVDFkOTVuU2NyZERnQk5jdStrenBZRzhGMnJBWHFzSFkycVpIY05MMEtDcU55Z0IvQ3RjV0ozL0VLaWFic3FQOStzZURyRUVJU1NOSVBidS9NZk42VFFuS08xbFpkZEZDbXhQZXgxVW5mMGpGd1huZXJsRzhUUllTZ21FWHR0LzdNbUVjY2ZuNmtZNkdKaWtMTzRsSzBqRWY2UWIwaUd6SkVaZEF6YWZETG5NeXB0dkhBMG9rUlhyRmk3WStkU25KU1N4V29RZzRYWHZ0eVcvTUFvUTUvZjQyZWh3dGtZQmVlOGtUdnh0R3lOckFMR3laK3ZMREYzRm95VzhFMnhldWRrb3ZXSld6WldMck9KVzM5TStiWW9GTHlQamVTSzJNbUwzaXZmekJodEVSdHFsNVdXMnJYWWhOQlNWS1dxZVBVdThhazZaYkdKdmxqNmVHeHBseUpDVXRtOG1LTzJmZG9KZnMyUzdDbHhQVGQzL28yaHhEak8vbmFZTWN6L3JZeDJQMk9DK0txWURUNGw4MTg2c0ZxWWdoSDNxZFltaVpzU0V6aGliOXcvSDJjSWsyUHJEY21OdUJxV0xiUVgzem56a2ZHdXk4cXg2TkcyU3BkdUxMdGdkeUc1WXI2NUZLZ3lINE5weDVhejJ6MkN4RWp1ZVlndDQ0UStOTDBnK0s2Z2Vkc0ppYUZWYWRYd2RST0JvRHlwc0dPRFNIaHhxc2R2WVVnL3BDcWlPMm12RnMzUks4azlmRHpiRWgvZThBd0dqTm5RTG53ZlhZZFRQRWVNZDU2ZXZzZGREb3hkR0YwUExKNXNBR2R0QlBSQVFBVFVjNlZPV0NBTENHa0JQYzlFTnlTbGxVbmNJMCszZjhzK05hdlJSVTRtOUpUbVVKQlF3bnBaaDZsa2w2TVVEL2k1aFdYWHBndUxBaXNzUmUxM2ltSzJPZkx5Rmh6WGgyKzFjb1Ezd3BMWnRzaGh1dGpEd2cvS1JNNkNnUDVsUkxQcUpIT3ZSOGFnRGJFcU0vNmRFVTU2cVk1V2h5ZXNwMUdWYnZOTVlmM25TOFUzSGg5T2o5THNqNDhKNmpMRnk0QXAveXhncXkwSHhtL2VHMXNFRllFRk5nakM2b0JWbXJKU0ZCSjBVM1dOand5UmdTUEx4R3V4enZPeG1rditiV2lZK0xGb3JRQkF2cUg3ZFFsVlFiQzQyM0Y2eUhzSDJ5VmpoRFdNMWxjUEY0VkFuanJKd0d1QWhHZGh5d2JXN1dHQTVoWm9zZG4wMjVzV3VtbmIrQlBMbE5mNk53OHFnbGNaYVlUeTd2NWlUejlNVDl5RUNoVDAwYlFiSkpHVDg5emp0cG1odU1MT2dzUU1QalVURkJSdTgrWk5QVENGd05IdVROc2VVdFhYWHhWZmc1V3VqL3pEMFpzYzJJb2xuTS9VaGJuUm1vaHRaZnJjUVJNUkt1MmJHckFFTWJYcmx4SWppMk16YktncGxvMUJjeTB3ZE1qZkY1UFNRTGgwQjVlb1FPYzk4dUZoWWJXcm9vM3Vkd0RONGt0WkoxakJDSW4vMW1GSm1tdFhyNEtFaG9SQktJUk9hdHgxOExmVEppaFBzWHRzSTd2aEZqOWFMYW1PSzByb2ZXbXlrYmM3ME5ESTBjcFpFeUlVMENxT2pnQ1JTNmp0eGNrcWlCVkxzTEU5b3RlYzltcE5EZTJlL0R0Y2hrVzdyWXZFangybUVxWXJ3OXN1Y2lWdmUrbStGWVZxaTBJZEdZa3k4VVpnWHVXUXAyd2ExNldjeW1IVUxjTXRaSG9nSnM4YzRyZFN2TzhNajJIZHNuQ2JvcG0rSCtyN3hoMnVGakNiVWtENXd0L2RlZWQyaG5NZlQ0ZHo3NXRXS3RSUUMwSzJxWlBMUFhCSU5SOWlLdVRTbGZCbEJZaE85bGFTK0E4S1hKOGNIRFhGKzlzem1ER0ROalY2VllLRUpEalJ3b0xhTFlGM1Bsd1VXRUVYNmtBVEg4aHBEZ3RLcVR5VFpmQ2RmcnFOYjVoc2lLLzBuMkxJMVN1MncyTGhkTG5zcVpJcTVYZUxGTzhXMTMxUnkyR0RPWFlUcnhZS2UrU1hDSzBPRzVsbTNDUEIrcWhoeDhmbFgweXl4cDQ5TDU5Tm12SXU1enJEZ2ZNek1VcUliUEpiZjQrd2ZHOTRZcGpYTi8wK1AwdEErMWlDQ042Z2xTSWJleWRrTnhZc0pvMFpxWjFuSVFSYjNIZURvU204S21FZGNkemt2cWdyTnVVUzlhb000TWliVk9Eek9KVmJsdUZ4TThRS1RiSDY4Y1hMR1NXM1ZpOUxrTjZXcW1BaWsvSy80S1M5bC8yVHpsbmJMa3hodWtUcUZXRDM2Wm4wQ0dyRHJNSzlidTc5M1VreUk0dHhKWVZBUVM3S1pmSWIwZ3dnbzYwWWtQZ0RyV0ZCWktPdW44U1VUMDJ2RmtGcVdlSTRjMW81M0RDenBWemcrS1BUNUhnMEZ4T1diZGVQNmc4Vll2K0VSNkF4L1JreG4zblBnaEFkUGtHeExDTUx6aytGdjlLc1dFZlhPb3djcFZKUHIrVUd4dHFNb2hGaXpEMmNac3FpYkZjTVdyQWp2WjE0bjNsOEUzQk5ZKzN2UVovWStZem5kRFVNckpxOTJhOWRWMkZLb2J5UEl6Yk1VUDZBR25zYVYwWlRxMTVNUmd5NVFtSHhjSmIwQ0R2RFg4OU1mcFBpMVFDK3RBRnRmdFVZdkVKd21TM29MYWY0dnVoVVYrai9SQm9aZnF4QU9KYWpGRWlSdGk1dW5pS0NpcUJoRHI4QktPd2hTVWwvd3N1S2ZZaVdQdkY5UTNCRkIxY1Y3cTI2dVlPWVcxUjhta3lNb0dMUGY4MUE2RlNJR0VTU3QrbTdTQVRsemlwNndGd0c0RzgydTFmUkxRNnBIcjFISnFKTkpKbFN3ZGxKeHNrckwvL1VZcmVwK0hnWThTYXVocGNBZlJQeFNmZkRLM2JTQjlaaXJubDYwUFY5VGZyMVFDRzA5TnFqWjJKR0gxckt5c2lEVE1oc2Z2S0VCRGRtaWIwOHJEekdoQktIR1NEQnI1NFlMM2cvQkdXcUVBRlo5UGd2TTJQUzdsbmJDcVdYQnh3blo4S1ZaN3lyT05lMUZPeWQ2R0h4ekRJMGc3SnlKcjdCMlN3dXVDeXh6dkJSMWU5aENGTm00dGU3bWY1WmFlZWJmNzFma0VpOUtnK2NkU1JaaHk0eWhsRFd6dGcycG1mMW02b1JEL3pKNytobndxU2prOXlUQitZTDJDbDBFNjRIUTRVZ1c4YkNiNzBJNWpWVi9Denk3SHNRUndFOHJSNGhlNisxZnIyNE9DdFhXMkFXNnJKZnE0NGpEVnFlL2x6cjdzZFFGNENLaVRuT1lvMjd2RGpFUXNWUUs3bGtocUM2b2s2cFd1TzlYWEV5VXZ2NWFLa1ZLME9tTTkzMEhyUExKWWdVbnJQZkFZMnJWRkRkeFZDaDcwa3JYcW1SeTFYLzMycStuN2dZb1VvMVlRVGtHSlNPZ1pXbXFjZllqTE42dXhwYVI3VU9zQ3dkRkVmVnZNNzZ1aG9DS0VPL3dBMUE3YjJZZlFTTkJWYkpFeWltSDd3V3NySkVES0FDZ3N4ci9mTHNMVWJkM1BrQmZ1TGIxMFBPUDlnR1QxWUtNR2ZjdDFJbFR4a0NLUDR1RzBwamxyTTNsUDlxcjE1UUR5THlnTXlVOFBlY1lmTmExVU5OZXp0REduSUZMRFJremZLbVlramFkZzRpbklPUTRSdThCYWJRZTVPQzQvVUtOcGlheEhsSW82S29FeFRDcEtyNkUrZEJtczdlZ3dWNmErQ3lCanFvMmFuMlRyekJBSExMMUtjc05HMzRHWDB3OFQ5c014RFhNZUFnTkdsbG4zOXByYUhlNllvVWhLVFArb0hZRXEwdmV3WWZRZVhLdmRlMFBHd0xNa3RFbkVab2lxcmg0SVF2VDRxRnNaL0RicTVub1lNeUNSeDMwdm1kbm40andWRmplbklOY21yNFY3U0Jtb3ZNZm5haGJSZU1qekUyUFMrd2lIa1BGUGhQdjg4ODJkNlBwUWkvZ2gzK3Fid1c3am10YTlrYVo0TXB6eEUweDFMdnNvdDlTRjl6VTIwSCtySGpIcDljdEcrZ2MxaFdwWFloSDNGWGthUmhRdXpxV201RWQ5YitodmtXUFBUeFh3YjF5U1dlSGptZytqRytSRzhTNzVTM0h0SGJSczFwMmRONlF4Zy9qU3B3RUdvb2Qwd3hKREFONy9adkxUSm4rdXRmUGV1RzNza29YVFFCd1R0ODhJWnpDVTVTMkZnMTMxMmJCbUt5Ui9uMkhLK2QrREljdzlCMjQxcmh0TG1wNE10aWhCcVhSQ010VWtNV1hiaFg5bUxvcUhSY1dNN1ZrRkthQ2VrRVEvYWZJcFFtK0dxQ3hSeUwrQVBENUZMWUxEWjF1bkN2bzhnMlYzbHBwRWdNdjVza2N3VVJRbCtXcXpteUpWV0d5d29GVFEyUzkwWjMxd0pSK2orR29uU3NseTV4Q2FSTk1saU9VcDJPU0RXaXpyd1pUVXpRNE4zWjVhTmFsVkdkQi90Y0NjZi9mbytabkVZZzlQcFFRbm1nUlRpZEtEbVZOU3cxSGJwOWx4MmNaY01Jako3b0srRk8vS1p0OXZpRW1oTHdEeGtNR1d4a05xOS93OEhadm1OblpNZS9WSm9KWWFaM3I1TjJUdDY2Z1g4QXJWNXhxTzdyYTBINFhrQWYzZ2ptbHdKbzUxajZoM1BIZVl4ZTBiNUt5K2hvYWpCSVBYaFdjelhnc2tBZmtGQ0NIVi8yYWJ1OE1BSUdrdmFnMU9kd3hVazgzUTVGd2FLZVlka0ljdUJZSTNtRDZoWXhsaGNFYUJDcXBkL2FCdDFzNnlhQ3plckV3dVVvc2FaR2Q2ekdvZ0dseW9XWDZqK0dUd2xTK2E2alFwanZvNFZyeEJmTVpRL2RMdzhXSmgyRjE2Q3J5YWMwK3RBdGNZNEorTVlPY3o0ME51emVOeVhDZUVuSC9aaUdlTzE1NVk5V3RrSExsZHUzamc0TmpkclRoaHpXZUJMRWdZbVJTNFlSanhjZ0EvRVZtUUc4ZFRvSmhDaldjTExQTEdJcTZHN2Q5M055azg4VE5NV1BhSmlpK2NaNHVYamVPVmUzRXJQMEJvL3N5bmZ2UnZkaXFNNEhBVGxrSTFGZWpXVkNNeVJQSm9TaUp0Rjk1QzhGQWR2UXNWazB1U3R5MFNvSU5RRHVtYkxoTUFsZTVNbHdQaVIxNkdCOXJXelk5Y01lWlNkT0VZdHNQVzJFa3VoVkxqU2g1ZmRTajAveGNSVTdjTEw4cmRyeEpZZHYvWTEwVWYxYWZxNXBHUkQyb2I3TSt2ZmtHU2JweitVVEp6ZGp6OUNLTktYY3hHaTFjOHFneEVXTXQyY0dNcVVtUnZQYUxiK3NlTlVXMVpzalFxRHFocXlBMW9QRFBmcWQ5SDVQQkZPdnR5Y0dHckVsUkxQUFp0VGRDYWZpSHc0VXlnZlFpS21HcTJTem8vNnhRejFvVDkvb0NRWFZzenVsWDd5SE92bWtLd251RG5WcVExV2dEeFV4Q2puRHJkMnVSdUpmVTc3dlJXQTQwa24rWXRPOWhhb3BWKzc5TDNoV09MbUszYmJrTmRwZHQxTFhNQkxYczRFWG4wSXdwNVNGZWNtRnAwWFhRa2lzSUFPKzZEZzB1VFRXbDFySE1EL2NFSW81WEsxdlI0amRRNExrc1lOeFhVaDd4Z21wQVpJYXhHODNqUkFSbHRsa3VhK1ZjdStaQ3Z1Q3NTZ2g4YUZQSDB4RFJaTFp3b0UxbmJSVFFBbEZvN01mdTJZV2V5d1hEd3E2dlpBZno3bXZqVmdQNGdhVlRjU3Z0Y0xQZFRHWFUzQkJ5SS9Ibi9nVFpUKzN3M0ZPVmw5WWtzamVXYmlCSmp4QncrS1hMaXBjNllwbC9GbGl5KzlML0hKVUpZOHRrNlJqZjRhaE80b3BPMktsWFNBd3hSWTNLTGloRnQ4NFp4Wml2RVlOT2hHTzI0UTJnR1ZPeWl1alNCTE9GM05hQ2xMYVZvOGQ0aUVGVjh4WE5PZ3YxYlFxS2hFcjZZdmdpRG1WcUlkUU96QVlCSTloZ0VKM3czV0RrNnBmVXlKTDJqSEt0NHhaMHBTbGFxeDFteVN5OWI5Q2hydFZuMlQ1U3pXa3Z5MXh3YmErTjV2Y3llK1ZSWG42bk14dUVYd2tOMk9kcll3QWtna0RiNEFhdHZMMUQrOU1yQWFWNUsyeVd4ek9xZ0Yza0tpandBbms1M1hrWGNuT3pzMW1zZndvemF6MzJteHhlRkwrOGlxL1dkSzV6ZGE5RTZxR0xBL0ZadnJ6ZzUwcUxYRmU5bW9wRys4N3J4ZnpLOEMzMktqbkg1OG5acUxObGUxMThJTHM3bGpKU3JYZGZVK2RHN1hnWlE3YUVoRm5kZmJ0K1VjeGpneXFKcGpENzM2KzY2T1pTOU5Rd1I1VDJqdi9KNDVocnZWRGl0YzNnWXJhVldaeXZzeDV1NHR4aHVUZzFiU1oyN21QYlppakNUSWhIWGp5T3p0NFZRc1hXVzNrSEdPb09hajI0cWZjTmRGdE03VVNGeUNUNGdFcjE2UG5DWTdhZ290cGdvWXdIVXN5VDFWWXA2KzJma25kRmMxdlg5Q2d1TU1zNzVzN2JneUoxbkcxRFZ3Tk1sNk1DZC93NFdxRVM1czRTelBrb1pXN2g4RVNMeDEwZWF1TG1zMGJYTURYZFZ4SEhZLzZ5MWxzcDVJVEZGTnBuRlV2OGJLVVBUNGhtclhlaWdaQVRmc1YyL0kvUVd5OTFudkZvKzdHRk9Oc2c5ZVd2eHoxNlUvRG1lNjJ1MEhudURuRWpwTjNhbDJMNlpuclV0VElsRkIxRUoyV0tIcmFXQUdLZTYrb2VJa0VWeDE4NWhBZHV1VnNya053MUY3TXEzdmtSVTB0VXE1SjZ6MUdaQ2RVaHNSUkNBbEM3UEc3UHU0K0prUnNCZDhLTDJKK1pDc0FqTGN2eVVnTjJiS3dYeUpFOE1BYmN6WVpKVC9mOEpTRGFHM3R4YThualAvU25aRWxNNFptd3dGSkhneEhaMkszSHo2R2RCeEIxYzl1QkczOGJwdFRHblBjRnN4L09kdDdIU01QTVhOL01OWG5PRStaNnhzdTg0QjM1ZVBiOWhYc3pZMjhvZ3puVmJoL296Q2tUWDIzeHJCQitob0wrektPVGZrV1BoMG1qbUhKbTF2R3JyZmFoaTQveGk0Q2JzL0NTSEdTYlh4ZTM3NVlKZmFZOUpOS2NCSURPRmhxWjdzR2hNS2taR3dIRXk5UUZuT0dpVjU0c2V4U3NRUyttTWVFWWZEWmtIL1l0eG9mTzFub3p2T0h0c2ZvOEdDaTdLb200TDNmYTBwTjJGTzl6dlRYVDMyakZCZDdNWTJkK2l1dWVGdldFMTg0bEJFSURSOVd4RnNxbVpqc1hNV3JEQ0NZcmtwUVluQXprRzEyZWdBV3UwdGh0czRkZVA3MCtJQjEyQ1ZkYjIweUx3bkppbHY4bUhwcVVBa2pGUWsxdnc0QlFJS2QyRkdKUHlsVXMxM21KK2p5aFZ5LzJDVERGUS9ieHBHelFTektDTGhmclpUVUpPRDd6dnhBaklHZnZqMmpvRFB0ZTFyVkVTZ2dkVmlFK2l3NDVCT0NTMDVuYnkyell1VTFvZ1pwdHFZbXlMaVgzVUpKR0NkNFdtcFJoNzRWNSt3ekF3Q3FsTHZhZ2x6T1ZXSXh3Z3FENmFlNk4xMnpzQ0JyMkVHckltVUtJbmJCdUhueEFlcklIcTRLS2F0M080UkZWN1ZFVFZTQjhzQm9qNXBtN3FPQ1VQaVJueUJUeHNSM1BpWXV6OXE0bVFkeWUvTEVrU0VQNC96blVrR2kyNnlNNzdIdW5oSk1OQmpwdlRjbUMwcXN2bVJzejRmQU5oMU9qYldNQ1l3Yzh5US9DWDJIZDNtSFRPcTBBam1UN1JkRHo2TURXVDJ3c0gybGRuTEl4emxTZU04ODdVZ3VJL2ZVTHg5TUl3dEkvWmpvUmZLSVJLbHJGaG1wOU5PUnQ4SXowYVJBYmxhNTRyaVNzTGx1TnkzcTc4dFFvSDYvWjlFR0lOdExZQm1KYUl2M0Viak1waG1ETld6RjRLUHFCNlFqOCtkcHVTTXVOd0VabnVwdFU3RHR2dkhRaVRuY0lzMyt2cUFIbjljY3BpWGRjTnVjRGc3dktLS3pPSUFlM0FHVFhVbS8wMVluTVhXZHNVMzZaYno4eU9TOXJMNEhEK0FzNk5BWXZHYUN2WnJ2akZPczFXZzRSVWsvMEFjWjhMWlV0TXN1cHI2djdWbk9icURmOERMbG1QdS90SDYxTlpKWXlVT2hrRlpycmNRSm5sOU5LL09UeDdmZkZvRFhSeE5FakVYSXlVUXYxcUtRSXRMUm1RK0VvTjRacHhUb1pFTmV0ZS9NU1RYOENMU3JRQ1JUQ2xPakVNMzF6NUw2V2RGa0tLV3lMeVplWHhKOUVySnRjZlQwSHNIZ3BpTnRoRFNySjB2dU9hZEJGd2xjWTNyS0VYOUk1ZHlkT3g4VFNxc0hRQ1dPYitjZVFzMlczMDUwQnNDbFBTU3R1Q2hTaXVDVXM0emZkaHgvMnRVWWZUVUtSNnlUTHNrcmgxaFYvQ1RxaVBraVh1aW5KS0MwTE1tWTlxS01KaXo1TjBPSHNVZGdkVXNuekhwWXFUaVVwd09rQTJNb3Eza1RnYjNDQnhhSGVJNXVQYm1ZVzVDTkx4VExxckFHOW5qaEkwTTh3ZTlZZ3VXQUFUeDBhSFBMb3BVaHdMczcxZHVxYzl4MmdpMUJVMzBzOHQ3NG9aSjFSNHNlOStLRUNhWllBR1ZkZXBUNTlVSGRwREoyaHNLVkNQZEFNYjRCTEJFRFlXakVwT0k3QWUwWEoydDZ3TGh0aGN0MWUrSG5GSHlQSjZIMVY5VTBkb09UL3BEQ1htajV4OFVZaExTMTVzWjM1YUFZZWtTdDAwK0hUMzdNL1Y2aFdpZ1A3M1EvVTVWbGZpYUhzQUxlSmtyQXJKbXdSMTlWNklVNWdtVzI4SmhDVzBPeEtBVnJ3Z2dIa09JSHVIWnRjcSt4NWM0VU1uNFBYQXhsL0h4WXowY3ZLTGtlRGZNeWQySUlVS1k1MkdEYTBLa1BxN1JwQ0NEQlJJbDVrdSs0azl0UEZCSER6UzdHQjFKUEVtMmZWcnpRejczd3hwRVAyY3BSQ0lyYjZOYVdsZUtzMkg5M2FyWTdNMTBUU1JwMVhXMDVtZU4xM3pLaHlNbzY0K0trWUdHNVN0OWxPbHkrcUJoQUtkK2s4VTM3TlVzZnRYcENDU2UyNVVyMFF3ZHk2TDBuNFZOMXI4M2FZU244dzFrSEszL0pDSDZFaWdGbjFlVjRuc0FVWDZoQkJJd3Myc0l1SjJMTE9tWkFjTUU4eVBvdFpqSWIyWXJRalhva1djMXgwSTVYVWRQMGNXVTdXUnN6WnZLQnVUVTF0Smc0alBhZHUxYkRIMTJhdHZwd3BnUTY1SUpHRkxwMHhLbW9sSVRzZGs0TUZ3dUZIRXJMNmN0SE5GaFBrcmZHMzhoakk4Tkd3YmQrV1NiLzBqMGp5VVczR2htKzJXdTVDWVFaN3BhSkI0Y3FoaVEwK1BoM3VncDcrbStZKzFjUTd4aGlrS2p3SlY4TGVDYXdYQ2p2RjZrYVYrNzlXQ21uWVZjSG5SZXlzU3VkQTM4RkdZWFpvT055NTZueTVzcUNxbktRN1VnbGFXUjAweUk2VmY4MTBhVW50RHhJbll3dU5RQUpNbXczd1hYeVprTWMybjdpR1lTUDZxc2Rzak1PdkpJa2RXZHlvUURoa294UWRLazZMWUp5clo3ZkNEQk12RFlVc1FjdjhOT0l1bWRNaEdFVlVHUmptb3ZqMG5FQWdjbHJaa3ZrMldIQ1g3OTErd2Zrc0h4NUJnYjlPYWgzMkk4ZnUxd1BmT3FWNU4xRkkvUU1KSWFhbWMrbHJla2RMelF5RUFEYW5jczBOZXFQc2pLMmx2aFhMdktlTzJLN2JQQzFlb3dxTW1mSmFNcTNoZWhmOG5TWjI4Vm1FbklQN1BFNldqRUhxWEYxaU01SnhFaThlc0VmVEdLQ3RmdjJ3SnhPNEdYT3k4WVJDTjFqcXg1dDkvRXNzV1gzZWpMS2tqU1JFZDg2c0xyR0RiSXlIM0Q5b2NzN2Q0eVB5c0lodXc2Y0xrWjFFd1VMdjhveWpJbHJCSFo2b2YwazlPMjdsKzlsMjR5aThwUFdwRzl0QTRQb2tYSWRuc1VnL1JqWDU3dncveFNHdXRET1dWUVQyY0M5VWp1SW5Sd3RKcjhhNGJhTG8xVDNTL28vaFdHcUVTOWxpbXVVWERjQ3JtU2FIL2EwZy8zM3FhMW5HdG1EUzExb2lsM2MxNUFQTU9pVkExeXY2S2hrQjhSU2hxZkRnMUhTUi9lRldWcVFMRldwMDhYNjlIQjRQUFlhQjI4bGFpMkJabU9sUUtrWVYrZVZsOUEzSVIvNWw2SUtmNHBvdVVudGxjd0FGQ1l0VHMwMzduVnIxeUh6R2E2N2Zaci9Qa0FmekMvY3k3VjVCaXpzbVhMVHQ5K0hTRWc4ZWk2aUNpVVVFKzdyWWg2b1hOL0ZyWERpS0FGK0pXNFFWN21NT0NSOUt3QVZYeHNBZ0ZJcERLdGRhV3l3VXFvQ3RJMWh5ZStiZWVhU0ZsNzVtbUxONDNaTWI3QWpvaW5DZ05GUkppRVZxRG54ZmREWUlCU2VXb2Fpek52d0JGQVRCeEhRV1MzUmNmTHhFdGpVd3FHNTNQL2R6KzJCbEVBaDhSVWhmYkNvakxtS1k1dFQ2ejV1blZrbUdjMWlNWUdnMHRRQk03Y00wai9Bcm4vQzh6M3NmaGFYazlOcTlvSVVvVUFRelJVTDdSQjJBek9Zb25CbWtDYTdhdFdab28zanc2cWhtdXNPZk1RTGx2eG9sbkttN2plMGNtOVoyNXlTV0oweGh1N3dzMjA3eElpNlVta014NEd0NVRmTkRhV21xUzErNXJyRlpCSmYvTjhydjY5anZDYmNwMTZXL1dVeTVRK2ZoelNSUnpiOTNIa1NiNkdCVmVCd0ZkU25jZy84SEVKTTQ4VXdFdDJMMWIrS1VQemxCb3hlL0RENThtY3crTkpMRFJNRGE1aWJqMjNQY2tMN0NyTVdOK0x0ZThaUTM3aE5LU1NPMGl5Yjl3eW8vdEpudkRCRjgzbWJnUFVkbXF3SUtLemg3WjE3QmdyTU90QjA3MHB0cjVsQm5nNlB3cE42WTZWcmN0OWxPV2wyRGlTZDBMT2lsRGgwTkdlYjRWZXIrQ24yeHU0WCt6aEs0VDRuMUlSVk92R2Jxa0tUZ3JaL1ZUWlFob0NMMUNINDJyUE03TWFVUmxRdG41L09HY0J4SHdFOXczQVUzOGRrYTZpc2tqMUlQeFFIMjR3Rkp4U0NyQ3BrY1JQaDlpVXlBREZJV2RIVWZwMjEzMjNsSjkvdnF0Mm5pMmEvVGhRU3VZU1dmZy9SMUgxc3JGeC8wcmtqS09zYnN1RlM0bFRRZ3cwODErNlc3eTlWMWpDcUx6dTIwcHAwS0hiQ2d4M2JZcFlCOTBYMWZDSG03cytrTEEwTk9SQlNTaWNQRk43QWJIcURISnBhTmtWSWtDTjUrYzlQZGhyWDF0VmxlQjFOUmI2ZC9hcTBnaGh1TnVwRlpSQ3ZjaUZyc1l3V3hVeVJLWVRIWDBtUnUrdXlHZmxtVXllYjBRbklreXJuRUNHbTlOVlAxdkxESHVmY1FtL2VPY29BRGJyMkg0R1JrNDRZbU4wRThSWjBsbGlDTk85dURaclNIbHRTM3RRU2FDV3JQc2hyczlsYnU2M0lKb09xT00xK05uTytEYXpqYVRNVkhhanpCdHg3eGdrVjMyMThBcjRkQXkzZUZhRk4wNVd5YU5mNEZTd0l6Y3VaRlhFd3NhVjg2ZmpVeDA3K2QvTThFZW5lKzFQa2pxMjQvdm1EVVVlOUpKTEhsMmoydVNEbjhITjdHYzZ5UWlEOERpVlo3RmNtSmw1RFFObk80RVlDVmpEM0F6bytCdXJpM3hxKy9RL0NPYkdGVG5YNjFrOFIvY09QeElVd2FkalFrVUFGY0pqSDNna1Njekg4eDV6OHdkak10bGdyYnJ1c0o4UXZhY3B3cVloQ1Vhb0RzNGtjakFScjI3RUR2THNjYzMzMzQ3L2E2SktMc2xKa05ueG9UUElqQTg1Y1V3Z0hXMW9DaWtlQmFiRHZyOGtNZnZjcEJKRXF5bWRtdFkvUzRkaXUvYkVjKzRBbHVCdFJlZGdxaXlTTU1JWVVwdVBuS3BFcTRmWkxLU0IrdkozWkRNN0p5ckZiMHVtTTBpUWpPRnhzOEpnY2VseWJFeENoMEh1NHIranBmZjZsSCsybkhWdmVHRFFSUUN5bjBwQS9uVWhSOHhuTXpBWGdKRE9VT3c5TnRCVldVb2JQSlFmOWNUcE9kRW5hL1ZOMHJtZDV5Yy9nZlBUZlFJTjlNNXBIQTF3RDlGcFBuUGJTb0hhVjZrOTRmdlNqMTUxaXdlVERpTE1lQXQySS9iNkMvZElXdkVUemVGNWIxaU41c01acFNxOVJxRVhaQ21wMXd1L3lNYzU2M0piak5yOWVBVDBuR0lvWEZERUZPT2lwajNaM3d0Ukg5UEd6dHBVWG9iempvbmFSWGc0RjQzT0hwWWxGQTdLU0NPbTJpYjNKdWxMK1lMeTEvOHZKYkNvSXZIY3NsNWtrZkFqa0lzNkJ3aUZUSXdpMlYwMU5TWFRCWDJRbyt3UDBKRkQ1cTFYQ0ZWYUwyaUFGUS9FWkpSS2RwcnhNb1M5cFJXeUFHeVVHQlJxOHhsTXZ5WFA0ZTRXZXFYVTFESDUzTld4NmNiYm1MelVxUDVpbVZSU20wc3VPRmRlZ2ZnQnVORWJWYXNkMUl5ZDJvVXBXOXNBWlprbWt1NTRhUmZxQkNRUTlDZ0RyVE5FYUJ2WDlUYUk0WTNsdW42NlJMQnpvWnZhVzJWRzNDdlRqZGVOSDlmUjYwc25BcWc0YnRZSHpJcy84QmlKaEdJa3JmV0ZTdHZOUHlKNEhFbVRFeWNlSUlrQXVaOWlsZkJvL1dleDVHRFFkL0FGTXY4VjdTcUt3MjdnQWNYTmhpRzZ0ejhOK0Y3TG1CS24rM3BuTThKdy93TUxJQ1FCaWJ0Uk1KZ3gybXFpTlRWY0FPK3FSa3kxTUllNmlmQzljR2NXOWhncGtsOGduMHVGNjNKU01iUEJ1ZS9QZEdoN0VzaHAyOC9XTHRPUVFjOTdUUHh3L3ZiL0pVZmdDQ3JtS3ZMOTc5RVlrR1hoSW03RVAwaWtxS0UrZkRITTUxLzNkc0t5NndKdTFTdU9ubVRQK3hTOERPUTliRmlTN1J0aytpSWowRDh2dE1lZmYvajRUY1k2VUNtOGFOa1pVRFNtZ2NNTW9ldWI1VWM4T1V2ZGd2eFp2RGRIb1Y3aGY0V3VjVEY2V1pEZGUxMnhkc3FaUjE2WXdYcUEvRFAydzJJdXhaVE8zMExDV3N0QlhDQjdCUnVjZ0krZmd3YkpoRFZnV2F2cUxHTDZSUno4S3kvUlVrb1cxYWc4alplVW9WcVhLSUp3ZWRFb2I5VlNHR3RSTTc0aHFTaHRKT3dyUkRabVNlU2cwTTdoVUh6VlhHWTduVHlkZmdKaFI4eHozNHNMaVFLczEwc3E0Y1RsQVA2T1JtR1N1ZlF1N2g2a2dUYnF4aDU5YnptdmZsYmY2NHpkR1JjR1FrcVdVdnFLZUd6anYyYXVXRlRZRFFJSFFaWFlPRTJFeE9QUExZemZ6SCtnMlNMV3JCL2paQlA4SEN0ZWRUU0xjeDBqdkJsWU4xS0cwS25ndTN3eTE5QnRtSU5HOG1zaUV1QU9kVk9LZmkxV2dqRkpPekhaYUQ3eFZPS3Q4R3Z1YjZHN2U1bzZOeExpRVczT2hUQzFRQytZVGhWUGE1bGQ1SjhRNEVuRzF4YlNhL3RpYzZlR2p2cjk1aFZxNzRCZ3R1TFgvT3daQnJVeURITVhlWWlhL2ZJUDVyYWpmQSsrVm5BL3ZaeHl0VHU1WmIwaEtXQlorcE9NZkYvT25rdGs1eHoyL3pwYXAza1QrN0g3Q1dnMmxsa1ByRTBtRnhEZXJpUzNZekF3SWJsOFVjaFBnYVdGWWIzaFpUOVBTdnoreDRrb0hpTllGdWNTbk8yTHJZemFSRTd5c1NzWC9aTzJIMHVhcXI1eVdHcEdCUVIwckNkdTlSMXBtejhsNy95Z1FwRGFNeUU0b1hkL0hRZmhQaGVkcHJMSzYvbjNydWVtVnFNbm5mdkxrWHppNStDN3hnd0lKRVVSWkdKSGVxbWkzVFQrMnBaYkhLRjFqRlQ4ZjNiREhra2J4aWJ2WkdZd2VYVzNTZGVweG1hV2k0NGNlbFRHMzdGZWpSbCt4MzFZYnluOTZKY3R0cUdlZmdRejlVeHdlR0JtcGJvMXhSVExlejIxYWtCM3BIYjBSQVpOTWpsOUJid3laUU1YNklyL1psWnNaOVBQWnFuUTNvZGJmRFU4V3l4OTJQR2tHMno2Uk92NjVOWXF5bll6d25MSCtYZ1RNVHlKNllGS0FWakphczVxZmtJMDhZRVJCZHZUdkFkVmJUVDBkT2Vtb0lJR0xobXMxdTFCVXd2amwySEZ3ZlVjdmNtT0R1S3J5VzVrM2l3eEV5Z0d2QVNoc0psYmRxcXpxaWZCVW5TNmJqNGlFbVQ4Q2ovL0d1Sms1N1FuSnpxazE1L0V2Z1d4Ymt3TmlpSXFiWEdQa2RaOGlIQVlpYTJDUGtheDNYNy9TamdSenFNOFpxN1ByT3BkeEpWMjVzRzdKRXUrNExSUGRrbE9TaU95OS9saDZSc21sb0FHQnFpM21HTHY0QTlWcXRMUXVnWlpNa09aNExNZWhIbmVpYm8xZXZRZVRsY2w4T2J3ZVBrQ3R0bU1ZNC8wb1ZQUTc4dW9SblgzYnJhN3JObFRaUDhKakM2bHAzZFg3VGpDQVdKU3pXdGhndGx4MDQxRVphcGtkL3hleXpLK2YrWk8vVFJaQkhSVXkwR2QwZ05lMVN2Y1paSkI4aUJIdFNjVlRVckFKaXlSSC9uNmFyQzZsN21BSWc5REc4V0l4NnhMQ01vdGsyeldiNW1PNFNNUFlsYU80Qjh3Q3RzNjdJRVlMUnQxRGNCYTJzL3p3NEVDcm8zM1htRXB0T0dmTU5QRFNEUnZzRW91TzBuQXowdXNya3ZUd090Tm1aSHRYZmg2WmtWM3NVK0VFdTBZYklEQmNha0owMDJWQkVYRFpXM3FLSWRDZGJaQllLRHR3Y1dPWEVzMHIxYURERUJtdHExM1NtUjJYdUxsRWJETFdhR2NOVTFjNjZtQU4zOVBZRm1mZFphbzN0N3JmZ2c0TGVGRi9OTEd5blkrbU1FMEtydmlKT1dVY2ZnaFNLMVR0VE5XS3kvTEVqd0hTYVE4bVYxdmozRjhtQ29aRVJFNXd6Z241bnhkTXNJOVdoMlJYUmhpaTNCRjNTZEQxdUFueUJLTXJabTBJS2RhbzlqSHdtanJHdmM2QXR0TStBZmRLaDAvdEFRT3plM2p3eVBUMVJtMDhoQmRCbFpvMnhKQjNUZWdlV1IwUFVUSTJpZ1BIRTVCNVpKNUVKeDM5VFR2dXV5b3ZrelhGY1htajJDNVRrcU9VRmVCdEFncXVFcS90WWdUblZaZmtFSkMyM21wb2hEdkV0RmM4M3lCYmRlRzd5MHI4MTVVMjc4bG5ReDAwQkxWc2pEak1kc3U3UGZsRjQxek9NczVnVkVoUUp0KzZDTTc4U1hQbTM5ckhoTVdQM2RxVVBmT1FtNnFKaEN0S2Z2SGpKZzZxeWlodE9adHhIeGhGdk1Wa3Y3WFhsVTR5aXAyMnBNRE42clBOZzJxNDhsa0dGV1ZlM3RmeXlFR0RkM0p1MmZwaWJySFVSSE9FZ3BzVFoyZGdxWFh5U1RacVZHdXZ1c04xWm5ZUlZpSXQ1OEVJa0RLREZER0JhZElHR3I2MGd2OFVKeVpVTThvVFBPU3grNitRYkM3ZHJMU054cjRKVlRFNjNmVzVqY3F2N2d3VjZISkk0dEd5QUdBb3kzSm1vUVk5NkZlczdUdVNxdHlwR2FDMThPcm1EZDY4MVJ4U1JyK1A4d2UrQytKMlZLdnd3QmsrbVpkazJPM1BTMk04NkpYY3FzbDJBWHEySFlZOHc4dW1JL3FkOWZIcHRicVI5Qk0zN3VrWXB4NVRIcEMwZDBaaG9MN0J2eW5jUnAvNktoMlV4YlJXU1NacVlHUVdtUGZwL25kckJSSFRlbnZsbWRqdUZzamErY0RWSlprVDhxR1FReW9zNUs0MW1uN1dobllrL28rSVliTjFTbE9ObjJKaWJLZTdWOE5taldBaCt6YlNPRm5LQXNyMVEvUEJmWkxsdUhzanVvL2dWdldLV0M0N05wQUttYS9YS2NsSjQ0U2twbDhuVUJTcXVveTVQMTRjOFpkbmc4Wm1yZVVNRk1xclJXWXJKYlh6VlJISy9qTU01UjdwbWpRYkZCa0c2UDBrK2hqd0JHOUlNZzExNkFmb0p3Skgxdkc3MXBsYWcrekZnZXl0d2tEWW5kd29MeERyZE5KejV5R2hYZ0hwU2o2THF3RUllbVUrNlJkT09iOTh5RHhUZkZJajZ4WUdsZk9aeU83ZlZnU3BDWnVYczFCRUh1bXpqY3ZmcW1wQnBENmRVMUF4eUkzbDdXNVVhQXd0cmFHSWU0V0QwTm5uNk9IYlUwV3Nmcm5pdlZzeEVIUk9wMTJPbSt1OUIra3kzcXg4WVNkbUZFYTlPc3Nkemx3cjlGTTQ4dkM1WjdSRCtqNmVsczJuS1N1UVpWbjNldWNvUDNSV0V3R3piVHc0Z056aVdmRWM5cGZkL3c5aUdsQm1VZWlRSGhONGJSdklQNWx1c2lpTmVveW9ldjhoU1FFSmNHcFpEeFBPOWFyM3lKNXQva0NXeGNLbDl2N2Q4MDA1WnpNR09uT3UvR1o2YTR4d3R3Y1l4WlkvMmRGbkRuVThVSGU3UHJjQ3VGYm84YmZuUWRaQVdEV3BmV3Y4dU1saWpVaEplSkd6OWpwd25FWVJ0a2J5VWJjbTJqaVFOOHVWc3J1bGpKK29zRXdiVEVQTkZ1cXo0Yk1VYXYzdW10QXZSa3JMMG02WDViemdXMng1bUpiYWEzZTBHbHpNNUFMa1kxcm1EM0dFdlNYUllBVXl2YzNiVW0yOU5SSGl5N0VuZCtncDNOYnVNNzBINjFKSEhYeWR1NitzYVFUN0FHVEVWTWpJdGg0M0NiSXJDQThpYWx4eHhkVUdpUkRMZWJmNnM2U3V4Z25ieEw0RlM2cThnZm45WisxTnk5TDd3S0FmTFpMcDJScXFVZEpTSVVlRDhxMzR4QWNNeHREYTZHRlNQOS84VzlXWWJUNnIrcCtSbVVJaU05azVpYUJSRHRVVGdiVjJwejIwakJqYk9jd0lVWVllZzh2TTBRTEw3OTdFU0hxZXdQVUhtL0taR0xJenhLdHNKSXZjM29GWmNWcnRkVyt5WlQ1eEtOd3JnWUMzUnlBU2hyV2tRVFdIbWU5U1AwQlFkRkExdDREdHExVkdVcGVma2dvUzlxSi9ZNm1TbzJvakFvWFhncG9nZUw2K2N3OHJ2cEM3Q2Y2YklNSkl0UTAwUExZVEd5VjExWGRCZDQ0ajlMcTR3SEUyVVB1eUlqb2JMK1NjY1JZZk9DWElZTjVQelQ0UERuZGoxQ2x1SkRGeno2TklXdE95Ry9udHpQUEZnam1CYmZaR0pPQnVEb04vMlM4Ym9hZ3hadHZwWXdwRm5yb011eGJQL0lEdVJBVDNiUmtvY2puVTExWVR2OFAvM3hNL3piazZ6K294Y05EQ2pCdzJ1MEdoTjJ5N2FJSDExa2IxSzBLZU9sVXNCb2tzMHlrK2dTUmxYa2lTTVBrZzlkSlNPNHFzWmtTVnRUTnhCRWxQc09GbW5qRGxXTUJKMUUrSE9jR1JqY0ZWQ3VBQnVjSFV4bFB4aVJsQzR0UjVNZ3h4UndVVFdvNTFySFJxZ2ZmUG85ZGFITTlPU0s5U2ZBbDZLWWYrbVY0QWdQMkxQamJ5OXZWWHFYQ0oreUpkR29VaGJlN1FiM3V6Z3FOcS9jUjRXcE9jb0ZBZGI2VVArUFhmaDhpRUFSY1FIUCthV3VmaktibXRnMGNSR0tUL3dVcEZJUW5NcDNMZDNyNWsyTGQ5Z2UxN2RIb3IyZ1ltRlRTRm4rb0dFYVMwQ0Q4c0pUbWVjZzFNeTltN056WDB6SFpmWkFQV0VYemVVM1kzZzBDeWt0c0lYeXowT1Fua3MxQTFSbmJUUXRTajIzb3BWWkZ2MndvRkR1d21XeExMdmtWWmtXeEpYRFUwWUZUMHBMTGZqR25TMW00a2xxakdMdUpOendpUnpVNGFTajhwcUx3TGtSNDIvdFlHbEk5ZHdVZkplNDI1Z09wVUQ0VW9EaVR3TTFSVmFvMmREV242OVNEZm80VFdlY3NZSk5IMnFNUGYyRmNqNTQ4bkdFd2cyeUxBcXBRd1M2SkE4dXliVjlNMWtRMlVHb3JaVU1FMldEYlY1ckFZUTkzWFJNNDZqTWJCQWhaTG1nR2RFZENibHRNTjFSQ1JTQ2o1YkhuanVudXhTOUVCU0ttd3B0bkd2d1V6TlgxcnBoc1VMVkIyWUZGZ0g4SGQxUVFBdkVBdEFndUZFL201N3R5Tnh3dUZZdGdmck1Yek9RTU5TdTNFaWlJRkUzclNYbGd5VHZjTHFDY2t5WGt0UjZvZGxtdEhrNW5ocjVzVXI1bHU0ZGdFYTVGbk9kcVFPVGt0TlFhUWhUaWRLRHg5M1lndTY5Y0NBRlYwQStMK1dSV1pWVjkxczRhRTd4Z1ZVTGhmY2VPeUsrbWhGajlUbkV5aE5hSHRhaTBNVVd2SEd5dWNlR0tCMVI3M2dOUHpUMXVtVmhQR2pwUmZUR3drUVZXSHpPQ0FiQjk1ekhwT0ZlR1pOWEp4djJjT203eVRZY3dnL1VnaXZnaGduMVNzNlQzZVI3Nlo2a1ZmUTh3bGNqYllHVGErckZTY2FQallGYTJBejdZMXFFb1ErWmRxaURIMVVXZUVuWUlOS0h4K1AzZm9lTU9iRUs2emkxUGJiM1dRRXpsR2Q4eXBlV2lpV3Q4RVRiMkFoc29CSHZvQmc0Wm5zMks5Q0NTZllJR25iTDFTNUU3Q3EzWFE3NXZ4b3Y0SW94T1h1Wk41dzRSOVRqaVh2OEZlT1RzWmltM2pxTmttblZ3TXk4WUVPcHJKS28rdHRrVlRNT3ErUVRFTXpESUpYTzFDQUF0aGYzZlQ1dUtKWk00RmZPZmFMQVBhOXIxNjRZRzAxOU1VKzhwaHZqdVM1di9BQUt0ZWU3QXBoRkZGZHJEMnRoR2U0UlB0TVFTOEVLbzBYTW5QSG9idVVLTnJUbFg3M2tlYmg0Qy9icGRVZDEvSjdERWFDRWFkeEVZdmlacEsrOGJiK2xyQWhVMVFTNWlPYS9LRGlndlR0Z25xUkFwRUVnU29DRWNtbE5aelIvN01VaEI0bnlpeGN0TVVmWVptWGZ0Wit2TXZZR0tiVkFrNUtMZW5nVlRsb0U5RnBieVVia0poa0Uxd25PSzBtVmxWMHM1WkRJbWU0UnBQK1NyOXRVejF5QUhZU2YyQnk1Yk9ZRFZqZ3NrNllmSmRiSU91V3h1SGdsdHk0RkVMZzhnN2Z2Y1VEdUNFdWtlMWJYcUlxYW1JbitGMEFsTzNQUTN2TGc5UFhkQTJpNXJNcjVEdHhLM01RYzNSU25rYkJ3R29iUldjdlovZDJNOEZDWTJydW54SFRmT3ZrY3hHdm9PcTIyUFdySnNYVnRsYUhTcjk2a1Rvczl0NC95N0tGb2U2cVQxTW4zYjdlUWVHRjZGNUxrYjMra0ZTNGlDN2tqUlB4aW5jTnZqZXM1YlQwNGIrdk9ORzBJZVk5UE9kelVGSThpaXZEVWMwblc0TnVVeDdNbGpqOXREN1Z1N1pKanJjY2grYlVuUFlMSVpkTWN1RXJNVnI5ZVdZVTZSS0d2azM4UURxY1RvOHRLWnRqZE1DMDlGNS85QU5jWDBhQy9KZGVCNHVwbVo1eWxvWVdydjZDZG5LY2JHNzJoc3lCS0xXNHVKOWt4WnA4WVZzZWVIR2g5eFppTVE3VzlCdS9hU1pEbHBzaGRGbXZkVks1cVVoUGo1T1Y4MDNKZklTcTdTaUZGZTZrbkxtMUlOTUlnbVhiSnJLZEhmSjc2Wk10a1A0V1BjZ3pOYkFwV1hoT0ppTmRYMm1UMzBIeTh1RTBEWXlDV3F5M2lkQ1hTSkZHV2hRMUNSN0pXdllaeXdiaXh4aWFRVEw2NEQya0VBdFNGTlpMYWZxUkY5WXpmS1R1TlVFMmxMNk9yNGhQTEZwTldPRzJXQk40bGpDYmNDUkZLM2RINmNta1pnajJoY0cwZVlMdXo5L2tlV0xzNjJUb3VrazJOTlJ3blpBNkYzRjR1UDYzWm5yZDdEWEdsZXhHV3F5VnBoQmdoM0Z0b09NemVYdjdPd1ZEeUh6YW1aQmxmQ0tSdGZzeWJyRXJlVE1EcXpzVjFWODVhOW9kNGtEUTlqTU9OaVIvNEdtM3EzdVhOek9lTUsyMGJxTUlqTE9UbWJDYUM4YjdJU05wYWtyV1pFcnkyajZ5QVo4RVNQVWFxYzU3U3pHRFNvZk9KRXBwdklqdm9FMnNCTjhUNGpqNituTTJDd1Yxb1VjS3NhRTBQWHBpVmhTRy8wL1lDQWNMQThYaE5aT3lpQlBPc2NzVk5uWUlNejJwWTYrcmROUm44amEwSEdNZWo5UXM0V3lrcGZxRkFKaGIzbDN3NzZTeGc0d1kydmtXaktQYkozSERqWisxaDlCeFdGTTZIdXNqZDJPYmhteDBQNzFZeVd6R2FBK25WRElKYzEzOFRmMUpUR3FqbVpIK3BFMTcxVmRUSVVaMjJaVlZSc1lHdkEzS0YxeVVhT09pRm1SSDZnSVZTeWdPcUdiV21DYmtlOVJrOUJaMnJud0FKNWRSNzlIU2x4bUVqcG1PaFM2Q2dtQlJoVXNCMXNIQjZDT2JTdjZQeDl0eWtZZ1ZkRTl3aXBINU5HcDEzNjNrOGtqM0o4WEI2NERNV1RRb3l0QXM3VmVidU9Gckw5Y2VvQW81cldNWkhST3Q3ZjJYOUcxdzEyd0dtemFMWEpUSE9lTExKMncwQ1FuQ0htcW5mNmdLVUVVbjkzV0ZRRVk3Vy9teGs4NEVkVWgwcE5IS21uMnZObnlEZm5uQUJuYm5Ib3JQOTRFNmRrMXlCRWJHMW5JdEFwaWt6WkxtZStyaVprYWdjVVExelhvTWZZdVdHbUlLdzlhNFp1K0xQWjJydGRuZWFsNHRjUmJoUjBBTDI2TUczVVlaaWhvYXNscGpCVVF2cWFHakFvMkY5b3RqSnVkMlNleVpBWTRtbzR4WFFrZlFKdlRWd2hBQlV3RVlPMUlWQld1b0VjNVpYem4zV3RkRVBzUVRUQVpTdEF5VW84a1pQZURkeGNpcHJhR01YRCtPYmFjdEhsZ1JKcGdvODhwL2FmMm9PbUtJcEFPTUZmRkxUbnFQczZTYlhRdkFmMnZJMmlMMWUrR2U5WnYraXVUa0xrRkRDZ3FOQXA1ZG9GWkxTMzh0OHVoR0J5MlREY1dSTnJmcCszNHJYTFVZUElTTVUxRkcvdmVXdys0aVY4ZDhkK2lsTlBIU0RDR0l5M2FkTmZyU3N1VXZ1Y08ra3l6V1lhdmpuL2QzbnZlUXFCV0FnQW9ITHlyS0JZUXdrVjlzNnRlWlN0Z0ZLS1FqZEtHUitkbndMSTNhRTZrYk9OMG9URUR1S1ZibXFSNXNVcWdXMzZnQ2VWdXBsMW5LRkIzd2V0VHkwN3NnTytNKytHSTVaclYyYSt6TmRHaUI2alhpckxOWDZsKzlqZFlhdFdkQU8yRnhBLzlTMHBYbngyOVJTWlBoUHdOL2hiYk1KTHFiMEZrc2NYWlEveVFlVlhXZWxGTFBYVGl1TnlFUkRuWDF5R21zajAyK0lRejlJa0Z1b3JyTkVVUitDZ0JmNHFSODlpbnpuODV3c1NhYUVSTlkwUmFnUy9MTHYrNmlWTll1cGh0d2R4UExIanh4U1BlS0dCd3RjMFY3UkVjUENQb2ZvYzM0encyRW1oZlZvNXFQcW5oa2FNTE96UTltc1dLM09GY21Ndm1kZEI5NDVvbkZXeVFKWkp2aDRKZ1ZOL3FOeHBxZGNNbWk5ZlhxaGMxQUkrNTI5c3JxeHFWV3NuVVRacFlMbXRsOTRVU0RHRm5GQ0hEQkk3TVB5QlBHNE1uWWQ5Qm9GTGlsdTlFSG82UDVIZ0NQWlNsTXlDb25meTVZRVd6dnp3LzNJRVV1WTRDZ1RRMUcyM0VteGNHNXNJT21mSllCTURPYVd5S3RDNTFobzBja1FBdjAxaUl1STZMdjhtNWhuRFdwREJnQ200K0pRckdHaWdtWjhFT1ozWDg5a2FmSTZSQ3NTZ05adWtDUi9oSUllZG1ldVh3WVMxR2lDWEpqZTN2a2gyTXFJRjc3ZWg0Rkg5dlFLM0VkY1g2VGNDMnc1dGVuR1E3WWtIWGZxdEplVk1JbHlwK0hLMENVNFJGalNvYkk1K0NpSDVJZklGMTlTVUR0L0hQSm40VjR4UjVpZ2hFb3ZGQkZ2NVNkYTM1SUJCcU9xRmorcjd5cVFxWUhKK3NiUm9Ba1FwSkpDcE1TcHk2eHVURXp0NGViRk9iT055bmlNdURLYmtQZmxXaTBvVlVnM1MycEl5aXVZUk5MenE5UGQ2Y1g4Q2N4TzRMZTNEb3RXQURCdEVYemlkY0hKZDNPRG5KWkRBYzZ2cW5MWXpyUEp2LzMrbkF1SlM0TExNNnNUYU13cG81U0tXTGhGYjFiSzNOOTBUR1VEZmxKS3hGSThSZVprNlUrUFJxRm1PVVZjWGNGK1liU1Vwb0JxaUNsd0R3VzRuaURLNjV1LytXMTBaVkJvR0RaVGVrcnZvWFVsYk1RQzM5OXdtaisxQ0ZSNHFiWE5hNEcwWS9nOTc0WVpZZXVRN2ZsZ3E3Y3JmcVhPajR3RGo3UEF2UWdNakJiRGxhOEsyU3VEUk1xR05LM1dwT2ExV3NBWGlhYWtKV0NWbWM5OXZrM1ROMGxFUWJTVUtNd3ovQmV1QXFLU3Y0STBpdSs1VkpsWDJkRENOVFl6UVFNTU1tV0VtOHJ4bEQ4R2hVaW9GT2plZTBERzI0YS9ocnFKeUVrNkdXSWMyc0JUTGZ5b2xiMkFwUmd2dzc3Y3hoQ2FQSHBLeElvek9lOW0yQUxXZDluRW5xbXpKVENFeUUwTHMveGN6cVhBenArRER3WWZ2V1d1ZUwxL3EzTHU1NWlJWGs2dGgycUhUUm9rQWtPeGZRRXVyL3VRME1tSGMyK0IyeXBVK1dBVlc1eCsxQURyR0U4Uko5c3R0YUdNSHVZVFV3aSt0TmxVVzRUTzZWSzFGc2xnM0Y2ZzdCcEF5NjRVM0tIS2xkYUtMUVphWlNUQTRvc3pyZWRiMHNlS0ZwUGpnVXhJTGo4RmwydDJLZEl1SW5BK25vYmdKYXB3dFRINlF6cUUwMVdvRkpIQ3ZVUVdkT0ZyK1M5MVZOOTRzNHYxc3NtUjBlb29NQkNZWGNSNVBIQWZmbXdFdHNYcUZwQXpuRFVrT1liQW9kYzVYUk5CK0tOdGxZbTl4SW5YdlBpWTlMVHZGNmxUbmJpZEUwN1Uwa2tJcTZBRy9FMmJjKzJtZkliZXE5N0VFSTAvWklMU1lCMnhwSlQwcUxUeGlBd213cTJqbW8xQW9pTnVqRzNCd2FIWjl3SGNVVzN0ZFF5ZkRXNzdFcUU4WVFpMUUrTnR3WHUrNTNNOXArSU4yMy9SVDJJVGZyVG84UFd5Um1uNGtzVTZXWEdoVWwwY296ZlVJSUhSNUtPTmI0NzBxRENOb1k3K2tvcE1kSm1RSTRtSGRTc2xlN0lISkxVVlNRN1JNa2JyVlAzcHJmQ3dhWEV5UUgycWtJVE4xWllUbU4yM1ZGZmNOaUJtRlh3eEpXMWFDTlQ2Wjc2ajFTTmM2U3RrV2dyeWtIMTgrSDN3TFdqUmN1cllFR25SbE5jSzZMV1gvWHJSeVNpYTQxV2JRT1NMKzEyUndCTll4dXRQSkRBalQrOVFOanVhVmRxc2I4NTZ3b2VuMXdlS1JkcDkyR1Q2VkJqK3JZM1VEanpVVldKelhXcFQxaWE5MmFPMDUwQ200OUtPYWlTUWhGUVVjVkdsTWVzQncyYWJyQVM5Z24zWDBzNG5BVzNVTklqT080Y2NKR09lby90WEZvaXZSUGdNbktjdmdyOWFqeFNNaEplNkhWdGpKNXVEWmpmSGw5U2hCQXdaUGk2aU5sbW5NSVlFbEJLdDNmQVZpZnlnYkgybFd0Vy9tYUt2a0hQbUtZMTVFUE5ZejdIUTVRSnh1WnNUT0xnSndiMm05MDI0ZVFkbGJJajBWQWR6dDJ3MzcyUmZNNmgyL0t4ZFAzWlRFNzNXMFh5NWRyRy9YTzhQNWRrQVVhbHhLTk5zbGxmclBiZERCMmozVE9tWW8rYk1NVU5wYnhqMVdFWUY1MXBEUWZQVG5LVXkxU3JrMHJmOHZDV1JsYzdtYncwUkJvV3JJa2Qya0txK0hBVlBSUlhlNllNNTArNUNGbmhZTVFiQ3pxK3pST2NpK050VVVvMXozV0tRRHJGQU9weC82NU5IQ2loRGova2ZCM1hYOGdlK3RHa2Z2VnZVTGtpblBneWRJc0szVW9IL0hQL05HTzl1azkyNzFjVjhEMmN4VnBKZFZsdlZPRDR2a1FHRnpmVmxWQlY3WDRzZCtmUGEvQU8xbG9LTXRXaE9jRXFGNWtaSjlsUHltT1k5WTJmRGV4bHJDZWxWZXVJTFhsVFF2N0pkSGw0WnlaYWV1QmJVUkYvb2ZJMktBNkFiZEFFcEdoVGtlbFQvQmlNUmhrdnkra0RWcXFGWUE4Z00vblJQdmlnSHJjSVR0V3Y1VkRRbllzMFVjT1dRVHBhMUZ2VHlHNWl6aUM5NDlsZm9wU2k4WkpUUlhsQUJxMVZBSWhBenRLNlpnV2dzcGtmeUZwL1dwbGptd210SVU1S2lsOWJWWlZkWTBNK1QyTm5SUFJQZ004bm1hdG1GR0JxdGE4UUNTbmt5V0xDL2hRV1hCd3pIdDVuc1JROEdKNkdBNW9QcW84SGlmSE9XVnJ3VWJHSkRDTFBqRHlicU5ob05vUHpjN3hMa1ZqbENLVWE3QzROcFVoNUFTTDBYcFRSaWRKbzV6eWNUYWE4NWRsYTcvTlVwaDhOcVpnNytvMkdqNEhUVVk5cHl1ajU3QlYxMHNBalRreEZ2Z2JZam1VOXpnU2RjRDBPSS9BMWdsZXk1NndJT3NoS2YxcFlDYkdTRWQrUU11Zm1ESnE3NENtb1ZOZzlhcTV2eGNKNVlKQksyTlF4dU9qc0RRRHByYzZFVTFuaVdJNDBPck93cTViTllIenB0NG5UVVRRNXdPc2NqcGJmVzN2ZHRwYk9TeXlaT2FTWXFYR1BBVEdUU1hRSjFnNG1GSHhDOVZrTkdxUy9paU01Yy9WR1U5RUtxWEdTQmxJbnIzSUdKLytYR2lUMmdqU0RCTnNXdnBPMkdjdXFyVzZJRWRoanpyM2wvVnVET0Z3UmFGUy94VDRIUE1adXBEdFdHM05wYmJwQ1NiZjZvUkhkQXpTNnl6TGlkbWkxa1k0WHAvRjZFMklUc3JreUhibnQrV1N0dmtWb3FYZnR1S3lnN3V6SVNHd253VGtlNDQrNVNsM1RraWwzcmVGaW16Z1plTEY3UWR6VWdoZXoyVERWWTJmYVBERG45TklZZHE4VWFIN0VnMnVvMURyL1dycThkaEJscW5nL2NzYk5JQU93TnJpYnhRWi9FZzFUYWs2Mm9leEVOdDNpMnRjL3JKVG9OQkFsTkR5bWpJakVZK1ptT0JIT0x2VGRCb29tQnpYSWNOS1lNYTBQV0JKODlrMEJ1VGdKdUtaclZqY0s3Z25Ca3pMOUxTZDRNNWRlbWVWNkJtV0tEeGxmeDRQVC9CT2g0clIrbUtKZ09HRVZGVW1aZno5QTdTSTc0SFQxV2NyYnlIUWVhT01iaWFBT1hneUo0UXJKbTJ4MjJ0T3dHcmUzaVNPNytMcnJqL0JkVmVuYTlvNXdvRExueSs3WjFZZ0dURldvYWFTWWJTUWJNRzg3YVpnSnNqRmdEeW9QTnBObldUWVZ3eXByYjlIMmRJRTA5bFozMmpKQnNVUnFDWEJ4SmhXNWtBZGlHTGgxenBhSGs1SUpVSWVEcll2ZlUrMXBtZUxXUlFtc2dwZUNNUysyMHBick10d3ptalVFZG1WcXRFZkpDWjdqajVQOFlGU3VabEw0Q2lxRWtkZlI3ZHRTZUU1YnpyOTM2VnUwUStCbnV4T1QvNVVXRXZWdjdud2NWRURwR2l3R09jVnZ1MW53ekluZlFkUmsyOVI0S1JyNk9ucFo5cGI5dFh6MkpPVE1rMEd5YkFIU1JKYkg1eXlobitYTG53ZGZLbENyREpYdDhVMkhnNW42M0gxZnIvTXJ1UUd2MFZNVkJ5cTNBNUg0RzZ4SlQrOWpQcWlvNVkxZkU1ZkdBSXRDWEoyeURPOXhwby9tT3lrcm83NDZGQ0tFbktIVklhQzBwT2RTaHViSFZQVVFmZFQzUCtkeHBWR3IxT2cwbUxrY09jeTJFaFFGUGNyeEY3QWFSaVpBYWp3a0tQVEtHS2UxTFhBWFpkalpiNjhCVnMwVFQ0Tlp0bzNuZkQ1MWZVWW10OWVSUmdyemhmQmg0SFM2OGZ6enlVcDVhOTNvS0t0ZUdzWm9RakxlWG1rZWxNQ3hVdDJMR0xHcklVZGpidTlVWU9ndnE1Z3FNblo1N0hzNE05Vmo1YjJDTWl1eDB0MFE4ejZvanVhN3pTbmVKM0FxMys5OURmTU4xQS9KTUVsNWdMWnZRQ1VRRm5ZSmhYLzBWWHlZbFcxYmJ3ODNiWmNkYXdQVXdpK1hQN1ZyamVOc2lKQmVKbWlGVnEwYlozbzUrSVcrbDVRdWo4elZWYW9FWjA3RUdMUTcxcllDWHZpakZVMlZRZXZvR0ZKdjJZbnJrN0NGQWZ1N2Q1VS9kc1RXdDJZOVZuTm45OTVyN1ZuS0wvRTB3S0ZWRTdRY3NDeEdXb1ByUjZsZko1YW1CcS95Z3lLSm5uOEQ3RzdtS3BhWWtFNG5BTnorcjBPYWU5RXA4OFRZTmpXcGErU0czZzJXcmtndzFrMkZnOTVCaEYyN3BXNkkwOHVxT0J2WjZENEh2R3MrOENhR3JYM1FLV3FzUG9ucjNobHdRT3h2bWhXN2FvdWNveUdqOVE4M28reXFKTFBxbVVhTnNCRmJYSEhnQUNhRlcvdkFiWXNJajN3QWN6VGxpOUcxUER5azRpQWlWNUNLalJmM2pPZ2NkYTRYaXpwS2pQTWJ2d0xNTHRvSzhXY3VwZFhnc0pPV3YxRmlVc1RvcCtUOTN1emI1b0UwZ2VGN1hPZ21LcEphQ05yYlRQMTdPc0d6VUFZWlZTSVhzbEJnc1h3K0dkR3RkZE1xKzFpeHBaNVVGbmlHMkpXNyttUUpYMzBQaFlmZTJmdkRDOG1KVnI5c1lHYlkraVI4UzU3L1hZOEhFcDdEWVdBblBkd1JwcklRYXFoT0VneUFzSDJJUFArb1RWTzhIRHQwQ0ZjTGl5RXhpc2xGRU85OUw3dWZnVVJ4amVFZXFoWW1vWHB1bDNFYXJkOEpqbEZSWDJFb3pLVnN1S2FzNWVSbzVqL0I5OCtrQ202K1JMdnl0OU9aaUppMEJPaGxCeWdpV2FuZVprdWs2QUtKWGZHdzFZYTYrekxTOUFMaVBML2s0dTlVbk5uU3hGL1pUNGJSQ2toUjg5cCsyRkRrQmVtZ0JWRDdLbHZMVmNKWHFxZEkvMEdWN25ZRnB3VDFYV0FQZHFrYzcyeE1HRmx3dTFTMS9SQXhKdkN3TEhPZnNQaU5EbU5mVitKMW9kQlFQOUNsMHlWV1ltOVVKMmd4cVlkNHozZnpaWEYvOEszN1p4VlovdzdmRzVxYVpqTjVEYjZVUkZZOEUyekxoRVN4TEZuY0F0NGhxMFBGZ0ZyT0JPUEFkbE5GWlRIeDU1dWNNNkhVUHh4YmRQZ1dhYzRHYnBwd3BQcWVJZjhINlFxSnJOYytiWm9TY2VCcVIxUTArVkFjemw5TDlLZkVLTnd1U2REdFhYV2crSGpTQkxOOSt4bDBJU2lxRjNwS3puTk9RRU9jWXJEd3p6SzdUQlJjTTJ2VlVzS0RRMXRnRGp4ZTdaZVhMci9IZHZ5RFBHS3FzSEFEWnIwOHhUdXF5ZHNGTjd3ZGNXMGc3UEQvT1RnenljeWZzOWN0YWFlNzhON2ZBSVNWM0lvNHNGdDk0dmdnWVloaUN6UENqcXVCbVA4ZjQ1eVhieUUxdnc1L3RBWTVGWFdZV2lCY1RmVEpZbk52QWtPYXhna2o0TjFSVXBHcTQrSXVHb0NVRCt3NVhHYjJ5aHlnUHg5djcrZ1NsRmdNKzlUTGFGbEFDUG5PRGtHS3IvT0xBMDhpcC9nQ255bE5DSVYrL3pSUktOTjlpV2kxZk5QY1dQWnlQVmVLQTh4ZTRUWDRGRGVpeDBsV2JkcWV2cStlQVN4NGNWS05MTVhLSEFqYWZwSUlqM1FINWFKQ0VPaUQxNGg1L0VoN2g1U0hUQ3hLNFA1anIyemI5d3FDZVl6T0xqTm81ajlnVGVCV3NPekNXMjN0Uk9BZzc2Y2lCV3BuODZKcXlwSnQzTXhKYUJXdXJvdVgzSFlOQVN5ZHFvdEQrWXlZQWtkbS80b3puMlpxZkVZcm5rbVZ3UFB2b0E2VFpGK2k2d2FWdlgzSU15akZETzF0TzA0U3hBM09ZUU9UQkRpTHhEQnRkY09Ic2dNYXFKR2tYN2NNWGJQdkMyRmJJL2ZYcjZ6Sjhrai9OZmdsQVIzcC9PcGRQWU9UVXJqK1RLSldrWEZlWGJQSlBRWlVFbWg3RXlPYWU2cXdOeVU2c3pjdzRFcFo0dnI5OEt6aSt6WE9nUjN1bzBWU3hqWjR2N0c3ZWtDTGtEZ3VyM0JRUmI2akovUGJyY3l3MUczNFpURlZMRDJjQndYTUozSlBKZmdtK0g2M1gvVmlMSVM4THFIUmRMNmJmSDJoK1dsR3VTVWlsVzhsYldPTERnV0FoS1Y0dGJDNThxZEpVbmd3enJUT3owVU1sT0xMOWxVSUxjTWc3dy9HWHFERmhEc1JwVnNtRFZucExZMXQ0MU9KQmhiMkMyMnFpcEZXQWg3by90STVoeXRadXpUcnhwdVdoUWJhTXFBcFFOZkdrZ0ZLbXUxSldWSkVCY3YySFlRM2toUkdyVitKK0t1SVBBYk9mKzJ3aG5kcDZXMXJzWXZYVWIvZ3FOdi9CVkZLTFlnTHlhdGM5SStCUWlSTlVuWkFWbU5FcmlFb0F6bHMyY2lkbFFtK2k2Y2wrMHpxcXdwZXdXN0ZxYVhQbGZYWG1DRFQva1U3T285cG1wTG9UL2dBN1hmU216WmNrNUZYTWRhNFVRNlRkaEZNdXhLYUFvK1BEVXpEYlJ3NmtMdHZRWXNuY3YvQkYvdk5Xb0lvamFZNVBOUUNTb1pRcUU2UFk1Zy9SSlo5cVJiQnBvWkpJTEJWSmN4dEpKeGRYVzFtdFMwZUNuSlVuL1JmZzZ3MFRWUWpxbjVoQWlNeW1wcTR2SkhrNUxVOStIUm80TnMrc1R2RC9vYVEwN2NWV3VwYUxsMDQ0VnZuaXFSOFg3dUNDaURoQkU4YVRpVlFqSk5uWEtjbmhRc3ZMZjhBV2p5WktyaXBsajhBRERiQWRlemsyV0tFVDVaL0tPZnpId2paT3JvLzhMTUd0ZisxMFp1QUxEK2w0YVE1N1VPcFRBTjFzb0NXUE9BWDI5Kzd1MHVwdFhvWWo0VVI5UjRuYTFpNC9ZbENZeTQyWkRxSlB6a3Z6OVptMFVRc3VvVVppZzB4aUhqVW1WRng3WCtoT25NVUxuYyswSk0ybmJNQmNVbm9uSTM1OUVGV2tjTGdhQXlJRXVTUnN3eWY5YTVMMFMyYWNPalQzSG9wK2hHL0d5aGdZdzlqVWdSN0JQcENDZU5sS05ZV1FHL3JIL01Ic1d1UFRnaURTZ3orallpQi9yQ1BlNjQzVFRlSlN0Y2Q3VyszeG1vVHFscitMMHlFdFVrZk9jUVd0L3hyZWJLWWg0ZXIxZEJjNzhHN2NIRUYvU1dGRzdmTHJBbHhDb0lGekFpLzVuT0lNZlBIeUxMUHF1RWZWVzZERndqVmJ0ano1R1FFYzU4WGZZRVdVNnhpTkFNSHQ2N0FodWVuUnhhV2tGejE1VzhaQmFVTU8zM1ZGSE1JZHJDb0Vjd2ZhZlU0bTh3VVlQRHFaVzlFUmNsZzBRTzVnK0t4dWd4UUxBeGV4V2FSWFp5UXVkRzUvWngyV25TU3lHRjdNYk5uam5rK2lkOWxDZzlDMXZMUHdHNmhZQSt4OXQ1ZzZ0MkIwbmpYaC8xMHZkWDM0Z1Exdlk0NXlCWHRnV084dFFNZ0lEVW1oN2VPRnBBSUx6RjBPUUpZR2ZtYnA4aUNtcjhqK1p4cDlUYzNWNC9xYzRuNk1mZHVuMnVmaEhkNGNjMTcycFIwY3hPRDh0TzE4U1RwdTJqTk5zUFpvYkdrNEc3NkpYMDhXL3lVUC9LNVV1N3VUUUozeXdCK2lxeCsxQ25rWExZZmtNdHN1a0xvY3BXS0MzclkzUTUzNkRDeWkxM0tiWTAwTjZmTlpWekhwZ0VFbWVhQjJiQ3BzR3JuWHdqM1pVZHFUSUJLQkNHVUx4YzkrbmdhelJiWCthVjJCcDZwdDJ0ZHpTV0FnbFJhb0lmZ0t4cjd4UjBRUldsaHZqVk9GRE1YNUxaaE95cVNVTHVYSUhWT0lER3FOcWc4d05CWlVjRWIvSE9xR0I5YW1QNmNJeEFJRGNEZUtqeVhvOTVWbWFDWjdEOHZSaTdRRGJWYmdVbkdIS2RTNE50ME9NOEx4bUs0RWVjS1E5UklraURqUXk1MnhWL2dqNWhWZkJpYWhQa1BRRUsvRGN0S2NBVUdKOVhPMVdSNFdkQjErU1Bya2VtVWEzRUZ0TG5sQUZKTjBYMFhkTUJTSHhUQXdKMXlnYnB2TTRnQnFrVmhYdE9nbEFESDU2eU1tMGZiWmNEZzJyd2l3WmpnNjZ5S2ZDaDl4cWZaeHJSWUxOWnRsUnlxS2tQM2hCRVUwT2F4bmtrck1aVVVHYlJsQTliNXZJcnE5d25GYUt2Vy9XVXFzcUxxWHExZExTN0dKOG8yRkMrMExBZWtCaEtEY1EveW1ka3NvREpKTTB4VEFQVWlIaFhXdUpZYlg3eVFmN2NoVHZhOFc1UU54WFc5eGdreFBrTHFjUS9CamlaUWozRE5DdEo2V1hiN1JkaXI2bWN3SkMvYmFCRjhVZURVU1ZpY3VxbUxUY2hTa1hqMTc1ak02T0wreFNma2paZE9YMGVMSUk0YzdVNGljUUtGSjR4NnUyb3VybmFXL3Zac3F5SFNVWDdwdUx4dVFyd3RHY1lYTUMwemd2NGNQc0pVMk9neDhGRDFxUzY5R1hXcEZHV3FSQ2NCUUsrOWtoL1RKd08xaXZDbG5veFFvUFhzTXlFTDF1czAyTWNhbit3SXFCL2ZLSkZkbVhrWWtKM1A0bnovTitFMkorK1JsejcwNXpZcVdDNXRJWHdtNko1aFVaSUVadi9ZS01uemFSdzlRM29zSDVMa1FpcE53Mkp6WC9kK09EcURUaUE4ZG1WdzdiZmg0ZnVsVWFFSnJyWWFFdTFOTE9nL2sxWXJwb3htUG5VUnRoQ1lOZXJBdzZldnBZM3RoM2ZMQ3puaHUwb1ZEWTZFbTJhb1NsMHVFT2tXSXVoOG83Uk9kellkTFdSaVRtQ3FIZzVveDhLWjJJMWh2ak5pY0kzRCtXaFVPMW9wK2VZeE91OUpOZnIyQnRxOHJEd1pWcFV0amhQcDQrS1ppMkJNV2dlOG5uN0xLRkRvcFZERWlBUUdOUU96YnBVMFhxNHRXaWswSFVhNXRTaXpMQjlqb043ZWZudmdUMU9nTGg2SElieW1rRDVVYUhlMU5MTDk1d1A4NEVlME83R1RFVklFSVY1MldBcktKaUlQNEtKZHgwTE1YZ1Z0UU9ibldNV3dUeGlPYzl4N1RHT1ZTOHRFOGwrbW5OMm9ZVzYzZ1pBdFJRbDd2UjBHUUNEY296Ym8ydVFXU09Gd2R5NFlib2thcDhRMENua2l2Tjkvbjd4emk2OGxFTmVyLzYxVnRSdTU3ZnlOTk5PbWJaTmN3SDFCRlZPWFhKSWxzbzNWcEZhanVvNnJrWnhzSUpDL3p4YnRTWVZrVWdsakQwZ2R3eVRxTlFxUlhFcm5LVWVUTEs0YUNCcGtIK3UySXVEMlRxNmt0S1JRMW1JTDJhNno2ODdIRG9YbXBTaUNEN3lYdDlIMjJEZ3NqWVZvSW5XUEF6R1hZZjlrZTFKVGpSY3BJelRHaTFCT0JTSkNyRS9xVWNEYk5aYUJWSU1HNVNIdWtLYWRYdEMvMk5NeDA3RDZDMzA1d2Q2Zk9vazlCUjhPYmk4OEF0aW4vSVBmMHY4djZkdWI3VklwTnZlLzJJdnR6RFhrS1RMK2YraFZ6NGxXZDRYa2trUFc2RlpNNVhBRE1SeDY2V1pXN1UySk1TclljWmJPeWNmWjJKb0ZnYnhUTGR6YlJtKzd0Vk9RbDIvZUdhemkvNnRDaXNxZDFsUHZBVWhacG8yaHFVcHJtQmhYMWNleUFRZmdpZjZOQTB2akpUbHVyUisrT1RnMTF4aC9odzkvK0NWYThuQnhvL2JoSzMyQXhOdTR6YUtwWHFxTW40NXlyZDJwTDh3UEdBeVl1dEhYWWN3cmJ2c1QrcUJCc0FMVHpVQW5YNHhXajBsMmFUYVFWRnBQR3FYY1dBZUNkVlplL29tT1Y4cnFrRnBCSVRkbTZGaXoveU9DcVBLRDhVOHVGQ21zeWs3VjZORUJ0R3FoQXcycC9nQ1dyWXh5bWFBOUxIaHZxVi9GNWR3RXpwRUQ2Ly9aNndscGl1SU8vcUZRY3ZLck0yYVFEZHdxaDBCbVVGbU9jYnh6ZmhwNVJMdXZlTk1odzh3cjlxb2Y3Wm4vK0Nid21qbkNwWXFPZ3RFSkt3d3pQNDA5ZlJScjREcXlCRlBuWGdSbEh4UDdFYVFpb1RScGVTQWxzQXNXOWRpM3Rld1J0SC9oZ1VuL0tkcnNxMUl2M2pyaWo4OW9yazFqYW5UNmJ0QmU1cCtMR3pUU3hOcklrdFNzajhZT3Y0djQvem5uWGQ2QTZhRGwzZVp4RVN5TENFNmsxVVNSZmdlUkdaWUNtcHJkSUhoeGNMaEUrZXZ1MjNQRXJJYVdpZEp2YVNUNk1SQVJDWC9BdVVlOWxhQTJLeGNCL0FKcXpTN0NCcEZHcnpRN25ZSm0xK1VxVnRDKzc5ZTBFM0VsbGVhS1lUbWdOSU8wa3J3TXhtelZPUUJCbFY0d3kwME9rTmV4Snl2Y3k2ZmplZElPS0xIQ05TZ2FUTFNzTkI3bW1IcVF0OUhJaTREOWZackpyTjhpN01BMjdnSndTeUFLMmk2dUFJODNVOWNMNU15SmljejE5WkREdGpNVFRybDhMK0M2SWNJaWZQNGZXNmN5eC9qY0ZXUzlYVUhXa0J1U1lSZmErRzRMU2JwbHhwRjhjL1ZBbExhK2VhQWRKbExBanNMLzJMTXQ3bU9HZnhzeTdYRGg2UFVKdkpiMGozeGhjN3BtT2ZHdVZwMkdQWVZybzRybVh3Q3ZzTG5La0FudG85NUtpRHc2SU0zZFhsaU9CSUY0NUhldE03a3J0c21Cdlc0VitYQVhuYTRrd2IveTJ4azNqTEl6UllSdGRaV3l4MFk2b2x1RjgwU2V1WFozV3N4TXVNQ0g0SDB6NXVrZWZyQ0NQajc1ZEJWOHNlOXVrN09QNWVSZnI2SXJkVkYyWkFMakZzZE9IRThJV0UzTFk0VE93a3VKblhCeWZxSEdtTlFGOHdwZFg4SFdkK2FpNXAwTlNKSlAyVnF5MTZZTjdGV0RpdjJhMytOZGFRRm9nQndIeXRJdFVRbUpWc3ZNR3Mwc2lKdlNoczdwTVRaSmtTVE1KdWRyK3JXdngwd28weUwwaW9MYWFTOW9Pdm1BR0lBTTEwR2F6QnhUUWpTRkJKendCVkU1K24xSDI4M2FUdzAybDNqKzQrS00xNGRIMU5YZFJPYlRvN1hzc3NFcS9LMDJ2OGQ1NFRKT0NQdDRPRVV5Y3d5Z0haMzdkd1YzclpaZzFrQVliTmZJbkFpSWo3NEY5c0MvcU1Vd2IvRngvbjhaUmFzMzl3a29ZK0tMUmI0SC8wM2ExWndQbGJ1aUltZ3AzVW12SlJ0eEc1d1BZWmlPR2dETW5rbnlqY0VSV3ZrTnJKam9lV0VTSlRZbXEvUkxlQ3FIUWowT0Z2bUR5clpSTFVpVkFsUGZLU1oza1l4ZFJGTW5Hc2FjNjZHaEh3VVNENXpoQnhxNEJvNmNHSDFDeERlTnlJdk0wRDlGalBXMnRrWld3NlhTK2ZKZUdRM0tLS3VPTy91RUJROXlXcDNrbjVMMUdubitHK1JwVzViTGdiRTFyN3cvM0JhemVSWEZnSDZEV0J5OTEwNnAwakZlVFFNalJTZWdGdnY5Y0hiTEp4VGNROW9YWFpFOU8rcUxHNnd2VkpiMXAweURXblJnaTR6Z2ZPSm5IS3pMVDJZb1hMc2dQMDlwMXEyU2lFdVdJcVplcjVncHgzeGdxNEtPVWRlYjBuSVh4NGZzQVd0ZWwvSVovbDRRZVM2SHE3dG1vUkFuUG9nTk1FeHdwSTVSb0tvbzdVMi8xc2RyRFJ3dGNDZ2RHYlZhUWJCSTk1MnB5UnhUMkRnRU44VEJ1VUdNeU9peVFaR1V3eFd5SGh5dHUzY3B2SFVrREQ4b3NKREl5Vm95SEYwQkYxblVWZnd1ZTJDS0FhemdxUmxUbDRMdFh4dmhKbWZQNkFObjE0OTNIc1RtemZ5K1N0K0NlKzQxTUtBTVA3L0gwR2RzVVhidDNXYXRPdGRXNUZKMnZoUWpjTlR0RThpeGlLa1p6Z2MvWnc3STczbUhKTFNKTUhlMzR5Ukpxb1EyaDBZV3RMYkhDcjNTVkIraks3anpxV011eVhLWDllcDE1bi9WbWpaQkQzWTZaWTYyOE5iZmlYSUsra1ZnSnRFc2hJSGJnc3hOU0VteTFDU3h0OXk4dGdsMlJvYmNIaldxYXY4aTYxU0pCZm9XSHpwVHhHZkNVKzMyWEJSNEtZNWhSajFRajBvM3lyZGNkek5OOHNPSHk1OWgvbnl0K0Zjb2pxQWJzK1FQRDRXQ1MzWmJGYTIvVDFKZGs3YnFmVzZpTUtUTFFyeThSQzlId3pvZzRNWXVmVWxXYmxzakw3Q3kweW5hdU04Y3o3MzE3VkhmaGtYMlE0N3U2TUZtNGFMcnVuSHZuRTlNRXN5dE02OWxvY1dCMHppT3BReGhmWWs4Uy9HL1I1ZHlPeE9hR0F5cHkyeGJYK2Q2VHFDM0UvcHUzbjR0Z0lRNTdrSkd0Lyt4MVUzQ2F4b0dOU2hMZGZvQjR3V2xOR2YrRWlGdmgwanRJZEhGRWVzdmwxelV3VkplbUJ4N2pIdVhNSGc1RTE5TGFCY29JQXQwMzVoUGxld1dqb1p0Q2RKUzNzYlkvZ2doN0Uxb3diNG9KcVNtMS80clJvcnNZVStlVER2dWZSTFFjMUlnc1RVWnljOWh2d1dYRVRSNHZTWitIQTZBTElidG9NZjQ3djFVODNBeUhIOUg0TDIzajlNeURWN3dETE9hSmw0MFN3WTg5L3RkZlh1UnNmSWpYUldaT0kzTVN1VXl3R0JBdVhUd3lvV2p6blNQOWs5NTY4cTBWTVBPTjRZQ2pWVTg3eERIajl2MWo1Q0I0UHloTnhwdStXanFMNEVsbW1kTHRZSU9jMlgrM09kVkxzSnIyREYyakp3cmt6RzZ0MWJPSXlwZXZ4azUwaUd0Zjk5Y1k5enBMTjFKci9kRUkyODRUamwyczNCM1JEZHhhM1lvTGRSV2FnSmUrVHArbmM1dTAxU2x5QXV6Q29RN3NWcG1HRkN5MWRlMkI1c05LRUZ6Y1Nsbmw0VGlncWJmcms4THdMQzQ0VzdVTlA5elk4dFRKaEtPaldoV2szanpieEJZTG1WbEtRS0dsbkVRL3NhT3haaXFicVozTEozTmRrZWdMclRvaXNGdTQxYlVjdDJrak1uK1JWL2FqaC9UL2dqNEpzUlFWMlJNREQvRTVDM2xoTDY5dEdMR1l3Rlh1M0VJM0lYdm5FT0RydmU0L2RYZHBPM2VlbzgvMkxoTFRRSEFqTDlET01CYm1OaTZwQVpuSmI2L3VOQllnSDhHeTJVY0VTQVU2ZG1Xamd3TWpkbWRyeWRUN2Y2bTBBeG5WV3ZjbVM4eWhrTEdJSHZQSDlybkhqK1pXbVY4aVM1WGlLYnBWT2V1YjFNd1ZZVk1VQzk0SnZlUXgrWk1UcDJhclZVektnZzhIZ2ViSVZlRTVQS1ZmN1Y4U1NQeHY1cXpqUGkxQXo0OTBjNkFYd1lwRjFnQ0MremhrU0VZSitJd0I1QWJWaTZ5L2k1bnN6OVZDRVBaVGdYZHVFbEdzVyt0Z0NVSTI0am42ZEF3UG1SWnhUNWZnVHZxdUVJWTRpRUZsQzBsbVBhMFlLYmF2RGw4dnJWUTNDelE0QWtEUUlSdnpXWm9uckJmYm1oZEVvc3hqN0t5L0lyektRUGoydVNGbXgzRENqZDdmUmFEaG1GOGJ2RVVpVGJaOHBjR2lQRUYzNXl6ai9CKzZNZ0NwNXZKYVF1cjg2SWgxWEYzYmZETTZLWEEyL0pQdDR3bytSRkF0L0w5KzJIWTRDTWhaREFTTll0dVc4cE1EclduL0RxS2paeWkyZjVpRkRsQ0VXZjN6STRocVJtY2RydDE4ekZtMEZjWVRUdjB3c1J0RlplRm5ZVUQ1MnhkaFpoanZiVmJvc05FU2lWY0h4ek1DSnl0d1NFdTBZdzF0M202eTRtdTNpOGt5OStWbTFqZFVERjQrb3VncGlESXNST1Jsd1plUHdXcEtRVGEwYWJXM2s3dXRVdFk4Q3QwQWFWMnZHd1o0ZkxWV3p4RDk3ZVR2dHU3blVMVUNDc2dkSU45UktzRmJnQTlUY0c3bE9tSzVrNW1TWHNaVExWYVI1WnhpTmpLMGYwT0xETXI5SVYzYzlKUVV2K0IwaFZsYTBkSFI1Ykxab3NMNnpUOTcvQVpLTjhYb292eUFtY2ZQb2k5bG1hTXh6eXE1NTJaeWFmbWIvRkEvTmZVSnVQbXZaUWhYSFRtVVBSM2RaTWd4dVc0NFBOMFZ4SkJheFF0bWJiUkZGRDVsU09oNnlLSk5rOTYvSTNGQnlJYk1rZEI4Qit6VU02RWZoaVF0eEtVdS9qTStIYW9GMHRIS0RSbFVZbnFhR2pqc01IcFBrekpxeEUyYXFtYVdiMTVoZHZNSERkZzMzaEtDcUhZSTNIWkZ2NFNVcy9DZkFyV21OblByQ3pMT2lHZEF2a0UyZk1iZUx0dGQyTlluSXU4K3BPWnhpdHRPL25ycTdnUzFWV2FMWDZzeEszSFhwb285b01YN1V2dDNJRHNnQXRpbys5eEpNVDA0WFg2SlJFVjV5YnpIZS8zcXlxMVM5bWtyZGpodVNaNmxqUHBoUW5DYmszZkFLa0grMkVYd0pYZ1E5ME1qWXdHOGl0aVg3dGVka2JjT2ZGa2E5eUxHU0dzbTIzM2p4aGRHSlE2Q29aaDlBRkQrZzh6QTE1eXc5YkpCdFUvUjRZZ3hlc09YZG1tM0NYR2Z5cjRhYlV4NnJWQWlHU0hJKzBEa1dMODBIcVhsRXNnTVd4RlNaQ3Frdm82R0l5UDQ4NE4vSDJ2OFhFVEoxcHdXZzVKNmtjdGdPTlZYVUdtR1N6SVhGeDkyZW1wN29ncDVRNm1URitaTmFUSndrbml2ZTJSeUVicFZVcTB6cHdNaGF1dTFqbVp1S3dSclE0b0gyOFIxa0hZYzloU1VyMzJNU3NUNGExK21Ca3gzcXBmendjSWM0b3FEektOd2ZaZzd3L2hpQlZ0MzZKci9qaTdndHZ2YVo4SG1DZ3F6andpRzNqNFY1d1FGT1lJVDh6RjkvWmY5VlNzWWl5MDZPQ05nN0dRSDJqZE9hUXpmaFl4b3d2MExNNXVxK015dnBRN09vbFJkd29ESlZ2ZUN5Qm1WalpMa0pNUm9ZYzAxRVNSbTd5VTMwZmNBdUtaQ2l0WjlTOHdvK1Nveis3Q1AvZkV3VzRDdUU3UFZ6RGE0bmwzMDBkRW1zY0t5Nm8wR0xlRytYOExLSkRva0hmMW9OUUNpQVBsdzg4Y3E5WDg3RnJnV3JIYVNGdmxnV2RTWDJyN0tKVTFGNXZ4a25uK1dDK0ZVZ3loUkYyWnp3OVdzMUVNVWU5TkVmUmE4Wm5JZFUxYjl6WWFqU3Y4eWpzWktCTEdEbUJYMkd0Qm5WY1BCUzhiU2tzUzZDWWFTWGRGQmdWOWxxZ28wMHUyQmtIbmFIR3ZKYjhsVzFtRko5NGtRamVLbXdlcVJTdWVIOXp0WjAzMnZkNHBtVURDbFZBcms2aURtaWpyUitacTlITVBHWDdWelRhanVhSW5QUkVNc2ZvREhJb0xOekVCSUMxMjJWRkpPWllWUWlpSTlTN0dHNUJpNHF0NkJrMXcwaS9DOER3R2JlOEZrRWhjTHQ4c2lqU2sxU0hMbzh0d0l1TUZCdVJzV2ZKalA0STh2aitCeHBCRUFMekFDVm9FUkZUWllJRncyZ29qZ2pyOVlTOGlsMk5vNG4rTHJsYXkyUDViYU4zc3EzQjNJU1UrOHhPMGFaVmpzSVJ2Vk5DTDNnN09ySG1xWXAzS3UrQ0hnTkVXNnlWL1ZRbVB0ZzJWenZRRUNYRFlNN3A1SnVnekhrMjZxSFBTQ3FyNm1vWG82L0owa0srUzFMdEVOYmlyaHA5TElaVXdiTWlaV25jbUp1VU1jTURhaEY5SjlDdHdsK09yRTVPU2hpOUovUTdmOUM0dXY3SS9qdURlNU9FTTVMTXVnclAycFdnYUI4bWdidVl4bU1SZGlLUUNESzI3cWNaQU1IczVnTkxkcjZQQU15dnBVdEhqWkdHaGl1cVBMQlJXWTg1MVZ6K01TUDJZdTVaV2J5WGdLVWJhQ1BueVJ6OER6MDRDN1c1cWdjazBjZVVnQWZJQkY1QkYwWTRCUnNiNjh0dVd4bXc0MS93b0NIUFNGTGM0cDdnNlVqRWVTR2NDVDBFVjJjZ09URzhWaTFCdlVOR0tNeHczVE1xVU5tTU11NG5OYnRxeE1IRHJwRGVpZ3NFeU1kNG5CMDFHSkRYc1EvTm1tcHd6SDZiQm1XY2ZZZ2h5U1RxUXlVUWxOWm9Bd2VzcVJCbnM5TTlDYUJONHlCc2lyRlZsVElMTW56UXQxeHVzbUFkRW1jSVVEclVWRFZtUGZabzQ4ODZ1YXBTQUQrLzNBVTZzOEUvSGNlTm82Mk0rcU5BcmEzZ3k4WDZwZjlRU2kxMFQxNXQ2UENSV2hIcEI1Qi94Z0ttOXNmTWd6d3FrTnFqRzl3Rjg4YU1VbUNQaFBTNWw3b0RGdkNPb3BnWjhoNEZvWmgxZTBOV3JRbU90Nk14dDl3K2doWWV4RkJLY2FlNEN0SFhHdW9zYk9kZm5sK0tzZE1FUGxacUpDSXYxYjdqQy9WNjBEUVVzdlBMYXRRUSt0ME1Hak1TdVVaY081dHZSbjJQdGFadG9TNjMvQWZBRitmSnRBdzBtdGp4WHJwV0x6b0RjRkVPS1NVRkRZOEFyR21EQ2NjU0Q4SHUrVDgwclBlMTd6RUFQaWN2TlhxL1N1ODZCZ2RVcHVzcGUrd1RqSnpLOWoydkNLNTFINjRVU1d6bFBCcThsYzlISGRaSVkwa2wwZDhURjFxaWVnZlZRL1B6SjdBQnJZbVgzMGhzRS9kcUQzQmdMMU9FVWEzQk13eFpJTWJSR1hKOEgrckVlS0pYT2J6cTdqTzdUcEFBOGo0UjNOdHJXSDZJT0drUnlMNklZd3F0Y0tSK3p2aFdUY2ltVkx5UGcxRjdUYTZwVmhTR1ZsU2I4bElXaFRnOWdzeVJQSVMybi83ZFhiTjdXV1hGQ1hWUlJMTWVKM1h0cTQ4V2U3NlVoSGNLbVpZRXhqSkZnRDNxRE1uK3NpOEt4UUxLY2tvcjhseUlEQUpSNDJPWDZmR3VsQ2wxK0Uya3lFM1lKd3owQnVwRzFJV1pGaGxIVE91VWZadzRFTWNCeEgrWE1TMUZIdjRib0VEU2pvV3IzTGNtRlJHd0FTMW02T1VUQlJucWVpYTcwM1AyTjRuSk9rb0lwbEcwWEhzSTNGTk5oZWh2c2REU21ZM3YrMENjTDlWRWtqV2kwOFY5ZUkzYTJxb0R0b2pPbkI3UHJ4aHR0UmIxRTVmMmIvSWhBZ29ybVlaOUdkKzNlNGtja3J5YnR0NTNzM2xRSjdKcVNWOUFnblZRMjlDRUdFaEh4VEppeEhOcFU0UmNvRDBxUW95cFRGNXlPM1dtSWFUcGlqbGxvNS9zbXM1OWdTTU5mZ0xDNitVWFdibEhDVjhPR3FJcUQweXRvN3ZONEhiMXRnMENIOUlZZDk5OGZxNUdxRXkyc0l6NWxZT2VjTlRJNmJSWDVBTHZLWHliUkRZNFBUN1ZET3p0K2tEMlIza1JCYjhEampPZzlISitlNDhXRXRJYktKb1EvZlA2Y2sxZmY1aGl0M0k1b0dMczZLNFhtTzJNeUVZYVNCMkdsdnRhWU9NdzBBdGlSOXEwcm5uZE85RWJKdnhCcnV2T3Z6OHpBNmZlc0hiVzk3UkJ1OU53TWh4WlpuUEhaR0NCalU0bjFwNWNxcW04SzJ0a1ZHWkFHU0phTHBtTGtINWtJV1hkZWZOL1U3WG44OWdKZnRRZnhPRUs3SllwamQvRkVuMnlCSnlqSi8rMnQxVE1ENmZVeFo2a3o3SUtkbVdmbE5OL3l4MEZHRTk2M2lOZTFPQVEwaTRHL20zUEttd1dQNnMyQkkvR1lJdTZVSTU5bjJyeS9wSHRORmNkd0o1VmNOb2V5SmlxemVxU1doaFZrVDdLTUFITjRTR2RaZzIyNlpuYWtsUWxHUE1NbkxoZGJMU1E3WTIzTTh6ZnhVNEZySDNJdnZhdTFaTFRhdEo1TmVWT3I2cU84ZHNNRzd0OHA4MzJiU0dqSUpEaEdKWjc4OUIzbjdzQWdrc2E2b1ZxTFQ3OHdTMjBCQm85TmRqT2hSRzF4SWpGa0svOXNRMU9NVkJFNkN5aDExeUlXMGdTY2pOOTcxZUhEU1RTRDlWN25nYzNjVTB1T3U0bEpQUDBtQXZoNi93N2tZSTZ3WHFLZjhITUs0Mjk5OS9OWjN2Y3BFV2FTeGhicHdYQlBKOExMWm53RWI3eGM5TXZKME5RK0lKcnhJMHhpNVdXN21KdUZLRC8zeHlBb2Q1Rmg2VUpIZ09NdFJzNmZhNzdXNkZ6Q29GQjdmNUZlZ2UzZHhQS2RUMEIvZ2lxS2cwMmU2QzBTTkRJdkpybnNOTmZVOUR5OWp1ZzBIOUFlSWx1ekdvY0R4cVRENlQxT2tPL3dyaXltTS9oemFKeGpuaTNlUUViRjlhczZYVGtKdkRGL0prRnFwQzlIeG54WnBDWGNHODJsYkpsZ01kYXY0R3NiRDRQd3RkUVhiL1h5d283bHBqTUZJVFh5NUpvU3djZFJRalR5VVJ5Mys3czJkS3B2WFFZQnZwbUQ5VGgvazM1elFUakQ1ZmNnU1V3Smc2MzdDNzBQbE5weTh6WUdwc2c4WXNNdmNJNXA5L05RcUFlZWxYMi9lL1pERWlZQ0psVVNqTjQ4WXdoRkpQWmhoWVp4RGJOMndRTHBJU2t3OTZDVWh2eWQ3WmVRV3RITXJaRVhrZVlzRFJPc1k5QWxQNUlKR3drNE80ekVoVWYwVElDYWdtQnNSdHBrN1JZcjBJZ0h5bHRPejk3KzZtdmZkQnBsRHY1NmtVdmtiMlB0SVRLVS9yeDRZalRHaWJwek1nMloxaFNKZWdYcmpMZ3BJWit5bVhLNFFVMGdKVWs3bDBvVXU4NWdUeFBrVjVjdVlodms5amR6dHQ2QXhvejBRcFhvQzNMdDVkaEhHSE16WWlUM1E5OGRYWWdxaVlHYlBDQVMwQVB6K1JDdWlTTU5FVW5VLzhrOHJUZnA4TnJ0R2dENUtSdkduOVo3TVV0V0JjeUlPQVBEWW1WeklOemdlSlVuMTNoQjFFMTR0dk9FeS83R1loaVcycGEzVTZDTzdXVXA4RGk1azY4bnJrcVQ0TVBGWjFDMjIrYk41VTBxVldIY2gxVndWZlZ1akVvN3pURFFTNEVtYmpHT2FBRjF5Q29xLzhlYktZWEhNL2Fyb25YSWlncHhqYUE0TFFKUE1DVzJKN05VemNCQmhUTEF5ZUNjejMyb1k5TXQyVHlVYjBoNkpFQXd0VlZ4MUVWTGpqNDdITU5UWlVobGVvcXZMTk5rK2Yxb3JFL0p0TnE4YlFETnNPZDJiZGhVRldtbXJGcjkvaE92eWhudDFPcWpnYTdVeGFYSUszUHJwS3gyNDhBekYxZXh6blZtd0hqTnVqd3BQZ29oalVIOEhKaldFTndLTk9jVXFKOUZ0VjdzN2xkWm54TUZqQmVSZDAvVG5mQ1BSdGtHOFc0U0xOREdETlRCYUkzQ29KZDdKZjFyZXpEYzlmM0pBRkVnMjk5cHBMWitaTWZiK3N2TlI3WnJPUTR5eVIrQ25ySkpvcTVmQkxJc29aVjZtRDFRY09hVWc5cnRRL1lqUnZnN3ZBdklsOEJFMVBEQllZeHhLK0J1bVhiNXdsQmJOMWg4Q3ozOEZxcXMvSzd0MFp0U2dkZFZxVW9KZmt2RG8ySzU1c0xNTzkwYXBqZ0p4KzEvSjM4dGlhTFAyN3BvNXg0amJnVW9mU2svOUFrdVNNaXoyekVIRSswMWJFTHc1RHFteTJOVWQ0R3Mrb1Fqa0ZCNG1JZ3RONVZCRGw2dEV4KzRzNU0wMWdDeFk0MVpsRVNyakYwdjlPMUhuM0VteXc3ZEM1eVprQmNoK0I5Ynp0WDRqWGVDSFljbFZsSEhkb0luSTRKbXNXRnM0S2g0dzhUUkFlTG8rY0J2TkZKelZEMi9zN0VHWkMxaEthblpVN2xnMXNFZ1pVcEo0L01Ba2lSeTI5eGVpUUkzdnpCb3FQR3hrVEpqZzcxbDVOL3JTQnQvZWMwTWRuV240dVE1VnpXRndhUVU1RWhJaHR1Y3V0SDAyZVJoNFJEQXpZVkxhUDFMbWViOWNnLzIzU0RLMWZ6Wlhqa0wvY2VkV1dtL1l6TlBNd3pwc01hSzVtQk01Q1FVanJaelJYdStWTU45anBuTU9ISzFRQ3NsRE5mejNGWHhJalRlSE9BZDB1dkVnQzdZb2oySlo1b1BFaHZNSmZuWXgyMWVIWWRaTVZQUU1nK0RHSXpZR3dSZStTbTN1bGJVS2JLakF0MFM5WGg4SHJGSTUxWWZ6Rno0WUNCamRjY1ExS2hOaDFGMG1DZHdXL1ZlSmxZQVRTUkZKS0pKQXN4L2RkVmo3VjU5OXhCQ1lmdUZRcEtLdzdmVmFUWmZVeE5VV3k1ZUZXMkN4bFl2SmNUNTNlTk0zY1hOdGZBbUR6MmZ5cEc2SHAvWmVSYjNJNTNNOEtWUndhdUYrUlhid05YNFllSS82bWxmNEFHT01QUDZJZmhxSUk1WFEwaXhlU001MWt1NlJEK1ZZRU95S1JWemN4dkR3Z0xMRDhBbWpYV2JSenVzRVlDYlJWOVRsYVd0YVk0T2IvU05LSGREVjYzSEs5cXJxekFPaEdkY3JOTkZGci9XbWdRWTBwVUlVd050UUNsL3FMWk9vZmpMdWNVSEJxSzNYRmgwcG9QMHZkN05OdGtqdTVZSU9TZWtVc2hJVGNiZ2w0TEkydys1ZHlSTXhtS1lqVXR0SzNicDZZZ29PeHJrNjFnVXE4MFRUK3BkRFhFWjgrWEZZb3pPMjFVbVRadzNIdmZmQ2VXZjRzWk5SL0t4NUx1aUZHQTdiY2xJUXVWcFpYOVVEbTFXazdSVFJUVXdLa1lhYVYyY3pleGxxcStkVDh1S3FnSjhoeTFwbURMSDRiZzE1dVdhQWpVcXJJNGNHL1NERkgzUHdKeEozUlJweVhqODJPcVM3VlRHaTIvSkgvVW5rU1hOM09GR2lMTVk4aWJxOVJ0bHUxYThxRW5nZHZEbGRCU0EvUUJibk84RkY2a3YwQzNUM2tVMEFsM3ZqNW5hZjFtOURTT2F3eUZDM1JLTG1KZUI1VUo0QzhzV2VOdmdlQmo2dWN2MmtXL0Z6RG9MbEVSUVlIQVREdHJScndTSzdSbzA0SUoyWlg4S0Z0bjUxUzlrN3pZbW5SZWVrekFFK3l0N1c0VCt6MFlEMDgxWE45Z3J5VXZDNzhjQnBJZ3pDSFFadjA5Mm9iRTRMSEFxdVdQMmx4bENycDJ0NXpjTll5dWVjOEdGUEJhRjV1elk2c29IVnQ5RFNIYXl3S1NGTS9uL0c0TGo4UUlHNExTY3p1aFJDRUR1akRuVVpqWW1yMVNCSURkMzU2RWFabG5YaFZ5cE1SZDBZWUNaWTc1TW1wVzBIdmZtYUs4eERWUytscVhvSkhwa0hicy9TWXhQdFh3TWV6SWJodzhyOGIyd3JBUXpjd3h0eWl2UkhzVzVVOWx5SGJkSVBsOUEyWlZuLzE3OVV3V3FLYlRSbFRYT2laSlZLYTQ0bUVidERYa05Idm1XdnE2bndnU1FCTTBpeDhuQVkxMUoycVJYKzduSFlkK1pNN3l2VktVditBOWI0czNpaGcvTFhWZXd4alNDM3owb0dmY2tkVDRyZ0Q0Nm1QbTk1dXdRWkdmREMwV0JyUjVmYzJQbmxkTzFNQmdEOTBSQmhUdHFBUDg4dGViT0Raa1g5NzVxa21OeUR5TVY3NE5yeU1RT29OVW92SFdWd0lDZk1takR4Z0RrZGtDMUxMUjlBWUxNeGZQMXVRUC84QzNUbEx1RnZ2emNYMDhETzBmRVJIaVdNUkJ6TUZvdW45UHVzNXlQTU9DVkRSRVJsS2ljOHZKWnFpb3JyaXcweGx4RTEySm9XeUJHU2dyZWtId1J6UE5STVVlVTRaaCsxWXA4b2lQTjRGbnRmeWhhN3FLU0xnK08wTGh1eXNOV01zZnErcmlvZjFvNHl1REpXZ3J0L2JZYTduTnVjaGQ2dnppcktReS9oVGZ3eCsyaDY4U0Q1VDd0R2htS1I0QUVFRVV6Z3dxeUJGYXY4dHNTTGQ2WlZTTXR5V0wzRm5wSGEvMElsdzRFWXd2ekFZVmJHenJkQ2pqTHdaY3p1Yzk4K1ZjT1NqaGd6YnB4UDBQTUp4TUIyV0xnUjRWWTl4UmRVblpaVEV5bVpsWit3WjVvdHNMZHBmRVMrWlBYSzRiKzQ0dkxIVk9NK28wNWFzZHVZd2RGR1JYdy9RandsT2dYc1d6b1U0b3RyZ0dBVk9ZVkRrSGZ0bEsra1FheEJwd2swVXU5UUpEdWZkWml2RHphcFBUS2IrcnJsc056WTNJZjhBT3hYRWovUTJiQitMUXRUL0c2OURLV3ZjVndlN1JtVWZOZFRPUGg2M3h0dmZ3SzVoUXg0WVgvUDhQc3Q1RzVab0pqQnZlazFwRzE0a2JsR3hUY0Nzb2xBWExPbVp3aTNjd25YM0R3alFGV1B4cEphdGRETFU0bFBCNnRlN1pCTmZFOWtXUktSaHJKSFZCdWNtaDArTmdWRDZHdzlveG9jOExNV1RIY3ZSTXJPNXRyVEtGb0VFa2gzZzNkOCt1M25tTHplSmlpVWFMMG1nSjFlSkZCMGJ1aHJKZDJnTGNwV3dDM2FVQU54ZFp4SW1LdWNMNTV1K2ZWai9IUjBud3ZIbnd1ckljMEdJVEFjcG42N1hXak1xK0k0bDlEbllHOUdzTlpsdlcyaWZnVFRZNHFpN0dGYjdQdyt1akNnRnE0Tmg3YzNuQlI4V2cyeXdPVDJTeWZvYkQyR2dhRnI2VFZBS3QrWkRncjdlT1dHVFhtT2NJa29xZGs2cjE2T0tLWXJUSHUyM1g1SE0zY04rRFBESjVlSFJlRmQ0ZVJDVm1mZHBvdlpaTUNJL25uWS85VWpoUnV0T1VZTWtJRFBmMFZpc1lnd3Q4cnpRa1dGd2wzZTV3UnJoL3gwMExCT1F0MWV0QjlPR01PKzJmZXdLRDA4WGpYMkc0ck4rWWg0aWhpU2txZ0dYQ3A0S0UvUVd1MlZxSWs5MklMY05veUcxRGNFSlFjZ2RRVVMzc3VsR2s1RG5DTXBObkM2Snl6QUtrRUY3ZHZCanVGTGdWM1F1dE9jOGptTzZIcVNsditpWDdTLzNQMEZLc1NaU09lRGx0TVhXUWRneW91elZ1cSt2cUxUOFBOK2RqZ2JBVzl1ZXRCTnBYVll3ajByTzVoREFveEIxdW1abkdEMkVwcjloY2p5YVpodVVuMWVYaTZDZHY2Z1JnazFFRzJFdENnV094T3VoN2UrQ3R2VlUybVp5T1FPQm1uNjhmMmo4WklSTlRyNGY0OGxJNFpxUkp5Y2VIbXl6amp4TmphV2FPWGFQZVAxZ1dqVzRvRUpZcnJESFV3SGFMWkU1NVNnV3VsKzZ5cU40Y2NKV2ZoOXVsT25Nb3Y3UHU0UmwxL01KUUF3OTBWcnp4cWRTdjl4ZW0wUUZ0Z0dzNVBRSDFCRmNIMEVSZ1dzN25HVVVLQlZXYkx5OG94cUtIY21DUm9WcDlYcUl5U2prV1VrM3hTUnkwS3JOZ0s1dDZsR1U2RGFvRUM5WFRjcDZnQ1ljd1RJcVZ4Y0E3aTRzQXRocGMxYkkvejBlWEVVc1B2TCsvUVI5cVhmRG5EOFdINTl0b09FTmJoSGl2TUI2b1J1VFI2eEcySEFiSUQwOXFkV0xRUmRCUi80a01UUXFlejArN3hSenVLaWpGZ3pBZHg2dUhDdGNKQmM1ZlRBZXdaU3pEZDl1YmU5RURkRWR5QitGMm5kUnJBaC9nVVVxdjlrNWhtSzZpWFp2dzZQb3V1NnFpM3RqdHR0NkRzZS9hazdjb2M5bFlWM1R3dkVsNGxCcFhSSERxN1pKWkZpa0tBcDFxWGV2L09QVkVxL2sremlLZVR3TGgvQWdDYzFhR3NsQ1B6eVc0SWs1aEJodXNjejN5ZUNPS2dsRTNrZnB3NkhEQmlLbnY1anhoTmd3cngrR3lYM1ZrQ00yUTZVeU1FUldJUW92d2F6OW80dktOWG5TV2lRREdEaVVGVHFseUpRUUdURzdLU1N5b01wRytQekpHZWFDN1hqSnh5QjZVZ1MvcThRSTYvSjdVa0FzU1RzenhXeURGbzV5OVVoN0xzTDh2VnJNSFpESXBVdFRrUVkyRmZEQ3Z1eXNGZWs4ZS9zdFlhLysxUTdEazAwenVqNlBQU0M2aGxJM2J0QWpqUnhFbFFuQVkwMU9RMWNJV2ROR2RpQU9QMUVRdDJBYWthcmtLbHdNSnlBUW5CelNGaFp6eGpxemxhY2sxRnpiZ2VOcDUvakxsU0JYZDBJZFg4M0NsbG5XWndRcThuYnVncldQVUJBLzVLclF2L21RalcycFlSdkN6ZWtKb0FTbk1IWUlFUGdBUGpVVFQ1NlBkMlFZdUttOWRsVDlEVUN4TStQWWc0anh6dXVpK2FWWmRwVjhiSnp4cmx3cmtLOVBQWklwL0k0eHcwTkZleWpMTHpYR2dOVjZsQjBPcWZhSHNUWENDOFp6Qi84ZzBhQTZURnRBS2JTZ0RiUnJ1cWd2Yy9aVUdkbjdjMVQ5RG85cGpWc3RvQllIeFpqQXVzYUxvWU1wY3UwRXdyN0x3N0FURlZPd2wxRVVrQ2lydEVBYXRXRC9hNHJvRXdnM29MM0xrWFI5akZ1bFc4czBlcW1tNUR0QnkwQmpFZHk3UnU3bE9PbDJqWjA1cWNzWFJyYVp0OVBKSnZkRjhHYjZPM3dOV2F4Snh1b3dqNkM5M1ZYYkNKcWlNTUswbUUrQWJOTVZhS29iNjlBNi9VRERDMWNZYzhHaWNYUDQ1aVh6dW10Y3lhSVpHbFJEY2ZLVE5yYzJpeExQazB2Y0daSlFZL1FYR2xYTnFIeGZudWRqY1hUczByWlZtQjMzeUtnalhreDZ5aFhpVzBzVm4xUHZlbU9KRnk4WXI1c0cyNXRybXZldWxWOXlQcGdicXNwZi8zTGxVeXIrY05taWJjaG5rVXR1WXgrNHE5OHpzellrVjdHelFWZllqVVFOcW94TlZCbHJyTExab0syU3RpbTFBdkovREpXNEUrOVIwUllEMnplS3hVWlY5MHFQOTVWcHlacTN2eldiQjBlRFQyZUpheTlmSi9OamxXcWtJdUZRK004RStxYVhEek9JVnY1QXhuWnRyR1ZERHZubXVFUFRUMFphZjZ2Zy93ajN4R1hQUVVkNjM0UkgxV2VZU21senRnZVN2VHNzcjRSWVZIdkgxMjBWQWxaQ1U0L0h6bDRyVkpGaU14RGxlYUhJWnRISUNwUXhXQWJqZzVqdUFNejVYVmlkWm5DZG9VM2dYM3Fxb0Y3Vkd1cjJnWmk3UDFjaWFZZlJKaktBcERTM2xFQVF5WWtQUkNvMU01aCtUMDVNYWt6UjhQTHM2MTY2dUJCWVNoWlEwaFpmV3RFZ2xHak1KTkU0U3BnejluZ0hjcVd6d3lIMEtPN3I0WEJKSE9RVGUydExFdWEydFJYY0hTMXBHdWRsVjYrQ1FIVGNJVDZ4dkp0dWNPRlJ3U3BGYkcwbWE1K1dKNXEvVzdHbnFvUWhGR0tMaXRteDhYaWtxd2luVmd3Skp6U3dBNnkyUk95SVFRV1dVU1l5bmJSdW5JUVZ4RlBJTTFHWWprUzRPTkVka0MrVHpWT3dZT05lSHpHSkFtOGMwK2tFZ3MvaXBvM3BXcTVyVzljMEV1amtWR1RpWVI3ZDhEWktnNjJZU3hjL0wrRWF1cDVKWFJuN2J6ZDMxSXA4WmpzcTZMNzlYa0lMQ1U4aUI0NkV3NzhPekQ2UzJ0TitiRUV4RlF5UE42K2FoTWFFenFJd1IyUDZtbzdZYlVnbWk4M25jUmMxbjNQQXNVYkE3Z0g5U3ZPVG9LaHJWUDhob2FRa0I4NFZTN3N1azRSNm9ETHpXSFdVc0JXY0hvR3BhVUdTRmpucGdrbkxEd0hFcDRQcjBLemZtK3lRVEMwMllLRkxnaWVmVjdRM2lwMHRja0xJRHhDVUZoVGUwY2FiU3h3cXlWMHBHZWdNQStDSGpoQis0M2hUeDh4dElEUVNEeGdiTmJYMVFnd0xZclVtNDhRdFkvM29LV1Z1d0dsMDRqVDV5bDFiRVlzWFRvZ0FaZWtjRGJPYkpQb28zbEFNOUhtWXdSaVRCbXpsVzFxcjVNSy9lM3h0WVQ0ZHQ2Y3BFbDFxR0lBR3QrVVVsek1lczVqcDVnV1lzMkdYZW5HZnJQaE1ub2V5OFRDeTM4alYvWGFqWWc4SytER0tXUFJMbjZYRmt0d2VicG45NkxheXpvU09yODNLdGpiL0lWQmtRQTRYMk84c016S2VJcFRLNkNuajhiU1ROMUIyZWY1cC93M3ZYVjliaG4vOFN1RVMwWUwvRDdqT1dxUXVSRk9hakVFc01rUWNnWnFFVGtDd3FPME1OMFBjT2I1Q2hsd1c2Sm5KMGU0cEpzTzFLM0NsSUk1VC9ramlPeUQrdkRqUEFjR1NCckZPbk1Ob2tmNWMyaHVPZmozRlBkbXJVS0Mybnd1NmFrN2dCL1pnRE9zekhKeWRBa3NiSGkrVWVadFd1NFFVU09qVmRhL0Q4UG1vNVBwdkxiUnJIdTN2U2R6cVUwcGRsZ2NYcGtVQzM5WGUzQlhlMlovMUo0R1ZtbDFUaGtIUUlmVTZqYjF4RlF1RzIxZHpDUWQvQ3p5Uk9na3dWbVlKdE9ZWWk3Q2xMUFZNTmpjcUsvOFZISFZ4MGNZa0dQaTdlMmwxeE03L0dpSlJWeHM4WlU3enNNZkpwajFpNUwwZXgyeEZzRHNUNU96UmRWNU9MNkdmaVdlSzg5WWswMjl1M05XQWxPNWQyT2d2eWZNa1prenRLV0txMUZ2QTY3M3BNa2V0eXMwYjQyb3FYazJhdUYyWE9Va0NmV01Sb0N5YVF4NmJuMmdKOWo1RFBabzNnME1sTzVtYTV3RTZBVnZrekF6U1RQUmlMTTdnTTYzVVVYYkt0T3VoZEZmWVJDbWYxVnFKZUY5WHhYTkJPSUlwOVdaMUdmT0pmbyttZ3A0MTNFVi8rM3BJajVGSUErOS9PRFB2MkxtUTRvSkxvakYwOHFNVGh5cjk3SUQvU1B4S2FMa1AvSXl0eEYxVlNFYkhUOUV1RmxKZ0paVzRIMEZvY1ZtTHdmd2JkN2Q1YW95K0Z2bU5kUklkSUs0aU1Dbjh1U1lFNEVMSitNekRFc05VMzI3eFFuL3BCdjQ5bXk2ZytuWVY1aGg3VkxwVGprWUxXTks2My9seHdNWW1Xc1AxQmVGMno0d0lMM3RIQ3hmTkl4MHJCeVdFTFMxOXhRMkl6V25mTE1POXFSZ1l2b1g4b0NoaUVCME5IeC9xMjFCZGFvbFFMc0o1YjRWemNoV1BHeU5sTFErQzlkdUl4Y2NFQm1yR2kwSEJHNStrNEVOanZ6aS9ja0tCaXp5NGNCdFJpV2p3elBmTnBtamZ3SlNDd1E0c1BJNy9PSjFGTitEY3ovZStteUlZeWx5VVp3SDJvQys0VEdxVk5tMzUzYWpBWjRDcGxCUzN6aHJtdStyWjFlU0g4SUszUXlqWmNZS3BoOC9GVzd1eEYxZjg4YXhmS1pvUUZFTzI5RWxRNmx0TnlrNnVYWlgraTVwbEx6MVdoZXhZdCtIWkhzRnVNclFXWUJBNkxlaldramVGMHJWdFRQRHN6VTcvRnVBRDFEVGNxUkNSTHladDVwbWZKTDFLVlJwUzYvYzZsQnp6eGFSSU9iMDVhSlpvU0JqSVZ1N0U0REQ2UlpyZWtDcGpFZkl4YlNuVUVHMFdKdWZEV3duajNhUUhCMzNvaTFoMkZHZ2Q3Sjkvb3dwR2l3RXhGTVRsTmJLdHFpNHlnazRqMzQvUmEyVitlZHUyL1pKUmVWSWpuWHpRMXdSUEFKYWxTTmN1UFRZRkhqZ3lYdjhMK21naTVnRXJXcFRIV0hScSs0b2dwSm82K2NENjJKSjQwSmkvNnlURERpTUlpd3dmUTFzMHlvTlRlbklIYVRob3dqazBrbThLQW1mVnB4T01iMXdDdHhCTmRjU3J4dnNhWjRJSG96WWxLUEs4Tit1Nm5KeXYwNFpTY3RSRUF1bGYvS1JZUFFNZVowRDFGamZmUjhUTzNHVkhtMnd5WlBEdFNvOHlaL1ZKZU1JeVRrNlludXE2Zm9sRmpHLzZ0cXl0c1FWTU9kY0pFR0tpTVhTNjZacFhDR2xTdnM1aTl6eG9zSGZib1BNNngwbzlwcTlDdlh0VkV2UHlrUUc0S2REWHdJd3dxTEtFdCttbC96aWZTSlhwN1g4Y0YydGVWVGN4T3VmSFg1eFpNMXpJcm5ZVWtzRm44cXR4b1Ywa2lmZEdINEIwNEVGaEtyQ1RmejgveVo2TnZKZkVDd0V5UHJpb3lQbnZ3L0w0VHRCK3ZXckhlaUdnNGZSYkJSaFk5UDh3Nzl4V0pqdEZWUHVFZWI5OG44bWg0STR6d2JIS25pNU9TbmVxaFRrOVk4TFYwbEVKWHBhbXczVGplb0NFRDYyTFZtdEFkTFpWMlBjT2tZS0VReG12RHZ1RGVuWDBKbW5nV3p1S0t3M1RKS1ZsNmFpbU5WL2xjbjR1d2dla2xzdnE4NXRFUmJzc0NMRFIvajFLRXZNdlZkUXNDTGJaemRzOXhFY0tLLzlEdlNnTWpMYkF3U3RVM1dlazVpY3R6SThoNFpXWDJRS1FlWElRWHN4QVdsUVBUVE1BdEVJN1MrTTBoREEyMWdZWHp2VUY5Zk9pbG5lL0QxQnRJenVqemEwUUl6TS9IaGVZYXZDTnFHaGtNa3NmYXVPZXZnRlk1WVo1WHA2bjIwVDl5N1NaYklKMk9Hbnd2ZzhwNTBmTElCR2t5ZnpVbG9MdFNEdUpZbGVtcEkrYTEvZThSeklobWI5Y05udzNIREVYaHlEbXpDRDh5VlQ5Rk9CRUtrY2V5MjdPelFab0hFakRRUDZrajdpakxRQjhZMFp4Nmk3N2YrbkE3WWNKcnBUNWZzTVhvWXphRjVZeE0zZ1c0cmRGV21VaEU4bTF5dXZSYStJaE5SS3lYZUQ1b3BwUkRBNE5IWnZOc2ZCMG9yV1pLbjd3a2tvTnI0Z3JPUWZoK3RQd21YMFRBaVJGY0tWNUl5QnFnZm1JZm05N29FSW9KREpyOXRBRndKSCtVWlJuL2s5L1Q4cloxYmdwUGtWU3NxOWtmK2g5aEpINFVlMENGeEFiWTRPZU9NV3RrVjVRaEJpTnNscnZPYWxZTit5WWxzbGx2U3pUc3VEOXpvRUhwczA0UjBJdm9XVjVqYndlQ3pETjdjbGJFdkVKK1JzR2pxOGQ5TDlWY3dUdzVmS2NIVEJnekhjak4xWjFvclAyRUlZTHdHTGIvWkJjQW1kZ25tVnVnQW5Sa0tWWS9VRlhKZ2dzZG1YSUozV2NON05ld1YzMmh5TFczS21KeWJOZTF5WkNSWXhSS2FXb2dVWElJVHhpeFhGU3hEQXE3Q3N0b2RweEJCYnlVRUVYSTBYVTRVRGx3ZzIxekcrUnlybWFuczVJWXRIN2JpNXNIQnlDYXZIT3d5YiszTUZSazFSUGplT0VYQjAwUUUvREtpcWxoWURScE85end5TmZ4OWN6SlZkTmNEbGJ5MTF6dVk3akJMMTRUVFIvZnJXVUhwMnJXczZyNXpNeFhWMlJiYVlQOC84Q0ZHd0hQTHljKy9SUS9ET2lhVnJkMFAyOXVTSGJOZ2JvQkMxTHFJZkpCQzFqa3IyeWNoYXUyam4vVVl0NlZKNlNMUDZoSDlidlFlUFBodGhaT3owNVFHTU9yU1lkOXByNE8zaXFYeUs5Nm1GU3ZibjkwZXkzNUtndVloYzh6VDdqd2tFNVJSRUNmSm1OME43NnZpNHNiZXJiMHhFUUpXQVVmb1IwQ3pUaHh0SklvYjFuRUkwWXhuN0xqNmlTV0QzakhobGxtemlNVTJOMm1rY3hVdzRHR2dYY0JKSzhiaDY0cFp6S0hMTVhzV2diYlRNRjFjekxQWkxDR1B2V3o0ZWxwQzVDUEtVMVA3d2VLRy9rT2F6U2szSUY0RVowc2gzWGdFbStJTXJtNXhnY3hsM1Y0T3d4QmoraXluQzRxQWpxMy9EWHpmZjF6RE1nS2Jydmk2MURvaitnVGFPNENncGZ5VHZwVGxKai9SMkdCWStqYlJGRlZhVjlIN2hMclZFNHJPLzl2VHZsRDY5dmxDZXBsYUFZbkluTjFUS0tpOC9YZTYvdDBvZ0VkMG5PNE9pQjBMR3YxT1BMRDhOWGdpMWRhSERSSGtwNU5XNDZmNytKWUJFNjBxbmVFZzJnS0hNV1lIamk2R0pWVGcxekVTckVYVkJjaDVWRVpJaVd3WjlxY2VSNVVkSTQyOTdGT09yOEZUaEZVZmVJM2JHVG85THYxOVJXZEZ3UXg5UHRTTkpkUk8rWnNOV3M0bEUydGY4NkRPRnJlT3FYVU0vNEk0UWtFYytyNVo5dFFVSWJEVXp2elNnSSs0anJ0KzNpS1pGRVZWWVRnWkhsZVp0SWI3a2pDd2FwU09MNno0RS9PRUQ0N1MvTWlmamwvMy9URGdqODZseERrYnVESHFPT1A5cFFzVkI3S0ZJemllUGJKUnVWRzRJc0x0eTh5TzZDL3B3bHpTaWRrV2RWc3Z0Q2NNMnFsOTRVSUxMeWxxTTNtOHNDQmozL1ZjSEZHYnVIVzRid1V3NW02c2UwdkR2MjdtMW11OThCMzIwRUpnU1h1WU5wVDJMR2NuVnRKcEZjYmtJRElWS1o1QmVhYktEdU51VXpnSWJ2b2NWVHNDWk1RQ0JNNWFVdEVSUDIvVloybHFvbXg5NTFtZHZ4NWtIK1ZiMEprUVdIVEtsbVBRS2lMbnJvb25MSmQvbWdqWVFYSlJTRHJ5ZGhQaDlXazdHMkJrb2ZoRlBYQmY0a2VzQWdhRlBET0Qwc1d3MnVGRVpwNzB2ekp6dnBIbGVuZ0doOWZVUkEySCs2NXVDVU04SDF2c1NZeW15Q2NjS0pKcm9pMm5ZYTI2UmZTbk8rS0lMZGYxVzhsbFJJMlgvOWJRMkE5ZDNuUGJTUVpDeFlpOStGVkpWbUFtOHZMdEpaWjRyZkYraHNsYW1zRGVRWi9OeExXQS9Da3VQa0xucXFZaWJPQzFJalNsRENkNldJUHl2elNqaUQ1dWtrSTFjNnJpYlpCbHppdUVRS01iWXpjTCtEdWl4VE1iZXBKLzQ4SDZxbndEQW9pV2dIYllQUm9Pb2s0M1diaUlLUUpTY0F1NVV1UC83M0Y1NWFXWU1MZTF6Vk5RWm9rTEYwYnBaZ0g3Z2huYkxIeERhcWVFSGdWSkpaZWl4ZE9XYXBmY2lrL2VzZkNiTEF6VTM0Qk1lcTQyYWVkOXYwWE53Znk4VmVBWkEvTlJ6TFBwOTYrMFIvd3BZYXppb2Y4VUEzZFVwZTRyWkUzN2VnZ3hja3BZblM3bWhrWEZBOUJXL0RZN1dONU92c1VIamJ0VC9Rb0dKL1RCUmFRRFVlcXZPa05yek5yUmJ4VVV6eUpEZlRpUmQzc00yUVR6ajRSSWxvVWo5VDVzeTdIZkIzcldOUHBjSFJZSVVpYTZVczIvMWlwOXFoSSs1RUZiMVFhbm8veS85ZzlmbExnTGhBN2x0cnV5a0NtWHlJcWJEWi9DY1pjb1hDdkVPNFJsRDYyWENZZ3V1d1J5a3lJUEU0TVhtQmlCT0NidTZkamFBVzJIN3dtbVRab0VyYmZaWndrWEdJM1FNQWV2eHllc01QNk9nUjhHWW1oeEE0SjJnWkN6amNEY0VmMXU1aVFoQmd6em9wYlc3MmRhQUgyWUtUTEtmdnJmaGluaGM5L0oySGprRENWM0Y5RGtodFQ4MjBrQ29OVFR2RGRkVHVWNktqSGNKUUxEdVlqejRUaUZjQmR4bEdEdTVPdGJ5aDMwdXR6QWQvU2VzRExNbkR5UkxmaDliZDdHdWR2TTY3YmFjcVVnU01RVENUQUdhcE9pWFJUUmVlY3RCUFhJQWlreFJ3T3V1ZzJTa2pNV0VRNGtHTVlQSi9ZSm41MHNHMW5GZXpEVUFzemh6dHMwczJpaXdLZWFtaTFpODExaWpWWjdVanJEdjEyRCthTk9FbzhBdGIrMXdXUElZODJvTXZYTENWTm5Id0U2VkRKM2pIYytsMGtvUGZqUWZEaVhrbFZGeVo4L2dBYTE5VmFTOEJJUHgxcjF4RGNuNUxYL0lvdUgrTlNNK004YkFuZlVncE8xUVA2d0dKK2pJNlFFQkg0YjVFTTNEREo4ak5rK2ZBTzd4aStvMmJsdWlWL2psaUdmcE9hRWNSZFFoR3RuUTFNRmxyaGlVK01kcjhYdG00TzN4UHV6ZTg4TWExelRFYW41dEx3UFhaK3plamRXMG9YUzdiTTFmTHNEcTFtTGRCWGlBNm1SemxwbzQ1YkxWQVdRaDkwZUFMQzB4bHZqSlkyQmNoRHdhcUlyUjRjRXRObXhxZ1pSdlIxcWNUbFZ0SlRMaTNxdjlsMmswNC8zbDd0ZmwrUk9INm5IUy9HalgwVE5qc3RveXNDdEZLWnNFamU5T0VuYjZScEN0YTl1NUVoSVlGU205K2hiK0hRalFTV1IvSkphcTBkRGtIOTRpbmQzUitDK2xTYTdnSWtzZ25FRFpZcWZ0WWk0eHVqM0wzTy9sVmtCRnhoK1JMMTZZTDRYSE9wM3BUTU4xckYvcHRZeTBnT2FIZitlYUw2Z1RqbkgrRU5GSzFIbVBzR2dWRGQvWDRISXFHbFozaDczREdrMWlUWXJyUDJQWSszc0Jwa2pHUXhYSEtFeWkxVWsrWkVGVG9TUEcraVNFV2VMVnJEWE92UjFyV2NtcjJ2OG1qd0RnK1lySEtBaVNEdFE1VkFjRkl0TnExQlpJVnRTQldGbVFEMkVoYVN5V3Yrb0VyV0Vpb3FGUnMzQjhubW9RS3d2RTlzYXlrdkZyaXk1NzE3ZFVlMlI4SmVxK1A0ZXdGNW9zcGpzVjRvazM2VWQweEE5dURaSVBFNGI4U0NkUThZNW51NEQvWm41VmF3OEdMa3U2MG1qUkExMkFhTzlyZm1MNUxQTzlQTTRLOG1UUjhBK1lWb2V4d2g5c2xFcExnTG44OHMzVXB1WThnbFpnNjV6cVVCRFRoQ3M3WDZoR2M2Zk14dDBpYi9kejhKY0wzQXJncGxzM1NHV21pOGFLNU96RWozOENjcEFXWVVjYVFCWTczVW16bTJPb1BiM0ZZMFAzWHZheWtOREYrcHNQaFlYMTdJdGs4WlRwU21aeFBqOUJsbWNScmJpQTJyWkZ1YmU4Vk9HK2FSS2xtTU1RUzdjTE94SVZrWFhYTUNMM24wQktsa3Z1THh0Um1lcFk3TFJ4aEc5VU1LQWwxRjN4L0FuQzM5aTloVllZaXk3ZUZqWGc0UkZzYnhwM1B0Zlc4eFFHaUFoYWhscVJncGd0VGtIR0lSWjY5ZGsrWnA2WDZtU3pEMmRuUkcvQXU0RXIxUmU1OXB4WkI2WThZUXF3RC9mVnZTcUUwcnoxUUk3TEg4M0ttbTg5eFFSTE9xSTRNSGNDeEVQQnVJZVorVXVOMEtjaWYxaUZ5cEhxdFdzVXdnTlYrekN6SnVOamNwN0VuU1lGcjk5UDI3d2dqd2pxYTFyS3VJMHVpWmJSUDRrMkhndWduSXUxYkoxY2FiTEVkRWhNRGVlSWRRWUdrUlJHV0VzMm9vZDZ2QTU2citpSVNQbS9sRnFheUFxeDQzaWs2emk1ZGU2TjhhR3djZmFKU3g4aFVtb0phTVlHQUVnYk9pclFERmI3NXpiYVBZZ28rcUxBc2MzdDhQMlFndE03RWE2MCtkYVdzMTlXMzhBem03cCtzdDkwUEVlcEhNNlJJdGZsYmRIdzVacE83OC95WEtMOGQ1SlZyd3o1TjhxRjQrVlVld2JSS1ZSendFZE5wTExHaHpjR1N0RFJnbWROdW00cVE5TGFmVGhhT0NmOXl3QWdvTVpnTjRTTU5haEUwWnlITTBhVDROS1N2OUJ2NkprYkU2ZFBTcy8rQUdZRXVZc25GTHFQMzh5V2p2eWRkQmY1cEpxOEhkYXZXbUpEWmY2UlJBTGlkRTNQYncvY3V6TUpYTGZWbVhpVHpUQUNGYWYzNitPUHgyWG5DZ3RYR3dHV0ZQRzlwMHErVU5FeHR6eHRONFU5QmRDdzJ4ZG94dzhmS21CMWo2Sk1ESW9YOGZqMWljWWFiemhwTkV6T3grQzFzL3dDZHZlQ2N4SWgvOTI5V0tRUFJNZ0VVNGhVZlBPTUs0YTlyZWFhVGNDMnZFckNkZnJiVExmVXFPeGQyUWdSYTIyVitwemFUbW55L1liNnVTUUlVbFB2YlBVZUM2UE1DTzAwMmhrZG5tcEhpTDNzYVpBdkdzUUZBb3VzMXQveGJuY0VXRnJrR1A1Z1FvenpSUFRGZlgrejJJakdRc1dCZ1F4VURhNzVkVmpiQmJvVW1OWGhxNlNGaFJiNjRqU1dTc21DT3llMDNvV25UQ28zK3FvSkZLdW9YMk1DUWJLb0o5YTNid01lZnJlM3AxWW9LWTVmckgxaFBkem9TSVlEc2NTc0Z2QnoycC9UU0FYQmhyN2FXMUtyakZzTDlRZjJvSUZhdE5YQ09YOUpvQ01aL2V1M1BlVTFhTjlzRThFMk85ZXVPejBFS0VwSnhtY3Z0eVJHVWRLNzl5YWwwNkZ0bm9jWWFzTzlrN2tSZjZFNDFlS2dnazJpbE9vaXZRWWt4MWZ6UjdWT1hkZk1yeThOaUgrM2NVaFVoOUlPVC9VZk1YY29YbG9LV2VzdkllSVE0YkFWcDF4bHd5QjB3VmMvckF1UTYrb0Rsd3VKaG5HSjJrMWhJOGw4T1g0bnFGdVJxSjJReW54MGgwSXd5dHZjZnQvUVdBRzRpOTIxSmU4Yk9wZ2VnRk5RcGVRWGJ3aENmTG5reTVrOXpRTVBPTENLWEpWd2NvZFRwSW1EQXh0L25WN0o2TTMrMXR5NGVIc2RwN2M2VFdpOUtLOXlvUGpHSzU1SXZqRGpTUXFuN3pNRmU1WEo3cEtTN1IvZkFwOHRSL2swU1BweThld0tmZ0E2NVFsaVJ1ak0rRW5wZXczZnZwUUYwM2FJbS9LdFE2aXhSbUdSUklQMjBBY1hqSTd2ZmdtQ0cxN21rTmZXV1lvaW1XQnM2V3R1MGpxQyszODZ1KzkySU5zTGFNaFJCQ0hmZXJsdGY0WkJYKy85NGRIM3dPOTR4M2dDVmM5bExkN3lmWC9VcTNGTHVhOW9RNHpjRnhSNzZSRUx5bW5jTVdDSFk0WUY2Q3lSaDhoZ2dTeDRWcnpQc0pWNUtaelBIOGZUOGxsc3FCRGpwN2NNdGk5emJ5UFdVbXN0MUx4UWRRdCtoNE1nbHplc3ZtbGhkc3BsTDdtdjB3RGFubmM4WFZmRzR5UEFRaXZpVkhkK0lHbTc2TFVsL3VjTnV0UTBkYkZWbCtONTl2bzA0YXY5SlpqR2RqR21XaGJjblZ2THNYTWkvTUxWaHoyemJFaVd5c2NPS0ZPOGVrejd4TmdSak82NUJYcFdJZTB3Sm1pRjNKMGpWN0RLNDE2aWZxZjg1L2hTQlNNSTVFZ2UyN21ZVXNlazZrbEMxeEgxN1ZkdGwyRFFLOXBwbEtDZkk2N0FlczlHYW1nbng1bS9ueFNid0pJSk1jcmdUU1lMNERvelFNelhwcW5uNkdKaUpvQWtVMm5tc0hoMnVkQzlrdnNvTmhqczM5bDRINjlVN1J5VXlNc3FDOURFWjhOR0FCTFJYQ3Q1aVZpTm4yZ0g1U096K0VtVG1UZXFmQWtEb0VWUExsQ2dMVjVRNVJmbEdZSndJWmd5OXFOa3NVeFgvTU5zVEZ0dUxwbytDbDB1Q09wZ01QZUFxS2tyQVhiNWpGLzg5ZTRVeTZLNDdCQzVCQmZXdjJSWGxaN2ZiNEZKTG9EMndzNzBNOUl2L0g4TFBRRFFtWnhWcS8wOUk3aDJWL3NzaWdzcndkblhIc3JHUStYcXhmYTlzdks3WWNBS0lYcEtGbk82UHhVM0hEUUxZTlE5OE4wczgvYnFtbm9McUJPTGdER0h3WGhHYmVLSnk4S2xjNVd2SnNFekFrV256c3JPWlJLNWZKMGl5OUxNWGo2MUlJczV1V0tzTDNaekdRcnFUV0NmQVNzL3p1VEpiZmNoNGo2Y0VBOENvS1RjVHJvTHlEQ0l0UTl3V1crVFdYU0ZJMmo3WU4zZlR0bVArYndGTDFkcU5zTzZZWDNVbHhJeWd5RUhkTTd4MFBSRDRkSmppVmZzUnZQd1hxYi9xYXJxMzNIZ0h4SzJweDZ5TDVFR2hNL1dsSXZiRXZsc0wxUERxelVLeVVrZmRjSEsvV092amN0QVFwblRRUVNGbU9CTmxpMFZocy9obUt6cjVyRkdYZEpmendiOFgyd01JNGRtQ0FaZmxSK05UbkVudFR2eUdpS0lGNmNJZUs2QzhFdTREbUVDUU0xMnZHSDAzU1VLM2pBbzZDaFFZbUlrMkFVRDR2QTBXS0pBelk3ME1GeGZJa3VBQ0Y5UmNYbUlaZG9ocGtiVzlHbCttVUZyRDZkdVcyakdDeFNVWStNUDAyeHpacTRSRjlQSURGUlNWcEplUDdCQzl0czlLTjFadXpIMVZ3SitUaEt1WVFoWEFIa1RVeUFZcGsrdktvNFVPZkNycDJzaTQrcEt5WGFQdUJ1Wkpib2c2YmlCL3dsMGUzZ0RTa0w1ZFBZb0RvdVpTSUdFbk5XZVJtN3ZYSmQyUldIRFE2Q0dDbjNOdTFCeEJ6YS9yVWh4VStkVTFabGozbXJiTEJsQ3NibWRVd09INStNUlUvVE5pU1oxbnBmQ1lvY0NRQ0xUbkxkUi9RVFlpdDBqRFNja2xLUmNvWUxmSm1Na05MeHFTNWdIOS9NVndKalhWN1MwM3dkZXJTcUQzUHdYMTI4UGhFakRIN2pVQ0VIem1XZEFvbzBWTE1sWnVYZnREUmViVFYwUzVNNk5yelZSdHRvMXRXa2YrUWcxQVB3b216bXdWUlAwell6YTA0eEpWbVFQN2Z4bEhtSitHZXBFY3lrYVFxVk9uUUZWQVduekpTYVA3S0FxNjlLMDZLc3hZVmJqRVY3ekd4NVp0OWVWWUJ3R3pHVjhydklvRUpxejBxMmNoY0lyTFZhMHA1Mjk0RnVtK2lHWHIxMXR1UFdvQVVCbzlhcFowQVRZTnBUcGQyQmN4ZTIzM05wamQ3MVY0N2tUdTVscWlBZ0QrWm9tWHBNNzNyTWhCaEJxTHg1ZUJna2VQaEZiM01BTFM3VC9IanJ0VnJsUkRaMU5EQmtpTWp5eGx6Nkd2ZHNCQytwVFFXTWVkNzZxMmJsMnVHMmVUV2VRMm1aZDE5YzVWUnpzQ3pZd0x3WFBPblN1R2N5MTRaUmUrdVdtSy9ZcS81dDNVaVpmMERkdHp0SW9uTVlYUHlZUURIZEMzT2h2ZXp1emZQQnJVSG1IUEdXc3g3YktWNklVaEl4Q08wRmNEbE0wbkVWOW9pQi9TYlFGZFN0eDJIK3h0Z0RmV1BMWW5hcTdIZ05VckhIeCs2MkROY2d3a0k0TkwvQnZuUGVrcTJ1SFRFWGR3NTQ2WDI0MnR6d0dMVkl2d2YrYzFvTEdpVExqakVYV0dRSkRnSFVFamxWdUhIWFRqVFdkTjVRYzdGNy9kZi9URXV0a1B0S0VzcE1xZ1BrTmNyb2lQc0FkUkZPeisxUXU1MzJ0eU5EazVFUUpIV2Y3Z1ozZVBnclNKUXBSN3hHQ1hWdUxyU2hLZTVXWHpJZ2pCdUM4Q2diM3BoY3NqWmQ3SEs5TCtGZHFZL3FxeGdyWkVnaGxzTXNKU0k1T1puRzlOSEVzOEtzWE92QWY3dUY5bk9UM0FUM1hHMW5GS3ZaV0pBOGYrRWUyb0tjdCtYZTdQTSsrUkFhdE1CSHphMmJPYTZrRzFiMXdrZFh6SjQvVG8wZDBpdGhoTTJBbEZxWWlkZFB4WkdDeitXVUF1dTFibUZOcmZ6RmxzOCtPeW1GKzFFTlVBaFNEcUUwOXlHTlpINGp5ZFN6MUFJZlhTM1pwZzZnYjFvTVdGd25sSDZ4dGRMc2NLVWMrc1JsYmtub0xHZEJ0M3FCdHo0b01PVEl5VHpHckVOK2N6YiswdGYvTGNPQ0syQWVZVDNHNEtvVGN1RzErRFRYUG1KVXcvMVBiYndyaUZ1eXJYNm53MWhWYU1idVFSWTRUNUVuTnJXRWd2TUVQZk44UDZuSHUyaG9aWmpsR1dSb2ZvUVJIR2VWTFhBb2dSZmhaSm9ocmpJQ2NkMVZwY1NnQWNpaVV0Rno0Y09kL0IvMHhzZVlEcVlMU01lcjRvRUdoUis0ZWVGRWNYSjg4b0ZUMHpxTE1DNVhPTk1vb2hhdCtNZ0FGaHlLaFlmMjZHMlBmcGx6VFRmVktONG0ySmUrUjFNOG91NnZRSmhncHUweGVjMWQyUTcwNVhPVFh2RTdyenl4Y3NVclR3M1dENHBvRlh1M3lzN3BUeTQxVzJBb09wZTJFYmpJVTg2RE9CUGhGaXExZzFDMTBDVm9Uc3JuQnBOWkVleFowNjV3ZmNxdWZxbDB2N2k0N1lVUzBIRXVLUFREVlArK2dqTExVRkVvNm1leHM5aTRWMWJRR1loeDNETUhiUG5jYzAxNVZFTFlxdWxqYUpQS0d4c2xvSlBpanV1ZXNmZ1g3WVZKY2tTbWJnZEJ4OWdwM0pEc05BZkpqSHVrS2xuTG5SbVhWMXZ4Z2o2RVQxanBKbHJ1TlpkZ2MzZTJ1clVkWXRyZ1VkM21lWmk4VFNSR1ZtM0VNdFhvTFFMckx3MXpqUmZUbUo0Q3pUTU94SEZtc2RvMHRwWVdMalVtQ2ErSi9EaGpSU0pVRWU0Y2twQkwvaU1TOVhFMlNaaVlpUG11dExBS3FmeVRtSXNlcGVzVk1kb3ozTUI4MTBXL01ZUTZsUFNzc3N2MHc3NjlacDZERGtiUnQzci9JL3BOY2tQR3lhTmt4cWZMQktuNHVQUGdQemNjM0hyMGNuQ1NqdXJScG1iODU0MmcyQ3RKSE5vS3pLMDI1TkVlb1hITkk2S2dLaWRJc3hWcllzS3kveGxEYmJSQjhaREs3L1lMY051VTNMV0s3Y2Y1M3Q4T05qWWJwQW9yaEo1c0g0QmliZTdiMDBpK1ZCdVZZRW1ndjNUS1Job1lraHlTL3kwZlNLKzMvNFNFWkN3OUtCbnl2QU9IL0pBdjI1d3U1UFA1WGlpbFZFZ01YTmhIOXlHQzhGSG1wSFpoaU55eitSN2sxOGN2NXhCRDdQeDVKWDN6bG9VWU5EV1VGV3V0SzVnUmJ3YUhRdi9KWll2K3F2Wnk5MVhieXdzcm12dXBvSU1EYnhySmhFbXNnRzBxMWlXTjFZaHErcnd3S0lZTG9qSy9TaXZZMkdsSm9NVnk2c01XbXo1RmhXdjRvb2VVTSthL00weVVZN0hCaWZRQkpOaDcxRW92bk5sU1ROTEtBa3ZiUWo0czYzNk5DK0NLckovR04xcDMyWjh0cUNpaTlGNDAveUQ3UGRHK0pOWDlvL25yVGdiUTZQUlZJMEFMN0RRUDdweTVMZ05NUk5jRFdlaUgvQ25HQ2JYSVA5RlhPVWdzOEJxKyswWEtnNGJPeVE5bjIwR1krZ2hycFE4VkxnUDFORG5wQjRkajAwVkdIZnNjTU5OblNwbnpGbkI1ZHFKdjg3QllkQVhNWVZoN0ZQRysyN09oMUplUk5GOXFkVmRlWVVaNXRHL3dyNHBFa3JIVy9lN0s3enNmdVFGL3lCNU8zVjhLb0RERHdWYkJ5a3RuT1A5ekRXSFYzbmRTcXEwdUtRcWk1MHUwa1V6QkdVTUhETzdueHM5OTM4ZkJiTFZqVmJRWEJwWVpTL2w5U3RiUG1CcXVSM2xScGZLSzgweGJSUDQ2dkk4eTRSc2xxRGFEZHpWNDVWZTRFeVpWQi9odWo0alFwdENac0hxMXdpbVNNUUtzWWFKQ2Y1WXBLNThUQ2RqRy9uTXdnbVdRcnFic0N6QTZ0ajJoN2hNQUJTaXRZZWJQTXZyQWtDTFR2cU1QNEZHNXRFdG92aHBtSFh2UzZjTjlJNlJFQnB5eXI5K05KRFVRc2djbUJ4OWFYeEdEUkMvVU85RWoveXlmaDJsayt6dDRhVndacW53N2RQMUVvcXdueS9GNTQwbm5tWjdTYWtDVmorVEhPYWhGYXF0Q0E4UEZRblBQV2l1RkxxcitocWhWaWx4aGIxNG84TTZNYTJEVFBaQ2l3emVYckdwb202M2pRaHVYUzIwdTd6Z1gyTDdLWTVEVC9iTUVubkdLQjhMaC9UOW50ZVpGWCtocEtJbERQNWRVRVRkbTlTVlFoVEliMkNmb0ZjVEoxb1B1NjF2U3lDUXhDQW1xYjVxMEpLWmtqTjhaOWx4SWFGNzVZbXZ5aG5rZWNGZm1VcEVYY2FUdWYvQ0pMdmprQUdYU3Q0S0NNelNZeDdLYnJnK2cvSFdQUDQvMnJjRzVVR2hKVkp5czZYcFJ0VTcwRzdBUXd3SnBCTmVSRGo3RUxyektqendpd05TWGVqbE0yUHpsdHNvR0xUZGRJeVMrUndIdTdVOVJVaDdOZng0YXJkdE1aeEx0YzhrcytncHhhckhzRkw1SjBJTFhURFY2UzJuWm5pVS9YUTUwNGplc0NFVHo1M1hxdUlmNnZuNWthMzlKTDJIbStRcGhhM2diMUZoTVFvY29FaDJLaE9ERFdKK0hqeDk5M0M4eTVlbHlyL2E4NXRXSlUyZi85QlowOXRqa2E2OEVvM2d6dHVCUTYxTGJHOTlwS2JWdDlFQVg5aUNoNE5EN2I4S2kvampmNDk1V1M3YVBGRDgrSFVRT3ZNL0ZTMytLdlZIeXlhKy9TQ01meVhIOThsd09pUHgrb2hvWE9RTnNvaXBZSi9ZVmNSZFVnWjF3V2l6RFJkR28vYXJkdFNQcFhXYzRubmlIY004eEVvUVZoS3labmhUY0VEQVVHRDZ0SVBPMmpOWlJ5USsxZkNaWTREL0lxcldOZ0UxWmJ2eDB1Y2FuUlhkM3lYeE1Fc0tXN05ucnlqWmZldGFGZ0NpMUwxUGdUSWpKcHRSVWJHdGVDY0hFQ3dwaWFMMU1menpQSWFrU2NIcUxLZnFSQjdWZnZnSU1YTDhsaGxLdmNtWGhwQmRQS2VqTlVHb3dZUEs5WWNTcGpRekFwSGhhWXc3K1lrYzJuYXRXOEp1U3kvZDVVN00vQjRMZTRFQ2I0SmhjV2pxcFVWY1Zqbzk4STNNeDUxallzeDJRZkdydkVLNDhkTm56MlhtTy9DYmNLYy9HKzd4UzJEUE5wOFpuMU9CeFJDT21jSjIzQW9WUk1KSW5iSWU4eTJCbHRKemViOWhMZ1J3VGlsR0lubWg3bThmM20xSHdWN1dSK1oyWndMUjNQbXp5andIVFArSTQzTDFIOElwSndiNnE2YU1zRjl6U3JQQXFQcU1kVDRzWnA5Y3hjWHc4VGp1QndnOEtNdHRmSXhpSmppeG5BdHN0TERXMkRVVm9PNEVPT3daT2FXOHkwRjJwWE02OXFESklDMGNhSFFoREh3cCs4ZzZMcWJ2aE5XYW0xM0p5OGE0aVBvN1RGMUVveVNwM2plQnRZWWxlcFJSYlV4UHJ6d3NjeGVQUlIxalp5a3QwY2I4RU1wR2hnWmRJU3dBa2I5UTFNZ0ltV1VSc0tselJaSXdKeDN2ckVwZFJhb3pPWk1iaUtteUlBK21oMERSalFvc1RGYkxpUFFySEdpZEhwZXJDVWJva0ZxSDA3UDZlSndrYnYrZnJoVVRNdzZSOFM0Tlp0NUkyRHArRnBUVWJpb1YyUmZwVFFYU2lLSDFXaXl1N2FlQkFDaGFSaUxid1lhL3YzcklDZ1BtZXhhN2oyd1hkK3B6U2lYNFpacjUrUk52c3pjYjFVWlFnQkZqSmhGWmtxNmFJODdYekVsTDk1RlFsdlpRVmhYWEMzem1jU0NlRmloWUc3WTFpV0ZoTkZRWjQ2SS9pNVhDbjVMbnZCRUpjUi9PWDRwZ0dBL1V2cTJaaEFGNGJWSzZEdHJ0cWhOdFRXMGRNTXFQY0M2MnMrM0diOStNaUFVeDZ2dFJyTWcxVTlxNFdtMjdueFVDWGd2aC9nV09qZk5xZ0grU3FYV0ZxSEJwT3MxUFZISWtSTFdvcEs1a3J5dDQ2Y3RnbE8zNVFOUElnQ2N5cUNtRWFmd0ZNMXhwK1hPWlczRGhzV0JZekVqVFp1Wm9MV2x4QnBBVmhJUmh2dG84UXRsazV6UWxqdy91ZUhlMVJJaXBBR2FJa0Y5aHpEUzhIbHlsTXRuNW1wUGl0SlJWVlB1Zmp2WjZ4RWdNREd0OE54WW9KWWhUZnIwMlRyUVNrU0hhUkdQT3FkallPOGJjanYwVDJSNGRrRGJyWjk0Qnp5ZkRLc0U1ZkJHQ2FMQjAvMHBKY1Bxc0tJVVVUTldCK1dVTUt4VnFBcVRoK0MrQ3lMYWYrR1ZSaXNiMU55a3dLN2JxaDJwQ09mc2tTUnc5cFRNbFlyVkNGT21MR0dQTFBEb241TzZYWWZxMjBQVC9TUGRHNkZ3YzU5UllMbWlHeXpxQ0drNC9nRUkyVk9EektZZk9iNmY0RDVjTVRQWDNZNmdZeEVFL21OSjhTWk5LOTV6ZUU4OVBFN1RBV0FEYm9DUnZHVFRFY0dKYXR1YmFpVHk3b1pGMlFCNUtISDdnNTVrclpUREY3eTRqZ2pnZElGc2lJSFBvM08yaktveXR0cUluZlE0VWxVVGxiN0VPTllZNE9RaUIzWFQrZUxXUnNvUUREM1hadEJYdXo4ZXpNQVl4a1k0U0FSM3lZbUVXV2tObGNySWIvZWV1Z1ZqVC9mUTdidGxaeENPcFlQWnJhQ3dadTY2TkpwSzF0bjIxaFN2Y1haM2tnSExPTXZrY1hucUJDTmVUdHgzZDBGZERMWlI3WmZYaVJkK1lpQ2ZrVEJtWGdPZnR2V1JlMGNyOUlWWTk1dlVKWHhBdzAvcm9EUlJzZkpYcysrR1djQUNHOStIb29NRTg0MDZZMWpDdk5ZZDFKU21WMG1IaVA3RHJMNmhGODNXdlBTcklMM3VORXk0SWZXT3dMTjNUTzVkUG1GdFRkVnUvQ01uMTZoeERoS2h3Ykw3cUxWVzMyUUVXeHV3cGtCKzNjT25iaStiREZ2TVVuSkZGQzRIUS85RENadFdGYW40NUZuQzc0NmU2cHdpZWczZ3MzRGNIcmxUQUorN2gwUGJVUDlxZ2hoUTZNeCtJYmhPVHR1Z2xqdnBJdmtrandsSWJkdmllNUVUVExPU3FIQnVJdGI4U2NMalp4bXhMTW5pbVkrTkF4MXlCbGk1NnZwRk9mVHhsaTZnZzd0UStxY3dGQUNUenkxa3F6Tkg0STlOSjRlcis5aGJQK3VpT2owSi9SZ1dpZjh0ZjZpcU5oQkxpOVkrdmJhNHprbjZtTFhrdlZPTnFDanhXMnFsQ3N6SXdXMXZTemFrS1RocUxYQ1lvTDNyMVl5QlBycDYvdFptSXR4UkdEZ2ExZm9TOWMxa1B3R01OMVd6MUtYYThnR0tvYnVqZ3NtZXQvOFpBTmtJN2gyZVJzN1VocEZiVjh6Sk5GUWFSNitwWDE0K04wN1FtRThXUkl3Skk2Wkc4QjdyS1l6d2NvMUlDZStobmpkQVJYSjdDSGltN2FDamhxeU9XQS8wUlhNWVdvYktrSmR2bGZYVGdVSHo5bkVPQ0VjeGNXcFhKUlpaTzZ3R1g5U3VOb3p4N3BBMXRPcFpIWmwvTFFnQWZUemhpWDJLMXNKcUgyZW1MWnFxRC84M2pxVXdnbUgyMDM0N2QzZlRjc08vNXA0czgrNlorOWRoM1A2czUyT2ZhWGJoYlJDcTlDdCs2QXZTWHNvczdJTkFSbUVHSVB0SGVMaVd5aTZNRWZ4bDkzd3o4VjJISElrOVVJeEU1MnFEOUxVZ3JNQmZQV3Nic0tWNmRMTS9EekJrejZnMXY0azBMcGVXeU9KWVc2UHd0UUdNT2JpQnl0YlBTL3dGZVQ0bmI3RU9hZGRzMDR4SHdUU3NYNHRBSUdwQVgydjZoY0U2eGI1WGlzenhXbWIxczBpUXc1VTNFSVd2MUhBRFFZZ2hQSDA5OEM2c2k2aTZaZjF2WmFNT1pxYUlrTGNXQk1VTGY2ZFZJM21pSFNCUnNvNDZVZmo0cmR6WW0wcFlDSkhGTlkyQjdXM2VraUFyb3dFVXM1eE9tU2pDUXNKazhVYmpkVVZ2YXlIQlp6cUQ4NlE3QkVJa0RHbVdPL2I4dHl3ZDJENEVraHRMY3FodzAyeTRkeFBrRTI1dUltNW5EVzlheTFwSEVTZk9yOStTSE5TZG9jNVdtdysyMzZRdHVLTHFnNStjeVcvOXhaSCtNZjFtMi92TWN1VEQ2YnoyTHdHUFlQeHZiWFg5N0Rjc0hlcHhCeVlOeDhiaW9SRTF3U3pTNi9nZ0J4UVBCcFREa1ZqdlhtNTBjNStvRWYwcHJCOVQ1TTdlS3NCaUJsekd6dUJIM3BDbE9YMFh0UjBiZFRFNFFjeXFkSC9RRU1LaERYRnpPemZGdmplM0xlTVVvWkZSc3dkaGdXS3FRenJVSElJM0Z6ZE56bFZrNlJFQVF6d25qTlhBQTllVkVrZ2xSbGJwaVlNdkdId1dpQTZrM2h3bTdxS0tPQW5PZG1jSjR6cDNLZjlpSXBVc3BYMnloZjRzUi91bXo5Q3Z5K2JIT0s4WE8vUFNWLzlvYjhTSEdyOC9tZ3gvVjk2cFdlS1MrSWlhOWN0YWpTaE4xR3dmcnJSbnJIa0ZDVUdJYjJ6M1VmNEFhRGV4aGQrR05zN01TeUlITUhQcDJSV0FsMDBZYXVSeE9ySDZNOEh4S2I3UE0yUDJCZXduTEFSc2NLZEtBMnE0VXIvcll3N0FxcmNyWkJRa2w2SU5WYS8zenRxT2o1ejZET25TbmIvRENHK0h0UncwZDRWMW1Pa2g1SDhhUFdERXAzZzMvVTVuV3gvL2VGaTA2bXV5WWx5a2VqR1djOWtiSlMrZktzaUhyOGs0bU50SDUvQWF6dzdoK1dCZ1NIUHliZTk5ZjlObDY0cDVXbDNUYS9ScE9EdDlmVDJTa3d3OHhxeXg1YW9ncis5WElYczJWVTh3ZmNlMEozY2c5dUVWYVprR2dWckNZTy9hZWNydXdPeThocGJldW1PbG9YSFlBVGFoeGZMdk5JL3FJYlR6M0FQMmxac0tnY3JSMFpXT3ZGVS94VGxpUVJKYk82dEdYendDcDVDS0hmdnkySS90Y09SS1FYelNPYmdZamNuSXJacHQ2ZjhMQVowZ1I2cFYyQmJTTTNxdHpuL3A3ZEh6dTNLTEpSVVc1SnRMRG82bHlVQytGenN6VUl1T1VYcmo2SHVlZkdVNHhNMlNob3gzUnQ3blV5M1krTEU2dGEyWUxITzNrZlhrUjlGZFpoZWlaS1NHNENldEVhU0JjaFVBc0lvWW5BZ0pvSUZMQWhWaFB1TFIwUE5iYUg4RjBtYzdhNDFkU0psSGUwZ3UzZ2ZrQXpMZDdKWWk0U0YvREZKbUhOQnN5L0hGakxUNDA1NE1DS016Yzd2OHZpWWsrZ3FiUnMzT2hTakI3dTFxa3E3b0RSd0NhUUtocUwvc3dUREJXVEp6dW9GZXNkWEd0NThmM3JQUGpabi9NNVBkR2Z0RFJTWEducUpIeVluOFpZeUd3MGlwcHdQUnZVOXh6RnZXNEIwV1hsZUk1TXVHOVBXSmphQmovMHJQV0IwYmxsTDBKdDJWdnkxajFxK2t6ckxsWEYxZHArSWFjNm1ZQ0pjRDVQZXlFU1d3ellQcXh5UVpad1h1MGNIMko0NFhmR1Y5TDVwQ3ZNOEVHUlg3TE9CRHJyZnBlY25ESE9KWGhaN0VnS2doVkY0cXN6bmRPYUhGRDd6cFJzeFcvWm5yL0pNdWEzclZHc1YweWFJVXFYVHpJUE5YZFVsYWZvOUtVQmh5QnJhTnZnNHFqV2lJS1dZZ2tkVHlxZ0cxVEFwZ2tvYXV0MWIvU2lzKzRxV1MzR2Y0MEJ3WjU5d2xHeDZDdVdMSWppRTFPTzRHUUMwZFlMWFRFOTBJTStFYWRydVBYMUtDL2pHK2dzMWI1R3pVeUVrNlBhOU52Vm1Ud2tndmFFRG1rWDlSRStJcmNWKzN3S1QvWGI1czFyVGJSYWlKZ3NoblVUTmlzcmFXYi95bUZTNnVjeDJFMUM2SGZ6MEFjYVNvK1Y2Zm1ObjRMbEpvVnNpYnJKS28rczk3dVk3cVE4RVl6K3N4YUN4QU9LcWpUUW1ZYU90NitUL3ZNMFlkWkxWb2hJRDcySm0wcGw3WnpYUW1JSGNQMFhSZlNGdURlT1hzVm9xT2hEWjlzNS9zbjRLMmUvbWZUdXcxR2gwbzlYdVZBQ3FpaEhVRHFidURuMktLdzVwbXVjRU83c0RtMUNvWjJkd1Y2NGJoY3NVTGx4Zk1QTEh1UEtwZnE0c2RsaGpzemY5MGlpQUVtcEFXRWpFTVA1eDFhUDFuSzRQNG9tWUREeUlsR2NlVHZDZFpPS2V5a2dHOUdwM0ZyNTRuRVZaKzVqSC9ZUGxwak9NTzdLOGNVY0M2V1cxVDEvTTRMNFZhQUFSdVY5Z01BbVJVd2NhRzE1WmoyN3YvVmxKUldINmVBc1pkU3Y5dTN3QmxRamMzOHlTZEswTTAraXlJYXZwaW9CemZmaStQT0kzYnVIVnRIa3JVWUV5d09zbktzUmNsbWF1NFdkQ1U5Y1IvK2kvakVuQVZpY3dmRS8xb2ROOVlCRE1jRjRzcmpIZ3oxWHQ3TERnSEx1cG9LdjVLUmxWWHY0VGZHVjVpcS85ZU5Ia1F2blVVVkNLVzIxNkdHZm5mMENnQml2S1VNVVl2Szd4SmRoNm1WUEx6eEJqT1FQUFJzZk53K0VuQkJmOTJzdzk2L0dDQ0lpY2gzWG5PQmZyaXNldkdLRlcxczRLYk5SK3p6eVB1eHkzWms3VXhFa0s1enBWNys3Z0RCNkpNVExPSDl1UDRtVDB2dVdIRjBPR0xMWm0wS2V3dE00MlF1SkhVelZGU0wzVlJ6YUVmUm9xZzJVTHB2RENjWjl2WTRueUxDaEtKYm83Ui9BckV3R29FZldSWU9sQ3FSNThrYnJmNHY3VUUvazdpamovWW8zaVRuSjJmTWZaVmtMUG1RSTNDODI1OGdQMWtPS2tuaHRhU1Yrbi9CbktScWhpdyttTWFMTDhkMGRVeXNIa0JNYjhtVHJwNmloaXJDaWFWWlJ5Y2tSVXJ4dFF0Um9TakRiNnBpeUZ6V3BRMzlkQzlYV3F2cDJhQ1ZnQzJtT3RoUXNLNm5QWUFrd01oMFVwbVN3Ukt5UlVRSjZQT0VKazU3UlN5OThhSEJxYndieGFQTlkyOU1XRXpxTXk2cW53aXlSc2FIdC9qTEY5RGFLOGlodXhsa1VRbllOeno2RlozWUFCWWtpeHpPOTd1ZTV1Q0lvMk1CVXArWWlseDJZR1ZvUzBoRzJMQWRydmp1Um9OVzkrWnhtZUJOcTI2TU5lSVFmbEFuQ2tuWGMxZnZpVWVaOTJLNkFzT1NVT08vbWRjWENRT3d0ays0QTQybE5OSjE4clYxUTQrc0g4SW45VlVWL1lFNlhzbUZGZ0ZQNG1OSTRGdDN2aG5lYzFFblJzVFhGRFJyL3UwMHZ1VmF2ZDM1aUwzZHQ1MHp0RFg0OFk0NjN5YS9hSFNPQUl1a1o5SG0xR3l2akEyQW0zN2lEZW9XeDJXckNvMDJGSUhYd1g2b2xlY2thOVBkdDNCamRnV3ErYUduTlFPVmVYWFluQjhsQSt6by9mMm1uOWhCOHlXV3FycVk4WFlHOURycUZHSExKTkRjdE9aeEpoZ0IvdmRob2V1amNuUXh4NHlKM2duQllrbSt0VkJNbWNVZlVCRzE3YVQ3MUdMbmlvYmRZcGI3K2tiSThSZW00Zm1tTVQvYVA5SHNsQWxVTjdrY0tVQmVkYmxwV0NQY2FUMFZiejBESUxZMStjQ1R6VmFoS0FFbGpPWWd5WEl3QTR5ZzVZb3hRWFdJa3VoNjBFdHRzR2ViZDJDQWUrVnNXVG02L2xHdEc0aUw5Q3h5TmE0M0R4WHVpdEtaQ2ZRV05MV0cyZE1TZHlxak9iQnJObXRjMTc5MUhvVXhVRFRzNEV3NHIyZ1RZYUVxSTRMYVVSTUdFRjdJOTFXNmlTMFhzNERFZ0s0QVA4ZjVQYlhVb2Q2WXVuL2FwN21pRzFrZ0s0SFlVOTJWOE9WejhXRkRwSTBqNTlLYW1QK3FpaVphaytCeUNFYWRNV010OGZDM2VKclcxbGZ3QW5GT3FFODFMZmJiSjdqMmFrMnNzV3Bjc25MY0RtWWkrTitDVmdkb1VLRGRQOHU0TTllaDBxUjVzMk4vM29RTkkwZlhRL3FIbTdBVS9FYTVoSzF2TUhxOStZTlFwdzdOcjBCeTBIZWU2eWp4dkZuUVJBbG1jS0h5em9Yc0oyTllCTnNXZHpiT2xlWkhQRUFkTnhpcS9vMkJXMXFHeG05TWRmZGFMbnp0TUZoMFA1TVE5SG9UcTlRelpRQkRxa0tncUpsbUJnUEdPQTFQOHhKNU9lZEJXd2hUTFJKLzBJY0sxNUNBUHVTamUwTWRPRHpMckVudDF4QTVPM0J4K3pYUHJBL0JZeEczR3g1a2ZFZnBXN2NJL0VtSGtYaXJVTHB4T3h0NWkweVFnWG5wc0RXZmFZMVk5OXhWdHZQK2pOOGxPbWRXcEU4S1hJS1BSS3hvQmxwTk9FeXpSVkh0VXRRdHl4YjNyUDZFVERPOWdXWFRjbk12UUtUWGJwM1BqOHNoRU9CRE5WbTNzTFRoMEJ5VU11eG0ybzNEdWl5U0x1NHJuakk0c1lNSFhQZGZtQWJVV1oxdHZvS09XZW02RnZxOEI4Zys1elpJalE3UG41NG1lZnp5M3pSWE1VTld4Y2Zid1kwVEhxVVpsOTc4UVM3SVlkSTc4LzhCUnBxRWp6Z3QyeDFVSC9JbWU3L08yTUlKN0IybjhKLzJsTXNDclpIWVpmMktIZEJ6Nmo3S0tVS1dqbEdYT0grWDNNenFyemYxdXA0dXAvN2VwMkZoKzlzQ2pvMVVRL2NFNm1CeW83RTVOQ2U1MTl1cmE2MFRGdmRJYlowUGJ4ZUhXajl1cytpS2RaaldKTzRGdXNITmxscXNnaEJhSGhPaFlqeUl5RHZ6QUFUTWowL2VPSStDdE9UajFQYXBZMldhVXlPWFhhbnpHVXo1Nnc1RmovUkhEU2w0N1VnaElJWUUwQURTV0RGMFdoZDRMcG9BUWpQR2c2L3BHK0lPT08yZkM1dGxOVis2SGp1dnljRnhxMVljMStKVklUNHdkUGcxTjlRY0Y4U3VyQkpLRjZoSkJGeW5ZQUhNMyt0c3U0Ri9RM2djYVNjR1FGWVVVNm90QXRJYUIvMGl3WU1DTWRhYXZGSUZSS1FTNmxNb0t2Q25CODh3MTkrNnd3T3BzTzdpVHg4V2RIWXZVN0xsUi9SMWNaUXZXRnI0dnJtQkJzdzhWRk9UcGdhRHprU2IrRzdFeXF1cmVQclRIRTc5RTdadVIxbnFWR25FanViU3pabXMzQmlKdkRTNGRHOWpwbUJvbVluNHVncFp2aHlBT3QySlR1VFZraEtMcG9QdVpXYjhRdFR5K3BYakNnVHcvelY2MzNsWTduc3IrT0lsbHlTVW1vOFU0Z294VHJLOXBoYW1Tb1plQ0gzeHpUTTc3dmpEU2lESHFuSHcrOW9yM1Z2cXFuTXV4M0Q2bTFXc0xQamFyaGRMY2lyN0t1VW5xeEYydGwyQnF3eUtCeGJvV0tPcHU0d29Mdml1MjU4K2ZsNVE1UWF3eE90M0NvZHFaTHJpbnd4M293c1FObFRqQUM3QlViUUFhQmVZa0JJdE42a2tPcmVaTjRsU3U5a05xdk9GY3E3WmlGbzFoUkxiSHpac1RqTWJsd1VUN3VJUnBuNDBjUzlDdVo2bEtFSnpNOGkyNmVDTU9pa3dNak5yUkhHM0g3R1N5WUxZUWthRitzWmEvVm1PdWp4MjFHRkQ2b1E0MHA4SXlnMlJJY3h1TW9mOWhYdHNOZERDdzhvN2luSVhTTGlTbGZDOFJvenJwc2J3NlpIdDQ5VHFrVzBQblZvSVlFVHNRa1l5ZUJnSmo1dWEvbGkybGdvT3RlUHBmRFlRU0lMbnc2blNhUWpTbWsrc3ZDbzE0TUsvczB1YlRCdjNUSUFkamlPWDBicGMvbnFQQjdOcGJmM2hQbmI3WTYvTWVGRks4RTB0ME5BaGpBTUpQdVpHK3hSa1p0bUpFYmVYZUlZQXJtUXFiRkZXUlFYUlRmVzJyN250Qlc3WE9lc2F6ZGdrS05ET3R4b2NrZlNCbnIrNDg4SE9VTE8rVXlaVTBLZHpGSHByY2Mvc3QyMWdQTkoxL0ozeEsrM3NxaEx0V0Y4ck51MEkzRmNmdHE2UXF1N3AzYk5yc0VjY2poMGFRa1lXZ3NZdldEalFWYWRmRE1RVU1CZDhzZkMzNEdwc3pqV0VFNHYvbU1ueTNZRUJuT0V6Zzg1T1crREtuYk9KR3h3R0dUamMvVDh0UFRjY3BJVXNOb3V2Qm1pb0FlVGttOE9LRGxoT2lFWTdwMkdDWmNxUUhZSmxZWDAzakZjc3pLUjdRSWZxNGpaVjRscmlpQ1NDYjBTSFI2YklkdElxdngvZ2lkUE5IWFZGUVI1NlFoVDE4NkIyWWYvUlc0ZXhhQ3YrcFhxMStYbmdjN3pudHN4a1RwUytJVmVuUVdEUytxdDhwYnpScWtRVFljakNPSStmZW84eEJFY1M5OUg4U1NoOHVOSEJic24yYkxxWFZLMnZxS09MMWhFZkhuYzMra0VhQUcyRUY5NjNXUElXaDhtMnJPTm14ME5yV1lIeWlDZ3V5ZmI2RTFkYmFNSlk1a1BpN3laSzNQdkp3V1ZmM3JleHpKcGFTYUUxQkcxN3V6YmlzR21IWFAxZVBPU1BPd3ptOG5hNnNkeHdqWTlVYXhNUjk4eERjbEJTeG9nQk1zMnlzbVo2K25RTWZ5NkRpVDBIa0w0VlAweHl5TmFPVURpT1E5akZZWUVTd1FLMVp2V1NSY1R1dXNmWnAwRStrQ3V0dUpXQll0ODJTS3MyVVplTi9yRHFFZHFwSXpveFozZThjTlZIMTM3ckV4bDA4TW1FNktWb3ZYanlxa0lrNU9SNWFUNDJ3OEd0b2lJTkF5dFFsT0RBTGF2L2VqZFB2SENteThlWmREQ3JtRCtSSnF3ZXVsZ3FGcFAyZjU0UVd4b1JicnRydkE2czREWks3eWdBbklIWTVoV1BhNm82dDgycGYwQXl4Q3lzenRIZXRPQytxVmJFZUtSaWFKNnMrNmhsWDBTV3NycDNwTk5Xc2FHMkhIY1l5a2tBb0xJRnhCYS92UzdUTWdQSElOQzFnT3RybStMZDFFR1grS0d5RDhERmhROHVDcFhFTWxyZTBObWhoT2FyQXpmd2tZUlRqMThzNEpQMzZIWUdwRjZLVy8zTUd5L3lOTXQ5ZjBOWjhuc2hCM2h6dXJ2MWd4QnFCNFV0WS9EL2NONWFMakc3cnl2dnN4RGw1OGFpTytEQnhGYzBzV2V2c2E4SEM4Z2oyYzBJei9jc2ZOSVhFL1ZCOHE3QUJVamRrbUxId2RrWDNCbVpEem5QbHRhc2ZSTGJTNWMzT3pFWlZ4VEdNaWhNUWtscGh1OEZjNjBObUxmOVdGTGh5QTFVTzh1QVZ3THZETVRJV0tsTTMrTGYrdVdkdFRUL296U1RBVHI4MHhUeFBkVjhNTmVEbWtTeWd5MWtDdzdld25rcUpHTFhRU0hRYkQzTUs2MG92dFZsUlNWNWg3ZkJOOS81bnBUdW5HemdWODFkU3R6RUdDdHBoV3QydS9aM0x1d0p5YXFtWThQNGlucTBSTjBiMWJkMVJQek9ZYXBkdDgyc0haSnArZ3lDWGR6SkhIVGhOM3hoWTN3MlQrQWkwMXVQZTk4YS9VOFBocituWlVKcHhtOXVpMzJQR2tvbG5jejdWTkhpRzZmYXVaQi9MQU02c1JTcjRWYmt3K0h2ZkxuRjhydVZKUTV4bmJyclRWdUhEa05RY2ljV2NyRFRrZVU2UnZ4SG9yS3ZyVTVqZkE4UEx3ZlNaZVowdC9DME82UStNT0pTZWxUdXgvZXlhbjJEU3c3emFJRGs1TW9UdzAwaUhzZzdmY3ErRnJSTVRDZDlHNFBDQVhpcU5NSUhFUlFlekMyVlpmL1lKdG1CMGphZ2xycTRZb3cyV2FucVovaE5POTJVRnVxbll1blMyMFN6bmVPa1hFcFpnOWJ5MStyaGliWjhndE1FQXpMbkoyTWhqcXpNbEJXaE14bmxTQ3pJQ21QNXhBckFNMkhqT2J3S2FQOFVwYlphMTJvdVY2Vlkrc3BtWnk5bm9WQTMyaS9sbmNJYVNrNGZUVThJbmFuSFlGeXR2K0gvc3Qvc2c2U0JIUWEweGhIZkxxamQ0V2JpOUJMOFl6ZzJJWDFqN21xQksxMlRaQlB0VXJEMkhLYWlRcVNvV2VlZ01FU3ZySVBnaTMyVXhNa3B4cFV6OUVMaVRXZjRqTTJWU1ErYTZrVnpuNFZDOEY2UUNpa3Rmdk1aQkdSYjlpVmlNSWZCMHVmQklBcHFZTjByYlJLVDEzbUZYanJsbFFwcG5ONkEzZ0tFNVpIWG9CZFFvcUhJbmZPVWhneG1yU0ZHM3RHaW1kTUY0THkwVXQ4RjFQeXJlT3RHQ2JLMGxCeVo0bi9PYjJ2cS9GeG9zcklVNjFIT1dDckI0NWkxeGNTOEtpNWFGNW1SYWpJN0FHSUtzb0VucUtQeGNDVjh1dG45YWlUWjEvOUN3WFdtdURLMGl1UStORnJualVxZUJUY2tMYVBTYVF4NGh5d0ppNG9PNktGUDNXNzNxVkp5TTNQenI0MmRCdHIvUlorRkdZTVJtbEpQVWdxQkhkRXRBeC9LR3phZzJOeVFBbHI4d09nL0FjYUxVQ2M2bGJzWUk4aFpERnp4OC9jTWhHN291UDIvUXhCUzd3U3MyZHpHZkZ3OFNtZkNQUjRDMzhOMTFWTmpqb0ZQRXdxSFoxWDBUZ1N1K2xPbDJUTFhPUUNsTzdZQjBJcksrSkMvb0l4MkdscDV3UmJOQ0NMTkc3Sng5RVRsZFFzRE1uZ25CY2I4eG1kNlVYZkpCNlJsbjFLZHd3cU9PWHF5L2RxZ2RudEljMzEzMzlnNVB0U2RGTENkWmdET3JTMGJSM0JVcWFsdlpna2FwaEpCNE5kcnlyWUtPWmYzbmI4TVorbmFYdHNZa3N0bHFOV1NMdHlwaEdlN2xwRUFFQkgrdTl2Q3ZGUEluNWlHVzcxRHllRkVVM1B2dERJd0xBRFgza3hlem55RUpwYW9aTExhNklybStubGdheUdrUFIxRHo4MSs4UzlzV1RDalJEemdxMUVHNktUcWdWVnErN2o4RkppSE9FS1U1bWtPRFV3alBya0JaTXAvTW9NV3RiWENQUFlmd1RJTWpmQzNydGhTOWVkanl0b3VGMnN6M3owVVVsVGtRR1hEVlZXUExLalNXc1pOZzVwdlFFNUQvSi9ZQmZNRkQyOENuOG1zR0tHa1FuTURDcWVQbGtrSTF1d3Rtb01JVVhYNkl4VU9VaFA4Y2lGUFhoMXVJdUFHa0RpcjA0QkUrRGFiLzhHc2lqNHg2RzBTaEVWSkNYVHpBelo1eTR3ZlZTQkd2cVEzQmR4MnpqdnRxUEYyc2I4WUV2QWRITHRiTWRjODFRZVNlbngyR3IvVERSUm9xeW1HSGRYUWVEellITUdlUGhyMjZHMGpVbDA3ZlZETDhta3h5S3kreTNUMFlKekM4TzRlWEpOS3liWTBLYVZ1cFYzOVNQV3I5MHlnVjNCN3ZFR0VSVys4MWthVzNzRGJOb05kalo1YytxeXl2QkRRMkhQYm1ROTY4eVZuMk1MK1NPaFZURUNkNjMyNWJmUFV3Vjdld0Erb3VVSHl3RUFTMFBYNExhTGF5MkRlSDFHanNiWVU5RVlJVVM0L09CNEJER1dreWZQTGs2SXY3b2ZVclpwYnlDSkRrSTFoQkpNbGFZM0cwalVCQXlqVkNFVUViZVBrZjRENGhvMWxvYjJOVzd3UUpSM0x3b3Z2c0lRWTVnMnczWlJBWUN3VE5QNzBRK1ZETzJKOWxEbC9BYis1VWR4YjkyODNFMG9PYzQrRS9CSHJxekJIc1Y2b1N0bk1OczlsSzdUVThsRzhheDNoU3hrR2tSQmdZM1FZaXQ3ZUdkYVQ4UGdjUGhqTjZMTDFTb2pBN013RmNhdCs0T3cvMlNXWGFpK25JMEgvWU40b0NqN1FVOUUwczIzZ2lqTTJaOGRiUHptdmpNU00xb1QyT3V2WllpQjdPM3lrSVUxVkVlUWhpQ3V1eWxjVEFQS1RzWTM1VkhnbzFKUEVZaHM3d1NrZzVLRXpDc2k3SmdWa0dFdWhMeEU4Lzc4aFhTYk9FUk9PTVA2VnltNzVrc2NxRjQ2S25NOThLVVgrVWJSTUN6SG9BVXdOU3E3MmpjTCtTam0rQmtVYnlZZ3Y3WXEraUVtTnp0U1Z3VEV6NytBcFhzK1kzQzlxWHNRUW9qTi9tWFFBR1VTcWFlR1VMTTBZaFpwVks2UU1jNGQ0Y3BpeFIySjB5R2E3Nmczdi85QW1FQUVQVUpwcFIvYU1BOERLUDdUVC9KS05Qd01LMlBFTjF2dzNIU2tDVmhCNVRYWk40QVlqd1NTV2JlckJVM0ZoeUlsenBUMmFHUjE4WFZITTY0WDYzVW1SbVpLc1dYMHFaaEsvQmtUaGRyUEtOUVZUd0tzQkpRVG93UERsQnJPZ2pST2dJVUo2OUtkOTlzSTI2Ym1xbEN3VEorTU94ZDMvVEd4Ti9OVjBnYmVNRnpBZDRVVUd6dmUrcWxlU2hMSW5henRjM3ZyQ0FqbWp2MlNRaXN6Q3Y5SGM1ajRqaGxPWWpSTndsdHYrY1FIZWczckdxNUJVcXdCbDR0ZGh0S1VuaTMrNE5aZDFPbUxHdndvd2dnR0VORXJsTTNjdk9MeVJRbDYwUFVOYm85VFJ0RDE5M2liVUZ6V1paUXNKM1Q0bmdjcEl2bFJRcll4aXNoUFlieUYyVENzQ3JJSEpua3R3b3EvaDNra3k2WFRYcnp0M2J1cE8rVnZ6ZGJ3UUNXWWhiRjQwam9HVFdTUC9rYTd6MlNwcXBrWlhJV2xBS2kzZUovMnNkU0xZL0hxV1VjUjBZeEZLN0ROQWR0VENkbVRhMkFVVkMvRGF0dlViNHBCSW9UU3AxMEdISVdwUXRqTVMyRkhuaDg2QXQ4dGtJTTBIL21kVVFYSzJKaG5tZWRzdkRza0tSR0tkVXNFb2xWVW9mWGtYblZGR2ZLbEpXSFBiRS9xdjNUTFlyQmt4TG1VZCtJQWp1Rk9QQUprMytBVUNodEpLOS9nUTlyL05ZR21IVHNFS083RU9OU1VXaU9EODZhL25CZUdLeGV1ZFE0QitOSzFtYVAxeXI3cDMwTHBLWjBzRVRtOURwcWhnNUxrcy9RYjN1U3lEQ3hIWEh4NzlRUDBsRjJJcUpjVy9qNE53N0VLTkNvOExKRDBydllETGdSdUhrbWU4aUtIK2NGTmh0cm55ZlMycDIrZEVMM1NRaXdlU2lRSHdHRkY1WVFOSW5TVG5WeVU4Sk43bDhnQk55elgrSXJFTzZFZFBkZjJZbk9qc1JBNmRuWkcvaHN5TlNxak9VblEvSjVodTQrbVo5SFNFZGRGWDJPZTc0aTkwVVdWOFJXLzFmUTNMSlNEVWU1Y0RBbzJaVHBVMTBTaFRqYi9HeEZUWFUxQnVtN1kydE9KeVZ2aTNzYmRPRDNNS1hrNXM1MHVMVGgxd1VYVXpKL0xMMWpOMzRMclJmVTBpcmNoUS9tMzBjNEpUOC9KY3F4RVdBUWFJOVplSThrRDRxcUtVVnpTSWowa1dGSzhLOU43QWNWVWkzeGxlZ0NuYjBCbC9VTzllN011eDU4TzNxdDVjQmZ0VXB1WXh0bnJWdXk0cXUzTmp2bW9xRXlENXRTcFRFZ2hEdWFnbGlEcVB5SUJHWmJrdExSbTBoSkdvSy9MNjZWTTM4Tk9EMmVyRTN2VHBBVjVicVI2Z3VIcUgzeTJXclpCQUQzVEJNa2ZYVXZ1MUYwSzNrK3U3UVZHeWFxaSt3MktOOWtYVEpoZFhVWXF1dG1NMzRGeCtESnUxbWlEQ0RRZW9JK21DWUNpYTZCRStsY0JiOHV6ZkpHa2pvdEt6eEVmcWZLRkFCUEVFaVYwRlcvYk4rSk5jM3V3SkpielhwRlJRaWlXb2RORTlEcVA2VGwxcDNnYTUxN2d0a3lRVHloZk16MkZicW1JbnQ4Rk4wVGd2ZlJlR1dSdm1CWlB3bnFLaldkWnpraWtUdDhLRkFlTHRndE5oc3pHSm5LWXRGUVpjeEpGd0RLL3dTWTl6Tkk5QWpiL2JheVpML2d6em9vVVRUVGJWTkp0TEF6bmhUVzdHZ04xUm1LQit0RjhCYmNhT3FITmJaUnhRdjZYWHBTcjdINEZrTUREdWVWelV6aEp6a29hNGdSMm13WHIremFTb0hRVFVYTlJ2Vm5ib0VpOWo4SEx5U2NJVFV5QWxjd0hBUkladkNqMk1TMEVqWGtZMkNRV2RaYkxYdVNKRUpNZEI2bUNsOVJ6b3lCdG9XUk1GNEsvUUZEWGQzeUNPdS9DRktkcFRmbEtCWXhVZkZUeTJSb0dQYy9PQTArV3FTcS9ja0IwdE81VTZPV1NYS3BJZjhuZXhXK2tsdXFMU0JWcGs3MnAyQmF1MURLZGlUQU81QXZJVEJNUmRYRmVCY2ZhODIvSkRyRGVvTUx4Y2VTdm16RnBuN044dUdwaVVNbXgvaWs3UWQ3YVhBL1p4U0h3NUttb3lqS3FRckFyUDBFQlY1U2tYT0FFK0lmZ0RORHF0cC83YnZUc21ZYW1GRjRkUTRhcHRka1d6V2VlcThIbUREVnR6UGhLV0VtQ200TWFsY2Fqcm1IZ2ZzUzF5WFdGaVNnS2xPeFhIN1IxazZGQy93QkhpK3l2eUloYk53Mk9jeGVObmIzSk1ueTdBWWhnUjJKaFpsTXJpUkh0dkFkcjFHa0VkN25SS2lyUHhxMjFudWxIUDRFTnBTTFdNT1ZTQUlWd3JFN2tBRitEWEl6RDQ4UnJtT3NkTklsVXdaZndGUmY2aUk5Wm1CYjdNNEpNUHJHTEpKQkJVR3Y2QW9aOXBSRmpRY05FSC8yNzZOOUg2MTJRZGM4MjA3bFJZZFVPMFJKN2dQanA4U2tncTFPWUJTcUVkaVR5ZnNScGVOanJaUHJ6c3p0YXNaQUp6QWJkN3VwaWRXZ0xkTVlMbU85VUtBVWR0WmpuS2toYktxeC80UnJHTXJLM0dwMXlGQ3dsSVBYTTk0RTJrYVM0eFZsaU9hb0llNDJncUY3dEdKUWw1UzJJS0tjM2pyS0w5dWYxSzI0blN6OGRUTDVKbFp1QUluVjZzbkVCM040ZE9TaEJQTjBaVi81WWpraHFzV1dkM2xyQXRRVEhHSnR1amovbkREb2J0ckh0MU90TFROdkFHNmVFTkJKV3lqVTBtWlRaZW5JYklDNDVBVlFHckhMRWZFRGJxOFhLck9YYS9OcW5mYlFUc2kwbVNuM1R0VURVNlR2RFA1QVlZVnUvMWh0YVY4Z25GaiszWGhxUituYmo4dm56dlZpOWNlT1JyRjBBVXdUSFZRRE1pVW40WmVRaWxHRWFPeW1TUTZseHE0cm9MbS9GZEhNS01naHNoZTNLYjlyVzhhT0k1SWVnMWM0cCs0Nk15NExaZHZnNWhhU0ROeEVQMVB2dEEyNWI1T0EvYUVBV2xGcVU2NmUwSXM2YnJCbnhUeWRacmoyWDQ0eVd6ZGd6eDBjQ21yTjk5aEVKUXBoQ2V6cUU1SXpDcFpoMXlNRTdYQTRmSGV1SzJ5OEpKckIweHYzcm54WHdxRzRzN2diL1dFVFZYdUxGaGtIRzYvaTRKREV2VSt6NHFvSnErVUxPSnE2ZVlzSlNvUW53QUhrejhRMndQeVpOVG9KTWtXYjZKdVFIT3hGTlgwRElyTWdGZ1NhaVZzai9CS2JRV3U2TEVneEVwZzJIZm0xRmVPVzZ6K3E5TitzZ0MzR1ExSjhkN1ZWelRORFo4L25CQjJYYno1Z21FVEZzSUllWlR5QXNzMXBuSVJrWm50WHMrWnBBMHRSN0pFYVNCSVprR1EydGhBRC9OaDVyRnNpZE9LREM5dHBUd3FDNEtXRUNieXNNc3JhcGh1QStqOHd0UERYUTRmSEU5YWhvZkRSUEQ1a2toRTVjczRqY1NSakpMWjBUZE1JMUtPTUtQQ0VzRHoyL2VpUXhGNVJubU9KTTRNT3M5K0d6QWViR3FUc2tzU1pxbDhGWHJaWFU2K1hMUnNlc3E0c0tldmFHY2dBK1FRbzFEWWRzbVVhMlJ6ZWs4ZGxaeVRqUklvZjlZNmg5SGtNeUtJczQ2VGl6NW5hdDFTV0NONUpxL0dJMmZkRGtodU0zYzV1c29SZElEUkVRTlNvWHFtWjZpeEMzTGlUNm0zN1p5dkc0a01GSW0wRG1SUDR6cnpSV2ZBT0VFU0dPcXdva3dwMW9DV3Z0ajY3L2JTTHF0cHcrZThlV25WNTNXdTl0ZVpIa210eUp6QVdONHl5eWJPZHgwaDNoSGhZTTB6ZVpMaHRXR0ZoSE9QRnI4NmZhL2g0NWxCeitQbFRUbzFYN1VyRCtGV2VTN3l2L2VraU1EbXFxWTcvU25zN0JYcUd2UXhkU0dYWVU4OHBHNUNoLzFpRWtwOXcycjZySERGbTEydjI2YkZNalBaODZVbGdaZjFoRWJtL01mc1JHTEpUTjRta2VSWEhDRFVteTMyV1dmQngwL2tBeDJmR2pVUTZucVRGQ1hjaU5zb2ZiUVRlTW1KNFhqVTh2WERlanRiZ0ltRFZnbllsRGdUb2hiZFdhY0VYbkpNNTV0OTI0OWUvKzl4SDl0bCt5aVRtUzcwMnRQUWYxYVlqaUpoZlp0aFNMUzJrODRmZXJWc3FINlVTUmIrM25vL3lHQTQ4TkowdjU0ZjBFaFdFd0ZTaVZwbzAyc1IzSmNzZldCRFdwQStKSklzOWNNaEtwU3U4V21DbW50WHJDT3l4eWR6dE1FV2JGSGVBdGtiMWV5d1BOeDV6RndvajFWKzBacEpDaDU4TWU5NW03cURwNVRTVDlxVmc1M2ZjS09WVTRWYmZZMnQyZVBRTC9KbWRQU0RQVnZEZTYvWURyMUVORjluM2tkam4zNEFDL2t5dEdzbDViSFVYUmY4eTNKeXgrcGF6MHZoZ21pSVpqSElSZE5OS1hudHVoaVNWNVUwa3BWRjQxeERMQjQ0R3VMQTV4QiszZWExb1ZVQTJMQjJySktKdDg5dHg1eHJlN3RudEpTaDZGZUI2bWt4UUExaHlpZGtxeFo3QmRiWldvNVVBUW9nRlpkdW0yQUQ5RzB6RFMxUFVvTTFTQUtVK3Y2T1oyekkwS0dUYm96elA1Q09qSFVyR2xTRWFSS1lWdHAybWhSYWFYN0FUOStVREpSN2x3TTRVYU4yZHd4MnNUMnZQaE5oNVF1ZzNUM2JsYzlseGsyaVJheERHM3RVREI5Ri80QUVmcll0THlkTllPd044Qm85U2x5eHFtRjNEZWQrcWxPbFNSKzhUd1hQWkVKcnlJc0IvQ2hJbEovQURyZTVpQWFFZ2UzSUhIRHEzQ1FkdGNqbm1teW5wOE5JNWk5bXFLdnl0WE9pcmRCYWlmNHdVUThyVWxYVDJWUFJxSnh6Wno1SURFd2FXMkxEZmthNDJtbEdibWxSbTBvaEt3RUttZDFuaFJDTzl0N3JwMi9QcGpxRDV4amVPam0ySjVETGdkaWcyL0lxNlNJVjBJeDM5SEZzTGtzK3BETHpORTEyTzJvRVdVZXkva1ZkeEZpdDNCdHY4cExRaFVyOWs0OGsrcjFmWmxBOWF0Q0haTysrSEUyTUdxQ2IwcG1uY3F3SFUxRGswL21aUlN1S3BFQkwzbFdjTkJuN0ZzdHJvNlh6NHpIcFFjQTQrM2xhemV0MThuQ2s5YnMyd1d4blViTnZCRFBkcUNJanFjbGNvZnBReTNUZVltWlhMYmtnUjlQVjg3QWJraGNpbjdhK1Q1NTBRQ0JoWXEzKzhLR29rbzNlTThITTIvencvVVFSQlBkN1RsRk9NWVJzWFBxWmxubUhEaWdnOGNRRnorNkh6anlzbUFseEhDc3U2V2lyTm84WlVJU1NsVWdZZXJYM3YxaVJ3QllUbU1BRkpuVXR2U1YrbElNMkFvandvSDdnbmF3aTBYUFl4QWxLZ2tTcG9rNjVicTNrUGpIbk9Oa3l4c09seWY5bnliVllVRVJDOXB0MGNEUjhZSUZSbmRxcDBzVWh6NnFnSDNRTjYyZUluUU4zWHNvMTRzdmdzSXQ1d3htSnBUTjNURFBFU2orV3BsSzc5OFM5bkVXWHRJdjBXSWlINkxrbHVISmJybnkzY2RiT2U4dExyQncrNXRiWlNTY1hnZG1Ub3pQeWNHV1doQytPTWJ0WXU4anRnTFplL0U3bDNvWjJhUzYweEJMTFF1QjN4OUlIdCtpSDZURitrR0Y5MkdQaGh0VGJoWXRnaWlFYllScktXa0RDTlgwSllVUU5ZZC9FMzZvb0tYbkFUT1MrUGl0cHgvOG40ZFloS1Nhamx2KzBuMWZaVlA2TWZzSFBvMlF4U0tFd0luTDloa3RnRTB1QjNoRGk1UEptaUh4YWNkU1pmQ1BydmRRdTFwclBWMWdibDUvek1FZWphcllYdU9qUmo5a3NrWmJFRHpObHFRVHU3VGxkb25zQ1FtMUdySmE5ZEt1ZHJOOGxSbmhrVStOd0srVXJjVTdzWGRFNmhWV0lBb2doU3lCYlNELzE0andpcjZ0YVNQL3dpZTVuR1pramhpaTNIekpETkppTXhNY1Z2a3BmWGYvRHViU3ZRVzVvU3dCdy91ZzR6SWRCZzBVY1NBS21peXZ5RkZSVlhvMlFmWlFwL25PR3pZZTNzRlJ4anR3b3oxc1FIaGFleVRVZ1UrZFllR3NnY2daaDVHZWw3VVYxRjJJYitKWWZsbHl0NnE1VEEzY2FXSktxQ2lNVW5wT0RvaWRoNnRRMEE1TlNsM3VPcnVkMmgyVE1sb3VjVWJGTVlhcitIVzVWUFk3amUwOFFFNUhsVllDeDF4Vi9TNHpPejNqZHZGVnBHUlNqb2xxUms4Z3hGaWJ0TC9KTXpTOWNvTUdMMWRZRVVmdDIydzF2Z2FjTVZVZkFrVW1DaUhEYmNBMytjcEhnTGZHNFRuZUxNMmZCV2hjbUZhczVOb2ZBZ0Y4bnN0MjRBKzJ0ckVWRWM0aGVLTW1FSHBNbXlrcmFvYWswSGhDSVcrVHBRVXZ5dWFhaE9mRFZBNmMyYnN6UlY5SXpiNXRYUDVydlBUSHZ5L05LWGNOenZTaWYwcElPcEZhQjlFbGpaeERrNXZCS0dXSGVxSU81TVhOd0hnUnZORG9XQ2lRZUNwZzh6ME1GMnVKR3haMFc4OThYWWdNQVk5SFVZMjZZNnRZZGJYTDV5S2dmb1I2NXdobVJuNGh4Y0VnNWZlU0gwdU9XUzE4a0VBa3JDTDdtS1JPcEZxc2tSTVJwYjJhaXZSaDlLT0ZXRHV6WVZvVGVUMnlxaUlQK0tIN2YyQXFsV09KVnpPMnBxR1ZrMHlQbm5RM3RkQU9jL2V5YW1kMDdpSDlJUkUvcE1mdFVOOXduKzdxcnBiSFdxQll0SWtydFVaUDJ6Q28ySjhhM2F6d3k4UmRtbUFQaDdPejROeHl0dVREK3FCc243OC9Gdkp2M3NrUGJyL0pVb1QrcGtVOTFGb2hlaFpxOVdzVzNrdTRGY1BjRDdmTGVyZURmTm1ZRU5pNXI1ZENOZHpmNmpZUFlPeHBGNUMzYlpMZEViY1FzdUFmWXZEWlpOUHlLVWtoemRQRGUzMGNFcFJEL3N6Y3p0NFlGWlBEWjA1Z01OUzZ6cFgrY2FXVU42dWtzZEUwY1FaQ1hmQWkxT3hYUlhJT2VXcTJwd2plaG02Q0VJcXdhWWRwTy95ZGNVclArQ3FwckpVOUVZQVNsdWxLZEFVL1Y5ZTQwbjdLV09uZWtCRDJDZDNmSVhZUjBQekkxNG5GQ3ROeUF3dWZzdDI4d2cvTUNIWThWMFQ1b1djeE9HcGZ4T1hHK1NSMXlkV2grRnhtNG9PaEpvTWFPWWx4dFFNSE03ZmRHTWVlakh3YytyZm9KQlhsLzBtbkVkZ2ovbzk4NWxzZFVSK3cyakVKNzRjWHQvdXdTbEhKUy9ZRkl5WWRva0JVUW80dzhObUtSZ1BJYXZ2UG1Eb2JvRnJUZ1NZQ2tiVDgvV2Z4TG9NTHdobjkwTGhGRUg5WUlNZGRUb1dBclRnYVJPRHFacjNlbUUrUmcyZXZFcmQzVkV2YzhjUUUrTGQwYmJSTVdzanJ1VlZPMGhUVmdlcHM3a2pmcXVmVnFDc1FyRDlSMWtGb1RTVzJZMndQeWtEanhZMUNsekRnWGhsejJ0TldTNXR3VFA3cWxrM0tjMWE4d0lkOVZiTFFUL3pqY2RxM3dxNDA4SHQ0L2N2aUVEMGpGQ2pqa0xwdjNZM1RTSnlxOXF0TFR6b201c2dtZTMra1ZUeTdqU3VoTG5pQXF3QmJPVXJxRmhjM2VHbGx5Q25jdU0ycE5kd2Yza3FTc1c4a0ZGSHpPN0d3eEJJcjRiVzZuZVFYL2xwa0NGaWlOQW8zb1JLSGFWMVFmRXNHSGpMUDZSYkhPUXRkUWppcXpINzdnUm5XRlVwcVNjdWdDeSs1QzVTYVJBWGV3UFlzZjd1emZCWGFsNlFPNGI4NDREK3lVcGI0RGhlUFRseHZhVUYyUGJQRTR2Z0NjaU5MUUhmQTNuc2pKUkNWSjF6dkJ1ZHR2Y2ZaTFYvMmpIV0s2Z0VIM1BhZjhCVk0xNHlWT2xQQzNqYjczeVRaRkIySDdya0lsaUg0U1FvdCtheUlsS2JHS3VhamJCdXhUOTMxaklpaHRlVUZseTVpd2k5bndxaVUyR1hJSkEzVXdmd1BZRjlqaFhnVjRpMFVDTzEwS1VQUndGQWJuTW1nVHZkcUpyTkFEUGpwUjVhMHdFSVNoYjErTmNZOE90NXlMYlIzQ2RTa3dOQ2lSVmVKNUFTQXgxOEg5TkpVR2NKRENZQjc2SWZ1MEovZVJqSENxUnNmcW9nWEMvNEZWdDZhcE5zd3BaQnVHaXg0eUF0ODBYMVF1a3MrZnMwVkNHVEtNaGtwbTJ1L2JDQmNSQXdpUFNkTFJJV0VYQnNER2c0ZVpGenI0U2lyZGJNdEt0US93V3FyU0dIRldlaVE5bk5RMzFQN0dvQlRNdHFrd0xWV25HNEVtMEx1QXhyK3ZTTlZqczVlVDJ1dFNwTjFDeGx0L1FuQ3IxQVBvS2s0Y1NmS1VGMEFDajg0dnQ3elpqL2pJZmFsaGlrUEN5SllDaDl4Uy9YR2ppNndFVjc2UHVkcXUvaU90UGV1ZjFreERNbm1CNlJjWVNtUnNyMk1aVElzd0JVTmNRT093dUR0WHdRWFNjazJHTlU1dVVadDdsQkJDUjhCMzBseUlEbGtBNVl4cDRLbEZQeFhVallnMHdCU1FRR3hQQlM3UktSZ3gyREg2ajlPNkpiQWNWS0JUcWt1NlIvWUllYndVV0VYK2JEY1NtbmJxNWRROVFrVFBJVlI4NG5kUlRIS0xIUXJSQXhmU3JpTXJYNlJwY1prQVZqVFNqbVVmRVUwQVBHVm9YV2FYNjRibTAvNDdTdXNRelQ3bHROTHBzckVYZ2JSdzdtb1FYOGJYdUJWWktMUis3R052S0JKYWRSOGNDZGZnTm1hRjRMNWlyc2pNckdySS9OQjZuNzMrZ25VZmpLMnJJMURMN3lPU2Y3ZDFIaFlJNHFjRGVVVkhlcXNONXo2TTBwNnJqaWYyS0RQMkdiSTU5d0xRY3JzMjNTSlJERk5OWXhpKzJMTmRwQ3FTektqK2pEQmFtR0JVandTMnBBNmErYmtkQjliNVoxUGVzaG0rMjhKRnpMWEtFYkk0T0dOUlZuRDFGcXMyd0hBWEcvSGNvbllzbmNWbE1UM1cwOGZzOWk0dVlXek5xZE8wZ2pzOGNsMHN4czhLWEprM1VYTGszWHhUeGQ2UGdZMjBLakpmQjhlSldRaTFuV0ZNOEc1cUkyVkF3RCtDK1kzUFFCOUIrNSs1RXdVdDRSYmdzYXNWTXBVY0JORW5WSERQdmQrVDBjYnlFdEJiQ01DU2pndnZmUUZFRFk4MUhDWFYxV0R4eGttTGxZTll0Umt3RnhsQ3BEZUUvWHIxQnBoZUFFWFVUY3U0NHBBZm5xb2dsVUs0S2h5ajc0WW5tZUppQmF2b3oyekxlcWlJdXlwcVAyZ0I3My9vNlJ1QUhBbnRXQjJTWU5BSGJWK1dQdXQrTEkyODlYTm5rbUFITGpMNWNURFNhY213MS90MzJ1Sm50WDhOWHloVFFGaFpZSGJvSWFXaUd5bHgweTlFNm43VjZQNGovTGEyN3VHNTQ3YnhMYVUzSU5rWlBvT3I4RW5aRnpBVzFZdnUrOEwzaW1DQWNYdDhDeWx5bG9RTlpSTXZsRFZCKzdXYSs5M3FLcTRlbkNNQ202Wkt5MDg1K0FXSVl5QXNpcDgwNXRadmdPNkdWbWlxNTRmelNTY1JFZmdHRWZ6RDNYK3B4d2JOallvZ0d4cDBuOS9FOFJCc2ZmUkNZUWhtbi9HSjZKKzRpalRyL3FwRUYrT0g5TFd5bTJkNXZrUjdWNCt2VngxVVBHa1JVV2taY3FHK3hsUkNJZ0Uvd0JxaUdaT3k1Q3hEUkx4ZEE3MDd2NkNydDN6MTYwaUpEV09Hc0QzVitIS0VHSi95c08yMmp1Y2t5OXp2RVk1NnZza28xbi9TTGlER09PSGRJeTRIS2p4L0FESnRqNmNLYXBXd2xkc2JoVDlWa2lTeVdiU2FKMXZNNnpOYXUwQWRabjVEU21oWkEzUER6L1lBdksrZ25FRnExTDVqWnlldEl0b29helVoaFEzelhTcWwyRXN5N3dGZzE4L1p3UXh2cGlmWkdUekJ2SXVsYWdtUDhpNWFNYzNmY1Q4Rmw0OE9hMVdTaTFHM0JwR0lpVEZUeVNhSjMwem1DWG1IWnBRQmYzTEdPcnpEZ0ZkTHNCb2tOdTR1aTZLY3BEaHFXdnFrVk5DWWJFalhmZW12N3ZWbXRjY25XVFJtOWhGTG9MM0UvcnIvbGNFbFRpQ1ZEcVNDRHZxZlJqcG9qbGZzcHNFYkRzTEhEcndiMStPcnJwRC9mVjBlRzNTQ1M2czBGUysrcWNkZ3VPT3lEUENoTGdRRVRqQTA3UDNDeS9KWm1wRG5pVTU3VENhVVZwbnJjMWFPQmVhcngwc2JmVWQ5cHNJNytIZGszMnNiYWFBUk5vbG0yaituMjFUNFV3SHRnRHN6U1JCOUtxN29aWEJRaU1rckMyU0JRUU13QXVPM0w3WVFIZGJ5bTBrVUxoQmxSa2FLZE9OdEM0bXZSL3RBd294U0dtRnNzdWprZnNERk94M24zenBBZmtGY1dRVzcyRWJYdjhNZEE3UGN3QjJteS9XL3l0cjlaVDVKdEZPWG40SGl0NjhwNzNONllJR3kzWUhjWXlsUVJQUTdVcmV1cDFPcERSUWZ3STV2M1BhZWRjNGlRNFViZ2QwVDRZdkR3VEc2Sk13M2dZSGJYSXB1MXdacmdnNXJ2RzIwL1hPWUlMQWZCYUxjS1VheWUzT3l2TGp0MHZYQkg2VlpNWThQN0U3K0hDNWcxclZPVC9VM0VBZ3NoUEdZZjRIeER5ejBuZnp5MlVnTGpFazhiNjhzTjkxRko3ckN2YXJTeDdBcFVBL3pJTWFlbWpoSjRpbEFLSkdzNUZhTDRSZFZQQytpU0FlNWFwbDR6Y0RZMVR3dVlzM0tCMnZSWXdseFhkNE1uT0trMDRxTE9LSC9nOVRkbSsvMmNqUnEyWDNYRmZzcHlXNXU2bTJmVVd2YnJJVzNRSVlKbC9RaHp5VUxsWVMyTUE5d2IzZWdWc2kxS1hvV0tOUWpDbnRFaGxhTU9PQ3k5OWFjalZ3S21qUVVOUDFuNFgzUDk2R1V6OXJ6YU5BZjNHM2hVU2hGYUhjOXpGNHZtZ0RsTVYreERhTjdqZk1kWHZXOElocnh2M00zMHBpK0YzeHZvV01kWlB3NVdDWTVtaSt4Y1JyNUErbHRvQXBPL1pydFRJaFR2U3RKWjB5bnlBcjBHVFNFcWovcVRpWkJXYTl0aTh3ME0wc2gxOGdjL09GVSs4YUQzQTRNajJMY2FoYzNPRWZ4bUwwbUp2WU05bktrVzRuMTVQYXRBR2VQRGs1YlkzNG1PRjZkdXNKTlNXWmlHNVZkKzR5eGdGdmFicjZOcUxEMEx0TVhxQzV1WGVVTUNsdGtRVUgxRjFKVGNUU1RzZlEwTjdpMkROVWxXTGI1eXNQQlQ4RTRqQ1IzZXRlZmJINnJnVi8zTUt1bHlMOURySzF2UkJKTjlsUGt1VCs3dkovWi9VbGwwSGcvWTZIWjd0MVJEdkllNjByVmNFaDNMdkIvSVBkaHBTRjloa1BEdFpKQmY3YWlvNjY0bFVVQVNpemtsZldXTXZUcmNDQVRncUxhTS9pc0JLcVRSa0xMUEdDeWpZUUZ0eWxSR3htT0JUZWJwZ2dYZ3ZheG5SeGpzR3pKZkhKS2JLUmVTUGZVdEV1UjFJNk04MURnM09ta2dtN0FVZm15cnVtSzltWEV0eUJvR1NiNmpxcW82ZGdRUTdzTjRTS3Bxd0FJR0JBcGNNNTQvTmdjU2h1dHRIVENuNTdnbmllYWVobmxMc2hkTk4rZy8zVmt1L2dVUWh5aUduRmxpVVFaV1NYelRlRlNvSy94UHNyZmhLeWl3WFVzbHNLUyt1bkwzWWZqV2dGdVNpT3RyYW5JN0lDbk9HV1hYays1VSsxVU9GbnR3QTI3SExrUmdoUmdYSFNsRFJpYmZ0N0haTFpoczZsMzJFM1RKYlNWNjFhNDJxeHZUVDdjV2VaWi9HdldUcDJNOEd0RjlFL0J5R2RTRjJQY2RQbVpub0ZwTzdMWVJlZnNuaTVVMmR1MFl1YnpiSEVQdFAyNUFsREFsZTVwVUptSkRsQUkyd2E5RFFEbW1vQlBablNFSUYvcjVVT29WOXBob2tVTzJUVHpsVGkrWHJyT2lOYmVKMHd2eXRkY0RadGRRNC9CRzVGVFZVRUtDZU51N2VQZnh1NFVicENnM21xWXE5VHJFUGVreGFycEd4NW1kcVFsYU5VaWFabGo5eURZSDhicy9HKytkMzl1UmxnTlJMWDd1UllmY2tYNHNUWDBiNWJuWFRHMkhOR1dpZ0liVEVEUTd5bFk1WnlOV0VwZmNuZUFML1l6bCtpOHk5VFdoQzg2dDZwRXJML2FOTWFEQ1ViWjYzZlVoVWZYNy9hOWdHVUVRcm8rYWdScWdudi85cXY0N2tDdFBMc2ZEWVBuTWRZYzZ5TUdBMllvTTZ5Y1Rlc0RGekxxOUtPRkhsT292c1hwclhuaityakpKdGF6RG5rYWFLQVZYdTVUczcveStwU3hDenREcVZYYTBPSUk3YS8wbGFPemp3WDAxZ3hZNkxDKzZnSWsyVThjbTA5ZTdBSWRxOG9lYU1xUEFOY2pId0Q5WmwydjI2MU1RNVJib2VZejI5SmJaUXBiQWgya21CcHlvWHQwS002Yk9OTWROSmU3Z2I3cmpycVFxNzF0Qmkza0JSSFIzb0VPT21MNmhpRzJ4UE8vSXl4eVBBQUlzK3lrUHg0M3laS2FjV0tjUy9LRUtOVXlDakt6QTlRMHhZUlFqZmd3S0Z1dHhKMHVPWmZ3VXZwY3prTHhPTlYxRDZSK250ZmtKOXFOc1JwckhsdGVuTmxDMCtUdnBDZXA4NmlQaW15VGpzSk0ydWlGMG9QbitaZDhtbTdjdllRQVNMdkFRUTZqT0VjYm13UGFBaDFqVHgxQ3JadUFZTG1Tck45T1JkOWVDMElZTXhNWDd1NnczZE15SjVBcUJVWitDU0I5THlJN2NiYUx2NTZyNUV6eHIvQXU3ZGp0OWdRMWJvZzZMeFREMWlXbXdwbHhnVUZRaEFWclVaS3NqRmc1RDNEejZJMndUT3RxcnA1QnFmbzE1Z281RUZPQTlyMVVBS0x5aUdBaEN2YVl5UjlWNHRXSnJjcHY3M2NRQ2NOUmQwZjQ4UmVpWGtLcW53elIxMzRraVh4aWpwMm90dU9sdWtKZlhEeEcwSlAxT04vMEdyWVllYWtKVlVsY0k3cWgrUW9VaXJoTHpSaGpXTG5ZczRSVHNrZy83L1VITWd0RmpJRE5MZmxxVWVDbXJZbVFkVkM3MTdqQjZrRkpUY3lUK1BvOFQzcWw1VW1IMmQrUXo0Q1JUQSthUEpvSWhQRVRSa3pVVHVDOE9PUmxxOUZlREtDaDVDcEVSRkhVckYzV2U5TmxlWHRMYWlhM0xQaW5CdE1ONWgvTXdYQ21tMFp2OUZFaHQ1Rlpua0lBRzE1elRCL0o1eUQzMXZtc0srL2dwUjliWEhWcWlMMEZVQnlYTnBxQm9OcUdXL0Z0T1Qzd2NtOFN1amVrc3psSmtSb1pMTDhrUkF1MGJBOFhDRVFhaDdUcVhGL0ZOUCtjLzdaWmhQQVMrckxIRWFzS2M4RGVsQVgyM1FWWHlQL2R1WmJsZ3hrWjd3ZXdXNmZXejhNV1NXbmowbUp5Y21GdXBMbzFobWR3T1lEMmd2RnpiRWtoZEtRS044T3ZkSDU0ZUwrNGZ2cU1tTHpHOHl0N09VNlM2RHd3OXN2enNHZDhQb2RETHlQN1FESHdSTk42S2FhQ2ZYVXhzdVd6RzdRdXpCSjRiL0IxYkc4aWF2bWtxWGRwN0JlZVBKWHVFQWI5U0dyM240NmZVZ3pGQVEzTHRjWTB3V3g3bEtrM3JsL0RJbngrS1FvbUlQeHZMeE9YcEU3L2QzYW9UMVd0cDJRY29naSsvTVZYNkUwOWpLc1diQ1hUQkpGV2NkOUo4T3FJcUUyMnVRM2tramZGUUo1SmhiNCtERXZWcy9QUEVzZjVuNERLY2R0TlFDY0xQQTAvbXlBbFFMQUVUUUdlZXdURmhHK2JHRlFkT2UrbG9mV3g5eXpNSDFoUWVXQStZb0hqZGpJN3FPNm1iMnhubFZ6SFFzQkc2R2VGbk1pV3NtVzlVQzl3TkNCS3dlSlhSamEwbFRCZk9OWU1GV3NsODE4ZVY0Q21ubzkzVHNudXJPQ0todCsxczUzN2RVeGdhbUx1b0dKeVQxRGlpSXN1cXRxdUpGV2E1amhTeVZpZlBVZHFoWWpBMnJPUjRaWkxKcy9RN1FuT1hPNE1LdmxrSmhsWHFPVzdnWkVJbVljQzBTNGdxYnBIcEl0bDAvbXo0UEk2RnREdE1vd1VadWtmZW1HVzFLcXlLYVd3b1FtZTl2VHJ6SkVMUmRNMDFMZlFwRWFuNEd6bVZRdXhmL080dlAyd0tYUjhjSy9YelB4bk9rV01QbnVtUHo4RmF2cGVVK3lRSW9JZ25LL05LS0wrKzRIZnBLZURwMG1JMXhqWEIremlBSDFKbWNYeGl2UUNGcUswRjNETTJ0SHFlS3Z1VWNzcXcvVGgxQVlZVmtmM1BWd2J6ZWFpRjFXNjc5VysxaC9OSHZOM245VEtjcFZZbGtqSE43SHZnaXpRUFQ2cTJ0dWFSVENITG9zaFB0RkVmYnJLOGxFSEZNRnhBVEs4eEZ2eVJUWGlxV0ZkbHVod2NlOEpIeUs0REhhNkVvQysvNWw1OHlJaVpUMjI5cjdhbnhSY08yOXpFVmtCZG1JbXdHSFBBUmtXYnhXMUVrSXA2UkJ4NnBrM1BWUGNidzcrdHBTNHNlK1htd2ZFSjlUUXFKUjdvSm55bTRjbU1HUXhtRjIyWlk0WUE4aWlQTFlNa1hDYzdLN2FNdjBZRENMd0U2eG04Q05ROW4rMGlzQVdqWGtsblV3Z0d2UGRWd3dVRFRveHdxeWo5amsxYXpuT0NmR0V4ZThPUGN2WmRXQU8xaU5zYlUvSVVPRHJYU2l5c3NWdzROSVBESUlTY1hqTE5jbEpjSjBjM1gzb2lXQjl1Ry95Vk9sZ2lvT2hmMHVqbHlRK3lXaHpDZzd2UXh2Rk5OS1JsNEpIZmtrL0NtY09ySkFtOWp0R1FwK25CbXA0UmlldVFnRUZEeFNvQTJJOEVZM0tlOVNRaWEvWE9VQWY5d1dTcmx4SVRTVDI4SUdKNFlVMnlVSkNsYldhT1RocWsxYnB4T3E1ZFdOd3VyTytFQk9qWXJwQW83bkJ6U2ZCcmgzdWlzTFBNWmt4K3dESUcrcFdERnVialIrQzlBODFJdkJiWmI1MjJndTdhSWhFcGI0Nm5GcWFZZlJFeUNObzBzem9IVE1KMi9lSmMzV1JOaVAzZGVaQ2xQNFYzU1gyK3d2SFJ3cXVBQnZjdlhsTHE0enU3Y2hyZXhmTGZHemNjVmV2cVlhZ1BvQ0oxNnRScmVDSW4vRVQrYzRPeGJuM2xmQWZxWndCUmFyQmwwUXRrdXBpRFptZWdZQWZIbmJCWUpnZzMxVTNRMVRXcjNBbW8zT1JhVEJmaGFNUnVBVzkzUEd1TU8wZy9VMTFKTzZLSFBKRlduZUhYMHRRbmNTcUZOSDBYZUZHSGpmdUM1djQ0Mnk4ZmFNODBybWVRN2NnWENWVlJFTWxxZlJtV3BNZ2E4cU5NRFhzOEIyRzRCWXhQNG9Kend2YW5PQ2ZVTXVjOHhodDBKOU96VG5Kd2thUm9nalBiTHhkb1RzQm9UMzdmZDJOemJHNTk0c3EzNTNoNXdhcHIyb0NuNTllTEFrTEdXeE5KWTk3aXNzNmw1ekZNM0FjK2R5MDRuZlZucG9ZMnMrbExuTEhySmdDZ2pJZlRzTjA5YUcyUXBZOFdtd0hFanJQcHFmZW9Qa0VQcStDSFhRR0srcWV5cmlyZFhGamZsSG1xNlNaUEJXMTR3bjJGU0ZlNlNMcWJNc3VpQm1GRk0vaUh6Y0d2VGJ0N1VuMm00ZUFpNVhGZzBHbmVLeSsyTHdZQlE4MjFweldDUlNadytZNkFNbkk4bXV4SmFLZkY4SkxLQ1p3dlBnQllObTIrWWRxaWZqbnVtNFZYM1l2V1N3bS9BWXFqUEo3c1VkRnJ4OWsyc3lzd0RNbU5qR0NpMVFpMmdaZDdoMWFNZ3lEbStqT01YY0pzNUxlUHFNK2hHNUtkeWxoVmJvdmJURS9MSHZ2dlI2QXRHa0hZaDBkR0hCQ2g1M1hyYkxCeUxHRXVnclN6Ri9OUHprMExIRkF0S0VWR0JYOTluaHAxR3c2OUo5RE50bzBaWHpSOHd4WHdNSDZxTnZXMDBtVis5RDVTRlc3OXI5Rm16YWtXY2llajdzY3Y0cmxiZTNGVStwN2FxSUg1aytiREdqZ3lJR3ZtUitNVWdoL3EyZDFxa1dZODdXSFNHVFdNOC9ZTlBOYjhUMGduQ2ZKalRVeWsvOFVRUFU0MkFRekMxSlhXR21oNG9hTTZMVmRCVzBjQm41QVI3bHpsWEM2Ukkyd2Q2WW8vUHU4YmdNZmpKbDYzRGcvb05RaGtlbDZFSnNVb2dCVnE4NHBjUndadTRyVFFIRjMyU3NXdVdlM2drYko3QTJTdzc5TXhnd0FWQXpFRjhlT0RQWWJtYWk5NkIyVEdleWVJc0pLYVZUNWt3UlRJUS9XYjhOWkNPTk5VWWdWVEhHaVJSMUVldG9WazRMUmxXQTBuZ1NLd1VneDRnR2tlZ3VpR1N5dlZVR2tpQ1FVdEFIVlhMOVEwNHloVHNENnpmOHBpdGhSQU9JcWxEN2pkYjRXSUpaQ1BrVDRYMnduV1ZMSGVQTjh4eEpjWGpQNHdCZ0JmTGVhTW9PcFdyZTRPMk9OOXBaZ1ZhL0tQVEpyUjN5NFp5L2FFSENmRkRQRUVTZ1kzOGpoV1ZiS013M05rWlhFUVFHbFNhSFcvOGlzZ3dvRkd4SmxjYmpwNDhHMGlXaFl0ei92aEJuenkyNlpOT1c5UUhnSndWSUFKSWxCbUdqL0tIcC9HTnlJSXBnWXN4V0tpMEp3V3czQ2l3cHhBSGh2OG9aYWZIOTR6dDlSNFFCTTFSRzZBUkFxVVR1bmhtTXZRUk5HZG1BelJLLzAxNitBZ1ovcVNWUFFpaGl5a21kdG05TFYwWGtNNVdoWXJudXFWTjVDbjdpSk1IdUdLWWk2eE9TbFJpY0VucSs5R0kvbjBCaWd0N3RENEJKQU53SFVlTjlpM2RzcnVDUVlDczFUcWwyci90WnhKRjFiSGxncno5bkJFTnhPckFRQkVMQTd1dlB5OEtTeTJTaHpTUW9JWHQwQjIwdE4xTlRoK0lNR082UWdmRmFWMGc3eWtFVCtPN21mSmlMeW0za0w5ZzZwTDdYbDVYaWNoN3ZuWTdXTm82RW9RUmdTcTVCa0M4WEhIeWRFYUxhTld0OWVET1cwRy9RSE5Uc3FNbno2NXd0WUpjU2d5N2JuZGRYczFGZkpGVFJ6NGU1b2ZNRGpKZ3A3eDh3UFpDd3RKd2wzcHk2L05BVkNoaXhGSFZPcDN1czNYMUYyY3BzZEtTOThvVFQrQWg5SHRNMk9NUXIwLzc1YlN6L01Fa2JXdE5YSm1YbDZ1M3BuMlo0RnU4ZEZFRkJCL1dmWWJQdUJyZWhkYm1OV0Zta1Vwc3RwS1h6N3UzNkc3ZTZYTmNiTjhTTFoyTTI2bVlsRXREL2hWMEJPSjBYN0dKRjQ4RDJ3NE1xdlFJMVlCdHkvSHBHYmhNSS9uN3dHT2x3c0llR2xWaHNKZGE5cU05SFlaVjlSLytka3pvRzB2KzloWWpUbEtxQVJwajVpZ1N5ZlkyNFN4TGZwWTFpSEJkMndzVGpZdmJlb3BBYnlTUFE3aDdtZ2ZHdXVOL3lsa3FoTnhoKzdabXFWQjNEaHlveFFMZ3lBU1ljWFdiYzl4a3FhMnk0bWRITXl0N0Ewdm5rTFBOTWVGSzlCT25sMktYSjNvcVpoZ0dqS29BcmdFemVsTkRvYUZNL0thNmZzOUhUa2xHVFhRYkF1ZEhjUnVyMmpXSkxwTXpNUlhDcEpjaDFBbnVSLzdmck9YRncwbzJsUDArRUw4bjBkTSt6QkZPcExCcDlmcDdpdlV6RlU1Snp2Q2Q2T200U2hzREVRRGh0akxiSnZOYUpGTGRYVTU4aklWY2lnaVIxMFl5S3g2QnY3Y210N3lWMFlrNy93TFZXTEo3ZXJWWlNCdC9ZaFJwSUtOcUw1ZzNNRjZINklHU1l2bUVwMzM4N1pRdWhzaWlXQ3Y0Y3NwTWwwOGNBTzI1TnRweFVoVytiQVpmVENUVmZ1aHJhSU1Cd3lES0JhcmluRlFYNWFVeUp2SEpIZnVVcXAwWTZnSjVOTUdubTc3R1BTVytZdXpwRGFjOGxGb2IyeVROWThtK2NQcXhNWGk1M3FzNzFhRkRTclVTU2JYWUo0TUFRSHhRM1ZnU3BONm5sV2I2bHY4VG9VcGNuYVpOVnhoaVV5M1RDWXc2ck42SHlqRWFaU0pNRGVkaVFtK3ROYkhQUlZvTDhlM3J0c1dtY0doZTRlVXVBVllIajNyL0VPM2xoSUZ0Y2pxWG93d0VoUWM4dW9HM1gxWFNtZk81andnditMaVBOYlBaV1pjMEhqdG9KSUN4Vld0dHFZU0lPRmdQdk9oTitaZGxrVVE3aWhSSFZ6L0t2UTIveTRKSU9TaCt1N1BoRVl0S3hFZXlUNC9XL0gzd21Na1R2eWZUSWh5YS96VFA0YXBjcFlYNFhBL2ZUbFRWTEV6WWd0WW01MHE3TG1tc2JPR1ZLRXM4Y2ZpMkM3ejJ3MEkxKzJENzlaWmVrbStLaHpoQ2w2bHRSNlAzTlkrajFGV3VxOXk3c21yOGRha0xjc2h0WlpYZDhLejRsWmcvN0F6dlcydnhrVnhNY1hUL0lCc3dwb1hUcFZPVzZTWHcrZkJJbWt6MWVSWHZEOFRBSXZsSXpJcVFweU83RldNekpaZi9JZlpSWjlJMGh1c3NXeVZ3dE5VOVBCRnBHajJuQUZjb1A1Vkg2aVVJZ1l5UkozTDFDMUtGQVhuN0dhYW1sazdVVHY5cmVqS1hRVFRnV0VPaUJlTHZzek1uMGtTeW1EVTFtOGZWRzNiWE5pMVhkMVdiVzdoQjFkMWJDcGNhQk5GaXlnOUNjM3RJVHNYWWwzcUlkTmhqTTR1dXBrOWpIK0NNaFF1ZzNVUnE2MG8rUy9XYlM4NjZzem1uWmcrTVdPSDRRZXBjbVNPVUFuWVIyaExzTnRDVlA2ZEtob1RjcnZKdzM1QlBONi9YcDduTFFlaEZ4MGpQTi9aOW5vVVgzS3M3aG1sbHV0aVJsZjl0aTRvaDltK2N2c3pJbTdDd1RZdVQxbjl6NGFDSWUzNWFjRFQ4RmNkVFNhNVp2L3psWi8xR2Z3RzRrdFMzTkdxcHlOcjJmcXBvdC9vYkUwajYvamhyR3dvLzVLV2xLM0VDNmtpd0hza0tBa3M1a0p3akNmcVB0M3c0Q3BGVEJrTjlvQS9iU0E2VzdPV2FTdzVOT1RSREw3V2V6MmQ4WVJDVnlCb0lXZjlETEVtVFpKL2RUOHVTVFBaRis3SHRhUXFyOEdqTHJpczdyTXFQS3E3djd4WHIySWpHYVNod25kYk05WWhzb3BHdnFMS2tJdjlWM1phTWVqYTl4SmlGOUdUU1NLQ3NoNkZwdTdFa1pPeTRtbHUvRkdSUytZQ0tJMWJFMWFqQXQ3RE9OUzJKTExhaXRhc3RFQmdpN3JWYVJ0c3BRTHhDZUJOUzlMcFBpSnJBYlRiK24zU2dIMG1Yd1J4aVZBMjVKRUUzb2YxeVRXdm5udXFYZ0FEUXZOTUVqWUY3bE44OTlMRFFxbGdFNzJZTkF5T0VVK1d0eWVJV3NpdWRUcVk2cDk2NVh3MXh4QVVKRUNWaHBDTHVNQWtjRm44ZHJwVWF3TTRHNEhkd1BhNG1lNjM2WTg2aDd0emU5eCtFT0lPaUNjdS9ualVFN2M2eEFzTTg2Mi91RHZLaHhYQ3BidmlWQkk2cHJ5NW4xYnBkdFJBdUY3UlZHTEpTUkZDU3NlYlZxQXVkTjhSTUxpcmxQa0kzV1RXbWQ1eVJaekdxd0R1Tk8yNVp2alFMYVh5Z1lleWJmajBQZzFZRWdXMjFzbzR0K2VvKzNRdDh2SGEvaGV0dzY2bktkZUp3ZWlENHkxZ3M0TVRxOVBzY0h2SGl3d2hVamMzZk5ibWJ3dW5nT2d1dnprbzE5dnMwVTF1SGNSMTltT25qU1N3U2tvaWlLeno1N0RyemJPODN5a2NvcGFSNDE2bmN6eEdrL3ZQVTdNVUpra1RLTDdxYWI1MVJlQ3Rac0xFdHc1OVVJVHZZU1hRUzl5eWZzNWY5eEZ0c25PRHpTbG8rV1ljSnQ5VUx4RGdkU1ZSbXpCL2UyYkRMVTg1RGVkRWlPb3NYTEY1TGF5WVdlVlIrcVUza08vT1lTdDRubVhxQkdXMklzNWVncFBMMEUyRlRURDZUN0tRTmhPSGNWOXM5SEMxWlBTL1d0RnJRak1sMGpjdDdsamkwbEZqd1BjUzZic25ielVHdVJrQkFGbWljUXltTjlNMVNSaTFqTkZSVk9VVmRzWjBhNE1KSVNISFc2MkNmM0tHanlpQW12cGZzM0lNYWhqWk52Z002Y20xQWsxS0dydHFLdm40TDg2N1MzUFl2Q3EyNFBvbGZNSXBZMkx1anloZW52VHBDL0k4TUtpRDEzUmUwQmNuR1RDWWU2SjYwMDB2Z21ZdTQyM0dTSnllTHVKZ3cwR3dZdGtsazc5MVEwcXpibkNIR0UyU1BseFVrdGJUbDNIVUg0YzF5ME5CY1paaDVoek9Gd2dzaXdtZUFvemF1TDNIUjR5WEkxRTZtdHI3R1gvbERGMXg0dkFwSU5FaXFWR2crbUYrdmkrR2huYVprMzkwYTdHTjRrVjVNSE9aOE1waE5VSTdoelJ2UkpHNUZBcGZHTThYa0RzTEc5Qldtc0pJRHZ6NEZXQTZUd3I3U3NOQjlkL3ZKak5RbDl3bDM5RWQzcXkxN2FhQkVVc3dXWVhQNi9pTVh5VFRGNWY4NmpXaTk3dCtDdzV0dHIwWjNyMzdaWGQ3emJlcGhTcEJiaGhMbHRoN3Q0d3oreHhDY2pqM3NKdXF4NWVmWjFQZDNxRWRKK3ljcVNvWTBPUVZNNHBUdndEZGYrQm5TWjJVZHVpNlUzVGt4OXdPamZpZWEvSUtBOGxPSERUVmF0ektCWW5JTWF3NWJUMGhMVmVvZER1a3pPUFBDdXJtVjhQNG9PUXZqczhZVGxxbTZkZytETExDRFgzUllpRlhod2hYRllTRnFCZ0VqN1FxRkFFeVh5ZXBmT1VyVmlIY1ROWW1mUDlTVTN1Yng0YlBWM0s3SzhrNTdJQytnaStWN2NJUTE5a0dBdEZ2aEs0Y1NZdDBYSzJWY3oyNDMyNFBoVEF0UGtQWS9VbkwvaERzWDRpY2prc3JtKy9ZK2RlTE8rK0hkSXpPSGpXUVBsTWVZUTBtdWFNQVBDK3pxK2VQd0Y4ODdCYkJKN2lnb1dBMHlZVysyQlF1cVVnZTdWMmRXS2ZWNnAzb0dadkowRGlEcjNKL3JuNHNJWnZpVHNiOXRBSUZBUklWYmxBejNESzFnR1Z3bWswZjRhU1hmaWhWUEIwemhZS3NQb1BtRDZQOWJvWXcraFVaM3FueWdDdmlRTlAxSWdMbnk3RDNZWVFaUWhTbVlta3FLVmhUV1RlQk16TXFMbENVcUlicUN5MnpGZDhYcSsrN3ZQWmVzTy9QY2N0emZ0MWxyZlBxS01IV2pndko3TTIwT2JnVDFyc2wrQUJEVkVVOWdweW9BMEVaUjZpTnZRSWdqT24wVmhZYURZdG5hTjVIZWhLQjZMUDk0MHJINitiMHZPSVBWYnVza25DYkFkNXlodDgyMHMwT2E5VUNwbG1YT2libm15T0N4bVBYam9xS1NYWDBsZWFWWGZ4bVh4S0loaGxIY3dzZU9DYmthRzBwY0lyOFZrOSs2VzNmdDNKM0ozcEhRV2JINXpVblJqSVVXTjY5VzMySVByQzQwZHpjejVOMzJPQ1paMExOM0FUWEVtUjIyZVJpQnpzaEsvNEVDNm1oZzFLdnVHMzlzUDFGZzJBZmN1UVBnd0w0VTRXcmNiVHNSdVIvamZneUdmTlc5eTZCbmJsV2JIMDFWUU15UC9NaDZrckRISUgxR01PM1lyLzl4WXhUQllkRWZXUUhZbG9CLytWUTBmWjFJVEd5eDd3UjY0cnV0VkxuTURNUTBPRlV6TXh0VUNra2l2emQxYUMzRUdCTllPQWVuMU1UbStQczVLSjJmU21wRkZUSHZWQ05wKzhwT203dDZQT0NaY2p1QVRCdWxwWkNaMGw2cTJ0NDJEaEF0VnN6aGVLbGR6eXRldkRJcGpUYm9Da3BEMDVuaW1XdHR3UUFYUzNhQldiSEppTUFvdXNnZHNBYXpGL1pBMWNOaGswaGxvaHVTVXBYalpGUXErWDlPZW1nSWVUQmowcHgyaFBDTVdQUGwxdkFOaGJ0YWp4NzBnd2xWdGVLUlEzVnlmVFdveWFoWWlFUE15MFR6Sk9hMVBFN0dmekl0ZjJ6bmxZdUg5akFFdGtPR2Z1SWp3Y0I4a3BPMmdZb28rVUVIa20wbW9mdGQraHBHWG5VZmJNRVZvYWZndUZ0YWhEU2xqdGVHOUNQVmtsMHRxaGxKTlBqcUR6S01XakVlR1cxQStMbytjcnJNSlNqWmFGUjRLYWZuTEhoL1pEb2kyK2p4eHNTdkxGdGRaazRsaEhvNlp1ZHh0azFLMmlUeGRXZHJBMDlndlhscW9yM3ZzY2FieWV1YVdDTXM4M3l6TWtTYjlsQXAwSWVkaHNDUU1HVjQ1V2JjZnNVSzJKalhwOERLNVNZYWFsbjQvTkNMekpHV0c5OFlLSFhLYnJoUjJjVkNwbmEzSGdwZ3FFci9TVzhETHdPWEhQVUhBRHRBQTBQMGV1Z1k3M1A5Skp1ZEo1dHBCaCt6UnVQU1B1d2dqYU1oWG92MUw0d2J2TCtlNDNFU1p6eFAwN0hqU0lCbWVsaUtWS3g2c0ROb2JtWVhydEszY1lZeUU2TlhtTnlkZEZ4eDdLZnNTYXIzU3RLMEFyRENxK3B2QjlhV0VnZ08rYlBCTlNpVnZ5RVQvZDJZaVczS1haWHkzNDM2Tzc0ZWRqazJPaVIyek5lM09GbmlrSTNpLzJaTHJKeXc4RVlGOFFoUG0vTndhZ0ZXK2lESXE3dEZGODlEMjRUUlNNZzNMTmFPaUZxL1V6d2Fiek1hVWhYcmRTaDh1YnNNQjhmcDZERTVyOG9YREFPNUtNajFSSHVoOU96UjV2c2h6NmV4KzVGYUhlYlZZaDNXVkVEZHF1RU84WmRZWUdMeWFFVmwzZHJ5TWhXNEpMYjgxcWo4NEx3ZTRIRWptUzdaZVA5R0g2Q2ZHeFQvTC9peHVtZExjeGJxVzA4Z0JRRkdPTzJYQTNaSE1ZMURId3NkdUxTcUdiV0V0NXIzSm40ckZqMlI3QXcya0w5M3VaN2c4dG1MRWNtSWk1YmNMaTRuekhzSFBoeG1oWnlXN2ZZSkp5NE84aThlUDJzeVZlUjM4QWNGZjJSQVNHc2NaQzlEYnJpWnJERjI0bXo3VlRjRks5d3VVMUx0WGZReUFva0dSU1hqN3JBdmZhRk1TSDBBR2l0cklmVWNKUTZaK1ltRFRSdnA0d3JmaUFYQ2sxRXdIaGlOc001SUxXbFlqV2pJSHFIa2lPVzdhb1puK3VHUUEzVEdUeGQrZUdOV1JyWDdLazh6WW05Tnh6TkdFMVFkMkxvRVcyMXRwdkw0TVJ2YlVWK1o5TC9ubWIxYUxFbW5GL1M4RWx6WXlXcWkxWHZYZjZoNUhvbmxRWVZib2FhdW4vVDFjV1ZKb3cwMk5td3Vlc2o5TWNoM2lMR3hGcTZadEFHQkRRT0Fva0RmbVJENTJNNmgwMG5POTZub2RJVlM1ZERmeDBodUsrVmI5cGdTd0lMUWgycjdPbVV3QUVYL0ZMbHFZc3Y0ekVNTjlJb3VEV0VkdEMzM0JSWU1aUytLVkoybE41eERJSlpreEhNTURnMktMZWRNNlJmeEdncy94T0pJWktadFJFWEI5aUZtNHZRR0t4eWV6bzlHSGlXM2JpOFVNMURhVHZTTUNHN1BtdWdyaCtYRjZjeUlRbHNEenF5cFg5SjF5bmNVZzRGMFRKQ3JqVStWSDJsTDNiWjdENjNBdHBTMU82NEZOb1dFRXFHczFwNVVuY0x5aFFkRlE5ZE12bXNnOE85ZlAvOWpUM2cwQ0ZybCtEVm1QK09waHVZLzRVVW9KMFR5OGx4SnpVOUlJUUJ1QnVrR1FIVGJzbnhoN1F4TzY2b2FsNW9xSStlUUtnT0hYcTVJQUwzeGU4RFhEdE05U01jc0h3TU1KZmxQdDZJc0dFUVUzbjMreDFoZ3lHQkJEcXRiRVlSTUFFU2lVSjJuNVBjRGh3RnhvRWU5aFJJOGd2ZlpOaXlva1ZsUWpqaFlCNzNvOG9zaURFSDJNQlc2QjVDbmNuOE10WFc5QkNRVkNBaVIvbVI0TnRFS2EvdnRyM1FnazBuVzhsRG5SeUE5MUZFZitiY3NiQ3BqRW11RnNKL1JCcHFwVnc1eWlNZjFXZlhicjVEU21lR0lSejg1dU5VWnhEcERsNTFRbEMzNGswbVYvZXJSUkJYTEYrWmF6bGRIVG1lODIrUlhLUmlrT2JxOC9aMFc3K0twb2QyNzFsQXRlK1Y4czhwUW14SE1ZWHQwK2pzei9GT08waEtjWXJpeHMwaGJhR0JlMVF4WkpBbmRDYmZOODNuZTg5TlpDQ0gzNy9nQUcvcVk5UTZCZlNab0hwdmJPSjdwdGtBS2VOM0p1KzdpcEExMHN4TzZzVko0d2dLa0VoQmU1czBpTExVdHB0cU1NRmtscGUwUDBiRGJoZy9OdGV0OTFzMlF4aStjSFNkR3lqcmpOTEp3a3M4cGgrd0RFdjBkMGRKUG41VTF4L0pUWXZTQjEzRzFCUGxHV1grL1Vnbm1nYmsvb01HTnJtVWx1TmU1ZnlCV3NsaSsrSVNYOHduV0ZuYlUyd3dsRHhPZXIvNkFJU3FYcDMweGVlempRcG14V3g4Sm93RXlpTEI4Tnl5MTd6WmI1Z0JZQTlDb3l3bmlGeGtrdVZ5UkRadlo1VVN3NUZ0K29ESGxiTTBSY0J1Mi9NcXFsQkZTcHE3ZGFMUVVJeG4zcjFNUXJSdnBiR3FrbHJzbElVVm0zci9WTTVKa3l4QTdjb01CMkRadWZ0dS9QUFgxU3BYSTF1dlVqcmtiUGFUR3RLZkNkYUJlRTU2RmFRTUxBVkI0b2Z4b1ExcHduYXB5elBNTmJGQmJvSTAwRnpuQTJtOTlxVGV1MDh2b3YvWlpQRFdpTnlOeXFpMjBpbUNKWGZtVm44bStPMWxrQkFrOEMrb0VzbmUzRjMrMzJOZ2l2dDM4MUVmMHM3bGNXaDV3OGMrY3FDeUlFNEU1bEN0bmpJL2x1cDdOdWVPUnFCMnRycnRNRWgzTGNMOVR4MFJ3RmNiMGUvOW0zRnlqU3NJRTkvWWE4NzNkbUVmYkoyZVhIaW5VdHdaZDd1eEN1VzhtYzFuMlJBbjNEZTExVWl2VG0vSnZYU2RCQzRaMWVrSkNGS3JCNW9MYU5mWlUra2ovUzg4eVhHcWI3N0ZncVlXNUJ2OXZsVmVGTjMrQ0NKQkc4S0pVSzEwVTlNUDZKVkM0VG9RaERPekRLVWpQcmxRbzBQZmRITXkweFRGZlJoVUFkM2VnMUtvdmVSd1IwZEprM1VPbEdVVFNpdWEzeFdmN1NWR0FpeU9aNnBzcUx5cExhcHlQbXBGU2ZQVmIxR20wNjRSY1hnUWxxYm9mUVNGOHE2ZlAvT0VGdHNDTllOU0hnSFI2QnlMV1NaSXM0eGE2UUFPN3h3OCtoTVhNYzVJU20zYUMrU0lUZlA4ZEhPaXlVaTY2aVFPelEyZVhUNXFsclJJdjQrWXhFdlRnV2t6bk5CNWYyVEZvbTdmWW1LUE1zQUhiWDBGTDVLcE1uVGF0bDRRc2l3WHpoVCswOVI1UzlmZHlaN3VRR0pTZ0t6VWpPVDRBcnVnajRSd1BEQkdWeTdSZmJwUmk3bjJ0ekdIazZTZk5VbmFLVEk4OFlETm4wZGVRVUEwRWNBbFBnVk1SVnYyN1RWcWZDZ0FXUGo2MC93ZFNGTStzZEt1UnhlNXQ2WkRGVXQ5V0pmanN1NFM1cWRWNUlDL2VrR09mN0NIZ1ZQOE1CZ3oraThTM2ZQQy8xN05hMFUvYzYzTUp3Qm9HYnRPVitwcklScUs3Q2s5d3lMVG1jelh1QnFOdDVFcVFyejNGVk9ITWJySFh1RlZ0K2JEcnJZbGJwN0VwZTBjdTNiSE96UG9iVDZ3UUI1WW1CNGpGSXBCUldJQ0s5YXpsdnhHaGNwU3Z5WithaUhSQTYwZGRENTlPdTI3VjlEWFh6V2FONnZXS0RHbE5VMzZ5ektpOEdxN1JJMXRiZkY2Q2xna05uU2dUZ0dsYWlWZlphTW9GUkNmU25aR2ZkR01tUXNEQ1ZVWHJ5TklnQk92ck81WDNMeC8yN1pOTjJ2Rkt5QVQxVlI4OFB5YzJyZ2lFVUJqR3JxVXk3WjFoZVgyanc0WEU2eDJQVmdhNWk0Uk51c1JHZkpBbURPa1pEbTAzVXpBaEhPNjZuZWExSkhwOVZDTDB3a2JheUVPWTdDQlc0Q01sbGZuMml0ZFV4T3NZNkhjTEppRnFLS1BDSUJvaFZ2dzdGMlFvTkJ6WFN4TlhJSEc0OXNlSVloak9ZOFJ1d3hjWHJ0eDVmUUJOVERFdG00UENrWmE0bEs0T3JBYnV3Y1VXNnp5RklqNHFnbFNsWnlUT01XdFlSYzR2U2NINTRvMnNDbG9ZZVJtZVV6cFR2NlhISlZZMTV1dFdNOHlaSkQ0Q2tuQTBmcGlCUmVSeGtSa3RIeXpDeVlSSVRLeUdhVHRGb1hmYVNWYjYzbHd6RHgxZzJKR3B4dXpIYWV0M2RUWjYrWWdJbWJMN2NSNGhnS1FpWDBiU2tUYVFtQVRuejNNSUZWZmNuYjJBbHZUZnE0VmpaODluMnkzU09zbEVPR0E3UWtvV3V3ak5pZC92empRRUh2akpNUDJBQTBQdFBlSW9PL0xtZ2s2UXhVRVZ3aWpQU210b0dyaHFrWVJTdUg4TytYWXJSY3laNmc3WDUrVWVScDdVdDI1dTBjOGIwanRLSnczcWc2bXh1U0loL1g3MDVIaVNlMitWcTlJK0t6clpWTFJMdVRIQzI2cHIySU1mMEVCRE1YNERsa3hlRE16K1R5ZjFVZ256NFRHMHdmUEt3dWVCbkI4VENQWFB5RjFuZmtBZWY0elNSYXY5aGhxMDRpamVvcjh0bU9nOG1GTGhjSFpnTEN4OW1MOHZ3RWdaNjZudDBGM1ZMaGhWS29OdSt2MFJtK2JLenhGSkREUlBPNW5DRFB4d0FrQ0czNTJvQ054VGk0eW5jYS9oWXVnMkZvUHF3eDl2RThlQjQzdVJNTVo5RUZvVjNrUEwyOTJId0ZsanVMUVF4bVE5ME5FNmJzcUw4ekQwb0xzTWV0bnZPdVVsdWRmditZUHRmcG5PQkljckRMbkdFMDl2UWh5dnhlUmI3VVBiNFZYZnpIMG5tdXRuaSsvYmZsSk1yS0pMOEhhbTZldk9QU0pUdTMyS2ZHWUhEMGdhWUVuQ2FjQkVHdlRSbW5mNDNOaEg5ZHJLU0lvQXgrUXJNVG1CSGVQQ3RyTU5rdDlXOHlsbFM5ZmMxTU81TXVweWgzYVU3amZNVldOR2t3dmdHR1VJSExWaFdEMGN4bzIrWEJwYnRFNURzajBQZVd4ZlVLa2x6d3h5OGdPMVdhSjZlaFJOc1VqN24zdk1Edlg4KzYxMDJtVUdxd1FYSU1ISjMrWWJ3UTc3M29mTXBTNk1MVHZRUll1SWd6RDRuWUJQaEpmL0dwV2x3bURXRlppbUJYNmdKY3oxQ3VKczJhNWZDaVRyZ0E5eU1teUlyV3R2NVpBOEF4SlJ1cERaeDY5ckxINXVSWll2bDdVcEl1N3pYUE1iL2drbmtkdjRqaFpkanBnSnNMVXNDNFBEa2VzaHhyMW4zZ04xQUx4QUtFTkNHdzdlNVozVlcyd2hjWXFFS3RGYVd6cXEwTWh6MHB0Qy9VcWphUkxGWXM2M2NWc0RsOXlDdUxQM1MvMUU1SkhqK2JmOVdGczZzcUVLQysxN1ZDZlNNOXkzN3pPRU4vQ3ZvUkFxYit3TjBGeVlrMXg4VXZkd3I1VGpVTS9wRzlMZ3NMMVkzTjExQkhwQ1dteXVuT0thWVJ0V2ZILzJoblNGdi9uR3RmZEVONUZQb21FNG9iRTFSOVlPK0d6QXUyR3NVcjNHdEVMeEpHT3NZOHlIMXc3WnlTaktPOHJZR3c5ZDlEQjlhKy9zbmZ3TzdiK25kV2J1MFZRaHVKclVnNC9YNkhQSFpjemd1TVZndmJkblBuMk5WcWltMDRwTUNpQXp5aXUwa3JldERSMWM4SXNIenNlclBFZ0ZaT3NLcTVZUFcyWkJGRkd6Z1VwS0NOQ3A1MERPZDdUZVFPb2dER3JRQU5INGp4UlZobmp2YWZ1dHI4b1I2MUhLaWh0bFNJOEkwUGZreGFVTXVrWVA5N1hVMWRNTnZmbXZpQ3ZEOFpOdjRvNnFZcTF1b3J5eEZRbFRDdnBTeXJrTG9MWDV1V2lzKzljMFJsYTBBNVMvd3EyaUV6STB3ZVA1YUFsVmZPMEZDcFJ2ZEdTdnJjN2VBQzlVQTQ5QVhyZjFzeU1SWFZ5RHJBUnI2SUNOdE5lSTdUMW9iaFhNZllRa1NsQXdMK1ZWcWZKMGV5Rk1mL3dOZ1dwWEFQajQ0SGMvNWNtMnIzT0Zqb29yUXJnU0RCdUlFUXVaMnVpajBtY2lXSVpiUWNPT25xcWhKUjFKTG5TTm5nN0FWY1Y5K2prc3ROcUhES0kxVmZ5ZXlqQXZ4QmhBMXBBVlpsWGhYcHV1N1FWSnROcElDci9aRTA3bXFUWGNuNk9BOEN5K0FhR0xkR3FyeWR4N0oyV1grdU9uS25JV3F6WUhIK2lYL25MUmFBOWZtZjhRTnRicDFLRTlEYXU1aHZUMlNPKzFJeXR0bTRuNk03c2FDbllhaTdtUG1PVUFtVEhIWmx6Zm5EUlFIck1oRFFFTFV6cVA4UkM2eWNvNU4xa29HZzMwdDBFN2tJZ2RlU1hsRDYxampNNnBHTld4a2tBWmlKaHA1MWduN1dtVEdnY0txV2M3T0Q0TGtkWW9xMk56MGFZTm90em50U0wzSGNRd0tMRzkyU0d6MW1GTm5TWHpBZGFjLzI4UzJDdXNSbjV5OVA5VlVGNDR1bm5zOTB1TE00UnFOSGpiWDQ4ZkdYTVRCdmpjWGwvd0hNYWxHQ25OWDF4QU5SVjZoWUdxTGxFRGpxQlBIMVloYURYbVB3M2lqUm9SaDlWS25yRWtXZ0Y1TEJRMGZiSzlHd2FQYXJnaDNNUnZFSkw2cWpuVzcrbG1MdHNqZEpPMEc4N0ZSNzFYd1NTVEVGOXNTWXhURG9WMk0wdC85cEZwWjIxQ3VYNHdER2d2ZDM1YWRodGZSNEcyb2VQSW0rN01iSEVQdHdHRUJMVzIrNFYveHN2TDNEVzR5c1ZlNUNHNHp1YjV5OG4wK2hnZTJ6WmpUMWZuS200MFdlUzZONCt5a0FnYWFjQVJkZmZub0hLaFRXZWwyMUNRZ0Jld24vNUNRR0EwSVlzbHEydlZhVXJ0OWd1N2JzZnhnVEI5YnpRbXJrazRIY29KZU1iRnVXN1Z6TTZJamNzSCtNcDhHcXVaVmRGZG9vMEtHOWplSkQ3Um4rV0hGcEVYaEtRb3pIaG1tZzRBZTFVcStiTGNhUGR6S1RKRkZOUTNxYnBQQUZWSWVzbEVPRnRiMHZ1MFJJRnJVRG9OOHVvUzhXc1JLNG02K2N5dWVoeXNyY3Q5VWZTZVFjMkQ1Nzh3Qzh6T2hHNis5ZkVHaDZ3UFQ4UlpJUlJrUGRBSkV6YWdZS250SmFibzRzMEFyK01hRTRkdzZxdzZVZEZIa0dZQkRDUmhmeWdVNUtmS1lrOFNXOVVnZllMbjk0QjMwTFZ0M0ZObHIvNk96MGFBd0o1eEQ4RGE0dFZvYWtQL0hqemZPYjN4UTVqSk1rc015bDNXdjdCS2Y0ek0yVkJLRXFoeUJFdkt4OC9yaGp3aGVKOFhtQTBYcEhtVy9Fckw3N2tyemhRN0VyaGExeWdmbUw4dWtFMm5GNTJVcEF1MHV0cUMrMTRBaXJrUlYvVlV6eElHLzA1ems3R1lIZXF2MVdDQlljQlk5VTFQQk9YVWJjTlVnT3FwZHdJUHBSMHNabDZFZ003K3hhRExMd0xBVVBwN0RodjluVmJpYWM5aTdoKzFjUUhaZytNVGYwYWhPdVVSdkZyTEV0R1BKUWV2UTBKSjJsaHg0U21PK0huazBxSGRVdlJaenU2eXNPc2JzWWFweUE2a1JyOTBYN2FROUxsdGZ3MVI2N1ZrclRwQTVrV0oyc0U4dXpuVkVEb2lpQzdkayt6WmJRTW5lRVpMTE16SmNyWGRmbDN6OEkwM3FKQU03bENuaTdISDdzWUR2ZlNMU1pFSTlrTmJWc21iSkZHOEh5SWFyK0d3d3FBVE80V28vaVJ5N01IN1VPYTY5cmxSMUxEUjFNRTBnc0NBSmpTcll1eWI5TzRPLzBQaTlFWEhtSHJhZGZhbEJpRDl5VlVESTljVEhDOHV4RHp6ajFtQlNRT1JjWG1HYWZJU0w2dVNUbWM0WjNONGZSQVIwaFFHR21hUVdzNGF6QkQzK0dtVmh2SFFRYzIyc3hCZHNmSk05U1JlRTFzZTcvVWUxY0tUTUl2SjZkMStlL2xsZGRkVzFiUDQ3RTlHNnY3Rzdtc2c4dGczUlJrSm9tRzRKNVR3K3U1K2ZyMnpJV2Z4bjVsYzl5ZmpqbVpOcGtVMUdTamhKSWxkbUdkbjVMRUFnd2Q3MVZzckZ4c3Jld2NxRnVkOVlROEVJVThlRjZ1bDk2YTl4dzNDditRKytWVzhwdzJ4TlNxQzNmMVB6bFd5Y281Qk9TM0ZxeU0vaWpyRkw1RFpMMk5BbHZhSzZIUCtqWWJHR2RsZDZPc1JORldKaVhGS0tjZE54QXpNeWRidkJzVmlvdnZTcjZBT0l6YndSdHZzM1h3V3hOUlZWcncvQTIwOS9WeG5URGRPNjdFREw1M2lnbWNZSlY3bW1odlJZMXRNTzkzendIUWU2ZDBqL0c3Z3FFNzU3Wi9OWHAzNit6bzcxd2dydTIzRXVnL1pFanZFU3NrUmd3S0RxSDdkMklwZlRVODFVWmhjWmw4TFIvdUVBMThWSWtJL1Q3SzlEd212UmJkNnM4M1dVZU41ZFhBYnZScUExYVd0TFZocnNHUXg5RXd3cU83V2ZCOUVmcDNUb1EvZklzcW03QXJrekI1NjZBOVpCODRwV0V0OXFnbzFVVXdLMG9mM1pXZ0lMT3lVc0lDeElCYlJXSllOTVRsRWYyVmQzTnNmVnZ0MWFJR3J5TUJBeDl1d3V3OEQydnRpMlQ1cnB3N0s4Tm0wOGhrUWxLbmgxelpJN0RTSU1RRVU1S283eTVSNmpYQXB0bitVTkNZV3pPZXNXMHdEc0dPdGowZWdwTm9Ha2w3S0pWdlluM3ZiTkJieHZCTEJBT3VYYzlwdGxxTnEvVTJyZnI5T09saWIwVnUzaGVQRVlmWHFCUkJsMGM3NWtPZ0E3M1BKOE1JZEc5N1A1VUp0bkRNbGJudUltSEE4YVVITUFHNzNEU2xjSnhHbEw5Q011YXJqV0ZWQ3lXKzh0UTlqeFRKUWZndE1YTCtjRCtoK210d3ljTjgvNFFvYUIrT2J5ZjJSbjhuTmpFRTVyT08xZjRCcWRpQkE2UE16dmRid1lJOUFRQVZwNEVHTTNCTVB4VFlNV0FwQVM3REhKZmZWcVg4eDUxd3ZFRXVSaHQ0c2h5OUxEQTQveFBOTW0wbzBxN2hBRmd0Z1lieE03OVZqK3NyOFRhSlMrMlNXMGpyZExhLzArZlgyS3gvK2M1dFFMREFzMDhJVHUzbTBGSDNZSXJiWDhUKzcvRmZUZ2xXd2lmNGxvaWpyaGw2TWljQk9xNmMzV1llYUcxc2VHblB4MmMwK2puS2VLU2FWMUdhKzcvMXNHOXBralpxbGFLUmxGWjZvc2pJMlhnTjJzNzcwbmxNSmN1RXBIQ1FHeG02YnRTeEVkbllNZ1RlVGcwRCtnUUZsMjdFRVA2VjNSeU5FYzhmell4ZmRyRkhyaUFoY1RtMm8zVUdHL3NMWWg3MWtlYlk0VDBzKzMxTnA2VUNzU0IrNU5JbFdDOUhyWHpCRFY2UlROK3dQSzNJVkU3RDR1dmNKSHBKaDl3eS9vRG1NcndwNzB5Um8xK3M3RmlveHRGb3l2Y05DVm9hTTBNbjI1ODB1dFI2Ni9xcENKMjByZEhsaU0vMzJaQmpyU0toUnZOb21rVFVVR3lNdndmUEJsck13RmdlM1FWeUcrQXhVZHdianFBMjBYZ3RMTGtNV2RCSmphNWtDdytYc3EzK05YVERJTTJCL0NrNlk0bzN5Q3laazNRd1B1ZVh4eCtGN3VsSVFhaFgwK0RZK2JPTkErQnpScGJvWlJIbnRiVTV3dzR6ckFwdlVSeVl4MmhkMEtxOVFCS3JsM2dxZ3M0Z3M0K01vRTdmaW1aR0pHMTFHbXFEYk5XUzdLeDRML1pVMTc3bDBJQWlDWFVjRllueGRYSnpPUVBzWEI1OEVweXY2WnhoMmlkQjJRczYxdUx6RVpFeUNIb1lYaU5Na291NVA3TGtJNGo1VXJMdElienoyZDJtSlVOeXlGcDJDY0RBamxnRFB4MmYyK2pXcnRsWDE5aC9QTnJxRlFZQjVPWENRYmZhU0psazF0S0QzUFJwYXM0Nm5iVlBOaFBDWVdzMkMwRC94Qm01UGc0T3lZeVNEb0JIaGZhS2hXYlNpa04zV1BGczBhNW9YN3BwTmN4cGNxRjlvMWZWeStlak1WOUVKK3RGeDJFVnpnK0RZTjdET3FGalhHQWZRVHFLMURNY2pkbzJTQkxvNGZRZVZsVSt6cFVHSXdhTE12WDZWYlcyenByd1VScXlwQUlRL1hjS2dFUzJ3bDFVY0VQWUswUEw5S3NacUhuTGxmRzhzdWhzU3gzc0d2MFZESnFGMmM0aG9xcG55TDNPWXI3d1hNWFVONFVaWDJqZlMveElTNCt0TXNidkpiRnFwWUY3MDdPeDlsZnZyVjQ3bEJHZE5qNzR3bHlVNXBJd2YxdExWME8xN2xKVk9lUE5INnltZzBTdDBPNVBMdm5JMjBQRnhSTVUxV1Boa2huMzI3WEdNL09oSVIvTmg1U2lPcjJiVkhhSis0RzZ6cWY5aVg3Vk1WOVhzdUh5a3R4amVxcnpVOE5kN3lHcnZPNWN3RmdlNVVCcVF5K2ZOSnBRU0NiZytyeFFuVlpobzdxSmowR2JoaFhIenB4cHFrMnJrdVZqTXhGUktnNWEwNXI5ME5jdkpEN1BmQzhGT1hCNDFlbGxjWHJxSHRRQ1kyV2FOdzBEQ1lUbTZnYUJjMmRHL3Zodlp1YmJzTTl2S3JNRlltajhqdlVQc1RzaWJvM3ZQdUppbFIxV1IvZ2VteDA3RWE0R3ZwRHVnalVhbWFmRjNEaXZSYmlqUWtNaENzYXpacFVsMDk4eEs4SWNYdlpZVWNEYWdITk9iNWJvWk5nalI5RjMzdmtmNU1YRXlzM1hsNmJrRFZmZlRUWk1FNTVrRmROTmt1VkZLRUlEdE1PSWZjY01wb1J2dWxTTDJ3Z3hzekVlUFBqMDNUVm0rNVlzTEp2M2FvUm9FUHVVUEZ3RFl3ZXNkS0JSZ0FXZnp6T01lbUJYWlBiVGdkMzdhdlpjM05KZjNKWGEzK0FpbkFiZjl6eVhvbmt0UkxGZU9hYlUxT3dnZlJ3ZjJnN09wOHlPSVZVVXFXWFI3RkNWaFBWZ1RQN2UzUXJtMUIzd3NxZGJBTzE5bHFyb3Z5dkxVYndGVkJnbHhZeXFObHlVNlFQT3VnTm5MUHg0dFA3bUtnN1RJVjZFd293MS85UHZFVjhTSlkwREZBWVJ3cnhMdDVYSUZmYVZQQ01GWFMyZDI5SkVGbWhhdFgyOFpjZjRGSWErTk1HRkQydGk1c0J0aGExYjFJVlBmN3ZDYkZ5c2hWcWpuTElRMmwzUERMVmI1WFpadkpyQ0h4TmVFODZuWkhCSTZFS2EvTEFPS1VkWkRCZnU0ZHJpM0lBQWo4a0ZBak9kZkdPWHNZZkxybk5qSE9SeGVzcnpDekplRUxnUGhOSURvSkZSSkJHWkRoRmdJT2VtVnNma2QycENhR0xJUThQT1NpMnczZFprazlLallIZytDbTVxMFRwZUIrZUorU3EwbTYya01JekgyTXVTLzhvZ1NtRmdTMUdSSHdqNHhabkJYNnZUdG92eXVDbEpRNXV5c1hHVGQxWFBJSHoyZ3dnK2s1TTRCTVVLYWc5ekNtUWdhYkU5TTFxVExZM0w0Ym9MY0U2K1JXWmpXbnZDR2Y5aFpmRmlZSmRDTTRGMGZUNlUvQitHbHRWaDE2NHhWTlZLRDFCUEpmRWM1SGRsY2xPNzFEZnM5aXJKSTRQdCtaNnpaU1NpY053L1dXRTlScWJ5Z2o3MXdqWnkzVldoOURVS1ZwMnZnQWt5K0FhRjR6NUNiWmxwbGZXRUhoUkhsQmFCWkQ5Q2lBYWFzVW00ZUVUa1U0QUdiYXhwYlBlc1FRV0RKT3VCdVN1S0Fuck1tUU9Ga1YycUVsNm1KYngrSHZpSzRXaTcyZDQ4L1ZJMFdHamlGM1FieEQyTVcydDlYc1BlTlFqbW50cnhhcVJEdStVb3ZGS0tWRm1rTHdpZy9McXhOanMvaVB0T21ZbkpSY0ZHREV2aUpYK2dYQXE4bVVCVFhReXhleDRrcHdGMFoyMlhxSFJQSUhXWWZvbXQ1aVBGUnE0aVlRMjZwOFBVeFJPM21XOU9ZaWY4R0lSQ296aFhOMjFRTDUwWHI1UkRadVFRTW9tMnhsS0R4OFFhYWd1NmoxUjZQbk1Vd0owZ2lydWZvTDk3SHhRZ1ZkTGU4d1lkamVmdjIveTN3d0NDU2o2Q0E1aEljalJZTnNvd1AxRXZUbTBQS21BZit4amtlTXVYcG9sVzRKUXNDcFVWRW1tZnJXSlc4OTB1cnh6YW5jYU1PbWxPRlJRZmNuSXlrUDh4NkpINlRqYWM0NUg5SEdJbHpWUzcybDlZUVRRSnZQcWltTERMUXZkYzdmNUQ4VFBrS2J4bWlsNGtwRGt0QnMwSyt1WHNMcWdaU29QbWsyUWp4ZUJXb2tqcnVDdXQ0WDVIUTRYVXlseHZ3WHN2R2k3TG4zZ3pib0g2NEJoQVVPbXNoZTNmc2VSWGdlM0t2K3dzcE4xN21zWVVDdlBXYUo5cVF6bSttN3MxdjNRMmwrUzlnMXcvL0lSSnozNkJyZ1JjenZONkpXNE8yeXAxcDJxQVZ3c1doNG43d3R3SlBWdnAvRjJsSlNNOWVzOFlxRFlXMFNGRU9mTmZJNjBoVDZoWVg4TnlvVUZOSjZoY1k1R3VGNDZPMGFBMnNieTF4VmtVbmRhUGFhUE9rUjVZb21RWXVCNzUxSXdZY2tEd3FQcmoyRDhYSndBM3AvbVBIR2luN1FJdHIwakFybUJuVXplQllNcS9NRlJwQVMyM0hJakZCeWdMQUF6dU1HNnlWTVcxeXJPZ216dk5zdi9oejMwM3hjb0MrTXNxa3dGWFB5a3ZIOVZUMVVBMGVXNk1LK1lkQmNvYXZndTJnYmMwZlRIZ0dmTmx3MC9MNXMyWVZmZGdaZExNT2dlZnk3cTFRbEVCeDdYN2JrMnFTenhNRjlrMWtDbzA1eStYNXc1eXFob0xoTHhvWjRuZnExRm13TlZUOVA4VkhBS3c2c1J4TlpYUklKVlk4czdMc0J4Mk80UW9SKzRkV1h0cmdiUzNlZnVxQ09zcE8wTlFZVUtHL1dsVXRtdU05WUp2VzhpOFhWTENYc0dUSk54OWl2VG5pYWl5UW5jemlSSmpxRS80aTI3bjFvdDh0aXV0VmJNNXhVODZFNzlmVFZabHQxUmFjNWRiakl2N0p5RU9xOENaVHlpaWJEdEJBWVQzOExucTZHQ2lPcDd6OHpxTmFCeWphYUhzaVp2dUZXb0tVMG9kTDJVVGY1Zk5TaEpSaU1BQlJTUENjcmxnK1N4WlFNR0h6NS9GbEJ5VlFqNFArR3RvckMySjFQUVV0NGwvY2FoQ2RNQTVuR3YxcUNEd2tLTUNCWU5qejN3WTlBbEU3TS84OUJUZDF1R3ZqUlM4WlJSNDN0NjZOWnQ1Q0t5dFc1T29pMkhOZHpPN0JCM1VCWmI3cG0ydGpUbGZMemM1TDE0M21LZlE2S1h3b3RYU25BWnhuYnJLeWVGc2JqNU1yQ3NkZHBSWEpHVjl4bndiL1V3T0JxU0QwZDJ3VHZna3o5V3VGZDRQcmJPcGluVDlJSFBjMjh2S3NLejhHS3M2cEF2SHhaMTdvSW1ld1hjT1NobU1uYVliaHJuZ1haYlk4bUlZa3g2ZVA3bGZ3Z215WmVvYlJVUVVlWkZuc2o0TysrK3plelRVVFd4TkZqWFhUczZmRm85NHBhT3BuQUJOUkxUK3RKKzFkQkltTXhUUW5LSVBwUnRQK1NIcDZDSXZOdDBSQkRzYWdtZFhJRFM1RHU1L2FNMU1ITVNLNDBtdklKTDVQb0RUZlAvU3hYOXp3Z29uajhyQWsyU3ZzWVdXMjZiZnp0VzVWL1FycXhySG1kcUJNSVlObi9FY0U4WjU3OTJTbG5mcFlQREFWelVxVDlxYmNZcXJXaGt3YURKbGp6enl2TUZ3eWJUSVJzVmRzbUdtS2ZKZW9xUmtVMWRzWDRSYlUrd2lsRjBRS01rRWdLdldZR2VGc0lTcjhGYnA2WkhiVTBTRXBITlMrVGIxOUV2MWNBWndpeC9Dc3p3L1BaMjhwVmd6SzQwSHYrb3NVbEJGTFhUT2Ira1ZXalZVUDM4UHZvZGdUUjg3REpmZzArOHJtd0JOMUxhak05TVpvRmZlZGp1djJ4cm5rZUtHbWExMTQ4WWpTSW1BWi9mRmdvZmEwb3pLM0xnaE1yRkl4VGxuNzJ5MEZMczNxV052VHdyZ2xIcFM5Ylp1RGlzZExuY2lYTW1zSFNtdjFmanhzdWxnc1VjVTdLUDVxVFBCZHJmSW41TmNldUlDcWxCMzNYTU1lVmNWYWVyVkFTZ3lZNHpIaVpMc2loVlVEQ0wxeTA0Z1htSi9XMVlJWVZnUUlIQkxpdUMrdnlRUkh3TkVwMGV3OHd6M0tPV3pBMmhrM2pzdTdDcTdrSXVRSjF3MEpvRVdqdnJmT2pEcDVyK0Z1eno4eUlQTWZ5eXlrV1RIR0pZY2JuM1M2eWtYek8remdVd0hQN0dBKzBMVWlKUlVsWWwwUUxKOXZmNlFYcU1DRi8wdU5GTFNNOFliTWxScUxrWS91QjkveEd5bEUzWjhJZGxtMUFoRlVuK0M0WDRmMmV2OGY2SXBjVGIwQ2l2bXlFVXBFVVNRdHRSVzNHdWN2a2pVMm56NXROa0ZVa0lhcktvaHpZVXJneFptZTdZTjNFUDlZWE1GbHY5SERKWldzRjFEK1Vzemo0SHM4T3M5WjdDNHlXWVFKdUtCZjRwL3hCMEdFNUU0UndUOFJNMktxYzdtYkgvc2VKNU1kQlMvek9XWGcvQ1N3R09zSi8zbVFXR3Y1cVphSktTdDZmdlBMdG9RNUZkMDJCNnpJdkszYVdDRW9ZelRYdzZqeGUxbzhzNFUrWEtsTFJzblYzaktaeVh0N1dFTHFEbWFnYzJyY3NGTldJVXZ2MVBoVSt6OVFKdzZDS3lmRGJ2bm5vTW1Xa3F5V2lhcVUrcWU1VkplckFOUnBlekdZd2RtRVAvNzJ1TWJkZkV2VGNSMGpwcCtuUXFzSWxFc05Ga1oxZStZUmx3MGg0TW93a1BVY2Q2aTdEV3B2cHhmUXRRY3AzNm5raStaNjltaVYwK09vektseDJ3K2F6eUZ6V1pxY1NKM3BRNnB2eUtJanFVN3JOM0VVbGdPbnZUOFZEbG5hZk85MWg5S0hET1AzSmE2cU8vNEZwcmttbFU0cVFHaDVNRGVkUGYwL2o3Z0lQTFNzQlFCVG1XMDJLZkUvYXBrMU1GaW9sKzAvS1BCZTNDdGwrMWxqWk1YVWtGaTJ6QklLTzBCUVpsdXp5REdvY2lhS3M5Z2FCUGkxUktyMzVZZlZZazlWT0Z5RnozVVd2Vis3dmt3U3J3dEx6M1p1emFZY3p0UTNUL1dlTW8wcjFlMFRMMG9relEwS2JGRzZ5Y202eHlrb1drSGJHL0Q3UDlxeXpsRXpaQ0RkUFdROWVyaXlNdXpzbHZVOXNRektZOUZjR2RoMVBOWkowOEZmZm5MN2VIYlc5RjBwM0MvZEVreDNZdUh1TXMrM002UllwbjJzOGFQUFFjZ2YvQkV6QkJIRWJUMWdPRCtDalNzVWU1em5tU2w0WCtxRGdMa3pxSytDTzhvUWpGVGw0UWpTeStCbnVVb0F5ZEFFbHRQQkovQ1JsQ1NYZkp1NlVOV1RLRHhsVlZoUGMwKzdXZ0h5RWZpc2hpcGNqbXFpeEJUQzVyWTV0M2I2RlpqK3hsL2ZHRkVWeFYrZFRlcWViNkE4bFVveGlnaXR5QWk2KzNzZ2pJUHNha0VDS1A5RDVkeTVmd0xkVEJiZ3hrazVzNHJCVVhRekNRSWl4SjcxdE9YVjc0ejU0Q096clUzaVloK2lxYllGOFZ0eStDYzlDOWJ4OGgxTEY0Yy9RYTNLN0J4YXczMU02aVFjbTY0N0xSUUpnUVMvejFuM2dBWGQ0OFNQa3dSaEhjVHJiMkVTN3lFWXRTZWhpekN4blFCRHp3aTdiSHp2bFpaVXFiOWFYbk5UeC94VVdyRW15K09yN1JmVWRMcjV5RUxyTkE3KzVKNW8wTFZUS0xtZTFRR1E1K24yM0MxS2ZZM3dDTS96VFlhQUdGV0ptOCtZU0hPaEFWVksxOW1EUTNCT1hCVWpTTHJDNFVVODRkRW1ZVTRXRm5WTE5oRFExL2dWUDl4YjJXa0ViS1NnM0xmNnpqTDFoRlhaSU5vclNZN1EvbUp2Mmh1R3AzQlFack1WazJPbFphSWRqTVdEMnRBY0F2TW44Qmt6MHZ2N2VJeG5iVEV4ZksxUjRYRTJVVm9UdTd1b1dvRTdpRjVvMXJydThnV3NyZVo5dVN0WndURGxnSTFRcWVuZEFOU3lPb05BMzF1SitpelZWOTVpZEQ2YTE5TCtYeExiTmw5dnVtWklGekVHb1U1MXdkRVZmdWJOYUw4aTJUUlJ0SDZwUEJra3lhdkJZZFdMQkFPSmdtVDZodjc4QTlrMmVBWkN6S3VPOVNqSFA1bGhNTElkZWNyN2x3WUhHcUMxS3dzaUxydlFPN0srWmdIVytEejZzRjY0bER2VlZIR0cvMkVYY0ZRRmQzRDM0RXpURDFSbGVCaUxlMnFzVlJueGZSLzhmS0lLNVVRVTlENGUreE1oYllsR3l0TDFBbmZmWXE2TFh6aWdGY3ZqalZ6S0h2QUxObVQwY0RabXdkcm00R0xEQzJ5eVphMlI5RTd6TW00M2Q3Tzk2Njl1V2RDZmhTWDZGSFh2bElvZEVvOStmOWM1NDdqVFFaNEtQc1d1VGppV20yUHFXRE9DT2RVK0VxS1V5Z01jVU9oOWNrT296K0xpWnZVZ1pxWXpLdHV5MnE2OGM2Q3MxeW01NjFIaGZWMHBXYkM2Rm42bnZOaVpTS0NCOUFCUHo4SHJiSHdwWldWR1hUNXh6UjhxUDNFNFBVZWF2UElVU0VSdVloNHg0a3BkTEttSGduL2pNWm90TXRiejRMWDgvVWJibDNaODFxMjZhb1NMaEFsVGJUckxHQUJ0UHBVckxHRkN1Yk5pMHFQc1hZQS8rWXZVUXFCRG9DU1FWU0JjWDVNeGNXeld0V013NEhnTkZadGMxSG1mZkdsU1BpaHgyNUJmQXpocVBJM1NieFd0bTRuQ21kZC8vQzZFTEI0MXI2VXNCK2YycVNFSDYwT2lTSFZ1eFhXZTMxZGRlZUR2eFkzQSttbmkzUzYwSTM2NmQxMTRsUW1aaytFS3Bra2FCTXhyL09ERzF5MVpMekU1YWF4ZVJleTI5cVBuVzNHWHEvaXlnWDFxbzVXbkVuNUJZcDJFdWdkM0UxU0NBZDVIK203S3VmSFRLdnkyZW1QVTdTR3RjYWVLc1NPTmxCc2h3ZHpTaFhUTDluUnpFcFMwRVRyZlZhY0l4RUc3TUhPV2FkY2RSai92SWlJSFJMeEJzTnlFejluekRqQzdqa3FPc3NudlVQeUVWRVFBNXR5eTBlcEE2T21VTTB1NlVrRHFBVHF6WVl6SHEwSmt2cXhjYVhiYUQ0cHRBUk1ubndjazg4ajY5NWJOUE0va0RQRkFKSXdjYWpubWtzTmVDS25iQ3d0MG5wck0vUGtaZStxb0cwekxoaW5zT0RYcUs3dVBxcS9LMXkzeUxJdVhCLzh2SUZZWTJlelJDZ1JoS3IzZy9ZQitoWHJqQlNwVjJTUGUxYmZjd0o0WnpzenphaWtoZFluVTVEVitxZlFqR1paYVdIY1grYkJmMVlQeVI2RkEzbStRUjF2N243TjYzNjlVNDVoMnlDSmhyay9Dbzd1WGdkcERpWE9DTzZnd0wwYmlLUk1mejZnWWxDaFVPQS9jZDM4T2ZIOWRzbkNITkV6aFR6ZDYyeGkrNWJKd1AvS0ErWStSTVNUR3pmR0ZjWmRtR1B6dXkwM055S3ByK0hndmdXbmFvRFdCQjVUck1zYk9HRUtxaVd1MVFZSi9ZcGlRUWNHTE1vekpQdVFxTzJMNWE3Y1FOWWQwTHVUbFBGM1BMaGFVNTBhMFhUV2ZVTDFCOHIwbjczRHpmT2NmUW9ZR25YczNYTEhEK1crcjI1M0ttLzE1MnVTeTFjZlF1MUs3a0M5RUZ4OTNUbkZweEhUdzZWNHQydmxENlZ2WHIvYjJqSCtXRytjRVQwUVVjeTg2dHNoZk5naXdsZ2xGQThTUU9HRXRyTklvbDc2VTFVVmRhWFFNMXJiemM4YVVpbFVKd3dhN0tZRCtCWDVablMrUm1CQ1UzQlVyTTVhQzdGcXFWbjZtYlNGVDAwU2U4NEkreG5zUGFwNWlYY1RuSWVEYTB3NzhLQUtMcDNOZzhTemkzeXFUdlZiVEc1ZU1FcG5OZHhOQnlqSk1iZmsweWEyOERaQ3BmV3BaUVlZN0JJRDNXN3ZDS20wZWV3ZXJkVG1Ha2EzR21wQnA2WHJxVGNCWVY3YVpVb1ZyMytzOXdKeGUvcXJHcldxVEJHZ0xtRFQ0anhpWTdvUWloWmV0VkJsVER5cmpQR0hCQUJFQWh5S1B5YmNRcXM3OHhjRm0wMGVnZ1BUMndLdENrME9QZFlFd1JLVE5ZdENRbG9UL2Zzaiswcm42RkpGTGFEZGFCV0Erck43Qk81RVZwWUpDN2lvdWxxcjRvWWNDK3hmdGRQQTdzcWxjWmpxMXY2cy9Zcm94ekgvK3QraTVOUVVvd2l3UlFjWU9zaXIwbmdlU3FVemEvcXk3ZWV3UjdSNDF2UGNpV3BZcEdsN1Z2V1ZoUmJqd3RmOVRzTGhvNTQzYWdTT0JRWjN1MFdXQXNoQ3YvclV6QWwvckl3VElteGhvVDRicktPQUtMVGhTdUd2a0ljMkdTY2NRMFZOd1pRSytXNFdHUlpGTC9UVE91UEVrRXFDdlYySkh4aGhtR3o4SmtyRUk4dEZSVlBqeHZjTW9Qc3I3aWZPWGZKc2tVYlB3bFpvMDA1RnBLOWxZWVdYTlUvTSt6b0V5bmNaT3VkN2ZubG1KMnp6cit0ejNwVWFqcUg5cS92SUpGYTVCb3I4N0poM1JybnBVRHFRaGZNRGtWZlA3TDlvNjExcG43YklvZXBYVDMwT1huZTVQNDRsT1p6Z2VCb3Y4Um1tYldPaTdQczN4MFpzZ05QU0VsVzU5Nk13MVFVMEtXTWhtSXo3SmNqc0NGTWpHWjYydGhBWTRJQWRlK1gvN093TEl4U2lsNERES084SVlUQlVOTm1NR0JFdXdhblFKQWJQb2RkSTlFTHA5NGtIVldYLzExem92MWZvT3pTa29yZFAyb0dLMTBaL29DOThJTjQvWi9rWk1aaWlpMXVGNXh3T21GMDdOR1ZxUkxNT1YvUTVJNFlaT0wwSGNuMXpmSWRFWDdSMTZqeERENGZwUEU4Q2t0UVVDNzB6UE45L3k0MzNmdXpHb1phQnFvSW9SWVpWa1JrTlJvNm9aUFhyL2hLTVRlMUptL2g3Q1lyVk5NWWY5bU0rcjl2T1BnVEc3ZjZvTU5FUVUxbzJ4YzR4R0dpWW1sVXZDRzJyU2dBYm1JMVF0U2I0OXpPdGZoU1N0NEJFbWFxbWo2ZStaY0ZsbjZjK1FFd01rYU5OdFlldnFVVURXYjA3aU5GeDhsTFpQS2lNYmhrMElqYm1YSTlQejlXZTJaN1ZUQzN0QlU2cVg2RU9IWmxZQnJsWlViNDZaUHAvRnZ5VzlXTmVkUGkwdlcxSEVPbi9VN0JSMWZ2NFhlcnZjWVg5akdONDk4TThKZ3MyTVIwYUtsY3ByanlCZm5lWmU1RWh1UmZnSC93ejZ1VnBMZFpwSUpRYVpNRkxnR1A3Y211aVgzUkFmTGFCRTJTdEFydWxZdkxjUDI3RWFRdWNWQ2NqckxZTzdhbGtiTVZVTEVGWW1qZUlDdFRRWnc1S2hCVkJQdlo4N1NVZjhoNjNmRHlZcHJ6K25OaERadk8wcmlLU2MvM2RLYlhOTmQzZG90MXdxdEFldjhyNmVDZnh5VDJHU0pmOGUySjNHL1BLYzFqRUhWRHpDT2E2b0h2UVBZZmdxelBseFkwTEMxODhPVEFvU0pDRmUzejN5amJreXp1SFZaQUtseTltODJWVWU3QXVuMlhydmUzYkFXY0dxNTBIZzBEeklpemZzSHNvYWYxZHpsYVJGNGdjbFA4b1BpeldNNkJQYXp4MTIvcjlIR2JpdFVoSnp0WldEVEpDcUZRWjhPWEVadUhXWlN0MU95aGNhdmg3bFZqb2tyblBqcVFURUczeTFSWW54QWlqeUF6dWdYN09hV1NDRXZNRTRSK0toVVdFTnNSc2FWK1N1ZVoyVHhqSGRVakJrYmdaVXNsNWFoV1JLdmtiVEFtMjhoMTVyUFBwTVEwZTdZVHFIN2JvcUNMVFRtb1dpWi9aYk9mUlF2azlDQ29ZM3BIM0NDRFFEakE5L0pwbWNML0h3MXI5cmpQQitNYmJkdlU2Y2s5T1k4TVZCM0FvNk1iSmRvNjhybkEzTWo2UHhzNXBUYkpYRjZPUmFMWDhrQ1FmU3FicEcycm9MUm9RNmF1eEdONHdjWnRlNmdEUFpyVHRXengvL1AxWVdpUG0yTWdVUlA4akQxaHc2S0hhR2pNc1JjTGVYOGV3ckFWZmxGS2F1azl5QXFuQ28vZU5Cem1Sc00xdUNqYkJlZVhmaUNyaHpLdjJ5SHRtR05aRlhzMGxCZU5pb1Q5Wkw3SzQ1a0tmOXlDNzQ0bnJ6U28wWk01czExVUt0S240aFhRZ0hUZlpNZmhLN1JiV1lqYVRVdk9LT3VwakxOdlhsWW1QTDFUNjNENjJJakh3bHUyOUdUWHVBUkxYak1jbU5TQjNoQXovOTRzMExicjdhcHNrYnBUdzlwTFl5TEFKOWNOcFJKY2Jwak9kUlJUaHMzd204VndadmZUNXkyRnJLVkNvZTdleWJZamVkc3krL3NJa2F2ZG55SVQwUTh4V0xnNTdvUUV5VDRvS2NnUEVLc3RXenJTMWpoNjdEUlplR2VmSjJiQTFkNHNmeUVmU2dOTHMxaWRTZ1Q3UWJSZDEveVY5WXVieWlhUDVNRVNaaW4xVlk3cTh5eFhQWjBtNGxXNTdMWWZxUnVRZmZId3YvTFBQVTRkd2JlTlIxbFNKYjRkVjh2YTI1ZHlqYmFJTmp2bHFWQys0bTVVaVpZT0VlWDVjMko1VjROd1VOS1RxUFJqU2tod2IwQWpaMjNHYmd6bk5yTVRDeE15K2Y4UnZ0TDU4TzNLdXZDNW0rUkNtU040UVVtZVN4bld0dkRLb0ViaVFxWHZsN1g0b09wb3UrNFFKRDFjekpKakI4SUNpQjRIUjRVaXM1b2d1NlozSmo1eDNMM2E0eGZNY1hwM1Jldm5hOWRXdGdKM2ozL3p4dlM0M1B6OUFYa3ZCYnJReno0RUloT1AzZXZtU2Iyb0o3RVYraXE0SStBbzIwQW1JdXdWbDlxSnl4a0tkYzg5dXZydjcvVTRKR0VmK0J2R25WOXlEelRjaFZMK3cyVE9GSzVlbkowRGZmZDMwUm1WV0tmY0pCR2NEelY0RnlSeGMyVFpubWZRS2FXRStpbkExR2ZEUFVyVEZWMllhUFN3b3V0UmF6dkdsMXg4ZHlVblNxT3hibTJYNXFEWk1LaGpVelhKb2RiTTNya2taR0ZQcVNURlY2RVhsUnlTdFZJbHR2R2xINytwY2ZDZ05JMTBvbXlyWFFNL3NhWnJpUWNKTEs3TXJEVnVlc0FFQjE4UXZnenArVlBxYkh0ZGZwY1JDZEE1cDUxa1hyVWFsN1dpSzAzTVphV1R3SitqYjc4RnZhWkR4VW5FVkJVNE96QVJxVzlwUi9SYjZ1eGlhL1NvZzRtSm82a0RleFdiVFV1TFcxV0NwcTQ2T2hyeTBiWTNORWVZTFlscDRrK0U0YWtUcmg5VjBlRG9zamJ6N2dUa3NYZnlFMHhrRCtiWjdIcTJvc0R1TzRocGdNZWwxTlQ5S1QyYlF2d05jVW55eDEwWkhyemdIOXNHSXZsSCtDTG02aXFUdUFEVStuRlNZa2docnNvVXZqNVgrUFhHQnZvOFUwYlFvNEpkTkhERk1RNWx4QmpWVTMzV01waXU1aDlGSnJzWTErU0pKRUlwejM0K0pxNCtMVnJGVUtEdjgxbkY4V1ByR1gxcjNjWU05eUVHbWx2NHBUN3NEcFFuVHFoc2dEOHlxWDJHRmRQTzZPWCtBS3paYk5BNTlwVlRVMzkrRlNLS0dNdENmaVRVYjJpdkovMFkwVzVBQ3poSFNFMjQxMGU0cVI1RXorZ0RxVEhZamJaZG1nc2c3ek9uclgzUlAxVDhhdEtUWnBCWXVoYkZSUXZUTGpzOHhZR2psRkg2WjdmNS9SeXlFbUk4akRkUXlCNzJNc2NaRTU5c0tuZWtVTVdqWnE4azd1ZlNSdlo2aHFVcGlBTk03ZlR4SmZWRHhvRG4vWVdtTWViZm03dTJUaEdWV0x0SjR6SjhHdk1nU0d4Tkt4NlRBQUdyaFBrSU40bC9SYkl6bzJZQ2ZMQ1J0TTBKU0Vob3JKSC83Z0V0eGxEeDdyRDNRSFZ1dzAvT2VCRVRrNnhKOUxWUUQzc3Vob3BQOTMzSURMZEJxckQ2TWJ2Vkk0bXJzb1gxZUtoOVpuR3F2anVJN0duTUR6Q2ViZFB2TVRIS3VocEVibVZUWmM1RDJoL3FVd09VM1A4eU81R2JkSk9zNWcxdUtadkRlUEcyZWNGTTZqZ0xDYUxJQU5zSG5yRis3QXdCakpXNEZ4NjhwZVorNVBVNUFqRloyaVE0NkVwd2dSTkpMams2bnp4d3VIVE1lR1FYYmxHU00xYXdITmJIcXpHQkpyaFRZejdIa3hQWExSSW1GMjlZMnM4c2pxWWlHbTRKWlh2UUR4QXpZdkJJODBMV0xIanlGQWw1SUNxOHRGQTUvM3VHRDJvMGhTUFA4azJHL0FsTnpFQXE0QXhHbGVzdC9KaUh2SWJNc09mR0w0NnZhUHBBa0gwb2w0TERCb1JKL0hNbUlhTU9kUmVPREFlaWZBeSt2QzBNWERtbnN5NGtvYXdEeStxYy9RdWtrY0t2VHd3MnMyUDBPVkxEU3N4REMrYk1TV1BsUnI2OWZNQmdSN3hRdzlocDZvMXZVRmRnQ0pSRXd4b09HbWFyc2dweUZiL3cwWGE4QTRQWCtoOEw0Zy9WbFJlZnVXSDc5Qm04UEFjWmhlZmRjSU1zNmRZeno2b1J3cXRqZWM2cW11WG9FMGMxcDVjNE91UnpXNVNwQTVVempnK0RhZG93bTBtbnpld041VWx5K1JHZjdHTFhYOTdRSlhsc2o1Qmp3cTNFc1pCR1huTU96OXFvYnU2SHZmRENHaEYzT2NyTHBtTFV2SXRyN0lTNXBhUkxrKzl3bko3MkVSamIvMVZvaFdPS1phdk5uR01YbkZTV1phK1VYc0JZWHBQWThZL2FsRE1aNkxDdVlPQWVnRXNFc1g1ZCtCb2FCbzBKUlEyTitCMXNxZHRob2RaZHc5bXZKKzRiOHZyY2dTYjRCNzgvS3pJZEl4LzBKZy9Qd3JSVlZvby91anhNb1RFcnp2eVVJVmo2b1d0UzlWS2JlZFpIbExsRnZXYXh2UzBoMmRreVZNM1BLRmQ5ellHeWpXbGxydGFtMTU2andkMmRnOEtDSk5OaHRQOWt6c3hITi9FY3NXbHZMYlpRUFlhWDIrSG8vWkFJS3N6aEJIbHh5dmFKRnpnWlkrNE1nVEZKa2JwODlrSG9FWjM5Y3N2OG1zZVJENmFFTVJQWTc5VTBjNk1OODgybWVubzdjYk8zMTM5TWExeWNNYnBpWWMrenhpazJOaXpEVU02QUpRNnVuRDliZ0lqMTIzMUM2YysxNzg3ZEJFc2NIanU1c2hhUVpIUEt3L1UwanV4dGFoZis2K2JJT2V1SmRCV2tZcG9kbFJTTm4wamEvUGNWLzBlK2pFZ01DNFZYRTVFM2VHRG91L0lHY3hYOEY2OEQyOVJBUEN5VEF2R05hNkV6SXNqaXZHa1JpU25SZldGOGZmT0c3QXhPL0tUaG9oWnE1ZW44bS9XUHpFT1ZOcEl5MFBhNDFYcXdidGtKeHhBdkk5OGpMMGQ3R0dLVWJ0UzB4THF3Zm1Ybzh4SFM5dUxncjNkaG9USk1zU2k5L1p4UmlEekhwaWRnK0tmeUJSMHNRbXFRb3FsQlp0bFZ4cHpOa0ZkUWhaSkl6bXlZQThQSmh5dW05ZzlRYTJ1TTBnRXJkNlBoeU9HUHYvUkFZTEpxS3FSRU05K2NKR1YvS2pNN01ncGJGV1pCQ0pUdWFsZm82Q2E5TVd2TG55Wkk5R1IzWkNJdTJLbDJoaUhhMDZRUFN0TnJrUTBSTVpXRjYvT3pSSlZIZ2pMa2g2RStxTzk2OUFyQ0p2OGhrNUlLdmhXY3BVcHF6M2pMRXBxblQ1UUNyZHVvUVNWNmpYSHpBc1FIN2gyOGZtL1FVcXVQckxoeVJwZUpMaXNUSlRlNDBwRG1KVUREWE5lSG1RRC93U3p4ditWNGNWQ3BFbyswWmpQMUo0SW8vekdwbVpiaXFXb1JkT210NnNCdGJmYWptZWVZeEd4NURwSzZxOGVQeDdqdWQ0dCtaYm4rWjF5b28yeXFBck5TRkNLakZkOVhIenB2Q25Zc2dYNUNrQk5RamluWndlNm9wbGdGWjJra0ZFc1pQOFBYdW9nZnRxYUtHYzc1R093MzM5UXZpT0NjZ2dnZXRmSEJmcnpzU2JiVk5qbTU5OHdPMHA4K2FkelhzOWMxNTh1OGszQ1ovcXhCanVReDN4ZC9MaVVQVFFlRFpyWm1BUXNjRUhoWE5BVHh6eDdFT2dQRHdGWlZ1dys2b0txdVBOb3AvTHNGMFh4NFBQTzlmdGRBSjhvOHNpeHMvZk1kRE95WVlub2FTUzVoeXd3SUIzZDZTS1ZtL0FzWDYyNnVwOTJ4WENlWUhUb0F3M1NDeHg3aFhjVXNyYjY4Z3dHMlliVmY5V3ZJZnFhTXpuQXBma0FZUkZ1YlJXRnNHV1R6RG1UUkZGNVkvWHZDVnVpWVZyRGNaTElRYS93eFlJS1J3eXB1dktxMWprcW9ZNTFTNlV6cnE4d2dMdTlFTnRzWG1iVXNIZ1AwYzJzMFVrWlg3cS9uSW1QT2RsUHVEczJwelVpdFRJZzdVcTZQY2Z3SHlYTCs5a0xKWTNoejhCeTlGSnBuV3VGbG14cDZoQ2d3amRrcnR5LzFDUmx6TWZYY1dJRFNzSWRYSTl3KzZkVGhrV2VmWDRITVJHTGs3NTJGWlJFckd4dkN0aE1wREZKYTQyYjE2YWVvc1A5TTUxNzkyZ2kxdFB4dTRjTXVucDljYWN1WGJqYnROeFpIS0MxOUREcU9CVm10QVVvSUFNcjJEeUZDN3Z4cVBaMVNMSUxPVU9TajU0ajJOcHhybitiUGJlTHo2RWFmZlRVQjJPcy82WStWN0JaTG5NcEtkK0M0VEFjVnVhNlJCaUZpQWJTV2RQTW55bnMwOWJTcEVCNDdUYTZkTytCTkVFMEhOell5eXowc1B2b0JyQ2w2cFhFajVjQ3V2dlJxcFpZT1BmZmpCT2o3cHF6dWd5cDUzTUJZYjZSb2xkdTdQaEt4SnQyRlkwYWVMM3hqTE1GVTR4QXVMSFJyMm1uUnl0SGJoTW1QQ2tsWFU3ajM2YlBLOHFKQTNXbSszVjIrdVdUVDlDUjVLL3VnWEYzMG1NNHVKTURLL1I3Y3dWNG5XbmtHUVFLMFJyN3hxaUEyTmF1bWlWcVFJMzAwZFdld01QbFpwdEdnRnpXRFVLa0RLcGh4Y21NdGFISVRDbXRNeDZjSlZDaFRVdW95ZDNGUml3TWRQYkhpTVJCRUg3TldkTmVuSkozQ2hpaXhLRFdIeG5xVjVUYXNnbmJNdVZVc2x6bHZseFdaeHhtS0ZyLzNQVE9Za1JEL2MyRnZDT1FoWElYVG0xT2VDbjZnT0NvR0h4NGxDVlFuc01SV1BDZ05DMytuSFZLTFRmSVhYTHEzMEF1ZE1LTUx2VTNoRU1EaHA4czNBaHdUWHlNUElyWG9sWTFac2g4ZnJVc1Jrd0J2bUZQTFdsMUxGaFVJblVsU2hxdllZK1drdUZMVjc2VVd1cW8rK0pkbzF3VlUrZ0s2QU03QmtNVzMzcitqT1NaUGE0eGo0MDdZK2dnZ2xTNmEyd2REWERKQzhmNU9DN29DakJsa3lPZlFqUEVqR2JPRXVubnIxQ2ZBT3l5bDJHSkR5RlU3cFpFbHdWVTAzKzc1eEpYVlZTYkhPVldIQmtSd0cwZWZGZXZYUTRtcnA3RC9UVlgzbGRnaFB6R2lLZ29LbjhiS04rWm1WdFFtYm1TaTlMb3gzRTRxNm5YUlE5bkhLR2J5WklQdXZBdFJmSjU4eHB0SUxrZmJvYXZnSDI2YVhURnZySmRMYkVTZ1czdHBlYzA5OWI0NjdlYjRLUk1mOG9OS3JUT2Vid05WbHExKzBycG1RVWI4ckRKbnVhTU1QSldDTy8xTWN5bUpFOUJYUEdQNHRiMHhoeEE1MTFycHdwNDFnMHVibGx0c1FucHBlU1YxbVdBekFiSm9Fd1dCamU2TnRlOFcrTVlldWczdVM4eGNnVlQrUVpSY1NzblRkZXpXZFptN1FYUXVLdjc5RVBacHdpRUNscGM3WG9xT0JTY0pielVTVnE3Y2NRek94aUFqR2RFd1gxNzhybkJuY0tlendRMldnSjR3VGU3cVUvVDFGQ21ZWEtFa2tyK2pldUQvZ255THpWeXh3V1cydDB6K2hTZ1N6MExRYTdBVjRyd2l0Njl4NStXTjdteVNCY0xqYmJSKzZTK0JIZTZWK3ZjYkRVWVpiQUlGWXZ5S1VFUDJPTVR4T2VTajRKZ0UyMy9RQ1N2eDhVMXlKQmZEbnBUZytJOVBHY2lZY2cxNDc4WTh5Y2pUU1N0WGZlTFdzaFNpQU9zUUYyU0dQTG9ERXIzRXMyQjkyWGVIWFRBckdtOCtkS29VdjFZNENLSFBDOFUrWFpSMGkxVnRFTlRQckwwd0VOM3JLMnNUN1ZYSG9TaHpKNGtjSkdOWFk4ejc5YUtzZTNJY3pybjFmSkNFRFBMdEdjUEFURzB2UmR6VG4wTEVpdmlHQXg5NmE4Wk1pdDQ0QlUwS1BMRlM2OUxjQlllNEdOQWdvcGpFTU95Tk1uMXovOU4yalVyRUNQSmx1ZVo3UTBRWGJBV1FMcXZHZG9CVnllVGk5QVlEdURqMXJaT3RNN1BoZ0puTnROWjJnZWZRV01KOFpBczNCckkrVUZWT2t2RjNoaXVhQk5PVGdla2N5eUN1VStMRDV4djBGNjBCM1RMVXYxUzJRem1KUmsxYng0MXc4YXZjVFo0cWorY3VEb2QvWm1xY29wa0pvQ3ExK1QxY0t4T3g0c0RCOWR1SnJMWWhZSDh0UC9kbjcrUXpHUVd0dUtRVThKOWpPWTlCOXpXcUJCWlRzU0V0SmlDTURDVDBFTFlaUzRob2themZjaHBseUIzN05PWHBVdHcxaGs0WmVpMVdDSlZRcERmNVp0ajB0WTZVVXhMQmo2Q0lXZVlQcVVqbndZOE5YY05ldHhKMGpmUzgybFc1QmZyYnVHWUtaTnBoY0F3Y2lnNkRTYk1KWUJlVVo2WWpRMHVUWXc0a3lCWDN2L1cyc1VLMzV0SnM0ZnlxaVdnTWhkbFVrNUw0aVovWE90STB4ZXkydHpid1pvSlIrTHArK21nQmRHaml2clNKeUhkN01uMGZGaFFuaURMdEdWUUM0NkorbFBLYXMvcVlVZGNKZGNQWElCR1VKbE1QSnozT2EzRmRzM0pEUmVzRVdXdXFuc0VWSTNZZmRKcEY0Qy8yQU1tQ3laZDlPdDlmdlpIMzY0K0pkWDlCUXo2VU1LZjgyWXZodGljRTJEU1ZEY25nbUwwV3RjamhCa1BkMzg2VnNHQ1h5UTNBTjIrK1J1VWpOdG5qUzNBeDcrc0Jnazc3VmJPdnNZbGVlR3lLZkdtOG9USWlvSytPN2t2eWFOVTExOFRPalpJa0dadlF6RTJUS1kyQWZKT2s3Y2tFeHlBZGNlVU1mQnZqbFZRVmVzK3QzWjFMSXE3Tld5Qzk5V000eTBqRzUwZ3JRZEFuUDNOL25oZGpyMGtkUzJ1cjN2YTFQaW9wZ2h4clJiVTN4Y2ZTQllLRDIyTWxTS1JuTFhpN202MHp3UEdqcSs1dEhSdFRyVTFMYmpQVUxaYnpPNHVzeU5UNVBBQUMwTXU4NWVTM08weVpnVGJLZmF3UHNyb1JqeHMvbDNmUGY5d2l3dXllbUg4TlRxMUVJZGtrY0paNkRrMnBuVmVwVEE1Z2U3ZDZ4cEdQakIxUldLcUx5ZzB1SDVyd1dYZzY0UjkyTmtQY3JNTkt5QXoxd1IrMW5sQ3JwV05SRkFxcmhpeHVNNk1DUk9FTW9zNmM2VkdsbWRZQlBJWDF2cEUyaXViZkdVVzd1TUp6dVVNdjdxOUdZdGtta2EzZThIUlVsY2J5Q3FDQnpyR0ZPZzlSaFRpT25KbWFZNmdDVlV6dm5najhZUzhkaEJxdDlReCtBOGkwYXFNT2kyZHRpYy90Sng3SUx2VFJ0dXZTNGZzaituMzR3ZjZOL1p1citKZ2dHL2h6Tkk0Sko3eTNJRVhGRlJXT0xmTnlVZ2kzeHZuNkd3MTZoRjNiVlMxK09uM2dGZkpTTUJLRjlpc1pLU2RCaTNsS3hRQUdkYUhEMXdaemo5ZEZWb2Z3ZTIrbVlVRVQ2UDQ5dENXS3JOWGVhMDZFSnh5Z3ZTaTh2Tm5kQ044My8xL2dFMEFPMHlocHRSOVZ0Ti9OVUJTQTUwemk0WWF5TXpTNkcyN1h6Q2VzRUNTRTVXbi9BUEZXQ3ZXVm5rQUx2UWlMeVJNblRGbDk0UEFWMThxMlJwaHNvU2ZVa21tbWZNaHVzQytEVG1KMnlac1M2czZGL3FjN2k2VXlOQW9GVXN4NmQ2THJjS1llVVF1REJTek5pN1FMbXRtWTZuaDFkWFNsNjRRZjloN2lsVFdQMWZ2OGFjM1BwSHpCbmVoSnd6OXprSmN0eUh4dXZCWkRyR2hOOE5jWUU4eUpJWHZOUjJ0bVVraGdQanQwNVdKRnBLcUlqcHNTeDMyQzkxaiswMy9zZGUwNDRNeWM4V2tCRTdPLzlBdmxHSVRDZEZQaVNaOVhaZ2FuM0pnSVlOWk1pNDZObngwd3I1SGxDWEhrczBCaGFsTytaM3FFWXp6MGREWjlPR0ErWXU5alBFNE1Ib0paQm5JVXFtNUEvYWEvMjIrSEpjVEF4eldiaWVBbWluRlp6djlqM2puVjBaa2VpWW54aEJsTThuZ1FucWlVM3ZZSTVtV1haaFJ5ZElLTVNuRmVlTUIwTXRwSUpzUUE0V3J3VnB2RFZ3b2VXOU5DWndWSUtvUTVzUWYwOS8zQ0dKQk5LMUsxRnRab3E0WmczeGpFdFRHcloxZk9vZk1MMktvay8ySjBYQ3dkKzVEMFNFWmVSUjd3Q1A0ZVpUcEhsT2VtVit3RkZDSU9lay9UZVMxK0lPQkdUVm1TQWh4aC9FNDQwVmZCeE44eHZBVEgreWhEZ1B4QkFXK1MvemhVM0VGdEl1SEZ3akRCem9Cc1I4Y0FmOVF4TVFiU1FNMDdRMVh4UVMreDBVVXUvY01NN2N0eXpGaXNTc2YrK256MHpvUHRDcDNiaVZSTThXUU1Celh3RXFNd01saVpsTHd5WTh0UE9DeUlzOTN5cW0yODh2d0FLZnUrL01oa3JCT2hXV0FuWVV3YTJzamlIZ3MvRDNBMU8vVzU2UXQvQzBDcTFCR2E4VGRKY3BRSWZxTFZjNERhVTZ6WC9EVURMZ3EyL0lKRDNkV1pjcjFiOFM2OTE4aFdoUG8xdzNwVHpCV2p4b2ZNS0xsNU4vOE1lb05uNXZzRGlCKytMZW11OXJCRExJS2pwenMrTDUwVTJ1Z21ubHpLT2RoQ0xDanUxYytIR2Vmd00rYnJ6b1NsMGNCVHZjeFg4ODhLS3NZT0VNWHJXMHQyb2pXaTRvVUY0YUg4UUFNcnZGN3NqMEh5K09tNWVvd1J1NU1jSHp3OWt2L2czYVU1K3BXTW40NmZoUk9XSk53SDVDbnljc1A5ZEVzZmN4QTArSEs3ZlViQzl5Y294RkErck1WYVlIajNIWWNXa1dFdHlXaFB3VnlMREk1YWpvNWNOZ3E4bTdXQWp4S1dVaXRKV3pra1JSWlcxSk41VUFmQVdWUmtCUk9ReStHd3Z1UXR1eVc1b3FlRTRSS2lIeC91WU8ybUhJYVFvR2Foelk5RlplTHVpUlRYMEtha3EyQUdldVpvWERNcXc2MU1tUDBjQ0VSMUJJdzlFd25FVDBrZDA5Um1rMERqcjlnU3ZzUmxLU0F0bmdVZjkwdWlkSFlEZmxIMnBiTDdNamYyeHBuSjhNMERmM0w5UWhZSmZQY0JKbnFWbmQvcWc2eWI0YTd6RTZISzMvWHJUSzFlcndNUklaV1kyc0JtWkVtUWNwR0ZhUTlXLzJ4RHFBZVI4QS8xTEJTbmMyYldjOHVwT3oxNEhKcFQ0eGVWcmNaM0dWN3JyMHU1ZGpjOC8rbUczRyt1QysrZkFpakNuSDVrRnhRQjRTTmFCemk2WVA1enpoS1hyeVpTdmZuMHpqUnRpclNlY3dOcW95U1drbnQzc2dxVktEVm8rWCtSMzFrWGRuR253cVNvUXliNS9JYllBTW55Mm1DYWVhT2NGZXA4dmNLSEw1NVVKQmxaMXUzVlVLY3BJSmo1a0Q2UjFMSVhuZFFXYnphaGtNTDl3dTI2SWYrYjhWSm9FcmxTZlJBN2JOWHdicFNKcUJFcTV2bTVRcy90dWg5eFk4SGF0Zy9xUzkzam1TdlR4WC9PMjNsMXVydUlabFBPYlF1T1dyVTRxYVFOK1ltREFIUllOL1l2aTVDUXpHSzZGQVpQUS9BK1A4Zmc5bVoxZm80Uyt2cWIrN3dLSTI0NjJnRzcwdVRuTXk3UEN3cXJScGU4ckpwZlFIT1RGRHlGSGgwZHF1RVBZMHRaSGNLVXpkdmRlMUhXdWZydFg1eU1VdHl5Zk8zck9FS28yZjBYL3YwM1BZMkViSkJpUXdiRjA5REFycGY0WFR4b2s3NklDNEY4TnRxK0hmWXkxY2FXMkNoWExkN3RFbk1HUXU4VzZ2Zm5XcE9pYVF0YmlKQStOUXBaSDEzMlhjZWhBa0tqNjFDRXoxWTd3YldUOFhvNkc1S3Ava0w4dDYxRndYNkF6YWpRU0NrWDBkT2p6R3M3MWI5L2djcDl4c2RsanFVU1kvbEhkWXNYYlRiUW1ieExYcUtNRGpCeWVNV3RCakxDcHZRdlprYjJrOVJXakdxbkQxaGZVbjY3aTBHazdLV3hzVVhTL0IyczNzZThIOEZtY3V4d2E3ZElpTTErZ2JhZWNLMlAybkZxQWdMUGtQdHJ5YWZ3TUI3aEtDMkZUZUE4NWNtall6a091V0UxNlcxSGFDUnRRRFpUenl5MXJaMHZiMTJodXA3TkdyYVMrbGhmeUcxSXFzV1l5UUQ0cm5NN3ZxU2xRRTNCeklKL3hSWmNWQXNHVldlaDI3NkVJYUsxQjJ3ZFdFbFNjaHd1QTdZTDJnTkR0VzBLZWljNDhwZGpGVWcvalI2UDJuRlBpcTBhM2txMWZCVCtzbFY1ajFFVTgvY2c5cGtUZ0JNN2hZejRpNmpRYjZmRCs1ZTlaNGoyZDVQWmNzRHc0VjVWYmxXcm1Md2xMOC9sUTVvc0x0aDROUnNSUFh2MWxEbzN3R2pLbjFVWHpWK09LMjJybnZOc09OK1loYzdwajVXTXJPNnBwT0N2N0Z6OHFjaDQrSGtVbjVOdXZsTjF6bXoxRlJGSDlseDVUVVZmUVRuUlJDN21WMUZtaFoxWWVwbnJxNVo0Nm50c1JhRGhnQ3pRbGRNMVExb00xSld2TUk3WFhrRmh1Z01vT1RmWTl0VzdrVUFzMmViQ0lhWWdxdnJLNmhVTmxNNnRqN3Ura2RPSUtsd2x6RllrN0dvOVJYZlZrbHdvWExzbFUySnhlU2p5dFhUNlh0Vm1TaXlQOXZCcHRDODBvQnBlak1nV2NXSkVFSjA0eHY4aVFMZzRVUHhzdGNQY2ZqOXBGLzVWWGR5a2ZxY0J5azJrUXhRZnNDaFo3QURqZWdQRjhTM0c4OXNaKzJlVjU2QVBOZ0s2YWxnQTRoR09HbENGRDFiWjBsRGh1SFhaOWlMRWUxWDBCSDJMVkZFQUlGUmlQbHJBUDcySitRZ2FXTkorYUZQK2E1TnpFRGhucWxLQzJKejh6cXZ1eUhQdDJmUit1MnA4ZEl6aTNUb2JrVWJLUmRiQXhtWXNVbDUxUEp4NEN1d3paQkhiWXpBTG56bFlGb1lCRTZrQlJROTRHZnpzTXdCV2JyeGVBWVp0MFRWd0hHRDgrMVhjODlKUnVUSGFvSzlMU204SWd6MWtSa3hWOU5kT2hzRzhRdlFtTUdjNEpZMDN4dE5LZmxDS0VzMm9pR0pUOVZrMzBWaGF4Yk1mVVNIRGJGSjZKQURybHVrNkV6cUpnY1ZjYXRFdUlIeEVsaTd5elVZUzRJSVFzTktCTXNiUXZPNmVCbXpiT3haQjJQMkxhNHZRREN6L3ZZbUlYTVI4NGFSSStvUWZhNmgvOVFLeHdqMWtTa3YrMjBXNXJtZzE1aHFiQXhoMGpzbTJEWEtiTTVTb2pnTmlmdTJ5dkxjVlNoOXk2TVp2aTFvbXRBT1NDa3hBdjVLYXNkQWduczNKZFJ5QlZDUmN3dEtqV0VxczVpVVR3bExmcERuK0E1eHN2aXIzdFVaQjRrdmZJTFFWcE5mSDFFOGpETXAyNk5sVDNrTHRIZ1lLemtrZEMzK2tBVVRacWdocnR3dDc3elZTQnE1blovUWpLWGgxOFNLeHV4aHdHeFJlVEFjRGZiVXE4bFRZNFpKdEF0QzNXSTJkcWRHdmJyODdDYjFlcVhCaUlTb3QzOStvKzVaQlFWcWczY0huNTl3OStRQUladUZ4ZVZZUFhIOTl3Z1pnV3pxd29kck9rYnB4YlNKQ3F6U2Y2dzVPVHkwV1FRaVVUZlJ1T200RTJhNTZZM0lNdHI0S1QyYVJNNGx6ZGE1Sytldi9uTUJKYlJleDVOcTFLMUpEUm1GQzRNRjFWNkFFUVdvMkp4UTR2L2FWaytCT3VFSXo2WFh5Z0lEaXl0MHJvcGN6c3NNSmNoTkp3T0NHME1tbXdEYVltZ1RkMHA2M2k1SHZTNzBzSkl0cVY0Wkh6TUY3bEdDclN3d2ViU3gvMmlaVUlnd0RuSStxa3QrYkF0US9HK2pKZGN5M2dYa0M0eGtCRVhDa2lTU3l6aHlPb1JOSm9DbFBRRFVhakF3L2hVM2tVQzdKdHJhK2QxSThkWDFTdWdDbHhEam45NkIwcEZPQVEyV1ByaG0vaUYzU0x1T1lZZ0hBM3lHVHk0MkRVMWFpZUsrWVpaTXVjNEF1dXR2cVZqZ3E5a1hzaXRIKzF2NVluZWpwK2xRUDhKOExyREd0aE9SMnhNOURDajd5WXc0R2JucmNROWs1OEYyMWF1cmdYMVVkUURzaVFNV0l3TFRMTGtEeitTbG1mRXpYOUJBeUJ3SE9LWnZQQm53bXNaOVRUMU5rQkFUVFJSR0lXMVlmRlNMNU9Xd2hSa0VrY0ZOa0pEeXgwb3JJRmloSVNVMGtYOGJNRG9UYzJDNCtsUC9KdHpZUFhkSDk2Z2NnbFdIWGpNVE5Eai8zUERkczV4Q1FIaGRiT1ZFNmZJbjZxUE9BQ2ZxVnhFLzMvSVNBMDAwUVRsbWpOeGI2TEFOM2laOWhBblZpbTFENDNqcVoxN2pCQlpsdFFhVVRkalJBdSt2cmxrY2pBMit3OVBjNWdiaGRXM2ZGRHkzSEhxaWpEc3JPaUNCdGVzd1FjRXV6RmNOeTB5N085VG5RNGl1Umo0M3RLK0ZTV0NEanZVenVJdU1JZCt0WW5zd2Z1OFd1dUMxY0lRRmlkanBZelRUWFRGVGxNMHFGVGNWTTFyQ2w3Q0h0TEVwdlpQRlcrcVhlVUJZdDhiOTNPWWI2YzZoSEdLSFZVNXd3WkVTQ2dFMkc1RHNETkFBc0FQb2VmcVNrTXd1amRFemRuWHJyVDBSU3A1S3VQRm1TKy80dDhDWlV3RDFSL2VsRjdVQ1I2Wlo3MmxuUW83WDh3Y0tjaVhid2RzS0Y0Wng3QUVocFVRMHRIWUJsdTRHbmJGQktFWmp2NzJDanpZNkNrV3VlNUZtQ1hWbE1aeGl3Njk1U05pZE5XaVNlSjJKWFdNckJMd0JjV2c3T3dLTnhYaGh4RVhhTzhIRHBPQ1N2ckI2T0ovRDFmbktKUEFjNGMrTmg0MUJrWVE4YnZhUFJZbkNoUnhUNTFMT1dTelh3UlZkbGEzMWdrdGp3WXNiR2FKam1IRU5LblZ2MEdSSjdBblc1REJwNUJqelZUYzcwWDRtWlA2dW9pUFpqYno0bEcvb3FGbHlXdDlnWTJ6WHg2d1pTbmxkWHEyVUQ0ZEZPdWkyV1dZRXdxZlhkM1NKN1A2eGVGVjlYZytPQmREQUNnRWs1Qk9vYndFUUNOMlFIUmNOOGd1dUh4UkJtOFQrYWc0YnRZeUJ2bzRWMkdnYUxaRWdHdjlOU3JUVWR4OEEzWHJBelgrOXUxdE5nL0RjQ0hFU0tkSmpmQ25aSDZyQldGMGpQVkZyZ0VtQW5UYytQQnVTYUtnUDc5dCtZdzFXVldDVE14UXcxZWIxZWRHU0xwNTFncDdWZnVVRVc1emdqbHB5dzFkdlEwOXpySkZtRGtXekZBQjByVEpnTmNEc2pPL2g3Sm9VTVhrRTBZajNMNzhpMmFGZi9US25FUW9ibVVzVEdmRURnaEtSeExpTjZub3h4eHBDckMvV1M4ejFmRXQxTW84SXZCODVsa21OSE5CKy9XTXMvd1JVUnZFTnRDaFdYZmp3VmJGU01qWjRvUE9mNVdmYmR5S25LNWRmNHZSZWhGOHowN3lRK01TNnJVV0NLdmwvZFhHbmY4UFQ5WWtGWm1ybWQyS3NBanprdUQ0QWN4UlZkLzZ3M1Q2akMzWDFLWTNhQXlkSnhlbFFjb1lqcXEvS0VGV1ppZHN5VERWeWt1WTFMdndRajhHdllFVDh2Yks2UUpBWHRoaFc4N3pEMWFQOTB5QmVLdFlXemI4R1M3V0xYWDczb2VZNEUwTG1sSDJrWkswWG10ak5FbWV4dHlmUUg3SmxaaEd5eTNWazhQZkRaT3BDdEZkejBSRWJ3NkUwWC9vVXl1ZktvblJOQnRkM1VQQXB0REFHaExON1NSMG9LUWFvWlkzVGRPS2dIN2tybHphbnJ1Q05udnNWaEovWDFtbTl2eUpPYmhYajJSb0JKNmxhVld1NjBZNlA3QmV2RmZOYS9TdXNQeTVtRUduZVEvV0RJZ0tiV0JMM0dIVkJIMWI0RG1aNUlSV0Jnd0duQjYvS0xla1FNK2l1Y3d2bGttbjFNNDJ2MkxOcFk2UGppeUc5VnBUaDhQU3BoZ3Vsc2I1K2hRakxycElnS2JSV2d3L2xRR1pWZnd3bWpMREFrYjBmdk5hTnFEVktxTmdSeUlJOXVwckFuVjIxTHN2TjNUMVhyWTZGQVQxYlFHbmQwa3RWNkVkT2lpbGZUS1ZJc1B3aEw5Tkg3TlE0RFlLTnVaVWg0R2FkTEY4RUVyUHZQNldyb0dZQjhBU0RjL04xWjdBSGdZRVdNdTI2akNab3VBck9qQ3U0K2hNeWRRR1pvUUtoRjFQaGVQcU8wSU16Y3VRV1dPWHJCRDF4TjVQajdRS243a2hsWm1PeW91V3h6ck92TjJUbkdGZ3cxYmkzQS9uY3JNRG9sODNmNVVVK0lPdHliekc1M3hTK3FQNFlYYmpUcC9xc0ZsVSsxNXZPSHJ3dHc0Z3JaZnNoNXcwR1owbjlqaGMxVzk2VzRJNDR3ckdZbHdPbkVuK2Y4c2hPMHh3SDZBNSt3d0xnU2I0aWNWS0h0QUhnWEZFdzBoV2tmOEw4b0dDaFVwNXVaVVYxYjlvb3F2ZGQ1SkdTWjZNanRhYW1QdUpxVjVkemw0cnZ2RmdpbjhlZnllN3JaaFJpSTR0R3d3cHcxd0tRM0R2TnR2RDRiZHF6VHRycjRsTkZDL05PZTVaSFJrNy9XL3dpZzJscjRnbUxMdnJkd1RuYnpoWG1rK3Y4ekFubWh1R3VhTHBzeEFJN25YeEZUZjFOSDRkK3dtZWdEWElscTZaVys5aVM4TjlSS0FlQWdhckVYSjRuVUN2OWpHUVdPTWpOZWFOaUZ4Uk5LRE5PZ1BkRkxkcC9HZGVxOUhRSGpEaVd1b2t0dFAvSUxleHh2OVIrbU1raXZ0UXNJcVN0MzBPa3dqSDNiZHB0UXQ1bjJ6M01wZkxsc1FMYTFWQ0toUFpqbndERzBWWWJMQXBzaUNSTGRjTFRhS0VzcUlPbzZ0R3hVY0NyNmE2SlUvR29vckRtOWJ5VFZnVGU3OUtzdnFpUmQyQzU3d21OTmVVK0puOHdEeGhFeDcyUE1JaE82MjB1VUFLL2VDQTFJL2NNUnBvbTdyaStPWmxsb3Buc2FlUEp3NWJHbXNIV1NsNkpqVXc4Mm9QMDFFcUtTY1RyOHFXby9uV0V6TmtzcGhwQjZ1N05PNkFnRTAxVGtwRnlIRWZYZmNEVDdITWcrSmZ3SHo4dGNOWk9keEJ3aUpWT3g4V1RPbmdWTlBHWUp3U1Zrd0ZxVHZJYWtnbExQaXY5d3g2TlRqRkVkcFEzYjNqUVE4NFRJeU45a2JqUmJ4WEFJMkx1UnY1T3F2RHNmZW1UVU1TbFdDUkZxeUlDNHdJWDRRUTNwVnNZUEtjYjgwalhGNDcyRktYYTNlMmxTeWt0VkN3NFQyVFNYbExwdkplczkwUmkrUTBCMlZPNEQraTd0aWFad0JXR1dsTC9ERlF2UGNZVk02emVrQ2hJVjJjbG5KYWc2SlZZaEJ4WmZvbWFhUHR1bk1zckRaWjIybEhiMU9veFNIVlRhUTNweGdhS1JKUXRlck9DNGU5a3IrbzY5Q2tBWmE4SkFzRXRWUVNIN3JuenFMUkorb29OTjRzWlNuOVJPeEVTSHBpTzJWVEtMK2NVYnk4TnFFN0FwT2tPdHlxejVXMmMwanBvTGRlOTBWQzlmY3NXczBkbXovT2ViSU1rMXpUMmxyYlRhaU9tSzY4T2tiY21DSkJIQ3BvckhsN0x5cGJLZ09CSU5Va1Y5NFVNYm5sUEdENVFzeElvR2tBNVdFRlk0SDRiZ2NpaDFOd3F2cmRsZjBDdVNySzRTT0JhZ3N1UGhscXpEZ3lpc2Zodm1BOS9lak5ZN2cxbGlEYW9nY3ZNT0tST0RLVUp0cE9ZUHR0aXVzZjB3TGRIK2RCTHhZSkxzbGpUWmRjdmJTVGtVcTJNL2xLeTR2VnI4ckFMQ1dFWTJ0eDVTUnd0VkNpeEcwcFJTYzI5S0V0RlF0NmoxdktBWTIwQWF0M0w1RlprMW5sekhYNmFzT3dqRnl0WnkxNWhFQWpFVFBFYVpoSGNINU55YWw4QWlCZFBqODlTRWVCRWx3N28zTmJuZFFaRWhWdFJPOHVVeWV3cWtaK3lvUkFkVk1WYmdXM2NMM0JkdEdoQlpXS2xVem1Ud0ZLaDVtQWhZakZiZTRxVE1mNE1yNG5QalhBaGlOczNsQ1pCZU5ybnVocnkwdEV3OHJzOTZhTkY2Q2R1QlN2U1FzcDdYb2RQbU43Rko2RlVmdi9LdSt4dU1JWUJScVd1Z3BsRllhQmx2d29XaHBDZ2trWC9RWWxIbkxESDhpd0RIdFZxcEpSZzE4M0xxcWFhV00yeERCb05paWxFck5XcUVoNlBjQUR5REZrM1hjYzhZMU5YaFNXNGY4VHpyOUpmY0ZkRE1GcUNWOFgyT3V0TEpwMFlHbzV2d25ESlJ4Znp3dHQrT09SWXBaS28ydEc1OU9XTEtadzk1VkVHeHZhRU1uUm9pYlUrQU5MeityQ0RnNEMybjhOTHBHU2lYZm9GMHZ5aEU3RmRjbjVWQmorSEp3VjJZNTRQSjRiLzBVeUc2UldvaTdkR3FmU2FhQlBFbUR0a2RYcE5YZTV3UVhFdXV0NGRrSFh2cHI1bS9JK1FGU0tPaTRtS05oNkNGcG5TMWFMbEVteTh6dXpaUXVObk04aW9Fb0JWY3dPQnVONHZ0MU4yY0NYTmxCdUxKY29xTEVRZ0pDNEFLOHdPTTY4eWx2MWIzbllFMEp5UjB0RC9yMjNoVVpWSE0wTWdQSEo3N0hZRWpES1VLYTh4SFRiV05KUU9Xby9OeWg3QTE2WXhMQ1ZudVdKS2NDZ2ZjeTl3alpEbXlEWThDNjZYazQ0cW05QU1PWjQrQmViSVJDNjhKYytFa1hyN3V4YmRjczB0YmliVmlWODdTU3h6QnpwR1hRU1AxbXdUZWMrUkZCalMvZTkvcm5sSU5xelZTd0R4RVdDQWhWemcza2sxR0ZITkFiQXAxbXlsaGxvK1V2SlpDOWVHTVBnQmFaVXBDT1F6RFg1Vk5oK0NObnUzRTByTE9IOXZsYU1VZFZqTUdTREZvZ2tKZmZtcjIxZ1BFcHl2SGpVdVplWHZ1Skl5MXdmZmNLUGpBVFgvcDVNU3pWSFBHOWFXeERyY2x2YXZNc2UrSzllM0FhYTljc3FlcFYyRTJMUFIyU1JtcjN0aVJFQys5alliSnVqZm9wRlBzTTdaWkdxSmIvN3U3T1hJQ2NRYVRMc3pDTW82ejdFWHlxcDVnK2g1L1FuOG9BNXNtRVM0d1B3OFhMZS9VWitQeU1zSHAwL2FqaVRvZnpKejkrcWRDRENpci9MRnd2UEZlcWtnT1RqamN1OXo0bzZyV3QxN3I0OU5VNGRnM0owS1dvb0dvQzRQQjYrTVowaHJMOEphaDlTODJxZGxkMVZmMWVoSEpnYWNGT2xaZzN0M1hpSHZPcE5Sblk1dXhvQzU0UGt3SmlKdUR5SUpnSjRUallFSEZtaHZYYVNYL1puY25SVGNxMXFqZ0VJY3M4V1BrenE4allheUR3cHJCQjFaVlY5eVRrTTBZaDRFeUxRZ0tFOUFZY2pVSU5lYVhMcmVRdk9XZ0ZkNUJjWWI1dGRMTklJM2JHYnFKc1ExRTVQdU9kUG10N2plMnhmaW9aNDQ0bExramVsaGZrNnUrWFFXVXYvVUJLV0VJemhtY2l3TU43SkJDdkd2L2ozdnpqOS8xZUg1QlRSQjNib0N6OXgxZXdPTFV2RE52cmJUa0ZmK1IwMDJpeXRPRjJ4NnVCcy9IM1JzeVVhd29PMFJ2TjF3US9LVEJrVThaT3ZxL01qbEI2d1Z1RHErS3VnWlZDQkx5Lzh3RGtidXgxZHkrSUVUOVZaV1BmWlBiNThuVGNQOCtJOHA4MHhRWW53TWpEWit3SGRzREsraVdhUnhKd2VVL0p0NlRINmZtSGZ2OXNrKzZpbE5ONkVuY3hPeEFyeTU1bFlFK1lwRmpHblRxd1hvSCtYMk5uZzFlS2xOeDFtcjlIajd0bWZNcnJLMzE4SGQ3K0JPdFRENVZQbG5MRDRtNWw4QW1LNkYycHJuVUNVYmgzbG84MTAyVmdQN2VTcDlkNmYzdkhqakQvQWliaTlCVFlQWVcrMDlieVd1OVJBY3I2bk4wVzlRZkhpdk4vWmV1cUZ6ZXVuczR5ekVtQ2JZNHR4WDNWZTRQQVJibWtyMW10WEhpUXhURUxRdVB0ekk3SWl3enkyTVVRakI0S1FXODQrM3l4cDJ3Y0w0bEo0ZjRZYkFiWWpzcHJXTDlYWWpsZjgxOEFCYlh0dCtiUWlxU1dMZjNaM3RlSHZNZzN3YkZXbVRzRzZkUHExZ0p5Rlc1OVNOdjgvWk1pUmVaYW5JUWVGUys1MVUxekk4K0N4WE5uOGp1M1ZxRFJyY0dXN3g5NXM5K2FScElvWTBucTZmaXVnd2dwZEJ2aCt5cFZndWhYVGc5VEdNQTRVcWpCR0tFTFpMbXZYS0ZIWTZVUnhuWGduUWFycnhibTV5amtOMTh2R3lWRUxIdGpnMEVyV0ZmSndOVXFacXlxOXRIUHhKbWkwYlJEV2FMWElqUE1zU0hwbW1EUGRiY3VyTFhzNU1hV1VyVjhNdHdLWTZZb01jQnNaQTUzeFExb0cxSWU5TWx2Sm5RdS9aYjF3Rit0dWJOUDJ5Q2dhYUtHUGFoL0J3cGlEN1JOK3pHaVRZYk5UeFZTcnJCWXpubllTUEtvM3IvUkRrZzVIUkwxZUsrUzh3WmRGbzlHT1pNdTB0YnpSOHNiRTBQcVVvZFFKbi9wc0V4bnM5V29UTU5RaEpmNHMrc1k0UjNWUWUxa2ZHS2xlTXQwTU40aVFqcG9weVVoTUJzcEdUMlJFSm8zOVArRlltR0p5N21vWEZ1SjBYbllxcjZuT3pnVlE1ZURMZzY4QW5FVWFDa1o0Smh2YjdiZTB3L3N4b0VOYkVhZ1EzNGloeW82anQvcEdoTFAxNFJpdno0YXh5NDI1UjJwa09xcmlxMFZSSjgxSGtMWWN6c2dOR3VuUUZxVDVtaTdsTGdQRlQvNjZ4SHFhdDM4MG8rZUp3SnF4eDJMcWVVcmtUM05IYVIvL2Fhek9qVExpQUVTZjZuZ2J6Tm56UDJ4YjZWWVZaMjNjMXFzSC9FZ0c4TmNlYmJCWGFZR2ZrdFlQOXY3dDdlUkFIb0FBaFVrYTR6VVpEN2F6R3k4UWVYYUcrRXl6NUlFNC9XUnhXNko2Y3lDQmUyaUZWOCtzNllKcjRHL0R6RnJKT1V2WHNkVW4xUEpYU2dqQTJrNUN6N0twdXN5bHdvcDNVMnFLN0RTN3JNWEpjT3o5b2xjYXFLclh6ZHllS2NPeGJTSGVCbVN0a0c3ZnlmbWMyU1kwek05WS9xd3NoWkJtc2UxYjJJb21yWGhoaC9kdGhpTm9hNDdnc2QzOUxDWm10WUM1OG0yUVF0NG1TYkdCQnNXaDhJY09rS0ZVeWtqQXpJZlcxcnlvOStOMVZsbnN3V3V5S0ZsUXJoTWFrNnhCdWRaWnZVSTNiWFhJQWFXVXdxRkI0V2cwS3FVTmdkN2poc2ZyS3hqZ0lUV2dXbUNJdlZHWUh1WmNxTVNLNWd6ZXhDbFU4Yi9iTFlZVFV5TStQbEFmVlZESzl0bGZ4dnI3NHNBZUxjRmR6NERVa0hyaEJUazZ1Rm5hanFsblY0R1VUTVlZNWhHclVJVkEyZ0xRV0g5SlZBYzNBdjBFNUExZ2Z3ZmVtL0g0UEZnY1hucDRRRkorN1UrY2J6VXhGZDh6a3oyV3VxNVdUVS9hSEVXVXRPY2lIWTY3REZNYWZNdGk5aUR2MXFMSC9LSlREU0FVaGhDYkkzWndPQ0dESk45ZVlsMnB2NFJKV2FxNXpqQ0Q2aEJab0RZbnRrQUNkM3d3RlcvblYxa1MxR29oMjhZbzBSM0x3VlVGSjAxcDU3UnpBd2NIMlY2ZFdpVnBJWGh3WXRBd0dyMVdxcSt1SkVUdllUci9PNnZsbDNjZ3NTK3RtQTN6RFUraWk4T1NvWUp2Nkc2d0xiay9ZRDVic2FGSmxqcW5EM0V0MlozRkk0Tis5c3dsbWRkUkVEYThHWlJzNEczbDM0T3c3RVZlditnZGNuZjJITVlTYlJFUlM1R0tFYlJkQVZKcENrRnFick5nNEFZSkY0ZjVselhQcENIQ1VLOHFqS044ZGVFMUUrNE82RzdWVzJweGJrenpPVUlUUXlxeGN1ZDZNWjhld1ZtT1dwVHZ1MjU5VkRlaUZNd3hBNUJVaE5TczJkWHY5QUZyZUpMS29NV0tua3BVYjlncW9tVnlvQlBwczZUc3k3V0FFQlp2bzJ1Q1gzam1ZS0NhMk91NDg2cDNiNGovZStjdXlqRW9YRzkzelZ4R0w2QktydjQ4L3lva1RtS1J6VEhFZDdvbXVFMFRMTFVLMkRTTllaWCtwWkw3b1EzZG5iUnk2c0hPRVdZdHY3dHdmZXZ3VUNVS0xsUlMwY21XNElZMmFFMG0xdGR2azQzeE81cFVsSHRSdEZKNE9LUmI4dUVONnNsTURxTVZCK3pMUWpNU2FhbWlQazQrSG9WM05OUXNkYkEyZnhsL0VmRDUrYVBYTG9oQVdzNDhsek5hODhQbEM4aTF0UnA5TkVzQUE3YVgzei9LN0p6MTdIN2FwZ3cySU1oMXRyTVEvZW01aHBmS21WdEljVGYxUmhHeUJCS3ZLc3B4YjltQzJrbG1abmlFZ1lIR2JjYXJRSkVJWU9GdGQwZmtwUkx5YjlvNVptYXFSTWxrQ3hWaFRFa3l1a0w2cTliQytRRHd1RVQwQVBMQ2UxNlJjNGc0b0UyajF5RGwyOVFPUnlMZkdhKzJHZzNsUGVBMzF1Ykl4aDdKandua2d0cnp1L1UxbTIxNkdWcERWK0R1TFIyWWNHVk5yYkNiWjN5NE5yaldxUkg1M2FweGU2SExLRjY1MkI1R3NPOXQ0bW5FS3pFRDF6ZUp2Tmk4R25tRHZLK2tTK2hDaDU5S1lJV0x2aEdzTXg5bWJEanFjUG9WMzN6V2hGSzF1NUR3UzNhbU5oNnE3NDNQMkx0YWtkT3BiZnZ4a1hZdVpISm9LNFNodGo5cnNEcUxuV3dHTnA1N0dXQytIRFZoeXpCZVU4b2Zhd2JDS25DUnliRWZmWTA1T0tPdXRzOFNmdEgwWjJYeWI1VUNkL0hlNU1ZQ3lYWmJzL1poSmErZTJ3TCtGYkMwOHY5akdCeEl5NlNuTTd4YzN0YyswR1pRTFdDaGpzMW12NXgwdkpjUDkrMWhlZVhvOTZSNFp2U3NUNHFxZloycHhTb3gyeHZHbm9YZnhVOHAzL28rTzhzdlZiSjlsUFo1bGY5NytNbExpZEttQzhtNjBGdlh6VzcwK3ZkWFg5VmdZeUUyR0pxS0NOYzkrOG1EQ3J3bTJraHhWdjBPOUNuWVZHN0wvMDZScUtLdDREekhoWDhIUHJxNW11OHhUREt4OFhUT3VBRHZtQkxrb3JrWUdZbmlJZGRUS0lWT2xORzVQeHZuYTZqL0IzU05yc3dVQkpnVy9BcjJQN2FJQ01OblhRRWJYYnBpNmZ1cWtXdjc3NFFLekpSQlpEb3ZyalRwL2lyc2hCTXNpVVRmQ3YzRmtxa3BIM0NuMStyY01ENENFTkxvQkpIalE0OVpaS3V4U3h3Ry9BYjdmamFTdTkrVisrZEdYWVp0b0NoNCtRUTA3TW5tRWpZVEJnN2lVZjIzOVRZelhwK3pheldpd1RvQlFjTXhKL0QrYUg0RzVhZ0I4SjhDUkQzMmNDUTlKUHhxSTZwU1dqL1k2WW9XWTlqb2Q4REV3ZWwxbUIycUZyVXF3Qk5EWXZrQnJMdlBjRTNBZU1uemNzbEV1aFAzYkZUWmtwZmVFVzJoVHdKTTJxL0RTNDg4ZFVBKzFsNjdlRHhLMkNxWTBOZnU0cWRqNVB1eCtITGNZRGw0SzU4Tlh2dlZ1TmFDMGZRUjRRT3pqSitDbSt1UmZiMi84aEVMdDhqbXV2VitSa0M3aVp6dWdVc0VBTHZhTXZjNHQvRXZVbjZCYU5hUGxubldtRDBick5PcjY2ekNyTUlvZ0dPRXRud1M1cHFpUDZ4c1pKNGI1aWJDb3pybHRKL1VkQWJUcU1lRld5dWs4SkVqSERtVEo3VjJCUFB1ck4ySzltTkwwSVlibk5HQ3VWQVcvcnVyZjZZdzhSa3ZVUHBzYW1hNElobzB2bHRXeWNGU2pSMHMxS2E5UjN4RDMxWldhOWZtN2pVK1M4L3NuU1M3L1ZwUWNrK2RGV2t1RjlQR2xlL05VMnRzVTJXNXVBaGZJZldkeVdjZHI0S1JLT1hMK3VEa2RXVTAwV3RHMGg3eTFYWWpzbDkyMTZzWnBnU0xubGhmNmZMVklGVVRjek5ldmRxS1Fib3FqY3RxS2laNDhVYytvVDM1U1hYM2xYc0gvTXNxMVZhSkVlOTVwWDBJeHI4L0ZvQUF4cFdkV0dsUWlSTE93T2tmN3pOMlJZVW9pR004M3doSDdMck9jUEtYVkFEVUc5Z3V2ajE5ZW1ZTHRJK0h1SG9NYlV3VEc2SFo4b2NyQ1hOMHF4S3dWT3prZmpnWGdSZEhTQUhKV2pKQnA5RW54QjJObFNoZmVaVk9lVXRTdVEwSFAycm5aTStCRTFrM0FUcmVtbDRlODUzbGRkNG1BM3d1TTNER29WOVdocGlaTmtDMWhpa2g3R0JkQmQ3dWhSVXNoU3FPT0JmcHZqTllveVdCc0VtbHBSRnhzc1NZbTZhakMwdXJ0ZlU1Wmg3bU8yQnQ5R2xKVGg3SUJKNW5DRlJxYzdHTTFHMnhyMTJYaXZsbC9jRGdTNEFKRDMvK0RTUnlMSittY1E5QkcrNFNTMVJDenliS3NtK2N2Q2tCZENwK3FYTVE0ZVg5L2VtQldSTDMxL0ZwZXJaSzQvaDdic3l5bllxMEJHUnlIMWxsbktSc0lSa2szK1h4NkE5MkNHVUNET1psOGZaUTVSVDZLSjlOWGdsWmJoR3Y0UklrNjFqTkxkM0ZseEJnOHU1d0N5WjZPS3k0LzJNams2bDVFL3JhcFBsOGNiQjFkRGwxL2NHQ1ZRdXY1TVVOcllBMkpIbDBoSEVyekp1OEZLNFNab2pBMWtWVXZTK3JRaDhjWGo4bHdxSk9QY1c5SDJscms5OGhwTmJ1ZmEvUnE5VVhSOXlRS2k0UVp5QWEwWGQ3eUxjUVFEMWNBZ2JvTm5YbjNoNytrRmkvdituMzYrdnBIQUIrbVJRc2lJeS94cFBKMkpCR3RjWUxXNExGVXo1Z0pVdXR0akNDNlZBZE1MU3BWZFFLdDdYTFZYNWxnYmcvSWFIM0RlbDM0SmRvUk16akxxY3VvSGRUKzZEV3ZFamNhMVhjWWRicDJwdzdPMTlPNm9FaVdBRStvOTVjYVNDWG9ydm5SWHZDQmxibzBFenJhUTR2czNlOGhySGdOL0UweDExS1RFY3B1RDU1N3Q1QjNieHlma3Z5ZkJzekJ2dU5qenNsWldpUWVrTVRRVGY2T20yVnVMbW05TVJKWUV1bURsR1M2eXVjL29CNTZVbW55ZW92MGpFRXJvcDdnSXIrdW50VkE1Q2RCZzZmWjMyQXFWb2VNK2hObGtYV3p1aUZ3M0FzcjNFVXh3TVdQRjVQaDNnVGVwams5amJjdmhLNjl5eHVueWY1MU9rcnQ1OFR1dTBOL0pTODNJZDNBN3NvL3paUngwYW5pbzUwZmVSbzZ2aVdsamtmb3dmUERRSTVGSURIL3hWQ042QjRPUjlFY1VqellkaE1uVTk0aHgwME9ubXB2c2oxbUltdXJhdlFCQ2JpQTZCMEkvQ2lTbWtEa0NoRW8xam0xNEpJQTBxbzBwK1NOdzZROUtLRTZJTHMzRm1LZGZTeUpYeCtTand6aitwZFA3Wnd4alpCTFg4ZkpxSkJlU0VTTExGTTQ2Mkk0alh5Ykl2T205cGpaVkVmdVEzSm9VQ3RINnVnbFFMWmhVNERLU0gxSFNtY083US9VKzFKS0g4eERTeStaMW9EaVhyUnliNnVoNlQzOFNveThMckc3eDI2ZEFVTkkvRzVHKzdmYkNHTU5XdFZFU2tzOE41SlcrQlU4U01xdy9USkxNbXo3MjB2MHdZbVlySUpzMXJVeTlURm9namRoUlJIUmhHUWc2cE4zUnhaT0JWQUVrRG41ZzJCSjZWM1BSNWFMSTFrOVVSTElvbkhLR0RrSTZ3UEw4NFQ2OVBabE83ZWo2L1cvNEJ1WGhFcllGTjVXZktRTFAwZng5S0ZTRDZkNVJxWkFKR3VkQ0NSRmZnNy9kYWQyRjdBNFdBZ1QrOFg3TkVJa3lLRjVOWFBmZ3FHeWkwa21ENGJXQTZhdVNFU2M5STdWaEpCSTFmeWFEU0RZN29hNlR3Mkh4dW52U1pBdU5EeUlNZmkrOTAwMGFIWFQxUkhHQndZUEl1elM0OFNIWnVFbWFZc3lLZkpyMWE5TWpXZGRVUytlekFxVDZMZUdia05ibm9PMktvUXBTL1Jib2RpQ29NM3F6eTdDQWxvSUpqNEpZb0JLM01mbTlKRUsveFQ1azU1U3RiQWtyWEZmV0QzY09rWjN3UUZHelFwWHRQT0NtdjIxYWN4UzVMdGMydHZOZ1VwWUtiNmhOYzQ0S1NCWUtoNExxbWdsQm9YWDNBN3NuT0pzeHBlQlloZ3V1TnhxR2VoOUE3SytwWHVqOXRQdHgzVEE5RmgrZHpMeVMwbHQ5ZXVXbldYdGg4bWRVbWJ0VzdkK2FCV0ZUUTh0NjQ3NUpya2kwWkIzSlpWUFpuK1htcENoWkxQOWtHajVJRDk4aW9sK1h6aW81TGpRTUVjZGtLUXZFYWpidC9qK3JybXFycXYxdXdCc2FFTkJQOUlINnpyNjV1c2ZJc1MxbHdRTGVaaERtZWF4b0dRdmZWWVRIcU8yQnpoVjZRWVdDTUc5SlpTMWZmYzMwalFkMzR1YS9hazBLZVp4ZlFEN2hpZFNXWTRKWUdSdWZlY1FzNHdrYmNqZzhVWGZweHBEdnJZU1pTOFdOYlVFU2ZIejd4aDBNREhOemwvVVJMNHFYWXc4T1cxZWFGak5MRFhqcTI5UEh6OWg2SVc0bWU3eGs5Q0dVazROVGRHc0tJNWRVdnBKQ3JlZU1mSHF5Y2ZrVG9VNnBScUxTSTUzaDU0bFpIM1hLSHM1SmZqUi9nV2pDWEIvMGk2Nk1OY3RsUXpGS2pzZ1RtMVV4cTh2Mnl1eVhjcWFVZFBONGorL0FkY2x6c2c0d1dMS2pocXdvalhkY2psR05vbEl5elltbyt0bUJKdkFXZ3RZbzVucGk1ZTFuNDFham1LYlFNMk92RndvTTNaU0lJOXBmeXA0NGMya1JhL2s1dmI4Mmp0WmxvWWdrS0VTVjBoL2E0VnRUa1VrWC9uV3BxNWVyL2JHYWFKNWdtN1Bod1hobTBJUjNSOHJsUXpNSUhUSXVPVGJpdUdScmpOaG9lekJNc2RYZ3FsbzU2Y3FmQ0VmVldoMncySG5LdHU5aXhLcHRRYndmb0NrMVEvekpDV2p6WElLOFp6Q0U0TU1sNk1VUmJ4MkFhZTI3VVgrVXpuRTZSU0NtVjVKOTFJUG1VNUZ4WTBheU5ORXA5NlRuZkdoVjdUT3JUY0RGQmk5ZE0vVEVKNXhrb0NINUZIczVYNDZYVnRiMHNSNmpvUzRaZlJQMDc0dHYyNDhPL1VpOFBnOXhaY2xMb2xMbnJUWTBwVDVPYU1kMGhZcDFLYWFiNkp0MzQ1WjNEamNzZDRYTHJkQyszMDhPYko5Q05FZ2VqRHM2UUlrdzAremxMM21XaXlMazdyaThzM0pLcVBnMG5IYUdHZXgwNDhjQWpreUZnR2JHQndFakZYeldkTUdkSTFEalNpSnhtZ3ZOWXNURHhkUDg5WlM5Q1VzSzRJZ2hDZm1yVU1KQXVpT3lmYjg2aEp2U3IyN2FsM1FZeno0cVFQTCs4bWRHVVhRTGlmMXptbWRpUWtnNVB6M0doU0pEOEVGRmlSOGhueXlXbGVSQ05ZV08zS3VCZmdLekJxNm9oZUxtQkJ5RXlnNzUyVllPTTNyOUNHNElaeWVvVTRtb0FxWkxEWVZJbStoZ3N5bDlxVkRNWE96b0tlWG4ycXRTdmtYeGdkKzgxL2N5VGRBUTUrTmttWXlYV3ZJUk81WnBTVnIxbFRpU05RaVlOWFNqTitveWtGaE9ieFA4ZkI1QXlhcnF1aHZwWkttcmxvT1lJcFpxLzY3TldjYTg0aHQxOE5JNUtIZllkeWxGMlhvR0NhcFFLWWk5VERDQ1M3MUo1MFBLMzd2ZVlCNThZYnVHdVRRcXJua1FVWXYvOEFzMTR5QkZweit6V1pOYjdYV1l2UG1EcCtBQnRTN2pMcTdkaXFzSmVxdHlQdHY0Wi9DNW1lWjFBTDh2NjZaZkZPRXozRXdOaGZid21kSGR2RDlhRjdrY21ydGtuUllWSXhwV1ZDV0dTb0RKcVBFYmZoMzNVTmFzamwyV2hTQWR3Q0JrcGxBUDJVV25lVURSRDQ0MmowVmVIWE0rL1F2Qkc4K2c4OWxlMDkvdTRWRXZLWkRKSHFrQXJHRXJ3ckdqRkFLaXFpbExlU3NERGNHL1d4bFU1d0xSaHZTUXZLdmhBOGQxYm1nOU9iTnEwejJKVFhHdFlaZmlBOUwrRk1TTlY0d0dHc0pqUnVWbTNSM3BDeURYSTB0VFZZNytKbjVoSnYxakt5NWtOdElRU2hBK1RpMElreHBXNFRiV0tWVk5UNDY4eEJXZVhMekhSSW5DSTJPL1l4ODR3YkpTV1dXOFAwa0xYbVpSNlZNOVVLSkVpdUQ3R2taOWxwUFN2SWF6ZEFZalhWUWxtRUYvWjhrNVhWai9EdUpmbTVXZUdjVDc1S3F6clhQSXlvTEdzUjA5SGlqdmhtV3BteGRXN29yU1VYb1o5Y1lPM2pGeTM5YXcrTkp6Nm1NK3V6K0FGbmFNYUdEQ0tuV3RrUlNORFpXSFp2T214ZHBWWTM4ZWhNM0FBVGZaQkxiZThJNC9ReUtneG9KVi9JUzJQNWpkTkgzTTZGZkFLNDc2YWlDSFM5TTNBeHo3czFjS285bStXMTZRWkI3U0hYbTZVL012U3ZQeWptTFE1M0VaR0ExWUNsSEFLYlVTcTF4VDMyQytBUW1Zdk5qOFd2eU82MnRUbWhiMW5HbmxqZEN3QzR0Qy9GZ3A2SXRKZDh4bzBUVHZ5Ylg1ZTZXRXhNYmUrTlIwbHIxZGdMakRrODBISkV2SHRCMFVlTys4WTF1VEFlL09TVlBDU3Ryc203dWZ5MFU4NkRnYVJiNi9MQVRGeTVJdnNXUVFEdzA3ejJzY2Z3NjIvYjc3L0RYWmJQNzVjalBadEtNMEY2NkhHY2NJNThobUlaU0FTVDAxZ0xFQS8xTjNJUkhZRWk5RG83S1hUdXZRK0twenRydmVqMC9nVEJmV3ZDdHFQTkFDbWlMeFV0M3BKVVAxdjdBOVUwa3d4anhxRzJBa2UzUXVTeTNlS0FuNjdQZ09paE1ZMFRweFdEUVdEQWZ2UlpNZldhd1A5V0FrS2VLOEhuZStvZnVzOS9JcVduTHFxNTBiVCtnYmRyVnlZODVKREJYOVpqc1FkT05kWFg1M1p3NXpBK1pnS0VScjFwOEZUZy9Nd01OZmxWb2xucjZHMG94MFIvOGZ3WG9MdXp6a0owSExXNzRIWXRkdjF4NEIrdThUNHQ5S1VvRFFYTWkxcmpsdEkwSm1UbHM4U0JPY2E1KzNWSlBNYzhRdlhrZUR1ZU1qOWJKT3JVZVNrS1F0aXdHelRRMmpPUmFXTXBIaTRFTWJENVFKNUdKd252clpYY2lTOXhkRkQ4WFdZZlNSUk15U1VxT3VrMWZmdU1ta3RrSS85dFdrRDFtblVBY3Nud2dDc2RBL09IYm9VMDNCaVVTR1FjNE5COVdXMmFMTDJPdUxVWW1OS2hON2lNZ2ZCbUtVZ1crM0k3UlNCV3lTK0ZNQmk4bzhja3g0N2J6bVFjRXRlUGYvOUMrTzg1T2ZaM3RsYjZJcTBBaFhOV3Zlc3c0OGN2TUhUU0M2ZS9VaHowclIweTN4eXp3UXhzS3pGcCthS2RTMzJVcHd2aDFIaCtWUE5FdmtpT041a1BPQ0pkanhsUDlQTmtPRzJqMHBib2o3cDNremxQZzJBalB4bEtCalYyakhBU2lFcERKUGU2S0JyL01wUTRZZWFnbDB3RXMxcTN3Nlp2THpaUTk4YkFnTDU4Y2N3TDJ0N3NIYWpsWVZCVkRTa3JxWXBMWGRTZzJYZDVHWjduWHpjbDVkdllnTUIwWkFZV0p6M2cxK1pkcVIxa0lMcHB4a2YxKzgxWUt4NFpEVXBqMjZWOVl4OTNWK2Q1Z1Y1TFdLdnFjRXRtM1hGdzVTaXVMTVMrakxabmhzakZKV3pqVklySkZmUFpwVVo5OXhSQXVCOE8zQUh1Z3Y3UVM4OWx1U1JxWU1ScFdEdVJZT0NvVGJsd2tlZ1BTRlFxWjUxUHl0SjIxQmttb0pWdXIxQllEazErUDB2b201UmI3RzU5a3dpYmNJSHpXN0tpc0lTMkcvWWh4WjFETFlReFRUalZ2VExoRVJIWmY2V0Rla29nSUxmSzVmUWhvSzJ4YmI2Z1JEajZlTEF6MWMzTlBjUFR4bDhQVk1QekNVL3I3VUltaHNYdjFad2xhSGtiZ3MzRnpURlBGbyt1TlFOYXAwd1pOREtWWmlVSEVrQnI2RmpLMEhQMlM0Uk1ZUkZIL1JhWklMcGV6YTRpcnNTK1lDVkxZOEd6REdrbXR3cStIWUZYY1BsTDB3TGlsTlFzNlZmZm1KZVZtcHFMcm5SUUI4aFBqaGJBdklxL1JLcEpSTGJjdko5V2pJYkxySFF5azIzamJzb0FIR0ZmOG5SSHI1N21mUnNZdGVUSHRaU0JoV0pTbFYwdFdITksvWVpsME1uSUVmOXBBZVhMT1JUYnBjRXd4WllkMkR0K1BpSk9xUlJiNm1temJyVGxmUUNuRDl2eUNQTHZNRkdhVzdzVFJTblFPWFRacVA4TDBpWjJvWFQxQ1ZNTXZmVUdHWndnZHgrRnV3SERjUDcxUzlSdm1LN2pPSzFDeFFIT0kzaWFKQVdybEY3QnNGcE5QMkdBdnFaY0hpeHh3Y2xMU0tFeHVqa3FjQXF3UlBHcTlWWDl3Z1p1RkhGRzdQOUp4eU1mZ1BvWVhJMDIzWGkvTE9NdG9xaHhFQ0xHeXpsclhNQUltZHJYZjFCT3hGcUZ5STlqQWhxQ0FXWHAra00zMHVNbHhJQ0w3YmVkK2ROaHBjRWZ4YXJmVmcrQkZ3VXc5MkwxWkpDVWkyWnQveU5xN2pGYzBmRUhweDkzc3l6bjIzQlRndDJqcUEwa0kvRmUvTXJ4aEcrTUI3dGo1MjljUGx6MjUxQU1QanI5Smk0ekFXOWhVWkVXa3BDU040RUxadmVLdU9YL05jSWY2ZlJXaG44N2pPMmdvOWVLQmNYRG1Ca2taa2lwS2k3Q1ZsdWYwdGllZkgxbjhWNjBTeGFhUmZJdjllcElaenloNC9KODIvSzVFRXZ3azdiTFI2dndEYU40UWxqR0U3bFJvUXU0dzRpQUh4bVFYVUR6WU8rTlRVemtIT3BvOGxiSDFveG41RFZnVFJkaUdSRGhwWUdHY25CQUtYU25aZ0RzWDlXb0JSR2VHZlBRU0VaYmtCTzZqeWpFMU4wcDdJNTg3YkRlV2hSb0YvcnBIRDBLalBmK0cvQ0lIcmlCVFlnSU02dzZBMVJXTng4cER3VUVlbWtFcTd6OFFzT3QrOEppSVdlME5YdDRPaTMwaG52cHhZTENsNVpWclFSYkkySlQ5clNLeTVsRGNJajdpeUl2cEZBNHJ3OS9qZFd5VHNzUTJkRVdaLzEzMFlib1BwUWdJc1pYRWpBMXZIZ3FselpjYXNJZzhsMXRaSUZjNGVmMnBGRlVmOFVaY2tRMDFoMmQ1Q0QzZzJwUHpGSGprLzloU2JJSDJScmduYmdhdCtuQ2Nnd1RsRXdGck51MG40VkVkd3QzS1dla2FPcHRZL3VreU1kcEdSdUVHWVZ5RFBLaGFvTlh4a3A5Nzd3S3dnZGVUOFI2NXNZZG1YaEZDbkFzYlV3bDM2dDM2ak1YMWRZTVJPQU9XM2VFRUJnYjNEcE9Vendld3NaNDlIaWdVbGxka0Jya0ZoTUY5d3dXTzBHb3hveGhHc1lueDZmL05VSVpFa25ielo2UkVwLzFTQVVyOEEwN2ttT0tvdHlCZVllQXZLT2ljUU5tYitZOWJPZjFpb0ZTOTFjeGVuWXpsVGpWd1gxQURyZ2J2WnNZWVREVkY4MCtXU2JzZkd2RTdYZ3pSS0lUaUFzOFpoOE9WUnNtb0dQWHJTYmxka1lqSFhwN0RDWjd5UFl5NTFGaFowZjZpRk9ndyt6NytFYlhuYy9TQmx0TEo0NE5DUVlVT1pkeWxzODZUczZhWUNlTWNJZmZhcDNhenhoVnZMckl5YjgrTjdtb0lwU0dBZnovRjBybUowWFF6SlNhOFF5d1g4TFdqZnphMnBrei8yUVVNTFh2cVhLUStpa3Z4RHRCNEVzNGpWVjM0K2dmMys0N2tJemhYOHk2dGVhZUI1Nld6cERTVFAza2FBVEk5VDNmQlQ0ZXZHUzVOSnhaSVpBWmNRWjlaOWJLaTdOSmlqcHdYdE9ucXlCWEFCNzhpRTF4QWZOeHgvNnYzOWFCbU9aYVBKVDcxL3k4bUhjUmUybWhJcXV1alhNRlh4V1V6MDlXWk55a0V4WFlUeTdDd3RyRkw1K0tCN256MHRqeW5CQkJzbGtXZ1h4eGR6MXo3c3pQOGVGdWczaHZrWUNGV282RFArdmlYQlRDQTkzTEcyUjBHVHFRdll6S2FobE1FWDZlTFhJcERWR1FvMFlhdWZ1REkyalVld1pQN0tRdHVhNGlNbGpzYWxGZnhqYXpoNTVHM3BiK1hqa2JlWHdPZ1NWejVHWDNtbDdyd3puRWtsdXY4VlJHOVpzaDRWL0NZK25XZzRpZzY3YjA5cDRkMHFGTkpSYkptWmVuVXF6bnhYOUtMdkg0aW5ON2FzZS9Mem04TldQaWw5YUs5bDdLM1ZLVHVGQVpCcWsvWUFqL011NkEyZVdtM2I3MTU1QklNRW5iL1JUYzY3dGNQTUhKV3krWUIrc1VMMVdhUG1wdEIrRzJGTjYzVnNhOW9yOWp5ejZnVEpNZEtVNThUYXFjTEMvVWp4RjBUbEpQa3NENUl6Uy9lWXNHdWVYSnZtUFVwUGxVQWh2WXZvN2hFc0dVZm05ZnRFMDlGV2cvMk9Gblc3cFpDa08xdUVqNnh5c0xpblUzcCtjVTg0cmNjZHNrYmc4S2RLNFlYdkRBdk9YM01ZS3ZkZVRVeHlPY29KNW0wL3BrWGVwSjVPM2xqM3ZMYVRGRk5EVlltb1Jmc2tiZDgrVnVoVW5EVjZTNS9pZ3FjNzNrdUZEclpDYU8zdktTZFd2M2JTT1FydWZOOTNKY3pXYzNhTkEvS2JYTS8yRnJiUkVSYURKUnNRdTNRS242Z3NRa3JZeldCbC9SazVyUVpxSktIMmZzN0VDUEIraDhTMTRuYWQxRk1RWFNPU1djRnU0NWRNRUViY1pYTjBkU2xDZU5TWGhKcSszczJpMkMveVZlYkUxV1dIYlgzeVRmTzRVNnU0V0t3eiszUGZ0d1BNY0JTNzZXYXk0bkM1NGFySTdIMXhXbU5CTDB1cTJvYVVQOCs2TmIzWStKNEZLbFpUZG5HNlVnT0pua0RFZ0M3TkdmWFVUeGxNZHBVZzBvY29IL2JCYUFodHZ5NGtwNFRoK0JRZEJLT2Iwd0tPUFRBTCtoUWtNQlowUkZmRGtoVXQ5dzdEOFNQbDV0R015cDhpbTRzb0ZkODFvZTNhNW1TQmpIM1JUbUlNVUhWT2hzNjVTMHcrdFU2N1FSbGRxSTY5YXVCc0taa1NQdmlRWG8zdjh2emFDRzFSb2ZEdTBPMzdPMjA1N1gydnhqZm5YRWRFczJaYW43dDBWVDQ0NDhML0pWSi9tTzN0T3Q3MFhlOXVXa3Y5VVZSd0JOaXVBci9DNHExSjY0MFN6T2lObmJodFFjMTFhNlI3WHUwUWpQTzZTWVlvT0FNeExMbmMrcUtvZ25oWTN4cmhaZVVJSENuVS93bVhoSG5McmtwSlduSWEvcnBQQlNMQVE2ZEVuRDJhMlVUUk9taTYrOG5QUWxZd2dDQURXTllxbjMzN3VacDVzNVFmRm8xSnZwb0NxVEpVellsbGt2OFhJeUpXRm83c3J6ZjhFdmZYVWlQenh4bCtVVTJJNmVhZzUxQ1dIR01UVC9QWmlnK0RvQlF0bmVhZHFwRTNsVHpFK2ZsK1ZBNWtMYXFXWi9Sb25VUyt1eTlZdm1BMm8xS1o4dmZDLzloQXhyVjFhZ1JpeStWUzJ3bjhOMGh0aDNQUDE5VFZwcHdsbUd4SUhWWXU1SWJ3UkVyQlZPVGQ2QUhnT1R1YitCbzMwbktESGU1d21kc08wbmlpTGxkRGFnNy9iQXVJaTltZksxS21qbng0aEFTNjJyTjd0V2QrR2pmYURYVVY1V003RDZJSTIreDI5RHF3dHdPY1hLUDBKczdCTzUxdmlsbWxFSUl1VEJXbHhDblU1aElSejU2bFlFK0F6ek44Tmg1T0E2ZXRuS3psWmNTR0NHaUFnaDIxN0UyTCtHK2liOXZFVjlrbHVWZ3UxeDJqUkpoNlFrd2pOSFFwTDdzY1lSbnJ0V2FQc3BXUDQ1SUVOTTlqeTZuOHE5SkM0OWdyMXlkRjMrc3EwOHlkUURhRTdKV1ZiV1MxQUpkZ2JhRGYyUytYVDBLZ1djSjBkSkRrZGIxdk4xWXBJKzIzMEFRTHJDcEFtREsxQVJxeVVXMm9zZXdRMFpiaXlzbEZsQUR5dG5aS1FQRDNkeHFXYU9Ka0tFaFNyK0IvR1IwQXA2YWZPeS9qeE9GdmJoRy9ja2llTUVnQ3I4RW5teFB2cyt0QXFMRlhxZVBlS0NzaHkycFkrVTFYS0dYSHlLS3cwWXJJTHBNYnRXRkFnOFg2Q2JzcS9xNHlRaGlWNUNDVmdBU2NCWDVwTTFjUGdvWldNS3RhamNWRzhaT01LbTUyRDhsd013aFJ0d0NsQ1crMUFIOURQOVZvVlhndzlXaEdCb3FEdmtRQVo0cGFGUlhNbzNGd3ZnV0RScXIyVkc4SmNIN01GakRnS09oUXlSL2pVYmdrSDdJbGFLTDJGZ3Nxd1RCdVR2NFhFT0UvZXRJR0lyakYvOHR5bGprRDVpTXFJMURQWHA5WGtiM0w1SDRBQjEwSXhYSjNoY3RFWVFIMkVIMitlbm5uU00xUHo2LzN4NTJiNVZ5RFpIeFFQaktFYTlNY0ppNTJsVG5zdmQycnNBbnh4dCtrLzJscnZuRmFUZDI2RW1DTFFsQm1vNCtGQ3FtMGRHZkxTeFhxZHdESWZDcTBGUjF0YWNwVEI1a0ptK1FsUFBqMEQrMWkrTWc4ZWgyYURBU28wNDhLMG4zYXJMOHZWS3BSeTcvTnU4YXhXaE1PWnkyUVd2YWhtb2I1dG5YSWMzNSs2RlNUQlB6aUdXZS9Fd1huYnVxaXJXNk5RbWYvYitvZnBWRTZPa3pudm1LVXE2NW4wZzMrMGp1WXBIa2dyRWg0V1pUVDdFMEQzcWZQQjlla1hHQUJVRDh5Y09qTnNpYmgwZm1hOHBDYmhlU3Nuc2hkM3owYkZwR2JZdjc0MFhCdVV4eUx1Ylo0cUU1N1d4RGkvZ1cvVTJWUjRZclJRQTFWSFZEVWpKNEdoKzF5RGdSSFpiQ2FiZ3NhcVg5OHRqTUtaSDZJZjRDQlBkTzRZTnRNK2ExdzNQK0MxcjBYWEFvUFVEY3dwZHhCeG9JRXkrWTc5ZE1UMTc0NHBjK2hGQ0tCQ3J6anQ0U0JCb3pZNW41S0c2YXEzQzAwdzdjcmwvM3B4QlNnbWJuVmRxMXRhTGgwWHV5VW9kdU53T0lFWXpEeXBpN3FwZEY3US9CSHRiM0l6cWhUalEza3Z1SG00N2ZNUk9JSko3RW5WVGRHWW9QQWNvQnh1dlJVWFFvRmpsWHRwc0VMaWhYUEdhVTBwUi9UTWp2eFVsL1ZRcE9hbXN5WGZIdzJnQjI0b1pqc0pnZ0UvV1libUVEYjFZeGRPKzN1Vk5xdy96TlI1OVc5MVlua0pCWU5MYndFVTI0cTJlYUYxd2M1VjJQRGhFMk5od1dqM1d5ay9qMXM3YStxQ2U3TEhxNUZGSTBCS3JTdXFzUFdLbnMybE94VDFPcnNkS0ZENG5Va2ZGSUI1SlVqeFh3RkZNOER6UCtmS0h2a3VJMUpibzhpZTZET1N6UE1NQ3Y3Q3FqYlZadUNxV3FBMDJGc3VNRFVMOFdnaklnRWRLTENpME9FZXQ0TmpYb1UvK0c5U0MrNXNiYjZJMXF0L2lkSkhETTRtU0V3TE5KbXh2UHNPS2lFYXllT1J5Q0ZxcGFrcTVhcVQ5VXg0a0hvbWd3dlZZSXczODVGT2tubVI3ZFZmamdOV1F5dVQrVTF5eGpQeFdFUytFMXQ4NHhqanZiUklVKzlEdDdPMVllLzlXZFd5RnNnYit3U25xaUJWZkJ2SUhRb3NtNytFQ2gwQ0FhVXB4cEZMdHNKWVJtTzBRMU1oSmVSNUlkbWpXK0g4SllTQVMwYStPRG1aVW43S09vOFBIb09CRmhRS2NJMWMrV1k4dnV1eE9UL0JUeFFDQllycSs5cldGS3lsSDBjZjcrb0VvdW91Y0xEeEo2R2RmcGJPZnFRbWRxcjhlWG1SS0NtWFdmRGllOFRNK0dJa3c2NEVYVGxxdEVucjFGSDBYU2x0MjFDNHR3RGF6cDhBTkJrN084R1o5Z3N3STBRcmVLYWlwTDVnRzlGcEp3b3FqSE5DVHJ4Mm51L2JJVkgzTTRZZTAwVGdZRVFTbW4vbTd1bDRMWkZSOFBRS090TGMzZDJha0JpN3RrMkxPZTRBeTlVOHhVVG9PcFV5NDkwQUNyS05DSFQ4SDNSOEk2NnRJRHByNWtpelladCt2TllTRzdJWStTSDZEY0V5bXRuejBmWXJYTGNzdkE4WTNNK1RIMFdVTlViL2VIWERHaHpQZnhCM00ybi9LY0pLM3VUNjdERGpPNDl5TWJmUERPalFFVy84OTlqdEkyVE96K1ljWFdxemIyeTRtQWp1UEhFYnFxME9CTlRpMlJSelF0SzFnWm9oMUJ6Z3NqbWdXNEpEZGtvVTFnVW4yOU03VmVVLzNFQXBSUlFBYlBIcFFUYmRmQ2UwaWdNZnJKWHU1M3dTNDAxbVd0VitYUlFiYVVuS2ZzUEtycFo2cmZmcG15b0YyeURQaDY3eVhGYklrS3ZVUWlia0J1QnBhclRRZnZ4UFVtdnNLd3JPR0F1SFloU0RmM0pJOXFOWStDbHl1VmhWTHk2Q1BVSnlkUDhEOG5wdEU2b0psWUNTamlVWXlaVE9PMVN1SVc5R2hRMDFCSDRpN2pUaFhzWnd1VUY1YmQ2VmRrYkdEakcyTS9IYzVBTE5qeHdKVHc2YUlEdGthS3JRRTBJL2xvZUVWZ3FuRVZHSVYzMUlEK0tocDRxckkvZGlRa1lUWlJTWnltR0ErdmZSMGJwZU9BMDNJQmVYQlhORDl6U29oNkFISEc2c1VpK1NWR291WkZicDlrekJoa0M1MlNCVGpnVzRselNEeGV5NStkVkR0NWNIRUhhcGpEVFZIcWQ0aFZ0YjI2c0o3UngzK2U4MDU0Mzc4Y2hhNE9zVkdPZU5WZnlVU2JFSGJLbGhmTkgxcnEwM0JWOVYxc2p2UUVBOHR2SWQ5dm80Y1ppNUkvSmhtbld6ZWszWjVCc3VpL0ZLZDJRaTZYRWFjeU9SSHRvWHZqeklPbHc2ZTB0YVNlYzkrSG53TDRuU0F0SkF3TEN1MmQwczJMSEovMDNKS2VuckxCbzJsOEhaSW1Db05KYi9rYmM3THhpbkpLV0hWQThUNW8wNlIrQlhXMjQyQjlRU0Y0VnVvbkZUZnc4WjQvVmZEWnFocGpMcmtTdjRNbzNwRlpHQ3RMeWdRclJTaFVXeUw3M3h3ZWFnSFcyN3IySzE0dG85Y1gxSnh1elhJUXkwUG1DSWFST2ZxN1U3TmZZTzZTeEtHRndxcXBoVWl2QWV0VGVYR2ZlOXVFdzhnVlFVaWgvYk1MdVFJYVQ2SkFKdFdacGZtOTUvMk9wRFNGQkpXSzlFZG9sRytZSUxYSUxENGJURnlZRTRrMFQ5U3J1QXl6d0NwZ1FzK0ZWb1BWS2R4TjJ3SUcyVGZWUHBtQW40NFBIdENaSlQ2Q05VZHpwckc4akZOOEJWZFI3TzVGdENjYnIxMHZ0OTZtZkcwZWY5WHRRQ0c1Mks5MW1VQlFCQmJOaTZWT0xHQ1h1dnNUQVAxTm1pVW1zemJvNTJsU2R6U01KK2Y3YnpxR2tqSUtlaWp6Vm5Ed3QzYU1FSVJpUEpWdFBUSEhCRUtoWTRJa0VNUVcvZTV6SVRhRzJPVnBmZ1RNQk1kVEJmLzJRQUJBQm9BUUFBQlF3QkFBQThCQVVNQ0FBQUFBQUZsQWZoQUFBSUFDUUlCQVFvQ0FBTUFHVlJvYVhNZ2FYTWdiMllnUm1sdVoyVnlJQ2d4S1E9PTwvQkRCPgogICAgPC9CSVI+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT45PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+SXJpczwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU+UmlnaHQ8L1N1YnR5cGU+CiAgICAgICAgICAgIDxMZXZlbD5SYXc8L0xldmVsPgogICAgICAgICAgICA8UHVycG9zZT5FbnJvbGw8L1B1cnBvc2U+CiAgICAgICAgICAgIDxRdWFsaXR5PgogICAgICAgICAgICAgICAgPEFsZ29yaXRobT4KICAgICAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPkhNQUM8L09yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5TSEEtMjU2PC9UeXBlPgogICAgICAgICAgICAgICAgPC9BbGdvcml0aG0+CiAgICAgICAgICAgICAgICA8U2NvcmU+MTAwPC9TY29yZT4KICAgICAgICAgICAgPC9RdWFsaXR5PgogICAgICAgIDwvQkRCSW5mbz4KCQk8QkRCPlNVbFNBREF5TUFBQUFNcnNBQUVBQVFBQXl0d0g1Z3dXRGlZWEFIMEJjMTh3QmdGaEFBQUFBQUFCQVFNS1FBR25BVDBJQUFELy8vLy9BQUFBQUFBQUFBQUFBQUFBQUFES293QUFBQXhxVUNBZ0RRcUhDZ0FBQUJSbWRIbHdhbkF5SUFBQUFBQnFjRElnQUFBQUxXcHdNbWdBQUFBV2FXaGtjZ0FBQVQwQUFBR25BQUVIQndBQUFBQUFEMk52YkhJQkFBQUFBQUFSQUFBQUFHcHdNbVAvVC85UkFDa0FBQUFBQWFjQUFBRTlBQUFBQUFBQUFBQUFBQUduQUFBQlBRQUFBQUFBQUFBQUFBRUhBUUgvWkFBakFBRkRjbVZoZEc5eU9pQktZWE5RWlhJZ1ZtVnljMmx2YmlBeExqa3dNQzR4LzFJQURBQUFBQUVBQlFRRUFBSC9YQUFUUUVCSVNGQklTRkJJU0ZCSVNGQklTRkQva0FBS0FBQUFBTW5YQUFIL2s5OTlIR0dBZWRISWFDdWZJMVdCMEFrdmZqZzVKaUJOY2FIdk4xb29PVHM5Qnh2NXZ0b01tbkNWRnVFdEtiRjhJNjlqeEs4RDFmTElLajZkSGlXb3pOUU1uK2RuMlpYZ2wvamF4SjBLRGdIdUJoRmg4Q3cyK0tCRzBnYkNxd3F5WUROREsyY08wRXVnNDZWWXZ3ak1qSythdElZV0R5ak5RWFlLYTMzQmxxUkM4NEg1a2ZBd1VYeVY5azNLdWJET0VsZkgyTnNmWTd3K3h1QTdPN0pFVWhvMzV2TmpKcm9rUzV6TTRHT2R4Yk1IanNXcVVrSWZKa3IzQmphRERTMGtmbWs2aVk5RjczUENKUkhBVkE2R0swUVR3M3ZlVStYandyL0ZkMXYraXVFMVdjcGVLVVlOZC9CUGd5ay9ScWlsNS9aQVRwQXBMbHVGWTZwNmNEV3hGZlQyaCtqbWhScy9KclBUTFoxa2trMTdEZXpwSUc1OVltdGY2aE4xU1VVV3V2cUdQWEVNUnFJQ3dWV3p2ZjVhR3RRM1o1b2hvZWxBV0w4cWIxWkhidUxIQXJIZ2xXcnFoV3BPbXZtWUYvSFJ1T2JuTEtramptVXlNVEZ5WFpZUitseHZhVXYzeTNvZHE3WThUTjZrcTBYVnIzU2JIb0lFSkFXWTlaSk9yRThyOTNwODNSUmsyZUFzbTlCeE1DMms1aWFkZTF3OGppaHZYTThjZ1hWM0RTNXE4cHE3Vm91dFlJTFlUeVY2bVBFMnlYaWhZYWUrTngzSmxmV1M3RUMyYXVNUnY5dThMd1lZWUM3QzJaaERsallMV3pMaXpjdjYrRTlMdUNLZnYvZkMwZ1F5YTErVEpJQU9XUHlIMzhmWnJMSDJhNFErelcrdGt5aGVkTVRKZkhic0VkZWlic0c5Y2RSTDZsaHlKcnY2MkpFa0dGMDFjL2Z6VWN3eEVzNFNFK1hKN09wNWdRelBYYXVQWnVoMUV1K24vT1lBMEZXMTY0T1JiSUVoNm5kY3Z3bXVBSy82czhKazBFUCtsdXNjMVBRQnpueUJwTWtLaFJhcDkzdXlCWm1VTjVXakZYK3F5SkJGelAzS2tWNC83dUhGdVR4Y2l5K29iS01MdGdtTzRSNXNyTHk4U0NVVlZ2Wmd6YkVnem5xOExSQjFVWXhYb0ppVUlQWmJoZExsMnlobHptQWE0eWlaUXQwVE5lajh3MjMrOTYya3JXOURtY3FLZnlRRnZsU0NxeUU1eFMwQnNpcy9ZNVkvZGF1NDIySzMvR3k1VVR1UHNlRExnOGFRNzloYlRXTmhJWHl4UHhtdlkyYUtjQ2NkSWNZQ2U0bWVBU3YzVnV5LzlHUE5acFlHcWlDQUJZUHl4Yk9UTFJnOEJtbmY5TmZyK1Z6aGJJbHp3ZXluZ3hHUHUzR091d1FOdVNWd2kybGRMM2lSKzE5NWNiSHV4OG9LRFpncVBpdGtlZ3hGL09YdmZsQStwRC9xUnBpNjN6QjBHaGlYVlFDZnkyZVQxNnhKOG90eUdxdUxtS0IzRksyeUJtdFJoc0wvZ0RDRmN0VlJYYlZVWEt4Um91SHpSK2Rjb3hWTCtRK21PTTAwRHBKYzloM3hyK2FEdkg3V0dxOC9GOWgvd0x4cFU5TDk3SzdnbW5RVUFOaFo2bjRUbm8xVkhwVTNOZUtiMGhWN3VXS3J1cFozRGVNa3E0cnh0OXNvN2RZdmEvZytBZ1hCdHpFMkdIZG94VW5VQWZwTXhoRjliR2dHQkJCM2IwVmhDU0U5eUJOM3NIdHhEU1dsdkV0dm03NWdHSjZ2VVUrb1lhNXFCTkYxd2loaEc4RnVVOERXeitqUm1oV2NtcWhGYU5pWFNCSmRGV2lYdFZnNGVRWHFHVi9zK3B6Misxcm1XMTVzMnM5Vk1yMzMxdUxSUlFRa0lUWXJvRzJyd3FMVkxVMzRwRklHV2JqQkh0TzhRVDV6WThabWZNakFRdUlyU3N6cGZsTzNqRjR0S3ZFT3g4b2ZpcE5EaDBkMCtsYzNPOGVGNFpubnZxR2JIMXJKK0dTYS9EZUpENVhYVTdTelpLZmJuc0JWZzY5RlpzYlRWZEhqckJONHJMRW5aS2JoMnoybW02OUZXWEpuWUVOY2lLQXJwakRNZTVuVWJOaklVSlF1QjJaY28xUXhSQXlBM1B5SGxHNmFqWGRVamV6blFLdGpDNTBoZkJnT3BEK3hYQkhnTnYzNUQzRThxSzFCcEpQdkVDTEtyQ1dMdkdJUkJ5VEkzYXF3d2hoVG5ZK3gzZ2owZGU5WkxGV0JFc1RaWHR3WmY2bHcyejNZaXluVHVKcXNaNlZjbjh6THZZWFBUT1o4dWRLajgyL3d1SEpubzg5cEhJenVvS1M0ZWFGcG1IYzFNN0ZFSnRXTlp1eXUzTG1rMk44L0wwNUFsT3VjTVhpNkgxcDdyaVNQR3NWN2VYaTRCMnZtRnBaRDZ5Zm9UTXdJNFR5Q1R1K1lHblRxOFRUOGNHU2liSk0vNVBUcnhQa0ZIS1Y1VTZldmlKYStTaVhCclRQdzNuSjJYUDVqRENERmdOSWI0eEdYU0pWZDdMYkIwcFhiSWRJeS8xTG44UXFDMi9LZE5wOENzSTJNRElBMExJdm5OZjFldjB5TTUvb0pPd0I3NFl5eFB0d0Z3eU54akYwbXpxYkxkZXJSUnRZTnd5Wnd6Nk94ZFBXTnFTOTlqWlBhN0tlWHVxTksrMmF2c1p6OStPTVJKZFQybDdNL254NWhCT013cnYwWnJqcXhQT2hGaUVjN2FzUDhrWktFSFJqWTgzUnBmR1hScjVmTklYL0gyK2xmSDJlbG5INGVtY0NGVE5xQm0yMktiSG9ZQWgzcEZOWVBRZkwvRVNiNVdqY1VEWmlGNWVIVlNOZnp2TEdQZzNIQ3JMWkxmOGVqRzI0ODhuUXJoakM1VklKTkxMR3ducndZQmtiM2RBaTBOOE1LV01MTXVRZVBrQTVCaFc1NFJXTGZPWlB4RlNLLzJaMlhTSG1odTBWTGc4RkpYRlZ0OXBuL01MZkk3aVRXTUdpaWN4c0RjdjhPMVRsalE1YUtuVTVpTVNNWVlwWVdoZnhxazA2VGhDWHVnMVE4WDhCTnBZeFdEUUUweUdqQkw1a2lYTUFINzBJeVpQWUloVlZ2MzhlYXBneXJpb013QXNxWG9mVzd0V2tyNFMvMGh6b2ptN0E3NmNIdzBLZGxPcENoL3pWOGxSZ1RpdEhlclVhdFVUVGlWMlVudnp5b2Q1MHVwbmI3R29uU0ZLOEFoKzFib2RoZ1hMSWdFLzBrd3pTaThkZFc3NXZZeUtiQ3p4TGVUU250OHB2UXFaeDRUZ2NvTm1TM05pRys2K2JmRkdMcnJDRTY1ZDhzV24ra1E4Wmp4RndjZktjN1BqeXBLNTBIM004YWV6ZjdYdVhzend0ZEFZNm5TQ1gzQkh5M0thME1VWHdUckh0cjlzTU5WOU9mTXhSVEU0WCtFWlRSTGhWbi93L1Qwc0t4aEE1RU91V0xxeE9manhMQnJTRlo5WmZENnZEVGEzT051Y3ByMTBGRnM2QXRPdW9SRWpPOHpFS1NjbWJCeE1IM213NXlGR2xhYmRBQStyaFF1RENYNmQ1d0p5dFozS1NrOEM4M21zZXJoL3hJU1FVMFdZRExWbC9jdXpXNTk2SE1QMUFSWHJSbWlNMlRhTGlmenh1anpRWFliNEVMeTF2THdaK3lzZ05oY1FRVjNzS0JtUGtjTXpwcDBEbGprNE9zemthVVV0Yk5vSzNlNFNNeW9iZ3BpaDlWdW5laGpLQldCWmNyVHVSdGRKbCtVT1ZkSHdma2J1a0xaLzRNMVViZWpUcjVReFIxTVRNaHlZZGdmT2xMZDJWL0FrOEhaK3o4YXZqNElFUWV1V1M4UkdmQkpjOFUwTFpETlBrSG5sc0dtNkJCY2k5eWNjejBacExHcCtiQm94eUdOMVB0OUdlUmYvWHk5a2VLQ0E5Vm5pcWFVK0xCZzJwMzlHSjdFSGpoVllENDdKMVJpU0hFblE2MXhvS0cwZlFQRzVrb3VVUllaZ1loZkxTdTV3czlPTUJEamFrL2ZPajZkUTBYdXR5WTRuQ2tXL3hYdFZjcnNSY20xenkyUFVSMUMxZVhJN1NnZ2tSQUZIV25SSVdPYjdxQ2dQbWpiZFBLc3QvWG5nTHcyc0RlK3ZzSVJjcGF0bGRlWGVFVGhwMmVocDRIODdIM1dDa1BoNGdZUnROWXM5N2lSWXBQMGtlaXF0dzVmOG1iS0M3V2x2SHJsaTlXZGlhaUNLRXA5RlJ5ajNCM0tzNmFSdzZLMUZIc3ZSVGx6ODIzN2F3YkhTSzc4cGFqY3FyUnY2dzN2ajdkamdLTkJ3aFNNb1pxcDBJL1BZdFNrQWhLVFFvS1g3SHVqK1hqWGh6TURUUjVNN3BMODNGYXRVbzQ0YW1vSC9qdGJaZlVCMWRlcDRMOFNZWGVuTUpEbit6L1hqQmhTTTd3MVI2czlIV2ppZzlhY2NaRVllUUZvMk41cVBadm9EcmdocTZjdWxra1ZjemRVdnZWdzZhWTU3WVpMRWlZcDNNaVdiWHNkUFFJaWFPQmYxTWcyaGQzOUpqcGt2VUsxRlVhSVkwUFZMaCtoVi9lYlBNa0hDYUVQUGkzcTN0ZURyYUczTldQaTJML0ZHbDZQOWpOek9oeU04SFg2MDEydGxkM0ZrakNYREVGNmllTFFnOXducDMybW9rVExVV1cwOGRuNXZuUGgyTDhvSExyclc1WVVDM1ZGZEdWWjFVODUxMG01cWRVK3ZYRUsvM25aZXhEd2c4b0VEL056Ny91Q2RHSUxqOHkrdjNXL3dBTWRNeVlEWU1OcklkZG8yR1dJK1Rpc010TDlqbHpTWGZQZkdOUi9YWURza1lHT284UjZJbmx1UE9kOWxrSnhPRFBzT2FkcDdDM1RnRnN0bDU3VCtYRGpvSm84eVdLQzBIUVByZG9PRm4wd1ZmY0czS05NK0g3UXlJWGw4WC9jMS82YndJVnRoZ3BpeXdTaWpLYVIyM1RVZSs1TEw1R21UWU5SVXBReWVkcCtrVmhGQkxNVUFxY0wzV1lTQ0dtYWVpOTl4cHlITWdhaGoydHR3dDdLTnA5OG5wL0ZQdUI5ZTBDaktRclNIdG9LNWxkV3ZnVUQyTEw0c0djQmNtQTVSUzJFcXpHUTc5L2RWL3UyOHZPM001L2M5Qk0wc1ExQ21tU1ZZamtpYmJiQUpoWUVNQnpzVlc4bTNnd0J3dnJwa3N1a3JPK09Vbzk4QUxDMXhwTWVJVllTTFphWDZWd01lV0o5ODJqNXhaV1ZiUS8xQVV1T2dRdkRVRWhJamZldllBRjBvZ2s2Q3FXTkx1V2Q5cGp4Ui94V25nQUcwaFFaSmpFVEJaNHBMV042RE1heTYvYlo3Y3YvcXlReU5CM1JSbkw5Q0hGY3BUd1F2ZmF0Ky9LaFRwanU2aFUvckM5M0RicjRGelBMQnZhVzVzQnZTMVduaGF5VVQ3VE9sSlhYektHZDZjdlhMWHRzSU9nTm9GRm92Y0V5TW0waDBwc1hiTGlzOFhObzdVRjJWeDZ0V25rY29aMVJacFk4YldwWVJHNnhDNWpndjhhdWVrSzBrWmRaWjEvMzROUGNvc1FSRkN5R1ZSakJkU3JScWZobFNqM05rYVJKYlVUTXRLTGpwS1BGMzRhaWtuN01VbVFHWFM3Q2JrNEZDcEliWVpyTmFKN3F1ZGdFTzY0SHA3S0RoMWNiS1czb2dUSmNWeUZTU2lnc2RvMVp0bGFBUWw4eUtHMVM4THJYaVI3aEZYbjBLSGdhYTN1UHZodGF1Y0ZEYU1Mc2xhTjNGcVNQb0JFSFcwQlB4WTh1dUcyQUw3VUVHbllMOXlqdG5TK0V5RC9jck40b3NSYnNJMkZWdXQ1bFFoN25WSEN6cHFyZmhON0UxMFJybWYrUkhDK216d1BlTWtOVUl3bjlSUThLRkxMTko2K3ZaNEtwSzlsdnQ5L01WNlVFZjk2SE9RRFBjNHI0eGpPVFVwRWtPWkRMSGhlUC85M25sZ2hmOFB3Ry9EUTBoWnBOZnJRaEhaUUZqYjVBNDdHZnVLVTlIOElqUndkRStwckRCMkc0b0FZZTRyL2NlU0NTamxGMHk2R0REVk04bjRJZWxSZENKRFNuK0IyNmxlRE13REVkSjVSMXM0UTJFcVdKaWV1VnpSODJTUUZObkhNMkUvTUtDSXNoL0VwNklZR3FMTm1STEJOOE1JRHpGYk9GTFZXMVZTbnV3TUZyTkZZaHRrdkZCdnQ5VzVjUmJqUHRmSTJjdXhLSnprbExwRnpwTFlITnZjSlA2WlpGMzgxb2lhYmxNOSttVjlzaXZiOWZXZDlmL3doMGVuTlI2Z015LzhiVkQrdHIzbDlPL0FXQmZDS0JDaHFLOGVoWnhzNG9LOFRPYVh6a1lHVTlNMGYzZW1zZUNSL09TZm11dHZsSU4rMkF2UGpNaFRncTdiSUU3THpMQTNMeGdkYVZVcEE2SVY0MkNQMUtlai9RMDJKRS85SnhKUkxodDRPaGJmU2lDaGk4bERSeFJrK1hCMENMeXpaclJzS0NNbnR6bG5Xa2FjOEt5cE51S2gyQUhTaUMvelRRWXV0UmdaUVN2VmpjcGp1OW9RNk5XTzBoUWIvVmZaZTRpd2NYUWRFbEJHSmtWTmNVK2tFWTJwejZrNE96Zm5jNy9UbDhHZHZZdEVJOXMvdk5XVXZ5UDlDem9rL3p3b1hvUDkrTWlScGNpS25HYUQxNFNKNlYzMCs0cy8wUEdRREw1Z0xUdHk5KzhRcnRuR0hjSGxzeU9FeVhndDJKVi90RDI3MnBXSVdPeEwyV2RFcWJVNzNpUTdnWG92VERHcTVRSklIT2Q0MmJKYVNrS05kUmZJV1NuYk5VZkYycDYvVmJUUEdENm9UNUhoa2ZHUTQ5bjJ4MmVwaVVqSmpPNENRZ0grdGtuQUQyK0o2WHRPSExtN0d2WTlqdGtQMmpPOUNYZGdNLzJYSC9mSWVMUzVwQTZiUlJpRXNWMWh1ak50WE0yTjFiZHVUaWpoNUpBVVdaZE5wMnZrcU41RVhLenE3VG5pM2MvWDZ1TWpqbXErVDJvdFNzQnR4Yk91Zkk5MDhwMEhzTXNDV1p2UVpxSnA4RnE1bHBRSDk2ZXdqbWZPbTFKaFBoeVU4VzIzNEQ4NElhZkxqNTFjRVZjOXc4MXl5QitDTUxvVHdBS1BGV3FHSWFKVkFVelpqSTh1UXRFOS9YQlZSK1cvYUVsc0xDV2w0VzRmTW9tdzdkZDFXVDJvWG1Ca1VsMkdkRk9vWXBNc280T3Q0VEhxcDBSS0VXR2RQSUFKaERad2tYUS82d3JDM1hPQUQwdjczeDN3YnZVSGxpM1J0L0Y2WFlNaG0wL0FSdkJmQkF6ekkzdnNLVVMxZmdRYi9OZENjblRrUi9tdEc4MDBYblpUSkl4eU1pTkVUU2lOQWJPMGxoaW4zVU5SZEdXMjFMVmRidWpPU01HL2E1OWFlQW1keExaV3BNRkJoM3h1a0l0Qnh6ckJzOWVnY0Rkblk4bzBvM05OVTBab0NMSStGci9PREZaT0FDb0QvZ2NPak91L1VPamZFaEhqeGdodnlwbnJOL2R2U2FnM0pBa1YvcGQ3ZHRYeWlUK0JjV3lvZC8xdk53SzQxbFF4aXlESWFLbVphYVR4WGdEUk85RTVUZjk2aEpZaG1zWi9WMjRVR0ltYldWMzd3WWhlM0t2UzVFRVpsT0xST3VmWmZGYzlXSVJ0WGNSdU5yOUNkMXpBeHlLRlRQK0VHSm8xdnlwV2RWL1FOcmc2S05QUFcweFEyWURRRnFqREFJY2VXcXE1cEM3STdEMC9mTitNVHE0cXN4WUduczNhWmI5NlR6WUUzL0FSM1hVaDhDNkdUbW0zSHY4cERKUXdRa1BUb3NSNTYrVzd5RmpDaDBOcVhudFl0NFk4QXhoMGFoRTZ3OUZhZ3J2NnVnT1lFQzBNa0U5aERwQ2VpMnBSaTM5MjZVOFFzSjVXR1FuT0V6NzVQOFlaamh4enVUbHAzcWNVcVRDNDJ1TGx6MTBZUEZJSHl5bys2RGhxUndReFMrZWptK1dST1JtN3dxWm1RWXZkZHY3a0xrVVVZYXZ4Rm5kNHk4Vm00ODRmZnZYRU4vZk0rMENtQmdhS2Y4VEhxVjNBUkQ5UUtkaVJHMG5GTzZiZVVNRXM3RFRpZndjZUJ3R1FCZXpuOCtRSHRhcWp2VU9qSXRndG0wTGRVbC80NndHSk1kUDNNL2FMbEhhd0Z2TGhxcDRoNkNibWZoMmRVUDRmTDFsbTdVSzFNaGY3aXJramtRblBXYW84R3l2WndNVGtZclRTTjBxcWxxR0VHMy92UGJEbHRCcXBlVTVZU2NTUzc1M2I3dnNON2svM2tBa3dlczBjS0NVS2NJZkFpYzFqZ0FaZm5OR01IVERjdmI0MGNseEc0eFEzL0phbkJ3MExHQmVDcFpFNTd1OCtadkQ0MGhhRFBBTU9PbFU1Z0pHb2xZUVVnRkJzM1R3ZGNFa2FXb29tRlZQa1hjYU9xUjAybm9OTk9yd2ZnUldRVk96alA1Tk5IclR4RVNzWnpQczZ2MXJNMjFUaCt0SFN3YlRpVUthWm5UaHdxOGhaaWZYUHFLMVlDUU5YMWk4RzJGKzFTVHkrU0o1cHJNbGJHYTZ0enN6U0J3Y1hJL3pKTEVLK2VTVStVbmp1bmtheFpHLzArY05TSWNJVWlXTlhCK2RmYUxPRC9oN242UjByYW4xWTlsRDFGc0labS95WXZqODhkR1RlR09HS1FVRFFuWC9ydWNVUWJuRzJIYmN5aGc0YzduQllSNFdIcUxDa0tWV25aZ3hmUGF2SGY4R1hISXlJaHRweHRDSURhWDNSbjZBbFN2NG1uSjdZL0NvUXFxVWVOMElveWJyQytVYm5jR1NHQm1iNFovYTM5ekJ1ZXAzUzV6amZNWWJaMGNEQ2VWek41QVd2OERZaU5XWXZ2dnpQSzdEVVR2VFJjWGVxVHZmRzh1SUNjUWYwZ0hzcEtER1VYOE5EekVuZElKWm1EYkhHRG82NWNqdlJwRWp4bTdBRnhjaFUzbWFJSGViNkhrVDNGSkMvU013a212TDJxbmhBSmsvelplbFBaTHNRYmZQQStDMDN4blQzWW1SUVFSalhzY2IrV2FzYnZqT0orZXR4UVF4TWFFdlhWQjk4NmRGU3AzTmkwc2x4RjBPUDIvUW0vdDlkQ1BrNkFUNTl5WS9iOUJuZlQ5WmVQazZIWDFYN2grMzZHVDl2cndSOG5RK2ZQdk1EMFRwRm9pdW13QXBVNzViMFpCb2ROenVITk1KNkhEWmt1YmpLd2htRWV0cGYvWGNzTm5adk00UENpaloxaTFOL0pnV3IzVmRuSVhNUk1CVVF5QVN1WGdyVHZINlZacWRMMzdyeUR0LzE3cXVFelY1Wlg4VFM2YzVSanl4cW90UWhLcm96dTVGbEN2QzZYZFhQV3VoR2dWRHlOVW5nMkNtb0tVM0FLN2lOWkhwaXVTaHdSQVRkMU1LQXFBV082TTloM0ppWFNNNXJ2b2tjbG03bmlwTE0wKytxdlVsa1VScGJYNEFnNUpQOU1tZUk2WWU3ak80MFdLaXorN0tDYS9MK2JjblhOMFZWd2hyMUZOL3hscFFiYmJWb3BEUDlvYTVaZmxTeVlnOWVheWZWRDVnQXlib0RLeGovTUVKTC9SaFZidWMwOFg3S0dsWUVod3ZadllhQlZ6T1VpQ3o4cndsQU56b0lGK1lpMG9YQ1RsSnlmNXpqV1BLZjd6ZEo4bm5aTjcxQU5DVEYxOVFyQ3FkdGI3RlFLMGNEaTRYZVozb1FKMU4rY3kzUHdGbllkNEFGRjFpb3lLd1l3MEk0SUZtYVJhQXQxeW1BNlFaemg3NTRjVUlQRnRDOFA2ZXhPa1pNUnowZjdMeVZYdW9OQmxrdHZlMUMwM29iQUl6R2VNM3FBMFZCS1ZMOGRoWjVmQjZNdEFGSDZPenUrK0J0WWFSSzdhQk8rNGdpTVJjVi81VXBURFZzeXFnSkZrdWNCYXZrUXF4QnBXRnR0VDFubytBQlI4NnVpVi9XMFk5R3J0NVVMbUFpMjJZU3VZNXo0bnNicUFZUVB2SElMV3lMeUY2RHkyZ0N5MXVMSENKaGlpSENjcC9WMTV1TjBpZXJ3eno3Z3hsQThOWlFkRnF3anVYdWo5cGlzdjlaalF0Zys3dHJZa3pVeWtkeCtkWHNydE9TWHF1RGNMN0VoMGVxa3ljRmNXT1YvU1FzcnFZZVN6SEY2bFEzMHFCMXZUbUc1Wmw1M0NVVkVUc2l6d2NYSGxoOW8rZUlzMFRJQWhsbzcvaC9TZCs1NHF5d2ZpZnlkSU1SdjB5Y09VSlFLeWJqMGc1WURRb3Z3a0FRRFdBeG9nSk5uTW5BZ2ZzT051THA3cVR4TTNMc0diT205RWhuRnh3WmVpWnBHaWdJbHFOUkxNNHRtQXdFaEp5V3RFaWhMNEFyWEFFOXBWTms1VmhkdUljZExLbktGOXFYdnRML1pibk9mbVJ6dGNFM0I2WlB4bWV4dVNZdmtMS0pmU3BJTzJKaUY0ayt2UWxFV2hsRzZ3dHJTbWZwNEhsR1lveXdWV01oakpLb2p4R3N4c2pObmo2WGpUWDVkY0g5SE9LTTdReDdxMkJ3amVFakU2QXlBYWUwSzRSQUdkZll4cC9JbVMycVA1YUZsbTFvZE9LSHRoU2ZtU1Jqb3dmOC8zY21KRlpZSDMvTVBRTE1ybk9obGJVOTNRaHJ6ekRYNmRkcWxSbWZJNlpQdE9RSkQyR0llM3hPNFhjcDJ3ZmdDNDh0emZrNmg1YkNtUk01c0FTREZ1UVNiSHBmVXNGV1VwY2NRUWVDYi9OWDB6T1h1ZURIZjRaVUFUS0IweWxEcXg4aURMOHJZNCtnWUk3M2VrTnlRUHJnRHBVNEZLYmpMM1o0WVQyV1dHclltbC9SN3BCTEZqcytWNU4vdG9ENk5JclZnMVpzcDNJdm00dklaRzZYOWtwNUc5SWI1d2daclJRbVZRTDcvYlV5WFFCVWNkMmhNU2ZZcXRGY2xtTzcwZmY4SWx4bGw4a3R6c1NEcTR5R0g0ZXZJdjQ3L0pBb0hpWlI1VU9nMjlxK1NzcjdGdkFZMU9ockxnSkc5VzhrRWFRekVheEtWdnNHaXd5TFpzLzhNU2JvUkxTQWNSa28rTVgxTXptamE5ZnowSU5icnRpVHo4RTh0aVRFK0VSa3R0dlRDYk9scjl4Wkw1MHRoYllrOGhza05Md05Majk4VEFMUElSRmQ1WFRmanViZDNvL2xoOHpxSlVGeEVHVzdsTVZwdHEySFFxcGorcGhLOENMSmk2bERmZVpPNmdiRXJmdXRsNW5nWURGZ0E1eTk0TFFoZ2hQVmFTVXpscVdHenFneVFQcVYyakc0bGlFNy9SZWx1R0FON0dUOWxsNXlzd1RDVDBkNzN4NDVId3JWbDRwQUhLb25hazZjNDZ2Qkd4WlppaW5wcndaYm53bStSeXl5TDJSZmhUN2VOR3FrYk03OGRvSDBSMzg4dVVEeUluRTZ6TkluWlUvZGNENTI5RTdxREEzRzhwcEJtek5MSGFhajdlVFRVeTFtdmlhYWxSSFpYbjcwdmFVcDhWU1lmZXQ0UitHR3JaSUNtaTVZYTlHbmkyajFjYkN2cGxzT3hlZDdoRTFZM2l2YWl0ZlZFcm4xL1o1a2VGUytEYTk4VkRPNzdsR2ZQZWhpWWZhemlsb2lDNmlNdmMvQ2VkTUszS04wYklUalBqdmlIUitqSnYxL1ZvNU1iVUhPM1JIZmRnWXhvUUpQMjdQZitQdGYwZDhlVldYdHhYbmY3N01Ubmw3Nm93cnUxOEFPYitaQWN2eGZ6NWFCQWQ0VHhqMjVoVVgxbFFXT2g4cklSdlRCaXpPeTFDVU1mUkk0eExpeG5NL2VQZUpPRUlVQUFyZ3ZmbnlSaFA1a2NNMWJ6NU5aZnkrdzdTRDZVV21LcG9xZ1dBUWdvV3pSZzF1VGlOWWRaeUVhdFhQZTBORTQ4c2xweDJLZW9iSGZmakNKOTBuTWZ1NVliVkZic3BVemlsY2RhNlZZcE5QQTJYcC9IL0t2SUQ2UkplaVNEQi9iU05xT0dVeWZvWDFHVU9DNnFWMTNya3JmSWx2RUIyTzJwbDczbW9vSkZHYjRjbnN2ckRwZ0xNMzJKYlNsSkxVQlFWa2dhbURDdXZneGgrZFFSM080d0c3MkdiWUxlM2VKWS8xSzlUWGU0L05UM2h1Q1ZhUG1ZOVJhV213NzZpUFhRbkJEOHlXSDhLSTh1SzMwd2Nxa2tEaVhaQnZZYzJIZWtHSEFaSUxQbWZ2eml1UjVjZzZWNmw0ZGl5MkJBMXZVdFp5R1B5eTB6QWVqMjdoWFVNeG5jS3hRYXZyK0ZBSVVzSDNOalY1WUZGc3BZTFhXSDdhL2YxclhyYkEvRWUyc3dnVnBsaGFkeVFoQ09PMEJKN3E4T0hoc01NWXJhVjNpRFdmNWthSWZteFZ3UUpQOXVCKzJFQXg2TUlEbFZUdGhiZk5KRlJBWmgwVVdwOUk1M0U2Q3dwcXoyay8zK2tHUHh5YVhKV2hjbU5IamNMU2t2SVFGbmlhVkUvWlZOcFdGS1JBSXQrZlBGMWU3YVJyQzdlaGUwT2lkQ2ZjWEt3U3NPTGhsOUl1VnNTQlBJVFRQQzdkZDNIaFpLai95ZEhmby9USjJoSlp4VGt2blJSMTJEbmtVUURMRE94ZUtsajVNMVVWQWpPbGF3SUVqMGRmUlhEZXR1dlBvSlVBY0JCRXhPMTh3VUdJaUg2Y091V1FCZDVNSkFDbzN3cG9qZzdsL0JrTGNWUGtJVGoyZjJHZU05c1I5QkdtQUI4SnJIT0xIVXRRZkVmRnBHaVNkQ3VKb0lETTVlSE94cFhVYUI3MFF6bDU3VHJab2JYTnZ1OGsrOEdXOFE0U1hTNklGa0t4UnpSZkZzS05mbUdWZVRYSWdEZ25DL1lSYVNIQW5wZ0hURWdjb3MxL1Jxck5BUG4veXhDYU9mOXFYakluOGNlZHU0Umd5Tmx1Nkd2enNoMllaZUkwWmk2bDZIVXNJN0JwYW4yZ0t2SmFNYnRIS0pwamtzYk0za2xyUzJ2ZHFhdUgvaHB6dGhQTnFpaU91SXdmUUVqTDZheW5EMDRLOWdDWnlqK2RrMk4wN3FOVGFneml1UkhkWHVFS3dyOHRoRUhOUlNmTTZZM2Y4R09PeXNoMzZhUjQvdVdoTzFSTUt4RCtKcDVIdFREVnZzRHNDZGRCSlZZWE5RekpGVGVzdG80S0xQRGRQUVRZUW1UaFcrN3Z6b29UNStPWlJVRmhtM2U1TjJRN01taHh4WUkzNTdiUUFmRzErUFFhbGVXbitSbmE5MUxSWEkrMExiRlUxTzEwODRhdEJJS0t5STZja0ZUVlRLZisvVGx5TXhxL290ZVMrZGtGVHkvMGhHZVJHc0xYYUpSTGpNb29XOC80MXZmT0xFQ1ErUGNhenlpWnhWTzRFQVprUklaUUthU2syUnJLaG5NS0ZNK1UySks4R0tOWVhtczVidVFidmdCbnRTcytYZlhNMWZMeENhVG5YQnYyYVBvaTlwQ21KTGswZzlDUE9YQ3JmYXB3NFQxUEtzZTZBelZrSXI0aEI5THdkU1pWbFdMdEQ4ZHJuM1ZsSHNJeTB3dk9WOHhVamZrOTlxK1JqVWtNa1RiaVZTNVRuVTZNVlhPUEVCeVZCM29WbW9GdHBUMDJWbVdOQlNGbit3aGxnMHFkSnU5QTF3cWZ3VHovRG5acmZEN0xNdEo0M0RzQlJHOXppN0ZoTVJtVjNJdEluSm9NYzcxc1c1ZGx3S3BTZlJ0VlBhWThsdjJPV0xNdS9yTmVGN3lybVM4KzZZZnUvWXZjcHplVUJnb2xaL0hSTi9UdnVXdWJuQys4cGdITEpiR0pBcURwOHVWOWNlMXVwRHR4UVVoUmdCRW4vcmMvNXI1ZEZEaUdBMzdwSEd2T0ZXbk9NazRPMG4yaXlIVnZGRTBjdzJGQXdZUEpGQ2ZnQXRzb1hpdUcyZ3lkNDcxRS84YWVMazJlN1NxcVVRNGc0ZUxHQ2ZmN285RWRwWk52cUJrQmV6N2R0bWo4aC9MNzYvdS9ZQktYNUhaZ05GOWM1cGxYNUJBUkhSUk9GVTQwaTA5RXZpMVhUaXNsWEpwb1h1TnNpK0pxWWVFZTZhNjUxNFNxZFBoTjRFQ0tLY21yRTl0UytTVnlFampNYTVWbmRPYWp2d0o2RSt1b0FqZ2FCejVocWFHbFJ2SnlsODhWMjhIdy9lYVJPWk1GejB3UWt0RFZra2NZdXd6cHpWdDlESGZVeDZmZXBzUkJvNTYrajhET3g1a1lrbHhvY05hWFlSRjVucUVpcUMwYXA5U0RKSXdlNElneWo3TGJFandhMy9lQldZSDNVN1VkcXFMMnM5dFN3eFRoSXVJTzhjTElQZEFuM3BBNEt6TFdDZTcxbEhDVjRGSXVFR2I3aExXcmpQWGdONCtKRmJ2Rk1wUTFmc2ZuWlVnYjcxSEhnaVVvUW8yOXR5WTcxeFFsZ1Brc2dNeFZsV1RjbjREUzZOQVQzK3RlV2laVEVZRllIU1l1em1lVFZLaHBSbFJnUUpKS3NyaGhlSEZUTXRaemZCbVE0dVNYVmhMbG5VUlJWSW1XeHdzWVlpZW1YSE1DbkV5UE8xcEtCbmRZV2c1UU9qMjBuc1o4SHRuVEx4Y1N0SkZPQnM4M0prb2dmUm13SWlZZElmTkFQNWp3RVZ1ZUorVkpiaTlXam1CQWgrLzJNNkZNT0J5aW83N2VYTFdzNFZReWRjZXYyR1dYWlduWVJsWEhLaHZlMjM0QlJDQ1JZL0MzYmdWWFNiL2VaSUxiQk1NTTFBeHduQjl4bzYxZERjRExNRCs4NnZrbXI0T1pnVXIvOThlQUFOdkU3Vy9oTHBrblRoSWprRDNDb3BVdWV6V0tHcWduaXpSQ21SbEZsZXE5NTlza0ROWG04Y2t0Sk1DTlBtemJCWGczVUplNm11QXFHRTZjWXpjWFREVlYydnAxRzZsQ0lnK012WllrdmFlR0pIV3RYWFI3V2dFMUFzbWZFRCtNUXJTQzZzZTVPc2hGRmlBU0l3cXhGdE43VHNkSmFWU2ptcXZXUUdSSWZjd1A1cFJqQnhBSWZ4aGZTbnorSGdhbWF1WDVrM3VrSHZSdTVORU5Fcjh0czVWSjhuRElCTWFxdDBlWXFMemU5MThOZkc2SkYyZzRDZzdNZnhleDdSL2h1bEEwWjN0V1UrbUM1ZzZNMzdsWEhxTmNKVys2TzloalBLck1FTU1NeWRyM1I0RnZueGNGUlJyNXpGZmNrK2hKaFY1SXVScFJOVEdORHMrL0FmK2REaXBVR25aejY0MGZmQ2xGYVBwZVFaMmh1UmJoRDMxZTJhQkZ1NDRBRzYwZnAwMXV2Wk5FakhtZHg5dmViWjhBb040ZDdVKzVGQzVVWDhXWm9zVmo1b3ZuaythcUpmei9RTjFoc2NVUjFuLzJHOHhZa0VaeUN0dnBIbkFlb3NYVmhDUXUyWFpHVDBKa2Z5Q0pyMXh5OCtVTGFVRVRCQVFIU0M2d21QRHEyV1RLaHhrYUVCUEdxWTN0WEI2cFVtWlI4RkFOSy9RYnNsSG5vTjFjM1NCSXI4aTZyVm83dldxZUZRNzM3NjQ4WkpadTNOSndORWFoSTdtRjBJL0JBcFBranh2czFMQ2NFd3RkWEFFbjdjdk54bExROW5rS3lpRjE1WU1vbDVCbTg3eFJaY2ZlaSsydGJrVEtJZ2xNdUlMb0RwUVpxNWVqekFBd0ttQXhSV0dsSG83WWhwT3FORDBHOFR5OEVqczRkTEdscmxBUUQ0NWZjUnJoUWs5N0ZqU2tHQ0dqVy9yZnpJWTd0QURnNjRXSlBzSm9GRFQvSVc3eUlHTzN5Y1VNSzVTL3hoa0pJbk9UYXQxUnM5NVVCaHRxQU1rdlV5S3Z0RE9oUmY4NUI3TkJla3lYN2lEWDFMdk9KV0xiSGtlcXFvNG5zQ0M2WjhITE9TdUppOHpCaXVwTXZLWkMwZWpXeEwvV2kzeUplQkMyVFZkMmRJQTlUOW90Z2d3TWNVNjROTHJxUnp1WFRGdXR3UlB3azhmM0xJUmo2T3I1djYralgzTlRhSC9mckxGU0NIUGlBMGhFc3g4dGYxNTJYejFwUW5ER1hWUnRvZ3dER09aYy8waUEzOWJBNnA4aXFNeEloaTcwaUhuTG5zdURPMStETno4WC9pb3ZxRTc2c2xQMS9VWHd4My9rVDlOOWtibEhhcm5QcmhJazZSbEdtdTYxd01kSlNBenQ3WWRGaDU4YkZZZkg4eGF5V0xZUlFpQk5SUFlJMFQyOEUrN3dlLzZPR28xRExhQ2J4cHRWNlhIcWJaK3ZmaDRxL0hES1FLa2t0U3B1bGxrbmdDclpJWkg3akFnOENUUUpYMGtIanhXR0RnRDRCM1lrZjhxWGREbWdaWmYvUldhUS9INDlFcEk1OURxMkJyZ01lUjdpSDNKdExVb1FGRmdldnhDRkgxeUcwTCs0SWVPRENpUk1GamhlQnZtZHZwSXNZNnZ5ZWdUWVhNVEpxTWU0QWIxNEcvYTAzQUIvTUlJWWl0UWM5ajVWTGxLUlc0SkMxWWpQc29idVNqVUQ2ZVBZY3NVK2pZZXdkQTVkZmxjd2VpdmtHOFUyM2hhN1paaGNOSmE3K2dHODFSTjRYeDNlQ3NQcmpHdEJXOHMwNWZSSStYbFplWVREellGUXJkT1cwd1hISzNTNXpQTjRjVUhjZmx2N0h5ZGlaTW8rTTlUK05IMC9ZVHJQUUhiRVV4cFBlM2JQU2h1TGZGMWdURlMwcGk0QXg0QThHWVFFeDRiSUdkTzNCcDBFWmRYNFpUajVxOGx5YUk4eXo5NWsrbW55LzhNYUlpV29PbFdiRHBMT3lmZEhnTG9HUWI1dTFmS1VZME5CNC9YK2N5TnNBeTY5OENiMjJDL0ZvYUZyOTg4bll3b2xTcXkvT3VHSzZrcThnbnVRWEZ2RDBSRWZYWWZSQ0QrN1N0UTJDR1QxQzBHdjFMVml4eUd1aElKZmNvTTNKNUM4SVkyL1ZkNGRJMGtqTlgxS25Lbi9BR0liVVlPTHVlak95TzdkanhWU0YwRTdKQjkzVURXSXdrTUZ6amM5N0JteUpwczlaRmJ6MmFROC9oMG8wYUJ2NTF6TEh1WmVCZUdYQXdIcEh6OW9reDNXRm1VN1JoelJadVNJUWxYR1hjajVJcER2MVRDazluc29USkl6QnlSNnhidXJURW9DZEpudG1idkEzL1FxVGhicWhaL3hXL3JZNnhFWkNFNnZRL0pGeVN3SmlFZUU0VTdyUFFrNFo4U2ZtdzdGOE5mL2c2SlZ2WlRmTW4vY21SZTBwNnRVL3c0Mk5ZMURhaDdjN2RWQTZpSHRkWk9BbXF4T2tBYUJabVNSVi91bU5HTVlld3V0NXBta212QkNzMjhHRzMrL2FwQ3NUaDVXUVdOelozUzM4SG05bnhFd0M2anFKUkVsUy8vQTNEUHF1enhHSmRMcmFidHF2b1F2cFJYMlIwNlZKSHplMlZSVzJnNzJhRDYwcU9GcXVTZ1F1cG1sL3FiUU1kSkUvSEx3RXlpZjlZSHpYako4c0grT3VkeDFYajlsMGNLV2ZFNE43SFlPSFQ5V0dXbHI1aEp0alVXUHN4L3dRcnFyc2w3LzRKQUpMaWdsb3llUFhleUlXTVNCUnZGVkpnU0NnOHNZd2krbzNoR0hZTFpKMDZ5OXJkRFB2MVNjYWZhVHlQUGFnTnJybmJ4aURSazR2TjlTRmorNjNBMkx1TmJ2R1VyTUNRQk40QzVUSGlLTGVYaDNhUzhhbHFTTlFKRzJQSTB2U25FcDIvcEFvTU1CVkpaRTRBYldpZ3BjcnpQVEpUVHhpREVlTGE3QVozWXQydEI4aHMvMlAyTDJDZkdEaWJKUnV6WEZUbFpEUmxQT3FqTTB6OWtXeWZxT1VTeFhlYUNZUW9zMlV0TEFTc05hWDRKMW1hcFBKR1RlNlZzcFRBbVVpTytOTFRBcTdzWmJmYjNMWTZBZGtkek55UWo2QzdKR0JXV1k0TmhyOXJTVFlHZURkWU1vQWpqQVdmVXM2Z0ZmTHVnUnJtYnhua2RESVM4V0svSzZWandWVGZjaERpdHRLdlBkdXVWN2VUZS9JZllORlYwQXV5NW5vSytjeFQyV2VRaEpVV0ZOWS9mUXZyZjluUWRSQjVuZUsvb3ZNbTR4TmI5cXNpN3FvMDN0a0J3cmQ5WGN3VkZmYmo1S08rUC8xU29vL3JwdjdLYkJLcTFOZmQ4aHNqYkZrY1hPZ3FRTkwvSElFdno5NzNQWTZZaGxHd1hoa3M4TWdNRXZNWGpySWVxN1FYaFkrbXlGNTE5K0dZVlpTZVUxL09yckpYaXdlbnRnenVKcEF3Y04zQnZPbGl4TUxObEJaNEYwUmU0OWt1SGUwSmFEVVFpdm9KWEJXVTc2RHVmNU9nREZDakNwdTd2dm9XdHZ6YUpORWhyckcrajFGYnRKSlJ0WGJnOVNEbHVadXNEM3pPWFNEU3J3MnEzdTNMc3JCRGwrSkdSb0RzU05oZEFmeVpuZXZYYTFuYzg4SVNMeHRGOE54SzVyT1gwTnJGTnNHVVBVVldodzNQQjRmdk5hN0x4OHh1eWVuVCtFbGFyMEZ3VFJaNEJHc1M2NFV5SzZ3aE9rTTdja2lxS3o1eG9VNUMvdjkwZzdnRWIvbkhrVEdWU2JZSjNMYjVWdUY5cklGY21NRHN0dVF5TGh0TFNaaGxIY3NlUTZlaENpM3pXMHIwVjUvMnZkVG81NHBDMmNDYVVINk5GZUFWc0dTZW52RkxaOE5TemRUdkE2TTNwalVWTWU4dlVVbTBqMFpoV3ZHak82RjhkSktNRVk0QlVXM3pqV2Y4ekloNWdRUXJiUVJNdDg1YmN6cXZ4QUh3L3B0dFRUYVlYRG9VQzRkL0dMZWdkY0ZaSXE5VzhqK1lsSmN6UlZQOEFZVTNBd0pHOEFYV0Z2MUE2bHNyeDFhc1pYZk5BV01EUmdES25Fd0tWMzIrdjFKVGVmbS95b096YlJKWkVWbDlrZ000T2M1UGM1bE54VmdkQ3VXUjFRaG12QjBaV0xmMEZFODUvT1NxVG5rY2laeW1EcFlYVHYzNElEMExmSXdPaHBUL1lISjZmWjdQMExaVTlqbGdKdlVJNXRaYzFmbU9TMVZ1amhNeU84R2F3SnYrQU5pME1oK1g0ZUVDU1hnNzRSZDFHWTM4dEV1SlZNSzhhbWUrc0NPVDgwTisveDB4cncwdmwxdk1oZElPNGRac2FRc1ZtVWxjQ3I5VVVIZTcySllDVW9rWWZmdXdZUndSVkJxVnpCbWJhOTROTU53TER3OVRiM1loczN3QXRGLzQ5U3FjMXdzQ3ptNDIxd0dLT0pTSEZ0MnRSV3dXeDk4dDc3V3FWY0NHTG43c3VoQzNZeWtxSURITEh0NEoxZ1pOYm1BeTRKYk01QS9TbWoreEZ5MGNmZVlZVWNxT3pFbXRIUDUrdW90cmVNdTJwd1pRWU11QmEvcDF2bjAwYnhlanVhYTYxeE1KNW1tQy9aQ1Fyc3p5QjcxcDVUMWNTUzRHUTdmMXVqcmUveUhDdXB5MnYxNDZuRFptSldCSTEycHhZNmw0cDhMUVZ6Q1pmS2lHWkhsQ2pxN2FaRUczZ2xxcEVFZWh5Wmh5azhuVDlXTzdSc0c5bkVPWGVucTY5TldQZzUwZ2pCMVFhQjdQT2JSUmxvZDVCcGQ5anRqSTUzSDlzOHFqaEF5L3lvMGZXWkVtVWlJbVBWZTRZcDE3d0szWG52U2lmVC9nU1NNcWNkR3RPeUdNYkthSTA0WGpJMVAzVlU1cFdib2pBVjV5M25Va1FvcTZFRVh6bXA3c3BXWVlkNXFzcDBjSVJwaTRENzdFdFViNzAzczJkaDg2MzZwaU5sYjUzRmdCSWJGZFZ5a1hOQTRNN09sQWdkZWRuQlZGZzZxaC9rem5PU1I1MWFlbE5vbTZVdXRSQ0w4VU16MTFXTFNVV2hqdGx4bEdSb0s5ZHMrVEFUVE0wc2FUak5VOXJDeXdxQksvWmNIRzhiZEpwUEdhQXYzYy9XbjdkdTUrN2p6VlQ3c3lxMHE2dW9TMUxGWjRPNjFKRDFJZjFraC9uekdwcW4rVVhWYlZFTlZMUVllMGRvMXZBYVBabmVZa2wxUW5MMmk3WHl6RkxWQUhZcnYvSkRBUFFLYnRqbWdsdG9Kd3c5QW1vSHdjeGc0U2dHemJaNlEvZm5Ud3Z1UGszcHdoTHNkb2EvSENGbUMwQlNoK25mOHd5OXppUGJvRWRiajdCZTVQblNIQU5NaHRiNHdFSm1RUUw1QTdwTThtZ1J4NjROM0RzSlFlcURVZlNrOExiZFY4dEMvZmlHTFdWclZDN1EvQUp2WkhoSnZiNHZRa3FyM3lUVjlIeFU1K3pJZGt6eW9CbHNkZ1FLNUh2ZXl0YmFsOSt6VUs3aVMxS1AzeDBiSHJTaDh5TXFYdjRtSWxFQ04rSGNlK1FoZFo0QlQ1MlEvamUwZHc0NlRCa3dkU2Z6S3o0QVNya1lFN1ovYXR5RWEyaTlXeVJkSmI5dllab1R0d3BsRnFCNWxnZGpLOEZhZE5ySzA3cWNad3ZkUjhjMnAzWDJEWjEvRXRtSEE3ai94dFd2RmRzQXM2L01vWTZleDlGbFd4U2FnRWM1WTVGYm1aQ1IybmhGa2NlQ2w1N0txWXF6L3BDaHdpYTd1amM5WFBlY0FmemM3cC9nYVpLeGZlV0xPYmdXdHJJT1QrZnc4MEpXaTVDVFd1Zk84SkFKWU0yb2t0RDN1d0Y3RHB5Q0JOU01Ed2JCN2dWUUpOamxyUFZ0MENyaS9USFdZSUdoczFTUEhjaEhkOEhyRWYzSDczYWFVRElSeURqcjVvNC9Vc3pWbWppUWZhTk4vK1pkbVExbHJVelh5M2VocmdHTzJiWmFXZUw0UTgyaHh2anRFRFZiL2c0djdHdC8wUlZ6aW5kU1FTRUNNUjFYSkppbGRXVXlKMjFZaVJ3LzdBV0ZwOTJ4THU4Z2ZuNG5ZQVFFc3A3TGJVeG0rdUczNjMrY1d3OXVydW00QzFWWHlDTVdVRTloS1hPODcrQnpZRWdJbXlydVhoYjBXK2htYmIvdjlabFlnUXI5MXc2U2ZNdVJoN3c4Z3QvVFVTRElZKzhFVE43RDg0ekNsbkdIaEhucXZSc3lKaFdPbG9lR0ZxR0IreUg3NnRpclJtUTdmbFZLYXp3R2xzbWNZVFJrMkV0SWx4QTRNQng1MnJGQzNJUHFrWWhOZTJ0a0J1VmZYTllURU1JcS9UZWRVay9QUlNpcWZ1T1dBM3ZyV1dEeWtTaGlsVnNXM2thclZYYUgxV1Y4K2U2c2FRd2Y4SUpycVowMWMrQTd2VVNJRGY5NjFRUUlRcEtYMUdJOE91dmtNeUkrUzJFN2RGV3FJWVVJUkw2aDVjTUtEL2JLSEhpYUxGUFV0S3U5RGo1ZmZXT3A4NGNBaVgrRzBneW91Ym1JSHpaTE9PWStkWE1GVklHdm92VEJTaWtFTXhDSlhZQ2ZqVGVIRnlCckFsRjUvVkE2dUlwS3V0SGlZSjBqRE9YQjB3TkJ5c3NFNmJZZXZUN0JKZHFyRndCV0EvTjVXS1BlVk5pdXZ0cTdzTG1OQ2c4aUF6amtXZUk2R0hOZ3BnSzY4Ym43eWRFa3dqU2U0SkpCdDBiRGc2STk0cUR1Q25PYmVsMndQbVlCQnlEY2c2Z1dhWEhwUnlVRHNjbitpV1FRb2lmZTlOa3B2bUhrbjBUZ21QUStVZFV0T3J6UEx5MDJkTThUMEZodU9aQlQwb0xGTkxTMUQ1YlJZYlExWEdZOVdDRHI1bkU0a1hDV3FFWWd0a2xDa0NmQnc5dWxLNWk3ZzhXU2VUcUlYRy9XazlHNlpiRWtGdVZxYjFaeW9zOXlvM0l1ZlRxRG9YMk0rNWlpaEhyTWFpYVpCdWJKUFlIdWFONjBYd0wxcUV0aElrOW45S295UDVNMWtzZWJOdnd3ZHZ3enlUYW92Z0hJNzZpSks2OEpjaFBrMDB4a3hjOENWUE1Feks4Wm5sT05CUmlJQ3dMMG9wcUJsVEJ3aFoyOVFYTWdNNTh5NnVRYkp6OHNENERMVUhwWFNBbWU1NGJwQ1hCSmlUZldsb2srNE9FejJTWndDQnIvN0JGU3p6U3pXNThuQTBNRUwwbVZxQk0wRTVWUUxJRDFoUGZOUHRQSEpKM0RBN3RSZVhYWFlqdk9uR2ZMQ29RWWk2elo3TmNSTUx3c2IrZGc4c2ltdUNjZHY2eUFzUkZkL2h2ZW1mK2N4N0xISEhOTFJyMXpLZXNXaUFPQmxFQjhIbXVsWFk0RDJWOXBGVVgrY0pwbE12aHBFbkZIMUdubUZ2WGRaR2NXQzE2dGk2NzVPQVV4VzA3RnByUEJmMzJscE16WjRra0JzeEUxU1dTQ0IxVUFJT0xINDVTOWZNUkV2MzFjRUdlK0NkTi9sNEdMMUdRTDZsNFdvVTdoaTc3WEcvZUN0R1hWT0daNUJwNE9zdmpMTnN2ZFBHQjRJOCtrYWw3WmsvSUtSTm9hVk5wc2hBbzhzVDVQdmlQSnNiL0pmRGVyVHZMN0p4bWtQa2ZyNWxHdS95OUwwK0xjVUZsQW4xYUFWRmpSdC9BT01JcDBTSFN4bFJ0T0g4Mjlsb0Mwb3B1dysrS0VtSzEzYVM1NEttTWp1Vy9SQ01uSTB0dUsvVWd4R0JFcnlnS09VNlUyWlhERXg3eStwa3daOEgwMXZGemhXbjcxRU5VK0h6V3g2TnJSaVVWZDVoYi9Db2x0R0dFK0Z3S3VQbjFSOXJXYXVYcmxsSzVyaTFpekV1NUdLdWZIcmNoM011aUdBYXRGeGEvMVlTanNzZzVoTmlxaml4bEtHb0FGczRIVFhvTEw1MDZlUnEvVE5POXJyZDBBazlQQTFNVjlJQ0F0R1gvMW9pNll1TUlRa2o5ZTA3MUhCWlhFZWJISGRlZk5weHJOVjBYQ2pXSnh4ZWZmNjlvMEM4ckk4TFk2WndiRlFhV1p2b1B4alRQRWVzZmU0OTFNMlZGRjA1NUw1WVovcnB1emQyZ1RudURjOE9kRHNsTG1nUmFla2FwWWxuT0VkVE9XcVI4dlZ3WHJOZVRYNS9oQVlEMFJuNUx1M1llL1hWQkVoYVpoMGtrQ0QzWEhxalBVSXJ0UytPanZJcEsyYStRNE9sWG0vN0crWENzZTVycGY5UHJCbnhTQnprd3J6SmJEeTNpLzFJRTdSTEkyTmVBbEd6S1FqbXFlQmthM0I5TEFJUzJMdFYwU1pxRlp3MjJoQVBLWEp0TUI4N05lOEhTc2dHbUF2dnc1U216UEk3MDRkMVdQY1c4WWRLZkQ3aVc0cEVWbUh2WGJ5allxMW9uRFhTbXNPUGR6WTh3S1BaNjl1emtidVIweDdlYldTRnJxNEU2WWR6ZTF2c3lMSi8ycVBRZ1NIblY4UVRRd0tWSksydUxQNm9SKzNLT2VBRlcwNWVMalI4WldLSnpWRzhzcmV4S1VPZSt6bVVDdVc0Y092Unh0eFgycDhkNXc4MENmV3NwY2NtWDNyRldSTWR3VFNBMmlYcXFsM083UXV4R0plVUNwMzdEaHUzZjIxL2FxQVZIeHdHNnJ3MnlUUmtvWGc3Z0NGMGtJYnRaL2V2dkJGd0ZFaGd2YjJJejVKWXdsTWRJTnI0VUNGS2NNcnBxc3I3am9leEUrU1I4TjlrK3l3WjRvSCtEdnNmMko0ZTE4cmNzTWdxOE5IcnkxdVdySmREWGgxUktLSEpRWTdSRzZMWXl6N0JYeG1NbzI5dDVtNWdyOVNQcm1IbGZDM245Y1lqaWQ2QmFScTNXQmdHSWlzOEpOTEZPbk1HaUFmN0p3ckxSc1I3eG5pc1FlVStGYTJWSzJIWERKMGxrOEpNQ2FLUE9FNVRUcWtCbkRpTjlWOGhnanp3RmlqTjQvUU83ZFVaNlYvSkR2QWRmc1NNY3paMyttZEl6NDRFMlRLQzBsVGNTWUpZTTR1THBFNFNVcXhDV254SFQ3Y3h0WWo2amJCVlprK1NUMXFiYUY2WXlPRmJzdWY3c2hiOGs0NkVWZUpid3JyUUg0azZ5K1RJTEZqbHZIMVRGME5pU00vL1RFVWMyR3B1cDY1aExhSVNpeTBnRFhMb256SExaNk1uelBlcDd1UklBeDFTTHBvb0xDaEk0b1F4cTBjdFBTcndNRzVRYjBZQldYSzRXc3VjVmhqRzY1bWtmKzA5bGI1ODM2M3RENzhxNjg3OEtrUytycUhSaWMyRGRET0ZOMUdFYk9vOFdTVDhhWU5kWmFkaHJjNWtTOXFQd1BpWXphckplWmRycWx6bEV5TE91dVpUeCtEcTkrZFkvRUROL2dtZjdqU1VqM29NZnkxQkpRTFRxL3JHMDVKL20xT3JURHcyVDdoTGlsZUx0QVJPL3hhTk4xZ2VvM2owb0djRUhZNmo4bnZwMlh3ZjhkeitxUkdJUWNJNlp1YTRBMGpnK3Juc2JDSVg2MEJML2FOeVh0S0tvTUl6b3dVNFlyczRlWFNlV3VhSjE0eXFLM1FLL3h6dDVha1lVZmZrM3ZNRjNYZ1NteEcvZ3RFUk05YVJ4S05TNjZSblNJM2ZuYWFNUFZoR0J1Y0s2dTRrTG9tOXl2TnhNUVJJdy9IVGF3Vmt3NDRxTGhROTQyaDUveFRWQUw0dXVKdkV4ZjhXRTZQeWd2d3E4WFVVUnptaEp2UGY0MCsvY2JOOG1nY2M4aFJ0L3lJU3ltckhleWwxV01sM0IzcXZSbHQwb0dvL2tvdFRzaVQrRGhvR21FVnZVQW81anhobEhmYWFidlNzRWlWQkNScVVFN015QTZMN3dFNHhnT0haNFp1N28zQndzdWIwNFBXVFM0MmNScGR4d1VuWWd5K3o0Q053ZGVGNmpUcmpGMXpuQi8zRVIrdU93d01yQkcrVVF6Q29oUmw3bDZmcVQyTzVmRlBXTXhVdzV4SzZIT0hxMEdFc245c0FFa1JzVkpVWXRZYTI4VWEzcjhYdHBOcFd6bTY5ZGY1aEdvUWZ5QXZCanlUVjlBTzN0dUNKYlUzcWNiMC8rU2t2bTdpb0U2TkhVTmNYd0hmVFRiU0JWZHArM0RpdWNzVE56cGxScks2WHBmSEM4Qml1NHRaK3dHSHdOZXdScUxORkJUZHR0bC9LVkpoSUVJeEJhcFgxTnFOMU4yNHVvbG1HYmVIN09LOEpwMi82OWVDWDJtNGhVemZTK3RtZnJhUTF3ZEJKSm83VUtPU1piQ0FIcG9Qdnk1Y09oa1VKUFM1K21MVzBxNlJSTXRqRkRQbE84cktFRGpwUUtRbktkQ3dKRVViS21qcVUvaTZPM0I5eDZGUTJjQXYwRitwRnQ3aHRYV0gxcFVhNStXc0lsRzYrY0w0K0lJbzhJNFUwN1I2S25WajhyeVBUejNJMlJ0anB0Tk5LNjRuUHVMUEdjZnpGU1pzUHEyRHdnR0M1SUNJU1d6aVczSllHYVVLSHJ1eldFbFp2MSs3Rm1WOXN0N0tHZzlNRmR6YXRFS2NnSUJsdHBwenhGcVFaY3VjSjBhbHNvNjVlbWo2eXVUQXJZQ2VDQjBBcGt5d0diOG5VdkNFNUFjSEdVZWZvSFMzcHBNZnVHYXhIejlUNGVhZWlMVXFWRjdKZ0FGSU5SamRJU21ZWWdDSUUzeGM1WCtyN1I3aStsNjhLZ1pudk1YY3hsZ0ROWWdPUUEwUHEyejBOT1U1ZGlWUVJXdGtRbUV2OWVQbi9COFZ6SUw3cGdQSmtuQlkxVTJsNWNtVHlGNDRyY21UU1dLVGNUNGxUc2tnd25aeTRVMFFQSmZHdjl1REhzdVVqcHVwM0lRd0JWeEQxY3pucWJ0NWhEbXk0MXJ3WXRtanJjTE1wcEhYKy9WZlpJUGxyY3k4bEFZaW14RzNON0J0cCtBcnQ1WkhKWTUrcmZJZmRuajlJT3NBRGlJbUdud1QvR0FKQ2xYQk4wd0M2ZnVjYnlQN3BQUnNRcFpZYXZ5SnY5OGFPRDU1RElqSXZSbVlVdU9MSHlDZU8yMVJLOFB4cVB5YlhJZ3NqMld3R1M4NUpPZXpTWlVCUVRhVC9RTXcweWhTMjVvbTJkcEtRb0J0TCt6MmJQdXVzTHAyaFU1Z3g2ZUhUN0g5c1JjWEErT2Y5OUc0M2x6WGZ0c05weVlYcTNzYVFxWkw2dUtqdko4SVp0M1VKV1B5R3ZXWEc3SWJGbUFVSmlkOFc5R0RBNlJMajZRWUd2anp3ZHdKTEo3bUZsOFhjUXdPSDFpNHFJSEx2RSsxWEpUNEEvd04rUGVEb1RtMzJsVmE0d09aNHVrL2E4Rzl1bDVsSkd6UnlQQkJxWmg2Zmc4NjY4dXJ6VzRGekNoSFFhaUtnWlFoZGNvRFdWUnZSRWpHVE9wamdlQ2UzVlcxMVYzSEdEeDdhc3NnS05qalpFME51NlJKa2RLNzViZ1FKRXZONTVkZWhsem9hQzBSRnhjR0xQc0pOR0VuRnBRUW85cVROS2RCYjZFWkxxZjY4NXdhbFMzak9iLzVNS1RDYnhkV1FDd0JhM0ZUQ0NhbXpNK2Y3RUNYRXlTWFIrZkQrS3BaNS9sMDc3Tk5EVXd3Y094Nnl3UmRCQWwzZ1RINUNUeXQ0YXhsRStvOGVNb3pyeVNZcTZ1dVQ5MFNJd1NwcGJyc2l6Q255V2ZCSSs5OXBhUzR4SG5ESXVFR1lHUHFPNmIxRWlULzErekhMUFoyVktHQWxUWFdQOWVFMDE5anNpbmV0ZHV1bnE3RW0velhjMVV2NWk0czVrZVRiZDREaUVUTW5DRkpyTUs3QUQ2RnJHZjhMVmtpZk5JQU9oVzVVTTMwdU41cE1XcStqMDZGTHlWZlZCckZPNmZXY0RkemFJSFgyZVU2Z0JYNFY3WW1za1Irc1hxK3k1ZmdvNjZtL2ZaUFpIQWxOUXZrNFlzNXBueHBLbFFxOFVsbXA5SE15dndHZVdETTQwK2hxMEF2Mm5YMTJFRkFEOHRsSTBPQTB2N1lpUkZ6R3I0ZUtoaklRVUx5dEF6NnVVbzFzYTVXeUFJeFJyNWs0Qlh2NXZRcHkyRUtQUVdzKzZCeXNVd0F6VVJhdk9PNk55Q2x1RmVYSG0zeUpKc0dvQzRUWWRUL2JKOWh4aVlybmMvRTB3RXN5bFlWS1grQ015ZDlWNjMxTlNERlh5SnlpTzVrRkRoSCtWOTd5QUd4c2Q1ZTYzRnU1aWIwc3lla1I3VkhGTVZjc1U2MkxPd2ZEakh5YVVneDRyOE85dVg5cVcxZ3hic1R5WVNNdzduWW5neEpaV1ZKVjJoL2lrZUpCTjB5Zk9TTENoNzlKeHp6a3c1OVArOEFrSy80U2NMeVVPZEMvc25Jb2tKeU90cHYxckFkblBVUFN6eGtEL3VlSlFMR3prYUl2NUpCemo3aGxUZWdPRkR1N21yVGhmNVlUNlFQcDFyRTNubmd4Mnk2eDFvd1BKaEhyMjRJZXZobDZEMXhzbDY5NU5XOFNNYnRTdkVZZUFKNnBpQjdOcUtqa2dYS05KMW9mZjN5UnVDTktkSVVYSEZ0Nm92Y0RZcklNSHBKWHJNenBzSVRaOGorTDBkZFlxWGs4L2xZMUFXT1h3WUNDeURHbFpGVlBpRlFmaGlITFg3dWlRa2pYTUhkeCt6L0xpT0dMbDJ6YmZUY0VZNHJiTTVuNFd6bjdTNU5YcCtJeW9BV282Y3FtTFlENUs5bW9KWEdPNXFLRnIwd1E1anRuSUhtMldtYzZXM0JxNUp6d1UxbE5weEpvekF1SEVWcXR0dk1oMTNVZE1qRzBzaWFwYWJlZjlJeUpWV3F6OE1BTTRtZkQ0ZnFBY1Y4Y3BLOVZWM0xlL21lMDA2YVJ0SFg3d0g2YUxhWVFBSTBKWkR2M25VS09icEZSNGczK2l6MXN4YzNtWWdPOGJuMURJenFLUzFkZmVqVmNlWkdqQlpmWmdmeDBNS0ZTOFo0Z2hVYXYwc0hyS21KN1JOOE5MK09CR1h3d2VDQ2V4U2xKcUo0VzZBcnY1eHhqY3JpQ2FrR2tZUWdkeXpVK3VobXlmOWZTUGR1Zjd3UktEOUxHT1J1VGZZazZBUTErRitzMk14aUkxV29DOCtsRDB5Rm5hbXVzVlprM1lqb0lEN2plYmRIYTZmOG1GcXhva0hibS96TWYxSWhFTmFqZzc1MEN2eDRCQnlNR05JQzFURHV5VVVLdisxbFBEY3dCZWhmdU1YUDBmNVlnY0xhbjZKdXFJeTBabFpTWTlGMzJ2MnRJaWo1YnVjSjNKN2dKOTVFTFZDKzhrbmt4UnVuQkVIZTBaeENEY25yellMOFhsdzI3L3o2VkpWNWp2TUZIVHk0S3NvWTFnQ3BXM0IvL2FWY3BJelhsNTYzNVV2VGhVRHhEWFZteWQ1SG9NcHZDM3pZL3RWWVRoYk9IZWI1a0lhM2RkaDcwWUkxRWUvVW11Sy9JclBTc2RSVnFJK3pnZmpRemJCU1ZtZmpxTDVrOUpyL2ovMDBCRXB2VE9QOXN0Q0xtRFgvT3FZbkx4ZHd2QWtYYnYwSUFYdVF4d0NvSjZqQnN3eVAwS2ZycFVTT1BVSnNzYkFiSW50R2xwUEd2TXdTRWpWeGFmSUZVa21wSnp6QTFwbGN5aXBMTGF0TWdHNzYxaUJtaGJ0Y3czWXFidWRnY1RzcnR2NndPcjV2MEZ2TDdNTFBvbXNGaVhlbytrYTF2cDltcUJROW5MWEN1MXNScUVhdzJCZUxUL2hwVjNTUm0xVnZCUTQwV1JPU3dXY2xlS1dpSy9jOFBabngxbkw3T05ObE1TWlo1cGl1MXRJa2NFbGh5Q0xKRy94WTgzNzFFQ3dqRzBmQTAwT2dkMzJrRmpUTnZVQ3BKcjR2TUZyVW5mM3pIRG5SWE1wMm5nTU52Tk9MUTN3TVpDSEJ6clcvYWdnc0xTc0s0VlZlOWpoTWJoRDFpQVFBYnI1ZTBDTUU1Q1dJcS9Gb25HWlpLem9uaVZRYUZGRDVKeVhFblRDMXpNczBBZCtJdmJRSFNyYURseWUxMzFpTitnU0lKemxFZU84UEgzR3F6VzVBcTJTYVkybEZ4RlhnUnpwcUt6S09OYTVYOGZPSTRxSmVCWnB5QXlvZVJLWXphTktRUjc1aHBTYXJnRXozb0U0WWJNcWV2YUxnV0hMVmtNRlhVSXE4S3R5bkcrZVpsYkRBcnpPekkvdzlENjVIZDN3TmpmUUJhbEY2NmtRRDEvZndJWDBmVFd5cWhFSnhPR0hmb1BXSWdTdDVzZDJMRW1aWnIrcDVndlptM1NOdTR3VmpCUHl0OWp3MnFpcW9wRE85SXk1SHFRMUU1ZHJvOG9jSG9XTjV6c0FVcDA5MldVZXRHZ3h6OHhHTFhOanZWSUtwSEs0eCt0TTZyczVrMm96U05oTXJhL3hBdjlhZ1FaWjRtN1RjMzBMbXFrcFZZNW1kOG1idFJ6dDFTazdpNjF3WVdnYnoxSHJyNGZPcTh1QSsvR2JPQU9xZEJ1dGRUS1hQczFDTHgxc3lEd09wL25FY3EweUdkMjVUMnpJRzZTbXAwdCsvcHJJVForbzhpUXVsWVdya0tGeTg2TzBkUUtWNFBadG56RjlIUDRXZ1M1dkZqWDJBcWhLSS9hOUhlQVE5NGRiT0F5Q09YT0JQWDhkS0RJL0NzcTJlMVJLZkJTUkViWFcxZHBUd0s2dE9KaWxjOW1Xd1BZQ054V2Z4K0RYeXNjcE9MTmxFWEowNUhMcmJJUmtQWVJXVVBUR205R0V5ZlV0SkxWdTRZNVFYNDFreUxGU2s3bzl2ZFNIWmpWMEdMMS85ZC8weWFSd1NwTGlBb2tRVnRXY1ZMcTZPbXdvZlgwOGp0WCtlZUhZbU1OWkwxU29vUFE2NkNDckNUb3pvTExSdkJJQWxENWhRR2pibWVwdEZiNmY4T3ErOXFXQ0NodHViR05QRmpNRmJmcEVGUlpQd3dFNkYyZG5LeXhCSERSZE4vVUtYMmNOOFY4R3BVWEJxYnIyQ1ZQdndZRDE4NXllTnhSQ2UzcDgxOExieE9icTkyaC9FTVFHWW0zT0pmUFQvYTdqWkk5SkpkYWhpOXJoTDB3WmR4dEtLQ0drdHMvY1VPaGZ5MyttbHdpRTd3TzBhaTV5ZlJGOEtNbXZLOGU4cGxncGw0V1k1V29QQzFVbE9pZ3BkR1VmUTJyRHIzK0l4OUtUaFc1c0l6cW9FcGhtREk1TUYvZWZpcEpRRVRpbzBLcFdjSkt6L0wyeG42WEtFcFJqODhkaksrUCtmZG1hWXQ0Y3MwWXpLSXJleW1mRStLVEdzcVV4TnJDaTB0Tlp1VWdUbEQ4S0tYMys3YjJUMFBveHRsK1VoVkUvMlVucEl4RWRzRHVsWjhDakhDU2JMSEZrcVFiVERJOEFWKzExQjVYNFJyZUE3dUFNWHFLYlBUbVAybGR4OUV6OUt2S0k0bkJzbnVUbWpkZWlLRUYyWUk4eU0rZFp5bTNkaW8xb25kNS82bjBJUFBuZmhST2VNSWZwVk5CQ1IrTkRjK24yemJnSzRncUVWMUVPZjBOM2FLNVYrb1E5NVB3dzU4bk8vVTJKNTFjU0NZbzFoU3ZYWWxtdzd6djdnWUZhMGplTTRsT2llOHBKdFk4WGNzSEJYUmkyRVJ3REpuRTdMZHhFYTVMOWIwcnZaRUloOXZYbVV2MXRuV2tTNVpwbmFFTzFDZmtlNnIvRzNLY1laSEFHcnJOaWVWcGJPVlVHZGpjd3duR2t3SHhFR2xHYmJHRFliVnJmSGQ2cmNEWDVpRU5rNnlZNVhOYTVSd0UyUU1GQTlXWDBNSFNkdHY1NW9MYldtdHQzUjFrbndrVTBIUytuUFBNeURnY2NwRFl3ZTVlVWpQcFdqTXN1Q3pmcEdNdSt5bzV3RGY4TjgvMnNmMWV2My9WZTMxK3JwYnZuK3NSK3IyRnA4bjFjYjUvUVRuNU5zWHcrL212azdUZm4zUnd6NVB0ZjN6L1pBLzFlMlRmTjZqSjhuMXN2MWV6RFBrK3RYZlA2WE0vSnVEOG5wOTE4bmZMOC9TRGdiNVBxVi9uK21IL24rcmwrZnUvZko5R3o4LzAzTDVQbzkzeWRyTmZCMGQrVHVCdnlkYi94TmxBSXhTZ2ZMVVRpYm1wMmZyOVVIQVBtT3J2WFlCZEE4WU5DWmpVYWFEdjcvU28xalJxdHJBbUJqK1hzQjJuRFNnRFdieWxwQm9vMW9qTURNQmdvM2o1UVFoaERyMnBweldQTHdlUTVIRnd0WVl3UHFpSHh3ejFxQ2JBMXB1OEMxMHAyeHFTOVZoalBxY0NPSmRObUoxTnNGL1JoODd1MFhTc1BjbkRVRGc1OFR6OE9nR29CMDJQdDJTTndpL2hhcG11UFB1bnQrVml0alpBeHlVOHJPNVdDYWxTb1VibXNiRERjN2VzSlhoMkVDeTF0VmRGYjVEZWdHRitEc2RZalNIWGhPeWdFbkdzYTNlaERocm41VWhmSmkva2svKysrZ2l6cnZWVDJiQVlpeC9CNzhZSnV0bXJCK050MTBrQTV2VDR4TmNnQWVWNytaTEZVUUhkbWQvZS8zYUM3QVA2NEFjb1hreHpHWGdPUHpEYkM1d3oycHdoZDRhZGs3UUx4R2hNQ1A3dzAyK2I3ZElGM2pOZzcxeU80dWZnYkFtZFNRWGl6bS8xbEcxa3FjNi9NSlhvRFYyem1XVGxSNE1TWHh1YW83TVlwY0xCVkxGeW42ZVgzTWR0ZThnT29Sc0Y3QzA4UHZ4YVJxVE5mamhyZlZOaXYwemlqL0RGOWZIN0lnTDFLL0tZUnlXSzlBOGIwdXZ1R0FDdjNWWmFwUWtlTTJ4WFdOakZmaEtDdkZ3SEg3ajA1RTdUaFE2Z3J6UEhrSWRaR09LVUlMeXdnU094Q1hpRFBBRStHcmVvQlhodWJPT1F5ZjJ1ZlcwRUovb2RvY3BablZRZFNTTUhJOGZLTkpmQXI1WS9Ka281R0NYZ0E2OUxVVTZaMUFuL3NBS0JLZDZYSGE2ZTRCTm02NGFYazNEaS80U3hkNVR4TnBEeWswTGovU0VpeXA2MjB3MGZqTmZYdVhuU0d0bUgycDMyVWRzV0VUclR0bkJ4SnNYSTFLWXdaWmNubWRMRERKVERWZWdXY0psaHkydHAyblNnUFdnVmt3R0hQVTFJK29YR0orNGlEbHk2NWNYQkZUTHE0K3dCK3FSdXRSd0J0YnJEZkZVSkdsY3pySWY4RDU3YWtBMFRxempKNHNFWGFsRks2RnhUTVdHVkRsSHczVDNyanVEdHZzbTFRWGY1aWZsWitwL1YyOCt4N3dZVDVBT1BtTE1SU1ZiT296ZmdES2pzMXFHNWo3TkM5UUo5U0Z6UXhKTlFpcGVtMHVNWHdKVmFvR2Jrd05QT1RldmZlSTk0SEtaOTBJa096UnZEanZCd0ZXcDZIaW1wWkczbWh4NzRlS05nSW1ETWtnYlVOcFgvbHFGbGlYcys5K29VdDQzM3hsUGd1dFVRbjJrWXNUeXVvOXgvQmNBbGtpOGtPV0lOclpzMjIwTXVwS0xWUTRVdytGdjJjM3RWa0Z6QXhpSlhXL3ZXbDd5VFhqQXVDK3o5dFhSdUk1dEgwZk1LVThiVmVXU1h1ck5TQjcwVGt5NHI3bW1VYUxtVTJvQjRpQnlmOGs4ZmpHcW5oMXkvM2F0RDYzd0F3Y3hxZkVEUjZLS1U2Y0Y5N0wzWDdUSnBRbnRrSXNaZEVPeWl0SXZYK2F6MEcxcGVOUldQOVR3N0tZZXlPL1dldTh3SExoWEhjeHNiajk2SlFManp0K3VpVFB0K3pvQy9zbmZGaEQ0NGJzR3ZaQjFhS2pMQklxb0c1QzZpaDVzS1NtQW1uOCtvOHBrNzJsMndsdW5mZ0VXSlpaeW10aWxjYlJZejVRUkZkN2VYRjAybkdDeFYwWEpOVG1lUU1zZERnKzMvSG5XL2NGYW0wTVhqa3NUTTFpczhoYXZUT0VQbldwZ1IvdTZVTU1pZ0ZzS0pwM1hPSW1kOXBzZFBxQjloS3Q1d2UwaStMWlBhakFpUGh1cVB1UE9kNlExV1Q0c3ZqWEhqcGxYTlNxcEVVMHdsblpZVHJ5cDdzUURGbnV4dHl6eG5kNGFXbi8vQVkxcHRKZndtc2YvSWhGRkZXQVM1dUoyZlNRdmhvcGQwM2VvVVZxSjB5aUdaWlU3TWdHTndnWGtDYStMTmtFeUJxUkZSZ1JRS1phWElhYnNUOGw0dlUyM1I1dlkwbkJVeC84Tkw1ZzdLZjlhMGVNem85aWZXNjNPc1R1N2hTR0FLekNaaE9odDhNeWVFMzQxc1U4bUF6Sm54WDgxLzNuWEw0N1dxeXNJZXZQeEtuWm00Wi9JSm5hZEVaUkt3MkxSSXErT1dicDVIYnJFeHdhbmpuMTBjRFZVUnVtc3BURVhvcHQxREdsVDgvTFFuVXFDcitvMkFNNTNmb2lyRTNjUjRIa2lSa0JTQVFzUzQ5QklyaVZTdkpiK1JHcEc5K1MvdW5FWnVDVHRUZnBrdEFkRmhnemlic1FQdDhSZjExVDlmOUZWcVM0NlFFc3V6NjY4WVNvYmtqOXI0YkNXMmw1Qjc0alUwS1lQaEIxelJtSCtobU5GR1V6elVLNjRpSzgwdUZjeldWemxmWkU5d2s3Q2x3dFE0d3NjSkVKUVQwSklIbHNnMHVDN2VhdGE1RWp4WEt1cWNISHhZQjJ1OWRvWk9VOVY3ZVBXT3lWMWg0VllyUUg0RU4rQXdxa1JTSWxNRDV6bzZOVmIwa0QyZTg4RzR5aGM4Rklzb2RiOHNsWnlaOFVGekpwY2NmQ1FDaHFYbFJGb1pEWHBHZXBRSXdqQXFVWkZuc1h3WWp4NTB5M0V4Q2kvUERhK1g1a2Q3ODkyUG43YWVmbUtzbThwdkRaN1lPTjdHbjVTc0MrMnlHcDB5dlFZKzZpSkl4QTBJZ2tqZElqVi9wdmpmQXQvRCtncjQ0d1RKQmp6ZUQ1WDBiM2taZGZTSnFGTHlVRnhKRSs2WTVla01qWVVvczdnN2czMitPN1FoejNwUm8vMlRWTnhIVnVwSFBObkVmRGNNRFN2dmRpcVBHZS9SbnFHM2RyYnZ3YmRkY2ZXRE1Oc3NNUllod08yY2hiZVIzSVF5SFMxWStEcXh1UVc3c3NBdldUUmdEOTlUSEVDdkd0RVVPWUYyNmU4MHNhcW4zT0oxNEt6eDhjc0RGTkNlNU1xOFFQV1E0K1pQSDYxZkM1ZDZxdmg1QWNPQWJrMTlQUnJiaW9qbVlodW04aG40VHRBTEVzdk9NSWJsMHhYeitpMVNvSmF4QzA5anVRR0xFNjY4ZTlidGorb2hub0wvMWlaaDBYN3orU1RacGZFbFhjWnY0aldDd1V1SzJGakVTMkhPUDhIZkdqaGpycUVNeWwxaDUvRk5CQk1HNmYxZFhjN2Y2Y2tHQ0ZINVA5ZWRCTnFnd2MrWGpzVXVKWlFqc1Y0cFQwcVhYVm1HSFl0OEgreG5qQVU2WDIxSEVPeTBNUFJCVms5bmJOMW5OMFJzZHFqM2ZiWmczN1BCclFpQzA3MUxjd245QzI2TVdxOElVWjQxV2UxVG9JdDd3YkZlTDJIMVNNRk5OdHJmcnNuaWQybVd3bWUxQTNOUzBtMHRrajl6ckVtaWhGZlhEWEpNQnVYV01XQ2ZlK0U2cVVDVGlieEZIMTB5N3VSNWs3QW9FSnhlTzl2eS85UFpTS0M3QWdUc3JNKzQzMktwWFBiOFkwcndqR1FXaUVUUEFCbXU3YXV5aEZDd0dkRWpEcmNiOW5ReHRzaTI3MlJlRTN4SzZsMitxRFhDcWNzeDV3a2h1V1FEMU9HTkg4cmNwY1hpbEkyUzREVE5CMEc4dFg3T3RRR3ZMQXZsd3BXcmsvSHAzY05JUWYvWE5TS3NpWSsvd1E1MDludGRNRnNXVjcyTWdIMUlHUC9Wa0txeXZjejdhcVFXRUYwV0FQTlVqSHJGam56ZndRaXVEZWlkSTlIeTRKbWYwSHZ5MG5INGJQMjRqblRERTlKbWMzYmp0NGFuNkRTWWtXZ29ZVDZuV2tKQVV3eXQxT0tkQWtra09XTmZhZGh6VStZNWU3dCt1K0huQXRGMVdINS9CdGVDL2VKREtLYytYWmNSQVhlcGUrQlcwVkpPMjNrQ3lmZGYxM2lRNWRkR21jSk9hcXUzSGhLcXF4cjdHcGNOMmZGeE1hTjljMG9aQVg3ZXdpWi96SkRMOWtBWXppUDNtazV5d3dPWjQyZ3hJMlBMRUVxUE5aVFBheGI2MU83QkkrYlA3WlREeDdZZzliOHFDc0RkdEhoR2k4bDNkL3AyTVZuQmpTUkg5a0IvZDRCY0dNYldJbVhSSGc5WG1DNHNKQ2pjMllBMGpXTG4rNGJnbndHc1JOVnZDaXd4WWk1UUR1MnIrSmQweDZEd0NiU1J1S3Jyc2k1N0pSYi95M2J6ZFdteDJ6Zzk0L05kQVI2enZuaGFqNVk5Wit6clVFNDRENW1SMnJoV05xKzkyYUZVR1FReXR5NmZvN3NKNWJTNGZkdUljUEtaM2hsb0pqeHhFamk2M0JpZmV2bHpJaERpaUJ1U3c4aWwxRkNRYkhlRWJiODRMbGdEWTdnNUxqNlFXOUp2eGVETWNoNy9XZWN3NFovVndkNzc2cExiVm55Y253NUVtQTY0MDN5K2NHeHdsazVVUGRmZk80VTdGcXkrU1puOWd4MDVCR3BYdDR1K0tmMXdka2U2eWhLcENDaVZVS3cydzYwcTFkWDhRa3NvWnAxNW9SY0NFSVRTMjhDU20xMGQzZHB5YmRFalR6MWdnK2tlUTA0VXBoenZneWUvQ05JbDQ3UlZyMUh3WExnSzh2bW1QUXBwTHIrSFBUUnVXU1M0UmdDSERQcFk0WXZUQW91S1FmbkZJVHBCRyt5Ni92YWU3SGhFOTIzMlUxZysyNGNnNG5BbitTOVlJWXY2elVDOElZZzlleXR1WENEa3loRFJYWC9hV1Fac0UvMmlGVEJvUjdid0NHNnBzRkRjMENoKzUwVFk1dkpjVitvZ1dKVmZKdzk5bzRUWFh1dHM5TEpSZkVuNDFING5YL09jN2JiTG9TT2p6WFVDZHlSSmt1M0F5UWRpblNjMEwrdzFmUCtWcW8rVzQ3RncvV052REFPUjZ0Y3ZEZzh3R0ZEUlJqRitBcjVNWGJydjcvN0VxQmppMUYvb3FPaTlycFlmcXZ0eEJ5NlFhdnNoalhVb0hzRTc1Qk9mei92VERnTThXeUVCRkZEZUtWZ0lKVXBEdnd3dXRFeFpXSkVsTmZ5N2Fsbmw0a05mMTJmVkZucDRFRmdkdnZYUFpMZzdxbVRxdlF5Qi9McnAwMWtRNWlUSWY4QlVaWk1WK3hsRkU1VzVnQmduOGhubDJ0SVpnVjhhYTE0SmpyOEFhRDV5VGRMRXdhdll1NG0zNTViOExsVXprQ1c2QU52U2prMTJpb0pUUnk3S3dtd0Jod3FCM0VPQllXUWVsS1cwdFN5dy9udFU2aHFXNzZMcXR3YTNRbjc2eGU3VEptOTVIbDlXTEJUTU9yOFhuWmVNWmpoWG14eEg1OE14dWF4MDNJZGd5bWtlRFg5bnVORHk0RG9DejlnbEZETnIrYVZ4R2NaNTROd3NaYlpnblhibzd4S0kzaEZoVmtzaWNNck1wTHdPZm1DMDJVT1JNV1paaXJaYkxVUUVNMVl2cVZyMVg3SFBtdy9xdHBPdnE1c3E1NkRTRStKakdQZTR5S2JmOWtSREJXZ011R0k5WEl2ZGV0cTEwS2lrOGJyb0JzRlkvdkFuTTZORGE0NFpCM3didUxncENCRjNMejlRSGFYWVYvUXQ2Y0VqUHcwRDZ6N05yRzV6ak0zbXkrbWFWVjJWaTdCbk1lNEFkQTkvckZZUnJyakRzMURpM3hkYm5QaFJCbnM0MVczSjVlbjZaNHY1S2JVT1BiL1JmS05iVHBqQURSRk1sWjEwczZSbWxMTE5lN09KbTc1QVoxb1djSGQxcjNoSVRtYU90cHJqYkFsVWtkb1B0eVFrVUc2TVpZT0ozZ3EyYkZWTXdYQzNhN3ZxeHNrQWhuS0RERzBDZVp6MGJrbCttR3RMeFdRQW9lNmgybUp4TmduSk12M2s3UzRvYUMzOG5Ga0ZTUGZNQTdKNGcrc0NnUzJkaXFRSWNPNUFVYlE3T1hsc0N5MTRXbFBKZmV1N2JJZ01vZElia2R4UmdEM3o2bngycUo5UjJpWWtTTU0xM0VRbkN0b2dZUVcwWW5CL0t4NnhrVzBxUEIxTWducWl2dDlrTzgyM0FEUUlhTXlSVzNha3didkNNMkNjZUNFQXVCV0RPdWVCalY4aExSS09PbjdwcGM3Z1BPMDhZcmVTYVIrRGg3RFY4ZXFodThsZm8zVWs5SW1FUUw1bmtxWFJjcTBUZXZzR0pFNms5RmxDaDRoVjgzTlJiWjE1dEFsL0hVSTlKdG1tQnVLMDlnSXk0cUZBczlDdUNNTFJsZC8zcjBnTitrMWlkRFpHMy9uSzd3VHpvRSszbnY5WEpnb1pWU1J5WW0rbi9zNE9ESTRScEdZcVRPOFBGNEE5YXdUOXExOFE3dXFKSjg2cncwNXZqaXQ1Mk5TNHJnZmxIREI2Nm1mdnlzVlFaUktoYTdHNStRbDdMSUZta3FxUEJwVUZPWGg3NkxHNDNJUER2UzhJRC8yVjFjRFZBQ2VJRWlaWmIvQkRJcTg0Q1c3MjVreTcrY21yL2xkUStwbk5BdTk3ZHdtdHFxaHdOYkh3SDhQZEhTMnZmQ3ZhbzhmT1ZLWUtqQk42SjhmMFRIb0dvTUdlakRYQ2hPS2N2ZHVMWFBmWk9VT1VnRFM5MURRUXNaVlhCTDlDdHFJZC85bStrRnVtVEMvMndSUUdXTGNpdU53eWUxZmlZQm5vN0doa1ozdW9hak1qTkJUVVVpRVNKb1lhSmJjSk13RHNXaURwZTdlT3gybTdBaW5TY3N1Y2hEa3ZCSnQzOCtMdkdYRWJnNVRzQ3F0RFVaTTk4RFlJTEUvZXgxSFRxMGFpeCtFUzkwUDI0VEpCaXE3ekl4QnJXYmtoWFNoSWd5d3VPdCs4NWdEZXl3Mk1CblkyUXJhWDV6cmY5OXUxSzB5bnh4djJsbnp4L3Y4NGh0UTZ6TkhHc2UvWUtDTE1XVTQzcUJMRGZmU3NYSm84bU05Nm9QUWp5SVlQckpkYW9VZVJDNFIyMS9GTmQ1UWdMajZieE01UWZOcFlyY1BiUmpNUDdJMW9BNW9nUWxCMktJVGdISm9OcU9pbzVCTldxVjRxMUhTMy9nczJRYzBYeXdJZWZQcVFyRlE2ODY5bkJTQm5yRkJlbWt1bTN4RFUzczdRWG9URTQzUHJ2MGhJSE5LM2FiQUhKZnAza3VlZ1JoRFAwcXVROHZmdEcyT0V3OXV0RFlDODUyUGQvQ3k0T0RRVWg4SXBwbWcwdS9URXd0V2FWQys3NEVMU09jS0ZHQXJqNWJNQ01ETFNQanBYVk5YVmZXWVNjYzNEY2xLeGhFM1hubzhRMnVjRzNzY1ppcUNxbDFGWjBnTGVFWm41azRKY0NwWVZVQkRrcnY3WmJjbzQ0VGlSZE9kR3NQOVFZU1ZOcVEzMVB0aDhPTnBzb05aNmxoOXVqcXV2ZlJYbmxDb1hQU2VXWFhPUHUvNnFxQmd6cXJoc0VRcGk0cDl4QVNHT21NVFVsQ2xYZHN0ZlVxcVhSdDRlc2xBcWxtSW1vc0I3NEQxVzlQaHpDamwrckszVFpKbXZQTzZlUERPMVh1Ujk5V3FvRWdEOHFJYkFkamdTZ0c4cEM4WG9uWm1XZlZvSjdaZEhGUlBKdk9Bd0hwS0t4Znc0Tmdjd3hxMmY2VHZ5bHJXN2pTVGxab29JT3M4eXF3UjhUSVdPNGVlYTZMck53a1FMdmkweFRMRFpHa242cmw2Ry9FNjdwR0JwSEkzODgrQ3BKdmZxSWFOZm9sWW9SVTJFczZYYnlhVTNxUzltOFdmd2QvUjRneDR3M3prc2xySngrY1M0ZkJ3emt1MzZkUXpJUG1JOW8vYWJmYWpTSmlodzdvc2s5QmdhTEl2SVpyV3daSjIwZlhsajA5U2lDWFdqTnlYM2J0Z2FYMzlCbG1HRGVZMWtLMWNoQ1BObVNITjhxekh6b1V2YTZyc280cHQyT3czMjU3VFNxZzI5MVJVSDNFMGsxL0x4VkJESnhrUklCVEk2QUlwVzlGeUZaOHp5bVBZajNZZ1loRkdReExWRTR5SHZpMmlLbkNXODVWMGduYmpDMytGRDF5REJKeHFQZVhKVHpPa0ZyMk1XL0xaT2luN255d01yQUhmaVpGbGVjNld4QytHRjV4dzVLWUJ5R2cxWWsrN1VENVhUWnZkZ1cwZ3R2UmR5OXBZTEE3ZytURjVmbW5raXVRV0dVMFoySUdCaGt2cjc2OWo4L3dxSXFjbnJ6UC9LdG5MT3NnZHRJRlgrQWlJN0VKR284dmlPSkZSRnR3QjIxQldNYmFINzRtVDhsS0NlSnBWTno3RktLZXFzcTR0eWFJODRoRlczSUkxQjlWZVJwSWtjaDNUQUFvWURrdlNXSTI0NGNoUFRMNlh2RytaZG1BYzQ5ZDYvbldrdGJ6L1FYVFhESGJPeFhZSDJIMENrbnU5SG1VVU1Xd0pOUWhIbERKbkZTbnBvTDhYNC81ZmZlWTBwT0FIbXBaSmlWTGU0WUFEQ0RyMHVNeUhGaWZnbzd2K3ZYeU93Rk9rM1Azbmt4MzJ3ZEZvNU9kSFIzekNZazMyeDdNU1JRZ2VMOVNaMk5FS3NsM0tMNlhpc0NCaGNXV0NJbDhCdUkxYWdhZUVmRjk0MTJxRVByc3M0bmJhYjMxM3NtMSt4RG5MbGdkbEdROEwrY05Sb2QyUHNxbTNJRnNzQWE0c2h3V0h3TTFUQ1ZkUkgwNmFNSjNaR2tEMHdzUnBpWjA0SWVpeGxGZkhZRDg1cjJCUXFHMUg3QllNeVdET0oyaWYzYmxXZjhGb0NRNTdycURZU0RKalBhZVdCL2FkdHYyMG9OWEsyNkc3YWJFY0xHWWM3c0JOc05DMEt6R2JzTVBzNmJyckFkd0ZRVzM3VFM4UzZrb1FFNjd4TGcra3dHRUkzVVZDOW9TakpFZHdxY21reWVhdjFRVHJKa1lkN0Zudjc5T0Z4M0xwUUVlQWF2VWZaaEIxVm45OXdxL2J0TjFhVlhCaDhMS0pNYXd1K0lDSkszRDNXV0dDQmttVVRURzJzSzJVT3NyN1psOUxoNk1VSWxrWjdQczA5TExNWFJZZk1VdFRiUWVjU3pFT0JTTGsxVHQ2cnhlSEVuRzlwQWgrNzZRVDZxV2piZjI2VnRtWjM1eHRtd2p0TWZUZm9qRHIyNXFKdmFHL3RZRHpqWEhsZUlPWE9uUEllN1E0aGp3UDRtVkhadDdmOUg2WDVXZHBmVUxSZkxzWk1IT2ZTL0kwTGxRVjlIUXIyR2NuVFZBRG14WmhwZ1NyOXcvbVV6dldjQ241dGxzV2dJNVNXQWNkL1hjUE1nR1Rwd24rMk45MWhwS25UY1dMZG9MSzdwMlVMdGhOZTFCYS9WR2NJZjJmbWxLaFN2cytGR3pjWHRYaFlmT0dJK3RBMlBZTkFRcEFVZkhHZ0x3cE05UGthZTBaN0tDVmhuZUZLV3o3KzVzcGJBSVpZZFJuZ0R2SEZJT3FPZXNzRXVBQTNlN290b1BpaG82N2l1Q2srYVc1MUtJMlVka0o2TGxoRVpKME01cWdJWHcxWXM3VnA4NkdsZEptaGlNMjBWc2w4c2dTdGZNZENsMXhnMXlrRUdFRXFEMktnSnBhOHBKU3BQc1gza2U4bUxCRXdoZ1JPOHVUejQzUTdGdkV5UGJSV0ErTWlEbFNDbjhqcW1nUE5ZR29iU1FOVWs1bmRIOUdrdTJwVW1hbndvR1VkT1NyaG5YMlo0dSt6dnJzTzhEYkczYThuOElGNEkzRkUyWDAzU0c0MTV3clFmelhDTXQ5TWJNZlJNSEJnSzd3UWpUeit6QjVZM3dXV2xISnJsTk14RERZQnpXSTdEcS9WM1hBM1puMVFhRnM2Vk4vWTgrYytOYzFkTENQaXA3MnIrU2xoQjQ4OUVJRWoxVG9TYWhKSGJ4NmVPb25aRXUwY3JZcnpWUXhSK1U0NDE5ZXFmMXJmcmNxT3pNdjJ3SW1EWmo1anFQR0Y4TU8xTWp5SkxaZmhYOWk2Ni9LRkdwbU1SbUFkSWJtMERwSTNOVVNod2Y2endNNnNRVkFQRkh6K0pwMmJtSi95Z3c4Z2pXOG9UdXNxUWM1VzVTTHFFeG04UWxNQTI3cncrMzlFYjg0N0RGUE5hMzd0enJzRHNJWHB1R3RxQUFmaGo0OFBUZCtwVVlkQmw1a3hYekpwdzc2YXdwT2EwL2d6b2lpNENZN1FPZjdzZ2o5dU1qN3FLMmxHa1RYMWIyWjlaNXhoanVlaFlldVVzVkJ6eHdVSlloUHBsZmFSUDlkOEE3M1BEOXEwSW13MGY5c3h6OU5yYlFIbnlWdjc1SGRhRklIdytHeGdidWdHOUp2V1FWN3g0ckx2aEczVjdiaGQrSWJZcVJuTDFDWEdIdGY5d0N6RWRYUlZIZStuZGIwWTh4Q2xzOWxNU1F3elpscFVkWEZ5L3ZGQVY3ZllHMnc2NStBbll5WHpiWnNzUnFiNzRlT2xxYWFHaVhzY285c1g3aWFqU1pDZFg3OXBmQnc4QUhsL1RkN0ZJbXUwSGx3MytqNWhkVXppTk5lOFQ0cFRWemEwdW5RMEZsdXRGa3owTlU4elFwZFNBSkNHVERHbmlnbndOQTI5TElXcTdiL0lpZ292U0M4Qk8wcWxjUWoyNVNQaGwrbGpFc3NsZ3VGbkkxM3c4VkdwMW1aRTZPZ1hJRmxva01nMzJ0N0o4Y0pjUXpCSE1UaXRkWE9UY3d5WE81SVF6d05nb0FMbXNWUU02NGhQTzd3b1A0NG01QzJMdEFUNU1sOUpWZkF0UThBVmFKd203VkppbHVEbmhkZGFtbU1vaXlyR1k0YkI2NElENUpRejVNYXp6Nm5nejFibVc0TCtPYzlWdjE5N2VqQnNFY3FmRHg4MzVOZEk2QmpkbU1KK1V3NURKWjgxK1RoQUQ3TnlnSGxMVTVXRTJ6bnhPcGU3bVRaYVl5UWlnL3ZRNjNmTituelV5MldzQkNjUTUrMWp1dDhoSnVjc0Y2a1ZrQkZrSjVqWi8weS9mWTZwWkJUYmQzNjZzaXRaSHZkcHV0KzBsSzBROE5SYWtzd041Zmd1ZkQ5Sk41QldUUmFQSkNDVWpjeU84RnZOTG10UDAyWGhWM3FhVVd2V28xajF2cXBaQm1tSFkyQk1FSFIwU2F3Z2luMzJlcEJpbVppeW41aXpseTJBUUxTczFUbFYvUnhUbmlmT3hyVUtGcVpFRjVXWXZHcjFGWFlCb1VwNmV1aElaazkyVnhNU3JvQlMrZ253Zng5aGpIV3RJcUlXSTNLbkxWRUY1WXQ3SjhmblhxOXlOd0ZqdE0rN3NFcjg1K3lYTjhyWXBpSHp4YVZrNDVHUWxrKytzZkhYZktzRk9BUXplZ2hUQjZFM0R5dHZVQ3NxS0xZTGtweWRueEpqVitIUFhPQXRzWmFTRjVCRWtxcFNSbmxxZDRjanJuaGI3QWRLa1crYXpScGcwcVM5eHgxdU9BL0Z3bVE2ZjF1UFNHWXR2eWw5Q0ViSUdweHp4YVV2ZDY5MDdmT0Frek1QeTc5cmFwMkEwNWFobkMxU2FvT2FKWGY2Tm9hallsVyt6NFZQWmpwVXJKMEYycDlNV24zTVNpSS9VUW5GMjBJNjh0RXFoY2RqUDJldXZIVjVKWXNsdmRIUVprSEZEalpaVzY2aTFoUHQxL0RabjkrR1lHMStEcXM0OWFRSEZIZ2MzUW5mWjA0d3FMOTJGMWwwSkp6bFVtaGxtN3NvL1pTMkQzSmJYQ2t1TXVSeEZTSUxPNjlRRWJJdEUwUHN2MnFkeXVqOGNWaWplRmFJU2l1KzA1em10TDIwckhVL0xvNm5ZeWhoaWJhMjlqeEZ2dVlxZ2xzMkV2VzlBQkFWcUlYNTBqZGVGcDJUY0plakEzOVMrNloyQy9FNlQyaXN4cTNmNG1NUFV0c0ltNDJZblA4YlFKMlFSM1loWE9vSjJNMk4weUp0Z3pYcnc4SzBBNmxHV2RmUDdyeFF3SCtBSVBzUHdIakZQUld5eGY2ZnZCczV2djFoVmZmcmVNb2tqSUhmZFhGL0RMMUpwc29BNGdPcjN2T25uWS84a0prc2ZlRm5nTmFMYXY2aHpaT3F5WENMMU1tYWRIa0lEdU9LcHlPU3paZGRmRVZTajNHY2JjaENuVWxkek8zTWpKZ1VlVXNzc3ZlSzc5M1RyU2dLYTd2VmFFMmdDTTgxRlVUZDlYb2R1VVY1WEFiS1FOVkZLTmtJbzlNUDdaRGZldnZZdUV1RnhUTE1BaTdoN21zVmdjRFJVWld0NWdJYVZpWHNUNkpnL1IvMUM0ZG82UlI5eDJFMmlFeFBsaWxhK0hyQVFCK1FwZHNHVEZUeURjWE55TTFxU2l6TWltWmFJTUd2OGwwSVIyK21RQW5uZnlkWFdlRktLNEZpcmdtVjVJQU9sT1cxcXoyR3ZQSjFISFkxL2lpWnRMeFUzQ1lwem9VLzExTzAwL1prOTRCOE1vV1Rmd0VWakFXUkE2cVdQOHByYkQ0K3dFa3pvVXJTRWZ5K1A4L0tnYWU3L09LL3VmOVJVZVFjeFY5NklMdXIrTVRxVS9vbTJLNCtKcVJPeWtDdXZvTytWeTZGdDNYelJlVXdGamtJR0pwSXRJYmJTYWpjK3dVZm8rSVBjWnhzQUQzLzBFemlNK2IrWWxndEM4eEdIU1NLQ0hRUUVyQTUzVEdKQjl3clZWUE1RbnczVGhYN2JBNEp6UGV3NUJvMGJ4SHQwK3RUV2c1QkpjeFFJUTJhQTJWSW1ldUFJZWxTSFlTQ0ZqM05VY2hCd1gvTkJPYy9YY2wvdzhEQnR0QWQrTzVNY0ZRN1VCTGFmcVFXYzNQekhjNWNkZW5vN3NUQWFiKy91VlRmb25jUEVwYlRlR3lPWkdpN2lIbGwwUStXKzBoY0t2ZHVzQWwwdzMxeDhDVnJEZzQ1bVlzRzJFVUhuL1k1TWl0WW5hWWFPQkFhSlZPUEwxQ0JCNHFpMWpkeklrV0g5RFVoSkJ4L0ZyeFNwSWM5UXdBSmZCT0hYamhOd0FWKzlYbzJiMjJmZXhkeUpsa0duMS8xZ1lwR0oyZWhuRkxZMzREMk16dFNNSzJycVZ2dU1UOWV2N1JvOTZvcUZneWEyUHQrVTZ2M3NJbm5QSVM4dFBmUmE5N2NLZGtUUWl5Y0RIMkRBVUVnMzRROERZRzlrREJwWTVibGhyZEN3TGF2SmV4TDlsczJtcWdOZVJYTkQ4cURlWGt1NFpVemhOS1BCMHZ6SnhzNEhYRmdaalArRW1HL2NGUm5teDZFODExRStzdWpkQ09JcUxBNGJ3QnR5bk1lU09uRWRncElMQTVCT0ZLMjBoZEdWK2JyZkNhY1BwTXB5VkZyV0xZNlpGeGM4ckhvcEhPRVlBQ3hNY0xzeDFMTmVCU2RzTzUwVmlYMjNyZ2NlWUwyajhJN1Fna2NobmxKOTNTZ1dhNS9VbzhWTjBvSTlSeERUdmVFUTlURCthN1o1OVQ2NEl3NVZyQXpLNStJdWJHT3pENm5Cbnk3NWtBZS9YVy9WdVhWU2t6NERReW1vbk1ZQVRQL0VmbVNHdEgxR0ZwbE9KVkgzYkRkUkJhcTM5WGZpNVZQUnFLQzVTQ1ZTVHNKVXZPcEFvRWM1WFBuQnpCY1lIM1FDd1dhdXU4a1ZHQzNlZys0eDYyVVJ5c1hKRnFRajEvS1Y2dWgxdlFiVExLVnNXVzJCY0dWSVM1WVY4Vy90eHlWTmhnV3NkZTNpdWlJeDBWOFVOU3crV0lmK2ZhYUxlcElRQlBzQmtMakJGaTJoNXFDanBBNHU4bFFheUNYTXJiR2dwUkExSE5adEVYZk95R0dSM3Rrb2FCZll3bEM0V21xdEJSQklpcDBTdXhTZDZHUTJQUmw5WXBuU1ROMVNYSDRVYS9vcDRPQ3UvSyttaERQczNCdzVMQ1VkL0I0VU5meWkwMVBCUEQ5K2VNTEIxNU9ZSVBRdy9jbHBzcGRLcEdRNUtUZFZvNzJHNEVTdzBDK2VDNlFHdlVBRis5UCs1TmlKYnJVMloxK1NMSWJpb2VIZE1DT0Z6R3dFL1dMZVFOc010RE5uREhLanBseGFZcHQ3L2wyM2ZEMzJZY0dTVVJwa1EyZGFkeWRxdnJ5VkppMWFQSG1rWWhlUWl4bnZ3VHQ2REdHUUg3emdHVjVUak9rRlZQUzFwTyt0QUd1RUV2WllERFZ6SThpSFA5TjNxVmRyemY2Zm9nTVhyL1BPMllhMlNyUzBwVVZqMkpTK08yNS9pV0NIOGVwTUhwRVI5Q3kvbHN0M2FqOHh0UUhSc2JQZEs5TmdBbk52TUtqdzFRNkRuaEdQVXVSWDkwbjViVmh1SDE5elFGSGhBNjl2cjFDRnJiN1ZCenp1ZDBNMXBDRGtONThYZEpXSUhiN205ckVtaWVUK0JVWVJxNWdnSkR3N1ZWWUI1U1pOL2pNZHEwUUZza0J0Z2lpZVNkUGxrT3NGRHQzdUhOV3NKdXNrSFM5bkQxZWZJNURJZ29BMnVFTGZKRmtpMFIvczhURitNZFRveUo1dkdFQ3VrNzYrOTdvN2FkOWdjeVJYNTF6MGR4RUVwMzhFYzJvRVhYYS9wQ1BPQ0xwNFZTVncwdUEvTXd3N0E0ZjR0aVFYRGhaTC9iZnFIVjdRT0JsK3RzV1RHOE1aODRtSWdsRGg2K2kzOGxwcVljNFd4bzZUanZkUnlnY3hhVzBOVklzL0RzRENSQTROenUrUVVYK3g4N1hUb2ZXZlcxSncyckE3OFRaaFZIMUh5NDdYQyt4OUdYK2VRTlRpRXZkS0lORUhCVU9tcDFNUVhqWjZCR2J5SUhaVjc0cFloSGFzb1NwU2Q2N1JUdmkxNHBaTGNvYSsrYnZacjFvdzZwZ2kyWmM1UmxvbHdFMTNJdE1PWVBudk8yNTN5dGQrS1ZuOVBDb0h3STRHY3hqNHJGVUV3MVZ6WDNYVkJtK29GLytBOWc5N0p2Q3k5WVNXQmFueGkwMHFPY3lsaGpDT1ZyMkJTZkZmQUdXVVJNcEVSTkFINWVMQXMvVGRJM3ZCOWdQSGJDbHFHTmF5ZlY1TVRqMlh2RU5KbzY3ZVJ3cEVGdWJZUHlPdTZDMEtTaC9qYXV3SEJkYkg3ay9DMWFoODg5aEdJcnkvbjRFRkdNZXA5ZmYzRmdZV2loUFFvWkV1UjROeXk5L3JzL0hMNi8xeFNJOUpZdFd0NnZNN3NIV2xNN2xsYTRTTzJIN3FqSTRBZkdFL3NONTZrNC9LZmkrWVNXbXpvUERrQ0huZzRoZ2dUR3JoUDQ3V1RiVVFIdnQwTzJTNVg2WGN3UXJJU1l0UlVrZXZwSTJjTFhoUDRLekc3aDQrT3Bab2x1OHZqa1Qvd3JtTEk2ZDA0ZXkrbjlZWEhaZTUreDB2UmFFYTNoY0lWZ1dZTFVnVkRRMHRVMVRvUVdJOC93dnlrbFpWcE81anBlSk9XSUpUN040T3AvREJWdlJUandvV2szU1VRaDA5RG1SdTRoeGlSQncwRU9JNXJJdUE4ODlMM3BYZ09FaTFiblJOWlVBcFJJN2g3Qm8zYWVPODhYZDM5TDNMREtJclc0b0V2aU00d3ZvM1d6R1p6UlBXYXdnQlFhNGFTSlJHeEZyRENuOFhsUjZFQk9zcC8wNFpsVnBKTC9nYThaNGJrNTF6ZStCbWJKUTNWMVR5WHVKUGZwTTFQZkw1aFpqc01MU3UvVmlkU1E4VW5nTUhtQ2R6Z21HYnJPaUVZcnd4NjZCUEZVUHF4VmFIWkNRVFR3UVZDNnNldE9udjcrY0MwTUswdGFNUGxuZEFMZXRSU2VzV2UxQVRVNWJrbmw2S3FFUWc0eGt0Qk5BYTdZNDloTUExSzZ0QjVkWWIvS0hPdHJoOVJHcFFWOFFRWlVFbzY4b3h5YTk3WjNNWWtUQTd6Sm0zbmNkTXhzazNrV2FJUXJOdURoOWFUcnppZzJEb3ZKZUt0RTBwUWtOSTdFZVBBQ09xWWZqbDhVYWF5Rks2LzFZSG15MDhiU0MxSUFMclp0Q2g2L0VrUktiMndScWtIOTlSL0toUUtlSzRGZzFkWlYwb3dmOUZYU3BzTVY1b1pQUnBhbVFzbWwzOHNSZmlCTGc0WTFCQy9sREh2ekFSdmxMRStuSkt3eUZPRDdpcHhKaG03SGRrald4eXlwSnV4d1hPdWFlK2VaR200NWV3SGc0TFI1M043ZGdmbUUyWUJXQ3hielRTSE1YKzVkWW16Y1hMVTZIVUkyaDY4SGlvNmhUMy8xZVN6b2JIYzZZU0ZYRk05SEtKTmtra0ltM3IrVGdLckVHSlB0bjZ6NDhSckF0bmFId3lEOTR3alNKK3RBQTZHa29hWXFZaFY5WTZDNno4YzEzNDdRZkYxZkZBQmU4WjNCaHJwak5wYmlPQmRrb1A4UjVmS2RGcDNJSzBTUzNEU2JnTDIwYVpya1doS1dVYnZramRHUTNvL0RTelZuM0lBd0NNY2xjenFrRmVEejd4SzZGOGk2V0tETVhhSW12VUwxcUZzdkN5RW5PVFJHNHRPdjJRWlZyMDZYL09SUEZqUWdkV25oVnI5SkRldVVMS2tYc1JVaHZTK2xpeTBMYURxR3A0Wjk0WnZtOGtreFpQWnB0MTlEK2I5c3ArazBLenUzaVJyUDBvMnZnNDQzeWw4NytEbTM1QzF2MTNhakhaUjhFRXkrLzArSkRoQWpFdVdMbW03ZFhQQWgrcDJmd2FHaTF0NmhEeFp2TTJ1WFVieG0ydzVUUjY3VTdGSitmUFZHYTRleFhsenhQRDdsc0RHc01WczFuMFhsV1RpTi9sRUJLdlpUSHJmMCtzU05uN3F1SUZJeXRXZVFaRERQQWlKK0ZWTi9ySmFUSnRRQ0o2VlJvOXg3YmhlekRKMWNQT1MzZVlnRnJmcWttTjBhVUQwNHFRZUtNelptT24wdmNTY0tNYVM2Q3ZlQm50OHI5MTFQWkMxTEpZOW54emNONUg1eWhPSGI0eXRYQ1dndE1hbUFvd0huK1UvOEtqMVBOSHBjWjh3QVZEMnJnRlM4bWZVUmduRStQcjMvaE5Rd0hPVm91cG5qRmlPSGVCWjVWd2pjSmFnYkkwRU4rUVM4QUx4VWpESS9EMC9GMW9ENWF6WmNVN25CdTNORU9DeTFQZkl2UUpyK2NzTnlsN05lVW1CRUtaVHJQYUJZU28rK21taEdUYjZxdVhUV1pUdC9paEh1bEEyVFd0ZmxYRDZBR1NmaVpIekgxdUFMMTBTV2FJajdxS0pQSUdVQkRWM084dTV2aEtUQkl5Z3V5V0hLdEkwSFZHTHp2cXNiZ2FIdlZqdWdFRHdUdWRPNTBmN05GTWJqN0FTZkVUSGNicTNuY1V6UFpvWTZEdjA0ZklnNmhmcnFreUxxS0hWbE9DS3cyeGlRZDcvWGhqNTVBTkFzOWQ2NE5wblV1K2Z0a1pXVEYxWVhMUlVVcHdIMkZMUkxWZW1BMWYyZlRFWUdrVTRySnkvbmtxaVg3cnp2NmJnV0pUaDg2dHAyL3hCZ3ZvYS9mM2c0UWdlbmQ3R0RDVVBNYmQwcmRnT1NqZzlQb2hNNEYrT2RxamdST3lSNjZydkMrazlZbkV3YVFZeWVJU01DczZVYkdZR0VQMWE1RlF3cmhTWGQwdk4xejlvWTkrZ24vSDlwVzMzZDd4NEl2Mk5ZbThCdHhxWTd4anRjRHZTUGJLMlFHSjBnRmlqZzVYanE3TDltbEoyZGtqTTdmMGVFaVQ1L3RILzNlaWN6MXlzb0hTc1NuRCs1dWN5WHdPYmp6c1RIeE5zWXB6WXNBbXZlVVV4WVNKaWJtRjNjZ3RrV3drMUtzT0VRZllhc1RMMlNpT2pWNnhvWTBvcDRXOW1zYy9HOERWaWZ2SHAwN0dEWElDMWFVOWMwRjRPR2NLZlFvLzQ3MEs5T2ZmWWdQK2Zhb3lTK2s2ZjJERDUyQUxURUQzNTBlajZsTHQ2NGpkdmtOaENsUWtoZ0JZK2F6U1pQa1RlNXozYXplK2IxcVhaUmRUaXEveWFPTEl1N1JpWk5zUGlYUVlzalpHTWJnSUFOZ1FuVjZpOExHQmc0TTIzQm1DbkN2S0ozeHpycUxhV3BmVERYaFJuL1RLSlR1ZlBMWmc5OVIzZnBGSmtPN2kyZzZXS1BWd0RkOU5YWktSVkNLblU0ZzVPeVBodzByWGdqUVdLOUNCcUVvMEtxYmlhdUYrNktHWXVuTUdTTUNHWng2a2Z5L3B5eW02aUFQZjJtZXBGYXlZZXdBNHVnZGNGaDlzZktMVk05UUFYRHBrc3lmdzQzM3orWGExWFpoRnNOV3F2Zk1NcGh6NnFlR3FYUWpPZ3BpM0NIQ3lUZkh6eHRzaDNnSkVGZXN5T1dNWWNkdHVoM1R6YkxlQ0RRNThncFpXZWFTS1h2eDZsTENzUjJqNFAxRjl0ZVBDc0M2N1lqdEtRQnNhRGZ3U0pSUExPN1pNTnNmRzFlbHdjUVJXKzgrMW0rM2Q1Qy80OUJDWGhtQi9vaGYzUmFrY0FRVnVkSG9jTWpEUitPTHhkeDlJbU9tUVRMTHhNWkRwVkxabG9OakhBdnIycTFIZHNkVGFBbzZ3NHZhUDFveDFXRVpSWW8vci9YRWkzSWNIVEpGVXdQcCtLby9WdHhHczN5ZnpDWGduRm0yUE1DZHpvUWVtcUtMSmVWbnRqZWhRM2VFT2xtM0EyYU1kbjluZXVEVmVPb283UEJTQXlWakVHZWpQdWY0WVNGckx3dVhubEVDU04walVqeDBRT24ya3Z4dXFzZWVmV0Z2UHQ1VGNBMGZMVjluL3ZvZmxwQWpBUk1yOGxTdWZrT0RPT3BJcWZaUmhtUFY5YTcwYUxEQlFneHhHai9mMDBTSXNnUjJLWjM1ZUZJNDVFOHc4K0tBOHh4cGE1ODZpM25VZGJ5c2c3eThFZENlUW9sZVo2QnFDV05TYzRFY0h2QVIxUks5eGxRYjRBM3dxZW50cEVDVUE4UTBycHRPY3NMU1d1V29jUHZFRlJmR0ZDWFMvaFczRXV6dktQanFnUlZhMDVxby90VVdmczJwa2FsM085SnpiWmx0TmI0WXFUNHg0RHBSUmZRcnJXYlI1Z0VsWDBxd2huZUl6TTFPTVplT3VBKzBOc3ZNYUFYNmJacUdzU2xBNHpQSWh5R2FvQS9PYk9UUmNaV0JzOU5JQlNCbWlFTHRBNWhIS2ZDZVdJYlo2bWxIRUswN1BCUGhxd3R0VTVmWXNmUUtmYWNmQ3d6NXFzZC9PUWV4U1pkVXZRWWJ6S2VkZmhNUTJPNEtNSk80aVJ6M2IrbFo4ZzlzK2dpb2VJMEdNWWtKQjJ5Q3QydnBlRkJrbEpuY3h3STJ4bkc0VHFCNGltMEo4YS90SGxMQ2xWYkdyTGdKWkg2aDhpSFV3R0V0cFJ5VlhyUWo3MTlKUWZvRFl3Y1YzWjFMRUZrKzhkakJWa2lqSFNQUHlQVTcxUHRKVHQ2RFlJZDA5UGdoeGZURjkrMVpqelVOTEU4aHNwU3duaGN6YXZSUHFaQkJZSk02ZHVpMytaaCtYc2RjY0pBTy9iVE1pOVZ4TkNLc1dVVWQrSmZ0ZTJmV00vbDFRR1h3ajRyQWRjSmIwb0V5TmpaN2YxN2paN3B2bTg2cDlZVnNZL01EVlFPZHBSOVFLZWFVSUFuQW1EaFQ1cm9tVnBqWDZWbmt3S0NOVFdFQlZIaGxLSHptZXhUbXY5dmZXaE9sQ3FWVmRQTTFZVjRVVlJ0RW1tZ3BvVU9seDFxWGpYQUNjTDR1SURLV3pScmtVcFJDMkZtUW9FWW91YUpyeFhURHZ0bWNZTmVralZkTTA5N09UclIxWlZTVXlady9aRkhXeDgxR2xuN090SlN0NVFPN2NvZzREeE5FRksyMm5oYldZWlRvcjh4dTJycmk4aExpMGtuZmJRMkI2ZFdLWndpQlZ2VWhNZ1dCakRzQUw4STZNOVpGbmw4Y1BZMk52dnMvUVphUWlZN3N6NTNlM1dod2xVblR0Z2JaZ01LZEVCeUtsUUVGYjZFM1JZQVhlb3BCU2wwNG9oMW9yOVB6QjJCR1RsekUvdUY2ZktndGlzeVY4WERobFRQUk14bEwwVmZhTlNreW1JYVcrK3hzME94Ym1mci9jTExCaEw1OEo3Q0hhcTdIa0V4cnNEN0swRVBHL2JGc0prYVA1ejArS0ZZeE1KbzY2eC80WVJNeStRWjBJWkxjTlpwc2gvNEgzRlIyWW4wWjJ6a2ZXcVYrcHl4ZnRlOURHaHBGSXBGL2lGOTV1TW1kNFk2c1Vlc3cvcU5zcjl6TmZQYTBicXNMRWZnSlJ1ZUUwd3ZOYkVDMzlUbUpvM1NhczhmWEhwVzZudjBVS25sSnFSOS9aNWNRbXp6ditzWFlNVnpxRzVXeWJRQkdzcmdzVjlhbXBsQVFFSmtORGFlWlVyMnN4cmxKc00renJZeUUwMVdZL0ppZjJUa1hyTmN5THYra3c0SGlGNEt1REpBd2gvQlp1cnNZeVVPZnlMM2xrMDg3cFIzVFJZN045MHBoa1VGdnBWVFVkVlN5ekZUcFVDUUM1TU5TZWpMQ09qMW42NkVyOEF4YUJJWWdLNjlPZ1FxVC84ZVo0NWJkS3dCcm9sRXNzaUZNWktscGVxV0VkSk82T2RxUzd6ZTNqSndxZmYraHFwQ0E0MTV6ZnZ4cmpMdUR2aVcveVIzV3FnZXUvVU94U0hZWmY4dXBodTJwUE1wZWRkK3p3bVdpMlB6V201MndON0FubXZldHFoZEdIMFp1MlQ5clY0ZXIzTkZqMG5qQXBOVElxZnpveG03dkFDcURNa2FwcExYblpsdUltMURkK3hTRVNZU0N3YzFHalhLNHB4UDgyaUt6cFYrb3V1dlZJSXpvWjZRbmhhb3VTRkFIMlVHNzZYUkhLM0JsMytLV0RLMmNUTHR5WnFIQXZxaWtDVzJOUDhPMkF6L1MrSlE4NE95L0pjVXk1UG9OK0o1NmpMS1gzaVJtVjhiT3BZNHZKN0lPbitBWkcvNjNTV3puazU2KzBmNkpEeHJDT2thUlNVck1GT2hleVJaR1Y5STlZaXZ4d2xma0d1ek9yZW9YUUhiNDROMWFNNWVBNjNsK1RqQWxWNUcvdGRFTHhlMWdobDhPMzRWTnE1bmdJTHQ5ekJWVHJMSFBjL1pZSWJlcEFmaWdjamFFRllDcmdBNDlpOUlDZHFGUFg1dCt2S0lWbHBDTUpBUkl6K0NwcFlLWG9KOWovOFhFVXAzKzNWVG5Na0E3S25IcW94MjdCbEptNlVhbStFYm00aTRDQWpqMlZTRE1kV3lxa0p3dTlURDRUUDU5VzR0L1ZUZFJjVWltSEtzbnE4TmEvZ0FkejVmWHNoYUx3dUxJSTdZOTZHMWdwWnBMU2FFdTZrZTFBTGxEM1ZOMjlPNUV5MWxSOWswR2ZlZWtkWWtXd1BULzRoanJtSjN4Ri9pNlR4d2RoSkJaUDRYaUhBelBOMEZ3Mm4vR2dtTTd6cjJCTVZQNVVKcTJHSlptZUExUmlXZi9wektUdCtPOVpZNnRwNmg2TU04Z05SZ3hRZGFKaGtKTmZYNHV0MUc1dlVJVFV4OTNkSzZ5M0FZcSs0bkJwV01tVHlxQldGSUlxQzd6dEF1OW54OEJ4US9hVyszTVFIR2RyR3QyRUNsOW5BZ1ZVWVRrSXdXWGxEQXR5ZVpweFcrTkwyOEtBNWpTY3JLbUdBRUZ4UXRqdGViUVZwQmlQcVcwYitOaFBGdUZJdzJZQkFsWEdXZFNJN3ZVOFZySWw0MUo3eUU5bFNTK2dDaS9GMHFQaWVXK29jSngrUGtGWE0vT3JCOTFOQUE5YmpqNjBlcHBweVRRRzQya2FJTlViL1lsZmptdSt2TC94RVdtSXlRWTFKdHlzZkUwdnAyV285WEl0eWFBZDhKZkNpS1JOOFlFRWdxUlhEblNhMmJ5YXF6Nlk2SlNDc2luRHdwMVJYbGFnekpoOTY5ZFNYb3h1aCszNXlvTlpQeEdodFp3Q2Mzd3dWZE43MXYra0pCL0twYm1BUTZxOHBqVXQwOUUremhWWU9OZWZwNnl5aUdXUzVJVTc1WStvT00wUWM5SCtNc1EwaEFVNTVaOUs0VUdRTzd6NDJyUjJpemYrZFFkb2JDc3FjRWhhcXZwemprNG1HQ1ZrN3daM3UyM3RrUXFhTzlVY042WSs1N3Y0ME1wZDliTk50N0JNMDNkM2ZtWTJCSTRCdTM0SDkxcWxlQi9aeVVIVWxoRWpubU9SZFVtaWpvNmh1a3JsY0djUWNDN1FzLzllcmVRZzNtWSs2YXpzcU15aXcrTTJJL200aHBGMU55R1Y2VGM1dUlwVkcvczN6OFNxSWJseGVKclNjOTI0NkhUcGFPMEVFRGdRSnFPZFpEUmt2VUZnVTgwdzVRdVRCSWFGeW1SNS8vZUVCSkIvME82MHJmcXBCclZLSHlYY3VGWk8ydXFTMnYrTHFOYThaZ2ZxYnRWOWJ1SlJXSnlrTzczWGFYbHU3L1Byek14V0d5bE5PR3YxN2RleUc0dUwrbG53M3NNazZPS0JYR3VUY2hCcWFIL2NIcXE1NkZaY3hheVJDVjJQOEl6cVJUUGtuTSttYXBmTTRsU1lsRUlRMk5pNmYwQisrQkY0bzhlQnB4VXExSXZaaXRJclZMZnZNaVdIL3R1dVBoRlFlOFNIYlM4c2hlMmQ2cTFXRUtpYk9MSllzUjE2eTR0eVNJQUNNQmJJRU5Yb0t4R1lFWnpIZEtOeVFUS1BrdHJqRE05Yk9vWUw4RVlOYUdiMzFocEtZc1FzQ2pUY2crbThRVEpueWJsUG9rT05Wc3hzcEpNMDZJZ3VZcHJQbDhYdWdScW9SREdGeE4rSGJiODN1YmtIYmNVWjhuRmtTNUpvcDBYY1BqRDFJaTB2VDUrakI3Q2pIQTBOc0NxL0pyN0ZrNlRaTUhreUY3N3dxVS9BOFlkbjBHTFcxWWc4WUVPUEFFdGR5a0xpSWJKQjZ0UGVlVVZrU3dTQ3N3QnZTY0dkYk1tSW1lbnE1MHE2M3BkK2ZTc2lidlgyd1ZKUU1neDhSYUZpYWoxcGlHYUxDS0Yyb3BiR2FTbmkzQnlVaFlnNncyV0U1cWZVaUJ6OHpBeXlMTjJJbWs4L2xZZzNWK1JxY2YxL0p1UHZWL0tsd2g1a0JBbUxUWjBycFVEZExKNlNDS3JvTEJOQ2VmQzJXdW9CSCtFSDVhOEExREdxZERsaDZEdG01dHhTQkZvUkNCdElLRUJIY29zN3lWNzVoSEE1dzBpUXIrNFdiejl4NHhwQkZQNFlmWERvV2FRQTdrQk1oaWtFckxCVVR5UTFlTVZNQzVJNnV0aWNPUHVYVW0waWlJUzJRaVU0WGlSVXFxRmJaR1JybU1iWnBXSDhXQWQyZldmdWVWRDRzcWxkMFRoa096SWtoc3QreS83S1owaWVzWkJrN0ZhNVA2dk5jSnkydDVpK2N3cXlKUXpVYTMzRUlnMEVzSDRQRXIycVdqNHk1MTRWRlVqQnlJSVpWZWc0SE9qS1N0VUNsWlhmakppZTFDSUZPN0ljbDFEcWcrNEhjT3BZbDdMSUt0OGtuazJLeHM5ZFdReDJSS0lpWTlxQlpkN3BoQklrNnBGb3VoekZBeXpPbkZsSEErblR4ZElKeUZlZW5ETDgvVmtjS1JhWlgvQnpMMDI2eU94dStEdHJmVjQ1bG1zTG9ob3VHS0tia3FyYXRDWmk4NlpFa3BpYkQ5TVU3Znh5Nk9ucllxVlVxTDg0dkVQM1FXU1ArSUtRbjc4alcvRzJjNTduTnFUVVZ3WHNWY3YzcXYvWitKY1dHTmE4SW93K3Vpc1BTSEdDTGI4cGQ4ZDlFa2VzLzJqanJqYlA0WmVnc0RLazU0SE95QzhvaDBpdG42L2xpKys3WmNkOVpVRGpxZ0dwUGVDRnNlT3c0cjV6SVFMbWxqSndpenVpQmpuK0RnVTVwYjBOYWdPSDFVdW1pL3dKbWJqZjVzaFM4OTluUkNsOFF2OUhjZjNWbEJJSHFNVUo0OHFGcVBDcW1leGkwQWdJTVFEeWlFSGN2ajZWUWJqRG0zeUJ6dU9nV0hUZUhLQVdTSVo4ZTFPdkNIdmRhVnpPbFBIR2dnNE5KTGVKRjY0MkNtL3p5RWVwZ2VERVIyeDZRQXQ0WWZOdTh5djF4bjdVcDBSczZBaitnRXJHeFVldy9scy9EaGpmWExqcTVJOHZ0cXo0UTdWbW5VVVJaOVU5cElPWnZNMW5DQ3luaC9MdU9nNVlMTldabVBtajZvSEpUZVpiZjhyN01OWVJyMzJYY3JFUHFUNjVOMlVBVnZkRFRwSjBySGV2b1hqYVozcWgweXhMTVB3MG54RVFqV2dvS1Fla0pzdDI0TFRpZzg3TGFDZHEyUzVadzFqQmxnOHgzcDFOVld3V0lLa01mbEFvQ3Vib3hEdHdSWENkaThwNUc4SURKTzRObTJxc3RnUGZjMG52T3plNlNCakZRUllxMGpuaTR5TVlNMmJOaHgvT0FOY0FZYmplWkxVek1QQk9Pby9NdkNjN0JuTUVDZ0FXbjR0SVJGdEY4MHVncENvdDl6b3BVSVpCU2VPNWFvalBrMnJDd0JLdW01cWZFZFhNekI5TU5zTUU1MWJDS0x6U3lEWjVpRHIzTGxTc3hUenAzZWNZcW4venNzUlBGVnBsYmVDU05YR29CZGRvOCszVUxJQS85Mm9Mdm4vbEhUdk5uYzlaaTVrM1JMWmo2empGUG9jNkdLZkxWRHo4VFJyY3JDUWM0SWQxRThyOUVxTzRMaWRwdEg4L29ubnQ3L0JzM3pIZ2lyMGptNkZWUkMzWTVFcFhqYUF4YkhkUlFuYTZrVTJpTmVTNWd5U0Y3QXF0OENjU1dNanRqL0xmSk1QTHBCZ2FoSGRIUmw0c1Q0L2JMK2w5YTlGUmxEc0pnS3VIeVZ2b1VldUEyaWQ3bmt1STBCT1JwTStlN1IybExLUnU2ZEkxTnFLT3FVUUZYQmFsb2NkRHBNOXhaaVB0eVBJd0RZa2E4M01FcFNsajhLWDllS2llMmlWMHBUd2RGNVhOT04xWVVJc091dkIydEN3UVNtengwUFFuMGlQSG04UjJKSHd0KzYxL1U2dUQxRktucXhxdGttN3g1ajAxZkJibTIwUTZCSFQxZC9LMWl3dWR5N1JBd1NENHIzd1BDR0FCZW8rTnQ1dGRLcis5cGEyVk5GZmZLV0lidGZhRnJtQzNGVDZMb05DSzJDbFFLbmlYRzZTMUFDUUh4dWlza3RhSUcycEIzUjhkZWVNL09mM01GYlpDeHAxa2p5Zzd1Zm9PUnh1ZEJIS3krNlZQc1VsQzljdE5mdEJEaFJnOEQ1TTVKS0tHWXFURjJRVFhDZ3FBY3AxTTM1ZXdKaFIxanNTWXBPQjk5ZjZwa1A5TUs0K1pKSEp1T3NZNW5PUTBQVi9DVkFORFR6Yy9vZk11ajVIQllOVk5aOXRPL0txRCtwNXMzL01nOUJnTEJQTVlGNWNxTkVSMFpxOUlSbE5QTUk3bUNLcXowWFMySWlNVjBsY3JCVlpyWnhqZXhSSEtZQmxxOUZYeGh2b1J3TnN2UXJJV0FuV1I3akQzQTZBSklOY1BIM05FY2NEQTY3SnVnY2ZCM2tYdGU2aDFsc3lON2ROKzVCRGZhbVNuMVBJM0FWeFc2c0JnVWdJNG0xb2hRNFVrV1ArSUJURWh6NXR4WS9jeFZjVW84WVErT05welQyUzk3VDgwYUZvWnpqV2pDL2Vld3NxbzExMkE2K1l2QldYdGc4UnVTUEZ4SUNXa2ZmMXFTeFArb2FnWEVpWTVreDJBWDlENVAzMGpRMHNocGJKc2xyNUIrRkRPQmJxcm9JdTY3MTQ0WkpZdXpaN1dveE53Vi95UGRsaWJ4ejZHTzNkektVVnVDTDVCbFVJUmoyQ0RmNzZyUWNkOUVsWUtvWmJmOVJ6UWg3bC9KM1hDRVNWaE1iMW83V1BTakNKYzVNbldzdlhTbGNuZ0VCakZ3MFAzbVNsNnNHYnFWcmFnWHczOXVtbkxOblYzTWU1UG1GOW8wWWNsL0VTSjFucHdHM3Vka20zcHl6d3BjNFkwaWZva2NBc0xGTTdrUXppRTFNNHVNMFhjSTVheTVCekorUDRRRGJlOUMrTm5vTVZiZldFc2tDaUJnNlpUdi9aWHBIeElMZElZMjdSV080T0xYWU1lWXB1Nmt4RGJ3dEZiWUNJRWJlUFgvTkZpV0o1VmJKbTlRa24zY0tKRUpqb0RmNEcwaUE5YlNPcWdTaEl1WUgrZzhDSnRReGRtUGJnaEdmOUJIeVRDTWUwa2d3T1JVMy9JYVJDZGRPMlFocDNMV2RFT2VWY05tdzFZOXhQOFZlUGVMK1RXSS9zL1JmN3hrTW8yNjJYWVNGUFJkQmU0UlNFLzZiUStXV24vcnU1K2t6Q21hNjR3VlJhSEYxN1FCelJocEMwK3dnRmZLcFZHaXBWMTFoQmRSZ2xMdnBFdnlMOVBvN0tuRDlWaUdxSk9sdWh5enhDNkgxeEhDYVlWbzMzNFhyRnlXQzNXcnJYdVQ5OHZTUGNiNjhrM1l3SnB1YTlLODg2bDhiN2JPcEpuM3N5aWE4VnVwQldycXZDa2NrcDcvYVRlUVhQK1lNQjNWbFdmTEVRV2EyekIwZFdVUVRydDlCODZucjE0ZStEcUI2bEJmL2FFeExhTmZlQVlYaE9UWk9QWGlXYzdvVW5Rck14RTR0Y28xa3AwNW8wemI1SUdJK2w3SG1xbTYwNFZpYkJSL2dva094NWt0dkZPMG5PUXYxMXI3MGxyS3prOXVxUlFRSDBGLzI1NEZyVUxRUWpXbHBVa3RjaEdGbkZsVmtONVZsQ0pDMzJFSEUyOXBjQVc0T01ncHZoWHlKQ1BRYm9XL1B0ZUNYNmpIT09mOUIxL1M0M202d1ZZUGFlNzM2QUlxS1dCbU13blBSaUhrOG5Ed1NvV0krVDVMaHN2TkRCRnJpTkJOUFJISVRmQm5QZ2ozMXRrSVNTTldWOGFjN3A0V2R2VmxlYVU5Nm5zN1dXVHNoSktjYWZpakZMcEt2TURuSjM0UE9qWDR3NEhwV0tCZDJvdWxkL2J1Z001dFVxaE03djRmdVJtbzBVcjRyNEc0eUVKQkV4bmNHTDU0VGlJQTJxOFRUbEI2dEMyM2RjZUtramp4RmdZdjNKcE1lTUdRUHV3NzE2T1NxNVFYZG1HUWxuU0pqVXhGVks3ZzFyLzFEbjMxTG5pVkZHMEhBTEgrL0tQU1NiSWRtenY3Wktvb29SK0xtSGRSRGlBdzNFc3RNdXd4VVpnSDlRRnF5bW5oelFsRVM0L00zT3JGanVvd2hrRXdqVENvd0NvY1ZEa0FCQit6MjVqSUdROUpQZkZoTEkwNmhLQWNvMFc3MUZLRlZDaS9pOGpnRDU0aE04a2tycTg3L0trRzJCQUNjb01CUEpHSngwL3c2ell2eS9MeE9MNHJlOFl3N2Y5YmhvUk5YR3kyMnM2QXZEZUMxZTJ6SDczb05XMUQzUTdaODJWVlFwWjdHM2pLQWRjL1ByVVFGNmtVYVB2Sm9RejBoWmRNTDU3aWxtVWordmN4UUkwOHZFblZ3U3B5Wjl5SjBFTkhwMWN3SmFxN2hCRTJRN0NIQVlqQkd0b3dkVFd4dEl5N0RjTlMzVFNJdnBLc1JGV2NtYnovOUdLQ1pWY3NMTGNEUXM3WEp1Y2V5bnR4WW95YUNIN0IrYS8yVjB1RlAzTm9lQ2RVNFFsWDFmYmZ2SDVyRlJiV0k2STFGRERDNWFjalFIUURmUnV4VnF1WFlIN2dWUWpVVVBITUxRYVUrUVplSjBXcHAzOERtV3JscXVOQ1NoT05YTEl4bjRIRjNXTTA2NWJoMkpQTFoxbC9oMzg1T1A2MXRwb1FRd0tFOHltZW5mVE9YMWtJM1Y4d2xEZVMzU21sTWoxaXNQblowaldZS3F3Tnh5bGYxdUFUcmZtUjl0L3hUaVNNdlRSUWhQcnZkY01zYVFGQkdKbmJ6eHdYcFVibnQ3WUNrWVNXWkczM0R2SEs1WExIOVNhYW50NlJacTc0c2owN2xER1grb2ZuVEpJMTZNalVxbjhNSVFmRXNMTEs4YmF6RTBvZTA0WnVITHVDcDFzempTaTZHWEZpTStRTGNMWnZhTkc3eit4VHBOM21sOGIxOHRwZ0c5aVphT1pBeEF4UFRuVHpHbzc5aVNhMjkxdHFyaEd3c2tBNGt5cGUvOG1kdUNHS2JwdGhYR2dSOUpuS0tpeDVCWDNZU2FsdEFhWW1Kc04yMmFOVDFBOEVZL1YzeFp2MXVNc2cyN2RJa0NJb25rTEg2K0JYSEtPYVMvU2JZZW9rUG1va2JHZythcXBHcnBSaDN1R1dUREJ6ejBJOTR3NHovV1RiN1RMN3ZpZXVpVER3YjZwbEUzRVBvc0lMZ3ZmNXJSd09senNycXJRa0F4UW9lbDdzbmJKWnl6NjR3dW0zZXZmS0xEc3VnTWpjV01NOTIySGZ2d0VKOGRTZTZTVnArRlphZjhDSHZTYzNTUTFacGlEN2kyUHJjVFNjZUwxYTdpaVZvUmJ5YVNnMUFoV2lqaG1sYkNONzJRYnB2b3BLdERzUUZZWW56V1psR3dPckQ4WVZCekNtcHNuYjBHVjE5NzBTTHR5aXpCdUo0Y09yYjJRdWw5WTMvS0RFL1B4OWk0ZW1vbmZZTGtDMEF5YlZxT3dROS9KL2ZFQTBjTmZLQ2xiSFVOTTRNdktmalBpcWxMTERIOE1wcm9nMGY5WTV4dndsVHlUR2liZ1BLSUt4TlkvcFd2bC9wUXp4VlpYMjFEalNwd2RtaU1TaEt0bWFHVm1IdUxGVndRcGFzcDQveWd6OUhrUUMxZGNsTVdlUU13Y0FwU2Y5c3JXRUdPMzgzMmczb1c1bHNnVUhvaFlzMUpsSjJRYmJZWkpuRnV5K3Q2WTU4djNEbDNNRU9CazVkSmplSjdZYlRNVTZXcjQ1a0hIS3lSSnRQZ1VWUk8xRkwyREdTR2kvSkRXTUYyMERWNlYrY2pQWTVsMVErZStHRjh4dUorbVRGMEVKaTJCYit2Z1UwdEtmaGFaMHNZQmFaR1NFMS8ySEl1YnJEVE9ZeDN4TEwvUVdKNVhjdUY3VGtud2UwVE4zV3BRK2h3cXpvZUlFNCs0aUd4WWMxK2tXYWlCTzE5VEF5WkUxV28yRm1OMHZ0NFJhUTh4bWYvT01mZ1c2SGowZmNLa1RWQUgvWWo5WGdMM3RRcHlFUXg5OU81TVI4WHM4KzB5UDF5Yko3TStxalBRbElpRUh2V3BQaHBYRG44TDlvQXlrZ1ZCMkNOUU1taSsycUY3UUgwUzVRRWZLT2t6MWorM1FkeFVLc01MN0F0WjVtdzNnRnpMVWVPQ0J2TEhEWUd1UGhuc1FnTlhoZmJhcTF4Q3RScWNjSlE4aURsN2ZqWjYyaFlpVVg2bXB5VWdndCtNUXF0K2tYNk1BQTE5SnhBNVBRQjcxeG1DMEpRMTFRZGV3ODRzSlROTUZtcnJhZnJwaTlQU0pnYjgxU3Y0WVZQSU5JRkNaYXY2elo5TU1lUXgrUi9QdkNpVHoyeVZLZmpoYjRvOUxFSEJvZ2RaSlkyenp4VTV6b1YyeTRmNkM2ampkLzdYN2VpeERwR01vKzR4MDFIUGZWQ2hRLy90RXNIUEZxbXhua2FEZGpQVnFnZG5xdUpWTGVWbXBSYzBXcVg0M09XZU5zZVlmaDlxdVZveHVLTFY5V2NxOE15TjB3VmRmUy8zQ24rM1Bid1VobFlYdVprSUJqd1RZeVZjdlBCdkxwQ1ZXd1F4TEYyTzVqU3ZqWEtQdlVQT0pkVldlZWhzL1BWRERTbTVZVmtRMUVGbGVvWDZDanF3YVZ3bFo3ZlY3Y2ZNb3NleHVNSWloNkhwZm4yb0FRK2h5TCtaWVFOYXI2WmgxRGpjY0RNVHFoUlkxZFl2eW1Ndjg5dWs3a0tFNDRqVllST2U0VDVrWU5CSEFPbldBaTF0OGw2OXBFUnZHcVJzVmd2blU0N2UzQ2lqSEdRTUhSRFRqbERZS0NCbFZVajR0TDM4aEE0T05yUE10UXdYc2htTzI1QmhtQ3BZUWE2UlZRS0s2OGdRaVk5bmd5NlJNSzB0elk0Vys2UWYwK1orTkpNSnZRSmMyQjltNE50ZUNwc1RDWkZKVi9aRW9INlhDbFZ4RmVINlJaRzNGOGh2cDJycytNa0lFOHJ1KzE3UXU0R2p6dTYySFlCcFhTMkYvNWZreHZVWG5WZlF5ZnRjVlAzL21iV1B5ejF0QTNyb1dzdmJUWmpoZXg5NTBZd0NtUUVrVUx6U24zUDhnR2haVnZyRm0rYzAzTWhXUmw0YUptbGNHSVlPUnduSWlXOHZIcEFuTVFUWTdub0RIZ3g4Tk02VW1FR1Z0dDdnWS90bTZORzNOQ1Nna00wSUNGQjJxYk9BWURNbGdSSGNCNnIySWdKSTRXbVhrRERmdE1UM0s4M3VVQThtNjVOakoxUktLYy9MK290RndvL1lPakxReHNYc1RxeGFkT3BDTkVhZW5ZVE9jRDNUNDkyUTU3bG16Z24wUVYwcXJPRTh1ZWRWdE9ZOTBENUYyRlp6bTZDVXVkWVIwdWlPdFp2czNHcVkvQ0xFcjdsUWJRMDJJTWNwRXhnc0oxQ25ybnk0TlhJM2pYUWc4aFhhS2dHTm1BMVpRNFdsaFNBT3A1bkc3QkppN0l0ZUxjb0w0eGZKY0trRjJ5aTRJRmFKK2Ftb3ZSYTNNdXVMUzljN09xd2pEQWs1V29hMTBGR0xmNi9uWTVsZ01Gd1pieVB3ZTdnVXFEOWViMEtyWXcrdEhtOGIwMlJFNGlUYS9rU21EU0l0alVJcVlDanNZUkI0b2xMR09mWFFWS2xhQndhYWxuTkIyZ1ZRMFozc0R5d3A3UWpGMmpuZVBoUENXRTV1Rmx2dTJMTC9CaEJlRzI2a0JlWEljMW94djlRRnV2TjJHaG9WM2xmd1VQQkszRTY1Yld2Y0hFZk1taEFxZzhDVkJjT0g5UEkxOEtnUjBkRFFqZUp3b2E2QllMWjhRc1VSOEJ4eXZwb3hpSnYxaFJjWlgyU2FNK0FpYVNKekg5UnhXMi94NUxvVGpYSGlUZm1EVnZvZFM3dXhlWjRldXdzQ1BQNGdQN01HdDkxZ1hvd0x1dy9PYzh6SmhXOE1CUlBFNkZnS1Uzbk5XdFBIdmY3NTdwM2grRDJiK3FVWmtvdm1uQ3RNRDRzMXgyMWs4clhjaVFwbFBMT3hHOGdINTIyRVN1cVZyMkYyZWlPcGM1Ui9IVjIyMmVzM1dsa1pMZmJJTlZFMnYwYXQyeExad1FYWWZKTURlRDBwV1FwQ045U2F5Y0ZVSWQ3bWNSaE8wekNnWkVGOXNDZUgvSEl1RkI2SmtDcUUwT3NpL2lock51b3RBZmY4cmhWVWs5L2xnTzRzSlpjbnljaHpiQUZLT1VZbUozZ2lXalpuRmhJUEdud0d4ckhaeHRyeHR2NlNHeEtJY01hMzE4RXMxVnFqTDZ1cnZ6RkU2a2N0L3phcU5zUnc2YVNzdS8rSWtTOG1jbk9xTzFobHNDYlVINStFcXNDRXJZYlorbTFxdHF2SlVTRWUxWVYrUCtuaEdlNVdxamlXWWwvUmNXQ3d4V3pwOGkya0tQam5Sb2hueFROaFJiQ1YzOGVSczJSeGJUb2JRekt2N2xubGlCUFZGNStSODNKSFh1S1JlbElqQThCeE80TzRGVjhta2QxMjRiSUZyZnBBaXRDWXk3QkQ0Z0pNNjdYY2luN1VIcnlwMm5tb0VaRDlVV1B5elFyM0RpMC9zaUdaenhXMWZObkR1RjhIb3JvMnVvTWhxQVVHMHJKT09YQTVyL2F1eWpvMzcwbWhkWnVnT1RTQ3dZSm1tRVVJMFhpNy8zem9WVGpFUW12MGx3djBXNHFOdnYwa0ozSmxHMmVFZy9wZTk1MllvVjNZb2JaMnRwUGxibGZXekVKYXd0VTNCY1NrUlZlOGJrcGthWVRMUmRSa3RreFM2UVlSUmNNa3ZQWDhHd0R1Ujhjb0gvV2cwdmhpNkh0SmpjTVBzbUVaVFdZU3BzTWxEY1VSOWJLU3ZubDN4Mnh6NUpBZ3ZCVXBNb05vaE51SzNtTys5d0dYY0VkT3hzVmFrRFBhb0RrTC9JTkhjN3JLQmVTdFlHc0w4RnpkMUkybXdQNFdaTk9XQktFNUJiUXVpS3BpYUdIZXhJbjludFI5R3BZaDBuTWMrNHlPaTllSElWQUJ3eTZGVE5TS0RvTVdSZTFXTTNrUWhrTStpb0JXWC9Bd2pUR0srUXBPM0wxUkdUakVkOUdLU1JPWUpUb0UwWGliczE0amJEMTM2dFlJbGdEcWtGUlI1TlZqSHovMHpUelZvRFU4ODlyaTlIeUNRWmpTV3lRRm9CSXdxc212eXdGR2c3cW1penpNTG1TTmVrb3FSNlM0dTFia3F2M1pLZVpRK1VaNHFleGhPaW9xTXlGS1dBRkNGSjA0c0dzbHJqbzNXN1FyUGdreEZldDNhenp0U1JOTkxHejQ4c0hpOE5ZR3kxei9XbEtoMFpMdnhvNmNOVHMybStFV2tVc1FWb0JCNFpoU0NxcTNJZEhHYjJPTjZtSzZwWmsrd1F6cWRNRG9FVjZjdlJiVThoMkdTVUp2N3VpSW1uU3hFdlltVmM3NFd1S3dPY0dYYXNkZ2RBMzFoTkxPdkNKOG5Wam9vTTVXODUyYkV0dHVEckwrWERaNVJnby9QZmN0bDdXS1Z3SktNZUt3SW5pYTFjRDhaRU01YXdRWjlBQjUvNzBrS3MyRW5yYTJSUlJmOVpiT2RNMmdjTjVmWlJSNzJnMjI0SzlCYTBUcEtyL1doWDd3QVRQM3Uvd3FDamJzZkhHWkZ6NWg5cWxhdy9OWjA0bnJrZDJhUGJlbFhVeEdrbGttamQ1QXNGRVJRYkI3a0dhemJKSEZ6VW1rcXZMK3VNRy9Yb2RpaElwaWFnUngxWmIvMnZaQlBudzh0bVIwU2RTekdTTDF0eWdVYWF5ZGV5NEZrYWVDYjl1c2s1QklVSkQrOEhIdU5taXlpK3ExRnFqUnJKcGRmRU9vWmhQTEVMcHRKa3VuWnYxL3JJREdzNzhMVnZCR3d4TDJVL0NsaE90dE5HOGxJOVk2cDdDMzdPdW03TE9GU1oyVitpN0t5L2JHUWYvMjNvclJqQ1hqK1ZtRk80WG4vV2JGSjZDOUZRNVRUcXQvTWZ0SGpOQm9uTEdOVXliOEdhSkJEaXJTaHFRN0NtODBEekxiaVo3em9VYXQ1K2lzeGhPRW8weFkxdlFpTW1PMkJHTHFkM1BLd3Z6RkF5eUYvSzEwWFdKMUZnS3BjVEFFbHYzSCs0TkUvMWZFQ0lmTkUyNUgrQkw4MHRtODYzbDRKZ0Z4azA5TlN4RXlzYVpKT1lkY2lKMUFPK2xQcnRWZzFvckhTdjg3U3N0VHBzN0ljcHpsbXhqQmJvMjdUUGtXZ0UxVWM2b3VPMHVYcFFwSFgybEptQWlvQ2k3b1JEaGZXbXpPWHlxTFFuNXpRRHplbW0zcXl0ZWg2WXB2MGtWSTRBaGROV0t6QlhNQU9kb3pwUnhtTmJMV3lnb0xVSStvMmtNTUJ3djJ6eE5taHdTZTZjaFRxalhjOWpVKzVnZSsvT2o3bDlTTUYvVS81bm9tdmdqNkovWWVGRXhud3hzQTZ6L1ZmR1dIeTlIYWRTZkpLalhGVkorUFFXVUxJTS9pcDM3bElpckJYckdnVDhMSTk2M2xaUE9DT2YxNytQdWF2VzZPY0srWlBPY29zRktRTmMvZ2V1NkFiL2ZaZzRNMzcrZFVuUFBNT09ETEVJcWFSZHNITnVWVnQvTFk3TTVYMlAzU2J5aGpJb3RlZjFnUjJNREZaZGJmVEdEM2JoSmdxekFJWDlPWnZiVmU2MkltWk40SXhsaHAyYTJNNCsveFl1aVpBdktDbXlYeHBpOWY5RDcyYm93bCs4a2prdTgxSG5iZWhMa3dmVFJlbVY4MENQM0FnWktVMklOdzJmT0lnNG14VDIra0cyNzlLK1IrSlZMSG5wc2U5MnVtSVdzWVpvM0d6TENkMXo4SisvY296R3d0U0hwYnluM1ZXL3V0OWlNMndLL1dyWkVBMDgzdGpzVmV5Rm1SUjl1T0tFTzRldkhuREZqaEt6M3Zidm5vUVg4dEMvNmR3cnBqWUQ3OXpRNGJyREJ2U0JSYlVFK3FsWDEzcjVZTVVzcCs4U0JpaGp6SWNPNXpucXgyMTAycVJnQ2pPcDlvb1piWGI1eGUvQmYvMnpiMTNVS21tSEZodHBtSEsrejBEVy9tbnFUMmFsMUhxM0tmVzN4RnVrT0tJcG5HVC9lSGdld2EzWEhScnUwQi9mNG9XMDFzaHJKZXhjcDdzbG1LQTdvWWI0ZTM3dldUVGUvays1bDRSS3p1YVdWZnN0M0JpM3EvOGZTTUxhdWZMWnVFSEZ2R00zWUhBVElWZzVzZ1hpeVhrUVBGbllaejRFekJyT2xzWjRCUTk4MVRKNHc2cHpaTSswcUt5aFpPYW5jUUhZL2grcEcvODlXaWtzZ0ZpR0ZQY0hZTnRaT2dpcUNDSVJSVEdEUXYwWVJaeVp0cmkxYkxyOGRaYXBpVFV3SkNXZFEvb2FsY09NaVdoRC9wbWdkVnMySjhrWFhvT3IrUUR5VnhDVkwwcHlUZnZTdmdvSUxnR1lEQk9yanNSZGs0MWN4TXpuSVNtTCtHR1VvNGQ5TUdURDBPVmZpaUo4c0hNYzh3MDJmUGpWcitFdURoQndHMzZJWHJxYUZWMElKaDV3YloxOXQ1OFlmUkJKVkRrRDZxT1ArU25HSWxSSUFtTzVYMHo2SnRkM084Y28xYysrdHVObUtFS0dvY2lNMlZxdWZDRlNMcE9UMzEvTkg4NjJlNEw5ZG5iYUs4ZG9RbHVEajZaYUhjbkZHYUsvckozM25paVFJdFhXRGE3TmhhcHlVdFYveHhCNXZnVTVWUk10TkFUN2hBM0RtVDlIME9rMU1LdDQrck9qdVk0R0dxaXFWeDIxVXQwT0RhZkNWTHp6T0trckRscW9OdjZsbWJNd3pyVGFvbEI5TzNLOG5YdU5PcHZZaHBnb1QvQy83bHhUNDBVSDk0ZG0vT1IrZzdhSFpwM0g2MFg1MTlTbFpFdFduWnEzVXlsamI0c0N6TE5xbmlXcWxLTEhIemRsLzNFRDAvS3krV0VkUmFmNHFVSlJaMU1NVzN4RUR2Um05RG0rL0N3YTc4bkNsdUtCR1k4cUhXY2VOUTdEME9rZ00xZm1uOVVjV05SSEpaT1dUVUwvR01qbVRjY2d5a0p5THVVdlQ2QTlwNFhaUDRsajRtdFU1a2JpSjlVZzFMS3BpZDVHVjhzeGlkK0wvT2tYRlFIRlVtaXdBY1VteS9SQXo4THVrbWFFdDVTTko5Ym9BUlM5aGZyL1VDRlZRREpMSUhhREFGb1Eva3pHVWpJUUgzSTdpV1ZlSHB6Q3dGdFIvVWlJY2hsSTJSek4rQm1za0hVcm1qS2UxQ0c1bngrYXNndG51T0tTVjVoOE4xMTZZZlc2NENLdk5CanptSkMrM0NydHRGbEZ4NWg1RjdRd21zQjZyRTNGeTBra3hVdmtqR0owZDlPd082SGNHU1VPQklwQXV3UjRHd3l1U2dOK0RqNDZBN0xOa0tQcjNaTzluZFYxak5LU3JRSndBalF1NmlIL0JyVTJoeGcvdnV0SlRkQXpGcGVXUmdGVjEvQ1BsdHFja2xhMkx2SWtFYk9IbGNKWlFLRXI0VWxYOUNOMzNlS0JQTEV5V3haN2Y0THNnT0ZKa0xVT1NubkFpRXVoN2ZBN0lqaVdac1I1aWxVYTNzcWovangzejB6WVM4SEh2d1pmUXVXVmV6anNmRitXUVlXVnM0YWpYeDR0L21BQ2hDRXRwM0RNeVlPeHlJRmlWaW83NWFENzNyVWR2L1pQajJOQm1CZDhVR29NVDhXV0xOQmVSQzNMOXVZTnFrdDZpa0hlSnlRZkJxMlkrVTNCZU40Y2E5cDQ2bVllbVFZKzlQdTJlQVlPcUZGdFc3a256REFwRHlWVHFtTnJwSGErUFUvTWJybDVPU05RTWJNV0hxZ3pTQ1dzMFhNSU5IWUdEVk1kSEVDSVZGa2txK3YrTDBmRlVVNks5eGNnNmRzN0EvOXp2TlBKUEMxNDhKRFNXWWMwLzF0Z0MrRnhtZVlKRERqWmlFN0t6R0kxWmI5V3lWYkEyNCtFRVdVV1FORnNIbTN4RUdWQTd6ajRmNG54ZkQ2SmNhN1dsTE9JOEJtOTc4SzcvdHRabXRhY01wT1FjL2RGUzNrRllEbGhhVEpZTGZBWE5CeHJuZVRUdDVJckRYVGhHWkQvVHErWWJMNm14NzZhRWNaNTU0ZkhFdURna0YzaDBxSUx5M0pLQWtTdExTTEtSTno5Ylg4Uzh3U1ZMRk1ES0NoOXJNeTh0RlI1ZmxhQnpQR1pLL1FNdEZUTFV4WSsrZXpFQUNjUm02Y2pEUmd5TTc3SGZabXpEK2FEQjlSRDJFSStsSDNOZnJRc3l1QzJScFFieWhOdzJ6eWV5MWZzRUxKcTJiZWJzcmo5V2c5bjBiOGtUU2YwNWtGdWtBY0xucVRxOTdEc0QzeHlnRzBKNDdvOXp5TmR0ckxkZSsybmtSRWE5QXRqQWxNTjBUSnBhbDVrNkhUZHhObzZJY2lwRTNXSzl0QjZoVWR0Rk5DZkhPOFVlQS91NCt0N05LNmxacUxrRE5hczR4Mnh5TnRBQklTdkozZHpVbUlDa2xWbVZPWnZCUXhXWHFSSnV6K2Y1ZGU2cjdLY2llOVQ4VEg4U1ZoSE9KcWNNN2k4RDJuMW9FRWFPOHBkK2h0REw2YW5PWVBhcFgrRGpaMzA2M00ySDkwaDF6aStyQXY5RXh6OU0xWEcvMWxKaVZPb0dFUDdKemx1NXMrb3Fsa0cwRklqOE90Zk5DdFZ4M2Z3T05vNFZXaUh6blRUTFZjaGdPRzVLai9TdWN4YU9iRnkxaUVyV3Y5dUJJZnp3L1AwY1VITlJhRE9RUTkrd01DTjltdjJVZ2ZZQ1NLejFXQU1Kb3Y2bE1CQ2xBc1RDQWY5UlV3WUdIRS80dk85eTNtRnlvTkR1c29yL3VQVVVLM2RKSEVEUDZWR2s5bStUVTRzdkV5dnU2c0hndjQ0Y3AvcWlTeFVCZFl4NGYzTnhQT2ZuUnMra1Uxd2ZFYTJXdWUyQVZCNU0ydy9IcTVmTCtZRXNUU0Evc2hYWGlSMUY3bUlpZXR3YXBRRUlqY09XQXV4RlZJcUNqN0hTa1FrdS8wbkNMZlEwVWJMVmJ1eUZPcjV5bzNOUWVOcHE0d1hYMEhpS3F5b3JLRHBsR3FQK0VyTHpseXRjTy9SQjVnY0RqM2ZXQzNRdUdPRERNd1RVVmRBQkswZklkV0RrcDlrUk9nUTFJVnJnbHlYQTRQVzRxUXZLdHNqOUtOSHdvTWM3emNhUmhxRHVIRUNoSlZZQVY3Uno2dWQyRndsemkxMXR5b2ZBd3IvVWpCOVI3NjcxaGdtNGZsSGo2b29EaXpsZnorQXVWSjAwempVbWI0bFRwY0RXOFpRUkRVNEdDTzJCWEdSL3d6NU8rdFRkNDJTdDc5VzZESVRWaWVUMXNpbFNWNk5oRU9RUXdBU1pWSldTSW0zQjR6U3A4WU4xYTZBcXVCZ0pzcXNha0hVOFZFdVZGWUtKaVNOUjFkYlF2TjN6ZmJUVENibDNudkYveUNua3hrR0VpencrMWdESXdGZ3lrcnV5bzJhdzBtb3R1TjhTeEFaNVppUWVRMGp1dXlqbHBmdW5CNEpOSVpqNWtaMkV5L1lLa0F5YUF1T20zNi9vUXkrV2YzempNZVIzZXI3NS9GYytTTnk4aE9ybmpES2M3RGxJMTMreitLYWRYNXZzeDh4NEdXTXNVY0Z4SjFwV1ltS0tPRlRTdkI4N1hLSmkzZUhsS20xZUVkSXVDVGJ0K0JlKy9qZTBTcFQ1UElEWDI5SU9FaW04MmgwUlR0Z3A0SENTcExMZFZTU2ZZZUUrN1Vub1UwSG9iOENkb3lRTjF0cTJsaEJMa2xKcGVTN1ROTkM4TW5OcmlNand3RmJFbUdBK2R1V3diOTIrZTJ5WEczb1l1dzE3b2tyZlY3QldYSHZwYnZpY2NZNWFNbTFYUzRhaDJBVGcveWt3aW9iUkJLL2dsQ0g1UEpOMjl3cVJYSWdOamhLWHlCMklRSEEzWFV2bWVtSFp2bWM3bkxRQkk3d0lJeDFkUVMzRXQ5aHhiaDBBcFBlRWZ5WXdqWE4xdmtJdTAvNWJZa3dhRjI2WVBoblhiZ3I3UXlMV2lzK1RMcng1K2UwLzJybHVkenJ0cDdRQmdENHNUbUhtQWVBTFE4ejVwcWI1a1ZrV2NpMWNOK012bFh0Z1BWRHhMMTdseTlNWGJLOThiL2l4WnRWVjZqR3Rud3NVcmRESFJXMVpnOE1GTXlPUW9TZmhaSW9ScytTeWw3QVRpQ0RWbVBUSGhacS9zWE5mNTZpYlNiYVBmaGs3dUsxZVpxaGdDSExTeDJoVVlNWWJJeGV1SXJmRXdYK3lKUmx1Y0huNHdaVlZySVNwUlFXaWI3V01TbjVXazZ6WnEyN2JLSXlnSDNURURRQTlreW9QUVB1Qzd5MlV6eVNtK1B5NFRFL1Q0cHROMGlpdENMMUt6UklSRGtFb0JOQ1R2S29tY2lOcDdic01ZeU1jZWo2dVBVMHJWVUhJYjVFUFZVWk9JUVhMdHJZSkV5Z3FRcmdWbFB4YVcydEZydldnNVl6cU45blFPM2YyOTJheFBST0haRjc4NHNjaVNhekdzQlcwZFVyUTFSdnJ0QnpTL2hScmFvbk91ditoMldBQW1ZTVF1UmF2T0dqRXFPdWhzcm5weVR1bVhqSklxVHNDdVJTQnRYVDFkR3pSMGdkQWt4M3NyMnJ4cFNvNmxZVmxuVXJYOW9MZm9tUEdzYWx3dzVyZ2V0VEtxeUZEZ0I3V3daSmlOdXBWK3N5T2FHUEFWV29xZzdJL2VRamt4SzU4NjNVM1duU2xUMUVJblRxWTBmZEhYY0xyalVIb0RodUl5TXJ3d2QzWEQzUDNZdm9HNXhPN2grMlpVRC9Bc1dycm9aU2xQYlp3TFpUUkU4OHdDdEdmWStkWUs5ZjVXL1AzQ3lOYVFUZVdsWDRNZmQ2bU9oTm5HYVVCRnM0WWRwdDR3RTFlUHdEUW8wZk9NRWpWUk02NmZVZjJiMGp2amthelJEYVFYai9WRDNuZk5iMGVpK0ZZQlVKYU1rSnlmMGtUMFJQNXd4ZXd2emVCanArWG5oZElJTEZjTzNxeGhoOHpGZDI0dTRZRk9OTXM0dU9Tak4rUXczYUswb0p2S3plT3V5bmZIdEtTK3NPTVJMZEQ1aW91NTRNWDd6U1RNQXVaeTBnTEd3d3hXbHVDWVB2RlBaaEx5NDlRMWw0M1Z5Q0ZubWs5enZqUlZldVBnT3B0M1NNcjJQcUxqRkpLRjZGZWRXRkRGTzZYN1VmRDlxL1REcFB4V1lYVExaRytCN0gxS0lzanMzcXlKWEdQanlBYjJrQ0ljbG1sQVN5a25zSlJLUit1SWVvdzFGWnNuRGxOVnNGa0xlOEFYcXM0Ujdjb0dScm9IaWhFcU1ONVMwelc0dVBDNGxoVm1Ed2JPUXRSdnFySzh1RklFQURvT2RGL3pkMGFCZDduSDB6WkZkeGdDU3plRTF4d3ZBa2hPSVFqTEsxcFNBc2VKNytZNWtod1EyZGZYMTV4bjFhaTU2dlhZYVNRUVNoakxuT1FaYk5NdUxiY3ZYeUlxZ0NzZEpaWHBIN1d6bnZYTHovVzFyR0xUT3NVdkZWUlNORmxvdCs4Tk1PNmZRdkVLWGZPdnNzUzdrSHloMlZCaDR0Ry9tekNQMXZhTG42Y3RncGxXd3hLdFA3Mmo3VDBOQTkrMGQ5bVRXckJ0eUQrT3huTklkRGZQRnVULzhUZVEzQUJIMEtrVHFocDFFKy93akY5VThVOWdZSjZodlVIMEx5SXoxUXBrUXBMLzZia1QxL2l3Mi96QWlZY0hMSXhzUVlzd2cyN0g2TzdHY1poY0NJTFBaUE1zVjNaVmduVXJad3JkNU1obDFrbFNpTm9BYWhQemp0cGVsSGJyUGZmYTZsUHdyZS91bXpzU1VmNmxJaVJibkdGOWNGNVNHaTdYRVdpUWdOc280VE5sUGtRMHJZVC94SWRSUnUxMy9IbVM0TG04N2E0WVdRVi9iZS8xdktZK3U4cUFXQlVDTnhvZzZ4OUdwQThScnZVN1BFTWNOSE8xZUduclBaQmJoajZCY200RTF1akhlMERKczhwL2NoSGlmUFJsdHljYzR3eHQ2TFMvWmJQODlJTWZxbUFXTi9XSE9TTTFHbWZKa0tkZ1A5cVBGSVlzSS9qTS8xSFIxSk8vck1XeE5VejNhS29EdjF1QmZ5ZFZ1aDZteE1KbkRQWlVVSEhrZ2pXbVZCbGNKeWdBZGlZckd0SlRnUEdHSjR5cmQ1eGsxbXBEQ0pyVGpkS1laeG5jSzBSeFF0eC9zcXhNcUltU3RMc2VOTmhLUWR3SkF5aGk3Y1doUFd4ajlzTGNmRHBoYTRnTUZoQ2kzeVJldWc3bWNwNGNJNmxXTzBMT1FGeWlMU2h4TGlOTlNabWYzZVN3YUtRejF1VlN0TG1yRXVKREI1OHBWL2Y3R2lHeFNQejR4ek9GM3BxV3NreUQ2TG9ZMHkxempBWWFUZWJKcERPN0pXNXhUUmJjVDRBd1ZGY1dCVWZaVWo1NjM5L25aV2lyajJWS0x1WEVTc01iWmZGcmROd1VxcWE4NHJqVW0xUUswTUJON1NxaEN6OUYrY2R6elhrZ3JjODZaRFcxN2pTclo0WDJ2OFI5U0lzOUlJVFoxR1ZOSGh0ZU5VRmsrK3JubUdLMlozTHJCWnl1MUhSZnE4YkJqS0NVUW1td1k0ZEtNTWNnRGtrN3VqN1RvUTdtdU5vSzlhbUNDVExINWdiSy93Mk5lZ09Cd1hZNFdjWXVPVzVlMkZ6bitwU0hRMEk0YlhaOWtzN2hLK1RIV29FZUt6dXBqaTR6a2RqR25ydXY4bkM1RUNwS1hweXZ5dkV4eGdnRlprMSsrZ01XNTBoWURZMGRUWXJrL1pVTFArU085dzZsUXZFSk9VYWtLUkxnOWtHcUU4aGxkbi8yekNjdE9Tb2kxRFlLa0txYVRNRFJIb3JxWWFMbmc2c1hsejRVYkx2cDRwRzU2R09kVUZVYzVaRVVPYkxuekF5K2ErZWZUbERkSVBnZ0tTVk9xTUxFK0V6THNwc3kwTG9tU0xFdlQxVS8xcXQ3Y2liaFdCdDVwNzFVcW8vUngvZzFkTXNyYlVRcTdTd0FmeTY5TFhZcENYd0xKRUlzYWVlRmx4UGpJZkZOM1BNa3lIaXpCMkROcnRQeEJ5UFpGRzdxWkZNWjVqUTdST1d2cElaSGw3T0JKZzRZVHJORDBqcC93NE96bGdaTFd5RHpMN0hFZXlqNTkzdVJvSVFvbTV4OGdpdGhabFMzdVJXV3FZcnV0bFVIOHJJblI5OHlPNEJ5R1FMbzJTUTBncmJvR3pqUTF1bndqU1FpajYyUE5zNXVqdTgrL2dIU0hodGFTWkRkNm9kOWVoYks0dmE3ZFJWL3JuWC9YYUJRS3lQbzVEbG9wN0MvZTZ1aDF6U0xmbGRTMlZJTGdXK1NRdWdlTEJXdURvZ2hKMnJiZHRPdHpTei96N1RkRFY1Sm9TVE42ZFU1Vld4UEFkT0c3V1hFQTV4U09ZQVFXZGZJaGtTZ1dDOHZZWlRTY0RYbFExUnNuRW1GdEdlT0tiSjl1YlRYOFlnYVQ2cGUvZWhySWZGZlBCSzlSOEZqa25OVFovYTRaL0RBY1BnNklIMGNiL2F5M0RVV3JzNzMzTGp5Q2szVEV3T1ZRYTd0QWI1VzZYL0c0N0JLenNxV2lITE4yVTBXZG5adWFqMGluUFNlaE0rVCtVOE9sdXVzNFVScFJQNDM3alFlTHRBV2dVZ2ZCdkowUWM1WXhPTTZ0QnNyWWUxa3NMMEttS2UwSzFHbVltNVM5Q04zOW0vUXhkYUZxZ2dzRHZwYkh4ZlByQVVxZjZOMTRUbXZWOFhDSSt6endpNURZbTVGVXdNYUF6YlUwTFZpVTQ1VGFLa2xxTG5lN3hJQjFiUnd2VXVhR2xXTjIrdTF3UlZTeTBxcGJjWmM1ZWZuWlVzMHFGUEFPa1dHNG9ESUl0d25MMHlpZDZkSm02aU1XZE0wVnNDOTlvM0wzQXRHcUltdlpqLzBGaFAzdEFXS21BNUJmZ0hPVENLWExYdGkzbkxXQm1HVERCU3NjdUp1aHhFTDJUMlM3bVhEcExFc1J4ZXJ6NGtqUnhUYXBDbFd4SG96SU5YaUcxY3d1WmsrR2ZydURza2Eyd29rdGtONFdEcmpGb3BWaGQ5YmwwWWlKWHNuL1B6YjhUNzd5WjJXdGpma25wTHdpd2tndnU5TVJHb0k1UGNwNmZHNG9zcVJVakJOTzdMS1hiK2NFcDJ6eFJKNloxQUVMZlB3NUpmcmd3dkdBNFdOelF5TFE2eEJiWmMyT2psdmxPeWMwRVNZUEp1ZVZNK2dHbU8xVnJmSzRvS1ZOQzNndmVXbWtIb1dNMlZCTENNWTFjQUVJVGxNQzQvY25PbFJtT0EzTENFbmZXd2tWNUVQNGR2U1h1NTNyZzAxMm54TU52R0tVVkNtdkZsOWhkVUc1SDllUmVIbmJHUk1jUFp0MUxvd05FR1M5Wjl5Z0l0ZFJEQWtEZ1JsSUJLZ3Q5UkVMN2ttRDJVT05GOTN2S0cvWFFNOFdzSjdua295UGZRN0hMQjk5Q1RsZW1DZjhGZzRzUS9wNXo3ZHBhcFZydWNxVm81RWRCVkZHMGk3WUVxNS8wbG0rQVVGb09SOTl5eFlpMitHQVBCS014QWQySlIwQTFJemNnREhqRnVFZ0RpZHJGWjNQQ3k0YTQxMll1U3dtTnNHWUM1OU93SnZYVkJZZUlTTEdLUlQ4ZVloenA0c2lCbGNwZkRmeHhQUnVkcHB2dUlCVTVOZ1Q0YkY5NU9tWU1ZR3FGam9obHRhUTNlY1ZWTXhmZ0lTVjc1elBWUmRKWGR5cExKSExtZm9mNm9SeUE3OE44R20ySWY0MXNUWE85WjRsOWtNeURXUUxFdllGNHhKa05aSG5KYjRtWTczdzdXUjVub3hYczRmdmNhSHpMOVhGbUk1RDJSWW1EQVNJYUdFTTVJNklCWndFVi9La3IweUgzZDNhUWR3Q1RET1kzQkVCbFV0TjZDZ2V4d1hEL1pmWW5jSHpQZEZ0b1RtaXY4NFdLUW9QL0FpYmR3NDBpamVQQnAzV3hYUTdRSFNOc1M2RkZ4NmY2ZzBsUk1FWnVJaEhJZDlpeW1BTlVaMG5zTXl4N1hMRXQxczVXU0RtSWp3QkdrK0VZR1Y3ajhoRVhUUXZLV3hqbTl2U1FaLzBqejd1cStKUzIzRmJhbFZCcjBMbjEveEQ5OTMvdWpaS3pvUlNJRXdtcHZtTm5zMFdBVmUxZUw0VnRnQXpwQnJSU2RscnBPc0NZWHpOaFdTMXFvUU9jVjNOSlkySGdUdmtvaXBlWXc3WWltTzR2bzBNOXo2NXRENS9WVExIUWN1NUw0ZVRiTGdCRk51NFVvSTFDYjlMaGNHSnNySDRDYWNpTFVwR2pZUzdxa2RpclBCUklvaWZIOFNkS1J4bzBvMTdVNmo2VFJpMXY4QkR2by9rN25QcjVnWkR2L3hKaDAwWlpGc2tSZ3dXeS9valBwQmppaEUxZkVMOEUzTFRaTGh1SG1ZSVN5d2ZveVF0Z3d3MTh5NHlKTmhRZzc4eUZFbjNWMmgyNnV6SXNnb2VESGgyNldBVTFQVkxsRFNtaFdaRjUvcEZlZkNvTWV3eU5maERsYktMU2oybmhNNHN4VU9IUVdjWkJBbVBsSndmNWF2ZlhQNkpUb0FxYTEyMFY1VFpEcyttYnFxcjR2RllwUDFNazBHR2F3a2Zub3lTU0szQ29QaUZEaGFaRU8zS1djYnR6N1VSOUdiaXdnKzFVZHJUWjZMbTlwaDFIa3dmWnNZTk9QMlFsTkNhalMxdjlvYU5IYkE4TnZiZzZUVkViN2FDT2pGazAydW5VTWhnelhXSnBlcVMvdVF2YzNWUGY2Q0V5b25FYW1Ub3V6dTFiOHNDMFZHbVh3WWMyL28zMllQVWM4bVR4K2F0MjZJR0lDL1JjNXlja2xPRmtVcU95WnVUQmlIY1JueG0zVDBvandHa1QwQzlIL0xUWXh0aDZURUxoaEJSQndVUWd0djQzWnMrUlF1cng2Z3ZmdC91N1FUV3krN1lIbXdIb3YzWGRSS1QwTDJmeEhqaE1HakpzMXNQSlNrcVNDM1Jod2MyZVA2K3JRN2U2RG01QTdPZU1QSUxOb2tVTGpNTW4ralJybmJSWVI3R1lQMmMwMkZZK0ZtZStaTkd1ZFQ3NHJVN0JkRHlOaTJLYUdQQ1N0Y29zZ3NhNWdZaWk4NEZydFlqRWpyZmxqSDVNTEluM0l5b2U0ME1oOXlFZjZXZW8rVUtaNnlMQ2o2Y2l6eFhMNS85RG9GYm96TjNvekdqemc2bk0zYmZRVDFlK0Zqczdwa1psYkVWdTU1UFVHZGs3ZjNxaDZkZUZDbUNyK1pxZXZ2NzVIQllGalhWbTd5S0o0eDZRQ0VuU3NKRGVKdHBCODN4Rlh4TEVycmtUTCs0TUdwa3Y1b0E4UWtXU3RmTDl2ZFo1TmNTZkhjdTN0S3pFbE4ydWp0SlVSWmp4TkFxSmRDUmRpYVFxbDZyUHNzbzdSSU1QUTJsUjl3b25XMko3Y3E4NmdmVjc5OExDQ0ZwQ0FJNkUyRm9ueFk1bGdDbmJUNDExMHRKRFpxWGptSnJMRVIrU21pTU5CY0xFNUlvV3M5bzdGZjBTbFFZUlgxbkhjZTZPUzZlTVo1V25MSjlFTzI3QmtIZGk4LzhsNGZmM1pxSzZCdTY5amhTZitlVitka2hGcU9VUUo5aVJiVmJDL0xzdlZJQm1VWWFWN2UxRk9OMTc4aEZ5ZEFiSC9HUUpibWcvZzdZZytsbUhWNnRsbmlRdXM4WEowYmNXeGhjVmNkUmUxVDhQa3p0MzNjWnFYTS9EN2pUdGZGb0JCVyt3c2QxNHhuWitxRmFRdWFQV0FmUmg2RjRyNllqUEFPbjBSODB3Y0x3YmVXVXdRcGYvUGl0MHh0YVFHUHQrcmthd1hPM0Z2OERLZTVxVFlHOGtyYkx5RGdyanI1N0R6Vmo1UmloWUZkT3NwNFdVL210Ui8xY0hOdm5kRHl3R2poNkRQRFJOSGhjVjI0YmZ5Ukd4bDF1QXV0cDBvL0hhMStuOW9XSHpPZkxsL3ZxUklrQ0tzQzh3ZVFueHkrSkplREFqRTNsQzBJSXVwYlRJd1A5SERxNFFzc3l6bWFIMmtuMlJyUXcvYzUvL0hHY2hzb1dBYkc5bHd3WEtNQ3YyNjcxVmZlRTJmb2h3ak5NN2pMMGJ5c1pJUXltMlBvTFFRdm13ank5bmQ1N2Q4dVRXNy80ZUpzRlZnZEdyRUNXdzVPWTdRRlVZSHlSTGU3TDJwRUkyTDFMM1FUeXVPK1JYSHlORHdGQkRrL0grNFdKOFpuR2dwWVlNOTdmT25BYlZrS3ZwOUFvNnk2NWdJRWNERGdZZkhtNEhnYng2VmMwcTMvbVNUWjY0Q25TUWN0bTlUMUQ3bGVqc0lvUVJ6dXVpTExmNERkdWJKOGNYMithOVFWcWl3NEs1SHRzY291SU83NFlCRU5OMGVsbXE0RzZMbDR0NVdMWWUwQmVHZGxJL3dyaitPb0MvNlJJbkMrYkxFblg3YWlFU3lDbVRGWXJBdDhlSTlvY1RoWmR3SXY5VVlrWWU0ZXhraGpQZkQwODU0Qkk0MmtCWDFQcnZQNTNMMFMxOEl5VWcveWhxT1F1Mm5FNjRuYjlRS0lqV1BNcWx4a0RwVDU5aytLTmVSQ0p1MVVWVzc3VEJKSWtrTFIzMUE1YTlEekVNU3NHTjNQZUVQWXozYjNLVGlVeVB3SWo4d2RVeXppTDE1cHpIWjE2K20vOEdZenh3NG1SQ3ZmTWlrZkcxS3U0bmNEaDVEZDlNdmxjREROZzh3cHNKYTBpOUJKVHdzZHBxTXlwcjVQQUdMOEtGY0ZlWUFuUUk1NVFhRzU2aVpSTllKRk0yZjUzV1lTQ3VKZ3IwKy94R3lnVjdCeHFMTDZibDZoN1lOWDZadWFqSHdNUjZQOG8vZkhwMHVEenVRbzdYQU9RQ3VuS0pyNkZjVUl0VDF1MWErSGNxUHkvSVRRS3JhZzIzbXpaSTR4UUxadnhPWXlHdm9vOVloOTl1bkdEQ2dFN1JqSGwyU3VyWkRnSjRPYzNmeEZpQkRVcENyV0h4ckxJcEVuczcwcUZxODB4M2N2cDRnL2I4VUNvQ20xZDBnU2E3eFhUVmdwejliTnpGZWVJdzhlZ3hjZFZxMU1kYXMxSHFHNUNOTVVib3dldVpLWVdjdU5LMFM0UXlwWkpnWXFudFo3VXIrUlRHSlZITTVUYzVUU3A3N2J6VisxaEdhd3hPRHM4UVNScWdyUmovSWFCVEJ1SVJFLzJ5d2tuQ3N2ajhyUE9yN0FKTUxQSW9aakN0RFJOWURhZmQ1SEsrNWMxYW0rN1hYK0c5eVBOWDZFVmhzMXgyczBVNjF0cVlSS0lVNU9ONjZzcG8vb3RXSEttT2hUN1lYT2hRWG45TmNhTVk0ZlRyemVSM0NjNDRTNXRpMEloVVJLdElKV0hDb2svb21KVUhVQW1oeTkzUWgrYVc4ZFNEakI3cGVhYTlXcFBjYU1PU21QeWp5bzE2UndSQS8yNmtodHhVZHI5R0xQMUZscVY0d0hPbUxHTFBhTkJOQU90QzBOeDFPVDRYVHIxUzBtczhPVVVrMUZETmZMbkRyWEdoV254RHNybFM3aXYwYVk2R05CU1NTaFNxL3dHNHMreHdNTnFSOWQyK2VLdlo5NGttVExuZ29xelNvRHRZTDB6d0JnS05HQWxOMmE1cFI0N1BNOWVpUHptVTNyU2ZWVGRIUHN5WEV2aG9HMUEvckNQUm1Pck5EMDJaTmF3TDZmSzRHNkV4RER0VkJNei9RMllwckgzZDFsN05ST0M0WnVFZy9qUWtiMU9pOElMUS92T3BIMk5MZVhsYnBFNWtMQmNRd1JLQlRtMVFxNVNKdkFHT0FQdUY5elkxTkU1Z1N6dFZvNzQ1ZmExK1EvSzZWY3RMaUdXc2ZZbE1PN1ROS3ZNMzBJZGpmbVJnellMbXpRekhyVVRGUXh5V2x3UnUzQmVOVjF4bHFrOUZwcWpqU3haUllhZkxwOHAwUi9GL3JCa2E3Yi9DeGZPaU5aNXgrZytCa2tqUXhiRk14UmljSmdZUXRaV1RIaTZwOVZjY2NvVHlyd0EydWVWQnZMVVEvbTU4OWk1K2ZMbElwdUJzQTFxS0YvUmdGWk1iNkloY1NiNExIdHF0a1VuK1VGYmhEU3FWdnB3Si9MbUlQUjB3LzMxR3RrbXN4K2duL0VJekZyM1FBK2lmaDJXaiswbXkxZ3NGWXdJZmZFOXZlc2QxTjl6YzNCMDhKTXpZWXBXaHQvaEhVcEZYdWJnOW96bVVOU2h4VU5VNkVDbURCK0FjQVlaRjhrT1JlcUFaRjBkV1BsSmgreGNLb2VtdDNkaVNmaTRSKzExY2Q1RXZlQy9wcVF6ZlhDZ0NiMkorbWdQTEVlYmN5QXZjOC85bExMTnRXRWdtOHVwU3drZXBkTlRXaUJFWmNmb0xhY3duRWZIbEtRNFRWZFhLNTJ1N1FkZmx6bmpuaTRaZlB6MDhMZThNL3JrWW9sZjJKclpRM0dzRmZUcHNSWWhxM1JIaXY4SHJ1YTMrK2k3SEJQakx4RW1ISVFTQmU1WU1vNVhib0x0bXBkNWdYdEhCZnpnR2V5VEhqU21BZDJqTGxxYXFFamR0VkVmbUorQTA4c0d0alpqR1pnbkF3WWVteERYclpROFFCMnM2MGtiZWl6ajE0YUVjakdQckNFRVkycGlHRmtYZU9IbkVjODBVb0o1NWdqVXZUTTJFQlA1UUdYa1pTc3FpQkhhTGFnVHRCS1k4MUcyb3pqWFM5WHA0a1NZc3BEMTluWjZsVENObG0rQmk1bHd5T2dxL2h4VkttZXJ4c3BycWhaUHo4T3pZb2d2UnJvWHRqM3ZiNmc2Q0pRbTVHdHo5RE9aSE5MN0hXS2V4bzF6VEYvQ2s1Z0t6MWxnREkyNjVBS1I5QnRzOXh2WW9jbms4U29YMmJVQU1OREJUZ3l6SVdTcmVhZGZvbnRJOFdKSW8yMnhISXVPWUtzYUpJcU9aclNSRXhya2FqVEYwWnBvUEI2WlA4UlBuUGxnTnJiR1JwUDIrR1g4WGpTdVNKYisxRlRQaUtVMEVQTkNBV1RLOVh1alRkc2g0WVBENlRDRE0xTjVMYjVidm95U0I5dnZWaUhxeWp5aEc0aWd0ZWVVN3ZHSDlKaUkyaFBoTGJXNkpPOEVjRUloWlRRUXhKWkpPSzNqSUhDa3g0QkE5cElsazY3WkFpeXRtMUNvdmVIY3RLTUh1WFJuOWx2elZ5NUdCQVJWZ3B2c0Y2Q0pidnN2VjVqMGdqWVZEcGFGWVVnQ3FoQzZrekpxbXI0V0xtUzFpUWMrY3BZaTR2bmxBckowZW92QWdZSGFHZ1pwWHN6TTFSb2tLRXFqRW5TQWRubVppcGl5NVhPRXBVRnJyTTZuOTh5M2Rrd1Y1dk5QU2hwUWZpTzNaSGErdXQrUHNJa2ptaTlFMi92Wms3NnBnTlBOTTJxUEFzaHl3U29VSEtSSERPYUJJMUprWStEYnJJcWJRL05YenRjVVpzY3BYMzRkTkhpaTVncFdxSnA0bzFsVXpQWEJ1alEzNFB6Z2JmRHZXOGptdnhBSjJJbEF5WTR1cktDeGZNOTFNNVBkY3BHVE9HNW1ZcCtTbmdMRTQ2MEdzTklpelpDK1RidWVNZmN5dmZoN2JwMGd0Q29KUDk0MGZYWFlGZlE0NUZPY21EYzdjbFZxc25DdWxmcCtIakI4eXJrYVF2TEM4c05ta3VqcTVqTkpFbTRMdnBQRWV6ZHl2MVdPZmVyWitRWXlEYkUvM1RWS04wY0dmdFFTbG1kNE45NWZHZmlMRE9PdWtpVm1sQlVXVjFwdVJ1bUZ2ZVpBQmFvV1ArWDMrangzOU9QRmt1M3dhcGZTOThrUFN2K3hXa013b0p6MnFNM2s5aWZLMkUzZDE5WkdWc2Zaay80RWZEUWNJQjY0UXNuRGlRK2pSMEFteDkwcWhaNWdDNXFnSXJFOGU1cUt6enJDY1I4aXloUURubDZIREhIQUlCWW5zaUFXdDdnQW41eDlzTWR6OERhUzBjUlNDWEhveSsyaGZiTkc5SEtIY3YwNkxqcGFoMTdZQ2dxelBqRDJiY1cvSk01emNsYnU4RkJqQXZidFREWHdWdVpDWjhLZzNRTXU2OUc2cjJickhYV2V5ajdqclhXM2RBVmI0anFFdXlVR3VTR2pFQXNJa0FzM0E5akJueUNVSmtNSE1qT1FJanRxekFXWmxyejI0cEJLdTdSMkpqMVBqbXQrSFBObWR6MHlRS2IwdkNPYUplNFk5Y2VyOElCTDEzZFhQME9iWjFpM2k4L3B6ZWhjTUxGemhMdEN2UWk2c21DeGxXOHBoNTBSWXZ0c2traUFFaWhNMWNadk5VNWFYbFNTWlVmVkM2WXpMM010YTlGMldSLzk3d2sxc1cwWHkxTDRPQUMyYmtMOG5sWG9OSzgzc3FsZzBXd0N0ck95eDZmN1hSWWlxbksvU2cxL0dtaVRrS09GT1c0Y0dqWXhzYkNRZmwwaUtqQzAvY1lrRExrb2J3cEZ0bmtGejNPWU1pYzNjZnlYdHluQVJhOG5YbTZBYStEZktsbFhlKzlwUG5NOFdBQWhlUEI3TngwWUpvakRvcG1wWmR4N0IwT3FlL2hJc2wwVmJQVFdyZlB2S2pUUk1Na21CMkVEMEFqemxQSFJoTUpCTllzeTVnV2hObElPSHlHalZ4Y1doaURPclFHUW5XZjg1R2dmWXpyZ0M1UlBkYjh1MnhnOTl3VzR4L1pld2p2aFQ2NnVNZzQ2d29RaXVKenBSb2RIcHZQblhXeUdIZXhONzdVWXNIemgyb2lOWnFaRHpvQTRlZzhNb3FMdmZhRWNocldrWHNiTjI2clk0MEZlQTdrWVZpeWtQRjV5MTVnY01QY2Jrd3lQcHNZTUR4akFjY0I1a3dob01VdEFmTjJ5MXhpMVp6YzNjb2RIdHNycWFmMDJicUgwdVdJNmxXZjh3dWFRVXM3VTNHT0l2VkxaanZMODRGNVdWVXhzY2NPMzVqMjBoNXI1eVZjVU53b3hmYnMvbitucW40d2lSbUFubmlseklPUm1QWmNEVHJkUHoxZXVWL08rRVVDRHJnQzJEZ1k0RlI0U0lWOHB0UGFqTCtaUzc5YzNOaURDeit6c0ltQ3ZIVUNISUVaUWxqdUxvckJnUmdLSW0zV01GeGFEZlI5aDRyU1VzL2N6eU4rRmo2cldGWjlHajdKUTFnVEZzeDNFTnRoUWVPSjNGRE1lSDZ4aVhxMEcxVmFXQktuL1d5Q1lZWUhvWm42WEo4aW5YOVZsOUJEdGduTmkyUGJsTFl1TkV6Ryt1Z2M0eFZ1empsN2dDWHdIWDFmTzFNcENSNHA1Y3FTWlNqYkFJcEw0bktTMGFDUW8rOUpKREJUQjRpQ3FqVE0xL254ejAzREhtYWtsRXl2VmhFTXRRM3l6R3pkSnM3SWRnRHl2RjN1TFlobFc4cHJsVHdGVWxXQVc3c0dGWjYrVVhRcGFhck8wc29LTEwyRVVoNitvSDVPMUttSnFTVVRIQkw3Zld6UGY3Tlp2ODdNOUJZSDJCM1pWN0NIQ2cyYUhtajVtVFR6eXE2NGtjMjNFcWhVeWFzWFNFNGZGWFhUQjY3cHhIaENXVDBmckZ3OU1PS1o4NjgrN2JMWWMrYjdFSXduYzAvYUQxZW1VWTZSbkhzVzdjWmhwbmJxRiszSlhrekFHSm9ncnJOSEFVanN6QzBNMVBaYlBTcnBlZGxrS3FjWEh3R292aWl3S3FONGdwSlNVbkFtc3VFR0hRa0RRY1YzaElCdytZMVJ2THZ0bktCRmNmNE1XVkRnL1pWbmFKazh5S0N1aTZGUTdwclRZMDMvTEFsbmZNZ0VTRmFYMDlNNHBCbnhYUGxwM0ljeityclJVTkxPZUZRdkVtamNDWDNTNlV5MHU1aDZVN3lESWpQSzNldjBTZ0crcTN1TWZzSld2VTc2aUI0Um1TNUplSkx3dU5VMlBlZUI0N2M1eTZsWmxmcXZlWElJQzdkZnVWRUJ5QTBueCtFMk94R2drUUxiRFhSL0ZRWE5JbWp1Nmp4UmMvUzduTXUzT3hkOG9TU3JBa2hmTXZCTkI1NjdQMXFkZkxrRXM0eFk5QTNOSW5RTjI4V25RSXpnbHV1WmVoeTRobEFNMk1EWEpRYWEyMHJWcGV3bm05aUpPTjFRM1l2SVdvNmxmZUEvMTRNZzZkTTA5SjdmRTR2dXA4YTBCek56VUxBdkg4MXQ5WkpCeFoweEUrSm5TUzZrSVkrK0JiVGVkU3Z1MHBRTXdHV0pIWTdMS3lULzlvVGxXNSs3b3RseU5QcXY5NmNmT3VkbnFyaERDOHltN1FhY2ZEc3F0RVFQaTFOd0lqU0twRk5oTVZmdjE4ZXBnN3RObU1Uc1owVlBIMEY0Z2FOU2ZzQWpxbXpWSzhtMG1ISHVKM3ZLM2FMTGNESWh3SzdBbUl2REZMb0RRN2lNaHVuQURwNzJGM1FBdjFzaW5MRlVseVEraXR5cVlOQkdJa0lxR2F5SFRDbXh6ZHpZMkVwN2RjeHErRkliWUhWNlFTcDV6c0NkeXdTbGJOYng1V2RDTGNZU1VULzJ5alRldVYrclNnQW55YnhPcVJMUzNHeEorbHdrT2pRUG9Md3FUNGR1UU04WERqVmJ2dDZpaDNOQ3ByWjhGRWFESjgreDh5cEV5SEVWakx1bEZidXphRUF4Vks4cEZDdWFJNTIvczAxdWFNWjdRdGtBMUExM0VvRk5IUDMxQmw1aDFpNFN4VUo0WmVSeDhGc0FPUGxUYkJhRjZ4SWVkQVJyNytKOEZzb2RlWmQ5enJFak1ibmZqVEExWHR6TG9HQmxTd1dOcmx3WWhtdEU0OCszTkllNndLcEdzYVFybjVNaEZpdSs1Qmd5TzNqbjduaUZSSVZQRWZMUmhqYURSVnZnWHJTbEkzUlQ2ZXp6SlV2ci9mQzgxSEVwcys1K3NQQm1jWTF0QnhmZEZKZ0MybDNhVi9NZS9WWGF4M3M0MXhlWnVFd1dKVzNOOGlzZngxRmQwcVgxckdRMWxJSmhDdkxwSGRMdTRlQ0t6a3FoTUpVYW16SEQxQnFNT1lSNWhEQW01MWE2aXlicGViTHdyMml6YlVWMlRkSEVYR1ppSnNXMmlBZGlBMTRnNi82OVhWU3dUTWdkQlZUemYrVm56S1daUW95S2laUWRlVjVUdG9jbm9CUGdmOFhqRjJmOXpYN0ZwQVZtd3pxVEE5UEhqQ0pIOWRGUEIwK1ZTYkd4NWFhbDd0NWVOTFZPWTVKbnVBUkwvYVhSUzdTbmpWTXNobkszbTFaemhHNGVXTVd1TUE3aXQ2WTU2c3VmNWZwejhNZ21idDZiMWM3RzloQnJ5eUhTU3FzWGZkOVBsRm5XeFp3Rm8xOXo1MG5LRk02M1g3VmRGV2FDYmhyUllRTVlwemYya3hVaVQ3dGx1RXBsV2pNTHBoVWJRdk4vdTgrbGxTcmdFelZlL3hZNnpnSGJRMW5Rby96a2RBeFRSc3dpd2JRNG51VXBIQlhrc2xZeEJ4Y1ZxYzNOcVpNUGZPWGNGNXFvVy81T21LajlPS1N1YUtRVFB4TDh1d0RyWUJMR3ZwRlJjQ1NlSFp3N0ZoY2cwT0VERzZEUFpUMFZYZ0MrVVJSRXhkb25kRktpUk4vRXFvL3B6VEtEVVNDYld4ckFkazJrVWxYMnlKaW5OZXNSZGJiTzZHcmVaeFN2NUpEUFFoN2xlcXlUVjRERHlneWdnUHhPUFI4QW55U0g3L0ZXNWtoaWV2cW1QeHY2VkNWbExjaDhrWjgrcHhZMFd0eUNxa3hrOGRQcitlcjRhaW10ZGJLTFdzVVVZMm5aNU4yckdScUVsMU5KeFljdFVPejRXamVmZk1hWDNrVmRUbUlKeE1MS1pDWWFQelFhenEwSWNSOGhCaERKd2cxbVI4SUdoR0N3UVpnaHc4dzQrb25aY1VWM0tOeDNoOGdHMjhmR2hzR3hsRDZ1bDY2eWJXS2EyMGhSQ3h6UXdiVGNaYjBoMW05NW1qUWRUMEpJcWpZLzhpcURNVE9XKzY5TnJ1UjFibEJia1k5WnRaeTBLdEpmR1lnaVI5OHE1bDlOSlBUSEpOMzhVamdlSGNZMXYvSFVwTk84cDVHSWxHRERIS3RVb1FqTWExYTI5RkFpQ1BWS0k4N1VqSUNsKyttcUlHd3JxMm5QNXg0SlRqL0cxRUxWVXo2Y0RmbUd4R1dxVGh5V2pGbUsrL3pZdHlRc3lHckNycm1MUUI4NVNiTysvdXhkb3V5d1Vlci8rQ2pXcnNReTg2SjVRWXA0em02WXErSFA5eUcra0QvMzNObmY0NXFFd3FJb1ROUGs1ckJIdnJGd056dTN5WHB3NzFINjFSYzN6RmluUlQ1MndrZHdVb1YyU0QrOFRnZXFJYXdmWGlreWlTQmVKeWh6RGhxWndHN1FJdWswSHdxUllZSTlpYy9QQTZwSE8xR0ROUXpCK3E5VXNBYkFjck5FUW55MlZRMGVmclluVnFpL2tsaDY3dDd0dkNCVkw0TTVCRTFsMit0a2IyZzdLM1R4MHZZQXUwVmt2TVJ5UHpiMmh3c2MzQno2WG1kTnBlNittSjZjZnJrWmFqOUNXUCtRdEhodDlwcXNEbnV3MFp6UDVrcHI2NytMeTQ5bURWaS9jQ3crc2FkNG8vNVhlT011alVReVROanZzR0RleldqY2pGSnlUbXZ4REwyN2c1dTMrMDZvYnFZT0NRUzZ4My9iTnk1UzRGa3NSbHU2V0pBbkFQbGNqTlJtMnc4bEJjS250VHp0d29tUEdXelNGTnJRUXlhTHZXK0VnYVlCLzVEdTJlNzFyWFlUV2NDU0J5Yk0wSlNDZThzWkJMa2tvbzlCVDBMTmREeUczVVhSOTlDdURmRUZobFM4R2JFdVhQNDAzbUFQZ29sNkFRVG9lNXptRVpEMUZLajc1Q05ZWWlmT2NXN2FzL3dBOFFueEJRYkllSUxYS3FGZC9GMmJ3dWNmOTFXY25MbXBMbGVvNmdUQXNkRXZTMzJmR1Uxd1p2WVVJUmYycGE3NzNpQWJyaWk3dFNjVDd5T3dOa2dpb01XNlAwSzZTOENJYWlnaTg1NGZKWGFHbkxCSVdINVVzNDIrV3d5dXpBQjVMeGdzcXdaeWVzQ1FFaDR4dGNiYm5WZFBJMGlKa2U0dXhDM2k5Nk8vejhPV3dJRkM3QXpxVFFoU3hWSTRVeVZxVmh6ekdDZDgwU0s0eFlXcmNmeEdXTlI4LzZ5Z0d1MU5PRkt6UGFxdU9ZUEVtcm00dDFFdGZRdUY1R2ZKNUVNWFJ0cnhHaUZLUmxLaFpSeXVCaU5xNXBBLzBReTIrNVNYTFh4dWdpTVpaNmFZZ3c1Vnc2N2FhWXFaZ0YzMkxURjhHSHcwWTNDaTRsQzlzN2FZUWdqeW80WHU3TEJGTU9NVTVoallqSDV2a2RHcEk0cUwwMVJ3WGtzbWM2RWJGZ2FCNjYyWnlYeFJFbjA5cUhyVjVDZ1daL29RMHVTZVFlZm45UVgvZXRmcVdyWmY5UEw1dWdOV0NQNGJpVUt1cnpPbk9kU2k0VC8wVFp5VlpMc1IrYXFlcFVHWngyUjhNQlhkRGs2N0I4cmlHRHNVQU4vY1N6MmJWaTdqdnduMG5LMkpMMVhKbGxJbkZzTEJhSzN6UkUyWWhZUXBKT2VWZ01KY2Z3VFltSThOQVoraHd2aXA4eStoNEdScFZhVUxHWUlOeEtMTnBWa3FTaEFSRjJhdWlKbU1BSXMyamZxQ2hwdkR2VVNweTd6VGhXb1dKeCtSak9ZUGo3dDZiSEJUUWx5UGl3ZWowckhMQjlZYnZyWmpidWtEbEVHYzN4UmRBM04vbVdTVmRFbTJhY2JlL1hFMU9sZFBaeTZOd0xoaGVyVzNzM1pIM0RPNzZvSERVVG01dEg5YkU5WURMMWRXK0JqeUJ5SkQydTBZM3VCVUZpL2ZzWUxFNGQ1dGhEckRGbW5BVmJ6Njk1U0VUYVBHUERMbUlHR0xvT2xDOHl5cFZLSG4xdS9uckxuZ3pOR21QVXRpOEozSVRxRXp6V2NiakkvY0RIc0c1bWZIV3FocW9zbHRVS08xLzVteFFnSFJCaDRyQTRzR1FETmN2TVRoelkvRFhMSFZIakdremhRZDFLQjVUSm81NThGRzJQaThSVEp4dHpPNWtQeTJaRkYwOGF3Z2tnamQ3RUd3N21SMGU5RFZUbm0vYU01UHBsTlc2NGZzVDRSVG9XYnBseFlFTERRZ29qVkpneGJjeGRWSy9pYUZjSEdpS2ZpMDVsSTRjL2tHN242djV1VUdpMHIraGtsaUdRbEswVzdTcHQ2dE5ZeFVmNFg3V3I0TUY0Y056WG1TUTdBZkpuWlF6SW96UHAydlVPclE3RUtneXRWVXNBNWJ4amVkakJGUVQwKytnbXNpMEJIM0l1Tmd1QjcyZE05VDVTazY0aE5BWExuYVp1c0ZmUlhnSjg5UnF1ZTRpMjNyZVJadVBwTVZLQ2pjVGk4VnR6enBNejFGTTV1Z0JNV1JsM256MmJJNzNsUUFGRUhjY1JvcGhhWW1aelpuMlZYSUw5ZXNyOWVpTU9Yb3hnSXdUNnQza1AxTkpaMzdROFQyU0MyaHZiT29SZ0lvLzNXVDBjVDgyblJYMWhpSUN6Yi90dHMwS1MzY3hSZlBTclBxNzdEREdncEFKNHMvbklobHRqaklzeTUvUCtMR2NFTnZ4ZG9XUEk4LzhMOHg4SHNncXNSYW5ncUFEajFoTU9ZWEN5RGQrTFVUZUNWU21sUDY0S2UyVDhOaWVBWlhybjJxY1VqaGsveWMyUjZFSFpPcW1GZDNBeGU5T2RMZGs1bXVmVlJLQXNnRmxFbUdHK3dDNDRqY3dVNUtoVmZDTHJJb1BTMk8vaFhENkhwOFVZM1FXbnovNTEvVWpvRTZ4c0NJQ2J6Mi9ob1ZYWHh1bEZ6b2NIYmVmMytvQmVPVkdCQ3NoRmFBTFlqc0lEVGprVVIxL0ovV2xLaUxFZi9Za284Z0cvTHFqdUVVbnl6THU1V09ySjQvOTFOd1BtS1laQVdCbjB1L056eXFoOC93QXdaNHptTGxUNHJwSzRqTHYxSGlxcUtlNFdZM3NRTVhqWWdEZjhxc2E3YlZrTTZBSzBoRGlTVkZKWmQraUFEZ0NadzQ4N2pwUHIrSVB0VkhBaU5sdm4wN1NmajZFbVpOc2pmREQ5dUZJM1pmY2FRK2NDK241aVNtRjZ4aHlOSnZHM081YTFadlV3bGd1NmtHTDNZblJjMTRxMXE1UkJ2Uzh1YTRGV1lRLzdUSjF3VXd6czlxUzlDZ1EzbGRpZ2pwMEdCcjRhSmZBdGU1WVNYb2UvMnNTMUJidk43Zm5uWWdvSHpBV081Vml5Z0lBRTgyay9Ea1ViSG9QVGdpYXRsRk1CeW1DTStNUXhRSDFhV1c1TjlRS2EzVmFaQnk5VWh3R2I4LzhxNFdIUzBSWFpJUnFTVFFGNGt0eEJHL084WnFZcklJZkdURDBPZDZPSmRlek5YMkFWM2FFNzBPVnduWFloZXJiNFlXQkMxcXVXZ1hTNzZ6MEF4YVdsanRPRVg0Z09sNmZjdjZYZ3lVT2ZoUTRhUnFKZmd0RXhZTnkxemNuQ3hoL0ZmQlBhQnZ4U3BKS1VGQkh6MmgxSHZ2a2JMWnZNcnpsVXdWTzZId2JHZHlPamJvZHk4QWZBVUdEYzFDTDBzY0JlTjZGWDhHbENzYURuYkgwTjgwbVo5ZDVVOTc3Q0FLTW9PdU5MWHVoaVppMDhNOHlYVXI1WUF0aGgwbGk2anpzaEc2aUhqaytQZ2Q2Y1NwNWk5MUgvTm11cE9uN0RUWFhZSHA0YWR0OU8rWkJNTVhQeWpvOGgya01YbFpuZ3VVSThnVEpYS2kxRzdFWU1EVkY4REwrTlRRWEVidkRuNWVrV0FtUXFmV0hHNEtKR21EUS9aYXNyNisrODVOUVFOVDM2Y1NNODZDcENKVGM2TW8vbyt4eXIxZTBuSmxabmxIaFhTVktvREV5cjRsL1lZUGFmODluT1BKQVdobjArTy9IMDhoNllDc0t6R2hWSzdwSjNUV1lOM1hyclZId1crMWJGMzhJZFd2V2l5QUZWbWhQQ0lzRjIrMEFRVGJiVDYxSjNSS3NuSUJZZ09NV0J5aG44T2cyZHdDUXNhdFZsbTJRODFLTUViMnRqditaM2pScTgvWi9sVytkSzliSEs5KzE0eG12c3B0eVFGVHRsWE9IUHEzYndzakJNbDRMOFk5cmNaRVA1cStlUEk1RjVLaENTVURBanhQOFFFUkpVK2wwcElrYWJidXVlVkNHSlNwOW12OVhkMEJieG0vNjNIeW5jejc2L05MV2VQUzl0ZlFEV3p5eDVpcURsd1A2eStqei9MSGcyWmEwbXpFYnNmU1JLZ1czb3VRbEhTZWNmMVcrUTlsQjkxZzZSbmdqSTZkcndTNUR0ZHRMeTNpSVQ2dzExbmVlNGgrU2creDR4emZ4MlB3ZHljYkczNWxGcDIrQnFneGpyUWFtQXJuUlBybU05Rm4zL0ZFSXR3dzBJVi9mTTB0UE9SWFZUcXR6UzlkaHpWcWNnaHNyMDRwWU1xOEFWQVJPa2tVMXFpa3YvRmkzMUNGN1p5a0FBY0lCSnVzSFBtMXZ5RlFpcFNKVG5XRjV3WVpLeTZaR3ZUYnYrTnZ4eG5lb1UwOTJkQmV3aHg4K3MrdVU5VTlaOVJFWUdpQzBtUFlpdnMzem5pZzJOb1dXcWdZOHBJYnBJOUpXbTNXWkQ2eEU1RnJ4SEZxMkV0bWZFbHV2bHJFTTUwRlN6S2JCSVQ3V280TytmSGlaSE1ZK2xEUGRUckxBbjduL2V3NURZWWhyKzJaZVJmdmJuMmkrSG92dEZRS3RjR0ZWK0RXbXZHaWNWdXR1enNuUnVXLzBscnc4R3QwZ2QrL1BPTitiZW5xMCttbzFpWENQdVdkeGNqT1ExZFlhZml4RExYUVJ6TkVVYWlnK0p1K1l2b0hhZEJMNFFlRHJFenFJWTNxSjlzZ1VkWVJBZWFrVkgvQVU4QjVsYU03UWFNbE5TMWhtTFNPNjU1bjJvdGFFYmlGN3RjWm02SzlBaTVrc081UFAvZHZYT0dmd0hMRXowWFg1aFErcUo3VVlpc0toR2Z6ZnRxaCtWSFl6Q3Z6Q2RhdUdydEJ2d1R5N29qTHAvUWV5bk5ndlo3UithWW1WdSt1RHVRaE5HNnF3NHdzbDAwTVBFU0RHa0llVVhyTjZNYzloV2ZsSkxMdndYMFhwZ3ZZYjg4V1BzU2RKMXcxRzk5NzhPVGhFQWRNVys5V1BtcnQ5QjNSUUc5aXVYaHhXcTNRbUorTmtCK3FubzBtMUlKZGw0M3IydWxaeTQ3ZUR0Q3NZY1ZlTmdOV1l2d2lkVm4rR3VZWVpULzM4Mmc1T0xxQWFiWCtUSFhuVFRzeklXRVV3MGliZ0RNVkkyZVJBY0MxdFJzVlJ6MEJWR3E1aEJTdEFXTXdSdGVjYmdPMnozaG9RZE9xTnJJRS9kVUVNM3BpblVlWlczSlI1c24yMHI2enNJVGhiUmN4RGUydXpiK2JxUnM4QXBLTHNxTEZXN253OHVNYklubzlLaFVLU0syRzMzWldVczkwTDNhNGgxQm5FaHkwMjg3SFd4TnNhNWZwMmJUdGNOSVp0N3pqN2Vxcy9HVldlY3BXSzZXaS9BYjNtQU1hWU5mN3MxZmxFVENUR0pSLzlDcUljTkE1N2NwcnlVWXpzZkFnYmNpdUVPOEpOYVVaUUdPMWpPZ2kzWjM5WDZnWTZaVnI1OWxTekFDT293ejhrRzUyY0tJY2wvcThQSzBFSUI3bS9kUVFSRythUDlkNCtjZUxxN3I2ODJubEFheWJhUTlPd3ZZVDBhL1BUY3NwMDk2dUNTZXZYQWVpTlpXWVJzRGFHaG5kMmVJYVVsTkYxcllpTGRpV3JwbmN6bU1ZL3pNdm5MZi9tcUxtVHJjdCtLNkRUVEVPSi9ha2dFc0dFaWpzakpWQUFybndvdVphOEJDV0xqdmRLNjlERzRsYUpINUNkaC9FeSt6TGRGMXdIb0ZqQk1SZUZPRkhyVzNNcDFObTlJUWZ3TTVrK1hrK1p3WE5JaFRkY2xZZ2hkaHVxM21MQ2RHUk42WUw2NVBrcVdoU00rMk5OY2pFWFN5U1c2R2RDWFhOUTJkU3hjSGFVaGhaRUNNa1hoU0NhNmFvOWk5bVlxVGVBSFRqWUpsYytIT1c1cnZoK1F6V2ZGb2FHL2NPUUtsbkdselVxSk1RcjE3T09kNnVUNXJ3ckltcXZ0RG9XUVlDMTZLZFVhMy8vWjwvQkRCPgogICAgPC9CSVI+CiAgICA8QklSPgogICAgICAgIDxWZXJzaW9uPgogICAgICAgICAgICA8TWFqb3I+MTwvTWFqb3I+CiAgICAgICAgICAgIDxNaW5vcj4xPC9NaW5vcj4KICAgICAgICA8L1ZlcnNpb24+CiAgICAgICAgPENCRUZGVmVyc2lvbj4KICAgICAgICAgICAgPE1ham9yPjE8L01ham9yPgogICAgICAgICAgICA8TWlub3I+MTwvTWlub3I+CiAgICAgICAgPC9DQkVGRlZlcnNpb24+CiAgICAgICAgPEJJUkluZm8+CiAgICAgICAgICAgIDxJbnRlZ3JpdHk+ZmFsc2U8L0ludGVncml0eT4KICAgICAgICA8L0JJUkluZm8+CiAgICAgICAgPEJEQkluZm8+CiAgICAgICAgICAgIDxGb3JtYXQ+CiAgICAgICAgICAgICAgICA8T3JnYW5pemF0aW9uPk1vc2lwPC9Pcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICA8VHlwZT45PC9UeXBlPgogICAgICAgICAgICA8L0Zvcm1hdD4KICAgICAgICAgICAgPENyZWF0aW9uRGF0ZT4yMDIwLTAxLTA3VDAyOjM4OjUyLjY3MVo8L0NyZWF0aW9uRGF0ZT4KICAgICAgICAgICAgPFR5cGU+SXJpczwvVHlwZT4KICAgICAgICAgICAgPFN1YnR5cGU+TGVmdDwvU3VidHlwZT4KICAgICAgICAgICAgPExldmVsPlJhdzwvTGV2ZWw+CiAgICAgICAgICAgIDxQdXJwb3NlPkVucm9sbDwvUHVycG9zZT4KICAgICAgICAgICAgPFF1YWxpdHk+CiAgICAgICAgICAgICAgICA8QWxnb3JpdGhtPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbml6YXRpb24+SE1BQzwvT3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPlNIQS0yNTY8L1R5cGU+CiAgICAgICAgICAgICAgICA8L0FsZ29yaXRobT4KICAgICAgICAgICAgICAgIDxTY29yZT4xMDA8L1Njb3JlPgogICAgICAgICAgICA8L1F1YWxpdHk+CiAgICAgICAgPC9CREJJbmZvPgoJCTxCREI+U1VsU0FEQXlNQUFBQU5pTEFBRUFBUUFBMkhzSDVnd1dEaVlXQStJQmMxOHdCZ0ZnQUFBQUFBQUJBZ01LUUFHaEFUa0lBQUQvLy8vL0FBQUFBQUFBQUFBQUFBQUFBQURZUWdBQUFBeHFVQ0FnRFFxSENnQUFBQlJtZEhsd2FuQXlJQUFBQUFCcWNESWdBQUFBTFdwd01tZ0FBQUFXYVdoa2NnQUFBVGtBQUFHaEFBRUhCd0FBQUFBQUQyTnZiSElCQUFBQUFBQVJBQUFBQUdwd01tUC9ULzlSQUNrQUFBQUFBYUVBQUFFNUFBQUFBQUFBQUFBQUFBR2hBQUFCT1FBQUFBQUFBQUFBQUFFSEFRSC9aQUFqQUFGRGNtVmhkRzl5T2lCS1lYTlFaWElnVm1WeWMybHZiaUF4TGprd01DNHgvMUlBREFBQUFBRUFCUVFFQUFIL1hBQVRRRUJJU0ZCSVNGQklTRkJJU0ZCSVNGRC9rQUFLQUFBQUFOZDJBQUgvazk5OUhHRVNMQzBiL1pZWllxVjNuUVZ4TUFXbXpYeHFEVWhlNFhZaDk3V0RISCtoR2RMV2c0bGI0elVrSlIxMFkrUjYzaTBSenl1cFc5N0VXb3RHNnRpUy9TN0JQTW9qMEFKWVpRUzQyOHU5VlJodkJHQ3p4dTIxWVhUYnpqcWpzcVhpSGhBeXBjRTkyRDRrUmxpd3FuSXE2M2l4OU9VNGE1Mm5INVEzVHZKbXVQYk9BTGkxMktTdXFNTXlGZHlqbGIvSDJOOGZZN3creHVCdEU0Ry9lblRvelg2d215SlVBSlltNWZ6SE5OcERmSTdkNWo5NFB6SEJ5eUFqQzBvRCtDeHhtRXhwL3diMENRWktMOFZiMnZyNlhXeERmaHB4ZnpYK0JBMVhUeGJBZjFzdytvOXFkWEdBVkpKRDBwQ3FqSlpSKzhXV09sYmdZSWRzbk1jSS8yaGUweTZwNUhzVVdkb0hUdUxvY1V5YlFBNUU1WUJramlvVXFHckJQVkpmcDVoREdOR3VTUGtVNGc3dlZWa0JEMlgwQWpzZU9IYWFjME1CRHR1bUhobTVMSmZ2NXZUZm1SMzdQRFBGQ3Q5VXdGUDV2VGJhQlNPcG9oUWg4SnBpRmlPSm1aQU56L21uSFoxQUJ2Y29kblArR2tKdzRhNkhENzdOaDJmSk9TRkNKMCs3WStGTGhuVndDQUE3SWlqcFkwWDZWYXhOeHQxbmxyWWJmaWIzSjBJMU1uS0FpZFhNQTBaempBNHN1U0Zkb3g4N3pQNEJqRVA3Q2xGVndlOUt6NnNzSDY3dkpGdk81Z2tBQ3RKQXdTOC9wdlJaUkFKOUJQWDhXbFlsTVNnVkxTc2ZVWU5YNDhxTVpBODZtdW8veDltdEVmWnNaRDdOY3EyK2tYdFRZQnU2MmtEOHozU3NXRTcvZk9SMC8zNVJjQVEwSlRVWXFHSTBNeWhncHlPN2xhblJjcXBpRUxLU2tqbSsveDNZR3kxRXp0a3BDT0FLNGZ6MVJOTWFYdWpoTldhcjVsb2xGSXQxRS9DdUZrbUpPM3IxSWtlOGNQOVFXb1JlT2I1OHJkQnZJRUZBVk9vZzlWWGw0czRPck9wSStPN1NLTU9HNkxkYnFQMGZvVlhPODRtUUNmUUxvdHcrYjcwaUkySm12cUNPRW14aG50dlc3WU8vRGVlOUpPbXFMV0oyVTFya0lZdGgrV25CNGZ2YXJWSmVKY24vUkVDTmtlODJnWUhUZlRWcmdpbTQyT2VBNlFRT3lHZmFtbW9rcmtya2kxUFZiMmdKYkxYdE4zOTVlWTQ3ek1zMU5NUlk2TG5YQ3k0QzVYVlhONDlvU0FFWlZOT01rdlpuR0ZjQk1BUWQrSzlzWFdWV2JNOWZ0MGtNWXJZZHZNRXdqTFpqbzNwT3BnVmZaRWg4YklOdW5jQ2UrQzlqQ0I3TytyT1J5RUpMc2g1UWlVLy9LOFFsZ2Via3VoRjRmSVJrWHBnbXdrSXZzMVBkeVgwWTR4RkFCTWpvMDl0N29iRDVMSVhUQlRhK0hldkFJZWdReWltZWIrSlRWOHhDSUdieVV1b20zOEFsQXJXWkNLTitoWk8yREo5YXNlMWVGcFk4enlUTjJ0UTJCYWxKaU9LK3JmZ09WUDhBOC9Mam5HcTZiakYvTEhTTlhEd2RwNUUvVENUT21aNTFwNHRFdEhScGk2aEFSa1d2NURzSFlzbFRLdk93dG9zdDZJZVEzZzZ4K1VyS0lwNVlmT25SdERjaW9FUDRyLzJ2RUtMaXlFMUJ2TmdsUXZsb05BSXhyVWNpV0g4UFZGOFplb1hHbEhhaEhwclZoSVlvTzRJbFVSZ0RBVkwzeWY1QTNJY2xaemFoS0Ridms1emI4YllpV0hGeEhYMHFsTGFpZGYwNzY2b29VcEVudTdCeDFESW1lTTd0TGdTVGxyNDhGTWN2Yk5YV1ZJeFo0R0lwTWI5d3lKZnlUSzV4WXlNM1NyRXpKdWpLN2o4ajEyaTVvckdtbXAwL3ZNdWQ0NmNzTG1yQkJRRlV0Yk1SOGgweXhmdG1mUFQ0aTdBUW1wSFNrZnprcytWdFJHdkMwbWIvTHIxdjAzRXN1bCtIQk9zMHRIOEo2L1poTUNKOGRhekJvSHpleFpvcWhzWXFqYUticzhJdFJDeDV1UkVaVzFyNm5nVnlhNG1qQlM2R1E2YmRnSVN5UXN3dEJSS0VHUmQyaEdONzliWUpUaU9zVkNpem9id21CSGFORlprUmtGdGRuWXdhKy9YOVRRQ1BFeXJhS1Z3YmNBbk1mVlFUdmlDMzVqWmRXSFM1dklHdWdaRVhJQndOMkptYTU3Smg3dnhXTUJ5M0wxSDVsN21qLzIyTWZCMTh2YXQycGZCdk14YzV0YVJ4TGhkOERyZ2tnNXllVUd0dHF4bXhSS2pIRUVmM0pjVEV4czM3NHMvdVMrd1R5N2ZBL3YxcHhBT2dSOHphem9CdXl2MnlQZGVVZWFQbllacE5JNVJVQXpnWEptY1RLYmRaN3kyMjRscDFjVzg2Vy90RzRTSmhkVmFnUk9va2tnVmQzNU1YYWRBbUkwTUs2eEhYSnNQVkk0ZnlWRExNMzBETkZDdEJjUkFlNThaWDM4dHBxOVMwK1Rya1prdUVVRyttZkhYRGtQWlM2L1lGeXY3c1UxWlJaa204cTNwWWNQNStjSWxZa1VzL29FdXQvM3VLaHBLR01jblVvTG0wUXArdS9sV040SGJIZ2ZwUFZ6YkNmRzNoQ2JmMWRxaGZwZ05ZMDlqdElxbWRNUUxNNC82QlBVdzdaWk5aVk5LQy9IN0U0NkJaTHFuSW1OL0hhOEdNaHNpZ3VsMngwbmhuRzY0WjlHNzNMYU56UUhkRnptZFhvS1JxOVQvUHc5TDJQdDlQdUgyZW5tQjdYSk9kYi9mc2lsWml1TFp2aVYwUUczM0I3dTc3QTM3YVU4Z29ZQklzM2tKUERyODY1Syt4bTJibHZJRTc0YzIwZ1UzZVN1QVhMMzlrYWpBU1Z5cUxzdk0vM2JXS1pmMFlldFZvQUZEQ3F1b212ZHZZRUpmQ2J1VGt3dVB4YzJsT1oycXdONmZtcWVnVjNwNytOZW5pclBodXR6aHpIOEJ2UEV2dmMrak1yOUp0MkJWVGtwbDM4NTJEYnBBL09sQkVMT0h2c0NkMFlUVEExWW5SLzNwTVpHYXJzYjM1WWtSb09PRFJmQjM1dExQU0ZUTm9lQnZEdTRtdXV4RXVEOGhQQkVhdXlXcDZNYUZVMnlFMnJjdnZHeHhZd2Z0Rm03ZEZyWHAwOGlFbDl4dXBsWkhGTDQ5ZDNkbmVxMXc0NDBFWWJVQ25XSCtXVTdlN1lRU292UmNsd2xqTW1OSDhkWExrY0Y4RExWbWJqeDljdUhMRmY2Nk1rTk1lVnhyL1VIVXd2a212TGt1bjBncXd5YlhCcXl0ZGRBN3Z1VXgyRkx6T2krZEhGK2F1OVNKQlg5YU5TaFVZYXJmb2hmREM0Vjk5S3J3K3VySW02alczdUcremRmQUJXWXVadE1FcHYrOUJHRTEyU0sxZytjbnBRV0ZUdHZJbG5yKzQvT0FGTWRJY3J2eXhyd2JDTjlDMXVSV3QyWnl2YXFaSWFVelFxTWhGTlhkdis3d25uMjBEaG1jazY4VTZZZy9CSkxHM0Ywb3JaSGV4QXdvNHdMOG1OSGhMdStybzlVZTM2MUNjdE5lekRVTlVsWDN2dGI1YnUrN0F0VnNLZkVvKzRwbXBjOGszb0VYNlQ3bGI0NEx5TjRyNjN2QkFKcEtpbUIzTndHcTU2c1BiSnR6WnVoSGttMEM0UVF0VjdtajBvR01vSGdXcjI4a0hOb2Y0MVVuUUxRbElMNEtxcS8xZit3YmdrL1prL3M2encxWXZVY08yK0pwaGdYQXNRNTliMytydzdUWlhYbG8wSG9EWGtycmJ0T0xzbXBVR3J3SjdpVzZTNWN3S1FERGRpbmgxcFFQbENwRkFmMDcxRElTcXZFMXdaUmF4ZEFiRWFQVHo1WXE3MFpwd3lFWFBONmg2OHJ6UmZwRDRPTnJsREpqV3FSVVR2KzBuSUEyYjYzQmM2T2JVRWVGUktUUmg1RWt2NThUa0hjL3l2WVFKMklQRGZCS1hVVm9qdk5UVk9ZNER0MHZhWi82d0RLQk80dUc0c2ZFMW9UeFhyN3BteStFUWJXejh2Nk1Ld2RQS0NMZXVEOU12dUNVbWl0ZG9VbkVEMklCTlpKVzdqTTg4YkxQNW0weFV1ejY1NW1Ba2ExeFFMTkJLUU5ZRFhjQmwwSTlwTnpNUm9hMEY2RnZHR29YYmhvTldrTzFrbXJNbTBvZVVyekx3MFBFYnBTRDlMSHo1Z3RNZmdPMFg0bEUxeHJ5MG1BTmhaL0F4YzhMRXJ1SFRESnk1Sjh2YXQ3Vy84OTIveGorMFdtaEwxNDZYRjRkbUZQb2h0VzRVTmV4NVN0bVdxbUdVNGc0YXo0UTUwbjljL0ZQRnBzekoraVNKaTRKR1M5dEF5K09HRGduL0lTQ3VzeXdRZDRPSTNDRHV0VmRHZ2dvZmxNS3ZjY2x2aldlUVZWaHJteFNnU3FqMFQ3T1RsdndvUEEvUXVtUEFvdEFMMTg5Y2J3ZHh2TUhLZTlhWFozM2t4RkhTUUlodVdheWtHeHR0MGRqL1ZYT1NpeE5EVUN3QStRb1Nhb0p5WXBLS2dNTEgwRUd5VjdPM28rQ2licUZ2RExsTWF6VUdZd3FIQWRDOVlSVG14QTdLREhNdFRGeDJXNXF3N29JSkxQSW82ZXdPMnhZQ0pSWFVudzUvdDdPeHZxZWdWT2NyVkgvdmw1WlRzN2JDRU9pdzI0REwrYWpQUkVqVEd3UXFySlhQSEVqUVZIcy81bndpYkcxK3NIVnpuQmEzSW9KTVJ2VG9xT041c3JDSW5RVXU2MTBVTUx1Uk5UYkxqbzRTMDhSKzlGVnFnZzZjQ1ZDQTAxKy9qWUNPODNmQlBWTWxkTHBOUGZTbnRTOHE5V21sMGdFeGNsYkh0R3BOdzZpSUNUemhSVUV5MVd4a2U4bjdBajJDbkpBN1ZCRXJPTlQ4UHE0bEx6K3R4LzVwdmZKcVE5K1FXT3BBQUVZZUdiYkpTMFpEcWg3NFpQOXdOMTlGMmN0ZDY3cDg3bzBLZitzYzJPMTRPeHBoaTVucjRDRHoyaVIwL3dqRllJVHd6enpDM0dEb2QwM1RFU1F5akdvbkZhQlh4V09xVk1Xck11Ty9EM05iSnpqSHhSQnlLcnl5a1lLTVYyeHBIK1Bwbi90OHJMa0lYSEJsS2k1QnhTRXZIdDN5d3NtQ09aL3E4c2E2TWlZeDgrWUduZEJJTmZVS1A3eWJSYkp1U2lCTDVTTzlUaG5OV21hNG8wVHpTMzZMajNPWEltcHZSQVFtNTFnSXp2UmlvQUIwU08ySExpbnhRUUtTa3N1cXMzUjBqT2xZbG1nd3JBQml2endqQzgyQ2M0NmhtNTVqYjl3QXdCY3hUekdCUWdKWG13OUFtZm5WY0tPUzExRXdCdFhXRWxBVmtHQ0JaTm1JVXpzTkVEUlo0aE9xZk1ZamxDY0tsTHB5aVl6UWVJUzlYMkVjM1dEbmNENlNuMzlROXAzQ05rSUhYNkNEL0RwZTRpdDdNYk1YWC9qVVN6ZDBOSFJyZlRIMU1HWUJzM1V3ckkvSWkrc0Y0aEgzS2xKajRseTlzTVpmOUhHcGVMNzZFZ0RhdlBVS1Fuakh3eFdxOGVNRTRvMDhZL05nTnFGdXpqbGRzTmdDbE1IcUVWYUJxa0xlUys1UXgrUjIyVkpwVUEySUxoNmozS054ZEp5Qjh1MFpsdkNXUGw3bVRYcktQYUJlZjRoNU9uWFA3SWpnaG9LZnRyRTB6NklBU01vQjhmQlR2T3hXWmg4UEU2TWlQWFFLcHNDemI0V1V3Y0pWMnBTQ3h6ZWlzeVlSYU1zbWFiWkkraCtYVTFNMFdjZ3lqY0t0TkhjbWFtSjdMMHpaU2ordG9zczU3d0xXVHNwRlIzL3hmY2lDcHBRZ3diZzZ3NTVzRU1EMjNwL3luRXNJUzVhbDdld0RuZWhOSFp5YlBCUjZRcXprb3ViTWZ0S3UrMU95YnE3M2toc244OUdPRm9tbldCSGxiNFpQWFg1emRwbm92aW0wWDNrY3NaZm1tcTA5VE5keFJicEJjS0ZiTjFjUVRIU0YzM3hLeDR1ZHZ6VTBtQzRRNjNCT0w5UUg1eXpVR1VHcVI5V2EyOXJySEpjaENjS3VMV3JZbmx2STcyZ2ZYQjV3K2MwRHpWNzE0NzRCVDZySHJrYXlIcDVpcVJxRFpha3VUVVlVbmRxTDl4WnN0VVlLTXJKelVLcWxmS0xTVmlxKzhHQTlLNTRxYlhMRHlBZW1YMGhNakRsbm5qQXRFdGEvUklkWXRSNnVnL215U25qOEd3UTNHS2VJazFVS256bnBTcE00NnF6UXZOY0hLVGZDV0xBMVNDNkFmNjBRdElDbXBnUVFCM3cyR08xUGgwL0JHZzFvMDVwdzVLMnJocVBoMThqajZYc0ZHQVJudC9kWU56RDRROE5ESkRldWw0OG9FRUNwdXN5Z2tiSWFnSjk3ZVo0L0Y4Q2xtb3drM1o3TXNDU09FV3FuVFZscTJ5Q2IvMkROWGoyMFg5d0tmYUdwYmRuamF5VEJSWC9wc1J5RmpJdndoeWlycFJKdlNJV25DTzZYcTZEUFBsVVJQbW9SbW1tOWl2eVdDQkh2U2JlWWcvNFczNGN3Ylkwak5EUHpOWXVRZDVYYmVFYnZmUU5hMTVwb0Ezb01Yd3RXUUZmMmEwV29YdnNmR0lrZ2xIcU44NEZqd0NWM2xXa3dhUERpVGhTbTh3S0tWRHR3eDVndzh3QzNob2lmNTVtT1dhU1AyMWw2aUdwZ2IzUGhVUkIxaTR3Y1RlNmxGS09XVHJoRUVmREVVTU9abTE5YzJDanBJYS9nUlkvWVJJUm5HdGFDMmNDMXBMQnFOc1lYakVOQ1lydG5mNHZIY2ltaEhjRXhLN1Noa2RUdUJrc3pMU1hCckUrcFFDVHFxcFQwR0gycGdXZ1drNVRFK2cvbE1WWHpUMHRYNW41WU9Sa3FlMGVqMjlVNy9BZUZhRGs0Mjg0ZE9VRUNHd3JZd0tVczAxenlmRWtyNmdlN2g5ZjZWT0lvQW9mNjRlci9QNGQ3TTNnTDVFSFFEVEVRMzl3L0NaWHFvdUpvUkRlbGJXczVpbEF4c2MzWDdmUnRsaURiQ0gwdkVsdFh4NXplaWVwa3JvOVVNczhyMW40WmhwL0c1UldmUWFoYm9GNDZ5ancxeGg0ZG1RWTYva1dlT1o1bnRKaHZBL2wrRWgyNVorSzVHQVJ5SDlRSTVMYWl5cUwrbVViVFZRaW5XNVQ2NjhjRFBOTVlKbUVCMUNmUzlGY3AwYlJUbkVkQ3VUNUVUbnZHVkRMam9XTGdZZDhwWnBtQTNCWCtTa1hTd3dCc1ZLZFhRalpjU3ZEQ2lSL0VyZWlya3EzREFvME5LdzZRZ3ovVU51T29RUDdkM05EZk1VQjlTNWFHUWoxRFhDdEpnVzFuZ3NZbXY3L2V3N2FNdC8yVG1UQXZwME5ZTENXNVNMeVZkVmhBbm12VnBHMEh0S09lYXlOVmtIMzY4OU9KanNRS09CN0FBeU52Tm9CZ2JTaGlkaUZ0b3NwM0dNZXk0QWRjeDBYUDZyY1RBcXB5d2xpVzNmNmMzdmZxeGRmdXdTUG5ic05oTDloalp0emwzRldmYUxJMm03b2dlclRHazhlKzU2ODFLcUJHcDlPSURNZTJFS0w4Z1NUR3dtV2JCZjlnekNCNzJvWnBtelB4Nlc2dTBETnFLa1VjZjVtcExsVXliS3RKZHVMSXNKSzN2b3NYM01uTEYxMEI4UFl5V2ozZ2JGZVM3VEw2enJOZSsvTHZYdjdBa2hUWFdlSkN0Sm1hUHV0MGhLeEtCckdXTE5KYjVXcXRTd2pVZ3J5VngyNTFUSU9OOUJmb05pamZ2THBmWnkyeDZzelJYY1oxZlQ5S0JhZCtmNnhlTTNoU0dBRGVBT1dVMHVhM2ZROGQxZk1GREo5V3g5d3hYN1NYRmRPNTREbHpiY1dEWDBDdlhPZjI5eGQ0d3c0Z2V2WUF2RXBVQzVMcTU0azQveXltUzFWYjFLa1RXN2NXZTJkWkZ0Z1lLUFQvSFNqbVJTL0JHVFZrdGp6bGE3V1A0OXU4MGE1MG5nTkduUFc0TFphZU1OVk84a0t0dGI3OEhscWk2RWU4Q05aMVBkZ0tBM0pYKzZOMDBheVVPVkF3ZWpaZ0NnUWRKaXNHZ0FKcG5LL1pWRWtWV2hVNEdxUThvYlhhK2hGZlFPZCsrRVhUbmt5bnNRVURtVzF0TkFyVUdvZE1GWGwwNWlqRkVmaHdiUFhjcThWdllLUm5GYksycDFob1V2SkxPYTFERnJnN1VGY2pTOWh2SWdkaVNyTlVnak9QbG9yZGhCRXQ5NWgxZW00SFRwcHBCM0pobVpDME5yLzRvZHE3cWwxQnByMEhZdmFPZGdYZE9FaHkzZGtoUFpLMVhjNjB6RDFqQmhlN1kvODYvTE8xb0toemw5S2FMczd2eW5taWVwZkxIYjVDdXJ1VEthS2ZreS9aOTF5UTNwMk5nM2NTeVRrZU5WUHJQbnRZME1hZWdKcnk5RXZPZXIwcUpLYXRtQUNnOHVpWjVXUjRnWmtOQkUyeGtyR08xNm5LN0hjYXRQeUhnRFZDaTFPc2hBOFdCNGE3SkppcEs5SFhKeVlJcHkxcTBObE1MNC9BcGdFUkJCeDVWYkVPVGpMQ2VVT21lQ1dPT2s5djJFU2YrVWtxTTczQnMzQWljdHFyZHd5U2dVV3EzdXFwYlRmZ2JpRU9BMjRSd1pROWFOWXFORlk4Zmh0V2o0TDhjNWlzUUEvU3REbW02dll1QzNXVzZxTCtLREhhVjVyZ2F1M3hWUGE1ZWlZOW5GbllTOWlHUGsweXI3VFdDZUFpQ0l5VUowZU5jVzNEdnhoV0FyK2xYUTM2cFBDYVg0Sm5aM1NDbTJ6SEprMW5mTm5ibEdYWE9MMmM1b2xLYWJvb0hUM2JqM2djNmpjbzZDTWNYdEFJU2w0VzlIWHdPbzIycXV3WmN1eGVKYzhDYXNNQmczc0wycXB5bnN2RHpHMU9GY2ZsQkdiOFJVNGlxSmJERStaT0RpZHA1NUgwT09vRnlCT2lGQjB4OTgraCtBYzV3TFM4UjJYN3MybHNlUmgzeGgrMVRUUDJWOE9uWHlqcHkwOFJFaUt6ZWo5VThWdkp3SU9jQlk1RURMRjVLWldQazkvbFBHYVlBWG1vMFh6aFZQOXR2R1pxNEgrdjBkeGNlVytkZjJINlVBNWF2VGs4VitGRWwwekpoeDRDV1BRSzVJaUFGR1I1Mld1VEp2eHlpTUZKekRPWXJBMmNCd1dVTXVBUktpUWU0N1hBdEIyMjAyMzB5ODBSazdlMEREaE5IbWxXcWlaemhPMUkyVWVUODFVeEpkM0d0SHJNa1dyeWVFSGMwK1AyZlIzWDAvVkpuejlXNCtUWHVQMi9TUmZzOWRQOXV2bDlWbVlmdCtrTC9aNjUwK2ZybGZWWUFNYW9kbEVuaVcvNHFBbkxTSHRoVmg5alZQQ1htRVFGaUZNTVpxZjRDNTZmZS80WkJESzQ1VFdmdzVMVTN2UjVJaHJQQ0w4RGNGeWZlWnVNcEhVc2FRMkFoaXRVbVllNVYvNXJ5c0NvYXdDOEU2ZURZMFl0RmhqT1pWUUE5MFA0TGRuZWJWeFlwZmIxN2NkUkVuN3pnays0cTJUQnJlb2hhVWY0R0RYQnRZeEpzaURCdEJ1cVF3Q1o4TSt1RVl1SGJzUXQ5eFdYdWlwNGNIVFkvQVVNMFlrZlhyNGlwbG5pSUpNSnp3d1lrSDBXVTk4RFlhOThSaUtxNjdoMUpnVUlaUWpRRU13UUZpbTIxS1VzSG91anRlQXYzODdaZzhVT1NDekt4MHI2RDhOcXdveFVXblFubGFNYTNUMk5pQXl4R3JRaTJ0d1pJbnFTaGhWb3NFZXdSaW8reHlwV2EvM0NzL0FiVmg5LysveWc3Rm9nYlhFMmJrNjFKZnAzOVVjbzFiMXRWdWUvN0JnR2V5ZVdnaFlsWGdKS0pOMXMwTDRCRzd4WE9FcSs5eGdjSy9wMlB3ZXFoSTBub3JKZGhRVHU0Q1VibEErZkgwSlRWU2dpdUZ5UXVEZGRDUkxEZ0J1V0lxaXQ0b2NRN3RxNWxnQXVySnQyMlI3UE9WRDNDZ1FuQS9kYW1DVHpGd1hkR0RvakVmOFp5dFhNblBLQTZlV3RKck5VRVg2bzlEam5VNzVNS2grb0J3WkxOQUlEQ1pGQ20vaGJqZ0gya05LRlV2TGIrWE9pbWVZTzRRcVNiVzNZdVBxb0ZiamJ3cGNqMjBzWGNmcTA1Nkx6a3lHUGVnVDNTbDhCSDhkR1IybXFkWldpSmFPaCtqUkI1MjhpSWl0VEpkTlhjRktjcFo0ZHpKV2NrcWpOV1pNWXlRYmcrL3lJVi9uc29wWEgxbE9RQ3ArNVo4N2o3RjEzM0E0YVZHK2kvWWVlMEp3UGVXbVVhbUx0SWdKa0liVEpvTFhoaVBOb1VRWnVMT2VqRXB6eTZTZWdwWWc5eThGZ0huaCt2L2JKVm8xamUvM2Z4UXdEbVRMSGJIdlNpa1BZUGZTQnpxVkU3b2M0c3BqRExleTZya1Y4b2FCbHhETk1EOE9mRkg5bktWc2l0YXJOSzQrczlBNVRGaW9Zdmdxd2NTeUxrbjF0SUlTT0srTXZaaFN0M09UTnF2YkpFck5aM3N1YVp6Q0JmMkpTR0JtdTV0L0psdUovNm56UFJqRnY4aUlTcEI1Z2pWRnRwa0RQa2VGMUkzT0J3K1RjbjZQR21BVHJTcXBNN1JGZzBYOUNGajlBcjhkTzNxMVlOZDAyblJBRlR1TThUclNiOXJzNlRUd09nL21ITU15cVQydVkzMmtUeXFhMU4xK0dmbjRxYXBQYlFJZ012WTVXWkh0YndzOHlac0t4eUtRL2JiYjJncDVlUGxpNWVJTGU4RHNQUXNBdWlZQTgyVU1iekt0TVZZZTk4cU9hL3lObUdTcFRWYXVNbTAyM1IxR3p1eU1YNURlcjZnQzFDcTJLWWRGcko2Z24vUnRDT0N3Rmt3N0FQcmxpV202VDRBWVZ4TUpycXNndVRqYjFKanZtb3Qxdm5NL0YzZ2tFOXo3TEVXMkkyZy81R3gyd29JWFp0dVoyT2FsOU04dVI2OVJTZVNBaENIMEFhNjRhWWVwNlhSV0czdUtFTGt6bSsyTmY0NUxoOUoyempScVZqNXFjZk9NcXl2bFlTVzByMk8rbkhNSTQza1RWVmd5RVFWRHIrWUc1MFhDTERVc2cxV0p5Slo4S2wvY1c5bzM2aTVYYWZwdDF6bWw5VU91UzZxQzZzL2hFQkdPY2dkU21pTE9oNUJIYjFjYS9RUFpnNElITS9Mcy9CZ0NMUTlQL1gveEU1SmQ1a3M0K1FoUDlGdFF4UThCT09oL1VJTDNpd2RucXFXVDZoNUI0dTkrR2tWUnpUYlNCYmpRRVhhRFBUb1pRRS9oM042UHo2ZVp5NzRIaXpRWWt4M1NsZEE1NmJ2bkVyWHNkRk1GWnZNQlc5ZUFnM3pSbnBaTnRFang2cll5dTNYeC81UG56VzVaZzdJd2VtMzV0a2UrZ0pwRG1HQW40Yjl4QS9Jd1ZFUlBYaFJSUmRNVUxHdW96YXhoczlsaWVudGRhWmpDaWphaFlWb21rMGZJNEIrVHNZdFdQdGhIeFJvaWE1ejJsNXN4MnRNRGVCbGl5NWF1Q2VlbTFySC9qWGdxSE9LNzIrVzlrUVYwdjd5b21WYVIrbHBFVGs3VWtaRjQwd3kxcEJaYkVvUnNUd3ZqellvQkh2TFExZnpDeG1HWjJ4R0p1Wm1VVHpCZWFUSVJ6TUhNdlBVVkhvMGJwVG1mMUZKclNuUTQ5QVdFY1R3U2oxTG4xckNHcHF0SEw2REpha3RseC93ZGUrTlFtbFc1Wkwvb1FObjk3cXhLT0ZERGRWYWJZbDFXTjJtR2JNWWhJb1dUMHZ0K3c0YzFnZmlZeDhhVFJSNTFQUDc4aUQvckpicTNuVVdzVHJBNjdESy85RG5rZzl0OFhMOVNyTzJSU2h0R0F3WkxRTS85Sm1EMDVCeWoxT1lBM0tSV2F1QXRpMWxDZmVXSDRHQk1DakxIOURJVDFIZlF6aDhBdGdVMEZjanhRb1ptNHdTR1plU0hudlIwM05SOFZYS3B2WUdpS3JzV0gybXhoL2pqcGpJUmdicC9BSHp3V0Uyc2x4ajBMckZuL0ZYbyt2KzVEZE52aDA5YzA4eC9LZFNIbVZwVlY4L0M1Zk1lczE2aS9oZXl6Rk5za0s5VDVnRXkya0Mvc1FBby95QzZnSkd3eFFObU9oVzZiYzZiVFpJaWl1UGR6bHZVK1Nnb3BEZFJ6RDBLT0lob3JNbkhoeHY4UFZSNG1LWCtWNlY4aXRSQmx6b3Z6WW0rcDJhSWZ3VG9pUmMwenZWZjFPWC83bFUzaXRsZTV2eE1GajRTMlM1ZHg0OW1pbW0veXN6cWozWUN4WUllL1NGRkMzdFNXdHBKVTUxV0hPdEhYa3RSSjBQdklwL1Z0SUVhbkd0b3RvcTh2U2lzbzJkQjFKajF4ZEk3RElCRVNGNlQ0SjIrR0FMZENUMlhIc0hVb2kvek1MZ2tFczd1RE8xeDlRMzk0ZlJPV3lGeXJXY3dwWWlQSHlvbTFET2czZ2tBWXhJM1lYTmlhSFVhUzF4VjFhaEZuUkl4U1NnUjAraGxSMWcrL0ZMUGE2cWZvS3lyVVE2MG1Ob1A1Uy9xbldJeXR3Y2gwZUY0blV5SFkwNG9VRldyaXlaN0J4SVFGcm1XMUt2eWM2d1NZekh0Z3hQN054cW5ab09Ddnhwby8xVGk5bE9BWHgvYTI2cUc1OXVhUEdsVnZWalgyRHRqTTRVZmJyRTFWRzBzWVJwYVFnVythRzZkMnJCMWw2emNocmUwaHliYm1yUDBmMlhCK1FmUlVRZHkwTUhVSlpjYTMxTGN0VFcxdXp6Q1p6WWRxYmVJWU9IOTFpbGFlNDVadGh6VEhuMmtORG1neThWNmtRaDB0KzFHdng0UzNYSlp6UDhCbG93cjFGY0FnL25oblFWb1Z1YjJpTDNuVzF0T3YwRG02THBnamFzd245TUgza0kza09mWlNicHhmZmVJbURLdHYwaFVmL0tvcmJsbkZoYkpkbDRXTnBoRWt4b3Jlcm9YK0ZpYSthU01hTFpsWHFjcU5PSkpGK29ydnFrZVIvbG51Sk05T2NmRnB5cDNHMTJiMlJ3THN5dEFTVllWb3kySGlSc0MrZFJLQU42YkttOVJxd1cydzB1bG1SZjNhWnlaZWhBbndqdk5kbXNqdHVJYXhHN1VzVUI0UWJEUUFZM0pyMEhHbWRKQmxwMVZxWkcvQmplQjlVREZsaGRMRkNMODBjZG5adzdHNEQvZWgyV2haaFlsb1ltQ2d0NmpBemc0d0NRc0FzZ2E2OEtHeXR5dEdmMnNBOVAxVnFRYWxsZEtmOHpvVVhqR1BCaGtwK3hobWEwRDdjK1VYeVZhSGl3RlpUVk5DbkcvbkZiZ2grVEJjYldFN1pqRHNUaDVpM3AwMmxIOXZWTmw3YkJsZllXM09qbE0vRG9iUnBSb1lncGYwZW9TUWFIZFo4NjN3N29RNEF1d1RBUzdXK0tNeFRVUGdvbEpyVk8rcjR5bjMwTEd6bkhXZ2k3S2xrOFU1aStWU2I3ZjNJbXlCZERXdVVOM2xMTkdQNVJaRWdQOGdQaWRZNS9GOEtXRTNHdXBDMGhmcnU2akdwYWUvUnpWVEdnTVo0a3pldmpjaTBLTFNXcFMrUGN2OHZhaU8rVFNaVlI2MU5ralkzellxRFZGemdhN0pXSXVOYytuQjFlNDNlTmxPZHBaY2pHRk5aQnF2dWl3YjB4d0YwQUQ3TzZjd2xqdzZXUCtCYlFaY0QzajJvQ09sMUVNUWxwTGFHL0wxOEkyd1dPYVJtNEFheHlGUnBDQm84T3R1WXBWYTJOM1ZPMnhFa3dyR3ZlUGxmSzVTNDNtbzNMdmtBc0haQ0ViWHptQk1KdzJJSWc3QXNSb2dacHJIUkhtUGc0ZklMY1F3MjRNVm5sem81SXh4b3pQUEZyQUpWbHhmK3Rvdk5oOElMTW1SWHNteGx6cWNYblY0c2FnUFRJTmQxNXZhYUR5OFp6R0dqUUtlbmJ3ekdjUzVySCsvL2M0TVc2M2x1VFZsTWQzZktucFp5SG43M3N4TGlPQVdQYzJWdmRjSHF4SldlR0JwZ0xFSnU0TS9kVURzMEwxTERDYlVsT0E5SWt5d2R6akp5WmU2OFhTN0dsWGZRK3pVODYxQTdrcHFoMjYvWWhHSlF5RWt6ZFZJSHFnWng1WjNPcDR5NHRxZmxFbFlRUVlQM0hCaGZJTTZISDJkc2pQYzMwSGdFZGdCN3ZRM3NvNjlweFFjSWlwYVBRRFVtOUdyeGVNSjg1MFl3QnFvaSsxU1dhYzZ6VVF0NkZFU1JYN2JaUUQzNWswckFTN09SWVdaQ3I0RXUzTEZUV0QrRGNYVmlOZ0lXb1ZTTlpHOWhLQ3JLRDh1bUZSMkNpaDViRkJGUjVsSXJETDgzVWV6RW1OMisvZE9SdzBkNTVoL0EwdUJ5NGV2cUdGcGcrbE8vclhhc3EwRUdJSlBjY3NKMndWN05FNk1WdWcrQU1HditDV04zVFlSUm11emFjdkw5WkVqMGhSYktsTzlpSCtweXhlWEduVkpuZExxUzlHN3JNaGRPWi8vUEt2dGlOMUZNYnVRcGkzaTBqTUV0eTZTQ3M4Mkt5NCt6aWVoVUtpdHZNSGVEVkxYdUs0NFJmQnRrQk9TSHpYbEZKdmpLZHRwWHZqSk1yTkZiQkszN01pT3J4ZFluOEVJYlBSMitPaFhVTTFLQTlUYzlNNitud01lYnBQMCt6YmpyOGpBYVBmVVZVdW1PYzVRb1AyNEI4ZFBIUmlGbTFmRy9zekNHclNycU0vWjJ2NUtJOGVFTWNlRmpySkZhaGJNdmZvc05pSEE4SDZrYkVwMkxZL045c04zYm9hU0hRa1lvT3doUnU3R0NtejBMSkRXNVh1U2tNOTJJdEhlRjRDRmFzQlE4d0hwdEt5bEEzOFU4a3Vjc0ROQytQVHNhN2tKdXprQlR4U1FBK0ErOUNjVkpaWFNhOCtYVndsRjNnZ2YrejMybnpBdlRhdWxuTU5LQTM2TkNIdkRVd2tsOURsQi8wV2luY21wc1RyVExodnY0TExPWWZDamlMc3YxSUhZOTZMR0pGdEFhMXREWnIvbnFMcUhFWERkVDdkWlIwZnJWK2NFQVRGbGw5ck9INmp2VWZRN2VwQ29mcHdibFQ3M25HT3A5ZnRONlBEQzViU0dsSUVQc3IvWlBDRkpEWVRzMDYzOW0xSmdwV3EvVGZCMnlTdkhMdEtRc0lsUFZGQklQTC9vdWNIRWY3VHVnczg1Z1JGTi9LWnVwOEFSZzdaVmNGOE10c2dzbC9pRU9pa2ZJVnl6azhSTWkza3FZeFp2T3h1VFBtWEp5Rzl4TjAyY1RSZ3JFTkNIWXdIa1Rxcm56aUhRT1NxNC9yc2xQNFN3MW0zVVpndkhjdEJtUzBKU3poUnByRDJBdU9KYUVHNmkvbDZ0alZjK0RlcGViU1krckI0NC9PdHFzL3kzMTFYOHZuQTNzenkvNmhOVEpIK1J2d3dGRzNEUzBmRit2eWRJOVFINGlrOCtVVW9KUXQwYi9ZREUvZkoyemxRekg5aWIrdW9GbkN1VFR4Yko4RDZmQ2gzN0xORW5QSHFVVGVBSDk1THY5YWJKWDNEQTlhK0IySkRJUE1KZTJnL3B0VkhYclBjN0FrWVRZajBvdVZ6SkZPUjJlODRSVlpoMVExb0VQbStnNFk0d1VPMWV4RDRYRlhpNWo2WndOdWF0ZEFxTDZzcUZmK09pQ3NJeERnSThCeWRjeStPK0I0S202aldaYWphbmloZjNtajJ4UVk3K2ljbndGa1JWZW02QTRUbmpBbmxzczRzMGExSjRRZVYweFRCaGo1RlZCM20xOUlDdzFtSm11YjRNUEVDVkpHRTIySzFMRmZWcEFzeXExQWpMMHZ0MXFLb2JrSXlMNUx5RFZLYm1VKzl3MVRXYWJOcTh1V0xlblhVaiszYnBTcXF6a1VYOW01dk55ZWJQZHMvRXpraHdjSmNQREhrdnMyTjFGck84VUorckJmZDlldndPRGVPZFM0SElDT1ZSYU9GazdnYUVrdWk5V1JEL1dYbXZJRlBNcUIzdys0VUYrSjZBckJRUmZXMW1ZQU54c3I4SGN2a3k1WGpFTVkxZHN3MjBTclBDODVmOXE3cUhCUHA5U3p1em94RmZlaVpHVmFWOVVONG0zcm8ycU9TVDJxeHdZdlQ5M2hOUk1WMCs3YUVpejVzRXZDQnl4ZURoR1FNYkNrZVN1VTBGZ1RDZnY0Yi9US1EvQ3pya3d5VkIveHhGT2p0Y09IU1lLQXpRYVR4K1ltRDN4ek0xYWFZMzl1dWtqTHA3M25teCtOSFBjeW04MU1tL09VWlVjNEVGa1I5NVFwM290b2M2VkZleHZzcWdlQzB5V05sS1dsU3RRUDJsdHN6M3l5THdabXVNazEwMlNQcWxjTFhBWTJObXJXT1ZEL3paTEhQU3hkQXpVTmdmWmNZVmpBdlRuWElkRVNyYWdxeDdDNGRPamxhNldBOU9Tbk16V1Z1blBPZ2trbXBHeFFJRzA1NnVieFo5akVpQk0rWFhsOVpuZmQ3Vms0cDA0QWxWZXhsVEFwa3AwelRxTURlaTR3TFU1cHo0eFIvRnlwclgxNGxEUGNCSDlsMG0yYUdPMDJlR1ZzOUZFLzhneVgwdFFvcC8xbDNQZjltWGlKRWJON1NDQmFGTEVDVStiZTZ5RS9VdGY1OEl2TWowY3hjWUs4Y242Q012VWtDeHJxMHMvSDJDVjJsOEIwMlFYMWVqcWhtV0NlS3pvN1hkL0QyMVV0Tk9IMjA4UHk3T1ZuOXNKT01aeTFPa2JqeE5lMER0OXdqaDhMVzNjdzR1TllWRi96ZkMzcG14MDdMaWIvaW5pd2lHdEd6MEJDd0dRb1RXcmM0NXdJcnFva2hiNFJXaDNTcHQ5aHpDUVd4WHk1MGQyTWxXU3UrMHUwbWtDeCt6ZXZML1pOaTZ6SGVWdTVKRHQ2Q0RHaUtOa2dCcDN3empTYkJ1a21sazgwb3IzbXNmMlBNZlF1MzhtTU9mdGlwY1hqb3B3Wlp5UVl4RVMrL2pCaTN1R0lpQzdId3B1bWVmZW9Eb2dic0xTbXNSYkg0ckxZYWl3VkJvczVUNUxuSUNpK3prdkFXeWg0UEVKTnM3RG02UXlqWDNXOEtYNUVNajFNNVlqbjRrSzl3Nmk5Y0phOEpGQ3BuL1doM0gxQ2U1RDlhdXhEaVF6eXlxa1UzNHhhZXRxMThSNEp4TWJ2UEFpQ09jS0wxNktlSzBvUTd6ak1VaWRZWDFqU2srWEg1SVFFMFNoRzdoZ0wwS0pYSmlyQ0pNbVJtZE95MDJwaUQvUkY4aWlhRkcwcW91b0RJQkRCcSttSWxTV3hSaHFBZjNHcUQweS9jU3lGMys0ZDd6UzFlT3poRkg0SGpIY3VmNzVrUGtCYURXNWZUWUpvMjVkZ1N3NWI1RU9UQkZ3eURYS3kwMnlPS1U0U1BWSVoyOFk4YmFZeWFBOENHeFlTT3AzMUNRZGJTUVAyQldaSkZ0akRkZWcyKzRVSzNUaFRnVXJqYmN2SVRyZjdlSVQ3RDFjNnpuVDFuK3l5dHl6L3JPcVdhcndQOXpvL3lOVTRlQ0NLZWMxMmNGZlVYNlRvZDJaREU5WDBodzVPcDZoTHArTkR1SktQbGVxVlR3N09ML1ovT0N4Y2QvRmxFUDk0TXk2cHY4elNaWnBhQ242OHk0cEU4WlY3UWVhVyt4YWMweU4vOTJOOXFmajNOTzJDYVE0K3Z4V1hhM0E5WjBqRVpTdjRKOWh5Z3VhYkpUdDRaTmticjVDank5aXpRckkvNUhpN3ZDbzMzVjVJNVlPSW5jTXZCWkZVZXZkV1hkVnZTaXYvOWJOa0hjWjR2UUlaWWloNkY1TktTY3RUV1hBSm1ZaGs3QUR4c21Uc2UyQjhwZkxMQ1A1clVqa2h2TmJZWFJkWlRlV3B6K3plQnl3SGR2TElzVFRJekc1bEhNcDkxN3lwTWFnSnA2UVlpMTNrbEg0emN6aHdRdmRHK1NtNmQ5RXJQd1lvK3IyV2pyMGdkNW9lc0U0VVRFYTN4SVFvemJqVFptaHljQ1JiVDBCNE5Ga2ZGZ3F2V3BucW13dUZ1QXArNXI5eWl4NzBzSFllN1JvZHlHSlU0V0R3TnBEeHJaZy85dm1sNU1uY1kvaDhBZG52OWdwamt3bWRwbkhFRU1OejFqc01SQ2tlS0RPZmtBSDdZRkpveElzajJ3UVZoU0QwY1RKWkVMaytIWGtyL1VodXdGUCtoSHZJQzJtci9Eam5hR1BYOWNVNEdsZExTQ21sdldORXpVZnFMd2lHWHFUU0MraTdYbVg2ckMyM0ZvQnllRGJjRkpzY0llN1BmVFdPQk05ZnQ5SVgyY3hmWDM4UWgxNnJJYjMzNVZlUDdhK2xKNE5UamV4cHNUdmJrVlIvdGF5aFVyekFIc3NnQ3c1cHF6Smg4WFN2dmVGUlNqV1d3QjlVQlRYZjdtaDViTkgwTEI1TlBydlZFdmc1L3J5UkxXVzhzeTRSa0JXZnR0TnhReWxzR3N4SnZzOGxPNEUwQWJZeVIwSVRidm0wODJvRjdaQmxROTNIUlZPZFRMUzRzck50Y3U4V0JySFQ4TWxhakdWRzRsaHNaK3BnbU9mWnhuNTZTQ0hjR1haOVZwd0M2Vzh5bi9HenBhY2MxdUl0NUFCWjJWclRhS0dsUWpJYWgxRGZkWFQxMmg4eUc5Y1p5OXU0MkU2TEtLTWVvWVZsd1NPL01jVkZRVkREM1JuYlFJMHBWT2l4L2Fjbld2dWVOOE9ScGI5VS85eEpoVDhmdDVqNXFyVHA4VG5nalNHZEt4aGEyU3FOK3hHZzcwdXgyTEQyNEFRMUZlck9taHRlNnU0WHk1czBYQ3gvRHoybTN1V25VL3pRWmJkR3RwS2xETnpKZ2NZODNGUWpFck1PRzN0SVFOYTJuWFJnNldZQ0NNMjA4UE5hVnh2VFhPOS9nckVJd3FNZFNSZWRZVUpzK2t5YzVhM3d0a2s5VTJwSk4vSlUvSkI5MDMzYi9qT050T3NwVVRzaVJrOXZIVjB1bVdRVzVXVUtjS0VweU5FSy9BWDhrdlpoL2JkRzh3eEphM29NRytOV2dneENEWC94TURmcHl6ekNTbUFmNkR0Ym93MjNUcFQyQS9WbG1pRVBuM0RWZmt5OFA1WlIvbldpKzdmYW4wVlRiM0RXdCtvWWdtYkFFbnpWOGVRYnduQ1VlZk5sZ24zN3dnUnkwNUZhV3FONlcwV05BMGk1d05ZdFJ4SVIvcnlOQlVaYWFhVk1hbzBmZnUyS1J3ZUxkRHdwbVJqWGVqN0lHb00vU3JQLzAyaHZuRG0zNzBNYlBCcnFBTGFoNHZBcFZCak5lN3RqYTNlWmlqeUZMUnZYeHBtcEhMM1ZOMzFUcFowa25tSy9KS1Qwc09QZEJPLzBUU1NCWHYvRG9KUlJaQ3RteHhDUk9pYzhWdlM1c3V4V3JFc2hmdEtxQ3pCSGhCZ3Z2T1Z3VWJWakt1SUR6UFozSFVHU0psaG5UbHlJSnE4WWZvTjF4ZGtrMzloaEYzcExHT2JIekh5b2FhRFpWQjdmbVpGWFFZemlHNTdFLzF3aEU5MkdKeHNCWUY1eU9mQTZXOE5ERHBHU0xmNC9IRisyN2VYcmpNMWhXd05iNllONVN6VkxBSWJFamFoNm80Yko0eW9OcXlFd3NOeml2MDgyUXJwMUkxWjFrc3lGaFhia1Q1bzYrUVNSd2xjRHRnbWxhY1JzaHhTREs5OEZvazEvbGhGbWtoaEliT29Rdk5tWFdjRVFvNzQrL2JieTFLOGp1TEFmY0JYM25yWVVCWDJ6VzA1bkRZcldTSnZCVDlkUi9vSHVBUmJqbEN5R2x3aHBPTzAxWDltczlFRGJCbUtvYStBMEN4SWhMRTAvOFBaRlBkN3NUb1kweTVwem5PSDhzUklIbTYxdU1ER0N2VDljT1F0VTBnUDAwcy91eno4QWN5eXpnOHFvSkFmcnplZGJnOVh2bzljQW5lMnFNaDFsVU5GeUNtUmNkQW1ndEF3TzhIdkFnWmZQR2pvU1IyTHB2a2MvMlVQYzh4MTRxNVdlQnI2aFRDTFhwaTdaSEZVc1NNWkM3alJ5OFdjSDQwUDFWWlNkR3RrTHdUOWtGelFyVi83WjRUZ3BQcTEyVGZqdFZEZWQ1TXo3TDhIQktwSGQ2NnFkZnRRd3hIbUMzSFJ6SUZpUjN3U3JqVXQ3ZkU3MTlHRklldHV4WXhmZFVmODhIQldvYVpVRVpLakE0M1ZQakRpTkVGM09CTTFsSVQzR21Sa0lXRHJWQ3VvM0x4Wk1FYjY1ZWtHR0N6YzdZRktpTVIrRjE5SUVSenpBRzI5THFpYWZXc2x4TzhaUGtYWjVxWXZqL0krNCtNQnFma3RhSWYrRVczUDZhNEI1NTNSVlNKM29Gbmd0eE9UNEo2Z0pIUWh3QWJRYld0QThnR1BiTUtObW5laEtwUCt1RkMvdERHTGpxRE12UGZOZHg4TDBhaGNFYTVoWmt5eGhSSldTRVNTNWRxZW4zdGRVeFNZUnNPRVY0WlZOc2VoRlIwbzVBTkx0RHM3SnpRc3RrL0dYazAwaXE4MWNsbFZ0YTI5MU9PVkRkSkRvUUQwNEZmTmdhcWhXMjQxTURUVGRFOG4zZjBhMjlHVENKSEV4eGtyclMzNzEzRlA4ZmtTaGI4UnZuT253d0tqSElPNXdObnMwUkQvNEJwQW9nNTU3YVBnUnc5bng3Tm9NK2lHdCs0MXNJRS9tRzNsL1pqZjF5V25aMGYzQ2ZuWElkZ2Z0UzJiNkcwS2t3MEJNQ2lMdElIUHkwVWFOTGtDZXVmYW14bmNXVXZCR2lvVk13bGFKdlVCVHdNc3hYaktXTFFjSnIrSGJEVm45WUxmY29HSnFhWVJBS1FLMHB6U2phYmkxSXN4ekcyQWtza25Vc0tvK2JPaFh5TFZuTWt1TjBqSXNpdDRFN2M0Nnp1WnJBVFM3QlFFOGg5d1hrNnY5ak81TUwwcFN6djYvMU1GUVFpQ1I5cTFxVU96OFo0UXRQQjR3MVhCOS9mRDZvellnNXhUU0RnNTYwMmk0V1NpYlNWenlHcnhZbjlNN1RlekVWM0xwcnplYllCQm5Lc2lHZ1J2OGpZUmMwVWRKU0pTNWRBOE43ajFoOTlDTXRZczF1aVFRNEkvME44OVV0SGk3Mjc5MGk1Tk9ML0dGM0JKbXlSdGc3cXQyVm1pTGpRMDNDZ2xaVW1UeHl1V2FvMmZZZ3RhM0NJM2FTajU4eFBwRFVWOGNta3lJNFZPWTUxQ3BmODdsaTFDYlhlT2RKZ2FEbFN0UGtXR3NIN2t6Y2dZL0pzNHZBV0doajRtYVgrQVdma3Jldk91MU12bnJ5a25OQXErd1R5VkNWRDhTSFNiTXh5a2g5UWtpdUNxY25sTlltS0F6YUYxcUR6bmxHR0tpbGswaVR1bjNuR2hhRUxhbVVEWGRDNW5kTmRSRy96U0dSQTZuY21Zd0JSZTErb0FyZ3ZtUWc5Umpxc2hvMFYwSnllRjZ5eFNQNkdhdDc4a3JFeTY5RHB1WFAvRzZKYVFXUnFyMDJXbjdKaThWbmcxRmtBNzZUNUNuam94REVFMFZIWWEzU0NROXRyUU1WdkV0UFNib0wwc1BwRjI2bmZaRVhLS0lmOHQ1NXFhdFZFTXNjTzRlT1RzNTQ1U012dFlRZENYN3hJK0l4UnlLTUtTa2FGTkFCQURNWEs4eXorUi9sT0owU3h0em13QmtUako0aS8yU0FLUjRLT3Z4aUpkUVRRNzR5ODh3ZFNhWDlaSk1zL3VuSnc2SHg5SlVKNzllNVZ2TS9EeS82Vkh0a2FKaXU5djVweUpCLzFMZ1VKbit1Y241WTVXN21wQ3RneFRXNzBGWWQ4NHdJSTREYUdOZXRiQ1dlOFF1dWFDcit4bXliek13bVBmaHVJL2hpb1RiQUNULzBkUktuSkhIMzJGVjUvellsNVpOd1o3bnlCTGp6dWQvcTlHVkUrbWtkdXovajhiWGdXdjlBL2tuTHZPaS9UQlRjUE9RYUEzNER0dkJhbDY5RXZrVmRaWGw3a2Jac2Rlbjd6YVQ4ZEM2UE9PWkdDamRnWkVhZWNoM2ZDeEFFU3RnSXpuS0tOTmlwOFZGYVFsdE00N0RIaC9PK2RPYVdrK21ZOGo1WGZvWFA5bkxldCtIVnNsRE90dGRhc001MVFEN2hldkRJTU5UWU1uaC83RjZrbGpEeW96d2dLajl3OFNvSVlyRkFVS2VnRE9EcXFndUllc1lIVWN0S2NKOXlyeEQrbFF1bWJHdER1OUZmSmQzenhydGJIaVJmUnNtdGZidytjcHg4aXZQM2JUekt0Q3o1NzJ6KzM5d09aMjJGaG5EcStQeWsyZEdWeHlnYm05WGxrbnZNeExGOUVmWW1SVDNIa29Zc055VWtPZHk1RlphUjF4d3BDZXkvODIwR2p5UENhRHBoV0pGM0FxVmF5czJzQXFUam1zKzBqbjFQdnZ6c2pmODQ4UTlVVnViclJTMkVocWpTdE9Id0FyczNKWHY1OUpwVGhlT0NlM2xQVytVWHlUdTdIS2UzRWdHakQ1bllwME14QW9zdEFlbjZtcXNRZGptWDJxbVJmdEJVWVpFTlFCS2dmeDlBNXlsQS8vQlhWTzRteWhxdnFzSVhtRmpteC9kUDQyL09pSkppTXUxUVhQWDg2UlA5MGtuaFhibHpkNExobUw3T1doNGRyN0NvTDJ2TlVrWUFEUjFrNGFlelcvYnJOdld2L0FFNmxsMG5mSGJ3ZVFLTnBLMXpzNmpURFg2VUlDcmVSRktRdkxRenNjZ3pQWThnLzRvcVY3akFLTituOUpsT3BhM0NtSFZYeFF4SVpucDNWK1poRERWWUtxM2tTNzNxTDBha3EyZ3V1UkFoWHJhTUgrd0ZaNVovRjNmamxuMEJSbFBxTmpjMEhSblpXbnptd1R2bmZJOTg0K3F2STFQd1RCYU45WlVoZlRpd0hjOEZQRU1uSmlkUTBaQnhSTEhzRTNGejVjZnRxeGhCRDBlN1pEZjdRVElBQjdRMzRmMnRxSUliNFZ1ZFpNZnJ0eVNMZ0ErUkdudG5DUE9zQ01zZTZHRWU3SG14TEZ1cit4V09vWEUvc212TTRaSFBqT2NlbDVHcnRRSFhDNE4waXJraEFNbDV6NjFwdFMyazJITEUveWE4ZTg2MFhFcUxFREhxb0RhRG9ZdzEvYkhSbmsvNklwL1ZVV21McWwwejFheW1LU1pVSWQvMG5tMTlYVW5PbkU3dDNqd0tScFF4UXpvZ0Q4elZLSkl5MXhRNERsdStUdTJRQjVzMitZZDRWaWs5dk5OQU54bHBMMDFLNGU4WUNvZHZCREpXWndpQ0lEY3FGNE15NHUwYzlmK0MwYXhwODZ4WmQva3NmeGxlallCWnltMXIrZkdKWllBbERkSVhJM0R0V3UzYnphTlpzNTNSajBCeHAwOFVIQnNsdlFveWgyS1VRdXFNbktrK1dqZGhpOGphd0FxZXVJQTdPQ3FFdFBOYWp1YmpqMU5SalUrSE5NZGQ2bzRyNHZZTEZHdFU2bG5pK3dEbzQvQ0dsVFhtRXJTbmxrMFVWWk9ocDNUczJnVGdZVEJuSk0veFZjV3hRckt3Syt5V3NtWU5FZjVIQSs1Q3NGWUV5MXhmZlN1UmpMeE1ld042V25kNDd1NkhGR1dLajRhZVZhVlQrSGhMOEh3b3Z3MXlNY0RkejVOelYzb0RWb3F1VkVrOU9HaWhWdFM3R2ZlbThkZDVxRmhXYkdJZ0NzSmJoaW1MeC9GQ0ZYVWIrMm1jQnMxaG5NWWMwbmxWbWRtVFJZa292R3Q5Q3VKM0NXMzNTUmMxckliZFRRRjUzT0RKZGxwQU1KM3hKWWFJZUpqWW55clJQYUhpaGFiL2xxUjlHYllScVpCVUJlSGFnTEdWM1FXR1Q4TXdMY2hyZWJqODNrclgwUldlT0dEYnBIT0NnMmkwZjR5dVEvc25hYkhuci9FSk9DUGF6M0JMOEFxVnpVYVNGSGd0TU04VFVmcm1zZ2QydzA4aFFES3czeXlFMktsY2JqczkwR2V0b3lhTkJCak1ZR01XWTZQRUxWNTI5eUFkQmVqTEJjZ1RRTC9SZmdvSVh2QitZL3k2bER5Zy9oWWYrSFFEL1lzak5aS2twT3VEcFIvWUY3MHBYenNGU0lpQkg1QjdpdFZKOEMxT3hSUDhWNmh1NkZpNERPNGx6U2p5QUpRVFNzS1dPSkxoYzVib3c5a3FLRU5XM1BwQU96R2oxQytBanRLUmRTai95ZDNZdW5kT3FZOERPeWhkdGIyWFZQMUQ5U0R4dDNIa0pqRUZyRnJLeFIySU5melc2TjY0UkV5SEl6S2Jrd0RBSHJrUjhIeXRlV1NCS05odTRtbWdyeldYVE1JSWZ4TmZjREl1ajU2cmdnSE01V01aaUNobGc3WHU3RG53T3FUb3FMT3FiWm1FOGxwa0JNc3htNlA1eG9UeWhiRHp0eVR5N1pYT0RsbTRiQkhkUmhQYWZ4dVRLU3BycG9RS0FLMFFScjBvZ0lPdDdkZU13K0ppT2lheE1wbTk3MjVOdExQYzBsSzFKYkxPcmNCT1FBZEtrdUNMbGJlZDBOUXpPUE1ET1Bra1Jhb3FTYU1GUG5jSXBMa3hiQUQ3Ky9DR3J3KzNpTWM1T1MrcGlPUzZqam5ydVNkRHFxNTNXWVF2dE1ZUEh6NFg1QitFM1poVzl1N0hDdzMwb3NzZkhSekNYYkxKUzZJSzVCaXFMVjE0UkRVckdKVEsrVGV0azFrcDdCcWoybXdXNk5QUlJQL2V2cElRMFgwUUZaNzB6akU4VXVoclFNUmtSdllVRUdIZ1FlZ2VnYlFsRFNxUWxyR1Jqclk0cEJqRTFzZDBmSk1zczBBYkhFb1ovckNOU3Vldm9WMWFoU1RJcUdwS0d1YlMvM0N4RXVQTUhYelVBY2s2K2ZTUXVlZkUrdGh0OWpnQ2pxc0JTVmRlQ0pOMmdJVnEwOXZjOEthWitDSWVkMkx0WXMwN2d2TytVOFgvSlIwNU4rTUFvYk5tTHZBOStwcnZ6RVZtSmhUQTRhYW1rSGRYYTIzT3loQmVZeXFrc21ZK1NjUms3Q1hjVFg3bS9leXZZZlZrNHErVVVKT1gvZ1ppWEwrbittOW5jdzFPY21WVEVuUEhMTDUvOG9CeHlvd2Nod0NRdGE4dllwVk1YWkVtcGRiTmZSYUd4ckFjMGZwK0RyUGlNTVFhU0JTUGZJL1JDeFh2aXkzdE84MG9xOFBNbjVWMk1ob3ppTmhsdHZjZ1ZHb09qaGtXd05LczV1bXAyaUFhTjM2RUh0bVJIdVVPZUIxd24rekx5c0tEeDNEZTdYMHlINHdqaHJzRkFFSXAxZHY5TzJScnhDZHllSktpRGlhZDE3ZEsyMWFKdFJFRktVQktDSjFHQk02RjdWWHFIZ3hiTFJLR1RuRDlTWk1HRkI2OWxJVnJWdjdQT2lZd2NpRUk1WXQ3blNWMHBxTkFVR3RCYUdLb2JiYUtMYlJZWDQ1c3hHRlNRY2NIbDZibGV6MXFUSGhBaklyUjRiMjd2dTM0ZHRTcTZSRzNLL2xyRlJnOHhJMGM5d3c0Vk1uZjI0UVRoeFpDU2VkWkR4NzlXcXY4SnVLQ3lWNDlCb0Q5YU9pSktCWmFHTWdFQTFFUm16QlBOdUZsZGZjRkRKNitib0VaQ2JkWGhGNWxQWVZwOHltOThzZ1NleTBFbjRraXRZelZibXBndVVlRWo2VVd2U2ZkdDBLWXlyV0NucWcvVEI0aEV2LzluOElLRk9Ibm5CQnJLdEo2bUVnYWdDWWVpT0I4eGk1czI2VEl3YnU5dVRwQ1BmNXVqYTRKRllaUGdJODJUeTVkcWxiakZxR0FlSjd3VFVWbTRpTkF1ZWVzRFh3WCtiUlR1UmxSV2ZJY2grVGNhWEdkK1RtblJuZklQUEMxUzNhRVQyenVTUXlHY2Z5Q29PRlJCcVhJRHhBdnJxcVJUbWQ4MitTRFFBcWIzTGlISVEvdWVjV3BTTjczVWRGYkhkVjNqakQ2N2VXc2pjQW9xNzBIeDBsSmFFMFVRNitSQ3hTOHFQUkZReWszbWgrWUFEdG5tK3NBSW4ydnJ5SkZWenpYOEJyRVlLUHp5SElYSHlGZlcwUUdPUGJiVWJEMEFGYTIvSURTYlBvR2EzY3p4czdQeEN5STBWU3lwdFdQcTlFWXJwTmhxbWQxWXJtSVBFR1BXZnByd0hXSUFFRWtNVTljY1hhZkJ5SENRQjNDNkRrTVh6bTNJZFE0SVNrK3NLVzNLbktSV3E2UFNoY210UWxUTVh5TmRFQ0duTlNTWktYcXZwa1lKb2dQZDl3NVZVcVdsb0g5YXM2bG0xZDhBSlYwaWtacHlFK2ZFaTFsOUwrWjM3R0R3YkxMY0lGMnlvZ29aU2Y3Y2EyUTRSekdhTXlOZlQ2Sm5lSGNKcWFGVFpKeHMxdUludGVsSEwrOG1VY0hCZ0NUek5pWFZ4eDRWRWdvdC9mZmNwR25WdzVCWFpvc1RDOHFweDB3UEh2S0RVWnRGbU9OM294cEhHOUhTbTVXdWFudWxveExLVGVKTm9mZDdnM0hlb0VTZEZINWtDdWszWS9PYm1tYW5kdjZYUGFGeGUvSEJtUXdSbkZqL0gvbnU0SVJvRk91TjltMWQ0alVhcWVpWXpYdVgvZXlRWnl1Vm9yd0ptSUVzcitXN083VVdhcUJCYUd3dU81ZFRXQ2N6NEtzcDk4dEQ5NzVFbS9BOUdDNXRWYWl4UHBGTmNLMWVKdEk3RzVkby96U1A1TCt0aFRuN1ZTMjFxd2lSK3Ird2d4UzVnVWpnbi9jL0hXRURaQVI0Sm42ZXhDaHlySUxIcTBHVStiOTBZSHBUOFBmclMwMTJPMVJwU3JqTHNBVTN6Y0VWeFhwWTJNLzJwTmYrOUhWckZTMnNFdkxrNlIyMFJhR0VXMzE4REtLNmtIdlFzcjJwV1B4eXFhbUNxUkdTcVVJSlpRSUtxSFhtT3pNdHdLL3FicmliRjIrcTZWZzZOaGhGTDMrSmt6aDFITFhmWWlraW5qM0pwUURRWnVncGIyREl4OFRRYXlGZWxQT2VOcDhyajREUU5ISmxkUEhmQVhGRDRNeE0yOVlPT1F1L3hhRFR4ZnRnYXQwSkpCMUpDcmJXblBCeWhvcFVoTW5SYmRpU0orcVRSVGVsY3E2MEpaQTVaUFFybHdBcGZKbCtCbFdPNHZiR2xwSzRQOFRXVzV1TkFNVjVTM0c5K3gwWWNMNXpvNU9rNG1NYXpCWjFVc1U5bFkyMVZ3Q2dDQlNjOVk1SnEvV0gyZnZvTTJuNW5mTExmcHFIb3ZLL3dTWlAyaEpNdktuOXdhU0xVaHp5cVR4K3lUNmlMeDVGUFlmVlBLeFM0S3g3T090L2lxYW1vTGpHS3QzWGcxbDNrYVRqR0lCV0xlVHdFZzkzbDJiWFlmbUwyYlFNNnVPY0ViU29XUGZqMHpyZktwN2dHRzVWdXZ5MS93Q1U5WG04ME4vZmVMcTFIbmNTWGY3Y3N6UTlXanFUL1haKzNscllYYXg3TlVERnNlNHMwYk5rK0ROZWoxcUtDNVB4YURKYVdzdU1TR2crSnkzSCtsbjFCNC9SQXJyazROMzBmVnhKY1QrWDdISWd5QlZtTWdsaTlHOG0yN01nMnE5NFo2Wjh2TWxwMFEvcjBJVXAxRkNxVFA1M2dkOGx1SHUwZTduRWJqck1HR0Y3c3JYZUxNUmNlRjRqVGdJai9OSFZ4aGZocFM0V0NGZjFhZGc1WXZ2ZWttTXlwc0xPUld1UktXNU9VMVRYUWJjZVFvN1MxeGZZV2NLa2J3b1ZtZ3Z5L2dEN1JoUktDUEpZU29DVkpSZzVFTUl5ZXFDb0xhQzd2RStSNE1teHVXUSszaTB2MlBQaWJ5K0RMdld5aktJL3lZM25GRjFpVHBCVCtNazVvd1U1MVdBcERXZEl4MVN4T0twTTcyd1VhZWwyd1VHUExYZkQ5SWtLZGhvMDNwL1NVVllRY3FhamF6TUFpZWxEMVlTcGtOQWNheFN5ai92bU1PS2t2ZUxKQldEZUxDNFllNStYNUZRRVRLTzM3TWZuZ0d5em85ZE5aY2VaVElpOElmOHBrSjJ1SWxBTWdJYTVieGorT2JwL0RHcVB4b1doZzdKOERuSmI5M09oTjZsVm5xbHAvbEtiMEpqVWE1U2xIRmFQd0pqUXhLRTd6SXJZSWlqZ1loY0N5ZXJDRW1ORk16SmZQRnpDa3FWR1k3SkdzbzdnV1JlOTk5TGpDTFF0Wnhyd0F6SXVqOTNoTkJKeStKNDNrNW1rdnJ1MnVrL3Fpd1BMbm0zQWZBaXBpMUV4K25HQXFIS3JNWmYrWG9XenVSTjF6NzRSSFB1dDNnSDNFVkpnVGNUOE9OQUU3REZWcTd1eWN4dHl2Sk1Sc2RwWG5CcVQzYnlRZUpKSmQydTljM1BueThBekJOUWlCZGVsNlBXc0VMVWNGUElsS0k1ZmV5eHQ2VEdBUGZXVDBCZWZZMHA0cXdPZ0lzNkh2d1dyOUJqUFdDUnU4REtWcnNtNkp4MDhrQy9qY3pGcmhXQmVOWHMxVFNiVWxVU2J0WW5KSStmSzF3T0FtRW1IZEFOWVkxL2ZSM1dDSjh3cHFUdkdaMytuTUI3azB1bDlwODBnL1BwL1kyQ2VBNHk4OEhGeE54NmFNYlRRNmdQWmNrWUZSMWZlaVhhZGhMMFBUbzV5NG4vYmxGWlhPRW1OakZIdzlBV2JVaDdkc3c3WEJyNnlhbmg2Y1BGaVFUSnVCVTYxejlLV0FoVnpNYjhsYVlqRXA4eHgra2RTaVlTL2ZYc2E3N0l2ZWJRWTRPNW44UDl0cklyT3MxVzRXc2xoeGd3S0hLckJKNlM3V3pzb0VvRFhOVkR3azRWVW1GNkpXMjNxYjNyTnVpTVhqNVVITlJ4RWc0NFpjUElUTW45QmRhNTh5MnBoYWE1U2M4enBQd3M0WGtSZ0xRL2tRcDR6TnU2VmdITmtMTWpubjBEL1gvanVxZTlNMER5dUxXNVNLd2hBaGZkMWFFNnNUcDJydWJOT203akdsSC94dFFldnJrRDNqRWhiU01SS3FtMUxsNnVkbklJUHZoalFHRXpRRElFRVJiR210czhQWDV6SDcyN1dueVMyOStXYy8ydnloTGZBZVJrMzFLb2hEMTJHSU1XNmd4NnN3VHJ4TVZuMUNDaWI3WEVHdmpWUTRGRC9Eb1YzSlhFekNLeW83M2NLWEs3WlRJOHlXais5QmlFQitIL3dZekdUQmxNK2Z2ZDI3VTlpZ3l1ODZ1WmlNcWFwZTc2THNLZnhmb2F1aXFCU04xTXg1WlZ1WDMwYUZUTFhCRTN4T05sVk1GUFgrL0FlbWlKaUxkOUVrM1E5c3ZMUkQvV0pOMEJxOUJaMVFSTlM0aktyemQ0b0taaHJ2WTliM2IyajlFMmF2Q3pGUFRuU0tDN0pKeVFoc1hydEVSRWkrTjBmUkFNNUVDMUZMc2p0VmhyQzd1SGt3WWFjRGFXNWRPSTVwNzR5eTMxTm44L2Q5amFWVUY3OThVS1p3NGcreGVwazBMeGFPS2lMYXo1R21IRU1BQjVkb3JHQUdJMmdMS3REV0ZHbEVyUzdQTkVnMERTcldUT2JGSXYzdEd3aFVCQlg1cmZZd0tZa3pFWUtScGh1NXZSOVRzVXg0a1RmL3p4dEtzR2M2OEIvUUJha1dSZFlKN0FXckhjSU9nMVJ0WkYraGdtRE5wYnpPVzVHK2djZlRneFdEbGkxZWtzblVmV3R3OUh1TTFodm1ObGIxSGtrN3FncFFWdHVWcGxhYWNabDZmQm9nZDB6SHRNZW5vRSt6WDlQN2k0Q0hrdDBiT1VSSFZ0anI1T3ZEUDhSU1BEZlpEZkRvQzdXbUc1dWtqdy9RYURFaUJYZFJ3Vit1NkJQOWdnNUt0b0RDTThnbXhxeC8xb1J2YitmZ2I5d1liVTRKOGt4cWlZQlY3NmdMZ0RXYzFaaG9NQTNkOHdIZ0pTN3hWM3FuS3BTSHhRY3E3Yis0QlpsbUpHWUpRcXRUaVlHbnV0TjlrZUI2WXFoZEhSaFZBUzhiRXdUSE5OUDlCSUVxc1RpaUtJWGlSRDRYczgyV1I1SWN3WlR0czdGKzJPcmJLNW5HdUlOUENGTlZUSGFkK1V6dlJtR2xWN3VPNitCWHIwYlZkSDFLLzJNanN2Vnl5M09qMmtRTmxSNlRHVnd1RExXM3ZDOHAyMno3MmQ1MW1MYVBOcEJsQ0xEU3kxenhXT1RybURBelRCV3JFNHFkeGZoNUQvUXlRZlJKTUpmeTU0UVFrSmlwSUN5NmhEa0llUU1xODcyNXY3UWtvR2xIcGxwMTAxOTdzZmc0NkVVa0dCYzNsMTNIOTd2aURKSHRudUQ5QmlKUUp4dG9XZDRmT1ZoSVpnRkZJWDQ0TUt5d3VHNzVGMjNqU0x4N3VkVVh3QWE4dHczeFFMWnN4b2UyZWM3N3d1VlFSa1cvU041U1Y0aFlwaUdQc1hMZWRCQjl3ZGhidVFCUEJhZC92aXRGd3A5V2lNOU1iQmZ2YkpCRFhYdEpkR2d2TGRQZHAxK1ZFSG1mK0o2THk5Q1JsNFZLdzZjOHF5YkhVZURRWVJnV2R2ZjJkRDQ5MHVTdmM5REZHaWVMYUFDbUhMUmY3aTR4NjlwSzVXZmhVV0Vic2s1U1VmSS9zL01vanE5TVVYVEZSU2M2Z25rVE9TY2tVdnhwR0dZNDNiT1lzcjBjRHlaMUQ0N1pjVUM2dkVXYmp5dkxLcldIZG83c0MzejBPeXdtTjhuRzIraHc2eDJlU01IV2pIZnRneWg1YzJOSUcraGROditBWm93ZHV3MDgrdEJ1TkxJeHFveUtHODk2bURqU0xpVnUrRnlPd3RZMHduU3Z2djAxUWxmR1E4b2QzaXpCQWFXelM0azA5SzZmKzU5NURaMnVCdFFkbnZhVERsY3BSVkMrclZkbkhzN2N0MU9DMGFhVFdmNGgrYmtuTWprTjEraFJ3eitEVWkxVTcyOGVMM2NSQ2NXYnBMMm0wWCtkLzVDTEJTN3hxRVYrbHQvZGhrcTR1VjF2Vll2NEpKbjIyWlJyM3FINzQ4QnFBd2pyRHVWQ1VqMnQwdmpCMlFZN2VEd2ZKaXk5VStUNXQ3aGxpc3NYTVRHZHNoZE5QWTJCOVdJbWlXZUkzVDBFbm1zZWdZVCtTNDIxYnRIM045amw1ZzlGZmduNzVuWUt0cHFXRTZtVTB5ZXBldHc0S01hTFR2TWtrci9lZkRueHFSWnU3UXg2Qmc5c2tKWi9tU1Y5MEVDS1ROc3JxSDlvVVR3UE5Ra3A4TXpTdUhJYklCNWRkTWpBcldDcVZNTTJsN2hkbnlLdjhLZTF0WlJON0ErNGdGNW56TUpDVll5dmp2SXJUNTJZQnEwaUxUZUI1aG0rVEgvUEkzdmcyNHNTUGc1WVVqZFhzNUwrVGROdmRLR1NDZlp1YXVST0daaWV6ajl0RDVCNVArREhGK3lRL1dhTG9KaXRiY0JKRzFBdDg3dzBSQnpEL3ltSVpweVI5ZFphRjFLRWhldjVSMFRUY3B0dkpEYk9GRC9LK1VVU1hUUFhyWEpPVU0zRFR2WU1EOERIdHlKVFhaVW4yRndRd2gzNzV5bDZiOGlXTjlXTWFHVlFiMXhzTlJmWExhTGRPa2JxY1piWHpGTlZsZkV5a3FROHFyYjkyQ2ZQUkI2aTdRYkZhZ1RGVnltcC9CZU1tR3ZnNEhnQXhVNTVlUlN0U0QzdUF1QkNUUDB2V1d5ZGJGb2ROT2NqeVBoVlVxVm4yTTZFU3ViN0xaSVpoU3JNTlJmcjBQWDZHRzFtUUpTK3crM0JqL05QaE5FNC8ybjl4a2JZalJVREdDVXhxbnppYWtsQTYzaVVXSzU5TSsyOWJUL1FOOCt4T0xMeWh3ZEJrOURQSmFxTHd0bmFVUlNpVU1lTW0rUjZ5OTZWN0J6cjBpNEV0cDNHSVMzaURBd3VIdjFNeXpuem1kclYzZ1YrRGhqQnhMMlFrSEc3WjJiWmJIOXpWbm9FTFZEQVdHYlorNmsrZFhsR054eGYvR2ZQOXlYOXZzNDUrZjdRZjUrMnMrZjdJVjlYc2FmbisxeGZKMk54K1QwTi9rN3JZL0oyanZoMjNoL1Y3elA2dmJ4L3l2ZXAvVDZGNzUvdHhmcTl2UytiN3Q4K1R2WC9xNmhMNS9UWDN6OTF2MVVkd2I1L3JjL3E5UjNmbitzbmZKMW5ueWZVQ3ZuK292Zko5WDIrVHFKbjVPNS8wbmFMUHg5T3Z5V2dNZHBZdzFhUUtIaXk1UkxtL0U2NVZvV1A5WXFUck8ycHFqdUNHVFVpMVNkRmF3a3V3Y3hScnZLS2Z1eENCVFFQZlc3WGx5ckRWZmcrdkhRSTlOVWdHbklDZzY1RVhERmJJUDZBNlNLY3pqbjFvT1lZVEJ2WGNWam1UUTM5enJoV3pZR0pBY3cyemRNT1MwQytLWkdhNm90bVlmeFM3YjJneDAyeVk0N0pJeHUyenk1SVdkMWIvSHpRR3l1OVhURXIreDNLZUJMTklqQ2F3bXAramNCQmlWQ3RieEYyZVh4MytlNWlORWtpa21nTmFJb1Y0NVZKcDRCR3JVWGhUcUY3UGlJU1BnajhUOHo2QXhMMFJzbm1ja21RTnV1TW5CcHJoc2Fuc0JtcHhYVlVlRG5jeXBHZWQwY2Jvd2ZkMWVjVHo1eTFOSGJ5Z1FHNE81WmtpWUN4WUZ4OWh1cDdWZUFFMUJ3anhSN1ZxaDZxSE9PaW84aVhZOTI3S3g2TzMrMHFUbVdkUklIVERVdTl5T3NxaGVudWo1ZUJ4VnBHamJVOUhsRE9ldE1wT3VCZjkxcE5yUzBDM3pvdUY1TmNvL3pRSUZ3djBjMWloeGFibVM2alE3cnlIaFVDOFNmaTdpb2dWcW1QNnM0b1d6dG03a3BId0Vkdlo0YVlvb1l4WkVKYlg4dUFYaDhsano1eVdobkt4V1J5eXM4UE8rUzFmNVRQLzhuTU5HZlY2eFE0YzdSQXI5eHU3QWppcEc1NnlCVjcxdGRFRHozWmlYVlRUb0RRbGNSaCtSNVZzaW5HMUdvMk5CdnRTTVpPZFBNZEhrOVlkdGtxd0hNeTlGektTZWwva0t1aGFNQllSa2s0SEx6bzlMVERMSy9zc0J5dmxtMTZRQk9QWUZWcVhIcFJvQWdDR3FrQURtZHNuYmJ1SUpEbDA1d2RYQ3V3WmZNMmVpam5FL1B3cnFqZ0lFT2ZseGovZk5rYnR4ZEN1enJWNXhldzV1dWFsN2h3dmtxZFQ5U21GUmk4ZjZVQmY4aEVOMStmK1hFbkRkTFBkekFHeEN4NEorVytRY1g2dWhIcmtEWVpzcloySGlnRHZvSWRtcXl5clJUV2pEYTkvSFdsZ1oyT0Iycnp6ZFpUNUtnMGVxa0VlM2ZIRmFVa1VQdm1YcDJCSFZXNm9wZzJjWFpRei9jaG9YNzRVYUFNTkJQbGxrazQ0Y01uRWwzRi84ejlQQWVXTGhFSW14bDNJRHRwWWxiRURXcldST29wb0JnajRaU0lqa2JXaHVCbHdUbGlIRVhzVzROOFg0ZHl4cHBpekNvWUJ5Q2UyQ1BNV1pCSmREYUl0SEg3M3VlMldSY3NsakpmZzJQeU1US3FJUXgzMHR2TTZ3U1JkU2habTQ1SUorcTRUQVl0TDQxdXMxNzIxaXBpUzRuc3hNY3hFVHlZdmFyUkFhL3NheDVXUnBUaW9rcE93WTNoQ3lHODBLOUZmVnExenVhWWJzOWVtRXVlRFprZHZqcnlKMVQ0NVN1UHJBOUlGZG4vQms1WGVmQ0xIQS9Vc09ZOVl5N3g1bEFNUGttd2JOYjFsRm1RbzMyQ1ZmZll6RXZFdWl0VTlqTm8rcTRNQjV0RStCOFVMNXpaVUJ3SWJMV3kxMG45d2xzTHp2clh3QXRROFVEV0F0NUNzNW5nY2xxZ0crV3AyR3VrNTRJOEx4TFMzUWxUWUYwMXQ1elZZc29ZUVJ6N093M1IwRUNJZjJEVTdBL3VnWE40KzFUSXdJektySnZZb0JobjhvZk9oeEVmOTBlZ2taM2wxcGNvQWFPQmU4RnE0dlQxa1MvOU9JUnhqSWhjRWpWeGZqRzlGdGpKQmNDUEw3TXhBTitQN0RCd3l5QnZ0MmN3Tkx5YS9uZzQ2SmVSOFhIWE1EUUdENWJHWE9GWkhBTnBVdXpQcGtia2tpd1ZrUEtBcmluL0k3VWg2M2xxZmE5U21VY256SFVtZ1p1ZW11eUZHMTFaUFNHcDJIMDhrdHJ3RldCTmo5UENONWI1alAvZmFTSCtHYzNXOVNVY1R2WDBlcXp6Ym10RUNEWmVPTjRpZXVtUS9uSTcreHdpa0hwZ3FLWW5BeU0vZ3o2YzlPT1B1RDIrNGk5SmVIdTdWWTlBcU9hSjlCMVlOVXZrZCtHWkNLS2I0WmN6NE1SYkh2QmJqR0d5YXRUVlRiNjBVNGlEYStDZUlLaXArUGtOa3ExMGc2bGRGbGt1dWR2TVFQMUo1c1JlVlQwK1dqMUVlWEFtVTJMOVZkbytIV25kNy9IQzB1RHZyQjdsSitra1NPcHMzb1pLaVl3T2ZxRVZ3WFFmTWVYWlVFZ0pGMWhLQXZmRkZMSEtSYnBlbG1nVnZsNjg4Y0dXYTBmR3RWOHdCUE5MdlJsTG5RZjl3WWZKQ1hTaS90ZmpIODJQY21yRU1FbWRZRUR0c3ZKcGx0cmJXSW9uaVExNXVpMlRzWng0cFUvdnV3bFliUm5sTUdlM0hHYTdsVlk0UnIzTlo1cm5YaDdIWC8wc0VWb25CbFl4ejlQNlBuZzdIdVR4TnR4dkUzM1ZaRHRPN1JnaEQyWHIrNUdSSDBZL3FoOXhEZ2V2d2hPU2tSZmQvNjI1NTN1YXB1RDIyaFdZUVdyOGZQbWloMWFWc0ZVTUZ4aU9idHhRbytnT3UvejdHcy82VlRHdW9VVGhkQ09HVVhIUmF3M1BPMGhnd3RUUitGSWVTSmNXbFVvSXN2MUtFb25JZE5nMUk0WGtxNUQ2TFRBeTkwamtrZ0NUUldMMVRzSVFjV2lJSEhJTS9oSFlqV2k3VnR1Q3ozV0xuV0ZaTFJrUSt0WUZqOXhsUmFlaEZmSCtxN1F0aDQ3UjkyT2hoNWprRCs3cXVQejN2Z2g1SHozUkZpeXMvbllDZ3FuUjlNTS9UUjROWkFCby9sb2pYL1pEa2svL0l4SFBab0ZLVnJ1OXc3cWJLL1kxWFVnT0FvOFAxV1hDbHN1c0FXQUxLQ3oxVUlFSlZjNk4vd1doZDRIeWl5VjJXc1lMejdjU0ZMTHFGUnBXVEtvdXg3QjAvbGI0ZHRpSGtaV29sck01ZHBDa1JrL2Z4Nk9xd29LanVzTmIrQWcraTJmVlprY3pHWGhGMGdLUStqaGwyaTVvcXNnVkJwUzBDUlkrTTFDQkZwTE0zWWFlbmkzMlZCNDJwUlp6TWI4VEljM0ZzRHRDNU4vSDRsSW5DSWZqanpDcnJCYkRzTzM0SzE5M1lFNGhlMG5RWXUxaVZic25tSllZSXYyWHo3WW1IeGNybVRpblF3OHFuQXcvYkxhNEpqL0poRjU3RDhsOG9oeTdVSWNWR0wwa1RYSDNxVXNiTDRiRE5uQTJxZmlmVVI1UkZVaTR4SzNLeUVUMENHK2gxN1JKMEFwY0dXUFFDSWVaQm1Yd09ncm1rRXFPRks3OUFhWGM1RzZEakhLZXVPSXRvbkZiOWFGSkVhcXVxQXJlNk5xK3IzMFAwQWNkSTJNL1pkZUVJMS9ZcHgxQ1dlQ2dudEZjb2o0WlFnUFZpY3ZwYTFaSHNoY3habzExQ1JONXZvVzNLaUN1UnBHNFkzMGU4QzdPbGVNNGVsWlliTG14dk55R1Z1UDgybGFQQVdmeXdaVDQ4OS9ETjBzYVVpQ3ZNNENvUGsyZVp5Vkx2eWhRMk9yK2lVOHhsYlNuZzB5eW13cjJnWmp2MXZNWW1rSkliRGFQNFcxbzZYd3MyeTVaOU1HV3JyaHBrZW5EWTdHTkE0ZHcxNUE1bjZFMUV6YTJ0b0d0eW5CQWRaaEpZRVpkRnhwTk9ZaUlsUUtJSmZVcGZVTFNaU2pWaEcyZGVOYjJveDhlTVRZSlRqaVFUbEhvdUQxYUoxWHVtWkZmekNrdGlrbzBHM1YxMk5HMURFQis2S1VyQXhSRkwxbTB6bXpHMTlvcUZxSzBNTkhqY3RiZW5WOHBsTlB4QVlzZ3JpOVF6amY3WUprS1NRQW1YMDhoTlBRZGVSUEM5d2l0aFo0aDMwSEFTOStqdFF1M0g0N0tZdkNwNWJTc3pNTDdOY3VSNXdDMk5PaTEvOFpNS3B1NDRvVGJmbWx5dVBJU2tzMzY1N3gvWEZacUVuYWM1NFRqNC9jMHZQZWxaYllWNnl1WWIxRE1IODEwS1BCQXo2ZHJkNTZJaUpxRDdZVXJqMFhiLzFxbU8wNDFyRUVrYzBwYkZFc0pwa09PNXZ4a3FuR1V4K3BDOWpCQkZ6NXZTdzV5c3ZUc2MwckpyUzUvanVDc0NrV3Q1TTBWNUtqdjlhdDErTDliWVcxVzE5b2hCQm9HdVh3UkdtaERKS2pyRVhBRmpXb3VzZ3l5M21vUE9YdUlXTDViWGV4eGgzSC9acktCa2JheGJ5eUY4ZEhwSStUNDk5UG5zcWxqell2cnhpV2kzbUpnaEhYcDdndjRMeU8xZ0VNNGh5Zy9tMHBzQjJmcjd4aVV5TkhxcEQwTnQ1WnpROW5qWFVFL09YV2pHTzN6WFFoK09yN2N6RDlnUk16bkw0UVNta1RPd3ZzbzM0T3NXbmJsMGdsdXNoVVQyWUdxUjUvU0FxSnhLSDdYUHlDUytBMUdWMEJsUlpzc0tXUEtDT3k4MllIMmVVSnhZV2FVOU15ZTdHeExuYjJGbnJzQ01hOGNRRjV3SG91cU90QW16S29ZNjdaYU1aNFoxNGViQnRXMDcvWWdaVkdYekgzSEVGcndyenJFbUlHdzNoYjNUSU1FZFVYdkdqdmVSV0pnY3lNNzFKbTgxLzZlOVNKdmRMenpWWDd2ek1ubzFweUc2Y2dkcmJtNTFJbVRMV2ZxZFFacVg1cnJPdWhDdXd2MUFOcUNmV213MUcxY251dytGVVNnUkg3aDZYOFpWalVlNXA5QkVsejYzb2RUWmtTeld2WHFrUWxIemh5bzJFUklKaGhxa0lvWnNTSlpPa3kwNXgvRWdhUlVkVlRUblJMVzVqcllqdlpyaC9BTS93dGV4YnUwc0k0MXZycFZIRjRGa25UZ2xoM1lNVHJDTGFhNWdUQ05CdE12ZTJSUUFEMktIQXBMOUVFZXJOWFpSd1ROYmdkaG9abFhQYU5qdDJvZjJRNnUzVlpaUjZnWG90WjFwUWdKNHE2UlNGMm0zSFoveTd0M0xZSk96YzZhaFBBVWFYdmRwVnlNeGthS2hIU2lXZHRLU1R0N1VTNTJuT3lGTmN3Wmp3Skg1Ty9DTVdQVEF1dmdJeFVST1FGcTQ0cjFUbWttYlgwNkNvWVdUSUdVdXBNS2pKYTBxa3pkdkZ3K2xIdXJZeHl1bDNadTFMbWQ0SFpmem1xMWJUMm1Ld1FibGQ4azFRMzhsc2prUUtSOEFudDBLRlgyeXB3U1BoaU5CZTFMV1htcXlubFNYb0xiY05sUGF4UTd5TUwzM0g2UUd5M0Nkb0FTRkErSEZjMysveG1OdzRvcWE3OTc1L05sSndvT0tsNDFFWm9qSFN0UmdIMTVWaGNMTVZ6aGJKVmt1K2pDa2hKZHY0WWFWdmtzdnIwRENoMHZ2ZGRZbklLSlN1Yy9IRm05RDU2TWF6QkxYWHdVOWdRb0NLWU1lcVFkRXl6RXRIWE5zL29IZ0hrT1Z5ejU5M21vdHlTeklRUjk4a0xiN2FYb09jUnFSZTNRNU1ENkdwRk1TUjV2bGlRUGJzSGc5YlB0Ni9JUHBoOGxzazFCN284UVZHbFZnSFBHOU5LdGpzYUUvWUdCOWtHajB2OUIzb2orTmlmQSsvYVV1OVBZTFUwdkVEbnY0UjJEMi9qWHRaYXRSWWZUczlxZzM1ZDdCRDJCZ0wxVTF6YmNNTFNHVEV0eVlSeU1GT3FmaDlRd2dsTit3SUdjckRVdThWOCsxbVhCcGNxWFVGUmNDL2pzS3crazRuZGgzM3FYd3NXY0ttazZrdGp3MWMzM0VwZmFoR1lqNXNPVlVnQU5PYzh0TjRTRGRxRW1yc0RoWlNJZm5lOXZSRUtRbjBhNnlJL3FHdHJBNEFXQTNQK1J6WDBoaWpSbzJDdmZBRmdrV01xR3g3Y21WRjFmS3FJSHVadkpwOFhCWnhnRGJGNzBMZjl5bjExR3U4aU9iZm1VeE9XSDFscFEzZXNJb2Vld2NnOXdXUVFLaC85QUJQc1luckJhaHQ3QkpjWnFlbkpIMzhsWjZqaysvQmNtKy9wSENESjN5ajV3VTZVQ3IvZWJXYUYwdGFocEkzR0hTZkVSQ2VxNWJSSGN5bTRPL2Q2SGVEYXpMS0dqc3pJZEV5M2YxMXh5bi92cHZxNVdEQjdFZFVMS2F0bUdINTZGaXpaSmczRG9LYTNZUVBHK295NlF5Y2E4RVB4cEEweCt6c01hWU1CQnlsUnNTbnBCMVliMERJclhQblM2TGliaTcrZkg4dDVHWm94T0RiTVdDNmhaTXNVT1pwYTN3VFkwTnora0d4WENaL3ZERUxUVThxUUFlS0h3NlBJL0p4QjRRY25YSGxJNVV5d0w5bTZoNW8yazJDbnJoSFV2cHZiTDFPZG5tL2RVMjRxWndpam1IaUVUOWxwSk9MNGlqNXp2NTNpUDlWbldSM3dJZ0ZnM0hFb2Y4ZitMNDhodkNuS1cxN1drSForNlB1bll3Tkt0d3ZPU0w3cFcySjVGcHZTT2N2MWpLVWNNUE9lV3VhRGVzUWh0WUlwN29LREpOSzIrb3JlaVRwOXZyV3Z6UmxnM3Z0b05JenNRMnZwZUpXU3JZOFFoaUZxbmM4cjh1NDZ1UlIyODdCM2RGV0xxclN5ZWlYaEVHbnZjbTJpbUZKQlhUVjFzMExsbTUwdDYvOFE4S2gveWVtclIzN2RIMDRkZHlMbUpaZk4zNUlNRFhCVjNpMm5sN2JlSnNEVXFrMkNFYXVnemdzYi9RQ3FXNHRTTExqWWdXVWNLczJ3Ulp6ODI2S2RYY3FmYlU1SGQvQyt1SE5tTHdiOWdiUFFPeTJTMFpLcndmQWJWN2xjOUR3SmdzeW90aHhBTUJkdi9XUmJESTA4OG5WbG9rNExtRFUyd1RZdW9lckNMaXBxUlVzTVlyTnpwSFlNYTJ6ZTVOdmtpYk5TamJ5MTVFbXdNd1Fta1BBdjNHbzlLanJibTVJbktFb1JYelJrWElRdENWZ291Wk45RkN1Um5XZ2JVbi9SQTl5SVI5TWZZMXpHdEM2cElsNW5Kd3dadXlkMHJUanZQdWFRWTlFRkZML1ZIM1FCdm9jZmF2RlhuT1IrUXFYanFhS3ZqRmI2ZzBXN0drZzVTcnRvVVFnY0RxVlFFNVk5WDVtcFErZGF5djJyditiOFZLNXE3dGQ3Z2ZndFMwWm1yY0VyeHpvR3ZaWkxwd0NwWHVEVExhYVpub3dSaVBRc0pCTW5ITFVaR0NhK1N2N3BYeFpKY1NlMmU3VjhHMDlnUUdDWDRkek1wSklxblFGcTl6NHRuaGMrTVlpVWdPWE9lSTNIQW9NVkw4YmR1RThrS2dMMzlXa2M1SDhEb1JHdG5MaXl0MmJnd2hWMGJXYU1tMXdWWG90UzJ4dHVUcUg4RWpUbWRlN3pJVmR2RVREbTR1NG9PalFSdDczZks4TVo5WjFKajRZcEUrQ0FaWWgwUFh6Y1dsWTNJNzZkOUlmSDlsT2Zld2FmY2QwVnYwODlJSkhRUHZrYzIwbXFPSE5JOHdCekxOM1R1b2JBY25hdTczQTBpNUtlNEpUMGg4Y21BakphWklGdVVER1R4b2tRZXBjeVR4ZGlzSEFuZjIycVEyWmJwaTdnSUU1SHkzQXVuVEdmd1ZjMm5uT05VNjFLQWdZMnFaT3dKOXY4NXJhT2FQV0tCR29ac1Y0cUlmUFpNNGc2MG9DTkd5ZGp6SVNFUGZ3WE9KUWRNRmQzWGd1R2tIVEwzQk82Y2lDYUZkK0ZVbWhuemZ6QkJRUUQrZ21BamdBb28xMm8rUkVzVnpmYXZ1TjFMWVE2WVBGMFJhS0ZkOWs4VjRPbzNEclVUakIySVNvd1BmS0JjRlNXQ1d5WUFNM1grS1psdC9RSUtZYnpEQk5rMUo0K0ZYSXVYN0lITGQzNUp6VXJqRVdyMFRUWXJtbkY0dkxRQ205TkE1TFJhZThsaFR1ZE0rYjUrS2wxRi9QcmJWVExJOXVFRXBLRUlKc3F1N29oT2dSWWlDY241NWlCTzZLSHg2Sk4wc291dDB0SG9nWEFjT2dMdUNINmVMN1lhMnNrWk01NXhuSDRWc3hmTGFFK3YvM1lya3RNa25pakwxZ21yV1lBOThSMmg1VWNseVFtMklaMFJBODhGVXFZM0hvWHc4ZDRsMzRrdm11YTc5RWl0OXM1V0JwZndsMVdaQjFwaEd5V0g0RW05Mk9xQjdJOUhnY3pSbitvSHJUT0g2Z1BOQ2xET1oyUDlYbUNHdk1hazF6ZWhOcU5meW9lbjFjUUxIWHBLbUsxU3V3QU1Bek9seEE4WWpCUXpqbTVNVmdlTzdKUGs0UFZpNlJpYTlleFpCbkFFOHVXYmdmVlVKdjhDSUdpRWRKQXNqdXZaNWlBMklaYnF4RWI2Tkt0eDRrRVJhaEQwTXEzQ3FmKzJrOXdUSDlkL29BWXlwL1M2USs3RUFJV1laN0paYndKcW5rVHl4NUZQWjNKeGVuQ2tSQWNvZzdJVUJERC9iampFSGMwQjErdXlBTVhTOHZKM1JkWHN1QUlkV2poOHRKR05RSkFpZ3IzRkhkOVJvcGxZejgvMnNyaGZ3bHJldDkwUlRZUjBqUkh0MEFwQlNSQkFpSFppZkh4b0JYa2s3K2lPcDRwbGhGNFB5UUJaSjBQZytQVWF4SUxHV2FGaFVCUUpsWDFHSlp3U01ldG8rVlZKak1ocWJjRjN4d3djRzlVVnhFUXVRZ2xEMnZuOUpWV3pETkc0WURQckZPN2ZFb1BYajVSNHR3UkhnMlh1N0FENklIeFYzeFN1cTlLUXRoM29lNjFvRWJmWG9qOEFEWktJVjRpVHJqSGxrWXZZSW1neitkVGdnSi9UMFdMZEc3SG1ZSmxNZkFvRmExcmwrTExjWGoxQXlRcVBSZ1JmQXRFUkIrUmYybkRlM3k1d0poZXhuMzFqbDk3cWZoMUxVWmErMmVrd014eVFoVHBmWXA0djcyS29vUjcwVFBQbUE3R1lVcGlPU0t4RUdrWFRRZTlUS1dOU1IvT2g3MFhFQWZCTkRBVlBXQmFXL1BMK01SUVhqd1VpWUhMcWUyMFVlVUtqNzlFdklnaktPUEdreHdnREF6dUZHN1dvMWl5S3VOMnNSUkxjSGRpeEoyVFMxN0ZzMWZzMGdyeEo0NFpVOEkyNHJZWWpUVWRCU0lxTzVHQmZXSWJLcmhFZm9YamtJc3VtdkF3YlNkL0FlRHFnZVlRd2NBUHIzb2pjVHU3eFBEQnZHa0RXQXRZcEYxOU9GQjZpOHBaWEw3d002cHJocTBhNDFTQ2NxcktmVUFrN0N5S1hOS0hrUzAyVnV6R0ZuQ3Jyb1RhUloySFJxODY3NzF0clNWdkQ2V1M0SU5UL2w1SFJoZUhvck0wV2FSaHFrUmRZb09pd2FMb1JGMWhseVV4VitKcjNWVVZoVGRyb0p1MjJNZzEyR2xlV0paL3UyM0FvUndxdkZvSWlaNTJXRjZFZ0hrdFYxR3F3bUxJS2FOYms2TXdXMGpMeitQaGFrU2N4bEdTRmJjVWdWL3czRE5lU1RsWmJtS0ZIK3k2b0MxY1pOU3M1d2RFUk8wQ1JhK3FORU5obEJaZ0dUZUVoTDZoRW03ejYzU20rNDZJOGFNMHQrdmxOQ1paa3hEdTVnL3hjRXBYWUVHWU5MR2ZLekdmbDNkVTA5dlJCMUtEOG5jcGZmUFZGNkxseDFKaXpDUWs3azRvOXRrUStRY2F2Y2xjOEpGVGVYdGwxRFhMbU4vMXMxOVhsRUlhcGtMVFYvNmNmbzBEc3JkWFZUQVMzdnZpamxyNlZ0Um40UmtINnk4UFNKZnQrVmMvZGlkbkJFU0ZSOFpGOFJBL1RhQ2JudURKM1dwWnZYVm1qZy9IMEdDakpJT0trdjR6WHk0OXRrTDRYK1FhcG5iSGFMRnExck9iTDR6czZpTGwxbnhqRVRaaFBWM1VHNWx6b3BlanBWWXBiNmsxNFA5OUFNSjk1MitlUjN2YjcxSFpLcWJaVUtDVEg2WHFvbU1YOExIUTltVDRMU3gxY3lSVzZESXkycWJxd2ZJeEJXM3dxOUUyTVpIa3QweTFiSzhKOVlOY01wd25NNlcyQWppZm14S0JIY2FkUkI5cGd4SmY5bTR3ZjkxZ3NrSVY5dGFlM2R4Rml4RHFpelNid3BsS3NOMXhUQlR4SE41MEJvNVdTZnBCZDlxaXZpQlVWM0svODlSeEMwNWx2b1BjazZRT2RnRjVaRnFKUGpZNWc1djNPbTZpM1M0ajlCcG9sZHhqU0trbXYzWWN2MGwzN0R5QzBMRnFqOHZJcnVGWG9TM2NQOVJTRUJGelFiUXpsVXZNQlBhUUlSZndYUUx2NHBpQ1huMlltY1E0b1RQd0Z0WlJ6ZWdIL05tbHFCYi9KTksvYndaRFc5QVBXUG1lVTJMVWpwS2FuaU5GSGhyNU05d2dkTUx1T0YvU2FsOVBVUG1jRXV6Y0VtMG13Nm0vTENFb3pVdWxFUlhKOExyNVM4VWxabDExZ0tYaEFhTjRsbkdMTldROCthdTZzWFE5NUN1S3VDd0FDRnVSUGQ2djZyMHZUMXNjSEdqaWxraXEzR0JpYzJyajF5QWNWRTZCZmdQQmZBVFpXWEI4Njc1U3RFR2dhd1ZqOVk4dWdGL0JWSEJ6NHAxSjJlYWNtUWNBVXFNMHhCc2tDMW5RdGphbHN1S21PZXN2TVpCNkNFbHExeWNkMExydUJSQ2tGRk43ek5EWlE1dEhDTFFOdXp6NDZBaVlyOFhoWXltTXVYSnhYMndteTlaMTViL2h5VWRzNGZLcGo3SVdXckhUTFNSa1VHZnF1ZjYxdVpucHhtWUtxOURiUU9DeUpmd2xUaXlqYW5uYXRyUlVVeCtKdVNsU09qVW9KQzRYRDJkRkVOamZLc003ZmJSSzFhcVBWN1ZYQlVRNzQ3a1RNMlRhNEpUK2ZoemNmWGJnUmVSNVh2MERvWmVIOFZ3WmE5U05COTN5anJRa1hxUVJjZ0xjVW53Ui9WY3lSajlvQXlOWmxlU3lwMGZxaUFyWStsYUdjL3NQTW5qZ25QMHdPd1FHVUZieXNubEEzeFdDRzhLQ3BydHFTQ0ZWL2dNRTF1UlV3MiswQ1NMUlZpZXd1YVhlaEJKNVN6bm82bVhhMXgzV2tmaWQ1eVdOYlJNaXFXc3pnUEo4TWttUGwrbjJ6Tm1qbnFPSStqVGZkNEpFV3gwajFsc0NLVWdnMXgvUDZkdWxtcm8vWUVEL1MrUWRwbUVhM2plNXNDanNvdnZDRGEwS2ZxVk4wbjdCQlVQdkFnM0ExMG5tVWRWUW1MdHFPOVBrQVhrdVRyb1NyeTBQUTd0NDgzSmlsSGRGNUVHNFMyZndURzRPcVFVMjQyblhUUkYraXJSMGJIN09WbUxWdE9BQ2JQcWxwNVhRY3VhSUZqeTdqNnp5T0w1VDNvRXpWQzR4YWhHMG1JWnFLZFcvU0J0N0o2aXdhVDNWV3FpNnJIQkJhZEc3ZUtPVjZNckZpc2xzMUNzbGxsMEViaExQczU3WjhyTno1SS9wVDZkS0tkWmdkUFgwMk81cEpUM0V4SVh5SzVBZUFDZCt4RjlVb0pyL0ozNTNPZCtnNmtiR2dCNzNPV3J3eFloNWhJRzl5cjlPS2s2Qzg3YVhPZVhaQ0w3ZzlEMHVrN2l3YzBDejNOK25YcEsxb2R5TVBBd3lEWW5ka1c5T2tsei9iTjhHaHNNVWxiUmZITTVIelVYKzZaVnJ6cHJvcW42a2JuVVFMK3Bwd2dTTE9iSEk4V2NkcTlrVncvOHV4eTBMYnZER2pnUUNzT3JoNWhjUE13dGt2aGhSa053NHk2MHBZbXErYyt5U0UzdXZRT2l1T0Vxak8weXJEeDBXQ1JwMDl6RnNQcTRuQVFnT21vR24zTkV1ZUx3cFluTWxyNlZZRzRZYzhsTkg0RjdTMkxYNW9vSm1tdmFaS1BBRVNjUS9PSHliNGV2cUF0ZzJDL25jWDJxaVg0aWVyYWFlaDFiSUc1RkhTbUltekcxOE5NYkp3bmp0ZzRSVHFEcXdSR2EvZHAwNW5Ld2JXVE1URnRHSEpNNlNPb1VHZ0dnSEhuQjdSS3VCc3dsNnFDMVh2U0l3OEpmdU9QMm50Z0JpNWU3NmRaczR1WDZrbjljUlR3WkJJRE9jRTE1VWRRTVZUc3hKZ2twT0V5M3pZVThsQTJPSi9uMW4xWHZxbkdpSWtSMnhCczErd2FtNUhod2tpZGkwZUp3Uk9aSWpscmpsQW03M0VPd2RYN09Gem1WeGMva0M1KzVzWnpraERrd24remJxVGx0ZHJEWXViM2hqRVZmdlBJcVE1NDJET2ZycUNCMUFYUFZyR0FQVTdscTd3MmU1Q3NqczVLbVhSMXlsaXpVRHFudzZ0ZkpFVHpYSFFBTVUydUhqUWJ5U1B6WFhYRWFmOUE5NlAyNDBuUHNKSmJ1cWtqalEzSjhvbTh1TmFUcndCS2ZHaXY5UGNacnRWbGV5MXAyTW5Gc3ZseERyTFlabWRYcVJRWDVqVjhKTEQ1MDBYNjZkL2lMNU1wOG1VOVp1K0FaTExCS2Y0WVZsYVhsY2tWKzVTcVhwd2NXSml5cnRtcTlqdDd4YWZjSnkxd3lDTDJOSnNUdFFqWWdJaVllRmFqVEJqdlhCWWI5UEhhVEFqVWhUcWxzUmZjSldHKzBrMi9SY0hSZmVhL1dvNTRWbVA2UDVxWnUxZGdQSE9XM3YzODZtd2JOQ09EWGF1LzFZOUQyR0R5WkdMa0V5ZDdJa2FuUzY4aThXbU9pek5xKzVyZnNvNWduV0prV2dWSHBIdm5qeEhtb2tpb0Nsa0xERGRkRFV6cXZCcncyVkl6MVJjZVNzT3N1V3FzRVB5c0RQTnlLTHM2STB5bXgrT05wblM5UW1ybUZTOURySkNjZXlGcmFZTDJ0MlREa3lsbHVXUXZyRWZDNkh6UHBCc1ZDTm41N2loRjRuMmNkdFBGSzVqanVqWktHR2s2Z2ZIMmlLSWlFY2dxZUh6NlhDOHI3VTZkUEp3VWFYRTNna2g5YWp4dWltbzhmc2RQZWZ3aXBaRTkzZjVHVnBoN1hqVStSZ1VWbGxZNVREby8wVitBaTRPckx5Vi85T3ducEVEL3VqbWhBM0daRnY1K0R4ODJZVmtpZ240WjFjemtkRXFnUk5QbVAwUDBOYmU0U1VJU3J6WWxCaVBNT2lYK3VoeE1OOE12YVFrZ2hjSTN4ZVM5Wk95NjZuODZJZ2dnZ2xKOHZUeTNiZWMvUXMrem1UVDNrY1QzUWZQWG5BdlRCemxaaEFOUHVOK0paamlXQm9jMnAxbmw3RXNiSUZuZnMvVlBQL0hXTzhEdFBzN0JoSFo1VjJ1eXBGdy9hVUhab21vdkUxckd2L1RyZU5DRDFIdG5xK3NQVlZUdGs1QUNyWnZNK3pNY1lhUmFSTTBYZ2hVNlpkdHdMaWtqWGlXNlEyY2VNMTA1U0ZSN044ZmxPaWNLQWhkZllRTFdTUk1hcUJXYVNEVG9GdUhKL1NHQjFXVGQvaUNZVjNyaVU4cHNHKzE3a2lNRlQ0VXNhQkNjQjRSQzVuQi9ubysyemhXMVVkTnpFZU93R1Nyc2YvZnRKdVA1eGVSWEcxQXpBbk83dDJhVEZaS3pWQ0Y1OWpXS0piUkJjNUEwdVo2K3FBV0NkTXN3M25WT0xTVkpVcmY5WWd5QS8yNHU3R1UrbkNZbG9IL0hHenhCYXlRcnpRamxzU1pZdUNua0U1V2NvMndsMHc2bG1ZYXEycHd3ZzRWMk5XYkJFcWRKSWJVSmxIUlJmZ1V6NGNycVFGa2hFdUh1cDdjSXRJK3d2NDhjSGJZRGx0QWpxalZqVVpNLzRiV3c4c2N3Q2RtMU10WGNQOHM3YWhrUkJ4MWY1QzlvWU1UUS9BV2lPSk8xekgvQ1pOOWdSYktSUlYwd2xRNnp6Yk9talozWkEwTUo5ZzBvNkFHNDNZNHU1K2F0N25SZDdtRjExWFFXQlFlRnh6UE8zU0ZLcE9maE4yUkJXMmRIaW80V3pPeU9TdGE0eEc0TUVaQU1ZYmFLMWZLSGZSenptYm1oeEh0SWVsTkNIUitPZk80SCtYVzlFZndkRk5QM3ozY3VQdFVPVytoWTVMQk9RcWNQOGs4ZnJzWnh0WHJaaGJYVlFyNHY0WWdvejZIa0c5WkxzejRwN1Y4bVIwUVgrV2ZwOGhvT3Vwcnl3VUtNU1ZiVnpIOXFLZmJ0d2h4elZOK3o1NU9peDBuR254b2xKZ3ZYQTNRZmxGa2VidXN3L0VLQkJjOXN5aDl1dkxIVjBMaGd2Yjh2MEtrNlN1NndESkdPSVF0eFBsSm91ZjhWRlJoTGZvdFJzRmQxbEhDWXdFM1VkdW1kenF3eUJxU0kwcDQzbkFXRjhieGZNSDN4YjNTLzRPSGtiRjZTamZaNDhuanNkcVUzd1NhdkR1OHRIdnprQSt1MlZSZGd4ZXRsa3lEMkZVL3V5TjdOaGxvSW1ITythVVluRVhPdXk3eFM0alVQM1VlTGVnb3NuVU03WGlpYnNqS09qamhCVFJBcVVSL0g5VGt6RHRRL1IwbnFsZjRaWGFuNldDVFdvTU1YbC9JUXBNcmpsZlFjVm80c1ViWnRFT2RwRS8vbXovREFsblcxZjNaeHVVN05nSjFkYkdFbU1zbDR1YnpBN1o3T1BHcUh5SGJka29VTDVTYUVJVDNlLzNNcFMxejhzdVlXRGxzZTlrWDVhYTFGSW1sUm5tNjIvOEpQT1Qvei9uNG5sblVTaVAydHJ3eDZPdGg0MWlLNHN6NmJRUWwzdkM5Z0lBYWNRMGFuMWNKcGQwSC9HVHZLU2JFSmlQMmZvYlZYbXphODJsR3BxcVdPY3crU1l3T0ZKc3RYbk0yekFBTkx0aUU4MVFyTUkwZ1VWYTBhRWJqT09oam5yT0h0ZXFjS2MzMDAzbFprYTRVN3k2RDgwMlRBZ2hKbmVjR2tpUHJ0elIrTzhWYjA1TCtnRE9VN2J4ZjU3SG13WGp2S0t6ZHkzS1grOEx2WmloZ1V3eGFBYlMyZnlFQUxrUGNBRm00U05ONGpSTU9TdG51Q0lmWk83RHNIbVNXZjdiaXczbDlCSlVpb2RUdEhGTXpVSElnd2g5eUR5R3FXUE4vWVJuR1hqSHdDMTd6UnR4YzR4NWo0cTkvMjBNSTFmVjZFSkNlZzlCTkRWMk1xWk54dGwvWnJRcXlpaXpSSm85NGEvZk9hUjJHUE1RRDBLYzF2MGM4RkR5Zzh5eVByWXNvLzZDNm9wUk50YW9ab2p1S3ljMVkwSUtpMW9mbzMzVzhTUldTeFNVUU5nWmsxTi8zaDg3MDcrMW9jMFNBOWl1bjVvSDlvaG8xbTYrdi9aZWdOd3ZXL3RNdm5QVHlNVFh2dDJRaThlek5WSVFUcThOdzAvVjdoVVR0U0t3VWZ4ZklUamIrQUVweFY4Si9nMEYrWnJ6ZHBacW9aelFhWUFWdUUyMmU5dmRpY09IM21HOFFOYkR5M2N2c0RrWjRQc0JvMDR0bzFleTJiUXFCY290R3orSmQzd1U4T0JJL2tLY1lPZEtYSXZDU1RIS3VuZHZRSDUweUg1b1Ryc09Cd1JLSXZNVlA5V2Q5YkZ1WGZXWTA5ajRnYndXemh6cmxFK3lmbjhKOTBRMVFRVTMzVHEzYUE5bW54bGE5Y3Y0VklTemhqSEFpcjdLSEdZaEdxNllWWDRJY01sQmxTNm1oUGhid0xuYlVwdURaMHlBcWttZEs4WitxTGR0ZERTb1hDRmxyeHo1MkFGQVE3MWVQL1VaMENaWjlGM01tTFZkWTBxeHEyYm85dGtiNGZkaExOc2xMbGNUcFcxL0ZVQlRwSUJCMVhSQ0tXL2xZS0l1MmUySi9RTFFtWW9VanRBMDJQZ2JrTFNscEZQeStsNEFxaE81MUlPQ0ZZL1pNNXRENTErN3gxNDNqcVVUaDJPR0hUOTdvdjV3ZXVkUVBjTGY2RC9lNXZlbkxTT00ybnM4WVFkbjYzZmhFb1V2ckhKWC9VWWl3QXZQb0RlbkdZcm9GVkxGakdWY0dIeEVSMTA2bURFZDZnVnNTK3BlYm04bEVybHZFWVpkSXAweFlBUFRoQjNuRGZocXpuc0RtN3JGTThMUCtZbmFpeUxvVlNNRnVrVEZOT3B0bXBaZ21pOG9kR0ZQY1pyT2VDWnlpdnFOLzBKektPNEdiL3YyM21xeVIyOW1sNm5PVDdMRkFrY1ZzL0NtYWlVeDNsZ2RhZmRiUExlOUVVYmxnMDFWSEtyd3NtZEZveFhGUFNVcE1GTmxVMDl6amZOYUpjL3NJcVhSczM3aXRJMGh6Z2piU2g1WUZEMGRNcjNZczdBQ1p0bUFMeVFUa1BWVEZscTZidDU3ZnFzMkFBTHN3TGsweld6YnRneVNKWnFEblVzbzRyZTlSQm5VUnFUc2hPQjdTV2RqK3JyM3RhSUdjdU9pc2JDVkxRTFFOdFpFV0N3dFZJaTdYbTVocXllb1o0N3Qrd0paU0NGYVN6bStnS1VLc2RrNWI3V0dxelV3UGVmYlRDbks1OGVDREFodWU5bE5rb0xMT094SkRLbUY3c211bSsxNFJ1K2hmMlZyWUh0UXJ6TWVuVGZQZ2tsOENtQ3E4TmlVNU9xeG15ZTdHeG1icHVPKy9DRDMrL0lRQ3Nud1lhYVdSM3lNQjFHVlFqMU9mTHdtcTVFMm5LN1Z4VUREdU9LeGtMQWlSK2RVN2VOcjZVa3dDM2I3Wit0ZnpFNGd6VFBYZS9DZGVWbzJHSE5DS281WmRuejdoTWMxL3hkUWZ4T3BicGR1Z0EvMUlLdW4wSlVvRU9uc0Z6dmdia0NHZFlDUExaYlBpcDlRSmZVUldSNFJIOXhBaE1NT3NDbVlvM3orRVFYNHltbVFCdEJzdWJDdm0vOGJ2c2MzSmZ6R2hBQlFRSm1DVXE5NHpIYUFicnJyWExYNzQ1RTExU21IMk1WT2xPbVpPWTVGSi8xSkhIRTd5M3J3N09TVmtETFc3L1RuYVlwOVVQS0hvVVFDdjNoY0tzZE5VRUxVRlI1c1dLZUxOYTVSOENxWS9xYlBPeHNINDQ3Y3p6cElSQ0dRVzgxaVdjLzZTcXF6ZHpHUUVjNWpQOGNIekUrV2xOMlYrSlA5dFYwSzJIR2VHSlEwR1YySUxRRCt4M2VJSnE3czVET1FEdnByM1VNTzNacmNzQmVoNWV5OGs2ZkMrVmJ6UzR1K0ZIbElDNGpqbmFTS1lZT2tQSkFqTkVJV3BsNXhJWU1jS09FUy9oZmFVc3c4RjE1M2VydUdhN1I2a2FwektGL21QT0NtSXVMb3o1L2pmdk1qMUZpQkgyU2RnTlZtampzRjg2d0UxcEdWaWkyUGZBUmZDYXhvNURBamZ2QlNnSkJoS3pVZjVLUlpMa3RJMlhaTTUxMWJwSXI5MmV6K2JJTkpBZkhyL0d6ejNkb1NnRE9sQk5WaGd5QmI5SzFlQW9lb1FmMmw0Uk5JT3huMVdmb3VYcmxoYUJoT0lLNkliYktCZWdQS1JXZ0pxc0NBMHdhalZsMEwvdnBzMEo5UTRYMlMzdjkwNWFDeGdHR1EyL3FVZXZTMWQ0d1l5S0VZUzZsYnVzODlCNFozWC9KZTRDcS91ejVsU0FLTHFSdWtOYmxVSjV1MnIxdUdwcVpKcGxrZDRmejU0eURxOVFWSDUwTWFKQnNjdUVqV1BiQkVUN3pBNzZ6bkVvUXB2THJwQ21VTXB6bkl1bzJHYnJISlVyNDlsbWo4ejlLOEVicldicXh6c3Z1ejNYZHFBYm5UUURyOWorbXB4WUpXRXlVbUdOUCt4RUlyMVVlcjRuSlhKckZNNDlhTGFJUHJvbllWcHJoempJMWVKbGJnczAyZWVFaWY1azNCdVI0NG5nQmhHOUFiZFcxRUxXeDlIekZPd1gwSGJEZm9nSXpBRk1DZlB4MkVjL2tFT0ZxdktIdFlDeVlETWVWb1JnOTZseEVveHVTeU5odWtaQ0VHL3dNa1dMMTB6R3lLYnU1ZG5ZeXY1Tk5PNlZzTVdvRnRHV1dFVjVva0NaTmsxbXNSc0srYXA0ODBYcTFPK0ZmUzRpcURGVlhzVytVaTB4OGU0cmEyZzZUUnpycWw1TW9zRTd1OXdiOFpyM09sT0FjanlsUjRxNmJkS1hQSUl1cVBkMy80SEYxbk9BQ2lSMGFlKzNjaUdaaDArUGg3aTVtSmdQRytVU004bGFwd24yaVVhaHpPTzkzSFRnV1pXNy9HY0NZNXNPOS9SeG9iaWMrY1ZTRTRKcUhrNWRHM1VRdlE4dlFGQm5XUEJ0Wkw0azVuQlRLNExRVmpYaWY2eVcvQlJ6Mk9LdGFpbHBrbG04ZTVXeVQvZ0NWZ1Y3WmljYXVQL0dwMWZ3N0NJbXE1MVVlekpKcElVS3MxQmE0MXNvTmxxMjZFZG5GL1NWQlZuS1V2OVA5OU40NkN4OFc0OStHNVQrNkIzR3ZlUWdPeHZ1QUxnbElYdVhWRFpwcEJ5VVdWVkZtVE1xSEN4L0JrWVFDMHQ0QUhQK1paVWxLN0g1em9iRS9mcmpWNWl0Vmczd3JPbUxCTXorTEE3enQ4VEorcFRMb0RleDB2SjBLbERWaFRxVUVscFNXZU96NHpYaG5CTHhYTGtpU0hpNHRUYmovY0ZRb2hVai93TCtIMlRZV1dpS25lL0Q5K3ora2ExVXlsUUhWeW1zWHdLSFFTL2NLWTNOV0s3NDRoOEFNNUhzR2xGMDVBR3d4dGg0amFCRldWOUFrZG1lMmlaMmExVzB3TTFNSVRFTjRINndsM3V0QkNDekp2azllbU1zOGFBM0tJQVJZNDBLVVczeWwybHl2RWE1clp0R3g1c3pZNWZSK3FOZjU4NHRuTHR6OHV2dGNkSTcwRGpPeE5aRDNidzhlMXhZeksrS3pVZ2s2UGswR2cwWk0rNGE0M1dVUnhnUGVocktSUHVDcmFwY0RjSTRJL25wVWxUQ1RHeFVhSjFvckFKOCtEaTVzanl2aDVaRWEwYTUzWEkxaVNjRHJpL0loK3dxOUdoR0wrVzFBYmpJNWVQWDkwb0ZTWnRab1JxQllkK3hJS2tkUnBkTjkyN3podkNlWEtNS2duYWVDNmMzSWVWN3laM3k0RDFIL3BMQnhUeGNobC92VWFkODZBRzZvZ3ZXMkd5UTBLNGxkOWJiY0V6TnBnY1FqTXRzTXdLMEVnRzNuZXliZE8xSWtBUCtXdTU2QVJ4RTE2VGVIQWNXenFueU9ybklsb2dCVHIvMnJxWGp4byt2VlJEYTJjYW15dVpLbnRzbXRDYlpBbHpmdGdmRjU0U1lna3ZhN1BZVWlndVBGdEx1Mkx1YnhMMlJHSE1MWU9PUkg5Mm9icTFYaXRuaWh3ZWkzZG5ER0diMUZHdjNyWk1LWnczdW9iVWVjV0MwQWUwTy9oQ3MxcDh2RWpFYlE1QkRLMkhLclRZMGE0N3RFRi9oVzFIZlJyZVMyR2tQb2U3WS91d3YzSXlyNS9FUXR4dGQrSXBmUXJmZ0tFb3B0L1FOUjVpcllxMGtxRHpvdW14V2FEc09zbW0zQVVKZUlOS2xYME1IaTdTR09taHlBTUhYZEpTSi92UFJRZ3lqTVc5Rk9EUXVNaTJoa2lCVndmVEdDRWh2VThCdjd2aTFGL1BKVzI5d254aTRvazEzeXNYb2tVMWQ4N3htTmd3WUdhVTAxT25qa2ZlOHVXekNGdnVaT2FUUGNIT1JXNlN5L2hHeHBVZDNFVGxnMk9jdlorK0preExKOWpXVERxdVF6eFFBWGxQdzRjQ2IrY0RWcFJWZDFqS3F1Qjl5NGFuMzNmeE5qNVQrcnBabU1ZSUMrMDFFZzhxcTZRQWZVQk1mbHpxS2JrZUFuSVc5czFKSDlIa283TVprazBaUFRaVVhMUWtWMzhCTjRBclRxbHpsb25HQW1YRUVYcUtEbDVhd010OTlEL2VReGNlL2E3RzU1cmEwY0JvY3BqbnAvcjV3Wk96UktBaTBtTkgvOWRSR1hSUnkvTkpKRnVGNURWUndWR2lLbi9ZWjV6U2gvTXROczFVakNMZ3JOK09OenRxVzVTQnhYd1Fsb2ZyQi9WMWFLa2FYbUVuYjVyL3ZOVGJCaVR6RWdQTis3ZDdqSzh6Wi9tQ1ZRY3hJcWZMUXBmRnV3bWV3SXlWQTFOL2JScHFwZXF1azVTQjlubms0NzZ5SmorYk5UTEl5RTB4akUyZU9EOGVha3Z3SlhNUXpXVXVrNDVQdlJkbTRHY2Rud28xTXdPWHJvNmgwektMRDBNQkJJOFdQczJVNWMzSlMrT21pVnZsb2gxWlByTnVBdHdHZWM2SkRWQnhnclhKRWx1MzJjNSt1Z3Q4SGVteWx4NzlpbTFpMUl5aXN2aHdLaHNFQWVpVWhzNjVUOVJKdEZVNDdiK000WTZLYnlLSmtZK29KV2k0UkJMbFJUZGpiRUZpTXJDUWl2VUJONThTWkJwRXpsYzhTbmkwaWR1NThMMUVmUjBjQ0NVSW5SZmZuaElPQnJlenJ6ejRESFkrRnVSZzNvL1d4Z1pERVR4T2hVa0FrcjVKbGJpTkhSQk9RUmloemVIZnlGM0ZLZTd0VEVLY2N0cnd6TFNSVll4Rmd3eTFndUtydDlnb0tQWTczQnRuTHREaVFSeTkydEI1ZVdBdldmZVBETHFvaVIrekxNeCtUTU1JS3FlYmVxbGEvdjNRTWdjT3VaakNqdUJXOGNEMzdySHdqVzZsYUlaYVVwdXB1N3pWNVA4SnJYeUQ2aVpzZUxkK2tyT3lXZzJxTDFIOThhTFBTL0M1V3J2WDUwY0ZEZ2JkUnJ2UWlEYUhlbXNWU3hHeGhHVEZ3NEZmbjBXZDZkaGl0Ynh3Ymo4MUJ5SDNZUWgyK3FUR0hKd2RDTzRUMTZ2TUNRRmJtQXR6SlpKMTYyb2hHTnVQajNSNGZXVmIvMEVWWisvTjlIalI5SmlmMzZJam04ZmNBSTEwNHhyblRZNjFzZjd6RWhhcDZjWUNCcmViS0tXZTJRb1Jyb3owck91OFI4ekNacEd2OUlpWlFqYVNnSXY2N1hrYzZrNU9xRExMM1QrRzh0SGhneHUwWGtvTGhVRE91aDNoODM3RVRUNjlOV2N5NC9ETkRzaGhtaWFrSFVvTUVhMXR0UnNMOW9Ib3plUW83SmxBM0xwZXN0S3NnSlYvbkU4VTUvbXRBS05sbi9IYjREZlBDbDVyaUh0eEltTWtFaE1BQ2c4Vk9sVUNKVDNwSGUreEtvZzBxdEdCWlRuMnBmQ0xPdVZ0aFpSWUI2ck5wbkZBS3Y2MGJENE9CeFZydHNuVjhtVCtwMUdySjVHQVdWMENCMmkzVEVsMnVycEhMVFFSSThjenZ4RVRQbGs5QXMxSUVLdTBhOWlSenREZldnTnRkNlIxSGVuRyt5UGV0cGVGbVZMMXduelpLOHdqQS90bFdrMS9DY0FzRkZFYkpVQVM5NVpzZHdqdHRycjV3VkZyYTdycWFROUU5V0lyTnFZdEprd1ZxdXpDWE5kUW82Y2duNzNQWjl4SWVVcWwxSXVOcHZMRkVGNEFsWElDczBZQlovRWRCREpvN3kyNm5BaC9oSi9vaW1rb3lyaGlJbTg0K2ZsRkNvWG9MaURNTDhsbXlUZFRZWTFFdHo4YmVaLzArYU5IWGRLMXRaMlBoNER5enovRzdwdVdLaGk1T0FZaUVGY2I3RGhPMUxoNm02L2hRb3YybFhtT3RnWjR4TmFBUDBScWxob2lWMmZqVllQQURlM3hhbldFRXlOQ0Z6bmN2ZjVoNEh5akQ5ZTZFbC9EZ1hsSytGNkxkV3lBRmZpaE9xYWhFZVNrNFFNUG90b1pMUDVRdGkrYk00Q2pGMEtOVmNjRHpmWFZVRTZNYkZqbzZyM1M2T2ovUUcyaEFxRnBoMlF1bmFrM3JodU5kU0QxT28vcGlPWXZIdUNjQ1V4d1JEUjJZZGxhMUpweitPa0hlTW1oblBKd0h1V1VwL2pVVk82eG9ocW5GS2dJTWszc3VUVDUvU2pWNTErOHNYcW5td2hQdGNES1FmOUEzYjRxMGdyZDhVd085aFpvRG5SVmdQRlRpM3l5Qi9UcHBJOFFZMFAwb3hybnR2QmtYZDMzbm9tV3ZyQTcwNnd5dkM1UkhPdFNKQ1dza25HR0xSeGxBb0ZOdUJIVmVQVENmbHR3WUEwbzJYZ3VMdXZyQ1dQbHU0TW9jMXVEYjVReThUKzZJUklLNGhjcTkyaGJwVWRyZjd4c1hzb2FPZ2lmT3RITytqY1ZQRWdkTldCTjZkOWNMRCtOeDMzVnhuQ25DSU02STFUTnlLczVlYnVlWGVBeEdCdFFDODJCcUlvdFJFa3RWY0tlcGtEWmtvTm5FWG9aVTVuV3dlMUF5TzdhOUkvMnE2N1JjOW9KNC9kRThUUm9kQTJpdWR1dzZoeG1YRmhwWkJVL3hINWxOZW1WMHIvQkdNU3EzK3lzSWY5MFBzYVkzVjFGeXU2SlNnZytoaGdpUXVOV3IyQnMxZUFUUHJyeE5BaWdLMU5oRjIvaGtLMnVsVXZiNEtmZkRIR1U5NmYxeGFGNXdqS0p2ZWZMdHJRT1hKK1lVWVBaejMra2tMa3ZQVU5GN3F1TlBFak53am80bldoejZpckJyamZvczVENlZUNkFlZFlXbTFoRFRGRjdMT0tGeTNVL3VWWHdwbXkwcTlEcC9CZndwU2xNNE9Wb2FwYXdiWkhTOUFHcWppVFBJaWxZQXBaeThHTjA3ejlFd2FValRQRWJXbTU0cm5WK1BMdTdHaHF0SXdxdGsrOW00QmFDVDJqanNnRVVxODM1SGdld3pNOXRldmhVUkRpOFhRaEhpRSt1TnU5anp0WTAzWGpNalFrVDZRMWtIcEZFM01uczRPQ092ZVgrcUhNVkJ5SHVCT2VBOVR4bjBPUTFJcVJqMUo4YXVhUkJIbUE3TGVsdHpLOFhQaVFvZjFzUmVIZFdPTDlzTXdCdm5NRVZNR1NuNTZJNmMrMWxhWXhCNUNJVWR0QnBqOFZMMVZvdDRUd0ZoZWxDS1crTmlKVDNueHN0aWRkVENzVHlwN0FVM3M3VjJmbEJTSk52WXV3UnFMd2xVS1NQdzBHMDg1eDFVT0Y1ZGxHNk85Ym5WUWtBbkZzNzMzcDVVQ0I1N1NJMElZV3ZrT3pZR3B3NE9zNnhxSUwyVm4rVGZHa211ZmR6ZU5CYzN3Q0w2Tm03cWxYa0FSdG9XMmw2Zmo1U0xCS2d6UUdGK1M5aXQzc29oWlZ2c2EzWExvZGloL28xODdyNE1OUGduL3dlTmZyY0Z2RFdKajVnakl3b2NlR3l0Mzl6SDJzanhYd3B1cWNjM0xxdnlZZCsxTk41WVYwa0Mxd3IrMERnc2txaW1xamdRMllmRU5SRVNlVVN1a1dEdEpCYWlDSTJxSzVhNlVpVTJWUWdnZ0J5RG1mVXZORmpSSWhUOVNDdFRNUjV4RndiVXQ2cmY2KzlKUGdoNFZGckhyU0hkY1FUaG82R1NQd21WUG12ODBXcHVKSEo0Q0l3THoyRjIyZUFHSmp5OE4xcEV5N2EvT0NURFljRkJIYWhCZFcrL2NNTmNjUS9zcE1kZnQyQ1BDS1N1NDJOd3IwaUgxTkNqSG03ekRJcWlpcjlSZGpLUlhoK0k0YjU2NTZ6S1B0ZGV1RHlnK1VJYzl1RCtpWTBSekFaVUdBZWNxR0RxaDQvVCtmM0N5OHlqZ09KZ2lDbXI4ZkdDalZZU1ArU1Q1MHQwSDU5QW9TWC9XbHEwZDhNSXFONVZnRjB4SEtkUWFKUkMxdVJ0dHBuMEdPUXIwTG9TRHpHdUhHM0J6M2gvT2NUZDZyVmkzU25FYk5RSFZjMUF4ekduV25VbjlPN0NGZHhBU09peHFMSVUvWWVZS2pSM0d5a2d0UWs3UXJucVJMZUJvZzFyU0dSVkJwTG1UNS9kSzV1cFB5dHlEVFNnQ2FML0pBNkljR01ZK2EzV0FUdUlPR1NFcEMrcHhxcUxTK3c4c1l4RWJHZCs5KzQ0MWF4akg5UUpOQ0VNNm1rWHRDaklMQ3U3OERkeUlmMVJkb3dqbUNDNjRuOVduVlAyV2I5QmVhSlhkSHRzRlI0YTh0V1dGdEE3eldUK0tVQ28zaGtiSkdJZXRRMFdkbW85QmVhcERRaitadDk3dWgwWU80b2Q0eVN2TGdlcVRNdEp4UEprc0FVZDIyUUxXemVnSHFqd2FwdVlEaVRzWU5SdThRL21kUDZ4eVBDUTBENWpZeE9XaGZwcjhuZ0dFVjE1OXM2anZsYjB3SW44Sm45REZTR0RBbnR6UHVmeGQxSXdRUG14elZJT1dIWVhQWFdnMGNoY0tqMGszbjdDQTdXUEEyQ215eFFuUmplLzBBVzBhd1cxblBsR1RHdlc5Y1J5Z1RQRXVPUEpPVnlrT0hSdWprbi9EeDZyWHNFOFJFOTlxWDBxT2w3b050VDlvK3UveEFEYjNyalVqVlB4bUFRc3JVSFFOZTdrcEV4TE5DVUVaRmlmbXdVZFc2ei9VQjhRdzA4SzVBaExCbld0S0dEMmhTNStZMmJ1TktMbXR2Z214eStRRVAvMUJqYkltb3djejFKaDBLZjJ5cytaN0RjV3hhVUllZlVYUlpDVTM5alRURDNYNkhuYkdVRS9BbElqSGtJMkEyTnp5clJEWFlha3IxSGZUbVI0c2RDcTh1aWpxdG5RV3hsUjhrV1BhdUdLVjc0aW1EZjZXY1FOVHlzYnVyUVRKUHpJeWpYSGlONjV1Z0tkVUgyTm95aldZOWpHTXVUU29VdWRsOGhRdVRKNW1UWmxNdGhYRklSUmhzV29XaHJ4Ym1lWVBGeGprdEhqQ3dCd0NpVGI4M3ZsOTZxU1VkRFExUkZwQWIxdGUwZlpKNk1WVGE4aEl5Qjd4YVMzbzg2dkNGdDErVXlNaWYwN2ZhWmRYbVNic091aVYwQU5RT0lJUGEzYVYyY1Z4eHB4blpVQ3pYaUVuWW5yUFRETFM1b09qdmlIZVVaSjljRTJWNFBLMUVpYTRMclVIajN1ajdlcDZWOVlEa2FGandEOTRvOFNpUldreUswNHNhSUQ1VUNKSHJjdFoyYkNpWWNqR2dRYmdLU21CejFKbDNyUm1tc1FBYldmRHJLRTA4R2dkd3liTGtMbllUOWxCeDJQTmplOURkVVhiRFYxNzFTS3RDdVpvWnhuYWpUMlo2UmJIQ0pmRFV4MEZmWVBnbmowMnFpSlpwSlNQZ21pbXNxSUt2ZGpvNS9TOUExMjJJMTdha2x2WGdYeWxhL2JrL3FyeXlkbTh2NVQ2SDc5SUI5dm1iY0lybjg5SlBxVUhJb0lvY21CaWhkSWJxSFE1NUlZbjZmdWRkM1hvT3hiM3pxWE5rTUp5dmVHdzdHSkVuNDlNNDdMTkVuUFNDMkh5b0ZZZEp2OTF4cmUxTEMva0xyc2RCclVIZ1crZkdoSEovdVNkUWZwaXd2blpiQzd3SVA1a2FqTzhMK2UrVUI5VjlKL3VoVGlYTDZSaUgwTWU3QVdER0lXWVRPeXFyT2cwSUdVQW5MVzRRbG5zazNXeHM5R0xxRWFYbU51QzVyUDdISlFOQytNZCtOOGlCNUhldlNPNE50V1NkR3VRTVptSFpuVkxvUWpIVXF0RGJlZ01nenhBdVlmTlZlYlFWVFJJRHBvUWVhUzYwUmovaDdicS9vcVJEOFhUMytJNGQ2UkxGOWdTVVExNTMweTd2Q1IxdlZ0ZmwwREFWZVJhcStWc3F1d29jeFB1SEJPSjhML01LcDlQUS90OHpyWDhiQjQxdXJRMHpBaVYyYWdnTXFkazBabWxneUpremNMQXBLaVZMLzB6UmhjUVVFOSsyZGVka2QwcmdKTklGcHBudnIyaklIdk9zdFo0aGVrK3pFc1F2blNEUUQ2UzRETlE1SHE2MDlXZXdaZFhzMDVHQWEwOGJ6VmJidVVzQlFHV3R3SU5aZzdNeklDUXFpWi92SmUwQmpRSGR6MDFLNXhIT2ZkQ0ZwVlJBMVhkdU1MNDNNUUxVWXdVMkJiNWtTQXZTQ0wyRHhYdUxrd052TTdwcGFPK3Q1cmZhUzZ0b2J2dW9VU3pralUvOWJnenp6amI5QkM1c0x1Z2JsUnVIT2VqNFFyeWRnWXZtTElWd3dabUoyTW1KejN2YjVOVm5ybUIySjZMeE9ienRZM2hNL21EUVdWVTJWNE5laXZFejREaG4yT3JqSElqSGZqRmNLTlZNWlU2U1d4YnlEQ3pnN29jcWR1MUdJS0doMlp2Q3BGWitkeWJCLzBYdlRBZFRvT09LMDdzbnkrRVVPdEQ2VU1kdkZaZWdnWWNERVlueHlocTAxVlhEQ2Ezd0tWQ1FJVWg4cVBEWngxcGdvV0c5eDFDd0pjQ1RHVkxtSVhKaG1WbGJMbWlJOGlXMGVqcWhnYk1oUlNLeVhNbGZiR0tUOVI3K2FtMnliL1dMQjFwL3FhVlRLNlF3blNrNGNyRGdwdWNRdEhiTDdYbFl0a0xLaWxLSDJ3ZEdTNW52b0RSWHhiZTh1RGIxRmtqcXZxSTlQR1p1MU10S3RnVHU5enp6d1ptWlJzd2Q1dG9HZUV5aWhjWEpmY2M4eWdoMGExR0dlVGhSUmg2dzJpOGJBR05iRHREKzh6a25TdlpJbFVCWUxxVGZTR1JRR3ZFbmwzUlhadnpHUG53L3FWS1paMHBvRWJEb3ZkY2E0KzZMZ1B4WThmQVhKRVN0dW9lc2F5V0dHTmd4QVlIVWhPZEdBTzcyRkpIak5LUWg4QWFyK0tZWmprbkJENllPd2RoWWdVOUh2dkFUVUtaMVUwQWMwL2RRT0krcmh5WEVXSy84ekIwdE0xb0x0ZFZPbnk0RjFHSFBzdjc4NnhwUGFlcUZ0VFdKNEdmK2VVSDlwWjBreW14VlVZcnlKQjVKT0ZIRkNWMHgycUpnZDl2RUVKWlBkVzNOajM2bTVmS1VORWliNlpXNkRRY0kyMGNPSlJLRmEzcEVGdHF3ZHlGSXl3VUhxbmdCT1NXZmxKcklCSjJNcDlaSFJia291djRyU3JGR3R3YkV4SjJDUXBCUGZLSzlyYTBhcVBDN2RhcC8xV1p2M2hYMzFmdDZhT2lEK2RCS2FFOElEZU9WOVZJTk9sNmRZRDVicHNrZFFnZ25tREVXY1B4SFdVZ2w2akdLRGZ5UlBDbXhSVkVKd1JlNUxndTVOajN6MnRJWElvZURWZTZibkpzeFNZOUtSSlpVdTBFclpvQk1VaTV6Zm8yU0hVTXczQWszZXk5VUR5d3F4YWsrTzh6SmxhWDE0ZjkyUGdadE1VTFpVYjZiZXJURTlzVXFOZVdwVCtreGZhSXNwYmJlUDdaUlE3MFNWN0VGNjI3MHpmcExXNmtRRGFLNWU4MHFmRXZUcXllckR4VGswcHQwS2V6K0dnZFdERzUwRVJJMUVKaWIwZS9OdWFzLzVHNVAvY1p6Q2VIaXBlbVVqb2FLRS8wWTNSbGpSMzNjdUo1TUtNRHQ4ZVpicVF3aElMUFNWbE85cXpyZG1aVkhzdFpTTmxVdzlDZGdwdW9MRkxtRXM0TFltb1FpN08zRjBkR2YzbkdpTkhacjJHdjk3OWcreloxaVdPTGhqL0gwLzJBc3ptd1dqWFRLdEVXSSt1QkpvTTkxZXdqQlIyUlBhUDdta2hCMlpsZ1AzUWovZkVTVUFvdG4yV0JELzNNekhSUmUvbGlUM3Vib3M0UlBURGs0NzE1blVnTncycVV6WS9jTE40VENpdXlRaitRc3h6WlMwcjNNUERJL1FVU0l5VWFRR0dxNUZZakpTTWV6Z3FhRDluM3RQYXN0SVBxVEQ0MmIvMlNTU05qbTIreFd3MklUQnVRdFk1alpidy9BTyszL2ROWWR6ZkZEQ3NrTkZBY29Ta09KMWNjVTJVTis3NHpONFJIUmZjYUwwaFNyYVJUR0lJMEJDdGNXSEt0QnNMMUMySTdzenc3cm5KUVNnSlVhdjFueFUwR3JMbCtRdVJkMk9rSVMvanVIZXk5RFBWVktHUDd6TldTSzF3OUFVb21jMnhCMFB6RTlQem16akRUbWJ1SUcyK1dOdFc0NzhFUTVEeml4VHN0TUxKMExyckhpNGFLQzBFeCtpTTVjNllIUEYrNHNuM3MwcXR2dkdGbk43OEF6aFJxNDZob3lGTVFuV05KTjhFTnJBeEZKV0EyRmVJQmdFUGp1L2t1ZTY2Smw0SFY2OS9ldGgvMFhNbHpvRUYyNy9qTGI2akNCY3NDWHlZS0xpcE9PTkc0WjNiN0tJOWc4QmNnbThoTTQ2ZDA0NkJIQ2MyMmxwNnhmdEdxT0dFdkVsc0hJSDkyU2cwRlhZYVJjbGx3b1NnY0JOWENhREl0SFVpbTdpbkVkN2RnUGlORjdSejJsM2cxeTI3ODFTMmplcmQ0dldMSVNTd2s4V1BCUFBoRGNqdyt6WmhZN0c1aVFyV05FSkVuTDI2WjNpZk9DeVNmQ0lGamxnUWVqSmVtbnhtNVJPSmNabnppbGtuc2p3aUNibmJaTERwWHEvVW4vUnNDRFFOK0xRVWp4THNraGRoQ0thcDhVVzRlaTZKek5IVStQYURNNmJXdVI2dExpZ24wcUFvbmN3MUY4RTVsbW9zbjhvaGlyVEFIbG03c1d1Sm1FSDR6dWQxbHdlNDI4UTlwV21PV3AyZ01TZ1YvRFhyZWlGTU1hNTVNa3JHU1lSWVpWeUpNbDFpMTBzZmdBbytnOFdDa2dHbkVib3JtVGQvdWlSNDVlVkVKODYyL013bGRZejhLODJLQ0dHNmdDeW0vYkFnNEFUVnlmWjMrUlFQK0RBTU1tUzVCMEhTSEkrem1WcytVU1hocnppd21HWkFLaE0zU3VBQzJWT0Y5RVpuWkluMlhaOEI2dU53enZqaStpOXBOcG1iaE96UkdoOVVsUTZuejRuaXhJOWx6MWJFbnNxZ241dTV4eGVFL3MybFhVSHFndEZHM2dwRWVjdTRBb0QwWERub2tBSEFqaFlTZzJRWlE0QVJXeGg3UU5XOGZHb1RRWElqejZmUGFwMzRSQVVzTGNxTjk0OGlGTHBORnQrS2ZPcFF3R3NhUk9EUnpJZEhVeHpwQjBaMGljclhWc3RpRk1Yd3cweTZqdG51dms3L1ZGOWNjUGE4MjBPeFJyZzJzSlM0ZGtaV2lQTVFwS0hMb2J2cEdmbnRVMisyWnNLUVErZE1xVkw0RFpkQjZTb20rYTdhZGh1QkxwTjI0R3pmVzdjY0Vrenl1ejAzN3IxcnUyL3pIOEVRWWI3V0FMME55dUlVcWQyUVhxQ2ptZmJ3V001TDVBMUNKcnNTN2pIRlZrd0FWdC9xTTl0UHc3cGFONWlnZmc3bkxaeHRBOHYrRG1VazFGNUR3WU8xaHp4NnBCbmUzREtSTUVWQlFhRjd0dU9uZDRVU2M5cTJieG5LUmhpVXFvY2FjZFNwVTNZeHlhaW4wS2RPMnVCSEQ0THFlaVg5UVlrS09lRHlYemN5WDlXbUZ0TjJvWU0xYWdEeWJjZzIzbXoyeHZ5cTh1WXh5NFRrN25kMmlZYXZsWStQcEFaSDRWVUFJYVJLRXpMT2dPOWJ4ZWVveVhnVnk4UTlaVUx2emdjTXhSNzVOOThtMDRJRUUycForYnRtUmMwclozREl1V1QyS1RsdXExano0ZW9KOVA2WVg3VFBqWHJTUjhNQzhKUTNqOTNSa1hkTFAvVWsxRTRYMkg5SURwb3F6WGZPdzE3ZW52N1g2VFB4dHB0KzhkSVVBNFJaOHI2MnIzYzNSS05kRFZLeGZRbXprMlROUS9Rc0dHeThZQldIem5aY3NNU2htSUovWkhEcjdnS0RubWExMjNYM05JMDNJdTl1VWlLUEZDd0R3SlcvWEtQYlQrWnR4VDBpUittWVV4dVRoWGVwMEU4UHorSzcvMnJJeUZ0RDNWN3FDM1p3NGgxWVo0ZzBncnQyV1ZIeGxWeG5uMDdoZThBcnNSbGNRbWh5ZVdXMnpEc1ZOQllSbEpUSlJNTmNFcDhxQ21ReERQRExMeW5mT1ljRXlRQXc2Ny9RUmlWRU11WFlYSDV1QnBmN3hpaEVXUFlKaTZ2d1YvZHAybVN0aUJkaldLSWpIZzlla2g2b2VadlY2OFF3YmU1RDVBb3RFZWJoaU9yVXlmUXMrdHZVVDZ2VGNVc1ovQThqM3VTa21Td2tlVFpGS0QwWldpQ3MrTVFUQ2oxZXdTZVlmSW5NWTZSTnVKbVZXcENzYUhYNXNlWFJSZjdVZGlCSXQ5VkNnZFhKa1E2OCtHazkvSWpRSlJBTEFJZXliMGhYOVdMQ1V1UUpsL1RXOWl2OXJ3em5GUUo0SE00Z1RmWFRPOXVVcEQyQ1NKTWZQMy94RUx2V1RwZkFlcWduM1VGemEwL3dlc1hmNVFSOXNjb0tIMndsWUNPRTg3MytmcG1JRHhrU25ySVhRd04wZlZ5Mmx4YlFnU0taM3lRR0ozUTJxUTQ5QlFjc0lQb2MxRVVUcExGUUFReHptdHd4d2pyYTJTL2xZR3Jjd0JLcmFpVWI1M1JXSm5IQWUxSXk2SkJaZThlMHpXZWc4Ylp1ODhlU000YmQydmFiWktyU0l4bWxob2NyMXFWbkd0bTdzQ2Y5c21FSEF3aDFNTnJCTlRMK2g0QjhjdVRyejlIM0lxd3dQK2VzQkEwS2lFQ2tkOG42MmFWc0dvb0x2OERFWVhUMWlTSU9ZREF6MFJxakdJMVZDVHc0c1dyUk1Ydis3ZWVoa3JHYk9oek5pa3Jta0FLTHE3VFNzMWcrcVJuNFFsZnJzV3NyNU1lSDYrRFRaVjFnNEFZaGlrYXh5VjkrNXVmSjFIMnIzeTREbm5SZEg3UHFMK3EwVmVIUHVLMndmSG9SRnZ2YjBONExjNFRlUDdQWHZTM0M4ZWphRktoeTRobDRyS3NiZjhQRzVNeE10NDB3SU5ZNTE4d0dlRUpDVlV4UGpUT1kvSWZsb0cvWXQ3UzFnZ0gxOGtVNW02Y2Q0R0lMaGoybWNtK0pCdDA3elEwdFZhQ0c4Wng4WGNMalpwdndUVGN0c3Z3K0JhMDR3T21Sa0VZY1RPT2cycmh1NlRYbmpRcEIzQkFYbmJockZxREw3MFdBV1RZWGpHcUM3akJMTWpzSndtMjBBNDM4Z3NjbnBBNDJTT1ZWQXEvby9TZHRBVUV0N3lQVWZGaWtheUo3cUZpYnptUjIzZmN4bm5PS21vT0Y4dGZ5ODZCU2oyaEN0UjMvZGdXa290eUVvV2FoMFZMdzJBbkFRdHVBdGFlRXNVZ2xtcmxuTjJ3S0ZZeFVFRFpVa0ZWTnVtbWdBT0xxcFRVUTFFeEdXZDlFa3JlYUVhN1ZKZWNQR0Zud3JvYzFMZFFOdUNtMno3RllpQjM1M21JS2dydFMxYXVkWVlTYWsrcVliUVZqUWluZjhJTG9iQ1JEU2IwZStDeTJUZ3lkdUNIaHQwSUlLTjJCRE1hK05pRXpnT2pRK0V6MVpRbG9SZ2piNVN4VkpodDA1RjV2eVlKdWlmYWpYampFczg1RnhVMjZ3OHpwcDJkK0RGZ0FlS2VCb1JDUGZGcWhiRVY3ZkVMcnFmbitKaCtaNnlHTHdaQ2dvQ2NhUGxBZFhoWXZPOTZPVVplTUp2bG9hMjFycUh5akREdEhLRUxMZU0wSG9pMStURm4xbGNnaVplUVZ5NEIydWhtT2YwT05PeVRXRi9yWVVsQ0c4MUZIRXllTTU3cU1zbVlVTWJmeDJNUm92ZVlQbXVsa2Rya1YzTVh1NlN4RFVTVEk5UkN5eVZuYnZPRU9LZUVrcElwVmhNRFZMUENsaFV3TCsyMlpXWkF1K2pBOVVQYTBPSGhSeEFTeU9hWlYzc1ltWTdtd0t0WnlpNWVtclRkYWZ6TzFWTGF0VTlva2w3VmlNMzZ1ZDlUdUlXL2FBTU1rMDhBekpPMUFoT1FDN3Z0VXUrVVhZMXJNc2JTVG9BUk4zaTM4T1R1T1U1UXBzWm1GMzZKb0VNckErU0QyaGpSdy9McUw5T3A2OEZEemJSVTZackdqZlBaS29xZlpENVM1RG9IV0dtUG9CU0JKUkZJVlhEVEVURFF0RTY1M21nU2I4aGpiWUpaOCtCb2VYL01vQzZPd3dHS1lhcVJJakJ2SDR1NEFGSnV1TXhhZE80YkdFYkNmbW1NYlJ6LzBOSVpCVXpYNnJCTEhBbGpIUFdkcFJ1dTNLMEpqbTFLRzhxTU9TYm1udS90ZHhXOXQySHQxTVpvNEVKQ0NSRHA1TTZIZThSZXVFdk1PdThtVUtKSGcxMEpBd21ROE5vYlZNVjdSem5JVS9GRThtcWlQZzhaNUR3NTFFK2JlMytDTFI4K0daeElORG1pZTAxdklWKzdJY2I5bEFjZHg1emYzTmlNZ2Z5Z1ZOK3pMaVltUldjNUlWalIraThJSTdleFdibHFraXFyTG1ydzRKWVdBanlkb2VvWmVnRkk1QXBRdGdSRjVMVkxjbUpHNXNKTk5yVTl1cERhcVNmRFRZQ2U3VldBS3MrWmlHb0pCbkhJcUZOV29TYnhHdjZYUXdVV2NLbno5TnZHakR1YnRYcVJjTkxpNzV0Wnpxb1hqMU50SlBtMDJHU1Z4R3p1SkxJRGxXeXBEenBIT0VaMDJxM2ZKbEZzZHR6QVliODFHU0YzcE93V1VLbk5vblR4QTB2R0Z6QSt1by9rb01QY2lMVG5NVHpadW5rSXFySlZTckIra1FWNXJqZmVOdTU4Y0JocW9EYXNCa0JSTTFDanlrVUY5MFluS1dINkROSUUwbWZlb25BblVQK2FGQUNZZU4rQmFWd3RsSUFuM0sybUFsamVUMnpFOEswUTBQbXBCRERIejRxcnI0dXNNYmwra3lCZjJtZjNuZ0MyOFpzMWtNZmVkYlNUSUh3T0VMdG94bDlKUG1jN21hemRVeEpjeHZSVTZpZHVDSGZnY0xuYmUwMUNPYlFVb3Jlcm1DWEtDWlFRQWNjNUlQTXdnS1lBZmFEcTEyR3h6ZnJVQnFPN0JLSVhDVU1YK0JBTnArZVAvNmlwMndyNXRWVFNXdWRISk5QS0NJR0JIQ0tnNjdnbFNIMXRxcnFzWnJvZlNkakx1NWlGUTFVcmxEZ2c5bE0wOXdBZ0kzUERiRHNKbWNQTXAzenJuYkxGbTRrYWc3WDhPQXZnZTNPdDMvem5oa2VQN2tDbzVPZE9PUFRXeEJYbDhmeWxYVnZqdjdPcEVnZ2JWWkFyWGlNM2RjNW1tV0kwZXlDR25MVlRYMmJMS3M4dU5CNy95Zm10T3A2WTBhTm5Nb1ZqakdITENTSDNTQzJJM1l2enRhVm1BUUNRQmZhTFgvNUpXb2h4aDZRLzNYUHdLODQ2cEJWeS9MbEpTMmdibVBERFdsU29aSzRZU2QvdmUzOWlkTzljM1c0V1V4NU91NHJQWjNSbEZYOVB5VnA0WXBFdVpKL1RpczZyRUNzUENQQTRKWW94Rk9nWDM3cHlaY3lOZDZQUTUrZEZ0WWgzWGdERlg4ZDhSRlV6a09ndldZNzNocFg5RUJIWFlYVWNCUXhPdzZjRUZIUGd2V3BTSzFOTjA4WkpSZm1udHNOdWw3ZlFQRVRhZnRwd0FTV00zdUcxUUFSdHE2U203TFNSV2FzMy9tODVER0VCUUhpSzV2eUppSXR5ZzgyZHpOcFZGbWVJSXJHYmhlTjNwTERweHpoU0svQ3dhRFBkZ1lYS0k2VW4wUExjdGVmSzVqMC8xN21Va05sRVo0RTlWMUlEYlpCYWw2VTl4YmIvM2pkRU45RnpqVFdIclFhZU9td2YrYXFMVHlRejFQVkdEOEVvS29TQUpWSjVKVDA1djFxdlF0aEtlSjVxSUhFZFNtazhpdVRJUW5UbGxzcFJKVWczbm0zalhOQXlIN0IxK0s0YWQwSGlOcDluY0xLNFZrV0NLMEx2dWlqSExmWW1NNDdER2xZbDIxdmJNS3AyMHdBcUt0WG1wdjNWeUJXNk1MNDZOTkdXNkU5QlhsR1pqbncwdnp3VnRXaHI4Vkw0bzZTUWZ2WlpWRjZyM0dIbnRVWGYrbjIvdExKMUFZZ3NtY1NhQ0xYWmlBZ1ZQM1M1OE1jd2g2WUJGbVhlK29LTW9uVUlUUzdLMS9zK1BYZkliZlBJSXpES2dVbXlmYThSMnZ0cnVobjUvOWJDOERrMThkZFUxeFJmc00wY1krc0kyUmhaRXlZb01PdHg1V1l4TVFUZCs2WXhGc05zSGRXSC9wbTlRLzBmVVdiQ3BLS0Z0QngvdVlNOGJUYWYrclpKdlZMTEdpM3k4UDVVb2xIWU9mcklXRDNGRUVqNno1YUVQc0lyM1VYYjNqL1dhVkFobFR0eklMQlNpZmd2M1JXcmk0K0VtNkNkcU9FWVpqc0diUDJOTTFWNmFNQnBmdHhNSnVQdnVVS09scXVJSU5nY2ZsZ2dteHRVV2Q2Tkp3K01hNVgzb0lKaEkvRDRReHRYdTRlYmdGeS9zYTdrU0ZoTlBHR2Y3VzVRQ1hoUndQaHlYNWpJRGQzMGRpQ3h5YnB4ZGpjTGFlcTAwdVdocERvMnF3RkszeTMvQVQwT3B1RzlHZ09XWC8xS090OEN3azN5MWcrRmZPaVFnaXNhVFRFbXlGT3FOVXBlcC82WTNOdE5vZ2c4ZGtJNmhpd2c3YVNDTnJXOWY0WnlSd0l4Ty9uMXdjeEV4TnB1SDgyWVl0M29iVURhbW9jZ0RWa2k1RDBGTWZMT3RWMFJjMVl3UVdMSnZidGt2VktrZ2J1R1NLaHYzQ1NhMjFKdkNFdjBjQkF1Q01tMFE2RUhlQjl2V0cvYk5lTFhTNUR4QmVqNzlaVVZibUxrUk9mK3g4T2d2b2w5TVFMeGtEcDFNUkJ3SjI3R0pickNiZk5wN3RqZlJRZWw5dFJwY2o0N2FMdmNKTVU1NUpnQVpEVXdleHc2Tk1VODRNNU4vd2RxZXYvVmFTRnRpME40MGxYbDM0b0oxNzlaZU4ySzQ5L3puZHNhRDA0TVdLNXRsZUJOMzZ3WWZMV3dmV3FSc2pGWXpwb0dDS096ZjlvcjRnWkFXM3o0TWhHd0RROXpPUXZrUHNqOWtmVkgxeDduckFWTUNSMGVMaGRYTUZnTzlOcWZIajNKcTNxb3hsaDhvbzJwWUFNWlVHUS9HcGtPZktBUjBENGp0a1pLd01WS0dGei9CSGZ1QWVQMFBhSXZzdE90VWJ2SEpoYkV3dzRYVTVYZXkrcHg2clNJdTltV2w1R1AzVHZ0R2xnMEg1d1AxMUxEODFlbHcxVnJYTGhwQzVLaTZYbWh1Z29BaFp3b0J4cHRzTXJKM2NXTjFMZ2RrTGp6UWw2WnpzYXplWkVBN2NGRDBPOU9mY3l1TzNjcUcyWmRoWEJ2enBSTGQwY0ZTME1uMHRRK0dtcnk2Zm0weFdicmhXbnNrd09FRmtZeHBUV3ptNWdyZ3VVZmhKOHJNSE40dnlrV0l3STQ2SzVQRDZybzVHNzlnTWhtakN6ZmQyT2pZMnE3TWFxbnJoYUVzRGl1NFFybGsvUnI1YXNYRDAza3p0QWZSdm9MaGN6ZWFSWWRHM2dsQ3JBZ1gzN1FjQnh0NVhxTzM3M0hwMFB6MDhnMjd0SXdnSFgzdmZyVk02aGJiQlA5bklybjJRcTVxL0lsT0w3VkpuQmE3Q2xuWmx2N2FmdlBkVzJuRmVVRmgzVHNGd3QwbUxvOUtvOWJiK2hPeDlvcnFKYVF4bk9tNitUMlQvM1k3OU1iZC9OTzk3dHhvUzdNWHN1ZDNWZ1c0NWdmSFdzUzlkRktOMmgzdFhKakJ1MWdOYUlvYTlEaThiQ3dDUjV6UGM0SlJIS0UyMUprUERZdHc5QWlpVjBHUkszVXRZc0lOc3JDZ2NaRHVyUnp6dlEzNURyaVRIR1ZxL0JXbFVyMVh6YWIvaG9vcVdnRm1pamxzUFFEaXZ1d1VzTU0zTWIrUU9rZ1NvVEtqRWk3RW8rY1ltdHF2WlBRQUYza1VqWTZldEhFTDNQR0JmVHVhY1dxaXNwdDBpd0dVdzNaVm5UVUUxY3hIZ29lczJOVkorWkM3dlkxSTkzWVlZaFpxRVNXMnk0ZlEyMXc1ekU4QzJNcGNJRzRuK0RXek9EQml0N0hqNVp1ZVR3dXZCbkhCbU5rY0lHSnluS3ZINEkxVThyVjAyVUJyL3hmODl0VFRWY1c4ZWVJMkRtQlE3T3FzWnZuK0NwTmtiRXRMclR6UWhUY0lYU3dhbEpMKytZeGl3Mjc2ZkFLRm85TVBTVmNTOXVvL2xobTVUZ2pVN2xhQllFVE5hZkJ5djZsZDczelNEakhkUFM3a2Jzd0p4OUxvSGNTMTVvQkRMZVFhYkIxYTQ0M2hWam85RUloT2Vsd09TUmdYcW93eFFPTTQ1YnRLTit3czdNUjdndmtOakVIdVRFMnhrVDJmblU2MDRjL0ozd3RSQ2QrbFJYU0p0dmp3VXdGeE1jR05mc0hRd1pRQmIvVy9heFdYeGF5cUwzMXVMa2RZU3p2cEhQY2dpc1dqYkZIdUF2Rkg2QUVrbnlJMFI5N3dadHhWWDBRWWlubXBLRFRhSlV3UUFnYXQ2OUFVUldsQ0hIaDNCWU0yekYvRU5heGJBWjA3cWJ4cmtDMjV0bHdYN2FpZUlpVGNjRDRWcjNpTkFpdkszTjJKUSt4VGpFdlRXM3JhejN3Zm9zR3I5eTZHanF3WFZJMlMwekVML2cvdjlpV2hGTWJ2Y1NaeHNKamcvWERXWWdKQnlDbXNpUGNqTi9lTW05NUpVNng4aVlqZlhRY2gvczV1OGpraHlNKzV0Y2YxWnRVekdOS2I5RHRsS3lwclBqb2xKaENwNmwwa3A3QXIvNElycERVS1VnRkpoYWdXeUpMVHJDKzFGMU8yVEpvdUk3WEtrVlc3dlpKSzdaSHNZOGM0Njk4S252d2hqM1N0OFhjeHpSSjhSeHhTUFB0SFVzQTdRaWRLKytUWExuRXdsMHdxVjROZjNaWmxSdElpdFZyYnI2cVpqTjBlSzY4VXQvaVJIUUFEU2FoOWJXZDc5MVczMmVudWhkTEU3VmRPMDV4cXA4RFB5UmhMc2VOMzVSRElnU2FrK2pIUnFoU2JDK3Jud0J4Yi9iTDRmS0x4WWlyaXBOL0ErKzljSnRQbGVWRm1jUkRjR3d0eUE0WklpbzcwdUJDWFYwZTU5OXBKb2xBSEI2Q0VpR01QSWpqdGpGandEem5rTWN4UGhRU2FnZGQweXkza2hKTEo5SnV0TUpKNURBYURTcXJxZWY5bDVvVkhMNVl4N3FiMDRjMXhPVmhrYlJRVzdOZkppeGEyc2ErWWN5OGVETXFLNzZ2eVNBZ0wwZUZHcTZkajBndk1GVHEzMTNROGJuMzUyMXlCSlRCZkhvd0dNNUNURWdGeitLWi9BNFJCN0hwV1k1TnFkNk9IbTNOTDExZjNQeDhPQnBNMldkbW5IRzBJdFJRTFFvN09acWJpdlNybXVKditYQmdiZlIwaWRqaU8xMFJUWXlNV29GK0RUbzRUb2hNWHl3NEVOK2tPc2duVzIyL2hkNi9Dem14c2Q1QTdENGR3VjBmdE5tTkh1MEJSWC9IVitjcnVBd1BZUmo0c25iSW9YK2VOeElVYXlrcE5kbDJ1dWVkSGsyVzlHdGM4TmN4WkxWdU5pTDZLNm0yQXdkWEFpL0IxQVdiWGFCUDVzcXhOSklNMU5pbEpyOFJ3SFFCRFpFVEVBcnhHVWlVa2RrZmo0WjJVNCs0ODJoQ1NzYkRWV3gyY1pad21EZlQrTThlZGJjdEpzTWxjekkxbU5jbGdZaUxDSDdYekQrayt0L2FMeUx1Z1lWaU9DWWxLUiszS0h0VUx0RjhRdVFOQ1hyYjBkTG1jWllkVyswN1BtUGVveDRna002R1dFS1JKZFlON0lkY2d4aEFwVHJCNjVhN2JUSDlzMVh4d2M3aHhpRE1IMmdaOUl1em4weWl2eWk2OVRJR1J6QlRDZDFEd2JkdjJURlM5MFJlMGVDTGFyUG1aVWwvb0hUWkxIeUw5eEZYNkx6dmh2T1V5bDZtMlFDUXFCUEFBMzB2OW9iTExTbXpwMnMrTU1FdllZdTdwZHozVndTSDdrQktQazZLL0N5K2pvM2dKUlhlMUJQeW5qU3MrZkpoYzJPL29sck5oL2JDQUNnVUFsV2xZbmNTRTJQdHJoOGIxVGV3eHhHOHdraXViQ0VYRk9NV3RJeXFzcFhaa3VpL3ZqSUR5eWx3R21wckV2dkdwM3paWit3RlNJWEpXRGpXUHlZNHBOWEdWaTdtN0xSQ1o4MWswdFRMY0ppQmVCakZvMzk5ZnFFaTRRKzg1enh5S203YXZ4VEJsVDMwUVU2Q2F1MFBvbEFXWnFVTEpCaWk3b3BDbXpVMm1yT3ZIRHFuOHJGNzFnc2NsVXkxWnduY1NvS1FsdmJZcGpzcEt4b0kyMDJHYkUzL3JlQ09HK0NvazlucFpBR2Q4cEMwL2p6U29hekU4OHJNZHRKM1BWdnUzK2FnRmx5VVdHV083V1VxSUUvWUUzNTBNQ011Q1RMNmZpU2U2Vkw1TS81V09Qckp0MEpDcGFSeW11WGo3RTVuWGZ4NUFoTWdienZWK3U5dDhhZlNNWVE3S3NSWFZKNEt1eThIYkZkamVBcWkxTnVhZm9SYmhTR21HNjlkbnFQdzhCcktVRUR4N1lTaWl4RTlpVERyc25UeHpkbXc4UEhHNGdDMXNPRnhuenZyZE8xSS9UdEN4NXhyOEd4dm5zTjI2YnhzNHdWZmxmalROYU1RYUNOT2R1THZPbWE5bnpzMEVla2lhZ25rd1FnWG9GZDZESzVzMHZnZllqYjh2RkpHRmpsUUpNSDQ3bk41eXZqWkVFUkJRcmF3bTFXMFlxamRsckR6ZE5yVm9kend3NW1ZcVRGV1FuODdZOEhvMzNwV3c4ZDFycWp5WVY0aUd5SC9peS8yVERaaXV0ekc5NDg2aDVDOVlkUTlBYmJFa2ZISW5qbTZLQ0VUdmJLRnVzL0VhY3RFT2FoczlBbmlkNjRaTFRqNmFXejVIRTFNdXFZSCs4SzloczhOYlBvNWNtWkNGOFU0d2MrVzU3Z3ArME0zZDJlbG5WUWtNYTZuN1VaM0pBMTlKeUtvL3JEL2cyK1NpZnVQSmROV0N2QXRSdHdGRjkvNzJJWkNQN0RhWFBJaG9FMXFCOUJ1NW9aOUhYdzR2U0hMNFBtVEN0NHdzZS9rTElFOFByRXdSNkxCNUVkNzdiR1NoWU9uREtjRkdBcmk3QUtYSXdpMCttdy94QXFpckdDeTJ3ZmxJMWN4V1I2cUtpdzRFcGxaSEorSFIvYTRSUW1jQmdLL1JWcC9VMEFYOFpaa2JiSGNjbk0yRkw5bWIzZ2xQbVFlOFJ4SEh4bWFYM2t1NkxDZzZyL0JGR1dxWkZpZjRIOWREZmJjcUdaVFJXUjl0SGNnQ1IzNUQzai8yWTVkcm1BWnFMR3F4Q2w3Wk8wbTZ4UWdjZHB2OEN2UEs3SW9sYXNVKzc5ZGVHUllPMEhEY211bU56S1UvQzl3Sy9LMlJJNllsY0RtdGY5YzVLTEh2YWZTNkowK2xvR0tCMFJtcnpsN1RqWXg5bnhKNmk4UUtwNE5WaXJkZnFFZnBYckdsWnF1M0RDYTY2a0RrckhZaGY0N0VIbmZnbXgwQ25GczdWUFROUUZYVVo4SUtkZnJtQzdPM25DK1l2bk1PMFFaTE9nTk9UTTNORHRoN2xsVVkrQU5Xd1BOZE84eW5zazQ2eDBxdUl0azNWcHFuT2ZiY0IvT3ZsVnNjZnc0bnZOS2EzRUlKWEloejZTYkJjSEFQMnRVR1ExSDZHUU9wdzhoSGFscVgwYUg0Y2tvRGpDZndrS0x1MDNuSTlMYU5YZ2N0VGRoT2N4WnlwQUN1U1FuekxlY1k0ZlltaXRzclZmaEwwdUY0THIrTXJYTDZocStxMjBUQmQwMUpsU05nN2RGb2lPdi85L0F0ekk0a1JuSnIxNmk4enk0Z1g3U0pwQWsxMzJkclhITE1lckZuSDBlYkpBNm80THRVbTk4ZU00TFBXS1ZmcC9maHJNS2NYRmNPQUZtV3lZL3VFcmZZcUlPYks1Zm10Z1R5NzJtNTVsZ1BSZUQ0WkRFamZUNGUwVHBRS2FYOHJVWkFtM2h0R3RJbGtlTG8xVWx6YnpjVGpyRkRuSWFrbHNIU0c4RldvUW9vSUhsV0o5cGFoZGozZHJpb1Y0UUpxUUlMdDFSQUcyZStveWdkeUp1d2dNWU1sRnhITGIwTjN2ZTFCbFVyUXBwRE5zdnBkUXgzU29McHo0UW8wZVRzeldsNjlkSjFhTEg3bG1XcnY4TElxZk5vc3NrVnQwdlUxRzNQaHg1cHlWUWRqek02VU53a3hjeG5CcXE0YWtaRmVYaVluWjFUL3FLMzAyYVFGeTRvVDJoSktaQ0xWUDRVZEkvQmVsVmNKQWwybSs1bVd5QzVPVFMyYTFjVTVvMGVxNFJyQ3JLREJjRW1rODJuQ2RhT2JPejcwMTRENi9sbGhwMytXUU1VR0pZUTBzZzhRcjI4RGFtNU9rR2lMZ0xVM3NKdVZITjZuczJmbEpIRHF1NytYcUlnMnF4UWhtRUk1a3ZlUHhqUkVRVHUrWEllK0pYdjNvVHZkd2I2R0lIYTJ0YTM3RDBzalhoUVUrV3NDLysyTDVLaGZ5NVJUNmhjVkNBaWdGa0JZa21XeWdrM0FGOXJQeWRvSFFyVWRzTmhRei9pbUE5SStTQ2RZTGxxN1g1bGp5SmhpNkpQQ2hNaHk4UWNHSnkrWUJrc3gzd0RvZGgydG9JenVjYzRwTVFMajVwSlNYaHJDZTBqQjB5WlNkL21HSEw4UXlTcm5aZ2ZJb0FQZmZCTkxXYmo4dGNHc1hDMDRGV0FJYlpVbmdaQUtwMjNERllEb3FrMjd5dXBsRzEyeWM4Tkg4T1hMQmhINWNRVWF3anpqN2cxRk9lUmNkRlY5VVh0b25yS3F2UmtiNEdveE40S0FTRHlDaUFMMzM4S3dUM2dkaUw1SDF6MEZZazZvaFlZUlU0b2R4ajJKaGxjMGF3UEh6eVpEcXdiS1lzUUR1Q3pUUHpXSURhTzdtNFZGeEYveDY2aVlLbmM4YU1xWlVkY25mTnhCTVBSZ0RDZ1NTcVlMNXlEdDVWejNTd3VDMXRONkJkNlhlWmo1a20zNm9XYVgvSEM3YWF4bGlnWU00YUZRdnVvMmZXYlNldjlydFlJb0RVMkFHU29lbHAyNzRvbkpCeXVBOUZpZnNDMlp1RytnNU9FaU1pVXEzL3ZOeHMySmlmcjJTaG9kVTllOGltcDRqYnplNEE0Qmg4SytaSWRaSC9Hb0ZUa0J0cTBXTHc4RkhhRFVaSXZXQ21HSGplVUZJaS9PWktibkR0M09OcFhVaGJmRmFuUHV3c2V6TjRUTTU4blZhQlFDRTd2Qm5ibTNHVldnUC9JdURhbU5BcmhCcEt4Z0cxZWNFM3c0cjFtajhQb05FK0M0d1NnWGZsQWwvUTQ4dWUzUXJ6OXYrRWEzbmZMSC9RUlczZ2ZoTVBqSkRQcTB2SmIvbXBWUkZyenpGaFBBaHhTcTJzOHkwV2NIenFGS1hQYnNFdE1taEl2ZENOVjFiWmh4NmVpWlI2bFBoV0lsWjhGVGcxdE9uOEROQkJwRHU3SWllNGN1ZWtJcWVQOE03dDZhVkp0STR3Nm5LSnF0RlMwSWlkMTIrelNLZ2Z1WW5UbTl3RlovbDNwckNtVklHZThmaEhsb25iWmNPU3FZQjN5M3kzejh2V0xad0tYa1dKMEJyUnM4YTBQNis3M2Nnb1JQN3hJM2tzWWsxYStoRWV3SGprZllKdlZ5ZEFkOW5NMlRWMXk0Z3F3S1czUmJzTGhSaTNTUTkrU0VGVkYxa0JZZE9kL0ZHTm5KVENEWFdENWJiMG9sVW5ob1M5K3BEODRNa2RpUjJOU3hjRWNDQmI1VUI1U0xwRDlQbC9UVENlME80OWNnVUdvSEtIY1hIR0Q4MVJnaWxaWmorZC9RcnF4UjN1cnM0MUhkTDhPTGg2SkRPVDk5UDhrTjBmeENsWjdOcUVZbkJnaDVDTWxqVVh3TWlRd21aTnJSdEpmbXloZUZrWFhla08rUmRLWlkrRHBwNUdwbW5kT1l3UklxTlFXOWU1elVjelB0ajZwTSthZnVRa0NIT1BQa0RGWVFqTloxV2FTZzFEWEdmeUxsLzBtdmtvTzVFNEJkQlJ2U2p1K3N1RWpNODJSMXhjRkRtZDF6M1R3WEhhbnRac3BpSndjUUZHYUlzbVFxOC9EWXk5d1N5KzBRcVB3SkRkcXM3TGtBNW9reExyMDUvTldLeCtXaGZwVEdhVVA2d25QS2wwdzBCbThKNTRuSUUxZGUvQTNaYUF2dzQ2clcxS084TklLZmJ2dXBRNlNGY3pmNy9IUTlWYithZm9QbWZlNUdPUlBFcDg2K2ZYR0RoQ2hOMlIxTFBsOHQ5RFJzQWpmMEd1eVRQNHZQbE1zL0FQS3Z3UVhxM3Z2dXRMVGFZUnlxdldZVkxNZm5iSW04dC95cjIyWFBsRUJsZENWc1YrL2RxSDFTN3NldjNIZGNxUnFpWTlhRUNmSWpQWXVTa01FNE9ha2VZZkR6TzdqR05RalhrbERWa1lsODlhc2J1bXdQNGlYU0tqSjFCYmVOWDJGdjMyOER1VERlYmF4OUF2NEZ6d2l4M253ek1IbVpuVUJMVmtmZDRGeVVCaUs5T1AyYlZXNldEblNCeXl3NEtSZWxTR0JyQ3V0VHJtNzlEbno5OGQyb1hQamVlVkp4ZEhqdUZZTGVFSGQwR1E5Q1NKOFk0UlJzRmt3TE0za2R5Wng0QzJGU3ZFWXJGandiR1Zjdzg0cDNiUEYrdmhzbVQybmtIczc0RU1zY0NuY3Q1VU0raFVXMHJUWnFaUkduQURwdHNNaVQ3cG9SblNodjdXYWpyMFpFMllKS21aejFmVXdzYWhxNUxodUZ4WnVqTnpRVVBJdmlnd09jcURGQmkrWTNuZDVmdlk0RDdBOXlSUFlFVXQ2ZjZ4S0t5dWp4ZDRwSUd3anp0ZERxSE9RaElJNzNZWjZEbk9XSmZWVmMvWmo3eWRCVFNPMDVJV3ZxRE5WZlRoZWRoWFZHUEd4ampVb1Rzc1BSeXVLeEYyblB6T0o3dlZoSVR0c0VzcXEyM3RjZ0ROaFBYeVFjL0FkNGExK3JlYzRpU0Z0cVAvVm42RlFWMUY1a0RHcmNqN0gxRkZtL3I3QW41QmNGdVJ4L2h6L21FaUt0UHRuWTVQbWFKeWpCbVRBYkZOVU50YnpJc05td1UwUVBvMnpRNGhKRkJSaXR4UU9EOTBhMjRERU42eUpMbzMyL1NoMTBYUjUycXVsbVpXVlp2YzgrYSt1bUNBZDQ2ZnhiRyt4RC9Scy8vTzBNSENEQU4va29JSllabHlTOXh5WSs2VlhESGlxSXUwdWtPWjEwRzhrVWZUWVFpdGozVGtrbms5TWZETzNCTU9lWWtYdFlmRzdaV0FWUXM2UGgrZWtqanREUFM5NmMvZ2Zza2xlYUpLeHgvVnBuRFhkS1NPL2o3QUszZ3l5WnA3YzhvTjIwT2h2a1NFWnVIbVBXZHZWaUZ3M1hyZ0VhSWdQb0pMSEE3UEdLYmFydUl5dkdXNFYzeVplOVZzYmZFaU5veGpEc0FVNmZCOWhiMDlUdDJwN25sM0x4Wm9SY2pKR3pPeGtQeWtjcGVhajRmSU55NVp1UVpIeDgvVDZFQTl1Z0hoL1p2VVJzR2dXLzBtLzRLYlNzSmcyRUN6UXErYkFtOWZqalozNWhRUkRXWWNkbmR6TEg1RXJWeWhiZHlNclU1WWJKUHc0MmR3MTZ6VlpDOVMyemhYSHhzR2ZnRHJiUkJGSTZBRzZNS2ZURVJjQTlPVmk0NjRyQ1ZNOThPd0M0NG5SMlk0NzhiZy9BMUh5TFNCUlowc0VYbXpYaTF0VmhVVUl4Z09QVWFGQUxTUlhvMmcrRnY0SFJsYXAxYk01a3BucHBNUlJrUmQ4eUI4UDFMak9JUEJ5N3l0NTRqRE1jMUp3Mmo4bmlmZEkwRGRVckdHNTUvTEVmRFhvcFlITXBWUUIwenhmYXZjc0RnWVhtZ3pHTUM4aW1DRnBZSUFXMHJMaldydDR5b0pMcmVkS0diY3poYVFjWjZvTDdUN2gzM0lER3EySXg1S1NURExBNGJtQm9FSFVaa0VDa05UZ2d2N3RWUGE2SWlMREVEL3ZUOWhyOFhwbHJNSWtXMUxhQ1dadmttR3Q5UkR6MEJsTEc3WFY0c1ZXQTZZSlBLK0xVQ3ozUHZKUDl6dE9DV2g3czVBYUNSTWY4cTRJeTZvbjJ5NUJ1RGI4QXIrcXVuUGRxdjNJVFBGeEV2aXRMcmZpeHhDaitERWNlVW1ZcEZLMWxOdE9wQmpXZEk5dURtSHNhWlNYZ2dCZ3ZEaEJSMW9qWnlRM0xLei9naDUvOHJGcUs4ckgvZ1hiaVdka1dmUUVtT2I4RDM5b1ZHWW9JbUNjU0NRUGI2N0x1akpJN1MzS2l3M2tPejJDbzJNU1ZaUXdoZlFMeDZWSE1RdkV5OExvdFJKbVp4N21mZ1RWeEVGSEZnMHBBQWRMbFhkSlNSZklEcUhQN2kyUEFhcWx3Z0xtVFdwTlJTTUVuSnNSVnl0TnNHZWxudFBONUNxbXhqamsrbExQTVMrcUZmcjVZK2lrcDljMTZJcnRtREcxZ20zN3FXTVNmeFMwbkZ6ZUluSmRsSGo1SytCNGM4NjFQRm1KbzNNODdnQXRQRWR4QXVrcElZdllVMHpGUTNXOHQvaGtHaklJL3NvbVA0aE1pbE9tQTIrdkRuY1Z1TDdDc1VzN0s5WG05QkcxeWlnejM2QzNuZHhPWXhlaUxxWkROZmpzZ21XSDYvRmtNWnJabVRycW5wcGdxQmNmdXpVamJzU3NXcDlaaXVMMlJOK3krWGtyd1BLUnhZNWNzRWJ0QSsxWmFEZTJrdW5haC9Dd3NsLzE3TmhSMnQ5eE4xMUJlUnR2bzd5MmRTWFhxa2hwbUw0Qm0yU1NFN3hKcDJQcC9RaHFEaFJiUGNEZCt4bXlYQVBaUFd3MmNjeWE3WjZLSWVMdEtNM21aRTdlR1Y3bTUzdkZLakJWdU94bVBSYmNMcGsvaHVHOTVIcFhWNDFUd1lmbUhNcmFhallod2Mra25JMXFWbVpVZ3YvanJXU2VoelVwMEJ2d3lyVmxSSDA3WmJueVp2N0NXcHVxTVo1b2x5M3R3aTlzWmx6TUEyMkFLeGVPeFRkNlR6Nm81MkhVZlFXaGl2SVJBQ3o1cTlLQk45S0JRWmprbnBGYzNXNzFKd3pKa0pmWm9oQlJ0UFlwWHJrWUFub1ZPVldodnBQaGhPQzlzZXB1NHNRNGhzMEtidHcyRVVTN2R2Vmt6K2l3UFFOR2dsay91RGlaQzVxS3p6SFZuSStNTE01NWFaNWxDL0FXWWh0SC9NdVhNZ01mSUlTdjlIaDFkTENSU1EyNHpZM2tXS09XNW41UUQzd051WGEybjh2aUF0Z0s4bUQzK3VKUDkwaWRRSE5La0tGVjVNR3I5UnNtcUl0NmxvMmp3eU82RS9uT0dNY2dTb2JPMWJZMVo1TFlaQm9VVnNoSlAyWDljazJ1Rlp4LzR0aFk2TEh6U0luSXlUMWxCUnRHUlNVa25FazNkSVN3RGxlM25WdzhzdWU4b0ZOSG9mQnUyWEtzVXlIMnJDc3crNlJScTh0WTh6RVV2cVNyNGIySnhMcGJEK0ZjZ0dJQXovRVRBT2d3VmUrZmRwd2RiUk04TWJBT0dKREhpd2FETXQ0QXY3Z2pFMEJYeExtM2VHaUlzVTNuQjNOaHgzUUl0U2ZXeE5HM09zdU9nRmdqQnFyQk9LL09FQ216RnNxZkN2RGRaaXVEeEQ2Wkkyd3hvMDVvOG1xdlFlY2lkZTZBYTNtSisrWnlmd05qZlhwMHVpa2dQY1h3UWpHbVY4TC9LNEFYQVlycDRMSWFaUnJ6YTFOaFNQTmgyV09zM3hWeXFMb2lBNEJ2R1VUR3N0aTU5cFUxSEdHQW03Nms2RkpTMjMrSjdBUU9WMXFFQ3hPckl1QVBFNUNGRjhIWTQ3b1BYL0tDd3I4Wk5XbHNxOHYxOGc0Y2tYbnUwb1ZXNTk3WVh1cG5yMWd5Y1k3RVBWUktUWm1BZTA0b1RJai9jbzZNY0p2Y0tMUFh0ZE9vWTNNWVVkUEFvS3prc2ovVEp0Rjl2ZzB0ditwRkdSNUhpSlB5aHc4Z3N5aUM2VlJVQy91eVVvcDB5YlRqMzdLa0szZjhlWUtMV3FsVjUrVGJEV3I2bTBLWEx5cXhDMmR6ZDZyT1ROWDZYbXRIczUybFgvWUppMk40YklNSEFaTkFIQWkvT3RITC8rMnRBVTNuY0U1Snp6VC9RZ0cvejQ3NGZiUWxJbE1WcnVFeCtDSTNOaWc0dXhwUzVQa0ExZk1mSTZia1ZQWStQMTM1RFpmMnREeVF5eXArRzZycTJxUnZqT08xN2JTSTM4aDJ4TnhWNmdIS1BCSHdJZDBBRVpqbis3cVdFK2hFL2gyclNMM2JSRTk1bDRIblQ4bmhPMTNKNmw5U04zWmhKeGZzeXptSnZSMlR1bHRRMjhROEpkYWZ5RTFGWno1dENXYzMwVUtvRDB3cFdPRyt2THZIRFdLd2p4cHZWNUtwNG5qZkx5cjZYMkM2TWxLdEYweXNyWTRBSnM1d3h2UjBiS0Q3dEFGWXd6dkpyeDJkU0tyMG9OUmU3UUhrcjJhSzNEZDh2M1N5VHFSbExmWEo4UUJ5S2J1ekxoYXJhNkt2cUsrQlFwejVkcS9pQlg5aXlHekNLRjd6ellhc3draGRZTjljMjRCZHdEcCt1WGc1WUtNSlZYa1VZbERLVDE1a2YwOUdVdnBPS2VwR1B2R2VqYTdkVFpkUzNsaHhLN0ZaUDRGS2VUc05wZ2wrTC9Rb2o3eHhJM3ZRcExlZURjSVVPdzFHNUtsdFVOODczMmtha3FWb1VlVXJhdFhPeDlGWTJHaHVBYlpKM0ZOZHdYUUpQOG9EZ1J1NHJ4RDhURFJJWEtaYWQ3MGJNR2l6Q1ozekxIUWNRWUs0Y3RrcjBEMzF3QnNKK3FML0ZqMGxGdXA2NHc5V09BdjdJaEt5bFQxejdJbEtGZFVhZXdrVlFsM3o4a2ZkWERTNGJ0TlJSdXREQWZSQktrTmtzL1JWZmhyTVBYd1lNSncwcjN3TWpJUUpHYXVqdkJqd0xONXd2dkl5b0lKSWovTjM3Wi9kLzdRWkxQVVBZOHZqTzZqbkJ0SFJyV3lEUWJOVnUxclFpVjVSbGpnOGVWc1ZqYTBFdkFiOHdIVFliUlN6ODY0UTlUVktySGlJMjhMZUt5MFJybkdZdHFIdFNPN1VKUDdZbU5aU1k1Zi9JU3loWmJ2ZWZ1SXg2dGdweWxVWTlVWW8yMHJQU2lOejI3MnJoYlptRXc4ZENkRUFBcmc1RnFvOFJBSCtmRnJDa09la2x6eEw4bnFmVDh5THNjQXNUMjlXc1FLTkx2Z0VLSTl6STN3NTJmcjZRcGk1ZHNZemZ4eHo0RmVYY1UyeUxpMk9tV3RZcFVTbEJpMUZvQ2piTGNOU0dmbWFOSGY4NE9ZZHZUdnZtWnlHK0w0eHBtcDBHOGc4VnF2aTJXcWg1MlY3OUJ4Ykc0TkcwRk5CUWN2dkZmejEvWlIxeTlpZWZ0WDZIRTdkaXFqcHVDN0ZuVWtNc3NGdzA3N04waHlIb0hJZjdIRnl4NHVjUkd0cm0wVXYwZkJMQjU4N2FBd1hTTjFRaXBUTkp3TkpmejBxTmVLK2E0MGdKTnRuTm1aNThsNURkSjdpcDdSK2VQb0REVzdpV0duSjg1ajhZaVFORTR6Umx6cUNSSW1xUXVxc20zYTUwMFlLZmdPTStjSVRqSllWaExYNTNRQ2pIenVDZTZWOTZkaEFXMk1TVGZJRE9hdzMxMUZOZU9tN1ZFSHlaUW9OOGtjWHQ4QllUaHNNUUY3ZUdhL2Jpc1REYThWbno4MUNaMXFacWUyUklNVUJOVGpyUkQ5dVpMb3dNWEF3N0c2Y1Z6OXR1OEM1bk5Od0dvRHhKcXM3N2IzQjlGVmVUZGpXRzhlME0rMlpVQWVyeE1icWtoNTh6QjRmZW4rRUUyNEk0bEZmTnlQVitKOS9HdHNvOVEzU0FjNzMwYXUxUS85RW1UekFWY0ppNWRRZzlUM0E0bEo0d1dPVW9kendBVVBPWDJ0WGtwL2hITnAxaHRHdTZOMURBNzZQcTkrNEc3c2prQWJGMCtHd0tVck9WOEVEelp0Y2ErZFZuTDZpdmJ6RElkeWxRTnZpMVQ4azFKMW1vQXhVa0RGQkVtU3hUSmp1QzZXS0J6VjZ0Ui9GdEE1RzV5NHpGR3ZUSzhPRWpwVlFJem16SHdXZHJ3SitEMXZmMHpmbEdhSXh5Wjkra3BhdDN5M1NxR0ZGUU5BMWVXVGhjSkNkSFlNWEpNaDhOclV5eWRlZy9oQS9tamJHL0tKUGx0RzhhSVZ2R1hXRFlxVFhQMHBOcHhncEh2ZGRQdXZqbm1ZdXZGL2dUa01jSWlCQTlJblRpWHJpdFYwWWllTHREZ0ZrU0svcGxyWkVxVVpjSXlvcFdlUGtMY2M5cHdwS2k3UEN5VzA3enJkcWJtV1ozK01rZFJrNEhjVG9iMjZUSFhtN3FveHBIaDB4dTV5Q3hlV0NIWUw1M2hRbW9PRk12bEFqaFdpTm1ocVYzWmVTUDlOdnhFZUdNdi9NSzRzcWdzVUFuV0w0NmF0ZjJVMWJZYWVnbFA0N2VsR0NsTXIvTUNpMGxiVlNqNk9SVjBuc1lhRTVSN0JTd1k2bUV4Yi94WmxFU1BQc2VHb1k3WnJGZHlvakFJWU0wM1kxSUFRVlNaaWpzTGF5REx6YnYxczFDbnBRcXh3RUZ1OG50dGVrYU5OU1VKbExTRW1qUmh3ZDdWd0RGNkhpWWV1VmlwaTIvZEY1M21GQUVsc0dpN1dnQTJZSXBSWnpMQ0g5UkRtRHYrbFFDN1lnTkpvR3J2dXBXSnE4R0hGSmdHNXBCV3lBMk9rSTcwem9zWlozWnU1R0dwR252OEt5ci9WVGxlclFVbHlXV01DOHFObVA2NzA1Y1kwVTMxRlgxRVlFRUdZQ29LbmgyWjRIdTRXVkFWMFNRMjdySlAvR2dRUVB5L1VlSUdLOXpvd0xhZ29vcVZNZ3I5TldwVXY3OEdhdjZEVHJ5M0VFTUNBUDZvcEkxdzYwRjkrVlhPaWN3ZEhBYkl0WUY1MlFDcGZZZ1NFV2s2TnBLVHpSSThOSVU5MUNzU2t4SjI2TWhnYmZlYlB6azN6Yk9FeThjYkl2MEkycTR4Z0pGWWYzUEY5VVBpaGRlbS9lT1pMN1ZFdVFZV05DaUJRUEMyL2dCK3QrVDEwb0ZqZm1EbWNnR3p3c25jUnRITW1MS1RhN09ic2dzWG0xY2ZBeFdLdVJBSXQ2MkpwNGg4Ym13STdwaS9EaDdQenIzMHJoS0FTdmpyS2N6R0dEZkwvbUg1a2VxbnlSK1FGdmNCUll0RXNRQnh6cXVDUWJmTnQ2anIwaDlPZUF3cFlscUtHamlVdkJGRVp1eFhFR1NSUngyUUJaUG91NEM4bnp2R0xYVnRHZ3p2K1UzaitGQnFjWDZIZGJCcmN4ZEt5bFNFWVRPSFVCVVUwOHJqTVlpek42WnFDVnhEY0tBV0ZqaUlzaGxSUWtybDRDWlpHcXkrbkFacUo3dlYyQ3YzTVdQY1FmZWhpeDZmd2piOXdCR1BDNmt6SHFWVU9CVGZrMWQwbWIrbE1MYmdsYkRlaGtOdnVCdEgyS21RVG5hcjVLR29veXRDNFFKTzQ4Z3JpcDJKNFJDZlh4UEg4MlprVm0zNnR0MEVnSy94SW10Ni8yOUYrYnJXSjlMYTg4RE5yNTJTalQ0WkJIWnRiLzJVcDBiR0p1U0Z1aXduS0JsMXY1TzJJcGJMZUFWWkZKV0ZXL0QxckZoUGNuaG5yaStpdnZsa3dpYndYMmN2WlZRR0VNc0o5aXR5d2owQUY5MmdBZGowT2ozeEVyclh1aC95cjc5aVR5N2l0dkJjWEZzdTUyRk0ydktKNzg3TlZSRlArNWxXNFFsWE81a1NFQ2Z3NnFKTTUvNzBHdUZFNnlWTmlWTVUwU2pHdEhlOUxwU3JwUi9FcDNhV1BTUTBEYVNWM2ZwL2lJS2UxRUhqclFKdzFSS3BGb2E4OE81bzVkem1BTkhQTy9YRy90SG94V1U5ZmJ5T293ZUlNRm5qWlBYc1ZtaER5NTRXbE90eFlWSU1udjR3bURVUk14NDhob3Azby9Vd2lweFIxNGtvdW5IMEhoMDJlYUFkTE5zc1BGUEZtaU5qR21aZWk3ekUyTHhpN21xZlFBMzRrVUxqckVzM0JLQ0lNNk1TMncwbWVqL0ltQ3plc2ZwcklmTU9aUkpYelU0MGgzRjA0NjJ6YmVwYk5xc2ZjMTg0cWFSSG9FYm9kRXhwK3BGaGNTWFJYSWtzQmpxTm12MUhiSllheWdBaW9lOG84d0ovRm1QUlpYcmFZSVlQejNReXY0dktzM0YzSERKSXljazFEVmhLNFRMS3cvUnZDR0Y3aTFUb1VHdnBDVXRuQktkT1VOZmlHa2hDMTNQYngyYmRabE80NGcvRlhCZzJwMW1URWR1TkEweFZWNk9jLzJKTjhzT2hwaVJVbXJGTDRjTUxPbGFCZS9Qem9xWXJtQ2lzeUgzUTBoN3Q4bzhhQmpaOVp4S1BPSHJKVzU4UmxwZHVBOFFTOGxJWUg0SnNMUDlQaFNGVXJVQys3NGRBVW5XYklvaUN1NnFHV1FGZDVhUllvaWRvWTJ6akVOSFMwdEU3WVJUaWdKSnVXQXZMZ0RtUW1jYndKd09wRlFTTTVGcGYrYUllV0dEUklUNDQ3QWZUS1BhTktuQ0tQeXBJY2xleDJLWlF0eDdFSFNVV3ErTzhxamtPM2RhN0hDTC9LSFNXVVY2ajhVY25zbFE0UG0vWlNTTXU2ZDFoTnFCVngra1BYZHJBYXlmOFN4ZEM0Q0t0Z2I0Ny8wTGZNejFnTkFDcWd4Y1ZpWHg0NHVlSWJWUzR4czNnL056QWFNaEgveDdHU3Z0Z1B1WnBYY3AwWXFsMytLeTgzY1ByMWxBU3J0YTVJaU1NRjl2NWVmMHAwQ1k3eHhFbE44UEtXOTZXOFdTUy9BRjI3RUNlMEhnT3crOWFSRTNxR244NzZWTFg4Uy9odld1eFhxU083MzFEM25sT2N1eXRISWFlV2s0NlFCT0pDNkc4eVhvN2VnZ3BFTGZNWW5VcFd4ZTVUN0tJY2R6QXBKeVRpdUc3NnJsU3BndHlFRXo2TmgxbytSbExDamlSTTJha3M0bTRGVFNYMVpaVnptTFJZTDFjT0tocjFHb01vMmFCd2dCcWhCSHJSRHVnaVl2N3R4dks1V29wKzlqdHRkRk4xd3BnNWRZK1dNWjZIUnhuRXJib1BwQ1VDQXk5QXhnZ1ZGK2dQSGV1cWhKaVE3WlZHeUx0UUVtZ0JUTktyclF5c05pYmQ1WmNwaDFRQWVmZmpxU1g4enV0WVlheG05MTZZMFV2bFFjNkxobGErTXlnWVNwNVZaOXVFUWpoTGd3SkxGQW53d0E2enJ3bXFpcnNoQWQ0dVNVK255MGlHeE9QMW5sUDJyVk5zd3dFdW1mb1Yva2gxRHQyblJxbGFOMnlDWm96aldvQ3lCS3ROdmU0NGZrYXhlcEJOQ3EyclRBRVVGWmZvUjlmdUcvK05zWlpSMng1MzNhQmdSZUJKRHo4L09sZ3FYcm9lUVZCbjlrUmZDTEhpR0VkZm50cHpkMEpHVHN6OU80eXh2VUw1ekRqTE55VGNPSnNBeWRHYjdibDd2MmVKZWlWRkdybEVvVjc5N2JrV3pTbDZyTTEzOWdUMm05YWdPa013N2oxbVZTQ1BjSmFhcVFROUVHQ2sxSy9WckRWZ3VkZHMwOE1XcnlicHRwM28rRTNtWWxjZ2w1YWIrVkJhd2Foem9IZk43U3ZpVi9mVUtXT1Q3dXBxcS9VME5JeGcrY3FLaTgxRUNicW9oMmIvNFNPcy85SDBtWmhCU0wyREI1bTJmWVRFcFJRZVk2N3puTmJKV2VsdkJYUWNrVS91dnVGZkcwaGwzamIrUGhzR3BTYUI0MTJ3NnlmbTUrS1VhQi92T1NMdTV2VXpsR1J0WGdMZzM0ODFWMlYyWi9Mam9vcVVLYVRGbE5QbXcvQUUwQklGaVVtbGdHRUtBay9ZZGdxQ3JXV2JIYW1YWGNyL09wdlFHVDNYMGt3UVVzSlZRMUdCUFdrd2sybTNOVVJ5ellQc3YwZ2g5bnZTYjBBMS9CWWJ4ZEFJT3NhMnhBaFJDQTFNK2gxWTRjZ1hDODd3Sm5qZmt6S2MxbllCTmhwSGdkV1AyOTlrUDljQjgwcW4rRkwxRElYaEl1VHlLV1FQa2kzRTNJZUl4RDlaOVZkOEdhUEFmZGhVWW14QmRJYS8wTTl4K1phTU90TlgzcUpNSjJBeDN5WU9vaWV1c0pBcmJaQ2l2djFxenRpUzNINGpUZ2xqd1ZFekxhT0FrK3Jrc1BmaDdSYjU0V1pLb0tjNXQvVDVDRjJ0TmE5WTJ3YWJFc3IrSE84UUhaOENOWGNvbHFhYTNPZ0RLN0VQWWNqN0ZJbWd6YWVHYUlmYlFuNStiQjFyTlN3WlRLTVVpR1MxZUlJSmlTcm44YXFDTjI2b2VIQlNDT0c2TWlvNGZROFlIaTV6S0RJdGovTG9TM2Q2bFVJdmZhWmZBcTY1RHQySktLNlpBMFpCMXpUTUdXV0lyNW1oZE1yak9YUUVJRjZPZ2pwb0YwSGZyNk8wUlVPM0hPMWhSSWZybGNQTG9QeTlLdTVzYWlFSHdXWElwYVB1L01yK1EzNkFpZEFyMzlWTDVjQThWSExXaWVKYzltenN6Rk8zRTVVQVJtMWVac05tclNLMlpRdUxTRFlxUXZvbHo3UkEzVExzdEZwM2ZWL2dFam0yNG9YU1diR3ZLMjBKbVhaTGNIUTF2NXJqRWUrVjc3c2FiVVNyS04xbXBFbi8xd05PUjIyOXJReDVRbVB0ZWgvamIwVkJzbjdwQ0t4bzNQeEV1TlF4bzRiQzZ4TnBCVjA0eVRNVHpLbDdkcWE3eDBWM1NXUlNqTVRqR0pYZ1cvNWliZll6Z3gwbld4M01qb1MzZ0Jyb1NSTkNvcW9kOXdRV21NTkRHV3BzalVkRGdqdkNyZ0RZcTBidmZaSjYxY3ZtK2pDaGliNk81aXVtTlEzYzlyZktZdGVDRDJxVGRpTDRwTW56Vnc1QWt1eDJFamZOQ1d6OWwyM2pTRUdBa0UydmhRK3EyK2xHRFgySmlBN1lpQWhLWEdHTWFQajJoelp0MGJMRWZ3b29XTzZBWndMWlRLa3lwUTJUamt3YTl4UVRPRGJGSlo1L3FSN2w4Y005UlY4c3BEWUhpYUN5RGhIdVZab0JKbkZoZFZLaUp0V3RuSEpiRXhYb3lDanVlN29RR2g5K2MzcjFSWm9KYVlUaFlOQTdYZ3JaRFNhSGFYVUtLbEsvMHh1N0wzR0Q3ay9vT0lyT2s3N1dOdEhGLzZOUFl5ZENURzRySGpGM2RVRXpsRjc1TnlFaDFjck1YMVRNMnNxdGpjWlpvMkIzQitGK0xURFFGUkplblNteC8wdmFoNHEweEJYSXVjc3E3d1grc1FyZW8xWUM0cWMzU3pXcnFkTkxtVHdiTEJDMGY1dGtTR3FKY29qK0pnZnFUQUJFMWhGTlNMQldYOGFQa2x2WFZ0L0dzUkJ3VHYzeDdQOFdEaHlBd1BjeDhWOTM0TnR1SDRHMkYzVkZURUtnR21MbG8xUm1yWjdxZG8wN3ZyTkpuVWhtaEtldmQ1cXBoYm84bnh3UUx1MzkzdXQrMFhJbDdpdE9jNFRVYitacEIyS2F3NlhUSjd5K1lKTzFnVmhJd2U0TFpERkFZVzlGdHc0YUhvWmQ3V1dHZWtmK2xWZFZDZGtnc3ZBemhsQWwrUUlpNmJaZWhYTkpmSno2STVCbGFLb2E4d2U1T3dCRnFxVmRVelpiL3orYi94NFluOTJGOEJLU3pJUlFjL3RIOG9lRHhVVEp1YzF1ZnBwdkZYSElqYlF6SWg5L3NpTTEwUkN5MFJJOEgydG0vMktRNUNjazI5ZUowNzdDZ0ZPQ002TndsMDZlck01UHM0NDQ2YStXWHBpQ1VTR3NROXliNVk1a1Q3QnJWQnpKc0hzSkFYd216SjJ3YWoxRnhLWHNCaFdQT0dTNGJ4T3JQUGpnM1h0djQ0Y2d0MkpyRUhYSTJzLzBYc3JmMVM3cVV3eDUwMWFncDdWcWhUUktjK0p0Q1ByMmVoK1NzY3lTdkxjeHNvZ2pwYnhaQVRwOE03RlVudTF1VzdaSVdQUldCZERUeGxRd0F3S01KVWhycUFKZkxzM29nRTlCRzRrS2gxczh4TFdHV2dVMGZJRlp4eHpNNWpQODZxaThHbFhMS0xTNVk1Kzd0M0pvVHMvZTZMVDdNZVpPL3o2QTFDN3RaOG96M0RjZGkwOU5RckQ3Nm1ZTmhLT2F0L1JETTV3Y0FtbXpxK1pFaDVFUnhYYUFqL1NaNEwyaEQ5cXVmWjZBdUVRaEExRk9FUDlFRmt1dkFFdll6Wk9oSTBoV0ZjSFhteElsU2ZsVUhPclNPV0VSbDlRcEcyYTVsZENJRkk3SVNQcEtnSjBEb3YrMldNdExJcUFsSnFYbnRSOWNmNTlGZTVOQ2N2bzFOc1R4WXFlK2NtOEZhYnBVLzNkUFN4N0tLekg0d0NqaC9SZ1pYSGY4anp2N3JCdFVtbUYvenFWRzF1SHBNV0M5by9iblRXVnpZN2ZxdjdWaEp3czNwZndBd1JpdE40R3U4c3dremhzalB0NjJvRFoxWktPTWdyVlMyblpzeWZrQ05FYzN3UzE0MHJ2TVlRalhjNkdSUlVzalRiclR3cVJDVFpETWVIcThlejlTZStiQTlIcEQ4UUFQbTJlY2RRL29CUFlHbzhkK1lqYXo2ckpsbnErV2xFMkJadHIzb3p4TGVnWVJqOXFLWWFkMmQwNW1nZGpvbitDVThmVzVWK3hHbGl6SlIvdE9HQ1ZHSnVFVjIxRlNwTEgrK2pvMjRWbE1oWG9nTnVoM3k0Z2dsYjhhUG9IWnFsWlk1ZDdTTEt3cm1HZG9PemVid3FjeFBxVzlQbG9pTG5zSVp2cjBtdGhwM0xOelQwc2Joa1hzNExIWTJ0RmpjcnJ3Q2YvR3NDVG44UkN1ZTFKSkFGR3FDUUJvRDJOUkg2RW1QOUlBMzRUMzdXU1RXMXV1dWVoMzF4NE9EaTMvSmRJM1dXa3NaQjFCRE1ZWEx3M3VhVkx5WU12T3hBc0FMMXk2cTJaVndBeVZnZHI3bEdvWUNld0g2Nkg3RXVDaWp2OXRwVXA1UzUwV0lCL3N5MGF4NGoxNUJVZ2ZBV3RnanhLYWhvYXZ4MDRjOG9sSXhTSmxUczBqVzk4c0pvT3o0UDRMQklPd3VZUlhtSzdhejlHYjhkZkJxcWhJdytTNnhBMWtkblkveWsvRkxxZ0prUVNOZWpsTXpxUlg3TTVBNm1oMFpXK25NaVNHcnBOZ3E0cU5UUUVPNkpBeElKTEsyemRmd3dOdEQ0Wm93YktFZ3VDM1lQQ05WQmJCMEhBQmxzYUF0VTNnaWI2MWVoOG1zbDBVU2ppb0ZkMFJCVm9wWGEybXRLbkJXSVRJdWJtNjdOSEVCZE4xa3Q3Qno3aWpBUDBkcmJEa21XQ3p5bExkSU9rV2pNa0U1RTBBYUJtTDJ6MVFOcVpXR0Y3UUsrbmFCQ1IzM3VXY2VxcUJaZHE2QmxNZ0hsU2ZoczduVXBBNzRlV3o0L1MwTjJNdzhKT2NrK2loSzE1UjJGTjBCTWZMY24vZVhCNUZBM2dLSlg2QlBqMTFSdmNvY3NSQ0JQR0hpOGJPcCt0ZlBacklOUTdGd1F4VG1DVmt3TXExYU5CMkxBNTRDT0R4dWl5eVZDNzNKTXhTSElQazYxVUlORnhmZ2Q2aXYwcUlxZmpPU05pWXk5UVJITVNFSlJaNHV0MG1ucExDSGhTU1Q0YVRZSUdYdzU2TktkTk5lYkMvcDFZekoycGtKcjhad2REYkx6Q2VpbUh2bm9vaEtIQXlCUkpTUm10T2w3QzZQeHh0K3ZGa3htdk5Qd1pzVWlFZE5sV0l1Q1oxVlBZWVc0QjY3ZHR0dzdIdm1rdDNzTEpTbHUrVEZjeHI4b1crNVRmQ1NkUmNmRk5hU1p6UWNaL0p2K0k4NFFkaWpnUTRSRGlwZEcvbDgybW5jUXA0MnBkRG9uMURCVWFFeGwrVjc0MzZ3dFo4dld3QURObGEraVYzclE2N0pQSElBclJrTzZMeDA0OFFtQXp1SkFRa2tYeGxVZDdxaHB2Q01abk84QVJvdGFhS2s4WFRvSVFkK0FKbW9VNk9XU0VXaFBKSzVKWG92TmZqSTdzQTZtSXMwWVY2elhBTFJCT0dNeE9lNWFMQ1BkTU5uM2ZjTzZHNVFzNWdZNFVob0xRU0tFdG9pVGZ6OWQ2YUdoQ0JEK3hIN0ExcVA3ckd2Nm41L0JCRDI2RnQybVFqeUdFSWlLWXRuU1ZtQWF3eUV6dVUrb0doSVRxeGsvZUJicW5udC9TZGQydmZUNmJZVWJreStpQXRXeWVrQ1lZaDNaUEZFb2ptakFlczV6Zzk5QlFxVVRzVXZNY3NiSmZMeFdXdDYzZEFZdnRoUXB1L1ptY2VVcWJkUFl3Zzc5cGZMOW1sb0NmbFhlZkM4L3NiNzhwQVZ0aGxBbWtlMG4vUWxQUFYyTTBuVUIvMVVEMlpoUWRteE93elBCTWRkWUcyWFNXdUlZZ2JXazFxWVM0OHc5dnU0ejRiaXc1cXFtc1JWbWJQSmczZjlaNUp0bTFFYnM1QjJoSndDT0o0aEFBTG5teEVuZzJFRkV3b2dKMzBzakpCY1k0R1FHR2wzL3c4UEJGNlpsaElZSnJudWtpUHluTmg2cEFlRjBTVzEvSFFDcFJUYmxEMUdIRDN0Rld6VDB6eThoQWs3dktPZnhQU0FOVk5tcFNsMWh4K1dzZ0pRdGgveU5jTHNOUnlxcGViRkQyckk3M2tWdVdBeS9TTk41WEI4U3BkYWZDN2FEZmpUbHJ0NDhHZy9MTStJTDlDSUNnN2dTbVlLQ1d3eDVWd3YyS2lyR09LanhtTkRncHBPb1J2QURyQXQ2S1hEVkFHSHFueHdjU2hhNUZuTXlTVGtGV2psK0Zma1VpdloxOVZGejNVeXdDaVM0dG1PbFBGa1p5aVI0SC92SGJjdjYyV1NaM1lXNFd6b25iZkthaEc1UUpUc2ZHbW9JMXN6R2UyMkJQdEUxMGpFSUwzYk1MbUpoT0RTYzF6WmN2Z3RHRjdpT2phQXVENWhtU0ZyNlR6RWJWTVdNbEliTFA5dUJnVlNjSjJTS2R0MzRrS3lvZlBScXFldjM5eHZBZlFaY2h3VXpXcXVRcExjUGNDUUVFVHpJOVpob1lZNDBBekxWNERuTkdxNklEOU91SzhiZXJIZTRtQko5YUJ6alBpa3NzdTVsSzV3MnU5V1czUVk2YUdGdEt5eVdBUExEa1lvdnlUVHppaVFCbldoOG5GWVlRcFcvUFNQeEo0anpQNVNOS3JYNUFLRDA0Smt1akt4RDFxb3lYM0p1aEhDak5YR3hZR2s4S2Y4M2V5c2p1d0t5V1BWOE05bktUMWE5cktaVkJHRUJoeTF2aVhTL2ZBc1Y5MGpPWm9OZWdRSndhS1dqcUhRaFRwVmE5bWdHaXl1UGEvZHpKb0pnMUhsRmRId0wwNlk0SjBhVnBhY1NtSFJzck5ZQnN4eGM3R3VOTER3UzNDNjRKMnk4eW1YWVhscUdJN2g4Y2JDbHNEZ3EwWTBsOHJsNENITWlyLzE1MWNML00vc0IrV3MrSVllNEJoUmt3aThTMVdYOThjL2tlMWpBaFM0N2FoaVI2UGttSWFYa0Z0bUdjVVZUa0VEc1BoRGQ1bnhGWkFXK0hqL25xQ3VrODIxS3pLWkVWUTVZNTFieENUV25DU0JIdm9LWTVyZVpReFNBYlk4SkI0Y2hXeGhPWlJTeGF5TTllaWpDYVppc2szNWRTeUdweXVod2dLZzB0ZmJzNGdJNU5sUDFSaEVuMWdpOFhTTERXd1JES3N1VzRsMk5HSExtalRoQjJvSisyQTk2M2VCa1pHN0x6WTF5anRVK0FrQ0xiRDczc3hLTkRXT2x0cXZiT25PZDZYYmlnUkxjb1lnVHlGbktxZ2dUbVlHRWNqUnMzN1NERi95VXRFQi9VbWttOVZPR1pRYlZ3dXUydkJJL3RGZjlpUWswYUlvTTBpdkpBemxTVzdtaTFYQUtZTXJkTVdrRENKRVVkNzYzK1hzZzYxN0RRUDNORjZCMTc1OHM2RytLMlk5QU0xTVlsU1JBa3VVUE9uK3crK2N4dE5yV2w2ZXNPSnpPbVZvYklhc2RJVWxhNUxvYmdlQXg1V1l4YU5reFY1LzZ5cjRYb1FkVHdUVXNNcTVOSElFdDVsZEI2K2wreDc5T25iTGtTT05SSjBPRFdDSDZpZ2VuUFNoM1hPSVNXa1k3YzlsZ28wWm4zRGdIVnFSaERVdytDTzF1eG1FMmVkL202ME1WakZoODAvMWhZTUJ1YXp4OHh3WEk5NFlNcFptaW5GdTNpZWpNT1BMZExzbUZEUHJXci92UTFHY21qdFk1QVovTkc1UFU4S2RmS1prek9Ba3JkMHNMeGJZYXRPTUNQbGkwUm9iZHI0dUNreGM4RVlRWjRROUtyK05yWXEwU3J4a0NNemxidU5OS1dZcFVoSGdWbisxejMwNEw3R0NPaG1aVlhSV1lmOER1VHNKQXc5NEJhNU41T1JlYnNkYlUyZHc5djhPbVdNN2tROGhISFdPd3A0U3NpRDZsV2F2QTlwb2ZLeVZMbTU1ZGxQU2FleFppMS9sMTVnUmJxWWFIUVV4bjlDdmU2VkhQQmpQOEtWYnVmTFIrRm1TdGlkM1lLL1g3RXJ1eGU5N3VNclA2VlV6SE5BbGRaQ2NjN2F5ckNPT0pnZ0N5dzBjTkdkWCtGRVpuZ1hVbFhqbTNJNEpzUEl3ZVZYNzhUZHF4a3d5YXA5RVJlaTRyejI0UFBxTTVsbXVoNWlRYTNCQ2Q0Q0JGY042ME0zMG01OFQvcURHVFJNdHJReVdrd0toME1QMDNNMDdnbjRHaEQ4cGZWUjdLNEdha0xIdUw3SEllM1ZVMHFpSStMTEpHdGlqd0RKWkFTRm04Uk9jWnJSdU9uenlpZklleFdNMVlmeEowcHdKSzJVZTdJRk42cnR6VmltR2Nya2cybmw4RDJPK1hzemt3MHI2bFh5aXVUNzBUZjRiU2YwZmpjQS9OMmhZdW9ITnZLbGFOWGd4VGd3VWVSMkxzdmljajFjZEJLZ0dWUityR0FWd1R6c25oU0VaMEFmekpLMG5odUIyTGhRY0ZtZnc2SExST0ZXWGdkZHBpS0hLQ1RUVmE1RjUwcytEL1hTUDdPL05UQks3YUVFaTFzMnVMSXJDRE85RzhFUjdybDN0dHZ1VGE4djVtNFBIcVJ4ek5hVlIvbDZkYlZucGhvald6c1IvWnlTK2dTZFpxK0VuNmg3NkFmUFlVczlwM2VxVk13L3ZnZ2hPN3ZqQ0FXZ25HUVFla0RIdVFPRk5DTHhuRDlJUmNPTVdudWxNUGg4eDF0Vm4wQzlVekVUTEpkR3poalhGYjZUb0toS2lzd3BrNEdPaWcvU3FpS3JDLzJ2Q2VkNUJtZFVQdDRzU1V3cWprdUY5VndCcVY0T1kyK1ptM2lFSThETE1pTmpaTFdvdUVMS0NMQlBabkxLY2xNVm9hSy95NXVuN2V6cWIzNkVrbzJ4d24wQTJNRU5DODF0cWJpNHBhdTRidU9nUzh3VnN6dU9zaUVxZnJJK3NhRXFoYlYyZmxrajhEU21ubXNNNkc4a1JibjBya3JUY1FPUVpHRUVpZWFHaXpMaDZySGdBSEV2SWJjdnNpcjVYVEtTQmdHc2ltNkY1Y2pkZUZKeitiYXJEVDNMZWFPV3hrc0VIRjBqTDAyNnE4WUlHbzBoSWdDNEwyb3lRY1MrWC9hL1B2dm5Nd3Y2SkpxWGJDZjNKMmc0UHFQbkduWVpJcVNPV1Vkcis0N29qS1h1UmNHYjZTZWFkRk9Wd3R1YnJJNWsxNHhpMkJpaVlKTVhWZ2E5cHNTcHNLTXRPZURyUUJnQWVHVUo5cTJ2dDVwelFYRWJBUUtBWTRkYlQ5M2pZRFUrb3gxTWFPL2luQWc1UFBWUzAxa0JJSXl5Nnh6UjgvOWZPc1FCbUp5NGt0QTNpRXdzV0Z6aHh4cnRLK2RmVXhkYnptWURPL25PTy96Ym5lREJBV1VYY0ZQNnlIRWhaK0pjYkFpTVR1eDNsd29za29FRzVIWGo4dTRGM1BIZXZOSlI4Q282QVJzSWczL1NhdFJ5ZXJ4eGZkR2ZRU0ZpZHJab1h1b1I3UDBOcy8vSTdvdUkyc0RJeFdqSDlqSlI4c2FPcVRDQ2p0RHg3VHdVbjIwTHVyNW9Ya2NaOEdhZk9FU2ZXdVJVeFZmaW5RVFRyTis0RXk2VnlLOHZtTTB1MjJSMnFFVmJ6bkM4aS9KUmcraWlBak9QVUpxWGtJWmE5MVU2aDN5WmhCMVFZalN4a3VMbnJtdDB3OXVlZTQ4SXBlZ0J4M2dnT0VodE0rNVJsMUhvdUNad2J4eHoxeEMxamZJREljcm51RUh0VklnbmJJN2tCazlXUzdNZmFacnNsTXB5Lzk4TkN2VENEWVRXYkNyUWFrOXVxSEpXc29lMVdJaldob3d0dStCT29pL0w2NFR4MGlITEtaL0RDeGRtRTRFcGlUYm0wYVlIT2pmZHh0RGI1KzltVXRKTjIxRVhwZFE1M3lWbE9hd0w5SThVT2d4N2RvdndHc1R5UWdCOXRTMFJZUXoyblQ2Y3RlZ2hmSmZlWko4cy9QdlJXaHJhaExxcUtWWG44czdHY3FaZXVwUjV2cjl6YkxTVEJUTHIxNlFIK0ppa0VtZC9YZS9Qalg3bSt0ZUNGUkFzOEgwRDMxOWU3ZlpGZDdud1hQbm1XK2YxN3ZkajdRMlhFZ2RnWGxyVXZLWjRWZFZZM3Bqc0pQU01zanNMajhHTjcrVWlITUFFZm16VXN5cjkrZG52RCs5a09YTU5pazdwMDJzT3FIQkpXdktQdkhTRkY3Z2NFYjlNUEFnempjbE9WKytjUTUrTVhuVnpyUElSTC8xaHFxWkVCQU01bk1Wc1kvYkFicElMUm5PWWkvZytoY2lnNk1qaDdKMFJUSm5xSVhUVTJMRFVsWWlJaXJVOXFseDFsMnJhaDlHNUhGVkZSWkZwdjM0M0hhemZuRDRrUk16ZHl0UDdEOGJOZXNoZlJjUG1ZWUVpMnBKbGtWVkhOd0ErdUI3VlNQZUFndWs5cUVhK0Qxc2xQeE01WStiNURiYkhEU0p0UjN6REZtV0ZIbzg5aVdZT0U5YVdaM0pWQ2lqc0NTN3FhN3BGKzBJZTZpazRPdXZWSjJyU0NqL1FRYzRxSEh5d1BvbEh5a2JkYTltVUdVRUxPRGJHc2llaXQ1SWFNR0NNN2NGM2lCMnNIS3V6Skx2Y29tNzJFeENjZUJTR0E0U1hXNDl5N1F3K1QxMVhBeWZWWncrUHNOTG5KcTJocGpML2dONU1wWGtRRWdIVEJqZzg3VTZsKzQ2ZmZPM01rYVlrTHF1R09nVTVIVHJlYlBxNU9IOVlTM2trNFlhczIzMjBSTzNtd2FkQk5adGp2YXFjVVZrUEk5L0VBbFJzUGtFWXdNM1JNR1d0dG1DWHU0RXpBRUw2amlDaVJpM0Qzbkoyc0hSVDM4WXljK2pROWRESUJQT29iUE5tU1BiNWNMRjZNR2hTTjRrWWlXdlM0cGE2blBGajY3ckZTcGdqYWg3SkN1c1R1TW56TWN3UzJCbHdzaE95WEg2em9yK1ZFZFRpcVdIaGNGVUZMbnFyV2RKc2Q5Y1pBUmtMZTQ4bmxtRHNyTFVVTGVsY3N3bXlvcmM2QXdNZFpxV1Z3Y1gyMnorUHo3aWNzbVRxcFB0N1J6ZmpmTytQaUdHOHBGK1pvR3RUWC9LMEVVQnk3L0VzYnhhcXMrQ25xbWs5TC9tZlNreHRBekdHL24rWThjQ0V2R0RBM0pqcEpSQnJhZFRKb0s0TVN4TFJyRzlwR2tDUTRmeVpxNDg1U1ozMmNWeGRUZ01JcG1XeXBUR1ozTjg1cnJQUlJYMU9RNllmd0w0K3dOZVZWR0hXZS9QUVdGYW5FbVJhbVdmZ0MzcmlRTVhOOCtWR01ZL0dvT3Z5MXUyZkJ4eElEMEhUTjROdkVLL0pSR0FwY1pXSVRJaWtHanRna0dYS2UxS1RHekVZUEFlT1NRdlh3YWp1cWZTMDRFN2dmYlBnQldDMllMcVZiSjNjTXNueUxLU3d6ZFJmOXc5UkFZN3UyM2tNdE1Vb0FmUEhwdVJNQ2NWSzE0bHc4SlplUWhsTlRiRExTQVNIR2dhRmljR0tWQ3o1YjlHZWlHSS8wOVBVOFRNSTFKUVR1RVVweG1rK3ZwZ3M1TWJRd2FBOTFnMm9ySVFPQWhXTDhGZVlYOTArQ2MyYTlvSzk0NSs2a29na0V2T1JubHE3Q2h6eTg0RnJxRWNwZU1HZXJidXExQ3ZlREJTRXlsLzE4U2pRNmdGZDJRUjJjaEFNeDJLOG1HUmdkbHJjUjMzejZXQWg5cnBjQnZCN1RiMUpPS3NvWXlBZGhpMzR6SVp3Z0tMVkRHZkNVZFpUYW93T3gzb3R2Q2w0Zkc2TkMwcHJydlc5RTlkVktld0EyRnBDZUVBeHY2S1RGTXorc0NIRndhK05UWjVyZmJpRjRSemE5NVZSTEpmaFIrOXVlU1R6aWVFa2hwTjE5RDBJdWpGZ0ljTzRjQUY2YjE4OFlrY1pJRzlhbzI0MlA0aDR5QUZ2eXpqK09Nd1ZBYlJpM2o5ZkJrUGkxaHdXdWVWYmJicU02QTdxUVJUYXdBc0RXTDdPWGVYTE1WZGx2YmF6VUMvS0F4UlVDOUg2L28yOGk3TTlERFJYR0dhQjBpaCtKS3JncTdlYUpFb2ZmYktyRVNZa2t2SEMwV3VIbW95bUdWUU9OWU9PbUVOK1h4bU5WMnlVVUtoRE9XU3d6WlNmdzFmaXRZYlJDRlBnLzR4QjFxQStJdFdZNUdrcnljd2Y3REMydTRHTlNsaDBkODdGV0RqSnpsdVJXSytlVFFzOEQvSzFBOUFBRkpMU3JhQUQrWmRtQzRjMHhBd2Rkb2Q0dXlPc29KL3E1RzFoUnBiSU4va0tzY2ZOeHpkOHhTY0FZSzZyQlQzV3ZHS1RaOWovTjdMRWNGQnZqOGpoM29aMzlkWENVYks1WVRLUVFmY29Pd2wybDJTR3ErK1BaK0FlUWlRbU5NZEExTkFHWjBYUVJxbmNydkQ2K29HbWY4MTMyajJ2YVlOVHpWMnV1aUxHaS9Yb3B6NWZnMFFrL0JxYnNjaDd0WS94bmErS3RxMHo4bnd5MmZBaTk1ZXhWMGFFaGZveXB1WTFQM1dUNGxjNklKSGZLZXFIODdwRW9hRjJIYVlkTWJmZC9KWWVMZk1CRW1zRytxQTM5bUtweWI4Z1dWOTYwL045bmdtM0JBY1k0aDRxNFM4TmlkYkREUkZGK2s0Y0VEWjRKZ0E5WTd6OE16b3Q0TlZpRUhtMTN6eU81c2loQ21veC9oeTJnQVhOd2xPemxJeDBVS2ZOeTlDbFpRY2kzSWVvN3N6U3VyTUJ1eWRXMnE1UGxleFQxSWFLV3YvUkNDQlh1bFlGK1FpUTQyT1lzZk5rbmNKOEM3WDFuYjdZOWNFZ0FaaDZFSzVXRVVGaDhBZ3FXNDNQcHJSUkNxeXlLK0VuVEVBYlFKbWkzZVVVeW9wbHpBclU4MVhnT3J6UkRYY3A4L0hZYnc4MjZJNGp0VU1uNk9GcUVFM3JLRmREd0JyTWkrVHV2MUVIRFE5SHFXZ3BBTUlhbmNvV1hCV2N5ZXlNSE9qYkFEUnJjcDNFdS9hbHJLa0FCSGNyVzl2RUNzanVxcmFXZWYxd0k0WllIV0pmUVJpWHE5VWdiZk54b1grRGlaay9CeHNEUm4vUTJ6K3hyUXdwa3YzbXJBUC8zNUxSSWFXUTZpMUk5SlNDclUvUGQ3Q25tMmIvaXhqa2ZTWFl6bnZOME0yY3ptRitmZHViZE5sTXgwVENuemNYOGxxUVFoLzZZVVJ4ZjJrOTY4dTB0L1ZBM3J4MGFXbGIvdVpsZmJpN3Y5eFV0cE5QMnVReTBpdk83dkcwTDF4RldsWW9MUEFWSDRtcFFUTWd1anRnV3RJcFlpNG5lR0ozM3dSZXI0T2lGUDcxVTF0bVdlNy9yMGRuU0p2aitkU0dONERrK3JMa1pVcHIyS2U3ekdhcXNmLzJRPT08L0JEQj4KICAgIDwvQklSPgo8L0JJUj4K + +RkFDADAzMAAAAKWUAAEAAAAAAKWDB+QBBwolFgKKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgC+APwAAAAAAAAApVAAAAAMalAgIA0KhwoAAAAUZnR5cGpwMiAAAAAAanAyIAAAAC1qcDJoAAAAFmloZHIAAAD8AAAAvgADBwcAAAAAAA9jb2xyAQAAAAAAEAAApQNqcDJj/0//UQAvAAAAAAC+AAAA/AAAAAAAAAAAAAAAvgAAAPwAAAAAAAAAAAADBwEBBwEBBwEB/1IADAAAAAEBBQQEAAH/XAATQEBISFBISFBISFBISFBISFD/ZAAlAAFDcmVhdGVkIGJ5IE9wZW5KUEVHIHZlcnNpb24gMi4zLjH/kAAKAAAAAKR8AAH/k9+BmCA4IYU8gN5TphT416Scic6OH2BGPjtmtSjtYf883G/5drL7dduwYPv3j9pLDQ5r0TvPJ8PnRB27hwzg7/yOOzkiUSXpOfPt6ilXzd7nRUUkS77747w2MvPH1EgjmFJ7J7rAnQnjA2qe+iLDyZ3NxHD0DARtelyGRWlndOuXOF/PwMo+0uj8DIAtrQFuyiSZSTCNRWLuiQI1R1FYkHpW8x+MV94eDL29J81i8Ur8W39FRrq85RWE2A3NvR0807NgyGnYEaesb4VKsRS52OcrL7/bXXqJMpcbeBVigt5qqWGeGO988plmOpIV8X0AY3XzunfS9kdy1wMee0p1A/N5L1fncdCKLatpgU4Ii0GhXg1xp+jh86GZQU6aP8HznofUPQPnQBlaUunu7BF9sRYIJIWiywAUxCZbGW2EuXUj6q+Zf0LjFmRTBXMo5Vbb1zzPU6xO41+moFxrxzV8DHgBcz8Aj43v5wS/BAw6U+8WNGda+7Fkmkk4Gne3DGrN7swPwfOeh9Q9A+c8Sp/t9joxsz2XQ6xI5dTvLKAAB9+OhB0a9G7sjLq/Q6cc2k0r4WU9YvDMhJjX1P4hT8Il3SSwChPICf8/ID7uAKFt8UYiSO6rNy4tZu3qm26Er38tqBcnYahzx9tLx9tMx+FPAFVpKWQhg42WYFFufB52wAu84ucrlsfhJKCgW5H9QfYHFRWekR3FGjv73uPg/20NpoFYJnQaMhwNKucIvHdCGytdIqsKzmiB0xf40y4tn/MecRrCxVD8WiUVVVYOb0doQ6ddjjNaxC8gSros4wDW9jW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 + + + +#DRAFTFACE +FACEDRAFTVALUE=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 \ No newline at end of file diff --git a/api-test/src/main/resources/config/bioValueEncryptionTemplate.json b/api-test/src/main/resources/config/bioValueEncryptionTemplate.json new file mode 100644 index 00000000000..28a3c954310 --- /dev/null +++ b/api-test/src/main/resources/config/bioValueEncryptionTemplate.json @@ -0,0 +1,14 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "aad": "VGhpcyBpcyBzYW1wbGUgYWFk", + "applicationId": "IDA", + "data": "string", + "referenceId": "IDA-FIR", + "salt": "LA7YcvP9DdLIVI5CwFt1SQ", + "timeStamp": "$TIMESTAMP$" + }, + "requesttime": "$TIMESTAMP$", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/bulkUpload.json b/api-test/src/main/resources/config/bulkUpload.json new file mode 100644 index 00000000000..5ac0a5552d9 --- /dev/null +++ b/api-test/src/main/resources/config/bulkUpload.json @@ -0,0 +1,6 @@ +{ + "category":"masterData", + "files":[ "masterdata/BulkUpload/FilesToUpload/user_detail.csv" ], + "operation":"update", + "tableName":"user_detail" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/clientPrivateKey.txt b/api-test/src/main/resources/config/clientPrivateKey.txt new file mode 100644 index 00000000000..2b5f316b080 --- /dev/null +++ b/api-test/src/main/resources/config/clientPrivateKey.txt @@ -0,0 +1 @@ +{"p": "0-40ISxXDmC8SVrudg1e7vQskyWlohadm83RAkUyH6S4h1aTPrNwLVn9WANnyRTqupD1Fr8mYZ7f9nZ2MkMj45UV8uiIjQZr3crMq0YGkzt_LvwhLduWOJ_z9_9zZNHckXei4G8QQFJQYb3TNdGsVVSwff68SSoen8oqvkbkAJs","kty": "RSA","q": "6as88odcbP2MDT9lkahK2z4QIH25zsa_UdLgAtLwDVpekXfJNOQvuqNY1Gw3Jws6uPDLGcEK42MyeOdCFqklFTvDJlJXMFvgWrmGbCUMvJL-rFyO-kCTGnFBX60ozdJbjfBt3E3QYx3G907Ziuu9o0azey1DJtq_zKwearE-xTs","d": "BgdeiCZbr5qZ4haShg9uQinZRYPSUTYc_58YgvQ0WkPKm5fINOgOJPvimdKYBt8OtIWbhojTyn0TKrGPPAqFZCnGY16HkCUN31MbluD2wxYz6SPpZ1zsmP8PbQUVozjEFeLpiTN6nubw_skS_9GGrl1CPb25wTPlZtI3uQ5IiPL_YD5j_w5_J7tejAaRbhlJj48ZDa4CR8BkaUi2QaQmLoyiO_1O-U-Nf17-t1C6zFFKKHQx2lNltE1xFQoHB4WuBA2GnP5LgNFJSLv0p95gQK37nP0TTcuiZVlvFcmbGI_ilWlxRKJUD3mZR6nz25X4SapUWswnrnm7JtUA_UGVGw","e": "AQAB","use": "sig","kid": "1bbdc9de-c24f-4801-b6b3-691ac07641af","qi": "pmL_G7T4OF_pr2RCzkkupi1dCbwRX39bMEIs3uirvkoPR5CENvuvsXQ0Oias3taxzLa4nG5JVXHkyOIX8UsK1NFrzZPRKbfNX3h5EAnl3I7cZMtoYJLnawUqaNTukOmDChPlKx1fVjUwsyNn5HSAnmBiaOmm_RHo36tPhgaPUtE","dp": "e3b2X60ZOoMYrhOPgK7hc4xEu6TfDcLnJvGMpinxvYWVCyNgvNKEs6cNdMznFbpd1TrFze6mSZDpIQh6a2W57sfX9Z-Kjb4D8T5IZi9xfSzYN2MjYTfgGDT3SK9FZqLsQMLV3LJXYWGS-p5AAcaZA01HVN-miWlEVgrNQ_TAt6k","dq": "Yg-BqUoTCI4y6xBS4JieqXlXLTt18YfInF8BsU2yffgRvbxmTPMB8LJCQgsT7iexQhGTOkCgACMN-F0ciAP90vZchEWD34B_G7PF7LZzrOOHSvAg9HaLBUrII424lP-VenCOuihRrna9m-WUN8-MquutwKCTEMg2O39z2FR_wic","n": "wXGQA574CU-WTWPILd4S3_1sJf0Yof0kwMeNctXc1thQo70Ljfn9f4igpRe7f8qNs_W6dLuLWemFhGJBQBQ7vvickECKNJfo_EzSD_yyPCg7k_AGbTWTkuoObHrpilwJGyKVSkOIujH_FqHIVkwkVXjWc25Lsb8Gq4nAHNQEqqgaYPLEi5evCR6S0FzcXTPuRh9zH-cM0Onjv4orrfYpEr61HcRp5MXL55b7yBoIYlXD8NfalcgdrWzp4VZHvQ8yT9G5eaf27XUn6ZBeBf7VnELcKFTyw1pK2wqoOxRBc8Y1wO6rEy8PlCU6wD-mbIzcjG1wUfnbgvJOM4A5G41quQ"} \ No newline at end of file diff --git a/api-test/src/main/resources/config/errorUIN.json b/api-test/src/main/resources/config/errorUIN.json new file mode 100644 index 00000000000..e146f2df91d --- /dev/null +++ b/api-test/src/main/resources/config/errorUIN.json @@ -0,0 +1,24 @@ +{ + "URL": "$IGNORE$", + "authRequest": { + "body": "$IGNORE$", + "signature": "$IGNORE$" + }, + "authResponse": { + "body": { + "transactionID": "$IGNORE$", + "version": "$IGNORE$", + "id": "$IGNORE$", + "errors": [ + { + "errorCode": "IDA-MLC-015", + "errorMessage": "$IGNORE$" + } + ], + "responseTime": "$IGNORE$", + "response": { + "authStatus": false + } + } + } +} diff --git a/api-test/src/main/resources/config/errorUINIdp.json b/api-test/src/main/resources/config/errorUINIdp.json new file mode 100644 index 00000000000..c666118a46e --- /dev/null +++ b/api-test/src/main/resources/config/errorUINIdp.json @@ -0,0 +1,9 @@ +{ + "responseTime": "$IGNORE$", + "errors": [ + { + "errorCode": "IDA-MLC-015", + "errorMessage": "$IGNORE$" + } + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/errorUINKyc.json b/api-test/src/main/resources/config/errorUINKyc.json new file mode 100644 index 00000000000..96c1c0ea9c1 --- /dev/null +++ b/api-test/src/main/resources/config/errorUINKyc.json @@ -0,0 +1,24 @@ +{ + "URL": "$IGNORE$", + "authRequest": { + "body": "$IGNORE$", + "signature": "$IGNORE$" + }, + "authResponse": { + "body": { + "transactionID": "$IGNORE$", + "version": "$IGNORE$", + "id": "$IGNORE$", + "errors": [ + { + "errorCode": "IDA-MLC-015", + "errorMessage": "$IGNORE$" + } + ], + "responseTime": "$IGNORE$", + "response": { + "kycStatus": false + } + } + } +} diff --git a/api-test/src/main/resources/config/esignetPayload.json b/api-test/src/main/resources/config/esignetPayload.json new file mode 100644 index 00000000000..d20391e3156 --- /dev/null +++ b/api-test/src/main/resources/config/esignetPayload.json @@ -0,0 +1,7 @@ +{ + "sub" : "mosip-resident-idp-client", + "iss" : "mosip-resident-idp-client", + "aud" : "https://api.dev.mosip.net/v1/idp", + "exp" : "1667833124", + "iat" : "1665154724" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/folderPaths.properties b/api-test/src/main/resources/config/folderPaths.properties new file mode 100644 index 00000000000..ad6bed29f2e --- /dev/null +++ b/api-test/src/main/resources/config/folderPaths.properties @@ -0,0 +1,10 @@ +pathForValidRegProcPackets=regProc/Packets/ValidPackets/ +invalidPacketFolderPath=regProc/Packets/InvalidPackets/ +validPacketForPacketGeneration=regProc/Packets/ValidPackets/packteForInvalidPackets +syncTokenGenerationFilePath=config/tokenGeneration.properties +getStatusTokenGenerationFilePath=config/adminTokenGeneration.properties +pathForValidIntegration=regProc/IntegrationScenarios/ValidPacket +newPacketForUpdatePacket=regProc/UpdatePacket/regProc_Update_smoke +updatedPacketFolderPath = regProc/UpdatePacket/ +packetForSecurityTest=regProc/Packets/PacketForSecurity +idRepoTokenPath=config/idRepoToken.properties diff --git a/api-test/src/main/resources/config/healthCheckEndpoint.properties b/api-test/src/main/resources/config/healthCheckEndpoint.properties new file mode 100644 index 00000000000..f7a8576fe1e --- /dev/null +++ b/api-test/src/main/resources/config/healthCheckEndpoint.properties @@ -0,0 +1,45 @@ +###### = +regproc_masterdata=/v1/hotlist/actuator/health +masterdata=/v1/admin/actuator/health +auth_idrepo_resident_regproc_masterdata=/v1/auditmanager/actuator/health +auth_idrepo_resident_regproc_masterdata=/v1/authmanager/actuator/health +auth_idrepo_regproc=/biosdk-service/actuator/health +auth_mobileid=/v1/credentialservice/actuator/health +auth_mobileid=/v1/credentialrequest/actuator/health +auth_idrepo_regproc_partner=/v1/datashare/actuator/health +auth_mobileid_esignet=/idauthentication/v1/actuator/health +auth_mobileid_esignet_partner=/idauthentication/v1/internal/actuator/health +auth_mobileid_esignet=/idauthentication/v1/otp/actuator/health +idrepo_auth_mobileid_mimoto_esignet_resident_regproc=/idrepository/v1/identity/actuator/health +idrepo_regproc=/v1/idgenerator/actuator/health +idrepo_resident_regproc_masterdata=/v1/keymanager/actuator/health +auth_idrepo_masterdata_mobileid_mimoto_esignet_resident_partner_prereg_regproc=/v1/masterdata/actuator/health +auth_idrepo_resident_regproc=/v1/notifier/actuator/health +auth_mobileid=/v1/otpmanager/actuator/health +partner_auth_esignet_idrepo_resident_regproc=/v1/partnermanager/actuator/health +partner_auth_esignet_regproc=/v1/policymanager/actuator/health +prereg=/preregistration/v1/captcha/actuator/health +prereg=/v1/pridgenerator/actuator/health +resident_regproc=/registrationprocessor/v1/packetreceiver/actuator/health +regproc_masterdata=/registrationprocessor/v1/registrationstatus/actuator/health +resident_auth_esignet_mobileid=/resident/v1/actuator/health +# TO DO idrepo_auth_mobileid_mimoto_esignet_resident=/v1/ridgenerator/actuator/health +regproc_masterdata=/v1/syncdata/actuator/health +idrepo_auth_mobileid_mimoto_esignet_resident_regproc=/idrepository/v1/actuator/health +auth_idrepo_resident_regproc=/hub/actuator/health +resident_esignet=/v1/esignet/actuator/health + +#The below actuators are not used for functional test rigs. +#regproc=/v1/identity/actuator/health +#regproc=/registrationprocessor/v1/registrationtransaction/actuator/health +#regproc=/registrationprocessor/v1/workflowmanager/actuator/health +#regproc=/registrationprocessor/v1/landingzone/actuator/health +#regproc=/registrationprocessor/v1/notification/actuator/health +#regproc=/registrationprocessor/v1/opencrvs-stage/actuator/health +#regproc=/registrationprocessor/v1/reprocessor/actuator/health +#regproc=/v1/print/actuator/health +#regproc=/registrationprocessor/v1/camelbridge/actuator/health +#regproc=/v1/packetcreator/actuator/health +#regproc=/commons/v1/packetmanager/actuator/health +#regproc=/v1/mock-abis-service/actuator/health +#regproc=/v1/mockmv/actuator/health \ No newline at end of file diff --git a/api-test/src/main/resources/config/idRepoToken.properties b/api-test/src/main/resources/config/idRepoToken.properties new file mode 100644 index 00000000000..e8337374e5c --- /dev/null +++ b/api-test/src/main/resources/config/idRepoToken.properties @@ -0,0 +1,5 @@ +token.request.id=mosip.io.userId.pwd +token.request.appid=ida +token.request.username=ida_testuser +token.request.password=mosip +token.request.version=1.0 \ No newline at end of file diff --git a/api-test/src/main/resources/config/idaCertDataDeleteQueries.txt b/api-test/src/main/resources/config/idaCertDataDeleteQueries.txt new file mode 100644 index 00000000000..678c2eb0666 --- /dev/null +++ b/api-test/src/main/resources/config/idaCertDataDeleteQueries.txt @@ -0,0 +1,8 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=resident_pid%' +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=resident_ekyc_pid%' +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=resident_device_pid%' +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=resident_ftm_pid%' +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforautomationesi%' +delete from ida.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforesignet%' \ No newline at end of file diff --git a/api-test/src/main/resources/config/idrepoCertDataDeleteQueries.txt b/api-test/src/main/resources/config/idrepoCertDataDeleteQueries.txt new file mode 100644 index 00000000000..f6333031281 --- /dev/null +++ b/api-test/src/main/resources/config/idrepoCertDataDeleteQueries.txt @@ -0,0 +1,3 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from idrepo.handle WHERE cr_by ='service-account-mosip-testrig-client' \ No newline at end of file diff --git a/api-test/src/main/resources/config/keyManagerCertDataDeleteQueries.txt b/api-test/src/main/resources/config/keyManagerCertDataDeleteQueries.txt new file mode 100644 index 00000000000..a21b769f672 --- /dev/null +++ b/api-test/src/main/resources/config/keyManagerCertDataDeleteQueries.txt @@ -0,0 +1,14 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=resident_pid%' +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=resident_ekyc_pid%' +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=resident_device_pid%' +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=resident_ftm_pid%' +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforautomationesi%' +delete from mosip_keymgr.keymgr.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforesignet%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=resident_pid%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=resident_ekyc_pid%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=resident_device_pid%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=resident_ftm_pid%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=partnernameforautomationesi%' +delete from mosip_keymgr.keymgr.partner_cert_store WHERE cert_subject LIKE '%O=partnernameforesignet%' \ No newline at end of file diff --git a/api-test/src/main/resources/config/keyManagerDataDeleteQueries.txt b/api-test/src/main/resources/config/keyManagerDataDeleteQueries.txt new file mode 100644 index 00000000000..3ecf9f7ceb5 --- /dev/null +++ b/api-test/src/main/resources/config/keyManagerDataDeleteQueries.txt @@ -0,0 +1,14 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=mosiptest.org,O=MOSIPTEST,L=Bangalore,ST=Karantaka,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=Techno.com,O=Techno,L=Bangalore,ST=Karnataka,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=Techno,O=Techno,L=Bangalore,ST=Karnataka,C=IN' +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=apitest,OU=apitest,O=apitest,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=apitest2,OU=apitest2,O=apitest2,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=deviceprovider,OU=deviceprovider,O=deviceprovider,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=movp,OU=movp,O=movp,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=ftp,OU=ftp,O=ftp,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=misp,OU=misp,O=misp,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=misp2,OU=misp2,O=misp2,L=BLR,ST=KAR,C=IN' +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=mosipprint,O=mosipprint,L=Bangalore,ST=Karnataka,C=IN' +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=mosipprint,O=mosipprint,L=Bangalore,ST=Karnataka,C=IN' \ No newline at end of file diff --git a/api-test/src/main/resources/config/lang-isocode-transid.csv b/api-test/src/main/resources/config/lang-isocode-transid.csv new file mode 100644 index 00000000000..7a00fd36e6c --- /dev/null +++ b/api-test/src/main/resources/config/lang-isocode-transid.csv @@ -0,0 +1,550 @@ +ISO 639-2 Code,English Name,English-to-Language-TransID +aar,Afar,Any-ar +abk,Abkhazian, +ace,Achinese, +ach,Acoli, +ada,Adangme, +ady,Adyghe; Adygei, +afa,Afro-Asiatic languages, +afh,Afrihili, +afr,Afrikaans, +ain,Ainu, +aka,Akan, +akk,Akkadian, +alb (B),Albanian, +sqi (T),, +ale,Aleut, +alg,Algonquian languages, +alt,Southern Altai, +amh,Amharic, +ang,"English, Old (ca.450-1100)", +anp,Angika, +apa,Apache languages, +ara,Arabic,Any-Arab +arc,Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE), +arg,Aragonese, +arm (B),Armenian, +hye (T),, +arn,Mapudungun; Mapuche, +arp,Arapaho, +art,Artificial languages, +arw,Arawak, +asm,Assamese, +ast,Asturian; Bable; Leonese; Asturleonese, +ath,Athapascan languages, +aus,Australian languages, +ava,Avaric, +ave,Avestan, +awa,Awadhi, +aym,Aymara, +aze,Azerbaijani, +bad,Banda languages, +bai,Bamileke languages, +bak,Bashkir, +bal,Baluchi, +bam,Bambara, +ban,Balinese, +baq (B),Basque, +eus (T),, +bas,Basa, +bat,Baltic languages, +bej,Beja; Bedawiyet, +bel,Belarusian, +bem,Bemba, +ben,Bengali, +ber,Berber languages, +bho,Bhojpuri, +bih,Bihari languages, +bik,Bikol, +bin,Bini; Edo, +bis,Bislama, +bla,Siksika, +bnt,Bantu languages, +tib (B),Tibetan, +bod (T),, +bos,Bosnian, +bra,Braj, +bre,Breton, +btk,Batak languages, +bua,Buriat, +bug,Buginese, +bul,Bulgarian, +bur (B),Burmese, +mya (T),, +byn,Blin; Bilin, +cad,Caddo, +cai,Central American Indian languages, +car,Galibi Carib, +cat,Catalan; Valencian, +cau,Caucasian languages, +ceb,Cebuano, +cel,Celtic languages, +cze (B),Czech, +ces (T),, +cha,Chamorro, +chb,Chibcha, +che,Chechen, +chg,Chagatai, +chi (B),Chinese, +zho (T),, +chk,Chuukese, +chm,Mari, +chn,Chinook jargon, +cho,Choctaw, +chp,Chipewyan; Dene Suline, +chr,Cherokee, +chu,Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic, +chv,Chuvash, +chy,Cheyenne, +cmc,Chamic languages, +cnr,Montenegrin, +cop,Coptic, +cor,Cornish, +cos,Corsican, +cpe,"Creoles and pidgins, English based", +cpf,"Creoles and pidgins, French-based", +cpp,"Creoles and pidgins, Portuguese-based", +cre,Cree, +crh,Crimean Tatar; Crimean Turkish, +crp,Creoles and pidgins, +csb,Kashubian, +cus,Cushitic languages, +wel (B),Welsh, +cym (T),, +cze (B),Czech, +ces (T),, +dak,Dakota, +dan,Danish, +dar,Dargwa, +day,Land Dayak languages, +del,Delaware, +den,Slave (Athapascan), +ger (B),German, +deu (T),, +dgr,Dogrib, +din,Dinka, +div,Divehi; Dhivehi; Maldivian, +doi,Dogri, +dra,Dravidian languages, +dsb,Lower Sorbian, +dua,Duala, +dum,"Dutch, Middle (ca.1050-1350)", +dut (B),Dutch; Flemish, +nld (T),, +dyu,Dyula, +dzo,Dzongkha, +efi,Efik, +egy,Egyptian (Ancient), +eka,Ekajuk, +gre (B),"Greek, Modern (1453-)", +ell (T),, +elx,Elamite, +eng,English,eng, +enm,"English, Middle (1100-1500)", +epo,Esperanto, +est,Estonian, +baq (B),Basque, +eus (T),, +ewe,Ewe, +ewo,Ewondo, +fan,Fang,Any-fa +fao,Faroese, +per (B),Persian, +fas (T),, +fat,Fanti, +fij,Fijian, +fil,Filipino; Pilipino, +fin,Finnish, +fiu,Finno-Ugrian languages, +fon,Fon, +fre (B),French, +fra (T),, +fre (B),French, +fra (T),, +frm,"French, Middle (ca.1400-1600)", +fro,"French, Old (842-ca.1400)", +frr,Northern Frisian, +frs,Eastern Frisian, +fry,Western Frisian, +ful,Fulah, +fur,Friulian, +gaa,Ga, +gay,Gayo, +gba,Gbaya, +gem,Germanic languages, +geo (B),Georgian, +kat (T),, +ger (B),German, +deu (T),, +gez,Geez, +gil,Gilbertese, +gla,Gaelic; Scottish Gaelic, +gle,Irish, +glg,Galician, +glv,Manx, +gmh,"German, Middle High (ca.1050-1500)", +goh,"German, Old High (ca.750-1050)", +gon,Gondi, +gor,Gorontalo, +got,Gothic, +grb,Grebo, +grc,"Greek, Ancient (to 1453)", +gre (B),"Greek, Modern (1453-)", +ell (T),, +grn,Guarani, +gsw,Swiss German; Alemannic; Alsatian, +guj,Gujarati, +gwi,Gwich'in, +hai,Haida, +hat,Haitian; Haitian Creole, +hau,Hausa, +haw,Hawaiian, +heb,Hebrew,Any-Hebrew +her,Herero, +hil,Hiligaynon, +him,Himachali languages; Western Pahari languages, +hin,Hindi,Any-Devanagari +kan,Kannada,Any-Kannada +tam,Tamil,Any-Tamil +hit,Hittite, +hmn,Hmong; Mong, +hmo,Hiri Motu, +hrv,Croatian, +hsb,Upper Sorbian, +hun,Hungarian, +hup,Hupa, +arm (B),Armenian, +hye (T),, +iba,Iban, +ibo,Igbo, +ice (B),Icelandic, +isl (T),, +ido,Ido, +iii,Sichuan Yi; Nuosu, +ijo,Ijo languages, +iku,Inuktitut, +ile,Interlingue; Occidental, +ilo,Iloko, +ina,Interlingua (International Auxiliary Language Association), +inc,Indic languages, +ind,Indonesian, +ine,Indo-European languages, +inh,Ingush, +ipk,Inupiaq, +ira,Iranian languages, +iro,Iroquoian languages, +ice (B),Icelandic, +isl (T),, +ita,Italian, +jav,Javanese, +jbo,Lojban, +jpn,Japanese, +jpr,Judeo-Persian, +jrb,Judeo-Arabic, +kaa,Kara-Kalpak, +kab,Kabyle, +kac,Kachin; Jingpho, +kal,Kalaallisut; Greenlandic, +kam,Kamba, +kan,Kannada, +kar,Karen languages, +kas,Kashmiri, +geo (B),Georgian, +kat (T),, +kau,Kanuri, +kaw,Kawi, +kaz,Kazakh, +kbd,Kabardian, +kha,Khasi, +khi,Khoisan languages, +khm,Central Khmer, +kho,Khotanese; Sakan, +kik,Kikuyu; Gikuyu, +kin,Kinyarwanda, +kir,Kirghiz; Kyrgyz, +kmb,Kimbundu, +kok,Konkani, +kom,Komi, +kon,Kongo, +kor,Korean, +kos,Kosraean, +kpe,Kpelle, +krc,Karachay-Balkar, +krl,Karelian, +kro,Kru languages, +kru,Kurukh, +kua,Kuanyama; Kwanyama, +kum,Kumyk, +kur,Kurdish, +kut,Kutenai, +lad,Ladino, +lah,Lahnda, +lam,Lamba, +lao,Lao, +lat,Latin,Any-Latin +lav,Latvian, +lez,Lezghian, +lim,Limburgan; Limburger; Limburgish, +lin,Lingala, +lit,Lithuanian, +lol,Mongo, +loz,Lozi, +ltz,Luxembourgish; Letzeburgesch, +lua,Luba-Lulua, +lub,Luba-Katanga, +lug,Ganda, +lui,Luiseno, +lun,Lunda, +luo,Luo (Kenya and Tanzania), +lus,Lushai, +mac (B),Macedonian, +mkd (T),, +mad,Madurese, +mag,Magahi, +mah,Marshallese, +mai,Maithili, +mak,Makasar, +mal,Malayalam, +man,Mandingo, +mao (B),Maori, +mri (T),, +map,Austronesian languages, +mar,Marathi, +mas,Masai, +may (B),Malay, +msa (T),, +mdf,Moksha, +mdr,Mandar, +men,Mende, +mga,"Irish, Middle (900-1200)", +mic,Mi'kmaq; Micmac, +min,Minangkabau, +mis,Uncoded languages, +mac (B),Macedonian, +mkd (T),, +mkh,Mon-Khmer languages, +mlg,Malagasy, +mlt,Maltese, +mnc,Manchu, +mni,Manipuri, +mno,Manobo languages, +moh,Mohawk, +mon,Mongolian, +mos,Mossi, +mao (B),Maori, +mri (T),, +may (B),Malay, +msa (T),, +mul,Multiple languages, +mun,Munda languages, +mus,Creek, +mwl,Mirandese, +mwr,Marwari, +bur (B),Burmese, +mya (T),, +myn,Mayan languages, +myv,Erzya, +nah,Nahuatl languages, +nai,North American Indian languages, +nap,Neapolitan, +nau,Nauru, +nav,Navajo; Navaho, +nbl,"Ndebele, South; South Ndebele", +nde,"Ndebele, North; North Ndebele", +ndo,Ndonga, +nds,"Low German; Low Saxon; German, Low; Saxon, Low", +nep,Nepali, +new,Nepal Bhasa; Newari, +nia,Nias, +nic,Niger-Kordofanian languages, +niu,Niuean, +dut (B),Dutch; Flemish, +nld (T),, +nno,"Norwegian Nynorsk; Nynorsk, Norwegian", +nob,"Bokmål, Norwegian; Norwegian Bokmål", +nog,Nogai, +non,"Norse, Old", +nor,Norwegian, +nqo,N'Ko, +nso,Pedi; Sepedi; Northern Sotho, +nub,Nubian languages, +nwc,Classical Newari; Old Newari; Classical Nepal Bhasa, +nya,Chichewa; Chewa; Nyanja, +nym,Nyamwezi, +nyn,Nyankole, +nyo,Nyoro, +nzi,Nzima, +oci,Occitan (post 1500), +oji,Ojibwa, +ori,Oriya, +orm,Oromo, +osa,Osage, +oss,Ossetian; Ossetic, +ota,"Turkish, Ottoman (1500-1928)", +oto,Otomian languages, +paa,Papuan languages, +pag,Pangasinan, +pal,Pahlavi, +pam,Pampanga; Kapampangan, +pan,Panjabi; Punjabi, +pap,Papiamento, +pau,Palauan, +peo,"Persian, Old (ca.600-400 B.C.)", +per (B),Persian, +fas (T),, +phi,Philippine languages, +phn,Phoenician, +pli,Pali, +pol,Polish, +pon,Pohnpeian, +por,Portuguese, +pra,Prakrit languages, +pro,"Provençal, Old (to 1500);Occitan, Old (to 1500)", +pus,Pushto; Pashto, +qaa-qtz,Reserved for local use, +que,Quechua, +raj,Rajasthani, +rap,Rapanui, +rar,Rarotongan; Cook Islands Maori, +roa,Romance languages, +roh,Romansh, +rom,Romany, +rum (B),Romanian; Moldavian; Moldovan, +ron (T),, +rum (B),Romanian; Moldavian; Moldovan, +ron (T),, +run,Rundi, +rup,Aromanian; Arumanian; Macedo-Romanian, +rus,Russian, +sad,Sandawe, +sag,Sango, +sah,Yakut, +sai,South American Indian languages, +sal,Salishan languages, +sam,Samaritan Aramaic, +san,Sanskrit, +sas,Sasak, +sat,Santali, +scn,Sicilian, +sco,Scots, +sel,Selkup, +sem,Semitic languages, +sga,"Irish, Old (to 900)", +sgn,Sign Languages, +shn,Shan, +sid,Sidamo, +sin,Sinhala; Sinhalese, +sio,Siouan languages, +sit,Sino-Tibetan languages, +sla,Slavic languages, +slo (B),Slovak, +slk (T),, +slo (B),Slovak, +slk (T),, +slv,Slovenian, +sma,Southern Sami, +sme,Northern Sami, +smi,Sami languages, +smj,Lule Sami, +smn,Inari Sami, +smo,Samoan, +sms,Skolt Sami, +sna,Shona, +snd,Sindhi, +snk,Soninke, +sog,Sogdian, +som,Somali, +son,Songhai languages, +sot,"Sotho, Southern", +spa,Spanish; Castilian, +alb (B),Albanian, +sqi (T),, +srd,Sardinian, +srn,Sranan Tongo, +srp,Serbian, +srr,Serer, +ssa,Nilo-Saharan languages, +ssw,Swati, +suk,Sukuma, +sun,Sundanese, +sus,Susu, +sux,Sumerian, +swa,Swahili, +swe,Swedish, +syc,Classical Syriac, +syr,Syriac, +tah,Tahitian, +tai,Tai languages, +tam,Tamil, +tat,Tatar, +tel,Telugu, +tem,Timne, +ter,Tereno, +tet,Tetum, +tgk,Tajik, +tgl,Tagalog, +tha,Thai,Any-Thai +tib (B),Tibetan, +bod (T),, +tig,Tigre, +tir,Tigrinya, +tiv,Tiv, +tkl,Tokelau, +tlh,Klingon; tlhIngan-Hol, +tli,Tlingit, +tmh,Tamashek, +tog,Tonga (Nyasa), +ton,Tonga (Tonga Islands), +tpi,Tok Pisin, +tsi,Tsimshian, +tsn,Tswana, +tso,Tsonga, +tuk,Turkmen, +tum,Tumbuka, +tup,Tupi languages, +tur,Turkish, +tut,Altaic languages, +tvl,Tuvalu, +twi,Twi, +tyv,Tuvinian, +udm,Udmurt, +uga,Ugaritic, +uig,Uighur; Uyghur, +ukr,Ukrainian, +umb,Umbundu, +und,Undetermined, +urd,Urdu, +uzb,Uzbek, +vai,Vai, +ven,Venda, +vie,Vietnamese, +vol,Volapük, +vot,Votic, +wak,Wakashan languages, +wal,Wolaitta; Wolaytta, +war,Waray, +was,Washo, +wel (B),Welsh, +cym (T),, +wen,Sorbian languages, +wln,Walloon, +wol,Wolof, +xal,Kalmyk; Oirat, +xho,Xhosa, +yao,Yao, +yap,Yapese, +yid,Yiddish, +yor,Yoruba, +ypk,Yupik languages, +zap,Zapotec, +zbl,Blissymbols; Blissymbolics; Bliss, +zen,Zenaga, +zgh,Standard Moroccan Tamazight, +zha,Zhuang; Chuang, +chi (B),Chinese, +zho (T),, +znd,Zande languages, +zul,Zulu, +zun,Zuni, +zxx,No linguistic content; Not applicable, +zza,, diff --git a/api-test/src/main/resources/config/mapping.properties b/api-test/src/main/resources/config/mapping.properties new file mode 100644 index 00000000000..1e1908c8fc3 --- /dev/null +++ b/api-test/src/main/resources/config/mapping.properties @@ -0,0 +1,29 @@ +AuthReq.domainUri=domainUri +AuthReq.env=env +AuthReq.keyIndex=keyIndex +AuthReq.specVersion=specVersion +AuthReq.thumbprint=thumbprint +AuthReq.demo=requestedAuth.demo +AuthReq.pin=requestedAuth.pin +AuthReq.consentObtained=consentObtained +AuthReq.id=id +AuthReq.requestTime=requestTime +AuthReq.demo=requestedAuth.demo +AuthReq.transactionID=transactionID +AuthReq.request=request +AuthReq.individualId=individualId +AuthReq.version=version +AuthReq.individualIdType=individualIdType +AuthReq.requestSessionKey=requestSessionKey +AuthReq.otp=requestedAuth.otp +AuthReqrequestHMAC=requestHMAC +AuthReq.bio=requestedAuth.bio + +#TestScriptMapping +#ModifyBioAuth +key=requestSessionKey +data=request +hmac=requestHMAC +thumbprint=thumbprint +#ModifyEkycRequest +authRequest=authRequest \ No newline at end of file diff --git a/api-test/src/main/resources/config/masterDataCertDataDeleteQueries.txt b/api-test/src/main/resources/config/masterDataCertDataDeleteQueries.txt new file mode 100644 index 00000000000..f6651385024 --- /dev/null +++ b/api-test/src/main/resources/config/masterDataCertDataDeleteQueries.txt @@ -0,0 +1,8 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=resident_pid%' +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=resident_ekyc_pid%' +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=resident_device_pid%' +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=resident_ftm_pid%' +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforautomationesi%' +delete from master.ca_cert_store WHERE cert_subject LIKE '%O=partnernameforesignet%' \ No newline at end of file diff --git a/api-test/src/main/resources/config/masterDataDeleteQueries.txt b/api-test/src/main/resources/config/masterDataDeleteQueries.txt new file mode 100644 index 00000000000..be2ab648aa6 --- /dev/null +++ b/api-test/src/main/resources/config/masterDataDeleteQueries.txt @@ -0,0 +1,91 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from master.blocklisted_words where cr_by='dumbo6' +delete from master.blocklisted_words where word='dumbooo' +delete from master.blocklisted_words where cr_by='masterdata-220005' +delete from master.machine_master where cr_by='masterdata-220005' +delete from master.machine_master where cr_by='masterdata-220005' +delete from master.machine_master where name in ('Mach-Test','Mach-Test2','Mach-Test updated') +delete from master.machine_master mm WHERE mm.mspec_id IN(SELECT ms.id from master.machine_spec ms where ms.cr_by='masterdata-220005') +delete FROM master.machine_spec WHERE mtyp_code IN (SELECT code FROM master.machine_type WHERE cr_by = 'masterdata-220005') +delete from master.machine_spec where cr_by='masterdata-220005' +delete from master.machine_type where cr_by='masterdata-220005' +delete from master.gender where cr_by='masterdata-220005' +delete from master.device_master where upd_by='masterdata-220005' +delete from master.device_master where cr_by='masterdata-220005' +delete from master.device_master where name='testDevicedummy' +DELETE FROM master.device_master WHERE dspec_id IN(SELECT id FROM master.device_spec WHERE cr_by='masterdata-220005') +delete from master.device_spec where cr_by='masterdata-220005' +delete from master.device_type where cr_by='masterdata-220005' +delete from master.loc_holiday where cr_by='masterdata-220005' +delete from master.reg_center_type where cr_by='masterdata-220005' +delete from master.registration_center where cr_by='masterdata-220005' +delete from master.loc_holiday where cr_by='masterdata-220005' +delete from master.reg_center_type where cr_by='masterdata-220005' +delete from master.registration_center where cr_by='masterdata-220005' +delete from master.device_type where cr_by='masterdata-220005' +delete from master.doc_type where cr_by='masterdata-220005' +delete from master.doc_category where cr_by='masterdata-220005' +delete from master.location where cr_by='masterdata-220005' +delete from master.template where cr_by='masterdata-220005' +update master.template set is_active='true', is_deleted='false' where id='1101' +delete from master.template where template_typ_code IN(select code from master.template_type where code='Test-info-Template-auto') +delete from master.template_type where code='Test-info-Template-auto' +update master.location set is_active='true', is_deleted='false' where code='10114' +delete from master.location where code in('TST123','IND') +delete from master.valid_document where cr_by='masterdata-220005' +delete from master.user_detail where cr_by='masterdata-220005' +delete from master.template_type where cr_by='masterdata-220005' +delete from master.template_file_format where cr_by='masterdata-220005' +delete from master.reason_list where cr_by='masterdata-220005' +delete from master.reason_category where cr_by='masterdata-220005' +delete from master.language where cr_by='masterdata-220005' +delete from master.identity_schema where cr_by='masterdata-220005' +delete from master.biometric_attribute where cr_by='masterdata-220005' +delete from master.biometric_type where cr_by='masterdata-220005' +delete from master.appl_form_type where cr_by='masterdata-220005' +delete from master.id_type where cr_by='masterdata-220005' +delete from master.dynamic_field where cr_by='masterdata-220005' +delete from master.zone_user where usr_id='masterdata-220005' +delete from master.blocklisted_words where word='dumbo6' +delete from master.blocklisted_words where word='dumbo7' +delete from master.machine_master where name in ('Mach-Test','Mach-Test2','Mach-Test updated') +delete from master.machine_master where mac_address = '61-D3-FD-12-C9-ED' +delete from master.machine_spec where name='HP' +delete from master.machine_master where cr_by='masterdata-220005' +delete from master.machine_type where code='Laptop2' +delete from master.gender where code='Genderdummy' +delete from master.device_master where name in ('testDevicedummy','testDevicedummy updated') +delete from master.device_master where dspec_id='743' +delete from master.device_spec where id='743' +delete from master.device_type where code='GST3' +delete from master.loc_holiday where holiday_name='AutoTest user Eng' +delete from master.loc_holiday where upd_by='masterdata-220005' +delete from master.reg_center_type where code='ALT-3' +delete FROM master.registration_center where name in ('Test123','HSR Center updated') +delete from master.loc_holiday where holiday_name in ('AutoTest user Eng','AutoTest user') +delete from master.reg_center_type where code in('ALT-3','ALT-5') +delete from master.registration_center where id='10000' +delete from master.device_type where code in ('GST3','GST4') +delete from master.doc_type where code in ('TestDocType0010','TestDocType0020') +delete from master.doc_category where code in ('DocTestCode123','DocTestCode321') +delete from master.location where code='TST12' +delete from master.template where id='445566777' +delete from master.template where template_typ_code IN(select code from master.template_type where code='Test-info-Template-auto') +update master.template set is_active='true', is_deleted='false' where id='1101' +delete from master.template_type where code='Test-info-Template-auto' +update master.location set is_active='true', is_deleted='false' where code='10114' +delete from master.location where code in('TST123','IND') +delete from master.valid_document where doctyp_Code='doc_auto_test' +delete from master.user_detail where cr_by='110005' +delete from master.template_type where code='Test-info-Template-auto' +delete from master.template_file_format where code='Doc' +delete from master.reason_list where code='TEST_LIST_CODE' +delete from master.reason_category where code='TEST_CAT_CODE' +delete from master.language where code='automationLang' +delete from master.identity_schema where title='test-schema' +delete from master.biometric_attribute where code='TST' +delete from master.biometric_type where code='dumbo6' +delete from master.appl_form_type where code='dumbo' +delete from master.id_type where code='NEW' +delete from master.dynamic_field where name in ('TestAutomationField','TestAPL') \ No newline at end of file diff --git a/api-test/src/main/resources/config/packetProperties.properties b/api-test/src/main/resources/config/packetProperties.properties new file mode 100644 index 00000000000..6b783e69208 --- /dev/null +++ b/api-test/src/main/resources/config/packetProperties.properties @@ -0,0 +1,2 @@ +machineId=99999 +centerId=33341 diff --git a/api-test/src/main/resources/config/packetValidator.properties b/api-test/src/main/resources/config/packetValidator.properties new file mode 100644 index 00000000000..320f9e5fedf --- /dev/null +++ b/api-test/src/main/resources/config/packetValidator.properties @@ -0,0 +1,2 @@ +file1=audit.json +file2=ID.json diff --git a/api-test/src/main/resources/config/partnerDemoService.properties b/api-test/src/main/resources/config/partnerDemoService.properties new file mode 100644 index 00000000000..bbb432d7e99 --- /dev/null +++ b/api-test/src/main/resources/config/partnerDemoService.properties @@ -0,0 +1,8 @@ +# these are the ports used for running the partner-demo-service, it should be same as in ida envRunConfig.properties +preprod.encryptionPort=7653 +dev.encryptionPort=7654 +int.encryptionPort=7655 +qa.encryptionPort=7656 +extint.encryptionPort=7657 +sandbox.encryptionPort=7658 +dev-test.encryptionPort=7659 \ No newline at end of file diff --git a/api-test/src/main/resources/config/partnerQueries.properties b/api-test/src/main/resources/config/partnerQueries.properties new file mode 100644 index 00000000000..8d39fa4d27a --- /dev/null +++ b/api-test/src/main/resources/config/partnerQueries.properties @@ -0,0 +1,135 @@ +deletePartnerpolicy=DELETE FROM policy_group WHERE "name"='MOSIP POLICY' AND cr_by='pm_testuser'; + +deleteUpdatePartnerpolicy=DELETE FROM policy_group WHERE "name"='MOSIP POLICY UPDATE' AND cr_by='pm_testuser'; + +createPartnerAuth=INSERT INTO auth_policy(\ +id, policy_group_id, "name", descr, policy_file_id, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('MOSIP-AUTH-ID-01', 'MOSIP-POLICY-ID-01', 'MOSIP POLICY', 'DESCR MOSIP POLICY', '{"authPolicies":[{"authType":"otp","authSubType":null,"mandatory":true},{"authType":"demo","authSubType":null,"mandatory":false},{"authType":"bio","authSubType":"FINGER","mandatory":false},{"authType":"bio","authSubType":"IRIS","mandatory":false},{"authType":"bio","authSubType":"FACE","mandatory":false},{"authType":"kyc","authSubType":null,"mandatory":false}],"allowedKycAttributes":[{"attributeName":"fullName","required":true},{"attributeName":"dateOfBirth","required":true},{"attributeName":"gender","required":true},{"attributeName":"phone","required":true},{"attributeName":"email","required":true},{"attributeName":"addressLine1","required":false},{"attributeName":"addressLine2","required":false},{"attributeName":"addressLine3","required":false},{"attributeName":"location1","required":false},{"attributeName":"location2","required":false},{"attributeName":"location3","required":false},{"attributeName":"postalCode","required":false},{"attributeName":"photo","required":false}]}', true, 'pm_testuser', '2020-05-14T09:48:43.394Z', null, null, false, null); + +deletePartnerAuth=DELETE FROM auth_policy WHERE "name"='MOSIP POLICY' AND cr_by='pm_testuser'; + +deleteUpdatePartnerAuth=DELETE FROM auth_policy WHERE "name"='MOSIP POLICY UPDATE' AND cr_by='pm_testuser'; + +deletePartnerAuthH=DELETE FROM auth_policy_h WHERE "name"='MOSIP POLICY' AND cr_by='pm_testuser'; + +deleteUpdatePartnerAuthH=DELETE FROM auth_policy_h WHERE "name"='MOSIP POLICY UPDATE' AND cr_by='pm_testuser'; + +registerPartner=INSERT INTO pmp.partner(\ +id,policy_group_id, name, address, contact_no, email_id, public_key, user_id, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('PMP-PART-ID-01','MOSIP-POLICY-ID-01','FUN-TEST-O1','HSR','8651119791','hsr@gmail.com',null,'pm_testuser',true,'pm_testuser','2020-05-14T09:48:43.394Z',null,null,null,null); + +#deleteRegisterPartner=delete from pmp.partner where policy_group_id IN ('MOSIP-POLICY-ID-01','TF-POLICY-ID-01') and contact_no='8651119791'; + +deleteRegisterPartner=delete from pmp.partner where policy_group_id IN ('MOSIP-POLICY-ID-01','TF-POLICY-ID-01'); + + + +#deleteSubmitPartnerApiKeyReq=delete from pmp.partner_policy_request where policy_id='MOSIP-POLICY-ID-01' and part_id='PMP-PART-ID-01'; + +createPartnerAPIKey=INSERT INTO partner_policy(\ +policy_api_key, part_id, policy_id, valid_from_datetime, valid_to_datetime, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('PAT-API-KEY-ID-01', 'PMP-PART-ID-01', 'MOSIP-AUTH-ID-01', '2020-06-17T21:15:19.724Z', '2020-08-16T04:23:39.148Z', true, 'pm_testuser', '2020-06-17T21:15:19.724Z', null, null, false, null); + +deletePartnerAPIKey=DELETE FROM partner_policy WHERE part_id='PMP-PART-ID-01' AND policy_id IN ('MOSIP-AUTH-ID-01','TF-AUTH-ID-01'); + +createTFpolicy=INSERT INTO policy_group(\ +id, "name", descr, user_id, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('TF-POLICY-ID-01', 'TF POLICY', 'DESCR TF POLICY', 'pm_testuser', true, 'pm_testuser', '2020-05-14T09:48:43.394Z', null, null, false, null); + +deleteTFpolicy=DELETE FROM policy_group WHERE "name"='TF POLICY' AND cr_by='pm_testuser'; + +createTFAuth=INSERT INTO auth_policy(\ +id, policy_group_id, "name", descr, policy_file_id, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('TF-AUTH-ID-01', 'TF-POLICY-ID-01', 'TF POLICY', 'DESCR TF POLICY', '{"authPolicies":[{"authType":"otp","authSubType":null,"mandatory":true},{"authType":"demo","authSubType":null,"mandatory":false},{"authType":"bio","authSubType":"FINGER","mandatory":false},{"authType":"bio","authSubType":"IRIS","mandatory":false},{"authType":"bio","authSubType":"FACE","mandatory":false},{"authType":"kyc","authSubType":null,"mandatory":false}],"allowedKycAttributes":[{"attributeName":"fullName","required":true},{"attributeName":"dateOfBirth","required":true},{"attributeName":"gender","required":true},{"attributeName":"phone","required":true},{"attributeName":"email","required":true},{"attributeName":"addressLine1","required":false},{"attributeName":"addressLine2","required":false},{"attributeName":"addressLine3","required":false},{"attributeName":"location1","required":false},{"attributeName":"location2","required":false},{"attributeName":"location3","required":false},{"attributeName":"postalCode","required":false},{"attributeName":"photo","required":false}]}', true, 'pm_testuser', '2020-05-14T09:48:43.394Z', null, null, false, null); + +deleteTFAuth=DELETE FROM auth_policy WHERE "name"='TF POLICY' AND cr_by='pm_testuser'; + +deleteMISP= delete from pms.misp where name='MISP_Test0002'; + +#deleteMISP= delete from pmp.misp where cr_by='pm_testuser'; + +createMISP= INSERT INTO pms.misp(\ +id,name, address, contact_no, email_id, user_id, is_active, status_code, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('MISP-FUN-ID-01','MISP_Test0002','Bangalore','9840587080','misp@telecom.com','pm_testuser','true','Active','pm_testuser','2020-06-17T05:10:51.169Z',null,null,null,null); +validateMISPLicence=INSERT INTO pms.misp_license(\ + misp_id, license_key, valid_from_date, valid_to_date, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('MISP-FUN-ID-01','r9YUOi2BvC9QVdZP5snsCeonXqdEZ9rQ0TroekqHMhX3c8mPfrtestfun','2020-09-18T06:53:18.150Z','2020-10-18T06:53:18.150Z',true,'pm_testuser','2020-09-18T06:53:18.150Z',null,null,null,null); + +#deleteValidateMISPLicence= delete from pmp.misp_license where cr_by='pm_testuser'; + +deleteValidateMISPLicence= delete from pms.misp_license where misp_id='MISP-FUN-ID-01'; + +approveMISP=UPDATE pms.misp SET status_code='approved',upd_by='pm_testuser', upd_dtimes='2019-06-19T09:48:43.394Z' WHERE id='MISP-FUN-ID-01'; + + +# updated policy management ------------------------------------------------- + +createPartnerType=INSERT INTO pms.partner_type(\ + code, partner_description, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes, is_policy_required)\ + VALUES ('Mosip Auth', 'Mosip Auth Desc', true, 'pm_testuser', CURRENT_DATE, null, null, null, null, null); + +deletePartnerType=delete from pms.partner_type where code='Mosip Auth' and cr_by='pm_testuser'; + +createPolicyGroup=INSERT INTO pms.policy_group(\ +id, "name", descr, user_id, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('POLICY-GROUP-ID-01', 'MOSIP POLICY GROUP', 'DESCR MOSIP POLICY GROUP', 'pm_testuser', true, 'pm_testuser', '2020-05-14T09:48:43.394Z', null, null, false, null); + +deletePolicyGroup=DELETE FROM pms.policy_group WHERE name='MOSIP POLICY GROUP' AND cr_by='pm_testuser'; + +deleteAuthHPolicy=delete FROM pms.auth_policy_h where name='MOSIP AUTH POLICY' and cr_by='pm_testuser'; + +createAuthPolicy=INSERT INTO pms.auth_policy(\ +id, policy_group_id, name, descr, policy_file_id, policy_type, version, policy_schema, valid_from_date, valid_to_date, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('POLICY-AUTH-ID-01','POLICY-GROUP-ID-01','MOSIP AUTH POLICY', 'DESC MOSIP AUTH POLICY', '{"authTokenType":"partner","allowedAuthTypes":[{"authType":"bio","authSubType":"FINGER","mandatory":true}],"shareableAttributes":[{"encrypted":true,"format":"string","attributeName":"string"}],"dataSharePolicies":{"typeOfShare":"string","transactionsAllowed":"string","shareDomain":"string","encryptionType":"string","validForInMinutes":"string"}}',\ +'Auth','1.0',null,'2020-09-16T02:50:33.344Z','2020-10-16T02:50:33.344Z',true,'pm_testuser','2020-09-16T02:50:33.344Z',null,null,false,null); + +deleteAuthPolicy=delete FROM pms.auth_policy where name='MOSIP AUTH POLICY' and cr_by='pm_testuser'; + +createAuthPolicyForPublishPolicy=INSERT INTO pms.auth_policy(\ +id, policy_group_id, name, descr, policy_file_id, policy_type, version, policy_schema, valid_from_date, valid_to_date, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('POLICY-AUTH-ID-01','POLICY-GROUP-ID-01','MOSIP AUTH POLICY', 'DESC MOSIP AUTH POLICY', '{"authTokenType":"partner","allowedAuthTypes":[{"authType":"bio","authSubType":"FINGER","mandatory":true}],"shareableAttributes":[{"encrypted":true,"format":"string","attributeName":"string"}],"dataSharePolicies":{"typeOfShare":"string","transactionsAllowed":"string","shareDomain":"string","encryptionType":"string","validForInMinutes":"string"}}',\ +'Auth','1.0',null,'2020-09-16T02:50:33.344Z','2020-10-16T02:50:33.344Z',false,'pm_testuser','2020-09-16T02:50:33.344Z',null,null,false,null); + + +createPartner=INSERT INTO pms.partner(\ +id, policy_group_id, name, address, contact_no, email_id, certificate_alias, user_id, partner_type_code, approval_status, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('PMS-ID-01', 'POLICY-GROUP-ID-01', 'PMS', 'INDIA', '1234567809', 'test@mosip.com', null, 'pm_testuser', 'Mosip Auth','Activated', true, 'pm_testuser','2020-05-14T09:48:43.394Z',null,null,null,null); + +#deletePartner=DELETE FROM pms.partner WHERE id='PMS-ID-01' AND cr_by='pm_testuser'; +deletePartner=DELETE FROM pms.partner WHERE name='PMS' AND cr_by='pm_testuser'; + +createPartnerApiKey=INSERT INTO pms.partner_policy(\ +policy_api_key, part_id, policy_id, valid_from_datetime, valid_to_datetime, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('API-KEY-ID-01','PMS-ID-01','POLICY-AUTH-ID-01', '2020-09-17T12:56:17.598Z','2020-10-16T02:50:33.344Z', true, 'pm_testuser', '2020-09-17T12:56:17.598Z',null,null,null,null); + +deletePartnerApiKeyData=DELETE FROM pms.partner_policy WHERE policy_api_key='API-KEY-ID-01' AND cr_by='pm_testuser'; + +submitPartnerApiKeyReq=INSERT INTO pms.partner_policy_request(\ +id, part_id, policy_id, request_datetimes, request_detail, status_code, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ +VALUES('SUB-PMP-REQ-ID-01','PMS-ID-01','POLICY-AUTH-ID-01','2020-06-01T12:36:03.897Z','Need to submit the payment','in-progress','pm_testuser','2020-06-01T12:36:03.897Z',null,null,null,null); + +deleteSubmitPartnerApiKeyReq=delete from pms.partner_policy_request where policy_id='POLICY-AUTH-ID-01' and part_id='PMS-ID-01'; + +deletePartnerContact=DELETE FROM pms.partner_contact WHERE partner_id='PMS-ID-01' AND cr_by='pm_testuser'; + +createDeviceDetail=INSERT INTO regdevice.device_detail(\ + id, dprovider_id, dtype_code, dstype_code, make, model, partner_org_name, approval_status, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('DEVICE-ID-01','PMS-ID-01', 'Finger', 'Slab', 'xyz', 'FRO90000', 'PMS', 'Pending_Approval', false, 'pm_testuser', '2020-09-28T14:17:19.411Z', null, null, false, null); + + +deleteDeviceDetail=delete from regdevice.device_detail where id='DEVICE-ID-01' and cr_by = 'pm_testuser'; + +updateDeviceDetail=UPDATE regdevice.device_detail SET approval_status='Activated', is_active=true, upd_by='pm_testuser', upd_dtimes='2020-09-29T05:59:20.268Z' WHERE id='DEVICE-ID-01'; + +createSecureBiometricInterface=INSERT INTO regdevice.secure_biometric_interface(\ + id, sw_binary_hash, sw_version, device_detail_id, sw_cr_dtimes, sw_expiry_dtimes, approval_status, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('3c0e8f2e', '[binary data]', 'MO.TD.01','DEVICE-ID-01', '2020-09-23T10:29:49.309Z', '2020-12-31T07:00:13.375Z', 'Pending_Approval', false, 'pm_testuser','2020-09-29T08:17:07.944Z', null, null, false, null); + +deleteSecureBiometricInterface=delete from regdevice.secure_biometric_interface where device_detail_id='DEVICE-ID-01' and cr_by='pm_testuser'; +deleteSecureBiometricInterfaceH=delete from regdevice.secure_biometric_interface_h where device_detail_id='DEVICE-ID-01' and cr_by='pm_testuser'; + +createSaveFtpChipDetail=INSERT INTO regdevice.ftp_chip_detail(\ + id, foundational_trust_provider_id, make, model, certificate_alias, partner_org_name, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes)\ + VALUES ('FTP-ID-01', 'PMS-ID-01', 'MAKE01', 'MODEL-01', null, 'PMS', false, 'pm_testuser', '2020-09-29T13:25:24.450Z', null, null, false, null); + +deleteSaveFtpChipDetail=delete from regdevice.ftp_chip_detail where id='FTP-ID-01' and foundational_trust_provider_id='PMS-ID-01'; diff --git a/api-test/src/main/resources/config/pmsDataDeleteQueries.txt b/api-test/src/main/resources/config/pmsDataDeleteQueries.txt new file mode 100644 index 00000000000..33b4e6f7b25 --- /dev/null +++ b/api-test/src/main/resources/config/pmsDataDeleteQueries.txt @@ -0,0 +1,28 @@ +##### DB queries to be executed to tear down the data used and generated during the test rig run + +delete from pms.partner_contact where partner_id='Tech-123' +delete from partner_policy where part_id='Tech-123' +delete from partner_policy where cr_by='partner-111997' +delete from partner_policy where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy','mosip policy9')) +delete from partner_policy_request where part_id='Tech-123' +delete from partner_policy_request where cr_by='partner-111997' +delete from pms.partner_policy where label='string' +delete from partner_policy_request where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy','mosip policy9')) +delete from partner_policy_bioextract where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy','mosip policy9')) +delete from partner_policy_bioextract where cr_by='partner-111997' +delete from partner_policy_credential_type where part_id='MOVP' +delete from pms.partner_policy_request where cr_by = 'partner-111997' +delete from pms.partner_contact where cr_by = 'partner-111997' +delete from pms.partner where cr_by = 'partner-111997' +delete from pms.partner where id in ('Tech-123','MOVP','DPP','MISP','MISP2','FTP','111997','mosipprint','partner-111997','updatepolicy') +delete from auth_policy where cr_by='partner-111997' +delete from pms.auth_policy where name in('mosip policy','mosip policy2','mosip policy3','mosip data share policy','mosip data share policy2') +delete from policy_group where cr_by='partner-111997' +delete from pms.policy_group where name in ('mosip policy group','mosip policy role testing groupp','mosip policy group2','update_policy_group','mosip policy status testing groupp with policy') +delete from pms.misp_license where cr_by='pm_testuser' +delete from pms.misp_license where misp_id in ('MISP','MISP2') +delete from pms.ftp_chip_detail where foundational_trust_provider_id='FTP' +delete from pms.misp where name='mosip_misp' +delete from pms.secure_biometric_interface where provider_id='Tech-123' +delete from pms.device_detail where id='device-id-123' +delete from pms.device_detail where make in ('abcde','abcdef') \ No newline at end of file diff --git a/api-test/src/main/resources/config/policyGroup.json b/api-test/src/main/resources/config/policyGroup.json new file mode 100644 index 00000000000..d9baab20501 --- /dev/null +++ b/api-test/src/main/resources/config/policyGroup.json @@ -0,0 +1,10 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "desc":"desc mosip auth policy group", + "name":"mosip auth policy group 2345678" + }, + "requesttime": "2022-09-07T04:23:38.117Z", + "version": "string" +} diff --git a/api-test/src/main/resources/config/prereg_SendOtp.json b/api-test/src/main/resources/config/prereg_SendOtp.json new file mode 100644 index 00000000000..142abe1273f --- /dev/null +++ b/api-test/src/main/resources/config/prereg_SendOtp.json @@ -0,0 +1,9 @@ +{ + "id": "mosip.pre-registration.login.sendotp", + "version": "1.0", + "requesttime": "$TIMESTAMP$", + "request": { + "langCode": "$PRIMARYLANG$", + "userId": "robin.hood@mailinator.com" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/prereg_ValidateOtp.json b/api-test/src/main/resources/config/prereg_ValidateOtp.json new file mode 100644 index 00000000000..93d22c9b123 --- /dev/null +++ b/api-test/src/main/resources/config/prereg_ValidateOtp.json @@ -0,0 +1,9 @@ +{ + "id": "mosip.pre-registration.login.useridotp", + "version": "1.0", + "requesttime": "$TIMESTAMP$", + "request": { + "otp": "781412", + "userId": "robin.hood@mailinator.com" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/registrationProcessorAPI.properties b/api-test/src/main/resources/config/registrationProcessorAPI.properties new file mode 100644 index 00000000000..9d419ce7d00 --- /dev/null +++ b/api-test/src/main/resources/config/registrationProcessorAPI.properties @@ -0,0 +1,27 @@ +=======API URLs====================================================================== + +syncListApi=/registrationprocessor/v1/registrationstatus/sync +packetReceiverApi=/registrationprocessor/v1/packetreceiver/registrationpackets +packetStatusApi=/registrationprocessor/v1/registrationstatus/search +packetGeneratorApi=/registrationprocessor/v1/requesthandler/packetgenerator +assignmentApi =/registrationprocessor/v1/manualverification/assignment +decisionApi = /registrationprocessor/v1/manualverification/decision +applicantDemograhicApi = /registrationprocessor/v1/manualverification/applicantDemographic +applicantBiometricApi = /registrationprocessor/v1/manualverification/applicantBiometric +packetInfoApi = /registrationprocessor/v1/manualverification/packetInfo +idRepoByRid = /idrepository/v1/identity/idvid/ +reprintingApi = /registrationprocessor/v1/requesthandler/reprint +adminRequirementApi = /registrationprocessor/v1/registrationtransaction/search/{langcode}/{rid} +packetManagerAuditsApi = /commons/v1/packetmanager/audits +packetManagerBiometricsApi = /commons/v1/packetmanager/biometrics +packetManagerSearchApi = /commons/v1/packetmanager/searchField +packetManagerValidatePacketApi = /commons/v1/packetmanager/validatePacket +packetManagerSearchFieldsApi = /commons/v1/packetmanager/searchFields +packetManagerDocumentApi = /commons/v1/packetmanager/document +packetManagerMetaInfoApi = /commons/v1/packetmanager/metaInfo +====================HDFS Connection======================================================= +nameNodeUrl = hdfs://13.71.115.204:51000 +kdcDomain = NODE-MASTER.SOUTHINDIA.CLOUDAPP.AZURE.COM +userName = qa-regprocessor +userPass = Mosip@dev123 +isAuthEnable = false diff --git a/api-test/src/main/resources/config/resident.properties b/api-test/src/main/resources/config/resident.properties new file mode 100644 index 00000000000..b43610f8f27 --- /dev/null +++ b/api-test/src/main/resources/config/resident.properties @@ -0,0 +1,86 @@ +#---------------------------------- End point(s) relative URLs ----------------------------------# +actuatorEndpoint=/resident/v1/actuator/env +audit_db_schema=audit + +#---------------------------------- Modifiable Properties ----------------------------------------------------------# + +eSignetbaseurl= + +#------------------------ Environment URLs and Database Connections ------------------------# + +# Keycloak URL. +keycloak-external-url = https://iam.qa-java21.mosip.net + +# PostgreSQL URLs for audit and partner databases. +audit_url = jdbc:postgresql://qa-java21.mosip.net:5432/mosip_audit +partner_url = jdbc:postgresql://qa-java21.mosip.net:5432/mosip_ida + +# Database server for connections. +db-server = qa-java21.mosip.net +db-port = 5432 + + +#------------------------ secrets and passwords ------------------------# + +#------------------------ Keycloak Passwords ------------------------# +# Used for Keycloak authentication. +keycloak_Password = + +#------------------------ PostgreSQL Database Passwords ------------------------# +# Credentials for connecting to Postgres databases. +audit_password = +partner_password = +postgres-password = + +#-------- Client Secret Keys ----------# +# These keys are used for various services, make sure to update the values as required when running locally. + +mosip_partner_client_secret = +mosip_pms_client_secret = +mosip_resident_client_secret = +mosip_idrepo_client_secret = +mosip_reg_client_secret = +mosip_admin_client_secret = +mosip_hotlist_client_secret = +mosip_regproc_client_secret = +mpartner_default_mobile_secret = +mosip_testrig_client_secret = +AuthClientSecret = +mosip_crvs1_client_secret = + + +#-------- Generic Configuration ----------# + +# Enable or disable debugging mode (yes/no). +enableDebug = no + +# Whether to use pre-configured OTP (true/false). +usePreConfiguredOtp = false + +# Mock Notification Channels (email/phone/email,phone). +mockNotificationChannel = email,phone + + +#------------------------ Mosip Components Base URLs ------------------------# +# Define base URLs for different components if required. +# Example: +# mosip_components_base_urls = auditmanager=api-internal.released.mosip.net;idrepository=api-internal.released.mosip.net;authmanager=api-internal.released.mosip.net;resident=api-internal.released.mosip.net;partnermanager=api-internal.released.mosip.net;idauthentication=api-internal.released.mosip.net;masterdata=api-internal.released.mosip.net;idgenerator=api-internal.released.mosip.net;policymanager=api-internal.released.mosip.net;preregistration=api-internal.released.mosip.net;keymanager=api-internal.released.mosip.net;mock-identity-system=api.released.mosip.net +# Feel free to add more components as needed. +mosip_components_base_urls = + +#------------------------ Module Name Pattern ------------------------# +# Define module name pattern if required. +# Example: +# moduleNamePattern = (mimoto|resident) +# Feel free to add more values as needed. +moduleNamePattern = + + +#------------------------ Uncomment for Local Run ------------------------# + +# Path to the authentication certificates (if running locally, uncomment the below line and keep the value empty). +# authCertsPath = + +# X-XSS-Protection: Controls the XSS (Cross-Site Scripting) filter in browsers. +# Values: (yes/no) +xssProtectionCheck = no \ No newline at end of file diff --git a/api-test/src/main/resources/config/residentServicesQueries.properties b/api-test/src/main/resources/config/residentServicesQueries.properties new file mode 100644 index 00000000000..22381deb9b4 --- /dev/null +++ b/api-test/src/main/resources/config/residentServicesQueries.properties @@ -0,0 +1,15 @@ +createPackets=INSERT INTO regprc.registration( \ + id, reg_type, ref_reg_id, applicant_type, status_code, lang_code, status_comment, latest_trn_id, trn_retry_count, pkt_cr_dtimes, is_active, cr_by, cr_dtimes, upd_by, upd_dtimes, is_deleted, del_dtimes, latest_trn_type_code, latest_trn_status_code, latest_trn_dtimes, reg_process_retry_count, reg_stage_name) \ + VALUES ('10008100670005520200114101900','NEW',null,null,'PROCESSED','eng','OK','cddfbcae-7d72-4c3c-b42c-c000e89c3510',0,null, true, 'MOSIP_SYSTEM',' 2020-01-14 10:20:15.542','MOSIP_SYSTEM','2020-01-15 12:18:08.773',false,null,'PACKET_REPROCESS','SUCCESS','2020-01-15 12:18:08.773',14,'PacketUploaderStage'), \ + ('10008100670005520200114101901','NEW',null,null,'PROCESSING','eng','OK','cddfbcae-7d72-4c3c-b42c-c000e89c3510',0,null, true, 'MOSIP_SYSTEM',' 2020-01-14 10:20:15.542','MOSIP_SYSTEM','2020-01-15 12:18:08.773',false,null,'PACKET_REPROCESS','SUCCESS','2020-01-15 12:18:08.773',14,'PacketUploaderStage'), \ + ('10008100670005520200114101902','NEW',null,null,'REJECTED','eng','OK','cddfbcae-7d72-4c3c-b42c-c000e89c3510',0,null, true, 'MOSIP_SYSTEM',' 2020-01-14 10:20:15.542','MOSIP_SYSTEM','2020-01-15 12:18:08.773',false,null,'PACKET_REPROCESS','SUCCESS','2020-01-15 12:18:08.773',14,'PacketUploaderStage'), \ + ('10008100670005520200114101903','NEW',null,null,'RESEND','eng','OK','cddfbcae-7d72-4c3c-b42c-c000e89c3510',0,null, true, 'MOSIP_SYSTEM',' 2020-01-14 10:20:15.542','MOSIP_SYSTEM','2020-01-15 12:18:08.773',false,null,'PACKET_REPROCESS','SUCCESS','2020-01-15 12:18:08.773',14,'PacketUploaderStage'), \ + ('10008100670005520200114101904','NEW',null,null,'REREGISTER','eng','OK','cddfbcae-7d72-4c3c-b42c-c000e89c3510',0,null, true, 'MOSIP_SYSTEM',' 2020-01-14 10:20:15.542','MOSIP_SYSTEM','2020-01-15 12:18:08.773',false,null,'PACKET_REPROCESS','SUCCESS','2020-01-15 12:18:08.773',14,'PacketUploaderStage'); + + + + +deletePacketRecord=DELETE FROM regprc.registration WHERE id in ('10008100670005520200114101900','10008100670005520200114101901','10008100670005520200114101902','10008100670005520200114101903','10008100670005520200114101904'); + + + \ No newline at end of file diff --git a/api-test/src/main/resources/config/sign.json b/api-test/src/main/resources/config/sign.json new file mode 100644 index 00000000000..a54fd504033 --- /dev/null +++ b/api-test/src/main/resources/config/sign.json @@ -0,0 +1,14 @@ +{ + "id": "string", + "metadata": {}, + "request": { + "applicationId": "IDA", + "dataToSign": "$DATA$", + "includeCertHash": true, + "includeCertificate": true, + "includePayload": false, + "referenceId": "SIGN" + }, + "requesttime": "2021-01-07T05:32:31.722Z", + "version": "string" +} \ No newline at end of file diff --git a/api-test/src/main/resources/config/test.properties b/api-test/src/main/resources/config/test.properties new file mode 100644 index 00000000000..6eb1e1e3aa4 --- /dev/null +++ b/api-test/src/main/resources/config/test.properties @@ -0,0 +1,16 @@ +# ------------------------------------------------------------------------------------------- +# Properties File that will define all of the test configurations for core systems edge API +# test automation. This also includes all JIRA integrations for automatic defect tracking. +# + +# ------------------------------------------------------------------------------------------- + +# ------------------------------------------------------------------------------------------- +# URIs, URLs, & Environment Configurations +# ------------------------------------------------------------------------------------------- +#testEnvironment=https://integ.mosip.io +#testEnvironmentPreReg=https://integ.mosip.io +environment=qa +testEnvironment=https://integ.mosip.io +testEnvironmentPreReg=https://integ.mosip.io + diff --git a/api-test/src/main/resources/config/tokenGeneration.properties b/api-test/src/main/resources/config/tokenGeneration.properties new file mode 100644 index 00000000000..a7ec811fe21 --- /dev/null +++ b/api-test/src/main/resources/config/tokenGeneration.properties @@ -0,0 +1,7 @@ +token.request.id=mosip.io.userId.pwd +token.request.appid=regproc +token.request.username=110006 +token.request.password=mosip +token.request.version=1.0 +token.request.clientId=mosip-regproc-client +token.request.secretKey=abc123 \ No newline at end of file diff --git a/api-test/src/main/resources/config/updatePacketProperties.properties b/api-test/src/main/resources/config/updatePacketProperties.properties new file mode 100644 index 00000000000..4793444018c --- /dev/null +++ b/api-test/src/main/resources/config/updatePacketProperties.properties @@ -0,0 +1,7 @@ +bio&fullName = mona +fullName = abc +addressLine1 = xyz +phone = 1234567890 +email = abc@gmail.com +dateOfBirth = 1983/01/01 +UINInvalid = 1234567 \ No newline at end of file diff --git a/api-test/src/main/resources/config/valueMapping.properties b/api-test/src/main/resources/config/valueMapping.properties new file mode 100644 index 00000000000..c9b1c8ebb6e --- /dev/null +++ b/api-test/src/main/resources/config/valueMapping.properties @@ -0,0 +1,35 @@ +# common properties +residenceStatus=NFR +fullName=TEST_FULLNAME +firstName=TEST_FIRSTNAME +dateOfBirth=1996/01/01 +gender=MLE +pobCountry=POB_COUNTRY +pobProvince=POB_PROVINCE +pobCity=POB_CITY +bloodType=BLOOD_TYPE +permanentCountry=PERMANENT_COUNTRY +permanentAddressLine1=PERMANENT_ADDRESS_LINE_1 +presentAddressLine1=PRESENT_ADDRESS_LINE_1 +modeOfClaim=MODE_OF_CLAIM +presentCountry=PRESENT_COUNTRY +addressLine1=TEST_ADDRESSLINE1 +addressLine2=TEST_ADDRESSLINE2 +addressLine3=TEST_ADDRESSLINE3 +postalCode=14022 +phone=8249742850 +email=test@mosip.net +region=TEST_REGION +fullName1=Lisa.GN +firstName1=Lisa.GN +province=TEST_PROVINCE +city=TEST_CITY +zone=TEST_ZONE +introducerName=TEST_INTRODUCERNAME +bloodGroup=O +Miss-TitleFromServer=MIS +Mr-TitleFromServer=MIR +Mrs-TitleFromServer=MRS +Miss-TitleFromServer.=MIS +addressCopy=TEST_ADDRESSLINE3 +proofOfAddress=TEST_ADDRESSLINE2 \ No newline at end of file diff --git a/api-test/src/main/resources/customize-emailable-report-template.html b/api-test/src/main/resources/customize-emailable-report-template.html new file mode 100644 index 00000000000..cfeca4d6e18 --- /dev/null +++ b/api-test/src/main/resources/customize-emailable-report-template.html @@ -0,0 +1,61 @@ + + + + + + + + + +
+ mosip-logo +
+ + \ No newline at end of file diff --git a/api-test/src/main/resources/dbFiles/.xml b/api-test/src/main/resources/dbFiles/.xml new file mode 100644 index 00000000000..ae236dcffbd --- /dev/null +++ b/api-test/src/main/resources/dbFiles/.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-test/src/main/resources/dbFiles/PMS_delete_script.txt b/api-test/src/main/resources/dbFiles/PMS_delete_script.txt new file mode 100644 index 00000000000..a0100b9d415 --- /dev/null +++ b/api-test/src/main/resources/dbFiles/PMS_delete_script.txt @@ -0,0 +1,28 @@ +delete from pms.partner_contact where partner_id='Tech-123'; +delete from partner_policy where part_id='Tech-123'; +delete from partner_policy where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy')); +delete from partner_policy_request where part_id='Tech-123'; +delete from pms.partner_policy where label='string'; +delete from partner_policy_request where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy')); +delete from partner_policy_bioextract where policy_id in (select id from auth_policy where name in ('mosip policy','mosip data share policy')); +delete from partner_policy_credential_type where part_id='MOVP'; +delete from pms.partner where id in ('Tech-123','MOVP','DPP','MISP','MISP2','FTP','111997','updatepolicy'); +delete from pms.auth_policy where name in('mosip policy','mosip policy2','mosip policy3','mosip data share policy','mosip data share policy2'); +delete from pms.policy_group where name in ('mosip policy group','mosip policy group2','update_policy_group'); +delete from pms.misp_license where cr_by='pm_testuser'; +delete from pms.misp_license where misp_id in ('MISP','MISP2'); +delete from pms.ftp_chip_detail where foundational_trust_provider_id='FTP'; +delete from pms.misp where name='mosip_misp'; +delete from pms.secure_biometric_interface where provider_id='Tech-123'; +delete from pms.device_detail where id='device-id-123'; +delete from pms.device_detail where make in ('abcde','abcdef'); +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=mosiptest.org,O=MOSIPTEST,L=Bangalore,ST=Karantaka,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=Techno.com,O=Techno,L=Bangalore,ST=Karnataka,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=Techno,O=Techno,L=Bangalore,ST=Karnataka,C=IN'; +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=apitest,OU=apitest,O=apitest,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.ca_cert_store where cert_subject ='CN=apitest2,OU=apitest2,O=apitest2,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=deviceprovider,OU=deviceprovider,O=deviceprovider,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=movp,OU=movp,O=movp,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=ftp,OU=ftp,O=ftp,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=misp,OU=misp,O=misp,L=BLR,ST=KAR,C=IN'; +delete from mosip_keymgr.keymgr.partner_cert_store where cert_subject ='CN=misp2,OU=misp2,O=misp2,L=BLR,ST=KAR,C=IN'; \ No newline at end of file diff --git a/api-test/src/main/resources/dbFiles/dbConfig.xml b/api-test/src/main/resources/dbFiles/dbConfig.xml new file mode 100644 index 00000000000..e27fb8f563a --- /dev/null +++ b/api-test/src/main/resources/dbFiles/dbConfig.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-test/src/main/resources/dbFiles/delete_Masterdata.sql b/api-test/src/main/resources/dbFiles/delete_Masterdata.sql new file mode 100644 index 00000000000..8724f6b2e58 --- /dev/null +++ b/api-test/src/main/resources/dbFiles/delete_Masterdata.sql @@ -0,0 +1,88 @@ +delete from master.blocklisted_words where cr_by='dumbo6'; +delete from master.blocklisted_words where word='dumbooo'; +delete from master.blocklisted_words where cr_by='masterdata-220005'; +delete from master.machine_master where cr_by='masterdata-220005'; +delete from master.machine_master where cr_by='masterdata-220005'; +delete from master.machine_master where name in ('Mach-Test','Mach-Test2','Mach-Test updated'); +delete from master.machine_master mm WHERE mm.mspec_id IN(SELECT ms.id from master.machine_spec ms where ms.cr_by='masterdata-220005'); +delete FROM master.machine_spec WHERE mtyp_code IN (SELECT code FROM master.machine_type WHERE cr_by = 'masterdata-220005'); +delete from master.machine_spec where cr_by='masterdata-220005'; +delete from master.machine_type where cr_by='masterdata-220005'; +delete from master.gender where cr_by='masterdata-220005'; +delete from master.device_master where upd_by='masterdata-220005'; +delete from master.device_master where cr_by='masterdata-220005'; +delete from master.device_master where name='testDevicedummy'; +DELETE FROM master.device_master WHERE dspec_id IN(SELECT id FROM master.device_spec WHERE cr_by='masterdata-220005'); +delete from master.device_spec where cr_by='masterdata-220005'; +delete from master.device_type where cr_by='masterdata-220005'; +delete from master.loc_holiday where cr_by='masterdata-220005'; +delete from master.reg_center_type where cr_by='masterdata-220005'; +delete from master.registration_center where cr_by='masterdata-220005'; +delete from master.loc_holiday where cr_by='masterdata-220005'; +delete from master.reg_center_type where cr_by='masterdata-220005'; +delete from master.registration_center where cr_by='masterdata-220005'; +delete from master.device_type where cr_by='masterdata-220005'; +delete from master.doc_type where cr_by='masterdata-220005'; +delete from master.doc_category where cr_by='masterdata-220005'; +delete from master.location where cr_by='masterdata-220005'; +delete from master.template where cr_by='masterdata-220005'; +update master.template set is_active='true', is_deleted='false' where id='1101'; +delete from master.template where template_typ_code IN(select code from master.template_type where code='Test-info-Template-auto'); +delete from master.template_type where code='Test-info-Template-auto'; +update master.location set is_active='true', is_deleted='false' where code='10114'; +delete from master.location where code in('TST123','IND'); +delete from master.valid_document where cr_by='masterdata-220005'; +delete from master.user_detail where cr_by='masterdata-220005'; +delete from master.template_type where cr_by='masterdata-220005'; +delete from master.template_file_format where cr_by='masterdata-220005'; +delete from master.reason_list where cr_by='masterdata-220005'; +delete from master.reason_category where cr_by='masterdata-220005'; +delete from master.language where cr_by='masterdata-220005'; +delete from master.identity_schema where cr_by='masterdata-220005'; +delete from master.biometric_attribute where cr_by='masterdata-220005'; +delete from master.biometric_type where cr_by='masterdata-220005'; +delete from master.appl_form_type where cr_by='masterdata-220005'; +delete from master.id_type where cr_by='masterdata-220005'; +delete from master.dynamic_field where cr_by='masterdata-220005'; +delete from master.zone_user where usr_id='masterdata-220005'; +delete from master.blocklisted_words where word='dumbo6'; +delete from master.blocklisted_words where word='dumbo7'; +delete from master.machine_master where name in ('Mach-Test','Mach-Test2','Mach-Test updated'); +delete from master.machine_master where mac_address = '61-D3-FD-12-C9-ED'; +delete from master.machine_spec where name='HP'; +delete from master.machine_master where cr_by='masterdata-220005'; +delete from master.machine_type where code='Laptop2'; +delete from master.gender where code='Genderdummy'; +delete FROM master.device_master where name in ('testDevicedummy','testDevicedummy updated'); +delete from master.device_master where dspec_id='743'; +delete from master.device_spec where id='743'; +delete from master.device_type where code='GST3'; +delete from master.loc_holiday where holiday_name='AutoTest user Eng'; +delete from master.reg_center_type where code='ALT-3'; +delete FROM master.registration_center where name in ('Test123','HSR Center updated'); +delete from master.loc_holiday where holiday_name in ('AutoTest user Eng','AutoTest user'); +delete from master.reg_center_type where code in('ALT-3','ALT-5'); +delete from master.registration_center where id='10000'; +delete from master.device_type where code in ('GST3','GST4'); +delete from master.doc_type where code in ('TestDocType0010','TestDocType0020'); +delete from master.doc_category where code in ('DocTestCode123','DocTestCode321'); +delete from master.location where code='TST12'; +delete from master.template where id='445566777'; +delete from master.template where template_typ_code IN(select code from master.template_type where code='Test-info-Template-auto'); +update master.template set is_active='true', is_deleted='false' where id='1101'; +delete from master.template_type where code='Test-info-Template-auto'; +update master.location set is_active='true', is_deleted='false' where code='10114'; +delete from master.location where code in('TST123','IND'); +delete from master.valid_document where doctyp_Code='doc_auto_test'; +delete from master.user_detail where cr_by='110005'; +delete from master.template_type where code='Test-info-Template-auto'; +delete from master.template_file_format where code='Doc'; +delete from master.reason_list where code='TEST_LIST_CODE'; +delete from master.reason_category where code='TEST_CAT_CODE'; +delete from master.language where code='automationLang'; +delete from master.identity_schema where title='test-schema'; +delete from master.biometric_attribute where code='TST'; +delete from master.biometric_type where code='dumbo6'; +delete from master.appl_form_type where code='dumbo'; +delete from master.id_type where code='NEW'; +delete from master.dynamic_field where name in ('TestAutomationField','TestAPL'); diff --git a/api-test/src/main/resources/krb5.conf b/api-test/src/main/resources/krb5.conf new file mode 100644 index 00000000000..734dbfcf887 --- /dev/null +++ b/api-test/src/main/resources/krb5.conf @@ -0,0 +1,29 @@ +# Configuration snippets may be placed in this directory as well +includedir /etc/krb5.conf.d/ + +[logging] + default = FILE:/var/log/krb5libs.log + kdc = FILE:/var/log/krb5kdc.log + admin_server = FILE:/var/log/kadmind.log + +[libdefaults] + kdc_timeout = 30s + udp_preference_limit = 1 + dns_lookup_realm = false + ticket_lifetime = 365d + renew_lifetime = 365d + forwardable = true + rdns = false + pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt + default_realm = NODE-MASTER.SOUTHINDIA.CLOUDAPP.AZURE.COM + #default_ccache_name = KEYRING:persistent:%{uid} + +[realms] + NODE-MASTER.SOUTHINDIA.CLOUDAPP.AZURE.COM = { + kdc = node-master.southindia.cloudapp.azure.com:51088 + admin_server = node-master.southindia.cloudapp.azure.com +} + +[domain_realm] + .node-master.southindia.cloudapp.azure.com = NODE-MASTER.SOUTHINDIA.CLOUDAPP.AZURE.COM + node-master.southindia.cloudapp.azure.com = NODE-MASTER.SOUTHINDIA.CLOUDAPP.AZURE.COM \ No newline at end of file diff --git a/api-test/src/main/resources/log4j.properties b/api-test/src/main/resources/log4j.properties new file mode 100644 index 00000000000..93001dc6826 --- /dev/null +++ b/api-test/src/main/resources/log4j.properties @@ -0,0 +1,8 @@ +log4j.rootLogger=INFO, Appender1,Appender2 +log4j.appender.Appender1=org.apache.log4j.ConsoleAppender +log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout +log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n +log4j.appender.Appender2=org.apache.log4j.FileAppender +log4j.appender.Appender2.File=src/logs/mosip-api-test.log +log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout +log4j.appender.Appender2.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n diff --git a/api-test/src/main/resources/metadata.xml b/api-test/src/main/resources/metadata.xml new file mode 100644 index 00000000000..ea66c92e66e --- /dev/null +++ b/api-test/src/main/resources/metadata.xml @@ -0,0 +1,16 @@ + + 4.0.0 + io.mosip.testrig.apirig.automationtests + automationtests + jar + io.mosip.testrig.apirig.automationtests + http://maven.apache.org + + + io.mosip + mosip-parent + 1.0.10 + + + diff --git a/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.hbs b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.hbs new file mode 100644 index 00000000000..0585378b334 --- /dev/null +++ b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.hbs @@ -0,0 +1,4 @@ +{ + "languageCode": "{{languageCode}}", + "eventId": "{{eventId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.yml b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.yml new file mode 100644 index 00000000000..e4b301cc29b --- /dev/null +++ b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementController.yml @@ -0,0 +1,256 @@ +GetAcknowledgementController: + Resident_GetAuthorizationtoken_uin_Valid_Smoke: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_01 + description: The resident is trying to get an authorization token by using a valid UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_Valid_Smoke: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_02 + description: The resident is trying to get an authorization token by using a valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_Invalid_languageCode_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_03 + description: Resident is trying to get an authorization token by using valid UIN with an invalid language code + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "ar$!22", + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_Invalid_eventId_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_04 + description: Resident is trying to get an authorization token by using valid UIN with an invalid eventId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$df44" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_Empty_languageCode_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_05 + description: Resident is trying to get an authorization token by using valid UIN with an empty language code + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "", + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_spaceVal_languagecode_Neg: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_06 + description: Resident is trying to get an authorization token by using valid UIN with a space value for the language code + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": " ", + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_SpaceVal_enentId_Neg: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_07 + description: Resident is trying to get an authorization token by using valid UIN with a space value for the eventId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": " " +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_Empty_eventId_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_08 + description: Resident is trying to get an authorization token by using valid UIN with an empty eventId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "$1STLANG$", + "eventId": "" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_uin_Invalid_Role_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_09 + description: Resident is trying to get an authorization token by using valid UIN with an invalid role + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_Invalid_languageCode_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_10 + description: Resident is trying to get an authorization token by using valid VID with an invalid language code + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "ar$!22", + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_Invalid_eventId_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_11 + description: Resident is trying to get an authorization token by using valid VID with an invalid eventId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$df44" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_Empty_languageCode_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_12 + description: Resident is trying to get an authorization token by using valid VID with an empty language code + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "", + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_Empty_eventId_Negative: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_13 + description: Resident is trying to get an authorization token by using valid VID with an empty eventId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/error + input: '{ + "languageCode": "$1STLANG$", + "eventId": "" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_SpaceVal_languageCode_Neg: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_14 + description: Resident is trying to get an authorization token by using valid VID with a space value for the language code + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": " ", + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_vid_SpaceVal_eventId_Neg: + endPoint: /resident/v1/ack/download/pdf/event/{eventId}/language/{languageCode} + uniqueIdentifier: TC_Resident_GetAuthorizationtoken_15 + description: Resident is trying to get an authorization token by using valid VID with a space value for the eventId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": " " +}' + output: '{ + +}' + diff --git a/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementControllerResult.hbs b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementControllerResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AcknowledgementController/AcknowledgementControllerResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AddIdentity/AddIdentity.yml b/api-test/src/main/resources/resident/AddIdentity/AddIdentity.yml new file mode 100644 index 00000000000..3198516e99f --- /dev/null +++ b/api-test/src/main/resources/resident/AddIdentity/AddIdentity.yml @@ -0,0 +1,929 @@ +AddIdentity: + Resident_AddIdentity_withValidParameters_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_01 + description: Add identity with valid parameters + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_withValidParameters_maximum_email_character_smoke_Pos11111111111111: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_02 + description: Add identity with the maximum email characters and valid parameters + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_maximum_email_character_smoke_Pos11111111111111@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_ValidParam_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_03 + description: Add identity with valid parameters + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ValidParam_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_04 + description: Add identity in a positive manner + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_PEXP_smoke: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_05 + description: Add identity in a positive manner to expire the Perpetual VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_PEXP_smoke@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_PDEA_smoke: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_06 + description: Add the identity in a positive manner to deactivate the perpetual VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_PDEA_smoke@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_TDEA_smoke: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_07 + description: Add the identity in a positive manner to deactivate the Temporary VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_TDEA_smoke@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_PRE_smoke: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_08 + description: Add the identity in a positive manner to reactivate the perpetual VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_PRE_smoke@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + Resident_AddIdentity_Positive_TRE_smoke: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_09 + description: Add the identity in a positive manner to reactivate the temporary VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Positive_TRE_smoke@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_Valid_Params_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_10 + description: Add identity using valid parameters + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "IDSchemaVersion": "$SCHEMAVERSION$", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Valid_Params_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_Valid_Params_AddUser_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_11 + description: Add identity using valid parameters ensuring that the user is successfully added + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "IDSchemaVersion": "$SCHEMAVERSION$", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Valid_Params_AddUser_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ValidParameters_ChannelVerify_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_12 + description: Adding new identity using valid parameters and verifies the channel + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "IDSchemaVersion": "$SCHEMAVERSION$", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ValidParameters_ChannelVerify_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ValidParams_For_Revoke_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_13 + description: Add identity using valid parameters for revoke VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ValidParams_For_Revoke_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_Esignet_Integ_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_14 + description: Integrate Esignet functionality while adding a new identity + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Esignet_Integ_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_Esignet_Integ_Vid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_15 + description: Integrate VID within Esignet functionality while adding a new identity + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Esignet_Integ_Vid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_GetRid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_16 + description: Add identity in a positive manner while retrieving RID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_GetRid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_UpdateCount_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_17 + description: Add identity in a positive manner while updating count + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_UpdateCount_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ForEotp_Scen_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_18 + description: Add identity in a positive manner for expired OTP functionality + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ForEotp_Scen_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ForEotp_Scen_Vid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_19 + description: Add identity with VID positively for the expired OTP functionality + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ForEotp_Scen_Vid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ForEotp_Temp_Vid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_20 + description: Add identity with temporary VID in a positive manner the expired OTP functionality + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ForEotp_Temp_Vid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_ForEotp_Onetime_Vid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_21 + description: Add identity with onetime VID in a positive manner the expired OTP functionality + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_ForEotp_Onetime_Vid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_OrdrSts_Valid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_22 + description: Add identity in a positive manner with valid order status + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_OrdrSts_Valid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_Invalid_Scen_Vid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_23 + description: Add identity with an invalid scenario and VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_Invalid_Scen_Vid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withInValid_DOB_Neg: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_24 + description: Add identity with an invalid DOB + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/error + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "15/04/1998", + "postalCode": "14022", + "email": "Resident_AddIdentity_withInValid_DOB_Neg@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "errors": [ + { + "errorCode": "IDR-IDC-002" + } + ] +}' + + Resident_AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_25 + description: Adding identity with valid parameters to generate a VID under the Six scenario + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_26 + description: Add identity with valid parameters in a positive manner to create perpetual VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_27 + description: Add identity with valid parameters in a positive manner to create three perpetual VID + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withValidParameters_To_Genrate_TempVid_Use_3_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_28 + description: Add identity with valid parameters to generate a temporary VID using the Use 3 method + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_To_Genrate_TempVid_Use_3_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withValidParameters_For_SendOtp_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_29 + description: Add identity with valid parameters to send OTP + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_For_SendOtp_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' + + Resident_AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos: + endPoint: /idrepository/v1/identity/ + uniqueIdentifier: Dependent_Idrepo_AddIdentity_30 + description: Add identity with valid parameters to check ten transactions + role: testrig + restMethod: post + inputTemplate: resident/AddIdentity/addIdentity_$LANGNUMBER$ + outputTemplate: resident/AddIdentity/addIdentityResult + input: '{ + "value": "$BIOVALUE$", + "id": "mosip.id.create", + "registrationId": "$RID$", + "addressCopy": "Y", + "biometricReferenceId": "23452353", + "UIN": "$UIN$", + "dateOfBirth": "1992/04/15", + "postalCode": "14022", + "email": "Resident_AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos@mosip.net", + "phone": "9876543210", + "mobileno": "9876543210", + "referenceIdentityNumber": "6789545678878", + "version": "v1", + "introducerRID": "212124324784879", + "introducerUIN": "212124324784879", + "category": "individualBiometrics", + "requesttime": "$TIMESTAMP$" +}' + output: '{ + "status":"ACTIVATED" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AddIdentity/addIdentityResult.hbs b/api-test/src/main/resources/resident/AddIdentity/addIdentityResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/AddIdentity/addIdentityResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLog/AuditLog.yml b/api-test/src/main/resources/resident/AuditLog/AuditLog.yml new file mode 100644 index 00000000000..c4d969cbe08 --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLog/AuditLog.yml @@ -0,0 +1,60 @@ +AuditLog: + Resident_AuditLog_StatusCode_uin_all_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/audit/log + uniqueIdentifier: TC_Resident_AuditLog_01 + description: Audit log correctly returns the status codes for all operations performed on a resident when a valid UIN is provided + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuditLog/createAuditLog + outputTemplate: resident/AuditLog/createAuditLogResult + input: '{ + "auditEventId": "RES-SER-191", + "auditEventName": "get vids", + "auditEventType": "SYSTEM", + "actionTimeStamp": "$TIMESTAMP$", + "hostName": "resident-6f6fb6c845-6frw4", + "hostIp": "10.42.2.150", + "applicationId": "10011", + "applicationName": "Resident portal", + "sessionUserId": "resident-111995", + "sessionUserName": "resident-111995", + "id": "NO_ID", + "idType": "NO_ID_TYPE", + "createdBy": "resident-111995", + "moduleName": "Residence service", + "moduleId": "RES-SER", + "description": "get vids" +}' + output: "200" + + Resident_AuditLog_StatusCode_vid_all_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/audit/log + uniqueIdentifier: TC_Resident_AuditLog_02 + description: Audit log correctly returns the status codes for all operations performed on a resident when a valid VID is provided + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuditLog/createAuditLog + outputTemplate: resident/AuditLog/createAuditLogResult + input: '{ + "auditEventId": "RES-SER-191", + "auditEventName": "get vids", + "auditEventType": "SYSTEM", + "actionTimeStamp": "$TIMESTAMP$", + "hostName": "resident-6f6fb6c845-6frw4", + "hostIp": "10.42.2.150", + "applicationId": "10011", + "applicationName": "Resident portal", + "sessionUserId": "resident-111995", + "sessionUserName": "resident-111995", + "id": "NO_ID", + "idType": "NO_ID_TYPE", + "createdBy": "resident-111995", + "moduleName": "Residence service", + "moduleId": "RES-SER", + "description": "get vids" +}' + output: "200" + + \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLog/createAuditLog.hbs b/api-test/src/main/resources/resident/AuditLog/createAuditLog.hbs new file mode 100644 index 00000000000..b1f351b2037 --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLog/createAuditLog.hbs @@ -0,0 +1,18 @@ +{ + "auditEventId": "{{auditEventId}}", + "auditEventName": "{{auditEventName}}", + "auditEventType": "{{auditEventType}}", + "actionTimeStamp": "{{actionTimeStamp}}", + "hostName": "{{hostName}}", + "hostIp": "{{hostIp}}", + "applicationId": "{{applicationId}}", + "applicationName": "{{applicationName}}", + "sessionUserId": "{{sessionUserId}}", + "sessionUserName": "{{sessionUserName}}", + "id": "{{id}}", + "idType": "{{idType}}", + "createdBy": "{{createdBy}}", + "moduleName": "{{moduleName}}", + "moduleId": "{{moduleId}}", + "description": "{{description}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLog/createAuditLogResult.hbs b/api-test/src/main/resources/resident/AuditLog/createAuditLogResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLog/createAuditLogResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.hbs b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.yml b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.yml new file mode 100644 index 00000000000..96c5c9a8913 --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidation.yml @@ -0,0 +1,13 @@ +AuditLogValidation: + Resident_AuditLogValidation_All_Valid_Smoke: + endPoint: SELECT COUNT(*) FROM audit.app_audit_log + uniqueIdentifier: TC_Resident_AuditLogValidation_01 + description: Get the AuditLogs details from database + role: audit + restMethod: post + inputTemplate: resident/AuditLogValidation/AuditLogValidation + outputTemplate: resident/AuditLogValidation/AuditLogValidationResult + input: '{ +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidationResult.hbs b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidationResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuditLogValidation/AuditLogValidationResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthHistory/AuthHistory.yml b/api-test/src/main/resources/resident/AuthHistory/AuthHistory.yml new file mode 100644 index 00000000000..e5d099ef0ad --- /dev/null +++ b/api-test/src/main/resources/resident/AuthHistory/AuthHistory.yml @@ -0,0 +1,607 @@ +AuthHistory: + Resident_AuthHistory_With_UIN_smoke_Pos: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_01 + description: Retrieve authentication history based on residents UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/AuthHistory/authHistoryResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_With_VID_smoke_Pos: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_02 + description: Retrieve authentication history based on residents VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/AuthHistory/authHistoryResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_InValid_UIN_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_03 + description: Retrieve the authentication history using invalid UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$RE7654f", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_missing_UIN_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_04 + description: Retrieve the authentication history by missing UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthHistory_Missing_OTP_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_05 + description: Retrieve the authentication history by missing OTP parameter + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$REMOVE$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_TransactionMismatch_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_06 + description: Retrieve the authentication history by transaction mismatch + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "1234890", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_Invalid_Id_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_07 + description: Retrieve the authentication history using an invalid ID parameter + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mos@@3345istory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_Missing_Id_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_08 + description: Retrieve the authentication history using missing ID parameter + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_InValid_version_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_09 + description: Retrieve the authentication history using invalid version parameter + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v@@@@@@@@@@@3333331", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_Missing_version_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_10 + description: Retrieve the authentication history with missing version + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "$REMOVE$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_Invalid_Timestamp_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_11 + description: Retrieve the authentication history using invalid timestamp + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "@@3333434444", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_Missing_Timestamp_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_12 + description: Retrieve the authentication history with missing timestamp + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$REMOVE$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthHistory_InValid_OTP_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_13 + description: Retrieve the authentication history using invalid OTP + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "1@@@@11", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthHistory_With_UIN_Phone_smoke_Pos: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_14 + description: Retrieve the authentication history with UIN via phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/AuthHistory/authHistoryResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_PHONE$@phone", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone" + } +}' + + Resident_AuthHistory_With_UIN_Email_smoke_Pos: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_15 + description: Retrieve the authentication history with UIN via email + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/AuthHistory/authHistoryResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthHistory_With_UIN_EmptyChannel_Invalid_Neg: + endPoint: /resident/v1/req/auth-history + uniqueIdentifier: TC_Resident_AuthHistory_16 + description: Retrieve the authentication history with UIN using an empty channel + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/AuthHistory/authHistory + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authhistory", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmpty", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-OTA-008", + "message": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthHistory/authHistory.hbs b/api-test/src/main/resources/resident/AuthHistory/authHistory.hbs new file mode 100644 index 00000000000..2e904dd0921 --- /dev/null +++ b/api-test/src/main/resources/resident/AuthHistory/authHistory.hbs @@ -0,0 +1,12 @@ +{ + "id": "{{id}}", + "version": "{{version}}", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "otp": "{{otp}}" + } + +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthHistory/authHistoryResult.hbs b/api-test/src/main/resources/resident/AuthHistory/authHistoryResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthHistory/authHistoryResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLock/createAuthLock.hbs b/api-test/src/main/resources/resident/AuthLock/createAuthLock.hbs new file mode 100644 index 00000000000..7cd52cc1eaa --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLock/createAuthLock.hbs @@ -0,0 +1,17 @@ +{ + "id": "{{id}}", + "request": { + "transactionID":"{{transactionID}}", + "individualId":"{{individualId}}", + "individualIdType":"{{individualIdType}}", + "otp":"{{otp}}", + "authType": [ + {{#each authType}} + "{{auth}}" + {{#unless @last}},{{/unless}} + {{/each}} + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLock/createAuthLock.yml b/api-test/src/main/resources/resident/AuthLock/createAuthLock.yml new file mode 100644 index 00000000000..c33424ba785 --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLock/createAuthLock.yml @@ -0,0 +1,1391 @@ +AuthLock: + Resident_AuthLock_Valid_UIN_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_01 + description: Lock all authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Valid_VID_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_02 + description: Lock all authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_VID_Use_Two_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_03 + description: Lock all authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_VID_Use_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_04 + description: Lock all authentication type using VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Valid_UIN_smoke_demo_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_05 + description: Lock the demo authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_VID_smoke_demo_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_06 + description: Lock the demo authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_UIN_smoke_Face_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_07 + description: Lock the face authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_VID_smoke_Face_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_08 + description: Lock the face authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_UIN_smoke_Finger_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_09 + description: Lock the finger authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_VID_smoke_Finger_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_10 + description: Lock the finger authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_VID_smoke_Iris_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_11 + description: Lock the iris authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Valid_UIN_smoke_Iris_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_12 + description: Lock the iris authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Missing_individualIdType_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_13 + description: Lock the authentication type using missing individualIDtype + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "$REMOVE$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_InValid_AuthType_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_14 + description: Lock the authentication type with an invalid authtype + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "@3###CE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_InValid_UIN_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_15 + description: Lock the authentication type using an invalid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "48@3###4709", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_missing_UIN_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_16 + description: Lock the authentication type with a missing UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_InValid_OTP_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_17 + description: Lock the authentication type using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "1#@@311", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_InValid_OTP_Vid_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_18 + description: Lock the authentication type using an invalid OTP and VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "1#@@311", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_TransactionMismatch_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_19 + description: Lock the authentication type using mismatched transaction + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "1237890", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Invalid_Id_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_20 + description: Lock the authentication type using an invalid Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_missing_Id_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_21 + description: Lock the authentication type using missing Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_InValid_version_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_22 + description: Lock the authentication type using an invalid version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "@333#1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Missing_version_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_23 + description: Lock the authentication type using a missing version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "$REMOVE$", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_InvalidTimestamp_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_24 + description: Lock the authentication type using an invalid timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "T@345IMP", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Missing_Timestamp_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_25 + description: Lock the authentication type using missing timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$REMOVE$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Invalid_Authtype_Otp_VID_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_26 + description: Lock the authentication type using an invalid authtype-otp and VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "otp"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Empty_UIN_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_27 + description: Lock the authentication type using an empty UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Empty_OTP_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_28 + description: Lock the authentication type using an empty OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Empty_TransactionId_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_29 + description: Lock the authentication type using an empty transactionId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthLock_Empty_Id_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_30 + description: Lock the authentication type using an empty Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Empty_requesttime_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_31 + description: Lock the authentication type using an empty requesttime + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Empty_version_Pos: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_32 + description: Lock the authentication type using an empty version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "registrationId": "$IGNORE$", + "message": "Notification has been sent to the provided contact detail(s)", + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Valid_UIN_Phone_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_33 + description: Lock the authentication type using valid UIN and phone + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_PHONE$@phone", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone" + } +}' + + Resident_AuthLock_Valid_UIN_Email_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_34 + description: Lock the authentication type using valid UIN and email + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Valid_UIN_EmptyChannel_Invalid_Neg: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_35 + description: Lock the authentication type using valid UIN with an empty channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmpty", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-OTA-008", + "message": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + + Resident_AuthLock_Valid_UIN_Transactions_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_36 + description: Lock the authentication type using valid UIN and transactions + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthLock_Valid_UIN_Transactions_Second_All: + endPoint: /resident/v1/req/auth-lock + uniqueIdentifier: TC_Resident_AuthLock_37 + description: Lock the authentication type using valid UIN and transactions + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthLock/createAuthLock + outputTemplate: resident/AuthLock/createAuthLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLock/createAuthLockResult.hbs b/api-test/src/main/resources/resident/AuthLock/createAuthLockResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLock/createAuthLockResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.hbs b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.hbs new file mode 100644 index 00000000000..5f02c7f40cc --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.hbs @@ -0,0 +1,14 @@ +{ + "id": "{{id}}", + "request": { + "authTypes": [ + { + "authType": "{{authType}}", + "locked": "{{locked}}", + "unlockForSeconds": "{{unlockForSeconds}}" + } + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.yml b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.yml new file mode 100644 index 00000000000..c17b3f3df3e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNew.yml @@ -0,0 +1,1078 @@ +AuthLockNew: + Resident_AuthLockNew_Demo_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_01 + description: Lock the demo authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Otp_Phone_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_02 + description: Lock the otp-phone authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-phone", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Otp_Email_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_03 + description: Lock the otp-email authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-email", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Face_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_04 + description: Lock the bio-face authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Iris_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_05 + description: Lock the bio-iris authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Finger_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_06 + description: Lock the bio-finger authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_uin_Invalid_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_07 + description: Lock the authentication type using valid UIN and an invalid requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "T@345IMP", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Invalid_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_08 + description: Lock the authentication type using valid UIN and an invalid Id + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Invalid_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_09 + description: Lock the authentication type using valid UIN and an invalid version + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "@333#1", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Invalid_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_10 + description: Lock the authentication type using valid UIN and an invalid authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-Fing@@", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Invalid_Locked_Status_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_11 + description: Lock the authentication type using valid UIN and an invalid locked status + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "tr$@s", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Invalid_Secs_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_12 + description: Lock the authentication type using valid UIN with an invalid unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "@#$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Empty_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_13 + description: Lock the authentication type using valid UIN with an empty requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Empty_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_14 + description: Lock the authentication type using valid UIN with an empty Id + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] + }' + + Resident_AuthLockNew_uin_Empty_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_15 + description: Lock the authentication type using valid UIN with an empty version + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Empty_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_16 + description: Lock the authentication type using valid UIN with an empty authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthLockNew_uin_Empty_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_17 + description: Lock the authentication type using valid UIN with an empty locked status + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_uin_Empty_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_18 + description: Lock the authentication type using valid UIN with an empty unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_uin_Missing_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_19 + description: Lock the authentication type using valid UIN with missing requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Missing_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_20 + description: Lock the authentication type using valid UIN with missing Id + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Missing_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_21 + description: Lock the authentication type using valid UIN with missing version + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "$REMOVE$", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_uin_Missing_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_22 + description: Lock the authentication type using valid UIN with missing authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "$REMOVE$", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthLockNew_uin_Missing_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_23 + description: Lock the authentication type using valid UIN with missing locked status + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "$REMOVE$", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_uin_Missing_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_24 + description: Lock the authentication type using valid UIN with missing unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "$REMOVE$" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_StatusCode_Invalid_Token_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_25 + description: Lock the authentication type using valid statuscode and an invalid token + role: invalid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: "401" + + Resident_AuthLockNew_Demo_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_26 + description: Lock the demo authentication type using valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Face_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_27 + description: Lock the face authentication type using valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Iris_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_28 + description: Lock the iris authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_Finger_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_29 + description: Lock the finger authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_vid_Invalid_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_30 + description: Lock the authentication type using valid VID with an invalid requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "T@345IMP", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Invalid_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_31 + description: Lock the authentication type using valid VID with an invalid Id + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Invalid_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_32 + description: Lock the authentication type using valid VID with an invalid version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "@333#1", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Invalid_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_33 + description: Lock the authentication type using valid VID with an invalid authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-Fing@@", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Invalid_Locked_Status_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_34 + description: Lock the authentication type using valid VID with an invalid lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "tr$@s", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Invalid_Secs_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_35 + description: Lock the authentication type using valid VID with an invalid unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "@#$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Empty_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_36 + description: Lock the authentication type using valid VID with an empty requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Empty_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_37 + description: Lock the authentication type using valid VID with an empty Id + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] + }' + + Resident_AuthLockNew_vid_Empty_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_38 + description: Lock the authentication type using valid VID with an empty version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Empty_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_39 + description: Lock the authentication type using valid VID with an empty authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthLockNew_vid_Empty_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_40 + description: Lock the authentication type using valid VID with an empty lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_vid_Empty_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_41 + description: Lock the authentication type using valid VID with an empty unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_vid_Missing_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_42 + description: Lock the authentication type using valid VID with missing requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Missing_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_43 + description: Lock the authentication type using valid VID with missing Id + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Missing_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_44 + description: Lock the authentication type using valid VID with missing version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "$REMOVE$", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthLockNew_vid_Missing_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_45 + description: Lock the authentication type using valid VID with missing authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "$REMOVE$", + "locked": "true", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthLockNew_vid_Missing_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_46 + description: Lock the authentication type using valid VID with missing lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "$REMOVE$", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthLockNew_vid_Missing_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthLockNew_47 + description: Lock the authentication type using valid VID with missing unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthLockNew/CreateAuthLockNew + outputTemplate: resident/AuthLockNew/CreateAuthLockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "true", + "unlockForSeconds": "$REMOVE$" + }' + output: '{ + "status": "Success" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNewResult.hbs b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNewResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthLockNew/CreateAuthLockNewResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.hbs b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.hbs new file mode 100644 index 00000000000..f807412d7f5 --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.hbs @@ -0,0 +1,18 @@ +{ + "id": "{{id}}", + "request": { + "transactionID":"{{transactionID}}", + "individualId":"{{individualId}}", + "individualIdType":"{{individualIdType}}", + "unlockForSeconds": "{{unlockForSeconds}}", + "otp":"{{otp}}", + "authType": [ + {{#each authType}} + "{{auth}}" + {{#unless @last}},{{/unless}} + {{/each}} + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.yml b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.yml new file mode 100644 index 00000000000..eb89afa963a --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLock.yml @@ -0,0 +1,1972 @@ +AuthUnlock: + Resident_AuthUnLock_Valid_UIN_All: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_01 + description: Unlock all authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_VID_All: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_02 + description: Unlock all authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Use_Three_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_03 + description: Unlock authentication types using valid VID through three possible elements + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Use_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_04 + description: Unlock authentication types using valid VID through possible elements + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_UIN_All_Invalid_Unlock_Seconds: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_05 + description: Unlock all authentication types using a valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_All_Invalid_Unlock_Seconds: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_06 + description: Unlock all authentication types using a valid VID with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_smoke_demo_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_07 + description: Unlock the demo authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_UIN_Invalid_Unlock_Seconds_demo_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_08 + description: Unlock the demo authentication type using valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_VID_smoke_demo_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_09 + description: Unlock the demo authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Invalid_Unlock_Seconds_demo_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_10 + description: Unlock the demo authentication type using valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "demo"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_smoke_Face_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_11 + description: Unlock the face authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_UIN_Invalid_Unlock_Seconds_Face_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_12 + description: Unlock the face authentication type using valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_VID_smoke_Face_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_13 + description: Unlock the face authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Invalid_Unlock_Seconds_Face_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_14 + description: Unlock the face authentication type using valid VID with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_smoke_Finger_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_15 + description: Unlock the finger authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_UIN_Invalid_Unlock_Seconds_Finger_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_16 + description: Unlock the finger authentication type using valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_VID_smoke_Finger_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_17 + description: Unlock the finger authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Invalid_Unlock_Seconds_Finger_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_18 + description: Unlock the finger authentication type using valid VID with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_VID_smoke_Iris_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_19 + description: Unlock the Iris authentication type using a valid VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Invalid_Unlock_Seconds_Iris_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_20 + description: Unlock the iris authentication type using valid VID with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_smoke_Iris_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_21 + description: Unlock the iris authentication type using a valid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_UIN_Invalid_Unlock_Seconds_Iris_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_22 + description: Unlock the iris authentication type using valid UIN with an invalid unlockForSeconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "tt", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_UIN_Missing_Unlock_Seconds_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_23 + description: Unlock the authentication type using a valid UIN but with the unlockForSeconds parameter missing + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "$REMOVE$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_VID_Missing_Unlock_Seconds_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_24 + description: Unlock the authentication type using a valid VID but with the unlockForSeconds parameter missing + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "$REMOVE$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_InValid_AuthType_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_25 + description: Unlock the authentication type with an invalid authtype + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "@3###CE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_InValid_UIN_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_26 + description: Unlock the authentication type with an invalid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "48@3###4709", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_missing_UIN_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_27 + description: Unlock the authentication type with a missing UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_InValid_OTP_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_28 + description: Unlock the authentication type using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "1#@@311", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_TransactionMismatch_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_29 + description: Unlock the authentication type using mismatched transaction + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "1237890", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_Invalid_Id_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_30 + description: Unlock the authentication type using an invalid ID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_missing_Id_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_31 + description: Unlock the authentication type using missing ID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_InValid_version_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_32 + description: Unlock the authentication type using an invalid version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "@333#1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_Missing_version_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_33 + description: Unlock the authentication type using missing version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "$REMOVE$", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_InvalidTimestamp_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_34 + description: Unlock the authentication type using an invalid timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "T@345IMP", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_AuthUnLock_Missing_Timestamp_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_35 + description: Unlock the authentication type using missing timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$REMOVE$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Invalid_Authtype_Otp_UIN_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_36 + description: Unlock the authentication type using an invalid authtype-otp and UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "otp"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_For_30secs_Valid_UIN_All: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_37 + description: Unlock the authentication type using the UIN for 30 seconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "30", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_For_30secs_Valid_VID_All: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_38 + description: Unlock the authentication type using the VID for 30 seconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "unlockForSeconds": "30", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Empty_transactionID_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_39 + description: Unlock the authentication type using an empty transactionId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Empty_individualId_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_40 + description: Unlock the authentication type using an empty individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Empty_requesttime_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_41 + description: Unlock the authentication type using an empty requesttime + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Empty_id_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_42 + description: Unlock the authentication type using an empty ID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Empty_otp_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_43 + description: Unlock the authentication type using an empty OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_EmptyChannel_Invalid_Neg: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_44 + description: Unlock the authentication type using valid UIN with an empty channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmpty", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "OTP is invalid" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-OTA-008", + "errorMessage": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + + Resident_AuthUnLock_Valid_UIN_EmailChannel_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_45 + description: Unlock the authentication type using a valid UIN with the email channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_PhoneChannel_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_46 + description: Unlock the authentication type using a valid UIN through the phone channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_PHONE$@phone", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone", + "maskedMobile": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Forsecs_Valid_UIN_smoke_Finger_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_47 + description: Unlock the finger authentication type using a valid UIN for seconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Finger"}], + "otp": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Forsecs_Valid_UIN_smoke_Face_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_48 + description: Unlock the face authentication type using a valid UIN for seconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Forsecs_Valid_UIN_smoke_Iris_Pos: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_49 + description: Unlock the iris authentication type using a valid UIN for seconds + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"}], + "otp": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_AuthUnLock_Valid_UIN_Transactions_All: + endPoint: /resident/v1/req/auth-unlock + uniqueIdentifier: TC_Resident_AuthUnLock_50 + description: Unlock the authentication type using valid UIN and transactions + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/AuthUnLock/createAuthUnLock + outputTemplate: resident/AuthUnLock/createAuthUnLockResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "unlockForSeconds": "1", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.authunlock", + "version": "v1", + "authType": [{auth: "bio-Iris"},{auth: "demo"},{auth: "bio-FACE"}], + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + diff --git a/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLockResult.hbs b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLockResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnLock/createAuthUnLockResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.hbs b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.hbs new file mode 100644 index 00000000000..5f02c7f40cc --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.hbs @@ -0,0 +1,14 @@ +{ + "id": "{{id}}", + "request": { + "authTypes": [ + { + "authType": "{{authType}}", + "locked": "{{locked}}", + "unlockForSeconds": "{{unlockForSeconds}}" + } + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.yml b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.yml new file mode 100644 index 00000000000..6cb0c241efe --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNew.yml @@ -0,0 +1,1324 @@ +AuthUnlockNew: + Resident_AuthUnlockNew_Demo_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_01 + description: Unlock the demo authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_otp_Email_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_02 + description: Unlock the otp email authentication type using valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-email", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_otp_Email_Valid_UIN_Unlocke_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_03 + description: Unlock the otp email authentication type using a valid UIN for the specified time + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-email", + "locked": "false", + "unlockForSeconds": "600" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_OTPphone_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_04 + description: Unlock the otp phone authentication type using a valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-phone", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_OTPphone_Valid_UIN_UnLocke_Spacified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_05 + description: Unlock the otp phone authentication type using a valid UIN for the specified time + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-phone", + "locked": "false", + "unlockForSeconds": "60" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Demo_Valid_UIN_Unlock_120_Sec: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_06 + description: Unlock the demo authentication type using a valid UIN for 120 seconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Face_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_07 + description: Unlock the face authentication type using a valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + Resident_AuthUnlockNew_Face_Valid_UIN_UnLocke_For Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_08 + description: Unlock the face authentication type using a valid UIN for the specified time + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Iris_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_09 + description: Unlock the iris authentication type using a valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Iris_Valid_UIN_Unlocke_For_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_10 + description: Unlock the iris authentication type using a valid UIN for the specified time + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Finger_Valid_UIN_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_11 + description: Unlock the finger authentication type using a valid UIN + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Finger_Valid_UIN_Unlocke_For_Specificed_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_12 + description: Unlock the finger authentication type using a valid UIN for the specified time + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_uin_Invalid_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_13 + description: Unlock the authentication type using a valid UIN and an invalid requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "T@345IMP", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Invalid_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_14 + description: Unlock the authentication type using a valid UIN and an invalid ID + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Invalid_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_15 + description: Unlock the authentication type using a valid UIN and an invalid version + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "@333#1", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Invalid_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_16 + description: Unlock the authentication type using a valid UIN and an invalid authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-Fing@@", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_uin_Invalid_Locked_Status_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_17 + description: Unlock the authentication type using a valid UIN and an invalid locked status + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "tr$@s", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Invalid_Secs_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_18 + description: Unlock the authentication type using a valid UIN and an invalid unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "@#$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Empty_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_19 + description: Unlock the authentication type using a valid UIN and an empty requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Empty_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_20 + description: Unlock the authentication type using a valid UIN and an empty ID + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Empty_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_21 + description: Unlock the authentication type using a valid UIN and an empty version + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Empty_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_22 + description: Unlock the authentication type using a valid UIN and an empty authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_uin_Empty_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_23 + description: Unlock the authentication type using a valid UIN and an empty locked status + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_uin_Empty_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_24 + description: Unlock the authentication type using a valid UIN and an empty unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_uin_Missing_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_25 + description: Unlock the authentication type using valid UIN with missing requesttime + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Missing_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_26 + description: Unlock the authentication type using valid UIN with missing ID + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Missing_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_27 + description: Unlock the authentication type using valid UIN with missing version + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "$REMOVE$", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_uin_Missingy_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_28 + description: Unlock the authentication type using valid UIN with missing authtype + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "$REMOVE$", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_uin_Missing_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_29 + description: Unlock the authentication type using valid UIN with missing lockedstatus + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "$REMOVE$", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_uin_Missing_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_30 + description: Unlock the authentication type using valid UIN with missing unlockforseconds + role: residentNew + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "$REMOVE$" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Invalid_Token_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_31 + description: Unlock the authentication type using an invalid token + role: resident + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_Demo_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_32 + description: Unlock the demo authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_otp_Phone_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_33 + description: Unlock the otp-phone authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-phone", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_otp_Email_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_34 + description: Unlock the otp-email authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "otp-email", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Demo_Valid_Vid_Unlock_For_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_35 + description: Unlock the demo authentication type using a valid VID for the specified time + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "demo", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Face_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_36 + description: Unlock the face authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Face_Valid_Vid_Unlocke_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_37 + description: Unlock the face authentication type using a valid VID for the specified time + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FACE", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Iris_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_38 + description: Unlock the iris authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Iris_Valid_Vid_Unlocke_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_39 + description: Unlock the iris authentication type using a valid VID for the specified time + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-IRIS", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Finger_Valid_Vid_All: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_40 + description: Unlock the finger authentication type using a valid VID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_Finger_Valid_Vid_UnLocke_Specified_Time: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_41 + description: Unlock the finger authentication type using a valid VID for the specified time + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "120" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_vid_Invalid_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_42 + description: Unlock the authentication type using a valid VID and an invalid requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "T@345IMP", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Invalid_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_43 + description: Unlock the authentication type using a valid VID and an invalid ID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mothlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Invalid_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_44 + description: Unlock the authentication type using a valid VID and an invalid version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "@333#1", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Invalid_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_45 + description: Unlock the authentication type using a valid VID and an invalid authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-Fing@@", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_vid_Invalid_Locked_Status_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_46 + description: Unlock the authentication type using a valid VID and an invalid lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "tr$@s", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Invalid_Secs_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_47 + description: Unlock the authentication type using a valid VID and an invalid unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "@#$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Empty_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_48 + description: Unlock the authentication type using a valid VID and an empty requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Empty_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_49 + description: Unlock the authentication type using a valid VID and an empty ID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Empty_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_50 + description: Unlock the authentication type using a valid VID and an empty version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Empty_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_51 + description: Unlock the authentication type using a valid VID and an empty authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_vid_Empty_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_52 + description: Unlock the authentication type using a valid VID and an empty lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_vid_Empty_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_53 + description: Unlock the authentication type using a valid VID and an empty unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_vid_Missing_Requesttime_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_54 + description: Unlock the authentication type using valid VID with missing requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Missing_Id_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_55 + description: Unlock the authentication type using valid VID with missing ID + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Missing_Version_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_56 + description: Unlock the authentication type using valid VID with missing version + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "$REMOVE$", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_AuthUnlockNew_vid_Missingy_AuthType_Neg: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_57 + description: Unlock the authentication type using valid VID with missing authtype + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "$REMOVE$", + "locked": "false", + "unlockForSeconds": "null" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- authTypes" + } + ] +}' + + Resident_AuthUnlockNew_vid_Missing_Locked_Status_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_58 + description: Unlock the authentication type using valid VID with missing lockedstatus + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "$REMOVE$", + "unlockForSeconds": "null" + }' + output: '{ + "status": "Success" +}' + + Resident_AuthUnlockNew_vid_Missing_Secs_Pos: + endPoint: /resident/v1/auth-lock-unlock + uniqueIdentifier: TC_Resident_AuthUnlockNew_59 + description: Unlock the authentication type using valid VID with missing unlockforseconds + role: residentNewVid + restMethod: post + inputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNew + outputTemplate: resident/AuthUnlockNew/CreateAuthUnlockNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.auth.lock.unlock", + "version": "1.0", + "authType": "bio-FINGER", + "locked": "false", + "unlockForSeconds": "$REMOVE$" + }' + output: '{ + "status": "Success" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNewResult.hbs b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNewResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthUnlockNew/CreateAuthUnlockNewResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.hbs b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.hbs new file mode 100644 index 00000000000..43ef2d127f4 --- /dev/null +++ b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.hbs @@ -0,0 +1,15 @@ +{ + "encodedHash": "{{encodedHash}}", + "requestTime": "{{requestTime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "challengeList" : [ + { + "authFactorType" : "{{authFactorType}}", + "challenge" : "{{challenge}}", + "format": "alpha-numeric" + } + ] + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.yml b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.yml new file mode 100644 index 00000000000..a9f02b89ace --- /dev/null +++ b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUser.yml @@ -0,0 +1,70 @@ +AuthenticateUser: + Resident_ESignet_AuthenticateUserIDP_uin_Otp_Valid_Smoke: + endPoint: /v1/esignet/authorization/authenticate + uniqueIdentifier: Dependent_ESignet_AuthenticateUserIDP_01 + description: Authenticate a user using their UIN and a valid OTP in the eSignet authentication process + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/AuthenticateUser/AuthenticateUser + outputTemplate: resident/AuthenticateUser/AuthenticateUserResult + input: '{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_transactionId$", + "individualId": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_UIN$", + "authFactorType" : "OTP", + "challenge" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "sendOtp":{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_transactionId$", + "individualId": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_UIN$", + "otpChannels": [{channel: "email"},{channel: "phone"}], + "sendOtpReqTemplate": "resident/SendOtpIdp/SendOtpIdp", + "sendOtpEndPoint": "/v1/esignet/authorization/send-otp" + } +}' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOtpIdp/SendOtpIdpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_ESignet_AuthenticateUserIDP_vid_Otp_Valid_Smoke: + endPoint: /v1/esignet/authorization/authenticate + uniqueIdentifier: Dependent_ESignet_AuthenticateUserIDP_02 + description: Authenticate a user using their VID and a valid OTP in the eSignet authentication process + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/AuthenticateUser/AuthenticateUser + outputTemplate: resident/AuthenticateUser/AuthenticateUserResult + input: '{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_transactionId$", + "individualId": "$ID:GenerateVID_Perpetual_Esignet_Integ_Valid_Smoke_sid_vid$", + "authFactorType" : "OTP", + "challenge" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_transactionId$", + "individualId": "$ID:GenerateVID_Perpetual_Esignet_Integ_Valid_Smoke_sid_vid$", + "otpChannels": [{channel: "email"},{channel: "phone"}], + "sendOtpReqTemplate": "resident/SendOtpIdp/SendOtpIdp", + "sendOtpEndPoint": "/v1/esignet/authorization/send-otp" + } +}' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOtpIdp/SendOtpIdpResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUserResult.hbs b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUserResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthenticateUser/AuthenticateUserResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.hbs b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.hbs new file mode 100644 index 00000000000..491dca1ba1f --- /dev/null +++ b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.hbs @@ -0,0 +1,19 @@ +{ + "encodedHash": "{{encodedHash}}", + "requestTime": "{{requestTime}}", + "request": { + "transactionId": "{{transactionId}}", + "acceptedClaims": [ + {{#each acceptedClaims}} + "{{claim}}" + {{#unless @last}},{{/unless}} + {{/each}} + ], + "permittedAuthorizeScopes": [ + {{#each permittedAuthorizeScopes}} + "{{scope}}" + {{#unless @last}},{{/unless}} + {{/each}} + ] + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.yml b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.yml new file mode 100644 index 00000000000..6846a01d090 --- /dev/null +++ b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCode.yml @@ -0,0 +1,41 @@ +AuthorizationCode: + Resident_ESignet_AuthorizationCode_uin_All_Valid_Smoke_sid: + endPoint: /v1/esignet/authorization/auth-code + uniqueIdentifier: Dependent_ESignet_AuthorizationCode_01 + description: Generate the ESignet authorization code using UIN with valid inputs + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/AuthorizationCode/AuthorizationCode + outputTemplate: resident/AuthorizationCode/AuthorizationCodeResult + input: '{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_transactionId$", + "acceptedClaims": [{claim: "name"},{claim: "phone_number"},{claim: "email"},{claim: "picture"},{claim: "individual_id"}], + "permittedAuthorizeScopes": [{scope: "Manage-Identity-Data"},{scope: "Manage-VID"},{scope: "Manage-Authentication"},{scope: "Manage-Service-Requests"},{scope: "Manage-Credentials"}] +}' + output: '{ +}' + + Resident_ESignet_AuthorizationCode_Vid_All_Valid_Smoke_sid: + endPoint: /v1/esignet/authorization/auth-code + uniqueIdentifier: Dependent_ESignet_AuthorizationCode_01 + description: Generate the ESignet authorization code using VID with valid inputs + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/AuthorizationCode/AuthorizationCode + outputTemplate: resident/AuthorizationCode/AuthorizationCodeResult + input: '{ + "encodedHash": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_encodedResp$", + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid_transactionId$", + "acceptedClaims": [{claim: "name"},{claim: "phone_number"},{claim: "email"},{claim: "picture"},{claim: "individual_id"}], + "permittedAuthorizeScopes": [{scope: "Manage-Identity-Data"},{scope: "Manage-VID"},{scope: "Manage-Authentication"},{scope: "Manage-Service-Requests"},{scope: "Manage-Credentials"}] + +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCodeResult.hbs b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/AuthorizationCode/AuthorizationCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CheckAidStatus/.hbs b/api-test/src/main/resources/resident/CheckAidStatus/.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/CheckAidStatus/.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.hbs b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.hbs new file mode 100644 index 00000000000..5d9343a073f --- /dev/null +++ b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.resident.checkstatus", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "individualId": "{{aid}}", + "otp": "{{otp}}", + "transactionId": "{{transactionId}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.yml b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.yml new file mode 100644 index 00000000000..2dd289a68c4 --- /dev/null +++ b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatus.yml @@ -0,0 +1,261 @@ +CheckAidStatus: + Resident_CheckAidStatus_all_Valid_Smoke: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_01 + description: Check the status of the AID using valid data + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/CheckAidStatus/CheckAidStatusResult + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "transactionId": "$TRANSACTIONID$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Invalid_Aid_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_02 + description: Check the status of the AID by using an invalid AID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "123444sasa$%", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "transactionId": "$TRANSACTIONID$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Invalid_TransactionID_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_03 + description: Check the status of the AID using an invalid transactionID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "transactionId": "213$@As", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Invalid_Otp_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_04 + description: Check the status of the AID using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "otp": "123456", + "transactionId": "$TRANSACTIONID$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Empty_Aid_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_05 + description: Check the status of the AID using an empty AID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "transactionId": "$TRANSACTIONID$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Empty_TransactionID_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_06 + description: Check the status of the AID using an empty transaction ID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "transactionId": "", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_CheckAidStatus_Empty_Otp_Neg: + endPoint: /resident/v1/aid/status + uniqueIdentifier: TC_Resident_CheckAidStatus_07 + description: Check the status of the AID using an empty otp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CheckAidStatus/CheckAidStatus + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "otp": "", + "transactionId": "$TRANSACTIONID$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatusResult.hbs b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatusResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/CheckAidStatus/CheckAidStatusResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/CancellCredential.yml b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/CancellCredential.yml new file mode 100644 index 00000000000..f950e9dfbf9 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/CancellCredential.yml @@ -0,0 +1,15 @@ +CancellCredential: + Resident_CredentialsStatus_euin_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/cancel/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_01 + description: Check the credential status with EUIN and valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/CredentialIssuance/CancellCredential/cancellcredential + outputTemplate: resident/CredentialIssuance/CancellCredential/cancellcredentialResult + input: '{ + "requestId": "$ID:RequestCredentials_Qrcode_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredential.hbs b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredential.hbs new file mode 100644 index 00000000000..2eb8996906f --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredential.hbs @@ -0,0 +1,3 @@ +{ + "requestId": "{{requestId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredentialResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredentialResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CancellCredential/cancellcredentialResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/CredentialCheckStatus.yml b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/CredentialCheckStatus.yml new file mode 100644 index 00000000000..b8e87c9c3ab --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/CredentialCheckStatus.yml @@ -0,0 +1,91 @@ +CredentialsStatus: + Resident_CredentialsStatus_euin_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_01 + description: Check the credential status with EUIN and valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_euin_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' + Resident_CredentialsStatus_uin_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_02 + description: Check the credential status with UIN and valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_printUIN_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' + Resident_CredentialsStatus_QRcode_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_03 + description: Check the QRcode credential status using valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_Qrcode_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' + Resident_CredentialsStatus_Of_VID_euin_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_04 + description: Check the credential status of VID with EUIN and valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_euin_VID_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' + Resident_CredentialsStatus_Of_VID_Reprint_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_05 + description: Check the reprint credential status using VID and valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_reprint_VID_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' + Resident_CredentialsStatus_Of_VID_QRcode_All_Valid_Smoke: + endPoint: /resident/v1/req/credential/status/{requestId} + uniqueIdentifier: TC_Resident_CredentialsStatus_06 + description: Check the QRcode credential status using VID and valid inputs + role: resident + restMethod: get + allowedErrorCodes: PRINTED,printing + inputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus + outputTemplate: resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult + input: '{ + "requestId": "$ID:RequestCredentials_Qrcode_VID_All_Valid_Smoke_sid_requestId$" + }' + output: '{ + "statusCode": "PRINTED" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus.hbs b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus.hbs new file mode 100644 index 00000000000..2eb8996906f --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatus.hbs @@ -0,0 +1,3 @@ +{ + "requestId": "{{requestId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult.hbs new file mode 100644 index 00000000000..5bd4b5fb05f --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/CredentialCheckStatus/credentialcheckstatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "statusCode": "{{statusCode}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/DownloadWithReqid.yml b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/DownloadWithReqid.yml new file mode 100644 index 00000000000..4e21961b02b --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/DownloadWithReqid.yml @@ -0,0 +1,177 @@ +DownloadCredential: + Resident_CredentialsStatus_All_Valid_Smoke_euin: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_01 + description: Check the credential status using valid EUIN and inputs. + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_euin_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_All_Valid_Smoke_QrCode: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_02 + description: Check the Qrcode credential status using valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_Qrcode_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_All_Valid_Smoke_Reprint: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_03 + description: Check the reprint credential status using valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_printUIN_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_VID_All_Valid_Smoke_euin: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_04 + description: Check the credential status using VID with EUIN and valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_euin_VID_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_VID_All_Valid_Smoke_Reprint: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_05 + description: Check the reprint credential status using VID and valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_reprint_VID_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_VID_All_Valid_Smoke_QrCode: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_06 + description: Check the Qrcode credential status using VID and valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult + input: '{ + "requestId": "$ID:RequestCredentials_Qrcode_VID_All_Valid_Smoke_sid_requestId$", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "Content-Type": "application/pdf", + "filename": "$IGNORE$" + }' + Resident_CredentialsStatus_Invalid_requestId: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_07 + description: Check the credential status using an invalid requestId + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/error + input: '{ + "requestId": "adfvd", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "errors": [ + { + "errorCode": "RES-SER-29", + "message": "$IGNORE$" + } + ] + }' + Resident_CredentialsStatus_Invalid_requesttime: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_08 + description: Check the credential status using an invalid requesttime + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/error + input: '{ + "requestId": "adfvd", + "requesttime": "33" + }' + output: ' { + "errors": [ + { + "errorCode": "RES-SER-29", + "message": "$IGNORE$" + } + ] + }' + Resident_CredentialsStatus_Empty_requestId: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_09 + description: Check the credential status using an empty requestId + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/error + input: '{ + "requestId": "", + "requesttime": "$TIMESTAMP$" + }' + output: ' { + "errors": [ + { + "errorCode": "RES-SER-29", + "message": "$IGNORE$" + } + ] + }' + Resident_CredentialsStatus_Empty_requesttime: + endPoint: /resident/v1/req/card/{requestId} + uniqueIdentifier: TC_Resident_DownloadCredential_10 + description: Check the credential status using an empty requesttime + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid + outputTemplate: resident/error + input: '{ + "requestId": "$ID:RequestCredentials_euin_All_Valid_Smoke_sid_requestId$", + "requesttime": "33" + }' + output: ' { + "errors": [ + { + "errorCode": "RES-SER-29", + "message": "$IGNORE$" + } + ] + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid.hbs b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid.hbs new file mode 100644 index 00000000000..2eb8996906f --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqid.hbs @@ -0,0 +1,3 @@ +{ + "requestId": "{{requestId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult.hbs new file mode 100644 index 00000000000..8ff636b357c --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/DownloadWithReqid/downloadwithreqidResult.hbs @@ -0,0 +1,4 @@ +{ + "Content-Type": "{{Content-Type}}", + "filename": "{{filename}}" + } \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/GetCredentialTypes.yml b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/GetCredentialTypes.yml new file mode 100644 index 00000000000..feb1c156f31 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/GetCredentialTypes.yml @@ -0,0 +1,28 @@ +GetCredentialTypes: + Resident_GetCredentialTypes_smoke: + endPoint: /resident/v1/credential/types + uniqueIdentifier: TC_Resident_GetCredentialTypes_01 + description: Get the credential types + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/CredentialIssuance/GetCredentialTypes/getCredentialTypes + outputTemplate: resident/CredentialIssuance/GetCredentialTypes/getCredentialTypesResult + input: '{ +}' + output: '{ +}' + Resident_GetCredentialTypes_all_valid_smoke: + endPoint: /resident/v1/credential/types + uniqueIdentifier: TC_Resident_GetCredentialTypes_02 + description: Get the credential type using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/CredentialIssuance/GetCredentialTypes/getCredentialTypes + outputTemplate: resident/CredentialIssuance/GetCredentialTypes/getCredentialTypesResult + input: '{ +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypes.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypes.hbs new file mode 100644 index 00000000000..7a73a41bfdf --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypes.hbs @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypesResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypesResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetCredentialTypes/getCredentialTypesResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/GetPolicyByCredentialType.yml b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/GetPolicyByCredentialType.yml new file mode 100644 index 00000000000..0311826d38f --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/GetPolicyByCredentialType.yml @@ -0,0 +1,17 @@ +GetPolicyByCredentialType: + Resident_GetPolicyByCredentialType_smoke: + endPoint: /resident/v1/req/policy/partnerId/{partnerId}/credentialType/{credentialType} + uniqueIdentifier: TC_Resident_GetPolicyByCredentialType_01 + description: Get the policy by credentialtype + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialType + outputTemplate: resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialTypeResult + input: '{ + "credentialType": "reprint", + "partnerId": "mpartner-default-print" + }' + output: '{ + "partnerId": "mpartner-default-print", + "credentialType": "reprint" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialType.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialType.hbs new file mode 100644 index 00000000000..df827eba2df --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialType.hbs @@ -0,0 +1,4 @@ +{ + "credentialType": "{{credentialType}}", + "partnerId": "{{partnerId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialTypeResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialTypeResult.hbs new file mode 100644 index 00000000000..a741428fa90 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetPolicyByCredentialType/getPolicyByCredentialTypeResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "partnerId": "{{partnerId}}", + "credentialType": "{{credentialType}}", + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/GetRqstId.yml b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/GetRqstId.yml new file mode 100644 index 00000000000..3d11fc701f5 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/GetRqstId.yml @@ -0,0 +1,21 @@ +GetRqstId: + Resident_GetRqstId_All_Valid_Smoke: + endPoint: /v1/credentialrequest/getRequestIds?direction=ASC&orderBy=updateDateTime&pageNumber=0&pageSize=1&statusCode=FAILED + uniqueIdentifier: TC_Resident_GetRqstId_01 + description: Get requestId using all valid inputs + role: resident + restMethod: get + inputTemplate: resident/CredentialIssuance/GetRqstId/getRqstId + outputTemplate: resident/CredentialIssuance/GetRqstId/getRqstIdResult + input: '{ + "direction": "ASC", + "effectivedtimes": "$TIMESTAMP$", + "orderBy": "updateDateTime", + "pageNumber": "0", + "pageSize": "1", + "statusCode": "FAILED" + }' + output: '{ + "pageNo": "0", + "pageSize": "1" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstId.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstId.hbs new file mode 100644 index 00000000000..d940ad79198 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstId.hbs @@ -0,0 +1,8 @@ +{ + "direction": "{{direction}}", + "effectivedtimes": "{{effectivedtimes}}", + "orderBy": "{{orderBy}}", + "pageNumber": "{{pageNumber}}", + "pageSize": "{{pageSize}}", + "statusCode": "{{statusCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstIdResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstIdResult.hbs new file mode 100644 index 00000000000..db78989df35 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/GetRqstId/getRqstIdResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "pageNo": "{{pageNo}}", + "pageSize": "{{pageSize}}", + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredential.yml b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredential.yml new file mode 100644 index 00000000000..7e1945e8639 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredential.yml @@ -0,0 +1,1824 @@ +RequestCredentials: + Resident_RequestCredentials_euin_VID_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_01 + description: Request credentials of euin using VID with other valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_reprint_VID_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_02 + description: Request reprint credentials using VID and other valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_Qrcode_VID_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_03 + description: Request QRcode credentials using VID and other valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_InValid_otp: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_04 + description: Request credentials using a VID with an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "asdgf", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "IDA-MLC-018", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_InValid_transactionID: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_05 + description: Request credentials using a VID with an invalid transactionID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "asfvsafv", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "IDA-MLC-018", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_empty_encryptionKey_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_06 + description: Request credentials using a VID with an empty encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_null_encryptionKey_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_07 + description: Request credentials using a VID with null encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "null", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_missing_encryptionKey_Valid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_08 + description: Request credentials using a VID with missing encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "$REMOVE$", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_encrypt_false_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_09 + description: Request credentials using a VID with encrypt false + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "false", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_euin_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_10 + description: Request credentials of euin using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_printUIN_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_11 + description: Request printUIN credentials using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_Qrcode_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_12 + description: Request QRcode credentials using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_invalidd_individualid_neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_13 + description: Request credentials using an invalid individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "asfgefv", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_invalid_individualid_neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_14 + description: Request credentials using an invalid individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "29874", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_missing_individualid_neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_15 + description: Request credentials using missing individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_invalid_otp: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_16 + description: Request credentials using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "asfgef", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "IDA-MLC-018", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_invalid_transactionID: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_17 + description: Request credentials using an invalid transactionId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "fkuyfuj", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "IDA-MLC-018", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_empty_encryptionKey_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_18 + description: Request credentials using an empty encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_null_encryptionKey_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_19 + description: Request credentials using null encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "null", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_missing_encryptionKey_invalid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_20 + description: Request credentials using missing encryptionKey + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "$REMOVE$", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_encrypt_false_smoke: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_21 + description: Request credentials making encrypt false. + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "false", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_euin_UIN_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_22 + description: Request EUIN credentials using UIN with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_euin_VID_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_23 + description: Request EUIN credentials using VID with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_reprint_VID_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_24 + description: Request reprint credentials using VID with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_reprint_UIN_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_25 + description: Request reprint credentials using UIN with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Qrcode_VID_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_26 + description: Request QRcode credentials using VID with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Qrcode_UIN_With_Additional_Data_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_27 + description: Request QRcode credentials using UIN with additional data and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_euin_UIN_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_28 + description: Request EUIN credentials using UIN with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_euin_VID_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_29 + description: Request EUIN credentials using VID with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_reprint_VID_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_30 + description: Request reprint credentials using VID with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_reprint_UIN_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_31 + description: Request reprint credentials using UIN with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Qrcode_VID_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_32 + description: Request QRcode credentials using VID with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Qrcode_UIN_With_Sharable_Attributes_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_33 + description: Request QRcode credentials using UIN with sharable attributes and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_VID_Empty_otp_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_34 + description: Request credentials using VID with an empty OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_VID_Empty_transactionID_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_35 + description: Request credentials using VID with an empty transactionID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Empty_otp_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_36 + description: Request credentials using UIN with an empty OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RequestCredentials_Empty_transactionID_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_37 + description: Request credentials using UIN with an empty transactionID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Empty_CredentialType_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_38 + description: Request credentials using UIN with an empty credentialType + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Empty_individualId_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_39 + description: Request credentials using UIN with an empty individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "v1", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Empty_version_Pos: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_40 + description: Request credentials using UIN with an empty version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Email_Channel_Pos: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_41 + description: Request credentials using UIN with an email channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Phone_Channel_Pos: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_42 + description: Request credentials using UIN with phone channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_PHONE$@phone", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone", + "maskedMobile": "$IGNORE$" + } +}' + + Resident_RequestCredentials_EmptyChannel_Invalid_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_43 + description: Request credentials using UIN with an empty channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "encryptionKey": "abc123", + "version": "", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmpty", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "OTP is invalid" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-OTA-008", + "errorMessage": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + Resident_RequestCredentials_euinn_VID_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_44 + description: Request EUIN credentials using VID with all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_euin_TempVid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_45 + description: Request EUIN credentials using temporary VID with all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Temporary_VID_ONE_Valid_Smoke_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Temporary_VID_ONE_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_euin_VID_CheckVidIs_REVOKED_Neg: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_47 + description: Request EUIN credentials using revoked VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_Valid_First_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_Valid_First_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-MLC-018", + "errorMessage": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + + Resident_RequestCredentials_euin_VID_Use_One_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_48 + description: Request EUIN credentials using one VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_euin_VID_Use_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_49 + description: Request EUIN credentials using VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "credentialType": "euin", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "requestTime": "$TIMESTAMP$", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_printUIN_Transactions_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_50 + description: Request print UIN transactions credentials using UIN with all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "credentialType": "reprint", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RequestCredentials_Transactions_Qrcode_All_Valid_Smoke_sid: + endPoint: /resident/v1/req/credential + uniqueIdentifier: TC_Resident_RequestCredentials_51 + description: Request QRcode transactions credentials using UIN with all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/CredentialIssuance/RequestCredentials/reqCredential + outputTemplate: resident/CredentialIssuance/RequestCredentials/ReqCredentialResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "credentialType": "qrcode", + "encrypt": "true", + "version": "v1", + "encryptionKey": "abc123", + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredentialResult.hbs b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredentialResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/ReqCredentialResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredential.hbs b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredential.hbs new file mode 100644 index 00000000000..63e850f4d36 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredential.hbs @@ -0,0 +1,19 @@ +{ + "id": "string", + "request": { + "additionalData": {}, + "credentialType": "{{credentialType}}", + "encrypt": "{{encrypt}}", + "encryptionKey": "{{encryptionKey}}", + "individualId": "{{individualId}}", + "issuer": "mpartner-default-print", + "otp": "{{otp}}", + "recepiant": "", + "sharableAttributes": [ + ], + "transactionID": "{{transactionID}}", + "user": "string" + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData.hbs b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData.hbs new file mode 100644 index 00000000000..7d87d8986a8 --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithAdditionalData.hbs @@ -0,0 +1,19 @@ +{ + "id": "string", + "request": { + "additionalData": {"aliasName":"Optional"}, + "credentialType": "{{credentialType}}", + "encrypt": "{{encrypt}}", + "encryptionKey": "{{encryptionKey}}", + "individualId": "{{individualId}}", + "issuer": "mpartner-default-print", + "otp": "{{otp}}", + "recepiant": "", + "sharableAttributes": [ + ], + "transactionID": "{{transactionID}}", + "user": "string" + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes.hbs b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes.hbs new file mode 100644 index 00000000000..f775613c95e --- /dev/null +++ b/api-test/src/main/resources/resident/CredentialIssuance/RequestCredentials/reqCredentialWithSharableAttributes.hbs @@ -0,0 +1,19 @@ +{ + "id": "string", + "request": { + "additionalData": {}, + "credentialType": "{{credentialType}}", + "encrypt": "{{encrypt}}", + "encryptionKey": "{{encryptionKey}}", + "individualId": "{{individualId}}", + "issuer": "mpartner-default-print", + "otp": "{{otp}}", + "recepiant": "", + "sharableAttributes": ["address" + ], + "transactionID": "{{transactionID}}", + "user": "string" + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.hbs b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.hbs new file mode 100644 index 00000000000..d0ec96a5b79 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.hbs @@ -0,0 +1,4 @@ +{ + "transactionId": "{{transactionId}}", + "docId": "{{docId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.yml b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.yml new file mode 100644 index 00000000000..913f9f10b07 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDoc.yml @@ -0,0 +1,306 @@ +DeleteDoc: + Resident_DeleteDoc_uin_all_Valid_Smoke: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_01 + description: Delete document using a valid UIN with all valid inputs + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/DocumentController/DeleteDoc/DeleteDocResult + input: '{ + "transactionId": "1234567889", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "status": "SUCCESS" +}' + + Resident_DeleteDoc_vid_all_Valid_Smoke: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_02 + description: Delete document using a valid VID with all valid inputs + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/DocumentController/DeleteDoc/DeleteDocResult + input: '{ + "transactionId": "1234567789", + "docId": "$ID:UploadDocument_vid_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "status": "SUCCESS" +}' + + Resident_DeleteDoc_uin_Invalid_TransactionId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_03 + description: Delete document using a valid UIN with an invalid transactionId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_Format_TransactionId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_04 + description: Delete document using a valid UIN with an invalid format transactionId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_TransactionId_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_05 + description: Delete document using a valid UIN with an invalid transactionId and docId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid$#$%", + "docId": "Invalid$$#$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_Format_TransactionId_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_06 + description: Delete document using a valid UIN with an invalid format transactionId and docId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid", + "docId": "Invalid" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_07 + description: Delete document using a valid UIN with an invalid docId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "Invalid" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_Format_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_08 + description: Delete document using a valid UIN with an invalid format docId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "4324567222" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' + + Resident_DeleteDoc_uin_Invalid_Token_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_09 + description: Delete document using a valid UIN with an invalid token + role: null + validityCheckRequired: true + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_TransactionId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_10 + description: Delete document using a valid VID with an invalid transactionId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid", + "docId": "$ID:UploadDocument_vid_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_Format_TransactionId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_11 + description: Delete document using a valid VID with an invalid format transactionId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324", + "docId": "$ID:UploadDocument_vid_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_TransactionId_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_12 + description: Delete document using a valid UIN with an invalid token + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid$#$%", + "docId": "Invalid$$#$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_Format_TransactionId_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_13 + description: Delete document using a valid VID with an invalid format transactionId and docId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "Invalid", + "docId": "Invalid" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_14 + description: Delete document using a valid VID with an invalid docId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "1234567789", + "docId": "Invalid" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' + + Resident_DeleteDoc_vid_Invalid_Format_DocId_Neg: + endPoint: /resident/v1/documents/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_DeleteDoc_15 + description: Delete document using a valid VID with an invalid format docId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/DeleteDoc/DeleteDoc + outputTemplate: resident/error + input: '{ + "transactionId": "1234567789", + "docId": "4324567222" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDocResult.hbs b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDocResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/DeleteDoc/DeleteDocResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.hbs b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.hbs new file mode 100644 index 00000000000..d0ec96a5b79 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.hbs @@ -0,0 +1,4 @@ +{ + "transactionId": "{{transactionId}}", + "docId": "{{docId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.yml b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.yml new file mode 100644 index 00000000000..882a213ac28 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocId.yml @@ -0,0 +1,145 @@ +GetDocByDocId: + Resident_GetDocByDocId_uin_all_Valid_Smoke: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_01 + description: Get the document by docId using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocIdResult + input: '{ + "transactionId": "1234567889", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + +}' + + Resident_GetDocByDocId_vid_all_Valid_Smoke: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_02 + description: Get the document by docId using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocIdResult + input: '{ + "transactionId": "1234567789", + "docId": "$ID:UploadDocument_vid_all_Valid_Smoke_sid_docId$" +}' + output: '{ + +}' + + Resident_GetDocByDocId_uin_Invalid_TransactionId: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_03 + description: Get the document by docId using a valid UIN with an invalid transactionId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_GetDocByDocId_uin_Invalid_docId: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_04 + description: Get the document by docId using a valid UIN with an invalid docId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "jhgf4324" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' + + Resident_GetDocByDocId_uin_Invalid_Token: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_05 + description: Get the document by docId using a valid UIN with an invalid token + role: null + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "$ID:UploadDocument_uin_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_GetDocByDocId_vid_Invalid_TransactionId: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_06 + description: Get the document by docId using a valid VID with an invalid transactionId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324", + "docId": "$ID:UploadDocument_vid_all_Valid_Smoke_sid_docId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_GetDocByDocId_vid_Invalid_docId: + endPoint: /resident/v1/document/{docId}?transactionId={transactionId} + uniqueIdentifier: TC_Resident_GetDocByDocId_07 + description: Get the document by docId using a valid VID with an invalid docId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DocumentController/GetDocByDocId/GetDocByDocId + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889", + "docId": "jhgf4324" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- documentId" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocIdResult.hbs b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocIdResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByDocId/GetDocByDocIdResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.hbs b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.hbs new file mode 100644 index 00000000000..edf160c5337 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.hbs @@ -0,0 +1,3 @@ +{ + "transactionId": "{{transactionId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.yml b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.yml new file mode 100644 index 00000000000..ddaaeadffed --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransId.yml @@ -0,0 +1,91 @@ +GetDocByTransId: + Resident_GetDocByTransId_uin_all_Valid_Smoke: + endPoint: /resident/v1/documents/{transactionId} + uniqueIdentifier: TC_Resident_GetDocByTransId_01 + description: Get the document by transactionId using a valid UIN with all valid inputs + role: residentNew + restMethod: get + auditLogCheck: true + inputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransId + outputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransIdResult + input: '{ + "transactionId": "1234567889" +}' + output: '{ + "transactionId": "1234567889" +}' + + Resident_GetDocByTransId_vid_all_Valid_Smoke: + endPoint: /resident/v1/documents/{transactionId} + uniqueIdentifier: TC_Resident_GetDocByTransId_02 + description: Get the document by transactionId using a valid VID with all valid inputs + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransId + outputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransIdResult + input: '{ + "transactionId": "1234567789" +}' + output: '{ + "transactionId": "1234567789" +}' + + Resident_GetDocByTransId_uin_Invalid_TransactionId: + endPoint: /resident/v1/documents/{transactionId} + uniqueIdentifier: TC_Resident_GetDocByTransId_03 + description: Get the document by transactionId using a valid UIN with an invalid transactionId + role: residentNew + restMethod: get + inputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransId + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' + + Resident_GetDocByTransId_Invalid_Token: + endPoint: /resident/v1/documents/{transactionId} + uniqueIdentifier: TC_Resident_GetDocByTransId_04 + description: Get the document by transactionId using a valid UIN with an invalid token + role: null + restMethod: get + inputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransId + outputTemplate: resident/error + input: '{ + "transactionId": "1234567889" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_GetDocByTransId_vid_Invalid_TransactionId: + endPoint: /resident/v1/documents/{transactionId} + uniqueIdentifier: TC_Resident_GetDocByTransId_05 + description: Get the document by transactionId using a valid VID with an invalid transactionId + role: residentNewVid + restMethod: get + inputTemplate: resident/DocumentController/GetDocByTransId/GetDocByTransId + outputTemplate: resident/error + input: '{ + "transactionId": "jhgf4324" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionId" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransIdResult.hbs b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransIdResult.hbs new file mode 100644 index 00000000000..94786522a0e --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/GetDocByTransId/GetDocByTransIdResult.hbs @@ -0,0 +1,7 @@ +{ + "response": [ + { + "transactionId": "{{transactionId}}" + } + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.hbs b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.hbs new file mode 100644 index 00000000000..6c1b1f59055 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.hbs @@ -0,0 +1,9 @@ +{ + "referenceId" : "{{referenceId}}", + "docCatCode" : "{{docCatCode}}", + "docTypCode" : "{{docTypCode}}", + "langCode" : "{{langCode}}", + "transactionId": "{{transactionId}}", + "filePath": "{{filePath}}", + "fileKeyName": "{{fileKeyName}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.yml b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.yml new file mode 100644 index 00000000000..69adaf9da25 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocument.yml @@ -0,0 +1,409 @@ +UploadDocument: + Resident_UploadDocument_uin_all_Valid_Smoke_sid: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_01 + description: Upload the document using a valid UIN with all valid inputs + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/DocumentController/UploadDocument/UploadDocumentResult + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "poa", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "transactionId": "1234567889", + "docId": "$IGNORE$", + "docName": "doc_POA.pdf", + "docCatCode": "poa", + "docTypCode": "doc008", + "docFileFormat": "pdf" +}' + + Resident_UploadDocument_vid_all_Valid_Smoke_sid: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_02 + description: Upload the document using a valid VID with all valid inputs + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/DocumentController/UploadDocument/UploadDocumentResult + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "poa", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "transactionId": "1234567789", + "docId": "$IGNORE$", + "docName": "doc_POA.pdf", + "docCatCode": "poa", + "docTypCode": "doc008", + "docFileFormat": "pdf" +}' + + Resident_UploadDocument_uin_Large_File_Neg: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_03 + description: Upload the document using a valid UIN with large file + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/randomFile.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-514", + "message": "$IGNORE$" + } + ] +}' + + Resident_UploadDocument_uin_Invalid_File_Neg: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_04 + description: Upload the document using a valid UIN with an invalid file + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/UploadDocument.hbs", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-516", + "message": "$IGNORE$" + } + ] +}' + + Resident_UploadDocument_uin_Empty_docTypCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_05 + description: Upload the document using a valid UIN with an empty docTypeCode + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_uin_Blank_DoccatCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_06 + description: Upload the document using a valid UIN with blank doccatCode + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_uin_Invalid_LangCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_07 + description: Upload the document using a valid UIN with an invalid langCode + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "hinn", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_uin_Empty_langCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_08 + description: Upload the document using a valid UIN with an empty langCode + role: residentNew + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_Invalid_Token: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_09 + description: Upload the document using an invalid token + role: null + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_UploadDocument_StatusCode_Empty_Token: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_10 + description: Upload the document with an empty token and check statusCode + role: + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567889", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: "401" + + Resident_UploadDocument_vid_Large_File_Neg: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_11 + description: Upload the document using a valid VID with large file + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/randomFile.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-514", + "message": "$IGNORE$" + } + ] +}' + + Resident_UploadDocument_vid_Invalid_File_Neg: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_12 + description: Upload the document using a valid VID with an invalid file + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/UploadDocument.hbs", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-516", + "message": "$IGNORE$" + } + ] +}' + + Resident_UploadDocument_vid_Empty_docTypCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_13 + description: Upload the document using a valid VID with an empty docTypCode + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "", + "langCode" : "$1STLANG$", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_vid_Blank_DoccatCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_14 + description: Upload the document using a valid VID with blank DoccatCode + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "", + "docTypCode" : "doc008", + "langCode" : "$1STLANG$", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_vid_Invalid_LangCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_15 + description: Upload the document using a valid VID with an invalid langCode + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "hinn", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' + + Resident_UploadDocument_vid_Empty_langCode: + endPoint: /resident/v1/documents/{transactionId}?docCatCode={docCatCode}&docTypCode={docTypCode}&langCode={langCode}&referenceId={referenceId} + uniqueIdentifier: TC_Resident_UploadDocument_16 + description: Upload the document using a valid VID with an empty langCode + role: residentNewVid + restMethod: post + inputTemplate: resident/DocumentController/UploadDocument/UploadDocument + outputTemplate: resident/error + input: '{ + "referenceId" : "mosip123", + "docCatCode" : "POA", + "docTypCode" : "doc008", + "langCode" : "", + "transactionId": "1234567789", + "filePath": "resident/DocumentController/UploadDocument/doc_POA.pdf", + "fileKeyName": "file" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Bad Request" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocumentResult.hbs b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocumentResult.hbs new file mode 100644 index 00000000000..b927a084e48 --- /dev/null +++ b/api-test/src/main/resources/resident/DocumentController/UploadDocument/UploadDocumentResult.hbs @@ -0,0 +1,10 @@ +{ + "response": { + "transactionId": "{{transactionId}}", + "docId": "{{docId}}", + "docName": "{{docName}}", + "docCatCode": "{{docCatCode}}", + "docTypCode": "{{docTypCode}}", + "docFileFormat": "{{docFileFormat}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DocumentController/UploadDocument/doc_POA.pdf b/api-test/src/main/resources/resident/DocumentController/UploadDocument/doc_POA.pdf new file mode 100644 index 00000000000..7fdb4cac39a Binary files /dev/null and b/api-test/src/main/resources/resident/DocumentController/UploadDocument/doc_POA.pdf differ diff --git a/api-test/src/main/resources/resident/DocumentController/UploadDocument/randomFile.pdf b/api-test/src/main/resources/resident/DocumentController/UploadDocument/randomFile.pdf new file mode 100644 index 00000000000..45fb4416061 Binary files /dev/null and b/api-test/src/main/resources/resident/DocumentController/UploadDocument/randomFile.pdf differ diff --git a/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.hbs b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.hbs new file mode 100644 index 00000000000..7233f828abb --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.hbs @@ -0,0 +1,6 @@ +{ + "langcode":"{{langcode}}", + "longitude":"{{longitude}}", + "latitude":"{{latitude}}", + "proximitydistance":{{proximitydistance}} +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.yml b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.yml new file mode 100644 index 00000000000..29e7db8a535 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCen.yml @@ -0,0 +1,114 @@ +DownloadNearestRegCen: + Resident_DownloadNearestRegCen_allValid_smoke: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_01 + description: Download nearest registration center using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCenResult + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + +}' + + Resident_DownloadNearestRegCen_Invalid_Langcode_Neg: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_02 + description: Download nearest registration center using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/error + input: '{ + "langcode": "engg", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + +}' + + Resident_DownloadNearestRegCen_Invalid_Latitude_Neg: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_03 + description: Download nearest registration center using an invalid latitude + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "134.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + +}' + + Resident_DownloadNearestRegCen_Invalid_Proximitydistance_Neg: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_04 + description: Download nearest registration center using an invalid proximitydistance + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "tt", + "longitude": "-6.453275" +}' + output: '{ + +}' + + Resident_DownloadNearestRegCen_Invalid_Longitude_Neg: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_05 + description: Download nearest registration center using an invalid longitude + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "tt" +}' + output: '{ + +}' + + Resident_DownloadNearestRegCen_Invalid_All_Inputs_Neg: + endPoint: /resident/v1/download/nearestRegistrationcenters + uniqueIdentifier: TC_Resident_DownloadNearestRegCen_06 + description: Download nearest registration center using all invalid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadNearestRegCen/DownloadNearestRegCen + outputTemplate: resident/error + input: '{ + "langcode": "engg", + "latitude": "134.52117", + "proximitydistance": "tt", + "longitude": "tt" +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCenResult.hbs b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCenResult.hbs new file mode 100644 index 00000000000..91ad89c2350 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadNearestRegCen/DownloadNearestRegCenResult.hbs @@ -0,0 +1,13 @@ +{} + + + + + + + + + + + + diff --git a/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.hbs b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.hbs new file mode 100644 index 00000000000..1fe93e5e02a --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.hbs @@ -0,0 +1,5 @@ +{ + "langcode":"{{langcode}}", + "hierarchylevel":"{{hierarchylevel}}", + "name":"{{name}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.yml b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.yml new file mode 100644 index 00000000000..78bdc75d48d --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetails.yml @@ -0,0 +1,90 @@ +DownloadRegCenterDetails: + Resident_DownloadRegCenterDetails_all_Valid_Smoke: + endPoint: /resident/v1/download/registrationcenters + uniqueIdentifier: TC_Resident_DownloadRegCenterDetails_01 + description: Download registration center details using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetails + outputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetailsResult + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "5", + "name": "10112" +}' + output: '{ + +}' + + Resident_DownloadRegCenterDetails_Invalid_Langcode_Neg: + endPoint: /resident/v1/download/registrationcenters + uniqueIdentifier: TC_Resident_DownloadRegCenterDetails_02 + description: Download registration center details using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetails + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "hierarchylevel": "5", + "name": "10112" +}' + output: '{ + +}' + + Resident_DownloadRegCenterDetails_Invalid_Hierarchylevel_Neg: + endPoint: /resident/v1/download/registrationcenters + uniqueIdentifier: TC_Resident_DownloadRegCenterDetails_03 + description: Download registration center details using an invalid hierarchylevel + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetails + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "sdsd#@", + "name": "10112" +}' + output: '{ + +}' + + Resident_DownloadRegCenterDetails_Invalid_Name_Neg: + endPoint: /resident/v1/download/registrationcenters + uniqueIdentifier: TC_Resident_DownloadRegCenterDetails_04 + description: Download registration center details using an invalid name + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetails + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "5", + "name": "10@##112" +}' + output: '{ + +}' + + Resident_DownloadRegCenterDetails_Invalid_All_Input_Neg: + endPoint: /resident/v1/download/registrationcenters + uniqueIdentifier: TC_Resident_DownloadRegCenterDetails_05 + description: Download registration center details using all invalid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadRegCenterDetails/DownloadRegCenterDetails + outputTemplate: resident/error + input: '{ + "langcode": "engg", + "hierarchylevel": "5sd", + "name": "10@##112" +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetailsResult.hbs b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetailsResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadRegCenterDetails/DownloadRegCenterDetailsResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.hbs b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.hbs new file mode 100644 index 00000000000..c76f3fcac99 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.hbs @@ -0,0 +1,12 @@ +{ + "languageCode": "{{languageCode}}", + "pageStart": "{{pageStart}}", + "pageFetch": "{{pageFetch}}", + "fromDateTime": "{{fromDateTime}}", + "toDateTime": "{{toDateTime}}", + "sortType": "{{sortType}}", + "serviceType": "{{serviceType}}", + "statusFilter": "{{statusFilter}}", + "searchText": "{{searchText}}", + "eventReqDateTime": "{{eventReqDateTime}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.yml b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.yml new file mode 100644 index 00000000000..b7de1d6d77a --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistory.yml @@ -0,0 +1,425 @@ +DownloadServiceHistory: + Resident_DownloadServiceHistory_uin_all_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_01 + description: Download service history using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_Invalid_User_Neg: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_02 + description: Download service history using a valid UIN with an invalid user + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_Missing_LangCode_Neg: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_03 + description: Download service history using a valid UIN with missing langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$REMOVE$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_FromDate_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_04 + description: Download service history using a valid UIN with valid fromdate + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "2022-12-07T12:35:23.994Z", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_ToDate_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_05 + description: Download service history using a valid UIN with valid todate + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$TIMESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_PageStart_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_06 + description: Download service history using a valid UIN with valid pagestart + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "0", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_ServiceType_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_07 + description: Download service history using a valid UIN with valid servicetype + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "ID_MANAGEMENT_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_SortType_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_08 + description: Download service history using a valid UIN with valid sorttype + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "ASC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_uin_StatusFilter_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_09 + description: Download service history using a valid UIN with valid statusfilter + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "in-progress,success,failed", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_all_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_10 + description: Download service history using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_Missing_LangCode_Neg: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_11 + description: Download service history using a valid VID with missing langcode + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$REMOVE$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_FromDate_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_12 + description: Download service history using a valid VID with valid fromdate + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "2022-12-07T12:35:23.994Z", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_ToDate_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_13 + description: Download service history using a valid VID with valid todate + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$TIMESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_PageStart_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_14 + description: Download service history using a valid VID with valid pagestart + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "0", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_ServiceType_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_15 + description: Download service history using a valid VID with valid servicetype + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "ID_MANAGEMENT_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_SortType_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_16 + description: Download service history using a valid VID with valid sorttype + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "ASC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' + + Resident_DownloadServiceHistory_vid_StatusFilter_Valid_Smoke: + endPoint: /resident/v1/download/service-history + uniqueIdentifier: TC_Resident_DownloadServiceHistory_17 + description: Download service history using a valid VID with valid statusfilter + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadServiceHistory/DownloadServiceHistory + outputTemplate: resident/DownloadServiceHistory/DownloadServiceHistoryResult + input: '{ + "languageCode": "$1STLANG$", + "pageStart": "$REMOVE$", + "pageFetch": "$REMOVE$", + "fromDateTime": "$REMOVE$", + "toDateTime": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "in-progress,success,failed", + "searchText": "$REMOVE$", + "eventReqDateTime": "$REMOVE$" +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistoryResult.hbs b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistoryResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadServiceHistory/DownloadServiceHistoryResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.hbs b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.hbs new file mode 100644 index 00000000000..1411d9415c7 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.hbs @@ -0,0 +1,3 @@ +{ + "langcode":"{{langcode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.yml b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.yml new file mode 100644 index 00000000000..675cb30e292 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocs.yml @@ -0,0 +1,92 @@ +DownloadSupportingDocs: + Resident_DownloadSupportingDocs_all_Valid_smoke: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_01 + description: Download supporting documents using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocsResult + input: '{ + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_DownloadSupportingDocs_Valid_smoke: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_02 + description: Download supporting documents using valid data + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocsResult + input: '{ + "langcode":"$2NDLANG$" +}' + output: '{ + +}' + + Resident_DownloadSupportingDocs_Empty_Lang_Neg: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_03 + description: Download supporting documents using an empty langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/error + input: '{ + "langcode":"" +}' + output: '{ + +}' + + Resident_DownloadSupportingDocs_Invalid_token_Neg: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_04 + description: Download supporting documents using an invalid token + role: invalid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_DownloadSupportingDocs_Invalid_lang_Neg: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_05 + description: Download supporting documents using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/error + input: '{ + "langcode":"$1!ee$" +}' + output: '{ +}' + + Resident_DownloadSupportingDocs_Absent_langCode_Neg: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_DownloadSupportingDocs_06 + description: Download supporting documents using an absent langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadSupportingDocs/DownloadSupportingDocs + outputTemplate: resident/error + input: '{ + "langcode":"$REMOVE$" +}' + output: '{ +}' diff --git a/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocsResult.hbs b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocsResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadSupportingDocs/DownloadSupportingDocsResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.hbs b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.hbs new file mode 100644 index 00000000000..3205fb66bf2 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.resident.download.uin.card", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "otp": "{{otp}}" + } +} diff --git a/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.yml b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.yml new file mode 100644 index 00000000000..3522b88c1da --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCard.yml @@ -0,0 +1,294 @@ +DownloadUinCard: + Resident_DownloadUinCard_all_Valid_Smoke: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_01 + description: Download UIN card using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + auditLogCheck: true + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" +} +}' + + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_With_Invalid_OTP_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_02 + description: Download UIN card with an invalid OTP + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "198365@@eeG", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-457", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Invalid_TransactionID_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_03 + description: Download UIN card using an invalid transactionId + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "213$@As", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-457", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Empty_TransactionID_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_04 + description: Download UIN card using an empty transactionId + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-457", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Invalid_Otp_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_05 + description: Download UIN card using an invalid OTP + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "123456", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-410", + "message": "Invalid input parameter - otp" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Empty_Otp_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_06 + description: Download UIN card using an empty OTP + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Invalid_IndividualID_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_07 + description: Download UIN card using an invalid individualId + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "individualId": "Asad#@11", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_DownloadUinCard_Empty_IndividualID_Neg: + endPoint: /resident/v1/download-card + uniqueIdentifier: TC_Resident_DownloadUinCard_08 + description: Download UIN card using an empty individualId + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/DownloadUinCard/DownloadUinCard + outputTemplate: resident/DownloadUinCard/DownloadUinCardResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "individualId": "", + "requesttime": "$TIMESTAMP$", + "sendOtp":{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "sendOtpReqTemplate": "resident/ReqAidOtp/ReqAidOtp", + "sendOtpEndPoint": "/resident/v1/individualId/otp" + } +}' + + output: '{ + "errors": [{ + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + }], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/ReqAidOtp/ReqAidOtpResult", + "maskedEmail": "$IGNORE$" + } +}' + \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCardResult.hbs b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCardResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCard/DownloadUinCardResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.hbs b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.hbs new file mode 100644 index 00000000000..b879b13dfab --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.hbs @@ -0,0 +1,3 @@ +{ + "eventId": "{{eventId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.yml b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.yml new file mode 100644 index 00000000000..e5557ebc001 --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventId.yml @@ -0,0 +1,113 @@ +DownloadUinCardByEventId: + Resident_DownloadUinCardByEventId_uin_all_Valid_Smoke: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_01 + description: Download UIN card by eventId using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventIdResult + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_DownloadUinCardByEventId_vid_all_Valid_Smoke: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_02 + description: Download UIN card by eventId using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventIdResult + input: '{ + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_DownloadUinCardByEventId_uin_Invalid_EventId_Neg: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_03 + description: Download UIN card by eventId using a valid UIN with an invalid eventId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/error + input: '{ + "eventId": "SDSD#$#" +}' + output: '{ + +}' + + Resident_DownloadUinCardByEventId_vid_Invalid_EventId_Neg: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_04 + description: Download UIN card by eventId using a valid VID with an invalid eventId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/error + input: '{ + "eventId": "SDSD#$#" +}' + output: '{ + "errors": { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } +}' + + Resident_DownloadUinCardByEventId_uin_Without_Token_Neg: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_05 + description: Download UIN card by eventId using a valid UIN without token + role: + validityCheckRequired: true + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/error + input: '{ + "eventId": "djnskdj" +}' + output: '{ + [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] + +}' + + Resident_DownloadUinCardByEventId_uin_Diff_User_Neg: + endPoint: /resident/v1/download-card/event/{eventId} + uniqueIdentifier: TC_Resident_DownloadUinCardByEventId_06 + description: Download UIN card by eventId using a valid UIN with different user + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: get + inputTemplate: resident/DownloadUinCardByEventId/DownloadUinCardByEventId + outputTemplate: resident/error + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventIdResult.hbs b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventIdResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/DownloadUinCardByEventId/DownloadUinCardByEventIdResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateToken/GenerateToken.hbs b/api-test/src/main/resources/resident/GenerateToken/GenerateToken.hbs new file mode 100644 index 00000000000..142c11d620b --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateToken/GenerateToken.hbs @@ -0,0 +1,8 @@ +{ + "grant_type": "{{grant_type}}", + "code": "{{code}}", + "client_id": "{{client_id}}", + "client_assertion_type": "{{client_assertion_type}}", + "client_assertion": "{{client_assertion}}", + "redirect_uri": "{{redirect_uri}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateToken/GenerateToken.yml b/api-test/src/main/resources/resident/GenerateToken/GenerateToken.yml new file mode 100644 index 00000000000..ab20018e35a --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateToken/GenerateToken.yml @@ -0,0 +1,42 @@ +GenerateToken: + Resident_ESignet_GenerateToken_UIN_Cookie_Valid_Smoke_sid: + endPoint: $GETENDPOINTFROMRESIDENTACTUATOR$ + uniqueIdentifier: Dependent_ESignet_GenerateToken_01 + description: Generate esignet authorization token using a valid UIN with cookie + role: resident + validityCheckRequired: true + restMethod: post + inputTemplate: resident/GenerateToken/GenerateToken + outputTemplate: resident/GenerateToken/GenerateTokenResult + input: '{ + "grant_type": "authorization_code", + "code": "$ID:ESignet_AuthorizationCode_uin_All_Valid_Smoke_sid_code$", + "client_id": "$OIDCCLIENT$", + "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", + "client_assertion": "$ID:SignJWT_all_Valid_Smoke_sid_jwtSignedData$", + "redirect_uri": "$ID:ESignet_AuthorizationCode_uin_All_Valid_Smoke_sid_redirectUri$" +}' + output: '{ + "token_type": "Bearer" +}' + + Resident_ESignet_GenerateToken_Vid_Cookie_Valid_Smoke_sid: + endPoint: $GETENDPOINTFROMRESIDENTACTUATOR$ + uniqueIdentifier: Dependent_ESignet_GenerateToken_02 + description: Generate esignet authorization token using a valid VID with cookie + role: resident + validityCheckRequired: true + restMethod: post + inputTemplate: resident/GenerateToken/GenerateToken + outputTemplate: resident/GenerateToken/GenerateTokenResult + input: '{ + "grant_type": "authorization_code", + "code": "$ID:ESignet_AuthorizationCode_Vid_All_Valid_Smoke_sid_code$", + "client_id": "$OIDCCLIENT$", + "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", + "client_assertion": "$ID:SignJWT_all_Valid_Smoke_sid_jwtSignedData$", + "redirect_uri": "$ID:ESignet_AuthorizationCode_Vid_All_Valid_Smoke_sid_redirectUri$" +}' + output: '{ + "token_type": "Bearer" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateToken/GenerateTokenResult.hbs b/api-test/src/main/resources/resident/GenerateToken/GenerateTokenResult.hbs new file mode 100644 index 00000000000..c323e20a77e --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateToken/GenerateTokenResult.hbs @@ -0,0 +1,3 @@ +{ + "token_type": "{{token_type}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/ReGenerateVID.yml b/api-test/src/main/resources/resident/GenerateVID/ReGenerateVID.yml new file mode 100644 index 00000000000..77b552e6c37 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/ReGenerateVID.yml @@ -0,0 +1,69 @@ +ReGenerateVID: + Resident_ReGenerateVID_All_Valid_Smoke_Perpetual_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_ReGenerateVID_01 + description: Regenerate perpetual VID using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_ReGenerateVID_All_Valid_Smoke_Temp_VID_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_ReGenerateVID_02 + description: Regenerate temporary VID using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.hbs new file mode 100644 index 00000000000..deb1b29b6fa --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.hbs @@ -0,0 +1,12 @@ +{ + "id": "{{id}}", + "request": { + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "otp": "{{otp}}", + "transactionID": "{{transactionID}}", + "vidType": "{{vidType}}" + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.yml b/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.yml new file mode 100644 index 00000000000..2252c805b65 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVID.yml @@ -0,0 +1,3259 @@ +GenerateVID: + Resident_Generate_Perpetual_VID_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_01 + description: Generate perpetual VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_Generate_Perpetual_VID_Valid_Smoke_send_otp_with_max_email_character_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_02 + description: Generate a perpetual VID by sending an OTP to an email ID with maximum character + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_maximum_email_character_smoke_Pos11111111111111_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_maximum_email_character_smoke_Pos11111111111111_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_maximum_email_character_smoke_Pos11111111111111_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_With_InValid_UIN: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_03 + description: Generate perpetual VID using an invalid UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "1272Y@GDGDG", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_04 + description: Generate temporary VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temporary_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_05 + description: Generate VID for temporary using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temp_VID_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_06 + description: Generate temporary VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_07 + description: Generate Onetimeuse VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_All_Valid_Smoke_Perpetual_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_08 + description: Generate perpetual VID using all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_All_Valid_Smoke_Temp_VID_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_09 + description: Generate temporary VID using all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_All_Valid_Smoke_OneTimeUse_VID_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_10 + description: Generate Onetimeuse VID using all valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Perp_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_11 + description: Generate temporary VID using perpetual VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Temp_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_12 + description: Generate temporary VID using temporary VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Temp_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Temp_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Onetimeuse_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_13 + description: Generate perpetual VID using Onetimeuse VID + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Onetimeuse_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Onetimeuse_VID_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_invalid_version_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_14 + description: Generate VID using an invalid version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "@er45", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_missing_version_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_15 + description: Generate VID using missing version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "$REMOVE$", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_invalid_individualId_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_16 + description: Generate VID using an invalid individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "@345esddd", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_missing_individualId_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_17 + description: Generate VID using missing individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_invalid_Timestamp_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_18 + description: Generate VID using an invalid timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "ESTA", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PEXP_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + + Resident_GenerateVID_missing_Timestamp_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_19 + description: Generate VID using missing timestamp + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$REMOVE$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PEXP_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_MISSING_OTP_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_20 + description: Generate VID using missing OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$REMOVE$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Invalid_OTP_Temp_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_21 + description: Generate temporary VID using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "@34#dds", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Invalid_OTP_Onetimeuse_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_22 + description: Generate Onetimeuse VID using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "@34#dds", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Invalid_OTP_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_23 + description: Generate VID using an invalid OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "@34#dds", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_missing_Id_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_24 + description: Generate VID using missing Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_invalid_Id_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_25 + description: Generate VID using an invalid Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "@3453#", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_InValid_transactionId_Temp_VID: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_26 + description: Generate temporary VID using an invalid transactionId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "1234890", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Positive_PDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_TransactionMismatch_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_27 + description: Generate VID using mismatched transaction + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "1234890", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Perpetual_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_28 + description: Generate perpetual VID using perpetual VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Temp_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_29 + description: Generate perpetual VID using temporary VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Temp_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Onetimeuse_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_30 + description: Generate perpetual VID using an Onetimeuse VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_OneTimeUse_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Perpetual_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_31 + description: Generate temporary VID using perpetual VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Temp_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_32 + description: Generate temporary VID using temporary VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Temp_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Onetimeuse_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_33 + description: Generate temporary VID using an Onetimeuse VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_OneTimeUse_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Perpetual_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_34 + description: Generate an Onetimeuse VID using perpetual VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Temp_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_35 + description: Generate an Onetimeuse VID using temporary VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Temp_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Onetimeuse_VID_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_36 + description: Generate an Onetimeuse VID using an Onetimeuse VID in negative way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_OneTimeUse_VID_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_ValidParam_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParam_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Temp_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_37 + description: Generate perpetual VID using temporary VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Temporary_VID_Using_Perp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Temporary_VID_Using_Perp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Temp_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_38 + description: Generate Onetimeuse VID using temporary VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Temporary_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Temporary_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Perp_VID_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_39 + description: Generate Onetimeuse VID using perpetual VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_Using_Onetimeuse_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_Using_Onetimeuse_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Using_Perpetual_VID_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_40 + description: Generate perpetual VID using perpetual VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Perpetual_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Onetimeuse_VID_Using_Onetimeuse_VID_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_41 + description: Generate Onetimeuse VID using Onetimeuse VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Onetimeuse_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Onetimeuse", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Onetimeuse_VID_Using_Temp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_Using_Onetimeuse_VID_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_42 + description: Generate temporary VID using Onetimeuse VID in positive way + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:Generate_Onetimeuse_VID_Using_Perp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Onetimeuse_VID_Using_Perp_VID_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_TransactionId_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_43 + description: Generate perpetual VID using an empty transactionId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_requesttime_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_44 + description: Generate perpetual VID using an empty requesttime + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_id_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_45 + description: Generate perpetual VID using an empty Id + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_version_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_46 + description: Generate perpetual VID using an empty version + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_vidType_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_47 + description: Generate perpetual VID using an empty vidtype + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-406", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_otp_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_48 + description: Generate perpetual VID using an empty OTP + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_individualId_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_49 + description: Generate perpetual VID using an empty individualId + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Empty_individualIdType_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_50 + description: Generate perpetual VID using an empty individualIdType + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Random_individualIdType_Pos: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_51 + description: Generate perpetual VID using random individualIdType + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Valid_Params_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Valid_Params_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Phone_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_52 + description: Generate perpetual VID using phone and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_PHONE$@phone", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone" + } +}' + + Resident_Generate_Perpetual_VID_Email_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_53 + description: Generate perpetual VID using Email and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_EmptyChannel_Invalid_Neg: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_54 + description: Generate perpetual VID using an empty channel + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParameters_ChannelVerify_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmpty", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "IDA-OTA-008", + "message": "$IGNORE$" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + Resident_GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_55 + description: Generate perpetual VID using revokeUIN and valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_56 + description: Generate one temporary VID using a revoke UIN with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temporary_2_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_57 + description: Generate two temporary VID using a revoke UIN with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temporary_3_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_58 + description: Generate three temporary VID using a revoke UIN with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temporary_4_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_59 + description: Generate four temporary VID using a revoke UIN with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_60 + description: Generate Onetimeuse VID using a revoke UIN with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Esignet_Integ_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_61 + description: Generate perpetual VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_1_Esignet_Integ_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_62 + description: Generate one temporary VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_2_Esignet_Integ_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_63 + description: Generate two temporary VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_3_Esignet_Integ_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_64 + description: Generate three temporary VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_4_Esignet_Integ_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_65 + description: Generate four temporary VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Onetimeuse_Esignet_Integ_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_66 + description: Generate Onetimeuse VID using an esignet integer with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Onetimeuse_GetRid_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_67 + description: Generate Onetimeuse VID to get RID with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_GetRid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_GetRid_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_68 + description: Generate perpetual VID to get RID with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_GetRid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Temp_GetRid_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_69 + description: Generate temporary VID to get RID with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_GetRid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_GetRid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_70 + description: Generate perpetual VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_ForEotp_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_1_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_71 + description: Generate one temporary VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_2_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_72 + description: Generate two temporary VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_3_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_73 + description: Generate three temporary VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Temporary_4_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_74 + description: Generate four temporary VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_GenerateVID_Onetimeuse_ForEotp_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_75 + description: Generate Onetimeuse VID for expire OTP scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ForEotp_Onetime_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_ForEotp_Onetime_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Onetime_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_76 + description: Generate perpetual VID with valid order status + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Perpetual_Inv_Scen_Valid_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_77 + description: Generate perpetual VID for invoice scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_GenerateVID_Onetime_Inv_Scen_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_78 + description: Generate Onetimeuse VID for invoice scenario with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "onetimeuse", + "otp": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Invalid_Scen_Vid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Temporary_VID_ONE_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_79 + description: Generate one temporary VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Genrate_VID_Six_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_Valid_First_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_85 + description: Generate first perpetual VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + + +}' + + Resident_Generate_Perpetual_VID_SecondTime_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_86 + description: Generate perpetual VID secondtime using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + +}' + + Resident_Generate_Perpetual_VID_1_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_87 + description: Generate one perpetual VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + +}' + + Resident_Generate_Perpetual_VID_2_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_88 + description: Generate second perpetual VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + +}' + + Resident_Generate_Perpetual_VID_3_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_89 + description: Generate third perpetual VID using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_ToCreate_Three_PreVid_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + +}' + + Resident_Generate_Temporary_VID_use_3_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_90 + description: Generate temporary VID using three cases with valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Genrate_TempVid_Use_3_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Temporary", + "otp": "$ID:AddIdentity_withValidParameters_To_Genrate_TempVid_Use_3_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Genrate_TempVid_Use_3_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_For_SendOtp_Valid_Smoke_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_91 + description: Generate perpetual VID for send OTP using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_For_SendOtp_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_For_SendOtp_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_For_SendOtp_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_uin_Transactions_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_92 + description: Generate perpetual VID for UIN transactions using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Generate_Perpetual_VID_uin_Transactions_Second_sid: + endPoint: /resident/v1/vid + uniqueIdentifier: TC_Resident_GenerateVID_93 + description: Generate perpetual VID for UIN transactions using valid inputs + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + inputTemplate: resident/GenerateVID/createGenerateVID + outputTemplate: resident/GenerateVID/createGenerateVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid", + "version": "v1", + "vidType": "Perpetual", + "otp": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.hbs new file mode 100644 index 00000000000..788852ec90a --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.hbs @@ -0,0 +1,11 @@ +{ + "id": "{{id}}", + "request": { + "vidType": "{{vidType}}", + "channels": [ + "PHONE","EMAIL" + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.yml b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.yml new file mode 100644 index 00000000000..b6e616355c9 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNew.yml @@ -0,0 +1,609 @@ +GenerateVIDNew: + Resident_GenerateVID_uin_Temporary_VID_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_94 + description: Generate temporary VID using a UIN with valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Temporary" + }' + output: '{ +}' + + Resident_GenerateVID_uin_Temporary_VID2_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_95 + description: Generate second temporary VID using a UIN with valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Temporary" + }' + output: '{ +}' + + Resident_GenerateVID_uin_Onetimeuse_VID_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_96 + description: Generate Onetimeuse VID using a UIN with valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Onetimeuse" + }' + output: '{ +}' + + Resident_Generate_Perpetual_VID_uin_Phone_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_97 + description: Generate perpetual VID using a valid UIN and phone + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNewAsPhone + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ +}' + + Resident_Generate_Perpetual_VID_uin_Email_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_98 + description: Generate perpetual VID using a valid UIN and Email + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNewAsEmail + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "maskedPhone": "$IGNORE$" +}' + + Resident_Generate_Perpetual_VID_BothChannel_uin_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_99 + description: Generate perpetual VID using a valid UIN and both channel + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ +}' + + Resident_Generate_Perpetual_VID_uin_Empty_requesttime_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_101 + description: Generate perpetual VID using a valid UIN with an empty requesttime + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_Id_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_102 + description: Generate perpetual VID using a valid UIN with an empty Id + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_version_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_103 + description: Generate perpetual VID using a valid UIN with an empty version + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_vidType_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_104 + description: Generate perpetual VID using a valid UIN with an empty vidtype + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + + + Resident_Generate_Perpetual_VID_uin_requesttime_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_105 + description: Generate perpetual VID using a valid UIN with an invalid requesttime + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "23553265", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Id_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_106 + description: Generate perpetual VID using a valid UIN with an invalid Id + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "khdfnsld", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_version_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_107 + description: Generate perpetual VID using a valid UIN with an invalid version + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "tt", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_vidType_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_108 + description: Generate perpetual VID using a valid UIN with an invalid vidtype + role: residentNew + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "sdfsdf" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GenerateVID_Perpetual_VID_uin_Valid_Token_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_109 + description: Generate perpetual VID using valid UIN and token + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ +}' + + Resident_GenerateVID_Perpetual_Invalid_Token: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_110 + description: Generate perpetual VID using valid UIN and an invalid token + role: resident + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GenerateVID_Onetimeuse_Using_VID_Valid_Smoke_sid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_111 + description: Generate Onetimeuse VID using a valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/GenerateVID/createGenerateVIDNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Onetimeuse" + }' + output: '{ +}' + + Resident_Generate_Perpetual_VID_TransID_uin_Invalid: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_112 + description: Generate perpetual VID using a valid UIN with an invalid transactionId + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-513", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_EmptyChannel_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_113 + description: Generate perpetual VID using valid UIN with an empty channel + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNewAsEmpty + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-513", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_Empty_TransID_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_114 + description: Generate perpetual VID using a valid UIN with an empty transactionId + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-513", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_requesttime_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_115 + description: Generate perpetual VID using a valid UIN with an empty requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_Id_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_116 + description: Generate perpetual VID using a valid UIN with an empty Id + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_version_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_117 + description: Generate perpetual VID using a valid UIN with an empty version + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Empty_vidType_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_118 + description: Generate perpetual VID using a valid UIN with an empty vidtype + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-406", + "message": "$IGNORE$" + } + ] +}' + + + + Resident_Generate_Perpetual_VID_uin_requesttime_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_119 + description: Generate perpetual VID using a valid UIN with an invalid requesttime + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "23553265", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_Id_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_120 + description: Generate perpetual VID using a valid UIN with an invalid Id + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "khdfnsld", + "version": "1.0", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_version_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_121 + description: Generate perpetual VID using a valid UIN with an invalid version + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "tt", + "vidType": "Perpetual" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_Generate_Perpetual_VID_uin_vidType_Invalid_Neg: + endPoint: /resident/v1/generate-vid + uniqueIdentifier: TC_Resident_GenerateVID_122 + description: Generate perpetual VID using a valid UIN with an invalid vidtype + role: residentNewVid + restMethod: post + inputTemplate: resident/GenerateVID/createGenerateVIDNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.generate", + "version": "1.0", + "vidType": "sdfsdf" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-406", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmail.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmail.hbs new file mode 100644 index 00000000000..ef3329d8220 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmail.hbs @@ -0,0 +1,11 @@ +{ + "id": "{{id}}", + "request": { + "vidType": "{{vidType}}", + "channels": [ + "EMAIL" + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmpty.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmpty.hbs new file mode 100644 index 00000000000..595ab8accd3 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsEmpty.hbs @@ -0,0 +1,9 @@ +{ + "id": "{{id}}", + "request": { + "vidType": "{{vidType}}", + "channels": [] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsPhone.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsPhone.hbs new file mode 100644 index 00000000000..a720f884fb3 --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewAsPhone.hbs @@ -0,0 +1,11 @@ +{ + "id": "{{id}}", + "request": { + "vidType": "{{vidType}}", + "channels": [ + "PHONE" + ] + }, + "requesttime": "{{requesttime}}", + "version": "{{version}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewResult.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDNewResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDResult.hbs b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GenerateVID/createGenerateVIDResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.hbs b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.hbs new file mode 100644 index 00000000000..7bdcf1d965d --- /dev/null +++ b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.hbs @@ -0,0 +1,4 @@ +{ + "langcode": "{{langcode}}", + "templatetypecode": "{{templatetypecode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.yml b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.yml new file mode 100644 index 00000000000..0e251e958a0 --- /dev/null +++ b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode.yml @@ -0,0 +1,212 @@ +GetAllTemplateBylangCodeAndTemplateTypeCode: + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_uin_1_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_01 + description: Get all template by language code and templatetype code using one valid UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_uin_2_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_02 + description: Get all template by language code and templatetype code using second valid UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_uin_3_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_03 + description: Get all template by language code and templatetype code using third valid UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_uin_Invalid_Langcode: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_04 + description: Get all template by language code and templatetype code using valid UIN with an invalid langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-415", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_uin_Invalid_Templatetypecode: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_05 + description: Get all template by language code and templatetype code using valid UIN with an invalid templatetype code + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "SFDV#$#$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-415", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_Invalid_Token: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_06 + description: Get all template by language code and templatetype code using valid UIN with an invalid token + role: invalid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_vid_1_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_07 + description: Get all template by language code and templatetype code using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_vid_2_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_08 + description: Get all template by language code and templatetype code using an another valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_vid_3_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_09 + description: Get all template by language code and templatetype code using an another valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_vid_Invalid_Langcode: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_10 + description: Get all template by language code and templatetype code using a valid VID with an invalid langcode + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "templatetypecode": "mosip.email.template.property" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-415", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_vid_Invalid_Templatetypecode: + endPoint: /resident/v1/auth-proxy/masterdata/templates/{langcode}/{templatetypecode} + uniqueIdentifier: TC_Resident_GetAllTemplateBylangCodeAndTemplateTypeCode_11 + description: Get all template by language code and templatetype code using a valid VID with an invalid templatetype code + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCode + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "templatetypecode": "SFDV#$#$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-415", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult.hbs b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetAllTemplateBylangCodeAndTemplateTypeCode/GetAllTemplateBylangCodeAndTemplateTypeCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAuthLockStatus/GetAuthLockStatus.yml b/api-test/src/main/resources/resident/GetAuthLockStatus/GetAuthLockStatus.yml new file mode 100644 index 00000000000..8c37dd4c1ee --- /dev/null +++ b/api-test/src/main/resources/resident/GetAuthLockStatus/GetAuthLockStatus.yml @@ -0,0 +1,48 @@ +residentNewVid: + Resident_GetAuthLockStatus_uin_all_Valid_Smoke: + endPoint: /resident/v1/auth-lock-status + uniqueIdentifier: TC_Resident_GetAuthLockStatus_01 + description: Get authlock status using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAuthLockStatus/getAuthLockStatus + outputTemplate: resident/GetAuthLockStatus/getAuthLockStatusResult + input: '{ +}' + output: '{ +}' + + Resident_GetAuthLockStatus_Invalid_Token_Neg: + endPoint: /resident/v1/auth-lock-status + uniqueIdentifier: TC_Resident_GetAuthLockStatus_02 + description: Get authlock status using a valid UIN with an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAuthLockStatus/getAuthLockStatus + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetAuthLockStatus_Vid_all_Valid_Smoke: + endPoint: /resident/v1/auth-lock-status + uniqueIdentifier: TC_Resident_GetAuthLockStatus_03 + description: Get authlock status using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetAuthLockStatus/getAuthLockStatus + outputTemplate: resident/GetAuthLockStatus/getAuthLockStatusResult + input: '{ +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatus.hbs b/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatus.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatus.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatusResult.hbs b/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatusResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetAuthLockStatus/getAuthLockStatusResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetChannelVerificationStatus/GetChannelVerificationStatus.yml b/api-test/src/main/resources/resident/GetChannelVerificationStatus/GetChannelVerificationStatus.yml new file mode 100644 index 00000000000..a59e315a22e --- /dev/null +++ b/api-test/src/main/resources/resident/GetChannelVerificationStatus/GetChannelVerificationStatus.yml @@ -0,0 +1,454 @@ +GetChannelVerificationStatus: + Resident_GetChannelVerificationStatus_For_Email_Valid_Smoke: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_01 + description: Get channel verification status for Email with valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"email", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "verificationStatus": "true", + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_For_Phone_all_Valid_Smoke: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_02 + description: Get channel verification status for phone with all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"phone", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_PHONE$@phone", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "verificationStatus": "true", + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Invalid_Channel: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_03 + description: Get channel verification status using an invalid channel + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/error + input: '{ + "channel":"tt", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Invalid_Id: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_04 + description: Get channel verification status using an invalid Id + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/error + input: '{ + "channel":"email", + "individualId":"tt", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-522", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Empty_Channel_Neg: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_05 + description: Get channel verification status using an empty channel + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/error + input: '{ + "channel":"", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Empty_Id_Neg: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_06 + description: Get channel verification status using an empty Id + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/error + input: '{ + "channel":"email", + "individualId":"", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-522", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Email_Valid_Smoke: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_07 + description: Get channel verification status using valid Email + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"email", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "verificationStatus": true, + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } + } +}' + + Resident_GetChannelVerificationStatus_Phone_Valid_Smoke: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_08 + description: Get channel verification status using valid phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"phone", + "individualId":"$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_PHONE$@phone", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "verificationStatus": "true", + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone" + } + } +}' + + Resident_GetChannelVerificationStatus_Email_Invalid: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_09 + description: Get channel verification status using an invalid email + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"email", + "individualId":"$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsPhone", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PDEA_smoke_UIN$", + "otp": "$ID:AddIdentity_Positive_PDEA_smoke_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-OTP-011", + "message": "$IGNORE$" + } + ], + "verificationStatus": "false", + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone", + "validateOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForPhone" + } + } +}' + + Resident_GetChannelVerificationStatus_Phone_Invalid: + endPoint: /resident/v1/channel/verification-status/?channel={channel}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetChannelVerificationStatus_10 + description: Get channel verification status using an invalid phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatus + outputTemplate: resident/GetChannelVerificationStatus/getChannelVerificationStatusResult + input: '{ + "channel":"phone", + "individualId":"$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTPAsEmail", + "sendOtpEndPoint": "/resident/v1/req/otp", + "validateOtp":{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PEXP_smoke_UIN$", + "otp": "$ID:AddIdentity_Positive_PEXP_smoke_EMAIL$", + "validateOtpReqTemplate": "resident/ValidateOTP/ValidateOTP", + "validateOtpEndPoint": "/resident/v1/validate-otp" + } + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-OTP-010", + "message": "$IGNORE$" + } + ], + "verificationStatus": false, + "sendOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$", + "validateOtpResp":{ + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResultForEmail", + "maskedEmail": "$IGNORE$" + } + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatus.hbs b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatus.hbs new file mode 100644 index 00000000000..d4a5ab2198d --- /dev/null +++ b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatus.hbs @@ -0,0 +1,4 @@ +{ + "channel":"{{channel}}", + "individualId":"{{individualId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusNegativeResult.hbs b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusNegativeResult.hbs new file mode 100644 index 00000000000..100bd9efbae --- /dev/null +++ b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusNegativeResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "verificationStatus": false + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusResult.hbs b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusResult.hbs new file mode 100644 index 00000000000..77d27060e7d --- /dev/null +++ b/api-test/src/main/resources/resident/GetChannelVerificationStatus/getChannelVerificationStatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "verificationStatus": "{{verificationStatus}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.hbs b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.hbs new file mode 100644 index 00000000000..9c4bf56e42b --- /dev/null +++ b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.hbs @@ -0,0 +1,4 @@ +{ + "eventId": "{{eventId}}", + "langCode": "{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.yml b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.yml new file mode 100644 index 00000000000..9fa42c05080 --- /dev/null +++ b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatus.yml @@ -0,0 +1,122 @@ +GetCheckEventIdStatus: + Resident_GetCheckEventIdStatus_uin_all_Valid_Smoke: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_01 + description: Get check eventId status using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "langCode": "$1STLANG$" +}' + output: '{ + +}' + + Resident_GetCheckEventIdStatus_vid_all_Valid_Smoke: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_02 + description: Get check eventId status using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$", + "langCode": "$1STLANG$" +}' + output: '{ + +}' + + Resident_GetCheckEventIdStatus_uin_Invalid_eventId_Neg: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_03 + description: Get check eventId status using a valid UIN with an invalid eventId + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/error + input: '{ + "eventId": "164161sdsd##", + "langCode": "$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCheckEventIdStatus_vid_Invalid_eventId_Neg: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_04 + description: Get check eventId status using a valid VID with an invalid eventId + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/error + input: '{ + "eventId": "164161sdsd##", + "langCode": "$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCheckEventIdStatus_uin_Invalid_LangCode_Neg: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_05 + description: Get check eventId status using a valid UIN with an invalid langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/error + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "langCode": "hinn" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCheckEventIdStatus_vid_Invalid_LangCode_Neg: + endPoint: /resident/v1/events/{eventId}?langCode={langCode} + uniqueIdentifier: TC_Resident_GetEventIdStatus_06 + description: Get check eventId status using a valid VID with an invalid langcode + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCheckEventIdStatus/GetCheckEventIdStatus + outputTemplate: resident/error + input: '{ + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$", + "langCode": "hinn" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatusResult.hbs b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatusResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetCheckEventIdStatus/GetCheckEventIdStatusResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/GetCoordinateSpecificRegistrationCenters.yml b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/GetCoordinateSpecificRegistrationCenters.yml new file mode 100644 index 00000000000..89606534618 --- /dev/null +++ b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/GetCoordinateSpecificRegistrationCenters.yml @@ -0,0 +1,296 @@ +GetCoordinateSpecificRegistrationCenters: + Resident_GetCoordinateSpecificRegistrationCenters_allValid_smoke: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_01 + description: Get coordinate specific registration centers using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCentersResult + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ +}' + + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_langCode: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_02 + description: Get coordinate specific registration centers using an invalid langcode + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "engg", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_Latitude: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_03 + description: Get coordinate specific registration centers using an invalid latitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "134.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_Random_Proximity_Distance: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_04 + description: Get coordinate specific registration centers using an invalid random proximitydistance + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "tt", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Random_Longitude: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_05 + description: Get coordinate specific registration centers using random longitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "tt" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Random_Latitude: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_06 + description: Get coordinate specific registration centers using random latitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "tt", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Valid_smoke: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_07 + description: Get coordinate specific registration centers using valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCentersResult + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "100", + "longitude": "-6.453275" +}' + output: '{ + +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_langCode_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_08 + description: Get coordinate specific registration centers using an invalid langcode + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "asd", + "latitude": "34.52117", + "proximitydistance": "100", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_Latitude_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_09 + description: Get coordinate specific registration centers using an invalid latitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "134.52117", + "proximitydistance": "100", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_Proximity_Distance_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_10 + description: Get coordinate specific registration centers using an invalid proximitydistance + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "0", + "longitude": "-6.453275" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_Invalid_Longitude: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_11 + description: Get coordinate specific registration centers using an invalid longitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "999" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetCoordinateSpecificRegistrationCenters_StatusCode_Empty_LangCode_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_12 + description: Get coordinate specific registration centers statuscode using an empty langcode + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: "404" + + Resident_GetCoordinateSpecificRegistrationCenters_StatusCode_Empty_Latitude_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_13 + description: Get coordinate specific registration centers statuscode using an empty latitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "", + "proximitydistance": "21", + "longitude": "-6.453275" +}' + output: "404" + + Resident_GetCoordinateSpecificRegistrationCenters_StatusCode_Empty_Longitude_Neg: + endPoint: /resident/v1/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance} + uniqueIdentifier: TC_Resident_GetRegistrationCentreCoordinates_14 + description: Get coordinate specific registration centers statuscode using an empty longitude + role: resident + restMethod: get + inputTemplate: resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "latitude": "34.52117", + "proximitydistance": "21", + "longitude": "" +}' + output: "404" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters.hbs b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters.hbs new file mode 100644 index 00000000000..7233f828abb --- /dev/null +++ b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCenters.hbs @@ -0,0 +1,6 @@ +{ + "langcode":"{{langcode}}", + "longitude":"{{longitude}}", + "latitude":"{{latitude}}", + "proximitydistance":{{proximitydistance}} +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCentersResult.hbs b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCentersResult.hbs new file mode 100644 index 00000000000..91ad89c2350 --- /dev/null +++ b/api-test/src/main/resources/resident/GetCoordinateSpecificRegistrationCenters/getCoordinateSpecificRegistrationCentersResult.hbs @@ -0,0 +1,13 @@ +{} + + + + + + + + + + + + diff --git a/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.hbs b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.hbs new file mode 100644 index 00000000000..d7f6b339fca --- /dev/null +++ b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.hbs @@ -0,0 +1,4 @@ +{ + "documentcategorycode":"{{documentcategorycode}}", + "langcode":"{{langcode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.yml b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.yml new file mode 100644 index 00000000000..cd0b3fe1d6c --- /dev/null +++ b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypes.yml @@ -0,0 +1,122 @@ +GetDocumentTypes: + Resident_GetDocumentTypes_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_01 + description: Get getdocumenttypes using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/GetDocumentTypes/GetDocumentTypesResult + input: '{ + "documentcategorycode": "POI", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetDocumentTypes1_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_02 + description: Get one getdocumenttypes using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/GetDocumentTypes/GetDocumentTypesResult + input: '{ + "documentcategorycode": "POR", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetDocumentTypes2_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_03 + description: Get second getdocumenttypes using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/GetDocumentTypes/GetDocumentTypesResult + input: '{ + "documentcategorycode": "POE", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetDocumentTypes3_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_04 + description: Get third getdocumenttypes using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/GetDocumentTypes/GetDocumentTypesResult + input: '{ + "documentcategorycode": "POA", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetDocumentTypes4_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_05 + description: Get fourth getdocumenttypes using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/GetDocumentTypes/GetDocumentTypesResult + input: '{ + "documentcategorycode": "POB", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetDocumentTypes_Invalid_Documentcatagorycode_Neg: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_06 + description: Get getdocumenttypes using an invalid documentcategorycode + role: resident + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/error + input: '{ + "documentcategorycode": "$fgf=", + "langcode":"$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetDocumentTypes_Invalid_langcode_Neg: + endPoint: /resident/v1/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode} + uniqueIdentifier: TC_Resident_GetDocumentTypes_07 + description: Get getdocumenttypes using an invalid langcode + role: resident + restMethod: get + inputTemplate: resident/GetDocumentTypes/GetDocumentTypes + outputTemplate: resident/error + input: '{ + "documentcategorycode": "POB", + "langcode":"$tg=" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypesResult.hbs b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypesResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetDocumentTypes/GetDocumentTypesResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.hbs b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.hbs new file mode 100644 index 00000000000..8a1b0827860 --- /dev/null +++ b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.hbs @@ -0,0 +1,4 @@ +{ + "gendertype":"{{gendertype}}", + "langcode":"{{langcode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.yml b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.yml new file mode 100644 index 00000000000..2cd931680b3 --- /dev/null +++ b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCode.yml @@ -0,0 +1,93 @@ +GetGenderCode: + Resident_GetGenderCode_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/gendercode/{gendertype}/{langcode} + uniqueIdentifier: TC_Resident_GetGenderCode_01 + description: Get gendercode using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetGenderCode/GetGenderCode + outputTemplate: resident/GetGenderCode/GetGenderCodeResult + input: '{ + "gendertype": "male", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetGenderCode1_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/gendercode/{gendertype}/{langcode} + uniqueIdentifier: TC_Resident_GetGenderCode_02 + description: Get one gendercode using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetGenderCode/GetGenderCode + outputTemplate: resident/GetGenderCode/GetGenderCodeResult + input: '{ + "gendertype": "female", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetGenderCode2_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/gendercode/{gendertype}/{langcode} + uniqueIdentifier: TC_Resident_GetGenderCode_03 + description: Get another gendercode using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetGenderCode/GetGenderCode + outputTemplate: resident/GetGenderCode/GetGenderCodeResult + input: '{ + "gendertype": "others", + "langcode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetGenderCode_Invalid_GenderType_Neg: + endPoint: /resident/v1/proxy/masterdata/gendercode/{gendertype}/{langcode} + uniqueIdentifier: TC_Resident_GetGenderCode_04 + description: Get gendercode using an invalid gendertype + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetGenderCode/GetGenderCode + outputTemplate: resident/error + input: '{ + "gendertype": "$gyt=", + "langcode":"$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] + +}' + + Resident_GetGenderCode_Invalid_langCode_Neg: + endPoint: /resident/v1/proxy/masterdata/gendercode/{gendertype}/{langcode} + uniqueIdentifier: TC_Resident_GetGenderCode_05 + description: Get gendercode using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetGenderCode/GetGenderCode + outputTemplate: resident/error + input: '{ + "gendertype": "other", + "langcode":"$Yhy= " +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetGenderCode/GetGenderCodeResult.hbs b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetGenderCode/GetGenderCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetIdentityMapping/GetIdentityMapping.yml b/api-test/src/main/resources/resident/GetIdentityMapping/GetIdentityMapping.yml new file mode 100644 index 00000000000..d4cd2c646d7 --- /dev/null +++ b/api-test/src/main/resources/resident/GetIdentityMapping/GetIdentityMapping.yml @@ -0,0 +1,14 @@ +GetIdentityMapping: + Resident_GetIdentityMapping_all_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/config/identity-mapping + uniqueIdentifier: TC_Resident_GetIdentityMapping_01 + description: Get identity mapping using all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetIdentityMapping/getIdentityMapping + outputTemplate: resident/GetIdentityMapping/getIdentityMappingResult + input: '{ +}' + output: '{ +}' diff --git a/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMapping.hbs b/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMapping.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMapping.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMappingResult.hbs b/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMappingResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetIdentityMapping/getIdentityMappingResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/GetImmediateChildrenByLocCodeAndLangCode.yml b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/GetImmediateChildrenByLocCodeAndLangCode.yml new file mode 100644 index 00000000000..d3cea1b61ee --- /dev/null +++ b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/GetImmediateChildrenByLocCodeAndLangCode.yml @@ -0,0 +1,89 @@ +GetImmediateChildrenByLocCodeAndLangCode: + Resident_GetImmediateChildrenByLocCodeAndLangCode_allValid_smoke: + endPoint: /resident/v1/proxy/masterdata/locations/immediatechildren/{locationCode}/{langCode} + uniqueIdentifier: TC_Resident_GetImmediateChildren_01 + description: Get immediate children by location code and language code using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode + outputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCodeResult + input: '{ + "locationCode":"MOR", + "langCode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetImmediateChildrenByLocCodeAndLangCode_Invalid_locationCode: + endPoint: /resident/v1/proxy/masterdata/locations/immediatechildren/{locationCode}/{langCode} + uniqueIdentifier: TC_Resident_GetImmediateChildren_02 + description: Get immediate children by location code and language code using an invalid location code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "locationCode":"abc", + "langCode":"$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetImmediateChildrenByLocCodeAndLangCode_Invalid_langCode: + endPoint: /resident/v1/proxy/masterdata/locations/immediatechildren/{locationCode}/{langCode} + uniqueIdentifier: TC_Resident_GetImmediateChildren_03 + description: Get immediate children by location code and language code using an invalid language code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "locationCode":"KNT", + "langCode":"abc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetImmediateChildrenByLocCodeAndLangCode_StatusCode_Empty_locationCode_Neg: + endPoint: /resident/v1/proxy/masterdata/locations/immediatechildren/{locationCode}/{langCode} + uniqueIdentifier: TC_Resident_GetImmediateChildren_04 + description: Get immediate children by location code and language code using an empty location code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "locationCode":"", + "langCode":"abc" +}' + output: "404" + + Resident_GetImmediateChildrenByLocCodeAndLangCode_StatusCode_Empty_langCode_Neg: + endPoint: /resident/v1/proxy/masterdata/locations/immediatechildren/{locationCode}/{langCode} + uniqueIdentifier: TC_Resident_GetImmediateChildren_05 + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "locationCode":"KNT", + "langCode":"" +}' + output: "404" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode.hbs b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode.hbs new file mode 100644 index 00000000000..e1a9cd52151 --- /dev/null +++ b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCode.hbs @@ -0,0 +1,4 @@ +{ + "locationCode":"{{locationCode}}", + "langCode":"{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCodeResult.hbs b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetImmediateChildrenByLocCodeAndLangCode/getImmediateChildrenByLocCodeAndLangCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetInputAttributeValues/GetInputAttributeValues.yml b/api-test/src/main/resources/resident/GetInputAttributeValues/GetInputAttributeValues.yml new file mode 100644 index 00000000000..0c5e4ea60cb --- /dev/null +++ b/api-test/src/main/resources/resident/GetInputAttributeValues/GetInputAttributeValues.yml @@ -0,0 +1,112 @@ +GetInputAttributeValues: + Resident_GetInputAttributeValues1_UIN_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_01 + description: Get input attribute values using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"update-demographics" +}' + output: '{ +}' + + Resident_GetInputAttributeValues2_UIN_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_02 + description: Get second input attribute values using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"share-credential" +}' + output: '{ +}' + + Resident_GetInputAttributeValues3_UIN_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_03 + description: Get third input attribute values using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"personalized-card" +}' + output: '{ +}' + + Resident_GetInputAttributeValues_UIN_Invalid_SchemaType_Neg: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_04 + description: Get input attribute values using a valid UIN with an invalid schematype + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/error + input: '{ + "schemaType":"#$$#$#" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetInputAttributeValues1_Vid_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_05 + description: Get input attribute values using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"update-demographics" +}' + output: '{ +}' + + Resident_GetInputAttributeValues2_Vid_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_05 + description: Get second input attribute values using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"share-credential" +}' + output: '{ +}' + + Resident_GetInputAttributeValues3_Vid_all_Valid_Smoke: + endPoint: /resident/v1/identity/info/type/{schemaType} + uniqueIdentifier: TC_Resident_GetInputAtributes_06 + description: Get third input attribute values using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetInputAttributeValues/getInputAttributeValues + outputTemplate: resident/GetInputAttributeValues/getInputAttributeValuesResult + input: '{ + "schemaType":"personalized-card" +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValues.hbs b/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValues.hbs new file mode 100644 index 00000000000..1baca8d58e5 --- /dev/null +++ b/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValues.hbs @@ -0,0 +1,3 @@ +{ + "schemaType":"{{schemaType}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValuesResult.hbs b/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValuesResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetInputAttributeValues/getInputAttributeValuesResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.hbs b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.yml b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.yml new file mode 100644 index 00000000000..97423aeee2c --- /dev/null +++ b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotification.yml @@ -0,0 +1,71 @@ +GetLastClickNotification: + Resident_GetLastClickNotification_uin_all_Valid_Smoke: + endPoint: /resident/v1/bell/notification-click + uniqueIdentifier: TC_Resident_GetLastClickNotification_01 + description: Get last click notification using a valid UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLastClickNotification/GetLastClickNotification + outputTemplate: resident/GetLastClickNotification/GetLastClickNotificationResult + input: '{ +}' + output: '{ + +}' + + Resident_GetLastClickNotification_vid_all_Valid_Smoke: + endPoint: /resident/v1/bell/notification-click + uniqueIdentifier: TC_Resident_GetLastClickNotification_02 + description: Get last click notification using a valid VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLastClickNotification/GetLastClickNotification + outputTemplate: resident/GetLastClickNotification/GetLastClickNotificationResult + input: '{ +}' + output: '{ + +}' + + Resident_GetLastClickNotification_uin_InValid_Token: + endPoint: /resident/v1/bell/notification-click + uniqueIdentifier: TC_Resident_GetLastClickNotification_03 + description: Get last click notification using a valid UIN with an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLastClickNotification/GetLastClickNotification + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] + +}' + + Resident_GetLastClickNotification_Invalid_Token: + endPoint: /resident/v1/bell/notification-click + uniqueIdentifier: TC_Resident_GetLastClickNotification_03 + description: Get last click notification using an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLastClickNotification/GetLastClickNotification + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotificationResult.hbs b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotificationResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetLastClickNotification/GetLastClickNotificationResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLatestIdSchema/GetLatestIdSchema.yml b/api-test/src/main/resources/resident/GetLatestIdSchema/GetLatestIdSchema.yml new file mode 100644 index 00000000000..59806f4c5e8 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLatestIdSchema/GetLatestIdSchema.yml @@ -0,0 +1,40 @@ +GetLatestIdSchema: + Resident_GetLatestIdSchema_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/idschema/latest?schemaVersion={schemaVersion}&domain={domain}&type={type} + uniqueIdentifier: TC_Resident_GetLastSchema_01 + description: Get latest Idschema using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLatestIdSchema/getLatestIdSchema + outputTemplate: resident/GetLatestIdSchema/getLatestIdSchemaResult + input: '{ + "schemaVersion":"0.100", + "domain":"", + "type":"" +}' + output: '{ +}' + + Resident_GetLatestIdSchema_Invalid_Schema_Version: + endPoint: /resident/v1/proxy/masterdata/idschema/latest?schemaVersion={schemaVersion}&domain={domain}&type={type} + uniqueIdentifier: TC_Resident_GetLastSchema_02 + description: Get latest Idschema using an invalid schema version + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLatestIdSchema/getLatestIdSchema + outputTemplate: resident/error + input: '{ + "schemaVersion":"tt", + "domain":"", + "type":"" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchema.hbs b/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchema.hbs new file mode 100644 index 00000000000..6a1f1903246 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchema.hbs @@ -0,0 +1,5 @@ +{ + "schemaVersion":"{{schemaVersion}}", + "domain":"{{domain}}", + "type":"{{type}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchemaResult.hbs b/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchemaResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetLatestIdSchema/getLatestIdSchemaResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/GetLocationDetailsByLocCodeAndLangCode.yml b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/GetLocationDetailsByLocCodeAndLangCode.yml new file mode 100644 index 00000000000..aa0a43aff60 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/GetLocationDetailsByLocCodeAndLangCode.yml @@ -0,0 +1,91 @@ +GetLocationDetailsByLocCodeAndLangCode: + Resident_GetLocationDetailsByLocCodeAndLangCode_allValid_smoke: + endPoint: /resident/v1/proxy/masterdata/locations/info/{loccode}/{langCode} + uniqueIdentifier: TC_Resident_GetLocationDeatils_01 + description: Get location details by location code and language code using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode + outputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCodeResult + input: '{ + "langCode": "$1STLANG$", + "loccode": "14022" +}' + output: '{ + + }' + + Resident_GetLocationDetailsByLocCodeAndLangCode_Invalid_LangCode: + endPoint: /resident/v1/proxy/masterdata/locations/info/{loccode}/{langCode} + uniqueIdentifier: TC_Resident_GetLocationDeatils_02 + description: Get location details by location code and language code using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "langCode": "engg", + "loccode": "14022" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetLocationDetailsByLocCodeAndLangCode_Invalid_LocationCode: + endPoint: /resident/v1/proxy/masterdata/locations/info/{loccode}/{langCode} + uniqueIdentifier: TC_Resident_GetLocationDeatils_03 + description: Get location details by location code and language code using an invalid location code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "loccode": "kk" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetLocationDetailsByLocCodeAndLangCode_StatusCode_Empty_LangCode_Neg: + endPoint: /resident/v1/proxy/masterdata/locations/info/{loccode}/{langCode} + uniqueIdentifier: TC_Resident_GetLocationDeatils_04 + description: Get location details by location code and language code using an empty langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "langCode": "", + "loccode": "14022" +}' + output: "404" + + Resident_GetLocationDetailsByLocCodeAndLangCode_StatusCode_Empty_LocationCode_Neg: + endPoint: /resident/v1/proxy/masterdata/locations/info/{loccode}/{langCode} + uniqueIdentifier: TC_Resident_GetLocationDeatils_05 + description: Get location details by location code and language code using an empty location code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "loccode": "" +}' + output: "404" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode.hbs b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode.hbs new file mode 100644 index 00000000000..53dff19d2fc --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCode.hbs @@ -0,0 +1,4 @@ +{ + "langCode": "{{langCode}}", + "loccode": "{{loccode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCodeResult.hbs b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCodeResult.hbs new file mode 100644 index 00000000000..91ad89c2350 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationDetailsByLocCodeAndLangCode/getLocationDetailsByLocCodeAndLangCodeResult.hbs @@ -0,0 +1,13 @@ +{} + + + + + + + + + + + + diff --git a/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/GetLocationHierarchyByLangCode.yml b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/GetLocationHierarchyByLangCode.yml new file mode 100644 index 00000000000..67442ef1a47 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/GetLocationHierarchyByLangCode.yml @@ -0,0 +1,52 @@ +GetLocationHierarchyByLanguageCode: + Resident_GetLocationHierarchyByLanguageCode_All_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/locationHierarchyLevels/{langCode} + uniqueIdentifier: TC_Resident_GetLocationHierarchy_01 + description: Get location hierarchy by language code using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode + outputTemplate: resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCodeResult + input: '{ + "langCode":"$1STLANG$" +}' + output: '{ +}' + + + Resident_GetLocationHierarchyByLanguageCode_InValid_LangCode: + endPoint: /resident/v1/proxy/masterdata/locationHierarchyLevels/{langCode} + uniqueIdentifier: TC_Resident_GetLocationHierarchy_02 + description: Get location hierarchy by language code using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode + outputTemplate: resident/error + input: '{ + "langCode":"engg" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetLocationHierarchyByLanguageCode_Empty_LangCode_Pos: + endPoint: /resident/v1/proxy/masterdata/locationHierarchyLevels/{langCode} + uniqueIdentifier: TC_Resident_GetLocationHierarchy_03 + description: Get location hierarchy by language code using an empty langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode + outputTemplate: resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCodeResult + input: '{ + "langCode":"" +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode.hbs b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode.hbs new file mode 100644 index 00000000000..adc9d4cb6d3 --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCode.hbs @@ -0,0 +1,3 @@ +{ + "langCode": "{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCodeResult.hbs b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetLocationHierarchyByLanguageCode/getLocationHierarchyByLangCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotifications/GetNotifications.hbs b/api-test/src/main/resources/resident/GetNotifications/GetNotifications.hbs new file mode 100644 index 00000000000..cba9abc493f --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotifications/GetNotifications.hbs @@ -0,0 +1,5 @@ +{ + "pageIndex":"{{pageIndex}}", + "pageSize":"{{pageSize}}", + "langCode": "{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotifications/GetNotifications.yml b/api-test/src/main/resources/resident/GetNotifications/GetNotifications.yml new file mode 100644 index 00000000000..cf96bc54968 --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotifications/GetNotifications.yml @@ -0,0 +1,436 @@ +GetNotifications: + Resident_GetNotifications_vid_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode} + uniqueIdentifier: TC_Resident_GetNotifications_01 + description: Get notifications of VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"$REMOVE$", + "pageSize":"$REMOVE$" +}' + output: '{ + +}' + + Resident_GetNotifications_vid_pageSize_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_02 + description: Get notifications of VID using pageSize with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"2" +}' + output: '{ + +}' + + Resident_GetNotifications_vid_pageIndex_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetNotifications_03 + description: Get notifications of VID using pageIndex with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"$REMOVE$" +}' + output: '{ + +}' + + Resident_GetNotifications_Invalid_pageIndex_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetNotifications_03 + description: Get notifications using an invalid pageIndex + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"dw", + "pageSize":"$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_vid_Invalid_Token_Neg: + endPoint: /resident/v1/notifications/{langCode} + uniqueIdentifier: TC_Resident_GetNotifications_04 + description: Get notifications of VID using an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"$REMOVE$", + "pageSize":"$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_GetNotifications_vid_1_Invalid_PageNo_Pos: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_05 + description: Get notifications of VID using an invalid page number + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"11", + "pageSize":"2" +}' + output: '{ + +}' + + Resident_GetNotifications_vid_all_InValid_langcode_Neg: + endPoint: /resident/v1/notifications/{langCode} + uniqueIdentifier: TC_Resident_GetNotifications_06 + description: Get notifications of VID using an invalid token + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "34Fg", + "pageIndex":"$REMOVE$", + "pageSize":"$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_vid_SpaceVal_langcode_Neg: + endPoint: /resident/v1/notifications/{langCode} + uniqueIdentifier: TC_Resident_GetNotifications_07 + description: Get notifications of VID using special value langcode + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": " ", + "pageIndex":"$REMOVE$", + "pageSize":"$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_vid_Neg_Value_PageStart_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_08 + description: Get notifications of VID using negative value pagestart + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"-2", + "pageSize":"2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-446", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_vid_Neg_Value_pageSize_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_09 + description: Get notifications of VID using negative value pageSize + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"-2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] + +}' + + Resident_GetNotifications_vid_StringVal_Invalid_pageSize_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_10 + description: Get notifications of VID using stringvalue in pageSize + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"gh" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_vid_StringVal_Invalid_pageIndex_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetNotifications_11 + description: Get notifications of VID using stringvalue in pageIndex + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"fh", + "pageSize":"$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] + +}' + Resident_GetNotifications_uin_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode} + uniqueIdentifier: TC_Resident_GetNotifications_12 + description: Get notifications of UIN using all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"$REMOVE$", + "pageSize":"$REMOVE$" +}' + output: '{ + +}' + + Resident_GetNotifications_uin_pageSize_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_14 + description: Get notifications of UIN using valid pageSize and all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"2" +}' + output: '{ + +}' + + Resident_GetNotifications_uin_pageIndex_all_Valid_Smoke: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_15 + description: Get notifications of UIN using valid pageIndex and all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/GetNotifications/GetNotificationsResult + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"2" +}' + output: '{ + +}' + + Resident_GetNotifications_uin_1_Invalid_PageNo_Pos: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_16 + description: Get notifications of UIN using invalid pageNo + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"52", + "pageSize":"2" +}' + output: '{ +}' + + Resident_GetNotifications_uin_all_InValid_langcode_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_17 + description: Get notifications of UIN using invalid langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "34Fg", + "pageIndex":"2", + "pageSize":"2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_uin_StatusCode_empty_langcode_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_18 + description: Get notifications of UIN status code using an empty langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "", + "pageIndex":"2", + "pageSize":"2" +}' + output: "404" + + Resident_GetNotifications_uin_SpaceVal_langcode_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_19 + description: Get notifications of UIN using an space value langcode + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": " ", + "pageIndex":"2", + "pageSize":"2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetNotifications_uin_Neg_Value_PageStart_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_20 + description: Get notifications of UIN using negative value PageStart + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"-2", + "pageSize":"2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-446", + "message": "Invalid page start value" + } + ] +}' + + Resident_GetNotifications_uin_Neg_Value_pageSize_Neg: + endPoint: /resident/v1/notifications/{langCode}?pageIndex={pageIndex}&pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetNotifications_21 + description: Get notifications of UIN using negative value PageSize + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotifications/GetNotifications + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "pageIndex":"2", + "pageSize":"-2" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "Invalid page fetch value" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotifications/GetNotificationsResult.hbs b/api-test/src/main/resources/resident/GetNotifications/GetNotificationsResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotifications/GetNotificationsResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.hbs b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.hbs new file mode 100644 index 00000000000..4eb7c3f9836 --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.hbs @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.yml b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.yml new file mode 100644 index 00000000000..6869f1492b5 --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCount.yml @@ -0,0 +1,70 @@ +GetNotificationsCount: + Resident_GetNotificationsCount_vid_all_Valid_Smoke: + endPoint: /resident/v1/unread/notification-count + uniqueIdentifier: TC_Resident_GetNotificationCount_01 + description: Get notifications count of VID using all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotificationsCount/GetNotificationsCount + outputTemplate: resident/GetNotificationsCount/GetNotificationsCount + input: '{ +}' + output: '{ + +}' + + Resident_GetNotificationsCount_uin_all_Valid_Smoke: + endPoint: /resident/v1/unread/notification-count + uniqueIdentifier: TC_Resident_GetNotificationCount_02 + description: Get notifications count of UIN using all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotificationsCount/GetNotificationsCount + outputTemplate: resident/GetNotificationsCount/GetNotificationsCount + input: '{ +}' + output: '{ + +}' + + Resident_GetNotificationsCount_uin_InvalidToken_Neg: + endPoint: /resident/v1/unread/notification-count + uniqueIdentifier: TC_Resident_GetNotificationCount_03 + description: Get notifications count of VID using an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotificationsCount/GetNotificationsCount + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401" + } + ] + +}' + + Resident_GetNotificationsCount_vid_InvalidToken_Neg: + endPoint: /resident/v1/unread/notification-count + uniqueIdentifier: TC_Resident_GetNotificationCount_04 + description: Get notifications count of VID using an invalid token + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetNotificationsCount/GetNotificationsCount + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401" + } + ] + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCountResult.hbs b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCountResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetNotificationsCount/GetNotificationsCountResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.hbs b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.hbs new file mode 100644 index 00000000000..f4cb46d6b07 --- /dev/null +++ b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.hbs @@ -0,0 +1,4 @@ +{ + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.yml b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.yml new file mode 100644 index 00000000000..1a7daa3a748 --- /dev/null +++ b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatus.yml @@ -0,0 +1,342 @@ +GetOrderStatus: + Resident_GetOrderStatus_0_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_01 + description: Get order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567890", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567890" +}' + Resident_GetOrderStatus_1_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_02 + description: Get 1st order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567891", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567891" +}' + Resident_GetOrderStatus_2_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_03 + description: Get 2nd order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567892", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567892" +}' + Resident_GetOrderStatus_3_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_04 + description: Get 3rd order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567893", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567893" +}' + Resident_GetOrderStatus_4_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_05 + description: Get 4th order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567894", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567894" +}' + Resident_GetOrderStatus_5_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_06 + description: Get 5th order status using UIN with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567895", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "transactionId": "1234567895" +}' + Resident_GetOrderStatus_6_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_07 + description: Get 6th order status using UIN with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567896", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-475", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_7_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_08 + description: Get 7th order status using UIN with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567897", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-476", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_8_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_09 + description: Get 8th order status using UIN with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567898", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-477", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_9_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_10 + description: Get 9th order status using UIN with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567899", + "individualId": "$ID:AddIdentity_OrdrSts_Valid_smoke_Pos_UIN$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-478", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetOrderStatus_Vid_0_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_11 + description: Get order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567890", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567890" +}' + Resident_GetOrderStatus_Vid_1_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_12 + description: Get 1st order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567891", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567891" +}' + Resident_GetOrderStatus_Vid_2_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_13 + description: Get 2nd order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567892", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567892" +}' + Resident_GetOrderStatus_Vid_3_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_14 + description: Get 3rd order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567893", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567893" +}' + Resident_GetOrderStatus_Vid_4_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_15 + description: Get 4th order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567894", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567894" +}' + Resident_GetOrderStatus_Vid_5_Valid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_16 + description: Get 5th order status using VID with valid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/GetOrderStatus/GetOrderStatusResult + input: '{ + "transactionId": "1234567895", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "transactionId": "1234567895" +}' + Resident_GetOrderStatus_Vid_6_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_17 + description: Get 6th order status using VID with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567896", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-475", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_Vid_7_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_18 + description: Get 7th order status using VID with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567897", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-476", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_Vid_8_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_19 + description: Get 8th order status using VID with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567898", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-477", + "message": "$IGNORE$" + } + ] +}' + Resident_GetOrderStatus_Vid_9_Invalid_TransactionID_Smoke: + endPoint: /resident/v1/mock/print-partner/check-order-status?transactionId={transactionId}&individualId={individualId} + uniqueIdentifier: TC_Resident_GetOrderStatus_20 + description: Get 9th order status using VID with an invalid transactionId + role: resident + restMethod: get + inputTemplate: resident/GetOrderStatus/GetOrderStatus + outputTemplate: resident/error + input: '{ + "transactionId": "1234567899", + "individualId": "$ID:Generate_Perpetual_VID_OrdrSts_Valid_Smoke_sid_vid$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-478", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatusResult.hbs b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatusResult.hbs new file mode 100644 index 00000000000..e0206aa400a --- /dev/null +++ b/api-test/src/main/resources/resident/GetOrderStatus/GetOrderStatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "transactionId": "{{transactionId}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPartnersByPartnerType/GetPartnersByPartnerType.yml b/api-test/src/main/resources/resident/GetPartnersByPartnerType/GetPartnersByPartnerType.yml new file mode 100644 index 00000000000..d9dba3737d9 --- /dev/null +++ b/api-test/src/main/resources/resident/GetPartnersByPartnerType/GetPartnersByPartnerType.yml @@ -0,0 +1,103 @@ +GetPartnersByPartnerType: + Resident_GetPartnersByPartnerType_uin_all_Valid_Smoke_sid: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_01 + description: Get partners by partnertype using UIN with all valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult + input: '{ + "partnerType": "Auth_Partner" +}' + output: '{ +}' + + Resident_GetPartnersByPartnerType_uin_Empty_PartnerType_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_02 + description: Get partners by partnertype using UIN with an empty partnertype + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult + input: '{ + "partnerType": "" +}' + output: '{ +}' + + Resident_GetPartnersByPartnerType_Invalid_Token: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_03 + description: Get partners by partnertype using an invalid token + role: residen + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/error + input: '{ + "partnerType": "" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetPartnersByPartnerType_Empty_Token_Neg: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_04 + description: Get partners by partnertype using an empty token + role: + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/error + input: '{ + "partnerType": "" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ] +}' + + Resident_GetPartnersByPartnerType_vid_all_Valid_Smoke_sid: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_05 + description: Get partners by partnertype using VID with all valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult + input: '{ + "partnerType": "Auth_Partner" +}' + output: '{ +}' + + Resident_GetPartnersByPartnerType_vid_Empty_PartnerType_Valid_Smoke: + endPoint: /resident/v1/auth-proxy/partners?partnerType={partnerType} + uniqueIdentifier: TC_Resident_GetPartnerbyPartnerType_06 + description: Get partners by partnertype using VID with an empty partnertype + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerType + outputTemplate: resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult + input: '{ + "partnerType": "" +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerType.hbs b/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerType.hbs new file mode 100644 index 00000000000..728cf706200 --- /dev/null +++ b/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerType.hbs @@ -0,0 +1,3 @@ +{ + "partnerType": "{{partnerType}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult.hbs b/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetPartnersByPartnerType/getPartnersByPartnerTypeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.hbs b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.hbs new file mode 100644 index 00000000000..1411d9415c7 --- /dev/null +++ b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.hbs @@ -0,0 +1,3 @@ +{ + "langcode":"{{langcode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.yml b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.yml new file mode 100644 index 00000000000..58a89d131db --- /dev/null +++ b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDrafts.yml @@ -0,0 +1,34 @@ +GetPendingDrafts: + Resident_GetPendingDrafts_Valid_langCode_eng_Smoke: + endPoint: /resident/v1/identity/get-pending-drafts/{langcode} + uniqueIdentifier: TC_Resident_GetPendingDrafts_01 + description: Get Pending drafts list with valid data + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetPendingDrafts/GetPendingDrafts + outputTemplate: resident/GetPendingDrafts/GetPendingDraftsResult + input: '{ + "langcode":"$1STLANG$" +}' + output: '{ +}' + Resident_GetPendingDrafts__Invalid_langCode_eng_Smoke_Neg: + endPoint: /resident/v1/identity/get-pending-drafts/{langcode} + uniqueIdentifier: TC_Resident_GetPendingDrafts_02 + description: Get Pending drafts list with invalid langCode + role: residentNew + restMethod: get + inputTemplate: resident/GetPendingDrafts/GetPendingDrafts + outputTemplate: resident/error + input: '{ + "langcode":"@#@$@$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDraftsResult.hbs b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDraftsResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetPendingDrafts/GetPendingDraftsResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/GetPolicyforMappedPartnerAndCredentialtype.yml b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/GetPolicyforMappedPartnerAndCredentialtype.yml new file mode 100644 index 00000000000..d4410fda093 --- /dev/null +++ b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/GetPolicyforMappedPartnerAndCredentialtype.yml @@ -0,0 +1,57 @@ +GetPolicyforMappedPartnerAndCredentialtype: + Partner_GetPolicyforMappedPartnerAndCredentialtype_AllValid_Smoke: + endPoint: /resident/v1/req/policy/partnerId/{partnerId}/credentialType/{credentialType} + uniqueIdentifier: TC_Resident_GetPolicyforpartner_01 + description: Get policy for mapped partner and credential type using all valid inputs + role: resident + restMethod: get + inputTemplate: resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype + outputTemplate: resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtypeResult + input: '{ + "partnerId": "mpartner-default-auth", + "credentialType": "auth" +}' + output: '{ + "partnerId": "mpartner-default-auth", + "credentialType": "auth" +}' + Partner_GetPolicyforMappedPartnerAndCredentialtype_InValid_partnerId: + endPoint: /resident/v1/req/policy/partnerId/{partnerId}/credentialType/{credentialType} + uniqueIdentifier: TC_Resident_GetPolicyforpartner_02 + description: Get policy for mapped partner and credential type using an invalid partnerId + role: resident + restMethod: get + inputTemplate: resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype + outputTemplate: resident/error + input: '{ + "partnerId": "asfvb", + "credentialType": "qrcode" +}' + output: '{ + "errors": [ + { + "errorCode": "PMS_PRT_064", + "message": "$IGNORE$" + } + ] +}' + Partner_GetPolicyforMappedPartnerAndCredentialtype_InValid_CredentialType: + endPoint: /resident/v1/req/policy/partnerId/{partnerId}/credentialType/{credentialType} + uniqueIdentifier: TC_Resident_GetPolicyforpartner_03 + description: Get policy for mapped partner and credential type using an invalid credentialType + role: resident + restMethod: get + inputTemplate: resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype + outputTemplate: resident/error + input: '{ + "partnerId": "mpartner-default-auth", + "credentialType": "asfwrg" +}' + output: '{ + "errors": [ + { + "errorCode": "PMS_PRT_064", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype.hbs b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype.hbs new file mode 100644 index 00000000000..d89308def3f --- /dev/null +++ b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtype.hbs @@ -0,0 +1,4 @@ +{ + "partnerId": "{{partnerId}}", + "credentialType": "{{credentialType}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtypeResult.hbs b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtypeResult.hbs new file mode 100644 index 00000000000..4cccb1da4bf --- /dev/null +++ b/api-test/src/main/resources/resident/GetPolicyforMappedPartnerAndCredentialtype/getPolicyforMappedPartnerAndCredentialtypeResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "partnerId": "{{partnerId}}", + "credentialType": "{{credentialType}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetProfile/GetProfile.hbs b/api-test/src/main/resources/resident/GetProfile/GetProfile.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetProfile/GetProfile.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetProfile/GetProfile.yml b/api-test/src/main/resources/resident/GetProfile/GetProfile.yml new file mode 100644 index 00000000000..96912adf8ac --- /dev/null +++ b/api-test/src/main/resources/resident/GetProfile/GetProfile.yml @@ -0,0 +1,50 @@ +GetProfile: + Resident_GetProfile_uin_all_Valid_Smoke: + endPoint: /resident/v1/profile + uniqueIdentifier: TC_Resident_GetProfile_01 + description: Get profile using a UIN with valid inputs + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetProfile/GetProfile + outputTemplate: resident/GetProfile/GetProfileResult + input: '{ +}' + output: '{ + +}' + + Resident_GetProfile_Vid_Valid_Smoke: + endPoint: /resident/v1/profile + uniqueIdentifier: TC_Resident_GetProfile_02 + description: Get profile using a VID with valid inputs + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetProfile/GetProfile + outputTemplate: resident/GetProfile/GetProfileResult + input: '{ +}' + output: '{ + +}' + + Resident_GetProfile_Invalid_User_Neg: + endPoint: /resident/v1/profile + uniqueIdentifier: TC_Resident_GetProfile_03 + description: Get profile using an invalid user + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetProfile/GetProfile + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetProfile/GetProfileResult.hbs b/api-test/src/main/resources/resident/GetProfile/GetProfileResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetProfile/GetProfileResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/GetRegCenterByLangCodeAndHierarchyLevel.yml b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/GetRegCenterByLangCodeAndHierarchyLevel.yml new file mode 100644 index 00000000000..e9057fc55cf --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/GetRegCenterByLangCodeAndHierarchyLevel.yml @@ -0,0 +1,211 @@ +GetRegCenterByLangCodeAndHierarchyLevel: + Resident_GetRegCenterByLangCodeAndHierarchyLevel_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_01 + description: Get registration center by language code and hierarchy level using all valid inputs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevelResult + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "$LOCATIONNAME$" +}' + output: '{ +}' + + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_Invalid_HierarchyLevel: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_02 + description: Get registration center by language code and hierarchy level using an invalid hierrachylevel + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "tt", + "name": "$LOCATIONNAME$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_Invalid_Name: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_03 + description: Get registration center by language code and hierarchy level using an invalid name + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "tt" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_Invalid_LangCode: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_04 + description: Get registration center by language code and hierarchy level using an invalid langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "engg", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "$LOCATIONNAME$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_RandomVal_LangCode_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_05 + description: Get registration center by language code and hierarchy level using random value langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "1234", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "$LOCATIONNAME$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_RandomVal_Level_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_06 + description: Get registration center by language code and hierarchy level using random value level + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "-177", + "name": "$LOCATIONNAME$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_RandomVal_Name_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_07 + description: Get registration center by language code and hierarchy level using random value name + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "1234", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "Random" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_StatusCode_Empty_LangCode_MandatoryFields_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_08 + description: Get registration center by language code and hierarchy level statusCode using an empty langcode + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "$LOCATIONNAME$" +}' + output: "404" + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_StatusCode_Empty_Level_MandatoryFields_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_09 + description: Get registration center by language code and hierarchy level statusCode using an empty level + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "", + "name": "$LOCATIONNAME$" +}' + output: "404" + + Resident_GetRegCenterByLangCodeAndHierarchyLevel_Empty_Name_MandatoryFields_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names?name={name} + uniqueIdentifier: TC_Resident_GetRegistrationbyLangcode&hierarchylevel_10 + description: Get registration center by language code and hierarchy level using an empty name + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "hierarchylevel": "$HIERARCHYLEVELWITHLOCATIONCODE$", + "name": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Registration Center not found" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel.hbs b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel.hbs new file mode 100644 index 00000000000..1fe93e5e02a --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevel.hbs @@ -0,0 +1,5 @@ +{ + "langcode":"{{langcode}}", + "hierarchylevel":"{{hierarchylevel}}", + "name":"{{name}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevelResult.hbs b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevelResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegCenterByLangCodeAndHierarchyLevel/getRegCenterByLangCodeAndHierarchyLevelResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/GetRegistrationCenterByHierarchyLevelAndTextPaginated.yml b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/GetRegistrationCenterByHierarchyLevelAndTextPaginated.yml new file mode 100644 index 00000000000..dcbc8ab57b3 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/GetRegistrationCenterByHierarchyLevelAndTextPaginated.yml @@ -0,0 +1,351 @@ +GetRegistrationCenterByHierarchyLevelAndTextPaginated: + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_01 + description: Get Registartion centres when all details are given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginatedResult + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_LangCode: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_02 + description: Get Registartion centres when invalid langcode is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"engg", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_HierarchyLevel: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_03 + description: Get Registartion centres when invalid hierarchylevel is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"999", + "name":"10104", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_Name: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_04 + description: Get Registartion centres when invalid name is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"Random", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_PageNumber: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_05 + description: Get Registartion centres when invalid pagenumber is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"999", + "pageSize":"10", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_PageSize: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_06 + description: Get Registartion centres when invalid pagesize is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"-999", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_SortBy_Value: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_07 + description: Get Registartion centres when invalid sortby is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"10", + "sortBy":"Random", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_OrderBy_Value: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_08 + description: Get Registartion centres when invalid orderby is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"10", + "sortBy":"createdDateTime", + "orderBy":"Random" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_Random_HierarchyLevel: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_09 + description: Get Registartion centres when invalid/Random hierarchylevel is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"tt", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_Random_PageNumber: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_10 + description: Get Registartion centres when invalid/Random pagenumber is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"tt", + "pageSize":"10", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_Invalid_Random_PageSize: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_11 + description: Get Registartion centres when invalid/random pagesize is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"tt", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_StatusCode_LangCode_Empty_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_12 + description: Get Registartion centres when no value entered in langcode input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: "404" + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_StatusCode_HierarchyLevel_Empty_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_13 + description: Get Registartion centres when no value entered in hierarchylevel input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"", + "name":"$LOCATIONNAME$", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: "404" + + Resident_GetRegistrationCenterByHierarchyLevelAndTextPaginated_StatusCode_Name_Empty_Neg: + endPoint: /resident/v1/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}?pageNumber={pageNumber}&pageSize={pageSize}&orderBy={orderBy}&sortBy={sortBy} + uniqueIdentifier: TC_Resident_GetRegistrationbyhierarchylevel&textpaginated_14 + description: Get Registartion centres when no value entered in name input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated + outputTemplate: resident/error + input: '{ + "langcode":"$1STLANG$", + "hierarchylevel":"$HIERARCHYLEVELWITHLOCATIONCODE$", + "name":"", + "pageNumber":"0", + "pageSize":"1", + "sortBy":"createdDateTime", + "orderBy":"desc" +}' + output: "404" diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated.hbs b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated.hbs new file mode 100644 index 00000000000..774500efd10 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginated.hbs @@ -0,0 +1,9 @@ +{ + "langcode":"{{langcode}}", + "hierarchylevel":"{{hierarchylevel}}", + "name":"{{name}}", + "pageNumber":"{{pageNumber}}", + "pageSize":"{{pageSize}}", + "sortBy":"{{sortBy}}", + "orderBy":"{{orderBy}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginatedResult.hbs b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginatedResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterByHierarchyLevelAndTextPaginated/getRegistrationCenterByHierarchyLevelAndTextPaginatedResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/GetRegistrationCenterWorkingDays.yml b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/GetRegistrationCenterWorkingDays.yml new file mode 100644 index 00000000000..b53c0e39111 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/GetRegistrationCenterWorkingDays.yml @@ -0,0 +1,112 @@ +GetRegistrationCenterWorkingDays: + Resident_GetRegistrationCenterWorkingDays_allValid_smoke: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_GetRegistrationCenterWorkingDays_01 + description: Get Registartion centre working days with all valid values in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDaysResult + input: '{ + "langCode": "$1STLANG$", + "registrationCenterID": "10011" +}' + output: '{ +}' + + Resident_GetRegistrationCenterWorkingDays_Invalid_langCode: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_GetRegistrationCenterWorkingDays_02 + description: Get Registartion centre working days when invalid language code is given in input parametrs + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/error + input: '{ + "langCode": "eng1", + "registrationCenterID": "10011" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterWorkingDays_Invalid_registrationCenterID: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_GetRegistrationCenterWorkingDays_03 + description: Get Registartion centre working days when invalid registartion centre id is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "registrationCenterID": "1001112" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterWorkingDays_Invalid_langCode_registrationCenterID: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_RegistrationCenterWorkingDays_04 + description: Get Registartion centre working days when invalid registartion centre id and invalid language code is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/error + input: '{ + "langCode": "eng1", + "registrationCenterID": "10011222" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRegistrationCenterWorkingDays_StatusCode_Empty_registrationCenterID_Neg: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_GetRegistrationCenterWorkingDays_05 + description: Get Registartion centre working days when registartion centre id is not given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/error + input: '{ + "langCode": "$1STLANG$", + "registrationCenterID": "" +}' + output: "404" + + Resident_GetRegistrationCenterWorkingDays_StatusCode_Empty_langCode_Neg: + endPoint: /resident/v1/proxy/masterdata/workingdays/{registrationCenterID}/{langCode} + uniqueIdentifier: TC_Resident_GetRegistrationCenterWorkingDays_06 + description: Get Registartion centre working days when language code is not given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays + outputTemplate: resident/error + input: '{ + "langCode": "", + "registrationCenterID": "10011" + }' + output: "404" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays.hbs b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays.hbs new file mode 100644 index 00000000000..765b96a4ed9 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDays.hbs @@ -0,0 +1,4 @@ +{ + "registrationCenterID": "{{registrationCenterID}}", + "langCode": "{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDaysResult.hbs b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDaysResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRegistrationCenterWorkingDays/getRegistrationCenterWorkingDaysResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/.yml b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/.yml new file mode 100644 index 00000000000..7b799e3df35 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/.yml @@ -0,0 +1,84 @@ +GetAcknowledgementController: + Resident_GetAuthorizationtoken_Valid_Smoke: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_languageCode_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "ar$!22", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_EventId_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "44$as443!" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Empty_languageCode_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Empty_eventId_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_Role_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: resident + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.hbs b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.hbs new file mode 100644 index 00000000000..28e2cb4adb6 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.hbs @@ -0,0 +1,5 @@ +{ + "individualId": "{{individualId}}", + "idType": "{{idType}}", + "attribute_list": "{{attribute_list}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.yml b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.yml new file mode 100644 index 00000000000..2e6b77a1b18 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest.yml @@ -0,0 +1,84 @@ +GetRemainingupdatecountbyIndividualIdRequest: + Resident_GetRemainingupdatecountbyIndividualIdRequest_Valid_Smoke: + endPoint: /idrepository/v1/identity/{individualId}/update-counts?idType={idType}&attribute_list={attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_01 + description: Get remaining update count when UIN is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest + outputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequestResult + input: '{ + "individualId": "$ID:AddIdentity_UpdateCount_smoke_Pos_UIN$", + "idType": "UIN", + "attribute_list": "fullName" +}' + output: '{ + +}' + + Resident_GetRemainingupdatecountby_Invalid_IndividualIdRequest_Negative: + endPoint: /idrepository/v1/identity/{individualId}/update-counts?idType={idType}&attribute_list={attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_02 + description: Get remaining update count when invalid UIN is used in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest + outputTemplate: resident/error + input: '{ + "individualId": "$123ds", + "idType": "UIN", + "attribute_list": "fullName" +}' + output: '{ + "errors": [ + { + "errorCode": "IDR-IDC-004" + } + ] +}' + + Resident_GetRemainingupdatecountby_empty_IndividualIdRequest_Negative: + endPoint: /idrepository/v1/identity/{individualId}/update-counts?idType={idType}&attribute_list={attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_03 + description: Get remaining update count when individualid is not given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest + outputTemplate: resident/error + input: '{ + "individualId": "", + "idType": "UIN", + "attribute_list": "fullName" +}' + output: '{ + "errors": [ + { + "errorCode": "IDR-IDC-003" + } + ] +}' + + Resident_GetRemainingupdatecountbyIndividualIdRequest_Invalid_Token: + endPoint: /idrepository/v1/identity/{individualId}/update-counts?idType={idType}&attribute_list={attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_04 + description: Get remaining update count when invalid token is used + role: invalidtoken + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequest + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_UpdateCount_smoke_Pos_UIN$", + "idType": "UIN", + "attribute_list": "fullName" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequestResult.hbs b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequestResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest/GetRemainingupdatecountbyIndividualIdRequestResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/.yml b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/.yml new file mode 100644 index 00000000000..7b799e3df35 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/.yml @@ -0,0 +1,84 @@ +GetAcknowledgementController: + Resident_GetAuthorizationtoken_Valid_Smoke: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_languageCode_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "ar$!22", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_EventId_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "44$as443!" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Empty_languageCode_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Empty_eventId_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: residentNew + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "" +}' + output: '{ + +}' + + Resident_GetAuthorizationtoken_Invalid_Role_Negative: + endPoint: /ack/download/pdf/event/{eventId}/language/{languageCode} + role: resident + restMethod: get + inputTemplate: resident/AcknowledgementController/AcknowledgementController + outputTemplate: resident/AcknowledgementController/AcknowledgementControllerResult + input: '{ + "languageCode": "$1STLANG$", + "eventId": "$ID:GetServiceHistory_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + +}' diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.hbs b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.hbs new file mode 100644 index 00000000000..32adadbea3d --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.hbs @@ -0,0 +1,3 @@ +{ +"filter_attribute_list": "{{filter_attribute_list}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.yml b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.yml new file mode 100644 index 00000000000..681325c1a07 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2.yml @@ -0,0 +1,56 @@ +GetRemainingupdatecountbyIndividualIdRequest2: + Resident_GetRemainingupdatecountbyIndividualIdRequest2_uin_Valid_Smoke: + endPoint: /resident/v1/identity/update-count?filter_attribute_list={filter_attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_05 + description: Get remaining update count for UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2 + outputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2Result + input: '{ + "filter_attribute_list": "fullName" + +}' + output: '{ + +}' + + Resident_GetRemainingupdatecountbyIndividualIdRequest2_vid_Valid_Smoke: + endPoint: /resident/v1/identity/update-count?filter_attribute_list={filter_attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_06 + description: Get remaining update count for VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2 + outputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2Result + input: '{ + "filter_attribute_list": "fullName" + +}' + output: '{ + +}' + + Resident_GetRemainingupdatecountbyIndividualIdRequest2_Invalid_Token: + endPoint: /resident/v1/identity/update-count?filter_attribute_list={filter_attribute_list} + uniqueIdentifier: TC_Resident_GetRemainingupdatecount_07 + description: Get remaining update count when invalid token is used + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2 + outputTemplate: resident/error + input: '{ + "filter_attribute_list": "fullName" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2Result.hbs b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2Result.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRemainingupdatecountbyIndividualIdRequest2/GetRemainingupdatecountbyIndividualIdRequest2Result.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.hbs b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.hbs new file mode 100644 index 00000000000..210865c1c77 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.hbs @@ -0,0 +1,3 @@ +{ + "VID": "{{VID}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.yml b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.yml new file mode 100644 index 00000000000..8e89c4354ed --- /dev/null +++ b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVid.yml @@ -0,0 +1,131 @@ +GetRequestCardVid: + Resident_GetRequestCardVid_uin_all_Valid_Smoke_sid: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_01 + description: Request card using temporary VID when logged in using UIN + role: residentNew + restMethod: get + auditLogCheck: true + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/GetRequestCardVid/GetRequestCardVidResult + input: '{ + "VID": "$ID:GenerateVID_uin_Temporary_VID_Valid_Smoke_sid_vid$" +}' + output: '{ + "status": "Success" +}' + + Resident_GetRequestCardVid_uin_Invalid_User_Neg: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_02 + description: Request card using VID when logged in using invalid UIN + role: null + validityCheckRequired: true + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/error + input: '{ + "VID": "$ID:GenerateVID_uin_Temporary_VID_Valid_Smoke_sid_vid$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRequestCardVid_uin_Invalid_Vid_Neg: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_03 + description: Request card using invalid VID when logged in using UIN + role: residentNew + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/error + input: '{ + "VID": "$#@#$$@" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRequestCardVid_uin_Invalid_UserVid_Neg: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_04 + description: Request card using invalid VID when logged in using UIN + role: residentNew + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/error + input: '{ + "VID": "3472301371804193" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-474" + } + ] +}' + + Resident_GetRequestCardVid_vid_all_Valid_Smoke_sid: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_05 + description: Request card using Onetimeuse VID when logged in using VID + role: residentNewVid + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/GetRequestCardVid/GetRequestCardVidResult + input: '{ + "VID": "$ID:GenerateVID_Onetimeuse_Using_VID_Valid_Smoke_sid_vid$" +}' + output: '{ + "status": "Success" +}' + + Resident_GetRequestCardVid_vid_Invalid_Vid_Neg: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_06 + description: Request card using invalid VID when logged in using VID + role: residentNewVid + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/error + input: '{ + "VID": "$#@#$$@" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetRequestCardVid_vid_Invalid_UserVid_Neg: + endPoint: /resident/v1/request-card/vid/{VID} + uniqueIdentifier: TC_Resident_GetCardUsingVID_07 + description: Request card using VID when logged in using invalid VID + role: residentNewVid + restMethod: get + inputTemplate: resident/GetRequestCardVid/GetRequestCardVid + outputTemplate: resident/error + input: '{ + "VID": "3472301371804193" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-474", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVidResult.hbs b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVidResult.hbs new file mode 100644 index 00000000000..0137f52daaa --- /dev/null +++ b/api-test/src/main/resources/resident/GetRequestCardVid/GetRequestCardVidResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetResidentValidDocuments/GetResidentValidDocuments.yml b/api-test/src/main/resources/resident/GetResidentValidDocuments/GetResidentValidDocuments.yml new file mode 100644 index 00000000000..c03719ca645 --- /dev/null +++ b/api-test/src/main/resources/resident/GetResidentValidDocuments/GetResidentValidDocuments.yml @@ -0,0 +1,97 @@ +GetResidentValidDocuments: + Resident_GetResidentValidDocuments_all_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/applicanttype/{applicantId}/languages?languages={langCode} + uniqueIdentifier: TC_Resident_GetValidDocumets_01 + description: Get Resident valid documents + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetResidentValidDocuments/getResidentValidDocuments + outputTemplate: resident/GetResidentValidDocuments/getResidentValidDocumentsResult + input: '{ + "applicantId": "001", + "langCode":"$1STLANG$" +}' + output: '{ +}' + + Resident_GetResidentValidDocuments_Invalid_LangCode: + endPoint: /resident/v1/proxy/masterdata/applicanttype/{applicantId}/languages?languages={langCode} + uniqueIdentifier: TC_Resident_GetValidDocumets_02 + description: Get Resident valid documents when invalid language code is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetResidentValidDocuments/getResidentValidDocuments + outputTemplate: resident/error + input: '{ + "applicantId": "001", + "langCode":"tamm" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetResidentValidDocuments_Invalid_ApplicantId: + endPoint: /resident/v1/proxy/masterdata/applicanttype/{applicantId}/languages?languages={langCode} + uniqueIdentifier: TC_Resident_GetValidDocumets_03 + description: Get Resident valid documents when invalid applicant ID is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetResidentValidDocuments/getResidentValidDocuments + outputTemplate: resident/error + input: '{ + "applicantId": "tt", + "langCode":"$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetResidentValidDocuments_Empty_LangCode_Neg: + endPoint: /resident/v1/proxy/masterdata/applicanttype/{applicantId}/languages?languages={langCode} + uniqueIdentifier: TC_Resident_GetValidDocumets_04 + description: Get Resident valid documents when language code is not given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetResidentValidDocuments/getResidentValidDocuments + outputTemplate: resident/error + input: '{ + "applicantId": "001", + "langCode":"" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Error occurred while fetching Applicant Type-Document Category-Document Type Mapping details" + } + ] +}' + + Resident_GetResidentValidDocuments_StatusCode_Empty_ApplicantId_Neg: + endPoint: /resident/v1/proxy/masterdata/applicanttype/{applicantId}/languages?languages={langCode} + uniqueIdentifier: TC_Resident_GetValidDocumets_05 + description: Get Resident valid documents when applicant ID value is not given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetResidentValidDocuments/getResidentValidDocuments + outputTemplate: resident/error + input: '{ + "applicantId": "", + "langCode":"$1STLANG$" +}' + output: "404" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocuments.hbs b/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocuments.hbs new file mode 100644 index 00000000000..907d96861a1 --- /dev/null +++ b/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocuments.hbs @@ -0,0 +1,4 @@ +{ + "applicantId": "{{applicantId}}", + "langCode":"{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocumentsResult.hbs b/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocumentsResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetResidentValidDocuments/getResidentValidDocumentsResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRetrieveVidPolicy/GetRetrieveVidPolicy.yml b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/GetRetrieveVidPolicy.yml new file mode 100644 index 00000000000..85fb8f3abea --- /dev/null +++ b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/GetRetrieveVidPolicy.yml @@ -0,0 +1,28 @@ +GetRetrieveVidPolicy: + Resident_GetRetrieveVidPolicy_uin_all_Valid_Smoke: + endPoint: /resident/v1/vid/policy + uniqueIdentifier: TC_Resident_retrieveVIDpolicy_01 + description: Get VID policy when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRetrieveVidPolicy/getRetrieveVidPolicy + outputTemplate: resident/GetRetrieveVidPolicy/getRetrieveVidPolicyResult + input: '{ +}' + output: '{ +}' + + Resident_GetRetrieveVidPolicy_vid_all_Valid_Smoke: + endPoint: /resident/v1/vid/policy + uniqueIdentifier: TC_Resident_retrieveVIDpolicy_02 + description: Get VID policy when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRetrieveVidPolicy/getRetrieveVidPolicy + outputTemplate: resident/GetRetrieveVidPolicy/getRetrieveVidPolicyResult + input: '{ +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicy.hbs b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicy.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicy.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicyResult.hbs b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicyResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRetrieveVidPolicy/getRetrieveVidPolicyResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.hbs b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.hbs new file mode 100644 index 00000000000..9267e16f670 --- /dev/null +++ b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.hbs @@ -0,0 +1,3 @@ +{ + "individualId": "{{individualId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.yml b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.yml new file mode 100644 index 00000000000..fc5bdd788bb --- /dev/null +++ b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualId.yml @@ -0,0 +1,64 @@ +GetRidByIndividualId: + Resident_GetRidByIndividualId_all_Valid_Smoke: + endPoint: /idrepository/v1/identity/rid/{individualId} + uniqueIdentifier: TC_Idrepo_dependency + description: Get RID when valid individual id is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRidByIndividualId/GetRidByIndividualId + outputTemplate: resident/GetRidByIndividualId/GetRidByIndividualIdResult + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$" +}' + output: '{ + +}' + + Resident_GetRidByIndividualId_Perp_Vid_all_Valid_Smoke: + endPoint: /idrepository/v1/identity/rid/{individualId} + uniqueIdentifier: TC_Idrepo_dependency + description: Get RID when valid perpetual VID is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRidByIndividualId/GetRidByIndividualId + outputTemplate: resident/GetRidByIndividualId/GetRidByIndividualIdResult + input: '{ + "individualId": "$ID:GenerateVID_Perpetual_GetRid_Valid_Smoke_sid_vid$" +}' + output: '{ + +}' + + Resident_GetRidByIndividualId_OneTime_Vid_Valid_Smoke: + endPoint: /idrepository/v1/identity/rid/{individualId} + uniqueIdentifier: TC_Idrepo_dependency + description: Get RID when valid OneTime use VID is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRidByIndividualId/GetRidByIndividualId + outputTemplate: resident/GetRidByIndividualId/GetRidByIndividualIdResult + input: '{ + "individualId": "$ID:GenerateVID_Onetimeuse_GetRid_Valid_Smoke_sid_vid$" +}' + output: '{ + +}' + + Resident_GetRidByIndividualId_Temp_Vid_all_Valid_Smoke: + endPoint: /idrepository/v1/identity/rid/{individualId} + uniqueIdentifier: TC_Idrepo_dependency + description: Get RID when valid Temporary VID is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetRidByIndividualId/GetRidByIndividualId + outputTemplate: resident/GetRidByIndividualId/GetRidByIndividualIdResult + input: '{ + "individualId": "$ID:GenerateVID_Temp_GetRid_Valid_Smoke_sid_vid$" +}' + output: '{ + +}' diff --git a/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualIdResult.hbs b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualIdResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetRidByIndividualId/GetRidByIndividualIdResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.hbs b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.hbs new file mode 100644 index 00000000000..953990f29ef --- /dev/null +++ b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.hbs @@ -0,0 +1,11 @@ +{ + "langcode": "{{langcode}}", + "pageIndex": "{{pageIndex}}", + "pageSize": "{{pageSize}}", + "fromDate": "{{fromDate}}", + "toDate": "{{toDate}}", + "sortType": "{{sortType}}", + "serviceType": "{{serviceType}}", + "statusFilter": "{{statusFilter}}", + "searchText": "{{searchText}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.yml b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.yml new file mode 100644 index 00000000000..21f32e027d8 --- /dev/null +++ b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistory.yml @@ -0,0 +1,2248 @@ +GetServiceHistory: + Resident_GetServiceHistory_uin_all_Valid_Smoke_sid: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_01 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Invalid_LangCode_Neg: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_02 + description: Get service history when logged in using UIN and invalid language code is given + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_StatusCode_Missing_Langcode_Neg: + endPoint: /resident/v1/service-history + uniqueIdentifier: TC_Resident_GetserviceHistory_03 + description: Get service history when logged in using UIN and language code value is given as empty + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$REMOVE$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: "404" + + Resident_GetServiceHistory_uin_1_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_04 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_2_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_05 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_3_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_06 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_UPDATE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_4_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_07 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "ID_MANAGEMENT_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_5_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_08 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_SHARE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Date_Specified_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_09 + description: Get service history when logged in using UIN and from date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Invalid_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_10 + description: Get service history when logged in using UIN and invalid from date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_From_To_Date_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_11 + description: Get service history when logged in using UIN and to date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "2022-12-06", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Empty_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_12 + description: Get service history when logged in using UIN and from date value is passed as empty + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Empty_ToDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_13 + description: Get service history when logged in using UIN and to date value is passed as empty + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_pageIndex_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_14 + description: Get service history when logged in using UIN and invalid pageIndex value is given + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "sdjv$#", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Valid_pageIndex_Smoke: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_15 + description: Get service history when logged in using UIN and valid pageIndex value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "0", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Negative_PageFetch_Value_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_16 + description: Get service history when logged in using UIN and negative value is given in pageSize + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "-1", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_Random_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_17 + description: Get service history when logged in using UIN and invalid random value is given as pageFetch value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "sdsd#$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_18 + description: Get service history when logged in using UIN and invalid pageFetch value is given + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "0", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Multiple_ServiceType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_19 + description: Get service history when logged in using UIN and multiple service types is given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST,SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_ASC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_20 + description: Get service history when logged in using UIN and sort type is given as ASC + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ASC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_DESC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_21 + description: Get service history when logged in using UIN and sort type is given as DESC + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "DESC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Empty_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_22 + description: Get service history when logged in using UIN and sort type is not given in input parameter + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_23 + description: Get service history when logged in using UIN and invalid value is given as sort type + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ssd$#$#", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_SearchText_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_24 + description: Get service history when logged in using UIN and valid value is given in search text + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "1" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_0_SearchText_Pos: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_25 + description: Get service history when logged in using UIN and value '0' is given in search text + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "0" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_SearchText_Random_Pos: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_26 + description: Get service history when logged in using UIN and random value is given in search text field + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "sdsd##" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_StatusFilter_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_27 + description: Get service history when logged in using UIN and valid status filter values are given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SUCCESS,IN_PROGRESS,FAILED", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_StatusFilter_Invalid_Neg: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_28 + description: Get service history when logged in using UIN and invalid value is given as status filter values + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SD$#$%", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_Invalid_Token: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_29 + description: Get service history when invalid token is used + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_all_Valid_Smoke_sid: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_30 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Invalid_LangCode_Neg: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_31 + description: Get service history when logged in using UIN and invalid language code is given + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_StatusCode_Missing_Langcode_Neg: + endPoint: /resident/v1/service-history + uniqueIdentifier: TC_Resident_GetserviceHistory_32 + description: Get service history when logged in using UIN and language code is not given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$REMOVE$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: "404" + + Resident_GetServiceHistory_uin_1_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_33 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_2_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_34 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_3_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_35 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_UPDATE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_4_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_36 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "ID_MANAGEMENT_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_5_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_37 + description: Get service history when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_SHARE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Date_Specified_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_38 + description: Get service history when logged in using UIN and valid from date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Invalid_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_39 + description: Get service history when logged in using UIN and invalid from date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_From_To_Date_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_40 + description: Get service history when logged in using UIN and invalid from and to date is specified + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "2022-12-06", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Empty_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_41 + description: Get service history when logged in using UIN and from date is not given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Empty_ToDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_42 + description: Get service history when logged in using UIN and to date value is not given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_pageIndex_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_43 + description: Get service history when logged in using UIN and invalid page index is given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "sdjv$#", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Valid_pageIndex_Smoke: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_44 + description: Get service history when logged in using UIN and valid pageIndex values are given + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "0", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Negative_PageFetch_Value_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_45 + description: Get service history when logged in using UIN and negative value is given in page fetch + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "-1", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_Random_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_46 + description: Get service history when logged in using UIN and page fetch value is given as invalid/random value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "sdsd#$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_47 + description: Get service history when logged in using UIN and page fetch value is given as invalid value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "0", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Multiple_ServiceType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_48 + description: Get service history when logged in UIN and multiple service type is given input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST,SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_ASC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_49 + description: Get service history when logged in UIN and when sort type is given as ASC + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ASC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_DESC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_50 + description: Get service history when logged in UIN and when sort type is given as ASC + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "DESC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_Empty_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_51 + description: Get service history when logged in UIN and when sort type value is not given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_Invalid_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_52 + description: Get service history when logged in UIN and when invalid sort type value is given in input parameters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ssd$#$#", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_uin_SearchText_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_53 + description: Get service history when logged in UIN and when search text is given with valid values + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "1" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_0_SearchText_Pos: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_54 + description: Get service history when logged in UIN and when search text value is given as '0' + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "0" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_SearchText_Random_Pos: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_55 + description: Get service history when logged in UIN and random value is given in search text field + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "sdsd##" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_StatusFilter_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_56 + description: Get service history when logged in UIN and valid values given in status filter + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SUCCESS,IN_PROGRESS,FAILED", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_uin_StatusFilter_Invalid_Neg: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_57 + description: Get service history when logged in UIN and invalid values given in status filter field + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SD$#$%", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_GetServiceHistory_vid_all_Valid_Smoke_sid: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_58 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_Invalid_LangCode_Neg: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_59 + description: Get service history when logged in using VID and invalid language code is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "hinn", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_StatusCode_Missing_Langcode_Neg: + endPoint: /resident/v1/service-history + uniqueIdentifier: TC_Resident_GetserviceHistory_60 + description: Get service history when logged in using valid VID and language code is not given in input parameters + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$REMOVE$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: "404" + + Resident_GetServiceHistory_vid_1_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_61 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_2_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_62 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_3_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_63 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_UPDATE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_4_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_64 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "ID_MANAGEMENT_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_5_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_65 + description: Get service history when logged in using valid VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "DATA_SHARE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_Date_Specified_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_66 + description: Get service history when logged in using valid VID and from date is specified + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_Invalid_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_67 + description: Get service history when logged in using valid VID and invalid from date is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Invalid_From_To_Date_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_68 + description: Get service history when logged in using valid VID and invalid from and to date is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2035-12-07", + "toDate": "2022-12-06", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Empty_FromDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_69 + description: Get service history when logged in using valid VID and from date is not given in input parameter + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "", + "toDate": "$DATESTAMP$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Empty_ToDate_Neg: + endPoint: /resident/v1/service-history/{langcode}?fromDate={fromDate}&toDate={toDate} + uniqueIdentifier: TC_Resident_GetserviceHistory_70 + description: Get service history when logged in using valid VID and to date is not given in input parameter + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "2022-12-07", + "toDate": "", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Invalid_pageIndex_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_71 + description: Get service history when logged in using valid VID and invalid page index is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "sdjv$#", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Valid_pageIndex_Smoke: + endPoint: /resident/v1/service-history/{langcode}?pageIndex={pageIndex} + uniqueIdentifier: TC_Resident_GetserviceHistory_72 + description: Get service history when logged in using valid VID and valid page index is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "0", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Negative_PageFetch_Value_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_73 + description: Get service history when logged in using valid VID and negative value is given for page fetch + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "-1", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Invalid_Random_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_74 + description: Get service history when logged in using valid VID and invalid/random value is given in page fetch + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "sdsd#$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Invalid_PageFetch_Neg: + endPoint: /resident/v1/service-history/{langcode}?pageSize={pageSize} + uniqueIdentifier: TC_Resident_GetserviceHistory_75 + description: Get service history when logged in using valid VID and invalid value is given in page fetch + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "0", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-447", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Multiple_ServiceType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?serviceType={serviceType} + uniqueIdentifier: TC_Resident_GetserviceHistory_76 + description: Get service history when logged in using valid VID and multiple values are given in service type field + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "AUTHENTICATION_REQUEST,SERVICE_REQUEST", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_ASC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_77 + description: Get service history when logged in using valid VID and sort type value is given as ASC + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ASC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_DESC_SortType_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_78 + description: Get service history when logged in using valid VID and sort type value is given as DESC + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "DESC", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_Empty_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_79 + description: Get service history when logged in using valid VID and sort type value is not given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_Invalid_SortType_Neg: + endPoint: /resident/v1/service-history/{langcode}?sortType={sortType} + uniqueIdentifier: TC_Resident_GetserviceHistory_80 + description: Get service history when logged in using valid VID and invalid sort type value is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "ssd$#$#", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetServiceHistory_vid_SearchText_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_81 + description: Get service history when logged in using valid VID and valid search text is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "1" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_0_SearchText_Pos: + endPoint: /resident/v1/service-history/{langcode}?searchText={searchText} + uniqueIdentifier: TC_Resident_GetserviceHistory_82 + description: Get service history when logged in using valid VID and search text is given as '0' + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "0" +}' + output: '{ + +}' + + + + Resident_GetServiceHistory_vid_StatusFilter_Valid_Smoke: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_83 + description: Get service history when logged in using valid VID and valid status filter is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/GetServiceHistory/GetServiceHistoryResult + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SUCCESS,IN_PROGRESS,FAILED", + "searchText": "$REMOVE$" +}' + output: '{ + +}' + + Resident_GetServiceHistory_vid_StatusFilter_Invalid_Neg: + endPoint: /resident/v1/service-history/{langcode}?statusFilter={statusFilter} + uniqueIdentifier: TC_Resident_GetserviceHistory_84 + description: Get service history when logged in using valid VID and invalid status filter is given + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "SD$#$%", + "searchText": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_GetServiceHistory_StatusCode_Empty_Token: + endPoint: /resident/v1/service-history/{langcode} + uniqueIdentifier: TC_Resident_GetserviceHistory_85 + description: Get service history when logged in using valid VID and token is not given + role: + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetServiceHistory/GetServiceHistory + outputTemplate: resident/error + input: '{ + "langcode": "$1STLANG$", + "pageIndex": "$REMOVE$", + "pageSize": "$REMOVE$", + "fromDate": "$REMOVE$", + "toDate": "$REMOVE$", + "sortType": "$REMOVE$", + "serviceType": "$REMOVE$", + "statusFilter": "$REMOVE$", + "searchText": "$REMOVE$" +}' + output: "401" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistoryResult.hbs b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistoryResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetServiceHistory/GetServiceHistoryResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.hbs b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.hbs new file mode 100644 index 00000000000..dde960d957c --- /dev/null +++ b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.hbs @@ -0,0 +1,3 @@ +{ + "langcode": "{{langcode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.yml b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.yml new file mode 100644 index 00000000000..d88b67bbaf7 --- /dev/null +++ b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDoc.yml @@ -0,0 +1,32 @@ +GetSupportingDoc: + Resident_GetSupportingDoc_all_Valid_Smoke: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_SupportingDocument_01 + description: Get supporting documents + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetSupportingDoc/GetSupportingDoc + outputTemplate: resident/GetSupportingDoc/GetSupportingDocResult + input: '{ + "langcode": "$1STLANG$" +}' + output: '{ + +}' + + Resident_GetSupportingDoc_Invalid_Langcode_Neg: + endPoint: /resident/v1/download/supporting-documents + uniqueIdentifier: TC_Resident_SupportingDocument_02 + description: Get supporting documents when invalid language code is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetSupportingDoc/GetSupportingDoc + outputTemplate: resident/GetSupportingDoc/GetSupportingDocResult + input: '{ + "langcode": "engg" +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDocResult.hbs b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDocResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetSupportingDoc/GetSupportingDocResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetUiProperties/GetUiProperties.yml b/api-test/src/main/resources/resident/GetUiProperties/GetUiProperties.yml new file mode 100644 index 00000000000..490ae32a1fa --- /dev/null +++ b/api-test/src/main/resources/resident/GetUiProperties/GetUiProperties.yml @@ -0,0 +1,14 @@ +GetUiProperties: + Resident_GetUiProperties_all_Valid_Smoke: + endPoint: /resident/v1/proxy/config/ui-properties + uniqueIdentifier: TC_Resident_GetUiProperties_01 + description: Get UI properties + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetUiProperties/getUiProperties + outputTemplate: resident/GetUiProperties/getUiPropertiesResult + input: '{ +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetUiProperties/getUiProperties.hbs b/api-test/src/main/resources/resident/GetUiProperties/getUiProperties.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetUiProperties/getUiProperties.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetUiProperties/getUiPropertiesResult.hbs b/api-test/src/main/resources/resident/GetUiProperties/getUiPropertiesResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetUiProperties/getUiPropertiesResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidDocumentByLangCode/GetValidDocumentByLangCode.yml b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/GetValidDocumentByLangCode.yml new file mode 100644 index 00000000000..a6adb8ab3e5 --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/GetValidDocumentByLangCode.yml @@ -0,0 +1,89 @@ +GetValidDocumentByLangCode: + Resident_GetValidDocumentByLangCode_All_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/validdocuments/{langCode} + uniqueIdentifier: TC_Resident_GetvalidDocument_01 + description: Get valid documents for given language code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCode + outputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCodeResult + input: '{ + "langCode": "$1STLANG$" +}' + output: '{ +}' + + + + Resident_GetValidDocumentByLangCode_Invalid_LangCode: + endPoint: /resident/v1/proxy/masterdata/validdocuments/{langCode} + uniqueIdentifier: TC_Resident_GetvalidDocument_02 + description: Get valid documents by giving invalid language code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCode + outputTemplate: resident/error + input: '{ + "langCode": "engg" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetValidDocumentByLangCode_Valid_Smoke: + endPoint: /resident/v1/proxy/masterdata/validdocuments/{langCode} + uniqueIdentifier: TC_Resident_GetvalidDocument_03 + description: Get valid documents for given language code + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCode + outputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCodeResult + input: '{ + "langCode": "$1STLANG$" +}' + output: '{ + +}' + + Resident_GetValidDocumentByLangCode_StatusCode_Empty_Invalid_Neg: + endPoint: /resident/v1/proxy/masterdata/validdocuments/{langCode} + uniqueIdentifier: TC_Resident_GetvalidDocument_04 + description: Get valid documents by not giving language code in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCode + outputTemplate: resident/error + input: '{ + "langCode": "" +}' + output: "404" + + Resident_GetValidDocumentByLangCode_Invalid_LangCode_Neg: + endPoint: /resident/v1/proxy/masterdata/validdocuments/{langCode} + uniqueIdentifier: TC_Resident_GetvalidDocument_05 + description: Get valid documents by giving invalid language code is given in input parameters + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidDocumentByLangCode/getValidDocumentByLangCode + outputTemplate: resident/error + input: '{ + "langCode": "ttt" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCode.hbs b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCode.hbs new file mode 100644 index 00000000000..adc9d4cb6d3 --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCode.hbs @@ -0,0 +1,3 @@ +{ + "langCode": "{{langCode}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCodeResult.hbs b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCodeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidDocumentByLangCode/getValidDocumentByLangCodeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidateToken/GetValidateToken.yml b/api-test/src/main/resources/resident/GetValidateToken/GetValidateToken.yml new file mode 100644 index 00000000000..fc56447bfa2 --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidateToken/GetValidateToken.yml @@ -0,0 +1,70 @@ +GetValidateToken: + Resident_GetValidateToken_uin_all_Valid_Smoke: + endPoint: /resident/v1/authorize/admin/validateToken + uniqueIdentifier: TC_Resident_GetvalidateToken_01 + description: Get validate token when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/GetValidateToken/getValidateToken + outputTemplate: resident/GetValidateToken/getValidateTokenResult + input: '{ +}' + output: '{ +}' + + Resident_GetValidateToken_vid_all_Valid_Smoke: + endPoint: /resident/v1/authorize/admin/validateToken + uniqueIdentifier: TC_Resident_GetvalidateToken_02 + description: Get validate token when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidateToken/getValidateToken + outputTemplate: resident/GetValidateToken/getValidateTokenResult + input: '{ +}' + output: '{ +}' + + + Resident_GetValidateToken_Invalid_Token: + endPoint: /resident/v1/authorize/admin/validateToken + uniqueIdentifier: TC_Resident_GetvalidateToken_03 + description: Get validate token + role: invalid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidateToken/getValidateToken + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_GetValidateToken_Empty_Token_Neg: + endPoint: /resident/v1/authorize/admin/validateToken + uniqueIdentifier: TC_Resident_GetvalidateToken_04 + description: Get validate token when token is not given + role: + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/GetValidateToken/getValidateToken + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidateToken/getValidateToken.hbs b/api-test/src/main/resources/resident/GetValidateToken/getValidateToken.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidateToken/getValidateToken.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GetValidateToken/getValidateTokenResult.hbs b/api-test/src/main/resources/resident/GetValidateToken/getValidateTokenResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GetValidateToken/getValidateTokenResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.hbs b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.hbs new file mode 100644 index 00000000000..de2528b3d94 --- /dev/null +++ b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.hbs @@ -0,0 +1,14 @@ +{ + "id": "mosip.resident.grievance.ticket.request", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "eventId" : "{{eventId}}", + "name" : "{{name}}", + "emailId" : "{{emailId}}", + "alternateEmailId" : "{{alternateEmailId}}", + "phoneNo" : "{{phoneNo}}", + "alternatePhoneNo" : "{{alternatePhoneNo}}", + "message" : "{{message}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.yml b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.yml new file mode 100644 index 00000000000..cea299005ef --- /dev/null +++ b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicket.yml @@ -0,0 +1,427 @@ +GrievanceTicket: + Resident_GrievanceTicket_uin_all_Valid_Smoke: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_01 + description: Log Grievance ticket when logged using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/GrievanceTicket/GrievanceTicketResult + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "$REMOVE$", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "$REMOVE$", + "message" : "Share" +}' + output: '{ + +}' + + Resident_GrievanceTicket_uin_InvalidUser_Token_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_02 + description: Log Grievance ticket when logged using UIN with invalid token + role: resident + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "residentautomation@gmail.com", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_StatusCode_Invalid_Token_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_03 + description: Log Grievance ticket when logged in using UIN with invalid token + role: invalid + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "residentautomation@gmail.com", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: "401" + + Resident_GrievanceTicket_uin_StatusCode_Empty_Token_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_04 + description: Log Grievance ticket when logged in using UIN without token + role: + checkErrorsOnlyInResponse: true + validityCheckRequired: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "gdbfgdh", + "name" : "FR", + "emailId" : "residentautomation@gmail.com", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: "401" + + Resident_GrievanceTicket_uin_Invalid_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_05 + description: Log Grievance ticket when logged in using UIN with invalid EID + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "skhdbssk#$@", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_Diff_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_06 + description: Log Grievance ticket when logged in using UIN with EID taken from other UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "21683123465", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_Missing_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_07 + description: Log Grievance ticket when logged in using UIN without EID value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$REMOVE$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_Empty_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_08 + description: Log Grievance ticket when logged in using UIN with empty EID value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_Empty_Msg_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_09 + description: Log Grievance ticket when logged in using UIN with empty message + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_Missing_Msg_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_10 + description: Log Grievance ticket when logged in using UIN without message value + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_uin_OverRange_Msg_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_11 + description: Log Grievance ticket when logged in using UIN with message is given more than limited characters + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "NYikr3XZNUAYRaljrkcmojb3tuXF1qaCqbcGnq75S5qNkOdBFvqmTXlbGBSNHy6hvn6uajoe5ZPVj568FsIaJMusAqdnN7MmSCVPa4PppA0yzpKq7NyOh1MIRDSoVH9Y8FvGui1sOj9hCYKSYRJBhichjNaxRrJFzfGyE7Xa1DeutPcHhWEhSHf2nvalGI4naB7TyqxC5YPjO45RSM9iYnqix3LmqQtaCRmQAgSjdz9Zrx6J0aMpaAL0qvWQcP0VVFMQcsqqPddOLuTBFkZrXL37MvePWYWVtrQ6JBvDlaOEDjAZ6PIAaXRZNlO6zVe3GHh6UFqOi6Rctt1KyoaPTd5yfn14TTrLSKkg3SKekALXK1LNF0zhD8evv4EVzVRd0yZ79tvUMpNwVGA81Qx0mdK2Wipp9fqfoS9ziZWasJn4CcFeQI6fYRZCNKyYnJz0q8GXSKlcMvdyluE0RVs8ZAdzvamWzJWny7pS6AbW4pcpkb9fl9F1KkU25Rsw1htcK5PWXMfTqeaDXB4tryiYQwezwyqSwT2isYdZdg3kDVjcKFG6G9aBouimGnYCh4msuycgBvAJ1rMJEHetVsxAZmR1dJAFmH8XhHuCOBCqS6C99Ghj0jcYmAcFTOExkj4a7f8s8Qj6TYkfHocIkJ3SjxW4JnMF9fvMoLm27348iRZPi1zChmndky2Xa1Rt8wtHg9JRn7F5o7MUWFcd3dOIHZVNMMNlxFl6jvpivWkW1t1dJZLpn2dLxlMCQZ4jybKxvcrOAct3sgt4c4YFL0P2oIAsTVfthhzbNMkYeKIne9eM2a6ecX21RPS8ynyR9h9537QiCA43WcyXujoxmPZGrosbPHWQsjBEgxDn7jahN4k4JcFrcT8YUkmVhNPWJcsu3ZXalNjcnViktVopCTiW2ZD1NDezVPv0Z3gC3hdGomi3Utyekg5SbVjZ20UAeIlU5yMKlvLZWje2AZACRXlhZ9F0MkA5DhPGlpFuKhiKVpqlsWVcfq1iDtoj8KUMSWyVfdsggshsh" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_vid_all_Valid_Smoke: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_12 + description: Log Grievance ticket when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/GrievanceTicket/GrievanceTicketResult + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "alternateEmailId" : "$REMOVE$", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "$REMOVE$", + "message" : "Share" +}' + output: '{ + +}' + + Resident_GrievanceTicket_vid_Invalid_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_13 + description: Log Grievance ticket when logged in using VID and given invalid EID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "skhdbssk#$@", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_vid_Diff_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_14 + description: Log Grievance ticket when logged in using VID and given EID belongs to different VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "21683123465", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_vid_Missing_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_15 + description: Log Grievance ticket when logged in using VID and EID is removed from request + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "$REMOVE$", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "$IGNORE$" + } + ] +}' + + Resident_GrievanceTicket_vid_Empty_Eid_Neg: + endPoint: /resident/v1/grievance/ticket + uniqueIdentifier: TC_Resident_GrievanceTicket_16 + description: Log Grievance ticket when logged in using VID and empty value is given for EID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/GrievanceTicket/GrievanceTicket + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "eventId" : "", + "name" : "FR", + "emailId" : "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$", + "alternateEmailId" : "null", + "phoneNo" : "9876543210", + "alternatePhoneNo" : "null", + "message" : "Share" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "$IGNORE$" + } + ] +}' diff --git a/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicketResult.hbs b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicketResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/GrievanceTicket/GrievanceTicketResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/LoginUri/LoginUri.hbs b/api-test/src/main/resources/resident/LoginUri/LoginUri.hbs new file mode 100644 index 00000000000..cde656680a7 --- /dev/null +++ b/api-test/src/main/resources/resident/LoginUri/LoginUri.hbs @@ -0,0 +1,3 @@ +{ + "redirectURI": "{{redirectURI}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/LoginUri/LoginUri.yml b/api-test/src/main/resources/resident/LoginUri/LoginUri.yml new file mode 100644 index 00000000000..94d9a77dfc9 --- /dev/null +++ b/api-test/src/main/resources/resident/LoginUri/LoginUri.yml @@ -0,0 +1,15 @@ +LoginUri: + Resident_LoginUri_all_Valid_Smoke: + endPoint: /resident/v1/login/{redirectURI} + description: Verify login redirect URI + role: state + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/LoginUri/LoginUri + outputTemplate: resident/LoginUri/LoginUriResult + input: '{ + "redirectURI": "$BASE64URI$" +}' + output: '{ + +}' diff --git a/api-test/src/main/resources/resident/LoginUri/LoginUriResult.hbs b/api-test/src/main/resources/resident/LoginUri/LoginUriResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/LoginUri/LoginUriResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.hbs b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.hbs new file mode 100644 index 00000000000..e57f3b0c085 --- /dev/null +++ b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.hbs @@ -0,0 +1,19 @@ +{ + "requestTime": "{{requestTime}}", + "request": { + "clientId": "{{clientId}}", + "scope": "{{scope}}", + "responseType": "{{responseType}}", + "redirectUri": "{{redirectUri}}", + "display": "{{display}}", + "prompt": "{{prompt}}", + "acrValues": "{{acrValues}}", + "claims": { + "userinfo": {{userinfo}}, + "id_token": {} + }, + "nonce": "{{nonce}}", + "state": "{{state}}", + "claimsLocales": "{{claimsLocales}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.yml b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.yml new file mode 100644 index 00000000000..2d0634a1b30 --- /dev/null +++ b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequest.yml @@ -0,0 +1,52 @@ +OAuthDetailsRequest: + Resident_ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid: + endPoint: /v1/esignet/authorization/oauth-details + description: Get OAuth details + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/OAuthDetailsRequest/OAuthDetailsRequest + outputTemplate: resident/OAuthDetailsRequest/OAuthDetailsRequestResult + input: '{ + "requestTime": "$TIMESTAMP$", + "clientId": "$OIDCCLIENT$", + "scope": "openid profile Manage-Identity-Data Manage-VID Manage-Authentication Manage-Service-Requests Manage-Credentials", + "responseType": "code", + "redirectUri": "$BASEURI$/resident/v1/login-redirect/$BASE64URI$", + "display": "popup", + "prompt": "login", + "acrValues": "mosip:idp:acr:generated-code", + "nonce": "$UNIQUENONCEVALUEFORESIGNET$", + "state": "$RANDOMUUID$", + "claimsLocales": "en", + "userinfo": "$CLAIMSFROMCONFIG$" +}' + output: '{ + +}' + + Resident_ESignet_OAuthDetailsRequest_Vid_all_Valid_Smoke_sid: + endPoint: /v1/esignet/authorization/oauth-details + description: Get OAuth details for valid VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/OAuthDetailsRequest/OAuthDetailsRequest + outputTemplate: resident/OAuthDetailsRequest/OAuthDetailsRequestResult + input: '{ + "requestTime": "$TIMESTAMP$", + "clientId": "$OIDCCLIENT$", + "scope": "openid profile Manage-Identity-Data Manage-VID Manage-Authentication Manage-Service-Requests Manage-Credentials", + "responseType": "code", + "redirectUri": "$BASEURI$/resident/v1/login-redirect/$BASE64URI$", + "display": "popup", + "prompt": "login", + "acrValues": "mosip:idp:acr:generated-code", + "nonce": "$UNIQUENONCEVALUEFORESIGNET$", + "state": "$RANDOMUUID$", + "claimsLocales": "en", + "userinfo": "$CLAIMSFROMCONFIG$" +}' + output: '{ + +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequestResult.hbs b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequestResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/OAuthDetailsRequest/OAuthDetailsRequestResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.hbs b/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.hbs new file mode 100644 index 00000000000..1bf94c75f4c --- /dev/null +++ b/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.hbs @@ -0,0 +1,12 @@ +{ + "id": "{{id}}", + "version": "{{version}}", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "cardType": "{{cardType}}", + "otp": "{{otp}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.yml b/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.yml new file mode 100644 index 00000000000..d74d04e8c93 --- /dev/null +++ b/api-test/src/main/resources/resident/PRINTUIN/createPrintUin.yml @@ -0,0 +1,715 @@ +PrintUin: + Resident_PrintUin_All_Valid_Smoke: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_01 + description: Print UIN card when otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/PRINTUIN/createPrintUinResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Empty_Cardtype_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_02 + description: Print UIN card when otp requested using UIN and invalid card type is given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567891", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "@4544sss", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "1234567891", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_MaxLength10_Cardtype_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_03 + description: Print UIN card when otp requested using UIN and invalid card type is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567892", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UINNNNNNNNN", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "1234567892", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Missing_Cardtype_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_04 + description: Print UIN card when otp requested using UIN and card type value is missing + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567893", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "$REMOVE$", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567893", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_IndividualIDType_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_05 + description: Print UIN card when otp requested using UIN and individualId type value is given as invalid + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567894", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "U7876@N", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567894", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_MaxLength3_IndividualIDType_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_06 + description: Print UIN card when otp requested using UIN and invalid IndividualID type value is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567895", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "U76@N", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567895", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Missing_IndividualID_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_07 + description: Print UIN card when otp requested using UIN and individualId value is missing + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567896", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567896", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Empty_Otp_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_08 + description: Print UIN card when otp requested using UIN and otp is not given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_MaxLength6_Otp_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_09 + description: Print UIN card when otp requested using UIN and invalid otp is given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "1111112", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Otp_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_10 + description: Print UIN card when otp requested using UIN and invalid otp is given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "1@3fdss112", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Empty_requestTime_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_11 + description: Print UIN card when otp requested using UIN and request time value is given as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_withValidParameters_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Empty_TrnxID_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_12 + description: Print UIN card when otp requested using UIN and transaction id value is given as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Value_TrnxID_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_13 + description: Print UIN card when otp requested using UIN and invalid transaction id is given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "@dsfga456", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Empty_version_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_14 + description: Print UIN card when otp requested using UIN and version value is given as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_version_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_15 + description: Print UIN card when otp requested using UIN and invalid version is given in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "@dfr32", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_TDEA_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_TDEA_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Invalid_Individual_Id_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_16 + description: Print UIN card when otp requested using UIN and invalid individualId is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "6@3#7843", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Missing_Individual_Id_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_17 + description: Print UIN card when otp requested using UIN and individualId is missing in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_PrintUin_Empty_Individual_Id_Neg: + endPoint: /resident/v1/req/print-uin + uniqueIdentifier: TC_Resident_PrintUIN_18 + description: Print UIN card when otp requested using UIN and individualId value is given as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PRINTUIN/createPrintUin + outputTemplate: resident/error + input: '{ + "transactionID": "1234567898", + "individualId": "", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.printuin", + "version": "v1", + "cardType": "UIN", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "1234567898", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PRINTUIN/createPrintUinResult.hbs b/api-test/src/main/resources/resident/PRINTUIN/createPrintUinResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/PRINTUIN/createPrintUinResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.hbs b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.hbs new file mode 100644 index 00000000000..2c2b3a57e02 --- /dev/null +++ b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.hbs @@ -0,0 +1,13 @@ +{ + "id": "mosip.resident.download.personalized.card", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "attributes": [ + {{#each attributes}} + "{{attributesVal}}" + {{#unless @last}},{{/unless}} + {{/each}} + ] + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.yml b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.yml new file mode 100644 index 00000000000..63bd2c7f8b1 --- /dev/null +++ b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCard.yml @@ -0,0 +1,179 @@ +PersonalizedCard: + Resident_PersonalizedCard_uin_all_Valid_Smoke: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_01 + description: Download personalized card when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/PersonalizedCard/PersonalizedCardResult + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "YmFzZS02NC11cmwtZW5jb2RlZCBodG1sIGNvbnRlbnQ=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + +}' + + Resident_PersonalizedCard_vid_all_Valid_Smoke: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_02 + description: Download personalized card when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/PersonalizedCard/PersonalizedCardResult + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "YmFzZS02NC11cmwtZW5jb2RlZCBodG1sIGNvbnRlbnQ=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + +}' + + Resident_PersonalizedCard_Empty_Access_Token_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_03 + description: Download personalized card when access token is empty + role: + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "YmFzZS02NC11cmwtZW5jb2RlZCBodG1sIGNvbnRlbnQ=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] + +}' + + Resident_PersonalizedCard_Invalid_Access_Token_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_04 + description: Download personalized card using invalid access token + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "YmFzZS02NC11cmwtZW5jb2RlZCBodG1sIGNvbnRlbnQ=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] + +}' + + Resident_PersonalizedCard_uin_Invalid_Html_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_05 + description: Download personalized card when logged in using UIN and invalid html is given in request + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "sfdr$=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] +}' + + + Resident_PersonalizedCard_uin_Empty_Html_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_06 + description: Download personalized card when logged in using UIN and empty html is given in request + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] + +}' + + Resident_PersonalizedCard_vid_Invalid_Html_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_07 + description: Download personalized card when logged in using VID and invalid html is given in request + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "sfdr$=", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] +}' + + + Resident_PersonalizedCard_vid_Empty_Html_Neg: + endPoint: /resident/v1/download/personalized-card + uniqueIdentifier: TC_Resident_PersonalizesCard_08 + description: Download personalized card when logged in using VID and empty html is given in request + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/PersonalizedCard/PersonalizedCard + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "html": "", + "attributes": [{attributesVal: "firstName"}, {attributesVal: "dateOfBirth"}, {attributesVal: "email"}] +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410 ", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCardResult.hbs b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCardResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/PersonalizedCard/PersonalizedCardResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PinStatus/PinStatus.hbs b/api-test/src/main/resources/resident/PinStatus/PinStatus.hbs new file mode 100644 index 00000000000..b879b13dfab --- /dev/null +++ b/api-test/src/main/resources/resident/PinStatus/PinStatus.hbs @@ -0,0 +1,3 @@ +{ + "eventId": "{{eventId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PinStatus/PinStatus.yml b/api-test/src/main/resources/resident/PinStatus/PinStatus.yml new file mode 100644 index 00000000000..d4b0fc5465a --- /dev/null +++ b/api-test/src/main/resources/resident/PinStatus/PinStatus.yml @@ -0,0 +1,84 @@ +PinStatus: + Resident_PinStatus_uin_all_Valid_Smoke: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_PinStatus_01 + description: Pin status for EID when logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/PinStatus/PinStatus + outputTemplate: resident/PinStatus/PinStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + "status": "200" +}' + + Resident_PinStatus_vid_all_Valid_Smoke: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_PinStatus_02 + description: Pin status for EID when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/PinStatus/PinStatus + outputTemplate: resident/PinStatus/PinStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + "status": "200" +}' + + Resident_PinStatus_uin_Invalid_Input_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_PinStatus_03 + description: Pin status for invalid EID when logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/PinStatus/PinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$@kk$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_PinStatus_vid_Invalid_Input_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_PinStatus_04 + description: Pin status for invalid EID when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/PinStatus/PinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$@kk$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_PinStatus_uin_StatusCode_Invalid_Token_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_PinStatus_05 + description: Pin status for EID when logged in using UIN with invalid token + role: invalid + validityCheckRequired: true + restMethod: post + inputTemplate: resident/PinStatus/PinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: "401" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PinStatus/PinStatusResult.hbs b/api-test/src/main/resources/resident/PinStatus/PinStatusResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/PinStatus/PinStatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.hbs b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.yml b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.yml new file mode 100644 index 00000000000..c3326e99c89 --- /dev/null +++ b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTime.yml @@ -0,0 +1,46 @@ +PutBellUpdatedTime: + Resident_PutBellUpdatedTime_uin_StatusCode_all_Valid_Smoke: + endPoint: /resident/v1/bell/updatedttime + uniqueIdentifier: TC_Resident_BellUpdatedTime_01 + description: Bell updated time when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: put + inputTemplate: resident/PutBellUpdatedTime/PutBellUpdatedTime + outputTemplate: resident/PutBellUpdatedTime/PutBellUpdatedTimeResult + input: '{ +}' + output: "200" + + Resident_PutBellUpdatedTime_vid_StatusCode_all_Valid_Smoke: + endPoint: /resident/v1/bell/updatedttime + uniqueIdentifier: TC_Resident_BellUpdatedTime_02 + description: Bell updated time when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: put + inputTemplate: resident/PutBellUpdatedTime/PutBellUpdatedTime + outputTemplate: resident/PutBellUpdatedTime/PutBellUpdatedTimeResult + input: '{ +}' + output: "200" + + Resident_PutBellUpdatedTime_Invalid_Token: + endPoint: /resident/v1/bell/updatedttime + uniqueIdentifier: TC_Resident_BellUpdatedTime_03 + description: Bell updated time when invalid token is given to login + role: resident + checkErrorsOnlyInResponse: true + restMethod: put + inputTemplate: resident/PutBellUpdatedTime/PutBellUpdatedTime + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTimeResult.hbs b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTimeResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/PutBellUpdatedTime/PutBellUpdatedTimeResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.hbs b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.hbs new file mode 100644 index 00000000000..1609298961f --- /dev/null +++ b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.hbs @@ -0,0 +1,15 @@ +{ + "id": "mosip.identity.otp.internal", + "version": "1.0", + "transactionId": "{{transactionId}}", + "requestTime": "{{requestTime}}", + "individualId": "{{individualId}}", + "otpChannel": [ + {{#each otpChannel}} + "{{channel}}" + {{#unless @last}},{{/unless}} + {{/each}} + ], + "metadata": {}, + "aid": "{{aid}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.yml b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.yml new file mode 100644 index 00000000000..906727a4b36 --- /dev/null +++ b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtp.yml @@ -0,0 +1,142 @@ +ReqAidOtp: + Resident_ReqAidOtp_all_Valid_Smoke: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_01 + description: Request otp using UIN + role: resident + restMethod: post + checkErrorsOnlyInResponse: true + auditLogCheck: true + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/ReqAidOtp/ReqAidOtpResult + input: '{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" +}' + + Resident_ReqAidOtp_Invalid_IndividualId_Neg: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_02 + description: Request otp using invalid individualID + role: resident + restMethod: post + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "@$$#$#", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqAidOtp_Empty_IndividualId_Neg: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_03 + description: Request otp when individualId value is empty + role: resident + restMethod: post + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqAidOtp_Invalid_TransactionID_Neg: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_04 + description: Request otp bu giving invalid transcationId + role: resident + restMethod: post + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/error + input: '{ + "transactionId": "@#$###$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqAidOtp_Empty_TransactionID_Neg: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_05 + description: Request otp when transcationId is empty + role: resident + restMethod: post + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/error + input: '{ + "transactionId": "", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "EMAIL"},{channel: "PHONE"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqAidOtp_Invalid_OtpChannel_Neg: + endPoint: /resident/v1/individualId/otp + uniqueIdentifier: TC_Resident_ReqAID_06 + description: Request otp with invalid otpChannel + role: resident + restMethod: post + inputTemplate: resident/ReqAidOtp/ReqAidOtp + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "otpChannel": [{channel: "@##$$#"}], + "aid": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$" +}' + output: '{ + "errors": [ + { + "errorCode": "IDA-MLC-009", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtpResult.hbs b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtpResult.hbs new file mode 100644 index 00000000000..0a63321ce5b --- /dev/null +++ b/api-test/src/main/resources/resident/ReqAidOtp/ReqAidOtpResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}", + "maskedEmail": "{{maskedEmail}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.hbs b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.hbs new file mode 100644 index 00000000000..2f1f1f500e0 --- /dev/null +++ b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.hbs @@ -0,0 +1,17 @@ +{ + "id": "mosip.resident.share.credential", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "partnerId": "{{partnerId}}", + "sharableAttributes": [ + { + "attributeName": "{{attributeName}}", + "format": "{{format}}", + "masked": {{masked}} + } + ], + "purpose": "{{purpose}}", + "consent": "{{consent}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.yml b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.yml new file mode 100644 index 00000000000..492c408a181 --- /dev/null +++ b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartner.yml @@ -0,0 +1,362 @@ +ReqShareCredWithPartner: + Resident_ReqShareCredWithPartner_uin_all_Valid_Smoke: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_01 + description: Request credential to share with partner + role: residentNew + restMethod: post + auditLogCheck: true + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": "string", + "consent" : "Accepted", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "requesttime": "$TIMESTAMP$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_Invalid__AccessToken_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_02 + description: Request credential to share with partner with invalid token + role: resident + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "string", + "consent" : "Accepted", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "requesttime": "$TIMESTAMP$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_uin_Empty_Purpose_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_03 + description: Request credential to share with partner when logged in using UIN and purpose is empty + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "Missing input Parameter- " + } + ], + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_uin_Invalid_Space_Purpose_Pos: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_04 + description: Request credential to share with partner when logged in using UIN and purpose is given with only spaces + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": " string", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_uin_AlphaNumeric_Value_Purpose_Pos: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_05 + description: Request credential to share with partner when logged in using UIN and purpose is given as alphanumeric values + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": "asgdf12j", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + Resident_ReqShareCredWithPartner_uin_Invalid_Purpose_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_06 + description: Request credential to share with partner when logged in using UIN and purpose is given with invalid value + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "a12$%", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-515", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_uin_Empty_Consent_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_07 + description: Request credential to share with partner when logged in using UIN and consent is given empty + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "string", + "consent" : "", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_uin_Input_Consent_Absent_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_08 + description: Request credential to share with partner when logged in using UIN and consent value is not given + role: residentNew + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "string", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_uin_all_Valid_Smoke_sid_partnerID$", + "consent" : "$REMOVE$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_vid_all_Valid_Smoke: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_09 + description: Request credential to share with partner when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": "string", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_vid_Empty_Purpose_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_10 + description: Request credential to share with partner when logged in using VID and purpose is given empty + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "", + "consent" : "Accepted", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-414", + "message": "Missing input Parameter- " + } + ], + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_vid_Invalid_Space_Purpose: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_11 + description: Request credential to share with partner when logged in using VID and purpose is given with only spaces + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": " string", + "consent" : "Accepted", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "requesttime": "$TIMESTAMP$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + + Resident_ReqShareCredWithPartner_Vid_AlphaNumeric_Value_Purpose_Pos: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_12 + description: Request credential to share with partner when logged in using VID and purpose is given as alphanumeric values + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult + input: '{ + "purpose": "asgdf12j", + "consent" : "Accepted", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "requesttime": "$TIMESTAMP$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "status": "Success" +}' + Resident_ReqShareCredWithPartner_Vid_Invalid_Purpose_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_13 + description: Request credential to share with partner when logged in using VID and purpose value is given invalid + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "a12$%", + "consent" : "Accepted", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "requesttime": "$TIMESTAMP$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-515", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_Vid_Empty_Consent_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_14 + description: Request credential to share with partner when logged in using VID and consent is given empty + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "string", + "consent" : "", + "requesttime": "$TIMESTAMP$", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$IGNORE$" + } + ] +}' + + Resident_ReqShareCredWithPartner_vid_Input_Consent_Absent_Neg: + endPoint: /resident/v1/share-credential + uniqueIdentifier: TC_Resident_ShareCredentialWithPartner_15 + description: Request credential to share with partner when logged in using VID and consent is removed from request + role: residentNewVid + restMethod: post + inputTemplate: resident/ReqShareCredWithPartner/ReqShareCredWithPartner + outputTemplate: resident/error + input: '{ + "purpose": "string", + "requesttime": "$TIMESTAMP$", + "consent" : "$REMOVE$", + "partnerId": "$ID:GetPartnersByPartnerType_vid_all_Valid_Smoke_sid_partnerID$", + "attributeName" : "dateOfBirth", + "format" : "YYYY", + "masked" : true +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$IGNORE$" + } + ] +}' + diff --git a/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult.hbs b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/ReqShareCredWithPartner/ReqShareCredWithPartnerResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.hbs b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.yml b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.yml new file mode 100644 index 00000000000..6680d90ddab --- /dev/null +++ b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVID.yml @@ -0,0 +1,49 @@ +RetrieveVID: + Resident_RetrieveVID_uin_all_Valid_Smoke: + endPoint: /resident/v1/vids + uniqueIdentifier: TC_Resident_RetrieveVid_01 + description: Retrieve VIDs when logged using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: get + auditLogCheck: true + inputTemplate: resident/RetrieveVID/RetrieveVID + outputTemplate: resident/RetrieveVID/RetrieveVIDResult + input: '{ +}' + output: '{ +}' + + Resident_RetrieveVID_Vid_all_Valid_Smoke: + endPoint: /resident/v1/vids + uniqueIdentifier: TC_Resident_RetrieveVid_02 + description: Retrieve VIDs when logged using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/RetrieveVID/RetrieveVID + outputTemplate: resident/RetrieveVID/RetrieveVIDResult + input: '{ +}' + output: '{ +}' + + Resident_RetrieveVID_Invalid_Token_Neg: + endPoint: /resident/v1/vids + uniqueIdentifier: TC_Resident_RetrieveVid_03 + description: Retrieve VIDs when invalid token is used + role: resident + checkErrorsOnlyInResponse: true + restMethod: get + inputTemplate: resident/RetrieveVID/RetrieveVID + outputTemplate: resident/error + input: '{ +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RetrieveVID/RetrieveVIDResult.hbs b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVIDResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/RetrieveVID/RetrieveVIDResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.hbs b/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.hbs new file mode 100644 index 00000000000..ca852a8d03e --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.hbs @@ -0,0 +1,12 @@ +{ + "id": "{{id}}", + "version": "{{version}}", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "otp": "{{otp}}", + "vidStatus": "{{vidStatus}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.yml b/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.yml new file mode 100644 index 00000000000..5291dc2d345 --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVID/createRevokeVID.yml @@ -0,0 +1,1185 @@ +RevokeVID: + Resident_Revoke_Perpetual_VID_UsingSameVID_Invalid: + endPoint: /resident/v1/vid/$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_01 + description: Revoke Perpetual VID when Otp requested using same VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-471" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Temporary_VID_UsingSameVID_Invalid: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_02 + description: Revoke Temporary VID when Otp requested using same VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-471" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Onetimeuse_VID_UsingSameVID_Invalid: + endPoint: /resident/v1/vid/$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_03 + description: Revoke Onetimeuse VID when Otp requested using same VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-471" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Invalid_Id: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_04 + description: Revoke Perpetual VID by giving id value invalid and otp requested uisng UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "m@@@333dstus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Missing_Id: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_05 + description: Revoke Perpetual VID by removing id attribute from request and otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_Id: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_06 + description: Revoke Perpetual VID when Otp requested using UIN and id value is given empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Invalid_Individual_Id: + endPoint: /resident/v1/vid/@234rff + uniqueIdentifier: TC_Resident_RevokeVid_07 + description: Revoke Perpetual VID when Otp requested using UIN and invalid individual id is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RevokeVID_Missing_Individual_Id: + endPoint: /resident/v1/vid/$REMOVE$ + uniqueIdentifier: TC_Resident_RevokeVid_08 + description: Revoke Perpetual VID when Otp requested using UIN and individual id is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_Individual_Id: + endPoint: /resident/v1/vid/"" + uniqueIdentifier: TC_Resident_RevokeVid_10 + description: Revoke Perpetual VID when Otp requested using UIN and individual id value is given empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RevokeVID_Missing_Request_Time: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_11 + description: Revoke temporary VID when Otp requested using UIN and requesttime is removed in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$REMOVE$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RevokeVID_Invalid_Request_Time: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_12 + description: Revoke temporary VID when Otp requested using UIN and invalid requesttime is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "@22222ggdhh", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_Request_Time: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_13 + description: Revoke temporary VID when Otp requested using UIN and requesttime is given empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Invalid_version: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_14 + description: Revoke temporary VID when Otp requested using UIN and invalid version is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "@@223333243333####3", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RevokeVID_Missing_version: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_15 + description: Revoke temporary VID when Otp requested using UIN and version is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "$REMOVE$", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_version: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_16 + description: Revoke temporary VID when Otp requested using UIN and empty version is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_transactionID: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_17 + description: Revoke temporary VID when Otp requested using UIN and empty transaction id is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Invalid_transactionID: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_18 + description: Revoke temporary VID when Otp requested using UIN and invalid transaction id is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "12$$@@34", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Missing_transactionID: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_19 + description: Revoke temporary VID when Otp requested using UIN and transaction id is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$REMOVE$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Missing_vid_status: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_20 + description: Revoke temporary VID when Otp requested using UIN and VidStatus is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "$REMOVE$", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + Resident_RevokeVID_Invalid_vidstatus: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_21 + description: Revoke temporary VID when Otp requested using UIN and invalid VidStatus is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "R@223344hKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_RevokeVID_Empty_vidstatus: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_22 + description: Revoke temporary VID when Otp requested using UIN and VidStatus is empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Temporary_VID_UsingPerpVID_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_23 + description: Revoke temporary VID when Otp requested using perpetual VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Temporary_VID_UsingTempVID_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_2_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_24 + description: Revoke temporary VID when Otp requested using temporary VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Temporary_3_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Temporary_3_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Temporary_VID_UsingOnetimeVID_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_3_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_25 + description: Revoke temporary VID when Otp requested using onetimeuse VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$", + "individualIdType": "VID", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Perpetual_VID_UsingUIN_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_26 + description: Revoke perpetual VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Onetimeuse_VID_UsingUIN_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_27 + description: Revoke onetimeuse VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Temporary_VID_UsingUIN_Valid_Smoke: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_4_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_28 + description: Revoke temporary VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/RevokeVID/createRevokeVIDResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Expired_Perpetual_VID_Neg: + endPoint: /resident/v1/vid/$ID:GenerateVID_Perpetual_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_29 + description: Revoke expired VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Expired_Temp_VID_Neg: + endPoint: /resident/v1/vid/$ID:GenerateVID_Temporary_1_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_30 + description: Revoke Expired temporary VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_Revoke_Expired_Onetimeuse_VID_Neg: + endPoint: /resident/v1/vid/$ID:GenerateVID_Onetimeuse_Using_RevokeUIN_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVid_31 + description: Revoke expired onetimeuse VID when Otp requested using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVID/createRevokeVID + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vidstatus", + "version": "v1", + "vidStatus": "REVOKED", + "otp": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ValidParams_For_Revoke_smoke_Pos_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-412", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVID/createRevokeVIDResult.hbs b/api-test/src/main/resources/resident/RevokeVID/createRevokeVIDResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVID/createRevokeVIDResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.hbs b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.hbs new file mode 100644 index 00000000000..25d958325bf --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.hbs @@ -0,0 +1,9 @@ +{ + "id": "{{id}}", + "version": "{{version}}", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "vidStatus": "{{vidStatus}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.yml b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.yml new file mode 100644 index 00000000000..b1b90208e00 --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNew.yml @@ -0,0 +1,214 @@ +RevokeVIDNew: + Resident_RevokeVIDNew_uin_Perp_Valid_Smoke: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Perpetual_VID_uin_Valid_Token_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_01 + description: Revoke perpetual VID when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNewResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ +}' + + Resident_RevokeVIDNew_uin_Temp_Valid_Smoke: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_uin_Temporary_VID_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_02 + description: Revoke temporary VID when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNewResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ +}' + + Resident_RevokeVIDNew_uin_OneTimeUse_Valid_Smoke: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_uin_Onetimeuse_VID_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_03 + description: Revoke onetimeuse VID when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNewResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ +}' + + Resident_RevokeVIDNew_StatusCode_Without_Token_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Temporary_1_Esignet_Integ_Valid_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_04 + description: Revoke VID without token + role: + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: "401" + + Resident_RevokeVIDNew_Diff_Token_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Temporary_1_Esignet_Integ_Valid_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_05 + description: Revoke VID when logged which does not belonged to logged in UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + Resident_RevokeVIDNew_Using_Vid_Valid_Smoke: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Onetimeuse_Using_VID_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_06 + description: Revoke Onetimeuse VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNewResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ +}' + + Resident_RevokeVIDNew_uin_Using_Vid_Invalid_User_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Perpetual_Inv_Scen_Valid_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_07 + description: Revoke perpetual VID when logged in using invalid VID + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-454" + } + ] +}' + + Resident_RevokeVIDNew_uin_Perp_Revoked_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_Perpetual_VID_uin_Valid_Token_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_08 + description: Revoke perpetual VID when logged in using already revoked VID + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-474" + } + ] +}' + + Resident_RevokeVIDNew_uin_Temp_Revoked_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_uin_Temporary_VID_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_09 + description: Revoke temporary VID when logged in using already revoked VID + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-474" + } + ] +}' + + Resident_RevokeVIDNew_uin_OneTimeUse_Revoked_Neg: + endPoint: /resident/v1/revoke-vid/$ID:GenerateVID_uin_Onetimeuse_VID_Valid_Smoke_sid_vid$ + uniqueIdentifier: TC_Resident_RevokeVidnew_10 + description: Revoke onetimeuse VID when logged in using already revoked VID + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: patch + inputTemplate: resident/RevokeVIDNew/CreateRevokeVIDNew + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.vid.revoke", + "version": "1.0", + "vidStatus": "Revoked" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-474" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNewResult.hbs b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNewResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/RevokeVIDNew/CreateRevokeVIDNewResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.hbs b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.hbs new file mode 100644 index 00000000000..36e5d026565 --- /dev/null +++ b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.hbs @@ -0,0 +1,9 @@ +{ + "id": "{{id}}", + "request": { + "individualId":"{{individualId}}", + "individualIdType":"{{individualIdType}}" + }, + "requesttime": "{{requesttime}}", + "version": "v1" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.yml b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.yml new file mode 100644 index 00000000000..a6f99bf0a36 --- /dev/null +++ b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatus.yml @@ -0,0 +1,181 @@ +RidCheckStatus: + Resident_RidCheckStatus_AllValid_Smoke: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_01 + description: Fetch RID status + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/RidCheckStatus/createRidCheckStatusResult + input: '{ + "individualId": "$ID:UpdateUIN_Valid_All_Smoke_Pos_sid_registrationId$", + "id": "mosip.resident.checkstatus", + "individualIdType": "RID", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "ridStatus": "PROCESSED" +}' + Resident_RidCheckStatus_Missing_InputParameter_individualId: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_02 + description: Fetch RID status when individual id is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$REMOVE$", + "id": "mosip.resident.checkstatus", + "individualIdType": "RID", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_RidCheckStatus_Invalid_InputParameter_individualId: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_03 + description: Fetch RID status when invalid value is given for individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "@345563333###", + "id": "mosip.resident.checkstatus", + "individualIdType": "RID", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-408", + "message": "$IGNORE$" + } + ] +}' + + Resident_RidCheckStatus_Missing_InputParameter_individualIdType: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_04 + description: Fetch RID status when individual id type is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_RID$", + "id": "mosip.resident.checkstatus", + "individualIdType": "$REMOVE$", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_RidCheckStatus_Invalid_InputParameter_individualIdType: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_05 + description: Fetch RID status when individual id type value is given invalid + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_RID$", + "id": "mosip.resident.checkstatus", + "individualIdType": "@2334#", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_RidCheckStatus_Missing_Id: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_06 + description: Fetch RID status when id is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_RID$", + "id": "$REMOVE$", + "individualIdType": "RID", + "requesttime": "$TIMESTAMP$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_RidCheckStatus_Missing_timestamp: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_07 + description: Fetch RID status when requesttime is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_RID$", + "id": "mosip.resident.checkstatus", + "individualIdType": "RID", + "requesttime": "$REMOVE$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + Resident_RidCheckStatus_Invalid_timestamp: + endPoint: /resident/v1/rid/check-status + uniqueIdentifier: TC_Resident_Ridstatus_08 + description: Fetch RID status when invalid request time is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/RidCheckStatus/createRidCheckStatus + outputTemplate: resident/error + input: '{ + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_RID$", + "id": "mosip.resident.checkstatus", + "individualIdType": "RID", + "requesttime": "#@234455" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatusResult.hbs b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatusResult.hbs new file mode 100644 index 00000000000..03dcf612b4c --- /dev/null +++ b/api-test/src/main/resources/resident/RidCheckStatus/createRidCheckStatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "ridStatus": "{{ridStatus}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/SendOTP.yml b/api-test/src/main/resources/resident/SendOTP/SendOTP.yml new file mode 100644 index 00000000000..960de51e51a --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/SendOTP.yml @@ -0,0 +1,395 @@ +SendOTP: + Resident_SendOTP_Valid_UIN_All_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_01 + description: Request otp using UIN as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_UIN_Transactions_All_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_02 + description: Request otp using UIN as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_To_Check_Ten_Transactions_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_VID_All_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_03 + description: Request otp using VID as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Onetime_Inv_Scen_Valid_Smoke_sid_vid$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + + Resident_SendOTP_Valid_VID_Use_Five_Pos: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_04 + description: Request otp using VID as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_VID_Use_Pos: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_05 + description: Request otp using VID as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:Generate_Perpetual_VID_SecondTime_sid_vid$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_UIN_Phone_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_06 + description: Request otp using UIN as individual id and otp channel as phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"PHONE\"]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + Resident_SendOTP_Valid_UIN_Email_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_07 + description: Request otp using UIN as individual id and otp channel as email + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"EMAIL\"]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + Resident_SendOTP_RevokedVID_Invalid: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_08 + description: Request otp using Revoked VID as individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-023", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_Valid_UIN_Invalid_empty_otpChannel: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_09 + description: Request otp using UIN as individual id and otp channel as empty array + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-OTA-008", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_individualId: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_10 + description: Request otp using invalid individual id + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "asfvgaf", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Missing_individualId: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_11 + description: Request otp without individual id attribute in request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$REMOVE$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Empty_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_12 + description: Request otp using UIN as individual id and transcationid value as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-006", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_13 + description: Request otp using UIN as individual id and invalid transaction id is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "asdveve", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Missing_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_14 + description: Request otp using UIN as individual id and transactionid value is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult2 + input: '{ + "transactionID": "$REMOVE$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "RES-SER-425", + "message": "$IGNORE$" + }' + Resident_SendOTP_InValid_Empty_requestTime: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_15 + description: Request otp using UIN as individual id and requesttime is given as empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-006", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_requestTime: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_16 + description: Request otp using UIN as individual id and invalid request time is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult2 + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "asvfv", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "RES-SER-425", + "message": "$IGNORE$" + }' + + Resident_SendOTP_Empty_individualId_Neg: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_17 + description: Request otp when individual id value is empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_Empty_individualIdType_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_18 + description: Request otp when individual id type value is empty + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_VID_Phone_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_19 + description: Request otp using VID as individual id and otp channel as only phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTPAsPhone + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"PHONE\"]", + "individualId": "$ID:Generate_Perpetual_VID_For_SendOtp_Valid_Smoke_sid_vid$", + "individualIdType": "VID" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + + Resident_SendOTP_Valid_Vid_Email_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_20 + description: Request otp using VID as individual id and otp channel as only email + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTPAsEmail + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"EMAIL\"]", + "individualId": "$ID:Generate_Perpetual_VID_For_SendOtp_Valid_Smoke_sid_vid$", + "individualIdType": "VID" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTP.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTP.hbs new file mode 100644 index 00000000000..34cba88fdfa --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTP.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": ["PHONE","EMAIL"], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTP2.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTP2.hbs new file mode 100644 index 00000000000..a0a1e4fc3f7 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTP2.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": {{otpChannel}}, + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmail.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmail.hbs new file mode 100644 index 00000000000..ed98a4562c9 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmail.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": ["EMAIL"], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmpty.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmpty.hbs new file mode 100644 index 00000000000..ed641006d87 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsEmpty.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": [], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPAsPhone.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsPhone.hbs new file mode 100644 index 00000000000..c0bfffa06c1 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPAsPhone.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": ["PHONE"], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult.hbs new file mode 100644 index 00000000000..8c134ae435d --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult.hbs @@ -0,0 +1,7 @@ +{ + "errors": [ + { + "errorCode": "{{errorCode}}" + } + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult2.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult2.hbs new file mode 100644 index 00000000000..8c134ae435d --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPErrorResult2.hbs @@ -0,0 +1,7 @@ +{ + "errors": [ + { + "errorCode": "{{errorCode}}" + } + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPResult.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPResult.hbs new file mode 100644 index 00000000000..763f9934fe8 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}", + "maskedEmail": "{{maskedEmail}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForEmail.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForEmail.hbs new file mode 100644 index 00000000000..760f777c2ba --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForEmail.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "maskedEmail": "{{maskedEmail}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForPhone.hbs b/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForPhone.hbs new file mode 100644 index 00000000000..345a4a7a017 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTP/createSendOTPResultForPhone.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.hbs b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.hbs new file mode 100644 index 00000000000..34cba88fdfa --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "metadata": {}, + "otpChannel": ["PHONE","EMAIL"], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.yml b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.yml new file mode 100644 index 00000000000..1523f5bb61b --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTP.yml @@ -0,0 +1,24 @@ +createSendOTP: + Resident_SendOTP_All_Valid_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_Sendotp_01 + description: Request otp using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "1234567190", + "individualId": "8172138568", + "requestTime": "$TIMESTAMP$", + "individualIdType": "UIN", + "otpChannel": [ + "EMAIL", + "PHONE" + ] + }' + output: '{ + "maskedMobile": "XXXXXX7143", + "maskedEmail": "XXkXXlXXhXXuXXr@technoforte.co.in" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOTPUIN/createSendOTPResult.hbs b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTPResult.hbs new file mode 100644 index 00000000000..763f9934fe8 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOTPUIN/createSendOTPResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}", + "maskedEmail": "{{maskedEmail}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.hbs b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.hbs new file mode 100644 index 00000000000..93dd5a49f68 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.hbs @@ -0,0 +1,9 @@ +{ + "id": "mosip.resident.contact.details.send.otp.id", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "userId": "{{userId}}", + "transactionId": "{{transactionId}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.yml b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.yml new file mode 100644 index 00000000000..7b70c8f7427 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDet.yml @@ -0,0 +1,409 @@ +SendOtpForContactDet: + Resident_SendOtpForContactDet_uin_All_Valid_Smoke: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_01 + description: Request otp to given userid when logged in using UIN + role: residentNew + restMethod: post + auditLogCheck: true + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/SendOtpForContactDet/SendOtpForContactDetResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "status": "Email Request submitted" +}' + + Resident_SendOtpForContactDet_vid_All_Valid_Smoke: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_02 + description: Request otp to given userid when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/SendOtpForContactDet/SendOtpForContactDetResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "status": "Email Request submitted" +}' + + Resident_SendOtpForContactDet_uin_Invalid_UserId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_03 + description: Request otp to given invalid userid when logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "ahgasj#5", + "transactionId": "$TRANSACTIONID$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" +} + ] +}' + + Resident_SendOtpForContactDet_uin_Empty_UserId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_04 + description: Request otp when userid value is empty + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_UserId_Not_Present_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_05 + description: Request otp when userid is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_Invalid_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_06 + description: Request otp to given userid when invalid transactionid is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionID": "adhs%^" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_Empty_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_07 + description: Request otp to given userid when transactionid value is empty + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_Transaction_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_08 + description: Request otp to given userid when transactionid is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_Invalid_Token_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_09 + description: Request otp to given userid when invalid token is used + role: resident + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_Invalid_Req_Time_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_10 + description: Request otp to given userid when invalid requesttime is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "12323dqq", + "userId": "residentautomation@mosip.net", + "transactionID": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_uin_Empty_Req_Time_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_11 + description: Request otp to given userid when requestime value is empty + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "", + "userId": "residentautomation@mosip.net", + "transactionID": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Invalid_UserId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_12 + description: Request otp when invalid userid is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "ahgasj#5", + "transactionID": "$TRANSACTIONID$" + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" +} + ] +}' + + Resident_SendOtpForContactDet_Vid_Empty_UserId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_13 + description: Request otp when userid values is empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_UserId_Not_Present_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_14 + description: Request otp when userid is removed from request and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Invalid_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_15 + description: Request otp when invalid transactionid is given and logged in uisng VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "adhs%^" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Empty_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_16 + description: Request otp to given userid when transcation id is given empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Transaction_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_17 + description: Request otp to given userid when transaction id is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Invalid_Req_Time_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_18 + description: Request otp to given userid when invalid requesttime is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "12323dqq", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpForContactDet_vid_Empty_Req_Time_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotpforContact_19 + description: Request otp to given userid when requesttime is given as empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpForContactDet/SendOtpForContactDet + outputTemplate: resident/error + input: '{ + "requesttime": "", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDetResult.hbs b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDetResult.hbs new file mode 100644 index 00000000000..e525d39ddda --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForContactDet/SendOtpForContactDetResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.hbs b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.hbs new file mode 100644 index 00000000000..e6612c90f23 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.hbs @@ -0,0 +1,9 @@ +{ + "id": "mosip.identity.otp.internal", + "individualId": "{{individualId}}", + "metadata": {}, + "otpChannel": ["PHONE","EMAIL"], + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "version": "1.0" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.yml b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.yml new file mode 100644 index 00000000000..0f41e7273a1 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpiration.yml @@ -0,0 +1,76 @@ +SendOtpForExpiration: + Resident_SendOtpForExpiration_Valid_UIN_All_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_SendotpforExpiration_01 + description: Request Otp using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOtpForExpiration/SendOtpForExpiration + outputTemplate: resident/SendOtpForExpiration/SendOtpForExpirationResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Scen_smoke_Pos_UIN$" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" +}' + + Resident_SendOtpForExpiration_using_PerpetualVid_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_SendotpforExpiration_02 + description: Request Otp using perpetual VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOtpForExpiration/SendOtpForExpiration + outputTemplate: resident/SendOtpForExpiration/SendOtpForExpirationResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_ForEotp_Scen_Valid_Smoke_sid_vid$" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" +}' + + Resident_SendOtpForExpiration_using_TempVid_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_SendotpforExpiration_03 + description: Request Otp using temporary VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOtpForExpiration/SendOtpForExpiration + outputTemplate: resident/SendOtpForExpiration/SendOtpForExpirationResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Temporary_1_ForEotp_Scen_Valid_Smoke_sid_vid$" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" +}' + + Resident_SendOtpForExpiration_using_OneTimeUseVid_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_SendotpforExpiration_04 + description: Request Otp using onetimeuse VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOtpForExpiration/SendOtpForExpiration + outputTemplate: resident/SendOtpForExpiration/SendOtpForExpirationResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Onetimeuse_ForEotp_Scen_Valid_Smoke_sid_vid$" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpirationResult.hbs b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpirationResult.hbs new file mode 100644 index 00000000000..345a4a7a017 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForExpiration/SendOtpForExpirationResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.hbs b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.hbs new file mode 100644 index 00000000000..c468ffce378 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.hbs @@ -0,0 +1,12 @@ +{ + "id": "mosip.identity.otp", + "version": "1.0", + "requestTime": "{{requestTime}}", + "transactionID": "{{transactionID}}", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "otpChannel": [ + "EMAIL", + "PHONE" + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.yml b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.yml new file mode 100644 index 00000000000..33db9b9fa0a --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTP.yml @@ -0,0 +1,23 @@ +createSendOTP: + Resident_SendOTP_All_Valid_Smoke: + endPoint: /idauthentication/v1/otp/v4jO2rTUkDglaG7rCkWDnqIT3WpZaGEW9j3FMXwTA5xXKVaDpx/6001/34536061 + uniqueIdentifier: TC_Resident_Sendotp_01 + description: Request OTP using VID + role: resident + restMethod: post + inputTemplate: resident/SendOtpForVid/createSendOTP + outputTemplate: resident/SendOtpForVid/createSendOTPResult + input: '{ + "transactionID": "1234567190", + "individualId": "5329487524103783", + "requestTime": "$TIMESTAMP$", + "individualIdType": "VID", + "otpChannel": [ + "EMAIL", + "PHONE" + ] + }' + output: '{ + "maskedMobile": "XXXXXX7143", + "maskedEmail": "XXkXXlXXhXXuXXr@technoforte.co.in" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpForVid/createSendOTPResult.hbs b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTPResult.hbs new file mode 100644 index 00000000000..763f9934fe8 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpForVid/createSendOTPResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "maskedMobile": "{{maskedMobile}}", + "maskedEmail": "{{maskedEmail}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.hbs b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.hbs new file mode 100644 index 00000000000..aeaf81251fb --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.hbs @@ -0,0 +1,14 @@ +{ + "encodedHash": "{{encodedHash}}", + "requestTime": "{{requestTime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "otpChannels": [ + {{#each otpChannels}} + "{{channel}}" + {{#unless @last}},{{/unless}} + {{/each}} + ] + } + } \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.yml b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.yml new file mode 100644 index 00000000000..8d46dd3d4f6 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdp.yml @@ -0,0 +1,18 @@ +SendOtpIdp: + Resident_ESignet_SendOtpIdp_all_Valid_Smoke: + endPoint: /v1/idp/authorization/send-otp + uniqueIdentifier: TC_Resident_SendotpIDP_01 + description: Request OTP using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOtpIdp/SendOtpIdp + outputTemplate: resident/SendOtpIdp/SendOtpIdpResult + input: '{ + "requestTime": "$TIMESTAMP$", + "transactionId": "$ID:ESignet_OAuthDetailsRequest_all_Valid_Smoke_sid_transactionId$", + "individualId": "8430935083", + "otpChannels": [{channel: "email"}] +}' + output: '{ +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpEmptyOtpChannel.hbs b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpEmptyOtpChannel.hbs new file mode 100644 index 00000000000..1d94e11cc40 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpEmptyOtpChannel.hbs @@ -0,0 +1,8 @@ +{ + "requestTime": "{{requestTime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "otpChannels": "{{otpChannels}}" + } + } \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpResult.hbs b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpResult.hbs new file mode 100644 index 00000000000..c823777f1e9 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpIdp/SendOtpIdpResult.hbs @@ -0,0 +1,6 @@ +{ + "response": { + "maskedEmail": "{{maskedEmail}}", + "maskedMobile": "{{maskedMobile}}" + } + } \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.hbs b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.hbs new file mode 100644 index 00000000000..93dd5a49f68 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.hbs @@ -0,0 +1,9 @@ +{ + "id": "mosip.resident.contact.details.send.otp.id", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "userId": "{{userId}}", + "transactionId": "{{transactionId}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.yml b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.yml new file mode 100644 index 00000000000..469af130721 --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserId.yml @@ -0,0 +1,589 @@ +SendOtpToUserId: + Resident_SendOtpToUserId_Invalid_User_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_01 + description: Request otp to given userid when invalid token is given + role: resident + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_SendOtpToUserId_uin_Invalid_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_02 + description: Request otp to given userid when invalid requesttime is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "2023-02-13T", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Invalid Input Parameter- requesttime" + } + ] +}' + + Resident_SendOtpToUserId_uin_Missing_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_03 + description: Request otp to given userid when requesttime is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- requesttime" + } + ] +}' + + Resident_SendOtpToUserId_uin_Null_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_04 + description: Request otp to given userid when requesttime value is given as null + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "null", + "userId": "residentautomation@mosip.net", + "transactionID": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Invalid Input Parameter- requesttime" + } + ], + "status": "Email Request submitted" +}' + + Resident_SendOtpToUserId_uin_Invalid_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_05 + description: Request otp when invalid userid is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "gy$45", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_uin_Empty_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_06 + description: Request otp when userid value is given empty + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_uin_SpaceVal_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_07 + description: Request otp when only spaces is given as userid value + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": " ", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_uin_Missing_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_08 + description: Request otp when userid is removed in request + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_uin_Null_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_09 + description: Request otp when null value is given for userid + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "null", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "status": "Email Request submitted" +}' + + Resident_SendOtpToUserId_uin_Invalid_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_10 + description: Request otp to given userid when invalid transactionid is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "23hfd$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_uin_Empty_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_11 + description: Request otp to given userid when empty transactionid is given + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionID": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_uin_SpaceVal_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_12 + description: Request otp to given userid when only spaces id given as transactionid + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": " " +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_uin_Missing_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_13 + description: Request otp to given userid when transactionid is removed in request + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_uin_all_Valid_Smoke: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_14 + description: Request otp to given userid when logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/SendOtpToUserId/SendOtpToUserIdResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "status": "Email Request submitted" +}' + + Resident_SendOtpToUserId_vid_Invalid_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_15 + description: Request otp to given userid when invalid requesttime is given + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "2023-02-13T", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Invalid Input Parameter- requesttime" + } + ] +}' + + Resident_SendOtpToUserId_vid_Missing_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_16 + description: Request otp to given userid when is requesttime is removed from request + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- requesttime" + } + ] +}' + + Resident_SendOtpToUserId_vid_Null_Requesttime_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_17 + description: Request otp to given userid when request time given as null and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "null", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "Invalid Input Parameter- requesttime" + } + ], + "status": "Email Request submitted" +}' + + Resident_SendOtpToUserId_vid_Invalid_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_18 + description: Request otp to invalid userid when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "gy$45", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_vid_Empty_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_19 + description: Request otp when userid value is given empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_vid_SpaceVal_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_20 + description: Request otp when userid value is given with only spaces and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": " ", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_vid_Missing_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_21 + description: Request otp when userid is removed from request and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionID": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ] +}' + + Resident_SendOtpToUserId_vid_Null_userId_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_22 + description: Request otp when userid value is given null and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "null", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "status": "Email Request submitted" +}' + + Resident_SendOtpToUserId_vid_Invalid_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_23 + description: Request otp to given userid when invalid transactionid is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "23hfd$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_vid_Empty_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_24 + description: Request otp to given userid when transactionid is given empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_vid_SpaceVal_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_25 + description: Request otp to given userid when only spaces given as transactionid and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": " " +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_vid_Missing_transactionID_Neg: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_26 + description: Request otp to given userid when transactionid is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ] +}' + + Resident_SendOtpToUserId_vid_all_Valid_Smoke: + endPoint: /resident/v1/contact-details/send-otp + uniqueIdentifier: TC_Resident_SendotptoUserID_27 + description: Request otp to given userid and logged in using VID + role: residentNewVid + restMethod: post + auditLogCheck: true + inputTemplate: resident/SendOtpToUserId/SendOtpToUserId + outputTemplate: resident/SendOtpToUserId/SendOtpToUserIdResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$" +}' + output: '{ + "status": "Email Request submitted" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserIdResult.hbs b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserIdResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/SendOtpToUserId/SendOtpToUserIdResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SignJWT/SignJWT.hbs b/api-test/src/main/resources/resident/SignJWT/SignJWT.hbs new file mode 100644 index 00000000000..9bb5bb37289 --- /dev/null +++ b/api-test/src/main/resources/resident/SignJWT/SignJWT.hbs @@ -0,0 +1,14 @@ +{ + "id": "string", + "version": "string", + "requesttime": "{{requesttime}}", + "metadata": {}, + "request": { + "dataToSign": "{{dataToSign}}", + "applicationId": "{{applicationId}}", + "referenceId": "{{referenceId}}", + "includePayload": {{includePayload}}, + "includeCertificate": {{includeCertificate}}, + "includeCertHash": {{includeCertHash}} + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/SignJWT/SignJWT.yml b/api-test/src/main/resources/resident/SignJWT/SignJWT.yml new file mode 100644 index 00000000000..2bb0fe92c7c --- /dev/null +++ b/api-test/src/main/resources/resident/SignJWT/SignJWT.yml @@ -0,0 +1,21 @@ +SignJWT: + Resident_SignJWT_all_Valid_Smoke_sid: + endPoint: /v1/keymanager/jwtSign + uniqueIdentifier: TC_Dependency_esignet + description: Get signJWT + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SignJWT/SignJWT + outputTemplate: resident/SignJWT/SignJWTResult + input: '{ + "requesttime": "$TIMESTAMP$", + "dataToSign": "$IDPCLIENTPAYLOAD$", + "applicationId": "RESIDENT", + "referenceId": "", + "includePayload": true, + "includeCertificate": true, + "includeCertHash": false +}' + output: '{ +}' diff --git a/api-test/src/main/resources/resident/SignJWT/SignJWTResult.hbs b/api-test/src/main/resources/resident/SignJWT/SignJWTResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/SignJWT/SignJWTResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.hbs b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.hbs new file mode 100644 index 00000000000..c25e510f62d --- /dev/null +++ b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.resident.transliteration.transliterate", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "from_field_value": "{{from_field_value}}", + "from_field_lang": "{{from_field_lang}}", + "to_field_lang": "{{to_field_lang}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.yml b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.yml new file mode 100644 index 00000000000..aa727530a32 --- /dev/null +++ b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateData.yml @@ -0,0 +1,439 @@ +TranslitrateData: + Resident_TranslitrateData_uin_all_Valid_Smoke: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_01 + description: Transliterate data for the language given when logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/TranslitrateData/TranslitrateDataResult + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + +}' + + Resident_TranslitrateData_vid_all_Valid_Smoke: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_02 + description: Transliterate data for the language given when logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/TranslitrateData/TranslitrateDataResult + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + +}' + + Resident_TranslitrateData_uin_Same_Lang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_03 + description: Transliterate data, where from and to language is given same and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Invalid_UserToken_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_04 + description: Transliterate data when user token is invalid + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Invalid_Token_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_05 + description: Transliterate data when token is invalid + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_StatusCode_Empty_Token_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_06 + description: Transliterate data when token is empty + role: + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$2NDLANG$" +}' + output: "401" + + Resident_TranslitrateData_uin_Invalid_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_07 + description: Transliterate data when from language is given invalid and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "hinnn", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Missing_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_08 + description: Transliterate data when from language is removed from request and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$REMOVE$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Empty_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_09 + description: Transliterate data when from language is given empty and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Invalid_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_10 + description: Transliterate data when to language is given invalid and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "Hinnn" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Missing_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_11 + description: Transliterate data when to language is removed from request and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_uin_Empty_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_12 + description: Transliterate data when from language is given empty and logged in using UIN + role: residentNew + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Same_Lang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_13 + description: Transliterate data when from and to language is given same and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$1STLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Invalid_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_14 + description: Transliterate data when from language is given invalid and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "hinnn", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Missing_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_15 + description: Transliterate data when from language is missing and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$REMOVE$", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Empty_FromLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_16 + description: Transliterate data when from language is given empty and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "", + "to_field_lang": "$2NDLANG$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Invalid_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_17 + description: Transliterate data when to language is given invalid and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "Hinnn" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Missing_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_18 + description: Transliterate data when to language is removed from request and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' + + Resident_TranslitrateData_vid_Empty_ToLang_Neg: + endPoint: /resident/v1/transliteration/transliterate + uniqueIdentifier: TC_Resident_Translitrate_19 + description: Transliterate data when to language is given empty and logged in using VID + role: residentNewVid + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/TranslitrateData/TranslitrateData + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "from_field_value": "j", + "from_field_lang": "$1STLANG$", + "to_field_lang": "" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/TranslitrateData/TranslitrateDataResult.hbs b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateDataResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/TranslitrateData/TranslitrateDataResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.hbs b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.hbs new file mode 100644 index 00000000000..b879b13dfab --- /dev/null +++ b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.hbs @@ -0,0 +1,3 @@ +{ + "eventId": "{{eventId}}" +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.yml b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.yml new file mode 100644 index 00000000000..b0854387b93 --- /dev/null +++ b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatus.yml @@ -0,0 +1,84 @@ +UnPinStatus: + Resident_UnPinStatus_uin_all_Valid_Smoke: + endPoint: /resident/v1/unpinned/{eventId} + uniqueIdentifier: TC_Resident_UnpinStatus_01 + description: Unpin status for given eventid when logged using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UnPinStatus/UnPinStatus + outputTemplate: resident/UnPinStatus/UnPinStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + "status": "200" +}' + + Resident_UnPinStatus_vid_all_Valid_Smoke: + endPoint: /resident/v1/unpinned/{eventId} + uniqueIdentifier: TC_Resident_UnpinStatus_02 + description: Unpin status for given eventid when logged using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UnPinStatus/UnPinStatus + outputTemplate: resident/UnPinStatus/UnPinStatusResult + input: '{ + "eventId": "$ID:GetServiceHistory_vid_all_Valid_Smoke_sid_eventId$" +}' + output: '{ + "status": "200" +}' + + Resident_UnPinStatus_uin_Invalid_Input_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_UnpinStatus_03 + description: Unpin status for invalid eventid when logged using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UnPinStatus/UnPinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$@kk$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_UnPinStatus_vid_Invalid_Input_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_UnpinStatus_04 + description: Unpin status for invalid eventid when logged using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UnPinStatus/UnPinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$@kk$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ] +}' + + Resident_UnPinStatus_uin_StatusCode_Invalid_Token_Neg: + endPoint: /resident/v1/pinned/{eventId} + uniqueIdentifier: TC_Resident_UnpinStatus_05 + description: Unpin status for eventid when logged using UIN with invalid token + role: invalid + validityCheckRequired: true + restMethod: post + inputTemplate: resident/UnPinStatus/UnPinStatus + outputTemplate: resident/error + input: '{ + "eventId": "$ID:GetServiceHistory_uin_all_Valid_Smoke_sid_eventId$" +}' + output: "401" \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UnPinStatus/UnPinStatusResult.hbs b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatusResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/UnPinStatus/UnPinStatusResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.hbs b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.hbs new file mode 100644 index 00000000000..dc5345765d2 --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.resident.contact.details.update.id", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "userId": "{{userId}}", + "transactionId": "{{transactionId}}", + "otp": "{{otp}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.yml b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.yml new file mode 100644 index 00000000000..2a88a3cc67b --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetails.yml @@ -0,0 +1,710 @@ +UpdateContactDetails: + Resident_UpdateContactDetails_uin_Invalid_User_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_01 + description: Update contact details by giving invalid userid and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "sdjgu34", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate": "resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Empty_User_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_02 + description: Update contact details by giving userid value empty and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_User_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_03 + description: Update contact details when userid is removed from request and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Invalid_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_04 + description: Update contact details when invalid transactionid is given and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "ass#2@h", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Empty_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_05 + description: Update contact details when transactionid is given empty and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Transaction_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_06 + description: Update contact details when transactionid is removed from request and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Invalid_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_07 + description: Update contact details when invalid otp is used and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "123456", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Empty_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_08 + description: Update contact details when otp value is empty and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Otp_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_09 + description: Update contact details when otp is removed from request and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "$REMOVE$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_Invalid_Token_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_10 + description: Update contact details when invalid token is used + role: resident + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "Authentication Failed" + } + ], + "sendOtpResTemplate":"resident/error" + } +}' + + Resident_UpdateContactDetails_vid_Invalid_User_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_11 + description: Update contact details when invalid userid is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "sdjgu34", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate": "resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Empty_User_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_12 + description: Update contact details when userid is given as empty value and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_User_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_13 + description: Update contact details when userid is removed from request and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Invalid_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_14 + description: Update contact details when invalid transaction id is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "ass#2@h", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Empty_Transaction_Id_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_15 + description: Update contact details when transaction id is given as empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Transaction_Id_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_16 + description: Update contact details when transaction id is removed from request and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$REMOVE$", + "otp": "residentautomation@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Invalid_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_17 + description: Update contact details when invalid otp is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "123456", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Empty_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_18 + description: Update contact details when otp is given empty value and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Otp_Not_Present_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_19 + description: Update contact details when otp is removed from request and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "$REMOVE$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "sendOtpResTemplate":"resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_uin_Valid_All_Smoke_Pos: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_20 + description: Update contact details when logged in using UIN + role: residentNew + restMethod: post + auditLogCheck: true + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/UpdateContactDetails/UpdateContactDetailsResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp": { + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "status": "success", + "sendOtpResp": { + "status": "Email Request submitted", + "sendOtpResTemplate": "resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' + + Resident_UpdateContactDetails_vid_Valid_All_Smoke_Pos: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_UpdateContact_21 + description: Update contact details when logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/UpdateContactDetails/UpdateContactDetails + outputTemplate: resident/UpdateContactDetails/UpdateContactDetailsResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "otp": "residentautomation@mosip.net", + "sendOtp": { + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpForContactDet/SendOtpForContactDet", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "status": "success", + "sendOtpResp": { + "status": "Email Request submitted", + "sendOtpResTemplate": "resident/SendOtpForContactDet/SendOtpForContactDetResult" + } +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetailsResult.hbs b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetailsResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateContactDetails/UpdateContactDetailsResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUIN/UpdateUIN.yml b/api-test/src/main/resources/resident/UpdateUIN/UpdateUIN.yml new file mode 100644 index 00000000000..fe8c3876640 --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUIN/UpdateUIN.yml @@ -0,0 +1,568 @@ +UpdateUIN: + Resident_UpdateUIN_Valid_All_Smoke_Pos_sid: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_01 + description: Update UIN with all valid details + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/UpdateUIN/UpdateUinResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_Otp_Empty_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_02 + description: Update UIN when otp is not given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_Otp_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_03 + description: Update UIN when invalid otp is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "@345esddd", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Missing_Otp_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_04 + description: Update UIN when otp is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$REMOVE$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_TrnxID_Empty_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_05 + description: Update UIN when invalid transactionid is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_TrnxID_Mismatch_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_06 + description: Update UIN when transactionid is mismatched from Request otp API + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "1234560", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_IndividualId_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_07 + description: Update UIN when invalid individualid is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "@345esddd", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Missing_IndividualId_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_08 + description: Update UIN when individualid is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$REMOVE$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_Id_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_09 + description: Update UIN when invalid id is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "@3453#", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Missing_Id_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_10 + description: Update UIN when id is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "$REMOVE$", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Missing_Timestamp_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_11 + description: Update UIN when timestamp is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$REMOVE$", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_Timestamp_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_12 + description: Update UIN when invalid timestamp is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "ESTA", + "id": "mosip.resident.updateuin", + "version": "v1", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Invalid_Version_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_13 + description: Update UIN when invalid version is given + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "@er45", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' + + Resident_UpdateUIN_Missing_Version_Neg: + endPoint: /resident/v1/req/update-uin + uniqueIdentifier: TC_Resident_UpdateUIN_14 + description: Update UIN when version is removed from request + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/UpdateUIN/updateUIN + outputTemplate: resident/error + input: '{ + "transactionID": "$TRANSACTIONID$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "requesttime": "$TIMESTAMP$", + "id": "mosip.resident.updateuin", + "version": "$REMOVE$", + "identityJson": "$IDENTITYJSON$", + "otp": "$ID:AddIdentity_Positive_PRE_smoke_EMAIL$", + "sendOtp":{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_Positive_PRE_smoke_UIN$", + "individualIdType": "UIN", + "sendOtpReqTemplate": "resident/SendOTP/createSendOTP", + "sendOtpEndPoint": "/resident/v1/req/otp" + } + }' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "maskedMobile": "$IGNORE$", + "sendOtpResTemplate":"resident/SendOTP/createSendOTPResult", + "maskedEmail": "$IGNORE$" + } +}' diff --git a/api-test/src/main/resources/resident/UpdateUIN/UpdateUinResult.hbs b/api-test/src/main/resources/resident/UpdateUIN/UpdateUinResult.hbs new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUIN/UpdateUinResult.hbs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUIN/updateUIN.hbs b/api-test/src/main/resources/resident/UpdateUIN/updateUIN.hbs new file mode 100644 index 00000000000..3b821c6c8ab --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUIN/updateUIN.hbs @@ -0,0 +1,13 @@ +{ + "id": "{{id}}", + "version": "{{version}}", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "individualId": "{{individualId}}", + "individualIdType": "{{individualIdType}}", + "otp": "{{otp}}", + "identityJson": "{{identityJson}}" + + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.hbs b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.hbs new file mode 100644 index 00000000000..21dcb7ab196 --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.hbs @@ -0,0 +1,16 @@ +{ + "id": "mosip.resident.updateuin", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "consent" : "{{consent}}", + "identity": { + "$NAMEFORUPDATEUIN$": [{ + "language": "{{language}}", + "value": "{{value}}" + }], + "$UPDATEDEMAILATTR$": "{{email}}" + } + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.yml b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.yml new file mode 100644 index 00000000000..037cd0bcffd --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNew.yml @@ -0,0 +1,662 @@ +UpdateUINNew: + Resident_UpdateUINNew_all_Valid_Smoke: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_01 + description: Update demographic details with all valid details and logged in using UIN + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/UpdateUINNew/UpdateUINNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$REMOVE$" +}' + output: '{ + "status": "Success" +}' + + Resident_UpdateUINNew_vid_all_Valid_Smoke: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_02 + description: Update demographic details with all valid details and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/UpdateUINNew/UpdateUINNewResult + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567789", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$REMOVE$" +}' + output: '{ + "status": "Success" +}' + + Resident_UpdateUINNew_Invalid_Language_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_03 + description: Update email with invalid language is given and logged in using UIN + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "duh", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ] +}' + + Resident_UpdateUINNew_vid_Invalid_Language_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_04 + description: Update email with invalid language is given and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567789", + "consent" : "Accepted", + "language": "cdf2", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ] + +}' + + Resident_UpdateUINNew_Invalid_User_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_05 + description: Update email with invalid token + role: resident + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "KER-ATH-401", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Invalid_TransactionID_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_06 + description: Update email with invalid transactionid is given + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "15sdsf#$%", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Missing_TransactionID_Pos: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_07 + description: Update email when transactionid is removed from request + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "$REMOVE$", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ] +}' + + Resident_UpdateUINNew_Empty_TransactionID_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_08 + description: Update email when transactionid is given empty + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Invalid_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_09 + description: Update email with invalid consent is given + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "shbj$%^u", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Missing_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_10 + description: Update email when consent is removed from request + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "$REMOVE$", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Empty_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_11 + description: Update email when consent is given empty + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Invalid_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_12 + description: Update email when invalid requesttime is given + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "dsg#$$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Missing_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_13 + description: Update email when requesttime is removed from request + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Empty_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_14 + description: Update email when requesttime is given empty + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Invalid_TransactionID_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_15 + description: Update email when invalid transactionid is given and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "15sdsf#$%", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Missing_TransactionID_Pos: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_16 + description: Update email when transactionid is removed and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "$REMOVE$", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410" + } + ] +}' + + Resident_UpdateUINNew_vid_Empty_TransactionID_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_17 + description: Update email when transactionid is given empty and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Invalid_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_18 + description: Update email when invalid consent is given and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567789", + "consent" : "shbj$%^u", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Missing_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_19 + description: Update email when consent is removed and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567789", + "consent" : "$REMOVE$", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Empty_Consent_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_20 + description: Update email when consent is given empty and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567789", + "consent" : "", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-461", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Invalid_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_21 + description: Update email when invalid requestime is given and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "dsg#$$", + "transactionID": "1234567789", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Missing_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_22 + description: Update email when requestime is removed and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "$REMOVE$", + "transactionID": "1234567789", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_vid_Empty_Requesttime_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_23 + description: Update email when requestime is given empty and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNew + outputTemplate: resident/error + input: '{ + "requesttime": "", + "transactionID": "1234567789", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "email": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Invalid_Identity_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_24 + description: Update email when invalid identity is given and logged in using UIN + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNewInvalid + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "jndffk": "$ID:AddIdentity_Esignet_Integ_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Vid_Invalid_Identity_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_25 + description: Update email when invalid identity is given and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNewInvalid + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "jndffk": "$ID:AddIdentity_Esignet_Integ_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Missing_Identity_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_26 + description: Update when identity is removed and logged in using UIN + role: residentNew + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNewInvalid + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "jndffk": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' + + Resident_UpdateUINNew_Vid_Missing_Identity_Neg: + endPoint: /resident/v1/update-uin + uniqueIdentifier: TC_Resident_UpdateUINNew_27 + description: Update when identity is removed and logged in using VID + role: residentNewVid + restMethod: patch + inputTemplate: resident/UpdateUINNew/UpdateUINNewInvalid + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "transactionID": "1234567889", + "consent" : "Accepted", + "language": "eng", + "value": "Sohan", + "jndffk": "$REMOVE$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$REMOVE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewInvalid.hbs b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewInvalid.hbs new file mode 100644 index 00000000000..ca948945519 --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewInvalid.hbs @@ -0,0 +1,12 @@ +{ + "id": "mosip.resident.updateuin", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "transactionID": "{{transactionID}}", + "consent" : "{{consent}}", + "identity": { + "jndffk": "{{jndffk}}" + } + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewResult.hbs b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewResult.hbs new file mode 100644 index 00000000000..3d65817bc68 --- /dev/null +++ b/api-test/src/main/resources/resident/UpdateUINNew/UpdateUINNewResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.hbs b/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.hbs new file mode 100644 index 00000000000..05f5d58a041 --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.auth.internal", + "version": "v1", + "requesttime": "{{requesttime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "otp": "{{otp}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.yml b/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.yml new file mode 100644 index 00000000000..904b6debb99 --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateExpiredOTP/ValidateExpiredOTP.yml @@ -0,0 +1,92 @@ +ValidateExpiredOTP: + Resident_ValidateExpiredOTP_UIN_ExpOtp_Neg: + endPoint: /resident/v1/validate-otp + uniqueIdentifier: TC_Resident_ValidateExpiredOtp_01 + description: Validate expired otp, otp requested using UIN + role: resident + restMethod: post + inputTemplate: resident/ValidateExpiredOTP/ValidateExpiredOTP + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_ForEotp_Scen_smoke_Pos_UIN$", + "otp": "$ID:AddIdentity_ForEotp_Scen_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "OTP has expired" + } + ] +}' + + Resident_ValidateExpiredOTP_PerpVid_ExpOtp_Neg: + endPoint: /resident/v1/validate-otp + uniqueIdentifier: TC_Resident_ValidateExpiredOtp_02 + description: Validate expired otp, otp requested using perpetual VID + role: resident + restMethod: post + inputTemplate: resident/ValidateExpiredOTP/ValidateExpiredOTP + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Perpetual_ForEotp_Scen_Valid_Smoke_sid_vid$", + "otp": "$ID:AddIdentity_ForEotp_Scen_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "OTP has expired" + } + ] +}' + + Resident_ValidateExpiredOTP_TempVid_ExpOtp_Neg: + endPoint: /resident/v1/validate-otp + uniqueIdentifier: TC_Resident_ValidateExpiredOtp_03 + description: Validate expired otp, otp requested using temporary VID + role: resident + restMethod: post + inputTemplate: resident/ValidateExpiredOTP/ValidateExpiredOTP + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Temporary_1_ForEotp_Scen_Valid_Smoke_sid_vid$", + "otp": "$ID:AddIdentity_ForEotp_Temp_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ] +}' + + Resident_ValidateExpiredOTP_OnetimeVid_ExpOtp_Neg: + endPoint: /resident/v1/validate-otp + uniqueIdentifier: TC_Resident_ValidateExpiredOtp_04 + description: Validate expired otp, otp requested using onetimeuse VID + role: resident + restMethod: post + inputTemplate: resident/ValidateExpiredOTP/ValidateExpiredOTP + outputTemplate: resident/error + input: '{ + "transactionId": "$TRANSACTIONID$", + "requesttime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_Onetimeuse_ForEotp_Scen_Valid_Smoke_sid_vid$", + "otp": "$ID:AddIdentity_ForEotp_Onetime_Vid_smoke_Pos_EMAIL$" +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-422", + "message": "$IGNORE$" + } + ] +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.hbs b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.hbs new file mode 100644 index 00000000000..05f5d58a041 --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.identity.auth.internal", + "version": "v1", + "requesttime": "{{requesttime}}", + "request": { + "transactionId": "{{transactionId}}", + "individualId": "{{individualId}}", + "otp": "{{otp}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.yml b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.yml new file mode 100644 index 00000000000..e05dd85672b --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTP.yml @@ -0,0 +1,224 @@ +SendOTP: + Resident_SendOTP_Valid_UIN_All_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_01 + description: Request OTP using UIN + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "XXsXXeXXaXXoXXtXXn@gmail.com" + }' + Resident_SendOTP_Valid_UIN_Phone_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_02 + description: Request OTP using UIN when otp channel is given as only phone + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"PHONE\"]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "$IGNORE$" + }' + Resident_SendOTP_Valid_UIN_Email_Smoke: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_03 + description: Request OTP using UIN when otp channel is given as only Email + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[\"EMAIL\"]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "maskedMobile": "$IGNORE$", + "maskedEmail": "XXsXXeXXaXXoXXtXXn@gmail.com" + }' + Resident_SendOTP_RevokedVID_Invalid: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_04 + description: Request OTP using Revoked VID + role: resident + checkErrorsOnlyInResponse: true + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:GenerateVID_All_Valid_Smoke_Perpetual_sid_vid$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-018", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_Valid_UIN_Invalid_empty_otpChannel: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_05 + description: Request OTP using UIN when otp channel is empty array + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP2 + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "otpChannel": "[]", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-OTA-008", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_individualId: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_06 + description: Request OTP using invalid individualId + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "asfvgaf", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Missing_individualId: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_07 + description: Request OTP when individualId is removed from request + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "$TIMESTAMP$", + "individualId": "$REMOVE$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Empty_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_07 + description: Request OTP when transcationId is given empty + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-006", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_09 + description: Request OTP when invalid transcationId is given + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "asdveve", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-009", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_Missing_transactionID: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_10 + description: Request OTP when transcationId is removed from request + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult2 + input: '{ + "transactionID": "$REMOVE$", + "requestTime": "$TIMESTAMP$", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "RES-SER-425", + "message": "$IGNORE$" + }' + Resident_SendOTP_InValid_Empty_requestTime: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_11 + description: Request OTP when requesttime is given empty + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "IDA-MLC-006", + "errorMessage": "$IGNORE$" + }' + Resident_SendOTP_InValid_requestTime: + endPoint: /resident/v1/req/otp + uniqueIdentifier: TC_Resident_RequestOtp_12 + description: Request OTP when invalid requesttime is given + role: resident + restMethod: post + inputTemplate: resident/SendOTP/createSendOTP + outputTemplate: resident/SendOTP/createSendOTPErrorResult2 + input: '{ + "transactionID": "$TRANSACTIONID$", + "requestTime": "asvfv", + "individualId": "$ID:AddIdentity_withValidParameters_smoke_Pos_UIN$", + "individualIdType": "UIN" +}' + output: '{ + "errorCode": "RES-SER-425", + "message": "$IGNORE$" + }' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateOTP/ValidateOTPResult.hbs b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTPResult.hbs new file mode 100644 index 00000000000..0fb038bb611 --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateOTP/ValidateOTPResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "authStatus": {{authStatus}} + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.hbs b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.hbs new file mode 100644 index 00000000000..bc5f303727e --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.hbs @@ -0,0 +1,10 @@ +{ + "id": "mosip.resident.contact.details.update.id", + "version": "1.0", + "requesttime": "{{requesttime}}", + "request": { + "userId": "{{userId}}", + "transactionId": "{{transactionID}}", + "otp":"{{otp}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.yml b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.yml new file mode 100644 index 00000000000..1233fb5376f --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp.yml @@ -0,0 +1,1327 @@ +ValidateWithUserIdOtp: + Resident_ValidateWithUserIdOtp_uin_Invalid_RequestTime_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_01 + description: Validate OTP requested using userId when invalid request time is given in request + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "576", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "errorMessage": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Past_RequestTime_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_02 + description: Validate OTP requested using userId when request time is given as past time + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "2022-02-13T04:50:44.641Z", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Future_RequestTime_Neg: + description: Validate OTP requested using userId when request time is given as future value + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_03 + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "2033-02-13T04:50:44.641Z", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Invalid_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_04 + description: Validate OTP requested using userId and userId value is given invalid in request + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "6y6$", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_uin_Empty_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_05 + description: Validate OTP requested using userId when userId value is given as empty + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_uin_SpaceVal_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_06 + description: Validate OTP requested using userId when only spaces is given as user id value + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": " ", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_uin_Missing_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_07 + description: Validate OTP requested using userId when userid attribute is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{"errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_uin_Null_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_08 + description: Validate OTP requested using userId when userid value given as null + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "null", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Invalid_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_09 + description: Validate OTP requested using userId when invalid transactionid is given + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "Tg$4", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Empty_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_10 + description: Validate OTP requested using userId when transactionid value is empty + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Missing_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_11 + description: Validate OTP requested using userId when transactionid is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$REMOVE$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Space_val_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_12 + description: Validate OTP requested using userId when only spaces given for transactionid value + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": " ", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Null_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_13 + description: Validate OTP requested using userId when transactionid value is given as null + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "null", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Invalid_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_14 + description: Validate OTP requested using userId when invalid otp is passed + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"cdw3$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Missing_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_15 + description: Validate OTP requested using userId when otp attribute is removed from request + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"$REMOVE$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Null_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_16 + description: Validate OTP requested using userId when otp value is given as null + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"null", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_SpaceVal_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_17 + description: Validate OTP requested using userId when only spaces given as otp value + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":" ", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_Empty_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_18 + description: Validate OTP requested using userId when otp value is empty + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Invalid_RequestTime_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_19 + description: Validate OTP requested using userId + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "576", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-418", + "errorMessage": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Past_RequestTime_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_20 + description: Validate OTP requested using userId when past requestime is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "2022-02-13T04:50:44.641Z", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Future_RequestTime_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_21 + description: Validate OTP requested using userId when future requestime is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "2033-02-13T04:50:44.641Z", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Invalid_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_22 + description: Validate OTP requested when invalid userid is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "6y6$", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_vid_Empty_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_23 + description: Validate OTP requested when userid is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_vid_SpaceVal_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_24 + description: Validate OTP requested when userid is given only spaces and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": " ", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_vid_Missing_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_25 + description: Validate OTP requested when userid is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "$REMOVE$", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{"errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } + +}' + + Resident_ValidateWithUserIdOtp_vid_Null_userId_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_26 + description: Validate OTP requested when userid is given with null values and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "null", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- userId" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Invalid_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_27 + description: Validate OTP requested using userid when invalid transactionid is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "Tg$4", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "Invalid Input Parameter- transactionID" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Empty_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_28 + description: Validate OTP requested using userid when transactionid is empty and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Missing_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_29 + description: Validate OTP requested using userid when transactionid is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$REMOVE$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Space_val_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_30 + description: Validate OTP requested using userid when transactionid is given with only spaces and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": " ", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Null_transactionID_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_31 + description: Validate OTP requested using userid when transactionid is given null and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "null", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Invalid_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_32 + description: Validate OTP requested using userid when invalid otp is given and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"cdw3$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Missing_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_33 + description: Validate OTP requested using userid when otp is removed and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"$REMOVE$", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Null_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_34 + description: Validate OTP requested using userid when otp is null and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"null", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_SpaceVal_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_35 + description: Validate OTP requested using userid when otp is given as null values and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":" ", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_vid_Empty_Otp_Neg: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_36 + description: Validate OTP requested using userid when otp is given empty value and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/error + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp":"", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "errors": [ + { + "errorCode": "RES-SER-410", + "message": "$IGNORE$" + } + ], + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + } +}' + + Resident_ValidateWithUserIdOtp_uin_all_Valid_Smoke: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_37 + description: Validate OTP requested using userid with all valid details and logged in using UIN + role: residentNew + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtpResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + }, + "status": "success" +}' + + Resident_ValidateWithUserIdOtp_vid_all_Valid_Smoke: + endPoint: /resident/v1/contact-details/update-data + uniqueIdentifier: TC_Resident_ValidateUserIdOtp_38 + description: Validate OTP requested using userid with all valid details and logged in using VID + role: residentNewVid + restMethod: post + inputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtp + outputTemplate: resident/ValidateWithUserIdOtp/ValidateWithUserIdOtpResult + input: '{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionID": "$TRANSACTIONID$", + "otp": "residentautomation2@mosip.net", + "sendOtp":{ + "requesttime": "$TIMESTAMP$", + "userId": "residentautomation2@mosip.net", + "transactionId": "$TRANSACTIONID$", + "sendOtpReqTemplate": "resident/SendOtpToUserId/SendOtpToUserId", + "sendOtpEndPoint": "/resident/v1/contact-details/send-otp" + } +}' + output: '{ + "sendOtpResp":{ + "status": "Email Request submitted", + "message": "success", + "sendOtpResTemplate":"resident/SendOtpToUserId/SendOtpToUserIdResult" + }, + "status": "success" +}' \ No newline at end of file diff --git a/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtpResult.hbs b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtpResult.hbs new file mode 100644 index 00000000000..ca45b742b9e --- /dev/null +++ b/api-test/src/main/resources/resident/ValidateWithUserIdOtp/ValidateWithUserIdOtpResult.hbs @@ -0,0 +1,5 @@ +{ + "response": { + "status": "{{status}}" + } +} \ No newline at end of file diff --git a/api-test/src/main/resources/resident/error.hbs b/api-test/src/main/resources/resident/error.hbs new file mode 100644 index 00000000000..f4bcb6bee67 --- /dev/null +++ b/api-test/src/main/resources/resident/error.hbs @@ -0,0 +1,10 @@ +{ + "errors": [ + {{#each errors}} + { + "errorCode": "{{errorCode}}" + } + {{#unless @last}},{{/unless}} + {{/each}} + ] +} \ No newline at end of file diff --git a/api-test/src/main/resources/spring.properties b/api-test/src/main/resources/spring.properties new file mode 100644 index 00000000000..21fdcd3ec79 --- /dev/null +++ b/api-test/src/main/resources/spring.properties @@ -0,0 +1,329 @@ +#Please change only required values +logging.level.io.mosip.registrtaion=DEBUG + +hibernate.hbm2ddl.auto=none +hibernate.dialect=org.hibernate.dialect.DerbyTenSevenDialect +hibernate.show_sql=false +hibernate.format_sql=false +hibernate.connection.charSet=utf8 +hibernate.cache.use_second_level_cache=false +hibernate.cache.use_query_cache=false +hibernate.cache.use_structured_entries=false +hibernate.generate_statistics=false + +#otp validation time details +otp_validity_in_mins=2 + + +#Timeout Configuration +HTTP_API_READ_TIMEOUT = 60000 +HTTP_API_WRITE_TIMEOUT = 60000 + +#Biometric Device +PROVIDER_NAME = Mantra +WEBCAM_LIBRARY_NAME = sarxos + +#document scanner properties +DOCUMENT_SCANNER_DEPTH=10 +DOCUMENT_SCANNER_HOST=192.168.43.253 +DOCUMENT_SCANNER_PORT=6566 +DOCUMENT_SCANNER_TIMEOUT=5000 + +#Client ID and Secret Key +AUTH_CLIENT_ID=registration-client +AUTH_SECRET_KEY=c6f69439-f811-4415-8ebc-4c9e447c901e + +spring.cloud.config.uri=LOCAL +spring.application.name= +spring.profiles.active= +spring.cloud.config.label= + +#AUTH_SDK +mosip.registration.face.provider=com.identy.IdentyBioSDK +mosip.registration.iris.provider=com.identy.IdentyBioSDK +mosip.registration.finger.provider=com.identy.IdentyBioSDK + + +#MDM +#host has to be clarified whether nedd to be in config or hardcoded +mdm.host=127.0.0.1 +#portRangeFrom and portRangeTo are mandate,portRangeTo can be same are greater than then portRangeFrom +mdm.portRangeFrom=4500 +mdm.portRangeTo=4510 +mdm.contextPath= +mdm.hostProtocol=http + +mdm.deviceInfo.service.path=deviceInfo +mdm.deviceInfo.service.headers=Content-Type:APPLICATION/JSON +mdm.deviceInfo.service.httpmethod=GET +mdm.deviceInfo.service.responseType=java.lang.Object + +mdm.capture.service.path=capture +mdm.capture.service.headers=Content-Type:APPLICATION/JSON +mdm.capture.service.httpmethod=POST +mdm.deviceInfo.service.responseType=java.lang.Object + +mdm.deviceDiscovery.service.path=deviceDiscovery +mdm.deviceDiscovery.service.headers=Content-Type:APPLICATION/JSON +mdm.deviceDiscovery.service.httpmethod=POST +mdm.deviceDiscovery.service.responseType=java.lang.Object + +mosip.kernel.idobjectvalidator.file-storage-uri=LOCAL +mosip.kernel.idobjectvalidator.schema-name=mosip-identity-json-schema.json +mosip.kernel.idobjectvalidator.property-source=LOCAL +mosip.kernel.keymanager-service-sign-url= + +mosip.country.code=MOR + +#onboarded_user details +user_machine_mapping.service.url=https://qa.mosip.io/v1/masterdata/registrationmachineusermappings +user_machine_mapping.service.httpmethod=PUT +user_machine_mapping.service.requestType=java.lang.Object +user_machine_mapping.service.headers=Content-Type:APPLICATION/JSON +user_machine_mapping.service.authrequired=true +user_machine_mapping.service.signrequired=false +user_machine_mapping.service.authheader=Authorization:OAUTH +user_machine_mapping.service.requestsignrequired=true + +#packet_status details +packet_status.service.url=https://qa.mosip.io/registrationprocessor/v1/registrationstatus/search +packet_status.service.httpmethod=POST +packet_status.service.responseType=java.util.LinkedHashMap +packet_status.service.headers=Content-Type:APPLICATION/JSON +packet_status.service.authrequired=true +packet_status.service.signrequired=false +packet_status.service.authheader=Authorization:OAUTH +packet_status.service.requestsignrequired=true + +#sms +sms.service.url=https://qa.mosip.io/v1/smsnotifier/sms/send +sms.service.httpmethod=POST +sms.service.requestType=java.lang.Object +sms.service.headers=Content-Type:APPLICATION/JSON +sms.service.authrequired=true +sms.service.signrequired=false +sms.service.authheader=Authorization:OAUTH +sms.service.requestsignrequired=true + +#email +email.service.url=https://qa.mosip.io/v1/emailnotifier/email/send +email.service.httpmethod=POST +email.service.requestType=java.lang.Object +email.service.headers=Content-Type:multipart/form-data +email.service.authrequired=true +email.service.signrequired=false +email.service.authheader=Authorization:OAUTH +email.service.requestsignrequired=true + +#Upload +packet_upload.service.url=https://qa.mosip.io/registrationprocessor/v1/packetreceiver/registrationpackets +packet_upload.service.httpmethod=POST +packet_upload.service.requestType=java.lang.String +packet_upload.service.headers=Content-Type:multipart/form-data +packet_upload.service.authrequired=true +packet_upload.service.signrequired=false +packet_upload.service.authheader=Authorization:OAUTH +packet_upload.service.service.requestsignrequired=true + +#Packet Sync +packet_sync.service.url=https://qa.mosip.io/registrationprocessor/v1/registrationstatus/sync +packet_sync.service.httpmethod=POST +packet_sync.service.requestType=java.lang.Object +packet_sync.service.headers=Content-Type:APPLICATION/JSON,timestamp:timestamp,Center-Machine-RefId:centerId +packet_sync.service.authrequired=true +packet_sync.service.signrequired=false +packet_sync.service.authheader=Authorization:OAUTH +packet_sync.service.service.requestsignrequired=true + +#policy sync +policysync.service.url= https://qa.mosip.io/v1/syncdata/publickey/REGISTRATION +policysync.service.httpmethod=GET +policysync.service.responseType=java.util.LinkedHashMap +policysync.service.headers=Content-Type:APPLICATION/JSON +policysync.service.authrequired=true +policysync.service.signrequired=false +policysync.service.authheader=Authorization:OAUTH +policysync.service.service.requestsignrequired=true + +#Pre-Registration Get Pre-Reg Id's +get_pre_registration_Ids.service.url=https://qa.mosip.io/preregistration/v1/sync +get_pre_registration_Ids.service.httpmethod=POST +get_pre_registration_Ids.service.requestType=java.lang.Object +get_pre_registration_Ids.service.headers=Content-Type:APPLICATION/JSON +get_pre_registration_Ids.service.authrequired=true +get_pre_registration_Ids.service.signrequired=false +get_pre_registration_Ids.service.authheader=Authorization:OAUTH +get_pre_registration_Ids.service.requestsignrequired=true + +#Pre-Registration Get Pre-Reg packet +get_pre_registration.service.url=https://qa.mosip.io/preregistration/v1/sync/{pre_registration_id} +get_pre_registration.service.httpmethod=GET +get_pre_registration.service.responseType=java.lang.Object +get_pre_registration.service.headers=Content-Type:APPLICATION/JSON +get_pre_registration.service.authrequired=true +get_pre_registration.service.signrequired=false +get_pre_registration.service.authheader=Authorization:OAUTH +get_pre_registration.service.requestsignrequired=true + +#master_sync details +master_sync.service.url=https://qa.mosip.io/v1/syncdata/masterdata +master_sync.service.httpmethod=GET +master_sync.service.responseType=java.lang.Object +master_sync.service.headers=Content-Type:application/json;charset=UTF-8 +master_sync.service.authrequired=true +master_sync.service.signrequired=false +master_sync.service.authheader=Authorization:OAUTH +master_sync.service.requestsignrequired=true + +#Get Global-Config Details +get_registration_center_config.service.url=https://qa.mosip.io/v1/syncdata/configs +get_registration_center_config.service.httpmethod=GET +get_registration_center_config.service.responseType=java.util.LinkedHashMap +get_registration_center_config.service.headers=Content-Type:APPLICATION/JSON +get_registration_center_config.service.authrequired=true +get_registration_center_config.service.signrequired=false +get_registration_center_config.service.authheader=Authorization:OAUTH +get_registration_center_config.service.requestsignrequired=true + +#Send OTP +send_otp.service.url=https://qa.mosip.io/v1/authmanager/authenticate/sendotp +send_otp.service.httpmethod=POST +send_otp.service.requestType=java.lang.Object +send_otp.service.headers=Content-Type:APPLICATION/JSON +send_otp.service.authrequired=true +send_otp.service.signrequired=false +send_otp.service.authheader=Authorization:OAUTH +send_otp.service.requestsignrequired=false + +#Validate Authorization Token +validate_auth_token.service.url=https://qa.mosip.io/v1/authmanager/authorize/admin/validateToken +validate_auth_token.service.httpmethod=POST +validate_auth_token.service.requestType=java.lang.Object +validate_auth_token.service.headers=Content-Type:APPLICATION/JSON +validate_auth_token.service.authrequired=true +validate_auth_token.service.signrequired=false +validate_auth_token.service.authheader=Authorization:OAUTH +validate_auth_token.service.requestsignrequired=false + +#Authentication API +auth_by_password.service.url=https://qa.mosip.io/v1/authmanager/authenticate/useridPwd +auth_by_otp.service.url=https://qa.mosip.io/v1/authmanager/authenticate/useridOTP +auth_by_clientid_secretkey.service.url=https://qa.mosip.io/v1/authmanager/authenticate/clientidsecretkey + +#user details +user_details.service.url=https://qa.mosip.io/v1/syncdata/userdetails/{regid} +user_details.service.httpmethod=GET +user_details.service.responseType=java.lang.Object +user_details.service.headers=Content-Type:APPLICATION/JSON +user_details.service.authrequired=true +user_details.service.signrequired=false +user_details.service.authheader=Authorization:OAUTH +user_details.service.requestsignrequired=true + +#Invalidate Authorization Token +invalidate_auth_token.service.url=https://qa.mosip.io/v1/authmanager/authorize/invalidateToken +invalidate_auth_token.service.httpmethod=POST +invalidate_auth_token.service.requestType=java.lang.Object +invalidate_auth_token.service.headers=Content-Type:APPLICATION/JSON +invalidate_auth_token.service.authrequired=true +invalidate_auth_token.service.signrequired=false +invalidate_auth_token.service.authheader=Authorization:OAUTH +invalidate_auth_token.service.requestsignrequired=false + +#public_key details +public_key.service.url=https://qa.mosip.io/v1/keymanager/publickey/KERNEL +public_key.service.httpmethod=GET +public_key.service.responseType=java.lang.Object +public_key.service.headers=Content-Type:APPLICATION/JSON +public_key.service.authrequired=true +public_key.service.signrequired=false +public_key.service.authheader=Authorization:OAUTH +public_key.service.requestsignrequired=true + +#public_key details +public_key.service.url=https://qa.mosip.io/v1/keymanager/publickey/KERNEL +public_key.service.httpmethod=GET +public_key.service.responseType=java.lang.Object +public_key.service.headers=Content-Type:APPLICATION/JSON +public_key.service.authrequired=true +public_key.service.signrequired=false +public_key.service.authheader=Authorization:OAUTH +public_key.service.requestsignrequired=true + +#user_salt_details details +user_salt_details.service.url=https://qa.mosip.io/v1/authmanager/usersaltdetails/registrationclient +user_salt_details.service.httpmethod=GET +user_salt_details.service.responseType=java.lang.Object +user_salt_details.service.headers=Content-Type:APPLICATION/JSON +user_salt_details.service.authrequired=true +user_salt_details.service.signrequired=false +user_salt_details.service.authheader=Authorization:OAUTH +user_salt_details.service.requestsignrequired=true + +#SignatureResponseUrl's +mosip.kernel.signature.cryptomanager-encrypt-url=https://qa.mosip.io/v1/cryptomanager/private/encrypt +mosip.kernel.keymanager-service-publickey-url=https://qa.mosip.io/v1/keymanager/publickey/{applicationId} +auth.server.validate.url=https://qa.mosip.io/v1/authmanager/authorize/validateToken +auth.server.refreshToken.url=https://qa.mosip.io/v1/authmanager/authorize/refreshToken + +#master_sync details +center_remap_sync.service.url=https://qa.mosip.io/v1/syncdata/masterdata/{regcenterId} +center_remap_sync.service.httpmethod=GET +center_remap_sync.service.responseType=java.lang.Object +center_remap_sync.service.headers=Content-Type:application/json;charset=UTF-8 +center_remap_sync.service.authrequired=true +center_remap_sync.service.signrequired=false +center_remap_sync.service.authheader=Authorization:OAUTH +center_remap_sync.service.requestsignrequired=true + +#ida_key details +ida_key.service.url=https://qa.mosip.io/v1/keymanager/publickey/IDA +ida_key.service.httpmethod=GET +ida_key.service.responseType=java.util.LinkedHashMap +ida_key.service.headers=Content-Type:APPLICATION/JSON +ida_key.service.authrequired=true +ida_key.service.signrequired=false +ida_key.service.authheader=Authorization:OAUTH +ida_key.service.requestsignrequired=true + +#ida_auth details +ida_auth.service.url=https://qa.mosip.io/idauthentication/v1/internal/auth +ida_auth.service.httpmethod=POST +ida_auth.service.responseType=java.util.LinkedHashMap +ida_auth.service.headers=Content-Type:APPLICATION/JSON +ida_auth.service.authrequired=true +ida_auth.service.signrequired=false +ida_auth.service.authheader=Authorization:OAUTH +ida_auth.service.requestsignrequired=true + +#TPM Public Key Upload +tpm_public_key.service.url=https://qa.mosip.io/v1/syncdata/tpm/publickey +tpm_public_key.service.httpmethod=POST +tpm_public_key.service.responseType=java.lang.Object +tpm_public_key.service.headers=Content-Type:APPLICATION/JSON +tpm_public_key.service.authrequired=true +tpm_public_key.service.signrequired=false +tpm_public_key.service.authheader=Authorization:OAUTH +ida_auth.service.requestsignrequired=false + +#Main Properties +mosip.reg.client.url=https://devops.mosip.io/artifactory/libs-release/io/mosip/registration/registration-client/ +mosip.reg.logpath=../logs +mosip.reg.packetstorepath=../PacketStore +mosip.reg.healthcheck.url=https://qa.mosip.io/v1/authmanager/actuator/health +mosip.reg.rollback.path=../BackUp +mosip.reg.db.key=bW9zaXAxMjM0NQ\=\= +mosip.reg.cerpath=/cer//mosip_cer.cer +mosip.reg.xml.file.url=https://devops.mosip.io/artifactory/libs-release/io/mosip/registration/registration-client/maven-metadata.xml +mosip.reg.dbpath=db/reg +mosip.reg.client.tpm.availability=N + +#Cryptomanger +session_key.service.url=https://qa.mosip.io/v1/cryptomanager/encrypt +session_key.service.httpmethod=POST +session_key.service.requestType=java.lang.Object +session_key.service.headers=Content-Type:APPLICATION/JSON +session_key.service.authrequired=true +session_key.service.signrequired=false +session_key.service.authheader=Authorization:OAUTH +session_key.service.service.requestsignrequired=true diff --git a/api-test/src/main/resources/testCaseSkippedList.txt b/api-test/src/main/resources/testCaseSkippedList.txt new file mode 100644 index 00000000000..b8d976ce33d --- /dev/null +++ b/api-test/src/main/resources/testCaseSkippedList.txt @@ -0,0 +1,14 @@ +##### JIRA number;testcase +#MOSIP-12345------Test_Case_Name +MOSIP-41858------Resident_GetRemainingupdatecountby_empty_IndividualIdRequest_Negative +MOSIP-41858------Resident_PrintUin_All_Valid_Smoke +MOSIP-41858------Resident_RequestCredentials_euin_VID_CheckVidIs_REVOKED_Neg +MOSIP-41858------Resident_SendOTP_RevokedVID_Invalid +MOSIP-41858------Resident_GetPendingDrafts__Invalid_langCode_eng_Smoke_Neg +MOSIP-41859------Resident_GetChannelVerificationStatus_For_Phone_all_Valid_Smoke +MOSIP-41859------Resident_GetChannelVerificationStatus_Phone_Valid_Smoke +MOSIP-41859------Resident_Generate_Perpetual_VID_Phone_Valid_Smoke_sid +MOSIP-41859------Resident_AuthHistory_With_UIN_Phone_smoke_Pos +MOSIP-41859------Resident_AuthLock_Valid_UIN_Phone_All +MOSIP-41859------Resident_AuthUnLock_Valid_UIN_PhoneChannel_Pos +MOSIP-41859------Resident_RequestCredentials_Phone_Channel_Pos \ No newline at end of file diff --git a/api-test/src/main/resources/validations.properties b/api-test/src/main/resources/validations.properties new file mode 100644 index 00000000000..18ecaa8bf2a --- /dev/null +++ b/api-test/src/main/resources/validations.properties @@ -0,0 +1,34 @@ +#field = regex ,isMandatory +preRegistrationId=\\d{0,30} ,true +parentName=(.){0,50} ,true +parentName_ontype=(.){0,50} ,true +parentRegId=\\d{0,} ,true +parentRegId_ontype=\\d{0,} ,true +parentUinId=\\d{0,} ,true +parentUinId_ontype=\\d{0,} ,true +parentNameLocalLanguage=(.){0,50} ,true +parentNameLocalLanguage_ontype=(.){0,50} ,true +ageField=\\d{0,3} ,true +ageField_ontype=\\d{0,3} ,true +ageFieldLocalLanguage=\\d{0,3} ,true +parentRegIdLocalLanguage=\\d{0,} ,true +parentRegIdLocalLanguage_ontype=\\d{0,} ,true +parentUinIdLocalLanguage=\\d{0,} ,true +parentUinIdLocalLanguage_ontype=\\d{0,} ,true +ddLocalLanguage=\\d{0,2} ,true +mmLocalLanguage=\\d{0,2} ,true +yyyyLocalLanguage=\\d{4} ,true +dd=\\d{0,2} ,true +mm=\\d{0,2} ,true +yyyy=\\d{4} ,true +dd_ontype=\\d{0,2} ,true +mm_ontype=\\d{0,2} ,true +yyyy_ontype=\\d{0,4} ,true +ddLocalLanguage_ontype=\\d{0,2} ,true +mmLocalLanguage_ontype=\\d{0,2} ,true +yyyyLocalLanguage_ontype=\\d{0,4} ,true +otp=(.){0,10} ,true +cniOrPinNumber=\\d{10,30} ,true +cniOrPinNumberLocalLanguage=\\d{10,30} ,true +cniOrPinNumber_ontype=\\d{10,30} ,true +cniOrPinNumberLocalLanguage_ontype=\\d{10,30} ,true diff --git a/api-test/testNgXmlFiles/residentMasterTestSuite.xml b/api-test/testNgXmlFiles/residentMasterTestSuite.xml new file mode 100644 index 00000000000..ac82affedd6 --- /dev/null +++ b/api-test/testNgXmlFiles/residentMasterTestSuite.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/api-test/testNgXmlFiles/residentPrerequisiteSuite.xml b/api-test/testNgXmlFiles/residentPrerequisiteSuite.xml new file mode 100644 index 00000000000..fd973c8defc --- /dev/null +++ b/api-test/testNgXmlFiles/residentPrerequisiteSuite.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/api-test/testNgXmlFiles/residentSuite.xml b/api-test/testNgXmlFiles/residentSuite.xml new file mode 100644 index 00000000000..f4cedbf3aa2 --- /dev/null +++ b/api-test/testNgXmlFiles/residentSuite.xml @@ -0,0 +1,948 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/db_release_scripts/mosip_resident/ddl/otp_transaction.sql b/db_release_scripts/mosip_resident/ddl/otp_transaction.sql new file mode 100644 index 00000000000..acd8789cb1b --- /dev/null +++ b/db_release_scripts/mosip_resident/ddl/otp_transaction.sql @@ -0,0 +1,50 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the OTP for the user whenever user requests for one using the email id / phone number to log into the application. +CREATE TABLE resident.otp_transaction( + id character varying(36) NOT NULL, + ref_id character varying(1024) NOT NULL, + otp_hash character varying(512) NOT NULL, + generated_dtimes timestamp, + expiry_dtimes timestamp, + validation_retry_count smallint, + status_code character varying(36), + lang_code character varying(3), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean, + del_dtimes timestamp, + CONSTRAINT pk_otpt_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.otp_transaction IS 'All OTP related data and validation details are maintained here for Pre Registration module.'; +COMMENT ON COLUMN resident.otp_transaction.id IS 'OTP id is a unique identifier (UUID) used as an unique key to identify the OTP transaction'; +COMMENT ON COLUMN resident.otp_transaction.ref_id IS 'Reference ID is a reference information received from OTP requester which can be used while validating the OTP. AM: please give examples of ref_id'; +COMMENT ON COLUMN resident.otp_transaction.otp_hash IS 'Hash of id, ref_id and otp which is generated based on the configuration setup and sent to the requester application / module.'; +COMMENT ON COLUMN resident.otp_transaction.generated_dtimes IS 'Date and Time when the OTP was generated'; +COMMENT ON COLUMN resident.otp_transaction.expiry_dtimes IS 'Date Time when the OTP will be expired'; +COMMENT ON COLUMN resident.otp_transaction.validation_retry_count IS 'Validation retry counts of this OTP request. If the validation retry crosses the threshold limit, then the OTP will be de-activated.'; +COMMENT ON COLUMN resident.otp_transaction.status_code IS 'Current status of the transaction. Refers to code field of master.status_list table.'; +COMMENT ON COLUMN resident.otp_transaction.lang_code IS 'For multilanguage implementation this attribute Refers master.language.code. The value of some of the attributes in current record is stored in this respective language.'; +COMMENT ON COLUMN resident.otp_transaction.cr_by IS 'ID or name of the user who create / insert record.'; +COMMENT ON COLUMN resident.otp_transaction.cr_dtimes IS 'Date and Timestamp when the record is created/inserted'; +COMMENT ON COLUMN resident.otp_transaction.upd_by IS 'ID or name of the user who update the record with new values'; +COMMENT ON COLUMN resident.otp_transaction.upd_dtimes IS 'Date and Timestamp when any of the fields in the record is updated with new values.'; +COMMENT ON COLUMN resident.otp_transaction.is_deleted IS 'Flag to mark whether the record is Soft deleted.'; +COMMENT ON COLUMN resident.otp_transaction.del_dtimes IS 'Date and Timestamp when the record is soft deleted with is_deleted=TRUE'; +----------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.otp_transaction + TO residentuser; \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/ddl/resident_grievance_ticket.sql b/db_release_scripts/mosip_resident/ddl/resident_grievance_ticket.sql new file mode 100644 index 00000000000..5cf2f8ffe62 --- /dev/null +++ b/db_release_scripts/mosip_resident/ddl/resident_grievance_ticket.sql @@ -0,0 +1,53 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: resident_grievance_ticket +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : December-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the resident_grievance_ticket table values. +CREATE TABLE resident.resident_grievance_ticket( + id VARCHAR(64) NOT NULL, + eventId VARCHAR(64) NOT NULL, + name VARCHAR(256) NOT NULL, + emailId VARCHAR(128), + alternateEmailId VARCHAR(128), + phoneNo VARCHAR(64), + alternatePhoneNo VARCHAR(64), + message character varying(1024) NOT NULL, + hasAttachment boolean NOT NULL DEFAULT false, + status character varying(64) NOT NULL, + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + CONSTRAINT pk_resgrev_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.resident_grievance_ticket IS 'This Table is used to save the resident_grievance_ticket table values.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.id IS 'Unique Id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.eventId IS 'Unique event id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.emailId IS 'Unique email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternateEmailId IS 'Alternate email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.phoneNo IS 'Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternatePhoneNo IS 'Alternate Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.message IS 'Message.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.status IS 'status.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_by IS 'created by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_dtimes IS 'created date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_by IS 'updated by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_dtimes IS 'updated date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.is_deleted IS 'is deleted.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.del_dtimes IS 'Deleted time-stamp.'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_grievance_ticket + TO residentuser; \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/ddl/resident_session.sql b/db_release_scripts/mosip_resident/ddl/resident_session.sql new file mode 100644 index 00000000000..9de2d2e0de6 --- /dev/null +++ b/db_release_scripts/mosip_resident/ddl/resident_session.sql @@ -0,0 +1,38 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Loganathan Sekar +-- Created Date : Jan-2023 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_session( + session_id character varying(128) NOT NULL, + ida_token character varying(128) NOT NULL, + login_dtimes timestamp, + ip_address character varying(128), + host character varying(128), + machine_type character varying(100), + CONSTRAINT pk_session_id PRIMARY KEY (session_id) +); + +COMMENT ON TABLE resident.resident_session IS 'This Table is used to save the user sessions.'; +COMMENT ON COLUMN resident.resident_session.session_id IS 'The unique session identifier for each login'; +COMMENT ON COLUMN resident.resident_session.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_session.login_dtimes IS 'The time when the user last logged in'; +COMMENT ON COLUMN resident.resident_session.ip_address IS 'The ip_address of device from which the user logged in'; +COMMENT ON COLUMN resident.resident_session.host IS 'The host of the site'; +COMMENT ON COLUMN resident.resident_session.machine_type IS 'The OS of device used for accessing the portal/app'; + +-- Adding index to ida_token column +CREATE INDEX idx_resident_session_ida_token ON resident.resident_session (ida_token); + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_session + TO residentuser; \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/ddl/resident_transaction.sql b/db_release_scripts/mosip_resident/ddl/resident_transaction.sql new file mode 100644 index 00000000000..5b87875eea6 --- /dev/null +++ b/db_release_scripts/mosip_resident/ddl/resident_transaction.sql @@ -0,0 +1,112 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the transaction related to residents. +CREATE TABLE resident.resident_transaction( + event_id VARCHAR(64) NOT NULL, + request_trn_id character varying(64) , + request_dtimes timestamp NOT NULL, + response_dtime timestamp NOT NULL, + request_type_code character varying(128) NOT NULL, + request_summary character varying(1024) NOT NULL, + status_code character varying(36) NOT NULL, + status_comment character varying(1024), + lang_code character varying(3), + ref_id_type character varying(36), + ref_id character varying(64), + token_id character varying(128) NOT NULL, + requested_entity_type character varying(64), + requested_entity_id character varying(36), + requested_entity_name character varying(128), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + auth_type_code character varying(128), + static_tkn_id character varying(64), + request_signature character varying, + response_signature character varying, + olv_partner_id character varying(36), + aid character varying(64), + reference_link character varying(1024), + read_status boolean NOT NULL DEFAULT false, + pinned_status boolean NOT NULL DEFAULT false, + purpose character varying(1024), + credential_request_id character varying(256), + attribute_list character varying(255), + individual_id character varying(1024), + consent character varying(50), + tracking_id character varying(50), + CONSTRAINT pk_restrn_event_id PRIMARY KEY (event_id) +); + +COMMENT ON TABLE resident.resident_transaction IS 'This Table is used to save the transaction related to residents.'; +COMMENT ON COLUMN resident.resident_transaction.event_id IS 'Unique Id of the transaction.'; +COMMENT ON COLUMN resident.resident_transaction.aid IS 'The Application ID'; +COMMENT ON COLUMN resident.resident_transaction.request_dtimes IS 'The time when the request is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.response_dtime IS 'The time when the response is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.request_trn_id IS 'The unique identifier for each transaction'; +COMMENT ON COLUMN resident.resident_transaction.request_type_code IS 'The type of request'; +COMMENT ON COLUMN resident.resident_transaction.request_summary IS 'The summary of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_code IS 'The current status of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_comment IS 'The comment for the status of the request'; +COMMENT ON COLUMN resident.resident_transaction.lang_code IS 'The language code for the request for multi-language support'; +COMMENT ON COLUMN resident.resident_transaction.ref_id_type IS 'The type of reference id'; +COMMENT ON COLUMN resident.resident_transaction.ref_id IS 'The reference id'; +COMMENT ON COLUMN resident.resident_transaction.token_id IS 'The token id'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_type IS 'The type of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_id IS 'The id of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_name IS 'The name of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.cr_by IS 'The user who created the record'; +COMMENT ON COLUMN resident.resident_transaction.cr_dtimes IS 'The time when the record is created'; +COMMENT ON COLUMN resident.resident_transaction.upd_by IS 'The user who updated the record'; +COMMENT ON COLUMN resident.resident_transaction.upd_dtimes IS 'The time when the record is updated'; +COMMENT ON COLUMN resident.resident_transaction.is_deleted IS 'The flag to identify if the record is deleted or not'; +COMMENT ON COLUMN resident.resident_transaction.del_dtimes IS 'The time when the record is deleted'; +COMMENT ON COLUMN resident.resident_transaction.auth_type_code IS 'The type of the authentication'; +COMMENT ON COLUMN resident.resident_transaction.static_tkn_id IS 'The static token id'; +COMMENT ON COLUMN resident.resident_transaction.request_signature IS 'The signature of the request'; +COMMENT ON COLUMN resident.resident_transaction.response_signature IS 'The signature of the response'; +COMMENT ON COLUMN resident.resident_transaction.olv_partner_id IS 'The partner id'; +COMMENT ON COLUMN resident.resident_transaction.reference_link IS 'The reference link'; +COMMENT ON COLUMN resident.resident_transaction.read_status IS 'The flag to identify if the request is read or not'; +COMMENT ON COLUMN resident.resident_transaction.pinned_status IS 'The flag to identify if the request is pinned or not'; +COMMENT ON COLUMN resident.resident_transaction.purpose IS 'The purpose of the request'; +COMMENT ON COLUMN resident.resident_transaction.credential_request_id IS 'The credential request id'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Adding index to event_id column +CREATE INDEX idx_resident_transaction_event_id ON resident.resident_transaction (event_id); + +-- Adding index to token_id column +CREATE INDEX idx_resident_transaction_token_id ON resident.resident_transaction (token_id); + +-- Adding index to credential_request_id column +CREATE INDEX idx_resident_transaction_credential_request_id ON resident.resident_transaction (credential_request_id); + +-- Adding index to request_dtimes column +CREATE INDEX idx_resident_transaction_request_dtimes ON resident.resident_transaction (request_dtimes); + +-- Adding index to request_trn_id column +CREATE INDEX idx_resident_transaction_request_trn_id ON resident.resident_transaction (request_trn_id); + +-- Adding index to ref_id column +CREATE INDEX idx_resident_transaction_ref_id ON resident.resident_transaction (ref_id); + +--Adding index to read_status column +CREATE INDEX idx_resident_transaction_read_status ON resident.resident_transaction (read_status); + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_transaction + TO residentuser; \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/ddl/resident_user_actions.sql b/db_release_scripts/mosip_resident/ddl/resident_user_actions.sql new file mode 100644 index 00000000000..7b7c5ee126b --- /dev/null +++ b/db_release_scripts/mosip_resident/ddl/resident_user_actions.sql @@ -0,0 +1,30 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : Aug-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_user_actions( + ida_token character varying(128) NOT NULL, + last_bell_notif_click_dtimes timestamp, + CONSTRAINT pk_ida_token PRIMARY KEY (ida_token) +); + +COMMENT ON TABLE resident.resident_user_actions IS 'This Table is used to save the user actions'; +COMMENT ON COLUMN resident.resident_user_actions.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_user_actions.last_bell_notif_click_dtimes IS 'The time when the user last clicked on the bell notification'; + +-- Adding index to ida_token column +CREATE INDEX idx_resident_user_actions_ida_token ON resident.resident_user_actions (ida_token); + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/resident_release_db_deploy.sh b/db_release_scripts/mosip_resident/resident_release_db_deploy.sh new file mode 100644 index 00000000000..3c1b81c330e --- /dev/null +++ b/db_release_scripts/mosip_resident/resident_release_db_deploy.sh @@ -0,0 +1,91 @@ +### -- --------------------------------------------------------------------------------------------------------- +### -- Script Name : RESIDENT Release DB deploy +### -- Deploy Module : MOSIP RESIDENT +### -- Purpose : To deploy RESIDENT Database alter scripts for the release. +### -- Create By : Sadanandegowda +### -- Created Date : 25-Oct-2019 +### -- +### -- Modified Date Modified By Comments / Remarks +### -- ----------------------------------------------------------------------------------------------------------- + +### -- ----------------------------------------------------------------------------------------------------------- + +#########Properties file ############# +set -e +properties_file="$1" +release_version="$2" + echo `date "+%m/%d/%Y %H:%M:%S"` ": Properties File Name - $properties_file" + echo `date "+%m/%d/%Y %H:%M:%S"` ": DB Deploymnet Version - $release_version" +#properties_file="./app.properties" +if [ -f "$properties_file" ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file \"$properties_file\" found." + while IFS='=' read -r key value + do + key=$(echo $key | tr '.' '_') + eval ${key}=\${value} + done < "$properties_file" +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file not found, Pass property file name as argument." +fi +echo `date "+%m/%d/%Y %H:%M:%S"` ": ------------------ Database server and service status check for ${MOSIP_DB_NAME}------------------------" + +today=`date '+%d%m%Y_%H%M%S'`; +LOG="${LOG_PATH}${MOSIP_DB_NAME}-release-${release_version}-${today}.log" +touch $LOG + +SERVICE=$(PGPASSWORD=$SU_USER_PWD psql --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "select count(1) from pg_roles where rolname IN('sysadmin')";exit; > /dev/null) + +if [ "$SERVICE" -eq 0 ] || [ "$SERVICE" -eq 1 ] +then +echo `date "+%m/%d/%Y %H:%M:%S"` ": Postgres database server and service is up and running" | tee -a $LOG 2>&1 +else +echo `date "+%m/%d/%Y %H:%M:%S"` ": Postgres database server or service is not running" | tee -a $LOG 2>&1 +fi + +echo `date "+%m/%d/%Y %H:%M:%S"` ": ----------------------------------------------------------------------------------------" + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Started sourcing the $MOSIP_DB_NAME Database Alter scripts" | tee -a $LOG 2>&1 + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Database Alter scripts are sourcing from :$BASEPATH/$MOSIP_DB_NAME/" | tee -a $LOG 2>&1 + +#========================================DB Alter Scripts deployment process begins on IDMAP DB SERVER================================== + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Alter scripts deployment on $MOSIP_DB_NAME database is started....Deployment Version...$release_version" | tee -a $LOG 2>&1 + +ALTER_SCRIPT_FILENAME_VERSION="sql/${release_version}_${ALTER_SCRIPT_FILENAME}" + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Alter scripts file which is considered for release deployment - $ALTER_SCRIPT_FILENAME_VERSION" | tee -a $LOG 2>&1 + +cd /$BASEPATH/$MOSIP_DB_NAME/ + +pwd | tee -a $LOG 2>&1 + +CONN=$(PGPASSWORD=$SYSADMIN_PWD psql --username=$SYSADMIN_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "SELECT count(pg_terminate_backend(pg_stat_activity.pid)) FROM pg_stat_activity WHERE datname = '$MOSIP_DB_NAME' AND pid <> pg_backend_pid()";exit; >> $LOG 2>&1) + +if [ ${CONN} == 0 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": No active database connections exist on ${MOSIP_DB_NAME}" | tee -a $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Active connections exist on the database server and active connection will be terminated for DB deployment." | tee -a $LOG 2>&1 +fi + +if [ ${ALTER_SCRIPT_FLAG} == 1 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Deploying Alter scripts for ${MOSIP_DB_NAME} database" | tee -a $LOG 2>&1 + PGPASSWORD=$SYSADMIN_PWD psql --username=$SYSADMIN_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $ALTER_SCRIPT_FILENAME_VERSION >> $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": There are no alter scripts available for this deployment at ${MOSIP_DB_NAME}" | tee -a $LOG 2>&1 +fi + +if [ $(grep -c ERROR $LOG) -ne 0 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Database Alter scripts deployment version $release_version is completed with ERRORS, Please check the logs for more information" | tee -a $LOG 2>&1 + echo `date "+%m/%d/%Y %H:%M:%S"` ": END of Alter scripts MOSIP database deployment" | tee -a $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Database Alter scripts deployment version $release_version completed successfully, Please check the logs for more information" | tee -a $LOG 2>&1 + echo `date "+%m/%d/%Y %H:%M:%S"` ": END of MOSIP \"${MOSIP_DB_NAME}\" database alter scripts deployment" | tee -a $LOG 2>&1 +fi + +echo "******************************************"`date "+%m/%d/%Y %H:%M:%S"` "*****************************************************" >> $LOG 2>&1 + diff --git a/db_release_scripts/mosip_resident/resident_release_deploy.properties b/db_release_scripts/mosip_resident/resident_release_deploy.properties new file mode 100644 index 00000000000..7bb9ddd740d --- /dev/null +++ b/db_release_scripts/mosip_resident/resident_release_deploy.properties @@ -0,0 +1,12 @@ +DB_SERVERIP= +DB_PORT=30090 +SU_USER=postgres +DEFAULT_DB_NAME=postgres +MOSIP_DB_NAME=mosip_resident +SYSADMIN_USER=sysadmin +BASEPATH=/home/madmin/database_release +LOG_PATH=/home/madmin/logs/ +ALTER_SCRIPT_FLAG=1 +ALTER_SCRIPT_FILENAME=resident-scripts_release.sql +REVOKE_SCRIPT_FLAG=1 +REVOKE_SCRIPT_FILENAME=resident-scripts_revoke.sql \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/resident_revoke_db_deploy.sh b/db_release_scripts/mosip_resident/resident_revoke_db_deploy.sh new file mode 100644 index 00000000000..c5979b05a91 --- /dev/null +++ b/db_release_scripts/mosip_resident/resident_revoke_db_deploy.sh @@ -0,0 +1,91 @@ +### -- --------------------------------------------------------------------------------------------------------- +### -- Script Name : RESIDENT Revoke DB deploy +### -- Deploy Module : MOSIP RESIDENT +### -- Purpose : To revoke RESIDENT Database alter scripts for the release. +### -- Create By : Sadanandegowda +### -- Created Date : 25-Oct-2019 +### -- +### -- Modified Date Modified By Comments / Remarks +### -- ----------------------------------------------------------------------------------------------------------- + +### -- ----------------------------------------------------------------------------------------------------------- + +#########Properties file ############# +set -e +properties_file="$1" +revoke_version="$2" + echo `date "+%m/%d/%Y %H:%M:%S"` ": $properties_file" + echo `date "+%m/%d/%Y %H:%M:%S"` ": DB Revoke Version - $revoke_version" +#properties_file="./app.properties" +if [ -f "$properties_file" ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file \"$properties_file\" found." + while IFS='=' read -r key value + do + key=$(echo $key | tr '.' '_') + eval ${key}=\${value} + done < "$properties_file" +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file not found, Pass property file name as argument." +fi +echo `date "+%m/%d/%Y %H:%M:%S"` ": ------------------ Database server and service status check for ${MOSIP_DB_NAME}------------------------" + +today=`date '+%d%m%Y_%H%M%S'`; +LOG="${LOG_PATH}${MOSIP_DB_NAME}-revoke-${today}.log" +touch $LOG + +SERVICE=$(PGPASSWORD=$SU_USER_PWD psql --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "select count(1) from pg_roles where rolname IN('sysadmin')";exit; > /dev/null) + +if [ "$SERVICE" -eq 0 ] || [ "$SERVICE" -eq 1 ] +then +echo `date "+%m/%d/%Y %H:%M:%S"` ": Postgres database server and service is up and running" | tee -a $LOG 2>&1 +else +echo `date "+%m/%d/%Y %H:%M:%S"` ": Postgres database server or service is not running" | tee -a $LOG 2>&1 +fi + +echo `date "+%m/%d/%Y %H:%M:%S"` ": ----------------------------------------------------------------------------------------" + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Started sourcing the $MOSIP_DB_NAME Database Deployment Revoke scripts" | tee -a $LOG 2>&1 + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Database revoke scripts are sourcing from :$BASEPATH/$MOSIP_DB_NAME/alter-scripts" | tee -a $LOG 2>&1 + +#========================================DB Alter Scripts deployment process begins on IDMAP DB SERVER================================== + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Revoke scripts for DB deployment on $MOSIP_DB_NAME database is started....Revoke Version...$revoke_version" | tee -a $LOG 2>&1 + +REVOKE_SCRIPT_FILENAME_VERSION="sql/${revoke_version}_${REVOKE_SCRIPT_FILENAME}" + +echo `date "+%m/%d/%Y %H:%M:%S"` ": Alter scripts file which is considered for deployment revoke - $REVOKE_SCRIPT_FILENAME_VERSION" | tee -a $LOG 2>&1 + +cd /$BASEPATH/$MOSIP_DB_NAME/ + +pwd | tee -a $LOG 2>&1 + +CONN=$(PGPASSWORD=$SYSADMIN_PWD psql --username=$SYSADMIN_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "SELECT count(pg_terminate_backend(pg_stat_activity.pid)) FROM pg_stat_activity WHERE datname = '$MOSIP_DB_NAME' AND pid <> pg_backend_pid()";exit; >> $LOG 2>&1) + +if [ ${CONN} == 0 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": No active database connections exist on ${MOSIP_DB_NAME}" | tee -a $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Active connections exist on the database server and active connection will be terminated for DB deployment." | tee -a $LOG 2>&1 +fi + +if [ ${REVOKE_SCRIPT_FLAG} == 1 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Executing revoke scripts for ${MOSIP_DB_NAME} database" | tee -a $LOG 2>&1 + PGPASSWORD=$SYSADMIN_PWD psql --username=$SYSADMIN_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $REVOKE_SCRIPT_FILENAME_VERSION >> $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": There are no revoke scripts available for this deployment at ${MOSIP_DB_NAME}" | tee -a $LOG 2>&1 +fi + +if [ $(grep -c ERROR $LOG) -ne 0 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Database deployment revoke version $revoke_version is completed with ERRORS, Please check the logs for more information" | tee -a $LOG 2>&1 + echo `date "+%m/%d/%Y %H:%M:%S"` ": END of Alter scripts MOSIP database deployment" | tee -a $LOG 2>&1 +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Database deployment revoke version $revoke_version completed successfully, Please check the logs for more information" | tee -a $LOG 2>&1 + echo `date "+%m/%d/%Y %H:%M:%S"` ": END of MOSIP \"${MOSIP_DB_NAME}\" database deployment revoke" | tee -a $LOG 2>&1 +fi + +echo "******************************************"`date "+%m/%d/%Y %H:%M:%S"` "*****************************************************" >> $LOG 2>&1 + diff --git a/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_release.sql b/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_release.sql new file mode 100644 index 00000000000..1dac56a1955 --- /dev/null +++ b/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_release.sql @@ -0,0 +1,21 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +-- April-2022 Kamesh Shekhar Prasad Added resident_transaction table creation scripts with comments. +-- Dec-2022 Kamesh Shekhar Prasad Added resident_grievance_ticket, resident_user_actions table creation scripts with comments. +----------------------------------------------------------------------------------------------------- +\c mosip_resident sysadmin + +\ir ddl/otp_transaction.sql +\ir ddl/resident_transaction.sql +\ir ddl/resident_grievance_ticket.sql +\ir ddl/resident_user_actions.sql +\ir ddl/resident_sessions.sql +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_revoke.sql b/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_revoke.sql new file mode 100644 index 00000000000..437c5ef7eff --- /dev/null +++ b/db_release_scripts/mosip_resident/sql/1.2.0_resident-scripts_revoke.sql @@ -0,0 +1,30 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +-- April-2022 Kamesh Shekhar Prasad Added resident_transaction table creation scripts with comments. +----------------------------------------------------------------------------------------------------- +\c mosip_resident sysadmin + +DROP INDEX IF EXISTS idx_resident_transaction_event_id; +DROP INDEX IF EXISTS idx_resident_transaction_token_id; +DROP INDEX IF EXISTS idx_resident_transaction_credential_request_id; +DROP INDEX IF EXISTS idx_resident_transaction_request_dtimes; +DROP INDEX IF EXISTS idx_resident_transaction_request_trn_id; +DROP INDEX IF EXISTS idx_resident_transaction_ref_id; +DROP INDEX IF EXISTS idx_resident_user_actions_ida_token; +DROP INDEX IF EXISTS idx_resident_session_ida_token; +DROP INDEX IF EXISTS idx_resident_transaction_read_status; + +DROP TABLE IF EXISTS resident.otp_transaction; +DROP TABLE IF EXISTS resident.resident_transaction; +DROP TABLE IF EXISTS resident.resident_session; +DROP TABLE IF EXISTS resident.resident_user_actions; + +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_release.sql b/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_release.sql new file mode 100644 index 00000000000..ecb78f2646e --- /dev/null +++ b/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_release.sql @@ -0,0 +1,27 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : February-2024 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------------------- + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.otp_transaction +TO residentuser; + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.resident_grievance_ticket +TO residentuser; + +ALTER TABLE resident.resident_session alter column machine_type type varchar(100); +-- Adding index to ida_token column +CREATE INDEX idx_resident_user_actions_ida_token ON resident.resident_user_actions (ida_token); +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_revoke.sql b/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_revoke.sql new file mode 100644 index 00000000000..b3e388c16dd --- /dev/null +++ b/db_release_scripts/mosip_resident/sql/1.2.1_resident-scripts_revoke.sql @@ -0,0 +1,29 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : February-2024 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- +\c mosip_resident sysadmin + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.otp_transaction +TO residentuser; + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.resident_grievance_ticket +TO residentuser; + +ALTER TABLE resident.resident_session alter column machine_type type varchar(30); + +DROP INDEX IF EXISTS idx_resident_user_actions_ida_token; + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; + +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_scripts/mosip_resident/db.sql b/db_scripts/mosip_resident/db.sql new file mode 100644 index 00000000000..9c849ed435d --- /dev/null +++ b/db_scripts/mosip_resident/db.sql @@ -0,0 +1,28 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Creation of mosip_resident DB and resident schema. +----------------------------------------------------------------------------------------------------- +CREATE DATABASE mosip_resident + ENCODING = 'UTF8' + LC_COLLATE = 'en_US.UTF-8' + LC_CTYPE = 'en_US.UTF-8' + TABLESPACE = pg_default + OWNER = postgres + TEMPLATE = template0; + +COMMENT ON DATABASE mosip_resident IS 'Resident service database stores all the data related to transactions done in resident services'; + +\c mosip_resident + +DROP SCHEMA IF EXISTS resident CASCADE; +CREATE SCHEMA resident; +ALTER SCHEMA resident OWNER TO postgres; +ALTER DATABASE mosip_resident SET search_path TO resident,pg_catalog,public; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_scripts/mosip_resident/ddl.sql b/db_scripts/mosip_resident/ddl.sql new file mode 100644 index 00000000000..a9499aa37e9 --- /dev/null +++ b/db_scripts/mosip_resident/ddl.sql @@ -0,0 +1,21 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Creation of otp_transaction table. +-- April-2022 Kamesh Shekhar Prasad Creation of resident_transaction table. +----------------------------------------------------------------------------------------------------- + +\c mosip_resident + +\ir ddl/otp_transaction.sql +\ir ddl/resident_transaction.sql +\ir ddl/resident_grievance_ticket.sql +\ir ddl/resident_user_actions.sql +\ir ddl/resident_session.sql +----------------------------------------------------------------------------------------------------- diff --git a/db_scripts/mosip_resident/ddl/otp_transaction.sql b/db_scripts/mosip_resident/ddl/otp_transaction.sql new file mode 100644 index 00000000000..acd8789cb1b --- /dev/null +++ b/db_scripts/mosip_resident/ddl/otp_transaction.sql @@ -0,0 +1,50 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the OTP for the user whenever user requests for one using the email id / phone number to log into the application. +CREATE TABLE resident.otp_transaction( + id character varying(36) NOT NULL, + ref_id character varying(1024) NOT NULL, + otp_hash character varying(512) NOT NULL, + generated_dtimes timestamp, + expiry_dtimes timestamp, + validation_retry_count smallint, + status_code character varying(36), + lang_code character varying(3), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean, + del_dtimes timestamp, + CONSTRAINT pk_otpt_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.otp_transaction IS 'All OTP related data and validation details are maintained here for Pre Registration module.'; +COMMENT ON COLUMN resident.otp_transaction.id IS 'OTP id is a unique identifier (UUID) used as an unique key to identify the OTP transaction'; +COMMENT ON COLUMN resident.otp_transaction.ref_id IS 'Reference ID is a reference information received from OTP requester which can be used while validating the OTP. AM: please give examples of ref_id'; +COMMENT ON COLUMN resident.otp_transaction.otp_hash IS 'Hash of id, ref_id and otp which is generated based on the configuration setup and sent to the requester application / module.'; +COMMENT ON COLUMN resident.otp_transaction.generated_dtimes IS 'Date and Time when the OTP was generated'; +COMMENT ON COLUMN resident.otp_transaction.expiry_dtimes IS 'Date Time when the OTP will be expired'; +COMMENT ON COLUMN resident.otp_transaction.validation_retry_count IS 'Validation retry counts of this OTP request. If the validation retry crosses the threshold limit, then the OTP will be de-activated.'; +COMMENT ON COLUMN resident.otp_transaction.status_code IS 'Current status of the transaction. Refers to code field of master.status_list table.'; +COMMENT ON COLUMN resident.otp_transaction.lang_code IS 'For multilanguage implementation this attribute Refers master.language.code. The value of some of the attributes in current record is stored in this respective language.'; +COMMENT ON COLUMN resident.otp_transaction.cr_by IS 'ID or name of the user who create / insert record.'; +COMMENT ON COLUMN resident.otp_transaction.cr_dtimes IS 'Date and Timestamp when the record is created/inserted'; +COMMENT ON COLUMN resident.otp_transaction.upd_by IS 'ID or name of the user who update the record with new values'; +COMMENT ON COLUMN resident.otp_transaction.upd_dtimes IS 'Date and Timestamp when any of the fields in the record is updated with new values.'; +COMMENT ON COLUMN resident.otp_transaction.is_deleted IS 'Flag to mark whether the record is Soft deleted.'; +COMMENT ON COLUMN resident.otp_transaction.del_dtimes IS 'Date and Timestamp when the record is soft deleted with is_deleted=TRUE'; +----------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.otp_transaction + TO residentuser; \ No newline at end of file diff --git a/db_scripts/mosip_resident/ddl/resident_grievance_ticket.sql b/db_scripts/mosip_resident/ddl/resident_grievance_ticket.sql new file mode 100644 index 00000000000..5cf2f8ffe62 --- /dev/null +++ b/db_scripts/mosip_resident/ddl/resident_grievance_ticket.sql @@ -0,0 +1,53 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: resident_grievance_ticket +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : December-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the resident_grievance_ticket table values. +CREATE TABLE resident.resident_grievance_ticket( + id VARCHAR(64) NOT NULL, + eventId VARCHAR(64) NOT NULL, + name VARCHAR(256) NOT NULL, + emailId VARCHAR(128), + alternateEmailId VARCHAR(128), + phoneNo VARCHAR(64), + alternatePhoneNo VARCHAR(64), + message character varying(1024) NOT NULL, + hasAttachment boolean NOT NULL DEFAULT false, + status character varying(64) NOT NULL, + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + CONSTRAINT pk_resgrev_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.resident_grievance_ticket IS 'This Table is used to save the resident_grievance_ticket table values.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.id IS 'Unique Id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.eventId IS 'Unique event id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.emailId IS 'Unique email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternateEmailId IS 'Alternate email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.phoneNo IS 'Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternatePhoneNo IS 'Alternate Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.message IS 'Message.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.status IS 'status.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_by IS 'created by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_dtimes IS 'created date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_by IS 'updated by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_dtimes IS 'updated date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.is_deleted IS 'is deleted.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.del_dtimes IS 'Deleted time-stamp.'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_grievance_ticket + TO residentuser; \ No newline at end of file diff --git a/db_scripts/mosip_resident/ddl/resident_session.sql b/db_scripts/mosip_resident/ddl/resident_session.sql new file mode 100644 index 00000000000..ae7a75d9269 --- /dev/null +++ b/db_scripts/mosip_resident/ddl/resident_session.sql @@ -0,0 +1,37 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Loganathan Sekar +-- Created Date : Jan-2023 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_session( + session_id character varying(128) NOT NULL, + ida_token character varying(128) NOT NULL, + login_dtimes timestamp, + ip_address character varying(128), + host character varying(128), + machine_type character varying(100), + CONSTRAINT pk_session_id PRIMARY KEY (session_id) +); + +COMMENT ON TABLE resident.resident_session IS 'This Table is used to save the user sessions.'; +COMMENT ON COLUMN resident.resident_session.session_id IS 'The unique session identifier for each login'; +COMMENT ON COLUMN resident.resident_session.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_session.login_dtimes IS 'The time when the user last logged in'; +COMMENT ON COLUMN resident.resident_session.ip_address IS 'The ip_address of device from which the user logged in'; +COMMENT ON COLUMN resident.resident_session.host IS 'The host of the site'; +COMMENT ON COLUMN resident.resident_session.machine_type IS 'The OS of device used for accessing the portal/app'; + +-- Adding index to ida_token column +CREATE INDEX idx_resident_session_ida_token ON resident.resident_session (ida_token); +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_session + TO residentuser; \ No newline at end of file diff --git a/db_scripts/mosip_resident/ddl/resident_transaction.sql b/db_scripts/mosip_resident/ddl/resident_transaction.sql new file mode 100644 index 00000000000..5b87875eea6 --- /dev/null +++ b/db_scripts/mosip_resident/ddl/resident_transaction.sql @@ -0,0 +1,112 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the transaction related to residents. +CREATE TABLE resident.resident_transaction( + event_id VARCHAR(64) NOT NULL, + request_trn_id character varying(64) , + request_dtimes timestamp NOT NULL, + response_dtime timestamp NOT NULL, + request_type_code character varying(128) NOT NULL, + request_summary character varying(1024) NOT NULL, + status_code character varying(36) NOT NULL, + status_comment character varying(1024), + lang_code character varying(3), + ref_id_type character varying(36), + ref_id character varying(64), + token_id character varying(128) NOT NULL, + requested_entity_type character varying(64), + requested_entity_id character varying(36), + requested_entity_name character varying(128), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + auth_type_code character varying(128), + static_tkn_id character varying(64), + request_signature character varying, + response_signature character varying, + olv_partner_id character varying(36), + aid character varying(64), + reference_link character varying(1024), + read_status boolean NOT NULL DEFAULT false, + pinned_status boolean NOT NULL DEFAULT false, + purpose character varying(1024), + credential_request_id character varying(256), + attribute_list character varying(255), + individual_id character varying(1024), + consent character varying(50), + tracking_id character varying(50), + CONSTRAINT pk_restrn_event_id PRIMARY KEY (event_id) +); + +COMMENT ON TABLE resident.resident_transaction IS 'This Table is used to save the transaction related to residents.'; +COMMENT ON COLUMN resident.resident_transaction.event_id IS 'Unique Id of the transaction.'; +COMMENT ON COLUMN resident.resident_transaction.aid IS 'The Application ID'; +COMMENT ON COLUMN resident.resident_transaction.request_dtimes IS 'The time when the request is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.response_dtime IS 'The time when the response is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.request_trn_id IS 'The unique identifier for each transaction'; +COMMENT ON COLUMN resident.resident_transaction.request_type_code IS 'The type of request'; +COMMENT ON COLUMN resident.resident_transaction.request_summary IS 'The summary of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_code IS 'The current status of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_comment IS 'The comment for the status of the request'; +COMMENT ON COLUMN resident.resident_transaction.lang_code IS 'The language code for the request for multi-language support'; +COMMENT ON COLUMN resident.resident_transaction.ref_id_type IS 'The type of reference id'; +COMMENT ON COLUMN resident.resident_transaction.ref_id IS 'The reference id'; +COMMENT ON COLUMN resident.resident_transaction.token_id IS 'The token id'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_type IS 'The type of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_id IS 'The id of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_name IS 'The name of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.cr_by IS 'The user who created the record'; +COMMENT ON COLUMN resident.resident_transaction.cr_dtimes IS 'The time when the record is created'; +COMMENT ON COLUMN resident.resident_transaction.upd_by IS 'The user who updated the record'; +COMMENT ON COLUMN resident.resident_transaction.upd_dtimes IS 'The time when the record is updated'; +COMMENT ON COLUMN resident.resident_transaction.is_deleted IS 'The flag to identify if the record is deleted or not'; +COMMENT ON COLUMN resident.resident_transaction.del_dtimes IS 'The time when the record is deleted'; +COMMENT ON COLUMN resident.resident_transaction.auth_type_code IS 'The type of the authentication'; +COMMENT ON COLUMN resident.resident_transaction.static_tkn_id IS 'The static token id'; +COMMENT ON COLUMN resident.resident_transaction.request_signature IS 'The signature of the request'; +COMMENT ON COLUMN resident.resident_transaction.response_signature IS 'The signature of the response'; +COMMENT ON COLUMN resident.resident_transaction.olv_partner_id IS 'The partner id'; +COMMENT ON COLUMN resident.resident_transaction.reference_link IS 'The reference link'; +COMMENT ON COLUMN resident.resident_transaction.read_status IS 'The flag to identify if the request is read or not'; +COMMENT ON COLUMN resident.resident_transaction.pinned_status IS 'The flag to identify if the request is pinned or not'; +COMMENT ON COLUMN resident.resident_transaction.purpose IS 'The purpose of the request'; +COMMENT ON COLUMN resident.resident_transaction.credential_request_id IS 'The credential request id'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Adding index to event_id column +CREATE INDEX idx_resident_transaction_event_id ON resident.resident_transaction (event_id); + +-- Adding index to token_id column +CREATE INDEX idx_resident_transaction_token_id ON resident.resident_transaction (token_id); + +-- Adding index to credential_request_id column +CREATE INDEX idx_resident_transaction_credential_request_id ON resident.resident_transaction (credential_request_id); + +-- Adding index to request_dtimes column +CREATE INDEX idx_resident_transaction_request_dtimes ON resident.resident_transaction (request_dtimes); + +-- Adding index to request_trn_id column +CREATE INDEX idx_resident_transaction_request_trn_id ON resident.resident_transaction (request_trn_id); + +-- Adding index to ref_id column +CREATE INDEX idx_resident_transaction_ref_id ON resident.resident_transaction (ref_id); + +--Adding index to read_status column +CREATE INDEX idx_resident_transaction_read_status ON resident.resident_transaction (read_status); + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_transaction + TO residentuser; \ No newline at end of file diff --git a/db_scripts/mosip_resident/ddl/resident_user_actions.sql b/db_scripts/mosip_resident/ddl/resident_user_actions.sql new file mode 100644 index 00000000000..7b7c5ee126b --- /dev/null +++ b/db_scripts/mosip_resident/ddl/resident_user_actions.sql @@ -0,0 +1,30 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : Aug-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_user_actions( + ida_token character varying(128) NOT NULL, + last_bell_notif_click_dtimes timestamp, + CONSTRAINT pk_ida_token PRIMARY KEY (ida_token) +); + +COMMENT ON TABLE resident.resident_user_actions IS 'This Table is used to save the user actions'; +COMMENT ON COLUMN resident.resident_user_actions.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_user_actions.last_bell_notif_click_dtimes IS 'The time when the user last clicked on the bell notification'; + +-- Adding index to ida_token column +CREATE INDEX idx_resident_user_actions_ida_token ON resident.resident_user_actions (ida_token); + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; \ No newline at end of file diff --git a/db_scripts/mosip_resident/deploy.properties b/db_scripts/mosip_resident/deploy.properties new file mode 100644 index 00000000000..53c05a855df --- /dev/null +++ b/db_scripts/mosip_resident/deploy.properties @@ -0,0 +1,6 @@ +DB_SERVERIP=api-internal.sandbox.mosip.net +DB_PORT=5432 +SU_USER=postgres +DEFAULT_DB_NAME=postgres +MOSIP_DB_NAME=mosip_resident +DML_FLAG=0 diff --git a/db_scripts/mosip_resident/deploy.sh b/db_scripts/mosip_resident/deploy.sh new file mode 100644 index 00000000000..a671f7e377f --- /dev/null +++ b/db_scripts/mosip_resident/deploy.sh @@ -0,0 +1,46 @@ + +## Properties file +set -e +properties_file="$1" +echo `date "+%m/%d/%Y %H:%M:%S"` ": $properties_file" +if [ -f "$properties_file" ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file \"$properties_file\" found." + while IFS='=' read -r key value + do + key=$(echo $key | tr '.' '_') + eval ${key}=\${value} + done < "$properties_file" +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file not found, Pass property file name as argument." +fi + +## Terminate existing connections +echo "Terminating active connections" +CONN=$(PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "SELECT count(pg_terminate_backend(pg_stat_activity.pid)) FROM pg_stat_activity WHERE datname = '$MOSIP_DB_NAME' AND pid <> pg_backend_pid()";exit;) +echo "Terminated connections" + +## Drop db and role +echo "Dropping DB" +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f drop_db.sql +echo "Dropping user" +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f drop_role.sql + +## Create users +echo `date "+%m/%d/%Y %H:%M:%S"` ": Creating database users" +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f role_dbuser.sql -v dbuserpwd=\'$DBUSER_PWD\' + +## Create DB +echo "Creating DB" +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f db.sql +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f ddl.sql + +## Grants +PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -f grants.sql + +## Populate tables +if [ ${DML_FLAG} == 1 ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Deploying DML for ${MOSIP_DB_NAME} database" + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f dml.sql +fi diff --git a/db_scripts/mosip_resident/drop_db.sql b/db_scripts/mosip_resident/drop_db.sql new file mode 100644 index 00000000000..c7722bbbfa5 --- /dev/null +++ b/db_scripts/mosip_resident/drop_db.sql @@ -0,0 +1,13 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP drop mosip_resident db scripts added. +----------------------------------------------------------------------------------------------------- +DROP DATABASE IF EXISTS mosip_resident; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_scripts/mosip_resident/drop_role.sql b/db_scripts/mosip_resident/drop_role.sql new file mode 100644 index 00000000000..81a3172dec5 --- /dev/null +++ b/db_scripts/mosip_resident/drop_role.sql @@ -0,0 +1,13 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP drop residentuser role scripts added. +----------------------------------------------------------------------------------------------------- +drop role if exists residentuser; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_scripts/mosip_resident/grants.sql b/db_scripts/mosip_resident/grants.sql new file mode 100644 index 00000000000..7f7c15c6bbd --- /dev/null +++ b/db_scripts/mosip_resident/grants.sql @@ -0,0 +1,28 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Granting usage access to residentuser scripts added. +----------------------------------------------------------------------------------------------------- +\c mosip_resident + +GRANT CONNECT + ON DATABASE mosip_resident + TO residentuser; + +GRANT USAGE + ON SCHEMA resident + TO residentuser; + +GRANT SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES + ON ALL TABLES IN SCHEMA resident + TO residentuser; + +ALTER DEFAULT PRIVILEGES IN SCHEMA resident + GRANT SELECT,INSERT,UPDATE,DELETE,REFERENCES ON TABLES TO residentuser; +----------------------------------------------------------------------------------------------------- diff --git a/db_scripts/mosip_resident/role_dbuser.sql b/db_scripts/mosip_resident/role_dbuser.sql new file mode 100644 index 00000000000..bb18a13faff --- /dev/null +++ b/db_scripts/mosip_resident/role_dbuser.sql @@ -0,0 +1,16 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP create residentuser role scripts added. +----------------------------------------------------------------------------------------------------- +CREATE ROLE residentuser WITH + INHERIT + LOGIN + PASSWORD :dbuserpwd; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/ddl/otp_transaction.sql b/db_upgrade_scripts/mosip_resident/ddl/otp_transaction.sql new file mode 100644 index 00000000000..c3e0d719829 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/ddl/otp_transaction.sql @@ -0,0 +1,47 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the OTP for the user whenever user requests for one using the email id / phone number to log into the application. +CREATE TABLE resident.otp_transaction( + id character varying(36) NOT NULL, + ref_id character varying(1024) NOT NULL, + otp_hash character varying(512) NOT NULL, + generated_dtimes timestamp, + expiry_dtimes timestamp, + validation_retry_count smallint, + status_code character varying(36), + lang_code character varying(3), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean, + del_dtimes timestamp, + CONSTRAINT pk_otpt_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.otp_transaction IS 'All OTP related data and validation details are maintained here for Pre Registration module.'; +COMMENT ON COLUMN resident.otp_transaction.id IS 'OTP id is a unique identifier (UUID) used as an unique key to identify the OTP transaction'; +COMMENT ON COLUMN resident.otp_transaction.ref_id IS 'Reference ID is a reference information received from OTP requester which can be used while validating the OTP. AM: please give examples of ref_id'; +COMMENT ON COLUMN resident.otp_transaction.otp_hash IS 'Hash of id, ref_id and otp which is generated based on the configuration setup and sent to the requester application / module.'; +COMMENT ON COLUMN resident.otp_transaction.generated_dtimes IS 'Date and Time when the OTP was generated'; +COMMENT ON COLUMN resident.otp_transaction.expiry_dtimes IS 'Date Time when the OTP will be expired'; +COMMENT ON COLUMN resident.otp_transaction.validation_retry_count IS 'Validation retry counts of this OTP request. If the validation retry crosses the threshold limit, then the OTP will be de-activated.'; +COMMENT ON COLUMN resident.otp_transaction.status_code IS 'Current status of the transaction. Refers to code field of master.status_list table.'; +COMMENT ON COLUMN resident.otp_transaction.lang_code IS 'For multilanguage implementation this attribute Refers master.language.code. The value of some of the attributes in current record is stored in this respective language.'; +COMMENT ON COLUMN resident.otp_transaction.cr_by IS 'ID or name of the user who create / insert record.'; +COMMENT ON COLUMN resident.otp_transaction.cr_dtimes IS 'Date and Timestamp when the record is created/inserted'; +COMMENT ON COLUMN resident.otp_transaction.upd_by IS 'ID or name of the user who update the record with new values'; +COMMENT ON COLUMN resident.otp_transaction.upd_dtimes IS 'Date and Timestamp when any of the fields in the record is updated with new values.'; +COMMENT ON COLUMN resident.otp_transaction.is_deleted IS 'Flag to mark whether the record is Soft deleted.'; +COMMENT ON COLUMN resident.otp_transaction.del_dtimes IS 'Date and Timestamp when the record is soft deleted with is_deleted=TRUE'; +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/ddl/resident_grievance_ticket.sql b/db_upgrade_scripts/mosip_resident/ddl/resident_grievance_ticket.sql new file mode 100644 index 00000000000..614fe8bc699 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/ddl/resident_grievance_ticket.sql @@ -0,0 +1,50 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: resident_grievance_ticket +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : December-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the resident_grievance_ticket table values. +CREATE TABLE resident.resident_grievance_ticket( + id VARCHAR(64) NOT NULL, + eventId VARCHAR(64) NOT NULL, + name VARCHAR(256) NOT NULL, + emailId VARCHAR(128), + alternateEmailId VARCHAR(128), + phoneNo VARCHAR(64), + alternatePhoneNo VARCHAR(64), + message character varying(1024) NOT NULL, + hasAttachment boolean NOT NULL DEFAULT false, + status character varying(64) NOT NULL, + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + CONSTRAINT pk_resgrev_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.resident_grievance_ticket IS 'This Table is used to save the resident_grievance_ticket table values.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.id IS 'Unique Id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.eventId IS 'Unique event id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.emailId IS 'Unique email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternateEmailId IS 'Alternate email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.phoneNo IS 'Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.altrenatePhoneNo IS 'Alternate Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.message IS 'Message.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.status IS 'status.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_by IS 'created by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_dtimes IS 'created date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_by IS 'updated by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_dtimes IS 'updated date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.is_deleted IS 'is deleted.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.del_dtimes IS 'Deleted time-stamp.'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/db_upgrade_scripts/mosip_resident/ddl/resident_session.sql b/db_upgrade_scripts/mosip_resident/ddl/resident_session.sql new file mode 100644 index 00000000000..ffc89dd3d29 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/ddl/resident_session.sql @@ -0,0 +1,31 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Loganathan Sekar +-- Created Date : Jan-2023 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_session( + session_id character varying(128) NOT NULL, + ida_token character varying(128) NOT NULL, + login_dtimes timestamp, + ip_address character varying(128), + host character varying(128), + machine_type character varying(30), + CONSTRAINT pk_session_id PRIMARY KEY (session_id) +); + +COMMENT ON TABLE resident_session IS 'This Table is used to save the user sessions.'; +COMMENT ON COLUMN resident_session.session_id IS 'The unique session identifier for each login'; +COMMENT ON COLUMN resident_session.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident_session.login_dtimes IS 'The time when the user last logged in'; +COMMENT ON COLUMN resident_session.ip_address IS 'The ip_address of device from which the user logged in'; +COMMENT ON COLUMN resident_session.host IS 'The host of the site'; +COMMENT ON COLUMN resident_session.machine_type IS 'The OS of device used for accessing the portal/app'; diff --git a/db_upgrade_scripts/mosip_resident/ddl/resident_transaction.sql b/db_upgrade_scripts/mosip_resident/ddl/resident_transaction.sql new file mode 100644 index 00000000000..6438ea04a34 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/ddl/resident_transaction.sql @@ -0,0 +1,88 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the transaction related to residents. +CREATE TABLE resident.resident_transaction( + event_id VARCHAR(64) NOT NULL, + request_trn_id character varying(64) , + request_dtimes timestamp NOT NULL, + response_dtime timestamp NOT NULL, + request_type_code character varying(128) NOT NULL, + request_summary character varying(1024) NOT NULL, + status_code character varying(36) NOT NULL, + status_comment character varying(1024), + lang_code character varying(3), + ref_id_type character varying(36), + ref_id character varying(64), + token_id character varying(128) NOT NULL, + requested_entity_type character varying(64), + requested_entity_id character varying(36), + requested_entity_name character varying(128), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + auth_type_code character varying(128), + static_tkn_id character varying(64), + request_signature character varying, + response_signature character varying, + olv_partner_id character varying(36), + aid character varying(64), + reference_link character varying(1024), + read_status boolean NOT NULL DEFAULT false, + pinned_status boolean NOT NULL DEFAULT false, + purpose character varying(1024), + credential_request_id character varying(256), + attribute_list character varying(255), + individual_id character varying(1024), + consent character varying(50), + tracking_id character varying(50), + CONSTRAINT pk_restrn_event_id PRIMARY KEY (event_id) +); + +COMMENT ON TABLE resident_transaction IS 'This Table is used to save the transaction related to residents.'; +COMMENT ON COLUMN resident_transaction.event_id IS 'Unique Id of the transaction.'; +COMMENT ON COLUMN resident.resident_transaction.aid IS 'The Application ID'; +COMMENT ON COLUMN resident.resident_transaction.request_dtimes IS 'The time when the request is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.response_dtime IS 'The time when the response is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.request_trn_id IS 'The unique identifier for each transaction'; +COMMENT ON COLUMN resident.resident_transaction.request_type_code IS 'The type of request'; +COMMENT ON COLUMN resident.resident_transaction.request_summary IS 'The summary of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_code IS 'The current status of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_comment IS 'The comment for the status of the request'; +COMMENT ON COLUMN resident.resident_transaction.lang_code IS 'The language code for the request for multi-language support'; +COMMENT ON COLUMN resident.resident_transaction.ref_id_type IS 'The type of reference id'; +COMMENT ON COLUMN resident.resident_transaction.ref_id IS 'The reference id'; +COMMENT ON COLUMN resident.resident_transaction.token_id IS 'The token id'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_type IS 'The type of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_id IS 'The id of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_name IS 'The name of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.cr_by IS 'The user who created the record'; +COMMENT ON COLUMN resident.resident_transaction.cr_dtimes IS 'The time when the record is created'; +COMMENT ON COLUMN resident.resident_transaction.upd_by IS 'The user who updated the record'; +COMMENT ON COLUMN resident.resident_transaction.upd_dtimes IS 'The time when the record is updated'; +COMMENT ON COLUMN resident.resident_transaction.is_deleted IS 'The flag to identify if the record is deleted or not'; +COMMENT ON COLUMN resident.resident_transaction.del_dtimes IS 'The time when the record is deleted'; +COMMENT ON COLUMN resident.resident_transaction.auth_type_code IS 'The type of the authentication'; +COMMENT ON COLUMN resident.resident_transaction.static_tkn_id IS 'The static token id'; +COMMENT ON COLUMN resident.resident_transaction.request_signature IS 'The signature of the request'; +COMMENT ON COLUMN resident.resident_transaction.response_signature IS 'The signature of the response'; +COMMENT ON COLUMN resident.resident_transaction.olv_partner_id IS 'The partner id'; +COMMENT ON COLUMN resident.resident_transaction.reference_link IS 'The reference link'; +COMMENT ON COLUMN resident.resident_transaction.read_status IS 'The flag to identify if the request is read or not'; +COMMENT ON COLUMN resident.resident_transaction.pinned_status IS 'The flag to identify if the request is pinned or not'; +COMMENT ON COLUMN resident.resident_transaction.purpose IS 'The purpose of the request'; +COMMENT ON COLUMN resident.resident_transaction.credential_request_id IS 'The credential request id'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/db_upgrade_scripts/mosip_resident/ddl/resident_user_actions.sql b/db_upgrade_scripts/mosip_resident/ddl/resident_user_actions.sql new file mode 100644 index 00000000000..47cdebf06a0 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/ddl/resident_user_actions.sql @@ -0,0 +1,23 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Kamesh Shekhar Prasad +-- Created Date : Aug-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- +----------------------------------------------------------------------------------------------------- + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_user_actions( + ida_token character varying(128) NOT NULL, + last_bell_notif_click_dtimes timestamp, + CONSTRAINT pk_ida_token PRIMARY KEY (ida_token) +); + +COMMENT ON TABLE resident_user_actions IS 'This Table is used to save the user actions'; +COMMENT ON COLUMN resident_user_actions.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident_user_actions.last_bell_notif_click_dtimes IS 'The time when the user last clicked on the bell notification'; diff --git a/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_rollback.sql new file mode 100644 index 00000000000..4f4a27f976b --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_rollback.sql @@ -0,0 +1,20 @@ +-- ------------------------------------------------------------------------------------------------- +-- Database Name: mosip_resident +-- Release Version : 1.2.1 +-- Purpose : Database scripts for Resident Service DB. +-- Create By : Manoj SP +-- Created Date : April-2022 +-- +-- Modified Date Modified By Comments / Remarks +-- -------------------------------------------------------------------------------------------------- +-- April-2022 Manoj SP Added otp_transaction table creation scripts with comments. +-- April-2022 Kamesh Shekhar Prasad Added resident_transaction table creation scripts with comments. +----------------------------------------------------------------------------------------------------- +\c mosip_resident + +DROP TABLE IF EXISTS resident.otp_transaction; +DROP TABLE IF EXISTS resident.resident_transaction; +DROP TABLE IF EXISTS resident.resident_session; +DROP TABLE IF EXISTS resident.resident_user_actions; + +----------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_upgrade.sql new file mode 100644 index 00000000000..2685aed5031 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.1.5.5_to_1.2.0.1-B1_upgrade.sql @@ -0,0 +1,234 @@ +CREATE DATABASE mosip_resident + ENCODING = 'UTF8' + LC_COLLATE = 'en_US.UTF-8' + LC_CTYPE = 'en_US.UTF-8' + TABLESPACE = pg_default + OWNER = postgres + TEMPLATE = template0; + +COMMENT ON DATABASE mosip_resident IS 'Resident service database stores all the data related to transactions done in resident services'; + +\c mosip_resident + +DROP SCHEMA IF EXISTS resident CASCADE; +CREATE SCHEMA resident; +ALTER SCHEMA resident OWNER TO postgres; +ALTER DATABASE mosip_resident SET search_path TO resident,pg_catalog,public; + +CREATE ROLE residentuser WITH + INHERIT + LOGIN + PASSWORD 'dbuserpwd'; + +GRANT CONNECT + ON DATABASE mosip_resident + TO residentuser; + +GRANT USAGE + ON SCHEMA resident + TO residentuser; + +GRANT SELECT,INSERT,UPDATE,DELETE,REFERENCES + ON ALL TABLES IN SCHEMA resident + TO residentuser; + +-- This Table is used to save the OTP for the user whenever user requests for one using the email id / phone number to log into the application. +CREATE TABLE resident.otp_transaction( + id character varying(36) NOT NULL, + ref_id character varying(1024) NOT NULL, + otp_hash character varying(512) NOT NULL, + generated_dtimes timestamp, + expiry_dtimes timestamp, + validation_retry_count smallint, + status_code character varying(36), + lang_code character varying(3), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean, + del_dtimes timestamp, + CONSTRAINT pk_otpt_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.otp_transaction IS 'All OTP related data and validation details are maintained here for Pre Registration module.'; +COMMENT ON COLUMN resident.otp_transaction.id IS 'OTP id is a unique identifier (UUID) used as an unique key to identify the OTP transaction'; +COMMENT ON COLUMN resident.otp_transaction.ref_id IS 'Reference ID is a reference information received from OTP requester which can be used while validating the OTP. AM: please give examples of ref_id'; +COMMENT ON COLUMN resident.otp_transaction.otp_hash IS 'Hash of id, ref_id and otp which is generated based on the configuration setup and sent to the requester application / module.'; +COMMENT ON COLUMN resident.otp_transaction.generated_dtimes IS 'Date and Time when the OTP was generated'; +COMMENT ON COLUMN resident.otp_transaction.expiry_dtimes IS 'Date Time when the OTP will be expired'; +COMMENT ON COLUMN resident.otp_transaction.validation_retry_count IS 'Validation retry counts of this OTP request. If the validation retry crosses the threshold limit, then the OTP will be de-activated.'; +COMMENT ON COLUMN resident.otp_transaction.status_code IS 'Current status of the transaction. Refers to code field of master.status_list table.'; +COMMENT ON COLUMN resident.otp_transaction.lang_code IS 'For multilanguage implementation this attribute Refers master.language.code. The value of some of the attributes in current record is stored in this respective language.'; +COMMENT ON COLUMN resident.otp_transaction.cr_by IS 'ID or name of the user who create / insert record.'; +COMMENT ON COLUMN resident.otp_transaction.cr_dtimes IS 'Date and Timestamp when the record is created/inserted'; +COMMENT ON COLUMN resident.otp_transaction.upd_by IS 'ID or name of the user who update the record with new values'; +COMMENT ON COLUMN resident.otp_transaction.upd_dtimes IS 'Date and Timestamp when any of the fields in the record is updated with new values.'; +COMMENT ON COLUMN resident.otp_transaction.is_deleted IS 'Flag to mark whether the record is Soft deleted.'; +COMMENT ON COLUMN resident.otp_transaction.del_dtimes IS 'Date and Timestamp when the record is soft deleted with is_deleted=TRUE'; +----------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, TRUNCATE, REFERENCES, UPDATE, DELETE + ON resident.otp_transaction + TO residentuser; + +-- This Table is used to save the resident_grievance_ticket table values. +CREATE TABLE resident.resident_grievance_ticket( + id VARCHAR(64) NOT NULL, + eventId VARCHAR(64) NOT NULL, + name VARCHAR(256) NOT NULL, + emailId VARCHAR(128), + alternateEmailId VARCHAR(128), + phoneNo VARCHAR(64), + alternatePhoneNo VARCHAR(64), + message character varying(1024) NOT NULL, + hasAttachment boolean NOT NULL DEFAULT false, + status character varying(64) NOT NULL, + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + CONSTRAINT pk_resgrev_id PRIMARY KEY (id) +); + +COMMENT ON TABLE resident.resident_grievance_ticket IS 'This Table is used to save the resident_grievance_ticket table values.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.id IS 'Unique Id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.eventId IS 'Unique event id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.emailId IS 'Unique email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternateEmailId IS 'Alternate email id.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.phoneNo IS 'Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.alternatePhoneNo IS 'Alternate Phone number.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.message IS 'Message.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.status IS 'status.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_by IS 'created by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.cr_dtimes IS 'created date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_by IS 'updated by.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.upd_dtimes IS 'updated date and time.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.is_deleted IS 'is deleted.'; +COMMENT ON COLUMN resident.resident_grievance_ticket.del_dtimes IS 'Deleted time-stamp.'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, TRUNCATE, REFERENCES, UPDATE, DELETE + ON resident.resident_grievance_ticket + TO residentuser; + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_session( + session_id character varying(128) NOT NULL, + ida_token character varying(128) NOT NULL, + login_dtimes timestamp, + ip_address character varying(128), + host character varying(128), + machine_type character varying(30), + CONSTRAINT pk_session_id PRIMARY KEY (session_id) +); + +COMMENT ON TABLE resident.resident_session IS 'This Table is used to save the user sessions.'; +COMMENT ON COLUMN resident.resident_session.session_id IS 'The unique session identifier for each login'; +COMMENT ON COLUMN resident.resident_session.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_session.login_dtimes IS 'The time when the user last logged in'; +COMMENT ON COLUMN resident.resident_session.ip_address IS 'The ip_address of device from which the user logged in'; +COMMENT ON COLUMN resident.resident_session.host IS 'The host of the site'; +COMMENT ON COLUMN resident.resident_session.machine_type IS 'The OS of device used for accessing the portal/app'; + +GRANT SELECT, INSERT, TRUNCATE, REFERENCES, UPDATE, DELETE + ON resident.resident_session + TO residentuser; + +-- This Table is used to save the transaction related to residents. +CREATE TABLE resident.resident_transaction( + event_id VARCHAR(64) NOT NULL, + request_trn_id character varying(64) , + request_dtimes timestamp NOT NULL, + response_dtime timestamp NOT NULL, + request_type_code character varying(128) NOT NULL, + request_summary character varying(1024) NOT NULL, + status_code character varying(36) NOT NULL, + status_comment character varying(1024), + lang_code character varying(3), + ref_id_type character varying(36), + ref_id character varying(64), + token_id character varying(128) NOT NULL, + requested_entity_type character varying(64), + requested_entity_id character varying(36), + requested_entity_name character varying(128), + cr_by character varying(256) NOT NULL, + cr_dtimes timestamp NOT NULL, + upd_by character varying(256), + upd_dtimes timestamp, + is_deleted boolean NOT NULL DEFAULT false, + del_dtimes timestamp, + auth_type_code character varying(128), + static_tkn_id character varying(64), + request_signature character varying, + response_signature character varying, + olv_partner_id character varying(36), + aid character varying(64), + reference_link character varying(1024), + read_status boolean NOT NULL DEFAULT false, + pinned_status boolean NOT NULL DEFAULT false, + purpose character varying(1024), + credential_request_id character varying(256), + attribute_list character varying(255), + individual_id character varying(1024), + consent character varying(50), + tracking_id character varying(50), + CONSTRAINT pk_restrn_event_id PRIMARY KEY (event_id) +); + +COMMENT ON TABLE resident.resident_transaction IS 'This Table is used to save the transaction related to residents.'; +COMMENT ON COLUMN resident.resident_transaction.event_id IS 'Unique Id of the transaction.'; +COMMENT ON COLUMN resident.resident_transaction.aid IS 'The Application ID'; +COMMENT ON COLUMN resident.resident_transaction.request_dtimes IS 'The time when the request is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.response_dtime IS 'The time when the response is received by the service'; +COMMENT ON COLUMN resident.resident_transaction.request_trn_id IS 'The unique identifier for each transaction'; +COMMENT ON COLUMN resident.resident_transaction.request_type_code IS 'The type of request'; +COMMENT ON COLUMN resident.resident_transaction.request_summary IS 'The summary of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_code IS 'The current status of the request'; +COMMENT ON COLUMN resident.resident_transaction.status_comment IS 'The comment for the status of the request'; +COMMENT ON COLUMN resident.resident_transaction.lang_code IS 'The language code for the request for multi-language support'; +COMMENT ON COLUMN resident.resident_transaction.ref_id_type IS 'The type of reference id'; +COMMENT ON COLUMN resident.resident_transaction.ref_id IS 'The reference id'; +COMMENT ON COLUMN resident.resident_transaction.token_id IS 'The token id'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_type IS 'The type of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_id IS 'The id of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.requested_entity_name IS 'The name of the requested entity'; +COMMENT ON COLUMN resident.resident_transaction.cr_by IS 'The user who created the record'; +COMMENT ON COLUMN resident.resident_transaction.cr_dtimes IS 'The time when the record is created'; +COMMENT ON COLUMN resident.resident_transaction.upd_by IS 'The user who updated the record'; +COMMENT ON COLUMN resident.resident_transaction.upd_dtimes IS 'The time when the record is updated'; +COMMENT ON COLUMN resident.resident_transaction.is_deleted IS 'The flag to identify if the record is deleted or not'; +COMMENT ON COLUMN resident.resident_transaction.del_dtimes IS 'The time when the record is deleted'; +COMMENT ON COLUMN resident.resident_transaction.auth_type_code IS 'The type of the authentication'; +COMMENT ON COLUMN resident.resident_transaction.static_tkn_id IS 'The static token id'; +COMMENT ON COLUMN resident.resident_transaction.request_signature IS 'The signature of the request'; +COMMENT ON COLUMN resident.resident_transaction.response_signature IS 'The signature of the response'; +COMMENT ON COLUMN resident.resident_transaction.olv_partner_id IS 'The partner id'; +COMMENT ON COLUMN resident.resident_transaction.reference_link IS 'The reference link'; +COMMENT ON COLUMN resident.resident_transaction.read_status IS 'The flag to identify if the request is read or not'; +COMMENT ON COLUMN resident.resident_transaction.pinned_status IS 'The flag to identify if the request is pinned or not'; +COMMENT ON COLUMN resident.resident_transaction.purpose IS 'The purpose of the request'; +COMMENT ON COLUMN resident.resident_transaction.credential_request_id IS 'The credential request id'; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +GRANT SELECT, INSERT, TRUNCATE, REFERENCES, UPDATE, DELETE + ON resident.resident_transaction + TO residentuser; + +-- This Table is used to save the user actions for the user actions table. + +CREATE TABLE resident.resident_user_actions( + ida_token character varying(128) NOT NULL, + last_bell_notif_click_dtimes timestamp, + CONSTRAINT pk_ida_token PRIMARY KEY (ida_token) +); + +COMMENT ON TABLE resident.resident_user_actions IS 'This Table is used to save the user actions'; +COMMENT ON COLUMN resident.resident_user_actions.ida_token IS 'The unique identifier for each user'; +COMMENT ON COLUMN resident.resident_user_actions.last_bell_notif_click_dtimes IS 'The time when the user last clicked on the bell notification'; + +GRANT SELECT, INSERT, TRUNCATE, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_rollback.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_rollback.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_upgrade.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B1_to_1.2.0.1-B2_upgrade.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_rollback.sql new file mode 100644 index 00000000000..5548b94e9cb --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_rollback.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_upgrade.sql new file mode 100644 index 00000000000..5548b94e9cb --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B2_to_1.2.0.1-B3_upgrade.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_rollback.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_rollback.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_upgrade.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1-B3_to_1.2.0.1_upgrade.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_rollback.sql new file mode 100644 index 00000000000..28577c2d4fa --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_rollback.sql @@ -0,0 +1,17 @@ +\c mosip_resident sysadmin + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.otp_transaction +TO residentuser; + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.resident_grievance_ticket +TO residentuser; + +ALTER TABLE resident.resident_session alter column machine_type type varchar(30); + +DROP INDEX IF EXISTS idx_resident_user_actions_ida_token; + +REVOKE SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_upgrade.sql new file mode 100644 index 00000000000..47735596ae3 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.0.1_to_1.2.1.0_upgrade.sql @@ -0,0 +1,16 @@ +\c mosip_resident + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.otp_transaction +TO residentuser; + +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE +ON resident.resident_grievance_ticket +TO residentuser; + +ALTER TABLE resident.resident_session alter column machine_type type varchar(100); +-- Adding index to ida_token column +CREATE INDEX idx_resident_user_actions_ida_token ON resident.resident_user_actions (ida_token); +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE + ON resident.resident_user_actions + TO residentuser; \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_rollback.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_rollback.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_upgrade.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.1.0_to_1.2.1.1_upgrade.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_rollback.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_rollback.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_rollback.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_upgrade.sql b/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_upgrade.sql new file mode 100644 index 00000000000..381e2be11c1 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/sql/1.2.1.1_to_1.2.1.2_upgrade.sql @@ -0,0 +1 @@ +\echo 'Upgrade Queries not required for transition from $CURRENT_VERSION to $UPGRADE_VERSION' \ No newline at end of file diff --git a/db_upgrade_scripts/mosip_resident/upgrade.properties b/db_upgrade_scripts/mosip_resident/upgrade.properties new file mode 100644 index 00000000000..0baa097cac5 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/upgrade.properties @@ -0,0 +1,17 @@ +MOSIP_DB_NAME= +ACTION=upgrade +MOSIP_DB_NAME=mosip_resident +DB_SERVERIP= +DB_PORT= +SU_USER=postgres +SU_USER_PWD= +SYS_ADMIN_USER= +SYS_ADMIN_PWD= +DEFAULT_DB_NAME=postgres +DBUSER_PWD= +CURRENT_VERSION= +TARGET_VERSION= +ACTION= +DB_USER_PWD= +CURRENT_VERSION= +UPGRADE_VERSION= diff --git a/db_upgrade_scripts/mosip_resident/upgrade.sh b/db_upgrade_scripts/mosip_resident/upgrade.sh new file mode 100644 index 00000000000..a5787b40105 --- /dev/null +++ b/db_upgrade_scripts/mosip_resident/upgrade.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +set -e +properties_file="$1" +echo `date "+%m/%d/%Y %H:%M:%S"` ": $properties_file" +if [ -f "$properties_file" ] +then + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file \"$properties_file\" found." + while IFS='=' read -r key value + do + key=$(echo $key | tr '.' '_') + eval ${key}=\${value} + done < "$properties_file" +else + echo `date "+%m/%d/%Y %H:%M:%S"` ": Property file not found, Pass property file name as argument." +fi + +echo "Current version: "$CURRENT_VERSION +echo "UPGRADE version: "$UPGRADE_VERSION +echo "Action: "$ACTION + +# Terminate existing connections +echo "Terminating active connections" +CONN=$(PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -t -c "SELECT count(pg_terminate_backend(pg_stat_activity.pid)) FROM pg_stat_activity WHERE datname = '$MOSIP_DB_NAME' AND pid <> pg_backend_pid()";exit;) +echo "Terminated connections" + +# Execute upgrade or rollback +if [ "$ACTION" == "upgrade" ]; then + echo "Upgrading database from $CURRENT_VERSION to $UPGRADE_VERSION" + UPGRADE_SCRIPT_FILE="sql/${CURRENT_VERSION}_to_${UPGRADE_VERSION}_upgrade.sql" + if [ -f "$UPGRADE_SCRIPT_FILE" ]; then + echo "Executing upgrade script $UPGRADE_SCRIPT_FILE" + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $UPGRADE_SCRIPT_FILE + else + echo "Upgrade script not found, exiting." + exit 1 + fi +elif [ $ACTION == "rollback" ]; then + echo "Rolling back database for $CURRENT_VERSION to $UPGRADE_VERSION" + REVOKE_SCRIPT_FILE="sql/${CURRENT_VERSION}_to_${UPGRADE_VERSION}_rollback.sql" + if [ -f "$REVOKE_SCRIPT_FILE" ]; then + echo "Executing rollback script $REVOKE_SCRIPT_FILE" + PGPASSWORD=$SU_USER_PWD psql -v ON_ERROR_STOP=1 --username=$SU_USER --host=$DB_SERVERIP --port=$DB_PORT --dbname=$DEFAULT_DB_NAME -a -b -f $REVOKE_SCRIPT_FILE + else + echo "rollback script not found, exiting." + exit 1 + fi +else + echo "Unknown action: $ACTION, must be 'upgrade' or 'rollback'." + exit 1 +fi \ No newline at end of file diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 00000000000..b951db8efca --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,51 @@ +# Resident Services + +## Deployment in K8 cluster with other MOSIP services: +### Pre-requisites +* Set KUBECONFIG variable to point to existing K8 cluster kubeconfig file: + ``` + export KUBECONFIG=~/.kube/ + ``` +### Install Resident Module + ``` + $ ./install.sh + ``` +### Delete + ``` + $ ./delete.sh + ``` +### Restart + ``` + $ ./restart.sh + ``` +### Install Keycloak client + ``` + cd deploy/keycloak + $ ./keycloak_init.sh + ``` + +### Install Apitestrig +``` + cd deploy/apitest-masterdata + $ ./install.sh +``` +Note: +* Script prompts for below mentioned inputs please provide as and when needed: + * Enter the time (hr) to run the cronjob every day (0–23): Specify the hour you want the cronjob to run (e.g., 6 for 6 AM) + * Do you have a public domain and valid SSL certificate? (Y/n): + * Y – If you have a public domain and valid SSL certificate + * n – If you do not have one (recommended only for development environments) + * Retention days to remove old reports (Default: 3): Press Enter to accept the default or specify another value (e.g., 5). + * Provide Slack Webhook URL to notify server issues on your Slack channel: (change the URL to your channel one) + ``` + https://hooks.slack.com/services/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 + ``` + * Is the eSignet service deployed? (yes/no): + * no – If eSignet is not deployed, related test cases will be skipped. + * Is values.yaml for the apitestrig chart set correctly as part of the prerequisites? (Y/n): + * Enter Y if this step is already completed. + * Do you have S3 details for storing API-Testrig reports? (Y/n): + * Enter Y to proceed with S3 configuration. + * S3 Host: eg. `http://minio.minio:9000` + * S3 Region:(Leave blank or enter your specific region, if applicable) + S3 Access Key:admin diff --git a/deploy/apitest-resident/LICENSE b/deploy/apitest-resident/LICENSE new file mode 100644 index 00000000000..a612ad9813b --- /dev/null +++ b/deploy/apitest-resident/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/deploy/apitest-resident/README.md b/deploy/apitest-resident/README.md new file mode 100644 index 00000000000..a5e277981d9 --- /dev/null +++ b/deploy/apitest-resident/README.md @@ -0,0 +1,44 @@ +# APITESTRIG + +## Introduction +ApiTestRig will test the working of APIs of the MOSIP modules. + +## Install +* Review `values.yaml` and, Make sure to enable required modules for apitestrig operation. +* Install +```sh +./install.sh +``` +* During the execution of the `install.sh` script, a prompt appears requesting information regarding the presence of a public domain and a valid SSL certificate on the server. +* If the server lacks a public domain and a valid SSL certificate, it is advisable to select the `n` option. Opting it will enable the `init-container` with an `emptyDir` volume and include it in the deployment process. +* The init-container will proceed to download the server's self-signed SSL certificate and mount it to the specified location within the container's Java keystore (i.e., `cacerts`) file. +* This particular functionality caters to scenarios where the script needs to be employed on a server utilizing self-signed SSL certificates. + +## Uninstall +* To uninstall ApiTestRig, run `delete.sh` script. +```sh +./delete.sh +``` + +## Run apitestrig manually + +#### Rancher UI +* Run apitestrig manually via Rancher UI. + ![apitestrig-2.png](../../docs/apitestrig-2.png) +* There are two modes of apitestrig `smoke` & `smokeAndRegression`. +* By default, apitestrig will execute with `smokeAndRegression`.
+ If you want to run apitestrig with only `smoke`.
+ You have to update the `apitestrig` configmap and rerun the specific apitestrig job. + +#### CLI +* Download Kubernetes cluster `kubeconfig` file from `rancher dashboard` to your local. + ![apitestrig-1.png](../../docs/apitestrig-1.png) +* Install `kubectl` package to your local machine. +* Run apitestrig manually via CLI by creating a new job from an existing k8s cronjob. + ``` + kubectl --kubeconfig= -n apitestrig create job --from=cronjob/ + ``` + example: + ``` + kubectl --kubeconfig=/home/xxx/Downloads/qa4.config -n apitestrig create job --from=cronjob/cronjob-apitestrig-masterdata cronjob-apitestrig-masterdata + ``` \ No newline at end of file diff --git a/deploy/apitest-resident/copy_cm_func.sh b/deploy/apitest-resident/copy_cm_func.sh new file mode 100755 index 00000000000..185ae3e5f4a --- /dev/null +++ b/deploy/apitest-resident/copy_cm_func.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copy configmap and secret from one namespace to another. +# ./copy_cm_func.sh [name] +# Parameters: +# resource: configmap|secret +# name: Optional new name of the configmap or secret in destination namespace. This may be needed if there is +# clash of names + +if [ $1 = "configmap" ] +then + RESOURCE=configmap +elif [ $1 = "secret" ] +then + RESOURCE=secret +else + echo "Incorrect resource $1. Exiting.." + exit 1 +fi + + +if [ $# -ge 5 ] +then + kubectl -n $4 delete --ignore-not-found=true $RESOURCE $5 + kubectl -n $3 get $RESOURCE $2 -o yaml | sed "s/namespace: $3/namespace: $4/g" | sed "s/name: $2/name: $5/g" | kubectl -n $4 create -f - +else + kubectl -n $4 delete --ignore-not-found=true $RESOURCE $2 + kubectl -n $3 get $RESOURCE $2 -o yaml | sed "s/namespace: $3/namespace: $4/g" | kubectl -n $4 create -f - +fi + + + + + diff --git a/deploy/apitest-resident/delete.sh b/deploy/apitest-resident/delete.sh new file mode 100755 index 00000000000..fd87d83860f --- /dev/null +++ b/deploy/apitest-resident/delete.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Uninstalls apitestrig +## Usage: ./delete.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + +function deleting_apitestrig() { + NS=idrepo + while true; do + read -p "Are you sure you want to delete apitestrig helm charts?(Y/n) " yn + if [ $yn = "Y" ] + then + helm -n $NS delete resident-apitestrig + break + else + break + fi + done + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +deleting_apitestrig # calling function \ No newline at end of file diff --git a/deploy/apitest-resident/install.sh b/deploy/apitest-resident/install.sh new file mode 100755 index 00000000000..98b97af437e --- /dev/null +++ b/deploy/apitest-resident/install.sh @@ -0,0 +1,130 @@ +#!/bin/bash +# Installs apitestrig +## Usage: ./install.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + +NS=apitestrig +CHART_VERSION=1.3.3 +COPY_UTIL=../copy_cm_func.sh + +echo Create $NS namespace +kubectl create ns $NS + +function installing_apitestrig() { + echo Istio label + kubectl label ns $NS istio-injection=disabled --overwrite + helm repo update + + echo Copy Configmaps + $COPY_UTIL configmap global default $NS + $COPY_UTIL configmap keycloak-host keycloak $NS + $COPY_UTIL configmap artifactory-share artifactory $NS + $COPY_UTIL configmap config-server-share config-server $NS + + echo echo Copy Secrtes + $COPY_UTIL secret keycloak-client-secrets keycloak $NS + $COPY_UTIL secret s3 s3 $NS + $COPY_UTIL secret postgres-postgresql postgres $NS + + echo "Delete s3, db, & apitestrig configmap if exists" + kubectl -n $NS delete --ignore-not-found=true configmap s3 + kubectl -n $NS delete --ignore-not-found=true configmap db + kubectl -n $NS delete --ignore-not-found=true configmap apitestrig + + DB_HOST=$( kubectl -n default get cm global -o json |jq -r '.data."mosip-api-internal-host"' ) + API_INTERNAL_HOST=$( kubectl -n default get cm global -o json |jq -r '.data."mosip-api-internal-host"' ) + ENV_USER=$( kubectl -n default get cm global -o json |jq -r '.data."mosip-api-internal-host"' | awk -F '.' '/api-internal/{print $1"."$2}') + + read -p "Please enter the time(hr) to run the cronjob every day (time: 0-23) : " time + if [ -z "$time" ]; then + echo "ERROT: Time cannot be empty; EXITING;"; + exit 1; + fi + if ! [ $time -eq $time ] 2>/dev/null; then + echo "ERROR: Time $time is not a number; EXITING;"; + exit 1; + fi + if [ $time -gt 23 ] || [ $time -lt 0 ] ; then + echo "ERROR: Time should be in range ( 0-23 ); EXITING;"; + exit 1; + fi + + echo "Do you have public domain & valid SSL? (Y/n) " + echo "Y: if you have public domain & valid ssl certificate" + echo "n: If you don't have a public domain and a valid SSL certificate. Note: It is recommended to use this option only in development environments." + read -p "" flag + + if [ -z "$flag" ]; then + echo "'flag' was provided; EXITING;" + exit 1; + fi + ENABLE_INSECURE='' + if [ "$flag" = "n" ]; then + ENABLE_INSECURE='--set enable_insecure=true'; + fi + + read -p "Please provide the retention days to remove old reports ( Default: 3 )" reportExpirationInDays + + if [[ -z $reportExpirationInDays ]]; then + reportExpirationInDays=3 + fi + if ! [[ $reportExpirationInDays =~ ^[0-9]+$ ]]; then + echo "The variable \"reportExpirationInDays\" should contain only number; EXITING"; + exit 1; + fi + + read -p "Please provide slack webhook URL to notify server end issues on your slack channel : " slackWebhookUrl + + if [ -z $slackWebhookUrl ]; then + echo "slack webhook URL not provided; EXITING;" + exit 1; + fi + + valid_inputs=("yes" "no") + eSignetDeployed="" + + while [[ ! " ${valid_inputs[@]} " =~ " ${eSignetDeployed} " ]]; do + read -p "Is the eSignet service deployed? (yes/no): " eSignetDeployed + eSignetDeployed=${eSignetDeployed,,} # Convert input to lowercase + done + + if [[ $eSignetDeployed == "yes" ]]; then + echo "eSignet service is deployed. Proceeding with installation..." + else + echo "eSignet service is not deployed. hence will be skipping esignet related test-cases..." + fi + + echo Installing idrepo apitestrig + helm -n $NS install resident-apitestrig mosip/apitestrig \ + --set crontime="0 $time * * *" \ + -f values.yaml \ + --version $CHART_VERSION \ + --set apitestrig.configmaps.s3.s3-host='http://minio.minio:9000' \ + --set apitestrig.configmaps.s3.s3-user-key='admin' \ + --set apitestrig.configmaps.s3.s3-region='' \ + --set apitestrig.configmaps.db.db-server="$DB_HOST" \ + --set apitestrig.configmaps.db.db-su-user="postgres" \ + --set apitestrig.configmaps.db.db-port="5432" \ + --set apitestrig.configmaps.apitestrig.ENV_USER="$ENV_USER" \ + --set apitestrig.configmaps.apitestrig.ENV_ENDPOINT="https://$API_INTERNAL_HOST" \ + --set apitestrig.configmaps.apitestrig.ENV_TESTLEVEL="smokeAndRegression" \ + --set apitestrig.configmaps.apitestrig.reportExpirationInDays="$reportExpirationInDays" \ + --set apitestrig.configmaps.apitestrig.slack-webhook-url="$slackWebhookUrl" \ + --set apitestrig.configmaps.apitestrig.eSignetDeployed="$eSignetDeployed" \ + --set apitestrig.configmaps.apitestrig.NS="$NS" \ + $ENABLE_INSECURE + + echo Installed idrepo apitestrig. + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +installing_apitestrig # calling function diff --git a/deploy/apitest-resident/values.yaml b/deploy/apitest-resident/values.yaml new file mode 100644 index 00000000000..6a5b4222958 --- /dev/null +++ b/deploy/apitest-resident/values.yaml @@ -0,0 +1,7 @@ +modules: + idrepo: + enabled: true + image: + repository: mosipid/apitest-resident + tag: 1.2.1.2 + pullPolicy: Always diff --git a/deploy/certs_upload/postman/README.md b/deploy/certs_upload/postman/README.md new file mode 100644 index 00000000000..ba697ea0495 --- /dev/null +++ b/deploy/certs_upload/postman/README.md @@ -0,0 +1,39 @@ +# Resident Cert Upload (_Work-in-progress_) + +The folder here contains Postman Collection to upload RESIDENT certs. + +## Prerequisites +Install Postman (browser or command line). The command line version is called `newman`. + +## Run +* Inspect `env.json` for any changes in default params. +* Run on command line +```sh +newman run collection.json -e env.json --env-var 'url=https://xxx.yyy.zzz' --env-var 'admin-client-secret=xxxxxxxxxxxx' +``` + +output: + +``` + +┌─────────────────────────┬─────────────────────┬─────────────────────┐ +│ │ executed │ failed │ +├─────────────────────────┼─────────────────────┼─────────────────────┤ +│ iterations │ 1 │ 0 │ +├─────────────────────────┼─────────────────────┼─────────────────────┤ +│ requests │ 8 │ 0 │ +├─────────────────────────┼─────────────────────┼─────────────────────┤ +│ test-scripts │ 8 │ 0 │ +├─────────────────────────┼─────────────────────┼─────────────────────┤ +│ prerequest-scripts │ 4 │ 0 │ +├─────────────────────────┼─────────────────────┼─────────────────────┤ +│ assertions │ 9 │ 0 │ +├─────────────────────────┴─────────────────────┴─────────────────────┤ +│ total run duration: 3.7s │ +├─────────────────────────────────────────────────────────────────────┤ +│ total data received: 7.16KB (approx) │ +├─────────────────────────────────────────────────────────────────────┤ +│ average response time: 432ms [min: 112ms, max: 1461ms, s.d.: 413ms] │ +└─────────────────────────────────────────────────────────────────────┘ + +``` diff --git a/deploy/certs_upload/postman/collection.json b/deploy/certs_upload/postman/collection.json new file mode 100644 index 00000000000..e8e7946ca67 --- /dev/null +++ b/deploy/certs_upload/postman/collection.json @@ -0,0 +1,436 @@ +{ + "info": { + "_postman_id": "5a43932c-5022-4731-bafc-282af54996a2", + "name": "Automated Cert Upload for Resident", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Authentication", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "postman.setGlobalVariable('requesttime', (new Date()).toISOString());" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Clientid and Token combination has been validated successfully\", function () {\r", + " pm.expect(pm.response.text()).to.include(\"Clientid and Token combination had been validated successfully\");\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"string\",\r\n \"metadata\": {},\r\n \"request\": {\r\n \"appId\": \"ida\",\r\n \"clientId\": \"mosip-admin-client\",\r\n \"secretKey\": \"{{admin-client-secret}}\"\r\n },\r\n \"requesttime\": \"{{requesttime}}\",\r\n \"version\": \"string\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/v1/authmanager/authenticate/clientidsecretkey", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "authmanager", + "authenticate", + "clientidsecretkey" + ] + } + }, + "response": [] + }, + { + "name": "GET RESIDENT Root Certificate", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var data = JSON.stringify(jsonData.response.certificate);\r", + "console.log(data);\r", + "pm.environment.set(\"Resrootcert\",data);\r", + "\r", + "var jsonData = JSON.parse(responseBody);\r", + "pm.test(\"Got RESIDENT-ROOT-cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql(null);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/v1/keymanager/getCertificate?applicationId=ROOT", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "keymanager", + "getCertificate" + ], + "query": [ + { + "key": "applicationId", + "value": "ROOT" + } + ] + } + }, + "response": [] + }, + { + "name": "POST RESIDENT_Root certificate", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var jsonData = JSON.stringify(jsonData.errors);\r", + "if (jsonData==\"[]\"){\r", + " pm.test(\"Posted RESIDENT-ROOT-Cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql([]);\r", + " });\r", + "}\r", + "else{\r", + " pm.test(\"Certificate already exists in DB\", function () {\r", + " pm.expect(pm.response.text()).to.include(\"Certificate already exists \");\r", + " });\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "postman.setGlobalVariable('requesttime', (new Date()).toISOString());" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"string\",\r\n \"metadata\": {},\r\n \"request\": {\r\n \"certificateData\":{{Resrootcert}},\r\n \"partnerDomain\": \"AUTH\"\r\n },\r\n \"requesttime\": \"{{requesttime}}\",\r\n \"version\": \"string\"\r\n}\r\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/v1/partnermanager/partners/certificate/ca/upload", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "partnermanager", + "partners", + "certificate", + "ca", + "upload" + ] + } + }, + "response": [] + }, + { + "name": "GET resident certificate", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var data = JSON.stringify(jsonData.response.certificate);\r", + "console.log(data);\r", + "pm.environment.set(\"Rescert\",data);\r", + "var jsonData = JSON.parse(responseBody);\r", + "pm.test(\"Got Resident-cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql(null);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/v1/keymanager/getCertificate?applicationId=RESIDENT", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "keymanager", + "getCertificate" + ], + "query": [ + { + "key": "applicationId", + "value": "RESIDENT" + } + ] + } + }, + "response": [] + }, + { + "name": "POST Resident certificate", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var jsonData = JSON.stringify(jsonData.errors);\r", + "if (jsonData==\"[]\"){\r", + " pm.test(\"Posted RESIDENT cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql([]);;\r", + " });\r", + "}\r", + "else{\r", + " pm.test(\"Certificate already exists in DB\", function () {\r", + " pm.expect(pm.response.text()).to.include(\"Certificate already exists \");\r", + " });\r", + "}" + ], + "type": "text/javascript" + } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "postman.setGlobalVariable('requesttime', (new Date()).toISOString());" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"string\",\r\n \"metadata\": {},\r\n \"request\": {\r\n \"certificateData\":{{Rescert}},\r\n \"partnerDomain\": \"AUTH\"\r\n },\r\n \"requesttime\": \"{{requesttime}}\",\r\n \"version\": \"string\"\r\n}\r\n", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/v1/partnermanager/partners/certificate/ca/upload", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "partnermanager", + "partners", + "certificate", + "ca", + "upload" + ] + } + }, + "response": [] + }, + { + "name": "GET Mpartner default resident cert", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var data = JSON.stringify(jsonData.response.certificate);\r", + "console.log(data);\r", + "pm.environment.set(\"MPDRcert\",data);\r", + "var jsonData = JSON.parse(responseBody);\r", + "pm.test(\"Got mpartner-default-resident-cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql(null);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{url}}/v1/keymanager/getCertificate?applicationId=RESIDENT&referenceId=mpartner-default-resident", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "keymanager", + "getCertificate" + ], + "query": [ + { + "key": "applicationId", + "value": "RESIDENT" + }, + { + "key": "referenceId", + "value": "mpartner-default-resident" + } + ] + } + }, + "response": [] + }, + { + "name": "POST mpartner default resident cert", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "postman.setGlobalVariable('requesttime', (new Date()).toISOString());" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = JSON.parse(responseBody);\r", + "var jsonData = JSON.stringify(jsonData.errors);\r", + "if (jsonData==\"[]\"){\r", + " pm.test(\"Posted Mpartner-default-resident cert\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql([]);\r", + " });\r", + "}\r", + "else{\r", + " pm.test(\"Certificate already exists in DB\", function () {\r", + " pm.expect(pm.response.text()).to.include(\"Certificate already exists \");\r", + " });\r", + "}\r", + "var jsonData = JSON.parse(responseBody);\r", + "var data = JSON.stringify(jsonData.response.signedCertificateData);\r", + "pm.environment.set(\"signedmpartnerdefaultresidentcert\",data);\r", + "var jsonData = JSON.parse(responseBody);\r", + "pm.test(\"Got signed-certificate\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql([]);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"string\",\r\n \"metadata\": {},\r\n \"request\": {\r\n \"certificateData\":{{MPDRcert}},\r\n \"partnerDomain\": \"AUTH\",\r\n \"partnerId\": \"mpartner-default-resident\"\r\n },\r\n \"requesttime\": \"{{requesttime}}\",\r\n \"version\": \"string\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/v1/partnermanager/partners/certificate/upload", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "partnermanager", + "partners", + "certificate", + "upload" + ] + } + }, + "response": [] + }, + { + "name": "Upload Signed Certificate Copy", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "\r", + "pm.test(\"Posted Signed certificate\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors).to.eql(null);\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": \"string\",\r\n \"metadata\": {},\r\n \"request\": {\r\n \"applicationId\": \"RESIDENT\",\r\n \"certificateData\":{{signedmpartnerdefaultresidentcert}},\r\n \"referenceId\": \"mpartner-default-resident\"\r\n },\r\n \"requesttime\": \"{{requesttime}}\",\r\n \"version\": \"string\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{url}}/v1/keymanager/uploadCertificate", + "host": [ + "{{url}}" + ], + "path": [ + "v1", + "keymanager", + "uploadCertificate" + ] + } + }, + "response": [] + } + ] +} diff --git a/deploy/certs_upload/postman/env.json b/deploy/certs_upload/postman/env.json new file mode 100644 index 00000000000..5df9b0ecc9c --- /dev/null +++ b/deploy/certs_upload/postman/env.json @@ -0,0 +1,29 @@ +{ + "id": "97f5ce5c-9a16-432d-be16-dcb1feeb5669", + "name": "Automated Cert Upload for Resident", + "values": [ + { + "key": "Resrootcert", + "value": "", + "enabled": true + }, + { + "key": "Rescert", + "value": "", + "enabled": true + }, + { + "key": "MPDRcert", + "value": "", + "enabled": true + }, + { + "key": "signedmpartnerdefaultresidentcert", + "value": "", + "enabled": true + } + ], + "_postman_variable_scope": "environment", + "_postman_exported_at": "2021-11-10T10:15:11.999Z", + "_postman_exported_using": "Postman/8.12.5" +} diff --git a/deploy/copy_cm.sh b/deploy/copy_cm.sh new file mode 100755 index 00000000000..92a2db2d680 --- /dev/null +++ b/deploy/copy_cm.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Copy configmaps from other namespaces +# DST_NS: Destination namespace + +function copying_cm() { + UTIL_URL=https://github.com/mosip/mosip-infra/blob/master/deployment/v3/utils/copy_cm_func.sh + COPY_UTIL=./copy_cm_func.sh + DST_NS=resident + + wget -q $UTIL_URL -O copy_cm_func.sh && chmod +x copy_cm_func.sh + + $COPY_UTIL configmap global default $DST_NS + $COPY_UTIL configmap artifactory-share artifactory $DST_NS + $COPY_UTIL configmap config-server-share config-server $DST_NS + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +copying_cm # calling function diff --git a/deploy/copy_cm_func.sh b/deploy/copy_cm_func.sh new file mode 100755 index 00000000000..185ae3e5f4a --- /dev/null +++ b/deploy/copy_cm_func.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copy configmap and secret from one namespace to another. +# ./copy_cm_func.sh [name] +# Parameters: +# resource: configmap|secret +# name: Optional new name of the configmap or secret in destination namespace. This may be needed if there is +# clash of names + +if [ $1 = "configmap" ] +then + RESOURCE=configmap +elif [ $1 = "secret" ] +then + RESOURCE=secret +else + echo "Incorrect resource $1. Exiting.." + exit 1 +fi + + +if [ $# -ge 5 ] +then + kubectl -n $4 delete --ignore-not-found=true $RESOURCE $5 + kubectl -n $3 get $RESOURCE $2 -o yaml | sed "s/namespace: $3/namespace: $4/g" | sed "s/name: $2/name: $5/g" | kubectl -n $4 create -f - +else + kubectl -n $4 delete --ignore-not-found=true $RESOURCE $2 + kubectl -n $3 get $RESOURCE $2 -o yaml | sed "s/namespace: $3/namespace: $4/g" | kubectl -n $4 create -f - +fi + + + + + diff --git a/deploy/copy_secrets.sh b/deploy/copy_secrets.sh new file mode 100755 index 00000000000..0496d42fdb6 --- /dev/null +++ b/deploy/copy_secrets.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Copy secrets from other namespaces +# DST_NS: Destination namespace + +function copying_secrets() { + UTIL_URL=https://github.com/mosip/mosip-infra/blob/master/deployment/v3/utils/copy_cm_func.sh + COPY_UTIL=./copy_cm_func.sh + DST_NS=resident + + wget -q $UTIL_URL -O copy_cm_func.sh && chmod +x copy_cm_func.sh + + $COPY_UTIL secret keycloak-client-secrets keycloak $DST_NS + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +copying_secrets # calling function diff --git a/deploy/delete.sh b/deploy/delete.sh new file mode 100755 index 00000000000..a6ff311f39d --- /dev/null +++ b/deploy/delete.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Uninstalls resident + +function deleting_resident() { + NS=resident + while true; do + read -p "Are you sure you want to delete resident helm chart?(Y/n) " yn + if [ $yn = "Y" ] + then + helm -n $NS delete resident + break + else + break + fi + done + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +deleting_resident # calling function diff --git a/deploy/install.sh b/deploy/install.sh new file mode 100755 index 00000000000..6a604010444 --- /dev/null +++ b/deploy/install.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Installs resident service +## Usage: ./install.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + +NS=resident +CHART_VERSION=12.1.2 + +echo Create $NS namespace +kubectl create ns $NS + +function installing_resident() { + echo Istio label + kubectl label ns $NS istio-injection=enabled --overwrite + helm repo update + + echo Copy configmaps + sed -i 's/\r$//' copy_cm.sh + ./copy_cm.sh + + echo Copy secrets + sed -i 's/\r$//' copy_secrets.sh + ./copy_secrets.sh + + echo Setting up dummy values for Resident OIDC Client ID + kubectl create secret generic resident-oidc-onboarder-key -n $NS --from-literal=resident-oidc-clientid='' --dry-run=client -o yaml | kubectl apply -f - + ./copy_cm_func.sh secret resident-oidc-onboarder-key resident config-server + + kubectl -n config-server set env --keys=resident-oidc-clientid --from secret/resident-oidc-onboarder-key deployment/config-server --prefix=SPRING_CLOUD_CONFIG_SERVER_OVERRIDES_ + kubectl -n config-server get deploy -o name | xargs -n1 -t kubectl -n config-server rollout status + + echo "Do you have public domain & valid SSL? (Y/n) " + echo "Y: if you have public domain & valid ssl certificate" + echo "n: If you don't have a public domain and a valid SSL certificate. Note: It is recommended to use this option only in development environments." + read -p "" flag + + if [ -z "$flag" ]; then + echo "'flag' was provided; EXITING;" + exit 1; + fi + ENABLE_INSECURE='' + if [ "$flag" = "n" ]; then + ENABLE_INSECURE='--set enable_insecure=true'; + fi + + API_HOST=$(kubectl get cm global -o jsonpath={.data.mosip-api-internal-host}) + RESIDENT_HOST=$(kubectl get cm global -o jsonpath={.data.mosip-resident-host}) + + echo Installing Resident + helm -n $NS install resident mosip/resident --set istio.corsPolicy.allowOrigins\[0\].prefix=https://$RESIDENT_HOST --version $CHART_VERSION $ENABLE_INSECURE + + kubectl -n $NS get deploy -o name | xargs -n1 -t kubectl -n $NS rollout status + + echo Installed Resident services + + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +installing_resident # calling function diff --git a/deploy/keycloak/keycloak-init-values.yaml b/deploy/keycloak/keycloak-init-values.yaml new file mode 100644 index 00000000000..e3cbdc72e47 --- /dev/null +++ b/deploy/keycloak/keycloak-init-values.yaml @@ -0,0 +1,40 @@ +keycloak: + realms: + mosip: # realm + clients: + - name: mosip-testrig-client + saroles: + - ID_AUTHENTICATION + - GLOBAL_ADMIN + - PARTNER_ADMIN + - REGISTRATION_PROCESSOR + - CREATE_SHARE + - PMS_ADMIN + - PMS_USER + - uma_authorization + - offline_access + - PUBLISH_DEACTIVATE_ID_ALL_INDIVIDUAL + - SUBSCRIBE_VID_CRED_STATUS_UPDATE_GENERAL + - ID_REPOSITORY + - PUBLISH_ACTIVATE_ID_ALL_INDIVIDUAL + - PUBLISH_REMOVE_ID_ALL_INDIVIDUAL + - PUBLISH_AUTHENTICATION_TRANSACTION_STATUS_GENERAL + - PUBLISH_VID_CRED_STATUS_UPDATE_GENERAL + - PUBLISH_AUTH_TYPE_STATUS_UPDATE_ALL_INDIVIDUAL + - PUBLISH_IDENTITY_CREATED_GENERAL + - PUBLISH_IDENTITY_UPDATED_GENERAL + - SUBSCRIBE_REMOVE_ID_STATUS_GENERAL + sa_client_roles: + ## realm-management client id + - realm-management: + # realm-management client roles + - view-users + - view-clients + - view-realm + - manage-users + +## These will be passed as environments variables to keycloak-init docker. Note the expected naming convention is +## _. If empty secret is passed, it shall be randomly generated +#clientSecrets: +# - name: mosip_toolkit_client_secret +# secret: "" \ No newline at end of file diff --git a/deploy/keycloak/keycloak-init.sh b/deploy/keycloak/keycloak-init.sh new file mode 100755 index 00000000000..0307f328986 --- /dev/null +++ b/deploy/keycloak/keycloak-init.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# Initialised keycloak for esignet requirements. +## Usage: ./keycloak-init.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + +NS=apitestrig +CHART_VERSION=12.0.1 +COPY_UTIL=../copy_cm_func.sh + +helm repo add mosip https://mosip.github.io/mosip-helm +helm repo update + +echo "checking if mosip-testrig-client is created already" +IAMHOST_URL=$(kubectl get cm global -o jsonpath={.data.mosip-iam-external-host}) +MOSIP_TESTRIG_CLIENT_SECRET_KEY='mosip_testrig_client_secret' +MOSIP_TESTRIG_CLIENT_SECRET_VALUE=$(kubectl -n keycloak get secrets keycloak-client-secrets -o jsonpath={.data.$MOSIP_TESTRIG_CLIENT_SECRET_KEY} | base64 -d) + +echo "Copying keycloak configmaps and secret" +$COPY_UTIL configmap keycloak-env-vars keycloak $NS +$COPY_UTIL secret keycloak keycloak $NS + +echo "creating and adding roles to keycloak testrig clients for APITESTRIG" +kubectl -n $NS delete secret --ignore-not-found=true keycloak-client-secrets +helm -n $NS delete testrig-keycloak-init +helm -n $NS install testrig-keycloak-init mosip/keycloak-init \ + -f keycloak-init-values.yaml \ + --set clientSecrets[0].name="$MOSIP_TESTRIG_CLIENT_SECRET_KEY" \ + --set clientSecrets[0].secret="$MOSIP_TESTRIG_CLIENT_SECRET_VALUE" \ + --set keycloak.realms.mosip.realm_config.attributes.frontendUrl="https://$IAMHOST_URL/auth" \ + --version $CHART_VERSION -f keycloak-init-values.yaml --wait-for-jobs + +MOSIP_TESTRIG_CLIENT_SECRET_VALUE=$(kubectl -n $NS get secrets keycloak-client-secrets -o jsonpath={.data.$MOSIP_TESTRIG_CLIENT_SECRET_KEY}) + +# Check if the secret exists +if kubectl get secret keycloak-client-secrets -n keycloak >/dev/null 2>&1; then + echo "Secret 'keycloak-client-secrets' exists. Performing secret update..." + kubectl -n keycloak get secret keycloak-client-secrets -o json | + jq ".data[\"$MOSIP_TESTRIG_CLIENT_SECRET_KEY\"]=\"$MOSIP_TESTRIG_CLIENT_SECRET_VALUE\"" | + kubectl apply -f - +else + echo "Secret 'keycloak-client-secrets' does not exist. Copying the secret to the keycloak namespace." + $COPY_UTIL secret keycloak-client-secrets $NS keycloak +fi diff --git a/deploy/restart.sh b/deploy/restart.sh new file mode 100755 index 00000000000..971281dbb72 --- /dev/null +++ b/deploy/restart.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Restart the resident service +## Usage: ./restart.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + + +function Restarting_resident() { + NS=resident + kubectl -n $NS rollout restart deploy + + kubectl -n $NS get deploy -o name | xargs -n1 -t kubectl -n $NS rollout status + echo Restarted resident services + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +Restarting_resident # calling function \ No newline at end of file diff --git a/deploy/values.yaml b/deploy/values.yaml new file mode 100644 index 00000000000..6843d9865c0 --- /dev/null +++ b/deploy/values.yaml @@ -0,0 +1,427 @@ +## Global Docker image parameters +## Please, note that this will override the image parameters, including dependencies, configured to use the global value +## Current available global Docker image parameters: imageRegistry and imagePullSecrets +## +# global: +# imageRegistry: myRegistryName +# imagePullSecrets: +# - myRegistryKeySecretName +# storageClass: myStorageClass + +## Add labels to all the deployed resources +## +commonLabels: + app.kubernetes.io/component: mosip +## Add annotations to all the deployed resources +## +commonAnnotations: {} +## Kubernetes Cluster Domain +## +clusterDomain: cluster.local +## Extra objects to deploy (value evaluated as a template) +## +extraDeploy: [] +## Number of nodes +## +replicaCount: 1 +service: + type: ClusterIP + port: 80 + ## loadBalancerIP for the SuiteCRM Service (optional, cloud specific) + ## ref: http://kubernetes.io/docs/user-guide/services/#type-loadbalancer + ## + ## loadBalancerIP: + ## + ## nodePorts: + ## http: + ## https: + ## + + nodePorts: + http: "" + https: "" + ## Enable client source IP preservation + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster +image: + registry: docker.io + repository: mosipid/resident-service + tag: 1.2.1.2 + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images + ## + pullPolicy: Always + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## + # pullSecrets: + # - myRegistryKeySecretName +## Port on which this particular spring service module is running. +springServicePort: 8099 +## Configure extra options for liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## +startupProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 30 + successThreshold: 1 +livenessProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 20 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 +readinessProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 +## +# existingConfigmap: + +## Command and args for running the container (set to default if not set). Use array form +## +command: [] +args: [] +## Deployment pod host aliases +## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ +## +hostAliases: [] +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## +resources: + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + limits: + cpu: 500m + memory: 3000Mi + requests: + cpu: 100m + memory: 1000Mi +additionalResources: + ## Specify any JAVA_OPTS string here. These typically will be specified in conjunction with above resources + ## Example: java_opts: "-Xms500M -Xmx500M" + javaOpts: "-Xms2000M -Xmx2000M" +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container +## Clamav container already runs as 'mosip' user, so we may not need to enable this +containerSecurityContext: + enabled: false + runAsUser: mosip + runAsNonRoot: true +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod +## +podSecurityContext: + enabled: false + fsGroup: 1001 +## Pod affinity preset +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## Allowed values: soft, hard +## +podAffinityPreset: "" +## Pod anti-affinity preset +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## Allowed values: soft, hard +## +podAntiAffinityPreset: soft +## Node affinity preset +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity +## Allowed values: soft, hard +## +nodeAffinityPreset: + ## Node affinity type + ## Allowed values: soft, hard + ## + type: "" + ## Node label key to match + ## E.g. + ## key: "kubernetes.io/e2e-az-name" + ## + key: "" + ## Node label values to match + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] +## Affinity for pod assignment. Evaluated as a template. +## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} +## Node labels for pod assignment. Evaluated as a template. +## ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +## Tolerations for pod assignment. Evaluated as a template. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] +## Pod extra labels +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +## +podLabels: {} +## Annotations for server pods. +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ +## +podAnnotations: {} +## pods' priority. +## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/ +## +# priorityClassName: "" + +## lifecycleHooks for the container to automate configuration before or after startup. +## +lifecycleHooks: {} +## Custom Liveness probes for +## +customLivenessProbe: {} +## Custom Rediness probes +## +customReadinessProbe: {} +## Update strategy - only really applicable for deployments with RWO PVs attached +## If replicas = 1, an update can get "stuck", as the previous pod remains attached to the +## PV, and the "incoming" pod can never start. Changing the strategy to "Recreate" will +## terminate the single previous pod, so that the new, incoming pod can attach to the PV +## +updateStrategy: + type: RollingUpdate +## Additional environment variables to set +## Example: +## extraEnvVars: +## - name: FOO +## value: "bar" +## +extraEnvVars: [] +## ConfigMap with extra environment variables that used +## NOTE: we have removed artifactory from this list and passed artifactory parameters as above +## This is done as auth adapter url required by this service is different from the default. +extraEnvVarsCM: + - global + - config-server-share + - artifactory-share +## ConfigMap with extra environment variables that used +## + +## Secret with extra environment variables +## +extraEnvVarsSecret: +## Extra volumes to add to the deployment +## +extraVolumes: [] +## Extra volume mounts to add to the container +## +extraVolumeMounts: [] +## Add init containers to the pods. +## Example: +## initContainers: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +initContainers: {} +## Add sidecars to the pods. +## Example: +## sidecars: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +sidecars: {} +persistence: + enabled: false + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack). + ## + # storageClass: "-" + ## + ## If you want to reuse an existing claim, you can pass the name of the PVC using + ## the existingClaim variable + # existingClaim: your-claim + ## ReadWriteMany not supported by AWS gp2 + storageClass: + accessModes: + - ReadWriteOnce + size: 10M + existingClaim: + # Dir where config and keys are written inside container + mountDir: +## Init containers parameters: +## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section. +## +volumePermissions: + enabled: false + image: + registry: docker.io + repository: bitnami/bitnami-shell + tag: "10" + pullPolicy: Always + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## + pullSecrets: [] + ## - myRegistryKeySecretName + ## Init containers' resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## + limits: {} + ## cpu: 100m + ## memory: 128Mi + ## + requests: {} + ## cpu: 100m + ## memory: 128Mi + ## +## Specifies whether RBAC resources should be created +## +rbac: + create: true +## Specifies whether a ServiceAccount should be created +## +serviceAccount: + create: true + ## The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the fullname template + ## + name: +## Prometheus Metrics +metrics: + enabled: true + ## Prometheus pod annotations + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: + prometheus.io/scrape: "true" + endpointPath: /resident/v1/actuator/prometheus + ## Prometheus Service Monitor + ## ref: https://github.com/coreos/prometheus-operator + ## + serviceMonitor: + ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry + ## + enabled: true + ## Specify the namespace in which the serviceMonitor resource will be created + ## + # namespace: "" + ## Specify the interval at which metrics should be scraped + ## + interval: 10s + ## Specify the timeout after which the scrape is ended + ## + # scrapeTimeout: 30s + ## Specify Metric Relabellings to add to the scrape endpoint + ## + # relabellings: + ## Specify honorLabels parameter to add the scrape endpoint + ## + honorLabels: false + ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with + ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec + ## + additionalLabels: {} + ## Custom PrometheusRule to be defined + ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart + ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions + ## + prometheusRule: + enabled: false + additionalLabels: {} + namespace: '' + ## List of rules, used as template by Helm. + ## These are just examples rules inspired from https://awesome-prometheus-alerts.grep.to/rules.html + # rules: + # - alert: RabbitmqDown + # expr: rabbitmq_up{service="{{ template "rabbitmq.fullname" . }}"} == 0 + # for: 5m + # labels: + # severity: error + rules: [] +## Needs external access as is connected by reg clients +istio: + enabled: true + gateways: + - istio-system/public + - istio-system/internal + prefix: /resident/v1 + corsPolicy: + allowOrigins: + - prefix: https://resident.sandbox.xyz.net + exposeHeaders: + - content-disposition + - Content-Disposition + - eventId + allowCredentials: true + allowHeaders: + - Accept + - Accept-Encoding + - Accept-Language + - Connection + - Content-Type + - Cookie + - Host + - Referer + - Sec-Fetch-Dest + - Sec-Fetch-Mode + - Sec-Fetch-Site + - Sec-Fetch-User + - Origin + - Upgrade-Insecure-Requests + - User-Agent + - sec-ch-ua + - sec-ch-ua-mobile + - sec-ch-ua-platform + - x-xsrf-token + - xsrf-token + - time-zone-offset + - locale + allowMethods: + - GET + - POST + - PATCH + - PUT + - DELETE + headers: + request: + set: + x-forwarded-proto: https + response: + set: + Cache-control: no-store + Pragma: no-cache + Strict-Transport-Security: max-age=31536000; includeSubDomains + X-Frame-Options: SAMEORIGIN diff --git a/helm/resident/.gitignore b/helm/resident/.gitignore new file mode 100644 index 00000000000..b3c94bf6431 --- /dev/null +++ b/helm/resident/.gitignore @@ -0,0 +1,2 @@ +charts/ +Charts.lock diff --git a/helm/resident/.helmignore b/helm/resident/.helmignore new file mode 100644 index 00000000000..f0c13194444 --- /dev/null +++ b/helm/resident/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm/resident/Chart.yaml b/helm/resident/Chart.yaml new file mode 100644 index 00000000000..a9ecfe96ffb --- /dev/null +++ b/helm/resident/Chart.yaml @@ -0,0 +1,19 @@ +apiVersion: v2 +name: resident +description: A Helm chart for MOSIP Resident service +type: application +version: 12.1.2 +appVersion: "" +dependencies: + - name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +home: https://mosip.io +keywords: + - mosip + - resident +maintainers: + - email: info@mosip.io + name: MOSIP diff --git a/helm/resident/README.md b/helm/resident/README.md new file mode 100644 index 00000000000..df6a60ea787 --- /dev/null +++ b/helm/resident/README.md @@ -0,0 +1,11 @@ +# Resident Service + +Helm chart for installing Resident service. + +## TL;DR + +```console +$ helm repo add mosip https://mosip.github.io +$ helm install my-release mosip/resident +``` + diff --git a/helm/resident/templates/NOTES.txt b/helm/resident/templates/NOTES.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/helm/resident/templates/NOTES.txt @@ -0,0 +1 @@ + diff --git a/helm/resident/templates/_helpers.tpl b/helm/resident/templates/_helpers.tpl new file mode 100644 index 00000000000..a755ab93deb --- /dev/null +++ b/helm/resident/templates/_helpers.tpl @@ -0,0 +1,60 @@ +{{/* +Return the proper image name +*/}} +{{- define "resident.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper image name (for the init container volume-permissions image) +*/}} +{{- define "resident.volumePermissions.image" -}} +{{- include "common.images.image" ( dict "imageRoot" .Values.volumePermissions.image "global" .Values.global ) -}} +{{- end -}} + +{{/* +Return the proper Docker Image Registry Secret Names +*/}} +{{- define "resident.imagePullSecrets" -}} +{{- include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.volumePermissions.image) "global" .Values.global) -}} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "resident.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (printf "%s" (include "common.names.fullname" .)) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Compile all warnings into a single message. +*/}} +{{- define "resident.validateValues" -}} +{{- $messages := list -}} +{{- $messages := append $messages (include "resident.validateValues.foo" .) -}} +{{- $messages := append $messages (include "resident.validateValues.bar" .) -}} +{{- $messages := without $messages "" -}} +{{- $message := join "\n" $messages -}} + +{{- if $message -}} +{{- printf "\nVALUES VALIDATION:\n%s" $message -}} +{{- end -}} +{{- end -}} + +{{/* +Return podAnnotations +*/}} +{{- define "resident.podAnnotations" -}} +{{- if .Values.podAnnotations }} +{{ include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) }} +{{- end }} +{{- if and .Values.metrics.enabled .Values.metrics.podAnnotations }} +{{ include "common.tplvalues.render" (dict "value" .Values.metrics.podAnnotations "context" $) }} +{{- end }} +{{- end -}} + + diff --git a/helm/resident/templates/clusterrolebinding.yaml b/helm/resident/templates/clusterrolebinding.yaml new file mode 100644 index 00000000000..3c57626d737 --- /dev/null +++ b/helm/resident/templates/clusterrolebinding.yaml @@ -0,0 +1,19 @@ +kind: ClusterRoleBinding +apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} +metadata: + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + name: {{ template "common.names.fullname" . }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "common.names.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ template "resident.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} diff --git a/helm/resident/templates/deployment.yaml b/helm/resident/templates/deployment.yaml new file mode 100644 index 00000000000..ec38956db69 --- /dev/null +++ b/helm/resident/templates/deployment.yaml @@ -0,0 +1,144 @@ +apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} +kind: Deployment +metadata: + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + name: {{ template "common.names.fullname" . }} + annotations: + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + {{- if .Values.updateStrategy }} + strategy: {{- toYaml .Values.updateStrategy | nindent 4 }} + {{- end }} + selector: + matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} + template: + metadata: + annotations: + {{- if or .Values.podAnnotations .Values.metrics.enabled }} + {{- include "resident.podAnnotations" . | nindent 8 }} + {{- end }} + labels: {{- include "common.labels.standard" . | nindent 8 }} + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ template "resident.serviceAccountName" . }} + {{- include "resident.imagePullSecrets" . | nindent 6 }} + {{- if .Values.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName | quote }} + {{- end }} + {{- if .Values.podSecurityContext.enabled }} + securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }} + {{- end }} + initContainers: + {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }} + - name: volume-permissions + image: {{ include "resident.volumePermissions.image" . }} + imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }} + command: + - %%commands%% + securityContext: + runAsUser: 0 + {{- if .Values.volumePermissions.resources }} + resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }} + {{- end }} + volumeMounts: + - name: foo + mountPath: bar + {{- end }} + {{- if .Values.enable_insecure }} + {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} + {{- end }} + containers: + - name: resident + image: {{ template "resident.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.containerSecurityContext.enabled }} + securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: container_user + value: {{ .Values.containerSecurityContext.runAsUser }} + - name: JDK_JAVA_OPTIONS + value: {{ .Values.additionalResources.javaOpts }} + {{- if .Values.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + envFrom: + {{- if .Values.extraEnvVarsCM }} + {{- range .Values.extraEnvVarsCM }} + - configMapRef: + name: {{ . }} + {{- end }} + {{- end }} + {{- if .Values.extraEnvVarsSecret }} + - secretRef: + name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }} + {{- end }} + ports: + - name: spring-service + containerPort: {{ .Values.springServicePort }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + {{- if .Values.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.startupProbe "enabled") "context" $) | nindent 12 }} + {{- else if .Values.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customStartupProbe "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.livenessProbe "enabled") "context" $) | nindent 12 }} + {{- else if .Values.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customLivenessProbe "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readinessProbe "enabled") "context" $) | nindent 12 }} + {{- else if .Values.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customReadinessProbe "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.enable_insecure }} + - mountPath: /usr/local/openjdk-11/lib/security/cacerts + name: cacerts + subPath: cacerts + {{- end }} + {{- if .Values.sidecars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.sidecars "context" $) | nindent 8 }} + {{- end }} + volumes: + {{- if .Values.enable_insecure }} + - name: cacerts + emptyDir: {} + {{- end }} diff --git a/helm/resident/templates/extra-list.yaml b/helm/resident/templates/extra-list.yaml new file mode 100644 index 00000000000..9ac65f9e16f --- /dev/null +++ b/helm/resident/templates/extra-list.yaml @@ -0,0 +1,4 @@ +{{- range .Values.extraDeploy }} +--- +{{ include "common.tplvalues.render" (dict "value" . "context" $) }} +{{- end }} diff --git a/helm/resident/templates/service-account.yaml b/helm/resident/templates/service-account.yaml new file mode 100644 index 00000000000..a0a11f86325 --- /dev/null +++ b/helm/resident/templates/service-account.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + name: {{ template "resident.serviceAccountName" . }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} + namespace: {{ .Release.Namespace }} diff --git a/helm/resident/templates/service.yaml b/helm/resident/templates/service.yaml new file mode 100644 index 00000000000..018e6985d05 --- /dev/null +++ b/helm/resident/templates/service.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: Service +metadata: + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + name: {{ template "common.names.fullname" . }} + annotations: + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + {{- if (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort")) }} + externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }} + {{- end }} + {{ if eq .Values.service.type "LoadBalancer" }} + loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }} + {{ end }} + {{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} + {{- end }} + ports: + - port: {{ .Values.service.port }} + protocol: TCP + targetPort: {{ .Values.springServicePort }} + selector: {{- include "common.labels.matchLabels" . | nindent 4 }} diff --git a/helm/resident/templates/servicemonitor.yaml b/helm/resident/templates/servicemonitor.yaml new file mode 100644 index 00000000000..15f48fdeecf --- /dev/null +++ b/helm/resident/templates/servicemonitor.yaml @@ -0,0 +1,36 @@ +{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ template "common.names.fullname" . }} + {{- if .Values.metrics.serviceMonitor.namespace }} + namespace: {{ .Values.metrics.serviceMonitor.namespace }} + {{- else }} + namespace: {{ .Release.Namespace | quote }} + {{- end }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.metrics.serviceMonitor.additionalLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.additionalLabels "context" $) | nindent 4 }} + {{- end }} +spec: + endpoints: + - targetPort: {{ .Values.springServicePort }} + path: {{ .Values.metrics.endpointPath }} + {{- if .Values.metrics.serviceMonitor.interval }} + interval: {{ .Values.metrics.serviceMonitor.interval }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.scrapeTimeout }} + scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.honorLabels }} + honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }} + {{- end }} + {{- if .Values.metrics.serviceMonitor.relabellings }} + metricRelabelings: {{- toYaml .Values.metrics.serviceMonitor.relabellings | nindent 6 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace | quote }} + selector: + matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} +{{- end }} diff --git a/helm/resident/templates/virtualservice.yaml b/helm/resident/templates/virtualservice.yaml new file mode 100644 index 00000000000..e21fee41771 --- /dev/null +++ b/helm/resident/templates/virtualservice.yaml @@ -0,0 +1,32 @@ +{{- if .Values.istio.enabled }} +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: {{ template "common.names.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + hosts: + - "*" + gateways: + {{- include "common.tplvalues.render" ( dict "value" .Values.istio.gateways "context" $ ) | nindent 4 }} + http: + - match: + - uri: + prefix: {{ .Values.istio.prefix }} + route: + - destination: + host: {{ template "common.names.fullname" . }} + port: + number: {{ .Values.service.port }} + corsPolicy: + {{- include "common.tplvalues.render" ( dict "value" .Values.istio.corsPolicy "context" $ ) | nindent 6 }} + headers: + {{- include "common.tplvalues.render" ( dict "value" .Values.istio.headers "context" $ ) | nindent 6 }} +{{- end }} diff --git a/helm/resident/values.yaml b/helm/resident/values.yaml new file mode 100644 index 00000000000..a557bbf8dfe --- /dev/null +++ b/helm/resident/values.yaml @@ -0,0 +1,449 @@ +## Global Docker image parameters +## Please, note that this will override the image parameters, including dependencies, configured to use the global value +## Current available global Docker image parameters: imageRegistry and imagePullSecrets +## +# global: +# imageRegistry: myRegistryName +# imagePullSecrets: +# - myRegistryKeySecretName +# storageClass: myStorageClass + +## Add labels to all the deployed resources +## +commonLabels: + app.kubernetes.io/component: mosip +## Add annotations to all the deployed resources +## +commonAnnotations: {} +## Kubernetes Cluster Domain +## +clusterDomain: cluster.local +## Extra objects to deploy (value evaluated as a template) +## +extraDeploy: [] +## Number of nodes +## +replicaCount: 1 +service: + type: ClusterIP + port: 80 + ## loadBalancerIP for the SuiteCRM Service (optional, cloud specific) + ## ref: http://kubernetes.io/docs/user-guide/services/#type-loadbalancer + ## + ## loadBalancerIP: + ## + ## nodePorts: + ## http: + ## https: + ## + + nodePorts: + http: "" + https: "" + ## Enable client source IP preservation + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster +image: + registry: docker.io + repository: mosipid/resident-service + tag: 1.2.1.2 + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images + ## + pullPolicy: Always + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## + # pullSecrets: + # - myRegistryKeySecretName +## Port on which this particular spring service module is running. +springServicePort: 8099 +## Configure extra options for liveness and readiness probes +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +## +startupProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 30 + successThreshold: 1 +livenessProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 20 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 +readinessProbe: + enabled: true + httpGet: + path: /resident/v1/actuator/health + port: 8099 + initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 +## +# existingConfigmap: + +## Command and args for running the container (set to default if not set). Use array form +## +command: [] +args: [] +## Deployment pod host aliases +## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ +## +hostAliases: [] +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## +resources: + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + limits: + cpu: 500m + memory: 3000Mi + requests: + cpu: 100m + memory: 1000Mi +additionalResources: + ## Specify any JAVA_OPTS string here. These typically will be specified in conjunction with above resources + ## Example: java_opts: "-Xms500M -Xmx500M" + javaOpts: "-Xms2000M -Xmx2000M" +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container +## Clamav container already runs as 'mosip' user, so we may not need to enable this +containerSecurityContext: + enabled: false + runAsUser: mosip + runAsNonRoot: true +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod +## +podSecurityContext: + enabled: false + fsGroup: 1001 +## Pod affinity preset +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## Allowed values: soft, hard +## +podAffinityPreset: "" +## Pod anti-affinity preset +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## Allowed values: soft, hard +## +podAntiAffinityPreset: soft +## Node affinity preset +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity +## Allowed values: soft, hard +## +nodeAffinityPreset: + ## Node affinity type + ## Allowed values: soft, hard + ## + type: "" + ## Node label key to match + ## E.g. + ## key: "kubernetes.io/e2e-az-name" + ## + key: "" + ## Node label values to match + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] +## Affinity for pod assignment. Evaluated as a template. +## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity +## +affinity: {} +## Node labels for pod assignment. Evaluated as a template. +## ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +## Tolerations for pod assignment. Evaluated as a template. +## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] +## Pod extra labels +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +## +podLabels: {} +## Annotations for server pods. +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ +## +podAnnotations: {} +## pods' priority. +## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/ +## +# priorityClassName: "" + +## lifecycleHooks for the container to automate configuration before or after startup. +## +lifecycleHooks: {} +## Custom Liveness probes for +## +customLivenessProbe: {} +## Custom Rediness probes +## +customReadinessProbe: {} +## Update strategy - only really applicable for deployments with RWO PVs attached +## If replicas = 1, an update can get "stuck", as the previous pod remains attached to the +## PV, and the "incoming" pod can never start. Changing the strategy to "Recreate" will +## terminate the single previous pod, so that the new, incoming pod can attach to the PV +## +updateStrategy: + type: RollingUpdate +## Additional environment variables to set +## Example: +## extraEnvVars: +## - name: FOO +## value: "bar" +## +extraEnvVars: [] +## ConfigMap with extra environment variables that used +## NOTE: we have removed artifactory from this list and passed artifactory parameters as above +## This is done as auth adapter url required by this service is different from the default. +extraEnvVarsCM: + - global + - config-server-share + - artifactory-share +## ConfigMap with extra environment variables that used +## + +## Secret with extra environment variables +## +extraEnvVarsSecret: +## Extra volumes to add to the deployment +## +extraVolumes: [] +## Extra volume mounts to add to the container +## +extraVolumeMounts: [] +## Add init containers to the pods. +## Example: +## initContainers: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +initContainers: + - command: + - /bin/bash + - -c + - if [ "$ENABLE_INSECURE" = "true" ]; then HOST=$( env | grep "mosip-api-internal-host" |sed "s/mosip-api-internal-host=//g"); if [ -z "$HOST" ]; then echo "HOST $HOST is empty; EXITING"; exit 1; fi; openssl s_client -servername "$HOST" -connect "$HOST":443 > "$HOST.cer" 2>/dev/null & sleep 2 ; sed -i -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' "$HOST.cer"; cat "$HOST.cer"; /usr/local/openjdk-11/bin/keytool -delete -alias "$HOST" -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit; /usr/local/openjdk-11/bin/keytool -trustcacerts -keystore "$JAVA_HOME/lib/security/cacerts" -storepass changeit -noprompt -importcert -alias "$HOST" -file "$HOST.cer" ; if [ $? -gt 0 ]; then echo "Failed to add SSL certificate for host $host; EXITING"; exit 1; fi; cp /usr/local/openjdk-11/lib/security/cacerts /cacerts; fi + env: + - name: ENABLE_INSECURE + value: "true" + envFrom: + - configMapRef: + name: global + image: docker.io/openjdk:11-jre + imagePullPolicy: Always + name: cacerts + resources: {} + securityContext: + runAsUser: 0 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /cacerts + name: cacerts +## Add sidecars to the pods. +## Example: +## sidecars: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +sidecars: {} +persistence: + enabled: false + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack). + ## + # storageClass: "-" + ## + ## If you want to reuse an existing claim, you can pass the name of the PVC using + ## the existingClaim variable + # existingClaim: your-claim + ## ReadWriteMany not supported by AWS gp2 + storageClass: + accessModes: + - ReadWriteOnce + size: 10M + existingClaim: + # Dir where config and keys are written inside container + mountDir: +## Init containers parameters: +## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section. +## +volumePermissions: + enabled: false + image: + registry: docker.io + repository: bitnami/bitnami-shell + tag: "10" + pullPolicy: Always + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## + pullSecrets: [] + ## - myRegistryKeySecretName + ## Init containers' resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: + ## We usually recommend not to specify default resources and to leave this as a conscious + ## choice for the user. This also increases chances charts run on environments with little + ## resources, such as Minikube. If you do want to specify resources, uncomment the following + ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. + ## + limits: {} + ## cpu: 100m + ## memory: 128Mi + ## + requests: {} + ## cpu: 100m + ## memory: 128Mi + ## +## Specifies whether RBAC resources should be created +## +rbac: + create: true +## Specifies whether a ServiceAccount should be created +## +serviceAccount: + create: true + ## The name of the ServiceAccount to use. + ## If not set and create is true, a name is generated using the fullname template + ## + name: +## Prometheus Metrics +metrics: + enabled: true + ## Prometheus pod annotations + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: + prometheus.io/scrape: "true" + endpointPath: /resident/v1/actuator/prometheus + ## Prometheus Service Monitor + ## ref: https://github.com/coreos/prometheus-operator + ## + serviceMonitor: + ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry + ## + enabled: true + ## Specify the namespace in which the serviceMonitor resource will be created + ## + # namespace: "" + ## Specify the interval at which metrics should be scraped + ## + interval: 10s + ## Specify the timeout after which the scrape is ended + ## + # scrapeTimeout: 30s + ## Specify Metric Relabellings to add to the scrape endpoint + ## + # relabellings: + ## Specify honorLabels parameter to add the scrape endpoint + ## + honorLabels: false + ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with + ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec + ## + additionalLabels: {} + ## Custom PrometheusRule to be defined + ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart + ## ref: https://github.com/coreos/prometheus-operator#customresourcedefinitions + ## + prometheusRule: + enabled: false + additionalLabels: {} + namespace: '' + ## List of rules, used as template by Helm. + ## These are just examples rules inspired from https://awesome-prometheus-alerts.grep.to/rules.html + # rules: + # - alert: RabbitmqDown + # expr: rabbitmq_up{service="{{ template "rabbitmq.fullname" . }}"} == 0 + # for: 5m + # labels: + # severity: error + rules: [] +## Needs external access as is connected by reg clients +istio: + enabled: true + gateways: + - istio-system/public + - istio-system/internal + prefix: /resident/v1 + corsPolicy: + allowOrigins: + - prefix: https://resident.sandbox.xyz.net + exposeHeaders: + - content-disposition + - Content-Disposition + - eventId + allowCredentials: true + allowHeaders: + - Accept + - Accept-Encoding + - Accept-Language + - Connection + - Content-Type + - Cookie + - Host + - Referer + - Sec-Fetch-Dest + - Sec-Fetch-Mode + - Sec-Fetch-Site + - Sec-Fetch-User + - Origin + - Upgrade-Insecure-Requests + - User-Agent + - sec-ch-ua + - sec-ch-ua-mobile + - sec-ch-ua-platform + - x-xsrf-token + - xsrf-token + - time-zone-offset + - locale + allowMethods: + - GET + - POST + - PATCH + - PUT + - DELETE + headers: + request: + set: + x-forwarded-proto: https + response: + set: + Cache-control: no-store + Pragma: no-cache + Strict-Transport-Security: max-age=31536000; includeSubDomains + X-Frame-Options: SAMEORIGIN +enable_insecure: false diff --git a/resident/pom.xml b/resident/pom.xml index 573f3d869b4..1d949f60b8e 100644 --- a/resident/pom.xml +++ b/resident/pom.xml @@ -6,7 +6,7 @@ io.mosip.resident resident-parent - 1.2.0.1-SNAPSHOT + 1.2.1.2 pom resident Parent project of MOSIP Resident @@ -37,12 +37,12 @@ - ossrh - CentralRepository - https://oss.sonatype.org/content/repositories/snapshots + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots default - true + true @@ -51,7 +51,7 @@ default https://repo1.maven.org/maven2 - false + false @@ -59,11 +59,11 @@ ossrh - https://oss.sonatype.org/content/repositories/snapshots + https://central.sonatype.com/repository/maven-snapshots/ ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://central.sonatype.com/api/v1/publisher @@ -91,7 +91,7 @@ 2.0.7 1.5.20 2.9.2 - + 0.7.0 1.2 @@ -169,7 +169,7 @@ - **/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/dto/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/security/**,**/*Config.java,**/*BootApplication.java,**/*VertxApplication.java,**/cbeffutil/** + **/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/dto/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/security/**,**/*Config.java,**/*BootApplication.java,**/*VertxApplication.java,**/cbeffutil/**,**/mock/**,**/OrderCard* **/dto/**,**/entity/**,**/config/** @@ -223,32 +223,31 @@ - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven.javadoc.version} - - - attach-javadocs - - jar - - - - - none - -Xdoclint:none - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.version} + + + attach-javadocs + + jar + + + + + none + -Xdoclint:none + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.maven.plugin.version} true - ossrh - https://oss.sonatype.org/ - false + ossrh + false @@ -297,7 +296,7 @@ - + org.apache.maven.plugins maven-gpg-plugin @@ -345,14 +344,14 @@ - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compiler.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + @@ -363,6 +362,7 @@ src/main/java/**,src/main/resources/** ${sonar.coverage.exclusions} https://sonarcloud.io + true false diff --git a/resident/resident-service/Dockerfile b/resident/resident-service/Dockerfile index 4870e508cbc..91316876e94 100644 --- a/resident/resident-service/Dockerfile +++ b/resident/resident-service/Dockerfile @@ -90,9 +90,15 @@ CMD if [ "$is_glowroot_env" = "present" ]; then \ unzip glowroot.zip ; \ rm -rf glowroot.zip ; \ sed -i 's//resident-service/g' glowroot/glowroot.properties ; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/io/mosip/kernel/kernel-ref-idobjectvalidator/kernel-ref-idobjectvalidator.jar -O "${loader_path_env}"/kernel-ref-idobjectvalidator.jar ; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/icu4j/icu4j.jar -O "${loader_path_env}"/icu4j.jar ; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/icu4j/kernel-transliteration-icu4j.jar -O "${loader_path_env}"/kernel-transliteration-icu4j.jar ; \ java -Dloader.path="${loader_path_env}" -jar -javaagent:glowroot/glowroot.jar -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" resident-service.jar ; \ else \ wget "${iam_adapter_url_env}" -O "${loader_path_env}"/kernel-auth-adapter.jar; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/io/mosip/kernel/kernel-ref-idobjectvalidator/kernel-ref-idobjectvalidator.jar -O "${loader_path_env}"/kernel-ref-idobjectvalidator.jar ; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/icu4j/icu4j.jar -O "${loader_path_env}"/icu4j.jar ; \ + wget -q --show-progress "${artifactory_url_env}"/artifactory/libs-release-local/icu4j/kernel-transliteration-icu4j.jar -O "${loader_path_env}"/kernel-transliteration-icu4j.jar ; \ java -Dloader.path="${loader_path_env}" -jar -Dspring.cloud.config.label="${spring_config_label_env}" -Dspring.profiles.active="${active_profile_env}" -Dspring.cloud.config.uri="${spring_config_url_env}" resident-service.jar ; \ fi diff --git a/resident/resident-service/pom.xml b/resident/resident-service/pom.xml index c32893cb3f5..eeea6951945 100644 --- a/resident/resident-service/pom.xml +++ b/resident/resident-service/pom.xml @@ -1,23 +1,35 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" + xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 io.mosip.resident resident-parent - 1.2.0.1-SNAPSHOT + 1.2.1.2 resident-service resident-service - 1.2.0.1-SNAPSHOT + 1.2.1.2 - 1.2.0.1-SNAPSHOT - 1.2.0.1-SNAPSHOT - 1.2.0.1-SNAPSHOT + 1.2.0.1 + 1.2.0.1 + 1.2.0.1 + 1.2.1.0 + 1.2.0.1 + 1.2.0.1 + 1.2.0 + ${kernel.parent.version} + 1.5.10 UTF-8 + 2.12.0 + 2.12.0 + 1.2.0.1 + 1.2.0.1 + 1.2.0.1 + 1.2.0.1 @@ -44,10 +56,31 @@ spring-boot-starter-test ${spring.boot.version} + + io.mosip.kernel + kernel-openid-bridge-api + ${kernel-openid-bridge-api.version} + + + io.mosip.kernel + kernel-core + + + io.mosip.kernel kernel-core ${kernel.core.version} + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + + org.springframework.boot @@ -78,26 +111,76 @@ io.mosip.kernel kernel-logger-logback ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + io.mosip.kernel kernel-idvalidator-uin ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + 2.4.4 io.mosip.kernel kernel-idvalidator-rid ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + io.mosip.kernel kernel-idvalidator-vid ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + io.mosip.kernel kernel-templatemanager-velocity ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + + commons-lang + commons-lang + + + + + io.mosip.kernel + kernel-virusscanner-clamav + ${kernel.virusscanner.clamav.version} + + + io.mosip.kernel + kernel-core + + com.h2database @@ -139,11 +222,27 @@ io.mosip.commons commons-packet-manager ${commons.packet.manager.version} + + + io.mosip.kernel + kernel-core + + + io.mosip.kernel + kernel-logger-logback + + org.springdoc springdoc-openapi-ui ${springdoc.version} + + + org.apache.commons + commons-lang3 + + org.springframework.boot @@ -156,8 +255,190 @@ netty-all 4.1.72.Final + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${fasterxml.jackson.module.jsr310.version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${fasterxml.jackson.module.afterburner.version} + + + io.mosip.idrepository + id-repository-core + ${id-repository-core.version} + + + org.springframework.boot + + spring-boot-starter-security + + + + org.springframework.security + spring-security-test + + + io.mosip.kernel + kernel-auth-adapter + + + org.apache.commons + commons-lang3 + + + io.mosip.kernel + kernel-core + + + io.mosip.kernel + kernel-logger-logback + + + + + io.mosip.kernel + kernel-dataaccess-hibernate + ${kernel.core.version} + + + io.mosip.kernel + kernel-core + + + + + io.mosip.kernel + kernel-authcodeflowproxy-api + ${kernel.authcodeflowproxy.api.version} + + + io.mosip.kernel + kernel-core + + + + + io.mosip.commons + khazana + ${kernel.khazana.version} + + + io.mosip.kernel + kernel-keymanager-service + + + org.apache.commons + commons-lang3 + + + io.mosip.kernel + kernel-core + + + commons-io + commons-io + + + + + io.mosip.kernel + kernel-websubclient-api + 1.2.0.1 + + + io.mosip.kernel + kernel-core + + + + + org.mvel + mvel2 + 2.4.7.Final + + + io.mosip.kernel + kernel-cbeffutil-api + ${kernel-cbeffutil-api.version} + + + io.mosip.kernel + kernel-core + + + + + io.mosip.preregistration + pre-registration-application-service + ${pre-registration-application-service.version} + lib + + + io.mosip.kernel + kernel-core + + + io.mosip.kernel + kernel-logger-logback + + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + io.mosip.kernel + kernel-idobjectvalidator + ${kernel.idobjectvalidator.version} + + + commons-io + commons-io + 2.11.0 + + + com.nimbusds + nimbus-jose-jwt + 9.37.4 + + + com.itextpdf + itextpdf + 5.5.13.3 + + + io.mosip.kernel + kernel-pdfgenerator-itext + 1.2.0.1-B1 + + + org.springframework.security + spring-security-test + 5.3.3.RELEASE + test + + + org.bitbucket.b_c + jose4j + 0.9.3 + - + + + ossrh + https://central.sonatype.com/repository/maven-snapshots/ + + + ossrh + https://central.sonatype.com/api/v1/publisher + + + org.springframework.boot @@ -173,6 +454,9 @@ build-info repackage + + false + @@ -185,7 +469,7 @@ io.mosip.kernel kernel-auth-adapter - ${project.version} + 1.2.0.1 org.springframework.boot @@ -204,8 +488,21 @@ ZIP + + + build-info-repackage + + build-info + repackage + + + false + + + pre-integration-test + pre-integration-test start @@ -222,18 +519,14 @@ + post-integration-test + post-integration-test stop - - - build-info - repackage - - diff --git a/resident/resident-service/src/main/java/io/mosip/resident/ResidentBootApplication.java b/resident/resident-service/src/main/java/io/mosip/resident/ResidentBootApplication.java index e377941a126..21da8913a87 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/ResidentBootApplication.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/ResidentBootApplication.java @@ -1,15 +1,32 @@ -package io.mosip.resident; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication(scanBasePackages = { "io.mosip.resident.*", "io.mosip.kernel.core.*", - "io.mosip.kernel.crypto.jce.*", "io.mosip.commons.packet.*", "io.mosip.kernel.keygenerator.bouncycastle.*", - "${mosip.auth.adapter.impl.basepackage}" }) -public class ResidentBootApplication { - - public static void main(String[] args) { - SpringApplication.run(ResidentBootApplication.class, args); - } - -} +package io.mosip.resident; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; + +import io.mosip.idrepository.core.util.TokenIDGenerator; +import io.mosip.kernel.authcodeflowproxy.api.validator.ValidateTokenUtil; +import io.mosip.kernel.cbeffutil.impl.CbeffImpl; +import io.mosip.kernel.dataaccess.hibernate.config.HibernateDaoConfig; +import io.mosip.preregistration.application.service.TransliterationService; +import io.mosip.preregistration.application.service.util.TransliterationServiceUtil; + +@SpringBootApplication(scanBasePackages = { + "io.mosip.resident.*", + "io.mosip.kernel.core.*", + "io.mosip.kernel.dataaccess.hibernate.*", + "io.mosip.kernel.crypto.jce.*", + "io.mosip.commons.packet.*", + "io.mosip.kernel.keygenerator.bouncycastle.*", + "${mosip.auth.adapter.impl.basepackage}", + "io.mosip.kernel.virusscanner.*", + "io.mosip.commons.khazana.*", + "io.mosip.idrepository.core.util.*"},exclude = HibernateDaoConfig.class) +@Import({TokenIDGenerator.class, ValidateTokenUtil.class, CbeffImpl.class, TransliterationService.class, TransliterationServiceUtil.class}) +public class ResidentBootApplication { + + public static void main(String[] args) { + SpringApplication.run(ResidentBootApplication.class, args); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseLoggingAspect.java b/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseLoggingAspect.java new file mode 100644 index 00000000000..47ab6e27a3e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseLoggingAspect.java @@ -0,0 +1,41 @@ +package io.mosip.resident.aspect; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; + +/** + * Aspect class for database logging + * + * @author Ritik Jain + */ +@Component +@Aspect +@EnableAspectJAutoProxy +@ConditionalOnProperty(value = "resident.db.logging.aspect.enabled", havingValue = "true", matchIfMissing = false) +public class DatabaseLoggingAspect { + + private static final Logger logger = LoggerConfiguration.logConfig(DatabaseLoggingAspect.class); + + @Pointcut("execution(* io.mosip.resident.repository.ResidentTransactionRepository.*(..))") + public void loggableMethods() { + } + + @Around("loggableMethods()") + public Object aroundAdvice(ProceedingJoinPoint jp) throws Throwable { + logger.debug("Executing method => " + jp.getSignature()); + long beforeExecutionTime = System.currentTimeMillis(); + Object result = jp.proceed(); + long afterExecutionTime = System.currentTimeMillis(); + logger.debug( + "Time taken by '" + jp.getSignature() + "' is " + (afterExecutionTime - beforeExecutionTime) + "ms."); + return result; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseMetricsAspect.java b/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseMetricsAspect.java new file mode 100644 index 00000000000..b1723465a0f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/aspect/DatabaseMetricsAspect.java @@ -0,0 +1,51 @@ +package io.mosip.resident.aspect; + +import static io.mosip.resident.constant.ResidentConstants.DB_QUERY_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.DB_QUERY_RESPONSE_TIME_ID; + +import java.util.concurrent.TimeUnit; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.stereotype.Component; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; +/** + * Aspect class for database metrics to record the query time metrics + * + * @author Loganathan S + */ +@Component +@Aspect +@EnableAspectJAutoProxy +@ConditionalOnProperty(value = "resident.db.metrics.aspect.enabled", havingValue = "true", matchIfMissing = false) +public class DatabaseMetricsAspect { + + @Autowired + private MeterRegistry registry; + + @Pointcut("execution(* io.mosip.resident.repository.ResidentTransactionRepository.*(..))") + public void repositoryMethods() { + } + + @Around("repositoryMethods()") + public Object aroundAdvice(ProceedingJoinPoint jp) throws Throwable { + Timer timer = Timer.builder(DB_QUERY_RESPONSE_TIME_ID) + .tag("label", DB_QUERY_RESPONSE_TIME_DESCRIPTION) + .tag("queryMethod", jp.getSignature().toShortString()) + .tag("service", "resident") + .publishPercentileHistogram(true) + .publishPercentiles(0.5, 0.95, 0.99) + .register(registry); + long start = System.nanoTime(); + Object result = jp.proceed(); + timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS); + return result; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/aspect/LoginCheck.java b/resident/resident-service/src/main/java/io/mosip/resident/aspect/LoginCheck.java new file mode 100644 index 00000000000..27af848cc59 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/aspect/LoginCheck.java @@ -0,0 +1,246 @@ +package io.mosip.resident.aspect; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.interfaces.Claim; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.entity.ResidentSessionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentSessionRepository; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utility; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.stereotype.Component; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.HttpCookie; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +/** + * Aspect class for login redirect API + * + * @author Ritik Jain + */ +@Component +@Aspect +@EnableAspectJAutoProxy +public class LoginCheck { + + private static final String SET_COOKIE = "Set-Cookie"; + private static final String USER_AGENT = "User-Agent"; + private static final String WINDOWS = "Windows"; + private static final String MAC = "Mac"; + private static final String UNIX = "Unix"; + private static final String X11 = "x11"; + private static final String ANDROID = "Android"; + private static final String IPHONE = "IPhone"; + private static final CharSequence AUTHORIZATION_TOKEN = "Authorization"; + private static final int resStatusCode = 302; + + @Autowired + private ResidentSessionRepository residentSessionRepository; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private Utility utility; + + @Autowired + private AuditUtil audit; + + @Autowired + private ThreadPoolTaskScheduler taskScheduler; + + @Value("${auth.token.header:Authorization}") + private String authTokenHeader; + + @Value("${mosip.resident.oidc.auth_token.expiry.claim-name:exp}") + private String expiryClaimName; + + private static final Logger logger = LoggerConfiguration.logConfig(LoginCheck.class); + + @After("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.loginRedirect(..)) && args(redirectURI,state,sessionState,code,stateCookie,req,res)") + public void getUserDetails(String redirectURI, String state, String sessionState, String code, String stateCookie, + HttpServletRequest req, HttpServletResponse res) throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("LoginCheck::getUserDetails()::entry"); + String idaToken = ""; + String sessionId = ""; + Collection cookies = res.getHeaders(SET_COOKIE); + for (String cookie : cookies) { + if (cookie.contains(AUTHORIZATION_TOKEN)) { + Optional authorizationCookie = getCookieValueFromHeader(cookie); + if (authorizationCookie.isPresent()) { + String accessToken = authorizationCookie.get(); + Claim decodedToken = JWT.decode(accessToken).getClaim(expiryClaimName); + Date expDate = decodedToken.asDate(); + logger.info("Scheduling clearing auth token cache after : " + expDate); + taskScheduler.schedule(() -> { + if(accessToken!=null && !accessToken.isEmpty()) { + utility.clearUserInfoCache(accessToken); + utility.clearIdentityMapCache(accessToken); + } + }, expDate); + idaToken = identityServiceImpl.getResidentIdaTokenFromAccessToken(accessToken); + sessionId = identityServiceImpl.createSessionId(); + } + break; + } + } + if(idaToken!=null && !idaToken.isEmpty() && sessionId != null && !sessionId.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.LOGIN_REQ_SUCCESS); + ResidentSessionEntity newSessionData = new ResidentSessionEntity(sessionId, idaToken, DateUtils.getUTCCurrentDateTime(), + utility.getClientIp(req), req.getRemoteHost(), getMachineType(req)); + residentSessionRepository.save(newSessionData); + } else { + audit.setAuditRequestDto(AuditEnum.LOGIN_REQ_FAILURE); + } + logger.debug("LoginCheck::getUserDetails()::exit"); + } + + @After("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.loginRedirect(..)) && args(redirectURI,state,sessionState,code,error,stateCookie,req,res)") + public void getUserDetails(String redirectURI, String state, String sessionState, String code, String error, String stateCookie, + HttpServletRequest req, HttpServletResponse res) throws ResidentServiceCheckedException, ApisResourceAccessException { + getUserDetails(redirectURI, state, sessionState, code, stateCookie, req, res); + } + + + @Pointcut(value = "execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.login(..))") + public void login() { + } + + @AfterThrowing(pointcut = "login()", throwing = "e") + public void onLoginReqFailure(RuntimeException e) { + logger.debug("LoginCheck::onLoginReqFailure()::entry"); + audit.setAuditRequestDto(AuditEnum.LOGIN_REQ_FAILURE); + } + + @Before("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.login(..)) && args(state,redirectURI,stateParam,res)") + public void onLoginReq(String state, String redirectURI, String stateParam, HttpServletResponse res) { + logger.debug("LoginCheck::onLoginReq()::entry"); + if (res.getStatus() == resStatusCode) { + audit.setAuditRequestDto(AuditEnum.LOGIN_REQ); + } + logger.debug("LoginCheck::onLoginReq()::exit"); + } + + @Before("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.login(..)) && args(state,redirectURI,stateParam,uiLocales,res)") + public void onLoginReq(String state, String redirectURI, String stateParam, String uiLocales, HttpServletResponse res) { + onLoginReq(state, redirectURI, stateParam, res); + } + + @Pointcut(value = "execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.loginRedirect(..))") + public void loginRedirect() { + } + + @AfterThrowing(pointcut = "loginRedirect()", throwing = "e") + public void onLoginFailure(RuntimeException e) { + logger.debug("LoginCheck::onLoginFailure()::entry"); + audit.setAuditRequestDto(AuditEnum.LOGIN_REQ_FAILURE); + } + + @After("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.logoutUser(..)) && args(token,redirectURI,res)") + public void onLogoutSuccess(String token, String redirectURI, HttpServletResponse res) throws ApisResourceAccessException { + logger.debug("LoginCheck::onLogoutSuccess()::entry"); + audit.setAuditRequestDto(AuditEnum.LOGOUT_REQ); + if (res.getStatus() == resStatusCode) { + audit.setAuditRequestDto(AuditEnum.LOGOUT_REQ_SUCCESS); + } else { + audit.setAuditRequestDto(AuditEnum.LOGOUT_REQ_FAILURE); + } + if(token!=null && !token.isEmpty()){ + utility.clearUserInfoCache(token); + utility.clearIdentityMapCache(token); + } + logger.debug("LoginCheck::onLogoutSuccess()::exit"); + } + + @Pointcut(value = "execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.logoutUser(..))") + public void logoutUser() { + } + + @AfterThrowing(pointcut = "logoutUser()", throwing = "e") + public void onLogoutFailure(RuntimeException e) { + logger.debug("LoginCheck::onLogoutFailure()::entry"); + audit.setAuditRequestDto(AuditEnum.LOGOUT_REQ_FAILURE); + } + + @After("execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.validateAdminToken(..)) && args(request,res)") + public void onValidateTokenSuccess(HttpServletRequest request, HttpServletResponse res) { + logger.debug("LoginCheck::onValidateTokenSuccess()::entry"); + String authToken = null; + Cookie[] cookies = request.getCookies(); + for (Cookie cookie : cookies) { + if (cookie.getName().contains(authTokenHeader)) { + authToken = cookie.getValue(); + audit.setAuditRequestDto(AuditEnum.VALIDATE_TOKEN_SUCCESS); + } + } + if (authToken == null) { + audit.setAuditRequestDto(AuditEnum.VALIDATE_TOKEN_FAILURE); + } + logger.debug("LoginCheck::onValidateTokenSuccess()::exit"); + } + + @Pointcut(value = "execution(* io.mosip.kernel.authcodeflowproxy.api.controller.LoginController.validateAdminToken(..))") + public void validateAdminToken() { + } + + @AfterThrowing(pointcut = "validateAdminToken()", throwing = "e") + public void onValidateTokenFailure(RuntimeException e) { + logger.debug("LoginCheck::onValidateTokenFailure()::entry"); + audit.setAuditRequestDto(AuditEnum.VALIDATE_TOKEN_FAILURE); + } + + private Optional getCookieValueFromHeader(String cookie) { + logger.debug("LoginCheck::getCookieValueFromHeader()::entry"); + List httpCookieList = HttpCookie.parse(cookie); + if (!httpCookieList.isEmpty()) { + HttpCookie httpCookie = httpCookieList.get(0); + String value = httpCookie.getValue(); + logger.debug("LoginCheck::getCookieValueFromHeader()::exit"); + return Optional.of(value); + } + logger.debug("LoginCheck::getCookieValueFromHeader()::exit - cookie is empty"); + return Optional.empty(); + } + + private String getMachineType(HttpServletRequest req) { + logger.debug("LoginCheck::getMachineType()::entry"); + String userAgent = req.getHeader(USER_AGENT); + + String os = ""; + if (userAgent.toLowerCase().indexOf(WINDOWS.toLowerCase()) >= 0) { + os = WINDOWS; + } else if (userAgent.toLowerCase().indexOf(MAC.toLowerCase()) >= 0) { + os = MAC; + } else if (userAgent.toLowerCase().indexOf(X11) >= 0) { + os = UNIX; + } else if (userAgent.toLowerCase().indexOf(ANDROID.toLowerCase()) >= 0) { + os = ANDROID; + } else if (userAgent.toLowerCase().indexOf(IPHONE.toLowerCase()) >= 0) { + os = IPHONE; + } else { + os = "UnKnown, More-Info: " + userAgent; + } + logger.debug("LoginCheck::getMachineType()::exit"); + return os; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJob.java b/resident/resident-service/src/main/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJob.java new file mode 100644 index 00000000000..9544eef8e7f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJob.java @@ -0,0 +1,147 @@ +package io.mosip.resident.batch; + +import static io.mosip.resident.constant.EventStatusFailure.FAILED; +import static io.mosip.resident.constant.ResidentConstants.CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY; +import static io.mosip.resident.constant.ResidentConstants.CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY_DEFAULT; +import static io.mosip.resident.constant.ResidentConstants.CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL; +import static io.mosip.resident.constant.ResidentConstants.CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL_DEFAULT; +import static io.mosip.resident.constant.ResidentConstants.IS_CREDENTIAL_STATUS_UPDATE_JOB_ENABLED; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.type.TypeReference; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.function.RunnableWithException; +import io.mosip.resident.helper.CredentialStatusUpdateHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; + +/** + * @author Manoj SP + * @author Loganathan S + * + */ +@Component +@ConditionalOnProperty(name = IS_CREDENTIAL_STATUS_UPDATE_JOB_ENABLED, havingValue = "true", matchIfMissing = true) +public class CredentialStatusUpdateBatchJob { + + private final Logger logger = LoggerConfiguration.logConfig(CredentialStatusUpdateBatchJob.class); + + + @Autowired + private ResidentTransactionRepository repo; + + @Value("#{'${resident.async.request.types}'.split(',')}") + private List requestTypeCodesToProcessInBatchJob; + + @Autowired + private CredentialStatusUpdateHelper credentialStatusUpdateHelper; + + @Autowired + private Environment env; + + @Autowired + @Qualifier("restClientWithSelfTOkenRestTemplate") + private ResidentServiceRestClient residentServiceRestClient; + + private void handleWithTryCatch(RunnableWithException runnableWithException) { + try { + runnableWithException.run(); + } catch (ApisResourceAccessException | ResidentServiceCheckedException | ResidentServiceException | + IdRepoAppException e) { + logErrorForBatchJob(e); + } + } + + private void logErrorForBatchJob(Exception e) { + logger.debug(String.format("Error in batch job: %s : %s : %s", e.getClass().getSimpleName(), e.getMessage(), + (e.getCause() != null ? "rootcause: " + e.getCause().getMessage() : ""))); + } + + @Scheduled(initialDelayString = "${" + CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY + ":" + + CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY_DEFAULT + "}", fixedDelayString = "${" + + CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL + ":" + CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL_DEFAULT + + "}") + public void scheduleCredentialStatusUpdateJob() throws ResidentServiceCheckedException { + List residentTxnList = repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc( + getStatusCodesToProcess(), requestTypeCodesToProcessInBatchJob); + logger.debug("Total records picked from resident_transaction table for processing is " + residentTxnList.size()); + for (ResidentTransactionEntity txn : residentTxnList) { + logger.debug("Processing event:" + txn.getEventId()); + if (txn.getIndividualId() == null) { + txn.setStatusCode(FAILED.name()); + txn.setStatusComment("individualId is null"); + credentialStatusUpdateHelper.updateEntity(txn); + credentialStatusUpdateHelper.saveEntity(txn); + } else { + handleWithTryCatch(() -> updateTransactionStatus(txn)); + } + } + } + + public void updateTransactionStatus(ResidentTransactionEntity txn) + throws ResidentServiceCheckedException, ApisResourceAccessException { + String requestTypeCode = txn.getRequestTypeCode(); + if (requestTypeCodesToProcessInBatchJob.contains(requestTypeCode)) { + RequestType requestType = RequestType.getRequestTypeFromString(requestTypeCode); + // If it is already a success / failed status, do not process it. + if (!requestType.isSuccessOrFailedStatus(env, txn.getStatusCode())) { + Map credentialStatus = getCredentialStatusForEntity(txn); + credentialStatusUpdateHelper.updateStatus(txn, credentialStatus); + } + } + } + + public List getStatusCodesToProcess() { + return RequestType.getAllNewOrInprogressStatusList(env); + } + + private Map getCredentialEventDetails(String credentialRequestId, ResidentTransactionEntity txn) + throws ResidentServiceCheckedException, ApisResourceAccessException { + Object object = residentServiceRestClient.getApi(ApiName.CREDENTIAL_STATUS_URL, List.of(credentialRequestId), + Collections.emptyList(), Collections.emptyList(), ResponseWrapper.class); + ResponseWrapper> responseWrapper = JsonUtil.convertValue(object, + new TypeReference>>() { + }); + List errors = responseWrapper.getErrors(); + if (Objects.nonNull(errors) && !errors.isEmpty()) { + logger.debug("CREDENTIAL_STATUS_URL returned error " + errors); + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION); + } + return responseWrapper.getResponse(); + } + + private Map getCredentialStatusForEntity(ResidentTransactionEntity txn) + throws ResidentServiceCheckedException, ApisResourceAccessException { + if (txn.getCredentialRequestId() != null && !txn.getCredentialRequestId().isEmpty()) { + Map eventDetails = getCredentialEventDetails(txn.getCredentialRequestId(), txn); + return eventDetails; + } + return Map.of(); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/config/Config.java b/resident/resident-service/src/main/java/io/mosip/resident/config/Config.java index 6564737f2b1..d16688eb94f 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/config/Config.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/config/Config.java @@ -1,78 +1,193 @@ -package io.mosip.resident.config; - -import io.mosip.kernel.core.templatemanager.spi.TemplateManager; -import io.mosip.kernel.keygenerator.bouncycastle.KeyGenerator; -import io.mosip.kernel.templatemanager.velocity.impl.TemplateManagerImpl; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.log.NullLogChute; -import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; -import org.apache.velocity.runtime.resource.loader.FileResourceLoader; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.client.RestTemplate; - -import com.fasterxml.jackson.module.afterburner.AfterburnerModule; - -import javax.servlet.Filter; -import java.nio.charset.StandardCharsets; -import java.util.Properties; - - -@Configuration -@EnableScheduling -public class Config { - private String defaultEncoding = StandardCharsets.UTF_8.name(); - /** The resource loader. */ - private String resourceLoader = "classpath"; - - /** The template path. */ - private String templatePath = "."; - - /** The cache. */ - private boolean cache = Boolean.TRUE; - - - @Bean - public FilterRegistrationBean registerReqResFilter() { - FilterRegistrationBean corsBean = new FilterRegistrationBean<>(); - corsBean.setFilter(getReqResFilter()); - corsBean.setOrder(1); - return corsBean; - } - - @Bean - public Filter getReqResFilter() { - return new ReqResFilter(); - } - - @Bean - public KeyGenerator keyGenerator() { - return new KeyGenerator(); - } - - @Bean - public TemplateManager getTemplateManager() { - final Properties properties = new Properties(); - properties.put(RuntimeConstants.INPUT_ENCODING, defaultEncoding); - properties.put(RuntimeConstants.OUTPUT_ENCODING, defaultEncoding); - properties.put(RuntimeConstants.ENCODING_DEFAULT, defaultEncoding); - properties.put(RuntimeConstants.RESOURCE_LOADER, resourceLoader); - properties.put(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, templatePath); - properties.put(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, cache); - properties.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogChute.class.getName()); - properties.put("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); - properties.put("file.resource.loader.class", FileResourceLoader.class.getName()); - VelocityEngine engine = new VelocityEngine(properties); - engine.init(); - return new TemplateManagerImpl(engine); - } - - @Bean - public AfterburnerModule afterburnerModule() { - return new AfterburnerModule(); - } -} +package io.mosip.resident.config; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.servlet.Filter; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.log.NullLogChute; +import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; +import org.apache.velocity.runtime.resource.loader.FileResourceLoader; +import org.mvel2.MVEL; +import org.mvel2.integration.VariableResolverFactory; +import org.mvel2.integration.impl.MapVariableResolverFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.task.TaskExecutor; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.module.afterburner.AfterburnerModule; + +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.keygenerator.bouncycastle.KeyGenerator; +import io.mosip.kernel.templatemanager.velocity.impl.TemplateManagerImpl; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.interceptor.RestTemplateLoggingInterceptor; +import io.mosip.resident.interceptor.RestTemplateMetricsInterceptor; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + + +@Configuration +@EnableScheduling +@EnableAsync +public class Config { + private String defaultEncoding = StandardCharsets.UTF_8.name(); + /** The resource loader. */ + private String resourceLoader = "classpath"; + + /** The template path. */ + private String templatePath = "."; + + /** The cache. */ + private boolean cache = Boolean.TRUE; + + @Value("${resident-data-format-mvel-file-source}") + private Resource mvelFile; + + @Value("${" + ResidentConstants.RESIDENT_REST_TEMPLATE_LOGGING_INTERCEPTOR_FILTER_ENABLED + ":false}") + private boolean isResidentLoggingInterceptorFilterEnabled; + + @Value("${" + ResidentConstants.RESIDENT_REST_TEMPLATE_METRICS_INTERCEPTOR_FILTER_ENABLED + ":false}") + private boolean isResidentMetricsInterceptorFilterEnabled; + + + @Autowired(required = false) + private RestTemplateLoggingInterceptor restTemplateLoggingInterceptor; + + @Autowired(required = false) + private RestTemplateMetricsInterceptor restTemplateMetricsInterceptor; + + @Autowired + private Environment env; + + @Bean("varres") + public VariableResolverFactory getVariableResolverFactory() { + String mvelExpression = Utility.readResourceContent(mvelFile); + VariableResolverFactory functionFactory = new MapVariableResolverFactory(); + MVEL.eval(mvelExpression, functionFactory); + return functionFactory; + } + + @Bean + public FilterRegistrationBean registerReqResFilter() { + FilterRegistrationBean corsBean = new FilterRegistrationBean<>(); + corsBean.setFilter(getReqResFilter()); + corsBean.setOrder(1); + return corsBean; + } + + @Bean + public Filter getReqResFilter() { + return new ReqResFilter(); + } + + @Bean + public KeyGenerator keyGenerator() { + return new KeyGenerator(); + } + + @Bean + public TemplateManager getTemplateManager() { + final Properties properties = new Properties(); + properties.put(RuntimeConstants.INPUT_ENCODING, defaultEncoding); + properties.put(RuntimeConstants.OUTPUT_ENCODING, defaultEncoding); + properties.put(RuntimeConstants.ENCODING_DEFAULT, defaultEncoding); + properties.put(RuntimeConstants.RESOURCE_LOADER, resourceLoader); + properties.put(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, templatePath); + properties.put(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, cache); + properties.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogChute.class.getName()); + properties.put("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); + properties.put("file.resource.loader.class", FileResourceLoader.class.getName()); + VelocityEngine engine = new VelocityEngine(properties); + engine.init(); + return new TemplateManagerImpl(engine); + } + + @Bean + public AfterburnerModule afterburnerModule() { + return new AfterburnerModule(); + } + + @Bean("restClientWithSelfTOkenRestTemplate") + @Primary + public ResidentServiceRestClient selfTokenRestClient(@Qualifier("selfTokenRestTemplate")RestTemplate residentRestTemplate) { + addInterceptors(residentRestTemplate); + return new ResidentServiceRestClient(residentRestTemplate); + } + + private void addLoggingInterceptor(RestTemplate restTemplate) { + if(isResidentLoggingInterceptorFilterEnabled) { + List interceptors + = restTemplate.getInterceptors(); + if (CollectionUtils.isEmpty(interceptors)) { + interceptors = new ArrayList<>(); + } + interceptors.add(restTemplateLoggingInterceptor); + restTemplate.setInterceptors(interceptors); + } + } + + private void addMetricsInterceptor(RestTemplate restTemplate) { + if(isResidentMetricsInterceptorFilterEnabled) { + List interceptors + = restTemplate.getInterceptors(); + if (CollectionUtils.isEmpty(interceptors)) { + interceptors = new ArrayList<>(); + } + interceptors.add(restTemplateMetricsInterceptor); + restTemplate.setInterceptors(interceptors); + } + } + + @Bean("restClientWithPlainRestTemplate") + public ResidentServiceRestClient plainRestClient(@Qualifier("restTemplate")RestTemplate restTemplate) { + addInterceptors(restTemplate); + return new ResidentServiceRestClient(restTemplate); + } + + private void addInterceptors(RestTemplate restTemplate) { + addLoggingInterceptor(restTemplate); + addMetricsInterceptor(restTemplate); + } + + @Bean + public ThreadPoolTaskScheduler threadPoolTaskScheduler() { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.setPoolSize(5); + threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); + return threadPoolTaskScheduler; + } + + @Bean + @Qualifier("AsyncExecutor") + public TaskExecutor AsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(Math.floorDiv(env.getProperty("mosip.resident.async-core-pool-size", Integer.class, 100), 4)); + executor.setMaxPoolSize(env.getProperty("mosip.resident.async-max-pool-size", Integer.class, 100)); + executor.setThreadNamePrefix("Async-audit"); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.initialize(); + return new DelegatingSecurityContextAsyncTaskExecutor(executor); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/config/LoggerConfiguration.java b/resident/resident-service/src/main/java/io/mosip/resident/config/LoggerConfiguration.java index fe97bf0271f..f257c0e3d59 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/config/LoggerConfiguration.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/config/LoggerConfiguration.java @@ -1,7 +1,6 @@ package io.mosip.resident.config; import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.logger.logback.appender.ConsoleAppender; import io.mosip.kernel.logger.logback.factory.Logfactory; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/config/OpenApiProperties.java b/resident/resident-service/src/main/java/io/mosip/resident/config/OpenApiProperties.java index fef0500314b..365522e85a8 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/config/OpenApiProperties.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/config/OpenApiProperties.java @@ -1,10 +1,11 @@ package io.mosip.resident.config; -import lombok.Data; +import java.util.List; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import java.util.List; +import lombok.Data; @Configuration @ConfigurationProperties(prefix = "openapi") diff --git a/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentDataSourceConfig.java b/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentDataSourceConfig.java new file mode 100644 index 00000000000..fd194ce0719 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentDataSourceConfig.java @@ -0,0 +1,37 @@ +package io.mosip.resident.config; + +/** + * @author Neha Farheen + * + */ +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import io.mosip.kernel.dataaccess.hibernate.config.HibernateDaoConfig; +import io.mosip.kernel.dataaccess.hibernate.repository.impl.HibernateRepositoryImpl; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.interceptor.ResidentEntityInterceptor; +import io.mosip.resident.repository.OtpTransactionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.repository.ResidentUserRepository; + +@Configuration +@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackageClasses = { + ResidentTransactionRepository.class, ResidentUserRepository.class, + OtpTransactionRepository.class }, basePackages = "io.mosip.resident.repository.*", repositoryBaseClass = HibernateRepositoryImpl.class) +@EntityScan(basePackageClasses = { ResidentTransactionEntity.class }) +public class ResidentDataSourceConfig extends HibernateDaoConfig { + + @Autowired + private ResidentEntityInterceptor interceptor; + + public Map jpaProperties() { + Map jpaProperties = super.jpaProperties(); + jpaProperties.put("hibernate.ejb.interceptor", interceptor); + return jpaProperties; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentFilterConfig.java b/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentFilterConfig.java new file mode 100644 index 00000000000..631b38d91fe --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/config/ResidentFilterConfig.java @@ -0,0 +1,49 @@ +package io.mosip.resident.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.mosip.resident.filter.LoggingFilter; +import io.mosip.resident.filter.WebsubCallbackRequestDecoratorFilter; + +/** + * The configuration for adding filters. + * + * @author Loganathan S + */ + +@Configuration +public class ResidentFilterConfig { + + @Value("${resident.logging.filter.url.pattern:/*}") + private String loggingFilterUrlPattern; + + /** + * Gets the auth filter. + * + * @return the auth filter + */ + @Bean + @ConditionalOnProperty(value = "resident.logging.filter.enabled", havingValue = "true", matchIfMissing = false) + public FilterRegistrationBean getLoggingFilter(LoggingFilter loggingFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(loggingFilter); + registrationBean.addUrlPatterns(loggingFilterUrlPattern); + return registrationBean; + } + + @Bean + @ConditionalOnProperty(value = "resident.websub.request.decorator.filter.enabled", havingValue = "true", matchIfMissing = true) + public FilterRegistrationBean getWebsubCallbackRequestDecoratorFilter( + @Autowired(required = false) WebsubCallbackRequestDecoratorFilter loggingFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(loggingFilter); + registrationBean.addUrlPatterns("/callback/*"); + return registrationBean; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/ApiName.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/ApiName.java index ec2383afd8f..1265fd680ae 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/ApiName.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/ApiName.java @@ -36,6 +36,8 @@ public enum ApiName { IDAUTHREVOKEVID, + RETRIEVE_VIDS, + PACKETMANAGER_CREATE, MIDSCHEMAURL, @@ -57,6 +59,35 @@ public enum ApiName { MACHINESEARCH, MACHINECREATE, - PARTNER_API_URL, DECRYPT_API_URL, OTP_GEN_URL, POLICY_REQ_URL; + PARTNER_API_URL, DECRYPT_API_URL, OTP_GEN_URL, POLICY_REQ_URL, + + VALID_DOCUMENT_BY_LANGCODE_URL, + LOCATION_HIERARCHY_LEVEL_BY_LANGCODE_URL, + LOCATION_HIERARCHY, + IMMEDIATE_CHILDREN_BY_LOCATIONCODE_AND_LANGCODE_URL, + LOCATION_INFO_BY_LOCCODE_AND_LANGCODE_URL, + COORDINATE_SPECIFIC_REGISTRATION_CENTERS_URL, + APPLICANT_VALID_DOCUMENT_URL, + REGISTRATION_CENTER_FOR_LOCATION_CODE_URL, + REGISTRATION_CENTER_BY_LOCATION_TYPE_AND_SEARCH_TEXT_PAGINATED_URL, + IDREPO_IDENTITY_URL, + WORKING_DAYS_BY_REGISTRATION_ID, + LATEST_ID_SCHEMA_URL, + PARTNER_SERVICE_URL, + RESIDENT_REQ_CREDENTIAL_URL, + DIGITAL_CARD_STATUS_URL, + GET_ORDER_STATUS_URL, + TEMPLATES_BY_LANGCODE_AND_TEMPLATETYPECODE_URL, + IDREPO_IDENTITY_UPDATE_COUNT, + DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME, + GET_RID_BY_INDIVIDUAL_ID, + PDFSIGN, + PARTNER_DETAILS_NEW_URL, + DOCUMENT_TYPE_BY_DOCUMENT_CATEGORY_AND_LANG_CODE, + GET_RID_STATUS, + DYNAMIC_FIELD_BASED_ON_FIELD_NAME, + IMMEDIATE_CHILDREN_BY_LOCATION_CODE, + IDREPO_IDENTITY_GET_DRAFT_UIN, + IDREPO_IDENTITY_DISCARD_DRAFT; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/AuthTypeStatus.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/AuthTypeStatus.java index 39866dc535b..d6ecbbf4603 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/AuthTypeStatus.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/AuthTypeStatus.java @@ -1,12 +1,12 @@ -/** - * - */ -package io.mosip.resident.constant; - -/** - * @author M1022006 - * - */ -public enum AuthTypeStatus { - LOCK, UNLOCK; -} +/** + * + */ +package io.mosip.resident.constant; + +/** + * @author M1022006 + * + */ +public enum AuthTypeStatus { + LOCK, UNLOCK; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/CardType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/CardType.java index c81107ff6d3..9168c1818cf 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/CardType.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/CardType.java @@ -1,8 +1,8 @@ -package io.mosip.resident.constant; - -public enum CardType { - /** The uin. */ - UIN, - /** The masked uin. */ - MASKED_UIN; -} +package io.mosip.resident.constant; + +public enum CardType { + /** The uin. */ + UIN, + /** The masked uin. */ + MASKED_UIN; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/ConsentStatusType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/ConsentStatusType.java new file mode 100644 index 00000000000..c2cb3823f0c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/ConsentStatusType.java @@ -0,0 +1,20 @@ +package io.mosip.resident.constant; + +/** + * Enum to check the consent status + * + * @author Neha Farheen + */ +public enum ConsentStatusType { + ACCEPTED, DENIED; + + public static boolean containsStatus(String status) { + for (ConsentStatusType consentStatus : ConsentStatusType.values()) { + if (consentStatus.name().equalsIgnoreCase(status)) { + return true; + } + } + return false; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatus.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatus.java new file mode 100644 index 00000000000..0f3de7a41d1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatus.java @@ -0,0 +1,20 @@ +package io.mosip.resident.constant; + +import java.util.Optional; +import java.util.stream.Stream; + +/** + * Enum to store the event status + * @author Kamesh Shekhar Prasad + */ +public enum EventStatus { + FAILED, SUCCESS, IN_PROGRESS, CANCELED, ALL; + + + public static Optional getEventStatusForText(String status) { + return Stream.of(values()) + .filter(event -> event.name() + .equalsIgnoreCase(status.trim())) + .findAny(); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusCanceled.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusCanceled.java new file mode 100644 index 00000000000..59b3a0e93f9 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusCanceled.java @@ -0,0 +1,20 @@ +package io.mosip.resident.constant; + +/** + * Enum to store the event status canceled + * + * @author Kamesh Shekhar Prasad + */ +public enum EventStatusCanceled { + CANCELED; + + public static boolean containsStatus(String status) { + for (EventStatusCanceled eventStatusCanceled : EventStatusCanceled.values()) { + if (eventStatusCanceled.name().equals(status)) { + return true; + } + } + return false; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusFailure.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusFailure.java new file mode 100644 index 00000000000..56d7f83ca32 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusFailure.java @@ -0,0 +1,24 @@ +package io.mosip.resident.constant; + +/** + * Enum to store the event status Failure + * @author Kamesh Shekhar Prasad + */ +public enum EventStatusFailure { + AUTHENTICATION_FAILED, + FAILED, + PAYMENT_FAILED, + REJECTED, + REPROCESS_FAILED, + OTP_VERIFICATION_FAILED, + N; + + public static boolean containsStatus(String status) { + for (EventStatusFailure eventStatusFailure : EventStatusFailure.values()) { + if (eventStatusFailure.name().equals(status)) { + return true; + } + } + return false; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusInProgress.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusInProgress.java new file mode 100644 index 00000000000..58b0dc3d088 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusInProgress.java @@ -0,0 +1,31 @@ +package io.mosip.resident.constant; + +/** + * Enum to store the event status in-progress + * + * @author Ritik Jain + */ +public enum EventStatusInProgress { + NEW, + ISSUED, + PAYMENT_CONFIRMED, + PRINTING, + IN_TRANSIT, + PROCESSING, + PAUSED, + RESUMABLE, + REPROCESS, + PAUSED_FOR_ADDITIONAL_INFO, + OTP_REQUESTED, + IDENTITY_UPDATED; + + public static boolean containsStatus(String status) { + for (EventStatusInProgress eventStatusInProgress : EventStatusInProgress.values()) { + if (eventStatusInProgress.name().equals(status)) { + return true; + } + } + return false; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusSuccess.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusSuccess.java new file mode 100644 index 00000000000..be6bd333792 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/EventStatusSuccess.java @@ -0,0 +1,39 @@ +package io.mosip.resident.constant; + +/** +Enum to store the event status success +@author Kamesh Shekhar Prasad + */ +public enum EventStatusSuccess { + AUTHENTICATION_SUCCESSFULL, + STORED, + CARD_READY_TO_DOWNLOAD, + CARD_DOWNLOADED, + CARD_DELIVERED, + RECEIVED, + DATA_SHARED_SUCCESSFULLY, + LOCKED, + UNLOCKED, + AUTHENTICATION_TYPE_LOCKED, + AUTHENTICATION_TYPE_UNLOCKED, + PROCESSED, + DATA_UPDATED, + VID_GENERATED, + VID_REVOKED, + EMAIL_VERIFIED, + PHONE_VERIFIED, + OTP_VERIFIED, + COMPLETED, + AUTHENTICATION_TYPE_UPDATED, + PHYSICAL_CARD_ORDERED, + Y; + + public static boolean containsStatus(String status) { + for (EventStatusSuccess eventStatusSuccess : EventStatusSuccess.values()) { + if (eventStatusSuccess.name().equals(status)) { + return true; + } + } + return false; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/IdType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/IdType.java index 9e7a34bf45a..e54757e56d4 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/IdType.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/IdType.java @@ -1,5 +1,5 @@ -package io.mosip.resident.constant; - -public enum IdType { - UIN, RID,VID; -} +package io.mosip.resident.constant; + +public enum IdType { + UIN, RID, VID, AID; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/MappingJsonConstants.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/MappingJsonConstants.java index b0746db227f..ad0686ddc67 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/MappingJsonConstants.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/MappingJsonConstants.java @@ -1,33 +1,19 @@ -package io.mosip.resident.constant; - -public class MappingJsonConstants { - public static final String VALUE = "value"; - public static final String POA = "poa"; - public static final String POB = "pob"; - public static final String POR = "por"; - public static final String POI = "poi"; - public static final String POE = "poe"; - public static final String INDIVIDUAL_BIOMETRICS = "individualBiometrics"; - public static final String PARENT_OR_GUARDIAN_UIN = "parentOrGuardianUIN"; - public static final String PARENT_OR_GUARDIAN_RID = "parentOrGuardianRID"; - public static final String IDENTITY = "identity"; - public static final String PARENT_OR_GUARDIAN_BIO = "parentOrGuardianBiometrics"; - public static final String EMAIL = "email"; - public static final String PHONE = "phone"; - public static final String NAME = "name"; - public static final String DOB = "dob"; - public static final String GENDER = "gender"; - public static final String TYPE = "type"; - public static final String FORMAT = "format"; - public static final String AGE = "age"; - public static final String ADDRESS = "address"; - public static final String INDIVIDUALAUTHENTICATION = "authenticationBiometricFileName"; - public static final String IDSCHEMA_VERSION = "IDSchemaVersion"; - public static final String UIN = "uin"; - - - - - - -} +package io.mosip.resident.constant; + +public class MappingJsonConstants { + public static final String VALUE = "value"; + public static final String IDENTITY = "identity"; + public static final String EMAIL = "email"; + public static final String PHONE = "phone"; + public static final String NAME = "name"; + public static final String GENDER = "gender"; + public static final String IDSCHEMA_VERSION = "IDSchemaVersion"; + public static final String UIN = "uin"; + public static final String ATTRIBUTE_UPDATE_COUNT_LIMIT = "attributeUpdateCountLimit"; + + + + + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/NotificationTemplateCode.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/NotificationTemplateCode.java index 10334718e57..4f6d68b5fa0 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/NotificationTemplateCode.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/NotificationTemplateCode.java @@ -1,36 +1,48 @@ -package io.mosip.resident.constant; - -public enum NotificationTemplateCode { - RS_AUTH_HIST_SUCCESS("RS_AUTH_HIST_SUCCESS"), - RS_AUTH_HIST_FAILURE("RS_AUTH_HIST_FAILURE"), - RS_DOW_UIN_SUCCESS("RS_DOW_UIN_SUCCESS"), - RS_DOW_UIN_FAILURE("RS_DOW_UIN_FAILURE"), - RS_LOCK_AUTH_SUCCESS("RS_LOCK_AUTH_SUCCESS"), - RS_LOCK_AUTH_FAILURE("RS_LOCK_AUTH_FAILURE"), - RS_UIN_RPR_SUCCESS("RS_UIN_RPR_SUCCESS"), - RS_UIN_RPR_FAILURE("RS_UIN_RPR_FAILURE"), - RS_UIN_UPDATE_SUCCESS("RS_UIN_UPDATE_SUCCESS"), - RS_UIN_UPDATE_FAILURE("RS_UIN_UPDATE_FAILURE"), - RS_UNLOCK_AUTH_SUCCESS("RS_UNLOCK_AUTH_SUCCESS"), - RS_UNLOCK_AUTH_FAILURE("RS_UNLOCK_AUTH_FAILURE"), - RS_VIN_GEN_SUCCESS("RS_VIN_GEN_SUCCESS"), - RS_VIN_GEN_FAILURE("RS_VIN_GEN_FAILURE"), - RS_VIN_REV_SUCCESS("RS_VIN_REV_SUCCESS"), - RS_VIN_REV_FAILURE("RS_VIN_REV_FAILURE"), RS_CRE_REQ_SUCCESS("RS_CRE_REQ_SUCCESS"), - RS_CRE_REQ_FAILURE("RS_CRE_REQ_FAILURE"), RS_CRE_STATUS("RS_CRE_STATUS"), - RS_CRE_CANCEL_SUCCESS("RS_CRE_CANCEL_SUCCESS"); - - private final String templateCode; - - NotificationTemplateCode(String templateCode) { - this.templateCode = templateCode; - } - - @Override - public String toString() { - return templateCode; - } - - - -} +package io.mosip.resident.constant; + +public enum NotificationTemplateCode { + RS_AUTH_HIST_SUCCESS("RS_AUTH_HIST_SUCCESS"), + RS_AUTH_HIST_FAILURE("RS_AUTH_HIST_FAILURE"), + RS_DOW_UIN_SUCCESS("RS_DOW_UIN_SUCCESS"), + RS_DOW_UIN_FAILURE("RS_DOW_UIN_FAILURE"), + RS_LOCK_AUTH_SUCCESS("RS_LOCK_AUTH_SUCCESS"), + RS_LOCK_AUTH_FAILURE("RS_LOCK_AUTH_FAILURE"), + RS_UIN_RPR_SUCCESS("RS_UIN_RPR_SUCCESS"), + RS_UIN_RPR_FAILURE("RS_UIN_RPR_FAILURE"), + RS_UIN_UPDATE_SUCCESS("RS_UIN_UPDATE_SUCCESS"), + RS_UIN_UPDATE_FAILURE("RS_UIN_UPDATE_FAILURE"), + RS_UNLOCK_AUTH_SUCCESS("RS_UNLOCK_AUTH_SUCCESS"), + RS_UNLOCK_AUTH_FAILURE("RS_UNLOCK_AUTH_FAILURE"), + RS_VIN_GEN_SUCCESS("RS_VIN_GEN_SUCCESS"), + RS_VIN_GEN_FAILURE("RS_VIN_GEN_FAILURE"), + RS_VIN_REV_SUCCESS("RS_VIN_REV_SUCCESS"), + RS_VIN_REV_FAILURE("RS_VIN_REV_FAILURE"), RS_CRE_REQ_SUCCESS("RS_CRE_REQ_SUCCESS"), + RS_CRE_REQ_FAILURE("RS_CRE_REQ_FAILURE"), RS_CRE_STATUS("RS_CRE_STATUS"), + RS_CRE_CANCEL_SUCCESS("RS_CRE_CANCEL_SUCCESS"), + // FIXME Replace these template codes with the Request type enum methods + DOWNLOAD_PERSONALIZED_CARD_RECEIVED("cust-and-down-my-card-request-received"), + DOWNLOAD_PERSONALIZED_CARD_FAILED("cust-and-down-my-card-failure"), + DOWNLOAD_PERSONALIZED_CARD_SUCCESS("cust-and-down-my-card-success"), + UIN_UPDATE_PRINTING("update-demo-data-request-received"), + UIN_UPDATE_FAILED("update-demo-data-failure"), + SHARE_CREDENTIAL_FAILED(""), + VID_CARD_DOWNLOAD_PRINTING(""), + VID_CARD_DOWNLOAD_FAILED(""), + ORDER_PHYSICAL_CARD_DISPATCHED("order-a-physical-card-request-received"), + ORDER_PHYSICAL_CARD_FAILED("order-a-physical-card-failure"), + RECEIVE_OTP("receive-otp"); + + private final String templateCode; + + NotificationTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + @Override + public String toString() { + return templateCode; + } + + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/OrderEnum.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/OrderEnum.java new file mode 100644 index 00000000000..86d23bd8d73 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/OrderEnum.java @@ -0,0 +1,10 @@ +package io.mosip.resident.constant; + +/** + * order enum for sorting + * + * @author Ritik Jain + */ +public enum OrderEnum { + asc, desc; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/PacketStatus.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/PacketStatus.java new file mode 100644 index 00000000000..8f3dfecb6f1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/PacketStatus.java @@ -0,0 +1,50 @@ +package io.mosip.resident.constant; + +import java.util.List; +import java.util.Optional; + +import org.springframework.core.env.Environment; + +/** + * Enum to store the TransactionStage + * + * @author Kamesh Shekhar Prasad + */ +public enum PacketStatus { + SUCCESS("SUCCESS", "resident.success.packet-status-code.list"), + IN_PROGRESS("IN-PROGRESS", "resident.in-progress.packet-status-code.list"), + FAILURE("FAILURE", "resident.failure.packet-status-code.list"); + + private String name; + private String statusCodePropertyName; + + PacketStatus(String name, String statusCodePropertyName) { + this.name = name; + this.statusCodePropertyName = statusCodePropertyName; + } + + public String getName() { + return name; + } + + public static Optional getStatusCode(String statusCode, Environment env) { + for (PacketStatus packetStatus : values()) { + if (getStatusCodeList(packetStatus, env).contains(statusCode)) { + return Optional.of(packetStatus.name); + } + } + return Optional.empty(); + } + + public static List getStatusCodeList(PacketStatus packetStatus, Environment env) { + List statusCode = List.of(); + if (packetStatus.statusCodePropertyName != null) { + String propertyName = env.getProperty(packetStatus.statusCodePropertyName); + if (propertyName != null) { + statusCode = List.of(propertyName.split(",")); + } + } + return statusCode; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/PreUpdateInBatchJob.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/PreUpdateInBatchJob.java new file mode 100644 index 00000000000..9f1a8e91e5a --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/PreUpdateInBatchJob.java @@ -0,0 +1,35 @@ +package io.mosip.resident.constant; + +import java.util.Map; + +import org.springframework.core.env.Environment; + +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.util.Utility; + +/** + * The interface for implementing logic to be invoked before updating the status in batch job + * + * @author Loganathan S + * + */ +public interface PreUpdateInBatchJob { + + /** + * Invoked before updating the status in the database and before sending notification + * + * @param env + * @param utility + * @param txn + * @param credentialStatus + * @param newStatusCode + * @throws ResidentServiceCheckedException + * @throws ApisResourceAccessException + */ + void preUpdateInBatchJob(Environment env, Utility utility, ResidentTransactionEntity txn, + Map credentialStatus, String newStatusCode) + throws ResidentServiceCheckedException, ApisResourceAccessException; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationConstants.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationConstants.java index 2f07e827a65..a3c1fe440e5 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationConstants.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationConstants.java @@ -1,1694 +1,1685 @@ -package io.mosip.resident.constant; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Class contains the constants used in Registration application - * - * @author Balaji Sridharan - * @since 1.0.0 - * - */ -public class RegistrationConstants { - /** - * private constructor - */ - private RegistrationConstants() { - - } - - /*********** UI Constants **********/ - // paths of FXML pages to be loaded - - public static final String ERROR_PAGE = "/fxml/ErrorPage.fxml"; - public static final String INITIAL_PAGE = "/fxml/RegistrationLogin.fxml"; - public static final String HOME_PAGE = "/fxml/RegistrationOfficerLayout.fxml"; - public static final String HEADER_PAGE = "/fxml/Header.fxml"; - public static final String UPDATE_PAGE = "/fxml/UpdateLayout.fxml"; - public static final String OFFICER_PACKET_PAGE = "/fxml/RegistrationOfficerPacketLayout.fxml"; - public static final String CREATE_PACKET_PAGE = "/fxml/Registration.fxml"; - public static final String ACK_RECEIPT_PATH = "/fxml/AckReceipt.fxml"; - public static final String APPROVAL_PAGE = "/fxml/RegistrationApproval.fxml"; - public static final String FTP_UPLOAD_PAGE = "/fxml/PacketUpload.fxml"; - public static final String USER_MACHINE_MAPPING = "/fxml/UserClientMachineMapping.fxml"; - public static final String SYNC_STATUS = "/fxml/RegPacketStatus.fxml"; - public static final String ONHOLD_PAGE = "/fxml/OnholdComment.fxml"; - public static final String REJECTION_PAGE = "/fxml/RejectionComment.fxml"; - public static final String USER_AUTHENTICATION = "/fxml/Authentication.fxml"; - public static final String PENDING_ACTION_PAGE = "/fxml/RegistrationPendingAction.fxml"; - public static final String PENDING_APPROVAL_PAGE = "/fxml/RegistrationPendingApproval.fxml"; - public static final String REREGISTRATION_PAGE = "/fxml/ReRegistration.fxml"; - public static final String SCAN_PAGE = "/fxml/Scan.fxml"; - public static final String UIN_UPDATE = "/fxml/UpdateUIN.fxml"; - public static final String SYNC_DATA = "/fxml/SyncDataProcess.fxml"; - public static final String USER_ONBOARD = "/fxml/Onboard.fxml"; - public static final String SEND_NOTIFICATION_PAGE = "/fxml/SendNotification.fxml"; - public static final String PACKET_UPLOAD_STATUS_UI = "/fxml/PacketUploadStatus.fxml"; - public static final String ALERT_GENERATION = "/fxml/Alert.fxml"; - - // FXML Id - public static final String DEMOGRAPHIC_DETAIL = "demographicDetail"; - public static final String DOCUMENT_SCAN = "documentScan"; - public static final String DOCUMENT_PANE = "documentPane"; - public static final String EXCEPTION_PANE = "exceptionPane"; - public static final String BIOMETRIC_EXCEPTION = "biometricException"; - public static final String FINGER_PANE = "fingerPane"; - public static final String FINGER_SINGLE = "FINGERPRINT_SINGLE"; - public static final String FIN = "FIN"; - public static final String FINGER_SLAB = "FINGERPRINT_SLAB"; - public static final String FINGERPRINT_SLAB_LEFT = "FINGERPRINT_SLAB_LEFT"; - public static final String FINGERPRINT_SLAB_RIGHT = "FINGERPRINT_SLAB_RIGHT"; - public static final String FINGERPRINT_SLAB_THUMBS = "FINGERPRINT_SLAB_THUMBS"; - public static final String MDM_ENVIRONMENT = "Staging"; - public static final int MDM_TIMEOUT = 10000; - public static final String MDM_VERSION = "1.0"; - - public static final String IRIS_PANE = "irisPane"; - public static final String IRIS_IMAGE_LOCAL = "/images/leftEye.png"; - public static final String IRIS_IMAGE_LOCAL_RIGHT = "/images/rightEye.png"; - public static final String IRIS_SINGLE = "IRIS_SINGLE"; - public static final String IRIS_DOUBLE = "IRIS_DOUBLE"; - public static final String FINGERPRINT_CAPTURE = "fingerPrintCapture"; - public static final String IRIS_CAPTURE = "irisCapture"; - public static final String FACE_CAPTURE = "faceCapture"; - public static final String REGISTRATION_PREVIEW = "registrationPreview"; - public static final String OPERATOR_AUTHENTICATION = "operatorAuthenticationPane"; - public static final String ONBOARD_USER_PARENT = "onboardUser"; - public static final String ONBOARD_USER_SUCCESS = "userOnboardSuccess"; - // public static final String BIOMETRIC_EXCEPTION_FLOW = - // "biometricExceptionFlow"; - public static final String GUARDIAN_BIOMETRIC = "biometric"; - - // css for quality indicator - public static final String RETRY_ATTEMPT = "#retryAttempt_"; - public static final String RETRY_ATTEMPT_ID = "retryAttempt_"; - public static final String QUALITY_LABEL_GREY = "qualityLabelGrey"; - public static final String QUALITY_LABEL_GREEN = "qualityLabelGreen"; - public static final String QUALITY_LABEL_RED = "qualityLabelRed"; - public static final String PROGRESS_BAR_RED = "progress-barRed"; - public static final String PROGRESS_BAR_GREEN = "progress-barGreen"; - public static final String LABEL_RED = "labelRed"; - public static final String LABEL_GREEN = "labelGreen"; - public static final String IRIS_PANES_SELECTED = "IrisPanesSelected"; - public static final String BIO_IRIS_SELECTED = "bioIris"; - public static final String BIOMETRICS_DISPLAY = "biometricsDisplay"; - public static final String TOOLTIP_STYLE = "tooltipStyle"; - - // Page Flow - public static final String VISIBILITY = "visibility"; - // public static final String ONBOARD_LIST = "onboardPageList"; - // public static final String ONBOARD_MAP = "onboardMap"; - public static final String REGISTRATION_MAP = "registrationMap"; - public static final String ONBOARD = "onboard"; - - // CSS file - public static final String CSS_FILE_PATH = "application.css"; - - public static final String MOSIP_URL = "http://mosip.io"; - - // Images path - public static final String CLOSE_IMAGE_PATH = "/images/Close.png"; - public static final String DONE_IMAGE_PATH = "/images/done.png"; - public static final String DOC_STUB_PATH = "/images/PANStubbed.jpg"; - public static final String FP_IMG_PATH = "/images/fingerprint.jpg"; - public static final String IRIS_IMG_PATH = "/images/iris.jpg"; - public static final String FACE_IMG_PATH = "/images/Photo.png"; - public static final String LEFTPALM_IMG_PATH = "/images/leftHand.png"; - public static final String RIGHTPALM_IMG_PATH = "/images/rightHand.png"; - public static final String THUMB_IMG_PATH = "/images/thumbs.png"; - public static final String RIGHT_IRIS_IMG_PATH = "/images/Eye.png"; - public static final String LEFT_IRIS_IMG_PATH = "/images/Eye.png"; - public static final String DOUBLE_IRIS_IMG_PATH = "/images/Eyes.png"; - public static final String VIEW = "/images/View.png"; - public static final String SCAN = "/images/scan.png"; - public static final String SCAN_FOCUSED = "/images/scanFocused.png"; - public static final String BACK = "/images/arrowLeft.png"; - public static final String BACK_FOCUSED = "/images/backInWhite.png"; - public static final String WRONG_IMAGE_PATH = "/images/wrong.png"; - public static final String REJECT_IMAGE_PATH = "/images/Reject.png"; - public static final String SEND_EMAIL_IMAGE_PATH = "/images/SendEmail.png"; - public static final String SEND_EMAIL_FOCUSED_IMAGE_PATH = "/images/sendEmailFocused.png"; - public static final String LOGO = "/images/logo-final-small.png"; - public static final String NEW_REG_IMAGE = "/images/NewReg.png"; - public static final String NEW_REG_FOCUSED = "/images/NewRegistration.png"; - public static final String UPDATE_UIN_IMAGE = "/images/UINUpdate.png"; - public static final String UPDATE_UIN_FOCUSED = "/images/updateUINFocused.png"; - public static final String LOST_UIN_IMAGE = "/images/LostUIN.png"; - public static final String LOST_UIN_FOCUSED = "/images/lostUINFocused.png"; - public static final String SYNC_DATA_IMAGE = "/images/sync.png"; - public static final String SYNC_DATA_FOCUSED = "/images/syncFocused.png"; - public static final String DOWNLOAD_PREREG_IMAGE = "/images/DownloadPreRegData.png"; - public static final String DOWNLOAD_PREREG_FOCUSED = "/images/DownloadPreRegDataFocused.png"; - public static final String UPDATE_OP_BIOMETRICS_IMAGE = "/images/UpdateOperatorBiometrics.png"; - public static final String UPDATE_OP_BIOMETRICS_FOCUSED = "/images/UpdateOperatorBiometricsFocused.png"; - public static final String PENDING_APPROVAL_IMAGE = "/images/PendingApproval.png"; - public static final String PENDING_APPROVAL_FOCUSED = "/images/PendingApprovalFocused.png"; - public static final String RE_REGISTRATION_IMAGE = "/images/Re-Registration.png"; - public static final String RE_REGISTRATION_FOCUSED = "/images/ReRegistrationFocused.png"; - public static final String VIEW_REPORTS_IMAGE = "/images/ViewReports.png"; - public static final String VIEW_REPORTS_FOCUSED = "/images/ViewReportsFocused.png"; - public static final String SUCCESS_IMG_PTH = "/images/success.png"; - public static final String FAILURE_IMG_PTH = "/images/failure.png"; - public static final String GET_ONBOARDED_IMG_PATH = "/images/GetOnboarded.png"; - public static final String GET_ONBOARDED_FOCUSED = "/images/GetOnboardedFocus.png"; - public static final String ONBOARDING_IMG_PATH = "/images/OnboardYourself.png"; - public static final String ONBOARDING_FOCUSED = "/images/OnboardYourselfFocus.png"; - public static final String REGISTERING_IMG_PATH = "/images/RegisterIndividual.png"; - public static final String REGISTERING_FOCUSED = "/images/RegisterIndividualFocus.png"; - public static final String UPDATE_BIOMETRICS_IMG_PATH = "/images/activeBiometricDetail.png"; - public static final String UPDATE_BIOMETRICS_FOCUSED = "/images/UpdateBiometricsFocus.png"; - - // Authentication - public static final String SUPERVISOR_FINGERPRINT_LOGIN = "Supervisior Fingerprint Authentication"; - public static final String SINGLE = "single"; - public static final String MULTIPLE = "multiple"; - public static final String OTP_VALIDATION_SUCCESS = "success"; - public static final String SUCCESS = "Success"; - public static final String FAILURE = "Fail"; - public static final String INFO = "INFO"; - public static final String SPLITTER = "#TYPE#"; - public static final String RESTART = "Restart"; - public static final String SUPERVISOR = "REGISTRATION_SUPERVISOR"; - public static final String OFFICER = "REGISTRATION_OFFICER"; - public static final String ROLE_DEFAULT = "Default"; - public static final String IRIS_STUB = "leftIris"; - public static final String FACE_STUB = "face"; - public static final String SUPERVISOR_AUTH = "supervisor"; - public static final String OFFICER_AUTH = "officer"; - - // Authentication Methods - public static final String PWORD = "PWD"; - public static final String OTP = "OTP"; - public static final String FACE = "FACE"; - public static final String FACE_FULLFACE = "FACE_FULL FACE"; - public static final String IRIS = "IRIS"; - - public static final String FNR = "FNR"; - public static final String IRS = "IRS"; - - public static final String LOGIN_OTP_PARAM = "otp"; - - public static final String LANGUAGE_SUPPORT = "mosip.supported-languages"; - - // Login - public static final String BLOCKED = "BLOCKED"; - public static final String LOGIN_INITIAL_SCREEN = "initialMode"; - public static final String LOGIN_SEQUENCE = "sequence"; - public static final String ONBOARD_USER = "isOnboardUser"; - public static final String ONBOARD_USER_UPDATE = "updateOnboard"; - public static final String ISPAGE_NAVIGATION_ALERT_REQ = "pageNavigationAlert"; - public static final String USER_MACHINE_VALIDATION_MSG = "USER_MACHINE_VALIDATION_MSG"; - public static final String BLOCKED_USER_ERROR = "BLOCKED_USER_ERROR"; - public static final String ROLES_EMPTY_ERROR = "ROLES_EMPTY_ERROR"; - public static final String ROLES_LIST = "roleList"; - public static final String USER_NAME_VALIDATION = "USER_NAME_VALIDATION"; - - // FingerPrint - public static final String FINGER_TYPE_MINUTIA = "minutia"; - public static final String FP_TIMEOUT = "TIMEOUT"; - - // Authorization Info - public static final String ADMIN_ROLE = "REGISTRATION_ADMIN"; - public static final String ROLES_EMPTY = "RolesEmpty"; - public static final String MACHINE_MAPPING = "MachineMapping"; - - // Generic - public static final String ERROR = "ERROR"; - public static final int PARAM_ONE = 1; - public static final int PARAM_ZERO = 0; - public static final String PREVIOUS = "PREVIOUS"; - public static final String NEXT = "NEXT"; - - // UI Registration Validations - public static final String ADDRESS_KEY = "PrevAddress"; - public static final String REGISTRATION_CONTROLLER = "REGISTRATION_CONTROLLER"; - public static final String DOCUMNET_SCAN_CONTROLLER = "DOCUMNET_SCAN_CONTROLLER"; - public static final String REGISTRATION_DATA = "registrationDTOContent"; - public static final String REGISTRATION_AGE_DATA = "ageDatePickerContent"; - public static final String REGISTRATION_PANE1_DATA = "demoGraphicPane1Content"; - public static final String REGISTRATION_PANE2_DATA = "demoGraphicPane2Content"; - public static final String REGISTRATION_ISEDIT = "isEditPage"; - public static final String IS_Child = "isChild"; - public static final String ENABLE = "Y"; - public static final String DISABLE = "N"; - public static final String VALIDATION_SPLITTER = "\\s,"; - public static final String ON_TYPE = "_ontype"; - public static final String POR_DOCUMENTS = "porDocuments"; - public static final String DOCUMENT_SCAN_PANE = "documentScanPane"; - public static final String POR_BOX = "porBox"; - public static final String VALIDATION_LOGGER = "VALIDATIONS"; - public static final String REG_LGN_001 = "REG_LGN_001"; - public static final String IS_BLOCKED_WORD = "IS_BLOCKED_WORD"; - public static final String BLACKLISTED_1 = "BLACKLISTED_1"; - public static final String BLACKLISTED_2 = "BLACKLISTED_2"; - public static final String BLACKLISTED_ARE = "BLACKLISTED_ARE"; - public static final String BLACKLISTED_IS = "BLACKLISTED_IS"; - - public static final String REG_DDC_004 = "REG_DDC_004"; - public static final String AGE_FIELD = "ageField"; - public static final String MOBILE_NUMBER = "mobileNo"; - public static final String POSTAL_CODE = "postalCode"; - public static final String CNI_OR_PIN = "cniOrPinNumber"; - public static final String UIN_ID = "uinId"; - public static final String EMAIL_ID = "emailId"; - public static final String ONTYPE = "ontype"; - public static final String TOOLTIP = "toolTip"; - public static final String DOC_COMBO_BOX = "documentCombobox"; - public static final String DEMOGRAPHIC_FIELD_LABEL = "demoGraphicFieldLabel"; - public static final String SCAN_VBOX = "scanVBox"; - public static final String DOCUMENT_CONTENT_BUTTON = "documentContentButton"; - - public static final String UIN_UPDATE_ISUINUPDATE = "isUINUpdate"; - public static final String LOCAL_LANGUAGE = "LocalLanguage"; - public static final String LANGUAGE_ENGLISH = "english"; - public static final String LANGUAGE_ARABIC = "arabic"; - - public static final String SIMPLE_TYPE = "simpleType"; - public static final String NUMBER = "number"; - public static final String STRING = "string"; - public static final String AGE_DATE = "ageDate"; - public static final String DROPDOWN = "dropdown"; - public static final String TEXTBOX = "textbox"; - public static final String RESIDENCE_STATUS = "residenceStatus"; - public static final String PRIMARY = "primary"; - public static final String SECONDARY = "secondary"; - public static final String DemoGraphicFieldMessageLabel = "demoGraphicFieldMessageLabel"; - public static final String Parent = "Parent"; - public static final String updateUinCheckBox = "updateUinCheckBox"; - - public static final String APPLICATION_LANGUAGE = "application_language"; - public static final String REGISTRATION_LOCAL_LANGUAGE = "local_language"; - public static final String PACKET_TYPE_NEW = "New"; - public static final String REGISTRATION_DTO = "registrationDto"; - public static final String ADDRESS_LINE1 = "addressLine1"; - public static final String ADDRESS_LINE2 = "addressLine2"; - public static final String ADDRESS_LINE3 = "addressLine3"; - public static final String FULL_NAME = "fullName"; - public static final String PARENT_NAME = "parentName"; - public static final String UIN_LENGTH = "mosip.kernel.uin.length"; - - public static final String CHILD = "Child"; - public static final String ADULT = "Adult"; - public static final String AGE_DATEPICKER_CONTENT = "ageDatePickerContent"; - - public static final String TOGGLE_BIO_METRIC_EXCEPTION = "toggleBiometricException"; - public static final String IS_LOW_QUALITY_BIOMETRICS = "Low Quality Biometrics"; - - // Reasons for Exception - public static final String MISSING_BIOMETRICS = "Missing biometrics"; - public static final String LOW_QUALITY_BIOMETRICS = "Low quality of biometrics"; - public static final String PERMANENT_EXCEPTION = "Permanent"; - public static final String TEMPORARY_EXCEPTION = "Temporary"; - - // Lost UIN - public static final String PACKET_TYPE_LOST = "Lost"; - public static final String LOST_UIN_CONFIG_FLAG = "mosip.registration.lost_uin_disable_flag"; - - // update UIN - public static final String UIN_LABEL = "UIN"; - public static final String FIRST_TOGGLE_LABEL = "toggleLabel1"; - public static final String SECOND_TOGGLE_LABEL = "toggleLabel2"; - public static final String PACKET_TYPE_UPDATE = "Update"; - public static final String DOB_TOGGLE = "toggleAgeOrDob"; - public static final String UIN_UPDATE_CONFIG_FLAG = "mosip.registration.uin_update_config_flag"; - public static final String UIN_UPDATE_CONFIG_FIELDS_FROM_DB = "mosip.registration.uin.update.configured.fields"; - public static final String UIN_UPDATE_NAME = "name"; - public static final String UIN_UPDATE_AGE = "age"; - public static final String UIN_UPDATE_ADDRESS = "address"; - public static final String UIN_UPDATE_PHONE = "phone"; - public static final String UIN_UPDATE_EMAIL = "email"; - public static final String UIN_UPDATE_FOREIGNER = "foreigner"; - public static final String UIN_UPDATE_GENDER = "gender"; - public static final String UIN_UPDATE_PARENT_DETAILS = "parentOrGuardianDetails"; - public static final String UIN_UPDATE_CNIE_NUMBER = "cnieNumber"; - public static final String UIN_UPDATE_DEMOGRAPHICDETAIL = "demographicDetail"; - public static final String UIN_UPDATE_DOCUMENTSCAN = "documentScan"; - public static final String UIN_UPDATE_FINGERPRINTCAPTURE = "fingerPrintCapture"; - public static final String UIN_UPDATE_BIOMETRICEXCEPTION = "biometricException"; - public static final String UIN_UPDATE_BIOMETRICS = "biometrics"; - public static final String UIN_UPDATE_FACECAPTURE = "faceCapture"; - public static final String UIN_UPDATE_IRISCAPTURE = "irisCapture"; - public static final String UIN_UPDATE_REGISTRATIONPREVIEW = "registrationPreview"; - public static final String UIN_UPDATE_OPERATORAUTHENTICATIONPANE = "operatorAuthenticationPane"; - public static final String UIN_UPDATE_UINUPDATENAVLBL = "uinUpdateNavLbl"; - public static final String LOSTUINLBL = "/lostuin"; - public static final String UIN_UPDATE_NAME_LBL = "Name"; - public static final String UIN_UPDATE_AGE_LBL = "Age/DOB"; - public static final String UIN_UPDATE_ADDRESS_LBL = "Address"; - public static final String UIN_UPDATE_PHONE_LBL = "Phone"; - public static final String UIN_UPDATE_EMAIL_LBL = "Email"; - public static final String UIN_UPDATE_FOREIGNER_LBL = "Foreigner/National"; - public static final String UIN_UPDATE_GENDER_LBL = "Gender"; - public static final String MALE_CODE = "MLE"; - public static final String FEMALE_CODE = "FLE"; - public static final String STREAMER_THREAD = "STREAMER_THREAD"; - - public static final String UIN_UPDATE_PARENT_DETAILS_LBL = "Parent/Guardian details"; - public static final String UIN_UPDATE_CNIE_NUMBER_LBL = "CNIE/PIN/Residence Card Number"; - public static final String UIN_UPDATE_BIOMETRICS_LBL = "Biometrics"; - - // onBoard User - public static final String ONBOARD_STYLE_CLASS = "onboardAlertMsg"; - public static final String ONBOARD_IMG_PATH = "/images/tick.png"; - - public static final String TICK_CIRICLE_IMG_PATH = "/images/tick-circle.png"; - public static final String ONBOARD_LAST_BIOMETRIC_UPDTAE_FORMAT = "EEEE dd MMM hh:mm a"; - - // RegistrationApproval - public static final String PLACEHOLDER_LABEL = "PLACEHOLDER_LABEL"; - public static final String REGISTRATIONID = "registrationID"; - public static final String STATUSCODE = "statusCode"; - public static final String STATUSCOMMENT = "statusComment"; - public static final String ONHOLD_COMMENTS = "ONHOLD_COMMENTS"; - public static final String REJECTION_COMMENTS = "REJECT_COMMENTS"; - public static final String EMPTY = ""; - public static final String SPACE = " "; - public static final String UNDER_SCORE = "_"; - public static final String PDF = "pdf"; - public static final String CONSTANTS_FILE_NAME = "/constants.properties"; - public static final String PENDING = "Pending"; - public static final String EOD_PROCESS_CONFIG_FLAG = "mosip.registration.eod_process_config_flag"; - public static final String EOD_PROCESS_ID = "id"; - public static final String EOD_PROCESS_STATUSCOMMENT = "statusComment"; - public static final String EOD_PROCESS_ACKNOWLEDGEMENTFORMPATH = "acknowledgementFormPath"; - public static final String EOD_PROCESS_REGISTRATIONAPPROVALCONTROLLER = "RegistrationApprovalController"; - public static final String EXPORT_FILE_NAME = "PendingApprovalList"; - public static final String EXPORT_FILE_TYPE = ".csv"; - public static final String EOD_PROCESS_DATE_FORMAT = "dd-MM-yyyy"; - public static final String EOD_PROCESS_SLNO = "slno"; - public static final String EOD_PROCESS_DATE = "date"; - public static final String EOD_PROCESS_DATE_FORMAT_FOR_FILE = "yyyyMMddHHmmss"; - public static final String AUTH_ADVICE_FAILURE = "AUTH_ADVICE_FAILURE"; - - // Packet Store Location Constants - public static final String PACKET_STORE_LOCATION = "mosip.registration.registration_packet_store_location"; - public static final String PACKET_STORE_DATE_FORMAT = "mosip.registration.packet_store_date_format"; - - // Packet Creation Constants - public static final String ZIP_FILE_EXTENSION = ".zip"; - public static final String DEMOGRPAHIC_JSON_NAME = "ID.json"; - public static final String PACKET_META_JSON_NAME = "packet_meta_info.json"; - public static final String PACKET_DATA_HASH_FILE_NAME = "packet_data_hash.txt"; - public static final String PACKET_OSI_HASH_FILE_NAME = "packet_osi_hash.txt"; - public static final String PACKET_INTRODUCER_EXCEP_PHOTO_NAME = "_exception_photo.jpg"; - public static final String PACKET_INTRODUCER_EXCEP_PHOTO = "_exception_photo"; - public static final String AUDIT_JSON_FILE = "audit"; - public static final String JSON_FILE_EXTENSION = ".json"; - public static final String ACK_RECEIPT = "RegistrationAcknowledgement"; - public static final String APPLICANT_BIO_CBEFF_FILE_NAME = "applicant_bio_CBEFF.xml"; - public static final String OFFICER_BIO_CBEFF_FILE_NAME = "officer_bio_CBEFF.xml"; - public static final String SUPERVISOR_BIO_CBEFF_FILE_NAME = "supervisor_bio_CBEFF.xml"; - public static final String INTRODUCER_BIO_CBEFF_FILE_NAME = "introducer_bio_CBEFF.xml"; - public static final String AUTHENTICATION_BIO_CBEFF_FILE_NAME = "authentication_bio_CBEFF.xml"; - public static final String INDIVIDUAL = "INDIVIDUAL"; - public static final String INTRODUCER = "INTRODUCER"; - public static final String PARENT = "PARENT"; - public static final String CBEFF_BIR_UUIDS_MAP_NAME = "CBEFF_BIR_UUIDS"; - public static final String XML_FILE_FORMAT = ".xml"; - public static final String CBEFF_FILE_FORMAT = "cbeff"; - public static final String FACE_EXCEPTION = "ExceptionFace"; - public static final String IDENTITY_JSON_FILE_NAME = "mosip-identity-json-schema.json"; - public static final String CBEFF_SCHEMA_FILE_PATH = "/cbeff.xsd"; - public static final String CBEFF_DEFAULT_FORMAT_ORG = "Mosip"; - public static final String CBEFF_DEFAULT_FORMAT_TYPE = "257"; - public static final String CBEFF_DEFAULT_ALG_ORG = "HMAC"; - public static final String CBEFF_DEFAULT_ALG_TYPE = "SHA-256"; - public static final String CBEFF_FORMAT_ORG = "mosip.registration.cbeff_format_org"; - public static final String CBEFF_FORMAT_TYPE = "mosip.registration.cbeff_format_type"; - public static final String CBEFF_ALG_ORG = "mosip.registration.cbeff_algorithm_org"; - public static final String CBEFF_ALG_TYPE = "mosip.registration.cbeff_algorithm_type"; - public static final String IS_SUPERVISOR_AUTH_REQUIRED = "isSupervisorAuthRequired"; - public static final String IS_SUPERVISOR_BIOMETRICS_CAPTURED = "isSupervisorBiometricsCaptured"; - public static final String IS_OFFICER_BIOMETRICS_CAPTURED = "isOfficerBiometricsCaptured"; - - // Validation Types - public static final String VALIDATION_TYPE_FP = "Fingerprint"; - public static final String VALIDATION_TYPE_IRIS = "Iris"; - public static final String VALIDATION_TYPE_FACE = "Face"; - public static final String VALIDATION_TYPE_FP_SINGLE = "single"; - - // Supervisor Authentication - public static final String PWD_MATCH = "Username and Password Match"; - public static final String PWD_MISMATCH = "Username and Password Not Match"; - - // RSA - public static final String LOCALHOST = "localhost"; - - // Constants for Registration Creation Zip - - /** - * Specifies the format for storing the Registration Acknowledgement - */ - public static final String ACKNOWLEDGEMENT_FORMAT = "html"; - - public static final String IMAGE_FORMAT_PNG = "png"; - - // Constants for Registration ID Generator - will be removed after Kernel - // Integration - public static final String AGENCY_CODE = "2018"; - public static final String STATION_NUMBER = "78213"; - public static final String RID_DATE_FORMAT = "ddMMyyyyHHmmss"; - public static final String DATE_FORMAT_REG = "dd-MM-yyyy"; - - // Logger - Constants - public static final String APPLICATION_ID = "REG"; - public static final String APPLICATION_NAME = "REGISTRATION"; - - // Audit - Constants - public static final String AUDIT_DEFAULT_USER = "NA"; - - // OnlineConnectivity check - public static final String URL = "http://localhost:8080/getTokenId"; - - // ALert related constants - public static final String ALERT_INFORMATION = "INFORMATION"; - public static final String ALERT_WARNING = "WARNING"; - public static final String ALERT = "ALERT"; - - // api related constant values - public static final String HTTPMETHOD = "service.httpmethod"; - public static final String SERVICE_URL = "service.url"; - public static final String HEADERS = "service.headers"; - public static final String RESPONSE_TYPE = "service.responseType"; - public static final String REQUEST_TYPE = "service.requestType"; - public static final String AUTH_HEADER = "service.authheader"; - public static final String AUTH_REQUIRED = "service.authrequired"; - public static final String SIGN_REQUIRED = "service.signrequired"; - public static final String AUTH_TYPE = "BASIC"; - public static final String REQUEST_SIGN_REQUIRED = "service.requestsignrequired"; - - // OTP Related Details - public static final String OTP_GENERATOR_SERVICE_NAME = "otp_generator"; - public static final String USERNAME_KEY = "key"; - public static final String OTP_GENERATED = "otp"; - public static final String OTP_VALIDATOR_SERVICE_NAME = "otp_validator"; - public static final String OTP_GENERATOR_RESPONSE_DTO = "otpGeneratorResponseDTO"; - public static final String OTP_VALIDATOR_RESPONSE_DTO = "otpValidatorResponseDTO"; - - // Velocity Template Generator Constants - public static final String TEMPLATE_ACKNOWLEDGEMENT = "AckReceipt"; - public static final String TEMPLATE_PREVIEW = "Preview"; - public static final String TEMPLATE_QRCODE_SOURCE = "QRCodeSource"; - public static final String TEMPLATE_UIN_UPDATE = "UINUpdate"; - public static final String TEMPLATE_HEADER_TABLE = "headerTable"; - public static final String TEMPLATE_UIN_HEADER_TABLE = "uinHeaderTable"; - public static final String TEMPLATE_UIN_USER_LANG_LABEL = "UINPrimLabel"; - public static final String TEMPLATE_UIN_LOCAL_LANG_LABEL = "UINSecLabel"; - public static final String TEMPLATE_UIN = "UIN"; - public static final String TEMPLATE_RID_USER_LANG_LABEL = "RIDPrimLabel"; - public static final String TEMPLATE_RID_LOCAL_LANG_LABEL = "RIDSecLabel"; - public static final String TEMPLATE_RID = "RID"; - public static final String TEMPLATE_DATE_USER_LANG_LABEL = "DatePrimLabel"; - public static final String TEMPLATE_DATE_LOCAL_LANG_LABEL = "DateSecLabel"; - public static final String TEMPLATE_DATE = "Date"; - public static final String TEMPLATE_PRE_REG_ID_USER_LANG_LABEL = "PreRegIDPrimLabel"; - public static final String TEMPLATE_PRE_REG_ID_LOCAL_LANG_LABEL = "PreRegIDSecLabel"; - public static final String TEMPLATE_PRE_REG_ID = "PreRegID"; - public static final String TEMPLATE_PRE_REG = "IsPreRegIDPresent"; - public static final String TEMPLATE_DEMO_INFO = "DemographicInfo"; - public static final String DEMOGRAPHIC_TEXTFIELD_FOCUSED = "demoGraphicTextFieldFocused"; - public static final String DEMOGRAPHIC_TEXTFIELD = "demoGraphicTextField"; - public static final String TEMPLATE_FULL_NAME_USER_LANG_LABEL = "FullNamePrimLabel"; - public static final String TEMPLATE_FULL_NAME_LOCAL_LANG_LABEL = "FullNameSecLabel"; - public static final String TEMPLATE_FULL_NAME = "FullName"; - public static final String TEMPLATE_FULL_NAME_LOCAL_LANG = "FullNameSec"; - public static final String TEMPLATE_GENDER_USER_LANG_LABEL = "GenderPrimLabel"; - public static final String TEMPLATE_GENDER_LOCAL_LANG_LABEL = "GenderSecLabel"; - public static final String TEMPLATE_GENDER = "Gender"; - public static final String TEMPLATE_GENDER_LOCAL_LANG = "GenderSec"; - public static final String TEMPLATE_DOB_USER_LANG_LABEL = "DOBPrimLabel"; - public static final String TEMPLATE_DOB_LOCAL_LANG_LABEL = "DOBSecLabel"; - public static final String TEMPLATE_DOB = "DOB"; - public static final String TEMPLATE_AGE_USER_LANG_LABEL = "AgePrimLabel"; - public static final String TEMPLATE_AGE_LOCAL_LANG_LABEL = "AgeSecLabel"; - public static final String TEMPLATE_AGE = "Age"; - public static final String TEMPLATE_YEARS_USER_LANG = "YearsPrim"; - public static final String TEMPLATE_YEARS_LOCAL_LANG = "YearsSec"; - public static final String TEMPLATE_FOREIGNER_USER_LANG_LABEL = "ForiegnerPrimLabel"; - public static final String TEMPLATE_FOREIGNER_LOCAL_LANG_LABEL = "ForiegnerSecLabel"; - public static final String TEMPLATE_RESIDENCE_STATUS = "ResidenceStatus"; - public static final String TEMPLATE_RESIDENCE_STATUS_LOCAL_LANG = "ResidenceStatusSec"; - public static final String TEMPLATE_ADDRESS_LINE1_USER_LANG_LABEL = "AddressLine1PrimLabel"; - public static final String TEMPLATE_ADDRESS_LINE1_LOCAL_LANG_LABEL = "AddressLine1SecLabel"; - public static final String TEMPLATE_ADDRESS_LINE1 = "AddressLine1"; - public static final String TEMPLATE_ADDRESS_LINE1_LOCAL_LANG = "AddressLine1Sec"; - public static final String TEMPLATE_ADDRESS_LINE2_USER_LANG_LABEL = "AddressLine2PrimLabel"; - public static final String TEMPLATE_ADDRESS_LINE2_LOCAL_LANG_LABEL = "AddressLine2SecLabel"; - public static final String TEMPLATE_ADDRESS_LINE2 = "AddressLine2"; - public static final String TEMPLATE_ADDRESS_LINE3 = "AddressLine3"; - public static final String TEMPLATE_ADDRESS_LINE2_LOCAL_LANG = "AddressLine2Sec"; - public static final String TEMPLATE_REGION_USER_LANG_LABEL = "RegionPrimLabel"; - public static final String TEMPLATE_REGION_LOCAL_LANG_LABEL = "RegionSecLabel"; - public static final String TEMPLATE_REGION = "Region"; - public static final String TEMPLATE_CITY = "City"; - public static final String TEMPLATE_REGION_LOCAL_LANG = "RegionSec"; - public static final String TEMPLATE_PROVINCE_USER_LANG_LABEL = "ProvincePrimLabel"; - public static final String TEMPLATE_PROVINCE_LOCAL_LANG_LABEL = "ProvinceSecLabel"; - public static final String TEMPLATE_PROVINCE = "Province"; - public static final String TEMPLATE_PROVINCE_LOCAL_LANG = "ProvinceSec"; - public static final String TEMPLATE_LOCAL_AUTHORITY_USER_LANG_LABEL = "LocalAuthorityPrimLabel"; - public static final String TEMPLATE_LOCAL_AUTHORITY_LOCAL_LANG_LABEL = "LocalAuthoritySecLabel"; - public static final String TEMPLATE_LOCAL_AUTHORITY = "LocalAuthority"; - public static final String TEMPLATE_LOCAL_AUTHORITY_LOCAL_LANG = "LocalAuthoritySec"; - public static final String TEMPLATE_MOBILE_USER_LANG_LABEL = "MobilePrimLabel"; - public static final String TEMPLATE_MOBILE_LOCAL_LANG_LABEL = "MobileSecLabel"; - public static final String TEMPLATE_MOBILE = "Mobile"; - public static final String TEMPLATE_POSTAL_CODE_USER_LANG_LABEL = "PostalCodePrimLabel"; - public static final String TEMPLATE_POSTAL_CODE_LOCAL_LANG_LABEL = "PostalCodeSecLabel"; - public static final String TEMPLATE_POSTAL_CODE = "PostalCode"; - public static final String TEMPLATE_EMAIL_USER_LANG_LABEL = "EmailPrimLabel"; - public static final String TEMPLATE_EMAIL_LOCAL_LANG_LABEL = "EmailSecLabel"; - public static final String TEMPLATE_EMAIL = "Email"; - public static final String TEMPLATE_CNIE_NUMBER_USER_LANG_LABEL = "CNIEPrimLabel"; - public static final String TEMPLATE_CNIE_LOCAL_LANG_LABEL = "CNIESecLabel"; - public static final String TEMPLATE_CNIE_NUMBER = "CNIE"; - public static final String TEMPLATE_WITH_PARENT = "WithParent"; - public static final String TEMPLATE_PARENT_NAME_USER_LANG_LABEL = "ParentNamePrimLabel"; - public static final String TEMPLATE_PARENT_NAME_LOCAL_LANG_LABEL = "ParentNameSecLabel"; - public static final String TEMPLATE_PARENT_NAME = "ParentName"; - public static final String TEMPLATE_PARENT_UIN_USER_LANG_LABEL = "ParentUINPrimLabel"; - public static final String TEMPLATE_PARENT_UIN_LOCAL_LANG_LABEL = "ParentUINSecLabel"; - public static final String TEMPLATE_PARENT_UIN = "ParentUIN"; - public static final String TEMPLATE_PARENT_NAME_LOCAL_LANG = "ParentNameSec"; - public static final String TEMPLATE_DOCUMENTS_USER_LANG_LABEL = "DocumentsPrimLabel"; - public static final String TEMPLATE_DOCUMENTS_LOCAL_LANG_LABEL = "DocumentsSecLabel"; - public static final String TEMPLATE_DOCUMENTS = "Documents"; - public static final String TEMPLATE_DOCUMENTS_LOCAL_LANG = "DocumentsSec"; - public static final String TEMPLATE_BIOMETRICS_USER_LANG_LABEL = "BiometricsPrimLabel"; - public static final String TEMPLATE_BIOMETRICS_LOCAL_LANG_LABEL = "BiometricsSecLabel"; - public static final String TEMPLATE_BIOMETRICS_CAPTURED_USER_LANG_LABEL = "BiometricsCapturedPrimLabel"; - public static final String TEMPLATE_BIOMETRICS_CAPTURED_LOCAL_LANG_LABEL = "BiometricsCapturedSecLabel"; - public static final String TEMPLATE_BIOMETRICS_CAPTURED = "Biometrics"; - public static final String TEMPLATE_BIOMETRICS_CAPTURED_LOCAL_LANG = "BiometricsSec"; - public static final String TEMPLATE_WITHOUT_EXCEPTION = "WithoutException"; - public static final String TEMPLATE_WITH_EXCEPTION = "WithException"; - public static final String TEMPLATE_EXCEPTION_PHOTO_USER_LANG_LABEL = "ExceptionPhotoPrimLabel"; - public static final String TEMPLATE_EXCEPTION_PHOTO_LOCAL_LANG_LABEL = "ExceptionPhotoSecLabel"; - public static final String TEMPLATE_LEFT_EYE_USER_LANG_LABEL = "LeftEyePrimLabel"; - public static final String TEMPLATE_LEFT_EYE_LOCAL_LANG_LABEL = "LeftEyeSecLabel"; - public static final String TEMPLATE_RIGHT_EYE_USER_LANG_LABEL = "RightEyePrimLabel"; - public static final String TEMPLATE_RIGHT_EYE_LOCAL_LANG_LABEL = "RightEyeSecLabel"; - public static final String TEMPLATE_EXCEPTION_IMAGE_SOURCE = "ExceptionImageSource"; - public static final String TEMPLATE_LEFT_EYE = "LeftEye"; - public static final String TEMPLATE_EYE_IMAGE_SOURCE = "EyeImageSource"; - public static final String TEMPLATE_RIGHT_EYE = "RightEye"; - public static final String TEMPLATE_CAPTURED_LEFT_EYE = "CapturedLeftEye"; - public static final String TEMPLATE_CAPTURED_RIGHT_EYE = "CapturedRightEye"; - public static final String TEMPLATE_LEFT_PALM_USER_LANG_LABEL = "LeftPalmPrimLabel"; - public static final String TEMPLATE_LEFT_PALM_LOCAL_LANG_LABEL = "LeftPalmSecLabel"; - public static final String TEMPLATE_RIGHT_PALM_USER_LANG_LABEL = "RightPalmPrimLabel"; - public static final String TEMPLATE_RIGHT_PALM_LOCAL_LANG_LABEL = "RightPalmSecLabel"; - public static final String TEMPLATE_THUMBS_USER_LANG_LABEL = "ThumbsPrimLabel"; - public static final String TEMPLATE_THUMBS_LOCAL_LANG_LABEL = "ThumbsSecLabel"; - public static final String TEMPLATE_LEFT_PALM_IMAGE_SOURCE = "LeftPalmImageSource"; - public static final String TEMPLATE_RIGHT_PALM_IMAGE_SOURCE = "RightPalmImageSource"; - public static final String TEMPLATE_THUMBS_IMAGE_SOURCE = "ThumbsImageSource"; - public static final String TEMPLATE_LEFT_LITTLE_FINGER = "leftLittle"; - public static final String TEMPLATE_LEFT_RING_FINGER = "leftRing"; - public static final String TEMPLATE_LEFT_MIDDLE_FINGER = "leftMiddle"; - public static final String TEMPLATE_LEFT_INDEX_FINGER = "leftIndex"; - public static final String TEMPLATE_LEFT_THUMB_FINGER = "leftThumb"; - public static final String TEMPLATE_RIGHT_LITTLE_FINGER = "rightLittle"; - public static final String TEMPLATE_RIGHT_RING_FINGER = "rightRing"; - public static final String TEMPLATE_RIGHT_MIDDLE_FINGER = "rightMiddle"; - public static final String TEMPLATE_RIGHT_INDEX_FINGER = "rightIndex"; - public static final String TEMPLATE_RIGHT_THUMB_FINGER = "rightThumb"; - public static final String TEMPLATE_CAPTURED_LEFT_SLAP = "CapturedLeftSlap"; - public static final String TEMPLATE_CAPTURED_RIGHT_SLAP = "CapturedRightSlap"; - public static final String TEMPLATE_CAPTURED_THUMBS = "CapturedThumbs"; - public static final String TEMPLATE_MISSING_LEFT_FINGERS = "MissingLeftFingers"; - public static final String TEMPLATE_LEFT_SLAP_EXCEPTION_USER_LANG = "LeftSlapExceptionPrim"; - public static final String TEMPLATE_LEFT_SLAP_EXCEPTION_LOCAL_LANG = "LeftSlapExceptionSec"; - public static final String TEMPLATE_MISSING_RIGHT_FINGERS = "MissingRightFingers"; - public static final String TEMPLATE_RIGHT_SLAP_EXCEPTION_USER_LANG = "RightSlapExceptionPrim"; - public static final String TEMPLATE_RIGHT_SLAP_EXCEPTION_LOCAL_LANG = "RightSlapExceptionSec"; - public static final String TEMPLATE_MISSING_THUMBS = "MissingThumbs"; - public static final String TEMPLATE_THUMBS_EXCEPTION_USER_LANG = "ThumbsExceptionPrim"; - public static final String TEMPLATE_THUMBS_EXCEPTION_LOCAL_LANG = "ThumbsExceptionSec"; - public static final String TEMPLATE_RO_IMAGE_SOURCE = "ROImageSource"; - public static final String TEMPLATE_RO_NAME_USER_LANG_LABEL = "RONamePrimLabel"; - public static final String TEMPLATE_RO_NAME_LOCAL_LANG_LABEL = "RONameSecLabel"; - public static final String TEMPLATE_RO_NAME = "ROName"; - public static final String TEMPLATE_RO_NAME_LOCAL_LANG = "RONameSec"; - public static final String TEMPLATE_REG_CENTER_USER_LANG_LABEL = "RegCenterPrimLabel"; - public static final String TEMPLATE_REG_CENTER_LOCAL_LANG_LABEL = "RegCenterSecLabel"; - public static final String TEMPLATE_REG_CENTER = "RegCenter"; - public static final String TEMPLATE_REG_CENTER_LOCAL_LANG = "RegCenterSec"; - public static final String TEMPLATE_PHOTO_USER_LANG = "PhotoPrim"; - public static final String TEMPLATE_PHOTO_LOCAL_LANG = "PhotoSec"; - public static final String TEMPLATE_APPLICANT_IMAGE_SOURCE = "ApplicantImageSource"; - public static final String TEMPLATE_DATE_FORMAT = "dd/MM/yyyy"; - public static final String TEMPLATE_JPG_IMAGE_ENCODING = "data:image/jpg;base64,"; - public static final String TEMPLATE_PNG_IMAGE_ENCODING = "data:image/png;base64,"; - public static final String TEMPLATE_CROSS_MARK = "✘"; - public static final String TEMPLATE_EYE_IMAGE_PATH = "/images/Eye.png"; - public static final String TEMPLATE_LEFT_SLAP_IMAGE_PATH = "/images/leftHand.png"; - public static final String TEMPLATE_RIGHT_SLAP_IMAGE_PATH = "/images/rightHand.png"; - public static final String TEMPLATE_THUMBS_IMAGE_PATH = "/images/thumbs.png"; - public static final String TEMPLATE_STYLE_HIDE_PROPERTY = "style='display:none;'"; - public static final String TEMPLATE_RIGHT_MARK = "✓"; - public static final String TEMPLATE_FINGERPRINTS_CAPTURED = "FingerprintsCaptured"; - public static final String TEMPLATE_IMPORTANT_GUIDELINES = "ImportantGuidelines"; - public static final String TEMPLATE_NAME = "Acknowledgement Template"; - public static final String TEMPLATE_RESIDENT_NAME = "ResidentName"; - public static final String TEMPLATE_RO_IMAGE = "ROImage"; - public static final String TEMPLATE_MODIFY_IMAGE_PATH = "/images/Modify.png"; - public static final String TEMPLATE_MODIFY_IMAGE_SOURCE = "ModifyImageSource"; - public static final String TEMPLATE_MODIFY = "Modify"; - public static final String TEMPLATE_ENCODING = "UTF-8"; - public static final String TEMPLATE_FACE_CAPTURE_ENABLED = "FaceCaptureEnabled"; - public static final String TEMPLATE_DOCUMENTS_ENABLED = "DocumentsEnabled"; - public static final String TEMPLATE_BIOMETRICS_ENABLED = "BiometricsEnabled"; - public static final String TEMPLATE_IRIS_ENABLED = "IrisEnabled"; - public static final String TEMPLATE_IRIS_DISABLED = "IrisDisabled"; - public static final String TEMPLATE_LEFT_EYE_CAPTURED = "leftEyeCaptured"; - public static final String TEMPLATE_RIGHT_EYE_CAPTURED = "rightEyeCaptured"; - public static final String TEMPLATE_LEFT_SLAP_CAPTURED = "leftSlapCaptured"; - public static final String TEMPLATE_RIGHT_SLAP_CAPTURED = "rightSlapCaptured"; - public static final String TEMPLATE_THUMBS_CAPTURED = "thumbsCaptured"; - public static final String TEMPLATE_CONSENT_HEADING = "Consent"; - public static final String TEMPLATE_CONSENT_DATA = "ConsentData"; - public static final String TEMPLATE_CONSENT_YES = "Yes"; - public static final String TEMPLATE_CONSENT_NO = "No"; - public static final String TEMPLATE_CONSENT_SELECTED_YES = "SelectedYes"; - public static final String TEMPLATE_CONSENT_SELECTED_NO = "SelectedNo"; - public static final String TEMPLATE_CONSENT_CHECKED = "checked='checked'"; - public static final String PARENT_PHOTO_CAPTURED = "parentPhotoCaptured"; - public static final String PARENT_PHOTO_NOT_CAPTURED = "parentPhotoNotCaptured"; - public static final String PARENT_PHOTO_PRIMARY_LANG = "ParentPhotoPrim"; - public static final String PARENT_PHOTO_LOCAL_LANG = "ParentPhotoSec"; - public static final String PARENT_IMAGE_SOURCE = "ParentImageSource"; - public static final String LIST_ITEM_OPENING_TAG = "
  • "; - public static final String LIST_ITEM_CLOSING_TAG = "

  • "; - public static final String SPLIT_DELIMITOR = "\\."; - public static final String TEMPLATE_GUIDELINES = "Guidelines"; - public static final String TEMPLATE_IS_UIN_UPDATE = "IsUINUpdate"; - - public static final String MODIFY_DEMO_INFO = "modifyDemographicInfo"; - public static final String MODIFY_DOCUMENTS = "modifyDocuments"; - public static final String MODIFY_BIOMETRICS = "modifyBiometrics"; - public static final String CLICK = "click"; - public static final String REG_CONSENT = "mosip.registration.consent_"; - public static final String REG_CONSENT_YES = "consent-yes"; - public static final String REG_CONSENT_NO = "consent-no"; - public static final String IRIS_WITH_EXCEPTION = "irisWithException"; - public static final String IRIS_WITHOUT_EXCEPTION = "irisWithoutException"; - public static final String IRIS_WITH_EXCEPTION_STYLE = "parentIris2"; - public static final String IRIS_WITHOUT_EXCEPTION_STYLE = "parentIris1"; - public static final String IRIS_STYLE = "irisStyle"; - public static final String TEMPLATE_IRIS = "iris"; - public static final String TEMPLATE_CHILD_LEFT = "childLeft"; - public static final String TEMPLATE_CHILD_RIGHT = "childRight"; - public static final String TEMPLATE_CHILD_THUMBS = "childThumbs"; - public static final String PARENT_LEFT_SLAP = "parentLeftSlap"; - public static final String PARENT_RIGHT_SLAP = "parentRightSlap"; - public static final String PARENT_LEFT_EYE = "parentLeftEye"; - public static final String PARENT_RIGHT_EYE = "parentRightEye"; - public static final String PARENT_THUMBS = "parentThumbs"; - public static final String PARENT_STYLE = "parentStyle"; - public static final String TEMPLATE_IS_CHILD = "isChild"; - - // Web Camera Constants - public static final String WEB_CAMERA_IMAGE_TYPE = "jpg"; - public static final String APPLICANT_PHOTOGRAPH_NAME = "Applicant Photograph.jpg"; - public static final String EXCEPTION_PHOTOGRAPH_NAME = "Exception Photograph.jpg"; - public static final String APPLICANT_IMAGE = "Applicant Image"; - public static final String EXCEPTION_IMAGE = "Exception Image"; - public static final String GUARDIAN_IMAGE = "Guardian Image"; - public static final String APPLICANT_PHOTO_PANE = "applicantImagePane"; - public static final String EXCEPTION_PHOTO_PANE = "exceptionImagePane"; - public static final String WEB_CAMERA_PAGE_TITLE = "Applicant Biometrics"; - public static final String WEBCAM_NAME = "mosip.registration.webcam_name"; - public static final String WEBCAM_LIBRARY_NAME = "mosip.registration.webcam_library_name"; - public static final String PHOTO_CAPTUREPANES_SELECTED = "photoCapturePanesSelected"; - public static final String DEFAULT_EXCEPTION_IMAGE_PATH = "/images/ExceptionPhoto.png"; - public static final String IMAGE_PATH = "/images/Photo.png"; - - // Acknowledgement Form - public static final String ACKNOWLEDGEMENT_FORM_TITLE = "Registration Acknowledgement"; - public static final String REGISTRATION = "Registration"; - - // logos for new registration - public static final String DEMOGRAPHIC_DETAILS_LOGO = "file:src/main/resources/images/Pre-Registration.png"; - public static final String APPLICANT_BIOMETRICS_LOGO = "file:src/main/resources/images/ApplicantBiometrics.png"; - public static final String OPERATOR_AUTHENTICATION_LOGO = "file:src/main/resources/images/OperatorAuthentication.png"; - - // Exception Code for Components - public static final String PACKET_CREATION_EXP_CODE = "PCC-"; - public static final String PACKET_UPLOAD_EXP_CODE = "PAU-"; - public static final String REG_ACK_EXP_CODE = "ACK-"; - public static final String DEVICE_ONBOARD_EXP_CODE = "DVO-"; - public static final String SYNC_JOB_EXP_CODE = "SYN-"; - public static final String USER_REG_IRIS_CAPTURE_EXP_CODE = "IRC-"; - public static final String USER_REG_FINGERPRINT_CAPTURE_EXP_CODE = "FPC-"; - public static final String USER_REGISTRATION_EXP_CODE = "REG-"; - public static final String USER_REG_SCAN_EXP_CODE = "SCN-"; - - // USER CLIENT MACHINE MAPPING - public static final String MACHINE_MAPPING_LOGGER_TITLE = "REGISTRATION - USER CLIENT MACHINE MAPPING"; - public static final String SYNC_TRANSACTION_DAO_LOGGER_TITLE = "REGISTRATION-SYNC-TRANSACTION DAO"; - public static final String SYNC_JOB_CONTROL_DAO_LOGGER_TITLE = "REGISTRATION-SYNC-JOB_CONTROL DAO"; - - // CENTER MACHINE DEVICE MAPPING - public static final String DEVICE_MAPPING_SUCCESS_CODE = "REG-DVO‌-001"; - public static final String DEVICE_MAPPING_ERROR_CODE = "REG-DVO‌-002"; - - // Upload Packet - - public static final String UPLOAD_STATUS = "status"; - public static final List PACKET_UPLOAD_STATUS = Arrays.asList("SYNCED", "EXPORTED", "RESEND", "E"); - - public static final String PACKET_UPLOAD = "packet_upload"; - public static final String DUPLICATE = "Duplicate"; - public static final String FOUND = "Found"; - public static final String PACKET_DUPLICATE = "duplicate"; - public static final String PACKET_UPLOAD_SNO = "slno"; - public static final String PACKET_UPLOAD_DATE = "createdTime"; - public static final String PACKET_UPLOAD_FILE = "fileName"; - public static final String UPLOAD_FILE_NAME = "PacketUploadList"; - // opt to register constants - public static final String OPT_TO_REG_GEO_CAP_FREQ = "GEO_CAP_FREQ"; - public static final String ICS_CODE_ONE = "REG-ICS‌-001"; - public static final String ICS_CODE_TWO = "REG-ICS‌-002"; - public static final String ICS_CODE_THREE = "REG-ICS‌-003"; - public static final String ICS_CODE_FOUR = "REG-ICS‌-004"; - public static final String OPT_TO_REG_PAK_MAX_CNT_OFFLINE_FREQ = "REG_PAK_MAX_CNT_OFFLINE_FREQ"; - public static final double OPT_TO_REG_EARTH_RADIUS = 6371000; - public static final double OPT_TO_REG_METER_CONVERSN = 1609.00; - public static final String OPT_TO_REG_DIST_FRM_MACHN_TO_CENTER = "DIST_FRM_MACHN_TO_CENTER"; - public static final String ICS_CODE_FIVE = "REG-ICS‌-005"; - public static final String ICS_CODE_SIX = "REG-ICS‌-006"; - public static final String ICS_CODE_SEVEN = "REG-ICS‌-007"; - public static final String PAK_APPRVL_MAX_CNT = "REG-ICS‌-008"; - public static final String PAK_APPRVL_MAX_TIME = "REG-ICS‌-009"; - public static final String REG_REC_SEVEN = "REG-REC‌-007"; - public static final String OPT_TO_REG_LAST_CAPTURED_TIME = "lastCapturedTime"; - public static final String LATITUDE = "latitude"; - public static final String OPT_TO_REG_MDS_J00001 = "MDS_J00001"; - public static final String OPT_TO_REG_LCS_J00002 = "LCS_J00002"; - public static final String OPT_TO_REG_PDS_J00003 = "PDS_J00003"; - public static final String OPT_TO_REG_RSS_J00004 = "RSS_J00004"; - public static final String OPT_TO_REG_RCS_J00005 = "RCS_J00005"; - public static final String OPT_TO_REG_RPS_J00006 = "RPS_J00006"; - public static final String OPT_TO_REG_URS_J00007 = "URS_J00007"; - public static final String OPT_TO_REG_POS_J00008 = "POS_J00008"; - public static final String OPT_TO_REG_LER_J00009 = "LER_J00009"; - public static final String OPT_TO_REG_RDJ_J00010 = "RDJ_J00010"; - public static final String OPT_TO_REG_RDJ_J00011 = "RDJ_J00011"; - public static final String OPT_TO_REG_ADJ_J00012 = "ADJ_J00012"; - public static final String OPT_TO_REG_DEL_001 = "DEL_001"; - public static final String OPT_TO_REG_UDM_J00012 = "UDM_J00012"; - public static final String GEO_CAP_FREQ = "mosip.registration.geo.capture.frequency"; - public static final String DIST_FRM_MACHN_TO_CENTER = "mosip.registration.distance.from.machine.to.center"; - public static final String REG_PAK_MAX_CNT_OFFLINE_FREQ = "mosip.registration.packet.maximum.count.offline.frequency"; - public static final String MOSIP_REGISTRATION = "mosip.registration."; - public static final String FREQUENCY = "frequency"; - public static final String SOFTWARE_UPDATE_SUCCESS_MSG = "SoftWareUpdate Flag Updated to Y!"; - public static final String SOFTWARE_UPDATE_FAILURE_MSG = "SoftWareUpdate Flag Updated to N!"; - public static final String SOFTWARE_UPDATE_MAX_CONFIGURED_FREQ = "mosip.registration.softwareUpdateCheck_configured_frequency"; - public static final String DSC_CODE_ONE = "REG-DSC‌-001"; - - /** Packet Status Sync Constants */ - public static final String SYNC_PROGRESS_BAR_VALUE = "syncProgressVlaue"; - public static final String PACKET_STATUS_SYNC_RESPONSE_ENTITY = "registrations"; - public static final String PACKET_STATUS_SYNC_SERVICE_NAME = "packet_status"; - public static final String PACKET_STATUS_READER_URL_PARAMETER = "request"; - public static final String RESPONSE = "response"; - public static final String PACKET_STATUS_READER_REGISTRATION_ID = "registrationId"; - public static final String PACKET_STATUS_READER_STATUS_CODE = "statusCode"; - public static final String PACKET_STATUS_CODE_PROCESSED = "PROCESSED"; - public static final String PACKET_STATUS_CODE_PROCESSING = "PROCESSING"; - public static final String PACKET_STATUS_CODE_REREGISTER = "REREGISTER"; - public static final String RE_REGISTER_STATUS_COMEMNTS = "Re-Register"; - public static final String PACKET_STATUS_CODE_REJECTED = "REJECTED"; - public static final List PACKET_STATUS_CODES_FOR_REMAPDELETE = Arrays.asList(PACKET_STATUS_CODE_REREGISTER, - PACKET_STATUS_CODE_PROCESSING, PACKET_STATUS_CODE_PROCESSED, PACKET_STATUS_CODE_REJECTED); - public static final String MACHINE_CENTER_REMAP_FLAG = "mosip.registration.machinecenterchanged"; - public static final String MACHINE_CENTER_REMAP_MSG = "Machine Center Remap process started"; - public static final String PACKET_STATUS_READER_ID = "mosip.registration.status"; - public static final String PACKET_SYNC_STATUS_ID = "mosip.registration.sync"; - public static final String PACKET_SYNC_VERSION = "1.0"; - - public static final String BIOMETRIC_IMAGE = "Image"; - public static final String BIOMETRIC_TYPE = "Type"; - // Packet Upload - public static final String PACKET_TYPE = "file"; - public static final String PACKET_STATUS_PRE_SYNC = "PRE_SYNC"; - public static final String PACKET_STATUS_SYNC_TYPE = "NEW"; - public static final String ACKNOWLEDGEMENT_FILE = "_Ack"; - public static final String ACKNOWLEDGEMENT_FILE_EXTENSION = "_Ack.html"; - public static final String PACKET_SYNC_ERROR = "Error"; - public static final String RE_REGISTRATION_STATUS = "REREGISTER"; - public static final String PACKET_SYNC_REF_ID = "packetsync"; - public static final String PACKET_UPLOAD_REF_ID = "packetUpload"; - - // Device On-boarding - public static final String MAC_ADDRESS = "macaddress"; - public static final String DONGLE_SERIAL_NUMBER = "dongleSerialNumber"; - public static final String ONBOARD_DEVICES_REF_ID_TYPE = "UserID"; - - // Template Name - public static final String ACKNOWLEDGEMENT_TEMPLATE = "Ack Template"; - public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_1 = "reg-ack-template-part1"; - public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_2 = "reg-ack-template-part2"; - public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_3 = "reg-ack-template-part3"; - public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_4 = "reg-ack-template-part4"; - public static final String EMAIL_TEMPLATE = "reg-email-notification"; - public static final String UPDATE_UIN_EMAIL_TEMPLATE = "updateUIN-email-notification"; - public static final String LOST_UIN_EMAIL_TEMPLATE = "lostUIN-email-notification"; - public static final String SMS_TEMPLATE = "reg-sms-notification"; - public static final String UPDATE_UIN_SMS_TEMPLATE = "updateUIN-sms-notification"; - public static final String LOST_UIN_SMS_TEMPLATE = "lostUIN-sms-notification"; - - // Notification Service - public static final String EMAIL_SUBJECT = "MOSIP REGISTRATION NOTIFICATION"; - public static final String EMAIL_SERVICE = "email"; - public static final String SMS_SERVICE = "sms"; - public static final String NOTIFICATION_SERVICE = "REGISTRATION - NOTIFICATION SERVICE "; - public static final String MODE_OF_COMMUNICATION = "mosip.notificationtype"; - - // Global configuration parameters - public static final String REGISTARTION_CENTER = "REGISTARTION_CENTER"; - public static final String GLOBAL_CONFIG_TRUE_VALUE = "Y"; - public static final String REG_PAK_MAX_CNT_APPRV_LIMIT = "mosip.registration.reg_pak_max_cnt_apprv_limit"; - public static final String REG_PAK_MAX_TIME_APPRV_LIMIT = "mosip.registration.reg_pak_max_time_apprv_limit"; - public static final String DEFAULT_HOST_IP = "mosip.registration.audit_default_host_ip"; - public static final String DEFAULT_HOST_NAME = "mosip.registration.audit_default_host_name"; - public static final String APP_NAME = "mosip.registration.audit_application_name"; - public static final String APP_ID = "mosip.registration.audit_application_id"; - public static final String SUPERVISOR_AUTH_CONFIG = "mosip.registration.supervisor_authentication_configuration"; - public static final String QUALITY_SCORE = "mosip.registration.quality_score"; - public static final String FINGERPRINT_AUTHENTICATION_THRESHHOLD = "mosip.fingerprint_authentication.quality_score"; - public static final String IRIS_AUTHENTICATION_THRESHHOLD = "mosip.iris_authentication.quality_score"; - public static final String CAPTURE_TIME_OUT = "mosip.registration.capture_time_out"; - public static final String FINGER_PRINT_SCORE = "mosip.registration.finger_print_score"; - public static final String INVALID_LOGIN_COUNT = "mosip.registration.invalid_login_count"; - public static final String INVALID_LOGIN_TIME = "mosip.registration.invalid_login_time"; - public static final String FACE_RECAPTURE_TIME = "mosip.registration.face_recapture_time"; - public static final String MIN_AGE = "mosip.kernel.applicant.type.age.limit"; - public static final String MAX_AGE = "mosip.registration.max_age"; - public static final String DOC_SIZE = "mosip.registration.document_size"; - public static final String DOC_TYPE = "mosip.registration.document_scanner_doctype"; - public static final String ACK_INSIDE_PACKET = "mosip.registration.save_ack_inside_packet"; - public static final String PKT_STORE_LOC = "mosip.registration.registration_packet_store_location"; - public static final String PKT_STORE_DATE_FORMAT = "mosip.registration.packet_store_date_format"; - public static final String MODE_OF_COMM = "mosip.registration.mode_of_communication"; - public static final String PWORD_LENGTH = "mosip.registration.username_pwd_length"; - public static final String DOC_DISABLE_FLAG = "mosip.registration.document_enable_flag"; - public static final String FINGERPRINT_DISABLE_FLAG = "mosip.registration.fingerprint_enable_flag"; - public static final String IRIS_DISABLE_FLAG = "mosip.registration.iris_enable_flag"; - public static final String FACE_DISABLE_FLAG = "mosip.registration.face_enable_flag"; - public static final String GPS_SERIAL_PORT_WINDOWS = "mosip.registration.gps_serial_port_windows"; - public static final String GPS_PORT_TIMEOUT = "mosip.registration.gps_port_timeout"; - public static final String GPS_PORT_LINUX = "mosip.registration.gps_serial_port_linux"; - public static final String DOC_SCAN_DPI = "mosip.registration.document_scanner_dpi"; - public static final String DOC_SCAN_CONTRAST = "mosip.registration.document_scanner_contrast"; - public static final String DOC_SCAN_BRIGHTNESS = "mosip.registration.document_scanner_brightness"; - public static final String DOC_SCANNER_ENABLED = "mosip.registration.document_scanner_enabled"; - public static final String SCANNER_IMG_TYPE = "jpg"; - public static final String IDENTITY_CLASS_NAME = "mosip.registration.identity_class_name"; - public static final String KEY_SPLITTER = "mosip.kernel.data-key-splitter"; - public static final String ASYMMETRIC_ALG_NAME = "RSA"; - public static final String CBEFF_UNQ_TAG = "mosip.registration.cbeff_only_unique_tags"; - public static final String REG_PKT_SIZE = "mosip.registration.max_reg_packet_size"; - public static final String LOGS_PATH = "mosip.registration.logs_path"; - public static final String DB_PATH = "mosip.registration.database_path"; - public static final String CLIENT_PATH = "mosip.registration.client_path"; - public static final String PRE_REG_DAYS_LIMIT = "mosip.registration.pre_reg_no_of_days_limit"; - public static final String GPS_DEVICE_MODEL = "mosip.registration.gps_device_model"; - public static final String GPS_DEVICE_DISABLE_FLAG = "mosip.registration.gps_device_enable_flag"; - public static final String PRE_REG_PACKET_LOCATION = "mosip.registration.registration_pre_reg_packet_location"; - public static final String IS_SOFTWARE_UPDATE_AVAILABLE = "mosip.registration.is_software_update_available"; - public static final String PROVIDER_NAME = "mosip.registration.provider_name"; - public static final String DISK_SPACE = "mosip.registration.disk_space_size"; - - // Spring Batch-Jobs - public static final String JOB_TRIGGER_STARTED = "Trigger started"; - public static final String JOB_TRIGGER_COMPLETED = "Trigger completed"; - public static final String JOB_EXECUTION_STARTED = "Execution started"; - public static final String JOB_EXECUTION_COMPLETED = "Execution completed"; - public static final String JOB_EXECUTION_SUCCESS = "Executed with success"; - public static final String JOB_EXECUTION_FAILURE = "Executed with failure"; - public static final String JOB_TRIGGER_MIS_FIRED = "Trigger Mis-Fired"; - public static final String JOB_EXECUTION_REJECTED = "Execution Rejected"; - public static final String RETRIEVED_PRE_REG_ID = "Retrieved Pre Registration"; - - public static final String offlineJobs = "mosip.registration.jobs.offline"; - public static final String unTaggedJobs = "mosip.registration.jobs.unTagged"; - public static final String restartableJobs = "mosip.registration.jobs.restart"; - - // Registration batch jobs scheduler : If ‘Y’ or ‘y’ means enabled, else - // anything as value means disabled - public static final String IS_REGISTRATION_JOBS_SCHEDULER_ENABLED = "mosip.registration.jobs.scheduler.enable"; - - // public static final String offlineJobs = - // "DEL_J00013,RDJ_J00010,ADJ_J00012,PVS_J00015"; - // public static final String unTaggedJobs ="PDS_J00003"; - // public static final String restartableJobs ="RCS_J00005"; - - public static final String JOB_TRIGGER_POINT_SYSTEM = "System"; - public static final String JOB_TRIGGER_POINT_USER = "User"; - public static final String JOB_SYNC_TO_SERVER = "Server"; - public static final String JOB_DETAIL = "jobDetail"; - public static final String APPLICATION_CONTEXT = "applicationContext"; - public static final String SYNC_TRANSACTION = "syncTransaction"; - - // GPS Device - public static final String GPS_LOGGER = "GPS-Device-Information"; - public static final String LONGITUDE = "longitude"; - public static final String GPS_DISTANCE = "distance"; - public static final String GPS_CAPTURE_ERROR_MSG = "gpsErrorMessage"; - public static final String GPS_CAPTURE_SUCCESS = "gpsCaptureSuccess"; - public static final String GPS_CAPTURE_FAILURE = "gpsCaptureFailure"; - public static final String GPS_CAPTURE_FAILURE_MSG = "GPS signal is weak please capture again"; - public static final String GPS_CAPTURE_SUCCESS_MSG = "GPS signal Captured Sucessfullty"; - public static final String GPS_CAPTURE_PORT_FAILURE_MSG = "Please insert the GPS device in the Specified Port"; - public static final String GPS_DEVICE_CONNECTION_FAILURE = "Please connect the GPS Device"; - public static final String GPS_DEVICE_CONNECTION_FAILURE_ERRO_MSG = "GPS device not found. Please connect an on-boarded GPS device."; - public static final String GPS_REG_LGE‌_002 = "REG-LGE‌-002"; - public static final String GPS_SERIAL_PORT = "COM4"; - public static final String GPS_ERROR_CODE = "errorCode"; - public static final String GPS_CAPTURING_EXCEPTION = "GPS_EXCEPTION"; - public static final String GPS_SIGNAL = "$GP"; - - // Documents - public static final String POA_DOCUMENT = "POA"; - public static final String POI_DOCUMENT = "POI"; - public static final String POR_DOCUMENT = "POR"; - public static final String DOB_DOCUMENT = "POB"; - public static final String POE_DOCUMENT = "POE"; - public static final String SERVER_STATUS_RESEND = "RESEND"; - public static final String CLIENT_STATUS_APPROVED = "APPROVED"; - public static final String SYNCED_STATUS = "SYNCED"; - - public static final List PACKET_STATUS = Arrays.asList("APPROVED", "REJECTED", "RE_REGISTER_APPROVED"); - - public static final List PACKET_STATUS_UPLOAD = Arrays.asList("APPROVED", "REJECTED", "SYNCED", "EXPORTED"); - - public static final List PACKET_EXPORT_STATUS = Arrays.asList("APPROVED", "EXPORTED", "SYNCED"); - - // Pre Registration - public static final String PRE_REGISTRATION_ID = "pre_registration_id"; - public static final String GET_PRE_REGISTRATION_IDS = "get_pre_registration_Ids"; - public static final String GET_PRE_REGISTRATION = "get_pre_registration"; - public static final String REGISTRATION_CLIENT_ID = "10"; - public static final String PRE_REGISTRATION_DUMMY_ID = "mosip.pre-registration.datasync.fetch.ids"; - public static final String VER = "1.0"; - public static final String PRE_REG_TO_GET_ID_ERROR = "PRE_REG_TO_GET_ID_ERROR"; - public static final String PRE_REG_TO_GET_PACKET_ERROR = "PRE_REG_TO_GET_PACKET_ERROR"; - public static final String PRE_REG_PACKET_NETWORK_ERROR = "PRE_REG_PACKET_NETWORK_ERROR"; - public static final String PRE_REG_SUCCESS_MESSAGE = "PRE_REG_SUCCESS_MESSAGE"; - public static final String IS_PRE_REG_SYNC = "PreRegSync"; - public static final String PRE_REG_FILE_NAME = "fileName"; - public static final String PRE_REG_FILE_CONTENT = "fileContent"; - public static final String PRE_REG_APPOINMENT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; - - // UI Date Format - public static final String DATE_FORMAT = "MM/dd/yyy hh:mm:ss"; - public static final String HH_MM_SS = "HH:mm:ss"; - - // Biometric Exception style - public static final String ADD_BORDER = "addBorderStyle"; - public static final String REMOVE_BORDER = "removeBorderStyle"; - public static final String OLD_BIOMETRIC_EXCEPTION = "oldBiometric"; - public static final String NEW_BIOMETRIC_EXCEPTION = "newBiometric"; - - // Iris & Fingerprint Capture for Individual Registration - public static final String IRIS_THRESHOLD = "mosip.registration.iris_threshold"; - public static final String FACE_THRESHOLD = "mosip.facequalitythreshold"; - public static final String IMAGE_FORMAT_KEY = "imageFormat"; - public static final String IMAGE_BYTE_ARRAY_KEY = "imageBytes"; - public static final String IMAGE_BYTE_ISO = "byteIso"; - public static final String IMAGE_SCORE_KEY = "imageScore"; - public static final String LEFT = "Left"; - public static final String RIGHT = "Right"; - public static final String EYE = "Eye"; - public static final String DOT = "."; - public static final String FINGER = "finger"; - public static final String HAND = "Hand"; - public static final String IRIS_LOWERCASE = "Iris"; - public static final String FINGERPRINT = "Fingerprint"; - public static final String FINGERPRINT_UPPERCASE = "FINGERPRINT"; - public static final String LEFTPALM = "leftSlap"; - public static final String RIGHTPALM = "rightSlap"; - public static final String THUMBS = "thumbs"; - public static final String PERCENTAGE = "%"; - public static final String ISO_FILE_NAME = "ISOTemplate"; - public static final String ISO_IMAGE_FILE_NAME = "ISOImage"; - public static final String ISO_FILE = "ISOTemplate.iso"; - public static final String DUPLICATE_FINGER = "DuplicateFinger"; - public static final String DUPLICATE_IRIS = "DuplicateIris"; - public static final String ISO_IMAGE_FILE = "ISOImage.iso"; - public static final String LEFTHAND_SLAP_FINGERPRINT_PATH = "/fingerprints/leftSlap.jpg"; - public static final String FACE_ISO = "/images/face.iso"; - public static final String LEFT_EYE_ISO = "/images/leftEye.iso"; - public static final String RIGHT_EYE_ISO = "/images/rightEye.iso"; - public static final String RIGHTHAND_SLAP_FINGERPRINT_PATH = "/fingerprints/rightSlap.jpg"; - public static final String BOTH_THUMBS_FINGERPRINT_PATH = "/fingerprints/thumbs.jpg"; - public static final String LEFTSLAP_FINGERPRINT_THRESHOLD = "mosip.registration.leftslap_fingerprint_threshold"; - public static final String RIGHTSLAP_FINGERPRINT_THRESHOLD = "mosip.registration.rightslap_fingerprint_threshold"; - public static final String THUMBS_FINGERPRINT_THRESHOLD = "mosip.registration.thumbs_fingerprint_threshold"; - public static final String FINGERPRINT_RETRIES_COUNT = "mosip.registration.num_of_fingerprint_retries"; - public static final String IRIS_RETRY_COUNT = "mosip.registration.num_of_iris_retries"; - public static final String[] LEFTHAND_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/lefthand/leftIndex/", - "/fingerprints/lefthand/leftLittle/", "/fingerprints/lefthand/leftMiddle/", - "/fingerprints/lefthand/leftRing/" }; - public static final String[] RIGHTHAND_SEGMNTD_DUPLICATE_FILE_PATHS = new String[] { - "/fingerprints/righthand/rightIndex/", "/fingerprints/righthand/rightLittle/", - "/fingerprints/righthand/rightMiddle/", "/fingerprints/righthand/rightRing/" }; - public static final String[] RIGHTHAND_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/Srighthand/rightIndex/", - "/fingerprints/Srighthand/rightLittle/", "/fingerprints/Srighthand/rightMiddle/", - "/fingerprints/Srighthand/rightRing/" }; - public static final String[] THUMBS_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/thumb/leftThumb/", - "/fingerprints/thumb/rightThumb/" }; - public static final String THUMB = "Thumb"; - public static final String LEFT_HAND = "Left Hand "; - public static final String RIGHT_HAND = "Right Hand "; - public static final String RIGHT_IRIS = "Right Iris "; - public static final String LEFT_IRIS = "Left Iris "; - public static final String[] LEFTHAND_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { - "/UserOnboard/leftHand/leftIndex/", "/UserOnboard/leftHand/leftLittle/", - "/UserOnboard/leftHand/leftMiddle/", "/UserOnboard/leftHand/leftRing/" }; - public static final String[] RIGHTHAND_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { - "/UserOnboard/rightHand/rightIndex/", "/UserOnboard/rightHand/rightLittle/", - "/UserOnboard/rightHand/rightMiddle/", "/UserOnboard/rightHand/rightRing/" }; - public static final String[] THUMBS_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { "/UserOnboard/thumb/leftThumb/", - "/UserOnboard/thumb/rightThumb/" }; - public static final String COMMA = ","; - public static final String HYPHEN = "-"; - public static final String FINGERPRINT_PANES_SELECTED = "fingerPrintPanesSelected"; - public static final String BIOMETRIC_PANES_SELECTED = "biometricPaneSelected"; - public static final Set BIO_TYPE = new HashSet<>( - Arrays.asList(RegistrationConstants.HAND, RegistrationConstants.THUMB)); - public static final String LEFTSLAPCOUNT = "leftSlapCount"; - public static final String RIGHTSLAPCOUNT = "rightSlapCount"; - public static final String THUMBCOUNT = "thumbCount"; - public static final String EXCEPTIONCOUNT = "exceptionCount"; - - /** Exception codes **/ - private static final String REG_SERVICE_CODE = "REG-SER-"; - - public static final String REG_FRAMEWORK_PACKET_HANDLING_EXCEPTION = PACKET_CREATION_EXP_CODE + "PHS-002"; - public static final String PACKET_ZIP_CREATION = REG_SERVICE_CODE + "ZCM-203"; - public static final String ENCRYPTED_PACKET_STORAGE = REG_SERVICE_CODE + "STM-211"; - public static final String LOGIN_SERVICE = REG_SERVICE_CODE + "IPD-214"; - public static final String SERVICE_DELEGATE_UTIL = REG_SERVICE_CODE + "IPD-215"; - public static final String SERVICE_DATA_PROVIDER_UTIL = REG_SERVICE_CODE + "DPU-216"; - public static final String UPDATE_SYNC_AUDIT = REG_SERVICE_CODE + "ADI-220"; - public static final String READ_PROPERTY_FILE_ERROR = REG_SERVICE_CODE + "PFR-222"; - public static final String PACKET_UPDATE_STATUS = REG_SERVICE_CODE + "UPS-217"; - public static final String PACKET_RETRIVE_STATUS = REG_SERVICE_CODE + "RPS-218"; - public static final String MACHINE_MAPPING_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "RDI-219"; - public static final String MACHINE_MAPPING_STATIONID_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "UMM-220"; - public static final String SYNC_STATUS_VALIDATE = REG_SERVICE_CODE + "SSV-223"; - public static final String MACHINE_MASTER_RECORD_NOT_FOUND = REG_SERVICE_CODE + "MMD-224"; - - // #Exceptions SyncJobs - public static final String SYNC_TRANSACTION_RUNTIME_EXCEPTION = REG_SERVICE_CODE + "RPS-BTM-226"; - public static final String SYNC_JOB_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "RPS-JTD-227"; - public static final String PACKET_SYNC__STATUS_READER_NULL_POINTER_EXCEPTION = REG_SERVICE_CODE + "RPS-PSJ-228"; - public static final String BASE_JOB_NO_SUCH_BEAN_DEFINITION_EXCEPTION = REG_SERVICE_CODE + "RPS-BJ-229"; - public static final String BASE_JOB_NULL_POINTER_EXCEPTION = REG_SERVICE_CODE + "RPS-BJ-229"; - - // Device Onboarding Service - private static final String DEVICE_ONBOARDING_SERVICE = REG_SERVICE_CODE + "DVO-"; - public static final String UPDATE_DEVICE_MAPPING_EXCEPTION = DEVICE_ONBOARDING_SERVICE + "MMS-232"; - - public static final String PACKET_RETRIVE_STATUS_EXCEPTION = REG_SERVICE_CODE + "PRS - 233"; - public static final String PACKET_UPDATE_STATUS_EXCEPTION = REG_SERVICE_CODE + "PUS - 234"; - - // Exceptions - private static final String REG_UI_CODE = "REG-UI"; - - public static final String REG_UI_LOGIN_LOADER_EXCEPTION = REG_UI_CODE + "RAI-001"; - public static final String REG_UI_LOGIN_SCREEN_LOADER_EXCEPTION = REG_UI_CODE + "LC-002"; - public static final String REG_UI_HOMEPAGE_LOADER_EXCEPTION = REG_UI_CODE + "ROC-003"; - public static final String REG_UI_BASE_CNTRLR_IO_EXCEPTION = REG_UI_CODE + "BAS-004"; - public static final String REG_UI_VIEW_ACK_FORM_IO_EXCEPTION = REG_UI_CODE + "VAF-005"; - - // Exceptions for User Registration - Iris & FingerPrint Capture - public static final String USER_REG_IRIS_CAPTURE_PAGE_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-001"; - public static final String USER_REG_IRIS_CAPTURE_NEXT_SECTION_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-002"; - public static final String USER_REG_IRIS_CAPTURE_PREV_SECTION_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-003"; - public static final String USER_REG_IRIS_CAPTURE_POPUP_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-004"; - public static final String USER_REG_IRIS_VALIDATION_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-005"; - public static final String USER_REG_IRIS_SCORE_VALIDATION_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-006"; - public static final String USER_REG_IRIS_SCAN_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "IFC-001"; - public static final String USER_REG_FINGERPRINT_SCAN_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FSC-003"; - public static final String USER_REG_FINGERPRINT_PAGE_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FCC-001"; - public static final String USER_REG_FINGERPRINT_CAPTURE_NEXT_SECTION_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE - + "FCC-002"; - public static final String USER_REG_FINGERPRINT_CAPTURE_PREV_SECTION_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE - + "FCC-003"; - public static final String USER_REG_FINGERPRINT_CAPTURE_POPUP_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE - + "FCC-004"; - public static final String USER_REG_FINGERPRINT_VALIDATION_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FCC-005"; - public static final String USER_REG_FINGERPRINT_SCORE_VALIDATION_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE - + "FCC-006"; - public static final String USER_REG_IRIS_SAVE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-008"; - public static final String USER_REG_GET_IRIS_QUALITY_SCORE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-009"; - public static final String USER_REG_IRIS_STUB_IMAGE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "IFC-002"; - - // Exception for Registration - Document Scan and Upload - public static final String USER_REG_DOC_SCAN_UPLOAD_EXP = USER_REGISTRATION_EXP_CODE + "SCN-001"; - - // Scan - public static final String USER_REG_SCAN_EXP = USER_REG_SCAN_EXP_CODE + "DOC-001"; - - // Regex Constants - public static final String FULL_NAME_REGEX = "([A-z]+\\s?\\.?)+"; - public static final int FULL_NAME_LENGTH = 50; - public static final String ADDRESS_LINE1_REGEX = "^.{1,50}$"; - public static final String NUMBER_REGEX = "\\d+"; - public static final String NUMBER_OR_NOTHING_REGEX = "^\\d*$"; - public static final String FOUR_NUMBER_REGEX = "\\d{4}"; - public static final String NUMBER_REGEX_ZERO_TO_THREE = "\\d{0,3}"; - public static final int MOBILE_NUMBER_LENGTH = 9; - public static final String EMAIL_ID_REGEX = "^([\\w\\-\\.]+)@((\\[([0-9]{1,3}\\.){3}[0-9]{1,3}\\])|(([\\w\\-]+\\.)+)([a-zA-Z]{2,4}))$"; - public static final String EMAIL_ID_REGEX_INITIAL = "([a-zA-Z]+\\.?\\-?\\@?(\\d+)?)+"; - public static final String CNI_OR_PIN_NUMBER_REGEX = "\\d{0,30}"; - public static final String AGE_REGEX = "\\d{1,2}"; - public static final String UIN_REGEX = "\\d{1,30}"; - public static final String POSTAL_CODE_REGEX = "\\d{5}"; - public static final String POSTAL_CODE_REGEX_INITIAL = "\\d{1,5}"; - public static final String REGEX_ANY = ".*"; - public static final String ONE = "1"; - public static final String BIOMETRIC_SEPERATOR = "(?<=\\.)(.*)(?=\\.)"; - - // master sync - public static final String MASTER_SYNC_SUCESS_MSG_CODE = "REG-MDS‌-001"; - public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG_CODE = "REG-MDS‌-002"; - public static final String MASTER_SYNC_FAILURE_MSG_CODE = "REG-MDS‌-003"; - public static final String MASTER_SYNC_FAILURE_MSG_INFO = "Error in sync"; - public static final String MASTER_SYNC_FAILURE_MSG = "SYNC_FAILURE"; - public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG_INFO = "Client not online"; - public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG = "PRE_REG_PACKET_NETWORK_ERROR"; - public static final String MASTER_SYNC_EXCEPTION = "MASTER_SYNC_EXCEPTION"; - public static final String MASTER_SYNC_JOD_DETAILS = "MASTER_SYNC_JOB_DETAILS"; - public static final String MASTER_SYNC_SUCCESS = "Sync successful"; - public static final String MASTER_SYNC = "MASTER_SYNC"; - public static final String NO_INTERNET = "NO_INTERNET"; - public static final String MASTER_VALIDATOR_SERVICE_NAME = "master_sync"; - public static final String MASTER_CENTER_REMAP_SERVICE_NAME = "center_remap_sync"; - public static final String MASTER_CENTER_PARAM = "regcenterId"; - public static final String MASTER_DATA_LASTUPDTAE = "lastUpdated"; - public static final String MASTER_SYNC_LOGGER_INFO = "Entering into Master Sync Dao Impl..."; - // POLICY SYNC - public static final String POLICY_SYNC_SUCCESS_CODE = "REG-MDS‌-001 "; - public static final String POLICY_SYNC_SUCCESS_MESSAGE = "SYNC_SUCCESS"; - public static final String POLICY_SYNC_ERROR_CODE = "REG-MDS‌-003 "; - public static final String POLICY_SYNC_ERROR_MESSAGE = "SYNC_FAILURE"; - public static final String POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_CODE = "REG-MDS‌-002"; - public static final String POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_MESSAGE = "POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_MESSAGE"; - - public static final String SYNCH_CONFIG_DATA_JOB_TITLE = "synch config data job"; - public static final String REG_USER_MAPPING_SYNC_JOB_TITLE = "registration user mapping sync job"; - - // PRE-REG DELETE JOB - public static final String PRE_REG_DELETE_SUCCESS = "PRE_REG_DELETE_SUCCESS"; - public static final String PRE_REG_DELETE_FAILURE = "PRE_REG_DELETE_FAILURE"; - - // Connection Error - public static final String CONNECTION_ERROR = "CONNECTION_ERROR"; - - // Exceptions - Template Generator - public static final String TEMPLATE_GENERATOR_ACK_RECEIPT_EXCEPTION = PACKET_CREATION_EXP_CODE + "TGE-002"; - public static final String TEMPLATE_GENERATOR_SMS_EXCEPTION = PACKET_CREATION_EXP_CODE + "TGE-002"; - - // Jobs - public static final String BATCH_JOB_START_SUCCESS_MESSAGE = "BATCH_JOB_START_SUCCESS_MESSAGE"; - public static final String START_SCHEDULER_ERROR_MESSAGE = "START_SCHEDULER_ERROR_MESSAGE"; - public static final String BATCH_JOB_STOP_SUCCESS_MESSAGE = "BATCH_JOB_STOP_SUCCESS_MESSAGE"; - public static final String STOP_SCHEDULER_ERROR_MESSAGE = "STOP_SCHEDULER_ERROR_MESSAGE"; - public static final String CURRENT_JOB_DETAILS_ERROR_MESSAGE = "CURRENT_JOB_DETAILS_ERROR_MESSAGE"; - public static final String EXECUTE_JOB_ERROR_MESSAGE = "EXECUTE_JOB_ERROR_MESSAGE"; - public static final String SYNC_DATA_PROCESS_ALREADY_STARTED = "SYNC_DATA_PROCESS_ALREADY_STARTED"; - public static final String SYNC_DATA_PROCESS_ALREADY_STOPPED = "SYNC_DATA_PROCESS_ALREADY_STOPPED"; - public static final String SYNC_DATA_DTO = "SYNC-DATA DTO"; - public static final String JOB_RUNNING = "RUNNING"; - public static final String JOB_COMPLETED = "COMPLETED"; - public static final String NO_JOB_COMPLETED = "NO_JOB_COMPLETED"; - public static final String NO_JOBS_TRANSACTION = "NO_JOBS_TRANSACTION"; - public static final String NO_JOBS_RUNNING = "NO_JOBS_RUNNING"; - public static final String JOB_UNKNOWN = "UNKNOWN"; - - // PACKET - public static final String PACKET_STATUS_SYNC_ERROR_RESPONSE = "PACKET_STATUS_SYNC_ERROR_RESPONSE"; - public static final String PACKET_STATUS_SYNC_SUCCESS_MESSAGE = "PACKET_STATUS_SYNC_SUCCESS_MESSAGE"; - public static final String PACKET_CREATION_DISK_SPACE_CHECK = "PACKET_CREATION_DISK_SPACE_CHECK"; - - // OTP - public static final String OTP_GENERATION_SUCCESS_MESSAGE = "OTP_GENERATION_SUCCESS_MESSAGE"; - public static final String OTP_GENERATION_ERROR_MESSAGE = "OTP_GENERATION_ERROR_MESSAGE"; - public static final String OTP_VALIDATION_ERROR_MESSAGE = "OTP_VALIDATION_ERROR_MESSAGE"; - - // Packet Export - public static final String FILE_EXPLORER_NAME = "File Explorer"; - - // Sync Status - public static final String REG_PKT_APPRVL_CNT_EXCEED = "REG_PKT_APPRVL_CNT_EXCEED"; - public static final String REG_PKT_APPRVL_TIME_EXCEED = "REG_PKT_APPRVL_TIME_EXCEED"; - public static final String OPT_TO_REG_TIME_EXPORT_EXCEED = "OPT_TO_REG_TIME_EXPORT_EXCEED"; - public static final String OPT_TO_REG_TIME_SYNC_EXCEED = "OPT_TO_REG_TIME_SYNC_EXCEED"; - public static final String OPT_TO_REG_REACH_MAX_LIMIT = "OPT_TO_REG_REACH_MAX_LIMIT"; - public static final String OPT_TO_REG_OUTSIDE_LOCATION = "OPT_TO_REG_OUTSIDE_LOCATION"; - public static final String OPT_TO_REG_WEAK_GPS = "OPT_TO_REG_WEAK_GPS"; - public static final String OPT_TO_REG_INSERT_GPS = "OPT_TO_REG_INSERT_GPS"; - public static final String OPT_TO_REG_GPS_PORT_MISMATCH = "OPT_TO_REG_GPS_PORT_MISMATCH"; - public static final String OPT_TO_REG_LAST_SOFTWAREUPDATE_CHECK = "OPT_TO_REG_LAST_SOFTWAREUPDATE_CHECK"; - - public static final String POLICY_SYNC_SERVICE = "policysync"; - public static final String KEY_NAME = "mosip.registration.key_policy_sync_threshold_value"; - public static final String OPT_TO_REG_LAST_EXPORT_REG_PKTS_TIME = "mosip.registration.last_export_registration_config_time"; - - // Reg Deletion - public static final String REGISTRATION_DELETION_BATCH_JOBS_SUCCESS = "REGISTRATION_DELETION_BATCH_JOBS_SUCCESS"; - public static final String REGISTRATION_DELETION_BATCH_JOBS_FAILURE = "REGISTRATION_DELETION_BATCH_JOBS_FAILURE"; - - // Application Language - public static final String APPLICATION_LANUAGE = "eng"; - - // Global-Config Constants - public static final String GET_GLOBAL_CONFIG = "get_registration_center_config"; - public static final String REGISTRATION_CENTER_ID = "registrationcenterid"; - public static final String GLOBAL_CONFIG_ERROR_MSG = "please synch the data before starting the application"; - - // user on boarding - public static final String USER_ON_BOARDING_ERROR_RESPONSE = "USER_ONBOARD_ERROR"; - public static final String USER_ON_BOARDING_EXCEPTION = "USER_ON_BOARDING_EXCEPTION"; - public static final String USER_ON_BOARDING_EXCEPTION_MSG_CODE = "REG-URE‌-000"; - public static final String USER_ON_BOARDING_SUCCESS_CODE = "REG-URE‌-002"; - public static final String USER_ON_BOARDING_SUCCESS_MSG = "USER_ONBOARD_SUCCESS"; - public static final String USER_ON_BOARDING_THRESHOLD_NOT_MET_MSG = "USER_ON_BOARDING_THRESHOLD_NOT_MET_MSG"; - public static final String USER_STATION_ID = "stationId"; - public static final String USER_CENTER_ID = "centerId"; - public static final String USER_ONBOARD_DATA = "UserOnboardBiometricData"; - public static final String USER_ON_BOARD_THRESHOLD_LIMIT = "mosip.registration.user_on_board_threshold_limit"; - - // Configuration Constants - public static final String AUDIT_LOG_DELETION_CONFIGURED_DAYS = "mosip.registration.audit_log_deletion_configured_days"; - public static final String SYNC_TRANSACTION_NO_OF_DAYS_LIMIT = "mosip.registration.sync_transaction_no_of_days_limit"; - public static final String REG_DELETION_CONFIGURED_DAYS = "mosip.registration.reg_deletion_configured_days"; - public static final String PRE_REG_DELETION_CONFIGURED_DAYS = "mosip.registration.pre_reg_deletion_configured_days"; - - // Audit Constants - public static final String AUDIT_LOGS_DELETION_SUCESS_MSG = "AUDIT_LOGS_DELETION_SUCESS_MSG"; - public static final String AUDIT_LOGS_DELETION_FLR_MSG = "Audit Logs Deleted Failed"; - public static final String AUDIT_LOGS_DELETION_EMPTY_MSG = "AUDIT_LOGS_DELETION_EMPTY_MSG"; - - // Rest Authentication Constants - public static final String USER_DTO = "userDTO"; - public static final String REST_OAUTH = "oauth"; - public static final String REST_OAUTH_USER_NAME = "userName"; - public static final String REST_OAUTH_USER_PSWD = "password"; - public static final String REST_OAUTH_ERROR_CODE = "REST-OAUTH-001"; - public static final String REST_OAUTH_ERROR_MSG = "Internal Server Error"; - public static final String REST_AUTHORIZATION = "authorization"; - public static final String REST_RESPONSE_BODY = "responseBody"; - public static final String REST_RESPONSE_HEADERS = "responseHeader"; - public static final String AUTH_SET_COOKIE = "Set-Cookie"; - public static final String AUTH_AUTHORIZATION = "Authorization"; - public static final String AUTH_EXPIRES = "Expires"; - public static final String AUTH_MAX_AGE = "Max-Age"; - public static final String REGISTRATION_CLIENT = "mosip.registration.app.id"; - public static final String REGISTRATION_CONTEXT = "auth-otp"; - public static final String COOKIE = "Cookie"; - public static final String ENGLISH_LANG_CODE = "eng"; - public static final String USER_ID_CODE = "USERID"; - public static final String OTP_CHANNELS = "mosip.registration.otp_channels"; - public static final String AUTH_TOKEN_NOT_RECEIVED_ERROR = "No Auth Token Received"; - - // Packet Sync - public static final String PACKET_SYNC = "packet_sync"; - - // Validations to ignore - - public static List fieldsToExclude() { - List fieldToExclude = new ArrayList<>(); - fieldToExclude.add("preRegistrationId"); - fieldToExclude.add("virtualKeyboard"); - fieldToExclude.add("docPageNumber"); - fieldToExclude.add("residence"); - fieldToExclude.add("NFR"); - fieldToExclude.add("FR"); - fieldToExclude.add("residenceLocalLanguage"); - fieldToExclude.add("genderValue"); - fieldToExclude.add("genderValueLocalLanguage"); - fieldToExclude.add("updateUinId"); - - return fieldToExclude; - - } - - // ID JSON Business Validation - private static final String ID_JSON_BIZ_VALIDATION_PREFIX = "mosip.id.validation.identity"; - public static final String LENGTH = "length"; - public static final String EMAIL_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("email"); - public static final String EMAIL_VALIDATION_LENGTH = EMAIL_VALIDATION_REGEX.concat(DOT).concat(LENGTH); - public static final String PHONE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("phone"); - public static final String PHONE_VALIDATION_LENGTH = PHONE_VALIDATION_REGEX.concat(DOT).concat(LENGTH); - public static final String REFERENCE_ID_NO_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("referenceIdentityNumber"); - public static final String POSTAL_CODE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("postalCode"); - public static final String POSTAL_CODE_VALIDATION_LENGTH = POSTAL_CODE_VALIDATION_REGEX.concat(DOT).concat(LENGTH); - public static final String DOB_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("dateOfBirth"); - public static final String ID_FULL_NAME_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("fullName.[*].value"); - public static final String ADDRESS_LINE_1_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("addressLine1.[*].value"); - public static final String ADDRESS_LINE_2_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("addressLine2.[*].value"); - public static final String ADDRESS_LINE_3_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) - .concat("addressLine3.[*].value"); - public static final String AGE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("age"); - public static final String TRUE = String.valueOf(true); - public static final String FALSE = String.valueOf(false); - public static String CNI_MANDATORY = String.valueOf(false); - - public static final String REGEX = "regex"; - public static final String IS_MANDATORY = "isMandatory"; - public static final String IS_FIXED = "isFixed"; - - // Virus Scan - public static final String VIRUS_SCAN_PACKET_NOT_FOUND = "FILE_NOT_PRESENT_FOR_SCAN"; - public static final String VIRUS_SCAN_INFECTED_FILES = "Infected Files"; - public static final String ANTIVIRUS_SERVICE_NOT_ACCESSIBLE = "ANTIVIRUS_SERVICE_NOT_ACCESSIBLE"; - - // concent of applicant - public static final String YES = "Yes"; - public static final String NO = "No"; - - // User Details - public static final String USER_DETAILS_SERVICE_NAME = "user_details"; - public static final String MAPPER_UTILL = "MAPPER_UTILL"; - public static final String REG_ID = "regid"; - - public static final String CONTENT_TYPE_EMAIL = "EMAIL"; - public static final String CONTENT_TYPE_MOBILE = "MOBILE"; - - // Key-Policy Key validation - public static final String VALID_KEY = "VALID KEY"; - public static final String INVALID_KEY = "INVALID_KEY"; - - public static final String JOB_ID = "JOB_ID"; - - public static final String SYNC_DATA_FREQ = "mosip.registration.sync_data_freq"; - - public static final String LABEL = "Label"; - public static final String LABEL_SMALL_CASE = "label"; - - public static final Object UI_SYNC_DATA = "mosip.registration.ui_sync_data"; - public static final String MDM_ENABLED = "mosip.mdm.enabled"; - - public static final String MESSAGE = "Message"; - public static final String HASH = "#"; - public static final String QOUTE = "\""; - public static final String DOB_MESSAGE = "dobMessage"; - public static final String DD = "dd"; - public static final String MM = "mm"; - public static final String YYYY = "yyyy"; - public static final String DOB = "dob"; - public static final String ERRORS = "errors"; - public static final String ERROR_MSG = "message"; - public static final String OK_MSG = "ok"; - public static final String NEW_LINE = "\n"; - - public static final String ATTR_INDIVIDUAL_TYPE = "individualTypeCode"; - public static final String ATTR_DATE_OF_BIRTH = "dateofbirth"; - public static final String ATTR_GENDER_TYPE = "genderCode"; - public static final String ATTR_NON_FORINGER = "NFR"; - public static final String ATTR_FORINGER = "FR"; - public static final String ATTR_FORINGER_DOB_PARSING = "yyyy/MM/dd"; - public static final String ATTR_FORINGER_DOB_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - - public static final String SYNC_FAILURE = "SYNC_FAILURE"; - - // Scheduler - public static final String IDEAL_TIME = "mosip.registration.ideal_time"; - public static final String REFRESHED_LOGIN_TIME = "mosip.registration.refreshed_login_time"; - public static final String SCHEDULER_TITLE_STYLE = "schedulerTitleMsg"; - public static final String SCHEDULER_CONTENT_STYLE = "schedulerMsg"; - public static final String SCHEDULER_TITLE_BORDER = "schedulerTitle"; - public static final String SCHEDULER_TIMER_STYLE = "schedulerTimer"; - public static final String SCHEDULER_BTN_STYLE = "schedulerContinueBtn"; - public static final String SCHEDULER_BORDER = "schedulerStage"; - - public static final String USER_DETAILS = "userDetails"; - - public static final String OTP_EXPIRY_TIME = "mosip.kernel.otp.expiry-time"; - - // TODO Need to discuss with Sravya about code - public static String INITIAL_SETUP = "mosip.registration.initial_setup"; - - public static final String SIGNED_KEY = "signed-key"; - public static final String TIME_STAMP = "timeStamp"; - public static final String REF_ID = "referenceId"; - public static final String PUBLIC_KEY_ISSUES_DATE = "issuedAt"; - public static final String PUBLIC_KEY_EXPIRE_DATE = "expiryAt"; - public static final String PUBLIC_KEY = "publicKey"; - public static final String PUBLIC_KEY_REST = "public_key"; - public static final String KER = "SIGN"; - public static final String DTAE_MONTH_YEAR_REGEX = "dd|mm|yyyy|ddLocalLanguage|mmLocalLanguage|yyyyLocalLanguage|ageField|dob"; - - public static final String UIN_UPDATE_PARENTGUARDIAN_DETAILS = "parentOrGuardianDetails"; - - public static final String PAGE_NAVIGATION_CONFIRM = "PAGE_NAVIGATION_CONFIRM"; - public static final String PAGE_NAVIGATION_CANCEL = "PAGE_NAVIGATION_CANCEL"; - public static final String UPDATE_NOW_LABEL = "UPDATE_NOW_LABEL"; - public static final String UPDATE_LATER_LABEL = "UPDATE_LATER_LABEL"; - public static String CANCEL_MSG = "CANCEL_LABEL"; - public static final String PUBLIC_KEY_REF_ID = "packet-encryption-key"; - public static final String USER_DETAIL_SALT_SERVICE_NAME = "user_salt_details"; - public static final String SERVICES_VERSION_KEY = "mosip.reg.services.current.version"; - - // TPM - public static final byte[] NULL_VECTOR = new byte[0]; - public static final String MOSIP_REGISTRATION_DB_KEY = "mosip.reg.db.key"; - - // SQL Execution - public static final String SQL_EXECUTION_SUCCESS = "SQL EXECUTION SUCCESS"; - public static final String ROLL_BACK_SQL_EXECUTION_SUCCESS = "ROLL BACK SQL EXECUTION SUCCESS"; - public static final String ROLL_BACK_SQL_EXECUTION_FAILURE = "ROLL BACK SQL EXECUTION FAILURE"; - public static final String SQL_EXECUTION_FAILURE = "SQL EXECUTION FAILURE"; - public static final String BACKUP_PREVIOUS_SUCCESS = "Backup Success"; - public static final String BACKUP_PREVIOUS_FAILURE = "Backup Failed"; - - public static final String PUBLICKEY = "publicKey"; - public static final String ISSUED_AT = "issuedAt"; - public static final String EXPIRY_AT = "expiryAt"; - public static final String SERVICE_NAME = "policysync"; - - public static final String IDA_REFERENCE_ID = "INTERNAL"; - public static final String PUBLIC_KEY_IDA_REST = "ida_key"; - public static final String ON_BOARD_IDA_VALIDATION = "ida_auth"; - public static final String ID = "id"; - public static final String IDENTITY = "mosip.identity.auth.internal"; - public static final String VERSION = "version"; - public static final String REQUEST_TIME = "requestTime"; - public static final String TRANSACTION_ID = "transactionID"; - public static final String TRANSACTION_ID_VALUE = "1234567890"; - public static final String BIO = "bio"; - public static final String REQUEST_AUTH = "requestedAuth"; - public static final String CONSENT_OBTAINED = "consentObtained"; - public static final String INDIVIDUAL_ID = "individualId"; - public static final String INDIVIDUAL_ID_TYPE = "individualIdType"; - public static final String KEY_INDEX = "keyIndex"; - public static final String ON_BOARD_TIME_STAMP = "timestamp"; - public static final String DEVICE_PROVIDER_ID = "deviceProviderID"; - public static final String ON_BOARD_BIO_TYPE = "bioType"; - public static final String ON_BOARD_BIO_SUB_TYPE = "bioSubType"; - public static final String ON_BOARD_BIO_VALUE = "bioValue"; - public static final String ON_BOARD_BIO_DATA = "data"; - public static final String ON_BOARD_BIOMETRICS = "biometrics"; - public static final String ON_BOARD_REQUEST = "request"; - public static final String ON_BOARD_REQUEST_HMAC = "requestHMAC"; - public static final String ON_BOARD_REQUEST_SESSION_KEY = "requestSessionKey"; - public static final String ON_BOARD_PUBLIC_KEY_ERROR = "Public key is either null or invalid public key"; - public static final String ON_BOARD_AUTH_STATUS = "authStatus"; - public static final String ON_BOARD_FACE_ID = "FID"; - public static final String ON_BOARD_IRIS_ID = "IIR"; - public static final String ON_BOARD_FINGER_ID = "FIR"; - public static final String ON_BOARD_COGENT = "cogent"; - public static final String AGE_IDENTITY = "identity"; - public static final String DATE_OF_BIRTH = "dateOfBirth"; - - public static final String STUB_FACE = "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"; - - // TPM Public Key Sync - public static final String ERROR_CODE = "errorCode"; - public static final String MESSAGE_CODE = "message"; - public static final String TPM_PUBLIC_KEY_SYNC_SERVICE_NAME = "tpm_public_key"; - public static final String SERIAL_NUMBER = "serialnumber"; - - public static final String SYSTEM="SYSTEM"; - - public static final String RESPONSE_SIGNATURE = "response-signature"; - public static final String ON_BOARD_FACE = "FACE"; - public static final String USER_ON_BOARD_IDA_AUTH = "mosip.registration.onboarduser_ida_auth"; - public static final String AUTH_SERVICE_URL = "authmanager/authenticate"; - public static final String REG_HEALTH_CHECK_URL_PROPERTY = "mosip.reg.healthcheck.url"; - - public static final int DAYS = 31; - public static final int MONTH = 12; - public static final int YEAR = 3; - public static final String EYETOOLTIP = "View Details"; - public static final String DOCUMENT_VIEW_ICON = "DocumentViewIcon"; - - public static final String LANG_CODE_MANDATORY = "language code is mandatory..."; - public static final String CODE_AND_LANG_CODE_MANDATORY = "code and language code is mandatory..."; - public static final String TRIGGER_POINT_MSG = "trigger point is mandatory..."; - - public static final String LeftIndex = "Left Index"; - public static final String LeftMiddle = "Left Middle"; - public static final String LeftRing = "Left Ring"; - public static final String LeftLittle = "Left Little"; - public static final String RightIndex = "Right Index"; - public static final String RightMiddle = "Right Middle"; - public static final String RightRing = "Right Ring"; - public static final String RightLittle = "Right Little"; - public static final String LeftThumb = "Left Thumb"; - public static final String RightThumb = "Right Thumb"; - - // bio-devices bio-types - public static final List LEFT_SLAP = Arrays.asList(LeftIndex, LeftMiddle, LeftRing, LeftLittle); - - public static final List RIGHT_SLAP = Arrays.asList(RightIndex, RightMiddle, RightRing, RightLittle); - - public static final List TWO_THUMBS = Arrays.asList(LeftThumb, RightThumb); - - public static final String LEFT_EYE = "Left Iris"; - public static final String RIGHT_EYE = "Right Iris"; - - public static final List TWO_IRIS = Arrays.asList(LEFT_EYE, RIGHT_EYE); - - public static final String SESSION_KEY_URL = "session_key"; - public static final String AUTH_HASH = "hash"; - public static final String SESSION_KEY = "sessionKey"; - public static final String SIGNATURE = "signature"; - public static final String ADD = "aad"; - public static final String SALT = "salt"; - public static final String REQ_TIME = "requesttime"; - public static final String AP_ID = "applicationId"; - public static final String AP_IDA = "IDA"; - public static final int MAX_BIO_QUALITY_SCORE = 100; - - public static String DEDUPLICATION_ENABLE_FLAG = "mosip.registration.mds.deduplication.enable.flag"; - - public static String DEDUPLICATION_FINGERPRINT_ENABLE_FLAG = "mosip.registration.mds.fingerprint.dedup.enable.flag"; - public static String DEDUPLICATION_IRIS_ENABLE_FLAG = "mosip.registration.mds.iris.dedup.enable.flag"; - public static String DEDUPLICATION_FACE_ENABLE_FLAG = "mosip.registration.mds.face.dedup.enable.flag"; - public static String RE_MAP_SUCCESS = "rempaSucess"; - - public static final String SERVER_PROFILE = "profile"; - public static final String SERVER_PROD_PROFILE = "PROD"; - public static final String SERVER_NO_PROFILE = "NO_PROFILE"; - public static final String SERVER_ACTIVE_PROFILE = "mosip.registration.server_profile"; - - public static final String applicantBiometricDTO = "applicantBiometricDTO"; - public static final String introducerBiometricDTO = "introducerBiometricDTO"; - public static final String supervisorBiometricDTO = "supervisorBiometricDTO"; - public static final String operatorBiometricDTO = "operatorBiometricDTO"; - - public static final String leftIndexUiAttribute = "leftIndex"; - public static final String leftLittleUiAttribute = "leftLittle"; - public static final String leftMiddleUiAttribute = "leftMiddle"; - public static final String leftRingUiAttribute = "leftRing"; - public static final String leftThumbUiAttribute = "leftThumb"; - - public static final String rightIndexUiAttribute = "rightIndex"; - public static final String rightLittleUiAttribute = "rightLittle"; - public static final String rightMiddleUiAttribute = "rightMiddle"; - public static final String rightThumbUiAttribute = "rightThumb"; - public static final String rightRingUiAttribute = "rightRing"; - - public static final String leftEyeUiAttribute = "leftEye"; - public static final String rightEyeUiAttribute = "rightEye"; - - public static final List rightHandUiAttributes = Arrays.asList(rightIndexUiAttribute, - rightLittleUiAttribute, rightMiddleUiAttribute, rightRingUiAttribute); - - public static final List leftHandUiAttributes = Arrays.asList(leftIndexUiAttribute, leftLittleUiAttribute, - leftMiddleUiAttribute, leftRingUiAttribute); - - public static final List twoThumbsUiAttributes = Arrays.asList(rightThumbUiAttribute, leftThumbUiAttribute); - - public static final List eyesUiAttributes = Arrays.asList(leftEyeUiAttribute, rightEyeUiAttribute); - - public static final List faceUiAttributes = Arrays.asList("face"); - public static final String indBiometrics = "individualBiometrics"; - - public static final String ID_SCHEMA_SYNC_SERVICE = "idschema_key"; - - public static final String BIOMETRICS_TYPE = "biometricsType"; - public static final String APPLICANT = "applicant"; - - public static final String MOSIP_CLEINT_ID = "mosip.registration.client.id"; - public static final String MOSIP_SECRET_KEY = "mosip.registration.secret.Key"; - - /** BELOW WERE EXTERNALISING Spring.properties to external configs */ - - // Timeout Configuartion - public static final String HTTP_API_READ_TIMEOUT = "mosip.registration.HTTP_API_READ_TIMEOUT"; - public static final String HTTP_API_WRITE_TIMEOUT = "mosip.registration.HTTP_API_WRITE_TIMEOUT"; - - // Biometric Device Already present in configs - // public static final String PROVIDER_NAME = - // "mosip.registration.PROVIDER_NAME"; - // public static final String WEBCAM_LIBRARY_NAME = - // "mosip.registration.WEBCAM_LIBRARY_NAME"; - - // document scanner properties - public static final String DOCUMENT_SCANNER_DEPTH = "mosip.registration.DOCUMENT_SCANNER_DEPTH"; - public static final String DOCUMENT_SCANNER_HOST = "mosip.registration.DOCUMENT_SCANNER_HOST"; - public static final String DOCUMENT_SCANNER_PORT = "mosip.registration.DOCUMENT_SCANNER_PORT"; - public static final String DOCUMENT_SCANNER_TIMEOUT = "mosip.registration.DOCUMENT_SCANNER_TIMEOUT"; - - // #MDM - // #host has to be clarified whether nedd to be in config or hardcoded - // #portRangeFrom and portRangeTo are mandate,portRangeTo can be same are - // greater than then portRangeFrom - public static final String MDM_HOST = "mosip.registration.mdm.host"; - public static final String MDM_START_PORT_RANGE = "mosip.registration.mdm.portRangeFrom"; - public static final String MDM_END_PORT_RANGE = "mosip.registration.mdm.portRangeTo"; - public static final String MDM_CONTEXT_PATH = "mosip.registration.mdm.contextPath"; - public static final String MDM_HOST_PROTOCOL = "mosip.registration.mdm.hostProtocol"; - - // #Proof Of Exception Documents - public static final String POE_DOCUMENT_VALUE = "mosip.registration.doc_value"; - - public static final String LOST_REGISTRATION_BIO_MVEL_OPERATOR = "mosip.registration.lostuin.biometrics.mvel.operator"; - public static final String UPDATE_REGISTRATION_BIO_MVEL_OPERATOR = "mosip.registration.updateuin.biometrics.mvel.operator"; - public static final String LOST_REGISTRATION_BIO_MVEL_EXPR = "mosip.registration.lostuin.biometrics.mvel.expr"; - public static final String UPDATE_REGISTRATION_BIO_MVEL_EXPR = "mosip.registration.updateuin.biometrics.mvel.expr"; - - public static final String BIOMETRICS_GROUP = "Biometrics"; - - public static final String SPEC_VERSION_095 = "0.9.5"; - public static final String SPEC_VERSION_092 = "0.9.2"; - - public static final String TEMPLATE_FACE_IMAGE_SOURCE = "FaceImageSource"; - - public static final String REGISTRATION_EVENTS = "REG-EVT"; - - public static final String EXCEPTION_PHOTO = "Exception_Photo"; - - public static final String REG_SYNC_SERVICE_ID = "mosip.registration.processor.registration.sync.id"; - public static final String REG_SYNC_APPLICATION_VERSION = "mosip.registration.processor.application.version"; - public static final String DATETIME_PATTERN = "resident.datetime.pattern"; - public static final String SYNCSTATUSCOMMENT = "UIN Reactivation and Deactivation By External Resources"; - public static final String EXTENSION_OF_FILE = ".zip"; - - public static final String APPLICATIONNAME="Resident portal"; - - public static final String APPLICATIONID="10011"; - - - -} +package io.mosip.resident.constant; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Class contains the constants used in Registration application + * + * @author Balaji Sridharan + * @since 1.0.0 + * + */ +public class RegistrationConstants { + /** + * private constructor + */ + private RegistrationConstants() { + + } + + /*********** UI Constants **********/ + // paths of FXML pages to be loaded + + public static final String ERROR_PAGE = "/fxml/ErrorPage.fxml"; + public static final String INITIAL_PAGE = "/fxml/RegistrationLogin.fxml"; + public static final String HOME_PAGE = "/fxml/RegistrationOfficerLayout.fxml"; + public static final String HEADER_PAGE = "/fxml/Header.fxml"; + public static final String UPDATE_PAGE = "/fxml/UpdateLayout.fxml"; + public static final String OFFICER_PACKET_PAGE = "/fxml/RegistrationOfficerPacketLayout.fxml"; + public static final String CREATE_PACKET_PAGE = "/fxml/Registration.fxml"; + public static final String ACK_RECEIPT_PATH = "/fxml/AckReceipt.fxml"; + public static final String APPROVAL_PAGE = "/fxml/RegistrationApproval.fxml"; + public static final String FTP_UPLOAD_PAGE = "/fxml/PacketUpload.fxml"; + public static final String USER_MACHINE_MAPPING = "/fxml/UserClientMachineMapping.fxml"; + public static final String SYNC_STATUS = "/fxml/RegPacketStatus.fxml"; + public static final String ONHOLD_PAGE = "/fxml/OnholdComment.fxml"; + public static final String REJECTION_PAGE = "/fxml/RejectionComment.fxml"; + public static final String USER_AUTHENTICATION = "/fxml/Authentication.fxml"; + public static final String PENDING_ACTION_PAGE = "/fxml/RegistrationPendingAction.fxml"; + public static final String PENDING_APPROVAL_PAGE = "/fxml/RegistrationPendingApproval.fxml"; + public static final String REREGISTRATION_PAGE = "/fxml/ReRegistration.fxml"; + public static final String SCAN_PAGE = "/fxml/Scan.fxml"; + public static final String UIN_UPDATE = "/fxml/UpdateUIN.fxml"; + public static final String SYNC_DATA = "/fxml/SyncDataProcess.fxml"; + public static final String USER_ONBOARD = "/fxml/Onboard.fxml"; + public static final String SEND_NOTIFICATION_PAGE = "/fxml/SendNotification.fxml"; + public static final String PACKET_UPLOAD_STATUS_UI = "/fxml/PacketUploadStatus.fxml"; + public static final String ALERT_GENERATION = "/fxml/Alert.fxml"; + + // FXML Id + public static final String DEMOGRAPHIC_DETAIL = "demographicDetail"; + public static final String DOCUMENT_SCAN = "documentScan"; + public static final String DOCUMENT_PANE = "documentPane"; + public static final String EXCEPTION_PANE = "exceptionPane"; + public static final String BIOMETRIC_EXCEPTION = "biometricException"; + public static final String FINGER_PANE = "fingerPane"; + public static final String FINGER_SINGLE = "FINGERPRINT_SINGLE"; + public static final String FIN = "FIN"; + public static final String FINGER_SLAB = "FINGERPRINT_SLAB"; + public static final String FINGERPRINT_SLAB_LEFT = "FINGERPRINT_SLAB_LEFT"; + public static final String FINGERPRINT_SLAB_RIGHT = "FINGERPRINT_SLAB_RIGHT"; + public static final String FINGERPRINT_SLAB_THUMBS = "FINGERPRINT_SLAB_THUMBS"; + public static final String MDM_ENVIRONMENT = "Staging"; + public static final int MDM_TIMEOUT = 10000; + public static final String MDM_VERSION = "1.0"; + + public static final String IRIS_PANE = "irisPane"; + public static final String IRIS_IMAGE_LOCAL = "/images/leftEye.png"; + public static final String IRIS_IMAGE_LOCAL_RIGHT = "/images/rightEye.png"; + public static final String IRIS_SINGLE = "IRIS_SINGLE"; + public static final String IRIS_DOUBLE = "IRIS_DOUBLE"; + public static final String FINGERPRINT_CAPTURE = "fingerPrintCapture"; + public static final String IRIS_CAPTURE = "irisCapture"; + public static final String FACE_CAPTURE = "faceCapture"; + public static final String REGISTRATION_PREVIEW = "registrationPreview"; + public static final String OPERATOR_AUTHENTICATION = "operatorAuthenticationPane"; + public static final String ONBOARD_USER_PARENT = "onboardUser"; + public static final String ONBOARD_USER_SUCCESS = "userOnboardSuccess"; + // public static final String BIOMETRIC_EXCEPTION_FLOW = + // "biometricExceptionFlow"; + public static final String GUARDIAN_BIOMETRIC = "biometric"; + + // css for quality indicator + public static final String RETRY_ATTEMPT = "#retryAttempt_"; + public static final String RETRY_ATTEMPT_ID = "retryAttempt_"; + public static final String QUALITY_LABEL_GREY = "qualityLabelGrey"; + public static final String QUALITY_LABEL_GREEN = "qualityLabelGreen"; + public static final String QUALITY_LABEL_RED = "qualityLabelRed"; + public static final String PROGRESS_BAR_RED = "progress-barRed"; + public static final String PROGRESS_BAR_GREEN = "progress-barGreen"; + public static final String LABEL_RED = "labelRed"; + public static final String LABEL_GREEN = "labelGreen"; + public static final String IRIS_PANES_SELECTED = "IrisPanesSelected"; + public static final String BIO_IRIS_SELECTED = "bioIris"; + public static final String BIOMETRICS_DISPLAY = "biometricsDisplay"; + public static final String TOOLTIP_STYLE = "tooltipStyle"; + + // Page Flow + public static final String VISIBILITY = "visibility"; + // public static final String ONBOARD_LIST = "onboardPageList"; + // public static final String ONBOARD_MAP = "onboardMap"; + public static final String REGISTRATION_MAP = "registrationMap"; + public static final String ONBOARD = "onboard"; + + // CSS file + public static final String CSS_FILE_PATH = "application.css"; + + public static final String MOSIP_URL = "http://mosip.io"; + + // Images path + public static final String CLOSE_IMAGE_PATH = "/images/Close.png"; + public static final String DONE_IMAGE_PATH = "/images/done.png"; + public static final String DOC_STUB_PATH = "/images/PANStubbed.jpg"; + public static final String FP_IMG_PATH = "/images/fingerprint.jpg"; + public static final String IRIS_IMG_PATH = "/images/iris.jpg"; + public static final String FACE_IMG_PATH = "/images/Photo.png"; + public static final String LEFTPALM_IMG_PATH = "/images/leftHand.png"; + public static final String RIGHTPALM_IMG_PATH = "/images/rightHand.png"; + public static final String THUMB_IMG_PATH = "/images/thumbs.png"; + public static final String RIGHT_IRIS_IMG_PATH = "/images/Eye.png"; + public static final String LEFT_IRIS_IMG_PATH = "/images/Eye.png"; + public static final String DOUBLE_IRIS_IMG_PATH = "/images/Eyes.png"; + public static final String VIEW = "/images/View.png"; + public static final String SCAN = "/images/scan.png"; + public static final String SCAN_FOCUSED = "/images/scanFocused.png"; + public static final String BACK = "/images/arrowLeft.png"; + public static final String BACK_FOCUSED = "/images/backInWhite.png"; + public static final String WRONG_IMAGE_PATH = "/images/wrong.png"; + public static final String REJECT_IMAGE_PATH = "/images/Reject.png"; + public static final String SEND_EMAIL_IMAGE_PATH = "/images/SendEmail.png"; + public static final String SEND_EMAIL_FOCUSED_IMAGE_PATH = "/images/sendEmailFocused.png"; + public static final String LOGO = "/images/logo-final-small.png"; + public static final String NEW_REG_IMAGE = "/images/NewReg.png"; + public static final String NEW_REG_FOCUSED = "/images/NewRegistration.png"; + public static final String UPDATE_UIN_IMAGE = "/images/UINUpdate.png"; + public static final String UPDATE_UIN_FOCUSED = "/images/updateUINFocused.png"; + public static final String LOST_UIN_IMAGE = "/images/LostUIN.png"; + public static final String LOST_UIN_FOCUSED = "/images/lostUINFocused.png"; + public static final String SYNC_DATA_IMAGE = "/images/sync.png"; + public static final String SYNC_DATA_FOCUSED = "/images/syncFocused.png"; + public static final String DOWNLOAD_PREREG_IMAGE = "/images/DownloadPreRegData.png"; + public static final String DOWNLOAD_PREREG_FOCUSED = "/images/DownloadPreRegDataFocused.png"; + public static final String UPDATE_OP_BIOMETRICS_IMAGE = "/images/UpdateOperatorBiometrics.png"; + public static final String UPDATE_OP_BIOMETRICS_FOCUSED = "/images/UpdateOperatorBiometricsFocused.png"; + public static final String PENDING_APPROVAL_IMAGE = "/images/PendingApproval.png"; + public static final String PENDING_APPROVAL_FOCUSED = "/images/PendingApprovalFocused.png"; + public static final String RE_REGISTRATION_IMAGE = "/images/Re-Registration.png"; + public static final String RE_REGISTRATION_FOCUSED = "/images/ReRegistrationFocused.png"; + public static final String VIEW_REPORTS_IMAGE = "/images/ViewReports.png"; + public static final String VIEW_REPORTS_FOCUSED = "/images/ViewReportsFocused.png"; + public static final String SUCCESS_IMG_PTH = "/images/success.png"; + public static final String FAILURE_IMG_PTH = "/images/failure.png"; + public static final String GET_ONBOARDED_IMG_PATH = "/images/GetOnboarded.png"; + public static final String GET_ONBOARDED_FOCUSED = "/images/GetOnboardedFocus.png"; + public static final String ONBOARDING_IMG_PATH = "/images/OnboardYourself.png"; + public static final String ONBOARDING_FOCUSED = "/images/OnboardYourselfFocus.png"; + public static final String REGISTERING_IMG_PATH = "/images/RegisterIndividual.png"; + public static final String REGISTERING_FOCUSED = "/images/RegisterIndividualFocus.png"; + public static final String UPDATE_BIOMETRICS_IMG_PATH = "/images/activeBiometricDetail.png"; + public static final String UPDATE_BIOMETRICS_FOCUSED = "/images/UpdateBiometricsFocus.png"; + + // Authentication + public static final String SUPERVISOR_FINGERPRINT_LOGIN = "Supervisior Fingerprint Authentication"; + public static final String SINGLE = "single"; + public static final String MULTIPLE = "multiple"; + public static final String OTP_VALIDATION_SUCCESS = "success"; + public static final String SPLITTER = "#TYPE#"; + public static final String RESTART = "Restart"; + public static final String SUPERVISOR = "REGISTRATION_SUPERVISOR"; + public static final String OFFICER = "REGISTRATION_OFFICER"; + public static final String ROLE_DEFAULT = "Default"; + public static final String IRIS_STUB = "leftIris"; + public static final String FACE_STUB = "face"; + public static final String SUPERVISOR_AUTH = "supervisor"; + public static final String OFFICER_AUTH = "officer"; + + // Authentication Methods + public static final String PWORD = "PWD"; + public static final String OTP = "OTP"; + public static final String FACE = "FACE"; + public static final String FACE_FULLFACE = "FACE_FULL FACE"; + public static final String IRIS = "IRIS"; + + public static final String FNR = "FNR"; + public static final String IRS = "IRS"; + + public static final String LOGIN_OTP_PARAM = "otp"; + + public static final String LANGUAGE_SUPPORT = "mosip.supported-languages"; + + // Login + public static final String BLOCKED = "BLOCKED"; + public static final String LOGIN_INITIAL_SCREEN = "initialMode"; + public static final String LOGIN_SEQUENCE = "sequence"; + public static final String ONBOARD_USER = "isOnboardUser"; + public static final String ONBOARD_USER_UPDATE = "updateOnboard"; + public static final String ISPAGE_NAVIGATION_ALERT_REQ = "pageNavigationAlert"; + public static final String USER_MACHINE_VALIDATION_MSG = "USER_MACHINE_VALIDATION_MSG"; + public static final String BLOCKED_USER_ERROR = "BLOCKED_USER_ERROR"; + public static final String ROLES_EMPTY_ERROR = "ROLES_EMPTY_ERROR"; + public static final String ROLES_LIST = "roleList"; + public static final String USER_NAME_VALIDATION = "USER_NAME_VALIDATION"; + + // FingerPrint + public static final String FINGER_TYPE_MINUTIA = "minutia"; + public static final String FP_TIMEOUT = "TIMEOUT"; + + // Authorization Info + public static final String ADMIN_ROLE = "REGISTRATION_ADMIN"; + public static final String ROLES_EMPTY = "RolesEmpty"; + public static final String MACHINE_MAPPING = "MachineMapping"; + + // Generic + public static final String ERROR = "ERROR"; + public static final int PARAM_ONE = 1; + public static final int PARAM_ZERO = 0; + public static final String PREVIOUS = "PREVIOUS"; + public static final String NEXT = "NEXT"; + + // UI Registration Validations + public static final String ADDRESS_KEY = "PrevAddress"; + public static final String REGISTRATION_CONTROLLER = "REGISTRATION_CONTROLLER"; + public static final String DOCUMNET_SCAN_CONTROLLER = "DOCUMNET_SCAN_CONTROLLER"; + public static final String REGISTRATION_DATA = "registrationDTOContent"; + public static final String REGISTRATION_AGE_DATA = "ageDatePickerContent"; + public static final String REGISTRATION_PANE1_DATA = "demoGraphicPane1Content"; + public static final String REGISTRATION_PANE2_DATA = "demoGraphicPane2Content"; + public static final String REGISTRATION_ISEDIT = "isEditPage"; + public static final String IS_Child = "isChild"; + public static final String ENABLE = "Y"; + public static final String DISABLE = "N"; + public static final String VALIDATION_SPLITTER = "\\s,"; + public static final String ON_TYPE = "_ontype"; + public static final String POR_DOCUMENTS = "porDocuments"; + public static final String DOCUMENT_SCAN_PANE = "documentScanPane"; + public static final String POR_BOX = "porBox"; + public static final String VALIDATION_LOGGER = "VALIDATIONS"; + public static final String REG_LGN_001 = "REG_LGN_001"; + public static final String IS_BLOCKED_WORD = "IS_BLOCKED_WORD"; + public static final String BLACKLISTED_1 = "BLACKLISTED_1"; + public static final String BLACKLISTED_2 = "BLACKLISTED_2"; + public static final String BLACKLISTED_ARE = "BLACKLISTED_ARE"; + public static final String BLACKLISTED_IS = "BLACKLISTED_IS"; + + public static final String REG_DDC_004 = "REG_DDC_004"; + public static final String AGE_FIELD = "ageField"; + public static final String MOBILE_NUMBER = "mobileNo"; + public static final String POSTAL_CODE = "postalCode"; + public static final String CNI_OR_PIN = "cniOrPinNumber"; + public static final String UIN_ID = "uinId"; + public static final String EMAIL_ID = "emailId"; + public static final String ONTYPE = "ontype"; + public static final String TOOLTIP = "toolTip"; + public static final String DOC_COMBO_BOX = "documentCombobox"; + public static final String DEMOGRAPHIC_FIELD_LABEL = "demoGraphicFieldLabel"; + public static final String SCAN_VBOX = "scanVBox"; + public static final String DOCUMENT_CONTENT_BUTTON = "documentContentButton"; + + public static final String UIN_UPDATE_ISUINUPDATE = "isUINUpdate"; + public static final String LOCAL_LANGUAGE = "LocalLanguage"; + public static final String LANGUAGE_ENGLISH = "english"; + public static final String LANGUAGE_ARABIC = "arabic"; + + public static final String SIMPLE_TYPE = "simpleType"; + public static final String NUMBER = "number"; + public static final String STRING = "string"; + public static final String AGE_DATE = "ageDate"; + public static final String DROPDOWN = "dropdown"; + public static final String TEXTBOX = "textbox"; + public static final String RESIDENCE_STATUS = "residenceStatus"; + public static final String PRIMARY = "primary"; + public static final String SECONDARY = "secondary"; + public static final String DemoGraphicFieldMessageLabel = "demoGraphicFieldMessageLabel"; + public static final String Parent = "Parent"; + public static final String updateUinCheckBox = "updateUinCheckBox"; + + public static final String APPLICATION_LANGUAGE = "application_language"; + public static final String REGISTRATION_LOCAL_LANGUAGE = "local_language"; + public static final String PACKET_TYPE_NEW = "New"; + public static final String REGISTRATION_DTO = "registrationDto"; + public static final String ADDRESS_LINE1 = "addressLine1"; + public static final String ADDRESS_LINE2 = "addressLine2"; + public static final String ADDRESS_LINE3 = "addressLine3"; + public static final String FULL_NAME = "fullName"; + public static final String PARENT_NAME = "parentName"; + public static final String UIN_LENGTH = "mosip.kernel.uin.length"; + + public static final String CHILD = "Child"; + public static final String ADULT = "Adult"; + public static final String AGE_DATEPICKER_CONTENT = "ageDatePickerContent"; + + public static final String TOGGLE_BIO_METRIC_EXCEPTION = "toggleBiometricException"; + public static final String IS_LOW_QUALITY_BIOMETRICS = "Low Quality Biometrics"; + + // Reasons for Exception + public static final String MISSING_BIOMETRICS = "Missing biometrics"; + public static final String LOW_QUALITY_BIOMETRICS = "Low quality of biometrics"; + public static final String PERMANENT_EXCEPTION = "Permanent"; + public static final String TEMPORARY_EXCEPTION = "Temporary"; + + // Lost UIN + public static final String PACKET_TYPE_LOST = "Lost"; + public static final String LOST_UIN_CONFIG_FLAG = "mosip.registration.lost_uin_disable_flag"; + + // update UIN + public static final String UIN_LABEL = "UIN"; + public static final String VID_LABEL = "VID"; + public static final String FIRST_TOGGLE_LABEL = "toggleLabel1"; + public static final String SECOND_TOGGLE_LABEL = "toggleLabel2"; + public static final String PACKET_TYPE_UPDATE = "Update"; + public static final String DOB_TOGGLE = "toggleAgeOrDob"; + public static final String UIN_UPDATE_CONFIG_FLAG = "mosip.registration.uin_update_config_flag"; + public static final String UIN_UPDATE_CONFIG_FIELDS_FROM_DB = "mosip.registration.uin.update.configured.fields"; + public static final String UIN_UPDATE_NAME = "name"; + public static final String UIN_UPDATE_AGE = "age"; + public static final String UIN_UPDATE_ADDRESS = "address"; + public static final String UIN_UPDATE_PHONE = "phone"; + public static final String UIN_UPDATE_EMAIL = "email"; + public static final String UIN_UPDATE_FOREIGNER = "foreigner"; + public static final String UIN_UPDATE_GENDER = "gender"; + public static final String UIN_UPDATE_PARENT_DETAILS = "parentOrGuardianDetails"; + public static final String UIN_UPDATE_CNIE_NUMBER = "cnieNumber"; + public static final String UIN_UPDATE_DEMOGRAPHICDETAIL = "demographicDetail"; + public static final String UIN_UPDATE_DOCUMENTSCAN = "documentScan"; + public static final String UIN_UPDATE_FINGERPRINTCAPTURE = "fingerPrintCapture"; + public static final String UIN_UPDATE_BIOMETRICEXCEPTION = "biometricException"; + public static final String UIN_UPDATE_BIOMETRICS = "biometrics"; + public static final String UIN_UPDATE_FACECAPTURE = "faceCapture"; + public static final String UIN_UPDATE_IRISCAPTURE = "irisCapture"; + public static final String UIN_UPDATE_REGISTRATIONPREVIEW = "registrationPreview"; + public static final String UIN_UPDATE_OPERATORAUTHENTICATIONPANE = "operatorAuthenticationPane"; + public static final String UIN_UPDATE_UINUPDATENAVLBL = "uinUpdateNavLbl"; + public static final String LOSTUINLBL = "/lostuin"; + public static final String UIN_UPDATE_NAME_LBL = "Name"; + public static final String UIN_UPDATE_AGE_LBL = "Age/DOB"; + public static final String UIN_UPDATE_ADDRESS_LBL = "Address"; + public static final String UIN_UPDATE_PHONE_LBL = "Phone"; + public static final String UIN_UPDATE_EMAIL_LBL = "Email"; + public static final String UIN_UPDATE_FOREIGNER_LBL = "Foreigner/National"; + public static final String UIN_UPDATE_GENDER_LBL = "Gender"; + public static final String MALE_CODE = "MLE"; + public static final String FEMALE_CODE = "FLE"; + public static final String STREAMER_THREAD = "STREAMER_THREAD"; + + public static final String UIN_UPDATE_PARENT_DETAILS_LBL = "Parent/Guardian details"; + public static final String UIN_UPDATE_CNIE_NUMBER_LBL = "CNIE/PIN/Residence Card Number"; + public static final String UIN_UPDATE_BIOMETRICS_LBL = "Biometrics"; + + // onBoard User + public static final String ONBOARD_STYLE_CLASS = "onboardAlertMsg"; + public static final String ONBOARD_IMG_PATH = "/images/tick.png"; + + public static final String TICK_CIRICLE_IMG_PATH = "/images/tick-circle.png"; + public static final String ONBOARD_LAST_BIOMETRIC_UPDTAE_FORMAT = "EEEE dd MMM hh:mm a"; + + // RegistrationApproval + public static final String PLACEHOLDER_LABEL = "PLACEHOLDER_LABEL"; + public static final String REGISTRATIONID = "registrationID"; + public static final String STATUSCODE = "statusCode"; + public static final String STATUSCOMMENT = "statusComment"; + public static final String ONHOLD_COMMENTS = "ONHOLD_COMMENTS"; + public static final String REJECTION_COMMENTS = "REJECT_COMMENTS"; + public static final String EMPTY = ""; + public static final String SPACE = " "; + public static final String UNDER_SCORE = "_"; + public static final String PDF = "pdf"; + public static final String CONSTANTS_FILE_NAME = "/constants.properties"; + public static final String PENDING = "Pending"; + public static final String EOD_PROCESS_CONFIG_FLAG = "mosip.registration.eod_process_config_flag"; + public static final String EOD_PROCESS_ID = "id"; + public static final String EOD_PROCESS_STATUSCOMMENT = "statusComment"; + public static final String EOD_PROCESS_ACKNOWLEDGEMENTFORMPATH = "acknowledgementFormPath"; + public static final String EOD_PROCESS_REGISTRATIONAPPROVALCONTROLLER = "RegistrationApprovalController"; + public static final String EXPORT_FILE_NAME = "PendingApprovalList"; + public static final String EXPORT_FILE_TYPE = ".csv"; + public static final String EOD_PROCESS_DATE_FORMAT = "dd-MM-yyyy"; + public static final String EOD_PROCESS_SLNO = "slno"; + public static final String EOD_PROCESS_DATE = "date"; + public static final String EOD_PROCESS_DATE_FORMAT_FOR_FILE = "yyyyMMddHHmmss"; + public static final String AUTH_ADVICE_FAILURE = "AUTH_ADVICE_FAILURE"; + + // Packet Store Location Constants + public static final String PACKET_STORE_LOCATION = "mosip.registration.registration_packet_store_location"; + public static final String PACKET_STORE_DATE_FORMAT = "mosip.registration.packet_store_date_format"; + + // Packet Creation Constants + public static final String ZIP_FILE_EXTENSION = ".zip"; + public static final String DEMOGRPAHIC_JSON_NAME = "ID.json"; + public static final String PACKET_META_JSON_NAME = "packet_meta_info.json"; + public static final String PACKET_DATA_HASH_FILE_NAME = "packet_data_hash.txt"; + public static final String PACKET_OSI_HASH_FILE_NAME = "packet_osi_hash.txt"; + public static final String PACKET_INTRODUCER_EXCEP_PHOTO_NAME = "_exception_photo.jpg"; + public static final String PACKET_INTRODUCER_EXCEP_PHOTO = "_exception_photo"; + public static final String AUDIT_JSON_FILE = "audit"; + public static final String JSON_FILE_EXTENSION = ".json"; + public static final String ACK_RECEIPT = "RegistrationAcknowledgement"; + public static final String APPLICANT_BIO_CBEFF_FILE_NAME = "applicant_bio_CBEFF.xml"; + public static final String OFFICER_BIO_CBEFF_FILE_NAME = "officer_bio_CBEFF.xml"; + public static final String SUPERVISOR_BIO_CBEFF_FILE_NAME = "supervisor_bio_CBEFF.xml"; + public static final String INTRODUCER_BIO_CBEFF_FILE_NAME = "introducer_bio_CBEFF.xml"; + public static final String AUTHENTICATION_BIO_CBEFF_FILE_NAME = "authentication_bio_CBEFF.xml"; + public static final String INDIVIDUAL = "INDIVIDUAL"; + public static final String INTRODUCER = "INTRODUCER"; + public static final String PARENT = "PARENT"; + public static final String CBEFF_BIR_UUIDS_MAP_NAME = "CBEFF_BIR_UUIDS"; + public static final String XML_FILE_FORMAT = ".xml"; + public static final String CBEFF_FILE_FORMAT = "cbeff"; + public static final String FACE_EXCEPTION = "ExceptionFace"; + public static final String IDENTITY_JSON_FILE_NAME = "mosip-identity-json-schema.json"; + public static final String CBEFF_SCHEMA_FILE_PATH = "/cbeff.xsd"; + public static final String CBEFF_DEFAULT_FORMAT_ORG = "Mosip"; + public static final String CBEFF_DEFAULT_FORMAT_TYPE = "257"; + public static final String CBEFF_DEFAULT_ALG_ORG = "HMAC"; + public static final String CBEFF_DEFAULT_ALG_TYPE = "SHA-256"; + public static final String CBEFF_FORMAT_ORG = "mosip.registration.cbeff_format_org"; + public static final String CBEFF_FORMAT_TYPE = "mosip.registration.cbeff_format_type"; + public static final String CBEFF_ALG_ORG = "mosip.registration.cbeff_algorithm_org"; + public static final String CBEFF_ALG_TYPE = "mosip.registration.cbeff_algorithm_type"; + public static final String IS_SUPERVISOR_AUTH_REQUIRED = "isSupervisorAuthRequired"; + public static final String IS_SUPERVISOR_BIOMETRICS_CAPTURED = "isSupervisorBiometricsCaptured"; + public static final String IS_OFFICER_BIOMETRICS_CAPTURED = "isOfficerBiometricsCaptured"; + + // Validation Types + public static final String VALIDATION_TYPE_FP = "Fingerprint"; + public static final String VALIDATION_TYPE_IRIS = "Iris"; + public static final String VALIDATION_TYPE_FACE = "Face"; + public static final String VALIDATION_TYPE_FP_SINGLE = "single"; + + // Supervisor Authentication + public static final String PWD_MATCH = "Username and Password Match"; + public static final String PWD_MISMATCH = "Username and Password Not Match"; + + // RSA + public static final String LOCALHOST = "localhost"; + + // Constants for Registration Creation Zip + + /** + * Specifies the format for storing the Registration Acknowledgement + */ + public static final String ACKNOWLEDGEMENT_FORMAT = "html"; + + public static final String IMAGE_FORMAT_PNG = "png"; + + // Constants for Registration ID Generator - will be removed after Kernel + // Integration + public static final String AGENCY_CODE = "2018"; + public static final String STATION_NUMBER = "78213"; + public static final String RID_DATE_FORMAT = "ddMMyyyyHHmmss"; + public static final String DATE_FORMAT_REG = "dd-MM-yyyy"; + + // Audit - Constants + public static final String AUDIT_DEFAULT_USER = "NA"; + + // OnlineConnectivity check + public static final String URL = "http://localhost:8080/getTokenId"; + + // ALert related constants + public static final String ALERT_INFORMATION = "INFORMATION"; + public static final String ALERT_WARNING = "WARNING"; + public static final String ALERT = "ALERT"; + + // api related constant values + public static final String HTTPMETHOD = "service.httpmethod"; + public static final String SERVICE_URL = "service.url"; + public static final String HEADERS = "service.headers"; + public static final String RESPONSE_TYPE = "service.responseType"; + public static final String REQUEST_TYPE = "service.requestType"; + public static final String AUTH_HEADER = "service.authheader"; + public static final String AUTH_REQUIRED = "service.authrequired"; + public static final String SIGN_REQUIRED = "service.signrequired"; + public static final String AUTH_TYPE = "BASIC"; + public static final String REQUEST_SIGN_REQUIRED = "service.requestsignrequired"; + + // OTP Related Details + public static final String OTP_GENERATOR_SERVICE_NAME = "otp_generator"; + public static final String USERNAME_KEY = "key"; + public static final String OTP_GENERATED = "otp"; + public static final String OTP_VALIDATOR_SERVICE_NAME = "otp_validator"; + public static final String OTP_GENERATOR_RESPONSE_DTO = "otpGeneratorResponseDTO"; + public static final String OTP_VALIDATOR_RESPONSE_DTO = "otpValidatorResponseDTO"; + + // Velocity Template Generator Constants + public static final String TEMPLATE_ACKNOWLEDGEMENT = "AckReceipt"; + public static final String TEMPLATE_PREVIEW = "Preview"; + public static final String TEMPLATE_QRCODE_SOURCE = "QRCodeSource"; + public static final String TEMPLATE_UIN_UPDATE = "UINUpdate"; + public static final String TEMPLATE_HEADER_TABLE = "headerTable"; + public static final String TEMPLATE_UIN_HEADER_TABLE = "uinHeaderTable"; + public static final String TEMPLATE_UIN_USER_LANG_LABEL = "UINPrimLabel"; + public static final String TEMPLATE_UIN_LOCAL_LANG_LABEL = "UINSecLabel"; + public static final String TEMPLATE_UIN = "UIN"; + public static final String TEMPLATE_RID_USER_LANG_LABEL = "RIDPrimLabel"; + public static final String TEMPLATE_RID_LOCAL_LANG_LABEL = "RIDSecLabel"; + public static final String TEMPLATE_RID = "RID"; + public static final String TEMPLATE_DATE_USER_LANG_LABEL = "DatePrimLabel"; + public static final String TEMPLATE_DATE_LOCAL_LANG_LABEL = "DateSecLabel"; + public static final String TEMPLATE_DATE = "Date"; + public static final String TEMPLATE_PRE_REG_ID_USER_LANG_LABEL = "PreRegIDPrimLabel"; + public static final String TEMPLATE_PRE_REG_ID_LOCAL_LANG_LABEL = "PreRegIDSecLabel"; + public static final String TEMPLATE_PRE_REG_ID = "PreRegID"; + public static final String TEMPLATE_PRE_REG = "IsPreRegIDPresent"; + public static final String TEMPLATE_DEMO_INFO = "DemographicInfo"; + public static final String DEMOGRAPHIC_TEXTFIELD_FOCUSED = "demoGraphicTextFieldFocused"; + public static final String DEMOGRAPHIC_TEXTFIELD = "demoGraphicTextField"; + public static final String TEMPLATE_FULL_NAME_USER_LANG_LABEL = "FullNamePrimLabel"; + public static final String TEMPLATE_FULL_NAME_LOCAL_LANG_LABEL = "FullNameSecLabel"; + public static final String TEMPLATE_FULL_NAME = "FullName"; + public static final String TEMPLATE_FULL_NAME_LOCAL_LANG = "FullNameSec"; + public static final String TEMPLATE_GENDER_USER_LANG_LABEL = "GenderPrimLabel"; + public static final String TEMPLATE_GENDER_LOCAL_LANG_LABEL = "GenderSecLabel"; + public static final String TEMPLATE_GENDER = "Gender"; + public static final String TEMPLATE_GENDER_LOCAL_LANG = "GenderSec"; + public static final String TEMPLATE_DOB_USER_LANG_LABEL = "DOBPrimLabel"; + public static final String TEMPLATE_DOB_LOCAL_LANG_LABEL = "DOBSecLabel"; + public static final String TEMPLATE_DOB = "DOB"; + public static final String TEMPLATE_AGE_USER_LANG_LABEL = "AgePrimLabel"; + public static final String TEMPLATE_AGE_LOCAL_LANG_LABEL = "AgeSecLabel"; + public static final String TEMPLATE_AGE = "Age"; + public static final String TEMPLATE_YEARS_USER_LANG = "YearsPrim"; + public static final String TEMPLATE_YEARS_LOCAL_LANG = "YearsSec"; + public static final String TEMPLATE_FOREIGNER_USER_LANG_LABEL = "ForiegnerPrimLabel"; + public static final String TEMPLATE_FOREIGNER_LOCAL_LANG_LABEL = "ForiegnerSecLabel"; + public static final String TEMPLATE_RESIDENCE_STATUS = "ResidenceStatus"; + public static final String TEMPLATE_RESIDENCE_STATUS_LOCAL_LANG = "ResidenceStatusSec"; + public static final String TEMPLATE_ADDRESS_LINE1_USER_LANG_LABEL = "AddressLine1PrimLabel"; + public static final String TEMPLATE_ADDRESS_LINE1_LOCAL_LANG_LABEL = "AddressLine1SecLabel"; + public static final String TEMPLATE_ADDRESS_LINE1 = "AddressLine1"; + public static final String TEMPLATE_ADDRESS_LINE1_LOCAL_LANG = "AddressLine1Sec"; + public static final String TEMPLATE_ADDRESS_LINE2_USER_LANG_LABEL = "AddressLine2PrimLabel"; + public static final String TEMPLATE_ADDRESS_LINE2_LOCAL_LANG_LABEL = "AddressLine2SecLabel"; + public static final String TEMPLATE_ADDRESS_LINE2 = "AddressLine2"; + public static final String TEMPLATE_ADDRESS_LINE3 = "AddressLine3"; + public static final String TEMPLATE_ADDRESS_LINE2_LOCAL_LANG = "AddressLine2Sec"; + public static final String TEMPLATE_REGION_USER_LANG_LABEL = "RegionPrimLabel"; + public static final String TEMPLATE_REGION_LOCAL_LANG_LABEL = "RegionSecLabel"; + public static final String TEMPLATE_REGION = "Region"; + public static final String TEMPLATE_CITY = "City"; + public static final String TEMPLATE_REGION_LOCAL_LANG = "RegionSec"; + public static final String TEMPLATE_PROVINCE_USER_LANG_LABEL = "ProvincePrimLabel"; + public static final String TEMPLATE_PROVINCE_LOCAL_LANG_LABEL = "ProvinceSecLabel"; + public static final String TEMPLATE_PROVINCE = "Province"; + public static final String TEMPLATE_PROVINCE_LOCAL_LANG = "ProvinceSec"; + public static final String TEMPLATE_LOCAL_AUTHORITY_USER_LANG_LABEL = "LocalAuthorityPrimLabel"; + public static final String TEMPLATE_LOCAL_AUTHORITY_LOCAL_LANG_LABEL = "LocalAuthoritySecLabel"; + public static final String TEMPLATE_LOCAL_AUTHORITY = "LocalAuthority"; + public static final String TEMPLATE_LOCAL_AUTHORITY_LOCAL_LANG = "LocalAuthoritySec"; + public static final String TEMPLATE_MOBILE_USER_LANG_LABEL = "MobilePrimLabel"; + public static final String TEMPLATE_MOBILE_LOCAL_LANG_LABEL = "MobileSecLabel"; + public static final String TEMPLATE_MOBILE = "Mobile"; + public static final String TEMPLATE_POSTAL_CODE_USER_LANG_LABEL = "PostalCodePrimLabel"; + public static final String TEMPLATE_POSTAL_CODE_LOCAL_LANG_LABEL = "PostalCodeSecLabel"; + public static final String TEMPLATE_POSTAL_CODE = "PostalCode"; + public static final String TEMPLATE_EMAIL_USER_LANG_LABEL = "EmailPrimLabel"; + public static final String TEMPLATE_EMAIL_LOCAL_LANG_LABEL = "EmailSecLabel"; + public static final String TEMPLATE_EMAIL = "Email"; + public static final String TEMPLATE_CNIE_NUMBER_USER_LANG_LABEL = "CNIEPrimLabel"; + public static final String TEMPLATE_CNIE_LOCAL_LANG_LABEL = "CNIESecLabel"; + public static final String TEMPLATE_CNIE_NUMBER = "CNIE"; + public static final String TEMPLATE_WITH_PARENT = "WithParent"; + public static final String TEMPLATE_PARENT_NAME_USER_LANG_LABEL = "ParentNamePrimLabel"; + public static final String TEMPLATE_PARENT_NAME_LOCAL_LANG_LABEL = "ParentNameSecLabel"; + public static final String TEMPLATE_PARENT_NAME = "ParentName"; + public static final String TEMPLATE_PARENT_UIN_USER_LANG_LABEL = "ParentUINPrimLabel"; + public static final String TEMPLATE_PARENT_UIN_LOCAL_LANG_LABEL = "ParentUINSecLabel"; + public static final String TEMPLATE_PARENT_UIN = "ParentUIN"; + public static final String TEMPLATE_PARENT_NAME_LOCAL_LANG = "ParentNameSec"; + public static final String TEMPLATE_DOCUMENTS_USER_LANG_LABEL = "DocumentsPrimLabel"; + public static final String TEMPLATE_DOCUMENTS_LOCAL_LANG_LABEL = "DocumentsSecLabel"; + public static final String TEMPLATE_DOCUMENTS = "Documents"; + public static final String TEMPLATE_DOCUMENTS_LOCAL_LANG = "DocumentsSec"; + public static final String TEMPLATE_BIOMETRICS_USER_LANG_LABEL = "BiometricsPrimLabel"; + public static final String TEMPLATE_BIOMETRICS_LOCAL_LANG_LABEL = "BiometricsSecLabel"; + public static final String TEMPLATE_BIOMETRICS_CAPTURED_USER_LANG_LABEL = "BiometricsCapturedPrimLabel"; + public static final String TEMPLATE_BIOMETRICS_CAPTURED_LOCAL_LANG_LABEL = "BiometricsCapturedSecLabel"; + public static final String TEMPLATE_BIOMETRICS_CAPTURED = "Biometrics"; + public static final String TEMPLATE_BIOMETRICS_CAPTURED_LOCAL_LANG = "BiometricsSec"; + public static final String TEMPLATE_WITHOUT_EXCEPTION = "WithoutException"; + public static final String TEMPLATE_WITH_EXCEPTION = "WithException"; + public static final String TEMPLATE_EXCEPTION_PHOTO_USER_LANG_LABEL = "ExceptionPhotoPrimLabel"; + public static final String TEMPLATE_EXCEPTION_PHOTO_LOCAL_LANG_LABEL = "ExceptionPhotoSecLabel"; + public static final String TEMPLATE_LEFT_EYE_USER_LANG_LABEL = "LeftEyePrimLabel"; + public static final String TEMPLATE_LEFT_EYE_LOCAL_LANG_LABEL = "LeftEyeSecLabel"; + public static final String TEMPLATE_RIGHT_EYE_USER_LANG_LABEL = "RightEyePrimLabel"; + public static final String TEMPLATE_RIGHT_EYE_LOCAL_LANG_LABEL = "RightEyeSecLabel"; + public static final String TEMPLATE_EXCEPTION_IMAGE_SOURCE = "ExceptionImageSource"; + public static final String TEMPLATE_LEFT_EYE = "LeftEye"; + public static final String TEMPLATE_EYE_IMAGE_SOURCE = "EyeImageSource"; + public static final String TEMPLATE_RIGHT_EYE = "RightEye"; + public static final String TEMPLATE_CAPTURED_LEFT_EYE = "CapturedLeftEye"; + public static final String TEMPLATE_CAPTURED_RIGHT_EYE = "CapturedRightEye"; + public static final String TEMPLATE_LEFT_PALM_USER_LANG_LABEL = "LeftPalmPrimLabel"; + public static final String TEMPLATE_LEFT_PALM_LOCAL_LANG_LABEL = "LeftPalmSecLabel"; + public static final String TEMPLATE_RIGHT_PALM_USER_LANG_LABEL = "RightPalmPrimLabel"; + public static final String TEMPLATE_RIGHT_PALM_LOCAL_LANG_LABEL = "RightPalmSecLabel"; + public static final String TEMPLATE_THUMBS_USER_LANG_LABEL = "ThumbsPrimLabel"; + public static final String TEMPLATE_THUMBS_LOCAL_LANG_LABEL = "ThumbsSecLabel"; + public static final String TEMPLATE_LEFT_PALM_IMAGE_SOURCE = "LeftPalmImageSource"; + public static final String TEMPLATE_RIGHT_PALM_IMAGE_SOURCE = "RightPalmImageSource"; + public static final String TEMPLATE_THUMBS_IMAGE_SOURCE = "ThumbsImageSource"; + public static final String TEMPLATE_LEFT_LITTLE_FINGER = "leftLittle"; + public static final String TEMPLATE_LEFT_RING_FINGER = "leftRing"; + public static final String TEMPLATE_LEFT_MIDDLE_FINGER = "leftMiddle"; + public static final String TEMPLATE_LEFT_INDEX_FINGER = "leftIndex"; + public static final String TEMPLATE_LEFT_THUMB_FINGER = "leftThumb"; + public static final String TEMPLATE_RIGHT_LITTLE_FINGER = "rightLittle"; + public static final String TEMPLATE_RIGHT_RING_FINGER = "rightRing"; + public static final String TEMPLATE_RIGHT_MIDDLE_FINGER = "rightMiddle"; + public static final String TEMPLATE_RIGHT_INDEX_FINGER = "rightIndex"; + public static final String TEMPLATE_RIGHT_THUMB_FINGER = "rightThumb"; + public static final String TEMPLATE_CAPTURED_LEFT_SLAP = "CapturedLeftSlap"; + public static final String TEMPLATE_CAPTURED_RIGHT_SLAP = "CapturedRightSlap"; + public static final String TEMPLATE_CAPTURED_THUMBS = "CapturedThumbs"; + public static final String TEMPLATE_MISSING_LEFT_FINGERS = "MissingLeftFingers"; + public static final String TEMPLATE_LEFT_SLAP_EXCEPTION_USER_LANG = "LeftSlapExceptionPrim"; + public static final String TEMPLATE_LEFT_SLAP_EXCEPTION_LOCAL_LANG = "LeftSlapExceptionSec"; + public static final String TEMPLATE_MISSING_RIGHT_FINGERS = "MissingRightFingers"; + public static final String TEMPLATE_RIGHT_SLAP_EXCEPTION_USER_LANG = "RightSlapExceptionPrim"; + public static final String TEMPLATE_RIGHT_SLAP_EXCEPTION_LOCAL_LANG = "RightSlapExceptionSec"; + public static final String TEMPLATE_MISSING_THUMBS = "MissingThumbs"; + public static final String TEMPLATE_THUMBS_EXCEPTION_USER_LANG = "ThumbsExceptionPrim"; + public static final String TEMPLATE_THUMBS_EXCEPTION_LOCAL_LANG = "ThumbsExceptionSec"; + public static final String TEMPLATE_RO_IMAGE_SOURCE = "ROImageSource"; + public static final String TEMPLATE_RO_NAME_USER_LANG_LABEL = "RONamePrimLabel"; + public static final String TEMPLATE_RO_NAME_LOCAL_LANG_LABEL = "RONameSecLabel"; + public static final String TEMPLATE_RO_NAME = "ROName"; + public static final String TEMPLATE_RO_NAME_LOCAL_LANG = "RONameSec"; + public static final String TEMPLATE_REG_CENTER_USER_LANG_LABEL = "RegCenterPrimLabel"; + public static final String TEMPLATE_REG_CENTER_LOCAL_LANG_LABEL = "RegCenterSecLabel"; + public static final String TEMPLATE_REG_CENTER = "RegCenter"; + public static final String TEMPLATE_REG_CENTER_LOCAL_LANG = "RegCenterSec"; + public static final String TEMPLATE_PHOTO_USER_LANG = "PhotoPrim"; + public static final String TEMPLATE_PHOTO_LOCAL_LANG = "PhotoSec"; + public static final String TEMPLATE_APPLICANT_IMAGE_SOURCE = "ApplicantImageSource"; + public static final String TEMPLATE_DATE_FORMAT = "dd/MM/yyyy"; + public static final String TEMPLATE_JPG_IMAGE_ENCODING = "data:image/jpg;base64,"; + public static final String TEMPLATE_PNG_IMAGE_ENCODING = "data:image/png;base64,"; + public static final String TEMPLATE_CROSS_MARK = "✘"; + public static final String TEMPLATE_EYE_IMAGE_PATH = "/images/Eye.png"; + public static final String TEMPLATE_LEFT_SLAP_IMAGE_PATH = "/images/leftHand.png"; + public static final String TEMPLATE_RIGHT_SLAP_IMAGE_PATH = "/images/rightHand.png"; + public static final String TEMPLATE_THUMBS_IMAGE_PATH = "/images/thumbs.png"; + public static final String TEMPLATE_STYLE_HIDE_PROPERTY = "style='display:none;'"; + public static final String TEMPLATE_RIGHT_MARK = "✓"; + public static final String TEMPLATE_FINGERPRINTS_CAPTURED = "FingerprintsCaptured"; + public static final String TEMPLATE_IMPORTANT_GUIDELINES = "ImportantGuidelines"; + public static final String TEMPLATE_NAME = "Acknowledgement Template"; + public static final String TEMPLATE_RESIDENT_NAME = "ResidentName"; + public static final String TEMPLATE_RO_IMAGE = "ROImage"; + public static final String TEMPLATE_MODIFY_IMAGE_PATH = "/images/Modify.png"; + public static final String TEMPLATE_MODIFY_IMAGE_SOURCE = "ModifyImageSource"; + public static final String TEMPLATE_MODIFY = "Modify"; + public static final String TEMPLATE_ENCODING = "UTF-8"; + public static final String TEMPLATE_FACE_CAPTURE_ENABLED = "FaceCaptureEnabled"; + public static final String TEMPLATE_DOCUMENTS_ENABLED = "DocumentsEnabled"; + public static final String TEMPLATE_BIOMETRICS_ENABLED = "BiometricsEnabled"; + public static final String TEMPLATE_IRIS_ENABLED = "IrisEnabled"; + public static final String TEMPLATE_IRIS_DISABLED = "IrisDisabled"; + public static final String TEMPLATE_LEFT_EYE_CAPTURED = "leftEyeCaptured"; + public static final String TEMPLATE_RIGHT_EYE_CAPTURED = "rightEyeCaptured"; + public static final String TEMPLATE_LEFT_SLAP_CAPTURED = "leftSlapCaptured"; + public static final String TEMPLATE_RIGHT_SLAP_CAPTURED = "rightSlapCaptured"; + public static final String TEMPLATE_THUMBS_CAPTURED = "thumbsCaptured"; + public static final String TEMPLATE_CONSENT_HEADING = "Consent"; + public static final String TEMPLATE_CONSENT_DATA = "ConsentData"; + public static final String TEMPLATE_CONSENT_YES = "Yes"; + public static final String TEMPLATE_CONSENT_NO = "No"; + public static final String TEMPLATE_CONSENT_SELECTED_YES = "SelectedYes"; + public static final String TEMPLATE_CONSENT_SELECTED_NO = "SelectedNo"; + public static final String TEMPLATE_CONSENT_CHECKED = "checked='checked'"; + public static final String PARENT_PHOTO_CAPTURED = "parentPhotoCaptured"; + public static final String PARENT_PHOTO_NOT_CAPTURED = "parentPhotoNotCaptured"; + public static final String PARENT_PHOTO_PRIMARY_LANG = "ParentPhotoPrim"; + public static final String PARENT_PHOTO_LOCAL_LANG = "ParentPhotoSec"; + public static final String PARENT_IMAGE_SOURCE = "ParentImageSource"; + public static final String LIST_ITEM_OPENING_TAG = "
  • "; + public static final String LIST_ITEM_CLOSING_TAG = "

  • "; + public static final String SPLIT_DELIMITOR = "\\."; + public static final String TEMPLATE_GUIDELINES = "Guidelines"; + public static final String TEMPLATE_IS_UIN_UPDATE = "IsUINUpdate"; + + public static final String MODIFY_DEMO_INFO = "modifyDemographicInfo"; + public static final String MODIFY_DOCUMENTS = "modifyDocuments"; + public static final String MODIFY_BIOMETRICS = "modifyBiometrics"; + public static final String CLICK = "click"; + public static final String REG_CONSENT = "mosip.registration.consent_"; + public static final String REG_CONSENT_YES = "consent-yes"; + public static final String REG_CONSENT_NO = "consent-no"; + public static final String IRIS_WITH_EXCEPTION = "irisWithException"; + public static final String IRIS_WITHOUT_EXCEPTION = "irisWithoutException"; + public static final String IRIS_WITH_EXCEPTION_STYLE = "parentIris2"; + public static final String IRIS_WITHOUT_EXCEPTION_STYLE = "parentIris1"; + public static final String IRIS_STYLE = "irisStyle"; + public static final String TEMPLATE_IRIS = "iris"; + public static final String TEMPLATE_CHILD_LEFT = "childLeft"; + public static final String TEMPLATE_CHILD_RIGHT = "childRight"; + public static final String TEMPLATE_CHILD_THUMBS = "childThumbs"; + public static final String PARENT_LEFT_SLAP = "parentLeftSlap"; + public static final String PARENT_RIGHT_SLAP = "parentRightSlap"; + public static final String PARENT_LEFT_EYE = "parentLeftEye"; + public static final String PARENT_RIGHT_EYE = "parentRightEye"; + public static final String PARENT_THUMBS = "parentThumbs"; + public static final String PARENT_STYLE = "parentStyle"; + public static final String TEMPLATE_IS_CHILD = "isChild"; + + // Web Camera Constants + public static final String WEB_CAMERA_IMAGE_TYPE = "jpg"; + public static final String APPLICANT_PHOTOGRAPH_NAME = "Applicant Photograph.jpg"; + public static final String EXCEPTION_PHOTOGRAPH_NAME = "Exception Photograph.jpg"; + public static final String APPLICANT_IMAGE = "Applicant Image"; + public static final String EXCEPTION_IMAGE = "Exception Image"; + public static final String GUARDIAN_IMAGE = "Guardian Image"; + public static final String APPLICANT_PHOTO_PANE = "applicantImagePane"; + public static final String EXCEPTION_PHOTO_PANE = "exceptionImagePane"; + public static final String WEB_CAMERA_PAGE_TITLE = "Applicant Biometrics"; + public static final String WEBCAM_NAME = "mosip.registration.webcam_name"; + public static final String WEBCAM_LIBRARY_NAME = "mosip.registration.webcam_library_name"; + public static final String PHOTO_CAPTUREPANES_SELECTED = "photoCapturePanesSelected"; + public static final String DEFAULT_EXCEPTION_IMAGE_PATH = "/images/ExceptionPhoto.png"; + public static final String IMAGE_PATH = "/images/Photo.png"; + + // Acknowledgement Form + public static final String ACKNOWLEDGEMENT_FORM_TITLE = "Registration Acknowledgement"; + public static final String REGISTRATION = "Registration"; + + // logos for new registration + public static final String DEMOGRAPHIC_DETAILS_LOGO = "file:src/main/resources/images/Pre-Registration.png"; + public static final String APPLICANT_BIOMETRICS_LOGO = "file:src/main/resources/images/ApplicantBiometrics.png"; + public static final String OPERATOR_AUTHENTICATION_LOGO = "file:src/main/resources/images/OperatorAuthentication.png"; + + // Exception Code for Components + public static final String PACKET_CREATION_EXP_CODE = "PCC-"; + public static final String PACKET_UPLOAD_EXP_CODE = "PAU-"; + public static final String REG_ACK_EXP_CODE = "ACK-"; + public static final String DEVICE_ONBOARD_EXP_CODE = "DVO-"; + public static final String SYNC_JOB_EXP_CODE = "SYN-"; + public static final String USER_REG_IRIS_CAPTURE_EXP_CODE = "IRC-"; + public static final String USER_REG_FINGERPRINT_CAPTURE_EXP_CODE = "FPC-"; + public static final String USER_REGISTRATION_EXP_CODE = "REG-"; + public static final String USER_REG_SCAN_EXP_CODE = "SCN-"; + + // USER CLIENT MACHINE MAPPING + public static final String MACHINE_MAPPING_LOGGER_TITLE = "REGISTRATION - USER CLIENT MACHINE MAPPING"; + public static final String SYNC_TRANSACTION_DAO_LOGGER_TITLE = "REGISTRATION-SYNC-TRANSACTION DAO"; + public static final String SYNC_JOB_CONTROL_DAO_LOGGER_TITLE = "REGISTRATION-SYNC-JOB_CONTROL DAO"; + + // CENTER MACHINE DEVICE MAPPING + public static final String DEVICE_MAPPING_SUCCESS_CODE = "REG-DVO‌-001"; + public static final String DEVICE_MAPPING_ERROR_CODE = "REG-DVO‌-002"; + + // Upload Packet + + public static final String UPLOAD_STATUS = "status"; + public static final List PACKET_UPLOAD_STATUS = Arrays.asList("SYNCED", "EXPORTED", "RESEND", "E"); + + public static final String PACKET_UPLOAD = "packet_upload"; + public static final String DUPLICATE = "Duplicate"; + public static final String FOUND = "Found"; + public static final String PACKET_DUPLICATE = "duplicate"; + public static final String PACKET_UPLOAD_SNO = "slno"; + public static final String PACKET_UPLOAD_DATE = "createdTime"; + public static final String PACKET_UPLOAD_FILE = "fileName"; + public static final String UPLOAD_FILE_NAME = "PacketUploadList"; + // opt to register constants + public static final String OPT_TO_REG_GEO_CAP_FREQ = "GEO_CAP_FREQ"; + public static final String ICS_CODE_ONE = "REG-ICS‌-001"; + public static final String ICS_CODE_TWO = "REG-ICS‌-002"; + public static final String ICS_CODE_THREE = "REG-ICS‌-003"; + public static final String ICS_CODE_FOUR = "REG-ICS‌-004"; + public static final String OPT_TO_REG_PAK_MAX_CNT_OFFLINE_FREQ = "REG_PAK_MAX_CNT_OFFLINE_FREQ"; + public static final double OPT_TO_REG_EARTH_RADIUS = 6371000; + public static final double OPT_TO_REG_METER_CONVERSN = 1609.00; + public static final String OPT_TO_REG_DIST_FRM_MACHN_TO_CENTER = "DIST_FRM_MACHN_TO_CENTER"; + public static final String ICS_CODE_FIVE = "REG-ICS‌-005"; + public static final String ICS_CODE_SIX = "REG-ICS‌-006"; + public static final String ICS_CODE_SEVEN = "REG-ICS‌-007"; + public static final String PAK_APPRVL_MAX_CNT = "REG-ICS‌-008"; + public static final String PAK_APPRVL_MAX_TIME = "REG-ICS‌-009"; + public static final String REG_REC_SEVEN = "REG-REC‌-007"; + public static final String OPT_TO_REG_LAST_CAPTURED_TIME = "lastCapturedTime"; + public static final String LATITUDE = "latitude"; + public static final String OPT_TO_REG_MDS_J00001 = "MDS_J00001"; + public static final String OPT_TO_REG_LCS_J00002 = "LCS_J00002"; + public static final String OPT_TO_REG_PDS_J00003 = "PDS_J00003"; + public static final String OPT_TO_REG_RSS_J00004 = "RSS_J00004"; + public static final String OPT_TO_REG_RCS_J00005 = "RCS_J00005"; + public static final String OPT_TO_REG_RPS_J00006 = "RPS_J00006"; + public static final String OPT_TO_REG_URS_J00007 = "URS_J00007"; + public static final String OPT_TO_REG_POS_J00008 = "POS_J00008"; + public static final String OPT_TO_REG_LER_J00009 = "LER_J00009"; + public static final String OPT_TO_REG_RDJ_J00010 = "RDJ_J00010"; + public static final String OPT_TO_REG_RDJ_J00011 = "RDJ_J00011"; + public static final String OPT_TO_REG_ADJ_J00012 = "ADJ_J00012"; + public static final String OPT_TO_REG_DEL_001 = "DEL_001"; + public static final String OPT_TO_REG_UDM_J00012 = "UDM_J00012"; + public static final String GEO_CAP_FREQ = "mosip.registration.geo.capture.frequency"; + public static final String DIST_FRM_MACHN_TO_CENTER = "mosip.registration.distance.from.machine.to.center"; + public static final String REG_PAK_MAX_CNT_OFFLINE_FREQ = "mosip.registration.packet.maximum.count.offline.frequency"; + public static final String MOSIP_REGISTRATION = "mosip.registration."; + public static final String FREQUENCY = "frequency"; + public static final String SOFTWARE_UPDATE_SUCCESS_MSG = "SoftWareUpdate Flag Updated to Y!"; + public static final String SOFTWARE_UPDATE_FAILURE_MSG = "SoftWareUpdate Flag Updated to N!"; + public static final String SOFTWARE_UPDATE_MAX_CONFIGURED_FREQ = "mosip.registration.softwareUpdateCheck_configured_frequency"; + public static final String DSC_CODE_ONE = "REG-DSC‌-001"; + + /** Packet Status Sync Constants */ + public static final String SYNC_PROGRESS_BAR_VALUE = "syncProgressVlaue"; + public static final String PACKET_STATUS_SYNC_RESPONSE_ENTITY = "registrations"; + public static final String PACKET_STATUS_SYNC_SERVICE_NAME = "packet_status"; + public static final String PACKET_STATUS_READER_URL_PARAMETER = "request"; + public static final String RESPONSE = "response"; + public static final String PACKET_STATUS_READER_REGISTRATION_ID = "registrationId"; + public static final String PACKET_STATUS_READER_STATUS_CODE = "statusCode"; + public static final String PACKET_STATUS_CODE_PROCESSED = "PROCESSED"; + public static final String PACKET_STATUS_CODE_PROCESSING = "PROCESSING"; + public static final String PACKET_STATUS_CODE_REREGISTER = "REREGISTER"; + public static final String RE_REGISTER_STATUS_COMEMNTS = "Re-Register"; + public static final String PACKET_STATUS_CODE_REJECTED = "REJECTED"; + public static final List PACKET_STATUS_CODES_FOR_REMAPDELETE = Arrays.asList(PACKET_STATUS_CODE_REREGISTER, + PACKET_STATUS_CODE_PROCESSING, PACKET_STATUS_CODE_PROCESSED, PACKET_STATUS_CODE_REJECTED); + public static final String MACHINE_CENTER_REMAP_FLAG = "mosip.registration.machinecenterchanged"; + public static final String MACHINE_CENTER_REMAP_MSG = "Machine Center Remap process started"; + public static final String PACKET_STATUS_READER_ID = "mosip.registration.status"; + public static final String PACKET_SYNC_STATUS_ID = "mosip.registration.sync"; + public static final String PACKET_SYNC_VERSION = "1.0"; + + public static final String BIOMETRIC_IMAGE = "Image"; + public static final String BIOMETRIC_TYPE = "Type"; + // Packet Upload + public static final String PACKET_TYPE = "file"; + public static final String PACKET_STATUS_PRE_SYNC = "PRE_SYNC"; + public static final String PACKET_STATUS_SYNC_TYPE = "NEW"; + public static final String ACKNOWLEDGEMENT_FILE = "_Ack"; + public static final String ACKNOWLEDGEMENT_FILE_EXTENSION = "_Ack.html"; + public static final String PACKET_SYNC_ERROR = "Error"; + public static final String RE_REGISTRATION_STATUS = "REREGISTER"; + public static final String PACKET_SYNC_REF_ID = "packetsync"; + public static final String PACKET_UPLOAD_REF_ID = "packetUpload"; + + // Device On-boarding + public static final String MAC_ADDRESS = "macaddress"; + public static final String DONGLE_SERIAL_NUMBER = "dongleSerialNumber"; + public static final String ONBOARD_DEVICES_REF_ID_TYPE = "UserID"; + + // Template Name + public static final String ACKNOWLEDGEMENT_TEMPLATE = "Ack Template"; + public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_1 = "reg-ack-template-part1"; + public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_2 = "reg-ack-template-part2"; + public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_3 = "reg-ack-template-part3"; + public static final String ACKNOWLEDGEMENT_TEMPLATE_PART_4 = "reg-ack-template-part4"; + public static final String EMAIL_TEMPLATE = "reg-email-notification"; + public static final String UPDATE_UIN_EMAIL_TEMPLATE = "updateUIN-email-notification"; + public static final String LOST_UIN_EMAIL_TEMPLATE = "lostUIN-email-notification"; + public static final String SMS_TEMPLATE = "reg-sms-notification"; + public static final String UPDATE_UIN_SMS_TEMPLATE = "updateUIN-sms-notification"; + public static final String LOST_UIN_SMS_TEMPLATE = "lostUIN-sms-notification"; + + // Notification Service + public static final String EMAIL_SUBJECT = "MOSIP REGISTRATION NOTIFICATION"; + public static final String EMAIL_SERVICE = "email"; + public static final String SMS_SERVICE = "sms"; + public static final String NOTIFICATION_SERVICE = "REGISTRATION - NOTIFICATION SERVICE "; + public static final String MODE_OF_COMMUNICATION = "mosip.notificationtype"; + + // Global configuration parameters + public static final String REGISTARTION_CENTER = "REGISTARTION_CENTER"; + public static final String GLOBAL_CONFIG_TRUE_VALUE = "Y"; + public static final String REG_PAK_MAX_CNT_APPRV_LIMIT = "mosip.registration.reg_pak_max_cnt_apprv_limit"; + public static final String REG_PAK_MAX_TIME_APPRV_LIMIT = "mosip.registration.reg_pak_max_time_apprv_limit"; + public static final String DEFAULT_HOST_IP = "mosip.registration.audit_default_host_ip"; + public static final String DEFAULT_HOST_NAME = "mosip.registration.audit_default_host_name"; + public static final String APP_NAME = "mosip.registration.audit_application_name"; + public static final String APP_ID = "mosip.registration.audit_application_id"; + public static final String SUPERVISOR_AUTH_CONFIG = "mosip.registration.supervisor_authentication_configuration"; + public static final String QUALITY_SCORE = "mosip.registration.quality_score"; + public static final String FINGERPRINT_AUTHENTICATION_THRESHHOLD = "mosip.fingerprint_authentication.quality_score"; + public static final String IRIS_AUTHENTICATION_THRESHHOLD = "mosip.iris_authentication.quality_score"; + public static final String CAPTURE_TIME_OUT = "mosip.registration.capture_time_out"; + public static final String FINGER_PRINT_SCORE = "mosip.registration.finger_print_score"; + public static final String INVALID_LOGIN_COUNT = "mosip.registration.invalid_login_count"; + public static final String INVALID_LOGIN_TIME = "mosip.registration.invalid_login_time"; + public static final String FACE_RECAPTURE_TIME = "mosip.registration.face_recapture_time"; + public static final String MIN_AGE = "mosip.kernel.applicant.type.age.limit"; + public static final String MAX_AGE = "mosip.registration.max_age"; + public static final String DOC_SIZE = "mosip.registration.document_size"; + public static final String DOC_TYPE = "mosip.registration.document_scanner_doctype"; + public static final String ACK_INSIDE_PACKET = "mosip.registration.save_ack_inside_packet"; + public static final String PKT_STORE_LOC = "mosip.registration.registration_packet_store_location"; + public static final String PKT_STORE_DATE_FORMAT = "mosip.registration.packet_store_date_format"; + public static final String MODE_OF_COMM = "mosip.registration.mode_of_communication"; + public static final String PWORD_LENGTH = "mosip.registration.username_pwd_length"; + public static final String DOC_DISABLE_FLAG = "mosip.registration.document_enable_flag"; + public static final String FINGERPRINT_DISABLE_FLAG = "mosip.registration.fingerprint_enable_flag"; + public static final String IRIS_DISABLE_FLAG = "mosip.registration.iris_enable_flag"; + public static final String FACE_DISABLE_FLAG = "mosip.registration.face_enable_flag"; + public static final String GPS_SERIAL_PORT_WINDOWS = "mosip.registration.gps_serial_port_windows"; + public static final String GPS_PORT_TIMEOUT = "mosip.registration.gps_port_timeout"; + public static final String GPS_PORT_LINUX = "mosip.registration.gps_serial_port_linux"; + public static final String DOC_SCAN_DPI = "mosip.registration.document_scanner_dpi"; + public static final String DOC_SCAN_CONTRAST = "mosip.registration.document_scanner_contrast"; + public static final String DOC_SCAN_BRIGHTNESS = "mosip.registration.document_scanner_brightness"; + public static final String DOC_SCANNER_ENABLED = "mosip.registration.document_scanner_enabled"; + public static final String SCANNER_IMG_TYPE = "jpg"; + public static final String IDENTITY_CLASS_NAME = "mosip.registration.identity_class_name"; + public static final String KEY_SPLITTER = "mosip.kernel.data-key-splitter"; + public static final String ASYMMETRIC_ALG_NAME = "RSA"; + public static final String CBEFF_UNQ_TAG = "mosip.registration.cbeff_only_unique_tags"; + public static final String REG_PKT_SIZE = "mosip.registration.max_reg_packet_size"; + public static final String LOGS_PATH = "mosip.registration.logs_path"; + public static final String DB_PATH = "mosip.registration.database_path"; + public static final String CLIENT_PATH = "mosip.registration.client_path"; + public static final String PRE_REG_DAYS_LIMIT = "mosip.registration.pre_reg_no_of_days_limit"; + public static final String GPS_DEVICE_MODEL = "mosip.registration.gps_device_model"; + public static final String GPS_DEVICE_DISABLE_FLAG = "mosip.registration.gps_device_enable_flag"; + public static final String PRE_REG_PACKET_LOCATION = "mosip.registration.registration_pre_reg_packet_location"; + public static final String IS_SOFTWARE_UPDATE_AVAILABLE = "mosip.registration.is_software_update_available"; + public static final String PROVIDER_NAME = "mosip.registration.provider_name"; + public static final String DISK_SPACE = "mosip.registration.disk_space_size"; + + // Spring Batch-Jobs + public static final String JOB_TRIGGER_STARTED = "Trigger started"; + public static final String JOB_TRIGGER_COMPLETED = "Trigger completed"; + public static final String JOB_EXECUTION_STARTED = "Execution started"; + public static final String JOB_EXECUTION_COMPLETED = "Execution completed"; + public static final String JOB_EXECUTION_SUCCESS = "Executed with success"; + public static final String JOB_EXECUTION_FAILURE = "Executed with failure"; + public static final String JOB_TRIGGER_MIS_FIRED = "Trigger Mis-Fired"; + public static final String JOB_EXECUTION_REJECTED = "Execution Rejected"; + public static final String RETRIEVED_PRE_REG_ID = "Retrieved Pre Registration"; + + public static final String offlineJobs = "mosip.registration.jobs.offline"; + public static final String unTaggedJobs = "mosip.registration.jobs.unTagged"; + public static final String restartableJobs = "mosip.registration.jobs.restart"; + + // Registration batch jobs scheduler : If ‘Y’ or ‘y’ means enabled, else + // anything as value means disabled + public static final String IS_REGISTRATION_JOBS_SCHEDULER_ENABLED = "mosip.registration.jobs.scheduler.enable"; + + // public static final String offlineJobs = + // "DEL_J00013,RDJ_J00010,ADJ_J00012,PVS_J00015"; + // public static final String unTaggedJobs ="PDS_J00003"; + // public static final String restartableJobs ="RCS_J00005"; + + public static final String JOB_TRIGGER_POINT_SYSTEM = "System"; + public static final String JOB_TRIGGER_POINT_USER = "User"; + public static final String JOB_SYNC_TO_SERVER = "Server"; + public static final String JOB_DETAIL = "jobDetail"; + public static final String APPLICATION_CONTEXT = "applicationContext"; + public static final String SYNC_TRANSACTION = "syncTransaction"; + + // GPS Device + public static final String GPS_LOGGER = "GPS-Device-Information"; + public static final String LONGITUDE = "longitude"; + public static final String GPS_DISTANCE = "distance"; + public static final String GPS_CAPTURE_ERROR_MSG = "gpsErrorMessage"; + public static final String GPS_CAPTURE_SUCCESS = "gpsCaptureSuccess"; + public static final String GPS_CAPTURE_FAILURE = "gpsCaptureFailure"; + public static final String GPS_CAPTURE_FAILURE_MSG = "GPS signal is weak please capture again"; + public static final String GPS_CAPTURE_SUCCESS_MSG = "GPS signal Captured Sucessfullty"; + public static final String GPS_CAPTURE_PORT_FAILURE_MSG = "Please insert the GPS device in the Specified Port"; + public static final String GPS_DEVICE_CONNECTION_FAILURE = "Please connect the GPS Device"; + public static final String GPS_DEVICE_CONNECTION_FAILURE_ERRO_MSG = "GPS device not found. Please connect an on-boarded GPS device."; + public static final String GPS_REG_LGE‌_002 = "REG-LGE‌-002"; + public static final String GPS_SERIAL_PORT = "COM4"; + public static final String GPS_ERROR_CODE = "errorCode"; + public static final String GPS_CAPTURING_EXCEPTION = "GPS_EXCEPTION"; + public static final String GPS_SIGNAL = "$GP"; + + // Documents + public static final String POA_DOCUMENT = "POA"; + public static final String POI_DOCUMENT = "POI"; + public static final String POR_DOCUMENT = "POR"; + public static final String DOB_DOCUMENT = "POB"; + public static final String POE_DOCUMENT = "POE"; + public static final String SERVER_STATUS_RESEND = "RESEND"; + public static final String CLIENT_STATUS_APPROVED = "APPROVED"; + public static final String SYNCED_STATUS = "SYNCED"; + + public static final List PACKET_STATUS = Arrays.asList("APPROVED", "REJECTED", "RE_REGISTER_APPROVED"); + + public static final List PACKET_STATUS_UPLOAD = Arrays.asList("APPROVED", "REJECTED", "SYNCED", "EXPORTED"); + + public static final List PACKET_EXPORT_STATUS = Arrays.asList("APPROVED", "EXPORTED", "SYNCED"); + + // Pre Registration + public static final String PRE_REGISTRATION_ID = "pre_registration_id"; + public static final String GET_PRE_REGISTRATION_IDS = "get_pre_registration_Ids"; + public static final String GET_PRE_REGISTRATION = "get_pre_registration"; + public static final String REGISTRATION_CLIENT_ID = "10"; + public static final String PRE_REGISTRATION_DUMMY_ID = "mosip.pre-registration.datasync.fetch.ids"; + public static final String VER = "1.0"; + public static final String PRE_REG_TO_GET_ID_ERROR = "PRE_REG_TO_GET_ID_ERROR"; + public static final String PRE_REG_TO_GET_PACKET_ERROR = "PRE_REG_TO_GET_PACKET_ERROR"; + public static final String PRE_REG_PACKET_NETWORK_ERROR = "PRE_REG_PACKET_NETWORK_ERROR"; + public static final String PRE_REG_SUCCESS_MESSAGE = "PRE_REG_SUCCESS_MESSAGE"; + public static final String IS_PRE_REG_SYNC = "PreRegSync"; + public static final String PRE_REG_FILE_NAME = "fileName"; + public static final String PRE_REG_FILE_CONTENT = "fileContent"; + public static final String PRE_REG_APPOINMENT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; + + // UI Date Format + public static final String DATE_FORMAT = "MM/dd/yyy hh:mm:ss"; + public static final String HH_MM_SS = "HH:mm:ss"; + + // Biometric Exception style + public static final String ADD_BORDER = "addBorderStyle"; + public static final String REMOVE_BORDER = "removeBorderStyle"; + public static final String OLD_BIOMETRIC_EXCEPTION = "oldBiometric"; + public static final String NEW_BIOMETRIC_EXCEPTION = "newBiometric"; + + // Iris & Fingerprint Capture for Individual Registration + public static final String IRIS_THRESHOLD = "mosip.registration.iris_threshold"; + public static final String FACE_THRESHOLD = "mosip.facequalitythreshold"; + public static final String IMAGE_FORMAT_KEY = "imageFormat"; + public static final String IMAGE_BYTE_ARRAY_KEY = "imageBytes"; + public static final String IMAGE_BYTE_ISO = "byteIso"; + public static final String IMAGE_SCORE_KEY = "imageScore"; + public static final String LEFT = "Left"; + public static final String RIGHT = "Right"; + public static final String EYE = "Eye"; + public static final String DOT = "."; + public static final String FINGER = "finger"; + public static final String HAND = "Hand"; + public static final String IRIS_LOWERCASE = "Iris"; + public static final String FINGERPRINT = "Fingerprint"; + public static final String FINGERPRINT_UPPERCASE = "FINGERPRINT"; + public static final String LEFTPALM = "leftSlap"; + public static final String RIGHTPALM = "rightSlap"; + public static final String THUMBS = "thumbs"; + public static final String PERCENTAGE = "%"; + public static final String ISO_FILE_NAME = "ISOTemplate"; + public static final String ISO_IMAGE_FILE_NAME = "ISOImage"; + public static final String ISO_FILE = "ISOTemplate.iso"; + public static final String DUPLICATE_FINGER = "DuplicateFinger"; + public static final String DUPLICATE_IRIS = "DuplicateIris"; + public static final String ISO_IMAGE_FILE = "ISOImage.iso"; + public static final String LEFTHAND_SLAP_FINGERPRINT_PATH = "/fingerprints/leftSlap.jpg"; + public static final String FACE_ISO = "/images/face.iso"; + public static final String LEFT_EYE_ISO = "/images/leftEye.iso"; + public static final String RIGHT_EYE_ISO = "/images/rightEye.iso"; + public static final String RIGHTHAND_SLAP_FINGERPRINT_PATH = "/fingerprints/rightSlap.jpg"; + public static final String BOTH_THUMBS_FINGERPRINT_PATH = "/fingerprints/thumbs.jpg"; + public static final String LEFTSLAP_FINGERPRINT_THRESHOLD = "mosip.registration.leftslap_fingerprint_threshold"; + public static final String RIGHTSLAP_FINGERPRINT_THRESHOLD = "mosip.registration.rightslap_fingerprint_threshold"; + public static final String THUMBS_FINGERPRINT_THRESHOLD = "mosip.registration.thumbs_fingerprint_threshold"; + public static final String FINGERPRINT_RETRIES_COUNT = "mosip.registration.num_of_fingerprint_retries"; + public static final String IRIS_RETRY_COUNT = "mosip.registration.num_of_iris_retries"; + public static final String[] LEFTHAND_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/lefthand/leftIndex/", + "/fingerprints/lefthand/leftLittle/", "/fingerprints/lefthand/leftMiddle/", + "/fingerprints/lefthand/leftRing/" }; + public static final String[] RIGHTHAND_SEGMNTD_DUPLICATE_FILE_PATHS = new String[] { + "/fingerprints/righthand/rightIndex/", "/fingerprints/righthand/rightLittle/", + "/fingerprints/righthand/rightMiddle/", "/fingerprints/righthand/rightRing/" }; + public static final String[] RIGHTHAND_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/Srighthand/rightIndex/", + "/fingerprints/Srighthand/rightLittle/", "/fingerprints/Srighthand/rightMiddle/", + "/fingerprints/Srighthand/rightRing/" }; + public static final String[] THUMBS_SEGMNTD_FILE_PATHS = new String[] { "/fingerprints/thumb/leftThumb/", + "/fingerprints/thumb/rightThumb/" }; + public static final String THUMB = "Thumb"; + public static final String LEFT_HAND = "Left Hand "; + public static final String RIGHT_HAND = "Right Hand "; + public static final String RIGHT_IRIS = "Right Iris "; + public static final String LEFT_IRIS = "Left Iris "; + public static final String[] LEFTHAND_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { + "/UserOnboard/leftHand/leftIndex/", "/UserOnboard/leftHand/leftLittle/", + "/UserOnboard/leftHand/leftMiddle/", "/UserOnboard/leftHand/leftRing/" }; + public static final String[] RIGHTHAND_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { + "/UserOnboard/rightHand/rightIndex/", "/UserOnboard/rightHand/rightLittle/", + "/UserOnboard/rightHand/rightMiddle/", "/UserOnboard/rightHand/rightRing/" }; + public static final String[] THUMBS_SEGMNTD_FILE_PATHS_USERONBOARD = new String[] { "/UserOnboard/thumb/leftThumb/", + "/UserOnboard/thumb/rightThumb/" }; + public static final String COMMA = ","; + public static final String HYPHEN = "-"; + public static final String FINGERPRINT_PANES_SELECTED = "fingerPrintPanesSelected"; + public static final String BIOMETRIC_PANES_SELECTED = "biometricPaneSelected"; + public static final Set BIO_TYPE = new HashSet<>( + Arrays.asList(RegistrationConstants.HAND, RegistrationConstants.THUMB)); + public static final String LEFTSLAPCOUNT = "leftSlapCount"; + public static final String RIGHTSLAPCOUNT = "rightSlapCount"; + public static final String THUMBCOUNT = "thumbCount"; + public static final String EXCEPTIONCOUNT = "exceptionCount"; + + /** Exception codes **/ + private static final String REG_SERVICE_CODE = "REG-SER-"; + + public static final String REG_FRAMEWORK_PACKET_HANDLING_EXCEPTION = PACKET_CREATION_EXP_CODE + "PHS-002"; + public static final String PACKET_ZIP_CREATION = REG_SERVICE_CODE + "ZCM-203"; + public static final String ENCRYPTED_PACKET_STORAGE = REG_SERVICE_CODE + "STM-211"; + public static final String LOGIN_SERVICE = REG_SERVICE_CODE + "IPD-214"; + public static final String SERVICE_DELEGATE_UTIL = REG_SERVICE_CODE + "IPD-215"; + public static final String SERVICE_DATA_PROVIDER_UTIL = REG_SERVICE_CODE + "DPU-216"; + public static final String UPDATE_SYNC_AUDIT = REG_SERVICE_CODE + "ADI-220"; + public static final String READ_PROPERTY_FILE_ERROR = REG_SERVICE_CODE + "PFR-222"; + public static final String PACKET_UPDATE_STATUS = REG_SERVICE_CODE + "UPS-217"; + public static final String PACKET_RETRIVE_STATUS = REG_SERVICE_CODE + "RPS-218"; + public static final String MACHINE_MAPPING_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "RDI-219"; + public static final String MACHINE_MAPPING_STATIONID_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "UMM-220"; + public static final String SYNC_STATUS_VALIDATE = REG_SERVICE_CODE + "SSV-223"; + public static final String MACHINE_MASTER_RECORD_NOT_FOUND = REG_SERVICE_CODE + "MMD-224"; + + // #Exceptions SyncJobs + public static final String SYNC_TRANSACTION_RUNTIME_EXCEPTION = REG_SERVICE_CODE + "RPS-BTM-226"; + public static final String SYNC_JOB_RUN_TIME_EXCEPTION = REG_SERVICE_CODE + "RPS-JTD-227"; + public static final String PACKET_SYNC__STATUS_READER_NULL_POINTER_EXCEPTION = REG_SERVICE_CODE + "RPS-PSJ-228"; + public static final String BASE_JOB_NO_SUCH_BEAN_DEFINITION_EXCEPTION = REG_SERVICE_CODE + "RPS-BJ-229"; + public static final String BASE_JOB_NULL_POINTER_EXCEPTION = REG_SERVICE_CODE + "RPS-BJ-229"; + + // Device Onboarding Service + private static final String DEVICE_ONBOARDING_SERVICE = REG_SERVICE_CODE + "DVO-"; + public static final String UPDATE_DEVICE_MAPPING_EXCEPTION = DEVICE_ONBOARDING_SERVICE + "MMS-232"; + + public static final String PACKET_RETRIVE_STATUS_EXCEPTION = REG_SERVICE_CODE + "PRS - 233"; + public static final String PACKET_UPDATE_STATUS_EXCEPTION = REG_SERVICE_CODE + "PUS - 234"; + + // Exceptions + private static final String REG_UI_CODE = "REG-UI"; + + public static final String REG_UI_LOGIN_LOADER_EXCEPTION = REG_UI_CODE + "RAI-001"; + public static final String REG_UI_LOGIN_SCREEN_LOADER_EXCEPTION = REG_UI_CODE + "LC-002"; + public static final String REG_UI_HOMEPAGE_LOADER_EXCEPTION = REG_UI_CODE + "ROC-003"; + public static final String REG_UI_BASE_CNTRLR_IO_EXCEPTION = REG_UI_CODE + "BAS-004"; + public static final String REG_UI_VIEW_ACK_FORM_IO_EXCEPTION = REG_UI_CODE + "VAF-005"; + + // Exceptions for User Registration - Iris & FingerPrint Capture + public static final String USER_REG_IRIS_CAPTURE_PAGE_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-001"; + public static final String USER_REG_IRIS_CAPTURE_NEXT_SECTION_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-002"; + public static final String USER_REG_IRIS_CAPTURE_PREV_SECTION_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-003"; + public static final String USER_REG_IRIS_CAPTURE_POPUP_LOAD_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-004"; + public static final String USER_REG_IRIS_VALIDATION_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-005"; + public static final String USER_REG_IRIS_SCORE_VALIDATION_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-006"; + public static final String USER_REG_IRIS_SCAN_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "IFC-001"; + public static final String USER_REG_FINGERPRINT_SCAN_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FSC-003"; + public static final String USER_REG_FINGERPRINT_PAGE_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FCC-001"; + public static final String USER_REG_FINGERPRINT_CAPTURE_NEXT_SECTION_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + + "FCC-002"; + public static final String USER_REG_FINGERPRINT_CAPTURE_PREV_SECTION_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + + "FCC-003"; + public static final String USER_REG_FINGERPRINT_CAPTURE_POPUP_LOAD_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + + "FCC-004"; + public static final String USER_REG_FINGERPRINT_VALIDATION_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + "FCC-005"; + public static final String USER_REG_FINGERPRINT_SCORE_VALIDATION_EXP = USER_REG_FINGERPRINT_CAPTURE_EXP_CODE + + "FCC-006"; + public static final String USER_REG_IRIS_SAVE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-008"; + public static final String USER_REG_GET_IRIS_QUALITY_SCORE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "ICC-009"; + public static final String USER_REG_IRIS_STUB_IMAGE_EXP = USER_REG_IRIS_CAPTURE_EXP_CODE + "IFC-002"; + + // Exception for Registration - Document Scan and Upload + public static final String USER_REG_DOC_SCAN_UPLOAD_EXP = USER_REGISTRATION_EXP_CODE + "SCN-001"; + + // Scan + public static final String USER_REG_SCAN_EXP = USER_REG_SCAN_EXP_CODE + "DOC-001"; + + // Regex Constants + public static final String FULL_NAME_REGEX = "([A-z]+\\s?\\.?)+"; + public static final int FULL_NAME_LENGTH = 50; + public static final String ADDRESS_LINE1_REGEX = "^.{1,50}$"; + public static final String NUMBER_REGEX = "\\d+"; + public static final String NUMBER_OR_NOTHING_REGEX = "^\\d*$"; + public static final String FOUR_NUMBER_REGEX = "\\d{4}"; + public static final String NUMBER_REGEX_ZERO_TO_THREE = "\\d{0,3}"; + public static final int MOBILE_NUMBER_LENGTH = 9; + public static final String EMAIL_ID_REGEX = "^([\\w\\-\\.]+)@((\\[([0-9]{1,3}\\.){3}[0-9]{1,3}\\])|(([\\w\\-]+\\.)+)([a-zA-Z]{2,4}))$"; + public static final String EMAIL_ID_REGEX_INITIAL = "([a-zA-Z]+\\.?\\-?\\@?(\\d+)?)+"; + public static final String CNI_OR_PIN_NUMBER_REGEX = "\\d{0,30}"; + public static final String AGE_REGEX = "\\d{1,2}"; + public static final String UIN_REGEX = "\\d{1,30}"; + public static final String POSTAL_CODE_REGEX = "\\d{5}"; + public static final String POSTAL_CODE_REGEX_INITIAL = "\\d{1,5}"; + public static final String REGEX_ANY = ".*"; + public static final String ONE = "1"; + public static final String BIOMETRIC_SEPERATOR = "(?<=\\.)(.*)(?=\\.)"; + + // master sync + public static final String MASTER_SYNC_SUCESS_MSG_CODE = "REG-MDS‌-001"; + public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG_CODE = "REG-MDS‌-002"; + public static final String MASTER_SYNC_FAILURE_MSG_CODE = "REG-MDS‌-003"; + public static final String MASTER_SYNC_FAILURE_MSG_INFO = "Error in sync"; + public static final String MASTER_SYNC_FAILURE_MSG = "SYNC_FAILURE"; + public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG_INFO = "Client not online"; + public static final String MASTER_SYNC_OFFLINE_FAILURE_MSG = "PRE_REG_PACKET_NETWORK_ERROR"; + public static final String MASTER_SYNC_EXCEPTION = "MASTER_SYNC_EXCEPTION"; + public static final String MASTER_SYNC_JOD_DETAILS = "MASTER_SYNC_JOB_DETAILS"; + public static final String MASTER_SYNC_SUCCESS = "Sync successful"; + public static final String MASTER_SYNC = "MASTER_SYNC"; + public static final String NO_INTERNET = "NO_INTERNET"; + public static final String MASTER_VALIDATOR_SERVICE_NAME = "master_sync"; + public static final String MASTER_CENTER_REMAP_SERVICE_NAME = "center_remap_sync"; + public static final String MASTER_CENTER_PARAM = "regcenterId"; + public static final String MASTER_DATA_LASTUPDTAE = "lastUpdated"; + public static final String MASTER_SYNC_LOGGER_INFO = "Entering into Master Sync Dao Impl..."; + // POLICY SYNC + public static final String POLICY_SYNC_SUCCESS_CODE = "REG-MDS‌-001 "; + public static final String POLICY_SYNC_SUCCESS_MESSAGE = "SYNC_SUCCESS"; + public static final String POLICY_SYNC_ERROR_CODE = "REG-MDS‌-003 "; + public static final String POLICY_SYNC_ERROR_MESSAGE = "SYNC_FAILURE"; + public static final String POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_CODE = "REG-MDS‌-002"; + public static final String POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_MESSAGE = "POLICY_SYNC_CLIENT_NOT_ONLINE_ERROR_MESSAGE"; + + public static final String SYNCH_CONFIG_DATA_JOB_TITLE = "synch config data job"; + public static final String REG_USER_MAPPING_SYNC_JOB_TITLE = "registration user mapping sync job"; + + // PRE-REG DELETE JOB + public static final String PRE_REG_DELETE_SUCCESS = "PRE_REG_DELETE_SUCCESS"; + public static final String PRE_REG_DELETE_FAILURE = "PRE_REG_DELETE_FAILURE"; + + // Connection Error + public static final String CONNECTION_ERROR = "CONNECTION_ERROR"; + + // Exceptions - Template Generator + public static final String TEMPLATE_GENERATOR_ACK_RECEIPT_EXCEPTION = PACKET_CREATION_EXP_CODE + "TGE-002"; + public static final String TEMPLATE_GENERATOR_SMS_EXCEPTION = PACKET_CREATION_EXP_CODE + "TGE-002"; + + // Jobs + public static final String BATCH_JOB_START_SUCCESS_MESSAGE = "BATCH_JOB_START_SUCCESS_MESSAGE"; + public static final String START_SCHEDULER_ERROR_MESSAGE = "START_SCHEDULER_ERROR_MESSAGE"; + public static final String BATCH_JOB_STOP_SUCCESS_MESSAGE = "BATCH_JOB_STOP_SUCCESS_MESSAGE"; + public static final String STOP_SCHEDULER_ERROR_MESSAGE = "STOP_SCHEDULER_ERROR_MESSAGE"; + public static final String CURRENT_JOB_DETAILS_ERROR_MESSAGE = "CURRENT_JOB_DETAILS_ERROR_MESSAGE"; + public static final String EXECUTE_JOB_ERROR_MESSAGE = "EXECUTE_JOB_ERROR_MESSAGE"; + public static final String SYNC_DATA_PROCESS_ALREADY_STARTED = "SYNC_DATA_PROCESS_ALREADY_STARTED"; + public static final String SYNC_DATA_PROCESS_ALREADY_STOPPED = "SYNC_DATA_PROCESS_ALREADY_STOPPED"; + public static final String SYNC_DATA_DTO = "SYNC-DATA DTO"; + public static final String JOB_RUNNING = "RUNNING"; + public static final String JOB_COMPLETED = "COMPLETED"; + public static final String NO_JOB_COMPLETED = "NO_JOB_COMPLETED"; + public static final String NO_JOBS_TRANSACTION = "NO_JOBS_TRANSACTION"; + public static final String NO_JOBS_RUNNING = "NO_JOBS_RUNNING"; + public static final String JOB_UNKNOWN = "UNKNOWN"; + + // PACKET + public static final String PACKET_STATUS_SYNC_ERROR_RESPONSE = "PACKET_STATUS_SYNC_ERROR_RESPONSE"; + public static final String PACKET_STATUS_SYNC_SUCCESS_MESSAGE = "PACKET_STATUS_SYNC_SUCCESS_MESSAGE"; + public static final String PACKET_CREATION_DISK_SPACE_CHECK = "PACKET_CREATION_DISK_SPACE_CHECK"; + + // OTP + public static final String OTP_GENERATION_SUCCESS_MESSAGE = "OTP_GENERATION_SUCCESS_MESSAGE"; + public static final String OTP_GENERATION_ERROR_MESSAGE = "OTP_GENERATION_ERROR_MESSAGE"; + public static final String OTP_VALIDATION_ERROR_MESSAGE = "OTP_VALIDATION_ERROR_MESSAGE"; + + // Packet Export + public static final String FILE_EXPLORER_NAME = "File Explorer"; + + // Sync Status + public static final String REG_PKT_APPRVL_CNT_EXCEED = "REG_PKT_APPRVL_CNT_EXCEED"; + public static final String REG_PKT_APPRVL_TIME_EXCEED = "REG_PKT_APPRVL_TIME_EXCEED"; + public static final String OPT_TO_REG_TIME_EXPORT_EXCEED = "OPT_TO_REG_TIME_EXPORT_EXCEED"; + public static final String OPT_TO_REG_TIME_SYNC_EXCEED = "OPT_TO_REG_TIME_SYNC_EXCEED"; + public static final String OPT_TO_REG_REACH_MAX_LIMIT = "OPT_TO_REG_REACH_MAX_LIMIT"; + public static final String OPT_TO_REG_OUTSIDE_LOCATION = "OPT_TO_REG_OUTSIDE_LOCATION"; + public static final String OPT_TO_REG_WEAK_GPS = "OPT_TO_REG_WEAK_GPS"; + public static final String OPT_TO_REG_INSERT_GPS = "OPT_TO_REG_INSERT_GPS"; + public static final String OPT_TO_REG_GPS_PORT_MISMATCH = "OPT_TO_REG_GPS_PORT_MISMATCH"; + public static final String OPT_TO_REG_LAST_SOFTWAREUPDATE_CHECK = "OPT_TO_REG_LAST_SOFTWAREUPDATE_CHECK"; + + public static final String POLICY_SYNC_SERVICE = "policysync"; + public static final String KEY_NAME = "mosip.registration.key_policy_sync_threshold_value"; + public static final String OPT_TO_REG_LAST_EXPORT_REG_PKTS_TIME = "mosip.registration.last_export_registration_config_time"; + + // Reg Deletion + public static final String REGISTRATION_DELETION_BATCH_JOBS_SUCCESS = "REGISTRATION_DELETION_BATCH_JOBS_SUCCESS"; + public static final String REGISTRATION_DELETION_BATCH_JOBS_FAILURE = "REGISTRATION_DELETION_BATCH_JOBS_FAILURE"; + + // Application Language + public static final String APPLICATION_LANUAGE = "eng"; + + // Global-Config Constants + public static final String GET_GLOBAL_CONFIG = "get_registration_center_config"; + public static final String REGISTRATION_CENTER_ID = "registrationcenterid"; + public static final String GLOBAL_CONFIG_ERROR_MSG = "please synch the data before starting the application"; + + // user on boarding + public static final String USER_ON_BOARDING_ERROR_RESPONSE = "USER_ONBOARD_ERROR"; + public static final String USER_ON_BOARDING_EXCEPTION = "USER_ON_BOARDING_EXCEPTION"; + public static final String USER_ON_BOARDING_EXCEPTION_MSG_CODE = "REG-URE‌-000"; + public static final String USER_ON_BOARDING_SUCCESS_CODE = "REG-URE‌-002"; + public static final String USER_ON_BOARDING_SUCCESS_MSG = "USER_ONBOARD_SUCCESS"; + public static final String USER_ON_BOARDING_THRESHOLD_NOT_MET_MSG = "USER_ON_BOARDING_THRESHOLD_NOT_MET_MSG"; + public static final String USER_STATION_ID = "stationId"; + public static final String USER_CENTER_ID = "centerId"; + public static final String USER_ONBOARD_DATA = "UserOnboardBiometricData"; + public static final String USER_ON_BOARD_THRESHOLD_LIMIT = "mosip.registration.user_on_board_threshold_limit"; + + // Configuration Constants + public static final String AUDIT_LOG_DELETION_CONFIGURED_DAYS = "mosip.registration.audit_log_deletion_configured_days"; + public static final String SYNC_TRANSACTION_NO_OF_DAYS_LIMIT = "mosip.registration.sync_transaction_no_of_days_limit"; + public static final String REG_DELETION_CONFIGURED_DAYS = "mosip.registration.reg_deletion_configured_days"; + public static final String PRE_REG_DELETION_CONFIGURED_DAYS = "mosip.registration.pre_reg_deletion_configured_days"; + + // Audit Constants + public static final String AUDIT_LOGS_DELETION_SUCESS_MSG = "AUDIT_LOGS_DELETION_SUCESS_MSG"; + public static final String AUDIT_LOGS_DELETION_FLR_MSG = "Audit Logs Deleted Failed"; + public static final String AUDIT_LOGS_DELETION_EMPTY_MSG = "AUDIT_LOGS_DELETION_EMPTY_MSG"; + + // Rest Authentication Constants + public static final String USER_DTO = "userDTO"; + public static final String REST_OAUTH = "oauth"; + public static final String REST_OAUTH_USER_NAME = "userName"; + public static final String REST_OAUTH_USER_PSWD = "password"; + public static final String REST_OAUTH_ERROR_CODE = "REST-OAUTH-001"; + public static final String REST_OAUTH_ERROR_MSG = "Internal Server Error"; + public static final String REST_AUTHORIZATION = "authorization"; + public static final String REST_RESPONSE_BODY = "responseBody"; + public static final String REST_RESPONSE_HEADERS = "responseHeader"; + public static final String AUTH_SET_COOKIE = "Set-Cookie"; + public static final String AUTH_AUTHORIZATION = "Authorization"; + public static final String AUTH_EXPIRES = "Expires"; + public static final String AUTH_MAX_AGE = "Max-Age"; + public static final String REGISTRATION_CLIENT = "mosip.registration.app.id"; + public static final String REGISTRATION_CONTEXT = "auth-otp"; + public static final String COOKIE = "Cookie"; + public static final String ENGLISH_LANG_CODE = "eng"; + public static final String USER_ID_CODE = "USERID"; + public static final String OTP_CHANNELS = "mosip.registration.otp_channels"; + public static final String AUTH_TOKEN_NOT_RECEIVED_ERROR = "No Auth Token Received"; + + // Packet Sync + public static final String PACKET_SYNC = "packet_sync"; + + // Validations to ignore + + public static List fieldsToExclude() { + List fieldToExclude = new ArrayList<>(); + fieldToExclude.add("preRegistrationId"); + fieldToExclude.add("virtualKeyboard"); + fieldToExclude.add("docPageNumber"); + fieldToExclude.add("residence"); + fieldToExclude.add("NFR"); + fieldToExclude.add("FR"); + fieldToExclude.add("residenceLocalLanguage"); + fieldToExclude.add("genderValue"); + fieldToExclude.add("genderValueLocalLanguage"); + fieldToExclude.add("updateUinId"); + + return fieldToExclude; + + } + + // ID JSON Business Validation + private static final String ID_JSON_BIZ_VALIDATION_PREFIX = "mosip.id.validation.identity"; + public static final String LENGTH = "length"; + public static final String EMAIL_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("email"); + public static final String EMAIL_VALIDATION_LENGTH = EMAIL_VALIDATION_REGEX.concat(DOT).concat(LENGTH); + public static final String PHONE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("phone"); + public static final String PHONE_VALIDATION_LENGTH = PHONE_VALIDATION_REGEX.concat(DOT).concat(LENGTH); + public static final String REFERENCE_ID_NO_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("referenceIdentityNumber"); + public static final String POSTAL_CODE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("postalCode"); + public static final String POSTAL_CODE_VALIDATION_LENGTH = POSTAL_CODE_VALIDATION_REGEX.concat(DOT).concat(LENGTH); + public static final String DOB_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("dateOfBirth"); + public static final String ID_FULL_NAME_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("fullName.[*].value"); + public static final String ADDRESS_LINE_1_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("addressLine1.[*].value"); + public static final String ADDRESS_LINE_2_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("addressLine2.[*].value"); + public static final String ADDRESS_LINE_3_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT) + .concat("addressLine3.[*].value"); + public static final String AGE_VALIDATION_REGEX = ID_JSON_BIZ_VALIDATION_PREFIX.concat(DOT).concat("age"); + public static final String TRUE = String.valueOf(true); + public static final String FALSE = String.valueOf(false); + public static String CNI_MANDATORY = String.valueOf(false); + + public static final String REGEX = "regex"; + public static final String IS_MANDATORY = "isMandatory"; + public static final String IS_FIXED = "isFixed"; + + // Virus Scan + public static final String VIRUS_SCAN_PACKET_NOT_FOUND = "FILE_NOT_PRESENT_FOR_SCAN"; + public static final String VIRUS_SCAN_INFECTED_FILES = "Infected Files"; + public static final String ANTIVIRUS_SERVICE_NOT_ACCESSIBLE = "ANTIVIRUS_SERVICE_NOT_ACCESSIBLE"; + + // concent of applicant + public static final String YES = "Yes"; + public static final String NO = "No"; + + // User Details + public static final String USER_DETAILS_SERVICE_NAME = "user_details"; + public static final String MAPPER_UTILL = "MAPPER_UTILL"; + public static final String REG_ID = "regid"; + + public static final String CONTENT_TYPE_EMAIL = "EMAIL"; + public static final String CONTENT_TYPE_MOBILE = "MOBILE"; + + // Key-Policy Key validation + public static final String VALID_KEY = "VALID KEY"; + public static final String INVALID_KEY = "INVALID_KEY"; + + public static final String JOB_ID = "JOB_ID"; + + public static final String SYNC_DATA_FREQ = "mosip.registration.sync_data_freq"; + + public static final String LABEL = "Label"; + public static final String LABEL_SMALL_CASE = "label"; + + public static final Object UI_SYNC_DATA = "mosip.registration.ui_sync_data"; + public static final String MDM_ENABLED = "mosip.mdm.enabled"; + + public static final String MESSAGE = "Message"; + public static final String HASH = "#"; + public static final String QOUTE = "\""; + public static final String DOB_MESSAGE = "dobMessage"; + public static final String DD = "dd"; + public static final String MM = "mm"; + public static final String YYYY = "yyyy"; + public static final String DOB = "dob"; + public static final String ERRORS = "errors"; + public static final String ERROR_MSG = "message"; + public static final String OK_MSG = "ok"; + public static final String NEW_LINE = "\n"; + + public static final String ATTR_INDIVIDUAL_TYPE = "individualTypeCode"; + public static final String ATTR_DATE_OF_BIRTH = "dateofbirth"; + public static final String ATTR_GENDER_TYPE = "genderCode"; + public static final String ATTR_NON_FORINGER = "NFR"; + public static final String ATTR_FORINGER = "FR"; + public static final String ATTR_FORINGER_DOB_PARSING = "yyyy/MM/dd"; + public static final String ATTR_FORINGER_DOB_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + + public static final String SYNC_FAILURE = "SYNC_FAILURE"; + + // Scheduler + public static final String IDEAL_TIME = "mosip.registration.ideal_time"; + public static final String REFRESHED_LOGIN_TIME = "mosip.registration.refreshed_login_time"; + public static final String SCHEDULER_TITLE_STYLE = "schedulerTitleMsg"; + public static final String SCHEDULER_CONTENT_STYLE = "schedulerMsg"; + public static final String SCHEDULER_TITLE_BORDER = "schedulerTitle"; + public static final String SCHEDULER_TIMER_STYLE = "schedulerTimer"; + public static final String SCHEDULER_BTN_STYLE = "schedulerContinueBtn"; + public static final String SCHEDULER_BORDER = "schedulerStage"; + + public static final String USER_DETAILS = "userDetails"; + + public static final String OTP_EXPIRY_TIME = "mosip.kernel.otp.expiry-time"; + + // TODO Need to discuss with Sravya about code + public static String INITIAL_SETUP = "mosip.registration.initial_setup"; + + public static final String SIGNED_KEY = "signed-key"; + public static final String TIME_STAMP = "timeStamp"; + public static final String REF_ID = "referenceId"; + public static final String PUBLIC_KEY_ISSUES_DATE = "issuedAt"; + public static final String PUBLIC_KEY_EXPIRE_DATE = "expiryAt"; + public static final String PUBLIC_KEY = "publicKey"; + public static final String PUBLIC_KEY_REST = "public_key"; + public static final String KER = "SIGN"; + public static final String DTAE_MONTH_YEAR_REGEX = "dd|mm|yyyy|ddLocalLanguage|mmLocalLanguage|yyyyLocalLanguage|ageField|dob"; + + public static final String UIN_UPDATE_PARENTGUARDIAN_DETAILS = "parentOrGuardianDetails"; + + public static final String PAGE_NAVIGATION_CONFIRM = "PAGE_NAVIGATION_CONFIRM"; + public static final String PAGE_NAVIGATION_CANCEL = "PAGE_NAVIGATION_CANCEL"; + public static final String UPDATE_NOW_LABEL = "UPDATE_NOW_LABEL"; + public static final String UPDATE_LATER_LABEL = "UPDATE_LATER_LABEL"; + public static String CANCEL_MSG = "CANCEL_LABEL"; + public static final String PUBLIC_KEY_REF_ID = "packet-encryption-key"; + public static final String USER_DETAIL_SALT_SERVICE_NAME = "user_salt_details"; + public static final String SERVICES_VERSION_KEY = "mosip.reg.services.current.version"; + + // TPM + public static final byte[] NULL_VECTOR = new byte[0]; + public static final String MOSIP_REGISTRATION_DB_KEY = "mosip.reg.db.key"; + + // SQL Execution + public static final String SQL_EXECUTION_SUCCESS = "SQL EXECUTION SUCCESS"; + public static final String ROLL_BACK_SQL_EXECUTION_SUCCESS = "ROLL BACK SQL EXECUTION SUCCESS"; + public static final String ROLL_BACK_SQL_EXECUTION_FAILURE = "ROLL BACK SQL EXECUTION FAILURE"; + public static final String SQL_EXECUTION_FAILURE = "SQL EXECUTION FAILURE"; + public static final String BACKUP_PREVIOUS_SUCCESS = "Backup Success"; + public static final String BACKUP_PREVIOUS_FAILURE = "Backup Failed"; + + public static final String PUBLICKEY = "publicKey"; + public static final String ISSUED_AT = "issuedAt"; + public static final String EXPIRY_AT = "expiryAt"; + public static final String SERVICE_NAME = "policysync"; + + public static final String IDA_REFERENCE_ID = "INTERNAL"; + public static final String PUBLIC_KEY_IDA_REST = "ida_key"; + public static final String ON_BOARD_IDA_VALIDATION = "ida_auth"; + public static final String ID = "id"; + public static final String IDENTITY = "mosip.identity.auth.internal"; + public static final String VERSION = "version"; + public static final String REQUEST_TIME = "requestTime"; + public static final String TRANSACTION_ID = "transactionID"; + public static final String TRANSACTION_ID_VALUE = "1234567890"; + public static final String BIO = "bio"; + public static final String REQUEST_AUTH = "requestedAuth"; + public static final String CONSENT_OBTAINED = "consentObtained"; + public static final String INDIVIDUAL_ID = "individualId"; + public static final String INDIVIDUAL_ID_TYPE = "individualIdType"; + public static final String KEY_INDEX = "keyIndex"; + public static final String ON_BOARD_TIME_STAMP = "timestamp"; + public static final String DEVICE_PROVIDER_ID = "deviceProviderID"; + public static final String ON_BOARD_BIO_TYPE = "bioType"; + public static final String ON_BOARD_BIO_SUB_TYPE = "bioSubType"; + public static final String ON_BOARD_BIO_VALUE = "bioValue"; + public static final String ON_BOARD_BIO_DATA = "data"; + public static final String ON_BOARD_BIOMETRICS = "biometrics"; + public static final String ON_BOARD_REQUEST = "request"; + public static final String ON_BOARD_REQUEST_HMAC = "requestHMAC"; + public static final String ON_BOARD_REQUEST_SESSION_KEY = "requestSessionKey"; + public static final String ON_BOARD_PUBLIC_KEY_ERROR = "Public key is either null or invalid public key"; + public static final String ON_BOARD_AUTH_STATUS = "authStatus"; + public static final String ON_BOARD_FACE_ID = "FID"; + public static final String ON_BOARD_IRIS_ID = "IIR"; + public static final String ON_BOARD_FINGER_ID = "FIR"; + public static final String ON_BOARD_COGENT = "cogent"; + public static final String AGE_IDENTITY = "identity"; + public static final String DATE_OF_BIRTH = "dateOfBirth"; + + public static final String STUB_FACE = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUTExMWFRUXFxUaGBgYFRgXFxcYGhgXGhoaGBcYHSggGBolGxcYITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OGhAQGy0dHyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLf/AABEIAP4AxgMBEQACEQEDEQH/xAAbAAABBQEBAAAAAAAAAAAAAAAAAgMEBQYHAf/EADoQAAEDAgMFBgUCBQUBAQAAAAEAAhEDBAUhMQYSQVFhEyJxgZGxBzKhwfDh8RRSYnLRFRYjQpKiQ//EABsBAQACAwEBAAAAAAAAAAAAAAABAgMEBgUH/8QANREAAgECBQEFBwMEAwEAAAAAAAECAxEEBRIhMUETUXGB0RQiMmGRscEGI6EV4fDxJDRTQv/aAAwDAQACEQMRAD8AlrtDiQQAgBACAEAIAQAgBACA8Qi56gBACAEFwQkEAIAQAgBACAEAIAQAgBACAEAIAQAgBANXFw1g3nuDRzJhVlOMVeTsEnJ2SuZnFds2MkUm7x5nIeQ1P0XlV81hHamrnr0MonLeo9Py6lA3bW4BJ3mungWCB4QZhaP9Ur3vt9Df/pNC1t/qH+/Liflp/wDk+8qf6tX7l9H6lf6PQ73/AB6Hh28ueAZqOGvTXRT/AFat3Ij+j0e9/wAeg5/viu7Tcb03fuTmjzWu+LImOT0Fzd/54FlZ7diYrU46tP1grYpZv/6R+hrVcmtvTl5P1NXYYhTrN3qbg4ceY8QvWpV6dVXg7nkVqFSk7TViUspiBCQQAgBACAEAIAQAgBACAEAIAQDdas1g3nODRzJgKspKKu3YJOTstzM4ttg1pLaDd8j/ALH5Z6c15eIzWEHpprU+/oethspqTWqo9K7upkcXxerVINV08ho0eAGq8aviald3m/Loe5h8LSoK0F59Src86/ngsBsDRJ3cz5QP3Qg8Y2ckJA0RBg5j08kuLCWgjTMj880IJBrAxIHXNCSVb1C07zHlhHIkeqtGUou8XZlZwjNWkro2uBbWSAy4hp03x8p/u5eK9zC5mn7tbb5+p4GLyqUfeo7ru9DVseCAQQQdCDII8V66aaujxmmnZilJAISCAEAIAQAgBACAEAIAQDdxWaxpc4w1oJJ6BVlJRTk9kgouTUYq7ZzPHMeqXDomKc5N5DPvE88z6rl8VjZ133R6I6zCYCGHV+ZdWUtOtE9fT9Vpm8eNqxlnnx/whAi4ByE6fmqkCajjlOU65ZID2o2IGagkG0gNTwy4qCR0NAEAcPDRSCK5nBCBLXkZHRSV3JdG44DP38EJNJs3tG6hDHS+lPm3nu9OnovQwePlQ92W8fsebjsujXWuO0vv4+p0OhWa9oc0hwOhHFdHGSkrx3RzMouL0tWY4rEAgBACAEAIAQAgBACA8Qgw22OPtf8A8NMmGnvng48hzz8l4OZYxS/ah5+h0GV4Jx/en5epjqlYARxOpXjntkV4koRYVp5cs0FiRReNXa9RP7JckWWAyeOfUITYYNMDvHTohAuoHDTvD26KbizCCdG6z6ZRCi4sxLWFoG9xHE/nJLix4aQIy1UEiOxI8foVJFh2nVIjjOnLwKkg2GxeO7juxeYY4y0k/K4wI8D7r1csxag+yk9nx4nj5rg9a7WC3XPh3m9XQHOghIIAQAgBACAEAIAQFJtNjQoM3RBqOBgchpJWljcWqENuXx6m7gMG8RPfaK59Dl17V5GefPzK5bk63hbERvCfFSQOU6ZkQFVsskWlrhFR2Q85OeXKVVyRkVNsn/6O7Ij9/FR2iL9kxl+Hv0jMdPup1Ijs2T8OwBzjDmETlJ+yq5olU31L0bFFjd5mcwWk5j3VHUMipIX/ALPe8SW7rhyiNc1XtUW7G5ncT2fqMJaW5agq8aiMcqLRAGCP/wCsyraynZEG4wuo0HL8+ylTRR02Rm5Dd5+o0V0ylrD9AQdVJFjpuy+MCvTgn/kYBvDmODvPj1XUYHFKtTs/iXPqclj8I6FW6+F8ehdreNEEJBACAEAIAQAgPHOjVCDk+0WKdtVe/rDfAZSPdcnjK/bVXLp0OwwOH7CkovnllNcD18Fqo22jQbP7LmqQXaZLXqVrG1SoX5OiYXsXRaBIBOvRazqtm7GlFdDQ2mzlED5R/nxVdTZbSuhN/wBEpcWjpkgFswClwY0eSsirY/RwkNe3daIHksiZilwWFzZtieYGXBRMiDuR+xA4fRYzNa5Fq2bHGS0HlKi5axDfg9OSd0JdiyKDGcAaWkAa/mvorRm0VnBM5htBgrmOJAyE+vFbUJ3NKpSaKHfjLM/krMazLTAcTNGsypOQ+bq0/MPY+S2MNXdGqp9OvgauLoKvScOvTxOs0qgcA4aESF1yd1dHG2tsLUkggBACAEAIAQGf20xQUbdzQ6HvG63wJ7x9J+i0MwrqlRaT3ey/P8G9luHdWum+Fu/x/Jy4STOXQLmDrEXuzWCdtWEmQIJ8eSw1p6YmxQhqkdUw6z3OA0Xnt3PSSLu1chYsqJGQVkQyYwK6MbFgqSo41wCstirVxRMhGQlZjCqZBpwBVWWGnKCxCuQqskyeP4eHg5ayrQlZlJRujlGO4d2VYjSc/wBlv05XR5taGmRXtpxlOXBZDAdK2Dvt+33DrTMeR01810uWVddGz5Ry2Z0ezrtrh7mlXonnAhIIAQAgBACEHOPiRczVY3g1uhHE8RwIgBc/m071Ix7josmhanKXezJsyjn/AJ/JXks9lG42FMOgcT5+a1K5vYY6YwLTN0etxmhYsaHJWRUsaJyWRGOR6PdSQOgqStjzfngpuLDdRVLIacqlkR60qrLog1yVVkkC4pyM0IZzr4i2IJY4ZHOVt4dmlilwzBl4njGo6FbZos0nw+ru/iQA7IsMjnGk9dV6WVSar2+R5WbxToXtvdHTV0hzIISCAEAIAQAhBzL4kNi5HVgP1IyXO5qv3k/kdJk7/Ya+ZlGP+kLy2esmb7YTmtKuejhzpVq7Japtkym3NSSWFAKyKsmU3ZK6KMcBEeCsiopyEIC5SBDlUlDZCguRqoVGXRDrNVWSRK6FTAbfHuArZw/JqYng5lUjULdNBl/sE6LxnUP9lv5a/wDkLzPNzRf8Z+KOrLpzlgQkEAIAQAgBAc0+JdQG4YOIpifMlc/mz/divkdFk6/ak/n+DHheUesjpmyFuW029dV59V3Z6tFWRvrPMLBYz3LOnThW0kaiUwkK1he482qrIixJpOHFWRRkgNnP8CtYx3EgfslibjFWoFRl0RH1pVS6Q3UcqssmNPpFRYjUV9zkoFzB7Z0i6m6Fmo8mCsrxOXk8ecrfPNZcbFPIvKUGJJB8IOS3cvbWIjb/ADY87MkvZpXOvLqTlUCEggBACAEAIQct+IkG7PRjVzmaP9/yR02Up9h5spsLsDUqMbzj0Xk1JWR7FKGqSOsW1uKbWgcF573PUSsiPim1bKPdY8Fw+YjQdJ5rNTpN8mGpWS4Kx3xKdIaGT1Gqy9iYfaCVa/ER5+Zg4EDe3ZHmnYErEmiw7bClUOZDD4yD5jLVY5UpRM8K0ZGgt8Ua75SPVYzLa5a0b3u6/wCVZPYq4bjDr391GonSVd3ijRqYAzJlRuyeCFU2moNMOeBlxVuzZjdRLqRjttagwag8YlW7JmN1oiKu3tuRAdnwPAqezZHao8s8dZcAgETqIOo9/JY502jJComQr+2FRrgeSonZl5K6OPYhQLHvYdQV6MXdXPKmrNovvh7bb90D/I0u+3nqvTyuGqtfuR5GbTcaFu9/3OpLpDmgQkEAIAQAgBAc0+JFAC5YRHep/UE6+gXP5srVU+9HRZO70pLuYbDWk1S/kIPQleDiHtY6LDR3uavaO7LKZDfmOQ81r01ubVVu2xlqGANI3qhJJ4TlK2NdjXVG5Mp7HOcPmDB/Ue96NzVXXsXWFuRsQ2BrNG82oHDrvN+rgrRr96KSwi6MoKuFV6LtCD4q/axa3MfYTi9jUbN4nULgxxI+x6LFKxs0pNOzOuYJUL2CVgRsPYRjHdaTpARkJnItosWquO60k94n65T0nOFsRSXJq1JNuyM26jXcZzz1k+6yqpFGB0pstMO2eun/AP5yOe6foQquuiyw0iUdmHAhr3bpzgEEKO2Lezs8ZhFajJY4ndMjXLwPL/KalIrocTZbP3hrUw466OHJwWrNWZtU5XRhtvLDs7jeAyeJ81tUJXiaeIjaVx/4cUyLl8adkZ/9Nhe5lF+1l4fk5/ObKlFfP8HSF0JzqBCQQAgBACAEIOffEq3irSqc2ls8JBn2K8LOIvVGXkdBks1pnHwZM+Hlr3XO5lc1iHudThVtcu8at96oMsgscXZGeSuyHW7gyIbGpOoHTqpW5LdkRam17aTXdkwvAIlw014uOpV40G+THLEqPBKb8QyaTT2bCXHd3BUd2gH87gW7sHh3uByWTsbIxe1XfA7VqNe8U6jDQe7QOA3HzyIylY5wceTYhOM+BNXA+zqAxBBWNSMjgnudF2bpd0KsHuTU4H8eo91ymXJWHBz2zwDtXkwMk1Nk6Ut2RmmlTqFrGOrPbqGN3g2PoFkjFyKSnGG7FUviAxtN5NJw3DEGo1rnEyO42M4jPlIWTsGYPalfgbdtlRrAB7XNBy77cp8VjdGSMqxEWjy2ob0gHebnunjHI+Chuw2kibgFn2VVzeDs/NVm7orFWZU/Em3EMPUj6LNh+qMOJWyZX/DWlFSueTWD1Jn2XR5PH3pvwOWzuXuwXj+DfL3TwQQkEAIAQAgPHOAEkwBqToAqVaipwc3wlf6F6VJ1akaa5bS+pkfiC9j6FMscCN6eY0I181x9TMK2JbU7W6LuO4jlVDBxUqd9XDd3v5cIn7AUf+HPi77BedXfvHoUFaBq61iDJWFMzo5ztJhVR7u8SROQaI9VnpzS4MdWnfks8Hwyh2DqNQgBzY5GeYnjKyqrZ7mKWHdrxEYNsPSp1RUq3LXU294NAgujgTKntIkKhI1WLtZc5SC0CB3SdeRyHosM6jfBtU6agLtLZxpsa8l26Ik6kDSVrX3Mpp8GbDQrxKzJGK6FTIpDgzFeiQx7Gu3d8RI1A4x5KidmX5G8OdTtoaQ0MIiSzdkf3CRx4rZhUaMNSkp+Jjtodh2VKxqULimGPJdDplpOsRkVm7SLNZ0J9xLxHCaDbUUGkPIEk8S7iYGih1V0EcO+ZFZsvYVqZyMsJzB1H6LDOSZnp02vA6DTsRk6M4WEuzHfE1sUmO5P+y2MPyzWxPwjHw6oDsXkTJfmecDIR65r2cHmVPDe5KL3e7/seJjMpq4tdpCS2Wy7/M1S6dNNXRydmtmCkAgBACAEAmpT3gW/zAj1WDE6exnq4s/sbGE1e0U9POpfcwOPYa+lSqNz3QWmDoM1wlF7n0bFxsjUbCEdg1UrfEVo/AbWkZWIy3GLnCQ7OEsWuVb9nzORS7Lpj1vgbREiSPop3JuTDbgDw/MlDkRY8p5KCS4w0QFZFZbj1+yWwpZWJSOiM1Rl0OfwwLd0iQVaMujIa6oqa2BCcgody6kKt8FzGWnRFcrJotKWFAZgQpsYrj9RwAQhnP8A4kumjH9Qn0Kz0PiNeuvdM9s8+sKYpU3FsnNw1InLNK1m7GbCq0Ls31MQAJnIZrvqMNFOMe5JHzWtU7SpKfe2/qKWQxggBACAEB6x0EHkVhxFN1KM4LqmjPhaqpV4VHwmmM7X2m/SqbrQd5oP5zK4CPuysz6XV9+OxQbG1N2iB1KmryYaXwmysrlYrGU0NtVBCkmwVIRlkiNUYqu7LJEW5ZDTKraxZkO3kkHgVJVmitGaLIlcxydiTcUoUuNisZXM7iTCHSFjaMiZMsmy0KEi1x/sYU7ogkW7RyVkykkKuSAMlJSxn76qqgwm3z5ptaNXOH0Cz0TDX3SRcYNhTGUQ+M91o5ZwP1WxgaTrYuC7nfyW5jzGsqGAn0ureb2Ji7o+co9QkEAIAQAgBCCdbUd+k6fDyXE5pRVPFTS67/U+h5NWdTBU2+m302Mz2QplzRwcR0WhI3EWVi9UZkRoLR55qC6ZYMHmpJuO0xKlENlVtDVAYfIKr5JXBFF2zdEEZJYgtsNxRpGRGStFlZRuT7vFA4cFeUrmKFPQU77tjnahY2ZB3CqolwByBUIt0LKoRwVmQhNMoGQ69zI5dCouQ0UWI1MiURUz99h4uH02ng4HXhqrxdkyulSkrl1XEHd/l/wF1WR4dRodrbeV/on6nIfqHEyniOx6Rt9Wr/YQvbPABACAEAIAQAgHrKod/syYY4HPk4REeP2XL59RSqQqLqrPy/2df+mq7dOdJ9HdefP2KPE6BZVe3rI8CvCOgfxDuG1d4eCqy8TRWlWcpzyVCyLFtRWLEhlRSRYrMZtu1Y5vGMvFUT3LdDl2MOuWzT77SDqMwfNZ425MNRtCcOv7yhG93uM8f1VpRT4McKsls9y0djteoO6073iQFVRRklUtwVlM3DKu/VquPJrZA9FaVrbIpTcr3bOibMF3Z7zpl2cLXb3NnoaDtVNytj0VdQlyGQLx3soZDKLEqsNUoqRcKZvPLuDASVbpYiLs7kwvkk88132Eo9jRjT7l/v8Ak+b4yu8RXnVfV/6/iwLYNcEAIAQAgBACA9pxMHKdPFeFn0W6MZLhPc6H9Nziq84vlrby5KrG6ZbVEmZHsf1XKrg7CfI3YOgoyYlzb1e8IVC6Lem9QB6nU91JNxZcFNiNRQ4n3nQBxzWSKMU3cgXVrDJDQVkTMLGLO2l2hndn9vVCOpLo0AH7zoI8FV7l4uzNLRLQANFj0mfWKDtVRospXR4SgIlcmM0KsoMWdJAVkUZLwCmCKjjpp6a+6tezI03TBq+ip3V2fL7JOyPVJIIAQAgBACAEAlzZEKlSnGpFwmrpl6VWdKanB2a3K3FbZ5G8XSG8xnHj+i5rGZMqNOVSnK6XR+p1mDz516kKVSFm3ynt9P7jNm6V4DOiiWFN8HVVZcsWV4VSR2ncTx/RZEjHKR5Wr6ifBXRVsabA7ziGjMmfsobJjByZIp43buG4Q4N/mge3JRqM/s45cYlb0zJJqEgfKBA8ypuU7DyIguKVYgsMHi05H9UTMc6dhVO4jUxw0UmO44akRnr6KskZIskUqkrEZBi4KFbmfv6kPlXXBVkixY8NgmAc4HXmV02DyVJxqVXfh29Tlsdn70ypUY25Wr0X2JIXRHLpWPUJBACAEAIAQAgBAJqMBBB0OSrKKlFxfDJjNwkpR5Rn7Fxa5zDqCR6L5/XoulUcH0dj6ThqyrU41I9VcshU0nqsNjYuTmiWyM+Si25a5AqXvZTM5j8+6zJGBspam1Q3oax7yMoa3KfLJW0CL3Edne3Dgd1oB+VhdEcuChJI2lGVh6pguINbPZsLRnk7P6hTZFt+LihhV+RvGkxgj/s/3EJZEbvqQLjD7xkOlhP9JITZlJQkhRxy5BG/ScGj5nDMeKaUa0r34NRZ4h2gEHKNBmVRolMs7eoWtEmcvZYmjJcYqVyczySwRR1jv1Q3gTn4alb2BodtWjDp18DQzLEdhh5T62svF8F2u7PngISCAEAIAQAgBACAEAIQzP46Nyqx/B2R8Rx9PZcxnlC041F12+n+fwdb+nsRqpypPpuvB/3+44yrLV4B0vQk2F3ujMZeKNbhcCxaNqGHcfzNHKw0ir/Bwwf8UDoFCkXSsVv8TVp/9d4jkc/qrrcuq2lbo9/3gIh7XjyP2V7MLEQPHbWOeIY17vI/dLDt4dCVYsqVc3ZfUrHJ2I7VvoXTcKp7hDswVRSZSSvyVD7cU+63LgDy/RX1X3KJWJNa4yAnOPVQSxqpW7s6qGQR8FZvF9Q/2j7/AG9F0+R4eylVfgvz/nyOS/UGJ1SjRXTd/ZFuugOcBACAEAIAQAgBACAEAICl2qpzSB5O+xXi55H9mL+f4Z7v6fl+/KPfH7NepVYXeZQSuUaOzjwWLenH88lBJZ27S2IVWWRZE72maoZLEK6w4uOnoikTZMTQwlpHeH/zKupkOmiS3B2g91v0j3UOTGlEujabvBVuGhNeoW6BStyjdiluzn1WRGNkWpVGnJSPkQL+7IG6NSpiismXeCsii0ePuV2WU/8AVj5/dnCZz/3J+X2ROXpHmAgBACAEAIAQAgBACAEIK7HWzSPiPePuvKzmN8K33Nfc9fIpWxiXemYqpLTIXII7pFlZ3/GfFGiTR4fdN1mQqNDUjSWbW7o4ysbRkTJtEAx1RItcly1useHFZUijkwqvZwQjU0RqlcAZgT9PVUsTcqr6q2BmIOkokUbM5XvWgSXA66cuqyaSikU9a85H88FNixHoMLjJRshxNRhlZu7uzmJkfVdXk+JpOhGlf3t9vM47O8FXVaVfT7jtv4Lr3E5eyeACEggBACAEAIAQAgBAQsRvOzaSufxubtScKH19PU7PKv0zGUFWxl/lH19PqZN+KuqVACciYXh1qk6m822dL2FGlT00oqK+SE3VJayMFitcwg5Kbg9bi7qXn+ZrIlcwzdi6s9pnHdziPw/ngodNEKqzRWu0G83eB0drxicvzqsbhZmWNS6JFbHQ4QTwOfXgPb0U6RqHRjbdJ0HvlHuo0saipxDHo1dEwWj1kK8YXMcqljN3+0RDddDlPAjr6/RZFTMTqbFTa3D6jp4HPMevgcgkmkiaabLahTnKFhbNtbItKNLgqNhIh076LhzQdCPYLNFbJm1QkvhZsbd282V0OV5k5NUar36P8M5T9QZCqaeJwy2/+o93zX5XmOLoDjQQkEAIAQAgBACEHkZSvBzjHOP7EHu+fQ7H9L5Qqsva6q2Xwrvff5dPmZLaq8yIHgueijtsRLoZ23bulpPMe6l8Gs4+6aGrTlayNZorrigrFStuaAcIIV07GOUboqbim5mkkLNFp8mtOLittzy2xd7DIOXEHiruBiVWzJox54zByEdPP3VdBZ1BdbHSMgYzz6ZmUUCXUSINXEaj8s+itZLko5OXBKs8MLoNQk9FilUtwZoUr/EaChQDQAOCwXNuMUkWNvRVblrE+jTVWy6RirmrF6/+77BbcfgRSm7VTomD1cgFjZ7VlKNmWFVsHouxyzF+0Uve+JbP1PlefZb7DiXpXuS3X5Xl9rCV6J4oISCAEAIAQHh5DitbF4lYek5vy8Tdy7BSxmIjRXXl9y6hdDdauHnNzk5S3bPr1ClCjTVOCskrIwO0bh2gHP7K6NatvMjdhvgRmOYGXqVDkkY5zijQW4kArWZriLigpTKtFVc26uUK2rR4KUyrRDfZNPBXU2jE6aY27DxwVlUZV0keswpvNHVZCoRLC3tGt0Co5NmVQS4J9NkQqGRFla25Oqq2ZErlrSt8lRsvpHyyAVUskYbELIiqKw0L8/MwtyMvdsa+6qJ/M2uBvyCoz3KbvEv3tkLcy7Fez103w9n/AJ8jx8+y/wBswsope8t4+NuPNbEddsfKT1CQQAgBAeIQ2LpNzlcvneI11FSXC58T6B+k8D2dGWIkt5bLwXqxjEjlC8RHYmV/0oVrgl2bWtGXCZP6JOdkeXXu6haXliGsOXBYVLcxtbEPDNEYSJ1WilxYra9FWKNFdWtVZMo0RX2pU3K2Em2KECmW6AlMt0JsSra3VWy8YlxaUOixtmVIn0qaqWI2JvDWlFyT0Kdlpv0DzAJ+6zXtIxadizwVuiyM9ektjRsCqWkNvpjnC9vDZzUpxUZrUl9TkMd+lqVeUqlGWiTd7cq/3G3UyOo6Zr28PmNCttF2fc9jk8ZkuMwm84XXet16oSt48o8QHrGk6D/C0cTmNChs3d9yPWwOSYvF7xjpj3y2Xl3jgaB1P0XP4rNa1baPur5ep22X/pvC4Va6i7SXe+PJetxymNV5TOgpqyIWJNRGRiMAtgTUPUeyxVTQrq07kjG6HcPgsSMJnMObmrsJFwKUhVBBr20KyZDRXVqWaumUaGqbM1NytiSy0Hj7JcaRX8BAkqLjSINDPL0UXLKO5LtqCq2ZEi2t7byVSR5zQAoBR406RHNXjyS+B62pRSPh7q3MhBXaQ/hVKFlZ6cVZF0FAPKzZClFL2kMg8slJZxuKyOonwy9VvUMyxFFWjK6+e54mMyHBYmWqUdL71tcG0QNcyrYnM69ba+ldyMWAyDCYXe2uXfL8LgH1MuS8+578YIbB4qBU4sSKDYCEIYvqctKIu+BGzzwKjhzE+n7rHURqYqOyZPxun3FhNSJkqLId5qzLFzb8FUMcqUJ/PopIK64swVNxYr61tBV0yjQu3uw35myliUh6pW3zlkPzgFBNh2haTr+eCrcksbagAqssTAzJCCNcOgISiiuBvPCvEMsxSkQBoM1kgupsYaG+pj1lTzV2bhZtaoKNii3JSUluQqggwhli7q54hax6HShCVhWqEjYCGKXJNptyQHrqchCblbaUQyoXcR7HVQ1dFakdcdJdX4lvksDPMRlKlJDISrRyqTYs6QyS5RjVahqclIIVa3DgpIZXVbcSJAU3CJtC1aBoobJSJdOmqkkqlTQkXWUBFReVZ+qsi3BEtWSZV0U5Zb2o0A5kfQrKj0YxUI2Rj9o9sH0ajqNBgDm5Oe/PP+lo9z6LMqe12aWIxkoy7OCM7U2vviZ/iHDwa0D2V9K7jSnXrc6vsSLXbi9ac6gf0cwe4hQ4ovDE1PE3eA4z/FUu03NxwO64AyJ5hYpKx6mHnqVyxAVTYP/Z"; + + // TPM Public Key Sync + public static final String ERROR_CODE = "errorCode"; + public static final String MESSAGE_CODE = "message"; + public static final String TPM_PUBLIC_KEY_SYNC_SERVICE_NAME = "tpm_public_key"; + public static final String SERIAL_NUMBER = "serialnumber"; + + public static final String RESPONSE_SIGNATURE = "response-signature"; + public static final String ON_BOARD_FACE = "FACE"; + public static final String USER_ON_BOARD_IDA_AUTH = "mosip.registration.onboarduser_ida_auth"; + public static final String AUTH_SERVICE_URL = "authmanager/authenticate"; + public static final String REG_HEALTH_CHECK_URL_PROPERTY = "mosip.reg.healthcheck.url"; + + public static final int DAYS = 31; + public static final int MONTH = 12; + public static final int YEAR = 3; + public static final String EYETOOLTIP = "View Details"; + public static final String DOCUMENT_VIEW_ICON = "DocumentViewIcon"; + + public static final String LANG_CODE_MANDATORY = "language code is mandatory..."; + public static final String CODE_AND_LANG_CODE_MANDATORY = "code and language code is mandatory..."; + public static final String TRIGGER_POINT_MSG = "trigger point is mandatory..."; + + public static final String LeftIndex = "Left Index"; + public static final String LeftMiddle = "Left Middle"; + public static final String LeftRing = "Left Ring"; + public static final String LeftLittle = "Left Little"; + public static final String RightIndex = "Right Index"; + public static final String RightMiddle = "Right Middle"; + public static final String RightRing = "Right Ring"; + public static final String RightLittle = "Right Little"; + public static final String LeftThumb = "Left Thumb"; + public static final String RightThumb = "Right Thumb"; + + // bio-devices bio-types + public static final List LEFT_SLAP = Arrays.asList(LeftIndex, LeftMiddle, LeftRing, LeftLittle); + + public static final List RIGHT_SLAP = Arrays.asList(RightIndex, RightMiddle, RightRing, RightLittle); + + public static final List TWO_THUMBS = Arrays.asList(LeftThumb, RightThumb); + + public static final String LEFT_EYE = "Left Iris"; + public static final String RIGHT_EYE = "Right Iris"; + + public static final List TWO_IRIS = Arrays.asList(LEFT_EYE, RIGHT_EYE); + + public static final String SESSION_KEY_URL = "session_key"; + public static final String AUTH_HASH = "hash"; + public static final String SESSION_KEY = "sessionKey"; + public static final String SIGNATURE = "signature"; + public static final String ADD = "aad"; + public static final String SALT = "salt"; + public static final String REQ_TIME = "requesttime"; + public static final String AP_ID = "applicationId"; + public static final String AP_IDA = "IDA"; + public static final int MAX_BIO_QUALITY_SCORE = 100; + + public static String DEDUPLICATION_ENABLE_FLAG = "mosip.registration.mds.deduplication.enable.flag"; + + public static String DEDUPLICATION_FINGERPRINT_ENABLE_FLAG = "mosip.registration.mds.fingerprint.dedup.enable.flag"; + public static String DEDUPLICATION_IRIS_ENABLE_FLAG = "mosip.registration.mds.iris.dedup.enable.flag"; + public static String DEDUPLICATION_FACE_ENABLE_FLAG = "mosip.registration.mds.face.dedup.enable.flag"; + public static String RE_MAP_SUCCESS = "rempaSucess"; + + public static final String SERVER_PROFILE = "profile"; + public static final String SERVER_PROD_PROFILE = "PROD"; + public static final String SERVER_NO_PROFILE = "NO_PROFILE"; + public static final String SERVER_ACTIVE_PROFILE = "mosip.registration.server_profile"; + + public static final String applicantBiometricDTO = "applicantBiometricDTO"; + public static final String introducerBiometricDTO = "introducerBiometricDTO"; + public static final String supervisorBiometricDTO = "supervisorBiometricDTO"; + public static final String operatorBiometricDTO = "operatorBiometricDTO"; + + public static final String leftIndexUiAttribute = "leftIndex"; + public static final String leftLittleUiAttribute = "leftLittle"; + public static final String leftMiddleUiAttribute = "leftMiddle"; + public static final String leftRingUiAttribute = "leftRing"; + public static final String leftThumbUiAttribute = "leftThumb"; + + public static final String rightIndexUiAttribute = "rightIndex"; + public static final String rightLittleUiAttribute = "rightLittle"; + public static final String rightMiddleUiAttribute = "rightMiddle"; + public static final String rightThumbUiAttribute = "rightThumb"; + public static final String rightRingUiAttribute = "rightRing"; + + public static final String leftEyeUiAttribute = "leftEye"; + public static final String rightEyeUiAttribute = "rightEye"; + + public static final List rightHandUiAttributes = Arrays.asList(rightIndexUiAttribute, + rightLittleUiAttribute, rightMiddleUiAttribute, rightRingUiAttribute); + + public static final List leftHandUiAttributes = Arrays.asList(leftIndexUiAttribute, leftLittleUiAttribute, + leftMiddleUiAttribute, leftRingUiAttribute); + + public static final List twoThumbsUiAttributes = Arrays.asList(rightThumbUiAttribute, leftThumbUiAttribute); + + public static final List eyesUiAttributes = Arrays.asList(leftEyeUiAttribute, rightEyeUiAttribute); + + public static final List faceUiAttributes = Arrays.asList("face"); + public static final String indBiometrics = "individualBiometrics"; + + public static final String ID_SCHEMA_SYNC_SERVICE = "idschema_key"; + + public static final String BIOMETRICS_TYPE = "biometricsType"; + public static final String APPLICANT = "applicant"; + + public static final String MOSIP_CLEINT_ID = "mosip.registration.client.id"; + public static final String MOSIP_SECRET_KEY = "mosip.registration.secret.Key"; + + /** BELOW WERE EXTERNALISING Spring.properties to external configs */ + + // Timeout Configuartion + public static final String HTTP_API_READ_TIMEOUT = "mosip.registration.HTTP_API_READ_TIMEOUT"; + public static final String HTTP_API_WRITE_TIMEOUT = "mosip.registration.HTTP_API_WRITE_TIMEOUT"; + + // Biometric Device Already present in configs + // public static final String PROVIDER_NAME = + // "mosip.registration.PROVIDER_NAME"; + // public static final String WEBCAM_LIBRARY_NAME = + // "mosip.registration.WEBCAM_LIBRARY_NAME"; + + // document scanner properties + public static final String DOCUMENT_SCANNER_DEPTH = "mosip.registration.DOCUMENT_SCANNER_DEPTH"; + public static final String DOCUMENT_SCANNER_HOST = "mosip.registration.DOCUMENT_SCANNER_HOST"; + public static final String DOCUMENT_SCANNER_PORT = "mosip.registration.DOCUMENT_SCANNER_PORT"; + public static final String DOCUMENT_SCANNER_TIMEOUT = "mosip.registration.DOCUMENT_SCANNER_TIMEOUT"; + + // #MDM + // #host has to be clarified whether nedd to be in config or hardcoded + // #portRangeFrom and portRangeTo are mandate,portRangeTo can be same are + // greater than then portRangeFrom + public static final String MDM_HOST = "mosip.registration.mdm.host"; + public static final String MDM_START_PORT_RANGE = "mosip.registration.mdm.portRangeFrom"; + public static final String MDM_END_PORT_RANGE = "mosip.registration.mdm.portRangeTo"; + public static final String MDM_CONTEXT_PATH = "mosip.registration.mdm.contextPath"; + public static final String MDM_HOST_PROTOCOL = "mosip.registration.mdm.hostProtocol"; + + // #Proof Of Exception Documents + public static final String POE_DOCUMENT_VALUE = "mosip.registration.doc_value"; + + public static final String LOST_REGISTRATION_BIO_MVEL_OPERATOR = "mosip.registration.lostuin.biometrics.mvel.operator"; + public static final String UPDATE_REGISTRATION_BIO_MVEL_OPERATOR = "mosip.registration.updateuin.biometrics.mvel.operator"; + public static final String LOST_REGISTRATION_BIO_MVEL_EXPR = "mosip.registration.lostuin.biometrics.mvel.expr"; + public static final String UPDATE_REGISTRATION_BIO_MVEL_EXPR = "mosip.registration.updateuin.biometrics.mvel.expr"; + + public static final String BIOMETRICS_GROUP = "Biometrics"; + + public static final String SPEC_VERSION_095 = "0.9.5"; + public static final String SPEC_VERSION_092 = "0.9.2"; + + public static final String TEMPLATE_FACE_IMAGE_SOURCE = "FaceImageSource"; + + public static final String REGISTRATION_EVENTS = "REG-EVT"; + + public static final String EXCEPTION_PHOTO = "Exception_Photo"; + + public static final String REG_SYNC_SERVICE_ID = "mosip.registration.processor.registration.sync.id"; + public static final String REG_SYNC_APPLICATION_VERSION = "mosip.registration.processor.application.version"; + public static final String DATETIME_PATTERN = "resident.datetime.pattern"; + public static final String SYNCSTATUSCOMMENT = "UIN Reactivation and Deactivation By External Resources"; + public static final String EXTENSION_OF_FILE = ".zip"; + + // Event enums + public static final String RESIDENT_APPLICATION_NAME="Resident Service"; + public static final String RESIDENT_APPLICATION_ID="RES_SER"; + public static final String SUCCESS = "Success"; + public static final String FAILURE = "Failure"; + public static final String INFO = "INFO"; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationExternalStatusCode.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationExternalStatusCode.java index 5f6be756a7d..d5067fcc6a3 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationExternalStatusCode.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/RegistrationExternalStatusCode.java @@ -1,32 +1,32 @@ -package io.mosip.resident.constant; - -/** - * The Enum RegistrationExternalStatusCode. - */ -public enum RegistrationExternalStatusCode { - - /** The processing. */ - PROCESSING, - /** The reregister. */ - REREGISTER, - /** The processed. */ - PROCESSED, - /** The resend. */ - RESEND, - /** The received. */ - RECEIVED, - /** The rejected. */ - REJECTED, - /** The reprocess failed. */ - REPROCESS_FAILED, - - /** The upload pending. */ - UPLOAD_PENDING, - - /** The uin generated. */ - UIN_GENERATED, - - /** The awaiting information. */ - AWAITING_INFORMATION - -} +package io.mosip.resident.constant; + +/** + * The Enum RegistrationExternalStatusCode. + */ +public enum RegistrationExternalStatusCode { + + /** The processing. */ + PROCESSING, + /** The reregister. */ + REREGISTER, + /** The processed. */ + PROCESSED, + /** The resend. */ + RESEND, + /** The received. */ + RECEIVED, + /** The rejected. */ + REJECTED, + /** The reprocess failed. */ + REPROCESS_FAILED, + + /** The upload pending. */ + UPLOAD_PENDING, + + /** The uin generated. */ + UIN_GENERATED, + + /** The awaiting information. */ + AWAITING_INFORMATION + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestIdType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestIdType.java index b9e871227a5..9caaddf6781 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestIdType.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestIdType.java @@ -7,5 +7,7 @@ public enum RequestIdType { RE_PRINT_ID, RES_UPDATE, CHECK_STATUS, + SHARE_CREDENTIAL, + AUTH_LOCK_UNLOCK, VERSION; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestType.java new file mode 100644 index 00000000000..897acf7f7ce --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/RequestType.java @@ -0,0 +1,304 @@ +package io.mosip.resident.constant; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.springframework.core.env.Environment; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.dto.NotificationTemplateVariableDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.function.FiveArgsFunction; +import io.mosip.resident.function.FourArgsFunction; +import io.mosip.resident.function.ThreeArgsFunction; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; + +/** + * The Enum RequestType. + * + * @author Kamesh Shekhar Prasad + */ + +public enum RequestType implements PreUpdateInBatchJob { + AUTHENTICATION_REQUEST("Authentication Request", TemplateUtil::getAckTemplateVariablesForAuthenticationRequest, + null, TemplateUtil::getDescriptionTemplateVariablesForAuthenticationRequest), + SHARE_CRED_WITH_PARTNER("Share Credential With Partner", TemplateUtil::getAckTemplateVariablesForShareCredentialWithPartner, + TemplateUtil::getNotificationTemplateVariablesForShareCredentialWithPartner, + TemplateUtil::getDescriptionTemplateVariablesForShareCredentialWithPartner, + ResidentConstants.ACK_SHARE_CREDENTIAL_NAMING_CONVENTION_PROPERTY), + DOWNLOAD_PERSONALIZED_CARD("Download Personalized Card", + TemplateUtil::getAckTemplateVariablesForDownloadPersonalizedCard, + TemplateUtil::getNotificationTemplateVariablesForDownloadPersonalizedCard, + TemplateUtil::getDescriptionTemplateVariablesForDownloadPersonalizedCard, + ResidentConstants.ACK_PERSONALIZED_CARD_NAMING_CONVENTION_PROPERTY), + ORDER_PHYSICAL_CARD("Order a Physical Card", TemplateUtil::getAckTemplateVariablesForOrderPhysicalCard, + TemplateUtil::getNotificationTemplateVariablesForOrderPhysicalCard, + TemplateUtil::getDescriptionTemplateVariablesForOrderPhysicalCard, + ResidentConstants.ACK_ORDER_PHYSICAL_CARD_NAMING_CONVENTION_PROPERTY) { + @Override + public void preUpdateInBatchJob(Environment env, Utility utility, ResidentTransactionEntity txn, Map credentialStatus, + String newStatusCode) + throws ResidentServiceCheckedException, ApisResourceAccessException { + if (this.isSuccessStatus(env, newStatusCode)) { + String trackingId = utility.getCardOrderTrackingId(txn.getRequestTrnId(), txn.getIndividualId()); + txn.setTrackingId(trackingId); + } + } + }, + GET_MY_ID("Get UIN Card", TemplateUtil::getAckTemplateVariablesForGetMyId, + TemplateUtil::getNotificationTemplateVariablesForGetMyId, + TemplateUtil::getDescriptionTemplateVariablesForGetMyId), + UPDATE_MY_UIN("Update UIN Data", TemplateUtil::getAckTemplateVariablesForUpdateMyUin, + TemplateUtil::getNotificationTemplateVariablesForUpdateMyUin, + TemplateUtil::getDescriptionTemplateVariablesForUpdateMyUin, + ResidentConstants.ACK_UPDATE_MY_DATA_NAMING_CONVENTION_PROPERTY) { + @Override + public void preUpdateInBatchJob(Environment env, Utility utility, ResidentTransactionEntity txn, + Map credentialStatus, String newStatusCode) + throws ResidentServiceCheckedException, ApisResourceAccessException { + if (this.isSuccessStatus(env, newStatusCode)) { + txn.setStatusCode(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name()); + } + } + }, + GENERATE_VID("Generate VID", TemplateUtil::getAckTemplateVariablesForGenerateVid, + TemplateUtil::getNotificationTemplateVariablesForGenerateOrRevokeVid, + TemplateUtil::getDescriptionTemplateVariablesForManageMyVid, + ResidentConstants.ACK_MANAGE_MY_VID_NAMING_CONVENTION_PROPERTY), + REVOKE_VID("Revoke VID", TemplateUtil::getAckTemplateVariablesForRevokeVid, + TemplateUtil::getNotificationTemplateVariablesForGenerateOrRevokeVid, + TemplateUtil::getDescriptionTemplateVariablesForManageMyVid, + ResidentConstants.ACK_MANAGE_MY_VID_NAMING_CONVENTION_PROPERTY), + AUTH_TYPE_LOCK_UNLOCK("Secure My ID", + TemplateUtil::getAckTemplateVariablesForAuthTypeLockUnlock, + TemplateUtil::getNotificationTemplateVariablesForAuthTypeLockUnlock, + TemplateUtil::getDescriptionTemplateVariablesForSecureMyId, + ResidentConstants.ACK_SECURE_MY_ID_NAMING_CONVENTION_PROPERTY), + VID_CARD_DOWNLOAD("Download VID Card", TemplateUtil::getAckTemplateVariablesForVidCardDownload, + TemplateUtil::getNotificationTemplateVariablesForVidCardDownload, + TemplateUtil::getDescriptionTemplateVariablesForVidCardDownload) { + @Override + public void preUpdateInBatchJob(Environment env, Utility utility, ResidentTransactionEntity txn, + Map credentialStatus, String newStatusCode) + throws ResidentServiceCheckedException, ApisResourceAccessException { + if (this.isSuccessStatus(env, newStatusCode)) { + txn.setStatusCode(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name()); + } + } + }, + SEND_OTP("Send OTP", TemplateUtil::getAckTemplateVariablesForSendOtp, + TemplateUtil::getNotificationSendOtpVariables, null), + VALIDATE_OTP("Verify My Phone/Email", TemplateUtil::getAckTemplateVariablesForValidateOtp, + TemplateUtil::getNotificationCommonTemplateVariables, + TemplateUtil::getDescriptionTemplateVariablesForValidateOtp), + DEFAULT("Default", TemplateUtil::getAckTemplateVariablesForDefault, + TemplateUtil::getNotificationCommonTemplateVariables, null); + + private static final String PREFIX_RESIDENT_TEMPLATE_EMAIL_SUBJECT = "resident.template.email.subject.%s.%s"; + + private static final String PREFIX_RESIDENT_TEMPLATE_EMAIL_CONTENT = "resident.template.email.content.%s.%s"; + + private static final String PREFIX_RESIDENT_TEMPLATE_SMS = "resident.template.sms.%s.%s"; + + private static final String PREFIX_RESIDENT_TEMPLATE_PURPOSE = "resident.template.purpose.%s.%s"; + + private static final String PREFIX_RESIDENT_TEMPLATE_SUMMARY = "resident.template.summary.%s.%s"; + + private static final Logger logger = LoggerConfiguration.logConfig(RequestType.class); + + private static final String PREFIX_RESIDENT_REQUEST_NOTIFICATION_STATUS_LIST = "resident.request.notification.status.list."; + private static final String PREFIX_RESIDENT_REQUEST_FAILED_STATUS_LIST = "resident.request.failed.status.list."; + private static final String PREFIX_RESIDENT_REQUEST_CANCELLED_STATUS_LIST = "resident.request.cancelled.status.list."; + private static final String PREFIX_RESIDENT_REQUEST_SUCCESS_STATUS_LIST = "resident.request.success.status.list."; + private static final String PREFIX_RESIDENT_REQUEST_IN_PROGRESS_STATUS_LIST = "resident.request.in-progress.status.list."; + private static final String PREFIX_RESIDENT_REQUEST_NEW_STATUS_LIST = "resident.request.new.status.list."; + private static final String SEPARATOR = ","; + private FiveArgsFunction, String>> ackTemplateVariablesFunction; + private ThreeArgsFunction, Map> notificationTemplateVariablesFunction; + private FourArgsFunction getDescriptionTemplateVariables; + private String namingProperty; + private String name; + + private RequestType(String name, + FiveArgsFunction, String>> ackTemplateVariablesFunction, + ThreeArgsFunction, Map> notificationTemplateVariablesFunction, + FourArgsFunction getDescriptionTemplateVariables) { + this(name, ackTemplateVariablesFunction, + notificationTemplateVariablesFunction, getDescriptionTemplateVariables, null); + } + + private RequestType(String name, + FiveArgsFunction, String>> ackTemplateVariablesFunction, + ThreeArgsFunction, Map> notificationTemplateVariablesFunction, + FourArgsFunction getDescriptionTemplateVariables, + String namingProperty) { + this.name = name; + this.ackTemplateVariablesFunction = ackTemplateVariablesFunction; + this.notificationTemplateVariablesFunction = notificationTemplateVariablesFunction; + this.getDescriptionTemplateVariables = getDescriptionTemplateVariables; + this.namingProperty = namingProperty; + } + + public static RequestType getRequestTypeFromString(String requestTypeString) { + for (RequestType requestType : values()) { + if (requestType.name().equalsIgnoreCase(requestTypeString)) { + return requestType; + } + } + return RequestType.DEFAULT; + } + + public Stream getNewStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_NEW_STATUS_LIST); + } + + public Stream getSuccessStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_SUCCESS_STATUS_LIST); + } + + public Stream getFailedStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_FAILED_STATUS_LIST); + } + + public Stream getCancelledStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_CANCELLED_STATUS_LIST); + } + + public Stream getInProgressStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_IN_PROGRESS_STATUS_LIST); + } + + public Stream getNotificationStatusList(Environment env) { + return getStatusListFromProperty(env, PREFIX_RESIDENT_REQUEST_NOTIFICATION_STATUS_LIST); + } + + public boolean isNewStatus(Environment env, String statusCode) { + return isStatusPresent(statusCode, getNewStatusList(env)); + } + + public boolean isSuccessStatus(Environment env, String statusCode) { + return isStatusPresent(statusCode, getSuccessStatusList(env)); + } + + public boolean isFailedStatus(Environment env, String statusCode) { + return isStatusPresent(statusCode, getFailedStatusList(env)); + } + + public boolean isSuccessOrFailedStatus(Environment env, String statusCode) { + return isSuccessStatus(env, statusCode) || isFailedStatus(env, statusCode); + } + + public boolean isInProgressStatus(Environment env, String statusCode) { + return isStatusPresent(statusCode, getInProgressStatusList(env)); + } + + public boolean isNotificationStatus(Environment env, String statusCode) { + return isStatusPresent(statusCode, getNotificationStatusList(env)); + } + + private boolean isStatusPresent(String statusCode, Stream stream) { + return statusCode != null && stream.anyMatch(statusCode::equals); + } + + private Stream getStatusListFromProperty(Environment env, String propertyPrefix) { + String propertyName = propertyPrefix + this.name(); + String statusListStr = env.getProperty(propertyName); + if (statusListStr == null) { + logger.debug("missing property: " + propertyName); + return Stream.empty(); + } else { + return Arrays.stream(statusListStr.split(SEPARATOR)); + } + } + + public Stream getNewOrInprogressStatusList(Environment env) { + return Stream.concat(getNewStatusList(env), getInProgressStatusList(env)); + } + + public static List getAllNewOrInprogressStatusList(Environment env) { + return Stream.of(values()).flatMap(requestType -> { + return Stream.concat(requestType.getNewStatusList(env), requestType.getInProgressStatusList(env)); + }).filter(str -> !str.isEmpty()) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + public static List getAllCancelledStatusList(Environment env) { + return Stream.of(values()).flatMap(requestType -> { + return requestType.getCancelledStatusList(env); + }).filter(str -> !str.isEmpty()) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + public static List getAllFailedStatusList(Environment env) { + return Stream.of(values()).flatMap(requestType -> { + return requestType.getFailedStatusList(env); + }).filter(str -> !str.isEmpty()) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + public static List getAllSuccessStatusList(Environment env) { + return Stream.of(values()).flatMap(requestType -> { + return requestType.getSuccessStatusList(env); + }).filter(str -> !str.isEmpty()) + .distinct() + .collect(Collectors.toUnmodifiableList()); + } + + public String getName() { return name; } + + public String getEmailSubjectTemplateCodeProperty(TemplateType templateType) { + return String.format(PREFIX_RESIDENT_TEMPLATE_EMAIL_SUBJECT, templateType.getType(), name()); + } + + public String getEmailContentTemplateCodeProperty(TemplateType templateType) { + return String.format(PREFIX_RESIDENT_TEMPLATE_EMAIL_CONTENT, templateType.getType(), name()); + } + + public String getSmsTemplateCodeProperty(TemplateType templateType) { + return String.format(PREFIX_RESIDENT_TEMPLATE_SMS, templateType.getType(), name()); + } + + public String getPurposeTemplateCodeProperty(TemplateType templateType) { + return String.format(PREFIX_RESIDENT_TEMPLATE_PURPOSE, templateType.getType(), name()); + } + + public String getSummaryTemplateCodeProperty(TemplateType templateType) { + return String.format(PREFIX_RESIDENT_TEMPLATE_SUMMARY, templateType.getType(), name()); + } + + public Tuple2, String> getAckTemplateVariables(TemplateUtil templateUtil, ResidentTransactionEntity residentTransactionEntity, String languageCode, Integer timeZoneOffset, String locale) { + return ackTemplateVariablesFunction.apply(templateUtil, residentTransactionEntity, languageCode, timeZoneOffset, locale); + } + + public Map getNotificationTemplateVariables(TemplateUtil templateUtil, NotificationTemplateVariableDTO dto, Map notificationAttributes) { + return notificationTemplateVariablesFunction.apply(templateUtil, dto, notificationAttributes); + } + + public String getDescriptionTemplateVariables(TemplateUtil templateUtil, ResidentTransactionEntity residentTransactionEntity, String fileText, String languageCode){ + return getDescriptionTemplateVariables.apply(templateUtil, residentTransactionEntity, fileText, languageCode); + } + + public String getNamingProperty() { + return namingProperty; + } + + @Override + public void preUpdateInBatchJob(Environment env, Utility utility, ResidentTransactionEntity txn, + Map credentialStatus, String newStatusCode) + throws ResidentServiceCheckedException, ApisResourceAccessException { + //Default does nothing + } + + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentConstants.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentConstants.java new file mode 100644 index 00000000000..ceda77e8ff2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentConstants.java @@ -0,0 +1,330 @@ + +package io.mosip.resident.constant; + +/** + * It contains all the constants used in the Resident Service + * + * @author Manoj SP + */ +public class ResidentConstants { + + private ResidentConstants() { + } + + public static final String OBJECT_STORE_ACCOUNT_NAME = "mosip.resident.object.store.account-name"; + + public static final String OBJECT_STORE_BUCKET_NAME = "mosip.resident.object.store.bucket-name"; + + public static final String OBJECT_STORE_ADAPTER_NAME = "mosip.resident.object.store.adapter-name"; + + public static final String CRYPTO_APPLICATION_NAME = "mosip.resident.keymanager.application-name"; + + public static final String CRYPTO_REFERENCE_ID = "mosip.resident.keymanager.reference-id"; + + public static final String CRYPTO_ENCRYPT_URI = "mosip.resident.keymanager.encrypt-uri"; + + public static final String CRYPTO_DECRYPT_URI = "mosip.resident.keymanager.decrypt-uri"; + + public static final String VIRUS_SCANNER_ENABLED = "mosip.resident.virus-scanner.enabled"; + + public static final String SUBSCRIPTIONS_DELAY_ON_STARTUP = "subscriptions-delay-on-startup_millisecs"; + + public static final String RESUBSCRIPTIONS_INTERVAL_SECS = "re-subscription-interval-in-seconds"; + + public static final String CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY = "mosip.resident.update.service.status.job.initial-delay"; + + public static final String CREDENTIAL_UPDATE_STATUS_UPDATE_INITIAL_DELAY_DEFAULT = "60000"; + + public static final String CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL = "mosip.resident.update.service.status.job.interval.millisecs"; + + public static final String CREDENTIAL_UPDATE_STATUS_UPDATE_INTERVAL_DEFAULT = "60000"; + + public static final String IS_CREDENTIAL_STATUS_UPDATE_JOB_ENABLED = "mosip.resident.update.service.status.job.enabled"; + + public static final String PUBLIC_URL = "mosipbox.public.url"; + + public static final String NOTIFICATION_ZONE = "mosip.notification.timezone"; + public static final String NOTIFICATION_DATE_PATTERN = "mosip.notification.date.pattern"; + public static final String NOTIFICATION_TIME_PATTERN = "mosip.notification.time.pattern"; + + public static final String EVENT_ID = "eventId"; + + public static final String DOWNLOAD_CARD = "/download/card/"; + + public static final String STATUS_CODE = "statusCode"; + public static final String STATUS = "status"; + public static final String URL = "url"; + public static final String RESIDENT = "RESIDENT"; + public static final String RESIDENT_SERVICES = "resident-services"; + + public static final String RESIDENT_CONTACT_DETAILS_UPDATE_ID="resident.contact.details.update.id"; + + public static final String RESIDENT_CONTACT_DETAILS_SEND_OTP_ID="resident.contact.details.send.otp.id"; + + + public static final String MOSIP_OIDC_JWT_SIGNED = "mosip.resident.oidc.userinfo.jwt.signed"; + public static final String MOSIP_OIDC_JWT_VERIFY_ENABLED = "mosip.resident.oidc.userinfo.jwt.verify.enabled"; + public static final String MOSIP_OIDC_ENCRYPTION_ENABLED = "mosip.resident.oidc.userinfo.encryption.enabled"; + + public static final String IDP_REFERENCE_ID = "mosip.resident.oidc.keymanager.reference.id"; + public static final String RESIDENT_APP_ID = "resident.appid"; + + public static final String DATA_SHARE_APPLICATION_ID = "mosip.datashare.application.id"; + public static final String DATA_SHARE_REFERENCE_ID = "mosip.datashare.reference.id"; + + public static final String DOWNLOAD_UIN_CARD_ID = "mosip.resident.download.uin.card"; + public static final String LOWER_LEFT_X = "mosip.resident.service.uincard.lowerleftx"; + public static final String LOWER_LEFT_Y = "mosip.resident.service.uincard.lowerlefty"; + public static final String UPPER_RIGHT_X = "mosip.resident.service.uincard.upperrightx"; + public static final String UPPER_RIGHT_Y = "mosip.resident.service.uincard.upperrighty"; + public static final String REASON = "mosip.resident.service.uincard.signature.reason"; + + public static final String SIGN_PDF_APPLICATION_ID = "mosip.resident.sign.pdf.application.id"; + public static final String SIGN_PDF_REFERENCE_ID = "mosip.resident.sign.pdf.reference.id"; + + public static final String AUTHENTICATION_MODE_CLAIM_NAME = "mosip.resident.access_token.auth_mode.claim-name"; + public static final String SUBJECT_CLAIM_NAME = "mosip.resident.access_token.subject.claim-name"; + + public static final String MOSIP_RESIDENT_DOWNLOAD_PERSONALIZED_CARD_ID = "mosip.resident.download.personalized.card.id"; + + public static final String PASSWORD_ATTRIBUTE = "mosip.digitalcard.uincard.password"; + + public static final String CREATE_PASSWORD_METHOD_NAME = "resident.create.password.method.name"; + + public static final String DOWNLOAD_PERSONALIZED_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.download.personalized.card.naming.convention"; + + public static final String DOWNLOAD_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.download.card.naming.convention"; + + public static final String IS_PASSWORD_FLAG_ENABLED = "mosip.digitalcard.pdf.password.enable.flag"; + + public static final String CREDENTIAL_ISSUER = "mosip.credential.issuer"; + public static final String CREDENTIAL_ENCRYPTION_FLAG = "mosip.resident.request.credential.isEncrypt"; + public static final String CREDENTIAL_ENCRYPTION_KEY = "mosip.resident.request.credential.encryption.key"; + public static final String VID_DOWNLOAD_CARD_ID = "mosip.resident.request.vid.card.id"; + public static final String VID_DOWNLOAD_CARD_VERSION = "mosip.resident.request.vid.card.version"; + + public static final String SERVICE_HISTORY_PROPERTY_TEMPLATE_TYPE_CODE = "mosip.resident.service.history.template.type.code"; + public static final String RESIDENT_ALL_TEMPLATE_PROPERTY = "resident.ALL.template.property"; + public static final String RESIDENT_UNKNOWN_TEMPLATE_PROPERTY = "resident.UNKNOWN.template.property"; + public static final String PHOTO_ATTRIBUTE_NAME = "mosip.resident.photo.attribute.name"; + public static final String APPLICANT_NAME_PROPERTY = "mosip.resident.applicant.name.property"; + public static final String AUTHENTICATION_MODE_PROPERTY = "mosip.resident.authentication.mode.property"; + + public static final String INDIVIDUALID_CLAIM_NAME = "mosip.resident.individual.id.claim.name"; + public static final String MOSIP_CREDENTIAL_TYPE_PROPERTY="mosip.digital.card.credential.type"; + + public static final String CREDENTIAL_REQUEST_SERVICE_ID = "mosip.credential.request.service.id"; + public static final String CREDENTIAL_REQUEST_SERVICE_VERSION = "mosip.credential.request.service.version"; + public static final String DOWNLOAD_REGISTRATION_CENTRE_FILE_NAME_CONVENTION_PROPERTY = "mosip.resident.download.registration.centre.file.name.convention"; + public static final String DOWNLOAD_NEAREST_REGISTRATION_CENTRE_FILE_NAME_CONVENTION_PROPERTY = "mosip.resident.download.nearest.registration.centre.file.name.convention"; + public static final String DOWNLOAD_SUPPORTING_DOCUMENT_FILE_NAME_CONVENTION_PROPERTY = "mosip.resident.download.supporting.document.file.name.convention"; + public static final String ACK_MANAGE_MY_VID_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.manage_my_vid.name.convention"; + public static final String ACK_SECURE_MY_ID_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.secure_my_id.name.convention"; + public static final String ACK_PERSONALIZED_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.personalised_card.name.convention"; + public static final String ACK_UPDATE_MY_DATA_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.update_my_data.name.convention"; + public static final String ACK_SHARE_CREDENTIAL_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.share_credential.name.convention"; + public static final String ACK_ORDER_PHYSICAL_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.order_physical_card.name.convention"; + public static final String ACK_NAMING_CONVENTION_PROPERTY = "mosip.resident.ack.name.convention"; + public static final String UIN_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.uin.card.name.convention"; + public static final String VID_CARD_NAMING_CONVENTION_PROPERTY = "mosip.resident.vid.card.name.convention"; + public static final String SUCCESS = "Success"; + public static final String FAILED = "Failed"; + public static final String NOT_AVAILABLE = "NA"; + public static final String REGISTRATION_CENTRE_TEMPLATE_PROPERTY = "resident.template.registration.centers.list"; + public static final String SUPPORTING_DOCS_TEMPLATE_PROPERTY = "resident.template.support-docs-list"; + public static final String FROM_DATE_TIME = "fromDateTime"; + public static final String TO_DATE_TIME = "toDateTime"; + public static final String DOWNLOAD_SERVICE_HISTORY_FILE_NAME_CONVENTION_PROPERTY = "mosip.resident.download.service.history.file.name.convention"; + public static final String GRIEVANCE_REQUEST_ID = "mosip.resident.grievance.ticket.request.id"; + public static final String GRIEVANCE_REQUEST_VERSION = "mosip.resident.grievance.ticket.request.version"; + public static final String DOWNLOAD_REG_CENTER_ID = "resident.download.reg.centers.list.id"; + public static final String DOWNLOAD_NEAREST_REG_CENTER_ID = "resident.download.nearest.reg.centers.id"; + public static final String DOWNLOAD_SUPPORTING_DOCS_ID = "resident.download.supporting.documents.id"; + public static final String SEND_CARD_ID = "resident.send.card.id"; + public static final String PINNED_EVENTID_ID = "resident.pinned.eventid.id"; + public static final String UNPINNED_EVENTID_ID = "resident.unpinned.eventid.id"; + public static final String AUTH_PROXY_PARTNERS_ID = "resident.auth.proxy.partners.id"; + public static final String AUTH_HISTORY_ID = "resident.authhistory.id"; + public static final String EVENTS_EVENTID_ID = "resident.events.eventid.id"; + public static final String UPDATE_UIN_ID = "resident.updateuin.id"; + public static final String NOTIFICATION_CLICK_ID = "resident.notification.click.id"; + public static final String NOTIFICATION_ID = "resident.notification.id"; + public static final String SERVICE_HISTORY_ID = "resident.service.history.id"; + public static final String PROFILE_ID = "resident.profile.id"; + public static final String CREDENTIAL_STORE_ID = "mosip.credential.store.id"; + public static final String GET_VIDS_ID = "resident.vids.id"; + public static final String TRANSLITERATE_ID = "mosip.resident.transliteration.transliterate.id"; + public static final String VERIFICATION_STATUS_ID = "resident.channel.verification.status.id"; + + public static final String NAME_FROM_PROFILE = "mosip.resident.name.token.claim-name"; + public static final String UNKNOWN = "Unknown"; + public static final String EMAIL_FROM_PROFILE = "mosip.resident.email.token.claim-email"; + public static final String PHONE_FROM_PROFILE = "mosip.resident.phone.token.claim-phone"; + + public static final String TRANSACTION_TYPE_CODE = "transactionTypeCode"; + public static final String AID_STATUS = "aidStatus"; + + public static final String CHECK_STATUS_ID = "resident.checkstatus.id"; + + public static final String CHECK_STATUS_INDIVIDUAL_ID = "mosip.resident.checkstatus.individualid.id"; + public static final String CHECKSTATUS_INDIVIDUALID_VERSION = "mosip.resident.checkstatus.individualid.version"; + + public static final String RID = "rid"; + + public static final String ADDITIONAL_ATTRIBUTE_TO_FETCH = "resident.additional.identity.attribute.to.fetch"; + public static final String COMMA = ","; + public static final String COLON = ":"; + public static final String SEMI_COLON = ";"; + public static final String OPEN_PARENTHESIS = "("; + public static final String CLOSE_PARENTHESIS = ")"; + + public static final String FILE_TEXT = "fileText"; + public static final String DOLLAR = "$"; + public static final String AUTH_TYPE = "authType"; + + public static final String ATTRIBUTE_LIST_DELIMITER = ","; + public static final String UI_ATTRIBUTE_DATA_DELIMITER = ", "; + + public static final String HTTP_STATUS_CODE = "httpStatusCode"; + public static final String REQ_RES_ID = "reqResId"; + public static final String REQ_RES_VERSION = "mosip.resident.request.response.version"; + public static final String RESIDENT_USER_PROFILE_ID = "mosip.resident.user.profile.id"; + + public static final String ACK_SHARE_CREDENTIAL_TEMPLATE_PROPERTY = "resident.template.ack.share-cred-with-partner"; + public static final String ACK_AUTHENTICATION_REQUEST_TEMPLATE_PROPERTY = "resident.template.ack.authentication.request"; + public static final String ACK_DOWNLOAD_PERSONALIZED_CARD_TEMPLATE_PROPERTY = "resident.template.ack.download-a-personalized-card"; + public static final String ACK_ORDER_PHYSICAL_CARD_TEMPLATE_PROPERTY = "resident.template.ack.order-a-physical-card"; + public static final String ACK_GET_MY_ID_TEMPLATE_PROPERTY = "resident.template.ack.get.my.id"; + public static final String ACK_UPDATE_MY_UIN_TEMPLATE_PROPERTY = "resident.template.ack.update-demographic-data"; + public static final String ACK_MANAGE_MY_VID_TEMPLATE_PROPERTY = "resident.template.ack.manage-my-vid"; + public static final String ACK_AUTH_TYPE_LOCK_UNLOCK_TEMPLATE_PROPERTY = "resident.template.ack.secure-my-id"; + public static final String ACK_VID_CARD_DOWNLOAD_TEMPLATE_PROPERTY = "resident.template.ack.vid.card.download"; + public static final String ACK_VERIFY_PHONE_EMAIL_TEMPLATE_PROPERTY = "resident.template.ack.verify-email-id-or-phone-number"; + + public static final String MOSIP_PDF_HEADER_LOGO_URL = "mosip.pdf.header.logo.url"; + + public static final String UI_DATE_TIME_PATTERN_DEFAULT = "resident.ui.datetime.pattern.default"; + public static final String FILENAME_DATETIME_PATTERN_DEFAULT = "resident.filename.datetime.pattern.default"; + + public static final String NO_ID = "NO_ID"; + public static final String NO_ID_TYPE = "NO_ID_TYPE"; + + public static final String OTP_EXPIRED_ERR_CODE = "IDA-OTA-003"; + public static final String OTP_INVALID_ERR_CODE = "IDA-OTA-004"; + public static final String INVALID_ID_ERR_CODE = "IDA-MLC-009"; + public static final String OTP_AUTH_LOCKED_ERR_CODE = "IDA-MLC-019"; + public static final String PHONE = "PHONE"; + public static final String EMAIL = "EMAIL"; + + // IP headers constants start--- + public static final String X_FORWARDED_FOR = "X-Forwarded-For"; + public static final String X_REAL_IP = "x-real-ip"; + public static final String PROXY_CLIENT_IP = "Proxy-Client-IP"; + public static final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP"; + public static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"; + public static final String HTTP_X_FORWARDED = "HTTP_X_FORWARDED"; + public static final String HTTP_X_CLUSTER_CLIENT_IP = "HTTP_X_CLUSTER_CLIENT_IP"; + public static final String HTTP_CLIENT_IP = "HTTP_CLIENT_IP"; + public static final String HTTP_FORWARDED_FOR = "HTTP_FORWARDED_FOR"; + public static final String HTTP_FORWARDED = "HTTP_FORWARDED"; + public static final String HTTP_VIA = "HTTP_VIA"; + public static final String REMOTE_ADDR = "REMOTE_ADDR"; + // IP headers constants end--- + + public static final String VID_POLICIES = "vidPolicies"; + public static final String VID_POLICY = "vidPolicy"; + public static final String PERPETUAL = "Perpetual"; + + public static final String VID_ACTIVE_STATUS = "mosip.idrepo.vid.reactive-status"; + public static final int UTC_TIMEZONE_OFFSET = 0; + + public static final String INDIVIDUAL_ID = "individualId"; + public static final String ISSUER = "issuer"; + public static final String PARTNER_ID = "partnerId"; + public static final String CREDENTIAL_TYPE = "credentialType"; + public static final String OTP = "OTP"; + public static final String TRANSACTION_ID_OLD = "transactionID"; + + public static final String MUST_NOT_BE_EMPTY = " must not be empty."; + + public static final String ID = "id"; + public static final String REVOKE_VID = "revokeVidId"; + public static final String SCHEMA_TYPE = "schemaType"; + public static final String ALLOWED_FILE_TYPE = "mosip.allowed.extension"; + public static final String MANDATORY_LANGUAGE="mosip.mandatory-languages"; + public static final CharSequence ATTRIBUTES = "attributes"; + public static final String INVALID_INPUT_PARAMETER="Invalid input parameter"; + + public static final String VID_CARD_TEMPLATE_PROPERTY = "mosip.resident.vid.card.template.property"; + + public static final String IMAGE = "mosip.resident.photo.token.claim-photo"; + public static final String NAME = "name"; + public static final String ONLINE_VERIFICATION_PARTNER_ID = "ida.online-verification-partner-id"; + + public static final String RESIDENT_NOTIFICATIONS_DEFAULT_PAGE_SIZE = "resident.notifications.default.page.size"; + public static final String RESIDENT_SERVICE_HISTORY_DOWNLOAD_MAX_COUNT = "resident.service-history.download.max.count"; + public static final String RESIDENT_VIEW_HISTORY_DEFAULT_PAGE_SIZE = "resident.view-history.default.page.size"; + public static final String LANGUAGE = "language"; + public static final String VALUE = "value"; + + public static final String RESIDENT_REGISTRATION_CENTERS_DOWNLOAD_MAX_COUNT = "resident.registration-centers.download.max.count"; + + public static final String PREFERRED_LANG_PROPERTY = "resident.update.preferred.language.by.name"; + public static final String PREFERRED_LANGUAGE = "preferredLanguage"; + public static final String RESIDENT_ATTRIBUTE_NAMES_WITHOUT_DOCUMENTS_REQUIRED = "resident.attribute.names.without.documents.required"; + +// UI Schema keys + public static final String FORMAT_REQUIRED = "formatRequired"; + public static final String ATTRIBUTE_NAME = "attributeName"; + public static final String FORMAT_OPTION = "formatOption"; + public static final String LABEL = "label"; + public static final String MASK_REQUIRED = "maskRequired"; + public static final String MASK_ATTRIBUTE_NAME = "maskAttributeName"; + public static final String MASK_PREFIX = "masked_"; + public static final String MASK_PERPETUAL_VID = "masked_perpetualVID"; + public static final String RESIDENT_FUTURE_TIME_LIMIT = "resident.future.time.limit"; + public static final String RESIDENT_PAST_TIME_LIMIT = "resident.past.time.limit"; + +// websub attributes + public static final String EVENT = "event"; + public static final String DATA = "data"; + public static final String REQUEST_ID = "requestId"; + public static final String AUTH_TYPES = "authTypes"; + public static final String RESIDENT_REST_TEMPLATE_LOGGING_INTERCEPTOR_FILTER_ENABLED = "resident.rest.template.logging.interceptor.filter.enabled"; + public static final String RESIDENT_REST_TEMPLATE_METRICS_INTERCEPTOR_FILTER_ENABLED = "resident.rest.template.metrics.interceptor.filter.enabled"; + public static final String ID_SCHEMA_VERSION = "IDSchemaVersion"; + +// Partner related constant + public static final String PARTNERS = "partners"; + public static final String PMS_PARTNER_ID = "partnerID"; + public static final String PARTNER_TYPE = "partnerType"; + public static final String ORGANIZATION_NAME = "organizationName"; + public static final String AUTH_PARTNER = "Auth_Partner"; + public static final String PRINT_PARTNER = "Print_Partner"; + public static final String RESIDENT_SHARE_CREDENTIAL_PARTNER_TYPE = "resident.share-credential.partner.type"; + public static final String RESIDENT_AUTHENTICATION_REQUEST_PARTNER_TYPE = "resident.authentication-request.partner.type"; + public static final String RESIDENT_ORDER_PHYSICAL_CARD_PARTNER_TYPE = "resident.order-physical-card.partner.type"; + + public static final String API_RESPONSE_TIME_DESCRIPTION = "API Response Time"; + + public static final String API_RESPONSE_TIME_ID = "api.response.time"; + + public static final String DB_QUERY_RESPONSE_TIME_DESCRIPTION = "DB Query Response Time"; + public static final String DB_QUERY_RESPONSE_TIME_ID = "db.query.response.time"; + + public static final String REST_CLIENT_RESPONSE_TIME_DESCRIPTION = "Rest Client Response Time"; + public static final String REST_CLIENT_RESPONSE_TIME_ID = "rest.client.response.time"; + public static final String UNDER_SCORE = "_"; + public static final String IDENTITY = "identity"; + public static final String HYPHEN = "-"; + + public static final String GET_PENDING_DRAFT_ID = "mosip.resident.get.pending.drafts"; + public static final String GET_PENDING_DRAFT_VERSION = "mosip.resident.get.pending.drafts.version"; + public static final String GET_PENDING_DRAFT_VERSION_DEFAULT_VALUE = "1.0"; + public static final String UPDATED = " updated"; + + public static final int ZERO = 0; + public static final String DISCARD_DRAFT_ID = "mosip.resident.discard.pending.drafts"; + public static final String DISCARD_DRAFT_VERSION = "mosip.resident.discard.pending.drafts.version"; + public static final String REG_PROC_CREDENTIAL_PARTNER_POLICY_URL = "mosip.resident.reg-processer-credential-partner-policy-url"; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentErrorCode.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentErrorCode.java index cd458c02c09..0033de8491f 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentErrorCode.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/ResidentErrorCode.java @@ -2,47 +2,144 @@ public enum ResidentErrorCode { - NO_RID_FOUND_EXCEPTION("RES-SER-408", "RID not found"), - INVALID_REQUEST_EXCEPTION("RES-SER-002","One or more input parameter is invalid or does not exist"), - TOKEN_GENERATION_FAILED("RES-SER-409","Token generation failed"), - OTP_VALIDATION_FAILED("RES-SER-422","OTP validation failed"), - API_RESOURCE_UNAVAILABLE("RES-SER-411","API resource is not available"), - API_RESOURCE_ACCESS_EXCEPTION("RES-SER-412", "Unable to access API resource"), - CREDENTIAL_ISSUED_EXCEPTION("RES-SER-24", "Credential is issued"), - VID_CREATION_EXCEPTION("RES-SER-406", "Exception while creating VID"), - VID_ALREADY_PRESENT("RES-SER-405","Maximum allowed VIDs are active. Deactivate VID to generate new one."), - INVALID_INPUT("RES-SER-410","Invalid Input Parameter- "), - INVALID_VID("RES-SER-010", "Invalid VID"), INVALID_UIN("RES-SER-011", "Invalid UIN"), - INVALID_RID("RES-SER-413", "Invalid RID"), INVALID_VID_UIN("RES-SER-013", "Invalid UIN for given VID"), - REQUEST_FAILED("RES-SER-402", "Your request is not successful, please try again later."), - TEMPLATE_EXCEPTION("RES-SER-415","Template exception"), - TEMPLATE_SUBJECT_EXCEPTION("RES-SER-416","Template subject exception"), - NOTIFICATION_FAILURE("RES-SER-417","Sending notification(Email and SMS) to resident failed."), + INVALID_REQUEST_EXCEPTION("RES-SER-002", "One or more input parameter is invalid or does not exist"), + INVALID_VID("RES-SER-010", "Invalid VID"), + INVALID_UIN("RES-SER-011", "Invalid UIN"), + INVALID_VID_UIN("RES-SER-013", "Invalid UIN for given VID"), IN_VALID_UIN_OR_VID_OR_RID("RES-SER-018", "Invalid individualId"), - RE_PRINT_REQUEST_FAILED("RES-SER-019","Re print UIN request failed"), - VID_REVOCATION_EXCEPTION("RES-SER-407","VID revocation request failed. Please visit the nearest registration center for assistance."), - BAD_REQUEST("RES-SER-418","Bad Request"), - INVALID_API_RESPONSE("RES-SER-419", "Invalid APi response from - "), - UIN_UPDATE_FAILED("RES-SER-22","Resident UIN update failed"), + RE_PRINT_REQUEST_FAILED("RES-SER-019", "Re print UIN request failed"), + UIN_UPDATE_FAILED("RES-SER-22", "Resident UIN update failed"), DOCUMENT_NOT_FOUND("RES-SER-23", "Could not find the submitted document"), - //system exceptions - RESIDENT_SYS_EXCEPTION("RES-SER-SYS-001","System exception occured"), - IO_EXCEPTION("RES-SER-420","IO Exception occured"), - JSON_PROCESSING_EXCEPTION("RES-SER-421","JSON Processing Exception occured"), - INVALID_RID_EXCEPTION("RES-TUG-001", "RID entered is not valid"), - INVLAID_KEY_EXCEPTION("RES-SER-25", - "Exception occured while encryting the packet Invalid Key"), - UNKNOWN_EXCEPTION("RES-SER-423", - "Unknown exception occured."), - BASE_EXCEPTION("RES-SER-401", - "Base exception."), - PACKET_CREATION_EXCEPTION("RES-SER-424", - "Exception while creating packet."), + CREDENTIAL_ISSUED_EXCEPTION("RES-SER-24", "Credential is issued"), + INVLAID_KEY_EXCEPTION("RES-SER-25", "Exception occured while encryting the packet Invalid Key"), INVALID_ID("RES-SER-29", "Invalid id"), + + VIRUS_SCAN("RES-SER-319", "The file uploaded is corrupted"), + + BASE_EXCEPTION("RES-SER-401", "Base exception."), + REQUEST_FAILED("RES-SER-402", "Your request is not successful, please try again later."), + PAYMENT_REQUIRED("RES-SER-402", "Payment is not made for this card"), + FORBIDDEN("RES-SER-403", "Access is denied"), + VID_ALREADY_PRESENT("RES-SER-405", "Maximum allowed VIDs are active. Deactivate VID to generate new one."), + VID_CREATION_EXCEPTION("RES-SER-406", "Exception while creating VID"), + VID_REVOCATION_EXCEPTION("RES-SER-407", + "VID revocation request failed. Please visit the nearest registration center for assistance."), + NO_RID_FOUND_EXCEPTION("RES-SER-408", "RID not found"), + TOKEN_GENERATION_FAILED("RES-SER-409", "Token generation failed"), + INVALID_INPUT("RES-SER-410", "Invalid Input Parameter- "), + API_RESOURCE_UNAVAILABLE("RES-SER-411", "API resource is not available"), + API_RESOURCE_ACCESS_EXCEPTION("RES-SER-412", "Unable to access API resource"), + INVALID_RID("RES-SER-413", "Invalid RID"), + MISSING_INPUT_PARAMETER("RES-SER-414", "Missing input Parameter- %s"), + TEMPLATE_EXCEPTION("RES-SER-415", "Template exception"), + TEMPLATE_SUBJECT_EXCEPTION("RES-SER-416", "Template subject exception"), + NOTIFICATION_FAILURE("RES-SER-417", "Sending notification(Email and SMS) to resident failed."), + BAD_REQUEST("RES-SER-418", "Bad Request"), + INVALID_API_RESPONSE("RES-SER-419", "Invalid APi response from - "), + IO_EXCEPTION("RES-SER-420", "IO Exception occured"), + JSON_PROCESSING_EXCEPTION("RES-SER-421", "JSON Processing Exception occured"), + OTP_VALIDATION_FAILED("RES-SER-422", "OTP validation failed"), + UNKNOWN_EXCEPTION("RES-SER-423", "Unknown exception occured."), + PACKET_CREATION_EXCEPTION("RES-SER-424", "Exception while creating packet."), OTP_GENERATION_EXCEPTION("RES-SER-425", "while generating otp error is occured"), POLICY_EXCEPTION("RES-SER-426", "while retrieving policy details error is occured"), + UNSUPPORTED_INPUT("RES-SER-427", "Unsupported Input Parameter - "), PACKET_SIGNKEY_EXCEPTION("RES-SER-430", "Public sign key is not available from key manager"), - MACHINE_MASTER_CREATE_EXCEPTION("RES-SER-431", "Machine is not created in master data"); + MACHINE_MASTER_CREATE_EXCEPTION("RES-SER-431", "Machine is not created in master data"), + INDIVIDUAL_ID_TYPE_INVALID("RES-SER-432", "Individual Id type is invalid"), + INDIVIDUAL_ID_UIN_MISMATCH("RES-SER-433", "Individual Id in request and identity json UIN is not matching"), + FAILED_TO_UPLOAD_DOC("RES-SER-434", "Failed to upload document"), + FAILED_TO_RETRIEVE_DOC("RES-SER-435", "Failed to retrieve document(s) from object store"), + ENCRYPT_DECRYPT_ERROR("RES-SER-436", "Failed to encrypt/decrypt data"), + VIRUS_SCAN_FAILED("RES-SER-437", "Virus scanning failed for attached document"), + CHANNEL_IS_NOT_VALID("RES-SER-438", "Invalid OTP Channel"), + CLAIM_NOT_AVAILABLE("RES-SER-439", "Claim not available: %s"), + NO_CHANNEL_IN_IDENTITY("RES-SER-440", "Identity data does not contain email/phone."), + PARTNER_SERVICE_EXCEPTION("RES-SER-441", "Exception while calling partner service"), + AUTH_LOCK_STATUS_FAILED("RES-SER-442", "Failed to retrieve auth lock status"), + AUTH_TYPE_CALLBACK_NOT_AVAILABLE("RES-SER-443", "Callback url is not available for auth type: %s"), + RESIDENT_WEBSUB_UPDATE_AUTH_TYPE_FAILED("RES-SER-444", "Failed to update auth type status for resident"), + RESIDENT_AUTH_TXN_DETAILS_FAILURE("RES-SER-445", "Failed to retrieve auth transaction details"), + INVALID_PAGE_INDEX_VALUE("RES-SER-446", "Invalid page index value"), + INVALID_PAGE_SIZE_VALUE("RES-SER-447", "Invalid page size value"), + PERPETUAL_VID_NOT_AVALIABLE("RES-SER-448", "Perpatual VID not available"), + AID_STATUS_IS_NOT_READY("RES-SER-449", "AID is not ready"), + BIOMETRIC_MISSING("RES-SER-450", "Biometric data is not available in database"), + EMPTY_COLLECTION_FOUND("RES-SER-451", "Collection is empty"), + IDVID_NOT_MATCH_TO_SESSION("RES-SER-452", "Provided individualId does not belong to the logged in session."), + VID_NOT_BELONG_TO_INDIVITUAL("RES-SER-453", "Provided VID does not belong to the individualId."), + VID_NOT_BELONG_TO_USER("RES-SER-454", "Provided VID does not belong to the logged in user."), + PACKET_ENCRYPTION_FAILURE_EXCEPTION("RES-SER-455", "Packet encryption failed"), + REQUEST_ID_NOT_FOUND("RES-SER-456", "Request id not found"), + RID_NOT_FOUND("RES-SER-456", "RID not found"), + AID_NOT_FOUND("RES-SER-457", "AID not found"), + DIGITAL_CARD_RID_NOT_FOUND("RES-SER-457", "Digital Card Rid not found"), + CREDENTIAL_REQUEST_ID_NOT_FOUND("RES-SER-458", "Credential request id not found"), + FAILED_TO_DELETE_DOC("RES-SER-458", "Failed to delete document"), + CREDENTIAL_REQUEST_NOT_FOUND("RES-SER-459", "Credential request not found"), + EVENT_STATUS_NOT_FOUND("RES-SER-459", "EID not available in database"), + ACK_TEMPLATE_NOT_FOUND("RES-SER-460", "Acknowledgment template not found"), + CONSENT_DENIED("RES-SER-461", + "Accepting the terms and conditions is a mandatory action to proceed further. Please accept the consent to proceed"), + NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID("RES-SER-461", "No document found for transactionID: "), + CONFIG_FILE_NOT_FOUND_EXCEPTION("RES-SER-462", "Config file not found in the config server"), + SEND_OTP_FAILED("RES-SER-463", "Send OTP failed."), + OTP_ALREADY_SENT("RES-SER-464", "OTP is already sent - Please use the Sent OTP or try again after sometime"), + BLOCKED_OTP_VALIDATE("RES-SER-465", "OTP is blocked"), + UNABLE_TO_PROCESS("RES-SER-466", "Unable to process"), + SERVER_ERROR("RES-SER-467", "Server error occurred"), + VALIDATION_UNSUCCESS("RES-SER-468", "Validation un-success"), + EXPIRED_OTP("RES-SER-469", "OTP expired - Please send OTP again"), + NO_RECORDS_FOUND("RES-SER-470", "No Record(s) found"), + VID_VALIDATION("RES-SER-471", "This VID cannot be revoked since you have logged in using same VID"), + CARD_NOT_FOUND("RES-SER-472", "Card not found."), + INVALID_REQUEST_TYPE_CODE("RES-SER-473", + "Invalid Request Type. Please input eventId only for VID_CARD_DOWNLOAD," + "UPDATE_MY_UIN"), + INVALID_INDIVIDUAL_ID("RES-SER-474", "Individual ID is invalid."), + PAYMENT_FAILED("RES-SER-475", "Payment has failed"), + PAYMENT_CANCELED("RES-SER-476", "Payment has been cancelled"), + TECHNICAL_ERROR("RES-SER-477", "Technical error has occurred"), + CAN_T_PLACE_ORDER("RES-SER-478", "Cannot place order at the moment"), + DOWNLOAD_PERSONALIZED_CARD("RES-SER-479", "Error in downloading personalized card"), + VID_REQUEST_CARD_FAILED("RES-SER-480", "Error in Request card from vid"), + PATNER_NOT_FOUND("RES-SER-481", "Partner not found."), + REDIRECT_URL_NOT_FOUND("RES-SER-482", "Redirect url not found."), + + CARD_NOT_READY("RES-SER-509", "The card is not ready for download."), + OTP_REQUEST_FLOODED("RES-SER-510", "Innumerous OTP requests received"), + EID_NOT_BELONG_TO_SESSION("RES-SER-511", "The entered EID is not associated with the UIN/VID used to log in."), + GRIEVANCE_TICKET_GENERATION_FAILED("RES-SER-512", "Unable to Generate Ticket of grievance"), + VID_CREATION_FAILED_WITH_REVOCATION("RES-SER-513", + "Failed to create VID, as the existing VID cannot be revoked since this VID was used to log into the current session."), + DOCUMENT_FILE_SIZE("RES-SER-514", "File size cannot be more than 2MB."), + CHAR_LIMIT_EXCEEDS("RES-SER-514", "Input text size exceeds the limit; Character limit=%d; inputType=%s"), + CONTAINS_SPECIAL_CHAR("RES-SER-515", "Input text contains special characters;inputType=%s"), + UN_SUPPORTED_FILE_TYPE("RES-SER-516", "Unsupported file type. Supported file extensions: jpg, jpeg, png, pdf"), + UNABLE_TO_FETCH_SERVICE_HISTORY_FROM_DB("RES-SER-517", "Unable to fetch service history from database."), + INVALID_REG_CENTER_NAME("RES-SER-518", "Name cannot be empty as it is a mandatory field."), + SAME_EMAIL_ERROR("RES-SER-519", "Enter a new email ID"), + SAME_PHONE_ERROR("RES-SER-520", "Enter a new phone number"), + INVALID_LANGUAGE_NAME("RES-SER-521", "Invalid Language Name"), + INVALID_UIN_VID_ENTERED("RES-SER-522", "Invalid UIN/VID entered"), + + OTP_EXPIRED("RES-OTP-006", "OTP has expired"), + OTP_INVALID("RES-OTP-007", "OTP is invalid"), + INVALID_TRANSACTION_ID("RES-OTP-008", "Input transactionId does not match transactionId of OTP Request"), + SMS_AUTH_LOCKED("RES-OTP-010", "Your SMS OTP authentication is locked"), + EMAIL_AUTH_LOCKED("RES-OTP-011", "Your email OTP authentication is locked"), + SMS_AND_EMAIL_AUTH_LOCKED("RES-OTP-012", "Your SMS and email OTP authentication is locked"), + + // system exceptions + RESIDENT_SYS_EXCEPTION("RES-SER-SYS-001", "System exception occured"), + + INVALID_RID_EXCEPTION("RES-TUG-001", "RID entered is not valid"), + UNAUTHORIZED("RES-ATH-401", "Authentication Failed"), + OTP_VALIDATION_FAILED_OLD_ERROR_CODE("IDA-MLC-018", "OTP validation failed"), + REG_PROC_WORK_FLOW_CALLBACK_NOT_AVAILABLE("RES-SER-523", "Callback url is not available for Regproc workflow completed event"), + NOT_ALLOWED_TO_UPDATE_UIN_PENDING_PACKET("RES-SER-524", " Not allowed to update UIN as previous packet is pending. To proceed further please discard it."), + NOT_ALLOWED_TO_UPDATE_UIN_PENDING_REQUEST("RES-SER-525", " Not allowed to update UIN as previous packet is pending and it cannot be cancelled."), + UPDATE_COUNT_LIMIT_EXCEEDED("RES-SER-526", "Update count limit for the attributes exceeded:- %s"); + private final String errorCode; private final String errorMessage; @@ -59,5 +156,3 @@ public String getErrorMessage() { return errorMessage; } } - - diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/ServiceType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/ServiceType.java new file mode 100644 index 00000000000..35413e59deb --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/ServiceType.java @@ -0,0 +1,65 @@ +package io.mosip.resident.constant; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * The Enum ServiceType. + * @author Kamesh Shekhar Prasad + */ + +public enum ServiceType { + AUTHENTICATION_REQUEST(List.of(RequestType.AUTHENTICATION_REQUEST)), + SERVICE_REQUEST(List.of(RequestType.DOWNLOAD_PERSONALIZED_CARD, RequestType.ORDER_PHYSICAL_CARD, + RequestType.GET_MY_ID, RequestType.VID_CARD_DOWNLOAD)), + DATA_UPDATE_REQUEST(List.of(RequestType.UPDATE_MY_UIN)), + ID_MANAGEMENT_REQUEST(List.of(RequestType.GENERATE_VID, RequestType.REVOKE_VID, + RequestType.VALIDATE_OTP, RequestType.AUTH_TYPE_LOCK_UNLOCK)), + DATA_SHARE_REQUEST(List.of(RequestType.SHARE_CRED_WITH_PARTNER)), + ASYNC(List.of(RequestType.VID_CARD_DOWNLOAD, RequestType.ORDER_PHYSICAL_CARD, RequestType.SHARE_CRED_WITH_PARTNER, + RequestType.UPDATE_MY_UIN, RequestType.AUTH_TYPE_LOCK_UNLOCK)), + ALL() { + public List getRequestTypes() { + return Stream.of(ServiceType.values()) + .filter(type -> !type.equals(this)) + .flatMap(type -> type.getRequestTypes().stream()) + .distinct() + .collect(Collectors.toList()); + } + }; + + private List subTypes; + + ServiceType() { + } + + ServiceType(List subTypes) { + this.subTypes = Collections.unmodifiableList(subTypes); + } + + public List getRequestTypes() { + return subTypes; + } + + public static Optional getServiceTypeFromString(String serviceTypeString) { + for (ServiceType serviceType : values()) { + if (serviceType.name().equalsIgnoreCase(serviceTypeString.trim())) { + return Optional.of(serviceType); + } + } + return Optional.empty(); + } + + public static Optional getServiceTypeFromRequestType(RequestType requestType) { + for (ServiceType serviceType : values()) { + List requestTypesList = serviceType.getRequestTypes(); + if (requestTypesList.contains(requestType)) { + return Optional.of(serviceType.name()); + } + } + return Optional.empty(); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateEnum.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateEnum.java deleted file mode 100644 index c83ee0d044c..00000000000 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.mosip.resident.constant; - -public enum TemplateEnum { - - VID; -} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateType.java new file mode 100644 index 00000000000..67625cdac38 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateType.java @@ -0,0 +1,23 @@ +package io.mosip.resident.constant; + +public enum TemplateType { + + REQUEST_RECEIVED("request-received"), + IN_PROGRESS("in-progress"), + SUCCESS("success"), + FAILURE("failure"), + REGPROC_SUCCESS("regproc-success"), + REGPROC_FAILED("regproc-failure"), + CANCELED("cancelled"); + + private String type; + + TemplateType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateVariablesConstants.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateVariablesConstants.java new file mode 100644 index 00000000000..ec668e9efd1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/TemplateVariablesConstants.java @@ -0,0 +1,46 @@ +package io.mosip.resident.constant; + +/** + * The Constant used here is to be used in template variables. + * @author Kamesh Shekhar Prasad + */ +public class TemplateVariablesConstants { + public static final String EVENT_ID = "eventId"; + public static final String ID = "id"; + public static final String FEATURE_NAME = "featureName"; + public static final String EVENT_TYPE = "eventType"; + public static final String EVENT_TYPE_ENUM = "eventTypeEnum"; + public static final String PURPOSE = "purpose"; + public static final String DESCRIPTION = "description"; + public static final String EVENT_STATUS = "eventStatus"; + public static final String EVENT_STATUS_ENUM = "eventStatusEnum"; + public static final String INDIVIDUAL_ID = "individualId"; + public static final String AUTHENTICATION_MODE = "authenticationMode"; + public static final String SUMMARY = "summary"; + public static final String TRACKING_ID = "trackingId"; + public static final String ORDER_TRACKING_LINK = "orderTrackingLink"; + public static final String PARTNER_ID = "partner"; + public static final String PARTNER_NAME = "partnerName"; + public static final String PARTNER_LOGO = "partnerLogo"; + public static final String ATTRIBUTE_LIST = "attributeList"; + public static final String TIMESTAMP = "timestamp"; + public static final String DOWNLOAD_CARD_LINK = "downloadCardLink"; + public static final String PAYMENT_STATUS = "paymentStatus"; + public static final String VID = "vid"; + public static final String MASKED_VID = "maskedVID"; + public static final String VID_TYPE = "vidType"; + public static final String ACTION_PERFORMED = "actionPerformed"; + public static final String EVENT_DETAILS = "eventDetails"; + public static final String DATE = "date"; + public static final String TIME = "time"; + public static final String NAME = "name"; + public static final String STATUS = "status"; + public static final String TRACK_SERVICE_REQUEST_LINK = "trackServiceRequestLink"; + public static final String DOWNLOAD_LINK = "downloadLink"; + public static final String TRANSACTION_ID = "transactionId"; + public static final String OTP = "otp"; + public static final String PHONE = "phone"; + public static final String ATTRIBUTES = "attributes"; + public static final String CHANNEL = "channel"; + public static final String PDF_HEADER_LOGO = "pdfHeaderLogo"; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/TransactionStage.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/TransactionStage.java new file mode 100644 index 00000000000..328745ec732 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/TransactionStage.java @@ -0,0 +1,54 @@ +package io.mosip.resident.constant; + +import java.util.List; +import java.util.Optional; + +import org.springframework.core.env.Environment; + +/** + * Enum to store the TransactionStage + * + * @author Kamesh Shekhar Prasad + */ +public enum TransactionStage { + REQUEST_RECEIVED("resident.REQUEST_RECEIVED.packet-transaction-type-code.list"), + VALIDATION_STAGE("resident.VALIDATION_STAGE.packet-transaction-type-code.list"), + VERIFICATION_STAGE("resident.VERIFICATION_STAGE.packet-transaction-type-code.list"), + UIN_GENERATION_STAGE("resident.UIN_GENERATION_STAGE.packet-transaction-type-code.list"), + CARD_READY_TO_DOWNLOAD("resident.CARD_READY_TO_DOWNLOAD.packet-transaction-type-code.list"); + + private String transactionTypeCodePropertyName; + + TransactionStage(String transactionTypeCodePropertyName) { + this.transactionTypeCodePropertyName = transactionTypeCodePropertyName; + } + + public static Optional getTypeCode(String transactionTypeCode, Environment env) { + for (TransactionStage transactionStage : values()) { + if (getTransactionTypeCodeList(transactionStage, env).contains(transactionTypeCode)) { + return Optional.of(transactionStage.name()); + } + } + return Optional.empty(); + } + + private static List getTransactionTypeCodeList(TransactionStage transactionStage, Environment env) { + List transactionTypeCode = List.of(); + if (transactionStage.transactionTypeCodePropertyName != null) { + String propertyName = env.getProperty(transactionStage.transactionTypeCodePropertyName); + if (propertyName != null) { + transactionTypeCode = List.of(propertyName.split(",")); + } + } + return transactionTypeCode; + } + + public static boolean containsStatus(String status) { + for (TransactionStage transactionStage : TransactionStage.values()) { + if (transactionStage.name().equals(status)) { + return true; + } + } + return false; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/UISchemaTypes.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/UISchemaTypes.java new file mode 100644 index 00000000000..7ea4821acf5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/constant/UISchemaTypes.java @@ -0,0 +1,54 @@ +package io.mosip.resident.constant; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public enum UISchemaTypes { + UPDATE_DEMOGRAPHICS("update-demographics", RequestType.UPDATE_MY_UIN), + PERSONALIZED_CARD("personalized-card", RequestType.DOWNLOAD_PERSONALIZED_CARD), + SHARE_CREDENTIAL("share-credential", RequestType.SHARE_CRED_WITH_PARTNER); + ; + + private String fileIdentifier; + private RequestType requestType; + + private UISchemaTypes(String fileIdentifier, RequestType requestType) { + this.fileIdentifier = fileIdentifier; + this.requestType = requestType; + } + + public String getFileIdentifier() { + return fileIdentifier; + } + + public RequestType getRequestType() { + return requestType; + } + + public static Optional getUISchemaTypeFromString(String schemaTypeString) { + for (UISchemaTypes uiSchemaType : values()) { + if (uiSchemaType.getFileIdentifier().equals(schemaTypeString)) { + return Optional.of(uiSchemaType); + } + } + return Optional.empty(); + } + + public static Optional getUISchemaTypeFromRequestTypeCode(RequestType requestType) { + for (UISchemaTypes uiSchemaType : values()) { + if (uiSchemaType.getRequestType().equals(requestType)) { + return Optional.of(uiSchemaType.getFileIdentifier()); + } + } + return Optional.empty(); + } + + public static List getUISchemaTypesList() { + List uiSchemaValues = new ArrayList<>(); + for (UISchemaTypes uiSchemaType : values()) { + uiSchemaValues.add(uiSchemaType.getFileIdentifier()); + } + return uiSchemaValues; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/constant/VidType.java b/resident/resident-service/src/main/java/io/mosip/resident/constant/VidType.java deleted file mode 100644 index cf437851a64..00000000000 --- a/resident/resident-service/src/main/java/io/mosip/resident/constant/VidType.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.mosip.resident.constant; - -public enum VidType { - PERPETUAL, TEMPORARY; -} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/AcknowledgementController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/AcknowledgementController.java new file mode 100644 index 00000000000..b13b3e945a1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/AcknowledgementController.java @@ -0,0 +1,103 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Map; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.AcknowledgementService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +/** + * This class is used to create api for getting acknowledgement. + * @Author Kamesh Shekhar Prasad + */ +@RestController +@Tag(name="AcknowledgementController", description="AcknowledgementController") +public class AcknowledgementController { + + private static final Logger logger = LoggerConfiguration.logConfig(AcknowledgementController.class); + + @Value("${resident.event.ack.download.id}") + private String ackDownloadId; + + @Value("${resident.event.ack.download.version}") + private String ackDownloadVersion; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private AcknowledgementService acknowledgementService; + + @Autowired + private Utility utility; + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/ack/download/pdf/event/{eventId}/language/{languageCode}") + public ResponseEntity getAcknowledgement(@PathVariable("eventId") String eventId, + @PathVariable("languageCode") String languageCode, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) throws ResidentServiceCheckedException, IOException { + logger.debug("AcknowledgementController::getAcknowledgement()::entry"); + InputStreamResource resource = null; + RequestType requestType; + try { + requestValidator.validateEventIdLanguageCode(eventId, languageCode); + } catch (ResidentServiceException | InvalidInputException e) { + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.HTTP_STATUS_CODE, HttpStatus.BAD_REQUEST, ResidentConstants.REQ_RES_ID, + ackDownloadId)); + } + try { + logger.debug("AcknowledgementController::get acknowledgement download url"); + Tuple2 tupleResponse = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, timeZoneOffset, locale); + resource = new InputStreamResource(new ByteArrayInputStream(tupleResponse.getT1())); + auditUtil.setAuditRequestDto(AuditEnum.GET_ACKNOWLEDGEMENT_DOWNLOAD_URL_SUCCESS); + requestType = tupleResponse.getT2(); + logger.debug("AcknowledgementController::getAcknowledgement()::exit"); + } catch(ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_ACKNOWLEDGEMENT_DOWNLOAD_URL_FAILURE); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.HTTP_STATUS_CODE, HttpStatus.BAD_REQUEST, ResidentConstants.REQ_RES_ID, + ackDownloadId)); + } + return ResponseEntity.ok().contentType(MediaType.APPLICATION_PDF) + .header("Content-Disposition", "attachment; filename=\"" + + utility.getFileNameAsPerFeatureName(eventId, requestType, timeZoneOffset, locale) + ".pdf\"") + .body(resource); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/AuthTransactionCallbackController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/AuthTransactionCallbackController.java new file mode 100644 index 00000000000..52871300f43 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/AuthTransactionCallbackController.java @@ -0,0 +1,85 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.annotation.PreAuthenticateContentAndVerifyIntent; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.AuthTransactionCallBackService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@RestController +@Tag(name="AuthTransactionCallbackController", description="AuthTransactionCallbackController") +public class AuthTransactionCallbackController { + + private static Logger logger = LoggerConfiguration.logConfig(AuthTransactionCallbackController.class); + + @Autowired + SubscriptionClient subscribe; + + @Autowired + private AuthTransactionCallBackService authTransactionCallBackService; + + @Autowired + private AuditUtil auditUtil; + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/callback/authTransaction", consumes = "application/json") + @Operation(summary = "AuthTransactionCallbackController", description = "AuthTransactionCallbackController", + tags = {"AuthTransactionCallbackController"}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) + + @PreAuthenticateContentAndVerifyIntent(secret = "${resident.websub.authTransaction-status.secret}", callback = "${resident.websub.callback.authTransaction-status.relative.url}", topic = "${resident.websub.authTransaction-status.topic}") + public void authTransactionCallback(@RequestBody Map eventModel) + throws ApisResourceAccessException, NoSuchAlgorithmException { + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "AuthTransactionCallbackController :: authTransactionCallback() :: entry"); + authTransactionCallBackService.updateAuthTransactionCallBackService(eventModel); + auditUtil.setAuditRequestDto(AuditEnum.AUTH_TYPE_CALL_BACK_SUCCESS); + logger.debug("AuthTransactionCallbackController::authTransactionCallback()::exit"); + } catch (ResidentServiceCheckedException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode() + + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + auditUtil.setAuditRequestDto(AuditEnum.AUTH_TYPE_CALL_BACK_FAILURE); + throw new ResidentServiceException(ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage(), e); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/DocumentController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/DocumentController.java new file mode 100644 index 00000000000..383e0eec2b1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/DocumentController.java @@ -0,0 +1,253 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.IOException; +import java.util.List; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.dto.DocumentDTO; +import io.mosip.resident.dto.DocumentRequestDTO; +import io.mosip.resident.dto.DocumentResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.DocumentValidator; + +/** + * The above class is a controller class which is used to upload documents and + * fetch documents by transaction id + * + * @author Manoj SP + */ +@RestController +public class DocumentController { + + private static final Logger logger = LoggerConfiguration.logConfig(DocumentController.class); + + @Autowired + private DocumentValidator validator; + + @Autowired + private DocumentService service; + + @Autowired + private AuditUtil audit; + + @Value("${resident.document.upload.id}") + private String residentUploadDocumentId; + + @Value("${mosip.resident.request.response.version}") + private String residentDocumentResponseVersion; + + @Value("${resident.document.get.id}") + private String residentGetDocumentId; + + @Value("${resident.document.get.version}") + private String residentGetDocumentVersion; + + @Value("${resident.document.list.id}") + private String residentDocumentListId; + + @Value("${resident.document.list.version}") + private String residentDocumentListVersion; + + @Value("${resident.document.delete.id}") + private String residentDeleteId; + + @Value("${resident.document.delete.version}") + private String residentDeleteVersion; + + /** + * This function uploads a document to a transaction. + * + * @param transactionId String + * @param file The file to be uploaded + * @return ResponseWrapper + */ + @Timed(value="api.response.time",description="API Response Time", percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(path = "/documents/{transaction-id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseWrapper uploadDocuments(@PathVariable("transaction-id") String transactionId, + @RequestPart(value = "file", required = true) MultipartFile file, + @RequestParam("docCatCode") String docCatCode, + @RequestParam("docTypCode") String docTypCode, + @RequestParam("langCode") String langCode, + @RequestParam("referenceId") String referenceId) throws IOException { + logger.debug("DocumentController::uploadDocuments()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper.setId(residentUploadDocumentId); + responseWrapper.setVersion(residentDocumentResponseVersion); + validator.validateRequest(transactionId,docCatCode,docTypCode,langCode); + validator.validateFileName(file); + validator.scanForViruses(file); + DocumentRequestDTO docRequest = new DocumentRequestDTO(); + docRequest.setDocCatCode(docCatCode.toLowerCase()); + docRequest.setDocTypCode(docTypCode); + docRequest.setLangCode(langCode); + docRequest.setReferenceId(referenceId); + logger.debug(String.format("DocumentController::Requesting upload document api for transaction id: %s", transactionId)); + DocumentResponseDTO uploadDocumentResponse = service.uploadDocument(transactionId, file, docRequest); + responseWrapper.setResponse(uploadDocumentResponse); + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.UPLOAD_DOCUMENT_SUCCESS, transactionId)); + logger.debug("DocumentController::uploadDocuments()::exit"); + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.UPLOAD_DOCUMENT_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } catch (InvalidInputException | ResidentServiceException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.UPLOAD_DOCUMENT_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } + return responseWrapper; + } + + /** + * It fetches all documents metadata for a given transaction id + * + * @param transactionId The transaction ID of the document + * @return ResponseWrapper> + */ + + @Timed(value="api.response.time",description="API Response Time", percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/documents/{transaction-id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseWrapper> getDocumentsByTransactionId( + @PathVariable("transaction-id") String transactionId) { + logger.debug("DocumentController::getDocumentsByTransactionId()::entry"); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper.setId(residentDocumentListId); + responseWrapper.setVersion(residentDocumentListVersion); + validator.validateTransactionIdForDocument(transactionId); + logger.debug(String.format("DocumentController::Requesting get documents api for transaction id: %s", transactionId)); + List documentResponse = service.fetchAllDocumentsMetadata(transactionId); + responseWrapper.setResponse(documentResponse); + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENTS_METADATA_SUCCESS, transactionId)); + logger.debug("DocumentController::getDocumentsByTransactionId()::exit"); + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENTS_METADATA_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } catch (InvalidInputException | ResidentServiceException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENTS_METADATA_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } + return responseWrapper; + } + + /** + * It fetches document for a given document id + * + * @param transactionId The transaction ID of the document should be passed as Request Param + * @param documentId The document ID of the document should be passed as Path Variable + * @return ResponseWrapper + */ + @Timed(value="api.response.time",description="API Response Time", percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/document/{document-id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseWrapper getDocumentByDocumentId( + @RequestParam("transactionId") String transactionId, + @PathVariable("document-id") String documentId) { + logger.debug("DocumentController::getDocumentByDocumentId()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper.setId(residentGetDocumentId); + responseWrapper.setVersion(residentGetDocumentVersion); + validator.validateDocumentIdAndTransactionId(documentId, transactionId); + logger.debug("DocumentController::Requesting get document by doc id"); + DocumentDTO documentResponse = service.fetchDocumentByDocId(transactionId, documentId); + responseWrapper.setResponse(documentResponse); + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENT_BY_DOC_ID_SUCCESS, transactionId)); + logger.debug("DocumentController::getDocumentByDocumentId()::exit"); + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENT_BY_DOC_ID_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } catch (InvalidInputException | ResidentServiceException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.GET_DOCUMENT_BY_DOC_ID_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } + return responseWrapper; + } + + /** + * It deletes a document for a given transaction id and document id + * + * @param transactionId The transaction ID of the document + * @param documentId The document ID of the document + * @return ResponseWrapper + */ + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @DeleteMapping(path = "/documents/{document-id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseWrapper deleteDocument( + @RequestParam("transactionId") String transactionId, + @PathVariable("document-id") String documentId) { + logger.debug("DocumentController::deleteDocument()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper.setId(residentDeleteId); + responseWrapper.setVersion(residentDeleteVersion); + validator.validateDocumentIdAndTransactionId(documentId, transactionId); + logger.debug("DocumentController::Requesting delete document api by doc id"); + ResponseDTO documentResponse = service.deleteDocument(transactionId, documentId); + responseWrapper.setResponse(documentResponse); + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.DELETE_DOCUMENT_SUCCESS, transactionId)); + logger.debug("DocumentController::deleteDocument()::exit"); + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.DELETE_DOCUMENT_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } catch (InvalidInputException | ResidentServiceException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.DELETE_DOCUMENT_FAILED, transactionId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } + return responseWrapper; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/DownLoadMasterDataController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/DownLoadMasterDataController.java new file mode 100644 index 00000000000..78e62bc2378 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/DownLoadMasterDataController.java @@ -0,0 +1,184 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.Objects; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.DownLoadMasterDataService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * + * @author M1063027 Rama Devi + * + */ +@RestController +@Tag(name = "downLoad-masterdata-controller", description = "downLoad Masterdata Controller") +public class DownLoadMasterDataController { + + private static String DOWNLOADABLE_REGCEN_FILENAME = ""; + private static String DOWNLOADABLE_SUPPORTING_FILENAME = ""; + + @Autowired + private DownLoadMasterDataService downLoadMasterDataService; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private RequestValidator validator; + + @Autowired + private Utility utility; + + @Autowired + private Environment environment; + + private static final Logger logger = LoggerConfiguration.logConfig(DownLoadMasterDataController.class); + + /** + * download registration centers based on language code and selected names of + * registration centers + * + * @param langCode + * @param hierarchyLevel + * @param name + * @return + * @throws ResidentServiceCheckedException + */ + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/download/registration-centers-list") + public ResponseEntity downloadRegistrationCentersByHierarchyLevel(@RequestParam(name="langcode") String langCode, + @RequestParam(name="hierarchylevel") Short hierarchyLevel, @RequestParam("name") String name, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataController::downloadRegistrationCentersByHierarchyLevel()::entry"); + DOWNLOADABLE_REGCEN_FILENAME = "regcenter-"; + DOWNLOADABLE_REGCEN_FILENAME = DOWNLOADABLE_REGCEN_FILENAME + getCurrentDateAndTime(); + InputStreamResource resource = null; + try { + validator.validateLanguageCode(langCode); + validator.validateName(name); + InputStream pdfInputStream = downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(langCode, + hierarchyLevel, name); + resource = new InputStreamResource(pdfInputStream); + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_REGISTRATION_CENTER_SUCCESS); + logger.debug("downLoad file name::" + DOWNLOADABLE_REGCEN_FILENAME); + } catch (ResidentServiceException | InvalidInputException | ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_REGISTRATION_CENTER_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.DOWNLOAD_REG_CENTER_ID))); + throw e; + } + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", + "attachment; filename=\"" + utility.getFileName(null, + Objects.requireNonNull(this.environment.getProperty( + ResidentConstants.DOWNLOAD_REGISTRATION_CENTRE_FILE_NAME_CONVENTION_PROPERTY)), + timeZoneOffset, locale) + ".pdf\"") + .body(resource); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/download/nearestRegistrationcenters") + public ResponseEntity downloadNearestRegistrationcenters(@RequestParam(name="langcode") String langCode, + @RequestParam(name="longitude") double longitude, @RequestParam(name="latitude") double latitude, + @RequestParam(name="proximitydistance") int proximityDistance, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataController::downloadNearestRegistrationcenters()::entry"); + DOWNLOADABLE_REGCEN_FILENAME = "regcenter-"; + DOWNLOADABLE_REGCEN_FILENAME = DOWNLOADABLE_REGCEN_FILENAME + getCurrentDateAndTime(); + InputStreamResource resource = null; + try { + validator.validateLanguageCode(langCode); + InputStream pdfInputStream = downLoadMasterDataService.getNearestRegistrationcenters(langCode, longitude, + latitude, proximityDistance); + resource = new InputStreamResource(pdfInputStream); + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_REGISTRATION_CENTER_NEAREST_SUCCESS); + logger.debug("downLoad file name::" + DOWNLOADABLE_REGCEN_FILENAME); + } catch (ResidentServiceException | InvalidInputException | ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_REGISTRATION_CENTER_NEAREST_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.DOWNLOAD_NEAREST_REG_CENTER_ID))); + throw e; + } + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + utility.getFileName(null, + Objects.requireNonNull(this.environment.getProperty( + ResidentConstants.DOWNLOAD_NEAREST_REGISTRATION_CENTRE_FILE_NAME_CONVENTION_PROPERTY)), + timeZoneOffset, locale) + ".pdf\"") + .body(resource); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/download/supporting-documents", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public ResponseEntity downloadSupportingDocsByLanguage(@RequestParam(name = "langcode") String langCode, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataController::downloadSupportingDocsByLanguage()::entry"); + DOWNLOADABLE_SUPPORTING_FILENAME = "supportingDocs-"; + DOWNLOADABLE_SUPPORTING_FILENAME = DOWNLOADABLE_SUPPORTING_FILENAME + getCurrentDateAndTime(); + InputStreamResource resource = null; + try { + validator.validateLanguageCode(langCode); + InputStream pdfInputStream = downLoadMasterDataService.downloadSupportingDocsByLanguage(langCode); + resource = new InputStreamResource(pdfInputStream); + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_SUPPORTING_DOCS_SUCCESS); + logger.debug("downLoad file name::" + DOWNLOADABLE_SUPPORTING_FILENAME); + } catch (ResidentServiceException | InvalidInputException | ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_SUPPORTING_DOCS_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.DOWNLOAD_SUPPORTING_DOCS_ID))); + throw e; + } + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", + "attachment; filename=\"" + utility.getFileName(null, + Objects.requireNonNull(this.environment.getProperty( + ResidentConstants.DOWNLOAD_SUPPORTING_DOCUMENT_FILE_NAME_CONVENTION_PROPERTY)), + timeZoneOffset, locale) + ".pdf\"") + .body(resource); + } + /** + * this method return the current date and time + * + * @return + */ + private String getCurrentDateAndTime() { + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy-HH:mm:ss"); + LocalDateTime now = DateUtils.getUTCCurrentDateTime(); + return dtf.format(now); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/DownloadCardController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/DownloadCardController.java new file mode 100644 index 00000000000..1e69b9d8dc0 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/DownloadCardController.java @@ -0,0 +1,208 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.CheckStatusResponseDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidDownloadCardResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.CardNotReadyException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.DownloadCardService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to download card using Aid/vid/UIN. + */ + +@RestController +@Tag(name = "DownloadCardController", description = "Download-Card-Controller") +public class DownloadCardController { + + @Autowired + AuditUtil auditUtil; + + @Autowired + RequestValidator requestValidator; + + @Autowired + DownloadCardService downloadCardService; + + @Autowired + private Utility utility; + + @Autowired + private Environment environment; + + private static final Logger logger = LoggerConfiguration.logConfig(DownloadCardController.class); + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/download-card") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Card successfully downloaded", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResponseWrapper.class)))), + @ApiResponse(responseCode = "400", description = "Download card failed", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity downloadCard( + @Validated @RequestBody MainRequestDTO downloadCardRequestDTOMainRequestDTO, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, OtpValidationFailedException { + logger.debug("DownloadCardController::downloadCard()::entry"); + InputStreamResource resource = null; + Tuple2 tupleResponse = null; + try { + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + tupleResponse = downloadCardService.getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + resource = new InputStreamResource(new ByteArrayInputStream(tupleResponse.getT1())); + if (tupleResponse.getT1().length == 0) { + throw new CardNotReadyException(); + } + } catch (ResidentServiceException | InvalidInputException | CardNotReadyException | OtpValidationFailedException e) { + auditUtil.setAuditRequestDto(AuditEnum.RID_DIGITAL_CARD_REQ_FAILURE); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + this.environment.getProperty(ResidentConstants.DOWNLOAD_UIN_CARD_ID))); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.RID_DIGITAL_CARD_REQ_SUCCESS); + logger.debug("DownloadCardController::downloadCard()::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", + "attachment; filename=\"" + utility.getFileNameForId( + downloadCardRequestDTOMainRequestDTO.getRequest().getIndividualId(), + Objects.requireNonNull(this.environment + .getProperty(ResidentConstants.DOWNLOAD_CARD_NAMING_CONVENTION_PROPERTY)), + timeZoneOffset, locale) + ".pdf\"") + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()).body(resource); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getPostPersonalizedCard()" + ")") + @PostMapping("/download/personalized-card") + public ResponseEntity downloadPersonalizedCard( + @Validated @RequestBody MainRequestDTO downloadPersonalizedCardMainRequestDTO, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException { + logger.debug("DownloadCardController::downloadPersonalizedCard()::entry"); + try { + requestValidator.validateDownloadPersonalizedCard(downloadPersonalizedCardMainRequestDTO); + } catch (InvalidInputException e) { + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_PERSONALIZED_CARD_FAILURE); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.MOSIP_RESIDENT_DOWNLOAD_PERSONALIZED_CARD_ID))); + throw e; + } + Tuple2 tupleResponse = downloadCardService.downloadPersonalizedCard(downloadPersonalizedCardMainRequestDTO, timeZoneOffset, locale); + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(tupleResponse.getT1())); + if(tupleResponse.getT1().length==0){ + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + auditUtil.setAuditRequestDto(AuditEnum.DOWNLOAD_PERSONALIZED_CARD_SUCCESS); + logger.debug("DownloadCardController::downloadPersonalizedCard()::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + + utility.getFileName(tupleResponse.getT2(), + Objects.requireNonNull(this.environment.getProperty( + ResidentConstants.DOWNLOAD_PERSONALIZED_CARD_NAMING_CONVENTION_PROPERTY)), timeZoneOffset, locale) + + ".pdf\"") + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(resource); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/request-card/vid/{VID}") + public ResponseEntity requestVidCard(@PathVariable("VID") String vid, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) throws BaseCheckedException { + logger.debug("DownloadCardController::requestVidCard()::entry"); + Tuple2, String> tupleResponse = null; + try { + requestValidator.validateDownloadCardVid(vid); + tupleResponse = downloadCardService.getVidCardEventId(vid, timeZoneOffset, locale); + } catch (ResidentServiceException | InvalidInputException | ResidentServiceCheckedException | ApisResourceAccessException e) { + auditUtil.setAuditRequestDto(AuditEnum.RID_DIGITAL_CARD_REQ_FAILURE); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.VID_DOWNLOAD_CARD_ID))); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.RID_DIGITAL_CARD_REQ_SUCCESS); + logger.debug("DownloadCardController::requestVidCard()::exit"); + return ResponseEntity.ok().header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(tupleResponse.getT1()); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/aid-stage/{aid}") + public ResponseEntity getStatus(@PathVariable("aid") String aid) throws BaseCheckedException, IOException { + logger.debug("DownloadCardController::getStatus()::entry"); + ResponseWrapper responseWrapper = null; + try { + requestValidator.validateAidStatusIndividualId(aid); + responseWrapper = downloadCardService.getIndividualIdStatus(aid); + } catch (ResidentServiceException | InvalidInputException e) { + auditUtil.setAuditRequestDto(AuditEnum.AID_STAGE_FAILURE); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.CHECK_STATUS_INDIVIDUAL_ID))); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.AID_STAGE_SUCCESS); + logger.debug("DownloadCardController::getStatus()::exit"); + return ResponseEntity.ok() + .body(responseWrapper); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/GrievanceController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/GrievanceController.java new file mode 100644 index 00000000000..a023cf7acc5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/GrievanceController.java @@ -0,0 +1,76 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.IOException; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.GrievanceService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to generate ticket of grievance. + */ + +@RestController +@Tag(name = "GrievanceController", description = "Grievance-Controller") +public class GrievanceController { + + @Autowired + AuditUtil auditUtil; + + @Autowired + RequestValidator requestValidator; + + @Autowired + GrievanceService grievanceService; + + @Autowired + private Environment environment; + + private static final Logger logger = LoggerConfiguration.logConfig(GrievanceController.class); + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/grievance/ticket") + public ResponseWrapper grievanceTicket( + @Validated @RequestBody MainRequestDTO grievanceRequestDTOMainRequestDTO) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("GrievanceController::grievanceTicket()::entry"); + ResponseWrapper response = null; + try { + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + response = grievanceService.getGrievanceTicket(grievanceRequestDTOMainRequestDTO); + } catch (ResidentServiceException | InvalidInputException | ResidentServiceCheckedException | ApisResourceAccessException e) { + auditUtil.setAuditRequestDto(AuditEnum.GRIEVANCE_TICKET_REQUEST_FAILED); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID))); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GRIEVANCE_TICKET_REQUEST_SUCCESS); + logger.debug("GrievanceController::grievanceTicket()::exit"); + return response; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/IdAuthController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/IdAuthController.java new file mode 100644 index 00000000000..1456e4ede43 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/IdAuthController.java @@ -0,0 +1,105 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.IdAuthRequestDto; +import io.mosip.resident.dto.IdAuthResponseDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ValidateOtpResponseDto; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +/** + * Resident IdAuth controller class. + * + * @author Ritik Jain + */ +@RestController +@Tag(name = "id-auth-controller", description = "Id Auth Controller") +public class IdAuthController { + + @Autowired + private IdAuthService idAuthService; + + @Autowired + private AuditUtil auditUtil; + + @Value("${mosip.resident.identity.auth.internal.id}") + private String validateOtpId; + + private static final Logger logger = LoggerConfiguration.logConfig(IdAuthController.class); + + /** + * Validate OTP + * + * @param requestWrapper + * @return ResponseWrapper object + * @throws OtpValidationFailedException + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/validate-otp") + @Operation(summary = "validateOtp", description = "validateOtp", tags = { "id-auth-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity validateOtp(@RequestBody RequestWrapper requestWrapper) + throws OtpValidationFailedException, ResidentServiceCheckedException { + logger.debug("IdAuthController::validateOtp()::entry"); + Tuple2 tupleResponse = null; + try { + tupleResponse = idAuthService.validateOtpV1(requestWrapper.getRequest().getTransactionId(), + requestWrapper.getRequest().getIndividualId(), requestWrapper.getRequest().getOtp()); + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.VALIDATE_OTP_SUCCESS, requestWrapper.getRequest().getTransactionId(), + "OTP Validate Request Success")); + } catch (OtpValidationFailedException e) { + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.VALIDATE_OTP_FAILURE, + requestWrapper.getRequest().getTransactionId(), "OTP Validation Failed")); + throw new OtpValidationFailedException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.HTTP_STATUS_CODE, HttpStatus.OK, ResidentConstants.REQ_RES_ID, + validateOtpId, ResidentConstants.EVENT_ID, + e.getMetadata().get(ResidentConstants.EVENT_ID))); + } + ResponseWrapper responseWrapper = new ResponseWrapper(); + ValidateOtpResponseDto validateOtpResponseDto = new ValidateOtpResponseDto(); + validateOtpResponseDto.setAuthStatus(tupleResponse.getT1()); + validateOtpResponseDto.setTransactionId(requestWrapper.getRequest().getTransactionId()); + validateOtpResponseDto.setStatus(ResidentConstants.SUCCESS); + responseWrapper.setResponse(validateOtpResponseDto); + logger.debug("IdAuthController::validateOtp()::exit"); + return ResponseEntity.ok() + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(responseWrapper); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/IdentityController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/IdentityController.java new file mode 100644 index 00000000000..6288144baf8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/IdentityController.java @@ -0,0 +1,105 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; +import static io.mosip.resident.constant.ResidentConstants.IDENTITY; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@RestController +@RequestMapping("/identity") +@Tag(name = "identity-controller", description = "IdentityController Controller") +public class IdentityController { + + /** The Constant logger. */ + private static final Logger logger = LoggerConfiguration.logConfig(IdentityController.class); + + /** The audit util. */ + @Autowired + private AuditUtil auditUtil; + + @Autowired + private IdentityService idServiceImpl; + + @Autowired + private RequestValidator validator; + + @Value("${resident.identity.info.id}") + private String residentIdentityInfoId; + + @Value("${resident.identity.info.version}") + private String residentIdentityInfoVersion; + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getGetinputattributevalues()" + + ")") + @GetMapping("/info/type/{schemaType}") + @Operation(summary = "getInputAttributeValues", description = "Get the Resident-UI Schema", tags = { + "identity-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getInputAttributeValues(@PathVariable("schemaType") String schemaType) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("IdentityController::getInputAttributeValues()::entry"); + try { + validator.validateSchemaType(schemaType); + } catch (InvalidInputException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_INPUT_ATTRIBUTES_EXCEPTION); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.REQ_RES_ID, residentIdentityInfoId)); + } + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + String id = getIdFromUser(); + Map propertiesResponse = idServiceImpl.getIdentityAttributes(id, schemaType, List.of()); + propertiesResponse.remove(IDENTITY); + auditUtil.setAuditRequestDto(AuditEnum.GET_INPUT_ATTRIBUTES_SUCCESS); + logger.debug("IdentityController::getInputAttributeValues()::exit"); + responseWrapper.setResponse(propertiesResponse); + responseWrapper.setId(residentIdentityInfoId); + responseWrapper.setVersion(residentIdentityInfoVersion); + + return responseWrapper; + } + + private String getIdFromUser() throws ApisResourceAccessException { + return idServiceImpl.getResidentIndvidualIdFromSession(); + } + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/OrderCardController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/OrderCardController.java new file mode 100644 index 00000000000..49198b4e8a9 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/OrderCardController.java @@ -0,0 +1,144 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.net.URI; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.OrderCardService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * Order Card Controller class. + * + * @author Ritik Jain + */ +@RestController +@Tag(name = "order-card-controller", description = "Order Card Controller") +public class OrderCardController { + + @Autowired + private OrderCardService orderCardService; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private Environment env; + + private static final Logger logger = LoggerConfiguration.logConfig(OrderCardController.class); + + /** + * Send a physical card. + * + * @param requestWrapper + * @return responseWrapper object + * @throws ResidentServiceCheckedException + * @throws ApisResourceAccessException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getPostSendPhysicalCard()" + ")") + @PostMapping(value = "/sendCard") + @Operation(summary = "sendPhysicalCard", description = "sendPhysicalCard", tags = { "order-card-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper sendPhysicalCard( + @RequestBody RequestWrapper requestWrapper) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("OrderCardController::sendPhysicalCard()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper.setResponse(orderCardService.sendPhysicalCard(requestWrapper.getRequest())); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.SEND_PHYSICAL_CARD_EXCEPTION); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, env.getProperty(ResidentConstants.SEND_CARD_ID))); + } + auditUtil.setAuditRequestDto(AuditEnum.SEND_PHYSICAL_CARD_SUCCESS); + logger.debug("OrderCardController::sendPhysicalCard()::exit"); + return responseWrapper; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetOrderRedirect()" + ")") + @GetMapping("/physical-card/order") + @Operation(summary = "get", description = "Get redirect-url", tags = { "order-card-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity physicalCardOrder(@RequestParam(name = "partnerId") String partnerId , + @RequestParam(name = "redirectUri") String redirectUri ) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("OrderCardController::getphysicalCardOrder()::entry"); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + String redirectURL = orderCardService.getRedirectUrl(partnerId,individualId); + logger.debug("OrderCardController::getphysicalCardOrder()::exit"); + return ResponseEntity.status(HttpStatus.FOUND).location(URI.create(redirectURL)).build(); + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetOrderRedirect()" + ")") + @GetMapping("/physical-card/order-redirect") + @Operation(summary = "get", description = "Get redirect-url", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity physicalCardOrderRedirect(@RequestParam(name = "redirectUrl",required = false) String redirectUrl, + @RequestParam(name = "paymentTransactionId",required = false) String paymentTransactionId, + @RequestParam(name = "eventId",required = false) String eventId, + @RequestParam(name = "residentFullAddress",required = false) String residentFullAddress, + @RequestParam(name = "error_code",required = false) String errorCode, + @RequestParam(name = "error_message",required = false) String errorMessage) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("OrderCardController::physicalCardOrderRedirect()::entry"); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + String response = orderCardService.physicalCardOrder(redirectUrl, paymentTransactionId, eventId, + residentFullAddress,individualId,errorCode,errorMessage); + logger.debug("OrderCardController::physicalCardOrderRedirect()::exit"); + return ResponseEntity.status(HttpStatus.FOUND).location(URI.create(response)).build(); + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/PinStatusController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/PinStatusController.java new file mode 100644 index 00000000000..18ac483380b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/PinStatusController.java @@ -0,0 +1,91 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.PinUnpinStatusService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; + +/** + * This class is used to pin or unpin status based on event id. + * @Author Kamesh Shekhar Prasad + */ +@RestController +public class PinStatusController { + + private static final Logger logger = LoggerConfiguration.logConfig(PinStatusController.class); + @Autowired + private AuditUtil audit; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private PinUnpinStatusService pinUnpinStatusService; + + @Autowired + private Environment env; + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getPostPinStatus()" + + ")") + @PostMapping(path = "/pinned/{eventId}") + public ResponseWrapper pinStatus(@PathVariable("eventId") String eventId) + throws ResidentServiceCheckedException { + logger.debug("PinStatusController::pinStatus()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + requestValidator.validateEventId(eventId); + response = pinUnpinStatusService.pinStatus(eventId, true); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.PIN_STATUS_SUCCESS, eventId)); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.PIN_STATUS_FAILURE, eventId)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, env.getProperty(ResidentConstants.PINNED_EVENTID_ID))); + throw e; + } + logger.debug("PinStatusController::pinStatus()::exit"); + return response; + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getPostUnPinStatus()" + + ")") + @PostMapping(path = "/unpinned/{eventId}") + public ResponseWrapper unPinStatus(@PathVariable("eventId") String eventId) + throws ResidentServiceCheckedException { + logger.debug("PinStatusController::unPinStatus()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + requestValidator.validateEventId(eventId); + response = pinUnpinStatusService.pinStatus(eventId, false); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.UN_PIN_STATUS_SUCCESS, eventId)); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.UN_PIN_STATUS_FAILURE, eventId)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, env.getProperty(ResidentConstants.UNPINNED_EVENTID_ID))); + throw e; + } + logger.debug("PinStatusController::unPinStatus()::exit"); + return response; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyAuditController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyAuditController.java new file mode 100644 index 00000000000..ca9863e4371 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyAuditController.java @@ -0,0 +1,132 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.security.NoSuchAlgorithmException; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.AuditRequestDTO; +import io.mosip.resident.dto.AuthenticatedAuditRequestDto; +import io.mosip.resident.dto.UnauthenticatedAuditRequestDto; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +/** + * Audit log proxy. + * + * @author Loganathan.S + */ +@RestController +@Tag(name = "proxy-audit-controller", description = "Proxy Audit Controller") +public class ProxyAuditController { + + /** The audit util. */ + @Autowired + private AuditUtil auditUtil; + + @Autowired + private Utility utility; + + /** + * Auth audit log. + * + * @param requestDto the authenticated audit request dto + * @return the response entity + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/auth-proxy/audit/log") + @Operation(summary = "authAuditLog", description = "auth audit log", tags = { "proxy-audit-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity authAuditLog(@RequestBody AuthenticatedAuditRequestDto requestDto, HttpServletRequest req) { + AuditRequestDTO auditRequestDto=new AuditRequestDTO(); + auditRequestDto.setEventId(requestDto.getAuditEventId()); + auditRequestDto.setEventName(requestDto.getAuditEventName()); + auditRequestDto.setEventType(requestDto.getAuditEventType()); + auditRequestDto.setActionTimeStamp(requestDto.getActionTimeStamp()); + auditRequestDto.setHostName(req.getRemoteHost()); + auditRequestDto.setHostIp(utility.getClientIp(req)); + auditRequestDto.setApplicationId(requestDto.getApplicationId()); + auditRequestDto.setApplicationName(requestDto.getApplicationName()); + auditRequestDto.setSessionUserId(requestDto.getSessionUserId()); + auditRequestDto.setSessionUserName(requestDto.getSessionUserName()); + Tuple2 refIdHashAndType = auditUtil.getRefIdHashAndType(); + auditRequestDto.setId(refIdHashAndType.getT1()); + auditRequestDto.setIdType(refIdHashAndType.getT2()); + auditRequestDto.setCreatedBy(requestDto.getCreatedBy()); + auditRequestDto.setModuleName(requestDto.getModuleName()); + auditRequestDto.setModuleId(requestDto.getModuleId()); + auditRequestDto.setDescription(requestDto.getDescription()); + auditUtil.callAuditManager(auditRequestDto); + return ResponseEntity.ok().build(); + } + + /** + * Audit log. + * + * @param requestDto the unauthenticated audit request dto + * @return the response entity + * @throws NoSuchAlgorithmException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/proxy/audit/log") + @Operation(summary = "auditLog", description = "audit log", tags = { "proxy-audit-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity auditLog(@RequestBody UnauthenticatedAuditRequestDto requestDto, HttpServletRequest req) + throws NoSuchAlgorithmException { + AuditRequestDTO auditRequestDto=new AuditRequestDTO(); + auditRequestDto.setEventId(requestDto.getAuditEventId()); + auditRequestDto.setEventName(requestDto.getAuditEventName()); + auditRequestDto.setEventType(requestDto.getAuditEventType()); + auditRequestDto.setActionTimeStamp(requestDto.getActionTimeStamp()); + auditRequestDto.setHostName(req.getRemoteHost()); + auditRequestDto.setHostIp(utility.getClientIp(req)); + auditRequestDto.setApplicationId(requestDto.getApplicationId()); + auditRequestDto.setApplicationName(requestDto.getApplicationName()); + auditRequestDto.setSessionUserId(requestDto.getSessionUserId()); + auditRequestDto.setSessionUserName(requestDto.getSessionUserName()); + if (requestDto.getId() != null && !StringUtils.isEmpty(requestDto.getId())) { + Tuple2 refIdHashAndType = auditUtil.getRefIdHashAndTypeFromIndividualId(requestDto.getId()); + auditRequestDto.setId(refIdHashAndType.getT1()); + auditRequestDto.setIdType(refIdHashAndType.getT2()); + } else { + auditRequestDto.setId(ResidentConstants.NO_ID); + auditRequestDto.setIdType(ResidentConstants.NO_ID_TYPE); + } + auditRequestDto.setCreatedBy(requestDto.getCreatedBy()); + auditRequestDto.setModuleName(requestDto.getModuleName()); + auditRequestDto.setModuleId(requestDto.getModuleId()); + auditRequestDto.setDescription(requestDto.getDescription()); + auditUtil.callAuditManager(auditRequestDto); + return ResponseEntity.ok().build(); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyConfigController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyConfigController.java new file mode 100644 index 00000000000..9dd7b167801 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyConfigController.java @@ -0,0 +1,113 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * The Class ProxyConfigController. + * + * @author Loganathan. S + */ +@RestController +@Tag(name = "proxy-config-controller", description = "Proxy Config Controller") +public class ProxyConfigController { + + /** The Constant logger. */ + private static final Logger logger = LoggerConfiguration.logConfig(ProxyConfigController.class); + + /** The audit util. */ + @Autowired + private AuditUtil auditUtil; + + @Autowired + private ResidentConfigService residentConfigService; + + /** + * Gets the resident properties. + * + * @return the resident properties + * @throws ResidentServiceCheckedException the resident service checked + * exception + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/config/ui-properties") + @Operation(summary = "getResidentUIProperties", description = "Get the Resident-UI properties", tags = { + "proxy-config-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getResidentProperties() throws ResidentServiceCheckedException { + logger.debug("ProxyConfigController::getResidentProperties()::entry"); + ResponseWrapper propertiesResponse = residentConfigService.getUIProperties(); + auditUtil.setAuditRequestDto(AuditEnum.GET_CONFIGURATION_PROPERTIES_SUCCESS); + logger.debug("ProxyConfigController::getResidentProperties()::exit"); + return propertiesResponse; + } + + @GetMapping("/auth-proxy/config/ui-schema/{schemaType}") + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @Operation(summary = "getResidentUISchema", description = "Get the Resident-UI Schema", tags = { + "proxy-config-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public String getResidentUISchema( + @PathVariable String schemaType) throws ResidentServiceCheckedException { + logger.debug("ProxyConfigController::getResidentUISchema()::entry"); + String propertiesResponse; + try { + propertiesResponse = residentConfigService.getUISchema(schemaType); + } catch (ResidentServiceException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_CONFIGURATION_PROPERTIES_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_CONFIGURATION_PROPERTIES_SUCCESS); + logger.debug("ProxyConfigController::getResidentUISchema()::exit"); + return propertiesResponse; + } + + @GetMapping("/auth-proxy/config/identity-mapping") + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @Operation(summary = "getIdentityMapping", description = "Get the identity-mapping", tags = { + "proxy-config-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public String getIdentityMapping() throws ResidentServiceCheckedException { + logger.debug("ProxyConfigController::getIdentityMapping()::entry"); + String propertiesResponse=residentConfigService.getIdentityMapping(); + auditUtil.setAuditRequestDto(AuditEnum.GET_CONFIGURATION_PROPERTIES_SUCCESS); + logger.debug("ProxyConfigController::getIdentityMapping()::exit"); + return propertiesResponse; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyIdRepoController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyIdRepoController.java new file mode 100644 index 00000000000..e0b0dfc65b3 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyIdRepoController.java @@ -0,0 +1,154 @@ +package io.mosip.resident.controller; + +import io.micrometer.core.annotation.Timed; +import io.mosip.idrepository.core.exception.IdRepoAppException; +import io.mosip.kernel.core.exception.ExceptionUtils; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.DraftResidentResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Nullable; +import java.util.List; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; +import static io.mosip.resident.util.AuditEnum.DISCARD_DRAFT_EXCEPTION; +import static io.mosip.resident.util.AuditEnum.DISCARD_DRAFT_SUCCESS; +import static io.mosip.resident.util.AuditEnum.GET_IDENTITY_UPDATE_COUNT_EXCEPTION; +import static io.mosip.resident.util.AuditEnum.GET_IDENTITY_UPDATE_COUNT_SUCCESS; +import static io.mosip.resident.util.AuditEnum.GET_PENDING_DRAFT_FAILURE; +import static io.mosip.resident.util.AuditEnum.GET_PENDING_DRAFT_SUCCESS; + +/** + * @author Manoj SP + * + */ +@RestController +@RequestMapping("/identity") +@Tag(name = "proxy-idrepo-controller", description = "Proxy IdRepo Controller") +public class ProxyIdRepoController { + + @Autowired + private ProxyIdRepoService proxySerivce; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private Environment environment; + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyIdRepoController.class); + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/update-count", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get Remaining update count by Individual Id Request", description = "Get Remaining update count by Individual Id Request", tags = { + "proxy-id-repo-identity-update-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Request authenticated successfully", content = @Content(array = @ArraySchema(schema = @Schema(implementation = IdRepoAppException.class)))), + @ApiResponse(responseCode = "400", description = "No Records Found", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity> getRemainingUpdateCountByIndividualId( + @RequestParam(name = "filter_attribute_list", required = false) @Nullable List filterAttributeList) { + logger.debug("ProxyIdRepoController::getRemainingUpdateCountByIndividualId()::entry"); + try { + ResponseWrapper responseWrapper = proxySerivce + .getRemainingUpdateCountByIndividualId(filterAttributeList); + auditUtil.setAuditRequestDto(GET_IDENTITY_UPDATE_COUNT_SUCCESS); + logger.debug("ProxyIdRepoController::getRemainingUpdateCountByIndividualId()::exit"); + return ResponseEntity.ok(responseWrapper); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(GET_IDENTITY_UPDATE_COUNT_EXCEPTION); + ExceptionUtils.logRootCause(e); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + return ResponseEntity.ok(responseWrapper); + } + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/get-pending-drafts/{langCode}", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get Pending Drafts", description = "Get Pending Drafts", tags = { + "proxy-id-repo-identity-update-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Request authenticated successfully", content = @Content(array = @ArraySchema(schema = @Schema(implementation = IdRepoAppException.class)))), + @ApiResponse(responseCode = "400", description = "No Records Found", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity> getPendingDrafts(@PathVariable String langCode) { + logger.debug("ProxyIdRepoController::getPendingDrafts()::entry"); + try { + ResponseWrapper responseWrapper = proxySerivce + .getPendingDrafts(langCode); + auditUtil.setAuditRequestDto(GET_PENDING_DRAFT_SUCCESS); + requestValidator.validateLanguageCode(langCode); + logger.debug("ProxyIdRepoController::getPendingDrafts()::exit"); + return ResponseEntity.ok(responseWrapper); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(GET_PENDING_DRAFT_FAILURE); + ExceptionUtils.logRootCause(e); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + return ResponseEntity.ok(responseWrapper); + } + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(path = "/discardPendingDraft/{eid}", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Discard pending draft", description = "Discard pending draft", tags = { + "proxy-id-repo-identity-update-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Request authenticated successfully", content = @Content(array = @ArraySchema(schema = @Schema(implementation = IdRepoAppException.class)))), + @ApiResponse(responseCode = "400", description = "No Records Found", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity discardPendingDraft( + @PathVariable String eid) { + logger.debug("ProxyIdRepoController::discardPendingDraft()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setId(environment.getProperty(ResidentConstants.DISCARD_DRAFT_ID)); + responseWrapper.setVersion(environment.getProperty(ResidentConstants.DISCARD_DRAFT_VERSION)); + try { + requestValidator.validateEventId(eid); + auditUtil.setAuditRequestDto(DISCARD_DRAFT_SUCCESS); + logger.debug("ProxyIdRepoController::discardPendingDraft()::exit"); + responseWrapper.setResponse(proxySerivce + .discardDraft(eid)); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(DISCARD_DRAFT_EXCEPTION); + ExceptionUtils.logRootCause(e); + responseWrapper.setErrors(List.of(new ServiceError(e.getErrorCode(), e.getErrorText()))); + } + return ResponseEntity.ok(responseWrapper); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyMasterdataController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyMasterdataController.java new file mode 100644 index 00000000000..6e7b32b0874 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyMasterdataController.java @@ -0,0 +1,594 @@ +package io.mosip.resident.controller; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.OrderEnum; +import io.mosip.resident.dto.LocationImmediateChildrenResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.List; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +/** + * Resident proxy masterdata controller class. + * + * @author Ritik Jain + */ +@RestController +@Tag(name = "proxy-masterdata-controller", description = "Proxy Masterdata Controller") +public class ProxyMasterdataController { + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private Utility utility; + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyMasterdataController.class); + + @Autowired + private Utilities utilities; + + /** + * Get valid documents by language code. + * + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/validdocuments/{langCode}") + @Operation(summary = "getValidDocumentByLangCode", description = "getValidDocumentByLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getValidDocumentByLangCode(@PathVariable("langCode") String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getValidDocumentByLangCode()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = utility.getValidDocumentByLangCode(langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_VALID_DOCUMENT_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_VALID_DOCUMENT_SUCCESS); + logger.debug("ProxyMasterdataController::getValidDocumentByLangCode()::exit"); + return responseWrapper; + } + + /** + * Get location hierarchy levels by language code. + * + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/locationHierarchyLevels/{langcode}") + @Operation(summary = "getLocationHierarchyLevelByLangCode", description = "getLocationHierarchyLevelByLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getLocationHierarchyLevelByLangCode(@PathVariable("langcode") String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getLocationHierarchyLevelByLangCode()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getLocationHierarchyLevelByLangCode(langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_HIERARCHY_LEVEL_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_HIERARCHY_LEVEL_SUCCESS); + logger.debug("ProxyMasterdataController::getLocationHierarchyLevelByLangCode()::exit"); + return responseWrapper; + } + + /** + * Get immediate children by location code and language code. + * + * @param locationCode + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/locations/immediatechildren/{locationcode}/{langcode}") + @Operation(summary = "getImmediateChildrenByLocCodeAndLangCode", description = "getImmediateChildrenByLocCodeAndLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getImmediateChildrenByLocCodeAndLangCode( + @PathVariable("locationcode") String locationCode, @PathVariable("langcode") String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getImmediateChildrenByLocCodeAndLangCode()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode(locationCode, langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_IMMEDIATE_CHILDREN_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_IMMEDIATE_CHILDREN_SUCCESS); + logger.debug("ProxyMasterdataController::getImmediateChildrenByLocCodeAndLangCode()::exit"); + return responseWrapper; + } + + /** + * Get location details by location code and language code. + * + * @param locationCode + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/locations/info/{locationcode}/{langcode}") + @Operation(summary = "getLocationDetailsByLocCodeAndLangCode", description = "getLocationDetailsByLocCodeAndLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getLocationDetailsByLocCodeAndLangCode(@PathVariable("locationcode") String locationCode, + @PathVariable("langcode") String langCode) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getLocationDetailsByLocCodeAndLangCode()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode(locationCode, langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_DETAILS_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_DETAILS_SUCCESS); + logger.debug("ProxyMasterdataController::getLocationDetailsByLocCodeAndLangCode()::exit"); + return responseWrapper; + } + + /** + * Get coordinate specific registration centers + * + * @param langCode + * @param longitude + * @param latitude + * @param proximityDistance + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/getcoordinatespecificregistrationcenters/{langcode}/{longitude}/{latitude}/{proximitydistance}") + @Operation(summary = "getCoordinateSpecificRegistrationCenters", description = "getCoordinateSpecificRegistrationCenters", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getCoordinateSpecificRegistrationCenters(@PathVariable("langcode") String langCode, + @PathVariable("longitude") double longitude, @PathVariable("latitude") double latitude, + @PathVariable("proximitydistance") int proximityDistance) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getCoordinateSpecificRegistrationCenters()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getCoordinateSpecificRegistrationCenters(langCode, + longitude, latitude, proximityDistance); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_COORDINATE_SPECIFIC_REG_CENTERS_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_COORDINATE_SPECIFIC_REG_CENTERS_SUCCESS); + logger.debug("ProxyMasterdataController::getCoordinateSpecificRegistrationCenters()::exit"); + return responseWrapper; + } + + /** + * Get applicant valid document. + * + * @param applicantId + * @param languages + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/applicanttype/{applicantId}/languages") + @Operation(summary = "getApplicantValidDocument", description = "getApplicantValidDocument", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getApplicantValidDocument(@PathVariable("applicantId") String applicantId, + @RequestParam("languages") List languages) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getApplicantValidDocument()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getApplicantValidDocument(applicantId, languages); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_APPLICANT_VALID_DOCUMENT_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_APPLICANT_VALID_DOCUMENT_SUCCESS); + logger.debug("ProxyMasterdataController::getApplicantValidDocument()::exit"); + return responseWrapper; + } + + /** + * Get registration centers by hierarchy level. + * + * @param langCode + * @param hierarchyLevel + * @param name + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @GetMapping("/proxy/masterdata/registrationcenters/{langcode}/{hierarchylevel}/names") + @Operation(summary = "getRegistrationCentersByHierarchyLevel", description = "getRegistrationCentersByHierarchyLevel", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getRegistrationCentersByHierarchyLevel(@PathVariable("langcode") String langCode, + @PathVariable("hierarchylevel") Short hierarchyLevel, @RequestParam("name") List name) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getRegistrationCentersByHierarchyLevel()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getRegistrationCentersByHierarchyLevel(langCode, + hierarchyLevel, name); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTERS_FOR_LOCATION_CODE_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTERS_FOR_LOCATION_CODE_SUCCESS); + logger.debug("ProxyMasterdataController::getRegistrationCentersByHierarchyLevel()::exit"); + return responseWrapper; + } + + /** + * Get registration centers by hierarchy level and text-paginated. + * + * @param langCode + * @param hierarchyLevel + * @param name + * @param pageNumber + * @param pageSize + * @param orderBy + * @param sortBy + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/registrationcenters/page/{langcode}/{hierarchylevel}/{name}") + @Operation(summary = "getRegistrationCenterByHierarchyLevelAndTextPaginated", description = "getRegistrationCenterByHierarchyLevelAndTextPaginated", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getRegistrationCenterByHierarchyLevelAndTextPaginated( + @PathVariable("langcode") String langCode, @PathVariable("hierarchylevel") Short hierarchyLevel, + @PathVariable("name") String name, + @RequestParam(name = "pageNumber", defaultValue = "0") @ApiParam(value = "page no for the requested data", defaultValue = "0") int pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") @ApiParam(value = "page size for the requested data", defaultValue = "10") int pageSize, + @RequestParam(name = "sortBy", defaultValue = "createdDateTime") @ApiParam(value = "sort the requested data based on param value", defaultValue = "createdDateTime") String sortBy, + @RequestParam(name = "orderBy", defaultValue = "desc") @ApiParam(value = "order the requested data based on param", defaultValue = "desc") OrderEnum orderBy) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getRegistrationCenterByHierarchyLevelAndTextPaginated()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(langCode, hierarchyLevel, name, pageNumber, + pageSize, orderBy, sortBy); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTERS_PAGINATED_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTERS_PAGINATED_SUCCESS); + logger.debug("ProxyMasterdataController::getRegistrationCenterByHierarchyLevelAndTextPaginated()::exit"); + return responseWrapper; + } + + /** + * Get registration center working days by registration center ID. + * + * @param registrationCenterID + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/workingdays/{registrationCenterID}/{langCode}") + @Operation(summary = "getRegistrationCenterWorkingDays", description = "getRegistrationCenterWorkingDays", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getRegistrationCenterWorkingDays( + @PathVariable("registrationCenterID") String registrationCenterID, + @PathVariable("langCode") String langCode) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getRegistrationCenterWorkingDays()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getRegistrationCenterWorkingDays(registrationCenterID, langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTER_WORKING_DAYS_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_REG_CENTER_WORKING_DAYS_SUCCESS); + logger.debug("ProxyMasterdataController::getRegistrationCenterWorkingDays()::exit"); + return responseWrapper; + } + + /** + * Get latest ID schema. + * + * @param schemaVersion + * @param domain + * @param type + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/idschema/latest") + @Operation(summary = "getLatestIdSchema", description = "getLatestIdSchema", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getLatestIdSchema( + @RequestParam(name = "schemaVersion", defaultValue = "0", required = false) @ApiParam(value = "schema version", defaultValue = "0") double schemaVersion, + @RequestParam(name = "domain", required = false) @ApiParam(value = "domain of the ui spec") String domain, + @RequestParam(name = "type", required = false) @ApiParam(value = "type of the ui spec. Supported comma separted values") String type) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getLatestIdSchema()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getLatestIdSchema(schemaVersion, domain, type); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_LATEST_ID_SCHEMA_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_LATEST_ID_SCHEMA_SUCCESS); + logger.debug("ProxyMasterdataController::getLatestIdSchema()::exit"); + return responseWrapper; + } + + /** + * Get templates by language code and template type code. + * + * @param langCode + * @param templateTypeCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/auth-proxy/masterdata/templates/{langcode}/{templatetypecode}") + @Operation(summary = "getAllTemplateBylangCodeAndTemplateTypeCode", description = "getAllTemplateBylangCodeAndTemplateTypeCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getAllTemplateBylangCodeAndTemplateTypeCode(@PathVariable("langcode") String langCode, + @PathVariable("templatetypecode") String templateTypeCode) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getAllTemplateBylangCodeAndTemplateTypeCode()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode(langCode, templateTypeCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_TEMPLATES_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_TEMPLATES_SUCCESS); + logger.debug("ProxyMasterdataController::getAllTemplateBylangCodeAndTemplateTypeCode()::exit"); + return responseWrapper; + } + + /** + * Get gender types by language code. + * + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/auth-proxy/masterdata/dynamicfields/{fieldName}/{langCode}") + @Operation(summary = "getDynamicFieldBasedOnLangCodeAndFieldName", description = "Service to fetch dynamic field based on langcode and field name", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getDynamicFieldBasedOnLangCodeAndFieldName(@PathVariable("fieldName") String fieldName, + @PathVariable("langCode") String langCode, + @RequestParam(value = "withValue", defaultValue = "false") boolean withValue) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getDynamicFieldBasedOnLangCodeAndFieldName()::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = utilities.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, langCode, withValue); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME_SUCCESS); + logger.debug("ProxyMasterdataController::getDynamicFieldBasedOnLangCodeAndFieldName()::exit"); + return responseWrapper; + } + + /** + * Get document types by document category code & language code. + * + * @param langCode + * @param documentcategorycode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/documenttypes/{documentcategorycode}/{langcode}") + @Operation(summary = "getDocumentTypesByDocumentCategoryLangCode", description = "getDocumentTypesByDocumentCategoryLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getDocumentTypesByDocumentCategoryAndLangCode(@PathVariable("documentcategorycode") String documentcategorycode,@PathVariable("langcode") String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataController::getDocumentTypesByDocumentCategoryLangCode::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode(documentcategorycode,langCode); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_DOCUMENT_TYPES_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_DOCUMENT_TYPES_SUCCESS); + logger.debug("ProxyMasterdataController::getDocumentTypesByDocumentCategoryLangCode::exit"); + return responseWrapper; + } + + /** + * Get gender code by gender type & language code. + * + * @param langCode + * @param gendertype + * @return ResponseWrapper object + * @throws IOException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/gendercode/{gendertype}/{langcode}") + @Operation(summary = "getGenderCodeByGenderTypeAndLangCode", description = "getGenderCodeByGenderTypeAndLangCode", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getGenderCodeByGenderTypeAndLangCode(@PathVariable("gendertype") String gendertype,@PathVariable("langcode") String langCode) + throws ResidentServiceCheckedException, IOException { + logger.debug("ProxyMasterdataController::getGenderCodeByGenderTypeAndLangCode::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getGenderCodeByGenderTypeAndLangCode(gendertype,langCode); + } catch (ResidentServiceCheckedException | IOException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_GENDER_CODE_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_GENDER_CODE_SUCCESS); + logger.debug("ProxyMasterdataController::getGenderCodeByGenderTypeAndLangCode::exit"); + return responseWrapper; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/locationHierarchyLevels") + @Operation(summary = "Retrieve all location Hierarchy Level details", description = "Retrieve all location Hierarchy Level details", tags = { + "proxy-masterdata-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getLocationHierarchyLevel( + @RequestParam(name = "lastUpdated", required = false) @ApiParam(value = "last updated rows", required = false) String lastUpdated) throws ResidentServiceCheckedException { + logger.debug("ProxyMaster dataController::getLocationHierarchyLevel::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getLocationHierarchyLevels(lastUpdated); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_HIERARCHY_LEVEL_ALL_LANG_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_LOCATION_HIERARCHY_LEVEL_ALL_LANG_SUCCESS); + logger.debug("ProxyMaster dataController::getLocationHierarchyLevel::exit"); + return responseWrapper; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/proxy/masterdata/dynamicfields/{fieldName}") + @ApiOperation(value = "Service to fetch all dynamic field value for all languages") + public ResponseWrapper getAllDynamicFieldByName( + @PathVariable("fieldName") String fieldName) throws ResidentServiceCheckedException { + logger.debug("ProxyMaster dataController::getAllDynamicFieldByName::entry"); + ResponseWrapper responseWrapper; + try { + responseWrapper = proxyMasterdataService.getAllDynamicFieldByName(fieldName); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_ALL_DYNAMIC_FIELD_VALUE_EXCEPTION); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_ALL_DYNAMIC_FIELD_VALUE_SUCCESS); + logger.debug("ProxyMaster dataController::getAllDynamicFieldByName::exit"); + return responseWrapper; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "/auth-proxy/masterdata/locations/immediatechildren/{locationcode}") + public ResponseWrapper getImmediateChildrenByLocCode( + @PathVariable("locationcode") String locationCode, @RequestParam("languageCodes") List languageCodes) throws ResidentServiceCheckedException { + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper + .setResponse(proxyMasterdataService.getImmediateChildrenByLocCode(locationCode, languageCodes)); + return responseWrapper; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyOtpController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyOtpController.java new file mode 100644 index 00000000000..af2006e167b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyOtpController.java @@ -0,0 +1,155 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.IdentityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.authmanager.model.AuthNResponse; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.MainResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyOtpService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +/** + * This class provides different api to perform operation for login + * + * @author Kamesh Shekhar Prasad + * @since 1.0.0 + * + */ +@RestController +@Tag(name = "login-controller", description = "Login Controller") +public class ProxyOtpController { + + private Logger log = LoggerConfiguration.logConfig(ProxyOtpController.class); + + @Autowired + private ProxyOtpService proxyOtpService; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private Environment environment; + + @Autowired + private AuditUtil audit; + + @Autowired + private IdentityService identityService; + + /** + * This Post api use to send otp to the user by email or sms + * + * @param userOtpRequest + * @return AuthNResponse + */ + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/contact-details/send-otp", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "sendOTP", description = "Send Otp to UserId", tags = "login-controller") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + @ResponseStatus(value = HttpStatus.OK) + public ResponseEntity> sendOTP( + @Validated @RequestBody MainRequestDTO userOtpRequest) throws ApisResourceAccessException, ResidentServiceCheckedException { + log.debug("ProxyOtpController::sendOTP()::entry"); + ResponseEntity> responseEntity; + String userid = userOtpRequest.getRequest().getUserId(); + try { + IdentityDTO identityDTO = identityService.getIdentity(identityService.getResidentIndvidualIdFromSession()); + requestValidator.validateProxySendOtpRequest(userOtpRequest, identityDTO); + responseEntity = proxyOtpService.sendOtp(userOtpRequest, identityDTO); + } + catch (InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.SEND_OTP_FAILURE, userid, "Send OTP")); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.RESIDENT_CONTACT_DETAILS_SEND_OTP_ID))); + } catch (ApisResourceAccessException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.SEND_OTP_FAILURE, userid, "Send OTP")); + throw new ApisResourceAccessException(ResidentErrorCode.CLAIM_NOT_AVAILABLE.getErrorCode(), + ResidentErrorCode.CLAIM_NOT_AVAILABLE.getErrorMessage(), e); + } catch (ResidentServiceException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.SEND_OTP_FAILURE, userid, "Send OTP")); + throw e; + } + log.debug("ProxyOtpController::sendOTP()::exit"); + return responseEntity; + } + + + + /** + * This Post api use to validate userid and otp + * + * @param userIdOtpRequest + * @return AuthNResponse + */ + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/contact-details/update-data", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "validateWithUserIdOtp", description = "Validate UserId and Otp", tags = "login-controller") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity> validateWithUserIdOtp( + @Validated @RequestBody MainRequestDTO userIdOtpRequest) { + log.debug("ProxyOtpController::validateWithUserIdOtp()::entry"); + String userId = userIdOtpRequest.getRequest().getUserId(); + try { + requestValidator.validateUpdateDataRequest(userIdOtpRequest); + } catch (InvalidInputException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.OTP_VALIDATION_FAILED, userId, "Validate OTP Failed")); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.REQ_RES_ID, + environment.getProperty(ResidentConstants.RESIDENT_CONTACT_DETAILS_UPDATE_ID))); + } + Tuple2, String> tupleResponse = proxyOtpService.validateWithUserIdOtp(userIdOtpRequest); + log.debug("ProxyOtpController::validateWithUserIdOtp()::exit"); + return ResponseEntity.ok() + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(tupleResponse.getT1()); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyPartnerManagementController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyPartnerManagementController.java new file mode 100644 index 00000000000..2bdf9e5a1d2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ProxyPartnerManagementController.java @@ -0,0 +1,87 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * Resident proxy partner management controller class. + * + * @author Ritik Jain + */ +@RestController +@RequestMapping("/auth-proxy/partners") +@Tag(name = "proxy-partner-management-controller", description = "Proxy Partner Management Controller") +public class ProxyPartnerManagementController { + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private Environment env; + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyPartnerManagementController.class); + + /** + * Get partners by partner type. + * + * @param partnerType + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @RequestMapping(method = RequestMethod.GET) + @Operation(summary = "getPartnersByPartnerType", description = "getPartnersByPartnerType", tags = { + "proxy-partner-management-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getPartnersByPartnerType(@RequestParam(name = "partnerType", required = false) String partnerType) + throws ResidentServiceCheckedException { + logger.debug("ProxyPartnerManagementController::getPartnersByPartnerType()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + responseWrapper = proxyPartnerManagementService.getPartnersByPartnerType(partnerType); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_PARTNERS_BY_PARTNER_TYPE_EXCEPTION); + e.setMetadata( + Map.of(ResidentConstants.REQ_RES_ID, env.getProperty(ResidentConstants.AUTH_PROXY_PARTNERS_ID))); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_PARTNERS_BY_PARTNER_TYPE_SUCCESS); + logger.debug("ProxyPartnerManagementController::getPartnersByPartnerType()::exit"); + return responseWrapper; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentController.java index a6619b638a5..2720d438165 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentController.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentController.java @@ -1,206 +1,766 @@ -package io.mosip.resident.controller; - -import java.io.ByteArrayInputStream; - -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import io.mosip.kernel.core.http.ResponseFilter; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.resident.constant.AuthTypeStatus; -import io.mosip.resident.dto.AuthHistoryRequestDTO; -import io.mosip.resident.dto.AuthHistoryResponseDTO; -import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; -import io.mosip.resident.dto.AuthUnLockRequestDTO; -import io.mosip.resident.dto.EuinRequestDTO; -import io.mosip.resident.dto.RegStatusCheckResponseDTO; -import io.mosip.resident.dto.RequestDTO; -import io.mosip.resident.dto.RequestWrapper; -import io.mosip.resident.dto.ResidentReprintRequestDto; -import io.mosip.resident.dto.ResidentReprintResponseDto; -import io.mosip.resident.dto.ResidentUpdateRequestDto; -import io.mosip.resident.dto.ResidentUpdateResponseDTO; -import io.mosip.resident.dto.ResponseDTO; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.service.ResidentService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.validator.RequestValidator; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; - -@RestController -@Tag(name = "resident-controller", description = "Resident Controller") -public class ResidentController { - - @Autowired - private ResidentService residentService; - - @Autowired - private RequestValidator validator; - - @Autowired - private AuditUtil audit; - - @ResponseFilter - @PostMapping(value = "/rid/check-status") - @Operation(summary = "getRidStatus", description = "getRidStatus", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper getRidStatus( - @Valid @RequestBody RequestWrapper requestDTO) throws ApisResourceAccessException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"get Rid status API")); - validator.validateRequestDTO(requestDTO); - ResponseWrapper response = new ResponseWrapper<>(); - audit.setAuditRequestDto(EventEnum.RID_STATUS); - response.setResponse(residentService.getRidStatus(requestDTO.getRequest())); - audit.setAuditRequestDto(EventEnum.RID_STATUS_SUCCESS); - return response; - } - - @Deprecated - @PostMapping(value = "/req/euin") - @Operation(summary = "reqEuin", description = "reqEuin", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity reqEuin(@Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"request Euin API")); - validator.validateEuinRequest(requestDTO); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_EUIN,requestDTO.getRequest().getTransactionID())); - byte[] pdfbytes = residentService.reqEuin(requestDTO.getRequest()); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_EUIN_SUCCESS,requestDTO.getRequest().getTransactionID())); - InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfbytes)); - - return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) - .header("Content-Disposition", - "attachment; filename=\"" + requestDTO.getRequest().getIndividualId() + ".pdf\"") - .body((Object) resource); - } - - @Deprecated - @ResponseFilter - @PostMapping(value = "/req/print-uin") - @Operation(summary = "reqPrintUin", description = "reqPrintUin", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity reqPrintUin(@Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"request print Uin API")); - validator.validateReprintRequest(requestDTO); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_PRINTUIN,requestDTO.getRequest().getTransactionID())); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentService.reqPrintUin(requestDTO.getRequest())); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_PRINTUIN_SUCCESS,requestDTO.getRequest().getTransactionID())); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - - @ResponseFilter - @PostMapping(value = "/req/auth-lock") - @Operation(summary = "reqAauthLock", description = "reqAauthLock", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper reqAauthLock( - @Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"request auth lock API")); - validator.validateAuthLockOrUnlockRequest(requestDTO, AuthTypeStatus.LOCK); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_LOCK,requestDTO.getRequest().getTransactionID())); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentService.reqAauthTypeStatusUpdate(requestDTO.getRequest(), AuthTypeStatus.LOCK)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_LOCK_SUCCESS,requestDTO.getRequest().getTransactionID())); - return response; - } - - @ResponseFilter - @PostMapping(value = "/req/auth-unlock") - @Operation(summary = "reqAuthUnlock", description = "reqAuthUnlock", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper reqAuthUnlock( - @Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"request auth unlock API")); - validator.validateAuthUnlockRequest(requestDTO, AuthTypeStatus.UNLOCK); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_UNLOCK,requestDTO.getRequest().getTransactionID())); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentService.reqAauthTypeStatusUpdate(requestDTO.getRequest(), AuthTypeStatus.UNLOCK)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_UNLOCK_SUCCESS,requestDTO.getRequest().getTransactionID())); - return response; - } - - @ResponseFilter - @PostMapping(value = "/req/auth-history") - @Operation(summary = "reqAuthHistory", description = "reqAuthHistory", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper reqAuthHistory( - @Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"request auth history")); - validator.validateAuthHistoryRequest(requestDTO); - ResponseWrapper response = new ResponseWrapper<>(); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_HISTORY,requestDTO.getRequest().getTransactionID())); - response.setResponse(residentService.reqAuthHistory(requestDTO.getRequest())); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQ_AUTH_HISTORY_SUCCESS,requestDTO.getRequest().getTransactionID())); - return response; - } - - @ResponseFilter - @PostMapping(value = "/req/update-uin") - @Operation(summary = "updateUin", description = "updateUin", tags = { "resident-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseWrapper updateUin( - @Valid @RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"update Uin API")); - validator.validateUpdateRequest(requestDTO); - ResponseWrapper response = new ResponseWrapper<>(); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.UPDATE_UIN,requestDTO.getRequest().getTransactionID())); - response.setResponse(residentService.reqUinUpdate(requestDTO.getRequest())); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.UPDATE_UIN_SUCCESS,requestDTO.getRequest().getTransactionID())); - return response; - } -} \ No newline at end of file +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; +import static io.mosip.resident.constant.ResidentConstants.RESIDENT_SERVICE_HISTORY_DOWNLOAD_MAX_COUNT; +import static io.mosip.resident.constant.ResidentConstants.RESIDENT_VIEW_HISTORY_DEFAULT_PAGE_SIZE; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.validation.Valid; + +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.util.Utilities; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.core.io.InputStreamResource; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.core.type.TypeReference; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AidStatusResponseDTO; +import io.mosip.resident.dto.AuthHistoryRequestDTO; +import io.mosip.resident.dto.AuthHistoryResponseDTO; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthUnLockRequestDTO; +import io.mosip.resident.dto.BellNotificationDto; +import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.EventStatusResponseDTO; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.RegStatusCheckResponseDTO; +import io.mosip.resident.dto.RequestDTO; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentDemographicUpdateRequestDTO; +import io.mosip.resident.dto.ResidentReprintRequestDto; +import io.mosip.resident.dto.ResidentReprintResponseDto; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.dto.UnreadNotificationDto; +import io.mosip.resident.dto.UserInfoDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.CardNotReadyException; +import io.mosip.resident.exception.EventIdNotPresentException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.InvalidRequestTypeCodeException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.exception.RIDInvalidException; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; + +@RestController +@Tag(name = "resident-controller", description = "Resident Controller") +public class ResidentController { + + @Autowired + private ResidentService residentService; + + @Autowired + private RequestValidator validator; + + @Autowired + private AuditUtil audit; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private Utility utility; + + @Autowired + private Environment environment; + + @Autowired + private Utilities utilities; + + @Value("${resident.authLockStatusUpdateV2.id}") + private String authLockStatusUpdateV2Id; + + @Value("${resident.authLockStatusUpdateV2.version}") + private String authLockStatusUpdateV2Version; + + @Value("${resident.download.card.eventid.id}") + private String downloadCardEventidId; + + @Value("${resident.vid.version.new}") + private String newVersion; + + @Value("${resident.checkstatus.id}") + private String checkStatusId; + + @Value("${resident.service.history.id}") + private String serviceHistoryId; + + @Value("${resident.service.event.id}") + private String serviceEventId; + + @Value("${" + RESIDENT_SERVICE_HISTORY_DOWNLOAD_MAX_COUNT + "}") + private Integer maxEventsServiceHistoryPageSize; + + private static final Logger logger = LoggerConfiguration.logConfig(ResidentController.class); + + @ResponseFilter + @PostMapping(value = "/rid/check-status") + @Operation(summary = "getRidStatus", description = "getRidStatus", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getRidStatus( + @Valid @RequestBody RequestWrapper requestDTO) throws ApisResourceAccessException { + logger.debug("ResidentController::getRidStatus()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + validator.validateRidCheckStatusRequestDTO(requestDTO); + logger.debug("ResidentController::Request for checking RID status"); + response.setResponse(residentService.getRidStatus(requestDTO.getRequest())); + } catch (InvalidInputException | ApisResourceAccessException | ResidentServiceException | RIDInvalidException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.RID_STATUS_FAILURE, e.getMessage())); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, checkStatusId)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.RID_STATUS_SUCCESS); + logger.debug("ResidentController::getRidStatus()::exit"); + return response; + } + + @Deprecated + @PostMapping(value = "/req/euin") + @Operation(summary = "reqEuin", description = "reqEuin", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity reqEuin(@Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentController::reqEuin()::entry"); + validator.validateEuinRequest(requestDTO); + logger.debug(String.format("ResidentController::Requesting euin for transaction id: %s", requestDTO.getRequest().getTransactionID())); + byte[] pdfbytes = residentService.reqEuin(requestDTO.getRequest()); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQ_EUIN_SUCCESS, + requestDTO.getRequest().getTransactionID())); + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfbytes)); + logger.debug("ResidentController::reqEuin()::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", + "attachment; filename=\"" + requestDTO.getRequest().getIndividualId() + ".pdf\"") + .body((Object) resource); + } + + @Deprecated + @ResponseFilter + @PostMapping(value = "/req/print-uin") + @Operation(summary = "reqPrintUin", description = "reqPrintUin", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity reqPrintUin(@Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentController::reqPrintUin()::entry"); + validator.validateReprintRequest(requestDTO); + logger.debug(String.format("ResidentController::Requesting print uin for transaction id: %s", requestDTO.getRequest().getTransactionID())); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(residentService.reqPrintUin(requestDTO.getRequest())); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQ_PRINTUIN_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::reqPrintUin()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Deprecated + @ResponseFilter + @PostMapping(value = "/req/auth-lock") + @Operation(summary = "reqAauthLock", description = "reqAauthLock", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper reqAauthLock( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentController::reqAauthLock()::entry"); + validator.validateAuthLockOrUnlockRequest(requestDTO, AuthTypeStatus.LOCK); + logger.debug(String.format("ResidentController::Requesting auth lock for transaction id: %s", requestDTO.getRequest().getTransactionID())); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(residentService.reqAauthTypeStatusUpdate(requestDTO.getRequest(), AuthTypeStatus.LOCK)); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQ_AUTH_LOCK_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::reqAauthLock()::exit"); + return response; + } + + @Deprecated + @ResponseFilter + @PostMapping(value = "/req/auth-unlock") + @Operation(summary = "reqAuthUnlock", description = "reqAuthUnlock", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper reqAuthUnlock( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentController::reqAuthUnlock()::entry"); + validator.validateAuthUnlockRequest(requestDTO, AuthTypeStatus.UNLOCK); + logger.debug(String.format("ResidentController::Requesting auth unlock for transaction id: %s", requestDTO.getRequest().getTransactionID())); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(residentService.reqAauthTypeStatusUpdate(requestDTO.getRequest(), AuthTypeStatus.UNLOCK)); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQ_AUTH_UNLOCK_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::reqAuthUnlock()::exit"); + return response; + } + + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getPostAuthTypeStatus()" + ")") + @ResponseFilter + @PostMapping(value = "/auth-lock-unlock") + @Operation(summary = "reqAuthTypeStatus", description = "reqAuthTypeStatus", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity reqAauthTypeStatusUpdateV2( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::reqAauthTypeStatusUpdateV2()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + Tuple2 tupleResponse = null; + try { + validator.validateAuthLockOrUnlockRequestV2(requestDTO); + logger.debug("ResidentController::Requesting auth lock/unlock api"); + tupleResponse = residentService.reqAauthTypeStatusUpdateV2(requestDTO.getRequest()); + response.setResponse(tupleResponse.getT1()); + response.setId(authLockStatusUpdateV2Id); + response.setVersion(authLockStatusUpdateV2Version); + audit.setAuditRequestDto(AuditEnum.REQ_AUTH_LOCK_UNLOCK_SUCCESS); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.REQUEST_FAILED, "Request for auth lock failed")); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, authLockStatusUpdateV2Id)); + throw e; + } + logger.debug("ResidentController::reqAauthTypeStatusUpdateV2()::exit"); + return ResponseEntity.ok() + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(response); + + } + + @ResponseFilter + @PostMapping(value = "/req/auth-history") + @Operation(summary = "reqAuthHistory", description = "reqAuthHistory", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper reqAuthHistory( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentController::reqAuthHistory()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + validator.validateAuthHistoryRequest(requestDTO); + logger.debug(String.format("ResidentController::Requesting auth history for transaction id %s", requestDTO.getRequest().getTransactionID())); + response = new ResponseWrapper<>(); + response.setResponse(residentService.reqAuthHistory(requestDTO.getRequest())); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQUEST_FAILED, + requestDTO.getRequest().getTransactionID(), "Request for auth history")); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.AUTH_HISTORY_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REQ_AUTH_HISTORY_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::reqAuthHistory()::exit"); + return response; + } + + @GetMapping(path = "/events/{event-id}") + @Operation(summary = "checkEventIdStatus", description = "checkEventIdStatus", tags = { + "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper checkEventIdStatus(@PathVariable(name = "event-id") String eventId, + @RequestParam(name = "langCode") String languageCode, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) throws ResidentServiceCheckedException { + logger.debug("ResidentController::checkEventIdStatus()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + validator.validateEventIdLanguageCode(eventId, languageCode); + logger.debug(String.format("ResidentController::Requesting application status for event id: %s", eventId)); + responseWrapper = residentService.getEventStatus(eventId, languageCode, timeZoneOffset, locale); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.CHECK_AID_STATUS_REQUEST_FAILED, eventId)); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.EVENTS_EVENTID_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.CHECK_AID_STATUS_REQUEST_SUCCESS, eventId)); + logger.debug("ResidentController::checkEventIdStatus()::exit"); + return responseWrapper; + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetServiceAuthHistoryRoles()" + ")") + @GetMapping(path = "/service-history/{langCode}") + @Operation(summary = "getServiceHistory", description = "getServiceHistory", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper> getServiceHistory(@PathVariable("langCode") String langCode, + @RequestParam(name = "pageIndex", required = false) Integer pageIndex, + @RequestParam(name = "pageSize", required = false) Integer pageSize, + @RequestParam(name = "fromDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate, + @RequestParam(name = "toDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate toDate, + @RequestParam(name = "sortType", required = false) String sortType, + @RequestParam(name = "serviceType", required = false) String serviceType, + @RequestParam(name = "statusFilter", required = false) String statusFilter, + @RequestParam(name = "searchText", required = false) String searchText, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::getServiceHistory()::entry"); + logger.info("TimeZone-offset: " + timeZoneOffset); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + try { + validator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, statusFilter, langCode, searchText); + responseWrapper = residentService.getServiceHistory(pageIndex, pageSize, fromDate, toDate, serviceType, + sortType, statusFilter, searchText, langCode, timeZoneOffset, locale, + RESIDENT_VIEW_HISTORY_DEFAULT_PAGE_SIZE, null); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.GET_SERVICE_HISTORY_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, serviceHistoryId)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.GET_SERVICE_HISTORY_SUCCESS); + logger.debug("ResidentController::getServiceHistory()::exit"); + return responseWrapper; + } + + @Deprecated + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/req/update-uin") + @Operation(summary = "updateUin", description = "updateUin", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper updateUin( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("ResidentController::updateUin()::exit"); + validator.validateUpdateRequest(requestDTO, false, null); + ResponseWrapper response = new ResponseWrapper<>(); + logger.debug(String.format("ResidentController::Requesting update uin api for transaction id %s", requestDTO.getRequest().getTransactionID())); + response.setResponse(residentService.reqUinUpdate(requestDTO.getRequest()).getT1()); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.UPDATE_UIN_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::updateUin()::exit"); + return response; + } + + /** + * This function is used to update the UIN of a resident + * + * @param requestDTO The request object that is passed to the API. + * @return ResponseWrapper + * @throws ApisResourceAccessException + */ + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getPatchUpdateUin()" + ")") + @ResponseFilter + @PatchMapping(value = "/update-uin") + @Operation(summary = "updateUin", description = "updateUin", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity updateUinDemographics( + @Valid @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("ResidentController::updateUinDemographics()::entry"); + RequestWrapper requestWrapper = JsonUtil.convertValue(requestDTO, + new TypeReference>() { + }); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + ResponseWrapper response = new ResponseWrapper<>(); + Tuple2 tupleResponse = null; + ResidentUpdateRequestDto request = requestWrapper.getRequest(); + if (request != null) { + request.setIndividualId(individualId); + request.setIndividualIdType(getIdType(individualId)); + } + try { + Tuple3 identityData = utilities. + getIdentityDataFromIndividualID(individualId); + JSONObject idRepoJson = identityData.getT1(); + String schemaJson = identityData.getT2(); + validator.validateUpdateRequest(requestWrapper, true, schemaJson); + logger.debug(String.format("ResidentController::Requesting update uin api for transaction id %s", requestDTO.getRequest().getTransactionID())); + requestDTO.getRequest().getIdentity().put(IdType.UIN.name(), + idRepoJson.get(IdType.UIN.name())); + tupleResponse = residentService.reqUinUpdate(request, requestDTO.getRequest().getIdentity(), true, + idRepoJson, schemaJson, identityData.getT3()); + response.setId(requestDTO.getId()); + response.setVersion(requestDTO.getVersion()); + response.setResponse(tupleResponse.getT1()); + } catch (InvalidInputException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.UPDATE_UIN_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.UPDATE_UIN_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.UPDATE_UIN_SUCCESS, + requestDTO.getRequest().getTransactionID())); + logger.debug("ResidentController::updateUinDemographics()::exit"); + return ResponseEntity.ok().header(ResidentConstants.EVENT_ID, tupleResponse.getT2()).body(response); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetAuthLockStatus()" + ")") + @GetMapping(path = "/auth-lock-status") + public ResponseWrapper getAuthLockStatus() throws ApisResourceAccessException { + logger.debug("ResidentController::getAuthLockStatus()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + try { + responseWrapper = residentService.getAuthLockStatus(individualId); + audit.setAuditRequestDto(AuditEnum.REQ_AUTH_LOCK_STATUS_SUCCESS); + return responseWrapper; + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.REQ_AUTH_LOCK_STATUS_FAILED); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorCode(), + ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorMessage()))); + } + logger.debug("ResidentController::getAuthLockStatus()::exit"); + return responseWrapper; + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetDownloadCard()" + ")") + @GetMapping(path = "/download-card/event/{eventId}") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Card successfully downloaded", content = @Content(schema = @Schema(implementation = ResponseWrapper.class))), + @ApiResponse(responseCode = "400", description = "Download card failed", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity downloadCard( + @PathVariable("eventId") String eventId, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) throws ResidentServiceCheckedException { + logger.debug("ResidentController::downloadCard()::entry"); + InputStreamResource resource = null; + Tuple2 pdfBytesAndCardType; + try { + validator.validateEventId(eventId); + logger.debug(String.format("ResidentController::Requesting download digital card for event id: %s", eventId)); + pdfBytesAndCardType = residentService.downloadCard(eventId); + resource = new InputStreamResource(new ByteArrayInputStream(pdfBytesAndCardType.getT1())); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.RID_DIGITAL_CARD_REQ_SUCCESS, eventId)); + } catch (CardNotReadyException | ResidentServiceException | EventIdNotPresentException + | InvalidRequestTypeCodeException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.RID_DIGITAL_CARD_REQ_FAILURE, eventId)); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.HTTP_STATUS_CODE, HttpStatus.BAD_REQUEST, ResidentConstants.REQ_RES_ID, + downloadCardEventidId)); + } + logger.debug("ResidentController::downloadCard()::exit"); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_PDF) + .header("Content-Disposition", "attachment; filename=\"" + residentService.getFileName(eventId, pdfBytesAndCardType.getT2(), timeZoneOffset, locale) + ".pdf\"") + .header(ResidentConstants.EVENT_ID, eventId) + .body(resource); + } + + /** + * It returns the type of the ID passed to it + * + * @param id The ID of the resident. + * @return The method is returning the type of ID. + */ + private String getIdType(String id) { + if (validator.validateUin(id)) + return IdType.UIN.name(); + if (validator.validateVid(id)) + return IdType.VID.name(); + return IdType.RID.name(); + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping("/aid/status") + @Operation(summary = "checkAidStatus", description = "Get AID Status", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper checkAidStatus(@RequestBody RequestWrapper reqDto) + throws ResidentServiceCheckedException, ApisResourceAccessException, OtpValidationFailedException { + logger.debug("ResidentController::getAidStatus()::entry"); + AidStatusResponseDTO resp = new AidStatusResponseDTO(); + try { + validator.validateAidStatusRequestDto(reqDto); + logger.debug("ResidentController::Request for checking AID status"); + resp = residentService.getAidStatus(reqDto.getRequest(), true); + } catch (ResidentServiceCheckedException | ApisResourceAccessException | OtpValidationFailedException e) { + audit.setAuditRequestDto(AuditEnum.AID_STATUS_FAILURE); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.REQ_RES_ID, checkStatusId)); + } + audit.setAuditRequestDto(AuditEnum.AID_STATUS_SUCCESS); + logger.debug("ResidentController::getAidStatus()::exit"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(resp); + responseWrapper.setId(checkStatusId); + responseWrapper.setVersion(newVersion); + return responseWrapper; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetNotificationCount()" + ")") + @GetMapping("/unread/notification-count") + @Operation(summary = "unreadnotification-count", description = "Get notification count", tags = { + "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper notificationCount() + throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper count = new ResponseWrapper<>(); + logger.debug("ResidentController::notificationCount()::entry"); + String individualId = identityServiceImpl.getResidentIdaToken(); + try { + count = residentService.getnotificationCount(individualId); + } catch (ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.UNREAD_NOTIF_COUNT_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, serviceEventId)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.UNREAD_NOTIF_COUNT_SUCCESS); + logger.debug("ResidentController::notificationCount()::exit"); + return count; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetNotificationClick()" + ")") + @GetMapping("/bell/notification-click") + @Operation(summary = "checkLastClickdttimes", description = "Get notification-clickdttimes", tags = { + "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper bellClickdttimes() + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::bellClickdttimes()::entry"); + String idaToken = null; + ResponseWrapper response = new ResponseWrapper<>(); + try { + idaToken = identityServiceImpl.getResidentIdaToken(); + response = residentService.getbellClickdttimes(idaToken); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + audit.setAuditRequestDto(AuditEnum.GET_NOTIF_CLICK_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.NOTIFICATION_CLICK_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.GET_NOTIF_CLICK_SUCCESS); + logger.debug("ResidentController::bellClickdttimes::exit"); + return response; + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetupdatedttimes()" + ")") + @PutMapping(path = "/bell/updatedttime") + @Operation(summary = "updatebellClickdttimes", description = "updatedttimes") + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "204", description = "No Content", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), }) + public int bellupdateClickdttimes() throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::bellupdateClickdttimes()::entry"); + String idaToken = identityServiceImpl.getResidentIdaToken(); + int response = residentService.updatebellClickdttimes(idaToken); + logger.debug("ResidentController::bellupdateClickdttimes()::exit"); + return response; + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getGetUnreadServiceList()" + ")") + @GetMapping("/notifications/{langCode}") + @Operation(summary = "get", description = "Get unread-service-list", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseWrapper getNotificationsList(@PathVariable("langCode") String langCode, + @RequestParam(name = "pageIndex", required = false) Integer pageIndex, + @RequestParam(name = "pageSize", required = false) Integer pageSize, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::getNotificationsList()::entry"); + String id = null; + ResponseWrapper> notificationDtoList = new ResponseWrapper<>(); + try { + validator.validateLanguageCode(langCode); + id = identityServiceImpl.getResidentIdaToken(); + notificationDtoList = residentService.getNotificationList(pageIndex, pageSize, id, langCode, + timeZoneOffset, locale); + } catch (ResidentServiceCheckedException | ApisResourceAccessException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.GET_NOTIFICATION_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.NOTIFICATION_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.GET_NOTIFICATION_SUCCESS); + logger.debug("ResidentController::getNotificationsList()::exit"); + return notificationDtoList; + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/download/service-history") + public ResponseEntity downLoadServiceHistory( + @RequestParam(name = "eventReqDateTime", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime eventReqDateTime, + @RequestParam(name = "fromDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate, + @RequestParam(name = "toDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate toDate, + @RequestParam(name = "sortType", required = false) String sortType, + @RequestParam(name = "serviceType", required = false) String serviceType, + @RequestParam(name = "statusFilter", required = false) String statusFilter, + @RequestParam(name = "searchText", required = false) String searchText, + @RequestParam(name = "languageCode", required = true) String languageCode, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("ResidentController::downLoadServiceHistory::entry"); + InputStreamResource resource = null; + try { + validator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, statusFilter, languageCode, searchText); + ResponseWrapper> responseWrapper = residentService.getServiceHistory( + null, maxEventsServiceHistoryPageSize, fromDate, toDate, serviceType, sortType, statusFilter, + searchText, languageCode, timeZoneOffset, locale); + logger.debug("after response wrapper size of " + responseWrapper.getResponse().getData().size()); + byte[] pdfBytes = residentService.downLoadServiceHistory(responseWrapper, languageCode, eventReqDateTime, + fromDate, toDate, serviceType, statusFilter, timeZoneOffset, locale); + resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); + } catch (ResidentServiceCheckedException | ApisResourceAccessException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.DOWNLOAD_SERVICE_HISTORY_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.SERVICE_HISTORY_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.DOWNLOAD_SERVICE_HISTORY_SUCCESS); + logger.debug("ResidentController::downLoadServiceHistory::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", + "attachment; filename=\"" + utility.getFileName(null, + Objects.requireNonNull(this.environment.getProperty( + ResidentConstants.DOWNLOAD_SERVICE_HISTORY_FILE_NAME_CONVENTION_PROPERTY)), + timeZoneOffset, locale) + ".pdf\"") + .body(resource); + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping("/profile") + @Operation(summary = "get", description = "Get unread-service-list", tags = { "resident-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + + public ResponseWrapper userinfo(@RequestParam(name = "languageCode", required = false) String languageCode, + @RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentController::getuserinfo()::entry"); + ResponseWrapper userInfoDto = new ResponseWrapper<>(); + try { + validator.validateProfileApiRequest(languageCode); + String idaToken = identityServiceImpl.getResidentIdaToken(); + userInfoDto = residentService.getUserinfo(idaToken, languageCode, timeZoneOffset, locale); + } catch (ResidentServiceCheckedException | ApisResourceAccessException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.GET_PROFILE_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.PROFILE_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.GET_PROFILE_SUCCESS); + logger.debug("ResidentController::getuserinfo()::exit"); + return userInfoDto; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentCredentialController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentCredentialController.java index 29a35e80197..2ed08ed8bcf 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentCredentialController.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentCredentialController.java @@ -1,153 +1,300 @@ -package io.mosip.resident.controller; - -import java.io.ByteArrayInputStream; - -import javax.validation.Valid; - -import io.swagger.v3.oas.annotations.media.Schema; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import io.mosip.kernel.core.http.ResponseFilter; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.resident.dto.CredentialCancelRequestResponseDto; -import io.mosip.resident.dto.CredentialRequestStatusResponseDto; -import io.mosip.resident.dto.CredentialTypeResponse; -import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; -import io.mosip.resident.dto.RequestWrapper; -import io.mosip.resident.dto.ResidentCredentialRequestDto; -import io.mosip.resident.dto.ResidentCredentialResponseDto; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.service.ResidentCredentialService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.validator.RequestValidator; - -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.tags.Tag; - -@RestController -@Tag(name = "resident-credential-controller", description = "Resident Credential Controller") -public class ResidentCredentialController { - - @Autowired - private RequestValidator validator; - - @Autowired - private ResidentCredentialService residentCredentialService; - - @Autowired - private AuditUtil audit; - - @ResponseFilter - @PostMapping(value = "/req/credential") - @Operation(summary = "reqCredential", description = "reqCredential", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity reqCredential(@RequestBody RequestWrapper requestDTO) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentCredentialService.reqCredential(requestDTO.getRequest())); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_SUCCESS); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - @GetMapping(value = "req/credential/status/{requestId}") - @Operation(summary = "getCredentialStatus", description = "getCredentialStatus", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity getCredentialStatus(@PathVariable("requestId") String requestId) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentCredentialService.getStatus(requestId)); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_SUCCESS); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - - @GetMapping(value = "req/card/{requestId}") - @Operation(summary = "getCard", description = "getCard", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity getCard(@PathVariable("requestId") String requestId) - throws Exception { - audit.setAuditRequestDto(EventEnum.REQ_CARD); - byte[] pdfBytes = residentCredentialService.getCard(requestId); - InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); - audit.setAuditRequestDto(EventEnum.REQ_CARD_SUCCESS); - return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) - .header("Content-Disposition", "attachment; filename=\"" + requestId + ".pdf\"") - .body((Object) resource); - } - - @GetMapping(value = "credential/types") - @Operation(summary = "getCredentialTypes", description = "getCredentialTypes", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity getCredentialTypes() - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_TYPES); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentCredentialService.getCredentialTypes()); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_TYPES_SUCCESS); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - - - @GetMapping(value = "req/credential/cancel/{requestId}") - @Operation(summary = "cancelCredentialRequest", description = "cancelCredentialRequest", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity cancelCredentialRequest(@PathVariable("requestId") String requestId) - throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_CANCEL_REQ); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(residentCredentialService.cancelCredentialRequest(requestId)); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_CANCEL_REQ_SUCCESS); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - - @GetMapping(value = "req/policy/partnerId/{partnerId}/credentialType/{credentialType}") - @Operation(summary = "getPolicyByCredentialType", description = "getPolicyByCredentialType", tags = { "resident-credential-controller" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity getPolicyByCredentialType(@PathVariable @Valid String partnerId, - @PathVariable @Valid String credentialType) throws ResidentServiceCheckedException { - audit.setAuditRequestDto(EventEnum.REQ_POLICY); - io.mosip.resident.dto.ResponseWrapper response = residentCredentialService - .getPolicyByCredentialType(partnerId, credentialType); - audit.setAuditRequestDto(EventEnum.REQ_POLICY_SUCCESS); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - -} +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.UISchemaTypes; +import io.mosip.resident.dto.CredentialCancelRequestResponseDto; +import io.mosip.resident.dto.CredentialRequestStatusResponseDto; +import io.mosip.resident.dto.CredentialTypeResponse; +import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResidentCredentialResponseDtoV2; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.dto.ShareCredentialRequestDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentCredentialServiceException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.service.impl.ResidentConfigServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import reactor.util.function.Tuple2; + +@RestController +@Tag(name = "resident-credential-controller", description = "Resident Credential Controller") +public class ResidentCredentialController { + + @Autowired + private RequestValidator validator; + + @Autowired + private ResidentCredentialService residentCredentialService; + + @Autowired + private ResidentConfigServiceImpl residentConfigService; + + @Autowired + private AuditUtil audit; + + @Value("${resident.share.credential.id}") + private String shareCredentialId; + + @Value("${resident.share.credential.version}") + private String shareCredentialVersion; + + private static final Logger logger = LoggerConfiguration.logConfig(ResidentCredentialController.class); + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/req/credential") + @Operation(summary = "reqCredential", description = "reqCredential", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity reqCredential(@RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialController::reqCredential()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + validator.validateReqCredentialRequest(requestDTO); + response.setResponse(residentCredentialService.reqCredential(requestDTO.getRequest())); + } catch (InvalidInputException | ResidentServiceException | ResidentCredentialServiceException | ResidentServiceCheckedException e) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_EXCEPTION); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.CREDENTIAL_STORE_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_SUCCESS); + logger.debug("ResidentCredentialController::reqCredential()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @ResponseFilter + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + "@authorizedScopes.getPostRequestShareCredWithPartner()" + ")") + @PostMapping(value = "/share-credential") + @Operation(summary = "requestShareCredWithPartner", description = "requestShareCredWithPartner", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity requestShareCredWithPartner( + @RequestBody RequestWrapper requestDTO) + throws ResidentServiceCheckedException, ApisResourceAccessException, JsonParseException, JsonMappingException, IOException { + logger.debug("ResidentCredentialController::requestShareCredWithPartner()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + Tuple2 tupleResponse; + try { + validator.validateShareCredentialRequest(requestDTO); + String purpose = requestDTO.getRequest().getPurpose(); + RequestWrapper request = new RequestWrapper(); + ResidentCredentialRequestDto credentialRequestDto = new ResidentCredentialRequestDto(); + credentialRequestDto.setIssuer(requestDTO.getRequest().getPartnerId()); + credentialRequestDto.setConsent(requestDTO.getRequest().getConsent()); + request.setRequest(credentialRequestDto); + buildAdditionalMetadata(requestDTO, request); + tupleResponse = residentCredentialService.shareCredential(request.getRequest(), purpose, + requestDTO.getRequest().getSharableAttributes()); + } catch (InvalidInputException | ResidentServiceCheckedException | ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_EXCEPTION); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, shareCredentialId)); + throw e; + } + response.setId(shareCredentialId); + response.setVersion(shareCredentialVersion); + response.setResponse(tupleResponse.getT1()); + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_SUCCESS); + logger.debug("ResidentCredentialController::requestShareCredWithPartner()::exit"); + return ResponseEntity.status(HttpStatus.OK).header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(response); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "req/credential/status/{requestId}") + @Operation(summary = "getCredentialStatus", description = "getCredentialStatus", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity getCredentialStatus(@PathVariable("requestId") String requestId) + throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialController::getCredentialStatus()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + response.setResponse(residentCredentialService.getStatus(requestId)); + } catch (ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); + throw e; + } + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_STATUS_SUCCESS); + logger.debug("ResidentCredentialController::getCredentialStatus()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "req/card/{requestId}") + @Operation(summary = "getCard", description = "getCard", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity getCard(@PathVariable("requestId") String requestId) + throws Exception { + logger.debug("ResidentCredentialController::getCard()::entry"); + byte[] pdfBytes; + try { + pdfBytes = residentCredentialService.getCard(requestId); + } catch (ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.REQ_CARD_EXCEPTION); + throw e; + } + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); + audit.setAuditRequestDto(AuditEnum.REQ_CARD_SUCCESS); + logger.debug("ResidentCredentialController::getCard()::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + requestId + ".pdf\"") + .body((Object) resource); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "credential/types") + @Operation(summary = "getCredentialTypes", description = "getCredentialTypes", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity getCredentialTypes() + throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialController::getCredentialTypes()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + response.setResponse(residentCredentialService.getCredentialTypes()); + } catch (ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_TYPES_EXCEPTION); + throw e; + } + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_TYPES_SUCCESS); + logger.debug("ResidentCredentialController::getCredentialTypes()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "req/credential/cancel/{requestId}") + @Operation(summary = "cancelCredentialRequest", description = "cancelCredentialRequest", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity cancelCredentialRequest(@PathVariable("requestId") String requestId) + throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialController::cancelCredentialRequest()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + try { + response.setResponse(residentCredentialService.cancelCredentialRequest(requestId)); + } catch (ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_CANCEL_REQ_EXCEPTION); + throw e; + } + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_CANCEL_REQ_SUCCESS); + logger.debug("ResidentCredentialController::cancelCredentialRequest()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "req/policy/partnerId/{partnerId}/credentialType/{credentialType}") + @Operation(summary = "getPolicyByCredentialType", description = "getPolicyByCredentialType", tags = { "resident-credential-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity getPolicyByCredentialType(@PathVariable @Valid String partnerId, + @PathVariable @Valid String credentialType) throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialController::getPolicyByCredentialType()::entry"); + io.mosip.resident.dto.ResponseWrapper response; + try { + response = residentCredentialService.getPolicyByCredentialType(partnerId, credentialType); + } catch (ResidentCredentialServiceException e) { + audit.setAuditRequestDto(AuditEnum.REQ_POLICY_EXCEPTION); + throw e; + } + audit.setAuditRequestDto(AuditEnum.REQ_POLICY_SUCCESS); + logger.debug("ResidentCredentialController::getPolicyByCredentialType()::exit"); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + private void buildAdditionalMetadata(RequestWrapper requestDTO, + RequestWrapper request) + throws JsonParseException, JsonMappingException, ResidentServiceCheckedException, IOException { + List sharableAttr = residentConfigService.getSharableAttributesList( + requestDTO.getRequest().getSharableAttributes(), UISchemaTypes.SHARE_CREDENTIAL.getFileIdentifier()); + if (Objects.nonNull(requestDTO.getRequest().getSharableAttributes())) { + request.getRequest().setSharableAttributes(sharableAttr); + Map formattingAttributes = requestDTO.getRequest().getSharableAttributes() + .stream() + .filter(attrib -> attrib.getFormat() != null && !attrib.getFormat().isEmpty()) + .collect(Collectors.toMap(SharableAttributesDTO::getAttributeName, SharableAttributesDTO::getFormat)); + request.getRequest() + .setAdditionalData(Map.of("formatingAttributes", formattingAttributes, + "maskingAttributes", + requestDTO.getRequest().getSharableAttributes().stream() + .filter(attr -> attr.isMasked()) + .map(attr -> attr.getAttributeName()) + .collect(Collectors.toList()))); + + } + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentOtpController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentOtpController.java index 1e9a8f68c8b..1dbd55c82f0 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentOtpController.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentOtpController.java @@ -1,21 +1,38 @@ package io.mosip.resident.controller; -import io.swagger.v3.oas.annotations.media.Schema; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.IndividualIdResponseDto; import io.mosip.resident.dto.OtpRequestDTO; import io.mosip.resident.dto.OtpResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.service.ResidentOtpService; import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; - -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @RestController @@ -27,8 +44,20 @@ public class ResidentOtpController { @Autowired private AuditUtil audit; + + @Autowired + private RequestValidator requestValidator; + + @Value("${mosip.resident.api.id.otp.request}") + private String otpRequestId; + + @Value("${resident.version.new}") + private String otpRequestVersion; + + private static final Logger logger = LoggerConfiguration.logConfig(ResidentOtpController.class); - @PostMapping(value = "/req/otp") + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/req/otp") @Operation(summary = "reqOtp", description = "reqOtp", tags = { "resident-otp-controller" }) @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), @@ -36,11 +65,49 @@ public class ResidentOtpController { @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public OtpResponseDTO reqOtp(@RequestBody OtpRequestDTO otpRequestDto) { - audit.setAuditRequestDto(EventEnum.OTP_GEN); - OtpResponseDTO otpResponseDTO = residentOtpService.generateOtp(otpRequestDto); - audit.setAuditRequestDto(EventEnum.OTP_GEN_SUCCESS); + public OtpResponseDTO reqOtp(@RequestBody OtpRequestDTO otpRequestDto) throws ResidentServiceCheckedException, NoSuchAlgorithmException { + logger.debug("ResidentOtpController::reqOtp()::entry"); + OtpResponseDTO otpResponseDTO; + try { + otpResponseDTO = residentOtpService.generateOtp(otpRequestDto); + } catch (ResidentServiceException e) { + audit.setAuditRequestDto(AuditEnum.OTP_GEN_EXCEPTION); + throw e; + } + audit.setAuditRequestDto(AuditEnum.OTP_GEN_SUCCESS); + logger.debug("ResidentOtpController::reqOtp()::exit"); return otpResponseDTO; } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/individualId/otp") + @Operation(summary = "reqIndividualIdOtp", description = "reqIndividualIdOtp", tags = { "resident-otp-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public IndividualIdResponseDto reqOtpForIndividualId(@RequestBody IndividualIdOtpRequestDTO individualIdRequestDto) throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException { + logger.debug("ResidentOtpController::reqOtpForIndividualId()::entry"); + IndividualIdResponseDto individualIdResponseDto; + try { + requestValidator.validateReqOtp(individualIdRequestDto); + individualIdResponseDto = residentOtpService.generateOtpForIndividualId(individualIdRequestDto); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + audit.setAuditRequestDto(AuditEnum.OTP_AID_GEN_EXCEPTION); + throw new ResidentServiceException(e.getErrorCode(), e.getErrorText(), e, + Map.of(ResidentConstants.REQ_RES_ID, otpRequestId)); + } catch (ResidentServiceException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.OTP_AID_GEN_EXCEPTION); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, otpRequestId)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.OTP_INDIVIDUALID_GEN_SUCCESS); + individualIdResponseDto.setId(otpRequestId); + individualIdResponseDto.setVersion(otpRequestVersion); + logger.debug("ResidentOtpController::reqOtpForIndividualId()::exit"); + return individualIdResponseDto; + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentVidController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentVidController.java index acde78aff20..f5611701a4e 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentVidController.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/ResidentVidController.java @@ -1,90 +1,293 @@ package io.mosip.resident.controller; +import io.micrometer.core.annotation.Timed; import io.mosip.kernel.core.logger.spi.Logger; import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.BaseVidRevokeRequestDTO; +import io.mosip.resident.dto.IVidRequestDto; import io.mosip.resident.dto.RequestWrapper; import io.mosip.resident.dto.ResidentVidRequestDto; +import io.mosip.resident.dto.ResidentVidRequestDtoV2; import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidRequestDto; import io.mosip.resident.dto.VidResponseDto; import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.dto.VidRevokeRequestDTOV2; import io.mosip.resident.dto.VidRevokeResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.OtpValidationFailedException; import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; +import reactor.util.function.Tuple2; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.io.IOException; +import java.util.List; +import java.util.Map; /** * Resident VID controller class. + * * @Author : Monobikash Das */ @RefreshScope @RestController -@Tag(name = "Resident Service", description = "Resident Vid Controller") +@Tag(name = "resident-vid-controller", description = "Resident Vid Controller") public class ResidentVidController { - Logger logger = LoggerConfiguration.logConfig(ResidentVidController.class); + private static final Logger logger = LoggerConfiguration.logConfig(ResidentVidController.class); + + @Autowired + private ResidentVidService residentVidService; - @Autowired - private ResidentVidService residentVidService; + @Autowired + private RequestValidator validator; - @Autowired - private RequestValidator validator; + @Autowired + private AuditUtil auditUtil; - @Autowired - private AuditUtil auditUtil; + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Value("${resident.vid.policy.id}") + private String vidPolicyId; + + @Value("${resident.vid.version}") + private String version; + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(path = "/vid/policy") + @Operation(summary = "Retrieve VID policy", description = "Retrieve VID policy", tags = { "Resident Service" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "VID Policy retrieved successfully", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResidentVidRequestDto.class)))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public String getVidPolicy() throws ResidentServiceCheckedException { + logger.debug("ResidentVidController::getVidPolicy()::entry"); + String policyResponse; + try { + policyResponse = residentVidService.getVidPolicy(); + } catch (ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_VID_POLICY_FAILURE); + throw new ResidentServiceCheckedException(ResidentErrorCode.POLICY_EXCEPTION); + } + auditUtil.setAuditRequestDto(AuditEnum.GET_VID_POLICY_SUCCESS); + logger.debug("ResidentVidController::getVidPolicy()::exit"); + return policyResponse; + } + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) @PostMapping(path = "/vid", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "generateVid", description = "generateVid", tags = { "Resident Service" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "VID successfully generated", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResidentVidRequestDto.class)))), - @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "400", description = "Unable to generate VID" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity generateVid(@RequestBody(required = true) ResidentVidRequestDto requestDto) throws OtpValidationFailedException, ResidentServiceCheckedException { - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"Request to generate VID")); - validator.validateVidCreateRequest(requestDto); - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.GENERATE_VID,requestDto.getRequest().getIndividualId())); - ResponseWrapper vidResponseDto = residentVidService.generateVid(requestDto.getRequest()); - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.GENERATE_VID_SUCCESS,requestDto.getRequest().getIndividualId())); - return ResponseEntity.ok().body(vidResponseDto); - } + @Operation(summary = "generateVid", description = "generateVid", tags = { "Resident Service" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "VID successfully generated", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResidentVidRequestDto.class)))), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "400", description = "Unable to generate VID", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity generateVid(@RequestBody(required = true) ResidentVidRequestDto requestDto) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + return generateVid(requestDto, true); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getPostgeneratevid()" + + ")") + @PostMapping(path = "/generate-vid", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "generateVid", description = "generateVid", tags = { "Resident Service" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "VID successfully generated", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResidentVidRequestDto.class)))), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "400", description = "Unable to generate VID", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity generateVidV2(@RequestBody(required = true) ResidentVidRequestDtoV2 requestDto) + throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { + return generateVidV2Version(requestDto, false); + } + + private ResponseEntity generateVid(IVidRequestDto requestDto, boolean isOtpValidationRequired) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentVidController::generateVid()::entry"); + String residentIndividualId = !(requestDto.getRequest() instanceof VidRequestDto)? null : ((VidRequestDto)requestDto.getRequest()).getIndividualId(); + if(residentIndividualId == null && requestDto.getRequest() != null) { + residentIndividualId = getResidentIndividualId(); + } + validator.validateVidCreateRequest(requestDto, isOtpValidationRequired, residentIndividualId); + ResponseWrapper vidResponseDto = residentVidService.generateVid(requestDto.getRequest(), residentIndividualId); + if(isOtpValidationRequired){ + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.GENERATE_VID_SUCCESS, + residentIndividualId)); + } else{ + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.GENERATE_VID_SUCCESS_V1, + residentIndividualId)); + } + logger.debug("ResidentVidController::generateVid()::exit"); + return ResponseEntity.ok().body(vidResponseDto); + } + + private ResponseEntity generateVidV2Version(IVidRequestDto requestDto, boolean isOtpValidationRequired) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentVidController::generateVidV2Version()::entry"); + String residentIndividualId = !(requestDto.getRequest() instanceof VidRequestDto)? null : ((VidRequestDto)requestDto.getRequest()).getIndividualId(); + if(residentIndividualId == null && requestDto.getRequest() != null) { + residentIndividualId = getResidentIndividualId(); + } + validator.validateVidCreateV2Request(requestDto, isOtpValidationRequired, residentIndividualId); + Tuple2, String> tupleResponse = residentVidService.generateVidV2(requestDto.getRequest(), residentIndividualId); + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.GENERATE_VID_SUCCESS, + residentIndividualId)); + logger.debug("ResidentVidController::generateVidV2Version()::exit"); + return ResponseEntity.ok() + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(tupleResponse.getT1()); + } + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) @PatchMapping(path = "/vid/{vid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Revoke VID", description = "Revoke VID", tags = { "Resident Service" }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "VID successfully revoked", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResponseWrapper.class)))), - @ApiResponse(responseCode = "204", description = "No Content" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "400", description = "Unable to revoke VID" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true)))}) - public ResponseEntity revokeVid(@RequestBody(required = true) RequestWrapper requestDto, @PathVariable String vid) throws OtpValidationFailedException, ResidentServiceCheckedException { - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST,"Request to revoke VID")); - validator.validateVidRevokeRequest(requestDto); - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REVOKE_VID,requestDto.getRequest().getIndividualId())); - ResponseWrapper vidResponseDto = residentVidService.revokeVid(requestDto.getRequest(),vid); - auditUtil.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REVOKE_VID_SUCCESS,requestDto.getRequest().getIndividualId())); - return ResponseEntity.ok().body(vidResponseDto); - } + @Operation(summary = "Revoke VID", description = "Revoke VID", tags = { "Resident Service" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "VID successfully revoked", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResponseWrapper.class)))), + @ApiResponse(responseCode = "204", description = "No Content", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "400", description = "Unable to revoke VID", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity revokeVid( + @RequestBody(required = true) RequestWrapper requestDto, @PathVariable String vid) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + return revokeVid(requestDto, vid, true); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getPatchrevokevid()" + + ")") + @PatchMapping(path = "/revoke-vid/{vid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Revoke VID", description = "Revoke VID", tags = { "Resident Service" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "VID successfully revoked", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ResponseWrapper.class)))), + @ApiResponse(responseCode = "204", description = "No Content", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "400", description = "Unable to revoke VID", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity revokeVidV2( + @RequestBody(required = true) RequestWrapper requestDto, @PathVariable String vid) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + return revokeVidV2Version(requestDto, vid, false); + } + + private ResponseEntity revokeVid(RequestWrapper requestDto, String vid, + boolean isOtpValidationRequired) throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("ResidentVidController::revokeVid()::entry"); + String residentIndividualId = !(requestDto.getRequest() instanceof VidRevokeRequestDTO)? null : ((VidRevokeRequestDTO)requestDto.getRequest()).getIndividualId(); + + if(residentIndividualId == null && requestDto.getRequest() != null) { + residentIndividualId = getResidentIndividualId(); + } + if (residentIndividualId !=null && residentIndividualId.equals(vid)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_VALIDATION); + } + validator.validateVidRevokeRequest(requestDto, isOtpValidationRequired, residentIndividualId); + requestDto.getRequest().setVidStatus(requestDto.getRequest().getVidStatus().toUpperCase()); + ResponseWrapper vidResponseDto = residentVidService.revokeVid(requestDto.getRequest(), + vid, residentIndividualId); + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REVOKE_VID_SUCCESS, + residentIndividualId)); + logger.debug("ResidentVidController::revokeVid()::exit"); + return ResponseEntity.ok().body(vidResponseDto); + } + + private ResponseEntity revokeVidV2Version(RequestWrapper requestDto, String vid, + boolean isOtpValidationRequired) throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + logger.debug("ResidentVidController::revokeVidV2Version()::entry"); + String residentIndividualId = !(requestDto.getRequest() instanceof VidRevokeRequestDTO)? null : ((VidRevokeRequestDTO)requestDto.getRequest()).getIndividualId(); + + if(residentIndividualId == null && requestDto.getRequest() != null) { + residentIndividualId = getResidentIndividualId(); + } + if (residentIndividualId !=null && residentIndividualId.equals(vid)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_VALIDATION); + } + validator.validateVidRevokeV2Request(requestDto, isOtpValidationRequired, residentIndividualId); + requestDto.getRequest().setVidStatus(requestDto.getRequest().getVidStatus().toUpperCase()); + Tuple2, String> tupleResponse = residentVidService.revokeVidV2(requestDto.getRequest(), + vid, residentIndividualId); + if(isOtpValidationRequired){ + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REVOKE_VID_SUCCESS, + residentIndividualId)); + } else { + auditUtil.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.REVOKE_VID_SUCCESS_V1, + residentIndividualId)); + } + + logger.debug("ResidentVidController::revokeVidV2Version()::exit"); + return ResponseEntity.ok() + .header(ResidentConstants.EVENT_ID, tupleResponse.getT2()) + .body(tupleResponse.getT1()); + } + + private String getResidentIndividualId() throws ApisResourceAccessException { + return identityServiceImpl.getResidentIndvidualIdFromSession(); + } + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthorize("@scopeValidator.hasAllScopes(" + + "@authorizedScopes.getGetvids()" + + ")") + @GetMapping(path = "/vids", consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "retrieveVids", description = "retrieveVids", tags = { "vid-controller" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseWrapper retrieveVids(@RequestHeader(name = "time-zone-offset", required = false, defaultValue = "0") int timeZoneOffset, + @RequestHeader(name = "locale", required = false) String locale) throws ResidentServiceException, ApisResourceAccessException, ResidentServiceCheckedException { + logger.debug("ResidentVidController::retrieveVids()::entry"); + ResponseWrapper>> retrieveVids = new ResponseWrapper<>(); + String residentIndividualId = getResidentIndividualId(); + try { + retrieveVids = residentVidService.retrieveVids(residentIndividualId, timeZoneOffset, locale); + } catch (ResidentServiceException | ApisResourceAccessException | ResidentServiceCheckedException e) { + auditUtil.setAuditRequestDto(AuditEnum.GET_VIDS_EXCEPTION); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.GET_VIDS_ID)); + throw e; + } + auditUtil.setAuditRequestDto(AuditEnum.GET_VIDS_SUCCESS); + logger.debug("ResidentVidController::retrieveVids()::exit"); + return retrieveVids; + } } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/TransliterationController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/TransliterationController.java new file mode 100644 index 00000000000..047f5c01311 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/TransliterationController.java @@ -0,0 +1,127 @@ +package io.mosip.resident.controller; + +import io.micrometer.core.annotation.Timed; +import io.mosip.preregistration.application.dto.TransliterationRequestDTO; +import io.mosip.preregistration.application.dto.TransliterationResponseDTO; +import io.mosip.preregistration.application.service.TransliterationService; +import io.mosip.preregistration.core.common.dto.MainRequestDTO; +import io.mosip.preregistration.core.common.dto.MainResponseDTO; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +/** + * This class provides different API's to perform operations on + * Transliteration Application + * + * @author Kamesh Shekhar Prasad + * + */ +@RestController +@RequestMapping("/transliteration") +@Tag(name = "Transliteration Controller", description = "Transliteration Controller") +public class TransliterationController { + + + /** Autowired reference for {@link #transliterationService}. */ + @Autowired + private TransliterationService transliterationService; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private AuditUtil audit; + + @Autowired + private Environment environment; + + private static final String RESIDENT_TRANSLITERATION_WORKAROUND_PROPERTY = "resident-transliteration-workaround-for-%s-%s"; + private static final int LANGUAGE_LIST_SIZE = 2; + + + /** + * Post API to transliterate from transliteration application. + * + * @param requestDTO + * @return responseDto with transliterated toFieldValue. + */ + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(path = "/transliterate", consumes = MediaType.APPLICATION_JSON_VALUE,produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get Pre-Registartion-Translitration data", description = "Get Pre-Registartion-Translitration data", tags = "Transliteration Controller") + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Given key is translitrated successfully"), + @ApiResponse(responseCode = "201", description = "Created" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden" ,content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found" ,content = @Content(schema = @Schema(hidden = true)))}) + public ResponseEntity> translitrator( + @Validated @RequestBody() MainRequestDTO requestDTO) { + try { + requestValidator.validateId(requestDTO); + } catch (InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.TRANSLITERATION_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.TRANSLITERATE_ID)); + throw e; + } + String propertyValue = environment.getProperty(String.format(RESIDENT_TRANSLITERATION_WORKAROUND_PROPERTY, + requestDTO.getRequest().getFromFieldLang(), requestDTO.getRequest().getToFieldLang())); + if (propertyValue != null) { + List propertyValueList = List.of(propertyValue.split(ResidentConstants.COMMA)); + MainResponseDTO responseDTO = null; + for(String languagePair:propertyValueList){ + MainRequestDTO transliterationRequestDTOMainRequestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + List languageList = List.of(languagePair.split(ResidentConstants.HYPHEN)); + if(languageList.size() == LANGUAGE_LIST_SIZE){ + transliterationRequestDTO.setFromFieldLang(languageList.get(0)); + transliterationRequestDTO.setToFieldLang(languageList.get(1)); + if(responseDTO!=null){ + transliterationRequestDTO.setFromFieldValue(responseDTO.getResponse().getToFieldValue()); + } else { + transliterationRequestDTO.setFromFieldValue(requestDTO.getRequest().getFromFieldValue()); + } + transliterationRequestDTOMainRequestDTO.setRequest(transliterationRequestDTO); + transliterationRequestDTOMainRequestDTO.setId(requestDTO.getId()); + transliterationRequestDTOMainRequestDTO.setVersion(requestDTO.getVersion()); + transliterationRequestDTOMainRequestDTO.setRequesttime(requestDTO.getRequesttime()); + responseDTO = transliterationService.translitratorService(transliterationRequestDTOMainRequestDTO); + } + } + if(responseDTO!=null && responseDTO.getResponse()!=null){ + TransliterationResponseDTO transliterationResponseDTO = responseDTO.getResponse(); + transliterationResponseDTO.setToFieldLang(requestDTO.getRequest().getToFieldLang()); + transliterationResponseDTO.setFromFieldValue(requestDTO.getRequest().getFromFieldValue()); + transliterationResponseDTO.setFromFieldLang(requestDTO.getRequest().getFromFieldLang()); + responseDTO.setResponse(transliterationResponseDTO); + } + return ResponseEntity.status(HttpStatus.OK).body(responseDTO); + + } else { + return ResponseEntity.status(HttpStatus.OK).body(transliterationService.translitratorService(requestDTO)); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/VerificationController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/VerificationController.java new file mode 100644 index 00000000000..0d1f5b23ed4 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/VerificationController.java @@ -0,0 +1,75 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.VerificationResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.validator.RequestValidator; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@RestController +@Tag(name = "verification-controller", description = "controller for channel verification status") +public class VerificationController { + + @Autowired + private AuditUtil audit; + + @Autowired + private VerificationService verificationService; + + @Autowired + private RequestValidator validator; + + private static final Logger logger = LoggerConfiguration.logConfig(VerificationController.class); + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @GetMapping(value = "/channel/verification-status/") + @Operation(summary = "get channel verification status", description = "get channel verification status") + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public VerificationResponseDTO getChannelVerificationStatus(@RequestParam("channel") String channel, + @RequestParam("individualId") String individualId) + throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException { + logger.debug("VerificationController::getChannelVerificationStatus()::entry"); + VerificationResponseDTO verificationResponseDTO; + try { + validator.validateChannelVerificationStatus(channel, individualId); + verificationResponseDTO = verificationService.checkChannelVerificationStatus(channel, individualId); + } catch (ResidentServiceCheckedException | ResidentServiceException | InvalidInputException e) { + audit.setAuditRequestDto(AuditEnum.VERIFICATION_STATUS_FAILURE); + e.setMetadata(Map.of(ResidentConstants.REQ_RES_ID, ResidentConstants.VERIFICATION_STATUS_ID)); + throw e; + } + audit.setAuditRequestDto(AuditEnum.VERIFICATION_STATUS_SUCCESS); + logger.debug("VerificationController::getChannelVerificationStatus()::exit"); + return verificationResponseDTO; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateController.java new file mode 100644 index 00000000000..6d9c6302374 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateController.java @@ -0,0 +1,90 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.annotation.PreAuthenticateContentAndVerifyIntent; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.WebSubCredentialStatusUpdateService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * API to update the resident transaction status from the credential status + * update in the websub event. + * + * @author Loganathan S + * + */ +@RestController +@Tag(name="WebSubCredentialStatusUpdateController", description="WebSubCredentialStatusUpdateController") +public class WebSubCredentialStatusUpdateController { + + private static Logger logger = LoggerConfiguration.logConfig(WebSubCredentialStatusUpdateController.class); + + @Autowired + SubscriptionClient subscribe; + + @Autowired + private WebSubCredentialStatusUpdateService webSubCredentialStatusUpdateService; + + @Autowired + private AuditUtil auditUtil; + + @PostMapping(value = "/callback/credentialStatusUpdate", consumes = "application/json") + @Operation(summary = "WebSubCredentialStatusUpdateController", description = "WebSubCredentialStatusUpdateController", + tags = {"WebSubCredentialStatusUpdateController"}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthenticateContentAndVerifyIntent(secret = "${resident.websub.credential-status.secret}", callback = "${resident.websub.callback.credential-status.relative.url}", topic = "${resident.websub.credential-status.topic}") + public void credentialStatusUpdateCallback(@RequestBody Map eventModel) { + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubCredentialStatusUpdateController :: credentialStatusUpdateCallback() :: entry"); + webSubCredentialStatusUpdateService.updateCredentialStatus(eventModel); + auditUtil.setAuditRequestDto(AuditEnum.CREDENTIAL_STATUS_UPDATE_CALL_BACK_SUCCESS); + logger.debug("WebSubCredentialStatusUpdateController::credentialStatusUpdateCallback()::exit"); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode() + + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + auditUtil.setAuditRequestDto(AuditEnum.CREDENTIAL_STATUS_UPDATE_CALL_BACK_FAILURE); + throw new ResidentServiceException(ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage(), e); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubRegprocWorkFlowController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubRegprocWorkFlowController.java new file mode 100644 index 00000000000..acb7011d116 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubRegprocWorkFlowController.java @@ -0,0 +1,89 @@ +package io.mosip.resident.controller; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.annotation.PreAuthenticateContentAndVerifyIntent; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.WorkflowCompletedEventDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.WebSubRegprocWorkFlowService; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.AuditUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +/** + * API to update the resident transaction status from the regproc workflow event status + * update in the websub event. + * + * @author Kamesh Shekhar Prasad + * + */ +@RestController +@Tag(name="WebSubRegprocWorkFlowController", description="WebSubRegprocWorkFlowController") +public class WebSubRegprocWorkFlowController { + + private static Logger logger = LoggerConfiguration.logConfig(WebSubRegprocWorkFlowController.class); + + @Autowired + SubscriptionClient subscribe; + + @Autowired + private WebSubRegprocWorkFlowService webSubRegprocWorkFlowService; + + @Autowired + private AuditUtil auditUtil; + + @PostMapping(value = "/callback/regprocworkflow", consumes = "application/json") + @Operation(summary = "WebSubCredentialStatusUpdateController", description = "WebSubCredentialStatusUpdateController", + tags = {"WebSubCredentialStatusUpdateController"}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PreAuthenticateContentAndVerifyIntent(secret = "${resident.websub.regproc.workflow.complete.secret}", callback = "${resident.websub.callback.regproc.workflow.complete.relative.url}", topic = "${mosip.regproc.workflow.complete.topic}") + public void regProcWorkFlowCallback(@RequestBody WorkflowCompletedEventDTO workflowCompletedEventDTO) { + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubRegprocWorkFlowController :: regProcWorkFlowCallback() :: entry"); + webSubRegprocWorkFlowService.updateResidentStatus(workflowCompletedEventDTO); + auditUtil.setAuditRequestDto(AuditEnum.REG_PROC_WORK_FLOW_CALL_BACK_SUCCESS); + logger.debug("WebSubRegprocWorkFlowController::regProcWorkFlowCallback()::exit"); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.REG_PROC_WORK_FLOW_CALLBACK_NOT_AVAILABLE.getErrorCode() + + ResidentErrorCode.REG_PROC_WORK_FLOW_CALLBACK_NOT_AVAILABLE.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + auditUtil.setAuditRequestDto(AuditEnum.REG_PROC_WORK_FLOW_CALL_BACK_FAILURE); + throw new ResidentServiceException(ResidentErrorCode.REG_PROC_WORK_FLOW_CALLBACK_NOT_AVAILABLE.getErrorCode(), + ResidentErrorCode.REG_PROC_WORK_FLOW_CALLBACK_NOT_AVAILABLE.getErrorMessage(), e); + } + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubUpdateAuthTypeController.java b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubUpdateAuthTypeController.java new file mode 100644 index 00000000000..bc9211eded5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/controller/WebSubUpdateAuthTypeController.java @@ -0,0 +1,82 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.API_RESPONSE_TIME_ID; + +import java.util.Map; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import io.micrometer.core.annotation.Timed; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.annotation.PreAuthenticateContentAndVerifyIntent; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.WebSubUpdateAuthTypeService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@RestController +@Tag(name="WebSubUpdateAuthTypeController", description="WebSubUpdateAuthTypeController") +public class WebSubUpdateAuthTypeController { + + private static Logger logger = LoggerConfiguration.logConfig(WebSubUpdateAuthTypeController.class); + + @Autowired + SubscriptionClient subscribe; + + @Autowired + private WebSubUpdateAuthTypeService webSubUpdateAuthTypeService; + + @Autowired + private AuditUtil auditUtil; + + @Timed(value=API_RESPONSE_TIME_ID,description=API_RESPONSE_TIME_DESCRIPTION, percentiles = {0.5, 0.9, 0.95, 0.99} ) + @PostMapping(value = "/callback/authTypeCallback", consumes = "application/json") + @Operation(summary = "WebSubUpdateAuthTypeController", description = "WebSubUpdateAuthTypeController", + tags = {"WebSubUpdateAuthTypeController"}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true)))}) + @PreAuthenticateContentAndVerifyIntent(secret = "${resident.websub.authtype-status.secret}", callback = "${resident.websub.callback.authtype-status.relative.url}", topic = "${resident.websub.authtype-status.topic}") + public void authTypeCallback(@RequestBody Map eventModel) { + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubUpdateAuthTypeController :: authTypeCallback() :: entry"); + webSubUpdateAuthTypeService.updateAuthTypeStatus(eventModel); + auditUtil.setAuditRequestDto(AuditEnum.AUTH_TYPE_CALL_BACK_SUCCESS); + logger.debug("WebSubUpdateAuthTypeController::authTypeCallback()::exit"); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode() + + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + auditUtil.setAuditRequestDto(AuditEnum.AUTH_TYPE_CALL_BACK_FAILURE); + throw new ResidentServiceException(ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorCode(), + ResidentErrorCode.AUTH_TYPE_CALLBACK_NOT_AVAILABLE.getErrorMessage(), e); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusRequestDTO.java new file mode 100644 index 00000000000..048fb829732 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusRequestDTO.java @@ -0,0 +1,12 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class AidStatusRequestDTO { + + private String individualId; + private String otp; + private String transactionId; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusResponseDTO.java new file mode 100644 index 00000000000..256bdefe02e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AidStatusResponseDTO.java @@ -0,0 +1,13 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class AidStatusResponseDTO { + + private String individualId; + private String individualIdType; + private String transactionId; + private String aidStatus; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AttributeListDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AttributeListDto.java new file mode 100644 index 00000000000..ea0a19d92bd --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AttributeListDto.java @@ -0,0 +1,17 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; + +/** + * The attribute list dto. + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class AttributeListDto { + + private List attributes; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditRequestDTO.java index f6e8ab5897d..9ec397163d6 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditRequestDTO.java @@ -1,89 +1,89 @@ -package io.mosip.resident.dto; - -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class AuditRequestDTO { - /** The event id. */ - @NotNull - @Size(min = 1, max = 64) - private String eventId; - - /** The event name. */ - @NotNull - @Size(min = 1, max = 128) - private String eventName; - - /** The event type. */ - @NotNull - @Size(min = 1, max = 64) - private String eventType; - - /** The action time stamp. */ - @NotNull - private LocalDateTime actionTimeStamp; - - /** The host name. */ - @NotNull - @Size(min = 1, max = 32) - private String hostName; - - /** The host ip. */ - @NotNull - @Size(min = 1, max = 16) - private String hostIp; - - /** The application id. */ - @NotNull - @Size(min = 1, max = 64) - private String applicationId; - - /** The application name. */ - @NotNull - @Size(min = 1, max = 128) - private String applicationName; - - /** The session user id. */ - @NotNull - @Size(min = 1, max = 64) - private String sessionUserId; - - /** The session user name. */ - @Size(min = 1, max = 128) - private String sessionUserName; - - /** The id. */ - @NotNull - @Size(min = 1, max = 64) - - private String id; - - /** The id type. */ - @NotNull - @Size(min = 1, max = 64) - private String idType; - - /** The created by. */ - @NotNull - @Size(min = 1, max = 255) - private String createdBy; - - /** The module name. */ - @Size(max = 128) - private String moduleName; - - /** The module id. */ - @Size(max = 64) - private String moduleId; - - /** The description. */ - @Size(max = 2048) - private String description; -} +package io.mosip.resident.dto; + +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class AuditRequestDTO { + /** The event id. */ + @NotNull + @Size(min = 1, max = 64) + private String eventId; + + /** The event name. */ + @NotNull + @Size(min = 1, max = 128) + private String eventName; + + /** The event type. */ + @NotNull + @Size(min = 1, max = 64) + private String eventType; + + /** The action time stamp. */ + @NotNull + private LocalDateTime actionTimeStamp; + + /** The host name. */ + @NotNull + @Size(min = 1, max = 32) + private String hostName; + + /** The host ip. */ + @NotNull + @Size(min = 1, max = 16) + private String hostIp; + + /** The application id. */ + @NotNull + @Size(min = 1, max = 64) + private String applicationId; + + /** The application name. */ + @NotNull + @Size(min = 1, max = 128) + private String applicationName; + + /** The session user id. */ + @NotNull + @Size(min = 1, max = 64) + private String sessionUserId; + + /** The session user name. */ + @Size(min = 1, max = 128) + private String sessionUserName; + + /** The id. */ + @NotNull + @Size(min = 1, max = 64) + + private String id; + + /** The id type. */ + @NotNull + @Size(min = 1, max = 64) + private String idType; + + /** The created by. */ + @NotNull + @Size(min = 1, max = 255) + private String createdBy; + + /** The module name. */ + @Size(max = 128) + private String moduleName; + + /** The module id. */ + @Size(max = 64) + private String moduleId; + + /** The description. */ + @Size(max = 2048) + private String description; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditResponseDto.java similarity index 89% rename from resident/resident-service/src/main/java/io/mosip/resident/util/AuditResponseDto.java rename to resident/resident-service/src/main/java/io/mosip/resident/dto/AuditResponseDto.java index ccd233930ea..f04551fb9bd 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuditResponseDto.java @@ -1,4 +1,4 @@ -package io.mosip.resident.util; +package io.mosip.resident.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthError.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthError.java index 48278ff3fd3..1a40c14a938 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthError.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthError.java @@ -1,18 +1,18 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class AuthError { - - - private String errorCode; - - - private String errorMessage; - -} +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AuthError { + + + private String errorCode; + + + private String errorMessage; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryRequestDTO.java index a53d5406451..97bea3b8e37 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryRequestDTO.java @@ -1,22 +1,22 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class AuthHistoryRequestDTO { - - private String transactionID; - - private String individualId; - - private String otp; - - private String pageStart; - - private String pageFetch; - -} +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AuthHistoryRequestDTO { + + private String transactionID; + + private String individualId; + + private String otp; + + private String pageStart; + + private String pageFetch; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryResponseDTO.java index 4059199536d..65450f06a53 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthHistoryResponseDTO.java @@ -1,16 +1,16 @@ -package io.mosip.resident.dto; - -import java.util.List; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; - -@Data -@Getter -@Setter -public class AuthHistoryResponseDTO { - private List authHistory; - - private String message; -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Getter +@Setter +public class AuthHistoryResponseDTO { + private List authHistory; + + private String message; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDto.java index 4f13acc3d81..06b69958103 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDto.java @@ -1,31 +1,31 @@ -/** - * - */ -package io.mosip.resident.dto; - -import java.io.Serializable; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -import lombok.Data; - -/** - * @author M1022006 - * - */ -@Data -@JsonPropertyOrder({ "transactionID", "individualId", "individualIdType", "otp", "authType" }) -public class AuthLockOrUnLockRequestDto implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1L; - - private String transactionID; - private String individualId; - private String otp; - private List authType; - -} +/** + * + */ +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import lombok.Data; + +/** + * @author M1022006 + * + */ +@Data +@JsonPropertyOrder({ "transactionID", "individualId", "individualIdType", "otp", "authTypes" }) +public class AuthLockOrUnLockRequestDto implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String transactionID; + private String individualId; + private String otp; + private List authType; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDtoV2.java new file mode 100644 index 00000000000..24be2d19989 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockOrUnLockRequestDtoV2.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import lombok.Data; + + +@Data +@JsonPropertyOrder({ "authTypes" }) +public class AuthLockOrUnLockRequestDtoV2 implements Serializable { + + private static final long serialVersionUID = 1L; + private List authTypes; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockStatusResponseDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockStatusResponseDtoV2.java new file mode 100644 index 00000000000..a36f4937530 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockStatusResponseDtoV2.java @@ -0,0 +1,19 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * This dto is used for conversion of an object. + * + * @author Ritik Jain + */ +@Data +public class AuthLockStatusResponseDtoV2 implements Serializable { + + private static final long serialVersionUID = 5863264708458118491L; + private List authTypes; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockTypeStatusDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockTypeStatusDtoV2.java new file mode 100644 index 00000000000..acba730667a --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthLockTypeStatusDtoV2.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * This dto is used for conversion of an object. + * + * @author Ritik Jain + */ +@Data +@EqualsAndHashCode(callSuper=true) +public class AuthLockTypeStatusDtoV2 extends AuthTypeStatusDtoV2 { + + private String requestId; + private String metadata; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthResponseDTO.java index acf2a76bca6..2f0fb104ba8 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthResponseDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.util.List; +import lombok.Data; + @Data public class AuthResponseDTO extends BaseAuthResponseDTO { diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTxnDetailsDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTxnDetailsDTO.java index cb359ea18ef..243678d5385 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTxnDetailsDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTxnDetailsDTO.java @@ -1,20 +1,20 @@ -package io.mosip.resident.dto; - -import lombok.Data; -import lombok.Getter; -import lombok.Setter; -@Data -@Getter -@Setter -public class AuthTxnDetailsDTO { - private int serialNumber; - private String idUsed; - private String authModality; - private String date; - private String time; - private String partnerName; - private String partnerTransactionId; - private String authResponse; - private String responseCode; -} - +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +@Data +@Getter +@Setter +public class AuthTxnDetailsDTO { + private int serialNumber; + private String idUsed; + private String authModality; + private String date; + private String time; + private String partnerName; + private String partnerTransactionId; + private String authResponse; + private String responseCode; +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDto.java new file mode 100644 index 00000000000..65575876175 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDto.java @@ -0,0 +1,14 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class AuthTypeStatusDto { + + private String authType; + private boolean locked; + private Long unlockForSeconds; + public boolean getLocked() { + return locked; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDtoV2.java new file mode 100644 index 00000000000..a8e0d3cb4b8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusDtoV2.java @@ -0,0 +1,12 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper=true) +public class AuthTypeStatusDtoV2 extends AuthTypeStatusDto { + + private String authSubType; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusRequestDto.java index 085b1b2a389..5aa48994af1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusRequestDto.java @@ -1,28 +1,28 @@ -/** - * - */ -package io.mosip.resident.dto; - -import java.util.List; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @author M1022006 - * - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class AuthTypeStatusRequestDto extends BaseAuthRequestDTO { - - private String individualId; - - private String individualIdType; - - private List request; - - private String requestTime; - - private String version; -} +/** + * + */ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author M1022006 + * + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AuthTypeStatusRequestDto extends BaseAuthRequestDTO { + + private String individualId; + + private String individualIdType; + + private List request; + + private String requestTime; + + private String version; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusResponseDto.java index ce0ddec18f4..123fe9335fb 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthTypeStatusResponseDto.java @@ -1,18 +1,18 @@ -package io.mosip.resident.dto; - -import java.util.List; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -public class AuthTypeStatusResponseDto extends BaseResponseDTO { - - /** - * - */ - private static final long serialVersionUID = 1L; - private List errors; - -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class AuthTypeStatusResponseDto extends BaseResponseDTO { + + /** + * + */ + private static final long serialVersionUID = 1L; + private List errors; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthenticatedAuditRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthenticatedAuditRequestDto.java new file mode 100644 index 00000000000..0eb5241e378 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthenticatedAuditRequestDto.java @@ -0,0 +1,74 @@ +package io.mosip.resident.dto; + +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * The authenticated audit request dto. + * + * @author Ritik Jain + */ +@Data +@NoArgsConstructor +public class AuthenticatedAuditRequestDto { + + /** The event id. */ + @NotNull + @Size(min = 1, max = 64) + private String auditEventId; + + /** The event name. */ + @NotNull + @Size(min = 1, max = 128) + private String auditEventName; + + /** The event type. */ + @NotNull + @Size(min = 1, max = 64) + private String auditEventType; + + /** The action time stamp. */ + @NotNull + private LocalDateTime actionTimeStamp; + + /** The application id. */ + @NotNull + @Size(min = 1, max = 64) + private String applicationId; + + /** The application name. */ + @NotNull + @Size(min = 1, max = 128) + private String applicationName; + + /** The session user id. */ + @NotNull + @Size(min = 1, max = 64) + private String sessionUserId; + + /** The session user name. */ + @Size(min = 1, max = 128) + private String sessionUserName; + + /** The created by. */ + @NotNull + @Size(min = 1, max = 255) + private String createdBy; + + /** The module name. */ + @Size(max = 128) + private String moduleName; + + /** The module id. */ + @Size(max = 64) + private String moduleId; + + /** The description. */ + @Size(max = 2048) + private String description; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthorizedScopesDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthorizedScopesDto.java new file mode 100644 index 00000000000..66e3c6eff77 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AuthorizedScopesDto.java @@ -0,0 +1,61 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import lombok.Getter; +import lombok.Setter; + +@Component("authorizedScopes") +@ConfigurationProperties(prefix = "mosip.scope.resident") +@Getter +@Setter +public class AuthorizedScopesDto { + + private List getinputattributevalues; + + private List patchrevokevid; + + private List postgeneratevid; + + private List getvids; + + private List postAuthTypeStatus; + + private List postAuthTypeUnlock; + + private List getAuthLockStatus; + + private List patchUpdateUin; + + private List getServiceAuthHistoryRoles; + + private List getDownloadCard; + + private List postSendPhysicalCard; + + private List getUnreadServiceList; + + private List getNotificationCount; + + private List getNotificationClick; + + private List getupdatedttimes; + + private List postPinStatus; + + private List postUnPinStatus; + + private List postRequestDownloadPersonalizedCard; + + private List postRequestShareCredWithPartner; + + private List postDownloadCard; + + private List getOrderRedirect; + + private List postPersonalizedCard; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnDto.java index e26f14b7769..0ada410a353 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnDto.java @@ -1,18 +1,19 @@ -package io.mosip.resident.dto; - -import java.time.LocalDateTime; -import lombok.Data; - -@Data -public class AutnTxnDto { - - String transactionID; - LocalDateTime requestdatetime; - String authtypeCode; - String statusCode; - String statusComment; - String referenceIdType; - String entityName; - - +package io.mosip.resident.dto; + +import java.time.LocalDateTime; + +import lombok.Data; + +@Data +public class AutnTxnDto { + + String transactionID; + LocalDateTime requestdatetime; + String authtypeCode; + String statusCode; + String statusComment; + String referenceIdType; + String entityName; + + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnResponseDto.java index 11f544e648c..343f77fc144 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/AutnTxnResponseDto.java @@ -1,28 +1,27 @@ -package io.mosip.resident.dto; - -import java.util.List; -import java.util.Map; - - -import lombok.Data; - -@Data -public class AutnTxnResponseDto { - - /** Variable To hold id */ - private String id; - - /** Variable To hold version */ - private String version; - - /** The error List */ - private List errors; - - /** List to hold AutnTxnDto */ - private Map> response; - /** The id. */ - - /** The resTime value */ - private String responseTime; - -} +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +@Data +public class AutnTxnResponseDto { + + /** Variable To hold id */ + private String id; + + /** Variable To hold version */ + private String version; + + /** The error List */ + private List errors; + + /** List to hold AutnTxnDto */ + private Map> response; + /** The id. */ + + /** The resTime value */ + private String responseTime; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseDTO.java index 2aa975aad82..6004b4b04c5 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * The base DTO class that would be extended by all DTOs in Registration Module. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestDTO.java index 2ee48b185e7..c8c13d99d44 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * Instantiates a new base request response DTO. * @author Monobikash Das diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestResponseDTO.java index 3dbc58fea05..51492fdbb68 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRequestResponseDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.util.List; +import lombok.Data; + /** * The Class ResponseDTO. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseResponseDTO.java index 5a729a5c2ca..e84ba225e36 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseResponseDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * Instantiates a new base request response DTO. * @author Monobikash Das diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestRequestDTO.java index eae46f56183..f77763ae7d6 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestRequestDTO.java @@ -1,13 +1,12 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import java.io.Serializable; - /** * Instantiates a new base request response DTO. * @author Rishabh Keshari diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestResponseDTO.java index fcd8c23c01c..1999dcd25f3 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseRestResponseDTO.java @@ -1,12 +1,12 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import java.io.Serializable; - /** * Instantiates a new base request response DTO. * @author Rishabh Keshari diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRequestDto.java new file mode 100644 index 00000000000..30908b81364 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRequestDto.java @@ -0,0 +1,17 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class BaseVidRequestDto implements ObjectWithTransactionID, Serializable { + + /** + * + */ + private static final long serialVersionUID = -8904379407961043321L; + private String transactionID; + private String vidType; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRevokeRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRevokeRequestDTO.java new file mode 100644 index 00000000000..a40c40fc443 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BaseVidRevokeRequestDTO.java @@ -0,0 +1,22 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Data +@Getter +@Setter +public class BaseVidRevokeRequestDTO implements Serializable, ObjectWithTransactionID { + + + + /** + * + */ + private static final long serialVersionUID = 583135967031612906L; + private String transactionID; + private String vidStatus; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BellNotificationDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BellNotificationDto.java new file mode 100644 index 00000000000..4746f0b3fb8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BellNotificationDto.java @@ -0,0 +1,12 @@ +package io.mosip.resident.dto; + +import java.time.LocalDateTime; + +import lombok.Data; + +@Data +public class BellNotificationDto { + /** The timestamp. */ + + private LocalDateTime lastbellnotifclicktime; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/BiometricRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/BiometricRequestDto.java index 9c6cad84619..ece33f47b36 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/BiometricRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/BiometricRequestDto.java @@ -1,12 +1,12 @@ package io.mosip.resident.dto; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.List; - @Data @EqualsAndHashCode @AllArgsConstructor diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/CheckStatusResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/CheckStatusResponseDTO.java new file mode 100644 index 00000000000..f57b7c45f0c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/CheckStatusResponseDTO.java @@ -0,0 +1,16 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * This class is used to provide response dto of check status for aid. + * + * @author Kamesh Shekhar Prasad + * + */ + +@Data +public class CheckStatusResponseDTO { + private String transactionStage; + private String aidStatus; +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialReqestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialReqestDto.java index db917dd58dc..d76b0d3d775 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialReqestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialReqestDto.java @@ -13,20 +13,22 @@ public class CredentialReqestDto { private String id; - + private String credentialType; - + private boolean encrypt; - + private String issuer; private String encryptionKey; - + private String recepiant; - + private String user; - - private List sharableAttributes; - - private Map additionalData; + + private List sharableAttributes; + + private Map additionalData; + + private String consent; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialTypeResponse.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialTypeResponse.java index 7091a531d2e..aca9fbfc73b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialTypeResponse.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/CredentialTypeResponse.java @@ -1,12 +1,12 @@ -package io.mosip.resident.dto; - -import java.util.List; - -import lombok.Data; - -@Data -public class CredentialTypeResponse { - - List credentialTypes; - -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; + +@Data +public class CredentialTypeResponse { + + List credentialTypes; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerRequestDto.java index eafbd9aa760..b3c0cb376bc 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerRequestDto.java @@ -1,58 +1,58 @@ -/* - * - * - * - * - */ -package io.mosip.resident.dto; - -import java.time.LocalDateTime; - -import javax.validation.constraints.NotNull; - -import io.swagger.annotations.ApiModel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Crypto-Manager-Request model - * - * @author Urvil Joshi - * - * @since 1.0.0 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@ApiModel(description = "Model representing a Crypto-Manager-Service Request") -public class CryptomanagerRequestDto { - /** - * Application id of decrypting module - */ - - private String applicationId; - /** - * Refrence Id - */ - - private String referenceId; - /** - * Timestamp - */ - - @NotNull - private LocalDateTime timeStamp; - /** - * Data in BASE64 encoding to encrypt/decrypt - */ - - private String data; - - private Boolean prependThumbprint; - - private String aad; - - private String salt; - -} +/* + * + * + * + * + */ +package io.mosip.resident.dto; + +import java.time.LocalDateTime; + +import javax.validation.constraints.NotNull; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Crypto-Manager-Request model + * + * @author Urvil Joshi + * + * @since 1.0.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "Model representing a Crypto-Manager-Service Request") +public class CryptomanagerRequestDto { + /** + * Application id of decrypting module + */ + + private String applicationId; + /** + * Refrence Id + */ + + private String referenceId; + /** + * Timestamp + */ + + @NotNull + private LocalDateTime timeStamp; + /** + * Data in BASE64 encoding to encrypt/decrypt + */ + + private String data; + + private Boolean prependThumbprint; + + private String aad; + + private String salt; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerResponseDto.java index 60ff210ceed..39925336790 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/CryptomanagerResponseDto.java @@ -1,18 +1,18 @@ -package io.mosip.resident.dto; - - - -import io.mosip.kernel.core.http.ResponseWrapper; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * - * @author Sowmya - * - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class CryptomanagerResponseDto extends ResponseWrapper { - -} +package io.mosip.resident.dto; + + + +import io.mosip.kernel.core.http.ResponseWrapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + * @author Sowmya + * + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CryptomanagerResponseDto extends ResponseWrapper { + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DigitalCardStatusResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DigitalCardStatusResponseDto.java new file mode 100644 index 00000000000..7f9bedfdad2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DigitalCardStatusResponseDto.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Kamesh Shekhar Prasad + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DigitalCardStatusResponseDto { + + private String id; + + private String statusCode; + + private String url; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentDTO.java new file mode 100644 index 00000000000..e29bc0dcc71 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentDTO.java @@ -0,0 +1,30 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; + +import lombok.NoArgsConstructor; + +/** + * This DTO class is used to accept the response values for document upload. + * @author Kamesh Shekhar Prasad + */ +@NoArgsConstructor +public class DocumentDTO implements Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 7070542323407937205L; + + /** + * File content + */ + private byte[] document; + + public byte[] getDocument() { + return document !=null ? document.clone():null; + } + + public void setDocument(byte[] document) { + this.document =document!=null ? document.clone():null; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentRequestDTO.java new file mode 100644 index 00000000000..ec65800b316 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentRequestDTO.java @@ -0,0 +1,22 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * DocumentRequestDTO is a class that has three fields: docCatCode, docTypCode, + * and langCode + * + * @author Manoj SP + */ +@Data +public class DocumentRequestDTO { + + private String docCatCode; + + private String docTypCode; + + private String langCode; + + private String referenceId; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentResponseDTO.java new file mode 100644 index 00000000000..01960f52a8b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DocumentResponseDTO.java @@ -0,0 +1,31 @@ +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * DocumentResponseDTO is a class that has a String transactionId, a String + * docId, a String docName, a + * String docCatCode, a String docTypCode, and a String docFileFormat. + * + * @author Manoj SP + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DocumentResponseDTO { + + private String transactionId; + + private String docId; + + private String docName; + + private String docCatCode; + + private String docTypCode; + + private String docFileFormat; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadCardRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadCardRequestDTO.java new file mode 100644 index 00000000000..1e1860e1da7 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadCardRequestDTO.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + * This class is used a request DTO for download card API. + */ +@Data +public class DownloadCardRequestDTO { + + private String transactionId; + + private String individualId; + + private String otp; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadPersonalizedCardDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadPersonalizedCardDto.java new file mode 100644 index 00000000000..4d896b31c26 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DownloadPersonalizedCardDto.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + * This class is used a request DTO for download html 2 pdf API. + */ +@Data +public class DownloadPersonalizedCardDto { + + private String html; + + private List attributes; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResidentResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResidentResponseDto.java new file mode 100644 index 00000000000..3fd0d90e509 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResidentResponseDto.java @@ -0,0 +1,15 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +import java.util.List; + +/** + * The DraftResponseDto. + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class DraftResidentResponseDto { + private List drafts; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResponseDto.java new file mode 100644 index 00000000000..b38f73d5fd2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftResponseDto.java @@ -0,0 +1,15 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +import java.util.List; + +/** + * The DraftResponseDto. + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class DraftResponseDto { + private List drafts; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResidentResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResidentResponseDto.java new file mode 100644 index 00000000000..99fe0c49344 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResidentResponseDto.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +import java.util.List; + +/** + * The DraftUinResponseDto. + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class DraftUinResidentResponseDto { + private String eid; + private String aid; + private String createdDTimes; + private List attributes; + private boolean cancellable; + private String description; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResponseDto.java new file mode 100644 index 00000000000..7af87972ed5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DraftUinResponseDto.java @@ -0,0 +1,17 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +import java.util.List; + +/** + * The DraftUinResponseDto. + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class DraftUinResponseDto { + private String rid; + private String createdDTimes; + private List attributes; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldCodeValueDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldCodeValueDTO.java new file mode 100644 index 00000000000..9c4a4b14400 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldCodeValueDTO.java @@ -0,0 +1,23 @@ +package io.mosip.resident.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Kamesh Shekhar Prasad + * Dynamic Field Code value Dto + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class DynamicFieldCodeValueDTO { + + private String code; + + private String value; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldConsolidateResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldConsolidateResponseDto.java new file mode 100644 index 00000000000..7eb525a7e16 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/DynamicFieldConsolidateResponseDto.java @@ -0,0 +1,26 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Kamesh Shekhar Prasad + * Dynamic Field Consolidate Response Dto + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(description = "Model representing a response of dynamic field get by name Request") +public class DynamicFieldConsolidateResponseDto { + + private String name; + + private String description; + + private List values; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/EncryptResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/EncryptResponseDto.java index 87d18909bea..0fd88cf0244 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/EncryptResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/EncryptResponseDto.java @@ -1,14 +1,14 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class EncryptResponseDto { - - private String data; - -} +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EncryptResponseDto { + + private String data; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ErrorDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ErrorDTO.java index 1c922506ac7..846f2e1aa6a 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ErrorDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ErrorDTO.java @@ -1,11 +1,11 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.io.Serializable; - /** * Instantiates a new error DTO. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/EuinRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/EuinRequestDTO.java index 8f37202f0b3..96bf798efed 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/EuinRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/EuinRequestDTO.java @@ -1,29 +1,25 @@ -package io.mosip.resident.dto; - - -import java.io.Serializable; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import io.mosip.resident.constant.IdType; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class EuinRequestDTO implements Serializable { - private static final long serialVersionUID = -4492209826585681216L; - - private String transactionID; - - private String individualId; - - private String individualIdType; - - private String cardType; - - private String otp; -} +package io.mosip.resident.dto; + + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EuinRequestDTO implements Serializable { + private static final long serialVersionUID = -4492209826585681216L; + + private String transactionID; + + private String individualId; + + private String individualIdType; + + private String cardType; + + private String otp; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/EventStatusResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/EventStatusResponseDTO.java new file mode 100644 index 00000000000..4494e3b006d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/EventStatusResponseDTO.java @@ -0,0 +1,25 @@ +package io.mosip.resident.dto; + +import java.util.Map; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + * This class is used to test the TemplateUtil class + * @author Kamesh Shekhar Prasad + */ + +@Data +@Getter +@Setter +public class EventStatusResponseDTO { + private String eventId; + private String eventType; + private String eventStatus; + private String individualId; + private String summary; + private String timestamp; + private Map info; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ExceptionJSONInfoDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ExceptionJSONInfoDTO.java new file mode 100644 index 00000000000..d203f495f0c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ExceptionJSONInfoDTO.java @@ -0,0 +1,37 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * This DTO class defines the errorcodes and errormessages during exception handling. + * + * @author Kamesh Shekhar Prasad + * @since 1.0.0 + */ +@Getter +@Setter +@NoArgsConstructor +@ToString +@AllArgsConstructor +public class ExceptionJSONInfoDTO implements Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 3999014525078508265L; + + /** + * Error Code + */ + private String errorCode; + + /** + * Error Message + */ + private String message; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldDtos.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldDtos.java index d5ddbfde6ea..670c44ed77d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldDtos.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldDtos.java @@ -1,12 +1,12 @@ package io.mosip.resident.dto; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.List; - @Data @EqualsAndHashCode @AllArgsConstructor diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldResponseDto.java index 3a6db5fdb31..69d1544cc2d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/FieldResponseDto.java @@ -1,12 +1,12 @@ package io.mosip.resident.dto; +import java.util.Map; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.Map; - @Data @EqualsAndHashCode @AllArgsConstructor diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/GenderCodeResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/GenderCodeResponseDTO.java new file mode 100644 index 00000000000..56b9489b5a5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/GenderCodeResponseDTO.java @@ -0,0 +1,19 @@ +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Resident proxy masterdata Gender API DTO. + * + * @author Neha Farheen + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GenderCodeResponseDTO { + + private String genderCode; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/GenerateVidResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/GenerateVidResponseDto.java new file mode 100644 index 00000000000..180bb12a5b1 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/GenerateVidResponseDto.java @@ -0,0 +1,21 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * The generate vid response dto. + * + * @author Ritik Jain + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GenerateVidResponseDto extends VidResponseDtoV2 { + + /** + * + */ + private static final long serialVersionUID = 5728940858748492895L; + private String status; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/GrievanceRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/GrievanceRequestDTO.java new file mode 100644 index 00000000000..38606ea6a8b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/GrievanceRequestDTO.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + * This class is used a request DTO for grievance tiket API. + */ +@Data +public class GrievanceRequestDTO { + private String eventId; + private String name; + private String emailId; + private String alternateEmailId; + private String phoneNo; + private String alternatePhoneNo; + private String message; +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IVidRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IVidRequestDto.java new file mode 100644 index 00000000000..56e4d0b2c67 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IVidRequestDto.java @@ -0,0 +1,11 @@ +package io.mosip.resident.dto; + +public interface IVidRequestDto { + T getRequest(); + + String getRequesttime(); + + String getId(); + + String getVersion(); +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthRequestDto.java new file mode 100644 index 00000000000..33f8fc4496c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthRequestDto.java @@ -0,0 +1,12 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class IdAuthRequestDto { + + private String transactionId; + private String individualId; + private String otp; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthResponseDto.java index 84959877972..efe74fe6aed 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdAuthResponseDto.java @@ -5,5 +5,6 @@ @Data public class IdAuthResponseDto { - private boolean authStatus; + private boolean authStatus; + private String transactionId; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdRepoResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdRepoResponseDto.java index dc8c5bd930f..62bbf66fe36 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdRepoResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdRepoResponseDto.java @@ -3,7 +3,6 @@ import java.io.Serializable; import java.util.List; -import io.mosip.kernel.core.http.ResponseWrapper; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdResponseDTO.java index 0e02ddde7bb..0ded84c4e55 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdResponseDTO.java @@ -1,11 +1,12 @@ package io.mosip.resident.dto; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFilter; + import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - /** * The Class IdResponseDTO. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IdentityDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdentityDTO.java new file mode 100644 index 00000000000..5101333635f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IdentityDTO.java @@ -0,0 +1,101 @@ +package io.mosip.resident.dto; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@EqualsAndHashCode(callSuper=true) +@ToString(callSuper = true) +public class IdentityDTO extends LinkedHashMap{ + + /** + * + */ + private static final long serialVersionUID = -6419255998877306908L; + + public static final String UIN ="UIN"; + public static final String EMAIL ="email"; + public static final String PHONE ="phone"; + public static final String YEAR_OF_BIRTH ="yearOfBirth"; + public static final String FULL_NAME ="fullName"; + public static final String FACE ="face"; + public static final String DATE_OF_BIRTH ="dateOfBirth"; + private Map attributes = new HashMap<>(10); + + public String getFullName() { + return this.getAttribute(FULL_NAME); + } + + public String getEmail() { + return this.getAttribute(EMAIL); + } + + public String getPhone() { + return this.getAttribute(PHONE); + } + + public String getYearOfBirth() { + return this.getAttribute(YEAR_OF_BIRTH); + } + + public String getUIN() { + return this.getAttribute(UIN); + } + + public String getFace() { + return this.getAttribute(FACE); + } + + public String getDateOfBirth() { + return this.getAttribute(DATE_OF_BIRTH); + } + + public void setFullName(String value) { + this.put(FULL_NAME, value); + } + + public void setEmail(String value) { + this.put(EMAIL, value); + } + + + public void setPhone(String value) { + this.put(PHONE, value); + } + + public void setYearOfBirth(String value) { + this.put(YEAR_OF_BIRTH, value); + } + + public void setUIN(String value) { + this.put(UIN, value); + } + + public void setFace(String value) { + this.put(FACE, value); + } + + public void setDateOfBirth(String value) { + this.put(DATE_OF_BIRTH, value); + } + + public String getAttribute(String attributeName) { + return this.get(attributeName) == null ? null : String.valueOf(this.get(attributeName)); + } + + public void setAttribute(String attributeName, String value) { + this.put(attributeName, value); + } + + public void putAllAttributes(Map attributesMap) { + if(attributesMap != null) { + this.putAll(attributesMap); + } + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdOtpRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdOtpRequestDTO.java new file mode 100644 index 00000000000..08326709579 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdOtpRequestDTO.java @@ -0,0 +1,38 @@ +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * This class is used to provide request for OTP generation. + * + * @author Aiham Hasan + * + */ + +@Data +public class IndividualIdOtpRequestDTO { + + /** Variable to hold id */ + private String id; + + /** Variable to hold version */ + private String version; + + /** Variable to hold Transaction ID */ + private String transactionId; + + /** Variable to hold Request time */ + private String requestTime; + + /** Variable to hold individualID */ + private String individualId; + + private List otpChannel; + + private Map metadata; + + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdResponseDto.java new file mode 100644 index 00000000000..d035fb1839e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/IndividualIdResponseDto.java @@ -0,0 +1,31 @@ +/** + * + */ +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * @author Aiham Hasan + * + */ +@Data +public class IndividualIdResponseDto { + + private String id; + + private String version; + + private String transactionId; + + private String responseTime; + + private List errors; + + private MaskedResponseDTO response; + + private Map metadata; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/Issuer.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/Issuer.java index ac0312608c2..8b19fa77ef9 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/Issuer.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/Issuer.java @@ -1,10 +1,10 @@ -package io.mosip.resident.dto; - -import lombok.Data; - -@Data -public class Issuer { - - private String code; - private String name; -} +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class Issuer { + + private String code; + private String name; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/LocationImmediateChildrenResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/LocationImmediateChildrenResponseDto.java new file mode 100644 index 00000000000..408498e6e10 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/LocationImmediateChildrenResponseDto.java @@ -0,0 +1,14 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author Kamesh Shekhar Prasad + */ +@Data +public class LocationImmediateChildrenResponseDto { + Map>> locations; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/LostRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/LostRequestDto.java index 1360322eaa5..05b6bcee271 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/LostRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/LostRequestDto.java @@ -3,10 +3,10 @@ */ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * The Class LostRequestDto. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/LostResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/LostResponseDto.java index 787184a8a38..dc96853cf6c 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/LostResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/LostResponseDto.java @@ -3,10 +3,10 @@ */ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * @author M1022006 * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateRequestDTO.java index 3cf7a5f7857..47f0948b4f1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateRequestDTO.java @@ -1,31 +1,29 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.io.Serializable; -import java.util.Map; - -/** - * This class is used to create machine in the master data service. - * - * @author Abubacker Siddik - */ - -@Data -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -public class MachineCreateRequestDTO extends BaseRestRequestDTO { - - private Map metadata; - - /** - * Variable to hold machine data - */ - private MachineDto request; - +package io.mosip.resident.dto; + +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * This class is used to create machine in the master data service. + * + * @author Abubacker Siddik + */ + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class MachineCreateRequestDTO extends BaseRestRequestDTO { + + private Map metadata; + + /** + * Variable to hold machine data + */ + private MachineDto request; + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateResponseDTO.java index dc108e96a06..271e447221f 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineCreateResponseDTO.java @@ -1,34 +1,36 @@ -package io.mosip.resident.dto; - -import lombok.*; -import lombok.experimental.SuperBuilder; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -/** - * This class is used to get machine data from the master data service. - * - * @author Abubacker Siddik - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class MachineCreateResponseDTO extends BaseRestResponseDTO { - - private Map metadata; - - /** - * Variable to hold machine data - */ - private MachineDto response; - /** - * The error. - */ - private List errors; - +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +/** + * This class is used to get machine data from the master data service. + * + * @author Abubacker Siddik + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MachineCreateResponseDTO extends BaseRestResponseDTO { + + private Map metadata; + + /** + * Variable to hold machine data + */ + private MachineDto response; + /** + * The error. + */ + private List errors; + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineErrorDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineErrorDTO.java index 7dd2e4775f4..9b7b2814d51 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineErrorDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineErrorDTO.java @@ -1,13 +1,14 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import com.fasterxml.jackson.annotation.JsonPropertyOrder; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.io.Serializable; - @Getter @Setter @NoArgsConstructor diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineResponseDto.java index ccfdd6186be..2d3602ea356 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineResponseDto.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; import java.util.List; +import lombok.Data; + /** * * @author Sowmya diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchRequestDTO.java index ea011ce2a46..9471df162d7 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchRequestDTO.java @@ -1,65 +1,64 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -/** - * This class is used to search machine data from master data service. - * - * @author Abubacker Siddik - */ - -@Data -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -public class MachineSearchRequestDTO extends BaseRestRequestDTO { - - private Map metadata; - - /** - * Variable to hold request - */ - private MachineSearchRequest request; - - @Data - @Builder - public static class MachineSearchRequest { - private String languageCode; - private MachineSearchPagination pagination; - private List sort; - private List filters; - } - - @Data - @Builder - public static class MachineSearchPagination { - private int pageStart; - private int pageFetch; - } - - @Data - @Builder - public static class MachineSearchSort { - private String sortField; - private String sortType; - } - - @Data - @Builder - public static class MachineSearchFilter { - private String value; - private String fromValue; - private String toValue; - private String columnName; - private String type; - } - +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * This class is used to search machine data from master data service. + * + * @author Abubacker Siddik + */ + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class MachineSearchRequestDTO extends BaseRestRequestDTO { + + private Map metadata; + + /** + * Variable to hold request + */ + private MachineSearchRequest request; + + @Data + @Builder + public static class MachineSearchRequest { + private String languageCode; + private MachineSearchPagination pagination; + private List sort; + private List filters; + } + + @Data + @Builder + public static class MachineSearchPagination { + private int pageStart; + private int pageFetch; + } + + @Data + @Builder + public static class MachineSearchSort { + private String sortField; + private String sortType; + } + + @Data + @Builder + public static class MachineSearchFilter { + private String value; + private String fromValue; + private String toValue; + private String columnName; + private String type; + } + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchResponseDTO.java index 5c9e1de5e1b..cd9746dfa38 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MachineSearchResponseDTO.java @@ -1,44 +1,48 @@ -package io.mosip.resident.dto; - -import lombok.*; -import lombok.experimental.SuperBuilder; - -import java.util.List; -import java.util.Map; - -/** - * This class is used to search machine data from master data service. - * - * @author Abubacker Siddik - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class MachineSearchResponseDTO extends BaseRestResponseDTO { - - private Map metadata; - - /** - * Variable to hold machine data - */ - private MachineSearchDto response; - - /** - * The error. - */ - private List errors; - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class MachineSearchDto { - private int fromRecord; - private int toRecord; - private int totalRecord; - private List data; - } +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +/** + * This class is used to search machine data from master data service. + * + * @author Abubacker Siddik + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MachineSearchResponseDTO extends BaseRestResponseDTO { + + private Map metadata; + + /** + * Variable to hold machine data + */ + private MachineSearchDto response; + + /** + * The error. + */ + private List errors; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class MachineSearchDto { + private int fromRecord; + private int toRecord; + private int totalRecord; + private List data; + } } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MainRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MainRequestDTO.java new file mode 100644 index 00000000000..670829b7ca8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MainRequestDTO.java @@ -0,0 +1,63 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * This DTO class is used to define the initial request parameters. + * + * @author Kamesh Shekhar Prasad + * @since 1.0.0 + * + */ +@Getter +@Setter +@NoArgsConstructor +@ToString +public class MainRequestDTO implements Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -4966448852014107698L; + + /** + * Id + */ + @ApiModelProperty(value = "request id", position = 1) + private String id; + /** + * version + */ + @ApiModelProperty(value = "request version", position = 2) + private String version; + /** + * Request Date Time + */ + + @ApiModelProperty(value = "request time", position = 3) + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + @Setter(AccessLevel.NONE) + @Getter(AccessLevel.NONE) + private Date requesttime; + /** + * Request Object + */ + @ApiModelProperty(value = "request", position = 4) + private T request; + + public Date getRequesttime() { + return requesttime!=null ? new Date(requesttime.getTime()):null; + } + public void setRequesttime(Date requesttime) { + this.requesttime =requesttime!=null ? new Date(requesttime.getTime()):null; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MainResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MainResponseDTO.java new file mode 100644 index 00000000000..474735c9457 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MainResponseDTO.java @@ -0,0 +1,47 @@ +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.List; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * + * @author Kamesh Shekhar Prasad + * @since 1.0.0 + * + * @param + */ +@Getter +@Setter +@NoArgsConstructor +@ToString +public class MainResponseDTO implements Serializable{ + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 3384945682672832638L; + /** + * Id + */ + @ApiModelProperty(value = "request id", position = 1) + private String id; + /** + * version + */ + @ApiModelProperty(value = "request version", position = 2) + private String version; + + @ApiModelProperty(value = "Response Time", position = 3) + private String responsetime; + + @ApiModelProperty(value = "Response", position = 4) + private T response; + + /** The error details. */ + @ApiModelProperty(value = "Error Details", position = 5) + private List errors; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/MaskedResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/MaskedResponseDTO.java index 259e7ed7b7a..8efd8199230 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/MaskedResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/MaskedResponseDTO.java @@ -1,24 +1,24 @@ -package io.mosip.resident.dto; - -import lombok.Data; - -/** - * General-purpose of {@code MaskedResponseDTO} class used to provide - * MaskedResponse Info's - * - * @author Dinesh Karuppiah.T - */ -@Data -public class MaskedResponseDTO { - - /** - * masked mobile(i.e XXXXXXX123) number where send OTP - */ - private String maskedMobile; - - /** - * masked email id(raXXXXXXXXXan@xyz.com) where send OTP - */ - private String maskedEmail; - -} +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * General-purpose of {@code MaskedResponseDTO} class used to provide + * MaskedResponse Info's + * + * @author Dinesh Karuppiah.T + */ +@Data +public class MaskedResponseDTO { + + /** + * masked mobile(i.e XXXXXXX123) number where send OTP + */ + private String maskedMobile; + + /** + * masked email id(raXXXXXXXXXan@xyz.com) where send OTP + */ + private String maskedEmail; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationRequestDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationRequestDtoV2.java new file mode 100644 index 00000000000..5d6a8d77bc3 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationRequestDtoV2.java @@ -0,0 +1,37 @@ +package io.mosip.resident.dto; + +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateType; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) + +public class NotificationRequestDtoV2 extends NotificationRequestDto { + + private static final long serialVersionUID = -7927715532425021119L; + private TemplateType templateType; + private RequestType requestType; + private String eventId; + + private String otp; + + public NotificationRequestDtoV2(TemplateType templateType, RequestType requestType, String eventId) { + this.templateType = templateType; + this.requestType = requestType; + this.eventId = eventId; + } + + public NotificationRequestDtoV2(TemplateType templateType, RequestType requestType, String eventId, String otp) { + this.templateType = templateType; + this.requestType = requestType; + this.eventId = eventId; + this.otp = otp; + } + + + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationResponseDTO.java index adf5e91c953..d035c56b991 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationResponseDTO.java @@ -6,4 +6,6 @@ public class NotificationResponseDTO { private String status; private String message; + private String maskedEmail; + private String maskedPhone; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationTemplateVariableDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationTemplateVariableDTO.java new file mode 100644 index 00000000000..4b8ab9ead98 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/NotificationTemplateVariableDTO.java @@ -0,0 +1,31 @@ +package io.mosip.resident.dto; + +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateType; +import lombok.Data; + +@Data +public class NotificationTemplateVariableDTO { + + private String eventId; + private RequestType requestType; + private TemplateType templateType; + private String langCode; + + private String otp; + + public NotificationTemplateVariableDTO(String eventId, RequestType requestType, TemplateType templateType, String langCode) { + this.eventId = eventId; + this.requestType = requestType; + this.templateType = templateType; + this.langCode = langCode; + } + + public NotificationTemplateVariableDTO(String eventId, RequestType requestType, TemplateType templateType, String langCode, String otp) { + this.eventId = eventId; + this.requestType = requestType; + this.templateType = templateType; + this.langCode = langCode; + this.otp = otp; + } +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ObjectWithTransactionID.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ObjectWithTransactionID.java new file mode 100644 index 00000000000..3d9d0c15c62 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ObjectWithTransactionID.java @@ -0,0 +1,7 @@ +package io.mosip.resident.dto; + +public interface ObjectWithTransactionID { + + String getTransactionID(); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTO.java index 6fca888aa73..d9a44b51b43 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTO.java @@ -1,37 +1,37 @@ -package io.mosip.resident.dto; - -import java.util.List; -import java.util.Map; - -import lombok.Data; - -/** - * This class is used to provide request for OTP generation. - * - * @author Dinesh Karuppiah - * - */ - -@Data -public class OtpRequestDTO { - - /** Variable to hold id */ - private String id; - - /** Variable to hold version */ - private String version; - - /** Variable to hold Transaction ID */ - private String transactionID; - - /** Variable to hold Request time */ - private String requestTime; - - /** Variable to hold individualID */ - private String individualId; - - private List otpChannel; - - private Map metadata; - +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * This class is used to provide request for OTP generation. + * + * @author Dinesh Karuppiah + * + */ + +@Data +public class OtpRequestDTO { + + /** Variable to hold id */ + private String id; + + /** Variable to hold version */ + private String version; + + /** Variable to hold Transaction ID */ + private String transactionID; + + /** Variable to hold Request time */ + private String requestTime; + + /** Variable to hold individualID */ + private String individualId; + + private List otpChannel; + + private Map metadata; + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV2.java new file mode 100644 index 00000000000..b26b797a531 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV2.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * This class is DTO class to take input userId to send OTP. + * @author Kamesh Shekhar Prasad + */ +@Getter +@Setter +@ToString +public class OtpRequestDTOV2 { + private String userId; + private String transactionId; +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV3.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV3.java new file mode 100644 index 00000000000..2a78c4f8b1e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpRequestDTOV3.java @@ -0,0 +1,17 @@ +package io.mosip.resident.dto; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * This class is DTO class to take input userId to send OTP. + * @author Kamesh Shekhar Prasad + */ +@Getter +@Setter +@ToString +public class OtpRequestDTOV3 extends OtpRequestDTOV2{ + private String otp; +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpResponseDTO.java index b834ba10926..240d76465ee 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/OtpResponseDTO.java @@ -1,38 +1,38 @@ -package io.mosip.resident.dto; - -import java.util.List; -import java.util.Map; - -import lombok.Data; - -/** - * This class is used to provide response for OTP generation. - * - * @author Dinesh Karuppiah - * - */ - -@Data -public class OtpResponseDTO { - - /** Variable to hold id */ - private String id; - - /** Variable to hold id */ - private String version; - - /** Variable to hold id */ - private String transactionID; - - /** Variable to hold id */ - private String responseTime; - - /** List to hold errors */ - private List errors; - - /** List to hold response */ - private MaskedResponseDTO response; - - private Map metadata; - -} +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * This class is used to provide response for OTP generation. + * + * @author Dinesh Karuppiah + * + */ + +@Data +public class OtpResponseDTO { + + /** Variable to hold id */ + private String id; + + /** Variable to hold id */ + private String version; + + /** Variable to hold id */ + private String transactionID; + + /** Variable to hold id */ + private String responseTime; + + /** List to hold errors */ + private List errors; + + /** List to hold response */ + private MaskedResponseDTO response; + + private Map metadata; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PackerGeneratorFailureDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PackerGeneratorFailureDto.java index c04daa4856f..29107861ca1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PackerGeneratorFailureDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PackerGeneratorFailureDto.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import lombok.Data; import lombok.EqualsAndHashCode; -import java.io.Serializable; - /** * @author Sowmya The Class PackerGeneratorFailureDto. */ diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorDto.java index 772550f6222..84997d7619b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorDto.java @@ -1,12 +1,13 @@ package io.mosip.resident.dto; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; /** * @author Sowmya The Class PacketGeneratorDto. diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorResDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorResDto.java index 180f18a4e5a..e4677ea065c 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorResDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketGeneratorResDto.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * The Class PacketGeneratorResDto. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverResponseDTO.java index 5072a9147e9..2d4b51ba298 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverResponseDTO.java @@ -1,11 +1,11 @@ package io.mosip.resident.dto; -import lombok.Data; -import lombok.EqualsAndHashCode; - import java.io.Serializable; import java.util.List; +import lombok.Data; +import lombok.EqualsAndHashCode; + /** * Instantiates a new packet receiver response DTO. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverSubResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverSubResponseDTO.java index 4c3450ac1ea..bf37cb370d2 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverSubResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketReceiverSubResponseDTO.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * Instantiates a new response DTO. * @author Rishabh Keshari diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyErrorDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyErrorDTO.java index 38729e1da8b..cc37b2aec23 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyErrorDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyErrorDTO.java @@ -1,12 +1,13 @@ package io.mosip.resident.dto; +import java.io.Serializable; + import com.fasterxml.jackson.annotation.JsonPropertyOrder; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.io.Serializable; - @Getter @Setter @NoArgsConstructor diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyRequestDTO.java index c29559e5657..b12bc6d4a38 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyRequestDTO.java @@ -1,36 +1,35 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -import java.io.Serializable; -import java.util.Map; - -/** - * This class is used to get TPM signkey from keymanager. - * - * @author Abubacker Siddik - */ - -@Data -@SuperBuilder -@AllArgsConstructor -@NoArgsConstructor -public class PacketSignPublicKeyRequestDTO extends BaseRestRequestDTO { - - private Map metadata; - - /** - * Variable to hold request - */ - private PacketSignPublicKeyRequest request; - - @Data - @Builder - public static class PacketSignPublicKeyRequest { - private String serverProfile; - } +package io.mosip.resident.dto; + +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * This class is used to get TPM signkey from keymanager. + * + * @author Abubacker Siddik + */ + +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class PacketSignPublicKeyRequestDTO extends BaseRestRequestDTO { + + private Map metadata; + + /** + * Variable to hold request + */ + private PacketSignPublicKeyRequest request; + + @Data + @Builder + public static class PacketSignPublicKeyRequest { + private String serverProfile; + } } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyResponseDTO.java index e5d7cde4487..96e89c7ae23 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PacketSignPublicKeyResponseDTO.java @@ -1,40 +1,44 @@ -package io.mosip.resident.dto; - -import lombok.*; - -import java.util.List; -import java.util.Map; - -/** - * This class is used to map TPM signkey response from keymanager. - * - * @author Abubacker Siddik - */ -@Data -@EqualsAndHashCode(callSuper = true) -@AllArgsConstructor -@NoArgsConstructor -@ToString -public class PacketSignPublicKeyResponseDTO extends BaseRestResponseDTO { - - private Map metadata; - - /** - * The response. - */ - private PacketSignPublicKeyResponse response; - - /** - * The error. - */ - private List errors; - - @Data - public static class PacketSignPublicKeyResponse { - /** - * Variable to hold public key - */ - private String publicKey; - } - +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +/** + * This class is used to map TPM signkey response from keymanager. + * + * @author Abubacker Siddik + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class PacketSignPublicKeyResponseDTO extends BaseRestResponseDTO { + + private Map metadata; + + /** + * The response. + */ + private PacketSignPublicKeyResponse response; + + /** + * The error. + */ + private List errors; + + @Data + public static class PacketSignPublicKeyResponse { + /** + * Variable to hold public key + */ + private String publicKey; + } + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PageDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PageDto.java new file mode 100644 index 00000000000..36b68296fa6 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PageDto.java @@ -0,0 +1,82 @@ +package io.mosip.resident.dto; + +import java.util.List; + +/** + * The Class PageDto. + * @author Kamesh Shekhar Prasad + * + * + * @param + */ + +public class PageDto { + private int pageIndex; + private int pageSize; + private long totalItems; + private int totalPages; + private List data; + + public int getPageIndex() { + return this.pageIndex; + } + + public int getPageSize() { + return this.pageSize; + } + + public long getTotalItems() { + return this.totalItems; + } + + public int getTotalPages() { + return this.totalPages; + } + + public List getData() { + return this.data; + } + + public void setPageIndex(int pageIndex) { + this.pageIndex = pageIndex; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public void setTotalItems(long totalItems) { + this.totalItems = totalItems; + } + + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + + public void setData(List data) { + this.data = data; + } + + + + protected boolean canEqual(Object other) { + return other instanceof PageDto; + } + + public String toString() { + int var10000 = this.getPageIndex(); + return "PageDto(pageIndex=" + var10000 + ", pageSize=" + this.getPageSize() + ", " + ", totalItems=" + this.getTotalItems() + ", totalPages=" + this.getTotalPages() + ", data=" + this.getData() + ")"; + } + + public PageDto(int pageIndex, int pageSize, long totalItems, int totalPages, List data) { + this.pageIndex = pageIndex; + this.pageSize = pageSize; + this.totalItems = totalItems; + this.totalPages = totalPages; + this.data = data; + } + + public PageDto() { + } +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintRequest.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintRequest.java index e79bf56fdef..1ed5e8c608f 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintRequest.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintRequest.java @@ -1,14 +1,14 @@ -package io.mosip.resident.dto; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -public class PrintRequest extends BaseRequestDTO { - - private static final long serialVersionUID = 1L; - - /** The request. */ - private UINCardRequestDTO request; -} +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class PrintRequest extends BaseRequestDTO { + + private static final long serialVersionUID = 1L; + + /** The request. */ + private UINCardRequestDTO request; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintResponse.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintResponse.java index 5dcca105c72..924673b88c1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintResponse.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/PrintResponse.java @@ -1,17 +1,16 @@ -package io.mosip.resident.dto; - -import java.util.List; - - -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -public class PrintResponse extends BaseResponseDTO { - private static final long serialVersionUID = 1L; - - private List errors; - - private UINCardResponseDTO response; -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class PrintResponse extends BaseResponseDTO { + private static final long serialVersionUID = 1L; + + private List errors; + + private UINCardResponseDTO response; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegSyncResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegSyncResponseDTO.java index 71709d96669..4b164d92cad 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegSyncResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegSyncResponseDTO.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; +import java.util.List; + import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - /** * Instantiates a new packet receiver response DTO. * @author Rishabh Keshari diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterDto.java index 6047e6848b9..eef1e7c2431 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterDto.java @@ -56,6 +56,12 @@ public class RegistrationCenterDto extends MasterSyncBaseDto { private String lunchEndTime; private Boolean isActive; + + private String fullAddress; + + private int serialNumber; + + /** * @return the langCode @@ -379,4 +385,32 @@ public void setIsActive(Boolean isActive) { this.isActive = isActive; } + /** + * @return the fullAddress + */ + public String getFullAddress() { + return fullAddress; + } + + /** + * @param fullAddress the fullAddress to set + */ + public void setFullAddress(String fullAddress) { + this.fullAddress = fullAddress; + } + + /** + * @return the serialNumber + */ + public int getSerialNumber() { + return serialNumber; + } + + /** + * @param serialNumber the serialNumber to set + */ + public void setSerialNumber(int serialNumber) { + this.serialNumber = serialNumber; + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterInfoResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterInfoResponseDto.java new file mode 100644 index 00000000000..2e7f7724fee --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterInfoResponseDto.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Ritik Jain + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RegistrationCenterInfoResponseDto extends RegistrationCenterResponseDto { + + /** The registration centers data. */ + private List data; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterResponseDto.java index 657f43a5ab4..be60809d312 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationCenterResponseDto.java @@ -1,11 +1,11 @@ package io.mosip.resident.dto; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationSyncRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationSyncRequestDTO.java index 8213016a188..81b3842ac0f 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationSyncRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RegistrationSyncRequestDTO.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; +import java.util.List; + import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - /** * Instantiates a new registration sync request DTO. diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDTO.java index 606536748c1..7f0c94e0647 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDTO.java @@ -1,14 +1,12 @@ -package io.mosip.resident.dto; - -import javax.validation.constraints.NotBlank; - -import lombok.Data; - -@Data -public class RequestDTO { - - private String individualId; - - private String individualIdType; - +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class RequestDTO { + + private String individualId; + + private String individualIdType; + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDto1.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDto1.java index d9feac6f5e6..d0c0129239d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDto1.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestDto1.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.util.List; +import lombok.Data; + /** * The Class RequestDto. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestWrapper.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestWrapper.java index e5978d120a6..97210fde498 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestWrapper.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RequestWrapper.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; -import lombok.Data; - import javax.validation.Valid; import javax.validation.constraints.NotNull; +import lombok.Data; + @Data public class RequestWrapper { private String id; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialRequestDto.java index 4caed929589..5eb75dba98d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialRequestDto.java @@ -1,36 +1,38 @@ -package io.mosip.resident.dto; - -import java.util.List; -import java.util.Map; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class ResidentCredentialRequestDto { - private String transactionID; - - private String individualId; - - private String otp; - - private String credentialType; - - private boolean encrypt; - - private String issuer; - - private String encryptionKey; - - private String recepiant; - - private String user; - - private List sharableAttributes; - - private Map additionalData; - -} +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ResidentCredentialRequestDto { + private String transactionID; + + private String individualId; + + private String otp; + + private String credentialType; + + private boolean encrypt; + + private String issuer; + + private String encryptionKey; + + private String recepiant; + + private String user; + + private List sharableAttributes; + + private Map additionalData; + + private String consent; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDto.java index 011792de45e..2b3a65a7207 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDto.java @@ -1,14 +1,14 @@ -package io.mosip.resident.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ResidentCredentialResponseDto { - - private String id; - private String requestId; -} +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ResidentCredentialResponseDto { + + private String id; + private String requestId; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDtoV2.java new file mode 100644 index 00000000000..e736ee6761e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentCredentialResponseDtoV2.java @@ -0,0 +1,15 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * The credential response dto v2. + * + * @author Ritik Jain + */ +@Data +public class ResidentCredentialResponseDtoV2 { + + private String status; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDemographicUpdateRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDemographicUpdateRequestDTO.java new file mode 100644 index 00000000000..53ce4e64fb7 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDemographicUpdateRequestDTO.java @@ -0,0 +1,22 @@ +package io.mosip.resident.dto; + +import org.json.simple.JSONObject; + +import lombok.Data; + +/** + * This class is a DTO that is used to update the demographic information of a + * resident + * + * @author Manoj SP + */ +@Data +public class ResidentDemographicUpdateRequestDTO { + + private String transactionID; + + private String consent; + + private JSONObject identity; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDocuments.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDocuments.java index f400cc5860a..3f2c570395b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDocuments.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentDocuments.java @@ -1,8 +1,12 @@ package io.mosip.resident.dto; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor +@AllArgsConstructor public class ResidentDocuments { private String name; private String value; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentReprintRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentReprintRequestDto.java index cce8b084f8b..2ee7ac80211 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentReprintRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentReprintRequestDto.java @@ -1,28 +1,24 @@ -package io.mosip.resident.dto; - -import java.io.Serializable; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import io.mosip.resident.constant.IdType; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ResidentReprintRequestDto implements Serializable { - private static final long serialVersionUID = -4492209826585681216L; - - private String transactionID; - - private String individualId; - - private String individualIdType; - - private String cardType; - - private String otp; -} +package io.mosip.resident.dto; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ResidentReprintRequestDto implements Serializable { + private static final long serialVersionUID = -4492209826585681216L; + + private String transactionID; + + private String individualId; + + private String individualIdType; + + private String cardType; + + private String otp; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentServiceHistoryResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentServiceHistoryResponseDto.java new file mode 100644 index 00000000000..61949eeeee4 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentServiceHistoryResponseDto.java @@ -0,0 +1,19 @@ +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ResidentServiceHistoryResponseDto { + + private String id; + + private String requestId; + + private String statusCode; + + private String cardUrl; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateDto.java index 7e5f351d628..7131b4c84d1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateDto.java @@ -1,14 +1,16 @@ package io.mosip.resident.dto; +import java.io.Serializable; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + import com.fasterxml.jackson.annotation.JsonIgnore; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - /** * * @author Girish Yarru diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateRequestDto.java index 5806152d51f..95119479829 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateRequestDto.java @@ -1,29 +1,27 @@ -package io.mosip.resident.dto; - -import java.util.List; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import io.mosip.resident.constant.IdType; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ResidentUpdateRequestDto { - - private String transactionID; - - private String individualId; - - private String individualIdType; - - private String otp; - - private String identityJson; - private List documents; - -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor +@AllArgsConstructor +public class ResidentUpdateRequestDto extends ResidentDemographicUpdateRequestDTO { + + private String individualId; + + private String individualIdType; + + private String otp; + + private List documents; + + private String identityJson; + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateResponseDTOV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateResponseDTOV2.java new file mode 100644 index 00000000000..edf5e15da37 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentUpdateResponseDTOV2.java @@ -0,0 +1,13 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to add extra variable eventId in update-uin api response for authenticated patch api. + */ +@Data +public class ResidentUpdateResponseDTOV2 { + private String status; + private String message; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDto.java index 1e18d8c5221..386cec589b0 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDto.java @@ -9,7 +9,12 @@ @EqualsAndHashCode(callSuper = true) @Getter @Setter -public class ResidentVidRequestDto extends BaseRequestDTO { +public class ResidentVidRequestDto extends BaseRequestDTO implements IVidRequestDto { - private VidRequestDto request; + /** + * + */ + private static final long serialVersionUID = 3674725539147720447L; + private VidRequestDto request; + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDtoV2.java new file mode 100644 index 00000000000..6efdec98d36 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResidentVidRequestDtoV2.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Data +@EqualsAndHashCode(callSuper = true) +@Getter +@Setter +public class ResidentVidRequestDtoV2 extends BaseRequestDTO implements IVidRequestDto { + + /** + * + */ + private static final long serialVersionUID = 1864072225994404946L; + private VidRequestDtoV2 request; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseDTO1.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseDTO1.java index f7f70cb737c..c5d068d94fd 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseDTO1.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseDTO1.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.util.List; +import lombok.Data; + /** * The Class ResponseDTO. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseWrapper.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseWrapper.java index c740a0c08e8..7a86c6c22d4 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseWrapper.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ResponseWrapper.java @@ -1,15 +1,13 @@ package io.mosip.resident.dto; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.mosip.kernel.core.exception.ServiceError; -import lombok.Data; +import java.util.ArrayList; +import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.List; + +import io.mosip.kernel.core.exception.ServiceError; +import lombok.Data; @Data public class ResponseWrapper { diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/RevokeVidResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/RevokeVidResponseDto.java new file mode 100644 index 00000000000..b0e02df6aab --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/RevokeVidResponseDto.java @@ -0,0 +1,21 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * The revoke vid response dto. + * + * @author Ritik Jain + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RevokeVidResponseDto extends VidRevokeResponseDTO { + + /** + * + */ + private static final long serialVersionUID = 1973880019812497700L; + private String status; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceHistoryResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceHistoryResponseDto.java new file mode 100644 index 00000000000..9c08228978b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceHistoryResponseDto.java @@ -0,0 +1,26 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + * This class is used to store the service history response. + * + * @author Kamesh Shekhar Prasad + **/ + +@Data +@Getter +@Setter +public class ServiceHistoryResponseDto { + private String eventId; + private String description; + private String eventStatus; + private String timeStamp; + private String serviceType; + private String requestType; + private boolean pinnedStatus; + private boolean readStatus; + private int serialNumber; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceTypeResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceTypeResponseDto.java new file mode 100644 index 00000000000..5acc15aabb4 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ServiceTypeResponseDto.java @@ -0,0 +1,31 @@ +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + */ + +@Data +public class ServiceTypeResponseDto { + + /** Variable To hold id */ + private String id; + + /** Variable To hold version */ + private String version; + + /** The error List */ + private List errors; + + /** List to hold ServiceType */ + private Map> response; + /** The id. */ + + /** The resTime value */ + private String responseTime; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/SharableAttributesDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/SharableAttributesDTO.java new file mode 100644 index 00000000000..b9f973afe6b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/SharableAttributesDTO.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +/** + * @author Manoj SP + * + */ +@Data +public class SharableAttributesDTO { + + private String attributeName; + + private String format; + + @JsonProperty("isMasked") + private boolean isMasked; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ShareCredentialRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ShareCredentialRequestDto.java new file mode 100644 index 00000000000..f268af6da9e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ShareCredentialRequestDto.java @@ -0,0 +1,26 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Ritik Jain + * + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ShareCredentialRequestDto { + + private String partnerId; + + private List sharableAttributes; + + private String purpose; + + private String consent; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/SortType.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/SortType.java new file mode 100644 index 00000000000..e604b1ef7f8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/SortType.java @@ -0,0 +1,9 @@ +package io.mosip.resident.dto; + +/** + * This class is used to store the enum type of sort type. + * @author Kamesh Shekhar Prasad + **/ +public enum SortType { + ASC, DESC +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncRegistrationDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncRegistrationDto.java index cba085fbeef..6fc270e9983 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncRegistrationDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncRegistrationDto.java @@ -3,13 +3,14 @@ */ package io.mosip.resident.dto; -import io.swagger.annotations.ApiModelProperty; -import org.json.simple.JSONArray; - import java.io.Serializable; import java.math.BigInteger; import java.time.LocalDateTime; +import org.json.simple.JSONArray; + +import io.swagger.annotations.ApiModelProperty; + // TODO: Auto-generated Javadoc /** diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncResponseDto.java index 6dd18ef9a6e..f8440266e45 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/SyncResponseDto.java @@ -1,9 +1,9 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; + /** * The Class SyncResponseDto. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/Type.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/Type.java index b35945fdef8..cae1853995a 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/Type.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/Type.java @@ -1,14 +1,14 @@ -package io.mosip.resident.dto; - -import java.util.List; - -import lombok.Data; - -@Data -public class Type { - - private String id; - private String name; - private String description; - private List issuers; -} +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; + +@Data +public class Type { + + private String id; + private String name; + private String description; + private List issuers; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardRequestDTO.java index 209912e7c7a..55607b6be2a 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardRequestDTO.java @@ -1,22 +1,22 @@ -package io.mosip.resident.dto; - -import java.io.Serializable; - -import io.mosip.resident.constant.IdType; -import lombok.Data; - -@Data -public class UINCardRequestDTO implements Serializable{ - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 1L; - - /** The idtype. */ - private IdType idtype; - - /** The id value. */ - private String idValue; - - /** The card type. */ - private String cardType; -} +package io.mosip.resident.dto; + +import java.io.Serializable; + +import io.mosip.resident.constant.IdType; +import lombok.Data; + +@Data +public class UINCardRequestDTO implements Serializable{ + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** The idtype. */ + private IdType idtype; + + /** The id value. */ + private String idValue; + + /** The card type. */ + private String cardType; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardResponseDTO.java index 5510eb23e66..ef44a9432a5 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardResponseDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UINCardResponseDTO.java @@ -1,22 +1,21 @@ -package io.mosip.resident.dto; - -import java.io.Serializable; -import java.util.Arrays; - - -import lombok.Data; -@Data -public class UINCardResponseDTO implements Serializable{ - private static final long serialVersionUID = 1L; - - private byte[] file; - - public byte[] getFile() { - if(file!=null) - return Arrays.copyOf(file, file.length); - return null; - } - public void setFile(byte[] file) { - this.file=file!=null?file:null; - } -} +package io.mosip.resident.dto; + +import java.io.Serializable; +import java.util.Arrays; + +import lombok.Data; +@Data +public class UINCardResponseDTO implements Serializable{ + private static final long serialVersionUID = 1L; + + private byte[] file; + + public byte[] getFile() { + if(file!=null) + return Arrays.copyOf(file, file.length); + return null; + } + public void setFile(byte[] file) { + this.file=file!=null?file:null; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRePrintRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRePrintRequestDto.java index 369afe84b8c..ebbde018151 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRePrintRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRePrintRequestDto.java @@ -1,10 +1,11 @@ package io.mosip.resident.dto; -import lombok.Data; -import lombok.EqualsAndHashCode; +import java.io.Serializable; import javax.validation.Valid; -import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; /** * Instantiates a new resident service re-print request dto. diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRequestDto1.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRequestDto1.java index 3847dc3d0cc..0ab1686cd61 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRequestDto1.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UinCardRequestDto1.java @@ -1,10 +1,11 @@ package io.mosip.resident.dto; -import lombok.Data; +import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.io.Serializable; + +import lombok.Data; @Data public class UinCardRequestDto1 implements Serializable { diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UnauthenticatedAuditRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UnauthenticatedAuditRequestDto.java new file mode 100644 index 00000000000..b6aaba4f3f5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UnauthenticatedAuditRequestDto.java @@ -0,0 +1,25 @@ +package io.mosip.resident.dto; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * The unauthenticated audit request dto. + * + * @author Ritik Jain + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) +public class UnauthenticatedAuditRequestDto extends AuthenticatedAuditRequestDto { + + /** The id. */ + @NotNull + @Size(min = 1, max = 64) + private String id; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UnreadNotificationDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UnreadNotificationDto.java new file mode 100644 index 00000000000..255763473fb --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UnreadNotificationDto.java @@ -0,0 +1,9 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class UnreadNotificationDto { + private Long unreadCount; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UpdateCountDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UpdateCountDto.java new file mode 100644 index 00000000000..563734e9708 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UpdateCountDto.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * The remaining update count dto. + * + * @author Kamesh Shekhar Prasad + */ +@AllArgsConstructor +@NoArgsConstructor +@Data +public class UpdateCountDto { + private String attributeName; + private int noOfUpdatesLeft; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UrlRedirectRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UrlRedirectRequestDTO.java new file mode 100644 index 00000000000..0d9e48761ae --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UrlRedirectRequestDTO.java @@ -0,0 +1,13 @@ +package io.mosip.resident.dto; +import lombok.Data; + +/** + * @author Neha Farheen + * This class is used a request DTO for trackingId + */ +@Data +public class UrlRedirectRequestDTO { + private String transactionId; + private String trackingId; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/UserInfoDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/UserInfoDto.java new file mode 100644 index 00000000000..d96d36e1414 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/UserInfoDto.java @@ -0,0 +1,26 @@ +package io.mosip.resident.dto; + +import java.util.Map; + +import lombok.Data; + +/** + * This class is used to provide response for user profile + * + * @author Neha Farheen + * + */ +@Data +public class UserInfoDto { + + private String fullName; + + private String lastLogin; + + private Map photo; + + private String email; + + private String phone; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/ValidateOtpResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/ValidateOtpResponseDto.java new file mode 100644 index 00000000000..6b3788a3e2a --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/ValidateOtpResponseDto.java @@ -0,0 +1,17 @@ +package io.mosip.resident.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * The validate otp response dto. + * + * @author Ritik Jain + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ValidateOtpResponseDto extends IdAuthResponseDto { + + private String status; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationResponseDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationResponseDTO.java new file mode 100644 index 00000000000..bdf77bb1464 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationResponseDTO.java @@ -0,0 +1,34 @@ +package io.mosip.resident.dto; + +import java.util.List; +import java.util.Map; + +import lombok.Data; + +/** + * This class is used to provide response for Channel verification. + * + * @author Kamesh shekhar prasad + * + */ + +@Data +public class VerificationResponseDTO { + + /** Variable to hold id */ + private String id; + + /** Variable to hold id */ + private String version; + + /** Variable to hold id */ + private String responseTime; + + private Map metadata; + + /** List to hold response */ + private VerificationStatusDTO response; + + /** List to hold errors */ + private List errors; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationStatusDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationStatusDTO.java new file mode 100644 index 00000000000..1cc573fb533 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VerificationStatusDTO.java @@ -0,0 +1,20 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * This class used to provide + * Verification status Info's + * + * @author Kamesh Shekhar Prasad + */ +@Data +public class VerificationStatusDTO { + + /** + * This field used to store the status of the verification + */ + private boolean verificationStatus; + private String maskedUserId; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidDownloadCardResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidDownloadCardResponseDto.java new file mode 100644 index 00000000000..d4f8b005a0f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidDownloadCardResponseDto.java @@ -0,0 +1,13 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to return response for vid request card api. + */ +@Data +public class VidDownloadCardResponseDto +{ + String status; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorRequestDto.java index abdbcef6fe2..1b459b73a72 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorRequestDto.java @@ -1,6 +1,7 @@ package io.mosip.resident.dto; import com.fasterxml.jackson.annotation.JsonProperty; + import io.swagger.annotations.ApiModel; import lombok.ToString; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorResponseDto.java index 08eb482698c..921b321ddcf 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidGeneratorResponseDto.java @@ -1,6 +1,7 @@ package io.mosip.resident.dto; import com.fasterxml.jackson.annotation.JsonProperty; + import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.ToString; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto.java index dc5e283c4d5..c9eabd0ac4e 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto.java @@ -1,15 +1,18 @@ package io.mosip.resident.dto; -import java.io.Serializable; - import lombok.Data; +import lombok.EqualsAndHashCode; @Data -public class VidRequestDto implements Serializable { +@EqualsAndHashCode(callSuper=true) +public class VidRequestDto extends BaseVidRequestDto { - private String transactionID; - private String individualId; + /** + * + */ + private static final long serialVersionUID = 8496426638724225974L; + + private String individualId; private String otp; - private String vidType; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto1.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto1.java index 22a485132b9..6a9d4a137cf 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto1.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDto1.java @@ -1,6 +1,7 @@ package io.mosip.resident.dto; import com.fasterxml.jackson.annotation.JsonProperty; + import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.ToString; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDtoV2.java new file mode 100644 index 00000000000..69a077a8d0c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRequestDtoV2.java @@ -0,0 +1,19 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper=true) +public class VidRequestDtoV2 extends BaseVidRequestDto { + + + /** + * + */ + private static final long serialVersionUID = -886400737912892865L; + private List channels; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResDTO.java index 8890d9fb885..af0e0f50241 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResDTO.java @@ -1,6 +1,7 @@ package io.mosip.resident.dto; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.Data; /** diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDTO1.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDTO1.java index 4f839d5cdd7..a64fe03d96c 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDTO1.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDTO1.java @@ -1,10 +1,10 @@ package io.mosip.resident.dto; -import lombok.Data; - import java.io.Serializable; import java.util.List; +import lombok.Data; + @Data public class VidResponseDTO1 extends BaseRestResponseDTO implements Serializable{ diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDto.java index f1a6bafa8bd..8b88f0ceb37 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDto.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDto.java @@ -1,11 +1,16 @@ package io.mosip.resident.dto; -import lombok.Data; import java.io.Serializable; +import lombok.Data; + @Data public class VidResponseDto implements Serializable { - private String vid; + /** + * + */ + private static final long serialVersionUID = -6756239366488227369L; + private String vid; private String message; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDtoV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDtoV2.java new file mode 100644 index 00000000000..4f13676996b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidResponseDtoV2.java @@ -0,0 +1,14 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +@Data +public class VidResponseDtoV2 extends VidResponseDto{ + + /** + * + */ + private static final long serialVersionUID = -5655123110778309784L; + private String maskedPhone; + private String maskedEmail; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTO.java index 0136477224c..c017fb87c8d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTO.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTO.java @@ -3,20 +3,21 @@ import java.io.Serializable; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @Data @Getter @Setter -public class VidRevokeRequestDTO implements Serializable { +@EqualsAndHashCode(callSuper=true) +public class VidRevokeRequestDTO extends BaseVidRevokeRequestDTO implements Serializable { - private static final long serialVersionUID = 1L; - - private String transactionID; + /** + * + */ + private static final long serialVersionUID = 3672610022968150191L; private String individualId; - private String individualIdType; private String otp; - private String vidStatus; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTOV2.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTOV2.java new file mode 100644 index 00000000000..f8e4917ccc9 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/VidRevokeRequestDTOV2.java @@ -0,0 +1,16 @@ +package io.mosip.resident.dto; + + +/** + * The Class VidRevokeRequestDTOV2 + * + * @author Loganathan S + */ +public class VidRevokeRequestDTOV2 extends BaseVidRevokeRequestDTO { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -5855973435741502178L; + + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkflowCompletedEventDTO.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkflowCompletedEventDTO.java new file mode 100644 index 00000000000..d4139f1a119 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkflowCompletedEventDTO.java @@ -0,0 +1,25 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * @author Kamesh Shekhar Prasad + */ +@Data +public class WorkflowCompletedEventDTO { + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new message DTO. + */ + public WorkflowCompletedEventDTO() { + super(); + } + + /** The registration id. */ + private String instanceId; + private String resultCode; + private String workflowType; + private String errorCode; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysDto.java new file mode 100644 index 00000000000..58a486118c6 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysDto.java @@ -0,0 +1,18 @@ +package io.mosip.resident.dto; + +import lombok.Data; + +/** + * + * @author M1063027 Rama Devi + * + */ +@Data +public class WorkingDaysDto { + + String code; + String name; + int order; + String language; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysResponseDto.java new file mode 100644 index 00000000000..ddf94a95e6b --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/dto/WorkingDaysResponseDto.java @@ -0,0 +1,15 @@ +package io.mosip.resident.dto; + +import java.util.List; + +import lombok.Data; + +/** + * + * @author M1063027 Rama Devi + * + */ +@Data +public class WorkingDaysResponseDto { + private List workingdays; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/entity/OtpTransactionEntity.java b/resident/resident-service/src/main/java/io/mosip/resident/entity/OtpTransactionEntity.java new file mode 100644 index 00000000000..021d51ba6f8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/entity/OtpTransactionEntity.java @@ -0,0 +1,410 @@ +package io.mosip.resident.entity; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * This class is used to create entity for otp_transaction table. + * @author Kamesh Shekhar Prasad + */ +@Table( + name = "otp_transaction", + schema = "resident" +) +@Entity +public class OtpTransactionEntity { + @Id + private String id; + @Column( + name = "ref_id" + ) + private String refId; + @Column( + name = "otp_hash" + ) + private String otpHash; + @Column( + name = "generated_dtimes" + ) + private LocalDateTime generatedDtimes; + @Column( + name = "expiry_dtimes" + ) + private LocalDateTime expiryDtimes; + @Column( + name = "validation_retry_count" + ) + private Integer validationRetryCount; + @Column( + name = "status_code" + ) + private String statusCode; + @Column( + name = "lang_code" + ) + private String langCode; + @Column( + name = "cr_by" + ) + private String crBy; + @Column( + name = "cr_dtimes" + ) + private LocalDateTime crDtimes; + @Column( + name = "upd_by" + ) + private String updBy; + @Column( + name = "upd_dtimes" + ) + private LocalDateTime updDTimes; + @Column( + name = "is_deleted" + ) + private Boolean isDeleted; + @Column( + name = "del_dtimes" + ) + private LocalDateTime delDtimes; + + public OtpTransactionEntity() { + } + + public String getId() { + return this.id; + } + + public String getRefId() { + return this.refId; + } + + public String getOtpHash() { + return this.otpHash; + } + + public LocalDateTime getGeneratedDtimes() { + return this.generatedDtimes; + } + + public LocalDateTime getExpiryDtimes() { + return this.expiryDtimes; + } + + public Integer getValidationRetryCount() { + return this.validationRetryCount; + } + + public String getStatusCode() { + return this.statusCode; + } + + public String getLangCode() { + return this.langCode; + } + + public String getCrBy() { + return this.crBy; + } + + public LocalDateTime getCrDtimes() { + return this.crDtimes; + } + + public String getUpdBy() { + return this.updBy; + } + + public LocalDateTime getUpdDTimes() { + return this.updDTimes; + } + + public Boolean getIsDeleted() { + return this.isDeleted; + } + + public LocalDateTime getDelDtimes() { + return this.delDtimes; + } + + public void setId(String id) { + this.id = id; + } + + public void setRefId(String refId) { + this.refId = refId; + } + + public void setOtpHash(String otpHash) { + this.otpHash = otpHash; + } + + public void setGeneratedDtimes(LocalDateTime generatedDtimes) { + this.generatedDtimes = generatedDtimes; + } + + public void setExpiryDtimes(LocalDateTime expiryDtimes) { + this.expiryDtimes = expiryDtimes; + } + + public void setValidationRetryCount(Integer validationRetryCount) { + this.validationRetryCount = validationRetryCount; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public void setLangCode(String langCode) { + this.langCode = langCode; + } + + public void setCrBy(String crBy) { + this.crBy = crBy; + } + + public void setCrDtimes(LocalDateTime crDtimes) { + this.crDtimes = crDtimes; + } + + public void setUpdBy(String updBy) { + this.updBy = updBy; + } + + public void setUpdDTimes(LocalDateTime updDTimes) { + this.updDTimes = updDTimes; + } + + public void setIsDeleted(Boolean isDeleted) { + this.isDeleted = isDeleted; + } + + public void setDelDtimes(LocalDateTime delDtimes) { + this.delDtimes = delDtimes; + } + + public boolean equals(Object o) { + if (o == this) { + return true; + } else if (!(o instanceof OtpTransactionEntity)) { + return false; + } else { + OtpTransactionEntity other = (OtpTransactionEntity)o; + if (!other.canEqual(this)) { + return false; + } else { + Object this$id = this.getId(); + Object other$id = other.getId(); + if (this$id == null) { + if (other$id != null) { + return false; + } + } else if (!this$id.equals(other$id)) { + return false; + } + + Object this$refId = this.getRefId(); + Object other$refId = other.getRefId(); + if (this$refId == null) { + if (other$refId != null) { + return false; + } + } else if (!this$refId.equals(other$refId)) { + return false; + } + + Object this$otpHash = this.getOtpHash(); + Object other$otpHash = other.getOtpHash(); + if (this$otpHash == null) { + if (other$otpHash != null) { + return false; + } + } else if (!this$otpHash.equals(other$otpHash)) { + return false; + } + + label158: { + Object this$generatedDtimes = this.getGeneratedDtimes(); + Object other$generatedDtimes = other.getGeneratedDtimes(); + if (this$generatedDtimes == null) { + if (other$generatedDtimes == null) { + break label158; + } + } else if (this$generatedDtimes.equals(other$generatedDtimes)) { + break label158; + } + + return false; + } + + label151: { + Object this$expiryDtimes = this.getExpiryDtimes(); + Object other$expiryDtimes = other.getExpiryDtimes(); + if (this$expiryDtimes == null) { + if (other$expiryDtimes == null) { + break label151; + } + } else if (this$expiryDtimes.equals(other$expiryDtimes)) { + break label151; + } + + return false; + } + + Object this$validationRetryCount = this.getValidationRetryCount(); + Object other$validationRetryCount = other.getValidationRetryCount(); + if (this$validationRetryCount == null) { + if (other$validationRetryCount != null) { + return false; + } + } else if (!this$validationRetryCount.equals(other$validationRetryCount)) { + return false; + } + + label137: { + Object this$statusCode = this.getStatusCode(); + Object other$statusCode = other.getStatusCode(); + if (this$statusCode == null) { + if (other$statusCode == null) { + break label137; + } + } else if (this$statusCode.equals(other$statusCode)) { + break label137; + } + + return false; + } + + label130: { + Object this$langCode = this.getLangCode(); + Object other$langCode = other.getLangCode(); + if (this$langCode == null) { + if (other$langCode == null) { + break label130; + } + } else if (this$langCode.equals(other$langCode)) { + break label130; + } + + return false; + } + + Object this$crBy = this.getCrBy(); + Object other$crBy = other.getCrBy(); + if (this$crBy == null) { + if (other$crBy != null) { + return false; + } + } else if (!this$crBy.equals(other$crBy)) { + return false; + } + + Object this$crDtimes = this.getCrDtimes(); + Object other$crDtimes = other.getCrDtimes(); + if (this$crDtimes == null) { + if (other$crDtimes != null) { + return false; + } + } else if (!this$crDtimes.equals(other$crDtimes)) { + return false; + } + + label109: { + Object this$updBy = this.getUpdBy(); + Object other$updBy = other.getUpdBy(); + if (this$updBy == null) { + if (other$updBy == null) { + break label109; + } + } else if (this$updBy.equals(other$updBy)) { + break label109; + } + + return false; + } + + label102: { + Object this$updDTimes = this.getUpdDTimes(); + Object other$updDTimes = other.getUpdDTimes(); + if (this$updDTimes == null) { + if (other$updDTimes == null) { + break label102; + } + } else if (this$updDTimes.equals(other$updDTimes)) { + break label102; + } + + return false; + } + + Object this$isDeleted = this.getIsDeleted(); + Object other$isDeleted = other.getIsDeleted(); + if (this$isDeleted == null) { + if (other$isDeleted != null) { + return false; + } + } else if (!this$isDeleted.equals(other$isDeleted)) { + return false; + } + + Object this$delDtimes = this.getDelDtimes(); + Object other$delDtimes = other.getDelDtimes(); + if (this$delDtimes == null) { + if (other$delDtimes != null) { + return false; + } + } else if (!this$delDtimes.equals(other$delDtimes)) { + return false; + } + + return true; + } + } + } + + protected boolean canEqual(Object other) { + return other instanceof OtpTransactionEntity; + } + + public int hashCode() { + int result = 1; + Object $id = this.getId(); + result = result * 59 + ($id == null ? 43 : $id.hashCode()); + Object $refId = this.getRefId(); + result = result * 59 + ($refId == null ? 43 : $refId.hashCode()); + Object $otpHash = this.getOtpHash(); + result = result * 59 + ($otpHash == null ? 43 : $otpHash.hashCode()); + Object $generatedDtimes = this.getGeneratedDtimes(); + result = result * 59 + ($generatedDtimes == null ? 43 : $generatedDtimes.hashCode()); + Object $expiryDtimes = this.getExpiryDtimes(); + result = result * 59 + ($expiryDtimes == null ? 43 : $expiryDtimes.hashCode()); + Object $validationRetryCount = this.getValidationRetryCount(); + result = result * 59 + ($validationRetryCount == null ? 43 : $validationRetryCount.hashCode()); + Object $statusCode = this.getStatusCode(); + result = result * 59 + ($statusCode == null ? 43 : $statusCode.hashCode()); + Object $langCode = this.getLangCode(); + result = result * 59 + ($langCode == null ? 43 : $langCode.hashCode()); + Object $crBy = this.getCrBy(); + result = result * 59 + ($crBy == null ? 43 : $crBy.hashCode()); + Object $crDtimes = this.getCrDtimes(); + result = result * 59 + ($crDtimes == null ? 43 : $crDtimes.hashCode()); + Object $updBy = this.getUpdBy(); + result = result * 59 + ($updBy == null ? 43 : $updBy.hashCode()); + Object $updDTimes = this.getUpdDTimes(); + result = result * 59 + ($updDTimes == null ? 43 : $updDTimes.hashCode()); + Object $isDeleted = this.getIsDeleted(); + result = result * 59 + ($isDeleted == null ? 43 : $isDeleted.hashCode()); + Object $delDtimes = this.getDelDtimes(); + result = result * 59 + ($delDtimes == null ? 43 : $delDtimes.hashCode()); + return result; + } + + public String toString() { + String var10000 = this.getId(); + return "OtpTransaction(id=" + var10000 + ", refId=" + this.getRefId() + ", otpHash=" + this.getOtpHash() + ", generatedDtimes=" + this.getGeneratedDtimes() + ", expiryDtimes=" + this.getExpiryDtimes() + ", validationRetryCount=" + this.getValidationRetryCount() + ", statusCode=" + this.getStatusCode() + ", langCode=" + this.getLangCode() + ", crBy=" + this.getCrBy() + ", crDtimes=" + this.getCrDtimes() + ", updBy=" + this.getUpdBy() + ", updDTimes=" + this.getUpdDTimes() + ", isDeleted=" + this.getIsDeleted() + ", delDtimes=" + this.getDelDtimes() + ")"; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentGrievanceEntity.java b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentGrievanceEntity.java new file mode 100644 index 00000000000..a05b487a4f7 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentGrievanceEntity.java @@ -0,0 +1,90 @@ +package io.mosip.resident.entity; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * This entity class defines the database table details for resident_grievance_ticket + * table. + * + * @author Kamesh Shekhar Prasad + * @since 1.2.0.1 + * + */ + +@Data +@Table(name = "resident_grievance_ticket", schema = "resident") +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ResidentGrievanceEntity { + + @Id + @Column(name = "id") + private String id; + + @NotNull + @Column(name = "eventId") + private String eventId; + + @NotNull + @Column(name = "name") + private String name; + + @Column(name = "emailId") + private String emailId; + + @Column(name = "alternateEmailId") + private String alternateEmailId; + + @Column(name = "phoneNo") + private String phoneNo; + + @Column(name = "alternatePhoneNo") + private String alternatePhoneNo; + + @NotNull + @Column(name = "message") + private String message; + + @NotNull + @Column(name = "hasAttachment") + private boolean hasAttachment = false; + + @NotNull + @Column(name = "status") + private String status; + + @NotNull + @Column(name = "cr_by") + private String crBy; + + @NotNull + @Column(name = "cr_dtimes") + private LocalDateTime crDtimes; + + @Column(name = "upd_by") + private String updBy; + + @Column(name = "upd_dtimes") + private LocalDateTime updDtimes; + + @NotNull + @Column(name = "is_deleted") + private Boolean isDeleted = false; + + @Column(name = "del_dtimes") + private LocalDateTime delDtimes; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentSessionEntity.java b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentSessionEntity.java new file mode 100644 index 00000000000..7bbd46e8c7f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentSessionEntity.java @@ -0,0 +1,55 @@ +package io.mosip.resident.entity; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * This entity class defines the database table details for + * resident_user_actions table. + * + * @author Neha Farheen + * @since 1.2.0.1 + * + */ +@Data +@Table(name = "resident_session", schema = "resident") +@Entity +@NoArgsConstructor + +public class ResidentSessionEntity { + @Id + @Column(name = "session_id") + private String sessionId; + + @Column(name = "ida_token") + private String idaToken; + + @Column(name = "login_dtimes") + private LocalDateTime loginDtimes; + + @Column(name = "ip_address") + private String ipAddress; + + @Column(name = "host") + private String host; + + @Column(name = "machine_type") + private String machineType; + + public ResidentSessionEntity(String sessionId, String idaToken, LocalDateTime loginDtimes, + String ipAddress, String host, String machineType) { + this.sessionId = sessionId; + this.idaToken = idaToken; + this.loginDtimes = loginDtimes; + this.ipAddress = ipAddress; + this.host = host; + this.machineType = machineType; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentTransactionEntity.java b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentTransactionEntity.java new file mode 100644 index 00000000000..3431d80e8fa --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentTransactionEntity.java @@ -0,0 +1,261 @@ +package io.mosip.resident.entity; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * This entity class defines the database table details for resident_transaction + * table. + * + * @author Kamesh Shekhar Prasad + * @since 1.2.0.1 + * + */ + +@Data +@Table(name = "resident_transaction", schema = "resident") +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public class ResidentTransactionEntity { + + @Id + @Column(name = "event_id") + @EqualsAndHashCode.Include + private String eventId; + + @Column(name = "request_trn_id") + private String requestTrnId; + + @Column(name = "aid") + private String aid; + + @NotNull + @Column(name = "request_dtimes") + private LocalDateTime requestDtimes; + + @NotNull + @Column(name = "response_dtime") + private LocalDateTime responseDtime; + + @NotNull + @Column(name = "request_type_code") + private String requestTypeCode; + + @NotNull + @Column(name = "request_summary") + private String requestSummary; + + @NotNull + @Column(name = "status_code") + private String statusCode; + + @Column(name = "status_comment") + private String statusComment; + + @Column(name = "lang_code") + private String langCode; + + @Column(name = "ref_id_type") + private String refIdType; + + @Column(name = "ref_id") + private String refId; + + @NotNull + @Column(name = "token_id") + private String tokenId; + + @Column(name = "requested_entity_type") + private String requestedEntityType; + + @Column(name = "requested_entity_id") + private String requestedEntityId; + + @Column(name = "requested_entity_name") + private String requestedEntityName; + + @NotNull + @Column(name = "cr_by") + private String crBy; + + @NotNull + @Column(name = "cr_dtimes") + private LocalDateTime crDtimes; + + @Column(name = "upd_by") + private String updBy; + + @Column(name = "upd_dtimes") + private LocalDateTime updDtimes; + + @NotNull + @Column(name = "is_deleted") + private Boolean isDeleted = false; + + @Column(name = "del_dtimes") + private LocalDateTime delDtimes; + + @Column(name = "auth_type_code") + private String authTypeCode; + + @Column(name = "static_tkn_id") + private String authTknId; + + @Column(name = "request_signature") + private String requestSignature; + + @Column(name = "response_signature") + private String responseSignature; + + @Column(name = "olv_partner_id") + private String olvPartnerId; + + @Column(name = "reference_link") + private String referenceLink; + + @NotNull + @Column(name = "read_status") + private boolean readStatus = false; + + @NotNull + @Column(name = "pinned_status") + private boolean pinnedStatus = false; + + @Column(name = "purpose") + private String purpose; + + @Column(name = "credential_request_id") + private String credentialRequestId; + + @Column(name = "attribute_list") + private String attributeList; + + @Column(name = "individual_id") + private String individualId; + + @Column(name = "consent") + private String consent; + + @Column(name = "tracking_id") + private String trackingId; + + /** + * The constructor used in retrieval of the specific fields. + * + * @param requestTrnId + * @param requestDTtimes + * @param authTypeCode + * @param statusCode + * @param statusComment + * @param refId + * @param entityName + */ + public ResidentTransactionEntity(String requestTrnId, LocalDateTime requestDTtimes, String authTypeCode, + String statusCode, String statusComment, String refId, String refIdType, String entityName, + String requestSignature, String responseSignature) { + this.requestTrnId = requestTrnId; + this.requestDtimes = requestDTtimes; + this.authTypeCode = authTypeCode; + this.statusCode = statusCode; + this.statusComment = statusComment; + this.refId = refId; + this.refIdType = refIdType; + this.requestedEntityName = entityName; + this.requestSignature = requestSignature; + this.responseSignature = responseSignature; + } + + /** + * The constructor used in retrieval of the specific fields. + * + */ + public ResidentTransactionEntity(String requestTrnId, String statusComment, LocalDateTime crDtimes, + String statusCode) { + this.requestTrnId = requestTrnId; + this.statusComment = statusComment; + this.crDtimes = crDtimes; + this.statusCode = statusCode; + } + + public ResidentTransactionEntity(String eventId, String statusComment, LocalDateTime crDtimes, String statusCode, + LocalDateTime updDtimes, String requestTypeCode) { + this.eventId = eventId; + this.statusComment = statusComment; + this.crDtimes = crDtimes; + this.statusCode = statusCode; + this.updDtimes = updDtimes; + this.requestTypeCode = requestTypeCode; + } + + public ResidentTransactionEntity(String aid) { + this.aid = aid; + } + + public ResidentTransactionEntity(String eventId, String requestSummary, String statusCode, + LocalDateTime requestDtimes, String requestTypeCode) { + this.eventId = eventId; + this.requestSummary = requestSummary; + this.statusCode = statusCode; + this.requestDtimes = requestDtimes; + this.requestTypeCode = requestTypeCode; + } + + public boolean getPinnedStatus() { + return this.pinnedStatus; + } + + /** + * Constructor used to get data + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenId(String, String, List, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdBetweenCrDtimes(String, String, List, LocalDateTime, LocalDateTime, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdInStatus(String, String, List, List, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdAndSearchEventId(String, String, List, String, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdInStatusBetweenCrDtimes(String, String, List, List, LocalDateTime, LocalDateTime, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdBetweenCrDtimesSearchEventId(String, String, List, LocalDateTime, LocalDateTime, String, Pageable)) + * (io.mosip.resident.repository.ResidentTransactionRepository.findByTokenIdInStatusSearchEventId(String, String, List, List, String, Pageable)) + * + * not in use + */ + public ResidentTransactionEntity(String eventId, String requestTypeCode, String statusCode, String statusComment, + String refIdType, String refId, LocalDateTime crDtimes, LocalDateTime updDtimes, boolean readStatus, + boolean pinnedStatus, String purpose, String attributeList, String authTypeCode) { + this.eventId = eventId; + this.requestTypeCode = requestTypeCode; + this.statusCode = statusCode; + this.statusComment = statusComment; + this.refIdType = refIdType; + this.refId = refId; + this.crDtimes = crDtimes; + this.updDtimes = updDtimes; + this.readStatus = readStatus; + this.pinnedStatus = pinnedStatus; + this.purpose = purpose; + this.attributeList = attributeList; + this.authTypeCode = authTypeCode; + } + + /** + * Constructor used to get data + * (io.mosip.resident.repository.ResidentTransactionRepository.findByEventId(String)) + */ + public ResidentTransactionEntity(String eventId, String requestTypeCode, String statusCode, String referenceLink) { + this.eventId = eventId; + this.requestTypeCode = requestTypeCode; + this.statusCode = statusCode; + this.referenceLink = referenceLink; + } +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentUserEntity.java b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentUserEntity.java new file mode 100644 index 00000000000..0212f495d29 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/entity/ResidentUserEntity.java @@ -0,0 +1,38 @@ +package io.mosip.resident.entity; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * This entity class defines the database table details for + * resident_user_actions table. + * + * @author Neha Farheen + * @since 1.2.0.1 + * + */ +@Data +@Table(name = "resident_user_actions", schema = "resident") +@Entity +@NoArgsConstructor + +public class ResidentUserEntity { + @Id + @Column(name = "ida_token") + private String idaToken; + + @Column(name = "last_bell_notif_click_dtimes") + private LocalDateTime lastbellnotifDtimes; + + public ResidentUserEntity(String idaToken, LocalDateTime lastbellnotifDtimes) { + this.lastbellnotifDtimes = lastbellnotifDtimes; + this.idaToken = idaToken; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ApiExceptionHandler.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ApiExceptionHandler.java index c22f546f2ce..e998d184b67 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ApiExceptionHandler.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ApiExceptionHandler.java @@ -1,197 +1,405 @@ -package io.mosip.resident.exception; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.FieldError; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.util.ContentCachingRequestWrapper; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.exception.BaseUncheckedException; -import io.mosip.kernel.core.exception.ExceptionUtils; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.util.EmptyCheckUtils; -import io.mosip.resident.constant.ResidentErrorCode; - -@RestControllerAdvice -@Order(Ordered.HIGHEST_PRECEDENCE) -public class ApiExceptionHandler { - @Autowired - private ObjectMapper objectMapper; - - @Autowired - Environment env; - - private static final String CHECK_STATUS = "resident.checkstatus.id"; - private static final String EUIN = "resident.euin.id"; - private static final String PRINT_UIN = "resident.printuin.id"; - private static final String UIN = "resident.uin.id"; - private static final String RID = "resident.rid.id"; - private static final String UPDATE_UIN = "resident.updateuin.id"; - private static final String VID = "resident.vid.id"; - private static final String AUTH_LOCK = "resident.authlock.id"; - private static final String AUTH_UNLOCK = "resident.authunlock.id"; - private static final String AUTH_HISTORY = "resident.authhistory.id"; - private static final String RESIDENT_VERSION = "resident.vid.version"; - - @ExceptionHandler(ResidentServiceException.class) - public ResponseEntity> controlDataServiceException( - HttpServletRequest httpServletRequest, final ResidentServiceException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(ResidentCredentialServiceException.class) - public ResponseEntity> controlDataServiceException( - HttpServletRequest httpServletRequest, final ResidentCredentialServiceException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(DataNotFoundException.class) - public ResponseEntity> controlDataNotFoundException( - HttpServletRequest httpServletRequest, final DataNotFoundException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(RequestException.class) - public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, - final RequestException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - private ResponseEntity> getErrorResponseEntity(HttpServletRequest httpServletRequest, - BaseUncheckedException e, HttpStatus httpStatus) throws IOException { - ServiceError error = new ServiceError(e.getErrorCode(), e.getErrorText()); - ResponseWrapper errorResponse = setErrors(httpServletRequest); - errorResponse.getErrors().add(error); - return new ResponseEntity<>(errorResponse, httpStatus); - } - - private ResponseEntity> getCheckedErrorEntity(HttpServletRequest httpServletRequest, - BaseCheckedException e, HttpStatus httpStatus) throws IOException { - ServiceError error = new ServiceError(e.getErrorCode(), e.getErrorText()); - ResponseWrapper errorResponse = setErrors(httpServletRequest); - errorResponse.getErrors().add(error); - return new ResponseEntity<>(errorResponse, httpStatus); - } - - @ExceptionHandler(InvalidInputException.class) - public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, - final InvalidInputException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(IdRepoAppException.class) - public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, - final IdRepoAppException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(OtpValidationFailedException.class) - public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, - final OtpValidationFailedException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getCheckedErrorEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(TokenGenerationFailedException.class) - public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, - final TokenGenerationFailedException e) throws IOException { - ExceptionUtils.logRootCause(e); - return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity> methodArgumentNotValidException( - final HttpServletRequest httpServletRequest, final MethodArgumentNotValidException e) throws IOException { - ResponseWrapper errorResponse = setErrors(httpServletRequest); - final List fieldErrors = e.getBindingResult().getFieldErrors(); - fieldErrors.forEach(x -> { - ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), x.getField() + ": " + x.getDefaultMessage()); - errorResponse.getErrors().add(error); - }); - return new ResponseEntity<>(errorResponse, HttpStatus.OK); - } - - @ExceptionHandler(HttpMessageNotReadableException.class) - public ResponseEntity> onHttpMessageNotReadable( - final HttpServletRequest httpServletRequest, final HttpMessageNotReadableException e) throws IOException { - ResponseWrapper errorResponse = setErrors(httpServletRequest); - ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), e.getMessage()); - errorResponse.getErrors().add(error); - return new ResponseEntity<>(errorResponse, HttpStatus.OK); - } - - @ExceptionHandler(value = { Exception.class, RuntimeException.class }) - public ResponseEntity> defaultErrorHandler(HttpServletRequest httpServletRequest, - Exception exception) throws IOException { - ResponseWrapper errorResponse = setErrors(httpServletRequest); - ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), exception.getMessage()); - errorResponse.getErrors().add(error); - ExceptionUtils.logRootCause(exception); - return new ResponseEntity<>(errorResponse, HttpStatus.OK); - } - - private ResponseWrapper setErrors(HttpServletRequest httpServletRequest) throws IOException { - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setResponsetime(LocalDateTime.now(ZoneId.of("UTC"))); - String requestBody = null; - if (httpServletRequest instanceof ContentCachingRequestWrapper) { - requestBody = new String(((ContentCachingRequestWrapper) httpServletRequest).getContentAsByteArray()); - } - if (EmptyCheckUtils.isNullEmpty(requestBody)) { - return responseWrapper; - } - objectMapper.registerModule(new JavaTimeModule()); - responseWrapper.setId(setId(httpServletRequest.getRequestURI())); - responseWrapper.setVersion(env.getProperty(RESIDENT_VERSION)); - return responseWrapper; - } - - private String setId(String requestURI) { - Map idMap = new HashMap<>(); - idMap.put("/check-status", env.getProperty(CHECK_STATUS)); - idMap.put("/euin", env.getProperty(EUIN)); - idMap.put("/print-uin", env.getProperty(PRINT_UIN)); - idMap.put("/uin", env.getProperty(UIN)); - idMap.put("/rid", env.getProperty(RID)); - idMap.put("/update-uin", env.getProperty(UPDATE_UIN)); - idMap.put("/vid", env.getProperty(VID)); - idMap.put("/auth-lock", env.getProperty(AUTH_LOCK)); - idMap.put("/auth-unlock", env.getProperty(AUTH_UNLOCK)); - idMap.put("/auth-history", env.getProperty(AUTH_HISTORY)); - - for (Map.Entry entry : idMap.entrySet()) { - if (requestURI.contains(entry.getKey())) { - return entry.getValue(); - } - } - return null; - } - +package io.mosip.resident.exception; + +import static io.mosip.resident.constant.ResidentConstants.CHECK_STATUS_ID; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.util.MultiValueMap; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.util.ContentCachingRequestWrapper; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.kernel.core.exception.ExceptionUtils; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.EmptyCheckUtils; +import io.mosip.kernel.openid.bridge.api.constants.AuthErrorCode; +import io.mosip.kernel.openid.bridge.api.exception.AuthRestException; +import io.mosip.kernel.openid.bridge.api.exception.ClientException; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.mock.exception.CantPlaceOrderException; +import io.mosip.resident.mock.exception.PaymentCanceledException; +import io.mosip.resident.mock.exception.PaymentFailedException; +import io.mosip.resident.mock.exception.TechnicalErrorException; +import io.mosip.resident.util.ObjectWithMetadata; + +@RestControllerAdvice +@Order(Ordered.HIGHEST_PRECEDENCE) +public class ApiExceptionHandler { + @Autowired + private ObjectMapper objectMapper; + + @Autowired + Environment env; + + private static final Logger logger = LoggerConfiguration.logConfig(ApiExceptionHandler.class); + + private static final String EUIN = "resident.euin.id"; + private static final String PRINT_UIN = "resident.printuin.id"; + private static final String UIN = "resident.uin.id"; + private static final String RID = "resident.rid.id"; + private static final String UPDATE_UIN = "resident.updateuin.id"; + private static final String VID = "resident.vid.id"; + private static final String AUTH_LOCK = "resident.authlock.id"; + private static final String AUTH_UNLOCK = "resident.authunlock.id"; + private static final String AUTH_HISTORY = "resident.authhistory.id"; + private static final String RESIDENT_VERSION = "resident.vid.version"; + + @ExceptionHandler(ResidentServiceException.class) + public ResponseEntity> controlDataServiceException( + HttpServletRequest httpServletRequest, final ResidentServiceException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(ResidentCredentialServiceException.class) + public ResponseEntity> controlDataServiceException( + HttpServletRequest httpServletRequest, final ResidentCredentialServiceException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(DataNotFoundException.class) + public ResponseEntity> controlDataNotFoundException( + HttpServletRequest httpServletRequest, final DataNotFoundException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(RequestException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final RequestException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + private ResponseEntity> getErrorResponseEntity(HttpServletRequest httpServletRequest, + BaseUncheckedException e, HttpStatus httpStatus) throws IOException { + ServiceError error = new ServiceError(e.getErrorCode(), e.getErrorText()); + ResponseWrapper errorResponse = setErrors(httpServletRequest); + errorResponse.getErrors().add(error); + return createResponseEntity(errorResponse, e, httpStatus); + } + + private ResponseEntity> createResponseEntity( + ResponseWrapper errorResponse, Exception e, HttpStatus httpStatus) { + if (e instanceof ObjectWithMetadata && ((ObjectWithMetadata) e).getMetadata() != null) { + MultiValueMap headers = new HttpHeaders(); + if (((ObjectWithMetadata) e).getMetadata().containsKey(ResidentConstants.EVENT_ID)) { + headers.add(ResidentConstants.EVENT_ID, + (String) ((ObjectWithMetadata) e).getMetadata().get(ResidentConstants.EVENT_ID)); + } + if (((ObjectWithMetadata) e).getMetadata().containsKey(ResidentConstants.HTTP_STATUS_CODE)) { + httpStatus = (HttpStatus) ((ObjectWithMetadata) e).getMetadata().get(ResidentConstants.HTTP_STATUS_CODE); + } + if (((ObjectWithMetadata) e).getMetadata().containsKey(ResidentConstants.REQ_RES_ID)) { + errorResponse.setId((String) ((ObjectWithMetadata) e).getMetadata().get(ResidentConstants.REQ_RES_ID)); + } + errorResponse.setVersion(env.getProperty(ResidentConstants.REQ_RES_VERSION)); + return new ResponseEntity<>(errorResponse, headers, httpStatus); + } + return new ResponseEntity<>(errorResponse, httpStatus); + } + + private ResponseEntity> getCheckedErrorEntity(HttpServletRequest httpServletRequest, + BaseCheckedException e, HttpStatus httpStatus) throws IOException { + ServiceError error = new ServiceError(e.getErrorCode(), e.getErrorText()); + ResponseWrapper errorResponse = setErrors(httpServletRequest); + errorResponse.getErrors().add(error); + return createResponseEntity(errorResponse, e, httpStatus); + } + + @ExceptionHandler(InvalidInputException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final InvalidInputException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(IdRepoAppException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final IdRepoAppException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(OtpValidationFailedException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final OtpValidationFailedException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getCheckedErrorEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(TokenGenerationFailedException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final TokenGenerationFailedException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity> methodArgumentNotValidException( + final HttpServletRequest httpServletRequest, final MethodArgumentNotValidException e) throws IOException { + ResponseWrapper errorResponse = setErrors(httpServletRequest); + final List fieldErrors = e.getBindingResult().getFieldErrors(); + fieldErrors.forEach(x -> { + ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + x.getField() + ": " + x.getDefaultMessage()); + errorResponse.getErrors().add(error); + }); + return new ResponseEntity<>(errorResponse, HttpStatus.OK); + } + + @ExceptionHandler(PaymentFailedException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final PaymentFailedException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.PAYMENT_REQUIRED); + } + + @ExceptionHandler(PaymentCanceledException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final PaymentCanceledException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.PAYMENT_REQUIRED); + } + + @ExceptionHandler(TechnicalErrorException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final TechnicalErrorException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler(CantPlaceOrderException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final CantPlaceOrderException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler(CardNotReadyException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final CardNotReadyException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(VidAlreadyPresentException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final VidAlreadyPresentException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(VidCreationException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final VidCreationException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(IndividualIdNotFoundException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final IndividualIdNotFoundException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(VidRevocationException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final VidRevocationException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity> onHttpMessageNotReadable( + final HttpServletRequest httpServletRequest, final HttpMessageNotReadableException e) throws IOException { + ResponseWrapper errorResponse = setErrors(httpServletRequest); + ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), e.getMessage()); + errorResponse.getErrors().add(error); + return new ResponseEntity<>(errorResponse, HttpStatus.OK); + } + + @ExceptionHandler(value = { Exception.class, RuntimeException.class }) + public ResponseEntity> defaultErrorHandler(HttpServletRequest httpServletRequest, + Exception exception) throws IOException { + if(exception instanceof AuthRestException) { + return new ResponseEntity>(getAuthFailedResponse(), HttpStatus.UNAUTHORIZED); + } else if(exception instanceof ClientException) { + return new ResponseEntity>(getAuthFailedResponse(), HttpStatus.UNAUTHORIZED); + } + ResponseWrapper errorResponse = setErrors(httpServletRequest); + ServiceError error = new ServiceError(ResidentErrorCode.BAD_REQUEST.getErrorCode(), exception.getMessage()); + errorResponse.getErrors().add(error); + ExceptionUtils.logRootCause(exception); + logStackTrace(exception); + return createResponseEntity(errorResponse, exception, HttpStatus.OK); + } + + private ResponseWrapper getAuthFailedResponse() { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + responseWrapper + .setErrors(List.of(new ServiceError(AuthErrorCode.UNAUTHORIZED.getErrorCode(), + AuthErrorCode.UNAUTHORIZED.getErrorMessage()))); + return responseWrapper; + } + + @ExceptionHandler(RIDInvalidException.class) + public ResponseEntity> getRidStackTraceHandler( + final HttpServletRequest httpServletRequest, final RIDInvalidException e) throws IOException { + ResponseWrapper errorResponse = setErrors(httpServletRequest); + ServiceError error = new ServiceError(e.getErrorCode(), e.getErrorText()); + errorResponse.getErrors().add(error); + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return new ResponseEntity<>(errorResponse, HttpStatus.OK); + } + + @ExceptionHandler(ResidentServiceCheckedException.class) + public ResponseEntity> getResidentServiceStackTraceHandler( + final HttpServletRequest httpServletRequest, final ResidentServiceCheckedException e) throws IOException { + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getCheckedErrorEntity(httpServletRequest, e, HttpStatus.OK); + } + + @ExceptionHandler(EventIdNotPresentException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final EventIdNotPresentException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(EidNotBelongToSessionException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final EidNotBelongToSessionException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(DigitalCardRidNotFoundException.class) + public ResponseEntity> controlRequestException(HttpServletRequest httpServletRequest, + final DigitalCardRidNotFoundException e) throws IOException{ + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return getErrorResponseEntity(httpServletRequest, e, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(ApisResourceAccessException.class) + public ResponseEntity> getApiResourceStackTraceHandler( + final HttpServletRequest httpServletRequest, final ApisResourceAccessException e) throws IOException { + if(e.getCause() instanceof HttpClientErrorException + && ((HttpClientErrorException)e.getCause()).getRawStatusCode() == HttpStatus.UNAUTHORIZED.value()) { + return new ResponseEntity>(getAuthFailedResponse(), HttpStatus.UNAUTHORIZED); + } + ResponseWrapper errorResponse = setErrors(httpServletRequest); + ServiceError error = new ServiceError(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), e.getMessage()); + errorResponse.getErrors().add(error); + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return createResponseEntity(errorResponse, e, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(AccessDeniedException.class) + public ResponseEntity> handleAccessDeniedException( + final HttpServletRequest httpServletRequest, final AccessDeniedException e) throws IOException { + ResponseWrapper errorResponse = setErrors(httpServletRequest); + ServiceError error = new ServiceError(ResidentErrorCode.FORBIDDEN.getErrorCode(), e.getMessage()); + errorResponse.getErrors().add(error); + ExceptionUtils.logRootCause(e); + logStackTrace(e); + return createResponseEntity(errorResponse, e, HttpStatus.FORBIDDEN); + } + + private static void logStackTrace(Exception e) { + logger.error(ExceptionUtils.getStackTrace(e)); + } + + private ResponseWrapper setErrors(HttpServletRequest httpServletRequest) throws IOException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponsetime(LocalDateTime.now(ZoneId.of("UTC"))); + String requestBody = null; + if (httpServletRequest instanceof ContentCachingRequestWrapper) { + requestBody = new String(((ContentCachingRequestWrapper) httpServletRequest).getContentAsByteArray()); + } + if (EmptyCheckUtils.isNullEmpty(requestBody)) { + return responseWrapper; + } + objectMapper.registerModule(new JavaTimeModule()); + responseWrapper.setId(setId(httpServletRequest.getRequestURI())); + responseWrapper.setVersion(env.getProperty(RESIDENT_VERSION)); + return responseWrapper; + } + + private String setId(String requestURI) { + Map idMap = new HashMap<>(); + idMap.put("/check-status", env.getProperty(CHECK_STATUS_ID)); + idMap.put("/euin", env.getProperty(EUIN)); + idMap.put("/print-uin", env.getProperty(PRINT_UIN)); + idMap.put("/uin", env.getProperty(UIN)); + idMap.put("/rid", env.getProperty(RID)); + idMap.put("/update-uin", env.getProperty(UPDATE_UIN)); + idMap.put("/vid", env.getProperty(VID)); + idMap.put("/auth-lock", env.getProperty(AUTH_LOCK)); + idMap.put("/auth-unlock", env.getProperty(AUTH_UNLOCK)); + idMap.put("/auth-history", env.getProperty(AUTH_HISTORY)); + + for (Map.Entry entry : idMap.entrySet()) { + if (requestURI.contains(entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ApisResourceAccessException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ApisResourceAccessException.java index 6765ff3cf55..0693bb9ab12 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ApisResourceAccessException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ApisResourceAccessException.java @@ -1,17 +1,18 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseCheckedException; +import java.util.Map; + import io.mosip.resident.constant.ResidentErrorCode; /** * The Class ApisResourceAccessException. * */ -public class ApisResourceAccessException extends BaseCheckedException { +public class ApisResourceAccessException extends BaseResidentCheckedExceptionWithMetadata { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; - + /** * Instantiates a new apis resource access exception. */ @@ -37,4 +38,12 @@ public ApisResourceAccessException(String message) { public ApisResourceAccessException(String message, Throwable cause) { super(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), message, cause); } + + public ApisResourceAccessException(String errorCode, String errorMessage, Exception exception) { + super(errorCode, errorMessage, exception); + } + + public ApisResourceAccessException(String err, Throwable rootCause, Map metadata) { + super(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), err, rootCause, metadata); + } } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentCheckedExceptionWithMetadata.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentCheckedExceptionWithMetadata.java new file mode 100644 index 00000000000..7ad4cabb5d2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentCheckedExceptionWithMetadata.java @@ -0,0 +1,54 @@ +package io.mosip.resident.exception; + +import java.util.Map; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.util.ObjectWithMetadata; + +/** + * @author Ritik Jain + */ +public class BaseResidentCheckedExceptionWithMetadata extends BaseCheckedException implements ObjectWithMetadata { + + private static final long serialVersionUID = -1561461793874550645L; + + private Map metadata; + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public BaseResidentCheckedExceptionWithMetadata() { + super(); + } + + public BaseResidentCheckedExceptionWithMetadata(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + public BaseResidentCheckedExceptionWithMetadata(String errorCode, String errorMessage, Throwable rootCause) { + super(errorCode, errorMessage, rootCause); + } + + public BaseResidentCheckedExceptionWithMetadata(ResidentErrorCode err, Map metadata) { + this(err.getErrorCode(), err.getErrorMessage()); + this.metadata = metadata; + } + + public BaseResidentCheckedExceptionWithMetadata(String errorCode, String errorMessage, Map metadata) { + this(errorCode, errorMessage); + this.metadata = metadata; + } + + public BaseResidentCheckedExceptionWithMetadata(String errorCode, String errorMessage, Throwable rootCause, + Map metadata) { + this(errorCode, errorMessage, rootCause); + this.metadata = metadata; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentUncheckedExceptionWithMetadata.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentUncheckedExceptionWithMetadata.java new file mode 100644 index 00000000000..3c103037c63 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/BaseResidentUncheckedExceptionWithMetadata.java @@ -0,0 +1,68 @@ +package io.mosip.resident.exception; + +import java.util.Map; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.util.ObjectWithMetadata; + +/** + * @author Ritik Jain + */ +public class BaseResidentUncheckedExceptionWithMetadata extends BaseUncheckedException implements ObjectWithMetadata { + + /** Generated serial version id. */ + private static final long serialVersionUID = 8621530697947108810L; + + private Map metadata; + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public BaseResidentUncheckedExceptionWithMetadata() { + super(); + } + + /** + * Constructor the initialize Handler exception. + * + * @param errorCode The error code for this exception + * @param errorMessage The error message for this exception + */ + public BaseResidentUncheckedExceptionWithMetadata(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Constructor the initialize Handler exception. + * + * @param errorCode The error code for this exception + * @param errorMessage The error message for this exception + * @param rootCause the specified cause + */ + public BaseResidentUncheckedExceptionWithMetadata(String errorCode, String errorMessage, Throwable rootCause) { + super(errorCode, errorMessage, rootCause); + } + + public BaseResidentUncheckedExceptionWithMetadata(ResidentErrorCode err, Map metadata) { + this(err.getErrorCode(), err.getErrorMessage()); + this.metadata = metadata; + } + + public BaseResidentUncheckedExceptionWithMetadata(ResidentErrorCode err, Throwable rootCause, Map metadata) { + this(err.getErrorCode(), err.getErrorMessage(), rootCause); + this.metadata = metadata; + } + + public BaseResidentUncheckedExceptionWithMetadata(String errorCode, String errorMessage, Throwable rootCause, + Map metadata) { + this(errorCode, errorMessage, rootCause); + this.metadata = metadata; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/CardNotReadyException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/CardNotReadyException.java new file mode 100644 index 00000000000..4d3211d3586 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/CardNotReadyException.java @@ -0,0 +1,56 @@ +package io.mosip.resident.exception; + +import java.util.Map; + +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception for card not available use case. + */ +public class CardNotReadyException extends BaseResidentUncheckedExceptionWithMetadata { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public CardNotReadyException() { + super(ResidentErrorCode.CARD_NOT_READY.getErrorCode(), ResidentErrorCode.CARD_NOT_READY.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public CardNotReadyException(String errorMessage) { + super(ResidentErrorCode.CARD_NOT_READY.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public CardNotReadyException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public CardNotReadyException(String message, Throwable cause) { + super(ResidentErrorCode.CARD_NOT_READY.getErrorCode(), message, cause); + } + + public CardNotReadyException(Map metadata) { + super(ResidentErrorCode.CARD_NOT_READY, metadata); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/DigitalCardRidNotFoundException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/DigitalCardRidNotFoundException.java new file mode 100644 index 00000000000..95db3b4ff66 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/DigitalCardRidNotFoundException.java @@ -0,0 +1,27 @@ +/** + * + */ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Aiham Hasan + *This class is used to throw exception for Digital Card RID not found use case. + * + */ +public class DigitalCardRidNotFoundException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + public DigitalCardRidNotFoundException () { + super(ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorCode(), ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorMessage()); + } + + public DigitalCardRidNotFoundException(String errorCode, String errorMessage) { + super(ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorCode(), ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorMessage()); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/EidNotBelongToSessionException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/EidNotBelongToSessionException.java new file mode 100644 index 00000000000..1b9c42d0dea --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/EidNotBelongToSessionException.java @@ -0,0 +1,31 @@ +/** + * + */ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Aiham Hasan + *This class is used to throw exception for EID not belong to session use case. + * + */ +public class EidNotBelongToSessionException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + public EidNotBelongToSessionException () { + super(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorCode(), ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorMessage()); + } + + public EidNotBelongToSessionException(ResidentErrorCode eidNotBelongToSession) { + super(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorCode()); + } + + public EidNotBelongToSessionException(ResidentErrorCode eidNotBelongToSession, String errorMessage) { + super(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorCode(), ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorMessage()); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/EventIdNotPresentException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/EventIdNotPresentException.java new file mode 100644 index 00000000000..02c21480e97 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/EventIdNotPresentException.java @@ -0,0 +1,26 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; + +/** + * @author Kamesh Shekhar Prasad + */ +public class EventIdNotPresentException extends BaseUncheckedException { + + + private static final long serialVersionUID = 5320581589143112542L; + + public EventIdNotPresentException() { + super(); + } + + /** + * Instantiates a new exception. + * + * @param errorCode the error code + * @param errorMessage the error message + */ + public EventIdNotPresentException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/IndividualIdNotFoundException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/IndividualIdNotFoundException.java new file mode 100644 index 00000000000..ebf69c09a56 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/IndividualIdNotFoundException.java @@ -0,0 +1,31 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception if invalid id is found. + */ + +public class IndividualIdNotFoundException extends BaseUncheckedException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public IndividualIdNotFoundException() { + super(ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorCode(), ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorMessage()); + } + + public IndividualIdNotFoundException(String errorMessage) { + super(ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorCode(), errorMessage); + } + + public IndividualIdNotFoundException(String errorCode, String errorMessage){ + super(errorCode, errorMessage); + } + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidInputException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidInputException.java index e3813ceff06..df9fd1ba1c3 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidInputException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidInputException.java @@ -1,11 +1,15 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; import io.mosip.resident.constant.ResidentErrorCode; -public class InvalidInputException extends BaseUncheckedException { +public class InvalidInputException extends BaseResidentUncheckedExceptionWithMetadata { - public InvalidInputException() { + /** + * + */ + private static final long serialVersionUID = 7102528338044174257L; + + public InvalidInputException() { super(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage()); } @@ -14,6 +18,10 @@ public InvalidInputException(String errorMessage) { } public InvalidInputException(String message, Throwable cause) { - super(ResidentErrorCode.INVALID_INPUT.getErrorCode(), message, cause); + super(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage() + message, cause); + } + + public InvalidInputException(String message, String message2) { + super(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage() + message); } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidRequestTypeCodeException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidRequestTypeCodeException.java new file mode 100644 index 00000000000..200974cff17 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/InvalidRequestTypeCodeException.java @@ -0,0 +1,26 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; + +/** + * @author Kamesh + */ +public class InvalidRequestTypeCodeException extends BaseUncheckedException { + + private static final long serialVersionUID = 5320581589143112542L; + + public InvalidRequestTypeCodeException() { + super(); + } + + /** + * Instantiates a new exception. + * + * @param errorCode the error code + * @param errorMessage the error message + */ + public InvalidRequestTypeCodeException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/OtpValidationFailedException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/OtpValidationFailedException.java index 05deb459551..7d27e60c24e 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/OtpValidationFailedException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/OtpValidationFailedException.java @@ -1,49 +1,61 @@ -package io.mosip.resident.exception; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.resident.constant.ResidentErrorCode; - -import static io.mosip.kernel.core.exception.BaseUncheckedException.EMPTY_SPACE; - -public class OtpValidationFailedException extends BaseCheckedException { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 1L; - - /** - * Instantiates a new otp validation failed exception. - */ - public OtpValidationFailedException() { - super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); - } - - /** - * Instantiates a new otp validation failed exception. - * - * @param errorMessage - * the error message - */ - public OtpValidationFailedException(String errorMessage) { - super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), errorMessage); - } - - /** - * - * @param errorMessage - */ - public OtpValidationFailedException(String errorCode, String errorMessage) { - super(errorCode, errorMessage); - } - - /** - * Instantiates a new otp validation failed exception. - * - * @param message - * the message - * @param cause - * the cause - */ - public OtpValidationFailedException(String message, Throwable cause) { - super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), message, cause); - } -} +package io.mosip.resident.exception; + +import java.util.Map; + +import io.mosip.resident.constant.ResidentErrorCode; + +public class OtpValidationFailedException extends BaseResidentCheckedExceptionWithMetadata { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public OtpValidationFailedException() { + super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public OtpValidationFailedException(String errorMessage) { + super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public OtpValidationFailedException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public OtpValidationFailedException(String message, Throwable cause) { + super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), message, cause); + } + + public OtpValidationFailedException(String errorMessage, Map metadata) { + super(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), errorMessage, metadata); + } + + public OtpValidationFailedException(String errorCode, String errorMessage, Map metadata) { + super(errorCode, errorMessage,metadata); + } + + public OtpValidationFailedException(String errorCode, String errorText, OtpValidationFailedException e, + Map metadata) { + super(errorCode, errorText, e, metadata); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketEncryptionFailureException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketEncryptionFailureException.java new file mode 100644 index 00000000000..8df2d076836 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketEncryptionFailureException.java @@ -0,0 +1,30 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * The Class PacketEncryptionFailureException. + * @author Kamesh Shekhar Prasad + */ + +public class PacketEncryptionFailureException extends BaseUncheckedException { + private static final long serialVersionUID = 1L; + + public PacketEncryptionFailureException() { + super(ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorCode(), + ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorMessage()); + } + + public PacketEncryptionFailureException(Throwable t) { + super(ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorCode(), ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorMessage(), t); + } + + public PacketEncryptionFailureException(String message, Throwable cause) { + super(ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorCode(), message, cause); + } + + public PacketEncryptionFailureException(String errorMessage) { + super(ResidentErrorCode.PACKET_ENCRYPTION_FAILURE_EXCEPTION.getErrorCode(), errorMessage); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketManagerException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketManagerException.java index 0edb7a2866a..54d5554f6fd 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketManagerException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/PacketManagerException.java @@ -4,7 +4,12 @@ public class PacketManagerException extends BaseCheckedException { - public PacketManagerException(String errorCode, String message) { + /** + * + */ + private static final long serialVersionUID = -4181242224801724711L; + + public PacketManagerException(String errorCode, String message) { super(errorCode, message); } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/RIDInvalidException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/RIDInvalidException.java index 58ffc6c529f..2bfa1f376dd 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/RIDInvalidException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/RIDInvalidException.java @@ -1,8 +1,6 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; - -public class RIDInvalidException extends BaseUncheckedException { +public class RIDInvalidException extends BaseResidentUncheckedExceptionWithMetadata { /** * Generated serial version id diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentCredentialServiceException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentCredentialServiceException.java index 984666a0a43..8f2a1c2f270 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentCredentialServiceException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentCredentialServiceException.java @@ -1,14 +1,16 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; +import java.util.Map; -public class ResidentCredentialServiceException extends BaseUncheckedException { +import io.mosip.resident.constant.ResidentErrorCode; + +public class ResidentCredentialServiceException extends BaseResidentUncheckedExceptionWithMetadata { /** * Generated serial version id */ private static final long serialVersionUID = 8621530697947108810L; - + /** * Constructor the initialize Handler exception * @@ -29,4 +31,8 @@ public ResidentCredentialServiceException(String errorCode, String errorMessage) public ResidentCredentialServiceException(String errorCode, String errorMessage, Throwable rootCause) { super(errorCode, errorMessage, rootCause); } + + public ResidentCredentialServiceException(ResidentErrorCode err, Throwable rootCause, Map metadata) { + super(err.getErrorCode(), err.getErrorMessage(), rootCause, metadata); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceCheckedException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceCheckedException.java index 12026a2469f..c3b4f940cc4 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceCheckedException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceCheckedException.java @@ -1,17 +1,25 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseCheckedException; +import java.util.Map; + +import io.mosip.resident.constant.ResidentErrorCode; + /** * * @author Girish Yarru * */ -public class ResidentServiceCheckedException extends BaseCheckedException { +public class ResidentServiceCheckedException extends BaseResidentCheckedExceptionWithMetadata { + private static final long serialVersionUID = -1561461793874550645L; - + public ResidentServiceCheckedException() { super(); } + + public ResidentServiceCheckedException(ResidentErrorCode error) { + this(error.getErrorCode(), error.getErrorMessage()); + } public ResidentServiceCheckedException(String errorCode, String errorMessage) { super(errorCode, errorMessage); @@ -21,4 +29,17 @@ public ResidentServiceCheckedException(String errorCode, String errorMessage, Th super(errorCode, errorMessage, rootCause); } + public ResidentServiceCheckedException(ResidentErrorCode error, ApisResourceAccessException e) { + this(error.getErrorCode(), error.getErrorMessage(), e); + } + + public ResidentServiceCheckedException(ResidentErrorCode err, Map metadata) { + super(err, metadata); + } + + public ResidentServiceCheckedException(String errorCode, String errorMessage, Throwable rootCause, + Map metadata) { + super(errorCode, errorMessage, rootCause, metadata); + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceException.java index d03e4343b69..381398c616e 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentServiceException.java @@ -1,27 +1,43 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; +import java.util.Map; -public class ResidentServiceException extends BaseUncheckedException { +import io.mosip.resident.constant.ResidentErrorCode; - /** - * Generated serial version id - */ - private static final long serialVersionUID = 8621530697947108810L; +/** + * The Class ResidentServiceException. + */ +public class ResidentServiceException extends BaseResidentUncheckedExceptionWithMetadata { + /** Generated serial version id. */ + private static final long serialVersionUID = 8621530697947108810L; + /** - * Constructor the initialize Handler exception - * + * Constructor the initialize Handler exception. + * * @param errorCode The error code for this exception * @param errorMessage The error message for this exception */ public ResidentServiceException(String errorCode, String errorMessage) { super(errorCode, errorMessage); } + + /** + * Instantiates a new resident service exception. + * + * @param err the err + */ + public ResidentServiceException(ResidentErrorCode err) { + this(err.getErrorCode(), err.getErrorMessage()); + } + + public ResidentServiceException(ResidentErrorCode err, String... args) { + this(err.getErrorCode(), String.format(err.getErrorMessage(), args)); + } /** - * Constructor the initialize Handler exception - * + * Constructor the initialize Handler exception. + * * @param errorCode The error code for this exception * @param errorMessage The error message for this exception * @param rootCause the specified cause @@ -30,4 +46,27 @@ public ResidentServiceException(String errorCode, String errorMessage, Throwable super(errorCode, errorMessage, rootCause); } + /** + * Instantiates a new resident service exception. + * + * @param err the err + * @param rootCause the root cause + */ + public ResidentServiceException(ResidentErrorCode err, Throwable rootCause) { + this(err.getErrorCode(), err.getErrorMessage(), rootCause); + } + + public ResidentServiceException(ResidentErrorCode err, Throwable rootCause, Map metadata) { + super(err, rootCause, metadata); + } + + public ResidentServiceException(ResidentErrorCode err, Map metadata) { + super(err, metadata); + } + + public ResidentServiceException(String errorCode, String errorMessage, Throwable rootCause, + Map metadata) { + super(errorCode, errorMessage, rootCause, metadata); + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentVidExceptionHandler.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentVidExceptionHandler.java index c3a52f5c1fa..5af7723397d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentVidExceptionHandler.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ResidentVidExceptionHandler.java @@ -1,157 +1,155 @@ -package io.mosip.resident.exception; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.exception.BaseUncheckedException; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.controller.ResidentVidController; -import io.mosip.resident.dto.ResponseWrapper; - -@RestControllerAdvice(assignableTypes = ResidentVidController.class) -public class ResidentVidExceptionHandler { - - private static final String RESIDENT_VID_ID = "resident.vid.id"; - private static final String RESIDENT_VID_VERSION = "resident.vid.version"; - private static final String RESIDENT_REVOKE_VID_ID = "resident.revokevid.id"; - - @Autowired - private Environment env; - - - - private static Logger logger = LoggerConfiguration.logConfig(ResidentVidExceptionHandler.class); - - @ExceptionHandler(ResidentServiceCheckedException.class) - public ResponseEntity residentCheckedException(HttpServletRequest httpServletRequest, - ResidentServiceCheckedException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(ResidentServiceException.class) - public ResponseEntity residentServiceException(HttpServletRequest httpServletRequest, - ResidentServiceException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(VidAlreadyPresentException.class) - public ResponseEntity vidAlreadyPresent(HttpServletRequest httpServletRequest, - VidAlreadyPresentException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(VidCreationException.class) - public ResponseEntity vidCreationFailed(HttpServletRequest httpServletRequest, VidCreationException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(ApisResourceAccessException.class) - public ResponseEntity apiNotAccessible(HttpServletRequest httpServletRequest, - ApisResourceAccessException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(OtpValidationFailedException.class) - public ResponseEntity otpValidationFailed(HttpServletRequest httpServletRequest, - OtpValidationFailedException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(InvalidInputException.class) - public ResponseEntity invalidInput(HttpServletRequest httpServletRequest, InvalidInputException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(VidRevocationException.class) - public ResponseEntity vidRevocationFailed(HttpServletRequest httpServletRequest, VidRevocationException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - @ExceptionHandler(IdRepoAppException.class) - public ResponseEntity idRepoAppExceptionFailed(HttpServletRequest httpServletRequest, - IdRepoAppException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - e.getErrorCode(), e.getMessage()); - return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); - } - - private ResponseEntity buildRegStatusExceptionResponse(HttpServletRequest httpServletRequest, - Exception ex) { - - ResponseWrapper response = new ResponseWrapper(); - Throwable e = ex; - - if (e instanceof BaseCheckedException) { - List errorCodes = ((BaseCheckedException) e).getCodes(); - List errorTexts = ((BaseCheckedException) e).getErrorTexts(); - - List errors = errorTexts.parallelStream() - .map(errMsg -> new ServiceError(errorCodes.get(errorTexts.indexOf(errMsg)), errMsg)).distinct() - .collect(Collectors.toList()); - - response.setErrors(errors); - } else if (e instanceof BaseUncheckedException) { - List errorCodes = ((BaseUncheckedException) e).getCodes(); - List errorTexts = ((BaseUncheckedException) e).getErrorTexts(); - - List errors = errorTexts.parallelStream() - .map(errMsg -> new ServiceError(errorCodes.get(errorTexts.indexOf(errMsg)), errMsg)).distinct() - .collect(Collectors.toList()); - - response.setErrors(errors); - } - response.setId(setId(httpServletRequest.getRequestURI())); - response.setVersion(env.getProperty(RESIDENT_VID_VERSION)); - response.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); - response.setResponse(null); - - return ResponseEntity.status(HttpStatus.OK).body(response); - - } - - private String setId(String requestURI) { - Map idMap = new HashMap<>(); - idMap.put("/vid/", env.getProperty(RESIDENT_REVOKE_VID_ID)); - idMap.put("/vid", env.getProperty(RESIDENT_VID_ID)); - - for (Map.Entry entry : idMap.entrySet()) { - if (requestURI.contains(entry.getKey())) { - return entry.getValue(); - } - } - return null; - } - -} +package io.mosip.resident.exception; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.controller.ResidentVidController; +import io.mosip.resident.dto.ResponseWrapper; + +@RestControllerAdvice(assignableTypes = ResidentVidController.class) +public class ResidentVidExceptionHandler { + + private static final String RESIDENT_VID_ID = "resident.vid.id"; + private static final String RESIDENT_VID_VERSION = "resident.vid.version"; + private static final String RESIDENT_REVOKE_VID_ID = "resident.revokevid.id"; + + @Autowired + private Environment env; + + private static Logger logger = LoggerConfiguration.logConfig(ResidentVidExceptionHandler.class); + + @ExceptionHandler(ResidentServiceCheckedException.class) + public ResponseEntity residentCheckedException(HttpServletRequest httpServletRequest, + ResidentServiceCheckedException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(ResidentServiceException.class) + public ResponseEntity residentServiceException(HttpServletRequest httpServletRequest, + ResidentServiceException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(VidAlreadyPresentException.class) + public ResponseEntity vidAlreadyPresent(HttpServletRequest httpServletRequest, + VidAlreadyPresentException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(VidCreationException.class) + public ResponseEntity vidCreationFailed(HttpServletRequest httpServletRequest, VidCreationException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(ApisResourceAccessException.class) + public ResponseEntity apiNotAccessible(HttpServletRequest httpServletRequest, + ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(OtpValidationFailedException.class) + public ResponseEntity otpValidationFailed(HttpServletRequest httpServletRequest, + OtpValidationFailedException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(InvalidInputException.class) + public ResponseEntity invalidInput(HttpServletRequest httpServletRequest, InvalidInputException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(VidRevocationException.class) + public ResponseEntity vidRevocationFailed(HttpServletRequest httpServletRequest, VidRevocationException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + @ExceptionHandler(IdRepoAppException.class) + public ResponseEntity idRepoAppExceptionFailed(HttpServletRequest httpServletRequest, + IdRepoAppException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + e.getErrorCode(), e.getMessage()); + return buildRegStatusExceptionResponse(httpServletRequest, (Exception) e); + } + + private ResponseEntity buildRegStatusExceptionResponse(HttpServletRequest httpServletRequest, + Exception ex) { + + ResponseWrapper response = new ResponseWrapper(); + Throwable e = ex; + + if (e instanceof BaseCheckedException) { + List errorCodes = ((BaseCheckedException) e).getCodes(); + List errorTexts = ((BaseCheckedException) e).getErrorTexts(); + + List errors = errorTexts.parallelStream() + .map(errMsg -> new ServiceError(errorCodes.get(errorTexts.indexOf(errMsg)), errMsg)).distinct() + .collect(Collectors.toList()); + + response.setErrors(errors); + } else if (e instanceof BaseUncheckedException) { + List errorCodes = ((BaseUncheckedException) e).getCodes(); + List errorTexts = ((BaseUncheckedException) e).getErrorTexts(); + + List errors = errorTexts.parallelStream() + .map(errMsg -> new ServiceError(errorCodes.get(errorTexts.indexOf(errMsg)), errMsg)).distinct() + .collect(Collectors.toList()); + + response.setErrors(errors); + } + response.setId(setId(httpServletRequest.getRequestURI())); + response.setVersion(env.getProperty(RESIDENT_VID_VERSION)); + response.setResponsetime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + response.setResponse(null); + + return ResponseEntity.status(HttpStatus.OK).body(response); + + } + + private String setId(String requestURI) { + Map idMap = new HashMap<>(); + idMap.put("/vid/", env.getProperty(RESIDENT_REVOKE_VID_ID)); + idMap.put("/vid", env.getProperty(RESIDENT_VID_ID)); + + for (Map.Entry entry : idMap.entrySet()) { + if (requestURI.contains(entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/ValidationFailedException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/ValidationFailedException.java new file mode 100644 index 00000000000..70917808121 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/ValidationFailedException.java @@ -0,0 +1,42 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.BaseCheckedException; + +public class ValidationFailedException extends BaseCheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new validation failed exception. + */ + public ValidationFailedException() { + super(); + } + + /** + * Instantiates a new validation failed exception. + * + * @param errorCode + * the errorCode + * @param errorMessage + * the errorMessage + */ + public ValidationFailedException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new validation failed exception. + * + * @param errorCode + * the errorCode + * @param errorMessage + * the errorMessage + * @param cause + * the cause + */ + public ValidationFailedException(String errorCode, String errorMessage, Throwable cause) { + super(errorCode, errorMessage, cause); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidAlreadyPresentException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidAlreadyPresentException.java index 22a0fcd1244..a1ee87c87ad 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidAlreadyPresentException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidAlreadyPresentException.java @@ -1,12 +1,17 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; +import java.util.Map; -import java.io.Serializable; +import io.mosip.resident.constant.ResidentErrorCode; -public class VidAlreadyPresentException extends BaseUncheckedException { +public class VidAlreadyPresentException extends BaseResidentUncheckedExceptionWithMetadata { - public VidAlreadyPresentException() { + /** + * + */ + private static final long serialVersionUID = 5320581589143112542L; + + public VidAlreadyPresentException() { super(); } @@ -17,6 +22,14 @@ public VidAlreadyPresentException() { * @param errorMessage the error message */ public VidAlreadyPresentException(String errorCode, String errorMessage) { - super(errorCode, errorMessage); + super(errorCode, ResidentErrorCode.VID_ALREADY_PRESENT.getErrorMessage()); } + + public VidAlreadyPresentException(String errorMessage, Throwable cause) { + super(ResidentErrorCode.VID_ALREADY_PRESENT.getErrorCode(), ResidentErrorCode.VID_ALREADY_PRESENT.getErrorMessage(), cause); + } + + public VidAlreadyPresentException(String errorMessage, Throwable rootCause, Map metadata) { + super(ResidentErrorCode.VID_ALREADY_PRESENT.getErrorCode(), ResidentErrorCode.VID_ALREADY_PRESENT.getErrorMessage(), rootCause, metadata); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidCreationException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidCreationException.java index 13345b74390..b5a904a4df4 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidCreationException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidCreationException.java @@ -1,10 +1,10 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; -import io.mosip.resident.constant.ResidentErrorCode; +import java.util.Map; +import io.mosip.resident.constant.ResidentErrorCode; -public class VidCreationException extends BaseUncheckedException { +public class VidCreationException extends BaseResidentUncheckedExceptionWithMetadata { /** * @@ -24,5 +24,12 @@ public VidCreationException(String errorMessage) { super(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorCode(), errorMessage); } + public VidCreationException(String errorMessage, Throwable cause) { + super(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorCode(), errorMessage, cause); + } + + public VidCreationException(String errorMessage, Throwable rootCause, Map metadata) { + super(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorCode(), errorMessage, rootCause, metadata); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidRevocationException.java b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidRevocationException.java index 9db8047c319..5c5bb814f4e 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/exception/VidRevocationException.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/exception/VidRevocationException.java @@ -1,9 +1,10 @@ package io.mosip.resident.exception; -import io.mosip.kernel.core.exception.BaseUncheckedException; +import java.util.Map; + import io.mosip.resident.constant.ResidentErrorCode; -public class VidRevocationException extends BaseUncheckedException{ +public class VidRevocationException extends BaseResidentUncheckedExceptionWithMetadata { /** * @@ -22,5 +23,12 @@ public VidRevocationException() { public VidRevocationException(String errorMessage) { super(ResidentErrorCode.VID_REVOCATION_EXCEPTION.getErrorCode(), errorMessage); } + public VidRevocationException(String errorMessage, Throwable rootCause) { + super(ResidentErrorCode.VID_REVOCATION_EXCEPTION.getErrorCode(), errorMessage, rootCause); + } + + public VidRevocationException(String errorMessage, Throwable rootCause, Map metadata) { + super(ResidentErrorCode.VID_REVOCATION_EXCEPTION.getErrorCode(), errorMessage, rootCause, metadata); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/filter/LoggingFilter.java b/resident/resident-service/src/main/java/io/mosip/resident/filter/LoggingFilter.java new file mode 100644 index 00000000000..1449c8226d8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/filter/LoggingFilter.java @@ -0,0 +1,87 @@ +package io.mosip.resident.filter; + +import java.io.IOException; +import java.util.Iterator; +import java.util.stream.Collectors; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; + +/** + * Logging filter - used to log the request for debugging purpose + * + * @author Loganathan S + * + */ +@Component +@ConditionalOnProperty(value = "resident.logging.filter.enabled", havingValue = "true", matchIfMissing = false) +public class LoggingFilter implements Filter { + + private static final Logger logger = LoggerConfiguration.logConfig(LoggingFilter.class); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + logger.debug("Beginning to process request at: " + DateUtils.getUTCCurrentDateTime()); + ServletRequest requestRef; + if (!(request instanceof RepeatableStreamHttpServletRequest) && request instanceof HttpServletRequest) { + //Since it is already RepeatableStreamHttpServletRequest, we can use the same + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + RepeatableStreamHttpServletRequest reusableRequest = new RepeatableStreamHttpServletRequest( + httpServletRequest); + logger.debug("URI: " + httpServletRequest.getRequestURI()); + requestRef = reusableRequest; + printHeaders(reusableRequest); + printBody(reusableRequest); + } else { + requestRef = request; + } + chain.doFilter(requestRef, response); + logger.debug("Request processed at: " + DateUtils.getUTCCurrentDateTime()); + } + + private void printBody(ServletRequest request) throws IOException { + if(request instanceof HttpServletRequest) { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String body = httpServletRequest.getReader().lines().collect(Collectors.joining(System.lineSeparator())); + if(!body.isEmpty()) { + logger.debug(String.format("Body: %s", body)); + } + } + } + + private void printHeaders(ServletRequest request) { + if(request instanceof HttpServletRequest) { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + Iterator headerNames = httpServletRequest.getHeaderNames().asIterator(); + StringBuffer headers = new StringBuffer(); + headerNames.forEachRemaining(header -> headers.append(String.format("%s -> %s; ", header, httpServletRequest.getHeader(header)))); + logger.debug(String.format("Headers: %s", headers)); + String headersTxt = headers.toString(); + if(!headersTxt.isEmpty()) { + logger.debug(String.format("Headers: %s", headersTxt)); + } + } + } + + @Override + public void destroy() { + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/filter/RepeatableStreamHttpServletRequest.java b/resident/resident-service/src/main/java/io/mosip/resident/filter/RepeatableStreamHttpServletRequest.java new file mode 100644 index 00000000000..0bfc0ce15fb --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/filter/RepeatableStreamHttpServletRequest.java @@ -0,0 +1,205 @@ +package io.mosip.resident.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Map; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.springframework.util.StreamUtils; + +import io.mosip.resident.util.ObjectWithMetadata; + +/** + * The request wrapper used in filter that allows to re-read the request + * body. + * + * @author Loganathan Sekar + */ +public class RepeatableStreamHttpServletRequest extends HttpServletRequestWrapper implements ObjectWithMetadata { + + /** The raw data. */ + private byte[] rawData; + + /** The request. */ + private HttpServletRequest request; + + /** The servlet stream. */ + private RepeatableServletInputStream servletStream; + + private Map metadata; + + /** + * Instantiates a new resettable stream http servlet request. + * + * @param request the request + */ + public RepeatableStreamHttpServletRequest(HttpServletRequest request) { + super(request); + this.request = request; + this.servletStream = new RepeatableServletInputStream(); + } + + /** + * Reset input stream. + */ + public void resetInputStream() { + servletStream.stream = createServletInputStream(); + } + + private RepeatableServletInputStream createServletInputStream() { + return new RepeatableServletInputStream(new ByteArrayInputStream(rawData)); + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.ServletRequestWrapper#getInputStream() + */ + @Override + public ServletInputStream getInputStream() throws IOException { + if (rawData == null) { + rawData = StreamUtils.copyToByteArray(this.request.getInputStream()); + servletStream.stream = createServletInputStream(); + } + RepeatableServletInputStream servletStreamOldRef = servletStream; + //Reset the servlet stream with a new copy + resetInputStream(); + //Return the old copy of servlet stream + return servletStreamOldRef; + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.ServletRequestWrapper#getReader() + */ + @Override + public BufferedReader getReader() throws IOException { + if (rawData == null) { + rawData = StreamUtils.copyToByteArray(this.request.getInputStream()); + servletStream.stream = createServletInputStream(); + } + RepeatableServletInputStream servletStreamOldRef = servletStream; + //Reset the servlet stream with a new copy + resetInputStream(); + //Return the reader with the old copy of servlet stream + return new BufferedReader(new InputStreamReader(servletStreamOldRef)); + } + + /** + * Replace the request data with the given bytes + * + * @param newData the new data to be replaced with + */ + public void replaceData(byte[] newData) { + rawData = newData; + servletStream.stream = new ByteArrayInputStream(rawData); + } + + /** + * The Class RepeatableServletInputStream - used in + * RepeatableServletInputStream + */ + private class RepeatableServletInputStream extends ServletInputStream { + + /** The stream. */ + private InputStream stream; + + /** The eof reached. */ + private boolean eofReached; + + /** The closed. */ + private boolean closed; + + /** + * Instantiates a new resettable servlet input stream. + * + * @param stream the stream + */ + public RepeatableServletInputStream(InputStream stream) { + this.stream = stream; + } + + /** + * Instantiates a new resettable servlet input stream. + */ + public RepeatableServletInputStream() { + } + + /* + * (non-Javadoc) + * + * @see java.io.InputStream#read() + */ + @Override + public int read() throws IOException { + int val = stream.read(); + if (val == -1) { + eofReached = true; + } + return val; + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.ServletInputStream#isFinished() + */ + @Override + public boolean isFinished() { + return eofReached; + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.ServletInputStream#isReady() + */ + @Override + public boolean isReady() { + return !eofReached && !closed; + } + + /* + * (non-Javadoc) + * + * @see java.io.InputStream#close() + */ + @Override + public void close() throws IOException { + super.close(); + closed = true; + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.ServletInputStream#setReadListener(javax.servlet. + * ReadListener) + */ + @Override + public void setReadListener(ReadListener listener) { + // Nothing to do + } + } + + @Override + public Map getMetadata() { + return metadata; + } + + @Override + public void setMetadata(Map metadata) { + this.metadata = metadata; + + } + + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/filter/WebsubCallbackRequestDecoratorFilter.java b/resident/resident-service/src/main/java/io/mosip/resident/filter/WebsubCallbackRequestDecoratorFilter.java new file mode 100644 index 00000000000..c6daf9f4153 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/filter/WebsubCallbackRequestDecoratorFilter.java @@ -0,0 +1,54 @@ +package io.mosip.resident.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +/** + * Servlet filter creating a repeatable servlet request wrapper to allow re-read + * of the request by the {@code WebSubClientAspect}. This was added because + * of the issue with the aspect was not able to get the request body for the signature + * verification as the request is already read by the spring framework message + * converter ({@code AbstractMessageConverterMethodArgumentResolver}. + * + * @author Loganathan S + * + */ +@Component +@ConditionalOnProperty(value = "resident.websub.request.decorator.filter.enabled", havingValue = "true", matchIfMissing = true) +public class WebsubCallbackRequestDecoratorFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + if (request instanceof RepeatableStreamHttpServletRequest) { + //Since it is already RepeatableStreamHttpServletRequest, we can use the same + chain.doFilter(request, response); + } else if (request instanceof HttpServletRequest) { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + RepeatableStreamHttpServletRequest reusableRequest = new RepeatableStreamHttpServletRequest( + httpServletRequest); + chain.doFilter(reusableRequest, response); + } else { + chain.doFilter(request, response); + } + } + + @Override + public void destroy() { + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/function/FiveArgsFunction.java b/resident/resident-service/src/main/java/io/mosip/resident/function/FiveArgsFunction.java new file mode 100644 index 00000000000..c80c03396e7 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/function/FiveArgsFunction.java @@ -0,0 +1,29 @@ +package io.mosip.resident.function; + +/** + * + * @author Loganathan Sekar + * + * @param Type Argument 1 + * @param Type Argument 2 + * @param Type Argument 3 + * @param Type Argument 4 + * @param Type Argument 5 + * @param Return type + */ +@FunctionalInterface +public interface FiveArgsFunction { + + /** + * Applies this function to the given arguments. + * + * @param t the first function argument + * @param u the second function argument + * @param v the third function argument + * @param w the fourth function argument + * @param w the fifth function argument + * @return the function result + */ + R apply(T t, U u, V v, W w, X x); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/function/FourArgsFunction.java b/resident/resident-service/src/main/java/io/mosip/resident/function/FourArgsFunction.java new file mode 100644 index 00000000000..ef320ac035d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/function/FourArgsFunction.java @@ -0,0 +1,27 @@ +package io.mosip.resident.function; + +/** + * + * @author Loganathan Sekar + * + * @param Type Argument 1 + * @param Type Argument 2 + * @param Type Argument 3 + * @param Type Argument 4 + * @param Return type + */ +@FunctionalInterface +public interface FourArgsFunction { + + /** + * Applies this function to the given arguments. + * + * @param t the first function argument + * @param u the second function argument + * @param v the third function argument + * @param w the fourth function argument + * @return the function result + */ + R apply(T t, U u, V v, W w); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/function/RunnableWithException.java b/resident/resident-service/src/main/java/io/mosip/resident/function/RunnableWithException.java new file mode 100644 index 00000000000..8ce95397a5d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/function/RunnableWithException.java @@ -0,0 +1,14 @@ +package io.mosip.resident.function; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * @author Kamesh Shekhar Prasad + * This interface is used to throw exception. + */ +@FunctionalInterface +public interface RunnableWithException { + void run() throws ApisResourceAccessException, ResidentServiceCheckedException; +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/function/ThreeArgsFunction.java b/resident/resident-service/src/main/java/io/mosip/resident/function/ThreeArgsFunction.java new file mode 100644 index 00000000000..016cef71553 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/function/ThreeArgsFunction.java @@ -0,0 +1,25 @@ +package io.mosip.resident.function; + +/** + * + * @author Loganathan Sekar + * + * @param Type Argument 1 + * @param Type Argument 2 + * @param Type Argument 3 + * @param Return type + */ +@FunctionalInterface +public interface ThreeArgsFunction { + + /** + * Applies this function to the given arguments. + * + * @param t the first function argument + * @param u the second function argument + * @param v the third function argument + * @return the function result + */ + R apply(T t, U u, V v); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentConfigService.java b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentConfigService.java new file mode 100644 index 00000000000..71c8d84be5d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentConfigService.java @@ -0,0 +1,62 @@ +package io.mosip.resident.handler.service; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * The Interface ResidentConfigService. + * + * @author Loganathan.S + */ +public interface ResidentConfigService { + + /** + * Gets the properties. + * + * @return the properties + */ + ResponseWrapper getUIProperties(); + + /** + * Gets the UI schema. + * + * @return the UI schema + */ + String getUISchema(String schemaType); + + /** + * Gets the ui schema filtered input attributes. + * + * @return the ui schema filtered input attributes + * @throws JsonParseException the json parse exception + * @throws JsonMappingException the json mapping exception + * @throws IOException Signals that an I/O exception has occurred. + */ + List getUiSchemaFilteredInputAttributes(String schemaType); + + /** + * Gets the Identity Mapping json + * @return identity-mapping + * @throws ResidentServiceCheckedException + */ + String getIdentityMapping() throws ResidentServiceCheckedException; + + List> getUISchemaData(String schemaType); + + /** + * Gets Cacheable UI Schema data + * + * @return the UI Schema data. + */ + Map>> getUISchemaCacheableData(String schemaType); + + Map getIdentityMappingMap() throws ResidentServiceCheckedException, IOException; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentUpdateService.java b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentUpdateService.java index 4430001723c..118be967fbd 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentUpdateService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/ResidentUpdateService.java @@ -3,14 +3,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import io.mosip.resident.dto.IdResponseDTO1; import org.apache.commons.io.IOUtils; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +32,7 @@ import io.mosip.kernel.core.exception.ServiceError; import io.mosip.kernel.core.logger.spi.Logger; import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; import io.mosip.kernel.core.util.FileUtils; import io.mosip.kernel.core.util.JsonUtils; import io.mosip.kernel.core.util.exception.JsonProcessingException; @@ -50,7 +50,7 @@ import io.mosip.resident.dto.ResponseWrapper; import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.util.IdSchemaUtil; import io.mosip.resident.util.JsonUtil; import io.mosip.resident.util.ResidentServiceRestClient; @@ -69,7 +69,7 @@ public class ResidentUpdateService { RequestHandlerRequestValidator validator; @Value("${IDSchema.Version}") - private String idschemaVersion; + private String defaultIdSchemaVersion; @Autowired private IdSchemaUtil idSchemaUtil; @@ -104,17 +104,24 @@ public class ResidentUpdateService { private static final String TYPE = "type"; private static final String VALUE = "value"; - public PacketGeneratorResDto createPacket(ResidentUpdateDto request) throws BaseCheckedException, IOException { + public PacketGeneratorResDto createPacket(ResidentUpdateDto request, String idSchemaVersionStr) throws BaseCheckedException, IOException { + return createPacket(request, defaultIdSchemaVersion, null, null); + } + + public PacketGeneratorResDto createPacket(ResidentUpdateDto request, String idSchemaVersion, String sessionUin, IdResponseDTO1 idResponseDto) throws BaseCheckedException, IOException { logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), request.getIdValue(), "ResidentUpdateServiceImpl::createPacket()"); + if(idSchemaVersion == null){ + idSchemaVersion = defaultIdSchemaVersion; + } byte[] packetZipBytes = null; - audit.setAuditRequestDto(EventEnum.CREATE_PACKET); + audit.setAuditRequestDto(AuditEnum.CREATE_PACKET); PackerGeneratorFailureDto dto = new PackerGeneratorFailureDto(); if (validator.isValidCenter(request.getCenterId()) && request.getIdType().equals(ResidentIndividialIDType.UIN) ? validator.isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.toString(), - request.getIdValue()) - : validator.isValidVid(request.getIdValue())) { + request.getIdValue(), idResponseDto) + : validator.isValidVid(request.getIdValue(), sessionUin)) { logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), request.getIdValue(), @@ -142,19 +149,19 @@ public PacketGeneratorResDto createPacket(ResidentUpdateDto request) throws Base if (request.getProofOfAddress() != null && !request.getProofOfAddress().isEmpty()) setDemographicDocuments(request.getProofOfAddress(), demoJsonObject, PROOF_OF_ADDRESS, map); if (request.getProofOfDateOfBirth() != null && !request.getProofOfDateOfBirth().isEmpty()) - setDemographicDocuments(request.getProofOfAddress(), demoJsonObject, PROOF_OF_DOB, map); + setDemographicDocuments(request.getProofOfDateOfBirth(), demoJsonObject, PROOF_OF_DOB, map); if (request.getProofOfRelationship() != null && !request.getProofOfRelationship().isEmpty()) - setDemographicDocuments(request.getProofOfAddress(), demoJsonObject, PROOF_OF_RELATIONSHIP, + setDemographicDocuments(request.getProofOfRelationship(), demoJsonObject, PROOF_OF_RELATIONSHIP, map); if (request.getProofOfIdentity() != null && !request.getProofOfIdentity().isEmpty()) - setDemographicDocuments(request.getProofOfAddress(), demoJsonObject, PROOF_OF_IDENTITY, map); + setDemographicDocuments(request.getProofOfIdentity(), demoJsonObject, PROOF_OF_IDENTITY, map); PacketDto packetDto = new PacketDto(); packetDto.setId(generateRegistrationId(request.getCenterId(), request.getMachineId())); packetDto.setSource(utilities.getDefaultSource()); packetDto.setProcess(RegistrationType.RES_UPDATE.toString()); - packetDto.setSchemaVersion(idschemaVersion); - packetDto.setSchemaJson(idSchemaUtil.getIdSchema(Double.valueOf(idschemaVersion))); + packetDto.setSchemaVersion(idSchemaVersion); + packetDto.setSchemaJson(idSchemaUtil.getIdSchema(Double.valueOf(idSchemaVersion))); packetDto.setFields(idMap); packetDto.setDocuments(map); packetDto.setMetaInfo(getRegistrationMetaData(request.getIdValue(), @@ -175,13 +182,7 @@ public PacketGeneratorResDto createPacket(ResidentUpdateDto request) throws Base packetZipBytes = IOUtils.toByteArray(fis); - String rid = packetDto.getId(); - String packetCreatedDateTime = rid.substring(rid.length() - 14); - String formattedDate = packetCreatedDateTime.substring(0, 8) + "T" - + packetCreatedDateTime.substring(packetCreatedDateTime.length() - 6); - LocalDateTime ldt = LocalDateTime.parse(formattedDate, - DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss")); - String creationTime = ldt.toString() + ".000Z"; + String creationTime = DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()); logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), packetDto.getId(), @@ -203,7 +204,7 @@ public PacketGeneratorResDto createPacket(ResidentUpdateDto request) throws Base if (e instanceof BaseCheckedException) { throw (BaseCheckedException) e; } - audit.setAuditRequestDto(EventEnum.UNKNOWN_EXCEPTION); + audit.setAuditRequestDto(AuditEnum.UNKNOWN_EXCEPTION); throw new BaseCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorMessage(), e); diff --git a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/SyncAndUploadService.java b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/SyncAndUploadService.java index 5180dea7b06..6db32f710f2 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/SyncAndUploadService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/SyncAndUploadService.java @@ -2,9 +2,6 @@ import static io.mosip.kernel.core.util.JsonUtils.javaObjectToJsonString; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; import java.math.BigInteger; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -45,7 +42,7 @@ import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.util.AuditUtil; import io.mosip.resident.util.EncryptorUtil; -import io.mosip.resident.util.EventEnum; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.util.ResidentServiceRestClient; /** @@ -111,7 +108,6 @@ public String getFilename() { return registartionId + RegistrationConstants.EXTENSION_OF_FILE; } }; - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.PACKET_SYNC,registartionId)); RegSyncResponseDTO regSyncResponseDTO = packetSync(registartionId, regType, packetZipBytes, creationTime); if (regSyncResponseDTO != null) { @@ -160,7 +156,6 @@ public String getFilename() { logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), registartionId, packerGeneratorResDto.getMessage()); - audit.setAuditRequestDto(EventEnum.PACKET_CREATED); return packerGeneratorResDto; } @@ -168,7 +163,7 @@ public String getFilename() { packerGeneratorResDto.setRegistrationId(registartionId); packerGeneratorResDto.setStatus(FAILURE); packerGeneratorResDto.setMessage("Packet sync failure"); - audit.setAuditRequestDto(EventEnum.PACKET_CREATED_FAILURE); + audit.setAuditRequestDto(AuditEnum.PACKET_CREATED_FAILURE); return packerGeneratorResDto; } @@ -202,11 +197,9 @@ public String getFilename() { * @return the reg sync response DTO * @throws ApisResourceAccessException */ - @SuppressWarnings("unchecked") private RegSyncResponseDTO packetSync(String regId, String regType, byte[] enryptedUinZipFile, String creationTime) throws BaseCheckedException { RegSyncResponseDTO regSyncResponseDTO = null; - InputStream inputStream; try { RegistrationSyncRequestDTO registrationSyncRequestDTO = new RegistrationSyncRequestDTO(); List syncDtoList = new ArrayList<>(); diff --git a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/UinCardRePrintService.java b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/UinCardRePrintService.java index a464209eeec..96789e2e67b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/handler/service/UinCardRePrintService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/handler/service/UinCardRePrintService.java @@ -1,366 +1,363 @@ -package io.mosip.resident.handler.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.commons.packet.dto.PacketInfo; -import io.mosip.commons.packet.dto.packet.PacketDto; -import io.mosip.commons.packet.exception.PacketCreatorException; -import io.mosip.commons.packet.facade.PacketWriter; -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.exception.ExceptionUtils; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectIOException; -import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectValidationFailedException; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.kernel.core.util.FileUtils; -import io.mosip.kernel.core.util.JsonUtils; -import io.mosip.kernel.core.util.exception.JsonProcessingException; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.*; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.VidCreationException; -import io.mosip.resident.util.*; -import io.mosip.resident.validator.RequestHandlerRequestValidator; -import org.apache.commons.io.IOUtils; -import org.json.JSONException; -import org.json.simple.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.web.client.HttpClientErrorException; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -public class UinCardRePrintService { - /** The env. */ - @Autowired - private Environment env; - - @Value("${IDSchema.Version}") - private String idschemaVersion; - - @Autowired - private IdSchemaUtil idSchemaUtil; - - @Autowired - private ObjectMapper mapper; - - /** The rest client service. */ - @Autowired - private ResidentServiceRestClient restClientService; - - /** The sync upload encryption service. */ - @Autowired - SyncAndUploadService syncUploadEncryptionService; - - /** The validator. */ - @Autowired - private RequestHandlerRequestValidator validator; - - @Autowired - private PacketWriter packetWriter; - - /** The utilities. */ - @Autowired - Utilities utilities; - - @Autowired - AuditUtil audit; - - /** The vid type. */ - @Value("${id.repo.vidType}") - private String vidType; - - /** The Constant VID_CREATE_ID. */ - public static final String VID_CREATE_ID = "vid.create.id"; - - /** The Constant REG_PROC_APPLICATION_VERSION. */ - public static final String REG_PROC_APPLICATION_VERSION = "resident.vid.version"; - - /** The Constant DATETIME_PATTERN. */ - public static final String DATETIME_PATTERN = "resident.datetime.pattern"; - - /** The Constant UIN. */ - public static final String UIN = "UIN"; - - /** The Constant VID. */ - public static final String VID = "VID"; - - /** The reg proc logger. */ - private final Logger logger = LoggerConfiguration.logConfig(UinCardRePrintService.class); - - public static final String VID_TYPE = "id.repo.vidType"; - - /** - * Creates the packet. - * - * @param requestDto the uin card re print request dto - * @return the packet generator res dto - * @throws BaseCheckedException the reg base checked exception - * @throws IOException Signals that an I/O exception has occurred. - */ - @SuppressWarnings("unchecked") - public PacketGeneratorResDto createPacket(RegProcRePrintRequestDto requestDto) - throws BaseCheckedException, IOException { - String uin = null; - String vid = null; - byte[] packetZipBytes = null; - PacketGeneratorResDto packetGeneratorResDto = new PacketGeneratorResDto(); - File file = null; - try { - if (validator.isValidCenter(requestDto.getCenterId()) - && validator.isValidMachine(requestDto.getMachineId()) - && validator - .isValidRePrintRegistrationType(requestDto.getRegistrationType()) - && validator.isValidIdType(requestDto.getIdType()) - && validator.isValidCardType(requestDto.getCardType()) - && isValidUinVID(requestDto)) { - String cardType = requestDto.getCardType(); - String regType = requestDto.getRegistrationType(); - - if (requestDto.getIdType().equalsIgnoreCase(UIN)) - uin = requestDto.getId(); - else - vid = requestDto.getId(); - - if (cardType.equalsIgnoreCase(CardType.MASKED_UIN.toString()) && vid == null) { - - VidRequestDto1 vidRequestDto = new VidRequestDto1(); - RequestWrapper request = new RequestWrapper<>(); - VidResponseDTO1 response; - vidRequestDto.setUIN(uin); - vidRequestDto.setVidType(env.getProperty(VID_TYPE)); - request.setId(env.getProperty(VID_CREATE_ID)); - request.setRequest(vidRequestDto); - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - request.setVersion(env.getProperty(REG_PROC_APPLICATION_VERSION)); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "UinCardRePrintService::createPacket():: post CREATEVID service call started with request data : " - + JsonUtil.objectMapperObjectToJson(vidRequestDto)); - - response = restClientService.postApi(env.getProperty(ApiName.CREATEVID.name()), MediaType.APPLICATION_JSON, request, - VidResponseDTO1.class); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "UinCardRePrintService::createPacket():: post CREATEVID service call ended successfully"); - - if (!CollectionUtils.isEmpty(response.getErrors())) { - throw new VidCreationException(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage()); - - } else { - vid = response.getResponse().getVid(); - } - - } - if (uin == null) { - uin = utilities.getUinByVid(vid); - } - - // set packet info - PacketDto packetDto = new PacketDto(); - packetDto.setId(generateRegistrationId(requestDto.getCenterId(), requestDto.getMachineId())); - packetDto.setSource(utilities.getDefaultSource()); - packetDto.setProcess(requestDto.getRegistrationType()); - packetDto.setSchemaVersion(idschemaVersion); - packetDto.setSchemaJson(idSchemaUtil.getIdSchema(Double.valueOf(idschemaVersion))); - packetDto.setFields(getDemographicDTO(uin)); - packetDto.setMetaInfo(getRegistrationMetaData(uin, requestDto.getRegistrationType(), - requestDto.getCenterId(), requestDto.getMachineId(), vid, requestDto.getCardType())); - packetDto.setAudits(utilities.generateAudit(packetDto.getId())); - packetDto.setOfflineMode(false); - packetDto.setRefId(requestDto.getCenterId() + "_" + requestDto.getMachineId()); - List packetInfos = packetWriter.createPacket(packetDto); - - if (CollectionUtils.isEmpty(packetInfos) || packetInfos.iterator().next().getId() == null) { - audit.setAuditRequestDto(EventEnum.PACKET_CREATED_EXCEPTION); - throw new PacketCreatorException(ResidentErrorCode.PACKET_CREATION_EXCEPTION.getErrorCode(), ResidentErrorCode.PACKET_CREATION_EXCEPTION.getErrorMessage()); - } - file = new File(env.getProperty("object.store.base.location") - + File.separator + env.getProperty("packet.manager.account.name") - + File.separator + packetInfos.iterator().next().getId() + ".zip"); - - FileInputStream fis = new FileInputStream(file); - - packetZipBytes = IOUtils.toByteArray(fis); - String rid = packetDto.getId(); - String packetCreatedDateTime = rid.substring(rid.length() - 14); - String formattedDate = packetCreatedDateTime.substring(0, 8) + "T" - + packetCreatedDateTime.substring(packetCreatedDateTime.length() - 6); - LocalDateTime ldt = LocalDateTime.parse(formattedDate, - DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss")); - String creationTime = ldt.toString() + ".000Z"; - - packetGeneratorResDto = syncUploadEncryptionService.uploadUinPacket( - packetDto.getId(), creationTime, regType, packetZipBytes); - - } - return packetGeneratorResDto; - } catch (ApisResourceAccessException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - "", ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() - + ExceptionUtils.getStackTrace(e)); - throw new BaseCheckedException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), e); - } catch (VidCreationException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - "", ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage() - + ExceptionUtils.getStackTrace(e)); - throw new BaseCheckedException(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorCode(), ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage(), e); - } catch (IdObjectValidationFailedException | IdObjectIOException | JSONException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - "", - ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); - } finally { - if (file != null && file.exists()) - FileUtils.forceDelete(file); - } - } - - private Map getRegistrationMetaData(String uin, String registrationType, String centerId, - String machineId, String vid, String cardType) throws JsonProcessingException { - - Map metadata = new HashMap<>(); - - FieldValue[] fieldValues = new FieldValue[6]; - - FieldValue fieldValue0 = new FieldValue(); - FieldValue fieldValue1 = new FieldValue(); - FieldValue fieldValue2 = new FieldValue(); - FieldValue fieldValue3 = new FieldValue(); - FieldValue fieldValue4 = new FieldValue(); - FieldValue fieldValue5 = new FieldValue(); - fieldValue0.setLabel(PacketMetaInfoConstants.CENTERID); - fieldValue0.setValue(centerId); - fieldValues[0] = fieldValue0; - - fieldValue1.setLabel(PacketMetaInfoConstants.MACHINEID); - fieldValue1.setValue(machineId); - fieldValues[1] = fieldValue1; - - fieldValue2.setLabel(PacketMetaInfoConstants.REGISTRATION_TYPE); - fieldValue2.setValue(registrationType); - fieldValues[2] = fieldValue2; - - fieldValue3.setLabel(PacketMetaInfoConstants.UIN); - fieldValue3.setValue(uin); - fieldValues[3] = fieldValue3; - - fieldValue4.setLabel(PacketMetaInfoConstants.VID); - fieldValue4.setValue(vid); - fieldValues[4] = fieldValue4; - - fieldValue5.setLabel(PacketMetaInfoConstants.CARD_TYPE); - fieldValue5.setValue(cardType); - fieldValues[5] = fieldValue5; - - metadata.put("metaData", JsonUtils.javaObjectToJsonString(fieldValues)); - return metadata; - } - - /** - * Gets the demographic DTO. - * - * @param uin the uin - * @return the demographic DTO - */ - private Map getDemographicDTO(String uin) throws IOException { - Map jsonMap = new HashMap<>(); - - JSONObject regProcessorIdentityJson = utilities.getRegistrationProcessorMappingJson(); - String schemaVersion = JsonUtil.getJSONValue( - JsonUtil.getJSONObject(regProcessorIdentityJson, MappingJsonConstants.IDSCHEMA_VERSION), - MappingJsonConstants.VALUE); - - String uinLabel = JsonUtil.getJSONValue( - JsonUtil.getJSONObject(regProcessorIdentityJson, MappingJsonConstants.UIN), - MappingJsonConstants.VALUE); - - jsonMap.put(schemaVersion, idschemaVersion); - jsonMap.put(uinLabel, uin); - return jsonMap; - } - - /** - * Generate registration id. - * - * @param centerId the center id - * @param machineId the machine id - * @return the string - * @throws BaseCheckedException the reg base checked exception - */ - private String generateRegistrationId(String centerId, String machineId) throws BaseCheckedException { - - List pathsegments = new ArrayList<>(); - pathsegments.add(centerId); - pathsegments.add(machineId); - String rid = null; - ResponseWrapper responseWrapper; - JSONObject ridJson; - try { - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - "", "UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call started"); - responseWrapper = (ResponseWrapper) restClientService.getApi(ApiName.RIDGENERATION, pathsegments, "", "", - ResponseWrapper.class); - if (CollectionUtils.isEmpty(responseWrapper.getErrors())) { - ridJson = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), JSONObject.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "\"UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call ended with response data : " - + JsonUtil.objectMapperObjectToJson(ridJson)); - rid = (String) ridJson.get("rid"); - - } else { - List error = responseWrapper.getErrors(); - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "\"UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call ended with response data : " - + error.get(0).getMessage()); - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - error.get(0).getMessage(), new Throwable()); - } - - } catch (ApisResourceAccessException e) { - if (e.getCause() instanceof HttpClientErrorException) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getMessage(), e); - } - } catch (IOException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getMessage(), e); - } - return rid; - } - - /** - * Checks if is valid uin VID. - * - * @param requestDto the uin card re print request dto - * @return true, if is valid uin VID - * @throws BaseCheckedException the reg base checked exception - */ - public boolean isValidUinVID(RegProcRePrintRequestDto requestDto) throws BaseCheckedException, IOException { - boolean isValid = false; - if (requestDto.getIdType().equalsIgnoreCase(UIN)) { - isValid = validator.isValidUin(requestDto.getId()); - } else if (requestDto.getIdType().equalsIgnoreCase(VID)) { - isValid = validator.isValidVid(requestDto.getId()); - } - return isValid; - } - -} +package io.mosip.resident.handler.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.json.JSONException; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.HttpClientErrorException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.commons.packet.dto.PacketInfo; +import io.mosip.commons.packet.dto.packet.PacketDto; +import io.mosip.commons.packet.exception.PacketCreatorException; +import io.mosip.commons.packet.facade.PacketWriter; +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.ExceptionUtils; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectIOException; +import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectValidationFailedException; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.FileUtils; +import io.mosip.kernel.core.util.JsonUtils; +import io.mosip.kernel.core.util.exception.JsonProcessingException; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.constant.PacketMetaInfoConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.FieldValue; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.RegProcRePrintRequestDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidRequestDto1; +import io.mosip.resident.dto.VidResponseDTO1; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.IdSchemaUtil; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.validator.RequestHandlerRequestValidator; + +@Service +public class UinCardRePrintService { + /** The env. */ + @Autowired + private Environment env; + + @Value("${IDSchema.Version}") + private String idschemaVersion; + + @Autowired + private IdSchemaUtil idSchemaUtil; + + @Autowired + private ObjectMapper mapper; + + /** The rest client service. */ + @Autowired + private ResidentServiceRestClient restClientService; + + /** The sync upload encryption service. */ + @Autowired + SyncAndUploadService syncUploadEncryptionService; + + /** The validator. */ + @Autowired + private RequestHandlerRequestValidator validator; + + @Autowired + private PacketWriter packetWriter; + + /** The utilities. */ + @Autowired + Utilities utilities; + + @Autowired + AuditUtil audit; + + /** The Constant VID_CREATE_ID. */ + public static final String VID_CREATE_ID = "vid.create.id"; + + /** The Constant REG_PROC_APPLICATION_VERSION. */ + public static final String REG_PROC_APPLICATION_VERSION = "resident.vid.version"; + + /** The reg proc logger. */ + private final Logger logger = LoggerConfiguration.logConfig(UinCardRePrintService.class); + + public static final String VID_TYPE = "id.repo.vidType"; + + /** + * Creates the packet. + * + * @param requestDto the uin card re print request dto + * @return the packet generator res dto + * @throws BaseCheckedException the reg base checked exception + * @throws IOException Signals that an I/O exception has occurred. + */ + public PacketGeneratorResDto createPacket(RegProcRePrintRequestDto requestDto) + throws BaseCheckedException, IOException { + String uin = null; + String vid = null; + byte[] packetZipBytes = null; + PacketGeneratorResDto packetGeneratorResDto = new PacketGeneratorResDto(); + File file = null; + try { + if (validator.isValidCenter(requestDto.getCenterId()) + && validator.isValidMachine(requestDto.getMachineId()) + && validator + .isValidRePrintRegistrationType(requestDto.getRegistrationType()) + && validator.isValidIdType(requestDto.getIdType()) + && validator.isValidCardType(requestDto.getCardType()) + && isValidUinVID(requestDto)) { + String cardType = requestDto.getCardType(); + String regType = requestDto.getRegistrationType(); + + if (requestDto.getIdType().equalsIgnoreCase(IdType.UIN.name())) + uin = requestDto.getId(); + else + vid = requestDto.getId(); + + if (cardType.equalsIgnoreCase(CardType.MASKED_UIN.toString()) && vid == null) { + + VidRequestDto1 vidRequestDto = new VidRequestDto1(); + RequestWrapper request = new RequestWrapper<>(); + VidResponseDTO1 response; + vidRequestDto.setUIN(uin); + vidRequestDto.setVidType(env.getProperty(VID_TYPE)); + request.setId(env.getProperty(VID_CREATE_ID)); + request.setRequest(vidRequestDto); + request.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + request.setVersion(env.getProperty(REG_PROC_APPLICATION_VERSION)); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "UinCardRePrintService::createPacket():: post CREATEVID service call started with request data : " + + JsonUtil.objectMapperObjectToJson(vidRequestDto)); + + response = restClientService.postApi(env.getProperty(ApiName.CREATEVID.name()), MediaType.APPLICATION_JSON, request, + VidResponseDTO1.class); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "UinCardRePrintService::createPacket():: post CREATEVID service call ended successfully"); + + if (!CollectionUtils.isEmpty(response.getErrors())) { + throw new VidCreationException(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage()); + + } else { + vid = response.getResponse().getVid(); + } + + } + if (uin == null) { + uin = utilities.getUinByVid(vid); + } + + // set packet info + PacketDto packetDto = new PacketDto(); + packetDto.setId(generateRegistrationId(requestDto.getCenterId(), requestDto.getMachineId())); + packetDto.setSource(utilities.getDefaultSource()); + packetDto.setProcess(requestDto.getRegistrationType()); + packetDto.setSchemaVersion(idschemaVersion); + packetDto.setSchemaJson(idSchemaUtil.getIdSchema(Double.valueOf(idschemaVersion))); + packetDto.setFields(getDemographicDTO(uin)); + packetDto.setMetaInfo(getRegistrationMetaData(uin, requestDto.getRegistrationType(), + requestDto.getCenterId(), requestDto.getMachineId(), vid, requestDto.getCardType())); + packetDto.setAudits(utilities.generateAudit(packetDto.getId())); + packetDto.setOfflineMode(false); + packetDto.setRefId(requestDto.getCenterId() + "_" + requestDto.getMachineId()); + List packetInfos = packetWriter.createPacket(packetDto); + + if (CollectionUtils.isEmpty(packetInfos) || packetInfos.iterator().next().getId() == null) { + audit.setAuditRequestDto(AuditEnum.PACKET_CREATED_EXCEPTION); + throw new PacketCreatorException(ResidentErrorCode.PACKET_CREATION_EXCEPTION.getErrorCode(), ResidentErrorCode.PACKET_CREATION_EXCEPTION.getErrorMessage()); + } + file = new File(env.getProperty("object.store.base.location") + + File.separator + env.getProperty("packet.manager.account.name") + + File.separator + packetInfos.iterator().next().getId() + ".zip"); + + FileInputStream fis = new FileInputStream(file); + + packetZipBytes = IOUtils.toByteArray(fis); + String creationTime = DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()); + + packetGeneratorResDto = syncUploadEncryptionService.uploadUinPacket( + packetDto.getId(), creationTime, regType, packetZipBytes); + + } + return packetGeneratorResDto; + } catch (ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "", ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + throw new BaseCheckedException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), e); + } catch (VidCreationException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "", ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + throw new BaseCheckedException(ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorCode(), ResidentErrorCode.VID_CREATION_EXCEPTION.getErrorMessage(), e); + } catch (IdObjectValidationFailedException | IdObjectIOException | JSONException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "", + ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage() + ExceptionUtils.getStackTrace(e)); + throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } finally { + if (file != null && file.exists()) + FileUtils.forceDelete(file); + } + } + + private Map getRegistrationMetaData(String uin, String registrationType, String centerId, + String machineId, String vid, String cardType) throws JsonProcessingException { + + Map metadata = new HashMap<>(); + + FieldValue[] fieldValues = new FieldValue[6]; + + FieldValue fieldValue0 = new FieldValue(); + FieldValue fieldValue1 = new FieldValue(); + FieldValue fieldValue2 = new FieldValue(); + FieldValue fieldValue3 = new FieldValue(); + FieldValue fieldValue4 = new FieldValue(); + FieldValue fieldValue5 = new FieldValue(); + fieldValue0.setLabel(PacketMetaInfoConstants.CENTERID); + fieldValue0.setValue(centerId); + fieldValues[0] = fieldValue0; + + fieldValue1.setLabel(PacketMetaInfoConstants.MACHINEID); + fieldValue1.setValue(machineId); + fieldValues[1] = fieldValue1; + + fieldValue2.setLabel(PacketMetaInfoConstants.REGISTRATION_TYPE); + fieldValue2.setValue(registrationType); + fieldValues[2] = fieldValue2; + + fieldValue3.setLabel(PacketMetaInfoConstants.UIN); + fieldValue3.setValue(uin); + fieldValues[3] = fieldValue3; + + fieldValue4.setLabel(PacketMetaInfoConstants.VID); + fieldValue4.setValue(vid); + fieldValues[4] = fieldValue4; + + fieldValue5.setLabel(PacketMetaInfoConstants.CARD_TYPE); + fieldValue5.setValue(cardType); + fieldValues[5] = fieldValue5; + + metadata.put("metaData", JsonUtils.javaObjectToJsonString(fieldValues)); + return metadata; + } + + /** + * Gets the demographic DTO. + * + * @param uin the uin + * @return the demographic DTO + */ + private Map getDemographicDTO(String uin) throws IOException { + Map jsonMap = new HashMap<>(); + + JSONObject regProcessorIdentityJson = utilities.getRegistrationProcessorMappingJson(); + String schemaVersion = JsonUtil.getJSONValue( + JsonUtil.getJSONObject(regProcessorIdentityJson, MappingJsonConstants.IDSCHEMA_VERSION), + MappingJsonConstants.VALUE); + + String uinLabel = JsonUtil.getJSONValue( + JsonUtil.getJSONObject(regProcessorIdentityJson, MappingJsonConstants.UIN), + MappingJsonConstants.VALUE); + + jsonMap.put(schemaVersion, idschemaVersion); + jsonMap.put(uinLabel, uin); + return jsonMap; + } + + /** + * Generate registration id. + * + * @param centerId the center id + * @param machineId the machine id + * @return the string + * @throws BaseCheckedException the reg base checked exception + */ + private String generateRegistrationId(String centerId, String machineId) throws BaseCheckedException { + + List pathsegments = new ArrayList<>(); + pathsegments.add(centerId); + pathsegments.add(machineId); + String rid = null; + ResponseWrapper responseWrapper; + JSONObject ridJson; + try { + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "", "UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call started"); + responseWrapper = (ResponseWrapper) restClientService.getApi(ApiName.RIDGENERATION, pathsegments, "", "", + ResponseWrapper.class); + if (CollectionUtils.isEmpty(responseWrapper.getErrors())) { + ridJson = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), JSONObject.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "\"UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call ended with response data : " + + JsonUtil.objectMapperObjectToJson(ridJson)); + rid = (String) ridJson.get("rid"); + + } else { + List error = responseWrapper.getErrors(); + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "\"UinCardRePrintServiceImpl::generateRegistrationId():: RIDgeneration Api call ended with response data : " + + error.get(0).getMessage()); + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + error.get(0).getMessage(), new Throwable()); + } + + } catch (ApisResourceAccessException e) { + if (e.getCause() instanceof HttpClientErrorException) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getMessage(), e); + } + } catch (IOException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getMessage(), e); + } + return rid; + } + + /** + * Checks if is valid uin VID. + * + * @param requestDto the uin card re print request dto + * @return true, if is valid uin VID + * @throws BaseCheckedException the reg base checked exception + */ + public boolean isValidUinVID(RegProcRePrintRequestDto requestDto) throws BaseCheckedException, IOException { + boolean isValid = false; + if (requestDto.getIdType().equalsIgnoreCase(IdType.UIN.name())) { + isValid = validator.isValidUin(requestDto.getId()); + } else if (requestDto.getIdType().equalsIgnoreCase(IdType.VID.name())) { + isValid = validator.isValidVid(requestDto.getId()); + } + return isValid; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/helper/CredentialStatusUpdateHelper.java b/resident/resident-service/src/main/java/io/mosip/resident/helper/CredentialStatusUpdateHelper.java new file mode 100644 index 00000000000..ae4592806c6 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/helper/CredentialStatusUpdateHelper.java @@ -0,0 +1,158 @@ +package io.mosip.resident.helper; + +import static io.mosip.resident.constant.ResidentConstants.NOTIFICATION_DATE_PATTERN; +import static io.mosip.resident.constant.ResidentConstants.NOTIFICATION_TIME_PATTERN; +import static io.mosip.resident.constant.ResidentConstants.NOTIFICATION_ZONE; +import static io.mosip.resident.constant.ResidentConstants.PUBLIC_URL; +import static io.mosip.resident.constant.ResidentConstants.RESIDENT; +import static io.mosip.resident.constant.ResidentConstants.STATUS; +import static io.mosip.resident.constant.ResidentConstants.STATUS_CODE; +import static io.mosip.resident.constant.ResidentConstants.URL; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.util.Utility; + +/** + * Helper to update the resident transaction status based on the credential + * status and to send bell/email/sms notifications accordingly + * + * @author Loganathan S + * + */ +@Component +public class CredentialStatusUpdateHelper { + + private final Logger logger = LoggerConfiguration.logConfig(CredentialStatusUpdateHelper.class); + + private static final String DEFAULT_NOTIF_DATE_PATTERN = "dd-MM-yyyy"; + private static final String DEFAULT_NOTIF_TIME_PATTERN = "HH:mm:ss"; + + @Autowired + private Environment env; + + @Value("${" + NOTIFICATION_DATE_PATTERN + ":" + DEFAULT_NOTIF_DATE_PATTERN + "}") + private String notificationDatePattern; + + @Autowired + private NotificationService notificationService; + + @Value("${" + NOTIFICATION_TIME_PATTERN + ":" + DEFAULT_NOTIF_TIME_PATTERN + "}") + private String notificationTimePattern; + + @Value("${" + NOTIFICATION_ZONE + "}") + private String notificationZone; + + @Value("${" + PUBLIC_URL + "}") + private String publicUrl; + + @Autowired + private ResidentTransactionRepository repo; + + @Value("#{'${resident.async.request.types}'.split(',')}") + private List requestTypeCodesToProcessInBatchJob; + + @Autowired + private Utility utility; + + private Optional getTemplateType(RequestType requestType, String newStatusCode) { + Optional templateType; + if (requestType.isSuccessStatus(env, newStatusCode)) { + templateType = Optional.of(TemplateType.SUCCESS); + } else if (requestType.isFailedStatus(env, newStatusCode)) { + templateType = Optional.of(TemplateType.FAILURE); + } else if (requestType.isInProgressStatus(env, newStatusCode)) { + templateType = Optional.of(TemplateType.IN_PROGRESS); + } else { + templateType = Optional.empty(); + } + return templateType; + } + + public void saveEntity(ResidentTransactionEntity txn) { + repo.save(txn); + } + + private void sendNotification(ResidentTransactionEntity txn, TemplateType templateType, RequestType requestType) + throws ResidentServiceCheckedException { + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setEventId(txn.getEventId()); + notificationRequestDtoV2.setId(txn.getIndividualId()); + if (requestType.equals(RequestType.SHARE_CRED_WITH_PARTNER)) { + notificationRequestDtoV2 + .setAdditionalAttributes(Map.of(TemplateVariablesConstants.PARTNER_ID, txn.getRequestedEntityId())); + } + notificationService.sendNotification(notificationRequestDtoV2, null); + } + + public void updateEntity(ResidentTransactionEntity txn) { + txn.setUpdBy(RESIDENT); + txn.setUpdDtimes(DateUtils.getUTCCurrentDateTime()); + saveEntity(txn); + } + + public void updateStatus(ResidentTransactionEntity txn, Map credentialStatus) + throws ResidentServiceCheckedException, ApisResourceAccessException { + String requestTypeCode = txn.getRequestTypeCode(); + RequestType requestType = RequestType.getRequestTypeFromString(requestTypeCode); + + if (!credentialStatus.isEmpty()) { + // Save the new status to the resident transaction entity + String newStatusCode = getStatusCode(credentialStatus); + // If the status did not change, don't process it + if (newStatusCode != null && !txn.getStatusCode().equals(newStatusCode)) { + logger.debug(String.format("updating status for : %s as %s", txn.getEventId(), newStatusCode)); + txn.setStatusCode(newStatusCode); + + // Save the reference link if any + String referenceLink = credentialStatus.get(URL); + if (referenceLink != null) { + logger.debug(String.format("saving reference link for : %s", txn.getEventId())); + txn.setReferenceLink(referenceLink); + } + + // Send Notification + if (requestType.isNotificationStatus(env, newStatusCode)) { + logger.debug(String.format("invoking notifications for status: %s", newStatusCode)); + requestType.preUpdateInBatchJob(env, utility, txn, credentialStatus, newStatusCode); + + // For bell notification + txn.setReadStatus(false); + // Email/SMS notification + Optional templateType = getTemplateType(requestType, newStatusCode); + if (templateType.isPresent()) { + sendNotification(txn, templateType.get(), requestType); + } + } + updateEntity(txn); + } + } + } + + private String getStatusCode(Map credentialStatus) { + String status = credentialStatus.get(STATUS); + return status == null ? credentialStatus.get(STATUS_CODE) : status; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/helper/ObjectStoreHelper.java b/resident/resident-service/src/main/java/io/mosip/resident/helper/ObjectStoreHelper.java new file mode 100644 index 00000000000..cd17937b678 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/helper/ObjectStoreHelper.java @@ -0,0 +1,254 @@ +package io.mosip.resident.helper; + +import static io.mosip.resident.constant.ResidentConstants.CRYPTO_APPLICATION_NAME; +import static io.mosip.resident.constant.ResidentConstants.CRYPTO_DECRYPT_URI; +import static io.mosip.resident.constant.ResidentConstants.CRYPTO_ENCRYPT_URI; +import static io.mosip.resident.constant.ResidentConstants.CRYPTO_REFERENCE_ID; +import static io.mosip.resident.constant.ResidentConstants.OBJECT_STORE_ACCOUNT_NAME; +import static io.mosip.resident.constant.ResidentConstants.OBJECT_STORE_ADAPTER_NAME; +import static io.mosip.resident.constant.ResidentConstants.OBJECT_STORE_BUCKET_NAME; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import io.mosip.commons.khazana.dto.ObjectDto; +import io.mosip.commons.khazana.exception.ObjectStoreAdapterException; +import io.mosip.commons.khazana.spi.ObjectStoreAdapter; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.cryptomanager.dto.CryptomanagerRequestDto; +import io.mosip.kernel.cryptomanager.dto.CryptomanagerResponseDto; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; + +/** + * It's a helper class that uses the ObjectStoreAdapter to put and get objects + * from the object store + * + * @author Manoj SP + */ +@Component +public class ObjectStoreHelper { + + private static final Logger logger = LoggerConfiguration.logConfig(ObjectStoreHelper.class); + + @Value("${" + OBJECT_STORE_ACCOUNT_NAME + "}") + private String objectStoreAccountName; + + @Value("${" + OBJECT_STORE_BUCKET_NAME + "}") + private String objectStoreBucketName; + + @Value("${" + OBJECT_STORE_ADAPTER_NAME + "}") + private String objectStoreAdapterName; + + @Value("${" + CRYPTO_APPLICATION_NAME + "}") + private String applicationId; + + @Value("${" + CRYPTO_REFERENCE_ID + "}") + private String referenceId; + + @Value("${" + CRYPTO_ENCRYPT_URI + "}") + private String encryptUri; + + @Value("${" + CRYPTO_DECRYPT_URI + "}") + private String decryptUri; + + private ObjectStoreAdapter adapter; + + @Autowired + public void setObjectStore(ApplicationContext context) { + this.adapter = context.getBean(objectStoreAdapterName, ObjectStoreAdapter.class); + } + + @Autowired + private ResidentServiceRestClient restClient; + + /** + * This function is used to upload an object to the OSS bucket + * + * @param objectName The name of the object to be uploaded. + * @param data The data to upload. + */ + public void putObject(String objectName, InputStream data) { + this.putObject(objectName, data, null); + } + + /** + * The function takes an object name, an input stream, and a map of metadata. It + * then uploads the object to the object store and adds the metadata to the + * object + * + * @param objectName The name of the object to be uploaded. + * @param data The data to be uploaded. + * @param metadata This is a map of key-value pairs that you want to store as + * metadata for the object. + */ + public void putObject(String objectName, InputStream data, Map metadata) { + try { + adapter.putObject(objectStoreAccountName, null, null, null, objectName, encryptData(data)); + if (Objects.nonNull(metadata)) + adapter.addObjectMetaData(objectStoreAccountName, null, null, null, objectName, + metadata); + } catch (ResidentServiceException | ObjectStoreAdapterException | IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.FAILED_TO_UPLOAD_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_UPLOAD_DOC.getErrorMessage(), e); + } + } + + /** + * This function returns an InputStream object that contains the contents of the + * object stored in the object store + * + * @param objectName The name of the object to be retrieved. + * @return The object is being returned as an InputStream. + */ + public String getObject(String objectName) { + try { + return decryptData( + adapter.getObject(objectStoreAccountName, null, null, null, objectName)); + } catch (ResidentServiceException | ObjectStoreAdapterException | IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorMessage(), e); + } + } + + /** + * This function gets all the objects in the specified bucket + * + * @param objectName The name of the object you want to retrieve. + * @return A list of ObjectDto objects. + */ + public List getAllObjects(String objectName) { + try { + return adapter.getAllObjects(objectStoreAccountName, objectName); + } catch (ObjectStoreAdapterException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorMessage(), e); + } + } + + /** + * This function gets the metadata of the object in the object store + * + * @param objectName The name of the object to get metadata for. + * @return A map of metadata for the object. + */ + public Map getMetadata(String objectName) { + try { + return adapter.getMetaData(objectStoreAccountName, null, null, null, objectName); + } catch (ObjectStoreAdapterException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorMessage(), e); + } + } + + /** + * It takes an input stream, converts it to a string, and then decrypts it + * + * @param data The data to be encrypted or decrypted. + * @return The decrypted data. + */ + private String decryptData(InputStream data) throws IOException { + return encryptDecryptData(IOUtils.toString(data, Charset.defaultCharset()), false, applicationId, referenceId); + + } + + /** + * It takes an input stream, converts it to a byte array, encrypts the byte + * array, converts the + * encrypted byte array to a string, and then converts the string to an input + * stream + * + * @param data The data to be encrypted. + * @return A ByteArrayInputStream + */ + private InputStream encryptData(InputStream data) throws IOException { + return new ByteArrayInputStream( + + (encryptDecryptData(CryptoUtil.encodeToURLSafeBase64(IOUtils.toByteArray(data)), true, applicationId, referenceId).getBytes())); + } + + + public String decryptData(String data, String applicationId, String referenceId){ + return encryptDecryptData(data, false, applicationId, referenceId); + } + + /** + * It encrypts and decrypts the data. + * + * @param data The data to be encrypted or decrypted. + * @param toEncrypt true if you want to encrypt, false if you want to decrypt + * @return ResponseWrapper> + */ + public String encryptDecryptData(String data, boolean toEncrypt, String applicationId, String referenceId) { + try { + CryptomanagerRequestDto request = new CryptomanagerRequestDto(); + request.setApplicationId(applicationId); + request.setReferenceId(referenceId); + request.setData(data); + request.setTimeStamp(DateUtils.getUTCCurrentDateTime()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(request); + ResponseWrapper> responseWrapper = restClient.postApi( + toEncrypt ? encryptUri : decryptUri, MediaType.APPLICATION_JSON_UTF8, requestWrapper, + ResponseWrapper.class); + if (Objects.nonNull(responseWrapper.getErrors()) && !responseWrapper.getErrors().isEmpty()) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), responseWrapper.getErrors().get(0).getMessage() + " \n at: " + Thread.getAllStackTraces()); + throw new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage()); + } + return JsonUtil.convertValue(responseWrapper.getResponse(), CryptomanagerResponseDto.class).getData(); + } catch (ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage(), e); + } + } + + /** + * This function returns boolean value indicating whether the object deleted or not. + * @param objectName The name of the object to be deleted. + * @return boolean value indicating whether the object deleted or not. + */ + public boolean deleteObject(String objectName) { + try { + return adapter.deleteObject(objectStoreAccountName, null, null, null, objectName); + } catch (ResidentServiceException | ObjectStoreAdapterException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.FAILED_TO_DELETE_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_DELETE_DOC.getErrorMessage(), e); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/interceptor/ResidentEntityInterceptor.java b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/ResidentEntityInterceptor.java new file mode 100644 index 00000000000..0492a51dae5 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/ResidentEntityInterceptor.java @@ -0,0 +1,124 @@ +package io.mosip.resident.interceptor; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import org.apache.commons.codec.binary.Base64; +import org.hibernate.EmptyInterceptor; +import org.hibernate.type.Type; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import io.mosip.commons.khazana.config.LoggerConfiguration; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; + +/** + * @author Neha Farheen + * + */ +@Component +public class ResidentEntityInterceptor extends EmptyInterceptor { + /** + * + */ + private static final long serialVersionUID = 3428378823034671471L; + + private static final String INDIVIDUAL_ID = "individualId"; + + @Autowired + private transient ObjectStoreHelper objectStoreHelper; + + @Value("${mosip.resident.keymanager.application-name}") + private String appId; + + @Value("${mosip.resident.keymanager.reference-id}") + private String refId; + + /** The mosip logger. */ + private static final Logger logger = LoggerConfiguration.logConfig(ResidentEntityInterceptor.class); + + @Override + public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + try { + if (entity instanceof ResidentTransactionEntity) { + List propertyNamesList = Arrays.asList(propertyNames); + encryptDataOnSave(id, state, propertyNamesList, types, (ResidentTransactionEntity) entity); + } + } catch (ResidentServiceException e) { + logger.error(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage(), e); + throw new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage(), e); + } + return super.onSave(entity, id, state, propertyNames, types); + } + + private void encryptDataOnSave(Serializable id, Object[] state, + List propertyNamesList, Type[] types, T uinEntity) throws ResidentServiceException { + if (Objects.nonNull(uinEntity.getIndividualId())) { + String idividualId = Base64.encodeBase64String(uinEntity.getIndividualId().getBytes()); + String encryptedData = objectStoreHelper.encryptDecryptData(idividualId, true, appId, refId); + uinEntity.setIndividualId(encryptedData); + int indexOfData = propertyNamesList.indexOf(INDIVIDUAL_ID); + state[indexOfData] = encryptedData; + } + } + + @Override + public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + try { + if (entity instanceof ResidentTransactionEntity) { + List propertyNamesList = Arrays.asList(propertyNames); + int indexOfData = propertyNamesList.indexOf(INDIVIDUAL_ID); + if (Objects.nonNull(state[indexOfData])) { + decryptDataOnLoad(id, state, propertyNamesList, types, (ResidentTransactionEntity) entity); + } + } + } catch (ResidentServiceException e) { + logger.error(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage(), e); + throw new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage(), e); + } + return super.onLoad(entity, id, state, propertyNames, types); + } + + @Override + public boolean onFlushDirty(Object entity, Serializable id, Object[] state, Object[] previousState, + String[] propertyNames, Type[] types) { + if(entity instanceof ResidentTransactionEntity) { + List propertyNamesList = Arrays.asList(propertyNames); + encryptDataOnSave(id, state, propertyNamesList, types, (ResidentTransactionEntity) entity); + } + return super.onFlushDirty(entity, id, state, previousState, propertyNames, types); + } + + private void decryptDataOnLoad(Serializable id, Object[] state, + List propertyNamesList, Type[] types, T uinEntity) throws ResidentServiceException { + int indexOfData = propertyNamesList.indexOf(INDIVIDUAL_ID); + if (Objects.nonNull(state[indexOfData])) { + String individualId = (String) state[indexOfData]; + String decodedIndividualId = tryDecryption(individualId, INDIVIDUAL_ID); + uinEntity.setIndividualId(decodedIndividualId); + state[indexOfData] = decodedIndividualId; + } + } + + private String tryDecryption(String data, String attributeName) { + try { + String decryptedData = objectStoreHelper.encryptDecryptData(data, false, appId, refId); + String decodedIndividualId = new String(Base64.decodeBase64(decryptedData)); + return decodedIndividualId; + } catch (ResidentServiceException e) { + logger.debug(String.format("Unable to decrpt data in interceptor: %s", attributeName)); + return data; + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptor.java b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptor.java new file mode 100644 index 00000000000..f8ef28237ca --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptor.java @@ -0,0 +1,41 @@ +package io.mosip.resident.interceptor; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author Kamesh Shekhar Prasad + */ +@Component +@ConditionalOnProperty(value = ResidentConstants.RESIDENT_REST_TEMPLATE_LOGGING_INTERCEPTOR_FILTER_ENABLED, havingValue = "true", matchIfMissing = false) +public class RestTemplateLoggingInterceptor implements ClientHttpRequestInterceptor { + + private final Logger logger = LoggerConfiguration.logConfig(RestTemplateLoggingInterceptor.class); + + @Override + public ClientHttpResponse intercept( + HttpRequest req, byte[] reqBody, ClientHttpRequestExecution ex) throws IOException { + + Thread currentThread = Thread.currentThread(); + StackTraceElement[] stackTrace = currentThread.getStackTrace(); + String stackTraceString = Stream.of(stackTrace).map(String::valueOf).collect(Collectors.joining("\n")); + + long currentTimeBeforeExecution = System.currentTimeMillis(); + ClientHttpResponse response = ex.execute(req, reqBody); + long currentTimeAfterExecution = System.currentTimeMillis(); + long timeDiff = currentTimeAfterExecution - currentTimeBeforeExecution; + logger.debug("#rest-template-log#"+ ","+ req.getMethod() + ","+ req.getURI() + ","+timeDiff+"ms,"+stackTraceString); + return response; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptor.java b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptor.java new file mode 100644 index 00000000000..a77d6bf6f4f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptor.java @@ -0,0 +1,69 @@ +package io.mosip.resident.interceptor; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; +import io.mosip.resident.constant.ResidentConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpRequest; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import static io.mosip.resident.constant.ResidentConstants.REST_CLIENT_RESPONSE_TIME_DESCRIPTION; +import static io.mosip.resident.constant.ResidentConstants.REST_CLIENT_RESPONSE_TIME_ID; + +/** + * @author Loganathan S + */ +@Component +@ConditionalOnProperty(value = ResidentConstants.RESIDENT_REST_TEMPLATE_METRICS_INTERCEPTOR_FILTER_ENABLED, havingValue = "true", matchIfMissing = false) +public class RestTemplateMetricsInterceptor implements ClientHttpRequestInterceptor { + + @Autowired + private MeterRegistry registry; + + @Override + public ClientHttpResponse intercept( + HttpRequest req, byte[] reqBody, ClientHttpRequestExecution ex) throws IOException { + Thread currentThread = Thread.currentThread(); + long start = System.nanoTime(); + + try { + ClientHttpResponse response = ex.execute(req, reqBody); + if(req!=null && req.getURI()!=null && req.getURI().toString() != null && req.getMethod() != null) { + recordTimer(req.getMethod(), req.getURI().toString(), start, "NONE", response.getStatusCode(), response.getStatusText(), currentThread.getName()); + } + return response; + } catch (Throwable e) { + if(req!=null && req.getURI()!=null && req.getURI().toString() != null && req.getMethod() != null) { + recordTimer(req.getMethod(), req.getURI().toString(), start, e.getClass().getSimpleName(), null, "Error", currentThread.getName()); + } + throw e; + } + } + + private void recordTimer(HttpMethod httpMethod, String url, long start, String error, HttpStatus httpStatus, String statusText, String thread) { + if(httpMethod!=null && httpMethod.name()!=null) { + Timer timer = Timer.builder(REST_CLIENT_RESPONSE_TIME_ID) + .tag("label", REST_CLIENT_RESPONSE_TIME_DESCRIPTION) + .tag("httpMethod", httpMethod.name()) + .tag("url", url) + .tag("httpStatus", httpStatus == null ? "NA" : httpStatus.toString()) + .tag("statusText", statusText == null ? "NA" : statusText) + .tag("thread", thread) + .tag("error", error) + .tag("service", "resident") + .publishPercentileHistogram(true) + .publishPercentiles(0.5, 0.95, 0.99) + .register(registry); + timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/MockApiController.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/MockApiController.java new file mode 100644 index 00000000000..08d83a07e26 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/MockApiController.java @@ -0,0 +1,102 @@ +package io.mosip.resident.mock.controller; + +import java.io.ByteArrayInputStream; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.mock.dto.PaymentSuccessResponseDto; +import io.mosip.resident.mock.exception.CantPlaceOrderException; +import io.mosip.resident.mock.exception.PaymentCanceledException; +import io.mosip.resident.mock.exception.PaymentFailedException; +import io.mosip.resident.mock.exception.TechnicalErrorException; +import io.mosip.resident.mock.service.MockService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * Mock API Controller class. + * + * @author Kamesh Shekhar Prasad + */ +@RequestMapping("/mock") +@RestController +@Tag(name = "mock-api-controller", description = "Mock API Controller") +public class MockApiController { + + @Autowired + private AuditUtil auditUtil; + + @Autowired + private MockService mockService; + + private static final Logger logger = LoggerConfiguration.logConfig(MockApiController.class); + + /** + * Get order status. + * + * @param transactionId + * @param individualId + */ + @ResponseFilter + @GetMapping(value = "/print-partner/check-order-status") + @Operation(summary = "getOrderStatus", description = "getOrderStatus", tags = { "mock-api-controller" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "402", description = "Payment Required", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(schema = @Schema(hidden = true))) }) + public ResponseEntity getOrderStatus(@RequestParam("transactionId") String transactionId, + @RequestParam("individualId") String individualId) throws ResidentServiceCheckedException { + int lastDigit = Character.getNumericValue(transactionId.charAt(transactionId.length() - 1)); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + if (lastDigit >= 0 && lastDigit < 6) { + PaymentSuccessResponseDto paymentSuccessResponseDto = new PaymentSuccessResponseDto(); + paymentSuccessResponseDto.setTrackingId(UUID.randomUUID().toString()); + paymentSuccessResponseDto.setTransactionId(transactionId); + responseWrapper.setResponse(paymentSuccessResponseDto); + return ResponseEntity.ok().body(responseWrapper); + } else if (lastDigit == 6) { + throw new PaymentFailedException(); + } else if(lastDigit ==7){ + throw new PaymentCanceledException(); + } else if (lastDigit ==8) { + throw new TechnicalErrorException(); + }else { + throw new CantPlaceOrderException(); + } + } + @GetMapping(path= "/rid-digital-card/{rid}") + public ResponseEntity getRIDDigitalCard( + @PathVariable("rid") String rid) throws Exception { + logger.debug("MockApiController::getRIDDigitalCard()::entry"); + byte[] pdfBytes = mockService.getRIDDigitalCardV2(rid); + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); + auditUtil.setAuditRequestDto(AuditEnum.RID_DIGITAL_CARD_REQ_SUCCESS); + logger.debug("MockApiController::getRIDDigitalCard()::exit"); + return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + + rid + ".pdf\"") + .body((Object) resource); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/RedressalController.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/RedressalController.java new file mode 100644 index 00000000000..f3d4569e0db --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/controller/RedressalController.java @@ -0,0 +1,50 @@ +package io.mosip.resident.mock.controller; + +import java.net.MalformedURLException; + +import org.apache.commons.codec.binary.Base64; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import io.mosip.kernel.core.http.ResponseFilter; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Controller +@Tag(name = "redressal-controller", description = "Redressal Controller") +public class RedressalController { + + private static final Logger logger = LoggerConfiguration.logConfig(RedressalController.class); + + @GetMapping("/mock/external/grievance/redressel") + public String grievence(Model model, @RequestParam("name") String name, @RequestParam("emailId") String emailId, + @RequestParam("phoneNo") String phoneNo, @RequestParam("eventId") String eventId) + throws MalformedURLException { + + model.addAttribute("name", name); + model.addAttribute("email", emailId); + model.addAttribute("phoneno", phoneNo); + model.addAttribute("eventId", eventId); + return "grievance"; + } + + @ResponseFilter + @GetMapping(value = "/auth-mock/order/physical-card") + @Operation(summary = "getPaymentStatus", description = "getPaymentStatus", tags = { "redressal-controller" }) + public String getPaymentStatus(Model model, @RequestParam("redirectUrl") String redirectUrl, + @RequestParam("eventId") String eventId, @RequestParam("residentName") String residentName, + @RequestParam("residentDefaultFullAddress") String residentDefaultFullAddress) { + logger.debug("RedressalController::getPaymentStatus()::entry"); + String url = new String(Base64.decodeBase64(redirectUrl.getBytes())); + model.addAttribute("redirectUrl", url); + model.addAttribute("eventId", eventId); + model.addAttribute("residentName", residentName); + model.addAttribute("residentFullAddress", residentDefaultFullAddress); + logger.debug("RedressalController::getPaymentStatus()::exit"); + return "payment-page"; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/DigitalCardStatusResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/DigitalCardStatusResponseDto.java new file mode 100644 index 00000000000..e4702db4a57 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/DigitalCardStatusResponseDto.java @@ -0,0 +1,17 @@ +package io.mosip.resident.mock.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DigitalCardStatusResponseDto { + + private String id; + + private String statusCode; + + private String url; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/PaymentSuccessResponseDto.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/PaymentSuccessResponseDto.java new file mode 100644 index 00000000000..3f1d7d3f374 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/dto/PaymentSuccessResponseDto.java @@ -0,0 +1,19 @@ +package io.mosip.resident.mock.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to return response of payment. + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PaymentSuccessResponseDto { + + private String transactionId; + + private String trackingId; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/CantPlaceOrderException.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/CantPlaceOrderException.java new file mode 100644 index 00000000000..2536a3ee988 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/CantPlaceOrderException.java @@ -0,0 +1,51 @@ +package io.mosip.resident.mock.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception for can't place order use case. + */ +public class CantPlaceOrderException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public CantPlaceOrderException() { + super(ResidentErrorCode.CAN_T_PLACE_ORDER.getErrorCode(), ResidentErrorCode.CAN_T_PLACE_ORDER.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public CantPlaceOrderException(String errorMessage) { + super(ResidentErrorCode.CAN_T_PLACE_ORDER.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public CantPlaceOrderException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public CantPlaceOrderException(String message, Throwable cause) { + super(ResidentErrorCode.CAN_T_PLACE_ORDER.getErrorCode(), message, cause); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentCanceledException.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentCanceledException.java new file mode 100644 index 00000000000..95678087b8c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentCanceledException.java @@ -0,0 +1,51 @@ +package io.mosip.resident.mock.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception for payment canceled use case. + */ +public class PaymentCanceledException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public PaymentCanceledException() { + super(ResidentErrorCode.PAYMENT_CANCELED.getErrorCode(), ResidentErrorCode.PAYMENT_CANCELED.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public PaymentCanceledException(String errorMessage) { + super(ResidentErrorCode.PAYMENT_CANCELED.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public PaymentCanceledException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public PaymentCanceledException(String message, Throwable cause) { + super(ResidentErrorCode.PAYMENT_CANCELED.getErrorCode(), message, cause); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentFailedException.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentFailedException.java new file mode 100644 index 00000000000..adebeed6a2f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/PaymentFailedException.java @@ -0,0 +1,51 @@ +package io.mosip.resident.mock.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception for payment failed use case. + */ +public class PaymentFailedException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public PaymentFailedException() { + super(ResidentErrorCode.PAYMENT_FAILED.getErrorCode(), ResidentErrorCode.PAYMENT_FAILED.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public PaymentFailedException(String errorMessage) { + super(ResidentErrorCode.PAYMENT_FAILED.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public PaymentFailedException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public PaymentFailedException(String message, Throwable cause) { + super(ResidentErrorCode.PAYMENT_FAILED.getErrorCode(), message, cause); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/TechnicalErrorException.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/TechnicalErrorException.java new file mode 100644 index 00000000000..60099b37521 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/exception/TechnicalErrorException.java @@ -0,0 +1,51 @@ +package io.mosip.resident.mock.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; +import io.mosip.resident.constant.ResidentErrorCode; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to throw exception for technical error use case. + */ +public class TechnicalErrorException extends BaseUncheckedException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new otp validation failed exception. + */ + public TechnicalErrorException() { + super(ResidentErrorCode.TECHNICAL_ERROR.getErrorCode(), ResidentErrorCode.TECHNICAL_ERROR.getErrorMessage()); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param errorMessage + * the error message + */ + public TechnicalErrorException(String errorMessage) { + super(ResidentErrorCode.TECHNICAL_ERROR.getErrorCode(), errorMessage); + } + + /** + * + * @param errorMessage + */ + public TechnicalErrorException(String errorCode, String errorMessage) { + super(errorCode, errorMessage); + } + + /** + * Instantiates a new otp validation failed exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public TechnicalErrorException(String message, Throwable cause) { + super(ResidentErrorCode.TECHNICAL_ERROR.getErrorCode(), message, cause); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/service/MockService.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/service/MockService.java new file mode 100644 index 00000000000..ea097cb64c6 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/service/MockService.java @@ -0,0 +1,9 @@ +package io.mosip.resident.mock.service; + +import java.io.IOException; + +import io.mosip.resident.exception.ApisResourceAccessException; + +public interface MockService { + byte[] getRIDDigitalCardV2(String rid) throws ApisResourceAccessException, IOException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/mock/service/impl/MockServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/mock/service/impl/MockServiceImpl.java new file mode 100644 index 00000000000..6d1476f64a3 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/mock/service/impl/MockServiceImpl.java @@ -0,0 +1,58 @@ +package io.mosip.resident.mock.service.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.mock.service.MockService; + +@Service +public class MockServiceImpl implements MockService { + + @Value("${mosip.resident.service.mock.pdf.url}") + private String residentServicePdfUrl; + + @Override + public byte[] getRIDDigitalCardV2(String rid) throws ApisResourceAccessException, IOException { + return getPdfFromUrl(residentServicePdfUrl); + } + + private byte[] getPdfFromUrl(String url) throws ApisResourceAccessException, IOException { + URL pdfUrl = new URL(url); + byte[] pdf = getAsByteArray(pdfUrl); + return pdf; + } + + public byte[] getAsByteArray(URL url) throws IOException { + URLConnection connection = url.openConnection(); + InputStream in = connection.getInputStream(); + int contentLength = connection.getContentLength(); + ByteArrayOutputStream tmpOut; + if (contentLength != -1) { + tmpOut = new ByteArrayOutputStream(contentLength); + } else { + tmpOut = new ByteArrayOutputStream(16384); + } + + byte[] buf = new byte[512]; + while (true) { + int len = in.read(buf); + if (len == -1) { + break; + } + tmpOut.write(buf, 0, len); + } + in.close(); + tmpOut.close(); + + byte[] array = tmpOut.toByteArray(); + + return array; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/repository/OtpTransactionRepository.java b/resident/resident-service/src/main/java/io/mosip/resident/repository/OtpTransactionRepository.java new file mode 100644 index 00000000000..643c35f5174 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/repository/OtpTransactionRepository.java @@ -0,0 +1,44 @@ +package io.mosip.resident.repository; + +import java.time.LocalDateTime; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import io.mosip.resident.entity.OtpTransactionEntity; + +/** + * The Interface OtpTxnRepository. + * + * @author Kamesh Shekhar Prasad. + * @since 1.2.0.1 + */ +@Repository +public interface OtpTransactionRepository extends JpaRepository { + Boolean existsByOtpHashAndStatusCode(String otpHash, String statusCode); + + OtpTransactionEntity findTopByOtpHashAndStatusCode(String otpHash, String statusCode); + + /** + * Obtain the number of count of request_dTtimes for particular userId with + * within the otpRequestDTime and oneMinuteBeforeTime. + * + * @param otpRequestDTime the otp request D time + * @param oneMinuteBeforeTime the one minute before time + * @param refId the ref id + * @return the int + */ + @Query("Select count(1) from OtpTransactionEntity where generatedDtimes <= :otpRequestDTime and " + + "generatedDtimes >= :oneMinuteBeforeTime and refId=:refId") + public int countRequestDTime(@Param("otpRequestDTime") LocalDateTime otpRequestDTime, + @Param("oneMinuteBeforeTime") LocalDateTime oneMinuteBeforeTime, @Param("refId") String refId); + + @Query("Select count(1) from OtpTransactionEntity where refId = :refId and " + "statusCode = :statusCode and " + + "expiryDtimes > :currenttime and" + + " crDtimes > :allowedTimeDuration") + int checkotpsent(@Param("refId") String userid, @Param("statusCode") String statusCode, + @Param("currenttime") LocalDateTime currenttime, @Param("allowedTimeDuration") LocalDateTime allowedTimeDuration); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentGrievanceRepository.java b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentGrievanceRepository.java new file mode 100644 index 00000000000..16998226bac --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentGrievanceRepository.java @@ -0,0 +1,16 @@ +package io.mosip.resident.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import io.mosip.resident.entity.ResidentGrievanceEntity; + +/** + * The Interface ResidentGrievanceRepository. + * + * @author Kamesh Shekhar Prasad. + * @since 1.2.0.1 + */ +@Repository +public interface ResidentGrievanceRepository extends JpaRepository { +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentSessionRepository.java b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentSessionRepository.java new file mode 100644 index 00000000000..55205050a0d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentSessionRepository.java @@ -0,0 +1,26 @@ +package io.mosip.resident.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import io.mosip.resident.entity.ResidentSessionEntity; + +/** + * The Interface ResidentUserRepository. + * + * @author Neha Farheen + * @since 1.2.0.1 + */ +@Transactional +@Repository +public interface ResidentSessionRepository extends JpaRepository { + Optional findById(String id); + + List findFirst2ByIdaTokenOrderByLoginDtimesDesc(String idaToken); + + Optional findFirstByIdaTokenOrderByLoginDtimesDesc(String idaToken); +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentTransactionRepository.java b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentTransactionRepository.java new file mode 100644 index 00000000000..985ba2bafea --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentTransactionRepository.java @@ -0,0 +1,210 @@ +package io.mosip.resident.repository; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import javax.transaction.Transactional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import io.mosip.resident.entity.ResidentTransactionEntity; + +/** + * The Interface ResidentTransactionRepository. + * + * @author Kamesh Shekhar Prasad. + * @since 1.2.0.1 + */ +@Repository +public interface ResidentTransactionRepository extends JpaRepository { + + List findByRequestTrnId(String requestTrnId); + + List findByTokenIdAndRequestTypeCodeAndStatusCode(String tokenId, String requestTypeCode, String statusCode); + + ResidentTransactionEntity findTopByRequestTrnIdAndTokenIdAndStatusCodeInOrderByCrDtimesDesc + (String requestTrnId, String tokenId, List statusCodes); + + boolean existsByRefIdAndStatusCode(String refId, String statusCode); + + public List findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(List statusCodes, List requestTypes); + + + @Query(value = "SELECT COUNT(*) from ResidentTransactionEntity where tokenId=:tokenId AND read_status='false' and requestTypeCode in (:requestTypes) AND (olvPartnerId IS NULL OR olvPartnerId = :olvPartnerId)") + Long countByIdAndUnreadStatusForRequestTypes(@Param("tokenId") String tokenId, @Param("requestTypes") List requestTypes, @Param("olvPartnerId") String olvPartnerId); + + @Query(value = "SELECT COUNT(*) from ResidentTransactionEntity where tokenId=:tokenId AND (crDtimes>= :notificationClickTime OR updDtimes>= :notificationClickTime) AND read_status='false' AND requestTypeCode in (:requestTypes) AND (olvPartnerId IS NULL OR olvPartnerId = :olvPartnerId)") + Long countByIdAndUnreadStatusForRequestTypesAfterNotificationClick(@Param("tokenId") String tokenId,@Param("notificationClickTime") LocalDateTime notificationClickTime, @Param("requestTypes") List requestTypes, @Param("olvPartnerId") String olvPartnerId); + + /** + * AuthTransaction entries only will be expected here. This wouldn't fetch the otp Requested performed in resident service. + */ + @Query(value = "SELECT COUNT(*) from ResidentTransactionEntity where ref_id=:hashRefId AND auth_type_code like %:authType") + Integer findByRefIdAndAuthTypeCodeLike(@Param("hashRefId") String hashRefId, @Param("authType") String authType); + + @Modifying + @Transactional + @Query("update ResidentTransactionEntity set read_status='true' where event_id=:eventId") + int updateReadStatus(@Param("eventId") String eventId); + + @Modifying + @Transactional + @Query("update ResidentTransactionEntity set pinned_status=:status where event_id=:eventId") + int updatePinnedStatus(@Param("eventId") String eventId, @Param("status") boolean status); + + Optional findOneByCredentialRequestId(String requestId); + + @Query(value = "SELECT NEW ResidentTransactionEntity(rte.eventId, rte.requestTypeCode, rte.statusCode, rte.referenceLink) FROM ResidentTransactionEntity rte WHERE rte.eventId = :eventId") + Optional findByEventId(@Param("eventId") String eventId); + + @Modifying + @Transactional + @Query("UPDATE ResidentTransactionEntity SET requestSummary=:requestSummary, statusCode=:statusCode, statusComment=:statusComment, updBy=:updBy, updDtimes=:updDtimes WHERE eventId=:eventId") + int updateEventStatus(@Param("eventId") String eventId, @Param("requestSummary") String requestSummary, @Param("statusCode") String statusCode, @Param("statusComment") String statusComment, @Param("updBy") String updBy, @Param("updDtimes") LocalDateTime updDtimes); + + // Service history methods start--- + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenId(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)", nativeQuery = true) + int countByTokenId(@Param("tokenId") String tokenId, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdBetweenCrDtimes(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate", nativeQuery = true) + int countByTokenIdBetweenCrDtimes(@Param("tokenId") String tokenId, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdInStatus(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("statusCode") List statusCode); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)", nativeQuery = true) + int countByTokenIdInStatus(@Param("tokenId") String tokenId, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("statusCode") List statusCode); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdAndSearchEventId(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("eventId") String eventId); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')", nativeQuery = true) + int countByTokenIdAndSearchEventId(@Param("tokenId") String tokenId, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("eventId") String eventId); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdInStatusBetweenCrDtimes(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("statusCode") List statusCode, + @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate", nativeQuery = true) + int countByTokenIdInStatusBetweenCrDtimes(@Param("tokenId") String tokenId, + @Param("olvPartnerId") String olvPartnerId, @Param("requestTypeCodes") List requestTypeCodes, + @Param("statusCode") List statusCode, @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdBetweenCrDtimesSearchEventId(@Param("tokenId") String tokenId, + @Param("limit") int limit, @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate, @Param("eventId") String eventId); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.cr_dtimes BETWEEN :startDate AND :endDate" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')", nativeQuery = true) + int countByTokenIdBetweenCrDtimesSearchEventId(@Param("tokenId") String tokenId, + @Param("olvPartnerId") String olvPartnerId, @Param("requestTypeCodes") List requestTypeCodes, + @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate, + @Param("eventId") String eventId); + + @Query(value = "SELECT rt.event_id, rt.request_type_code, rt.status_code, rt.status_comment, rt.ref_id_type, rt.ref_id, rt.cr_dtimes, rt.upd_dtimes, rt.read_status, rt.pinned_status, rt.purpose, rt.attribute_list, rt.auth_type_code FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')" + + " ORDER BY rt.pinned_status DESC, rt.cr_dtimes DESC" + + " LIMIT :limit OFFSET :offset", nativeQuery = true) + List findByTokenIdInStatusSearchEventId(@Param("tokenId") String tokenId, @Param("limit") int limit, + @Param("offset") int offset, @Param("olvPartnerId") String olvPartnerId, + @Param("requestTypeCodes") List requestTypeCodes, @Param("statusCode") List statusCode, + @Param("eventId") String eventId); + + @Query(value = "SELECT COUNT(*) FROM resident_transaction rt WHERE rt.token_id = :tokenId" + + " AND rt.request_type_code IN (:requestTypeCodes)" + + " AND (rt.olv_partner_id IS NULL OR rt.olv_partner_id = :olvPartnerId)" + + " AND rt.status_code IN (:statusCode)" + + " AND rt.event_id LIKE CONCAT('%', :eventId, '%')", nativeQuery = true) + int countByTokenIdInStatusSearchEventId(@Param("tokenId") String tokenId, + @Param("olvPartnerId") String olvPartnerId, @Param("requestTypeCodes") List requestTypeCodes, + @Param("statusCode") List statusCode, @Param("eventId") String eventId); + + + + // Service history methods end--- + + ResidentTransactionEntity findTopByAidOrderByCrDtimesDesc(String rid); +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentUserRepository.java b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentUserRepository.java new file mode 100644 index 00000000000..835240fc3ab --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/repository/ResidentUserRepository.java @@ -0,0 +1,28 @@ +package io.mosip.resident.repository; + +import java.time.LocalDateTime; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import io.mosip.resident.entity.ResidentUserEntity; + +/** + * The Interface ResidentUserRepository. + * + * @author Neha Farheen + * @since 1.2.0.1 + */ +@Transactional +@Repository +public interface ResidentUserRepository extends JpaRepository { + + @Modifying + @Query("update ResidentUserEntity res set res.lastbellnotifDtimes =:datetime where res.idaToken =:idaToken") + int updateByIdLastbellnotifDtimes(@Param("idaToken") String sessionId, @Param("datetime") LocalDateTime datetime); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/AcknowledgementService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/AcknowledgementService.java new file mode 100644 index 00000000000..8bfcc656692 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/AcknowledgementService.java @@ -0,0 +1,15 @@ +package io.mosip.resident.service; + +import java.io.IOException; + +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; + +/** + * This class is used to create service class for getting acknowledgement API. + * @Author Kamesh Shekhar Prasad + */ +public interface AcknowledgementService { + Tuple2 getAcknowledgementPDF(String eventId, String languageCode, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, IOException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/AuthTransactionCallBackService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/AuthTransactionCallBackService.java new file mode 100644 index 00000000000..4afa88dc9df --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/AuthTransactionCallBackService.java @@ -0,0 +1,14 @@ +package io.mosip.resident.service; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +@Service +public interface AuthTransactionCallBackService { + public void updateAuthTransactionCallBackService(Map eventModel) throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/DocumentService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/DocumentService.java new file mode 100644 index 00000000000..57e1835ed4c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/DocumentService.java @@ -0,0 +1,64 @@ +package io.mosip.resident.service; + +import java.util.List; +import java.util.Map; + +import org.springframework.web.multipart.MultipartFile; + +import io.mosip.resident.dto.DocumentDTO; +import io.mosip.resident.dto.DocumentRequestDTO; +import io.mosip.resident.dto.DocumentResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * It's a service class that uploads a document to the object store and returns + * the document metadata. + * + * @author Manoj SP + */ +public interface DocumentService { + + /** + * It uploads a file to the object store + * + * @param transactionId This is the transaction id of the resident. + * @param file The file to be uploaded + * @param request DocumentRequestDTO + * @return The response is a DocumentResponseDTO object. + */ + DocumentResponseDTO uploadDocument(String transactionId, MultipartFile file, + DocumentRequestDTO request) throws ResidentServiceCheckedException; + + /** + * It fetches all the documents metadata from the object store + * + * @param transactionId This is the transaction ID that is generated by the + * resident service. + * @return A list of DocumentResponseDTO objects. + */ + Map getDocumentsWithMetadata(String transactionId) + throws ResidentServiceCheckedException; + + /** + * It fetches all the documents from the object store and returns a map of + * document metadata + * and document content + * + * @param transactionId The transaction ID of the transaction for which the + * documents are to be + * fetched. + * @return A map of DocumentResponseDTO and String. + */ + List fetchAllDocumentsMetadata(String transactionId) + throws ResidentServiceCheckedException; + + /** + * It fetches the document from the object store + * @param transactionId This is the transaction ID + * @param documentId This is the document id + */ + DocumentDTO fetchDocumentByDocId(String transactionId, String documentId) throws ResidentServiceCheckedException; + + ResponseDTO deleteDocument(String transactionId, String documentId) throws ResidentServiceCheckedException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/DownLoadMasterDataService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/DownLoadMasterDataService.java new file mode 100644 index 00000000000..148fdf57d5f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/DownLoadMasterDataService.java @@ -0,0 +1,51 @@ +package io.mosip.resident.service; + +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * + * @author M1063027 Rama Devi + * + */ +@Service +public interface DownLoadMasterDataService { + + /** + * + * @param langCode + * @param hierarchyLevel + * @param name + * @return + * @throws ResidentServiceCheckedException + */ + public InputStream downloadRegistrationCentersByHierarchyLevel(String langCode, Short hierarchyLevel, + String name) throws ResidentServiceCheckedException, IOException, Exception; + + /** + * + * @param langCode + * @return + * @throws ResidentServiceCheckedException + * @throws IOException + * @throws Exception + */ + public InputStream downloadSupportingDocsByLanguage(String langCode) throws ResidentServiceCheckedException, IOException, Exception; + + /** + * + * @param langCode + * @param longitude + * @param latitude + * @param proximityDistance + * @return + * @throws ResidentServiceCheckedException + */ + public InputStream getNearestRegistrationcenters(String langCode, double longitude, double latitude, + int proximityDistance) throws ResidentServiceCheckedException, IOException, Exception; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/DownloadCardService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/DownloadCardService.java new file mode 100644 index 00000000000..472c83eb6a6 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/DownloadCardService.java @@ -0,0 +1,33 @@ +package io.mosip.resident.service; + +import java.io.IOException; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.resident.dto.CheckStatusResponseDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidDownloadCardResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; + +/** + * This class is used to create service class to download uin card. + * @Author Kamesh Shekhar Prasad + */ +public interface DownloadCardService { + Tuple2 getDownloadCardPDF( + MainRequestDTO downloadCardRequestDTOMainRequestDTO) + throws ResidentServiceCheckedException, OtpValidationFailedException; + + Tuple2 downloadPersonalizedCard( + MainRequestDTO downloadPersonalizedCardMainRequestDTO, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException; + + Tuple2, String> getVidCardEventId(String vid, int timeZoneOffset, String locale) throws BaseCheckedException; + + ResponseWrapper getIndividualIdStatus(String vid) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/GrievanceService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/GrievanceService.java new file mode 100644 index 00000000000..e4504155541 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/GrievanceService.java @@ -0,0 +1,16 @@ +package io.mosip.resident.service; + +import java.io.IOException; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.exception.ApisResourceAccessException; + +/** + * This class is used to create service class for getting Grievance Service API. + * @Author Kamesh Shekhar Prasad + */ +public interface GrievanceService { + ResponseWrapper getGrievanceTicket(MainRequestDTO grievanceRequestDTOMainRequestDTO) throws IOException, ApisResourceAccessException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/IdAuthService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/IdAuthService.java index 051fa3e7091..5b53d470c6b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/IdAuthService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/IdAuthService.java @@ -1,23 +1,39 @@ package io.mosip.resident.service; import java.util.List; +import java.util.Map; import org.springframework.stereotype.Service; import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.RequestType; import io.mosip.resident.dto.AuthTxnDetailsDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; @Service public interface IdAuthService { public boolean validateOtp(String transactionID, String individualId, String otp) - throws OtpValidationFailedException; + throws OtpValidationFailedException, ResidentServiceCheckedException; + + public Tuple2 validateOtpV1(String transactionId, String individualId, String otp) + throws OtpValidationFailedException, ResidentServiceCheckedException; + + public Tuple2 validateOtpV2(String transactionId, String individualId, String otp, RequestType requestType) + throws OtpValidationFailedException, ResidentServiceCheckedException; public boolean authTypeStatusUpdate(String individualId, List authType, AuthTypeStatus authTypeStatus, Long unlockForSeconds) throws ApisResourceAccessException; public List getAuthHistoryDetails(String individualId, String pageStart, String pageFetch) throws ApisResourceAccessException; + + public String authTypeStatusUpdate(String individualId, Map authTypeStatusMap, Map unlockForSecondsMap) + throws ApisResourceAccessException; + + String authTypeStatusUpdateForRequestId(String individualId, Map authTypeStatusMap, Map unlockForSecondsMap) throws ApisResourceAccessException; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/IdentityService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/IdentityService.java new file mode 100644 index 00000000000..27e4e27dd64 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/IdentityService.java @@ -0,0 +1,74 @@ +package io.mosip.resident.service; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.constant.IdType; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * Resident identity service class. + * + * @author Ritik Jain + */ +@Service +public interface IdentityService { + + /** + * Get identity data by id. + * + * @param id + * @return IdentityDTO object + * @throws ResidentServiceCheckedException + */ + public IdentityDTO getIdentity(String id) throws ResidentServiceCheckedException; + + /** + * Get identity data by id, fetchFace and langCode. + * + * @param id + * @param fetchFace + * @param langCode + * @return IdentityDTO object + * @throws ResidentServiceCheckedException + */ + public IdentityDTO getIdentity(String id, boolean fetchFace, String langCode) throws ResidentServiceCheckedException; + + public String getIDAToken(String uin); + + public String getIDAToken(String uin, String olvPartnerId); + + /** + * Get ID-Repo api data by id. + * + * @param id + * @param schemaType + * @return Map + * @throws ResidentServiceCheckedException + * @throws IOException + */ + Map getIdentityAttributes(String id, String schemaType) throws ResidentServiceCheckedException, IOException; + + public String getResidentIndvidualIdFromSession() throws ApisResourceAccessException; + + Map getIdentityAttributes(String id, String schemaType, + List additionalAttributes) throws ResidentServiceCheckedException; + + String getUinForIndividualId(String idvid) throws ResidentServiceCheckedException; + + String getIDATokenForIndividualId(String idvid) throws ResidentServiceCheckedException; + + + IdType getIndividualIdType(String individualId); + + String createSessionId(); + + public String getResidentIdaTokenFromAccessToken(String accessToken) throws ApisResourceAccessException, ResidentServiceCheckedException; + + public String getAccessToken(); +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/NotificationService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/NotificationService.java index ff86e212030..93d119e226d 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/NotificationService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/NotificationService.java @@ -1,29 +1,5 @@ package io.mosip.resident.service; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.util.UriComponentsBuilder; - import io.mosip.kernel.core.http.RequestWrapper; import io.mosip.kernel.core.http.ResponseWrapper; import io.mosip.kernel.core.logger.spi.Logger; @@ -32,21 +8,50 @@ import io.mosip.resident.constant.ApiName; import io.mosip.resident.constant.LoggerFileConstant; import io.mosip.resident.constant.NotificationTemplateCode; +import io.mosip.resident.constant.RequestType; import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.NotificationTemplateVariableDTO; import io.mosip.resident.dto.SMSRequestDTO; -import io.mosip.resident.dto.TemplateDto; -import io.mosip.resident.dto.TemplateResponseDto; import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.ResidentServiceCheckedException; import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.util.JsonUtil; import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilitiy; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; import io.mosip.resident.validator.RequestValidator; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * @@ -55,6 +60,10 @@ */ @Component public class NotificationService { + private static final String LINE_BREAK = "
    "; + private static final String EMAIL_CHANNEL = "email"; + private static final String PHONE_CHANNEL = "phone"; + private static final String IDENTITY = "identity"; private static final Logger logger = LoggerConfiguration.logConfig(NotificationService.class); @Autowired private TemplateManager templateManager; @@ -72,16 +81,24 @@ public class NotificationService { private ResidentServiceRestClient restClient; @Autowired - private Utilitiy utility; + private Utility utility; + + @Autowired + private Utilities utilities; @Autowired private RequestValidator requestValidator; @Autowired private AuditUtil audit; + + @Autowired + private TemplateUtil templateUtil; + + @Autowired + private IdentityService identityService; - private static final String LINE_SEPARATOR = new StringBuilder().append('\n').append('\n').append('\n').toString(); - private static final String BOTH = "both"; + private static final String LINE_SEPARATOR = new StringBuilder().append(LINE_BREAK).append(LINE_BREAK).toString(); private static final String EMAIL = "_EMAIL"; private static final String SMS = "_SMS"; private static final String SUBJECT = "_SUB"; @@ -94,100 +111,152 @@ public class NotificationService { private static final String TEMPLATE_CODE = "Template Code"; private static final String SUCCESS = "success"; private static final String SEPARATOR = "/"; - - public NotificationResponseDTO sendNotification(NotificationRequestDto dto) throws ResidentServiceCheckedException { - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), dto.getId(), + + @SuppressWarnings("rawtypes") + public NotificationResponseDTO sendNotification(NotificationRequestDto dto, Map identity) throws ResidentServiceCheckedException { + return sendNotification(dto, null, null, null, identity); + } + + @SuppressWarnings("rawtypes") + public NotificationResponseDTO sendNotification(NotificationRequestDto dto, List channels, String email, String phone, Map identity) throws ResidentServiceCheckedException { + logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), "NotificationService::sendNotification()::entry"); boolean smsStatus = false; boolean emailStatus = false; - Set templateLangauges = new HashSet(); - Map notificationAttributes = utility.getMailingAttributes(dto.getId(), templateLangauges); + Map demographicIdentity = (identity == null || identity.isEmpty()) ? identityService.getIdentity(dto.getId()) : identity; + Map mapperIdentity = getMapperIdentity(); + + Set templateLangauges; + try { + templateLangauges = getTemplateLanguages(demographicIdentity, mapperIdentity); + } catch (ReflectiveOperationException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), + ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } + + Map notificationAttributes = utility.getMailingAttributes(dto.getId(), templateLangauges, demographicIdentity, mapperIdentity); if (dto.getAdditionalAttributes() != null && dto.getAdditionalAttributes().size() > 0) { notificationAttributes.putAll(dto.getAdditionalAttributes()); } - if (notificationType.equalsIgnoreCase("SMS|EMAIL")) { - smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), templateLangauges); - emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), null, - templateLangauges); - } else if (notificationType.equalsIgnoreCase("EMAIL")) { - emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), null, - templateLangauges); - } else if (notificationType.equalsIgnoreCase("SMS")) { - smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), templateLangauges); - } + RequestType notificationRequestType = getNotificationRequestType(dto); + TemplateType notificationTemplateType = getNotificationTemplateType(dto); + String notificationEventId=getNotificationEventId(dto); + String otp = getOtp(dto); + if(otp!=null){ + notificationAttributes.put(TemplateVariablesConstants.OTP, otp); + } + if(phone!=null){ + notificationAttributes.put(TemplateVariablesConstants.PHONE, phone); + } + if(notificationEventId!=null) { + notificationAttributes.put(TemplateVariablesConstants.EVENT_ID, notificationEventId); + } + if(channels == null || channels.isEmpty() || channels.stream().collect(Collectors.joining(",")).isEmpty() || channels.stream().collect(Collectors.joining(",")).equals("null")) { + if (notificationType.equalsIgnoreCase("SMS|EMAIL")) { + smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, templateLangauges); + emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, null, + templateLangauges, null); + } else if (notificationType.equalsIgnoreCase("EMAIL")) { + emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, null, + templateLangauges, null); + } else if (notificationType.equalsIgnoreCase("SMS")) { + smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, templateLangauges); + } + } else { + List channelsLowerCase = channels.stream().map(String::toLowerCase).collect(Collectors.toList()); + if (channelsLowerCase.contains(PHONE_CHANNEL) && channelsLowerCase.contains(EMAIL_CHANNEL)) { + smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, templateLangauges); + emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, null, + templateLangauges, null); + } else if (channelsLowerCase.contains(PHONE_CHANNEL)) { + smsStatus = sendSMSNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, templateLangauges); + } else if (channelsLowerCase.contains(EMAIL_CHANNEL)) { + emailStatus = sendEmailNotification(notificationAttributes, dto.getTemplateTypeCode(), notificationRequestType, notificationTemplateType, null, + templateLangauges, email); + } + } - logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), dto.getId(), + logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), IS_SMS_NOTIFICATION_SUCCESS + smsStatus); - logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), dto.getId(), + logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), IS_EMAIL_NOTIFICATION_SUCCESS + emailStatus); NotificationResponseDTO notificationResponse = new NotificationResponseDTO(); if (smsStatus && emailStatus) { notificationResponse.setMessage(SMS_EMAIL_SUCCESS); + if(email != null && phone != null) { + notificationResponse.setMaskedPhone(utility.maskPhone(phone)); + notificationResponse.setMaskedEmail(utility.maskEmail(email)); + } notificationResponse.setStatus(SUCCESS); - } else if (smsStatus) { + } else if (smsStatus) { notificationResponse.setMessage(SMS_SUCCESS); + if(phone != null) { + notificationResponse.setMaskedPhone(utility.maskPhone(phone)); + } } else if (emailStatus) { notificationResponse.setMessage(EMAIL_SUCCESS); + if(email != null) { + notificationResponse.setMaskedEmail(utility.maskEmail(email)); + } } else { notificationResponse.setMessage(SMS_EMAIL_FAILED); - throw new ResidentServiceException(ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode(), - ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage() + " " + SMS_EMAIL_FAILED); + logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), + "NotificationService::sendNotification()::Failure" ); } - logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), dto.getId(), + logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), "NotificationService::sendSMSNotification()::isSuccess?::" + notificationResponse.getMessage()); - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), dto.getId(), + logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), LoggerFileConstant.UIN.name(), "NotificationService::sendNotification()::exit"); return notificationResponse; } - @SuppressWarnings("unchecked") - private String getTemplate(String langCode, String templatetypecode) throws ResidentServiceCheckedException { - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), TEMPLATE_CODE, templatetypecode, - "NotificationService::getTemplate()::entry"); - List pathSegments = new ArrayList<>(); - pathSegments.add(langCode); - pathSegments.add(templatetypecode); - try { - ResponseWrapper resp = (ResponseWrapper) restClient.getApi( - ApiName.TEMPLATES, pathSegments, "", null, ResponseWrapper.class); - if (resp == null || resp.getErrors() != null && !resp.getErrors().isEmpty()) { - audit.setAuditRequestDto(EventEnum.TEMPLATE_EXCEPTION); - throw new ResidentServiceException(ResidentErrorCode.TEMPLATE_EXCEPTION.getErrorCode(), - ResidentErrorCode.TEMPLATE_EXCEPTION.getErrorMessage() - + (resp != null ? resp.getErrors().get(0) : "")); - } - TemplateResponseDto templateResponse = JsonUtil.readValue(JsonUtil.writeValueAsString(resp.getResponse()), - TemplateResponseDto.class); - logger.info(LoggerFileConstant.APPLICATIONID.toString(), TEMPLATE_CODE, templatetypecode, - "NotificationService::getTemplate()::getTemplateResponse::" + JsonUtil.writeValueAsString(resp)); - List response = templateResponse.getTemplates(); - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), TEMPLATE_CODE, templatetypecode, - "NotificationService::getTemplate()::exit"); - return response.get(0).getFileText().replaceAll("^\"|\"$", ""); - } catch (IOException e) { - audit.setAuditRequestDto(EventEnum.TOKEN_GENERATION_FAILED); - throw new ResidentServiceCheckedException(ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorCode(), - ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorMessage(), e); - } catch (ApisResourceAccessException e) { - if (e.getCause() instanceof HttpClientErrorException) { - HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpClientException.getResponseBodyAsString()); + @SuppressWarnings("rawtypes") + private Map getMapperIdentity() throws ResidentServiceCheckedException { + JSONObject mappingJsonObject = utility.getMappingJsonObject(); + Map mapperIdentity = JsonUtil.getJSONObject(mappingJsonObject, IDENTITY); + return mapperIdentity; + } - } else if (e.getCause() instanceof HttpServerErrorException) { - HttpServerErrorException httpServerException = (HttpServerErrorException) e.getCause(); - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpServerException.getResponseBodyAsString()); + @SuppressWarnings("rawtypes") + private Set getTemplateLanguages(Map demographicIdentity, Map mapperIdentity) throws ReflectiveOperationException { + Set preferredLanguage = utility.getPreferredLanguage(demographicIdentity); + Set templateLangauges = new HashSet<>(); + if (preferredLanguage.isEmpty()) { + List defaultTemplateLanguages = utility.getDefaultTemplateLanguages(); + if (CollectionUtils.isEmpty(defaultTemplateLanguages)) { + Set dataCapturedLanguages = utility.getDataCapturedLanguages(mapperIdentity, demographicIdentity); + templateLangauges.addAll(dataCapturedLanguages); } else { - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); + templateLangauges.addAll(defaultTemplateLanguages); } + } else { + templateLangauges.addAll(preferredLanguage); } + return templateLangauges; + } + + private String getOtp(NotificationRequestDto notificationRequestDto) { + return notificationRequestDto instanceof NotificationRequestDtoV2?((NotificationRequestDtoV2) notificationRequestDto).getOtp():null; + } + + private RequestType getNotificationRequestType(NotificationRequestDto notificationRequestDto) { + return notificationRequestDto instanceof NotificationRequestDtoV2?((NotificationRequestDtoV2) notificationRequestDto).getRequestType():null; + } + + private TemplateType getNotificationTemplateType(NotificationRequestDto notificationRequestDto) { + return notificationRequestDto instanceof NotificationRequestDtoV2?((NotificationRequestDtoV2) notificationRequestDto).getTemplateType():null; + } + + private String getNotificationEventId(NotificationRequestDto notificationRequestDto) { + return notificationRequestDto instanceof NotificationRequestDtoV2?((NotificationRequestDtoV2) notificationRequestDto).getEventId():null; + } + @SuppressWarnings("unchecked") + private String getTemplate(String langCode, String templateTypeCode) { + logger.debug(LoggerFileConstant.APPLICATIONID.toString(), TEMPLATE_CODE, templateTypeCode, + "NotificationService::getTemplate()::entry"); + return templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(langCode, templateTypeCode); } private String templateMerge(String fileText, Map mailingAttributes) @@ -211,11 +280,18 @@ private String templateMerge(String fileText, Map mailingAttribu } private boolean sendSMSNotification(Map mailingAttributes, - NotificationTemplateCode notificationTemplate, Set templateLangauges) + NotificationTemplateCode notificationTemplate, RequestType requestType, TemplateType templateType, Set templateLangauges) throws ResidentServiceCheckedException { logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), " ", "NotificationService::sendSMSNotification()::entry"); - String phone = (String) mailingAttributes.get("phone"); + String eventId=(String) mailingAttributes.get(TemplateVariablesConstants.EVENT_ID); + String phone=""; + if(mailingAttributes.get(TemplateVariablesConstants.PHONE)== null){ + phone = (String) mailingAttributes.get(utilities.getPhoneAttribute()); + } else{ + phone = (String) mailingAttributes.get(TemplateVariablesConstants.PHONE); + } + if (nullValueCheck(phone) || !(requestValidator.phoneValidator(phone))) { logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), " ", "NotificationService::sendSMSNotification()::phoneValidatio::" + "false :: invalid phone number"); @@ -223,8 +299,23 @@ private boolean sendSMSNotification(Map mailingAttributes, } String mergedTemplate = ""; for (String language : templateLangauges) { - String languageTemplate = templateMerge(getTemplate(language, notificationTemplate + SMS), - mailingAttributes); + String languageTemplate = ""; + if(notificationTemplate==null) { + if(mailingAttributes.get(TemplateVariablesConstants.PHONE)== null){ + languageTemplate = templateMerge(getTemplate(language, templateUtil.getSmsTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language), mailingAttributes)); + } else{ + languageTemplate = templateMerge(getTemplate(language, templateUtil.getSmsTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language, (String) mailingAttributes.get(TemplateVariablesConstants.OTP)), mailingAttributes)); + } + + } else { + languageTemplate = templateMerge(getTemplate(language, notificationTemplate + SMS), + mailingAttributes); + } + if(languageTemplate.trim().endsWith(LINE_BREAK)) { + languageTemplate = languageTemplate.substring(0, languageTemplate.length() - LINE_BREAK.length()).trim(); + } if (mergedTemplate.isBlank()) { mergedTemplate = languageTemplate; }else { @@ -285,7 +376,7 @@ private boolean sendSMSNotification(Map mailingAttributes, } catch (IOException e) { logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", e.getMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.TOKEN_GENERATION_FAILED); + audit.setAuditRequestDto(AuditEnum.TOKEN_GENERATION_FAILED); throw new ResidentServiceCheckedException(ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorCode(), ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorMessage(), e); } @@ -297,11 +388,16 @@ private boolean sendSMSNotification(Map mailingAttributes, } private boolean sendEmailNotification(Map mailingAttributes, - NotificationTemplateCode notificationTemplate, MultipartFile[] attachment, Set templateLangauges) + NotificationTemplateCode notificationTemplate, RequestType requestType, TemplateType templateType, MultipartFile[] attachment, Set templateLangauges, String newEmail) throws ResidentServiceCheckedException { logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), " ", "NotificationService::sendEmailNotification()::entry"); - String email = String.valueOf(mailingAttributes.get("email")); + String eventId=(String) mailingAttributes.get(TemplateVariablesConstants.EVENT_ID); + String email = String.valueOf(mailingAttributes.get(utilities.getEmailAttribute())); + String otp=""; + if(newEmail!=null){ + otp=(String) mailingAttributes.get(TemplateVariablesConstants.OTP); + } if (nullValueCheck(email) || !(requestValidator.emailValidator(email))) { logger.info(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), " ", "NotificationService::sendEmailNotification()::emailValidation::" + "false :: invalid email"); @@ -310,9 +406,31 @@ private boolean sendEmailNotification(Map mailingAttributes, String mergedEmailSubject = ""; String mergedTemplate = ""; for (String language : templateLangauges) { - String emailSubject = getTemplate(language, notificationTemplate + EMAIL + SUBJECT); - String languageTemplate = templateMerge(getTemplate(language, notificationTemplate + EMAIL), - mailingAttributes); + String emailSubject = ""; + String languageTemplate = ""; + if(notificationTemplate==null) { + if(newEmail==null) { + emailSubject = templateMerge(getTemplate(language, templateUtil.getEmailSubjectTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language), mailingAttributes)); + + languageTemplate = templateMerge(getTemplate(language, templateUtil.getEmailContentTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language), mailingAttributes)); + } + else { + emailSubject = templateMerge(getTemplate(language, templateUtil.getEmailSubjectTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language, otp), mailingAttributes)); + + languageTemplate = templateMerge(getTemplate(language, templateUtil.getEmailContentTemplateTypeCode(requestType, templateType)), + requestType.getNotificationTemplateVariables(templateUtil, new NotificationTemplateVariableDTO(eventId, requestType, templateType, language, otp), mailingAttributes)); + } + } else { + emailSubject = getTemplate(language, notificationTemplate + EMAIL + SUBJECT); + languageTemplate = templateMerge(getTemplate(language, notificationTemplate + EMAIL), + mailingAttributes); + } + if(languageTemplate.trim().endsWith(LINE_BREAK)) { + languageTemplate = languageTemplate.substring(0, languageTemplate.length() - LINE_BREAK.length()).trim(); + } if (mergedTemplate.isBlank() || mergedEmailSubject.isBlank()) { mergedTemplate = languageTemplate; mergedEmailSubject = emailSubject; @@ -322,18 +440,32 @@ private boolean sendEmailNotification(Map mailingAttributes, } } LinkedMultiValueMap params = new LinkedMultiValueMap<>(); - String[] mailTo = { mailingAttributes.get("email").toString() }; + String[] mailTo = new String[1]; + if(newEmail==null){ + mailTo[0] = String.valueOf(mailingAttributes.get(utilities.getEmailAttribute())); + } else{ + mailTo[0] = newEmail; + } + String[] mailCc = notificationEmails.split("\\|"); - UriComponentsBuilder builder = prepareBuilder(mailTo, mailCc); + for (String item : mailTo) { + params.add("mailTo", item); + } + + if (mailCc != null) { + for (String item : mailCc) { + params.add("mailCc", item); + } + } try { - builder.queryParam("mailSubject", mergedEmailSubject); - builder.queryParam("mailContent", mergedTemplate); + params.add("mailSubject", mergedEmailSubject); + params.add("mailContent", mergedTemplate); params.add("attachments", attachment); ResponseWrapper response; - response = restClient.postApi(builder.build().toUriString(), MediaType.MULTIPART_FORM_DATA, params, + response = restClient.postApi(env.getProperty(ApiName.EMAILNOTIFIER.name()), MediaType.MULTIPART_FORM_DATA, params, ResponseWrapper.class); if (nullCheckForResponse(response)) { throw new ResidentServiceException(ResidentErrorCode.INVALID_API_RESPONSE.getErrorCode(), @@ -370,7 +502,7 @@ private boolean sendEmailNotification(Map mailingAttributes, } } catch (IOException e) { - audit.setAuditRequestDto(EventEnum.TOKEN_GENERATION_FAILED); + audit.setAuditRequestDto(AuditEnum.TOKEN_GENERATION_FAILED); throw new ResidentServiceCheckedException(ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorCode(), ResidentErrorCode.TOKEN_GENERATION_FAILED.getErrorMessage(), e); } @@ -394,18 +526,4 @@ public boolean nullCheckForResponse(ResponseWrapper res } - public UriComponentsBuilder prepareBuilder(String[] mailTo, String[] mailCc) { - String apiHost = env.getProperty(ApiName.EMAILNOTIFIER.name()); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(apiHost); - for (String item : mailTo) { - builder.queryParam("mailTo", item); - } - - if (mailCc != null) { - for (String item : mailCc) { - builder.queryParam("mailCc", item); - } - } - return builder; - } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/OrderCardService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/OrderCardService.java new file mode 100644 index 00000000000..34e36cf16cc --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/OrderCardService.java @@ -0,0 +1,33 @@ +package io.mosip.resident.service; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * Order card service class. + * + * @author Ritik Jain + */ +@Service +public interface OrderCardService { + + /** + * Send a physical card. + * + * @param requestDto + * @return ResidentCredentialResponseDto object + * @throws ResidentServiceCheckedException + */ + public ResidentCredentialResponseDto sendPhysicalCard(ResidentCredentialRequestDto requestDto) + throws ResidentServiceCheckedException, ApisResourceAccessException; + + public String getRedirectUrl(String partnerId, String individualId) throws ResidentServiceCheckedException, ApisResourceAccessException; + + public String physicalCardOrder(String redirectUrl, String paymentTransactionId, String eventId, + String residentFullAddress, String individualId, String errorCode, String errorMessage) throws ResidentServiceCheckedException; + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/OtpManager.java b/resident/resident-service/src/main/java/io/mosip/resident/service/OtpManager.java new file mode 100644 index 00000000000..4a326809fb7 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/OtpManager.java @@ -0,0 +1,20 @@ +package io.mosip.resident.service; + +import java.io.IOException; + +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; + +/** + * @author Kamesh Shekhar Prasad + * This interface is used to create method declaration for sending and validating otp. + */ +public interface OtpManager { + public boolean sendOtp(MainRequestDTO requestDTO, String channelType, String language, IdentityDTO identityDTO) throws IOException, ResidentServiceCheckedException, ApisResourceAccessException; + public boolean validateOtp(String otp, String userId, String transactionId) throws ApisResourceAccessException, ResidentServiceCheckedException; + public Tuple2 updateUserId(String userId, String transactionId) throws ApisResourceAccessException, ResidentServiceCheckedException, IOException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/PartnerService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/PartnerService.java new file mode 100644 index 00000000000..fb7b9a9a8bb --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/PartnerService.java @@ -0,0 +1,24 @@ +package io.mosip.resident.service; + +import java.util.ArrayList; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * Partner service class. + * @author Kamesh Shekhar Prasad + */ + +@Service +public interface PartnerService { + + /** + * Get partner details by partner id. + * @param partnerId + * @return partner details + */ + public ArrayList getPartnerDetails(String partnerId) throws ResidentServiceCheckedException; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/PinUnpinStatusService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/PinUnpinStatusService.java new file mode 100644 index 00000000000..a26589a97a3 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/PinUnpinStatusService.java @@ -0,0 +1,17 @@ +package io.mosip.resident.service; + +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * This class is service class of pin or unpin status api based on event id. + * @Author Kamesh Shekhar Prasad + */ +@Service +public interface PinUnpinStatusService { + ResponseWrapper pinStatus(String eventId, boolean status) throws ResidentServiceCheckedException; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyIdRepoService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyIdRepoService.java new file mode 100644 index 00000000000..d693a0ab21f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyIdRepoService.java @@ -0,0 +1,17 @@ +package io.mosip.resident.service; + +import java.util.List; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.DraftResidentResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +public interface ProxyIdRepoService { + + ResponseWrapper getRemainingUpdateCountByIndividualId(List attributeList) + throws ResidentServiceCheckedException; + + ResponseWrapper getPendingDrafts(String langCode) throws ResidentServiceCheckedException; + + String discardDraft(String eid) throws ResidentServiceCheckedException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyMasterdataService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyMasterdataService.java new file mode 100644 index 00000000000..3fd75c70c84 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyMasterdataService.java @@ -0,0 +1,178 @@ +package io.mosip.resident.service; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import io.mosip.resident.dto.LocationImmediateChildrenResponseDto; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.OrderEnum; +import io.mosip.resident.dto.GenderCodeResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; + +/** + * Resident proxy masterdata service class. + * + * @author Ritik Jain + */ +@Service +public interface ProxyMasterdataService { + + /** + * Get valid documents by language code. + * + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getValidDocumentByLangCode(String langCode) throws ResidentServiceCheckedException; + + public Tuple2, Map>> getValidDocCatAndTypeList(String langCode) + throws ResidentServiceCheckedException; + + /** + * Get location hierarchy levels by language code. + * + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getLocationHierarchyLevelByLangCode(String langCode) + throws ResidentServiceCheckedException; + + /** + * Get immediate children by location code and language code. + * + * @param locationCode + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getImmediateChildrenByLocCodeAndLangCode(String locationCode, String langCode) + throws ResidentServiceCheckedException; + + /** + * Get location details by location code and language code. + * + * @param locationCode + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getLocationDetailsByLocCodeAndLangCode(String locationCode, String langCode) + throws ResidentServiceCheckedException; + + /** + * Get coordinate specific registration centers + * + * @param langCode + * @param longitude + * @param latitude + * @param proximityDistance + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getCoordinateSpecificRegistrationCenters(String langCode, double longitude, + double latitude, int proximityDistance) throws ResidentServiceCheckedException; + + /** + * Get applicant valid document. + * + * @param applicantId + * @param languages + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getApplicantValidDocument(String applicantId, List languages) + throws ResidentServiceCheckedException; + + /** + * Get registration centers by hierarchy level. + * + * @param langCode + * @param hierarchyLevel + * @param name + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getRegistrationCentersByHierarchyLevel(String langCode, Short hierarchyLevel, + List name) throws ResidentServiceCheckedException; + + /** + * Get registration centers by hierarchy level and text-paginated. + * + * @param langCode + * @param hierarchyLevel + * @param name + * @param pageNumber + * @param pageSize + * @param orderBy + * @param sortBy + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getRegistrationCenterByHierarchyLevelAndTextPaginated(String langCode, + Short hierarchyLevel, String name, int pageNumber, int pageSize, OrderEnum orderBy, String sortBy) + throws ResidentServiceCheckedException; + + /** + * Get registration center working days by registration center ID. + * + * @param registrationCenterID + * @param langCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getRegistrationCenterWorkingDays(String registrationCenterID, String langCode) + throws ResidentServiceCheckedException; + + /** + * Get latest ID schema. + * + * @param schemaVersion + * @param domain + * @param type + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getLatestIdSchema(double schemaVersion, String domain, String type) + throws ResidentServiceCheckedException; + + /** + * Get templates by language code and template type code. + * + * @param langCode + * @param templateTypeCode + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getAllTemplateBylangCodeAndTemplateTypeCode(String langCode, String templateTypeCode) + throws ResidentServiceCheckedException; + + /** + * Get gender types by language code. + * + * @param fieldName + * @param langCode + * @param withValue + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getDynamicFieldBasedOnLangCodeAndFieldName(String fieldName, String langCode, boolean withValue) throws ResidentServiceCheckedException; + + public ResponseWrapper getDocumentTypesByDocumentCategoryAndLangCode(String documentcategorycode, String langCode) throws ResidentServiceCheckedException; + + public ResponseWrapper getGenderCodeByGenderTypeAndLangCode(String gendertype, String langCode) throws ResidentServiceCheckedException, IOException; + + String getTemplateValueFromTemplateTypeCodeAndLangCode(String languageCode, String templateTypeCode); + + + ResponseWrapper getLocationHierarchyLevels(String lastUpdated) throws ResidentServiceCheckedException; + + ResponseWrapper getAllDynamicFieldByName(String fieldName) throws ResidentServiceCheckedException; + + LocationImmediateChildrenResponseDto getImmediateChildrenByLocCode(String locationCode, List languageCodes) throws ResidentServiceCheckedException; +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyOtpService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyOtpService.java new file mode 100644 index 00000000000..8b0e21264dd --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyOtpService.java @@ -0,0 +1,22 @@ +package io.mosip.resident.service; + +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import org.springframework.http.ResponseEntity; + +import io.mosip.kernel.core.authmanager.model.AuthNResponse; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.MainResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import reactor.util.function.Tuple2; + +/** + * @Author Kamesh Shekhar Prasad + * This class is used to do operations on otp. + */ +public interface ProxyOtpService { + ResponseEntity> sendOtp(MainRequestDTO userOtpRequest, IdentityDTO identityDTO) throws ResidentServiceCheckedException; + + Tuple2, String> validateWithUserIdOtp(MainRequestDTO userIdOtpRequest); +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyPartnerManagementService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyPartnerManagementService.java new file mode 100644 index 00000000000..08645620076 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ProxyPartnerManagementService.java @@ -0,0 +1,35 @@ +package io.mosip.resident.service; + +import java.util.Map; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * Resident proxy partner management service class. + * + * @author Ritik Jain + */ +@Service +public interface ProxyPartnerManagementService { + + /** + * Get partners by partner type. + * + * @param partnerType + * @return ResponseWrapper object + * @throws ResidentServiceCheckedException + */ + public ResponseWrapper getPartnersByPartnerType(String partnerType) + throws ResidentServiceCheckedException; + + public ResponseWrapper getPartnersByPartnerType(Optional partnerType, ApiName apiUrl) + throws ResidentServiceCheckedException; + + public Map getPartnerDetailFromPartnerIdAndPartnerType(String partnerId, String partnerType); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentCredentialService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentCredentialService.java index d0b25d741a8..85a34ac9187 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentCredentialService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentCredentialService.java @@ -1,17 +1,28 @@ package io.mosip.resident.service; +import java.io.IOException; +import java.util.List; + import io.mosip.resident.dto.CredentialCancelRequestResponseDto; import io.mosip.resident.dto.CredentialRequestStatusResponseDto; import io.mosip.resident.dto.CredentialTypeResponse; import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; import io.mosip.resident.dto.ResidentCredentialRequestDto; import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResidentCredentialResponseDtoV2; import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; public interface ResidentCredentialService { public ResidentCredentialResponseDto reqCredential(ResidentCredentialRequestDto request) throws ResidentServiceCheckedException; + + public ResidentCredentialResponseDto reqCredential(ResidentCredentialRequestDto request, String id) throws ResidentServiceCheckedException; + + public Tuple2 shareCredential(ResidentCredentialRequestDto request, String purpose, List sharableAttributes) throws ResidentServiceCheckedException, ApisResourceAccessException; public CredentialRequestStatusResponseDto getStatus(String requestId) throws ResidentServiceCheckedException; @@ -23,4 +34,9 @@ public interface ResidentCredentialService { public ResponseWrapper getPolicyByCredentialType(String partnerId, String credentialType); + + public byte[] getCard(String requestId, String applicationId, String partnerReferenceId) throws ResidentServiceCheckedException; + + public String getDataShareUrl(String requestId) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException; + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentOtpService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentOtpService.java index b08a3391bbc..7b96adb8dbe 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentOtpService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentOtpService.java @@ -1,7 +1,13 @@ package io.mosip.resident.service; +import java.security.NoSuchAlgorithmException; + +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.IndividualIdResponseDto; import io.mosip.resident.dto.OtpRequestDTO; import io.mosip.resident.dto.OtpResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; public interface ResidentOtpService { @@ -14,5 +20,10 @@ public interface ResidentOtpService { * @throws IdAuthenticationBusinessException exception */ - public OtpResponseDTO generateOtp(OtpRequestDTO otpRequestDTO); + public OtpResponseDTO generateOtp(OtpRequestDTO otpRequestDTO) throws NoSuchAlgorithmException, ResidentServiceCheckedException; + + public void insertData(OtpRequestDTO otpRequestDTO) throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException; + + public IndividualIdResponseDto generateOtpForIndividualId(IndividualIdOtpRequestDTO otpRequestDto) throws NoSuchAlgorithmException, ResidentServiceCheckedException, ApisResourceAccessException; + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentService.java index 9cd6ae82795..b4c0037a5f7 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentService.java @@ -1,33 +1,96 @@ -package io.mosip.resident.service; - -import io.mosip.resident.constant.AuthTypeStatus; -import io.mosip.resident.dto.AuthHistoryRequestDTO; -import io.mosip.resident.dto.AuthHistoryResponseDTO; -import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; -import io.mosip.resident.dto.EuinRequestDTO; -import io.mosip.resident.dto.RegStatusCheckResponseDTO; -import io.mosip.resident.dto.RequestDTO; -import io.mosip.resident.dto.ResidentReprintRequestDto; -import io.mosip.resident.dto.ResidentReprintResponseDto; -import io.mosip.resident.dto.ResidentUpdateRequestDto; -import io.mosip.resident.dto.ResidentUpdateResponseDTO; -import io.mosip.resident.dto.ResponseDTO; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.ResidentServiceCheckedException; - -public interface ResidentService { - - public RegStatusCheckResponseDTO getRidStatus(RequestDTO dto) throws ApisResourceAccessException; - - public byte[] reqEuin(EuinRequestDTO euinRequestDTO) throws ResidentServiceCheckedException; - - public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) throws ResidentServiceCheckedException; - - public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, AuthTypeStatus authTypeStatus) - throws ResidentServiceCheckedException; - - public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws ResidentServiceCheckedException; - - public ResidentUpdateResponseDTO reqUinUpdate(ResidentUpdateRequestDto dto) throws ResidentServiceCheckedException; - -} +package io.mosip.resident.service; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +import io.mosip.resident.dto.IdResponseDTO1; +import org.json.simple.JSONObject; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AidStatusResponseDTO; +import io.mosip.resident.dto.AuthHistoryRequestDTO; +import io.mosip.resident.dto.AuthHistoryResponseDTO; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.BellNotificationDto; +import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.EventStatusResponseDTO; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.RegStatusCheckResponseDTO; +import io.mosip.resident.dto.RequestDTO; +import io.mosip.resident.dto.ResidentReprintRequestDto; +import io.mosip.resident.dto.ResidentReprintResponseDto; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.dto.UnreadNotificationDto; +import io.mosip.resident.dto.UserInfoDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import reactor.util.function.Tuple2; + +public interface ResidentService { + + public RegStatusCheckResponseDTO getRidStatus(RequestDTO dto) throws ApisResourceAccessException; + + public byte[] reqEuin(EuinRequestDTO euinRequestDTO) throws ResidentServiceCheckedException; + + public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) throws ResidentServiceCheckedException; + + public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, AuthTypeStatus authTypeStatus) + throws ResidentServiceCheckedException; + + public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws ResidentServiceCheckedException; + + public Tuple2 reqUinUpdate(ResidentUpdateRequestDto dto) throws ResidentServiceCheckedException; + + public Tuple2 reqUinUpdate(ResidentUpdateRequestDto dto, JSONObject demographicJsonObject, boolean validateIdObject, JSONObject idRepoJson, String schemaJson, IdResponseDTO1 idResponseDto) throws ResidentServiceCheckedException; + + public Tuple2 reqAauthTypeStatusUpdateV2(AuthLockOrUnLockRequestDtoV2 request) + throws ResidentServiceCheckedException, ApisResourceAccessException; + + public ResponseWrapper getAuthLockStatus(String individualId) throws ResidentServiceCheckedException;; + + RegStatusCheckResponseDTO getRidStatus(String rid); + + ResponseWrapper> getServiceHistory(Integer pageIndex, Integer pageSize, + LocalDate fromDateTime, LocalDate toDateTime, String serviceType, String sortType, + String statusFilter, String searchText, String langCode, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException; + + Tuple2 downloadCard(String eventId); + + AidStatusResponseDTO getAidStatus(AidStatusRequestDTO reqDto, boolean performOtpValidation) + throws ResidentServiceCheckedException, ApisResourceAccessException, OtpValidationFailedException; + + ResponseWrapper getEventStatus(String id, String eventId, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException; + + ResponseWrapper getnotificationCount(String Id) throws ApisResourceAccessException, ResidentServiceCheckedException; + + ResponseWrapper getbellClickdttimes(String idaToken); + + int updatebellClickdttimes(String idaToken) throws ApisResourceAccessException, ResidentServiceCheckedException; + + ResponseWrapper> getNotificationList(Integer pageIndex, Integer pageSize, String Id, String languageCode, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException; + + byte[] downLoadServiceHistory(ResponseWrapper> responseWrapper, + String languageCode, LocalDateTime eventReqDateTime, LocalDate fromDateTime, LocalDate toDateTime, + String serviceType, String statusFilter, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, IOException; + + public ResponseWrapper getUserinfo(String idaToken, String langCode, int timeZoneOffset, String locale) throws ApisResourceAccessException, ResidentServiceCheckedException; + + public String getFileName(String eventId, IdType cardType, int timeZoneOffset, String locale); + + ResponseWrapper> getServiceHistory(Integer pageStart, Integer pageFetch, + LocalDate fromDateTime, LocalDate toDateTime, String serviceType, String sortType, String statusFilter, + String searchText, String langCode, int timeZoneOffset, String locale, String defaultPageSizeProperty, List statusCodeList) + throws ResidentServiceCheckedException, ApisResourceAccessException; + +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentVidService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentVidService.java index 5d3a16d8d07..67495a407de 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentVidService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/ResidentVidService.java @@ -1,19 +1,45 @@ package io.mosip.resident.service; +import io.mosip.resident.dto.BaseVidRequestDto; +import io.mosip.resident.dto.BaseVidRevokeRequestDTO; import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.dto.VidRequestDto; import io.mosip.resident.dto.VidResponseDto; -import io.mosip.resident.dto.VidRevokeRequestDTO; import io.mosip.resident.dto.VidRevokeResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.OtpValidationFailedException; import io.mosip.resident.exception.ResidentServiceCheckedException; import org.springframework.stereotype.Service; +import reactor.util.function.Tuple2; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Optional; @Service public interface ResidentVidService { - public ResponseWrapper generateVid(VidRequestDto requestDto) throws OtpValidationFailedException, ResidentServiceCheckedException; + public ResponseWrapper generateVid(BaseVidRequestDto requestDto, String individualId) throws OtpValidationFailedException, ResidentServiceCheckedException; + + public ResponseWrapper revokeVid(BaseVidRevokeRequestDTO requestDto,String vid, String individualId) throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException; + + public String getVidPolicy() throws ResidentServiceCheckedException; + + public ResponseWrapper>> retrieveVids(String residentIndividualId, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException; + + public Optional getPerpatualVid(String uin) throws ResidentServiceCheckedException, ApisResourceAccessException; + + public Tuple2, String> generateVidV2(BaseVidRequestDto requestDto, + String individualId) throws OtpValidationFailedException, ResidentServiceCheckedException; + + public Tuple2, String> revokeVidV2(BaseVidRevokeRequestDTO requestDto, + String vid, String indivudalId) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException; + + ResponseWrapper>> retrieveVidsfromUin(String uin, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException; - public ResponseWrapper revokeVid(VidRevokeRequestDTO requestDto,String vid) throws OtpValidationFailedException, ResidentServiceCheckedException; + ResponseWrapper>> retrieveVids(int timeZoneOffset, String locale, String uin) + throws ResidentServiceCheckedException, ApisResourceAccessException; } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/VerificationService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/VerificationService.java new file mode 100644 index 00000000000..2e270522b31 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/VerificationService.java @@ -0,0 +1,15 @@ +package io.mosip.resident.service; + +import java.security.NoSuchAlgorithmException; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.dto.VerificationResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +@Service +public interface VerificationService { + VerificationResponseDTO checkChannelVerificationStatus(String channel, String individualId) + throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubCredentialStatusUpdateService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubCredentialStatusUpdateService.java new file mode 100644 index 00000000000..6168b503651 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubCredentialStatusUpdateService.java @@ -0,0 +1,20 @@ +package io.mosip.resident.service; + +import java.util.Map; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; + +/** + * Service to update the resident transaction status from the credential status + * update in the websub event. + * + * @author Loganathan S + * + */ +@Service +public interface WebSubCredentialStatusUpdateService { + public void updateCredentialStatus(Map eventModel) throws ResidentServiceCheckedException, ApisResourceAccessException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubRegprocWorkFlowService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubRegprocWorkFlowService.java new file mode 100644 index 00000000000..6cd9529d31e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubRegprocWorkFlowService.java @@ -0,0 +1,20 @@ +package io.mosip.resident.service; + +import io.mosip.resident.dto.WorkflowCompletedEventDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Service to update the resident transaction status from the credential status + * update in the websub event. + * + * @author Kamesh Shekhar Prasad + * + */ +@Service +public interface WebSubRegprocWorkFlowService { + public void updateResidentStatus(WorkflowCompletedEventDTO workflowCompletedEventDTO) throws ResidentServiceCheckedException, ApisResourceAccessException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubUpdateAuthTypeService.java b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubUpdateAuthTypeService.java new file mode 100644 index 00000000000..366532ed45a --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/WebSubUpdateAuthTypeService.java @@ -0,0 +1,12 @@ +package io.mosip.resident.service; + +import java.util.Map; + +import org.springframework.stereotype.Service; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +@Service +public interface WebSubUpdateAuthTypeService { + public void updateAuthTypeStatus(Map eventModel) throws ResidentServiceCheckedException, ApisResourceAccessException; +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AcknowledgementServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AcknowledgementServiceImpl.java new file mode 100644 index 00000000000..b01606fd686 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AcknowledgementServiceImpl.java @@ -0,0 +1,95 @@ +package io.mosip.resident.service.impl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.core.templatemanager.spi.TemplateManagerBuilder; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.AcknowledgementService; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +/** + * This class is used to create service class implementation for getting acknowledgement API. + * @Author Kamesh Shekhar Prasad + */ +@Service +public class AcknowledgementServiceImpl implements AcknowledgementService { + + private static final Logger logger = LoggerConfiguration.logConfig(AcknowledgementServiceImpl.class); + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private TemplateUtil templateUtil; + + private static final String CLASSPATH = "classpath"; + private static final String ENCODE_TYPE = "UTF-8"; + + private TemplateManager templateManager; + + @Autowired + private TemplateManagerBuilder templateManagerBuilder; + + @PostConstruct + public void idTemplateManagerPostConstruct() { + templateManager = templateManagerBuilder.encodingType(ENCODE_TYPE).enableCache(false).resourceLoader(CLASSPATH) + .build(); + } + + @Autowired + private Utility utility; + + @Override + public Tuple2 getAcknowledgementPDF(String eventId, String languageCode, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, IOException { + logger.debug("AcknowledgementServiceImpl::getAcknowledgementPDF()::entry"); + + Optional residentTransactionEntity = residentTransactionRepository + .findById(eventId); + String requestTypeCode; + if (residentTransactionEntity.isPresent()) { + requestTypeCode = residentTransactionEntity.get().getRequestTypeCode(); + } else { + throw new ResidentServiceCheckedException(ResidentErrorCode.EVENT_STATUS_NOT_FOUND); + } + RequestType requestType = RequestType.getRequestTypeFromString(requestTypeCode); + Tuple2, String> ackTemplateVariables = requestType.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, timeZoneOffset, locale); + String requestProperty = ackTemplateVariables.getT2(); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, requestProperty); + Map templateVariables = ackTemplateVariables.getT1(); + InputStream stream = new ByteArrayInputStream(fileText.getBytes(StandardCharsets.UTF_8)); + InputStream templateValue = templateManager.merge(stream, convertMapValueFromStringToObject(templateVariables)); + logger.debug("AcknowledgementServiceImpl::getAcknowledgementPDF()::exit"); + return Tuples.of(utility.signPdf(templateValue, null), requestType); + } + + public Map convertMapValueFromStringToObject(Map templateVariables) { + Map templateMapObject = new HashMap<>(); + for(Map.Entry entry: templateVariables.entrySet()){ + templateMapObject.put(entry.getKey(), entry.getValue()); + } + return templateMapObject; + } + +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AuthTransactionCallBackServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AuthTransactionCallBackServiceImpl.java new file mode 100644 index 00000000000..ea25a47c687 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/AuthTransactionCallBackServiceImpl.java @@ -0,0 +1,113 @@ +package io.mosip.resident.service.impl; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.AuthTransactionCallBackService; +import io.mosip.resident.util.Utility; + +@Component +public class AuthTransactionCallBackServiceImpl implements AuthTransactionCallBackService { + + private static final String AUTHTYPE_CODE = "authtypeCode"; + private static final String REQUESTDATETIME = "requestdatetime"; + private static final String STATUS_COMMENT = "statusComment"; + private static final String STATUS_CODE = "statusCode"; + private static final String RESPONSE_SIGNATURE = "responseSignature"; + private static final String REQUEST_SIGNATURE = "requestSignature"; + private static final String ENTITY_NAME = "entityName"; + private static final String REFERENCE_ID_TYPE = "referenceIdType"; + private static final String TRANSACTION_ID = "transactionID"; + private static final String INDIVIDUAL_ID = "individualId"; + private static final String ENTITY_ID = "entityId"; + private static final String TOKEN_ID = "tokenId"; + private static final String OLV_PARTNER_ID = "olv_partner_id"; + + private static final Logger logger = LoggerConfiguration.logConfig(AuthTransactionCallBackServiceImpl.class); + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private Utility utility; + + @Override + public void updateAuthTransactionCallBackService(Map eventModel) throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "AuthTransactionCallbackServiceImpl::updateAuthTransactionCallBackService()::entry"); + try { + insertInResidentTransactionTable(eventModel, null); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "AuthTransactionCallbackServiceImpl::updateAuthTransactionCallBackService()::exception"); + insertInResidentTransactionTable(eventModel, EventStatusFailure.AUTHENTICATION_FAILED.name()); + throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_WEBSUB_UPDATE_AUTH_TYPE_FAILED.getErrorCode(), + ResidentErrorCode.RESIDENT_WEBSUB_UPDATE_AUTH_TYPE_FAILED.getErrorMessage(), e); + } + } + + private void insertInResidentTransactionTable(Map eventModel, String status) throws ApisResourceAccessException, NoSuchAlgorithmException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "AuthTransactionCallbackServiceImpl::insertInResidentTransactionTable()::entry"); + Object eventObj = eventModel.get(ResidentConstants.EVENT); + if (eventObj instanceof Map) { + Map eventMap = (Map) eventObj; + Object dataObject = eventMap.get(ResidentConstants.DATA); + if (dataObject instanceof Map) { + Map dataMap = (Map) dataObject; + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.AUTHENTICATION_REQUEST); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId((String) dataMap.get(INDIVIDUAL_ID)); + residentTransactionEntity.setIndividualId((String) dataMap.get(INDIVIDUAL_ID)); + residentTransactionEntity.setRequestSummary(RequestType.AUTHENTICATION_REQUEST.name()); + residentTransactionEntity.setTokenId((String) dataMap.get(TOKEN_ID)); + residentTransactionEntity.setOlvPartnerId((String) dataMap.get(OLV_PARTNER_ID)); + residentTransactionEntity.setRequestTrnId((String) dataMap.get(TRANSACTION_ID)); + residentTransactionEntity.setRefIdType((String) dataMap.get(REFERENCE_ID_TYPE)); + residentTransactionEntity.setRequestedEntityId((String) dataMap.get(ENTITY_ID)); + residentTransactionEntity.setRequestedEntityName((String) dataMap.get(ENTITY_NAME)); + residentTransactionEntity.setRequestSignature((String) dataMap.get(REQUEST_SIGNATURE)); + residentTransactionEntity.setResponseSignature((String) dataMap.get(RESPONSE_SIGNATURE)); + if (status == null) { + Object object = dataMap.get(STATUS_CODE); + if (object instanceof String) { + status = (String) object; + } else { + status = EventStatusFailure.N.name(); + } + } + residentTransactionEntity.setStatusCode(status); + residentTransactionEntity.setAuthTypeCode((String) dataMap.get(AUTHTYPE_CODE)); + residentTransactionEntity.setStatusComment((String) dataMap.get(STATUS_COMMENT)); + Object reqdatetimeObj = dataMap.get(REQUESTDATETIME); + if (reqdatetimeObj != null) { + residentTransactionEntity + .setRequestDtimes(objectMapper.convertValue(reqdatetimeObj, LocalDateTime.class)); + } + residentTransactionRepository.save(residentTransactionEntity); + } + } + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "AuthTransactionCallbackServiceImpl::insertInResidentTransactionTable()::exit"); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/BaseWebSubInitializer.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/BaseWebSubInitializer.java new file mode 100644 index 00000000000..95466acf646 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/BaseWebSubInitializer.java @@ -0,0 +1,205 @@ +package io.mosip.resident.service.impl; + +import java.time.Duration; +import java.time.Instant; +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.websub.spi.PublisherClient; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; + +@Component +public class BaseWebSubInitializer implements ApplicationListener { + + private static final Logger logger = LoggerConfiguration.logConfig(BaseWebSubInitializer.class); + + @Autowired + private ThreadPoolTaskScheduler taskScheduler; + + /** + * The task subsctiption delay. + */ + @Value("${" + ResidentConstants.SUBSCRIPTIONS_DELAY_ON_STARTUP + ":60000}") + private int taskSubscriptionInitialDelay; + + @Value("${" + ResidentConstants.RESUBSCRIPTIONS_INTERVAL_SECS + ":43200}") + private int reSubscriptionIntervalSecs; + + /** + * The publisher. + */ + @Autowired + private PublisherClient publisher; + + @Autowired + SubscriptionClient subscribe; + + @Value("${websub.publish.url}") + private String publishUrl; + + @Value("${websub.hub.url}") + private String hubUrl; + + @Value("${resident.websub.authtype-status.secret}") + private String authTypeStatusSecret; + + @Value("${resident.websub.callback.authtype-status.url}") + private String authTypeStatusCallbackUrl; + + @Value("${resident.websub.callback.authTransaction-status.url}") + private String authTransactionCallbackUrl; + + @Value("${resident.websub.authtype-status.topic}") + private String autTypeStatusTopic; + + @Value("${resident.websub.authTransaction-status.topic}") + private String authTransactionTopic; + + @Value("${resident.websub.authTransaction-status.secret}") + private String authTransactionSecret; + + + @Value("${resident.websub.callback.credential-status.url}") + private String credentialStatusUpdateCallbackUrl; + + @Value("${resident.websub.credential-status.topic}") + private String credentialStatusUpdateTopic; + + @Value("${resident.websub.credential-status.secret}") + private String credentialStatusUpdateSecret; + + @Value("${mosip.regproc.workflow.complete.topic}") + private String regProcWorkflowCompleteTopic; + + @Value("${resident.websub.callback.regproc.workflow.complete.url}") + private String regProcWorkFlowCompleteCallbackUrl; + + @Value("${resident.websub.regproc.workflow.complete.secret}") + private String regProcWorkFlowCompleteSecret; + + + + @Override + public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { + logger.info("onApplicationEvent", "BaseWebSubInitializer", "Application is ready"); + logger.info("Scheduling event subscriptions after (milliseconds): " + taskSubscriptionInitialDelay); + taskScheduler.schedule(() -> { + //Invoke topic registrations. This is done only once. + //Note: With authenticated websub, only register topics which are only published by IDA + tryRegisteringTopics(); + //Init topic subscriptions + initTopicSubscriptions(); + }, new Date(System.currentTimeMillis() + taskSubscriptionInitialDelay)); + + if (reSubscriptionIntervalSecs > 0) { + logger.info("Work around for web-sub notification issue after some time."); + scheduleRetrySubscriptions(); + } else { + logger.info("Scheduling for re-subscription is Disabled as the re-subsctription delay value is: " + + reSubscriptionIntervalSecs); + } + + } + + private void initTopicSubscriptions() { + authTypStatusTopicSubsriptions(); + authTransactionTopicSubscription(); + credentialStatusUpdateTopicSubscription(); + regProcCompleteTopicSubscription(); + } + + private void tryRegisteringTopics() { + tryRegisterTopicEvent(autTypeStatusTopic); + tryRegisterTopicEvent(authTransactionTopic); + tryRegisterTopicEvent(credentialStatusUpdateTopic); + } + + private void scheduleRetrySubscriptions() { + taskScheduler.scheduleAtFixedRate(this::initTopicSubscriptions, Instant.now().plusSeconds(reSubscriptionIntervalSecs), + Duration.ofSeconds(reSubscriptionIntervalSecs)); + } + + public void authTransactionTopicSubscription() { + logger.debug("subscribe", "", + "Trying to subscribe to topic: " + authTransactionTopic + " callback-url: " + + authTransactionCallbackUrl); + subscribe(authTransactionTopic, authTransactionCallbackUrl, authTransactionSecret, hubUrl); + logger.info("subscribe", "", + "Subscribed to topic: " + authTransactionTopic); + } + + public void credentialStatusUpdateTopicSubscription() { + logger.debug("subscribe", "", + "Trying to subscribe to topic: " + credentialStatusUpdateTopic + " callback-url: " + + credentialStatusUpdateCallbackUrl); + subscribe(credentialStatusUpdateTopic, credentialStatusUpdateCallbackUrl, credentialStatusUpdateSecret, hubUrl); + logger.info("subscribe", "", + "Subscribed to topic: " + credentialStatusUpdateTopic); + } + + public void regProcCompleteTopicSubscription() { + logger.debug("subscribe", "", + "Trying to subscribe to topic: " + regProcWorkflowCompleteTopic + " callback-url: " + + regProcWorkFlowCompleteCallbackUrl); + subscribe(regProcWorkflowCompleteTopic, regProcWorkFlowCompleteCallbackUrl, regProcWorkFlowCompleteSecret, hubUrl); + logger.info("subscribe", "", + "Subscribed to topic: " + regProcWorkflowCompleteTopic); + } + + protected void tryRegisterTopicEvent(String eventTopic) { + try { + logger.debug(this.getClass().getCanonicalName(), "tryRegisterTopicEvent", "", + "Trying to register topic: " + eventTopic); + publisher.registerTopic(eventTopic, publishUrl); + logger.info(this.getClass().getCanonicalName(), "tryRegisterTopicEvent", "", + "Registered topic: " + eventTopic); + } catch (Exception e) { + logger.info(this.getClass().getCanonicalName(), "tryRegisterTopicEvent", e.getClass().toString(), + "Error registering tryRegisterTopicEvent: " + eventTopic + "\n" + e.getMessage()); + } + } + + protected void authTypStatusTopicSubsriptions() { + logger.debug("subscribe", "", + "Trying to subscribe to topic: " + autTypeStatusTopic + " callback-url: " + + authTypeStatusCallbackUrl); + subscribe(autTypeStatusTopic, authTypeStatusCallbackUrl, authTypeStatusSecret, hubUrl); + logger.info("subscribe", "", + "Subscribed to topic: " + autTypeStatusTopic); + + } + + private void subscribe(String topic, String callbackUrl, String secret, String hubUrl) { + try { + SubscriptionChangeRequest subscriptionRequest = new SubscriptionChangeRequest(); + logger.debug("subscribe", "", + "Trying to subscribe to topic: " + topic + " callback-url: " + + callbackUrl); + subscriptionRequest.setCallbackURL(callbackUrl); + subscriptionRequest.setSecret(secret); + subscriptionRequest.setTopic(topic); + subscriptionRequest.setHubURL(hubUrl); + subscribe.subscribe(subscriptionRequest); + + logger.info("subscribe", "", + "Subscribed to topic: " + topic); + } catch (Exception e) { + logger.info("subscribe", e.getClass().toString(), + "Error subscribing topic: " + topic + "\n" + e.getMessage()); + throw e; + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DocumentServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DocumentServiceImpl.java new file mode 100644 index 00000000000..b71ddc4364c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DocumentServiceImpl.java @@ -0,0 +1,197 @@ +package io.mosip.resident.service.impl; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.velocity.util.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import io.mosip.commons.khazana.dto.ObjectDto; +import io.mosip.commons.khazana.exception.ObjectStoreAdapterException; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.UUIDUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.DocumentDTO; +import io.mosip.resident.dto.DocumentRequestDTO; +import io.mosip.resident.dto.DocumentResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; + +/** + * It's a service class that uploads a document to the object store and returns + * the document metadata. + * + * @author Manoj SP + */ +@Service +public class DocumentServiceImpl implements DocumentService { + + private static final Logger logger = LoggerConfiguration.logConfig(DocumentServiceImpl.class); + + private static final String SUCCESS = "SUCCESS"; + private static final String DOCUMENT_DELETION_SUCCESS_MESSAGE = "Document deleted successfully"; + private static final String FAILURE = "FAILURE"; + private static final String DOCUMENT_DELETION_FAILURE_MESSAGE = "Document deletion failed"; + + @Autowired + private ObjectStoreHelper objectStoreHelper; + + /** + * It uploads a file to the object store + * + * @param transactionId This is the transaction id of the resident. + * @param file The file to be uploaded + * @param request DocumentRequestDTO + * @return The response is a DocumentResponseDTO object. + */ + @Override + public DocumentResponseDTO uploadDocument(String transactionId, MultipartFile file, DocumentRequestDTO request) + throws ResidentServiceCheckedException { + try { + logger.debug("DocumentServiceImpl::uploadDocument()::entry"); + String docId = UUID.randomUUID().toString(); + String objectNameWithPath = transactionId + "/" + docId; + Map metadata = Map.of("doccatcode", request.getDocCatCode(), "doctypcode", + request.getDocTypCode(), "langcode", request.getLangCode(), "docname", file.getOriginalFilename(), + "docid", docId,"referenceid",request.getReferenceId(), "content-length", file.getSize()); + objectStoreHelper.putObject(objectNameWithPath, file.getInputStream(), metadata); + DocumentResponseDTO response = new DocumentResponseDTO(); + response.setTransactionId(transactionId); + response.setDocId(docId); + response.setDocName(file.getOriginalFilename()); + response.setDocCatCode(request.getDocCatCode()); + response.setDocTypCode(request.getDocTypCode()); + response.setDocFileFormat(StringUtils.split(file.getOriginalFilename(), "\\.")[1]); + logger.debug("DocumentServiceImpl::uploadDocument()::exit"); + return response; + } + catch (IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(ResidentErrorCode.FAILED_TO_UPLOAD_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_UPLOAD_DOC.getErrorMessage(), e); + } + } + + /** + * It fetches all the documents metadata from the object store + * + * @param transactionId This is the transaction ID that is generated by the + * resident service. + * @return A list of DocumentResponseDTO objects. + */ + @Override + public List fetchAllDocumentsMetadata(String transactionId) + throws ResidentServiceCheckedException { + logger.debug("DocumentServiceImpl::fetchAllDocumentsMetadata()::entry"); + List allObjects = objectStoreHelper.getAllObjects(transactionId); + if(allObjects == null){ + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorCode(), + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorMessage()+transactionId); + } + return allObjects.stream().map(object -> this.fetchDocumentMetadata(transactionId, object.getObjectName())) + .collect(Collectors.toList()); + } + + /** + * It fetches the document from the object store + * @param transactionId This is the transaction ID + * @param documentId This is the document id + */ + + @Override + public DocumentDTO fetchDocumentByDocId(String transactionId, String documentId) throws ResidentServiceCheckedException { + logger.debug("DocumentServiceImpl::fetchDocumentByDocId()::entry"); + DocumentDTO document = new DocumentDTO(); + String objectNameWithPath = transactionId + "/" + documentId; + try { + String sourceFile = objectStoreHelper.getObject(objectNameWithPath); + document.setDocument(sourceFile.getBytes(StandardCharsets.UTF_8)); + }catch (ResidentServiceException | ObjectStoreAdapterException e){ + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorCode(), + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorMessage()+transactionId+ " & documentId: "+documentId, e); + } + logger.debug("DocumentServiceImpl::fetchDocumentByDocId()::exit"); + return document; + } + + /** + * It fetches all the documents from the object store and returns a map of + * document metadata and document content + * + * @param transactionId The transaction ID of the transaction for which the + * documents are to be fetched. + * @return A map of DocumentResponseDTO and String. + */ + @Override + public Map getDocumentsWithMetadata(String transactionId) + throws ResidentServiceCheckedException { + logger.debug("DocumentServiceImpl::getDocumentsWithMetadata()::entry"); + List allObjects= objectStoreHelper.getAllObjects(transactionId); + if(allObjects==null) { + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorCode(), + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorMessage() + transactionId); + } + return allObjects.stream() + .collect(Collectors.toMap(object -> this.fetchDocumentMetadata(transactionId, object.getObjectName()), + object -> objectStoreHelper.getObject(transactionId + "/" + object.getObjectName()))); + } + + /** + * It fetches the metadata of a document from the object store + * + * @param transactionId The transaction id of the transaction that the document + * belongs to. + * @param objectName The name of the file that you want to download. + * @return A DocumentResponseDTO object. + */ + private DocumentResponseDTO fetchDocumentMetadata(String transactionId, String objectName) { + logger.debug("DocumentServiceImpl::fetchDocumentMetadata()::entry"); + Map metadata = objectStoreHelper.getMetadata(transactionId + "/" + objectName); + logger.debug("DocumentServiceImpl::fetchDocumentMetadata()::exit"); + return new DocumentResponseDTO(transactionId, (String) metadata.get("docid"), (String) metadata.get("docname"), + (String) metadata.get("doccatcode"), (String) metadata.get("doctypcode"), + StringUtils.split((String) metadata.get("docname"), "\\.")[1]); + } + + /** + * It Deletes the document metadata from the object store + * @param transactionId + * @param documentId + * @return ResponseDTO + * @throws ResidentServiceCheckedException + */ + @Override + public ResponseDTO deleteDocument(String transactionId, String documentId) throws ResidentServiceCheckedException { + logger.debug("DocumentServiceImpl::deleteDocument()::entry"); + DocumentDTO documentDTO = fetchDocumentByDocId(transactionId, documentId); + ResponseDTO response = new ResponseDTO(); + if(documentDTO != null){ + boolean status = objectStoreHelper.deleteObject(transactionId + "/" + documentId); + if(status) { + response.setStatus(SUCCESS); + response.setMessage(DOCUMENT_DELETION_SUCCESS_MESSAGE); + } else { + response.setStatus(FAILURE); + response.setMessage(DOCUMENT_DELETION_FAILURE_MESSAGE); + } + } + logger.debug("DocumentServiceImpl::deleteDocument()::exit"); + return response; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownLoadMasterDataServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownLoadMasterDataServiceImpl.java new file mode 100644 index 00000000000..70dfdc301e9 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownLoadMasterDataServiceImpl.java @@ -0,0 +1,269 @@ +package io.mosip.resident.service.impl; + +import static io.mosip.resident.constant.ResidentConstants.REGISTRATION_CENTRE_TEMPLATE_PROPERTY; +import static io.mosip.resident.constant.ResidentConstants.RESIDENT_REGISTRATION_CENTERS_DOWNLOAD_MAX_COUNT; +import static io.mosip.resident.constant.ResidentConstants.SUPPORTING_DOCS_TEMPLATE_PROPERTY; +import static io.mosip.resident.constant.ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER; +import static io.mosip.resident.constant.TemplateVariablesConstants.PDF_HEADER_LOGO; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import javax.annotation.PostConstruct; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.core.templatemanager.spi.TemplateManagerBuilder; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.OrderEnum; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.RegistrationCenterDto; +import io.mosip.resident.dto.RegistrationCenterInfoResponseDto; +import io.mosip.resident.dto.WorkingDaysDto; +import io.mosip.resident.dto.WorkingDaysResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.DownLoadMasterDataService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; + +/** + * + * @author M1063027 Rama devi + * + */ +@Component +public class DownLoadMasterDataServiceImpl implements DownLoadMasterDataService { + + private static final String HYPHEN_DELIMITER = "-"; + private static final String PIPE_DELIMITER = " | "; + private static final String CLASSPATH = "classpath"; + private static final String ENCODE_TYPE = "UTF-8"; + + @Autowired + Environment env; + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + private TemplateManager templateManager; + + @Autowired + private TemplateManagerBuilder templateManagerBuilder; + + /** The mapper. */ + @Autowired + private ObjectMapper mapper; + + @Autowired + private Utility utility; + + @Autowired + private TemplateUtil templateUtil; + + @Value("${" + RESIDENT_REGISTRATION_CENTERS_DOWNLOAD_MAX_COUNT + "}") + private Integer maxRegistrationCenterPageSize; + + private static final Logger logger = LoggerConfiguration.logConfig(DownLoadMasterDataServiceImpl.class); + + @PostConstruct + public void idTemplateManagerPostConstruct() { + templateManager = templateManagerBuilder.encodingType(ENCODE_TYPE).enableCache(false).resourceLoader(CLASSPATH) + .build(); + } + + /** + * download registration centers based on language code, hierarchyLevel and + * center names + */ + public InputStream downloadRegistrationCentersByHierarchyLevel(String langCode, Short hierarchyLevel, + String name) throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataServiceImpl::downloadRegistrationCentersByHierarchyLevel()::entry"); + ResponseWrapper regCentResponseWrapper = proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(langCode, hierarchyLevel, name, 0, maxRegistrationCenterPageSize, OrderEnum.desc, null); + return getRegistrationCentersPdf(langCode, regCentResponseWrapper); + } + + public InputStream getRegistrationCentersPdf(String langCode, ResponseWrapper regCentResponseWrapper) throws ResidentServiceCheckedException, IOException { + logger.debug("DownLoadMasterDataServiceImpl::getRegistrationCentersPdf()::entry"); + Map regCentersMap = new LinkedHashMap<>(); + if (regCentResponseWrapper != null) { + RegistrationCenterInfoResponseDto registrationCentersDtls = mapper.readValue( + mapper.writeValueAsString(regCentResponseWrapper.getResponse()), + RegistrationCenterInfoResponseDto.class); + List regCenterIntialList = getRegCenterList(registrationCentersDtls); + if (regCenterIntialList != null && !regCenterIntialList.isEmpty()) { + IntStream.range(0, regCenterIntialList.size()).forEach(i -> { + try { + addRegistrationCenterDtls(i, regCenterIntialList.get(i)); + } catch (Exception e) { + throw new ResidentServiceException(ResidentErrorCode.UNABLE_TO_PROCESS, e); + } + }); + } + regCentersMap.put("regCenterIntialList", regCenterIntialList); + } + regCentersMap.put(PDF_HEADER_LOGO, utility.getPDFHeaderLogo()); + String templateTypeCode = this.env.getProperty(REGISTRATION_CENTRE_TEMPLATE_PROPERTY); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(langCode, templateTypeCode); + InputStream downLoadRegCenterTemplate = new ByteArrayInputStream(fileText.getBytes(StandardCharsets.UTF_8)); + InputStream downLoadRegCenterTemplateData = templateManager.merge(downLoadRegCenterTemplate, regCentersMap); + + StringWriter writer = new StringWriter(); + IOUtils.copy(downLoadRegCenterTemplateData, writer, "UTF-8"); + logger.debug("DownLoadMasterDataServiceImpl::getRegistrationCentersPdf()::exit"); + return new ByteArrayInputStream(utility.signPdf(new ByteArrayInputStream(writer.toString().getBytes()), null)); + } + + private List getRegCenterList(RegistrationCenterInfoResponseDto registrationCentersDtls) { + if (registrationCentersDtls.getData() != null && !registrationCentersDtls.getData().isEmpty()) { + return registrationCentersDtls.getData(); + } else if (registrationCentersDtls.getRegistrationCenters() != null && !registrationCentersDtls.getRegistrationCenters().isEmpty()) { + return registrationCentersDtls.getRegistrationCenters(); + } + return List.of(); + } + + /** + * download the nearest registration centers + */ + public InputStream getNearestRegistrationcenters(String langCode, double longitude, double latitude, + int proximityDistance) throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataServiceImpl::getNearestRegistrationcenters()::entry"); + ResponseWrapper regCentResponseWrapper = proxyMasterdataService.getCoordinateSpecificRegistrationCenters(langCode, + longitude, latitude, proximityDistance); + return getRegistrationCentersPdf(langCode, regCentResponseWrapper); + } + + + /** + * download registration centers based on language code, hierarchyLevel and + * center names + */ + public InputStream downloadSupportingDocsByLanguage(String langCode) throws ResidentServiceCheckedException, IOException, Exception { + logger.debug("DownLoadMasterDataServiceImpl::downloadSupportingDocsByLanguage()::entry"); + String templateTypeCode = this.env.getProperty(SUPPORTING_DOCS_TEMPLATE_PROPERTY); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(langCode, templateTypeCode); + Map supportingsDocsMap = new HashMap<>(); + supportingsDocsMap.put(PDF_HEADER_LOGO, utility.getPDFHeaderLogo()); + InputStream supportingDocsTemplate = new ByteArrayInputStream(fileText.getBytes(StandardCharsets.UTF_8)); + InputStream supportingDocsTemplateData = templateManager.merge(supportingDocsTemplate, supportingsDocsMap); + + StringWriter writer = new StringWriter(); + IOUtils.copy(supportingDocsTemplateData, writer, "UTF-8"); + logger.debug("DownLoadMasterDataServiceImpl::downloadSupportingDocsByLanguage()::exit"); + return new ByteArrayInputStream(utility.signPdf(new ByteArrayInputStream(writer.toString().getBytes()), null)); + } + + /** + * update the registration center details + */ + private void addRegistrationCenterDtls(int index, RegistrationCenterDto regCenterDto) + throws ResidentServiceCheckedException, Exception { + String workingHours = ""; + String fullAddress = getFullAddress(regCenterDto.getAddressLine1(), regCenterDto.getAddressLine2(), + regCenterDto.getAddressLine3()); + regCenterDto.setSerialNumber(index + 1); + regCenterDto.setFullAddress(fullAddress); + List workingDaysList = getRegCenterWorkingDays(regCenterDto.getId(), + regCenterDto.getLangCode()); + workingHours = workingDaysList.get(0).getName() + HYPHEN_DELIMITER + workingDaysList.get(1).getName() + PIPE_DELIMITER + + getTime(regCenterDto.getCenterStartTime()) + HYPHEN_DELIMITER + getTime(regCenterDto.getCenterEndTime()); + regCenterDto.setWorkingHours(workingHours); + } + + /** + * return the full address + * + * @param address1 + * @param address2 + * @param address3 + * @return + */ + private String getFullAddress(String address1, String address2, String address3) { + return Stream.of(address1, address2, address3) + .filter(StringUtils::isNotBlank) + .collect(Collectors.joining(env.getProperty("resident.attribute.separator.fullAddress", + UI_ATTRIBUTE_DATA_DELIMITER))); + } + + /** + * return the starting and ending working day details + * + * @param regCenterId + * @param langCode + * @return + * @throws ResidentServiceCheckedException + * @throws Exception + */ + private List getRegCenterWorkingDays(String regCenterId, String langCode) + throws ResidentServiceCheckedException, Exception { + logger.debug("DownLoadMasterDataServiceImpl::getRegCenterWorkingDays()::entry"); + ResponseWrapper responseWrapper; + responseWrapper = proxyMasterdataService.getRegistrationCenterWorkingDays(regCenterId, langCode); + WorkingDaysResponseDto workingDaysResponeDtls = mapper + .readValue(mapper.writeValueAsString(responseWrapper.getResponse()), WorkingDaysResponseDto.class); + List workingDaysList = workingDaysResponeDtls.getWorkingdays(); + + WorkingDaysDto startDay = workingDaysList.stream().min(Comparator.comparing(WorkingDaysDto::getOrder)) + .orElseThrow(NoSuchElementException::new); + + WorkingDaysDto endDay = workingDaysList.stream().max(Comparator.comparing(WorkingDaysDto::getOrder)) + .orElseThrow(NoSuchElementException::new); + + List workingDaysHoursList = new ArrayList<>(); + workingDaysHoursList.add(startDay); + workingDaysHoursList.add(endDay); + logger.debug("DownLoadMasterDataServiceImpl::getRegCenterWorkingDays()::exit"); + return workingDaysHoursList; + } + + /** + * get AM and PM details for given time + * + * @param time + * @return + */ + private String getTime(String time) { + logger.debug("DownLoadMasterDataServiceImpl::getTime()::entry"); + SimpleDateFormat sdf1 = new SimpleDateFormat("hh:mm:ss"); + SimpleDateFormat sdf2 = new SimpleDateFormat("hh.mm aa"); + Date date = new Date(); + try { + date = sdf1.parse(time); + } catch (ParseException e) { + logger.error("ParseException", ExceptionUtils.getStackTrace(e)); + logger.error("In getTime method of DownLoadMasterDataServiceImpl class", e.getMessage()); + } + logger.debug("DownLoadMasterDataServiceImpl::getTime()::exit"); + return sdf2.format(date); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownloadCardServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownloadCardServiceImpl.java new file mode 100644 index 00000000000..6d9da69ce6c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/DownloadCardServiceImpl.java @@ -0,0 +1,567 @@ +package io.mosip.resident.service.impl; + +import static io.mosip.resident.constant.EventStatusSuccess.CARD_DOWNLOADED; +import static io.mosip.resident.constant.ResidentConstants.SEMI_COLON; +import static io.mosip.resident.constant.TemplateVariablesConstants.VID; +import static io.mosip.resident.constant.TemplateVariablesConstants.VID_TYPE; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import io.mosip.resident.dto.IdentityDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.PacketStatus; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TransactionStage; +import io.mosip.resident.dto.CheckStatusResponseDTO; +import io.mosip.resident.dto.CredentialReqestDto; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidDownloadCardResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentCredentialServiceException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.DownloadCardService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to create service class implementation of download card api. + */ +@Service +public class DownloadCardServiceImpl implements DownloadCardService { + + private static final String LANGUAGE = "language"; + private static final String VALUE = "value"; + private static final String MASKED_VID = "maskedVid"; + private static final String EXPIRY_TIMESTAMP = "expiryTimestamp"; + private static final String GENERATED_ON_TIMESTAMP = "genratedOnTimestamp"; + private static final String TRANSACTION_LIMIT = "transactionLimit"; + private static final String TRANSACTION_COUNT = "transactionsLeftCount"; + private static final String CARD_FORMAT = "cardFormat"; + private static final Object VID_CARD = "vidCard"; + private static final String TEMPLATE_TYPE_CODE = "templateTypeCode"; + private static final String APPLICANT_PHOTO = "ApplicantPhoto"; + private static final Object NA = "NA"; + private static final String DATE_OF_BIRTH = "dob"; + + @Autowired + private Utilities utilities; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + private IdAuthService idAuthService; + + @Autowired + private Utility utility; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private NotificationService notificationService; + + @Autowired + private Environment environment; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private ResidentVidService vidService; + + @Autowired + private ResidentCredentialService residentCredentialService; + + private static final Logger logger = LoggerConfiguration.logConfig(DownloadCardServiceImpl.class); + + @Override + public Tuple2 getDownloadCardPDF( + MainRequestDTO downloadCardRequestDTOMainRequestDTO) + throws ResidentServiceCheckedException, OtpValidationFailedException { + logger.debug("DownloadCardServiceImpl::getDownloadCardPDF()::entry"); + String rid = ""; + String individualId = downloadCardRequestDTOMainRequestDTO.getRequest().getIndividualId(); + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + byte[] pdfBytes = new byte[0]; + IdentityDTO identityDTO = null; + try { + String transactionId = downloadCardRequestDTOMainRequestDTO.getRequest().getTransactionId(); + identityDTO = identityService.getIdentity(individualId); + Tuple2 individualIdAndType = identityService.getIdAndTypeForIndividualId(individualId); + Tuple2 tupleResponse = idAuthService.validateOtpV2(transactionId, individualIdAndType.getT1(), + downloadCardRequestDTOMainRequestDTO.getRequest().getOtp(), RequestType.GET_MY_ID); + residentTransactionEntity = tupleResponse.getT2(); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + if (tupleResponse.getT1()) { + rid = getRidForIndividualId(individualId); + pdfBytes = residentCredentialService.getCard(rid + utility.getRidDeliMeterValue(), null, null); + if (pdfBytes.length == 0) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment( + ResidentErrorCode.CARD_NOT_READY.getErrorMessage() + " - zero length"); + residentTransactionEntity + .setRequestSummary(RequestType.GET_MY_ID.name() + " - " + ResidentConstants.FAILED); + } else { + residentTransactionEntity.setStatusCode(CARD_DOWNLOADED.name()); + residentTransactionEntity.setStatusComment(CARD_DOWNLOADED.name()); + residentTransactionEntity + .setRequestSummary(RequestType.GET_MY_ID.name() + " - " + ResidentConstants.SUCCESS); + } + } else { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + throw new OtpValidationFailedException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + } + } + } catch (ResidentCredentialServiceException | ResidentServiceCheckedException | OtpValidationFailedException e) { + e.setMetadata(Map.of(ResidentConstants.EVENT_ID, eventId)); + throw e; + } catch (Exception e) { + throw new ResidentServiceException(ResidentErrorCode.CARD_NOT_READY.getErrorCode(), + ResidentErrorCode.CARD_NOT_READY.getErrorMessage(), e, Map.of(ResidentConstants.EVENT_ID, eventId)); + } finally { + if (residentTransactionEntity != null) { + /** + * Here we are setting RID in AID column. + */ + residentTransactionEntity.setAid(rid); + // if the status code will come as null, it will set it as failed. + if (residentTransactionEntity.getStatusCode() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment(ResidentErrorCode.CARD_NOT_READY.getErrorMessage()); + } + if (residentTransactionEntity.getRequestSummary() == null) { + residentTransactionEntity + .setRequestSummary(RequestType.GET_MY_ID.name() + " - " + ResidentConstants.FAILED); + } + updateResidentTransaction(individualId, residentTransactionEntity); + residentTransactionRepository.save(residentTransactionEntity); + + TemplateType templateType = (residentTransactionEntity.getStatusCode().equals(CARD_DOWNLOADED.name())) + ? TemplateType.SUCCESS + : TemplateType.FAILURE; + + sendNotificationV2(individualId, RequestType.GET_MY_ID, templateType, eventId, null, identityDTO); + } + } + logger.debug("DownloadCardServiceImpl::getDownloadCardPDF()::exit"); + return Tuples.of(pdfBytes, eventId); + } + + private void updateResidentTransaction(String individualId, ResidentTransactionEntity residentTransactionEntity) { + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setRefIdType(identityService.getIndividualIdType(individualId).name()); + residentTransactionEntity.setUpdBy(utility.getSessionUserName()); + residentTransactionEntity.setUpdDtimes(DateUtils.getUTCCurrentDateTime()); + } + + @Override + public Tuple2 downloadPersonalizedCard( + MainRequestDTO downloadPersonalizedCardMainRequestDTO, int timeZoneOffset, + String locale) throws ResidentServiceCheckedException { + logger.debug("DownloadCardServiceImpl::downloadPersonalizedCard()::entry"); + String encodeHtml = downloadPersonalizedCardMainRequestDTO.getRequest().getHtml(); + byte[] decodedData = new byte[0]; + String password = null; + String individualId = ""; + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + Tuple2, Map> identityAttribute = null; + try { + individualId = identityService.getResidentIndvidualIdFromSession(); + Map identityAttributes = getIdentityData(individualId); + residentTransactionEntity = createResidentTransactionEntity(individualId, + downloadPersonalizedCardMainRequestDTO.getRequest(), (String) identityAttributes.get(IdType.UIN.name())); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + decodedData = CryptoUtil.decodePlainBase64(encodeHtml); + identityAttribute = getAttributeList(identityAttributes); + List attributeValues = identityAttribute.getT1(); + if (Boolean.parseBoolean(this.environment.getProperty(ResidentConstants.IS_PASSWORD_FLAG_ENABLED))) { + password = utility.getPassword(attributeValues); + } + residentTransactionEntity.setRequestSummary( + RequestType.DOWNLOAD_PERSONALIZED_CARD.name() + " - " + ResidentConstants.SUCCESS); + residentTransactionEntity.setStatusCode(CARD_DOWNLOADED.name()); + residentTransactionEntity.setStatusComment(CARD_DOWNLOADED.name()); + } + } catch (Exception e) { + if (residentTransactionEntity != null) { + residentTransactionEntity.setRequestSummary( + RequestType.DOWNLOAD_PERSONALIZED_CARD.name() + " - " + ResidentConstants.FAILED); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity + .setStatusComment(ResidentErrorCode.DOWNLOAD_PERSONALIZED_CARD.getErrorMessage()); + } + logger.error("Unable to convert html to pdf RootCause- " + e); + throw new ResidentServiceException(ResidentErrorCode.DOWNLOAD_PERSONALIZED_CARD, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } finally { + if (residentTransactionEntity != null) { + // if the status code will come as null, it will set it as failed. + if (residentTransactionEntity.getStatusCode() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity + .setStatusComment(ResidentErrorCode.DOWNLOAD_PERSONALIZED_CARD.getErrorMessage()); + residentTransactionEntity.setRequestSummary( + RequestType.DOWNLOAD_PERSONALIZED_CARD.name() + " - " + ResidentConstants.FAILED); + } + residentTransactionRepository.save(residentTransactionEntity); + TemplateType templateType = (residentTransactionEntity.getStatusCode().equals(CARD_DOWNLOADED.name())) + ? TemplateType.SUCCESS + : TemplateType.FAILURE; + if(identityAttribute!=null) { + sendNotificationV2(individualId, RequestType.DOWNLOAD_PERSONALIZED_CARD, templateType, eventId, + null, identityAttribute.getT2()); + } else { + sendNotificationV2(individualId, RequestType.DOWNLOAD_PERSONALIZED_CARD, templateType, eventId, + null, null); + } + } + } + logger.debug("DownloadCardServiceImpl::downloadPersonalizedCard()::exit"); + return Tuples.of(utility.signPdf(new ByteArrayInputStream(decodedData), password), eventId); + } + + private Map getIdentityData(String individualId) { + Map identityAttributes = null; + try { + identityAttributes = (Map) identityService.getIdentity(individualId); + } catch (ResidentServiceCheckedException e) { + logger.error("Unable to get attributes- " + e); + throw new ResidentServiceException(ResidentErrorCode.DOWNLOAD_PERSONALIZED_CARD, e); + } + return identityAttributes; + } + + private ResidentTransactionEntity createResidentTransactionEntity(String individualId, + DownloadPersonalizedCardDto downloadPersonalizedCardDto, String uin) + throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility + .createEntity(RequestType.DOWNLOAD_PERSONALIZED_CARD); + String eventId = utility.createEventId(); + residentTransactionEntity.setEventId(eventId); + residentTransactionEntity.setAuthTypeCode(identityService.getResidentAuthenticationMode()); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setTokenId(identityService.getIDAToken(uin)); + if (downloadPersonalizedCardDto.getAttributes() != null) { + residentTransactionEntity.setAttributeList( + downloadPersonalizedCardDto.getAttributes().stream().collect(Collectors.joining(SEMI_COLON))); + } + return residentTransactionEntity; + } + + private Tuple2, Map> getAttributeList(Map identityAttributes) { + List attributeValues = new ArrayList<>(); + String attributeProperty = this.environment.getProperty(ResidentConstants.PASSWORD_ATTRIBUTE); + if (attributeProperty != null) { + List attributeList = List.of(attributeProperty.split("\\|")); + + for (String attribute : attributeList) { + Object attributeObject = identityAttributes.get(attribute); + if (attributeObject instanceof List) { + List> attributeMapObject = (List>) attributeObject; + for (Map attributeInLanguage : attributeMapObject) { + /** + * 1st language code is taken from mandatory/optional languages properties + */ + String languageCode = utilities.getLanguageCode(); + if (attributeInLanguage.containsKey(LANGUAGE) + && attributeInLanguage.get(LANGUAGE).toString().equalsIgnoreCase(languageCode)) { + attributeValues.add((String) attributeInLanguage.get(VALUE)); + } + } + } else { + attributeValues.add((String) attributeObject); + } + } + } + return Tuples.of(attributeValues, identityAttributes); + } + + @Override + public Tuple2, String> getVidCardEventId(String vid, int timeZoneOffset, + String locale) throws BaseCheckedException { + logger.debug("DownloadCardServiceImpl::getVidCardEventId()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + VidDownloadCardResponseDto vidDownloadCardResponseDto = new VidDownloadCardResponseDto(); + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + String uinForVid = ""; + IdentityDTO identityDTO = null; + try { + identityDTO = identityService.getIdentity(identityService.getResidentIndvidualIdFromSession()); + if(identityDTO!=null) { + uinForVid = utilities.getUinByVid(vid); + String uinForIndividualId = identityDTO.getUIN(); + residentTransactionEntity = insertDataForVidCard(vid, uinForIndividualId); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + + if (!uinForIndividualId.equals(uinForVid)) { + residentTransactionEntity.setRequestSummary(ResidentConstants.FAILED); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.VID_NOT_BELONG_TO_USER.getErrorMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_NOT_BELONG_TO_USER, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + } + } + RequestWrapper requestDto = new RequestWrapper<>(); + CredentialReqestDto credentialReqestDto = new CredentialReqestDto(); + credentialReqestDto.setId(vid); + credentialReqestDto + .setCredentialType(environment.getProperty(ResidentConstants.MOSIP_CREDENTIAL_TYPE_PROPERTY)); + credentialReqestDto.setIssuer(environment.getProperty(ResidentConstants.CREDENTIAL_ISSUER)); + credentialReqestDto.setEncrypt( + Boolean.parseBoolean(environment.getProperty(ResidentConstants.CREDENTIAL_ENCRYPTION_FLAG))); + credentialReqestDto.setEncryptionKey(environment.getProperty(ResidentConstants.CREDENTIAL_ENCRYPTION_KEY)); + Map additionalAttributes = getVidDetails(vid, identityDTO, timeZoneOffset, locale); + additionalAttributes.put(TEMPLATE_TYPE_CODE, + this.environment.getProperty(ResidentConstants.VID_CARD_TEMPLATE_PROPERTY)); + additionalAttributes.put(APPLICANT_PHOTO, + identityService.getAvailableclaimValue(environment.getProperty(ResidentConstants.IMAGE))); + credentialReqestDto.setAdditionalData(additionalAttributes); + requestDto.setId(this.environment.getProperty(ResidentConstants.CREDENTIAL_REQUEST_SERVICE_ID)); + requestDto.setRequest(credentialReqestDto); + requestDto.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + requestDto.setVersion(ResidentConstants.CREDENTIAL_REQUEST_SERVICE_VERSION); + ResponseWrapper responseDto = residentServiceRestClient.postApi( + environment.getProperty(ApiName.CREDENTIAL_REQ_URL.name()), MediaType.APPLICATION_JSON, requestDto, + ResponseWrapper.class); + if (responseDto.getErrors().size() == 0) { + ResidentCredentialResponseDto residentCredentialResponseDto = JsonUtil.readValue( + JsonUtil.writeValueAsString(responseDto.getResponse()), ResidentCredentialResponseDto.class); + residentTransactionEntity.setCredentialRequestId(residentCredentialResponseDto.getRequestId()); + vidDownloadCardResponseDto.setStatus(ResidentConstants.SUCCESS); + } else { + if (residentTransactionEntity != null) { + residentTransactionEntity.setRequestSummary(ResidentConstants.FAILED); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + } + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_REQUEST_CARD_FAILED, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + } catch (ApisResourceAccessException e) { + if (residentTransactionEntity != null) { + residentTransactionEntity.setRequestSummary(ResidentConstants.FAILED); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + } + throw new ApisResourceAccessException(ResidentErrorCode.VID_REQUEST_CARD_FAILED.toString(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } catch (IOException exception) { + if (residentTransactionEntity != null) { + residentTransactionEntity.setRequestSummary(ResidentConstants.FAILED); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + } + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), exception.getMessage(), + exception); + } finally { + if (residentTransactionEntity != null) { + // if the status code will come as null, it will set it as failed. + if (residentTransactionEntity.getStatusCode() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(ResidentConstants.FAILED); + } + residentTransactionRepository.save(residentTransactionEntity); + + TemplateType templateType = (residentTransactionEntity.getStatusCode() + .equals(EventStatusInProgress.NEW.name())) ? TemplateType.REQUEST_RECEIVED + : TemplateType.FAILURE; + + sendNotificationV2(identityDTO.getUIN(), RequestType.VID_CARD_DOWNLOAD, templateType, + eventId, null, identityDTO); + } + } + responseWrapper.setId(environment.getProperty(ResidentConstants.VID_DOWNLOAD_CARD_ID)); + responseWrapper.setVersion(environment.getProperty(ResidentConstants.VID_DOWNLOAD_CARD_VERSION)); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); + responseWrapper.setResponse(vidDownloadCardResponseDto); + logger.debug("DownloadCardServiceImpl::getVidCardEventId()::exit"); + return Tuples.of(responseWrapper, eventId); + } + + @Override + public ResponseWrapper getIndividualIdStatus(String individualId) + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + logger.debug("DownloadCardServiceImpl::getIndividualIdStatus()::entry"); + String rid = getRidForIndividualId(individualId); + Map packetStatusMap = utilities.getPacketStatus(rid); + try { + String transactionTypeCode = packetStatusMap.get(ResidentConstants.TRANSACTION_TYPE_CODE); + String aidStatus = packetStatusMap.get(ResidentConstants.AID_STATUS); + if (transactionTypeCode.equalsIgnoreCase(TransactionStage.CARD_READY_TO_DOWNLOAD.name()) + && aidStatus.equalsIgnoreCase(PacketStatus.SUCCESS.getName())) { + residentCredentialService.getDataShareUrl(rid + utility.getRidDeliMeterValue()); + } + } catch (ResidentCredentialServiceException e) { + logger.info("Since datashare URL is not available, marking the aid status as in-progress."); + packetStatusMap.put(ResidentConstants.AID_STATUS, PacketStatus.IN_PROGRESS.getName()); + } + logger.debug("DownloadCardServiceImpl::getIndividualIdStatus()::exit"); + return getCheckStatusResponse(packetStatusMap); + } + + private String getRidForIndividualId(String individualId) { + IdType idType = identityService.getIndividualIdType(individualId); + if (idType.equals(IdType.AID)) { + return individualId; + } else { + try { + return utilities.getRidByIndividualId(individualId); + } catch (ApisResourceAccessException e) { + throw new RuntimeException(e); + } + } + } + + private ResponseWrapper getCheckStatusResponse(Map packetStatusMap) { + ResponseWrapper checkStatusResponseDTOResponseWrapper = new ResponseWrapper<>(); + CheckStatusResponseDTO checkStatusResponseDTO = new CheckStatusResponseDTO(); + String aidStatus = packetStatusMap.get(ResidentConstants.AID_STATUS); + String transactionStage = packetStatusMap.get(ResidentConstants.TRANSACTION_TYPE_CODE); + checkStatusResponseDTO.setAidStatus(aidStatus); + checkStatusResponseDTO.setTransactionStage(transactionStage); + checkStatusResponseDTOResponseWrapper.setResponse(checkStatusResponseDTO); + checkStatusResponseDTOResponseWrapper + .setId(this.environment.getProperty(ResidentConstants.CHECK_STATUS_INDIVIDUAL_ID)); + checkStatusResponseDTOResponseWrapper + .setVersion(this.environment.getProperty(ResidentConstants.CHECKSTATUS_INDIVIDUALID_VERSION)); + checkStatusResponseDTOResponseWrapper + .setResponsetime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + return checkStatusResponseDTOResponseWrapper; + } + + private ResidentTransactionEntity insertDataForVidCard(String vid, String uin) + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.VID_CARD_DOWNLOAD); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setAuthTypeCode(identityService.getResidentAuthenticationMode()); + residentTransactionEntity.setRefId(utility.convertToMaskData(uin)); + residentTransactionEntity.setIndividualId(uin); + residentTransactionEntity.setTokenId(identityService.getIDAToken(uin)); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setStatusComment(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + /** + * Here we are setting vid in aid column. + */ + residentTransactionEntity.setAid(vid); + return residentTransactionEntity; + } + + private Map getVidDetails(String vid, IdentityDTO identityDTO, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + Map additionalAttributes = new HashMap<>(); + String name = null; + ResponseWrapper>> vidResponse = null; + String uin=null; + if(identityDTO!=null){ + uin = identityDTO.getUIN(); + name = identityDTO.getFullName(); + } + if (uin != null) { + vidResponse = vidService.retrieveVids(timeZoneOffset, locale, uin); + } + if (vidResponse != null) { + List> vidList = vidResponse.getResponse(); + if (vidList.size() > 0) { + for (Map vidData : vidList) { + if (vidData.get(VID).toString().equalsIgnoreCase(vid)) { + additionalAttributes.put(VID, vid); + additionalAttributes.put(VID_TYPE, vidData.get(VID_TYPE)); + additionalAttributes.put(MASKED_VID, vidData.get(MASKED_VID)); + additionalAttributes.put(EXPIRY_TIMESTAMP, + replaceNullValueWithNA(vidData.get(EXPIRY_TIMESTAMP))); + additionalAttributes.put(GENERATED_ON_TIMESTAMP, + replaceNullValueWithNA(vidData.get(GENERATED_ON_TIMESTAMP))); + additionalAttributes.put(TRANSACTION_LIMIT, + replaceNullValueWithNA(vidData.get(TRANSACTION_LIMIT))); + additionalAttributes.put(TRANSACTION_COUNT, + replaceNullValueWithNA(vidData.get(TRANSACTION_COUNT))); + additionalAttributes.put(CARD_FORMAT, VID_CARD); + if(identityDTO!=null) { + additionalAttributes.put(DATE_OF_BIRTH, identityDTO.getDateOfBirth()); + } + if (name != null) { + additionalAttributes.put(ResidentConstants.NAME, name); + } + break; + } + } + } + } + return additionalAttributes; + } + + private Object replaceNullValueWithNA(Object o) { + if (o == null) { + return NA; + } + return o; + } + + private void sendNotificationV2(String id, RequestType requestType, TemplateType templateType, String eventId, + Map additionalAttributes, Map identity) throws ResidentServiceCheckedException { + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(id); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + notificationRequestDtoV2.setAdditionalAttributes(additionalAttributes); + notificationService.sendNotification(notificationRequestDtoV2, identity); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/GrievanceServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/GrievanceServiceImpl.java new file mode 100644 index 00000000000..b3af88a5633 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/GrievanceServiceImpl.java @@ -0,0 +1,101 @@ +package io.mosip.resident.service.impl; + +import static io.mosip.resident.constant.RegistrationConstants.SUCCESS; + +import java.util.HashMap; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.entity.ResidentGrievanceEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.repository.ResidentGrievanceRepository; +import io.mosip.resident.service.GrievanceService; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to implement service class of grievance api. + */ +@Service +public class GrievanceServiceImpl implements GrievanceService { + + private static final String TICKET_ID = "ticketId"; + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private Environment environment; + + @Autowired + private ResidentGrievanceRepository residentGrievanceRepository; + + private static final Logger logger = LoggerConfiguration.logConfig(GrievanceServiceImpl.class); + + @Override + public ResponseWrapper getGrievanceTicket(MainRequestDTO grievanceRequestDTOMainRequestDTO) throws ApisResourceAccessException { + logger.debug("GrievanceServiceImpl::getGrievanceTicket()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setId(grievanceRequestDTOMainRequestDTO.getId()); + responseWrapper.setVersion(grievanceRequestDTOMainRequestDTO.getVersion()); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + try { + grievanceRequestDTOMainRequestDTO = fillDefaultValueFromProfile(grievanceRequestDTOMainRequestDTO); + String ticketId = UUID.randomUUID().toString(); + insertDataInGrievanceTable(ticketId, grievanceRequestDTOMainRequestDTO); + HashMap response = new HashMap<>(); + response.put(TICKET_ID, ticketId); + responseWrapper.setResponse(response); + } catch (ApisResourceAccessException e) { + logger.error("%s - %s", ResidentErrorCode.GRIEVANCE_TICKET_GENERATION_FAILED.getErrorMessage(), e.getMessage()); + throw new ApisResourceAccessException(ResidentErrorCode.GRIEVANCE_TICKET_GENERATION_FAILED.getErrorCode(), e); + } + logger.debug("GrievanceServiceImpl::getGrievanceTicket()::exit"); + return responseWrapper; + } + + private void insertDataInGrievanceTable(String ticketId, MainRequestDTO grievanceRequestDTOMainRequestDTO) { + ResidentGrievanceEntity residentGrievanceEntity = new ResidentGrievanceEntity(); + residentGrievanceEntity.setId(ticketId); + residentGrievanceEntity.setEventId(grievanceRequestDTOMainRequestDTO.getRequest().getEventId()); + residentGrievanceEntity.setName(grievanceRequestDTOMainRequestDTO.getRequest().getName()); + residentGrievanceEntity.setEmailId(grievanceRequestDTOMainRequestDTO.getRequest().getEmailId()); + residentGrievanceEntity.setAlternateEmailId(grievanceRequestDTOMainRequestDTO.getRequest().getAlternateEmailId()); + residentGrievanceEntity.setPhoneNo(grievanceRequestDTOMainRequestDTO.getRequest().getPhoneNo()); + residentGrievanceEntity.setAlternatePhoneNo(grievanceRequestDTOMainRequestDTO.getRequest().getAlternatePhoneNo()); + residentGrievanceEntity.setMessage(grievanceRequestDTOMainRequestDTO.getRequest().getMessage()); + residentGrievanceEntity.setStatus(SUCCESS); + residentGrievanceEntity.setCrBy(this.environment.getProperty(ResidentConstants.RESIDENT_APP_ID)); + residentGrievanceEntity.setCrDtimes(DateUtils.getUTCCurrentDateTime()); + residentGrievanceRepository.save(residentGrievanceEntity); + } + + private MainRequestDTO fillDefaultValueFromProfile(MainRequestDTO + grievanceRequestDTOMainRequestDTO) + throws ApisResourceAccessException { + if (grievanceRequestDTOMainRequestDTO.getRequest().getName() == null) { + grievanceRequestDTOMainRequestDTO.getRequest().setName(identityService.getAvailableclaimValue( + this.environment.getProperty(ResidentConstants.NAME_FROM_PROFILE))); + } + if(grievanceRequestDTOMainRequestDTO.getRequest().getPhoneNo() == null){ + grievanceRequestDTOMainRequestDTO.getRequest().setPhoneNo(identityService.getAvailableclaimValue( + this.environment.getProperty(ResidentConstants.PHONE_FROM_PROFILE) + )); + } + if(grievanceRequestDTOMainRequestDTO.getRequest().getEmailId() == null){ + grievanceRequestDTOMainRequestDTO.getRequest().setEmailId(identityService.getAvailableclaimValue( + this.environment.getProperty(ResidentConstants.EMAIL_FROM_PROFILE))); + } + return grievanceRequestDTOMainRequestDTO; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdAuthServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdAuthServiceImpl.java index 285df1fbfc2..82cbe4cdaa1 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdAuthServiceImpl.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdAuthServiceImpl.java @@ -1,372 +1,553 @@ -package io.mosip.resident.service.impl; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.StringReader; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.security.spec.InvalidKeySpecException; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.UUID; - -import javax.crypto.SecretKey; - -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.bouncycastle.util.io.pem.PemObject; -import org.bouncycastle.util.io.pem.PemReader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.CryptoUtil; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.kernel.core.util.HMACUtils2; -import io.mosip.kernel.core.util.JsonUtils; -import io.mosip.kernel.core.util.exception.JsonProcessingException; -import io.mosip.kernel.keygenerator.bouncycastle.KeyGenerator; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.AuthRequestDTO; -import io.mosip.resident.dto.AuthResponseDTO; -import io.mosip.resident.dto.AuthTxnDetailsDTO; -import io.mosip.resident.dto.AuthTypeDTO; -import io.mosip.resident.dto.AuthTypeStatus; -import io.mosip.resident.dto.AuthTypeStatusRequestDto; -import io.mosip.resident.dto.AuthTypeStatusResponseDto; -import io.mosip.resident.dto.AutnTxnDto; -import io.mosip.resident.dto.AutnTxnResponseDto; -import io.mosip.resident.dto.OtpAuthRequestDTO; -import io.mosip.resident.dto.PublicKeyResponseDto; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.CertificateException; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.util.ResidentServiceRestClient; - -@Component -public class IdAuthServiceImpl implements IdAuthService { - - private static final Logger logger = LoggerConfiguration.logConfig(IdAuthServiceImpl.class); - - @Value("${auth.internal.id}") - private String internalAuthId; - - @Value("${auth.internal.version}") - private String internalAuthVersion; - - @Value("${auth.type.status.id}") - private String authTypeStatusId; - - @Value("${mosipbox.public.url:null}") - private String domainUrl; - - @Value("${mosip.ida.env:Staging}") - private String idaEnv; - - @Autowired - ObjectMapper mapper; - - @Autowired - private KeyGenerator keyGenerator; - - @Autowired - private Environment environment; - - @Autowired - private ResidentServiceRestClient restClient; - - - @Autowired - private CryptoCoreSpec encryptor; - - private String thumbprint=null; - - @Override - public boolean validateOtp(String transactionID, String individualId, String otp) - throws OtpValidationFailedException { - AuthResponseDTO response = null; - try { - response = internelOtpAuth(transactionID, individualId, otp); - } catch (ApisResourceAccessException | InvalidKeySpecException | NoSuchAlgorithmException | IOException - | JsonProcessingException | java.security.cert.CertificateException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, - "IdAuthServiceImpl::validateOtp():: validate otp method call" + ExceptionUtils.getStackTrace(e)); - throw new OtpValidationFailedException(e.getMessage()); - } - if (response.getErrors() != null && !response.getErrors().isEmpty()) { - response.getErrors().stream().forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); - throw new OtpValidationFailedException( - response.getErrors().get(0).getErrorMessage()); - - } - - return response.getResponse().isAuthStatus(); - } - - public AuthResponseDTO internelOtpAuth(String transactionID, String individualId, - String otp) throws ApisResourceAccessException, InvalidKeySpecException, NoSuchAlgorithmException, - IOException, JsonProcessingException, CertificateEncodingException { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), individualId, - "IdAuthServiceImpl::internelOtpAuth()::entry"); - String dateTime = DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()); - AuthRequestDTO authRequestDTO = new AuthRequestDTO(); - authRequestDTO.setId(internalAuthId); - authRequestDTO.setVersion(internalAuthVersion); - - authRequestDTO.setRequestTime(dateTime); - authRequestDTO.setTransactionID(transactionID); - authRequestDTO.setEnv(idaEnv); - authRequestDTO.setDomainUri(domainUrl); - - AuthTypeDTO authType = new AuthTypeDTO(); - authType.setOtp(true); - authRequestDTO.setRequestedAuth(authType); - - authRequestDTO.setConsentObtained(true); - authRequestDTO.setIndividualId(individualId); - - OtpAuthRequestDTO request = new OtpAuthRequestDTO(); - request.setOtp(otp); - request.setTimestamp(dateTime); - - String identityBlock = mapper.writeValueAsString(request); - - final SecretKey secretKey = keyGenerator.getSymmetricKey(); - // Encrypted request with session key - byte[] encryptedIdentityBlock = encryptor.symmetricEncrypt(secretKey, identityBlock.getBytes(), null); - // rbase64 encoded for request - authRequestDTO.setRequest(CryptoUtil.encodeToURLSafeBase64(encryptedIdentityBlock)); - // encrypted with MOSIP public key and encoded session key - byte[] encryptedSessionKeyByte = encryptRSA(secretKey.getEncoded(), "INTERNAL"); - authRequestDTO.setRequestSessionKey(CryptoUtil.encodeToURLSafeBase64(encryptedSessionKeyByte)); - - // sha256 of the request block before encryption and the hash is encrypted - // using the requestSessionKey - byte[] byteArray = encryptor.symmetricEncrypt(secretKey, - HMACUtils2.digestAsPlainText(identityBlock.getBytes()).getBytes(), null); - authRequestDTO.setRequestHMAC(CryptoUtil.encodeToURLSafeBase64(byteArray)); - authRequestDTO.setThumbprint(thumbprint); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), individualId, - "internelOtpAuth()::INTERNALAUTH POST service call started with request data " - + JsonUtils.javaObjectToJsonString(authRequestDTO)); - - AuthResponseDTO response; - try { - response = (AuthResponseDTO) restClient.postApi(environment.getProperty(ApiName.INTERNALAUTH.name()), - MediaType.APPLICATION_JSON, authRequestDTO, AuthResponseDTO.class); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), individualId, - "IdAuthServiceImpl::internelOtpAuth()::INTERNALAUTH POST service call ended with response data " - + JsonUtils.javaObjectToJsonString(response)); - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, - "IdAuthServiceImp::internelOtpAuth():: INTERNALAUTH GET service call" - + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); - } - - return response; - - } - - private byte[] encryptRSA(final byte[] sessionKey, String refId) throws ApisResourceAccessException, - InvalidKeySpecException, java.security.NoSuchAlgorithmException, IOException, JsonProcessingException, CertificateEncodingException { - - // encrypt AES Session Key using RSA public key - ResponseWrapper responseWrapper = null; - PublicKeyResponseDto publicKeyResponsedto; - - String uri = environment.getProperty(ApiName.KERNELENCRYPTIONSERVICE.name()); - UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uri); - - builder.queryParam("applicationId", "IDA"); - builder.queryParam("referenceId", refId); - builder.queryParam("timeStamp", DateUtils.getUTCCurrentDateTimeString()); - - UriComponents uriComponent = builder.build(false).encode(); - - try { - responseWrapper = (ResponseWrapper) restClient.getApi(uriComponent.toUri(), ResponseWrapper.class); - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), refId, - "IdAuthServiceImp::lencryptRSA():: ENCRYPTIONSERVICE GET service call" - + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); - } - publicKeyResponsedto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), - PublicKeyResponseDto.class); - X509Certificate req509 = (X509Certificate) convertToCertificate(publicKeyResponsedto.getCertificate()); - thumbprint = CryptoUtil.encodeBase64(getCertificateThumbprint(req509)); - - PublicKey publicKey = req509.getPublicKey(); - return encryptor.asymmetricEncrypt(publicKey, sessionKey); - } - - @Override - public boolean authTypeStatusUpdate(String individualId, List authType, - io.mosip.resident.constant.AuthTypeStatus authTypeStatusConstant, Long unlockForSeconds) - throws ApisResourceAccessException { - boolean isAuthTypeStatusSuccess = false; - AuthTypeStatusRequestDto authTypeStatusRequestDto = new AuthTypeStatusRequestDto(); - authTypeStatusRequestDto.setConsentObtained(true); - authTypeStatusRequestDto.setId(authTypeStatusId); - authTypeStatusRequestDto.setIndividualId(individualId); - authTypeStatusRequestDto.setVersion(internalAuthVersion); - authTypeStatusRequestDto.setRequestTime(DateUtils.getUTCCurrentDateTimeString()); - List authTypes = new ArrayList<>(); - for (String type : authType) { - - String[] types = type.split("-"); - AuthTypeStatus authTypeStatus = new AuthTypeStatus(); - String requestId = UUID.randomUUID().toString(); - authTypeStatus.setRequestId(requestId); - if (types.length == 1) { - authTypeStatus.setAuthType(types[0]); - } else { - authTypeStatus.setAuthType(types[0]); - authTypeStatus.setAuthSubType(types[1]); - } - if (authTypeStatusConstant.equals(io.mosip.resident.constant.AuthTypeStatus.LOCK)) { - authTypeStatus.setLocked(true); - authTypeStatus.setUnlockForSeconds(null); - } else { - if (unlockForSeconds != null) { - authTypeStatus.setUnlockForSeconds(unlockForSeconds); - } - - authTypeStatus.setLocked(false); - } - - authTypes.add(authTypeStatus); - } - authTypeStatusRequestDto.setRequest(authTypes); - AuthTypeStatusResponseDto response; - ; - try { - response = restClient.postApi(environment.getProperty(ApiName.AUTHTYPESTATUSUPDATE.name()), - MediaType.APPLICATION_JSON, authTypeStatusRequestDto, AuthTypeStatusResponseDto.class); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), individualId, - "IdAuthServiceImp::authLock():: AUTHLOCK POST service call ended with response data " - + JsonUtils.javaObjectToJsonString(response)); - - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, - "IdAuthServiceImp::authLock():: AUTHLOCK POST service call" + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Could not able call auth status api", e); - } - - if (response.getErrors() != null && !response.getErrors().isEmpty()) { - response.getErrors().stream().forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); - - } else { - isAuthTypeStatusSuccess = true; - } - - return isAuthTypeStatusSuccess; - } - - @Override - public List getAuthHistoryDetails(String individualId, - String pageStart, String pageFetch) throws ApisResourceAccessException { - List details = null; - int count = 1; - AutnTxnResponseDto autnTxnResponseDto; - List pathsegments = new ArrayList<>(); - pathsegments.add(0, "individualId"); - pathsegments.add(1, individualId); - String queryParamName = null; - String queryParamValue = null; - if (pageStart != null && pageFetch != null && !pageStart.isEmpty() && !pageFetch.isEmpty()) { - queryParamName = "pageFetch,pageStart"; - queryParamValue = pageFetch + "," + pageStart; - count = count + Integer.parseInt(pageFetch) * ( Integer.parseInt(pageStart)- 1); - } - try { - autnTxnResponseDto = (AutnTxnResponseDto) restClient.getApi(ApiName.INTERNALAUTHTRANSACTIONS, pathsegments, - queryParamName, queryParamValue, AutnTxnResponseDto.class); - - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, - "IdAuthServiceImp::getAuthHistoryDetails():: AUTHTransactions GET service call" - + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Could not able call auth transactions api", e); - } - if (autnTxnResponseDto.getErrors() != null && !autnTxnResponseDto.getErrors().isEmpty()) { - autnTxnResponseDto.getErrors().stream() - .forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); - - } else if (autnTxnResponseDto.getResponse().get("authTransactions") != null) { - details = new ArrayList(); - if (!autnTxnResponseDto.getResponse().get("authTransactions").isEmpty()) { - for (AutnTxnDto autnTxnDto : autnTxnResponseDto.getResponse().get("authTransactions")) { - details.add(getDetails(autnTxnDto, count)); - count++; - } - } - } - return details; - } - - private AuthTxnDetailsDTO getDetails(AutnTxnDto autnTxnDto, int count) { - AuthTxnDetailsDTO authTxnDetailsDTO = new AuthTxnDetailsDTO(); - authTxnDetailsDTO.setSerialNumber(count); - authTxnDetailsDTO.setAuthModality(autnTxnDto.getAuthtypeCode()); - authTxnDetailsDTO.setAuthResponse(autnTxnDto.getStatusComment()); - authTxnDetailsDTO.setIdUsed(autnTxnDto.getReferenceIdType()); - authTxnDetailsDTO.setPartnerName(autnTxnDto.getEntityName()); - authTxnDetailsDTO.setPartnerTransactionId(autnTxnDto.getTransactionID()); - authTxnDetailsDTO.setResponseCode(autnTxnDto.getStatusCode()); - authTxnDetailsDTO.setDate(autnTxnDto.getRequestdatetime().format(DateTimeFormatter.ISO_LOCAL_DATE)); - authTxnDetailsDTO.setTime(autnTxnDto.getRequestdatetime().format(DateTimeFormatter.ISO_LOCAL_TIME)); - return authTxnDetailsDTO; - } - - private java.security.cert.Certificate convertToCertificate(String certData) { - try { - StringReader strReader = new StringReader(certData); - PemReader pemReader = new PemReader(strReader); - PemObject pemObject = pemReader.readPemObject(); - if (Objects.isNull(pemObject)) { - throw new CertificateException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), - ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage()); - } - byte[] certBytes = pemObject.getContent(); - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - return certFactory.generateCertificate(new ByteArrayInputStream(certBytes)); - } catch (IOException | java.security.cert.CertificateException e) { - throw new CertificateException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), - ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage(), e); - } - } - - private byte[] getCertificateThumbprint(java.security.cert.Certificate cert) - throws java.security.cert.CertificateEncodingException { - - return DigestUtils.sha256(cert.getEncoded()); - } -} - - +package io.mosip.resident.service.impl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.StringReader; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.spec.InvalidKeySpecException; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.crypto.SecretKey; + +import io.mosip.resident.dto.IdentityDTO; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.HMACUtils2; +import io.mosip.kernel.core.util.JsonUtils; +import io.mosip.kernel.core.util.exception.JsonProcessingException; +import io.mosip.kernel.keygenerator.bouncycastle.KeyGenerator; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.AuthRequestDTO; +import io.mosip.resident.dto.AuthResponseDTO; +import io.mosip.resident.dto.AuthTxnDetailsDTO; +import io.mosip.resident.dto.AuthTypeDTO; +import io.mosip.resident.dto.AuthTypeStatusRequestDto; +import io.mosip.resident.dto.AuthTypeStatusResponseDto; +import io.mosip.resident.dto.AutnTxnDto; +import io.mosip.resident.dto.AutnTxnResponseDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.OtpAuthRequestDTO; +import io.mosip.resident.dto.PublicKeyResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.CertificateException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +@Component +public class IdAuthServiceImpl implements IdAuthService { + + private static final Logger logger = LoggerConfiguration.logConfig(IdAuthServiceImpl.class); + + @Value("${auth.internal.id}") + private String internalAuthId; + + @Value("${auth.internal.version}") + private String internalAuthVersion; + + @Value("${auth.type.status.id}") + private String authTypeStatusId; + + @Value("${mosip.ida.domain-url:null}") + private String domainUrl; + + @Value("${mosip.ida.env:Staging}") + private String idaEnv; + + @Autowired + ObjectMapper mapper; + + @Autowired + private KeyGenerator keyGenerator; + + @Autowired + private Environment environment; + + @Autowired + private ResidentServiceRestClient restClient; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private CryptoCoreSpec encryptor; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private NotificationService notificationService; + + @Autowired + RequestValidator requestValidator; + + @Autowired + private Utility utility; + + @Override + public boolean validateOtp(String transactionId, String individualId, String otp) + throws OtpValidationFailedException, ResidentServiceCheckedException { + return validateOtpV1(transactionId, individualId, otp).getT1(); + } + + @Override + public Tuple2 validateOtpV1(String transactionId, String individualId, String otp) + throws OtpValidationFailedException, ResidentServiceCheckedException { + logger.debug("IdAuthServiceImpl::validateOtpV1()::entry"); + AuthResponseDTO response = null; + String eventId = ResidentConstants.NOT_AVAILABLE; + boolean authStatus = false; + try { + response = internelOtpAuth(transactionId, individualId, otp); + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + response.getErrors().stream().forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); + eventId = updateResidentTransactionAndSendNotification(transactionId, individualId, eventId, authStatus); + throw new OtpValidationFailedException(response.getErrors().get(0).getErrorMessage(), + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (response.getResponse() != null) { + authStatus = response.getResponse().isAuthStatus(); + eventId = updateResidentTransactionAndSendNotification(transactionId, individualId, eventId, authStatus); + } + } catch (ApisResourceAccessException | InvalidKeySpecException | NoSuchAlgorithmException | IOException + | JsonProcessingException | java.security.cert.CertificateException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImpl::validateOtp():: validate otp method call" + ExceptionUtils.getStackTrace(e)); + eventId = updateResidentTransactionAndSendNotification(transactionId, individualId, eventId, authStatus); + throw new OtpValidationFailedException(e.getMessage(), Map.of(ResidentConstants.EVENT_ID, eventId)); + } + logger.debug("IdAuthServiceImpl::validateOtpV1()::exit"); + return Tuples.of(authStatus, eventId); + } + + private String updateResidentTransactionAndSendNotification(String transactionId, String individualId, + String eventId, boolean authStatus) throws ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = null; + IdentityDTO identityDTO = identityService.getIdentity(individualId); + residentTransactionEntity = updateResidentTransaction(authStatus, transactionId, RequestType.VALIDATE_OTP, + identityService.getIDAToken(identityDTO.getUIN())); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + TemplateType templateType = authStatus == true ? TemplateType.SUCCESS : TemplateType.FAILURE; + sendNotificationV2(individualId, templateType, eventId, residentTransactionEntity.getAttributeList(), identityDTO); + } + return eventId; + } + + private void sendNotificationV2(String id, TemplateType templateType, String eventId, String channels, Map identity) + throws ResidentServiceCheckedException { + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(id); + notificationRequestDtoV2.setRequestType(RequestType.VALIDATE_OTP); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + notificationService.sendNotification(notificationRequestDtoV2, + (channels != null ? List.of(channels.split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)) : null), null, null, identity); + } + + @Override + public Tuple2 validateOtpV2(String transactionId, String individualId, String otp, + RequestType requestType) + throws OtpValidationFailedException, ResidentServiceCheckedException { + logger.debug("IdAuthServiceImpl::validateOtpV2()::entry"); + requestValidator.validateOtpCharLimit(otp); + AuthResponseDTO response = null; + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + String channels = null; + try { + response = internelOtpAuth(transactionId, individualId, otp); + residentTransactionEntity = updateResidentTransaction(response.getResponse().isAuthStatus(), transactionId, + requestType, identityService.getIDATokenForIndividualId(individualId)); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + channels = residentTransactionEntity.getAttributeList(); + } + } catch (ApisResourceAccessException | InvalidKeySpecException | NoSuchAlgorithmException | IOException + | JsonProcessingException | java.security.cert.CertificateException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImpl::validateOtp():: validate otp method call" + ExceptionUtils.getStackTrace(e)); + throw new OtpValidationFailedException(e.getMessage(), Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + response.getErrors().stream().forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); + if (response.getErrors().get(0).getErrorCode().equals(ResidentConstants.OTP_EXPIRED_ERR_CODE)) { + throw new OtpValidationFailedException(ResidentErrorCode.OTP_EXPIRED.getErrorCode(), + ResidentErrorCode.OTP_EXPIRED.getErrorMessage(), Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (response.getErrors().get(0).getErrorCode().equals(ResidentConstants.OTP_INVALID_ERR_CODE)) { + throw new OtpValidationFailedException(ResidentErrorCode.OTP_INVALID.getErrorCode(), + ResidentErrorCode.OTP_INVALID.getErrorMessage(), Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (response.getErrors().get(0).getErrorCode().equals(ResidentConstants.INVALID_ID_ERR_CODE)) { + throw new OtpValidationFailedException(ResidentErrorCode.INVALID_TRANSACTION_ID.getErrorCode(), + response.getErrors().get(0).getErrorMessage(), Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (response.getErrors().get(0).getErrorCode().equals(ResidentConstants.OTP_AUTH_LOCKED_ERR_CODE)) { + if (channels != null) { + if (channels.equals(ResidentConstants.PHONE)) { + throw new OtpValidationFailedException(ResidentErrorCode.SMS_AUTH_LOCKED.getErrorCode(), + ResidentErrorCode.SMS_AUTH_LOCKED.getErrorMessage(), + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + if (channels.equals(ResidentConstants.EMAIL)) { + throw new OtpValidationFailedException(ResidentErrorCode.EMAIL_AUTH_LOCKED.getErrorCode(), + ResidentErrorCode.EMAIL_AUTH_LOCKED.getErrorMessage(), + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + boolean containsPhone = channels.contains(ResidentConstants.PHONE); + boolean containsEmail = channels.contains(ResidentConstants.EMAIL); + if (containsPhone && containsEmail) { + throw new OtpValidationFailedException( + ResidentErrorCode.SMS_AND_EMAIL_AUTH_LOCKED.getErrorCode(), + ResidentErrorCode.SMS_AND_EMAIL_AUTH_LOCKED.getErrorMessage(), + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + } + } else + throw new OtpValidationFailedException(response.getErrors().get(0).getErrorMessage(), + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + logger.debug("IdAuthServiceImpl::validateOtpV2()::exit"); + return Tuples.of(response.getResponse().isAuthStatus(), residentTransactionEntity); + } + + private ResidentTransactionEntity updateResidentTransaction(boolean verified, String transactionId, RequestType requestType, String idaToken) { + ResidentTransactionEntity residentTransactionEntity = residentTransactionRepository. + findTopByRequestTrnIdAndTokenIdAndStatusCodeInOrderByCrDtimesDesc(transactionId, idaToken + , List.of(EventStatusInProgress.OTP_REQUESTED.name(), EventStatusFailure.OTP_VERIFICATION_FAILED.name())); + if (residentTransactionEntity != null ) { + residentTransactionEntity.setRequestTypeCode(requestType.name()); + residentTransactionEntity.setRequestSummary(verified? "OTP verified successfully": "OTP verification failed"); + residentTransactionEntity.setStatusCode(verified? EventStatusSuccess.OTP_VERIFIED.name(): EventStatusFailure.OTP_VERIFICATION_FAILED.name()); + residentTransactionEntity.setStatusComment(verified? "OTP verified successfully": "OTP verification failed"); + residentTransactionEntity.setUpdBy(utility.getSessionUserName()); + residentTransactionEntity.setUpdDtimes(DateUtils.getUTCCurrentDateTime()); + residentTransactionRepository.save(residentTransactionEntity); + } + return residentTransactionEntity; + } + + public AuthResponseDTO internelOtpAuth(String transactionId, String individualId, + String otp) throws ApisResourceAccessException, InvalidKeySpecException, NoSuchAlgorithmException, + IOException, JsonProcessingException, CertificateEncodingException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImpl::internelOtpAuth()::entry"); + String dateTime = DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()); + AuthRequestDTO authRequestDTO = new AuthRequestDTO(); + authRequestDTO.setId(internalAuthId); + authRequestDTO.setVersion(internalAuthVersion); + + authRequestDTO.setRequestTime(dateTime); + authRequestDTO.setTransactionID(transactionId); + authRequestDTO.setEnv(idaEnv); + authRequestDTO.setDomainUri(domainUrl); + + AuthTypeDTO authType = new AuthTypeDTO(); + authType.setOtp(true); + authRequestDTO.setRequestedAuth(authType); + + authRequestDTO.setConsentObtained(true); + authRequestDTO.setIndividualId(individualId); + + OtpAuthRequestDTO request = new OtpAuthRequestDTO(); + request.setOtp(otp); + request.setTimestamp(dateTime); + + String identityBlock = mapper.writeValueAsString(request); + + final SecretKey secretKey = keyGenerator.getSymmetricKey(); + // Encrypted request with session key + byte[] encryptedIdentityBlock = encryptor.symmetricEncrypt(secretKey, identityBlock.getBytes(), null); + // rbase64 encoded for request + authRequestDTO.setRequest(CryptoUtil.encodeToURLSafeBase64(encryptedIdentityBlock)); + // encrypted with MOSIP public key and encoded session key + Tuple2 encryptionResult = encryptRSA(secretKey.getEncoded(), "INTERNAL"); + byte[] encryptedSessionKeyByte = encryptionResult.getT1(); + authRequestDTO.setRequestSessionKey(CryptoUtil.encodeToURLSafeBase64(encryptedSessionKeyByte)); + + // sha256 of the request block before encryption and the hash is encrypted + // using the requestSessionKey + byte[] byteArray = encryptor.symmetricEncrypt(secretKey, + HMACUtils2.digestAsPlainText(identityBlock.getBytes()).getBytes(), null); + authRequestDTO.setRequestHMAC(CryptoUtil.encodeToURLSafeBase64(byteArray)); + String thumbprint = encryptionResult.getT2(); + authRequestDTO.setThumbprint(thumbprint); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "internelOtpAuth()::INTERNALAUTH POST service call started with request data " + + JsonUtils.javaObjectToJsonString(authRequestDTO)); + + AuthResponseDTO response; + try { + response = (AuthResponseDTO) restClient.postApi(environment.getProperty(ApiName.INTERNALAUTH.name()), + MediaType.APPLICATION_JSON, authRequestDTO, AuthResponseDTO.class); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImpl::internelOtpAuth()::INTERNALAUTH POST service call ended with response data " + + JsonUtils.javaObjectToJsonString(response)); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImp::internelOtpAuth():: INTERNALAUTH GET service call" + + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); + } + + return response; + + } + + private Tuple2 encryptRSA(final byte[] sessionKey, String refId) throws ApisResourceAccessException, + InvalidKeySpecException, NoSuchAlgorithmException, IOException, JsonProcessingException, CertificateEncodingException { + + // encrypt AES Session Key using RSA public key + ResponseWrapper responseWrapper = null; + PublicKeyResponseDto publicKeyResponsedto; + + String uri = environment.getProperty(ApiName.KERNELENCRYPTIONSERVICE.name()); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uri); + + builder.queryParam("applicationId", "IDA"); + builder.queryParam("referenceId", refId); + builder.queryParam("timeStamp", DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + + UriComponents uriComponent = builder.build(false).encode(); + + try { + responseWrapper = (ResponseWrapper) restClient.getApi(uriComponent.toUri(), ResponseWrapper.class); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), refId, + "IdAuthServiceImp::lencryptRSA():: ENCRYPTIONSERVICE GET service call" + + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); + } + publicKeyResponsedto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), + PublicKeyResponseDto.class); + X509Certificate req509 = (X509Certificate) convertToCertificate(publicKeyResponsedto.getCertificate()); + String thumbprint = CryptoUtil.encodeToURLSafeBase64(getCertificateThumbprint(req509)); + + PublicKey publicKey = req509.getPublicKey(); + if (thumbprint == null) { + thumbprint = ""; + } + byte[] asymmetricEncrypt = encryptor.asymmetricEncrypt(publicKey, sessionKey); + if(asymmetricEncrypt == null) { + asymmetricEncrypt = new byte[0]; + } + return Tuples.of(asymmetricEncrypt, thumbprint); + } + + @Override + public boolean authTypeStatusUpdate(String individualId, List authType, AuthTypeStatus authTypeStatus, Long unlockForSeconds) + throws ApisResourceAccessException{ + Map authTypeStatusMap=authType.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> authTypeStatus)); + Map unlockForSecondsMap=authType.stream().distinct().filter(str -> unlockForSeconds!=null).collect(Collectors.toMap(Function.identity(), str -> unlockForSeconds)); + String requestIdForAuthLockUnLock = authTypeStatusUpdate(individualId, authTypeStatusMap, unlockForSecondsMap); + return requestIdForAuthLockUnLock != null && !requestIdForAuthLockUnLock.isEmpty(); + } + + @Override + public String authTypeStatusUpdateForRequestId(String individualId, Map authTypeStatusMap, Map unlockForSecondsMap) throws ApisResourceAccessException { + String requestIdForAuthLockUnLock = authTypeStatusUpdate(individualId, authTypeStatusMap, unlockForSecondsMap); + if(requestIdForAuthLockUnLock != null){ + return requestIdForAuthLockUnLock; + } + return ""; + } + + @Override + public String authTypeStatusUpdate(String individualId, Map authTypeStatusMap, Map unlockForSecondsMap) + throws ApisResourceAccessException { + AuthTypeStatusRequestDto authTypeStatusRequestDto = new AuthTypeStatusRequestDto(); + authTypeStatusRequestDto.setConsentObtained(true); + authTypeStatusRequestDto.setId(authTypeStatusId); + authTypeStatusRequestDto.setIndividualId(individualId); + authTypeStatusRequestDto.setVersion(internalAuthVersion); + authTypeStatusRequestDto.setRequestTime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + List authTypes = new ArrayList<>(); + String requestIdForAuthLockUnLock = null; + for (Entry entry : authTypeStatusMap.entrySet()) { + + String[] types = entry.getKey().split("-"); + io.mosip.resident.dto.AuthTypeStatus authTypeStatus = new io.mosip.resident.dto.AuthTypeStatus(); + if(requestIdForAuthLockUnLock==null){ + String requestId = UUID.randomUUID().toString(); + requestIdForAuthLockUnLock = requestId; + } + authTypeStatus.setRequestId(requestIdForAuthLockUnLock); + if (types.length == 1) { + authTypeStatus.setAuthType(types[0]); + } else { + authTypeStatus.setAuthType(types[0]); + authTypeStatus.setAuthSubType(types[1]); + } + if (entry.getValue().equals(AuthTypeStatus.LOCK)) { + authTypeStatus.setLocked(true); + authTypeStatus.setUnlockForSeconds(null); + } else { + if (unlockForSecondsMap.get(entry.getKey()) != null) { + authTypeStatus.setUnlockForSeconds(unlockForSecondsMap.get(entry.getKey())); + } + + authTypeStatus.setLocked(false); + } + + authTypes.add(authTypeStatus); + } + authTypeStatusRequestDto.setRequest(authTypes); + AuthTypeStatusResponseDto response; + try { + response = restClient.postApi(environment.getProperty(ApiName.AUTHTYPESTATUSUPDATE.name()), + MediaType.APPLICATION_JSON, authTypeStatusRequestDto, AuthTypeStatusResponseDto.class); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImp::authLock():: AUTHLOCK POST service call ended with response data " + + JsonUtils.javaObjectToJsonString(response)); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImp::authLock():: AUTHLOCK POST service call" + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Could not able call auth status api", e); + } + + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + response.getErrors().stream().forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); + + } + + return requestIdForAuthLockUnLock; + } + + @Override + public List getAuthHistoryDetails(String individualId, + String pageStart, String pageFetch) throws ApisResourceAccessException { + List details = null; + int count = 1; + AutnTxnResponseDto autnTxnResponseDto; + List pathsegments = new ArrayList<>(); + pathsegments.add(0, "individualId"); + pathsegments.add(1, individualId); + String queryParamName = null; + String queryParamValue = null; + if (pageStart != null && pageFetch != null && !pageStart.isEmpty() && !pageFetch.isEmpty()) { + queryParamName = "pageFetch,pageStart"; + queryParamValue = pageFetch + "," + pageStart; + count = count + Integer.parseInt(pageFetch) * ( Integer.parseInt(pageStart)- 1); + } + try { + autnTxnResponseDto = (AutnTxnResponseDto) restClient.getApi(ApiName.INTERNALAUTHTRANSACTIONS, pathsegments, + queryParamName, queryParamValue, AutnTxnResponseDto.class); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), null, + "IdAuthServiceImp::getAuthHistoryDetails():: AUTHTransactions GET service call" + + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Could not able call auth transactions api", e); + } + if (autnTxnResponseDto.getErrors() != null && !autnTxnResponseDto.getErrors().isEmpty()) { + autnTxnResponseDto.getErrors().stream() + .forEach(error -> logger.error(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.USERID.toString(), error.getErrorCode(), error.getErrorMessage())); + + } else if (autnTxnResponseDto.getResponse().get("authTransactions") != null) { + details = new ArrayList(); + if (!autnTxnResponseDto.getResponse().get("authTransactions").isEmpty()) { + for (AutnTxnDto autnTxnDto : autnTxnResponseDto.getResponse().get("authTransactions")) { + details.add(getDetails(autnTxnDto, count)); + count++; + } + } + } + return details; + } + + private AuthTxnDetailsDTO getDetails(AutnTxnDto autnTxnDto, int count) { + AuthTxnDetailsDTO authTxnDetailsDTO = new AuthTxnDetailsDTO(); + authTxnDetailsDTO.setSerialNumber(count); + authTxnDetailsDTO.setAuthModality(autnTxnDto.getAuthtypeCode()); + authTxnDetailsDTO.setAuthResponse(autnTxnDto.getStatusComment()); + authTxnDetailsDTO.setIdUsed(autnTxnDto.getReferenceIdType()); + authTxnDetailsDTO.setPartnerName(autnTxnDto.getEntityName()); + authTxnDetailsDTO.setPartnerTransactionId(autnTxnDto.getTransactionID()); + authTxnDetailsDTO.setResponseCode(autnTxnDto.getStatusCode()); + authTxnDetailsDTO.setDate(autnTxnDto.getRequestdatetime().format(DateTimeFormatter.ISO_LOCAL_DATE)); + authTxnDetailsDTO.setTime(autnTxnDto.getRequestdatetime().format(DateTimeFormatter.ISO_LOCAL_TIME)); + return authTxnDetailsDTO; + } + + private java.security.cert.Certificate convertToCertificate(String certData) { + try { + StringReader strReader = new StringReader(certData); + PemReader pemReader = new PemReader(strReader); + PemObject pemObject = pemReader.readPemObject(); + if (Objects.isNull(pemObject)) { + throw new CertificateException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage()); + } + byte[] certBytes = pemObject.getContent(); + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + return certFactory.generateCertificate(new ByteArrayInputStream(certBytes)); + } catch (IOException | java.security.cert.CertificateException e) { + throw new CertificateException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage(), e); + } + } + + private byte[] getCertificateThumbprint(java.security.cert.Certificate cert) + throws CertificateEncodingException { + + return DigestUtils.sha256(cert.getEncoded()); + } +} + + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdentityServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdentityServiceImpl.java new file mode 100644 index 00000000000..be9a5e58579 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/IdentityServiceImpl.java @@ -0,0 +1,456 @@ +package io.mosip.resident.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.idrepository.core.util.TokenIDGenerator; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; +import io.mosip.resident.constant.RegistrationConstants; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.AbstractMap.SimpleEntry; +import java.util.ArrayList; +import java.util.Base64; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static io.mosip.resident.constant.ResidentConstants.IDENTITY; + +/** + * Resident identity service implementation class. + * + * @author Ritik Jain + */ +@Component +public class IdentityServiceImpl implements IdentityService { + + private static final String INDIVIDUAL_ID = "individual_id"; + private static final String EMAIL = "email"; + private static final String PHONE = "phone"; + private static final String DATE_OF_BIRTH = "dob"; + private static final String IMAGE = "mosip.resident.photo.token.claim-photo"; + private static final String PHOTO_ATTRIB_PROP = "mosip.resident.photo.attribute.name"; + private static final String PERPETUAL_VID = "perpetualVID"; + + @Autowired + private Utility utility; + + @Autowired + private TokenIDGenerator tokenIDGenerator; + + @Autowired + private ObjectMapper objectMapper; + + @Value("${ida.online-verification-partner-id}") + private String onlineVerificationPartnerId; + + @Autowired + private ResidentConfigService residentConfigService; + + @Autowired + private Environment env; + + @Autowired + private RequestValidator requestValidator; + + @Value("${resident.dateofbirth.pattern}") + private String dateFormat; + + @Autowired + private ResidentVidService residentVidService; + + @Value("${resident.flag.use-vid-only:false}") + private boolean useVidOnly; + + @Autowired + private Utilities utilities; + + private List nameValueList; + + private static final Logger logger = LoggerConfiguration.logConfig(IdentityServiceImpl.class); + + @Override + public IdentityDTO getIdentity(String id) throws ResidentServiceCheckedException{ + return getIdentity(id, false, null); + } + + @Override + public IdentityDTO getIdentity(String id, boolean fetchFace, String langCode) throws ResidentServiceCheckedException { + logger.debug("IdentityServiceImpl::getIdentity()::entry"); + IdentityDTO identityDTO = new IdentityDTO(); + try { + Map identity = getIdentityAttributes(id, null); + /** + * It is assumed that in the UI schema the UIN is added. + */ + identityDTO.setUIN(utility.getMappingValue(identity, IdType.UIN.name())); + identityDTO.setEmail(utility.getMappingValue(identity, EMAIL)); + identityDTO.setPhone(utility.getMappingValue(identity, PHONE)); + String dateOfBirth = utility.getMappingValue(identity, DATE_OF_BIRTH); + if(dateOfBirth != null && !dateOfBirth.isEmpty()) { + identityDTO.setDateOfBirth(dateOfBirth); + DateTimeFormatter formatter=DateTimeFormatter.ofPattern(dateFormat); + LocalDate localDate=LocalDate.parse(dateOfBirth, formatter); + identityDTO.setYearOfBirth(Integer.toString(localDate.getYear())); + } + identityDTO.setFullName(getFullName(identity, langCode)); + identityDTO.putAll((Map) identity.get(IDENTITY)); + + if(fetchFace) { + identity.put(env.getProperty(ResidentConstants.PHOTO_ATTRIBUTE_NAME), getClaimValue(env.getProperty(IMAGE))); + identity.remove("individualBiometrics"); + } + + } catch (IOException e) { + logger.error("Error occured in accessing identity data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing identity data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("IdentityServiceImpl::getIdentity()::exit"); + return identityDTO; + } + + public String getFullName(Map identity, String langCode) + throws ResidentServiceCheckedException, IOException { + if (nameValueList == null) { + nameValueList = utility.getNameValueFromIdentityMapping(); + } + return nameValueList.stream() + .map(nameString -> getValueFromIdentityMapping(nameString, identity, langCode)) + .collect(Collectors.joining(RegistrationConstants.SPACE)); + } + + + private String getValueFromIdentityMapping(String nameString, Map identity, String langCode) { + if (nameString == null || identity == null || langCode == null) { + return ""; // Return early if any input is null + } + + // Retrieve the identity value map + Map identityValueMap = (Map) identity.get(IDENTITY); + if (identityValueMap == null) { + return ""; // Return early if identity map is null + } + + // Retrieve the list of nameValueMap + List> nameValueMap = (List>) identityValueMap.get(nameString); + if (nameValueMap == null) { + return ""; // Return early if the nameValueMap is null + } + + // Use stream to find the matching language and return the corresponding value + return nameValueMap.stream() + .filter(nameMap -> langCode.equalsIgnoreCase((String) nameMap.get(ResidentConstants.LANGUAGE))) + .map(nameMap -> (String) nameMap.get(ResidentConstants.VALUE)) + .findFirst() // Get the first matching value + .orElse(""); // Return an empty string if no match is found + } + + + @Override + public Map getIdentityAttributes(String id, String schemaType) throws ResidentServiceCheckedException, IOException { + return getIdentityAttributes(id, schemaType, List.of( + Objects.requireNonNull(env.getProperty(ResidentConstants.ADDITIONAL_ATTRIBUTE_TO_FETCH)) + .split(ResidentConstants.COMMA))); + } + + @Override + public Map getIdentityAttributes(String id, String schemaType, + List additionalAttributes) throws ResidentServiceCheckedException { + logger.debug("IdentityServiceImpl::getIdentityAttributes()::entry"); + try { + IdResponseDTO1 idResponseDTO1; + if(Utility.isSecureSession()){ + idResponseDTO1 = (IdResponseDTO1)utility.getCachedIdentityData(id, getAccessToken(), IdResponseDTO1.class); + } else { + idResponseDTO1 = (IdResponseDTO1)utility.getIdentityData(id, IdResponseDTO1.class); + } + if(idResponseDTO1.getErrors() != null && idResponseDTO1.getErrors().size() > 0) { + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + idResponseDTO1.getErrors().get(0).getErrorCode() + " --> " + idResponseDTO1.getErrors().get(0).getMessage()); + } + Map identity = (Map) idResponseDTO1.getResponse().getIdentity(); + List finalFilter = new ArrayList<>(); + if(schemaType != null) { + List filterBySchema = residentConfigService.getUiSchemaFilteredInputAttributes(schemaType); + finalFilter.addAll(filterBySchema); + } + if(additionalAttributes != null && additionalAttributes.size()>0){ + finalFilter.addAll(additionalAttributes); + } + Map response = finalFilter.stream() + .peek(a -> { + if(a.equals(PERPETUAL_VID) || a.equals(ResidentConstants.MASK_PERPETUAL_VID) && !identity.containsKey(PERPETUAL_VID)) { + Optional perpVid= Optional.empty(); + try { + perpVid = residentVidService.getPerpatualVid((String) identity.get(IdType.UIN.name())); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + if(perpVid.isPresent()) { + String vid = perpVid.get(); + identity.put(PERPETUAL_VID, vid); + } + } + }) + .peek(a -> { + if(a.equals(env.getProperty(PHOTO_ATTRIB_PROP))) { + String photo; + try { + if (Utility.isSecureSession()) { + photo = this.getAvailableclaimValue(env.getProperty(IMAGE)); + } else { + photo = null; + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing picture from claims %s", e.getMessage()); + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + if(photo != null) { + identity.put(env.getProperty(PHOTO_ATTRIB_PROP), photo); + } + } + }) + .peek(attr -> { + if(attr.contains(ResidentConstants.MASK_PREFIX)) { + String attributeName = attr.replace(ResidentConstants.MASK_PREFIX, ""); + if(identity.containsKey(attributeName)) { + identity.put(attr, utility.convertToMaskData((String) identity.get(attributeName))); + } + } + }) + .filter(attrib -> identity.containsKey(attrib)) + .collect(Collectors.toMap(Function.identity(), identity::get,(m1, m2) -> m1, () -> new LinkedHashMap())); + response.put(IDENTITY, identity); + logger.debug("IdentityServiceImpl::getIdentityAttributes()::exit"); + return response; + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing identity data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + + @Override + public String getUinForIndividualId(String idvid) throws ResidentServiceCheckedException { + if(getIndividualIdType(idvid).equals(IdType.UIN)){ + return idvid; + } + return getIdentity(idvid).getUIN(); + } + + @Override + public String getIDATokenForIndividualId(String idvid) throws ResidentServiceCheckedException { + return getIDAToken(getUinForIndividualId(idvid)); + } + + public String getIDAToken(String uin) { + return getIDAToken(uin, onlineVerificationPartnerId); + } + + public String getIDAToken(String uin, String olvPartnerId) { + return tokenIDGenerator.generateTokenID(uin, olvPartnerId); + } + + public AuthUserDetails getAuthUserDetails() { + Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + if(principal instanceof AuthUserDetails) { + return (AuthUserDetails) principal; + } + return null; + } + + public Map getClaims(String... claims) throws ApisResourceAccessException { + return getClaims(Set.of(claims)); + } + + private Map getClaims(Set claims) throws ApisResourceAccessException { + String accessToken = getAccessToken(); + if (!Objects.equals(accessToken, "")) { + return getClaimsFromToken(claims, accessToken); + } + return Map.of(); + } + + public String getAccessToken(){ + AuthUserDetails authUserDetails = getAuthUserDetails(); + if(authUserDetails != null){ + return authUserDetails.getToken(); + } + return ""; + } + + private Map getClaimsFromToken(Set claims, String token) throws ApisResourceAccessException { + Map userInfo = utility.getUserInfo(token); + return claims.stream().map(claim -> new SimpleEntry<>(claim, getClaimFromUserInfo(userInfo, claim))) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + } + + private String getClaimFromUserInfo(Map userInfo, String claim) { + Object claimValue = userInfo.get(claim); + if(claimValue == null) { + throw new ResidentServiceException(ResidentErrorCode.CLAIM_NOT_AVAILABLE, claim); + } + return String.valueOf(claimValue); + } + + public String getResidentIndvidualIdFromSession() throws ApisResourceAccessException { + return getClaimValue(INDIVIDUAL_ID); + } + + public String getClaimValue(String claim) throws ApisResourceAccessException { + return getClaims(claim).get(claim); + } + public String getAvailableclaimValue(String claim) throws ApisResourceAccessException { + logger.debug("IdentityServiceImpl::getAvailableclaimValue()::entry"); + String claimValue; + try { + claimValue = getClaims(claim).get(claim); + } catch (ResidentServiceException e) { + logger.error(e.getMessage()); + claimValue = null; + } + logger.debug("IdentityServiceImpl::getAvailableclaimValue()::exit"); + return claimValue; + } + + public String getResidentIdaToken() throws ApisResourceAccessException, ResidentServiceCheckedException { + return getIDATokenForIndividualId(getResidentIndvidualIdFromSession()); + } + + public String getResidentIdaTokenFromAccessToken(String accessToken) throws ApisResourceAccessException, ResidentServiceCheckedException { + String claimName = env.getProperty(ResidentConstants.INDIVIDUALID_CLAIM_NAME); + Map claims = getClaimsFromToken(Set.of(claimName), accessToken); + String individualId = (String) claims.get(claimName); + return getIDATokenForIndividualId(individualId); + } + + public String createSessionId(){ + return utility.createEventId(); + } + + /** + * @param individualId - it can be UIN, VID or AID. + * @return UIN or VID based on the flag "useVidOnly" + */ + public Tuple2 getIdAndTypeForIndividualId(String individualId) + throws ResidentServiceCheckedException, ApisResourceAccessException { + String id; + IdType idType = getIndividualIdType(individualId); + if(idType.equals(IdType.AID)) { + IdentityDTO identity = getIdentity(individualId); + String uin = identity.getUIN(); + if(useVidOnly) { + Optional perpVid = residentVidService.getPerpatualVid(uin); + if(perpVid.isPresent()) { + id = perpVid.get(); + idType = IdType.VID; + } else { + throw new ResidentServiceCheckedException(ResidentErrorCode.PERPETUAL_VID_NOT_AVALIABLE); + } + } else { + id = uin; + idType = IdType.UIN; + } + } else { + id = individualId; + } + return Tuples.of(id, idType); + } + + public String getResidentAuthenticationMode() throws ResidentServiceCheckedException { + String authenticationMode = getClaimFromIdToken( + this.env.getProperty(ResidentConstants.AUTHENTICATION_MODE_CLAIM_NAME)); + String authTypeCode = utility.getAuthTypeCodefromkey(authenticationMode); + if(authTypeCode == null) { + logger.warn("Mapping is missing for %s in AMR to ACR mapping file", authenticationMode); + return authenticationMode; + } + return authTypeCode; + } + + public String getClaimFromIdToken(String claim) { + AuthUserDetails authUserDetails= getAuthUserDetails(); + String idToken = authUserDetails.getIdToken(); + return getClaimValueFromJwtToken(idToken, claim); + } + + public String getClaimValueFromJwtToken(String jwtToken, String claim) { + String claimValue = ""; + String payLoad = ""; + if(jwtToken!=null){ + if(jwtToken.contains(".")){ + String[] parts = jwtToken.split("\\.", 0); + payLoad = decodeString(parts[1]); + } else{ + payLoad = decodeString(jwtToken); + } + Map payLoadMap; + try { + payLoadMap = objectMapper.readValue(payLoad, Map.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + if(claim!=null){ + claimValue = (String) payLoadMap.get(claim); + } + } + return claimValue; + } + + public String decodeString(String payload) + { + byte[] bytes = Base64.getUrlDecoder().decode(payload); + return new String(bytes, StandardCharsets.UTF_8); + } + + public IdType getIndividualIdType(String individualId){ + if(requestValidator.validateUin(individualId)){ + return IdType.UIN; + } else if(requestValidator.validateVid(individualId)){ + return IdType.VID; + } else { + return IdType.AID; + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OrderCardServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OrderCardServiceImpl.java new file mode 100644 index 00000000000..aea79914c59 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OrderCardServiceImpl.java @@ -0,0 +1,348 @@ +package io.mosip.resident.service.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ConsentStatusType; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.UrlRedirectRequestDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.OrderCardService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + +/** + * Order card service implementation class. + * + * @author Ritik Jain + */ +@Component +public class OrderCardServiceImpl implements OrderCardService { + + @Autowired + private ResidentCredentialService residentCredentialService; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + @Qualifier("restClientWithSelfTOkenRestTemplate") + private ResidentServiceRestClient restClientWithSelfTOkenRestTemplate; + + @Autowired + private Utility utility; + + @Autowired + NotificationService notificationService; + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Value("${mosip.resident.order.card.payment.enabled}") + private boolean isPaymentEnabled; + + @Autowired + Environment env; + + private static final Logger logger = LoggerConfiguration.logConfig(OrderCardServiceImpl.class); + + @SuppressWarnings("unlikely-arg-type") + @Override + public ResidentCredentialResponseDto sendPhysicalCard(ResidentCredentialRequestDto requestDto) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("OrderCardServiceImpl::sendPhysicalCard()::entry"); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + ResidentTransactionEntity residentTransactionEntity = createResidentTransactionEntity(requestDto, individualId); + if (requestDto.getConsent() == null || requestDto.getConsent().trim().isEmpty() + || !requestDto.getConsent().equalsIgnoreCase(ConsentStatusType.ACCEPTED.name())) { + checkConsent(requestDto.getConsent(), residentTransactionEntity); + } else { + + if (isPaymentEnabled) { + checkOrderStatus(requestDto.getTransactionID(), individualId, residentTransactionEntity); + } + residentCredentialResponseDto = residentCredentialService.reqCredential(requestDto, individualId); + updateResidentTransaction(residentTransactionEntity, residentCredentialResponseDto); + sendNotificationV2(individualId, RequestType.ORDER_PHYSICAL_CARD, + TemplateType.REQUEST_RECEIVED, residentTransactionEntity.getEventId(), null); + logger.debug("OrderCardServiceImpl::sendPhysicalCard()::exit"); + + } + + return residentCredentialResponseDto; + } + + private void checkConsent(String consent, ResidentTransactionEntity residentTransactionEntity) + throws ResidentServiceCheckedException { + try { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + throw new ResidentServiceCheckedException(ResidentErrorCode.CONSENT_DENIED.getErrorCode(), + ResidentErrorCode.CONSENT_DENIED.getErrorMessage()); + } catch (Exception e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.CONSENT_DENIED.getErrorCode(), + ResidentErrorCode.CONSENT_DENIED.getErrorMessage()); + } finally { + residentTransactionRepository.save(residentTransactionEntity); + } + + } + + private ResidentTransactionEntity createResidentTransactionEntity(ResidentCredentialRequestDto requestDto, String individualId) + throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.ORDER_PHYSICAL_CARD); + residentTransactionEntity.setEventId(utility.createEventId()); + String attributeList = requestDto.getSharableAttributes().stream().collect(Collectors.joining(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)); + residentTransactionEntity.setAttributeList(attributeList); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setRequestedEntityId(requestDto.getIssuer()); + Map partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType( + requestDto.getIssuer(), env.getProperty(ResidentConstants.RESIDENT_ORDER_PHYSICAL_CARD_PARTNER_TYPE, + ResidentConstants.PRINT_PARTNER)); + residentTransactionEntity.setRequestedEntityName((String) partnerDetail.get(ResidentConstants.ORGANIZATION_NAME)); + residentTransactionEntity.setRequestedEntityType((String) partnerDetail.get(ResidentConstants.PARTNER_TYPE)); + residentTransactionEntity.setTokenId(identityServiceImpl.getResidentIdaToken()); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setConsent(requestDto.getConsent()); + // TODO: need to fix transaction ID (need partner's end transactionId) + residentTransactionEntity.setRequestTrnId(requestDto.getTransactionID()); + return residentTransactionEntity; + } + + private void updateResidentTransaction(ResidentTransactionEntity residentTransEntity, + ResidentCredentialResponseDto residentCredentialResponseDto) { + residentTransEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransEntity.setStatusComment(EventStatusInProgress.NEW.name()); + residentTransEntity.setAid(residentCredentialResponseDto.getRequestId()); + residentTransEntity.setCredentialRequestId(residentCredentialResponseDto.getRequestId()); + residentTransactionRepository.save(residentTransEntity); + } + + private void checkOrderStatus(String transactionId, String individualId, + ResidentTransactionEntity residentTransactionEntity) throws ResidentServiceCheckedException { + checkOrderStatus(transactionId,individualId,null,residentTransactionEntity,null,null,null); + } + + private String checkOrderStatus(String transactionId, String individualId, String redirectUrl, + ResidentTransactionEntity residentTransactionEntity, String errorCode, String errorMessage, + String address) throws ResidentServiceCheckedException { + logger.debug("OrderCardServiceImpl::checkOrderStatus()::entry"); + String url; + String newUrl = null; + if(redirectUrl != null) { + url = new String(Base64.decodeBase64(redirectUrl.getBytes())); + newUrl = url.contains("?") ? url + "&" : url + "?"; + } + StringBuilder builder = new StringBuilder(); + Map queryParams = new HashMap<>(); + String orderRedirectURL = null; + List pathsegments = null; + List queryParamName = new ArrayList(); + queryParamName.add("transactionId"); + queryParamName.add("individualId"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(transactionId); + queryParamValue.add(individualId); + + try { + if (errorCode != null && !errorCode.isEmpty()) { + queryParams.put("error_code", errorCode); + queryParams.put("error_message", errorMessage); + for (Map.Entry entry : queryParams.entrySet()) { + String keyValueParam = entry.getKey() + "=" + entry.getValue(); + if (!builder.toString().isEmpty()) { + builder.append("&"); + } + builder.append(keyValueParam); + orderRedirectURL = newUrl + builder.toString(); + residentTransactionEntity.setStatusCode(EventStatusFailure.PAYMENT_FAILED.name()); + } + } else { + ResponseWrapper responseWrapper = (ResponseWrapper) restClientWithSelfTOkenRestTemplate.getApi( + ApiName.GET_ORDER_STATUS_URL, pathsegments, queryParamName, queryParamValue, + ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + residentTransactionEntity.setStatusCode(responseWrapper.getErrors().get(0).getErrorCode() + "->" + + responseWrapper.getErrors().get(0).getMessage()); + queryParams.put("paymentTransactionId", transactionId); + queryParams.put("error_code", responseWrapper.getErrors().get(0).getErrorCode()); + queryParams.put("error_message", responseWrapper.getErrors().get(0).getMessage()); + for (Map.Entry entry : queryParams.entrySet()) { + String keyValueParam = entry.getKey() + "=" + entry.getValue(); + if (!builder.toString().isEmpty()) { + builder.append("&"); + } + builder.append(keyValueParam); + orderRedirectURL = newUrl + builder.toString(); + residentTransactionEntity.setStatusCode(EventStatusFailure.PAYMENT_FAILED.name()); + } + } else { + UrlRedirectRequestDTO responseDto = new UrlRedirectRequestDTO(); + responseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(responseWrapper.getResponse()), + UrlRedirectRequestDTO.class); + queryParams.put("trackingId", responseDto.getTrackingId()); + queryParams.put("paymentTransactionId", responseDto.getTransactionId()); + queryParams.put("residentFullAddress", address); + queryParams.put("eventId", residentTransactionEntity.getEventId()); + for (Map.Entry entry : queryParams.entrySet()) { + String keyValueParam = entry.getKey() + "=" + entry.getValue(); + if (!builder.toString().isEmpty()) { + builder.append("&"); + } + builder.append(keyValueParam); + orderRedirectURL = newUrl + builder.toString(); + } + residentTransactionEntity.setStatusCode(EventStatusInProgress.PAYMENT_CONFIRMED.name()); + } + } + } catch (ApisResourceAccessException e) { + residentTransactionEntity.setStatusCode(EventStatusFailure.PAYMENT_FAILED.name()); + logger.error("Error occured in checking order status %s", e.getMessage()); + sendNotificationV2(individualId, RequestType.ORDER_PHYSICAL_CARD, TemplateType.FAILURE, + residentTransactionEntity.getEventId(), null); + throw new ResidentServiceCheckedException(ResidentErrorCode.PAYMENT_REQUIRED.getErrorCode(), + ResidentErrorCode.PAYMENT_REQUIRED.getErrorMessage()); + } catch (IOException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } finally { + residentTransactionRepository.save(residentTransactionEntity); + } + logger.debug("OrderCardServiceImpl::checkOrderStatus()::exit"); + return orderRedirectURL; + + } + + private NotificationResponseDTO sendNotificationV2(String id, RequestType requestType, TemplateType templateType, + String eventId, Map additionalAttributes) throws ResidentServiceCheckedException { + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(id); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + notificationRequestDtoV2.setAdditionalAttributes(additionalAttributes); + return notificationService.sendNotification(notificationRequestDtoV2, null); + } + + @Override + public String getRedirectUrl(String partnerId, String individualId) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("OrderCardServiceImpl::getRedirectUrl()::entry"); + Map partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType( + partnerId, env.getProperty(ResidentConstants.RESIDENT_ORDER_PHYSICAL_CARD_PARTNER_TYPE, + ResidentConstants.PRINT_PARTNER)); + + ResidentTransactionEntity residentTransactionEntity = createResidentTransactionEntityOrderCard(partnerId, + individualId); + if (partnerDetail.isEmpty()) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionRepository.save(residentTransactionEntity); + throw new ResidentServiceCheckedException(ResidentErrorCode.PATNER_NOT_FOUND.getErrorCode(), + ResidentErrorCode.PATNER_NOT_FOUND.getErrorMessage()); + } else { + List> info = (List>) partnerDetail.get("additionalInfo"); + String redirectUrl = info.stream().map(map -> (String) map.get("orderRedirectUrl")).findAny().orElse(""); + if (redirectUrl.isEmpty()) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionRepository.save(residentTransactionEntity); + + throw new ResidentServiceCheckedException(ResidentErrorCode.REDIRECT_URL_NOT_FOUND.getErrorCode(), + ResidentErrorCode.REDIRECT_URL_NOT_FOUND.getErrorMessage()); + } + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setStatusComment(EventStatusInProgress.NEW.name()); + residentTransactionRepository.save(residentTransactionEntity); + String newUrl = redirectUrl.contains("?") ? redirectUrl + "&" : redirectUrl + "?"; + StringBuilder builder = new StringBuilder(); + Map queryParams = new HashMap<>(); + queryParams.put(TemplateVariablesConstants.EVENT_ID, residentTransactionEntity.getEventId()); + for (Map.Entry entry : queryParams.entrySet()) { + String keyValueParam = entry.getKey() + "=" + entry.getValue(); + if (!builder.toString().isEmpty()) { + builder.append("&"); + } + builder.append(keyValueParam); + } + logger.debug("OrderCardServiceImpl::getRedirectUrl()::exit"); + return newUrl + builder.toString(); + } + } + + private ResidentTransactionEntity createResidentTransactionEntityOrderCard(String partnerId, String individualId) throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.ORDER_PHYSICAL_CARD); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setRequestedEntityId(partnerId); + Map partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType( + partnerId, env.getProperty(ResidentConstants.RESIDENT_ORDER_PHYSICAL_CARD_PARTNER_TYPE, + ResidentConstants.PRINT_PARTNER)); + residentTransactionEntity.setRequestedEntityName((String) partnerDetail.get(ResidentConstants.ORGANIZATION_NAME)); + residentTransactionEntity.setRequestedEntityType((String) partnerDetail.get(ResidentConstants.PARTNER_TYPE)); + residentTransactionEntity.setTokenId(identityServiceImpl.getResidentIdaToken()); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + return residentTransactionEntity; + } + + @Override + public String physicalCardOrder(String redirectUrl, String paymentTransactionId, String eventId, + String residentFullAddress, String individualId, String errorCode, String errorMessage) + throws ResidentServiceCheckedException { + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + Optional residentTransactionEntity = residentTransactionRepository.findById(eventId); + String reponse = null; + ResidentCredentialRequestDto requestDto = new ResidentCredentialRequestDto(); + if (residentTransactionEntity.isPresent()) { + requestDto.setIssuer(residentTransactionEntity.get().getRequestedEntityId()); + if (isPaymentEnabled) { + reponse = checkOrderStatus(paymentTransactionId, individualId, redirectUrl, residentTransactionEntity.get(), + errorCode, errorMessage, residentFullAddress); + } + residentCredentialResponseDto = residentCredentialService.reqCredential(requestDto, individualId); + updateResidentTransaction(residentTransactionEntity.get(), residentCredentialResponseDto); + } + return reponse; + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OtpManagerServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OtpManagerServiceImpl.java new file mode 100644 index 00000000000..000dd8d9c7e --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/OtpManagerServiceImpl.java @@ -0,0 +1,251 @@ +package io.mosip.resident.service.impl; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.HMACUtils; +import io.mosip.preregistration.application.constant.PreRegLoginConstant; +import io.mosip.preregistration.application.constant.PreRegLoginErrorConstants; +import io.mosip.preregistration.application.dto.OTPGenerateRequestDTO; +import io.mosip.preregistration.application.dto.RequestDTO; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.ResidentDemographicUpdateRequestDTO; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.entity.OtpTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.OtpTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.OtpManager; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.validator.RequestValidator; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; + +import javax.xml.bind.DatatypeConverter; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to generate otp and validate otp. + */ +@Service +public class OtpManagerServiceImpl implements OtpManager { + + private static final Logger logger = LoggerConfiguration.logConfig(OtpManagerServiceImpl.class); + private static final String OTP_EXPIRED = "OTP_EXPIRED"; + private static final String ACCEPTED = "accepted"; + private static final String PHONE = "phone"; + private static final String EMAIL = "email"; + + @Autowired + private OtpTransactionRepository otpRepo; + + @Autowired + private Environment environment; + + @Autowired + @Qualifier("selfTokenRestTemplate") + RestTemplate restTemplate; + + @Autowired + private NotificationService notificationService; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private ResidentService residentService; + + @Autowired + private TemplateUtil templateUtil; + + @Autowired + private RequestValidator requestValidator; + @Autowired + private Utilities utilities; + + + @Override + public boolean sendOtp(MainRequestDTO requestDTO, String channelType, String language, IdentityDTO identityDTO) throws IOException, ResidentServiceCheckedException, ApisResourceAccessException { + logger.info("sessionId", "idType", "id", "In sendOtp method of otpmanager service "); + String userId = requestDTO.getRequest().getUserId(); + NotificationRequestDto notificationRequestDto = new NotificationRequestDtoV2(); + notificationRequestDto.setId(identityService.getResidentIndvidualIdFromSession()); + String refId = this.hash(userId+requestDTO.getRequest().getTransactionId()); + if (this.otpRepo.checkotpsent(refId, "active", DateUtils.getUTCCurrentDateTime(), DateUtils.getUTCCurrentDateTime() + .minusMinutes(Objects.requireNonNull(this.environment.getProperty("otp.request.flooding.duration", Long.class)))) > + Objects.requireNonNull(this.environment.getProperty("otp.request.flooding.max-count", Integer.class))) { + logger.error("sessionId", this.getClass().getSimpleName(), ResidentErrorCode.OTP_REQUEST_FLOODED.getErrorCode(), "OTP_REQUEST_FLOODED"); + throw new ResidentServiceCheckedException(ResidentErrorCode.OTP_REQUEST_FLOODED.getErrorCode(), ResidentErrorCode.OTP_REQUEST_FLOODED.getErrorMessage()); + } else { + String otp = this.generateOTP(requestDTO); + logger.info("sessionId", "idType", "id", "In generateOTP method of otpmanager service OTP generated"); + String otpHash = digestAsPlainText((userId + this.environment.getProperty("mosip.kernel.data-key-splitter") + otp+ + requestDTO.getRequest().getTransactionId()).getBytes()); + OtpTransactionEntity otpTxn; + otpTxn = new OtpTransactionEntity(); + otpTxn.setId(UUID.randomUUID().toString()); + otpTxn.setRefId(this.hash(userId + requestDTO.getRequest().getTransactionId())); + otpTxn.setOtpHash(otpHash); + otpTxn.setCrBy(this.environment.getProperty("resident.clientId")); + otpTxn.setCrDtimes(DateUtils.getUTCCurrentDateTime()); + otpTxn.setGeneratedDtimes(DateUtils.getUTCCurrentDateTime()); + otpTxn.setExpiryDtimes(DateUtils.getUTCCurrentDateTime().plusSeconds((Long) + this.environment.getProperty("mosip.kernel.otp.expiry-time", Long.class))); + otpTxn.setStatusCode("active"); + this.otpRepo.save(otpTxn); + if (channelType.equalsIgnoreCase("phone")) { + this.logger.info("sessionId", "idType", "id", "In generateOTP method of otpmanager service invoking sms notification"); + NotificationRequestDtoV2 notificationRequestDtoV2=(NotificationRequestDtoV2) notificationRequestDto; + notificationRequestDtoV2.setTemplateType(TemplateType.SUCCESS); + notificationRequestDtoV2.setRequestType(RequestType.SEND_OTP); + notificationRequestDtoV2.setOtp(otp); + notificationService + .sendNotification(notificationRequestDto, List.of(channelType), null, userId, identityDTO); + } + + if (channelType.equalsIgnoreCase("email")) { + logger.info("sessionId", "idType", "id", "In generateOTP method of otpmanager service invoking email notification"); + NotificationRequestDtoV2 notificationRequestDtoV2=(NotificationRequestDtoV2) notificationRequestDto; + notificationRequestDtoV2.setTemplateType(TemplateType.SUCCESS); + notificationRequestDtoV2.setRequestType(RequestType.SEND_OTP); + notificationRequestDtoV2.setOtp(otp); + notificationService + .sendNotification(notificationRequestDto, List.of(channelType), userId, null, identityDTO); + } + + return true; + } + } + + private String generateOTP(MainRequestDTO requestDTO) { + this.logger.info("sessionId", "idType", "id", "In generateOTP method of otpmanager service "); + + try { + OTPGenerateRequestDTO otpRequestDTO = new OTPGenerateRequestDTO(); + otpRequestDTO.setId(requestDTO.getId()); + otpRequestDTO.setRequesttime(requestDTO.getRequesttime()); + otpRequestDTO.setVersion(requestDTO.getVersion()); + RequestDTO req = new RequestDTO(); + req.setKey(requestDTO.getRequest().getUserId()); + otpRequestDTO.setRequest(req); + HttpHeaders headers1 = new HttpHeaders(); + headers1.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); + headers1.setContentType(MediaType.APPLICATION_JSON_UTF8); + headers1.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + HttpEntity entity1 = new HttpEntity(otpRequestDTO, headers1); + ResponseWrapper> response = (ResponseWrapper)this.restTemplate.exchange(this.environment.getProperty("otp-generate.rest.uri"), HttpMethod.POST, entity1, ResponseWrapper.class, new Object[0]).getBody(); + String otp = null; + if (response != null) { + Map res = (Map)response.getResponse(); + if (res != null) { + if (((String)res.get("status")).equals("USER_BLOCKED")) { + this.logger.error("sessionId", this.getClass().getSimpleName(), ResidentErrorCode.BLOCKED_OTP_VALIDATE.getErrorCode(), "USER_BLOCKED"); + throw new ResidentServiceException(ResidentErrorCode.BLOCKED_OTP_VALIDATE.getErrorCode(), ResidentErrorCode.BLOCKED_OTP_VALIDATE.getErrorMessage()); + } + otp = res.get("otp"); + } + } + + return otp; + } catch (ResidentServiceException var9) { + this.logger.error("sessionId", this.getClass().getSimpleName(), "generateOTP", var9.getMessage()); + throw new ResidentServiceException(ResidentErrorCode.BLOCKED_OTP_VALIDATE.getErrorCode(), ResidentErrorCode.BLOCKED_OTP_VALIDATE.getErrorMessage()); + } catch (Exception var10) { + this.logger.error("sessionId", this.getClass().getSimpleName(), ResidentErrorCode.SERVER_ERROR.getErrorCode(), ResidentErrorCode.SERVER_ERROR.getErrorMessage()); + throw new ResidentServiceException(ResidentErrorCode.SERVER_ERROR.getErrorCode(), ResidentErrorCode.SERVER_ERROR.getErrorMessage()); + } + } + + @Override + public boolean validateOtp(String otp, String userId, String transactionId) throws ApisResourceAccessException, ResidentServiceCheckedException { + logger.info("sessionId", "idType", "id", "In validateOtp method of otpmanager service "); + String otpHash; + otpHash = digestAsPlainText( + (userId + this.environment.getProperty("mosip.kernel.data-key-splitter") + otp+transactionId).getBytes()); + + if (!otpRepo.existsByOtpHashAndStatusCode(otpHash, PreRegLoginConstant.ACTIVE_STATUS)) { + return false; + } + + OtpTransactionEntity otpTxn = otpRepo.findTopByOtpHashAndStatusCode(otpHash, PreRegLoginConstant.ACTIVE_STATUS); + otpTxn.setStatusCode(PreRegLoginConstant.USED_STATUS); + otpRepo.save(otpTxn); + if (!(otpTxn.getExpiryDtimes().isAfter(DateUtils.getUTCCurrentDateTime()))) { + logger.error(PreRegLoginConstant.SESSION_ID, this.getClass().getSimpleName(), + PreRegLoginErrorConstants.EXPIRED_OTP.getErrorCode(), OTP_EXPIRED); + throw new ResidentServiceException(ResidentErrorCode.EXPIRED_OTP.getErrorCode(), + ResidentErrorCode.EXPIRED_OTP.getErrorMessage()); + } + return true; + } + + public Tuple2 updateUserId(String userId, String transactionId) throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + ResidentDemographicUpdateRequestDTO residentDemographicUpdateRequestDTO = new ResidentDemographicUpdateRequestDTO(); + + String individualId= identityService.getResidentIndvidualIdFromSession(); + String individualIdType = templateUtil.getIndividualIdType(); + residentUpdateRequestDto.setIndividualId(individualId); + residentUpdateRequestDto.setConsent(ACCEPTED); + residentUpdateRequestDto.setIndividualIdType(individualIdType); + Tuple3 identityData = utilities. + getIdentityDataFromIndividualID(individualId); + JSONObject idRepoJson = identityData.getT1(); + String schemaJson = identityData.getT2(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put(IdType.UIN.name(), idRepoJson.get(IdType.UIN.name())); + jsonObject.put(getChannel(userId, transactionId), userId); + residentUpdateRequestDto.setIdentity(jsonObject); + residentDemographicUpdateRequestDTO.setIdentity(jsonObject); + Tuple2 tuple2 = residentService.reqUinUpdate(residentUpdateRequestDto, residentDemographicUpdateRequestDTO.getIdentity(), true, + idRepoJson, schemaJson, identityData.getT3()); + return tuple2; + } + + public String getChannel(String userId, String transactionId) { + List channels = requestValidator.validateUserIdAndTransactionId(userId, transactionId); + if(channels.get(0).equalsIgnoreCase(PHONE)){ + return PHONE; + } else{ + return EMAIL; + } + } + + public static String digestAsPlainText(byte[] data) { + return DatatypeConverter.printHexBinary(data).toUpperCase(); + } + + public String hash(String id) throws ResidentServiceException { + return HMACUtils.digestAsPlainText(id.getBytes()); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PartnerServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PartnerServiceImpl.java new file mode 100644 index 00000000000..cfc87ea66cd --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PartnerServiceImpl.java @@ -0,0 +1,55 @@ +package io.mosip.resident.service.impl; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.PartnerService; +import io.mosip.resident.service.ProxyPartnerManagementService; + +/** + * The Class PartnerServiceImpl. + * @author Kamesh Shekhar Prasad + */ +@Component +public class PartnerServiceImpl implements PartnerService { + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + private static final Logger logger = LoggerConfiguration.logConfig(PartnerServiceImpl.class); + + @Override + public ArrayList getPartnerDetails(String partnerType) throws ResidentServiceCheckedException { + logger.debug("PartnerServiceImpl::getPartnerDetails()::entry"); + ArrayList partnerIds = new ArrayList<>(); + try { + if (partnerType != null) { + ResponseWrapper responseWrapper = proxyPartnerManagementService.getPartnersByPartnerType(partnerType); + if (responseWrapper != null) { + Map partnerResponse = new LinkedHashMap<>((Map) responseWrapper.getResponse()); + ArrayList partners = (ArrayList) partnerResponse.get(ResidentConstants.PARTNERS); + for (Object partner : partners) { + Map individualPartner = new LinkedHashMap<>((Map) partner); + partnerIds.add(individualPartner.get(ResidentConstants.PMS_PARTNER_ID).toString()); + } + } + } + } catch (Exception e) { + logger.error("Error occurred in getting partner details %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.PARTNER_SERVICE_EXCEPTION.getErrorCode(), + ResidentErrorCode.PARTNER_SERVICE_EXCEPTION.getErrorMessage(), e); + } + logger.debug("PartnerServiceImpl::getPartnerDetails()::exit"); + return partnerIds; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PinUnpinStatusServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PinUnpinStatusServiceImpl.java new file mode 100644 index 00000000000..90dc1c10cec --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/PinUnpinStatusServiceImpl.java @@ -0,0 +1,81 @@ +package io.mosip.resident.service.impl; + +import java.util.List; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.PinUnpinStatusService; + +/** + * This class is used to implement service class of pin or unpin status api based on event id. + * @Author Kamesh Shekhar Prasad + */ +@Component +public class PinUnpinStatusServiceImpl implements PinUnpinStatusService { + + private static final Logger logger = LoggerConfiguration.logConfig(PinUnpinStatusServiceImpl.class); + + private static final String SUCCESS = "SUCCESS"; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Value("${resident.service.pin.status.id}") + private String pinnedStatusId; + + @Value("${resident.service.pin.status.version}") + private String pinnedStatusVersion; + + @Value("${resident.service.unpin.status.id}") + private String unPinnedStatusId; + + @Value("${resident.service.unpin.status.version}") + private String unPinnedStatusVersion; + + @Override + public ResponseWrapper pinStatus(String eventId, boolean status) + throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + logger.debug("PinUnpinStatusServiceImpl::pinStatus()::entry"); + if (residentTransactionRepository.existsById(eventId)) { + residentTransactionRepository.updatePinnedStatus(eventId, status); + } else { + logger.error("PinUnpinStatusServiceImpl - %s", ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.EVENT_STATUS_NOT_FOUND); + } + ResponseDTO responseDTO = new ResponseDTO(); + responseDTO.setStatus(HttpStatus.OK.toString()); + responseDTO.setMessage(SUCCESS); + responseWrapper.setResponse(responseDTO); + logger.debug("PinUnpinStatusServiceImpl::pinStatus()::exit"); + } + catch (Exception e){ + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), ExceptionUtils.getStackTrace(e)); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorCode(), ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorMessage()))); + } finally { + if(status){ + responseWrapper.setId(pinnedStatusId); + responseWrapper.setVersion(pinnedStatusVersion); + } else{ + responseWrapper.setId(unPinnedStatusId); + responseWrapper.setVersion(unPinnedStatusVersion); + } + } + return responseWrapper; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyIdRepoServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyIdRepoServiceImpl.java new file mode 100644 index 00000000000..46c99afb291 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyIdRepoServiceImpl.java @@ -0,0 +1,299 @@ +package io.mosip.resident.service.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.idrepository.core.dto.IdResponseDTO; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ConsentStatusType; +import io.mosip.resident.constant.EventStatusCanceled; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.DraftResidentResponseDto; +import io.mosip.resident.dto.DraftResponseDto; +import io.mosip.resident.dto.DraftUinResidentResponseDto; +import io.mosip.resident.dto.DraftUinResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import reactor.util.function.Tuple2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static io.mosip.resident.constant.ResidentConstants.SEMI_COLON; +import static io.mosip.resident.constant.ResidentConstants.UPDATED; +import static io.mosip.resident.constant.ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION; + +/** + * @author Manoj SP + * + */ +@Service +public class ProxyIdRepoServiceImpl implements ProxyIdRepoService { + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyIdRepoServiceImpl.class); + private static final String NO_RECORDS_FOUND_ID_REPO_ERROR_CODE = "IDR-IDC-007"; + private static final String INVALID_INPUT_PARAMETER_ID_REPO_ERROR_CODE = "IDR-IDC-002"; + private static final String DISCARDED = "DISCARDED"; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private Environment environment; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private Utility utility; + + @Autowired + private ResidentServiceImpl residentService; + + @Override + public ResponseWrapper getRemainingUpdateCountByIndividualId(List attributeList) + throws ResidentServiceCheckedException { + try { + logger.debug("ProxyIdRepoServiceImpl::getRemainingUpdateCountByIndividualId()::entry"); + String individualId=identityServiceImpl.getResidentIndvidualIdFromSession(); + Map pathsegements = new HashMap(); + pathsegements.put("individualId", individualId); + + List queryParamName = new ArrayList(); + queryParamName.add("attribute_list"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(Objects.isNull(attributeList) ? "" : attributeList.stream().collect(Collectors.joining(","))); + + ResponseWrapper responseWrapper = residentServiceRestClient.getApi(ApiName.IDREPO_IDENTITY_UPDATE_COUNT, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()){ + if(responseWrapper.getErrors().get(ResidentConstants.ZERO) != null && !responseWrapper.getErrors().get(ResidentConstants.ZERO).toString().isEmpty() && + responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode() != null && + !responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode().isEmpty() && + responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode().equalsIgnoreCase(NO_RECORDS_FOUND_ID_REPO_ERROR_CODE)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_RECORDS_FOUND); + }else { + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION); + } + } + logger.debug("ProxyIdRepoServiceImpl::getRemainingUpdateCountByIndividualId()::exit"); + return responseWrapper; + + } catch (ApisResourceAccessException e) { + logger.error(ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + @Override + public ResponseWrapper getPendingDrafts(String langCode) throws ResidentServiceCheckedException { + try { + logger.debug("ProxyIdRepoServiceImpl::getPendingDrafts()::entry"); + String individualId=identityServiceImpl.getResidentIndvidualIdFromSession(); + if(!requestValidator.validateUin(individualId)){ + individualId = identityServiceImpl.getUinForIndividualId(individualId); + } + Map pathsegements = new HashMap(); + pathsegements.put(IdType.UIN.name(), individualId); + + ResponseWrapper responseWrapper = residentServiceRestClient.getApi(ApiName.IDREPO_IDENTITY_GET_DRAFT_UIN, + pathsegements, ResponseWrapper.class); + ResponseWrapper responseWrapperResident = new ResponseWrapper<>(); + responseWrapperResident.setId(environment.getProperty(ResidentConstants.GET_PENDING_DRAFT_ID, ResidentConstants.GET_PENDING_DRAFT_ID)); + responseWrapperResident.setVersion(environment.getProperty(ResidentConstants.GET_PENDING_DRAFT_VERSION, + ResidentConstants.GET_PENDING_DRAFT_VERSION_DEFAULT_VALUE)); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()){ + if(responseWrapper.getErrors().get(ResidentConstants.ZERO) != null && !responseWrapper.getErrors().get(ResidentConstants.ZERO).toString().isEmpty() && + responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode() != null && + !responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode().isEmpty() && + responseWrapper.getErrors().get(ResidentConstants.ZERO).getErrorCode().equalsIgnoreCase(INVALID_INPUT_PARAMETER_ID_REPO_ERROR_CODE)) { + throw new InvalidInputException(IdType.UIN.name()); + }else { + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION); + } + } else { + DraftResponseDto draftResponseDto = objectMapper.convertValue(responseWrapper.getResponse(), DraftResponseDto.class); + responseWrapperResident.setResponse(convertDraftResponseDtoToResidentResponseDTo(draftResponseDto, individualId, langCode)); + } + logger.debug("ProxyIdRepoServiceImpl::getPendingDrafts()::exit"); + return responseWrapperResident; + + } catch (ApisResourceAccessException e) { + logger.error(ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + @Override + public String discardDraft(String eid) throws ResidentServiceCheckedException{ + try { + logger.debug("ProxyIdRepoServiceImpl::discardDraft()::entry"); + List pathsegments = new ArrayList(); + Optional residentTransactionEntity = residentTransactionRepository.findById(eid); + String aid = null; + String individualId = null; + if(residentTransactionEntity.isPresent()){ + aid = residentTransactionEntity.get().getAid(); + individualId = residentTransactionEntity.get().getIndividualId(); + if(aid==null){ + throw new ResidentServiceCheckedException(ResidentErrorCode.AID_NOT_FOUND); + } + } + pathsegments.add(aid); + + IdResponseDTO response = (IdResponseDTO) residentServiceRestClient. + deleteApi(ApiName.IDREPO_IDENTITY_DISCARD_DRAFT, pathsegments, "", "", IdResponseDTO.class); + + if (response.getErrors() != null && !response.getErrors().isEmpty()){ + if(response.getErrors().get(ResidentConstants.ZERO) != null && !response.getErrors().get(ResidentConstants.ZERO).toString().isEmpty() && + response.getErrors().get(ResidentConstants.ZERO).getErrorCode() != null && + !response.getErrors().get(ResidentConstants.ZERO).getErrorCode().isEmpty() && + response.getErrors().get(ResidentConstants.ZERO).getErrorCode().equalsIgnoreCase(NO_RECORDS_FOUND_ID_REPO_ERROR_CODE)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_RECORDS_FOUND); + }else { + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION); + } + } + if(response.getResponse().getStatus().equalsIgnoreCase(DISCARDED)){ + if(residentTransactionEntity.isPresent()) { + utility.updateEntity(EventStatusCanceled.CANCELED.name(), RequestType.UPDATE_MY_UIN.name() + + " - " + EventStatusCanceled.CANCELED.name(), + false, "Draft Discarded successfully", residentTransactionEntity.get()); + utility.sendNotification(residentTransactionEntity.get().getEventId(), + individualId, TemplateType.REGPROC_FAILED); + } + } + + logger.debug("ProxyIdRepoServiceImpl::discardDraft()::exit"); + return response.getResponse().getStatus(); + + } catch (ApisResourceAccessException e) { + logger.error(ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + private DraftResidentResponseDto convertDraftResponseDtoToResidentResponseDTo(DraftResponseDto response, String individualId, String langCode) throws ResidentServiceCheckedException, ApisResourceAccessException { + List draftsList = response.getDrafts(); + List draftUinResidentResponseDtos = new ArrayList<>(); + DraftResidentResponseDto draftResidentResponseDto = new DraftResidentResponseDto(); + Set eventIdList = new HashSet<>(); + if(draftsList!=null && !draftsList.isEmpty()) { + for (DraftUinResponseDto draftUinResponseDto : draftsList) { + String eventId = setDraftValue(draftUinResponseDto.getRid(), individualId, draftUinResponseDto.getAttributes(), + null, draftUinResponseDto.getCreatedDTimes(), draftUinResidentResponseDtos, true, langCode, null); + eventIdList.add(eventId); + } + } + List residentTransactionEntityList = residentTransactionRepository. + findByTokenIdAndRequestTypeCodeAndStatusCode(identityServiceImpl.getResidentIdaToken(), RequestType.UPDATE_MY_UIN.name(), + EventStatusInProgress.NEW.name()); + if(!residentTransactionEntityList.isEmpty()){ + for(ResidentTransactionEntity residentTransactionEntity:residentTransactionEntityList){ + if(!eventIdList.contains(residentTransactionEntity.getEventId()) && residentTransactionEntity.getAttributeList()!=null) { + setDraftValue(residentTransactionEntity.getAid(), individualId, + List.of(residentTransactionEntity.getAttributeList().split(ResidentConstants.COMMA)), + residentTransactionEntity.getEventId(), residentTransactionEntity.getCrDtimes().toString(), + draftUinResidentResponseDtos, false, langCode, residentTransactionEntity); + } + } + } + draftResidentResponseDto.setDrafts(draftUinResidentResponseDtos); + return draftResidentResponseDto; + } + + private String setDraftValue(String rid, String individualId, List attributeList, String eventId, String createdDtimes, + List draftUinResidentResponseDtos, boolean cancellableStatus, + String langCode, ResidentTransactionEntity residentTransactionEntity) throws ResidentServiceCheckedException, + ApisResourceAccessException { + DraftUinResidentResponseDto draftUinResidentResponseDto = new DraftUinResidentResponseDto(); + if(residentTransactionEntity==null){ + residentTransactionEntity = getEventIdFromRid(rid, individualId, attributeList); + } + if (eventId == null) { + eventId = residentTransactionEntity.getEventId(); + } + draftUinResidentResponseDto.setEid(eventId); + draftUinResidentResponseDto.setAid(rid); + draftUinResidentResponseDto.setAttributes(attributeList); + draftUinResidentResponseDto.setCreatedDTimes(createdDtimes); + draftUinResidentResponseDto.setCancellable(cancellableStatus); + draftUinResidentResponseDto.setDescription(getDescription(residentTransactionEntity, langCode)); + draftUinResidentResponseDtos.add(draftUinResidentResponseDto); + + return eventId; + } + + private String getDescription(ResidentTransactionEntity residentTransactionEntity, String langCode) throws ResidentServiceCheckedException { + if(langCode == null){ + return ""; + } + Tuple2 statusCodes = residentService.getEventStatusCode(residentTransactionEntity.getStatusCode(), langCode); + return residentService.getDescriptionForLangCode(residentTransactionEntity, langCode, statusCodes.getT1(), + RequestType.valueOf(residentTransactionEntity.getRequestTypeCode())); + } + + private ResidentTransactionEntity getEventIdFromRid(String rid, String individualId, List attributes) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResidentTransactionEntity residentTransactionEntityAlreadyPresent = residentTransactionRepository.findTopByAidOrderByCrDtimesDesc(rid); + if(residentTransactionEntityAlreadyPresent == null){ + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.UPDATE_MY_UIN); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setTokenId(identityServiceImpl.getResidentIdaToken()); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + if(attributes!=null){ + String attributeList = String.join(SEMI_COLON, attributes); + residentTransactionEntity.setAttributeList(attributeList); + residentTransactionEntity.setStatusComment(attributeList+UPDATED); + } + residentTransactionEntity.setConsent(ConsentStatusType.ACCEPTED.name()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setAid(rid); + residentTransactionEntity.setCredentialRequestId(rid + utility.getRidDeliMeterValue()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + residentTransactionRepository.save(residentTransactionEntity); + return residentTransactionEntity; + } + return residentTransactionEntityAlreadyPresent; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyMasterdataServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyMasterdataServiceImpl.java new file mode 100644 index 00000000000..65c5b8d14f0 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyMasterdataServiceImpl.java @@ -0,0 +1,694 @@ +package io.mosip.resident.service.impl; + +import com.hazelcast.cache.impl.CacheEntry; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.OrderEnum; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.GenderCodeResponseDTO; +import io.mosip.resident.dto.LocationImmediateChildrenResponseDto; +import io.mosip.resident.dto.TemplateResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static io.mosip.resident.constant.MappingJsonConstants.GENDER; + +/** + * Resident proxy masterdata service implementation class. + * + * @author Ritik Jain + */ +@Component +public class ProxyMasterdataServiceImpl implements ProxyMasterdataService { + + private static final String CODE = "code"; + + private static final String DOCUMENTTYPES = "documenttypes"; + + private static final String DOCUMENTCATEGORIES = "documentcategories"; + private static final String GENDER_NAME = "genderName"; + private static final Object VALUES = "values"; + + private Map>> cache = new ConcurrentHashMap<>(); + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + Environment env; + + @Autowired + Utility utility; + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyMasterdataServiceImpl.class); + + @Autowired + private Utilities utilities; + + + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getImmediateChildrenByLocCode}") + public void clearExpiredCacheEntries() { + logger.info("Emptying getImmediateChildrenByLocCode cache"); + cache.clear(); + } + + @Override + public ResponseWrapper getValidDocumentByLangCode(String langCode) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getValidDocumentByLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("langCode", langCode); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.VALID_DOCUMENT_BY_LANGCODE_URL, pathsegments, + ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing valid documents %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getValidDocumentByLangCode()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "valid-doc-cat-and-type-list", key = "#langCode") + public Tuple2, Map>> getValidDocCatAndTypeList(String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getValidDocCatAndTypeList()::entry"); + ResponseWrapper responseWrapper = utility.getValidDocumentByLangCode(langCode); + Map response = new LinkedHashMap<>((Map) responseWrapper.getResponse()); + List> validDoc = (List>) response.get(DOCUMENTCATEGORIES); + + List docCatCodes = validDoc.stream() + .map(map -> ((String) map.get(CODE)).toLowerCase()) + .collect(Collectors.toList()); + + Map> docTypeCodes = validDoc.stream() + .map(map -> { + return Map.entry(((String) map.get(CODE)).toLowerCase(), + getDocTypCodeList((List>) map.get(DOCUMENTTYPES))); + }) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + logger.debug("ProxyMasterdataServiceImpl::getValidDocCatAndTypeList()::exit"); + return Tuples.of(docCatCodes, docTypeCodes); + } + + private List getDocTypCodeList(List> docTypMap){ + return docTypMap.stream() + .flatMap(map -> { + return Stream.of(((String) map.get(CODE)).toLowerCase()); + }) + .collect(Collectors.toList()); + } + + @Override + @Cacheable(value = "getLocationHierarchyLevelByLangCode", key = "#langCode") + public ResponseWrapper getLocationHierarchyLevelByLangCode(String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getLocationHierarchyLevelByLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("langcode", langCode); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.LOCATION_HIERARCHY_LEVEL_BY_LANGCODE_URL, + pathsegments, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing location hierarchy levels %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getLocationHierarchyLevelByLangCode()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getImmediateChildrenByLocCodeAndLangCode", key = "#locationCode + '_' + #langCode") + public ResponseWrapper getImmediateChildrenByLocCodeAndLangCode(String locationCode, String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getImmediateChildrenByLocCodeAndLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("locationcode", locationCode); + pathsegments.put("langcode", langCode); + try { + responseWrapper = residentServiceRestClient.getApi( + ApiName.IMMEDIATE_CHILDREN_BY_LOCATIONCODE_AND_LANGCODE_URL, pathsegments, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing immediate children %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getImmediateChildrenByLocCodeAndLangCode()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getLocationDetailsByLocCodeAndLangCode", key = "#locationCode + '_' + #langCode") + public ResponseWrapper getLocationDetailsByLocCodeAndLangCode(String locationCode, String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getLocationDetailsByLocCodeAndLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("locationcode", locationCode); + pathsegments.put("langcode", langCode); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.LOCATION_INFO_BY_LOCCODE_AND_LANGCODE_URL, + pathsegments, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing location details %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getLocationDetailsByLocCodeAndLangCode()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getCoordinateSpecificRegistrationCenters", key = "{#langCode, #longitude, #latitude, #proximityDistance}") + public ResponseWrapper getCoordinateSpecificRegistrationCenters(String langCode, double longitude, + double latitude, int proximityDistance) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getCoordinateSpecificRegistrationCenters()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegements = new HashMap(); + pathsegements.put("langcode", langCode); + pathsegements.put("longitude", longitude); + pathsegements.put("latitude", latitude); + pathsegements.put("proximitydistance", proximityDistance); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.COORDINATE_SPECIFIC_REGISTRATION_CENTERS_URL, + pathsegements, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing coordinate specific registration centers %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getCoordinateSpecificRegistrationCenters()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getApplicantValidDocument", key = "{#applicantId, #languages}") + public ResponseWrapper getApplicantValidDocument(String applicantId, List languages) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getApplicantValidDocument()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegements = new HashMap(); + pathsegements.put("applicantId", applicantId); + + List queryParamName = new ArrayList(); + queryParamName.add("languages"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(languages.stream().collect(Collectors.joining(","))); + + try { + responseWrapper = (ResponseWrapper) residentServiceRestClient.getApi( + ApiName.APPLICANT_VALID_DOCUMENT_URL, pathsegements, queryParamName, queryParamValue, + ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing applicant valid document %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getApplicantValidDocument()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getRegistrationCentersByHierarchyLevel", key = "{#langCode, #hierarchyLevel, #name}") + public ResponseWrapper getRegistrationCentersByHierarchyLevel(String langCode, Short hierarchyLevel, + List name) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCentersByHierarchyLevel()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegements = new HashMap(); + pathsegements.put("langcode", langCode); + pathsegements.put("hierarchylevel", hierarchyLevel); + + List queryParamName = new ArrayList(); + queryParamName.add("name"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(name.stream().collect(Collectors.joining(","))); + + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.REGISTRATION_CENTER_FOR_LOCATION_CODE_URL, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing registration centers %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCentersByHierarchyLevel()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getRegistrationCenterByHierarchyLevelAndTextPaginated", key = "{#langCode, #hierarchyLevel, #name, #pageNumber," + + " #pageSize, #orderBy, #sortBy}") + public ResponseWrapper getRegistrationCenterByHierarchyLevelAndTextPaginated(String langCode, + Short hierarchyLevel, String name, int pageNumber, int pageSize, OrderEnum orderBy, String sortBy) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCenterByHierarchyLevelAndTextPaginated()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + + Map pathsegements = new HashMap(); + pathsegements.put("langcode", langCode); + pathsegements.put("hierarchylevel", hierarchyLevel); + pathsegements.put("name", name); + + List queryParamName = new ArrayList(); + queryParamName.add("pageNumber"); + queryParamName.add("pageSize"); + queryParamName.add("orderBy"); + queryParamName.add("sortBy"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(pageNumber); + queryParamValue.add(pageSize); + queryParamValue.add(orderBy); + queryParamValue.add(sortBy); + + try { + responseWrapper = residentServiceRestClient.getApi( + ApiName.REGISTRATION_CENTER_BY_LOCATION_TYPE_AND_SEARCH_TEXT_PAGINATED_URL, pathsegements, + queryParamName, queryParamValue, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing registration centers paginated %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCenterByHierarchyLevelAndTextPaginated()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getRegistrationCenterWorkingDays", key = "{#registrationCenterID, #langCode}") + public ResponseWrapper getRegistrationCenterWorkingDays(String registrationCenterID, String langCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCenterWorkingDays()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegements = new HashMap(); + pathsegements.put("registrationCenterID", registrationCenterID); + pathsegements.put("langCode", langCode); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.WORKING_DAYS_BY_REGISTRATION_ID, pathsegements, + ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing registration center working days %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getRegistrationCenterWorkingDays()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getLatestIdSchema", key = "{#schemaVersion, #domain, #type}") + public ResponseWrapper getLatestIdSchema(double schemaVersion, String domain, String type) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getLatestIdSchema()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + + List pathsegements = null; + + List queryParamName = new ArrayList(); + queryParamName.add("schemaVersion"); + queryParamName.add("domain"); + queryParamName.add("type"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(schemaVersion); + queryParamValue.add(domain); + queryParamValue.add(type); + + try { + responseWrapper = (ResponseWrapper) residentServiceRestClient.getApi(ApiName.LATEST_ID_SCHEMA_URL, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing latest id schema %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getLatestIdSchema()::exit"); + return responseWrapper; + } + + @Override + public ResponseWrapper getAllTemplateBylangCodeAndTemplateTypeCode(String langCode, String templateTypeCode) + throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getAllTemplateBylangCodeAndTemplateTypeCode()::entry"); + ResponseWrapper response = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("langcode", langCode); + pathsegments.put("templatetypecode", templateTypeCode); + + try { + response = residentServiceRestClient.getApi(ApiName.TEMPLATES_BY_LANGCODE_AND_TEMPLATETYPECODE_URL, + pathsegments, ResponseWrapper.class); + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + logger.error(response.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.TEMPLATE_EXCEPTION); + } + TemplateResponseDto templateResponse = JsonUtil + .readValue(JsonUtil.writeValueAsString(response.getResponse()), TemplateResponseDto.class); + String template = templateResponse.getTemplates().get(0).getFileText(); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map responseMap = new HashMap<>(); + responseMap.put(ResidentConstants.FILE_TEXT, template); + responseWrapper.setResponse(responseMap); + logger.debug("ProxyMasterdataServiceImpl::getAllTemplateBylangCodeAndTemplateTypeCode()::exit"); + return responseWrapper; + + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing templates %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } catch (IOException e) { + logger.error("Error occured in accessing templates %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } + } + + @Override + @Cacheable(value = "templateCache", key = "#languageCode + '_' + #templateTypeCode") + public String getTemplateValueFromTemplateTypeCodeAndLangCode(String languageCode, String templateTypeCode) { + try { + ResponseWrapper proxyResponseWrapper = getAllTemplateBylangCodeAndTemplateTypeCode(languageCode, templateTypeCode); + logger.debug(String.format("Template data from DB:- %s", proxyResponseWrapper.getResponse())); + Map templateResponse = new LinkedHashMap<>( + (Map) proxyResponseWrapper.getResponse()); + return templateResponse.get(ResidentConstants.FILE_TEXT); + } catch (ResidentServiceCheckedException e) { + throw new ResidentServiceException(ResidentErrorCode.TEMPLATE_EXCEPTION, e); + } + } + + @Override + @Cacheable(value = "getLocationHierarchyLevels") + public ResponseWrapper getLocationHierarchyLevels(String lastUpdated) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getLocationHierarchyLevels()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + List pathsegements = null; + List queryParamName = new ArrayList(); + List queryParamValue = new ArrayList<>(); + if(lastUpdated!=null){ + queryParamName.add("lastUpdated"); + queryParamValue.add(lastUpdated); + } + try { + responseWrapper = (ResponseWrapper) residentServiceRestClient.getApi(ApiName.LOCATION_HIERARCHY, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing location hierarchy level %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getLocationHierarchyLevels()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getAllDynamicFieldByName", key = "#fieldName") + public ResponseWrapper getAllDynamicFieldByName(String fieldName) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getAllDynamicFieldByName()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("fieldName", fieldName); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.DYNAMIC_FIELD_BASED_ON_FIELD_NAME, + pathsegments, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException | ResidentServiceCheckedException e) { + logger.error("Error occured in accessing dynamic data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getDynamicFieldBasedOnLangCodeAndFieldName()::exit"); + return responseWrapper; + } + + @Override + public LocationImmediateChildrenResponseDto getImmediateChildrenByLocCode(String locationCode, List languageCodes) throws ResidentServiceCheckedException { + List cacheKeyList = languageCodes.stream() + .map(languageCode -> locationCode + ResidentConstants.UNDER_SCORE + languageCode) + .collect(Collectors.toList()); + LocationImmediateChildrenResponseDto result =new LocationImmediateChildrenResponseDto(); + Map>> locations = new HashMap<>(); + List languageCodesNotCached = new ArrayList<>(); + if (!cache.isEmpty()) { + cacheKeyList + .forEach(cacheKeyLanguage -> { + List> cachedResult = cache.get(cacheKeyLanguage); + String languageCode = List.of(cacheKeyLanguage.split(ResidentConstants.UNDER_SCORE)).get(1); + if (cachedResult != null) { + locations.put(languageCode, cachedResult); + } else { + languageCodesNotCached.add(languageCode); + } + }); + } + if(cache.isEmpty()){ + languageCodesNotCached.addAll(languageCodes); + } + if(!languageCodesNotCached.isEmpty()) { + LocationImmediateChildrenResponseDto responseDto = getImmediateChildrenByLocCodeAndLanguageCodes(locationCode, languageCodesNotCached); + languageCodesNotCached.forEach( + languageCodeNotCached ->{ + if(responseDto.getLocations().containsKey(languageCodeNotCached)) { + locations.put(languageCodeNotCached, responseDto.getLocations().get(languageCodeNotCached)); + cache.put(locationCode + "_" + languageCodeNotCached, responseDto.getLocations().get(languageCodeNotCached)); + } + } + ); + } + result.setLocations(locations); + return result; + } + + public LocationImmediateChildrenResponseDto getImmediateChildrenByLocCodeAndLanguageCodes(String locationCode, List languageCodes) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getImmediateChildrenByLocCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + + List pathsegements = new ArrayList<>(); + pathsegements.add(locationCode); + + List queryParamName = new ArrayList(); + queryParamName.add("languageCodes"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(String.join(ResidentConstants.COMMA, languageCodes)); + + try { + responseWrapper = (ResponseWrapper) residentServiceRestClient.getApi(ApiName.IMMEDIATE_CHILDREN_BY_LOCATION_CODE, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException | ResidentServiceCheckedException e) { + logger.error("Error occured in accessing latest id schema %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + Map locationResponse = (Map) responseWrapper.getResponse(); + List> locationList = (List>) locationResponse.get("locations"); + + Map>> groupedLocations = locationList.stream() + .collect(Collectors.groupingBy(map -> (String) map.get("langCode"))); + + LocationImmediateChildrenResponseDto locationImmediateChildrenResponseDto = new LocationImmediateChildrenResponseDto(); + locationImmediateChildrenResponseDto.setLocations(groupedLocations); + + logger.debug("ProxyMasterdataServiceImpl::getImmediateChildrenByLocCode()::exit"); + return locationImmediateChildrenResponseDto; + } + + @CacheEvict(value = "templateCache", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.templateCache}") + public void emptyTemplateCache() { + logger.info("Emptying Template cache"); + } + + @Override + public ResponseWrapper getDynamicFieldBasedOnLangCodeAndFieldName(String fieldName, String langCode, boolean withValue) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getDynamicFieldBasedOnLangCodeAndFieldName()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("langcode", langCode); + pathsegments.put("fieldName", fieldName); + List queryParamName = new ArrayList(); + queryParamName.add("withValue"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(withValue); + try { + responseWrapper = residentServiceRestClient.getApi(ApiName.DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME, pathsegments, queryParamName, + queryParamValue, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing dynamic data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getDynamicFieldBasedOnLangCodeAndFieldName()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getDocumentTypesByDocumentCategoryAndLangCode", key = "{#documentcategorycode, #langCode}") + public ResponseWrapper getDocumentTypesByDocumentCategoryAndLangCode(String documentcategorycode, String langCode) throws ResidentServiceCheckedException { + logger.debug("ProxyMasterdataServiceImpl::getDocumentTypesByDocumentCategoryAndLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map pathsegments = new HashMap(); + pathsegments.put("documentcategorycode", documentcategorycode); + pathsegments.put("langcode", langCode); + try { + responseWrapper=residentServiceRestClient.getApi(ApiName.DOCUMENT_TYPE_BY_DOCUMENT_CATEGORY_AND_LANG_CODE, pathsegments, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.BAD_REQUEST.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing document types %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyMasterdataServiceImpl::getDocumentTypesByDocumentCategoryAndLangCode()::exit"); + return responseWrapper; + } + + @Override + @Cacheable(value = "getGenderCodeByGenderTypeAndLangCode", key = "{#genderName, #langCode}") + public ResponseWrapper getGenderCodeByGenderTypeAndLangCode(String genderName, + String langCode) throws ResidentServiceCheckedException, IOException { + logger.debug("ProxyMasterdataServiceImpl::getGenderCodeByGenderTypeAndLangCode()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + GenderCodeResponseDTO genderCodeResponseDTO = new GenderCodeResponseDTO(); + ResponseWrapper res = utilities.getDynamicFieldBasedOnLangCodeAndFieldName(GENDER, langCode, true); + Map response = (Map) res.getResponse(); + ArrayList responseValues = (ArrayList) response.get(VALUES); + String genderCode = responseValues.stream() + .filter(responseMap -> responseMap.get(ResidentConstants.VALUE).toString().equalsIgnoreCase(genderName)) + .map(responseMap -> responseMap.get(CODE).toString()) + .findFirst() + .orElse(null); + if (genderCode!=null) { + genderCodeResponseDTO.setGenderCode(genderCode); + } else { + throw new InvalidInputException(GENDER_NAME); + } + responseWrapper.setResponse(genderCodeResponseDTO); + logger.debug("ProxyMasterdataServiceImpl::getGenderCodeByGenderTypeAndLangCode()::exit"); + return responseWrapper; + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyOtpServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyOtpServiceImpl.java new file mode 100644 index 00000000000..885bca2582f --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyOtpServiceImpl.java @@ -0,0 +1,206 @@ +package io.mosip.resident.service.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import io.mosip.resident.dto.IdentityDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; + +import io.mosip.kernel.core.authmanager.model.AuthNResponse; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.preregistration.application.constant.PreRegLoginConstant; +import io.mosip.preregistration.core.util.GenericUtil; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.ExceptionJSONInfoDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.MainResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.OtpManager; +import io.mosip.resident.service.ProxyOtpService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to implement opt service impl class. + */ +@Service +public class ProxyOtpServiceImpl implements ProxyOtpService { + + private Logger log = LoggerConfiguration.logConfig(ProxyOtpServiceImpl.class); + + private List otpChannel; + + @Autowired + private OtpManager otpManager; + + @Autowired + private AuditUtil audit; + + @Autowired + RequestValidator requestValidator; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private Utility utility; + + @Value("${mosip.mandatory-languages}") + private String mandatoryLanguage; + + @Override + public ResponseEntity> sendOtp(MainRequestDTO userOtpRequest, IdentityDTO identityDTO) throws ResidentServiceCheckedException { + MainResponseDTO response = new MainResponseDTO<>(); + String userid = null; + boolean isSuccess = false; + String language = mandatoryLanguage; + log.info("In callsendOtp method of login service with userID: {} and langCode", + userOtpRequest.getRequest().getUserId(), language); + + try { + response = (MainResponseDTO) getMainResponseDto(userOtpRequest); + log.info("Response after loginCommonUtil {}", response); + + userid = userOtpRequest.getRequest().getUserId(); + otpChannel = requestValidator.validateUserIdAndTransactionId(userid, userOtpRequest.getRequest().getTransactionId()); + boolean otpSent = otpManager.sendOtp(userOtpRequest, otpChannel.get(0), language, identityDTO); + AuthNResponse authNResponse = null; + if (otpSent) { + if (otpChannel.get(0).equalsIgnoreCase(PreRegLoginConstant.PHONE_NUMBER)) + authNResponse = new AuthNResponse(PreRegLoginConstant.SMS_SUCCESS, PreRegLoginConstant.SUCCESS); + else + authNResponse = new AuthNResponse(PreRegLoginConstant.EMAIL_SUCCESS, PreRegLoginConstant.SUCCESS); + response.setResponse(authNResponse); + isSuccess = true; + } else + isSuccess = false; + + response.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); + } catch (HttpServerErrorException | HttpClientErrorException ex) { + log.error("In callsendOtp method of login service- ", ex.getResponseBodyAsString()); + if(ex instanceof HttpServerErrorException || ex instanceof HttpClientErrorException){ + throw new ResidentServiceException(ResidentErrorCode.CONFIG_FILE_NOT_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.CONFIG_FILE_NOT_FOUND_EXCEPTION.getErrorMessage()); + } + } catch (ResidentServiceCheckedException e){ + log.error("In callsendOtp method of login service- ", e); + throw e; + } + catch (Exception ex) { + log.error("In callsendOtp method of login service- ", ex); + throw new ResidentServiceException(ResidentErrorCode.SEND_OTP_FAILED.getErrorCode(), + ResidentErrorCode.SEND_OTP_FAILED.getErrorMessage(), ex); + } finally { + if (isSuccess) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.SEND_OTP_SUCCESS, + userid, "Send OTP")); + } else { + + ExceptionJSONInfoDTO errors = new ExceptionJSONInfoDTO(ResidentErrorCode.SEND_OTP_FAILED.getErrorCode(), + ResidentErrorCode.SEND_OTP_FAILED.getErrorMessage()); + List lst = new ArrayList<>(); + lst.add(errors); + response.setErrors(lst); + response.setResponse(null); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.SEND_OTP_FAILURE, + userid, "Send OTP")); + } + } + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Override + public Tuple2, String> validateWithUserIdOtp(MainRequestDTO userIdOtpRequest) { + log.info("In calluserIdOtp method of login service "); + MainResponseDTO response = null; + response = (MainResponseDTO) getMainResponseDto(userIdOtpRequest); + String userid = null; + String transactionId = null; + boolean isSuccess = false; + String eventId = ResidentConstants.NOT_AVAILABLE; + + try { + OtpRequestDTOV3 user = userIdOtpRequest.getRequest(); + userid = user.getUserId(); + transactionId = user.getTransactionId(); + boolean validated = otpManager.validateOtp(user.getOtp(), userid, transactionId); + AuthNResponse authresponse = new AuthNResponse(); + if (validated) { + Tuple2 updateResult = otpManager.updateUserId(userid, transactionId); + eventId = updateResult.getT2(); + authresponse.setMessage(PreRegLoginConstant.VALIDATION_SUCCESS); + authresponse.setStatus(PreRegLoginConstant.SUCCESS); + } else { + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + response.setResponse(authresponse); + isSuccess = true; + } catch (ResidentServiceException ex) { + log.error("In calluserIdOtp method of login service- ", ex); + ex.setMetadata(Map.of(ResidentConstants.EVENT_ID, eventId)); + throw ex; + } catch (RuntimeException ex) { + log.error("In calluserIdOtp method of login service- ", ex); + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED, ex, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } catch (ResidentServiceCheckedException e) { + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } catch (ApisResourceAccessException e) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } catch (IOException e) { + throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } finally { + response.setResponsetime(GenericUtil.getCurrentResponseTime()); + + if (!isSuccess) { + ExceptionJSONInfoDTO errors = new ExceptionJSONInfoDTO(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + List lst = new ArrayList<>(); + lst.add(errors); + response.setErrors(lst); + response.setResponse(null); + } + + } + return Tuples.of(response, eventId); + } + + /** + * This method will return the MainResponseDTO with id and version + * + * @param mainRequestDto + * @return MainResponseDTO + */ + public MainResponseDTO getMainResponseDto(MainRequestDTO mainRequestDto) { + log.info("In getMainResponseDTO method of ProxyOtpServiceImpl"); + MainResponseDTO response = new MainResponseDTO<>(); + response.setId(mainRequestDto.getId()); + response.setVersion(mainRequestDto.getVersion()); + return response; + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceImpl.java new file mode 100644 index 00000000000..0684512edfc --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceImpl.java @@ -0,0 +1,102 @@ +package io.mosip.resident.service.impl; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + +/** + * Resident proxy partner management service implementation class. + * + * @author Ritik Jain + */ +@Component +public class ProxyPartnerManagementServiceImpl implements ProxyPartnerManagementService { + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + private Utility utility; + + private static final Logger logger = LoggerConfiguration.logConfig(ProxyPartnerManagementServiceImpl.class); + + @Override + public ResponseWrapper getPartnersByPartnerType(String partnerType) + throws ResidentServiceCheckedException { + return utility.getPartnersByPartnerType(partnerType, ApiName.PARTNER_API_URL); + } + + @Override + public ResponseWrapper getPartnersByPartnerType(Optional partnerType, ApiName apiUrl) + throws ResidentServiceCheckedException { + logger.debug("ProxyPartnerManagementServiceImpl::getPartnersByPartnerType()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + + List pathsegements = null; + + List queryParamName = new ArrayList(); + if(partnerType.isPresent()) { + queryParamName.add(ResidentConstants.PARTNER_TYPE); + } + + List queryParamValue = new ArrayList<>(); + if(partnerType.isPresent()) { + queryParamValue.add(partnerType.get()); + } + + try { + responseWrapper = (ResponseWrapper) residentServiceRestClient.getApi(apiUrl, + pathsegements, queryParamName, queryParamValue, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.error(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(responseWrapper.getErrors().get(0).getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + } catch (ApisResourceAccessException e) { + logger.error("Error occured in accessing partners list %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug("ProxyPartnerManagementServiceImpl::getPartnersByPartnerType()::exit"); + return responseWrapper; + } + + @SuppressWarnings("unchecked") + @Cacheable(value = "partnerDetailCache", key = "#partnerId") + @Override + public Map getPartnerDetailFromPartnerIdAndPartnerType(String partnerId, String partnerType) { + ResponseWrapper response = null; + try { + response = utility.getPartnersByPartnerType(partnerType, ApiName.PARTNER_DETAILS_NEW_URL); + } catch (ResidentServiceCheckedException e) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + Map partnerResponse = new LinkedHashMap<>((Map) response.getResponse()); + List> partners = (List>) partnerResponse.get(ResidentConstants.PARTNERS); + return partners.stream() + .filter(map -> ((String)map.get(ResidentConstants.PMS_PARTNER_ID)).equals(partnerId)) + .findAny() + .orElse(Map.of()); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentConfigServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentConfigServiceImpl.java new file mode 100644 index 00000000000..87b39b5b62d --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentConfigServiceImpl.java @@ -0,0 +1,263 @@ +package io.mosip.resident.service.impl; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.util.Utility; + +/** + * The Class ResidentConfigServiceImpl. + * @author Loganathan.S + */ +@Component +public class ResidentConfigServiceImpl implements ResidentConfigService { + + private static final String UI_SCHEMA_ATTRIBUTE_NAME = "mosip.resident.schema.attribute-name"; + + /** The prop keys. */ + @Value("${resident.ui.propertyKeys:}") + private String[] propKeys; + + /** The env. */ + @Autowired + private Environment env; + + /** The resident ui schema json file. */ + @Value("${resident-ui-schema-file-source-prefix}") + private String residentUiSchemaJsonFilePrefix; + + @Autowired + private ResourceLoader resourceLoader; + + /** The identity mapping json file. */ + @Value("${identity-mapping-file-source}") + private Resource identityMappingJsonFile; + + private String identityMapping; + + @Autowired + private ObjectMapper objectMapper; + + @Value("${resident.ui.properties.id}") + private String residentUiPropertiesId; + + @Value("${resident.ui.properties.version}") + private String residentUiPropertiesVersion; + + private static final Logger logger = LoggerConfiguration.logConfig(ResidentConfigServiceImpl.class); + + /** + * Gets the properties. + * + * @return the properties + */ + @Override + public ResponseWrapper getUIProperties() { + logger.debug("ResidentConfigServiceImpl::getUIProperties()::entry"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + Map properties = Arrays.stream(propKeys) + .filter(StringUtils::isNotBlank) + .map(key -> { + Object property = env.getProperty(key, Object.class); + if(property != null) { + return Map.entry(key, env.getProperty(key, Object.class)); + } + return null; + }) + .filter(entry -> entry != null && entry.getValue() != null) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + responseWrapper.setResponse(properties); + responseWrapper.setId(residentUiPropertiesId); + responseWrapper.setVersion(residentUiPropertiesVersion); + logger.debug("ResidentConfigServiceImpl::getUIProperties()::exit"); + return responseWrapper; + } + + /** + * Gets the UI schema. + * + * @return the UI schema + */ + @Override + @Cacheable(value="ui-schema", key="#schemaType") + public String getUISchema(String schemaType) { + logger.debug("ResidentConfigServiceImpl::getUISchema()::entry"); + String uiSchema; + Resource residentUiSchemaJsonFileRes = resourceLoader + .getResource(String.format("%s-%s-schema.json", residentUiSchemaJsonFilePrefix, schemaType)); + if (residentUiSchemaJsonFileRes.exists()) { + uiSchema = Utility.readResourceContent(residentUiSchemaJsonFileRes); + } else { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE); + } + logger.debug("ResidentConfigServiceImpl::getUISchema()::exit"); + return uiSchema; + } + + @Override + @Cacheable(value = "ui-schema-filtered-attributes", key = "#schemaType") + public List getUiSchemaFilteredInputAttributes(String schemaType) { + logger.debug("ResidentConfigServiceImpl::getUiSchemaFilteredInputAttributes()::entry"); + List> identityList = getUISchemaData(schemaType); + List uiSchemaFilteredInputAttributesList = identityList.stream().flatMap(map -> { + List attributeList = new ArrayList<>(); + attributeList.add((String) map.get(env.getProperty(UI_SCHEMA_ATTRIBUTE_NAME))); + if (Boolean.valueOf(String.valueOf(map.get(ResidentConstants.MASK_REQUIRED)))) { + attributeList.add(String.valueOf(map.get(ResidentConstants.MASK_ATTRIBUTE_NAME))); + } + if (Boolean.valueOf(String.valueOf(map.get(ResidentConstants.FORMAT_REQUIRED)))) { + attributeList.addAll( + ((List>) ((Map) map.get(ResidentConstants.FORMAT_OPTION)) + .entrySet().stream().findFirst().get().getValue()).stream() + .map(x -> x.get(ResidentConstants.VALUE)).collect(Collectors.toList())); + } + return attributeList.stream(); + }).distinct().collect(Collectors.toList()); + logger.debug("ResidentConfigServiceImpl::getUiSchemaFilteredInputAttributes()::exit"); + return uiSchemaFilteredInputAttributesList; + } + + @Override + public String getIdentityMapping() throws ResidentServiceCheckedException { + if(identityMapping==null) { + identityMapping=Utility.readResourceContent(identityMappingJsonFile); + } + return identityMapping; + } + + public List getSharableAttributesList(List sharableAttrList, String schemaType) + throws ResidentServiceCheckedException, JsonParseException, JsonMappingException, IOException { + logger.debug("ResidentConfigServiceImpl::getSharableAttributesList()::entry"); + // identity mapping json + Map identityMap = getIdentityMappingMap(); + + // ui schema share credential json + List> identityList = getUISchemaData(schemaType); + List idsListFromUISchema = identityList.stream().map(map -> String.valueOf(map.get(env.getProperty(UI_SCHEMA_ATTRIBUTE_NAME)))) + .collect(Collectors.toList()); + + List shareableAttributes = sharableAttrList.stream() + .flatMap(attribute -> { + List attributeList = new ArrayList<>(); + // Get the attributes from the format if specified + if(attribute.getFormat()!=null && !attribute.getFormat().isEmpty()) { + attributeList.addAll( + Stream.of(attribute.getFormat().split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)) + .collect(Collectors.toList())); + } + // Get the attributes from the identity mapping + else if(identityMap.containsKey(attribute.getAttributeName())) { + attributeList.addAll(Stream.of(String.valueOf(((Map) identityMap.get(attribute.getAttributeName())) + .get(MappingJsonConstants.VALUE)) + .split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)) + .collect(Collectors.toList())); + } + attributeList.add(attribute.getAttributeName()); + // Return the attribute name itself + return attributeList.stream(); + }) + .filter(idsListFromUISchema::contains) + .distinct() + .collect(Collectors.toList()); + logger.debug("ResidentConfigServiceImpl::getSharableAttributesList()::exit"); + return shareableAttributes; + } + + public Map getIdentityMappingMap() + throws ResidentServiceCheckedException, IOException, JsonParseException, JsonMappingException { + String identityMapping = getIdentityMapping(); + Map identityMappingMap = objectMapper + .readValue(identityMapping.getBytes(StandardCharsets.UTF_8), Map.class); + Object identityObj = identityMappingMap.get(MappingJsonConstants.IDENTITY); + Map identityMap = (Map) identityObj; + return identityMap; + } + + @Override + public List> getUISchemaData(String schemaType) { + try { + String uiSchema = getUISchema(schemaType); + Map schemaMap = objectMapper.readValue(uiSchema.getBytes(StandardCharsets.UTF_8), Map.class); + Object identitySchemaObj = schemaMap.get(MappingJsonConstants.IDENTITY); + if(identitySchemaObj instanceof List) { + List> identityList = (List>) identitySchemaObj; + return identityList; + } else { + logger.error("Error occured in accessing ui-schema identity data"); + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE); + } + } catch (IOException e) { + logger.error("Error occured in getting ui-schema %s", e.getMessage()); + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE, e); + } + } + + @Override + @Cacheable(value = "ui-schema-data-map", key = "#schemaType") + public Map>> getUISchemaCacheableData(String schemaType) { + List> uiSchemaDataList = getUISchemaData(schemaType); + List languages = uiSchemaDataList.stream().map(map -> { + return ((Map) map.get(ResidentConstants.LABEL)).keySet().stream() + .collect(Collectors.toList()); + }).findAny().orElse(List.of()); + Map>> schemaDataMap = languages.stream().map(langCode -> { + return Map.entry(langCode, getUISchemaAttributesData(uiSchemaDataList, langCode)); + }).collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + return schemaDataMap; + } + + private Map> getUISchemaAttributesData(List> uiSchemaDataList, + String langCode) { + Map> attributesDataMap = new HashMap<>(); + attributesDataMap = uiSchemaDataList.stream().map(map -> { + return Map.entry((String) map.get(ResidentConstants.ATTRIBUTE_NAME), + Map.of(ResidentConstants.LABEL, ((Map) map.get(ResidentConstants.LABEL)).get(langCode), + ResidentConstants.FORMAT_OPTION, getAttributeFormatData(map, langCode))); + }).collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + return attributesDataMap; + } + + private Map getAttributeFormatData(Map map, String langCode) { + return map.entrySet().stream().filter(formatRequired -> formatRequired.getKey().equals(ResidentConstants.FORMAT_REQUIRED)) + .filter(formatCheck -> (boolean) formatCheck.getValue()) + .map(formatData -> { + return ((List>) ((Map) map.get(ResidentConstants.FORMAT_OPTION)) + .get(langCode)) + .stream() + .map(map1 -> Map.entry(map1.get(ResidentConstants.VALUE), + map1.get(ResidentConstants.LABEL))) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + }).findAny().orElse(Map.of()); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentCredentialServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentCredentialServiceImpl.java index 33ecd861f08..d4687b494fe 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentCredentialServiceImpl.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentCredentialServiceImpl.java @@ -6,27 +6,41 @@ import java.security.SecureRandom; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; import org.apache.commons.collections.map.HashedMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; - import org.springframework.scheduling.annotation.Scheduled; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.kernel.core.exception.ExceptionUtils; import io.mosip.kernel.core.logger.spi.Logger; import io.mosip.kernel.core.util.CryptoUtil; import io.mosip.kernel.core.util.DateUtils; import io.mosip.resident.config.LoggerConfiguration; import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ConsentStatusType; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.IdType; import io.mosip.resident.constant.LoggerFileConstant; import io.mosip.resident.constant.NotificationTemplateCode; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; import io.mosip.resident.dto.CredentialCancelRequestResponseDto; import io.mosip.resident.dto.CredentialReqestDto; import io.mosip.resident.dto.CredentialRequestStatusDto; @@ -35,25 +49,32 @@ import io.mosip.resident.dto.CryptomanagerRequestDto; import io.mosip.resident.dto.CryptomanagerResponseDto; import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; import io.mosip.resident.dto.NotificationResponseDTO; import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; import io.mosip.resident.dto.PartnerResponseDto; import io.mosip.resident.dto.RequestWrapper; import io.mosip.resident.dto.ResidentCredentialRequestDto; import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResidentCredentialResponseDtoV2; import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.OtpValidationFailedException; import io.mosip.resident.exception.ResidentCredentialServiceException; import io.mosip.resident.exception.ResidentServiceCheckedException; import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; import io.mosip.resident.service.IdAuthService; import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyPartnerManagementService; import io.mosip.resident.service.ResidentCredentialService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; import io.mosip.resident.util.JsonUtil; import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; @Service public class ResidentCredentialServiceImpl implements ResidentCredentialService { @@ -63,7 +84,7 @@ public class ResidentCredentialServiceImpl implements ResidentCredentialService @Value("${crypto.PrependThumbprint.enable:true}") private boolean isPrependThumbprintEnabled; - + @Value("${PARTNER_REFERENCE_Id}") private String partnerReferenceId; @@ -79,284 +100,451 @@ public class ResidentCredentialServiceImpl implements ResidentCredentialService @Autowired private ObjectMapper mapper; - @Autowired - private AuditUtil audit; - private static final Logger logger = LoggerConfiguration.logConfig(ResidentCredentialServiceImpl.class); - + @Autowired private ResidentServiceRestClient residentServiceRestClient; - + @Autowired Environment env; + @Autowired + private Utility utility; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + @Autowired NotificationService notificationService; + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; private SecureRandom random; + @Value("${mosip.resident.request.credential.credentialType}") + private String credentialType; + + @Value("${mosip.resident.request.credential.isEncrypt:false}") + private boolean isEncrypt; + + @Value("${mosip.resident.request.credential.encryption.key:null}") + private String encryptionKey; + @Override public ResidentCredentialResponseDto reqCredential(ResidentCredentialRequestDto dto) throws ResidentServiceCheckedException { - ResidentCredentialResponseDto residentCredentialResponseDto=new ResidentCredentialResponseDto(); + Map additionalAttributes = new HashMap<>(); + try { + if (idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { + return reqCredential(dto, null); + } else { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, + additionalAttributes); + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + } + } catch (OtpValidationFailedException e) { + trySendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, + additionalAttributes); + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED_OLD_ERROR_CODE.getErrorCode(), e.getErrorText(), + e); + } + } + + @Override + public ResidentCredentialResponseDto reqCredential(ResidentCredentialRequestDto dto, String individualId) + throws ResidentServiceCheckedException { + logger.debug("ResidentCredentialServiceImpl::reqCredential()::entry"); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); RequestWrapper requestDto = new RequestWrapper<>(); ResponseWrapper parResponseDto = new ResponseWrapper(); PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); - CredentialReqestDto credentialReqestDto=new CredentialReqestDto(); - Map additionalAttributes = new HashedMap(); + CredentialReqestDto credentialReqestDto = new CredentialReqestDto(); + Map additionalAttributes = new HashMap<>(); String partnerUrl = env.getProperty(ApiName.PARTNER_API_URL.name()) + "/" + dto.getIssuer(); URI partnerUri = URI.create(partnerUrl); try { - - if (idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - - credentialReqestDto=prepareCredentialRequest(dto); - requestDto.setId("mosip.credential.request.service.id"); - requestDto.setRequest(credentialReqestDto); - requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - requestDto.setVersion("1.0"); - parResponseDto = residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class); - partnerResponseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(parResponseDto.getResponse()), - PartnerResponseDto.class); - additionalAttributes.put("partnerName", - partnerResponseDto.getOrganizationName()); - additionalAttributes.put("encryptionKey", credentialReqestDto.getEncryptionKey()); - additionalAttributes.put("credentialName", credentialReqestDto.getCredentialType()); - - ResponseWrapper responseDto = residentServiceRestClient.postApi( - env.getProperty(ApiName.CREDENTIAL_REQ_URL.name()), MediaType.APPLICATION_JSON, requestDto, - ResponseWrapper.class); - residentCredentialResponseDto = JsonUtil.readValue( - JsonUtil.writeValueAsString(responseDto.getResponse()), - ResidentCredentialResponseDto.class); - additionalAttributes.put("RID", residentCredentialResponseDto.getRequestId()); + credentialReqestDto = prepareCredentialRequest(dto, individualId); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(credentialReqestDto); + requestDto.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + requestDto.setVersion("1.0"); + parResponseDto = residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class); + partnerResponseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(parResponseDto.getResponse()), + PartnerResponseDto.class); + additionalAttributes.put("partnerName", partnerResponseDto.getOrganizationName()); + additionalAttributes.put("encryptionKey", credentialReqestDto.getEncryptionKey()); + additionalAttributes.put("credentialName", credentialReqestDto.getCredentialType()); + + ResponseWrapper responseDto = residentServiceRestClient.postApi( + env.getProperty(ApiName.CREDENTIAL_REQ_URL.name()), MediaType.APPLICATION_JSON, requestDto, + ResponseWrapper.class); + residentCredentialResponseDto = JsonUtil.readValue( + JsonUtil.writeValueAsString(responseDto.getResponse()), ResidentCredentialResponseDto.class); + additionalAttributes.put(IdType.RID.name(), residentCredentialResponseDto.getRequestId()); + if(!Utility.isSecureSession()){ sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_SUCCESS, additionalAttributes); - - } else { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), - ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, - additionalAttributes); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_EXCEPTION); - throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), - ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); } - - } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_EXCEPTION); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, - additionalAttributes); - throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), - e.getErrorText(), e); + + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + if(!Utility.isSecureSession()){ + sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, additionalAttributes); } - - catch (ResidentServiceCheckedException e) { - - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, additionalAttributes); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_EXCEPTION); - throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); - } - catch (ApisResourceAccessException e) { - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, additionalAttributes); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); - } - catch (IOException e) { - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, additionalAttributes); - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_EXCEPTION); + } catch (IOException e) { + if(!Utility.isSecureSession()){ + sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_CRE_REQ_FAILURE, additionalAttributes); + } throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); } - + logger.debug("ResidentCredentialServiceImpl::reqCredential()::exit"); return residentCredentialResponseDto; } - + + @Override + public Tuple2 shareCredential(ResidentCredentialRequestDto dto, + String purpose, List sharableAttributes) throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentCredentialServiceImpl::shareCredential()::entry"); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + ResidentCredentialResponseDtoV2 residentCredentialResponseDtoV2=new ResidentCredentialResponseDtoV2(); + RequestWrapper requestDto = new RequestWrapper<>(); + CredentialReqestDto credentialReqestDto = new CredentialReqestDto(); + Map additionalAttributes = new HashMap<>(); + additionalAttributes.put(TemplateVariablesConstants.PARTNER_ID, dto.getIssuer()); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + try { + residentTransactionEntity = createResidentTransactionEntity(dto, individualId, purpose, sharableAttributes); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + } + if (dto.getConsent() == null || dto.getConsent().trim().isEmpty() + || !dto.getConsent().equalsIgnoreCase(ConsentStatusType.ACCEPTED.name())) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.SHARE_CRED_WITH_PARTNER.name(), EventStatusFailure.FAILED.name())); + throw new ResidentServiceException(ResidentErrorCode.CONSENT_DENIED.getErrorCode(), + ResidentErrorCode.CONSENT_DENIED.getErrorMessage()); + } + credentialReqestDto = prepareCredentialRequest(dto, individualId); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(credentialReqestDto); + requestDto.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + requestDto.setVersion("1.0"); + + ResponseWrapper responseDto = residentServiceRestClient.postApi( + env.getProperty(ApiName.CREDENTIAL_REQ_URL.name()), MediaType.APPLICATION_JSON, requestDto, + ResponseWrapper.class); + residentCredentialResponseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(responseDto.getResponse()), + ResidentCredentialResponseDto.class); + sendNotificationV2(individualId, RequestType.SHARE_CRED_WITH_PARTNER, TemplateType.REQUEST_RECEIVED, + eventId, additionalAttributes); + + updateResidentTransaction(dto, residentCredentialResponseDto, residentTransactionEntity); + residentCredentialResponseDtoV2.setStatus(ResidentConstants.SUCCESS); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + if (residentTransactionEntity != null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.SHARE_CRED_WITH_PARTNER.name(), EventStatusFailure.FAILED.name())); + } + sendNotificationV2(individualId, RequestType.SHARE_CRED_WITH_PARTNER, TemplateType.FAILURE, + eventId, additionalAttributes); + throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } catch (IOException e) { + if (residentTransactionEntity != null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.SHARE_CRED_WITH_PARTNER.name(), EventStatusFailure.FAILED.name())); + } + sendNotificationV2(individualId, RequestType.SHARE_CRED_WITH_PARTNER, TemplateType.FAILURE, + eventId, additionalAttributes); + throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION, e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } finally { + if (residentTransactionEntity != null) { + //if the status code or request summary will come as null, it will set it as failed. + if(residentTransactionEntity.getStatusCode() == null || residentTransactionEntity.getRequestSummary() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.SHARE_CRED_WITH_PARTNER.name(), EventStatusFailure.FAILED.name())); + } + residentTransactionRepository.save(residentTransactionEntity); + } + } + logger.debug("ResidentCredentialServiceImpl::shareCredential()::exit"); + return Tuples.of(residentCredentialResponseDtoV2, eventId); + } + + private ResidentTransactionEntity createResidentTransactionEntity(ResidentCredentialRequestDto dto, + String individualId, String purpose, List sharableAttributes) throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.SHARE_CRED_WITH_PARTNER); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setTokenId(identityServiceImpl.getResidentIdaToken()); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + if (purpose != null) { + residentTransactionEntity.setPurpose(purpose); + } + if (sharableAttributes != null && !sharableAttributes.isEmpty()) { + String data = sharableAttributes.stream().map(map -> { + if (map.getFormat() != null && !map.getFormat().isEmpty()) { + return String.format("%s%s%s", map.getAttributeName(), ResidentConstants.COLON, map.getFormat()); + } else { + return map.getAttributeName(); + } + }).collect(Collectors.joining(ResidentConstants.SEMI_COLON)); + residentTransactionEntity.setAttributeList(data); + } + residentTransactionEntity.setRequestedEntityId(dto.getIssuer()); + Map partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType( + dto.getIssuer(), env.getProperty(ResidentConstants.RESIDENT_SHARE_CREDENTIAL_PARTNER_TYPE, + ResidentConstants.AUTH_PARTNER)); + residentTransactionEntity.setRequestedEntityName((String) partnerDetail.get(ResidentConstants.ORGANIZATION_NAME)); + residentTransactionEntity.setRequestedEntityType((String) partnerDetail.get(ResidentConstants.PARTNER_TYPE)); + residentTransactionEntity.setConsent(dto.getConsent()); + return residentTransactionEntity; + } + + private void updateResidentTransaction(ResidentCredentialRequestDto dto, + ResidentCredentialResponseDto residentCredentialResponseDto, + ResidentTransactionEntity residentTransactionEntity) { + // TODO: need to fix transaction ID (need partner's end transactionId) + residentTransactionEntity.setRequestTrnId(dto.getTransactionID()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setStatusComment(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.SHARE_CRED_WITH_PARTNER.name(), EventStatusInProgress.NEW.name())); + residentTransactionEntity.setAid(residentCredentialResponseDto.getRequestId()); + residentTransactionEntity.setCredentialRequestId(residentCredentialResponseDto.getRequestId()); + } @Override public byte[] getCard(String requestId) throws Exception { - // TODO Auto-generated method stub - ResponseWrapper responseDto = null; - CredentialRequestStatusDto credentialRequestStatusResponseDto = new CredentialRequestStatusDto(); + return getCard(requestId, applicationId, partnerReferenceId); + } + @Override + public byte[] getCard(String requestId, String appId, String partnerRefId) throws ResidentServiceCheckedException { try { - UUID requestUUID = UUID.fromString(requestId); - String credentialUrl = env.getProperty(ApiName.CREDENTIAL_STATUS_URL.name()) + requestUUID; - URI credentailStatusUri = URI.create(credentialUrl); - responseDto = residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class); - credentialRequestStatusResponseDto = JsonUtil.readValue( - JsonUtil.writeValueAsString(responseDto.getResponse()), CredentialRequestStatusDto.class); - URI dataShareUri = URI.create(credentialRequestStatusResponseDto.getUrl()); - String encryptedData = residentServiceRestClient.getApi(dataShareUri, String.class); - RequestWrapper request = new RequestWrapper<>(); - CryptomanagerRequestDto cryptomanagerRequestDto = new CryptomanagerRequestDto(); - cryptomanagerRequestDto.setApplicationId(applicationId); - cryptomanagerRequestDto.setData(encryptedData); - cryptomanagerRequestDto.setReferenceId(partnerReferenceId); - cryptomanagerRequestDto.setPrependThumbprint(isPrependThumbprintEnabled); - LocalDateTime localdatetime = LocalDateTime.now(); - request.setRequesttime(localdatetime.toString()); - cryptomanagerRequestDto.setTimeStamp(localdatetime); - request.setRequest(cryptomanagerRequestDto); - String response = residentServiceRestClient.postApi( - env.getProperty(ApiName.DECRYPT_API_URL.name()), MediaType.APPLICATION_JSON, request, - String.class); - CryptomanagerResponseDto responseObject = mapper.readValue(response, CryptomanagerResponseDto.class); - return CryptoUtil.decodeURLSafeBase64(responseObject.getResponse().getData()); + String dataShareUrl = getDataShareUrl(requestId); + URI dataShareUri = URI.create(dataShareUrl); + if(appId!=null){ + return getDataShareData(appId, partnerRefId, dataShareUri); + }else { + return residentServiceRestClient.getApi(dataShareUri, byte[].class); + } } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.REQ_CARD_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); } catch (IllegalArgumentException e) { - audit.setAuditRequestDto(EventEnum.REQ_CARD_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.INVALID_ID.getErrorCode(), ResidentErrorCode.INVALID_ID.getErrorMessage(), e); } catch (IOException e) { - audit.setAuditRequestDto(EventEnum.REQ_CARD_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } catch (ResidentServiceCheckedException e) { + throw e; + } + + } + + @Override + public String getDataShareUrl(String requestId) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + logger.debug("ResidentCredentialServiceImpl::getDataShareUrl()::entry"); + ResponseWrapper responseDto = null; + CredentialRequestStatusDto credentialRequestStatusResponseDto = new CredentialRequestStatusDto(); + String credentialUrl = ""; + if(requestId.contains(utility.getRidDeliMeterValue())) { + credentialUrl = env.getProperty(ApiName.CREDENTIAL_STATUS_URL.name()) + requestId; + } else { + UUID requestUUID = UUID.fromString(requestId); + credentialUrl = env.getProperty(ApiName.CREDENTIAL_STATUS_URL.name()) + requestUUID; } + URI credentailStatusUri = URI.create(credentialUrl); + responseDto = residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class); + credentialRequestStatusResponseDto = JsonUtil.readValue( + JsonUtil.writeValueAsString(responseDto.getResponse()), CredentialRequestStatusDto.class); + + if (credentialRequestStatusResponseDto != null) { + if(EventStatusSuccess.STORED.name().equals(credentialRequestStatusResponseDto.getStatusCode()) + && credentialRequestStatusResponseDto.getUrl() != null + && !credentialRequestStatusResponseDto.getUrl().isEmpty()) { + logger.debug("ResidentCredentialServiceImpl::getDataShareUrl()::exit"); + return credentialRequestStatusResponseDto.getUrl(); + } else { + logger.error("Data share URL is not available."); + throw new ResidentCredentialServiceException(ResidentErrorCode.CARD_NOT_READY.getErrorCode(), + ResidentErrorCode.CARD_NOT_READY.getErrorMessage()); + } + } else { + throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + } + } + public byte[] getDataShareData(String appId, String partnerRefId, URI dataShareUri) + throws ApisResourceAccessException, JsonProcessingException, JsonMappingException { + logger.debug("ResidentCredentialServiceImpl::getDataShareData()::entry"); + String downloadedData = residentServiceRestClient.getApi(dataShareUri, String.class); + RequestWrapper request = new RequestWrapper<>(); + CryptomanagerRequestDto cryptomanagerRequestDto = new CryptomanagerRequestDto(); + cryptomanagerRequestDto.setApplicationId(appId); + cryptomanagerRequestDto.setData(downloadedData); + cryptomanagerRequestDto.setReferenceId(partnerRefId); + cryptomanagerRequestDto.setPrependThumbprint(isPrependThumbprintEnabled); + LocalDateTime localdatetime = DateUtils.getUTCCurrentDateTime(); + request.setRequesttime(DateUtils.formatToISOString(localdatetime)); + cryptomanagerRequestDto.setTimeStamp(localdatetime); + request.setRequest(cryptomanagerRequestDto); + String response = residentServiceRestClient.postApi(env.getProperty(ApiName.DECRYPT_API_URL.name()), + MediaType.APPLICATION_JSON, request, String.class); + CryptomanagerResponseDto responseObject = mapper.readValue(response, CryptomanagerResponseDto.class); + logger.debug("ResidentCredentialServiceImpl::getDataShareData()::exit"); + return CryptoUtil.decodeURLSafeBase64(responseObject.getResponse().getData()); } @Override public CredentialRequestStatusResponseDto getStatus(String requestId) { + logger.debug("ResidentCredentialServiceImpl::getStatus()::entry"); ResponseWrapper responseDto = null; CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); Map additionalAttributes = new HashedMap(); - CredentialRequestStatusResponseDto credentialRequestStatusResponseDto=new CredentialRequestStatusResponseDto(); + CredentialRequestStatusResponseDto credentialRequestStatusResponseDto = new CredentialRequestStatusResponseDto(); try { UUID requestUUID = UUID.fromString(requestId); String credentialUrl = env.getProperty(ApiName.CREDENTIAL_STATUS_URL.name()) + requestUUID; URI credentailStatusUri = URI.create(credentialUrl); - responseDto =residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class); - credentialRequestStatusDto = JsonUtil - .readValue(JsonUtil.writeValueAsString(responseDto.getResponse()), CredentialRequestStatusDto.class); + responseDto = residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class); + credentialRequestStatusDto = JsonUtil.readValue(JsonUtil.writeValueAsString(responseDto.getResponse()), + CredentialRequestStatusDto.class); credentialRequestStatusResponseDto.setId(credentialRequestStatusDto.getId()); credentialRequestStatusResponseDto.setRequestId(credentialRequestStatusDto.getRequestId()); credentialRequestStatusResponseDto.setStatusCode(credentialRequestStatusDto.getStatusCode()); - additionalAttributes.put("RID", credentialRequestStatusResponseDto.getRequestId()); + additionalAttributes.put(IdType.RID.name(), credentialRequestStatusResponseDto.getRequestId()); additionalAttributes.put("status", credentialRequestStatusResponseDto.getStatusCode()); sendNotification(credentialRequestStatusResponseDto.getId(), NotificationTemplateCode.RS_CRE_STATUS, additionalAttributes); } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); - } - catch(IOException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); + } catch (IOException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); - } - catch (IllegalArgumentException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); + } catch (IllegalArgumentException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.INVALID_ID.getErrorCode(), ResidentErrorCode.INVALID_ID.getErrorMessage(), e); - } - catch (ResidentServiceCheckedException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); + } catch (ResidentServiceCheckedException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); } + logger.debug("ResidentCredentialServiceImpl::getStatus()::exit"); return credentialRequestStatusResponseDto; } - public CredentialReqestDto prepareCredentialRequest(ResidentCredentialRequestDto residentCreDto) { - CredentialReqestDto crDto=new CredentialReqestDto(); - crDto.setAdditionalData(residentCreDto.getAdditionalData()); - crDto.setCredentialType(residentCreDto.getCredentialType()); - crDto.setEncrypt(residentCreDto.isEncrypt()); - crDto.setId(residentCreDto.getIndividualId()); - crDto.setRecepiant(residentCreDto.getRecepiant()); - crDto.setSharableAttributes(residentCreDto.getSharableAttributes()); - crDto.setUser(residentCreDto.getUser()); - crDto.setIssuer(residentCreDto.getIssuer()); - if (residentCreDto.getEncryptionKey().isEmpty()) { - crDto.setEncryptionKey(generatePin()); + private CredentialReqestDto prepareCredentialRequest(ResidentCredentialRequestDto residentCreDto, String individualId) { + logger.debug("ResidentCredentialServiceImpl::prepareCredentialRequest()::entry"); + CredentialReqestDto crDto = new CredentialReqestDto(); + if(Utility.isSecureSession()){ + crDto.setId(individualId); + crDto.setCredentialType(credentialType); + crDto.setEncrypt(isEncrypt); + crDto.setEncryptionKey(encryptionKey); } else { - crDto.setEncryptionKey(residentCreDto.getEncryptionKey()); + crDto.setId(residentCreDto.getIndividualId()); + crDto.setCredentialType(residentCreDto.getCredentialType()); + crDto.setEncrypt(residentCreDto.isEncrypt()); + if (residentCreDto.getEncryptionKey() == null || residentCreDto.getEncryptionKey().isEmpty()) { + crDto.setEncryptionKey(generatePin()); + } else { + crDto.setEncryptionKey(residentCreDto.getEncryptionKey()); + } + crDto.setRecepiant(residentCreDto.getRecepiant()); + crDto.setUser(residentCreDto.getUser()); } + crDto.setSharableAttributes(residentCreDto.getSharableAttributes()); + crDto.setAdditionalData(residentCreDto.getAdditionalData()); + crDto.setIssuer(residentCreDto.getIssuer()); + logger.debug("ResidentCredentialServiceImpl::prepareCredentialRequest()::exit"); return crDto; - } - @Override public CredentialCancelRequestResponseDto cancelCredentialRequest(String requestId) { + logger.debug("ResidentCredentialServiceImpl::cancelCredentialRequest()::exit"); ResponseWrapper response = new ResponseWrapper(); Map additionalAttributes = new HashedMap(); - CredentialCancelRequestResponseDto credentialCancelRequestResponseDto=new CredentialCancelRequestResponseDto(); + CredentialCancelRequestResponseDto credentialCancelRequestResponseDto = new CredentialCancelRequestResponseDto(); try { - UUID requestUUID = UUID.fromString(requestId); - String credentialReqCancelUrl = env.getProperty(ApiName.CREDENTIAL_CANCELREQ_URL.name()) + requestUUID; - URI credentailReqCancelUri = URI.create(credentialReqCancelUrl); - response = residentServiceRestClient.getApi(credentailReqCancelUri, ResponseWrapper.class); - if (response.getErrors() != null && !response.getErrors().isEmpty()) { - throw new ResidentCredentialServiceException(response.getErrors().get(0).getErrorCode(), - response.getErrors().get(0).getMessage()); - } - credentialCancelRequestResponseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(response.getResponse()), - CredentialCancelRequestResponseDto.class); - additionalAttributes.put("RID", credentialCancelRequestResponseDto.getRequestId()); - sendNotification(credentialCancelRequestResponseDto.getId(), - NotificationTemplateCode.RS_CRE_CANCEL_SUCCESS, additionalAttributes); + UUID requestUUID = UUID.fromString(requestId); + String credentialReqCancelUrl = env.getProperty(ApiName.CREDENTIAL_CANCELREQ_URL.name()) + requestUUID; + URI credentailReqCancelUri = URI.create(credentialReqCancelUrl); + response = residentServiceRestClient.getApi(credentailReqCancelUri, ResponseWrapper.class); + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + throw new ResidentCredentialServiceException(response.getErrors().get(0).getErrorCode(), + response.getErrors().get(0).getMessage()); + } + credentialCancelRequestResponseDto = JsonUtil.readValue(JsonUtil.writeValueAsString(response.getResponse()), + CredentialCancelRequestResponseDto.class); + additionalAttributes.put(IdType.RID.name(), credentialCancelRequestResponseDto.getRequestId()); + sendNotification(credentialCancelRequestResponseDto.getId(), NotificationTemplateCode.RS_CRE_CANCEL_SUCCESS, + additionalAttributes); } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_CANCEL_REQ_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); - } - catch (IllegalArgumentException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_REQ_STATUS_EXCEPTION); + } catch (IllegalArgumentException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.INVALID_ID.getErrorCode(), ResidentErrorCode.INVALID_ID.getErrorMessage(), e); - } - catch (IOException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_CANCEL_REQ_EXCEPTION); + } catch (IOException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); } catch (ResidentServiceCheckedException e) { - audit.setAuditRequestDto(EventEnum.CREDENTIAL_CANCEL_REQ_EXCEPTION); throw new ResidentCredentialServiceException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage()); } - - + logger.debug("ResidentCredentialServiceImpl::cancelCredentialRequest()::exit"); return credentialCancelRequestResponseDto; } @Override public CredentialTypeResponse getCredentialTypes() { - CredentialTypeResponse credentialTypeResponse=new CredentialTypeResponse(); + logger.debug("ResidentCredentialServiceImpl::getCredentialTypes()::entry"); + CredentialTypeResponse credentialTypeResponse = new CredentialTypeResponse(); URI credentailTypesUri = URI.create(env.getProperty(ApiName.CREDENTIAL_TYPES_URL.name())); try { - credentialTypeResponse=residentServiceRestClient.getApi(credentailTypesUri, CredentialTypeResponse.class); - } catch (ApisResourceAccessException e) { + credentialTypeResponse = residentServiceRestClient.getApi(credentailTypesUri, CredentialTypeResponse.class); + } catch (ApisResourceAccessException e) { throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); } + logger.debug("ResidentCredentialServiceImpl::getCredentialTypes()::exit"); return credentialTypeResponse; } @Override public ResponseWrapper getPolicyByCredentialType(String partnerId, - String credentialType) - { + String credentialType) { + logger.debug("ResidentCredentialServiceImpl::getPolicyByCredentialType()::entry"); ResponseWrapper response = new ResponseWrapper(); Map pathsegments = new HashMap<>(); pathsegments.put("partnerId", partnerId); pathsegments.put("credentialType", credentialType); try { - response = residentServiceRestClient.getApi(ApiName.POLICY_REQ_URL, pathsegments, - ResponseWrapper.class); - } catch (Exception e) { - audit.setAuditRequestDto(EventEnum.REQ_POLICY_EXCEPTION); - throw new ResidentCredentialServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), - ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + response = residentServiceRestClient.getApi(ApiName.POLICY_REQ_URL, pathsegments, ResponseWrapper.class); + } catch (ApisResourceAccessException e) { + throw new ResidentCredentialServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); } + logger.debug("ResidentCredentialServiceImpl::getPolicyByCredentialType()::exit"); return response; } @@ -367,9 +555,7 @@ public String generatePin() { return String.valueOf(randomInteger); } - - @Scheduled(fixedDelayString = "${mosip.resident.pingeneration.refresh.millisecs:1800000}", - initialDelayString = "${mosip.resident.pingeneration.refresh.delay-on-startup.millisecs:5000}") + @Scheduled(fixedDelayString = "${mosip.resident.pingeneration.refresh.millisecs:1800000}", initialDelayString = "${mosip.resident.pingeneration.refresh.delay-on-startup.millisecs:5000}") public void instantiate() { logger.debug("Instantiating SecureRandom for credential pin generation............"); try { @@ -377,32 +563,38 @@ public void instantiate() { } catch (NoSuchAlgorithmException e) { logger.error("Could not instantiate SecureRandom for pin generation", e); } - } + } - private NotificationResponseDTO sendNotification(String id, - NotificationTemplateCode templateTypeCode, Map additionalAttributes) - throws ResidentServiceCheckedException { + private NotificationResponseDTO trySendNotification(String id, NotificationTemplateCode templateTypeCode, + Map additionalAttributes) throws ResidentServiceCheckedException { + try { + return sendNotification(id, templateTypeCode, additionalAttributes); + } catch (Exception e1) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode() + + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage() + + ExceptionUtils.getStackTrace(e1)); + } + return null; + } + + private NotificationResponseDTO sendNotification(String id, NotificationTemplateCode templateTypeCode, + Map additionalAttributes) throws ResidentServiceCheckedException { NotificationRequestDto notificationRequest = new NotificationRequestDto(id, templateTypeCode, additionalAttributes); - return notificationService.sendNotification(notificationRequest); + return notificationService.sendNotification(notificationRequest, null); + } + + private NotificationResponseDTO sendNotificationV2(String id, RequestType requestType, TemplateType templateType, + String eventId, Map additionalAttributes) throws ResidentServiceCheckedException { + + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(id); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + notificationRequestDtoV2.setAdditionalAttributes(additionalAttributes); + return notificationService.sendNotification(notificationRequestDtoV2, null); } - /* - * private PartnerCredentialTypePolicyResponseDto policyMapper( - * PartnerCredentialTypePolicyDto partnerCredentialTypePolicyDto) { - * PartnerCredentialTypePolicyResponseDto policy = new - * PartnerCredentialTypePolicyResponseDto(); - * policy.setCr_by(partnerCredentialTypePolicyDto.getCr_by()); - * policy.setCr_dtimes(partnerCredentialTypePolicyDto.getCr_dtimes()); - * policy.setCredentialType(partnerCredentialTypePolicyDto.getCredentialType()); - * policy.setIs_Active(partnerCredentialTypePolicyDto.getIs_Active()); - * policy.setPartnerId(partnerCredentialTypePolicyDto.getPartnerId()); - * policy.setPolicyDesc(partnerCredentialTypePolicyDto.getPolicyDesc()); - * policy.setPolicyId(policyId); policy.setPolicyName(policyName); - * policy.setPolicyType(policyType); policy.setPublishDate(publishDate); - * policy.setSchema(schema); policy.setStatus(status); policy.setUp_by(up_by); - * policy.setUpd_dtimes(upd_dtimes); policy.setVersion(version); - * policy.setValidTill(validTill); - * - * } - */ -} \ No newline at end of file +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentOtpServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentOtpServiceImpl.java index 04430762a55..c3c61020056 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentOtpServiceImpl.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentOtpServiceImpl.java @@ -1,46 +1,138 @@ package io.mosip.resident.service.impl; +import static io.mosip.resident.constant.ResidentConstants.ATTRIBUTE_LIST_DELIMITER; +import static io.mosip.resident.constant.ResidentConstants.OTP; + +import java.security.NoSuchAlgorithmException; +import java.util.stream.Collectors; + +import io.mosip.resident.dto.IdentityDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.IndividualIdResponseDto; import io.mosip.resident.dto.OtpRequestDTO; import io.mosip.resident.dto.OtpResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; import io.mosip.resident.service.ResidentOtpService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; import io.mosip.resident.util.ResidentServiceRestClient; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; @Service public class ResidentOtpServiceImpl implements ResidentOtpService { + public static final String EMAIL_CHANNEL = "EMAIL"; + public static final String PHONE_CHANNEL = "PHONE"; + @Autowired private ResidentServiceRestClient residentServiceRestClient; + private static final Logger logger = LoggerConfiguration.logConfig(ResidentOtpServiceImpl.class); + @Autowired Environment env; @Autowired - private AuditUtil audit; + private IdentityServiceImpl identityServiceImpl; + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private Utility utility; + + @Autowired + private ObjectMapper objectMapper; + @Override - public OtpResponseDTO generateOtp(OtpRequestDTO otpRequestDTO) { + public OtpResponseDTO generateOtp(OtpRequestDTO otpRequestDTO) throws NoSuchAlgorithmException, ResidentServiceCheckedException { + logger.debug("ResidentOtpServiceImpl::generateOtp()::entry"); OtpResponseDTO responseDto = null; try { responseDto = residentServiceRestClient.postApi( env.getProperty(ApiName.OTP_GEN_URL.name()), MediaType.APPLICATION_JSON, otpRequestDTO, OtpResponseDTO.class); + if((responseDto.getErrors() ==null || responseDto.getErrors().isEmpty() )&& responseDto.getResponse()!= null) { + { + insertData(otpRequestDTO); + } + } } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.OTP_GEN_EXCEPTION); + throw new ResidentServiceException(ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorCode(), + ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorMessage(), e); + } catch (ResidentServiceCheckedException | NoSuchAlgorithmException e) { + logger.error(ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorCode(), + ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorMessage(), e); throw new ResidentServiceException(ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorCode(), ResidentErrorCode.OTP_GENERATION_EXCEPTION.getErrorMessage(), e); } + logger.debug("ResidentOtpServiceImpl::generateOtp()::exit"); return responseDto; } + @Override + public void insertData(OtpRequestDTO otpRequestDTO) throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.SEND_OTP); + String individualId = otpRequestDTO.getIndividualId(); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRequestTrnId(otpRequestDTO.getTransactionID()); + String attributeList = otpRequestDTO.getOtpChannel().stream().map(String::toUpperCase).collect(Collectors.joining(ATTRIBUTE_LIST_DELIMITER)); + residentTransactionEntity.setAttributeList(attributeList); + residentTransactionEntity.setAuthTypeCode(OTP); + residentTransactionEntity.setRequestSummary("OTP Generated"); + residentTransactionEntity.setStatusCode(EventStatusInProgress.OTP_REQUESTED.name()); + residentTransactionEntity.setStatusComment("OTP_REQUESTED"); + residentTransactionEntity.setRefIdType(identityServiceImpl.getIndividualIdType(individualId).name()); + IdentityDTO identityDTO = identityServiceImpl.getIdentity(individualId); + String idaToken= identityServiceImpl.getIDAToken(identityDTO.getUIN()); + if( otpRequestDTO.getOtpChannel()!=null && otpRequestDTO.getOtpChannel().size()==1){ + residentTransactionEntity.setRefId(utility.getIdForResidentTransaction(otpRequestDTO.getOtpChannel(), + identityDTO, idaToken)); + } else{ + residentTransactionEntity.setRefId(utility.getRefIdHash(individualId)); + } + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setTokenId(idaToken); + residentTransactionRepository.save(residentTransactionEntity); + } + + @Override + public IndividualIdResponseDto generateOtpForIndividualId(IndividualIdOtpRequestDTO individualIdRequestDto) + throws NoSuchAlgorithmException, ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("ResidentOtpServiceImpl::generateOtpForIndividualId()::entry"); + try { + Tuple2 individualIdAndType = identityServiceImpl.getIdAndTypeForIndividualId(individualIdRequestDto.getIndividualId()); + individualIdRequestDto.setIndividualId(individualIdAndType.getT1()); + OtpRequestDTO otpRequestDTO = objectMapper.convertValue(individualIdRequestDto, OtpRequestDTO.class); + otpRequestDTO.setTransactionID(individualIdRequestDto.getTransactionId()); + OtpResponseDTO otpResponseDTO = generateOtp(otpRequestDTO); + IndividualIdResponseDto individualIdResponseDto = objectMapper.convertValue(otpResponseDTO, IndividualIdResponseDto.class); + if(individualIdResponseDto!=null){ + individualIdResponseDto.setTransactionId(otpResponseDTO.getTransactionID()); + } + logger.debug("ResidentOtpServiceImpl::generateOtpForIndividualId()::exit"); + return individualIdResponseDto; + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.AID_STATUS_IS_NOT_READY); + } + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentServiceImpl.java index cae5270f984..7540c943f99 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentServiceImpl.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentServiceImpl.java @@ -1,20 +1,47 @@ package io.mosip.resident.service.impl; -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.CryptoUtil; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.AuthTypeStatus; -import io.mosip.resident.constant.*; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.*; -import io.mosip.resident.handler.service.ResidentUpdateService; -import io.mosip.resident.handler.service.UinCardRePrintService; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.ResidentService; -import io.mosip.resident.util.*; +import static io.mosip.resident.constant.EventStatusSuccess.CARD_DOWNLOADED; +import static io.mosip.resident.constant.EventStatusSuccess.LOCKED; +import static io.mosip.resident.constant.EventStatusSuccess.UNLOCKED; +import static io.mosip.resident.constant.MappingJsonConstants.IDSCHEMA_VERSION; +import static io.mosip.resident.constant.RegistrationConstants.UIN_LABEL; +import static io.mosip.resident.constant.RegistrationConstants.VID_LABEL; +import static io.mosip.resident.constant.ResidentConstants.ATTRIBUTE_LIST_DELIMITER; +import static io.mosip.resident.constant.ResidentConstants.RESIDENT_NOTIFICATIONS_DEFAULT_PAGE_SIZE; +import static io.mosip.resident.constant.ResidentConstants.SEMI_COLON; +import static io.mosip.resident.constant.ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER; +import static io.mosip.resident.constant.ResidentErrorCode.MACHINE_MASTER_CREATE_EXCEPTION; +import static io.mosip.resident.constant.ResidentErrorCode.PACKET_SIGNKEY_EXCEPTION; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Month; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import javax.annotation.PostConstruct; + +import io.mosip.resident.constant.EventStatusCanceled; +import io.mosip.resident.validator.RequestValidator; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -26,16 +53,128 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; -import static io.mosip.resident.constant.ResidentErrorCode.MACHINE_MASTER_CREATE_EXCEPTION; -import static io.mosip.resident.constant.ResidentErrorCode.PACKET_SIGNKEY_EXCEPTION; +import io.mosip.commons.khazana.exception.ObjectStoreAdapterException; +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectValidationFailedException; +import io.mosip.kernel.core.idobjectvalidator.spi.IdObjectValidator; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.core.templatemanager.spi.TemplateManagerBuilder; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.ConsentStatusType; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.NotificationTemplateCode; +import io.mosip.resident.constant.RegistrationExternalStatusCode; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AidStatusResponseDTO; +import io.mosip.resident.dto.AuthHistoryRequestDTO; +import io.mosip.resident.dto.AuthHistoryResponseDTO; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthLockStatusResponseDtoV2; +import io.mosip.resident.dto.AuthTxnDetailsDTO; +import io.mosip.resident.dto.AuthTypeStatusDtoV2; +import io.mosip.resident.dto.AuthUnLockRequestDTO; +import io.mosip.resident.dto.BellNotificationDto; +import io.mosip.resident.dto.DocumentResponseDTO; +import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.EventStatusResponseDTO; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.MachineCreateRequestDTO; +import io.mosip.resident.dto.MachineCreateResponseDTO; +import io.mosip.resident.dto.MachineDto; +import io.mosip.resident.dto.MachineSearchRequestDTO; +import io.mosip.resident.dto.MachineSearchResponseDTO; +import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.PacketSignPublicKeyRequestDTO; +import io.mosip.resident.dto.PacketSignPublicKeyResponseDTO; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.RegProcRePrintRequestDto; +import io.mosip.resident.dto.RegStatusCheckResponseDTO; +import io.mosip.resident.dto.RegistrationStatusRequestDTO; +import io.mosip.resident.dto.RegistrationStatusResponseDTO; +import io.mosip.resident.dto.RegistrationStatusSubRequestDto; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.dto.RequestDTO; +import io.mosip.resident.dto.ResidentDocuments; +import io.mosip.resident.dto.ResidentIndividialIDType; +import io.mosip.resident.dto.ResidentReprintRequestDto; +import io.mosip.resident.dto.ResidentReprintResponseDto; +import io.mosip.resident.dto.ResidentUpdateDto; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResidentUpdateResponseDTO; +import io.mosip.resident.dto.ResidentUpdateResponseDTOV2; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.dto.UnreadNotificationDto; +import io.mosip.resident.dto.UserInfoDto; +import io.mosip.resident.entity.ResidentSessionEntity; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.entity.ResidentUserEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.CardNotReadyException; +import io.mosip.resident.exception.EventIdNotPresentException; +import io.mosip.resident.exception.InvalidRequestTypeCodeException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.RIDInvalidException; +import io.mosip.resident.exception.ResidentMachineServiceException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.exception.ResidentServiceTPMSignKeyException; +import io.mosip.resident.exception.ValidationFailedException; +import io.mosip.resident.handler.service.ResidentUpdateService; +import io.mosip.resident.handler.service.UinCardRePrintService; +import io.mosip.resident.repository.ResidentSessionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.repository.ResidentUserRepository; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.PartnerService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.AuditEnum; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.UINCardDownloadHelper; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; @Service public class ResidentServiceImpl implements ResidentService { + private static final String NA = "NA"; + private static final String IDREPO_DUMMY_ONLINE_VERIFICATION_PARTNER_ID = "idrepo-dummy-online-verification-partner-id"; + private static final String ONLINE_VERIFICATION_PARTNER = "Online_Verification_Partner"; + private static final String MOSIP_IDA_PARTNER_TYPE = "mosip.ida.partner.type"; + private static final int UPDATE_COUNT_FOR_NEW_USER_ACTION_ENTITY = 1; + private static final String AUTH_TYPE_SEPERATOR = "-"; + private static final String PROCESSED = "PROCESSED"; private static final String DATETIME_PATTERN = "mosip.utc-datetime-pattern"; private static final String STATUS_CHECK_ID = "mosip.resident.service.status.check.id"; private static final String STATUS_CHECEK_VERSION = "mosip.resident.service.status.check.version"; @@ -49,11 +188,16 @@ public class ResidentServiceImpl implements ResidentService { private static final String VALUE = "value"; private static final String DOCUMENT = "documents"; private static final String SERVER_PROFILE_SIGN_KEY = "PROD"; - + private static final String UIN = "uin"; + private static final String IMAGE = "mosip.resident.photo.token.claim-photo"; private static final Logger logger = LoggerConfiguration.logConfig(ResidentServiceImpl.class); + private static final Integer DEFAULT_PAGE_INDEX = 0; + private static final Integer DEFAULT_PAGE_SIZE = 10; + private static final String CLASSPATH = "classpath"; + private static final String ENCODE_TYPE = "UTF-8"; @Autowired - private UINCardDownloadService uinCardDownloadService; + private UINCardDownloadHelper uinCardDownloadHelper; @Autowired private ResidentUpdateService residentUpdateService; @@ -62,7 +206,13 @@ public class ResidentServiceImpl implements ResidentService { private IdAuthService idAuthService; @Autowired - NotificationService notificationService; + private NotificationService notificationService; + + @Autowired + private PartnerService partnerService; + + @Autowired + private IdentityServiceImpl identityServiceImpl; @Autowired private ResidentServiceRestClient residentServiceRestClient; @@ -70,17 +220,33 @@ public class ResidentServiceImpl implements ResidentService { @Autowired private UinCardRePrintService rePrintService; + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + @Autowired Environment env; @Autowired - private Utilitiy utility; + private TemplateUtil templateUtil; + + @Autowired + public Utility utility; + + @Autowired + private Utilities utilities; - @Autowired - private Utilities utilities; + @Value("${ida.online-verification-partner-id}") + private String onlineVerificationPartnerId; - @Value("${resident.center.id}") - private String centerId; + /** The json validator. */ + @Autowired + private IdObjectValidator idObjectValidator; + + @Autowired + private RequestValidator requestValidator; + + @Value("${resident.center.id}") + private String centerId; @Value("${resident.machine.id}") private String machineId; @@ -94,11 +260,96 @@ public class ResidentServiceImpl implements ResidentService { @Value("${resident.update-uin.machine-zone-code}") private String zoneCode; + @Value("${resident.service.history.id}") + private String serviceHistoryId; + + @Value("${resident.service.history.version}") + private String serviceHistoryVersion; + + @Value("${resident.service.event.id}") + private String serviceEventId; + + @Value("${resident.service.event.version}") + private String serviceEventVersion; + + @Value("${digital.card.pdf.encryption.enabled:false}") + private boolean isDigitalCardPdfEncryptionEnabled; + + @Value("${"+ResidentConstants.PREFERRED_LANG_PROPERTY+":false}") + private boolean isPreferedLangFlagEnabled; + + @Value("${resident.authLockStatusUpdateV2.id}") + private String authLockStatusUpdateV2Id; + @Autowired - private AuditUtil audit; + private DocumentService docService; + + @Autowired + private IdAuthService idAuthServiceImpl; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private ResidentUserRepository residentUserRepository; + + @Autowired + private ResidentSessionRepository residentSessionRepository; + + @Value("${resident.service.unreadnotificationlist.id}") + private String unreadnotificationlist; + + private static String authTypes; + + private TemplateManager templateManager; + + @Autowired + private TemplateManagerBuilder templateManagerBuilder; + + @PostConstruct + public void idTemplateManagerPostConstruct() { + templateManager = templateManagerBuilder.encodingType(ENCODE_TYPE).enableCache(false).resourceLoader(CLASSPATH) + .build(); + } + + @Value("${auth.types.allowed}") + public void setAuthTypes(String authType) { + authTypes = authType; + } + + public static String getAuthTypeBasedOnConfigV2(AuthTypeStatusDtoV2 authTypeStatus) { + String[] authTypesArray = authTypes.split(","); + for (String authType : authTypesArray) { + if (authTypeStatus.getAuthSubType() != null) { + String authTypeConcat = authTypeStatus.getAuthType() + AUTH_TYPE_SEPERATOR + + authTypeStatus.getAuthSubType(); + if (authType.equalsIgnoreCase(authTypeConcat)) { + return authType; + } + } else { + return authTypeStatus.getAuthType(); + } + } + return null; + } + + public static String getAuthTypeBasedOnConfig(String inputAuthType) { + String[] authTypesArray = authTypes.split(","); + for (String authType : authTypesArray) { + if (authType.equalsIgnoreCase(inputAuthType)) { + return authType; + } + } + return null; + } @Override public RegStatusCheckResponseDTO getRidStatus(RequestDTO request) { + return getRidStatus(request.getIndividualId()); + } + + @Override + public RegStatusCheckResponseDTO getRidStatus(String ridValue) { logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::getRidStatus():: entry"); @@ -106,22 +357,21 @@ public RegStatusCheckResponseDTO getRidStatus(RequestDTO request) { RegistrationStatusResponseDTO responseWrapper = null; RegistrationStatusRequestDTO dto = new RegistrationStatusRequestDTO(); List rids = new ArrayList<>(); - RegistrationStatusSubRequestDto rid = new RegistrationStatusSubRequestDto(request.getIndividualId()); + RegistrationStatusSubRequestDto rid = new RegistrationStatusSubRequestDto(ridValue); rids.add(rid); dto.setRequest(rids); dto.setId(env.getProperty(STATUS_CHECK_ID)); dto.setVersion(env.getProperty(STATUS_CHECEK_VERSION)); dto.setRequesttime(DateUtils.getUTCCurrentDateTimeString(env.getProperty(DATETIME_PATTERN))); - audit.setAuditRequestDto(EventEnum.GETTING_RID_STATUS); + logger.debug("Getting RID status based on individual id"); try { responseWrapper = (RegistrationStatusResponseDTO) residentServiceRestClient.postApi( env.getProperty(ApiName.REGISTRATIONSTATUSSEARCH.name()), MediaType.APPLICATION_JSON, dto, RegistrationStatusResponseDTO.class); if (responseWrapper == null) { logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), "In valid response from Registration status API"); - audit.setAuditRequestDto(EventEnum.INVALID_API_RESPONSE); + LoggerFileConstant.APPLICATIONID.toString(), "Invalid response from Registration status API"); throw new RIDInvalidException(ResidentErrorCode.INVALID_API_RESPONSE.getErrorCode(), ResidentErrorCode.INVALID_API_RESPONSE.getErrorMessage() + ApiName.REGISTRATIONSTATUSSEARCH.name()); @@ -130,15 +380,12 @@ public RegStatusCheckResponseDTO getRidStatus(RequestDTO request) { if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), responseWrapper.getErrors().get(0).toString()); - audit.setAuditRequestDto(EventEnum.RID_NOT_FOUND); throw new RIDInvalidException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), - ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage() - + responseWrapper.getErrors().get(0).toString()); + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage()); } if ((responseWrapper.getResponse() == null || responseWrapper.getResponse().isEmpty())) { logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), "In valid response from Registration status API"); - audit.setAuditRequestDto(EventEnum.INVALID_API_RESPONSE); + LoggerFileConstant.APPLICATIONID.toString(), "Invalid response from Registration status API"); throw new RIDInvalidException(ResidentErrorCode.INVALID_API_RESPONSE.getErrorCode(), ResidentErrorCode.INVALID_API_RESPONSE.getErrorMessage() + ApiName.REGISTRATIONSTATUSSEARCH); } @@ -146,11 +393,9 @@ public RegStatusCheckResponseDTO getRidStatus(RequestDTO request) { String status = validateResponse(responseWrapper.getResponse().get(0).getStatusCode()); response = new RegStatusCheckResponseDTO(); response.setRidStatus(status); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.RID_STATUS_RESPONSE, status)); - + logger.debug("RID status is %s", status); } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithDynamicName(EventEnum.API_RESOURCE_UNACCESS, "checking RID status")); + logger.error("Unable to access api resource for getting rid status"); if (e.getCause() instanceof HttpClientErrorException) { HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), @@ -197,31 +442,23 @@ public byte[] reqEuin(EuinRequestDTO dto) throws ResidentServiceCheckedException byte[] response = null; IdType idtype = getIdType(dto.getIndividualIdType()); try { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP, dto.getTransactionID(), "Request EUIN")); if (idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS, - dto.getTransactionID(), "Request EUIN")); - response = uinCardDownloadService.getUINCard(dto.getIndividualId(), dto.getCardType(), idtype); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS, - dto.getTransactionID(), "Request EUIN")); + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), dto.getTransactionID()); + response = uinCardDownloadHelper.getUINCard(dto.getIndividualId(), dto.getCardType(), idtype); + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_DOW_UIN_SUCCESS, null); } else { logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_DOW_UIN_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request EUIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); } } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.API_RESOURCE_UNACCESS, - dto.getTransactionID(), "Request EUIN")); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_DOW_UIN_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request EUIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() @@ -235,8 +472,7 @@ public byte[] reqEuin(EuinRequestDTO dto) throws ResidentServiceCheckedException ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode() + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.NOTIFICATION_FAILED, - dto.getTransactionID(), "Request EUIN")); + logger.error(AuditEnum.NOTIFICATION_FAILED.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode(), ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage(), e); } catch (OtpValidationFailedException e) { @@ -245,11 +481,8 @@ public byte[] reqEuin(EuinRequestDTO dto) throws ResidentServiceCheckedException ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode() + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request EUIN")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_DOW_UIN_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request EUIN")); + trySendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_DOW_UIN_FAILURE, null); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), e.getErrorText(), e); } @@ -262,22 +495,19 @@ public byte[] reqEuin(EuinRequestDTO dto) throws ResidentServiceCheckedException @Override public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) throws ResidentServiceCheckedException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::reqPrintUin():: entry"); ResidentReprintResponseDto reprintResponse = new ResidentReprintResponseDto(); try { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP, dto.getTransactionID(), - "Request for print UIN")); if (!idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); } - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS, - dto.getTransactionID(), "Request for print UIN")); + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), dto.getTransactionID()); RegProcRePrintRequestDto rePrintReq = new RegProcRePrintRequestDto(); rePrintReq.setCardType(dto.getCardType()); rePrintReq.setCenterId(centerId); @@ -288,7 +518,7 @@ public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) rePrintReq.setRegistrationType(RegistrationType.RES_REPRINT.name()); PacketGeneratorResDto resDto = rePrintService.createPacket(rePrintReq); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OBTAINED_RID, dto.getTransactionID())); + logger.debug(AuditEnum.OBTAINED_RID.getDescription(), dto.getTransactionID()); Map additionalAttributes = new HashMap<>(); additionalAttributes.put(IdType.RID.name(), resDto.getRegistrationId()); @@ -296,24 +526,19 @@ public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) NotificationTemplateCode.RS_UIN_RPR_SUCCESS, additionalAttributes); reprintResponse.setRegistrationId(resDto.getRegistrationId()); reprintResponse.setMessage(notificationResponseDTO.getMessage()); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS, - dto.getTransactionID(), "Request for print UIN")); + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), dto.getTransactionID()); } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for print UIN")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), dto.getTransactionID()); + trySendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), e.getErrorText(), e); } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.API_RESOURCE_UNACCESS, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.API_RESOURCE_UNACCESS.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); if (e.getCause() instanceof HttpClientErrorException) { HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); @@ -329,34 +554,29 @@ public ResidentReprintResponseDto reqPrintUin(ResidentReprintRequestDto dto) ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); } } catch (IOException e) { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithDynamicName(EventEnum.IO_EXCEPTION, "request for print UIN")); + logger.error(AuditEnum.IO_EXCEPTION.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); } catch (ResidentServiceCheckedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.NOTIFICATION_FAILED, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.NOTIFICATION_FAILED.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode(), ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage(), e); } catch (BaseCheckedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.BASE_EXCEPTION, dto.getTransactionID(), - "Request for print UIN")); + logger.error(AuditEnum.BASE_EXCEPTION.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_RPR_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for print UIN")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); } - + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::reqPrintUin():: exit"); return reprintResponse; } @@ -369,23 +589,26 @@ public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, Auth ResponseDTO response = new ResponseDTO(); boolean isTransactionSuccessful = false; try { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP, dto.getTransactionID(), - "Request for auth " + authTypeStatus.toString().toLowerCase())); if (idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), dto.getTransactionID()); Long unlockForSeconds = null; + List authTypes = new ArrayList(); + if (dto.getAuthType() != null && !dto.getAuthType().isEmpty()) { + for (String authType : dto.getAuthType()) { + String authTypeString = getAuthTypeBasedOnConfig(authType); + authTypes.add(authTypeString); + } + } if (authTypeStatus.equals(AuthTypeStatus.UNLOCK)) { - AuthUnLockRequestDTO authUnLockRequestDTO=(AuthUnLockRequestDTO) dto; + AuthUnLockRequestDTO authUnLockRequestDTO = (AuthUnLockRequestDTO) dto; unlockForSeconds = Long.parseLong(authUnLockRequestDTO.getUnlockForSeconds()); } - boolean isAuthTypeStatusUpdated = idAuthService.authTypeStatusUpdate(dto.getIndividualId(), - dto.getAuthType(), authTypeStatus, unlockForSeconds); + boolean isAuthTypeStatusUpdated = idAuthService.authTypeStatusUpdate(dto.getIndividualId(), authTypes, + authTypeStatus, unlockForSeconds); if (isAuthTypeStatusUpdated) { isTransactionSuccessful = true; } else { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQUEST_FAILED, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); + logger.error(AuditEnum.REQUEST_FAILED.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.REQUEST_FAILED.getErrorCode(), ResidentErrorCode.REQUEST_FAILED.getErrorMessage()); } @@ -394,8 +617,6 @@ public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, Auth logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); } @@ -406,13 +627,10 @@ public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, Auth ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.API_NOT_AVAILABLE, - dto.getTransactionID(), "Request for auth" + authTypeStatus.toString().toLowerCase())); throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage(), e); } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), e.getErrorText(), e); } finally { @@ -428,11 +646,9 @@ public ResponseDTO reqAauthTypeStatusUpdate(AuthLockOrUnLockRequestDto dto, Auth NotificationResponseDTO notificationResponseDTO = sendNotification(dto.getIndividualId(), templateCode, null); if (isTransactionSuccessful) - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), dto.getTransactionID()); else - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for auth " + authTypeStatus.toString().toLowerCase())); + logger.debug(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); if (notificationResponseDTO != null) { response.setMessage(notificationResponseDTO.getMessage()); } @@ -450,11 +666,8 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R AuthHistoryResponseDTO response = new AuthHistoryResponseDTO(); try { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP, dto.getTransactionID(), - "Request for auth history")); if (idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS, - dto.getTransactionID(), "Request for auth history")); + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), dto.getTransactionID()); List details = idAuthService.getAuthHistoryDetails(dto.getIndividualId(), dto.getPageStart(), dto.getPageFetch()); if (details != null) { @@ -462,15 +675,12 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R NotificationResponseDTO notificationResponseDTO = sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_SUCCESS, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS, - dto.getTransactionID(), "Request for auth history")); + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), dto.getTransactionID()); response.setMessage(notificationResponseDTO.getMessage()); } else { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.REQUEST_FAILED, - dto.getTransactionID(), "Request for auth history")); + logger.error(AuditEnum.REQUEST_FAILED.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for auth history")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.REQUEST_FAILED.getErrorCode(), ResidentErrorCode.REQUEST_FAILED.getErrorMessage()); } @@ -478,11 +688,8 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for auth history")); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for auth history")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); } @@ -493,11 +700,8 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode() + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for auth history")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for auth history")); + trySendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_FAILURE, null); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), e.getErrorText(), e); } catch (ResidentServiceCheckedException e) { @@ -506,8 +710,6 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode() + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.NOTIFICATION_FAILED, - dto.getTransactionID(), "Request for auth history")); throw new ResidentServiceException(ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode(), ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage(), e); } catch (ApisResourceAccessException e) { @@ -516,11 +718,8 @@ public AuthHistoryResponseDTO reqAuthHistory(AuthHistoryRequestDTO dto) throws R ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage() + ExceptionUtils.getStackTrace(e)); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.API_NOT_AVAILABLE, - dto.getTransactionID(), "Request for auth history")); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_AUTH_HIST_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for auth history")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage(), e); } @@ -534,54 +733,155 @@ private NotificationResponseDTO sendNotification(String id, NotificationTemplate NotificationRequestDto notificationRequest = new NotificationRequestDto(id, templateTypeCode, additionalAttributes); - return notificationService.sendNotification(notificationRequest); + return notificationService.sendNotification(notificationRequest, null); + } + + private NotificationResponseDTO sendNotificationV2(String id, RequestType requestType, TemplateType templateType, + String eventId, Map additionalAttributes, Map idRepoJson) throws ResidentServiceCheckedException { + + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(id); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + notificationRequestDtoV2.setAdditionalAttributes(additionalAttributes); + return notificationService.sendNotification(notificationRequestDtoV2, idRepoJson); + } + + private NotificationResponseDTO trySendNotification(String id, NotificationTemplateCode templateTypeCode, + Map additionalAttributes) { + try { + return sendNotification(id, templateTypeCode, additionalAttributes); + } catch (Exception e1) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorCode() + + ResidentErrorCode.NOTIFICATION_FAILURE.getErrorMessage() + + ExceptionUtils.getStackTrace(e1)); + } + return null; } @Override - public ResidentUpdateResponseDTO reqUinUpdate(ResidentUpdateRequestDto dto) throws ResidentServiceCheckedException { - ResidentUpdateResponseDTO responseDto = new ResidentUpdateResponseDTO(); + public Tuple2 reqUinUpdate(ResidentUpdateRequestDto dto) throws ResidentServiceCheckedException { + byte[] decodedDemoJson = CryptoUtil.decodeURLSafeBase64(dto.getIdentityJson()); + JSONObject demographicJsonObject; try { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP, dto.getTransactionID(), - "Request for UIN update")); - if (!idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for UIN update")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for UIN update")); - throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), - ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + demographicJsonObject = JsonUtil.readValue(new String(decodedDemoJson), JSONObject.class); + JSONObject demographicIdentity = JsonUtil.getJSONObject(demographicJsonObject, IDENTITY); + return reqUinUpdate(dto, demographicIdentity, false, null, null, null); + } catch (IOException e) { + logger.error(AuditEnum.IO_EXCEPTION.getDescription(), dto.getTransactionID()); + + throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } + } + + @Override + public Tuple2 reqUinUpdate(ResidentUpdateRequestDto dto, JSONObject demographicIdentity, boolean validateIdObject, + JSONObject idRepoJson, String schemaJson, IdResponseDTO1 idResponseDto) + throws ResidentServiceCheckedException { + logger.debug("ResidentServiceImpl::reqUinUpdate()::entry"); + Object responseDto = null; + ResidentUpdateResponseDTO residentUpdateResponseDTO = null; + ResidentUpdateResponseDTOV2 residentUpdateResponseDTOV2 = null; + String eventId = null; + ResidentTransactionEntity residentTransactionEntity = null; + try { + String sessionUin = null; + if (Utility.isSecureSession()) { + sessionUin = idRepoJson.get(IdType.UIN.name()).toString(); + residentUpdateResponseDTOV2 = new ResidentUpdateResponseDTOV2(); + responseDto = residentUpdateResponseDTOV2; + residentTransactionEntity = createResidentTransEntity(dto, sessionUin); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + } + if (dto.getConsent() == null || dto.getConsent().trim().isEmpty() + || !dto.getConsent().equalsIgnoreCase(ConsentStatusType.ACCEPTED.name())) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary("failed"); + throw new ResidentServiceException(ResidentErrorCode.CONSENT_DENIED, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + requestValidator.validateNewUpdateRequest(); + if(Utility.isSecureSession()){ + Set identity = dto.getIdentity().keySet(); + if(!identity.isEmpty()) { + requestValidator.validateUpdateCountLimit(identity); + } + } + } else { + residentUpdateResponseDTO = new ResidentUpdateResponseDTO(); + responseDto = residentUpdateResponseDTO; + } + if (Objects.nonNull(dto.getOtp())) { + if (!idAuthService.validateOtp(dto.getTransactionID(), dto.getIndividualId(), dto.getOtp())) { + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), dto.getTransactionID()); + sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); + throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage()); + } + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), dto.getTransactionID()); } - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS, - dto.getTransactionID(), "Request for UIN update")); - final String publicKey = getPublicKeyFromKeyManager(); - MachineSearchResponseDTO machineSearchResponseDTO = searchMachineInMasterService(residentMachinePrefix, publicKey); - String machineId = getMachineId(machineSearchResponseDTO, publicKey); - if (machineId == null) { - machineId = createNewMachineInMasterService(residentMachinePrefix, machineSpecId, zoneCode, centerId, publicKey); - } + final String publicKey = getPublicKeyFromKeyManager(); + MachineSearchResponseDTO machineSearchResponseDTO = searchMachineInMasterService(residentMachinePrefix, + publicKey); + String machineId = getMachineId(machineSearchResponseDTO, publicKey); + if (machineId == null) { + machineId = createNewMachineInMasterService(residentMachinePrefix, machineSpecId, zoneCode, centerId, + publicKey); + } ResidentUpdateDto regProcReqUpdateDto = new ResidentUpdateDto(); regProcReqUpdateDto.setIdValue(dto.getIndividualId()); regProcReqUpdateDto.setIdType(ResidentIndividialIDType.valueOf(dto.getIndividualIdType().toUpperCase())); regProcReqUpdateDto.setCenterId(centerId); regProcReqUpdateDto.setMachineId(machineId); - regProcReqUpdateDto.setIdentityJson(dto.getIdentityJson()); - List documents = dto.getDocuments(); - byte[] decodedDemoJson = CryptoUtil.decodeURLSafeBase64(dto.getIdentityJson()); - JSONObject demographicJsonObject = JsonUtil.readValue(new String(decodedDemoJson), JSONObject.class); - JSONObject demographicIdentity = JsonUtil.getJSONObject(demographicJsonObject, IDENTITY); + JSONObject jsonObject = new JSONObject(); + jsonObject.put(IDENTITY, demographicIdentity); + String encodedIdentityJson = CryptoUtil.encodeToURLSafeBase64(jsonObject.toJSONString().getBytes()); + regProcReqUpdateDto.setIdentityJson(encodedIdentityJson); String mappingJson = utility.getMappingJson(); + if(validateIdObject) { + try { + idObjectValidator.validateIdObject(schemaJson, jsonObject); + } catch (IdObjectValidationFailedException e) { + Optional error = e.getErrorTexts().stream() + .filter(t -> t.contains(ResidentConstants.INVALID_INPUT_PARAMETER)).findAny(); + if (error.isPresent()) { + String errorMessage = error.get(); + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + throw new ResidentServiceException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + errorMessage); + } + } + } + if (demographicIdentity == null || demographicIdentity.isEmpty() || mappingJson == null || mappingJson.trim().isEmpty()) { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.JSON_PARSING_EXCEPTION, dto.getTransactionID())); - throw new ResidentServiceException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), - ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorMessage()); + logger.error(AuditEnum.JSON_PARSING_EXCEPTION.getDescription(), dto.getTransactionID()); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), + ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorMessage()); + } } JSONObject mappingJsonObject = JsonUtil.readValue(mappingJson, JSONObject.class); + validateAuthIndividualIdWithUIN(dto.getIndividualId(), dto.getIndividualIdType(), mappingJsonObject, + demographicIdentity, sessionUin); JSONObject mappingDocument = JsonUtil.getJSONObject(mappingJsonObject, DOCUMENT); + List documents; + if (Utility.isSecureSession()) { + documents = getResidentDocuments(dto, mappingDocument); + } else { + documents = dto.getDocuments(); + } String poaMapping = getDocumentName(mappingDocument, PROOF_OF_ADDRESS); String poiMapping = getDocumentName(mappingDocument, PROOF_OF_IDENTITY); String porMapping = getDocumentName(mappingDocument, PROOF_OF_RELATIONSHIP); @@ -590,73 +890,342 @@ public ResidentUpdateResponseDTO reqUinUpdate(ResidentUpdateRequestDto dto) thro regProcReqUpdateDto.setProofOfAddress(getDocumentValue(proofOfAddressJson, documents)); JSONObject proofOfIdentityJson = JsonUtil.getJSONObject(demographicIdentity, poiMapping); regProcReqUpdateDto.setProofOfIdentity(getDocumentValue(proofOfIdentityJson, documents)); - JSONObject proofOfrelationJson = JsonUtil.getJSONObject(demographicIdentity, porMapping); - regProcReqUpdateDto.setProofOfRelationship(getDocumentValue(proofOfrelationJson, documents)); + JSONObject proofOfRelationJson = JsonUtil.getJSONObject(demographicIdentity, porMapping); + regProcReqUpdateDto.setProofOfRelationship(getDocumentValue(proofOfRelationJson, documents)); JSONObject proofOfBirthJson = JsonUtil.getJSONObject(demographicIdentity, pobMapping); regProcReqUpdateDto.setProofOfDateOfBirth(getDocumentValue(proofOfBirthJson, documents)); - - PacketGeneratorResDto response = residentUpdateService.createPacket(regProcReqUpdateDto); + String idSchemaVersionStr = null; + PacketGeneratorResDto response; + if(Utility.isSecureSession()) { + idSchemaVersionStr = String.valueOf(idRepoJson.get(ResidentConstants.ID_SCHEMA_VERSION)); + response = residentUpdateService.createPacket(regProcReqUpdateDto, idSchemaVersionStr, sessionUin, idResponseDto); + }else { + response = residentUpdateService.createPacket(regProcReqUpdateDto, idSchemaVersionStr); + } Map additionalAttributes = new HashMap<>(); - additionalAttributes.put("RID", response.getRegistrationId()); - audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.OBTAINED_RID_UIN_UPDATE, dto.getTransactionID())); - NotificationResponseDTO notificationResponseDTO = sendNotification(dto.getIndividualId(), - NotificationTemplateCode.RS_UIN_UPDATE_SUCCESS, additionalAttributes); - responseDto.setMessage(notificationResponseDTO.getMessage()); - responseDto.setRegistrationId(response.getRegistrationId()); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS, - dto.getTransactionID(), "Request for UIN update")); - + additionalAttributes.put(IdType.RID.name(), response.getRegistrationId()); + logger.debug(AuditEnum.OBTAINED_RID_UIN_UPDATE.getDescription(), dto.getTransactionID()); + + NotificationResponseDTO notificationResponseDTO; + if (Utility.isSecureSession()) { + updateResidentTransaction(residentTransactionEntity, response); + notificationResponseDTO = sendNotificationV2(dto.getIndividualId(), RequestType.UPDATE_MY_UIN, + TemplateType.REQUEST_RECEIVED, eventId, additionalAttributes, idRepoJson); + residentUpdateResponseDTOV2.setStatus(ResidentConstants.SUCCESS); + residentUpdateResponseDTOV2.setMessage(notificationResponseDTO.getMessage()); + utility.clearIdentityMapCache(identityServiceImpl.getAccessToken()); + } else { + notificationResponseDTO = sendNotification(dto.getIndividualId(), + NotificationTemplateCode.RS_UIN_UPDATE_SUCCESS, additionalAttributes); + if (residentUpdateResponseDTO != null) { + residentUpdateResponseDTO.setMessage(notificationResponseDTO.getMessage()); + residentUpdateResponseDTO.setRegistrationId(response.getRegistrationId()); + } + } + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), dto.getTransactionID()); } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED, - dto.getTransactionID(), "Request for UIN update")); + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), dto.getTransactionID()); sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); - - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for UIN update")); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); throw new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), e.getErrorText(), e); - } catch (ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.API_RESOURCE_UNACCESS, - dto.getTransactionID(), "Request for UIN update")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); + } catch (ValidationFailedException e) { + logger.error(AuditEnum.VALIDATION_FAILED_EXCEPTION.getDescription(), dto.getTransactionID()); + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(e.getErrorCode(), e.getMessage(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(e.getErrorCode(), e.getMessage(), e); + } - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for UIN update")); + } catch (ApisResourceAccessException e) { + logger.error(AuditEnum.API_RESOURCE_UNACCESS.getDescription(), dto.getTransactionID()); + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); if (e.getCause() instanceof HttpClientErrorException) { HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); - throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpClientException.getResponseBodyAsString()); - + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpClientException.getResponseBodyAsString(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpClientException.getResponseBodyAsString()); + } } else if (e.getCause() instanceof HttpServerErrorException) { HttpServerErrorException httpServerException = (HttpServerErrorException) e.getCause(); - throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpServerException.getResponseBodyAsString()); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpServerException.getResponseBodyAsString(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpServerException.getResponseBodyAsString()); + } } else { - throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); + } } } catch (IOException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.IO_EXCEPTION, dto.getTransactionID(), - "Request for UIN update")); - sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); + logger.error(AuditEnum.IO_EXCEPTION.getDescription(), dto.getTransactionID()); + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } + } catch (ResidentServiceCheckedException e) { + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); + if (Utility.isSecureSession()) { + if(e.getErrorCode().equalsIgnoreCase(ResidentErrorCode.UPDATE_COUNT_LIMIT_EXCEEDED.getErrorCode()) + || e.getErrorCode().equalsIgnoreCase(ResidentErrorCode.NOT_ALLOWED_TO_UPDATE_UIN_PENDING_PACKET.getErrorCode()) + || e.getErrorCode().equalsIgnoreCase(ResidentErrorCode.NOT_ALLOWED_TO_UPDATE_UIN_PENDING_REQUEST.getErrorCode())){ + throw new ResidentServiceException( + e.getErrorCode(), + e.getErrorText(), + e, Map.of(ResidentConstants.EVENT_ID, eventId)); + } + throw new ResidentServiceException( + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorCode(), + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorMessage() + dto.getTransactionID(), + e, Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorCode(), + ResidentErrorCode.NO_DOCUMENT_FOUND_FOR_TRANSACTION_ID.getErrorMessage() + dto.getTransactionID(), + e); + } - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for UIN update")); - throw new ResidentServiceException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), - ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); } catch (BaseCheckedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.BASE_EXCEPTION, dto.getTransactionID(), - "Request for UIN update")); + logger.error(AuditEnum.BASE_EXCEPTION.getDescription(), dto.getTransactionID()); + sendFailureNotification(residentTransactionEntity, dto, idRepoJson); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), dto.getTransactionID()); + if (Utility.isSecureSession()) { + throw new ResidentServiceException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } else { + throw new ResidentServiceException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); + } + + } + + finally { + if (Utility.isSecureSession() && residentTransactionEntity != null) { + // if the status code will come as null, it will set it as failed. + if (residentTransactionEntity.getStatusCode() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + } + if (residentTransactionEntity.getRequestSummary() == null) { + residentTransactionEntity.setRequestSummary("failed"); + } + residentTransactionRepository.save(residentTransactionEntity); + } + } + if(eventId == null) { + eventId = ResidentConstants.NOT_AVAILABLE; + } + logger.debug("ResidentServiceImpl::reqUinUpdate()::exit"); + return Tuples.of(responseDto, eventId); + } + + private void sendFailureNotification(ResidentTransactionEntity residentTransactionEntity, ResidentUpdateRequestDto dto, JSONObject idRepoJson) throws ResidentServiceCheckedException { + if (Utility.isSecureSession()) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(EventStatusFailure.FAILED.name()); + sendNotificationV2(dto.getIndividualId(), RequestType.UPDATE_MY_UIN, TemplateType.FAILURE, + residentTransactionEntity.getEventId(), null, idRepoJson); + } else { sendNotification(dto.getIndividualId(), NotificationTemplateCode.RS_UIN_UPDATE_FAILURE, null); + } + } - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE, - dto.getTransactionID(), "Request for UIN update")); - throw new ResidentServiceException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); + private ResidentTransactionEntity createResidentTransEntity(ResidentUpdateRequestDto dto, String sessionUin) + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity = utility.createEntity(RequestType.UPDATE_MY_UIN); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId(utility.convertToMaskData(dto.getIndividualId())); + residentTransactionEntity.setIndividualId(dto.getIndividualId()); + residentTransactionEntity.setTokenId(identityServiceImpl.getIDAToken(sessionUin)); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + Map identityMap; + if (dto.getIdentityJson() != null) { + byte[] decodedIdJson = CryptoUtil.decodeURLSafeBase64(dto.getIdentityJson()); + identityMap = (Map) objectMapper.readValue(decodedIdJson, Map.class).get(IDENTITY); + } else { + identityMap = dto.getIdentity(); } - return responseDto; + + String attributeList = identityMap.keySet().stream() + .filter(key -> !key.equals(IDSCHEMA_VERSION) && !key.equals(UIN_LABEL) && !key.equals(VID_LABEL)) + .collect(Collectors.joining(SEMI_COLON)); + residentTransactionEntity.setAttributeList(attributeList); + residentTransactionEntity.setConsent(dto.getConsent()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setStatusComment(attributeList+ResidentConstants.UPDATED); + return residentTransactionEntity; + } + + private void updateResidentTransaction(ResidentTransactionEntity residentTransactionEntity, + PacketGeneratorResDto response) throws ResidentServiceCheckedException { + String rid = response.getRegistrationId(); + residentTransactionEntity.setAid(rid); + residentTransactionEntity.setCredentialRequestId(rid + utility.getRidDeliMeterValue()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + } + + private List getResidentDocuments(ResidentUpdateRequestDto dto, JSONObject mappingDocument) + throws ResidentServiceCheckedException { + if (Objects.nonNull(dto.getDocuments())) { + return dto.getDocuments(); + } + if (dto.getTransactionID() == null) { + return Collections.emptyList(); + } + try { + Map documentsWithMetadata = docService + .getDocumentsWithMetadata(dto.getTransactionID()); + return documentsWithMetadata.entrySet().stream() + .map(doc -> new ResidentDocuments(getDocumentName(mappingDocument, doc.getKey().getDocCatCode()), + doc.getValue())) + .collect(Collectors.toList()); + } catch (ResidentServiceCheckedException | ObjectStoreAdapterException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorCode(), + ResidentErrorCode.FAILED_TO_RETRIEVE_DOC.getErrorMessage(), e); + } + } + + @Override + public Tuple2 reqAauthTypeStatusUpdateV2(AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::reqAauthTypeStatusUpdateV2():: entry"); + ResponseDTO response = new ResponseDTO(); + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + IdentityDTO identityDTO = identityServiceImpl.getIdentity(individualId); + boolean isTransactionSuccessful = false; + List residentTransactionEntities = List.of(); + String eventId = ResidentConstants.NOT_AVAILABLE; + try { + ArrayList partnerIds = partnerService.getPartnerDetails(env.getProperty(MOSIP_IDA_PARTNER_TYPE,ONLINE_VERIFICATION_PARTNER)); + String dummyOnlineVerificationPartnerId = env.getProperty(IDREPO_DUMMY_ONLINE_VERIFICATION_PARTNER_ID, NA); + residentTransactionEntities = partnerIds.stream() + .filter(partnerId -> !dummyOnlineVerificationPartnerId.equalsIgnoreCase(partnerId)) + .map(partnerId -> { + try { + return createResidentTransactionEntity(individualId, partnerId, identityDTO.getUIN()); + } catch (ApisResourceAccessException e) { + logger.error("Error occured in creating entities %s", e.getMessage()); + throw new ResidentServiceException(ResidentErrorCode.UNKNOWN_EXCEPTION, e); + } catch (ResidentServiceCheckedException e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + if (!residentTransactionEntities.isEmpty()) { + eventId = residentTransactionEntities.get(0).getEventId(); + } + + List authTypesStatusList = authLockOrUnLockRequestDtoV2.getAuthTypes(); + String authType = authTypesStatusList.stream() + .map(dto -> String.format("%s%s%s", ResidentServiceImpl.getAuthTypeBasedOnConfigV2(dto), + ResidentConstants.COLON, (dto.getLocked() ? LOCKED : UNLOCKED))) + .collect(Collectors.joining(ATTRIBUTE_LIST_DELIMITER)); + + Map authTypeStatusMap = authTypesStatusList.stream() + .collect(Collectors.toMap(ResidentServiceImpl::getAuthTypeBasedOnConfigV2, + dto -> dto.getLocked() ? AuthTypeStatus.LOCK : AuthTypeStatus.UNLOCK)); + + Map unlockForSecondsMap = authTypesStatusList.stream() + .filter(dto -> dto.getUnlockForSeconds() != null).collect(Collectors.toMap( + ResidentServiceImpl::getAuthTypeBasedOnConfigV2, AuthTypeStatusDtoV2::getUnlockForSeconds)); + + String requestId = idAuthService.authTypeStatusUpdateForRequestId(individualId, authTypeStatusMap, + unlockForSecondsMap); + + residentTransactionEntities.forEach(residentTransactionEntity -> { + if (requestId != null) { + residentTransactionEntity.setRequestSummary(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setAttributeList(authType); + } else { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(EventStatusFailure.FAILED.name()); + } + residentTransactionEntity.setRequestTrnId(requestId); + }); + + if (requestId != null) { + isTransactionSuccessful = true; + } else { + throw new ResidentServiceException(ResidentErrorCode.REQUEST_FAILED, + Map.of(ResidentConstants.EVENT_ID, authLockStatusUpdateV2Id)); + } + + } catch (ApisResourceAccessException e) { + residentTransactionEntities.forEach(residentTransactionEntity -> { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary("failed"); + }); + + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorMessage() + + ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_UNAVAILABLE, e, + Map.of(ResidentConstants.EVENT_ID, authLockStatusUpdateV2Id)); + } finally { + residentTransactionRepository.saveAll(residentTransactionEntities); + + RequestType requestType = RequestType.AUTH_TYPE_LOCK_UNLOCK; + TemplateType templateType = isTransactionSuccessful ? TemplateType.REQUEST_RECEIVED : TemplateType.FAILURE; + + NotificationResponseDTO notificationResponseDTO = sendNotificationV2(individualId, requestType, + templateType, eventId, null, identityDTO); + + if (isTransactionSuccessful) { + response.setMessage("The chosen authentication types have been successfully locked/unlocked."); + } else { + response.setMessage("The chosen authentication types haven't been successfully locked/unlocked."); + } + response.setStatus(ResidentConstants.SUCCESS); + } + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::reqAauthTypeStatusUpdateV2():: exit"); + return Tuples.of(response, eventId); + } + + private ResidentTransactionEntity createResidentTransactionEntity(String individualId, String partnerId, String uin) + throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity; + residentTransactionEntity = utility.createEntity(RequestType.AUTH_TYPE_LOCK_UNLOCK); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setStatusComment(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestSummary("Updating auth type lock status"); + residentTransactionEntity.setRefId(utility.convertToMaskData(individualId)); + residentTransactionEntity.setIndividualId(individualId); + residentTransactionEntity.setTokenId(identityServiceImpl.getIDAToken(uin)); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + residentTransactionEntity.setOlvPartnerId(partnerId); + residentTransactionEntity.setStatusComment("Updating auth type lock status"); + residentTransactionEntity.setLangCode(this.env.getProperty(ResidentConstants.MANDATORY_LANGUAGE)); + residentTransactionEntity.setRefIdType(identityServiceImpl.getIndividualIdType(individualId).name()); + return residentTransactionEntity; } // get name of document @@ -693,23 +1262,31 @@ private IdType getIdType(String individualType) { return null; } - public String getPublicKeyFromKeyManager() throws ApisResourceAccessException { - PacketSignPublicKeyRequestDTO signKeyRequestDto = PacketSignPublicKeyRequestDTO.builder().request(PacketSignPublicKeyRequestDTO.PacketSignPublicKeyRequest.builder().serverProfile(SERVER_PROFILE_SIGN_KEY).build()).build(); + private String getPublicKeyFromKeyManager() throws ApisResourceAccessException { + PacketSignPublicKeyRequestDTO signKeyRequestDto = PacketSignPublicKeyRequestDTO.builder() + .request(PacketSignPublicKeyRequestDTO.PacketSignPublicKeyRequest.builder() + .serverProfile(SERVER_PROFILE_SIGN_KEY).build()) + .build(); PacketSignPublicKeyResponseDTO signKeyResponseDTO; try { HttpEntity httpEntity = new HttpEntity<>(signKeyRequestDto); - signKeyResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.PACKETSIGNPUBLICKEY.name()), MediaType.APPLICATION_JSON, httpEntity, PacketSignPublicKeyResponseDTO.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), SERVER_PROFILE_SIGN_KEY, + signKeyResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.PACKETSIGNPUBLICKEY.name()), + MediaType.APPLICATION_JSON, httpEntity, PacketSignPublicKeyResponseDTO.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + SERVER_PROFILE_SIGN_KEY, "ResidentServiceImpl::reqUinUpdate():: PACKETSIGNPUBLICKEY POST service call ended with response data " + signKeyResponseDTO.toString()); if (signKeyResponseDTO.getErrors() != null && !signKeyResponseDTO.getErrors().isEmpty()) { - throw new ResidentServiceTPMSignKeyException(signKeyResponseDTO.getErrors().get(0).getErrorCode(), signKeyResponseDTO.getErrors().get(0).getMessage()); + throw new ResidentServiceTPMSignKeyException(signKeyResponseDTO.getErrors().get(0).getErrorCode(), + signKeyResponseDTO.getErrors().get(0).getMessage()); } if (signKeyResponseDTO.getResponse() == null) { - throw new ResidentServiceTPMSignKeyException(PACKET_SIGNKEY_EXCEPTION.getErrorCode(), PACKET_SIGNKEY_EXCEPTION.getErrorMessage()); + throw new ResidentServiceTPMSignKeyException(PACKET_SIGNKEY_EXCEPTION.getErrorCode(), + PACKET_SIGNKEY_EXCEPTION.getErrorMessage()); } } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), SERVER_PROFILE_SIGN_KEY, + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + SERVER_PROFILE_SIGN_KEY, "ResidentServiceImpl::reqUinUpdate():: PACKETSIGNPUBLICKEY POST service call" + ExceptionUtils.getStackTrace(e)); throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); @@ -717,44 +1294,51 @@ public String getPublicKeyFromKeyManager() throws ApisResourceAccessException { return signKeyResponseDTO.getResponse().getPublicKey(); } - public MachineSearchResponseDTO searchMachineInMasterService(String residentMachinePrefix, String publicKey) throws ApisResourceAccessException { - MachineSearchRequestDTO.MachineSearchFilter searchFilterName = MachineSearchRequestDTO.MachineSearchFilter.builder().columnName("name").type("contains").value(residentMachinePrefix).build(); - MachineSearchRequestDTO.MachineSearchFilter searchFilterPublicKey = MachineSearchRequestDTO.MachineSearchFilter.builder().columnName("signPublicKey").type("equals").value(publicKey).build(); - MachineSearchRequestDTO.MachineSearchSort searchSort = MachineSearchRequestDTO.MachineSearchSort.builder().sortType("desc").sortField("createdDateTime").build(); - MachineSearchRequestDTO machineSearchRequestDTO = MachineSearchRequestDTO.builder() - .version("1.0") - //.requesttime(DateUtils.getUTCCurrentDateTimeString()) //TODO fix this - .request(MachineSearchRequestDTO.MachineSearchRequest.builder() - .filters(List.of(searchFilterName, searchFilterPublicKey)) - .sort(List.of(searchSort)) - .pagination(MachineSearchRequestDTO.MachineSearchPagination.builder().pageStart(0).pageFetch(10).build()) - .languageCode(utilities.getLanguageCode()) - .build()) + private MachineSearchResponseDTO searchMachineInMasterService(String residentMachinePrefix, String publicKey) + throws ApisResourceAccessException { + MachineSearchRequestDTO.MachineSearchFilter searchFilterName = MachineSearchRequestDTO.MachineSearchFilter + .builder().columnName("name").type("contains").value(residentMachinePrefix).build(); + MachineSearchRequestDTO.MachineSearchFilter searchFilterPublicKey = MachineSearchRequestDTO.MachineSearchFilter + .builder().columnName("signPublicKey").type("equals").value(publicKey).build(); + MachineSearchRequestDTO.MachineSearchSort searchSort = MachineSearchRequestDTO.MachineSearchSort.builder() + .sortType("desc").sortField("createdDateTime").build(); + MachineSearchRequestDTO machineSearchRequestDTO = MachineSearchRequestDTO.builder().version("1.0") + // .requesttime(DateUtils.getUTCCurrentDateTimeString()) //TODO fix this + .request( + MachineSearchRequestDTO.MachineSearchRequest.builder() + .filters(List.of(searchFilterName, searchFilterPublicKey)).sort(List.of(searchSort)) + .pagination(MachineSearchRequestDTO.MachineSearchPagination.builder().pageStart(0) + .pageFetch(10).build()) + .languageCode(utilities.getLanguageCode()).build()) .build(); MachineSearchResponseDTO machineSearchResponseDTO; try { HttpEntity httpEntity = new HttpEntity<>(machineSearchRequestDTO); - machineSearchResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.MACHINESEARCH.name()), MediaType.APPLICATION_JSON, httpEntity, MachineSearchResponseDTO.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), residentMachinePrefix, + machineSearchResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.MACHINESEARCH.name()), + MediaType.APPLICATION_JSON, httpEntity, MachineSearchResponseDTO.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + residentMachinePrefix, "ResidentServiceImpl::reqUinUpdate():: MACHINESEARCH POST service call ended with response data " + machineSearchResponseDTO.toString()); if (machineSearchResponseDTO.getErrors() != null && !machineSearchResponseDTO.getErrors().isEmpty()) { - throw new ResidentMachineServiceException(machineSearchResponseDTO.getErrors().get(0).getErrorCode(), machineSearchResponseDTO.getErrors().get(0).getMessage()); + throw new ResidentMachineServiceException(machineSearchResponseDTO.getErrors().get(0).getErrorCode(), + machineSearchResponseDTO.getErrors().get(0).getMessage()); } } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), residentMachinePrefix, - "ResidentServiceImpl::reqUinUpdate():: MACHINESEARCH POST service call" + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + residentMachinePrefix, "ResidentServiceImpl::reqUinUpdate():: MACHINESEARCH POST service call" + ExceptionUtils.getStackTrace(e)); throw new ApisResourceAccessException("Could not fetch machines from master data", e); } return machineSearchResponseDTO; } - public String getMachineId(MachineSearchResponseDTO machineSearchResponseDTO, final String publicKey) { + private String getMachineId(MachineSearchResponseDTO machineSearchResponseDTO, final String publicKey) { if (machineSearchResponseDTO.getResponse() != null) { List fetchedMachines = machineSearchResponseDTO.getResponse().getData(); if (fetchedMachines != null && !fetchedMachines.isEmpty()) { - List machines = fetchedMachines.stream().filter(mac -> mac.getSignPublicKey().equals(publicKey)).collect(Collectors.toList()); + List machines = fetchedMachines.stream() + .filter(mac -> mac.getSignPublicKey().equals(publicKey)).collect(Collectors.toList()); if (!machines.isEmpty()) { return machines.get(0).getId(); } @@ -763,32 +1347,795 @@ public String getMachineId(MachineSearchResponseDTO machineSearchResponseDTO, fi return null; } - public String createNewMachineInMasterService(String residentMachinePrefix, String machineSpecId, String zoneCode, String regCenterId, String publicKey) throws ApisResourceAccessException { + private String createNewMachineInMasterService(String residentMachinePrefix, String machineSpecId, String zoneCode, + String regCenterId, String publicKey) throws ApisResourceAccessException { MachineCreateRequestDTO machineCreateRequestDTO = MachineCreateRequestDTO.builder() - //.requesttime(DateUtils.getUTCCurrentDateTimeString()) //TODO fix this + // .requesttime(DateUtils.getUTCCurrentDateTimeString()) //TODO fix this .request(MachineDto.builder().serialNum(null).macAddress(null).ipAddress("0.0.0.0").isActive(true) .validityDateTime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime().plusYears(3))) - .name(residentMachinePrefix + System.currentTimeMillis()).machineSpecId(machineSpecId).zoneCode(zoneCode).regCenterId(regCenterId).publicKey(publicKey).signPublicKey(publicKey).build()) + .name(residentMachinePrefix + System.currentTimeMillis()).machineSpecId(machineSpecId) + .zoneCode(zoneCode).regCenterId(regCenterId).publicKey(publicKey).signPublicKey(publicKey) + .build()) .build(); MachineCreateResponseDTO machineCreateResponseDTO; try { HttpEntity httpEntity = new HttpEntity<>(machineCreateRequestDTO); - machineCreateResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.MACHINECREATE.name()), MediaType.APPLICATION_JSON, httpEntity, MachineCreateResponseDTO.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), residentMachinePrefix, + machineCreateResponseDTO = residentServiceRestClient.postApi(env.getProperty(ApiName.MACHINECREATE.name()), + MediaType.APPLICATION_JSON, httpEntity, MachineCreateResponseDTO.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + residentMachinePrefix, "ResidentServiceImpl::reqUinUpdate():: MACHINECREATE POST service call ended with response data " + machineCreateResponseDTO.toString()); if (machineCreateResponseDTO.getErrors() != null && !machineCreateResponseDTO.getErrors().isEmpty()) { - throw new ResidentMachineServiceException(machineCreateResponseDTO.getErrors().get(0).getErrorCode(), machineCreateResponseDTO.getErrors().get(0).getMessage()); + throw new ResidentMachineServiceException(machineCreateResponseDTO.getErrors().get(0).getErrorCode(), + machineCreateResponseDTO.getErrors().get(0).getMessage()); } if (machineCreateResponseDTO.getResponse() == null) { - throw new ResidentMachineServiceException(MACHINE_MASTER_CREATE_EXCEPTION.getErrorCode(), MACHINE_MASTER_CREATE_EXCEPTION.getErrorMessage()); + throw new ResidentMachineServiceException(MACHINE_MASTER_CREATE_EXCEPTION.getErrorCode(), + MACHINE_MASTER_CREATE_EXCEPTION.getErrorMessage()); } } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), residentMachinePrefix, - "ResidentServiceImpl::reqUinUpdate():: MACHINECREATE POST service call" + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), + residentMachinePrefix, "ResidentServiceImpl::reqUinUpdate():: MACHINECREATE POST service call" + ExceptionUtils.getStackTrace(e)); throw new ApisResourceAccessException("Could not create machine in master data", e); } return machineCreateResponseDTO.getResponse().getId(); } -} \ No newline at end of file + + private void validateAuthIndividualIdWithUIN(String individualId, String individualIdType, + JSONObject mappingJsonObject, JSONObject demographicIdentity, String sessionUin) + throws ApisResourceAccessException, ValidationFailedException, IOException { + String uin = ""; + if (ResidentIndividialIDType.UIN.toString().equals(individualIdType)) + uin = individualId; + else if (ResidentIndividialIDType.VID.toString().equals(individualIdType)) { + if(sessionUin!=null){ + uin = sessionUin; + } else { + uin = utilities.getUinByVid(individualId); + } + } else { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "ResidentServiceImpl::validateAuthIndividualIdWithUIN():: Individual id type is invalid"); + throw new ValidationFailedException(ResidentErrorCode.INDIVIDUAL_ID_TYPE_INVALID.getErrorCode(), + ResidentErrorCode.INDIVIDUAL_ID_TYPE_INVALID.getErrorMessage()); + } + + JSONObject identityMappingJsonObject = JsonUtil.getJSONObject(mappingJsonObject, IDENTITY); + String uinMapping = getDocumentName(identityMappingJsonObject, UIN); + if (Utility.isSecureSession()) { + demographicIdentity.put(uinMapping, uin); + } + String identityJsonUIN = JsonUtil.getJSONValue(demographicIdentity, uinMapping); + if (!identityJsonUIN.equals(uin)) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "ResidentServiceImpl::validateAuthIndividualIdWithUIN():: Validation failed"); + throw new ValidationFailedException(ResidentErrorCode.INDIVIDUAL_ID_UIN_MISMATCH.getErrorCode(), + ResidentErrorCode.INDIVIDUAL_ID_UIN_MISMATCH.getErrorMessage()); + } + } + + @SuppressWarnings("unchecked") + @Override + public ResponseWrapper getAuthLockStatus(String individualId) + throws ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + try { + ResponseWrapper responseWrapper = JsonUtil.convertValue( + residentServiceRestClient.getApi(ApiName.AUTHTYPESTATUSUPDATE, List.of(individualId), List.of(), + List.of(), ResponseWrapper.class), + new TypeReference>() { + }); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + throw new ResidentServiceCheckedException(ResidentErrorCode.AUTH_LOCK_STATUS_FAILED); + } + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List dtoListV2; + if (responseWrapper.getResponse().getAuthTypes().isEmpty()) { + dtoListV2 = new ArrayList<>(); + AuthTypeStatusDtoV2 dtoV2; + String[] authTypesArray = authTypes.split(","); + for (String authType : authTypesArray) { + String[] authSplitArray = authType.split("-"); + List authTypeList = new ArrayList(Arrays.asList(authSplitArray)); + dtoV2 = new AuthTypeStatusDtoV2(); + dtoV2.setAuthType(authTypeList.get(0)); + dtoV2.setAuthSubType(authTypeList.size() > 1 ? authTypeList.get(1) : null); + dtoV2.setLocked(Boolean.FALSE); + dtoV2.setUnlockForSeconds(null); + dtoListV2.add(dtoV2); + } + } else { + dtoListV2 = responseWrapper.getResponse().getAuthTypes().stream().map(dto -> { + AuthTypeStatusDtoV2 dtoV2 = new AuthTypeStatusDtoV2(); + dtoV2.setAuthType(dto.getAuthType()); + dtoV2.setAuthSubType(dto.getAuthSubType()); + dtoV2.setLocked(dto.getLocked()); + dtoV2.setUnlockForSeconds(dto.getUnlockForSeconds()); + return dtoV2; + }).collect(Collectors.toList()); + } + authLockOrUnLockRequestDtoV2.setAuthTypes(dtoListV2); + response.setResponse(authLockOrUnLockRequestDtoV2); + return response; + } catch (ApisResourceAccessException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + @Override + public ResponseWrapper> getServiceHistory(Integer pageIndex, Integer pageSize, + LocalDate fromDateTime, LocalDate toDateTime, String serviceType, String sortType, + String statusFilter, String searchText, String langCode, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException, ApisResourceAccessException { + return getServiceHistory(pageIndex, pageSize, fromDateTime, toDateTime, serviceType, sortType, statusFilter, + searchText, langCode, timeZoneOffset, locale, null, null); + } + + @Override + public ResponseWrapper> getServiceHistory(Integer pageIndex, Integer pageSize, + LocalDate fromDateTime, LocalDate toDateTime, String serviceType, String sortType, + String statusFilter, String searchText, String langCode, int timeZoneOffset, String locale, + String defaultPageSizeProperty, List statusCodeList) + throws ResidentServiceCheckedException, ApisResourceAccessException { + + if (pageIndex == null) { + //By default page start is 0 + pageIndex = DEFAULT_PAGE_INDEX; + } + + if (pageSize == null) { + // Get the default page size based on the property if mentioned otherwise it + // default would be 10 + pageSize = getDefaultPageSize(defaultPageSizeProperty); + } + + if (pageIndex < 0) { + logger.error(AuditEnum.INVALID_PAGE_INDEX_VALUE.getDescription(), pageIndex.toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.INVALID_PAGE_INDEX_VALUE); + } else if(pageSize <=0){ + logger.error(AuditEnum.INVALID_PAGE_SIZE_VALUE.getDescription(), pageSize.toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.INVALID_PAGE_SIZE_VALUE); + } + + ResponseWrapper> serviceHistoryResponseDtoList = getServiceHistoryDetails( + sortType, pageIndex, pageSize, fromDateTime, toDateTime, serviceType, statusFilter, searchText, + langCode, timeZoneOffset, locale, statusCodeList); + return serviceHistoryResponseDtoList; + } + + private Integer getDefaultPageSize(String defaultPageSizeProperty) { + return defaultPageSizeProperty != null + ? env.getProperty(defaultPageSizeProperty, Integer.class, DEFAULT_PAGE_SIZE) + : DEFAULT_PAGE_SIZE; + } + + @Override + public String getFileName(String eventId, IdType cardType, int timeZoneOffset, String locale) { + if (cardType.equals(IdType.UIN)) { + return utility.getFileName(eventId, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.UIN_CARD_NAMING_CONVENTION_PROPERTY)), timeZoneOffset, locale); + } else { + return utility.getFileName(eventId, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.VID_CARD_NAMING_CONVENTION_PROPERTY)), timeZoneOffset, locale); + } + } + + @Override + public Tuple2 downloadCard(String eventId) { + Optional residentTransactionEntity = residentTransactionRepository + .findByEventId(eventId); + if (residentTransactionEntity.isPresent()) { + IdType cardType; + RequestType requestType = RequestType.getRequestTypeFromString(residentTransactionEntity.get().getRequestTypeCode()); + if (requestType.equals(RequestType.UPDATE_MY_UIN)) { + cardType = IdType.UIN; + } else if (requestType.equals(RequestType.VID_CARD_DOWNLOAD)) { + cardType = IdType.VID; + } else { + logger.error(AuditEnum.INVALID_REQUEST_TYPE_CODE.getDescription()); + throw new InvalidRequestTypeCodeException(ResidentErrorCode.INVALID_REQUEST_TYPE_CODE.getErrorCode(), + ResidentErrorCode.INVALID_REQUEST_TYPE_CODE.getErrorMessage()); + } + return Tuples.of(downloadCardFromDataShareUrl(residentTransactionEntity.get()), cardType); + } else { + logger.error(ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorMessage()); + throw new EventIdNotPresentException(ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorCode(), + ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorMessage()); + } + } + + public byte[] downloadCardFromDataShareUrl(ResidentTransactionEntity residentTransactionEntity) { + byte[] pdfBytes = new byte[0]; + if (residentTransactionEntity.getReferenceLink() != null + && !residentTransactionEntity.getReferenceLink().isEmpty() && residentTransactionEntity + .getStatusCode().equals(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name())) { + URI dataShareUri = URI.create(residentTransactionEntity.getReferenceLink()); + try { + pdfBytes = residentServiceRestClient.getApi(dataShareUri, byte[].class); + } catch (ApisResourceAccessException e) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + if (pdfBytes.length == 0) { + throw new CardNotReadyException(); + } + residentTransactionRepository.updateEventStatus(residentTransactionEntity.getEventId(), + ResidentConstants.SUCCESS, CARD_DOWNLOADED.name(), CARD_DOWNLOADED.name(), + utility.getSessionUserName(), DateUtils.getUTCCurrentDateTime()); + return pdfBytes; + } + + private ResponseWrapper> getServiceHistoryDetails(String sortType, + Integer pageIndex, Integer pageSize, LocalDate fromDateTime, LocalDate toDateTime, String serviceType, + String statusFilter, String searchText, String langCode, int timeZoneOffset, String locale, + List statusCodeList) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + String idaToken = identityServiceImpl.getResidentIdaToken(); + responseWrapper.setResponse(getServiceHistoryResponse(sortType, pageIndex, pageSize, idaToken, statusFilter, + searchText, fromDateTime, toDateTime, serviceType, langCode, timeZoneOffset, locale, statusCodeList)); + responseWrapper.setId(serviceHistoryId); + responseWrapper.setVersion(serviceHistoryVersion); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + return responseWrapper; + } + + public PageDto getServiceHistoryResponse(String sortType, Integer pageIndex, + Integer pageSize, String idaToken, String statusFilter, String searchText, LocalDate fromDateTime, + LocalDate toDateTime, String serviceType, String langCode, int timeZoneOffset, String locale, + List statusCodeList) throws ResidentServiceCheckedException { + Tuple2, Integer> serviceHistoryData = getServiceHistoryData(sortType, idaToken, + pageIndex, pageSize, statusFilter, searchText, fromDateTime, toDateTime, serviceType, timeZoneOffset, + statusCodeList); + Integer totalItems = serviceHistoryData.getT2(); + return new PageDto<>(pageIndex, pageSize, totalItems, + totalItems % pageSize == 0 ? (totalItems / pageSize) : (totalItems / pageSize) + 1, + convertResidentEntityListToServiceHistoryDto(serviceHistoryData.getT1(), langCode, timeZoneOffset, + locale)); + } + + public Tuple2, Integer> getServiceHistoryData(String sortType, String idaToken, + Integer pageIndex, Integer pageSize, String statusFilter, String searchText, LocalDate fromDateTime, + LocalDate toDateTime, String serviceType, int timeZoneOffset, List statusCodeList) { + List requestTypes; + List statusList = new ArrayList<>(); + Tuple2 dateTimeTuple2 = null; + if (serviceType == null || serviceType.trim().equalsIgnoreCase(ServiceType.ALL.name())) { + requestTypes = getServiceQueryForNullServiceType(); + } else { + requestTypes = convertServiceTypeToResidentTransactionType(serviceType); + } + if (statusFilter != null) { + statusFilter = statusFilter.trim(); + if(!statusFilter.equalsIgnoreCase(EventStatus.ALL.name())) { + statusList = getStatusFilterQuery(statusFilter, statusCodeList); + } + } + if (fromDateTime != null && toDateTime != null) { + dateTimeTuple2 = getDateQuery(fromDateTime, toDateTime, timeZoneOffset); + } + List entitiesList = new ArrayList<>(); + int totalItems = 0; + List pageData = null; + if (statusFilter != null && !statusFilter.equalsIgnoreCase(EventStatus.ALL.name()) && searchText != null) { + pageData = residentTransactionRepository.findByTokenIdInStatusSearchEventId(idaToken, pageSize, + pageIndex * pageSize, onlineVerificationPartnerId, requestTypes, statusList, searchText); + totalItems = residentTransactionRepository.countByTokenIdInStatusSearchEventId(idaToken, + onlineVerificationPartnerId, requestTypes, statusList, searchText); + } else if (fromDateTime != null && toDateTime != null && searchText != null) { + pageData = residentTransactionRepository.findByTokenIdBetweenCrDtimesSearchEventId(idaToken, pageSize, + pageIndex * pageSize, onlineVerificationPartnerId, requestTypes, dateTimeTuple2.getT1(), + dateTimeTuple2.getT2(), searchText); + totalItems = residentTransactionRepository.countByTokenIdBetweenCrDtimesSearchEventId(idaToken, + onlineVerificationPartnerId, requestTypes, dateTimeTuple2.getT1(), dateTimeTuple2.getT2(), + searchText); + } else if (fromDateTime != null && toDateTime != null && statusFilter != null && !statusFilter.equalsIgnoreCase(EventStatus.ALL.name())) { + pageData = residentTransactionRepository.findByTokenIdInStatusBetweenCrDtimes(idaToken, pageSize, + pageIndex * pageSize, onlineVerificationPartnerId, requestTypes, statusList, + dateTimeTuple2.getT1(), dateTimeTuple2.getT2()); + totalItems = residentTransactionRepository.countByTokenIdInStatusBetweenCrDtimes(idaToken, + onlineVerificationPartnerId, requestTypes, statusList, dateTimeTuple2.getT1(), + dateTimeTuple2.getT2()); + } else if (searchText != null) { + pageData = residentTransactionRepository.findByTokenIdAndSearchEventId(idaToken, pageSize, + pageIndex * pageSize, onlineVerificationPartnerId, requestTypes, searchText); + totalItems = residentTransactionRepository.countByTokenIdAndSearchEventId(idaToken, + onlineVerificationPartnerId, requestTypes, searchText); + } else if (statusFilter != null && !statusFilter.equalsIgnoreCase(EventStatus.ALL.name())) { + pageData = residentTransactionRepository.findByTokenIdInStatus(idaToken, pageSize, pageIndex * pageSize, + onlineVerificationPartnerId, requestTypes, statusList); + totalItems = residentTransactionRepository.countByTokenIdInStatus(idaToken, onlineVerificationPartnerId, + requestTypes, statusList); + } else if (fromDateTime != null && toDateTime != null) { + pageData = residentTransactionRepository.findByTokenIdBetweenCrDtimes(idaToken, pageSize, + pageIndex * pageSize, onlineVerificationPartnerId, requestTypes, dateTimeTuple2.getT1(), + dateTimeTuple2.getT2()); + totalItems = residentTransactionRepository.countByTokenIdBetweenCrDtimes(idaToken, + onlineVerificationPartnerId, requestTypes, dateTimeTuple2.getT1(), dateTimeTuple2.getT2()); + } else { + pageData = residentTransactionRepository.findByTokenId(idaToken, pageSize, pageIndex * pageSize, + onlineVerificationPartnerId, requestTypes); + totalItems = residentTransactionRepository.countByTokenId(idaToken, onlineVerificationPartnerId, + requestTypes); + } + if (pageData != null && !pageData.isEmpty()) { + entitiesList = pageData.stream() + .map(objArr -> new ResidentTransactionEntity((String) objArr[0], (String) objArr[1], + (String) objArr[2], (String) objArr[3], (String) objArr[4], (String) objArr[5], + toDateTime(objArr[6]), toDateTime(objArr[7]), (boolean) objArr[8], (boolean) objArr[9], + (String) objArr[10], (String) objArr[11], (String) objArr[12])) + .collect(Collectors.toList()); + } + return Tuples.of(entitiesList, totalItems); + } + + public LocalDateTime toDateTime(Object dateTimeObject) { + if (dateTimeObject instanceof Timestamp) { + Timestamp timestamp = ((Timestamp) dateTimeObject); + LocalDateTime localDateTime = timestamp.toLocalDateTime(); + return localDateTime; + } + return null; + } + + private List getServiceQueryForNullServiceType() { + return (List) convertListOfRequestTypeToListOfString(ServiceType.ALL.getRequestTypes()); + } + + private Tuple2 getDateQuery(LocalDate fromDate, LocalDate toDate, int timeZoneOffset) { + //Converting local time to UTC before using in db query + LocalDateTime fromDateTime = fromDate.atStartOfDay().plusMinutes(timeZoneOffset); + LocalDateTime toDateTime = toDate.plusDays(1).atStartOfDay().plusMinutes(timeZoneOffset); + return Tuples.of(fromDateTime, toDateTime); + } + + public List getStatusFilterQuery(String statusFilter, List statusCodeList) { + List statusFilterList = List.of(statusFilter.split(",")).stream().map(String::trim) + .collect(Collectors.toList()); + List statusFilterListContainingAllStatus = new ArrayList<>(); + if(statusCodeList == null || statusCodeList.isEmpty()) { + for (String status : statusFilterList) { + if (status.equalsIgnoreCase(EventStatus.SUCCESS.name())) { + statusFilterListContainingAllStatus.addAll(RequestType.getAllSuccessStatusList(env)); + } else if (status.equalsIgnoreCase(EventStatus.FAILED.name())) { + statusFilterListContainingAllStatus.addAll(RequestType.getAllFailedStatusList(env)); + } else if (status.equalsIgnoreCase(EventStatus.IN_PROGRESS.name())) { + statusFilterListContainingAllStatus.addAll(RequestType.getAllNewOrInprogressStatusList(env)); + }else if (status.equalsIgnoreCase(EventStatus.CANCELED.name())) { + statusFilterListContainingAllStatus.addAll(RequestType.getAllCancelledStatusList(env)); + } + } + }else { + statusFilterListContainingAllStatus.addAll(statusFilterList); + } + return statusFilterListContainingAllStatus; + } + + private List convertServiceTypeToResidentTransactionType(String serviceType) { + List residentTransactionTypeList = new ArrayList<>(); + if (serviceType != null) { + List serviceTypeList = List.of(serviceType.split(",")).stream().map(String::trim).map(String::toUpperCase) + .collect(Collectors.toList()); + for (String service : serviceTypeList) { + ServiceType type = ServiceType.valueOf(service); + residentTransactionTypeList.addAll(convertListOfRequestTypeToListOfString(type.getRequestTypes())); + } + } + return residentTransactionTypeList; + } + + private Collection convertListOfRequestTypeToListOfString(List requestType) { + return requestType.stream().map(Enum::name).collect(Collectors.toList()); + } + + private List convertResidentEntityListToServiceHistoryDto( + List residentTransactionEntityList, String langCode, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException { + List serviceHistoryResponseDtoList = new ArrayList<>(); + for (ResidentTransactionEntity residentTransactionEntity : residentTransactionEntityList) { + Tuple2 statusCodes = getEventStatusCode(residentTransactionEntity.getStatusCode(), langCode); + RequestType requestType = RequestType + .getRequestTypeFromString(residentTransactionEntity.getRequestTypeCode()); + Optional serviceType = ServiceType.getServiceTypeFromRequestType(requestType); + + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setRequestType(templateUtil.getEventTypeBasedOnLangcode(requestType, langCode)); + serviceHistoryResponseDto.setEventId(residentTransactionEntity.getEventId()); + serviceHistoryResponseDto.setEventStatus(statusCodes.getT2()); + if (residentTransactionEntity.getUpdDtimes() != null + && residentTransactionEntity.getUpdDtimes().isAfter(residentTransactionEntity.getCrDtimes())) { + serviceHistoryResponseDto.setTimeStamp(utility.formatWithOffsetForUI(timeZoneOffset, locale, residentTransactionEntity.getUpdDtimes())); + } else { + serviceHistoryResponseDto.setTimeStamp(utility.formatWithOffsetForUI(timeZoneOffset,locale, residentTransactionEntity.getCrDtimes())); + } + if (serviceType.isPresent()) { + if (!serviceType.get().equals(ServiceType.ALL.name())) { + serviceHistoryResponseDto.setServiceType(serviceType.get()); + serviceHistoryResponseDto + .setDescription(getDescriptionForLangCode(residentTransactionEntity, langCode, statusCodes.getT1(), requestType)); + } + } else { + serviceHistoryResponseDto.setDescription(templateUtil.getEventTypeBasedOnLangcode(requestType, langCode)); + } + serviceHistoryResponseDto.setPinnedStatus(residentTransactionEntity.getPinnedStatus()); + serviceHistoryResponseDto.setReadStatus(residentTransactionEntity.isReadStatus()); + serviceHistoryResponseDtoList.add(serviceHistoryResponseDto); + } + return serviceHistoryResponseDtoList; + } + + public String getDescriptionForLangCode(ResidentTransactionEntity residentTransactionEntity, String langCode, String statusCode, RequestType requestType) + throws ResidentServiceCheckedException { + TemplateType templateType; + if (statusCode.equalsIgnoreCase(EventStatus.SUCCESS.name())) { + templateType = TemplateType.SUCCESS; + } else if (statusCode.equalsIgnoreCase(EventStatusCanceled.CANCELED.name())) { + templateType = TemplateType.CANCELED; + }else if (residentTransactionEntity.getStatusCode().equalsIgnoreCase(EventStatusInProgress.IDENTITY_UPDATED.name())) { + templateType = TemplateType.REGPROC_SUCCESS; + } else { + templateType = TemplateType.FAILURE; + } + String templateTypeCode = templateUtil.getPurposeTemplateTypeCode(requestType, templateType); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(langCode, templateTypeCode); + return replacePlaceholderValueInTemplate(residentTransactionEntity, fileText, requestType, langCode); + } + + private String replacePlaceholderValueInTemplate(ResidentTransactionEntity residentTransactionEntity, String fileText, RequestType requestType, String langCode) { + return requestType.getDescriptionTemplateVariables(templateUtil, residentTransactionEntity, fileText, langCode); + } + + public String getSummaryForLangCode(ResidentTransactionEntity residentTransactionEntity, String langCode, String statusCode, RequestType requestType) + throws ResidentServiceCheckedException { + TemplateType templateType; + if (statusCode.equalsIgnoreCase(EventStatus.SUCCESS.name())) { + templateType = TemplateType.SUCCESS; + } else if (statusCode.equalsIgnoreCase(EventStatusCanceled.CANCELED.name())) { + templateType = TemplateType.CANCELED; + } else if (residentTransactionEntity.getStatusCode().equalsIgnoreCase(EventStatusInProgress.IDENTITY_UPDATED.name())) { + templateType = TemplateType.REGPROC_SUCCESS; + } else { + return getDescriptionForLangCode(residentTransactionEntity, langCode, statusCode, requestType); + } + String templateTypeCode = templateUtil.getSummaryTemplateTypeCode(requestType, templateType); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(langCode, templateTypeCode); + return replacePlaceholderValueInTemplate(residentTransactionEntity, fileText, requestType, langCode); + } + + public Tuple2 getEventStatusCode(String statusCode, String langCode) { + EventStatus status; + if (EventStatusSuccess.containsStatus(statusCode)) { + status = EventStatus.SUCCESS; + } else if (EventStatusFailure.containsStatus(statusCode)) { + status = EventStatus.FAILED; + } else if(EventStatusCanceled.containsStatus(statusCode)){ + status = EventStatus.CANCELED; + } + else { + status = EventStatus.IN_PROGRESS; + } + String fileText = templateUtil.getEventStatusBasedOnLangcode(status, langCode); + return Tuples.of(status.name(), fileText); + } + + @Override + public AidStatusResponseDTO getAidStatus(AidStatusRequestDTO reqDto, boolean performOtpValidation) + throws ResidentServiceCheckedException, ApisResourceAccessException, OtpValidationFailedException { + try { + Tuple2 individualIdAndType = identityServiceImpl.getIdAndTypeForIndividualId(reqDto.getIndividualId()); + boolean validStatus = individualIdAndType != null; + if (performOtpValidation) { + validStatus = idAuthServiceImpl.validateOtp(reqDto.getTransactionId(), individualIdAndType.getT1(), reqDto.getOtp()); + } + if (validStatus) { + AidStatusResponseDTO aidStatusResponseDTO = new AidStatusResponseDTO(); + aidStatusResponseDTO.setIndividualId(individualIdAndType.getT1()); + aidStatusResponseDTO.setIndividualIdType(individualIdAndType.getT2().name()); + aidStatusResponseDTO.setAidStatus(PROCESSED); + aidStatusResponseDTO.setTransactionId(reqDto.getTransactionId()); + return aidStatusResponseDTO; + } + throw new ResidentServiceCheckedException(ResidentErrorCode.AID_STATUS_IS_NOT_READY); + } catch (ResidentServiceCheckedException | ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "ResidentServiceImpl::getAidStatus()::" + e.getClass().getSimpleName() + " :" + e.getMessage()); + RegStatusCheckResponseDTO ridStatus = null; + try { + ridStatus = getRidStatus(reqDto.getIndividualId()); + } catch (RIDInvalidException ex) { + throw new ResidentServiceCheckedException(ResidentErrorCode.AID_NOT_FOUND); + } + AidStatusResponseDTO aidStatusResponseDTO = new AidStatusResponseDTO(); + aidStatusResponseDTO.setAidStatus(ridStatus.getRidStatus()); + return aidStatusResponseDTO; + } + } + + @Override + public ResponseWrapper getEventStatus(String eventId, String languageCode, int timeZoneOffset, String locale) + throws ResidentServiceCheckedException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::getEventStatus()::Start"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + Optional residentTransactionEntity = residentTransactionRepository + .findById(eventId); + if (residentTransactionEntity.isPresent()) { + String idaToken = identityServiceImpl.getResidentIdaToken(); + if (!idaToken.equals(residentTransactionEntity.get().getTokenId())) { + throw new ResidentServiceCheckedException(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION); + } + if (!residentTransactionEntity.get().isReadStatus()) { + residentTransactionRepository.updateReadStatus(eventId); + } + } else { + throw new ResidentServiceCheckedException(ResidentErrorCode.EVENT_STATUS_NOT_FOUND); + } + RequestType requestType = RequestType.getRequestTypeFromString(residentTransactionEntity.get().getRequestTypeCode()); + Optional serviceType = ServiceType.getServiceTypeFromRequestType(requestType); + Map eventStatusMap; + + eventStatusMap = requestType.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, timeZoneOffset, locale).getT1(); + + EventStatusResponseDTO eventStatusResponseDTO = new EventStatusResponseDTO(); + eventStatusResponseDTO.setEventId(eventId); + eventStatusResponseDTO.setEventType(eventStatusMap.get(TemplateVariablesConstants.EVENT_TYPE)); + eventStatusResponseDTO.setEventStatus(eventStatusMap.get(TemplateVariablesConstants.EVENT_STATUS)); + eventStatusResponseDTO.setIndividualId(eventStatusMap.get(TemplateVariablesConstants.INDIVIDUAL_ID)); + eventStatusResponseDTO.setTimestamp(eventStatusMap.get(TemplateVariablesConstants.TIMESTAMP)); + eventStatusResponseDTO.setSummary(eventStatusMap.get(TemplateVariablesConstants.SUMMARY)); + + String name = identityServiceImpl.getClaimValue(env.getProperty(ResidentConstants.NAME_FROM_PROFILE)); + eventStatusMap.put(env.getProperty(ResidentConstants.APPLICANT_NAME_PROPERTY), name); + eventStatusMap.put(env.getProperty(ResidentConstants.AUTHENTICATION_MODE_PROPERTY), eventStatusMap.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + + if (serviceType.isPresent()) { + if (!serviceType.get().equals(ServiceType.ALL.name())) { + eventStatusMap.put(TemplateVariablesConstants.DESCRIPTION, + getDescriptionForLangCode(residentTransactionEntity.get(), languageCode, + eventStatusMap.get(TemplateVariablesConstants.EVENT_STATUS_ENUM), requestType)); + } + } else { + eventStatusMap.put(TemplateVariablesConstants.DESCRIPTION, eventStatusMap.get(TemplateVariablesConstants.EVENT_TYPE)); + } + + /** + * Removed map value from eventStatusMap to put outside of info in + * EventStatusResponseDTO + */ + eventStatusMap.remove(TemplateVariablesConstants.EVENT_ID); + eventStatusMap.remove(TemplateVariablesConstants.EVENT_TYPE); + eventStatusMap.remove(TemplateVariablesConstants.EVENT_STATUS); + eventStatusMap.remove(TemplateVariablesConstants.INDIVIDUAL_ID); + eventStatusMap.remove(TemplateVariablesConstants.SUMMARY); + eventStatusMap.remove(TemplateVariablesConstants.TIMESTAMP); + eventStatusMap.remove(TemplateVariablesConstants.TRACK_SERVICE_REQUEST_LINK); + + eventStatusResponseDTO.setInfo(eventStatusMap); + responseWrapper.setId(serviceEventId); + responseWrapper.setVersion(serviceEventVersion); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + responseWrapper.setResponse(eventStatusResponseDTO); + + } catch (ApisResourceAccessException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::getEventStatus():: Exception"); + throw new ResidentServiceCheckedException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "ResidentServiceImpl::getEventStatus()::exit"); + return responseWrapper; + } + + @Override + public ResponseWrapper getnotificationCount(String idaToken) throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + LocalDateTime time = null; + Long countOfUnreadNotifications; + Optional residentUserEntity = residentUserRepository.findById(idaToken); + List asyncRequestTypes = getAsyncRequestTypes(); + if (residentUserEntity.isPresent()) { + //Get the last bell notification click time + time = residentUserEntity.get().getLastbellnotifDtimes(); + //Get count of unread events after bell notification click time + countOfUnreadNotifications = residentTransactionRepository + .countByIdAndUnreadStatusForRequestTypesAfterNotificationClick(idaToken, time, asyncRequestTypes, onlineVerificationPartnerId); + } else { + //Get count of all unread events + countOfUnreadNotifications = residentTransactionRepository.countByIdAndUnreadStatusForRequestTypes(idaToken, + asyncRequestTypes, onlineVerificationPartnerId); + } + UnreadNotificationDto notification = new UnreadNotificationDto(); + notification.setUnreadCount(countOfUnreadNotifications); + responseWrapper.setId(serviceEventId); + responseWrapper.setVersion(serviceEventVersion); + responseWrapper.setResponse(notification); + return responseWrapper; + } + + private List getAsyncRequestTypes() { + return ServiceType.ASYNC.getRequestTypes() + .stream() + .map(RequestType::name) + .collect(Collectors.toList()); + } + + @Override + public ResponseWrapper getbellClickdttimes(String idaToken) { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + BellNotificationDto bellnotifdttimes = new BellNotificationDto(); + Optional residentUserEntity = residentUserRepository.findById(idaToken); + if (residentUserEntity.isPresent()) { + LocalDateTime time = residentUserEntity.get().getLastbellnotifDtimes(); + bellnotifdttimes.setLastbellnotifclicktime(time); + } + responseWrapper.setId(serviceEventId); + responseWrapper.setVersion(serviceEventVersion); + responseWrapper.setResponse(bellnotifdttimes); + return responseWrapper; + } + + @Override + public int updatebellClickdttimes(String idaToken) throws ApisResourceAccessException, ResidentServiceCheckedException { + LocalDateTime dt = DateUtils.getUTCCurrentDateTime(); + Optional entity = residentUserRepository.findById(idaToken); + if (entity.isPresent()) { + return residentUserRepository.updateByIdLastbellnotifDtimes(idaToken, dt); + } else { + ResidentUserEntity newUserData = new ResidentUserEntity(idaToken, dt); + residentUserRepository.save(newUserData); + return UPDATE_COUNT_FOR_NEW_USER_ACTION_ENTITY; + } + + } + + public ResponseWrapper> getNotificationList(Integer pageIndex, + Integer pageSize, String id, String languageCode, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException { + List requestTypeList = ServiceType.ASYNC.getRequestTypes(); + List statusCodeList = requestTypeList.stream() + .flatMap(requestType -> requestType.getNotificationStatusList(env)) + .collect(Collectors.toCollection(ArrayList::new)); + ResponseWrapper> responseWrapper = getServiceHistory(pageIndex, pageSize, + null, null, ServiceType.ASYNC.name(), null, + null, null, languageCode, timeZoneOffset, locale, + RESIDENT_NOTIFICATIONS_DEFAULT_PAGE_SIZE, statusCodeList); + responseWrapper.setId(unreadnotificationlist); + responseWrapper.setVersion(serviceEventVersion); + return responseWrapper; + } + + @Override + /** + * create the template for service history PDF and converted template into PDF + */ + public byte[] downLoadServiceHistory(ResponseWrapper> responseWrapper, + String languageCode, LocalDateTime eventReqDateTime, LocalDate fromDate, LocalDate toDate, + String serviceType, String statusFilter, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, IOException { + + logger.debug("ResidentServiceImpl::getResidentServicePDF()::entry"); + String serviceTypeTemplateData; + String statusFilterTemplateData; + String templateTypeCode = this.env.getProperty(ResidentConstants.SERVICE_HISTORY_PROPERTY_TEMPLATE_TYPE_CODE); + String fileText = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + // for avoiding null values in PDF + List serviceHistoryDtlsList = responseWrapper.getResponse().getData(); + if (serviceHistoryDtlsList != null && !serviceHistoryDtlsList.isEmpty()) { + IntStream.range(0, serviceHistoryDtlsList.size()).forEach(i -> { + addServiceHistoryDtls(i, serviceHistoryDtlsList.get(i)); + }); + } + if(serviceHistoryDtlsList!=null){ + for (ServiceHistoryResponseDto dto : serviceHistoryDtlsList) { + if (dto.getDescription() == null) + dto.setDescription(""); + } + } + Map servHistoryMap = new HashMap<>(); + if(eventReqDateTime == null){ + eventReqDateTime = DateUtils.getUTCCurrentDateTime(); + } + if(fromDate == null){ + fromDate = LocalDate.of(LocalDate.now().getYear(), Month.JANUARY, 1); + } + if(toDate == null){ + toDate = LocalDate.now(); + } + if(statusFilter == null || statusFilter.trim().equalsIgnoreCase(EventStatus.ALL.name())){ + statusFilterTemplateData = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, env.getProperty(ResidentConstants.RESIDENT_ALL_TEMPLATE_PROPERTY)); + } else { + statusFilterTemplateData = Stream.of(statusFilter.split(ATTRIBUTE_LIST_DELIMITER)).map(String::trim) + .map(status -> templateUtil.getEventStatusBasedOnLangcode(EventStatus.getEventStatusForText(status).get(), languageCode)) + .collect(Collectors.joining(UI_ATTRIBUTE_DATA_DELIMITER)); + } + + if(serviceType == null || serviceType.trim().equalsIgnoreCase(ServiceType.ALL.name())) { + serviceTypeTemplateData = templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, env.getProperty(ResidentConstants.RESIDENT_ALL_TEMPLATE_PROPERTY)); + } else { + serviceTypeTemplateData = Stream.of(serviceType.split(ATTRIBUTE_LIST_DELIMITER)).map(String::trim) + .map(service -> templateUtil.getServiceTypeBasedOnLangcode(ServiceType.getServiceTypeFromString(service).get(), languageCode)) + .collect(Collectors.joining(UI_ATTRIBUTE_DATA_DELIMITER)); + } + + servHistoryMap.put("eventReqTimeStamp", utility.formatWithOffsetForUI(timeZoneOffset, locale, eventReqDateTime)); + servHistoryMap.put("fromDate", fromDate); + servHistoryMap.put("toDate", toDate); + servHistoryMap.put("statusFilter", statusFilterTemplateData); + servHistoryMap.put("serviceType", serviceTypeTemplateData); + servHistoryMap.put("serviceHistoryDtlsList", serviceHistoryDtlsList); + servHistoryMap.put(TemplateVariablesConstants.PDF_HEADER_LOGO, utility.getPDFHeaderLogo()); + InputStream serviceHistTemplate = new ByteArrayInputStream(fileText.getBytes(StandardCharsets.UTF_8)); + InputStream serviceHistTemplateData = templateManager.merge(serviceHistTemplate, servHistoryMap); + StringWriter writer = new StringWriter(); + IOUtils.copy(serviceHistTemplateData, writer, ENCODE_TYPE); + logger.debug("ResidentServiceImpl::residentServiceHistoryPDF()::exit"); + return utility.signPdf(new ByteArrayInputStream(writer.toString().getBytes()), null); + } + + @Override + public ResponseWrapper getUserinfo(String idaToken, String langCode, int timeZoneOffset, String locale) throws ApisResourceAccessException, ResidentServiceCheckedException { + String name; + if (langCode != null) { + try { + Map identity = identityServiceImpl + .getIdentityAttributes(identityServiceImpl.getResidentIndvidualIdFromSession(), null); + name = identityServiceImpl.getFullName(identity, langCode); + } catch (IOException e) { + logger.error("Error occured in accessing identity data %s", e.getMessage()); + throw new ResidentServiceCheckedException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } + } else { + name = identityServiceImpl.getAvailableclaimValue(env.getProperty(ResidentConstants.NAME_FROM_PROFILE)); + } + String photo = identityServiceImpl.getAvailableclaimValue(env.getProperty(IMAGE)); + String email = identityServiceImpl.getAvailableclaimValue(env.getProperty(ResidentConstants.EMAIL_FROM_PROFILE)); + String phone = identityServiceImpl.getAvailableclaimValue(env.getProperty(ResidentConstants.PHONE_FROM_PROFILE)); + ResponseWrapper responseWrapper = new ResponseWrapper(); + UserInfoDto user = new UserInfoDto(); + Map data = new HashMap<>(); + responseWrapper.setId(env.getProperty(ResidentConstants.RESIDENT_USER_PROFILE_ID)); + responseWrapper.setVersion(env.getProperty(ResidentConstants.REQ_RES_VERSION)); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + //Return the second element + List lastTwoLoginEntities = residentSessionRepository.findFirst2ByIdaTokenOrderByLoginDtimesDesc(idaToken); + if (!lastTwoLoginEntities.isEmpty()) { + data.put("data", photo); + user.setFullName(name); + user.setPhone(phone); + user.setEmail(email); + + LocalDateTime lastLoginDateTime; + if (lastTwoLoginEntities.size() > 1) { + lastLoginDateTime = lastTwoLoginEntities.get(1).getLoginDtimes(); + } else { + lastLoginDateTime = lastTwoLoginEntities.get(0).getLoginDtimes(); + } + + user.setLastLogin(utility.formatWithOffsetForUI(timeZoneOffset, locale, lastLoginDateTime)); + user.setPhoto(data); + responseWrapper.setResponse(user); + return responseWrapper; + } else { + throw new ResidentServiceException(ResidentErrorCode.NO_RECORDS_FOUND.getErrorCode(), + ResidentErrorCode.NO_RECORDS_FOUND.getErrorMessage()); + } + + } + + /** + * + * @param index + */ + private void addServiceHistoryDtls(int index, ServiceHistoryResponseDto serviceHistoryDto) { + serviceHistoryDto.setSerialNumber(index + 1); + if (serviceHistoryDto.getDescription() == null) + serviceHistoryDto.setDescription(""); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentVidServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentVidServiceImpl.java index 012276ff4fc..aafed120442 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentVidServiceImpl.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/ResidentVidServiceImpl.java @@ -1,23 +1,35 @@ package io.mosip.resident.service.impl; +import static io.mosip.resident.constant.ResidentConstants.VID_POLICIES; +import static io.mosip.resident.constant.ResidentConstants.VID_POLICY; + import java.io.IOException; +import java.net.URL; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.BiFunction; import java.util.stream.Collectors; -import io.mosip.kernel.core.util.StringUtils; -import io.mosip.resident.exception.*; +import javax.annotation.PostConstruct; + +import io.mosip.resident.exception.IndividualIdNotFoundException; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.idrepository.core.dto.VidPolicy; import io.mosip.kernel.core.exception.ServiceError; import io.mosip.kernel.core.logger.spi.Logger; import io.mosip.kernel.core.util.DateUtils; @@ -25,319 +37,849 @@ import io.mosip.kernel.core.util.exception.JsonProcessingException; import io.mosip.resident.config.LoggerConfiguration; import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusSuccess; import io.mosip.resident.constant.IdType; import io.mosip.resident.constant.LoggerFileConstant; import io.mosip.resident.constant.NotificationTemplateCode; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.constant.TemplateEnum; -import io.mosip.resident.constant.VidType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.BaseVidRequestDto; +import io.mosip.resident.dto.BaseVidRevokeRequestDTO; +import io.mosip.resident.dto.GenerateVidResponseDto; +import io.mosip.resident.dto.IdentityDTO; import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.ObjectWithTransactionID; import io.mosip.resident.dto.RequestWrapper; import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.RevokeVidResponseDto; import io.mosip.resident.dto.VidGeneratorRequestDto; import io.mosip.resident.dto.VidGeneratorResponseDto; import io.mosip.resident.dto.VidRequestDto; +import io.mosip.resident.dto.VidRequestDtoV2; import io.mosip.resident.dto.VidResponseDto; import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.dto.VidRevokeRequestDTOV2; import io.mosip.resident.dto.VidRevokeResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.exception.VidAlreadyPresentException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.exception.VidRevocationException; +import io.mosip.resident.repository.ResidentTransactionRepository; import io.mosip.resident.service.IdAuthService; import io.mosip.resident.service.NotificationService; import io.mosip.resident.service.ResidentVidService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilitiy; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; @Component public class ResidentVidServiceImpl implements ResidentVidService { - private static final Logger logger = LoggerConfiguration.logConfig(ResidentVidServiceImpl.class); + private static final String AUTH_TYPE_CODE_SUFFIX = "-AUTH"; + + private static final String GENRATED_ON_TIMESTAMP = "genratedOnTimestamp"; + + private static final String EXPIRY_TIMESTAMP = "expiryTimestamp"; + + private static final String TRANSACTIONS_LEFT_COUNT = "transactionsLeftCount"; + + private static final String TRANSACTION_LIMIT = "transactionLimit"; + + private static final String MASKED_VID = "maskedVid"; + + private static final String HASH_ATTRIBUTES = "hashAttributes"; + + private static final Logger logger = LoggerConfiguration.logConfig(ResidentVidServiceImpl.class); - private static final String VID_ALREADY_EXISTS_ERROR_CODE = "IDR-VID-003"; + private static final String VID_ALREADY_EXISTS_ERROR_CODE = "IDR-VID-003"; + + private static final String VID = "vid"; + private static final String VID_TYPE = "vidType"; - @Value("${resident.vid.id}") - private String id; + @Value("${resident.vid.id}") + private String id; + + @Value("${resident.vid.id.generate}") + private String generateId; - @Value("${resident.vid.version}") - private String version; + @Value("${resident.vid.version}") + private String version; - @Value("${vid.create.id}") - private String vidCreateId; - - @Value("${vid.revoke.id}") - private String vidRevokeId; + @Value("${resident.vid.version.new}") + private String newVersion; + + @Value("${vid.create.id}") + private String vidCreateId; + + @Value("${vid.revoke.id}") + private String vidRevokeId; @Value("${resident.revokevid.id}") private String revokeVidId; + + @Value("${mosip.resident.revokevid.id}") + private String revokeVidIdNew; + + @Value("${mosip.resident.vid-policy-url}") + private String vidPolicyUrl; + + @Value("${resident.vid.get.id}") + private String residentVidGetId; + + @Value("${mosip.resident.create.vid.version}") + private String residentCreateVidVersion; + + @Autowired + private ObjectMapper mapper; + + @Autowired + private Environment env; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + private NotificationService notificationService; + + @Autowired + private IdAuthService idAuthService; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private Utility utility; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + private String vidPolicy; + + @Value("${perpatual.vid-type:PERPETUAL}") + private String perpatualVidType; + + @Autowired + private Utilities utilities; + + @Override + public ResponseWrapper generateVid(BaseVidRequestDto requestDto, + String individualId) throws OtpValidationFailedException, ResidentServiceCheckedException { + return generateVidV2(requestDto, individualId).getT1(); + } + + @Override + public Tuple2, String> generateVidV2(BaseVidRequestDto requestDto, + String individualId) throws OtpValidationFailedException, ResidentServiceCheckedException { + boolean isV2Request = requestDto instanceof VidRequestDtoV2; + ResponseWrapper responseDto = new ResponseWrapper<>(); + NotificationRequestDto notificationRequestDto = isV2Request? new NotificationRequestDtoV2() : new NotificationRequestDto(); + notificationRequestDto.setId(individualId); + + if (requestDto instanceof VidRequestDto) { + VidRequestDto vidRequestDto = (VidRequestDto) requestDto; + if (Objects.nonNull(vidRequestDto.getOtp())) { + try { + boolean isAuthenticated = idAuthService.validateOtp(vidRequestDto.getTransactionID(), + individualId, vidRequestDto.getOtp()); + if (!isAuthenticated) + throw new OtpValidationFailedException(); + + } catch (OtpValidationFailedException e) { + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), requestDto.getTransactionID()); + notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_FAILURE); + notificationService.sendNotification(notificationRequestDto, null); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), requestDto.getTransactionID()); + throw e; + } + } + } + IdentityDTO identityDTO = identityServiceImpl.getIdentity(individualId); + String email = identityDTO.getEmail(); + String phone = identityDTO.getPhone(); + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity=null; + try { + if(Utility.isSecureSession()){ + residentTransactionEntity = createResidentTransactionEntity(requestDto, identityDTO.getUIN()); + validateVidFromSession(individualId, requestDto.getVidType(), identityDTO.getUIN()); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + } + } + String uin = identityDTO.getUIN(); + // generate vid + VidGeneratorResponseDto vidResponse = vidGenerator(requestDto, uin); + logger.debug(AuditEnum.VID_GENERATED.getDescription(), requestDto.getTransactionID()); + // send notification + Map additionalAttributes = new HashMap<>(); + additionalAttributes.put(IdType.VID.name(), vidResponse.getVID()); + notificationRequestDto.setAdditionalAttributes(additionalAttributes); - @Autowired - private ObjectMapper mapper; - - @Autowired - private Environment env; - - @Autowired - private ResidentServiceRestClient residentServiceRestClient; - - @Autowired - private NotificationService notificationService; - - @Autowired - private IdAuthService idAuthService; - - @Autowired - private Utilitiy utilitiy; - - @Autowired - private AuditUtil audit; - - @Override - public ResponseWrapper generateVid(VidRequestDto requestDto) throws OtpValidationFailedException, ResidentServiceCheckedException { - - ResponseWrapper responseDto = new ResponseWrapper<>(); - NotificationRequestDto notificationRequestDto = new NotificationRequestDto(); - notificationRequestDto.setId(requestDto.getIndividualId()); - - try { - boolean isAuthenticated = idAuthService.validateOtp(requestDto.getTransactionID(), - requestDto.getIndividualId(), requestDto.getOtp()); - if (!isAuthenticated) - throw new OtpValidationFailedException(); - - } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED,requestDto.getTransactionID(),"Request to generate VID")); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(),"Request to generate VID")); - - throw e; - } - - try { - // generate vid - VidGeneratorResponseDto vidResponse = vidGenerator(requestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_GENERATED,requestDto.getTransactionID())); - // send notification - Map additionalAttributes = new HashMap<>(); - additionalAttributes.put(TemplateEnum.VID.name(), vidResponse.getVID()); - notificationRequestDto.setAdditionalAttributes(additionalAttributes); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_SUCCESS); - - NotificationResponseDTO notificationResponseDTO = notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS,requestDto.getTransactionID(), "Request to generate VID")); - // create response dto - VidResponseDto vidResponseDto = new VidResponseDto(); - vidResponseDto.setVid(vidResponse.getVID()); - vidResponseDto.setMessage(notificationResponseDTO.getMessage()); - responseDto.setResponse(vidResponseDto); - } catch (JsonProcessingException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_JSON_PARSING_EXCEPTION,requestDto.getTransactionID(),"Request to generate VID")); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(), "Request to generate VID")); - throw new VidCreationException(e.getErrorText()); - } catch (IOException | ApisResourceAccessException | VidCreationException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_GENERATION_FAILURE,requestDto.getTransactionID())); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(), "Request to generate VID")); - throw new VidCreationException(e.getMessage()); - } catch (VidAlreadyPresentException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_ALREADY_EXISTS,requestDto.getTransactionID())); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(), "Request to generate VID")); - throw e; - } - - responseDto.setId(id); - responseDto.setVersion(version); - responseDto.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); - - return responseDto; - } - - private VidGeneratorResponseDto vidGenerator(VidRequestDto requestDto) - throws JsonProcessingException, IOException, ApisResourceAccessException { - VidGeneratorRequestDto vidRequestDto = new VidGeneratorRequestDto(); - RequestWrapper request = new RequestWrapper<>(); - ResponseWrapper response = null; - - vidRequestDto.setUIN(requestDto.getIndividualId()); - vidRequestDto.setVidType(requestDto.getVidType()); - request.setId(vidCreateId); - request.setVersion(version); - request.setRequest(vidRequestDto); - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - IdType.UIN.name(), - "ResidentVidServiceImpl::vidGenerator():: post CREATEVID service call started with request data : " - + JsonUtils.javaObjectToJsonString(request)); - - try { - response = (ResponseWrapper) residentServiceRestClient - .postApi(env.getProperty(ApiName.IDAUTHCREATEVID.name()), - MediaType.APPLICATION_JSON, request, ResponseWrapper.class); - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - IdType.UIN.name(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + e.getMessage() - + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Unable to create vid : " + e.getMessage()); - } - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - IdType.UIN.name(), - "ResidentVidServiceImpl::vidGenerator():: create Vid response :: " + JsonUtils.javaObjectToJsonString(response)); - - if (response.getErrors() != null && !response.getErrors().isEmpty()) { - List list = response.getErrors().stream().filter(err -> err.getErrorCode().equalsIgnoreCase(VID_ALREADY_EXISTS_ERROR_CODE)).collect(Collectors.toList()); - throw (list.size() == 1) ? - new VidAlreadyPresentException(ResidentErrorCode.VID_ALREADY_PRESENT.getErrorCode(), - ResidentErrorCode.VID_ALREADY_PRESENT.getErrorMessage()) - : - new VidCreationException(response.getErrors().get(0).getMessage()); - - } - - VidGeneratorResponseDto vidResponse = mapper.readValue(mapper.writeValueAsString(response.getResponse()), - VidGeneratorResponseDto.class); - - return vidResponse; - } - - - @Override - public ResponseWrapper revokeVid(VidRevokeRequestDTO requestDto, String vid) - throws OtpValidationFailedException, ResidentServiceCheckedException { - - if (!requestDto.getIndividualId().equals(vid)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", "Request to revoke VID")); - throw new InvalidInputException("The VID in the URL and body mismatched"); + NotificationResponseDTO notificationResponseDTO; + if(isV2Request) { + VidRequestDtoV2 vidRequestDtoV2 = (VidRequestDtoV2) requestDto; + NotificationRequestDtoV2 notificationRequestDtoV2=(NotificationRequestDtoV2) notificationRequestDto; + notificationRequestDtoV2.setTemplateType(TemplateType.SUCCESS); + notificationRequestDtoV2.setRequestType(RequestType.GENERATE_VID); + notificationRequestDtoV2.setEventId(eventId); + + notificationResponseDTO=notificationService + .sendNotification(notificationRequestDto, vidRequestDtoV2.getChannels(), email, phone, identityDTO); + } else { + notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_GEN_SUCCESS); + notificationResponseDTO = notificationService.sendNotification(notificationRequestDto, identityDTO); + } + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), requestDto.getTransactionID()); + // create response dto + VidResponseDto vidResponseDto; + if(notificationResponseDTO.getMaskedEmail() != null || notificationResponseDTO.getMaskedPhone() != null) { + GenerateVidResponseDto generateVidResponseDto = new GenerateVidResponseDto(); + vidResponseDto = generateVidResponseDto; + generateVidResponseDto.setMaskedEmail(notificationResponseDTO.getMaskedEmail()); + generateVidResponseDto.setMaskedPhone(notificationResponseDTO.getMaskedPhone()); + generateVidResponseDto.setStatus(ResidentConstants.SUCCESS); + } else { + vidResponseDto = new VidResponseDto(); + } + vidResponseDto.setVid(vidResponse.getVID()); + vidResponseDto.setMessage(notificationResponseDTO.getMessage()); + responseDto.setResponse(vidResponseDto); + + if(Utility.isSecureSession()) { + residentTransactionEntity.setRefId(utility.convertToMaskData(vidResponseDto.getVid())); + residentTransactionEntity.setStatusCode(EventStatusSuccess.VID_GENERATED.name()); + residentTransactionEntity.setStatusComment(EventStatusSuccess.VID_GENERATED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.GENERATE_VID.name(), ResidentConstants.SUCCESS)); + } + + } catch (JsonProcessingException e) { + logger.error(AuditEnum.VID_JSON_PARSING_EXCEPTION.getDescription(), requestDto.getTransactionID()); + notifyVidCreationFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } catch (IOException | ApisResourceAccessException | VidCreationException e) { + logger.error(AuditEnum.VID_GENERATION_FAILURE.getDescription(), requestDto.getTransactionID()); + notifyVidCreationFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } catch (VidAlreadyPresentException e) { + logger.error(AuditEnum.VID_ALREADY_EXISTS.getDescription(), requestDto.getTransactionID()); + notifyVidCreationFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } catch (ResidentServiceCheckedException e) { + logger.error(AuditEnum.VID_ALREADY_EXISTS.getDescription(), requestDto.getTransactionID()); + notifyVidCreationFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } finally { + if (Utility.isSecureSession() && residentTransactionEntity != null) { + //if the status code or request summary will come as null, it will set it as failed. + if(residentTransactionEntity.getStatusCode() == null || residentTransactionEntity.getRequestSummary() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment(ResidentConstants.FAILED); + residentTransactionEntity + .setRequestSummary(String.format("%s - %s", RequestType.GENERATE_VID.name(), ResidentConstants.FAILED)); + } + residentTransactionRepository.save(residentTransactionEntity); + } + } + if (isV2Request) + { + responseDto.setId(generateId); + responseDto.setVersion(newVersion); + } + else + { + responseDto.setId(id); + responseDto.setVersion(version); } + responseDto.setResponsetime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + if(eventId == null) { + eventId = ResidentConstants.NOT_AVAILABLE; + } + return Tuples.of(responseDto, eventId); + } - ResponseWrapper responseDto = new ResponseWrapper<>(); + private void validateVidFromSession(String individualId, String vidType, String uin) { + try { + IdType idType = identityServiceImpl.getIndividualIdType(individualId); + Tuple2 numberOfPerpetualVidTuple = getNumberOfPerpetualVidFromUin( + uin); + /** + * Check If id type is VID. + */ + if (idType.equals(IdType.VID)) { + /** + * Checks if VID type is Perpetual VID. + */ + if(vidType!=null && vidType.equalsIgnoreCase(ResidentConstants.PERPETUAL)){ + int numberOfPerpetualVid = numberOfPerpetualVidTuple.getT1(); + VidPolicy vidPolicy = getVidPolicyAsVidPolicyDto(); + /** + * Checks if VID Policy allowed instance is greater than number of existing Perpetual VID. + */ + if(vidPolicy.getAllowedInstances() >= numberOfPerpetualVid + /** + * Checks if VID Policy auto restore allowed is true. + */ + && vidPolicy.getAutoRestoreAllowed() + /** + * Checks if VID Policy restore on action is not ACTIVE. + */ + && !vidPolicy.getRestoreOnAction(). + equalsIgnoreCase(env.getProperty(ResidentConstants.VID_ACTIVE_STATUS)) + /** + * Checks if first Perpetual Vid is equal to logged in vid. + */ + && numberOfPerpetualVidTuple.getT2().equals(individualId)){ + throw new ResidentServiceException(ResidentErrorCode.VID_CREATION_FAILED_WITH_REVOCATION, + ResidentErrorCode.VID_CREATION_FAILED_WITH_REVOCATION.getErrorMessage()); + } + } + } + }catch (ApisResourceAccessException | ResidentServiceCheckedException | + com.fasterxml.jackson.core.JsonProcessingException | ResidentServiceException e) { + logger.error(AuditEnum.VID_GENERATION_FAILURE.getDescription() + e); + throw new ResidentServiceException(ResidentErrorCode.VID_CREATION_FAILED_WITH_REVOCATION.getErrorCode(), + ResidentErrorCode.VID_CREATION_FAILED_WITH_REVOCATION.getErrorMessage(), e); + } + } - NotificationRequestDto notificationRequestDto = new NotificationRequestDto(); + private VidPolicy getVidPolicyAsVidPolicyDto() throws ResidentServiceCheckedException, com.fasterxml.jackson.core.JsonProcessingException { + String vidPolicy = getVidPolicy(); + VidPolicy vidPolicyDto = new VidPolicy(); + Map vidPolicyMap = mapper.readValue(vidPolicy, Map.class); + Object vidPolicyMapValue = vidPolicyMap.get(VID_POLICIES); + List> vidList = (List>)vidPolicyMapValue; + if(vidList!=null){ + for(Map vid:vidList){ + if(vid.get(TemplateVariablesConstants.VID_TYPE).equalsIgnoreCase(ResidentConstants.PERPETUAL)){ + vidPolicyDto = mapper.convertValue(vid.get(VID_POLICY), VidPolicy.class); + } + } + } + return vidPolicyDto; + } - try { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP,requestDto.getTransactionID() ,"Request to revoke VID")); - boolean isAuthenticated = idAuthService.validateOtp(requestDto.getTransactionID(), requestDto.getIndividualId(), - requestDto.getOtp()); - - if (!isAuthenticated) - throw new OtpValidationFailedException(); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_OTP_SUCCESS,requestDto.getTransactionID() ,"Request to revoke VID")); - } catch (OtpValidationFailedException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.OTP_VALIDATION_FAILED,requestDto.getTransactionID() ,"Request to revoke VID")); - notificationRequestDto.setId(requestDto.getIndividualId()); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID() ,"Request to revoke VID")); - throw e; + private Tuple2 getNumberOfPerpetualVidFromUin(String uin) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper>> vids = retrieveVids(ResidentConstants.UTC_TIMEZONE_OFFSET, null, uin); + List> vidList = vids.getResponse().stream().filter(map -> map.containsKey(TemplateVariablesConstants.VID_TYPE) + && String.valueOf(map.get(TemplateVariablesConstants.VID_TYPE)).equalsIgnoreCase((ResidentConstants.PERPETUAL))) + .collect(Collectors.toList()); + if(vidList.isEmpty()) { + return Tuples.of(0, ""); } + return Tuples.of(vidList.size(), vidList.get(0).get(TemplateVariablesConstants.VID).toString()); + } + + private ResidentTransactionEntity createResidentTransactionEntity(BaseVidRequestDto requestDto, String uin) throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity=utility.createEntity(RequestType.GENERATE_VID); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setIndividualId(identityServiceImpl.getResidentIndvidualIdFromSession()); + residentTransactionEntity.setTokenId(identityServiceImpl.getIDAToken(uin)); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + residentTransactionEntity.setRefIdType(requestDto.getVidType().toUpperCase()); + return residentTransactionEntity; + } + + private VidGeneratorResponseDto vidGenerator(BaseVidRequestDto requestDto, String uin) + throws JsonProcessingException, IOException, ApisResourceAccessException { + VidGeneratorRequestDto vidRequestDto = new VidGeneratorRequestDto(); + RequestWrapper request = new RequestWrapper<>(); + ResponseWrapper response = null; + + vidRequestDto.setUIN(uin); + vidRequestDto.setVidType(requestDto.getVidType()); + request.setId(vidCreateId); + request.setVersion(residentCreateVidVersion); + request.setRequest(vidRequestDto); + request.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + IdType.UIN.name(), + "ResidentVidServiceImpl::vidGenerator():: post CREATEVID service call started with request data : " + + JsonUtils.javaObjectToJsonString(request)); - String uin = null; try { - JSONObject jsonObject = utilitiy.retrieveIdrepoJson(requestDto.getIndividualId()); - uin = JsonUtil.getJSONValue(jsonObject, IdType.UIN.name()); - } catch (IdRepoAppException e) { - throw new DataNotFoundException(e.getErrorCode(), e.getMessage()); + response = (ResponseWrapper) residentServiceRestClient + .postApi(env.getProperty(ApiName.IDAUTHCREATEVID.name()), + MediaType.APPLICATION_JSON, request, ResponseWrapper.class); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + IdType.UIN.name(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + e.getMessage() + + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Unable to create vid : " + e.getMessage()); + } + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + IdType.UIN.name(), + "ResidentVidServiceImpl::vidGenerator():: create Vid response :: " + + JsonUtils.javaObjectToJsonString(response)); + + if (response.getErrors() != null && !response.getErrors().isEmpty()) { + List list = response.getErrors().stream() + .filter(err -> err.getErrorCode().equalsIgnoreCase(VID_ALREADY_EXISTS_ERROR_CODE)) + .collect(Collectors.toList()); + throw (list.size() == 1) + ? new VidAlreadyPresentException(ResidentErrorCode.VID_ALREADY_PRESENT.getErrorCode(), + ResidentErrorCode.VID_ALREADY_PRESENT.getErrorMessage()) + : new VidCreationException(response.getErrors().get(0).getMessage()); + } - notificationRequestDto.setId(uin); + VidGeneratorResponseDto vidResponse = mapper.readValue(mapper.writeValueAsString(response.getResponse()), + VidGeneratorResponseDto.class); + + return vidResponse; + } + + @Override + public ResponseWrapper revokeVid(BaseVidRevokeRequestDTO requestDto, String vid, String indivudalId) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + return revokeVidV2(requestDto, vid, indivudalId).getT1(); + } + + @Override + public Tuple2, String> revokeVidV2(BaseVidRevokeRequestDTO requestDto, String vid, String indivudalId) + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + boolean isV2Request = requestDto instanceof VidRevokeRequestDTOV2; + ResponseWrapper responseDto = new ResponseWrapper<>(); + NotificationRequestDto notificationRequestDto = isV2Request? new NotificationRequestDtoV2() : new NotificationRequestDto(); - try { + if(requestDto instanceof VidRevokeRequestDTO) { + VidRevokeRequestDTO vidRevokeRequestDTO = (VidRevokeRequestDTO) requestDto; + if (Objects.nonNull(vidRevokeRequestDTO.getOtp())) { + try { + boolean isAuthenticated = idAuthService.validateOtp(requestDto.getTransactionID(), + vidRevokeRequestDTO.getIndividualId(), vidRevokeRequestDTO.getOtp()); + + if (!isAuthenticated) + throw new OtpValidationFailedException(); + logger.debug(AuditEnum.VALIDATE_OTP_SUCCESS.getDescription(), requestDto.getTransactionID()); + } catch (OtpValidationFailedException e) { + logger.error(AuditEnum.OTP_VALIDATION_FAILED.getDescription(), requestDto.getTransactionID()); + notificationRequestDto.setId(vidRevokeRequestDTO.getIndividualId()); + notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_FAILURE); + notificationService.sendNotification(notificationRequestDto, null); + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), requestDto.getTransactionID()); + throw e; + } + } + } + String eventId = ResidentConstants.NOT_AVAILABLE; + ResidentTransactionEntity residentTransactionEntity = null; + IdentityDTO identityDTO = new IdentityDTO(); + String uin=""; + + if(isV2Request) { + try { + identityDTO = identityServiceImpl.getIdentity(indivudalId); + } catch (Exception e){ + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_NOT_BELONG_TO_USER, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + uin = identityDTO.getUIN(); + if(Utility.isSecureSession()) { + residentTransactionEntity = createResidentTransEntity(vid, uin); + if (residentTransactionEntity != null) { + eventId = residentTransactionEntity.getEventId(); + } + } + notificationRequestDto.setId(uin); + String uinForVid = null; + try { + uinForVid = utilities.getUinByVid(vid); + }catch (IndividualIdNotFoundException e){ + throw new ResidentServiceCheckedException(ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorCode(), + ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorMessage()); + } + if(uinForVid != null && !uin.equalsIgnoreCase(uinForVid)) { + if(Utility.isSecureSession()) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.REVOKE_VID.name(), ResidentConstants.FAILED)); + residentTransactionRepository.save(residentTransactionEntity); + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_NOT_BELONG_TO_USER, + Map.of(ResidentConstants.EVENT_ID, eventId)); + } + } + } else { + String uinForVid; + try { + uinForVid = identityServiceImpl.getUinForIndividualId(vid); + }catch (Exception exception){ + logger.error(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode()+exception); + throw new ApisResourceAccessException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), exception); + } + identityDTO = identityServiceImpl.getIdentity(indivudalId); + uin = identityDTO.getUIN(); + notificationRequestDto.setId(uin); + if(uinForVid == null || !uinForVid.equalsIgnoreCase(uin)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.VID_NOT_BELONG_TO_INDIVITUAL); + } + } + try { // revoke vid VidGeneratorResponseDto vidResponse = vidDeactivator(requestDto, uin, vid); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.DEACTIVATED_VID,requestDto.getTransactionID())); + logger.debug(AuditEnum.DEACTIVATED_VID.getDescription(), requestDto.getTransactionID()); // send notification Map additionalAttributes = new HashMap<>(); - additionalAttributes.put(TemplateEnum.VID.name(), vid); + additionalAttributes.put(IdType.VID.name(), vid); notificationRequestDto.setAdditionalAttributes(additionalAttributes); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_SUCCESS); - NotificationResponseDTO notificationResponseDTO = notificationService - .sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_SUCCESS,requestDto.getTransactionID(),"Request to revoke VID")); + NotificationResponseDTO notificationResponseDTO; + if(isV2Request) { + NotificationRequestDtoV2 notificationRequestDtoV2=(NotificationRequestDtoV2) notificationRequestDto; + notificationRequestDtoV2.setTemplateType(TemplateType.SUCCESS); + notificationRequestDtoV2.setRequestType(RequestType.REVOKE_VID); + notificationRequestDtoV2.setEventId(eventId); + + notificationResponseDTO=notificationService.sendNotification(notificationRequestDto, identityDTO); + } else { + notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_SUCCESS); + notificationResponseDTO = notificationService.sendNotification(notificationRequestDto, identityDTO); + } + logger.debug(AuditEnum.SEND_NOTIFICATION_SUCCESS.getDescription(), requestDto.getTransactionID()); // create response dto - VidRevokeResponseDTO vidRevokeResponseDto = new VidRevokeResponseDTO(); + VidRevokeResponseDTO vidRevokeResponseDto; + if(isV2Request) { + RevokeVidResponseDto revokeVidResponseDto = new RevokeVidResponseDto(); + vidRevokeResponseDto = revokeVidResponseDto; + revokeVidResponseDto.setStatus(ResidentConstants.SUCCESS); + } else { + vidRevokeResponseDto = new VidRevokeResponseDTO(); + } vidRevokeResponseDto.setMessage(notificationResponseDTO.getMessage()); responseDto.setResponse(vidRevokeResponseDto); + if(Utility.isSecureSession()) { + residentTransactionEntity.setStatusCode(EventStatusSuccess.VID_REVOKED.name()); + residentTransactionEntity.setStatusComment(EventStatusSuccess.VID_REVOKED.name()); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", RequestType.REVOKE_VID.name(), ResidentConstants.SUCCESS)); + } } catch (JsonProcessingException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_JSON_PARSING_EXCEPTION,requestDto.getTransactionID(),"Request to revoke VID")); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(),"Request to revoke VID")); - throw new VidRevocationException(e.getErrorText()); - } catch (IOException | ApisResourceAccessException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_REVOKE_EXCEPTION,requestDto.getTransactionID())); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(),"Request to revoke VID")); - throw new VidRevocationException(e.getMessage()); - } catch ( VidRevocationException e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.VID_REVOKE_EXCEPTION,requestDto.getTransactionID())); - notificationRequestDto.setTemplateTypeCode(NotificationTemplateCode.RS_VIN_REV_FAILURE); - notificationService.sendNotification(notificationRequestDto); - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.SEND_NOTIFICATION_FAILURE,requestDto.getTransactionID(),"Request to revoke VID")); - throw e; + logger.error(AuditEnum.VID_JSON_PARSING_EXCEPTION.getDescription(), requestDto.getTransactionID()); + notifyVidRevokeFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } catch (IOException | ApisResourceAccessException | VidRevocationException e) { + logger.error(AuditEnum.VID_REVOKE_EXCEPTION.getDescription(), requestDto.getTransactionID()); + notifyVidRevokeFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } catch (ResidentServiceCheckedException e) { + logger.error(AuditEnum.VID_REVOKE_EXCEPTION.getDescription(), requestDto.getTransactionID()); + notifyVidRevokeFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, identityDTO); + } finally { + if (Utility.isSecureSession() && residentTransactionEntity != null) { + //if the status code or request summary will come as null, it will set it as failed. + if(residentTransactionEntity.getStatusCode() == null || residentTransactionEntity.getRequestSummary() == null) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment(ResidentConstants.FAILED); + residentTransactionEntity + .setRequestSummary(String.format("%s - %s", RequestType.REVOKE_VID.name(), ResidentConstants.FAILED)); + } + residentTransactionRepository.save(residentTransactionEntity); + } + } + + if (isV2Request) { + responseDto.setId(revokeVidIdNew); + responseDto.setVersion(newVersion); + } + else + { + responseDto.setId(revokeVidId); + responseDto.setVersion(version); + } + responseDto.setResponsetime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + + if(eventId == null) { + eventId = ResidentConstants.NOT_AVAILABLE; } + return Tuples.of(responseDto, eventId); + } + + private void notifyVidCreationFailureAndThrowException(BaseVidRequestDto requestDto, boolean isV2Request, + NotificationRequestDto notificationRequestDto, String eventId, + ResidentTransactionEntity residentTransactionEntity, E e, Map identityDTO) + throws ResidentServiceCheckedException, VidAlreadyPresentException { + if(e instanceof VidAlreadyPresentException) { + notifyFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, + residentTransactionEntity, e, RequestType.GENERATE_VID, NotificationTemplateCode.RS_VIN_GEN_FAILURE, + "Request to generate VID", this::createVidAlreadyPresentException, VidAlreadyPresentException.class, identityDTO); + } else{ + notifyFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, + residentTransactionEntity, e, RequestType.GENERATE_VID, NotificationTemplateCode.RS_VIN_GEN_FAILURE, + "Request to generate VID", this::createVidCreationException, VidCreationException.class, identityDTO); + } + } + + private VidCreationException createVidCreationException(String eventId, Throwable rootCause) { + return eventId == null ? new VidCreationException(rootCause.getMessage(), rootCause): new VidCreationException(rootCause.getMessage(), rootCause, Map.of(ResidentConstants.EVENT_ID, eventId)); + } + + + private void notifyVidRevokeFailureAndThrowException(BaseVidRevokeRequestDTO requestDto, boolean isV2Request, + NotificationRequestDto notificationRequestDto, String eventId, + ResidentTransactionEntity residentTransactionEntity, E e, Map identity) + throws ResidentServiceCheckedException, VidRevocationException { + notifyFailureAndThrowException(requestDto, isV2Request, notificationRequestDto, eventId, + residentTransactionEntity, e, RequestType.REVOKE_VID, NotificationTemplateCode.RS_VIN_REV_FAILURE, + "Request to revoke VID", this::createVidRevocationException, VidRevocationException.class, identity); + } - responseDto.setId(revokeVidId); - responseDto.setVersion(version); - responseDto.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); + private void notifyFailureAndThrowException(ObjectWithTransactionID requestDto, boolean isV2Request, + NotificationRequestDto notificationRequestDto, String eventId, + ResidentTransactionEntity residentTransactionEntity, Throwable e, RequestType requestType, NotificationTemplateCode notificationTemplate, + String auditEventName, BiFunction targetExceptionCreator, Class targetExceptionClass, Map identity) throws ResidentServiceCheckedException, TE { + notifyFailure(requestDto, isV2Request, notificationRequestDto, eventId, residentTransactionEntity, e, requestType, + notificationTemplate, auditEventName, targetExceptionCreator, identity); + throwException(eventId, e, targetExceptionCreator, targetExceptionClass); + } + + private void notifyFailure(ObjectWithTransactionID requestDto, boolean isV2Request, + NotificationRequestDto notificationRequestDto, String eventId, + ResidentTransactionEntity residentTransactionEntity, Throwable e, RequestType requestType, + NotificationTemplateCode notificationTemplate, String auditEventName, + BiFunction targetExceptionCreator, Map identity) throws ResidentServiceCheckedException, TE { + if(isV2Request) { + NotificationRequestDtoV2 notificationRequestDtoV2=(NotificationRequestDtoV2) notificationRequestDto; + notificationRequestDtoV2.setTemplateType(TemplateType.FAILURE); + notificationRequestDtoV2.setRequestType(requestType); + notificationRequestDtoV2.setEventId(eventId); + + notificationService.sendNotification(notificationRequestDto, identity); + } else { + notificationRequestDto.setTemplateTypeCode(notificationTemplate); + notificationService.sendNotification(notificationRequestDto, identity); + } + logger.error(AuditEnum.SEND_NOTIFICATION_FAILURE.getDescription(), requestDto.getTransactionID()); + if(Utility.isSecureSession()) { + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + residentTransactionEntity.setStatusComment(ResidentConstants.FAILED); + residentTransactionEntity.setRequestSummary(String.format("%s - %s", requestType.name(), ResidentConstants.FAILED)); + throw targetExceptionCreator.apply(eventId, e); + } + } + + private void throwException(String eventId, Throwable e, + BiFunction targetExceptionCreator, Class targetExceptionClass) + throws TE, ResidentServiceCheckedException { + if(Utility.isSecureSession()) { + throw targetExceptionCreator.apply(eventId, e); + } else { + if(targetExceptionClass.isInstance(e)) { + throw targetExceptionClass.cast(e); + } else if(e instanceof ResidentServiceCheckedException) { + throw (ResidentServiceCheckedException) e; + } else { + throw targetExceptionCreator.apply(null, e); + } + } + } + + private VidRevocationException createVidRevocationException(String eventId, Throwable rootCause) { + return eventId == null ? new VidRevocationException(rootCause.getMessage(), rootCause): new VidRevocationException(rootCause.getMessage(), rootCause, Map.of(ResidentConstants.EVENT_ID, eventId)); + } + + private VidAlreadyPresentException createVidAlreadyPresentException(String eventId, Throwable rootCause) { + return eventId == null ? new VidAlreadyPresentException(rootCause.getMessage(), rootCause): new VidAlreadyPresentException(rootCause.getMessage(), rootCause, Map.of(ResidentConstants.EVENT_ID, eventId)); + } + + private ResidentTransactionEntity createResidentTransEntity(String vid, String uin) throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity residentTransactionEntity=utility.createEntity(RequestType.REVOKE_VID); + residentTransactionEntity.setEventId(utility.createEventId()); + residentTransactionEntity.setRefId(utility.convertToMaskData(vid)); + residentTransactionEntity.setIndividualId(identityServiceImpl.getResidentIndvidualIdFromSession()); + try { + residentTransactionEntity.setRefIdType(getVidTypeFromVid(vid, uin)); + } catch (Exception exception){ + residentTransactionEntity.setRefIdType(""); + } + residentTransactionEntity.setTokenId(identityServiceImpl.getIDAToken(uin)); + residentTransactionEntity.setAuthTypeCode(identityServiceImpl.getResidentAuthenticationMode()); + return residentTransactionEntity; + } - return responseDto; + private String getVidTypeFromVid(String vid, String uin) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper>> vids = retrieveVids(ResidentConstants.UTC_TIMEZONE_OFFSET, null, uin); + return vids.getResponse().stream() + .filter(map -> ((String)map.get(TemplateVariablesConstants.VID)).equals(vid)) + .map(map -> (String)map.get(TemplateVariablesConstants.VID_TYPE)) + .findAny() + .orElse(null); } - private VidGeneratorResponseDto vidDeactivator(VidRevokeRequestDTO requestDto, String uin, String vid) + private VidGeneratorResponseDto vidDeactivator(BaseVidRevokeRequestDTO requestDto, String uin, String vid) throws JsonProcessingException, IOException, ApisResourceAccessException, ResidentServiceCheckedException { VidGeneratorRequestDto vidRequestDto = new VidGeneratorRequestDto(); RequestWrapper request = new RequestWrapper<>(); - ResponseWrapper response = null; + ResponseWrapper response = null; vidRequestDto.setUIN(uin); vidRequestDto.setVidStatus(requestDto.getVidStatus()); - vidRequestDto.setVidType(VidType.PERPETUAL.name()); request.setId(vidRevokeId); request.setVersion(version); request.setRequest(vidRequestDto); - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - + request.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + String apiUrl=env.getProperty(ApiName.IDAUTHREVOKEVID.name()) + "/" + vid; + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - requestDto.getIndividualIdType(), + "", "ResidentVidServiceImpl::vidDeactivator():: post REVOKEVID service call started with request data : " + JsonUtils.javaObjectToJsonString(request)); try { - response = (ResponseWrapper) residentServiceRestClient.patchApi( - env.getProperty(ApiName.IDAUTHREVOKEVID.name()) + "/" + vid, MediaType.APPLICATION_JSON, request, + response = (ResponseWrapper) residentServiceRestClient.patchApi(apiUrl, MediaType.APPLICATION_JSON, request, ResponseWrapper.class); } catch (Exception e) { logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - requestDto.getIndividualIdType(), ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + "", ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + e.getMessage() + ExceptionUtils.getStackTrace(e)); throw new ApisResourceAccessException("Unable to revoke VID : " + e.getMessage()); } logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - requestDto.getIndividualIdType(), "ResidentVidServiceImpl::vidDeactivator():: revoke Vid response :: " + "", "ResidentVidServiceImpl::vidDeactivator():: revoke Vid response :: " + JsonUtils.javaObjectToJsonString(response)); - if (response.getErrors() != null && !response.getErrors().isEmpty()) { + if (response == null || response.getErrors() != null && !response.getErrors().isEmpty()) { throw new VidRevocationException(ResidentErrorCode.VID_REVOCATION_EXCEPTION.getErrorMessage()); } - VidGeneratorResponseDto vidResponse = mapper.readValue(mapper.writeValueAsString(response.getResponse()), - VidGeneratorResponseDto.class); + VidGeneratorResponseDto vidResponse = mapper.convertValue(response.getResponse(), VidGeneratorResponseDto.class); return vidResponse; } - + + /** + * The function is used to fetch the VID policy from the URL and store + * return it. + * + * @return The vidPolicy is being returned. + */ + @Override + @PostConstruct + public String getVidPolicy() throws ResidentServiceCheckedException { + if (Objects.isNull(vidPolicy)) { + try { + JsonNode policyJson = mapper.readValue(new URL(vidPolicyUrl), JsonNode.class); + vidPolicy = policyJson.toString(); + } catch (IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "GetVidPolicy", + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(ResidentErrorCode.POLICY_EXCEPTION.getErrorCode(), + ResidentErrorCode.POLICY_EXCEPTION.getErrorMessage(), e); + } + } + return vidPolicy; + } + + @Override + public ResponseWrapper>> retrieveVids(String residentIndividualId, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException { + IdentityDTO identityDTO = identityServiceImpl.getIdentity(residentIndividualId); + return retrieveVids(timeZoneOffset, locale, identityDTO.getUIN()); + } + + @Override + public ResponseWrapper>> retrieveVids(int timeZoneOffset, String locale, String uin) + throws ResidentServiceCheckedException, ApisResourceAccessException { + return retrieveVidsfromUin(uin, timeZoneOffset, locale); + } + + @Override + public ResponseWrapper>> retrieveVidsfromUin(String uin, int timeZoneOffset, String locale) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper response; + try { + response = (ResponseWrapper) residentServiceRestClient.getApi( + env.getProperty(ApiName.RETRIEVE_VIDS.name()) + uin, ResponseWrapper.class); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + uin, ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + + e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Unable to retrieve VID : " + e.getMessage()); + } + + List> filteredList = ((List>) response.getResponse()).stream() + .map(map -> { + LinkedHashMap lhm = new LinkedHashMap(map); + getMaskedVid(lhm); + getRefIdHash(lhm); + normalizeTime(EXPIRY_TIMESTAMP, lhm, timeZoneOffset, locale); + normalizeTime(GENRATED_ON_TIMESTAMP, lhm, timeZoneOffset, locale); + return lhm; + }) + .filter(map1 -> map1.get(TRANSACTIONS_LEFT_COUNT) == null || (int) map1.get(TRANSACTIONS_LEFT_COUNT) > 0) + .collect(Collectors.toList()); + ResponseWrapper>> res = new ResponseWrapper>>(); + res.setId(residentVidGetId); + res.setVersion(newVersion); + res.setResponsetime(DateUtils.getUTCCurrentDateTimeString()); + res.setResponse(filteredList); + return res; + + } + + private void normalizeTime(String attributeName, LinkedHashMap lhm, int timeZoneOffset, String locale) { + Object timeObject = lhm.get(attributeName); + if(timeObject instanceof String) { + String timeStr = String.valueOf(timeObject); + LocalDateTime localDateTime = mapper.convertValue(timeStr, LocalDateTime.class); + //For the big expiry time, assume no expiry time, so set to null + if(localDateTime.getYear() >= 9999) { + lhm.put(attributeName, null); + } else { + lhm.put(attributeName, utility.formatWithOffsetForUI(timeZoneOffset, locale, localDateTime)) ; + } + } + } + + private Map getMaskedVid(Map map) { + String maskedvid = utility.convertToMaskData(map.get(VID).toString()); + map.put(MASKED_VID, maskedvid); + return map; + } + + private Map getRefIdHash(Map map) { + try { + if(map.get(TRANSACTION_LIMIT) != null) { + String hashrefid = utility.getRefIdHash(map.get(VID).toString()); + int countdb = residentTransactionRepository.findByRefIdAndAuthTypeCodeLike(hashrefid, AUTH_TYPE_CODE_SUFFIX); + int limitCount = (int) map.get(TRANSACTION_LIMIT); + int leftcount = limitCount - countdb; + if(leftcount < 0) { + map.put(TRANSACTIONS_LEFT_COUNT, 0); + } else { + map.put(TRANSACTIONS_LEFT_COUNT, leftcount); + } + } else { + map.put(TRANSACTIONS_LEFT_COUNT, map.get(TRANSACTION_LIMIT)); + } + map.remove(HASH_ATTRIBUTES); + } catch (NoSuchAlgorithmException e) { + logger.error("NoSuchAlgorithmException", ExceptionUtils.getStackTrace(e)); + logger.error("In getRefIdHash method of ResidentVidServiceImpl class", e.getMessage()); + } + return map; + } + + public Optional getPerpatualVid(String uin) throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper>> vidResp = retrieveVidsfromUin(uin, ResidentConstants.UTC_TIMEZONE_OFFSET, null); + List> vids = vidResp.getResponse(); + if(vids != null && !vids.isEmpty()) { + return vids.stream() + .filter(map -> map.containsKey(VID_TYPE) && + perpatualVidType.equalsIgnoreCase(String.valueOf(map.get(VID_TYPE)))) + .map(map -> String.valueOf( map.get(VID))) + .findAny(); + } + return Optional.empty(); + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/VerificationServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/VerificationServiceImpl.java new file mode 100644 index 00000000000..814a16378f2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/VerificationServiceImpl.java @@ -0,0 +1,83 @@ +package io.mosip.resident.service.impl; + +import java.security.NoSuchAlgorithmException; +import java.util.List; + +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.VerificationResponseDTO; +import io.mosip.resident.dto.VerificationStatusDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.util.Utility; +import static io.mosip.resident.constant.MappingJsonConstants.EMAIL; +import static io.mosip.resident.constant.MappingJsonConstants.PHONE; + +@Component +public class VerificationServiceImpl implements VerificationService { + + @Autowired + private Utility utility; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Value("${resident.channel.verification.status.id}") + private String residentChannelVerificationStatusId; + + @Value("${resident.channel.verification.status.version}") + private String residentChannelVerificationStatusVersion; + + private static final Logger logger = LoggerConfiguration.logConfig(VerificationServiceImpl.class); + + @Override + public VerificationResponseDTO checkChannelVerificationStatus(String channel, String individualId) + throws ResidentServiceCheckedException, NoSuchAlgorithmException { + logger.debug("VerificationServiceImpl::checkChannelVerificationStatus::entry"); + VerificationResponseDTO verificationResponseDTO = new VerificationResponseDTO(); + boolean verificationStatus = false; + String maskedUserId = ""; + IdentityDTO identityDTO = identityServiceImpl.getIdentity(individualId); + String idaToken = identityServiceImpl.getIDAToken(identityDTO.getUIN()); + boolean entityExist = + residentTransactionRepository.existsByRefIdAndStatusCode + (utility.getIdForResidentTransaction(List.of(channel), identityDTO, idaToken), EventStatusSuccess.OTP_VERIFIED.toString()); + if (entityExist) { + verificationStatus = true; + String userId = ""; + if(channel.equalsIgnoreCase(EMAIL)) { + userId = identityDTO.getEmail(); + if(StringUtils.isNotBlank(userId)) { + maskedUserId = utility.maskEmail(userId); + } + } else if (channel.equalsIgnoreCase(PHONE)) { + userId = identityDTO.getPhone(); + if(StringUtils.isNotBlank(userId)) { + maskedUserId = utility.maskPhone(userId); + } + } + } + VerificationStatusDTO verificationStatusDTO = new VerificationStatusDTO(); + verificationStatusDTO.setVerificationStatus(verificationStatus); + verificationStatusDTO.setMaskedUserId(maskedUserId); + verificationResponseDTO.setResponse(verificationStatusDTO); + verificationResponseDTO.setId(residentChannelVerificationStatusId); + verificationResponseDTO.setVersion(residentChannelVerificationStatusVersion); + verificationResponseDTO.setResponseTime(DateTime.now().toString()); + logger.debug("VerificationServiceImpl::checkChannelVerificationStatus::exit"); + return verificationResponseDTO; + } +} + diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceImpl.java new file mode 100644 index 00000000000..40d8b2547b2 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceImpl.java @@ -0,0 +1,67 @@ +package io.mosip.resident.service.impl; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.CredentialStatusUpdateHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.WebSubCredentialStatusUpdateService; + +/** + * Service Implementation to update the resident transaction status from the credential status + * update in the websub event. + * + * @author Loganathan S + * + */ +@Service +public class WebSubCredentialStatusUpdateServiceImpl implements WebSubCredentialStatusUpdateService { + + private static final Logger logger = LoggerConfiguration.logConfig(WebSubCredentialStatusUpdateServiceImpl.class); + + @Autowired + private CredentialStatusUpdateHelper credentialStatusUpdateHelper; + + @Autowired + private ResidentTransactionRepository repo; + + @Override + public void updateCredentialStatus(Map eventModel) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug("Inside WebSubCredentialStatusUpdateServiceImpl.updateCredentialStatus"); + logger.debug("event: " + eventModel); + Map credentialTransactionDetails = Optional.ofNullable(eventModel.get(ResidentConstants.EVENT)) + .filter(obj -> obj instanceof Map) + .map(obj -> (Map) obj) + .map(map -> map.entrySet() + .stream() + .filter(entry -> entry.getValue() != null) + .collect(Collectors.toMap(Entry::getKey, entry -> String.valueOf(entry.getValue())))) + .orElseGet(() -> Map.of()); + Object requestIdObj = credentialTransactionDetails.get(ResidentConstants.REQUEST_ID); + if(requestIdObj instanceof String) { + String requestId = (String) requestIdObj; + logger.info(String.format("Updating the status of credential request ID: %s", requestId)); + Optional entityOpt = repo.findOneByCredentialRequestId(requestId); + if(entityOpt.isPresent()) { + credentialStatusUpdateHelper.updateStatus(entityOpt.get(), credentialTransactionDetails); + } else { + logger.debug(String.format("Could not find the resident transaction with credential request ID: %s ; ignoring..", + requestId)); + } + } + logger.debug("Exiting WebSubCredentialStatusUpdateServiceImpl.updateCredentialStatus"); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubRegprocWorkFlowServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubRegprocWorkFlowServiceImpl.java new file mode 100644 index 00000000000..c314dc4fed9 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubRegprocWorkFlowServiceImpl.java @@ -0,0 +1,67 @@ +package io.mosip.resident.service.impl; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.PacketStatus; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.WorkflowCompletedEventDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.WebSubRegprocWorkFlowService; +import io.mosip.resident.util.Utility; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * @author Kamesh Shekhar Prasad + */ + +@Component +public class WebSubRegprocWorkFlowServiceImpl implements WebSubRegprocWorkFlowService { + + private static final Logger logger = LoggerConfiguration.logConfig(WebSubRegprocWorkFlowServiceImpl.class); + + @Autowired + Environment environment; + + @Autowired + ResidentTransactionRepository residentTransactionRepository; + + @Autowired + Utility utility; + + @Override + public void updateResidentStatus(WorkflowCompletedEventDTO workflowCompletedEventDTO) throws ResidentServiceCheckedException { + logger.debug("WebSubRegprocWorkFlowServiceImpl:updateResidentStatus entry"); + ResidentTransactionEntity residentTransactionEntity = null; + String individualId = null; + if (workflowCompletedEventDTO.getResultCode() != null) { + if (workflowCompletedEventDTO.getInstanceId() != null) { + residentTransactionEntity = + residentTransactionRepository.findTopByAidOrderByCrDtimesDesc(workflowCompletedEventDTO.getInstanceId()); + } + if (residentTransactionEntity != null) { + individualId = residentTransactionEntity.getIndividualId(); + if (PacketStatus.getStatusCodeList(PacketStatus.FAILURE, environment).contains(workflowCompletedEventDTO.getResultCode())) { + utility.updateEntity(EventStatusFailure.FAILED.name(), RequestType.UPDATE_MY_UIN.name() + " - " + ResidentConstants.FAILED, + false, "Packet Failed in Regproc with status code-" + + workflowCompletedEventDTO.getResultCode(), residentTransactionEntity); + utility.sendNotification(residentTransactionEntity.getEventId(), individualId, TemplateType.REGPROC_FAILED); + } else if (PacketStatus.getStatusCodeList(PacketStatus.SUCCESS, environment).contains(workflowCompletedEventDTO.getResultCode())) { + utility.updateEntity(EventStatusInProgress.IDENTITY_UPDATED.name(), EventStatusInProgress.IDENTITY_UPDATED.name(), false, + "Packet processed in Regproc with status code-" + + workflowCompletedEventDTO.getResultCode(), residentTransactionEntity); + utility.sendNotification(residentTransactionEntity.getEventId(), individualId, TemplateType.REGPROC_SUCCESS); + } + } + } + logger.debug("WebSubRegprocWorkFlowServiceImpl:updateResidentStatus exit"); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceImpl.java b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceImpl.java new file mode 100644 index 00000000000..2ea159309ae --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceImpl.java @@ -0,0 +1,148 @@ +package io.mosip.resident.service.impl; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.WebSubUpdateAuthTypeService; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +@Component +public class WebSubUpdateAuthTypeServiceImpl implements WebSubUpdateAuthTypeService { + + private static final Logger logger = LoggerConfiguration.logConfig(WebSubUpdateAuthTypeServiceImpl.class); + + @Autowired + private NotificationService notificationService; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private Utility utility; + + @Value("${ida.online-verification-partner-id}") + private String onlineVerificationPartnerId; + + @Override + public void updateAuthTypeStatus(Map eventModel) + throws ResidentServiceCheckedException, ApisResourceAccessException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubUpdateAuthTypeServiceImpl::updateAuthTypeStatus()::entry"); + try { + Tuple2 tupleResponse = updateInResidentTransactionTable(eventModel, + EventStatusSuccess.COMPLETED.name()); + // only if the event belongs to the current online verification partner, the + // individualId will not be blank, and hence the notification will be sent + if (!StringUtils.isBlank(tupleResponse.getT1()) && !StringUtils.isBlank(tupleResponse.getT2())) { + sendNotificationV2(TemplateType.SUCCESS, tupleResponse.getT1(), tupleResponse.getT2()); + } + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubUpdateAuthTypeServiceImpl::updateAuthTypeStatus()::exception"); + Tuple2 tupleResponse = updateInResidentTransactionTable(eventModel, + EventStatusSuccess.COMPLETED.name()); + sendNotificationV2(TemplateType.FAILURE, tupleResponse.getT1(), tupleResponse.getT2()); + throw new ResidentServiceCheckedException( + ResidentErrorCode.RESIDENT_WEBSUB_UPDATE_AUTH_TYPE_FAILED.getErrorCode(), + ResidentErrorCode.RESIDENT_WEBSUB_UPDATE_AUTH_TYPE_FAILED.getErrorMessage(), e); + } + } + + private Tuple2 updateInResidentTransactionTable(Map eventModel, String status) { + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubUpdateAuthTypeServiceImpl::insertInResidentTransactionTable()::entry"); + String eventId = ""; + String individualId = ""; + List residentTransactionEntities = List.of(); + try { + Object eventObj = eventModel.get(ResidentConstants.EVENT); + if (eventObj instanceof Map) { + Map eventMap = (Map) eventObj; + Object dataObject = eventMap.get(ResidentConstants.DATA); + if (dataObject instanceof Map) { + Map dataMap = (Map) dataObject; + Object authStatusListObj = (List>) dataMap.get(ResidentConstants.AUTH_TYPES); + if (authStatusListObj instanceof List) { + List> authTypeStatusList = (List>) authStatusListObj; + residentTransactionEntities = authTypeStatusList.stream() + .map(authTypeStatus -> (String) authTypeStatus.get(ResidentConstants.REQUEST_ID)) + .filter(Objects::nonNull).distinct() + .flatMap(authTypeStatusStr -> residentTransactionRepository + .findByRequestTrnId(authTypeStatusStr).stream()) + .collect(Collectors.toList()); + // Get the values before saving, otherwise individual ID will be updated in + // encrypted format in the entity + if (residentTransactionEntities != null && !residentTransactionEntities.isEmpty()) { + eventId = residentTransactionEntities.stream() + .filter(entity -> entity.getOlvPartnerId().equals(onlineVerificationPartnerId)) + .map(entity -> entity.getEventId()).findAny() + .orElse(ResidentConstants.NOT_AVAILABLE); + + individualId = residentTransactionEntities.stream() + .filter(entity -> entity.getOlvPartnerId().equals(onlineVerificationPartnerId)) + .map(entity -> entity.getIndividualId()).findAny() + .orElse(ResidentConstants.NOT_AVAILABLE); + + // Update status + residentTransactionEntities.stream().forEach(residentTransactionEntity -> { + residentTransactionEntity.setStatusCode(status); + residentTransactionEntity.setReadStatus(false); + residentTransactionEntity.setUpdBy(utility.getSessionUserName()); + residentTransactionEntity.setUpdDtimes(DateUtils.getUTCCurrentDateTime()); + }); + residentTransactionRepository.saveAll(residentTransactionEntities); + } else { + logger.debug("No records found to update."); + } + } + } + } + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "WebSubUpdateAuthTypeServiceImpl::insertInResidentTransactionTable()::exception"); + } + return Tuples.of(eventId, individualId); + } + + private NotificationResponseDTO sendNotificationV2(TemplateType templateType, String eventId, String individualId) + throws ResidentServiceCheckedException { + + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId(individualId); + notificationRequestDtoV2.setRequestType(RequestType.AUTH_TYPE_LOCK_UNLOCK); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setEventId(eventId); + + return notificationService.sendNotification(notificationRequestDtoV2, null); + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AsyncUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/AsyncUtil.java new file mode 100644 index 00000000000..07a79cce3d8 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/AsyncUtil.java @@ -0,0 +1,21 @@ +package io.mosip.resident.util; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +/** + * Since @Async on the AuditUtil class is causing bean loading issue, this async + * util is created to delegate the Async bean creation to this class. + * + * @author Loganathan S + * + */ +@Component +public class AsyncUtil { + + @Async("AsyncExecutor") + public void asyncRun(Runnable runnable) { + runnable.run(); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEnum.java b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEnum.java new file mode 100644 index 00000000000..4ed7db1b134 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEnum.java @@ -0,0 +1,639 @@ +package io.mosip.resident.util; + +import static io.mosip.resident.constant.RegistrationConstants.FAILURE; +import static io.mosip.resident.constant.RegistrationConstants.INFO; +import static io.mosip.resident.constant.RegistrationConstants.RESIDENT_APPLICATION_ID; +import static io.mosip.resident.constant.RegistrationConstants.RESIDENT_APPLICATION_NAME; +import static io.mosip.resident.constant.RegistrationConstants.SUCCESS; + +public enum AuditEnum implements AuditEvent { + + VALIDATE_REQUEST("RES-SER-110", INFO, "Validating input request", "Validating input request of %s", "RS-VAL_REQ", + "Validate request", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + OBTAINED_RID("RES-SER-114", SUCCESS, "Request print UIN", + "Obtained RID for transaction id %s while requesting for printing UIN", "RS-RID", "RID section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + OBTAINED_RID_UIN_UPDATE("RES-SER-115", SUCCESS, "Request UIN Update", + "Obtained RID for transaction id %s while requesting for update UIN", "RS-RID", "RID section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VID_GENERATED("RES-SER-117", SUCCESS, "Request to generate VID", "VID generated for transaction id %s", + "RS-VID_GEN", "VID generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CREATE_PACKET("RES-SER-118", INFO, "Request to create packet", "Started packet creation", "RS-PACK", + "Packet creation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + PACKET_CREATED("RES-SER-119", SUCCESS, "Request to upload UIN packet", "Uploading UIN packet", "RS-PACK", + "Packet creation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + PACKET_SYNC("RES-SER-120", INFO, "Request to upload UIN packet", "Sync packet", "RS-PACK", "Packet creation", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + OTP_GEN_SUCCESS("RES-SER-122", SUCCESS, "generating otp: Success", "otp generation is success", "RS-OTP-GEN", + "Otp generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + OTP_GEN_EXCEPTION("RES-SER-123", FAILURE, "generating otp: Exception", "otp generation is failed", "RS-OTP-GEN", + "Otp generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CREDENTIAL_REQ_SUCCESS("RES-SER-125", SUCCESS, "Sharing credential to partner: Success", + "Sharing credential to partner is succeded", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_REQ_EXCEPTION("RES-SER-126", FAILURE, "Sharing credential to partner: Failed", + "Sharing credential to partner is failed", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_REQ_STATUS_SUCCESS("RES-SER-128", SUCCESS, "credential status: Success", + "credential req status is success", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_REQ_STATUS_EXCEPTION("RES-SER-129", FAILURE, "credential status: Exception", + "credential req status is failed", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_CANCEL_REQ_SUCCESS("RES-SER-131", SUCCESS, "credential cancel request: Success", + "credential cancel request success", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_CANCEL_REQ_EXCEPTION("RES-SER-132", FAILURE, "credential cancel request: Exception", + "credential cancel request failed", "RS-CRED_REQ", "Credential request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CREDENTIAL_TYPES_SUCCESS("RES-SER-134", SUCCESS, "credential types: Success", "fetch credential type success", + "RS-CRED_TYP", "Credential type", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CREDENTIAL_TYPES_EXCEPTION("RES-SER-135", FAILURE, "credential types: Exception", "fetch credential types failed", + "RS-CRED_TYP", "Credential type", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_CARD_SUCCESS("RES-SER-137", SUCCESS, "request for card: Success", "request for card is success", "RS-CARD", + "Request card", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_CARD_EXCEPTION("RES-SER-138", FAILURE, "request for card: Exception", "request for card is failed", "RS-CARD", + "Request card", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_POLICY_SUCCESS("RES-SER-140", SUCCESS, "request for policy: Success", "request for policy is success", "RS-POL", + "Request policy", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_POLICY_EXCEPTION("RES-SER-141", FAILURE, "request for policy: Exception", "request for policy is failed", + "RS-POL", "Request policy", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VALIDATION_FAILED_EXCEPTION("RES-SER-142", FAILURE, "Validation failed", "Validation failed : %s", "RS-VAL", + "Validation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_VALID_DOCUMENT_SUCCESS("RES-SER-143", SUCCESS, "get valid documents: Success", + "get valid documents by lang code is succeed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_VALID_DOCUMENT_EXCEPTION("RES-SER-144", FAILURE, "get valid documents: Exception", + "get valid documents by lang code is failed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_LOCATION_HIERARCHY_LEVEL_SUCCESS("RES-SER-145", SUCCESS, "get location hierarchy levels: Success", + "get location hierarchy level by lang code is succeed", "RS-LOC", "Location", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_LOCATION_HIERARCHY_LEVEL_EXCEPTION("RES-SER-146", FAILURE, "get location hierarchy levels: Failed", + "get location hierarchy level by lang code is failed", "RS-LOC", "Location", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_LOCATION_HIERARCHY_LEVEL_ALL_LANG_SUCCESS("RES-SER-147", SUCCESS, + "get location hierarchy levels for all language: Success", "get location hierarchy level is succeed", + "RS-LOC", "Location", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_LOCATION_HIERARCHY_LEVEL_ALL_LANG_EXCEPTION("RES-SER-148", FAILURE, + "get location hierarchy levels for all language: Failed", "get location hierarchy level is failed", + "RS-LOC", "Location", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_ALL_DYNAMIC_FIELD_VALUE_SUCCESS("RES-SER-149", SUCCESS, "get all dynamic field value: Success", + "get all dynamic field value is succeed", "RS-DYNAMIC", "Dynamic field", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_ALL_DYNAMIC_FIELD_VALUE_EXCEPTION("RES-SER-150", FAILURE, "get all dynamic field value: Failed", + "get all dynamic field value is failed", "RS-DYNAMIC", "Dynamic field", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_IMMEDIATE_CHILDREN_SUCCESS("RES-SER-151", SUCCESS, "get immediate children: Success", + "get immediate children by location code and lang code is succeed", "RS-CHILD", "Immediate children", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_IMMEDIATE_CHILDREN_EXCEPTION("RES-SER-152", FAILURE, "get immediate children: Exception", + "get immediate children by location code and lang code is failed", "RS-CHILD", "Immediate children", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_LOCATION_DETAILS_SUCCESS("RES-SER-153", SUCCESS, "get location details: Success", + "get location details by location code and lang code is succeed", "RS-LOC", "Location", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_LOCATION_DETAILS_EXCEPTION("RES-SER-154", FAILURE, "get location details: Exception", + "get location details by location code and lang code is failed", "RS-LOC", "Location", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_COORDINATE_SPECIFIC_REG_CENTERS_SUCCESS("RES-SER-155", SUCCESS, "get coordinate specific registration centers", + "get coordinate specific registration centers: Success", "RS-REG", "Registration center", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_COORDINATE_SPECIFIC_REG_CENTERS_EXCEPTION("RES-SER-156", FAILURE, + "get coordinate specific registration centers", "get coordinate specific registration centers: Failed", + "RS-REG", "Registration center", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_APPLICANT_VALID_DOCUMENT_SUCCESS("RES-SER-157", SUCCESS, "get applicant valid documents: Success", + "get applicant valid documents is succeed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_APPLICANT_VALID_DOCUMENT_EXCEPTION("RES-SER-158", FAILURE, "get applicant valid documents: Exception", + "get applicant valid documents is failed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_REG_CENTERS_FOR_LOCATION_CODE_SUCCESS("RES-SER-159", SUCCESS, + "get registration centers for location code: Success", + "get registration centers for location code: Success", "RS-REG_LOC", "Registration center location", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_REG_CENTERS_FOR_LOCATION_CODE_EXCEPTION("RES-SER-160", FAILURE, + "get registration centers for location code: Exception", + "get registration centers for location code: Failed", "RS-REG_LOC", "Registration center location", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_REG_CENTERS_PAGINATED_SUCCESS("RES-SER-161", SUCCESS, "get registration centers paginated: Success", + "get registration centers paginated is succeed", "RS-REG", "Registration center", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_REG_CENTERS_PAGINATED_EXCEPTION("RES-SER-162", FAILURE, "get registration centers paginated: Exception", + "get registration centers paginated: Failed", "RS-REG", "Registration center", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_REG_CENTER_WORKING_DAYS_SUCCESS("RES-SER-163", SUCCESS, "get registration center working days success", + "get registration center working days: Success", "RS-REG", "Registration center", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_REG_CENTER_WORKING_DAYS_EXCEPTION("RES-SER-164", FAILURE, "get registration center working days failure", + "get registration center working days: Failed", "RS-REG", "Registration center", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_LATEST_ID_SCHEMA_SUCCESS("RES-SER-165", SUCCESS, "get latest id schema: Success", + "get latest id schema is succeeded", "RS-ID_SCH", "ID schema", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_LATEST_ID_SCHEMA_EXCEPTION("RES-SER-166", FAILURE, "get latest id schema: Failed", + "get latest id schema is failed", "RS-ID_SCH", "ID schema", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_TEMPLATES_SUCCESS("RES-SER-167", SUCCESS, "get templates: Success", + "get templates by langCode and templateTypeCode is succeeded", "RS-TEMP", "Templates section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_TEMPLATES_EXCEPTION("RES-SER-168", FAILURE, "get templates: Failed", + "get templates by langCode and templateTypeCode is failed", "RS-TEMP", "Templates section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_CONFIGURATION_PROPERTIES_SUCCESS("RES-SER-169", SUCCESS, "get resident configuration properties success", + "get resident configuration properties: Success", "RS-CONF", "Config properties", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_CONFIGURATION_PROPERTIES_EXCEPTION("RES-SER-170", FAILURE, "get resident configuration properties failure", + "get resident configuration properties: Failed", "RS-CONF", "Config properties", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME_SUCCESS("RES-SER-171", SUCCESS, + "get dynamic field based on lang code and field name: Success", + "get dynamic field based on langCode and field name is succeeded", "RS-GEND", "Dynamic Field", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_DYNAMIC_FIELD_BASED_ON_LANG_CODE_AND_FIELD_NAME_EXCEPTION("RES-SER-172", FAILURE, + "get dynamic field based on lang code and field name: Failed", + "get dynamic field based on langCode and field name is failed", "RS-GEND", "Dynamic Field", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UPLOAD_DOCUMENT_SUCCESS("RES-SER-177", SUCCESS, "Document upload: Success", + "document upload success for transaction id %s", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + UPLOAD_DOCUMENT_FAILED("RES-SER-178", FAILURE, "Document upload: Failed", + "document upload failed for transaction id %s", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DOCUMENTS_METADATA_SUCCESS("RES-SER-180", SUCCESS, "Get documents: Success", + "get documents success for transaction id %s", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DOCUMENTS_METADATA_FAILED("RES-SER-181", FAILURE, "Get documents: Failed", + "Get documents failed for transaction id %s", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + REQ_AUTH_LOCK_STATUS_SUCCESS("RES-SER-183", SUCCESS, "Request auth lock status: Success", + "Requesting auth lock status api is success", "RS-AUTH_LOCK", "Auth lock", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + REQ_AUTH_LOCK_STATUS_FAILED("RES-SER-184", FAILURE, "Request auth lock status: Failed", + "Requesting auth lock status api is failed", "RS-AUTH_LOCK", "Auth lock", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_PARTNERS_BY_PARTNER_TYPE_SUCCESS("RES-SER-187", SUCCESS, "get partners by partner type: Success", + "get partners by partner type is succeeded", "RS-PARTN", "Partner section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_PARTNERS_BY_PARTNER_TYPE_EXCEPTION("RES-SER-188", FAILURE, "get partners by partner type: Failed", + "get partners by partner type is failed", "RS-PARTN", "Partner section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_VIDS_SUCCESS("RES-SER-192", SUCCESS, "get vids success", "get vids: Success", "RS-VID", "VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_VIDS_EXCEPTION("RES-SER-193", FAILURE, "get vids failure", "get vids: Failed", "RS-VID", "VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + OTP_INDIVIDUALID_GEN_SUCCESS("RES-SER-195", SUCCESS, "generating otp for Individual ID: Success", + "otp generation for Individual ID is success", "RS-OTP_GEN", "Otp generation", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + OTP_AID_GEN_EXCEPTION("RES-SER-196", FAILURE, "generating otp for aid: Failed", "otp generation for aid is failed", + "RS-OTP_GEN", "Otp generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_INPUT_ATTRIBUTES_SUCCESS("RES-SER-198", SUCCESS, "get identity attributes success", + "get identity attributes: Success", "RS-INP_ATTR", "Input attribute", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_INPUT_ATTRIBUTES_EXCEPTION("RES-SER-199", FAILURE, "get identity attributes failure", + "get identity attributes: Failed", "RS-INP_ATTR", "Input attribute", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + RID_STATUS_SUCCESS("RES-SER-200", SUCCESS, "RID status: Success", "Request for checking RID status is success", + "RS-RID", "RID Status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + + REQ_PRINTUIN_SUCCESS("RES-SER-201", SUCCESS, "Request print UIN: Success", + "Requesting print uin api for transaction id %s is success", "RS-UIN", "UIN", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + REQ_AUTH_LOCK_SUCCESS("RES-SER-202", SUCCESS, "Request auth lock: Success", + "Requesting auth lock api for transaction id %s is success", "RS-AUTH_LOCK_UNLOCK", "Auth lock/unlock", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_AUTH_UNLOCK_SUCCESS("RES-SER-203", SUCCESS, "Request auth unlock: Success", + "Requesting auth unlock api for transaction id %s is success", "RS-AUTH_LOCK_UNLOCK", "Auth lock/unlock", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_AUTH_HISTORY_SUCCESS("RES-SER-204", SUCCESS, "Request auth history: Success", + "Requesting auth history api for transaction id %s is success", "RS-AUTH_HIST", "Auth history", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UPDATE_UIN_SUCCESS("RES-SER-205", SUCCESS, "Request update uin: Success", + "Requesting update uin api for transaction id %s is success", "RS-UIN", "UIN", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GENERATE_VID_SUCCESS("RES-SER-206", SUCCESS, "Request for generating VID: Success", + "Request for generating VID for transaction id %s is success", "RS-GEN_REV_VID", "Generate/Revoke VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + + GENERATE_VID_SUCCESS_V1("RES-SER-206", SUCCESS, "Request for generating VID: Success", + "Request for generating VID is success", "RS-GEN_REV_VID", "Generate/Revoke VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REVOKE_VID_SUCCESS("RES-SER-207", SUCCESS, "Request for revoking VID: Success", + "Request for revoking VID for transaction id %s is success", "RS-GEN_REV_VID", "Generate/Revoke VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + + REVOKE_VID_SUCCESS_V1("RES-SER-207", SUCCESS, "Request for revoking VID: Success", + "Request for revoking VID is success", "RS-GEN_REV_VID", "Generate/Revoke VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + SEND_NOTIFICATION_SUCCESS("RES-SER-208", SUCCESS, "Send notification: Success", + "Sending notification for transaction id %s", "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + VALIDATE_OTP_SUCCESS("RES-SER-209", SUCCESS, "Validate otp: Success", + "Validating OTP for transaction id %s is success", "RS-OTP", "Otp section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + VALIDATE_OTP_FAILURE("RES-SER-210", FAILURE, "Validate otp: Failed", + "OTP vaildation for transaction id %s is failed", "RS-OTP", "Otp section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + AID_STATUS_SUCCESS("RES-SER-211", SUCCESS, "Checking AID status: Success", + "Request for checking AID status is success", "RS-AID", "AID status", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + AID_STATUS_FAILURE("RES-SER-212", FAILURE, "Checking AID status: Failed", "Request for checking AID status failed", + "RS-AID", "AID status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_AUTH_LOCK_UNLOCK_SUCCESS("RES-SER-213", SUCCESS, "Request auth lock unlock: Success", + "Requesting auth lock unlock api is success", "RS-AUTH_LOCK_UNLOCK", "Auth lock/unlock", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_SERVICE_REQUEST_UPDATE("RES-SER-215", SUCCESS, "Request service request update", + "Requesting service request update is success", "RS-SER_HIS", "Service history", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + REQ_SERVICE_REQUEST_UPDATE_SUCCESS("RES-SER-216", SUCCESS, "Request service request update: Success", + "Requesting service request update is success", "RS-SER_HIS", "Service history", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + IDA_TOKEN_NOT_FOUND("RES-SER-217", FAILURE, "IDA token not found", "IDA token not found", "RS-IDA_TOK", "IDA token", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_CUSTOM_CREDENTIAL("RES-SER-218", INFO, "Custom Credential Request", "Custom Credential Request", "RES-CUS_CRED", + "Custom credential", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_CUSTOM_CREDENTIAL_SUCCESS("RES-SER-219", SUCCESS, "Custom Credential Request: Success", + "Custom Credential Request is success", "RES-CUS_CRED", "Custom credential", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + REQ_CUSTOM_CREDENTIAL_FAILURE("RES-SER-220", FAILURE, "Custom Credential Request: Failed", + "Custom Credential Request has failed", "RES-CUS_CRED", "Custom credential", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CHANNEL_VERIFICATION_STATUS("RES-SER-221", INFO, "Check Channel Verification status Request", + "Check Channel Verification status Request", "RS-CHAN_VER", "Channel verification", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CHANNEL_VERIFICATION_STATUS_SUCCESS("RES-SER-222", SUCCESS, "Check Channel Verification status Request: Success", + "Check Channel Verification status Request is success", "RS-CHAN_VER", "Channel verification", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CHANNEL_VERIFICATION_STATUS_FAILURE("RES-SER-223", FAILURE, "Custom Credential Request: Failed", + "Custom Credential Request has failed", "RS-CHAN_VER", "Channel verification", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_VID_POLICY("RES-SER-224", INFO, "Get VID Policy Request", "Get VID Policy Request", "RS-VID", "VID", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_VID_POLICY_SUCCESS("RES-SER-225", SUCCESS, "Get VID Policy Request: Success", + "Get VID Policy Request is success", "RS-VID", "VID", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_VID_POLICY_FAILURE("RES-SER-226", FAILURE, "Get VID Policy Request: Failed", + "Get VID Policy Request has failed", "RS-VID", "VID", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_IDMAPPING("RES-SER-227", INFO, "get identity mapping json", "get identity mapping json", "RS-ID_MAP", + "ID mapping", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_IDMAPPING_SUCCESS("RES-SER-228", SUCCESS, "get identity mapping json success", + "get identity mapping json: Success", "RS-ID_MAP", "ID mapping", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_IDMAPPING_EXCEPTION("RES-SER-229", FAILURE, "get identity mapping json failure", + "get identity mapping json: Failed", "RS-ID_MAP", "ID mapping", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + RID_DIGITAL_CARD_REQ_SUCCESS("RES-SER-231", SUCCESS, "Download digital card request: Success", + "Download digital card request is succeeded", "RS-RID_CARD", "NO_ID_TYPE", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + RID_DIGITAL_CARD_REQ_FAILURE("RES-SER-232", FAILURE, "Download digital card request: Failed", + "Download digital card request is failed", "RS-RID_CARD", "RID digital card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CHECK_AID_STATUS_REQUEST_SUCCESS("RES-SER-233", SUCCESS, "Request AID status: Success", + "Requesting AID status for eventId %s is succeeded", "RS-AID", "AID status", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + CHECK_AID_STATUS_REQUEST_FAILED("RES-SER-234", FAILURE, "Request AID status: Failed", + "Requesting AID status for eventId %s is failed", "RS-AID", "AID status", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + SEND_PHYSICAL_CARD_SUCCESS("RES-SER-237", SUCCESS, "send a physical card: Success", + "send a physical card is succeeded", "RS-PHYS_CARD", "Physical card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + SEND_PHYSICAL_CARD_EXCEPTION("RES-SER-238", FAILURE, "send a physical card: Exception", + "send a physical card is failed", "RS-PHYS_CARD", "Physical card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DOCUMENT_BY_DOC_ID_SUCCESS("RES-SER-240", SUCCESS, "get document by doc id: Success", + "get document by doc id is succeeded", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DOCUMENT_BY_DOC_ID_FAILED("RES-SER-241", FAILURE, "get document by doc id: Failed", + "get document by doc id is failed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + DELETE_DOCUMENT_SUCCESS("RES-SER-243", SUCCESS, "delete document: Success", "delete document is succeeded", + "RS-DOC", "Document", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DELETE_DOCUMENT_FAILED("RES-SER-244", FAILURE, "delete document: Failed", "delete document is failed", "RS-DOC", + "Document", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_IDENTITY_UPDATE_COUNT_SUCCESS("RES-SER-249", SUCCESS, "get identity update count: Success", + "retrieve remaining update counts for each id attributes for a UIN/VID is succeeded", "RS-IDEN_COUN", + "Identity count", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_IDENTITY_UPDATE_COUNT_EXCEPTION("RES-SER-250", FAILURE, "get identity update count: Failed", + "retrieve remaining update counts for each id attributes for a UIN/VID is failed", "RS-IDEN_COUN", + "Identity count", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + PIN_STATUS_SUCCESS("RES-SER-251", SUCCESS, "pin status success", "pin status success based on event id: Success", + "RS-PIN", "Pin status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + PIN_STATUS_FAILURE("RES-SER-252", FAILURE, "pin status failure", "pin status failure based on event id: Failed", + "RS-PIN", "Pin status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UN_PIN_STATUS_SUCCESS("RES-SER-253", SUCCESS, "un pin status: Success", "un pin status success based on event id", + "RS-PIN", "Pin status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UN_PIN_STATUS_FAILURE("RES-SER-254", FAILURE, "un pin status: Failed", "un pin status failure based on event id", + "RS-PIN", "Pin statusE", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_ACKNOWLEDGEMENT_DOWNLOAD_URL_SUCCESS("RES-SER-255", SUCCESS, "get acknowledgement download url: Success", + "get acknowledgement download url is succeeded", "RS-ACK_DOWN", "Acknowledgement download", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_ACKNOWLEDGEMENT_DOWNLOAD_URL_FAILURE("RES-SER-256", FAILURE, "get acknowledgement download url: Failed", + "get acknowledgement download url failed", "RS-ACK_DOWN", "Acknowledgement download", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + SEND_OTP_SUCCESS("RES-SER-259", SUCCESS, "send otp: Success", "send otp is success for userId: %s", "RS-OTP", + "Otp section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + SEND_OTP_FAILURE("RES-SER-260", FAILURE, "send otp: Failed", "send otp is failed for userId: %s", "RS-OTP", + "Otp section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_SERVICE_HISTORY_SUCCESS("RES-SER-265", SUCCESS, "download service history: Success", + "download service history success based on language code", "RS-DOWN_SER", "Download service history", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_SERVICE_HISTORY_FAILURE("RES-SER-266", FAILURE, "download service history: Failed", + "download service history failed", "RS-DOWN_SER", "Download service history", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + INVALID_REQUEST_TYPE_CODE("RES-SER-267", FAILURE, "Invalid request type code", + "Invalid Request Type. Please input eventId only for VID_CARD_DOWNLOAD and UPDATE_MY_UIN", + "RS-VAL", "Validation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_REGISTRATION_CENTER_SUCCESS("RES-SER-269", SUCCESS, "download registration center: Success", + "download registration center success based on language code and hierarchy level", "RS-DOWN_CARD", + "Download card", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_REGISTRATION_CENTER_FAILURE("RES-SER-270", FAILURE, "Download registration center: Failed", + "Download registration center is failed", "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + DOWNLOAD_SUPPORTING_DOCS_SUCCESS("RES-SER-271", SUCCESS, "Download supporting docs: Success", + "Download supporting docs success based on language code", "RS-DOWN_CARD", "Download card", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_SUPPORTING_DOCS_FAILURE("RES-SER-272", FAILURE, "Download supporting docs: Failed", + "Download supporting docs failed", "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + DOWNLOAD_REGISTRATION_CENTER_NEAREST_SUCCESS("RES-SER-273", SUCCESS, + "Download nearest registration center: Success", + "Download nearest registration center success based on language code,longitude,latitude and distance", + "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_REGISTRATION_CENTER_NEAREST_FAILURE("RES-SER-274", FAILURE, "Download nearest registration center: Failed", + "Download nearest registration center failed", "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_DOCUMENT_TYPES_SUCCESS("RES-SER-275", SUCCESS, "get document types: Success", + "get document types by documentCode and langCode is succeeded", "RS-DOC", "Document", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_DOCUMENT_TYPES_EXCEPTION("RES-SER-276", FAILURE, "get document types: Failed", + "get document types by documentCode and langCode is failed", "RS-DOC", "Document", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_GENDER_CODE_SUCCESS("RES-SER-277", SUCCESS, "get gender code: Success", + "get gender code by genderName and langCode is succeeded", "RS-GEND", "Gender", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_GENDER_CODE_EXCEPTION("RES-SER-278", FAILURE, "get gender code: Failed", + "get gender code by genderName and langCode is failed", "RS-GEND", "Gender", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GRIEVANCE_TICKET_REQUEST_SUCCESS("RES-SER-279", SUCCESS, "Grievance ticket request: Success", + "Grievance ticket request success", "RS-GRIEV", "Grievance ticket", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GRIEVANCE_TICKET_REQUEST_FAILED("RES-SER-280", FAILURE, "Grievance ticket request: Failed", + "Grievance ticket request failed", "RS-GRIEV", "Grievance ticket", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + LOGIN_REQ("RES-SER-281", INFO, "Login Request", "Login Request", "RS-LOGN", "Login req", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + LOGIN_REQ_SUCCESS("RES-SER-282", SUCCESS, "Login Request: Success", "Login request is success", "RS-LOGN", + "Login req", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + LOGIN_REQ_FAILURE("RES-SER-283", FAILURE, "Login Request: Failed", "Login request is failed", "RS-LOGN", + "Login req", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + LOGOUT_REQ("RES-SER-284", INFO, "Logout Request", "Logout Request", "RS-LOGN", "Logout req", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + LOGOUT_REQ_SUCCESS("RES-SER-285", SUCCESS, "Logout Request: Success", "Logout request is success", "RS-LOGO", + "Logout req", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + LOGOUT_REQ_FAILURE("RES-SER-286", FAILURE, "Logout Request: Failed", "Logout request is failed", "RS-LOGO", + "Logout req", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VALIDATE_TOKEN_SUCCESS("RES-SER-287", SUCCESS, "Validate Token: Success", "Validate token is success", "RS-VAL", + "Validate token", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VALIDATE_TOKEN_FAILURE("RES-SER-288", FAILURE, "Validate Token: Failed", "Validate token is failed", "RS-VAL", + "Validate token", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DOWNLOAD_PERSONALIZED_CARD_FAILURE("RES-SER-291", FAILURE, "Download personalized card: Failed", + "Download card Html to pdf failed", "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + DOWNLOAD_PERSONALIZED_CARD_SUCCESS("RES-SER-292", SUCCESS, "Download personalized card: Success", + "Download card Html to pdf success", "RS-DOWN_CARD", "Download card", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + AID_STAGE_SUCCESS("RES-SER-293", SUCCESS, "Check AID stage status: Success", "Check AID stage status is success", + "RS-AID_STAGE", "AID stage", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + AID_STAGE_FAILURE("RES-SER-294", FAILURE, "Check AID stage status: Failed", "Check AID stage status is failed", + "RS-AID_STAGE", "AID stage", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CREDENTIAL_STATUS_UPDATE_CALL_BACK_SUCCESS("RES-SER-299", SUCCESS, "Credential status update call back: Success", + "credential status update call back success for transaction id %s", "RS-CRED_STAT_UPD", + "Credential status update", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + CREDENTIAL_STATUS_UPDATE_CALL_BACK_FAILURE("RES-SER-300", FAILURE, "Credential status update call back: Failed", + "credential status update call back failure for transaction id %s", "RS-CRED_STAT_UPD", + "Credential status update", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + + RID_STATUS_FAILURE("RES-SER-302", FAILURE, "RID status: Failed", "Request for checking RID status failed- %s", + "RS-RID", "RID Status", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_SERVICE_HISTORY_SUCCESS("RES-SER-303", SUCCESS, "get service history: Success", + "get service history is success", "RS-SERV_HIS", "Service history", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_SERVICE_HISTORY_FAILURE("RES-SER-304", FAILURE, "get service history: Failed", "get service history failed", + "RS-SERV_HIS", "Service history", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UPDATE_UIN_FAILURE("RES-SER-305", FAILURE, "Request update uin: Failed", "Requesting update uin failed", "RS-UIN", + "UIN", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UNREAD_NOTIF_COUNT_SUCCESS("RES-SER-306", SUCCESS, "Unread notification count: Success", + "Unread notification count is success", "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + UNREAD_NOTIF_COUNT_FAILURE("RES-SER-307", FAILURE, "Unread notification count: Failed", + "Unread notification count failed", "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_NOTIFICATION_SUCCESS("RES-SER-309", SUCCESS, "Get notification: Success", "Get notification is Success", + "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_NOTIFICATION_FAILURE("RES-SER-310", FAILURE, "Get notification: Failed", "Get notification failed", "RS-NOT", + "Notification section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_NOTIF_CLICK_SUCCESS("RES-SER-311", SUCCESS, "Get notification click: Success", + "Get notification click is Success", "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + GET_NOTIF_CLICK_FAILURE("RES-SER-312", FAILURE, "Get notification click: Failed", "Get notification click failed", + "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_PROFILE_SUCCESS("RES-SER-314", SUCCESS, "Get profile: Success", "Get profile is Success", "RS-PROF", + "Profile section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_PROFILE_FAILURE("RES-SER-315", FAILURE, "Get profile: Failed", "Get profile failed", "RS-PROF", + "Profile section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + TRANSLITERATION_FAILURE("RES-SER-316", FAILURE, "Transliteration: Failed", "Transliteration failed", "RS-TRAN", + "Transliteration section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VERIFICATION_STATUS_SUCCESS("RES-SER-317", SUCCESS, "Verification status: Success", + "Verification status is success", "RS-VER", "Verification section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + VERIFICATION_STATUS_FAILURE("RES-SER-318", FAILURE, "Verification status: Failed", "Verification status is failed", + "RS-VER", "Verification section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQ_EUIN_SUCCESS("RES-SER-319", SUCCESS, "Request EUIN: Success", + "Requesting euin for transaction id %s is success", "RS-UIN", "UIN", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + DEACTIVATED_VID("RES-SER-320", SUCCESS, "Request to revoke VID", + "Deactivated VID for transaction id %s while generating VID", "RS_VID_REV", "Revoke vid", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + AUTH_TYPE_CALL_BACK_SUCCESS("RES-SER-323", SUCCESS, "Auth type call back: Success", + "auth type call back success for transaction id %s", "RS-AUTH_TYP", "Auth type", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + AUTH_TYPE_CALL_BACK_FAILURE("RES-SER-324", FAILURE, "Auth type call back: Failed", + "auth type call back failure for transaction id %s", "RS-AUTH_TYP", "Auth type", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + + BASE_EXCEPTION("RES-SER-401", FAILURE, "Base Exception", "Base exception for transaction id %s", "RS-EXCE", + "Exception", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REQUEST_FAILED("RES-SER-402", FAILURE, "Request failed", "Request failed for transaction id %s", "RS-REQ", + "Request", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + SEND_NOTIFICATION_FAILURE("RES-SER-403", FAILURE, "Send notification: Failed", + "Failure notification sent for transaction id %s", "RS-NOT", "Notification section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VID_JSON_PARSING_EXCEPTION("RES-SER-404", FAILURE, "Json parsing exception", + "JSON parsing exception for transaction id %s while generating VID", "RS-VID", "VID section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VID_ALREADY_EXISTS("RES-SER-405", INFO, "VID already exists", "VID already exists for transaction id %s", + "RS-VID_GEN", "VID generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + VID_GENERATION_FAILURE("RES-SER-406", FAILURE, "Request to generate VID: Failed", + "VID generated failed for transaction id %s", "RS-VID_GEN", "VID generation", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + VID_REVOKE_EXCEPTION("RES-SER-407", FAILURE, "Request to revoke VID: Exception", + "Revoking VID failed for transaction id %s", "RS_VID_REV", "Revoke vid", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + RID_NOT_FOUND("RES-SER-408", FAILURE, "Checking RID status: Not found", + "RID not found while checking for RID status", "RS-RID", "RID section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + TOKEN_GENERATION_FAILED("RES-SER-409", FAILURE, "Generating token: Failed", "Token generation failed", "RS-TOK", + "Token generation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + INPUT_INVALID("RES-SER-410", FAILURE, "Invalid input", "Invalid input parameter %s", "RS-VAL", "Validation section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + API_NOT_AVAILABLE("RES-SER-411", FAILURE, "API not available", "API not available for transaction id %s", "RS-API", + "API section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + API_RESOURCE_UNACCESS("RES-SER-412", FAILURE, "API resource unaccess", + "Unable to access API resource for transaction id %s", "RS-API", "API section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + RID_INVALID("RES-SER-413", FAILURE, "Check RID: Invalid", "RID is invalid", "RS-RID", "RID section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + INPUT_DOESNT_EXISTS("RES-SER-414", FAILURE, "Validating request", "Request does not exists", "RS-VAL", + "Validation section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + TEMPLATE_EXCEPTION("RES-SER-415", FAILURE, "Get template", "Template Exception", "RS-TEMP", "Template section", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + TEMPLATE_SUBJECT_EXCEPTION("RES-SER-416", FAILURE, "Get template Subject", "Template subject exception", "RS-TEMP", + "Template section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + NOTIFICATION_FAILED("RES-SER-417", FAILURE, "Notification failed", "Notification failed for transaction id %s", + "RS-NOT", "Notification section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + BAD_REQUEST("RES-SER-418", FAILURE, "Bad request", "Bad request", "RS-REQ", "Bad request", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + INVALID_API_RESPONSE("RES-SER-419", FAILURE, "Checking RID status: Invalid API response", + "Invalid api response while checking RID status", "RS-API", "API section", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + IO_EXCEPTION("RES-SER-420", FAILURE, "IO Exception", "IO exception for transaction id %s", "RS-EXCE", "Exception", + RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + JSON_PARSING_EXCEPTION("RES-SER-421", FAILURE, "Request for UIN update: Exception", + "JSON parsing exception for transaction id %s", "RS-EXCE", "Exception", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + OTP_VALIDATION_FAILED("RES-SER-422", FAILURE, "OTP validation: Failed", "OTP validation failed for user Id: %s", + "RS-OTP", "Otp section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UNKNOWN_EXCEPTION("RES-SER-423", FAILURE, "Request to create packet: Exception", "Unknown exception occured", + "RS-EXCE", "Exception", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + PACKET_CREATED_EXCEPTION("RES-SER-424", FAILURE, "Request to create packet: Exception", + "Exception while creating packet", "RS-PACK", "Packet creation", RESIDENT_APPLICATION_ID, + RESIDENT_APPLICATION_NAME), + PACKET_CREATED_FAILURE("RES-SER-425", FAILURE, "Request to upload UIN packet: Failed", "Packet sync Failure", + "RS-PACK", "Packet creation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + UNSUPPORTED_INPUT("RES-SER-427", FAILURE, "Unsupported input", "Unsupported input parameter %s", "RS-VAL", + "Validation section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + INVALID_PAGE_INDEX_VALUE("RES-SER-446", FAILURE, "Invalid page index value", "Invalid page index value %s", + "RS-VAL", "Validation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + INVALID_PAGE_SIZE_VALUE("RES-SER-447", FAILURE, "Invalid page size value", "Invalid page size value %s", "RS-VAL", + "Validation", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + INVALID_LANGUAGE_CODE("RES-SER-500", FAILURE, "Invalid language code", "invalid lang code", "RS-VAL", + "Validation section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_PENDING_DRAFT_SUCCESS("RES-SER-501", FAILURE, "Get pending draft success", "Get pending draft success", "RS-VAL", + "Validation section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + GET_PENDING_DRAFT_FAILURE("RES-SER-502", FAILURE, "Get pending draft failure", "Get pending draft failure", "RS-VAL", + "Validation section", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DISCARD_DRAFT_SUCCESS("RES-SER-249", SUCCESS, "Discard Draft: Success", + "Draft discarded successfully", "RS-DRAFT", + "Discard draft", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + DISCARD_DRAFT_EXCEPTION("RES-SER-250", FAILURE, "Discard Draft: Failed", + "Draft discarded failed", "RS-DRAFT", + "Discard draft", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REG_PROC_WORK_FLOW_CALL_BACK_SUCCESS("RES-SER-503", SUCCESS, "Reg proc work flow callback: Success", + "Reg proc work flow callback is Success", "RS-CRED_STAT_UPD", + "Reg proc work flow", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME), + REG_PROC_WORK_FLOW_CALL_BACK_FAILURE("RES-SER-504", FAILURE, "Reg proc work flow callback: Failed", + "Reg proc work flow callback is Failed", "RS-CRED_STAT_UPD", + "Reg proc work flow callback", RESIDENT_APPLICATION_ID, RESIDENT_APPLICATION_NAME); + + private final String eventId; + + private final String type; + + private String name; + + private String description; + + private String moduleId; + + private String moduleName; + + private String applicationId; + + private String applicationName; + + private AuditEnum(String eventId, String type, String name, String description, String moduleId, String moduleName, + String applicationId, String applicationName) { + this.eventId = eventId; + this.type = type; + this.name = name; + this.description = description; + this.moduleId = moduleId; + this.moduleName = moduleName; + this.applicationId = applicationId; + this.applicationName = applicationName; + } + + @Override + public String getEventId() { + return eventId; + } + + @Override + public String getType() { + return type; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getModuleId() { + return moduleId; + } + + @Override + public String getModuleName() { + return moduleName; + } + + @Override + public String getApplicationId() { + return applicationId; + } + + @Override + public String getApplicationName() { + return applicationName; + } + + /* + * Replace %s value in description with second parameter passed + */ + public static AuditEvent getAuditEventWithValue(AuditEnum auditEnum, String s) { + AuditObject auditObject = auditEnum.createAuditObject(); + auditObject.setDescription(String.format(auditEnum.getDescription(), s)); + return auditObject; + } + + /* + * Replace %s value in description with second parameter passed and name + * property of enum with third parameter + */ + public static AuditEvent getAuditEventWithValue(AuditEnum auditEnum, String edescription, String ename) { + AuditObject auditObject = auditEnum.createAuditObject(); + auditObject.setDescription(String.format(auditEnum.getDescription(), edescription)); + auditObject.setName(String.format(auditEnum.getName(), ename)); + return auditObject; + } + + private AuditObject createAuditObject() { + return new AuditObject(eventId, type, name, description, moduleId, moduleName, applicationId, applicationName); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEvent.java b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEvent.java new file mode 100644 index 00000000000..9a6e4ed303c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditEvent.java @@ -0,0 +1,21 @@ +package io.mosip.resident.util; + +public interface AuditEvent { + + public String getEventId(); + + public String getType(); + + public String getName(); + + public String getDescription(); + + public String getModuleId(); + + public String getModuleName(); + + public String getApplicationId(); + + public String getApplicationName(); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditObject.java b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditObject.java new file mode 100644 index 00000000000..36b7094af0c --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditObject.java @@ -0,0 +1,26 @@ +package io.mosip.resident.util; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AuditObject implements AuditEvent { + + private final String eventId; + + private final String type; + + private String name; + + private String description; + + private String moduleId; + + private String moduleName; + + private String applicationId; + + private String applicationName; + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditUtil.java index 1306bf4a8c8..c1e1f8c8f06 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/AuditUtil.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/AuditUtil.java @@ -3,20 +3,18 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.security.NoSuchAlgorithmException; import java.util.List; import javax.annotation.PostConstruct; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.LoggerFileConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -27,9 +25,20 @@ import io.mosip.kernel.core.exception.ServiceError; import io.mosip.kernel.core.http.RequestWrapper; import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; import io.mosip.resident.dto.AuditRequestDTO; +import io.mosip.resident.dto.AuditResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.exception.ValidationException; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; @Component public class AuditUtil { @@ -45,8 +54,19 @@ public class AuditUtil { @Autowired private ObjectMapper objectMapper; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private Environment environment; + + @Autowired + private Utility utility; - + @Autowired + private AsyncUtil asyncUtil; + /** The Constant UNKNOWN_HOST. */ private static final String UNKNOWN_HOST = "Unknown Host"; @@ -54,9 +74,6 @@ public class AuditUtil { private String hostName = null; - @Autowired - private TokenGenerator tokenGenerator; - public String getServerIp() { try { return InetAddress.getLocalHost().getHostAddress(); @@ -78,30 +95,52 @@ public void getHostDetails() { hostIpAddress = getServerIp(); hostName = getServerName(); } - - public void setAuditRequestDto(EventEnum eventEnum) { - AuditRequestDTO auditRequestDto = new AuditRequestDTO(); - - auditRequestDto.setHostIp(hostIpAddress); - auditRequestDto.setHostName(hostName); - auditRequestDto.setApplicationId(eventEnum.getApplicationId()); - auditRequestDto.setApplicationName(eventEnum.getApplicationName()); - auditRequestDto.setSessionUserId(SecurityContextHolder.getContext().getAuthentication().getName()); - auditRequestDto.setSessionUserName(SecurityContextHolder.getContext().getAuthentication().getName()); - auditRequestDto.setCreatedBy(SecurityContextHolder.getContext().getAuthentication().getName()); - auditRequestDto.setActionTimeStamp(DateUtils.getUTCCurrentDateTime()); - auditRequestDto.setDescription(eventEnum.getDescription()); - auditRequestDto.setEventType(eventEnum.getType()); - auditRequestDto.setEventName(eventEnum.getName()); - auditRequestDto.setModuleId(eventEnum.getModuleId()); - auditRequestDto.setModuleName(eventEnum.getModuleName()); - auditRequestDto.setEventId(eventEnum.getEventId()); - auditRequestDto.setId(eventEnum.getId()); - auditRequestDto.setIdType(eventEnum.getIdType()); - callAuditManager(auditRequestDto); + + public void setAuditRequestDto(AuditEvent auditEvent) { + asyncUtil.asyncRun(() -> { + AuditRequestDTO auditRequestDto = new AuditRequestDTO(); + + auditRequestDto.setHostIp(hostIpAddress); + auditRequestDto.setHostName(hostName); + auditRequestDto.setApplicationId(auditEvent.getApplicationId()); + auditRequestDto.setApplicationName(auditEvent.getApplicationName()); + if(Utility.isSecureSession()) { + String name = null; + try { + name = identityService.getAvailableclaimValue( + this.environment.getProperty(ResidentConstants.NAME_FROM_PROFILE)); + } catch (ApisResourceAccessException e) { + throw new RuntimeException(e); + } + if (name == null || name.trim().isEmpty()) { + auditRequestDto.setSessionUserId("UnknownSessionId"); + auditRequestDto.setSessionUserName("UnknownSessionName"); + auditRequestDto.setCreatedBy("Unknown"); + } else { + auditRequestDto.setSessionUserId(name); + auditRequestDto.setSessionUserName(name); + auditRequestDto.setCreatedBy(name); + } + } else { + auditRequestDto.setSessionUserId("UnknownSessionId"); + auditRequestDto.setSessionUserName("UnknownSessionName"); + auditRequestDto.setCreatedBy("Unknown"); + } + auditRequestDto.setActionTimeStamp(DateUtils.getUTCCurrentDateTime()); + auditRequestDto.setDescription(auditEvent.getDescription()); + auditRequestDto.setEventType(auditEvent.getType()); + auditRequestDto.setEventName(auditEvent.getName()); + auditRequestDto.setModuleId(auditEvent.getModuleId()); + auditRequestDto.setModuleName(auditEvent.getModuleName()); + auditRequestDto.setEventId(auditEvent.getEventId()); + Tuple2 refIdHashAndType = getRefIdHashAndType(); + auditRequestDto.setId(refIdHashAndType.getT1()); + auditRequestDto.setIdType(refIdHashAndType.getT2()); + callAuditManager(auditRequestDto); + }); } - private void callAuditManager(AuditRequestDTO auditRequestDto) { + public void callAuditManager(AuditRequestDTO auditRequestDto) { RequestWrapper auditReuestWrapper = new RequestWrapper<>(); auditReuestWrapper.setRequest(auditRequestDto); @@ -142,5 +181,27 @@ private AuditResponseDto getAuditDetailsFromResponse(String responseBody) throws return auditResponseDto; } + + public Tuple2 getRefIdHashAndType() { + try { + if (Utility.isSecureSession()) { + String individualId = identityService.getResidentIndvidualIdFromSession(); + if (individualId != null && !individualId.isEmpty()) { + return getRefIdHashAndTypeFromIndividualId(individualId); + } + } + return Tuples.of(ResidentConstants.NO_ID, ResidentConstants.NO_ID_TYPE); + + } catch (ApisResourceAccessException | NoSuchAlgorithmException e) { + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage(), e); + } + } + + public Tuple2 getRefIdHashAndTypeFromIndividualId(String individualId) throws NoSuchAlgorithmException { + String refIdHash = utility.getRefIdHash(individualId); + String idType = identityService.getIndividualIdType(individualId).name(); + return Tuples.of(refIdHash, idType); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/EncryptorUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/EncryptorUtil.java index fc2f4742b0f..c4f456c8aba 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/EncryptorUtil.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/EncryptorUtil.java @@ -25,6 +25,7 @@ import io.mosip.resident.constant.ApiName; import io.mosip.resident.dto.CryptomanagerRequestDto; import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.exception.PacketEncryptionFailureException; /** * The Class EncryptorUtil. @@ -50,6 +51,9 @@ public class EncryptorUtil { @Autowired private ResidentServiceRestClient restClientService; + @Autowired + private Utilities utilities; + private static final String IO_EXCEPTION = "Exception while reading packet inputStream"; private static final String DATE_TIME_EXCEPTION = "Error while parsing packet timestamp"; public static final String APPLICATION_ID = "REGISTRATION"; @@ -63,7 +67,7 @@ public String encrypt(byte[] data, String refId) { cryptomanagerRequestDto.setApplicationId(APPLICATION_ID); cryptomanagerRequestDto.setData(packetString); cryptomanagerRequestDto.setReferenceId(refId); - SecureRandom sRandom = new SecureRandom(); + SecureRandom sRandom = utilities.getSecureRandom(); byte[] nonce = new byte[CryptomanagerConstant.GCM_NONCE_LENGTH]; byte[] aad = new byte[CryptomanagerConstant.GCM_AAD_LENGTH]; sRandom.nextBytes(nonce); @@ -80,15 +84,15 @@ public String encrypt(byte[] data, String refId) { ResponseWrapper responseDto = restClientService .postApi(env.getProperty(ApiName.ENCRYPTURL.name()), MediaType.APPLICATION_JSON, request, ResponseWrapper.class); - if (responseDto != null && !CollectionUtils.isEmpty(responseDto.getErrors())) { ServiceError error = (ServiceError) responseDto.getErrors().get(0); - throw new PacketDecryptionFailureException(error.getMessage()); + throw new PacketEncryptionFailureException(error.getMessage()); } - - DecryptResponseDto responseObject = mapper.readValue(mapper.writeValueAsString(responseDto.getResponse()), DecryptResponseDto.class); - return CryptoUtil.encodeToURLSafeBase64(mergeEncryptedData(CryptoUtil.decodeURLSafeBase64(responseObject.getData()), nonce, aad)); - + if(responseDto != null && responseDto.getResponse() != null) { + DecryptResponseDto responseObject = mapper.readValue(mapper.writeValueAsString(responseDto.getResponse()), DecryptResponseDto.class); + return CryptoUtil.encodeToURLSafeBase64(mergeEncryptedData(CryptoUtil.decodeURLSafeBase64(responseObject.getData()), nonce, aad)); + } + throw new PacketEncryptionFailureException("Packet encryption failed"); } catch (IOException e) { throw new PacketDecryptionFailureException(IO_EXCEPTION, e); } catch (DateTimeParseException e) { diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/EventEnum.java b/resident/resident-service/src/main/java/io/mosip/resident/util/EventEnum.java deleted file mode 100644 index f103b49b13d..00000000000 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/EventEnum.java +++ /dev/null @@ -1,257 +0,0 @@ -package io.mosip.resident.util; - - - -import io.mosip.resident.constant.RegistrationConstants; - -public enum EventEnum { - - RID_STATUS("RES-SER-101",RegistrationConstants.SYSTEM,"Checking RID status","Request for checking RID status","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - RID_STATUS_RESPONSE("RES-SER-111",RegistrationConstants.SYSTEM,"Checking RID status","RID status is %s","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - RID_STATUS_SUCCESS("RES-SER-200",RegistrationConstants.SYSTEM,"Checking RID status","Request for checking RID status is success","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_EUIN("RES-SER-102",RegistrationConstants.SYSTEM,"Request EUIN","Requesting euin for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_EUIN_SUCCESS("RES-SER-210",RegistrationConstants.SYSTEM,"Request EUIN","Requesting euin for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_PRINTUIN("RES-SER-103",RegistrationConstants.SYSTEM,"Request to print UIN","Requesting print uin for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_PRINTUIN_SUCCESS("RES-SER-201",RegistrationConstants.SYSTEM,"Request to print UIN","Requesting print uin api for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_LOCK("RES-SER-104",RegistrationConstants.SYSTEM,"Request auth lock","Requesting auth lock for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_LOCK_SUCCESS("RES-SER-202",RegistrationConstants.SYSTEM,"Request auth lock","Requesting auth lock api for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_UNLOCK("RES-SER-105",RegistrationConstants.SYSTEM,"Request auth unlock","Requesting auth unlock for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_UNLOCK_SUCCESS("RES-SER-203",RegistrationConstants.SYSTEM,"Request auth unlock","Requesting auth unlock api for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_HISTORY("RES-SER-106",RegistrationConstants.SYSTEM,"Request auth history","Requesting auth history for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQ_AUTH_HISTORY_SUCCESS("RES-SER-204",RegistrationConstants.SYSTEM,"Request auth history","Requesting auth history api for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - UPDATE_UIN("RES-SER-107",RegistrationConstants.SYSTEM,"Request update uin","Requesting update uin api for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - UPDATE_UIN_SUCCESS("RES-SER-205",RegistrationConstants.SYSTEM,"Request update uin","Requesting update uin api for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - GENERATE_VID("RES-SER-108",RegistrationConstants.SYSTEM,"Request for generating VID","Request for generating VID for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - GENERATE_VID_SUCCESS("RES-SER-206",RegistrationConstants.SYSTEM,"Request for generating VID","Request for generating VID for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REVOKE_VID("RES-SER-109",RegistrationConstants.SYSTEM,"Request for revoking VID","Request for revoking VID for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REVOKE_VID_SUCCESS("RES-SER-207",RegistrationConstants.SYSTEM,"Request for revoking VID","Request for revoking VID for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VALIDATE_REQUEST("RES-SER-110",RegistrationConstants.SYSTEM,"Validating input request","Validating input request of %s","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - SEND_NOTIFICATION_SUCCESS("RES-SER-208",RegistrationConstants.SYSTEM,"%s","Sending notification for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VALIDATE_OTP("RES-SER-113",RegistrationConstants.SYSTEM,"%s","Validate OTP for %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VALIDATE_OTP_SUCCESS("RES-SER-209",RegistrationConstants.SYSTEM,"%s","Validating OTP for transaction id %s is success","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - GETTING_RID_STATUS("RES-SER-116",RegistrationConstants.SYSTEM,"Checking RID status","Getting RID status based on individual id","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - SEND_NOTIFICATION_FAILURE("RES-SER-403",RegistrationConstants.SYSTEM,"%s","Failure notification sent for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - OBTAINED_RID("RES-SER-114",RegistrationConstants.SYSTEM,"Request print UIN","Obtained RID for transaction id %s while requesting for printing UIN","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - OBTAINED_RID_UIN_UPDATE("RES-SER-115",RegistrationConstants.SYSTEM,"Request UIN Update","Obtained RID for transaction id %s while requesting for update UIN","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VID_GENERATED("RES-SER-117",RegistrationConstants.SYSTEM,"Request to generate VID","VID generated for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VID_ALREADY_EXISTS("RES-SER-405",RegistrationConstants.SYSTEM,"Request to generate VID","VID already exists for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VID_GENERATION_FAILURE("RES-SER-406",RegistrationConstants.SYSTEM,"Request to generate VID","VID generated failed for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VID_JSON_PARSING_EXCEPTION("RES-SER-404",RegistrationConstants.SYSTEM,"%s","JSON parsing exception for transaction id %s while generating VID","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - DEACTIVATED_VID("RES-SER-210",RegistrationConstants.SYSTEM,"Request to revoke VID","Deactivated VID for transaction id %s while generating VID","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - VID_REVOKE_EXCEPTION("RES-SER-407",RegistrationConstants.SYSTEM,"Request to revoke VID","Revoking VID failed for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - - RID_NOT_FOUND("RES-SER-408",RegistrationConstants.SYSTEM,"Checking RID status","RID not found while checking for RID status","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - TOKEN_GENERATION_FAILED("RES-SER-409",RegistrationConstants.SYSTEM,"Generating token","Token generation failed","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - INPUT_INVALID("RES-SER-410",RegistrationConstants.SYSTEM,"%s","Invalid input parameter %s","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - API_NOT_AVAILABLE("RES-SER-411",RegistrationConstants.SYSTEM,"%s","API not available for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - API_RESOURCE_UNACCESS("RES-SER-412",RegistrationConstants.SYSTEM,"%s","Unable to access API resource for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - RID_INVALID("RES-SER-413",RegistrationConstants.SYSTEM,"Check RID","RID is invalid","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - INPUT_DOESNT_EXISTS("RES-SER-414",RegistrationConstants.SYSTEM,"Validating request","Request does not exists","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - TEMPLATE_EXCEPTION("RES-SER-415",RegistrationConstants.SYSTEM,"Get template","Template Exception","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - TEMPLATE_SUBJECT_EXCEPTION("RES-SER-416",RegistrationConstants.SYSTEM,"Get template","Template subject exception","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - NOTIFICATION_FAILED("RES-SER-417",RegistrationConstants.SYSTEM,"%s","Notification failed for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - BAD_REQUEST("RES-SER-418",RegistrationConstants.SYSTEM,"%s","Bad request","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - INVALID_API_RESPONSE("RES-SER-419",RegistrationConstants.SYSTEM,"Checking RID status","Invalid api response while checking RID status","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - IO_EXCEPTION("RES-SER-420",RegistrationConstants.SYSTEM,"%s","IO exception for transaction id %s","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - JSON_PARSING_EXCEPTION("RES-SER-421",RegistrationConstants.SYSTEM,"Request for UIN update","JSON parsing exception for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - OTP_VALIDATION_FAILED("RES-SER-422",RegistrationConstants.SYSTEM,"%s","OTP validation failed for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - BASE_EXCEPTION("RES-SER-401",RegistrationConstants.SYSTEM,"%s","Base exception for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - REQUEST_FAILED("RES-SER-402",RegistrationConstants.SYSTEM,"%s","Request failed for transaction id %s","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - CREATE_PACKET("RES-SER-118",RegistrationConstants.SYSTEM,"Request to create packet","Started packet creation","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - UNKNOWN_EXCEPTION("RES-SER-423",RegistrationConstants.SYSTEM,"Request to create packet","Unknown exception occured","RES-SER","Residence service","%s","Transaction id",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - PACKET_CREATED("RES-SER-119",RegistrationConstants.SYSTEM,"Request to upload UIN packet","Uploading UIN packet","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - PACKET_CREATED_FAILURE("RES-SER-425",RegistrationConstants.SYSTEM,"Request to upload UIN packet","Packet sync failure","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - PACKET_CREATED_EXCEPTION("RES-SER-424",RegistrationConstants.SYSTEM,"Request to create packet","Exception while creating packet","RES-SER","Residence service","NO_ID","NO_ID_TYPE",RegistrationConstants.APPLICATIONID,RegistrationConstants.APPLICATIONNAME), - PACKET_SYNC("RES-SER-120", RegistrationConstants.SYSTEM, "Request to upload UIN packet", "Sync packet", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - OTP_GEN("RES-SER-121", RegistrationConstants.SYSTEM, "generating otp", "Request for generating otp", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - OTP_GEN_SUCCESS("RES-SER-122", RegistrationConstants.SYSTEM, "generating otp", "otp generation is success", - "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - OTP_GEN_EXCEPTION("RES-SER-123", RegistrationConstants.SYSTEM, "generating otp", "otp generation is failed", - "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ("RES-SER-124", RegistrationConstants.SYSTEM, "credential request", "credential request", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ_SUCCESS("RES-SER-125", RegistrationConstants.SYSTEM, "credential request", - "credential request success", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ_EXCEPTION("RES-SER-126", RegistrationConstants.SYSTEM, "credential request", - "credential request failed", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ_STATUS("RES-SER-127", RegistrationConstants.SYSTEM, "credential status", - "request for credential status", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ_STATUS_SUCCESS("RES-SER-128", RegistrationConstants.SYSTEM, "credential status", - "credential req status is success", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_REQ_STATUS_EXCEPTION("RES-SER-129", RegistrationConstants.SYSTEM, "credential status", - "credential req status is failed", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_CANCEL_REQ("RES-SER-130", RegistrationConstants.SYSTEM, "credential cancel request", - "credential cancel request", - "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_CANCEL_REQ_SUCCESS("RES-SER-131", RegistrationConstants.SYSTEM, "credential cancel request", - "credential cancel request success", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_CANCEL_REQ_EXCEPTION("RES-SER-132", RegistrationConstants.SYSTEM, "credential cancel request", - "credential cancel request failed", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_TYPES("RES-SER-133", RegistrationConstants.SYSTEM, "credential types", "credential types", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_TYPES_SUCCESS("RES-SER-134", RegistrationConstants.SYSTEM, "credential types", - "fetch credential type success", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - CREDENTIAL_TYPES_EXCEPTION("RES-SER-135", RegistrationConstants.SYSTEM, "credential request", - "fetch credential types failed", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - REQ_CARD("RES-SER-136", RegistrationConstants.SYSTEM, "request for card", "request for card", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - REQ_CARD_SUCCESS("RES-SER-137", RegistrationConstants.SYSTEM, "request for card", "request for card is success", - "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - REQ_CARD_EXCEPTION("RES-SER-138", RegistrationConstants.SYSTEM, "request for card", "request for card is failed", - "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - REQ_POLICY("RES-SER-139", RegistrationConstants.SYSTEM, "request for policy", "request for policy", "RES-SER", - "Residence service", "NO_ID", "NO_ID_TYPE", RegistrationConstants.APPLICATIONID, - RegistrationConstants.APPLICATIONNAME), - REQ_POLICY_SUCCESS("RES-SER-140", RegistrationConstants.SYSTEM, "request for policy", - "request for policy is success", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME), - REQ_POLICY_EXCEPTION("RES-SER-141", RegistrationConstants.SYSTEM, "request for policy", - "request for policy is failed", "RES-SER", "Residence service", "NO_ID", "NO_ID_TYPE", - RegistrationConstants.APPLICATIONID, RegistrationConstants.APPLICATIONNAME); - - private final String eventId; - - private final String type; - - private String name; - - private String description; - - private String moduleId; - - private String moduleName; - - private String id; - - private String idType; - - private String applicationId; - - private String applicationName; - - private EventEnum(String eventId, String type, String name, String description,String moduleId,String moduleName,String id,String idType,String applicationId,String applicationName) { - this.eventId = eventId; - this.type = type; - this.name = name; - this.description = description; - this.moduleId=moduleId; - this.moduleName=moduleName; - this.id=id; - this.idType=idType; - this.applicationId=applicationId; - this.applicationName=applicationName; - - } - - public String getEventId() { - return eventId; - } - - public String getType() { - return type; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public String getModuleId() { - return moduleId; - } - - public String getModuleName() { - return moduleName; - } - - public String getId() { - return id; - } - - public String getIdType() { - return idType; - } - - public void setDescription(String des) - { - this.description=des; - } - - public String getApplicationId() { - return applicationId; - } - - public void setId(String id) { - this.id=id; - } - - public void setName(String name) { - this.name=name; - } - - public String getApplicationName() { - return applicationName; - } - - /* - * Replace %s value in description and id with second parameter passed - */ - - public static EventEnum getEventEnumWithValue(EventEnum e,String s) - { - e.setDescription(String.format(e.getDescription(),s)); - if(e.getId().equalsIgnoreCase("%s")) - e.setId(s); - return e; - } - - /* - * Replace %s value in description and id with second parameter passed - * and name property of enum with third parameter - */ - public static EventEnum getEventEnumWithValue(EventEnum e,String edescription,String ename) - { - e.setDescription(String.format(e.getDescription(),edescription)); - if(e.getId().equalsIgnoreCase("%s")) - e.setId(edescription); - e.setName(String.format(e.getName(),ename)); - return e; - } - - /* - * Replace second parameter with %s in name property and in description property - */ - - public static EventEnum getEventEnumWithDynamicName(EventEnum e,String s) - { - e.setName(Character.toUpperCase(s.charAt(0))+s.substring(1)); - e.setDescription(String.format(e.getDescription(),s)); - return e; - } - -} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/IdSchemaUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/IdSchemaUtil.java index f85ca7a7f2c..ced5ed15791 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/IdSchemaUtil.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/IdSchemaUtil.java @@ -1,7 +1,11 @@ package io.mosip.resident.util; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.exception.ApisResourceAccessException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.assertj.core.util.Lists; import org.json.JSONArray; import org.json.JSONException; @@ -10,105 +14,106 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.exception.ApisResourceAccessException; @Component public class IdSchemaUtil { - private static Map categorySubpacketMapping = new HashMap<>(); - private Map idschema = null; - public static final String RESPONSE = "response"; - public static final String PROPERTIES = "properties"; - public static final String IDENTITY = "identity"; - public static final String SCHEMA_CATEGORY = "fieldCategory"; - public static final String SCHEMA_ID = "id"; - public static final String SCHEMA_TYPE = "type"; - public static final String SCHEMA_REF = "$ref"; - public static final String IDSCHEMA_URL = "IDSCHEMA"; - public static final String SCHEMA_JSON = "schemaJson"; - public static final String SCHEMA_VERSION_QUERY_PARAM = "schemaVersion"; - - static { - categorySubpacketMapping.put("pvt", "id"); - categorySubpacketMapping.put("kyc", "id"); - categorySubpacketMapping.put("none", "id,evidence,optional"); - categorySubpacketMapping.put("evidence", "evidence"); - categorySubpacketMapping.put("optional", "optional"); - } - - @Autowired - private Environment env; - - @Autowired - ResidentServiceRestClient residentServiceRestClient; - - public List getDefaultFields(Double schemaVersion) throws JSONException, ApisResourceAccessException, IOException { - List fieldList = new ArrayList<>(); - List> fieldMapList = loadDefaultFields(schemaVersion); - fieldMapList.stream().forEach(f -> fieldList.add(f.get(SCHEMA_ID))); - return fieldList; - } - - public List> loadDefaultFields(Double schemaVersion) throws JSONException, ApisResourceAccessException, IOException { - Map>> packetBasedMap = new HashMap>>(); - - String schemaJson = getIdSchema(schemaVersion); - - JSONObject schema = new JSONObject(schemaJson); - schema = schema.getJSONObject(PROPERTIES); - schema = schema.getJSONObject(IDENTITY); - schema = schema.getJSONObject(PROPERTIES); - - JSONArray fieldNames = schema.names(); - for(int i=0;i>()); - } - - Map attributes = new HashMap<>(); - attributes.put(SCHEMA_ID, fieldName); - attributes.put(SCHEMA_TYPE, fieldDetail.has(SCHEMA_REF) ? - fieldDetail.getString(SCHEMA_REF) : fieldDetail.getString(SCHEMA_TYPE)); - packetBasedMap.get(packetName).add(attributes); - } - } - return packetBasedMap.get("id"); - } - - public String getIdSchema(Double version) throws ApisResourceAccessException, JSONException, IOException { - if (idschema != null && !idschema.isEmpty() && idschema.get(version) != null) - return idschema.get(version); - - String response = (String) residentServiceRestClient.getApi(ApiName.MIDSCHEMAURL, null, - Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(version), String.class); - - if (response == null) - throw new ApisResourceAccessException("Could not fetch idschema with version : " + version); - - JSONObject jsonObject = new JSONObject(response); - JSONObject respObj = (JSONObject) jsonObject.get(RESPONSE); - String responseString = respObj != null ? (String) respObj.get(SCHEMA_JSON) : null; - - if (responseString != null) { - if (idschema == null) { - idschema = new HashMap<>(); - idschema.put(version, responseString); - } else - idschema.put(version, responseString); - } - - return idschema.get(version); - } + private static Map categorySubpacketMapping = new HashMap<>(); + private Map idschema = null; + public static final String RESPONSE = "response"; + public static final String PROPERTIES = "properties"; + public static final String IDENTITY = "identity"; + public static final String SCHEMA_CATEGORY = "fieldCategory"; + public static final String SCHEMA_ID = "id"; + public static final String SCHEMA_TYPE = "type"; + public static final String SCHEMA_REF = "$ref"; + public static final String IDSCHEMA_URL = "IDSCHEMA"; + public static final String SCHEMA_JSON = "schemaJson"; + public static final String SCHEMA_VERSION_QUERY_PARAM = "schemaVersion"; + + static { + categorySubpacketMapping.put("pvt", "id"); + categorySubpacketMapping.put("kyc", "id"); + categorySubpacketMapping.put("none", "id,evidence,optional"); + categorySubpacketMapping.put("evidence", "evidence"); + categorySubpacketMapping.put("optional", "optional"); + } + + @Autowired + private Environment env; + + @Autowired + ResidentServiceRestClient residentServiceRestClient; + + public List getDefaultFields(Double schemaVersion) + throws JSONException, ApisResourceAccessException, IOException { + List fieldList = new ArrayList<>(); + List> fieldMapList = loadDefaultFields(schemaVersion); + fieldMapList.stream().forEach(f -> fieldList.add(f.get(SCHEMA_ID))); + return fieldList; + } + + public List> loadDefaultFields(Double schemaVersion) + throws JSONException, ApisResourceAccessException, IOException { + Map>> packetBasedMap = new HashMap>>(); + + String schemaJson = getIdSchema(schemaVersion); + + JSONObject schema = new JSONObject(schemaJson); + schema = schema.getJSONObject(PROPERTIES); + schema = schema.getJSONObject(IDENTITY); + schema = schema.getJSONObject(PROPERTIES); + + JSONArray fieldNames = schema.names(); + for (int i = 0; i < fieldNames.length(); i++) { + String fieldName = fieldNames.getString(i); + JSONObject fieldDetail = schema.getJSONObject(fieldName); + String fieldCategory = fieldDetail.has(SCHEMA_CATEGORY) ? fieldDetail.getString(SCHEMA_CATEGORY) : "none"; + String packets = categorySubpacketMapping.get(fieldCategory.toLowerCase()); + + String[] packetNames = packets.split(","); + for (String packetName : packetNames) { + if (!packetBasedMap.containsKey(packetName)) { + packetBasedMap.put(packetName, new ArrayList>()); + } + + Map attributes = new HashMap<>(); + attributes.put(SCHEMA_ID, fieldName); + attributes.put(SCHEMA_TYPE, fieldDetail.has(SCHEMA_REF) ? fieldDetail.getString(SCHEMA_REF) + : fieldDetail.getString(SCHEMA_TYPE)); + packetBasedMap.get(packetName).add(attributes); + } + } + return packetBasedMap.get("id"); + } + + public String getIdSchema(Double version) throws ApisResourceAccessException, JSONException, IOException { + if (idschema != null && !idschema.isEmpty() && idschema.get(version) != null) + return idschema.get(version); + + String response = (String) residentServiceRestClient.getApi(ApiName.MIDSCHEMAURL, (List) null, + Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(version), String.class); + + if (response == null) + throw new ApisResourceAccessException("Could not fetch idschema with version : " + version); + + JSONObject jsonObject = new JSONObject(response); + JSONObject respObj = (JSONObject) jsonObject.get(RESPONSE); + String responseString = respObj != null ? (String) respObj.get(SCHEMA_JSON) : null; + + if (responseString != null) { + if (idschema == null) { + idschema = new HashMap<>(); + idschema.put(version, responseString); + } else + idschema.put(version, responseString); + } + + if(idschema==null || idschema.isEmpty()){ + return null; + } + return idschema.get(version); + } } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/JsonUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/JsonUtil.java index 378e132fa4d..997b44e775b 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/JsonUtil.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/JsonUtil.java @@ -9,18 +9,19 @@ import java.util.ArrayList; import java.util.LinkedHashMap; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.afterburner.AfterburnerModule; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.mosip.resident.dto.JsonValue; @@ -95,7 +96,7 @@ public static JSONArray getJSONArray(JSONObject jsonObject, Object key) { /** * Gets the JSON value. * - * @param the generic type + * @param the generic type * @param jsonObject the json object * @param key the key * @return the JSON value @@ -122,7 +123,7 @@ public static JSONObject getJSONObjectFromArray(JSONArray jsonObject, int key) { /** * Object mapper read value. This method maps the jsonString to particular type * - * @param the generic type + * @param the generic type * @param jsonString the json string * @param clazz the clazz * @return the t @@ -158,7 +159,7 @@ public static JsonValue[] getJsonValues(JSONObject demographicIdentity, Object i /** * Map json node to java object. * - * @param the generic type + * @param the generic type * @param genericType the generic type * @param demographicJsonNode the demographic json node * @return the t[] @@ -209,6 +210,10 @@ public static String writeValueAsString(Object obj) throws IOException { return objectMapper.writeValueAsString(obj); } + public static T convertValue(Object fromValue, Class toValueType) { + return objectMapper.convertValue(fromValue, toValueType); + } + public static Object inputStreamtoJavaObject(InputStream stream, Class clazz) throws UnsupportedEncodingException { JsonParser jsonParser = new JsonParser(); @@ -225,18 +230,18 @@ public static Object inputStreamtoJavaObject(InputStream stream, Class clazz) * Object mapper read value. This method maps the jsonString to particular type * * @param - * the generic type + * the generic type * @param jsonString - * the json string + * the json string * @param clazz - * the clazz + * the clazz * @return the t * @throws JsonParseException - * the json parse exception + * the json parse exception * @throws JsonMappingException - * the json mapping exception + * the json mapping exception * @throws IOException - * Signals that an I/O exception has occurred. + * Signals that an I/O exception has occurred. */ @SuppressWarnings("unchecked") public static T objectMapperReadValue(String jsonString, Class clazz) throws IOException { @@ -247,4 +252,12 @@ public static String objectMapperObjectToJson(Object obj) throws IOException { return objectMapper.writeValueAsString(obj); } + public static T readValue(String request, TypeReference typeReference) throws IOException { + return (T) objectMapper.readValue(request, typeReference); + } + + public static T convertValue(Object request, TypeReference typeReference) { + return (T) objectMapper.convertValue(request, typeReference); + } + } diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/ObjectWithMetadata.java b/resident/resident-service/src/main/java/io/mosip/resident/util/ObjectWithMetadata.java new file mode 100644 index 00000000000..b74859e43de --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/ObjectWithMetadata.java @@ -0,0 +1,14 @@ +package io.mosip.resident.util; + +import java.util.Map; + +/** + * @author Ritik Jain + */ +public interface ObjectWithMetadata { + + public Map getMetadata(); + + public void setMetadata(Map metadata); + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/PacketWriterService.java b/resident/resident-service/src/main/java/io/mosip/resident/util/PacketWriterService.java index 5f1f271bb5b..38b82c8d7b0 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/PacketWriterService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/PacketWriterService.java @@ -1,4 +1,4 @@ -/* +package io.mosip.resident.util;/* package io.mosip.resident.util; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/ResidentServiceRestClient.java b/resident/resident-service/src/main/java/io/mosip/resident/util/ResidentServiceRestClient.java index 55bc00b1aed..3dfc3abf6d6 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/ResidentServiceRestClient.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/ResidentServiceRestClient.java @@ -1,302 +1,399 @@ -package io.mosip.resident.util; - -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.exception.ApisResourceAccessException; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.core.env.Environment; -import org.springframework.http.*; -import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; - -import java.net.URI; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * The Class RestApiClient. - * - * @author Monobikash Das - */ -@Component -public class ResidentServiceRestClient { - - /** The logger. */ - private final Logger logger = LoggerConfiguration.logConfig(ResidentServiceRestClient.class); - - /** The builder. */ - @Autowired - RestTemplateBuilder builder; - - @Autowired - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Autowired - Environment environment; - - /** - * Gets the api. - * - * @param - * the generic type - * @param responseType - * the response type - * @return the api - * @throws Exception - */ - public T getApi(URI uri, Class responseType) throws ApisResourceAccessException { - try { - return (T) residentRestTemplate.exchange(uri, HttpMethod.GET, setRequestHeader(null, null), responseType) - .getBody(); - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); - } - - } - - public Object getApi(ApiName apiName, List pathsegments, String queryParamName, String queryParamValue, - Class responseType) throws ApisResourceAccessException { - - Object obj = null; - String apiHostIpPort = environment.getProperty(apiName.name()); - UriComponentsBuilder builder = null; - UriComponents uriComponents = null; - if (apiHostIpPort != null) { - builder = UriComponentsBuilder.fromUriString(apiHostIpPort); - if (!((pathsegments == null) || (pathsegments.isEmpty()))) { - for (String segment : pathsegments) { - if (!((segment == null) || (("").equals(segment)))) { - builder.pathSegment(segment); - } - } - } - - if (StringUtils.isNotEmpty(queryParamName)) { - - String[] queryParamNameArr = queryParamName.split(","); - String[] queryParamValueArr = queryParamValue.split(","); - for (int i = 0; i < queryParamNameArr.length; i++) { - builder.queryParam(queryParamNameArr[i], queryParamValueArr[i]); - } - - } - try { - - uriComponents = builder.build(false).encode(); - obj = getApi(uriComponents.toUri(), responseType); - - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Exception occured while accessing ", e); - - } - } - - return obj; - } - - - public Object getApi(ApiName apiName, List pathsegments, List queryParamName, List queryParamValue, - Class responseType) throws ApisResourceAccessException { - - Object obj = null; - String apiHostIpPort = environment.getProperty(apiName.name()); - UriComponentsBuilder builder = null; - UriComponents uriComponents = null; - if (apiHostIpPort != null) { - builder = UriComponentsBuilder.fromUriString(apiHostIpPort); - if (!((pathsegments == null) || (pathsegments.isEmpty()))) { - for (String segment : pathsegments) { - if (!((segment == null) || (("").equals(segment)))) { - builder.pathSegment(segment); - } - } - } - - if (!((queryParamName == null) || (("").equals(queryParamName)))) { - - for (int i = 0; i < queryParamName.size(); i++) { - builder.queryParam(queryParamName.get(i), queryParamValue.get(i)); - } - - } - try { - - uriComponents = builder.build(false).encode(); - obj = getApi(uriComponents.toUri(), responseType); - - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - throw new ApisResourceAccessException("Exception occurred while accessing ", e); - - } - } - - return obj; - } - - @SuppressWarnings({ "unchecked", "null" }) - public T getApi(ApiName apiName, Map pathsegments, Class responseType) - throws Exception { - - String apiHostIpPort = environment.getProperty(apiName.name()); - Object obj = null; - UriComponentsBuilder builder = null; - if (apiHostIpPort != null) { - - builder = UriComponentsBuilder.fromUriString(apiHostIpPort); - - URI urlWithPath = builder.build(pathsegments); - try { - obj = getApi(urlWithPath, responseType); - - } catch (Exception e) { - throw new Exception(e); - } - - } - return (T) obj; - } - - @SuppressWarnings("unchecked") - public T postApi(String uri, MediaType mediaType, Object requestType, Class responseClass) - throws ApisResourceAccessException { - try { - logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), uri); - T response = (T) residentRestTemplate.postForObject(uri, setRequestHeader(requestType, mediaType), - responseClass); - return response; - - } catch (Exception e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - - throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); - } - } - - /** - * Patch api. - * - * @param - * the generic type - * @param uri - * the uri - * @param requestType - * the request type - * @param responseClass - * the response class - * @return the t - */ - @SuppressWarnings("unchecked") - public T patchApi(String uri, MediaType mediaType, Object requestType, Class responseClass) - throws ApisResourceAccessException { - - T result = null; - try { - logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), uri); - result = (T) residentRestTemplate.patchForObject(uri, setRequestHeader(requestType, mediaType), - responseClass); - - } catch (Exception e) { - - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - - throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); - } - return result; - } - - public T patchApi(String uri, Object requestType, Class responseClass) throws Exception { - return patchApi(uri, null, requestType, responseClass); - } - - /** - * Put api. - * - * @param - * the generic type - * @param uri - * the uri - * @param requestType - * the request type - * @param responseClass - * the response class - * @param mediaType - * @return the t - * @throws Exception - * the exception - */ - @SuppressWarnings("unchecked") - public T putApi(String uri, Object requestType, Class responseClass, MediaType mediaType) - throws ApisResourceAccessException { - - T result = null; - ResponseEntity response = null; - try { - logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), uri); - - response = (ResponseEntity) residentRestTemplate.exchange(uri, HttpMethod.PUT, - setRequestHeader(requestType.toString(), mediaType), responseClass); - result = response.getBody(); - } catch (Exception e) { - - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); - - throw new ApisResourceAccessException("Exception occured while accessing " + uri, e); - } - return result; - } - - /** - * this method sets token to header of the request - * - * @param requestType - * @param mediaType - * @return HttpEntity - */ - @SuppressWarnings("unchecked") - private HttpEntity setRequestHeader(Object requestType, MediaType mediaType) { - MultiValueMap headers = new LinkedMultiValueMap(); - headers.add("Authorization", "futureProof"); - if (mediaType != null) { - headers.add("Content-Type", mediaType.toString()); - } - if (requestType != null) { - try { - HttpEntity httpEntity = (HttpEntity) requestType; - HttpHeaders httpHeader = httpEntity.getHeaders(); - for (String key : httpHeader.keySet()) { - if (!(headers.containsKey("Content-Type") && Objects.equals(key, "Content-Type"))) - headers.add(key, httpHeader.get(key).get(0)); - } - return new HttpEntity<>(httpEntity.getBody(), headers); - } catch (ClassCastException e) { - return new HttpEntity<>(requestType, headers); - } - } else - return new HttpEntity<>(headers); - } - -} +package io.mosip.resident.util; + +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import io.mosip.idrepository.core.dto.IdResponseDTO; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.exception.ApisResourceAccessException; + +/** + * The Class RestApiClient. + * + * @author Monobikash Das + */ +public class ResidentServiceRestClient { + + /** The logger. */ + private final Logger logger = LoggerConfiguration.logConfig(ResidentServiceRestClient.class); + + /** The builder. */ + @Autowired + RestTemplateBuilder builder; + + private RestTemplate residentRestTemplate; + + @Autowired + Environment environment; + + public ResidentServiceRestClient() { + this(new RestTemplate()); + } + + + public ResidentServiceRestClient(RestTemplate residentRestTemplate) { + this.residentRestTemplate = residentRestTemplate; + } + + public T getApi(String uriStr, Class responseType) throws ApisResourceAccessException { + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriStr); + UriComponents uriComponent = builder.build(false).encode(); + URI uri = uriComponent.toUri(); + return getApi(uri, responseType); + } + + /** + * Gets the api. + * + * @param the generic type + * @param responseType the response type + * @return the api + * @throws Exception + */ + public T getApi(URI uri, Class responseType) throws ApisResourceAccessException { + return getApi(uri, responseType, null); + } + + /** + * Gets the api. + * + * @param the generic type + * @param responseType the response type + * @return the api + * @throws Exception + */ + public T getApi(URI uri, Class responseType, MultiValueMap headerMap) throws ApisResourceAccessException { + try { + return (T) residentRestTemplate.exchange(uri, HttpMethod.GET, headerMap == null ? setRequestHeader(null, null) : new HttpEntity(headerMap), responseType) + .getBody(); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); + } + + } + + public Object getApi(ApiName apiName, List pathsegments, String queryParamName, String queryParamValue, + Class responseType) throws ApisResourceAccessException { + + Object obj = null; + String apiHostIpPort = environment.getProperty(apiName.name()); + UriComponentsBuilder builder = null; + UriComponents uriComponents = null; + if (apiHostIpPort != null) { + builder = UriComponentsBuilder.fromUriString(apiHostIpPort); + if (!((pathsegments == null) || (pathsegments.isEmpty()))) { + for (String segment : pathsegments) { + if (!((segment == null) || (("").equals(segment)))) { + builder.pathSegment(segment); + } + } + } + + if (StringUtils.isNotEmpty(queryParamName)) { + + String[] queryParamNameArr = queryParamName.split(","); + String[] queryParamValueArr = queryParamValue.split(","); + for (int i = 0; i < queryParamNameArr.length; i++) { + builder.queryParam(queryParamNameArr[i], queryParamValueArr[i]); + } + + } + try { + + uriComponents = builder.build(false).encode(); + obj = getApi(uriComponents.toUri(), responseType); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Exception occured while accessing ", e); + + } + } + + return obj; + } + + public Object getApi(ApiName apiName, List pathsegments, List queryParamName, + List queryParamValue, Class responseType) throws ApisResourceAccessException { + + Object obj = null; + String apiHostIpPort = environment.getProperty(apiName.name()); + UriComponentsBuilder builder = null; + UriComponents uriComponents = null; + if (apiHostIpPort != null) { + builder = UriComponentsBuilder.fromUriString(apiHostIpPort); + if (!((pathsegments == null) || (pathsegments.isEmpty()))) { + for (String segment : pathsegments) { + if (!((segment == null) || (("").equals(segment)))) { + builder.pathSegment(segment); + } + } + } + + if (!((queryParamName == null) || (queryParamName.isEmpty()))) { + + for (int i = 0; i < queryParamName.size(); i++) { + builder.queryParam(queryParamName.get(i), queryParamValue.get(i)); + } + + } + try { + + uriComponents = builder.build(false).encode(); + obj = getApi(uriComponents.toUri(), responseType); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Exception occurred while accessing ", e); + + } + } + + return obj; + } + + public T getApi(ApiName apiName, Map pathsegments, Class responseType) + throws ApisResourceAccessException { + return getApi(apiName, pathsegments, null, null, responseType); + } + + @SuppressWarnings({ "unchecked", "null" }) + public T getApi(ApiName apiName, Map pathsegments, List queryParamName, + List queryParamValue, Class responseType) throws ApisResourceAccessException { + + String apiHostIpPort = environment.getProperty(apiName.name()); + Object obj = null; + UriComponentsBuilder builder = null; + if (apiHostIpPort != null) { + + builder = UriComponentsBuilder.fromUriString(apiHostIpPort); + if (!((queryParamName == null) || (queryParamName.isEmpty()))){ + + for (int i = 0; i < queryParamName.size(); i++) { + builder.queryParam(queryParamName.get(i), queryParamValue.get(i)); + } + + } + URI urlWithPath = builder.build(pathsegments); + try { + obj = getApi(urlWithPath, responseType); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Exception occurred while accessing ", e); + } + + } + return (T) obj; + } + + @SuppressWarnings("unchecked") + public T postApi(String uri, MediaType mediaType, Object requestType, Class responseClass) + throws ApisResourceAccessException { + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), uri); + T response = (T) residentRestTemplate.postForObject(uri, setRequestHeader(requestType, mediaType), + responseClass); + return response; + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + + throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); + } + } + + /** + * Patch api. + * + * @param the generic type + * @param uri the uri + * @param requestType the request type + * @param responseClass the response class + * @return the t + */ + @SuppressWarnings("unchecked") + public T patchApi(String uri, MediaType mediaType, Object requestType, Class responseClass) + throws ApisResourceAccessException { + T result = null; + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), uri); + + result = (T) residentRestTemplate.patchForObject(uri, setRequestHeader(requestType, mediaType), + responseClass); + + } catch (Exception e) { + + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + + throw new ApisResourceAccessException("Exception occurred while accessing " + uri, e); + } + return result; + } + + public T patchApi(String uri, Object requestType, Class responseClass) throws Exception { + return patchApi(uri, null, requestType, responseClass); + } + + /** + * Put api. + * + * @param the generic type + * @param uri the uri + * @param requestType the request type + * @param responseClass the response class + * @param mediaType + * @return the t + * @throws Exception the exception + */ + @SuppressWarnings("unchecked") + public T putApi(String uri, Object requestType, Class responseClass, MediaType mediaType) + throws ApisResourceAccessException { + T result = null; + ResponseEntity response = null; + try { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), uri); + + response = (ResponseEntity) residentRestTemplate.exchange(uri, HttpMethod.PUT, + setRequestHeader(requestType.toString(), mediaType), responseClass); + result = response.getBody(); + } catch (Exception e) { + + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + + throw new ApisResourceAccessException("Exception occured while accessing " + uri, e); + } + return result; + } + + /** + * this method sets token to header of the request + * + * @param requestType + * @param mediaType + * @return HttpEntity + */ + @SuppressWarnings("unchecked") + private HttpEntity setRequestHeader(Object requestType, MediaType mediaType) { + MultiValueMap headers = new LinkedMultiValueMap(); + headers.add("Authorization", "futureProof"); + if (mediaType != null) { + headers.add("Content-Type", mediaType.toString()); + } + if (requestType != null) { + try { + HttpEntity httpEntity = (HttpEntity) requestType; + HttpHeaders httpHeader = httpEntity.getHeaders(); + for (String key : httpHeader.keySet()) { + if (!(headers.containsKey("Content-Type") && Objects.equals(key, "Content-Type"))){ + List headerKeys = httpHeader.get(key); + if(headerKeys != null && !headerKeys.isEmpty()){ + headers.add(key,headerKeys.get(0)); + } + } + } + return new HttpEntity<>(httpEntity.getBody(), headers); + } catch (ClassCastException e) { + return new HttpEntity<>(requestType, headers); + } + } else + return new HttpEntity<>(headers); + } + + public Object deleteApi(ApiName apiName, List pathsegments, String queryParamName, String queryParamValue, + Class responseType) throws ApisResourceAccessException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", + "ResidentServiceRestClient::deleteApi()::entry"); + Object obj = null; + String apiHostIpPort = environment.getProperty(apiName.name()); + + UriComponentsBuilder builder = null; + UriComponents uriComponents = null; + if (apiHostIpPort != null) { + + builder = UriComponentsBuilder.fromUriString(apiHostIpPort); + if (!((pathsegments == null) || (pathsegments.isEmpty()))) { + for (String segment : pathsegments) { + if (!((segment == null) || (("").equals(segment)))) { + builder.pathSegment(segment); + } + } + + } + + if (!((queryParamName == null) || (("").equals(queryParamName)))) { + + String[] queryParamNameArr = queryParamName.split(","); + String[] queryParamValueArr = queryParamValue.split(","); + for (int i = 0; i < queryParamNameArr.length; i++) { + builder.queryParam(queryParamNameArr[i], queryParamValueArr[i]); + } + + } + + try { + + uriComponents = builder.build(false).encode(); + logger.debug(uriComponents.toUri().toString(), "URI", "", ""); + obj = deleteApi(uriComponents.toUri(), responseType); + + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + e.getMessage() + ExceptionUtils.getStackTrace(e)); + assert uriComponents != null; + throw new ApisResourceAccessException("Exception occured while accessing " + uriComponents.toUri().toString(), e); + + } + } + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", + "ResidentServiceRestClient::deleteApi::exit"); + return obj; + } + + public T deleteApi(URI uri, Class responseType) throws Exception { + T result = null; + + try { + result = (T) residentRestTemplate.exchange(uri, HttpMethod.DELETE, setRequestHeader(null, null), responseType) + .getBody(); + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), e.getMessage() + ExceptionUtils.getStackTrace(e)); + throw e; + } + return result; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/ServerUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/ServerUtil.java index 074dc5a9470..0122614449c 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/ServerUtil.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/ServerUtil.java @@ -1,11 +1,11 @@ package io.mosip.resident.util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.net.InetAddress; import java.net.UnknownHostException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This class provides Server IP and Name. * diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/TemplateUtil.java b/resident/resident-service/src/main/java/io/mosip/resident/util/TemplateUtil.java new file mode 100644 index 00000000000..6fb150de926 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/TemplateUtil.java @@ -0,0 +1,685 @@ +package io.mosip.resident.util; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.constant.UISchemaTypes; +import io.mosip.resident.dto.NotificationTemplateVariableDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +/** + * The Class TemplateUtil. + * + * @author Kamesh Shekhar Prasad + */ + +@Component +public class TemplateUtil { + + private static final String RESIDENT = "Resident"; + private static final String LOGO_URL = "logoUrl"; + private static final String UNKNOWN = "UNKNOWN"; + private static final String RESIDENT_AUTH_TYPE_CODE_TEMPLATE_PROPERTY = "resident.auth-type-code.%s.code"; + private static final String RESIDENT_ID_AUTH_REQUEST_TYPE_DESCR = "resident.id-auth.request-type.%s.%s.descr"; + private static final String RESIDENT_EVENT_TYPE_TEMPLATE_PROPERTY = "resident.event.type.%s.template.property"; + private static final String RESIDENT_SERVICE_TYPE_TEMPLATE_PROPERTY = "resident.service-type.%s.template.property"; + private static final String RESIDENT_TEMPLATE_EVENT_STATUS = "resident.event.status.%s.template.property"; + private static final String RESIDENT_TEMPLATE_PROPERTY_ATTRIBUTE_LIST = "resident.%s.template.property.attribute.list"; + + @Autowired + private IdentityServiceImpl identityServiceImpl; + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Autowired + private Utility utility; + + @Autowired + private ResidentServiceImpl residentService; + + @Autowired + Environment env; + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + @Autowired + private ResidentConfigService residentConfigService; + + @Value("${resident.template.date.pattern}") + private String templateDatePattern; + + @Value("${resident.template.time.pattern}") + private String templateTimePattern; + + private static final Logger logger = LoggerConfiguration.logConfig(TemplateUtil.class); + + /** + * Gets the ack template variables for authentication request. + * + * @param residentTransactionEntity + * @param requestType + * @param languageCode + * @param timeZoneOffset + * @param locale + * @return the ack template variables for authentication request + */ + + public Map getCommonTemplateVariables(ResidentTransactionEntity residentTransactionEntity, RequestType requestType, String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = new HashMap<>(); + templateVariables.put(TemplateVariablesConstants.EVENT_ID, residentTransactionEntity.getEventId()); + Tuple2 statusCodes = residentService.getEventStatusCode(residentTransactionEntity.getStatusCode(), languageCode); + Optional serviceType = ServiceType.getServiceTypeFromRequestType(requestType); + String eventTypeBasedOnLangcode = getEventTypeBasedOnLangcode(requestType, languageCode); + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, eventTypeBasedOnLangcode); + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE_ENUM, requestType.name()); + templateVariables.put(TemplateVariablesConstants.EVENT_STATUS, statusCodes.getT2()); + templateVariables.put(TemplateVariablesConstants.EVENT_STATUS_ENUM, statusCodes.getT1()); + if (serviceType.isPresent()) { + if (!serviceType.get().equals(ServiceType.ALL.name())) { + templateVariables.put(TemplateVariablesConstants.SUMMARY, + getSummaryFromResidentTransactionEntityLangCode(residentTransactionEntity, languageCode, + statusCodes.getT1(), requestType)); + } + } else { + templateVariables.put(TemplateVariablesConstants.SUMMARY, eventTypeBasedOnLangcode); + } + templateVariables.put(TemplateVariablesConstants.TIMESTAMP, + utility.formatWithOffsetForUI(timeZoneOffset, locale, residentTransactionEntity.getCrDtimes())); + templateVariables.put(TemplateVariablesConstants.TRACK_SERVICE_REQUEST_LINK, + utility.createTrackServiceRequestLink(residentTransactionEntity.getEventId())); + templateVariables.put(TemplateVariablesConstants.PDF_HEADER_LOGO, utility.getPDFHeaderLogo()); + templateVariables.put(TemplateVariablesConstants.AUTHENTICATION_MODE, + getAuthTypeCodeTemplateData(residentTransactionEntity.getAuthTypeCode(), null, languageCode)); + try { + templateVariables.put(TemplateVariablesConstants.INDIVIDUAL_ID, getIndividualIdType()); + } catch (ApisResourceAccessException e) { + logger.error(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), e); + templateVariables.put(TemplateVariablesConstants.INDIVIDUAL_ID, ""); + } + return templateVariables; + } + + public String getEventTypeBasedOnLangcode(RequestType requestType, String languageCode) { + String templateCodeProperty = String.format(RESIDENT_EVENT_TYPE_TEMPLATE_PROPERTY, requestType.name()); + String templateTypeCode = getTemplateTypeCode(templateCodeProperty); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", requestType.name())); + templateTypeCode = getTemplateTypeCode(ResidentConstants.RESIDENT_UNKNOWN_TEMPLATE_PROPERTY); + } + return getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + } + + public String getServiceTypeBasedOnLangcode(ServiceType serviceType, String languageCode) { + String templateCodeProperty = String.format(RESIDENT_SERVICE_TYPE_TEMPLATE_PROPERTY, serviceType.name()); + String templateTypeCode = getTemplateTypeCode(templateCodeProperty); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", serviceType.name())); + templateTypeCode = getTemplateTypeCode(ResidentConstants.RESIDENT_UNKNOWN_TEMPLATE_PROPERTY); + } + return getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + } + + public String getEventStatusBasedOnLangcode(EventStatus eventStatus, String languageCode) { + String templateCodeProperty = String.format(RESIDENT_TEMPLATE_EVENT_STATUS, eventStatus.name()); + String templateTypeCode = getTemplateTypeCode(templateCodeProperty); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", eventStatus.name())); + templateTypeCode = getTemplateTypeCode(ResidentConstants.RESIDENT_UNKNOWN_TEMPLATE_PROPERTY); + } + return getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + } + + /** + * This method accepts a string having comma-separated attributes with camel + * case convention and splits it by a comma. Then it takes each attribute value + * from the template in logged-in language and appends it to a string with + * comma-separated value. + * + * @param attributesFromDB attribute values having comma separated attributes. + * @param languageCode logged in language code. + * @return attribute value stored in the template. + */ + @SuppressWarnings("unchecked") + private String getAttributesDisplayText(String attributesFromDB, String languageCode, RequestType requestType) { + List attributeListTemplateValue = new ArrayList<>(); + if (attributesFromDB != null && !attributesFromDB.isEmpty()) { + Optional schemaType = UISchemaTypes.getUISchemaTypeFromRequestTypeCode(requestType); + if (schemaType.isPresent()) { +// Cacheable UI Schema data + Map> uiSchemaDataMap = residentConfigService + .getUISchemaCacheableData(schemaType.get()).get(languageCode); + List attributeListFromDB = List.of(attributesFromDB.split(ResidentConstants.SEMI_COLON)); + attributeListTemplateValue = attributeListFromDB.stream().map(attribute -> { + String[] attrArray = attribute.trim().split(ResidentConstants.COLON); + String attr = attrArray[0]; + if (uiSchemaDataMap.containsKey(attr)) { + Map attributeDataFromUISchema = (Map) uiSchemaDataMap.get(attr); + attr = (String) attributeDataFromUISchema.get(ResidentConstants.LABEL); + if (attrArray.length > 1) { + String formatAttr = attrArray[1]; + Map formatDataMapFromUISchema = (Map) attributeDataFromUISchema + .get(ResidentConstants.FORMAT_OPTION); + List formatAttrList = List + .of(formatAttr.split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)).stream() + .map(String::trim).map(format -> formatDataMapFromUISchema.get(format)) + .collect(Collectors.toList()); + if (!formatAttrList.contains(null)) { + return String.format("%s%s%s%s", attr, ResidentConstants.OPEN_PARENTHESIS, + formatAttrList.stream().collect( + Collectors.joining(ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER)), + ResidentConstants.CLOSE_PARENTHESIS); + } + } + } + return attr; + }).collect(Collectors.toList()); + } else { + attributeListTemplateValue = List.of(attributesFromDB.split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)).stream() + .map(attribute -> getAttributeBasedOnLangcode(attribute.trim(), languageCode)) + .collect(Collectors.toList()); + } + } + if (attributeListTemplateValue.isEmpty()) { + return ""; + } else { + return attributeListTemplateValue.stream() + .collect(Collectors.joining(ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER)); + } + } + + public String getTemplateValueFromTemplateTypeCodeAndLangCode(String languageCode, String templateTypeCode) { + return proxyMasterdataService + .getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + } + + public String getDescriptionTemplateVariablesForAuthenticationRequest( + ResidentTransactionEntity residentTransactionEntity, String fileText, String languageCode) { + String statusCode = residentService.getEventStatusCode(residentTransactionEntity.getStatusCode(), languageCode) + .getT1(); + return getAuthTypeCodeTemplateData(residentTransactionEntity.getAuthTypeCode(), statusCode, languageCode); + } + + private String getAuthTypeCodeTemplateData(String authTypeCodeFromDB, String statusCode, String languageCode) { + List authTypeCodeTemplateValues = new ArrayList<>(); + if (authTypeCodeFromDB != null && !authTypeCodeFromDB.isEmpty()) { + authTypeCodeTemplateValues = List.of(authTypeCodeFromDB.split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)).stream() + .map(authTypeCode -> { + String templateTypeCode; + if(statusCode == null) { + templateTypeCode = getAuthTypeCodeTemplateTypeCode(authTypeCode.trim()); + } else { + templateTypeCode = getIDAuthRequestTypeDescriptionTemplateTypeCode(authTypeCode.trim(), statusCode); + } + return getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + }) + .collect(Collectors.toList()); + } + + if (authTypeCodeTemplateValues.isEmpty()) { + return ""; + } else { + return authTypeCodeTemplateValues.stream() + .collect(Collectors.joining(ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER)); + } + } + + public String getDescriptionTemplateVariablesForShareCredentialWithPartner(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForDownloadPersonalizedCard( + ResidentTransactionEntity residentTransactionEntity, String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForOrderPhysicalCard( + ResidentTransactionEntity residentTransactionEntity, String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForGetMyId(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForUpdateMyUin(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForManageMyVid(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + RequestType requestType = RequestType.DEFAULT; + String templateData = ""; + fileText = fileText.replace(ResidentConstants.DOLLAR + TemplateVariablesConstants.VID_TYPE, + replaceNullWithEmptyString(residentTransactionEntity.getRefIdType())); + fileText = fileText.replace(ResidentConstants.DOLLAR + TemplateVariablesConstants.MASKED_VID, + replaceNullWithEmptyString(residentTransactionEntity.getRefId())); + if (RequestType.GENERATE_VID.name().equalsIgnoreCase(residentTransactionEntity.getRequestTypeCode())) { + requestType = RequestType.GENERATE_VID; + } else if (RequestType.REVOKE_VID.name().equalsIgnoreCase(residentTransactionEntity.getRequestTypeCode())) { + requestType = RequestType.REVOKE_VID; + } + templateData = getAttributeBasedOnLangcode(requestType.name(), languageCode); + fileText = fileText.replace(ResidentConstants.DOLLAR + TemplateVariablesConstants.ACTION_PERFORMED, templateData); + return fileText; + } + + public String getDescriptionTemplateVariablesForVidCardDownload(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + return fileText; + } + + public String getDescriptionTemplateVariablesForValidateOtp(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + String channelsTemplateData = getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.VALIDATE_OTP); + fileText = fileText.replace(ResidentConstants.DOLLAR + TemplateVariablesConstants.CHANNEL, channelsTemplateData); + return fileText; + } + + public String getDescriptionTemplateVariablesForSecureMyId(ResidentTransactionEntity residentTransactionEntity, + String fileText, String languageCode) { + String authTypeFromDB; + if (residentTransactionEntity.getAttributeList() != null && !residentTransactionEntity.getAttributeList().isEmpty()) { + authTypeFromDB = residentTransactionEntity.getAttributeList(); + } else { + authTypeFromDB = residentTransactionEntity.getPurpose(); + } + if (authTypeFromDB != null) { + List authTypeListFromEntity = List + .of(authTypeFromDB.split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)); + return authTypeListFromEntity.stream().map(authType -> { + String fileTextTemplate = fileText; + String templateData = ""; + if (authType.contains(EventStatusSuccess.UNLOCKED.name())) { + templateData = getAttributeBasedOnLangcode(EventStatusSuccess.UNLOCKED.name(), languageCode); + fileTextTemplate = fileTextTemplate.replace(ResidentConstants.DOLLAR + ResidentConstants.STATUS, + templateData); + } else { + templateData = getAttributeBasedOnLangcode(EventStatusSuccess.LOCKED.name(), languageCode); + fileTextTemplate = fileTextTemplate.replace(ResidentConstants.DOLLAR + ResidentConstants.STATUS, + templateData); + } + templateData = getAttributeBasedOnLangcode(authType.split(ResidentConstants.COLON)[0].trim(), languageCode); + fileTextTemplate = fileTextTemplate.replace(ResidentConstants.DOLLAR + ResidentConstants.AUTH_TYPE, + templateData); + return fileTextTemplate; + }).collect(Collectors.joining(ResidentConstants.UI_ATTRIBUTE_DATA_DELIMITER)); + } + return fileText; + } + + public Tuple2, String> getAckTemplateVariablesForDefault(ResidentTransactionEntity residentTransactionEntity, String languageCode, Integer timeZoneOffset, String locale){ + return Tuples.of(getCommonTemplateVariables(residentTransactionEntity, RequestType.DEFAULT, languageCode, timeZoneOffset, locale), ""); + } + + public String replaceNullWithEmptyString(String input) { + return input == null ? "" : input; + } + + public String getIndividualIdType() throws ApisResourceAccessException { + String individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + return identityServiceImpl.getIndividualIdType(individualId).name(); + } + + public Tuple2, String> getAckTemplateVariablesForShareCredentialWithPartner(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.SHARE_CRED_WITH_PARTNER, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.ATTRIBUTE_LIST, getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.SHARE_CRED_WITH_PARTNER)); + templateVariables.put(TemplateVariablesConstants.PURPOSE, residentTransactionEntity.getPurpose()); + templateVariables.put(TemplateVariablesConstants.PARTNER_NAME, + residentTransactionEntity.getRequestedEntityName()); + templateVariables.put(TemplateVariablesConstants.PARTNER_LOGO, + getPartnerLogo(residentTransactionEntity.getRequestedEntityId(), residentTransactionEntity.getRequestedEntityType())); + return Tuples.of(templateVariables, + Objects.requireNonNull(this.env.getProperty(ResidentConstants.ACK_SHARE_CREDENTIAL_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForAuthenticationRequest(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.AUTHENTICATION_REQUEST, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.PARTNER_NAME, + residentTransactionEntity.getRequestedEntityName()); + templateVariables.put(TemplateVariablesConstants.PARTNER_LOGO, + getPartnerLogo(residentTransactionEntity.getRequestedEntityId(), env.getProperty( + ResidentConstants.RESIDENT_AUTHENTICATION_REQUEST_PARTNER_TYPE, ResidentConstants.AUTH_PARTNER))); + return Tuples.of(templateVariables, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.ACK_AUTHENTICATION_REQUEST_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForDownloadPersonalizedCard(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.DOWNLOAD_PERSONALIZED_CARD, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.ATTRIBUTE_LIST, getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.DOWNLOAD_PERSONALIZED_CARD)); + return Tuples.of(templateVariables, Objects.requireNonNull( + this.env.getProperty(ResidentConstants.ACK_DOWNLOAD_PERSONALIZED_CARD_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForOrderPhysicalCard(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.ORDER_PHYSICAL_CARD, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.ATTRIBUTE_LIST, getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.ORDER_PHYSICAL_CARD)); + templateVariables.put(TemplateVariablesConstants.TRACKING_ID, residentTransactionEntity.getTrackingId()); + templateVariables.put(TemplateVariablesConstants.ORDER_TRACKING_LINK, + residentTransactionEntity.getReferenceLink()); + templateVariables.put(TemplateVariablesConstants.PARTNER_NAME, + residentTransactionEntity.getRequestedEntityName()); + templateVariables.put(TemplateVariablesConstants.PARTNER_LOGO, + getPartnerLogo(residentTransactionEntity.getRequestedEntityId(), residentTransactionEntity.getRequestedEntityType())); + templateVariables.put(TemplateVariablesConstants.PAYMENT_STATUS, + getPaymentStatus(residentTransactionEntity.getStatusCode())); + templateVariables.put(TemplateVariablesConstants.DOWNLOAD_CARD_LINK, + residentTransactionEntity.getReferenceLink()); + return Tuples.of(templateVariables, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.ACK_ORDER_PHYSICAL_CARD_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForGetMyId(ResidentTransactionEntity residentTransactionEntity, String languageCode, + Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.GET_MY_ID, + languageCode, timeZoneOffset, locale); + return Tuples.of(templateVariables, + Objects.requireNonNull(this.env.getProperty(ResidentConstants.ACK_GET_MY_ID_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForUpdateMyUin(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.UPDATE_MY_UIN, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.ATTRIBUTE_LIST, getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.UPDATE_MY_UIN)); + templateVariables.put(TemplateVariablesConstants.DOWNLOAD_LINK, + (!residentTransactionEntity.getStatusCode().equals(EventStatusSuccess.CARD_DOWNLOADED.name()) + && !residentTransactionEntity.getStatusCode().equals(EventStatusFailure.FAILED.name())) + ? utility.createDownloadCardLinkFromEventId(residentTransactionEntity) + : ResidentConstants.NOT_AVAILABLE); + return Tuples.of(templateVariables, + Objects.requireNonNull(this.env.getProperty(ResidentConstants.ACK_UPDATE_MY_UIN_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForGenerateVid(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.GENERATE_VID, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.VID_TYPE, residentTransactionEntity.getRefIdType()); + templateVariables.put(TemplateVariablesConstants.VID, residentTransactionEntity.getRefId()); + return Tuples.of(templateVariables, + Objects.requireNonNull(this.env.getProperty(ResidentConstants.ACK_MANAGE_MY_VID_TEMPLATE_PROPERTY))); + } + + public String getSummaryFromResidentTransactionEntityLangCode(ResidentTransactionEntity residentTransactionEntity, + String languageCode, String statusCode, RequestType requestType) { + try { + return residentService.getSummaryForLangCode(residentTransactionEntity, languageCode, statusCode, + requestType); + } catch (ResidentServiceCheckedException e) { + return requestType.name(); + } + } + + public Tuple2, String> getAckTemplateVariablesForRevokeVid(ResidentTransactionEntity residentTransactionEntity, String languageCode, + Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.REVOKE_VID, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.VID_TYPE, residentTransactionEntity.getRefIdType()); + templateVariables.put(TemplateVariablesConstants.VID, residentTransactionEntity.getRefId()); + return Tuples.of(templateVariables, + Objects.requireNonNull(this.env.getProperty(ResidentConstants.ACK_MANAGE_MY_VID_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForAuthTypeLockUnlock(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.AUTH_TYPE_LOCK_UNLOCK, + languageCode, timeZoneOffset, locale); + templateVariables.put(ResidentConstants.AUTH_TYPE, residentTransactionEntity.getAttributeList()); + return Tuples.of(templateVariables, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.ACK_AUTH_TYPE_LOCK_UNLOCK_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForVidCardDownload(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.VID_CARD_DOWNLOAD, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.DOWNLOAD_LINK, + (!residentTransactionEntity.getStatusCode().equals(EventStatusSuccess.CARD_DOWNLOADED.name()) + && !residentTransactionEntity.getStatusCode().equals(EventStatusFailure.FAILED.name())) + ? utility.createDownloadCardLinkFromEventId(residentTransactionEntity) + : ResidentConstants.NOT_AVAILABLE); + return Tuples.of(templateVariables, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.ACK_VID_CARD_DOWNLOAD_TEMPLATE_PROPERTY))); + } + + public Tuple2, String> getAckTemplateVariablesForSendOtp(ResidentTransactionEntity residentTransactionEntity, String languageCode, + Integer timeZoneOffset, String locale) { + return Tuples.of(getCommonTemplateVariables(residentTransactionEntity, RequestType.SEND_OTP, languageCode, timeZoneOffset, locale), ""); + } + + public Tuple2, String> getAckTemplateVariablesForValidateOtp(ResidentTransactionEntity residentTransactionEntity, + String languageCode, Integer timeZoneOffset, String locale) { + Map templateVariables = getCommonTemplateVariables(residentTransactionEntity, RequestType.VALIDATE_OTP, + languageCode, timeZoneOffset, locale); + templateVariables.put(TemplateVariablesConstants.CHANNEL, getAttributesDisplayText( + residentTransactionEntity.getAttributeList(), languageCode, RequestType.VALIDATE_OTP)); + return Tuples.of(templateVariables, Objects + .requireNonNull(this.env.getProperty(ResidentConstants.ACK_VERIFY_PHONE_EMAIL_TEMPLATE_PROPERTY))); + } + + public Map getNotificationCommonTemplateVariables(NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = new HashMap<>(); + String langCode = dto.getLangCode(); + try { + String name = utility.getMappingValue(notificationAttributes, TemplateVariablesConstants.NAME, langCode); + templateVariables.put(TemplateVariablesConstants.NAME, name); + } catch (ResidentServiceCheckedException | IOException e) { + logger.error("Error in getting name.. " + e.getMessage()); + templateVariables.put(TemplateVariablesConstants.NAME, RESIDENT); + } + templateVariables.put(TemplateVariablesConstants.EVENT_ID, dto.getEventId()); + templateVariables.put(TemplateVariablesConstants.EVENT_DETAILS, getEventTypeBasedOnLangcode(dto.getRequestType(), langCode)); + templateVariables.put(TemplateVariablesConstants.DATE, getDate()); + templateVariables.put(TemplateVariablesConstants.TIME, getTime()); + TemplateType status = dto.getTemplateType(); + if (TemplateType.REGPROC_SUCCESS.equals(status)){ + status = TemplateType.IN_PROGRESS; + } else if (TemplateType.REGPROC_FAILED.equals(status)) { + status = TemplateType.FAILURE; + } + templateVariables.put(TemplateVariablesConstants.STATUS, status.getType()); + templateVariables.put(TemplateVariablesConstants.TRACK_SERVICE_REQUEST_LINK, + utility.createTrackServiceRequestLink(dto.getEventId())); + return templateVariables; + } + + public Map getNotificationSendOtpVariables(NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + templateVariables.put(TemplateVariablesConstants.OTP, dto.getOtp()); + return templateVariables; + } + + private String getTime() { + return DateUtils.getUTCCurrentDateTimeString(templateTimePattern); + } + + private String getDate() { + return DateUtils.getUTCCurrentDateTimeString(templateDatePattern); + } + + public Map getNotificationTemplateVariablesForGenerateOrRevokeVid( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForAuthTypeLockUnlock( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForUpdateMyUin(NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForVerifyPhoneEmail( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForGetMyId(NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForDownloadPersonalizedCard( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForOrderPhysicalCard( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForShareCredentialWithPartner( + NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + templateVariables.put(TemplateVariablesConstants.PARTNER_ID, + notificationAttributes.get(TemplateVariablesConstants.PARTNER_ID)); + return templateVariables; + } + + public Map getNotificationTemplateVariablesForVidCardDownload(NotificationTemplateVariableDTO dto, Map notificationAttributes) { + Map templateVariables = getNotificationCommonTemplateVariables(dto, notificationAttributes); + return templateVariables; + } + + public String getEmailSubjectTemplateTypeCode(RequestType requestType, TemplateType templateType) { + String emailSubjectTemplateCodeProperty = requestType.getEmailSubjectTemplateCodeProperty(templateType); + return getTemplateTypeCode(emailSubjectTemplateCodeProperty); + } + + public String getEmailContentTemplateTypeCode(RequestType requestType, TemplateType templateType) { + String emailContentTemplateCodeProperty = requestType.getEmailContentTemplateCodeProperty(templateType); + return getTemplateTypeCode(emailContentTemplateCodeProperty); + } + + public String getSmsTemplateTypeCode(RequestType requestType, TemplateType templateType) { + String smsTemplateCodeProperty = requestType.getSmsTemplateCodeProperty(templateType); + return getTemplateTypeCode(smsTemplateCodeProperty); + } + + public String getPurposeTemplateTypeCode(RequestType requestType, TemplateType templateType) { + String purposeTemplateCodeProperty = requestType.getPurposeTemplateCodeProperty(templateType); + return getTemplateTypeCode(purposeTemplateCodeProperty); + } + + public String getSummaryTemplateTypeCode(RequestType requestType, TemplateType templateType) { + String summaryTemplateCodeProperty = requestType.getSummaryTemplateCodeProperty(templateType); + return getTemplateTypeCode(summaryTemplateCodeProperty); + } + + private String getAuthTypeCodeTemplateTypeCode(String authTypeCode) { + String templateCodeProperty = String.format(RESIDENT_AUTH_TYPE_CODE_TEMPLATE_PROPERTY, authTypeCode); + String templateTypeCode = getTemplateTypeCode(templateCodeProperty); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", authTypeCode)); + return getTemplateTypeCode(ResidentConstants.RESIDENT_UNKNOWN_TEMPLATE_PROPERTY); + } else { + return templateTypeCode; + } + } + + private String getIDAuthRequestTypeDescriptionTemplateTypeCode(String authTypeCode, String statusCode) { + String templateCodeProperty = String.format(RESIDENT_ID_AUTH_REQUEST_TYPE_DESCR, authTypeCode, statusCode); + String templateTypeCode = getTemplateTypeCode(templateCodeProperty); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", authTypeCode)); + return getTemplateTypeCode(String.format(RESIDENT_ID_AUTH_REQUEST_TYPE_DESCR, UNKNOWN, statusCode)); + } else { + return templateTypeCode; + } + } + + public String getAttributeBasedOnLangcode(String attributeName, String languageCode) { + String templateTypeCode = getTemplateTypeCode( + String.format(RESIDENT_TEMPLATE_PROPERTY_ATTRIBUTE_LIST, attributeName)); + if (templateTypeCode == null) { + logger.warn(String.format("Template property is missing for %s", attributeName)); + templateTypeCode = getTemplateTypeCode(ResidentConstants.RESIDENT_UNKNOWN_TEMPLATE_PROPERTY); + } + return getTemplateValueFromTemplateTypeCodeAndLangCode(languageCode, templateTypeCode); + } + + private String getTemplateTypeCode(String templateCodeProperty) { + return env.getProperty(templateCodeProperty); + } + + private String getPaymentStatus(String statusCode) { + if (statusCode.equalsIgnoreCase(EventStatusFailure.PAYMENT_FAILED.name())) { + return EventStatusFailure.PAYMENT_FAILED.name(); + } else { + return EventStatusInProgress.PAYMENT_CONFIRMED.name(); + } + } + + private String getPartnerLogo(String partnerId, String partnerType) { + Map partnerDetail = new HashMap<>(); + try { + partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType(partnerId, + partnerType); + } catch (Exception exception) { + logger.error(ResidentErrorCode.PARTNER_SERVICE_EXCEPTION.getErrorCode(), exception); + return ""; + } + return (String) partnerDetail.get(LOGO_URL); + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/TokenGenerator.java b/resident/resident-service/src/main/java/io/mosip/resident/util/TokenGenerator.java index 9afab32372c..e65460167ed 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/TokenGenerator.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/TokenGenerator.java @@ -63,7 +63,7 @@ private String generateToken(ClientIdSecretKeyRequestDto dto) throws IOException TokenRequestDto tokenRequest = new TokenRequestDto(); tokenRequest.setId(environment.getProperty("token.request.id")); - tokenRequest.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + tokenRequest.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); // tokenRequest.setRequest(setPasswordRequestDTO()); tokenRequest.setRequest(dto); tokenRequest.setVersion(environment.getProperty("token.request.version")); diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadService.java b/resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadHelper.java similarity index 92% rename from resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadService.java rename to resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadHelper.java index c83251901ee..a3b2e2a8597 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadService.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/UINCardDownloadHelper.java @@ -1,72 +1,72 @@ -package io.mosip.resident.util; - -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.json.JSONArray; -import org.json.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.PrintRequest; -import io.mosip.resident.dto.UINCardRequestDTO; -import io.mosip.resident.exception.ApisResourceAccessException; - -@Component -public class UINCardDownloadService { - private static final Logger logger = LoggerConfiguration.logConfig(UINCardDownloadService.class); - @Autowired - private Environment env; - - @Autowired - private ResidentServiceRestClient residentServiceRestClient; - - private static final String PRINT_ID="mosip.registration.processor.print.id"; - private static final String PRINT_VERSION="mosip.registration.processor.application.version"; - private static final String ERRORS="errors"; - - public byte[] getUINCard(String individualId,String cardType,IdType idType) throws ApisResourceAccessException { - PrintRequest request=new PrintRequest(); - UINCardRequestDTO uincardDTO=new UINCardRequestDTO(); - uincardDTO.setCardType(cardType); - uincardDTO.setIdValue(individualId); - uincardDTO.setIdtype(idType); - request.setRequest(uincardDTO); - request.setId(env.getProperty(PRINT_ID)); - request.setVersion(env.getProperty(PRINT_VERSION)); - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - byte[] response; - try { - response = (byte[]) residentServiceRestClient.postApi(env.getProperty(ApiName.REGPROCPRINT.name()), - null, request, byte[].class); - if(response ==null) { - throw new ApisResourceAccessException(); - } - String res= new String(response); - if(res.contains(ERRORS)) { - JSONObject responseJson=new JSONObject(res); - JSONArray errorJson=responseJson.getJSONArray(ERRORS); - for(int i=0;i"+e.getMessage()); - } - return response; - } -} +package io.mosip.resident.util; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.PrintRequest; +import io.mosip.resident.dto.UINCardRequestDTO; +import io.mosip.resident.exception.ApisResourceAccessException; + +@Component +public class UINCardDownloadHelper { + private static final Logger logger = LoggerConfiguration.logConfig(UINCardDownloadHelper.class); + @Autowired + private Environment env; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + private static final String PRINT_ID="mosip.registration.processor.print.id"; + private static final String PRINT_VERSION="mosip.registration.processor.application.version"; + private static final String ERRORS="errors"; + + public byte[] getUINCard(String individualId,String cardType,IdType idType) throws ApisResourceAccessException { + PrintRequest request=new PrintRequest(); + UINCardRequestDTO uincardDTO=new UINCardRequestDTO(); + uincardDTO.setCardType(cardType); + uincardDTO.setIdValue(individualId); + uincardDTO.setIdtype(idType); + request.setRequest(uincardDTO); + request.setId(env.getProperty(PRINT_ID)); + request.setVersion(env.getProperty(PRINT_VERSION)); + request.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime())); + byte[] response; + try { + response = (byte[]) residentServiceRestClient.postApi(env.getProperty(ApiName.REGPROCPRINT.name()), + null, request, byte[].class); + if(response ==null) { + throw new ApisResourceAccessException(); + } + String res= new String(response); + if(res.contains(ERRORS)) { + JSONObject responseJson=new JSONObject(res); + JSONArray errorJson=responseJson.getJSONArray(ERRORS); + for(int i=0;i"+e.getMessage()); + } + return response; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/Utilities.java b/resident/resident-service/src/main/java/io/mosip/resident/util/Utilities.java index 3de53d75717..81efba52caa 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/Utilities.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/Utilities.java @@ -1,352 +1,537 @@ -package io.mosip.resident.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.kernel.core.exception.ExceptionUtils; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.kernel.core.util.StringUtils; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.*; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.VidCreationException; -import lombok.Data; -import org.assertj.core.util.Lists; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -import javax.annotation.PostConstruct; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.*; - -/** - * The Class Utilities. - * - * @author Girish Yarru - */ -@Component - -/** - * Instantiates a new utilities. - */ -@Data -public class Utilities { - - private final Logger logger = LoggerConfiguration.logConfig(Utilities.class); - /** The reg proc logger. */ - private static final String sourceStr = "source"; - - /** The Constant UIN. */ - private static final String UIN = "UIN"; - - /** The Constant FILE_SEPARATOR. */ - public static final String FILE_SEPARATOR = "\\"; - - /** The Constant RE_PROCESSING. */ - private static final String RE_PROCESSING = "re-processing"; - - /** The Constant HANDLER. */ - private static final String HANDLER = "handler"; - - /** The Constant NEW_PACKET. */ - private static final String NEW_PACKET = "New-packet"; - - @Value("${IDSchema.Version}") - private String idschemaVersion; - - @Value("${provider.packetwriter.resident}") - private String provider; - - @Autowired - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Autowired - private ObjectMapper objMapper; - - @Autowired - private Environment env; - - @Autowired - private ResidentServiceRestClient residentServiceRestClient; - - /** The config server file storage URL. */ - @Value("${config.server.file.storage.uri}") - private String configServerFileStorageURL; - - /** The get reg processor identity json. */ - @Value("${registration.processor.identityjson}") - private String residentIdentityJson; - - /** The id repo update. */ - @Value("${id.repo.update}") - private String idRepoUpdate; - - /** The vid version. */ - @Value("${resident.vid.version}") - private String vidVersion; - - - /** The Constant NAME. */ - private static final String NAME = "name"; - - private static final String VALUE = "value"; - - private String mappingJsonString = null; - - private static String regProcessorIdentityJson = ""; - - @PostConstruct - private void loadRegProcessorIdentityJson() { - regProcessorIdentityJson = residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); - logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), "loadRegProcessorIdentityJson completed successfully"); - } - - public JSONObject retrieveIdrepoJson(String uin) throws ApisResourceAccessException, IdRepoAppException, IOException { - - if (uin != null) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson()::entry"); - List pathSegments = new ArrayList<>(); - pathSegments.add(uin); - IdResponseDTO1 idResponseDto; - - idResponseDto = (IdResponseDTO1) residentServiceRestClient.getApi(ApiName.IDREPOGETIDBYUIN, pathSegments, "", "", - IdResponseDTO1.class); - if (idResponseDto == null) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson()::exit idResponseDto is null"); - return null; - } - if (!idResponseDto.getErrors().isEmpty()) { - List error = idResponseDto.getErrors(); - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson():: error with error message " + error.get(0).getMessage()); - throw new IdRepoAppException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), error.get(0).getMessage()); - } - String response = objMapper.writeValueAsString(idResponseDto.getResponse().getIdentity()); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson():: IDREPOGETIDBYUIN GET service call ended Successfully"); - try { - return (JSONObject) new JSONParser().parse(response); - } catch (org.json.simple.parser.ParseException e) { - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - ExceptionUtils.getStackTrace(e)); - throw new IdRepoAppException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), "Error while parsing string to JSONObject",e); - } - - - } - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson()::exit UIN is null"); - return null; - } - - public JSONObject getRegistrationProcessorMappingJson() throws IOException { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", - "Utilities::getRegistrationProcessorMappingJson()::entry"); - - mappingJsonString = (mappingJsonString != null && !mappingJsonString.isEmpty()) ? - mappingJsonString : getJson(configServerFileStorageURL, residentIdentityJson); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", - "Utilities::getRegistrationProcessorMappingJson()::exit"); - return JsonUtil.getJSONObject(objMapper.readValue(mappingJsonString, JSONObject.class), MappingJsonConstants.IDENTITY); - - } - - public String getUinByVid(String vid) throws ApisResourceAccessException, VidCreationException, IOException { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", - "Utilities::getUinByVid():: entry"); - List pathSegments = new ArrayList<>(); - pathSegments.add(vid); - String uin = null; - VidResponseDTO1 response; - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", - "Stage::methodname():: RETRIEVEIUINBYVID GET service call Started"); - - response = (VidResponseDTO1) residentServiceRestClient.getApi(ApiName.GETUINBYVID, pathSegments, "", "", - VidResponseDTO1.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::getUinByVid():: RETRIEVEIUINBYVID GET service call ended successfully"); - - if (!response.getErrors().isEmpty()) { - throw new VidCreationException("VID creation exception"); - - } else { - uin = response.getResponse().getUin(); - } - return uin; - } - - public boolean linkRegIdWrtUin(String registrationID, String uin) throws ApisResourceAccessException, IOException { - - IdResponseDTO idResponse = null; - RequestDto1 requestDto = new RequestDto1(); - if (uin != null) { - - JSONObject identityObject = new JSONObject(); - identityObject.put(UIN, uin); - addSchemaVersion(identityObject); - - requestDto.setRegistrationId(registrationID); - requestDto.setIdentity(identityObject); - - IdRequestDto idRequestDTO = new IdRequestDto(); - idRequestDTO.setId(idRepoUpdate); - idRequestDTO.setRequest(requestDto); - idRequestDTO.setMetadata(null); - idRequestDTO.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - idRequestDTO.setVersion(vidVersion); - - idResponse = (IdResponseDTO) residentServiceRestClient.patchApi(env.getProperty(ApiName.IDREPOSITORY.name()), MediaType.APPLICATION_JSON, idRequestDTO, - IdResponseDTO.class); - - if (idResponse != null && idResponse.getResponse() != null) { - - logger.info(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), registrationID, " UIN Linked with the RegID"); - - return true; - } else { - - logger.error(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), registrationID, - " UIN not Linked with the RegID "); - return false; - } - - } else { - - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), - registrationID, " UIN is null "); - } - - return false; - } - - public String getJson(String configServerFileStorageURL, String uri) { - if (StringUtils.isBlank(regProcessorIdentityJson)) { - return residentRestTemplate.getForObject(configServerFileStorageURL + uri, String.class); - } - return regProcessorIdentityJson; - } - - public String retrieveIdrepoJsonStatus(String uin) throws ApisResourceAccessException, IdRepoAppException, IOException { - String response = null; - if (uin != null) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson()::entry"); - List pathSegments = new ArrayList<>(); - pathSegments.add(uin); - IdResponseDTO1 idResponseDto; - - idResponseDto = (IdResponseDTO1) residentServiceRestClient.getApi(ApiName.IDREPOGETIDBYUIN, pathSegments, "", "", - IdResponseDTO1.class); - if (idResponseDto == null) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson()::exit idResponseDto is null"); - return null; - } - if (!idResponseDto.getErrors().isEmpty()) { - List error = idResponseDto.getErrors(); - logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson():: error with error message " + error.get(0).getMessage()); - throw new IdRepoAppException(error.get(0).getErrorCode(), error.get(0).getMessage()); - } - - response = idResponseDto.getResponse().getStatus(); - - logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", - "Utilities::retrieveIdrepoJson():: IDREPOGETIDBYUIN GET service call ended Successfully"); - } - - return response; - } - - public String getDefaultSource() { - String[] strs = provider.split(","); - List strList = Lists.newArrayList(strs); - Optional optional = strList.stream().filter(s -> s.contains(sourceStr)).findAny(); - String source = optional.isPresent() ? optional.get().replace(sourceStr + ":", "") : null; - return source; - } - - private void addSchemaVersion(JSONObject identityObject) throws IOException { - - JSONObject regProcessorIdentityJson = getRegistrationProcessorMappingJson(); - String schemaVersion = JsonUtil.getJSONValue( - JsonUtil.getJSONObject(regProcessorIdentityJson, MappingJsonConstants.IDSCHEMA_VERSION), - MappingJsonConstants.VALUE); - - identityObject.put(schemaVersion, Float.valueOf(idschemaVersion)); - - } - - public List> generateAudit(String rid) { - // Getting Host IP Address and Name - String hostIP = null; - String hostName = null; - try { - hostIP = InetAddress.getLocalHost().getHostAddress(); - hostName = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException unknownHostException) { - - hostIP = ServerUtil.getServerUtilInstance().getServerIp(); - hostName = ServerUtil.getServerUtilInstance().getServerName(); - } - - List> mapList = new ArrayList<>(); - - Map auditDtos = new HashMap<>(); - auditDtos.put("uuid", UUID.randomUUID().toString()); - auditDtos.put("createdAt", DateUtils.getUTCCurrentDateTimeString()); - auditDtos.put("eventId", "RPR_405"); - auditDtos.put("eventName", "packet uploaded"); - auditDtos.put("eventType", "USER"); - auditDtos.put("actionTimeStamp", DateUtils.getUTCCurrentDateTimeString()); - auditDtos.put("hostName", hostName); - auditDtos.put("hostIp", hostIP); - auditDtos.put("applicationId", env.getProperty(RegistrationConstants.APP_NAME)); - auditDtos.put("applicationName", env.getProperty(RegistrationConstants.APP_NAME)); - auditDtos.put("sessionUserId", "mosip"); - auditDtos.put("sessionUserName", "Registration"); - auditDtos.put("id", rid); - auditDtos.put("idType", "REGISTRATION_ID"); - auditDtos.put("createdBy", "Packet_Generator"); - auditDtos.put("moduleName", "REQUEST_HANDLER_SERVICE"); - auditDtos.put("moduleId", "REG - MOD - 119"); - auditDtos.put("description", "Packet uploaded successfully"); - - mapList.add(auditDtos); - - return mapList; - } - - public String getLanguageCode() { - String langCode=null; - String mandatoryLanguages = env.getProperty("mosip.mandatory-languages"); - if (!StringUtils.isBlank(mandatoryLanguages)) { - String[] lanaguages = mandatoryLanguages.split(","); - langCode = lanaguages[0]; - } else { - String optionalLanguages = env.getProperty("mosip.optional-languages"); - if (!StringUtils.isBlank(optionalLanguages)) { - String[] lanaguages = optionalLanguages.split(","); - langCode = lanaguages[0]; - } - } - return langCode; - } +package io.mosip.resident.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.itextpdf.text.pdf.PdfReader; +import io.mosip.kernel.core.exception.ExceptionUtils; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.constant.PacketStatus; +import io.mosip.resident.constant.RegistrationConstants; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TransactionStage; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.VidResponseDTO1; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.IndividualIdNotFoundException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.service.ProxyMasterdataService; +import lombok.Data; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import reactor.util.function.Tuple3; +import reactor.util.function.Tuples; + +import javax.annotation.PostConstruct; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.SecureRandom; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +import static io.mosip.resident.constant.RegistrationConstants.DATETIME_PATTERN; +import static io.mosip.resident.constant.ResidentConstants.AID_STATUS; +import static io.mosip.resident.constant.ResidentConstants.STATUS_CODE; +import static io.mosip.resident.constant.ResidentConstants.TRANSACTION_TYPE_CODE; +import static java.nio.charset.StandardCharsets.UTF_8; + + +/** + * The Class Utilities. + * + * @author Girish Yarru + */ +@Component + +/** + * Instantiates a new utilities. + */ +@Data +public class Utilities { + private static final String CREATE_DATE_TIMES = "createdDateTimes"; + private final Logger logger = LoggerConfiguration.logConfig(Utilities.class); + /** The reg proc logger. */ + private static final String sourceStr = "source"; + + /** The Constant FILE_SEPARATOR. */ + public static final String FILE_SEPARATOR = "\\"; + + @Value("${IDSchema.Version}") + private String idschemaVersion; + + @Value("${provider.packetwriter.resident}") + private String provider; + + @Autowired + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Autowired + private ObjectMapper objMapper; + + @Autowired + private Environment env; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + @Autowired + private Utility utility; + + @Autowired + private IdentityService identityService; + /** The config server file storage URL. */ + @Value("${config.server.file.storage.uri}") + private String configServerFileStorageURL; + + /** The get reg processor identity json. */ + @Value("${registration.processor.identityjson}") + private String residentIdentityJson; + + /** The id repo update. */ + @Value("${id.repo.update}") + private String idRepoUpdate; + + /** The vid version. */ + @Value("${resident.vid.version}") + private String vidVersion; + + private String mappingJsonString = null; + + private static String regProcessorIdentityJson = ""; + private SecureRandom secureRandom; + + /** The acr-amr mapping json file. */ + @Value("${amr-acr.json.filename}") + private String amrAcrJsonFile; + + private static final String ACR_AMR = "acr_amr"; + + + @PostConstruct + private void loadRegProcessorIdentityJson() { + regProcessorIdentityJson = residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); + logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "loadRegProcessorIdentityJson completed successfully"); + } + + public JSONObject retrieveIdrepoJson(String uin) throws ApisResourceAccessException, IdRepoAppException, IOException { + + if (uin != null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::entry"); + List pathSegments = new ArrayList<>(); + pathSegments.add(uin); + IdResponseDTO1 idResponseDto; + + idResponseDto = (IdResponseDTO1) residentServiceRestClient.getApi(ApiName.IDREPOGETIDBYUIN, pathSegments, "", "", + IdResponseDTO1.class); + if (idResponseDto == null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::exit idResponseDto is null"); + return null; + } + if (!idResponseDto.getErrors().isEmpty()) { + List error = idResponseDto.getErrors(); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: error with error message " + error.get(0).getMessage()); + throw new IdRepoAppException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), error.get(0).getMessage()); + } + return convertIdResponseIdentityObjectToJsonObject(idResponseDto.getResponse().getIdentity()); + } + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::exit UIN is null"); + return null; + } + + public JSONObject convertIdResponseIdentityObjectToJsonObject(Object identityObject) throws JsonProcessingException { + String response = objMapper.writeValueAsString(identityObject); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: IDREPOGETIDBYUIN GET service call ended Successfully"); + try { + return (JSONObject) new JSONParser().parse(response); + } catch (org.json.simple.parser.ParseException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + ExceptionUtils.getStackTrace(e)); + throw new IdRepoAppException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), "Error while parsing string to JSONObject",e); + } + } + + public Tuple3 getIdentityDataFromIndividualID(String individualId) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + IdResponseDTO1 idResponseDto = retrieveIdRepoJsonIdResponseDto(individualId); + JSONObject idRepoJson = convertIdResponseIdentityObjectToJsonObject(idResponseDto.getResponse().getIdentity()); + String schemaJson = getSchemaJsonFromIdRepoJson(idRepoJson); + return Tuples.of(idRepoJson, schemaJson, idResponseDto); + } + + public String getSchemaJsonFromIdRepoJson(JSONObject idRepoJson) throws ResidentServiceCheckedException { + String idSchemaVersionStr = String.valueOf(idRepoJson.get(ResidentConstants.ID_SCHEMA_VERSION)); + Double idSchemaVersion = Double.parseDouble(idSchemaVersionStr); + ResponseWrapper idSchemaResponse = proxyMasterdataService.getLatestIdSchema(idSchemaVersion, null, null); + Object idSchema = idSchemaResponse.getResponse(); + Map map = objMapper.convertValue(idSchema, Map.class); + return ((String) map.get("schemaJson")); + } + + public JSONObject getRegistrationProcessorMappingJson() throws IOException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", + "Utilities::getRegistrationProcessorMappingJson()::entry"); + + mappingJsonString = (mappingJsonString != null && !mappingJsonString.isEmpty()) ? + mappingJsonString : getJson(configServerFileStorageURL, residentIdentityJson); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "", + "Utilities::getRegistrationProcessorMappingJson()::exit"); + return JsonUtil.getJSONObject(objMapper.readValue(mappingJsonString, JSONObject.class), MappingJsonConstants.IDENTITY); + + } + + public String getUinByVid(String vid) throws ApisResourceAccessException, VidCreationException, IOException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Utilities::getUinByVid():: entry"); + List pathSegments = new ArrayList<>(); + pathSegments.add(vid); + String uin = null; + VidResponseDTO1 response; + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Stage::methodname():: RETRIEVEIUINBYVID GET service call Started"); + + response = (VidResponseDTO1) residentServiceRestClient.getApi(ApiName.GETUINBYVID, pathSegments, "", "", + VidResponseDTO1.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::getUinByVid():: RETRIEVEIUINBYVID GET service call ended successfully"); + + if (!response.getErrors().isEmpty()) { + throw new IndividualIdNotFoundException(String.format("%s: %s", ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorMessage(), vid)); + + } else { + uin = response.getResponse().getUin(); + } + return uin; + } + + public String getRidByIndividualId(String individualId) throws ApisResourceAccessException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Utilities::getRidByIndividualId():: entry"); + Map pathsegments = new HashMap(); + pathsegments.put("individualId", individualId); + String rid = null; + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Stage::methodname():: RETRIEVEIUINBYVID GET service call Started"); + + ResponseWrapper response = residentServiceRestClient.getApi(ApiName.GET_RID_BY_INDIVIDUAL_ID, + pathsegments, ResponseWrapper.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::getRidByIndividualId():: GET_RID_BY_INDIVIDUAL_ID GET service call ended successfully"); + + if (!response.getErrors().isEmpty()) { + throw new IndividualIdNotFoundException("Individual ID not found exception"); + + } else { + rid = (String) ((Map)response.getResponse()).get(ResidentConstants.RID); + } + return rid; + } + + public ArrayList getRidStatus(String rid) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Utilities::getRidStatus():: entry"); + Map pathsegments = new HashMap(); + pathsegments.put("rid", rid); + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), "", + "Stage::methodname():: RETRIEVEIUINBYVID GET service call Started"); + ResponseWrapper responseWrapper = (ResponseWrapper)residentServiceRestClient.getApi(ApiName.GET_RID_STATUS, + pathsegments, ResponseWrapper.class); + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + logger.debug(responseWrapper.getErrors().get(0).toString()); + throw new ResidentServiceCheckedException(ResidentErrorCode.RID_NOT_FOUND.getErrorCode(), + responseWrapper.getErrors().get(0).getMessage()); + } + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::getRidByIndividualId():: GET_RID_BY_INDIVIDUAL_ID GET service call ended successfully"); + ArrayList objectArrayList = objMapper.readValue( + objMapper.writeValueAsString(responseWrapper.getResponse()), ArrayList.class); + return sortedRegprocStageList(objectArrayList); + } + + public ArrayList sortedRegprocStageList(ArrayList objectArrayList) { + if (objectArrayList.isEmpty() || !(objectArrayList.get(0) instanceof Map)) { + throw new IllegalArgumentException("Input ArrayList must contain Map objects."); + } + ArrayList> arrayListOfMaps = (ArrayList>) objectArrayList; + arrayListOfMaps.sort((map1, map2) -> { + SimpleDateFormat dateFormat = new SimpleDateFormat(Objects.requireNonNull(env.getProperty(DATETIME_PATTERN))); + String dateTime1 = map1.get(CREATE_DATE_TIMES); + String dateTime2 = map2.get(CREATE_DATE_TIMES); + + try { + Date date1 = dateFormat.parse(dateTime1); + Date date2 = dateFormat.parse(dateTime2); + return date2.compareTo(date1); + } catch (ParseException e) { + throw new IllegalArgumentException("Date parsing error: " + e.getMessage()); + } + }); + + return arrayListOfMaps; + } + + public Map getPacketStatus(String rid) + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + Map packetStatusMap = new HashMap<>(); + ArrayList regTransactionList = getRidStatus(rid); + for (Object object : regTransactionList) { + if (object instanceof Map) { + Map packetData = (Map) object; + Optional packetStatusCode = getPacketStatusCode(packetData); + Optional transactionTypeCode = getTransactionTypeCode(packetData); + if (packetStatusCode.isPresent() && transactionTypeCode.isPresent()) { + packetStatusMap.put(AID_STATUS, packetStatusCode.get()); + packetStatusMap.put(TRANSACTION_TYPE_CODE, transactionTypeCode.get()); + return packetStatusMap; + } + } + } + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), + String.format("%s - Unable to get the RID status from Reg-proc", + ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorMessage())); + } + + private Optional getPacketStatusCode(Map packetData) { + String statusCode = (String) packetData.get(STATUS_CODE); + Optional packetStatusCode = PacketStatus.getStatusCode(statusCode, env); + return packetStatusCode; + } + + private Optional getTransactionTypeCode(Map packetData) { + String transactionTypeCode = (String) packetData.get(TRANSACTION_TYPE_CODE); + Optional typeCode = TransactionStage.getTypeCode(transactionTypeCode, env); + return typeCode; + } + + public String getJson(String configServerFileStorageURL, String uri) { + if (StringUtils.isBlank(regProcessorIdentityJson)) { + return residentRestTemplate.getForObject(configServerFileStorageURL + uri, String.class); + } + return regProcessorIdentityJson; + } + + public String retrieveIdrepoJsonStatus(String uin) throws ApisResourceAccessException, IdRepoAppException, IOException { + String response = null; + if (uin != null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::entry"); + List pathSegments = new ArrayList<>(); + pathSegments.add(uin); + IdResponseDTO1 idResponseDto; + + idResponseDto = (IdResponseDTO1) residentServiceRestClient.getApi(ApiName.IDREPOGETIDBYUIN, pathSegments, "", "", + IdResponseDTO1.class); + if (idResponseDto == null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::exit idResponseDto is null"); + return null; + } + if (!idResponseDto.getErrors().isEmpty()) { + List error = idResponseDto.getErrors(); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: error with error message " + error.get(0).getMessage()); + throw new IdRepoAppException(error.get(0).getErrorCode(), error.get(0).getMessage()); + } + + response = idResponseDto.getResponse().getStatus(); + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: IDREPOGETIDBYUIN GET service call ended Successfully"); + } + + return response; + } + + public IdResponseDTO1 retrieveIdRepoJsonIdResponseDto(String uin) throws ApisResourceAccessException, IdRepoAppException, IOException { + IdResponseDTO1 response = null; + if (uin != null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::entry"); + List pathSegments = new ArrayList<>(); + pathSegments.add(uin); + IdResponseDTO1 idResponseDto; + + idResponseDto = (IdResponseDTO1) utility.getCachedIdentityData(uin, identityService.getAccessToken(), IdResponseDTO1.class); + if (idResponseDto == null) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson()::exit idResponseDto is null"); + return null; + } + if (!idResponseDto.getErrors().isEmpty()) { + List error = idResponseDto.getErrors(); + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: error with error message " + error.get(0).getMessage()); + throw new IdRepoAppException(error.get(0).getErrorCode(), error.get(0).getMessage()); + } + + response = idResponseDto; + + logger.debug(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.UIN.toString(), "", + "Utilities::retrieveIdrepoJson():: IDREPOGETIDBYUIN GET service call ended Successfully"); + } + + return response; + } + + public String getDefaultSource() { + String[] strs = provider.split(","); + List strList = Lists.newArrayList(strs); + Optional optional = strList.stream().filter(s -> s.contains(sourceStr)).findAny(); + String source = optional.isPresent() ? optional.get().replace(sourceStr + ":", "") : null; + return source; + } + + public List> generateAudit(String rid) { + // Getting Host IP Address and Name + String hostIP = null; + String hostName = null; + try { + hostIP = InetAddress.getLocalHost().getHostAddress(); + hostName = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException unknownHostException) { + hostIP = ServerUtil.getServerUtilInstance().getServerIp(); + hostName = ServerUtil.getServerUtilInstance().getServerName(); + } + + List> mapList = new ArrayList<>(); + + Map auditDtos = new HashMap<>(); + auditDtos.put("uuid", UUID.randomUUID().toString()); + String timestamp = DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()); + auditDtos.put("createdAt", timestamp); + auditDtos.put("eventId", "RPR_405"); + auditDtos.put("eventName", "packet uploaded"); + auditDtos.put("eventType", "USER"); + auditDtos.put("actionTimeStamp", timestamp); + auditDtos.put("hostName", hostName); + auditDtos.put("hostIp", hostIP); + auditDtos.put("applicationId", env.getProperty(RegistrationConstants.APP_NAME)); + auditDtos.put("applicationName", env.getProperty(RegistrationConstants.APP_NAME)); + auditDtos.put("sessionUserId", "mosip"); + auditDtos.put("sessionUserName", "Registration"); + auditDtos.put("id", rid); + auditDtos.put("idType", "REGISTRATION_ID"); + auditDtos.put("createdBy", "Packet_Generator"); + auditDtos.put("moduleName", "REQUEST_HANDLER_SERVICE"); + auditDtos.put("moduleId", "REG - MOD - 119"); + auditDtos.put("description", "Packet uploaded successfully"); + + mapList.add(auditDtos); + + return mapList; + } + + public String getLanguageCode() { + String langCode=null; + String mandatoryLanguages = env.getProperty("mosip.mandatory-languages"); + if (mandatoryLanguages!=null && !StringUtils.isBlank(mandatoryLanguages)) { + String[] lanaguages = mandatoryLanguages.split(","); + langCode = lanaguages[0]; + } else { + String optionalLanguages = env.getProperty("mosip.optional-languages"); + if (optionalLanguages!= null && !StringUtils.isBlank(optionalLanguages)) { + String[] lanaguages = optionalLanguages.split(","); + langCode = lanaguages[0]; + } + } + return langCode; + } + + + public String getPhoneAttribute() throws ResidentServiceCheckedException { + return getIdMappingAttributeForKey(MappingJsonConstants.PHONE); + } + + public String getEmailAttribute() throws ResidentServiceCheckedException { + return getIdMappingAttributeForKey(MappingJsonConstants.EMAIL); + } + + private String getIdMappingAttributeForKey(String attributeKey) throws ResidentServiceCheckedException { + try { + JSONObject regProcessorIdentityJson = getRegistrationProcessorMappingJson(); + String phoneAttribute = JsonUtil.getJSONValue( + JsonUtil.getJSONObject(regProcessorIdentityJson, attributeKey), + MappingJsonConstants.VALUE); + return phoneAttribute; + } catch (IOException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.IO_EXCEPTION.getErrorCode(), + ResidentErrorCode.IO_EXCEPTION.getErrorMessage(), e); + } + } + + public int getTotalNumberOfPageInPdf(ByteArrayOutputStream outputStream) throws IOException { + PdfReader pdfReader = new PdfReader(outputStream.toByteArray()); + return pdfReader.getNumberOfPages(); + } + + @PostConstruct + public void initializeSecureRandomInstance(){ + secureRandom = new SecureRandom(); + } + + public SecureRandom getSecureRandom(){ + return secureRandom; + } + + @Cacheable(value = "amr-acr-mapping") + public Map getAmrAcrMapping() throws ResidentServiceCheckedException { + String amrAcrJson = residentRestTemplate.getForObject(configServerFileStorageURL + amrAcrJsonFile, + String.class); + Map amrAcrMap = Map.of(); + try { + if (amrAcrJson != null) { + amrAcrMap = objMapper.readValue(amrAcrJson.getBytes(UTF_8), Map.class); + } + } catch (IOException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), + ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } + Object obj = amrAcrMap.get(ACR_AMR); + Map map = (Map) obj; + Map acrAmrMap = map.entrySet().stream().collect( + Collectors.toMap(entry -> entry.getKey(), entry -> (String) ((ArrayList) entry.getValue()).get(0))); + return acrAmrMap; + } + @Cacheable(value = "getDynamicFieldBasedOnLangCodeAndFieldName", key = "{#fieldName, #langCode, #withValue}") + public ResponseWrapper getDynamicFieldBasedOnLangCodeAndFieldName(String fieldName, String langCode, boolean withValue) throws ResidentServiceCheckedException { + return proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, langCode, withValue); + } } \ No newline at end of file diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/Utilitiy.java b/resident/resident-service/src/main/java/io/mosip/resident/util/Utilitiy.java deleted file mode 100644 index d8772ddbd8e..00000000000 --- a/resident/resident-service/src/main/java/io/mosip/resident/util/Utilitiy.java +++ /dev/null @@ -1,237 +0,0 @@ -package io.mosip.resident.util; - -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.kernel.core.util.StringUtils; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.constant.MappingJsonConstants; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.IdRepoResponseDto; -import io.mosip.resident.dto.JsonValue; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.ResidentServiceException; -import org.assertj.core.util.Lists; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.RestTemplate; - -import javax.annotation.PostConstruct; -import java.io.IOException; -import java.util.*; - -/** - * @author Girish Yarru - * @version 1.0 - */ - -@Component -public class Utilitiy { - - private static final Logger logger = LoggerConfiguration.logConfig(Utilitiy.class); - - @Autowired - private ResidentServiceRestClient residentServiceRestClient; - - @Value("${config.server.file.storage.uri}") - private String configServerFileStorageURL; - - @Value("${registration.processor.identityjson}") - private String residentIdentityJson; - - @Autowired - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Autowired - private Environment env; - - private static final String IDENTITY = "identity"; - private static final String VALUE = "value"; - private static String regProcessorIdentityJson = ""; - - @PostConstruct - private void loadRegProcessorIdentityJson() { - regProcessorIdentityJson = residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); - logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), - LoggerFileConstant.APPLICATIONID.toString(), "loadRegProcessorIdentityJson completed successfully"); - } - - @SuppressWarnings("unchecked") - public JSONObject retrieveIdrepoJson(String id) throws ResidentServiceCheckedException { - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, - "Utilitiy::retrieveIdrepoJson()::entry"); - List pathsegments = new ArrayList<>(); - pathsegments.add(id); - ResponseWrapper response = null; - try { - response = (ResponseWrapper) residentServiceRestClient.getApi( - ApiName.IDREPOGETIDBYUIN, pathsegments, "", null, ResponseWrapper.class); - - } catch (ApisResourceAccessException e) { - if (e.getCause() instanceof HttpClientErrorException) { - HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpClientException.getResponseBodyAsString()); - - } else if (e.getCause() instanceof HttpServerErrorException) { - HttpServerErrorException httpServerException = (HttpServerErrorException) e.getCause(); - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - httpServerException.getResponseBodyAsString()); - } else { - throw new ResidentServiceCheckedException( - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), - ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); - } - } - - return retrieveErrorCode(response, id); - } - - public JSONObject retrieveErrorCode(ResponseWrapper response, String id) - throws ResidentServiceCheckedException { - ResidentErrorCode errorCode; - errorCode = ResidentErrorCode.INVALID_ID; - try { - if (response == null) - throw new IdRepoAppException(errorCode.getErrorCode(), errorCode.getErrorMessage(), - "In valid response while requesting ID Repositary"); - if (!response.getErrors().isEmpty()) { - List error = response.getErrors(); - throw new IdRepoAppException(errorCode.getErrorCode(), errorCode.getErrorMessage(), - error.get(0).getMessage()); - } - - String jsonResponse = JsonUtil.writeValueAsString(response.getResponse()); - JSONObject json = JsonUtil.readValue(jsonResponse, JSONObject.class); - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, - "Utilitiy::retrieveIdrepoJson()::exit"); - return JsonUtil.getJSONObject(json, "identity"); - } catch (IOException e) { - throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), - ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); - } - } - - @SuppressWarnings("unchecked") - public Map getMailingAttributes(String id, Set templateLangauges) - throws ResidentServiceCheckedException { - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, - "Utilitiy::getMailingAttributes()::entry"); - Map attributes = new HashMap<>(); - String mappingJsonString = getMappingJson(); - if(mappingJsonString==null || mappingJsonString.trim().isEmpty()) { - throw new ResidentServiceException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), - ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorMessage() ); - } - JSONObject mappingJsonObject; - try { - JSONObject demographicIdentity = retrieveIdrepoJson(id); - mappingJsonObject = JsonUtil.readValue(mappingJsonString, JSONObject.class); - JSONObject mapperIdentity = JsonUtil.getJSONObject(mappingJsonObject, IDENTITY); - List mapperJsonKeys = new ArrayList<>(mapperIdentity.keySet()); - - String preferredLanguage = getPreferredLanguage(demographicIdentity); - if (StringUtils.isBlank(preferredLanguage)) { - List defaultTemplateLanguages = getDefaultTemplateLanguages(); - if (CollectionUtils.isEmpty(defaultTemplateLanguages)) { - Set dataCapturedLanguages = getDataCapturedLanguages(mapperIdentity, demographicIdentity); - templateLangauges.addAll(dataCapturedLanguages); - } else { - templateLangauges.addAll(defaultTemplateLanguages); - } - } else { - templateLangauges.add(preferredLanguage); - } - - for (String key : mapperJsonKeys) { - LinkedHashMap jsonObject = JsonUtil.getJSONValue(mapperIdentity, key); - String values = jsonObject.get(VALUE); - for (String value : values.split(",")) { - Object object = demographicIdentity.get(value); - if (object instanceof ArrayList) { - JSONArray node = JsonUtil.getJSONArray(demographicIdentity, value); - JsonValue[] jsonValues = JsonUtil.mapJsonNodeToJavaObject(JsonValue.class, node); - for (JsonValue jsonValue : jsonValues) { - if (templateLangauges.contains(jsonValue.getLanguage())) - attributes.put(value + "_" + jsonValue.getLanguage(), jsonValue.getValue()); - } - } else if (object instanceof LinkedHashMap) { - JSONObject json = JsonUtil.getJSONObject(demographicIdentity, value); - attributes.put(value, (String) json.get(VALUE)); - } else { - attributes.put(value, String.valueOf(object)); - } - } - } - } catch (IOException | ReflectiveOperationException e) { - throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), - ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); - } - logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, - "Utilitiy::getMailingAttributes()::exit"); - return attributes; - } - - private String getPreferredLanguage(JSONObject demographicIdentity) { - String preferredLang = null; - String preferredLangAttribute = env.getProperty("mosip.default.user-preferred-language-attribute"); - if (!StringUtils.isBlank(preferredLangAttribute)) { - Object object = demographicIdentity.get(preferredLangAttribute); - if(object!=null) { - preferredLang = String.valueOf(object); - } - } - return preferredLang; - } - - private Set getDataCapturedLanguages(JSONObject mapperIdentity, JSONObject demographicIdentity) - throws ReflectiveOperationException { - Set dataCapturedLangauges = new HashSet(); - LinkedHashMap jsonObject = JsonUtil.getJSONValue(mapperIdentity, MappingJsonConstants.NAME); - String values = jsonObject.get(VALUE); - for (String value : values.split(",")) { - Object object = demographicIdentity.get(value); - if (object instanceof ArrayList) { - JSONArray node = JsonUtil.getJSONArray(demographicIdentity, value); - JsonValue[] jsonValues = JsonUtil.mapJsonNodeToJavaObject(JsonValue.class, node); - for (JsonValue jsonValue : jsonValues) { - dataCapturedLangauges.add(jsonValue.getLanguage()); - } - } - } - return dataCapturedLangauges; - } - - private List getDefaultTemplateLanguages() { - String defaultLanguages = env.getProperty("mosip.default.template-languages"); - if (!StringUtils.isBlank(defaultLanguages)) { - String[] lanaguages = defaultLanguages.split(","); - List strList = Lists.newArrayList(lanaguages); - return strList; - } - return null; - } - - public String getMappingJson() { - if (StringUtils.isBlank(regProcessorIdentityJson)) { - return residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); - } - return regProcessorIdentityJson; - } - -} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/util/Utility.java b/resident/resident-service/src/main/java/io/mosip/resident/util/Utility.java new file mode 100644 index 00000000000..6f6e4d74088 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/util/Utility.java @@ -0,0 +1,1170 @@ +package io.mosip.resident.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.nimbusds.jose.util.IOUtils; +import io.mosip.kernel.authcodeflowproxy.api.validator.ValidateTokenUtil; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.pdfgenerator.spi.PDFGenerator; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.HMACUtils2; +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.kernel.openid.bridge.api.constants.AuthErrorCode; +import io.mosip.kernel.signature.dto.PDFSignatureRequestDto; +import io.mosip.kernel.signature.dto.SignatureResponseDto; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.constant.RegistrationConstants; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.DynamicFieldCodeValueDTO; +import io.mosip.resident.dto.DynamicFieldConsolidateResponseDto; +import io.mosip.resident.dto.IdRepoResponseDto; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.JsonValue; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.mvel2.MVEL; +import org.mvel2.integration.VariableResolverFactory; +import org.mvel2.integration.impl.MapVariableResolverFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.time.chrono.Chronology; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static io.mosip.resident.constant.MappingJsonConstants.EMAIL; +import static io.mosip.resident.constant.MappingJsonConstants.PHONE; +import static io.mosip.resident.constant.RegistrationConstants.DATETIME_PATTERN; +import static io.mosip.resident.constant.ResidentConstants.IDENTITY; +import static io.mosip.resident.constant.ResidentConstants.LANGUAGE; +import static io.mosip.resident.constant.ResidentConstants.VALUE; +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * @author Girish Yarru + * @version 1.0 + */ + +@Component +public class Utility { + + private static final String MEDIUM = "MEDIUM"; + private static final String EVENT_ID_PLACEHOLDER = "{eventId}"; + private static final String MAPPING_ATTRIBUTE_SEPARATOR = ","; + private static final String ATTRIBUTE_VALUE_SEPARATOR = " "; + private static final Logger logger = LoggerConfiguration.logConfig(Utility.class); + private static final String RETRIEVE_IDENTITY_PARAM_TYPE_DEMO = "demo"; + private static final String DIGITAL_CARD_PARTNER = "digitalcardPartner"; + private static final String APP_ID_BASED_CREDENTIAL_ID_SUFFIX = "appIdBasedCredentialIdSuffix"; + + @Autowired + private ResidentServiceRestClient residentServiceRestClient; + + @Value("${config.server.file.storage.uri}") + private String configServerFileStorageURL; + + @Value("${registration.processor.identityjson}") + private String residentIdentityJson; + + @Value("${" + ResidentConstants.PREFERRED_LANG_PROPERTY + ":false}") + private boolean isPreferedLangFlagEnabled; + + @Value("${mosip.iam.userinfo_endpoint}") + private String usefInfoEndpointUrl; + + @Autowired + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Autowired + @Qualifier("restClientWithPlainRestTemplate") + private ResidentServiceRestClient restClientWithPlainRestTemplate; + + @Autowired + private ValidateTokenUtil tokenValidationHelper; + + @Autowired + private Environment env; + + @Autowired + private PDFGenerator pdfGenerator; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private Utilities utilities; + + @Autowired + private ObjectStoreHelper objectStoreHelper; + + @Autowired + @Qualifier("restClientWithSelfTOkenRestTemplate") + private ResidentServiceRestClient restClientWithSelfTOkenRestTemplate; + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + private static String regProcessorIdentityJson = ""; + + private static String ANONYMOUS_USER = "anonymousUser"; + + private static final String AUTHORIZATION = "Authorization"; + private static final String BEARER_PREFIX = "Bearer "; + + private String ridDelimeterValue; + + @Autowired(required = true) + @Qualifier("varres") + private VariableResolverFactory functionFactory; + + @Value("${resident.email.mask.function}") + private String emailMaskFunction; + + @Value("${resident.phone.mask.function}") + private String phoneMaskFunction; + + @Value("${resident.data.mask.function}") + private String maskingFunction; + + @Value("${resident.ui.track-service-request-url}") + private String trackServiceUrl; + + @Value("${mosip.resident.download-card.url}") + private String downloadCardUrl; + + @Value("${resident.date.time.replace.special.chars:{}}") + private String specialCharsReplacement; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + @Autowired + private ObjectMapper mapper; + + @Value("${resident.date.time.formmatting.style:" + MEDIUM + "}") + private String formattingStyle; + + private Map specialCharsReplacementMap; + + private JSONObject mappingJsonObject; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private NotificationService notificationService; + private List nameValueList; + + @Autowired + private ResidentConfigService residentConfigService; + + @PostConstruct + private void loadRegProcessorIdentityJson() { + regProcessorIdentityJson = residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); + logger.info(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), "loadRegProcessorIdentityJson completed successfully"); + try { + specialCharsReplacementMap = ((Map) mapper.readValue(specialCharsReplacement, Map.class)) + .entrySet() + .stream() + .collect(Collectors.toUnmodifiableMap(Entry::getKey, entry -> String.valueOf(entry.getValue()))); + } catch (JsonProcessingException e) { + logger.error("Error parsing special chars map used for replacement in timestamp in filename."); + specialCharsReplacementMap = Map.of(); + } + } + + public String getAuthTypeCodefromkey(String reqTypeCode) throws ResidentServiceCheckedException { + Map map = utilities.getAmrAcrMapping(); + String authTypeCode = map.get(reqTypeCode); + return authTypeCode; + } + + @SuppressWarnings("unchecked") + public JSONObject retrieveIdrepoJson(String id) throws ResidentServiceCheckedException { + logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, + "Utility::retrieveIdrepoJson()::entry"); + List pathsegments = new ArrayList<>(); + pathsegments.add(id); + ResponseWrapper response = null; + try { + response = (ResponseWrapper) residentServiceRestClient.getApi( + ApiName.IDREPOGETIDBYUIN, pathsegments, "", null, ResponseWrapper.class); + + } catch (ApisResourceAccessException e) { + if (e.getCause() instanceof HttpClientErrorException) { + HttpClientErrorException httpClientException = (HttpClientErrorException) e.getCause(); + throw new ResidentServiceCheckedException( + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpClientException.getResponseBodyAsString()); + + } else if (e.getCause() instanceof HttpServerErrorException) { + HttpServerErrorException httpServerException = (HttpServerErrorException) e.getCause(); + throw new ResidentServiceCheckedException( + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + httpServerException.getResponseBodyAsString()); + } else { + throw new ResidentServiceCheckedException( + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage() + e.getMessage(), e); + } + } + + return retrieveErrorCode(response, id); + } + + public JSONObject retrieveErrorCode(ResponseWrapper response, String id) + throws ResidentServiceCheckedException { + ResidentErrorCode errorCode; + errorCode = ResidentErrorCode.INVALID_ID; + try { + if (response == null) + throw new IdRepoAppException(errorCode.getErrorCode(), errorCode.getErrorMessage(), + "In valid response while requesting ID Repositary"); + if (!response.getErrors().isEmpty()) { + List error = response.getErrors(); + throw new IdRepoAppException(errorCode.getErrorCode(), errorCode.getErrorMessage(), + error.get(0).getMessage()); + } + + String jsonResponse = JsonUtil.writeValueAsString(response.getResponse()); + JSONObject json = JsonUtil.readValue(jsonResponse, JSONObject.class); + logger.debug(LoggerFileConstant.APPLICATIONID.toString(), LoggerFileConstant.UIN.name(), id, + "Utility::retrieveIdrepoJson()::exit"); + return JsonUtil.getJSONObject(json, "identity"); + } catch (IOException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), + ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } + } + + @SuppressWarnings("rawtypes") + public Map getMailingAttributes(String id, Set templateLangauges, Map demographicIdentity, Map mapperIdentity) + throws ResidentServiceCheckedException { + logger.debug("Utility::getMailingAttributes()::entry"); + if (id == null || id.isEmpty()) { + throw new ResidentServiceException(ResidentErrorCode.UNABLE_TO_PROCESS.getErrorCode(), + ResidentErrorCode.UNABLE_TO_PROCESS.getErrorMessage() + ": individual_id is not available."); + } + + return getMailingAttributesFromIdentity(templateLangauges, demographicIdentity, mapperIdentity); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + public Map getMailingAttributesFromIdentity(Set templateLangauges, Map demographicIdentity, Map mapperIdentity) + throws ResidentServiceCheckedException { + Map attributes = new HashMap<>(); + + Set mapperJsonKeys = mapperIdentity.keySet(); + + for (String key : mapperJsonKeys) { + Object mapperValueObj = mapperIdentity.get(key); + if (mapperValueObj instanceof Map) { + Map mapperValueMap = (Map) mapperValueObj; + String mappingValueStr = mapperValueMap.get(VALUE); + for (String mappingValue : mappingValueStr.split(",")) { + Object identityNodeObj = demographicIdentity.get(mappingValue); + if (identityNodeObj instanceof ArrayList) { + List identityValueList = (List) identityNodeObj; + for (Object identityValue : identityValueList) { + if(identityValue instanceof String){ + continue; + } + JsonValue jsonValue = mapper.convertValue(identityValue, JsonValue.class); + if (templateLangauges.contains(jsonValue.getLanguage())) { + attributes.put(mappingValue + "_" + jsonValue.getLanguage(), jsonValue.getValue()); + } + } + } else if (identityNodeObj instanceof LinkedHashMap) { + Map json = (Map) identityNodeObj; + attributes.put(mappingValue, (String) json.get(VALUE)); + } else { + attributes.put(mappingValue, identityNodeObj == null ? null : String.valueOf(identityNodeObj)); + } + } + } + } + logger.debug("Utility::getMailingAttributes()::exit"); + return attributes; + } + + @Cacheable(value = "getPreferredLanguage", key = "#demographicIdentity") + public Set getPreferredLanguage(Map demographicIdentity) { + String preferredLang = null; + String preferredLangAttribute = env.getProperty("mosip.default.user-preferred-language-attribute"); + if (!StringUtils.isBlank(preferredLangAttribute)) { + Object object = demographicIdentity.get(preferredLangAttribute); + if (object != null) { + preferredLang = String.valueOf(object); + if (preferredLang.contains(ResidentConstants.COMMA)) { + String[] preferredLangArray = preferredLang.split(ResidentConstants.COMMA); + return Stream.of(preferredLangArray) + .map(lang -> getPreferredLanguageCodeForLanguageNameBasedOnFlag(preferredLangAttribute, lang)) + .collect(Collectors.toSet()); + } + } + } + if (preferredLang != null) { + String preferredLanguage = getPreferredLanguageCodeForLanguageNameBasedOnFlag(preferredLangAttribute, preferredLang); + if (preferredLanguage == null || preferredLanguage.isEmpty()) { + return Set.of(); + } + return Set.of(preferredLanguage); + } + return Set.of(); + } + + public String getPreferredLanguageCodeForLanguageNameBasedOnFlag(String fieldName, String preferredLang) { + if (isPreferedLangFlagEnabled) { + try { + ResponseWrapper responseWrapper = (ResponseWrapper) + utilities.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, + env.getProperty(ResidentConstants.MANDATORY_LANGUAGE), true); + DynamicFieldConsolidateResponseDto dynamicFieldConsolidateResponseDto = mapper.readValue( + mapper.writeValueAsString(responseWrapper.getResponse()), + DynamicFieldConsolidateResponseDto.class); + return dynamicFieldConsolidateResponseDto.getValues() + .stream() + .filter(dynamicFieldCodeValueDTO -> preferredLang.equalsIgnoreCase(dynamicFieldCodeValueDTO.getValue())) + .findAny() + .map(DynamicFieldCodeValueDTO::getCode) + .orElse(null); + } catch (ResidentServiceCheckedException e) { + throw new RuntimeException(e); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + return preferredLang; + + } + + public Set getDataCapturedLanguages(Map mapperIdentity, Map demographicIdentity) + throws ReflectiveOperationException { + Set dataCapturedLangauges = new HashSet(); + Object nameValue = mapperIdentity.get(MappingJsonConstants.NAME); + if (nameValue instanceof Map) { + Map jsonObject = (Map) nameValue; + String values = String.valueOf(jsonObject.get(VALUE)); + for (String value : values.split(",")) { + Object object = demographicIdentity.get(value); + if (object instanceof List) { + List nodes = (List) object; + for (Object jsonValueObj : nodes) { + JsonValue jsonValue = mapper.convertValue(jsonValueObj, JsonValue.class); + dataCapturedLangauges.add(jsonValue.getLanguage()); + } + } + } + } + return dataCapturedLangauges; + } + + public List getDefaultTemplateLanguages() { + String defaultLanguages = env.getProperty("mosip.default.template-languages"); + List strList = Collections.emptyList(); + if (defaultLanguages != null && !StringUtils.isBlank(defaultLanguages)) { + String[] lanaguages = defaultLanguages.split(","); + if (lanaguages != null && lanaguages.length > 0) { + strList = Lists.newArrayList(lanaguages); + } + return strList; + } + return strList; + } + + public String getMappingJson() { + if (StringUtils.isBlank(regProcessorIdentityJson)) { + return residentRestTemplate.getForObject(configServerFileStorageURL + residentIdentityJson, String.class); + } + return regProcessorIdentityJson; + } + + /** + * Read resource content. + * + * @param resFile the res file + * @return the string + */ + public static String readResourceContent(Resource resFile) { + try { + return IOUtils.readInputStreamToString(resFile.getInputStream(), UTF_8); + } catch (IOException e) { + logger.error(e.getMessage()); + throw new ResidentServiceException(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION, e); + } + } + + + public String maskData(Object object, String maskingFunctionName) { + Map context = new HashMap(); + context.put(VALUE, String.valueOf(object)); + VariableResolverFactory myVarFactory = new MapVariableResolverFactory(context); + myVarFactory.setNextFactory(functionFactory); + Serializable serializable = MVEL.compileExpression(maskingFunctionName + "(value);"); + String formattedObject = MVEL.executeExpression(serializable, context, myVarFactory, String.class); + return formattedObject; + } + + public String maskEmail(String email) { + return maskData(email, emailMaskFunction); + } + + public String maskPhone(String phone) { + return maskData(phone, phoneMaskFunction); + } + + public String convertToMaskData(String maskData) { + return maskData(maskData, maskingFunction); + } + + public String getPassword(List attributeValues) { + Map> context = new HashMap<>(); + context.put("attributeValues", attributeValues); + VariableResolverFactory myVarFactory = new MapVariableResolverFactory(context); + myVarFactory.setNextFactory(functionFactory); + String maskingFunctionName = this.env.getProperty(ResidentConstants.CREATE_PASSWORD_METHOD_NAME); + Serializable serializable = MVEL.compileExpression(maskingFunctionName + "(attributeValues);"); + return MVEL.executeExpression(serializable, context, myVarFactory, String.class); + } + + public ResidentTransactionEntity createEntity(RequestType requestType) { + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setRequestDtimes(DateUtils.getUTCCurrentDateTime()); + residentTransactionEntity.setResponseDtime(DateUtils.getUTCCurrentDateTime()); + residentTransactionEntity.setCrBy(getSessionUserName()); + residentTransactionEntity.setCrDtimes(DateUtils.getUTCCurrentDateTime()); + // Initialize with true, so that it is updated as false in later when needed for notification + if (ServiceType.ASYNC.getRequestTypes().contains(requestType)) { + residentTransactionEntity.setReadStatus(false); + } else { + residentTransactionEntity.setReadStatus(true); + } + residentTransactionEntity.setRequestTypeCode(requestType.name()); + return residentTransactionEntity; + } + + public String createEventId() { + /* return a random long of 16 length */ + long smallest = 1000_0000_0000_0000L; + long biggest = 9999_9999_9999_9999L; + + // return a long between smallest and biggest (+1 to include biggest as well with the upper bound) + long random = utilities.getSecureRandom().longs(smallest, biggest + 1).findFirst().getAsLong(); + return String.valueOf(random); + } + + + public static boolean isSecureSession() { + return Optional.ofNullable(SecurityContextHolder.getContext()).map(SecurityContext::getAuthentication).map(Authentication::getPrincipal).filter(obj -> !obj.equals(ANONYMOUS_USER)).isPresent(); + } + + public String createTrackServiceRequestLink(String eventId) { + return trackServiceUrl + eventId; + } + + public String createDownloadCardLinkFromEventId(ResidentTransactionEntity residentTransactionEntity) { + if (residentTransactionEntity.getReferenceLink() != null + && !residentTransactionEntity.getReferenceLink().isEmpty()) { + return downloadCardUrl.replace(EVENT_ID_PLACEHOLDER, residentTransactionEntity.getEventId()); + } + return ResidentConstants.NOT_AVAILABLE; + } + + public String getPDFHeaderLogo() { + return env.getProperty(ResidentConstants.MOSIP_PDF_HEADER_LOGO_URL); + } + + public byte[] signPdf(InputStream in, String password) { + logger.debug("UinCardGeneratorImpl::generateUinCard()::entry"); + byte[] pdfSignatured = null; + try { + ByteArrayOutputStream pdfValue = (ByteArrayOutputStream) pdfGenerator.generate(in); + PDFSignatureRequestDto request = new PDFSignatureRequestDto( + Integer.parseInt(Objects.requireNonNull(env.getProperty(ResidentConstants.LOWER_LEFT_X))), + Integer.parseInt(Objects.requireNonNull(env.getProperty(ResidentConstants.LOWER_LEFT_Y))), + Integer.parseInt(Objects.requireNonNull(env.getProperty(ResidentConstants.UPPER_RIGHT_X))), + Integer.parseInt(Objects.requireNonNull(env.getProperty(ResidentConstants.UPPER_RIGHT_Y))), + env.getProperty(ResidentConstants.REASON), utilities.getTotalNumberOfPageInPdf(pdfValue), password); + request.setApplicationId(env.getProperty(ResidentConstants.SIGN_PDF_APPLICATION_ID)); + request.setReferenceId(env.getProperty(ResidentConstants.SIGN_PDF_REFERENCE_ID)); + request.setData(Base64.encodeBase64String(pdfValue.toByteArray())); + DateTimeFormatter format = DateTimeFormatter.ofPattern(Objects.requireNonNull(env.getProperty(DATETIME_PATTERN))); + LocalDateTime localdatetime = LocalDateTime + .parse(DateUtils.getUTCCurrentDateTimeString(Objects.requireNonNull(env.getProperty(DATETIME_PATTERN))), format); + + request.setTimeStamp(DateUtils.getUTCCurrentDateTimeString()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + + requestWrapper.setRequest(request); + requestWrapper.setRequesttime(localdatetime); + ResponseWrapper responseWrapper; + SignatureResponseDto signatureResponseDto; + + responseWrapper = residentServiceRestClient.postApi(env.getProperty(ApiName.PDFSIGN.name()) + , MediaType.APPLICATION_JSON, requestWrapper, ResponseWrapper.class); + + if (responseWrapper.getErrors() != null && !responseWrapper.getErrors().isEmpty()) { + ServiceError error = responseWrapper.getErrors().get(0); + throw new ResidentServiceException(ResidentErrorCode.valueOf(error.getMessage())); + } + String signatureData = objectMapper.writeValueAsString(responseWrapper.getResponse()); + signatureResponseDto = objectMapper.readValue(signatureData, + SignatureResponseDto.class); + + pdfSignatured = Base64.decodeBase64(signatureResponseDto.getData()); + + } catch (Exception e) { + logger.error(io.mosip.kernel.pdfgenerator.itext.constant.PDFGeneratorExceptionCodeConstant.PDF_EXCEPTION.getErrorMessage(), e.getMessage() + + ExceptionUtils.getStackTrace(e)); + } + logger.debug("UinCardGeneratorImpl::generateUinCard()::exit"); + + return pdfSignatured; + } + + public String getFileName(String eventId, String propertyName, int timeZoneOffset, String locale) { + if (eventId != null && propertyName.contains("{" + TemplateVariablesConstants.EVENT_ID + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.EVENT_ID + "}", eventId); + } + if (propertyName.contains("{" + TemplateVariablesConstants.TIMESTAMP + "}")) { + String dateTimeFormat = formatWithOffsetForFileName(timeZoneOffset, locale, DateUtils.getUTCCurrentDateTime()); + propertyName = propertyName.replace("{" + TemplateVariablesConstants.TIMESTAMP + "}", dateTimeFormat); + } + return propertyName; + } + + public String getFileNameForId(String id, String propertyName, int timeZoneOffset, String locale) { + if (id != null && propertyName.contains("{" + TemplateVariablesConstants.ID + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.ID + "}", id); + } + if (propertyName.contains("{" + TemplateVariablesConstants.TIMESTAMP + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.TIMESTAMP + "}", formatWithOffsetForFileName(timeZoneOffset, locale, DateUtils.getUTCCurrentDateTime())); + } + return propertyName; + } + + private String replaceSpecialChars(String fileName) { + if (!specialCharsReplacementMap.isEmpty()) { + StringBuilder stringBuilder = new StringBuilder(fileName); + specialCharsReplacementMap.entrySet().forEach(entry -> { + String key = entry.getKey(); + String value = entry.getValue(); + int index; + while ((index = stringBuilder.indexOf(key)) != -1) { + stringBuilder.replace(index, index + key.length(), value); + } + }); + return stringBuilder.toString(); + } + return fileName; + } + + public String getIdForResidentTransaction(List channel, IdentityDTO identityDTO, String idaToken) throws ResidentServiceCheckedException, NoSuchAlgorithmException { + String email = ""; + String phone = ""; + if (identityDTO != null) { + email = identityDTO.getEmail(); + phone = identityDTO.getPhone(); + } + String id; + if (email != null && phone != null && channel.size() == 2) { + id = email + phone + idaToken; + } else if (email != null && channel.size() == 1 && channel.get(0).equalsIgnoreCase(EMAIL)) { + id = email + idaToken; + } else if (phone != null && channel.size() == 1 && channel.get(0).equalsIgnoreCase(PHONE)) { + id = phone + idaToken; + } else { + throw new ResidentServiceCheckedException(ResidentErrorCode.NO_CHANNEL_IN_IDENTITY); + } + return getRefIdHash(id); + } + + public String getFileNameAck(String featureName, String eventId, String propertyName, int timeZoneOffset, String locale) { + if (eventId != null && propertyName.contains("{" + TemplateVariablesConstants.FEATURE_NAME + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.FEATURE_NAME + "}", featureName); + } + if (eventId != null && propertyName.contains("{" + TemplateVariablesConstants.EVENT_ID + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.EVENT_ID + "}", eventId); + } + if (propertyName.contains("{" + TemplateVariablesConstants.TIMESTAMP + "}")) { + propertyName = propertyName.replace("{" + TemplateVariablesConstants.TIMESTAMP + "}", + formatWithOffsetForFileName(timeZoneOffset, locale, DateUtils.getUTCCurrentDateTime())); + } + return propertyName; + } + + public String getFileNameAsPerFeatureName(String eventId, RequestType requestType, int timeZoneOffset, String locale) { + String namingProperty = requestType.getNamingProperty(); + if (namingProperty == null) { + namingProperty = ResidentConstants.ACK_NAMING_CONVENTION_PROPERTY; + } + return getFileNameAck(requestType.getName(), eventId, Objects.requireNonNull(this.env.getProperty(namingProperty)), + timeZoneOffset, locale); + } + + public String getRefIdHash(String individualId) throws NoSuchAlgorithmException { + return HMACUtils2.digestAsPlainText(individualId.getBytes()); + } + + private String formatDateTimeForPattern(LocalDateTime localDateTime, String locale, String defaultDateTimePattern, int timeZoneOffset) { + return localDateTime == null ? null : formatToLocaleDateTime(locale, defaultDateTimePattern, localDateTime); + } + + public String formatWithOffsetForUI(int timeZoneOffset, String locale, LocalDateTime localDateTime) { + return formatDateTimeForPattern(applyTimeZoneOffsetOnDateTime(timeZoneOffset, localDateTime), locale, Objects.requireNonNull(env.getProperty(ResidentConstants.UI_DATE_TIME_PATTERN_DEFAULT)), timeZoneOffset); + } + + public String formatWithOffsetForFileName(int timeZoneOffset, String locale, LocalDateTime localDateTime) { + return replaceSpecialChars(formatDateTimeForPattern(applyTimeZoneOffsetOnDateTime(timeZoneOffset, localDateTime), locale, Objects.requireNonNull(env.getProperty(ResidentConstants.FILENAME_DATETIME_PATTERN_DEFAULT)), timeZoneOffset)); + } + + public LocalDateTime applyTimeZoneOffsetOnDateTime(int timeZoneOffset, LocalDateTime localDateTime) { + return localDateTime == null ? null : localDateTime.minusMinutes(timeZoneOffset); //Converting UTC to local time zone + } + + private String formatToLocaleDateTime(String localeStr, String defaultDateTimePattern, LocalDateTime localDateTime) { + Locale locale = null; + if (localeStr != null && !localeStr.isEmpty()) { + String[] localeElements = localeStr.replace('-', '_').split("_"); + if (localeElements.length == 1) { + locale = new Locale.Builder().setLanguage(localeElements[0].toLowerCase()).build(); + } else if (localeElements.length >= 2) { + locale = new Locale.Builder().setLanguage(localeElements[0]).setRegion(localeElements[1].toUpperCase()) + .build(); + } + } + + if (locale == null && defaultDateTimePattern == null) { + locale = Locale.getDefault(); + } + + if (locale != null) { + Chronology chronology = Chronology.ofLocale(locale); + DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.valueOf(formattingStyle)).withLocale(locale).withChronology(chronology); + String dateTime = localDateTime.format(formatter); + return dateTime; + } else { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(defaultDateTimePattern); + String dateTime = localDateTime.format(formatter); + return dateTime; + } + } + + public String getClientIp(HttpServletRequest req) { + logger.debug("Utilitiy::getClientIp()::entry"); + String[] IP_HEADERS = { + ResidentConstants.X_FORWARDED_FOR, + ResidentConstants.X_REAL_IP, + ResidentConstants.PROXY_CLIENT_IP, + ResidentConstants.WL_PROXY_CLIENT_IP, + ResidentConstants.HTTP_X_FORWARDED_FOR, + ResidentConstants.HTTP_X_FORWARDED, + ResidentConstants.HTTP_X_CLUSTER_CLIENT_IP, + ResidentConstants.HTTP_CLIENT_IP, + ResidentConstants.HTTP_FORWARDED_FOR, + ResidentConstants.HTTP_FORWARDED, + ResidentConstants.HTTP_VIA, + ResidentConstants.REMOTE_ADDR + }; + for (String header : IP_HEADERS) { + String value = req.getHeader(header); + if (value == null || value.isEmpty()) { + continue; + } + String[] parts = value.split(","); + logger.debug("Utilitiy::getClientIp()::exit"); + return parts[0].trim(); + } + logger.debug("Utilitiy::getClientIp()::exit - excecuted till end"); + return req.getRemoteAddr(); + } + + public String getCardOrderTrackingId(String transactionId, String individualId) + throws ResidentServiceCheckedException, ApisResourceAccessException { + Object object = residentServiceRestClient.getApi(ApiName.GET_ORDER_STATUS_URL, RequestType.getAllNewOrInprogressStatusList(env), + List.of(TemplateVariablesConstants.TRANSACTION_ID, TemplateVariablesConstants.INDIVIDUAL_ID), + List.of(transactionId, individualId), ResponseWrapper.class); + ResponseWrapper> responseWrapper = JsonUtil.convertValue(object, + new TypeReference>>() { + }); + if (Objects.nonNull(responseWrapper.getErrors()) && !responseWrapper.getErrors().isEmpty()) { + logger.error("ORDER_STATUS_URL returned error " + responseWrapper.getErrors()); + throw new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION); + } + return responseWrapper.getResponse().get(TemplateVariablesConstants.TRACKING_ID); + } + + public String getSessionUserName() { + String name = null; + try { + name = identityService.getAvailableclaimValue(this.env.getProperty(ResidentConstants.NAME_FROM_PROFILE)); + if (name == null || name.trim().isEmpty()) { + name = ResidentConstants.UNKNOWN; + } + } catch (ApisResourceAccessException e) { + throw new RuntimeException(e); + } + return name; + } + + @Cacheable(value = "userInfoCache", key = "#token") + public Map getUserInfo(String token) throws ApisResourceAccessException { + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(usefInfoEndpointUrl); + UriComponents uriComponent = builder.build(false).encode(); + + Map responseMap; + try { + MultiValueMap headers = + new LinkedMultiValueMap(Map.of(AUTHORIZATION, List.of(BEARER_PREFIX + token))); + String responseStr = restClientWithPlainRestTemplate.getApi(uriComponent.toUri(), String.class, headers); + responseMap = (Map) decodeAndDecryptUserInfo(responseStr); + } catch (ApisResourceAccessException e) { + throw e; + } catch (Exception e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.USERID.toString(), "NA", + "IdAuthServiceImp::lencryptRSA():: ENCRYPTIONSERVICE GET service call" + + ExceptionUtils.getStackTrace(e)); + throw new ApisResourceAccessException("Could not fetch public key from kernel keymanager", e); + } + return responseMap; + } + + private Map decodeAndDecryptUserInfo(String userInfoResponseStr) throws JsonParseException, JsonMappingException, UnsupportedEncodingException, IOException { + String userInfoStr; + if (Boolean.parseBoolean(this.env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_SIGNED))) { + DecodedJWT decodedJWT = JWT.decode(userInfoResponseStr); + if (Boolean.parseBoolean(this.env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_VERIFY_ENABLED))) { + ImmutablePair verifySignagure = tokenValidationHelper + .verifyJWTSignagure(decodedJWT); + if (verifySignagure.left) { + userInfoStr = decodeString(getPayload(decodedJWT)); + } else { + throw new ResidentServiceException(ResidentErrorCode.CLAIM_NOT_AVAILABLE, + String.format(ResidentErrorCode.CLAIM_NOT_AVAILABLE.getErrorMessage(), + String.format("User info signature validation failed. Error: %s: %s", + verifySignagure.getRight().getErrorCode(), + verifySignagure.getRight().getErrorMessage()))); + } + } else { + userInfoStr = decodeString(getPayload(decodedJWT)); + } + } else { + userInfoStr = userInfoResponseStr; + } + if (Boolean.parseBoolean(this.env.getProperty(ResidentConstants.MOSIP_OIDC_ENCRYPTION_ENABLED))) { + userInfoStr = decodeString(decryptPayload((String) userInfoStr)); + } + return objectMapper.readValue(userInfoStr.getBytes(UTF_8), Map.class); + } + + public String decodeString(String payload) { + byte[] bytes = java.util.Base64.getUrlDecoder().decode(payload); + return new String(bytes, UTF_8); + } + + private String getPayload(DecodedJWT decodedJWT) { + return decodedJWT.getPayload(); + } + + public String decryptPayload(String payload) { + return objectStoreHelper.decryptData(payload, this.env.getProperty(ResidentConstants.RESIDENT_APP_ID), + this.env.getProperty(ResidentConstants.IDP_REFERENCE_ID)); + } + + @CacheEvict(value = "userInfoCache", key = "#token") + public void clearUserInfoCache(String token) { + logger.info("Clearing User Info cache"); + } + + public JSONObject getMappingJsonObject() throws ResidentServiceCheckedException { + if (mappingJsonObject != null) { + return mappingJsonObject; + } + + String mappingJsonString = getMappingJson(); + if (mappingJsonString == null || mappingJsonString.trim().isEmpty()) { + throw new ResidentServiceException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), + ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorMessage()); + } + try { + mappingJsonObject = JsonUtil.readValue(mappingJsonString, JSONObject.class); + } catch (IOException e) { + throw new ResidentServiceCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), + ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } + return mappingJsonObject; + } + + public String getMappingValue(Map identity, String mappingName) + throws ResidentServiceCheckedException, IOException { + return getMappingValue(identity, mappingName, null); + } + + public String getMappingValue(Map identity, String mappingName, String langCode) + throws ResidentServiceCheckedException, IOException { + String mappingJson = getMappingJson(); + if (mappingJson == null || mappingJson.trim().isEmpty()) { + throw new ResidentServiceCheckedException(ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorCode(), + ResidentErrorCode.JSON_PROCESSING_EXCEPTION.getErrorMessage()); + } + JSONObject mappingJsonObject = JsonUtil.readValue(mappingJson, JSONObject.class); + JSONObject identityMappingJsonObject = JsonUtil.getJSONObject(mappingJsonObject, IDENTITY); + String mappingAttributes = getMappingAttribute(identityMappingJsonObject, mappingName); + + return Stream.of(mappingAttributes.split(MAPPING_ATTRIBUTE_SEPARATOR)) + .map(mappingAttribute -> { + Object value = identity.get(mappingAttribute); + if (value == null && langCode != null) { + value = identity.get(mappingAttribute + "_" + langCode); + } + return value; + }) + .map(attributeValue -> { + if (attributeValue instanceof String) { + return (String) attributeValue; + } else if (attributeValue instanceof List) { + if (langCode == null) { + return null; + } else { + return getValueForLang((List>) attributeValue, langCode); + } + } else if (attributeValue instanceof Map) { + return ((String) ((Map) attributeValue).get(VALUE)); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.joining(ATTRIBUTE_VALUE_SEPARATOR)); + } + + private String getValueForLang(List> attributeValue, String langCode) { + return attributeValue.stream() + .filter(map -> map.get(LANGUAGE) instanceof String && ((String) map.get(LANGUAGE)).equalsIgnoreCase(langCode)) + .map(map -> (String) map.get(VALUE)) + .findAny() + .orElse(null); + } + + private String getMappingAttribute(JSONObject identityJson, String name) { + JSONObject docJson = JsonUtil.getJSONObject(identityJson, name); + if (docJson != null) { + return JsonUtil.getJSONValue(docJson, VALUE); + } + return name; + } + + @Cacheable(value = "identityMapCache", key = "#accessToken") + public T getCachedIdentityData(String id, String accessToken, Class responseType) throws ApisResourceAccessException { + return getIdentityData(id, responseType); + } + + public T getIdentityData(String id, Class responseType) throws ApisResourceAccessException { + Map pathSegments = new HashMap(); + pathSegments.put("id", id); + + List queryParamName = new ArrayList(); + queryParamName.add("type"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add(RETRIEVE_IDENTITY_PARAM_TYPE_DEMO); + return restClientWithSelfTOkenRestTemplate.getApi(ApiName.IDREPO_IDENTITY_URL, + pathSegments, queryParamName, queryParamValue, responseType); + } + + @CacheEvict(value = "identityMapCache", key = "#accessToken") + public void clearIdentityMapCache(String accessToken) { + logger.info("Clearing Identity Map cache IdResponseDto1"); + } + + @Cacheable(value = "partnerListCache", key = "#partnerType + '_' + #apiUrl") + public ResponseWrapper getPartnersByPartnerType(String partnerType, ApiName apiUrl) throws ResidentServiceCheckedException { + return proxyPartnerManagementService.getPartnersByPartnerType(StringUtils.isBlank(partnerType) ? Optional.empty() : Optional.of(partnerType), apiUrl); + } + + @CacheEvict(value = "partnerListCache", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.partnerCache}") + public void emptyPartnerListCache() { + logger.info("Emptying Partner list cache"); + } + + @CacheEvict(value = "partnerDetailCache", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.partnerCache}") + public void emptyPartnerDetailCache() { + logger.info("Emptying Partner detail cache"); + } + + @Cacheable(value = "getValidDocumentByLangCode", key = "#langCode") + public ResponseWrapper getValidDocumentByLangCode(String langCode) throws ResidentServiceCheckedException { + return proxyMasterdataService.getValidDocumentByLangCode(langCode); + } + + @CacheEvict(value = "getValidDocumentByLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getValidDocumentByLangCode}") + public void emptyGetValidDocumentByLangCodeCache() { + logger.info("Emptying getValidDocumentByLangCode cache"); + } + + @CacheEvict(value = "getLocationHierarchyLevelByLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getLocationHierarchyLevelByLangCode}") + public void emptyGetLocationHierarchyLevelByLangCodeCache() { + logger.info("Emptying getLocationHierarchyLevelByLangCode cache"); + } + + @CacheEvict(value = "getImmediateChildrenByLocCodeAndLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getImmediateChildrenByLocCodeAndLangCode}") + public void emptyGetImmediateChildrenByLocCodeAndLangCodeCache() { + logger.info("Emptying getImmediateChildrenByLocCodeAndLangCode cache"); + } + + @CacheEvict(value = "getLocationDetailsByLocCodeAndLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getLocationDetailsByLocCodeAndLangCode}") + public void emptyGetLocationDetailsByLocCodeAndLangCodeCache() { + logger.info("Emptying getLocationDetailsByLocCodeAndLangCode cache"); + } + + @CacheEvict(value = "getCoordinateSpecificRegistrationCenters", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getCoordinateSpecificRegistrationCenters}") + public void emptyGetCoordinateSpecificRegistrationCentersCache() { + logger.info("Emptying getCoordinateSpecificRegistrationCenters cache"); + } + + @CacheEvict(value = "getApplicantValidDocument", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getApplicantValidDocument}") + public void emptyGetApplicantValidDocumentCache() { + logger.info("Emptying getApplicantValidDocument cache"); + } + + @CacheEvict(value = "getRegistrationCentersByHierarchyLevel", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getRegistrationCentersByHierarchyLevel}") + public void emptyGetRegistrationCentersByHierarchyLevelCache() { + logger.info("Emptying getRegistrationCentersByHierarchyLevel cache"); + } + + @CacheEvict(value = "getRegistrationCenterByHierarchyLevelAndTextPaginated", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getRegistrationCenterByHierarchyLevelAndTextPaginated}") + public void emptyGetRegistrationCenterByHierarchyLevelAndTextPaginatedCache() { + logger.info("Emptying getRegistrationCenterByHierarchyLevelAndTextPaginated cache"); + } + + @CacheEvict(value = "getRegistrationCenterWorkingDays", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getRegistrationCenterWorkingDays}") + public void emptyGetRegistrationCenterWorkingDaysCache() { + logger.info("Emptying getRegistrationCenterWorkingDays cache"); + } + + @CacheEvict(value = "getLatestIdSchema", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getLatestIdSchema}") + public void emptyGetLatestIdSchemaCache() { + logger.info("Emptying getLatestIdSchema cache"); + } + + @CacheEvict(value = "getGenderCodeByGenderTypeAndLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getGenderCodeByGenderTypeAndLangCode}") + public void emptyGetGenderCodeByGenderTypeAndLangCodeCache() { + logger.info("Emptying getGenderCodeByGenderTypeAndLangCode cache"); + } + + @CacheEvict(value = "getDocumentTypesByDocumentCategoryAndLangCode", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getDocumentTypesByDocumentCategoryAndLangCode}") + public void emptyGetDocumentTypesByDocumentCategoryAndLangCodeCache() { + logger.info("Emptying getDocumentTypesByDocumentCategoryAndLangCode cache"); + } + + @CacheEvict(value = "getDynamicFieldBasedOnLangCodeAndFieldName", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getDynamicFieldBasedOnLangCodeAndFieldName}") + public void emptyGetDynamicFieldBasedOnLangCodeAndFieldNameCache() { + logger.info("Emptying getDynamicFieldBasedOnLangCodeAndFieldName cache"); + } + + @Cacheable(value = "getCenterDetails", key = "{#centerId, #langCode}") + public ResponseWrapper getCenterDetails(String centerId, String langCode) throws ApisResourceAccessException { + List pathSegments = new ArrayList<>(); + pathSegments.add(centerId); + pathSegments.add(langCode); + return (ResponseWrapper) residentServiceRestClient.getApi(ApiName.CENTERDETAILS, pathSegments, "", + "", ResponseWrapper.class); + } + + @CacheEvict(value = "getCenterDetails", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getCenterDetails}") + public void emptyGetCenterDetailsCache() { + logger.info("Emptying getCenterDetails cache"); + } + + @CacheEvict(value = "getLocationHierarchyLevels", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getLocationHierarchyLevels}") + public void emptyGetLocationHierarchyLevels() { + logger.info("Emptying getLocationHierarchyLevels cache"); + } + + @CacheEvict(value = "getAllDynamicFieldByName", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getAllDynamicFieldByName}") + public void emptyGetAllDynamicFieldByName() { + logger.info("Emptying getAllDynamicFieldByName cache"); + } + + public void updateEntity(String statusCode, String requestSummary, boolean readStatus, String statusComment, ResidentTransactionEntity residentTransactionEntity) { + residentTransactionEntity.setStatusCode(statusCode); + residentTransactionEntity.setRequestSummary(requestSummary); + residentTransactionEntity.setReadStatus(readStatus); + residentTransactionEntity.setStatusComment(statusComment); + residentTransactionEntity.setUpdBy(ResidentConstants.RESIDENT); + residentTransactionEntity.setUpdDtimes(DateUtils.getUTCCurrentDateTime()); + saveEntity(residentTransactionEntity); + } + + public void saveEntity(ResidentTransactionEntity residentTransactionEntity) { + residentTransactionRepository.save(residentTransactionEntity); + } + + public void sendNotification(String eventId, String individualId, TemplateType templateType) { + try { + NotificationRequestDtoV2 notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setTemplateType(templateType); + notificationRequestDtoV2.setRequestType(RequestType.UPDATE_MY_UIN); + notificationRequestDtoV2.setEventId(eventId); + notificationRequestDtoV2.setId(individualId); + notificationService.sendNotification(notificationRequestDtoV2, null); + }catch (ResidentServiceCheckedException exception){ + logger.error("Error while sending notification:- "+ exception); + } + } + + @PostConstruct + public String getRidDeliMeterValue() throws ResidentServiceCheckedException { + if (Objects.isNull(ridDelimeterValue)) { + try { + JsonNode policyJson = mapper.readValue(new URL(Objects.requireNonNull(env.getProperty( + ResidentConstants.REG_PROC_CREDENTIAL_PARTNER_POLICY_URL))), JsonNode.class); + JsonNode partnersArray = policyJson.get(ResidentConstants.PARTNERS); + + for (JsonNode partner : partnersArray) { + if (DIGITAL_CARD_PARTNER.equals(partner.get(RegistrationConstants.ID).asText())) { + ridDelimeterValue = partner.get(APP_ID_BASED_CREDENTIAL_ID_SUFFIX).asText(); + break; + } + } + + } catch (IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "getRidDeliMeterValue", + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(ResidentErrorCode.POLICY_EXCEPTION.getErrorCode(), + ResidentErrorCode.POLICY_EXCEPTION.getErrorMessage(), e); + } + } + return ridDelimeterValue; + } + + @CacheEvict(value = "getNameValueFromIdentityMapping", allEntries = true) + @Scheduled(fixedRateString = "${resident.cache.expiry.time.millisec.getNameValueFromIdentityMapping}") + public void emptyGetNameValueFromIdentityMappingCache() { + logger.info("Emptying getNameValueFromIdentityMapping cache"); + } + + @Cacheable(value = "getNameValueFromIdentityMapping") + public List getNameValueFromIdentityMapping() throws ResidentServiceCheckedException { + if (Objects.isNull(nameValueList)) { + try { + Map identityMappingMap = residentConfigService.getIdentityMappingMap(); + Map nameMap = (Map) identityMappingMap.get(ResidentConstants.NAME); + String nameValue = (String) nameMap.get(VALUE); + + if(nameValue.contains(ResidentConstants.COMMA)){ + nameValueList = List.of(nameValue.split(ResidentConstants.COMMA)); + } else{ + nameValueList = List.of(nameValue); + } + } catch (IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.REGISTRATIONID.toString(), + "getNameValueFromIdentityMapping", + ResidentErrorCode.API_RESOURCE_UNAVAILABLE.getErrorCode() + ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceCheckedException(ResidentErrorCode.POLICY_EXCEPTION.getErrorCode(), + ResidentErrorCode.POLICY_EXCEPTION.getErrorMessage(), e); + } + } + return nameValueList; + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/validator/DocumentValidator.java b/resident/resident-service/src/main/java/io/mosip/resident/validator/DocumentValidator.java new file mode 100644 index 00000000000..6da89bf6270 --- /dev/null +++ b/resident/resident-service/src/main/java/io/mosip/resident/validator/DocumentValidator.java @@ -0,0 +1,176 @@ +package io.mosip.resident.validator; + +import static io.mosip.resident.constant.ResidentConstants.ALLOWED_FILE_TYPE; +import static io.mosip.resident.constant.ResidentErrorCode.DOCUMENT_FILE_SIZE; +import static io.mosip.resident.constant.ResidentErrorCode.UN_SUPPORTED_FILE_TYPE; +import static io.mosip.resident.constant.ResidentErrorCode.VIRUS_SCAN_FAILED; +import static io.mosip.resident.constant.ResidentErrorCode.VIRUS_SCAN; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Objects; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; +import org.springframework.web.multipart.MultipartFile; + +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.kernel.core.virusscanner.exception.VirusScannerException; +import io.mosip.kernel.core.virusscanner.spi.VirusScanner; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyMasterdataService; +/** + * It validates the request and scans the file for viruses + * + * @author Manoj SP + */ +@Component +public class DocumentValidator implements Validator { + + private static final String DOC_TYP_CODE = "docTypCode"; + + private static final String DOC_CAT_CODE = "docCatCode"; + + private static final Logger logger = LoggerConfiguration.logConfig(DocumentValidator.class); + + @Autowired(required = false) + private VirusScanner virusScanner; + + @Autowired + private Environment env; + + @Autowired + private RequestValidator requestValidator; + + @Autowired + private ProxyMasterdataService proxyMasterdataService; + + @Value("${mosip.max.file.upload.size.in.bytes}") + private int maxFileUploadSize; + + @Value("${resident.document.validation.transaction-id.regex}") + private String transactionIdRegex; + + @Value("${resident.document.validation.document-id.regex}") + private String documentIdRegex; + + @Override + public boolean supports(Class clazz) { + return clazz.isAssignableFrom(RequestWrapper.class); + } + + @Override + public void validate(Object target, Errors errors) { + + } + + /** + * This function validates the input parameters of a DocumentRequestDTO object + * @param langCode + * @param docTypCode + * @param docCatCode + * @throws ResidentServiceCheckedException + * + */ + public void validateRequest(String transactionId, String docCatCode, String docTypCode, String langCode) throws ResidentServiceCheckedException { + validateTransactionIdForDocument(transactionId); + if (docCatCode == null || StringUtils.isEmpty(docCatCode)) { + throw new InvalidInputException(DOC_CAT_CODE); + } + if (docTypCode == null || StringUtils.isEmpty(docTypCode)) { + throw new InvalidInputException(DOC_TYP_CODE); + } + requestValidator.validateLanguageCode(langCode); + validateDocCatCode(docCatCode, langCode); + validateDocTypeCode(docCatCode, docTypCode, langCode); + } + + public void validateDocCatCode(String docCatCode, String langCode) throws ResidentServiceCheckedException { + List docCatCodeList = proxyMasterdataService.getValidDocCatAndTypeList(langCode).getT1(); + if (!docCatCodeList.contains(docCatCode.toLowerCase())) { + throw new InvalidInputException(DOC_CAT_CODE); + } + } + + public void validateDocTypeCode(String docCatCode, String docTypeCode, String langCode) + throws ResidentServiceCheckedException { + List docTypeCodeList = proxyMasterdataService.getValidDocCatAndTypeList(langCode).getT2() + .get(docCatCode.toLowerCase()); + if (!docTypeCodeList.contains(docTypeCode.toLowerCase())) { + throw new InvalidInputException(DOC_TYP_CODE); + } + } + + /** + * It scans the file for viruses + * + * @param file The file to be scanned. + */ + public void scanForViruses(MultipartFile file) { + if (env.getProperty(ResidentConstants.VIRUS_SCANNER_ENABLED, Boolean.class, true)) { + try { + boolean isInputFileClean = virusScanner.scanFile(file.getInputStream()); + if(!isInputFileClean) { + throw new ResidentServiceException(VIRUS_SCAN.getErrorCode(), + VIRUS_SCAN.getErrorMessage()); + } + } catch (VirusScannerException | IOException e) { + logger.error(LoggerFileConstant.SESSIONID.toString(), LoggerFileConstant.APPLICATIONID.toString(), + LoggerFileConstant.APPLICATIONID.toString(), + "Virus scan failed - " + ExceptionUtils.getStackTrace(e)); + throw new ResidentServiceException(VIRUS_SCAN_FAILED.getErrorCode(), + VIRUS_SCAN_FAILED.getErrorMessage()); + } + } + } + + public void validateTransactionIdForDocument(String transactionId) { + if (transactionId == null || StringUtils.isEmpty(transactionId)) { + throw new InvalidInputException("transactionId"); + } else if (!isDataValidWithRegex(transactionId, transactionIdRegex)) { + throw new InvalidInputException("transactionId"); + } + } + + private boolean isDataValidWithRegex(String inputData, String regex) { + return inputData.matches(regex); + } + + public void validateDocumentIdAndTransactionId(String documentId, String transactionId) { + validateTransactionIdForDocument(transactionId); + validateDocumentId(documentId); + } + + public void validateDocumentId(String documentId) { + if (documentId == null || StringUtils.isEmpty(documentId)) { + throw new InvalidInputException("documentId"); + } else if (!isDataValidWithRegex(documentId, documentIdRegex)) { + throw new InvalidInputException("documentId"); + } + } + + public void validateFileName(MultipartFile file) { + String extension = Objects.requireNonNull(FilenameUtils.getExtension(file.getOriginalFilename())).toLowerCase(); + String extensionProperty = Objects.requireNonNull(env.getProperty(ALLOWED_FILE_TYPE)).toLowerCase(); + if (!extensionProperty.contains(Objects.requireNonNull(extension))) { + throw new ResidentServiceException(UN_SUPPORTED_FILE_TYPE.getErrorCode(), UN_SUPPORTED_FILE_TYPE.getErrorMessage()); + } + if (file.getSize() > maxFileUploadSize) { + throw new ResidentServiceException(DOCUMENT_FILE_SIZE.getErrorCode(), DOCUMENT_FILE_SIZE.getErrorMessage()); + } + } +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestHandlerRequestValidator.java b/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestHandlerRequestValidator.java index 1098a81a75a..ac48e6e06b5 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestHandlerRequestValidator.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestHandlerRequestValidator.java @@ -1,486 +1,470 @@ -package io.mosip.resident.validator; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import org.json.simple.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; -import org.springframework.web.client.HttpClientErrorException; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.idvalidator.exception.InvalidIDException; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.kernel.core.idvalidator.spi.VidValidator; -import io.mosip.kernel.core.logger.spi.Logger; -import io.mosip.resident.config.LoggerConfiguration; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.CardType; -import io.mosip.resident.constant.LoggerFileConstant; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.LogDescription; -import io.mosip.resident.dto.MachineResponseDto; -import io.mosip.resident.dto.RegistrationCenterResponseDto; -import io.mosip.resident.dto.RegistrationType; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.RequestHandlerValidationException; -import io.mosip.resident.exception.VidCreationException; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilities; - -/** - * The Class PacketGeneratorRequestValidator. - * - * @author Rishabh Keshari - */ -@Component -public class RequestHandlerRequestValidator { - - /** The Constant VER. */ - private static final String VER = "version"; - - /** The Constant DATETIME_TIMEZONE. */ - private static final String DATETIME_TIMEZONE = "mosip.registration.processor.timezone"; - - /** The Constant DATETIME_PATTERN. */ - private static final String DATETIME_PATTERN = "resident.datetime.pattern"; - - /** The mosip logger. */ - private final Logger logger = LoggerConfiguration.logConfig(RequestHandlerRequestValidator.class); - - /** The Constant ID_REPO_SERVICE. */ - private static final String REQUEST_HANDLER_SERVICE = "RequestHandlerService"; - - /** The Constant TIMESTAMP. */ - private static final String TIMESTAMP = "requesttime"; - - /** The Constant ID_FIELD. */ - private static final String ID_FIELD = "id"; - - /** The Constant UIN. */ - private static final String UIN = "UIN"; - - /** The Constant VID. */ - private static final String VID = "VID"; - - /** The Constant VID. */ - private static final String RID = "RID"; - - /** The Constant VID. */ - private static final String EMAIL = "Email"; - - /** The Constant VID. */ - private static final String PHONE = "Phone"; - - /** The Constant REG_PACKET_GENERATOR_SERVICE_ID. */ - private static final String REG_PACKET_GENERATOR_SERVICE_ID = "mosip.registration.processor.registration.packetgenerator.id"; - - /** The Constant REG_UINCARD_REPRINT_SERVICE_ID. */ - private static final String REG_UINCARD_REPRINT_SERVICE_ID = "mosip.registration.processor.uincard.reprint.id"; - - /** The Constant RES_UPDATE_SERVICE_ID. */ - private static final String RES_UPDATE_SERVICE_ID = "mosip.registration.processor.resident.service.id"; - - /** The Constant REG_PACKET_GENERATOR_APPLICATION_VERSION. */ - private static final String REG_PACKET_GENERATOR_APPLICATION_VERSION = "mosip.registration.processor.packetgenerator.version"; - - /** The Constant REG_UINCARD_REPRINT_SERVICE_ID. */ - private static final String REG_LOST_PACKET_SERVICE_ID = "mosip.registration.processor.lost.id"; - - /** The env. */ - @Autowired - private Environment env; - - /** The id. */ - private Map id = new HashMap<>(); - - /** The rest client service. */ - @Autowired - private ResidentServiceRestClient restClientService; - - /** The mapper. */ - @Autowired - private ObjectMapper mapper; - - /** The uin validator impl. */ - @Autowired - private UinValidator uinValidatorImpl; - - /** The vid validator impl. */ - @Autowired - private VidValidator vidValidatorImpl; - - /** The utilities. */ - @Autowired - private Utilities utilities; - - /** - * Validate. - * - * @param requestId - * the request id - * @throws RequestHandlerValidationException - * the packet generator validation exception - */ - public void validate(String requestId) - throws RequestHandlerValidationException { - id.put("packet_generator", env.getProperty(REG_PACKET_GENERATOR_SERVICE_ID)); - id.put("uincard_reprint_status", env.getProperty(REG_UINCARD_REPRINT_SERVICE_ID)); - id.put("res_update", env.getProperty(RES_UPDATE_SERVICE_ID)); - id.put("lost_id", env.getProperty(REG_LOST_PACKET_SERVICE_ID)); - validateId(requestId); - - } - - /** - * Validate id. - * - * @param id - * the id - * @throws RequestHandlerValidationException - * the packet generator validation exception - */ - private void validateId(String id) throws RequestHandlerValidationException { - RequestHandlerValidationException exception = new RequestHandlerValidationException(); - if (Objects.isNull(id)) { - throw new RequestHandlerValidationException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), - String.format(ResidentErrorCode.INVALID_INPUT.getErrorMessage(), ID_FIELD), - exception); - - } else if (!this.id.containsValue(id)) { - throw new RequestHandlerValidationException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), - String.format(ResidentErrorCode.INVALID_INPUT.getErrorMessage(), ID_FIELD), - exception); - - } - } - - /** - * Checks if is valid center. - * - * @param centerId - * the center id - * @return true, if is valid center - * @throws BaseCheckedException - * the reg base checked exception - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public boolean isValidCenter(String centerId) throws BaseCheckedException, IOException { - String langCode = utilities.getLanguageCode(); - boolean isValidCenter = false; - List pathsegments = new ArrayList<>(); - pathsegments.add(centerId); - pathsegments.add(langCode); - RegistrationCenterResponseDto rcpdto; - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - try { - if (centerId != null && !centerId.isEmpty()) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "PacketGeneratorServiceImpl::isValidCenter():: Centerdetails Api call started"); - responseWrapper = (ResponseWrapper) restClientService.getApi(ApiName.CENTERDETAILS, pathsegments, "", - "", ResponseWrapper.class); - rcpdto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), - RegistrationCenterResponseDto.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "\"PacketGeneratorServiceImpl::isValidCenter():: Centerdetails Api call ended with response data : " - + JsonUtil.objectMapperObjectToJson(rcpdto)); - if (CollectionUtils.isEmpty(responseWrapper.getErrors()) && !rcpdto.getRegistrationCenters().isEmpty()) { - isValidCenter = true; - } else { - List error = responseWrapper.getErrors(); - throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage()+" "+error.get(0).getMessage()); - } - } else { - throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage()+" CenterId is Mandatory"); - - } - } catch (ApisResourceAccessException e) { - if (e.getCause() instanceof HttpClientErrorException) { - List error = responseWrapper.getErrors(); - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - error.get(0).getMessage(), e); - - } - - } - return isValidCenter; - } - - /** - * Checks if is valid machine. - * - * @param machine - * the machine - * @return true, if is valid machine - * @throws BaseCheckedException - * the reg base checked exception - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public boolean isValidMachine(String machine) throws BaseCheckedException, IOException { - boolean isValidMachine = false; - List pathsegments = new ArrayList<>(); - pathsegments.add(machine); - MachineResponseDto machinedto; - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - try { - - if (machine != null && !machine.isEmpty()) { - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "PacketGeneratorServiceImpl::isValidMachine():: MachineDetails Api call started"); - responseWrapper = (ResponseWrapper) restClientService.getApi(ApiName.MACHINEDETAILS, pathsegments, - "", "", ResponseWrapper.class); - machinedto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), - MachineResponseDto.class); - logger.debug(LoggerFileConstant.SESSIONID.toString(), - LoggerFileConstant.REGISTRATIONID.toString(), "", - "\"PacketGeneratorServiceImpl::isValidMachine():: MachienDetails Api call ended with response data : " - + JsonUtil.objectMapperObjectToJson(machinedto)); - if (CollectionUtils.isEmpty(responseWrapper.getErrors()) && !machinedto.getMachines().isEmpty()) { - isValidMachine = true; - } else { - List error = responseWrapper.getErrors(); - throw new BaseCheckedException(ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorCode(), ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorMessage()+" "+error.get(0).getMessage()); - } - } else { - throw new BaseCheckedException(ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorCode(), ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorMessage()+" MachineId is Mandatory"); - - } - - } catch (ApisResourceAccessException e) { - if (e.getCause() instanceof HttpClientErrorException) { - List error = responseWrapper.getErrors(); - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - error.get(0).getMessage(), e); - - } - - } - return isValidMachine; - - } - - /** - * Checks if is valid uin. - * - * @param uin - * the uin - * @return true, if is valid uin - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidUin(String uin) throws BaseCheckedException { - boolean isValidUIN = false; - try { - isValidUIN = uinValidatorImpl.validateId(uin); - JSONObject jsonObject = utilities.retrieveIdrepoJson(uin); - if (isValidUIN && jsonObject != null) { - isValidUIN = true; - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), "UIN is not valid", - new Throwable()); - - } - } catch (InvalidIDException ex) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ex.getErrorText(), ex); - - } catch (IdRepoAppException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getErrorText(), e); - } catch (NumberFormatException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); - } catch (ApisResourceAccessException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getErrorText(), e); - } catch (IOException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); - } - return isValidUIN; - } - - /** - * Checks if is valid re print registration type. - * - * @param registrationType - * the registration type - * @return true, if is valid re print registration type - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidRePrintRegistrationType(String registrationType) throws BaseCheckedException { - if (registrationType != null && (registrationType.equalsIgnoreCase(RegistrationType.RES_REPRINT.toString()))) { - return true; - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "Invalid RegistrationType:Enter RES_REPRINT", new Throwable()); - } - - } - - /** - * Checks if is valid registration type and uin. - * - * @param registrationType - * the registration type - * @param uin - * the uin - * @return true, if is valid registration type and uin - * @throws BaseCheckedException - * the reg base checked exception - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public boolean isValidRegistrationTypeAndUin(String registrationType, String uin) - throws BaseCheckedException, IOException { - try { - if (registrationType != null - && (registrationType.equalsIgnoreCase(RegistrationType.ACTIVATED.toString()) - || registrationType.equalsIgnoreCase(RegistrationType.DEACTIVATED.toString())) - || registrationType != null && registrationType.equals(RegistrationType.RES_UPDATE.toString())) { - boolean isValidUin = uinValidatorImpl.validateId(uin); - String status = utilities.retrieveIdrepoJsonStatus(uin); - - if (isValidUin) { - if(registrationType.equals(RegistrationType.RES_UPDATE.toString())) { - return validateUINForResUpdate(uin, status); - } - if (!status.equalsIgnoreCase(registrationType)) { - return true; - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "Uin is already " + status, new Throwable()); - } - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "UIN is not valid", new Throwable()); - } - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "Invalid RegistrationType:Enter ACTIVATED or DEACTIVATED", new Throwable()); - } - } catch (InvalidIDException ex) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ex.getErrorText(), ex); - } catch (NumberFormatException | IdRepoAppException | ApisResourceAccessException e) { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); - } - } - - private boolean validateUINForResUpdate(String uin, String status) - throws ApisResourceAccessException, IOException, BaseCheckedException { - JSONObject idObject = utilities.retrieveIdrepoJson(uin); - if(idObject!=null && status.equals("ACTIVATED")) - return true; - else - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "UIN is not valid", new Throwable()); - } - - /** - * Checks if is valid vid. - * - * @param vid - * the vid - * @return true, if is valid vid - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidVid(String vid) throws BaseCheckedException, IOException { - boolean isValidVID = false; - try { - isValidVID = vidValidatorImpl.validateId(vid); - String result = utilities.getUinByVid(vid); - if (isValidVID && result != null) { - isValidVID = true; - } else { - throw new BaseCheckedException(ResidentErrorCode.INVALID_VID.getErrorCode(), "VID is not valid", - new Throwable()); - - } - } catch (InvalidIDException ex) { - throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ex.getErrorText(), ex); - - } catch (IdRepoAppException e) { - throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); - } catch (NumberFormatException e) { - throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); - } catch (ApisResourceAccessException e) { - throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); - } catch (VidCreationException e) { - throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); - } - return isValidVID; - } - - /** - * Checks if is valid id type. - * - * @param idType - * the id type - * @return true, if is valid id type - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidIdType(String idType) throws BaseCheckedException { - if (idType != null && (idType.equalsIgnoreCase(UIN) || idType.equalsIgnoreCase(VID))) - return true; - else - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "Invalid IdType : Enter UIN or VID", new Throwable()); - } - - /** - * Checks if is valid card type. - * - * @param cardType - * the card type - * @return true, if is valid card type - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidCardType(String cardType) throws BaseCheckedException { - if (cardType != null && !cardType.isEmpty() && (cardType.equalsIgnoreCase(CardType.UIN.toString()) - || cardType.equalsIgnoreCase(CardType.MASKED_UIN.toString()))) { - return true; - } else { - throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), - "Invalid CardType : Enter UIN or MASKED_UIN", new Throwable()); - } - - } - - /** - * Checks if is valid contact type. - * - * @param contactType - * the contact type - * @return true, if is valid contact type - * @throws BaseCheckedException - * the reg base checked exception - */ - public boolean isValidContactType(String contactType, LogDescription description) throws BaseCheckedException { - if (contactType != null && (contactType.equalsIgnoreCase(EMAIL) || contactType.equalsIgnoreCase(PHONE))) { - return true; - } else { - description.setMessage(ResidentErrorCode.INVALID_INPUT.getErrorMessage()); - description.setCode(ResidentErrorCode.INVALID_INPUT.getErrorCode()); - throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), - ResidentErrorCode.INVALID_INPUT.getErrorMessage(), new Throwable()); - } - - } - -} +package io.mosip.resident.validator; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.util.Utility; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.web.client.HttpClientErrorException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idvalidator.exception.InvalidIDException; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.kernel.core.logger.spi.Logger; +import io.mosip.resident.config.LoggerConfiguration; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.LoggerFileConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.LogDescription; +import io.mosip.resident.dto.MachineResponseDto; +import io.mosip.resident.dto.RegistrationCenterResponseDto; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.RequestHandlerValidationException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; + +/** + * The Class RequestHandlerRequestValidator. + * + * @author Rishabh Keshari + */ +@Component +public class RequestHandlerRequestValidator { + + /** The mosip logger. */ + private final Logger logger = LoggerConfiguration.logConfig(RequestHandlerRequestValidator.class); + + /** The Constant ID_FIELD. */ + private static final String ID_FIELD = "id"; + + /** The Constant VID. */ + private static final String EMAIL = "Email"; + + /** The Constant VID. */ + private static final String PHONE = "Phone"; + + /** The Constant REG_PACKET_GENERATOR_SERVICE_ID. */ + private static final String REG_PACKET_GENERATOR_SERVICE_ID = "mosip.registration.processor.registration.packetgenerator.id"; + + /** The Constant REG_UINCARD_REPRINT_SERVICE_ID. */ + private static final String REG_UINCARD_REPRINT_SERVICE_ID = "mosip.registration.processor.uincard.reprint.id"; + + /** The Constant RES_UPDATE_SERVICE_ID. */ + private static final String RES_UPDATE_SERVICE_ID = "mosip.registration.processor.resident.service.id"; + + /** The Constant REG_UINCARD_REPRINT_SERVICE_ID. */ + private static final String REG_LOST_PACKET_SERVICE_ID = "mosip.registration.processor.lost.id"; + + /** The env. */ + @Autowired + private Environment env; + + /** The id. */ + private Map id = new HashMap<>(); + + /** The rest client service. */ + @Autowired + private ResidentServiceRestClient restClientService; + + /** The mapper. */ + @Autowired + private ObjectMapper mapper; + + /** The uin validator impl. */ + @Autowired + private UinValidator uinValidatorImpl; + + /** The vid validator impl. */ + @Autowired + private VidValidator vidValidatorImpl; + + /** The utilities. */ + @Autowired + private Utilities utilities; + + @Autowired + private Utility utility; + + /** + * Validate. + * + * @param requestId + * the request id + * @throws RequestHandlerValidationException + * the packet generator validation exception + */ + public void validate(String requestId) + throws RequestHandlerValidationException { + id.put("packet_generator", env.getProperty(REG_PACKET_GENERATOR_SERVICE_ID)); + id.put("uincard_reprint_status", env.getProperty(REG_UINCARD_REPRINT_SERVICE_ID)); + id.put("res_update", env.getProperty(RES_UPDATE_SERVICE_ID)); + id.put("lost_id", env.getProperty(REG_LOST_PACKET_SERVICE_ID)); + validateId(requestId); + + } + + /** + * Validate id. + * + * @param id + * the id + * @throws RequestHandlerValidationException + * the packet generator validation exception + */ + private void validateId(String id) throws RequestHandlerValidationException { + RequestHandlerValidationException exception = new RequestHandlerValidationException(); + if (Objects.isNull(id)) { + throw new RequestHandlerValidationException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + String.format(ResidentErrorCode.INVALID_INPUT.getErrorMessage(), ID_FIELD), + exception); + + } else if (!this.id.containsValue(id)) { + throw new RequestHandlerValidationException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + String.format(ResidentErrorCode.INVALID_INPUT.getErrorMessage(), ID_FIELD), + exception); + + } + } + + /** + * Checks if is valid center. + * + * @param centerId + * the center id + * @return true, if is valid center + * @throws BaseCheckedException + * the reg base checked exception + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public boolean isValidCenter(String centerId) throws BaseCheckedException, IOException { + String langCode = utilities.getLanguageCode(); + boolean isValidCenter = false; + RegistrationCenterResponseDto rcpdto; + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + if (centerId != null && !centerId.isEmpty()) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "PacketGeneratorServiceImpl::isValidCenter():: Centerdetails Api call started"); + responseWrapper = (ResponseWrapper) utility.getCenterDetails(centerId, langCode); + rcpdto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), + RegistrationCenterResponseDto.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "\"PacketGeneratorServiceImpl::isValidCenter():: Centerdetails Api call ended with response data : " + + JsonUtil.objectMapperObjectToJson(rcpdto)); + if (CollectionUtils.isEmpty(responseWrapper.getErrors()) && !rcpdto.getRegistrationCenters().isEmpty()) { + isValidCenter = true; + } else { + List error = responseWrapper.getErrors(); + throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage()+" "+error.get(0).getMessage()); + } + } else { + throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentErrorCode.INVALID_INPUT.getErrorMessage()+" CenterId is Mandatory"); + + } + } catch (ApisResourceAccessException e) { + if (e.getCause() instanceof HttpClientErrorException) { + List error = responseWrapper.getErrors(); + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + error.get(0).getMessage(), e); + + } + + } + return isValidCenter; + } + + /** + * Checks if is valid machine. + * + * @param machine + * the machine + * @return true, if is valid machine + * @throws BaseCheckedException + * the reg base checked exception + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public boolean isValidMachine(String machine) throws BaseCheckedException, IOException { + boolean isValidMachine = false; + List pathsegments = new ArrayList<>(); + pathsegments.add(machine); + MachineResponseDto machinedto; + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + try { + + if (machine != null && !machine.isEmpty()) { + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "PacketGeneratorServiceImpl::isValidMachine():: MachineDetails Api call started"); + responseWrapper = (ResponseWrapper) restClientService.getApi(ApiName.MACHINEDETAILS, pathsegments, + "", "", ResponseWrapper.class); + machinedto = mapper.readValue(mapper.writeValueAsString(responseWrapper.getResponse()), + MachineResponseDto.class); + logger.debug(LoggerFileConstant.SESSIONID.toString(), + LoggerFileConstant.REGISTRATIONID.toString(), "", + "\"PacketGeneratorServiceImpl::isValidMachine():: MachienDetails Api call ended with response data : " + + JsonUtil.objectMapperObjectToJson(machinedto)); + if (CollectionUtils.isEmpty(responseWrapper.getErrors()) && !machinedto.getMachines().isEmpty()) { + isValidMachine = true; + } else { + List error = responseWrapper.getErrors(); + throw new BaseCheckedException(ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorCode(), ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorMessage()+" "+error.get(0).getMessage()); + } + } else { + throw new BaseCheckedException(ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorCode(), ResidentErrorCode.INVALID_REQUEST_EXCEPTION.getErrorMessage()+" MachineId is Mandatory"); + + } + + } catch (ApisResourceAccessException e) { + if (e.getCause() instanceof HttpClientErrorException) { + List error = responseWrapper.getErrors(); + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + error.get(0).getMessage(), e); + + } + + } + return isValidMachine; + + } + + /** + * Checks if is valid uin. + * + * @param uin + * the uin + * @return true, if is valid uin + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidUin(String uin) throws BaseCheckedException { + boolean isValidUIN = false; + try { + isValidUIN = uinValidatorImpl.validateId(uin); + JSONObject jsonObject = utilities.retrieveIdrepoJson(uin); + if (isValidUIN && jsonObject != null) { + isValidUIN = true; + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), "UIN is not valid", + new Throwable()); + + } + } catch (InvalidIDException ex) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ex.getErrorText(), ex); + + } catch (IdRepoAppException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getErrorText(), e); + } catch (NumberFormatException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); + } catch (ApisResourceAccessException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), e.getErrorText(), e); + } catch (IOException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); + } + return isValidUIN; + } + + /** + * Checks if is valid re print registration type. + * + * @param registrationType + * the registration type + * @return true, if is valid re print registration type + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidRePrintRegistrationType(String registrationType) throws BaseCheckedException { + if (registrationType != null && (registrationType.equalsIgnoreCase(RegistrationType.RES_REPRINT.toString()))) { + return true; + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "Invalid RegistrationType:Enter RES_REPRINT", new Throwable()); + } + + } + + /** + * Checks if is valid registration type and uin. + * + * @param registrationType the registration type + * @param uin the uin + * @param idResponseDto + * @return true, if is valid registration type and uin + * @throws BaseCheckedException the reg base checked exception + * @throws IOException Signals that an I/O exception has occurred. + */ + public boolean isValidRegistrationTypeAndUin(String registrationType, String uin, IdResponseDTO1 idResponseDto) + throws BaseCheckedException, IOException { + try { + if (registrationType != null + && (registrationType.equalsIgnoreCase(RegistrationType.ACTIVATED.toString()) + || registrationType.equalsIgnoreCase(RegistrationType.DEACTIVATED.toString())) + || registrationType != null && registrationType.equals(RegistrationType.RES_UPDATE.toString())) { + boolean isValidUin = uinValidatorImpl.validateId(uin); + String status = null; + if(idResponseDto == null){ + status = utilities.retrieveIdrepoJsonStatus(uin); + } else { + status = idResponseDto.getResponse().getStatus(); + } + if (isValidUin) { + if(registrationType.equals(RegistrationType.RES_UPDATE.toString())) { + return validateUINForResUpdate(status); + } + if (!status.equalsIgnoreCase(registrationType)) { + return true; + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "Uin is already " + status, new Throwable()); + } + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "UIN is not valid", new Throwable()); + } + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "Invalid RegistrationType:Enter ACTIVATED or DEACTIVATED", new Throwable()); + } + } catch (InvalidIDException ex) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ex.getErrorText(), ex); + } catch (NumberFormatException | IdRepoAppException | ApisResourceAccessException e) { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), ResidentErrorCode.BASE_EXCEPTION.getErrorMessage(), e); + } + } + + private boolean validateUINForResUpdate(String status) + throws BaseCheckedException { + if(status.equals(RegistrationType.ACTIVATED.name())) + return true; + else + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "UIN is not valid", new Throwable()); + } + + public boolean isValidVid(String vid) throws BaseCheckedException, IOException { + return isValidVid(vid, null); + } + /** + * Checks if is valid vid. + * + * @param vid + * the vid + * @return true, if is valid vid + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidVid(String vid, String sessionUin) throws BaseCheckedException, IOException { + boolean isValidVID = false; + try { + isValidVID = vidValidatorImpl.validateId(vid); + String result; + if(sessionUin!=null){ + result = sessionUin; + } else { + result = utilities.getUinByVid(vid); + } + + if (isValidVID && result != null) { + isValidVID = true; + } else { + throw new BaseCheckedException(ResidentErrorCode.INVALID_VID.getErrorCode(), "VID is not valid", + new Throwable()); + + } + } catch (InvalidIDException ex) { + throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), ex.getErrorText(), ex); + + } catch (IdRepoAppException e) { + throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); + } catch (NumberFormatException e) { + throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorMessage(), e); + } catch (ApisResourceAccessException e) { + throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); + } catch (VidCreationException e) { + throw new BaseCheckedException(ResidentErrorCode.RESIDENT_SYS_EXCEPTION.getErrorCode(), e.getErrorText(), e); + } + return isValidVID; + } + + /** + * Checks if is valid id type. + * + * @param idType + * the id type + * @return true, if is valid id type + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidIdType(String idType) throws BaseCheckedException { + if (idType != null && (idType.equalsIgnoreCase(IdType.UIN.name()) || idType.equalsIgnoreCase(IdType.VID.name()))) + return true; + else + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "Invalid IdType : Enter UIN or VID", new Throwable()); + } + + /** + * Checks if is valid card type. + * + * @param cardType + * the card type + * @return true, if is valid card type + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidCardType(String cardType) throws BaseCheckedException { + if (cardType != null && !cardType.isEmpty() && (cardType.equalsIgnoreCase(CardType.UIN.toString()) + || cardType.equalsIgnoreCase(CardType.MASKED_UIN.toString()))) { + return true; + } else { + throw new BaseCheckedException(ResidentErrorCode.BASE_EXCEPTION.getErrorCode(), + "Invalid CardType : Enter UIN or MASKED_UIN", new Throwable()); + } + + } + + /** + * Checks if is valid contact type. + * + * @param contactType + * the contact type + * @return true, if is valid contact type + * @throws BaseCheckedException + * the reg base checked exception + */ + public boolean isValidContactType(String contactType, LogDescription description) throws BaseCheckedException { + if (contactType != null && (contactType.equalsIgnoreCase(EMAIL) || contactType.equalsIgnoreCase(PHONE))) { + return true; + } else { + description.setMessage(ResidentErrorCode.INVALID_INPUT.getErrorMessage()); + description.setCode(ResidentErrorCode.INVALID_INPUT.getErrorCode()); + throw new BaseCheckedException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + ResidentErrorCode.INVALID_INPUT.getErrorMessage(), new Throwable()); + } + + } + +} diff --git a/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestValidator.java b/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestValidator.java index bd753758546..1195001a815 100644 --- a/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestValidator.java +++ b/resident/resident-service/src/main/java/io/mosip/resident/validator/RequestValidator.java @@ -1,46 +1,112 @@ package io.mosip.resident.validator; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.PostConstruct; -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.kernel.core.http.ResponseWrapper; import io.mosip.kernel.core.idvalidator.exception.InvalidIDException; import io.mosip.kernel.core.idvalidator.spi.RidValidator; import io.mosip.kernel.core.idvalidator.spi.UinValidator; import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.kernel.core.util.CryptoUtil; import io.mosip.kernel.core.util.DateUtils; import io.mosip.kernel.core.util.StringUtils; +import io.mosip.preregistration.application.dto.TransliterationRequestDTO; import io.mosip.resident.constant.AuthTypeStatus; import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.EventStatus; import io.mosip.resident.constant.IdType; import io.mosip.resident.constant.RequestIdType; -import io.mosip.resident.constant.VidType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.constant.UISchemaTypes; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AttributeListDto; import io.mosip.resident.dto.AuthHistoryRequestDTO; import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthTypeStatusDtoV2; import io.mosip.resident.dto.AuthUnLockRequestDTO; +import io.mosip.resident.dto.BaseVidRequestDto; +import io.mosip.resident.dto.BaseVidRevokeRequestDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.DraftResidentResponseDto; +import io.mosip.resident.dto.DraftUinResidentResponseDto; import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.IVidRequestDto; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; import io.mosip.resident.dto.RequestDTO; import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; import io.mosip.resident.dto.ResidentReprintRequestDto; import io.mosip.resident.dto.ResidentUpdateRequestDto; -import io.mosip.resident.dto.ResidentVidRequestDto; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.dto.ShareCredentialRequestDto; +import io.mosip.resident.dto.SortType; +import io.mosip.resident.dto.UpdateCountDto; +import io.mosip.resident.dto.VidRequestDto; import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.BaseResidentUncheckedExceptionWithMetadata; +import io.mosip.resident.exception.EidNotBelongToSessionException; import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentConfigServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.util.AuditEnum; import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; +import io.mosip.resident.util.Utility; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.validation.Valid; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static io.mosip.resident.constant.RegistrationConstants.MESSAGE_CODE; +import static io.mosip.resident.service.impl.ResidentOtpServiceImpl.EMAIL_CHANNEL; +import static io.mosip.resident.service.impl.ResidentOtpServiceImpl.PHONE_CHANNEL; @Component public class RequestValidator { + private static final String OTP = "otp"; + private static final String ID = "id"; + private static final String VERSION = "version"; + private static final String REQUESTTIME = "requesttime"; + private static final String REQUEST = "request"; + private static final String VALIDATE_EVENT_ID = "Validating Event Id."; + private static final String ID_SCHEMA_VERSION = "IDSchemaVersion"; + @Autowired private UinValidator uinValidator; @@ -53,6 +119,27 @@ public class RequestValidator { @Autowired private AuditUtil audit; + @Autowired + private Environment environment; + + @Autowired + private IdentityServiceImpl identityService; + + @Autowired + private ResidentConfigServiceImpl residentConfigService; + + @Autowired + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Autowired + private ProxyIdRepoService idRepoService; + + @Autowired + private ObjectMapper objectMapper; + private String euinId; private String reprintId; @@ -73,12 +160,24 @@ public void setUinUpdateId(String uinUpdateId) { @Value("${resident.vid.id}") private String id; + @Value("${resident.vid.id.generate}") + private String generateId; + @Value("${resident.revokevid.id}") private String revokeVidId; + @Value("${mosip.resident.revokevid.id}") + private String revokeVidIdNew; + @Value("${resident.vid.version}") private String version; + @Value("${resident.vid.version.new}") + private String newVersion; + + @Value("${resident.revokevid.version.new}") + private String revokeVidVersion; + @Value("${resident.authlock.id}") public void setAuthLockId(String authLockId) { this.authLockId = authLockId; @@ -95,7 +194,7 @@ public void setAuthHstoryId(String authHstoryId) { } @Value("${auth.types.allowed}") - private String authTypes; + private String allowedAuthTypes; @Value("${resident.authunlock.id}") public void setAuthUnlockId(String authUnLockId) { @@ -111,6 +210,12 @@ public void setAuthUnlockId(String authUnLockId) { @Value("${resident.checkstatus.id}") private String checkStatusID; + @Value("${resident.share.credential.id}") + private String shareCredentialId; + + @Value("${mosip.resident.request.response.version}") + private String reqResVersion; + private Map map; @Value("${resident.printuin.id}") @@ -118,6 +223,66 @@ public void setReprintId(String reprintId) { this.reprintId = reprintId; } + @Value("${mosip.mandatory-languages}") + private String mandatoryLanguages; + + @Value("${mosip.optional-languages}") + private String optionalLanguages; + + @Value("${mosip.resident.transliteration.transliterate.id}") + private String transliterateId; + + @Value("${otpChannel.mobile}") + private String mobileChannel; + + @Value("${otpChannel.email}") + private String emailChannel; + + @Value("${resident.authLockStatusUpdateV2.id}") + private String authLockStatusUpdateV2Id; + + @Value("${resident.grievance-redressal.alt-email.chars.limit}") + private int emailCharsLimit; + + @Value("${resident.grievance-redressal.alt-phone.chars.limit}") + private int phoneCharsLimit; + + @Value("${resident.grievance-redressal.comments.chars.limit}") + private int messageCharsLimit; + + @Value("${resident.share-credential.purpose.chars.limit}") + private int purposeCharsLimit; + + @Value("${mosip.resident.eventid.searchtext.length}") + private int searchTextLength; + + @Value("${mosip.kernel.vid.length}") + private int vidLength; + + @Value("${mosip.kernel.otp.default-length}") + private int otpLength; + + @Value("${resident.message.allowed.special.char.regex}") + private String messageAllowedSpecialCharRegex; + + @Value("${resident.purpose.allowed.special.char.regex}") + private String purposeAllowedSpecialCharRegex; + + @Value("${resident.id.allowed.special.char.regex}") + private String idAllowedSpecialCharRegex; + + @Value("${resident.validation.is-numeric.regex}") + private String numericDataRegex; + + @Value("${resident.otp.validation.transaction-id.regex}") + private String transactionIdRegex; + + @Value("${resident.validation.event-id.regex}") + private String eventIdRegex; + + @Value("${resident.attribute.names.without.documents.required}") + private String attributeNamesWithoutDocumentsRequired; + @PostConstruct public void setMap() { map = new EnumMap<>(RequestIdType.class); @@ -128,109 +293,204 @@ public void setMap() { map.put(RequestIdType.AUTH_HISTORY_ID, authHstoryId); map.put(RequestIdType.RES_UPDATE, uinUpdateId); map.put(RequestIdType.CHECK_STATUS, checkStatusID); - + map.put(RequestIdType.SHARE_CREDENTIAL, shareCredentialId); + map.put(RequestIdType.AUTH_LOCK_UNLOCK, authLockStatusUpdateV2Id); } - public void validateVidCreateRequest(ResidentVidRequestDto requestDto) { + public void validateVidCreateRequest(IVidRequestDto requestDto, boolean otpValidationRequired, String individualId) { try { DateUtils.parseToLocalDateTime(requestDto.getRequesttime()); } catch (Exception e) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "requesttime", "Request to generate VID")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, "Request to generate VID")); - throw new InvalidInputException("requesttime"); + throw new InvalidInputException(REQUESTTIME); } if (StringUtils.isEmpty(requestDto.getId()) || !requestDto.getId().equalsIgnoreCase(id)) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "id", "Request to generate VID")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, ID, "Request to generate VID")); - throw new InvalidInputException("id"); + throw new InvalidInputException(ID); } if (StringUtils.isEmpty(requestDto.getVersion()) || !requestDto.getVersion().equalsIgnoreCase(version)) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "version", "Request to generate VID")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, VERSION, "Request to generate VID")); - throw new InvalidInputException("version"); + throw new InvalidInputException(VERSION); } if (requestDto.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException(REQUEST); } - validateVidType(requestDto, "Request to generate VID"); + if (StringUtils.isEmpty(individualId) + || !validateUinOrVid(individualId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", + "Request generate VID API")); + throw new InvalidInputException("individualId"); + } + BaseVidRequestDto vidRequestDto = requestDto.getRequest(); + if(vidRequestDto instanceof VidRequestDto) { + if (otpValidationRequired && StringUtils.isEmpty(((VidRequestDto)vidRequestDto).getOtp())) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request to generate VID")); + + throw new InvalidInputException(OTP); + } + } - if (!validateIndividualId(requestDto.getRequest().getIndividualId(), IdType.UIN.name())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", + if (StringUtils.isEmpty(requestDto.getRequest().getTransactionID())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request to generate VID")); - throw new InvalidInputException("individualId"); + throw new InvalidInputException("transactionId"); } + } + + public void validateVidCreateV2Request(IVidRequestDto requestDto, boolean otpValidationRequired, String individualId) { - if (StringUtils.isEmpty(requestDto.getRequest().getOtp())) { + try { + DateUtils.parseToLocalDateTime(requestDto.getRequesttime()); + } catch (Exception e) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request to generate VID")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, "Request to generate VID")); - throw new InvalidInputException("otp"); + throw new InvalidInputException(REQUESTTIME); } - if (StringUtils.isEmpty(requestDto.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", + if (StringUtils.isEmpty(requestDto.getId()) || !requestDto.getId().equalsIgnoreCase(generateId)) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "generateId", "Request to generate VID")); + + throw new InvalidInputException("generateId"); + } + + if (StringUtils.isEmpty(requestDto.getVersion()) || !requestDto.getVersion().equalsIgnoreCase(newVersion)) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "newVersion", "Request to generate VID")); + + throw new InvalidInputException("newVersion"); + } + + if (requestDto.getRequest() == null) { + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException(REQUEST); + } + + if (StringUtils.isEmpty(individualId) + || !validateUinOrVid(individualId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", + "Request generate VID API")); + throw new InvalidInputException("individualId"); + } + + BaseVidRequestDto vidRequestDto = requestDto.getRequest(); + if(vidRequestDto instanceof VidRequestDto) { + if (otpValidationRequired && StringUtils.isEmpty(((VidRequestDto)vidRequestDto).getOtp())) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request to generate VID")); + + throw new InvalidInputException(OTP); + } + } + + if (otpValidationRequired && StringUtils.isEmpty(requestDto.getRequest().getTransactionID())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request to generate VID")); throw new InvalidInputException("transactionId"); } } - public void validateVidType(ResidentVidRequestDto requestDto, String msg) { - if (StringUtils.isEmpty(requestDto.getRequest().getVidType()) - || (!requestDto.getRequest().getVidType().equalsIgnoreCase(VidType.PERPETUAL.name()) - && !requestDto.getRequest().getVidType().equalsIgnoreCase(VidType.TEMPORARY.name()))) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "vidType", msg)); + public void validateAuthLockOrUnlockRequestV2(RequestWrapper requestDto) { + validateRequestNewApi(requestDto, RequestIdType.AUTH_LOCK_UNLOCK); + validateAuthTypeV2(requestDto.getRequest().getAuthTypes()); + } + + private void validateAuthTypeV2(List authTypesList) { + if (authTypesList == null || authTypesList.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException("authTypes"); + } + String[] authTypesArray = allowedAuthTypes.toLowerCase().split(","); + List authTypesAllowed = new ArrayList<>(Arrays.asList(authTypesArray)); + for (AuthTypeStatusDtoV2 authTypeStatusDto : authTypesList) { + String authTypeString = ResidentServiceImpl.getAuthTypeBasedOnConfigV2(authTypeStatusDto); + if (StringUtils.isEmpty(authTypeString) || !authTypesAllowed.contains(authTypeString.toLowerCase())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "authTypes", + "Request to generate VID")); + throw new InvalidInputException("authTypes"); + } + + if(!authTypeStatusDto.getLocked() && !isValidUnlockForSeconds(authTypeStatusDto.getUnlockForSeconds())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "unlockForSeconds", + "Request to generate VID")); + throw new InvalidInputException("unlockForSeconds"); + } + + if(authTypeStatusDto.getLocked() && (authTypeStatusDto.getUnlockForSeconds() != null)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.UNSUPPORTED_INPUT, "unlockForSeconds", + "Request to generate VID")); + throw new BaseResidentUncheckedExceptionWithMetadata(ResidentErrorCode.UNSUPPORTED_INPUT.getErrorCode(), + String.format("%sunlockForSeconds", ResidentErrorCode.UNSUPPORTED_INPUT.getErrorMessage())); + } + + List authTypes = Arrays.asList(authTypeString); + validateAuthType(authTypes, + "Request auth " + authTypes.toString().toLowerCase() + " API"); + + } + } - throw new InvalidInputException("vidType"); + private boolean isValidUnlockForSeconds(Long unlockForSeconds) { + if(unlockForSeconds == null) { + return true; } + return unlockForSeconds.longValue() > 0; } public void validateAuthLockOrUnlockRequest(RequestWrapper requestDTO, - AuthTypeStatus authTypeStatus) { + AuthTypeStatus authTypeStatus) { validateAuthorUnlockId(requestDTO, authTypeStatus); - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); - } - String individualId = requestDTO.getRequest().getIndividualId(); if (StringUtils.isEmpty(individualId) - || !validateIdvIdWithoutIdTypeForAuthStatusRequests(individualId)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", + || !validateUinOrVid(individualId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); throw new InvalidInputException("individualId"); } if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); - throw new InvalidInputException("otp"); + throw new InvalidInputException(OTP); } if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); throw new InvalidInputException("transactionId"); } - validateAuthType(requestDTO.getRequest().getAuthType(), + List authTypesList = new ArrayList(); + if (requestDTO.getRequest().getAuthType() != null && !requestDTO.getRequest().getAuthType().isEmpty()) { + for(String authType:requestDTO.getRequest().getAuthType()) { + String authTypeString = ResidentServiceImpl.getAuthTypeBasedOnConfig(authType); + authTypesList.add(authTypeString); + } + } + validateAuthType(authTypesList, "Request auth " + authTypeStatus.toString().toLowerCase() + " API"); } private void validateAuthorUnlockId(RequestWrapper requestDTO, - AuthTypeStatus authTypeStatus) { + AuthTypeStatus authTypeStatus) { if (authTypeStatus.equals(AuthTypeStatus.LOCK)) { validateRequest(requestDTO, RequestIdType.AUTH_LOCK_ID); } else { @@ -241,58 +501,50 @@ private void validateAuthorUnlockId(RequestWrapper r public void validateEuinRequest(RequestWrapper requestDTO) { validateRequest(requestDTO, RequestIdType.E_UIN_ID); - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); - } - validateIndividualIdType(requestDTO.getRequest().getIndividualIdType(), "Request for EUIN"); if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) - || (!validateIndividualId(requestDTO.getRequest().getIndividualId(), - requestDTO.getRequest().getIndividualIdType()))) { + || (!validateUinOrVid(requestDTO.getRequest().getIndividualId()))) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", "Request for EUIN")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request for EUIN")); throw new InvalidInputException("individualId"); } if (StringUtils.isEmpty(requestDTO.getRequest().getCardType()) || (!requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.UIN.name()) - && !requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.MASKED_UIN.name()))) { + && !requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.MASKED_UIN.name()))) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "cardType", "Request for EUIN")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "cardType", "Request for EUIN")); throw new InvalidInputException("cardType"); } if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request for EUIN")); - throw new InvalidInputException("otp"); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request for EUIN")); + throw new InvalidInputException(OTP); } if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", "Request for EUIN")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request for EUIN")); throw new InvalidInputException("transactionId"); } } public void validateAuthHistoryRequest(@Valid RequestWrapper requestDTO) { validateRequest(requestDTO, RequestIdType.AUTH_HISTORY_ID); - - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); - } - - if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId())) + if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) + || (!validateUinOrVid(requestDTO.getRequest().getIndividualId()))) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request auth history API")); throw new InvalidInputException("individualId"); + } if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request for auth history")); - throw new InvalidInputException("otp"); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request for auth history")); + throw new InvalidInputException(OTP); } if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request for auth history")); throw new InvalidInputException("transactionId"); } @@ -303,14 +555,14 @@ public void validatePagefetchAndPageStart(RequestWrapper if (requestDTO.getRequest().getPageFetch() != null && requestDTO.getRequest().getPageFetch().trim().isEmpty() && requestDTO.getRequest().getPageStart() != null && requestDTO.getRequest().getPageStart().trim().isEmpty()) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "please provide Page size and Page number to be fetched", msg)); throw new InvalidInputException("please provide Page size and Page number to be Fetched"); } if (requestDTO.getRequest().getPageFetch() != null && requestDTO.getRequest().getPageFetch().trim().isEmpty() && StringUtils.isEmpty(requestDTO.getRequest().getPageStart())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "please provide Page size and Page number to be fetched", msg)); throw new InvalidInputException("please provide Page size and Page number to be Fetched"); } @@ -323,20 +575,20 @@ private void validatePageFetchAndPageStartEmptyCheck(RequestWrapper authType, String msg) { - if (authType == null || authType.isEmpty()) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "authType", msg)); - throw new InvalidInputException("authType"); + public void validateAuthType(List authTypesList, String msg) { + if (authTypesList == null || authTypesList.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "authTypes", msg)); + throw new InvalidInputException("authTypes"); } - String[] authTypesArray = authTypes.split(","); + String[] authTypesArray = allowedAuthTypes.toLowerCase().split(","); List authTypesAllowed = new ArrayList<>(Arrays.asList(authTypesArray)); - for (String type : authType) { - if (!authTypesAllowed.contains(type)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "authType", msg)); - throw new InvalidInputException("authType"); + for (String type : authTypesList) { + if (StringUtils.isEmpty(type) || !authTypesAllowed.contains(type.toLowerCase())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "authTypes", msg)); + throw new InvalidInputException("authTypes"); } } } @@ -385,22 +637,19 @@ public boolean phoneValidator(String phone) { public boolean emailValidator(String email) { return email.matches(emailRegex); } - - private boolean validateIndividualId(String individualId, String individualIdType) { - boolean validation = false; - try { - if (individualIdType.equalsIgnoreCase(IdType.UIN.toString())) { - validation = validateUin(individualId); - } else if (individualIdType.equalsIgnoreCase(IdType.VID.toString())) { - validation = validateVid(individualId); - } else if (individualIdType.equalsIgnoreCase(IdType.RID.toString())) { - // validation = ridValidator.validateId(individualId); //TODO Refer to https://mosip.atlassian.net/browse/MOSIP-18168 - RID Validation should be updated in the kernel validator. As of now, commenting only the validation part from resident service - validation = Boolean.TRUE; - } - } catch (InvalidIDException e) { - throw new InvalidInputException("individualId"); + + public void emailCharsValidator(String email) { + if (email.length() > emailCharsLimit) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + String.format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(), emailCharsLimit, email)); + } + } + + public void phoneCharsValidator(String phoneNo) { + if (phoneNo.length() > phoneCharsLimit) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + String.format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(), phoneCharsLimit, phoneNo)); } - return validation; } public boolean validateVid(String individualId) { @@ -419,173 +668,331 @@ public boolean validateUin(String individualId) { } } - public void validateVidRevokeRequest(RequestWrapper requestDto) { + public boolean validateRid(String individualId) { + try { + return ridValidator.validateId(individualId); + } catch (InvalidIDException e) { + return false; + } + } + + public void validateVidRevokeRequest(RequestWrapper requestDto, boolean isOtpValidationRequired, String individualId) { - validateRequestWrapper(requestDto,"Request to revoke VID"); + validateRevokeVidRequestWrapper(requestDto,"Request to revoke VID"); if (StringUtils.isEmpty(requestDto.getRequest().getVidStatus()) || !requestDto.getRequest().getVidStatus().equalsIgnoreCase("REVOKED")) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "vidStatus", "Request to revoke VID")); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "vidStatus", "Request to revoke VID")); throw new InvalidInputException("vidStatus"); } - if (StringUtils.isEmpty(requestDto.getRequest().getIndividualId()) - || (!validateIndividualId(requestDto.getRequest().getIndividualId(), IdType.VID.name()))) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", "Request to revoke VID")); - throw new InvalidInputException("individualId"); - } + if(requestDto.getRequest() instanceof VidRevokeRequestDTO) { + VidRevokeRequestDTO vidRevokeRequestDTO = (VidRevokeRequestDTO) requestDto.getRequest(); + if (StringUtils.isEmpty(vidRevokeRequestDTO.getIndividualId()) + || (!validateUinOrVid(vidRevokeRequestDTO.getIndividualId()))) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request to revoke VID")); + throw new InvalidInputException("individualId"); + } - if (StringUtils.isEmpty(requestDto.getRequest().getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request to revoke VID")); - throw new InvalidInputException("otp"); + if (isOtpValidationRequired && StringUtils.isEmpty(vidRevokeRequestDTO.getOtp())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request to revoke VID")); + throw new InvalidInputException(OTP); + } } if (StringUtils.isEmpty(requestDto.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", "Request to revoke VID")); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request to revoke VID")); throw new InvalidInputException("transactionId"); } } - public void validateRequestWrapper(RequestWrapper request,String msg) { + public void validateRevokeVidRequestWrapper(RequestWrapper request,String msg) { if (StringUtils.isEmpty(request.getId()) || !request.getId().equalsIgnoreCase(revokeVidId)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "id", msg)); - throw new InvalidInputException("id"); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "revokeVidId", msg)); + throw new InvalidInputException("revokeVidId"); } try { DateUtils.parseToLocalDateTime(request.getRequesttime()); } catch (Exception e) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "requesttime", msg)); - throw new InvalidInputException("requesttime"); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, msg)); + throw new InvalidInputException(REQUESTTIME); } if (StringUtils.isEmpty(request.getVersion()) || !request.getVersion().equalsIgnoreCase(version)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "version", msg)); - throw new InvalidInputException("version"); + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, VERSION, msg)); + throw new InvalidInputException(VERSION); } if (request.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException(REQUEST); + } + } + + public void validateVidRevokeV2Request(RequestWrapper requestDto, boolean isOtpValidationRequired, String individualId) { + + validateRevokeVidV2RequestWrapper(requestDto,"Request to revoke VID"); + + if (StringUtils.isEmpty(requestDto.getRequest().getVidStatus()) + || !requestDto.getRequest().getVidStatus().equalsIgnoreCase("REVOKED")) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "vidStatus", "Request to revoke VID")); + throw new InvalidInputException("vidStatus"); + } + + if(requestDto.getRequest() instanceof VidRevokeRequestDTO) { + VidRevokeRequestDTO vidRevokeRequestDTO = (VidRevokeRequestDTO) requestDto.getRequest(); + if (StringUtils.isEmpty(vidRevokeRequestDTO.getIndividualId()) + || (!validateUinOrVid(vidRevokeRequestDTO.getIndividualId()))) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request to revoke VID")); + throw new InvalidInputException("individualId"); + } + + if (isOtpValidationRequired && StringUtils.isEmpty(vidRevokeRequestDTO.getOtp())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request to revoke VID")); + throw new InvalidInputException(OTP); + } + } + + if (isOtpValidationRequired && StringUtils.isEmpty(requestDto.getRequest().getTransactionID())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request to revoke VID")); + throw new InvalidInputException("transactionId"); + } + } + + public void validateRevokeVidV2RequestWrapper(RequestWrapper requestWrapper,String msg) { + + if (StringUtils.isEmpty(requestWrapper.getId()) || !requestWrapper.getId().equalsIgnoreCase(revokeVidIdNew)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "revokeVidIdNew", msg)); + throw new InvalidInputException("revokeVidIdNew"); + } + try { + DateUtils.parseToLocalDateTime(requestWrapper.getRequesttime()); + } catch (Exception e) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, msg)); + throw new InvalidInputException(REQUESTTIME); } + + if (StringUtils.isEmpty(requestWrapper.getVersion()) || !requestWrapper.getVersion().equalsIgnoreCase(revokeVidVersion)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "revokeVidVersion", msg)); + throw new InvalidInputException("revokeVidVersion"); + } + validateAPIRequestToCheckNull(requestWrapper); } public boolean validateRequest(RequestWrapper request, RequestIdType requestIdType) { if (StringUtils.isEmpty(request.getId()) || !request.getId().equals(map.get(requestIdType))) - throw new InvalidInputException("id"); + throw new InvalidInputException(ID); try { DateUtils.parseToLocalDateTime(request.getRequesttime()); } catch (Exception e) { - throw new InvalidInputException("requesttime"); + throw new InvalidInputException(REQUESTTIME); } if (StringUtils.isEmpty(request.getVersion()) || !request.getVersion().equals(version)) - throw new InvalidInputException("version"); + throw new InvalidInputException(VERSION); + + if (request.getRequest() == null) { + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException(REQUEST); + } return true; } - public static boolean isNumeric(String strNum) { - try { - Integer.parseInt(strNum); - } catch (NumberFormatException nfe) { - return false; - } - return true; + public boolean isNumeric(String strNum) { + return strNum.matches(numericDataRegex); } public void validateReprintRequest(RequestWrapper requestDTO) { validateRequest(requestDTO, RequestIdType.RE_PRINT_ID); - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); - } - validateIndividualIdType(requestDTO.getRequest().getIndividualIdType(), "Request for print UIN API"); if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) - || !validateIndividualId(requestDTO.getRequest().getIndividualId(), - requestDTO.getRequest().getIndividualIdType())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", + || (!validateUinOrVid(requestDTO.getRequest().getIndividualId()))) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request for print UIN API")); throw new InvalidInputException("individualId"); } if (StringUtils.isEmpty(requestDTO.getRequest().getCardType()) || (!requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.UIN.name()) - && !requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.MASKED_UIN.name()))) { + && !requestDTO.getRequest().getCardType().equalsIgnoreCase(CardType.MASKED_UIN.name()))) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "cardType", "Request for print UIN API")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "cardType", "Request for print UIN API")); throw new InvalidInputException("cardType"); } if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request for print UIN API")); - throw new InvalidInputException("otp"); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request for print UIN API")); + throw new InvalidInputException(OTP); } if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request for print UIN API")); throw new InvalidInputException("transactionId"); } } - public void validateUpdateRequest(RequestWrapper requestDTO) { - validateRequest(requestDTO, RequestIdType.RES_UPDATE); + public void validateUpdateRequest(RequestWrapper requestDTO, boolean isPatch, String schemaJson) throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + if (!isPatch) { + validateRequest(requestDTO, RequestIdType.RES_UPDATE); + validateIndividualIdType(requestDTO.getRequest().getIndividualIdType(), "Request for update uin"); + if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) + || (!validateUinOrVid(requestDTO.getRequest().getIndividualId()))) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", + "Request for update uin")); + throw new InvalidInputException("individualId"); + } + } else { + validateRequestNewApi(requestDTO, RequestIdType.RES_UPDATE); + validateUinOrVid(requestDTO.getRequest().getIndividualId()); + validateAttributeName(requestDTO.getRequest().getIdentity(), schemaJson); + validateLanguageCodeInIdentityJson(requestDTO.getRequest().getIdentity()); + } + if (!isPatch && StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request for update uin")); + throw new InvalidInputException(OTP); + } + + if(requestDTO.getRequest().getIdentity()!=null) { + List attributesWithoutDocumentsRequired = new ArrayList<>(); + try { + Map identityMappingMap = residentConfigService.getIdentityMappingMap(); + if (attributeNamesWithoutDocumentsRequired != null) { + attributesWithoutDocumentsRequired = Stream + .of(attributeNamesWithoutDocumentsRequired + .split(ResidentConstants.ATTRIBUTE_LIST_DELIMITER)) + .filter(attribute -> identityMappingMap.containsKey(attribute)) + .map(attribute -> String + .valueOf(((Map) identityMappingMap.get(attribute)).get(ResidentConstants.VALUE))) + .collect(Collectors.toList()); + } + + } catch (ResidentServiceCheckedException | IOException e) { + throw new RuntimeException(e); + } + Map identityDataFromRequest = requestDTO.getRequest().getIdentity(); + List attributeKeysFromRequest = identityDataFromRequest.keySet().stream().collect(Collectors.toList()); + // checking if the attributes coming from request body present in attributes list coming from properties + if(!attributesWithoutDocumentsRequired.containsAll(attributeKeysFromRequest)) { + validateTransactionId(requestDTO.getRequest().getTransactionID()); + } + } else { + if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionID", + "Request for update uin")); + throw new InvalidInputException("transactionID"); + } + } - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); + if(!isPatch) { + if (requestDTO.getRequest().getIdentityJson() == null || requestDTO.getRequest().getIdentityJson().isEmpty()) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "identityJson", "Request for update uin")); + throw new InvalidInputException("identityJson"); + } } + } - validateIndividualIdType(requestDTO.getRequest().getIndividualIdType(), "Request for update uin"); - if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) - || !validateIndividualId(requestDTO.getRequest().getIndividualId(), - requestDTO.getRequest().getIndividualIdType())) { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", "Request for update uin")); - throw new InvalidInputException("individualId"); + public void validateNewUpdateRequest() throws ResidentServiceCheckedException, ApisResourceAccessException { + if(Utility.isSecureSession()){ + validatePendingDraft(); } - if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { - audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", "Request for update uin")); - throw new InvalidInputException("otp"); + } + + public void validateUpdateCountLimit(Set identity) throws ResidentServiceCheckedException { + Set attributesHavingLimitExceeded = new HashSet<>(); + if(!identity.isEmpty()) { + ResponseWrapper responseWrapper = idRepoService.getRemainingUpdateCountByIndividualId(List.of()); + AttributeListDto attributeListDto = objectMapper.convertValue(responseWrapper.getResponse(), AttributeListDto.class); + + attributesHavingLimitExceeded = attributeListDto.getAttributes().stream() + .filter(updateCountDto -> identity.contains(updateCountDto.getAttributeName()) + && updateCountDto.getNoOfUpdatesLeft() == ResidentConstants.ZERO) + .map(UpdateCountDto::getAttributeName) + .collect(Collectors.toSet()); + + } + if (!attributesHavingLimitExceeded.isEmpty()) { + String exceededAttributes = String.join(ResidentConstants.COMMA, attributesHavingLimitExceeded); + throw new ResidentServiceCheckedException(ResidentErrorCode.UPDATE_COUNT_LIMIT_EXCEEDED.getErrorCode(), + String.format(ResidentErrorCode.UPDATE_COUNT_LIMIT_EXCEEDED.getErrorMessage(), exceededAttributes)); } + } - if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", - "Request for update uin")); - throw new InvalidInputException("transactionId"); + private void validatePendingDraft() throws ResidentServiceCheckedException { + ResponseWrapper getPendingDraftResponseDto= idRepoService.getPendingDrafts(null); + if(!getPendingDraftResponseDto.getResponse().getDrafts().isEmpty()){ + List draftResidentResponseDto = getPendingDraftResponseDto.getResponse().getDrafts(); + for(DraftUinResidentResponseDto uinResidentResponseDto : draftResidentResponseDto){ + if(uinResidentResponseDto.isCancellable()){ + throw new ResidentServiceCheckedException(ResidentErrorCode.NOT_ALLOWED_TO_UPDATE_UIN_PENDING_PACKET); + } else { + throw new ResidentServiceCheckedException(ResidentErrorCode.NOT_ALLOWED_TO_UPDATE_UIN_PENDING_REQUEST); + } + } } + } - if (requestDTO.getRequest().getIdentityJson() == null || requestDTO.getRequest().getIdentityJson().isEmpty()) { + private void validateAttributeName(JSONObject identity, String schemaJson) { + boolean status = false; + if (identity != null && schemaJson!=null) { + status = identity.keySet().stream() + .filter(key -> !Objects.equals(key, ID_SCHEMA_VERSION)) + .anyMatch(key -> schemaJson.contains(key.toString())); + } + if (!status) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "identityJson", "Request for update uin")); - throw new InvalidInputException("identityJson"); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + "identityJson", "Request for update uin")); + throw new InvalidInputException("identity"); } } - public void validateRequestDTO(RequestWrapper requestDTO) { - validateRequest(requestDTO, RequestIdType.CHECK_STATUS); - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); + private void validateLanguageCodeInIdentityJson(JSONObject identity) { + if(identity!=null) { + // Get a set of entries + for (Map.Entry entry : (Iterable) identity.entrySet()) { + // Retrieve the key and value of each entry + String key = (String) entry.getKey(); + Object value = entry.getValue(); + if (value instanceof ArrayList) { + ArrayList valueArray = (ArrayList) value; + for (Object valueInList : valueArray) { + if (valueInList instanceof Map) { + Map valueInListMap = (Map ) valueInList; + if (valueInListMap.containsKey(ResidentConstants.LANGUAGE)) { + String languageCode = valueInListMap.get(ResidentConstants.LANGUAGE); + validateMissingInputParameter(languageCode, ResidentConstants.LANGUAGE, AuditEnum.INPUT_INVALID.getName()); + validateLanguageCode(languageCode); + String valueOfLanguageCode = valueInListMap.get(ResidentConstants.VALUE); + validateMissingInputParameter(valueOfLanguageCode, key+" "+languageCode+ " "+ + ResidentConstants.LANGUAGE +" "+ ResidentConstants.VALUE, AuditEnum.INPUT_INVALID.getName()); + } + } + } + } + } } + } + + public void validateRidCheckStatusRequestDTO(RequestWrapper requestDTO) { + validateRequest(requestDTO, RequestIdType.CHECK_STATUS); if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualIdType()) || (!requestDTO.getRequest().getIndividualIdType().equalsIgnoreCase(IdType.RID.name()))) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individual type", "get RID status")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individual type", "get RID status")); throw new InvalidInputException("individualIdType"); } - if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId()) - || !validateIndividualId(requestDTO.getRequest().getIndividualId(), - requestDTO.getRequest().getIndividualIdType())) { + if (StringUtils.isEmpty(requestDTO.getRequest().getIndividualId())) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individual Id", "get RID status")); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individual Id", "get RID status")); throw new InvalidInputException("individualId"); } @@ -595,43 +1002,44 @@ private void validateIndividualIdType(String individualIdType, String typeofRequ if (StringUtils.isEmpty(individualIdType) || (!individualIdType.equalsIgnoreCase(IdType.UIN.name()) && !individualIdType.equalsIgnoreCase(IdType.VID.name()))) { audit.setAuditRequestDto( - EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individual type", typeofRequest)); + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individual type", typeofRequest)); throw new InvalidInputException("individualIdType"); } } public void validateAuthUnlockRequest(RequestWrapper requestDTO, - AuthTypeStatus authTypeStatus) { - + AuthTypeStatus authTypeStatus) { validateRequest(requestDTO, RequestIdType.AUTH_UNLOCK_ID); - if (requestDTO.getRequest() == null) { - audit.setAuditRequestDto(EventEnum.INPUT_DOESNT_EXISTS); - throw new InvalidInputException("request"); - } - String individualId = requestDTO.getRequest().getIndividualId(); if (StringUtils.isEmpty(individualId) - || !validateIdvIdWithoutIdTypeForAuthStatusRequests(individualId)) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "individualId", + || !validateUinOrVid(individualId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); throw new InvalidInputException("individualId"); } if (StringUtils.isEmpty(requestDTO.getRequest().getOtp())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "otp", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, OTP, "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); - throw new InvalidInputException("otp"); + throw new InvalidInputException(OTP); } if (StringUtils.isEmpty(requestDTO.getRequest().getTransactionID())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "transactionId", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "transactionId", "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); throw new InvalidInputException("transactionId"); } - validateAuthType(requestDTO.getRequest().getAuthType(), + List authTypesList = new ArrayList(); + if (requestDTO.getRequest().getAuthType() != null && !requestDTO.getRequest().getAuthType().isEmpty()) { + for(String authType:requestDTO.getRequest().getAuthType()) { + String authTypeString = ResidentServiceImpl.getAuthTypeBasedOnConfig(authType); + authTypesList.add(authTypeString); + } + } + validateAuthType(authTypesList, "Request auth " + authTypeStatus.toString().toLowerCase() + " API"); if (StringUtils.isEmpty(requestDTO.getRequest().getUnlockForSeconds()) || !isNumeric(requestDTO.getRequest().getUnlockForSeconds())) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, "unlockForSeconds", + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "unlockForSeconds", "Request auth " + authTypeStatus.toString().toLowerCase() + " API")); throw new InvalidInputException("UnlockForSeconds must be greater than or equal to 0"); } @@ -644,7 +1052,7 @@ public void validateAuthUnlockRequest(RequestWrapper reque private void validateUnlockForSeconds(Long unlockForSeconds, String message) { if (unlockForSeconds != null) { if (unlockForSeconds < 0) { - audit.setAuditRequestDto(EventEnum.getEventEnumWithValue(EventEnum.INPUT_INVALID, + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "UnlockForSeconds must be greater than or equal to 0", message)); throw new InvalidInputException("UnlockForSeconds must be greater than or equal to 0"); } @@ -652,11 +1060,537 @@ private void validateUnlockForSeconds(Long unlockForSeconds, String message) { } } - private boolean validateIdvIdWithoutIdTypeForAuthStatusRequests(String individualId) { + private boolean validateUinOrVid(String individualId) { + return this.validateUin(individualId) || this.validateVid(individualId); + } + + public void validateAidStatusRequestDto(RequestWrapper reqDto) throws ResidentServiceCheckedException { + validateRequestNewApi(reqDto, RequestIdType.CHECK_STATUS); + validateTransactionId(reqDto.getRequest().getTransactionId()); + validateIndividualIdV2(reqDto.getRequest().getIndividualId(), "AID status"); + validateOTP(reqDto.getRequest().getOtp()); + } + + public void validateChannelVerificationStatus(String channel, String individualId) { + if (StringUtils.isEmpty(channel) || !channel.equalsIgnoreCase(PHONE_CHANNEL) + && !channel.equalsIgnoreCase(EMAIL_CHANNEL) ) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "channel", "Request channel verification API")); + throw new InvalidInputException("channel"); + } + if (StringUtils.isEmpty(individualId) || !validateUinOrVid(individualId)) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Request channel verification API")); + throw new ResidentServiceException(ResidentErrorCode.INVALID_UIN_VID_ENTERED.getErrorCode(), + ResidentErrorCode.INVALID_UIN_VID_ENTERED.getErrorMessage()); + } + if (individualId.length() > vidLength) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + String.format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(),vidLength,individualId)); + } + } + + public void validateServiceHistoryRequest(LocalDate fromDateTime, LocalDate toDateTime, String sortType, + String serviceType, String statusFilter, String langCode, String searchText) { + validateLanguageCode(langCode); + validateServiceType(serviceType, "Request service history API"); + validateSortType(sortType, "Request service history API"); + validateStatusFilter(statusFilter, "Request service history API"); + validateFromDateTimeToDateTime(fromDateTime, toDateTime, "Request service history API"); + if (!isValidDate(fromDateTime) || !isValidDate(toDateTime)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "fromDateTime", + "Request service history API")); + throw new InvalidInputException("DateTime"); + } + validateSearchText(searchText); + } + + public void validateSearchText(String searchText) { + if (searchText != null) { + if (searchText.length() > searchTextLength) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), String + .format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(),searchTextLength,searchText)); + } + } + } + + public void validateFromDateTimeToDateTime(LocalDate fromDateTime, LocalDate toDateTime, String request_service_history_api) { + + if(fromDateTime == null && toDateTime != null || + fromDateTime!=null && toDateTime!=null && fromDateTime.isAfter(toDateTime)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, ResidentConstants.FROM_DATE_TIME, + request_service_history_api)); + throw new InvalidInputException(ResidentConstants.FROM_DATE_TIME); + } else if(fromDateTime != null && toDateTime == null) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, ResidentConstants.TO_DATE_TIME, + request_service_history_api)); + throw new InvalidInputException(ResidentConstants.TO_DATE_TIME); + } + } + + private void validateStatusFilter(String statusFilter, String request_service_history_api) { + if(statusFilter != null) { + List statusFilterList = Arrays.asList(statusFilter.split(",")); + for (String status : statusFilterList) { + if (EventStatus.getEventStatusForText(status).isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "statusFilter", + request_service_history_api)); + throw new InvalidInputException("statusFilter"); + } + } + } + } + + private boolean isValidDate(LocalDate localDateTime) { + if(localDateTime!=null) { + if (localDateTime.getYear() < 0 || localDateTime.getMonthValue() < 0 || localDateTime.getDayOfMonth() < 0) { + return false; + } + } + return true; + } + + private void validateSortType(String sortType, String requestServiceHistoryApi) { + if(sortType!=null) { + if (!sortType.equalsIgnoreCase(SortType.ASC.toString()) + && !sortType.equalsIgnoreCase(SortType.DESC.toString())) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "sortType", + requestServiceHistoryApi)); + throw new InvalidInputException("sortType"); + } + } + } + + private void validateServiceType(String serviceType, String requestServiceHistoryApi) { + if(serviceType!=null) { + List serviceTypes = List.of(serviceType.split(",")); + for (String service : serviceTypes) { + Optional serviceOptional = ServiceType.getServiceTypeFromString(service); + if(serviceOptional.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "serviceType", + requestServiceHistoryApi)); + throw new InvalidInputException("serviceType"); + } + } + } + } + + public void validateSchemaType(String schemaType) { + Optional uiSchemaTypeOptional = UISchemaTypes.getUISchemaTypeFromString(schemaType); + if (uiSchemaTypeOptional.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + ResidentConstants.SCHEMA_TYPE, "Validating schema type")); + throw new InvalidInputException(ResidentConstants.SCHEMA_TYPE + ". Valid values are " + + UISchemaTypes.getUISchemaTypesList().stream().collect(Collectors.joining(", "))); + } + } + + public void validateEventId(String eventId) { + validateMissingInputParameter(eventId, TemplateVariablesConstants.EVENT_ID, VALIDATE_EVENT_ID); + if (!isDataValidWithRegex(eventId, eventIdRegex)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + TemplateVariablesConstants.EVENT_ID, VALIDATE_EVENT_ID)); + throw new InvalidInputException(TemplateVariablesConstants.EVENT_ID); + } + } + + private void validateMissingInputParameter(String variableValue, String variableName, String eventEnumName) { + if (variableValue==null || variableValue.trim().isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + variableName, eventEnumName)); + throw new ResidentServiceException(ResidentErrorCode.MISSING_INPUT_PARAMETER, variableName); + } + } + + public void validateOtpCharLimit(String otp) { + if (otp.length() > otpLength) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + String.format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(),otpLength,otp)); + } + } + + public void validateEventIdLanguageCode(String eventId, String languageCode) { + validateEventId(eventId); + validateLanguageCode(languageCode); + } + + public void validateLanguageCode(String languageCode) { + List allowedMandatoryLanguage = List.of(mandatoryLanguages.split(",")); + List allowedOptionalLanguage = List.of(optionalLanguages.split(",")); + if(StringUtils.isEmpty(languageCode)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "languageCode", "Request service history API")); + throw new InvalidInputException("languageCode"); + } + if(!allowedMandatoryLanguage.contains(languageCode) && !allowedOptionalLanguage.contains(languageCode)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INVALID_LANGUAGE_CODE, "languageCode", "Request service history API")); + throw new InvalidInputException("languageCode"); + } + } + + public void validateId(io.mosip.preregistration.core.common.dto.MainRequestDTO requestDTO) { + if (Objects.nonNull(requestDTO.getId())) { + if (!requestDTO.getId().equals(transliterateId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, ID, "Invalid Transliterate id")); + throw new InvalidInputException(ID); + } + } else { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, ID, "id is null")); + throw new InvalidInputException(ID); + } + if (requestDTO.getRequest().getFromFieldLang().equalsIgnoreCase(requestDTO.getRequest().getToFieldLang())) { + throw new InvalidInputException("'from' and 'to' languages cannot be same"); + } + } + + public List validateUserIdAndTransactionId(String userId, String transactionID) { + validateTransactionId(transactionID); + List list = new ArrayList<>(); + if (userId == null || userId.isEmpty()) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "userId", "userId is null")); + throw new InvalidInputException("userId"); + } + if (phoneValidator(userId)) { + list.add(mobileChannel); + return list; + } else if (emailValidator(userId)) { + list.add(emailChannel); + return list; + } + throw new InvalidInputException("userId"); + } + + public void validateTransactionId(String transactionID) { + if(transactionID== null || transactionID.isEmpty()){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + "transactionId", "transactionId must not be null")); + throw new InvalidInputException("transactionId"); + } else if(!isDataValidWithRegex(transactionID, transactionIdRegex)){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + "transactionId", "transactionId must be 10 digit containing numbers")); + throw new InvalidInputException("transactionId"); + } + } + + private boolean isDataValidWithRegex(String inputData, String regex) { + return inputData.matches(regex); + } + + public void validateProxySendOtpRequest(MainRequestDTO userOtpRequest, IdentityDTO identityDTO) throws ApisResourceAccessException, ResidentServiceCheckedException { + validateRequestType(userOtpRequest.getId(), this.environment.getProperty(ResidentConstants.RESIDENT_CONTACT_DETAILS_SEND_OTP_ID), ID); + validateVersion(userOtpRequest.getVersion()); + validateDate(userOtpRequest.getRequesttime()); + List identity = validateUserIdAndTransactionId(userOtpRequest.getRequest().getUserId(), userOtpRequest.getRequest().getTransactionId()); + validateSameUserId(userOtpRequest.getRequest().getUserId(), identityDTO); + if(!identity.isEmpty() && identity.get(ResidentConstants.ZERO)!=null){ + validateUpdateCountLimit(new HashSet<>(identity)); + } + validateNewUpdateRequest(); + } + + private void validateSameUserId(String userId, IdentityDTO identityDTO) { + if(phoneValidator(userId)){ + String phone = identityDTO.getPhone(); + if(phone!=null && phone.equalsIgnoreCase(userId)) { + throw new ResidentServiceException(ResidentErrorCode.SAME_PHONE_ERROR, + ResidentErrorCode.SAME_PHONE_ERROR.getErrorMessage()); + } + } else { + String email = identityDTO.getEmail(); + if(email!=null && email.equalsIgnoreCase(userId)){ + throw new ResidentServiceException(ResidentErrorCode.SAME_EMAIL_ERROR, + ResidentErrorCode.SAME_EMAIL_ERROR.getErrorMessage()); + } + } + } + + public void validateUpdateDataRequest(MainRequestDTO userIdOtpRequest) { + String inputRequestId = userIdOtpRequest.getId(); + String requestIdStoredInProperty = this.environment.getProperty(ResidentConstants.RESIDENT_CONTACT_DETAILS_UPDATE_ID); + validateRequestType(inputRequestId, requestIdStoredInProperty, ID); + validateVersion(userIdOtpRequest.getVersion()); + validateRequestTime(userIdOtpRequest.getRequesttime()); + validateUserIdAndTransactionId(userIdOtpRequest.getRequest().getUserId(), userIdOtpRequest.getRequest().getTransactionId()); + validateOTP(userIdOtpRequest.getRequest().getOtp()); + } + + public void validateRequestTime(Date requestTime) { + String localDateTime =DateUtils.getUTCCurrentDateTimeString(); + Date afterDate = Date.from(Instant.parse(localDateTime).plusSeconds(Long.parseLong( + Objects.requireNonNull(this.environment.getProperty(ResidentConstants.RESIDENT_FUTURE_TIME_LIMIT))))); + Date beforeDate = Date.from(Instant.parse(localDateTime).minusSeconds(Long.parseLong( + Objects.requireNonNull(this.environment.getProperty(ResidentConstants.RESIDENT_PAST_TIME_LIMIT))))); + if(requestTime==null || requestTime.after(afterDate) || requestTime.before(beforeDate)) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, "Request time invalid")); + throw new InvalidInputException(REQUESTTIME); + } + } + + public void validateOTP(String otp) { + if(otp==null){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + OTP, "otp must not be null")); + throw new InvalidInputException(OTP); + } else if (!isNumeric(otp) || otp.length() != otpLength){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + OTP, "otp is invalid")); + throw new InvalidInputException(OTP); + } + } + + public void validateRequestType(String inputRequestType, String requestTypeStoredInProperty, String type) { + if(inputRequestType==null){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + "request "+type, type+" must not be null")); + throw new InvalidInputException(type); + } else if(!inputRequestType.equalsIgnoreCase(requestTypeStoredInProperty)){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + "request "+type, type+" is invalid")); + throw new InvalidInputException(type); + } + } + + public void validateDate(Date requesttime) { + if(requesttime==null) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, REQUESTTIME, "Request time invalid")); + throw new InvalidInputException(REQUESTTIME); + } + } + + public void validateDownloadCardRequest(MainRequestDTO downloadCardRequestDTOMainRequestDTO) { + validateRequestType(downloadCardRequestDTOMainRequestDTO.getId(), this.environment.getProperty(ResidentConstants.DOWNLOAD_UIN_CARD_ID), ID); + validateDate(downloadCardRequestDTOMainRequestDTO.getRequesttime()); + validateTransactionId(downloadCardRequestDTOMainRequestDTO.getRequest().getTransactionId()); + validateOTP(downloadCardRequestDTOMainRequestDTO.getRequest().getOtp()); + String individualId = downloadCardRequestDTOMainRequestDTO.getRequest().getIndividualId(); + validateMissingInputParameter(individualId, TemplateVariablesConstants.INDIVIDUAL_ID, "Validation IndividualId"); + validateIndividualIdV2(individualId, "Request Download Card Request"); + } + + public void validateAidStatusIndividualId(String individualId) { + validateIndividualIdV2(individualId, "AID status"); + } + + private void validateIndividualIdV2(String individualId, String eventName) { + if (individualId == null || StringUtils.isEmpty(individualId) || !validateIndividualId(individualId)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", + eventName)); + throw new InvalidInputException("individualId"); + } + } + + private boolean validateIndividualId(String individualId) { + return individualId.matches(idAllowedSpecialCharRegex); + } + + public void validateDownloadPersonalizedCard(MainRequestDTO downloadPersonalizedCardMainRequestDTO) { + validateRequestType(downloadPersonalizedCardMainRequestDTO.getId(), + this.environment.getProperty(ResidentConstants.MOSIP_RESIDENT_DOWNLOAD_PERSONALIZED_CARD_ID), ID); + validateVersion(downloadPersonalizedCardMainRequestDTO.getVersion()); + validateDate(downloadPersonalizedCardMainRequestDTO.getRequesttime()); + validateString(downloadPersonalizedCardMainRequestDTO.getRequest().getHtml(), "html"); + validateEncodedString(downloadPersonalizedCardMainRequestDTO.getRequest().getHtml()); + validateAttributeList(downloadPersonalizedCardMainRequestDTO.getRequest().getAttributes()); + } + + private void validateAttributeList(List attributes) { + if (attributes == null || attributes.isEmpty()) { + throw new InvalidInputException(TemplateVariablesConstants.ATTRIBUTES); + } + } + + public void validateVersion(String requestVersion) { + if (StringUtils.isEmpty(requestVersion) || !requestVersion.equals(reqResVersion)) + throw new InvalidInputException(VERSION); + } + + private void validateEncodedString(String html) { + try{ + CryptoUtil.decodePlainBase64(html); + }catch (Exception e){ + audit.setAuditRequestDto(AuditEnum.INPUT_INVALID); + throw new InvalidInputException("html", e); + } + } + + private void validateString(String string, String variableName) { + if(string == null || string.trim().isEmpty()) { + audit.setAuditRequestDto(AuditEnum.INPUT_INVALID); + throw new InvalidInputException(variableName); + } + } + + public void validateDownloadCardVid(String vid) { + if (!validateVid(vid)) { + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, IdType.VID.name())); + throw new InvalidInputException(IdType.VID.name()); + } + } + + public boolean validateRequestNewApi(RequestWrapper requestWrapper, RequestIdType requestIdType) { + if (StringUtils.isEmpty(requestWrapper.getId()) || !requestWrapper.getId().equals(map.get(requestIdType))) + throw new InvalidInputException(ID); try { - return this.validateUin(individualId) || this.validateVid(individualId); - } catch (InvalidIDException e) { - return false; + DateUtils.parseToLocalDateTime(requestWrapper.getRequesttime()); + } catch (Exception e) { + throw new InvalidInputException(REQUESTTIME); + } + if (StringUtils.isEmpty(requestWrapper.getVersion()) || !requestWrapper.getVersion().equals(reqResVersion)) + throw new InvalidInputException(VERSION); + + validateAPIRequestToCheckNull(requestWrapper); + return true; + } + + private void validateAPIRequestToCheckNull(RequestWrapper requestWrapper) { + if (requestWrapper.getRequest() == null) { + audit.setAuditRequestDto(AuditEnum.INPUT_DOESNT_EXISTS); + throw new InvalidInputException(REQUEST); + } + } + + public void validateReqCredentialRequest(RequestWrapper requestWrapper) { + validateAPIRequestToCheckNull(requestWrapper); + if (StringUtils.isEmpty(requestWrapper.getRequest().getIndividualId()) + || (!validateUinOrVid(requestWrapper.getRequest().getIndividualId()))) { + audit.setAuditRequestDto( + AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, "individualId", "Credential Request API")); + throw new InvalidInputException("individualId"); + } + validateDataToCheckNullOrEmpty(requestWrapper.getRequest().getCredentialType(), + ResidentConstants.CREDENTIAL_TYPE); + validateDataToCheckNullOrEmpty(requestWrapper.getRequest().getIssuer(), ResidentConstants.ISSUER); + validateDataToCheckNullOrEmpty(requestWrapper.getRequest().getOtp(), OTP); + validateDataToCheckNullOrEmpty(requestWrapper.getRequest().getTransactionID(), + ResidentConstants.TRANSACTION_ID_OLD); + } + + public void validateShareCredentialRequest(RequestWrapper requestDTO) { + validateRequestNewApi(requestDTO, RequestIdType.SHARE_CREDENTIAL); + validateSharableAttributes(requestDTO.getRequest().getSharableAttributes()); + validatePurpose(requestDTO.getRequest().getPurpose()); + validatePartnerId(requestDTO.getRequest().getPartnerId()); + } + + private void validatePartnerId(String partnerId) { + validateDataToCheckNullOrEmpty(partnerId, ResidentConstants.PARTNER_ID); + Map partnerDetail = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType( + partnerId, environment.getProperty(ResidentConstants.RESIDENT_SHARE_CREDENTIAL_PARTNER_TYPE, + ResidentConstants.AUTH_PARTNER)); + if(partnerDetail.isEmpty()) { + throw new ResidentServiceException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + ResidentErrorCode.INVALID_INPUT.getErrorMessage() + ResidentConstants.PARTNER_ID); + } + } + + private void validateDataToCheckNullOrEmpty(String variableValue, String variableName) { + if (StringUtils.isBlank(variableValue)) { + throw new ResidentServiceException(ResidentErrorCode.INVALID_INPUT.getErrorCode(), + ResidentErrorCode.INVALID_INPUT.getErrorMessage() + variableName); + } + } + + public void validateGrievanceRequestDto(MainRequestDTO grievanceRequestDTOMainRequestDTO) throws ResidentServiceCheckedException, ApisResourceAccessException { + validateRequestType(grievanceRequestDTOMainRequestDTO.getId(), + this.environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID), ID); + validateRequestType(grievanceRequestDTOMainRequestDTO.getVersion(), + this.environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION), VERSION); + validateDate(grievanceRequestDTOMainRequestDTO.getRequesttime()); + validateEventId(grievanceRequestDTOMainRequestDTO.getRequest().getEventId()); + validateEventIdBelongToSameSession(grievanceRequestDTOMainRequestDTO.getRequest().getEventId()); + validateEmailId(grievanceRequestDTOMainRequestDTO.getRequest().getEmailId()); + String alternateEmail = grievanceRequestDTOMainRequestDTO.getRequest().getAlternateEmailId(); + if(alternateEmail!=null){ + validateEmailId(alternateEmail); + } + String alternatePhone = grievanceRequestDTOMainRequestDTO.getRequest().getAlternatePhoneNo(); + if(alternatePhone!=null){ + validatePhoneNumber(alternatePhone); + } + validatePhoneNumber(grievanceRequestDTOMainRequestDTO.getRequest().getPhoneNo()); + validateMessage(grievanceRequestDTOMainRequestDTO.getRequest().getMessage()); + } + + private void validateMessage(String message) { + validateMissingInputParameter(message, MESSAGE_CODE, "Validating message"); + if (message.length() > messageCharsLimit) { + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + String.format(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage(),messageCharsLimit,message)); + } + if (!message.matches(messageAllowedSpecialCharRegex)) { + throw new ResidentServiceException(ResidentErrorCode.CONTAINS_SPECIAL_CHAR.getErrorCode(), + String.format(ResidentErrorCode.CONTAINS_SPECIAL_CHAR.getErrorMessage(),message)); + } + } + + private void validatePhoneNumber(String phoneNo) { + if (phoneNo != null) { + phoneCharsValidator(phoneNo); + if (!phoneValidator(phoneNo)) { + throw new InvalidInputException(PHONE_CHANNEL); + } + } + } + + private void validateEmailId(String emailId) { + if (emailId != null) { + emailCharsValidator(emailId); + if (!emailValidator(emailId)) { + throw new InvalidInputException(EMAIL_CHANNEL, EMAIL_CHANNEL + ResidentConstants.MUST_NOT_BE_EMPTY); + } + } + } + + private void validateEventIdBelongToSameSession(String eventId) throws ResidentServiceCheckedException, ApisResourceAccessException { + Optional residentTransactionEntity = residentTransactionRepository.findById(eventId); + if(residentTransactionEntity.isPresent()){ + String tokenId = residentTransactionEntity.get().getTokenId(); + String sessionToken = identityService.getResidentIdaToken(); + if(!tokenId.equals(sessionToken)){ + throw new EidNotBelongToSessionException(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION, + ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorMessage()); + } + } + } + + public void validateReqOtp(IndividualIdOtpRequestDTO individualIdRequestDto) { + validateIndividualIdV2(individualIdRequestDto.getIndividualId(), "Request OTp"); + validateTransactionId(individualIdRequestDto.getTransactionId()); + } + + public void validatePurpose(String purpose) { + validateMissingInputParameter(purpose, TemplateVariablesConstants.PURPOSE, "Validating purpose"); + if (purpose.length() > purposeCharsLimit) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_EXCEPTION); + throw new ResidentServiceException(ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorCode(), + ResidentErrorCode.CHAR_LIMIT_EXCEEDS.getErrorMessage()); + } + if (!purpose.matches(purposeAllowedSpecialCharRegex)) { + audit.setAuditRequestDto(AuditEnum.CREDENTIAL_REQ_EXCEPTION); + throw new ResidentServiceException(ResidentErrorCode.CONTAINS_SPECIAL_CHAR.getErrorCode(), + String.format(ResidentErrorCode.CONTAINS_SPECIAL_CHAR.getErrorMessage(), purpose)); + } + } + + public void validateSharableAttributes(List sharableAttributes) { + if(sharableAttributes.isEmpty()){ + audit.setAuditRequestDto(AuditEnum.getAuditEventWithValue(AuditEnum.INPUT_INVALID, + TemplateVariablesConstants.ATTRIBUTE_LIST, "Validating sharable attributes")); + throw new ResidentServiceException(ResidentErrorCode.MISSING_INPUT_PARAMETER, TemplateVariablesConstants.ATTRIBUTE_LIST); + } + } + + public void validateName(String name) throws ResidentServiceCheckedException { + if (StringUtils.isBlank(name)) { + throw new ResidentServiceCheckedException(ResidentErrorCode.INVALID_REG_CENTER_NAME.getErrorCode(), + ResidentErrorCode.INVALID_REG_CENTER_NAME.getErrorMessage()); + } + } + + public void validateProfileApiRequest(String languageCode) { + if (languageCode != null) { + validateLanguageCode(languageCode); } } -} +} \ No newline at end of file diff --git a/resident/resident-service/src/main/resources/application-local.properties b/resident/resident-service/src/main/resources/application-local.properties index e8956bdcb4d..e54600c5681 100644 --- a/resident/resident-service/src/main/resources/application-local.properties +++ b/resident/resident-service/src/main/resources/application-local.properties @@ -4,19 +4,23 @@ auth.internal.version=1.0 mosip.registration.processor.print.id=mosip.registration.print mosip.registration.processor.application.version=1.0 vid.create.id=mosip.vid.create -resident.vid.version=v1 -resident.vid.id=mosip.resident.vid +resident.vid.version=1.0 +resident.vid.id=mosip.resident.vid.generate +resident.vid.policy.id=mosip.resident.vid.policy +resident.vid.get.id=mosip.resident.vid.get vid.revoke.id=vid.revoke.id -resident.revokevid.id=mosip.resident.vidstatus +resident.revokevid.id=mosip.resident.vid.revoke auth.type.status.id=mosip.identity.authtype.status.update mosip.primary-language=eng mosip.secondary-language=fra mosip.notification.language-type=both config.server.file.storage.uri=https://qa.mosip.net/config/resident/mz/1.1.3/ registration.processor.identityjson=identity-mapping.json +mosip.resident.identity.auth.internal.id=mosip.identity.auth.internal resident.authlock.id=mosip.resident.authlock resident.checkstatus.id=mosip.resident.checkstatus +resident.checkstatus.version=v1 resident.euin.id=mosip.resident.euin resident.printuin.id=mosip.resident.printuin resident.uin.id=mosip.resident.uin @@ -34,6 +38,22 @@ PARTNER_REFERENCE_Id=mpartner-default-print DECRYPT_API_URL=https://qa.mosip.net/v1/keymanager/decrypt APPLICATION_Id=RESIDENT mosip.kernel.pdf_owner_password=123456 + +resident.ui.properties.id=resident.ui.properties +resident.ui.properties.version=1.0 +resident.channel.verification.status.id=mosip.resident.channel.verification.status +resident.channel.verification.status.version=1.0 +resident.document.get.id=mosip.resident.document.get +resident.document.get.version=1.0 +resident.event.ack.download.id=mosip.resident.event.ack.download +resident.event.ack.download.version=1.0 +resident.download.card.eventid.id =mosip.resident.download.card.eventid +resident.download.card.eventid.version=1.0 +resident.vid.version.new=1.0 +mosip.resident.checkstatus.individualid.id=mosip.resident.check-stage-status +resident.version.new=1.0 +mosip.resident.api.id.otp.request=mosip.identity.otp.internal +resident.attribute.names.without.documents.required=preferredLanguage,email,phone #-----------------------------RID Properties--------------------------------------- # length of the rid mosip.kernel.rid.length=29 @@ -206,7 +226,7 @@ REGISTRATIONSTATUSSEARCH=${dmz.ingress.base_url}/registrationprocessor/v1/regist resident.center.id=10001 #----------------------config data--------------------- resident.datetime.pattern=yyyy-MM-dd'T'HH:mm:ss.SSS'Z' -auth.types.allowed=demo,bio-Finger,bio-Iris,bio-FACE +auth.types.allowed=demo,bio-Finger,bio-Iris,bio-FACE,otp registration.processor.identityjson=identity-mapping.json @@ -253,4 +273,35 @@ mosip.kernel.machineid.length=5 packet.manager.account.name=PACKET_MANAGER_ACCOUNT objectstore.crypto.name=OnlinePacketCryptoServiceImpl mosip.commons.packetnames=id,evidence,optional -mosip.kernel.masterdata.audit-url=https://qa.mosip.net/v1/auditmanager/audits \ No newline at end of file +mosip.kernel.masterdata.audit-url=https://qa.mosip.net/v1/auditmanager/audits + +mosip.pms-partner-manager-service.url=https://dev.mosip.net +mosip.pms.pmp.partner.rest.uri=${mosip.pms-partner-manager-service.url}/v1/partnermanager/partners?partnerType=Online_Verification_Partner + +resident.authLockStatusUpdateV2.id=mosip.resident.auth.lock.status.update +resident.authLockStatusUpdateV2.version=1.0 + +#Validation properties +resident.grievance-redressal.alt-email.chars.limit=128 +resident.grievance-redressal.alt-phone.chars.limit=64 +resident.grievance-redressal.comments.chars.limit=1024 +resident.share-credential.purpose.chars.limit=1024 +mosip.resident.eventid.searchtext.length=16 +mosip.kernel.uin.length=10 +mosip.kernel.vid.length=16 +mosip.kernel.rid.length=29 +mosip.resident.eid.length=16 +mosip.kernel.otp.default-length=6 +resident.message.allowed.special.char.regex=^[A-Za-z0-9 .,-]+$ +resident.purpose.allowed.special.char.regex=^[A-Za-z0-9 .,-]+$ +resident.id.allowed.special.char.regex=^[0-9]+$ + +auth.token.header=Authorization + +# amr-acr JSON file name +amr-acr.json.filename=amr-acr-mapping.json + +mosip.resident.authentication.mode.property=authenticationMode +mosip.resident.download.card.naming.convention=Get_my_UIN + + diff --git a/resident/resident-service/src/main/resources/bootstrap.properties b/resident/resident-service/src/main/resources/bootstrap.properties index 4a5c4934aab..cc6f20acce1 100644 --- a/resident/resident-service/src/main/resources/bootstrap.properties +++ b/resident/resident-service/src/main/resources/bootstrap.properties @@ -4,7 +4,7 @@ spring.profiles.active=mz spring.cloud.config.name=application,resident spring.application.name=resident management.endpoint.health.show-details=always -management.endpoints.web.exposure.include=info,health,refresh +management.endpoints.web.exposure.include=info,health,refresh,prometheus,metric resident.service=resident config.server.file.storage.uri=${spring.cloud.config.uri}/${resident.service}/${spring.profiles.active}/${spring.cloud.config.label}/ server.port=8099 @@ -27,7 +27,8 @@ openapi.info.version=1.0 openapi.info.license.name=Mosip openapi.info.license.url=https://docs.mosip.io/platform/license -------OpenApi properties-------- +#------OpenApi properties-------- mosipbox.public.url=http://localhost:8099 openapi.residentServiceServer.servers[0].url=${mosipbox.public.url}/resident/v1 -openapi.residentServiceServer.servers[0].description=Resident Service \ No newline at end of file +openapi.residentServiceServer.servers[0].description=Resident Service +spring.devtools.restart.enabled = false diff --git a/resident/resident-service/src/main/resources/static/griveance.html b/resident/resident-service/src/main/resources/static/griveance.html new file mode 100644 index 00000000000..b1ae28ce262 --- /dev/null +++ b/resident/resident-service/src/main/resources/static/griveance.html @@ -0,0 +1,4 @@ + + +

    Redressal Page

    + \ No newline at end of file diff --git a/resident/resident-service/src/main/resources/templates/grievance.html b/resident/resident-service/src/main/resources/templates/grievance.html new file mode 100644 index 00000000000..8f2c0ebdd6a --- /dev/null +++ b/resident/resident-service/src/main/resources/templates/grievance.html @@ -0,0 +1,41 @@ + + + + + + + +

    Grievance

    +
    + + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + +

    + + + +

    + +

    + + + + + \ No newline at end of file diff --git a/resident/resident-service/src/main/resources/templates/payment-page.html b/resident/resident-service/src/main/resources/templates/payment-page.html new file mode 100644 index 00000000000..65ac64db85e --- /dev/null +++ b/resident/resident-service/src/main/resources/templates/payment-page.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

    Payment Page

    + +

    + +

    +

    + +

    +

    + +

    + +
    + + + + + +
    + + + + \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseLoggingAspectTest.java b/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseLoggingAspectTest.java new file mode 100644 index 00000000000..8bcfd7f8abd --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseLoggingAspectTest.java @@ -0,0 +1,50 @@ +package io.mosip.resident.aspect; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +/** + * @author Kamesh Shekhar Prasad + */ +public class DatabaseLoggingAspectTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testAroundAdvice3() throws Throwable { + DatabaseLoggingAspect databaseLoggingAspect = new DatabaseLoggingAspect(); + ProceedingJoinPoint proceedingJoinPoint = mock(ProceedingJoinPoint.class); + when(proceedingJoinPoint.proceed()).thenReturn("Proceed"); + when(proceedingJoinPoint.getSignature()).thenReturn(null); + assertEquals("Proceed", databaseLoggingAspect.aroundAdvice(proceedingJoinPoint)); + verify(proceedingJoinPoint).proceed(); + verify(proceedingJoinPoint, atLeast(1)).getSignature(); + } + + @Test + public void testAroundAdvice4() throws Throwable { + DatabaseLoggingAspect databaseLoggingAspect = new DatabaseLoggingAspect(); + ProceedingJoinPoint proceedingJoinPoint = mock(ProceedingJoinPoint.class); + when(proceedingJoinPoint.proceed()).thenThrow(new Throwable()); + when(proceedingJoinPoint.getSignature()).thenReturn(null); + thrown.expect(Throwable.class); + databaseLoggingAspect.aroundAdvice(proceedingJoinPoint); + verify(proceedingJoinPoint).proceed(); + verify(proceedingJoinPoint).getSignature(); + } + + @Test + public void testConstructor() { + (new DatabaseLoggingAspect()).loggableMethods(); + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseMetricsAspectTest.java b/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseMetricsAspectTest.java new file mode 100644 index 00000000000..53b44562ddb --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/aspect/DatabaseMetricsAspectTest.java @@ -0,0 +1,66 @@ +package io.mosip.resident.aspect; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.reflect.MethodSignature; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.context.WebApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + + +/** + * @author Kamesh Shekhar Prasad + */ +@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class}) +@RunWith(SpringRunner.class) +@WebMvcTest +@TestPropertySource(locations="classpath:application.properties") +public class DatabaseMetricsAspectTest { + + @InjectMocks + private DatabaseMetricsAspect databaseMetricsAspect; + + @Autowired + private MeterRegistry meterRegistry; + + @Before + public void init() { + ReflectionTestUtils.setField(databaseMetricsAspect, "registry", meterRegistry); + } + + @Test + public void testAroundAdvice() throws Throwable { + ProceedingJoinPoint proceedingJoinPoint = mock(ProceedingJoinPoint.class); + when(proceedingJoinPoint.proceed()).thenReturn("Proceed"); + Signature signature = mock(MethodSignature.class); + when(signature.toShortString()).thenReturn("mockedMethod()"); + when(proceedingJoinPoint.getSignature()).thenReturn(signature); + assertEquals("Proceed", databaseMetricsAspect.aroundAdvice(proceedingJoinPoint)); + } + + @TestConfiguration + static class AdditionalConfig { + @Bean + public MeterRegistry registry() { + return new SimpleMeterRegistry(); + } + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/aspect/LoginCheckTest.java b/resident/resident-service/src/test/java/io/mosip/resident/aspect/LoginCheckTest.java new file mode 100644 index 00000000000..ac2b20cda86 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/aspect/LoginCheckTest.java @@ -0,0 +1,210 @@ +package io.mosip.resident.aspect; + +import java.util.ArrayList; +import java.util.Collection; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentSessionRepository; +import io.mosip.resident.repository.ResidentUserRepository; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; + +/** + * Aspect test class for login redirect API + * + * @author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class LoginCheckTest { + + @InjectMocks + private LoginCheck loginCheck; + + @Mock + private ResidentUserRepository residentUserRepository; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + private HttpServletRequest request; + + @Mock + private HttpServletResponse response; + + @Mock + private ResidentSessionRepository residentSessionRepository; + + @Mock + private AuditUtil audit; + + @Mock + private ThreadPoolTaskScheduler taskScheduler; + + @Before + public void setup() throws ResidentServiceCheckedException, ApisResourceAccessException { + request = Mockito.mock(HttpServletRequest.class); + response = Mockito.mock(HttpServletResponse.class); + Collection cookies = new ArrayList<>(); + cookies.add( + "Authorization=eyJraWQiOiJxeS1YaFJCTFlRcy03eW9hQm1KaFRoQWpIck9GLUpFYUFtRjVDY0FKZ29rIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIyOTk2NjM5MDE0NzYzMjg2ODQ1MDU1OTI4ODcxNzAwNTc0MzgiLCJhdWQiOiJtb3NpcC1yZXNpZGVudC1vaWRjLWNsaWVudCIsInNjb3BlIjoiTWFuYWdlLUlkZW50aXR5LURhdGEgTWFuYWdlLVZJRCBNYW5hZ2UtQXV0aGVudGljYXRpb24gTWFuYWdlLVNlcnZpY2UtUmVxdWVzdHMgTWFuYWdlLUNyZWRlbnRpYWxzIiwiaXNzIjoiaHR0cHM6XC9cL2VzaWduZXQuZGV2Lm1vc2lwLm5ldFwvdjFcL2VzaWduZXQiLCJleHAiOjE2ODkwNjkzODMsImlhdCI6MTY4OTA2NTc4M30.tKwdc-7nR832u2X7KNI64zI4Wjr7ZMg3C0GYeZp7UxjHEj-Pj41ARYNxaSLvVM2W9sIuBCahymdA1d64J7pLse_IkJMZy-nvSEVscr1pLPF_m8KDywfC6iGCU-4sF9_ZCI98ZzkKCHRpAe02Ym2c91NFtgKjF5hTkJFwOEbNwXFCcQS6QHPNEzL87QFuW-Qu48SWS3Y2kvihfRQHQbkHxEeKfiAYUnUIznYn1BnEXZIpxbuuEuBhbJrtXX66ULtwmzCmvxOU90JLFmHOPlZuQVjFs2KwEpIIvzEd12436SA2mUecaNrNYZiFqXaFnXAmRqI-f9MJgFhwTubvMJ3N4Q; Max-Age=1800000; Expires=Thu, 10-Nov-2022 05:05:02 GMT; Path=/; HttpOnly"); + cookies.add("id_token=eyJhbGciOiJSUzI1NiIsInR5cCIg; Path=/; Secure; HttpOnly"); + Mockito.when(response.getHeaders(Mockito.anyString())).thenReturn(cookies); + Cookie[] requestCookies = new Cookie[1]; + Cookie cookie = new Cookie("Authorization", "eyJhbGciOiJSUzI1NiIsInR5cCIgO"); + requestCookies[0] = cookie; + Mockito.when(request.getCookies()).thenReturn(requestCookies); + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:WINDOWS"); + Mockito.when(identityServiceImpl.getResidentIdaTokenFromAccessToken(Mockito.anyString())).thenReturn("282452929935769234295"); + ReflectionTestUtils.setField(loginCheck, "authTokenHeader", "Authorization"); + Mockito.when(identityServiceImpl.createSessionId()).thenReturn("123"); + } + + @Test + public void tearDown() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(identityServiceImpl.createSessionId()).thenReturn(null); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void tearDownFailure() throws ResidentServiceCheckedException, ApisResourceAccessException { + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + @Test + public void testGetUserDetailsWithMac() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:Mac"); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void testGetUserDetailsWithX11() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:x11"); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void testGetUserDetailsWithAndroid() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:Android"); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void testGetUserDetailsWithIPhone() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:IPhone"); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void testGetUserDetailsWithUnKnownDevice() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("User-Agent:Unknown"); + loginCheck.getUserDetails("aHR0cHM6Ly9yZXNpZGVudC5kZ", "ce0dfae2-5dc3-4c2b", "733d8aa0-a53b-42e1", + "51a3f4c2-c029-490b.730-0c60476d94f2", "ce0dfae2-5dc3-4c2b", request, response); + } + + @Test + public void testOnLoginReqFailure(){ + loginCheck.onLoginReqFailure(null); + } + + @Test + public void testLogin(){ + loginCheck.login(); + } + + @Test + public void testLogoutUser(){ + loginCheck.logoutUser(); + } + + @Test + public void testValidateAdminToken(){ + loginCheck.validateAdminToken(); + } + + @Test + public void testOnValidateTokenFailureFailed(){ + loginCheck.onValidateTokenFailure(new RuntimeException()); + } + + @Test + public void testLoginRedirect(){ + loginCheck.loginRedirect(); + } + + @Test + public void testOnLoginReqSuccess(){ + loginCheck.onLoginReq(null, null, null, response); + } + + @Test + public void testOnLoginReq(){ + response.setStatus(300); + loginCheck.onLoginReq(null, null, null, response); + } + + @Test + public void testOnLoginFailure() { + loginCheck.onLoginFailure(null); + } + + @Test + public void testOnLogoutSuccess() throws ApisResourceAccessException { + response.setStatus(302); + loginCheck.onLogoutSuccess("abc", null, response); + } + + @Test + public void testOnLogoutFailure() { + loginCheck.onLogoutFailure(new RuntimeException()); + } + + @Test + public void testOnValidateTokenSuccess() { + loginCheck.onValidateTokenSuccess(request, response); + } + + @Test + public void testOnValidateTokenFailure() { + Cookie[] cookies1 = new Cookie[1]; + Cookie cookie = new Cookie("id_token", "eyJhbGciOiJSUzI1NiIsInR5cCIgO"); + cookies1[0] = cookie; + Mockito.when(request.getCookies()).thenReturn(cookies1); + loginCheck.onValidateTokenSuccess(request, response); + } + + @Test + public void testOnLoginReqV2(){ + response.setStatus(300); + loginCheck.onLoginReq(null, null, null, null, response); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJobTest.java b/resident/resident-service/src/test/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJobTest.java new file mode 100644 index 00000000000..6f9d895684b --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/batch/CredentialStatusUpdateBatchJobTest.java @@ -0,0 +1,391 @@ +package io.mosip.resident.batch; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.controller.ResidentController; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.RegStatusCheckResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.CredentialStatusUpdateHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.ResidentServiceRestClient; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.context.WebApplicationContext; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static io.mosip.resident.constant.EventStatusFailure.FAILED; +import static io.mosip.resident.constant.EventStatusInProgress.IN_TRANSIT; +import static io.mosip.resident.constant.EventStatusInProgress.ISSUED; +import static io.mosip.resident.constant.EventStatusInProgress.NEW; +import static io.mosip.resident.constant.EventStatusInProgress.PAYMENT_CONFIRMED; +import static io.mosip.resident.constant.EventStatusInProgress.PRINTING; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.when; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to test batch job. + */ +@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class}) +@RunWith(SpringRunner.class) +@WebMvcTest +public class CredentialStatusUpdateBatchJobTest { + + @InjectMocks + private CredentialStatusUpdateBatchJob job; + + @Mock + private ResidentTransactionRepository repo; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private ResidentController residentController; + + @Autowired + private Environment env; + + @Mock + private NotificationService notificationService; + + @Mock + private IdentityService identityService; + + @Mock + private ResidentService residentService; + + @Mock + private CredentialStatusUpdateHelper credentialStatusUpdateHelper; + + @Before + public void init() { + //ReflectionTestUtils.setField(job, "publicUrl", "http://localhost"); + ReflectionTestUtils.setField(job, "env", env); + ReflectionTestUtils.setField(job, "requestTypeCodesToProcessInBatchJob", List.of("UPDATE_MY_UIN")); + } + + @Test + public void testTrackAndUpdateNewOrIssuedStatusWithoutRID() throws ResidentServiceCheckedException, ApisResourceAccessException { + ArgumentCaptor argCaptor = ArgumentCaptor.forClass(ResidentTransactionEntity.class); + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTypeCode(RequestType.DOWNLOAD_PERSONALIZED_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testTrackAndUpdateNewOrIssuedStatusWithoutRIDException() throws ResidentServiceCheckedException, ApisResourceAccessException { + ArgumentCaptor argCaptor = ArgumentCaptor.forClass(ResidentTransactionEntity.class); + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTypeCode(RequestType.DOWNLOAD_PERSONALIZED_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenThrow(new ApisResourceAccessException()); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testScheduleCredentialStatusUpdateJobVidCardDownload() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(ISSUED.name()); + txn.setRequestTypeCode(RequestType.VID_CARD_DOWNLOAD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testScheduleCredentialStatusUpdateJobVidCardDownloadFailed() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(ISSUED.name()); + txn.setRequestTypeCode(RequestType.VID_CARD_DOWNLOAD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), + ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorMessage()))); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testScheduleCredentialStatusUpdateJobVidCardDownloadFailedApiResourceException() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTypeCode(RequestType.VID_CARD_DOWNLOAD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenThrow(new ApisResourceAccessException()); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void updateOrderPhysicalCardTxnStatusTest() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(PAYMENT_CONFIRMED.name()); + txn.setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void updateOrderPhysicalCardTxnStatusCodePrintingTest() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(PRINTING.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void updateOrderPhysicalCardTxnStatusCodeFailedTest() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(FAILED.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", FAILED.name(), "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void updateOrderPhysicalCardTxnStatusCodeFailedTestApiResourceException() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(FAILED.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", FAILED.name(), "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenThrow(new ApisResourceAccessException()); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void updateOrderPhysicalCardTxnStatusCodeFailedTest1() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(IN_TRANSIT.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), + ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorMessage()))); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateShareCredentialWithPartnerTxnStatus() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.SHARE_CRED_WITH_PARTNER.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateShareCredentialWithPartnerTxnStatusFailed() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(FAILED.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.SHARE_CRED_WITH_PARTNER.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", FAILED.name(), "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateShareCredentialWithPartnerTxnStatusFailedApiResourceException() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(FAILED.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", FAILED.name(), "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenThrow(new ApisResourceAccessException()); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateUinDemoDataUpdateTxnStatus() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setAid("123"); + txn.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.TEMPLATE_EXCEPTION.getErrorCode(), + ResidentErrorCode.TEMPLATE_EXCEPTION.getErrorMessage()))); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateUinDemoDataSuccess() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setAid("123"); + txn.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + txn.setCredentialRequestId(UUID.randomUUID().toString()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + when(identityService.getIdentity(Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + RegStatusCheckResponseDTO regStatusCheckResponseDTO = new RegStatusCheckResponseDTO(); + regStatusCheckResponseDTO.setRidStatus("123"); + when(residentService.getRidStatus(Mockito.anyString())).thenReturn(regStatusCheckResponseDTO); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } + + @Test + public void testUpdateUinDemoDataFailure() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResidentTransactionEntity txn = new ResidentTransactionEntity(); + txn.setAid("aid"); + txn.setEventId("eventId"); + txn.setRefIdType(IdType.UIN.name()); + txn.setStatusCode(NEW.name()); + txn.setRequestTrnId("123"); + txn.setIndividualId("123"); + txn.setAid("123"); + txn.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(Map.of("requestId", "requestId", "id", "id", "statusCode", "statusCode", "url", "url")); + when(residentServiceRestClient.getApi(any(), anyList(), anyList(), anyList(), any())).thenReturn(responseWrapper); + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + when(identityService.getIdentity(Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + RegStatusCheckResponseDTO regStatusCheckResponseDTO = new RegStatusCheckResponseDTO(); + regStatusCheckResponseDTO.setRidStatus("123"); + when(residentService.getRidStatus(Mockito.anyString())).thenReturn(regStatusCheckResponseDTO); + when(repo.findByStatusCodeInAndRequestTypeCodeInAndCredentialRequestIdIsNotNullOrderByCrDtimesAsc(anyList(), anyList())).thenReturn(List.of(txn)); + job.scheduleCredentialStatusUpdateJob(); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/config/ResidentServiceConfigTest.java b/resident/resident-service/src/test/java/io/mosip/resident/config/ResidentServiceConfigTest.java similarity index 76% rename from resident/resident-service/src/test/java/io/mosip/resident/test/config/ResidentServiceConfigTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/config/ResidentServiceConfigTest.java index ff0141e7fdd..73697200b42 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/config/ResidentServiceConfigTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/config/ResidentServiceConfigTest.java @@ -1,59 +1,71 @@ -package io.mosip.resident.test.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.web.client.RestTemplate; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.commons.packet.facade.PacketWriter; -import io.mosip.kernel.cbeffutil.impl.CbeffImpl; -import io.mosip.kernel.core.idvalidator.spi.RidValidator; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.kernel.core.idvalidator.spi.VidValidator; -import io.mosip.kernel.idvalidator.rid.impl.RidValidatorImpl; -import io.mosip.kernel.idvalidator.uin.impl.UinValidatorImpl; -import io.mosip.kernel.idvalidator.vid.impl.VidValidatorImpl; - -@Configuration -@ComponentScan(basePackages = { "io.mosip.resident.*" }) -//@ContextConfiguration(classes = {PacketWriter.class}) -public class ResidentServiceConfigTest { - - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private CbeffImpl cbeff; - - @MockBean - private PacketWriter packetWriter; - - @Bean - @Primary - public VidValidator vidValidator1() { - return new VidValidatorImpl(); - } - - @Bean - @Primary - public UinValidator uinValidator1() { - return new UinValidatorImpl(); - } - - @Bean - @Primary - public RidValidator ridValidator1() { - return new RidValidatorImpl(); - } - - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - -} +package io.mosip.resident.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.commons.packet.facade.PacketWriter; +import io.mosip.kernel.cbeffutil.impl.CbeffImpl; +import io.mosip.kernel.core.idvalidator.spi.RidValidator; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.kernel.idvalidator.rid.impl.RidValidatorImpl; +import io.mosip.kernel.idvalidator.uin.impl.UinValidatorImpl; +import io.mosip.kernel.idvalidator.vid.impl.VidValidatorImpl; +import io.mosip.preregistration.application.service.TransliterationService; +import io.mosip.preregistration.application.service.util.TransliterationServiceUtil; +import io.mosip.resident.repository.ResidentTransactionRepository; + +@Configuration +@ComponentScan(basePackages = { "io.mosip.resident.*" }) +//@ContextConfiguration(classes = {PacketWriter.class}) +public class ResidentServiceConfigTest { + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private CbeffImpl cbeff; + + @MockBean + private PacketWriter packetWriter; + + @MockBean + private TransliterationService transliterationService; + + @MockBean + private TransliterationServiceUtil transliterationServiceUtil; + + @Bean + @Primary + public VidValidator vidValidator1() { + return new VidValidatorImpl(); + } + + @Bean + @Primary + public UinValidator uinValidator1() { + return new UinValidatorImpl(); + } + + @Bean + @Primary + public RidValidator ridValidator1() { + return new RidValidatorImpl(); + } + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + @MockBean + private ResidentTransactionRepository residentTransactionRepository; + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/config/TestSecurityConfig.java b/resident/resident-service/src/test/java/io/mosip/resident/config/TestSecurityConfig.java similarity index 99% rename from resident/resident-service/src/test/java/io/mosip/resident/test/config/TestSecurityConfig.java rename to resident/resident-service/src/test/java/io/mosip/resident/config/TestSecurityConfig.java index c52751fc1cc..75d3396d607 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/config/TestSecurityConfig.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/config/TestSecurityConfig.java @@ -1,4 +1,10 @@ -package io.mosip.resident.test.config; +package io.mosip.resident.config; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,11 +23,6 @@ import org.springframework.security.web.firewall.DefaultHttpFirewall; import org.springframework.security.web.firewall.HttpFirewall; -import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/AcknowledgmentControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/AcknowledgmentControllerTest.java new file mode 100644 index 00000000000..d0ba8526cda --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/AcknowledgmentControllerTest.java @@ -0,0 +1,137 @@ +package io.mosip.resident.controller; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.RestTemplate; + +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.AcknowledgementService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentVidServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * Acknowledgment Controller Test + * Note: This class is used to test the Acknowledgment Controller + * @author Kamesh Shekhar Prasad + */ + +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class AcknowledgmentControllerTest { + private static final String LOCALE_EN_US = "en-US"; + + @InjectMocks + private AcknowledgementController acknowledgementController; + + @Mock + private AuditUtil auditUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private AcknowledgementService acknowledgementService; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private ObjectStoreHelper objectStore; + + @Mock + private ResidentVidServiceImpl residentVidService; + + @Mock + private TemplateUtil templateUtil; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private IdAuthService idAuthService; + + @Mock + private Utility utility; + + private ResponseEntity responseEntity; + + @Before + public void setup() throws Exception { + String eventId = "bf42d76e-b02e-48c8-a17a-6bb842d85ea9"; + byte[] pdfBytes = "test".getBytes(StandardCharsets.UTF_8); + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); + responseEntity = ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + + eventId + ".pdf\"") + .body(resource); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + when(acknowledgementService.getAcknowledgementPDF(anyString(), anyString(), Mockito.anyInt(), anyString())).thenReturn(Tuples.of("test".getBytes(), RequestType.AUTHENTICATION_REQUEST)); + ResponseEntity response = acknowledgementController.getAcknowledgement("bf42d76e-b02e-48c8-a17a-6bb842d85ea9", "eng", 0, LOCALE_EN_US); + assertEquals(response.getStatusCode(), responseEntity.getStatusCode()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAcknowledgementFailure() throws ResidentServiceCheckedException, IOException { + ReflectionTestUtils.setField(acknowledgementController, "ackDownloadId", "ack.id"); + when(acknowledgementService.getAcknowledgementPDF(anyString(), anyString(), Mockito.anyInt(), anyString())) + .thenThrow(new ResidentServiceCheckedException(ResidentErrorCode.EVENT_STATUS_NOT_FOUND)); + ResponseEntity response = acknowledgementController.getAcknowledgement("bf42d76e-b02e-48c8-a17a-6bb842d85ea9", "eng", 0, LOCALE_EN_US); + assertEquals(response.getStatusCode(), responseEntity.getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetAcknowledgementFailureResidentServiceException() throws ResidentServiceCheckedException, IOException { + doThrow(new ResidentServiceException("error", "Error message")). + when(requestValidator).validateEventIdLanguageCode(any(), any()); + ReflectionTestUtils.setField(acknowledgementController, "ackDownloadId", "ack.id"); + ResponseEntity response = acknowledgementController.getAcknowledgement("bf42d76e-b02e-48c8-a17a-6bb842d85ea9", "eng", 0, LOCALE_EN_US); + assertEquals(response.getStatusCode(), responseEntity.getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetAcknowledgementFailureInvalidInputException() throws ResidentServiceCheckedException, IOException { + doThrow(new InvalidInputException()). + when(requestValidator).validateEventIdLanguageCode(any(), any()); + ReflectionTestUtils.setField(acknowledgementController, "ackDownloadId", "ack.id"); + ResponseEntity response = acknowledgementController.getAcknowledgement("bf42d76e-b02e-48c8-a17a-6bb842d85ea9", "eng", 0, LOCALE_EN_US); + assertEquals(response.getStatusCode(), responseEntity.getStatusCode()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/AuthTransactionCallbackControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/AuthTransactionCallbackControllerTest.java new file mode 100644 index 00000000000..f9d9deeef9b --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/AuthTransactionCallbackControllerTest.java @@ -0,0 +1,145 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; + +import java.time.LocalDateTime; +import java.util.Map; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.websub.model.Event; +import io.mosip.kernel.core.websub.model.EventModel; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.AuthTransactionCallBackService; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; + +/** + * Web-Sub Update Controller Test Note: This class is used to test the Auth + * transaction callback controller + * + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class AuthTransactionCallbackControllerTest { + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private AuditUtil audit; + + @InjectMocks + AuthTransactionCallbackController authTransactionCallbackController; + + @MockBean + private AuthTransactionCallBackService authTransactionCallBackService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private VerificationService verificationService; + + @MockBean + private IdAuthService idAuthService; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private Utility utility; + + @InjectMocks + VerificationController verificationController; + + @Autowired + private ObjectMapper objectMapper; + + private EventModel eventModel; + + + @Before + public void setup() throws Exception { + + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(authTransactionCallbackController).build(); + eventModel = new EventModel(); + Event event = new Event(); + event.setTransactionId("1234"); + Map partnerIdMap = new java.util.HashMap<>(); + partnerIdMap.put("olv_partner_id", "mpartner-default-auth"); + event.setData(partnerIdMap); + + eventModel.setEvent(event); + eventModel.setTopic("AUTH_TYPE_STATUS_UPDATE_ACK"); + eventModel.setPublishedOn(String.valueOf(LocalDateTime.now())); + eventModel.setPublisher("AUTH_TYPE_STATUS_UPDATE_ACK"); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + authTransactionCallbackController.authTransactionCallback(objectMapper.convertValue(eventModel, Map.class)); + mockMvc.perform((MockMvcRequestBuilders.post("/callback/authTransaction")) + .contentType(MediaType.APPLICATION_JSON).content(eventModel.toString())).andReturn(); + verify(authTransactionCallBackService).updateAuthTransactionCallBackService(any()); + } + + @Test(expected = ResidentServiceException.class) + public void testCreateRequestGenerationFailure() throws Exception { + doThrow(new ResidentServiceCheckedException("error", "Error message")).when(authTransactionCallBackService) + .updateAuthTransactionCallBackService(any()); + authTransactionCallbackController.authTransactionCallback(objectMapper.convertValue(eventModel, Map.class)); + mockMvc.perform((MockMvcRequestBuilders.post("/callback/authTransaction")) + .contentType(MediaType.APPLICATION_JSON).content(eventModel.toString())).andReturn(); + verify(authTransactionCallBackService).updateAuthTransactionCallBackService(any()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/DocumentControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/DocumentControllerTest.java new file mode 100644 index 00000000000..a766b3a4ef2 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/DocumentControllerTest.java @@ -0,0 +1,169 @@ +package io.mosip.resident.controller; + +import static io.mosip.resident.constant.ResidentErrorCode.VIRUS_SCAN_FAILED; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.DocumentDTO; +import io.mosip.resident.dto.DocumentResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.DocumentValidator; + +/** + * @author Manoj SP + * + */ +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class DocumentControllerTest { + + private static final String REQUEST_JSON = "eyJpZCI6InN0cmluZyIsInZlcnNpb24iOiJzdHJpbmciLCJyZXF1ZXN0dGltZSI6IjIwMjItMDUtMDhUMDk6NTI6MTguMTUxWiIsInJlcXVlc3QiOnsiZG9jQ2F0Q29kZSI6InBvaSIsImRvY1R5cENvZGUiOiJkb2MwMDYiLCJsYW5nQ29kZSI6ImVuZyJ9fQ"; + + @InjectMocks + private DocumentController controller; + + @Mock + private DocumentValidator validator; + + @Mock + private DocumentService service; + + @Mock + private AuditUtil audit; + + @Test + public void testUploadDocumentsSuccess() throws ResidentServiceCheckedException, IOException { + DocumentResponseDTO response = new DocumentResponseDTO(); + when(service.uploadDocument(any(), any(), any())).thenReturn(response ); + ResponseWrapper uploadDocuments = controller.uploadDocuments("", new MockMultipartFile("name", "abc".getBytes()), "poi", "proof", "eng", "abc123"); + assertEquals(response, uploadDocuments.getResponse()); + } + + @Test + public void testUploadDocumentsFailedResidentServiceCheckedException() throws ResidentServiceCheckedException, IOException { + when(service.uploadDocument(any(), any(), any())).thenThrow(new ResidentServiceCheckedException("", "")); + ResponseWrapper uploadDocuments = controller.uploadDocuments("", new MockMultipartFile("name", "abc".getBytes()), "poi", "proof", "eng", "abc123"); + assertEquals(uploadDocuments.getErrors().get(0).getErrorCode(), ""); + assertEquals(uploadDocuments.getErrors().get(0).getMessage(), ""); + } + + @Test + public void testUploadDocumentsFailedResidentServiceException() throws IOException { + doThrow(new ResidentServiceException(VIRUS_SCAN_FAILED.getErrorCode(), + VIRUS_SCAN_FAILED.getErrorMessage())).when(validator).scanForViruses(any()); + ResponseWrapper uploadDocuments = controller.uploadDocuments("", new MockMultipartFile("name", "abc".getBytes()), "poi", "proof", "eng", "abc123"); + assertEquals(uploadDocuments.getErrors().get(0).getErrorCode(), uploadDocuments.getErrors().get(0).getErrorCode()); + assertEquals(uploadDocuments.getErrors().get(0).getMessage(), uploadDocuments.getErrors().get(0).getMessage()); + } + + @Test + public void testUploadDocumentsFailedInvalidInputException() throws IOException, ResidentServiceCheckedException { + doThrow(new InvalidInputException()).when(validator).validateRequest(anyString(), anyString(), anyString(), anyString()); + ResponseWrapper uploadDocuments = controller.uploadDocuments("", new MockMultipartFile("name", "abc".getBytes()), "poi", "proof", "eng", "abc123"); + assertEquals(uploadDocuments.getErrors().get(0).getErrorCode(), uploadDocuments.getErrors().get(0).getErrorCode()); + assertEquals(uploadDocuments.getErrors().get(0).getMessage(), uploadDocuments.getErrors().get(0).getMessage()); + } + + @Test + public void testGetDocumentsByTransactionIdSuccess() throws ResidentServiceCheckedException { + DocumentResponseDTO response = new DocumentResponseDTO(); + ReflectionTestUtils.setField(controller, "residentDocumentListId", "mosip.resident.document.list"); + ReflectionTestUtils.setField(controller, "residentDocumentListVersion", "v1"); + when(service.fetchAllDocumentsMetadata(any())).thenReturn(List.of(response)); + ResponseWrapper> documentsByTransactionId = controller.getDocumentsByTransactionId(""); + assertEquals(List.of(response), documentsByTransactionId.getResponse()); + assertEquals("mosip.resident.document.list", documentsByTransactionId.getId()); + assertEquals("v1", documentsByTransactionId.getVersion()); + } + + @Test + public void testGetDocumentsByTransactionIdFailed() throws ResidentServiceCheckedException { + when(service.fetchAllDocumentsMetadata(any())).thenThrow(new ResidentServiceCheckedException("", "")); + ResponseWrapper> documentsByTransactionId = controller.getDocumentsByTransactionId(""); + assertEquals(documentsByTransactionId.getErrors().get(0).getErrorCode(), ""); + assertEquals(documentsByTransactionId.getErrors().get(0).getMessage(), ""); + } + + @Test + public void testGetDocumentsByTransactionIdFailedInvalidInputException() throws IOException, ResidentServiceCheckedException { + doThrow(new InvalidInputException()).when(validator).validateTransactionIdForDocument(anyString()); + ResponseWrapper> documentsByTransactionId = controller.getDocumentsByTransactionId(""); + assertEquals(documentsByTransactionId.getErrors().get(0).getErrorCode(), documentsByTransactionId.getErrors().get(0).getErrorCode()); + assertEquals(documentsByTransactionId.getErrors().get(0).getMessage(), documentsByTransactionId.getErrors().get(0).getMessage()); + } + + @Test + public void testGetDocumentByDocumentIdSuccess() throws ResidentServiceCheckedException { + DocumentDTO response = new DocumentDTO(); + ReflectionTestUtils.setField(controller, "residentGetDocumentId", "mosip.resident.document.get"); + ReflectionTestUtils.setField(controller, "residentGetDocumentVersion", "v1"); + validator.validateTransactionIdForDocument("123"); + when(service.fetchDocumentByDocId(Mockito.anyString(), Mockito.anyString())).thenReturn(response); + ResponseWrapper documentByDocumentId = controller.getDocumentByDocumentId("", ""); + assertEquals(response, documentByDocumentId.getResponse()); + assertEquals("mosip.resident.document.get", documentByDocumentId.getId()); + assertEquals("v1", documentByDocumentId.getVersion()); + } + + @Test + public void testGetDocumentByDocumentIdFailed() throws ResidentServiceCheckedException { + when(service.fetchDocumentByDocId(any(), any())).thenThrow(new ResidentServiceCheckedException("", "")); + ResponseWrapper documentByDocumentId = controller.getDocumentByDocumentId("", ""); + assertEquals(documentByDocumentId.getErrors().get(0).getErrorCode(), ""); + assertEquals(documentByDocumentId.getErrors().get(0).getMessage(), ""); + } + + @Test + public void testGetDocumentByDocumentIdFailedInvalidInputException() { + doThrow(new InvalidInputException()).when(validator).validateDocumentIdAndTransactionId(anyString(), anyString()); + ResponseWrapper documentByDocumentId = controller.getDocumentByDocumentId("", ""); + assertEquals(documentByDocumentId.getErrors().get(0).getErrorCode(), documentByDocumentId.getErrors().get(0).getErrorCode()); + assertEquals(documentByDocumentId.getErrors().get(0).getMessage(), documentByDocumentId.getErrors().get(0).getMessage()); + } + + @Test + public void testDeleteDocumentsByDocumentIdSuccess() throws ResidentServiceCheckedException { + ResponseDTO response = new ResponseDTO(); + when(service.deleteDocument(Mockito.anyString(), Mockito.anyString())).thenReturn(response); + ResponseWrapper deleteDocumentsByDocumentId = controller.deleteDocument("", ""); + assertEquals(response, deleteDocumentsByDocumentId.getResponse()); + } + + @Test + public void testDeleteDocumentsByDocumentIdFailed() throws ResidentServiceCheckedException { + when(service.deleteDocument(Mockito.anyString(), Mockito.anyString())).thenThrow(new ResidentServiceCheckedException("", "")); + ResponseWrapper deleteDocumentsByDocumentId = controller.deleteDocument("", ""); + assertEquals(deleteDocumentsByDocumentId.getErrors().get(0).getErrorCode(), ""); + assertEquals(deleteDocumentsByDocumentId.getErrors().get(0).getMessage(), ""); + } + + @Test + public void testDeleteDocumentsByDocumentIdFailedInvalidInputException() { + doThrow(new InvalidInputException()).when(validator).validateDocumentIdAndTransactionId(anyString(), anyString()); + ResponseWrapper deleteDocumentsByDocumentId = controller.deleteDocument("", ""); + assertEquals(deleteDocumentsByDocumentId.getErrors().get(0).getErrorCode(), deleteDocumentsByDocumentId.getErrors().get(0).getErrorCode()); + assertEquals(deleteDocumentsByDocumentId.getErrors().get(0).getMessage(), deleteDocumentsByDocumentId.getErrors().get(0).getMessage()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadCardControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadCardControllerTest.java new file mode 100644 index 00000000000..8895edec74f --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadCardControllerTest.java @@ -0,0 +1,237 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.SecretKey; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.resident.dto.CheckStatusResponseDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidDownloadCardResponseDto; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DownloadCardService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to test download card api. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class DownloadCardControllerTest { + + @MockBean + private RequestValidator validator; + + @Mock + private AuditUtil audit; + + @Mock + private Environment environment; + + @Mock + private Utility utility; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private Utility utilityBean; + + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + DownloadCardController downloadCardController; + + @MockBean + DownloadCardService downloadCardService; + + @MockBean + IdentityServiceImpl identityService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private CryptoCoreSpec encryptor; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + byte[] pdfbytes; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(downloadCardController).build(); + MainRequestDTO downloadCardRequestDTOMainRequestDTO = new MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setIndividualId("7841261580"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTO.setTransactionId("1234567890"); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + downloadCardRequestDTOMainRequestDTO.setId("mosip.resident.download.uin.card"); + reqJson = gson.toJson(downloadCardRequestDTOMainRequestDTO); + pdfbytes = "uin".getBytes(); + Mockito.when(utility.getFileName(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn("file"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test + public void testGetCardSuccess() throws Exception { + Mockito.when(downloadCardService.getDownloadCardPDF(Mockito.any())).thenReturn(Tuples.of(pdfbytes, "12345")); + mockMvc.perform(MockMvcRequestBuilders.post("/download-card").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetCardFailed() throws Exception { + pdfbytes = "".getBytes(); + Mockito.when(downloadCardService.getDownloadCardPDF(Mockito.any())).thenReturn(Tuples.of(pdfbytes, "")); + mockMvc.perform(MockMvcRequestBuilders.post("/download-card").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testDownloadPersonalizedCard() throws Exception { + Mockito.when(downloadCardService.downloadPersonalizedCard(Mockito.any(), Mockito.anyInt(), Mockito.nullable(String.class))).thenReturn(Tuples.of(pdfbytes, "12345")); + MainRequestDTO downloadPersonalizedCardMainRequestDTO = + new MainRequestDTO<>(); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = + new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pjx0YWJsZT48dHI+PHRkPk5hbWU8L3RkPjx0ZD5GUjwvdGQ+PC90cj48dHI+PHRkPkRPQjwvdGQ+PHRkPjE5OTIvMDQvMTU8L3RkPjwvdHI+PHRyPjx0ZD5QaG9uZSBOdW1iZXI8L3RkPjx0ZD45ODc2NTQzMjEwPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4="); + downloadPersonalizedCardMainRequestDTO.setRequest(downloadPersonalizedCardDto); + reqJson = gson.toJson(downloadPersonalizedCardMainRequestDTO); + mockMvc.perform(MockMvcRequestBuilders.post("/download/personalized-card").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testDownloadPersonalizedCardFailed() throws Exception { + pdfbytes = "".getBytes(); + Mockito.when(downloadCardService.downloadPersonalizedCard(Mockito.any(), Mockito.anyInt(), Mockito.nullable(String.class))).thenReturn(Tuples.of(pdfbytes, "")); + MainRequestDTO downloadPersonalizedCardMainRequestDTO = + new MainRequestDTO<>(); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = + new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pjx0YWJsZT48dHI+PHRkPk5hbWU8L3RkPjx0ZD5GUjwvdGQ+PC90cj48dHI+PHRkPkRPQjwvdGQ+PHRkPjE5OTIvMDQvMTU8L3RkPjwvdHI+PHRyPjx0ZD5QaG9uZSBOdW1iZXI8L3RkPjx0ZD45ODc2NTQzMjEwPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4="); + downloadPersonalizedCardMainRequestDTO.setRequest(downloadPersonalizedCardDto); + reqJson = gson.toJson(downloadPersonalizedCardMainRequestDTO); + mockMvc.perform(MockMvcRequestBuilders.post("/download/personalized-card").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isBadRequest()); + } + + @Test(expected = Exception.class) + public void testDownloadPersonalizedCardInvalidInputException() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateDownloadPersonalizedCard(any()); + MainRequestDTO downloadPersonalizedCardMainRequestDTO = + new MainRequestDTO<>(); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = + new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pjx0YWJsZT48dHI+PHRkPk5hbWU8L3RkPjx0ZD5GUjwvdGQ+PC90cj48dHI+PHRkPkRPQjwvdGQ+PHRkPjE5OTIvMDQvMTU8L3RkPjwvdHI+PHRyPjx0ZD5QaG9uZSBOdW1iZXI8L3RkPjx0ZD45ODc2NTQzMjEwPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4="); + downloadPersonalizedCardMainRequestDTO.setRequest(downloadPersonalizedCardDto); + reqJson = gson.toJson(downloadPersonalizedCardMainRequestDTO); + mockMvc.perform(MockMvcRequestBuilders.post("/download/personalized-card").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testRequestVidCard() throws Exception { + ResponseWrapper vidDownloadCardResponseDtoResponseWrapper = new ResponseWrapper<>(); + VidDownloadCardResponseDto vidDownloadCardResponseDto = new VidDownloadCardResponseDto(); + vidDownloadCardResponseDto.setStatus("success"); + vidDownloadCardResponseDtoResponseWrapper.setResponse(vidDownloadCardResponseDto); + Mockito.when(downloadCardService.getVidCardEventId(Mockito.any(), Mockito.anyInt(), Mockito.nullable(String.class))) + .thenReturn(Tuples.of(vidDownloadCardResponseDtoResponseWrapper, "12345")); + mockMvc.perform(MockMvcRequestBuilders.get("/request-card/vid/9086273859467431")).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testRequestVidCardFailed() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateDownloadCardVid(any()); + ResponseWrapper vidDownloadCardResponseDtoResponseWrapper = new ResponseWrapper<>(); + VidDownloadCardResponseDto vidDownloadCardResponseDto = new VidDownloadCardResponseDto(); + vidDownloadCardResponseDto.setStatus("success"); + vidDownloadCardResponseDtoResponseWrapper.setResponse(vidDownloadCardResponseDto); + Mockito.when(downloadCardService.getVidCardEventId(Mockito.any(), Mockito.anyInt(), Mockito.anyString())) + .thenReturn(Tuples.of(vidDownloadCardResponseDtoResponseWrapper, "12345")); + mockMvc.perform(MockMvcRequestBuilders.get("/request-card/vid/9086273859467431")).andExpect(status().isOk()); + } + + @Test + public void testGetStatus() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + CheckStatusResponseDTO checkStatusResponseDTO = new CheckStatusResponseDTO(); + checkStatusResponseDTO.setAidStatus("process"); + responseWrapper.setResponse(checkStatusResponseDTO); + Mockito.when(downloadCardService.getIndividualIdStatus(Mockito.any())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/aid-stage/12345")).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetStatusFailed() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + CheckStatusResponseDTO checkStatusResponseDTO = new CheckStatusResponseDTO(); + checkStatusResponseDTO.setAidStatus("process"); + responseWrapper.setResponse(checkStatusResponseDTO); + Mockito.when(downloadCardService.getIndividualIdStatus(Mockito.any())) + .thenThrow(new InvalidInputException()); + mockMvc.perform(MockMvcRequestBuilders.get("/aid-stage/12345")).andExpect(status().isOk()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadMasterdataControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadMasterdataControllerTest.java new file mode 100644 index 00000000000..256e6a8c6a4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/DownloadMasterdataControllerTest.java @@ -0,0 +1,187 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.ByteArrayInputStream; +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.SecretKey; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DownLoadMasterDataService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to test download master data controller api. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class DownloadMasterdataControllerTest { + + @MockBean + private RequestValidator validator; + + @Mock + private AuditUtil audit; + + @MockBean + private ObjectStoreHelper objectStore; + + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + DownLoadMasterDataController downLoadMasterDataController; + + @MockBean + DownLoadMasterDataService downLoadMasterDataService; + + @MockBean + IdentityServiceImpl identityService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + private AuditUtil auditUtil; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private Utility utilityBean; + + @Mock + private Utility utility; + + @Mock + private Environment environment; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + byte[] pdfbytes; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(downLoadMasterDataController).build(); + MainRequestDTO downloadCardRequestDTOMainRequestDTO = new MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setIndividualId("7841261580"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTO.setTransactionId("1234567890"); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + downloadCardRequestDTOMainRequestDTO.setId("mosip.resident.download.uin.card"); + reqJson = gson.toJson(downloadCardRequestDTOMainRequestDTO); + pdfbytes = "uin".getBytes(); + Mockito.when(utility.getFileName(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn("fileName"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test + public void testDownloadRegistrationCentersByHierarchyLevel() throws Exception { + Mockito.when(downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(Mockito.any(), + Mockito.any(), Mockito.any())).thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get("/download/registration-centers-list?langcode=eng&hierarchylevel=5&name=14022")). + andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testDownloadRegistrationCentersByHierarchyLevelInvalidInputException() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateLanguageCode(any()); + Mockito.when(downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(Mockito.any(), + Mockito.any(), Mockito.any())).thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get("/download/registration-centers-list?langcode=eng&hierarchylevel=5&name=14022")). + andExpect(status().isOk()); + } + + @Test + public void testDownloadNearestRegistrationCenters() throws Exception { + Mockito.when(downLoadMasterDataService.getNearestRegistrationcenters(Mockito.anyString(), + Mockito.anyDouble(), Mockito.anyDouble(), Mockito.anyInt())).thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get + ("/download/nearestRegistrationcenters?langcode=eng&longitude=1&latitude=1&proximitydistance=1")). + andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testDownloadNearestRegistrationCentersFailed() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateLanguageCode(any()); + Mockito.when(downLoadMasterDataService.getNearestRegistrationcenters(Mockito.anyString(), + Mockito.anyDouble(), Mockito.anyDouble(), Mockito.anyInt())).thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get + ("/download/nearestRegistrationcenters?langcode=eng&longitude=1&latitude=1&proximitydistance=1")). + andExpect(status().isOk()); + } + + @Test + public void testDownloadSupportingDocsByLanguage() throws Exception { + Mockito.when(downLoadMasterDataService.downloadSupportingDocsByLanguage(Mockito.anyString())). + thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get + ("/download/supporting-documents?langcode=eng")). + andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testDownloadSupportingDocsByLanguageFailed() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateLanguageCode(any()); + Mockito.when(downLoadMasterDataService.downloadSupportingDocsByLanguage(Mockito.anyString())). + thenReturn( new ByteArrayInputStream(pdfbytes)); + mockMvc.perform(MockMvcRequestBuilders.get + ("/download/supporting-documents?langcode=eng")). + andExpect(status().isOk()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/GrievanceControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/GrievanceControllerTest.java new file mode 100644 index 00000000000..e6e2fc31af8 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/GrievanceControllerTest.java @@ -0,0 +1,157 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; + +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.HashMap; +import java.util.UUID; + +import javax.crypto.SecretKey; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.GrievanceService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to test Grievance controller api. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class GrievanceControllerTest { + + @Mock + private RequestValidator validator; + + @Mock + private AuditUtil audit; + + @Mock + private Environment environment; + + @Mock + private Utility utility; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private Utility utilityBean; + + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + GrievanceController grievanceController; + + @Mock + GrievanceService grievanceService; + + @MockBean + IdentityServiceImpl identityService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private CryptoCoreSpec encryptor; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + byte[] pdfbytes; + + private MainRequestDTO + grievanceRequestDTOMainRequestDTO; + + @Before + public void setup() throws Exception { + grievanceRequestDTOMainRequestDTO = new MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setEventId("7256338756236957"); + grievanceRequestDTO.setMessage("sharing"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("mosip.resident.grievance.ticket.request"); + reqJson = gson.toJson(grievanceRequestDTOMainRequestDTO); + pdfbytes = "uin".getBytes(); + Mockito.when(utility.getFileName(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn("file"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test + public void testGetCardSuccess() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + HashMap response = new HashMap<>(); + String ticketId = UUID.randomUUID().toString(); + response.put("ticketId", ticketId); + responseWrapper.setResponse(response); + responseWrapper.setId("mosip.resident.grievance.ticket.request"); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + Mockito.when(grievanceService.getGrievanceTicket(any())).thenReturn(responseWrapper); + ResponseWrapper responseWrapper1 = grievanceController.grievanceTicket(grievanceRequestDTOMainRequestDTO); + Assert.assertEquals("mosip.resident.grievance.ticket.request", responseWrapper1.getId()); + } + + @Test(expected = Exception.class) + public void testGetCardFailed() throws Exception { + doThrow(new InvalidInputException()). + when(validator).validateGrievanceRequestDto(any()); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + HashMap response = new HashMap<>(); + String ticketId = UUID.randomUUID().toString(); + response.put("ticketId", ticketId); + responseWrapper.setResponse(response); + responseWrapper.setId("mosip.resident.grievance.ticket.request"); + responseWrapper.setResponsetime(DateUtils.getUTCCurrentDateTime()); + Mockito.when(grievanceService.getGrievanceTicket(any())).thenReturn(responseWrapper); + ResponseWrapper responseWrapper1 = grievanceController.grievanceTicket(grievanceRequestDTOMainRequestDTO); + Assert.assertEquals("mosip.resident.grievance.ticket.request", responseWrapper1.getId()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/IdAuthControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/IdAuthControllerTest.java new file mode 100644 index 00000000000..f1c20816545 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/IdAuthControllerTest.java @@ -0,0 +1,126 @@ +package io.mosip.resident.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.IOException; +import java.util.Map; + +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.IdAuthRequestDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdAuthServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import reactor.util.function.Tuples; + +/** + * Resident IdAuth controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class IdAuthControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private IdAuthServiceImpl idAuthService; + + @Mock + private AuditUtil auditUtil; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private ResidentVidService vidService; + + @InjectMocks + private IdAuthController idAuthController; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private Utility utilityBean; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + private RequestWrapper requestWrapper; + + @Before + public void setUp() throws ResidentServiceCheckedException, IOException { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(idAuthController).build(); + requestWrapper = new RequestWrapper(); + IdAuthRequestDto idAuthRequestDto = new IdAuthRequestDto(); + idAuthRequestDto.setTransactionId("1234567890"); + idAuthRequestDto.setIndividualId("8251649601"); + idAuthRequestDto.setOtp("111111"); + requestWrapper.setRequest(idAuthRequestDto); + reqJson = gson.toJson(requestWrapper); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + ReflectionTestUtils.setField(idAuthController, "validateOtpId", "validate-otp-id"); + } + + @Test + public void testValidateOtp() throws Exception { + Mockito.when(idAuthService.validateOtpV1(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(Tuples.of(true, "12345")); + mockMvc.perform(MockMvcRequestBuilders.post("/validate-otp").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test(expected = OtpValidationFailedException.class) + public void testValidateOtpFailed() throws Exception { + Mockito.doThrow(new OtpValidationFailedException("otp validation failed", Map.of(ResidentConstants.EVENT_ID, "123456"))).when(idAuthService) + .validateOtpV1(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); + idAuthController.validateOtp(requestWrapper); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/IdentityControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/IdentityControllerTest.java new file mode 100644 index 00000000000..aed7baf8a7f --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/IdentityControllerTest.java @@ -0,0 +1,136 @@ +package io.mosip.resident.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.IOException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.LinkedHashMap; +import java.util.Map; + +import javax.crypto.SecretKey; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; + +/** + * Resident identity controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class IdentityControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private IdentityController identityController; + + @MockBean + private IdentityServiceImpl idServiceImpl; + + @MockBean + private ResidentVidService vidService; + + @Mock + private AuditUtil auditUtil; + + @Mock + private RequestValidator validator; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private DocumentController documentController; + + @MockBean + private IdAuthController idAuthController; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private CryptoCoreSpec encryptor; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private Utility utilityBean; + + private ResponseWrapper responseWrapper; + + private Map identityMap; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(identityController).build(); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + + identityMap = new LinkedHashMap(); + identityMap.put("UIN", "8251649601"); + identityMap.put("email", "manojvsp12@gmail.com"); + identityMap.put("phone", "9395910872"); + identityMap.put("dateOfBirth", "1970/11/16"); + + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + responseWrapper.setResponse(identityMap); + ReflectionTestUtils.setField(identityController, "residentIdentityInfoId", "identity.id"); + } + + @Test + public void testGetInputAttributeValues() throws Exception { + Mockito.when(idServiceImpl.getIdentityAttributes(Mockito.anyString(),Mockito.anyString())).thenReturn(identityMap); + mockMvc.perform(MockMvcRequestBuilders.get("/identity/info/type/schemaType")).andExpect(status().isOk()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetInputAttributeValuesWithInvalidInputException() + throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + Mockito.doThrow(new InvalidInputException()).when(validator).validateSchemaType(Mockito.anyString()); + identityController.getInputAttributeValues("schema-type"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/OrderCardControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/OrderCardControllerTest.java new file mode 100644 index 00000000000..11bdfdb5da6 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/OrderCardControllerTest.java @@ -0,0 +1,148 @@ +package io.mosip.resident.controller; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.OrderCardService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import javax.crypto.SecretKey; +import java.security.PrivateKey; +import java.security.PublicKey; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Resident order card controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class OrderCardControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private OrderCardController orderCardController; + + @MockBean + private OrderCardService orderCardService; + + @MockBean + private ResidentVidService vidService; + + @Mock + private AuditUtil auditUtil; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private AuthTransactionCallbackController authTransactionCallbackController; + + @MockBean + private DocumentController documentController; + + @MockBean + private IdAuthController idAuthController; + + @MockBean + private IdentityController identityController; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private Utility utilityBean; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + private ResidentServiceImpl residentService; + + @Autowired + private MockMvc mockMvc; + + private ResponseWrapper responseWrapper; + + @MockBean + private IdentityServiceImpl identityServiceImpl; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + @Before + public void setUp() throws Exception { + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + RequestWrapper requestWrapper = new RequestWrapper(); + ResidentCredentialRequestDto residentCredentialRequestDto = new ResidentCredentialRequestDto(); + residentCredentialRequestDto.setTransactionID("1234567890"); + residentCredentialRequestDto.setIndividualId("8251649601"); + requestWrapper.setRequest(residentCredentialRequestDto); + reqJson = gson.toJson(requestWrapper); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(orderCardController).build(); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("1234Id"); + } + + @Test + public void testSendPhysicalCard() throws Exception { + Mockito.when(orderCardService.sendPhysicalCard(Mockito.any())) + .thenReturn((ResidentCredentialResponseDto) responseWrapper.getResponse()); + mockMvc.perform(MockMvcRequestBuilders.post("/sendCard").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testPhysicalCardOrder() throws Exception { + Mockito.when(orderCardService.getRedirectUrl(Mockito.any(),Mockito.any())).thenReturn("URL"); + mockMvc.perform(MockMvcRequestBuilders.get("/physical-card/order?partnerId=mosip_partnerorg1667786709933&redirectUri=vdsvdvds")).andExpect(status().isFound()); + } + + @Test + public void testPhysicalCardOrderRedirect() throws Exception { + Mockito.when(orderCardService.physicalCardOrder(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any(), Mockito.any())).thenReturn("URL"); + mockMvc.perform(MockMvcRequestBuilders.get( + "/physical-card/order-redirect?redirectUrl=aHR0cHM6Ly93d3cubWFkZWludGV4dC5jb20v&paymentTransactionId=12345dsvdvds&eventId=123456&residentFullAddress=fgfhfghgf")).andExpect(status().isFound()); + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/PinStatusControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/PinStatusControllerTest.java new file mode 100644 index 00000000000..f52d045edf6 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/PinStatusControllerTest.java @@ -0,0 +1,83 @@ +package io.mosip.resident.controller; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.PinUnpinStatusService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; + +/** + * This class is used to test pin or unpin status api based on event id. + * @Author Kamesh Shekhar Prasad + */ + +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class PinStatusControllerTest { + + @InjectMocks + PinStatusController pinStatusController; + + @Mock + private AuditUtil audit; + + @Mock + private RequestValidator requestValidator; + + @Mock + private PinUnpinStatusService pinUnpinStatusService; + + @Mock + private Environment env; + + @Test + public void pinStatusControllerTest() throws ResidentServiceCheckedException{ + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ResponseDTO responseDTO = new ResponseDTO(); + responseDTO.setStatus(HttpStatus.OK.toString()); + responseWrapper.setResponse(responseDTO); + Mockito.when(pinUnpinStatusService.pinStatus(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(responseWrapper); + ResponseWrapper resultResponseDTO = pinStatusController.pinStatus("eventId"); + assertEquals(resultResponseDTO.getResponse().getStatus(), HttpStatus.OK.toString()); + } + + @Test(expected = Exception.class) + public void pinStatusControllerWithExceptionTest() throws ResidentServiceCheckedException { + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("property"); + Mockito.when(pinUnpinStatusService.pinStatus(Mockito.anyString(), Mockito.anyBoolean())) + .thenThrow(new ResidentServiceCheckedException()); + pinStatusController.pinStatus("eventId"); + } + + @Test + public void unPinStatusControllerTest() throws ResidentServiceCheckedException{ + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ResponseDTO responseDTO = new ResponseDTO(); + responseDTO.setStatus(HttpStatus.OK.toString()); + responseWrapper.setResponse(responseDTO); + Mockito.when(pinUnpinStatusService.pinStatus(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(responseWrapper); + ResponseWrapper responseEntity = pinStatusController.unPinStatus("eventId"); + assertEquals(responseEntity.getResponse().getStatus(), HttpStatus.OK.toString()); + } + + @Test(expected = Exception.class) + public void unPinStatusControllerWithExceptionTest() throws ResidentServiceCheckedException { + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("property"); + Mockito.when(pinUnpinStatusService.pinStatus(Mockito.anyString(), Mockito.anyBoolean())) + .thenThrow(new ResidentServiceCheckedException()); + pinStatusController.unPinStatus("eventId"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyAuditControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyAuditControllerTest.java new file mode 100644 index 00000000000..77979014938 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyAuditControllerTest.java @@ -0,0 +1,144 @@ +package io.mosip.resident.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.SecretKey; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.dto.AuthenticatedAuditRequestDto; +import io.mosip.resident.dto.UnauthenticatedAuditRequestDto; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuples; + +/** + * Resident proxy audit controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class ProxyAuditControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private ProxyAuditController proxyAuditController; + + @Mock + private AuditUtil auditUtil; + + @Mock + private Utility utility; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private Utility utilityBean; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private AuthTransactionCallbackController authTransactionCallbackController; + + @MockBean + private DocumentController documentController; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private IdAuthController idAuthController; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private CryptoCoreSpec encryptor; + + private AuthenticatedAuditRequestDto authenticatedAuditRequestDto; + + private UnauthenticatedAuditRequestDto unauthenticatedAuditRequestDto; + + @Autowired + private MockMvc mockMvc; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyAuditController).build(); + authenticatedAuditRequestDto = new AuthenticatedAuditRequestDto(); + authenticatedAuditRequestDto.setAuditEventId("RES-SER-1111"); + authenticatedAuditRequestDto.setModuleId("RES-SER"); + authenticatedAuditRequestDto.setModuleName("Residence service"); + unauthenticatedAuditRequestDto = new UnauthenticatedAuditRequestDto(); + unauthenticatedAuditRequestDto.setAuditEventId("RES-SER-1111"); + unauthenticatedAuditRequestDto.setModuleId("RES-SER"); + unauthenticatedAuditRequestDto.setModuleName("Residence service"); + } + + @Test + public void testAuthAuditLog() throws Exception { + Mockito.when(auditUtil.getRefIdHashAndType()).thenReturn(Tuples.of("23455683456", IdType.AID.name())); + reqJson = gson.toJson(authenticatedAuditRequestDto); + mockMvc.perform(MockMvcRequestBuilders.post("/auth-proxy/audit/log").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testAuditLogWithId() throws Exception { + Mockito.when(auditUtil.getRefIdHashAndTypeFromIndividualId(Mockito.anyString())).thenReturn(Tuples.of("23455683456", IdType.AID.name())); + unauthenticatedAuditRequestDto.setId("23456"); + reqJson = gson.toJson(unauthenticatedAuditRequestDto); + mockMvc.perform(MockMvcRequestBuilders.post("/proxy/audit/log").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testAuditLogWithNullId() throws Exception { + reqJson = gson.toJson(unauthenticatedAuditRequestDto); + mockMvc.perform(MockMvcRequestBuilders.post("/proxy/audit/log").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyConfigControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyConfigControllerTest.java new file mode 100644 index 00000000000..9b77a34f0c4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyConfigControllerTest.java @@ -0,0 +1,136 @@ +package io.mosip.resident.controller; + +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.SecretKey; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.ResidentConfigServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; + +/** + * Resident proxy config controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class ProxyConfigControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ResidentConfigServiceImpl residentConfigService; + + @MockBean + private AuditUtil auditUtil; + + @MockBean + private Utility utilityBean; + + @InjectMocks + private ProxyConfigController proxyConfigController; + + @MockBean + private DocumentController documentController; + + @MockBean + private IdAuthController idAuthController; + + @MockBean + private IdentityController identityController; + + @MockBean + private ResidentController residentController; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private ObjectStoreHelper objectStore; + + @Autowired + private MockMvc mockMvc; + + private ResponseWrapper responseWrapper; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyConfigController).build(); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + Map identityMappingMap = new HashMap<>(); + Map valueMap = new HashMap<>(); + valueMap.put("value", "fullName"); + identityMappingMap.put("name", valueMap); + when(residentConfigService.getIdentityMappingMap()).thenReturn(identityMappingMap); + } + + @Test + public void testGetResidentProperties() throws Exception { + Mockito.when(residentConfigService.getUIProperties()).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/config/ui-properties")).andExpect(status().isOk()); + } + + @Test + public void testGetResidentUISchema() throws Exception { + Mockito.when(residentConfigService.getUISchema("update-demographics")).thenReturn("ui-schema-json"); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/config/ui-schema/update-demographics")).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetResidentUISchemaWithResidentServiceException() throws Exception { + Mockito.when(residentConfigService.getUISchema("update-demographics")).thenThrow(ResidentServiceException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/config/ui-schema/update-demographics")).andExpect(status().isOk()); + } + + @Test + public void testGetIdentityMapping() throws Exception { + Mockito.when(residentConfigService.getIdentityMapping()).thenReturn("identity-mapping-json"); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/config/identity-mapping")).andExpect(status().isOk()); + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyIdRepoControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyIdRepoControllerTest.java new file mode 100644 index 00000000000..9341186fea9 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyIdRepoControllerTest.java @@ -0,0 +1,125 @@ +package io.mosip.resident.controller; + +import io.mosip.idrepository.core.util.EnvUtil; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.DraftResidentResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.context.WebApplicationContext; + +import java.util.List; +import java.util.Objects; + +import static io.mosip.resident.constant.ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +/** + * @author Manoj SP + * + */ +@ContextConfiguration(classes = { TestContext.class, WebApplicationContext.class }) +@RunWith(SpringRunner.class) +@WebMvcTest +@Import(EnvUtil.class) +@ActiveProfiles("test") +public class ProxyIdRepoControllerTest { + + @InjectMocks + private ProxyIdRepoController controller; + + @Mock + private ProxyIdRepoService service; + + @Mock + private AuditUtil auditUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private Environment environment; + + @Test + public void testGetRemainingUpdateCountByIndividualId() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + when(service.getRemainingUpdateCountByIndividualId(any())).thenReturn(responseWrapper); + ResponseEntity> response = controller + .getRemainingUpdateCountByIndividualId(List.of()); + assertNotNull(response); + } + + @Test + public void testGetRemainingUpdateCountByIndividualIdException() throws ResidentServiceCheckedException { + when(service.getRemainingUpdateCountByIndividualId(any())) + .thenThrow(new ResidentServiceCheckedException(API_RESOURCE_ACCESS_EXCEPTION)); + ResponseEntity> response = controller + .getRemainingUpdateCountByIndividualId(List.of()); + assertEquals(List.of(new ServiceError(API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), + API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage())), response.getBody().getErrors()); + } + + @Test + public void testGetPendingDrafts() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + when(service.getPendingDrafts(any())).thenReturn(responseWrapper); + ResponseEntity> response = controller + .getPendingDrafts("eng"); + assertNotNull(response); + } + + @Test + public void testGetPendingDraftsFailure() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + when(service.getPendingDrafts(any())).thenThrow(new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION)); + ResponseEntity> response = controller + .getPendingDrafts("eng"); + assertEquals(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), + Objects.requireNonNull(response.getBody()).getErrors().get(0).getErrorCode()); + } + + @Test + public void testDiscardPendingDraft() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + when(service.discardDraft(any())).thenReturn("DISCARDED"); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + ResponseEntity response = controller + .discardPendingDraft("123"); + assertNotNull(response); + } + + @Test + public void testDiscardPendingDraftFailure() throws ResidentServiceCheckedException { + when(service.discardDraft(any())).thenThrow(new ResidentServiceCheckedException(ResidentErrorCode.UNKNOWN_EXCEPTION)); + ResponseEntity responseWrapper = controller + .discardPendingDraft("123"); + assertNotNull(responseWrapper); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyMasterDataControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyMasterDataControllerTest.java new file mode 100644 index 00000000000..6ddc9033cc9 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyMasterDataControllerTest.java @@ -0,0 +1,381 @@ +package io.mosip.resident.controller; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.LocationImmediateChildrenResponseDto; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.AcknowledgementServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import javax.crypto.SecretKey; +import java.security.PrivateKey; +import java.security.PublicKey; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Resident proxy masterdata controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class ProxyMasterDataControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private AuditUtil auditUtil; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private AcknowledgementController acknowledgementController; + + @MockBean + private AcknowledgementServiceImpl acknowledgementService; + + @MockBean + private CryptoCoreSpec encryptor; + + @InjectMocks + private ProxyMasterdataController proxyMasterdataController; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private ResidentServiceImpl residentService; + + @Autowired + private MockMvc mockMvc; + + private ResponseWrapper responseWrapper; + @MockBean + private Utility utility; + + @MockBean + private Utilities utilities; + + @Before + public void setUp() throws Exception { + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyMasterdataController).build(); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + } + + @Test + public void testGetValidDocumentByLangCode() throws Exception { + Mockito.when(utility.getValidDocumentByLangCode(Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/validdocuments/langCode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetValidDocumentByLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(utility.getValidDocumentByLangCode(Mockito.anyString())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/validdocuments/langCode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetLocationHierarchyLevelByLangCode() throws Exception { + Mockito.when(proxyMasterdataService.getLocationHierarchyLevelByLangCode(Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locationHierarchyLevels/langcode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetLocationHierarchyLevelByLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getLocationHierarchyLevelByLangCode(Mockito.anyString())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locationHierarchyLevels/langcode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetImmediateChildrenByLocCodeAndLangCode() throws Exception { + Mockito.when(proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode(Mockito.anyString(), + Mockito.anyString())).thenReturn(responseWrapper); + mockMvc.perform( + MockMvcRequestBuilders.get("/proxy/masterdata/locations/immediatechildren/locationcode/langcode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetImmediateChildrenByLocCodeAndLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode(Mockito.anyString(), + Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform( + MockMvcRequestBuilders.get("/proxy/masterdata/locations/immediatechildren/locationcode/langcode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetLocationDetailsByLocCodeAndLangCode() throws Exception { + Mockito.when( + proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locations/info/locationcode/langcode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetLocationDetailsByLocCodeAndLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when( + proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locations/info/locationcode/langcode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetCoordinateSpecificRegistrationCenters() throws Exception { + Mockito.when(proxyMasterdataService.getCoordinateSpecificRegistrationCenters(Mockito.anyString(), + Mockito.anyDouble(), Mockito.anyDouble(), Mockito.anyInt())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders + .get("/proxy/masterdata/getcoordinatespecificregistrationcenters/langcode/33.4/43.5/200")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetCoordinateSpecificRegistrationCentersWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getCoordinateSpecificRegistrationCenters(Mockito.anyString(), + Mockito.anyDouble(), Mockito.anyDouble(), Mockito.anyInt())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders + .get("/proxy/masterdata/getcoordinatespecificregistrationcenters/langcode/33.4/43.5/200")) + .andExpect(status().isOk()); + } + + @Test + public void testGetApplicantValidDocument() throws Exception { + Mockito.when(proxyMasterdataService.getApplicantValidDocument(Mockito.anyString(), Mockito.anyList())) + .thenReturn(responseWrapper); + mockMvc.perform( + MockMvcRequestBuilders.get("/proxy/masterdata/applicanttype/applicantId/languages?languages=eng")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetApplicantValidDocumentWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getApplicantValidDocument(Mockito.anyString(), Mockito.anyList())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform( + MockMvcRequestBuilders.get("/proxy/masterdata/applicanttype/applicantId/languages?languages=eng")) + .andExpect(status().isOk()); + } + + @Test + public void testGetRegistrationCentersByHierarchyLevel() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCentersByHierarchyLevel(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyList())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/registrationcenters/langcode/5/names?name=14110")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetRegistrationCentersByHierarchyLevelWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCentersByHierarchyLevel(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyList())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/registrationcenters/langcode/5/names?name=14110")) + .andExpect(status().isOk()); + } + + @Test + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginated() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.anyString())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get( + "/proxy/masterdata/registrationcenters/page/langcode/5/name?pageNumber=0&pageSize=10&orderBy=desc&sortBy=createdDateTime")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginatedWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get( + "/proxy/masterdata/registrationcenters/page/langcode/5/name?pageNumber=0&pageSize=10&orderBy=desc&sortBy=createdDateTime")) + .andExpect(status().isOk()); + } + + @Test + public void testGetRegistrationCenterWorkingDays() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCenterWorkingDays(Mockito.anyString(), Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/workingdays/registrationCenterID/langCode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetRegistrationCenterWorkingDaysWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getRegistrationCenterWorkingDays(Mockito.anyString(), Mockito.anyString())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/workingdays/registrationCenterID/langCode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetLatestIdSchema() throws Exception { + Mockito.when( + proxyMasterdataService.getLatestIdSchema(Mockito.anyDouble(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/idschema/latest?schemaVersion=&domain=&type=")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetLatestIdSchemaWithResidentServiceCheckedException() throws Exception { + Mockito.when( + proxyMasterdataService.getLatestIdSchema(Mockito.anyDouble(), Mockito.anyString(), Mockito.anyString())) + .thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/idschema/latest?schemaVersion=&domain=&type=")) + .andExpect(status().isOk()); + } + + @Test + public void testGetAllTemplateBylangCodeAndTemplateTypeCode() throws Exception { + Mockito.when(proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode(Mockito.anyString(), + Mockito.anyString())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/masterdata/templates/eng/OTP-sms-template")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetAllTemplateBylangCodeAndTemplateTypeCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode(Mockito.anyString(), + Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/masterdata/templates/eng/OTP-sms-template")) + .andExpect(status().isOk()); + } + + @Test + public void testGetGenderTypesByLangCode() throws Exception { + Mockito.when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName(Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/masterdata/dynamicfields/gender/eng?withValue=true")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetGenderTypesByLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName(Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/masterdata/dynamicfields/gender/eng?withValue=true")) + .andExpect(status().isOk()); + } + + @Test + public void testGetDocumentTypesByDocumentCategoryCodeAndLangCode() throws Exception { + Mockito.when(proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/documenttypes/documentcategorycode/langcode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetDocumentTypesByDocumentCategoryCodeAndLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode(Mockito.anyString(), Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/documenttypes/documentcategorycode/langcode")) + .andExpect(status().isOk()); + } + + @Test + public void testGetGenderCodeByGenderTypeAndLangCode() throws Exception { + Mockito.when(proxyMasterdataService.getGenderCodeByGenderTypeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/gendercode/gendertype/langcode")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetGenderCodeByGenderTypeAndLangCodeWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyMasterdataService.getGenderCodeByGenderTypeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/gendercode/gendertype/langcode")) + .andExpect(status().isOk()); + } + + + @Test + public void testGetLocationHierarchyLevel() throws Exception { + Mockito.when(proxyMasterdataService.getLocationHierarchyLevels(Mockito.anyString())) + .thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locationHierarchyLevels")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetLocationHierarchyLevel2() throws Exception { + Mockito.when(proxyMasterdataService.getLocationHierarchyLevels(null)) + .thenThrow(new ResidentServiceCheckedException()); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/locationHierarchyLevels")) + .andExpect(status().isOk()); + } + + @Test + public void testGetAllDynamicField() throws Exception { + Mockito.when(proxyMasterdataService.getAllDynamicFieldByName("gender")).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/dynamicfields/gender")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetAllDynamicFieldFailure() throws Exception { + Mockito.when(proxyMasterdataService.getAllDynamicFieldByName("gender")).thenThrow(new ResidentServiceCheckedException()); + mockMvc.perform(MockMvcRequestBuilders.get("/proxy/masterdata/dynamicfields/gender")) + .andExpect(status().isOk()); + } + + @Test + public void testGetImmediateChildrenByLocCode() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(new LocationImmediateChildrenResponseDto()); + Mockito.when(proxyMasterdataService.getImmediateChildrenByLocCode(Mockito.anyString(), Mockito.anyList())).thenReturn(responseWrapper.getResponse()); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/masterdata/locations/immediatechildren/KNT?languageCodes=eng")) + .andExpect(status().isOk()); + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyOtpControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyOtpControllerTest.java new file mode 100644 index 00000000000..61013808ce4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyOtpControllerTest.java @@ -0,0 +1,194 @@ +package io.mosip.resident.controller; + +import static org.mockito.Mockito.doThrow; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.SecretKey; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.authmanager.model.AuthNResponse; +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.preregistration.application.constant.PreRegLoginConstant; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.MainResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.ProxyOtpService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * @author Kamesh Shekhar Prasad + * This class is used to test proxy otp controller. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ProxyOtpControllerTest { + + @MockBean + private RequestValidator validator; + + @Mock + private AuditUtil audit; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private Utility utilityBean; + + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + ProxyOtpController proxyOtpController; + + @MockBean + ProxyOtpService proxyOtpService; + + @MockBean + IdentityServiceImpl identityService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + private AuditUtil auditUtil; + + @MockBean + private ResidentServiceImpl residentService; + + @Mock + private Utility utility; + + @Mock + private Environment environment; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + private MainRequestDTO userOtpRequest; + + private MainRequestDTO userIdOtpRequest; + + String reqJson; + + byte[] pdfbytes; + + private ResponseEntity> responseEntity; + + private MainResponseDTO response; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyOtpController).build(); + userOtpRequest = new MainRequestDTO<>(); + userIdOtpRequest = new MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setUserId("8809909090"); + otpRequestDTOV2.setTransactionId("1234343434"); + userOtpRequest.setRequest(otpRequestDTOV2); + userOtpRequest.setId("mosip.resident.contact.details.send.otp.id"); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("111"); + otpRequestDTOV3.setUserId("8809909090"); + otpRequestDTOV3.setTransactionId("1234343434"); + userIdOtpRequest.setRequest(otpRequestDTOV3); + userIdOtpRequest.setId("mosip.resident.contact.details.update.id"); + reqJson = gson.toJson(userOtpRequest); + AuthNResponse authNResponse = new AuthNResponse(PreRegLoginConstant.EMAIL_SUCCESS, PreRegLoginConstant.SUCCESS); + response = new MainResponseDTO<>(); + response.setResponse(authNResponse); + responseEntity = new ResponseEntity<>(HttpStatus.OK); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test + public void testSendOtp() throws Exception { + Mockito.when(proxyOtpService.sendOtp(Mockito.any(), Mockito.any())).thenReturn(responseEntity); + mockMvc.perform(MockMvcRequestBuilders.post("/contact-details/send-otp").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test(expected = ResidentServiceException.class) + public void testSendOtpException() throws Exception { + doThrow(new InvalidInputException("error message")).when(validator).validateProxySendOtpRequest(Mockito.any(), Mockito.any()); + proxyOtpController.sendOTP(userOtpRequest); + } + + @Test(expected = ApisResourceAccessException.class) + public void testSendOtpExceptionApiResourceException() throws Exception { + doThrow(new ApisResourceAccessException()).when(validator).validateProxySendOtpRequest(Mockito.any(), Mockito.any()); + proxyOtpController.sendOTP(userOtpRequest); + } + + @Test(expected = Exception.class) + public void testSendOtpWithResidentServiceCheckedException() throws Exception { + Mockito.when(proxyOtpService.sendOtp(Mockito.any(), Mockito.any())).thenThrow(ResidentServiceCheckedException.class); + mockMvc.perform(MockMvcRequestBuilders.post("/contact-details/send-otp").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testValidateOtp() throws Exception { + Mockito.when(proxyOtpService.validateWithUserIdOtp(Mockito.any())).thenReturn(Tuples.of(response, "12345")); + mockMvc.perform(MockMvcRequestBuilders.post("/contact-details/update-data").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpException() throws Exception { + doThrow(new InvalidInputException("error message")).when(validator).validateUpdateDataRequest(Mockito.any()); + proxyOtpController.validateWithUserIdOtp(userIdOtpRequest); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyPartnerManagementControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyPartnerManagementControllerTest.java new file mode 100644 index 00000000000..2a085162049 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ProxyPartnerManagementControllerTest.java @@ -0,0 +1,117 @@ +package io.mosip.resident.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; + +import javax.crypto.SecretKey; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.ProxyPartnerManagementServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; + +/** + * Resident proxy partner management controller test class. + * + * @author Ritik Jain + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +public class ProxyPartnerManagementControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ProxyPartnerManagementServiceImpl proxyPartnerManagementService; + + @Mock + private AuditUtil auditUtil; + + @MockBean + private Utility utilityBean; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + private ProxyPartnerManagementController proxyPartnerManagementController; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private ResidentServiceImpl residentService; + + @Mock + private Environment env; + + @Autowired + private MockMvc mockMvc; + + private ResponseWrapper responseWrapper; + + @Before + public void setUp() throws Exception { + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyPartnerManagementController).build(); + Mockito.doNothing().when(auditUtil).setAuditRequestDto(Mockito.any()); + } + + @Test + public void testGetPartnersByPartnerType() throws Exception { + Mockito.when(proxyPartnerManagementService.getPartnersByPartnerType(Mockito.any())).thenReturn(responseWrapper); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/partners?partnerType=")).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetPartnersByPartnerTypeWithException() throws Exception { + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("property"); + Mockito.when(proxyPartnerManagementService.getPartnersByPartnerType(Mockito.any())) + .thenThrow(new ResidentServiceCheckedException()); + mockMvc.perform(MockMvcRequestBuilders.get("/auth-proxy/partners?partnerType=")).andExpect(status().isOk()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentControllerTest.java new file mode 100644 index 00000000000..7a80dbbadbe --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentControllerTest.java @@ -0,0 +1,767 @@ +package io.mosip.resident.controller; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import javax.crypto.SecretKey; + +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.cbeffutil.impl.CbeffImpl; +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.openid.bridge.api.service.validator.ScopeValidator; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AidStatusResponseDTO; +import io.mosip.resident.dto.AuthHistoryRequestDTO; +import io.mosip.resident.dto.AuthHistoryResponseDTO; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthTypeStatusDtoV2; +import io.mosip.resident.dto.BellNotificationDto; +import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.RegStatusCheckResponseDTO; +import io.mosip.resident.dto.RequestDTO; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentDemographicUpdateRequestDTO; +import io.mosip.resident.dto.ResidentDocuments; +import io.mosip.resident.dto.ResidentReprintRequestDto; +import io.mosip.resident.dto.ResidentReprintResponseDto; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResidentUpdateResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.dto.ResponseDTO1; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.dto.SortType; +import io.mosip.resident.dto.UnreadNotificationDto; +import io.mosip.resident.dto.UserInfoDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.IdAuthServiceImpl; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple3; +import reactor.util.function.Tuples; + +/** + * @author Sowmya Ujjappa Banakar + * @author Jyoti Prakash Nayak + * + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ResidentControllerTest { + + private static final String LOCALE_EN_US = "en-US"; + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ResidentServiceImpl residentService; + + @Mock + CbeffImpl cbeff; + + @MockBean + private RequestValidator validator; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private Utility utilityBean; + + @MockBean + private IdAuthServiceImpl idAuthServiceImpl; + + @MockBean + private IdentityServiceImpl identityServiceImpl; + + @MockBean + private DocumentService docService; + + @MockBean + private ScopeValidator scopeValidator; + + @MockBean + private ObjectStoreHelper objectStore; + + @Mock + private AuditUtil audit; + + @Mock + private Utility utility; + + @Mock + private Environment environment; + + @Mock + private Utilities utilities; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + ResidentController residentController; + + RequestWrapper authLockRequest; + RequestWrapper euinRequest; + RequestWrapper authHistoryRequest; + RequestWrapper authTypeStatusRequest; + + /** The array to json. */ + private String authLockRequestToJson; + private String euinRequestToJson; + private String historyRequestToJson; + private String authStatusRequestToJson; + private Gson gson; + + /** The mock mvc. */ + @Autowired + private MockMvc mockMvc; + private String schemaJson; + + @Before + public void setUp() throws ApisResourceAccessException, IOException { + MockitoAnnotations.initMocks(this); + authLockRequest = new RequestWrapper(); + + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setIndividualId("5734728510"); + authLockRequestDto.setOtp("111111"); + authLockRequestDto.setTransactionID("1234567898"); + List authTypes = new ArrayList<>(); + authTypes.add("bio-FIR"); + authLockRequestDto.setAuthType(authTypes); + authLockRequest.setRequest(authLockRequestDto); + euinRequest = new RequestWrapper(); + euinRequest.setRequest(new EuinRequestDTO("5734728510", "1234567890", IdType.UIN.name(), "UIN", "111111")); + + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(1L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + authTypeStatusRequest = new RequestWrapper<>(); + authTypeStatusRequest.setRequest(authLockOrUnLockRequestDtoV2); + authTypeStatusRequest.setRequesttime(LocalDateTime.now().toString()); + authTypeStatusRequest.setVersion("v1"); + authTypeStatusRequest.setId("io.mosip.resident.authHistory"); + gson = new GsonBuilder().serializeNulls().create(); + authLockRequestToJson = gson.toJson(authLockRequest); + euinRequestToJson = gson.toJson(euinRequest); + + authStatusRequestToJson = gson.toJson(authTypeStatusRequest); + Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("5734728510"); + when(identityServiceImpl.getIndividualIdType(Mockito.any())).thenReturn(IdType.UIN); + when(environment.getProperty(anyString())).thenReturn("property"); + when(utilities.retrieveIdRepoJsonIdResponseDto(Mockito.any())).thenReturn(new IdResponseDTO1()); + + schemaJson = "schema"; + } + + @Test + @WithUserDetails("resident") + public void testGetRidStatusSuccess() throws Exception { + RegStatusCheckResponseDTO dto = new RegStatusCheckResponseDTO(); + dto.setRidStatus("PROCESSED"); + Mockito.doReturn(dto).when(residentService).getRidStatus((RequestDTO) Mockito.any()); + this.mockMvc + .perform(post("/rid/check-status").contentType(MediaType.APPLICATION_JSON) + .content(authLockRequestToJson)) + .andExpect(status().isOk()).andExpect(jsonPath("$.response.ridStatus", is("PROCESSED"))); + } + + @Test(expected = InvalidInputException.class) + public void testGetRidStatusException() throws Exception { + RequestWrapper requestDTO = new RequestWrapper<>(); + requestDTO.setRequest(new RequestDTO()); + ReflectionTestUtils.setField(residentController, "checkStatusId", "id"); + Mockito.doThrow(InvalidInputException.class).when(validator).validateRidCheckStatusRequestDTO(Mockito.any()); + residentController.getRidStatus(requestDTO); + } + + @Test + @WithUserDetails("resident") + public void testRequestAuthLockSuccess() throws Exception { + ResponseDTO responseDto = new ResponseDTO(); + responseDto.setStatus("success"); + doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); + Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); + + this.mockMvc + .perform(post("/req/auth-lock").contentType(MediaType.APPLICATION_JSON).content(authLockRequestToJson)) + .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("success"))); + } + + @Test + @WithUserDetails("resident") + public void testReqAuthTypeLock() throws Exception { + ResponseDTO responseDto = new ResponseDTO(); + responseDto.setStatus("success"); + doNothing().when(validator).validateAuthLockOrUnlockRequestV2(Mockito.any()); + Mockito.doReturn(Tuples.of(responseDto, "12345")).when(residentService).reqAauthTypeStatusUpdateV2(Mockito.any()); + residentController.reqAauthTypeStatusUpdateV2(authTypeStatusRequest); + validator.validateAuthLockOrUnlockRequestV2(authTypeStatusRequest); + this.mockMvc.perform( + post("/auth-lock-unlock").contentType(MediaType.APPLICATION_JSON).content(authStatusRequestToJson)) + .andExpect(status().isOk()).andExpect(status().isOk()); + } + + @Test(expected = InvalidInputException.class) + public void testReqAuthTypeLockBadRequest() throws Exception { + ReflectionTestUtils.setField(residentController, "authLockStatusUpdateV2Id", "id"); + doThrow(InvalidInputException.class).when(validator).validateAuthLockOrUnlockRequestV2(Mockito.any()); + residentController.reqAauthTypeStatusUpdateV2(authTypeStatusRequest); + } + + @Test + @WithUserDetails("resident") + public void testRequestAuthLockBadRequest() throws Exception { + ResponseDTO responseDto = new ResponseDTO(); + doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); + Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); + + MvcResult result = this.mockMvc + .perform(post("/req/auth-lock").contentType(MediaType.APPLICATION_JSON).content("")) + .andExpect(status().isOk()).andReturn(); + assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); + } + + @Test + @WithUserDetails("resident") + public void testRequestEuinSuccess() throws Exception { + doNothing().when(validator).validateEuinRequest(Mockito.any()); + Mockito.doReturn(new byte[10]).when(residentService).reqEuin(Mockito.any()); + + MvcResult result = this.mockMvc + .perform(post("/req/euin").contentType(MediaType.APPLICATION_JSON).content(euinRequestToJson)) + .andExpect(status().isOk()).andReturn(); + assertEquals("application/pdf", result.getResponse().getContentType()); + } + + @Test + @WithUserDetails("resident") + public void testRequestEuinBadRequest() throws Exception { + + MvcResult result = this.mockMvc.perform(post("/req/euin").contentType(MediaType.APPLICATION_JSON).content("")) + .andExpect(status().isOk()).andReturn(); + assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); + } + + @Test + @WithUserDetails("resident") + public void testReprintUINSuccess() throws Exception { + ResidentReprintResponseDto reprintResp = new ResidentReprintResponseDto(); + reprintResp.setRegistrationId("123456789"); + reprintResp.setMessage("Notification sent"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(reprintResp); + + Mockito.when(residentService.reqPrintUin(Mockito.any())).thenReturn(reprintResp); + + RequestWrapper requestWrapper = new RequestWrapper<>(); + ResidentReprintRequestDto request = new ResidentReprintRequestDto(); + request.setIndividualId("3527812406"); + request.setIndividualIdType(IdType.UIN.name()); + request.setOtp("1234"); + request.setTransactionID("9876543210"); + requestWrapper.setRequest(request); + requestWrapper.setId(",osip.resident.reprint"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String requestAsString = gson.toJson(requestWrapper); + + this.mockMvc.perform(post("/req/print-uin").contentType(MediaType.APPLICATION_JSON).content(requestAsString)) + .andExpect(status().isOk()); + } + + @Test + @WithUserDetails("reg-admin") + public void testRequestAuthUnLockSuccess() throws Exception { + ResponseDTO responseDto = new ResponseDTO(); + responseDto.setStatus("success"); + doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); + Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); + + this.mockMvc + .perform( + post("/req/auth-unlock").contentType(MediaType.APPLICATION_JSON).content(authLockRequestToJson)) + .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("success"))); + } + + @Test + @WithUserDetails("reg-admin") + public void testRequestAuthUnLockBadRequest() throws Exception { + ResponseDTO responseDto = new ResponseDTO(); + doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); + Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); + + MvcResult result = this.mockMvc + .perform(post("/req/auth-unlock").contentType(MediaType.APPLICATION_JSON).content("")) + .andExpect(status().isOk()).andReturn(); + assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); + } + + @Test + @WithUserDetails("reg-admin") + public void testGetServiceHistorySuccess() throws Exception { + ResponseWrapper> response = new ResponseWrapper<>(); + Mockito.when(residentService.getServiceHistory(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyInt(), Mockito.any())).thenReturn(response); + residentController.getServiceHistory("eng", 1, 12, LocalDate.parse("2022-06-10"), + LocalDate.parse("2022-06-10"), SortType.ASC.toString(), + ServiceType.AUTHENTICATION_REQUEST.name(), null, null, 0, LOCALE_EN_US); + mockMvc.perform(MockMvcRequestBuilders.get("/service-history/eng").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } + + @Test(expected = InvalidInputException.class) + public void testGetServiceHistoryException() throws Exception { + ReflectionTestUtils.setField(residentController, "serviceHistoryId", "id"); + Mockito.doThrow(InvalidInputException.class).when(validator).validateServiceHistoryRequest(Mockito.any(), + Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), + Mockito.anyString()); + residentController.getServiceHistory("eng", 1, 12, LocalDate.parse("2022-06-10"), + LocalDate.parse("2022-06-10"), SortType.ASC.toString(), + ServiceType.AUTHENTICATION_REQUEST.name(), "success", "123456", 0, LOCALE_EN_US); + } + + @Test + @WithUserDetails("reg-admin") + public void testRequestAuthHistorySuccess() throws Exception { + authHistoryRequest = new RequestWrapper(); + AuthHistoryRequestDTO hisdto = new AuthHistoryRequestDTO(); + hisdto.setIndividualId("1234"); + hisdto.setOtp("1234"); + hisdto.setTransactionID("1234"); + authHistoryRequest.setRequest(hisdto); + authHistoryRequest.setId("id"); + authHistoryRequest.setRequesttime("12-12-2009"); + authHistoryRequest.setVersion("v1"); + historyRequestToJson = gson.toJson(authHistoryRequest); + AuthHistoryResponseDTO responseDto = new AuthHistoryResponseDTO(); + responseDto.setMessage("success"); + doNothing().when(validator).validateAuthHistoryRequest(Mockito.any()); + Mockito.doReturn(responseDto).when(residentService).reqAuthHistory(Mockito.any()); + + this.mockMvc + .perform( + post("/req/auth-history").contentType(MediaType.APPLICATION_JSON).content(historyRequestToJson)) + .andExpect(status().isOk()).andExpect(jsonPath("$.response.message", is("success"))); + } + + @Test(expected = InvalidInputException.class) + public void testRequestAuthHistoryBadRequest() throws Exception { + authHistoryRequest = new RequestWrapper(); + AuthHistoryRequestDTO hisdto = new AuthHistoryRequestDTO(); + hisdto.setIndividualId("1234"); + hisdto.setOtp("1234"); + hisdto.setTransactionID("1234"); + authHistoryRequest.setRequest(hisdto); + doThrow(InvalidInputException.class).when(validator).validateAuthHistoryRequest(Mockito.any()); + residentController.reqAuthHistory(authHistoryRequest); + } + + @Test + @WithUserDetails("reg-admin") + public void testRequestUINUpdate() throws Exception { + ResidentUpdateRequestDto dto = new ResidentUpdateRequestDto(); + ResidentDocuments document = new ResidentDocuments(); + document.setName("POA"); + document.setValue("abecfsgdsdg"); + List list = new ArrayList<>(); + list.add(document); + dto.setDocuments(list); + dto.setIdentityJson("sdgfdgsfhfh"); + dto.setIndividualId("9876543210"); + dto.setIndividualIdType(IdType.UIN.name()); + dto.setOtp("1234"); + dto.setTransactionID("12345"); + RequestWrapper reqWrapper = new RequestWrapper<>(); + reqWrapper.setRequest(dto); + reqWrapper.setId("mosip.resident.uin"); + reqWrapper.setVersion("v1"); + Mockito.when(residentService.reqUinUpdate(Mockito.any())).thenReturn(Tuples.of(new Object(), "123")); + String requestAsString = gson.toJson(reqWrapper); + this.mockMvc.perform(post("/req/update-uin").contentType(MediaType.APPLICATION_JSON).content(requestAsString)) + .andExpect(status().isOk()); + + } + + @Test + @WithUserDetails("reg-admin") + public void testUpdateUinDemographics() throws Exception { + ResidentDemographicUpdateRequestDTO request = new ResidentDemographicUpdateRequestDTO(); + request.setTransactionID("12345"); + request.setIdentity(JsonUtil.readValue("{\"name\":\"My Name\"}", JSONObject.class)); + + RequestWrapper requestDTO = new RequestWrapper<>(); + requestDTO.setRequest(request); + requestDTO.setId("mosip.resident.demographic"); + requestDTO.setVersion("v1"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.1"); + when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setIdentity(jsonObject); + idResponseDTO1.setResponse(responseDTO1); + when(utilities.retrieveIdRepoJsonIdResponseDto(Mockito.anyString())).thenReturn(idResponseDTO1); + when(utilities.convertIdResponseIdentityObjectToJsonObject(Mockito.any())).thenReturn(jsonObject); + Tuple3 idRepoJsonSchemaJsonAndIdResponseDtoTuple = Tuples.of(jsonObject, schemaJson, idResponseDTO1); + when(utilities. + getIdentityDataFromIndividualID(Mockito.anyString())).thenReturn(idRepoJsonSchemaJsonAndIdResponseDtoTuple); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("9876543210"); + when(residentService.reqUinUpdate(Mockito.any(), Mockito.any(), Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(Tuples.of(new ResidentUpdateResponseDTO(), "12345")); + ResponseEntity responseEntity = residentController + .updateUinDemographics(requestDTO); + assertEquals(new ResidentUpdateResponseDTO(), ((ResponseWrapper)responseEntity.getBody()).getResponse()); + } + + @Test(expected = InvalidInputException.class) + public void testUpdateUinDemographicsIdTypeUINException() throws Exception { + Mockito.when(validator.validateUin(Mockito.anyString())).thenReturn(true); + Mockito.doThrow(InvalidInputException.class).when(validator).validateUpdateRequest(Mockito.any(), Mockito.anyBoolean(), Mockito.anyString()); + ResidentDemographicUpdateRequestDTO request = new ResidentDemographicUpdateRequestDTO(); + request.setTransactionID("12345"); + request.setIdentity(JsonUtil.readValue("{\"name\":\"My Name\"}", JSONObject.class)); + + RequestWrapper requestDTO = new RequestWrapper<>(); + requestDTO.setRequest(request); + requestDTO.setId("mosip.resident.demographic"); + requestDTO.setVersion("v1"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.1"); + Tuple3 idRepoJsonSchemaJsonAndIdResponseDtoTuple = Tuples.of(jsonObject, schemaJson, new IdResponseDTO1()); + when(utilities. + getIdentityDataFromIndividualID(Mockito.anyString())).thenReturn(idRepoJsonSchemaJsonAndIdResponseDtoTuple); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("9876543210"); + residentController.updateUinDemographics(requestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testUpdateUinDemographicsIdTypeVIDException() throws Exception { + Mockito.when(validator.validateVid(Mockito.anyString())).thenReturn(true); + Mockito.doThrow(InvalidInputException.class).when(validator).validateUpdateRequest(Mockito.any(), Mockito.anyBoolean(), Mockito.anyString()); + ResidentDemographicUpdateRequestDTO request = new ResidentDemographicUpdateRequestDTO(); + request.setTransactionID("12345"); + request.setIdentity(JsonUtil.readValue("{\"name\":\"My Name\"}", JSONObject.class)); + + RequestWrapper requestDTO = new RequestWrapper<>(); + requestDTO.setRequest(request); + requestDTO.setId("mosip.resident.demographic"); + requestDTO.setVersion("v1"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.1"); + Tuple3 idRepoJsonSchemaJsonAndIdResponseDtoTuple = Tuples.of(jsonObject, schemaJson, new IdResponseDTO1()); + when(utilities. + getIdentityDataFromIndividualID(Mockito.anyString())).thenReturn(idRepoJsonSchemaJsonAndIdResponseDtoTuple); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("9876543210"); + residentController.updateUinDemographics(requestDTO); + } + + @Test + @WithUserDetails("reg-admin") + public void testAuthLockStatus() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("9876543210"); + when(residentService.getAuthLockStatus(Mockito.any())).thenReturn(responseWrapper); + ResponseWrapper resultRequestWrapper = residentController.getAuthLockStatus(); + assertEquals(responseWrapper, resultRequestWrapper); + } + + @Test + @WithUserDetails("reg-admin") + public void testAuthLockStatusFailed() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorCode(), + ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorMessage()))); + responseWrapper.setResponsetime(null); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("9876543210"); + when(residentService.getAuthLockStatus(Mockito.any())) + .thenThrow(new ResidentServiceCheckedException("error", "error")); + ResponseWrapper resultRequestWrapper = residentController.getAuthLockStatus(); + resultRequestWrapper.setResponsetime(null); + assertEquals(responseWrapper, resultRequestWrapper); + } + + @Test + @WithUserDetails("reg-admin") + public void testDownloadCardIndividualId() throws Exception { + ResponseEntity responseEntity; + byte[] pdfBytes = "test".getBytes(StandardCharsets.UTF_8); + InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(pdfBytes)); + responseEntity = ResponseEntity.ok().contentType(MediaType.parseMediaType("application/pdf")) + .header("Content-Disposition", "attachment; filename=\"" + + "abc" + ".pdf\"") + .body(resource); + + when(residentService.downloadCard(Mockito.anyString())).thenReturn(Tuples.of(pdfBytes, IdType.UIN)); + ResponseEntity resultRequestWrapper = residentController + .downloadCard("9876543210", 0, LOCALE_EN_US); + assertEquals(responseEntity.getStatusCode(), resultRequestWrapper.getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + @WithUserDetails("reg-admin") + public void testDownloadCardIndividualIdInvalidInputException() throws Exception { + ReflectionTestUtils.setField(residentController, "downloadCardEventidId", "id"); + doThrow(new InvalidInputException()).when(validator).validateEventId(any()); + residentController.downloadCard("9876543210", 0, LOCALE_EN_US); + } + + @Test + @WithUserDetails("reg-admin") + public void testCheckAidStatus() throws Exception { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("8251649601"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(aidStatusRequestDTO); + requestWrapper.setId("mosip.resident.uin"); + requestWrapper.setVersion("1.0"); + Mockito.when(residentService.getAidStatus(Mockito.any(), Mockito.anyBoolean())).thenReturn(new AidStatusResponseDTO()); + String requestAsString = gson.toJson(requestWrapper); + this.mockMvc + .perform( + post("/aid/status").contentType(MediaType.APPLICATION_JSON).content(requestAsString)) + .andExpect(status().isOk()); + } + + @Test + @WithUserDetails("reg-admin") + public void testGetCredentialRequestStatusSuccess() throws Exception { + residentController.checkEventIdStatus("17", "eng", 0, LOCALE_EN_US); + this.mockMvc.perform(get("/events/86c2ad43-e2a4-4952-bafc-d97ad1e5e453/?langCode=eng")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testCheckEventIdStatusWithException() throws Exception { + when(residentService.getEventStatus(anyString(), anyString(), anyInt(), anyString())).thenThrow(new ResidentServiceCheckedException()); + residentController.checkEventIdStatus("17", "eng", 0, LOCALE_EN_US); + } + + @Test + @WithUserDetails("reg-admin") + public void testGetUserInfo() throws Exception { + UserInfoDto user = new UserInfoDto(); + user.setFullName("name"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(user); + residentController.userinfo(null, 0, LOCALE_EN_US); + Mockito.when(residentService.getUserinfo(Mockito.any(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn(response); + this.mockMvc.perform(get("/profile")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testGetUserInfoWithException() throws Exception { + Mockito.when(residentService.getUserinfo(Mockito.any(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + residentController.userinfo("eng", 0, LOCALE_EN_US); + } + + @Test + @WithUserDetails("reg-admin") + public void testBellClickdttimes() throws Exception { + BellNotificationDto dto = new BellNotificationDto(); + dto.setLastbellnotifclicktime(LocalDateTime.now()); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(dto); + Mockito.when(residentService.getbellClickdttimes(Mockito.anyString())).thenReturn(response); + residentController.bellClickdttimes(); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testBellClickdttimesWithException() throws Exception { + when(identityServiceImpl.getResidentIdaToken()).thenThrow(new ApisResourceAccessException()); + residentController.bellClickdttimes(); + } + + @Test + @WithUserDetails("reg-admin") + public void testNotificationCount() throws Exception { + UnreadNotificationDto dto = new UnreadNotificationDto(); + dto.setUnreadCount(10L); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(dto); + Mockito.when(residentService.getnotificationCount(Mockito.anyString())).thenReturn(response); + residentController.notificationCount(); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testNotificationCountException() throws Exception { + ReflectionTestUtils.setField(residentController, "serviceEventId", "id"); + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenReturn("1234567890"); + Mockito.when(residentService.getnotificationCount(Mockito.anyString())).thenThrow(ResidentServiceCheckedException.class); + residentController.notificationCount(); + } + + @Test + @WithUserDetails("reg-admin") + public void testBellupdateClickdttimes() throws Exception { + int response = 10; + Mockito.when(residentService.updatebellClickdttimes(Mockito.anyString())).thenReturn(response); + residentController.bellupdateClickdttimes(); + } + + @Test + @WithUserDetails("reg-admin") + public void testGetNotificationsList() throws Exception { + PageDto dto = new PageDto(); + dto.setData(List.of()); + ResponseWrapper> response = new ResponseWrapper<>(); + response.setResponse(dto); + Mockito.when(residentService.getNotificationList(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString(), + Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn(response); + residentController.getNotificationsList("eng", 0, 10, 0, LOCALE_EN_US); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testGetNotificationsListWithException() throws Exception { + when(identityServiceImpl.getResidentIdaToken()).thenThrow(new ApisResourceAccessException()); + residentController.getNotificationsList("eng", 0, 10, 0, LOCALE_EN_US); + } + + @Test + @WithUserDetails("reg-admin") + public void testDownLoadServiceHistory() throws Exception { + ReflectionTestUtils.setField(residentController, "maxEventsServiceHistoryPageSize", 10); + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setEventId("1234567890"); + serviceHistoryResponseDto.setEventStatus("Success"); + PageDto dto = new PageDto<>(); + dto.setData(List.of(serviceHistoryResponseDto)); + dto.setPageIndex(0); + dto.setPageSize(10); + ResponseWrapper> response = new ResponseWrapper<>(); + response.setResponse(dto); + Mockito.when(residentService.getServiceHistory(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyInt(), + Mockito.any())).thenReturn(response); + Mockito.when(utility.getFileName(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn("filename"); + byte[] bytes = "abc".getBytes(StandardCharsets.UTF_8); + Mockito.when( + residentService.downLoadServiceHistory(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())) + .thenReturn(bytes); + residentController.downLoadServiceHistory(LocalDateTime.now(), LocalDate.now(), LocalDate.now(), SortType.ASC.name(), + ServiceType.ID_MANAGEMENT_REQUEST.name(), EventStatus.SUCCESS.name(), "", "eng", 0, LOCALE_EN_US); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testDownLoadServiceHistoryWithException() throws Exception { + ReflectionTestUtils.setField(residentController, "maxEventsServiceHistoryPageSize", 10); + Mockito.when(residentService.getServiceHistory(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyInt(), + Mockito.any())).thenThrow(new ApisResourceAccessException()); + residentController.downLoadServiceHistory(LocalDateTime.now(), LocalDate.now(), LocalDate.now(), SortType.ASC.name(), + ServiceType.ID_MANAGEMENT_REQUEST.name(), EventStatus.SUCCESS.name(), "", "eng", 0, LOCALE_EN_US); + } + + @Test(expected = ResidentServiceException.class) + @WithUserDetails("reg-admin") + public void testCheckAidStatusWithException() throws Exception { + ReflectionTestUtils.setField(residentController, "checkStatusId", "id"); + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("5734728510"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + RequestWrapper reqDto = new RequestWrapper<>(); + reqDto.setRequest(aidStatusRequestDTO); + AidStatusResponseDTO response = new AidStatusResponseDTO(); + response.setAidStatus("uin generator"); + Mockito.when(residentService.getAidStatus(Mockito.any(), Mockito.anyBoolean())).thenThrow(new ResidentServiceCheckedException("res-ser", "error")); + residentController.checkAidStatus(reqDto); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentCredentialControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentCredentialControllerTest.java new file mode 100644 index 00000000000..d1e0e77a2e3 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentCredentialControllerTest.java @@ -0,0 +1,299 @@ +package io.mosip.resident.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.List; + +import javax.crypto.SecretKey; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.cbeffutil.impl.CbeffImpl; +import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; +import io.mosip.resident.dto.CredentialCancelRequestResponseDto; +import io.mosip.resident.dto.CredentialRequestStatusResponseDto; +import io.mosip.resident.dto.CredentialTypeResponse; +import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResidentCredentialResponseDtoV2; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.dto.ShareCredentialRequestDto; +import io.mosip.resident.exception.ResidentCredentialServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.ResidentConfigServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ResidentCredentialControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ResidentCredentialService residentCredentialService; + + @Mock + CbeffImpl cbeff; + + @MockBean + private Utility utilityBean; + + @MockBean + private RequestValidator validator; + + @Mock + private AuditUtil audit; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private DocumentService docService; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + private ResidentConfigServiceImpl residentConfigService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private TemplateUtil templateUtil; + + @MockBean + private CryptoCoreSpec encryptor; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @InjectMocks + ResidentCredentialController residentCredentialController; + + @Autowired + private MockMvc mockMvc; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + ResidentCredentialResponseDto credentialReqResponse; + + CredentialCancelRequestResponseDto credentialCancelReqResponse; + + CredentialRequestStatusResponseDto credentialReqStatusResponse; + + PartnerCredentialTypePolicyDto partnerCredentialTypeReqResponse; + + ResidentCredentialResponseDtoV2 dtoV2; + + String reqCredentialEventJson; + + byte[] pdfbytes; + + @Before + public void setup() throws Exception { + credentialReqStatusResponse = new CredentialRequestStatusResponseDto(); + credentialCancelReqResponse = new CredentialCancelRequestResponseDto(); + credentialReqResponse = new ResidentCredentialResponseDto(); + partnerCredentialTypeReqResponse = new PartnerCredentialTypePolicyDto(); + dtoV2 = new ResidentCredentialResponseDtoV2(); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(residentCredentialController).build(); + ResidentCredentialRequestDto credentialRequestDto = new ResidentCredentialRequestDto(); + credentialRequestDto.setIndividualId("123456"); + RequestWrapper requestDTO = new RequestWrapper<>(); + requestDTO.setRequest(credentialRequestDto); + reqJson = gson.toJson(requestDTO); + pdfbytes = "uin".getBytes(); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + + Mockito.when(residentCredentialService.reqCredential(Mockito.any())).thenReturn(credentialReqResponse); + + mockMvc.perform(MockMvcRequestBuilders.post("/req/credential").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testCreateRequestGenerationWithResidentCredentialServiceException() throws Exception { + + Mockito.when(residentCredentialService.reqCredential(Mockito.any())).thenThrow(ResidentCredentialServiceException.class); + + mockMvc.perform(MockMvcRequestBuilders.post("/req/credential").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(reqJson.getBytes())).andExpect(status().isOk()); + } + + @Test + public void testRequestShareCredWithPartner() throws Exception { + Mockito.when(residentCredentialService.shareCredential(Mockito.any(), Mockito.anyString(), Mockito.any())) + .thenReturn(Tuples.of(dtoV2, "12345")); + ShareCredentialRequestDto request = new ShareCredentialRequestDto(); + SharableAttributesDTO attr = new SharableAttributesDTO(); + attr.setAttributeName("name"); + attr.setMasked(false); + request.setSharableAttributes(List.of(attr)); + request.setPurpose("banking"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(request); + mockMvc.perform(MockMvcRequestBuilders.post("/share-credential").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(gson.toJson(requestWrapper).getBytes())).andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testRequestShareCredWithPartnerWithResidentCredentialServiceException() throws Exception { + ReflectionTestUtils.setField(residentCredentialController, "shareCredentialId", "resident.share.credential.id"); + Mockito.when(residentCredentialService.shareCredential(Mockito.any(), Mockito.anyString(), Mockito.any())) + .thenThrow(ResidentCredentialServiceException.class); + ShareCredentialRequestDto request = new ShareCredentialRequestDto(); + SharableAttributesDTO attr = new SharableAttributesDTO(); + attr.setAttributeName("name"); + attr.setMasked(false); + request.setSharableAttributes(List.of(attr)); + request.setPurpose("banking"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(request); + mockMvc.perform(MockMvcRequestBuilders.post("/share-credential").contentType(MediaType.APPLICATION_JSON_VALUE) + .content(gson.toJson(requestWrapper).getBytes())).andExpect(status().isOk()); + } + + @Test + public void testgetCredentialRequestStatusSuccess() throws Exception { + + Mockito.when(residentCredentialService.getStatus(Mockito.any())).thenReturn(credentialReqStatusResponse); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/status/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test(expected = Exception.class) + public void testgetCredentialRequestStatusWithResidentCredentialServiceException() throws Exception { + + Mockito.when(residentCredentialService.getStatus(Mockito.any())).thenThrow(ResidentCredentialServiceException.class); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/status/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test + public void testgGetCardSuccess() throws Exception { + + Mockito.when(residentCredentialService.getCard(Mockito.any())).thenReturn(pdfbytes); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/card/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(status().isOk()); + + } + + @Test(expected = Exception.class) + public void testgGetCardWithResidentCredentialServiceException() throws Exception { + + Mockito.when(residentCredentialService.getCard(Mockito.any())).thenThrow(ResidentCredentialServiceException.class); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/card/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(status().isOk()); + + } + + @Test + public void testGetCredentialTypesSuccess() throws Exception { + Mockito.when(residentCredentialService.getCredentialTypes()).thenReturn(new CredentialTypeResponse()); + mockMvc.perform(MockMvcRequestBuilders.get("/credential/types").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test(expected = Exception.class) + public void testGetCredentialTypesWithResidentCredentialServiceException() throws Exception { + Mockito.when(residentCredentialService.getCredentialTypes()).thenThrow(ResidentCredentialServiceException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/credential/types").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test + public void testCancelRequestSuccess() throws Exception { + + Mockito.when(residentCredentialService.cancelCredentialRequest(Mockito.any())) + .thenReturn(credentialCancelReqResponse); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/cancel/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test(expected = Exception.class) + public void testCancelRequestWithResidentCredentialServiceException() throws Exception { + + Mockito.when(residentCredentialService.cancelCredentialRequest(Mockito.any())) + .thenThrow(ResidentCredentialServiceException.class); + + mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/cancel/requestId") + .contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + + } + + @Test + public void testPartnerIdCredentialType() throws Exception { + Mockito.when(residentCredentialService.getPolicyByCredentialType(Mockito.any(), Mockito.any())).thenReturn(new ResponseWrapper<>()); + mockMvc.perform(MockMvcRequestBuilders.get("/req/policy/partnerId/1/credentialType/credentialType").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testPartnerIdCredentialTypeWithResidentCredentialServiceException() throws Exception { + Mockito.when(residentCredentialService.getPolicyByCredentialType(Mockito.any(), Mockito.any())).thenThrow(ResidentCredentialServiceException.class); + mockMvc.perform(MockMvcRequestBuilders.get("/req/policy/partnerId/1/credentialType/credentialType").contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(status().isOk()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentOtpControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentOtpControllerTest.java new file mode 100644 index 00000000000..35feadce9d4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentOtpControllerTest.java @@ -0,0 +1,200 @@ +package io.mosip.resident.controller; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.IndividualIdResponseDto; +import io.mosip.resident.dto.OtpRequestDTO; +import io.mosip.resident.dto.OtpResponseDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentUpdateService; +import io.mosip.resident.handler.service.UinCardRePrintService; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentOtpService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ResidentOtpControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ResidentOtpService residentOtpService; + + @MockBean + private RequestValidator validator; + + @MockBean + private ResidentUpdateService residentUpdateService; + + @MockBean + private IdAuthService idAuthService; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private NotificationService notificationService; + + @MockBean + private UinCardRePrintService rePrintService; + + @MockBean + private Utility utility; + + @MockBean + private Utilities utilities; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private ResidentServiceImpl residentService; + + @Mock + private AuditUtil audit; + + @InjectMocks + ResidentOtpController residentOtpController; + + @Autowired + private MockMvc mockMvc; + + Gson gson = new GsonBuilder().serializeNulls().create(); + + String reqJson; + + OtpResponseDTO otpResponseDTO; + + OtpRequestDTO otpRequestDTO; + + @Before + public void setup() throws Exception { + otpResponseDTO = new OtpResponseDTO(); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(residentOtpController).build(); + otpRequestDTO = new OtpRequestDTO(); + otpRequestDTO.setIndividualId("123456"); + otpRequestDTO.setTransactionID("1234327890"); + reqJson = gson.toJson(otpRequestDTO); + ReflectionTestUtils.setField(residentOtpController, "otpRequestId", "mosip.identity.otp.internal"); + ReflectionTestUtils.setField(residentOtpController, "otpRequestVersion", "1.0"); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + Mockito.when(residentOtpService.generateOtp(Mockito.any())).thenReturn(otpResponseDTO); + mockMvc.perform( + MockMvcRequestBuilders.post("/req/otp").contentType(MediaType.APPLICATION_JSON_VALUE).content(reqJson)) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testCreateRequestGenerationWithResidentServiceException() throws Exception { + Mockito.when(residentOtpService.generateOtp(Mockito.any())).thenThrow(ResidentServiceException.class); + mockMvc.perform( + MockMvcRequestBuilders.post("/req/otp").contentType(MediaType.APPLICATION_JSON_VALUE).content(reqJson)) + .andExpect(status().isOk()); + } + + @Test + public void reqOtpForAidTest() throws Exception { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = new IndividualIdOtpRequestDTO(); + individualIdOtpRequestDTO.setIndividualId("123456789"); + IndividualIdResponseDto individualIdResponseDto = new IndividualIdResponseDto(); + individualIdResponseDto.setTransactionId("12345678"); + Mockito.when(residentOtpService.generateOtpForIndividualId(individualIdOtpRequestDTO)).thenReturn(individualIdResponseDto); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(individualIdOtpRequestDTO); + this.mockMvc.perform( + MockMvcRequestBuilders.post("/individualId/otp").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void reqOtpForAidTestResidentServiceCheckedException() throws Exception { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = new IndividualIdOtpRequestDTO(); + individualIdOtpRequestDTO.setIndividualId("123456789"); + IndividualIdResponseDto individualIdResponseDto = new IndividualIdResponseDto(); + individualIdResponseDto.setTransactionId("12345678"); + Mockito.when(residentOtpService.generateOtpForIndividualId(individualIdOtpRequestDTO)).thenThrow(new ResidentServiceCheckedException("res-ser", "error thrown")); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(individualIdOtpRequestDTO); + this.mockMvc.perform( + MockMvcRequestBuilders.post("/individualId/otp").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void reqOtpForAidTestInvalidInputException() throws Exception { + doThrow(new InvalidInputException()).when(validator).validateReqOtp(any()); + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = new IndividualIdOtpRequestDTO(); + individualIdOtpRequestDTO.setIndividualId("123456789"); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(individualIdOtpRequestDTO); + this.mockMvc.perform( + MockMvcRequestBuilders.post("/individualId/otp").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()); + } + + @WithUserDetails("resident") + public void reqOtpForAidNullTest() throws Exception { + ReflectionTestUtils.setField(residentOtpController, "otpRequestId", "id"); + IndividualIdOtpRequestDTO aidOtpRequestDTO = new IndividualIdOtpRequestDTO(); + aidOtpRequestDTO.setIndividualId(null); + IndividualIdResponseDto individualIdResponseDto = new IndividualIdResponseDto(); + Mockito.when(residentOtpService.generateOtpForIndividualId(Mockito.any())).thenReturn(individualIdResponseDto); + assertNotNull(residentOtpController.reqOtpForIndividualId(aidOtpRequestDTO)); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVerificationControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVerificationControllerTest.java new file mode 100644 index 00000000000..19faec3a9a8 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVerificationControllerTest.java @@ -0,0 +1,118 @@ +package io.mosip.resident.controller; + +import static org.mockito.Mockito.doThrow; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import io.mosip.resident.dto.VerificationResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; + +/** + * Resident Verification Controller Test Note: This class is used to test the + * Resident Verification Controller + * + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ResidentVerificationControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private VerificationService verificationService; + + @MockBean + private IdAuthService idAuthService; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private Utility utilityBean; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + private RequestValidator requestValidator; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @MockBean + private ResidentServiceImpl residentService; + + @Mock + private AuditUtil audit; + + @InjectMocks + VerificationController verificationController; + + @Autowired + private MockMvc mockMvc; + + VerificationResponseDTO verificationResponseDTO; + + @Before + public void setup() throws Exception { + verificationResponseDTO = new VerificationResponseDTO(); + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(verificationController).build(); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + Mockito.when(verificationService.checkChannelVerificationStatus(Mockito.any(), Mockito.any())) + .thenReturn(verificationResponseDTO); + mockMvc.perform( + MockMvcRequestBuilders.get("/channel/verification-status/?channel=EMAIL&individualId=8251649601")) + .andExpect(status().isOk()); + } + + @Test(expected = Exception.class) + public void testGetChannelVerificationStatusWithException() throws Exception { + doThrow(new ResidentServiceCheckedException()).when(verificationService) + .checkChannelVerificationStatus(Mockito.anyString(), Mockito.anyString()); + mockMvc.perform( + MockMvcRequestBuilders.get("/channel/verification-status/?channel=EMAIL&individualId=8251649601")) + .andExpect(status().isOk()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentVidControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVidControllerTest.java similarity index 66% rename from resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentVidControllerTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVidControllerTest.java index 04d2e0267c4..3ba65d39725 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentVidControllerTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/ResidentVidControllerTest.java @@ -1,443 +1,563 @@ -package io.mosip.resident.test.controller; - -import static org.hamcrest.CoreMatchers.is; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.env.Environment; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.web.client.RestTemplate; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.dto.RequestWrapper; -import io.mosip.resident.dto.ResidentVidRequestDto; -import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.dto.VidRequestDto; -import io.mosip.resident.dto.VidResponseDto; -import io.mosip.resident.dto.VidRevokeRequestDTO; -import io.mosip.resident.dto.VidRevokeResponseDTO; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.exception.VidCreationException; -import io.mosip.resident.exception.VidRevocationException; -import io.mosip.resident.service.impl.IdAuthServiceImpl; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.service.impl.ResidentVidServiceImpl; -import io.mosip.resident.test.ResidentTestBootApplication; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ResidentTestBootApplication.class) -@AutoConfigureMockMvc -@TestPropertySource(locations = "classpath:application.properties") -public class ResidentVidControllerTest { - - private static final String JSON_STRING_RESPONSE = ""; - - @MockBean - private ResidentVidServiceImpl residentVidService; - - @MockBean - private IdAuthServiceImpl idAuthService; - - @MockBean - private ResidentServiceImpl residentService; - - @MockBean - private ResidentServiceRestClient residentServiceRestClient; - - @MockBean - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Mock - private Environment env; - - @Autowired - private MockMvc mockMvc; - - @Mock - private AuditUtil audit; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - } - - @Test - @WithUserDetails("resident") - public void vidCreationSuccessTest() throws Exception { - - VidResponseDto dto = new VidResponseDto(); - dto.setVid("12345"); - dto.setMessage("Successful"); - - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setResponse(dto); - - Mockito.when(residentVidService.generateVid(Mockito.any(VidRequestDto.class))).thenReturn(responseWrapper); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(getRequest()); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk());// .andExpect(jsonPath("$.response.vid", is("12345"))); - } - - @Test - @WithUserDetails("resident") - public void otpValidationFailureTest() throws Exception { - - Mockito.when(residentVidService.generateVid(Mockito.any(VidRequestDto.class))) - .thenThrow(new OtpValidationFailedException()); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(getRequest()); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-422"))); - } - - @Test - @WithUserDetails("resident") - public void vidCreationFailureTest() throws Exception { - - Mockito.when(residentVidService.generateVid(Mockito.any(VidRequestDto.class))) - .thenThrow(new VidCreationException()); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(getRequest()); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-418"))); - } - - @Test - @WithUserDetails("resident") - public void invalidId() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.setId(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidVersion() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.setVersion(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidRequest() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.setRequest(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidVidType() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.getRequest().setVidType(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidIndividualId() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.getRequest().setIndividualId(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidTransactionId() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.getRequest().setTransactionID(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void invalidOtp() throws Exception { - - ResidentVidRequestDto request = getRequest(); - request.getRequest().setOtp(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("resident") - public void vidRevokingSuccessTest() throws Exception { - - VidRevokeResponseDTO dto = new VidRevokeResponseDTO(); - dto.setMessage("Successful"); - - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setResponse(dto); - - Mockito.when(residentVidService.revokeVid(Mockito.any(VidRevokeRequestDTO.class), Mockito.anyString())) - .thenReturn(responseWrapper); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(getRevokeRequest()); - - RequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540").content(json) - .contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()); - //.andExpect(jsonPath("$.response.message", is("Successful"))); - - } - - @Test - @WithUserDetails("resident") - public void vidRevokingFailureTest() throws Exception { - - Mockito.when(residentVidService.revokeVid(Mockito.any(VidRevokeRequestDTO.class), Mockito.anyString())) - .thenThrow(new VidRevocationException()); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(getRevokeRequest()); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-418"))); - - } - - @Test - @WithUserDetails("reg-admin") - public void invalidIdRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.setId(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidVersionRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.setVersion(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidRequestRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.setRequest(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidVidStatusRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.getRequest().setVidStatus(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidIndividualIdTypeRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.getRequest().setIndividualIdType(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidIndividualIdRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.getRequest().setIndividualId(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidTransactionIdRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.getRequest().setTransactionID(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - @Test - @WithUserDetails("reg-admin") - public void invalidOtpRevokeTest() throws Exception { - - RequestWrapper request = getRevokeRequest(); - request.getRequest().setOtp(null); - Gson gson = new GsonBuilder().serializeNulls().create(); - String json = gson.toJson(request); - - MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") - .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) - .characterEncoding("UTF-8"); - - this.mockMvc.perform(builder).andExpect(status().isOk()) - .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); - } - - private static ResidentVidRequestDto getRequest() { - VidRequestDto vidRequestDto = new VidRequestDto(); - vidRequestDto.setIndividualId("9072037081"); - vidRequestDto.setOtp("974436"); - vidRequestDto.setTransactionID("1111122222"); - vidRequestDto.setVidType("Temporary"); - - ResidentVidRequestDto request = new ResidentVidRequestDto(); - request.setId("mosip.resident.vid"); - request.setVersion("v1"); - - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); - request.setRequest(vidRequestDto); - return request; - } - - private static RequestWrapper getRevokeRequest() { - VidRevokeRequestDTO vidRevokeRequestDTO = new VidRevokeRequestDTO(); - vidRevokeRequestDTO.setIndividualId("2038096257310540"); - vidRevokeRequestDTO.setIndividualIdType(IdType.VID.name()); - vidRevokeRequestDTO.setOtp("974436"); - vidRevokeRequestDTO.setTransactionID("1111122222"); - vidRevokeRequestDTO.setVidStatus("REVOKED"); - - RequestWrapper request = new RequestWrapper(); - request.setId("mosip.resident.vidstatus"); - request.setVersion("v1"); - request.setRequesttime(DateUtils.getUTCCurrentDateTimeString("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); - request.setRequest(vidRevokeRequestDTO); - return request; - } - -} +package io.mosip.resident.controller; + +import static org.hamcrest.CoreMatchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.List; +import java.util.Map; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.dto.BaseVidRequestDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentVidRequestDto; +import io.mosip.resident.dto.ResidentVidRequestDtoV2; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidRequestDto; +import io.mosip.resident.dto.VidRequestDtoV2; +import io.mosip.resident.dto.VidResponseDto; +import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.dto.VidRevokeRequestDTOV2; +import io.mosip.resident.dto.VidRevokeResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.exception.VidRevocationException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.impl.IdAuthServiceImpl; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.service.impl.ResidentVidServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class ResidentVidControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + private ResidentVidServiceImpl residentVidService; + + @MockBean + private Utility utilityBean; + + @InjectMocks + private ResidentVidController residentVidController; + + @MockBean + private IdAuthServiceImpl idAuthService; + + @MockBean + private IdentityServiceImpl identityServiceImpl; + + @MockBean + private ResidentServiceImpl residentService; + + @MockBean + @Qualifier("restClientWithPlainRestTemplate") + private ResidentServiceRestClient residentServiceRestClient; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private Environment env; + + @Autowired + private MockMvc mockMvc; + + @Mock + private AuditUtil audit; + + @Mock + private RequestValidator validator; + + @Before + public void setup() throws ApisResourceAccessException { + MockitoAnnotations.initMocks(this); + Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn(null); + } + + @Test + @WithUserDetails("resident") + public void vidCreationSuccessTest() throws Exception { + + VidResponseDto dto = new VidResponseDto(); + dto.setVid("12345"); + dto.setMessage("Successful"); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + + Mockito.when(residentVidService.generateVid(Mockito.any(), Mockito.anyString())).thenReturn(responseWrapper); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(getRequest()); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk());// .andExpect(jsonPath("$.response.vid", is("12345"))); + } + + @Test + @WithUserDetails("resident") + public void otpValidationFailureTest() throws Exception { + + Mockito.when(residentVidService.generateVid(Mockito.any(), Mockito.anyString())) + .thenThrow(new OtpValidationFailedException()); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(getRequest()); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-422"))); + } + + @Test + @WithUserDetails("resident") + public void vidCreationFailureTest() throws Exception { + + Mockito.when(residentVidService.generateVid(Mockito.any(), Mockito.anyString())) + .thenThrow(new VidCreationException()); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(getRequest()); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-406"))); + } + + @Test + @WithUserDetails("resident") + public void invalidId() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.setId(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void invalidVersion() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.setVersion(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void invalidRequest() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.setRequest(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void invalidIndividualId() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.getRequest().setIndividualId(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void invalidTransactionId() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.getRequest().setTransactionID(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void invalidOtp() throws Exception { + + ResidentVidRequestDto request = getRequest(); + request.getRequest().setOtp(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + this.mockMvc.perform(post("/vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()).andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("resident") + public void vidRevokingSuccessTest() throws Exception { + VidRevokeResponseDTO dto = new VidRevokeResponseDTO(); + dto.setMessage("Successful"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + + Mockito.when(residentVidService.revokeVid(Mockito.any(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(responseWrapper); + + residentVidController.revokeVid(getRevokeRequest(), "123457987765422"); + } + + @Test + @WithUserDetails("resident") + public void vidRevokingFailureTest2() throws Exception { + + Mockito.when(residentVidService.revokeVid(Mockito.any(VidRevokeRequestDTO.class), Mockito.anyString(), Mockito.anyString())) + .thenThrow(new VidRevocationException()); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(getRevokeRequest()); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-407"))); + + } + + @Test + @WithUserDetails("reg-admin") + public void invalidIdRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.setId(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidVersionRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.setVersion(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidRequestRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.setRequest(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidVidStatusRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.getRequest().setVidStatus(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-471"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidIndividualIdTypeRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310540") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidIndividualIdRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.getRequest().setIndividualId(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidTransactionIdRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.getRequest().setTransactionID(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + @Test + @WithUserDetails("reg-admin") + public void invalidOtpRevokeTest() throws Exception { + + RequestWrapper request = getRevokeRequest(); + request.getRequest().setOtp(null); + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(request); + + MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.patch("/vid/{vid}", "2038096257310541") + .content(json).contentType(MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON_VALUE) + .characterEncoding("UTF-8"); + + this.mockMvc.perform(builder).andExpect(status().isOk()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-410"))); + } + + private static ResidentVidRequestDto getRequest() { + VidRequestDto vidRequestDto = new VidRequestDto(); + vidRequestDto.setIndividualId("9072037081"); + vidRequestDto.setOtp("974436"); + vidRequestDto.setTransactionID("1111122222"); + vidRequestDto.setVidType("Temporary"); + + ResidentVidRequestDto request = new ResidentVidRequestDto(); + request.setId("mosip.resident.vid"); + request.setVersion("v1"); + + request.setRequesttime(DateUtils.getUTCCurrentDateTimeString("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); + request.setRequest(vidRequestDto); + return request; + } + + private static RequestWrapper getRevokeRequest() { + VidRevokeRequestDTO vidRevokeRequestDTO = new VidRevokeRequestDTO(); + vidRevokeRequestDTO.setIndividualId("2038096257310540"); + vidRevokeRequestDTO.setOtp("974436"); + vidRevokeRequestDTO.setTransactionID("1111122222"); + vidRevokeRequestDTO.setVidStatus("REVOKED"); + + RequestWrapper request = new RequestWrapper(); + request.setId("mosip.resident.vidstatus"); + request.setVersion("v1"); + request.setRequesttime(DateUtils.getUTCCurrentDateTimeString("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); + request.setRequest(vidRevokeRequestDTO); + return request; + } + + @Test + @WithUserDetails("reg-admin") + public void testGetVidPolicy() throws Exception { + when(residentVidService.getVidPolicy()).thenReturn("policy"); + this.mockMvc.perform(get("/vid/policy")).andExpect(status().isOk()).andDo(print()); + } + + @Test + @WithUserDetails("reg-admin") + public void testGetVidPolicyFailed() throws Exception { + when(residentVidService.getVidPolicy()).thenThrow(new ResidentServiceCheckedException()); + this.mockMvc.perform(get("/vid/policy")).andExpect(status().isOk()).andDo(print()) + .andExpect(jsonPath("$.errors[0].errorCode", is("RES-SER-426"))); + } + + @Test + @WithUserDetails("reg-admin") + public void vidCreationV2SuccessTest() throws Exception { + + VidResponseDto dto = new VidResponseDto(); + dto.setVid("12345"); + dto.setMessage("Successful"); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + + Mockito.when(residentVidService.generateVid(Mockito.any(BaseVidRequestDto.class), any())).thenReturn(responseWrapper); + + Gson gson = new GsonBuilder().serializeNulls().create(); + String json = gson.toJson(getRequest()); + + this.mockMvc.perform(post("/generate-vid").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk());// .andExpect(jsonPath("$.response.vid", is("12345"))); + } + + @Test + @WithUserDetails("reg-admin") + public void vidRevokingV2SuccessTest() throws Exception { + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("12345678"); + VidRevokeResponseDTO dto = new VidRevokeResponseDTO(); + dto.setMessage("Successful"); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + + Mockito.when(residentVidService.revokeVidV2(Mockito.any(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(Tuples.of(responseWrapper, "12345")); + + VidRevokeRequestDTOV2 vidRevokeRequestDTOV2 = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTOV2.setTransactionID("1234567890"); + vidRevokeRequestDTOV2.setVidStatus("revoked"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setRequest(vidRevokeRequestDTOV2); + residentVidController.revokeVidV2(requestDto, "1234567432456"); + } + + @Test(expected = ResidentServiceCheckedException.class) + @WithUserDetails("reg-admin") + public void testRevokeVidV2() throws Exception { + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("1234567432456"); + VidRevokeRequestDTOV2 vidRevokeRequestDTOV2 = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTOV2.setTransactionID("1234567890"); + vidRevokeRequestDTOV2.setVidStatus("revoked"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setRequest(vidRevokeRequestDTOV2); + residentVidController.revokeVidV2(requestDto, "1234567432456"); + } + + @Test + @WithUserDetails("reg-admin") + public void testRetrieveVids() throws Exception { + ResponseWrapper>> responseWrapper = new ResponseWrapper<>(); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("12345678"); + Mockito.when(residentVidService.retrieveVids(Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())) + .thenReturn(responseWrapper); + residentVidController.retrieveVids(0, "En-us"); + } + + @Test(expected = Exception.class) + @WithUserDetails("reg-admin") + public void testRetrieveVidsWithException() throws Exception { + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("12345678"); + Mockito.when(residentVidService.retrieveVids(Mockito.anyString(), Mockito.anyInt(), Mockito.nullable(String.class))) + .thenThrow(new ApisResourceAccessException()); + residentVidController.retrieveVids(0, "En-us"); + } + + @Test + @WithUserDetails("resident") + public void testGenerateVidV2() throws Exception { + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("12345678"); + VidResponseDto dto = new VidResponseDto(); + dto.setVid("12345"); + dto.setMessage("Successful"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + + Mockito.when(residentVidService.generateVidV2(Mockito.any(), Mockito.anyString())).thenReturn(Tuples.of(responseWrapper, "12345")); + + VidRequestDtoV2 vidRequestDtoV2 = new VidRequestDtoV2(); + vidRequestDtoV2.setTransactionID("1234567890"); + vidRequestDtoV2.setVidType("perpetual"); + vidRequestDtoV2.setChannels(List.of("email")); + ResidentVidRequestDtoV2 requestDto = new ResidentVidRequestDtoV2(); + requestDto.setRequest(vidRequestDtoV2); + residentVidController.generateVidV2(requestDto); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/TransliterationControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/TransliterationControllerTest.java new file mode 100644 index 00000000000..0945f2c5b2a --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/TransliterationControllerTest.java @@ -0,0 +1,103 @@ +package io.mosip.resident.controller; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doThrow; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.web.client.RestTemplate; + +import io.mosip.preregistration.application.dto.TransliterationRequestDTO; +import io.mosip.preregistration.application.dto.TransliterationResponseDTO; +import io.mosip.preregistration.application.service.TransliterationService; +import io.mosip.preregistration.core.common.dto.MainRequestDTO; +import io.mosip.preregistration.core.common.dto.MainResponseDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentVidServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.validator.RequestValidator; + +/** + * Transliteration Controller Test + * Note: This class is used to test the Transliteration Controller + * @author Kamesh Shekhar Prasad + */ + +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class TransliterationControllerTest { + @InjectMocks + private TransliterationController transliterationController; + + @Mock + private AuditUtil auditUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private TransliterationService transliterationService; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private ObjectStoreHelper objectStore; + + @Mock + private ResidentVidServiceImpl residentVidService; + + @Mock + private Environment environment; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private IdAuthService idAuthService; + + private ResponseEntity> response; + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + MainResponseDTO response = new MainResponseDTO<>(); + TransliterationResponseDTO dto = new TransliterationResponseDTO(); + response.setResponse(dto); + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + transliterationRequestDTO.setFromFieldLang("eng"); + transliterationRequestDTO.setFromFieldValue("cat"); + transliterationRequestDTO.setToFieldLang("hin"); + requestDTO.setRequest(transliterationRequestDTO); + Mockito.when(transliterationService.translitratorService(Mockito.any())).thenReturn(response); + + ResponseEntity> responseEntity = transliterationController.translitrator(requestDTO); + assertEquals(responseEntity.getStatusCode(), HttpStatus.OK); + } + + @Test(expected = InvalidInputException.class) + public void testWithInvalidInputException() throws Exception { + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + transliterationRequestDTO.setFromFieldLang("eng"); + transliterationRequestDTO.setFromFieldValue("cat"); + transliterationRequestDTO.setToFieldLang("hin"); + requestDTO.setRequest(transliterationRequestDTO); + doThrow(InvalidInputException.class).when(requestValidator).validateId(Mockito.any()); + transliterationController.translitrator(requestDTO); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateControllerTest.java new file mode 100644 index 00000000000..79513f880b4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubCredentialStatusUpdateControllerTest.java @@ -0,0 +1,142 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.Mockito.doThrow; + +import java.time.LocalDateTime; +import java.util.Map; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.websub.model.Event; +import io.mosip.kernel.core.websub.model.EventModel; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.service.WebSubCredentialStatusUpdateService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; + +/** + * Web-Sub Credential Status Update Controller Test Note: This class is used to + * test the Web-Sub Credential Status Update Controller + * + * @author Ritik Jain + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class WebSubCredentialStatusUpdateControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private AuditUtil audit; + + @MockBean + private Utility utilityBean; + + @InjectMocks + WebSubCredentialStatusUpdateController webSubCredentialStatusUpdateController; + + @MockBean + WebSubCredentialStatusUpdateService webSubCredentialStatusUpdateService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private VerificationService verificationService; + + @MockBean + private IdAuthService idAuthService; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + VerificationController verificationController; + + @MockBean + private ResidentServiceImpl residentService; + + @Autowired + private ObjectMapper objectMapper; + + @Before + public void setup() throws Exception { + + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(webSubCredentialStatusUpdateController).build(); + } + + @Test + public void testCredentialStatusUpdateCallback() throws Exception { + + EventModel eventModel = new EventModel(); + Event event = new Event(); + event.setTransactionId("1234"); + event.setId("8251649601"); + Map partnerIdMap = new java.util.HashMap<>(); + partnerIdMap.put("olv_partner_id", "mpartner-default-auth"); + event.setData(partnerIdMap); + + eventModel.setEvent(event); + eventModel.setTopic("CREDENTIAL_STATUS_UPDATE_CALL_BACK"); + eventModel.setPublishedOn(String.valueOf(LocalDateTime.now())); + eventModel.setPublisher("CREDENTIAL_STATUS_UPDATE_CALL_BACK"); + webSubCredentialStatusUpdateController + .credentialStatusUpdateCallback(objectMapper.convertValue(eventModel, Map.class)); + + mockMvc.perform((MockMvcRequestBuilders.post("/callback/credentialStatusUpdate")) + .contentType(MediaType.APPLICATION_JSON).content(eventModel.toString())).andReturn(); + } + + @Test(expected = ResidentServiceException.class) + public void testCredentialStatusUpdateCallbackWithException() throws Exception { + EventModel eventModel = new EventModel(); + doThrow(new ResidentServiceCheckedException()).when(webSubCredentialStatusUpdateService) + .updateCredentialStatus(anyMap()); + webSubCredentialStatusUpdateController + .credentialStatusUpdateCallback(objectMapper.convertValue(eventModel, Map.class)); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubUpdateAuthTypeControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubUpdateAuthTypeControllerTest.java new file mode 100644 index 00000000000..deb3a412a38 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/controller/WebSubUpdateAuthTypeControllerTest.java @@ -0,0 +1,139 @@ +package io.mosip.resident.controller; + +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.Mockito.doThrow; + +import java.time.LocalDateTime; +import java.util.Map; + +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.websub.model.Event; +import io.mosip.kernel.core.websub.model.EventModel; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.service.WebSubUpdateAuthTypeService; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.test.ResidentTestBootApplication; +import io.mosip.resident.util.AuditUtil; + +/** + * Web-Sub Update Controller Test Note: This class is used to test the Web-Sub + * Update Controller + * + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ResidentTestBootApplication.class) +@AutoConfigureMockMvc +@TestPropertySource(locations = "classpath:application.properties") +public class WebSubUpdateAuthTypeControllerTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @MockBean + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private AuditUtil audit; + + @InjectMocks + WebSubUpdateAuthTypeController webSubUpdateAuthTypeController; + + @MockBean + WebSubUpdateAuthTypeService webSubUpdateAuthTypeService; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private VerificationService verificationService; + + @MockBean + private IdAuthService idAuthService; + + @MockBean + private ResidentVidService vidService; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @MockBean + VerificationController verificationController; + + @MockBean + private ResidentServiceImpl residentService; + + @Autowired + private ObjectMapper objectMapper; + + @MockBean + private Utility utilityBean; + + @Before + public void setup() throws Exception { + + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(webSubUpdateAuthTypeController).build(); + } + + @Test + public void testCreateRequestGenerationSuccess() throws Exception { + + EventModel eventModel = new EventModel(); + Event event = new Event(); + event.setTransactionId("1234"); + event.setId("8251649601"); + Map partnerIdMap = new java.util.HashMap<>(); + partnerIdMap.put("olv_partner_id", "mpartner-default-auth"); + event.setData(partnerIdMap); + + eventModel.setEvent(event); + eventModel.setTopic("AUTH_TYPE_STATUS_UPDATE_ACK"); + eventModel.setPublishedOn(String.valueOf(LocalDateTime.now())); + eventModel.setPublisher("AUTH_TYPE_STATUS_UPDATE_ACK"); + webSubUpdateAuthTypeController.authTypeCallback(objectMapper.convertValue(eventModel, Map.class)); + + mockMvc.perform((MockMvcRequestBuilders.post("/callback/authTypeCallback")) + .contentType(MediaType.APPLICATION_JSON).content(eventModel.toString())).andReturn(); + } + + @Test(expected = ResidentServiceException.class) + public void testAuthTypeCallbackWithException() throws Exception { + EventModel eventModel = new EventModel(); + doThrow(new ResidentServiceCheckedException()).when(webSubUpdateAuthTypeService).updateAuthTypeStatus(anyMap()); + webSubUpdateAuthTypeController.authTypeCallback(objectMapper.convertValue(eventModel, Map.class)); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/exception/ApiExceptionHandlerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/exception/ApiExceptionHandlerTest.java new file mode 100644 index 00000000000..f299843a315 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/exception/ApiExceptionHandlerTest.java @@ -0,0 +1,361 @@ +package io.mosip.resident.exception; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.openid.bridge.api.exception.AuthRestException; +import io.mosip.kernel.openid.bridge.api.exception.ClientException; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.mock.exception.CantPlaceOrderException; +import io.mosip.resident.mock.exception.PaymentCanceledException; +import io.mosip.resident.mock.exception.PaymentFailedException; +import io.mosip.resident.mock.exception.TechnicalErrorException; +import org.apache.struts.mock.MockHttpServletRequest; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +/** + * @author Kamesh Shekhar Prasad + */ +@ContextConfiguration(classes = {ApiExceptionHandler.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class ApiExceptionHandlerTest { + @Autowired + private ApiExceptionHandler apiExceptionHandler; + + @MockBean + private Environment environment; + + @MockBean + private ObjectMapper objectMapper; + + @Test + public void testControlDataServiceException() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlDataServiceException(null, new ResidentServiceException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION)); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlDataServiceException2() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlDataServiceException(null, new ResidentCredentialServiceException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlDataNotFoundException() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlDataNotFoundException(null, new DataNotFoundException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new RequestException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException2() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new IdRepoAppException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testMethodArgumentNotValidException2() throws IOException { + DefaultMultipartHttpServletRequest httpServletRequest = mock(DefaultMultipartHttpServletRequest.class); + ResponseEntity> actualMethodArgumentNotValidExceptionResult = apiExceptionHandler + .methodArgumentNotValidException(httpServletRequest, + new MethodArgumentNotValidException(null, new BindException("Target", "Object Name"))); + assertTrue(actualMethodArgumentNotValidExceptionResult.hasBody()); + assertTrue(actualMethodArgumentNotValidExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualMethodArgumentNotValidExceptionResult.getStatusCode()); + assertTrue(actualMethodArgumentNotValidExceptionResult.getBody().getErrors().isEmpty()); + } + + @Test + public void testTokenGenerationFailedException() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new TokenGenerationFailedException()); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-409", getResult.getErrorCode()); + assertEquals("Token generation failed", getResult.getMessage()); + } + + @Test + public void testControlRequestException3() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new PaymentFailedException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.PAYMENT_REQUIRED, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException4() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new PaymentCanceledException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.PAYMENT_REQUIRED, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException5() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new TechnicalErrorException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException6() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new CantPlaceOrderException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException7() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new CardNotReadyException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.BAD_REQUEST, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException8() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new VidAlreadyPresentException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("Maximum allowed VIDs are active. Deactivate VID to generate new one.", getResult.getMessage()); + } + + @Test + public void testDefaultErrorHandler() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .defaultErrorHandler(null, new AuthRestException(List.of( + new ServiceError(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())), HttpStatus.OK)); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.UNAUTHORIZED, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("KER-ATH-401", getResult.getErrorCode()); + assertEquals("Authentication Failed", getResult.getMessage()); + } + + @Test + public void testDefaultErrorHandler2() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .defaultErrorHandler(null, new ClientException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.UNAUTHORIZED, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("KER-ATH-401", getResult.getErrorCode()); + assertEquals("Authentication Failed", getResult.getMessage()); + } + + @Test + public void testGetRidStackTraceHandler() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .getRidStackTraceHandler(null, new RIDInvalidException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException9() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new EventIdNotPresentException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorCode(), + ResidentErrorCode.NO_RID_FOUND_EXCEPTION.getErrorMessage())); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.BAD_REQUEST, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + } + + @Test + public void testControlRequestException10() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new EidNotBelongToSessionException()); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.BAD_REQUEST, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorCode(), getResult.getErrorCode()); + assertEquals(ResidentErrorCode.EID_NOT_BELONG_TO_SESSION.getErrorMessage(), getResult.getMessage()); + } + + @Test + public void testControlRequestException11() throws IOException { + ResponseEntity> actualControlDataServiceExceptionResult = apiExceptionHandler + .controlRequestException(null, new DigitalCardRidNotFoundException()); + assertTrue(actualControlDataServiceExceptionResult.hasBody()); + assertTrue(actualControlDataServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.BAD_REQUEST, actualControlDataServiceExceptionResult.getStatusCode()); + List errors = actualControlDataServiceExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals(ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorCode(), getResult.getErrorCode()); + assertEquals(ResidentErrorCode.DIGITAL_CARD_RID_NOT_FOUND.getErrorMessage(), getResult.getMessage()); + } + + @Test + public void testGetApiResourceStackTraceHandler() throws IOException { + ResponseEntity> actualApiResourceStackTraceHandler = apiExceptionHandler + .getApiResourceStackTraceHandler(null, new ApisResourceAccessException("An error occurred")); + assertTrue(actualApiResourceStackTraceHandler.hasBody()); + assertTrue(actualApiResourceStackTraceHandler.getHeaders().isEmpty()); + assertEquals(HttpStatus.BAD_REQUEST, actualApiResourceStackTraceHandler.getStatusCode()); + List errors = actualApiResourceStackTraceHandler.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-412", getResult.getErrorCode()); + assertEquals("RES-SER-411 --> An error occurred", getResult.getMessage()); + } + + @Test + public void testHandleAccessDeniedException() throws IOException { + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity> actualHandleAccessDeniedExceptionResult = apiExceptionHandler + .handleAccessDeniedException(httpServletRequest, new AccessDeniedException("Msg")); + assertTrue(actualHandleAccessDeniedExceptionResult.hasBody()); + assertTrue(actualHandleAccessDeniedExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.FORBIDDEN, actualHandleAccessDeniedExceptionResult.getStatusCode()); + List errors = actualHandleAccessDeniedExceptionResult.getBody().getErrors(); + assertEquals(1, errors.size()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-403", getResult.getErrorCode()); + assertEquals("Msg", getResult.getMessage()); + } + +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/exception/ResidentVidExceptionHandlerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/exception/ResidentVidExceptionHandlerTest.java new file mode 100644 index 00000000000..3efc491ee87 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/exception/ResidentVidExceptionHandlerTest.java @@ -0,0 +1,926 @@ +package io.mosip.resident.exception; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.ResponseWrapper; +import org.apache.struts.mock.MockHttpServletRequest; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * @author Kamesh Shekhar Prasad + */ + +@ContextConfiguration(classes = {ResidentVidExceptionHandler.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class ResidentVidExceptionHandlerTest { + @MockBean + private Environment environment; + + @Autowired + private ResidentVidExceptionHandler residentVidExceptionHandler; + + @Test + public void testResidentCheckedException2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualResidentCheckedExceptionResult = residentVidExceptionHandler + .residentCheckedException(httpServletRequest, + new ResidentServiceCheckedException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION)); + assertTrue(actualResidentCheckedExceptionResult.hasBody()); + assertTrue(actualResidentCheckedExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentCheckedExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + @Test + public void testResidentCheckedException3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualResidentCheckedExceptionResult = residentVidExceptionHandler + .residentCheckedException(httpServletRequest, + new ResidentServiceCheckedException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION)); + assertTrue(actualResidentCheckedExceptionResult.hasBody()); + assertTrue(actualResidentCheckedExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentCheckedExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + @Test + public void testResidentCheckedException5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResidentServiceCheckedException residentServiceCheckedException = new ResidentServiceCheckedException( + ResidentErrorCode.NO_RID_FOUND_EXCEPTION); + residentServiceCheckedException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualResidentCheckedExceptionResult = residentVidExceptionHandler + .residentCheckedException(httpServletRequest, residentServiceCheckedException); + assertTrue(actualResidentCheckedExceptionResult.hasBody()); + assertTrue(actualResidentCheckedExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentCheckedExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()) + .getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("RID not found", getResult1.getMessage()); + assertEquals("RES-SER-408", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testResidentCheckedException6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResidentServiceCheckedException residentServiceCheckedException = mock(ResidentServiceCheckedException.class); + when(residentServiceCheckedException.getErrorCode()).thenReturn("An error occurred"); + when(residentServiceCheckedException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(residentServiceCheckedException.getCodes()).thenReturn(stringList); + when(residentServiceCheckedException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualResidentCheckedExceptionResult = residentVidExceptionHandler + .residentCheckedException(httpServletRequest, residentServiceCheckedException); + assertTrue(actualResidentCheckedExceptionResult.hasBody()); + assertTrue(actualResidentCheckedExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentCheckedExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualResidentCheckedExceptionResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(residentServiceCheckedException).getErrorCode(); + verify(residentServiceCheckedException).getMessage(); + verify(residentServiceCheckedException).getCodes(); + verify(residentServiceCheckedException).getErrorTexts(); + } + + + @Test + public void testResidentServiceException2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualResidentServiceExceptionResult = residentVidExceptionHandler + .residentServiceException(httpServletRequest, + new ResidentServiceException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION)); + assertTrue(actualResidentServiceExceptionResult.hasBody()); + assertTrue(actualResidentServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentServiceExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + @Test + public void testResidentServiceException3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualResidentServiceExceptionResult = residentVidExceptionHandler + .residentServiceException(httpServletRequest, + new ResidentServiceException(ResidentErrorCode.NO_RID_FOUND_EXCEPTION)); + assertTrue(actualResidentServiceExceptionResult.hasBody()); + assertTrue(actualResidentServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentServiceExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-408", getResult.getErrorCode()); + assertEquals("RID not found", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testResidentServiceException5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResidentServiceException residentServiceException = new ResidentServiceException( + ResidentErrorCode.NO_RID_FOUND_EXCEPTION); + residentServiceException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualResidentServiceExceptionResult = residentVidExceptionHandler + .residentServiceException(httpServletRequest, residentServiceException); + assertTrue(actualResidentServiceExceptionResult.hasBody()); + assertTrue(actualResidentServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentServiceExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()) + .getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("RID not found", getResult1.getMessage()); + assertEquals("RES-SER-408", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testResidentServiceException6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResidentServiceException residentServiceException = mock(ResidentServiceException.class); + when(residentServiceException.getErrorCode()).thenReturn("An error occurred"); + when(residentServiceException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(residentServiceException.getCodes()).thenReturn(stringList); + when(residentServiceException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualResidentServiceExceptionResult = residentVidExceptionHandler + .residentServiceException(httpServletRequest, residentServiceException); + assertTrue(actualResidentServiceExceptionResult.hasBody()); + assertTrue(actualResidentServiceExceptionResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualResidentServiceExceptionResult.getStatusCode()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualResidentServiceExceptionResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(residentServiceException).getErrorCode(); + verify(residentServiceException).getMessage(); + verify(residentServiceException).getCodes(); + verify(residentServiceException).getErrorTexts(); + } + + + @Test + public void testVidAlreadyPresent2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidAlreadyPresentResult = residentVidExceptionHandler.vidAlreadyPresent( + httpServletRequest, new VidAlreadyPresentException("An error occurred", "An error occurred")); + assertTrue(actualVidAlreadyPresentResult.hasBody()); + assertTrue(actualVidAlreadyPresentResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidAlreadyPresentResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getErrorCode()); + assertEquals("Maximum allowed VIDs are active. Deactivate VID to generate new one.", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidAlreadyPresent3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidAlreadyPresentResult = residentVidExceptionHandler.vidAlreadyPresent( + httpServletRequest, new VidAlreadyPresentException("An error occurred", "An error occurred")); + assertTrue(actualVidAlreadyPresentResult.hasBody()); + assertTrue(actualVidAlreadyPresentResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidAlreadyPresentResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getErrorCode()); + assertEquals("Maximum allowed VIDs are active. Deactivate VID to generate new one.", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + @Test + public void testVidAlreadyPresent5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidAlreadyPresentException vidAlreadyPresentException = new VidAlreadyPresentException("An error occurred", + "An error occurred"); + vidAlreadyPresentException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualVidAlreadyPresentResult = residentVidExceptionHandler + .vidAlreadyPresent(httpServletRequest, vidAlreadyPresentException); + assertTrue(actualVidAlreadyPresentResult.hasBody()); + assertTrue(actualVidAlreadyPresentResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidAlreadyPresentResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("Maximum allowed VIDs are active. Deactivate VID to generate new one.", getResult1.getMessage()); + assertEquals("An error occurred", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidAlreadyPresent6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidAlreadyPresentException vidAlreadyPresentException = mock(VidAlreadyPresentException.class); + when(vidAlreadyPresentException.getErrorCode()).thenReturn("An error occurred"); + when(vidAlreadyPresentException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(vidAlreadyPresentException.getCodes()).thenReturn(stringList); + when(vidAlreadyPresentException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualVidAlreadyPresentResult = residentVidExceptionHandler + .vidAlreadyPresent(httpServletRequest, vidAlreadyPresentException); + assertTrue(actualVidAlreadyPresentResult.hasBody()); + assertTrue(actualVidAlreadyPresentResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidAlreadyPresentResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualVidAlreadyPresentResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(vidAlreadyPresentException).getErrorCode(); + verify(vidAlreadyPresentException).getMessage(); + verify(vidAlreadyPresentException).getCodes(); + verify(vidAlreadyPresentException).getErrorTexts(); + } + + + @Test + public void testVidCreationFailed2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidCreationFailedResult = residentVidExceptionHandler + .vidCreationFailed(httpServletRequest, new VidCreationException()); + assertTrue(actualVidCreationFailedResult.hasBody()); + assertTrue(actualVidCreationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidCreationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-406", getResult.getErrorCode()); + assertEquals("Exception while creating VID", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidCreationFailed3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidCreationFailedResult = residentVidExceptionHandler + .vidCreationFailed(httpServletRequest, new VidCreationException()); + assertTrue(actualVidCreationFailedResult.hasBody()); + assertTrue(actualVidCreationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidCreationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-406", getResult.getErrorCode()); + assertEquals("Exception while creating VID", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidCreationFailed5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidCreationException vidCreationException = new VidCreationException(); + vidCreationException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualVidCreationFailedResult = residentVidExceptionHandler + .vidCreationFailed(httpServletRequest, vidCreationException); + assertTrue(actualVidCreationFailedResult.hasBody()); + assertTrue(actualVidCreationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidCreationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("Exception while creating VID", getResult1.getMessage()); + assertEquals("RES-SER-406", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidCreationFailed6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidCreationException vidCreationException = mock(VidCreationException.class); + when(vidCreationException.getErrorCode()).thenReturn("An error occurred"); + when(vidCreationException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(vidCreationException.getCodes()).thenReturn(stringList); + when(vidCreationException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualVidCreationFailedResult = residentVidExceptionHandler + .vidCreationFailed(httpServletRequest, vidCreationException); + assertTrue(actualVidCreationFailedResult.hasBody()); + assertTrue(actualVidCreationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidCreationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidCreationFailedResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualVidCreationFailedResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(vidCreationException).getErrorCode(); + verify(vidCreationException).getMessage(); + verify(vidCreationException).getCodes(); + verify(vidCreationException).getErrorTexts(); + } + + + @Test + public void testApiNotAccessible2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualApiNotAccessibleResult = residentVidExceptionHandler + .apiNotAccessible(httpServletRequest, new ApisResourceAccessException("An error occurred")); + assertTrue(actualApiNotAccessibleResult.hasBody()); + assertTrue(actualApiNotAccessibleResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualApiNotAccessibleResult.getStatusCode()); + assertNull(((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-411", getResult.getErrorCode()); + assertEquals("An error occurred", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testApiNotAccessible3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualApiNotAccessibleResult = residentVidExceptionHandler + .apiNotAccessible(httpServletRequest, new ApisResourceAccessException("An error occurred")); + assertTrue(actualApiNotAccessibleResult.hasBody()); + assertTrue(actualApiNotAccessibleResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualApiNotAccessibleResult.getStatusCode()); + assertNull(((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-411", getResult.getErrorCode()); + assertEquals("An error occurred", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testApiNotAccessible5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ApisResourceAccessException apisResourceAccessException = mock(ApisResourceAccessException.class); + when(apisResourceAccessException.getErrorCode()).thenReturn("An error occurred"); + when(apisResourceAccessException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(apisResourceAccessException.getCodes()).thenReturn(stringList); + when(apisResourceAccessException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualApiNotAccessibleResult = residentVidExceptionHandler + .apiNotAccessible(httpServletRequest, apisResourceAccessException); + assertTrue(actualApiNotAccessibleResult.hasBody()); + assertTrue(actualApiNotAccessibleResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualApiNotAccessibleResult.getStatusCode()); + assertNull(((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualApiNotAccessibleResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(apisResourceAccessException).getErrorCode(); + verify(apisResourceAccessException).getMessage(); + verify(apisResourceAccessException).getCodes(); + verify(apisResourceAccessException).getErrorTexts(); + } + + + @Test + public void testOtpValidationFailed2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualOtpValidationFailedResult = residentVidExceptionHandler + .otpValidationFailed(httpServletRequest, new OtpValidationFailedException()); + assertTrue(actualOtpValidationFailedResult.hasBody()); + assertTrue(actualOtpValidationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualOtpValidationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-422", getResult.getErrorCode()); + assertEquals("OTP validation failed", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testOtpValidationFailed3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualOtpValidationFailedResult = residentVidExceptionHandler + .otpValidationFailed(httpServletRequest, new OtpValidationFailedException()); + assertTrue(actualOtpValidationFailedResult.hasBody()); + assertTrue(actualOtpValidationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualOtpValidationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-422", getResult.getErrorCode()); + assertEquals("OTP validation failed", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testOtpValidationFailed5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + OtpValidationFailedException otpValidationFailedException = mock(OtpValidationFailedException.class); + when(otpValidationFailedException.getErrorCode()).thenReturn("An error occurred"); + when(otpValidationFailedException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(otpValidationFailedException.getCodes()).thenReturn(stringList); + when(otpValidationFailedException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualOtpValidationFailedResult = residentVidExceptionHandler + .otpValidationFailed(httpServletRequest, otpValidationFailedException); + assertTrue(actualOtpValidationFailedResult.hasBody()); + assertTrue(actualOtpValidationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualOtpValidationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualOtpValidationFailedResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(otpValidationFailedException).getErrorCode(); + verify(otpValidationFailedException).getMessage(); + verify(otpValidationFailedException).getCodes(); + verify(otpValidationFailedException).getErrorTexts(); + } + + + @Test + public void testInvalidInput2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualInvalidInputResult = residentVidExceptionHandler.invalidInput(httpServletRequest, + new InvalidInputException()); + assertTrue(actualInvalidInputResult.hasBody()); + assertTrue(actualInvalidInputResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualInvalidInputResult.getStatusCode()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualInvalidInputResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualInvalidInputResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-410", getResult.getErrorCode()); + assertEquals("Invalid Input Parameter- ", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testInvalidInput3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualInvalidInputResult = residentVidExceptionHandler.invalidInput(httpServletRequest, + new InvalidInputException()); + assertTrue(actualInvalidInputResult.hasBody()); + assertTrue(actualInvalidInputResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualInvalidInputResult.getStatusCode()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualInvalidInputResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualInvalidInputResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualInvalidInputResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-410", getResult.getErrorCode()); + assertEquals("Invalid Input Parameter- ", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testInvalidInput5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + InvalidInputException invalidInputException = new InvalidInputException(); + invalidInputException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualInvalidInputResult = residentVidExceptionHandler.invalidInput(httpServletRequest, + invalidInputException); + assertTrue(actualInvalidInputResult.hasBody()); + assertTrue(actualInvalidInputResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualInvalidInputResult.getStatusCode()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualInvalidInputResult.getBody()).getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualInvalidInputResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("Invalid Input Parameter- ", getResult1.getMessage()); + assertEquals("RES-SER-410", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testInvalidInput6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + InvalidInputException invalidInputException = mock(InvalidInputException.class); + when(invalidInputException.getErrorCode()).thenReturn("An error occurred"); + when(invalidInputException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(invalidInputException.getCodes()).thenReturn(stringList); + when(invalidInputException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualInvalidInputResult = residentVidExceptionHandler.invalidInput(httpServletRequest, + invalidInputException); + assertTrue(actualInvalidInputResult.hasBody()); + assertTrue(actualInvalidInputResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualInvalidInputResult.getStatusCode()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualInvalidInputResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualInvalidInputResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualInvalidInputResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(invalidInputException).getErrorCode(); + verify(invalidInputException).getMessage(); + verify(invalidInputException).getCodes(); + verify(invalidInputException).getErrorTexts(); + } + + + @Test + public void testVidRevocationFailed2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidRevocationFailedResult = residentVidExceptionHandler + .vidRevocationFailed(httpServletRequest, new VidRevocationException()); + assertTrue(actualVidRevocationFailedResult.hasBody()); + assertTrue(actualVidRevocationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidRevocationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-407", getResult.getErrorCode()); + assertEquals("VID revocation request failed. Please visit the nearest registration center for assistance.", + getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidRevocationFailed3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualVidRevocationFailedResult = residentVidExceptionHandler + .vidRevocationFailed(httpServletRequest, new VidRevocationException()); + assertTrue(actualVidRevocationFailedResult.hasBody()); + assertTrue(actualVidRevocationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidRevocationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("RES-SER-407", getResult.getErrorCode()); + assertEquals("VID revocation request failed. Please visit the nearest registration center for assistance.", + getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidRevocationFailed5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidRevocationException vidRevocationException = new VidRevocationException(); + vidRevocationException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualVidRevocationFailedResult = residentVidExceptionHandler + .vidRevocationFailed(httpServletRequest, vidRevocationException); + assertTrue(actualVidRevocationFailedResult.hasBody()); + assertTrue(actualVidRevocationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidRevocationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getErrors(); + assertEquals(2, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getMessage()); + ServiceError getResult1 = errors.get(1); + assertEquals("VID revocation request failed. Please visit the nearest registration center for assistance.", + getResult1.getMessage()); + assertEquals("RES-SER-407", getResult1.getErrorCode()); + assertEquals("An error occurred", getResult.getErrorCode()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testVidRevocationFailed6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + VidRevocationException vidRevocationException = mock(VidRevocationException.class); + when(vidRevocationException.getErrorCode()).thenReturn("An error occurred"); + when(vidRevocationException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(vidRevocationException.getCodes()).thenReturn(stringList); + when(vidRevocationException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualVidRevocationFailedResult = residentVidExceptionHandler + .vidRevocationFailed(httpServletRequest, vidRevocationException); + assertTrue(actualVidRevocationFailedResult.hasBody()); + assertTrue(actualVidRevocationFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualVidRevocationFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualVidRevocationFailedResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(vidRevocationException).getErrorCode(); + verify(vidRevocationException).getMessage(); + verify(vidRevocationException).getCodes(); + verify(vidRevocationException).getErrorTexts(); + } + + + @Test + public void testIdRepoAppExceptionFailed2() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualIdRepoAppExceptionFailedResult = residentVidExceptionHandler + .idRepoAppExceptionFailed(httpServletRequest, + new IdRepoAppException("An error occurred", "An error occurred")); + assertTrue(actualIdRepoAppExceptionFailedResult.hasBody()); + assertTrue(actualIdRepoAppExceptionFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualIdRepoAppExceptionFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getErrorCode()); + assertEquals("An error occurred", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testIdRepoAppExceptionFailed3() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("/vid/", "https://example.org/example", + "https://example.org/example", "https://example.org/example"); + + ResponseEntity actualIdRepoAppExceptionFailedResult = residentVidExceptionHandler + .idRepoAppExceptionFailed(httpServletRequest, + new IdRepoAppException("An error occurred", "An error occurred")); + assertTrue(actualIdRepoAppExceptionFailedResult.hasBody()); + assertTrue(actualIdRepoAppExceptionFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualIdRepoAppExceptionFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getResponse()); + assertEquals("Property", ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getErrorCode()); + assertEquals("An error occurred", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testIdRepoAppExceptionFailed5() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + IdRepoAppException idRepoAppException = new IdRepoAppException("An error occurred", "An error occurred"); + idRepoAppException.addInfo("An error occurred", "An error occurred"); + ResponseEntity actualIdRepoAppExceptionFailedResult = residentVidExceptionHandler + .idRepoAppExceptionFailed(httpServletRequest, idRepoAppException); + assertTrue(actualIdRepoAppExceptionFailedResult.hasBody()); + assertTrue(actualIdRepoAppExceptionFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualIdRepoAppExceptionFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getId()); + List errors = ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()) + .getErrors(); + assertEquals(1, errors.size()); + assertEquals("Property", ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getVersion()); + ServiceError getResult = errors.get(0); + assertEquals("An error occurred", getResult.getErrorCode()); + assertEquals("An error occurred", getResult.getMessage()); + verify(environment, atLeast(1)).getProperty((String) any()); + } + + + @Test + public void testIdRepoAppExceptionFailed6() { + when(environment.getProperty((String) any())).thenReturn("Property"); + MockHttpServletRequest httpServletRequest = new MockHttpServletRequest("https://example.org/example", + "https://example.org/example", "https://example.org/example", "https://example.org/example"); + + IdRepoAppException idRepoAppException = mock(IdRepoAppException.class); + when(idRepoAppException.getErrorCode()).thenReturn("An error occurred"); + when(idRepoAppException.getMessage()).thenReturn("An error occurred"); + ArrayList stringList = new ArrayList<>(); + when(idRepoAppException.getCodes()).thenReturn(stringList); + when(idRepoAppException.getErrorTexts()).thenReturn(new ArrayList<>()); + ResponseEntity actualIdRepoAppExceptionFailedResult = residentVidExceptionHandler + .idRepoAppExceptionFailed(httpServletRequest, idRepoAppException); + assertTrue(actualIdRepoAppExceptionFailedResult.hasBody()); + assertTrue(actualIdRepoAppExceptionFailedResult.getHeaders().isEmpty()); + assertEquals(HttpStatus.OK, actualIdRepoAppExceptionFailedResult.getStatusCode()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getResponse()); + assertNull(((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getId()); + assertEquals(stringList, ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getErrors()); + assertEquals("Property", ((ResponseWrapper) actualIdRepoAppExceptionFailedResult.getBody()).getVersion()); + verify(environment, atLeast(1)).getProperty((String) any()); + verify(idRepoAppException).getErrorCode(); + verify(idRepoAppException).getMessage(); + verify(idRepoAppException).getCodes(); + verify(idRepoAppException).getErrorTexts(); + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/ResidentUpdateServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/ResidentUpdateServiceTest.java similarity index 91% rename from resident/resident-service/src/test/java/io/mosip/resident/test/handler/ResidentUpdateServiceTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/handler/service/ResidentUpdateServiceTest.java index 3a36989ef92..f3a6600fcee 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/ResidentUpdateServiceTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/ResidentUpdateServiceTest.java @@ -1,177 +1,179 @@ -package io.mosip.resident.test.handler; - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyDouble; -import static org.mockito.ArgumentMatchers.anyString; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; - -import org.apache.commons.io.IOUtils; -import org.assertj.core.util.Lists; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.HttpClientErrorException; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.commons.packet.dto.PacketInfo; -import io.mosip.commons.packet.exception.PacketCreatorException; -import io.mosip.commons.packet.facade.PacketWriter; -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.resident.dto.PacketGeneratorResDto; -import io.mosip.resident.dto.RegistrationType; -import io.mosip.resident.dto.ResidentIndividialIDType; -import io.mosip.resident.dto.ResidentUpdateDto; -import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.handler.service.ResidentUpdateService; -import io.mosip.resident.handler.service.SyncAndUploadService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.IdSchemaUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilities; -import io.mosip.resident.validator.RequestHandlerRequestValidator; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest({ IOUtils.class, File.class, FileInputStream.class}) -public class ResidentUpdateServiceTest { - - private ResidentUpdateDto residentUpdateDto; - - @InjectMocks - private ResidentUpdateService residentUpdateService; - - @Mock - private RequestHandlerRequestValidator validator; - - @Mock - private ResidentServiceRestClient restClientService; - - @Mock - private SyncAndUploadService syncUploadEncryptionService; - - @Mock - private ObjectMapper mapper; - - @Mock - private Environment env; - - @Mock - private PacketWriter packetWriter; - - @Mock - private IdSchemaUtil idSchemaUtil; - - @Mock - private Utilities utilities; - - @Mock - private FileInputStream fileInputStream; - - @Mock - private AuditUtil audit; - - private static final String rid = "10001100770000320200720092256"; - - @Before - public void setup() throws Exception { - ReflectionTestUtils.setField(residentUpdateService, "idschemaVersion", "0.1"); - - residentUpdateDto = new ResidentUpdateDto(); - residentUpdateDto.setIdValue("5984924027"); - residentUpdateDto.setCenterId("10001"); - residentUpdateDto.setIdentityJson("eyJpZGVudGl0eSI6IHsiYWRkcmVzc0xpbmUxIjogW3sibGFuZ3VhZ2UiOiAiZW5nIiwidmFsdWUiOiAiTVkgd29yayBhZHJlc3MifSx7Imxhbmd1YWdlIjogImFyYSIsInZhbHVlIjogIkZGRiJ9XSwicHJvb2ZPZkFkZHJlc3MiIDogeyJ2YWx1ZSIgOiAicHJvb2ZPZkFkZHJlc3MiLCJ0eXBlIiA6ICJET0MwMDQiLCJmb3JtYXQiIDogImpwZyJ9LCJJRFNjaGVtYVZlcnNpb24iOiAwLjEsIlVJTiI6ICI1OTg0OTI0MDI3In19"); - residentUpdateDto.setIdType(ResidentIndividialIDType.UIN); - residentUpdateDto.setMachineId("10001"); - residentUpdateDto.setRequestType(RegistrationType.RES_UPDATE); - residentUpdateDto.setProofOfAddress("address"); - residentUpdateDto.setProofOfDateOfBirth("birth"); - residentUpdateDto.setProofOfRelationship("relationship"); - residentUpdateDto.setProofOfIdentity("identity"); - - Mockito.when(validator.isValidCenter(anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidMachine(anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidRegistrationTypeAndUin(anyString(), anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidVid(anyString())).thenReturn(Boolean.TRUE); - - Mockito.when(utilities.getDefaultSource()).thenReturn("source"); - Mockito.when(idSchemaUtil.getIdSchema(anyDouble())).thenReturn("idschema"); - Mockito.when(utilities.generateAudit(any())).thenReturn(new ArrayList<>()); - - JSONObject ridJson = new JSONObject(); - ridJson.put("rid", rid); - - PacketInfo packetInfo = new PacketInfo(); - packetInfo.setId(rid); - packetInfo.setSource("source"); - Mockito.when(packetWriter.createPacket(any())).thenReturn(Lists.newArrayList(packetInfo)); - - Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); - Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(ridJson); - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))).thenReturn(new ResponseWrapper<>()); - - Mockito.when(env.getProperty(any())).thenReturn("property"); - - File file = PowerMockito.mock(File.class); - PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file); - PowerMockito.whenNew(File.class).withArguments(anyString()).thenReturn(file); - fileInputStream =PowerMockito.mock(FileInputStream.class); - PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream); - PowerMockito.whenNew(FileInputStream.class).withArguments(anyString()).thenReturn(fileInputStream); - - PowerMockito.mockStatic(IOUtils.class); - PowerMockito.when(IOUtils.class, "toByteArray", fileInputStream).thenReturn("packet".getBytes()); - - PacketGeneratorResDto resDto = new PacketGeneratorResDto(); - resDto.setRegistrationId(rid); - resDto.setMessage("packet uploaded"); - resDto.setStatus("PROCESSING"); - Mockito.when(syncUploadEncryptionService.uploadUinPacket(any(), any(), any(), any())).thenReturn(resDto); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - } - - @Test(expected = BaseCheckedException.class) - public void testCreatePacket() throws IOException, BaseCheckedException { - - PacketGeneratorResDto result = residentUpdateService.createPacket(residentUpdateDto); - - assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); - - } - - @Test(expected = BaseCheckedException.class) - public void testApiResourceException() throws IOException, BaseCheckedException { - - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), - any(Class.class))).thenThrow(new ApisResourceAccessException("Error",new HttpClientErrorException(HttpStatus.OK, "message"))); - - residentUpdateService.createPacket(residentUpdateDto); - } - - - @Test(expected = BaseCheckedException.class) - public void testPacketCreatorException() throws IOException, BaseCheckedException { - - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), - any(Class.class))).thenThrow(new PacketCreatorException("code", "message")); - - residentUpdateService.createPacket(residentUpdateDto); - } -} +package io.mosip.resident.handler.service; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyDouble; +import static org.mockito.ArgumentMatchers.anyString; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; + +import io.mosip.resident.dto.IdResponseDTO1; +import org.apache.commons.io.IOUtils; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.HttpClientErrorException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.commons.packet.dto.PacketInfo; +import io.mosip.commons.packet.exception.PacketCreatorException; +import io.mosip.commons.packet.facade.PacketWriter; +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.dto.ResidentIndividialIDType; +import io.mosip.resident.dto.ResidentUpdateDto; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.IdSchemaUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.validator.RequestHandlerRequestValidator; + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) +@PrepareForTest({ IOUtils.class, File.class, FileInputStream.class}) +public class ResidentUpdateServiceTest { + + private ResidentUpdateDto residentUpdateDto; + + @InjectMocks + private ResidentUpdateService residentUpdateService; + + @Mock + private RequestHandlerRequestValidator validator; + + @Mock + private ResidentServiceRestClient restClientService; + + @Mock + private SyncAndUploadService syncUploadEncryptionService; + + @Mock + private ObjectMapper mapper; + + @Mock + private Environment env; + + @Mock + private PacketWriter packetWriter; + + @Mock + private IdSchemaUtil idSchemaUtil; + + @Mock + private Utilities utilities; + + @Mock + private FileInputStream fileInputStream; + + @Mock + private AuditUtil audit; + + private static final String rid = "10001100770000320200720092256"; + private String idSchemaVersionStr; + private String sessionUin; + private IdResponseDTO1 idResponseDto; + + @Before + public void setup() throws Exception { + ReflectionTestUtils.setField(residentUpdateService, "defaultIdSchemaVersion", "0.1"); + + residentUpdateDto = new ResidentUpdateDto(); + residentUpdateDto.setIdValue("5984924027"); + residentUpdateDto.setCenterId("10001"); + residentUpdateDto.setIdentityJson("eyJpZGVudGl0eSI6IHsiYWRkcmVzc0xpbmUxIjogW3sibGFuZ3VhZ2UiOiAiZW5nIiwidmFsdWUiOiAiTVkgd29yayBhZHJlc3MifSx7Imxhbmd1YWdlIjogImFyYSIsInZhbHVlIjogIkZGRiJ9XSwicHJvb2ZPZkFkZHJlc3MiIDogeyJ2YWx1ZSIgOiAicHJvb2ZPZkFkZHJlc3MiLCJ0eXBlIiA6ICJET0MwMDQiLCJmb3JtYXQiIDogImpwZyJ9LCJJRFNjaGVtYVZlcnNpb24iOiAwLjEsIlVJTiI6ICI1OTg0OTI0MDI3In19"); + residentUpdateDto.setIdType(ResidentIndividialIDType.UIN); + residentUpdateDto.setMachineId("10001"); + residentUpdateDto.setRequestType(RegistrationType.RES_UPDATE); + residentUpdateDto.setProofOfAddress("address"); + residentUpdateDto.setProofOfDateOfBirth("birth"); + residentUpdateDto.setProofOfRelationship("relationship"); + residentUpdateDto.setProofOfIdentity("identity"); + + Mockito.when(validator.isValidCenter(anyString())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidMachine(anyString())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidRegistrationTypeAndUin(anyString(), anyString(), any())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidVid(anyString())).thenReturn(Boolean.TRUE); + + Mockito.when(utilities.getDefaultSource()).thenReturn("source"); + Mockito.when(idSchemaUtil.getIdSchema(anyDouble())).thenReturn("idschema"); + Mockito.when(utilities.generateAudit(any())).thenReturn(new ArrayList<>()); + + JSONObject ridJson = new JSONObject(); + ridJson.put("rid", rid); + + PacketInfo packetInfo = new PacketInfo(); + packetInfo.setId(rid); + packetInfo.setSource("source"); + Mockito.when(packetWriter.createPacket(any())).thenReturn(Lists.newArrayList(packetInfo)); + + Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(ridJson); + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))).thenReturn(new ResponseWrapper<>()); + + Mockito.when(env.getProperty(any())).thenReturn("property"); + + File file = PowerMockito.mock(File.class); + PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file); + PowerMockito.whenNew(File.class).withArguments(anyString()).thenReturn(file); + fileInputStream =PowerMockito.mock(FileInputStream.class); + PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream); + PowerMockito.whenNew(FileInputStream.class).withArguments(anyString()).thenReturn(fileInputStream); + + PowerMockito.mockStatic(IOUtils.class); + PowerMockito.when(IOUtils.class, "toByteArray", fileInputStream).thenReturn("packet".getBytes()); + + PacketGeneratorResDto resDto = new PacketGeneratorResDto(); + resDto.setRegistrationId(rid); + resDto.setMessage("packet uploaded"); + resDto.setStatus("PROCESSING"); + Mockito.when(syncUploadEncryptionService.uploadUinPacket(any(), any(), any(), any())).thenReturn(resDto); + Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + } + + @Test(expected = BaseCheckedException.class) + public void testCreatePacket() throws IOException, BaseCheckedException { + + PacketGeneratorResDto result = residentUpdateService.createPacket(residentUpdateDto, idSchemaVersionStr, sessionUin, idResponseDto); + + assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); + + } + + @Test(expected = BaseCheckedException.class) + public void testApiResourceException() throws IOException, BaseCheckedException { + + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), + any(Class.class))).thenThrow(new ApisResourceAccessException("Error",new HttpClientErrorException(HttpStatus.OK, "message"))); + + residentUpdateService.createPacket(residentUpdateDto, idSchemaVersionStr, sessionUin, idResponseDto); + } + + + @Test(expected = BaseCheckedException.class) + public void testPacketCreatorException() throws IOException, BaseCheckedException { + + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), + any(Class.class))).thenThrow(new PacketCreatorException("code", "message")); + + residentUpdateService.createPacket(residentUpdateDto, idSchemaVersionStr, sessionUin, idResponseDto); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/SyncAndUploadServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/SyncAndUploadServiceTest.java similarity index 89% rename from resident/resident-service/src/test/java/io/mosip/resident/test/handler/SyncAndUploadServiceTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/handler/service/SyncAndUploadServiceTest.java index 629d5e17936..c27de24bcc6 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/SyncAndUploadServiceTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/SyncAndUploadServiceTest.java @@ -1,15 +1,9 @@ -package io.mosip.resident.test.handler; +package io.mosip.resident.handler.service; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.kernel.core.util.JsonUtils; -import io.mosip.kernel.core.util.exception.JsonProcessingException; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.handler.service.SyncAndUploadService; -import io.mosip.resident.util.*; import org.assertj.core.util.Lists; import org.junit.Before; import org.junit.Test; @@ -21,19 +15,38 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.env.Environment; import org.springframework.core.io.ByteArrayResource; import org.springframework.test.util.ReflectionTestUtils; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.kernel.core.util.JsonUtils; +import io.mosip.kernel.core.util.exception.JsonProcessingException; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.PacketReceiverResponseDTO; +import io.mosip.resident.dto.PacketReceiverSubResponseDTO; +import io.mosip.resident.dto.RegSyncResponseDTO; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.dto.SyncResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.EncryptorUtil; +import io.mosip.resident.util.ResidentServiceRestClient; @RunWith(PowerMockRunner.class) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) @PrepareForTest({ JsonUtils.class, Gson.class, DateUtils.class, ByteArrayResource.class, GsonBuilder.class }) public class SyncAndUploadServiceTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; @InjectMocks private SyncAndUploadService syncAndUploadService; diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/UinCardRePrintServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/UinCardRePrintServiceTest.java similarity index 93% rename from resident/resident-service/src/test/java/io/mosip/resident/test/handler/UinCardRePrintServiceTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/handler/service/UinCardRePrintServiceTest.java index dd66999d956..c16b1ec6373 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/handler/UinCardRePrintServiceTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/handler/service/UinCardRePrintServiceTest.java @@ -1,243 +1,246 @@ -package io.mosip.resident.test.handler; - - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyDouble; -import static org.mockito.ArgumentMatchers.anyString; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; - -import org.apache.commons.io.IOUtils; -import org.assertj.core.util.Lists; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.HttpClientErrorException; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.commons.packet.dto.PacketInfo; -import io.mosip.commons.packet.exception.PacketCreatorException; -import io.mosip.commons.packet.facade.PacketWriter; -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.resident.constant.CardType; -import io.mosip.resident.constant.MappingJsonConstants; -import io.mosip.resident.dto.ErrorDTO; -import io.mosip.resident.dto.PacketGeneratorResDto; -import io.mosip.resident.dto.RegProcRePrintRequestDto; -import io.mosip.resident.dto.RegistrationType; -import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.dto.VidResDTO; -import io.mosip.resident.dto.VidResponseDTO1; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.handler.service.SyncAndUploadService; -import io.mosip.resident.handler.service.UinCardRePrintService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.IdSchemaUtil; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilities; -import io.mosip.resident.validator.RequestHandlerRequestValidator; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest({ IOUtils.class, JsonUtil.class, File.class, FileInputStream.class}) -public class UinCardRePrintServiceTest { - - @InjectMocks - private UinCardRePrintService uinCardRePrintService; - - @Mock - private RequestHandlerRequestValidator validator; - - @Mock - private ResidentServiceRestClient restClientService; - - @Mock - private SyncAndUploadService syncUploadEncryptionService; - - @Mock - private ObjectMapper mapper; - - @Mock - private Environment env; - - @Mock - private PacketWriter packetWriter; - - @Mock - private IdSchemaUtil idSchemaUtil; - - @Mock - private Utilities utilities; - - @Mock - private JSONObject jsonObject; - - @Mock - private FileInputStream fileInputStream; - - @Mock - private AuditUtil audit; - - private static final String rid = "10001100770000320200720092256"; - - private RegProcRePrintRequestDto regProcRePrintRequestDto; - - @Before - public void setup() throws Exception { - ReflectionTestUtils.setField(uinCardRePrintService, "idschemaVersion", "0.1"); - - regProcRePrintRequestDto = new RegProcRePrintRequestDto(); - regProcRePrintRequestDto.setId("5984924027"); - regProcRePrintRequestDto.setIdType("UIN"); - regProcRePrintRequestDto.setCardType("UIN"); - regProcRePrintRequestDto.setCenterId("10001"); - regProcRePrintRequestDto.setMachineId("10001"); - regProcRePrintRequestDto.setRegistrationType(RegistrationType.RES_REPRINT.name()); - - Mockito.when(validator.isValidCenter(anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidMachine(anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidRePrintRegistrationType(anyString())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidCardType(any())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidIdType(any())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidUin(any())).thenReturn(Boolean.TRUE); - Mockito.when(validator.isValidVid(any())).thenReturn(Boolean.TRUE); - - Mockito.when(utilities.getDefaultSource()).thenReturn("source"); - Mockito.when(idSchemaUtil.getIdSchema(anyDouble())).thenReturn("idschema"); - Mockito.when(utilities.generateAudit(any())).thenReturn(new ArrayList<>()); - - JSONObject ridJson = new JSONObject(); - ridJson.put("rid", rid); - - PacketInfo packetInfo = new PacketInfo(); - packetInfo.setId(rid); - packetInfo.setSource("source"); - Mockito.when(packetWriter.createPacket(any())).thenReturn(Lists.newArrayList(packetInfo)); - - Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); - Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(ridJson); - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))).thenReturn(new ResponseWrapper<>()); - - Mockito.when(env.getProperty(any())).thenReturn("property"); - - File file = PowerMockito.mock(File.class); - PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file); - PowerMockito.whenNew(File.class).withArguments(anyString()).thenReturn(file); - PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream); - - PowerMockito.mockStatic(IOUtils.class); - PowerMockito.when(IOUtils.class, "toByteArray", fileInputStream).thenReturn("packet".getBytes()); - - PowerMockito.mockStatic(JsonUtil.class); - PowerMockito.when(JsonUtil.class, "getJSONObject", jsonObject, MappingJsonConstants.IDSCHEMA_VERSION).thenReturn(jsonObject); - PowerMockito.when(JsonUtil.class, "getJSONValue", jsonObject, MappingJsonConstants.VALUE).thenReturn("value"); - - PacketGeneratorResDto resDto = new PacketGeneratorResDto(); - resDto.setRegistrationId(rid); - resDto.setMessage("packet uploaded"); - resDto.setStatus("PROCESSING"); - Mockito.when(syncUploadEncryptionService.uploadUinPacket(any(), any(), any(), any())).thenReturn(resDto); - Mockito.when(utilities.getRegistrationProcessorMappingJson()).thenReturn(jsonObject); - Mockito.when(utilities.linkRegIdWrtUin(any(), any())).thenReturn(true); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - } - - @Test(expected = FileNotFoundException.class) - public void testCreatePacket() throws IOException, BaseCheckedException { - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - - assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); - } - - @Test(expected = BaseCheckedException.class) - public void testApiResourceException() throws IOException, BaseCheckedException { - - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), - any(Class.class))).thenThrow(new ApisResourceAccessException("Error",new HttpClientErrorException(HttpStatus.OK, "message"))); - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - } - - @Test(expected = PacketCreatorException.class) - public void testPacketCreatorException() throws IOException, BaseCheckedException { - - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), - any(Class.class))).thenThrow(new PacketCreatorException("code", "message")); - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - } - - @Test(expected = FileNotFoundException.class) - public void testVid() throws IOException, BaseCheckedException { - regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); - /*regProcRePrintRequestDto.setIdType("VID"); - regProcRePrintRequestDto.setId("1234");*/ - - VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); - VidResDTO vidResDTO = new VidResDTO(); - vidResDTO.setVid("2345"); - vidResponseDTO1.setResponse(vidResDTO); - - Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); - Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - - assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); - } - - @Test(expected = FileNotFoundException.class) - public void testVidWithNoUin() throws IOException, BaseCheckedException { - regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); - regProcRePrintRequestDto.setIdType("VID"); - regProcRePrintRequestDto.setId("1234"); - - VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); - VidResDTO vidResDTO = new VidResDTO(); - vidResDTO.setVid("2345"); - vidResponseDTO1.setResponse(vidResDTO); - - Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); - Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - - assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); - } - - @Test(expected = BaseCheckedException.class) - public void testVidCreationException() throws IOException, BaseCheckedException { - regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); - - VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); - vidResponseDTO1.setResponse(null); - ErrorDTO errorDTO = new ErrorDTO("", ""); - vidResponseDTO1.setErrors(Lists.newArrayList(errorDTO)); - - Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); - Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); - - PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); - - assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); - } -} +package io.mosip.resident.handler.service; + + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyDouble; +import static org.mockito.ArgumentMatchers.anyString; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; + +import org.apache.commons.io.IOUtils; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.HttpClientErrorException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.commons.packet.dto.PacketInfo; +import io.mosip.commons.packet.exception.PacketCreatorException; +import io.mosip.commons.packet.facade.PacketWriter; +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.dto.ErrorDTO; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.RegProcRePrintRequestDto; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidResDTO; +import io.mosip.resident.dto.VidResponseDTO1; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.IdSchemaUtil; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.validator.RequestHandlerRequestValidator; + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) +@PrepareForTest({ IOUtils.class, JsonUtil.class, File.class, FileInputStream.class}) +public class UinCardRePrintServiceTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private UinCardRePrintService uinCardRePrintService; + + @Mock + private RequestHandlerRequestValidator validator; + + @Mock + private ResidentServiceRestClient restClientService; + + @Mock + private SyncAndUploadService syncUploadEncryptionService; + + @Mock + private ObjectMapper mapper; + + @Mock + private Environment env; + + @Mock + private PacketWriter packetWriter; + + @Mock + private IdSchemaUtil idSchemaUtil; + + @Mock + private Utilities utilities; + + @Mock + private JSONObject jsonObject; + + @Mock + private FileInputStream fileInputStream; + + @Mock + private AuditUtil audit; + + private static final String rid = "10001100770000320200720092256"; + + private RegProcRePrintRequestDto regProcRePrintRequestDto; + + @Before + public void setup() throws Exception { + ReflectionTestUtils.setField(uinCardRePrintService, "idschemaVersion", "0.1"); + + regProcRePrintRequestDto = new RegProcRePrintRequestDto(); + regProcRePrintRequestDto.setId("5984924027"); + regProcRePrintRequestDto.setIdType(IdType.UIN.name()); + regProcRePrintRequestDto.setCardType(CardType.UIN.name()); + regProcRePrintRequestDto.setCenterId("10001"); + regProcRePrintRequestDto.setMachineId("10001"); + regProcRePrintRequestDto.setRegistrationType(RegistrationType.RES_REPRINT.name()); + + Mockito.when(validator.isValidCenter(anyString())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidMachine(anyString())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidRePrintRegistrationType(anyString())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidCardType(any())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidIdType(any())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidUin(any())).thenReturn(Boolean.TRUE); + Mockito.when(validator.isValidVid(any())).thenReturn(Boolean.TRUE); + + Mockito.when(utilities.getDefaultSource()).thenReturn("source"); + Mockito.when(idSchemaUtil.getIdSchema(anyDouble())).thenReturn("idschema"); + Mockito.when(utilities.generateAudit(any())).thenReturn(new ArrayList<>()); + + JSONObject ridJson = new JSONObject(); + ridJson.put("rid", rid); + + PacketInfo packetInfo = new PacketInfo(); + packetInfo.setId(rid); + packetInfo.setSource("source"); + Mockito.when(packetWriter.createPacket(any())).thenReturn(Lists.newArrayList(packetInfo)); + + Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(ridJson); + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))).thenReturn(new ResponseWrapper<>()); + + Mockito.when(env.getProperty(any())).thenReturn("property"); + + File file = PowerMockito.mock(File.class); + PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file); + PowerMockito.whenNew(File.class).withArguments(anyString()).thenReturn(file); + PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream); + + PowerMockito.mockStatic(IOUtils.class); + PowerMockito.when(IOUtils.class, "toByteArray", fileInputStream).thenReturn("packet".getBytes()); + + PowerMockito.mockStatic(JsonUtil.class); + PowerMockito.when(JsonUtil.class, "getJSONObject", jsonObject, MappingJsonConstants.IDSCHEMA_VERSION).thenReturn(jsonObject); + PowerMockito.when(JsonUtil.class, "getJSONValue", jsonObject, MappingJsonConstants.VALUE).thenReturn("value"); + + PacketGeneratorResDto resDto = new PacketGeneratorResDto(); + resDto.setRegistrationId(rid); + resDto.setMessage("packet uploaded"); + resDto.setStatus("PROCESSING"); + Mockito.when(syncUploadEncryptionService.uploadUinPacket(any(), any(), any(), any())).thenReturn(resDto); + Mockito.when(utilities.getRegistrationProcessorMappingJson()).thenReturn(jsonObject); + Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + } + + @Test(expected = FileNotFoundException.class) + public void testCreatePacket() throws IOException, BaseCheckedException { + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + + assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); + } + + @Test(expected = BaseCheckedException.class) + public void testApiResourceException() throws IOException, BaseCheckedException { + + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), + any(Class.class))).thenThrow(new ApisResourceAccessException("Error",new HttpClientErrorException(HttpStatus.OK, "message"))); + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + } + + @Test(expected = PacketCreatorException.class) + public void testPacketCreatorException() throws IOException, BaseCheckedException { + + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), + any(Class.class))).thenThrow(new PacketCreatorException("code", "message")); + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + } + + @Test(expected = FileNotFoundException.class) + public void testVid() throws IOException, BaseCheckedException { + regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); + /*regProcRePrintRequestDto.setIdType(IdType.VID.name()); + regProcRePrintRequestDto.setId("1234");*/ + + VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); + VidResDTO vidResDTO = new VidResDTO(); + vidResDTO.setVid("2345"); + vidResponseDTO1.setResponse(vidResDTO); + + Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); + Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + + assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); + } + + @Test(expected = FileNotFoundException.class) + public void testVidWithNoUin() throws IOException, BaseCheckedException { + regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); + regProcRePrintRequestDto.setIdType(IdType.VID.name()); + regProcRePrintRequestDto.setId("1234"); + + VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); + VidResDTO vidResDTO = new VidResDTO(); + vidResDTO.setVid("2345"); + vidResponseDTO1.setResponse(vidResDTO); + + Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); + Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + + assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); + } + + @Test(expected = BaseCheckedException.class) + public void testVidCreationException() throws IOException, BaseCheckedException { + regProcRePrintRequestDto.setCardType(CardType.MASKED_UIN.name()); + + VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); + vidResponseDTO1.setResponse(null); + ErrorDTO errorDTO = new ErrorDTO("", ""); + vidResponseDTO1.setErrors(Lists.newArrayList(errorDTO)); + + Mockito.when(restClientService.postApi(any(), any(), any(), any(Class.class))).thenReturn(vidResponseDTO1); + Mockito.when(utilities.getUinByVid(any())).thenReturn("12345"); + + PacketGeneratorResDto result = uinCardRePrintService.createPacket(regProcRePrintRequestDto); + + assertTrue(result.getRegistrationId().equalsIgnoreCase(rid)); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/helper/CredentialStatusUpdateHelperTest.java b/resident/resident-service/src/test/java/io/mosip/resident/helper/CredentialStatusUpdateHelperTest.java new file mode 100644 index 00000000000..3aa61c32fb5 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/helper/CredentialStatusUpdateHelperTest.java @@ -0,0 +1,77 @@ +package io.mosip.resident.helper; + +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.core.env.Environment; + +import java.util.HashMap; +import java.util.Map; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +/** + * @author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +public class CredentialStatusUpdateHelperTest { + + @Mock + private Environment env; + + @Mock + private NotificationService notificationService; + + @Mock + private ResidentTransactionRepository repo; + + @Mock + private Utility utility; + + @InjectMocks + private CredentialStatusUpdateHelper helper; + + private ResidentTransactionEntity txn; + + @Before + public void setup() { + txn = new ResidentTransactionEntity(); + txn.setEventId("event123"); + txn.setStatusCode("INITIAL"); + } + + @Test + public void testUpdateStatus_NewStatusAndReferenceLink() throws ResidentServiceCheckedException, ApisResourceAccessException { + Map credentialStatus = new HashMap<>(); + credentialStatus.put("status", "SUCCESS"); + credentialStatus.put("url", "https://example.com"); + when(env.getProperty(any(String.class))).thenReturn("SUCCESS"); + helper.updateStatus(txn, credentialStatus); + } + + @Test + public void testUpdateStatus_NoNewStatus() throws ResidentServiceCheckedException, ApisResourceAccessException { + Map credentialStatus = new HashMap<>(); + credentialStatus.put("status", "INITIAL"); + helper.updateStatus(txn, credentialStatus); + } + + @Test + public void testUpdateStatus_NoNotificationSent() throws ResidentServiceCheckedException, ApisResourceAccessException { + Map credentialStatus = new HashMap<>(); + credentialStatus.put("status", "IN_PROGRESS"); + when(env.getProperty(any(String.class))).thenReturn(null); + helper.updateStatus(txn, credentialStatus); + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/helper/ObjectStoreHelperTest.java b/resident/resident-service/src/test/java/io/mosip/resident/helper/ObjectStoreHelperTest.java new file mode 100644 index 00000000000..b4c8fbe1005 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/helper/ObjectStoreHelperTest.java @@ -0,0 +1,259 @@ +package io.mosip.resident.helper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.commons.khazana.exception.ObjectStoreAdapterException; +import io.mosip.commons.khazana.spi.ObjectStoreAdapter; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.util.ResidentServiceRestClient; + +/** + * @author Manoj SP + * + */ +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class ObjectStoreHelperTest { + + @InjectMocks + private ObjectStoreHelper helper; + + @Mock + private ResidentServiceRestClient restClient; + + @Mock + private ApplicationContext context; + + @Mock + private ObjectStoreAdapter adapter; + + @SuppressWarnings("unchecked") + @Before + public void init() { + ReflectionTestUtils.setField(helper, "objectStoreAccountName", "objectStoreAccountName"); + ReflectionTestUtils.setField(helper, "objectStoreBucketName", "objectStoreBucketName"); + ReflectionTestUtils.setField(helper, "objectStoreAdapterName", "objectStoreAdapterName"); + ReflectionTestUtils.setField(helper, "applicationId", "applicationId"); + ReflectionTestUtils.setField(helper, "referenceId", "referenceId"); + ReflectionTestUtils.setField(helper, "encryptUri", "encryptUri"); + ReflectionTestUtils.setField(helper, "decryptUri", "decryptUri"); + when(context.getBean(any(), any(Class.class))).thenReturn(adapter); + helper.setObjectStore(context); + mockEncryptionDecryptionRestCall(Map.of("data", "abc"), null); + } + + private void mockEncryptionDecryptionRestCall(Map data, List errors) { + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(data); + responseWrapper.setErrors(errors); + try { + when(restClient.postApi(any(), any(), any(), any())).thenReturn(responseWrapper); + } catch (ApisResourceAccessException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + @Test + public void testPutObjectSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectStoreBucketName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor source = ArgumentCaptor.forClass(String.class); + ArgumentCaptor process = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor data = ArgumentCaptor.forClass(InputStream.class); + helper.putObject("name", new ByteArrayInputStream("abc".getBytes())); + verify(adapter).putObject(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture(), + data.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("abc", IOUtils.toString(data.getValue(), Charset.defaultCharset())); + assertEquals("name", objectName.getValue()); + assertNull(source.getValue()); + assertNull(process.getValue()); + } + + @SuppressWarnings("unchecked") + @Test + public void testPutObjectWithMetadataSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectStoreBucketName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor source = ArgumentCaptor.forClass(String.class); + ArgumentCaptor process = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor data = ArgumentCaptor.forClass(InputStream.class); + ArgumentCaptor> metadata = ArgumentCaptor.forClass(Map.class); + helper.putObject("name", new ByteArrayInputStream("abc".getBytes()), Map.of("data", "data")); + verify(adapter).putObject(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture(), + data.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("abc", IOUtils.toString(data.getValue(), Charset.defaultCharset())); + assertEquals("name", objectName.getValue()); + assertNull(source.getValue()); + assertNull(process.getValue()); + verify(adapter).addObjectMetaData(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture(), + metadata.capture() + ); + assertEquals(Map.of("data", "data"), metadata.getValue()); + } + + @Test(expected = ResidentServiceException.class) + public void testPutObjectException() throws IOException { + when(adapter.putObject(any(), any(), any(), any(), any(), any())).thenThrow(new ObjectStoreAdapterException("", "")); + helper.putObject("name", new ByteArrayInputStream("abc".getBytes())); + } + + @Test(expected = ResidentServiceException.class) + public void testPutObjectEncryptionDecryptionRestCallFailed() throws IOException, ApisResourceAccessException { + when(restClient.postApi(any(), any(), any(), any())).thenThrow(new ApisResourceAccessException()); + helper.putObject("name", new ByteArrayInputStream("abc".getBytes())); + } + + @Test(expected = ResidentServiceException.class) + public void testPutObjectEncryptionDecryptionError() throws IOException { + mockEncryptionDecryptionRestCall(null, List.of(new ServiceError("", ""))); + helper.putObject("name", new ByteArrayInputStream("abc".getBytes())); + } + + @Test + public void testGetObjectSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectStoreBucketName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor source = ArgumentCaptor.forClass(String.class); + ArgumentCaptor process = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + when(adapter.getObject(any(), any(), any(), any(), any())) + .thenReturn(new ByteArrayInputStream("abc".getBytes())); + helper.getObject("name"); + verify(adapter).getObject(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("name", objectName.getValue()); + assertNull(source.getValue()); + assertNull(process.getValue()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetObjectException() throws IOException { + when(adapter.getObject(any(), any(), any(), any(), any())).thenThrow(new ObjectStoreAdapterException("", "")); + helper.getObject("name"); + } + + @Test + public void testGetAllObjectSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + when(adapter.getAllObjects(any(), any())) + .thenReturn(List.of()); + helper.getAllObjects("name"); + verify(adapter).getAllObjects(objectStoreAccountName.capture(), + objectName.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("name", objectName.getValue()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetAllObjectException() throws IOException { + when(adapter.getAllObjects(any(), any())).thenThrow(new ObjectStoreAdapterException("", "")); + helper.getAllObjects("name"); + } + + @Test + public void testGetMetadataSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectStoreBucketName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor source = ArgumentCaptor.forClass(String.class); + ArgumentCaptor process = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + when(adapter.getMetaData(any(), any(), any(), any(), any())) + .thenReturn(Map.of()); + helper.getMetadata("name"); + verify(adapter).getMetaData(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("name", objectName.getValue()); + assertNull(source.getValue()); + assertNull(process.getValue()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetMetadataException() throws IOException { + when(adapter.getMetaData(any(), any(), any(), any(), any())).thenThrow(new ObjectStoreAdapterException("", "")); + helper.getMetadata("name"); + } + + @Test + public void testDeleteObjectSuccess() throws IOException { + ArgumentCaptor objectStoreAccountName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectStoreBucketName = ArgumentCaptor.forClass(String.class); + ArgumentCaptor source = ArgumentCaptor.forClass(String.class); + ArgumentCaptor process = ArgumentCaptor.forClass(String.class); + ArgumentCaptor objectName = ArgumentCaptor.forClass(String.class); + helper.deleteObject("name"); + verify(adapter).deleteObject(objectStoreAccountName.capture(), + objectStoreBucketName.capture(), + source.capture(), + process.capture(), + objectName.capture() + ); + assertEquals("objectStoreAccountName", objectStoreAccountName.getValue()); + assertEquals("name", objectName.getValue()); + assertNull(source.getValue()); + assertNull(process.getValue()); + } + + @Test(expected = ResidentServiceException.class) + public void testDeleteObjectException() throws IOException { + when(adapter.deleteObject(any(), any(), any(), any(), any())).thenThrow(new ObjectStoreAdapterException("", "")); + helper.deleteObject("name"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/interceptor/ResidentEntityinterceptorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/ResidentEntityinterceptorTest.java new file mode 100644 index 00000000000..8c80d9592e4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/ResidentEntityinterceptorTest.java @@ -0,0 +1,85 @@ +package io.mosip.resident.interceptor; + +import com.itextpdf.kernel.xmp.impl.Base64; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.junit.Assert.assertFalse; + +/** + * @author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentEntityinterceptorTest { + + @InjectMocks + private ResidentEntityInterceptor residentEntityInterceptor; + + @Mock + private ObjectStoreHelper objectStoreHelper; + + private ResidentTransactionEntity residentTransactionEntity; + private Object[] state; + private String[] propertyName; + + @Before + public void setup(){ + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setIndividualId("1234567890"); + state = new Object[1]; + state[0] = "k"; + propertyName = new String[1]; + propertyName[0] = "individualId"; + ReflectionTestUtils.setField(residentEntityInterceptor, "appId", "resident"); + ReflectionTestUtils.setField(residentEntityInterceptor, "refId", "resident"); + } + + @Test + public void testOnSaveSuccess(){ + assertFalse(residentEntityInterceptor.onSave(residentTransactionEntity, + null, state, propertyName, null)); + } + + @Test(expected = ResidentServiceException.class) + public void testOnSaveFailure(){ + Mockito.when(objectStoreHelper.encryptDecryptData(Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString(), Mockito.anyString())) + .thenThrow(new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage())); + assertFalse(residentEntityInterceptor.onSave(residentTransactionEntity, + null, state, propertyName, null)); + } + + @Test + public void testOnLoadFailure(){ + Mockito.when(objectStoreHelper.encryptDecryptData(Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString(), Mockito.anyString())) + .thenThrow(new ResidentServiceException(ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorCode(), + ResidentErrorCode.ENCRYPT_DECRYPT_ERROR.getErrorMessage())); + assertFalse(residentEntityInterceptor.onLoad(residentTransactionEntity, null, state, propertyName, null)); + } + + @Test + public void testOnLoadSuccess(){ + Mockito.when(objectStoreHelper.encryptDecryptData(Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(Base64.encode("MOSIP")); + assertFalse(residentEntityInterceptor.onLoad(residentTransactionEntity, null, state, propertyName, null)); + } + + @Test + public void testOnFlushDirty(){ + assertFalse(residentEntityInterceptor.onFlushDirty(residentTransactionEntity, null, state, null, propertyName, null)); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptorTest.java new file mode 100644 index 00000000000..b7c50eb1742 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateLoggingInterceptorTest.java @@ -0,0 +1,53 @@ +package io.mosip.resident.interceptor; + + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.context.WebApplicationContext; + +import java.io.IOException; +import java.net.URI; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Kamesh Shekhar Prasad + */ + + +@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class}) +@RunWith(SpringRunner.class) +@WebMvcTest +public class RestTemplateLoggingInterceptorTest { + + @InjectMocks + private RestTemplateLoggingInterceptor interceptor; + + @Test + public void intercept_SuccessfulRequest_RecordTimer() throws IOException { + + ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class); + ClientHttpResponse response = mock(ClientHttpResponse.class); + when(execution.execute(any(), any())).thenReturn(response); + + HttpRequest request = mock(HttpRequest.class); + when(request.getURI()).thenReturn(URI.create("https://example.com")); + when(request.getMethod()).thenReturn(HttpMethod.GET); + + Assert.assertNotNull(interceptor.intercept(request, new byte[]{}, execution)); + + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptorTest.java new file mode 100644 index 00000000000..8db5398141e --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/interceptor/RestTemplateMetricsInterceptorTest.java @@ -0,0 +1,98 @@ +package io.mosip.resident.interceptor; + + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.context.WebApplicationContext; + +import java.io.IOException; +import java.net.URI; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Kamesh Shekhar Prasad + */ + + +@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class}) +@RunWith(SpringRunner.class) +@WebMvcTest +@TestPropertySource(locations="classpath:application.properties") +public class RestTemplateMetricsInterceptorTest { + + @Autowired + private MeterRegistry meterRegistry; + + @Mock + private Timer timer; + + @InjectMocks + private RestTemplateMetricsInterceptor interceptor; + + @Before + public void init() { + ReflectionTestUtils.setField(interceptor, "registry", meterRegistry); + } + + @Test + public void intercept_SuccessfulRequest_RecordTimer() throws IOException { + + + ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class); + ClientHttpResponse response = mock(ClientHttpResponse.class); + when(execution.execute(any(), any())).thenReturn(response); + + HttpRequest request = mock(HttpRequest.class); + when(request.getURI()).thenReturn(URI.create("https://example.com")); + when(request.getMethod()).thenReturn(HttpMethod.GET); + + + Assert.assertNotNull(interceptor.intercept(request, new byte[]{}, execution)); + + } + + @Test(expected = IOException.class) + public void intercept_FailedRequest_RecordTimerWithError() throws IOException { + // Arrange + ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class); + when(execution.execute(any(), any())).thenThrow(new IOException("Simulated error")); + + HttpRequest request = mock(HttpRequest.class); + when(request.getURI()).thenReturn(URI.create("https://example.com")); + when(request.getMethod()).thenReturn(HttpMethod.GET); + + interceptor.intercept(request, new byte[]{}, execution); + } + + @TestConfiguration + static class AdditionalConfig { + @Bean + public MeterRegistry registry() { + return new SimpleMeterRegistry(); + } + } +} + diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AcknowledgmentServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AcknowledgmentServiceTest.java new file mode 100644 index 00000000000..b7109ef4aa1 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AcknowledgmentServiceTest.java @@ -0,0 +1,205 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.pdfgenerator.spi.PDFGenerator; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.signature.dto.SignatureResponseDto; +import io.mosip.kernel.templatemanager.velocity.builder.TemplateManagerBuilderImpl; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.AcknowledgementService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuples; + +/** + * This class is used to create service class test for getting acknowledgement API. + * @Author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class AcknowledgmentServiceTest { + + private static final String LOCALE_EN_US = "en-US"; + + @InjectMocks + private AcknowledgementService acknowledgementService = new AcknowledgementServiceImpl(); + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private TemplateUtil templateUtil; + + @InjectMocks + private TemplateManagerBuilderImpl templateManagerBuilder; + + @Mock + private PDFGenerator pdfGenerator; + + @Mock + private Environment environment; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private Utility utility; + + private byte[] result; + private String eventId; + private String languageCode; + private Optional residentTransactionEntity; + private Map templateVariables; + + @Mock + private TemplateManager templateManager; + private static final String CLASSPATH = "classpath"; + private static final String ENCODE_TYPE = "UTF-8"; + private Map values; + + @Before + public void setup() throws Exception { + templateVariables = new LinkedHashMap<>(); + values = new LinkedHashMap<>(); + values.put("test", String.class); + templateVariables.put(TemplateVariablesConstants.EVENT_ID, eventId); + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.SHARE_CRED_WITH_PARTNER.name()); + result = "test".getBytes(StandardCharsets.UTF_8); + eventId = "bf42d76e-b02e-48c8-a17a-6bb842d85ea9"; + languageCode = "eng"; + residentTransactionEntity = Optional.of(new ResidentTransactionEntity()); + residentTransactionEntity.get().setEventId(eventId); + residentTransactionEntity.get().setRequestTypeCode(RequestType.SHARE_CRED_WITH_PARTNER.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + Mockito.when(RequestType.SHARE_CRED_WITH_PARTNER.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + ReflectionTestUtils.setField(acknowledgementService, "templateManagerBuilder", templateManagerBuilder); + templateManagerBuilder.encodingType(ENCODE_TYPE).enableCache(false).resourceLoader(CLASSPATH).build(); + InputStream stream = new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8)); + Mockito.when(templateManager.merge(any(), Mockito.anyMap())).thenReturn(stream); + OutputStream outputStream = new ByteArrayOutputStream(1024); + outputStream.write("test".getBytes(StandardCharsets.UTF_8)); + SignatureResponseDto signatureResponseDto = new SignatureResponseDto(); + signatureResponseDto.setData("data"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(signatureResponseDto); + Mockito.when(utility.signPdf(Mockito.any(), Mockito.any())).thenReturn("data".getBytes()); + Mockito.when( + templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn("file text template"); + } + + @Test + public void testAcknowledgementServiceTest() throws ResidentServiceCheckedException, IOException { + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeGenerateVidTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.GENERATE_VID.name()); + Mockito.when(RequestType.GENERATE_VID.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.GENERATE_VID.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeRevokeVidTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.REVOKE_VID.name()); + Mockito.when(RequestType.REVOKE_VID.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.REVOKE_VID.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeOrderPhysicalCardTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.ORDER_PHYSICAL_CARD.name()); + Mockito.when(RequestType.ORDER_PHYSICAL_CARD.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.ORDER_PHYSICAL_CARD.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeDownloadPersonalizedCardTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.DOWNLOAD_PERSONALIZED_CARD.name()); + Mockito.when(RequestType.DOWNLOAD_PERSONALIZED_CARD.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.DOWNLOAD_PERSONALIZED_CARD.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeUpdateMyUinTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.UPDATE_MY_UIN.name()); + Mockito.when(RequestType.UPDATE_MY_UIN.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.UPDATE_MY_UIN.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test + public void testAcknowledgementServiceRequestTypeSecureMyIdTest() throws ResidentServiceCheckedException, IOException { + templateVariables.put(TemplateVariablesConstants.EVENT_TYPE, RequestType.AUTH_TYPE_LOCK_UNLOCK.name()); + Mockito.when(RequestType.AUTH_TYPE_LOCK_UNLOCK.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), languageCode, 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.AUTH_TYPE_LOCK_UNLOCK.toString()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + byte[] actualResult = acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + assertNotNull(actualResult); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testAcknowledgmentBadEventIdTest() throws ResidentServiceCheckedException, IOException { + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(Optional.empty()); + acknowledgementService.getAcknowledgementPDF(eventId, languageCode, 0, LOCALE_EN_US).getT1(); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AuthTransactionCallbackServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AuthTransactionCallbackServiceTest.java new file mode 100644 index 00000000000..02b3842d892 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/AuthTransactionCallbackServiceTest.java @@ -0,0 +1,111 @@ +package io.mosip.resident.service.impl; + +import static org.powermock.api.mockito.PowerMockito.mock; + +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.websub.model.Event; +import io.mosip.kernel.core.websub.model.EventModel; +import io.mosip.kernel.core.websub.spi.PublisherClient; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class AuthTransactionCallbackServiceTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @InjectMocks + private AuthTransactionCallBackServiceImpl authTransactionCallBackService; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private MockMvc mockMvc; + + @Mock + private PublisherClient publisher; + + @Mock + SubscriptionClient subscribe; + + private ObjectMapper objectMapper = new ObjectMapper(); + + EventModel eventModel; + + @Before + public void setup() throws ApisResourceAccessException { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(authTransactionCallBackService).build(); + eventModel=new EventModel(); + Event event=new Event(); + event.setTransactionId("1234"); + event.setTimestamp(LocalDateTime.now().toString()); + event.setId("12345"); + Map partnerIdMap = new java.util.HashMap<>(); + partnerIdMap.put("olv_partner_id", "mpartner-default-auth"); + event.setData(partnerIdMap); + + eventModel.setEvent(event); + eventModel.setTopic("AUTH_TYPE_STATUS_UPDATE_ACK"); + eventModel.setPublishedOn(String.valueOf(LocalDateTime.now())); + eventModel.setPublisher("AUTH_TYPE_STATUS_UPDATE_ACK"); + Mockito.lenient().when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + } + + @Test + public void testAuthTransactionCallBackService() throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException { + authTransactionCallBackService.updateAuthTransactionCallBackService(objectMapper.convertValue(eventModel, Map.class)); + authTransactionCallBackService = mock(AuthTransactionCallBackServiceImpl.class); + Mockito.lenient().doNothing().when(authTransactionCallBackService).updateAuthTransactionCallBackService(Mockito.any()); + } + + @Test + public void testAuthTransactionCallBackServiceException() throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException { + authTransactionCallBackService.updateAuthTransactionCallBackService(objectMapper.convertValue(eventModel, Map.class)); + authTransactionCallBackService = mock(AuthTransactionCallBackServiceImpl.class); + Mockito.lenient().doThrow(ResidentServiceCheckedException.class).when(authTransactionCallBackService).updateAuthTransactionCallBackService(Mockito.any()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/BaseWebSubInitializerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/BaseWebSubInitializerTest.java new file mode 100644 index 00000000000..975a36da271 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/BaseWebSubInitializerTest.java @@ -0,0 +1,159 @@ +package io.mosip.resident.service.impl; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.websub.spi.PublisherClient; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; + +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class BaseWebSubInitializerTest { + + @Mock + private PublisherClient publisher; + + @Mock + SubscriptionClient subscribe; + + @Mock + ThreadPoolTaskScheduler taskScheduler; + + @Mock + BaseWebSubInitializer baseWebSubInitializer; + + public ThreadPoolTaskScheduler threadPoolTaskScheduler() { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.setPoolSize(5); + threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); + return threadPoolTaskScheduler; + } + + @Value("${resident.websub.callback.authtype-status.url}") + private String callbackUrl; + + @Value("${resident.websub.callback.authTransaction-status.url}") + private String authTransactionCallbackUrl; + + @Value("${resident.websub.authTransaction-status.topic}") + private String authTransactionTopic; + + @Value("${resident.websub.authTransaction-status.secret}") + private String authTransactionSecret; + + @Before + public void setUp() throws Exception { + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setPoolSize(5); + taskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionSecret", "authTransactionSecret"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionTopic", + "AUTHENTICATION_TRANSACTION_STATUS"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionCallbackUrl", + "resident.websub.callback.authTransaction-status.relative.url"); + ReflectionTestUtils.setField(baseWebSubInitializer, "hubUrl", "https://dev2.mosip.net/lib"); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testApplicationEvent() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "taskScheduler", + Mockito.mock(ThreadPoolTaskScheduler.class)); + ApplicationReadyEvent applicationReadyEvent = null; + baseWebSubInitializer.onApplicationEvent(applicationReadyEvent); + } + + @Test + public void applicationEventTest() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "taskScheduler", + Mockito.mock(ThreadPoolTaskScheduler.class)); + ApplicationReadyEvent applicationReadyEvent = null; + ReflectionTestUtils.setField(baseWebSubInitializer, "autTypeStatusTopic", "AUTH_TYPE_STATUS_UPDATE_ACK"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionTopic", + "AUTHENTICATION_TRANSACTION_STATUS"); + baseWebSubInitializer.onApplicationEvent(applicationReadyEvent); + } + + @Test(expected = Exception.class) + public void authTransactionSubscriptionTest() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionSecret", "authTransactionSecret"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionTopic", + "AUTHENTICATION_TRANSACTION_STATUS"); + ReflectionTestUtils.setField(baseWebSubInitializer, "callbackAuthTransactionUrl", + "resident.websub.callback.authTransaction-status.relative.url"); + ReflectionTestUtils.setField(baseWebSubInitializer, "hubUrl", "https://dev2.mosip.net/lib"); + baseWebSubInitializer.authTransactionTopicSubscription(); + } + + @Test + public void testAuthTransactionSubcription() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionSecret", "authTransactionSecret"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionTopic", + "AUTHENTICATION_TRANSACTION_STATUS"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTypeStatusCallbackUrl", + "resident.websub.callback.authTransaction-status.relative.url"); + ReflectionTestUtils.setField(baseWebSubInitializer, "hubUrl", "https://dev2.mosip.net/lib"); + ReflectionTestUtils.setField(baseWebSubInitializer, "subscribe", subscribe); + baseWebSubInitializer.authTransactionTopicSubscription(); + } + + @Test + public void testTryRegisterTopicEventFailed() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "taskScheduler", + Mockito.mock(ThreadPoolTaskScheduler.class)); + ReflectionTestUtils.invokeMethod(baseWebSubInitializer, "tryRegisterTopicEvent", "AUTH_TYPE_STATUS_UPDATE_ACK"); + } + + @Test + public void testTryRegisterTopicEvent() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "publishUrl", "https://dev2.mosip.net/lib"); + ReflectionTestUtils.setField(baseWebSubInitializer, "publisher", publisher); + ReflectionTestUtils.invokeMethod(baseWebSubInitializer, "tryRegisterTopicEvent", "AUTH_TYPE_STATUS_UPDATE_ACK"); + } + + @Test + public void testInitSubsription() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer(); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionSecret", "authTransactionSecret"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionTopic", + "AUTHENTICATION_TRANSACTION_STATUS"); + ReflectionTestUtils.setField(baseWebSubInitializer, "authTransactionCallbackUrl", + "resident.websub.callback.authTransaction-status.relative.url"); + ReflectionTestUtils.setField(baseWebSubInitializer, "subscribe", subscribe); + ReflectionTestUtils.setField(baseWebSubInitializer, "hubUrl", "https://dev2.mosip.net/lib"); + ReflectionTestUtils.invokeMethod(baseWebSubInitializer, "authTransactionTopicSubscription"); + } + + private BaseWebSubInitializer testTaskScheduler() { + BaseWebSubInitializer baseWebSubInitializer = new BaseWebSubInitializer() { + }; + ReflectionTestUtils.setField(baseWebSubInitializer, "taskScheduler", + Mockito.mock(ThreadPoolTaskScheduler.class)); + return baseWebSubInitializer; + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DocumentServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DocumentServiceImplTest.java new file mode 100644 index 00000000000..0c8c0d2058c --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DocumentServiceImplTest.java @@ -0,0 +1,135 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertNotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.commons.khazana.dto.ObjectDto; +import io.mosip.resident.dto.DocumentRequestDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.helper.ObjectStoreHelper; + +/** + * + * @author M1063027 Rama Devi + * + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class DocumentServiceImplTest { + + @InjectMocks + private DocumentServiceImpl documentServiceImpl; + + @Mock + private ObjectStoreHelper objectStoreHelper; + + @Mock + private Environment environment; + + @Before + public void setUp() throws Exception { + } + + @Test + public void uploadDocumentTest() throws Exception { + DocumentRequestDTO request = getDocumentRqtDto(); + MockMultipartFile file = new MockMultipartFile("test.pdf", "test.pdf", null, new byte[1100]); + file.getOriginalFilename(); + request.setDocCatCode("POI"); + request.setLangCode("eng"); + request.setDocCatCode("poi"); + request.setReferenceId("abc123"); + assertNotNull(documentServiceImpl.uploadDocument("transactionId", file, request)); + } + + @Test + public void fetchAllDocumentsMetadataTest() throws Exception { + List allObjects = getAllObjects(); + Map metaData = getMetaData(); + Mockito.when(objectStoreHelper.getAllObjects("transactionId")).thenReturn(allObjects); + Mockito.when(objectStoreHelper.getMetadata(Mockito.anyString())).thenReturn(metaData); + assertNotNull(documentServiceImpl.fetchAllDocumentsMetadata("transactionId")); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testFetchAllDocumentsMetadataFailure() throws Exception{ + Map metaData = getMetaData(); + Mockito.when(objectStoreHelper.getAllObjects("transactionId")).thenReturn(null); + assertNotNull(documentServiceImpl.fetchAllDocumentsMetadata("transactionId")); + } + + @Test + public void getDocumentsWithMetadataTest() throws Exception { + List allObjects = getAllObjects(); + Map metaData = getMetaData(); + Mockito.when(objectStoreHelper.getAllObjects("transactionId")).thenReturn(allObjects); + Mockito.when(objectStoreHelper.getMetadata(Mockito.anyString())).thenReturn(metaData); + Mockito.when(objectStoreHelper.getObject(Mockito.anyString())).thenReturn("value"); + assertNotNull(documentServiceImpl.getDocumentsWithMetadata("transactionId")); + } + + @Test + public void testFetchDocumentByDocId() throws Exception { + Mockito.when(objectStoreHelper.getObject(Mockito.anyString())).thenReturn("value"); + assertNotNull(documentServiceImpl.fetchDocumentByDocId("transactionId", "docId")); + } + + @Test + public void testDeleteDocumentSuccess() throws Exception { + Mockito.when(objectStoreHelper.getObject(Mockito.anyString())).thenReturn("value"); + Mockito.when(objectStoreHelper.deleteObject(Mockito.anyString())).thenReturn(true); + assertNotNull(documentServiceImpl.deleteDocument("transactionId", "documentId")); + } + + @Test + public void testDeleteDocumentFailure() throws Exception { + Mockito.when(objectStoreHelper.getObject(Mockito.anyString())).thenReturn("value"); + Mockito.when(objectStoreHelper.deleteObject(Mockito.anyString())).thenReturn(false); + assertNotNull(documentServiceImpl.deleteDocument("transactionId", "documentId")); + } + + private DocumentRequestDTO getDocumentRqtDto() { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("DocCatCode"); + request.setLangCode("langCode"); + request.setDocCatCode("docCatCode"); + request.setDocTypCode("docTypCode"); + return request; + } + + private List getAllObjects() { + List allObjects = new ArrayList(); + ObjectDto objectDto = new ObjectDto(); + objectDto.setObjectName("objectName"); + allObjects.add(objectDto); + return allObjects; + } + + private Map getMetaData() { + Map metaData = new HashMap(); + metaData.put("docid", "12345"); + metaData.put("docname", "text.txt"); + metaData.put("doccatcode", "1234567"); + metaData.put("doctypcode", "12345123"); + return metaData; + + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadCardServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadCardServiceTest.java new file mode 100644 index 00000000000..ab4f77764b6 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadCardServiceTest.java @@ -0,0 +1,339 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isNull; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.PacketStatus; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TransactionStage; +import io.mosip.resident.dto.CheckStatusResponseDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidDownloadCardResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentCredentialServiceException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.DownloadCardService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +/** + * This class is used to create service class test for getting cards. + * + * @Author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class DownloadCardServiceTest { + + private static final String LOCALE_EN_US = "en-US"; + + @InjectMocks + private DownloadCardService downloadCardService = new DownloadCardServiceImpl(); + + @Mock + private IdAuthService idAuthService; + + @Mock + private Utilities utilities; + + @Mock + private Environment environment; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private ResidentCredentialService residentCredentialService; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private NotificationService notificationService; + + @Mock + private Utility utility; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private ResidentVidService vidService; + + private MainRequestDTO downloadCardRequestDTOMainRequestDTO; + + private String result; + + byte[] pdfbytes; + + private MainRequestDTO downloadPersonalizedCardMainRequestDTO; + + private IdentityDTO identityMap; + + private ResidentTransactionEntity residentTransactionEntity; + + @Before + public void setup() throws Exception { + downloadCardRequestDTOMainRequestDTO = new MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234567890"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTO.setIndividualId("7841261580"); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + result = "result"; + pdfbytes = result.getBytes(); + Mockito.when(utility.signPdf(Mockito.any(), Mockito.any())).thenReturn(pdfbytes); + Mockito.when(utilities.getRidByIndividualId(Mockito.anyString())).thenReturn("1234567890"); + Mockito.when(residentCredentialService.getCard(Mockito.anyString(), isNull(), isNull())).thenReturn(pdfbytes); + Mockito.when(identityService.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.UIN); + Mockito.when(identityService.getIdAndTypeForIndividualId(any())).thenReturn(Tuples.of("7841261580", IdType.UIN)); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("12345"); + + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("12345"); + downloadPersonalizedCardMainRequestDTO = new MainRequestDTO<>(); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml( + "PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pjx0YWJsZT48dHI+PHRkPk5hbWU8L3RkPjx0ZD5GUjwvdGQ+PC90cj48dHI+PHRkPkRPQjwvdGQ+PHRkPjE5OTIvMDQvMTU8L3RkPjwvdHI+PHRyPjx0ZD5QaG9uZSBOdW1iZXI8L3RkPjx0ZD45ODc2NTQzMjEwPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4="); + downloadPersonalizedCardDto.setAttributes(List.of("gender", "fullName")); + downloadPersonalizedCardMainRequestDTO.setRequest(downloadPersonalizedCardDto); + Mockito.when(environment.getProperty(ResidentConstants.MOSIP_CREDENTIAL_TYPE_PROPERTY)) + .thenReturn("credentialType"); + Mockito.when(environment.getProperty(ResidentConstants.CREDENTIAL_ISSUER)).thenReturn("credentialType"); + Mockito.when(environment.getProperty(ResidentConstants.CREDENTIAL_ENCRYPTION_FLAG)).thenReturn("true"); + Mockito.when(environment.getProperty(ResidentConstants.CREDENTIAL_ENCRYPTION_KEY)).thenReturn("true"); + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1234567890"); + Mockito.when(idAuthService.validateOtpV2(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), + Mockito.any())).thenReturn(Tuples.of(true, residentTransactionEntity)); + identityMap = new IdentityDTO(); + identityMap.put(IdType.UIN.name(), "8251649601"); + identityMap.put("email", "manojvsp12@gmail.com"); + identityMap.put("phone", "9395910872"); + identityMap.put("dateOfBirth", "1970"); + + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("123456789"); + Mockito.when(identityService.getIdentity("1234567890")).thenReturn(identityDTO); + } + + @Test + public void testGetDownloadCardPdfWithVID() + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException, OtpValidationFailedException { + Mockito.when(identityService.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.VID); + Mockito.when(identityService.getIdAndTypeForIndividualId(any())).thenReturn(Tuples.of("7841261580", IdType.VID)); + Tuple2 actualResult = downloadCardService + .getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + assertNotNull(actualResult); + assertEquals(pdfbytes, actualResult.getT1()); + } + + @Test(expected = OtpValidationFailedException.class) + public void testGetDownloadCardPdfWithValidateOTPFalse() + throws ResidentServiceCheckedException, OtpValidationFailedException { + Mockito.when(idAuthService.validateOtpV2(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), + Mockito.any())).thenReturn(Tuples.of(false, residentTransactionEntity)); + downloadCardService.getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testGetRidForIndividualIdWithApisResourceAccessException() + throws OtpValidationFailedException, ApisResourceAccessException, ResidentServiceCheckedException { + Mockito.when(idAuthService.validateOtpV2(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), + Mockito.any())).thenReturn(Tuples.of(true, residentTransactionEntity)); + Mockito.when(utilities.getRidByIndividualId(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + downloadCardService.getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = OtpValidationFailedException.class) + public void testGetDownloadCardPdfWithOtpValidationFailedException() + throws OtpValidationFailedException, ResidentServiceCheckedException { + Mockito.when(idAuthService.validateOtpV2(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), + Mockito.any())).thenThrow(new OtpValidationFailedException()); + downloadCardService.getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + } + + @Test + public void testGetDownloadCardPdfZeroLength() throws Exception { + Mockito.when(identityService.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.AID); + Mockito.when(identityService.getIdAndTypeForIndividualId(any())).thenReturn(Tuples.of("7841261580", IdType.AID)); + Mockito.when(residentCredentialService.getCard(Mockito.anyString(), isNull(), isNull())) + .thenReturn(new byte[0]); + Tuple2 actualResult = downloadCardService + .getDownloadCardPDF(downloadCardRequestDTOMainRequestDTO); + assertEquals(0, actualResult.getT1().length); + } + + @Test + public void testDownloadPersonalizedCardWithAttributesListAndPassword() + throws ResidentServiceCheckedException, IOException { + Mockito.when(environment.getProperty(ResidentConstants.IS_PASSWORD_FLAG_ENABLED)) + .thenReturn(String.valueOf(true)); + Mockito.when(environment.getProperty(ResidentConstants.PASSWORD_ATTRIBUTE)).thenReturn("firstName|dateOfBirth"); + Map name = new HashMap<>(); + name.put("language", "eng"); + name.put("value", "kamesh"); + identityMap.put("firstName", List.of(name)); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityMap); + Mockito.when(utilities.getLanguageCode()).thenReturn("eng"); + Mockito.when(utility.getPassword(Mockito.anyList())).thenReturn("kame1970"); + Tuple2 actualResult = downloadCardService + .downloadPersonalizedCard(downloadPersonalizedCardMainRequestDTO, 0, LOCALE_EN_US); + assertEquals(pdfbytes, actualResult.getT1()); + } + + @Test(expected = ResidentServiceException.class) + public void testDownloadPersonalizedCardPasswordFailed() throws ResidentServiceCheckedException { + Mockito.when(environment.getProperty(ResidentConstants.IS_PASSWORD_FLAG_ENABLED)) + .thenReturn(String.valueOf(true)); + Mockito.when(utility.getPassword(Mockito.anyList())) + .thenThrow(new ResidentServiceException(ResidentErrorCode.DOWNLOAD_PERSONALIZED_CARD)); + downloadCardService.downloadPersonalizedCard(downloadPersonalizedCardMainRequestDTO, 0, LOCALE_EN_US); + } + + @Test(expected = ResidentServiceException.class) + public void testDownloadPersonalizedCardResidentServiceCheckedException() + throws ResidentServiceCheckedException, IOException { + Mockito.when(identityService.getIdentity(Mockito.anyString())) + .thenThrow(new ResidentServiceCheckedException()); + downloadCardService.downloadPersonalizedCard(downloadPersonalizedCardMainRequestDTO, 0, LOCALE_EN_US); + } + + @Test + public void testGetVidCardEventIdWithVidDetails() throws BaseCheckedException, IOException { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("3257091426984315"); + Map name = new HashMap<>(); + name.put("language", "eng"); + name.put("value", "kamesh"); + identityMap.put("firstName", List.of(name)); + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setDateOfBirth("1892-08-09"); + identityDTO.setUIN("8251649601"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenReturn("8251649601"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setId("123"); + residentCredentialResponseDto.setRequestId("123"); + responseWrapper.setResponse(residentCredentialResponseDto); + Mockito.when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(responseWrapper); + Tuple2, String> tupleResponse = downloadCardService + .getVidCardEventId("123", 0, LOCALE_EN_US); + assertEquals("12345", tupleResponse.getT2()); + assertEquals(ResidentConstants.SUCCESS, tupleResponse.getT1().getResponse().getStatus()); + } + + @Test + public void testGetVidCardEventIdWithNameNull() throws BaseCheckedException, IOException { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("3257091426984315"); + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setDateOfBirth("1892-08-09"); + identityDTO.setUIN("8251649601"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenReturn("8251649601"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setId("123"); + residentCredentialResponseDto.setRequestId("123"); + responseWrapper.setResponse(residentCredentialResponseDto); + Mockito.when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(responseWrapper); + Tuple2, String> tupleResponse = downloadCardService + .getVidCardEventId("123", 0, LOCALE_EN_US); + assertEquals("12345", tupleResponse.getT2()); + assertEquals(ResidentConstants.SUCCESS, tupleResponse.getT1().getResponse().getStatus()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetVidCardEventIdNestedIf() throws BaseCheckedException { + downloadCardService.getVidCardEventId("123", 0, LOCALE_EN_US); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetVidCardEventIdWithRequestCredentialFailed() throws BaseCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.VID_REQUEST_CARD_FAILED.getErrorCode(), + ResidentErrorCode.VID_REQUEST_CARD_FAILED.getErrorMessage()))); + downloadCardService.getVidCardEventId("123", 0, LOCALE_EN_US); + } + + @Test(expected = ApisResourceAccessException.class) + public void testGetVidCardEventIdWithApisResourceAccessException() throws BaseCheckedException, IOException { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("8251649601"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenReturn("8251649601"); + Mockito.when(vidService.retrieveVids(Mockito.anyInt(), Mockito.anyString(), Mockito.anyString())) + .thenThrow(new ApisResourceAccessException()); + downloadCardService.getVidCardEventId("123", 0, LOCALE_EN_US); + } + + @Test(expected = BaseCheckedException.class) + public void testGetVidCardEventIdWithIOException() throws BaseCheckedException, IOException { + downloadCardService.getVidCardEventId("123", 0, LOCALE_EN_US); + } + + @Test + public void testGetIndividualIdStatus() + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + Map packetStatusMap = new HashMap<>(); + packetStatusMap.put(ResidentConstants.AID_STATUS, PacketStatus.SUCCESS.name()); + packetStatusMap.put(ResidentConstants.TRANSACTION_TYPE_CODE, TransactionStage.CARD_READY_TO_DOWNLOAD.name()); + Mockito.when(utilities.getPacketStatus(Mockito.anyString())).thenReturn(packetStatusMap); + ResponseWrapper individualIdStatus = downloadCardService + .getIndividualIdStatus("3425636374"); + assertEquals(PacketStatus.SUCCESS.getName(), individualIdStatus.getResponse().getAidStatus()); + } + + @Test + public void testGetIndividualIdStatusWithResidentCredentialServiceException() + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + Map packetStatusMap = new HashMap<>(); + packetStatusMap.put(ResidentConstants.AID_STATUS, PacketStatus.SUCCESS.name()); + packetStatusMap.put(ResidentConstants.TRANSACTION_TYPE_CODE, TransactionStage.CARD_READY_TO_DOWNLOAD.name()); + Mockito.when(utilities.getPacketStatus(Mockito.anyString())).thenReturn(packetStatusMap); + Mockito.when(residentCredentialService.getDataShareUrl(Mockito.anyString())) + .thenThrow(ResidentCredentialServiceException.class); + ResponseWrapper individualIdStatus = downloadCardService + .getIndividualIdStatus("3425636374"); + assertEquals(PacketStatus.IN_PROGRESS.getName(), individualIdStatus.getResponse().getAidStatus()); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadmasterDataServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadmasterDataServiceImplTest.java new file mode 100644 index 00000000000..418aa386cdf --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/DownloadmasterDataServiceImplTest.java @@ -0,0 +1,298 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.pdfgenerator.spi.PDFGenerator; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.kernel.signature.dto.SignatureResponseDto; +import io.mosip.kernel.templatemanager.velocity.builder.TemplateManagerBuilderImpl; +import io.mosip.resident.dto.RegistrationCenterDto; +import io.mosip.resident.dto.RegistrationCenterInfoResponseDto; +import io.mosip.resident.dto.WorkingDaysDto; +import io.mosip.resident.dto.WorkingDaysResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; + +/** + * This class is used to create service class test for download master data + * service impl. + * + * @Author Kamesh Shekhar Prasad + * @Author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class DownloadmasterDataServiceImplTest { + + @InjectMocks + private DownLoadMasterDataServiceImpl downLoadMasterDataService = new DownLoadMasterDataServiceImpl(); + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @InjectMocks + private TemplateManagerBuilderImpl templateManagerBuilder; + + @Mock + private PDFGenerator pdfGenerator; + + @Mock + private Environment environment; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private Utility utility; + + private byte[] result; + private String eventId; + private String languageCode; + private Optional residentTransactionEntity; + private Map templateVariables; + + @Mock + private TemplateManager templateManager; + private static final String CLASSPATH = "classpath"; + private static final String ENCODE_TYPE = "UTF-8"; + private Map values; + + private String langCode; + private Short hierarchyLevel; + private String name; + + @Before + public void setup() throws Exception { + templateVariables = new LinkedHashMap<>(); + values = new LinkedHashMap<>(); + values.put("test", String.class); + templateVariables.put("eventId", eventId); + result = "test".getBytes(StandardCharsets.UTF_8); + eventId = "bf42d76e-b02e-48c8-a17a-6bb842d85ea9"; + languageCode = "eng"; + + Mockito.when( + templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn("file text template"); + ReflectionTestUtils.setField(downLoadMasterDataService, "templateManagerBuilder", templateManagerBuilder); + templateManagerBuilder.encodingType(ENCODE_TYPE).enableCache(false).resourceLoader(CLASSPATH).build(); + InputStream stream = new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8)); + Mockito.when(templateManager.merge(any(), Mockito.anyMap())).thenReturn(stream); + OutputStream outputStream = new ByteArrayOutputStream(1024); + outputStream.write("test".getBytes(StandardCharsets.UTF_8)); + SignatureResponseDto signatureResponseDto = new SignatureResponseDto(); + signatureResponseDto.setData("data"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(signatureResponseDto); + Mockito.when(utility.signPdf(Mockito.any(), Mockito.any())).thenReturn("data".getBytes()); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("supporting-docs-list"); + Mockito.when(environment.getProperty(Mockito.anyString(), Mockito.anyString())).thenReturn(", "); + langCode = "eng"; + hierarchyLevel = 4; + name = "name1"; + } + + @Test + public void testDownloadRegistrationCentersByHierarchyLevel() throws Exception { + ReflectionTestUtils.setField(downLoadMasterDataService, "maxRegistrationCenterPageSize", 10); + ResponseWrapper regCentResponseWrapper = new ResponseWrapper(); + Map regCenterMap = new HashMap(); + regCenterMap.put("id", 21006); + regCenterMap.put("name", "Banglore Center Mehdia"); + regCentResponseWrapper.setResponse(Map.of("data", List.of(regCenterMap))); + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.nullable(String.class))).thenReturn(regCentResponseWrapper); + + RegistrationCenterInfoResponseDto registrationCentersDtls = new RegistrationCenterInfoResponseDto(); + RegistrationCenterDto registrationCenterDto = getRegCenterData(); + registrationCentersDtls.setData(List.of(registrationCenterDto)); + when(objectMapper.writeValueAsString(Mockito.any())).thenReturn("registration centers data"); + when(objectMapper.readValue(anyString(), eq(RegistrationCenterInfoResponseDto.class))) + .thenReturn(registrationCentersDtls); + + getRegCenterWorkingDaysData(); + + InputStream actualResult = downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(langCode, + hierarchyLevel, name); + assertNotNull(actualResult); + } + + @Test(expected = ResidentServiceException.class) + public void testDownloadRegistrationCentersByHierarchyLevelWithException() throws Exception { + ReflectionTestUtils.setField(downLoadMasterDataService, "maxRegistrationCenterPageSize", 10); + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.nullable(String.class))).thenReturn(new ResponseWrapper()); + + RegistrationCenterInfoResponseDto registrationCentersDtls = new RegistrationCenterInfoResponseDto(); + registrationCentersDtls.setData(List.of(new RegistrationCenterDto())); + when(objectMapper.writeValueAsString(Mockito.any())).thenReturn("registration centers data"); + when(objectMapper.readValue(anyString(), eq(RegistrationCenterInfoResponseDto.class))) + .thenReturn(registrationCentersDtls); + + downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(langCode, hierarchyLevel, name); + } + + @Test + public void testDownloadRegistrationCentersByHierarchyLevelEmptyRegCenterList() throws Exception { + ReflectionTestUtils.setField(downLoadMasterDataService, "maxRegistrationCenterPageSize", 10); + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.nullable(String.class))).thenReturn(new ResponseWrapper()); + + RegistrationCenterInfoResponseDto registrationCentersDtls = new RegistrationCenterInfoResponseDto(); + registrationCentersDtls.setData(List.of()); + registrationCentersDtls.setRegistrationCenters(List.of()); + when(objectMapper.writeValueAsString(Mockito.any())).thenReturn("registration centers data"); + when(objectMapper.readValue(anyString(), eq(RegistrationCenterInfoResponseDto.class))) + .thenReturn(registrationCentersDtls); + + downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(langCode, hierarchyLevel, name); + } + + @Test + public void testDownloadRegistrationCentersByHierarchyLevelWithRegCenter() throws Exception { + ReflectionTestUtils.setField(downLoadMasterDataService, "maxRegistrationCenterPageSize", 10); + Mockito.when(proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated(Mockito.anyString(), + Mockito.anyShort(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.any(), + Mockito.nullable(String.class))).thenReturn(new ResponseWrapper()); + + RegistrationCenterInfoResponseDto registrationCentersDtls = new RegistrationCenterInfoResponseDto(); + RegistrationCenterDto registrationCenterDto = getRegCenterData(); + registrationCentersDtls.setRegistrationCenters(List.of(registrationCenterDto)); + when(objectMapper.writeValueAsString(Mockito.any())).thenReturn("registration centers data"); + when(objectMapper.readValue(anyString(), eq(RegistrationCenterInfoResponseDto.class))) + .thenReturn(registrationCentersDtls); + + getRegCenterWorkingDaysData(); + + InputStream actualResult = downLoadMasterDataService.downloadRegistrationCentersByHierarchyLevel(langCode, + hierarchyLevel, name); + assertNotNull(actualResult); + } + + private RegistrationCenterDto getRegCenterData() { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + registrationCenterDto.setId("21006"); + registrationCenterDto.setName("Banglore Center Mehdia"); + registrationCenterDto.setCenterTypeCode("REG"); + registrationCenterDto.setLangCode("eng"); + registrationCenterDto.setAddressLine1("Mehdia Road Amria mehdia"); + registrationCenterDto.setAddressLine2("Kenitra"); + registrationCenterDto.setAddressLine3("Maroc"); + registrationCenterDto.setCenterStartTime("09:00:00"); + registrationCenterDto.setCenterEndTime("17:00:00"); + return registrationCenterDto; + } + + private void getRegCenterWorkingDaysData() + throws ResidentServiceCheckedException, JsonProcessingException, JsonMappingException { + Mockito.when(proxyMasterdataService.getRegistrationCenterWorkingDays(Mockito.anyString(), Mockito.anyString())) + .thenReturn(new ResponseWrapper()); + WorkingDaysResponseDto workingDaysResponeDtls = new WorkingDaysResponseDto(); + WorkingDaysDto workingDaysDto1 = new WorkingDaysDto(); + workingDaysDto1.setCode("102"); + workingDaysDto1.setOrder(2); + workingDaysDto1.setLanguage("eng"); + workingDaysDto1.setName("MON"); + WorkingDaysDto workingDaysDto2 = new WorkingDaysDto(); + workingDaysDto2.setCode("103"); + workingDaysDto2.setOrder(3); + workingDaysDto2.setLanguage("eng"); + workingDaysDto2.setName("TUE"); + workingDaysResponeDtls.setWorkingdays(List.of(workingDaysDto1, workingDaysDto2)); + when(objectMapper.writeValueAsString(Mockito.any())).thenReturn("working days data"); + when(objectMapper.readValue(anyString(), eq(WorkingDaysResponseDto.class))).thenReturn(workingDaysResponeDtls); + } + + @Test + public void testGetNearestRegistrationcenters() throws Exception { + byte[] actualResult = downLoadMasterDataService.getNearestRegistrationcenters(langCode, 4L, 4L, 3) + .readAllBytes(); + assertNotNull(actualResult); + } + + @Test + public void testDownloadSupportingDocsByLanguage() throws Exception { + byte[] actualResult = downLoadMasterDataService.downloadSupportingDocsByLanguage(langCode).readAllBytes(); + assertNotNull(actualResult); + } + + @Test + public void testgetTime() throws Exception { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + registrationCenterDto.setCenterTypeCode("Ind"); + WorkingDaysResponseDto workingDaysResponseDto = new WorkingDaysResponseDto(); + WorkingDaysDto workingDaysDto = new WorkingDaysDto(); + workingDaysDto.setCode("123"); + workingDaysResponseDto.setWorkingdays(List.of(workingDaysDto)); + ResponseWrapper responseWrapper1 = new ResponseWrapper<>(); + responseWrapper1.setResponse(workingDaysResponseDto); + ReflectionTestUtils.invokeMethod(downLoadMasterDataService, "getTime", String.valueOf(LocalTime.of(12, 2, 2))); + + } + + @Test + public void testgetTimeFailed() throws Exception { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + registrationCenterDto.setCenterTypeCode("Ind"); + WorkingDaysResponseDto workingDaysResponseDto = new WorkingDaysResponseDto(); + WorkingDaysDto workingDaysDto = new WorkingDaysDto(); + workingDaysDto.setCode("123"); + workingDaysResponseDto.setWorkingdays(List.of(workingDaysDto)); + ResponseWrapper responseWrapper1 = new ResponseWrapper<>(); + responseWrapper1.setResponse(workingDaysResponseDto); + ReflectionTestUtils.invokeMethod(downLoadMasterDataService, "getTime", "123"); + + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/GrievanceServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/GrievanceServiceImplTest.java new file mode 100644 index 00000000000..2a9651b53c7 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/GrievanceServiceImplTest.java @@ -0,0 +1,68 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.repository.ResidentGrievanceRepository; + +/** + * This class is used to create service class test for grievance API. + * @Author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class GrievanceServiceImplTest { + + @InjectMocks + private GrievanceServiceImpl grievanceService = new GrievanceServiceImpl(); + + @Mock + private Environment environment; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private ResidentGrievanceRepository residentGrievanceRepository; + + private MainRequestDTO grievanceRequestDTOMainRequestDTO; + + @Before + public void setup() throws Exception { + grievanceRequestDTOMainRequestDTO = new MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setEventId("12121212121212"); + grievanceRequestDTO.setMessage("message"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("Kamesh"); + Mockito.when(identityService.getAvailableclaimValue(Mockito.anyString())).thenReturn("kamesh"); + } + + @Test + public void testGetGrievanceTicket() throws ApisResourceAccessException { + ResponseWrapper actualResult = grievanceService.getGrievanceTicket(grievanceRequestDTOMainRequestDTO); + assertNotNull(actualResult); + } + + @Test(expected = ApisResourceAccessException.class) + public void testGetGrievanceTicketFailed() throws ApisResourceAccessException { + Mockito.when(identityService.getAvailableclaimValue(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + ResponseWrapper actualResult = grievanceService.getGrievanceTicket(grievanceRequestDTOMainRequestDTO); + assertNotNull(actualResult); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/IdAuthServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdAuthServiceTest.java similarity index 79% rename from resident/resident-service/src/test/java/io/mosip/resident/test/service/IdAuthServiceTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdAuthServiceTest.java index 9f7ad62eaa1..dd32f215230 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/IdAuthServiceTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdAuthServiceTest.java @@ -1,50 +1,79 @@ -package io.mosip.resident.test.service; +package io.mosip.resident.service.impl; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.net.URI; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.crypto.SecretKey; + +import io.mosip.resident.dto.IdentityDTO; +import org.assertj.core.util.Lists; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; import com.fasterxml.jackson.databind.ObjectMapper; + import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.DateUtils; import io.mosip.kernel.keygenerator.bouncycastle.KeyGenerator; import io.mosip.resident.constant.AuthTypeStatus; import io.mosip.resident.constant.IdType; import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.*; +import io.mosip.resident.dto.AuthError; +import io.mosip.resident.dto.AuthResponseDTO; +import io.mosip.resident.dto.AuthTypeStatusResponseDto; +import io.mosip.resident.dto.AutnTxnDto; +import io.mosip.resident.dto.AutnTxnResponseDto; +import io.mosip.resident.dto.ErrorDTO; +import io.mosip.resident.dto.IdAuthResponseDto; +import io.mosip.resident.dto.PublicKeyResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.CertificateException; import io.mosip.resident.exception.OtpValidationFailedException; import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.impl.IdAuthServiceImpl; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyIdRepoService; import io.mosip.resident.util.ResidentServiceRestClient; -import org.assertj.core.util.Lists; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.core.env.Environment; -import org.springframework.test.context.ContextConfiguration; - -import javax.crypto.SecretKey; -import java.io.IOException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.time.LocalDateTime; -import java.util.*; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; +import io.mosip.resident.util.Utility; @RunWith(MockitoJUnitRunner.class) @RefreshScope @ContextConfiguration public class IdAuthServiceTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; private ObjectMapper objectMapper = new ObjectMapper(); @@ -69,12 +98,23 @@ public class IdAuthServiceTest { @InjectMocks private IdAuthService idAuthService = new IdAuthServiceImpl(); - @Before - public void setup() { + @Mock + private ResidentTransactionRepository residentTransactionRepository; - // when(environment.getProperty(ApiName.KERNELENCRYPTIONSERVICE.name())) - // .thenReturn("https://dev.mosip.net/idauthentication/v1/internal/getCertificate"); + @Mock + private IdentityServiceImpl identityService; + + @Mock + private NotificationService notificationService; + + @Mock + private Utility utility; + @Before + public void setup() throws ResidentServiceCheckedException { + IdentityDTO identityDTO1 = new IdentityDTO(); + identityDTO1.setUIN("234"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO1); } @Test @@ -82,10 +122,11 @@ public void testAuthTypeStatusUpdateSuccess() throws ApisResourceAccessException AuthTypeStatusResponseDto authTypeStatusResponseDto = new AuthTypeStatusResponseDto(); when(restClient.postApi(any(), any(), any(), any())).thenReturn(authTypeStatusResponseDto); List authTypes = new ArrayList<>(); - authTypes.add("bio-FIR"); - boolean isUpdated = idAuthService.authTypeStatusUpdate("1234567891", authTypes, AuthTypeStatus.LOCK, - null); - assertTrue(isUpdated); + authTypes.add("bio"); + Map authTypeStatusMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> AuthTypeStatus.LOCK)); + Map unlockForSecondsMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> 10L)); + String requestId = idAuthService.authTypeStatusUpdate("1234567891", authTypeStatusMap, unlockForSecondsMap); + assertTrue(requestId != null && !requestId.isEmpty()); } @Test(expected = ApisResourceAccessException.class) @@ -94,13 +135,14 @@ public void testAuthTypeStatusUpdateFailure() throws ApisResourceAccessException when(restClient.postApi(any(), any(), any(), any())).thenThrow(new ApisResourceAccessException()); List authTypes = new ArrayList<>(); authTypes.add("bio-FIR"); - boolean isUpdated = idAuthService.authTypeStatusUpdate("1234567891", authTypes, AuthTypeStatus.LOCK, - null); - assertTrue(isUpdated); + Map authTypeStatusMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> AuthTypeStatus.LOCK)); + Map unlockForSecondsMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> 10L)); + String requestId = idAuthService.authTypeStatusUpdate("1234567891", authTypeStatusMap, unlockForSecondsMap); + assertTrue(requestId != null && !requestId.isEmpty()); } @Test(expected = CertificateException.class) - public void validateOtpSuccessThrowsAPIsResourceAccessExceptionTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException { + public void validateOtpSuccessThrowsAPIsResourceAccessExceptionTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException, ResidentServiceCheckedException { String transactionID = "12345"; String individualId = "individual"; String individualIdType = IdType.UIN.name(); @@ -122,7 +164,7 @@ public void validateOtpSuccessThrowsAPIsResourceAccessExceptionTest() throws IOE when(keyGenerator.getSymmetricKey()).thenReturn(secretKey); when(encryptor.symmetricEncrypt(any(), any(), any())).thenReturn(request.getBytes()); - when(restClient.getApi(any(), any(Class.class))).thenReturn(responseWrapper); + when(restClient.getApi((URI)any(), any(Class.class))).thenReturn(responseWrapper); when(environment.getProperty(anyString())).thenReturn("dummy url"); doReturn(objectMapper.writeValueAsString(responseDto)).when(mapper).writeValueAsString(any()); @@ -132,13 +174,16 @@ public void validateOtpSuccessThrowsAPIsResourceAccessExceptionTest() throws IOE } @Test - public void validateOtpSuccessTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException { + public void validateOtpSuccessTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException, ResidentServiceCheckedException { String transactionID = "12345"; String individualId = "individual"; String individualIdType = IdType.UIN.name(); String otp = "12345"; String request = "request"; + + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("12345"); IdAuthResponseDto authResponse = new IdAuthResponseDto(); authResponse.setAuthStatus(true); @@ -176,7 +221,7 @@ public void validateOtpSuccessTest() throws IOException, ApisResourceAccessExcep when(keyGenerator.getSymmetricKey()).thenReturn(secretKey); when(encryptor.symmetricEncrypt(any(), any(), any())).thenReturn(request.getBytes()); - when(restClient.getApi(any(), any(Class.class))).thenReturn(responseWrapper); + when(restClient.getApi((URI)any(), any(Class.class))).thenReturn(responseWrapper); when(environment.getProperty(anyString())).thenReturn("dummy url"); doReturn(objectMapper.writeValueAsString(responseDto)).when(mapper).writeValueAsString(any()); @@ -193,7 +238,7 @@ public void validateOtpSuccessTest() throws IOException, ApisResourceAccessExcep @Test(expected = OtpValidationFailedException.class) public void otpValidationFailedTest() - throws IOException, ApisResourceAccessException, OtpValidationFailedException { + throws IOException, ApisResourceAccessException, OtpValidationFailedException, ResidentServiceCheckedException { String transactionID = "12345"; String individualId = "individual"; String otp = "12345"; @@ -241,7 +286,7 @@ public void otpValidationFailedTest() when(keyGenerator.getSymmetricKey()).thenReturn(secretKey); when(encryptor.symmetricEncrypt(any(), any(), any())).thenReturn(request.getBytes()); - when(restClient.getApi(any(), any(Class.class))).thenReturn(responseWrapper); + when(restClient.getApi((URI)any(), any(Class.class))).thenReturn(responseWrapper); when(environment.getProperty(anyString())).thenReturn("dummy url"); doReturn(objectMapper.writeValueAsString(responseDto)).when(mapper).writeValueAsString(any()); @@ -252,7 +297,7 @@ public void otpValidationFailedTest() } @Test(expected = Exception.class) - public void idAuthErrorsTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException { + public void idAuthErrorsTest() throws IOException, ApisResourceAccessException, OtpValidationFailedException, ResidentServiceCheckedException { String transactionID = "12345"; String individualId = "individual"; String individualIdType = IdType.UIN.name(); @@ -284,8 +329,8 @@ public void testGetAuthHistoryDetailsSuccess() throws ApisResourceAccessExceptio AutnTxnDto autnTxnDto = new AutnTxnDto(); autnTxnDto.setAuthtypeCode("OTP-AUTH"); autnTxnDto.setEntityName("ida_app_user"); - autnTxnDto.setReferenceIdType("UIN"); - autnTxnDto.setRequestdatetime(LocalDateTime.now()); + autnTxnDto.setReferenceIdType(IdType.UIN.name()); + autnTxnDto.setRequestdatetime(DateUtils.getUTCCurrentDateTime()); autnTxnDto.setStatusCode("N"); autnTxnDto.setStatusComment("OTP Authentication Failed"); autnTxnDto.setTransactionID("1111122222"); @@ -315,12 +360,20 @@ public void testGetAuthHistoryDetailsFetchFailure() throws ApisResourceAccessExc public void testAuthTypeStatusUpdateUnlockSuccess() throws ApisResourceAccessException, ResidentServiceCheckedException { AuthTypeStatusResponseDto authTypeStatusResponseDto = new AuthTypeStatusResponseDto(); + + ErrorDTO error = new ErrorDTO(); + error.setErrorCode("101"); + error.setErrorMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + authTypeStatusResponseDto.setErrors(errorList); when(restClient.postApi(any(), any(), any(), any())).thenReturn(authTypeStatusResponseDto); List authTypes = new ArrayList<>(); authTypes.add("bio-FIR"); - boolean isUpdated = idAuthService.authTypeStatusUpdate("1234567891", authTypes, AuthTypeStatus.UNLOCK, - null); - assertTrue(isUpdated); + Map authTypeStatusMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> AuthTypeStatus.LOCK)); + Map unlockForSecondsMap=authTypes.stream().distinct().collect(Collectors.toMap(Function.identity(), str -> 10L)); + idAuthService.authTypeStatusUpdate("1234567891", authTypeStatusMap, unlockForSecondsMap); } @Test diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdentityServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdentityServiceTest.java new file mode 100644 index 00000000000..4e6eee9e315 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/IdentityServiceTest.java @@ -0,0 +1,747 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.idrepository.core.util.TokenIDGenerator; +import io.mosip.kernel.authcodeflowproxy.api.validator.ValidateTokenUtil; +import io.mosip.kernel.biometrics.spi.CbeffUtil; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.openid.bridge.api.constants.AuthErrorCode; +import io.mosip.kernel.openid.bridge.model.AuthUserDetails; +import io.mosip.kernel.openid.bridge.model.MosipUserDto; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.ResponseDTO1; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.service.ResidentVidService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; +import reactor.util.function.Tuples; + +@RunWith(MockitoJUnitRunner.Silent.class) +@RefreshScope +@ContextConfiguration +public class IdentityServiceTest { + + @InjectMocks + private IdentityServiceImpl identityService = new IdentityServiceImpl(); + + @Mock + private Utility utility; + + @Mock + private CbeffUtil cbeffUtil; + + @Mock + private TokenIDGenerator tokenIDGenerator; + + @Mock + private ResidentVidService residentVidService; + + @Mock + private ResidentServiceRestClient restClientWithSelfTOkenRestTemplate; + + @Mock + private ResidentServiceRestClient restClientWithPlainRestTemplate; + + @Mock + private ResidentConfigService residentConfigService; + + @Mock + private Environment env; + + @Mock + private RequestValidator requestValidator; + + @Mock + private ObjectStoreHelper objectStoreHelper; + + @Mock + private Utilities utilities; + + @Mock + private ValidateTokenUtil tokenValidationHelper; + + private ResponseWrapper responseWrapper; + + private Map responseMap; + + private Map bdbFaceMap; + + private ObjectMapper objectMapper = new ObjectMapper(); + + private static String token; + private IdResponseDTO1 idResponseDTO1; + + + @Before + public void setUp() throws Exception { + ReflectionTestUtils.setField(identityService, "dateFormat", "yyyy/MM/dd"); + ReflectionTestUtils.setField(identityService, "objectMapper", objectMapper); + + Map identityMap = new LinkedHashMap(); + identityMap.put("UIN", "8251649601"); + identityMap.put("email", "manojvsp12@gmail.com"); + identityMap.put("phone", "9395910872"); + identityMap.put("dateOfBirth", "1970/11/16"); + + List fNameList = new ArrayList(); + Map fNameMap = new LinkedHashMap(); + fNameMap.put("language", "eng"); + fNameMap.put("value", "Rahul"); + fNameList.add(fNameMap); + identityMap.put("firstName", fNameList); + + List mNameList = new ArrayList(); + Map mNameMap = new LinkedHashMap(); + mNameMap.put("language", "eng"); + mNameMap.put("value", "Kumar"); + mNameList.add(mNameMap); + identityMap.put("middleName", mNameList); + + List lNameList = new ArrayList(); + Map lNameMap = new LinkedHashMap(); + lNameMap.put("language", "eng"); + lNameMap.put("value", "Singh"); + lNameList.add(lNameMap); + identityMap.put("lastName", lNameList); + + responseMap = new LinkedHashMap(); + responseMap.put("identity", identityMap); + + List docList = new ArrayList(); + Map docMap = new LinkedHashMap(); + docMap.put("category", "individualBiometrics"); + docMap.put("value", "encodedValue"); + docList.add(docMap); + responseMap.put("documents", docList); + + bdbFaceMap = new HashMap(); + bdbFaceMap.put("face", "this is a face biometric key"); + + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + responseWrapper.setResponse(responseMap); + responseWrapper.setErrors(null); + + when(restClientWithSelfTOkenRestTemplate.getApi((ApiName) any(), anyMap(), anyList(), anyList(), any())) + .thenReturn(responseWrapper); + when(residentConfigService.getUiSchemaFilteredInputAttributes(anyString())) + .thenReturn(List.of("UIN", "email", "phone", "dateOfBirth", "firstName", "middleName", "lastName", "perpetualVID")); + + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(true); + Mockito.when(requestValidator.validateRid(Mockito.anyString())).thenReturn(true); + token = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJubEpTaUExM2tPUWhZQ0JxMEVKSkRlWnFTOGsybDB3MExUbmQ1WFBCZ20wIn0." + + "eyJleHAiOjE2NzIxMjU0NjEsImlhdCI6MTY3MjAzOTA2MSwianRpIjoiODc5YTdmYTItZWZhYy00YTQwLTkxODQtNzZiM2FhMWJiODg0IiwiaXNzIjoiaHR0c" + + "HM6Ly9pYW0uZGV2Lm1vc2lwLm5ldC9hdXRoL3JlYWxtcy9tb3NpcCIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiNTc3NjkzYi0xOWI1LTRlYTktYWEzNy1kMT" + + "EzMjdkOGRkNzkiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJtb3NpcC1yZXNpZGVudC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiNWNmZWIzNTgtNGY1Ni00NjM" + + "0LTg3NmQtNGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9u" + + "IiwiZGVmYXVsdC1yb2xlcy1tb3NpcCJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYW" + + "Njb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoid2FsbGV0X2JpbmRpbmcgYXV0aC5oaXN0b3J5LnJlYWRvbmx5IG1pY3JvcHJvZmlsZS1q" + + "d3QgaWRlbnRpdHkucmVhZG9ubHkgaWRhX3Rva2VuIG9mZmxpbmVfYWNjZXNzIGFkZHJlc3MgdXBkYXRlX29pZGNfY2xpZW50IGNyZWRlbnRpYWwubWFuYWdlIH" + + "ZpZC5tYW5hZ2UgZ2V0X2NlcnRpZmljYXRlIGFkZF9vaWRjX2NsaWVudCB2aWQucmVhZG9ubHkgaWRlbnRpdHkudXBkYXRlIG5vdGlmaWNhdGlvbnMubWFuYWdl" + + "IGVtYWlsIHVwbG9hZF9jZXJ0aWZpY2F0ZSBhdXRoLnJlYWRvbmx5IGF1dGgubWV0aG9kLm1hbmFnZSBub3RpZmljYXRpb25zLnJlYWRvbmx5IGluZGl2aWR1YWxf" + + "aWQgYXV0aC5oaXN0b3J5Lm1hbmFnZSB0ZXN0IHByb2ZpbGUgY2FyZC5tYW5hZ2Ugc2VuZF9iaW5kaW5nX290cCIsInNpZCI6IjVjZmViMzU4LTRmNTYtNDYzNC0" + + "4NzZkLTRhYzc5NTk2MmFkZCIsInVwbiI6ImthbWVzaCIsImFkZHJlc3MiOnt9LCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJLYW1lc2ggU2hla2hh" + + "ciIsImdyb3VwcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiZGVmYXVsdC1yb2xlcy1tb3NpcCJdLCJwcmVmZXJyZWRfdXNlcm5hb" + + "WUiOiJrYW1lc2giLCJnaXZlbl9uYW1lIjoiS2FtZXNoIiwiZmFtaWx5X25hbWUiOiJTaGVraGFyIiwicGljdHVyZSI6ImlWQk9SdzBLR2dvQUFBQU5TVWhFVW" + + "dBQUFBb0FBQUFLQ0FJQUFBQUNVRmpxQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQUZpVUFBQllsQVVsU0pQQUF" + + "BQUJDU1VSQlZDaFRiWXRCRWdBZ0NBTDcvNmVOaEJ5MDlxRGk2Z3BqWFpTeFVVOG8vanJmcERtY21ZMVFBT1doZ1Rzd3Y2c1NtOHpWaFVMbGdzdCsrOFQ1MUlq" + + "WU5VSGRJKzRYWkhvQUFBQUFTVVZPUks1Q1lJST0iLCJlbWFpbCI6ImthbWVzaHNyMTMzOEBnbWFpbC5jb20ifQ.YLddWNd7ldiMvPhDK0HhXaKjEmeOE0T6wS" + + "CjfN3mlwxDxHm2DzMHnwbKR5orEm1NRyCnUfGGm5IMVTdDnXz1iUAsU7zeKA2XOdH3zQgMUu-vqJpgRWRG-XJHakSyblfAFIVAILRi7rwJQjL7X1lhm1ZAqUX" + + "Soh6kZBoOeYd_29RQQzFQNzpn_Ahk4GxQu_TLyvoWeNXpfx94om7TqrZYghtTg5_svku2P0NuFxzbWysPMjaHrEff0idKY94sKJ6eNpLXRXbJCPkAHtfVY0U3" + + "YDQqWUpYjE3hQCZz0u_L8sieJIN3mYtjd12rfOrjEKu2fFGu5UbJRVqkmOw0egVGHw"; + when(env.getProperty("mosip.resident.photo.attribute.name")).thenReturn("photo"); + when(env.getProperty("resident.additional.identity.attribute.to.fetch")).thenReturn("UIN,email,phone,dateOfBirth,fullName"); + when(env.getProperty("mosip.resident.photo.token.claim-photo")).thenReturn("picture"); + idResponseDTO1 = new IdResponseDTO1(); + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setIdentity(identityMap); + idResponseDTO1.setResponse(responseDTO1); + when(utility.getMappingValue(Mockito.anyMap(), Mockito.anyString())).thenReturn("1970/11/16"); + when(utility.getCachedIdentityData(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(idResponseDTO1); + when(utility.getIdentityData(Mockito.any(), Mockito.any())).thenReturn(idResponseDTO1); + + Map identityMappingMap = new HashMap<>(); + Map valueMap = new HashMap<>(); + valueMap.put("value", "fullName"); + identityMappingMap.put("name", valueMap); + when(residentConfigService.getIdentityMappingMap()).thenReturn(identityMappingMap); + } + + private void fileLoadMethod() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + when(utility.getMappingJson()).thenReturn(mappingJson); + } + + @Test + public void testGetIdentityLangCodeNull() throws Exception { + getAuthUserDetailsFromAuthentication(); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + fileLoadMethod(); + IdentityDTO result = identityService.getIdentity("6"); + assertNotNull(result); + assertEquals("8251649601", result.getUIN()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIdentityWithIOException() throws Exception { + getAuthUserDetailsFromAuthentication(); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + fileLoadMethod(); + when(utility.getMappingValue(Mockito.anyMap(), Mockito.anyString())).thenThrow(IOException.class); + identityService.getIdentity("6"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIdentityAttributesIf() throws Exception { + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + idResponseDTO1.setErrors(List.of(error)); + when(utility.getIdentityData(Mockito.any(), Mockito.any())).thenReturn(idResponseDTO1); + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + identityService.getIdentity("6", false, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIdentityAttributesWithApisResourceAccessException() throws Exception { + getAuthUserDetailsFromAuthentication(); + when(utility.getCachedIdentityData(Mockito.anyString(), Mockito.anyString(), Mockito.any())) + .thenThrow(new ApisResourceAccessException()); + identityService.getIdentityAttributes("6", null); + } + + @Test + public void testGetUinForIndividualId() throws Exception{ + String id = "123456789"; + fileLoadMethod(); + String result = identityService.getUinForIndividualId(id); + assertEquals("123456789", result); + } + + @Test + public void testGetIDATokenForIndividualId() throws Exception{ + String id = "123456789"; + String token = "1234"; + ReflectionTestUtils.setField(identityService, "onlineVerificationPartnerId", "m-partner-default-auth"); + when(tokenIDGenerator.generateTokenID(anyString(), anyString())).thenReturn(token); + fileLoadMethod(); + String result = identityService.getIDATokenForIndividualId(id); + assertEquals(token, result); + } + + @Test(expected = ResidentServiceException.class) + public void testGetClaimFromUserInfoFailure(){ + Map userInfo = new HashMap<>(); + ReflectionTestUtils.invokeMethod(identityService, "getClaimFromUserInfo", userInfo, "claim"); + } + + @Test + public void testGetClaimFromUserInfoSuccess() { + Map userInfo = new HashMap<>(); + userInfo.put("claim", "value"); + String result = ReflectionTestUtils.invokeMethod(identityService, "getClaimFromUserInfo", userInfo, "claim"); + assertEquals("value", result); + } + + private Tuple3, Map> loadUserInfoMethod() throws Exception { + Map userInfo = new HashMap<>(); + userInfo.put("claim", "value"); + URI uri = URI.create("http://localhost:8080/userinfo"); + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Authorization", "Bearer " + token); + return Tuples.of(uri, headers, userInfo); + } + + @Test + public void testGetIdAndTypeForIndividualId() throws Exception{ + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(requestValidator.validateVid(Mockito.anyString())).thenReturn(false); + fileLoadMethod(); + Tuple2 result = ReflectionTestUtils.invokeMethod(identityService, "getIdAndTypeForIndividualId", "123456789"); + assertEquals("8251649601", result.getT1()); + assertEquals(IdType.UIN, result.getT2()); + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(true); + Tuple2 response = ReflectionTestUtils.invokeMethod(identityService, "getIdAndTypeForIndividualId", "123456789"); + assertEquals("123456789", response.getT1()); + assertEquals(IdType.UIN, response.getT2()); + } + + @Test + public void testGetIndividualIdForAidUseVidOnlyTrue() throws Exception{ + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(requestValidator.validateVid(Mockito.anyString())).thenReturn(false); + Optional perpVid = Optional.of("8251649601"); + when(residentVidService.getPerpatualVid(anyString())).thenReturn(perpVid); + ReflectionTestUtils.setField(identityService,"useVidOnly", true); + fileLoadMethod(); + Tuple2 result = ReflectionTestUtils.invokeMethod(identityService, "getIdAndTypeForIndividualId", "123456789"); + assertEquals("8251649601", result.getT1()); + assertEquals(IdType.VID, result.getT2()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIndividualIdForAidVidNotPresent() throws Exception{ + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(requestValidator.validateVid(Mockito.anyString())).thenReturn(false); + when(residentVidService.getPerpatualVid(anyString())).thenReturn(Optional.empty()); + ReflectionTestUtils.setField(identityService,"useVidOnly", true); + fileLoadMethod(); + identityService.getIdAndTypeForIndividualId("123456789"); + } + + @Test + public void testGetIndividualIdTypeUin(){ + assertEquals(IdType.UIN, identityService.getIndividualIdType("2476302389")); + } + + @Test + public void testGetIndividualIdTypeVid(){ + assertEquals(IdType.UIN, identityService.getIndividualIdType("2476302389")); + } + + @Test + public void testDecodeString(){ + String encodedString = "c3RyaW5n"; + assertEquals("string", ReflectionTestUtils.invokeMethod(identityService, "decodeString", encodedString)); + } + + @Test + public void testGetClaimValueFromJwtToken(){ + assertEquals("account", ReflectionTestUtils.invokeMethod(identityService, "getClaimValueFromJwtToken", + token, "aud")); + } + + @Test + public void testGetClaimValueFromJwtTokenNullToken(){ + token = null; + assertEquals("", ReflectionTestUtils.invokeMethod(identityService, "getClaimValueFromJwtToken", + token, "aud")); + } + + @Test(expected = RuntimeException.class) + public void testGetClaimValueFromJwtTokenDecryptedTokenFailed(){ + token = "c3RyaW5n"; + assertEquals("", ReflectionTestUtils.invokeMethod(identityService, "getClaimValueFromJwtToken", + token, "aud")); + } + + @Test(expected = RuntimeException.class) + public void testGetClaimValueFromJwtTokenDecryptedToken(){ + token = "YLddWNd7ldiMvPhDK0HhXaKjEmeOE0T6wSCjfN3mlwxDxHm2DzMHnwbKR5orEm1NRyCnUfGGm5IMVTdDnXz1iUAsU7zeKA2XOdH3zQgMUu" + + "-vqJpgRWRG-XJHakSyblfAFIVAILRi7rwJQjL7X1lhm1ZAqUXSoh6kZBoOeYd_29RQQzFQNzpn_Ahk4GxQu_TLyvoWeNXpfx94om7TqrZYghtTg" + + "5_svku2P0NuFxzbWysPMjaHrEff0idKY94sKJ6eNpLXRXbJCPkAHtfVY0U3YDQqWUpYjE3hQCZz0u_L8sieJIN3mYtjd12rfOrjEKu2fFGu5UbJRV" + + "qkmOw0egVGHw"; + assertEquals("", ReflectionTestUtils.invokeMethod(identityService, "getClaimValueFromJwtToken", + token, "aud")); + } + + @Test + public void testGetClaimValueFromJwtTokenNullClaim() throws ResidentServiceCheckedException { + assertEquals("2476302389",identityService.getUinForIndividualId("2476302389")); + } + + @Test + public void testGetMappingValue() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + when(residentConfigService.getIdentityMappingMap()).thenThrow(new ResidentServiceCheckedException()); + identityService.getIdentity("6", false, "eng"); + } + + @Test + public void testGetMappingValueInvalidPerpetualVid() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + fileLoadMethod(); + IdentityDTO result = identityService.getIdentity("6", false, "eng"); + assertNotNull(result); + assertEquals("8251649601", result.getUIN()); + } + + @Test + public void testGetMappingValueValidPerpetualVid() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("4069341201794732")); + fileLoadMethod(); + String str = CryptoUtil.encodeToURLSafeBase64("response return".getBytes()); + IdentityDTO result = identityService.getIdentity("6", false, "eng"); + assertNotNull(result); + assertEquals("8251649601", result.getUIN()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetMappingValueValidPerpetualVidResidentServiceCheckedException() throws Exception { + fileLoadMethod(); + when(env.getProperty("resident.additional.identity.attribute.to.fetch")).thenReturn("UIN,email,phone,dateOfBirth,fullName,perpetualVID"); + when(residentVidService.getPerpatualVid(Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + IdentityDTO result = identityService.getIdentity("6", false, "eng"); + assertNotNull(result); + assertEquals("6", result.getUIN()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetMappingValueValidPerpetualVidApisResourceAccessException() throws Exception { + when(residentVidService.getPerpatualVid(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + when(env.getProperty("resident.additional.identity.attribute.to.fetch")).thenReturn("UIN,email,phone,dateOfBirth,fullName,perpetualVID"); + fileLoadMethod(); + IdentityDTO result = identityService.getIdentity("6", false, "eng"); + assertNotNull(result); + assertEquals("6", result.getUIN()); + } + + @Test + public void testGetUinForIndividualIdVId() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenReturn("2476302389"); + assertEquals("8251649601",identityService.getUinForIndividualId("2476302389")); + } + + @Test + public void testGetUinForIndividualIdVIdCreationException() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(utilities.getIdentityDataFromIndividualID(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + assertEquals("8251649601",identityService.getUinForIndividualId("2476302389")); + } + + @Test + public void testGetUinForIndividualIdApisResourceAccessException() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + assertEquals("8251649601",identityService.getUinForIndividualId("2476302389")); + } + + @Test + public void testGetUinForIndividualIdIOException() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenThrow(new IOException()); + assertEquals("8251649601",identityService.getUinForIndividualId("2476302389")); + } + + public static void getAuthUserDetailsFromAuthentication() { + Authentication authentication= Mockito.mock(Authentication.class); + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + SecurityContextHolder.setContext(securityContext); + when(securityContext.getAuthentication()).thenReturn(authentication); + + MosipUserDto mosipUserDto = new MosipUserDto(); + mosipUserDto.setToken(token); + // test the case where the principal is an AuthUserDetails object + AuthUserDetails authUserDetails = new AuthUserDetails(mosipUserDto, token); + when(authentication.getPrincipal()).thenReturn(authUserDetails); + } + + @Test + public void testGetAuthUserDetails() { + getAuthUserDetailsFromAuthentication(); + assertNotNull(ReflectionTestUtils.invokeMethod(identityService, "getAuthUserDetails")); + } + + @Test + public void testGetAuthUserDetailsPrincipalNull() { + Authentication authentication= Mockito.mock(Authentication.class); + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + SecurityContextHolder.setContext(securityContext); + when(securityContext.getAuthentication()).thenReturn(authentication); + + MosipUserDto mosipUserDto = new MosipUserDto(); + mosipUserDto.setToken(token); + // test the case where the principal is an AuthUserDetails object + assertNull(ReflectionTestUtils.invokeMethod(identityService, "getAuthUserDetails")); + } + + @Test(expected = Exception.class) + public void testGetResidentIndividualIdInvalidToken() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); + + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + getAuthUserDetailsFromAuthentication(); + assertEquals("3956038419",identityService.getResidentIndvidualIdFromSession()); + } + + @Test(expected = Exception.class) + public void testGetResidentIndividualIdValidToken() throws Exception { + ImmutablePair verifySignagure = new ImmutablePair<>(true, AuthErrorCode.UNAUTHORIZED); + //Mockito.when(tokenValidationHelper.verifyJWTSignagure(Mockito.any())).thenReturn(verifySignagure); + //Mockito.when(objectStoreHelper.decryptData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("Value"); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(token); + getAuthUserDetailsFromAuthentication(); + assertEquals("3956038419",identityService.getResidentIndvidualIdFromSession()); + } + + @Test(expected = Exception.class) + public void testGetResidentIndividualIdValidTokenVerifySignatureFalse() throws Exception { + ImmutablePair verifySignagure = new ImmutablePair<>(false, AuthErrorCode.UNAUTHORIZED); + //Mockito.when(tokenValidationHelper.verifyJWTSignagure(Mockito.any())).thenReturn(verifySignagure); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(token); + getAuthUserDetailsFromAuthentication(); + assertEquals("3956038419",identityService.getResidentIndvidualIdFromSession()); + } + + @Test + public void testGetResidentIndividualIdValidTokenSucess() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("individual_id", "3956038419"); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenReturn(tuple3.getT3()); + getAuthUserDetailsFromAuthentication(); + assertEquals("3956038419",identityService.getResidentIndvidualIdFromSession()); + } + + @Test + public void testGetResidentAuthenticationMode() throws Exception { + getAuthUserDetailsFromAuthentication(); + String authTypeCode = "OTP"; + when(utility.getAuthTypeCodefromkey(Mockito.any())).thenReturn(authTypeCode); + assertEquals(authTypeCode,ReflectionTestUtils.invokeMethod(identityService, + "getResidentAuthenticationMode")); + } + + @Test + public void testGetResidentAuthenticationModeAuthTypeCodeNull() throws Exception { + getAuthUserDetailsFromAuthentication(); + when(utility.getAuthTypeCodefromkey(Mockito.any())).thenReturn(null); + ReflectionTestUtils.invokeMethod(identityService, "getResidentAuthenticationMode"); + } + + @Test + public void testGetIndividualIdTypeVidPassed(){ + Mockito.when(requestValidator.validateUin(Mockito.anyString())).thenReturn(false); + Mockito.when(requestValidator.validateVid(Mockito.anyString())).thenReturn(true); + assertEquals(IdType.VID, identityService.getIndividualIdType("2476302389")); + } + + @Test + public void testGetClaimValueFromJwtTokenFailed(){ + String claim = null; + assertEquals("", ReflectionTestUtils.invokeMethod(identityService, "getClaimValueFromJwtToken", + token, claim)); + } + + @Test(expected = Exception.class) + public void testGetIndividualIdForAidFailed() throws Exception{ + String aid = "123456789"; + Mockito.when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.empty()); + ReflectionTestUtils.setField(identityService, "useVidOnly", true); + fileLoadMethod(); + String result = ReflectionTestUtils.invokeMethod(identityService, "getIndividualIdForAid", aid); + assertEquals("123456789", result); + } + + @Test + public void testGetMappingValueFetchFaceTrue() throws Exception { + when(env.getProperty("resident.additional.identity.attribute.to.fetch")).thenReturn("UIN,email,phone,dateOfBirth,photo,fullName"); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("picture", "3956038419"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + getAuthUserDetailsFromAuthentication(); + tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenReturn(tuple3.getT3()); + when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("4069341201794732")); + fileLoadMethod(); + IdentityDTO result = identityService.getIdentity("6", true, "eng"); + assertNotNull(result); + assertEquals("8251649601", result.getUIN()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIdentityWithApisResourceAccessException() throws Exception { + Tuple3, Map> tuple3 = loadUserInfoMethod(); +// tuple3.getT3().put("picture", "3956038419"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + getAuthUserDetailsFromAuthentication(); +// tuple3.getT3().put("photo", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("4069341201794732")); + fileLoadMethod(); + identityService.getIdentity("6", true, "eng"); + } + + @Test + public void testGetIdentityAttributes() throws Exception { + Authentication authentication= Mockito.mock(Authentication.class); + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + SecurityContextHolder.setContext(securityContext); + when(securityContext.getAuthentication()).thenReturn(authentication); + when(authentication.getPrincipal()).thenReturn(null); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("picture", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("1212121212")); + assertEquals("8251649601", + identityService.getIdentityAttributes("4578987854", "personalized-card", List.of("Name", "photo")).get("UIN")); + } + + @Test + public void testGetIdentityAttributesWithSecureSession() throws Exception { + when(residentConfigService.getUiSchemaFilteredInputAttributes(anyString())) + .thenReturn(List.of("UIN", "email", "phone", "dateOfBirth", "firstName", "middleName", "lastName", "perpetualVID", "photo", ResidentConstants.MASK_PREFIX+"UIN")); + getAuthUserDetailsFromAuthentication(); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("picture", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + Mockito.when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("1212121212")); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.convertToMaskData(Mockito.anyString())).thenReturn("81***23"); + assertEquals("8251649601", + identityService.getIdentityAttributes("4578987854", "personalized-card", List.of("Name")).get("UIN")); + } + + @Test(expected = ResidentServiceException.class) + public void testGetIdentityAttributesClaimError() throws Exception { + when(residentConfigService.getUiSchemaFilteredInputAttributes(anyString())) + .thenReturn(List.of("UIN", "email", "phone", "dateOfBirth", "firstName", "middleName", "lastName", "perpetualVID", "photo", ResidentConstants.MASK_PREFIX+"UIN")); + getAuthUserDetailsFromAuthentication(); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("picture", "NGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ"); + Mockito.when(residentVidService.getPerpatualVid(Mockito.anyString())).thenReturn(Optional.of("1212121212")); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.convertToMaskData(Mockito.anyString())).thenReturn("81***23"); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenThrow(ApisResourceAccessException.class); + identityService.getIdentityAttributes("4578987854", "personalized-card", List.of("Name")); + } + + @Test + public void testCreateSessionId(){ + Mockito.when(utility.createEventId()).thenReturn("123"); + assertEquals("123", identityService.createSessionId()); + } + + @Test + public void testGetResidentIdaTokenFromAccessToken() throws Exception { + when(env.getProperty(Mockito.anyString())).thenReturn("individual_id"); + ReflectionTestUtils.setField(identityService, "onlineVerificationPartnerId", "m-partner-default-auth"); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("individual_id", "4343434343"); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenReturn(tuple3.getT3()); + when(tokenIDGenerator.generateTokenID(anyString(), anyString())).thenReturn(token); + assertEquals(token, identityService.getResidentIdaTokenFromAccessToken(token)); + } + + @Test(expected = ResidentServiceException.class) + public void testGetResidentIdaTokenFromAccessTokenNullIndividualId() throws Exception { + when(env.getProperty(Mockito.anyString())).thenReturn("individual_id"); + ReflectionTestUtils.setField(identityService, "onlineVerificationPartnerId", "m-partner-default-auth"); + Tuple3, Map> tuple3 = loadUserInfoMethod(); + tuple3.getT3().put("individual_id", null); + when(restClientWithPlainRestTemplate.getApi(tuple3.getT1(), String.class, tuple3.getT2())) + .thenReturn(objectMapper.writeValueAsString(tuple3.getT3())); + Mockito.when(utility.getUserInfo(Mockito.anyString())).thenReturn(tuple3.getT3()); + when(tokenIDGenerator.generateTokenID(anyString(), anyString())).thenReturn(token); + identityService.getResidentIdaTokenFromAccessToken(token); + } + + @Test + public void testGetResidentIdaTokenNullToken() throws Exception { + Authentication authentication= Mockito.mock(Authentication.class); + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + SecurityContextHolder.setContext(securityContext); + when(securityContext.getAuthentication()).thenReturn(authentication); + when(authentication.getPrincipal()).thenReturn(null); + assertEquals(null, identityService.getResidentIdaToken()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/NotificationServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/NotificationServiceTest.java new file mode 100644 index 00000000000..0b5eae31c93 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/NotificationServiceTest.java @@ -0,0 +1,338 @@ +package io.mosip.resident.service.impl; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.NotificationTemplateCode; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.Assert.assertEquals; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class NotificationServiceTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private NotificationService notificationService; + + @Mock + private Utility utility; + + @Mock + private Utilities utilities; + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient restClient; + + @Mock + private TemplateManager templateManager; + + @Mock + private AuditUtil audit; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private IdentityService identityService; + private Map mailingAttributes; + private NotificationRequestDto reqDto; + private NotificationRequestDtoV2 notificationRequestDtoV2; + private ResponseWrapper notificationResponseWrapper; + + private static final String SMS_EMAIL_SUCCESS = "Notification has been sent to the provided contact detail(s)"; + private static final String SMS_SUCCESS = "Notification has been sent to the provided contact phone number"; + private static final String EMAIL_SUCCESS = "Notification has been sent to the provided email "; + + @Before + public void setUp() throws Exception { + Mockito.when(utility.getDataCapturedLanguages(Mockito.nullable(Map.class), Mockito.nullable(Map.class))) + .thenReturn(Set.of("eng", "ara")); + mailingAttributes = new HashMap(); + mailingAttributes.put("fullName_eng", "Test"); + mailingAttributes.put("fullName_ara", "Test"); + mailingAttributes.put("phoneNumber", "9876543210"); + mailingAttributes.put("email", "test@test.com"); + Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any(), Mockito.nullable(Map.class), + Mockito.nullable(Map.class))).thenReturn(mailingAttributes); + ReflectionTestUtils.setField(notificationService, "notificationType", "SMS|EMAIL"); + ReflectionTestUtils.setField(notificationService, "notificationEmails", "test@test.com|test1@test1.com"); + Mockito.when(utilities.getPhoneAttribute()).thenReturn("phoneNumber"); + Mockito.when(utilities.getEmailAttribute()).thenReturn("email"); + Mockito.when(env.getProperty(ApiName.EMAILNOTIFIER.name())).thenReturn("https://int.mosip.io/template/email"); + Mockito.when(requestValidator.emailValidator(Mockito.anyString())).thenReturn(true); + Mockito.when(requestValidator.phoneValidator(Mockito.anyString())).thenReturn(true); + Map additionalAttributes = new HashMap<>(); + additionalAttributes.put(IdType.RID.name(), "10008200070004420191203104356"); + Mockito.lenient().when(utility.getMappingJsonObject()).thenReturn(Mockito.mock(JSONObject.class)); + reqDto = new NotificationRequestDto(); + reqDto.setId("3527812406"); + reqDto.setTemplateTypeCode(NotificationTemplateCode.RS_UIN_RPR_SUCCESS); + reqDto.setAdditionalAttributes(additionalAttributes); + notificationRequestDtoV2 = new NotificationRequestDtoV2(); + notificationRequestDtoV2.setId("3527812406"); + notificationRequestDtoV2.setEventId("1122334455667788"); + notificationRequestDtoV2.setRequestType(RequestType.GENERATE_VID); + notificationRequestDtoV2.setTemplateType(TemplateType.SUCCESS); + Mockito.when(templateUtil.getSmsTemplateTypeCode(Mockito.any(), Mockito.any())) + .thenReturn("sms-template-type-code"); + Mockito.when(templateUtil.getEmailSubjectTemplateTypeCode(Mockito.any(), Mockito.any())) + .thenReturn("email-subject-template-type-code"); + Mockito.when(templateUtil.getEmailContentTemplateTypeCode(Mockito.any(), Mockito.any())) + .thenReturn("email-content-template-type-code"); + + Mockito.when(templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())). + thenReturn("Hi $name_eng,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is $RID.
    "); + + String primaryTemplatetext = "Hi Test,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is 10008200070004420191203104356.
    "; + InputStream primaryIs = new ByteArrayInputStream(primaryTemplatetext.getBytes(StandardCharsets.UTF_8)); + Mockito.when(templateManager.merge(Mockito.any(), Mockito.any())).thenReturn(primaryIs); + notificationResponseWrapper = new ResponseWrapper<>(); + NotificationResponseDTO notificationResp = new NotificationResponseDTO(); + notificationResp.setMessage("Notification has been sent to provided contact details"); + notificationResp.setStatus("success"); + notificationResponseWrapper.setResponse(notificationResp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenReturn(notificationResponseWrapper); + Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + } + + @Test + public void sendNotificationTest() throws ResidentServiceCheckedException { + Mockito.when(utility.getPreferredLanguage(Mockito.nullable(Map.class))).thenReturn(Set.of("eng")); + NotificationResponseDTO response = notificationService.sendNotification(reqDto, null); + assertEquals(SMS_EMAIL_SUCCESS, response.getMessage()); + } + + @Test + public void smsFailedAndEmailSuccessTestPhoneNull() throws ResidentServiceCheckedException { + mailingAttributes.put("phoneNumber", null); + NotificationResponseDTO response = notificationService.sendNotification(reqDto, null); + assertEquals(EMAIL_SUCCESS, response.getMessage()); + } + + @Test + public void smsFailedAndEmailSuccessTest() throws ResidentServiceCheckedException { + Mockito.when(requestValidator.phoneValidator(Mockito.anyString())).thenReturn(false); + NotificationResponseDTO response = notificationService.sendNotification(reqDto, null); + assertEquals(EMAIL_SUCCESS, response.getMessage()); + } + + @Test + public void emailFailedAndSMSSuccessTest() throws ResidentServiceCheckedException { + Mockito.when(requestValidator.emailValidator(Mockito.anyString())).thenReturn(false); + NotificationResponseDTO response = notificationService.sendNotification(reqDto, null); + assertEquals(SMS_SUCCESS, response.getMessage()); + } + + @Test + public void testEmailSuccessV2WithChannelsNull() throws ResidentServiceCheckedException { + ReflectionTestUtils.setField(notificationService, "notificationType", "EMAIL"); + NotificationResponseDTO response = notificationService.sendNotification(notificationRequestDtoV2, null, + "ka@gm.com", "8897878787", null); + assertEquals(EMAIL_SUCCESS, response.getMessage()); + } + + @Test + public void testSmsSuccessV2WithChannelsNull() throws ResidentServiceCheckedException { + ReflectionTestUtils.setField(notificationService, "notificationType", "SMS"); + NotificationResponseDTO response = notificationService.sendNotification(notificationRequestDtoV2, null, + "ka@gm.com", "8897878787", null); + assertEquals(SMS_SUCCESS, response.getMessage()); + } + + @Test + public void testNotificationFailure() throws Exception { + NotificationResponseDTO notificationResp = new NotificationResponseDTO(); + notificationResp.setMessage("Notification failure"); + notificationResp.setStatus("failed"); + notificationResponseWrapper.setResponse(notificationResp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenReturn(notificationResponseWrapper); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testTemplateMergeWithIOException() throws IOException, ResidentServiceCheckedException { + Mockito.when(templateManager.merge(Mockito.any(), Mockito.any())).thenThrow(new IOException()); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendSMSClientException() throws ApisResourceAccessException, ResidentServiceCheckedException { + HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendSMSServerException() throws ApisResourceAccessException, ResidentServiceCheckedException { + HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendSMSUnknownException() throws ApisResourceAccessException, ResidentServiceCheckedException { + RuntimeException runTimeExp = new RuntimeException(); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("runtime exp", runTimeExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testsendSMSNotificationWithIOException() + throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper notificationResponseWrapper = new ResponseWrapper<>(); + notificationResponseWrapper.setResponse("throw io exception"); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenReturn(notificationResponseWrapper); + notificationService.sendNotification(notificationRequestDtoV2, List.of("PHONE"), "ka@gm.com", "8897878787", + null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendEmailClientException() throws ApisResourceAccessException, ResidentServiceCheckedException { + ReflectionTestUtils.setField(notificationService, "notificationType", "EMAIL"); + HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendEmailServerException() throws ApisResourceAccessException, ResidentServiceCheckedException { + ReflectionTestUtils.setField(notificationService, "notificationType", "EMAIL"); + HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void sendEmailUnknownException() throws ApisResourceAccessException, ResidentServiceCheckedException { + ReflectionTestUtils.setField(notificationService, "notificationType", "EMAIL"); + RuntimeException runTimeExp = new RuntimeException(); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("runtime exp", runTimeExp); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenThrow(apiResourceAccessExp); + notificationService.sendNotification(reqDto, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testsendEmailNotificationWithIOException() + throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper notificationResponseWrapper = new ResponseWrapper<>(); + notificationResponseWrapper.setResponse("throw io exception"); + Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))) + .thenReturn(notificationResponseWrapper); + notificationService.sendNotification(notificationRequestDtoV2, List.of("EMAIL"), "ka@gm.com", "8897878787", + null); + } + + @Test + public void testSmsAndEmailSuccessV2() throws ResidentServiceCheckedException { + Mockito.when(utility.getDefaultTemplateLanguages()).thenReturn(List.of("eng")); + NotificationResponseDTO response = notificationService.sendNotification(notificationRequestDtoV2, + List.of("PHONE", "EMAIL"), "ka@gm.com", "8897878787", null); + assertEquals(SMS_EMAIL_SUCCESS, response.getMessage()); + } + + @Test + public void testSmsSuccessV2() throws ResidentServiceCheckedException { + notificationRequestDtoV2.setOtp("111111"); + NotificationResponseDTO response = notificationService.sendNotification(notificationRequestDtoV2, + List.of("PHONE"), null, null, null); + assertEquals(SMS_SUCCESS, response.getMessage()); + } + + @Test + public void testEmailSuccessV2() throws ResidentServiceCheckedException { + notificationRequestDtoV2.setOtp("111111"); + NotificationResponseDTO response = notificationService.sendNotification(notificationRequestDtoV2, + List.of("EMAIL"), "ka@gm.com", null, null); + assertEquals(EMAIL_SUCCESS, response.getMessage()); + } + + @Test(expected = ResidentServiceException.class) + public void testSmsErrorResponse() throws ResidentServiceCheckedException { + ServiceError error = new ServiceError("res-ser", "error response from API"); + notificationResponseWrapper.setErrors(List.of(error)); + notificationService.sendNotification(notificationRequestDtoV2, List.of("PHONE"), null, "8897878787", null); + } + + @Test(expected = ResidentServiceException.class) + public void testEmailErrorResponse() throws ResidentServiceCheckedException { + ServiceError error = new ServiceError("res-ser", "error response from API"); + notificationResponseWrapper.setErrors(List.of(error)); + notificationService.sendNotification(notificationRequestDtoV2, List.of("EMAIL"), "ka@gm.com", null, null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testSendNotificationWithReflectiveOperationException() + throws ResidentServiceCheckedException, ReflectiveOperationException { + Mockito.when(utility.getDataCapturedLanguages(Mockito.nullable(Map.class), Mockito.nullable(Map.class))) + .thenThrow(ReflectiveOperationException.class); + notificationService.sendNotification(reqDto, null); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OTPManagerServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OTPManagerServiceImplTest.java new file mode 100644 index 00000000000..35025bc2e06 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OTPManagerServiceImplTest.java @@ -0,0 +1,252 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.powermock.api.mockito.PowerMockito.when; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.ResidentUpdateResponseDTO; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.entity.OtpTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.OtpTransactionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuple3; +import reactor.util.function.Tuples; + +/** + * This class is used to test Otp Manger service impl class. + * @author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class OTPManagerServiceImplTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @InjectMocks + private OtpManagerServiceImpl otpManagerService; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + @Qualifier("selfTokenRestTemplate") + private RestTemplate restTemplate; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private MockMvc mockMvc; + + @Mock + private NotificationService notificationService; + + private NotificationResponseDTO notificationResponseDTO; + + private MainRequestDTO requestDTO; + + private OtpRequestDTOV2 otpRequestDTOV2; + + + @Mock + private OtpTransactionRepository otpTransactionRepository; + + private ResponseWrapper> response; + + @Mock + private Environment environment; + + private ResponseEntity response1; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private ResidentService residentService; + + @Mock + private Utilities utilities; + private IdentityDTO identityDTO; + + @Before + public void setup() throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(otpManagerService).build(); + response = new ResponseWrapper<>(); + Map responseMap = new HashMap<>(); + responseMap.put("otp", "111111"); + responseMap.put("status", "PASSED"); + response.setResponse(responseMap); + otpRequestDTOV2 = new OtpRequestDTOV2(); + requestDTO = new MainRequestDTO<>(); + otpRequestDTOV2.setTransactionId("1234567891"); + otpRequestDTOV2.setUserId("kamesh@gmail.com"); + requestDTO.setRequest(otpRequestDTOV2); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("2123456"); + when(otpTransactionRepository.checkotpsent(any(), any(), any(), any())).thenReturn(0); + ResponseWrapper> responseMap1=new ResponseWrapper<>(); + responseMap1.setResponse(responseMap); + response1 = new ResponseEntity<>(responseMap1, HttpStatus.ACCEPTED); + Mockito.when(environment.getProperty(Mockito.any())).thenReturn("https://dev.mosip.net/v1/otpmanager/otp/generate"); + Mockito.when(restTemplate.exchange(ArgumentMatchers.anyString(), + ArgumentMatchers.any(HttpMethod.class), + ArgumentMatchers.any(), + Mockito.eq(ResponseWrapper.class))) + .thenReturn(response1); + Mockito.when(environment.getProperty(any())).thenReturn("http://localhost:8099"); + Mockito.when(environment.getProperty("otp.request.flooding.duration", Long.class)).thenReturn(45L); + Mockito.when(environment.getProperty("mosip.kernel.otp.expiry-time", Long.class)).thenReturn(45L); + Mockito.when(environment.getProperty("otp.request.flooding.max-count", Integer.class)).thenReturn(8); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("UIN", "1234567898"); + String schemaJson = "schema"; + Tuple3 idRepoJsonSchemaJsonAndIdResponseDtoTuple = Tuples.of(jsonObject, schemaJson, new IdResponseDTO1()); + Mockito.when(utilities. + getIdentityDataFromIndividualID(Mockito.anyString())).thenReturn(idRepoJsonSchemaJsonAndIdResponseDtoTuple); + + } + + @Test + public void testSendOtpSuccess() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + assertTrue(otpManagerService.sendOtp(requestDTO, "EMAIL", "eng", identityDTO)); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testSendOtpAlreadyOtpSendError() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + when(otpTransactionRepository.checkotpsent(any(), any(), any(), any())).thenReturn(9); + assertTrue(otpManagerService.sendOtp(requestDTO, "EMAIL", "eng", identityDTO)); + } + + @Test + public void testSendOtpOtpSendWithinLessTime() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + OtpTransactionEntity otpTransactionEntity = new OtpTransactionEntity(); + assertTrue(otpManagerService.sendOtp(requestDTO, "EMAIL", "eng", identityDTO)); + } + + @Test + public void testSendOtpPhoneSuccess() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + assertTrue(otpManagerService.sendOtp(requestDTO, "PHONE", "eng", identityDTO)); + } + + @Test + public void testValidateOtpSuccess() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(otpTransactionRepository.existsByOtpHashAndStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(true); + OtpTransactionEntity otpTransactionEntity = new OtpTransactionEntity(); + otpTransactionEntity.setExpiryDtimes(DateUtils.getUTCCurrentDateTime().plusSeconds(120)); + when(otpTransactionRepository.findTopByOtpHashAndStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(otpTransactionEntity); + assertTrue(otpManagerService.validateOtp("111111", "kamesh@gmail.com", "1234565656")); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailure() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(otpTransactionRepository.existsByOtpHashAndStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(true); + OtpTransactionEntity otpTransactionEntity = new OtpTransactionEntity(); + otpTransactionEntity.setExpiryDtimes(DateUtils.getUTCCurrentDateTime()); + when(otpTransactionRepository.findTopByOtpHashAndStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(otpTransactionEntity); + assertTrue(otpManagerService.validateOtp("111111", "kamesh@gmail.com", "1234565656")); + } + + @Test(expected = ResidentServiceException.class) + public void testSendOtpPhoneBlockedOtp() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Map responseMap = new HashMap<>(); + responseMap.put("otp", "111111"); + responseMap.put("status", "USER_BLOCKED"); + response.setResponse(responseMap); + ResponseWrapper> responseMap1=new ResponseWrapper<>(); + responseMap1.setResponse(responseMap); + response1 = new ResponseEntity<>(responseMap1, HttpStatus.ACCEPTED); + Mockito.when(restTemplate.exchange(ArgumentMatchers.anyString(), + ArgumentMatchers.any(HttpMethod.class), + ArgumentMatchers.any(), + Mockito.eq(ResponseWrapper.class))) + .thenReturn(response1); + assertTrue(otpManagerService.sendOtp(requestDTO, "PHONE", "eng", identityDTO)); + } + + @Test(expected = ResidentServiceException.class) + public void testSendOtpPhoneServerError() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(restTemplate.exchange(ArgumentMatchers.anyString(), + ArgumentMatchers.any(HttpMethod.class), + ArgumentMatchers.any(), + Mockito.eq(ResponseWrapper.class))) + .thenThrow(new RestClientException("error")); + assertTrue(otpManagerService.sendOtp(requestDTO, "PHONE", "eng", identityDTO)); + } + + @Test + public void testValidateOtpOtpHashExists() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(otpTransactionRepository.existsByOtpHashAndStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(false); + assertFalse(otpManagerService.validateOtp("111111", "kamesh@gmail.com", "1234565656")); + } + + @Test + public void testUpdateUserIdWithEmail() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.1"); + when(requestValidator.validateUserIdAndTransactionId(Mockito.anyString(), Mockito.anyString())).thenReturn(List.of("EMAIL")); + Mockito.when(residentService.reqUinUpdate(Mockito.any(), Mockito.any(), Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(Tuples.of(new ResidentUpdateResponseDTO(), "passed")); + assertEquals("passed",otpManagerService.updateUserId("kam@g.com", "1232323232").getT2()); + } + + @Test + public void testUpdateUserIdWithPhone() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.1"); + when(requestValidator.validateUserIdAndTransactionId(Mockito.anyString(), Mockito.anyString())).thenReturn(List.of("PHONE")); + Mockito.when(residentService.reqUinUpdate(Mockito.any(), Mockito.any(), Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(Tuples.of(new ResidentUpdateResponseDTO(), "passed")); + assertEquals("passed",otpManagerService.updateUserId("kam@g.com", "1232323232").getT2()); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OrderCardServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OrderCardServiceTest.java new file mode 100644 index 00000000000..2918d49425a --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/OrderCardServiceTest.java @@ -0,0 +1,169 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.UrlRedirectRequestDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.OrderCardService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + +/** + * Resident order card service test class. + * + * @author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class OrderCardServiceTest { + + @InjectMocks + private OrderCardService orderCardService = new OrderCardServiceImpl(); + + @Mock + private Utility utility; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private ResidentServiceRestClient restClientWithSelfTOkenRestTemplate; + + @Mock + private ResidentCredentialService residentCredentialService; + + @Mock + private NotificationService notificationService; + + @Mock + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Mock + Environment env; + + private ResponseWrapper responseWrapper; + + private ResidentCredentialResponseDto residentCredentialResponseDto; + + private ResidentCredentialRequestDto residentCredentialRequestDto; + + private NotificationResponseDTO notificationResponseDTO; + + private Map partnerDetail = new HashMap<>(); + + private UrlRedirectRequestDTO urlRedirectRequestDTO; + + + @Before + public void setUp() throws Exception { + ReflectionTestUtils.setField(orderCardService, "isPaymentEnabled", true); + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + urlRedirectRequestDTO = new UrlRedirectRequestDTO(); + urlRedirectRequestDTO.setTrackingId("tracking123456"); + responseWrapper.setResponse(urlRedirectRequestDTO); + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("5092d4bf-8f77-4608-a167-76371cc38b5d"); + when(utility.createEntity(Mockito.any())).thenReturn(residentTransactionEntity); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setStatus("Notification success"); + when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + + residentCredentialRequestDto = new ResidentCredentialRequestDto(); + residentCredentialRequestDto.setTransactionID("1234327890"); + residentCredentialRequestDto.setConsent("Accepted"); + residentCredentialRequestDto.setSharableAttributes(List.of("firstName")); + residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setId("8251649601"); + residentCredentialResponseDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + when(env.getProperty(anyString(), anyString())).thenReturn("property"); + } + + @Test + public void testSendPhysicalCard() throws Exception { + ReflectionTestUtils.setField(orderCardService, "isPaymentEnabled", false); + when(residentCredentialService.reqCredential(any(), any())).thenReturn(residentCredentialResponseDto); + ResidentCredentialResponseDto result = orderCardService.sendPhysicalCard(residentCredentialRequestDto); + assertEquals("effc56cd-cf3b-4042-ad48-7277cf90f763", result.getRequestId()); + } + + @Test + public void testSendPhysicalCardIf() throws Exception { + when(restClientWithSelfTOkenRestTemplate.getApi((ApiName) any(), (List) any(), (List) any(), + any(), any())).thenReturn(responseWrapper); + when(residentCredentialService.reqCredential(any(), any())).thenReturn(residentCredentialResponseDto); + + ResidentCredentialResponseDto result = orderCardService.sendPhysicalCard(residentCredentialRequestDto); + assertEquals("effc56cd-cf3b-4042-ad48-7277cf90f763", result.getRequestId()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testCheckOrderStatusWithApisResourceAccessException() throws Exception { + when(restClientWithSelfTOkenRestTemplate.getApi((ApiName) any(), (List) any(), (List) any(), + any(), any())).thenThrow(new ApisResourceAccessException()); + orderCardService.sendPhysicalCard(residentCredentialRequestDto); + } + + @Test + public void testGetRedirectUrl() throws Exception { + Map detail = new HashMap<>(); + detail.put("orderRedirectUrl", "http://resident-partner-details.com"); + partnerDetail.put("additionalInfo", List.of(detail)); + when(proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType(anyString(), anyString())).thenReturn(partnerDetail); + String result = orderCardService.getRedirectUrl("12345","URI"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRedirectUrlNull() throws Exception { + Map detail = new HashMap<>(); + detail.put("orderRedirectUrl", ""); + partnerDetail.put("additionalInfo", List.of(detail)); + when(proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType(anyString(), anyString())).thenReturn(partnerDetail); + orderCardService.getRedirectUrl("12345","URI"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRedirectUrlEmpty() throws Exception { + when(proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType(anyString(), anyString())).thenReturn(partnerDetail); + orderCardService.getRedirectUrl("12345","URI"); + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PartnerServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PartnerServiceImplTest.java new file mode 100644 index 00000000000..34001f7ba62 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PartnerServiceImplTest.java @@ -0,0 +1,110 @@ +package io.mosip.resident.service.impl; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.websub.spi.PublisherClient; +import io.mosip.kernel.core.websub.spi.SubscriptionClient; +import io.mosip.kernel.websub.api.model.SubscriptionChangeRequest; +import io.mosip.kernel.websub.api.model.SubscriptionChangeResponse; +import io.mosip.kernel.websub.api.model.UnsubscriptionRequest; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.util.ResidentServiceRestClient; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.test.context.ContextConfiguration; + +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class PartnerServiceImplTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @InjectMocks + private PartnerServiceImpl partnerService; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private PublisherClient publisher; + + @Mock + SubscriptionClient subscribe; + + @Mock + private ProxyPartnerManagementServiceImpl proxyPartnerManagementService; + + private ResponseWrapper responseWrapper; + + @Before + public void setup() { + responseWrapper = new ResponseWrapper>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + Map partners = new HashMap<>(); + ArrayList partnerList = new ArrayList<>(); + Map individualPartner = new HashMap<>(); + individualPartner.put("partnerID", "1"); + partnerList.add(individualPartner); + partners.put("partners", partnerList); + responseWrapper.setResponse(partners); + } + + @Test + public void testPartnerService() + throws ResidentServiceCheckedException { + when(proxyPartnerManagementService.getPartnersByPartnerType(any())).thenReturn(responseWrapper); + ArrayList partnerIds = partnerService.getPartnerDetails("Online_Verification_Partner"); + assertEquals(1, partnerIds.size()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testPartnerServiceCatchBlock() + throws ResidentServiceCheckedException { + when(proxyPartnerManagementService.getPartnersByPartnerType(any())).thenThrow(new ResidentServiceCheckedException()); + partnerService.getPartnerDetails("Online_Verification_Partner"); + } + + @Test + public void testPartnerServiceResponseNull() + throws ResidentServiceCheckedException { + when(proxyPartnerManagementService.getPartnersByPartnerType(any())).thenReturn(null); + ArrayList partnerIds = partnerService.getPartnerDetails("Online_Verification_Partner"); + assertEquals(0, partnerIds.size()); + } + + @Test + public void testPartnerIdNull() + throws ResidentServiceCheckedException, ApisResourceAccessException, URISyntaxException { + ArrayList partnerIds = partnerService.getPartnerDetails(null); + assertEquals(0, partnerIds.size()); + } + + @Test + public void testPartnerServiceUrlNull() + throws ResidentServiceCheckedException, ApisResourceAccessException, URISyntaxException { + ArrayList partnerIds = partnerService.getPartnerDetails("Online_Verification_Partner"); + assertEquals(0, partnerIds.size()); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PinUnpinStatusServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PinUnpinStatusServiceTest.java new file mode 100644 index 00000000000..d15fbf0e817 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/PinUnpinStatusServiceTest.java @@ -0,0 +1,70 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.PinUnpinStatusService; + +/** + * This class is used to test service class of pin or unpin status api based on event id. + * @Author Kamesh Shekhar Prasad + */ + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class PinUnpinStatusServiceTest { + + @InjectMocks + PinUnpinStatusService pinUnpinStatusService = new PinUnpinStatusServiceImpl(); + + @Mock + ResidentTransactionRepository residentTransactionRepository; + + @Before + public void setup(){ + Mockito.when(residentTransactionRepository.existsById(Mockito.anyString())).thenReturn(true); + } + + @Test + public void pinStatusSuccessTest() throws ResidentServiceCheckedException{ + ResponseWrapper responseDTO = pinUnpinStatusService.pinStatus("eventId", true); + assertEquals(responseDTO.getResponse().getStatus(), HttpStatus.OK.toString()); + } + + @Test + public void pinStatusFailureTest() throws ResidentServiceCheckedException{ + Mockito.when(residentTransactionRepository.existsById(Mockito.anyString())).thenReturn(false); + ResponseWrapper responseDTO = pinUnpinStatusService.pinStatus("eventId", true); + assertEquals(responseDTO.getErrors().get(0).getErrorCode(), ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorCode()); + } + + @Test + public void unPinStatusSuccessTest() throws ResidentServiceCheckedException{ + ResponseWrapper responseDTO = pinUnpinStatusService.pinStatus("eventId", false); + assertEquals(responseDTO.getResponse().getStatus(), HttpStatus.OK.toString()); + } + + @Test + public void unPinStatusFailureTest() throws ResidentServiceCheckedException{ + Mockito.when(residentTransactionRepository.existsById(Mockito.anyString())).thenReturn(false); + ResponseWrapper responseDTO = pinUnpinStatusService.pinStatus("eventId", false); + assertEquals(responseDTO.getErrors().get(0).getErrorCode(), ResidentErrorCode.EVENT_STATUS_NOT_FOUND.getErrorCode()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyIdRepoServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyIdRepoServiceTest.java new file mode 100644 index 00000000000..ff5c28ea60a --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyIdRepoServiceTest.java @@ -0,0 +1,278 @@ +package io.mosip.resident.service.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.DraftResponseDto; +import io.mosip.resident.dto.DraftUinResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.context.WebApplicationContext; +import reactor.util.function.Tuples; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ContextConfiguration(classes = { TestContext.class, WebApplicationContext.class }) +@RunWith(SpringRunner.class) +@WebMvcTest +@ActiveProfiles("test") +public class ProxyIdRepoServiceTest { + + @InjectMocks + private ProxyIdRepoServiceImpl service; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private RequestValidator requestValidator; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private Environment environment; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private Utility utility; + + @Mock + private ResidentServiceImpl residentService; + + @SuppressWarnings("unchecked") + @Test + public void testGetRemainingUpdateCountByIndividualId() + throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + ResponseWrapper response1 = service.getRemainingUpdateCountByIndividualId(List.of("name", "gender")); + assertNotNull(response1); + responseWrapper.setErrors(null); + ResponseWrapper response2 = service.getRemainingUpdateCountByIndividualId(List.of("name", "gender")); + assertNotNull(response2); + } + + @SuppressWarnings("unchecked") + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRemainingUpdateCountByIndividualIdException() + throws ResidentServiceCheckedException, ApisResourceAccessException { + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + service.getRemainingUpdateCountByIndividualId(List.of()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRemainingUpdateCountByIndividualIdIfIf() + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ServiceError error = new ServiceError(); + error.setErrorCode("IDR-IDC-007"); + error.setMessage(ResidentErrorCode.NO_RECORDS_FOUND.getErrorMessage()); + responseWrapper.setErrors(List.of(error)); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + service.getRemainingUpdateCountByIndividualId(null); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRemainingUpdateCountByIndividualIdIfElse() + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ServiceError error = new ServiceError(); + error.setErrorCode(ResidentErrorCode.NO_RECORDS_FOUND.getErrorMessage()); + error.setMessage(ResidentErrorCode.NO_RECORDS_FOUND.getErrorMessage()); + responseWrapper.setErrors(List.of(error)); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + service.getRemainingUpdateCountByIndividualId(List.of("fullName")); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRemainingUpdateCountByIndividualIdErrorCodeEmpty() + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ServiceError error = new ServiceError(); + error.setErrorCode(""); + responseWrapper.setErrors(List.of(error)); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + service.getRemainingUpdateCountByIndividualId(List.of("fullName")); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRemainingUpdateCountByIndividualIdErrorCodeNull() + throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + ServiceError error = new ServiceError(); + error.setErrorCode(null); + responseWrapper.setErrors(List.of(error)); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + when(residentServiceRestClient.getApi(any(), (Map) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + service.getRemainingUpdateCountByIndividualId(List.of("fullName")); + } + + @Test + public void testGetPendingDraftsSuccess() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + DraftResponseDto draftResponseDto = new DraftResponseDto(); + responseWrapper.setResponse(draftResponseDto); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(identityServiceImpl.getUinForIndividualId(Mockito.anyString())).thenReturn("123"); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenReturn(responseWrapper); + when(objectMapper.convertValue((Object) any(), (Class) any())).thenReturn(draftResponseDto); + assertNotNull(service.getPendingDrafts("eng")); + } + + @Test(expected = InvalidInputException.class) + public void testGetPendingDraftsFailure() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + DraftResponseDto draftResponseDto = new DraftResponseDto(); + responseWrapper.setErrors(List.of(new ServiceError("IDR-IDC-002", "No Record found"))); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(requestValidator.validateUin(Mockito.anyString())).thenReturn(true); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenReturn(responseWrapper); + when(objectMapper.convertValue((Object) any(), (Class) any())).thenReturn(draftResponseDto); + service.getPendingDrafts("eng"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPendingDraftsFailureUnknownException() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + DraftResponseDto draftResponseDto = new DraftResponseDto(); + responseWrapper.setErrors(List.of(new ServiceError("IDR-IDC-003", "No Record found"))); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(requestValidator.validateUin(Mockito.anyString())).thenReturn(true); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenReturn(responseWrapper); + when(objectMapper.convertValue((Object) any(), (Class) any())).thenReturn(draftResponseDto); + service.getPendingDrafts("eng"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPendingDraftsFailureApiResourceException() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(requestValidator.validateUin(Mockito.anyString())).thenReturn(true); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenThrow(new ApisResourceAccessException()); + service.getPendingDrafts("eng"); + } + + @Test + public void testGetPendingDraftsSuccessWithPendingDraft() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + DraftResponseDto draftResponseDto = new DraftResponseDto(); + DraftUinResponseDto draftUinResponseDto = new DraftUinResponseDto(); + draftUinResponseDto.setAttributes(List.of("PHONE")); + draftUinResponseDto.setRid("123"); + draftUinResponseDto.setCreatedDTimes(LocalDateTime.now().toString()); + draftResponseDto.setDrafts(List.of(draftUinResponseDto)); + responseWrapper.setResponse(draftResponseDto); + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + residentTransactionEntity.setEventId("123"); + + ResidentTransactionEntity residentTransactionEntity1 = new ResidentTransactionEntity(); + residentTransactionEntity1.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity1.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + residentTransactionEntity1.setEventId("1234"); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(identityServiceImpl.getUinForIndividualId(Mockito.anyString())).thenReturn("123"); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenReturn(responseWrapper); + when(objectMapper.convertValue((Object) any(), (Class) any())).thenReturn(draftResponseDto); + when(residentTransactionRepository.findTopByAidOrderByCrDtimesDesc(Mockito.anyString())).thenReturn(residentTransactionEntity); + when(residentTransactionRepository.findByTokenIdAndRequestTypeCodeAndStatusCode(Mockito.anyString() + , Mockito.anyString(), Mockito.anyString())).thenReturn(List.of(residentTransactionEntity, residentTransactionEntity1)); + when(utility.createEntity(any())).thenReturn(residentTransactionEntity); + when(identityServiceImpl.getResidentIdaToken()).thenReturn("123"); + when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatusInProgress.NEW.name(), + "eng")); + assertEquals("123", service.getPendingDrafts("eng").getResponse().getDrafts().get(0).getEid()); + } + + @Test + public void testGetPendingDraftsSuccessWithPendingDraftEmptyValue() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + DraftResponseDto draftResponseDto = new DraftResponseDto(); + DraftUinResponseDto draftUinResponseDto = new DraftUinResponseDto(); + draftUinResponseDto.setAttributes(List.of("PHONE")); + draftUinResponseDto.setRid("123"); + draftUinResponseDto.setCreatedDTimes(LocalDateTime.now().toString()); + draftResponseDto.setDrafts(List.of(draftUinResponseDto)); + responseWrapper.setResponse(draftResponseDto); + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + residentTransactionEntity.setEventId("123"); + + ResidentTransactionEntity residentTransactionEntity1 = new ResidentTransactionEntity(); + residentTransactionEntity1.setStatusCode(EventStatusInProgress.NEW.name()); + residentTransactionEntity1.setRequestTypeCode(RequestType.UPDATE_MY_UIN.name()); + residentTransactionEntity1.setEventId("1234"); + + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123"); + when(identityServiceImpl.getUinForIndividualId(Mockito.anyString())).thenReturn("123"); + when(environment.getProperty(Mockito.anyString())).thenReturn("id"); + when(residentServiceRestClient.getApi(any(), (Map) any(), any())).thenReturn(responseWrapper); + when(objectMapper.convertValue((Object) any(), (Class) any())).thenReturn(draftResponseDto); + when(residentTransactionRepository.findTopByAidOrderByCrDtimesDesc(Mockito.anyString())).thenReturn(null); + when(residentTransactionRepository.findByTokenIdAndRequestTypeCodeAndStatusCode(Mockito.anyString() + , Mockito.anyString(), Mockito.anyString())).thenReturn(List.of(residentTransactionEntity, residentTransactionEntity1)); + when(utility.createEntity(any())).thenReturn(residentTransactionEntity); + when(identityServiceImpl.getResidentIdaToken()).thenReturn("123"); + when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatusInProgress.NEW.name(), + "eng")); + assertEquals(1, service.getPendingDrafts("eng").getResponse().getDrafts().size()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyMasterDataServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyMasterDataServiceTest.java new file mode 100644 index 00000000000..798e4d34a57 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyMasterDataServiceTest.java @@ -0,0 +1,782 @@ +package io.mosip.resident.service.impl; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.OrderEnum; +import io.mosip.resident.dto.TemplateDto; +import io.mosip.resident.dto.TemplateResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import reactor.util.function.Tuple2; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Resident proxy masterdata service test class. + * + * @author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ProxyMasterDataServiceTest { + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @InjectMocks + private ProxyMasterdataService proxyMasterdataService = new ProxyMasterdataServiceImpl(); + + private ResponseWrapper responseWrapper; + + private ResponseWrapper templateWrapper; + + private String fieldName; + private boolean withValue; + + @Mock + private Utility utility; + + @Mock + private Utilities utilities; + + @Before + public void setup() { + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + templateWrapper = new ResponseWrapper<>(); + TemplateResponseDto templateResp = new TemplateResponseDto(); + TemplateDto templateDto = new TemplateDto(); + templateDto.setDescription("re print uin"); + templateDto.setFileText( + "Hi $name_eng,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is $RID."); + List templateList = new ArrayList<>(); + templateList.add(templateDto); + templateResp.setTemplates(templateList); + templateWrapper.setResponse(templateResp); + fieldName = "gender"; + withValue = true; + } + + @Test + public void testGetValidDocumentByLangCode() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getValidDocumentByLangCode("eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetValidDocumentByLangCodeIf() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + + proxyMasterdataService.getValidDocumentByLangCode("eng"); + } + + @Test + public void testGetValidDocumentByLangCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + + responseWrapper.setErrors(null); + + ResponseWrapper result = proxyMasterdataService.getValidDocumentByLangCode("eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetValidDocumentByLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) (ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getValidDocumentByLangCode("eng"); + } + + @Test + public void testGetValidDocCatAndTypeList() throws ApisResourceAccessException, ResidentServiceCheckedException { + List> docCatList = new ArrayList<>(); + docCatList.add(Map.of("code", "poi", "documenttypes", List.of(Map.of("code", "cob")))); + docCatList.add(Map.of("code", "poa", "documenttypes", List.of(Map.of("code", "coa")))); + responseWrapper.setResponse(Map.of("documentcategories", docCatList)); + when(utility.getValidDocumentByLangCode(any())).thenReturn(responseWrapper); + Tuple2, Map>> result = proxyMasterdataService + .getValidDocCatAndTypeList("eng"); + assertEquals("poi", result.getT1().get(0)); + assertEquals("coa", result.getT2().get("poa").get(0)); + } + + @Test + public void testGetLocationHierarchyLevelByLangCode() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) (ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getLocationHierarchyLevelByLangCode("eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationHierarchyLevelByLangCodeIf() + throws ResidentServiceCheckedException, ApisResourceAccessException { + when(residentServiceRestClient.getApi((ApiName) (ApiName) any(), any(), any())).thenReturn(responseWrapper); + + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + + proxyMasterdataService.getLocationHierarchyLevelByLangCode("eng"); + } + + @Test + public void testGetLocationHierarchyLevelByLangCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) (ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getLocationHierarchyLevelByLangCode("eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationHierarchyLevelByLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getLocationHierarchyLevelByLangCode("eng"); + } + + @Test + public void testGetImmediateChildrenByLocCodeAndLangCode() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode("MOR", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetImmediateChildrenByLocCodeAndLangCodeIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + + proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode("MOR", "eng"); + } + + @Test + public void testGetImmediateChildrenByLocCodeAndLangCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode("MOR", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetImmediateChildrenByLocCodeAndLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getImmediateChildrenByLocCodeAndLangCode("MOR", "eng"); + } + + @Test + public void testGetLocationDetailsByLocCodeAndLangCode() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode("MOR", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationDetailsByLocCodeAndLangCodeIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode("MOR", "eng"); + } + + @Test + public void testGetLocationDetailsByLocCodeAndLangCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode("MOR", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationDetailsByLocCodeAndLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getLocationDetailsByLocCodeAndLangCode("MOR", "eng"); + } + + @Test + public void testGetCoordinateSpecificRegistrationCenters() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getCoordinateSpecificRegistrationCenters("eng", -6.516428, + 34.287879, 2000); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetCoordinateSpecificRegistrationCentersIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getCoordinateSpecificRegistrationCenters("eng", -6.516428, 34.287879, 2000); + } + + @Test + public void testGetCoordinateSpecificRegistrationCentersElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getCoordinateSpecificRegistrationCenters("eng", -6.516428, + 34.287879, 2000); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetCoordinateSpecificRegistrationCentersWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getCoordinateSpecificRegistrationCenters("eng", -6.516428, 34.287879, 2000); + } + + @Test + public void testGetApplicantValidDocument() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getApplicantValidDocument("002", List.of("eng", "ara")); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetApplicantValidDocumentIf() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getApplicantValidDocument("002", List.of("eng", "ara")); + } + + @Test + public void testGetApplicantValidDocumentElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getApplicantValidDocument("002", List.of("eng", "ara")); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetApplicantValidDocumentWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getApplicantValidDocument("002", List.of("eng", "ara")); + } + + @Test + public void testGetRegistrationCentersByHierarchyLevel() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getRegistrationCentersByHierarchyLevel("eng", (short) 5, + List.of("14110", "14080")); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCentersByHierarchyLevelIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getRegistrationCentersByHierarchyLevel("eng", (short) 5, List.of("14110", "14080")); + } + + @Test + public void testGetRegistrationCentersByHierarchyLevelElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getRegistrationCentersByHierarchyLevel("eng", (short) 5, + List.of("14110", "14080")); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCentersByHierarchyLevelWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getRegistrationCentersByHierarchyLevel("eng", (short) 5, List.of("14110", "14080")); + } + + @Test + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginated() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated("eng", + (short) 5, "14110", 0, 10, OrderEnum.desc, "createdDateTime"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginatedIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated("eng", (short) 5, "14110", 0, 10, + OrderEnum.desc, "createdDateTime"); + } + + @Test + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginatedElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated("eng", + (short) 5, "14110", 0, 10, OrderEnum.desc, "createdDateTime"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCenterByHierarchyLevelAndTextPaginatedWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), (List) any(), any(), + any())).thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getRegistrationCenterByHierarchyLevelAndTextPaginated("eng", (short) 5, "14110", 0, 10, + OrderEnum.desc, "createdDateTime"); + } + + @Test + public void testGetRegistrationCenterWorkingDays() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getRegistrationCenterWorkingDays("10002", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCenterWorkingDaysIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getRegistrationCenterWorkingDays("10002", "eng"); + } + + @Test + public void testGetRegistrationCenterWorkingDaysElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getRegistrationCenterWorkingDays("10002", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRegistrationCenterWorkingDaysWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getRegistrationCenterWorkingDays("10002", "eng"); + } + + @Test + public void testGetLatestIdSchema() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getLatestIdSchema(0, "domain", "type"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLatestIdSchemaIf() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getLatestIdSchema(0, "domain", "type"); + } + + @Test + public void testGetLatestIdSchemaElse() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), + any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getLatestIdSchema(0, "domain", "type"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLatestIdSchemaWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), + any())).thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getLatestIdSchema(0, "domain", "type"); + } + + @Test + public void testGetTemplateValueFromTemplateTypeCodeAndLangCode() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(templateWrapper); + String result = proxyMasterdataService.getTemplateValueFromTemplateTypeCodeAndLangCode("eng", + "otp-template"); + assertNotNull(result); + assertEquals("Hi $name_eng,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is $RID.", result); + } + + @Test(expected = ResidentServiceException.class) + public void testGetAllTemplateBylangCodeAndTemplateTypeCodeIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(templateWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + templateWrapper.setErrors(errorList); + proxyMasterdataService.getTemplateValueFromTemplateTypeCodeAndLangCode("eng", "otp-template"); + } + + @Test + public void testGetAllTemplateBylangCodeAndTemplateTypeCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(templateWrapper); + templateWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode("eng", + "otp-template"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAllTemplateBylangCodeAndTemplateTypeCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode("eng", "otp-template"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAllTemplateBylangCodeAndTemplateTypeCodeWithIOException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper templateWrapper = new ResponseWrapper<>(); + templateWrapper.setResponse("throw io exception"); + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(templateWrapper); + proxyMasterdataService.getAllTemplateBylangCodeAndTemplateTypeCode("eng", "otp-template"); + } + + @Test + public void testGetGenderTypesByLangCode() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any(), any(), any())) + .thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, "eng", + withValue); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetGenderTypesByLangCodeIf() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any(), any(), any())) + .thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, "xyz", withValue); + } + + @Test + public void testGetGenderTypesByLangCodeElse() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any(), any(), any())) + .thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, "eng", + withValue); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetGenderTypesByLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName(fieldName, "eng", withValue); + } + + @Test + public void testGetDocumentTypesByDocumentCategoryAndLangCode() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ResponseWrapper result = proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode("DOC", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetDocumentTypesByDocumentCategoryAndLangCodeIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + + responseWrapper.setErrors(errorList); + proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode("DOC", "xyz"); + } + + @Test + public void testGetDocumentTypesByDocumentCategoryAndLangCodeElse() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + responseWrapper.setErrors(null); + ResponseWrapper result = proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode("DOC", "eng"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetDocumentTypesByDocumentCategoryAndLangCodeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getDocumentTypesByDocumentCategoryAndLangCode("DOC", "eng"); + } + + @Test(expected = InvalidInputException.class) + public void testGetGenderCodeByGenderTypeAndLangCode() + throws ResidentServiceCheckedException, IOException { + Map response = new HashMap<>(); + ArrayList mapArrayList = new ArrayList<>(); + Map value = new HashMap<>(); + value.put("code", "FLE"); + value.put("value", "female"); + mapArrayList.add(value); + response.put("values", mapArrayList); + ResponseWrapper res = new ResponseWrapper(); + res.setResponse(response); + when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName(Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn(res); + proxyMasterdataService.getGenderCodeByGenderTypeAndLangCode("123", "eng"); + } + + @Test + public void testGetGenderCodeByGenderTypeAndLangCodeWithValue() + throws ResidentServiceCheckedException, IOException { + Map response = new HashMap<>(); + ArrayList mapArrayList = new ArrayList<>(); + Map value = new HashMap<>(); + value.put("code", "FLE"); + value.put("value", "female"); + mapArrayList.add(value); + response.put("values", mapArrayList); + ResponseWrapper res = new ResponseWrapper(); + res.setResponse(response); + when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName(Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean())).thenReturn(res); + assertEquals("FLE", proxyMasterdataService + .getGenderCodeByGenderTypeAndLangCode("female", "eng").getResponse().getGenderCode()); + } + + @Test + public void testGetLocationHierarchyLevels() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(new ArrayList<>()); + responseWrapper.setId("https://example.org/example"); + responseWrapper.setMetadata("Metadata"); + responseWrapper.setResponse("Response"); + responseWrapper.setResponsetime(LocalDateTime.of(1, 1, 1, 1, 1)); + responseWrapper.setVersion("https://example.org/example"); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenReturn(responseWrapper); + assertSame(responseWrapper, proxyMasterdataService.getLocationHierarchyLevels("2020-03-01")); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationHierarchyLevels4() throws ApisResourceAccessException, ResidentServiceCheckedException { + ArrayList serviceErrorList = new ArrayList<>(); + serviceErrorList.add(new ServiceError("An error occurred", "An error occurred")); + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(responseWrapper.getErrors()).thenReturn(serviceErrorList); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenReturn(responseWrapper); + proxyMasterdataService.getLocationHierarchyLevels("2020-03-01"); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + verify(responseWrapper, atLeast(1)).getErrors(); + } + + @Test + public void testGetLocationHierarchyLevels5() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(responseWrapper.getErrors()).thenReturn(new ArrayList<>()); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenReturn(responseWrapper); + proxyMasterdataService.getLocationHierarchyLevels(null); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + verify(responseWrapper, atLeast(1)).getErrors(); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetLocationHierarchyLevels6() throws ApisResourceAccessException, ResidentServiceCheckedException { + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenThrow(new ApisResourceAccessException()); + proxyMasterdataService.getLocationHierarchyLevels("2020-03-01"); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + verify(responseWrapper, atLeast(1)).getErrors(); + } + + @Test + public void testGetAllDynamicFieldByName() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(new ArrayList<>()); + responseWrapper.setId("https://example.org/example"); + responseWrapper.setMetadata("Metadata"); + responseWrapper.setResponse("Response"); + responseWrapper.setResponsetime(LocalDateTime.of(1, 1, 1, 1, 1)); + responseWrapper.setVersion("https://example.org/example"); + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(responseWrapper); + assertSame(responseWrapper, proxyMasterdataService.getAllDynamicFieldByName("gender")); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAllDynamicFieldByName4() throws ApisResourceAccessException, ResidentServiceCheckedException { + ArrayList serviceErrorList = new ArrayList<>(); + serviceErrorList.add(new ServiceError("An error occurred", "An error occurred")); + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(responseWrapper.getErrors()).thenReturn(serviceErrorList); + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(responseWrapper); + proxyMasterdataService.getAllDynamicFieldByName("gender"); + verify(responseWrapper, atLeast(1)).getErrors(); + } + + @Test + public void testGetAllDynamicFieldByName5() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(responseWrapper.getErrors()).thenReturn(new ArrayList<>()); + when(residentServiceRestClient.getApi((ApiName) any(), (Map) any(), any())).thenReturn(responseWrapper); + proxyMasterdataService.getAllDynamicFieldByName("gender"); + verify(responseWrapper, atLeast(1)).getErrors(); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyOtpServiceImpllTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyOtpServiceImpllTest.java new file mode 100644 index 00000000000..ca78da4777f --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyOtpServiceImpllTest.java @@ -0,0 +1,281 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.mosip.resident.dto.IdentityDTO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestTemplate; + +import io.mosip.kernel.core.authmanager.model.AuthNResponse; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.preregistration.application.constant.PreRegLoginConstant; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.MainRequestDTO; +import io.mosip.resident.dto.MainResponseDTO; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.OtpTransactionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.OtpManager; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * This class is used to test proxy otp service impl class. + * @author Kamesh Shekhar Prasad + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ProxyOtpServiceImpllTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @Mock + private AuditUtil audit; + + @InjectMocks + private ProxyOtpServiceImpl proxyOtpService; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + @Qualifier("selfTokenRestTemplate") + private RestTemplate restTemplate; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Autowired + private MockMvc mockMvc; + + @Mock + private NotificationService notificationService; + + private NotificationResponseDTO notificationResponseDTO; + + private MainRequestDTO requestDTO; + + private OtpRequestDTOV2 otpRequestDTOV2; + + + @Mock + private OtpTransactionRepository otpTransactionRepository; + + private ResponseWrapper> response; + + @Mock + private Environment environment; + + private ResponseEntity response1; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private RequestValidator requestValidator; + + @Mock + private ResidentService residentService; + + @Mock + private OtpManager otpManager; + + private ResponseEntity> responseEntity; + private IdentityDTO identityDTO; + + @Before + public void setup() throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + MockitoAnnotations.initMocks(this); + this.mockMvc = MockMvcBuilders.standaloneSetup(proxyOtpService).build(); + response = new ResponseWrapper<>(); + Map responseMap = new HashMap<>(); + responseMap.put("otp", "111111"); + responseMap.put("status", "PASSED"); + response.setResponse(responseMap); + otpRequestDTOV2 = new OtpRequestDTOV2(); + requestDTO = new MainRequestDTO<>(); + otpRequestDTOV2.setTransactionId("1234567891"); + otpRequestDTOV2.setUserId("kamesh@gmail.com"); + requestDTO.setRequest(otpRequestDTOV2); + ResponseWrapper> responseMap1 = new ResponseWrapper<>(); + responseMap1.setResponse(responseMap); + response1 = new ResponseEntity<>(responseMap1, HttpStatus.ACCEPTED); + Mockito.when(requestValidator.validateUserIdAndTransactionId(Mockito.anyString(), Mockito.anyString())).thenReturn(List.of("EMAIL")); + ReflectionTestUtils.setField(proxyOtpService, "mandatoryLanguage", "eng"); + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())).thenReturn(true); + AuthNResponse authNResponse = new AuthNResponse(PreRegLoginConstant.EMAIL_SUCCESS, PreRegLoginConstant.SUCCESS); + MainResponseDTO response = new MainResponseDTO<>(); + response.setResponse(authNResponse); + responseEntity = new ResponseEntity<>(HttpStatus.OK); + } + + @Test + public void testSendOtpEmailSuccess() throws ResidentServiceCheckedException { + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test + public void testSendOtpPhoneSuccess() throws ResidentServiceCheckedException { + otpRequestDTOV2.setUserId("8809463737"); + requestDTO.setRequest(otpRequestDTOV2); + Mockito.when(requestValidator.validateUserIdAndTransactionId(Mockito.anyString(), + Mockito.anyString())).thenReturn(List.of("PHONE")); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test + public void testSendOtpFailure() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())).thenReturn(false); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testHttpServerErrorException() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())).thenThrow(new HttpServerErrorException(HttpStatus.BAD_GATEWAY)); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testHttpClientErrorException() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())).thenThrow(new HttpClientErrorException(HttpStatus.BAD_GATEWAY)); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testResidentServiceException() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())) + .thenThrow(new ResidentServiceException(ResidentErrorCode.SEND_OTP_FAILED.getErrorCode(), + ResidentErrorCode.SEND_OTP_FAILED.getErrorMessage())); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testResidentServiceCheckedException() throws ResidentServiceCheckedException, IOException, ApisResourceAccessException { + Mockito.when(otpManager.sendOtp(any(), any(), any(), any())) + .thenThrow(new ResidentServiceCheckedException(ResidentErrorCode.SEND_OTP_FAILED.getErrorCode(), + ResidentErrorCode.SEND_OTP_FAILED.getErrorMessage())); + assertEquals(responseEntity.getStatusCode(), proxyOtpService.sendOtp(requestDTO, identityDTO).getStatusCode()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailure() { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + + @Test + public void testValidateOtpSuccess() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + Mockito.when(otpManager.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + Mockito.when(otpManager.updateUserId(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(new Object(), "12345")); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailureResidentServiceException() throws ResidentServiceCheckedException, ApisResourceAccessException { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + Mockito.when(otpManager.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())). + thenThrow(new ResidentServiceException(ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorCode(), + ResidentErrorCode.OTP_VALIDATION_FAILED.getErrorMessage())); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailureRuntimeException() throws ResidentServiceCheckedException, ApisResourceAccessException { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + Mockito.when(otpManager.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())). + thenThrow(new RuntimeException()); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailureResidentServiceCheckedException() throws ResidentServiceCheckedException, ApisResourceAccessException { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + Mockito.when(otpManager.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())). + thenThrow(new ResidentServiceCheckedException()); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpFailureApiResourceException() throws ResidentServiceCheckedException, ApisResourceAccessException { + MainRequestDTO requestDTO1 = new MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("11111"); + otpRequestDTOV3.setUserId("ka@gm.com"); + otpRequestDTOV3.setTransactionId("122222222"); + requestDTO1.setRequest(otpRequestDTOV3); + Mockito.when(otpManager.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())). + thenThrow(new ApisResourceAccessException()); + assertEquals("12345", proxyOtpService.validateWithUserIdOtp(requestDTO1).getT2()); + } + +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceTest.java new file mode 100644 index 00000000000..4a0e160a93f --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ProxyPartnerManagementServiceTest.java @@ -0,0 +1,165 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.util.Utility; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.util.ResidentServiceRestClient; + +/** + * Resident proxy partner management service test class. + * + * @author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ProxyPartnerManagementServiceTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private Utility utility; + + @InjectMocks + private ProxyPartnerManagementService proxyPartnerManagementService = new ProxyPartnerManagementServiceImpl(); + + private ResponseWrapper responseWrapper; + + @Before + public void setUp() throws Exception { + Map partnerMap=new HashMap<>(); + partnerMap.put("partnerID", "2345671"); + responseWrapper = new ResponseWrapper<>(); + responseWrapper.setVersion("v1"); + responseWrapper.setId("1"); + responseWrapper.setResponse(Map.of("partners",List.of(partnerMap))); + when(utility.getPartnersByPartnerType(any(), any())) + .thenReturn(responseWrapper); + } + + @Test + public void testGetPartnersByPartnerType() throws ApisResourceAccessException, ResidentServiceCheckedException { + responseWrapper.setErrors(null); + ResponseWrapper result = proxyPartnerManagementService + .getPartnersByPartnerType("Device_Provider"); + assertNotNull(result); + } + + @Test + public void testGetPartnersByPartnerTypeIf() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper result = proxyPartnerManagementService + .getPartnersByPartnerType(""); + assertNotNull(result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPartnersByPartnerTypeNestedIf() + throws ApisResourceAccessException, ResidentServiceCheckedException { + ServiceError error = new ServiceError(); + error.setErrorCode("101"); + error.setMessage("errors"); + + List errorList = new ArrayList(); + errorList.add(error); + when(utility.getPartnersByPartnerType(any(), any())) + .thenThrow(new ResidentServiceCheckedException()); + + responseWrapper.setErrors(errorList); + proxyPartnerManagementService.getPartnersByPartnerType("Device_Provider"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPartnersByPartnerTypeWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(utility.getPartnersByPartnerType(any(), any())) + .thenThrow(new ResidentServiceCheckedException()); + proxyPartnerManagementService.getPartnersByPartnerType("Device_Provider"); + } + + @Test + public void testGetPartnerDetailFromPartnerId() throws ResidentServiceCheckedException { + Map result = proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType("2345671", "Auth"); + assertEquals("2345671", result.get("partnerID")); + } + + @Test(expected = ResidentServiceException.class) + public void testGetPartnerDetailFromPartnerIdException() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(utility.getPartnersByPartnerType(any(), any())) + .thenThrow(new ResidentServiceCheckedException(ResidentErrorCode.PARTNER_SERVICE_EXCEPTION)); + proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType("", "Auth"); + } + + @Test + public void testGetPartnersByPartnerTypeV2() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(new ArrayList<>()); + responseWrapper.setId("https://example.org/example"); + responseWrapper.setMetadata("Metadata"); + responseWrapper.setResponse("Response"); + responseWrapper.setResponsetime(LocalDateTime.of(1, 1, 1, 1, 1)); + responseWrapper.setVersion("https://example.org/example"); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenReturn(responseWrapper); + assertSame(responseWrapper, + proxyPartnerManagementService.getPartnersByPartnerType(Optional.of("42"), ApiName.PARTNER_API_URL)); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPartnersByPartnerType3() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(responseWrapper.getErrors()).thenReturn(List.of(new ServiceError(ResidentErrorCode.PARTNER_SERVICE_EXCEPTION.getErrorCode(), + ResidentErrorCode.PARTNER_SERVICE_EXCEPTION.getErrorMessage()))); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenReturn(responseWrapper); + proxyPartnerManagementService.getPartnersByPartnerType(Optional.of("42"), ApiName.PARTNER_API_URL); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + verify(responseWrapper, atLeast(1)).getErrors(); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPartnersByPartnerType4() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = (ResponseWrapper) mock(ResponseWrapper.class); + when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any())).thenThrow(new ApisResourceAccessException()); + proxyPartnerManagementService.getPartnersByPartnerType(Optional.of("42"), ApiName.PARTNER_API_URL); + verify(residentServiceRestClient).getApi((ApiName) any(), (List) any(), (List) any(), + (List) any(), (Class) any()); + verify(responseWrapper, atLeast(1)).getErrors(); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentConfigServiceImplTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentConfigServiceImplTest.java new file mode 100644 index 00000000000..03197b673f1 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentConfigServiceImplTest.java @@ -0,0 +1,232 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.MappingJsonConstants; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.exception.ResidentServiceException; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentConfigServiceImplTest { + + @InjectMocks + private ResidentConfigServiceImpl configServiceImpl; + + @Mock + private Environment env; + + @Mock + private ResourceLoader resourceLoader; + + @Mock + private Resource residentUiSchemaJsonFile; + + @Mock + private Resource identityMappingJsonFile; + + @Mock + private ObjectMapper objectMapper; + + Resource resource; + private String identityMapping; + private String uiSchema; + private Map uiSchemaMap; + + @Before + public void setUp() throws Exception { + identityMapping = "{\"name\":\"identity-mapping\"}"; + Mockito.when(identityMappingJsonFile.getInputStream()) + .thenReturn(new ByteArrayInputStream(identityMapping.getBytes())); + ReflectionTestUtils.setField(configServiceImpl, "resourceLoader", resourceLoader); + ReflectionTestUtils.setField(configServiceImpl, "residentUiSchemaJsonFilePrefix", "classpath:resident-ui"); + resource = Mockito.mock(Resource.class); + Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(resource); + when(resource.exists()).thenReturn(true); + + // getUISchemaData() + uiSchema = "{\"name\":\"ui-schema\"}"; + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(uiSchema.getBytes())); + uiSchemaMap = new HashMap<>(); + List> uiSchemaInputAttributes = new ArrayList<>(); + Map map1 = new HashMap<>(); + map1.put(ResidentConstants.LABEL, "Full Name"); + map1.put(ResidentConstants.VALUE, "fullName"); + List> list = new ArrayList<>(); + list.add(map1); + Map mapFormat = new HashMap<>(); + mapFormat.put("eng", list); + Map uiSchemaInputAttribute1 = new HashMap<>(); + uiSchemaInputAttribute1.put(ResidentConstants.ATTRIBUTE_NAME, "fullName"); + uiSchemaInputAttribute1.put(ResidentConstants.MASK_REQUIRED, false); + uiSchemaInputAttribute1.put(ResidentConstants.LABEL, Map.of("eng", "Name")); + uiSchemaInputAttribute1.put(ResidentConstants.FORMAT_REQUIRED, true); + uiSchemaInputAttribute1.put(ResidentConstants.FORMAT_OPTION, mapFormat); + uiSchemaInputAttributes.add(uiSchemaInputAttribute1); + Map uiSchemaInputAttribute2 = new HashMap<>(); + uiSchemaInputAttribute2.put(ResidentConstants.ATTRIBUTE_NAME, "UIN"); + uiSchemaInputAttribute2.put(ResidentConstants.MASK_REQUIRED, true); + uiSchemaInputAttribute2.put(ResidentConstants.MASK_ATTRIBUTE_NAME, "masked_UIN"); + uiSchemaInputAttribute2.put(ResidentConstants.LABEL, Map.of("eng", "UIN")); + uiSchemaInputAttribute2.put(ResidentConstants.FORMAT_REQUIRED, false); + uiSchemaInputAttributes.add(uiSchemaInputAttribute2); + uiSchemaMap.put(MappingJsonConstants.IDENTITY, uiSchemaInputAttributes); + Mockito.when(objectMapper.readValue(uiSchema.getBytes(), Map.class)).thenReturn(uiSchemaMap); + } + + private ResidentConfigServiceImpl createTestSubject() { + return configServiceImpl; + } + + @Test + public void testGetUIProperties_emptyPropArray() throws Exception { + ResidentConfigServiceImpl testSubject; + ResponseWrapper result; + + // default test + testSubject = createTestSubject(); + ReflectionTestUtils.setField(testSubject, "propKeys", new String[0]); + ReflectionTestUtils.setField(testSubject, "env", env); + result = testSubject.getUIProperties(); + Set resultProps = ((Map) result.getResponse()).keySet(); + assertTrue(resultProps.size() == 0); + } + + @Test + public void testGetUIProperties_nonEmptyPropArray() throws Exception { + ResidentConfigServiceImpl testSubject; + ResponseWrapper result; + + // default test + testSubject = createTestSubject(); + String[] propKeys = new String[] { "aaa.key", "bbb.key", "ccc.key" }; + ReflectionTestUtils.setField(testSubject, "propKeys", propKeys); + when(env.getProperty("aaa.key", Object.class)).thenReturn("aaa"); + when(env.getProperty("bbb.key", Object.class)).thenReturn("bbb"); + ReflectionTestUtils.setField(testSubject, "env", env); + result = testSubject.getUIProperties(); + Set resultProps = ((Map) result.getResponse()).keySet(); + assertTrue(resultProps.size() == 2); + assertTrue(resultProps.contains("aaa.key")); + assertTrue(resultProps.contains("bbb.key")); + + } + + @Test(expected = ResidentServiceException.class) + public void testGetUISchemaElse() throws Exception { + ResidentConfigServiceImpl testSubject = createTestSubject(); + when(resource.exists()).thenReturn(false); + testSubject.getUISchema("update-demographics"); + } + + private void getIdentityMappingMap(ResidentConfigServiceImpl testSubject) + throws IOException, JsonParseException, JsonMappingException { + ReflectionTestUtils.setField(testSubject, "identityMapping", identityMapping); + Map identityDataMap = new HashMap<>(); + Map identityAttributeMap1 = new HashMap<>(); + identityAttributeMap1.put(MappingJsonConstants.VALUE, "fullName"); + identityDataMap.put("name", identityAttributeMap1); + Map identityAttributeMap2 = new HashMap<>(); + identityAttributeMap2.put(MappingJsonConstants.VALUE, "UIN"); + identityDataMap.put("uin", identityAttributeMap2); + Map identityMappingMap = new HashMap<>(); + identityMappingMap.put(MappingJsonConstants.IDENTITY, identityDataMap); + Mockito.when(objectMapper.readValue(identityMapping.getBytes(), Map.class)).thenReturn(identityMappingMap); + } + + @Test + public void testGetIdentityMappingTry() throws Exception { + ResidentConfigServiceImpl testSubject; + testSubject = createTestSubject(); + identityMapping = null; + ReflectionTestUtils.setField(testSubject, "identityMapping", identityMapping); + identityMapping = "{\"name\":\"identity-mapping\"}"; + String result = testSubject.getIdentityMapping(); + assertTrue(result.contains(identityMapping)); + } + + @Test + public void testGetUiSchemaFilteredInputAttributes() throws Exception { + ResidentConfigServiceImpl testSubject; + List result; + testSubject = createTestSubject(); + result = testSubject.getUiSchemaFilteredInputAttributes("update-demographics"); + assertNotNull(result); + } + + @Test(expected = ResidentServiceException.class) + public void testGetUiSchemaFilteredInputAttributesNotNull() throws Exception { + ResidentConfigServiceImpl testSubject; + uiSchemaMap.put(MappingJsonConstants.IDENTITY, null); + Mockito.when(objectMapper.readValue(uiSchema.getBytes(), Map.class)).thenReturn(uiSchemaMap); + testSubject = createTestSubject(); + testSubject.getUiSchemaFilteredInputAttributes("update-demographics"); + } + + @Test(expected = ResidentServiceException.class) + public void testGetUiSchemaFilteredInputAttributesWithException() throws Exception { + ResidentConfigServiceImpl testSubject; + Mockito.when(objectMapper.readValue(uiSchema.getBytes(), Map.class)).thenThrow(new IOException()); + testSubject = createTestSubject(); + testSubject.getUiSchemaFilteredInputAttributes("update-demographics"); + } + + @Test + public void testGetSharableAttributesList() throws Exception { + ResidentConfigServiceImpl testSubject; + testSubject = createTestSubject(); + getIdentityMappingMap(testSubject); + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn(ResidentConstants.ATTRIBUTE_NAME); + SharableAttributesDTO sharableAttributesDTO1 = new SharableAttributesDTO(); + sharableAttributesDTO1.setAttributeName("name"); + sharableAttributesDTO1.setFormat("fullName"); + SharableAttributesDTO sharableAttributesDTO2 = new SharableAttributesDTO(); + sharableAttributesDTO2.setAttributeName("uin"); + SharableAttributesDTO sharableAttributesDTO3 = new SharableAttributesDTO(); + sharableAttributesDTO3.setAttributeName("dob"); + sharableAttributesDTO3.setFormat(""); + List sharableAttrList = new ArrayList<>(); + sharableAttrList.add(sharableAttributesDTO1); + sharableAttrList.add(sharableAttributesDTO2); + sharableAttrList.add(sharableAttributesDTO3); + testSubject.getSharableAttributesList(sharableAttrList, "update-demographics"); + } + + @Test + public void testGetUISchemaCacheableData() throws Exception { + ResidentConfigServiceImpl testSubject; + testSubject = createTestSubject(); + testSubject.getUISchemaCacheableData("update-demographics"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentCredentialServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentCredentialServiceTest.java new file mode 100644 index 00000000000..b473c9eed2d --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentCredentialServiceTest.java @@ -0,0 +1,744 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.net.URI; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.dto.CredentialCancelRequestResponseDto; +import io.mosip.resident.dto.CredentialReqestDto; +import io.mosip.resident.dto.CredentialRequestStatusDto; +import io.mosip.resident.dto.CredentialRequestStatusResponseDto; +import io.mosip.resident.dto.CredentialTypeResponse; +import io.mosip.resident.dto.CryptomanagerRequestDto; +import io.mosip.resident.dto.CryptomanagerResponseDto; +import io.mosip.resident.dto.EncryptResponseDto; +import io.mosip.resident.dto.Issuer; +import io.mosip.resident.dto.PartnerCredentialTypePolicyDto; +import io.mosip.resident.dto.PartnerResponseDto; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentCredentialResponseDto; +import io.mosip.resident.dto.ResidentCredentialResponseDtoV2; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.dto.Type; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentCredentialServiceException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentCredentialService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; + +/** + * This class is used to create service class test for + * ResidentCredentialServiceImpl. + * + * @Author Ritik Jain + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentCredentialServiceTest { + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private NotificationService notificationService; + + @Mock + private IdAuthService idAuthService; + + @Mock + private ObjectMapper mapper; + + @Mock + private Utility utility; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private ProxyPartnerManagementServiceImpl proxyPartnerManagementServiceImpl; + + private ResidentCredentialRequestDto residentCredentialRequestDto; + + private ResidentTransactionEntity residentTransactionEntity; + + @InjectMocks + private ResidentCredentialService residentCredentialService = new ResidentCredentialServiceImpl(); + + @Before + public void setup() throws IOException, ResidentServiceCheckedException, ApisResourceAccessException { + ReflectionTestUtils.setField(residentCredentialService, "max", 982608); + ReflectionTestUtils.setField(residentCredentialService, "min", 120078); + List attributeList = new ArrayList<>(); + attributeList.add("name"); + attributeList.add("gender"); + residentCredentialRequestDto = new ResidentCredentialRequestDto(); + residentCredentialRequestDto.setOtp("123"); + residentCredentialRequestDto.setTransactionID("12345"); + residentCredentialRequestDto.setIndividualId("1234567890"); + residentCredentialRequestDto.setIssuer("mpartner-default-print"); + residentCredentialRequestDto.setCredentialType("euin"); + residentCredentialRequestDto.setEncrypt(true); + residentCredentialRequestDto.setEncryptionKey("abc123"); + residentCredentialRequestDto.setSharableAttributes(attributeList); + residentCredentialRequestDto.setConsent("Accepted"); + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("e65c86f5-8929-4547-a156-9b349c29ab8b"); + when(utility.createEntity(Mockito.any())).thenReturn(residentTransactionEntity); + when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("1234567890"); + when(utility.createEventId()).thenReturn("1111111111111111"); + when(utility.getRidDeliMeterValue()).thenReturn("-PDF"); + } + + @Test + public void generateCredentialTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, + ResidentServiceCheckedException { + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(residentCredentialResponseDto); + + PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); + partnerResponseDto.setOrganizationName("MOSIP"); + ResponseWrapper partnerResponseDtoResponseWrapper = new ResponseWrapper<>(); + partnerResponseDtoResponseWrapper.setResponse(partnerResponseDto); + + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenReturn(Boolean.TRUE); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + String partnerUrl = env.getProperty(ApiName.PARTNER_API_URL.name()) + "/" + + residentCredentialRequestDto.getIssuer(); + URI partnerUri = URI.create(partnerUrl); + when(residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class)) + .thenReturn(partnerResponseDtoResponseWrapper); + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); + + ResidentCredentialResponseDto credentialResponseDto = residentCredentialService + .reqCredential(residentCredentialRequestDto); + assertEquals("10001100010006920211220064226", credentialResponseDto.getRequestId()); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateCredentialWithIndividualIdNull() throws ResidentServiceCheckedException { + residentCredentialRequestDto.setIndividualId(null); + + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateCredentialWithOTPFailure() + throws OtpValidationFailedException, ResidentServiceCheckedException { + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenReturn(Boolean.FALSE); + + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateCredentialWithOtpValidationFailedException() + throws OtpValidationFailedException, ResidentServiceCheckedException { + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenThrow(new OtpValidationFailedException()); + + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateCredentialWithOtpValidationNotificationFailed() + throws OtpValidationFailedException, ResidentServiceCheckedException { + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenThrow(new OtpValidationFailedException()); + when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); + + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testReqCredentialWithApisResourceAccessException() throws Exception { + residentCredentialRequestDto.setEncryptionKey(null); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(residentCredentialResponseDto); + + PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); + partnerResponseDto.setOrganizationName("MOSIP"); + ResponseWrapper partnerResponseDtoResponseWrapper = new ResponseWrapper<>(); + partnerResponseDtoResponseWrapper.setResponse(partnerResponseDto); + + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenReturn(Boolean.TRUE); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + String partnerUrl = env.getProperty(ApiName.PARTNER_API_URL.name()) + "/" + + residentCredentialRequestDto.getIssuer(); + URI partnerUri = URI.create(partnerUrl); + when(residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class)) + .thenReturn(partnerResponseDtoResponseWrapper); + when(residentServiceRestClient.postApi(any(), any(), any(), any())) + .thenThrow(ApisResourceAccessException.class); + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGenerateCredentialWithIOException() + throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + residentCredentialRequestDto.setEncryptionKey(""); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(residentCredentialResponseDto); + + PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); + partnerResponseDto.setOrganizationName("MOSIP"); + ResponseWrapper partnerResponseDtoResponseWrapper = new ResponseWrapper<>(); + partnerResponseDtoResponseWrapper.setResponse(partnerResponseDto); + + when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), + residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())) + .thenReturn(Boolean.TRUE); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + String partnerUrl = env.getProperty(ApiName.PARTNER_API_URL.name()) + "/" + + residentCredentialRequestDto.getIssuer(); + URI partnerUri = URI.create(partnerUrl); + when(residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class)) + .thenReturn(partnerResponseDtoResponseWrapper); + when(residentServiceRestClient.postApi(any(), any(), any(), any())) + .thenReturn(partnerResponseDtoResponseWrapper); + + residentCredentialService.reqCredential(residentCredentialRequestDto); + } + + @Test + public void testShareCredentialPurpose() + throws IOException, ApisResourceAccessException, ResidentServiceCheckedException { + ReflectionTestUtils.setField(residentCredentialService, "credentialType", "euin"); + ReflectionTestUtils.setField(residentCredentialService, "encryptionKey", "abc1234"); + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + SharableAttributesDTO sharableAttribute1 = new SharableAttributesDTO(); + sharableAttribute1.setAttributeName("name"); + sharableAttribute1.setFormat("firstName,secondName"); + SharableAttributesDTO sharableAttribute2 = new SharableAttributesDTO(); + sharableAttribute2.setAttributeName("gender"); + SharableAttributesDTO sharableAttribute3 = new SharableAttributesDTO(); + sharableAttribute3.setAttributeName("phone"); + sharableAttribute3.setFormat(""); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(residentCredentialResponseDto); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); + + Tuple2 credentialResponseDto = residentCredentialService + .shareCredential(residentCredentialRequestDto, "Banking", + List.of(sharableAttribute1, sharableAttribute2, sharableAttribute3)); + assertNotNull(credentialResponseDto.getT1().getStatus()); + } + + @Test(expected = ResidentServiceException.class) + public void testShareCredentialConsentNull() + throws IOException, ApisResourceAccessException, ResidentServiceCheckedException { + residentCredentialRequestDto.setConsent(null); + residentCredentialService.shareCredential(residentCredentialRequestDto, "Banking", List.of()); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testShareCredentialWithApisResourceAccessException() throws Exception { + ReflectionTestUtils.setField(residentCredentialService, "credentialType", "euin"); + ReflectionTestUtils.setField(residentCredentialService, "encryptionKey", "abc1234"); + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + residentCredentialRequestDto.setSharableAttributes(null); + ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); + residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(residentCredentialResponseDto); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + when(residentServiceRestClient.postApi(any(), any(), any(), any())) + .thenThrow(ApisResourceAccessException.class); + residentCredentialService.shareCredential(residentCredentialRequestDto, null, null); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testShareCredentialWithIOException() + throws ResidentServiceCheckedException, ApisResourceAccessException { + ReflectionTestUtils.setField(residentCredentialService, "credentialType", "euin"); + ReflectionTestUtils.setField(residentCredentialService, "encryptionKey", "abc1234"); + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + residentCredentialRequestDto.setSharableAttributes(List.of()); + PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(partnerResponseDto); + + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.credential.request.service.id"); + requestDto.setRequest(new CredentialReqestDto()); + requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestDto.setVersion("1.0"); + + when(residentServiceRestClient.postApi(any(), any(), any(), any())) + .thenReturn(response); + residentCredentialService.shareCredential(residentCredentialRequestDto, null, List.of()); + } + + @Test + public void testGetCredentialTypes() throws ApisResourceAccessException { + Issuer issuer = new Issuer(); + issuer.setCode("paytm"); + issuer.setName("PayTM"); + List issuerList = new ArrayList(); + issuerList.add(issuer); + Type type = new Type(); + type.setDescription("Secure Digital QR Code"); + type.setId("idtype1"); + type.setName("Secure Digital QR Code"); + type.setIssuers(issuerList); + List types = new ArrayList<>(); + types.add(type); + CredentialTypeResponse credentialTypeResponse = new CredentialTypeResponse(); + credentialTypeResponse.setCredentialTypes(types); + + when(env.getProperty(ApiName.CREDENTIAL_TYPES_URL.name())) + .thenReturn("https://mosip.net/v1/credentialservice/types"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(credentialTypeResponse); + CredentialTypeResponse credentialTypes = residentCredentialService.getCredentialTypes(); + assertEquals(credentialTypes.getCredentialTypes().size(), 1); + assertEquals(credentialTypes.getCredentialTypes().get(0).getDescription(), "Secure Digital QR Code"); + assertEquals(credentialTypes.getCredentialTypes().get(0).getIssuers().size(), 1); + assertEquals(credentialTypes.getCredentialTypes().get(0).getIssuers().get(0).getName(), "PayTM"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetCredentialTypesWithAPIResourceException() throws ApisResourceAccessException { + when(env.getProperty(ApiName.CREDENTIAL_TYPES_URL.name())) + .thenReturn("https://mosip.net/v1/credentialservice/types"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenThrow(ApisResourceAccessException.class); + residentCredentialService.getCredentialTypes(); + } + + @Test + public void testGetPolicyByCredentialType() throws Exception { + + PartnerCredentialTypePolicyDto credentialTypePolicyDto = new PartnerCredentialTypePolicyDto(); + credentialTypePolicyDto.setPartnerId("1"); + credentialTypePolicyDto.setCredentialType("credentialType"); + credentialTypePolicyDto.setPolicyId("policyId"); + credentialTypePolicyDto.setPolicyName("policyName"); + credentialTypePolicyDto.setPolicyDesc("policyDesc"); + credentialTypePolicyDto.setPolicyType("policyType"); + credentialTypePolicyDto.setPublishDate("publishDate"); + credentialTypePolicyDto.setValidTill("validTill"); + credentialTypePolicyDto.setStatus("status"); + credentialTypePolicyDto.setVersion("version1"); + credentialTypePolicyDto.setSchema("schema"); + credentialTypePolicyDto.setIs_Active(true); + credentialTypePolicyDto.setCr_by("crBy"); + credentialTypePolicyDto.setCr_dtimes("crDtimes"); + credentialTypePolicyDto.setUpd_dtimes("uddDtimes"); + credentialTypePolicyDto.setPolicies(new JSONObject()); + + ResponseWrapper responseWrapper = new ResponseWrapper(); + responseWrapper.setId("1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialTypePolicyDto); + // responseWrapper.setErrors(null); + + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(responseWrapper); + + ResponseWrapper response = residentCredentialService + .getPolicyByCredentialType("1", "credentialType"); + assertEquals(response.getResponse(), credentialTypePolicyDto); + assertEquals(response.getId(), "1"); + assertEquals(response.getVersion(), "T version"); + assertEquals(response, responseWrapper); + + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetPolicyByCredentialTypeWithAPIResourceException() throws ApisResourceAccessException { + when(residentServiceRestClient.getApi((ApiName) any(), any(), any())) + .thenThrow(ApisResourceAccessException.class); + residentCredentialService.getPolicyByCredentialType("2", "credential-type"); + } + + @Test + public void testGetStatus() throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); + credentialRequestStatusDto.setId("id-1"); + credentialRequestStatusDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + credentialRequestStatusDto.setStatusCode("code-101"); + credentialRequestStatusDto.setUrl("https://url"); + ResponseWrapper responseWrapper = new ResponseWrapper(); + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialRequestStatusDto); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(responseWrapper); + + CredentialRequestStatusResponseDto response = residentCredentialService + .getStatus("effc56cd-cf3b-4042-ad48-7277cf90f763"); + assertEquals(response.getId(), responseWrapper.getId()); + assertEquals(response.getStatusCode(), responseWrapper.getResponse().getStatusCode()); + assertEquals(response.getRequestId(), "effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetStatusWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenThrow(ApisResourceAccessException.class); + residentCredentialService.getStatus("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetStatusWithIOException() + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse("throw io exception"); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(responseWrapper); + + residentCredentialService.getStatus("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetStatusWithIllegalArgumentException() + throws IllegalArgumentException, ApisResourceAccessException, ResidentServiceCheckedException { + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenThrow(IllegalArgumentException.class); + residentCredentialService.getStatus("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetStatusWithResidentServiceCheckedException() + throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); + credentialRequestStatusDto.setId("id-1"); + credentialRequestStatusDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + credentialRequestStatusDto.setStatusCode("code-101"); + credentialRequestStatusDto.setUrl("https://url"); + ResponseWrapper responseWrapper = new ResponseWrapper(); + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialRequestStatusDto); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(responseWrapper); + when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); + + residentCredentialService.getStatus("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test + public void testGetCard() throws Exception { + ReflectionTestUtils.setField(residentCredentialService, "applicationId", "resident"); + ReflectionTestUtils.setField(residentCredentialService, "partnerReferenceId", "mosip_partner"); + + ResponseWrapper responseWrapper = new ResponseWrapper(); + CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); + credentialRequestStatusDto.setId("id-1"); + credentialRequestStatusDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + credentialRequestStatusDto.setStatusCode(EventStatusSuccess.STORED.name()); + credentialRequestStatusDto.setUrl("https://url"); + + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialRequestStatusDto); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763"); + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)).thenReturn(responseWrapper); + + URI dataShareUri = URI.create(credentialRequestStatusDto.getUrl()); + when(residentServiceRestClient.getApi(dataShareUri, String.class)).thenReturn("str"); + RequestWrapper request = new RequestWrapper<>(); + CryptomanagerRequestDto cryptomanagerRequestDto = new CryptomanagerRequestDto(); + cryptomanagerRequestDto.setApplicationId("resident"); + cryptomanagerRequestDto.setData("str"); + cryptomanagerRequestDto.setReferenceId("mosip_partner"); + cryptomanagerRequestDto.setPrependThumbprint(true); + cryptomanagerRequestDto.setTimeStamp(LocalDateTime.now()); + request.setRequesttime("responseTime"); + request.setRequest(cryptomanagerRequestDto); + + String str = CryptoUtil.encodeToURLSafeBase64("response return".getBytes()); + when(residentServiceRestClient.postApi(anyString(), any(), any(), any())).thenReturn(str); + CryptomanagerResponseDto responseObject = new CryptomanagerResponseDto(); + responseObject.setResponse(new EncryptResponseDto(str)); + when(mapper.readValue(str, CryptomanagerResponseDto.class)).thenReturn(responseObject); + + byte[] card = residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763"); + assertNotNull(card); + } + + @Test + public void testGetCardWithAppIdNull() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper(); + CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); + credentialRequestStatusDto.setId("id-1"); + credentialRequestStatusDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763-pdf"); + credentialRequestStatusDto.setStatusCode(EventStatusSuccess.STORED.name()); + credentialRequestStatusDto.setUrl("https://url"); + + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialRequestStatusDto); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763-pdf"); + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)).thenReturn(responseWrapper); + + URI dataShareUri = URI.create(credentialRequestStatusDto.getUrl()); + when(residentServiceRestClient.getApi(dataShareUri, byte[].class)).thenReturn("card data".getBytes()); + + byte[] card = residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763-PDF"); + assertNotNull(card); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetCardWithDataShareUrlNull() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper(); + CredentialRequestStatusDto credentialRequestStatusDto = new CredentialRequestStatusDto(); + credentialRequestStatusDto.setId("id-1"); + credentialRequestStatusDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + credentialRequestStatusDto.setStatusCode("code-101"); + credentialRequestStatusDto.setUrl(null); + + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse(credentialRequestStatusDto); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763"); + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)).thenReturn(responseWrapper); + + residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetCardWithIOException() throws Exception { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setId("id-1"); + responseWrapper.setVersion("T version"); + responseWrapper.setResponsetime("responseTime"); + responseWrapper.setResponse("throw io exception"); + + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763"); + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)).thenReturn(responseWrapper); + + residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetCardWithApisResourceAccessException() throws Exception { + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763"); + + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)) + .thenThrow(ApisResourceAccessException.class); + residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testGetCardWithIllegalArgumentException() throws Exception { + when(env.getProperty(any())).thenReturn("https://credentialUrl"); + URI credentailStatusUri = URI.create("https://credentialUrleffc56cd-cf3b-4042-ad48-7277cf90f763"); + + when(residentServiceRestClient.getApi(credentailStatusUri, ResponseWrapper.class)) + .thenThrow(IllegalArgumentException.class); + residentCredentialService.getCard("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test + public void testCancelCredentialRequest() throws ResidentCredentialServiceException, ApisResourceAccessException { + CredentialCancelRequestResponseDto credentialCancelRequestResponseDto = new CredentialCancelRequestResponseDto(); + credentialCancelRequestResponseDto.setId("ID-1"); + credentialCancelRequestResponseDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + + ResponseWrapper response = new ResponseWrapper(); + response.setId("ID-1"); + response.setVersion("T version"); + response.setResponsetime("responseTime"); + response.setResponse(credentialCancelRequestResponseDto); + + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(response); + + CredentialCancelRequestResponseDto responseDto = residentCredentialService + .cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + assertEquals("ID-1", responseDto.getId()); + assertEquals("effc56cd-cf3b-4042-ad48-7277cf90f763", responseDto.getRequestId()); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testCancelCredentialRequestWithResidentCredentialServiceException() throws Exception { + CredentialCancelRequestResponseDto credentialCancelRequestResponseDto = new CredentialCancelRequestResponseDto(); + credentialCancelRequestResponseDto.setId("ID-1"); + credentialCancelRequestResponseDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + + ResponseWrapper response = new ResponseWrapper(); + response.setId("ID-1"); + response.setVersion("T version"); + response.setResponsetime("responseTime"); + response.setResponse(credentialCancelRequestResponseDto); + + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(response); + + ServiceError error = new ServiceError(); + error.setErrorCode("invalid-101"); + error.setMessage("invalid center"); + List errorList = new ArrayList(); + errorList.add(error); + response.setErrors(errorList); + + residentCredentialService.cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testCancelCredentialRequestWithApisResourceAccessException() throws Exception { + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenThrow(ApisResourceAccessException.class); + + residentCredentialService.cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testCancelCredentialRequestWithIllegalArgumentException() throws Exception { + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenThrow(IllegalArgumentException.class); + + residentCredentialService.cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testCancelCredentialRequestWithIOException() + throws ResidentCredentialServiceException, ApisResourceAccessException { + ResponseWrapper response = new ResponseWrapper<>(); + response.setId("ID-1"); + response.setVersion("T version"); + response.setResponsetime("responseTime"); + response.setResponse("throw io exception"); + + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(response); + + residentCredentialService.cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } + + @Test(expected = ResidentCredentialServiceException.class) + public void testCancelCredentialRequestWithResidentServiceCheckedException() + throws ResidentCredentialServiceException, ApisResourceAccessException, ResidentServiceCheckedException { + CredentialCancelRequestResponseDto credentialCancelRequestResponseDto = new CredentialCancelRequestResponseDto(); + credentialCancelRequestResponseDto.setId("ID-1"); + credentialCancelRequestResponseDto.setRequestId("effc56cd-cf3b-4042-ad48-7277cf90f763"); + + ResponseWrapper response = new ResponseWrapper(); + response.setId("ID-1"); + response.setVersion("T version"); + response.setResponsetime("responseTime"); + response.setResponse(credentialCancelRequestResponseDto); + response.setErrors(null); + when(env.getProperty(any())).thenReturn("https://credentialCancelReqUrl"); + when(residentServiceRestClient.getApi((URI) any(), any())).thenReturn(response); + when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); + + residentCredentialService.cancelCredentialRequest("effc56cd-cf3b-4042-ad48-7277cf90f763"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentOtpServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentOtpServiceTest.java new file mode 100644 index 00000000000..7b0fd3e35a9 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentOtpServiceTest.java @@ -0,0 +1,186 @@ +package io.mosip.resident.service.impl; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.security.NoSuchAlgorithmException; +import java.util.List; + +import io.mosip.resident.dto.IdentityDTO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.IndividualIdResponseDto; +import io.mosip.resident.dto.MaskedResponseDTO; +import io.mosip.resident.dto.OtpRequestDTO; +import io.mosip.resident.dto.OtpResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ResidentOtpService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuples; + +/** + * + * @author Rama devi + * + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentOtpServiceTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @InjectMocks + private ResidentOtpService residentOtpService = new ResidentOtpServiceImpl(); + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + private ResidentTransactionEntity residentTransactionEntity; + private IdentityDTO identityValue; + + @Before + public void setup() throws Exception { + String otpAPIUrl = "https://dev2.mosip.net/idauthentication/v1/internal/otp"; + when(env.getProperty(ApiName.OTP_GEN_URL.name())).thenReturn(otpAPIUrl); + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setRequestTypeCode(RequestType.SEND_OTP.name()); + when(utility.createEntity(any())).thenReturn(residentTransactionEntity); + when(utility.createEventId()).thenReturn("1122334455667788"); + identityValue = new IdentityDTO(); + identityValue.setEmail("aaa@bbb.com"); + identityValue.setPhone("987654321"); + identityValue.setUIN("123"); + when(identityServiceImpl.getIdentity(Mockito.anyString())).thenReturn(identityValue); + when(identityServiceImpl.getIDAToken(Mockito.anyString())).thenReturn("123"); + when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.UIN); + } + + @Test + public void testGenerateOtp() + throws ApisResourceAccessException, ResidentServiceCheckedException, NoSuchAlgorithmException { + OtpResponseDTO otpResponseDTO = getOtpResponseDTO(); + when(residentServiceRestClient.postApi(anyString(), any(), any(), any())).thenReturn(otpResponseDTO); + when(utility.getIdForResidentTransaction(anyList(), any(), anyString())).thenReturn("hash ref id"); + + OtpRequestDTO otpRequestDTO = getOtpRequestDTO(); + otpRequestDTO.setOtpChannel(List.of("EMAIL")); + residentOtpService.generateOtp(otpRequestDTO); + + verify(residentServiceRestClient, times(1)).postApi(anyString(), any(), any(), any(Class.class)); + verify(env, times(1)).getProperty(ApiName.OTP_GEN_URL.name()); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateOtpWithApisResourceAccessException() + throws ApisResourceAccessException, ResidentServiceCheckedException, NoSuchAlgorithmException { + when(residentServiceRestClient.postApi(anyString(), any(), any(), any(Class.class))) + .thenThrow(new ApisResourceAccessException()); + residentOtpService.generateOtp(new OtpRequestDTO()); + } + + @Test(expected = ResidentServiceException.class) + public void testGenerateOtpWithResidentServiceCheckedException() + throws ApisResourceAccessException, ResidentServiceCheckedException, NoSuchAlgorithmException { + OtpRequestDTO otpRequestDTO = getOtpRequestDTO(); + otpRequestDTO.setOtpChannel(List.of("EMAIL")); + OtpResponseDTO otpResponseDTO = getOtpResponseDTO(); + when(residentServiceRestClient.postApi(anyString(), any(), any(), any())).thenReturn(otpResponseDTO); + when(utility.getIdForResidentTransaction(anyList(), any(), anyString())) + .thenThrow(new ResidentServiceCheckedException()); + residentOtpService.generateOtp(otpRequestDTO); + } + + @Test + public void testGenerateOtpForIndividualId() + throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = getIndividualIdOtpRequestDTO(); + OtpRequestDTO otpRequestDTO = getOtpRequestDTO(); + when(identityServiceImpl.getIdAndTypeForIndividualId(any())).thenReturn(Tuples.of("9054257143", IdType.UIN)); + when(objectMapper.convertValue(individualIdOtpRequestDTO, OtpRequestDTO.class)).thenReturn(otpRequestDTO); + OtpResponseDTO otpResponseDTO = getOtpResponseDTO(); + when(residentServiceRestClient.postApi(anyString(), any(), any(), any())).thenReturn(otpResponseDTO); + IndividualIdResponseDto individualIdResponseDto = getIndividualIdResponseDto(); + when(objectMapper.convertValue(otpResponseDTO, IndividualIdResponseDto.class)) + .thenReturn(individualIdResponseDto); + residentOtpService.generateOtpForIndividualId(individualIdOtpRequestDTO); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGenerateOtpForIndividualIdWithApisResourceAccessException() + throws ResidentServiceCheckedException, ApisResourceAccessException, NoSuchAlgorithmException { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = getIndividualIdOtpRequestDTO(); + when(identityServiceImpl.getIdAndTypeForIndividualId(any())).thenThrow(new ApisResourceAccessException()); + residentOtpService.generateOtpForIndividualId(individualIdOtpRequestDTO); + } + + private OtpRequestDTO getOtpRequestDTO() { + OtpRequestDTO otpRequestDTO = new OtpRequestDTO(); + otpRequestDTO.setIndividualId("9054257143"); + otpRequestDTO.setOtpChannel(List.of("EMAIL", "PHONE")); + return otpRequestDTO; + } + + private OtpResponseDTO getOtpResponseDTO() { + OtpResponseDTO responseDto = new OtpResponseDTO(); + MaskedResponseDTO maskedResponseDTO = new MaskedResponseDTO(); + maskedResponseDTO.setMaskedEmail("r***********47@gmail.com"); + maskedResponseDTO.setMaskedMobile("12*****89"); + responseDto.setResponse(maskedResponseDTO); + responseDto.setTransactionID("1232323232"); + return responseDto; + } + + private IndividualIdOtpRequestDTO getIndividualIdOtpRequestDTO() { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = new IndividualIdOtpRequestDTO(); + individualIdOtpRequestDTO.setOtpChannel(List.of("EMAIL", "PHONE")); + individualIdOtpRequestDTO.setTransactionId("1232323232"); + return individualIdOtpRequestDTO; + } + + private IndividualIdResponseDto getIndividualIdResponseDto() { + IndividualIdResponseDto individualIdResponseDto = new IndividualIdResponseDto(); + MaskedResponseDTO maskedResponseDTO = new MaskedResponseDTO(); + maskedResponseDTO.setMaskedEmail("r***********47@gmail.com"); + maskedResponseDTO.setMaskedMobile("12*****89"); + individualIdResponseDto.setResponse(maskedResponseDTO); + return individualIdResponseDto; + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceDownloadCardTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceDownloadCardTest.java new file mode 100644 index 00000000000..1f7bfac65f1 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceDownloadCardTest.java @@ -0,0 +1,345 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.persistence.EntityManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.core.env.Environment; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.templatemanager.spi.TemplateManager; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.dto.BellNotificationDto; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.dto.UnreadNotificationDto; +import io.mosip.resident.dto.UserInfoDto; +import io.mosip.resident.entity.ResidentSessionEntity; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.entity.ResidentUserEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.CardNotReadyException; +import io.mosip.resident.exception.EventIdNotPresentException; +import io.mosip.resident.exception.InvalidRequestTypeCodeException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.repository.ResidentSessionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.repository.ResidentUserRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; + +/** + * @author Kamesh Shekhar Prasad + * Test class to test download card service method. + */ + +@RunWith(SpringRunner.class) +public class ResidentServiceDownloadCardTest { + + private static final String LOCALE_EN_US = "en-US"; + + @InjectMocks + private ResidentServiceImpl residentServiceImpl; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private ResidentCredentialServiceImpl residentCredentialServiceImpl; + + @Mock + private Environment environment; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private ObjectStoreHelper objectStoreHelper; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private ResidentUserRepository residentUserRepository; + + @Mock + private ResidentSessionRepository residentSessionRepository; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private TemplateManager templateManager; + + @Mock + private EntityManager entityManager; + + @Mock + private Utility utility; + + private String eventId; + + private Optional residentTransactionEntity; + + @Before + public void setup() throws Exception { + eventId = "123"; + residentTransactionEntity = Optional.of(new ResidentTransactionEntity()); + residentTransactionEntity.get().setEventId(eventId); + residentTransactionEntity.get().setRequestTypeCode(RequestType.UPDATE_MY_UIN.toString()); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(ApiName.DIGITAL_CARD_STATUS_URL.toString()); + Mockito.when(objectStoreHelper.decryptData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("ZGF0YQ=="); + ReflectionTestUtils.setField(residentServiceImpl, "onlineVerificationPartnerId", "partner1"); + Mockito.when( + templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn("file text template"); + } + + @Test + public void testUpdateMyUinSuccess() throws Exception { + String digitalCardStatusUri= "http://datashare.datashare/123"; + residentTransactionEntity.get().setReferenceLink(digitalCardStatusUri); + residentTransactionEntity.get().setStatusCode(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name()); + Mockito.when(residentTransactionRepository.findByEventId(Mockito.anyString())).thenReturn(residentTransactionEntity); + when(residentServiceRestClient.getApi(URI.create(digitalCardStatusUri), byte[].class)) + .thenReturn("data".getBytes()); + Tuple2 response = residentServiceImpl.downloadCard(eventId); + assertNotNull(response.getT1()); + } + + @Test(expected = EventIdNotPresentException.class) + public void testEventIdNotPresentException() throws ResidentServiceCheckedException { + Mockito.when(residentTransactionRepository.findByEventId(Mockito.anyString())).thenReturn(Optional.empty()); + residentServiceImpl.downloadCard(eventId); + } + + @Test(expected = InvalidRequestTypeCodeException.class) + public void testInvalidRequestTypeCodeException() throws ResidentServiceCheckedException { + residentTransactionEntity.get().setRequestTypeCode(RequestType.REVOKE_VID.name()); + Mockito.when(residentTransactionRepository.findByEventId(Mockito.anyString())).thenReturn(residentTransactionEntity); + residentServiceImpl.downloadCard(eventId); + } + + @Test + public void testGetUserInfo() throws ApisResourceAccessException, ResidentServiceCheckedException{ + Mockito.when(identityServiceImpl.getClaimFromIdToken(Mockito.anyString())).thenReturn("claim"); + ResidentSessionEntity residentUserEntity = new ResidentSessionEntity(); + residentUserEntity.setHost("localhost"); + residentUserEntity.setIdaToken("123"); + residentUserEntity.setIpAddress("http"); + residentUserEntity.setSessionId("123");; + Optional response = Optional.of(residentUserEntity); + Mockito.when(residentSessionRepository.findFirst2ByIdaTokenOrderByLoginDtimesDesc(Mockito.anyString())).thenReturn(List.of(residentUserEntity)); + ResponseWrapper responseWrapper = residentServiceImpl.getUserinfo("123", null, 0, LOCALE_EN_US); + assertEquals(responseWrapper.getResponse().getFullName(), responseWrapper.getResponse().getFullName()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetUserInfoFailed() throws ApisResourceAccessException, ResidentServiceCheckedException { + Mockito.when(identityServiceImpl.getClaimFromIdToken(Mockito.anyString())).thenReturn("claim"); + Optional response = Optional.empty(); + Mockito.when(residentUserRepository.findById(Mockito.anyString())).thenReturn(response); + ResponseWrapper responseWrapper = residentServiceImpl.getUserinfo("123", null, 0, LOCALE_EN_US); + assertEquals(responseWrapper.getResponse().getFullName(), responseWrapper.getResponse().getFullName()); + } + + @Test + public void testDownloadServiceHistory() throws ResidentServiceCheckedException, IOException { + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setEventId("123"); + PageDto responseDtoPageDto= new PageDto<>(); + responseDtoPageDto.setData(List.of(serviceHistoryResponseDto)); + responseWrapper.setResponse(responseDtoPageDto); + Mockito.when(templateManager.merge(any(), any())).thenReturn(new ByteArrayInputStream("pdf".getBytes())); + Mockito.when(utility.signPdf(any(), any())).thenReturn("pdf".getBytes(StandardCharsets.UTF_8)); + byte[] pdfDocument = residentServiceImpl.downLoadServiceHistory(responseWrapper, "eng", + LocalDateTime.now(), LocalDate.now(), LocalDate.now(), + ServiceType.SERVICE_REQUEST.name(), "SUCCESS", 0, LOCALE_EN_US); + assertNotNull(pdfDocument); + } + + @Test + public void testDownloadServiceHistorySuccess() throws ResidentServiceCheckedException, IOException { + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setEventId("123"); + serviceHistoryResponseDto.setDescription(null); + PageDto responseDtoPageDto= new PageDto<>(); + responseDtoPageDto.setData(List.of(serviceHistoryResponseDto)); + responseWrapper.setResponse(responseDtoPageDto); + Mockito.when(templateManager.merge(any(), any())).thenReturn(new ByteArrayInputStream("pdf".getBytes())); + Mockito.when(utility.signPdf(any(), any())).thenReturn("pdf".getBytes(StandardCharsets.UTF_8)); + byte[] pdfDocument = residentServiceImpl.downLoadServiceHistory(responseWrapper, "eng", + null, null, null, + null, null, 0, LOCALE_EN_US); + assertNotNull(pdfDocument); + } + + @Test + public void testDownloadServiceHistoryFail() throws ResidentServiceCheckedException, IOException { + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setEventId("123"); + PageDto responseDtoPageDto= new PageDto<>(); + responseDtoPageDto.setData(null); + responseWrapper.setResponse(responseDtoPageDto); + Mockito.when(templateManager.merge(any(), any())).thenReturn(new ByteArrayInputStream("pdf".getBytes())); + Mockito.when(utility.signPdf(any(), any())).thenReturn("pdf".getBytes(StandardCharsets.UTF_8)); + byte[] pdfDocument = residentServiceImpl.downLoadServiceHistory(responseWrapper, "eng", + LocalDateTime.now(), LocalDate.now(), LocalDate.now(), + ServiceType.SERVICE_REQUEST.name(), "SUCCESS", 0, LOCALE_EN_US); + assertNotNull(pdfDocument); + } + + @Test + public void testGetUnreadNotifyList() throws ResidentServiceCheckedException, ApisResourceAccessException{ + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenReturn("123"); + ResidentTransactionEntity residentTransactionEntity1 = new ResidentTransactionEntity(); + residentTransactionEntity1.setEventId("123"); + Page residentTransactionEntityPage = + new PageImpl<>(List.of(residentTransactionEntity1)); + ResponseWrapper> responseWrapper = new ResponseWrapper<>(); + ServiceHistoryResponseDto serviceHistoryResponseDto = new ServiceHistoryResponseDto(); + serviceHistoryResponseDto.setEventId("123"); + PageDto responseDtoPageDto= new PageDto<>(); + responseDtoPageDto.setData(List.of(serviceHistoryResponseDto)); + responseWrapper.setResponse(responseDtoPageDto); + ResponseWrapper responseWrapper1 = new ResponseWrapper<>(); + Map templateResponse = new LinkedHashMap<>(); + templateResponse.put(ResidentConstants.FILE_TEXT, "test"); + responseWrapper1.setResponse(templateResponse); + residentServiceImpl.getNotificationList(0,10,"123","eng",0, LOCALE_EN_US); + } + + @Test + public void testUpdatebellClickdttimes() throws ApisResourceAccessException, ResidentServiceCheckedException{ + ResidentUserEntity residentUserEntity = new ResidentUserEntity(); + residentUserEntity.setIdaToken("123"); + Optional response = Optional.of(residentUserEntity); + Mockito.when(residentUserRepository.findById(Mockito.anyString())).thenReturn(response); + assertEquals(0, residentServiceImpl.updatebellClickdttimes("123")); + } + + @Test + public void testUpdatebellClickdttimesNewRecord() throws ApisResourceAccessException, ResidentServiceCheckedException{ + Optional response = Optional.empty(); + Mockito.when(residentUserRepository.findById(Mockito.anyString())).thenReturn(response); + assertEquals(1, residentServiceImpl.updatebellClickdttimes("123")); + } + + @Test + public void testGetbellClickdttimes(){ + ResidentUserEntity residentUserEntity = new ResidentUserEntity(); + residentUserEntity.setIdaToken("123"); + residentUserEntity.setLastbellnotifDtimes(LocalDateTime.of(2015, 12, 3, 4, 4, 4)); + Optional response = Optional.of(residentUserEntity); + Mockito.when(residentUserRepository.findById(Mockito.anyString())).thenReturn(response); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + BellNotificationDto bellNotificationDto = new BellNotificationDto(); + bellNotificationDto.setLastbellnotifclicktime(LocalDateTime.now()); + responseWrapper.setResponse(bellNotificationDto); + assertEquals(LocalDateTime.of(2015, 12, 3, 4, 4, 4), + residentServiceImpl.getbellClickdttimes("123").getResponse().getLastbellnotifclicktime()); + } + + @Test + public void testGetnotificationCount() throws ApisResourceAccessException, ResidentServiceCheckedException{ + ResidentSessionEntity residentUserEntity = new ResidentSessionEntity(); + residentUserEntity.setHost("localhost"); + residentUserEntity.setIdaToken("123"); + residentUserEntity.setIpAddress("http"); + residentUserEntity.setLoginDtimes(LocalDateTime.of(2015, 12, 3, 4, 4, 4)); + Optional response = Optional.of(residentUserEntity); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + UnreadNotificationDto unreadServiceNotificationDto = new UnreadNotificationDto(); + unreadServiceNotificationDto.setUnreadCount(4L); + responseWrapper.setResponse(unreadServiceNotificationDto); + Mockito.when(residentTransactionRepository.countByIdAndUnreadStatusForRequestTypes(Mockito.anyString(), Mockito.anyList(), Mockito.anyString())).thenReturn(4L); + assertEquals(Optional. of(4L), Optional.ofNullable(residentServiceImpl. + getnotificationCount("123").getResponse().getUnreadCount())); + } + + @Test + public void testGetnotificationCountLastLoginTime() throws ApisResourceAccessException, ResidentServiceCheckedException{ + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + UnreadNotificationDto unreadServiceNotificationDto = new UnreadNotificationDto(); + unreadServiceNotificationDto.setUnreadCount(4L); + responseWrapper.setResponse(unreadServiceNotificationDto); + ResidentSessionEntity residentUserEntity = new ResidentSessionEntity(); + residentUserEntity.setHost("localhost"); + residentUserEntity.setIdaToken("123"); + residentUserEntity.setIpAddress("http"); + Optional response = Optional.of(residentUserEntity); + ResidentUserEntity residentUserEntity1 = new ResidentUserEntity(); + residentUserEntity1.setLastbellnotifDtimes(LocalDateTime.now()); + residentUserEntity1.setIdaToken("123"); + Mockito.when(residentUserRepository.findById(Mockito.anyString())).thenReturn(Optional.of(residentUserEntity1)); + Mockito.when(residentSessionRepository.findById(Mockito.anyString())).thenReturn(response); + Mockito.when(residentTransactionRepository.countByIdAndUnreadStatusForRequestTypes(Mockito.anyString(), Mockito.anyList(), Mockito.anyString())).thenReturn(4L); + assertEquals(Optional. of(0L), Optional.ofNullable(residentServiceImpl. + getnotificationCount("123").getResponse().getUnreadCount())); + } + + @Test + public void testVidCardSuccess() throws Exception { + String digitalCardStatusUri= "http://datashare.datashare/123"; + residentTransactionEntity.get().setRequestTypeCode(RequestType.VID_CARD_DOWNLOAD.name()); + residentTransactionEntity.get().setReferenceLink(digitalCardStatusUri); + residentTransactionEntity.get().setStatusCode(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name()); + Mockito.when(residentTransactionRepository.findByEventId(Mockito.anyString())).thenReturn(residentTransactionEntity); + when(residentServiceRestClient.getApi(URI.create(digitalCardStatusUri), byte[].class)) + .thenReturn("data".getBytes()); + Tuple2 response = residentServiceImpl.downloadCard(eventId); + assertNotNull(response.getT1()); + } + + @Test(expected = CardNotReadyException.class) + public void testVidCardFailed() throws Exception { + String digitalCardStatusUri= "http://datashare.datashare/123"; + residentTransactionEntity.get().setRequestTypeCode(RequestType.VID_CARD_DOWNLOAD.name()); + residentTransactionEntity.get().setReferenceLink(digitalCardStatusUri); + residentTransactionEntity.get().setStatusCode(EventStatusSuccess.CARD_READY_TO_DOWNLOAD.name()); + Mockito.when(residentTransactionRepository.findByEventId(Mockito.anyString())).thenReturn(residentTransactionEntity); + when(residentServiceRestClient.getApi(URI.create(digitalCardStatusUri), byte[].class)) + .thenReturn("".getBytes()); + residentServiceImpl.downloadCard(eventId); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetEventStatusTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetEventStatusTest.java new file mode 100644 index 00000000000..3126cb099d8 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetEventStatusTest.java @@ -0,0 +1,177 @@ +package io.mosip.resident.service.impl; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.EventStatusResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * This class is used to test the get Status service + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +public class ResidentServiceGetEventStatusTest { + + private static final String LOCALE_EN_US = "en-US"; + + @InjectMocks + private ResidentService residentService = new ResidentServiceImpl(); + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private RequestValidator validator; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private ResidentServiceRestClient restClient; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private Environment environment; + + private String eventId; + private String langCode; + private ResponseWrapper responseWrapper; + private EventStatusResponseDTO eventStatusResponseDTO; + private Optional residentTransactionEntity; + private RequestType requestType; + Map templateVariables; + + @Before + public void setup() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + eventId = "123456789"; + requestType = RequestType.AUTHENTICATION_REQUEST; + langCode = "eng"; + responseWrapper = new ResponseWrapper<>(); + templateVariables = new java.util.HashMap<>(); + eventStatusResponseDTO = new EventStatusResponseDTO(); + residentTransactionEntity = Optional.of(new ResidentTransactionEntity()); + eventStatusResponseDTO.setEventId("123456789"); + eventStatusResponseDTO.setEventStatus("COMPLETED"); + responseWrapper.setResponse(eventStatusResponseDTO); + residentTransactionEntity.get().setRequestTypeCode(RequestType.AUTHENTICATION_REQUEST.name()); + residentTransactionEntity.get().setStatusCode(EventStatusSuccess.AUTHENTICATION_SUCCESSFULL.name()); + residentTransactionEntity.get().setEventId(eventId); + residentTransactionEntity.get().setLangCode(langCode); + residentTransactionEntity.get().setRequestSummary("requestSummary"); + residentTransactionEntity.get().setRequestTypeCode(requestType.name()); + residentTransactionEntity.get().setCrDtimes(LocalDateTime.now()); + residentTransactionEntity.get().setTokenId("123456789"); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + templateVariables.put(TemplateVariablesConstants.EVENT_ID, eventId); + templateVariables.put(TemplateVariablesConstants.AUTHENTICATION_MODE, "OTP"); + templateVariables.put(TemplateVariablesConstants.PARTNER_NAME, "partnerName"); + templateVariables.put(TemplateVariablesConstants.PURPOSE, "authentication"); + templateVariables.put(TemplateVariablesConstants.EVENT_STATUS_ENUM, EventStatus.SUCCESS.name()); + Mockito.when(requestType.getAckTemplateVariables(templateUtil, Mockito.any(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn(Tuples.of(templateVariables, "")); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("123456789"); + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenReturn("123456789"); + Mockito.when(templateUtil.getPurposeTemplateTypeCode(Mockito.any(), Mockito.any())).thenReturn("template-type-code"); + Mockito.when(templateUtil.getSummaryTemplateTypeCode(Mockito.any(), Mockito.any())).thenReturn("template-type-code"); + Mockito.when(templateUtil.getEventStatusBasedOnLangcode(Mockito.any(), Mockito.any())).thenReturn("SUCCESS"); + Mockito.when(templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn("success").thenReturn("Authentication is successful"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test + public void getEventStatusTest() throws ResidentServiceCheckedException { + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } + + @Test + public void getEventStatusTestVid() throws ResidentServiceCheckedException { + Mockito.when(validator.validateVid(Mockito.anyString())).thenReturn(true); + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } + + @Test + public void getEventStatusTestUIN() throws ResidentServiceCheckedException { + Mockito.when(validator.validateUin(Mockito.anyString())).thenReturn(true); + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } + + @Test + public void getEventStatusTestEventStatusFailure() throws ResidentServiceCheckedException { + residentTransactionEntity.get().setStatusCode(EventStatusFailure.AUTHENTICATION_FAILED.name()); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + templateVariables.put(TemplateVariablesConstants.EVENT_STATUS_ENUM, EventStatus.FAILED.name()); + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } + + @Test + public void getEventStatusTestEventStatusPending() throws ResidentServiceCheckedException{ + residentTransactionEntity.get().setStatusCode("in-progress"); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity); + templateVariables.put(TemplateVariablesConstants.EVENT_STATUS_ENUM, EventStatus.IN_PROGRESS.name()); + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void getEventStatusTestException() throws ResidentServiceCheckedException { + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(Optional.empty()); + residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void getEventStatusNestedIfTest() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenReturn("abcd"); + residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void getEventStatusThrowsExceptionTest() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenThrow(new ApisResourceAccessException()); + residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + } + + @Test + public void getEventStatusServiceTypeNotMappedTest() throws ResidentServiceCheckedException { + Mockito.when(RequestType.SEND_OTP.getAckTemplateVariables(templateUtil, residentTransactionEntity.get(), "eng", 0, LOCALE_EN_US)). + thenReturn(Tuples.of(templateVariables, "acknowledgement-order-a-physical-card")); + residentTransactionEntity.get().setRequestTypeCode(RequestType.SEND_OTP.name()); + ResponseWrapper resultResponseWrapper =residentService.getEventStatus(eventId, langCode, 0, LOCALE_EN_US); + assert resultResponseWrapper.getResponse().getEventId().equals(eventId); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetServiceHistoryTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetServiceHistoryTest.java new file mode 100644 index 00000000000..73ce2c4608b --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceGetServiceHistoryTest.java @@ -0,0 +1,481 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; + +import java.io.IOException; +import java.math.BigInteger; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AutnTxnDto; +import io.mosip.resident.dto.PageDto; +import io.mosip.resident.dto.RegistrationStatusDTO; +import io.mosip.resident.dto.RegistrationStatusResponseDTO; +import io.mosip.resident.dto.ServiceHistoryResponseDto; +import io.mosip.resident.entity.ResidentSessionEntity; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentSessionRepository; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.ProxyIdRepoService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.TemplateUtil; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import io.mosip.resident.validator.RequestValidator; +import reactor.util.function.Tuples; + +/** + * This class is used to test the get service history service + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +public class ResidentServiceGetServiceHistoryTest { + + private static final String LOCALE_EN_US = "en-US"; + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + + @InjectMocks + private ResidentServiceImpl residentServiceImpl; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private RequestValidator validator; + + @Mock + private Utilities utilities; + + @Mock + private PartnerServiceImpl partnerServiceImpl; + + @Mock + private IdAuthService idAuthServiceImpl; + + @Mock + private Environment environment; + + @Mock + private ResidentSessionRepository residentSessionRepository; + + @Mock + private Utility utility; + + @Mock + private TemplateUtil templateUtil; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private EntityManager entityManager; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + List details = null; + + private int pageStart; + private int pageSize; + private LocalDate fromDate; + private LocalDate toDate; + private String serviceType; + private String sortType; + List serviceHistoryResponseDto; + private ArrayList partnerIds; + List residentTransactionEntityList; + ResidentTransactionEntity residentTransactionEntity; + private String statusFilter; + private String searchText; + + private ResponseWrapper> responseWrapper; + + private ResidentSessionEntity residentSessionEntity; + + private Query query; + + @Before + public void setup() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + statusFilter = EventStatus.SUCCESS.toString(); + searchText = "1"; + details = new ArrayList<>(); + pageSize = 10; + pageStart = 2; + serviceType = "AUTHENTICATION_REQUEST"; + sortType = "ASC"; + serviceHistoryResponseDto = new ArrayList<>(); + partnerIds = new ArrayList<>(); + residentTransactionEntityList = new ArrayList<>(); + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("eventId"); + responseWrapper = new ResponseWrapper<>(); + residentTransactionEntity.setRequestTrnId("12345"); + residentTransactionEntity.setStatusComment("Success"); + residentTransactionEntity.setCrDtimes(LocalDateTime.now()); + residentTransactionEntity.setStatusCode(EventStatusSuccess.AUTHENTICATION_SUCCESSFULL.toString()); + residentTransactionEntityList.add(residentTransactionEntity); + + partnerIds.add("m-partner-default-auth"); + partnerIds.add("MOVP"); + + query = Mockito.mock(Query.class); + Mockito.when(entityManager.createNativeQuery(Mockito.anyString(), (Class) any())).thenReturn(query); + Mockito.when(entityManager.createNativeQuery(Mockito.anyString())).thenReturn(query); + Mockito.when(query.getSingleResult()).thenReturn(BigInteger.valueOf(1)); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn("8251649601"); + Mockito.when(identityServiceImpl.getIDAToken(Mockito.anyString(), Mockito.anyString())).thenReturn("346697314566835424394775924659202696"); + Mockito.when(partnerServiceImpl.getPartnerDetails(Mockito.anyString())).thenReturn(partnerIds); + + Mockito.when(identityServiceImpl.getAvailableclaimValue(Mockito.anyString())).thenReturn("Kamesh"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + residentSessionEntity = new ResidentSessionEntity(); + residentSessionEntity.setHost("localhost"); + Mockito.when(residentSessionRepository.findFirst2ByIdaTokenOrderByLoginDtimesDesc( + Mockito.anyString())).thenReturn(List.of(residentSessionEntity)); + Mockito.when(identityServiceImpl.getResidentIdaToken()).thenReturn("1234"); + + Mockito.when(templateUtil.getPurposeTemplateTypeCode(any(), any())).thenReturn("template-type-code"); + Mockito.when(templateUtil.getSummaryTemplateTypeCode(any(), any())).thenReturn("template-type-code"); + Mockito.when(templateUtil.getEventStatusBasedOnLangcode(Mockito.any(), Mockito.any())).thenReturn("SUCCESS"); + Mockito.when(templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn("success").thenReturn("Authentication is successful"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + ReflectionTestUtils.setField(residentServiceImpl, "onlineVerificationPartnerId", "m-partner-default-auth"); + } + + private void getEntityData() { + List entitiesList = new ArrayList<>(); + entitiesList = residentTransactionEntityList.stream().map(obj -> { + Object[] objArr = new Object[13]; + objArr[0] = obj.getEventId(); + objArr[1] = obj.getRequestTypeCode(); + objArr[2] = obj.getStatusCode(); + objArr[3] = obj.getStatusComment(); + objArr[4] = obj.getRefIdType(); + objArr[5] = obj.getRefId(); + objArr[6] = obj.getCrDtimes(); + objArr[7] = obj.getUpdDtimes(); + objArr[8] = obj.isReadStatus(); + objArr[9] = obj.getPinnedStatus(); + objArr[10] = obj.getPurpose(); + objArr[11] = obj.getAttributeList(); + objArr[12] = obj.getAuthTypeCode(); + return objArr; + }).collect(Collectors.toList()); + Mockito.when(residentTransactionRepository.findByTokenId(Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), + Mockito.anyString(), Mockito.anyList())).thenReturn(entitiesList); + Mockito.when(residentTransactionRepository.countByTokenId(Mockito.anyString(), + Mockito.anyString(), Mockito.anyList())).thenReturn(residentTransactionEntityList.size()); + } + + @Test + public void testGetServiceHistorySuccess() throws ResidentServiceCheckedException, ApisResourceAccessException { + pageStart = 2; + pageSize = 3; + fromDate = LocalDate.now(); + toDate = LocalDate.now(); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, null, null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), serviceType, "DESC", statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testGetServiceHistoryDateNullCheck() throws ResidentServiceCheckedException, ApisResourceAccessException { + pageStart = 2; + pageSize = 3; + + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, serviceType, "DESC", statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, serviceType, "DESC", statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + + } + + @Test + public void testGetServiceHistoryNullCheck() throws ResidentServiceCheckedException, ApisResourceAccessException { + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testGetServiceHistoryAllStatusFilter() throws ResidentServiceCheckedException, ApisResourceAccessException { + fromDate = LocalDate.now(); + toDate = LocalDate.now(); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, serviceType, + sortType, statusFilter, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetServiceHistoryCheckedException() throws ResidentServiceCheckedException, ApisResourceAccessException { + Integer pageStart = 1; + Integer pageSize = 1; + Mockito.when(residentServiceImpl.getServiceHistory( -1, pageSize, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US)).thenThrow(ResidentServiceCheckedException.class); + Mockito.when(residentServiceImpl.getServiceHistory( pageStart, -1, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US)).thenThrow(ResidentServiceCheckedException.class); + Mockito.when(residentServiceImpl.getServiceHistory( pageStart, 1, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US)).thenThrow(ResidentServiceCheckedException.class); + assertEquals(0, residentServiceImpl.getServiceHistory( -1, pageSize, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(0, residentServiceImpl.getServiceHistory( pageStart, -1, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetServiceHistoryNegativeResidentServiceCheckedException() throws ResidentServiceCheckedException, ApisResourceAccessException { + Integer pageStart = 1; + Mockito.when(residentServiceImpl.getServiceHistory( pageStart, -1, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US)).thenThrow(ResidentServiceCheckedException.class); + assertEquals(0, residentServiceImpl.getServiceHistory( pageStart, -1, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testPageSizeCheck() throws ResidentServiceCheckedException, ApisResourceAccessException { + pageSize = 10; + pageStart = 1; + assertEquals(10, residentServiceImpl.getServiceHistory(null, null, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(null, pageSize, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, null, fromDate, toDate, serviceType, sortType, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testSortTypeNullCheck() throws ResidentServiceCheckedException, ApisResourceAccessException { + pageStart = 1; + pageSize = 10; + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, serviceType, + null, statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testServiceHistoryWithDifferentParameters() throws ResidentServiceCheckedException, ApisResourceAccessException { + pageStart = 1; + pageSize = 10; + fromDate = LocalDate.MAX; + toDate = LocalDate.MIN; + serviceType = ServiceType.AUTHENTICATION_REQUEST.toString(); + sortType = "ASC"; + statusFilter = "SUCCESS"; + searchText = "a"; + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, serviceType, sortType, + statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, "ALL", sortType, + statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, "ALL", sortType, + statusFilter, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, serviceType, sortType, + null, "a", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, "ALL", sortType, + null, "a", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, null, sortType, + statusFilter, "a", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, fromDate, toDate, "ALL", sortType, + null, "a", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testGetServiceHistoryWithStatusFilterServiceType() throws ResidentServiceCheckedException, ApisResourceAccessException { + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), + ServiceType.ALL.toString(), sortType, + "SUCCESS", null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + ServiceType.AUTHENTICATION_REQUEST.toString(), sortType, + "In Progress", null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + ServiceType.AUTHENTICATION_REQUEST.toString(), sortType, + null, "1", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, sortType, + "SUCCESS", "1", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), + ServiceType.AUTHENTICATION_REQUEST.toString(), sortType, + null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), + null, sortType, + null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + ServiceType.AUTHENTICATION_REQUEST.toString(), sortType, + null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, sortType, + "FAILED", null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, sortType, + null, "123", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testGetServiceHistoryWithUpdatedDtimes() throws ResidentServiceCheckedException, ApisResourceAccessException { + residentTransactionEntity.setUpdDtimes(LocalDateTime.now()); + residentTransactionEntity.setRequestTypeCode(RequestType.REVOKE_VID.name()); + residentTransactionEntity.setAuthTypeCode("OTP"); + residentTransactionEntityList.add(residentTransactionEntity); + getEntityData(); + assertEquals(10, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, sortType, + null, "123", "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + + } + @Test + public void testGetAidStatus() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("10087100401001420220929210144"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + Mockito.when(idAuthServiceImpl.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + Mockito.when(identityServiceImpl.getIdAndTypeForIndividualId(Mockito.anyString())).thenReturn(Tuples.of("2476302389", IdType.UIN)); + assertEquals("PROCESSED", residentServiceImpl.getAidStatus(aidStatusRequestDTO, true).getAidStatus()); + } + + @Test + public void testGetAidStatusOtpValidationFalse() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("10087100401001420220929210144"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + Mockito.when(idAuthServiceImpl.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + Mockito.when(identityServiceImpl.getIdAndTypeForIndividualId(Mockito.anyString())).thenReturn(Tuples.of("2476302389", IdType.UIN)); + assertEquals("PROCESSED", residentServiceImpl.getAidStatus(aidStatusRequestDTO, false).getAidStatus()); + } + + @Test + public void testGetAidStatusOtpValidationException() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("10087100401001420220929210144"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + Mockito.when(idAuthServiceImpl.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + Mockito.when(identityServiceImpl.getIdAndTypeForIndividualId(Mockito.anyString())).thenReturn(null); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + RegistrationStatusResponseDTO registrationStatusResponseDTO = new RegistrationStatusResponseDTO(); + RegistrationStatusDTO registrationStatusDTO = new RegistrationStatusDTO(); + registrationStatusDTO.setStatusCode("FAILED"); + registrationStatusResponseDTO.setResponse(List.of(registrationStatusDTO)); + Mockito.when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(registrationStatusResponseDTO); + assertEquals("UNDER PROCESSING", residentServiceImpl.getAidStatus(aidStatusRequestDTO, false).getAidStatus()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAidStatusOtpValidationResidentServiceCheckedException() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("10087100401001420220929210144"); + aidStatusRequestDTO.setOtp("111111"); + aidStatusRequestDTO.setTransactionId("1234567890"); + Mockito.when(idAuthServiceImpl.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true); + Mockito.when(identityServiceImpl.getIdAndTypeForIndividualId(Mockito.anyString())).thenReturn(null); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + Mockito.when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(null); + assertEquals("UNDER PROCESSING", residentServiceImpl.getAidStatus(aidStatusRequestDTO, false).getAidStatus()); + } + + @Test + public void testGetUserinfo() throws ApisResourceAccessException, ResidentServiceCheckedException { + assertEquals("Kamesh", + residentServiceImpl.getUserinfo("ida_token", null, 0, LOCALE_EN_US).getResponse().getFullName()); + } + + @Test + public void testGetUserinfoMultipleLoginTime() throws ApisResourceAccessException, ResidentServiceCheckedException { + Mockito.when(residentSessionRepository.findFirst2ByIdaTokenOrderByLoginDtimesDesc( + Mockito.anyString())).thenReturn(List.of(residentSessionEntity, residentSessionEntity)); + assertEquals("Kamesh", + residentServiceImpl.getUserinfo("ida_token", null, 0, LOCALE_EN_US).getResponse().getFullName()); + } + + @Test + public void testGetFileName(){ + Mockito.when(utility.getFileName(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyString())).thenReturn("Ack"); + assertEquals("Ack", residentServiceImpl.getFileName("123", IdType.UIN, 0, LOCALE_EN_US)); + } + + @Test + public void testGetSummaryForLangCode() throws ResidentServiceCheckedException { + Mockito.when(templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn("Success"); + residentServiceImpl.getSummaryForLangCode(residentTransactionEntity, "eng", "SUCCESS", + RequestType.AUTHENTICATION_REQUEST); + } + + @Test + public void testGetSummaryForLangCodeFailure() throws ResidentServiceCheckedException { + Mockito.when(templateUtil.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())) + .thenReturn("Success"); + residentServiceImpl.getSummaryForLangCode(residentTransactionEntity, "eng", "Failed", + RequestType.AUTHENTICATION_REQUEST); + } + + @Test + public void testGetServiceHistorySuccessWithUpdatedTimes() throws ResidentServiceCheckedException, ApisResourceAccessException { + residentTransactionEntity.setStatusCode(EventStatusSuccess.AUTHENTICATION_SUCCESSFULL.toString()); + residentTransactionEntity.setCrDtimes(LocalDateTime.now().minusMinutes(1)); + residentTransactionEntity.setUpdDtimes(LocalDateTime.now()); + residentTransactionEntity.setAuthTypeCode("OTP"); + residentTransactionEntityList.add(residentTransactionEntity); + getEntityData(); + pageStart = 2; + pageSize = 3; + fromDate = LocalDate.now(); + toDate = LocalDate.now(); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, null, null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), serviceType, "DESC", statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + + @Test + public void testGetServiceHistorySuccessWithServiceTypeALL() throws ResidentServiceCheckedException, ApisResourceAccessException { + residentTransactionEntity.setStatusCode(EventStatusSuccess.AUTHENTICATION_SUCCESSFULL.toString()); + residentTransactionEntity.setCrDtimes(LocalDateTime.now().minusMinutes(1)); + residentTransactionEntity.setUpdDtimes(LocalDateTime.now()); + residentTransactionEntity.setAuthTypeCode("OTP"); + residentTransactionEntityList.add(residentTransactionEntity); + getEntityData(); + pageStart = 2; + pageSize = 3; + fromDate = LocalDate.now(); + toDate = LocalDate.now(); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, null, null, + null, null, null, null, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + assertEquals(3, residentServiceImpl.getServiceHistory(pageStart, pageSize, LocalDate.now(), LocalDate.now(), "ALL", "DESC", statusFilter, searchText, "eng", 0, LOCALE_EN_US).getResponse().getPageSize()); + } + @Test(expected = Exception.class) + public void reqUinUpdateValidateAuthIndividualIdWithUINFailure() throws Exception { + ReflectionTestUtils.invokeMethod(residentServiceImpl, "validateAuthIndividualIdWithUIN", "1234", "RID", null, null); + } + + @Test + public void testGetIdType(){ + assertEquals(IdType.RID,ReflectionTestUtils.invokeMethod(residentServiceImpl, "getIdType", "RID")); + } + + @Test + public void testGetIdTypeNull(){ + assertNull(ReflectionTestUtils.invokeMethod(residentServiceImpl, "getIdType", "aid")); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqAuthHistoryTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqAuthHistoryTest.java similarity index 92% rename from resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqAuthHistoryTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqAuthHistoryTest.java index c66c9485021..1dbee0934a2 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqAuthHistoryTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqAuthHistoryTest.java @@ -1,10 +1,11 @@ -package io.mosip.resident.test.service; +package io.mosip.resident.service.impl; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.junit.Before; import org.junit.Test; @@ -12,7 +13,6 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import io.mosip.resident.dto.AuthHistoryRequestDTO; @@ -24,8 +24,6 @@ import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.service.IdAuthService; import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; @RunWith(SpringRunner.class) public class ResidentServiceReqAuthHistoryTest { @InjectMocks @@ -34,9 +32,6 @@ public class ResidentServiceReqAuthHistoryTest { @Mock private IdAuthService idAuthService; - @Mock - private AuditUtil audit; - @Mock NotificationService notificationService; List details=null; @@ -50,8 +45,7 @@ public void setup() throws ApisResourceAccessException, ResidentServiceCheckedEx .thenReturn(true); Mockito.when(idAuthService.getAuthHistoryDetails(Mockito.anyString(), Mockito.any(), Mockito.any())) .thenReturn(details); - Mockito.when(notificationService.sendNotification(Mockito.any())).thenReturn(mock(NotificationResponseDTO.class)); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenReturn(mock(NotificationResponseDTO.class)); } @Test public void testReqAuthHistorySuccess() throws ResidentServiceCheckedException { @@ -94,7 +88,7 @@ public void testReqAuthHistoryDetailsFetchFailed() throws ApisResourceAccessExc } @Test(expected=ResidentServiceException.class) public void testReqAuthHistorySendNotificationFailed() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(notificationService.sendNotification(Mockito.any())).thenThrow(new ResidentServiceCheckedException()); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); AuthHistoryRequestDTO dto=new AuthHistoryRequestDTO(); dto.setOtp("1235"); dto.setTransactionID("1234567890"); diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqEUinTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqEUinTest.java similarity index 83% rename from resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqEUinTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqEUinTest.java index 78877747eec..b3cc8898d35 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqEUinTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqEUinTest.java @@ -1,17 +1,19 @@ -package io.mosip.resident.test.service; +package io.mosip.resident.service.impl; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; +import java.util.Map; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; +import io.mosip.resident.constant.CardType; import io.mosip.resident.constant.IdType; import io.mosip.resident.dto.EuinRequestDTO; import io.mosip.resident.dto.NotificationResponseDTO; @@ -21,9 +23,7 @@ import io.mosip.resident.exception.ResidentServiceException; import io.mosip.resident.service.IdAuthService; import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.UINCardDownloadService; +import io.mosip.resident.util.UINCardDownloadHelper; @RunWith(SpringRunner.class) public class ResidentServiceReqEUinTest { @@ -31,14 +31,11 @@ public class ResidentServiceReqEUinTest { ResidentServiceImpl residentServiceImpl; @Mock - private UINCardDownloadService uinCardDownloadService; + private UINCardDownloadHelper uinCardDownloadHelper; @Mock private IdAuthService idAuthService; - @Mock - private AuditUtil audit; - @Mock NotificationService notificationService; byte[] card=new byte[10]; @@ -47,9 +44,8 @@ public class ResidentServiceReqEUinTest { public void setup() throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) .thenReturn(true); - Mockito.when(uinCardDownloadService.getUINCard(Mockito.anyString(), Mockito.anyString(), Mockito.any())).thenReturn(card); - Mockito.when(notificationService.sendNotification(Mockito.any())).thenReturn(mock(NotificationResponseDTO.class)); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); + Mockito.when(uinCardDownloadHelper.getUINCard(Mockito.anyString(), Mockito.anyString(), Mockito.any())).thenReturn(card); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenReturn(mock(NotificationResponseDTO.class)); } @Test @@ -59,7 +55,7 @@ public void testReqEuin() throws ResidentServiceCheckedException { dto.setTransactionID("1234567890"); dto.setIndividualIdType(IdType.UIN.name()); dto.setIndividualId("123456789"); - dto.setCardType("UIN"); + dto.setCardType(CardType.UIN.name()); assertEquals(card, residentServiceImpl.reqEuin(dto)); } @Test @@ -75,7 +71,7 @@ public void testReqEuinwithVID() throws ResidentServiceCheckedException { @Test(expected=ResidentServiceException.class) public void testReqEuinUINCardFetchFailed() throws ResidentServiceCheckedException, ApisResourceAccessException { - Mockito.when(uinCardDownloadService.getUINCard(Mockito.anyString(),Mockito.anyString(), Mockito.any())).thenThrow(new ApisResourceAccessException("Unable to fetch uin card")); + Mockito.when(uinCardDownloadHelper.getUINCard(Mockito.anyString(),Mockito.anyString(), Mockito.any())).thenThrow(new ApisResourceAccessException("Unable to fetch uin card")); EuinRequestDTO dto=new EuinRequestDTO(); dto.setOtp("1235"); dto.setTransactionID("1234567890"); @@ -86,7 +82,7 @@ public void testReqEuinUINCardFetchFailed() throws ResidentServiceCheckedExcepti } @Test(expected=ResidentServiceException.class) public void testReqEuinSendNotificationFailed() throws ResidentServiceCheckedException, ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(notificationService.sendNotification(Mockito.any())).thenThrow(new ResidentServiceCheckedException()); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); EuinRequestDTO dto=new EuinRequestDTO(); dto.setOtp("1235"); dto.setTransactionID("1234567890"); diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqReprintTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqReprintTest.java similarity index 94% rename from resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqReprintTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqReprintTest.java index d672be51406..8723d1148b9 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceReqReprintTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceReqReprintTest.java @@ -1,4 +1,4 @@ -package io.mosip.resident.test.service; +package io.mosip.resident.service.impl; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -6,6 +6,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.junit.Before; import org.junit.Test; @@ -37,13 +38,15 @@ import io.mosip.resident.handler.service.UinCardRePrintService; import io.mosip.resident.service.IdAuthService; import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.service.ProxyIdRepoService; import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; @RunWith(SpringRunner.class) public class ResidentServiceReqReprintTest { + + @MockBean + private ProxyIdRepoService proxyIdRepoService; + @InjectMocks ResidentServiceImpl residentServiceImpl; @@ -65,9 +68,6 @@ public class ResidentServiceReqReprintTest { @Mock NotificationService notificationService; - @Mock - private AuditUtil audit; - private ResidentReprintRequestDto residentReqDto; @Before @@ -83,7 +83,6 @@ public void setUp() throws IOException, BaseCheckedException { PacketGeneratorResDto resDto = new PacketGeneratorResDto(); resDto.setRegistrationId("10008200070004620191203115734"); Mockito.when(rePrintService.createPacket(any())).thenReturn(resDto); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); } @@ -97,7 +96,7 @@ public void reqPrintUinTest() throws ResidentServiceCheckedException { NotificationResponseDTO notificationResponse = new NotificationResponseDTO(); notificationResponse.setMessage("Notification sent to registered contact details"); notificationResponse.setStatus("success"); - Mockito.when(notificationService.sendNotification(any())).thenReturn(notificationResponse); + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenReturn(notificationResponse); ResidentReprintResponseDto residentResponse = residentServiceImpl.reqPrintUin(residentReqDto); assertEquals("10008200070004620191203115734", residentResponse.getRegistrationId()); @@ -177,7 +176,7 @@ public void notificationServiceException() throws ApisResourceAccessException, O NotificationResponseDTO notificationResponse = new NotificationResponseDTO(); notificationResponse.setMessage("Notification sent to registered contact details"); notificationResponse.setStatus("success"); - Mockito.when(notificationService.sendNotification(any())) + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))) .thenThrow(new ResidentServiceCheckedException()); residentServiceImpl.reqPrintUin(residentReqDto); diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestAuthLockTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestAuthLockTest.java new file mode 100644 index 00000000000..718f0d494e5 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestAuthLockTest.java @@ -0,0 +1,262 @@ +/** + * + */ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idvalidator.spi.RidValidator; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockStatusResponseDtoV2; +import io.mosip.resident.dto.AuthLockTypeStatusDtoV2; +import io.mosip.resident.dto.AuthUnLockRequestDTO; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.UINCardDownloadHelper; + +/** + * @author M1022006 + * + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentServiceRequestAuthLockTest { + + @Mock + private VidValidator vidValidator; + + @Mock + private UinValidator uinValidator; + + @Mock + private RidValidator ridValidator; + + @Mock + private UINCardDownloadHelper uinCardDownloadHelper; + + @Mock + private IdAuthService idAuthService; + + @Mock + NotificationService notificationService; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @InjectMocks + private ResidentService residentService = new ResidentServiceImpl(); + + NotificationResponseDTO notificationResponseDTO; + + AuthLockOrUnLockRequestDto authLockRequestDto; + + @Before + public void setup() throws Exception { + + notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setStatus("Notification success"); + ReflectionTestUtils.setField(residentService, "authTypes", "otp,bio-FIR,bio-IIR,bio-FACE"); + authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setIndividualId("1234567889"); + authLockRequestDto.setOtp("1234"); + authLockRequestDto.setTransactionID("1234567898"); + List authTypesList=new ArrayList(); + authTypesList.add("otp"); + authTypesList.add("bio-FIR"); + authLockRequestDto.setAuthType(authTypesList); + Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), + authTypesList, AuthTypeStatus.LOCK, null)).thenReturn(true); + } + + @Test + public void testReqAauthLockSuccess() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(true); + ResponseDTO response = new ResponseDTO(); + response.setMessage("Notification success"); + + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + ResponseDTO authLockResponse = residentService.reqAauthTypeStatusUpdate(authLockRequestDto, + AuthTypeStatus.LOCK); + assertEquals(authLockResponse.getMessage(), authLockResponse.getMessage()); + + } + + @Test(expected = ResidentServiceException.class) + public void testReqAauthLockOTPFailed() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(false); + + residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); + + } + + @Test(expected = ResidentServiceException.class) + public void testReqAauthLockFailed() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(true); + + Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), + authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)).thenReturn(false); + residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); + + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testReqAauthLockNotificationFailed() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(true); + + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))) + .thenThrow(new ResidentServiceCheckedException()); + residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); + + } + + @Test(expected = ResidentServiceException.class) + public void testReqAauthLockException() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(true); + + Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), + authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)) + .thenThrow(new ApisResourceAccessException()); + + residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); + + } + + @Test(expected = ResidentServiceException.class) + public void testReqAuthUnLockException() throws OtpValidationFailedException, ApisResourceAccessException, ResidentServiceCheckedException { + Mockito.when(idAuthService.validateOtp(any(), any(), any())).thenReturn(true); + + AuthUnLockRequestDTO authUnLockRequestDTO = new AuthUnLockRequestDTO(); + authUnLockRequestDTO.setIndividualId("12344567"); + authUnLockRequestDTO.setOtp("12345"); + authUnLockRequestDTO.setTransactionID("12345"); + authUnLockRequestDTO.setUnlockForSeconds(String.valueOf(-1L)); + + Mockito.lenient().when(idAuthService.authTypeStatusUpdate(authUnLockRequestDTO.getIndividualId(), + authUnLockRequestDTO.getAuthType(), AuthTypeStatus.UNLOCK, null)) + .thenThrow(new ApisResourceAccessException()); + residentService.reqAauthTypeStatusUpdate(authUnLockRequestDTO, AuthTypeStatus.UNLOCK); + } + + @Test(expected = ResidentServiceException.class) + public void testReqAauthLockOTPFailedException() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + + Mockito.when(idAuthService.validateOtp(any(), any(), any())) + .thenThrow(new OtpValidationFailedException()); + + residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); + + } + + @Test + public void testGetAuthLockStatus() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV2 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV2.setLocked(true); + authLockTypeStatusDtoV2.setAuthType("OTP"); + authLockTypeStatusDtoV2.setRequestId("1234"); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV21 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV21.setAuthType("Phone"); + authLockTypeStatusDtoV21.setLocked(true); + AuthLockStatusResponseDtoV2 authLockStatusResponseDtoV2 = new AuthLockStatusResponseDtoV2(); + authLockStatusResponseDtoV2.setAuthTypes(List.of(authLockTypeStatusDtoV2, authLockTypeStatusDtoV21)); + responseWrapper.setResponse(authLockStatusResponseDtoV2); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + residentService.getAuthLockStatus("7947240763"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAuthLockFailed() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV2 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV2.setLocked(true); + authLockTypeStatusDtoV2.setAuthType("OTP"); + authLockTypeStatusDtoV2.setRequestId("1234"); + AuthLockStatusResponseDtoV2 authLockStatusResponseDtoV2 = new AuthLockStatusResponseDtoV2(); + authLockStatusResponseDtoV2.setAuthTypes(List.of(authLockTypeStatusDtoV2)); + responseWrapper.setResponse(authLockStatusResponseDtoV2); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorCode(), + ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorMessage()))); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + residentService.getAuthLockStatus("7947240763"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetAuthLockResidentServiceCheckedException() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV2 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV2.setLocked(true); + authLockTypeStatusDtoV2.setAuthType("OTP"); + authLockTypeStatusDtoV2.setRequestId("1234"); + AuthLockStatusResponseDtoV2 authLockStatusResponseDtoV2 = new AuthLockStatusResponseDtoV2(); + authLockStatusResponseDtoV2.setAuthTypes(List.of(authLockTypeStatusDtoV2)); + responseWrapper.setResponse(authLockStatusResponseDtoV2); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorCode(), + ResidentErrorCode.AUTH_LOCK_STATUS_FAILED.getErrorMessage()))); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), any())) + .thenThrow(new ApisResourceAccessException()); + residentService.getAuthLockStatus("7947240763"); + } + + @Test + public void testGetAuthLockStatusSuccess() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV2 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV2.setLocked(true); + authLockTypeStatusDtoV2.setAuthType("OTP"); + authLockTypeStatusDtoV2.setRequestId("1234"); + AuthLockTypeStatusDtoV2 authLockTypeStatusDtoV21 = new AuthLockTypeStatusDtoV2(); + authLockTypeStatusDtoV21.setAuthType("Phone"); + authLockTypeStatusDtoV21.setLocked(true); + AuthLockStatusResponseDtoV2 authLockStatusResponseDtoV2 = new AuthLockStatusResponseDtoV2(); + authLockStatusResponseDtoV2.setAuthTypes(List.of()); + responseWrapper.setResponse(authLockStatusResponseDtoV2); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), (List) any(), (List) any(), any(), any())) + .thenReturn(responseWrapper); + residentService.getAuthLockStatus("7947240763"); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestTypeAuthLockTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestTypeAuthLockTest.java new file mode 100644 index 00000000000..ff1c25940a7 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceRequestTypeAuthLockTest.java @@ -0,0 +1,324 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.idvalidator.spi.RidValidator; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthTypeStatusDto; +import io.mosip.resident.dto.AuthTypeStatusDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.ResidentDocuments; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.PartnerService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.util.UINCardDownloadHelper; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; + + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentServiceRequestTypeAuthLockTest { + + @Mock + private VidValidator vidValidator; + + @Mock + private UinValidator uinValidator; + + @Mock + private RidValidator ridValidator; + + @Mock + private UINCardDownloadHelper uinCardDownloadHelper; + + @Mock + private IdAuthService idAuthService; + + @Mock + NotificationService notificationService; + + @Mock + PartnerServiceImpl partnerServiceImpl; + + @Mock + PartnerService partnerService; + + @Mock + IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + ResidentTransactionRepository residentTransactionRepository; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private DocumentService docService; + + @Mock + private Environment environment; + + @InjectMocks + private ResidentService residentService = new ResidentServiceImpl(); + + NotificationResponseDTO notificationResponseDTO; + + AuthTypeStatusDto authTypeStatusDto; + + private String individualId; + + @Value("${resident.authLockStatusUpdateV2.id}") + private String authLockStatusUpdateV2Id; + + @Before + public void setup() throws ApisResourceAccessException, ResidentServiceCheckedException { + + notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setStatus("success"); + notificationResponseDTO.setMessage("Notification success"); + individualId = identityServiceImpl.getResidentIndvidualIdFromSession(); + when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.UIN); + List residentTransactionEntities=new ArrayList<>(); + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId("12345"); + when(utility.createEntity(Mockito.any())).thenReturn(residentTransactionEntity); + residentTransactionEntities.add(residentTransactionEntity); + Mockito.when(utility.createEventId()).thenReturn("12345"); + ArrayList partnerIds = new ArrayList<>(); + partnerIds.add("m-partner-default-auth"); + ReflectionTestUtils.invokeMethod(residentService, "createResidentTransactionEntity", "2157245364", "partnerId", "2157245364"); + ReflectionTestUtils.setField(residentService, "authTypes", "otp,bio-FIR,bio-IIR,bio-FACE"); + ReflectionTestUtils.setField(residentService, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.status.update"); + } + + @Test + public void testReqAuthTypeStatusUpdateSuccess() + throws ApisResourceAccessException, ResidentServiceCheckedException { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("OTP"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + for (AuthTypeStatusDto authTypeStatusDto1 : authLockOrUnLockRequestDtoV2.getAuthTypes()) { + Mockito.when(idAuthService.authTypeStatusUpdateForRequestId(any(), any(), any())).thenReturn("123"); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + Tuple2 authLockResponse = residentService.reqAauthTypeStatusUpdateV2(authLockOrUnLockRequestDtoV2); + assertEquals("The chosen authentication types have been successfully locked/unlocked.", authLockResponse.getT1().getMessage()); + } + } + + @Test(expected = ResidentServiceException.class) + public void testReqAuthTypeLockFailed() + throws ApisResourceAccessException, ResidentServiceCheckedException { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("OTP"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + residentService.reqAauthTypeStatusUpdateV2(authLockOrUnLockRequestDtoV2); + + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testReqAuthTypeLockNotificationFailed() + throws ApisResourceAccessException, ResidentServiceCheckedException { + + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("OTP"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + Mockito.when(notificationService.sendNotification(Mockito.any(), Mockito.nullable(Map.class))) + .thenThrow(new ResidentServiceCheckedException()); + residentService.reqAauthTypeStatusUpdateV2(authLockOrUnLockRequestDtoV2); + + } + + @Test(expected = ResidentServiceException.class) + public void testReqAuthTypeLockException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("OTP"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + residentService.reqAauthTypeStatusUpdateV2(authLockOrUnLockRequestDtoV2); + } + + @Test(expected = ResidentServiceException.class) + public void testReqAuthTypeLockOTPFailedException() + throws ResidentServiceCheckedException, ApisResourceAccessException { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("OTP"); + authTypeStatusDto.setLocked(false); + authTypeStatusDto.setUnlockForSeconds(10L); + List authTypeStatusDtoList = new ArrayList<>(); + authTypeStatusDtoList.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypeStatusDtoList); + residentService.reqAauthTypeStatusUpdateV2(authLockOrUnLockRequestDtoV2); + + } + + @Test + public void testGetAuthTypeBasedOnConfigV2(){ + AuthTypeStatusDtoV2 authTypeStatus = new AuthTypeStatusDtoV2(); + authTypeStatus.setAuthType("demo"); + assertEquals("demo",ResidentServiceImpl.getAuthTypeBasedOnConfigV2(authTypeStatus)); + } + + @Test + public void testGetAuthTypeBasedOnConfigV2WithSubType(){ + AuthTypeStatusDtoV2 authTypeStatus = new AuthTypeStatusDtoV2(); + authTypeStatus.setAuthType("demo"); + authTypeStatus.setAuthSubType("demo"); + assertEquals(null,ResidentServiceImpl.getAuthTypeBasedOnConfigV2(authTypeStatus)); + } + + @Test + public void testGetAuthTypeBasedOnConfigV2WithoutSubType(){ + AuthTypeStatusDtoV2 authTypeStatus = new AuthTypeStatusDtoV2(); + authTypeStatus.setAuthType("bio"); + authTypeStatus.setAuthSubType("FIR"); + assertEquals("bio-FIR",ResidentServiceImpl.getAuthTypeBasedOnConfigV2(authTypeStatus)); + } + + @Test + public void testTrySendNotificationFailure() throws ResidentServiceCheckedException { + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); + ReflectionTestUtils.invokeMethod(residentService, + "trySendNotification", "123", null, null); + } + + @Test + public void testCreateResidentTransEntity() { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", null); + jsonObject.put("UIN", null); + residentUpdateRequestDto.setIdentity(jsonObject); + residentUpdateRequestDto.setIndividualId("123434343"); + assertNotNull(ReflectionTestUtils.invokeMethod(residentService, + "createResidentTransEntity", residentUpdateRequestDto, "1234567890")); + } + + @Test + public void testUpdateResidentTransaction() { + PacketGeneratorResDto response = new PacketGeneratorResDto(); + response.setRegistrationId("123"); + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + ReflectionTestUtils.invokeMethod(residentService, + "updateResidentTransaction", residentTransactionEntity, response); + } + + @Test + public void testGetResidentDocuments() { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", null); + jsonObject.put("UIN", null); + residentUpdateRequestDto.setIdentity(jsonObject); + residentUpdateRequestDto.setIndividualId("123434343"); + JSONObject mappingDocument = new JSONObject(); + mappingDocument.put("key", "value"); + ReflectionTestUtils.invokeMethod(residentService, + "getResidentDocuments", residentUpdateRequestDto, mappingDocument); + } + + @Test + public void testGetResidentDocumentsNullDocuments() { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", null); + jsonObject.put("UIN", null); + residentUpdateRequestDto.setIdentity(jsonObject); + residentUpdateRequestDto.setIndividualId("123434343"); + ResidentDocuments residentDocuments = new ResidentDocuments("key", "value"); + residentUpdateRequestDto.setDocuments(List.of(residentDocuments)); + ReflectionTestUtils.invokeMethod(residentService, + "getResidentDocuments", residentUpdateRequestDto, null); + } + + @Test + public void testGetResidentDocumentValidDocuments() { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", null); + jsonObject.put("UIN", null); + residentUpdateRequestDto.setIdentity(jsonObject); + residentUpdateRequestDto.setIndividualId("123434343"); + residentUpdateRequestDto.setTransactionID("123"); + ReflectionTestUtils.invokeMethod(residentService, + "getResidentDocuments", residentUpdateRequestDto, null); + } + + @Test(expected = Exception.class) + public void testGetResidentDocumentInValidDocuments() throws ResidentServiceCheckedException { + ResidentUpdateRequestDto residentUpdateRequestDto = new ResidentUpdateRequestDto(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", null); + jsonObject.put("UIN", null); + residentUpdateRequestDto.setIdentity(jsonObject); + residentUpdateRequestDto.setIndividualId("123434343"); + residentUpdateRequestDto.setTransactionID("123"); + Mockito.when(docService.getDocumentsWithMetadata(Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + ReflectionTestUtils.invokeMethod(residentService, + "getResidentDocuments", residentUpdateRequestDto, null); + } + + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceResUpdateTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceResUpdateTest.java new file mode 100644 index 00000000000..5ada1396152 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentServiceResUpdateTest.java @@ -0,0 +1,628 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.validator.RequestValidator; +import org.apache.commons.io.IOUtils; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.FileNotFoundException; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectIOException; +import io.mosip.kernel.core.idobjectvalidator.exception.IdObjectValidationFailedException; +import io.mosip.kernel.core.idobjectvalidator.exception.InvalidIdSchemaException; +import io.mosip.kernel.core.idobjectvalidator.spi.IdObjectValidator; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.MachineCreateResponseDTO; +import io.mosip.resident.dto.MachineDto; +import io.mosip.resident.dto.MachineErrorDTO; +import io.mosip.resident.dto.MachineSearchResponseDTO; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.PacketGeneratorResDto; +import io.mosip.resident.dto.PacketSignPublicKeyErrorDTO; +import io.mosip.resident.dto.PacketSignPublicKeyResponseDTO; +import io.mosip.resident.dto.ResidentDocuments; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResidentUpdateResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.exception.ValidationFailedException; +import io.mosip.resident.handler.service.ResidentUpdateService; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.DocumentService; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; +import io.mosip.resident.util.Utility; +import reactor.util.function.Tuple2; + +@RunWith(SpringRunner.class) +public class ResidentServiceResUpdateTest { + @InjectMocks + ResidentServiceImpl residentServiceImpl; + + @Mock + private ResidentUpdateService residentUpdateService; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private IdAuthService idAuthService; + + @MockBean + private DocumentService docService; + + @MockBean + private ObjectStoreHelper objectStore; + + @Mock + private UinValidator uinValidator; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + Environment env; + + @Mock + NotificationService notificationService; + @Mock + private Utility utility; + + @Mock + private Utilities utilities; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private IdObjectValidator idObjectValidator; + + @Mock + private ResidentConfigServiceImpl residentConfigService; + + @Mock + RequestValidator requestValidator; + + ResidentUpdateRequestDto dto; + + PacketGeneratorResDto updateDto; + + private JSONObject idRepoJson; + private String schemaJson; + private JSONObject demographicIdentity; + private IdResponseDTO1 idResponseDto; + + @Before + public void setUp() throws BaseCheckedException, IOException { + + dto = new ResidentUpdateRequestDto(); + ResidentDocuments document = new ResidentDocuments(); + document.setName("POA_Certificate of residence"); + document.setValue( + "_9j_4AAQSkZJRgABAQAAAQABAAD_2wCEAAkGBxMTEhUSExIVFRUVFRUVFRUWFxUVFRcVFRYWFhUVFRYYHiggGBolHhcVITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OGhAQGy0dHR0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tLS0tLS0tKy0tLS0tKystLS0tLS0tLS0tLSsrK__AABEIALMBGgMBIgACEQEDEQH_xAAbAAABBQEBAAAAAAAAAAAAAAADAAIEBQYBB__EA"); + List documents = new ArrayList<>(); + documents.add(document); + dto.setDocuments(documents); + dto.setIdentityJson( + "ewogICJpZGVudGl0eSIgOiB7CiAgICAiZGF0ZU9mQmlydGgiIDogIjE5OTUvMDgvMDgiLAogICAgImFnZSIgOiAyNywKICAgICJwaG9uZSIgOiAiOTc4NjU0MzIxMCIsCiAgICAiZW1haWwiIDogImdpcmlzaC55YXJydUBtaW5kdHJlZS5jb20iLAogICAgInByb29mT2ZBZGRyZXNzIiA6IHsKICAgICAgInZhbHVlIiA6ICJQT0FfQ2VydGlmaWNhdGUgb2YgcmVzaWRlbmNlIiwKICAgICAgInR5cGUiIDogIkNPUiIsCiAgICAgICJmb3JtYXQiIDogImpwZyIKICAgIH0sCgkiVUlOIjogIjM1Mjc4MTI0MDYiLAogICAgIklEU2NoZW1hVmVyc2lvbiIgOiAxLjAKICB9Cn0="); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDENTITY", "name"); + dto.setIdentity(new JSONObject()); + dto.setIndividualId("3527812406"); + dto.setIndividualIdType(IdType.UIN.name()); + dto.setTransactionID("12345"); + dto.setOtp("12345"); + dto.setConsent("Accepted"); + ReflectionTestUtils.setField(residentServiceImpl, "centerId", "10008"); + ReflectionTestUtils.setField(residentServiceImpl, "machineId", "10008"); + + Map identityResponse = new LinkedHashMap(); + Map identityMap = new LinkedHashMap(); + identityMap.put("UIN", "8251649601"); + identityMap.put("email", "manojvsp12@gmail.com"); + identityResponse.put("identity", identityMap); + + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + Object schema = "{\\\"$schema\\\":\\\"http:\\/\\/json-schema.org\\/draft-07\\/schema#\\\",\\\"description\\\":\\\"MOSIP Sample identity\\\",\\\"additionalProperties\\\":false,\\\"title\\\":\\\"MOSIP identity\\\",\\\"type\\\":\\\"object\\\",\\\"definitions\\\":{\\\"simpleType\\\":{\\\"uniqueItems\\\":true,\\\"additionalItems\\\":false,\\\"type\\\":\\\"array\\\",\\\"items\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"language\\\",\\\"value\\\"],\\\"properties\\\":{\\\"language\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"documentType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"},\\\"refNumber\\\":{\\\"type\\\":[\\\"string\\\",\\\"null\\\"]}}},\\\"biometricsType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"version\\\":{\\\"type\\\":\\\"number\\\",\\\"minimum\\\":0},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"properties\\\":{\\\"identity\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"IDSchemaVersion\\\",\\\"fullName\\\",\\\"dateOfBirth\\\",\\\"gender\\\",\\\"addressLine1\\\",\\\"addressLine2\\\",\\\"addressLine3\\\",\\\"region\\\",\\\"province\\\",\\\"city\\\",\\\"zone\\\",\\\"postalCode\\\",\\\"phone\\\",\\\"email\\\",\\\"proofOfIdentity\\\",\\\"individualBiometrics\\\"],\\\"properties\\\":{\\\"proofOfAddress\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"gender\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"city\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"postalCode\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[(?i)A-Z0-9]{5}$|^NA$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfException-1\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"referenceIdentityNumber\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^([0-9]{10,30})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"kyc\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"province\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"zone\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfDateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"addressLine1\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine2\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"residenceStatus\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"kyc\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine3\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"email\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[A-Za-z0-9_\\\\\\\\-]+(\\\\\\\\.[A-Za-z0-9_]+)*@[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_]+)*(\\\\\\\\.[a-zA-Z]{2,})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerRID\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"fullName\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"dateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(1869|18[7-9][0-9]|19[0-9][0-9]|20[0-9][0-9])\\/([0][1-9]|1[0-2])\\/([0][1-9]|[1-2][0-9]|3[01])$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualAuthBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"introducerUIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfIdentity\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"IDSchemaVersion\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"number\\\",\\\"fieldType\\\":\\\"default\\\",\\\"minimum\\\":0},\\\"proofOfException\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"phone\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[+]*([0-9]{1})([0-9]{9})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerName\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfRelationship\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"UIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"region\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"}}}}}"; + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + JSONObject obj = new JSONObject(); + obj.put("IDSchemaVersion", 0.2); + + when(utilities.retrieveIdrepoJson(any())).thenReturn(obj); + + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId(UUID.randomUUID().toString()); + when(utility.createEntity(Mockito.any())).thenReturn(residentTransactionEntity); + when(utility.createEventId()).thenReturn("1232312321432432"); + byte[] str = CryptoUtil.decodeURLSafeBase64(dto.getIdentityJson()); + when(objectMapper.readValue(str, Map.class)).thenReturn(identityResponse); + + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + Mockito.when(utility.getMappingJson()).thenReturn(mappingJson); + + Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(true); + + NotificationResponseDTO notificationResponse = new NotificationResponseDTO(); + notificationResponse.setMessage("Notification sent"); + notificationResponse.setStatus("success"); + Mockito.when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenReturn(notificationResponse); + + String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; + List machineDtos = new ArrayList<>(); + MachineDto machineDto = new MachineDto(); + machineDto.setMachineSpecId("1001"); + machineDto.setIsActive(false); + machineDto.setId("10147"); + machineDto.setName("resident_machine_1640777004542"); + machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); + machineDto.setPublicKey(publicKey); + machineDto.setSignPublicKey(publicKey); + machineDtos.add(machineDto); + MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder() + .fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); + MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); + machineSearchResponseDTO.setId("null"); + machineSearchResponseDTO.setVersion("1.0"); + machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); + machineSearchResponseDTO.setResponse(response); + + PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); + PacketSignPublicKeyResponseDTO.PacketSignPublicKeyResponse publicKeyResponse = new PacketSignPublicKeyResponseDTO.PacketSignPublicKeyResponse(); + publicKeyResponse.setPublicKey(publicKey); + responseDto.setId(null); + responseDto.setVersion(null); + responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); + responseDto.setResponse(publicKeyResponse); + responseDto.setErrors(new ArrayList<>()); + + updateDto = new PacketGeneratorResDto(); + updateDto.setRegistrationId("10008100670001720191120095702"); + Mockito.when(residentUpdateService.createPacket(any(), any(), any(), any())).thenReturn(updateDto); + Mockito.when(residentUpdateService.createPacket(any(), any())).thenReturn(updateDto); + + Mockito.when(env.getProperty(ApiName.PACKETSIGNPUBLICKEY.name())).thenReturn("PACKETSIGNPUBLICKEY"); + Mockito.when(env.getProperty(ApiName.MACHINESEARCH.name())).thenReturn("MACHINESEARCH"); + + Mockito.when(residentServiceRestClient.postApi(eq("PACKETSIGNPUBLICKEY"), any(MediaType.class), + any(HttpEntity.class), eq(PacketSignPublicKeyResponseDTO.class))).thenReturn(responseDto); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenReturn(machineSearchResponseDTO); + + when(utilities.getLanguageCode()).thenReturn("eng"); + idRepoJson = new JSONObject(); + idRepoJson.put("UIN", "8251649601"); + idRepoJson.put("email", "manojvsp12@gmail.com"); + schemaJson = (String) schema; + + byte[] decodedDemoJson = CryptoUtil.decodeURLSafeBase64(dto.getIdentityJson()); + JSONObject demographicJsonObject; + demographicJsonObject = JsonUtil.readValue(new String(decodedDemoJson), JSONObject.class); + demographicIdentity = JsonUtil.getJSONObject(demographicJsonObject, "identity"); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsApiResourceExceptionTest() + throws ResidentServiceCheckedException, ApisResourceAccessException { + when(residentServiceRestClient.postApi(eq("PACKETSIGNPUBLICKEY"), any(MediaType.class), any(HttpEntity.class), + eq(PacketSignPublicKeyResponseDTO.class))).thenThrow(new ApisResourceAccessException()); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsResidentServiceTPMSignKeyExceptionTest() + throws ApisResourceAccessException, ResidentServiceCheckedException { + PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); + List errorDTOS = new ArrayList<>(); + PacketSignPublicKeyErrorDTO errorDTO = new PacketSignPublicKeyErrorDTO(); + errorDTO.setErrorCode(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode()); + errorDTO.setMessage(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + errorDTOS.add(errorDTO); + responseDto.setId(null); + responseDto.setVersion(null); + responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); + responseDto.setErrors(errorDTOS); + when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(responseDto); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsResidentServiceTPMSignKeyExceptionWithNullResponseTest() + throws ApisResourceAccessException, ResidentServiceCheckedException { + PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); + responseDto.setId(null); + responseDto.setVersion(null); + responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); + responseDto.setResponse(null); + when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(responseDto); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateSearchMachineInMasterServiceThrowsApisResourceAccessExceptionTest() + throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { + Mockito.when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenThrow(new ApisResourceAccessException()); + residentServiceImpl.reqUinUpdate(dto); + + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateSearchMachineInMasterServiceThrowsResidentMachineServiceExceptionTest() + throws ApisResourceAccessException, ResidentServiceCheckedException { + List errorDTOS = new ArrayList<>(); + MachineErrorDTO errorDTO = new MachineErrorDTO(); + errorDTO.setErrorCode(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode()); + errorDTO.setMessage(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + errorDTOS.add(errorDTO); + + MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); + machineSearchResponseDTO.setId("null"); + machineSearchResponseDTO.setVersion("1.0"); + machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); + machineSearchResponseDTO.setErrors(errorDTOS); + when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenReturn(machineSearchResponseDTO); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test + public void reqUinUpdateGetMachineIdTest() throws BaseCheckedException { + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetMachineIdTestWithSecureSession() throws BaseCheckedException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + dto.setConsent(null); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate + (dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetMachineIdTestWithSecureSessionDemographicEntityFailed() throws BaseCheckedException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.getMappingJson()).thenReturn(null); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + } + + @Test + public void reqUinUpdateGetMachineIdTestWithSecureSessionSuccess() throws BaseCheckedException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate + (dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + assertEquals("10008100670001720191120095702", updateDto.getRegistrationId()); + } + + @Test + public void reqUinUpdateGetMachineIdIsNullTest() throws BaseCheckedException, IOException { + String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; + + List machineDtos = new ArrayList<>(); + MachineDto machineDto = new MachineDto(); + machineDto.setMachineSpecId("1001"); + machineDto.setIsActive(false); + machineDto.setId("10147"); + machineDto.setName("resident_machine_1640777004542"); + machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); + machineDto.setSignPublicKey(""); + machineDtos.add(machineDto); + MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder() + .fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); + MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); + machineSearchResponseDTO.setId("null"); + machineSearchResponseDTO.setVersion("1.0"); + machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); + machineSearchResponseDTO.setResponse(response); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenReturn(machineSearchResponseDTO); + + MachineCreateResponseDTO machineCreateResponseDTO = new MachineCreateResponseDTO(); + MachineDto newMachineDTO = new MachineDto(); + newMachineDTO.setMachineSpecId("1001"); + newMachineDTO.setIsActive(false); + newMachineDTO.setId("10147"); + newMachineDTO.setName("resident_machine_1640777004542"); + newMachineDTO.setValidityDateTime("2024-12-29T11:23:24.541Z"); + newMachineDTO.setPublicKey(publicKey); + newMachineDTO.setSignPublicKey(publicKey); + machineCreateResponseDTO.setResponse(newMachineDTO); + Mockito.when(env.getProperty(ApiName.MACHINECREATE.name())).thenReturn("MACHINECREATE"); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINECREATE"), any(MediaType.class), any(HttpEntity.class), + eq(MachineCreateResponseDTO.class))).thenReturn(machineCreateResponseDTO); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + verify(residentServiceRestClient, atLeast(3)).postApi(any(), any(), any(), any(Class.class)); + } + + @Test + public void reqUinUpdateGetMachineIdReturnsTest() throws BaseCheckedException, IOException { + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + verify(residentServiceRestClient, atLeast(2)).postApi(any(), any(), any(), any(Class.class)); + } + + @Test(expected = ResidentServiceException.class) + public void validateOtpException() + throws OtpValidationFailedException, IOException, ResidentServiceCheckedException { + Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(false); + residentServiceImpl.reqUinUpdate(dto); + + } + + @Test(expected = ResidentServiceException.class) + public void validateOtpExceptionWithSecureSession() + throws OtpValidationFailedException, IOException, ResidentServiceCheckedException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(false); + residentServiceImpl.reqUinUpdate(dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + + } + + @Test(expected = ResidentServiceException.class) + public void JsonParsingException() throws ResidentServiceCheckedException { + Mockito.when(utility.getMappingJson()).thenReturn(null); + residentServiceImpl.reqUinUpdate(dto); + + } + + @Test(expected = ResidentServiceException.class) + public void testIOException() throws BaseCheckedException, IOException { + HttpClientErrorException exp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); + Mockito.when(residentUpdateService.createPacket(any(), any())).thenThrow(new IOException("badgateway", exp)); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void testApiResourceAccessExceptionServer() throws BaseCheckedException, IOException { + HttpServerErrorException exp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); + Mockito.when(residentUpdateService.createPacket(any(), any())) + .thenThrow(new ApisResourceAccessException("badgateway", exp)); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void testBaseCheckedException() throws BaseCheckedException, IOException { + Mockito.when(residentUpdateService.createPacket(any(), any())) + .thenThrow(new BaseCheckedException("erorcode", "badgateway", new RuntimeException())); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test(expected = ResidentServiceException.class) + public void otpValidationFailedException() throws OtpValidationFailedException, ResidentServiceCheckedException { + Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenThrow(new OtpValidationFailedException()); + residentServiceImpl.reqUinUpdate(dto); + + } + + @Test + public void testValidationOfAuthIndividualIdWithUIN() throws ResidentServiceCheckedException, + OtpValidationFailedException, ApisResourceAccessException, FileNotFoundException, IOException { + dto.setIndividualId("3527812407"); + try { + residentServiceImpl.reqUinUpdate(dto); + } catch (ResidentServiceException e) { + assertEquals(ResidentErrorCode.INDIVIDUAL_ID_UIN_MISMATCH.getErrorCode(), + ((ValidationFailedException) e.getCause()).getErrorCode()); + } + } + + @Test + public void testValidationOfAuthIndividualIdWithUINWithSecureSession() throws ResidentServiceCheckedException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + dto.setIndividualId("3527812407"); + try { + residentServiceImpl.reqUinUpdate(dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + } catch (ResidentServiceException e) { + assertEquals(ResidentErrorCode.INDIVIDUAL_ID_UIN_MISMATCH.getErrorCode(), + ((ValidationFailedException) e.getCause()).getErrorCode()); + } + } + + @Test + public void testValidationOfAuthIndividualIdWithVIDSuccess() throws ResidentServiceCheckedException, + OtpValidationFailedException, ApisResourceAccessException, FileNotFoundException, IOException { + Mockito.when(utilities.getUinByVid(anyString())).thenReturn("3527812406"); + dto.setIndividualIdType(IdType.VID.name()); + dto.setIndividualId("4447812406"); + residentServiceImpl.reqUinUpdate(dto); + } + + @Test + public void testValidationOfAuthIndividualIdWithVIDFailure() throws ResidentServiceCheckedException, + OtpValidationFailedException, ApisResourceAccessException, FileNotFoundException, IOException { + + Mockito.when(utilities.getUinByVid(anyString())).thenReturn("3527812407"); + dto.setIndividualIdType(IdType.VID.name()); + dto.setIndividualId("4447812406"); + try { + residentServiceImpl.reqUinUpdate(dto); + } catch (ResidentServiceException e) { + e.printStackTrace(); + assertEquals(ResidentErrorCode.INDIVIDUAL_ID_UIN_MISMATCH.getErrorCode(), + ((ValidationFailedException) e.getCause()).getErrorCode()); + } + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetMachineIdMachineServiceException() throws BaseCheckedException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; + + List machineDtos = new ArrayList<>(); + MachineDto machineDto = new MachineDto(); + machineDto.setMachineSpecId("1001"); + machineDto.setIsActive(false); + machineDto.setId("10147"); + machineDto.setName("resident_machine_1640777004542"); + machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); + machineDto.setSignPublicKey(""); + machineDtos.add(machineDto); + MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder() + .fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); + MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); + machineSearchResponseDTO.setId("null"); + machineSearchResponseDTO.setVersion("1.0"); + machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); + machineSearchResponseDTO.setResponse(response); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenReturn(machineSearchResponseDTO); + + MachineCreateResponseDTO machineCreateResponseDTO = new MachineCreateResponseDTO(); + MachineDto newMachineDTO = new MachineDto(); + newMachineDTO.setMachineSpecId("1001"); + newMachineDTO.setIsActive(false); + newMachineDTO.setId("10147"); + newMachineDTO.setName("resident_machine_1640777004542"); + newMachineDTO.setValidityDateTime("2024-12-29T11:23:24.541Z"); + newMachineDTO.setPublicKey(publicKey); + newMachineDTO.setSignPublicKey(publicKey); + machineCreateResponseDTO.setResponse(newMachineDTO); + MachineErrorDTO machineErrorDTO = new MachineErrorDTO(); + machineErrorDTO.setErrorCode(ResidentErrorCode.MACHINE_MASTER_CREATE_EXCEPTION.getErrorCode()); + machineErrorDTO.setMessage(ResidentErrorCode.MACHINE_MASTER_CREATE_EXCEPTION.getErrorMessage()); + machineCreateResponseDTO.setErrors(List.of(machineErrorDTO)); + Mockito.when(env.getProperty(ApiName.MACHINECREATE.name())).thenReturn("MACHINECREATE"); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINECREATE"), any(MediaType.class), any(HttpEntity.class), + eq(MachineCreateResponseDTO.class))).thenReturn(machineCreateResponseDTO); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + verify(residentServiceRestClient, atLeast(3)).postApi(any(), any(), any(), any(Class.class)); + } + + @Test(expected = ResidentServiceException.class) + public void reqUinUpdateGetMachineIdEmptyResponseException() throws BaseCheckedException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; + + List machineDtos = new ArrayList<>(); + MachineDto machineDto = new MachineDto(); + machineDto.setMachineSpecId("1001"); + machineDto.setIsActive(false); + machineDto.setId("10147"); + machineDto.setName("resident_machine_1640777004542"); + machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); + machineDto.setSignPublicKey(""); + machineDtos.add(machineDto); + MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder() + .fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); + MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); + machineSearchResponseDTO.setId("null"); + machineSearchResponseDTO.setVersion("1.0"); + machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); + machineSearchResponseDTO.setResponse(response); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINESEARCH"), any(MediaType.class), any(HttpEntity.class), + eq(MachineSearchResponseDTO.class))).thenReturn(machineSearchResponseDTO); + + MachineCreateResponseDTO machineCreateResponseDTO = new MachineCreateResponseDTO(); + machineCreateResponseDTO.setResponse(null); + Mockito.when(env.getProperty(ApiName.MACHINECREATE.name())).thenReturn("MACHINECREATE"); + Mockito.when(residentServiceRestClient.postApi(eq("MACHINECREATE"), any(MediaType.class), any(HttpEntity.class), + eq(MachineCreateResponseDTO.class))).thenReturn(machineCreateResponseDTO); + Tuple2 residentUpdateResponseDTO = residentServiceImpl.reqUinUpdate(dto, demographicIdentity, false, idRepoJson, schemaJson, idResponseDto); + assertEquals(((ResidentUpdateResponseDTO) residentUpdateResponseDTO.getT1()).getRegistrationId(), updateDto.getRegistrationId()); + verify(residentServiceRestClient, atLeast(3)).postApi(any(), any(), any(), any(Class.class)); + } + + @Test + public void testReqUinUpdate() throws ResidentServiceCheckedException { + Map identityMap = new LinkedHashMap(); + identityMap.put("IDSchemaVersion", "0.1"); + identityMap.put("UIN", "3527812406"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("identity", identityMap); + jsonObject.put("UIN", "3527812406"); + residentServiceImpl.reqUinUpdate(dto, jsonObject, true, idRepoJson, schemaJson, idResponseDto); + } + + @Test(expected = ResidentServiceException.class) + public void testReqUinUpdateFailed() throws ResidentServiceCheckedException, IdObjectIOException, InvalidIdSchemaException, IdObjectValidationFailedException { + Map identityMap = new LinkedHashMap(); + identityMap.put("IDSchemaVersion", "0.1"); + identityMap.put("UIN", "3527812406"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("identity", identityMap); + jsonObject.put("UIN", "3527812406"); + Mockito.when(idObjectValidator.validateIdObject(any(), any())).thenThrow(new IdObjectValidationFailedException( + ResidentErrorCode.INVALID_INPUT.getErrorCode(), ResidentConstants.INVALID_INPUT_PARAMETER)); + residentServiceImpl.reqUinUpdate(dto, jsonObject, true, idRepoJson, schemaJson, idResponseDto); + } + + @Test(expected = ResidentServiceException.class) + public void testReqUinUpdateBadIdentityJson() throws ResidentServiceCheckedException { + dto.setIdentityJson("abc"); + residentServiceImpl.reqUinUpdate(dto); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentVidServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentVidServiceTest.java new file mode 100644 index 00000000000..48e5af8e430 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/ResidentVidServiceTest.java @@ -0,0 +1,629 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import io.mosip.resident.util.Utilities; +import org.apache.commons.io.IOUtils; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import io.mosip.idrepository.core.dto.VidPolicy; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.NotificationRequestDto; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.dto.ResponseWrapper; +import io.mosip.resident.dto.VidGeneratorResponseDto; +import io.mosip.resident.dto.VidRequestDto; +import io.mosip.resident.dto.VidRequestDtoV2; +import io.mosip.resident.dto.VidResponseDto; +import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.dto.VidRevokeRequestDTOV2; +import io.mosip.resident.dto.VidRevokeResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.OtpValidationFailedException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.exception.VidRevocationException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.IdAuthService; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.util.JsonUtil; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class ResidentVidServiceTest { + + private static final String LOCALE_EN_US = "en-US"; + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + private NotificationService notificationService; + + @Mock + private IdAuthService idAuthService; + + @Mock + private ObjectMapper mapper; + + @Mock + private Utility utility; + + private VidRequestDto requestDto; + + private VidRevokeRequestDTO vidRevokeRequest; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utilities utilities; + + @InjectMocks + private ResidentVidServiceImpl residentVidService; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + private JSONObject identity; + + private ResponseWrapper>> vidResponse; + + private String vid; + + private List> vidList; + + private Map vidDetails; + + private IdentityDTO identityValue; + + @Value("${perpatual.vid-type:PERPETUAL}") + private String perpatualVidType; + + @Before + public void setup() throws IOException, ResidentServiceCheckedException, ApisResourceAccessException { + + requestDto = new VidRequestDto(); + requestDto.setOtp("123"); + requestDto.setTransactionID("12345"); + requestDto.setIndividualId("1234567890"); + requestDto.setVidType("Temporary"); + + ReflectionTestUtils.setField(residentVidService, "perpatualVidType", "PERPETUAL"); + + NotificationResponseDTO notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setMessage("Vid successfully generated"); + notificationResponseDTO.setMaskedEmail("demo@gmail.com"); + notificationResponseDTO.setMaskedPhone("9876543210"); + + when(notificationService.sendNotification(any(NotificationRequestDto.class), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + identityValue = new IdentityDTO(); + identityValue.setEmail("aaa@bbb.com"); + identityValue.setPhone("987654321"); + identityValue.setUIN("123"); + when(identityServiceImpl.getIdentity(Mockito.anyString())).thenReturn(identityValue); + + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("ID.json").getFile()); + InputStream is = new FileInputStream(idJson); + String idJsonString = IOUtils.toString(is, "UTF-8"); + identity = JsonUtil.readValue(idJsonString, JSONObject.class); + + vidRevokeRequest = new VidRevokeRequestDTO(); + + vidRevokeRequest.setIndividualId("2038096257310540"); + vidRevokeRequest.setOtp("974436"); + vidRevokeRequest.setTransactionID("1111122222"); + vidRevokeRequest.setVidStatus("REVOKE"); + + NotificationRequestDto notificationRequestDto = new NotificationRequestDto(); + notificationRequestDto.setId("1234567"); + + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId(UUID.randomUUID().toString()); + + vidResponse = new ResponseWrapper<>(); + vidDetails = new HashMap<>(); + vidDetails.put("vidType", "perpetual"); + vidList = new ArrayList<>(); + vidDetails.put("vid", "123"); + vidDetails.put("maskedVid", "1******4"); + vidDetails.put("expiryTimeStamp", "1234343434"); + vidDetails.put("expiryTimestamp", "1516239022"); + vidDetails.put("genratedOnTimestamp", "1234343434"); + vidDetails.put("transactionLimit", 2); + vidDetails.put("transactionCount", 2); + vidList.add(vidDetails); + vidResponse.setResponse(vidList); + vid = "2038096257310540"; + when(mapper.convertValue("1516239022", LocalDateTime.class)).thenReturn(LocalDateTime.now()); + when(mapper.convertValue("1234343434", LocalDateTime.class)).thenReturn(LocalDateTime.now()); + Mockito.when(utilities.getUinByVid(Mockito.anyString())).thenReturn("123"); + } + + @Test(expected = Exception.class) + public void generateVidSuccessTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, ResidentServiceCheckedException { + + String vid = "12345"; + VidGeneratorResponseDto vidGeneratorResponseDto = new VidGeneratorResponseDto(); + vidGeneratorResponseDto.setVidStatus("Active"); + vidGeneratorResponseDto.setVID(vid); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(vidGeneratorResponseDto); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenThrow(new ApisResourceAccessException()); + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); + + ResponseWrapper result = residentVidService.generateVid(requestDto, vid); + if(result!=null) { + assertTrue("Expected Vid should be 12345", result.getResponse().getVid().equalsIgnoreCase(vid)); + } + } + + @Test(expected = OtpValidationFailedException.class) + public void otpValidationFailedTest() throws ResidentServiceCheckedException, OtpValidationFailedException { + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.FALSE); + residentVidService.generateVid(requestDto, "12345"); + } + + @Test(expected = Exception.class) + public void vidAlreadyExistsExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { + + String VID_ALREADY_EXISTS_ERROR_CODE = "IDR-VID-003"; + + ServiceError serviceError = new ServiceError(); + serviceError.setErrorCode(VID_ALREADY_EXISTS_ERROR_CODE); + serviceError.setMessage("Vid already present"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setErrors(Lists.newArrayList(serviceError)); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); + residentVidService.generateVid(requestDto, "12345"); + } + + @Test(expected = Exception.class) + public void vidCreationExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { + + String ERROR_CODE = "err"; + + ServiceError serviceError = new ServiceError(); + serviceError.setErrorCode(ERROR_CODE); + serviceError.setMessage("Vid already present"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setErrors(Lists.newArrayList(serviceError)); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); + residentVidService.generateVid(requestDto, "12345"); + } + + @Test(expected = Exception.class) + public void apiResourceAccessExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { + + String ERROR_CODE = "err"; + + ServiceError serviceError = new ServiceError(); + serviceError.setErrorCode(ERROR_CODE); + serviceError.setMessage("Vid already present"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setErrors(Lists.newArrayList(serviceError)); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); + residentVidService.generateVid(requestDto, "12345"); + } + + @Test(expected = Exception.class) + public void revokeVidSuccessTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, + ResidentServiceCheckedException { + + String vid = "1234567890"; + + VidGeneratorResponseDto dto = new VidGeneratorResponseDto(); + dto.setVidStatus("Deactive"); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(dto); + responseWrapper.setVersion("v1"); + responseWrapper.setResponsetime(DateUtils.getCurrentDateTimeString()); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenThrow(new ApisResourceAccessException()); + when(residentServiceRestClient.patchApi(any(), any(), any(), any())).thenReturn(responseWrapper); + when(identityServiceImpl.getUinForIndividualId(vid)).thenReturn("1234567890"); + + ResponseWrapper result2 = residentVidService.revokeVid(vidRevokeRequest,vid, "1234567890"); + + assertEquals("Vid successfully generated", result2.getResponse().getMessage().toString()); + } + + @Test(expected = OtpValidationFailedException.class) + public void otpValidationFailedTest1() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException, IOException { + String vid = "2038096257310540"; + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.FALSE); + + residentVidService.revokeVid(vidRevokeRequest, vid, "12345"); + } + + @Test(expected = Exception.class) + public void apiResourceAccessExceptionTest2() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException, IOException { + + String ERROR_CODE = "err"; + String vid = "2038096257310540"; + ServiceError serviceError = new ServiceError(); + serviceError.setErrorCode(ERROR_CODE); + serviceError.setMessage("No Record Found"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setErrors(Lists.newArrayList(serviceError)); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); + + residentVidService.revokeVid(vidRevokeRequest,vid, "12345"); + } + + @Test(expected = Exception.class) + public void idRepoAppExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException, IOException { + + String ERROR_CODE = "err"; + String vid = "2038096257310540"; + ServiceError serviceError = new ServiceError(); + serviceError.setErrorCode(ERROR_CODE); + serviceError.setMessage("No Record Found"); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setErrors(Lists.newArrayList(serviceError)); + + when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); + + residentVidService.revokeVid(vidRevokeRequest,vid, "12345"); + } + + @Test + public void testGetVidPolicy() throws ResidentServiceCheckedException, JsonParseException, JsonMappingException, IOException { + ReflectionTestUtils.setField(residentVidService, "vidPolicyUrl", "https://dev.mosip.net"); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode policy = objectMapper.readValue(this.getClass().getClassLoader().getResource("vid_policy.json"), + ObjectNode.class); + when(mapper.readValue(Mockito.any(URL.class), Mockito.any(Class.class))).thenReturn(policy); + assertEquals(policy.toString(), residentVidService.getVidPolicy()); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetVidPolicyFailed() throws ResidentServiceCheckedException, JsonParseException, JsonMappingException, IOException { + ReflectionTestUtils.setField(residentVidService, "vidPolicyUrl", "https://dev.mosip.net"); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode policy = objectMapper.readValue(this.getClass().getClassLoader().getResource("vid_policy.json"), + ObjectNode.class); + when(mapper.readValue(Mockito.any(URL.class), Mockito.any(Class.class))).thenThrow(new IOException()); + residentVidService.getVidPolicy(); + } + + @Test + public void testRetrieveVids() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + assertEquals(vidResponse.getResponse().size(), + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US).getResponse().size()); + } + + @Test(expected = ApisResourceAccessException.class) + public void testRetrieveVidsFailure() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(new ApisResourceAccessException()); + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US); + } + + @Test + public void testRetrieveVidsInvalidYear() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(mapper.convertValue((Object) any(), (Class) any())).thenReturn( + LocalDateTime.of(10000, 12, 1, 12, 12, 12)); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + assertEquals(vidResponse.getResponse().size(), + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US).getResponse().size()); + } + + @Test + public void testRetrieveVidsInvalidExpiryTimeStamp() throws ResidentServiceCheckedException, ApisResourceAccessException { + vidDetails.remove("expiryTimestamp"); + vidList.add(vidDetails); + vidResponse.setResponse(vidList); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + assertEquals(vidResponse.getResponse().size(), + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US).getResponse().size()); + } + + @Test + public void testRetrieveVidsNegativeTransactionLimit() throws ResidentServiceCheckedException, ApisResourceAccessException { + vidDetails.put("transactionLimit", -1); + vidList.add(vidDetails); + vidResponse.setResponse(vidList); + when(mapper.convertValue((Object) any(), (Class) any())).thenReturn( + LocalDateTime.of(10000, 12, 1, 12, 12, 12)); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + assertEquals(0, + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US).getResponse().size()); + } + + @Test + public void testRetrieveVidsNullTransactionLimit() throws ResidentServiceCheckedException, ApisResourceAccessException { + vidDetails.put("transactionLimit", null); + vidList.add(vidDetails); + vidResponse.setResponse(vidList); + when(mapper.convertValue((Object) any(), (Class) any())).thenReturn( + LocalDateTime.of(10000, 12, 1, 12, 12, 12)); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + assertEquals(vidResponse.getResponse().size(), + residentVidService.retrieveVids(vid, ResidentConstants.UTC_TIMEZONE_OFFSET, LOCALE_EN_US).getResponse().size()); + } + + @Test + public void getPerpatualVidTest() throws ResidentServiceCheckedException, ApisResourceAccessException { + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + Optional response = residentVidService.getPerpatualVid("9054257141"); + Optional perpetualVid = Optional.of("123"); + assertEquals(perpetualVid, response); + } + + @Test + public void getPerpatualVidEmptyTest() throws ResidentServiceCheckedException, ApisResourceAccessException { + vidResponse.setResponse(List.of()); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + Optional response = residentVidService.getPerpatualVid("9054257141"); + assertEquals(Optional.empty(), response); + } + + @Test + public void testGenerateVidV2() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + Mockito.when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.VID); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + String vidPolicyURL = "https://dev.mosip.net"; + ReflectionTestUtils.setField(residentVidService, "vidPolicyUrl", vidPolicyURL); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode policy = objectMapper.readValue(this.getClass().getClassLoader().getResource("vid_policy.json"), + ObjectNode.class); + when(mapper.readValue(Mockito.any(URL.class), Mockito.any(Class.class))).thenReturn(policy); + Map vidPolicyMap = new HashMap<>(); + List> vidList = new ArrayList<>(); + Map vids= new HashMap<>(); + vids.put(TemplateVariablesConstants.VID_TYPE,ResidentConstants.PERPETUAL); + vids.put("vidPolicy", "vidPolicy"); + vidList.add(vids); + vidPolicyMap.put("vidPolicies",vidList); + when(mapper.readValue("{\"vidPolicies\":[{\"vidType\":\"Perpetual\",\"vidPolicy\":{\"validForInMinutes\":null,\"transactionsAllowed\":null,\"instancesAllowed\":1,\"autoRestoreAllowed\":true,\"restoreOnAction\":\"REVOKE\"}},{\"vidType\":\"Temporary\",\"vidPolicy\":{\"validForInMinutes\":30,\"transactionsAllowed\":1,\"instancesAllowed\":5,\"autoRestoreAllowed\":false,\"restoreOnAction\":\"REGENERATE\"}}]}", + Map.class)).thenReturn(vidPolicyMap); + VidPolicy vidPolicy = new VidPolicy(); + vidPolicy.setAllowedInstances(1); + vidPolicy.setAutoRestoreAllowed(true); + vidPolicy.setRestoreOnAction("true"); + + when(mapper.convertValue("vidPolicy", VidPolicy.class)).thenReturn(vidPolicy); + when(env.getProperty(Mockito.anyString())).thenReturn("false"); + + String vid = "12345"; + VidGeneratorResponseDto vidGeneratorResponseDto = new VidGeneratorResponseDto(); + vidGeneratorResponseDto.setVidStatus("Active"); + vidGeneratorResponseDto.setVID(vid); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(vidGeneratorResponseDto); + when(mapper.writeValueAsString(Mockito.any())).thenReturn("response"); + when(mapper.readValue("response", VidGeneratorResponseDto.class)).thenReturn(vidGeneratorResponseDto); + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); + NotificationResponseDTO notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setMaskedEmail("Ka**g.com"); + notificationResponseDTO.setMaskedPhone("88**09"); + notificationResponseDTO.setStatus("SUCCESS"); + notificationResponseDTO.setMessage("SUCCESS"); + when(notificationService.sendNotification(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + VidRequestDtoV2 vidRequestDtoV2 = new VidRequestDtoV2(); + vidRequestDtoV2.setVidType("PERPETUAL"); + vidRequestDtoV2.setChannels(List.of("EMAIL")); + vidRequestDtoV2.setTransactionID("3434232323"); + assertEquals("12345",residentVidService. + generateVid(vidRequestDtoV2, "123232323").getResponse().getVid()); + } + + @Test(expected = VidRevocationException.class) + public void testRevokeVidV2Failed() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(identityServiceImpl.getIDAToken(Mockito.anyString())).thenReturn("123456789"); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + VidRevokeRequestDTOV2 vidRevokeRequestDTOV2 = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTOV2.setTransactionID("1234567896"); + vidRevokeRequestDTOV2.setVidStatus("Active"); + residentVidService.revokeVid(vidRevokeRequestDTOV2, "2076439409167031", "2037293183 "); + } + + @Test(expected = VidRevocationException.class) + public void testRevokeVidV2VidRevocationException() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + Mockito.when(identityServiceImpl.getIDAToken(Mockito.anyString())).thenReturn("123456789"); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + VidRevokeRequestDTOV2 vidRevokeRequestDTOV2 = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTOV2.setTransactionID("1234567896"); + vidRevokeRequestDTOV2.setVidStatus("Active"); + residentVidService.revokeVid(vidRevokeRequestDTOV2, "2076439409167031", "2037293183 "); + } + + @Test + public void testRevokeVidV2Success() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + VidGeneratorResponseDto dto = new VidGeneratorResponseDto(); + dto.setVidStatus("Deactive"); + responseWrapper.setResponse(dto); + responseWrapper.setVersion("v1"); + responseWrapper.setResponsetime(DateUtils.getCurrentDateTimeString()); + when(residentServiceRestClient.patchApi(any(), any(), any(), any())).thenReturn(responseWrapper); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + Mockito.when(identityServiceImpl.getIDAToken(Mockito.anyString())).thenReturn("123456789"); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + VidRevokeRequestDTOV2 vidRevokeRequestDTOV2 = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTOV2.setTransactionID("1234567896"); + vidRevokeRequestDTOV2.setVidStatus("Active"); + assertEquals("Vid successfully generated", + residentVidService.revokeVid(vidRevokeRequestDTOV2, "2076439409167031", "2037293183 ").getResponse().getMessage()); + } + + @Test + public void testGenerateVidV2NullNotificationResponse() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + Mockito.when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.VID); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + String vidPolicyURL = "https://dev.mosip.net"; + ReflectionTestUtils.setField(residentVidService, "vidPolicyUrl", vidPolicyURL); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode policy = objectMapper.readValue(this.getClass().getClassLoader().getResource("vid_policy.json"), + ObjectNode.class); + when(mapper.readValue(Mockito.any(URL.class), Mockito.any(Class.class))).thenReturn(policy); + Map vidPolicyMap = new HashMap<>(); + List> vidList = new ArrayList<>(); + Map vids= new HashMap<>(); + vids.put(TemplateVariablesConstants.VID_TYPE,ResidentConstants.PERPETUAL); + vids.put("vidPolicy", "vidPolicy"); + vidList.add(vids); + vidPolicyMap.put("vidPolicies",vidList); + when(mapper.readValue("{\"vidPolicies\":[{\"vidType\":\"Perpetual\",\"vidPolicy\":{\"validForInMinutes\":null,\"transactionsAllowed\":null,\"instancesAllowed\":1,\"autoRestoreAllowed\":true,\"restoreOnAction\":\"REVOKE\"}},{\"vidType\":\"Temporary\",\"vidPolicy\":{\"validForInMinutes\":30,\"transactionsAllowed\":1,\"instancesAllowed\":5,\"autoRestoreAllowed\":false,\"restoreOnAction\":\"REGENERATE\"}}]}", + Map.class)).thenReturn(vidPolicyMap); + VidPolicy vidPolicy = new VidPolicy(); + vidPolicy.setAllowedInstances(1); + vidPolicy.setAutoRestoreAllowed(true); + vidPolicy.setRestoreOnAction("true"); + + when(mapper.convertValue("vidPolicy", VidPolicy.class)).thenReturn(vidPolicy); + when(env.getProperty(Mockito.anyString())).thenReturn("false"); + + String vid = "12345"; + VidGeneratorResponseDto vidGeneratorResponseDto = new VidGeneratorResponseDto(); + vidGeneratorResponseDto.setVidStatus("Active"); + vidGeneratorResponseDto.setVID(vid); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(vidGeneratorResponseDto); + when(mapper.writeValueAsString(Mockito.any())).thenReturn("response"); + when(mapper.readValue("response", VidGeneratorResponseDto.class)).thenReturn(vidGeneratorResponseDto); + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); + NotificationResponseDTO notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setMaskedEmail(null); + notificationResponseDTO.setMaskedPhone(null); + notificationResponseDTO.setStatus("SUCCESS"); + notificationResponseDTO.setMessage("SUCCESS"); + when(notificationService.sendNotification(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.nullable(Map.class))).thenReturn(notificationResponseDTO); + VidRequestDtoV2 vidRequestDtoV2 = new VidRequestDtoV2(); + vidRequestDtoV2.setVidType("PERPETUAL"); + vidRequestDtoV2.setChannels(List.of("EMAIL")); + vidRequestDtoV2.setTransactionID("3434232323"); + assertEquals("12345",residentVidService. + generateVid(vidRequestDtoV2, "123232323").getResponse().getVid()); + } + + @Test(expected = VidCreationException.class) + public void testGenerateVidV2NullNotificationResponseApiResourceException() throws OtpValidationFailedException, ResidentServiceCheckedException, ApisResourceAccessException, IOException { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + Mockito.when(utility.createEntity(Mockito.any())).thenReturn(new ResidentTransactionEntity()); + Mockito.when(utility.createEventId()).thenReturn("1236547899874563"); + Mockito.when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.VID); + when(residentServiceRestClient.getApi(Mockito.anyString(), Mockito.any())).thenReturn(vidResponse); + String vidPolicyURL = "https://dev.mosip.net"; + ReflectionTestUtils.setField(residentVidService, "vidPolicyUrl", vidPolicyURL); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode policy = objectMapper.readValue(this.getClass().getClassLoader().getResource("vid_policy.json"), + ObjectNode.class); + when(mapper.readValue(Mockito.any(URL.class), Mockito.any(Class.class))).thenReturn(policy); + Map vidPolicyMap = new HashMap<>(); + List> vidList = new ArrayList<>(); + Map vids= new HashMap<>(); + vids.put(TemplateVariablesConstants.VID_TYPE,ResidentConstants.PERPETUAL); + vids.put("vidPolicy", "vidPolicy"); + vidList.add(vids); + vidPolicyMap.put("vidPolicies",vidList); + when(mapper.readValue("{\"vidPolicies\":[{\"vidType\":\"Perpetual\",\"vidPolicy\":{\"validForInMinutes\":null,\"transactionsAllowed\":null,\"instancesAllowed\":1,\"autoRestoreAllowed\":true,\"restoreOnAction\":\"REVOKE\"}},{\"vidType\":\"Temporary\",\"vidPolicy\":{\"validForInMinutes\":30,\"transactionsAllowed\":1,\"instancesAllowed\":5,\"autoRestoreAllowed\":false,\"restoreOnAction\":\"REGENERATE\"}}]}", + Map.class)).thenReturn(vidPolicyMap); + VidPolicy vidPolicy = new VidPolicy(); + vidPolicy.setAllowedInstances(1); + vidPolicy.setAutoRestoreAllowed(true); + vidPolicy.setRestoreOnAction("true"); + + when(mapper.convertValue("vidPolicy", VidPolicy.class)).thenReturn(vidPolicy); + when(env.getProperty(Mockito.anyString())).thenReturn("false"); + + String vid = "12345"; + VidGeneratorResponseDto vidGeneratorResponseDto = new VidGeneratorResponseDto(); + vidGeneratorResponseDto.setVidStatus("Active"); + vidGeneratorResponseDto.setVID(vid); + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponsetime(DateUtils.getCurrentDateTimeString()); + response.setResponse(vidGeneratorResponseDto); + when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenThrow(new ApisResourceAccessException()); + NotificationResponseDTO notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setMaskedEmail(null); + notificationResponseDTO.setMaskedPhone(null); + notificationResponseDTO.setStatus("SUCCESS"); + notificationResponseDTO.setMessage("SUCCESS"); + VidRequestDtoV2 vidRequestDtoV2 = new VidRequestDtoV2(); + vidRequestDtoV2.setVidType("PERPETUAL"); + vidRequestDtoV2.setChannels(List.of("EMAIL")); + vidRequestDtoV2.setTransactionID("3434232323"); + assertEquals("12345",residentVidService. + generateVid(vidRequestDtoV2, "123232323").getResponse().getVid()); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/RidStatusServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/RidStatusServiceTest.java similarity index 96% rename from resident/resident-service/src/test/java/io/mosip/resident/test/service/RidStatusServiceTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/service/impl/RidStatusServiceTest.java index f9b1d73e9d6..08b18b8a6d2 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/RidStatusServiceTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/RidStatusServiceTest.java @@ -1,4 +1,4 @@ -package io.mosip.resident.test.service; +package io.mosip.resident.service.impl; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; -import io.mosip.resident.service.NotificationService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,6 +20,7 @@ import org.springframework.web.client.HttpServerErrorException; import io.mosip.kernel.core.idvalidator.spi.RidValidator; +import io.mosip.resident.constant.IdType; import io.mosip.resident.dto.ErrorDTO; import io.mosip.resident.dto.RegStatusCheckResponseDTO; import io.mosip.resident.dto.RegistrationStatusDTO; @@ -29,8 +29,7 @@ import io.mosip.resident.exception.ApisResourceAccessException; import io.mosip.resident.exception.RIDInvalidException; import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.service.NotificationService; import io.mosip.resident.util.ResidentServiceRestClient; @RunWith(MockitoJUnitRunner.class) @@ -52,9 +51,6 @@ public class RidStatusServiceTest { @Mock private RidValidator ridValidator; - @Mock - private AuditUtil audit; - @InjectMocks ResidentServiceImpl residentService = new ResidentServiceImpl(); @@ -67,7 +63,7 @@ public class RidStatusServiceTest { public void setup() throws IOException, ApisResourceAccessException { requestDTO = new RequestDTO(); requestDTO.setIndividualId("10006100435989220191202104224"); - requestDTO.setIndividualIdType("RID"); + requestDTO.setIndividualIdType(IdType.RID.name()); Mockito.when(env.getProperty(STATUS_CHECK_ID)).thenReturn("id"); Mockito.when(env.getProperty(STATUS_CHECEK_VERSION)).thenReturn("version"); @@ -86,7 +82,6 @@ public void setup() throws IOException, ApisResourceAccessException { responseWrapper.setResponse(list); Mockito.when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(responseWrapper); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); } @Test diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/VerificationServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/VerificationServiceTest.java new file mode 100644 index 00000000000..1c38d8b3b7b --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/VerificationServiceTest.java @@ -0,0 +1,93 @@ +package io.mosip.resident.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.security.NoSuchAlgorithmException; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; + +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.VerificationResponseDTO; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.VerificationService; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utility; +import static io.mosip.resident.constant.MappingJsonConstants.EMAIL; +import static io.mosip.resident.constant.MappingJsonConstants.PHONE; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class VerificationServiceTest { + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + Environment env; + + @InjectMocks + private VerificationService verificationService = new VerificationServiceImpl(); + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private Utility utility; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + private IdentityDTO identityValue; + + @Before + public void setup() throws Exception { + when(utility.getIdForResidentTransaction(anyList(), any(), anyString())).thenReturn("hash ref id"); + identityValue = new IdentityDTO(); + identityValue.setEmail("aaa@bbb.com"); + identityValue.setPhone("987654321"); + identityValue.setUIN("123"); + when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityValue); + when(identityService.getIDAToken(Mockito.anyString())).thenReturn("123"); + } + + @Test + public void testCheckChannelVerificationStatus() + throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException { + when(residentTransactionRepository.existsByRefIdAndStatusCode(anyString(), anyString())) + .thenReturn(false); + VerificationResponseDTO verificationResponseDTO1 = verificationService.checkChannelVerificationStatus(EMAIL, + "8251649601"); + assertEquals(false, verificationResponseDTO1.getResponse().isVerificationStatus()); + } + + @Test + public void testCheckChannelVerificationStatusIf() + throws ResidentServiceCheckedException, NoSuchAlgorithmException, ApisResourceAccessException { + when(residentTransactionRepository.existsByRefIdAndStatusCode(anyString(), anyString())) + .thenReturn(true); + VerificationResponseDTO verificationResponseDTO = verificationService.checkChannelVerificationStatus(PHONE, + "8251649601"); + verificationService.checkChannelVerificationStatus(EMAIL, "8251649601"); + assertEquals(true, verificationResponseDTO.getResponse().isVerificationStatus()); + identityValue.setEmail(null); + verificationService.checkChannelVerificationStatus(EMAIL, "8251649601"); + identityValue.setPhone(null); + verificationService.checkChannelVerificationStatus(PHONE, "8251649601"); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceTest.java new file mode 100644 index 00000000000..0bf9d2a1a95 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubCredentialStatusUpdateServiceTest.java @@ -0,0 +1,86 @@ +package io.mosip.resident.service.impl; + +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.helper.CredentialStatusUpdateHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.test.context.ContextConfiguration; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import static org.mockito.Mockito.*; + +/** + * @author Kamesh Shekhar Prasad + * Test clss for WebsubCredentialStatusUpdateServiceImpl. + */ +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class WebSubCredentialStatusUpdateServiceTest { + + @Mock + private CredentialStatusUpdateHelper credentialStatusUpdateHelper; + + @Mock + private ResidentTransactionRepository repo; + + @InjectMocks + private WebSubCredentialStatusUpdateServiceImpl webSubCredentialStatusUpdateService; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testUpdateCredentialStatus() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + when(repo.findOneByCredentialRequestId("12345")).thenReturn(Optional.of(residentTransactionEntity)); + + // Invoke the method + webSubCredentialStatusUpdateService.updateCredentialStatus(eventModel); + + // Verify that the expected methods were called + verify(credentialStatusUpdateHelper, times(1)).updateStatus(eq(residentTransactionEntity), anyMap()); + verify(repo, times(1)).findOneByCredentialRequestId("12345"); + } + + @Test + public void testUpdateCredentialStatusWithNullData() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + when(repo.findOneByCredentialRequestId("12345")).thenReturn(Optional.empty()); + + // Invoke the method + webSubCredentialStatusUpdateService.updateCredentialStatus(eventModel); + + // Verify that the expected methods were called + verify(repo, times(1)).findOneByCredentialRequestId("12345"); + } + + private Map getMockEventMap() { + Map eventMap = new HashMap<>(); + eventMap.put(ResidentConstants.REQUEST_ID, "12345"); + // Add other necessary data + return eventMap; + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceTest.java new file mode 100644 index 00000000000..f31942c0e18 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/service/impl/WebSubUpdateAuthTypeServiceTest.java @@ -0,0 +1,147 @@ +package io.mosip.resident.service.impl; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.NotificationRequestDtoV2; +import io.mosip.resident.dto.NotificationResponseDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.NotificationService; +import io.mosip.resident.util.Utility; + +@RunWith(MockitoJUnitRunner.class) +@RefreshScope +@ContextConfiguration +public class WebSubUpdateAuthTypeServiceTest { + + @InjectMocks + private WebSubUpdateAuthTypeServiceImpl webSubUpdateAuthTypeService; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private NotificationService notificationService; + + @Mock + private Utility utility; + + private NotificationResponseDTO notificationResponseDTO; + + private String partnerId; + + @Before + public void setup() throws ApisResourceAccessException, ResidentServiceCheckedException { + MockitoAnnotations.initMocks(this); + notificationResponseDTO = new NotificationResponseDTO(); + notificationResponseDTO.setStatus("Notification success"); + partnerId = "mpartner-default-auth"; + ReflectionTestUtils.setField(webSubUpdateAuthTypeService, "onlineVerificationPartnerId", partnerId); + } + + @Test + public void testUpdateAuthTypeStatus_Success() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setOlvPartnerId(partnerId); + residentTransactionEntity.setEventId("12454578458478547"); + residentTransactionEntity.setIndividualId("4515452565"); + when(residentTransactionRepository.findByRequestTrnId("12345")).thenReturn(List.of(residentTransactionEntity)); + + // Mock utility response + when(utility.getSessionUserName()).thenReturn("testUser"); + + // Invoke the method + webSubUpdateAuthTypeService.updateAuthTypeStatus(eventModel); + + // Verify that the expected methods were called + verify(residentTransactionRepository, times(1)).findByRequestTrnId("12345"); + verify(notificationService, times(1)).sendNotification(any(NotificationRequestDtoV2.class), Mockito.nullable(Map.class)); + } + + @Test + public void testUpdateAuthTypeStatus_Failure() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + when(residentTransactionRepository.findByRequestTrnId("12345")).thenThrow(new RuntimeException()); + + // Invoke the method + webSubUpdateAuthTypeService.updateAuthTypeStatus(eventModel); + } + + private Map getMockEventMap() { + Map eventMap = new HashMap<>(); + Map dataMap = new HashMap<>(); + List> authTypesList = new ArrayList<>(); + Map authTypeStatus = new HashMap<>(); + authTypeStatus.put(ResidentConstants.REQUEST_ID, "12345"); + authTypesList.add(authTypeStatus); + dataMap.put(ResidentConstants.AUTH_TYPES, authTypesList); + eventMap.put(ResidentConstants.DATA, dataMap); + return eventMap; + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testUpdateAuthTypeStatusWithException() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setOlvPartnerId(partnerId); + residentTransactionEntity.setEventId("12454578458478547"); + residentTransactionEntity.setIndividualId("4515452565"); + when(residentTransactionRepository.findByRequestTrnId("12345")).thenReturn(List.of(residentTransactionEntity)); + + // Mock utility response + when(utility.getSessionUserName()).thenReturn("testUser"); + + when(notificationService.sendNotification(any(), Mockito.nullable(Map.class))).thenThrow(new ResidentServiceCheckedException()); + // Invoke the method + webSubUpdateAuthTypeService.updateAuthTypeStatus(eventModel); + } + + @Test + public void testUpdateAuthTypeStatusWithEmptyEntity() throws Exception { + // Mock data + Map eventModel = new HashMap<>(); + eventModel.put(ResidentConstants.EVENT, getMockEventMap()); + + // Mock repository response + when(residentTransactionRepository.findByRequestTrnId("12345")).thenReturn(List.of()); + + // Invoke the method + webSubUpdateAuthTypeService.updateAuthTypeStatus(eventModel); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/ResidentTestBootApplication.java b/resident/resident-service/src/test/java/io/mosip/resident/test/ResidentTestBootApplication.java index 8784a51a6d7..b6692e47232 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/ResidentTestBootApplication.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/test/ResidentTestBootApplication.java @@ -2,8 +2,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; -@SpringBootApplication(scanBasePackages = "io.mosip.resident.*") +import io.mosip.idrepository.core.util.TokenIDGenerator; +import io.mosip.kernel.authcodeflowproxy.api.validator.ValidateTokenUtil; + +@SpringBootApplication(scanBasePackages = {"io.mosip.resident.*"}) +@Import({TokenIDGenerator.class, ValidateTokenUtil.class}) public class ResidentTestBootApplication { public static void main(String[] args) { diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentControllerTest.java deleted file mode 100644 index 25a0588d58b..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentControllerTest.java +++ /dev/null @@ -1,313 +0,0 @@ -/** - * - */ -package io.mosip.resident.test.controller; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.doNothing; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.security.PrivateKey; -import java.security.PublicKey; -import java.util.ArrayList; -import java.util.List; - -import javax.crypto.SecretKey; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import io.mosip.kernel.cbeffutil.impl.CbeffImpl; -import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.controller.ResidentController; -import io.mosip.resident.dto.AuthHistoryRequestDTO; -import io.mosip.resident.dto.AuthHistoryResponseDTO; -import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; -import io.mosip.resident.dto.EuinRequestDTO; -import io.mosip.resident.dto.RegStatusCheckResponseDTO; -import io.mosip.resident.dto.RequestWrapper; -import io.mosip.resident.dto.ResidentDocuments; -import io.mosip.resident.dto.ResidentReprintRequestDto; -import io.mosip.resident.dto.ResidentReprintResponseDto; -import io.mosip.resident.dto.ResidentUpdateRequestDto; -import io.mosip.resident.dto.ResidentUpdateResponseDTO; -import io.mosip.resident.dto.ResponseDTO; -import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.service.ResidentService; -import io.mosip.resident.test.ResidentTestBootApplication; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.validator.RequestValidator; -import org.springframework.web.client.RestTemplate; - -/** - * @author Sowmya Ujjappa Banakar - * @author Jyoti Prakash Nayak - * - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ResidentTestBootApplication.class) -@AutoConfigureMockMvc -@TestPropertySource(locations = "classpath:application.properties") -public class ResidentControllerTest { - - @MockBean - private ResidentService residentService; - - @Mock - CbeffImpl cbeff; - - @MockBean - private RequestValidator validator; - - @Mock - private AuditUtil audit; - - @MockBean - private CryptoCoreSpec encryptor; - - @MockBean - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @InjectMocks - ResidentController residentController; - - RequestWrapper authLockRequest; - RequestWrapper euinRequest; - RequestWrapper authHistoryRequest; - - /** The array to json. */ - private String authLockRequestToJson; - private String euinRequestToJson; - private String historyRequestToJson; - private Gson gson; - - /** The mock mvc. */ - @Autowired - private MockMvc mockMvc; - - - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - authLockRequest = new RequestWrapper(); - - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("5734728510"); - authLockRequestDto.setOtp("111111"); - authLockRequestDto.setTransactionID("1234567898"); - List authTypes = new ArrayList<>(); - authTypes.add("bio-FIR"); - authLockRequestDto.setAuthType(authTypes); - authLockRequest.setRequest(authLockRequestDto); - euinRequest = new RequestWrapper(); - euinRequest.setRequest(new EuinRequestDTO("5734728510", "1234567890", IdType.UIN.name(), "UIN", "111111")); - - gson = new GsonBuilder().serializeNulls().create(); - authLockRequestToJson = gson.toJson(authLockRequest); - euinRequestToJson = gson.toJson(euinRequest); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - } - - @Test - @WithUserDetails("resident") - public void testGetRidStatusSuccess() throws Exception { - RegStatusCheckResponseDTO dto = new RegStatusCheckResponseDTO(); - dto.setRidStatus("PROCESSED"); - Mockito.doReturn(dto).when(residentService).getRidStatus(Mockito.any()); - this.mockMvc - .perform(post("/rid/check-status").contentType(MediaType.APPLICATION_JSON) - .content(authLockRequestToJson)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.ridStatus", is("PROCESSED"))); - } - - @Test - @WithUserDetails("resident") - public void testRequestAuthLockSuccess() throws Exception { - ResponseDTO responseDto = new ResponseDTO(); - responseDto.setStatus("success"); - doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); - Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); - - this.mockMvc - .perform(post("/req/auth-lock").contentType(MediaType.APPLICATION_JSON).content(authLockRequestToJson)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("success"))); - } - - @Test - @WithUserDetails("resident") - public void testRequestAuthLockBadRequest() throws Exception { - ResponseDTO responseDto = new ResponseDTO(); - doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); - Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); - - MvcResult result = this.mockMvc - .perform(post("/req/auth-lock").contentType(MediaType.APPLICATION_JSON).content("")) - .andExpect(status().isOk()).andReturn(); - assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); - } - - @Test - @WithUserDetails("resident") - public void testRequestEuinSuccess() throws Exception { - doNothing().when(validator).validateEuinRequest(Mockito.any()); - Mockito.doReturn(new byte[10]).when(residentService).reqEuin(Mockito.any()); - - MvcResult result = this.mockMvc - .perform(post("/req/euin").contentType(MediaType.APPLICATION_JSON).content(euinRequestToJson)) - .andExpect(status().isOk()).andReturn(); - assertEquals("application/pdf", result.getResponse().getContentType()); - } - - @Test - @WithUserDetails("resident") - public void testRequestEuinBadRequest() throws Exception { - - MvcResult result = this.mockMvc.perform(post("/req/euin").contentType(MediaType.APPLICATION_JSON).content("")) - .andExpect(status().isOk()).andReturn(); - assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); - } - - @Test - @WithUserDetails("resident") - public void testReprintUINSuccess() throws Exception { - ResidentReprintResponseDto reprintResp = new ResidentReprintResponseDto(); - reprintResp.setRegistrationId("123456789"); - reprintResp.setMessage("Notification sent"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponse(reprintResp); - - Mockito.when(residentService.reqPrintUin(Mockito.any())).thenReturn(reprintResp); - - RequestWrapper requestWrapper = new RequestWrapper<>(); - ResidentReprintRequestDto request = new ResidentReprintRequestDto(); - request.setIndividualId("3527812406"); - request.setIndividualIdType(IdType.UIN.name()); - request.setOtp("1234"); - request.setTransactionID("9876543210"); - requestWrapper.setRequest(request); - requestWrapper.setId(",osip.resident.reprint"); - requestWrapper.setVersion("1.0"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - - Gson gson = new GsonBuilder().serializeNulls().create(); - String requestAsString = gson.toJson(requestWrapper); - - this.mockMvc.perform(post("/req/print-uin").contentType(MediaType.APPLICATION_JSON).content(requestAsString)) - .andExpect(status().isOk()); - } - - @Test - @WithUserDetails("reg-admin") - public void testRequestAuthUnLockSuccess() throws Exception { - ResponseDTO responseDto = new ResponseDTO(); - responseDto.setStatus("success"); - doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); - Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); - - this.mockMvc - .perform( - post("/req/auth-unlock").contentType(MediaType.APPLICATION_JSON).content(authLockRequestToJson)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("success"))); - } - - @Test - @WithUserDetails("reg-admin") - public void testRequestAuthUnLockBadRequest() throws Exception { - ResponseDTO responseDto = new ResponseDTO(); - doNothing().when(validator).validateAuthLockOrUnlockRequest(Mockito.any(), Mockito.any()); - Mockito.doReturn(responseDto).when(residentService).reqAauthTypeStatusUpdate(Mockito.any(), Mockito.any()); - - MvcResult result = this.mockMvc - .perform(post("/req/auth-unlock").contentType(MediaType.APPLICATION_JSON).content("")) - .andExpect(status().isOk()).andReturn(); - assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); - } - - @Test - @WithUserDetails("reg-admin") - public void testRequestAuthHistorySuccess() throws Exception { - authHistoryRequest = new RequestWrapper(); - AuthHistoryRequestDTO hisdto = new AuthHistoryRequestDTO(); - hisdto.setIndividualId("1234"); - hisdto.setOtp("1234"); - hisdto.setTransactionID("1234"); - authHistoryRequest.setRequest(hisdto); - authHistoryRequest.setId("id"); - authHistoryRequest.setRequesttime("12-12-2009"); - authHistoryRequest.setVersion("v1"); - historyRequestToJson = gson.toJson(authHistoryRequest); - AuthHistoryResponseDTO responseDto = new AuthHistoryResponseDTO(); - responseDto.setMessage("success"); - doNothing().when(validator).validateAuthHistoryRequest(Mockito.any()); - Mockito.doReturn(responseDto).when(residentService).reqAuthHistory(Mockito.any()); - - this.mockMvc - .perform( - post("/req/auth-history").contentType(MediaType.APPLICATION_JSON).content(historyRequestToJson)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.message", is("success"))); - } - - @Test - @WithUserDetails("reg-admin") - public void testRequestAuthHistoryBadRequest() throws Exception { - - MvcResult result = this.mockMvc - .perform(post("/req/auth-history").contentType(MediaType.APPLICATION_JSON).content("")) - .andExpect(status().isOk()).andReturn(); - assertTrue(result.getResponse().getContentAsString().contains("RES-SER-418")); - } - - @Test - @WithUserDetails("reg-admin") - public void testRequestUINUpdate() throws Exception { - ResidentUpdateRequestDto dto = new ResidentUpdateRequestDto(); - ResidentDocuments document = new ResidentDocuments(); - document.setName("POA"); - document.setValue("abecfsgdsdg"); - List list = new ArrayList<>(); - list.add(document); - dto.setDocuments(list); - dto.setIdentityJson("sdgfdgsfhfh"); - dto.setIndividualId("9876543210"); - dto.setIndividualIdType(IdType.UIN.name()); - dto.setOtp("1234"); - dto.setTransactionID("12345"); - RequestWrapper reqWrapper = new RequestWrapper<>(); - reqWrapper.setRequest(dto); - reqWrapper.setId("mosip.resident.uin"); - reqWrapper.setVersion("v1"); - Mockito.when(residentService.reqUinUpdate(Mockito.any())).thenReturn(new ResidentUpdateResponseDTO()); - String requestAsString = gson.toJson(reqWrapper); - this.mockMvc.perform(post("/req/update-uin").contentType(MediaType.APPLICATION_JSON).content(requestAsString)) - .andExpect(status().isOk()); - - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentCredentialControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentCredentialControllerTest.java deleted file mode 100644 index eea3bca512c..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentCredentialControllerTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package io.mosip.resident.test.controller; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import io.mosip.kernel.cbeffutil.impl.CbeffImpl; -import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.resident.controller.ResidentCredentialController; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.service.ResidentCredentialService; -import io.mosip.resident.test.ResidentTestBootApplication; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.validator.RequestValidator; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.client.RestTemplate; - -import javax.crypto.SecretKey; -import javax.validation.Valid; -import java.security.PrivateKey; -import java.security.PublicKey; - -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ResidentTestBootApplication.class) -@AutoConfigureMockMvc -@TestPropertySource(locations = "classpath:application.properties") -public class ResidentCredentialControllerTest { - - @MockBean - private ResidentCredentialService residentCredentialService; - - @Mock - CbeffImpl cbeff; - - @MockBean - private RequestValidator validator; - - @Mock - private AuditUtil audit; - - @MockBean - private CryptoCoreSpec encryptor; - - @MockBean - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @InjectMocks - ResidentCredentialController residentCredentialController; - - @Autowired - private MockMvc mockMvc; - - Gson gson = new GsonBuilder().serializeNulls().create(); - - String reqJson; - - ResidentCredentialResponseDto credentialReqResponse; - - CredentialCancelRequestResponseDto credentialCancelReqResponse; - - CredentialRequestStatusResponseDto credentialReqStatusResponse; - - PartnerCredentialTypePolicyDto partnerCredentialTypeReqResponse; - - String reqCredentialEventJson; - - byte[] pdfbytes; - - @Before - public void setup() throws Exception { - credentialReqStatusResponse = new CredentialRequestStatusResponseDto(); - credentialCancelReqResponse = new CredentialCancelRequestResponseDto(); - credentialReqResponse = new ResidentCredentialResponseDto(); - partnerCredentialTypeReqResponse = new PartnerCredentialTypePolicyDto(); - MockitoAnnotations.initMocks(this); - this.mockMvc = MockMvcBuilders.standaloneSetup(residentCredentialController).build(); - ResidentCredentialRequestDto credentialRequestDto = new ResidentCredentialRequestDto(); - credentialRequestDto.setIndividualId("123456"); - reqJson = gson.toJson(credentialRequestDto); - pdfbytes = "uin".getBytes(); - } - - @Test - public void testCreateRequestGenerationSuccess() throws Exception { - - Mockito.when(residentCredentialService.reqCredential(Mockito.any())).thenReturn(credentialReqResponse); - - mockMvc.perform(MockMvcRequestBuilders.post("/req/credential").contentType(MediaType.APPLICATION_JSON_VALUE) - .content(reqJson.getBytes())).andExpect(status().isOk()); - - } - - @Test - public void testCancelRequestSuccess() throws Exception { - - Mockito.when(residentCredentialService.cancelCredentialRequest(Mockito.any())) - .thenReturn(credentialCancelReqResponse); - - mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/cancel/requestId") - .contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(status().isOk()); - - } - - @Test - public void testgetCredentialRequestStatusSuccess() throws Exception { - - Mockito.when(residentCredentialService.getStatus(Mockito.any())).thenReturn(credentialReqStatusResponse); - - mockMvc.perform(MockMvcRequestBuilders.get("/req/credential/status/requestId") - .contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(status().isOk()); - - } - - @Test - public void testgGetCardSuccess() throws Exception { - - Mockito.when(residentCredentialService.getCard(Mockito.any())).thenReturn(pdfbytes); - - mockMvc.perform(MockMvcRequestBuilders.get("/req/card/requestId") - .contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(status().isOk()); - - } - - @Test - public void testGetCredentialTypesSuccess() throws Exception { - - mockMvc.perform(MockMvcRequestBuilders.get("/credential/types").contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(status().isOk()); - - } - - @Test - public void testPartnerIdCredentialType() throws Exception { - - mockMvc.perform(MockMvcRequestBuilders.get("/req/policy/partnerId/1/credentialType/credentialType").contentType(MediaType.APPLICATION_JSON_VALUE)) - .andExpect(status().isOk()); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentOtpControllerTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentOtpControllerTest.java deleted file mode 100644 index 0e2136fa75f..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/controller/ResidentOtpControllerTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package io.mosip.resident.test.controller; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import io.mosip.kernel.cbeffutil.impl.CbeffImpl; -import io.mosip.kernel.core.crypto.spi.CryptoCoreSpec; -import io.mosip.resident.controller.ResidentCredentialController; -import io.mosip.resident.controller.ResidentOtpController; -import io.mosip.resident.dto.*; -import io.mosip.resident.handler.service.ResidentUpdateService; -import io.mosip.resident.handler.service.UinCardRePrintService; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.ResidentCredentialService; -import io.mosip.resident.service.ResidentOtpService; -import io.mosip.resident.service.impl.IdAuthServiceImpl; -import io.mosip.resident.test.ResidentTestBootApplication; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.util.Utilities; -import io.mosip.resident.util.Utilitiy; -import io.mosip.resident.validator.RequestValidator; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.client.RestTemplate; - -import javax.crypto.SecretKey; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.util.ArrayList; - -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ResidentTestBootApplication.class) -@AutoConfigureMockMvc -@TestPropertySource(locations = "classpath:application.properties") -public class ResidentOtpControllerTest { - - @MockBean - private ResidentOtpService residentOtpService; - - @MockBean - private RequestValidator validator; - - @MockBean - private ResidentUpdateService residentUpdateService; - - @MockBean - private IdAuthService idAuthService; - - @MockBean - private NotificationService notificationService; - - @MockBean - private UinCardRePrintService rePrintService; - - @MockBean - private Utilitiy utilitiy; - - @MockBean - private Utilities utilities; - - @MockBean - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Mock - private AuditUtil audit; - - @InjectMocks - ResidentOtpController residentOtpController; - - @Autowired - private MockMvc mockMvc; - - Gson gson = new GsonBuilder().serializeNulls().create(); - - String reqJson; - - OtpResponseDTO otpResponseDTO; - - @Before - public void setup() throws Exception { - otpResponseDTO = new OtpResponseDTO(); - MockitoAnnotations.initMocks(this); - this.mockMvc = MockMvcBuilders.standaloneSetup(residentOtpController).build(); - OtpRequestDTO otpRequestDTO = new OtpRequestDTO(); - otpRequestDTO.setIndividualId("123456"); - otpRequestDTO.setTransactionID("1234327890"); - reqJson = gson.toJson(otpRequestDTO); - } - - @Test - public void testCreateRequestGenerationSuccess() throws Exception { - - Mockito.when(residentOtpService.generateOtp(Mockito.any())).thenReturn(otpResponseDTO); - - mockMvc.perform(MockMvcRequestBuilders.post("/req/otp").contentType(MediaType.APPLICATION_JSON_VALUE) - .content(reqJson)).andExpect(status().isOk()); - - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/NotificationServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/NotificationServiceTest.java deleted file mode 100644 index e9f733b13ed..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/NotificationServiceTest.java +++ /dev/null @@ -1,285 +0,0 @@ -package io.mosip.resident.test.service; - -import static org.junit.Assert.assertEquals; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; - -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.templatemanager.spi.TemplateManager; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.NotificationTemplateCode; -import io.mosip.resident.dto.NotificationRequestDto; -import io.mosip.resident.dto.NotificationResponseDTO; -import io.mosip.resident.dto.TemplateDto; -import io.mosip.resident.dto.TemplateResponseDto; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; -import io.mosip.resident.util.Utilitiy; -import io.mosip.resident.validator.RequestValidator; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest({ JsonUtil.class, IOUtils.class, HashSet.class}) -public class NotificationServiceTest { - @InjectMocks - private NotificationService notificationService; - - @Mock - private Utilitiy utility; - @Mock - private Environment env; - - @Mock - private ResidentServiceRestClient restClient; - - @Mock - private TemplateManager templateManager; - - @Mock - private AuditUtil audit; - - @Mock - private RequestValidator requestValidator; - private Map mailingAttributes; - private NotificationRequestDto reqDto; - private ResponseWrapper smsNotificationResponse; - - private static final String SMS_EMAIL_SUCCESS = "Notification has been sent to the provided contact detail(s)"; - private static final String SMS_SUCCESS = "Notification has been sent to the provided contact phone number"; - private static final String EMAIL_SUCCESS = "Notification has been sent to the provided email "; - - @Before - public void setUp() throws Exception { - Map additionalAttributes = new HashMap<>(); - additionalAttributes.put("RID", "10008200070004420191203104356"); - mailingAttributes = new HashMap(); - mailingAttributes.put("fullName_eng", "Test"); - mailingAttributes.put("fullName_ara", "Test"); - mailingAttributes.put("phone", "9876543210"); - mailingAttributes.put("email", "test@test.com"); - Set templateLangauges = new HashSet(); - templateLangauges.add("eng"); - templateLangauges.add("ara"); - // ReflectionTestUtils.setField(notificationService, "templateLangauges", - // templateLangauges); - // PowerMockito.whenNew(HashSet.class).withNoArguments().thenReturn((HashSet) - // templateLangauges); - ReflectionTestUtils.setField(notificationService, "notificationType", "SMS|EMAIL"); - ReflectionTestUtils.setField(notificationService, "notificationEmails", "test@test.com|test1@test1.com"); - Mockito.when(env.getProperty(ApiName.EMAILNOTIFIER.name())).thenReturn("https://int.mosip.io/template/email"); - Mockito.when(requestValidator.emailValidator(Mockito.anyString())).thenReturn(true); - Mockito.when(requestValidator.phoneValidator(Mockito.anyString())).thenReturn(true); - reqDto = new NotificationRequestDto(); - reqDto.setId("3527812406"); - reqDto.setTemplateTypeCode(NotificationTemplateCode.RS_UIN_RPR_SUCCESS); - reqDto.setAdditionalAttributes(additionalAttributes); - ResponseWrapper primaryLangResp = new ResponseWrapper<>(); - TemplateResponseDto primaryTemplateResp = new TemplateResponseDto(); - TemplateDto primaryTemplateDto = new TemplateDto(); - primaryTemplateDto.setDescription("re print uin"); - primaryTemplateDto.setFileText( - "Hi $name_eng,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is $RID."); - List primaryTemplateList = new ArrayList<>(); - primaryTemplateList.add(primaryTemplateDto); - primaryTemplateResp.setTemplates(primaryTemplateList); - primaryLangResp.setResponse(primaryTemplateResp); - Mockito.when(restClient.getApi(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.any(), - Mockito.any(Class.class))).thenReturn(primaryLangResp); - - String primaryTemplatetext = "Hi Test,Your request for \"Reprint Of UIN\" has been successfully placed. Your RID (Req Number) is 10008200070004420191203104356."; - InputStream primaryIs = new ByteArrayInputStream(primaryTemplatetext.getBytes(StandardCharsets.UTF_8)); - Mockito.when(templateManager.merge(Mockito.any(), Mockito.any())).thenReturn(primaryIs); - smsNotificationResponse = new ResponseWrapper<>(); - NotificationResponseDTO notificationResp = new NotificationResponseDTO(); - notificationResp.setMessage("Notification has been sent to provided contact details"); - notificationResp.setStatus("success"); - smsNotificationResponse.setResponse(notificationResp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenReturn(smsNotificationResponse); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - } - - @Test - public void sendNotificationTest() - throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - NotificationResponseDTO response = notificationService.sendNotification(reqDto); - assertEquals(SMS_EMAIL_SUCCESS, response.getMessage()); - - } - - @Test - public void smsFailedAndEmailSuccessTest() throws ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - Mockito.when(requestValidator.phoneValidator(Mockito.anyString())).thenReturn(false); - NotificationResponseDTO response = notificationService.sendNotification(reqDto); - assertEquals(EMAIL_SUCCESS, response.getMessage()); - - } - - @Test - public void emailFailedAndSMSSuccessTest() throws ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - Mockito.when(requestValidator.emailValidator(Mockito.anyString())).thenReturn(false); - NotificationResponseDTO response = notificationService.sendNotification(reqDto); - assertEquals(SMS_SUCCESS, response.getMessage()); - - } - - @Test(expected = ResidentServiceException.class) - public void testNotificationFailure() throws Exception { - ResponseWrapper smsNotificationResponse = new ResponseWrapper<>(); - NotificationResponseDTO notificationResp = new NotificationResponseDTO(); - notificationResp.setMessage("Notification failure"); - notificationResp.setStatus("failed"); - smsNotificationResponse.setResponse(notificationResp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenReturn(smsNotificationResponse); - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - - notificationService.sendNotification(reqDto); - - } - - @Test(expected = ResidentServiceException.class) - public void getTemplateNullResponseTest() throws ApisResourceAccessException, ResidentServiceCheckedException { - NotificationRequestDto reqDto = new NotificationRequestDto(); - reqDto.setId("3527812406"); - reqDto.setTemplateTypeCode(NotificationTemplateCode.RS_UIN_RPR_SUCCESS); - reqDto.setAdditionalAttributes(mailingAttributes); - Mockito.when(restClient.getApi(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.any(), - Mockito.any(Class.class))).thenReturn(null); - Mockito.when(requestValidator.emailValidator(Mockito.anyString())).thenReturn(false); - Mockito.when(requestValidator.phoneValidator(Mockito.anyString())).thenReturn(false); - notificationService.sendNotification(reqDto); - } - - @Ignore - @Test(expected = ResidentServiceCheckedException.class) - public void testApiResourceClientErrorException() - throws ApisResourceAccessException, ResidentServiceCheckedException { - HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); - Mockito.when(restClient.getApi(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.any(), - Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - - } - - @Ignore - @Test(expected = ResidentServiceCheckedException.class) - public void testApiResourceServerException() throws ApisResourceAccessException, ResidentServiceCheckedException { - HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); - Mockito.when(restClient.getApi(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.any(), - Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - - @Ignore - @Test(expected = ResidentServiceCheckedException.class) - public void testApiResourceUnknownException() throws ApisResourceAccessException, ResidentServiceCheckedException { - RuntimeException runTimeExp = new RuntimeException(); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("runtime exp", runTimeExp); - Mockito.when(restClient.getApi(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.any(), - Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - - @Ignore - @Test(expected = ResidentServiceCheckedException.class) - public void templateMergeIOException() throws IOException, ResidentServiceCheckedException { - Mockito.when(templateManager.merge(Mockito.any(), Mockito.any())).thenThrow(new IOException()); - notificationService.sendNotification(reqDto); - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendSMSClientException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendSMSServerException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendSMSUnknownException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - RuntimeException runTimeExp = new RuntimeException(); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("runtime exp", runTimeExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); -// JsonUtil.objectMapperReadValue(JsonUtil.objectMapperObjectToJson(resp.getResponse()), -// TemplateResponseDto.class); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendEmailClientException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenReturn(smsNotificationResponse).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendEmailServerException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenReturn(smsNotificationResponse).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - - @Test(expected = ResidentServiceCheckedException.class) - public void sendEmailUnknownException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(utility.getMailingAttributes(Mockito.any(), Mockito.any())).thenReturn(mailingAttributes); - RuntimeException runTimeExp = new RuntimeException(); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("runtime exp", runTimeExp); - Mockito.when(restClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class))).thenReturn(smsNotificationResponse).thenThrow(apiResourceAccessExp); - notificationService.sendNotification(reqDto); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentCredentialServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentCredentialServiceTest.java deleted file mode 100644 index e7304aa3314..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentCredentialServiceTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package io.mosip.resident.test.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.ResidentCredentialService; -import io.mosip.resident.service.impl.ResidentCredentialServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; -import io.mosip.resident.util.Utilitiy; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.core.env.Environment; -import org.springframework.test.context.ContextConfiguration; - -import java.io.IOException; -import java.net.URI; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -@RefreshScope -@ContextConfiguration -public class ResidentCredentialServiceTest { - - private ObjectMapper objectMapper = new ObjectMapper(); - - @Mock - private Environment env; - - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @Mock - private NotificationService notificationService; - - @Mock - private IdAuthService idAuthService; - - @Mock - private ObjectMapper mapper; - - @Mock - private Utilitiy utilitiy; - - @Mock - private AuditUtil audit; - - private ResidentCredentialRequestDto residentCredentialRequestDto; - - @InjectMocks - private ResidentCredentialService residentCredentialService = new ResidentCredentialServiceImpl(); - - @Before - public void setup() throws IOException, ResidentServiceCheckedException { - residentCredentialRequestDto = new ResidentCredentialRequestDto(); - residentCredentialRequestDto.setOtp("123"); - residentCredentialRequestDto.setTransactionID("12345"); - residentCredentialRequestDto.setIndividualId("1234567890"); - residentCredentialRequestDto.setIssuer("mpartner-default-print"); - residentCredentialRequestDto.setCredentialType("euin"); - residentCredentialRequestDto.setEncrypt(true); - residentCredentialRequestDto.setEncryptionKey("abc123"); - } - - @Test - public void generateCredentialTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, ResidentServiceCheckedException { - ResidentCredentialResponseDto residentCredentialResponseDto = new ResidentCredentialResponseDto(); - residentCredentialResponseDto.setRequestId("10001100010006920211220064226"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setResponse(residentCredentialResponseDto); - String valueAsString = objectMapper.writeValueAsString(residentCredentialResponseDto); - - PartnerResponseDto partnerResponseDto = new PartnerResponseDto(); - partnerResponseDto.setOrganizationName("MOSIP"); - ResponseWrapper partnerResponseDtoResponseWrapper = new ResponseWrapper<>(); - partnerResponseDtoResponseWrapper.setResponse(partnerResponseDto); - - when(idAuthService.validateOtp(residentCredentialRequestDto.getTransactionID(), residentCredentialRequestDto.getIndividualId(), residentCredentialRequestDto.getOtp())).thenReturn(Boolean.TRUE); - - RequestWrapper requestDto = new RequestWrapper<>(); - requestDto.setId("mosip.credential.request.service.id"); - requestDto.setRequest(new CredentialReqestDto()); - requestDto.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - requestDto.setVersion("1.0"); - - String partnerUrl = env.getProperty(ApiName.PARTNER_API_URL.name()) + "/" + residentCredentialRequestDto.getIssuer(); - URI partnerUri = URI.create(partnerUrl); - when(residentServiceRestClient.getApi(partnerUri, ResponseWrapper.class)).thenReturn(partnerResponseDtoResponseWrapper); - when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); - - ResidentCredentialResponseDto credentialResponseDto = residentCredentialService.reqCredential(residentCredentialRequestDto); - assertEquals("10001100010006920211220064226", credentialResponseDto.getRequestId()); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentOtpServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentOtpServiceTest.java deleted file mode 100644 index e8351be48fc..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentOtpServiceTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package io.mosip.resident.test.service; - -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.dto.OtpRequestDTO; -import io.mosip.resident.dto.OtpResponseDTO; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.service.ResidentOtpService; -import io.mosip.resident.service.impl.ResidentOtpServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.core.env.Environment; -import org.springframework.test.context.ContextConfiguration; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@RunWith(MockitoJUnitRunner.class) -@RefreshScope -@ContextConfiguration -public class ResidentOtpServiceTest { - - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @Mock - Environment env; - - @Mock - private AuditUtil audit; - - @InjectMocks - private ResidentOtpService residentOtpService = new ResidentOtpServiceImpl(); - - @Before - public void setup() { - } - - @Test - public void testGenerateOtp() throws ApisResourceAccessException { - String otpAPIUrl = "https://dev2.mosip.net/idauthentication/v1/internal/otp"; - OtpResponseDTO otpResponseDTO = new OtpResponseDTO(); - when(env.getProperty(ApiName.OTP_GEN_URL.name())).thenReturn(otpAPIUrl); - when(residentServiceRestClient.postApi(anyString(), any(), any(), any(Class.class))).thenReturn(otpResponseDTO); - - OtpRequestDTO otpRequestDTO = new OtpRequestDTO(); - residentOtpService.generateOtp(otpRequestDTO); - - verify(residentServiceRestClient, times(1)).postApi(anyString(), any(), any(), any(Class.class)); - verify(env, times(1)).getProperty(ApiName.OTP_GEN_URL.name()); - } - - @Test(expected = ResidentServiceException.class) - public void testGenerateOtpThrowsResidentServiceException() throws ApisResourceAccessException { - String otpAPIUrl = "https://dev2.mosip.net/idauthentication/v1/internal/otp"; - when(env.getProperty(ApiName.OTP_GEN_URL.name())).thenReturn(otpAPIUrl); - when(residentServiceRestClient.postApi(anyString(), any(), any(), any(Class.class))).thenThrow(new ApisResourceAccessException()); - - OtpRequestDTO otpRequestDTO = new OtpRequestDTO(); - residentOtpService.generateOtp(otpRequestDTO); - } - -} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceRequestAuthLockTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceRequestAuthLockTest.java deleted file mode 100644 index 549f383cefc..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceRequestAuthLockTest.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * - */ -package io.mosip.resident.test.service; - -import static org.junit.Assert.assertEquals; - -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.dto.*; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.test.context.ContextConfiguration; - -import io.mosip.kernel.core.idvalidator.spi.RidValidator; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.kernel.core.idvalidator.spi.VidValidator; -import io.mosip.resident.constant.AuthTypeStatus; -import io.mosip.resident.dto.AuthUnLockRequestDTO; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.ResidentService; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.UINCardDownloadService; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author M1022006 - * - */ -@RunWith(MockitoJUnitRunner.class) -@RefreshScope -@ContextConfiguration -public class ResidentServiceRequestAuthLockTest { - - @Mock - private VidValidator vidValidator; - - @Mock - private UinValidator uinValidator; - - @Mock - private RidValidator ridValidator; - - @Mock - private UINCardDownloadService uinCardDownloadService; - - @Mock - private IdAuthService idAuthService; - - @Mock - NotificationService notificationService; - - @Mock - private AuditUtil audit; - - @InjectMocks - private ResidentService residentService = new ResidentServiceImpl(); - - NotificationResponseDTO notificationResponseDTO; - - @Before - public void setup() { - - notificationResponseDTO = new NotificationResponseDTO(); - notificationResponseDTO.setStatus("Notification success"); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - } - - @Test - public void testReqAauthLockSuccess() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true); - ResponseDTO response = new ResponseDTO(); - response.setMessage("Notification success"); - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - - Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), - authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)).thenReturn(true); - Mockito.when(notificationService.sendNotification(Mockito.any())).thenReturn(notificationResponseDTO); - ResponseDTO authLockResponse = residentService.reqAauthTypeStatusUpdate(authLockRequestDto, - AuthTypeStatus.LOCK); - assertEquals(authLockResponse.getMessage(), authLockResponse.getMessage()); - - } - - @Test(expected = ResidentServiceException.class) - public void testReqAauthLockOTPFailed() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(false); - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); - - } - - @Test(expected = ResidentServiceException.class) - public void testReqAauthLockFailed() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true); - - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), - authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)).thenReturn(false); - residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void testReqAauthLockNotificationFailed() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true); - - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), - authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)).thenReturn(true); - Mockito.when(notificationService.sendNotification(Mockito.any())) - .thenThrow(new ResidentServiceCheckedException()); - residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); - - } - - @Test(expected = ResidentServiceException.class) - public void testReqAauthLockException() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true); - - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - Mockito.when(idAuthService.authTypeStatusUpdate(authLockRequestDto.getIndividualId(), - authLockRequestDto.getAuthType(), AuthTypeStatus.LOCK, null)) - .thenThrow(new ApisResourceAccessException()); - - residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); - - } - - @Test(expected = ResidentServiceException.class) - public void testReqAuthUnLockException() throws OtpValidationFailedException, ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true); - - AuthUnLockRequestDTO authUnLockRequestDTO = new AuthUnLockRequestDTO(); - authUnLockRequestDTO.setIndividualId("12344567"); - authUnLockRequestDTO.setOtp("12345"); - authUnLockRequestDTO.setTransactionID("12345"); - authUnLockRequestDTO.setUnlockForSeconds(String.valueOf(-1L)); - - Mockito.lenient().when(idAuthService.authTypeStatusUpdate(authUnLockRequestDTO.getIndividualId(), - authUnLockRequestDTO.getAuthType(), AuthTypeStatus.UNLOCK, null)) - .thenThrow(new ApisResourceAccessException()); - residentService.reqAauthTypeStatusUpdate(authUnLockRequestDTO, AuthTypeStatus.UNLOCK); - } - - @Test(expected = ResidentServiceException.class) - public void testReqAauthLockOTPFailedException() - throws ApisResourceAccessException, ResidentServiceCheckedException, OtpValidationFailedException { - - Mockito.when(idAuthService.validateOtp(Mockito.any(), Mockito.any(), Mockito.any())) - .thenThrow(new OtpValidationFailedException()); - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("1234567889"); - authLockRequestDto.setOtp("1234"); - authLockRequestDto.setTransactionID("1234567898"); - residentService.reqAauthTypeStatusUpdate(authLockRequestDto, AuthTypeStatus.LOCK); - - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceResUpdateTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceResUpdateTest.java deleted file mode 100644 index 147238261c7..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentServiceResUpdateTest.java +++ /dev/null @@ -1,360 +0,0 @@ -package io.mosip.resident.test.service; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.handler.service.ResidentUpdateService; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.impl.ResidentServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilities; -import io.mosip.resident.util.Utilitiy; -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@RunWith(SpringRunner.class) -public class ResidentServiceResUpdateTest { - @InjectMocks - ResidentServiceImpl residentServiceImpl; - - @Mock - private ResidentUpdateService residentUpdateService; - - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @Mock - private IdAuthService idAuthService; - - @Mock - private UinValidator uinValidator; - - @Mock - Environment env; - - @Mock - NotificationService notificationService; - @Mock - private Utilitiy utility; - - @Mock - private Utilities utilities; - - @Mock - private AuditUtil audit; - - ResidentUpdateRequestDto dto; - - @Before - public void setUp() throws BaseCheckedException, IOException { - - dto = new ResidentUpdateRequestDto(); - ResidentDocuments document = new ResidentDocuments(); - document.setName("POA_Certificate of residence"); - document.setValue( - "_9j_4AAQSkZJRgABAQAAAQABAAD_2wCEAAkGBxMTEhUSExIVFRUVFRUVFRUWFxUVFRcVFRYWFhUVFRYYHiggGBolHhcVITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OGhAQGy0dHR0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tLS0tLS0tKy0tLS0tKystLS0tLS0tLS0tLSsrK__AABEIALMBGgMBIgACEQEDEQH_xAAbAAABBQEBAAAAAAAAAAAAAAADAAIEBQYBB__EA"); - List documents = new ArrayList<>(); - documents.add(document); - dto.setDocuments(documents); - dto.setIdentityJson( - "ew0KICAiaWRlbnRpdHkiIDogew0KICAgICJkYXRlT2ZCaXJ0aCIgOiAiMTk5NS8wOC8wOCIsDQogICAgImFnZSIgOiAyNywNCiAgICAicGhvbmUiIDogIjk3ODY1NDMyMTAiLA0KICAgICJlbWFpbCIgOiAiZ2lyaXNoLnlhcnJ1QG1pbmR0cmVlLmNvbSIsDQogICAgInByb29mT2ZBZGRyZXNzIiA6IHsNCiAgICAgICJ2YWx1ZSIgOiAiUE9BX0NlcnRpZmljYXRlIG9mIHJlc2lkZW5jZSIsDQogICAgICAidHlwZSIgOiAiQ09SIiwNCiAgICAgICJmb3JtYXQiIDogImpwZyINCiAgICB9LA0KCSJVSU4iOiAzNTI3ODEyNDA2LA0KICAgICJJRFNjaGVtYVZlcnNpb24iIDogMS4wDQogIH0NCn0"); - dto.setIndividualId("3527812406"); - dto.setIndividualIdType(IdType.UIN.name()); - dto.setTransactionID("12345"); - dto.setOtp("12345"); - ReflectionTestUtils.setField(residentServiceImpl, "centerId", "10008"); - ReflectionTestUtils.setField(residentServiceImpl, "machineId", "10008"); - - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Mockito.when(utility.getMappingJson()).thenReturn(mappingJson); - - Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), - Mockito.anyString())).thenReturn(true); - - NotificationResponseDTO notificationResponse = new NotificationResponseDTO(); - notificationResponse.setMessage("Notification sent"); - notificationResponse.setStatus("success"); - Mockito.when(notificationService.sendNotification(any())).thenReturn(notificationResponse); - - - } - - @Test(expected = ResidentServiceException.class) - public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsApiResourceExceptionTest() throws ResidentServiceCheckedException, ApisResourceAccessException { - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); - PacketSignPublicKeyResponseDTO.PacketSignPublicKeyResponse publicKeyResponse = new PacketSignPublicKeyResponseDTO.PacketSignPublicKeyResponse(); - publicKeyResponse.setPublicKey(publicKey); - responseDto.setId(null); - responseDto.setVersion(null); - responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); - responseDto.setResponse(publicKeyResponse); - responseDto.setErrors(new ArrayList<>()); - when(residentServiceRestClient.postApi(anyString(), any(), any(), any(Class.class))).thenReturn(responseDto); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsResidentServiceTPMSignKeyExceptionTest() throws ApisResourceAccessException, ResidentServiceCheckedException { - PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); - List errorDTOS = new ArrayList<>(); - PacketSignPublicKeyErrorDTO errorDTO = new PacketSignPublicKeyErrorDTO(); - errorDTO.setErrorCode(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode()); - errorDTO.setMessage(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); - errorDTOS.add(errorDTO); - responseDto.setId(null); - responseDto.setVersion(null); - responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); - responseDto.setErrors(errorDTOS); - when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(responseDto); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void reqUinUpdateGetPublicKeyFromKeyManagerThrowsResidentServiceTPMSignKeyExceptionWithNullResponseTest() throws ApisResourceAccessException, ResidentServiceCheckedException { - PacketSignPublicKeyResponseDTO responseDto = new PacketSignPublicKeyResponseDTO(); - responseDto.setId(null); - responseDto.setVersion(null); - responseDto.setResponsetime("2022-01-28T06:51:30.286Z"); - responseDto.setResponse(null); - when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(responseDto); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void reqUinUpdateSearchMachineInMasterServiceThrowsApisResourceAccessExceptionTest() throws ApisResourceAccessException, ResidentServiceCheckedException { - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - ResidentServiceImpl residentServiceImplSpy = spy(residentServiceImpl); - Mockito.doReturn(publicKey).when(residentServiceImplSpy).getPublicKeyFromKeyManager(); - when(utilities.getLanguageCode()).thenReturn("eng"); - residentServiceImplSpy.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void reqUinUpdateSearchMachineInMasterServiceThrowsResidentMachineServiceExceptionTest() throws ApisResourceAccessException, ResidentServiceCheckedException { - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - ResidentServiceImpl residentServiceImplSpy = spy(residentServiceImpl); - Mockito.doReturn(publicKey).when(residentServiceImplSpy).getPublicKeyFromKeyManager(); - when(utilities.getLanguageCode()).thenReturn("eng"); - - List errorDTOS = new ArrayList<>(); - MachineErrorDTO errorDTO = new MachineErrorDTO(); - errorDTO.setErrorCode(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode()); - errorDTO.setMessage(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); - errorDTOS.add(errorDTO); - - MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); - machineSearchResponseDTO.setId("null"); - machineSearchResponseDTO.setVersion("1.0"); - machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); - machineSearchResponseDTO.setErrors(errorDTOS); - when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(machineSearchResponseDTO); - residentServiceImplSpy.reqUinUpdate(dto); - } - - @Test - public void reqUinUpdateGetMachineIdTest() throws BaseCheckedException, IOException { - ResidentServiceImpl residentServiceImplSpy = spy(residentServiceImpl); - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - Mockito.doReturn(publicKey).when(residentServiceImplSpy).getPublicKeyFromKeyManager(); - when(utilities.getLanguageCode()).thenReturn("eng"); - - List machineDtos = new ArrayList<>(); - MachineDto machineDto = new MachineDto(); - machineDto.setMachineSpecId("1001"); - machineDto.setIsActive(false); - machineDto.setId("10147"); - machineDto.setName("resident_machine_1640777004542"); - machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); - machineDto.setPublicKey(publicKey); - machineDto.setSignPublicKey(publicKey); - machineDtos.add(machineDto); - MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder().fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); - MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); - machineSearchResponseDTO.setId("null"); - machineSearchResponseDTO.setVersion("1.0"); - machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); - machineSearchResponseDTO.setResponse(response); - Mockito.doReturn(machineSearchResponseDTO).when(residentServiceImplSpy).searchMachineInMasterService(any(), any()); - - PacketGeneratorResDto updateDto = new PacketGeneratorResDto(); - updateDto.setRegistrationId("10008100670001720191120095702"); - Mockito.when(residentUpdateService.createPacket(any())).thenReturn(updateDto); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - ResidentUpdateResponseDTO residentUpdateResponseDTO = residentServiceImplSpy.reqUinUpdate(dto); - assertEquals(residentUpdateResponseDTO.getRegistrationId(), updateDto.getRegistrationId()); - } - - @Test - public void reqUinUpdateGetMachineIdIsNullTest() throws BaseCheckedException, IOException { - ResidentServiceImpl residentServiceImplSpy = spy(residentServiceImpl); - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - Mockito.doReturn(publicKey).when(residentServiceImplSpy).getPublicKeyFromKeyManager(); - when(utilities.getLanguageCode()).thenReturn("eng"); - - List machineDtos = new ArrayList<>(); - MachineDto machineDto = new MachineDto(); - machineDto.setMachineSpecId("1001"); - machineDto.setIsActive(false); - machineDto.setId("10147"); - machineDto.setName("resident_machine_1640777004542"); - machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); - machineDto.setSignPublicKey(""); - machineDtos.add(machineDto); - MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder().fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); - MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); - machineSearchResponseDTO.setId("null"); - machineSearchResponseDTO.setVersion("1.0"); - machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); - machineSearchResponseDTO.setResponse(response); - Mockito.doReturn(machineSearchResponseDTO).when(residentServiceImplSpy).searchMachineInMasterService(any(), any()); - - MachineCreateResponseDTO machineCreateResponseDTO = new MachineCreateResponseDTO(); - MachineDto newMachineDTO = new MachineDto(); - newMachineDTO.setMachineSpecId("1001"); - newMachineDTO.setIsActive(false); - newMachineDTO.setId("10147"); - newMachineDTO.setName("resident_machine_1640777004542"); - newMachineDTO.setValidityDateTime("2024-12-29T11:23:24.541Z"); - newMachineDTO.setPublicKey(publicKey); - newMachineDTO.setSignPublicKey(publicKey); - machineCreateResponseDTO.setResponse(newMachineDTO); - when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(machineCreateResponseDTO); - - PacketGeneratorResDto updateDto = new PacketGeneratorResDto(); - updateDto.setRegistrationId("10008100670001720191120095702"); - Mockito.when(residentUpdateService.createPacket(any())).thenReturn(updateDto); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - ResidentUpdateResponseDTO residentUpdateResponseDTO = residentServiceImplSpy.reqUinUpdate(dto); - assertEquals(residentUpdateResponseDTO.getRegistrationId(), updateDto.getRegistrationId()); - } - - @Test - public void reqUinUpdateGetMachineIdReturnsTest() throws BaseCheckedException, IOException { - ResidentServiceImpl residentServiceImplSpy = spy(residentServiceImpl); - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGXPqbFOIZhB_N_fbTXOMIsRgq_LMdL9DJ5kWYAneCj_LPw3OEm2ncLVIRyJsF2DcSQwvzt_Njdvg1Cr54nD1uHBu3Vt9G1sy3p6uwbeK1l5mJSMNe5oGe11fmehtsR2QcB_45_us_IiiiUzzHJrySexmDfdOiPdy-dID4DYRDAf-HXlMIEf4Di_8NV3wVrA3jq1tuNkXX3qKtM4NhZOihp0HmB9E7RHttSV9VJNh00BrC57qdMfa5xqsHok3qftU5SAan4BGuPklN2fzOVcsa-V-B8JbwxRfPdwMkq-jW7Eu1LcNhNVQYJGEWDLAQDGKY_fOB_YwBzn8xvYRjqSfQIDAQAB"; - Mockito.doReturn(publicKey).when(residentServiceImplSpy).getPublicKeyFromKeyManager(); - when(utilities.getLanguageCode()).thenReturn("eng"); - - List machineDtos = new ArrayList<>(); - MachineDto machineDto = new MachineDto(); - machineDto.setMachineSpecId("1001"); - machineDto.setIsActive(false); - machineDto.setId("10147"); - machineDto.setName("resident_machine_1640777004542"); - machineDto.setValidityDateTime("2024-12-29T11:23:24.541Z"); - machineDto.setSignPublicKey(publicKey); - machineDtos.add(machineDto); - MachineSearchResponseDTO.MachineSearchDto response = MachineSearchResponseDTO.MachineSearchDto.builder().fromRecord(0).toRecord(0).toRecord(0).data(machineDtos).build(); - MachineSearchResponseDTO machineSearchResponseDTO = new MachineSearchResponseDTO(); - machineSearchResponseDTO.setId("null"); - machineSearchResponseDTO.setVersion("1.0"); - machineSearchResponseDTO.setResponsetime("2022-01-28T06:25:23.958Z"); - machineSearchResponseDTO.setResponse(response); - Mockito.doReturn(machineSearchResponseDTO).when(residentServiceImplSpy).searchMachineInMasterService(any(), any()); - - MachineCreateResponseDTO machineCreateResponseDTO = new MachineCreateResponseDTO(); - MachineDto newMachineDTO = new MachineDto(); - newMachineDTO.setMachineSpecId("1001"); - newMachineDTO.setIsActive(false); - newMachineDTO.setId("10147"); - newMachineDTO.setName("resident_machine_1640777004542"); - newMachineDTO.setValidityDateTime("2024-12-29T11:23:24.541Z"); - newMachineDTO.setPublicKey(publicKey); - newMachineDTO.setSignPublicKey(publicKey); - machineCreateResponseDTO.setResponse(newMachineDTO); - when(residentServiceRestClient.postApi(any(), any(), any(), any(Class.class))).thenReturn(machineCreateResponseDTO); - - PacketGeneratorResDto updateDto = new PacketGeneratorResDto(); - updateDto.setRegistrationId("10008100670001720191120095702"); - Mockito.when(residentUpdateService.createPacket(any())).thenReturn(updateDto); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - - ResidentUpdateResponseDTO residentUpdateResponseDTO = residentServiceImplSpy.reqUinUpdate(dto); - assertEquals(residentUpdateResponseDTO.getRegistrationId(), updateDto.getRegistrationId()); - verify(residentServiceImplSpy, never()).createNewMachineInMasterService(any(), any(), any(),any(), any()); - } - - @Test(expected = ResidentServiceException.class) - public void validateOtpException() - throws OtpValidationFailedException, IOException, ResidentServiceCheckedException { - Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), - Mockito.anyString())).thenReturn(false); - residentServiceImpl.reqUinUpdate(dto); - - } - - @Test(expected = ResidentServiceException.class) - public void JsonParsingException() throws ResidentServiceCheckedException { - Mockito.when(utility.getMappingJson()).thenReturn(null); - residentServiceImpl.reqUinUpdate(dto); - - } - - @Test(expected = ResidentServiceException.class) - public void testIOException() throws BaseCheckedException, IOException { - HttpClientErrorException exp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); - Mockito.when(residentUpdateService.createPacket(any())).thenThrow(new IOException("badgateway", exp)); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void testApiResourceAccessExceptionServer() throws BaseCheckedException, IOException { - HttpServerErrorException exp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); - Mockito.when(residentUpdateService.createPacket(any())).thenThrow(new ApisResourceAccessException("badgateway", exp)); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void testBaseCheckedException() throws BaseCheckedException, IOException { - Mockito.when(residentUpdateService.createPacket(any())).thenThrow(new BaseCheckedException("erorcode", "badgateway", new RuntimeException())); - residentServiceImpl.reqUinUpdate(dto); - } - - @Test(expected = ResidentServiceException.class) - public void otpValidationFailedException() throws OtpValidationFailedException, ResidentServiceCheckedException { - Mockito.when(idAuthService.validateOtp(Mockito.anyString(), Mockito.anyString(), - Mockito.anyString())).thenThrow(new OtpValidationFailedException()); - residentServiceImpl.reqUinUpdate(dto); - - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentVidServiceTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentVidServiceTest.java deleted file mode 100644 index b0ee5972172..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/service/ResidentVidServiceTest.java +++ /dev/null @@ -1,289 +0,0 @@ -package io.mosip.resident.test.service; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.apache.commons.io.IOUtils; -import org.assertj.core.util.Lists; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.core.env.Environment; -import org.springframework.test.context.ContextConfiguration; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.dto.NotificationRequestDto; -import io.mosip.resident.dto.NotificationResponseDTO; -import io.mosip.resident.dto.ResponseWrapper; -import io.mosip.resident.dto.VidGeneratorResponseDto; -import io.mosip.resident.dto.VidRequestDto; -import io.mosip.resident.dto.VidResponseDto; -import io.mosip.resident.dto.VidRevokeRequestDTO; -import io.mosip.resident.dto.VidRevokeResponseDTO; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.OtpValidationFailedException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.VidAlreadyPresentException; -import io.mosip.resident.exception.VidCreationException; -import io.mosip.resident.exception.VidRevocationException; -import io.mosip.resident.service.IdAuthService; -import io.mosip.resident.service.NotificationService; -import io.mosip.resident.service.ResidentVidService; -import io.mosip.resident.service.impl.ResidentVidServiceImpl; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; -import io.mosip.resident.util.Utilitiy; - -@RunWith(MockitoJUnitRunner.class) -@RefreshScope -@ContextConfiguration -public class ResidentVidServiceTest { - - private ObjectMapper objectMapper = new ObjectMapper(); - - @Mock - private Environment env; - - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @Mock - private NotificationService notificationService; - - @Mock - private IdAuthService idAuthService; - - @Mock - private ObjectMapper mapper; - - @Mock - private Utilitiy utilitiy; - - @Mock - private AuditUtil audit; - - private VidRequestDto requestDto; - - private VidRevokeRequestDTO vidRevokeRequest; - - @InjectMocks - private ResidentVidService residentVidService = new ResidentVidServiceImpl(); - private JSONObject identity; - - @Before - public void setup() throws IOException, ResidentServiceCheckedException { - - requestDto = new VidRequestDto(); - requestDto.setOtp("123"); - requestDto.setTransactionID("12345"); - requestDto.setIndividualId("1234567890"); - requestDto.setVidType("Temporary"); - - NotificationResponseDTO notificationResponseDTO = new NotificationResponseDTO(); - notificationResponseDTO.setMessage("Vid successfully generated"); - - when(notificationService.sendNotification(any(NotificationRequestDto.class))).thenReturn(notificationResponseDTO); - - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("ID.json").getFile()); - InputStream is = new FileInputStream(idJson); - String idJsonString = IOUtils.toString(is, "UTF-8"); - identity = JsonUtil.readValue(idJsonString, JSONObject.class); - - vidRevokeRequest = new VidRevokeRequestDTO(); - - vidRevokeRequest.setIndividualId("2038096257310540"); - vidRevokeRequest.setIndividualIdType(IdType.VID.name()); - vidRevokeRequest.setOtp("974436"); - vidRevokeRequest.setTransactionID("1111122222"); - vidRevokeRequest.setVidStatus("REVOKE"); - - NotificationRequestDto notificationRequestDto = new NotificationRequestDto(); - notificationRequestDto.setId("1234567"); - Mockito.doNothing().when(audit).setAuditRequestDto(Mockito.any()); - } - - @Test - public void generateVidSuccessTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, ResidentServiceCheckedException { - - String vid = "12345"; - VidGeneratorResponseDto vidGeneratorResponseDto = new VidGeneratorResponseDto(); - vidGeneratorResponseDto.setVidStatus("Active"); - vidGeneratorResponseDto.setVID(vid); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setResponse(vidGeneratorResponseDto); - - doReturn(objectMapper.writeValueAsString(vidGeneratorResponseDto)).when(mapper).writeValueAsString(any()); - doReturn(vidGeneratorResponseDto).when(mapper).readValue(anyString(), any(Class.class)); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); - - ResponseWrapper result = residentVidService.generateVid(requestDto); - - assertTrue("Expected Vid should be 12345", result.getResponse().getVid().equalsIgnoreCase(vid)); - } - - @Test(expected = OtpValidationFailedException.class) - public void otpValidationFailedTest() throws ResidentServiceCheckedException, OtpValidationFailedException { - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.FALSE); - residentVidService.generateVid(requestDto); - } - - @Test(expected = VidAlreadyPresentException.class) - public void vidAlreadyExistsExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { - - String VID_ALREADY_EXISTS_ERROR_CODE = "IDR-VID-003"; - - ServiceError serviceError = new ServiceError(); - serviceError.setErrorCode(VID_ALREADY_EXISTS_ERROR_CODE); - serviceError.setMessage("Vid already present"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setErrors(Lists.newArrayList(serviceError)); - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - - when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); - - residentVidService.generateVid(requestDto); - } - - @Test(expected = VidCreationException.class) - public void vidCreationExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { - - String ERROR_CODE = "err"; - - ServiceError serviceError = new ServiceError(); - serviceError.setErrorCode(ERROR_CODE); - serviceError.setMessage("Vid already present"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setErrors(Lists.newArrayList(serviceError)); - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - - when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenReturn(response); - - residentVidService.generateVid(requestDto); - } - - @Test(expected = VidCreationException.class) - public void apiResourceAccessExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { - - String ERROR_CODE = "err"; - - ServiceError serviceError = new ServiceError(); - serviceError.setErrorCode(ERROR_CODE); - serviceError.setMessage("Vid already present"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setErrors(Lists.newArrayList(serviceError)); - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - - when(residentServiceRestClient.postApi(any(), any(), any(), any())).thenThrow(new ApisResourceAccessException()); - - residentVidService.generateVid(requestDto); - } - - @Test - public void revokeVidSuccessTest() throws OtpValidationFailedException, IOException, ApisResourceAccessException, - ResidentServiceCheckedException { - - String vid = "2038096257310540"; - - VidGeneratorResponseDto dto = new VidGeneratorResponseDto(); - dto.setVidStatus("Deactive"); - - ResponseWrapper responseWrapper = new ResponseWrapper<>(); - responseWrapper.setResponse(dto); - responseWrapper.setVersion("v1"); - responseWrapper.setResponsetime(DateUtils.getCurrentDateTimeString()); - - when(utilitiy.retrieveIdrepoJson(anyString())).thenReturn(JsonUtil.getJSONObject(identity, "identity")); - - doReturn(objectMapper.writeValueAsString(dto)).when(mapper).writeValueAsString(any()); - doReturn(dto).when(mapper).readValue(anyString(), any(Class.class)); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(residentServiceRestClient.patchApi(any(), any(), any(), any())).thenReturn(responseWrapper); - - ResponseWrapper result2 = residentVidService.revokeVid(vidRevokeRequest,vid); - - assertEquals("Vid successfully generated", result2.getResponse().getMessage().toString()); - } - - @Test(expected = OtpValidationFailedException.class) - public void otpValidationFailedTest1() throws ResidentServiceCheckedException, OtpValidationFailedException { - String vid = "2038096257310540"; - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.FALSE); - - residentVidService.revokeVid(vidRevokeRequest, vid); - } - - @Test(expected = VidRevocationException.class) - public void apiResourceAccessExceptionTest2() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { - - String ERROR_CODE = "err"; - String vid = "2038096257310540"; - ServiceError serviceError = new ServiceError(); - serviceError.setErrorCode(ERROR_CODE); - serviceError.setMessage("No Record Found"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setErrors(Lists.newArrayList(serviceError)); - when(utilitiy.retrieveIdrepoJson(anyString())).thenReturn(JsonUtil.getJSONObject(identity, "identity")); - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - - when(residentServiceRestClient.patchApi(any(), any(), any(), any())).thenThrow(new ApisResourceAccessException()); - - residentVidService.revokeVid(vidRevokeRequest,vid); - } - - @Test(expected = VidRevocationException.class) - public void idRepoAppExceptionTest() throws ResidentServiceCheckedException, OtpValidationFailedException, ApisResourceAccessException { - - String ERROR_CODE = "err"; - String vid = "2038096257310540"; - ServiceError serviceError = new ServiceError(); - serviceError.setErrorCode(ERROR_CODE); - serviceError.setMessage("No Record Found"); - ResponseWrapper response = new ResponseWrapper<>(); - response.setResponsetime(DateUtils.getCurrentDateTimeString()); - response.setErrors(Lists.newArrayList(serviceError)); - when(utilitiy.retrieveIdrepoJson(anyString())).thenThrow(VidRevocationException.class); - - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - when(idAuthService.validateOtp(anyString(), anyString(), anyString())).thenReturn(Boolean.TRUE); - - residentVidService.revokeVid(vidRevokeRequest,vid); - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/IdSchemaUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/util/IdSchemaUtilTest.java deleted file mode 100644 index 0861d686a64..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/IdSchemaUtilTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package io.mosip.resident.test.util; - -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.util.IdSchemaUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import org.assertj.core.util.Lists; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.core.env.Environment; -import org.springframework.test.util.ReflectionTestUtils; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static io.mosip.resident.util.IdSchemaUtil.*; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; -import static org.powermock.api.mockito.PowerMockito.when; - -/** - * @author Abubacker Siddik - */ -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest({DateUtils.class}) -public class IdSchemaUtilTest { - - @InjectMocks - private IdSchemaUtil idSchemaUtil; - - @Mock - private Environment env; - - @Mock - private ResidentServiceRestClient restClientService; - - private String responseJson; - - @Before - public void setUp() throws Exception { - responseJson = "{\n" + - " \"id\": null,\n" + - " \"version\": null,\n" + - " \"responsetime\": \"2022-01-11T06:08:02.307Z\",\n" + - " \"metadata\": null,\n" + - " \"response\": {\n" + - " \"schemaJson\": \"{\\\"$schema\\\":\\\"http:\\/\\/json-schema.org\\/draft-07\\/schema#\\\",\\\"description\\\":\\\"MOSIP Sample identity\\\",\\\"additionalProperties\\\":false,\\\"title\\\":\\\"MOSIP identity\\\",\\\"type\\\":\\\"object\\\",\\\"definitions\\\":{\\\"simpleType\\\":{\\\"uniqueItems\\\":true,\\\"additionalItems\\\":false,\\\"type\\\":\\\"array\\\",\\\"items\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"language\\\",\\\"value\\\"],\\\"properties\\\":{\\\"language\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"documentType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"},\\\"refNumber\\\":{\\\"type\\\":\\\"string\\\"}}},\\\"biometricsType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"version\\\":{\\\"type\\\":\\\"number\\\",\\\"minimum\\\":0},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"properties\\\":{\\\"identity\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"IDSchemaVersion\\\",\\\"fullName\\\",\\\"dateOfBirth\\\",\\\"gender\\\",\\\"addressLine1\\\",\\\"addressLine2\\\",\\\"addressLine3\\\",\\\"region\\\",\\\"province\\\",\\\"city\\\",\\\"zone\\\",\\\"postalCode\\\",\\\"phone\\\",\\\"email\\\",\\\"proofOfIdentity\\\",\\\"individualBiometrics\\\"],\\\"properties\\\":{\\\"proofOfAddress\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"gender\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"city\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"postalCode\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[(?i)A-Z0-9]{5}$|^NA$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfException-1\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"referenceIdentityNumber\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^([0-9]{10,30})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"kyc\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"province\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"zone\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfDateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"addressLine1\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine2\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"residenceStatus\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"kyc\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine3\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"email\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[A-Za-z0-9_\\\\\\\\-]+(\\\\\\\\.[A-Za-z0-9_]+)*@[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_]+)*(\\\\\\\\.[a-zA-Z]{2,})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerRID\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"fullName\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"dateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(1869|18[7-9][0-9]|19[0-9][0-9]|20[0-9][0-9])\\/([0][1-9]|1[0-2])\\/([0][1-9]|[1-2][0-9]|3[01])$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualAuthBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"introducerUIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfIdentity\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"IDSchemaVersion\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"number\\\",\\\"fieldType\\\":\\\"default\\\",\\\"minimum\\\":0},\\\"proofOfException\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"phone\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[+]*([0-9]{1})([0-9]{9})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerName\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfRelationship\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"UIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"region\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"}}}}}\",\n" + - " \"id\": \"1001\",\n" + - " \"effectiveFrom\": \"2021-12-22T13:45:46.303Z\",\n" + - " \"status\": \"PUBLISHED\"\n" + - " },\n" + - " \"errors\": null\n" + - "}"; - } - - @Test - public void loadDefaultFieldsTest() throws Exception { - Double schemaVersion = 0.1d; - when(restClientService.getApi(ApiName.MIDSCHEMAURL, null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class)).thenReturn(responseJson); - - List> schemaMap = idSchemaUtil.loadDefaultFields(schemaVersion); - assertEquals(schemaMap.get(0).get("id"), "proofOfAddress"); - assertEquals(schemaMap.get(0).get("type"), "#/definitions/documentType"); - assertEquals(schemaMap.get(1).get("id"), "gender"); - assertEquals(schemaMap.get(1).get("type"), "#/definitions/simpleType"); - assertEquals(schemaMap.get(2).get("id"), "city"); - assertEquals(schemaMap.get(2).get("type"), "#/definitions/simpleType"); - assertEquals(schemaMap.get(10).get("id"), "addressLine1"); - assertEquals(schemaMap.get(10).get("type"), "#/definitions/simpleType"); - assertEquals(schemaMap.get(13).get("id"), "addressLine3"); - assertEquals(schemaMap.get(13).get("type"), "#/definitions/simpleType"); - assertEquals(schemaMap.get(16).get("id"), "dateOfBirth"); - assertEquals(schemaMap.get(16).get("type"), "string"); - assertEquals(schemaMap.get(17).get("id"), "individualAuthBiometrics"); - assertEquals(schemaMap.get(17).get("type"), "#/definitions/biometricsType"); - assertEquals(schemaMap.get(20).get("id"), "phone"); - assertEquals(schemaMap.get(20).get("type"), "string"); - assertEquals(schemaMap.get(23).get("id"), "region"); - assertEquals(schemaMap.get(23).get("type"), "#/definitions/simpleType"); - - verify(restClientService, times(1)).getApi(ApiName.MIDSCHEMAURL, null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class); - } - - @Test(expected = ApisResourceAccessException.class) - public void throwApiResourceAccessIfResponseIsNull() throws Exception { - Double schemaVersion = 0.1d; - when(restClientService.getApi(ApiName.MIDSCHEMAURL, null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class)).thenReturn(null); - idSchemaUtil.loadDefaultFields(schemaVersion); - } - - @Test - public void testIfIdSchemaMapIsUsedAndRestClientNeverInvoked() throws JSONException, ApisResourceAccessException, IOException { - Double schemaVersion = 0.1d; - JSONObject jsonObject = new JSONObject(responseJson); - JSONObject respObj = (JSONObject) jsonObject.get(RESPONSE); - String responseString = respObj != null ? (String) respObj.get(SCHEMA_JSON) : null; - Map idschema = new HashMap<>(); - idschema.put(schemaVersion, responseString); - ReflectionTestUtils.setField(idSchemaUtil, "idschema", idschema); - - idSchemaUtil.loadDefaultFields(schemaVersion); - verify(restClientService, never()).getApi(ApiName.MIDSCHEMAURL, null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/ResidentServiceRestClientTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/util/ResidentServiceRestClientTest.java deleted file mode 100644 index c1464fd384a..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/ResidentServiceRestClientTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package io.mosip.resident.test.util; - -import io.mosip.resident.constant.ApiName; -import io.mosip.resident.dto.AutnTxnResponseDto; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.util.ResidentServiceRestClient; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Matchers; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -import java.net.URI; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -@RunWith(MockitoJUnitRunner.class) -public class ResidentServiceRestClientTest { - - @InjectMocks - ResidentServiceRestClient residentServiceRestClient; - - @Mock - RestTemplateBuilder builder; - - @Mock - Environment environment; - - @Mock - RestTemplate residentRestTemplate; - - - @Before - public void setup() { - } - - @Test - public void testgetApi() throws ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - ResponseEntity obj = new ResponseEntity<>(autnTxnResponseDto, HttpStatus.OK); - URI uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234").build(false).encode().toUri(); - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.exchange(any(URI.class), any(HttpMethod.class), any(), Matchers.>any())).thenReturn(obj); - - assertTrue(client.getApi(uri, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test(expected = ApisResourceAccessException.class) - public void testgetApiException() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - URI uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234").build(false).encode().toUri(); - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.exchange(any(URI.class), any(HttpMethod.class), any(), Matchers.>any())). - thenThrow(new RestClientException("")); - - client.getApi(uri, AutnTxnResponseDto.class); - } - - @Test - public void testgetApiObject() throws ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - doReturn(autnTxnResponseDto).when(client).getApi(any(), any()); - List list = new ArrayList<>(); - list.add("individualIdType"); - list.add("UIN"); - list.add("individualId"); - list.add("1234"); - - - assertTrue(client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, "", null, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test(expected = ApisResourceAccessException.class) - public void testgetApiObjectException() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - doThrow(new ApisResourceAccessException()).when(client).getApi(any(), any()); - List list = new ArrayList<>(); - list.add("individualIdType"); - list.add("UIN"); - list.add("individualId"); - list.add("1234"); - - client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, "pageFetch,pageStart", "50,1", AutnTxnResponseDto.class); - } - - @Test - public void testpostApi() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.postForObject(any(String.class), any(), Matchers.>any())). - thenReturn(autnTxnResponseDto); - - assertTrue(client.postApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", MediaType.APPLICATION_JSON, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test(expected = ApisResourceAccessException.class) - public void testpostApiException() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.postForObject(any(String.class), any(), Matchers.>any())). - thenThrow(new RestClientException("")); - - assertTrue(client.postApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", MediaType.APPLICATION_JSON, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test - public void testpatchApi() throws Exception { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.patchForObject(any(String.class), any(), Matchers.>any())). - thenReturn(autnTxnResponseDto); - - assertTrue(client.patchApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test(expected = ApisResourceAccessException.class) - public void testpatchApiException() throws Exception { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.patchForObject(any(String.class), any(), Matchers.>any())). - thenThrow(new RestClientException("")); - - assertTrue(client.patchApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); - } - - @Test - public void testputApi() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - ResponseEntity obj = new ResponseEntity(autnTxnResponseDto, HttpStatus.OK); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.>any())). - thenReturn(obj); - - assertTrue(client.putApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, AutnTxnResponseDto.class, MediaType.APPLICATION_JSON).toString().contains("ancd")); - } - - @Test(expected = ApisResourceAccessException.class) - public void testputApiException() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { - AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); - autnTxnResponseDto.setId("ancd"); - - ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); - when(residentRestTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.>any())). - thenThrow(new RestClientException("")); - - client.putApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, AutnTxnResponseDto.class, MediaType.APPLICATION_JSON); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilitiesTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilitiesTest.java deleted file mode 100644 index 5def58c45d8..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilitiesTest.java +++ /dev/null @@ -1,220 +0,0 @@ -package io.mosip.resident.test.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.resident.constant.ResidentErrorCode; -import io.mosip.resident.dto.*; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.VidCreationException; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilities; -import org.apache.commons.io.IOUtils; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.core.env.Environment; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.RestTemplate; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest -public class UtilitiesTest { - - @InjectMocks - @Spy - private Utilities utilities = new Utilities(); - - @Mock - private ObjectMapper objMapper; - - @Mock - private Environment env; - - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @Mock - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - JSONObject identity; - - JSONObject identityVID; - - @Before - public void setUp() throws IOException, ApisResourceAccessException { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("Idrepo.json").getFile()); - InputStream is = new FileInputStream(idJson); - String idJsonString = IOUtils.toString(is, "UTF-8"); - identity = JsonUtil.readValue(idJsonString, JSONObject.class); - - File idJsonVid = new File(classLoader.getResource("IdVidRepo.json").getFile()); - is = new FileInputStream(idJsonVid); - idJsonString = IOUtils.toString(is, "UTF-8"); - identityVID = JsonUtil.readValue(idJsonString, JSONObject.class); - } - - @Test - public void testRetrieveIdrepoJsonSuccess() throws ApisResourceAccessException, IOException { - Map uin = (Map) JsonUtil.getJSONObject(identity, "response").get("identity"); - IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); - ResponseDTO1 responseDTO1 = new ResponseDTO1(); - responseDTO1.setStatus("Activated"); - responseDTO1.setIdentity(JsonUtil.getJSONObject(identity, "response").get("identity")); - idResponseDTO1.setResponse(responseDTO1); - - String identityString = JsonUtil.writeValueAsString(JsonUtil.getJSONObject(identity, "response").get("identity")); - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); - Mockito.when(objMapper.writeValueAsString(any())).thenReturn(identityString); - - // UIN - JSONObject identityJsonObj = utilities.retrieveIdrepoJson("3527812406"); - assertEquals(identityJsonObj.get("UIN"), uin.get("UIN")); - } - - @Test(expected = IdRepoAppException.class) - public void testRetrieveIdrepoJsonThrowIdRepoAppException() throws ApisResourceAccessException, IOException { - ServiceError error = new ServiceError(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); - List errorResponse = new ArrayList<>(); - errorResponse.add(error); - IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); - idResponseDTO1.setErrors(errorResponse); - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); - - // UIN - utilities.retrieveIdrepoJson("3527812406"); - } - - @Test - public void testGetUinByVid() throws ApisResourceAccessException, IOException { - JSONObject response = JsonUtil.getJSONObject(identityVID, "response"); - VidResDTO vidResDTO = new VidResDTO(); - vidResDTO.setVidStatus((String) response.get("vidStatus")); - vidResDTO.setRestoredVid((VidResDTO) response.get("restoredVid")); - vidResDTO.setUin((String) response.get("UIN")); - vidResDTO.setVid((String) response.get("VID")); - VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); - vidResponseDTO1.setResponse(vidResDTO); - vidResponseDTO1.setErrors(new ArrayList<>()); - - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(vidResponseDTO1); - - // VID - String uin = utilities.getUinByVid("6241572684701486"); - assertEquals(uin, response.get("UIN")); - } - - - @Test(expected = VidCreationException.class) - public void testGetUinByVidThrowVidCreationException() throws ApisResourceAccessException, IOException { - ErrorDTO error = new ErrorDTO(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); - List errorResponse = new ArrayList<>(); - errorResponse.add(error); - VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); - vidResponseDTO1.setErrors(errorResponse); - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(vidResponseDTO1); - - // VID - utilities.getUinByVid("6241572684701486"); - } - - - @Test - public void testRetrieveIdrepoJsonStatus() throws ApisResourceAccessException, IOException { - JSONObject response = JsonUtil.getJSONObject(identity, "response"); - IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); - ResponseDTO1 responseDTO1 = new ResponseDTO1(); - responseDTO1.setStatus((String) response.get("status")); - responseDTO1.setIdentity(response.get("identity")); - idResponseDTO1.setResponse(responseDTO1); - - String identityString = JsonUtil.writeValueAsString(response.get("identity")); - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); - Mockito.when(objMapper.writeValueAsString(any())).thenReturn(identityString); - - // Status - String status = utilities.retrieveIdrepoJsonStatus("3527812406"); - assertEquals(status, response.get("status")); - } - - - @Test(expected = IdRepoAppException.class) - public void testRetrieveIdrepoJsonStatusThrowIdRepoAppException() throws ApisResourceAccessException, IOException { - ServiceError error = new ServiceError(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); - List errorResponse = new ArrayList<>(); - errorResponse.add(error); - IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); - idResponseDTO1.setErrors(errorResponse); - Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); - - // UIN - utilities.retrieveIdrepoJsonStatus("3527812406"); - } - - @Test - public void testGetRegistrationProcessorMappingJsonWithMappingJsonNotNull() throws IOException { - JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); - Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); - - String identityString = JsonUtil.writeValueAsString(jsonStringObject); - ReflectionTestUtils.setField(utilities, "mappingJsonString", identityString); - - Object identityObject = jsonStringObject.get("identity"); - - JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); - assertEquals(registrationProcessorMappingJson, identityObject); - verify(utilities, never()).getJson(anyString(), anyString()); - } - - @Test - public void testGetRegistrationProcessorMappingJsonWithMappingJsonIsNull() throws IOException { - JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); - Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); - - String identityString = JsonUtil.writeValueAsString(jsonStringObject); - ReflectionTestUtils.setField(utilities, "regProcessorIdentityJson", identityString); - - Object identityObject = jsonStringObject.get("identity"); - JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); - assertEquals(registrationProcessorMappingJson, identityObject); - verify(residentRestTemplate, never()).getForObject(anyString(), any(Class.class)); - } - - @Test - public void testGetRegistrationProcessorMappingJsonWithProcessorIdentityJsonIsNull() throws IOException { - JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); - Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); - String identityString = JsonUtil.writeValueAsString(jsonStringObject); - Mockito.when(residentRestTemplate.getForObject(anyString(), any(Class.class))).thenReturn(identityString); - - Object identityObject = jsonStringObject.get("identity"); - JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); - assertEquals(registrationProcessorMappingJson, identityObject); - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilityTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilityTest.java deleted file mode 100644 index fa77d19a989..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UtilityTest.java +++ /dev/null @@ -1,302 +0,0 @@ -package io.mosip.resident.test.util; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpStatus; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; - -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.resident.dto.IdRepoResponseDto; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.ResidentServiceCheckedException; -import io.mosip.resident.exception.ResidentServiceException; -import io.mosip.resident.util.JsonUtil; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.Utilitiy; -import org.springframework.web.client.RestTemplate; - -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) -@PrepareForTest({ JsonUtil.class }) -public class UtilityTest { - @Mock - private ResidentServiceRestClient residentServiceRestClient; - - @InjectMocks - private Utilitiy utility; - - private JSONObject identity; - - @Mock - private Environment env; - - @Mock - @Qualifier("selfTokenRestTemplate") - private RestTemplate residentRestTemplate; - - @Before - public void setUp() throws IOException, ApisResourceAccessException { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("ID.json").getFile()); - InputStream is = new FileInputStream(idJson); - String idJsonString = IOUtils.toString(is, "UTF-8"); - identity = JsonUtil.readValue(idJsonString, JSONObject.class); - ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "url"); - ReflectionTestUtils.setField(utility, "residentIdentityJson", "json"); - } - - @Test - public void retrieveIdrepoJsonSuccessTest() throws ResidentServiceCheckedException, ApisResourceAccessException { - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - // UIN - JSONObject identityJsonObj = utility.retrieveIdrepoJson("3527812406"); - assertEquals(identityJsonObj.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); - // RID - JSONObject jsonUsingRID = utility.retrieveIdrepoJson("10008200070004420191203104356"); - assertEquals(jsonUsingRID.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); - - } - - @Test - public void testRetrieveVidSuccess() throws ApisResourceAccessException, ResidentServiceCheckedException { - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - JSONObject jsonUsingVID = utility.retrieveIdrepoJson("5628965106742572"); - assertEquals(jsonUsingVID.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); - } - - @Test(expected = ResidentServiceCheckedException.class) - public void retrieveIdrepoJsonClientError() throws ApisResourceAccessException, ResidentServiceCheckedException { - HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenThrow(apiResourceAccessExp); - utility.retrieveIdrepoJson("3527812406"); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void retrieveIdrepoJsonServerError() throws ApisResourceAccessException, ResidentServiceCheckedException { - HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenThrow(apiResourceAccessExp); - utility.retrieveIdrepoJson("3527812406"); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void retrieveIdrepoJsonUnknownException() - throws ApisResourceAccessException, ResidentServiceCheckedException { - ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", - new RuntimeException()); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenThrow(apiResourceAccessExp); - utility.retrieveIdrepoJson("3527812406"); - - } - - @Test(expected = IdRepoAppException.class) - public void testIdRepoAppException() throws ApisResourceAccessException, ResidentServiceCheckedException { - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(null); - utility.retrieveIdrepoJson("3527812406"); - - } - - @Test(expected = IdRepoAppException.class) - public void vidResponseNull() throws ApisResourceAccessException, ResidentServiceCheckedException { - List pathsegments = new ArrayList<>(); - pathsegments.add("5628965106742572"); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(null); - utility.retrieveIdrepoJson("5628965106742572"); - - } - - @Test - public void testGetMailingAttributes() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - - Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("user@mail.com", attributes.get("email")); - Map attributes1 = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("user@mail.com", attributes1.get("email")); - - } - - @Test - public void testGetPreferredLanguage() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - - Mockito.doReturn("preferredLang").when(env).getProperty("mosip.default.user-preferred-language-attribute"); - Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("eng", attributes.get("preferredLang")); - } - - @Test - public void testGetDefaultTemplateLanguages() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - - Mockito.doReturn("preferredLang").when(env).getProperty("mosip.default.template-languages"); - Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("eng", attributes.get("preferredLang")); - } - - @Test - public void testGetDataCapturedLanguages() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - - Mockito.doReturn(null).when(env).getProperty("mosip.default.template-languages"); - Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("eng", attributes.get("preferredLang")); - } - - @Test - public void testGetMappingJson() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", mappingJson); - - ResponseWrapper response = new ResponseWrapper<>(); - IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); - idRepoResponseDto.setStatus("Activated"); - idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); - response.setResponse(idRepoResponseDto); - Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), - any(), any(Class.class))).thenReturn(response); - - Map attributes = utility.getMailingAttributes("3527812406", new HashSet()); - assertEquals("eng", attributes.get("preferredLang")); - verify(residentRestTemplate, never()).getForObject(anyString(), any(Class.class)); - } - - @Test(expected = ResidentServiceException.class) - public void testGetMailingAttributesJSONParsingException() throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = ""; - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("user@mail.com", attributes.get("email")); - - ReflectionTestUtils.setField(utilitySpy, "languageType", "NA"); - Map attributes1 = utilitySpy.getMailingAttributes("3527812406", new HashSet()); - assertEquals("user@mail.com", attributes1.get("email")); - - } - - @Test(expected = ResidentServiceCheckedException.class) - public void testGetMailingAttributesIOException() throws IOException, ResidentServiceCheckedException { - ClassLoader classLoader = getClass().getClassLoader(); - File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); - InputStream is = new FileInputStream(idJson); - String mappingJson = IOUtils.toString(is, "UTF-8"); - Utilitiy utilitySpy = Mockito.spy(utility); - Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); - Mockito.doReturn(JsonUtil.getJSONObject(identity, "identity")).when(utilitySpy) - .retrieveIdrepoJson(Mockito.anyString()); - PowerMockito.mockStatic(JsonUtil.class); - PowerMockito.when(JsonUtil.readValue(mappingJson, JSONObject.class)).thenThrow(new IOException()); - utilitySpy.getMailingAttributes("3527812406", new HashSet()); - - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestHandlerRequestValidatorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestHandlerRequestValidatorTest.java deleted file mode 100644 index e02e5d84688..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestHandlerRequestValidatorTest.java +++ /dev/null @@ -1,198 +0,0 @@ -package io.mosip.resident.test.validator; - -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; - -import java.io.IOException; - -import org.assertj.core.util.Lists; -import org.json.simple.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.core.env.Environment; -import org.springframework.test.context.junit4.SpringRunner; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.exception.BaseCheckedException; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.kernel.core.idvalidator.spi.VidValidator; -import io.mosip.resident.constant.CardType; -import io.mosip.resident.dto.LogDescription; -import io.mosip.resident.dto.MachineDto; -import io.mosip.resident.dto.MachineResponseDto; -import io.mosip.resident.dto.RegistrationCenterDto; -import io.mosip.resident.dto.RegistrationCenterResponseDto; -import io.mosip.resident.dto.RegistrationType; -import io.mosip.resident.exception.ApisResourceAccessException; -import io.mosip.resident.exception.IdRepoAppException; -import io.mosip.resident.exception.RequestHandlerValidationException; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.TokenGenerator; -import io.mosip.resident.util.Utilities; -import io.mosip.resident.validator.RequestHandlerRequestValidator; - -@RunWith(SpringRunner.class) -public class RequestHandlerRequestValidatorTest { - - @InjectMocks - private RequestHandlerRequestValidator requestHandlerRequestValidator; - - /** The rest client service. */ - @Mock - private ResidentServiceRestClient restClientService; - - /** The mapper. */ - @Mock - private ObjectMapper mapper = new ObjectMapper(); - - @Mock - private UinValidator uinValidatorImpl; - - /** The vid validator impl. */ - @Mock - private VidValidator vidValidatorImpl; - - /** The utilities. */ - @Mock - private Utilities utilities; - - @Mock - private Environment env; - - private static final String ID = "110011"; - - @Before - public void setup() throws ApisResourceAccessException, IOException { - Mockito.when(env.getProperty("mosip.mandatory-languages")).thenReturn("eng"); - Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))).thenReturn(new ResponseWrapper<>()); - Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); - } - - @Test(expected = RequestHandlerValidationException.class) - public void testRequestHandlerValidationException() throws RequestHandlerValidationException { - requestHandlerRequestValidator.validate(ID); - } - - @Test(expected = RequestHandlerValidationException.class) - public void testValidateNullId() throws RequestHandlerValidationException { - requestHandlerRequestValidator.validate(null); - } - - @Test - public void testValidCenter() throws BaseCheckedException, IOException { - RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); - RegistrationCenterResponseDto rcpdto = new RegistrationCenterResponseDto(); - rcpdto.setRegistrationCenters(Lists.newArrayList(registrationCenterDto)); - - Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(rcpdto); - - boolean result = requestHandlerRequestValidator.isValidCenter(ID); - assertTrue(result); - } - - @Test - public void testValidMachine() throws BaseCheckedException, IOException { - MachineDto registrationCenterDto = new MachineDto(); - MachineResponseDto machinedto = new MachineResponseDto(); - machinedto.setMachines(Lists.newArrayList(registrationCenterDto)); - - Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(machinedto); - - boolean result = requestHandlerRequestValidator.isValidMachine(ID); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testInValidContact() throws BaseCheckedException { - boolean result = requestHandlerRequestValidator.isValidContactType("whatsapp", new LogDescription()); - } - - @Test - public void testValidContact() throws BaseCheckedException, IOException { - String EMAIL = "Email"; - boolean result = requestHandlerRequestValidator.isValidContactType(EMAIL, new LogDescription()); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testInValidCardType() throws BaseCheckedException { - boolean result = requestHandlerRequestValidator.isValidCardType("wedding card"); - } - - @Test - public void testValidCardType() throws BaseCheckedException, IOException { - boolean result = requestHandlerRequestValidator.isValidCardType(CardType.MASKED_UIN.name()); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testInValidIdType() throws BaseCheckedException { - boolean result = requestHandlerRequestValidator.isValidCardType("voter id"); - } - - @Test - public void testValidIdType() throws BaseCheckedException, IOException { - String UIN = "UIN"; - boolean result = requestHandlerRequestValidator.isValidCardType(UIN); - assertTrue(result); - } - - @Test - public void testValidUin() throws BaseCheckedException, IOException { - JSONObject jsonObject = new JSONObject(); - Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); - Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenReturn(jsonObject); - - boolean result = requestHandlerRequestValidator.isValidUin("1234"); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testIdRepoAppException() throws BaseCheckedException, IOException { - JSONObject jsonObject = new JSONObject(); - Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); - Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new IdRepoAppException("errorcode", "message")); - - boolean result = requestHandlerRequestValidator.isValidUin("1234"); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testApisResourceAccessException() throws BaseCheckedException, IOException { - JSONObject jsonObject = new JSONObject(); - Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); - Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new ApisResourceAccessException("errorcode")); - - boolean result = requestHandlerRequestValidator.isValidUin("1234"); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testIOException() throws BaseCheckedException, IOException { - JSONObject jsonObject = new JSONObject(); - Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); - Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new IOException("errorcode")); - - boolean result = requestHandlerRequestValidator.isValidUin("1234"); - assertTrue(result); - } - - @Test(expected = BaseCheckedException.class) - public void testInValidRePrintRegistrationType() throws BaseCheckedException { - boolean result = requestHandlerRequestValidator.isValidRePrintRegistrationType("LOST"); - } - - @Test - public void testValidRePrintRegistrationType() throws BaseCheckedException, IOException { - String UIN = "UIN"; - boolean result = requestHandlerRequestValidator.isValidRePrintRegistrationType(RegistrationType.RES_REPRINT.name()); - assertTrue(result); - } -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestValidatorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestValidatorTest.java deleted file mode 100644 index 293ddfb2fce..00000000000 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/validator/RequestValidatorTest.java +++ /dev/null @@ -1,901 +0,0 @@ -package io.mosip.resident.test.validator; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; - -import io.mosip.kernel.core.idvalidator.spi.RidValidator; -import io.mosip.kernel.core.idvalidator.spi.UinValidator; -import io.mosip.kernel.core.idvalidator.spi.VidValidator; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.constant.AuthTypeStatus; -import io.mosip.resident.constant.CardType; -import io.mosip.resident.constant.IdType; -import io.mosip.resident.constant.RequestIdType; -import io.mosip.resident.dto.AuthHistoryRequestDTO; -import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; -import io.mosip.resident.dto.AuthUnLockRequestDTO; -import io.mosip.resident.dto.EuinRequestDTO; -import io.mosip.resident.dto.RequestDTO; -import io.mosip.resident.dto.RequestWrapper; -import io.mosip.resident.dto.ResidentReprintRequestDto; -import io.mosip.resident.dto.ResidentUpdateRequestDto; -import io.mosip.resident.exception.InvalidInputException; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.validator.RequestValidator; - -@RunWith(SpringRunner.class) -public class RequestValidatorTest { - - @Mock - private UinValidator uinValidator; - - @Mock - private VidValidator vidValidator; - - @Mock - private RidValidator ridValidator; - - @InjectMocks - private RequestValidator requestValidator; - - @Mock - private AuditUtil audit; - - String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - - @Before - public void setup() { - Mockito.when(uinValidator.validateId(Mockito.any())).thenReturn(true); - Map map = new HashMap(); - map.put(RequestIdType.RE_PRINT_ID, "mosip.resident.print"); - map.put(RequestIdType.AUTH_LOCK_ID, "mosip.resident.authlock"); - map.put(RequestIdType.AUTH_UNLOCK_ID, "mosip.resident.authunlock"); - map.put(RequestIdType.E_UIN_ID, "mosip.resident.euin"); - map.put(RequestIdType.AUTH_HISTORY_ID, "mosip.resident.authhistory"); - map.put(RequestIdType.RES_UPDATE, "mosip.resident.updateuin"); - map.put(RequestIdType.CHECK_STATUS, "mosip.resident.checkstatus"); - ReflectionTestUtils.setField(requestValidator, "checkStatusID", "mosip.resident.checkstatus"); - ReflectionTestUtils.setField(requestValidator, "authLockId", "mosip.resident.authlock"); - ReflectionTestUtils.setField(requestValidator, "euinId", "mosip.resident.euin"); - ReflectionTestUtils.setField(requestValidator, "authHstoryId", "mosip.resident.authhistory"); - ReflectionTestUtils.setField(requestValidator, "uinUpdateId", "mosip.resident.updateuin"); - ReflectionTestUtils.setField(requestValidator, "authTypes", "bio-FIR,bio-IIR"); - ReflectionTestUtils.setField(requestValidator, "version", "v1"); - ReflectionTestUtils.setField(requestValidator, "map", map); - - Mockito.when(uinValidator.validateId(Mockito.anyString())).thenReturn(true); - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); - Mockito.when(ridValidator.validateId(Mockito.anyString())).thenReturn(true); - - } - - @Test(expected = InvalidInputException.class) - public void testValidId() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authLockRequestDto); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidUnlockId() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authLockRequestDto); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.UNLOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValideuinId() throws Exception { - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidAuthHistoryId() throws Exception { - AuthHistoryRequestDTO authHistoryRequestDTO = new AuthHistoryRequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authHistoryRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authlock"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidVersion() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidAuthHistoryVersion() throws Exception { - AuthHistoryRequestDTO authHistoryRequestDTO = new AuthHistoryRequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authHistoryRequestDTO); - requestWrapper.setVersion("v2"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValideuinVersion() throws Exception { - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v2"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidRequest() throws Exception { - - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(null); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidAuthHistoryRequest() throws Exception { - - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestWrapper.setRequest(null); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValideuinRequest() throws Exception { - - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestWrapper.setRequest(null); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidIndividualType() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidIndividualId() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.any())).thenReturn(false); - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setTransactionID("12345"); - authLockRequestDto.setIndividualId("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testeuinValidIndividualType() throws Exception { - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - euinRequestDTO.setIndividualIdType(IdType.RID.name()); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidIndividualType() throws Exception { - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidOtp() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setTransactionID("12345"); - authLockRequestDto.setIndividualId("12344567"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidAuthTypes() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setTransactionID("12345"); - authLockRequestDto.setOtp("1232354"); - authLockRequestDto.setIndividualId("12344567"); - List authTypes = new ArrayList(); - authTypes.add("bio-FMR"); - authLockRequestDto.setAuthType(authTypes); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidEmptyAuthTypes() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setTransactionID("12345"); - authLockRequestDto.setOtp("1232354"); - authLockRequestDto.setIndividualId("12344567"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidPageFetch() throws Exception { - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageStart("1"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidPageStart() throws Exception { - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch("1"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidIndividualId() throws Exception { - Mockito.when(uinValidator.validateId(Mockito.anyString())).thenReturn(false); - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch("1"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidpageFetch() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch("1Q"); - authRequestDTO.setPageStart("1"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidpageStart() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch("1"); - authRequestDTO.setPageStart("1Q"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidpageStartPageFetch() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch(" "); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - authRequestDTO.setPageStart(" "); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidPageStartnullPageFetch() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - authRequestDTO.setPageStart(" "); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidnullPageStartPageFetch() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch(" "); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryinValidpageStartPageFetch() throws Exception { - - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("123"); - authRequestDTO.setPageFetch("-10"); - authRequestDTO.setPageStart("-11"); - authRequestDTO.setOtp("12345"); - authRequestDTO.setTransactionID("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testeuinValidIndividualId() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - euinRequestDTO.setIndividualIdType(IdType.VID.name()); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test - public void testValidateRequest() { - ResidentReprintRequestDto request = new ResidentReprintRequestDto(); - request.setIndividualId("3542102"); - request.setIndividualIdType(IdType.UIN.name()); - request.setOtp("1234"); - request.setTransactionID("9876543210"); - RequestWrapper reqWrapper = new RequestWrapper<>(); - reqWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - reqWrapper.setRequest(request); - reqWrapper.setId("mosip.resident.print"); - reqWrapper.setVersion("v1"); - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - - } - - @Test(expected = InvalidInputException.class) - public void testvalidateRequestInValidId() { - - RequestWrapper reqWrapper = new RequestWrapper<>(); - reqWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - - reqWrapper.setId("mosip.resident.print1"); - - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - - reqWrapper.setVersion("v1"); - - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - - reqWrapper.setId("mosip.resident.print"); - reqWrapper.setVersion("v2"); - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - - } - - @Test - public void testInvalidDateTime() { - boolean result = false; - ResidentReprintRequestDto request = new ResidentReprintRequestDto(); - RequestWrapper reqWrapper = new RequestWrapper<>(); - reqWrapper.setRequest(request); - reqWrapper.setId("mosip.resident.print"); - reqWrapper.setVersion("v1"); - try { - requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); - } catch (InvalidInputException e) { - assertTrue(e.getMessage().contains("Invalid Input Parameter- requesttime")); - result = true; - } - if (!result) - fail(); - } - - @Test(expected = InvalidInputException.class) - public void testeuinValidCardType() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - euinRequestDTO.setIndividualIdType(IdType.VID.name()); - euinRequestDTO.setIndividualId("1234567"); - euinRequestDTO.setCardType("vid"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testeuinValidOtp() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - euinRequestDTO.setIndividualIdType(IdType.VID.name()); - euinRequestDTO.setIndividualId("1234567"); - euinRequestDTO.setCardType(CardType.MASKED_UIN.name()); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testeuinValidTransactionId() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); - EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); - euinRequestDTO.setIndividualIdType(IdType.VID.name()); - euinRequestDTO.setIndividualId("1234567"); - euinRequestDTO.setCardType(CardType.MASKED_UIN.name()); - euinRequestDTO.setOtp("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(euinRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.euin"); - requestValidator.validateEuinRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidTransactionId() throws Exception { - AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); - authLockRequestDto.setIndividualId("12344567"); - authLockRequestDto.setOtp("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authLockRequestDto); - requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidGetStatusId() throws Exception { - RequestDTO requestDTO = new RequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(requestDTO); - requestValidator.validateRequestDTO(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testGetStatusValidIndividualType() throws Exception { - RequestDTO requestDTO = new RequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.checkstatus"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateRequestDTO(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testGetStatusValidIndividualId() throws Exception { - Mockito.when(ridValidator.validateId(Mockito.anyString())).thenReturn(false); - RequestDTO requestDTO = new RequestDTO(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("INVALID_RID"); - requestDTO.setIndividualId("123456"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.checkstatus"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateRequestDTO(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidUpdateId() throws Exception { - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testUpdateValidIndividualType() throws Exception { - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.updateuin"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testUpdateValidIndividualId() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.updateuin"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testUpdateValidTransaction() throws Exception { - - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestDTO.setOtp("1234567"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.updateuin"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testUpdateValidOtp() throws Exception { - - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.updateuin"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testUpdateValidIdentityJson() throws Exception { - - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestDTO.setOtp("1234567"); - requestDTO.setTransactionID("1234567"); - requestDTO.setIdentityJson(""); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.updateuin"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testValidReprintId() throws Exception { - ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(requestDTO); - requestValidator.validateUpdateRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testReprintValidIndividualType() throws Exception { - ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.print"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateReprintRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testReprintValidIndividualId() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); - ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.print"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateReprintRequest(requestWrapper); - } - - @Test(expected = InvalidInputException.class) - public void testReprintValidTransaction() throws Exception { - - ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestDTO.setOtp("1234567"); - requestDTO.setCardType(CardType.MASKED_UIN.name()); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.print"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateReprintRequest(requestWrapper); - } - - @Test(expected = InvalidInputException.class) - public void testReprintValidOtp() throws Exception { - - ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestDTO.setCardType(CardType.MASKED_UIN.name()); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.print"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateReprintRequest(requestWrapper); - } - - @Test(expected = InvalidInputException.class) - public void testReprintValidCardType() throws Exception { - - ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestDTO.setIndividualIdType("VID"); - requestDTO.setIndividualId("1234567"); - requestDTO.setCardType("VID"); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.print"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(requestDTO); - requestValidator.validateReprintRequest(requestWrapper); - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidOtp() throws Exception - { - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("1234567"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthHistoryValidTransactionId() throws Exception { - AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); - authRequestDTO.setIndividualId("1234567"); - authRequestDTO.setOtp("1245"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setRequest(authRequestDTO); - requestWrapper.setVersion("v1"); - requestWrapper.setId("mosip.resident.authhistory"); - requestValidator.validateAuthHistoryRequest(requestWrapper); - - } - - @Test(expected = InvalidInputException.class) - public void testAuthUnlockRequestNull() throws Exception { - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authunlock"); - requestWrapper.setVersion("v1"); - requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidIndividualIdForAuthUnlockRequest() throws Exception { - Mockito.when(vidValidator.validateId(Mockito.any())).thenReturn(false); - AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); - authUnLockRequestDto.setTransactionID("12345"); - authUnLockRequestDto.setIndividualId("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authunlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authUnLockRequestDto); - requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidOtpForAuthUnlockRequest() throws Exception { - AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); - authUnLockRequestDto.setTransactionID("12345"); - authUnLockRequestDto.setIndividualId("12344567"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authunlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authUnLockRequestDto); - requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - @Test(expected = InvalidInputException.class) - public void testValidTransactionIdForAuthUnlockRequest() throws Exception { - AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); - authUnLockRequestDto.setIndividualId("12344567"); - authUnLockRequestDto.setOtp("12345"); - RequestWrapper requestWrapper = new RequestWrapper<>(); - requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper.setId("mosip.resident.authunlock"); - requestWrapper.setVersion("v1"); - requestWrapper.setRequest(authUnLockRequestDto); - requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); - - } - - - @Test(expected = InvalidInputException.class) - public void testValidunlockForMinutesLessThanZeroForAuthUnlockRequest() throws Exception { - AuthUnLockRequestDTO authUnLockRequestDto1 = new AuthUnLockRequestDTO(); - authUnLockRequestDto1.setIndividualId("12344567"); - authUnLockRequestDto1.setOtp("12345"); - authUnLockRequestDto1.setTransactionID("12345"); - authUnLockRequestDto1.setUnlockForSeconds(String.valueOf(-1L)); - List authTypes = new ArrayList(); - authTypes.add("bio-FIR"); - authUnLockRequestDto1.setAuthType(authTypes); - RequestWrapper requestWrapper1 = new RequestWrapper<>(); - requestWrapper1.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); - requestWrapper1.setId("mosip.resident.authunlock"); - requestWrapper1.setVersion("v1"); - requestWrapper1.setRequest(authUnLockRequestDto1); - requestValidator.validateAuthUnlockRequest(requestWrapper1, AuthTypeStatus.LOCK); - } - -} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/AuditUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/AuditUtilTest.java similarity index 50% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/AuditUtilTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/AuditUtilTest.java index 6fb38d9d2ae..a2e1cefb71f 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/AuditUtilTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/AuditUtilTest.java @@ -1,23 +1,28 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.when; + +import java.net.InetAddress; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.kernel.core.http.RequestWrapper; -import io.mosip.kernel.core.http.ResponseWrapper; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.dto.AuditRequestDTO; -import io.mosip.resident.util.AuditResponseDto; -import io.mosip.resident.util.AuditUtil; -import io.mosip.resident.util.EventEnum; -import io.mosip.resident.util.TokenGenerator; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.*; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -26,14 +31,21 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; -import java.net.InetAddress; -import java.time.LocalDateTime; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.when; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.AuditRequestDTO; +import io.mosip.resident.dto.AuditResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; /** * @author Abubacker Siddik @@ -52,6 +64,17 @@ public class AuditUtilTest { @Mock private ObjectMapper objectMapper; + @Mock + private Environment environment; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private Utility utility; + + private AsyncUtil asyncUtil = new AsyncUtil(); + @Captor ArgumentCaptor httpEntityCaptor; @@ -67,6 +90,7 @@ public class AuditUtilTest { @Before public void setUp() throws Exception { ReflectionTestUtils.setField(auditUtil, "auditUrl", auditUrl); + ReflectionTestUtils.setField(auditUtil, "asyncUtil", asyncUtil); PowerMockito.mockStatic(SecurityContextHolder.class); PowerMockito.mockStatic(InetAddress.class); @@ -80,12 +104,13 @@ public void setUp() throws Exception { localDateTime = DateUtils.getUTCCurrentDateTime(); when(DateUtils.getUTCCurrentDateTime()).thenReturn(localDateTime); - + when(identityService.getAvailableclaimValue(Mockito.anyString())).thenReturn("user1"); + when(environment.getProperty(Mockito.anyString())).thenReturn("user1"); } @Test public void setAuditRequestDtoTest() throws Exception { - EventEnum eventEnum = EventEnum.getEventEnumWithValue(EventEnum.VALIDATE_REQUEST, "get Rid status API"); + AuditEvent auditEvent = AuditEnum.getAuditEventWithValue(AuditEnum.VALIDATE_REQUEST, "get Rid status API"); AuditResponseDto auditResponseDto = new AuditResponseDto(); auditResponseDto.setStatus(true); ResponseWrapper responseWrapper = new ResponseWrapper<>(); @@ -94,11 +119,18 @@ public void setAuditRequestDtoTest() throws Exception { ResponseEntity response = ResponseEntity.ok(responseString); AuditRequestDTO auditRequestDto = new AuditRequestDTO(); + auditRequestDto.setId("9054257143"); + auditRequestDto.setIdType(IdType.UIN.name()); RequestWrapper auditRequestWrapper = new RequestWrapper<>(); auditRequestWrapper.setRequest(auditRequestDto); when(restTemplate.exchange(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(Class.class), Mockito.any(Object.class))).thenReturn(response); when(objectMapper.readValue(Mockito.anyString(), Mockito.any(TypeReference.class))).thenReturn(responseWrapper); - auditUtil.setAuditRequestDto(eventEnum); + String individualId = "9054257143"; + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn(individualId); + Mockito.when(identityService.getIndividualIdType(individualId)).thenReturn(IdType.UIN); + Mockito.when(utility.getRefIdHash(individualId)).thenReturn("07DDDD711B7311BAE05A09F36479BAF78EA4FF1B91603A9704A2D59206766308"); + + auditUtil.setAuditRequestDto(auditEvent); verify(restTemplate, times(1)).exchange(stringCaptor.capture(), Mockito.any(), httpEntityCaptor.capture(), Mockito.any(Class.class), Mockito.any(Object.class)); final HttpEntity> httpEntity = httpEntityCaptor.getValue(); @@ -106,16 +138,17 @@ public void setAuditRequestDtoTest() throws Exception { assertNotNull("Response Body is not null", httpEntity.getBody()); - assertEquals(eventEnum.getApplicationId(), httpEntity.getBody().getRequest().getApplicationId()); - assertEquals(eventEnum.getApplicationName(), httpEntity.getBody().getRequest().getApplicationName()); - assertEquals(eventEnum.getDescription(), httpEntity.getBody().getRequest().getDescription()); - assertEquals(eventEnum.getType(), httpEntity.getBody().getRequest().getEventType()); - assertEquals(eventEnum.getName(), httpEntity.getBody().getRequest().getEventName()); - assertEquals(eventEnum.getEventId(), httpEntity.getBody().getRequest().getEventId()); - assertEquals(eventEnum.getId(), httpEntity.getBody().getRequest().getId()); - assertEquals(eventEnum.getIdType(), httpEntity.getBody().getRequest().getIdType()); - assertEquals(eventEnum.getModuleId(), httpEntity.getBody().getRequest().getModuleId()); - assertEquals(eventEnum.getModuleName(), httpEntity.getBody().getRequest().getModuleName()); + assertEquals(auditEvent.getApplicationId(), httpEntity.getBody().getRequest().getApplicationId()); + assertEquals(auditEvent.getApplicationName(), httpEntity.getBody().getRequest().getApplicationName()); + assertEquals(auditEvent.getDescription(), httpEntity.getBody().getRequest().getDescription()); + assertEquals(auditEvent.getType(), httpEntity.getBody().getRequest().getEventType()); + assertEquals(auditEvent.getName(), httpEntity.getBody().getRequest().getEventName()); + assertEquals(auditEvent.getEventId(), httpEntity.getBody().getRequest().getEventId()); + assertEquals(auditEvent.getModuleId(), httpEntity.getBody().getRequest().getModuleId()); + assertEquals(auditEvent.getModuleName(), httpEntity.getBody().getRequest().getModuleName()); + assertEquals("07DDDD711B7311BAE05A09F36479BAF78EA4FF1B91603A9704A2D59206766308", + httpEntity.getBody().getRequest().getId()); + assertEquals(IdType.UIN.name(), httpEntity.getBody().getRequest().getIdType()); assertEquals(host.getHostName(), httpEntity.getBody().getRequest().getHostName()); assertEquals(host.getHostAddress(), httpEntity.getBody().getRequest().getHostIp()); @@ -127,7 +160,38 @@ public void setAuditRequestDtoTest() throws Exception { assertEquals(localDateTime, httpEntity.getBody().getRequest().getActionTimeStamp()); assertEquals(auditUrlInput, auditUrl); + } + + @Test(expected = RuntimeException.class) + public void testSetAuditRequestDtoWithApisResourceAccessException() throws Exception { + AuditEvent auditEvent = AuditEnum.getAuditEventWithValue(AuditEnum.VALIDATE_REQUEST, "get Rid status API"); + when(identityService.getAvailableclaimValue(Mockito.anyString())).thenThrow(ApisResourceAccessException.class); + auditUtil.setAuditRequestDto(auditEvent); + } + @Test(expected = ResidentServiceException.class) + public void testGetRefIdHashAndTypeWithApisResourceAccessException() throws Exception { + AuditEvent auditEvent = AuditEnum.getAuditEventWithValue(AuditEnum.VALIDATE_REQUEST, "get Rid status API"); + when(identityService.getAvailableclaimValue(Mockito.anyString())).thenReturn(null); + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenThrow(ApisResourceAccessException.class); + auditUtil.setAuditRequestDto(auditEvent); } + @Test + public void testGetRefIdandTypeNoID() { + Tuple2 response = auditUtil.getRefIdHashAndType(); + assertEquals(Tuples.of(ResidentConstants.NO_ID, ResidentConstants.NO_ID_TYPE), response); + } + + @Test + public void testGetRefIdandType() throws ApisResourceAccessException, NoSuchAlgorithmException { + String individualId = "9054257143"; + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn(individualId); + Mockito.when(identityService.getIndividualIdType(individualId)).thenReturn(IdType.UIN); + Mockito.when(utility.getRefIdHash(individualId)).thenReturn("07DDDD711B7311BAE05A09F36479BAF78EA4FF1B91603A9704A2D59206766308"); + Tuple2 refIdandType = auditUtil.getRefIdHashAndType(); + assertEquals(Tuples.of("07DDDD711B7311BAE05A09F36479BAF78EA4FF1B91603A9704A2D59206766308", IdType.UIN.name()), + refIdandType); + } + } diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/EncryptorUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/EncryptorUtilTest.java similarity index 93% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/EncryptorUtilTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/EncryptorUtilTest.java index c4b0d9f15ba..bf0550c47e8 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/EncryptorUtilTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/EncryptorUtilTest.java @@ -1,33 +1,38 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.when; + +import java.security.SecureRandom; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.mosip.commons.packet.dto.packet.DecryptResponseDto; -import io.mosip.commons.packet.exception.PacketDecryptionFailureException; -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.http.RequestWrapper; -import io.mosip.kernel.core.util.DateUtils; -import io.mosip.resident.dto.CryptomanagerRequestDto; -import io.mosip.resident.util.EncryptorUtil; -import io.mosip.resident.util.ResidentServiceRestClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.*; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.springframework.core.env.Environment; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import com.fasterxml.jackson.databind.ObjectMapper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.when; +import io.mosip.commons.packet.dto.packet.DecryptResponseDto; +import io.mosip.commons.packet.exception.PacketDecryptionFailureException; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.dto.CryptomanagerRequestDto; /** * @author Abubacker Siddik @@ -49,6 +54,9 @@ public class EncryptorUtilTest { @Mock private ResidentServiceRestClient restClientService; + @Mock + private Utilities utilities; + @Captor ArgumentCaptor> requestCaptor; @@ -66,6 +74,7 @@ public void setUp() throws Exception { localDateTime = DateUtils.getUTCCurrentDateTime(); when(DateUtils.getUTCCurrentDateTime()).thenReturn(localDateTime); + when(utilities.getSecureRandom()).thenReturn(new SecureRandom()); } @Test diff --git a/resident/resident-service/src/test/java/io/mosip/resident/util/IdSchemaUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/IdSchemaUtilTest.java new file mode 100644 index 00000000000..cbda48b546a --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/IdSchemaUtilTest.java @@ -0,0 +1,118 @@ +package io.mosip.resident.util; + +import static io.mosip.resident.util.IdSchemaUtil.RESPONSE; +import static io.mosip.resident.util.IdSchemaUtil.SCHEMA_JSON; +import static io.mosip.resident.util.IdSchemaUtil.SCHEMA_VERSION_QUERY_PARAM; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.when; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.assertj.core.util.Lists; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.core.env.Environment; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.exception.ApisResourceAccessException; + +/** + * @author Abubacker Siddik + */ +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({ "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*" }) +@PrepareForTest({ DateUtils.class }) +public class IdSchemaUtilTest { + + @InjectMocks + private IdSchemaUtil idSchemaUtil; + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient restClientService; + + private String responseJson; + + @Before + public void setUp() throws Exception { + responseJson = "{\n" + " \"id\": null,\n" + " \"version\": null,\n" + + " \"responsetime\": \"2022-01-11T06:08:02.307Z\",\n" + " \"metadata\": null,\n" + + " \"response\": {\n" + + " \"schemaJson\": \"{\\\"$schema\\\":\\\"http:\\/\\/json-schema.org\\/draft-07\\/schema#\\\",\\\"description\\\":\\\"MOSIP Sample identity\\\",\\\"additionalProperties\\\":false,\\\"title\\\":\\\"MOSIP identity\\\",\\\"type\\\":\\\"object\\\",\\\"definitions\\\":{\\\"simpleType\\\":{\\\"uniqueItems\\\":true,\\\"additionalItems\\\":false,\\\"type\\\":\\\"array\\\",\\\"items\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"language\\\",\\\"value\\\"],\\\"properties\\\":{\\\"language\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"documentType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"},\\\"refNumber\\\":{\\\"type\\\":\\\"string\\\"}}},\\\"biometricsType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"version\\\":{\\\"type\\\":\\\"number\\\",\\\"minimum\\\":0},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"properties\\\":{\\\"identity\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"IDSchemaVersion\\\",\\\"fullName\\\",\\\"dateOfBirth\\\",\\\"gender\\\",\\\"addressLine1\\\",\\\"addressLine2\\\",\\\"addressLine3\\\",\\\"region\\\",\\\"province\\\",\\\"city\\\",\\\"zone\\\",\\\"postalCode\\\",\\\"phone\\\",\\\"email\\\",\\\"proofOfIdentity\\\",\\\"individualBiometrics\\\"],\\\"properties\\\":{\\\"proofOfAddress\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"gender\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"city\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"postalCode\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[(?i)A-Z0-9]{5}$|^NA$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfException-1\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"referenceIdentityNumber\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^([0-9]{10,30})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"kyc\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"province\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"zone\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfDateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"addressLine1\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine2\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"residenceStatus\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"kyc\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine3\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"email\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[A-Za-z0-9_\\\\\\\\-]+(\\\\\\\\.[A-Za-z0-9_]+)*@[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_]+)*(\\\\\\\\.[a-zA-Z]{2,})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerRID\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"fullName\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"dateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(1869|18[7-9][0-9]|19[0-9][0-9]|20[0-9][0-9])\\/([0][1-9]|1[0-2])\\/([0][1-9]|[1-2][0-9]|3[01])$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualAuthBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"introducerUIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfIdentity\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"IDSchemaVersion\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"number\\\",\\\"fieldType\\\":\\\"default\\\",\\\"minimum\\\":0},\\\"proofOfException\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"phone\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[+]*([0-9]{1})([0-9]{9})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerName\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfRelationship\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"UIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"region\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"}}}}}\",\n" + + " \"id\": \"1001\",\n" + " \"effectiveFrom\": \"2021-12-22T13:45:46.303Z\",\n" + + " \"status\": \"PUBLISHED\"\n" + " },\n" + " \"errors\": null\n" + "}"; + } + + @Test + public void loadDefaultFieldsTest() throws Exception { + Double schemaVersion = 0.1d; + when(restClientService.getApi(ApiName.MIDSCHEMAURL, (List) null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), + Lists.newArrayList(schemaVersion), String.class)).thenReturn(responseJson); + + List> schemaMap = idSchemaUtil.loadDefaultFields(schemaVersion); + assertEquals(schemaMap.get(0).get("id"), "proofOfAddress"); + assertEquals(schemaMap.get(0).get("type"), "#/definitions/documentType"); + assertEquals(schemaMap.get(1).get("id"), "gender"); + assertEquals(schemaMap.get(1).get("type"), "#/definitions/simpleType"); + assertEquals(schemaMap.get(2).get("id"), "city"); + assertEquals(schemaMap.get(2).get("type"), "#/definitions/simpleType"); + assertEquals(schemaMap.get(10).get("id"), "addressLine1"); + assertEquals(schemaMap.get(10).get("type"), "#/definitions/simpleType"); + assertEquals(schemaMap.get(13).get("id"), "addressLine3"); + assertEquals(schemaMap.get(13).get("type"), "#/definitions/simpleType"); + assertEquals(schemaMap.get(16).get("id"), "dateOfBirth"); + assertEquals(schemaMap.get(16).get("type"), "string"); + assertEquals(schemaMap.get(17).get("id"), "individualAuthBiometrics"); + assertEquals(schemaMap.get(17).get("type"), "#/definitions/biometricsType"); + assertEquals(schemaMap.get(20).get("id"), "phone"); + assertEquals(schemaMap.get(20).get("type"), "string"); + assertEquals(schemaMap.get(23).get("id"), "region"); + assertEquals(schemaMap.get(23).get("type"), "#/definitions/simpleType"); + + verify(restClientService, times(1)).getApi(ApiName.MIDSCHEMAURL, (List) null, + Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class); + } + + @Test(expected = ApisResourceAccessException.class) + public void throwApiResourceAccessIfResponseIsNull() throws Exception { + Double schemaVersion = 0.1d; + when(restClientService.getApi(ApiName.MIDSCHEMAURL, (List) null, Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), + Lists.newArrayList(schemaVersion), String.class)).thenReturn(null); + idSchemaUtil.loadDefaultFields(schemaVersion); + } + + @Test + public void testIfIdSchemaMapIsUsedAndRestClientNeverInvoked() + throws JSONException, ApisResourceAccessException, IOException { + Double schemaVersion = 0.1d; + JSONObject jsonObject = new JSONObject(responseJson); + JSONObject respObj = (JSONObject) jsonObject.get(RESPONSE); + String responseString = respObj != null ? (String) respObj.get(SCHEMA_JSON) : null; + Map idschema = new HashMap<>(); + idschema.put(schemaVersion, responseString); + ReflectionTestUtils.setField(idSchemaUtil, "idschema", idschema); + + idSchemaUtil.loadDefaultFields(schemaVersion); + verify(restClientService, never()).getApi(ApiName.MIDSCHEMAURL, (List) null, + Lists.newArrayList(SCHEMA_VERSION_QUERY_PARAM), Lists.newArrayList(schemaVersion), String.class); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/JsonUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/JsonUtilTest.java similarity index 52% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/JsonUtilTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/JsonUtilTest.java index abc7fc2124a..aec6a64338b 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/JsonUtilTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/JsonUtilTest.java @@ -1,11 +1,11 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.Map; -import io.mosip.resident.util.JsonUtil; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.junit.Before; @@ -15,19 +15,20 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.fasterxml.jackson.core.type.TypeReference; + import io.mosip.resident.dto.JsonValue; @RunWith(PowerMockRunner.class) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) @PrepareForTest({}) public class JsonUtilTest { - private String jsonString; private JSONObject jsonObject; + private String jsonString = "{\"identity\":{\"fullName\":[{\"language\":\"eng\",\"value\":\"firstName\"},{\"language\":\"ara\",\"value\":\"lastName\"}],\"dateOfBirth\":\"1996/01/01\",\"referenceIdentityNumber\":\"2323232323232323\",\"proofOfIdentity\":{\"value\":\"POI_Passport\",\"type\":\"DOC001\",\"format\":\"jpg\"},\"IDSchemaVersion\":1,\"phone\":\"9898989899\",\"age\":23,\"email\":\"sdf@sdf.co\"}}\r\n" + + ""; @Before public void setUp() throws IOException { - jsonString = "{\"identity\":{\"fullName\":[{\"language\":\"eng\",\"value\":\"firstName\"},{\"language\":\"ara\",\"value\":\"lastName\"}],\"dateOfBirth\":\"1996/01/01\",\"referenceIdentityNumber\":\"2323232323232323\",\"proofOfIdentity\":{\"value\":\"POI_Passport\",\"type\":\"DOC001\",\"format\":\"jpg\"},\"IDSchemaVersion\":1,\"phone\":\"9898989899\",\"age\":23,\"email\":\"sdf@sdf.co\"}}\r\n" - + ""; jsonObject = JsonUtil.readValue(jsonString, JSONObject.class); } @@ -51,7 +52,6 @@ public void getJSONArrayTest() { @Test public void testJsonUtilWriteValue() throws IOException { String result = JsonUtil.writeValueAsString(jsonObject); - System.out.println(result); assertTrue(jsonString.trim().equals(result)); } @@ -61,5 +61,31 @@ public void getJsonValuesTest() throws ReflectiveOperationException { assertEquals(2, jsonvalues.length); } + + @Test + @SuppressWarnings("unchecked") + public void convertValueTest() { + Map convertedValue = JsonUtil.convertValue(jsonObject, Map.class); + Map identityMap = JsonUtil.convertValue(convertedValue.get("identity"), Map.class); + assertEquals("2323232323232323", identityMap.get("referenceIdentityNumber")); + } + + @Test + public void convertValueTypeReferenceTest() { + Map convertedValue = JsonUtil.convertValue(jsonObject, + new TypeReference>() { + }); + Map identityMap = JsonUtil.convertValue(convertedValue.get("identity"), + new TypeReference>() { + }); + assertEquals("2323232323232323", identityMap.get("referenceIdentityNumber")); + } + + @Test + public void readValueTypeReferenceTest() throws IOException { + Map> readValue = JsonUtil.readValue(jsonString, new TypeReference>>() { + }); + assertEquals("2323232323232323", readValue.get("identity").get("referenceIdentityNumber")); + } } diff --git a/resident/resident-service/src/test/java/io/mosip/resident/util/ResidentServiceRestClientTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/ResidentServiceRestClientTest.java new file mode 100644 index 00000000000..4c86f6017ec --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/ResidentServiceRestClientTest.java @@ -0,0 +1,337 @@ +package io.mosip.resident.util; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.dto.AutnTxnResponseDto; +import io.mosip.resident.exception.ApisResourceAccessException; + +@RunWith(MockitoJUnitRunner.class) +public class ResidentServiceRestClientTest { + + + @Mock + RestTemplateBuilder builder; + + @Mock + Environment environment; + + @Mock + RestTemplate residentRestTemplate; + + @InjectMocks + ResidentServiceRestClient residentServiceRestClient; + + @Before + public void setup() { + ReflectionTestUtils.setField(residentServiceRestClient, "builder", builder); + ReflectionTestUtils.setField(residentServiceRestClient, "environment", environment); + } + + @Test + public void testgetApi() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + ResponseEntity obj = new ResponseEntity<>(autnTxnResponseDto, HttpStatus.OK); + URI uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234") + .build(false).encode().toUri(); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.exchange(any(URI.class), any(HttpMethod.class), any(), + Matchers.>any())).thenReturn(obj); + + assertTrue(client.getApi(uri, AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testgetApiException() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + URI uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234") + .build(false).encode().toUri(); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.exchange(any(URI.class), any(HttpMethod.class), any(), + Matchers.>any())).thenThrow(new RestClientException("")); + + client.getApi(uri, AutnTxnResponseDto.class); + } + + @Test + public void testgetApiObject() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doReturn(autnTxnResponseDto).when(client).getApi((URI)any(), any()); + List list = new ArrayList<>(); + list.add("individualIdType"); + list.add("UIN"); + list.add("individualId"); + list.add("1234"); + + assertTrue(client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, "", null, AutnTxnResponseDto.class).toString() + .contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testgetApiObjectException() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doThrow(new ApisResourceAccessException()).when(client).getApi((URI)any(), any()); + List list = new ArrayList<>(); + list.add("individualIdType"); + list.add("UIN"); + list.add("individualId"); + list.add("1234"); + + client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, "pageFetch,pageStart", "50,1", AutnTxnResponseDto.class); + } + + @Test + public void testGetApiListQuery() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doReturn(autnTxnResponseDto).when(client).getApi((URI)any(), any()); + List list = new ArrayList<>(); + list.add("individualIdType"); + list.add("UIN"); + list.add("individualId"); + list.add("1234"); + + List queryParamName = new ArrayList(); + queryParamName.add("queryName"); + queryParamName.add("paramName"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add("queryValue"); + queryParamValue.add("paramValue"); + + assertTrue(client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, queryParamName, queryParamValue, + AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testGetApiListQueryException() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doThrow(new ApisResourceAccessException()).when(client).getApi((URI)any(), any()); + List list = new ArrayList<>(); + list.add("individualIdType"); + list.add("UIN"); + list.add("individualId"); + list.add("1234"); + + List queryParamName = new ArrayList(); + queryParamName.add("queryName"); + queryParamName.add("paramName"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add("queryValue"); + queryParamValue.add("paramValue"); + + client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, list, queryParamName, queryParamValue, + AutnTxnResponseDto.class); + } + + @Test + public void testGetApiGenericT() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doReturn(autnTxnResponseDto).when(client).getApi((URI)any(), any()); + Map pathsegments = new HashMap(); + pathsegments.put("individualIdType", "mapType"); + pathsegments.put("UIN", "mapType"); + pathsegments.put("individualId", "mapType"); + pathsegments.put("1234", "mapType"); + + assertTrue(client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, pathsegments, AutnTxnResponseDto.class).toString() + .contains("ancd")); + } + + @Test + public void testGetApiListQueryGenericT() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doReturn(autnTxnResponseDto).when(client).getApi((URI)any(), any()); + Map pathsegments = new HashMap(); + pathsegments.put("individualIdType", "mapType"); + pathsegments.put("UIN", "mapType"); + pathsegments.put("individualId", "mapType"); + pathsegments.put("1234", "mapType"); + + List queryParamName = new ArrayList(); + queryParamName.add("queryName"); + queryParamName.add("paramName"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add("queryValue"); + queryParamValue.add("paramValue"); + + assertTrue(client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, pathsegments, queryParamName, queryParamValue, + AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testGetApiListQueryGenericTException() throws ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + when(environment.getProperty(any(String.class))).thenReturn("https://int.mosip.io/"); + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + doThrow(new ApisResourceAccessException()).when(client).getApi((URI)any(), any()); + Map pathsegments = new HashMap(); + pathsegments.put("individualIdType", "mapType"); + pathsegments.put("UIN", "mapType"); + pathsegments.put("individualId", "mapType"); + pathsegments.put("1234", "mapType"); + + List queryParamName = new ArrayList(); + queryParamName.add("queryName"); + queryParamName.add("paramName"); + + List queryParamValue = new ArrayList<>(); + queryParamValue.add("queryValue"); + queryParamValue.add("paramValue"); + + client.getApi(ApiName.INTERNALAUTHTRANSACTIONS, pathsegments, queryParamName, queryParamValue, + AutnTxnResponseDto.class); + } + + @Test + public void testpostApi() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.postForObject(any(String.class), any(), Matchers.>any())) + .thenReturn(autnTxnResponseDto); + + assertTrue(client.postApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", + MediaType.APPLICATION_JSON, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testpostApiException() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.postForObject(any(String.class), any(), Matchers.>any())) + .thenThrow(new RestClientException("")); + + assertTrue(client.postApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", + MediaType.APPLICATION_JSON, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Ignore + @Test + public void testpatchApi() throws Exception { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + String uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234").build(false).encode().toString(); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.patchForObject(any(URI.class), any(), Matchers.>any())) + .thenReturn(autnTxnResponseDto); + + assertTrue(client.patchApi(uri, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Ignore + @Test(expected = ApisResourceAccessException.class) + public void testpatchApiException() throws Exception { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + String uri = UriComponentsBuilder.fromUriString("https://int.mosip.io/individualIdType/UIN/individualId/1234").build(false).encode().toString(); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.patchForObject(any(URI.class), any(), Matchers.>any())) + .thenThrow(new RestClientException("")); + + assertTrue(client.patchApi(uri, autnTxnResponseDto, AutnTxnResponseDto.class).toString().contains("ancd")); + } + + @Test + public void testputApi() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + ResponseEntity obj = new ResponseEntity(autnTxnResponseDto, + HttpStatus.OK); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.exchange(any(String.class), any(HttpMethod.class), any(), + Matchers.>any())).thenReturn(obj); + + assertTrue(client.putApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, + AutnTxnResponseDto.class, MediaType.APPLICATION_JSON).toString().contains("ancd")); + } + + @Test(expected = ApisResourceAccessException.class) + public void testputApiException() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, ApisResourceAccessException { + AutnTxnResponseDto autnTxnResponseDto = new AutnTxnResponseDto(); + autnTxnResponseDto.setId("ancd"); + + ResidentServiceRestClient client = Mockito.spy(residentServiceRestClient); + when(residentRestTemplate.exchange(any(String.class), any(HttpMethod.class), any(), + Matchers.>any())).thenThrow(new RestClientException("")); + + client.putApi("https://int.mosip.io/individualIdType/UIN/individualId/1234", autnTxnResponseDto, + AutnTxnResponseDto.class, MediaType.APPLICATION_JSON); + } + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/ServerUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/ServerUtilTest.java similarity index 91% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/ServerUtilTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/ServerUtilTest.java index 696f5d368de..b6ed0cfa697 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/ServerUtilTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/ServerUtilTest.java @@ -1,4 +1,4 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; import static org.junit.Assert.assertTrue; @@ -9,7 +9,6 @@ import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.modules.junit4.PowerMockRunner; -import io.mosip.resident.util.ServerUtil; @RunWith(PowerMockRunner.class) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) diff --git a/resident/resident-service/src/test/java/io/mosip/resident/util/TemplateUtilTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/TemplateUtilTest.java new file mode 100644 index 00000000000..556769d1458 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/TemplateUtilTest.java @@ -0,0 +1,569 @@ +package io.mosip.resident.util; + +import static junit.framework.TestCase.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.EventStatus; +import io.mosip.resident.constant.EventStatusFailure; +import io.mosip.resident.constant.EventStatusInProgress; +import io.mosip.resident.constant.EventStatusSuccess; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ServiceType; +import io.mosip.resident.constant.TemplateType; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.NotificationTemplateVariableDTO; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.handler.service.ResidentConfigService; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.IdentityServiceTest; +import io.mosip.resident.service.impl.ProxyPartnerManagementServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import reactor.util.function.Tuples; + +/** + * This class is used to test the TemplateUtil class + * @author Kamesh Shekhar Prasad + */ + +@RunWith(SpringRunner.class) +public class TemplateUtilTest { + + @InjectMocks + private TemplateUtil templateUtil = new TemplateUtil(); + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private IdentityServiceImpl identityServiceImpl; + + @Mock + private Utility utility; + + @Mock + private ProxyPartnerManagementServiceImpl proxyPartnerManagementServiceImpl; + + @Mock + private Environment environment; + + @Mock + private ResidentServiceImpl residentService; + + @Mock + private ResidentConfigService residentConfigService; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + private String eventId; + private ResidentTransactionEntity residentTransactionEntity; + + private NotificationTemplateVariableDTO dto; + + private static final String OTP = "otp"; + + private static final String PROPERTY = "YYYY-MM-DD HH:MM:SS"; + + private static final String LOCALE_EN_US = "en-US"; + + private Map templateResponse; + private ResponseWrapper responseWrapper; + private Map templateVariables; + private Map values; + + private Map mailingAttributes = Map.of(); + + @Before + public void setUp() throws ApisResourceAccessException, ResidentServiceCheckedException { + eventId = "12345"; + residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setEventId(eventId); + residentTransactionEntity.setRequestTypeCode(RequestType.AUTHENTICATION_REQUEST.name()); + residentTransactionEntity.setPurpose("Test"); + residentTransactionEntity.setStatusCode(EventStatusSuccess.AUTHENTICATION_SUCCESSFULL.name()); + residentTransactionEntity.setRequestSummary("Test"); + residentTransactionEntity.setAuthTypeCode("otp"); + residentTransactionEntity.setAttributeList("YYYY-MM-DD HH:MM:SS"); + residentTransactionEntity.setCrDtimes(LocalDateTime.now()); + Mockito.when(residentTransactionRepository.findById(eventId)).thenReturn(java.util.Optional.ofNullable(residentTransactionEntity)); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenReturn(eventId); + Mockito.when(identityServiceImpl.getIndividualIdType(Mockito.anyString())).thenReturn(IdType.UIN); + ReflectionTestUtils.setField(templateUtil, "templateDatePattern", "dd-MM-yyyy"); + ReflectionTestUtils.setField(templateUtil, "templateTimePattern", "HH:mm:ss"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(PROPERTY); + dto = new NotificationTemplateVariableDTO(eventId, RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS, "eng", "111111"); + templateResponse = new LinkedHashMap<>(); + templateVariables = new LinkedHashMap<>(); + values = new LinkedHashMap<>(); + values.put("test", String.class); + templateVariables.put("eventId", eventId); + responseWrapper = new ResponseWrapper<>(); + templateResponse.put(ResidentConstants.FILE_TEXT, "otp"); + responseWrapper.setResponse(templateResponse); + Mockito.when(proxyMasterdataService.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn( + "otp"); + Mockito.when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatus.SUCCESS.name(), "Success")); + } + + @Test + public void getAckTemplateVariablesForAuthenticationRequest() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForAuthenticationRequest(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals("Success",ackTemplateVariables.get(TemplateVariablesConstants.EVENT_STATUS)); + } + + @Test + public void getAckTemplateVariablesForCredentialShare() { + getUISchemaData(); + residentTransactionEntity.setAttributeList("fullName:fullName"); + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForShareCredentialWithPartner(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForDownloadPersonalizedCard() { + getUISchemaData(); + residentTransactionEntity.setAttributeList("fullName:fullName"); + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForDownloadPersonalizedCard(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + private void getUISchemaData() { + Map attrData = new HashMap<>(); + attrData.put(ResidentConstants.LABEL, "Name"); + attrData.put(ResidentConstants.FORMAT_OPTION, Map.of("fullName", "Full Name")); + Map> schemaData = new HashMap<>(); + schemaData.put("fullName", attrData); + Map>> schemaLangData = new HashMap<>(); + schemaLangData.put("eng", schemaData); + Mockito.when(residentConfigService.getUISchemaCacheableData(anyString())).thenReturn(schemaLangData); + } + + @Test + public void getAckTemplateVariablesForOrderPhysicalCard() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForOrderPhysicalCard(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForOrderPhysicalCardPaymentFailed() { + residentTransactionEntity.setStatusCode(EventStatusFailure.PAYMENT_FAILED.name()); + Mockito.when(residentTransactionRepository.findById(eventId)).thenReturn(java.util.Optional.ofNullable(residentTransactionEntity)); + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForOrderPhysicalCard(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForGetMyId() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForGetMyId(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(eventId,ackTemplateVariables.get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getAckTemplateVariablesForUpdateMyUin() { + getUISchemaData(); + residentTransactionEntity.setAttributeList("fullName"); + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForUpdateMyUin(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForUpdateMyUinDownloadLinkNotAvailable() { + getUISchemaData(); + residentTransactionEntity.setAttributeList("fullName"); + residentTransactionEntity.setStatusCode(EventStatusSuccess.CARD_DOWNLOADED.name()); + Map ackTemplateVariables1 = templateUtil.getAckTemplateVariablesForUpdateMyUin(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables1.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + Map ackTemplateVariables2 = templateUtil.getAckTemplateVariablesForUpdateMyUin(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables2.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForGenerateVid() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForGenerateVid(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForRevokeVid() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForRevokeVid(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getAckTemplateVariablesForAuthLock() { + Map ackTemplateVariables = templateUtil.getAckTemplateVariablesForAuthTypeLockUnlock(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1(); + assertEquals(OTP,ackTemplateVariables.get(TemplateVariablesConstants.AUTHENTICATION_MODE)); + } + + @Test + public void getCommonTemplateVariablesTestFailedEventStatus() { + residentTransactionEntity.setStatusCode(EventStatusFailure.AUTHENTICATION_FAILED.name()); + residentTransactionEntity.setAuthTypeCode(""); + Mockito.when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatus.FAILED.name(), "Failed")); + assertEquals("Failed",templateUtil.getCommonTemplateVariables(residentTransactionEntity, RequestType.AUTHENTICATION_REQUEST, "eng", 0, LOCALE_EN_US).get( + TemplateVariablesConstants.EVENT_STATUS + )); + } + + @Test + public void getCommonTemplateVariablesTestInProgressEventStatus() { + residentTransactionEntity.setStatusCode(EventStatusInProgress.OTP_REQUESTED.name()); + residentTransactionEntity.setAuthTypeCode(null); + Mockito.when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatus.IN_PROGRESS.name(), "In Progress")); + assertEquals("In Progress",templateUtil.getCommonTemplateVariables(residentTransactionEntity, RequestType.AUTHENTICATION_REQUEST, "eng", 0, LOCALE_EN_US).get( + TemplateVariablesConstants.EVENT_STATUS + )); + } + + @Test + public void getAckTemplateVariablesForVidCardDownloadTest() { + assertEquals(2,templateUtil.getAckTemplateVariablesForVidCardDownload(residentTransactionEntity, "eng", 0, LOCALE_EN_US).size()); + } + + @Test + public void getAckTemplateVariablesForVidCardDownloadLinkNotAvailable() { + residentTransactionEntity.setStatusCode(EventStatusSuccess.CARD_DOWNLOADED.name()); + assertEquals(2,templateUtil.getAckTemplateVariablesForVidCardDownload(residentTransactionEntity, "eng", 0, LOCALE_EN_US).size()); + residentTransactionEntity.setStatusCode(EventStatusFailure.FAILED.name()); + assertEquals(2,templateUtil.getAckTemplateVariablesForVidCardDownload(residentTransactionEntity, "eng", 0, LOCALE_EN_US).size()); + } + + @Test + public void getAckTemplateVariablesForSendOtpTest() { + assertEquals(eventId,templateUtil.getAckTemplateVariablesForSendOtp(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1().get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getAckTemplateVariablesForValidateOtpTest() { + assertEquals(eventId,templateUtil.getAckTemplateVariablesForValidateOtp(residentTransactionEntity, "eng", 0, LOCALE_EN_US).getT1().get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationCommonTemplateVariablesTest() { + assertEquals(eventId,templateUtil.getNotificationCommonTemplateVariables(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationCommonTemplateVariablesTestFailed() { + dto = new NotificationTemplateVariableDTO(eventId, RequestType.AUTHENTICATION_REQUEST, TemplateType.FAILURE, "eng", "111111"); + assertEquals(eventId,templateUtil.getNotificationCommonTemplateVariables(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationSendOtpVariablesTest() { + assertEquals(eventId,templateUtil.getNotificationSendOtpVariables(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationCommonTemplateVariablesTestException() throws ResidentServiceCheckedException, IOException { + Mockito.when(utility.getMappingValue(Mockito.anyMap(), Mockito.anyString(), Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + dto = new NotificationTemplateVariableDTO(eventId, RequestType.AUTHENTICATION_REQUEST, TemplateType.FAILURE, "eng", "111111"); + assertEquals(eventId,templateUtil.getNotificationCommonTemplateVariables(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForGenerateOrRevokeVidTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForGenerateOrRevokeVid(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForAuthTypeLockUnlockTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForAuthTypeLockUnlock(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForUpdateMyUinTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForUpdateMyUin(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForVerifyPhoneEmailTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForVerifyPhoneEmail(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForGetMyIdTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForGetMyId(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForDownloadPersonalizedCardTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForDownloadPersonalizedCard(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForOrderPhysicalCardTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForOrderPhysicalCard(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForShareCredentialWithPartnerTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForShareCredentialWithPartner(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getNotificationTemplateVariablesForVidCardDownloadTest() { + assertEquals(eventId,templateUtil.getNotificationTemplateVariablesForVidCardDownload(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void getEmailSubjectTemplateTypeCodeTest() { + assertEquals(PROPERTY, + templateUtil.getEmailSubjectTemplateTypeCode(RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS)); + } + + @Test + public void getEmailContentTemplateTypeCodeTest() { + assertEquals(PROPERTY, + templateUtil.getEmailContentTemplateTypeCode(RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS)); + } + + @Test + public void getSmsTemplateTypeCodeTest() { + assertEquals(PROPERTY, + templateUtil.getSmsTemplateTypeCode(RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS)); + } + + @Test + public void getPurposeTemplateTypeCodeTest() { + assertEquals(PROPERTY, + templateUtil.getPurposeTemplateTypeCode(RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS)); + } + + @Test + public void getSummaryTemplateTypeCodeTest() { + assertEquals(PROPERTY, + templateUtil.getSummaryTemplateTypeCode(RequestType.AUTHENTICATION_REQUEST, TemplateType.SUCCESS)); + } + + @Test + public void testGetDescriptionTemplateVariablesForDownloadPersonalizedCard(){ + assertEquals("VID", templateUtil. + getDescriptionTemplateVariablesForDownloadPersonalizedCard(residentTransactionEntity, "VID", "eng")); + } + + @Test + public void testGetDescriptionTemplateVariablesForDownloadPersonalizedCardNullFileText(){ + templateUtil. + getDescriptionTemplateVariablesForDownloadPersonalizedCard(residentTransactionEntity, null, "eng"); + } + + @Test + public void testGetDescriptionTemplateVariablesForDownloadPersonalizedCardSuccess(){ + templateUtil. + getDescriptionTemplateVariablesForDownloadPersonalizedCard(residentTransactionEntity, ResidentConstants.ATTRIBUTES.toString(), "eng"); + } + + @Test + public void testGetDescriptionTemplateVariablesForDownloadPersonalizedCardFailure(){ + residentTransactionEntity.setAttributeList(null); + residentTransactionEntity.setPurpose(null); + Mockito.when(residentTransactionRepository.findById(eventId)).thenReturn(java.util.Optional.ofNullable(residentTransactionEntity)); + templateUtil. + getDescriptionTemplateVariablesForDownloadPersonalizedCard(residentTransactionEntity, ResidentConstants.ATTRIBUTES.toString(), "eng"); + } + + @Test + public void getCommonTemplateVariablesTestForRequestTypeNotPresentInServiceType() throws ResidentServiceCheckedException { + residentTransactionEntity.setStatusCode(EventStatusInProgress.OTP_REQUESTED.name()); + residentTransactionEntity.setRequestTypeCode(RequestType.SEND_OTP.name()); + Mockito.when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatus.IN_PROGRESS.name(), "In Progress")); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("template-type-code").thenReturn(null).thenReturn("template-type-code"); + assertEquals("In Progress",templateUtil.getCommonTemplateVariables(residentTransactionEntity, RequestType.SEND_OTP, "eng", 0, LOCALE_EN_US).get( + TemplateVariablesConstants.EVENT_STATUS + )); + } + + @Test + public void getCommonTemplateVariablesTestApiResourceException() throws ResidentServiceCheckedException, ApisResourceAccessException { + residentTransactionEntity.setStatusCode(EventStatusInProgress.OTP_REQUESTED.name()); + residentTransactionEntity.setRequestTypeCode(RequestType.SEND_OTP.name()); + Mockito.when(residentService.getEventStatusCode(Mockito.anyString(), Mockito.anyString())).thenReturn(Tuples.of(EventStatus.IN_PROGRESS.name(), "In Progress")); + Mockito.when(identityServiceImpl.getResidentIndvidualIdFromSession()).thenThrow(new ApisResourceAccessException()); + assertEquals("In Progress",templateUtil.getCommonTemplateVariables(residentTransactionEntity, RequestType.SEND_OTP, "eng", 0, LOCALE_EN_US).get( + TemplateVariablesConstants.EVENT_STATUS + )); + } + + @Test + public void getDescriptionTemplateVariablesForAuthenticationRequestTest() { + Mockito.when(proxyMasterdataService.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn( + "OTP Authentication Success"); + assertEquals("OTP Authentication Success", + templateUtil.getDescriptionTemplateVariablesForAuthenticationRequest + (residentTransactionEntity, null, "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForAuthenticationRequestTestNullTempTypeCode() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(null).thenReturn("template-type-code"); + Mockito.when(proxyMasterdataService.getTemplateValueFromTemplateTypeCodeAndLangCode(Mockito.anyString(), Mockito.anyString())).thenReturn( + "OTP Authentication Success"); + assertEquals("OTP Authentication Success", + templateUtil.getDescriptionTemplateVariablesForAuthenticationRequest + (residentTransactionEntity, null, "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForShareCredentialTest(){ + templateUtil.getDescriptionTemplateVariablesForShareCredentialWithPartner(residentTransactionEntity, null, null); + } + + @Test + public void getDescriptionTemplateVariablesForOrderPhysicalCardTest(){ + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForOrderPhysicalCard( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForGetMyIdTest(){ + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForGetMyId( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForUpdateMyUinTest(){ + templateUtil.getDescriptionTemplateVariablesForUpdateMyUin(residentTransactionEntity, "OTP", "eng"); + } + + @Test + public void getDescriptionTemplateVariablesForManageMyVidTest(){ + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForManageMyVid( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForManageMyVidGenerateVidTest(){ + residentTransactionEntity.setRequestTypeCode(RequestType.GENERATE_VID.name()); + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForManageMyVid( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForManageMyVidRevokeVidTest(){ + residentTransactionEntity.setRequestTypeCode(RequestType.REVOKE_VID.name()); + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForManageMyVid( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForVidCardDownloadTest(){ + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForVidCardDownload(residentTransactionEntity, "OTP", + "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForValidateOtpTest(){ + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForValidateOtp(residentTransactionEntity, "OTP", + "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForValidateOtpNullChannelTest(){ + residentTransactionEntity.setPurpose(null); + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForValidateOtp(residentTransactionEntity, "OTP", + "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForValidateOtpEmptyChannelTest(){ + residentTransactionEntity.setPurpose(""); + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForValidateOtp(residentTransactionEntity, "OTP", + "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForSecureMyIdTest(){ + residentTransactionEntity.setAttributeList("fullName,dateOfBirth,UIN,perpetualVID,phone,email"); + assertEquals("OTP, OTP, OTP, OTP, OTP, OTP", templateUtil.getDescriptionTemplateVariablesForSecureMyId( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForSecureMyIdUnlockedTest(){ + residentTransactionEntity.setAttributeList(null); + residentTransactionEntity.setPurpose("UNLOCKED,dateOfBirth,UIN,perpetualVID,phone,email"); + assertEquals("OTP, OTP, OTP, OTP, OTP, OTP", templateUtil.getDescriptionTemplateVariablesForSecureMyId( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDescriptionTemplateVariablesForSecureMyIdUnlockedTestNullDescription(){ + residentTransactionEntity.setAttributeList(""); + residentTransactionEntity.setPurpose(null); + assertEquals("OTP", templateUtil.getDescriptionTemplateVariablesForSecureMyId( + residentTransactionEntity, "OTP", "eng")); + } + + @Test + public void getDefaultTemplateVariablesTest(){ + templateUtil.getAckTemplateVariablesForDefault(residentTransactionEntity, "eng", 0, LOCALE_EN_US); + } + + @Test + public void getSummaryFromResidentTransactionEntityLangCodeTest() throws ResidentServiceCheckedException { + Mockito.when(residentService.getSummaryForLangCode(Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.any())) + .thenThrow(new ResidentServiceCheckedException()); + assertEquals("AUTHENTICATION_REQUEST",templateUtil.getSummaryFromResidentTransactionEntityLangCode( + residentTransactionEntity, "eng", "SUCCESS", + RequestType.AUTHENTICATION_REQUEST)); + } + + @Test + public void getNotificationCommonTemplateVariablesSecureSessionTest() { + IdentityServiceTest.getAuthUserDetailsFromAuthentication(); + assertEquals(eventId,templateUtil.getNotificationCommonTemplateVariables(dto, mailingAttributes).get(TemplateVariablesConstants.EVENT_ID)); + } + + @Test + public void testGetEventTypeBasedOnLangcodeIf() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(null).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getEventTypeBasedOnLangcode(RequestType.AUTHENTICATION_REQUEST, "eng")); + } + + @Test + public void testGetServiceTypeBasedOnLangcode() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getServiceTypeBasedOnLangcode(ServiceType.AUTHENTICATION_REQUEST, "eng")); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(null).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getServiceTypeBasedOnLangcode(ServiceType.AUTHENTICATION_REQUEST, "eng")); + } + + @Test + public void testGetEventStatusBasedOnLangcode() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getEventStatusBasedOnLangcode(EventStatus.SUCCESS, "eng")); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(null).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getEventStatusBasedOnLangcode(EventStatus.SUCCESS, "eng")); + } + + @Test + public void testGetAttributeBasedOnLangcodeIf() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn(null).thenReturn("template-type-code"); + assertEquals("otp", templateUtil.getAttributeBasedOnLangcode("fullName", "eng")); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/TokenGeneratorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/TokenGeneratorTest.java similarity index 98% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/TokenGeneratorTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/TokenGeneratorTest.java index 4ff08abb344..769cf7b68b6 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/TokenGeneratorTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/TokenGeneratorTest.java @@ -1,4 +1,4 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; import static org.mockito.ArgumentMatchers.any; import static org.powermock.api.mockito.PowerMockito.mockStatic; @@ -6,7 +6,6 @@ import java.io.IOException; -import io.mosip.resident.util.TokenGenerator; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; diff --git a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UINCardDownloadTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/UINCardDownloadTest.java similarity index 76% rename from resident/resident-service/src/test/java/io/mosip/resident/test/util/UINCardDownloadTest.java rename to resident/resident-service/src/test/java/io/mosip/resident/util/UINCardDownloadTest.java index 3a251b2702c..bee27ce20e5 100644 --- a/resident/resident-service/src/test/java/io/mosip/resident/test/util/UINCardDownloadTest.java +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/UINCardDownloadTest.java @@ -1,9 +1,7 @@ -package io.mosip.resident.test.util; +package io.mosip.resident.util; import static org.junit.Assert.assertEquals; -import io.mosip.resident.util.ResidentServiceRestClient; -import io.mosip.resident.util.UINCardDownloadService; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -12,6 +10,7 @@ import org.mockito.junit.MockitoJUnitRunner; import org.springframework.core.env.Environment; +import io.mosip.resident.constant.CardType; import io.mosip.resident.constant.IdType; import io.mosip.resident.exception.ApisResourceAccessException; @@ -24,28 +23,28 @@ public class UINCardDownloadTest { private ResidentServiceRestClient residentServiceRestClient; @InjectMocks - UINCardDownloadService uinCardDownloadService; + UINCardDownloadHelper uinCardDownloadHelper; byte[] arr= new byte[10]; String res="{\"errors\":[{\"message\":\"error occured\"}]}"; @Test public void testgetUINCard() throws ApisResourceAccessException { Mockito.when(residentServiceRestClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(arr); - assertEquals(arr,uinCardDownloadService.getUINCard("123456789", "UIN", IdType.UIN)); + assertEquals(arr,uinCardDownloadHelper.getUINCard("123456789", CardType.UIN.name(), IdType.UIN)); } @Test(expected=ApisResourceAccessException.class) public void testgetUINCardregprocfailure() throws ApisResourceAccessException { Mockito.when(residentServiceRestClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(res.getBytes()); - assertEquals(arr,uinCardDownloadService.getUINCard("123456789", "UIN", IdType.UIN)); + assertEquals(arr,uinCardDownloadHelper.getUINCard("123456789", CardType.UIN.name(), IdType.UIN)); } @Test(expected=ApisResourceAccessException.class) public void testgetUINCardregprocNull() throws ApisResourceAccessException { Mockito.when(residentServiceRestClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(null); - assertEquals(arr,uinCardDownloadService.getUINCard("123456789", "UIN", IdType.UIN)); + assertEquals(arr,uinCardDownloadHelper.getUINCard("123456789", CardType.UIN.name(), IdType.UIN)); } @Test(expected=ApisResourceAccessException.class) public void testgetUINCardFailure() throws ApisResourceAccessException { Mockito.when(residentServiceRestClient.postApi(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenThrow(new ApisResourceAccessException()); - uinCardDownloadService.getUINCard("123456789", "UIN", IdType.UIN); + uinCardDownloadHelper.getUINCard("123456789", CardType.UIN.name(), IdType.UIN); } } diff --git a/resident/resident-service/src/test/java/io/mosip/resident/util/UtilitiesTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/UtilitiesTest.java new file mode 100644 index 00000000000..a86f19180cb --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/UtilitiesTest.java @@ -0,0 +1,620 @@ +package io.mosip.resident.util; + +import static io.mosip.resident.constant.ResidentConstants.TRANSACTION_TYPE_CODE; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.io.IOUtils; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.ErrorDTO; +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.ResponseDTO1; +import io.mosip.resident.dto.VidResDTO; +import io.mosip.resident.dto.VidResponseDTO1; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.IndividualIdNotFoundException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.service.IdentityService; +import io.mosip.resident.service.ProxyMasterdataService; + +@ContextConfiguration(classes = {Utilities.class}) +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) +@PrepareForTest +public class UtilitiesTest { + + @InjectMocks + @Spy + private Utilities utilities = new Utilities(); + + @Mock + private ObjectMapper objMapper; + + @Mock + private Environment env; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @Mock + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Mock + private IdentityService identityService; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private Utility utility; + + JSONObject identity; + + JSONObject identityVID; + + private Map amrAcrJson; + + @Before + public void setUp() throws IOException, ApisResourceAccessException { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("Idrepo.json").getFile()); + InputStream is = new FileInputStream(idJson); + String idJsonString = IOUtils.toString(is, "UTF-8"); + identity = JsonUtil.readValue(idJsonString, JSONObject.class); + + File idJsonVid = new File(classLoader.getResource("IdVidRepo.json").getFile()); + is = new FileInputStream(idJsonVid); + idJsonString = IOUtils.toString(is, "UTF-8"); + identityVID = JsonUtil.readValue(idJsonString, JSONObject.class); + + File amrAcrJsonFile = new File(classLoader.getResource("amr-acr-mapping.json").getFile()); + InputStream insputStream = new FileInputStream(amrAcrJsonFile); + String amrAcrJsonString = IOUtils.toString(insputStream, "UTF-8"); + amrAcrJson = JsonUtil.readValue(amrAcrJsonString, Map.class); + ReflectionTestUtils.setField(utilities, "amrAcrJsonFile", "amr-acr-mapping.json"); + } + + @Test + public void testRetrieveIdrepoJsonSuccess() throws ApisResourceAccessException, IOException { + Map uin = (Map) JsonUtil.getJSONObject(identity, "response").get("identity"); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setStatus("Activated"); + responseDTO1.setIdentity(JsonUtil.getJSONObject(identity, "response").get("identity")); + idResponseDTO1.setResponse(responseDTO1); + + String identityString = JsonUtil.writeValueAsString(JsonUtil.getJSONObject(identity, "response").get("identity")); + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); + Mockito.when(objMapper.writeValueAsString(any())).thenReturn(identityString); + + // UIN + JSONObject identityJsonObj = utilities.retrieveIdrepoJson("3527812406"); + assertEquals(identityJsonObj.get("UIN"), uin.get("UIN")); + } + + @Test + public void testRetrieveIdrepoJsonIfFalse() throws ApisResourceAccessException, IOException { + // UIN + JSONObject identityJsonObj = utilities.retrieveIdrepoJson(null); + } + + @Test + public void testRetrieveIdrepoJsonIfFalse2() throws ApisResourceAccessException, IOException { + // UIN + JSONObject identityJsonObj = utilities.retrieveIdrepoJson("anything"); + } + + @Test(expected = IdRepoAppException.class) + public void testRetrieveIdrepoJsonThrowIdRepoAppException() throws ApisResourceAccessException, IOException { + ServiceError error = new ServiceError(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + List errorResponse = new ArrayList<>(); + errorResponse.add(error); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + idResponseDTO1.setErrors(errorResponse); + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); + + // UIN + utilities.retrieveIdrepoJson("3527812406"); + } + + @Test + public void testGetRegistrationProcessorMappingJsonWithMappingJsonNotNull() throws IOException { + JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); + Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); + + String identityString = JsonUtil.writeValueAsString(jsonStringObject); + ReflectionTestUtils.setField(utilities, "mappingJsonString", identityString); + + Object identityObject = jsonStringObject.get("identity"); + + JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); + assertEquals(registrationProcessorMappingJson, identityObject); + verify(utilities, never()).getJson(anyString(), anyString()); + } + + @Test + public void testGetRegistrationProcessorMappingJsonWithMappingJsonIsNull() throws IOException { + JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); + Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); + + String identityString = JsonUtil.writeValueAsString(jsonStringObject); + ReflectionTestUtils.setField(utilities, "regProcessorIdentityJson", identityString); + + Object identityObject = jsonStringObject.get("identity"); + JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); + assertEquals(registrationProcessorMappingJson, identityObject); + verify(residentRestTemplate, never()).getForObject(anyString(), any(Class.class)); + } + + @Test + public void testGetRegistrationProcessorMappingJsonWithProcessorIdentityJsonIsNull() throws IOException { + JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); + Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); + String identityString = JsonUtil.writeValueAsString(jsonStringObject); + Mockito.when(residentRestTemplate.getForObject(anyString(), any(Class.class))).thenReturn(identityString); + + Object identityObject = jsonStringObject.get("identity"); + JSONObject registrationProcessorMappingJson = utilities.getRegistrationProcessorMappingJson(); + assertEquals(registrationProcessorMappingJson, identityObject); + } + + @Test + public void testGetUinByVid() throws ApisResourceAccessException, IOException { + JSONObject response = JsonUtil.getJSONObject(identityVID, "response"); + VidResDTO vidResDTO = new VidResDTO(); + vidResDTO.setVidStatus((String) response.get("vidStatus")); + vidResDTO.setRestoredVid((VidResDTO) response.get("restoredVid")); + vidResDTO.setUin((String) response.get("UIN")); + vidResDTO.setVid((String) response.get("VID")); + VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); + vidResponseDTO1.setResponse(vidResDTO); + vidResponseDTO1.setErrors(new ArrayList<>()); + + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(vidResponseDTO1); + + // VID + String uin = utilities.getUinByVid("6241572684701486"); + assertEquals(uin, response.get("UIN")); + } + + @Test(expected = IndividualIdNotFoundException.class) + public void testGetUinByVidThrowVidCreationException() throws ApisResourceAccessException, IOException { + ErrorDTO error = new ErrorDTO(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + List errorResponse = new ArrayList<>(); + errorResponse.add(error); + VidResponseDTO1 vidResponseDTO1 = new VidResponseDTO1(); + vidResponseDTO1.setErrors(errorResponse); + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(vidResponseDTO1); + + // VID + utilities.getUinByVid("6241572684701486"); + } + + @Test + public void testRetrieveIdrepoJsonStatus() throws ApisResourceAccessException, IOException { + JSONObject response = JsonUtil.getJSONObject(identity, "response"); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setStatus((String) response.get("status")); + responseDTO1.setIdentity(response.get("identity")); + idResponseDTO1.setResponse(responseDTO1); + + String identityString = JsonUtil.writeValueAsString(response.get("identity")); + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); + Mockito.when(objMapper.writeValueAsString(any())).thenReturn(identityString); + + // Status + String status = utilities.retrieveIdrepoJsonStatus("3527812406"); + assertEquals(status, response.get("status")); + } + + @Test + public void testRetrieveIdrepoJsonStatusNestedIf() throws ApisResourceAccessException, IOException { + + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(null); + + // Status + String status = utilities.retrieveIdrepoJsonStatus("3527812406"); + } + + @Test + public void testRetrieveIdrepoJsonStatusWithUinNull() throws ApisResourceAccessException, IOException { + utilities.retrieveIdrepoJsonStatus(null); + } + + @Test(expected = IdRepoAppException.class) + public void testRetrieveIdrepoJsonStatusThrowIdRepoAppException() throws ApisResourceAccessException, IOException { + ServiceError error = new ServiceError(ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorCode(), ResidentErrorCode.API_RESOURCE_ACCESS_EXCEPTION.getErrorMessage()); + List errorResponse = new ArrayList<>(); + errorResponse.add(error); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + idResponseDTO1.setErrors(errorResponse); + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); + + // UIN + utilities.retrieveIdrepoJsonStatus("3527812406"); + } + + @Test + public void testGenerateAudit() { + List> mapList = utilities.generateAudit("12345"); + assertEquals("12345", mapList.get(0).get("id")); + } + + @Test + public void testGetLanguageCode() { + when(env.getProperty(any())).thenReturn("mandatory languages"); + + String result = utilities.getLanguageCode(); + assertNotNull(result); + } + + @Test + public void testGetLanguageCodeElse() { + when(env.getProperty(any())).thenReturn(""); + + utilities.getLanguageCode(); + } + + @Test + public void testGetLanguageCodeNestedIf() { + when(env.getProperty("mosip.optional-languages")).thenReturn("optional-languages"); + + String result = utilities.getLanguageCode(); + assertNotNull(result); + } + + @Test + public void testGetEmailAttribute() throws ResidentServiceCheckedException, IOException { + thrown.expect(Exception.class); + JSONObject jsonStringObject = JsonUtil.getJSONObject(identity, "response"); + Mockito.when(objMapper.readValue(anyString(), any(Class.class))).thenReturn(jsonStringObject); + + String identityString = JsonUtil.writeValueAsString(jsonStringObject); + ReflectionTestUtils.setField(utilities, "mappingJsonString", identityString); + + utilities.getEmailAttribute(); + } + + @Test + public void testGetAmrAcrMapping() throws ResidentServiceCheckedException, IOException { + Mockito.when(residentRestTemplate.getForObject(anyString(), any(Class.class))).thenReturn(amrAcrJson.toString()); + Mockito.when(objMapper.readValue(amrAcrJson.toString().getBytes(UTF_8), Map.class)).thenReturn(amrAcrJson); + utilities.getAmrAcrMapping(); + } + + @Test + public void testGetDynamicFieldBasedOnLangCodeAndFieldName() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setErrors(new ArrayList<>()); + responseWrapper.setId("https://example.org/example"); + responseWrapper.setMetadata("Metadata"); + responseWrapper.setResponse("Response"); + responseWrapper.setResponsetime(LocalDateTime.of(1, 1, 1, 1, 1)); + responseWrapper.setVersion("https://example.org/example"); + when((ResponseWrapper) proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName( + (String) Mockito.any(), (String) Mockito.any(), anyBoolean())) + .thenReturn(responseWrapper); + assertSame(responseWrapper, + utilities.getDynamicFieldBasedOnLangCodeAndFieldName("Field Name", "Lang Code", true)); + verify(proxyMasterdataService).getDynamicFieldBasedOnLangCodeAndFieldName((String) Mockito.any(), + (String) Mockito.any(), anyBoolean()); + } + @Test + public void testGetDynamicFieldBasedOnLangCodeAndFieldName2() throws ResidentServiceCheckedException { + when((ResponseWrapper) proxyMasterdataService.getDynamicFieldBasedOnLangCodeAndFieldName( + (String) Mockito.any(), (String) Mockito.any(), anyBoolean())) + .thenThrow(new IdRepoAppException("An error occurred", "An error occurred")); + thrown.expect(IdRepoAppException.class); + utilities.getDynamicFieldBasedOnLangCodeAndFieldName("Field Name", "Lang Code", true); + verify(proxyMasterdataService).getDynamicFieldBasedOnLangCodeAndFieldName((String) Mockito.any(), + (String) Mockito.any(), anyBoolean()); + } + + @Test + public void testGetRidByIndividualId() throws ApisResourceAccessException { + ResponseWrapper response = new ResponseWrapper<>(); + response.setResponse(Map.of("rid", "123")); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + String rid = utilities.getRidByIndividualId("123"); + assertEquals("123", rid); + } + + @Test(expected = IndividualIdNotFoundException.class) + public void testGetRidByIndividualIdFailed() throws ApisResourceAccessException { + ResponseWrapper response = new ResponseWrapper<>(); + response.setErrors(List.of(new ServiceError(ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorCode(), + ResidentErrorCode.INVALID_INDIVIDUAL_ID.getErrorMessage()))); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + utilities.getRidByIndividualId("123"); + } + + @Test(expected = Exception.class) + public void testGetRidStatus() throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList arrayList = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("createdDateTimes", "2023-09-21T08:38:34.280Z"); + arrayList.add(map); + response.setResponse(arrayList); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + utilities.getRidStatus("123"); + } + + @Test + public void testGetTransactionTypeCode() throws ApisResourceAccessException, IOException { + when(env.getProperty(any())).thenReturn("PACKET_UPLOAD,PACKET_RECEIVER"); + HashMap packetStatus = new HashMap<>(); + packetStatus.put(TRANSACTION_TYPE_CODE, "PACKET_RECEIVER"); + assertEquals(Optional.of("REQUEST_RECEIVED"), + ReflectionTestUtils.invokeMethod(utilities, "getTransactionTypeCode", packetStatus)); + } + + @Test + public void testGetTransactionTypeCodeFailed() throws ApisResourceAccessException, IOException { + when(env.getProperty(any())).thenReturn("status,packet"); + HashMap packetStatus = new HashMap<>(); + packetStatus.put(TRANSACTION_TYPE_CODE, "test"); + ReflectionTestUtils.invokeMethod(utilities, "getTransactionTypeCode", packetStatus); + } + + @Test + public void testGetJson() { + ReflectionTestUtils.setField(utilities, "regProcessorIdentityJson", null); + utilities.getJson("http://localhost", "http://localhost"); + } + + @Test(expected = IdRepoAppException.class) + public void testRetrieveIdrepoJsonFailure() throws ApisResourceAccessException, IOException { + Map uin = (Map) JsonUtil.getJSONObject(identity, "response").get("identity"); + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setStatus("Activated"); + responseDTO1.setIdentity(JsonUtil.getJSONObject(identity, "response").get("identity")); + idResponseDTO1.setResponse(responseDTO1); + + Mockito.when(residentServiceRestClient.getApi(any(), anyList(), anyString(), anyString(), any(Class.class))).thenReturn(idResponseDTO1); + Mockito.when(objMapper.writeValueAsString(any())).thenReturn("identityString"); + + // UIN + JSONObject identityJsonObj = utilities.retrieveIdrepoJson("3527812406"); + assertEquals(identityJsonObj.get("UIN"), uin.get("UIN")); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetRidStatusFailed() throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add("123"); + response.setResponse(arrayList); + response.setErrors(List.of(new ServiceError(ResidentErrorCode.RID_NOT_FOUND.getErrorCode(), + ResidentErrorCode.RID_NOT_FOUND.getErrorMessage()))); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + utilities.getRidStatus("123"); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetRidStatusWithParseException() throws ApisResourceAccessException, IOException, ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList objectArrayList = new ArrayList<>(); + Map packetData = new HashMap<>(); + packetData.put("createdDateTimes", "12/10/2012"); + objectArrayList.add(packetData); + packetData.put("createdDateTimes", "05/09/2012"); + objectArrayList.add(packetData); + response.setResponse(objectArrayList); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + Mockito.when(objMapper.readValue(Mockito.anyString(), (Class) any())).thenReturn(objectArrayList); + Mockito.when(objMapper.writeValueAsString(Mockito.any())).thenReturn(String.valueOf(objectArrayList)); + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + utilities.getRidStatus("123"); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetPacketStatusFailed() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add("123"); + response.setResponse(arrayList); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + ArrayList objectArrayList = new ArrayList<>(); + objectArrayList.add("t"); + Mockito.when(objMapper.readValue(Mockito.anyString(), (Class) any())).thenReturn(objectArrayList); + Mockito.when(objMapper.writeValueAsString(Mockito.any())).thenReturn(String.valueOf(objectArrayList)); + utilities.getPacketStatus("10241102241004720230627060344"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetPacketStatusError() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add("123"); + response.setResponse(arrayList); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + ArrayList objectArrayList = new ArrayList<>(); + Map packetData = new HashMap<>(); + packetData.put("statusCode", ""); + packetData.put("transactionTypeCode", ""); + objectArrayList.add(packetData); + Mockito.when(objMapper.readValue(Mockito.anyString(), (Class) any())).thenReturn(objectArrayList); + Mockito.when(objMapper.writeValueAsString(Mockito.any())).thenReturn(String.valueOf(objectArrayList)); + utilities.getPacketStatus("10241102241004720230627060344"); + } + + @Test + public void testGetPacketStatus() throws ResidentServiceCheckedException, ApisResourceAccessException, IOException { + ResponseWrapper response = new ResponseWrapper<>(); + ArrayList objectArrayList = new ArrayList<>(); + Map packetData = new HashMap<>(); + packetData.put("statusCode", "SUCCESS"); + packetData.put("transactionTypeCode", "SUCCESS"); + packetData.put("createdDateTimes", "2012-10-15"); + objectArrayList.add(packetData); + packetData.put("statusCode", "SUCCESS"); + packetData.put("transactionTypeCode", "SUCCESS"); + packetData.put("createdDateTimes", "2012-09-02"); + objectArrayList.add(packetData); + response.setResponse(objectArrayList); + Mockito.when(residentServiceRestClient.getApi((ApiName) any(), any(), any())).thenReturn(response); + Mockito.when(objMapper.readValue(Mockito.anyString(), (Class) any())).thenReturn(objectArrayList); + Mockito.when(objMapper.writeValueAsString(Mockito.any())).thenReturn(String.valueOf(objectArrayList)); + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("yyyy-MM-dd").thenReturn("SUCCESS"); + Map result = utilities.getPacketStatus("10241102241004720230627060344"); + assertEquals("SUCCESS", result.get("aidStatus")); + } + + @Test + public void testGetDefaultSource() { + ReflectionTestUtils.setField(utilities, "provider", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketWriterImpl\n"); + assertEquals("RESIDENT", utilities.getDefaultSource()); + } + + @Test(expected = Exception.class) + public void testGetIdentityDataFromIndividualIDNullIdeResponseDto() + throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + when(identityService.getAccessToken()).thenReturn("ABC123"); + when(objMapper.writeValueAsString((Object) Mockito.any())).thenReturn("{} - {} - {} - {}"); + + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setDocuments(new ArrayList<>()); + responseDTO1.setEntity("Utilities::retrieveIdrepoJson()::entry"); + responseDTO1.setIdentity("Identity"); + responseDTO1.setStatus("Utilities::retrieveIdrepoJson()::entry"); + + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + idResponseDTO1.setErrors(new ArrayList<>()); + idResponseDTO1.setId("42"); + idResponseDTO1.setResponse(responseDTO1); + idResponseDTO1.setResponsetime("Utilities::retrieveIdrepoJson()::entry"); + idResponseDTO1.setVersion("1.0.2"); + when(utility.getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any())).thenReturn(null); + thrown.expect(IdRepoAppException.class); + utilities.getIdentityDataFromIndividualID("42"); + verify(identityService).getAccessToken(); + verify(objMapper).writeValueAsString((Object) Mockito.any()); + verify(utility).getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any()); + } + + @Test(expected = IdRepoAppException.class) + public void testGetIdentityDataFromIndividualIDIdRepoAppException() + throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + when(identityService.getAccessToken()).thenReturn("ABC123"); + when(objMapper.writeValueAsString((Object) Mockito.any())).thenReturn("{} - {} - {} - {}"); + + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setDocuments(new ArrayList<>()); + responseDTO1.setEntity("Utilities::retrieveIdrepoJson()::entry"); + responseDTO1.setIdentity("Identity"); + responseDTO1.setStatus("Utilities::retrieveIdrepoJson()::entry"); + + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + idResponseDTO1.setErrors(List.of(new ServiceError(ResidentErrorCode.NO_RECORDS_FOUND.getErrorCode(), + ResidentErrorCode.NO_RECORDS_FOUND.getErrorMessage()))); + idResponseDTO1.setId("42"); + idResponseDTO1.setResponse(responseDTO1); + idResponseDTO1.setResponsetime("Utilities::retrieveIdrepoJson()::entry"); + idResponseDTO1.setVersion("1.0.2"); + when(utility.getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any())).thenReturn(idResponseDTO1); + thrown.expect(IdRepoAppException.class); + utilities.getIdentityDataFromIndividualID("42"); + verify(identityService).getAccessToken(); + verify(objMapper).writeValueAsString((Object) Mockito.any()); + verify(utility).getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any()); + } + + @Test + public void testGetIdentityDataFromIndividual() + throws ApisResourceAccessException, ResidentServiceCheckedException, IOException { + when(identityService.getAccessToken()).thenReturn("ABC123"); + JSONObject identity = new JSONObject(); + identity.put(ResidentConstants.ID_SCHEMA_VERSION, "0.1"); + when(objMapper.writeValueAsString((Object) Mockito.any())).thenReturn(identity.toJSONString()); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + Object schema = "{\\\"$schema\\\":\\\"http:\\/\\/json-schema.org\\/draft-07\\/schema#\\\",\\\"description\\\":\\\"MOSIP Sample identity\\\",\\\"additionalProperties\\\":false,\\\"title\\\":\\\"MOSIP identity\\\",\\\"type\\\":\\\"object\\\",\\\"definitions\\\":{\\\"simpleType\\\":{\\\"uniqueItems\\\":true,\\\"additionalItems\\\":false,\\\"type\\\":\\\"array\\\",\\\"items\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"language\\\",\\\"value\\\"],\\\"properties\\\":{\\\"language\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"documentType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"},\\\"refNumber\\\":{\\\"type\\\":[\\\"string\\\",\\\"null\\\"]}}},\\\"biometricsType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"version\\\":{\\\"type\\\":\\\"number\\\",\\\"minimum\\\":0},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"properties\\\":{\\\"identity\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"IDSchemaVersion\\\",\\\"fullName\\\",\\\"dateOfBirth\\\",\\\"gender\\\",\\\"addressLine1\\\",\\\"addressLine2\\\",\\\"addressLine3\\\",\\\"region\\\",\\\"province\\\",\\\"city\\\",\\\"zone\\\",\\\"postalCode\\\",\\\"phone\\\",\\\"email\\\",\\\"proofOfIdentity\\\",\\\"individualBiometrics\\\"],\\\"properties\\\":{\\\"proofOfAddress\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"gender\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"city\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"postalCode\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[(?i)A-Z0-9]{5}$|^NA$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfException-1\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"referenceIdentityNumber\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^([0-9]{10,30})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"kyc\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"province\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"zone\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfDateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"addressLine1\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine2\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"residenceStatus\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"kyc\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine3\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"email\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[A-Za-z0-9_\\\\\\\\-]+(\\\\\\\\.[A-Za-z0-9_]+)*@[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_]+)*(\\\\\\\\.[a-zA-Z]{2,})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerRID\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"fullName\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"dateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(1869|18[7-9][0-9]|19[0-9][0-9]|20[0-9][0-9])\\/([0][1-9]|1[0-2])\\/([0][1-9]|[1-2][0-9]|3[01])$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualAuthBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"introducerUIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfIdentity\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"IDSchemaVersion\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"number\\\",\\\"fieldType\\\":\\\"default\\\",\\\"minimum\\\":0},\\\"proofOfException\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"phone\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[+]*([0-9]{1})([0-9]{9})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerName\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfRelationship\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"UIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"region\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"}}}}}"; + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map schemaJson = new HashMap<>(); + schemaJson.put("schemaJson", "schema"); + when(objMapper.convertValue((Object) any(), (Class) any())).thenReturn(schemaJson); + when(proxyMasterdataService.getLatestIdSchema(Double.parseDouble("0.1"), null, null)).thenReturn(idSchemaResponse); + + ResponseDTO1 responseDTO1 = new ResponseDTO1(); + responseDTO1.setDocuments(new ArrayList<>()); + responseDTO1.setEntity("Utilities::retrieveIdrepoJson()::entry"); + responseDTO1.setIdentity("Identity"); + responseDTO1.setStatus("Utilities::retrieveIdrepoJson()::entry"); + + responseDTO1.setIdentity(identity); + + IdResponseDTO1 idResponseDTO1 = new IdResponseDTO1(); + idResponseDTO1.setId("42"); + idResponseDTO1.setResponse(responseDTO1); + idResponseDTO1.setResponsetime("Utilities::retrieveIdrepoJson()::entry"); + idResponseDTO1.setVersion("1.0.2"); + when(utility.getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any())).thenReturn(idResponseDTO1); + assertEquals("schema", utilities.getIdentityDataFromIndividualID("42").getT2()); + verify(identityService).getAccessToken(); + verify(objMapper).writeValueAsString((Object) Mockito.any()); + verify(utility).getCachedIdentityData((String) Mockito.any(), (String) Mockito.any(), + (Class) Mockito.any()); + } + + +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/util/UtilityTest.java b/resident/resident-service/src/test/java/io/mosip/resident/util/UtilityTest.java new file mode 100644 index 00000000000..4a8b9198ba4 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/util/UtilityTest.java @@ -0,0 +1,1385 @@ +package io.mosip.resident.util; + +import static io.mosip.resident.constant.RegistrationConstants.DATETIME_PATTERN; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.time.LocalDateTime; +import java.time.format.FormatStyle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mvel2.integration.VariableResolverFactory; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.authcodeflowproxy.api.validator.ValidateTokenUtil; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.pdfgenerator.spi.PDFGenerator; +import io.mosip.kernel.core.util.HMACUtils2; +import io.mosip.kernel.openid.bridge.api.constants.AuthErrorCode; +import io.mosip.kernel.signature.dto.SignatureResponseDto; +import io.mosip.resident.constant.ApiName; +import io.mosip.resident.constant.RequestType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.dto.DynamicFieldCodeValueDTO; +import io.mosip.resident.dto.DynamicFieldConsolidateResponseDto; +import io.mosip.resident.dto.IdRepoResponseDto; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.JsonValue; +import io.mosip.resident.dto.RegistrationCenterDto; +import io.mosip.resident.dto.RegistrationCenterResponseDto; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.helper.ObjectStoreHelper; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import reactor.util.function.Tuple3; +import reactor.util.function.Tuples; + +@ContextConfiguration(classes = {Utility.class, ResidentServiceRestClient.class}) +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"}) +@PrepareForTest({JsonUtil.class}) +public class UtilityTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @MockBean + private Environment environment; + + @MockBean + private IdentityServiceImpl identityServiceImpl; + + @MockBean + private PDFGenerator pDFGenerator; + + @MockBean(name = "restClientWithPlainRestTemplate") + private ResidentServiceRestClient residentServiceRestClient1; + + @MockBean(name = "restClientWithSelfTOkenRestTemplate") + private ResidentServiceRestClient residentServiceRestClient2; + + @MockBean(name = "selfTokenRestTemplate") + private RestTemplate restTemplate; + + @MockBean + private ValidateTokenUtil validateTokenUtil; + + @MockBean(name = "varres") + private VariableResolverFactory variableResolverFactory; + + private static final String LOCALE = "en-US"; + + @Mock + private ResidentServiceRestClient residentServiceRestClient; + + @InjectMocks + private Utility utility; + + private JSONObject identity; + + @Mock + private Environment env; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private HttpServletRequest request; + + @Mock + private PDFGenerator pdfGenerator; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + @Qualifier("selfTokenRestTemplate") + private RestTemplate residentRestTemplate; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private Utilities utilities; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private ValidateTokenUtil tokenValidationHelper; + + @Mock + private ProxyPartnerManagementService proxyPartnerManagementService; + + private ObjectMapper mapper = new ObjectMapper(); + + private String replaceSplChars = "{\" \": \"_\", \",\" : \"\", \":\" : \".\"}"; + private static String token; + @Mock + private ObjectStoreHelper objectStoreHelper; + private String idaToken; + + private static final String AUTHORIZATION = "Authorization"; + private static final String BEARER_PREFIX = "Bearer "; + private static final String TOKEN = "sampleToken"; + private static final String RESPONSE_JSON = "{\"user_id\": 123, \"username\": \"sampleUser\"}"; + + private static Map mappingJson; + private static final String MAPPING_NAME = "name"; + + @Before + public void setUp() throws IOException, ApisResourceAccessException { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("ID.json").getFile()); + InputStream is = new FileInputStream(idJson); + String idJsonString = IOUtils.toString(is, "UTF-8"); + identity = JsonUtil.readValue(idJsonString, JSONObject.class); + + ReflectionTestUtils.setField(utility, "mapper", mapper); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "url"); + ReflectionTestUtils.setField(utility, "residentIdentityJson", "json"); + ReflectionTestUtils.setField(utility, "formattingStyle", FormatStyle.MEDIUM.name()); + ReflectionTestUtils.setField(utility, "specialCharsReplacementMap", mapper.readValue(replaceSplChars, Map.class)); + when(env.getProperty("resident.ui.datetime.pattern.default")).thenReturn("yyyy-MM-dd"); + when(env.getProperty("resident.filename.datetime.pattern.default")).thenReturn("yyyy-MM-dd hh:mm:ss a"); + request = Mockito.mock(HttpServletRequest.class); + token = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJubEpTaUExM2tPUWhZQ0JxMEVKSkRlWnFTOGsybDB3MExUbmQ1WFBCZ20wIn0." + + "eyJleHAiOjE2NzIxMjU0NjEsImlhdCI6MTY3MjAzOTA2MSwianRpIjoiODc5YTdmYTItZWZhYy00YTQwLTkxODQtNzZiM2FhMWJiODg0IiwiaXNzIjoiaHR0c" + + "HM6Ly9pYW0uZGV2Lm1vc2lwLm5ldC9hdXRoL3JlYWxtcy9tb3NpcCIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJiNTc3NjkzYi0xOWI1LTRlYTktYWEzNy1kMT" + + "EzMjdkOGRkNzkiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJtb3NpcC1yZXNpZGVudC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiNWNmZWIzNTgtNGY1Ni00NjM" + + "0LTg3NmQtNGFjNzk1OTYyYWRkIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9u" + + "IiwiZGVmYXVsdC1yb2xlcy1tb3NpcCJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYW" + + "Njb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoid2FsbGV0X2JpbmRpbmcgYXV0aC5oaXN0b3J5LnJlYWRvbmx5IG1pY3JvcHJvZmlsZS1q" + + "d3QgaWRlbnRpdHkucmVhZG9ubHkgaWRhX3Rva2VuIG9mZmxpbmVfYWNjZXNzIGFkZHJlc3MgdXBkYXRlX29pZGNfY2xpZW50IGNyZWRlbnRpYWwubWFuYWdlIH" + + "ZpZC5tYW5hZ2UgZ2V0X2NlcnRpZmljYXRlIGFkZF9vaWRjX2NsaWVudCB2aWQucmVhZG9ubHkgaWRlbnRpdHkudXBkYXRlIG5vdGlmaWNhdGlvbnMubWFuYWdl" + + "IGVtYWlsIHVwbG9hZF9jZXJ0aWZpY2F0ZSBhdXRoLnJlYWRvbmx5IGF1dGgubWV0aG9kLm1hbmFnZSBub3RpZmljYXRpb25zLnJlYWRvbmx5IGluZGl2aWR1YWxf" + + "aWQgYXV0aC5oaXN0b3J5Lm1hbmFnZSB0ZXN0IHByb2ZpbGUgY2FyZC5tYW5hZ2Ugc2VuZF9iaW5kaW5nX290cCIsInNpZCI6IjVjZmViMzU4LTRmNTYtNDYzNC0" + + "4NzZkLTRhYzc5NTk2MmFkZCIsInVwbiI6ImthbWVzaCIsImFkZHJlc3MiOnt9LCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsIm5hbWUiOiJLYW1lc2ggU2hla2hh" + + "ciIsImdyb3VwcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwiZGVmYXVsdC1yb2xlcy1tb3NpcCJdLCJwcmVmZXJyZWRfdXNlcm5hb" + + "WUiOiJrYW1lc2giLCJnaXZlbl9uYW1lIjoiS2FtZXNoIiwiZmFtaWx5X25hbWUiOiJTaGVraGFyIiwicGljdHVyZSI6ImlWQk9SdzBLR2dvQUFBQU5TVWhFVW" + + "dBQUFBb0FBQUFLQ0FJQUFBQUNVRmpxQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQUZpVUFBQllsQVVsU0pQQUF" + + "BQUJDU1VSQlZDaFRiWXRCRWdBZ0NBTDcvNmVOaEJ5MDlxRGk2Z3BqWFpTeFVVOG8vanJmcERtY21ZMVFBT1doZ1Rzd3Y2c1NtOHpWaFVMbGdzdCsrOFQ1MUlq" + + "WU5VSGRJKzRYWkhvQUFBQUFTVVZPUks1Q1lJST0iLCJlbWFpbCI6ImthbWVzaHNyMTMzOEBnbWFpbC5jb20ifQ.YLddWNd7ldiMvPhDK0HhXaKjEmeOE0T6wS" + + "CjfN3mlwxDxHm2DzMHnwbKR5orEm1NRyCnUfGGm5IMVTdDnXz1iUAsU7zeKA2XOdH3zQgMUu-vqJpgRWRG-XJHakSyblfAFIVAILRi7rwJQjL7X1lhm1ZAqUX" + + "Soh6kZBoOeYd_29RQQzFQNzpn_Ahk4GxQu_TLyvoWeNXpfx94om7TqrZYghtTg5_svku2P0NuFxzbWysPMjaHrEff0idKY94sKJ6eNpLXRXbJCPkAHtfVY0U3" + + "YDQqWUpYjE3hQCZz0u_L8sieJIN3mYtjd12rfOrjEKu2fFGu5UbJRVqkmOw0egVGHw"; + idaToken = "2186705746"; + mappingJson = new HashMap<>(); + Map mapping1 = new HashMap<>(); + mapping1.put("mapping1", "value1"); + mappingJson.put("identity", mapping1); + } + + @Test + public void retrieveIdrepoJsonSuccessTest() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + // UIN + JSONObject identityJsonObj = utility.retrieveIdrepoJson("3527812406"); + assertEquals(identityJsonObj.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); + // RID + JSONObject jsonUsingRID = utility.retrieveIdrepoJson("10008200070004420191203104356"); + assertEquals(jsonUsingRID.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); + + } + + @Test + public void testRetrieveVidSuccess() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + idRepoResponseDto.setIdentity(JsonUtil.getJSONObject(identity, "identity")); + response.setResponse(idRepoResponseDto); + + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + JSONObject jsonUsingVID = utility.retrieveIdrepoJson("5628965106742572"); + assertEquals(jsonUsingVID.get("UIN"), JsonUtil.getJSONObject(identity, "identity").get("UIN")); + } + + @Test(expected = IdRepoAppException.class) + public void testRetrieveIdrepoJsonError() throws ApisResourceAccessException, ResidentServiceCheckedException { + ResponseWrapper response = new ResponseWrapper<>(); + response.setErrors(List.of(new ServiceError("error code", "error msg"))); + + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + utility.retrieveIdrepoJson("5628965106742572"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void retrieveIdrepoJsonClientError() throws ApisResourceAccessException, ResidentServiceCheckedException { + HttpClientErrorException clientExp = new HttpClientErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", clientExp); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenThrow(apiResourceAccessExp); + utility.retrieveIdrepoJson("3527812406"); + + } + + @Test(expected = ResidentServiceCheckedException.class) + public void retrieveIdrepoJsonServerError() throws ApisResourceAccessException, ResidentServiceCheckedException { + HttpServerErrorException serverExp = new HttpServerErrorException(HttpStatus.BAD_GATEWAY); + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", serverExp); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenThrow(apiResourceAccessExp); + utility.retrieveIdrepoJson("3527812406"); + + } + + @Test(expected = ResidentServiceCheckedException.class) + public void retrieveIdrepoJsonUnknownException() + throws ApisResourceAccessException, ResidentServiceCheckedException { + ApisResourceAccessException apiResourceAccessExp = new ApisResourceAccessException("BadGateway", + new RuntimeException()); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenThrow(apiResourceAccessExp); + utility.retrieveIdrepoJson("3527812406"); + + } + + @Test(expected = IdRepoAppException.class) + public void testIdRepoAppException() throws ApisResourceAccessException, ResidentServiceCheckedException { + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(null); + utility.retrieveIdrepoJson("3527812406"); + + } + + @Test(expected = IdRepoAppException.class) + public void vidResponseNull() throws ApisResourceAccessException, ResidentServiceCheckedException { + List pathsegments = new ArrayList<>(); + pathsegments.add("5628965106742572"); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(null); + utility.retrieveIdrepoJson("5628965106742572"); + + } + + @Test + public void testGetMailingAttributes() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + Utility utilitySpy = Mockito.spy(utility); + Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + + Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("user@mail.com", attributes.get("email")); + Map attributes1 = utilitySpy.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("user@mail.com", attributes1.get("email")); + + } + + @Test(expected = ResidentServiceException.class) + public void testGetMailingAttributesIdNull() throws Exception { + utility.getMailingAttributes(null, new HashSet(), Map.of(), Map.of()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetMailingAttributesIdEmpty() throws Exception { + utility.getMailingAttributes("", new HashSet(), Map.of(), Map.of()); + } + + @Test + public void testGetMappingJsonEmpty() throws Exception { + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", ""); + utility.getMappingJson(); + } + + @Test + public void testReadResourceContent() throws UnsupportedEncodingException { + assertEquals("AXAXAXAX", utility.readResourceContent(new ByteArrayResource("AXAXAXAX".getBytes("UTF-8")))); + } + + @Test + public void testReadResourceContent3() { + thrown.expect(ResidentServiceException.class); + utility.readResourceContent(new ClassPathResource("Path")); + } + + @Test(expected = Exception.class) + public void testMaskEmail() { + utility.maskEmail("jane.doe@example.org"); + } + + @Test + public void testGetPreferredLanguage() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + Utility utilitySpy = Mockito.spy(utility); + Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + + Mockito.doReturn("preferredLang").when(env).getProperty("mosip.default.user-preferred-language-attribute"); + Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("eng", attributes.get("preferredLang")); + } + + @Test + public void testGetDefaultTemplateLanguages() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + Utility utilitySpy = Mockito.spy(utility); + Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + + Mockito.doReturn("preferredLang").when(env).getProperty("mosip.default.template-languages"); + Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("eng", attributes.get("preferredLang")); + } + + @Test + public void testGetDataCapturedLanguages() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + Utility utilitySpy = Mockito.spy(utility); + Mockito.doReturn(mappingJson).when(utilitySpy).getMappingJson(); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + + Mockito.doReturn(null).when(env).getProperty("mosip.default.template-languages"); + Map attributes = utilitySpy.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("eng", attributes.get("preferredLang")); + } + + @Test + public void testGetMappingJson() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", mappingJson); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + + Map attributes = utility.getMailingAttributes("3527812406", new HashSet(), identityJson, mapperIdentity); + assertEquals("eng", attributes.get("preferredLang")); + verify(residentRestTemplate, never()).getForObject(anyString(), any(Class.class)); + } + + @Test + public void testGetFileNameAsPerFeatureNameShareCredWithPartner() { + assertEquals("SHARE_CRED_WITH_PARTNER", utility.getFileName("123", "SHARE_CRED_WITH_PARTNER", 0, LOCALE)); + assertEquals("GENERATE_VID", utility.getFileName("123", "GENERATE_VID", 0, LOCALE)); + assertEquals("REVOKE_VID", utility.getFileName("123", "REVOKE_VID", 0, LOCALE)); + assertEquals("ORDER_PHYSICAL_CARD", utility.getFileName("123", "ORDER_PHYSICAL_CARD", 0, LOCALE)); + assertEquals("DOWNLOAD_PERSONALIZED_CARD", utility.getFileName("123", "DOWNLOAD_PERSONALIZED_CARD", 0, LOCALE)); + assertEquals("UPDATE_MY_UIN", utility.getFileName("123", "UPDATE_MY_UIN", 0, LOCALE)); + assertEquals("AUTH_TYPE_LOCK_UNLOCK", utility.getFileName("123", "AUTH_TYPE_LOCK_UNLOCK", 0, LOCALE)); + assertEquals("Generic", utility.getFileName("123", "Generic", 0, LOCALE)); + } + + @Test + public void testGetFileNameAsPerFeatureNameGenerateVid() { + Mockito.when(env.getProperty(ResidentConstants.ACK_MANAGE_MY_VID_NAMING_CONVENTION_PROPERTY)) + .thenReturn("Ack_Manage_my_VID_{eventId}_{timestamp}.pdf"); + Mockito.when(env.getProperty("resident.datetime.pattern")) + .thenReturn("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + assertNotNull(utility.getFileName("123", "Ack_Manage_my_VID_{eventId}_{timestamp}.pdf", 0, LOCALE)); + } + + @Test + public void testGetFileNameNullEventId() { + Mockito.when(env.getProperty(ResidentConstants.ACK_MANAGE_MY_VID_NAMING_CONVENTION_PROPERTY)) + .thenReturn("Ack_Manage_my_VID_{eventId}_{timestamp}.pdf"); + Mockito.when(env.getProperty("resident.datetime.pattern")) + .thenReturn("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + assertNotNull(utility.getFileName(null, "Ack_Manage_my_VID_{eventId}_{timestamp}.pdf", 0, LOCALE)); + } + + @Test + public void testGetIdForResidentTransactionEmail() throws ResidentServiceCheckedException, NoSuchAlgorithmException { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("2186705746"); + identityDTO.setEmail("kameshprasad1338@gmail.com"); + identityDTO.setPhone("8809989898"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(identityService.getIDAToken(Mockito.anyString())).thenReturn("2186705746"); + assertEquals(HMACUtils2.digestAsPlainText(("kameshprasad1338@gmail.com" + "2186705746").getBytes()), + utility.getIdForResidentTransaction(List.of("EMAIL"), identityDTO, idaToken)); + } + + @Test + public void testGetIdForResidentTransactionPhone() throws ResidentServiceCheckedException, NoSuchAlgorithmException { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("2186705746"); + identityDTO.setEmail("kameshprasad1338@gmail.com"); + identityDTO.setPhone("8809989898"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(identityService.getIDAToken(Mockito.anyString())).thenReturn("2186705746"); + assertEquals(HMACUtils2.digestAsPlainText(("8809989898" + "2186705746").getBytes()), + utility.getIdForResidentTransaction(List.of("PHONE"), identityDTO, idaToken)); + } + + @Test + public void testGetIdForResidentTransactionPhoneEmail() throws ResidentServiceCheckedException, NoSuchAlgorithmException { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("2186705746"); + identityDTO.setEmail("kameshprasad1338@gmail.com"); + identityDTO.setPhone("8809989898"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(identityService.getIDAToken(Mockito.anyString())).thenReturn("2186705746"); + assertEquals(HMACUtils2.digestAsPlainText(("kameshprasad1338@gmail.com" + "8809989898" + "2186705746").getBytes()), + utility.getIdForResidentTransaction(List.of("PHONE", "EMAIL"), identityDTO, idaToken)); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetIdForResidentTransactionPhoneEmailFailure() throws ResidentServiceCheckedException, NoSuchAlgorithmException { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setUIN("2186705746"); + identityDTO.setEmail("kameshprasad1338@gmail.com"); + identityDTO.setPhone("8809989898"); + Mockito.when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + Mockito.when(identityService.getIDAToken(Mockito.anyString())).thenReturn("2186705746"); + assertEquals(HMACUtils2.digestAsPlainText(("kameshprasad1338@gmail.com" + "8809989898" + "2186705746").getBytes()), + utility.getIdForResidentTransaction(List.of("PH"), identityDTO, idaToken)); + } + + @Test + public void testSignPdf() throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] array = "pdf".getBytes(); + out.write(array); + Mockito.when(pdfGenerator.generate((InputStream) any())).thenReturn(out); + utility.signPdf(new ByteArrayInputStream("pdf".getBytes()), null); + } + + @Test + public void testCreateDownloadLinkFailure() { + assertEquals("NA", utility.createDownloadCardLinkFromEventId(new ResidentTransactionEntity())); + } + + @Test + public void testCreateDownloadLinkSuccess() { + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + ReflectionTestUtils.setField(utility, "downloadCardUrl", "http://mosip/event/{eventId}"); + residentTransactionEntity.setReferenceLink("http://mosip"); + residentTransactionEntity.setEventId("123455678"); + assertEquals("http://mosip/event/123455678", utility.createDownloadCardLinkFromEventId(residentTransactionEntity)); + } + + @Test + public void testCreateTrackServiceRequestLink() { + ReflectionTestUtils.setField(utility, "trackServiceUrl", "http://mosip"); + assertEquals(("http://mosip" + "2186705746111111"), utility.createTrackServiceRequestLink("2186705746111111")); + } + + @Test + public void testCreateEventId() { + ReflectionTestUtils.setField(utility, "trackServiceUrl", "http://mosip"); + Mockito.when(utilities.getSecureRandom()).thenReturn(new SecureRandom()); + assertEquals(16, utility.createEventId().length()); + } + + @Test + public void testCreateEntity() { + assertEquals("Unknown", utility.createEntity(RequestType.SHARE_CRED_WITH_PARTNER).getCrBy()); + } + + @Test + public void testGetFileNameAsPerFeatureName() { + Mockito.when(env.getProperty(Mockito.anyString())) + .thenReturn("AckFileName"); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.SHARE_CRED_WITH_PARTNER, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.GENERATE_VID, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.REVOKE_VID, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.ORDER_PHYSICAL_CARD, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.DOWNLOAD_PERSONALIZED_CARD, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.UPDATE_MY_UIN, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.AUTH_TYPE_LOCK_UNLOCK, 0, LOCALE)); + assertEquals("AckFileName", utility.getFileNameAsPerFeatureName("123", RequestType.DEFAULT, 0, LOCALE)); + } + + @Test + public void testGetClientIp() { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn("1.2.3,1.3"); + String ipAddress = utility.getClientIp(request); + assertEquals("1.2.3", ipAddress); + } + + @Test + public void testGetClientIpEmpty() { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn(""); + Mockito.when(request.getRemoteAddr()).thenReturn("1.1.5"); + String ipAddress = utility.getClientIp(request); + assertEquals("1.1.5", ipAddress); + } + + @Test + public void testGetClientIpNull() { + Mockito.when(request.getHeader(Mockito.anyString())).thenReturn(null); + Mockito.when(request.getRemoteAddr()).thenReturn("1.5.5"); + String ipAddress = utility.getClientIp(request); + assertEquals("1.5.5", ipAddress); + } + + @Test(expected = Exception.class) + public void testGetCardOrderTrackingId() throws ApisResourceAccessException, ResidentServiceCheckedException { + utility.getCardOrderTrackingId("42", "42"); + } + + @Test + public void test_formatWithOffsetForFileName_en_US() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForFileName(0, "en-US", localDateTime); + assertEquals("Aug_14_1993_4.54.00_PM", formatWithOffsetForFileName); + } + + @Test + public void test_formatWithOffsetForFileName_en_IN() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForFileName(-330, "en-IN", localDateTime); + assertEquals("14-Aug-1993_10.24.00_PM", formatWithOffsetForFileName); + } + + @Test + public void test_formatWithOffsetForFileName_null_locale() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForFileName(0, null, localDateTime); + assertEquals("1993-08-14_04.54.00_PM", formatWithOffsetForFileName); + } + + + @Test + public void test_formatWithOffsetForUI_en_US() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForUI(0, "en-US", localDateTime); + assertEquals("Aug 14, 1993, 4:54:00 PM", formatWithOffsetForFileName); + } + + @Test + public void test_formatWithOffsetForUI_en_IN() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForUI(-330, "en-IN", localDateTime); + assertEquals("14-Aug-1993, 10:24:00 PM", formatWithOffsetForFileName); + } + + @Test + public void test_formatWithOffsetForUI_null_locale() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForUI(0, null, localDateTime); + assertEquals("1993-08-14", formatWithOffsetForFileName); + } + + @Test(expected = RuntimeException.class) + public void testGetSessionUserName() throws ApisResourceAccessException { + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("name"); + Mockito.when(identityService.getAvailableclaimValue(Mockito.anyString())).thenThrow(new ApisResourceAccessException()); + utility.getSessionUserName(); + } + + @Test + public void test_formatWithOffsetForUI_locale_length_1() { + LocalDateTime localDateTime = LocalDateTime.of(1993, 8, 14, 16, 54); + String formatWithOffsetForFileName = utility.formatWithOffsetForUI(0, "en", localDateTime); + assertEquals("Aug 14, 1993, 4:54:00 PM", formatWithOffsetForFileName); + } + + @Test + public void test_formatWithOffsetForUI_local_null() { + ReflectionTestUtils.invokeMethod(utility, "formatToLocaleDateTime", null, null, LocalDateTime.now()); + } + + @Test + public void testGetRefIdHash() throws NoSuchAlgorithmException { + assertEquals("B9CCBC594A8572018BC9DC97AB7A4BB175ABFC2F9FE3197D891D542C02C7ECE7", + utility.getRefIdHash("4936295739034704")); + } + + @Test + public void testGetFileNameAck() { + utility.getFileNameAck(RequestType.GET_MY_ID.getName(), "4936295739034704", + "Ack_{featureName}_{eventId}_{timestamp}", 0, "en-IN"); + } + + @Test + public void testReplaceSpecialChars() { + ReflectionTestUtils.setField(utility, "specialCharsReplacementMap", Map.of()); + assertEquals("Get_My_Id", + ReflectionTestUtils.invokeMethod(utility, "replaceSpecialChars", "Get_My_Id")); + } + + @Test + public void testGetFileNameForId() { + utility.getFileNameForId("Get_My_Id", "UIN_{id}_{timestamp}", 0, "en-IN"); + } + + @Test + public void testSignPdfSuccess() throws Exception { + // Mocking environment properties + when(env.getProperty(ResidentConstants.LOWER_LEFT_X)).thenReturn("10"); + when(env.getProperty(ResidentConstants.LOWER_LEFT_Y)).thenReturn("20"); + when(env.getProperty(ResidentConstants.UPPER_RIGHT_X)).thenReturn("100"); + when(env.getProperty(ResidentConstants.UPPER_RIGHT_Y)).thenReturn("200"); + when(env.getProperty(ResidentConstants.REASON)).thenReturn("Test Reason"); + when(env.getProperty(ResidentConstants.SIGN_PDF_APPLICATION_ID)).thenReturn("AppId"); + when(env.getProperty(ResidentConstants.SIGN_PDF_REFERENCE_ID)).thenReturn("RefId"); + when(env.getProperty(DATETIME_PATTERN)).thenReturn("yyyy-MM-dd HH:mm:ss"); + when(env.getProperty(ApiName.PDFSIGN.name())).thenReturn("http://dev.mosip.net"); + + // Mocking PDF generator + byte[] pdfContent = "Sample PDF Content".getBytes(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + // Write the byte array to the output stream + outputStream.write(pdfContent); + + try (FileOutputStream fileOutputStream = new FileOutputStream("output.txt")) { + outputStream.writeTo(fileOutputStream); + } + + when(pdfGenerator.generate(any(InputStream.class))).thenReturn(outputStream); + when(utilities.getTotalNumberOfPageInPdf(Mockito.any())).thenReturn(1); + + // Mocking response from the REST client + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(new SignatureResponseDto()); + when(residentServiceRestClient.postApi( + any(), + any(), + any(), + any() + )).thenReturn(responseWrapper); + + when(objectMapper.writeValueAsString(any())).thenReturn("mock"); + SignatureResponseDto signatureResponseDto = new SignatureResponseDto(); + signatureResponseDto.setData("ZGF0YQ=="); + when(objectMapper.readValue(anyString(), (Class) any())).thenReturn(signatureResponseDto); + + // Call the method to be tested + InputStream pdfInputStream = new ByteArrayInputStream(pdfContent); + byte[] signaturedPdf = utility.signPdf(pdfInputStream, "password"); + + // Assertions + assertNotNull(signaturedPdf); + + outputStream.close(); + } + + @Test + public void testSignPdfFailed() throws Exception { + // Mocking environment properties + when(env.getProperty(ResidentConstants.LOWER_LEFT_X)).thenReturn("10"); + when(env.getProperty(ResidentConstants.LOWER_LEFT_Y)).thenReturn("20"); + when(env.getProperty(ResidentConstants.UPPER_RIGHT_X)).thenReturn("100"); + when(env.getProperty(ResidentConstants.UPPER_RIGHT_Y)).thenReturn("200"); + when(env.getProperty(ResidentConstants.REASON)).thenReturn("Test Reason"); + when(env.getProperty(ResidentConstants.SIGN_PDF_APPLICATION_ID)).thenReturn("AppId"); + when(env.getProperty(ResidentConstants.SIGN_PDF_REFERENCE_ID)).thenReturn("RefId"); + when(env.getProperty(DATETIME_PATTERN)).thenReturn("yyyy-MM-dd HH:mm:ss"); + when(env.getProperty(ApiName.PDFSIGN.name())).thenReturn("http://dev.mosip.net"); + + // Mocking PDF generator + byte[] pdfContent = "Sample PDF Content".getBytes(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + // Write the byte array to the output stream + outputStream.write(pdfContent); + + try (FileOutputStream fileOutputStream = new FileOutputStream("output.txt")) { + outputStream.writeTo(fileOutputStream); + } + + when(pdfGenerator.generate(any(InputStream.class))).thenReturn(outputStream); + when(utilities.getTotalNumberOfPageInPdf(Mockito.any())).thenReturn(1); + + // Mocking response from the REST client + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(new SignatureResponseDto()); + responseWrapper.setErrors(List.of(new ServiceError(ResidentErrorCode.UNKNOWN_EXCEPTION.getErrorCode(), + ResidentErrorCode.UNKNOWN_EXCEPTION.name()))); + when(residentServiceRestClient.postApi( + any(), + any(), + any(), + any() + )).thenReturn(responseWrapper); + + when(objectMapper.writeValueAsString(any())).thenReturn("mock"); + SignatureResponseDto signatureResponseDto = new SignatureResponseDto(); + signatureResponseDto.setData("ZGF0YQ=="); + when(objectMapper.readValue(anyString(), (Class) any())).thenReturn(signatureResponseDto); + + // Call the method to be tested + InputStream pdfInputStream = new ByteArrayInputStream(pdfContent); + byte[] signaturedPdf = utility.signPdf(pdfInputStream, "password"); + + // Assertions + assertNull(signaturedPdf); + + outputStream.close(); + } + + @Test + public void testDecodeAndDecryptUserInfoOidcJwtDisabled() { + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_SIGNED)).thenReturn(String.valueOf(true)); + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_VERIFY_ENABLED)).thenReturn(String.valueOf(false)); + AuthErrorCode authErrorCode = null; + ImmutablePair verifySignature = new ImmutablePair<>(true, authErrorCode); + Mockito.when(tokenValidationHelper + .verifyJWTSignagure(Mockito.any())).thenReturn(verifySignature); + ReflectionTestUtils.invokeMethod(utility, "decodeAndDecryptUserInfo", token); + } + + @Test + public void testDecodeAndDecryptUserInfo() { + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_SIGNED)).thenReturn(String.valueOf(true)); + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_VERIFY_ENABLED)).thenReturn(String.valueOf(true)); + AuthErrorCode authErrorCode = null; + ImmutablePair verifySignature = new ImmutablePair<>(true, authErrorCode); + Mockito.when(tokenValidationHelper + .verifyJWTSignagure(Mockito.any())).thenReturn(verifySignature); + ReflectionTestUtils.invokeMethod(utility, "decodeAndDecryptUserInfo", token); + } + + @Test(expected = ResidentServiceException.class) + public void testDecodeAndDecryptUserInfoOidcJwtDisabledFailure() { + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_SIGNED)).thenReturn(String.valueOf(true)); + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_VERIFY_ENABLED)).thenReturn(String.valueOf(true)); + AuthErrorCode authErrorCode = AuthErrorCode.FORBIDDEN; + ImmutablePair verifySignature = new ImmutablePair<>(false, authErrorCode); + Mockito.when(tokenValidationHelper + .verifyJWTSignagure(Mockito.any())).thenReturn(verifySignature); + ReflectionTestUtils.invokeMethod(utility, "decodeAndDecryptUserInfo", token); + } + + @Test(expected = Exception.class) + public void testDecodeAndDecryptUserInfoOidcEncryptionEnabled() { + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_SIGNED)).thenReturn(String.valueOf(false)); + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_JWT_VERIFY_ENABLED)).thenReturn(String.valueOf(false)); + Mockito.when(env.getProperty(ResidentConstants.MOSIP_OIDC_ENCRYPTION_ENABLED)).thenReturn(String.valueOf(true)); + Mockito.when(objectStoreHelper.decryptData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())) + .thenReturn(Arrays.toString(Base64.getEncoder().encode("payload".getBytes()))); + AuthErrorCode authErrorCode = null; + ImmutablePair verifySignature = new ImmutablePair<>(true, authErrorCode); + Mockito.when(tokenValidationHelper + .verifyJWTSignagure(Mockito.any())).thenReturn(verifySignature); + ReflectionTestUtils.invokeMethod(utility, "decodeAndDecryptUserInfo", token); + } + + @Test + public void testDecryptPayload() { + Mockito.when(env.getProperty(Mockito.anyString())).thenReturn("RESIDENT"); + Mockito.when(objectStoreHelper.decryptData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("payload"); + assertEquals("payload", ReflectionTestUtils.invokeMethod(utility, "decryptPayload", "payload")); + } + + private Tuple3, Map> loadUserInfoMethod() throws Exception { + + Map userInfo = new HashMap<>(); + userInfo.put("claim", "value"); + URI uri = URI.create("http://localhost:8080/userinfo"); + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Authorization", "Bearer " + token); + return Tuples.of(uri, headers, userInfo); + } + + @Test + public void testGetPreferredLanguageSingleLanguage() { + Map demographicIdentity = new HashMap<>(); + demographicIdentity.put("languageAttribute", "English"); + + when(env.getProperty("mosip.default.user-preferred-language-attribute")) + .thenReturn("languageAttribute"); + + Set preferredLanguages = utility.getPreferredLanguage(demographicIdentity); + assertEquals(1, preferredLanguages.size()); + assertEquals("English", preferredLanguages.iterator().next()); + } + + @Test + public void testGetPreferredLanguageMultipleLanguages() { + Map demographicIdentity = new HashMap<>(); + demographicIdentity.put("languageAttribute", "English,Hindi,French"); + + when(env.getProperty("mosip.default.user-preferred-language-attribute")) + .thenReturn("languageAttribute"); + + Set preferredLanguages = utility.getPreferredLanguage(demographicIdentity); + assertEquals(3, preferredLanguages.size()); + assertEquals(Set.of("English", "Hindi", "French"), preferredLanguages); + } + + @Test + public void testGetPreferredLanguageAttributeNotSet() { + Map demographicIdentity = new HashMap<>(); + demographicIdentity.put("languageAttribute", "English"); + + when(env.getProperty("mosip.default.user-preferred-language-attribute")) + .thenReturn(null); + + Set preferredLanguages = utility.getPreferredLanguage(demographicIdentity); + assertEquals(0, preferredLanguages.size()); + } + + @Test + public void testGetDefaultTemplateLanguagesV2() { + when(env.getProperty("mosip.default.template-languages")).thenReturn("en,fr,es"); + + List result = utility.getDefaultTemplateLanguages(); + + assertEquals(3, result.size()); + assertEquals(Arrays.asList("en", "fr", "es"), result); + } + + @Test + public void testGetDefaultTemplateLanguagesEmpty() { + when(env.getProperty("mosip.default.template-languages")).thenReturn(null); + + List result = utility.getDefaultTemplateLanguages(); + + assertEquals(0, result.size()); + } + + @Test + public void testGetCenterDetails() throws ApisResourceAccessException { + String centerId = "center123"; + String langCode = "en"; + + ResponseWrapper expectedResponse = new ResponseWrapper<>(); + RegistrationCenterResponseDto registrationCenterResponseDto = new RegistrationCenterResponseDto(); + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + registrationCenterDto.setId(centerId); + registrationCenterDto.setLangCode(langCode); + registrationCenterResponseDto.setRegistrationCenters(List.of(registrationCenterDto)); + expectedResponse.setResponse(registrationCenterResponseDto); + + List pathSegments = Arrays.asList(centerId, langCode); + when(residentServiceRestClient.getApi(ApiName.CENTERDETAILS, pathSegments, "", "", ResponseWrapper.class)) + .thenReturn(expectedResponse); + + ResponseWrapper result = utility.getCenterDetails(centerId, langCode); + + assertEquals(expectedResponse, result); + } + + @Test + public void testGetValidDocumentByLangCode() throws ResidentServiceCheckedException { + String langCode = "en"; + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + when(proxyMasterdataService.getValidDocumentByLangCode(langCode)).thenReturn(responseWrapper); + + ResponseWrapper result = utility.getValidDocumentByLangCode(langCode); + + assertEquals(responseWrapper, result); + } + + @Test + public void testGetPartnersByPartnerType_WithPartnerType() throws ResidentServiceCheckedException { + String partnerType = "partner"; + ApiName apiUrl = ApiName.PARTNER_API_URL; + + ResponseWrapper expectedResponse = new ResponseWrapper<>(); + when(proxyPartnerManagementService.getPartnersByPartnerType( + Optional.of(partnerType), apiUrl)) + .thenReturn(expectedResponse); + + ResponseWrapper result = utility.getPartnersByPartnerType(partnerType, apiUrl); + + assertEquals(expectedResponse, result); + } + + @Test + public void testGetPartnersByPartnerType_WithoutPartnerType() throws ResidentServiceCheckedException { + ApiName apiUrl = ApiName.PARTNER_API_URL; + + ResponseWrapper expectedResponse = new ResponseWrapper<>(); + when(proxyPartnerManagementService.getPartnersByPartnerType( + Optional.empty(), apiUrl)) + .thenReturn(expectedResponse); + + ResponseWrapper result = utility.getPartnersByPartnerType(null, apiUrl); + + assertEquals(expectedResponse, result); + } + + @Test + public void testClearIdentityMapCache() { + utility.clearIdentityMapCache(token); + } + + @Test + public void testGetAuthTypeCodeFromKey() throws ResidentServiceCheckedException { + String reqTypeCode = "reqCode"; + + Map amrAcrMapping = new HashMap<>(); + amrAcrMapping.put("reqCode", "authCode"); + when(utilities.getAmrAcrMapping()).thenReturn(amrAcrMapping); + + String result = utility.getAuthTypeCodefromkey(reqTypeCode); + + assertEquals("authCode", result); + } + + @Test + public void testGetAuthTypeCodeFromKey_NotFound() throws ResidentServiceCheckedException { + String reqTypeCode = "nonExistentCode"; + + Map amrAcrMapping = new HashMap<>(); + when(utilities.getAmrAcrMapping()).thenReturn(amrAcrMapping); + + String result = utility.getAuthTypeCodefromkey(reqTypeCode); + + assertEquals(null, result); // Assuming null is returned when not found + } + + @Test + public void testGetPreferredLanguageCodeForLanguageNameBasedOnFlag_FlagEnabled() throws ResidentServiceCheckedException { + String fieldName = "fieldName"; + String preferredLang = "English"; + + when(env.getProperty(ResidentConstants.MANDATORY_LANGUAGE)).thenReturn("en"); + ReflectionTestUtils.setField(utility, "isPreferedLangFlagEnabled", true); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(createDynamicFieldResponse()); + when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName( + fieldName, "en", true)) + .thenReturn(responseWrapper); + + String result = utility.getPreferredLanguageCodeForLanguageNameBasedOnFlag(fieldName, preferredLang); + + assertEquals("en", result); + } + + @Test + public void testGetPreferredLanguageCodeForLanguageNameBasedOnFlag_FlagDisabled() { + String fieldName = "fieldName"; + String preferredLang = "English"; + + String result = utility.getPreferredLanguageCodeForLanguageNameBasedOnFlag(fieldName, preferredLang); + + assertEquals("English", result); + } + + @Test + public void testGetDataCapturedLanguages2() throws ReflectiveOperationException { + HashMap mapperIdentity = new HashMap<>(); + assertTrue(utility.getDataCapturedLanguages(mapperIdentity, new HashMap<>()).isEmpty()); + } + + private DynamicFieldConsolidateResponseDto createDynamicFieldResponse() { + DynamicFieldCodeValueDTO codeValueDTO = new DynamicFieldCodeValueDTO(); + codeValueDTO.setValue("English"); + codeValueDTO.setCode("en"); + + List values = new ArrayList<>(); + values.add(codeValueDTO); + + DynamicFieldConsolidateResponseDto responseDto = new DynamicFieldConsolidateResponseDto(); + responseDto.setValues(values); + + return responseDto; + } + + @Test(expected = ApisResourceAccessException.class) + public void testGetUserInfo() throws ApisResourceAccessException { + + Map expectedResponseMap = Map.of("user_id", 123, "username", "sampleUser"); + String usefInfoEndpointUrl = "http://localhost"; + ReflectionTestUtils.setField(utility, "usefInfoEndpointUrl", usefInfoEndpointUrl); + + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(usefInfoEndpointUrl); + UriComponents uriComponent = builder.build(false).encode(); + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add(AUTHORIZATION, BEARER_PREFIX + TOKEN); + + when(residentServiceRestClient.getApi(uriComponent.toUri(), String.class, headers)) + .thenReturn(RESPONSE_JSON); + + Map actualResponseMap = utility.getUserInfo(TOKEN); + + assertEquals(expectedResponseMap, actualResponseMap); + } + + @Test + public void testGetMappingValueWithLangCode() throws ResidentServiceCheckedException, IOException { + Map identity = new HashMap<>(); + Map language = new HashMap(); + language.put("language", "en"); + language.put("value", "Kamesh"); + identity.put("name", List.of(language)); + identity.put("gender", "value2"); + + ReflectionTestUtils.setField(utility, "residentIdentityJson", "identity"); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "http://localhost"); + JSONObject jsonObject = new JSONObject(); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("name", "kamesh"); + jsonObject1.put("gender", List.of("male")); + jsonObject.put("identity", jsonObject1); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(jsonObject); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", jsonObject.toString()); + String result = utility.getMappingValue(identity, MAPPING_NAME, "en"); + + assertEquals("Kamesh", result); + } + + @Test + public void testGetMappingValueWithLangCodeNull() throws ResidentServiceCheckedException, IOException { + Map identity = new HashMap<>(); + Map language = new HashMap(); + language.put("language", "en"); + language.put("value", "Kamesh"); + identity.put("name", List.of(language)); + identity.put("gender", "value2"); + + ReflectionTestUtils.setField(utility, "residentIdentityJson", "identity"); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "http://localhost"); + JSONObject jsonObject = new JSONObject(); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("name", "kamesh"); + jsonObject1.put("gender", List.of("male")); + jsonObject.put("identity", jsonObject1); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(jsonObject); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", jsonObject.toString()); + String result = utility.getMappingValue(identity, MAPPING_NAME, null); + + assertEquals("", result); + } + + @Test + public void testGetMappingValueWithLangCodeMapIdentity() throws ResidentServiceCheckedException, IOException { + Map identity = new HashMap<>(); + Map language = new HashMap(); + language.put("language", "en"); + language.put("value", "Kamesh"); + identity.put("name", language); + identity.put("gender", "value2"); + + ReflectionTestUtils.setField(utility, "residentIdentityJson", "identity"); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "http://localhost"); + JSONObject jsonObject = new JSONObject(); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("name", "kamesh"); + jsonObject1.put("gender", List.of("male")); + jsonObject.put("identity", jsonObject1); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(jsonObject); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", jsonObject.toString()); + String result = utility.getMappingValue(identity, MAPPING_NAME, "en"); + + assertEquals("Kamesh", result); + } + + @Test + public void testGetMappingValueWithLangCodeNullIdentity() throws ResidentServiceCheckedException, IOException { + Map identity = new HashMap<>(); + identity.put("name", null); + identity.put("gender", "value2"); + + ReflectionTestUtils.setField(utility, "residentIdentityJson", "identity"); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "http://localhost"); + JSONObject jsonObject = new JSONObject(); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("name_en", "kamesh"); + jsonObject1.put("gender", List.of("male")); + jsonObject.put("identity", jsonObject1); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(jsonObject); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", jsonObject.toString()); + String result = utility.getMappingValue(identity, MAPPING_NAME, "en"); + + assertEquals("", result); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetMappingValueError() throws ResidentServiceCheckedException, IOException { + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", null); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(null); + utility.getMappingValue(identity, MAPPING_NAME, "en"); + } + + @Test + public void testGetMappingValueWithLangCodeStringAttributeValue() throws ResidentServiceCheckedException, IOException { + Map identity = new HashMap<>(); + identity.put("name", "Kamesh"); + identity.put("gender", "value2"); + + ReflectionTestUtils.setField(utility, "residentIdentityJson", "identity"); + ReflectionTestUtils.setField(utility, "configServerFileStorageURL", "http://localhost"); + JSONObject jsonObject = new JSONObject(); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("name", "kamesh"); + jsonObject1.put("gender", List.of("male")); + jsonObject.put("identity", jsonObject1); + when(residentRestTemplate.getForObject((String) any(), (Class) any(), (Object) any())).thenReturn(jsonObject); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", jsonObject.toString()); + String result = utility.getMappingValue(identity, MAPPING_NAME); + + assertEquals("Kamesh", result); + } + + @Test(expected = Exception.class) + public void testGetCachedIdentityData() throws ApisResourceAccessException { + utility.getCachedIdentityData("1232", token, ResponseWrapper.class); + } + + @Test + public void testClearUserInfoCache() { + utility.clearUserInfoCache(token); + } + + @Test + public void testGetMappingJsonObject() throws ResidentServiceCheckedException { + JSONObject object = new JSONObject(); + object.put("name", "Kamesh"); + ReflectionTestUtils.setField(utility, "mappingJsonObject", object); + assertEquals(object, utility.getMappingJsonObject()); + } + + @Test(expected = ResidentServiceException.class) + public void testGetMappingJsonObjectNullMappingJsonObject() throws ResidentServiceCheckedException { + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", ""); + utility.getMappingJsonObject(); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testGetMappingJsonObjectInvalidMappingJsonObject() throws ResidentServiceCheckedException { + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", "K"); + utility.getMappingJsonObject(); + } + + @Test + public void testGetMappingJsonObjectValidMappingJsonObject() throws ResidentServiceCheckedException { + JSONObject object = new JSONObject(); + object.put("name", "Kamesh"); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", object.toJSONString()); + assertEquals(object, utility.getMappingJsonObject()); + } + + @Test + public void testGetDataCapturedLanguagesV2() { + Map mapperIdentity = new HashMap<>(); + Map language = new HashMap(); + language.put("language", "en"); + JsonValue jsonValue = new JsonValue(); + jsonValue.setLanguage("en"); + jsonValue.setValue("Kamesh"); + language.put("value", "name"); + mapperIdentity.put("name", language); + Map demographicIdentity = new HashMap<>(); + demographicIdentity.put("name", List.of(jsonValue)); + + Set result = null; + try { + result = utility.getDataCapturedLanguages(mapperIdentity, demographicIdentity); + } catch (ReflectiveOperationException e) { + } + + Set expectedValues = new HashSet<>(Arrays.asList("en")); + assertEquals(expectedValues, result); + } + + @Test + public void testLoadRegProcessorIdentityJson() { + ReflectionTestUtils.setField(utility, "specialCharsReplacement", "$"); + ReflectionTestUtils.invokeMethod(utility, "loadRegProcessorIdentityJson"); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testRetrieveErrorCode() throws ResidentServiceCheckedException { + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(""); + utility.retrieveErrorCode(responseWrapper, "1"); + } + + @Test + public void testGetMappingJsonWithTemplateLanguages() throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File idJson = new File(classLoader.getResource("IdentityMapping.json").getFile()); + InputStream is = new FileInputStream(idJson); + String mappingJson = IOUtils.toString(is, "UTF-8"); + ReflectionTestUtils.setField(utility, "regProcessorIdentityJson", mappingJson); + JSONObject mapperJson = JsonUtil.readValue(mappingJson, JSONObject.class); + Map mapperIdentity = (Map) mapperJson.get("identity"); + + ResponseWrapper response = new ResponseWrapper<>(); + IdRepoResponseDto idRepoResponseDto = new IdRepoResponseDto(); + idRepoResponseDto.setStatus("Activated"); + JSONObject identityJson = JsonUtil.getJSONObject(identity, "identity"); + idRepoResponseDto.setIdentity(identityJson); + response.setResponse(idRepoResponseDto); + Mockito.when(residentServiceRestClient.getApi(any(), any(), anyString(), + any(), any(Class.class))).thenReturn(response); + Set templateLanguages = new HashSet<>(); + templateLanguages.add("eng"); + Map attributes = utility.getMailingAttributes("3527812406", templateLanguages, identityJson, mapperIdentity); + assertEquals("eng", attributes.get("preferredLang")); + verify(residentRestTemplate, never()).getForObject(anyString(), any(Class.class)); + } + + @Test + public void testGetPreferredLanguageAttributeNullSet() { + Map demographicIdentity = new HashMap<>(); + demographicIdentity.put("languageAttribute", ""); + + when(env.getProperty("mosip.default.user-preferred-language-attribute")) + .thenReturn("languageAttribute"); + + Set preferredLanguages = utility.getPreferredLanguage(demographicIdentity); + assertEquals(0, preferredLanguages.size()); + } + + @Test(expected = RuntimeException.class) + public void testGetPreferredLanguageCodeForLanguageNameBasedOnFlag_FlagEnabledResidentServiceCheckedException() throws ResidentServiceCheckedException { + String fieldName = "fieldName"; + String preferredLang = "English"; + + when(env.getProperty(ResidentConstants.MANDATORY_LANGUAGE)).thenReturn("en"); + ReflectionTestUtils.setField(utility, "isPreferedLangFlagEnabled", true); + when(utilities.getDynamicFieldBasedOnLangCodeAndFieldName( + fieldName, "en", true)) + .thenThrow(new ResidentServiceCheckedException()); + + String result = utility.getPreferredLanguageCodeForLanguageNameBasedOnFlag(fieldName, preferredLang); + + assertEquals("en", result); + } + + @Test(expected = Exception.class) + public void testGetPassword() { + utility.getPassword(List.of("email")); + } + + @Test + public void testCreateEntityNotAsyncRequestType() { + assertEquals("Unknown", utility.createEntity(RequestType.GENERATE_VID).getCrBy()); + } + + @Test + public void testGetPDFHeaderLogo() { + when(env.getProperty(anyString())).thenReturn("pdf logo"); + String logoData = utility.getPDFHeaderLogo(); + assertNotNull(logoData); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/validator/DocumentValidatorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/validator/DocumentValidatorTest.java new file mode 100644 index 00000000000..0be66155720 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/validator/DocumentValidatorTest.java @@ -0,0 +1,303 @@ +package io.mosip.resident.validator; + +import static io.mosip.resident.constant.ResidentErrorCode.INVALID_INPUT; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.core.env.Environment; +import org.springframework.mock.env.MockEnvironment; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.virusscanner.exception.VirusScannerException; +import io.mosip.kernel.core.virusscanner.spi.VirusScanner; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.dto.DocumentRequestDTO; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.service.ProxyMasterdataService; +import reactor.util.function.Tuples; + +/** + * @author Manoj SP + * + */ +@RunWith(MockitoJUnitRunner.class) +@ContextConfiguration +public class DocumentValidatorTest { + + @InjectMocks + private DocumentValidator validator; + + @Mock + private RequestValidator requestValidator; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private VirusScanner virusScanner; + + private MockEnvironment env = new MockEnvironment(); + + @Mock + private Environment environment; + + @Before + public void init() throws Exception { + ReflectionTestUtils.setField(validator, "env", env); + ReflectionTestUtils.setField(validator, "transactionIdRegex", "^[0-9]{10}$"); + ReflectionTestUtils.setField(validator, "documentIdRegex", "^[A-Za-z0-9-]{20,}$"); + when(proxyMasterdataService.getValidDocCatAndTypeList(any())) + .thenReturn(Tuples.of(List.of("poi", "poa"), Map.of("poi", List.of("cob"), "poa", List.of("coa")))); + } + + @Test + public void testValidateRequestSuccess() throws ResidentServiceCheckedException { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("poi"); + request.setDocTypCode("cob"); + request.setLangCode("c"); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } + + @Test + public void testNullDocCatCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode(null); + request.setDocTypCode("poi12"); + request.setLangCode("eng"); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docCatCode"), e.getMessage()); + } + } + + @Test + public void testBlankDocCatCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode(""); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docCatCode"), e.getMessage()); } + } + + @Test + public void testInvalidDocCatCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("pop"); + request.setDocTypCode("cor"); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docCatCode"), e.getMessage()); + } + } + + @Test + public void testNullDocTypCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("a"); + request.setDocTypCode(null); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docTypCode"), e.getMessage()); + } + } + + @Test + public void testBlankDocTypCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("a"); + request.setDocTypCode(""); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docTypCode"), e.getMessage()); + } + } + + @Test + public void testInvalidDocTypCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("poa"); + request.setDocTypCode("cor"); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "docTypCode"), e.getMessage()); + } + } + + @Test + public void testNullLangCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("poa"); + request.setDocTypCode("coa"); + request.setLangCode(null); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (InvalidInputException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "langCode"), e.getMessage()); + } + } + + @Test + public void testBlankLangCode() throws ResidentServiceCheckedException { + try { + DocumentRequestDTO request = new DocumentRequestDTO(); + request.setDocCatCode("poi"); + request.setDocTypCode("cob"); + request.setLangCode(" "); + validator.validateRequest("1234567890", request.getDocCatCode(),request.getDocTypCode(),request.getLangCode()); + } catch (ResidentServiceException e) { + assertEquals(String.format(INVALID_INPUT.getErrorCode() + " --> " + INVALID_INPUT.getErrorMessage() + "langCode"), e.getMessage()); + } + } + + @Test + public void testScanForVirusesSuccess() { + env.setProperty(ResidentConstants.VIRUS_SCANNER_ENABLED, "true"); + when(virusScanner.scanFile(any(InputStream.class))).thenReturn(true); + validator.scanForViruses(new MockMultipartFile("name", "a".getBytes())); + } + + @Test + public void testScanForVirusesDisabledSuccess() { + env.setProperty(ResidentConstants.VIRUS_SCANNER_ENABLED, "false"); + validator.scanForViruses(new MockMultipartFile("name", "a".getBytes())); + } + + @Test(expected = ResidentServiceException.class) + public void testScanForVirusesFailed() { + env.setProperty(ResidentConstants.VIRUS_SCANNER_ENABLED, "true"); + when(virusScanner.scanFile(any(InputStream.class))).thenThrow(new VirusScannerException()); + validator.scanForViruses(new MockMultipartFile("name", "a".getBytes())); + } + + @Test + public void testSupportsSuccess() { + assertTrue(validator.supports(RequestWrapper.class)); + } + + @Test + public void testSupportsFailed() { + assertFalse(validator.supports(MockMultipartFile.class)); + } + + @Test + public void testValidateGetDocumentByDocumentIdInputSuccess() { + String transactionId = "1234567891"; + validator.validateTransactionIdForDocument(transactionId); + } + + @Test(expected = InvalidInputException.class) + public void testValidateGetDocumentByDocumentIdFailed() { + String transactionId = "123a"; + validator.validateTransactionIdForDocument(transactionId); + } + + @Test(expected = InvalidInputException.class) + public void testValidateGetDocumentByDocumentIdNull() { + validator.validateTransactionIdForDocument(null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateGetDocumentByDocumentIdEmpty() { + String transactionId = ""; + validator.validateTransactionIdForDocument(transactionId); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDocumentIdAndTransactionId() { + validator.validateDocumentIdAndTransactionId("d", "1a"); + } + + @Test + public void testValidateDocumentIdAndTransactionIDSuccess(){ + validator.validateDocumentIdAndTransactionId(UUID.randomUUID().toString(), "1232323232"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDocumentId() { + validator.validateDocumentId(null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDocumentIdEmpty() { + validator.validateDocumentId(""); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDocumentIdLessCharacterDocumentId() { + validator.validateDocumentId("12"); + } + + @Test + public void testValidateFileName() { + // Set up test data + String allowedFileType = "pdf,doc,docx"; + + int maxFileUploadSize = 1024 * 1024 * 10; // 10MB + ReflectionTestUtils.setField(validator, "maxFileUploadSize", maxFileUploadSize); + env.setProperty(ResidentConstants.ALLOWED_FILE_TYPE, allowedFileType); + // Create mock file + byte[] fileContent = "test file content".getBytes(); + MockMultipartFile mockFile = new MockMultipartFile("file", "test.pdf", "application/pdf", fileContent); + + // Call method under test + validator.validateFileName(mockFile); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateFileNameWithInvalidFileType() { + // Set up test data + String allowedFileType = "pdf,doc,docx"; + + int maxFileUploadSize = 1024 * 1024 * 10; // 10MB + ReflectionTestUtils.setField(validator, "maxFileUploadSize", maxFileUploadSize); + env.setProperty(ResidentConstants.ALLOWED_FILE_TYPE, allowedFileType); + // Create mock file + byte[] fileContent = "test file content".getBytes(); + MockMultipartFile mockFile = new MockMultipartFile("file", "test.xslx", "application/pdf", fileContent); + + // Call method under test + validator.validateFileName(mockFile); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateFileNameWithMaxFileSize() { + // Set up test data + String allowedFileType = "pdf,doc,docx"; + + int maxFileUploadSize = 0; + ReflectionTestUtils.setField(validator, "maxFileUploadSize", maxFileUploadSize); + env.setProperty(ResidentConstants.ALLOWED_FILE_TYPE, allowedFileType); + // Create mock file + byte[] fileContent = "test file content".getBytes(); + MockMultipartFile mockFile = new MockMultipartFile("file", "test.pdf", "application/pdf", fileContent); + + // Call method under test + validator.validateFileName(mockFile); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestHandlerRequestValidatorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestHandlerRequestValidatorTest.java new file mode 100644 index 00000000000..092eb942eb2 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestHandlerRequestValidatorTest.java @@ -0,0 +1,529 @@ +package io.mosip.resident.validator; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import io.mosip.resident.dto.IdResponseDTO1; +import io.mosip.resident.dto.ResponseDTO1; +import io.mosip.resident.util.Utility; +import org.assertj.core.util.Lists; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.exception.BaseCheckedException; +import io.mosip.kernel.core.exception.ServiceError; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idvalidator.exception.InvalidIDException; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.dto.LogDescription; +import io.mosip.resident.dto.MachineDto; +import io.mosip.resident.dto.MachineResponseDto; +import io.mosip.resident.dto.RegistrationCenterDto; +import io.mosip.resident.dto.RegistrationCenterResponseDto; +import io.mosip.resident.dto.RegistrationType; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.IdRepoAppException; +import io.mosip.resident.exception.RequestHandlerValidationException; +import io.mosip.resident.exception.VidCreationException; +import io.mosip.resident.util.ResidentServiceRestClient; +import io.mosip.resident.util.Utilities; + +@RunWith(SpringRunner.class) +public class RequestHandlerRequestValidatorTest { + + @InjectMocks + private RequestHandlerRequestValidator requestHandlerRequestValidator; + + /** The rest client service. */ + @Mock + private ResidentServiceRestClient restClientService; + + /** The mapper. */ + @Mock + private ObjectMapper mapper = new ObjectMapper(); + + @Mock + private UinValidator uinValidatorImpl; + + /** The vid validator impl. */ + @Mock + private VidValidator vidValidatorImpl; + + /** The utilities. */ + @Mock + private Utilities utilities; + + @Mock + private Environment env; + + @Mock + private Utility utility; + + private static final String ID = "110011"; + private IdResponseDTO1 idResponseDto; + private ResponseDTO1 responseDTO1; + + @Before + public void setup() throws ApisResourceAccessException, IOException { + Mockito.when(env.getProperty("mosip.mandatory-languages")).thenReturn("eng"); + Mockito.when(restClientService.getApi(any(), any(), anyString(), anyString(), any(Class.class))) + .thenReturn(new ResponseWrapper<>()); + Mockito.when(mapper.writeValueAsString(any())).thenReturn("String"); + idResponseDto = new IdResponseDTO1(); + responseDTO1 = new ResponseDTO1(); + responseDTO1.setStatus("ACTIVATED"); + idResponseDto.setResponse(responseDTO1); + Mockito.when(utility.getCenterDetails(Mockito.anyString(), Mockito.anyString())).thenReturn(new ResponseWrapper<>()); + Mockito.when(utilities.getLanguageCode()).thenReturn("eng"); + } + + @Test(expected = RequestHandlerValidationException.class) + public void testValidateWithRequestHandlerValidationException() throws RequestHandlerValidationException { + requestHandlerRequestValidator.validate(ID); + } + + @Test(expected = RequestHandlerValidationException.class) + public void testValidateNullId() throws RequestHandlerValidationException { + requestHandlerRequestValidator.validate(null); + } + + @Test + public void testIsValidCenter() throws BaseCheckedException, IOException { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + RegistrationCenterResponseDto rcpdto = new RegistrationCenterResponseDto(); + rcpdto.setRegistrationCenters(Lists.newArrayList(registrationCenterDto)); + + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(rcpdto); + + boolean result = requestHandlerRequestValidator.isValidCenter(ID); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCenterNestedElse() throws BaseCheckedException, IOException { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + ServiceError error = new ServiceError(); + error.setErrorCode("invalid-101"); + error.setMessage("invalid center"); + List errorList = new ArrayList(); + errorList.add(error); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setErrors(errorList); + RegistrationCenterResponseDto rcpdto = new RegistrationCenterResponseDto(); + rcpdto.setRegistrationCenters(Lists.newArrayList(registrationCenterDto)); + Mockito.when(utility.getCenterDetails(Mockito.anyString(), Mockito.anyString())).thenReturn(wrapper); + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(rcpdto); + + requestHandlerRequestValidator.isValidCenter(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCenterElse() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidCenter(""); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCenterElse2() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidCenter(null); + } + + @Test + public void testIsValidCenterWithApisResourceAccessException() throws BaseCheckedException, IOException { + RegistrationCenterDto registrationCenterDto = new RegistrationCenterDto(); + ServiceError error = new ServiceError(); + error.setErrorCode("invalid-101"); + error.setMessage("invalid center"); + List errorList = new ArrayList(); + errorList.add(error); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setErrors(errorList); + RegistrationCenterResponseDto rcpdto = new RegistrationCenterResponseDto(); + rcpdto.setRegistrationCenters(Lists.newArrayList(registrationCenterDto)); + Mockito.when(utility.getCenterDetails(Mockito.anyString(), Mockito.anyString())).thenThrow(new ApisResourceAccessException("error")); + + requestHandlerRequestValidator.isValidCenter(ID); + } + + @Test + public void testIsValidMachine() throws BaseCheckedException, IOException { + MachineDto registrationCenterDto = new MachineDto(); + MachineResponseDto machinedto = new MachineResponseDto(); + machinedto.setMachines(Lists.newArrayList(registrationCenterDto)); + + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(machinedto); + + boolean result = requestHandlerRequestValidator.isValidMachine(ID); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidMachineNestedElse() throws BaseCheckedException, IOException { + MachineDto registrationCenterDto = new MachineDto(); + ServiceError error = new ServiceError(); + error.setErrorCode("invalid-101"); + error.setMessage("invalid center"); + List errorList = new ArrayList(); + errorList.add(error); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setErrors(errorList); + MachineResponseDto machinedto = new MachineResponseDto(); + machinedto.setMachines(Lists.newArrayList(registrationCenterDto)); + + when(restClientService.getApi(any(), any(), anyString(), anyString(), any())).thenReturn(wrapper); + Mockito.when(mapper.readValue(anyString(), any(Class.class))).thenReturn(machinedto); + + requestHandlerRequestValidator.isValidMachine(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidMachineElse() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidMachine(null); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidMachineElse2() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidMachine(""); + } + + @Test + public void testIsValidMachineWithApisResourceAccessException() throws BaseCheckedException, IOException { + MachineDto registrationCenterDto = new MachineDto(); + ServiceError error = new ServiceError(); + error.setErrorCode("invalid-101"); + error.setMessage("invalid center"); + List errorList = new ArrayList(); + errorList.add(error); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setErrors(errorList); + MachineResponseDto machinedto = new MachineResponseDto(); + machinedto.setMachines(Lists.newArrayList(registrationCenterDto)); + + when(restClientService.getApi(any(), any(), anyString(), anyString(), any())) + .thenThrow(new ApisResourceAccessException("error")); + requestHandlerRequestValidator.isValidMachine(ID); + } + + @Test + public void testIsValidUin() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenReturn(jsonObject); + + boolean result = requestHandlerRequestValidator.isValidUin("1234"); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinElse1() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJson(anyString())).thenReturn(null); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinElse2() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + when(uinValidatorImpl.validateId(anyString())).thenReturn(false); + when(utilities.retrieveIdrepoJson(anyString())).thenReturn(jsonObject); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinWithInvalidIDException() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())) + .thenThrow(new InvalidIDException("errorcode", "message")); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinWithIdRepoAppException() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())) + .thenThrow(new IdRepoAppException("errorcode", "message")); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinWithNumberFormatException() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new NumberFormatException("errorcode")); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinWithApisResourceAccessException() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new ApisResourceAccessException("errorcode")); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidUinWithIOException() throws BaseCheckedException, IOException { + JSONObject jsonObject = new JSONObject(); + Mockito.when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + Mockito.when(utilities.retrieveIdrepoJson(anyString())).thenThrow(new IOException("errorcode")); + + requestHandlerRequestValidator.isValidUin("1234"); + } + + @Test + public void testIsValidRePrintRegistrationType() throws BaseCheckedException, IOException { + boolean result = requestHandlerRequestValidator + .isValidRePrintRegistrationType(RegistrationType.RES_REPRINT.name()); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRePrintRegistrationTypeElse() throws BaseCheckedException { + requestHandlerRequestValidator.isValidRePrintRegistrationType("LOST"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRePrintRegistrationTypeElse2() throws BaseCheckedException { + requestHandlerRequestValidator.isValidRePrintRegistrationType(null); + } + + @Test + public void testIsValidRegistrationTypeAndUinNestedNestedIf11() throws BaseCheckedException, IOException { + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenReturn("ACTIVATED"); + JSONObject idObject = new JSONObject(); + when(utilities.retrieveIdrepoJson(anyString())).thenReturn(idObject); + boolean result = requestHandlerRequestValidator + .isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.name(), "1234", idResponseDto); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinNestedNestedIf12() throws BaseCheckedException, IOException { + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenReturn("ACTIVATED"); + when(utilities.retrieveIdrepoJson(anyString())).thenReturn(null); + responseDTO1.setStatus("FAILED"); + idResponseDto.setResponse(responseDTO1); + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.name(), "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinNestedNestedIf13() throws BaseCheckedException, IOException { + responseDTO1.setStatus("FAILED"); + idResponseDto.setResponse(responseDTO1); + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenReturn("any status"); + when(utilities.retrieveIdrepoJson(anyString())).thenReturn(new JSONObject()); + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.name(), "1234", idResponseDto); + } + + @Test + public void testIsValidRegistrationTypeAndUinNestedNestedIf21() throws BaseCheckedException, IOException { + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenReturn("ACTIVATED"); + boolean result = requestHandlerRequestValidator + .isValidRegistrationTypeAndUin(RegistrationType.DEACTIVATED.name(), "1234", idResponseDto); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinNestedNestedElse21() throws BaseCheckedException, IOException { + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenReturn("ACTIVATED"); + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.ACTIVATED.name(), "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinNestedElse() throws BaseCheckedException, IOException { + when(uinValidatorImpl.validateId(anyString())).thenReturn(false); + + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.ACTIVATED.name(), "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinElse1() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(null, "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinElse2() throws BaseCheckedException, IOException { + requestHandlerRequestValidator.isValidRegistrationTypeAndUin("any registration", "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinWithInvalidIDException() throws BaseCheckedException, IOException { + responseDTO1.setStatus("FAILED"); + idResponseDto.setResponse(responseDTO1); + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenThrow(new InvalidIDException("errorcode", "message")); + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.name(), "1234", idResponseDto); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidRegistrationTypeAndUinWithNumberFormatException() throws BaseCheckedException, IOException { + responseDTO1.setStatus("FAILED"); + idResponseDto.setResponse(responseDTO1); + when(uinValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.retrieveIdrepoJsonStatus(anyString())).thenThrow(new NumberFormatException("message")); + requestHandlerRequestValidator.isValidRegistrationTypeAndUin(RegistrationType.RES_UPDATE.name(), "1234", idResponseDto); + } + + @Test + public void testIsValidVid() throws BaseCheckedException, IOException { + String str = "vid"; + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenReturn(str); + boolean result = requestHandlerRequestValidator.isValidVid(ID); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidElse() throws BaseCheckedException, IOException { + String str = "vid"; + when(vidValidatorImpl.validateId(anyString())).thenReturn(false); + when(utilities.getUinByVid(anyString())).thenReturn(str); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidElse2() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenReturn(null); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidWithInvalidIDException() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenThrow(new InvalidIDException("errorcode", "message")); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidWithIdRepoAppException() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenThrow(new IdRepoAppException("errorcode", "message")); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidWithNumberFormatException() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenThrow(new NumberFormatException("message")); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidWithApisResourceAccessException() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenThrow(new ApisResourceAccessException("message")); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidVidWithVidCreationException() throws BaseCheckedException, IOException { + when(vidValidatorImpl.validateId(anyString())).thenReturn(true); + when(utilities.getUinByVid(anyString())).thenThrow(new VidCreationException("message")); + requestHandlerRequestValidator.isValidVid(ID); + } + + @Test + public void testIsValidIdType() throws Exception { + boolean result = requestHandlerRequestValidator.isValidIdType(IdType.UIN.name()); + assertTrue(result); + } + + @Test + public void testIsValidIdType2() throws BaseCheckedException { + boolean result = requestHandlerRequestValidator.isValidIdType(IdType.VID.name()); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidIdTypeElse() throws BaseCheckedException { + requestHandlerRequestValidator.isValidIdType(null); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidIdTypeElse2() throws BaseCheckedException { + requestHandlerRequestValidator.isValidIdType(""); + } + + @Test + public void testIsValidCardType() throws BaseCheckedException, IOException { + boolean result = requestHandlerRequestValidator.isValidCardType(CardType.MASKED_UIN.name()); + assertTrue(result); + } + + @Test + public void testIsValidCardType2() throws BaseCheckedException, IOException { + boolean result = requestHandlerRequestValidator.isValidCardType(CardType.UIN.name()); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCardTypeElse() throws BaseCheckedException { + requestHandlerRequestValidator.isValidCardType("voter-id"); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCardTypeElse2() throws BaseCheckedException { + requestHandlerRequestValidator.isValidCardType(""); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidCardTypeElse3() throws BaseCheckedException { + requestHandlerRequestValidator.isValidCardType(null); + } + + @Test + public void testIsValidContact() throws BaseCheckedException, IOException { + String EMAIL = "Email"; + boolean result = requestHandlerRequestValidator.isValidContactType(EMAIL, new LogDescription()); + assertTrue(result); + } + + @Test + public void testIsValidContact2() throws BaseCheckedException, IOException { + String PHONE = "Phone"; + boolean result = requestHandlerRequestValidator.isValidContactType(PHONE, new LogDescription()); + assertTrue(result); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidContactElse() throws BaseCheckedException { + requestHandlerRequestValidator.isValidContactType("whatsapp", new LogDescription()); + } + + @Test(expected = BaseCheckedException.class) + public void testIsValidContactElse2() throws BaseCheckedException { + requestHandlerRequestValidator.isValidContactType(null, new LogDescription()); + } +} diff --git a/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestValidatorTest.java b/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestValidatorTest.java new file mode 100644 index 00000000000..f2738a80668 --- /dev/null +++ b/resident/resident-service/src/test/java/io/mosip/resident/validator/RequestValidatorTest.java @@ -0,0 +1,3191 @@ +package io.mosip.resident.validator; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import io.mosip.resident.service.ProxyIdRepoService; +import org.joda.time.DateTime; +import org.json.simple.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.core.idvalidator.exception.InvalidIDException; +import io.mosip.kernel.core.idvalidator.spi.RidValidator; +import io.mosip.kernel.core.idvalidator.spi.UinValidator; +import io.mosip.kernel.core.idvalidator.spi.VidValidator; +import io.mosip.kernel.core.util.DateUtils; +import io.mosip.preregistration.application.dto.TransliterationRequestDTO; +import io.mosip.preregistration.core.common.dto.MainRequestDTO; +import io.mosip.resident.constant.AuthTypeStatus; +import io.mosip.resident.constant.CardType; +import io.mosip.resident.constant.IdType; +import io.mosip.resident.constant.RequestIdType; +import io.mosip.resident.constant.ResidentConstants; +import io.mosip.resident.constant.ResidentErrorCode; +import io.mosip.resident.constant.TemplateVariablesConstants; +import io.mosip.resident.dto.AidStatusRequestDTO; +import io.mosip.resident.dto.AuthHistoryRequestDTO; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDto; +import io.mosip.resident.dto.AuthLockOrUnLockRequestDtoV2; +import io.mosip.resident.dto.AuthTypeStatusDtoV2; +import io.mosip.resident.dto.AuthUnLockRequestDTO; +import io.mosip.resident.dto.BaseVidRevokeRequestDTO; +import io.mosip.resident.dto.DownloadCardRequestDTO; +import io.mosip.resident.dto.DownloadPersonalizedCardDto; +import io.mosip.resident.dto.EuinRequestDTO; +import io.mosip.resident.dto.GrievanceRequestDTO; +import io.mosip.resident.dto.IdentityDTO; +import io.mosip.resident.dto.IndividualIdOtpRequestDTO; +import io.mosip.resident.dto.OtpRequestDTOV2; +import io.mosip.resident.dto.OtpRequestDTOV3; +import io.mosip.resident.dto.RequestDTO; +import io.mosip.resident.dto.RequestWrapper; +import io.mosip.resident.dto.ResidentCredentialRequestDto; +import io.mosip.resident.dto.ResidentReprintRequestDto; +import io.mosip.resident.dto.ResidentUpdateRequestDto; +import io.mosip.resident.dto.ResidentVidRequestDto; +import io.mosip.resident.dto.ResidentVidRequestDtoV2; +import io.mosip.resident.dto.SharableAttributesDTO; +import io.mosip.resident.dto.ShareCredentialRequestDto; +import io.mosip.resident.dto.VidRequestDto; +import io.mosip.resident.dto.VidRequestDtoV2; +import io.mosip.resident.dto.VidRevokeRequestDTO; +import io.mosip.resident.dto.VidRevokeRequestDTOV2; +import io.mosip.resident.entity.ResidentTransactionEntity; +import io.mosip.resident.exception.ApisResourceAccessException; +import io.mosip.resident.exception.BaseResidentUncheckedExceptionWithMetadata; +import io.mosip.resident.exception.EidNotBelongToSessionException; +import io.mosip.resident.exception.InvalidInputException; +import io.mosip.resident.exception.ResidentServiceCheckedException; +import io.mosip.resident.exception.ResidentServiceException; +import io.mosip.resident.repository.ResidentTransactionRepository; +import io.mosip.resident.service.ProxyMasterdataService; +import io.mosip.resident.service.ProxyPartnerManagementService; +import io.mosip.resident.service.ResidentService; +import io.mosip.resident.service.impl.IdentityServiceImpl; +import io.mosip.resident.service.impl.ResidentConfigServiceImpl; +import io.mosip.resident.service.impl.ResidentServiceImpl; +import io.mosip.resident.util.AuditUtil; +import io.mosip.resident.util.Utilities; + +@RunWith(SpringRunner.class) +public class RequestValidatorTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Mock + private UinValidator uinValidator; + + @Mock + private VidValidator vidValidator; + + @Mock + private RidValidator ridValidator; + + @InjectMocks + private RequestValidator requestValidator; + + @Mock + private AuditUtil audit; + + @Mock + private Utilities utilities; + + @Mock + private Environment environment; + + @Mock + private ResidentConfigServiceImpl residentConfigService; + + @Mock + private ResidentTransactionRepository residentTransactionRepository; + + @Mock + private ProxyMasterdataService proxyMasterdataService; + + @Mock + private IdentityServiceImpl identityService; + + @Mock + private ProxyPartnerManagementService proxyPartnerManagementService; + + @Mock + private ObjectMapper objectMapper; + + @Mock + private ProxyIdRepoService idRepoService; + + String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + + @InjectMocks + private ResidentService residentService = new ResidentServiceImpl(); + + private Object schema; + private String schemaJson; + + @Before + public void setup() { + schema = "{\\\"$schema\\\":\\\"http:\\/\\/json-schema.org\\/draft-07\\/schema#\\\",\\\"description\\\":\\\"MOSIP Sample identity\\\",\\\"additionalProperties\\\":false,\\\"title\\\":\\\"MOSIP identity\\\",\\\"type\\\":\\\"object\\\",\\\"definitions\\\":{\\\"simpleType\\\":{\\\"uniqueItems\\\":true,\\\"additionalItems\\\":false,\\\"type\\\":\\\"array\\\",\\\"items\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"language\\\",\\\"value\\\"],\\\"properties\\\":{\\\"language\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"documentType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"type\\\":{\\\"type\\\":\\\"string\\\"},\\\"value\\\":{\\\"type\\\":\\\"string\\\"},\\\"refNumber\\\":{\\\"type\\\":[\\\"string\\\",\\\"null\\\"]}}},\\\"biometricsType\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"properties\\\":{\\\"format\\\":{\\\"type\\\":\\\"string\\\"},\\\"version\\\":{\\\"type\\\":\\\"number\\\",\\\"minimum\\\":0},\\\"value\\\":{\\\"type\\\":\\\"string\\\"}}}},\\\"properties\\\":{\\\"identity\\\":{\\\"additionalProperties\\\":false,\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"IDSchemaVersion\\\",\\\"fullName\\\",\\\"dateOfBirth\\\",\\\"gender\\\",\\\"addressLine1\\\",\\\"addressLine2\\\",\\\"addressLine3\\\",\\\"region\\\",\\\"province\\\",\\\"city\\\",\\\"zone\\\",\\\"postalCode\\\",\\\"phone\\\",\\\"email\\\",\\\"proofOfIdentity\\\",\\\"individualBiometrics\\\"],\\\"properties\\\":{\\\"proofOfAddress\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"gender\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"city\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"postalCode\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[(?i)A-Z0-9]{5}$|^NA$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfException-1\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"referenceIdentityNumber\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^([0-9]{10,30})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"kyc\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"province\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"zone\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfDateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"addressLine1\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine2\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"residenceStatus\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"kyc\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"addressLine3\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"email\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[A-Za-z0-9_\\\\\\\\-]+(\\\\\\\\.[A-Za-z0-9_]+)*@[A-Za-z0-9_-]+(\\\\\\\\.[A-Za-z0-9_]+)*(\\\\\\\\.[a-zA-Z]{2,})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerRID\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"fullName\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{3,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"dateOfBirth\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(1869|18[7-9][0-9]|19[0-9][0-9]|20[0-9][0-9])\\/([0][1-9]|1[0-2])\\/([0][1-9]|[1-2][0-9]|3[01])$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"individualAuthBiometrics\\\":{\\\"bioAttributes\\\":[\\\"leftEye\\\",\\\"rightEye\\\",\\\"rightIndex\\\",\\\"rightLittle\\\",\\\"rightRing\\\",\\\"rightMiddle\\\",\\\"leftIndex\\\",\\\"leftLittle\\\",\\\"leftRing\\\",\\\"leftMiddle\\\",\\\"leftThumb\\\",\\\"rightThumb\\\",\\\"face\\\"],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/biometricsType\\\"},\\\"introducerUIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"proofOfIdentity\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"IDSchemaVersion\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"number\\\",\\\"fieldType\\\":\\\"default\\\",\\\"minimum\\\":0},\\\"proofOfException\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"phone\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^[+]*([0-9]{1})([0-9]{9})$\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"introducerName\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"evidence\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"},\\\"proofOfRelationship\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/documentType\\\"},\\\"UIN\\\":{\\\"bioAttributes\\\":[],\\\"fieldCategory\\\":\\\"none\\\",\\\"format\\\":\\\"none\\\",\\\"type\\\":\\\"string\\\",\\\"fieldType\\\":\\\"default\\\"},\\\"region\\\":{\\\"bioAttributes\\\":[],\\\"validators\\\":[{\\\"validator\\\":\\\"^(?=.{0,50}$).*\\\",\\\"arguments\\\":[],\\\"type\\\":\\\"regex\\\"}],\\\"fieldCategory\\\":\\\"pvt\\\",\\\"format\\\":\\\"none\\\",\\\"fieldType\\\":\\\"default\\\",\\\"$ref\\\":\\\"#\\/definitions\\/simpleType\\\"}}}}}"; + schemaJson = (String) schema; + Map map = new HashMap(); + map.put(RequestIdType.RE_PRINT_ID, "mosip.resident.print"); + map.put(RequestIdType.AUTH_LOCK_ID, "mosip.resident.authlock"); + map.put(RequestIdType.AUTH_UNLOCK_ID, "mosip.resident.authunlock"); + map.put(RequestIdType.E_UIN_ID, "mosip.resident.euin"); + map.put(RequestIdType.AUTH_HISTORY_ID, "mosip.resident.authhistory"); + map.put(RequestIdType.RES_UPDATE, "mosip.resident.updateuin"); + map.put(RequestIdType.CHECK_STATUS, "mosip.resident.checkstatus"); + map.put(RequestIdType.AUTH_LOCK_UNLOCK, "mosip.resident.auth.lock.unlock"); + map.put(RequestIdType.SHARE_CREDENTIAL, "mosip.resident.share.credential"); + ReflectionTestUtils.setField(requestValidator, "checkStatusID", "mosip.resident.checkstatus"); + ReflectionTestUtils.setField(requestValidator, "authLockId", "mosip.resident.authlock"); + ReflectionTestUtils.setField(requestValidator, "euinId", "mosip.resident.euin"); + ReflectionTestUtils.setField(requestValidator, "authHstoryId", "mosip.resident.authhistory"); + ReflectionTestUtils.setField(requestValidator, "uinUpdateId", "mosip.resident.updateuin"); + ReflectionTestUtils.setField(requestValidator, "allowedAuthTypes", "bio-FIR,bio-IIR"); + ReflectionTestUtils.setField(requestValidator, "version", "v1"); + ReflectionTestUtils.setField(requestValidator, "map", map); + ReflectionTestUtils.setField(requestValidator, "allowedAuthTypes", "otp,bio-FIR,bio-IIR,bio-FACE"); + ReflectionTestUtils.setField(residentService, "authTypes", "otp,bio-FIR,bio-IIR,bio-FACE"); + ReflectionTestUtils.setField(requestValidator, "mandatoryLanguages", "eng"); + ReflectionTestUtils.setField(requestValidator, "optionalLanguages", "ara"); + ReflectionTestUtils.setField(requestValidator, "reqResVersion", "1.0"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "1.0"); + ReflectionTestUtils.setField(requestValidator, "vidLength", 16); + ReflectionTestUtils.setField(requestValidator, "otpLength", 6); + ReflectionTestUtils.setField(requestValidator, "searchTextLength", 16); + ReflectionTestUtils.setField(requestValidator, "emailCharsLimit", 128); + ReflectionTestUtils.setField(requestValidator, "phoneCharsLimit", 64); + ReflectionTestUtils.setField(requestValidator, "messageCharsLimit", 1024); + ReflectionTestUtils.setField(requestValidator, "purposeCharsLimit", 1024); + ReflectionTestUtils.setField(requestValidator, "messageAllowedSpecialCharRegex", "[A-Za-z0-9 .,-]+"); + ReflectionTestUtils.setField(requestValidator, "purposeAllowedSpecialCharRegex", "[A-Za-z0-9 .,-]+"); + ReflectionTestUtils.setField(requestValidator, "idAllowedSpecialCharRegex", "[A-Za-z0-9 -]+"); + ReflectionTestUtils.setField(requestValidator, "numericDataRegex", "^[0-9]+$"); + ReflectionTestUtils.setField(requestValidator, "transactionIdRegex", "^[0-9]{10}$"); + ReflectionTestUtils.setField(requestValidator, "eventIdRegex", "^[0-9]{16}$"); + Mockito.when(uinValidator.validateId(Mockito.anyString())).thenReturn(true); + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + Mockito.when(ridValidator.validateId(Mockito.anyString())).thenReturn(true); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("property"); + } + + @Test(expected = InvalidInputException.class) + public void testValidId() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authLockRequestDto); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidUnlockId() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authLockRequestDto); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.UNLOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValideuinId() throws Exception { + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString()); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidAuthHistoryId() throws Exception { + AuthHistoryRequestDTO authHistoryRequestDTO = new AuthHistoryRequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authHistoryRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authlock"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidVersion() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidAuthHistoryVersion() throws Exception { + AuthHistoryRequestDTO authHistoryRequestDTO = new AuthHistoryRequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authHistoryRequestDTO); + requestWrapper.setVersion("v2"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValideuinVersion() throws Exception { + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v2"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidRequest() throws Exception { + + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(null); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidAuthHistoryRequest() throws Exception { + + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestWrapper.setRequest(null); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValideuinRequest() throws Exception { + + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestWrapper.setRequest(null); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidIndividualType() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidIndividualId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.any())).thenReturn(false); + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setIndividualId("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test + public void testValidateAuthLockOrUnlockRequestSuccess() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setIndividualId("12345"); + authLockRequestDto.setOtp("12345"); + List authTypes = new ArrayList<>(); + authTypes.add("bio-FIR"); + authLockRequestDto.setAuthType(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + } + + @Test + public void testValidateAuthLockOrUnlockRequestSuccessForUnlock() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setIndividualId("12345"); + authLockRequestDto.setOtp("12345"); + List authTypes = new ArrayList<>(); + authTypes.add("bio-FIR"); + authLockRequestDto.setAuthType(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.UNLOCK); + } + + @Test(expected = InvalidInputException.class) + public void testeuinValidIndividualType() throws Exception { + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.RID.name()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidIndividualType() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidOtp() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setIndividualId("12344567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidAuthTypes() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setOtp("1232354"); + authLockRequestDto.setIndividualId("12344567"); + List authTypes = new ArrayList(); + authTypes.add("bio-FMR"); + authLockRequestDto.setAuthType(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidEmptyAuthTypes() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setTransactionID("12345"); + authLockRequestDto.setOtp("1232354"); + authLockRequestDto.setIndividualId("12344567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidPageFetch() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageStart("1"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidPageStart() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch("1"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidIndividualId() throws Exception { + Mockito.when(uinValidator.validateId(Mockito.anyString())).thenReturn(false); + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch("1"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidpageFetch() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch("1Q"); + authRequestDTO.setPageStart("1"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidpageStart() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch("1"); + authRequestDTO.setPageStart("1Q"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidpageStartPageFetch() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch(" "); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + authRequestDTO.setPageStart(" "); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidPageStartnullPageFetch() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + authRequestDTO.setPageStart(" "); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidnullPageStartPageFetch() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch(" "); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryinValidpageStartPageFetch() throws Exception { + + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("123"); + authRequestDTO.setPageFetch("-10"); + authRequestDTO.setPageStart("-11"); + authRequestDTO.setOtp("12345"); + authRequestDTO.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testeuinValidIndividualId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.VID.name()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test + public void testValidateRequest() { + ResidentReprintRequestDto request = new ResidentReprintRequestDto(); + request.setIndividualId("3542102"); + request.setIndividualIdType(IdType.UIN.name()); + request.setOtp("1234"); + request.setTransactionID("9876543210"); + RequestWrapper reqWrapper = new RequestWrapper<>(); + reqWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + reqWrapper.setRequest(request); + reqWrapper.setId("mosip.resident.print"); + reqWrapper.setVersion("v1"); + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + + } + + @Test(expected = InvalidInputException.class) + public void testvalidateRequestInValidId() { + + RequestWrapper reqWrapper = new RequestWrapper<>(); + reqWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + + reqWrapper.setId("mosip.resident.print1"); + + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + + reqWrapper.setVersion("v1"); + + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + + reqWrapper.setId("mosip.resident.print"); + reqWrapper.setVersion("v2"); + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + + } + + @Test + public void testInvalidDateTime() { + boolean result = false; + ResidentReprintRequestDto request = new ResidentReprintRequestDto(); + RequestWrapper reqWrapper = new RequestWrapper<>(); + reqWrapper.setRequest(request); + reqWrapper.setId("mosip.resident.print"); + reqWrapper.setVersion("v1"); + try { + requestValidator.validateRequest(reqWrapper, RequestIdType.RE_PRINT_ID); + } catch (InvalidInputException e) { + assertTrue(e.getMessage().contains("Invalid Input Parameter- requesttime")); + result = true; + } + if (!result) + fail(); + } + + @Test(expected = InvalidInputException.class) + public void testeuinValidCardType() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.VID.name()); + euinRequestDTO.setIndividualId("1234567"); + euinRequestDTO.setCardType("vid"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testeuinValidOtp() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.VID.name()); + euinRequestDTO.setIndividualId("1234567"); + euinRequestDTO.setCardType(CardType.MASKED_UIN.name()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testeuinValidTransactionId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.VID.name()); + euinRequestDTO.setIndividualId("1234567"); + euinRequestDTO.setCardType(CardType.MASKED_UIN.name()); + euinRequestDTO.setOtp("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + + } + + @Test + public void testValidateEuinRequestSuccess() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + EuinRequestDTO euinRequestDTO = new EuinRequestDTO(); + euinRequestDTO.setIndividualIdType(IdType.VID.name()); + euinRequestDTO.setIndividualId("1234567"); + euinRequestDTO.setCardType(CardType.MASKED_UIN.name()); + euinRequestDTO.setOtp("12345"); + euinRequestDTO.setTransactionID("9876543210"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(euinRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.euin"); + requestValidator.validateEuinRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidTransactionId() throws Exception { + AuthLockOrUnLockRequestDto authLockRequestDto = new AuthLockOrUnLockRequestDto(); + authLockRequestDto.setIndividualId("12344567"); + authLockRequestDto.setOtp("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authLockRequestDto); + requestValidator.validateAuthLockOrUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidGetStatusId() throws Exception { + RequestDTO requestDTO = new RequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testGetStatusValidIndividualType() throws Exception { + RequestDTO requestDTO = new RequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidateRidCheckStatusRequestDTONullRequest() throws Exception { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(null); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRidCheckStatusRequestDTOInvalidIdType() throws Exception { + RequestDTO requestDTO = new RequestDTO(); + requestDTO.setIndividualIdType("Invalid"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRidCheckStatusRequestDTONullIndividualId() throws Exception { + RequestDTO requestDTO = new RequestDTO(); + requestDTO.setIndividualIdType(IdType.RID.name()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + } + + @Test + public void testValidateRidCheckStatusRequestDTOSuccess() throws Exception { + RequestDTO requestDTO = new RequestDTO(); + requestDTO.setIndividualIdType(IdType.RID.name()); + requestDTO.setIndividualId("1234567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testGetStatusValidIndividualId() throws Exception { + Mockito.when(ridValidator.validateId(Mockito.anyString())).thenReturn(false); + RequestDTO requestDTO = new RequestDTO(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType("INVALID_RID"); + requestDTO.setIndividualId("123456"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateRidCheckStatusRequestDTO(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testValidUpdateId() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testUpdateValidIndividualType() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testUpdateValidIndividualId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testUpdateValidTransaction() throws Exception { + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testUpdateValidOtp() throws Exception { + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testUpdateValidIdentityJson() throws Exception { + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567"); + requestDTO.setIdentityJson(""); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testValidReprintId() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + + } + + @Test(expected = InvalidInputException.class) + public void testValidUpdateRequestNullRequest() throws Exception { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + } + + @Test(expected = InvalidInputException.class) + public void testValidUpdateRequestIndividualIdNull() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.VID.name()); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + } + + @Test + public void testValidateUpdateRequest() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567"); + requestDTO.setIdentityJson("abcdef"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + } + + @Test + public void testValidateUpdateRequestV2() throws Exception { + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567"); + requestDTO.setIdentityJson("abcdef"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, false, schemaJson); + } + + @Test(expected = InvalidInputException.class) + public void testReprintValidIndividualType() throws Exception { + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testReprintValidIndividualId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(false); + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testReprintNullIndividualId() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test + public void testReprintSuccess() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.anyString())).thenReturn(true); + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("12345678"); + requestDTO.setCardType(CardType.MASKED_UIN.name()); + requestDTO.setOtp("111111"); + requestDTO.setTransactionID("11111"); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testReprintValidTransaction() throws Exception { + + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setCardType(CardType.MASKED_UIN.name()); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testReprintValidOtp() throws Exception { + + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setCardType(CardType.MASKED_UIN.name()); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testReprintValidCardType() throws Exception { + + ResidentReprintRequestDto requestDTO = new ResidentReprintRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestDTO.setIndividualIdType(IdType.VID.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setCardType(IdType.VID.name()); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.print"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateReprintRequestNullRequest() throws Exception { + + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequest(null); + requestValidator.validateReprintRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidOtp() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("1234567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test(expected = InvalidInputException.class) + public void testAuthHistoryValidTransactionId() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("1234567"); + authRequestDTO.setOtp("1245"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + + } + + @Test + public void testValidateAuthHistoryRequestSuccess() throws Exception { + AuthHistoryRequestDTO authRequestDTO = new AuthHistoryRequestDTO(); + authRequestDTO.setIndividualId("1234567"); + authRequestDTO.setOtp("1245"); + authRequestDTO.setTransactionID("1234567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setRequest(authRequestDTO); + requestWrapper.setVersion("v1"); + requestWrapper.setId("mosip.resident.authhistory"); + requestValidator.validateAuthHistoryRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testAuthUnlockRequestNull() throws Exception { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidIndividualIdForAuthUnlockRequest() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.any())).thenReturn(false); + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setTransactionID("12345"); + authUnLockRequestDto.setIndividualId("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthUnlockRequestUnlockForSecondsNull() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setTransactionID("12345"); + authUnLockRequestDto.setIndividualId("12345"); + authUnLockRequestDto.setOtp("12345"); + authUnLockRequestDto.setUnlockForSeconds(null); + List authTypeList = new ArrayList<>(); + authTypeList.add("bio-FIR"); + authUnLockRequestDto.setAuthType(authTypeList); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + } + + @Test + public void testValidateAuthUnlockRequestSuccess() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setTransactionID("12345"); + authUnLockRequestDto.setIndividualId("12345"); + authUnLockRequestDto.setOtp("12345"); + authUnLockRequestDto.setUnlockForSeconds("10"); + List authTypeList = new ArrayList<>(); + authTypeList.add("bio-FIR"); + authUnLockRequestDto.setAuthType(authTypeList); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthUnlockRequestNullIndividualId() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setTransactionID("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + } + + @Test(expected = InvalidInputException.class) + public void testValidOtpForAuthUnlockRequest() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setTransactionID("12345"); + authUnLockRequestDto.setIndividualId("12344567"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + @Test(expected = InvalidInputException.class) + public void testValidTransactionIdForAuthUnlockRequest() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto = new AuthUnLockRequestDTO(); + authUnLockRequestDto.setIndividualId("12344567"); + authUnLockRequestDto.setOtp("12345"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authunlock"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(authUnLockRequestDto); + requestValidator.validateAuthUnlockRequest(requestWrapper, AuthTypeStatus.LOCK); + + } + + + @Test(expected = InvalidInputException.class) + public void testValidunlockForMinutesLessThanZeroForAuthUnlockRequest() throws Exception { + AuthUnLockRequestDTO authUnLockRequestDto1 = new AuthUnLockRequestDTO(); + authUnLockRequestDto1.setIndividualId("12344567"); + authUnLockRequestDto1.setOtp("12345"); + authUnLockRequestDto1.setTransactionID("12345"); + authUnLockRequestDto1.setUnlockForSeconds(String.valueOf(-1L)); + List authTypes = new ArrayList(); + authTypes.add("bio-FIR"); + authUnLockRequestDto1.setAuthType(authTypes); + RequestWrapper requestWrapper1 = new RequestWrapper<>(); + requestWrapper1.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper1.setId("mosip.resident.authunlock"); + requestWrapper1.setVersion("v1"); + requestWrapper1.setRequest(authUnLockRequestDto1); + requestValidator.validateAuthUnlockRequest(requestWrapper1, AuthTypeStatus.LOCK); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2BadRequest() throws Exception { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(null); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2InvalidIndividualIdBadIdType() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2InvalidAuthType() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + authLockOrUnLockRequestDtoV2.setAuthTypes(null); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2BadAuthType() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("dummy"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test + public void testValidateAuthLockOrUnlockRequestV2() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + //authTypeStatusDto.setUnlockForSeconds(10L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2InvalidAuthTypeV2() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2EmptyAuthType() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthTypeUnlockRequestV2NegativeUnlockForSeconds() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(false); + authTypeStatusDto.setUnlockForSeconds(-1L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test + public void testValidateAuthLockOrUnlockRequestV2NullUnlockForSeconds() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(null); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + //Should not throw exception + } + + @Test + public void testValidateAuthLockRequestV2NegativeUnlockForSeconds() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(1L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + try { + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } catch (BaseResidentUncheckedExceptionWithMetadata e) { + assertEquals(e.getErrorCode(),ResidentErrorCode.UNSUPPORTED_INPUT.getErrorCode()); + return; + } + fail(); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2EmptyAuthTypeV2() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2BadUnlockForSeconds2() throws Exception { + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(-10L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + + @Test(expected = InvalidInputException.class) + public void testValidateAidStatusRequestDto() throws Exception { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(null); + requestValidator.validateAidStatusRequestDto(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAidStatusRequestDtoAidNull() throws Exception { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId(null); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(aidStatusRequestDTO); + requestValidator.validateAidStatusRequestDto(requestWrapper); + } + + @Test + public void testValidateAidStatusRequestDtoSuccess() throws Exception { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId("17"); + aidStatusRequestDTO.setTransactionId("1234567890"); + aidStatusRequestDTO.setOtp("111111"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(aidStatusRequestDTO); + requestValidator.validateAidStatusRequestDto(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateChannelVerificationStatus() throws Exception { + String channel = ""; + String individualId = ""; + requestValidator.validateChannelVerificationStatus(channel, individualId); + } + + @Test(expected = InvalidInputException.class) + public void testValidateChannelVerificationStatusNullChannel() throws Exception { + String channel = "BadChannel"; + String individualId = ""; + requestValidator.validateChannelVerificationStatus(channel, individualId); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateChannelVerificationStatusNullIndividualId() throws Exception { + String channel = "PHONE"; + requestValidator.validateChannelVerificationStatus(channel, null); + } + + @Test + public void testValidateChannelVerificationStatusSuccess() throws Exception { + String channel = "PHONE"; + requestValidator.validateChannelVerificationStatus(channel, "12345678"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequest() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = ""; + String serviceType = ""; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, sortType, sortType, "eng", null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequestBadServiceType() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = ""; + String serviceType = "BadServiceType"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, sortType, sortType, "eng", null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequestBadSortType() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "BadSortType"; + String serviceType = "DATA_SHARE_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, sortType, sortType, "eng", null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequestNullSortType() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String serviceType = "DATA_SHARE_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, null, null, serviceType, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestDateCheck() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "DATA_SHARE_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestServiceHistoryServiceRequest() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "SERVICE_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestServiceHistoryID_MANAGEMENT_REQUEST() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "ID_MANAGEMENT_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestServiceHistoryDATA_UPDATE_REQUEST() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "DATA_UPDATE_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestServiceHistoryAUTHENTICATION_REQUEST() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "AUTHENTICATION_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test + public void testValidateServiceHistoryRequestServiceHistorySuccess() throws Exception { + LocalDate fromDate = LocalDate.now(); + LocalDate toDate = LocalDate.now(); + String sortType = "DESC"; + String serviceType = "AUTHENTICATION_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + + @Test(expected = ResidentServiceException.class) + public void testValidateIndividualId() throws Exception { + String individualId = ""; + requestValidator.validateEventId(individualId); + } + + @Test + public void testValidateIndividualIdSuccess() throws Exception { + String individualId = "1234567897777777"; + requestValidator.validateEventId(individualId); + } + + @Test + public void testPhoneValidator() throws Exception { + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + String phone = "1234567890"; + requestValidator.phoneValidator(phone); + } + + @Test + public void testEmailValidator() throws Exception { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + String email = "abc@gmail.com"; + requestValidator.emailValidator(email); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRevokeVidRequestWrapperRevokeVidNull() throws Exception { + BaseVidRevokeRequestDTO baseVidRevokeRequestDTO = new BaseVidRevokeRequestDTO(); + baseVidRevokeRequestDTO.setVidStatus("REVOKED"); + baseVidRevokeRequestDTO.setTransactionID("123456789"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime("2019-01-0"); + requestWrapper.setId("mosip.resident.revokevid"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(baseVidRevokeRequestDTO); + requestValidator.validateRevokeVidRequestWrapper(requestWrapper, "v1"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRevokeVidRequestWrapper() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidId", "mosip.resident.vidstatus"); + BaseVidRevokeRequestDTO baseVidRevokeRequestDTO = new BaseVidRevokeRequestDTO(); + baseVidRevokeRequestDTO.setVidStatus("mosip.resident.vidstatus"); + baseVidRevokeRequestDTO.setTransactionID("123456789"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime("2019-01-0"); + requestWrapper.setId("mosip.resident.vidstatus"); + requestWrapper.setVersion("v1"); + requestWrapper.setRequest(baseVidRevokeRequestDTO); + requestValidator.validateRevokeVidRequestWrapper(requestWrapper, "v1"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "transliterateId", "mosip.resident.transliteration.transliterate"); + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + requestDTO.setId(null); + requestValidator.validateId(requestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateTransliterationId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "transliterateId", "mosip.resident.transliteration.transliterate"); + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + requestDTO.setId("mosip"); + requestValidator.validateId(requestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApi() throws Exception { + RequestWrapper request = new RequestWrapper<>(); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApiInvalidId() throws Exception { + RequestWrapper request = new RequestWrapper<>(); + RequestIdType requestIdType = RequestIdType.VERSION; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test + public void testValidateDownloadCardVid() throws Exception { + ReflectionTestUtils.setField(requestValidator, "reprintId", "mosip.resident.print"); + requestValidator.validateDownloadCardVid("12345"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardVidFailed() throws Exception { + Mockito.when(vidValidator.validateId(Mockito.any())).thenReturn(false); + ReflectionTestUtils.setField(requestValidator, "reprintId", "mosip.resident.print"); + requestValidator.validateDownloadCardVid("12345"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCard() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("id"); + mainRequestDTO.setVersion("1.0"); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCardNullId() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId(null); + mainRequestDTO.setVersion("1.0"); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCardNullRequestTime() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("property"); + mainRequestDTO.setVersion("1.0"); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCardNullString() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("property"); + mainRequestDTO.setVersion("1.0"); + mainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test + public void testValidateDownloadPersonalizedCardSuccess() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("property"); + mainRequestDTO.setVersion("1.0"); + mainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("html"); + downloadPersonalizedCardDto.setAttributes(List.of(TemplateVariablesConstants.NAME)); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCardBadHtml() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("property"); + mainRequestDTO.setVersion("1.0"); + mainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("`1&`"); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardNullTransactionId() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardNonNumericTransactionId() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("ab"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardLessThan10DigitTransactionId() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardNullOtp() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234343434"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateDownloadCardNonNumericOtp() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234343434"); + downloadCardRequestDTO.setOtp("abc"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateDownloadCardInvalidIndividualId() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234343434"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateDownloadCardEmptyIndividualId() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234343434"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTO.setIndividualId(""); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test + public void testValidateDownloadCardSuccess() throws Exception { + io.mosip.resident.dto.MainRequestDTO downloadCardRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + DownloadCardRequestDTO downloadCardRequestDTO = new DownloadCardRequestDTO(); + downloadCardRequestDTO.setTransactionId("1234343434"); + downloadCardRequestDTO.setOtp("111111"); + downloadCardRequestDTO.setIndividualId("123"); + downloadCardRequestDTOMainRequestDTO.setId("property"); + downloadCardRequestDTOMainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + downloadCardRequestDTOMainRequestDTO.setRequest(downloadCardRequestDTO); + requestValidator.validateDownloadCardRequest(downloadCardRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateProxySendOtpRequestInvalidUserId() throws Exception { + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV2); + requestValidator.validateProxySendOtpRequest(userIdOtpRequest, null); + } + + @Test + public void testValidateProxySendOtpRequestCorrectPhoneUserId() throws Exception { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + identityDTO.setEmail("kam@g.com"); + identityDTO.setPhone("8809393939"); + when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1234567788"); + when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV2.setUserId("8878787878"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV2); + requestValidator.validateProxySendOtpRequest(userIdOtpRequest, identityDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateUpdateDataRequestInvalidUserId() throws Exception { + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("111111"); + otpRequestDTOV3.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV3); + requestValidator.validateUpdateDataRequest(userIdOtpRequest); + } + + @Test(expected = InvalidInputException.class) + public void testValidateUpdateDataRequestInvalidPhoneUserId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("111111"); + otpRequestDTOV3.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + otpRequestDTOV3.setUserId("k"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV3); + requestValidator.validateUpdateDataRequest(userIdOtpRequest); + } + + @Test + public void testValidateUpdateDataRequestCorrectPhoneUserId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("60"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("111111"); + otpRequestDTOV3.setTransactionId("1232323232"); + userIdOtpRequest.setId("60"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV3.setUserId("8878787878"); + userIdOtpRequest.setRequesttime(Date.from(Instant.now())); + userIdOtpRequest.setRequest(otpRequestDTOV3); + requestValidator.validateUpdateDataRequest(userIdOtpRequest); + } + + @Test + public void testValidateUpdateDataRequestCorrectEmailId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("60"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV3 otpRequestDTOV3 = new OtpRequestDTOV3(); + otpRequestDTOV3.setOtp("111111"); + otpRequestDTOV3.setTransactionId("1232323232"); + userIdOtpRequest.setId("60"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV3.setUserId("test@g.com"); + userIdOtpRequest.setRequesttime(Date.from(Instant.now())); + userIdOtpRequest.setRequest(otpRequestDTOV3); + requestValidator.validateUpdateDataRequest(userIdOtpRequest); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateRequest() { + requestValidator.validateVidCreateRequest(null, false, null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2Request() { + ResidentVidRequestDtoV2 requestDto = new ResidentVidRequestDtoV2(); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + false, null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2RequestInvalidVersion() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ResidentVidRequestDtoV2 requestDto = new ResidentVidRequestDtoV2(); + requestDto.setId("generate"); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + false, null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2RequestInvalidRequest() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ResidentVidRequestDtoV2 requestDto = new ResidentVidRequestDtoV2(); + requestDto.setId("generate"); + requestDto.setVersion("newVersion"); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + false, null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2RequestInvalidIndividualId() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ResidentVidRequestDtoV2 requestDto = new ResidentVidRequestDtoV2(); + requestDto.setId("generate"); + requestDto.setVersion("newVersion"); + VidRequestDtoV2 vidRequestDtoV2 = new VidRequestDtoV2(); + vidRequestDtoV2.setVidType("PERPETUAL"); + requestDto.setRequest(vidRequestDtoV2); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + false, null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2RequestInvalidRequestDto() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ResidentVidRequestDto requestDto = new ResidentVidRequestDto(); + requestDto.setId("generate"); + requestDto.setVersion("newVersion"); + VidRequestDto vidRequestDtoV2 = new VidRequestDto(); + vidRequestDtoV2.setVidType("PERPETUAL"); + requestDto.setRequest(vidRequestDtoV2); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + true, "123"); + } + + @Test + public void testValidateVidCreateV2RequestSuccess() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ResidentVidRequestDto requestDto = new ResidentVidRequestDto(); + requestDto.setId("generate"); + requestDto.setVersion("newVersion"); + VidRequestDto vidRequestDtoV2 = new VidRequestDto(); + vidRequestDtoV2.setVidType("PERPETUAL"); + vidRequestDtoV2.setTransactionID("1232323232"); + requestDto.setRequest(vidRequestDtoV2); + requestDto.setRequesttime(String.valueOf(LocalDateTime.now())); + requestValidator.validateVidCreateV2Request(requestDto, + false, "123"); + } + + @Test(expected = InvalidInputException.class) + public void testValidatePageFetchAndPageStartFormat() { + RequestWrapper requestDTO = new RequestWrapper<>(); + AuthHistoryRequestDTO authHistoryRequestDTO = new AuthHistoryRequestDTO(); + authHistoryRequestDTO.setPageStart(String.valueOf(0)); + authHistoryRequestDTO.setPageFetch("0"); + requestDTO.setRequest(authHistoryRequestDTO); + requestValidator.validatePageFetchAndPageStartFormat(requestDTO, "request"); + } + + @Test + public void testValidateUin() { + Mockito.when(uinValidator.validateId(Mockito.any())).thenThrow(new InvalidIDException(ResidentErrorCode.INVALID_UIN.getErrorCode(), + ResidentErrorCode.INVALID_UIN.getErrorMessage())); + assertEquals(false, requestValidator.validateUin("123")); + } + + @Test + public void testValidateVid() { + Mockito.when(vidValidator.validateId(Mockito.any())).thenThrow(new InvalidIDException(ResidentErrorCode.INVALID_VID.getErrorCode(), + ResidentErrorCode.INVALID_VID.getErrorMessage())); + assertEquals(false, requestValidator.validateVid("123")); + } + + @Test(expected = InvalidInputException.class) + public void testEmptyTransactionId() { + requestValidator.validateTransactionId(""); + } + + @Test(expected = InvalidInputException.class) + public void testEmptyUserIdAndTransactionId() { + requestValidator.validateUserIdAndTransactionId("", "3232323232"); + } + + @Test(expected = InvalidInputException.class) + public void testInvalidUserId() { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + requestValidator.validateUserIdAndTransactionId("shgasbieh", "3232323232"); + } + + @Test(expected = InvalidInputException.class) + public void testNullUserIdAndTransactionId() { + requestValidator.validateUserIdAndTransactionId(null, "3232323232"); + } + + @Test + public void testValidateTransliterationIdSuccess() throws Exception { + ReflectionTestUtils.setField(requestValidator, "transliterateId", "mosip.resident.transliteration.transliterate"); + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + transliterationRequestDTO.setFromFieldLang("eng"); + transliterationRequestDTO.setToFieldLang("fra"); + transliterationRequestDTO.setFromFieldValue("demo"); + requestDTO.setRequest(transliterationRequestDTO); + requestDTO.setId("mosip.resident.transliteration.transliterate"); + requestValidator.validateId(requestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateOnlyLanguageCode() { + requestValidator.validateLanguageCode(null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateOnlyEmptyLanguageCode() { + requestValidator.validateLanguageCode(""); + } + + @Test(expected = InvalidInputException.class) + public void testValidateOnlyInvalidLanguageCode() { + requestValidator.validateLanguageCode("fra"); + } + + @Test + public void testValidateOnlyValidLanguageCodeSuccess() { + requestValidator.validateLanguageCode("eng"); + } + + @Test + public void testValidateOnlyInvalidLanguageCodeSuccess() { + requestValidator.validateLanguageCode("ara"); + } + + @Test + public void testValidateEventIdLanguageCodeSuccess() { + requestValidator.validateEventIdLanguageCode("3434343434777777", "ara"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateEmptyEventIdLanguageCodeSuccess() { + requestValidator.validateEventIdLanguageCode("", "ara"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateSortType() { + ReflectionTestUtils.invokeMethod(requestValidator, "validateSortType", "D", "sortType"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateStatusFilter() { + ReflectionTestUtils.invokeMethod(requestValidator, "validateStatusFilter", "", "sortType"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateFromDateTimeToDateTimeFromDateTimeNull() { + requestValidator.validateFromDateTimeToDateTime(null, LocalDate.now(), "fromDate"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateFromDateTimeToDateTimeToDateTimeNull() { + requestValidator.validateFromDateTimeToDateTime(LocalDate.MAX, null, "fromDate"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApiInvalidDate() throws Exception { + RequestWrapper request = new RequestWrapper<>(); + request.setId("mosip.resident.print"); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApiEmptyVersion() throws Exception { + RequestWrapper request = new RequestWrapper<>(); + request.setId("mosip.resident.print"); + request.setRequesttime(String.valueOf(LocalDateTime.now())); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApiInvalidVersion() throws Exception { + ReflectionTestUtils.setField(requestValidator, "reqResVersion", "1.0"); + RequestWrapper request = new RequestWrapper<>(); + request.setId("mosip.resident.print"); + request.setRequesttime(String.valueOf(LocalDateTime.now())); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestNewApiInvalidRequest() throws Exception { + ReflectionTestUtils.setField(requestValidator, "reqResVersion", "1.0"); + RequestWrapper request = new RequestWrapper<>(); + request.setId("mosip.resident.print"); + request.setVersion("1.0"); + request.setRequesttime(String.valueOf(LocalDateTime.now())); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + requestValidator.validateRequestNewApi(request, requestIdType); + } + + @Test + public void testValidateRequestNewApiSuccess() throws Exception { + ReflectionTestUtils.setField(requestValidator, "reqResVersion", "1.0"); + RequestWrapper request = new RequestWrapper<>(); + request.setId("mosip.resident.print"); + request.setVersion("1.0"); + request.setRequest("d"); + request.setRequesttime(String.valueOf(LocalDateTime.now())); + RequestIdType requestIdType = RequestIdType.RE_PRINT_ID; + assertEquals(true, requestValidator.validateRequestNewApi(request, requestIdType)); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateNullIndividualId() throws Exception { + requestValidator.validateEventId(null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2Request() throws Exception { + RequestWrapper requestDto = new RequestWrapper<>(); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestId() throws Exception { + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId(""); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdInvalidId() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("v1"); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdInvalidVersion() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdInvalidVersionV1() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdEmptyVersionV1() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion(""); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdIncorrectVersion() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("v1"); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdInvalidRequest() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdNullVidStatus() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + VidRevokeRequestDTOV2 vidRevokeRequestDTO = new VidRevokeRequestDTOV2(); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdEmptyVidStatus() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + VidRevokeRequestDTOV2 vidRevokeRequestDTO = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTO.setVidStatus(""); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test + public void testValidateVidRevokeV2RequestEmptyRequestIdEmptyVidStatusSuccess() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + VidRevokeRequestDTOV2 vidRevokeRequestDTO = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTO.setVidStatus("REVOKED"); + vidRevokeRequestDTO.setTransactionID("1212121212"); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequestServiceHistoryAUTHENTICATION_REQUESTInvalidDate() throws Exception { + LocalDate fromDate = LocalDate.of + (-1, 4, 4); + LocalDate toDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "AUTHENTICATION_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateServiceHistoryRequestServiceHistoryAUTHENTICATION_REQUESTInvalidToDate() throws Exception { + LocalDate toDate = LocalDate.of + (-1, 4, 4); + LocalDate fromDate = LocalDate.now(); + String sortType = "ASC"; + String serviceType = "AUTHENTICATION_REQUEST"; + requestValidator.validateServiceHistoryRequest(fromDate, toDate, sortType, serviceType, null, "eng", null); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidCreateV2RequestFailure() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ResidentVidRequestDto requestDto = new ResidentVidRequestDto(); + requestDto.setId("generate"); + requestDto.setVersion("newVersion"); + VidRequestDto vidRequestDtoV2 = new VidRequestDto(); + vidRequestDtoV2.setVidType("PERPETUAL"); + vidRequestDtoV2.setTransactionID("1232323232"); + requestDto.setRequest(vidRequestDtoV2); + requestDto.setRequesttime(null); + requestValidator.validateVidCreateV2Request(requestDto, + false, "123"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2InvalidAuthTypeV1() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.authlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(2L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(null); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2EmptyAuthTypeV1() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.authlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType(""); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(2L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2InvalidUnlockForSeconds() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.authlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(-2L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.authlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeRequest() { + ReflectionTestUtils.setField(requestValidator, "generateId", "generate"); + ReflectionTestUtils.setField(requestValidator, "newVersion", "newVersion"); + ReflectionTestUtils.setField(requestValidator, "revokeVidId", "mosip.resident.vidstatus"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("mosip.resident.vidstatus"); + requestDto.setVersion("v1"); + VidRevokeRequestDTOV2 vidRevokeRequestDTO = new VidRevokeRequestDTOV2(); + vidRevokeRequestDTO.setVidStatus(""); + vidRevokeRequestDTO.setTransactionID("1212121212"); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeRequest(requestDto, + false, "123"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateUnlockForSeconds() { + ReflectionTestUtils.invokeMethod(requestValidator, "validateUnlockForSeconds", -1L, "validateUnlockForSeconds"); + } + + @Test + public void testValidateGrievanceRequestDtoInvalidMessage() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID)).thenReturn("id"); + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION)).thenReturn("version"); + io.mosip.resident.dto.MainRequestDTO grievanceRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setMessage("message"); + grievanceRequestDTO.setEventId("1212121212121211"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("id"); + grievanceRequestDTOMainRequestDTO.setVersion("version"); + grievanceRequestDTOMainRequestDTO.setRequesttime(DateTime.now().toDate()); + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + } + + @Test + public void testValidateGrievanceRequestDtoSuccess() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID)).thenReturn("id"); + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION)).thenReturn("version"); + io.mosip.resident.dto.MainRequestDTO grievanceRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setMessage("message"); + grievanceRequestDTO.setEventId("1212121212121211"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("id"); + grievanceRequestDTOMainRequestDTO.setVersion("version"); + grievanceRequestDTOMainRequestDTO.setRequesttime(DateTime.now().toDate()); + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateGrievanceRequestDtoInvalidMessageLength() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID)).thenReturn("id"); + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION)).thenReturn("version"); + ReflectionTestUtils.setField(requestValidator, "messageCharsLimit", 1); + io.mosip.resident.dto.MainRequestDTO grievanceRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setMessage("message"); + grievanceRequestDTO.setEventId("1212121212121211"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("id"); + grievanceRequestDTOMainRequestDTO.setVersion("version"); + grievanceRequestDTOMainRequestDTO.setRequesttime(DateTime.now().toDate()); + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateGrievanceRequestDtoInvalidAllowedChars() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID)).thenReturn("id"); + ReflectionTestUtils.setField(requestValidator, "messageAllowedSpecialCharRegex", "[A-Za-z .,-]+"); + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION)).thenReturn("version"); + io.mosip.resident.dto.MainRequestDTO grievanceRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setMessage("message1"); + grievanceRequestDTO.setEventId("1212121212121211"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("id"); + grievanceRequestDTOMainRequestDTO.setVersion("version"); + grievanceRequestDTOMainRequestDTO.setRequesttime(DateTime.now().toDate()); + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateEventIdNonNumeric() { + requestValidator.validateEventId("a"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateEventIdLessLength() { + requestValidator.validateEventId("3"); + } + + @Test(expected = EidNotBelongToSessionException.class) + public void testValidateApiBelongToSameSession() throws ResidentServiceCheckedException, ApisResourceAccessException { + ResidentTransactionEntity residentTransactionEntity = new ResidentTransactionEntity(); + residentTransactionEntity.setTokenId("123"); + Optional residentTransactionEntity1 = Optional.of(residentTransactionEntity); + Mockito.when(residentTransactionRepository.findById(Mockito.anyString())).thenReturn(residentTransactionEntity1); + Mockito.when(identityService.getResidentIdaToken()).thenReturn("2"); + ReflectionTestUtils.invokeMethod(requestValidator, "validateEventIdBelongToSameSession", "12"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateEmailId() throws ResidentServiceCheckedException, ApisResourceAccessException { + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.invokeMethod(requestValidator, "validateEmailId", "123"); + } + + @Test(expected = InvalidInputException.class) + public void testValidatePhone() throws ResidentServiceCheckedException, ApisResourceAccessException { + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + ReflectionTestUtils.invokeMethod(requestValidator, "validatePhoneNumber", "w"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateSharableAttributes() { + requestValidator.validateSharableAttributes(List.of()); + } + + @Test + public void testValidateSharableAttributesSuccess() { + requestValidator.validateSharableAttributes(List.of(new SharableAttributesDTO())); + } + + @Test(expected = ResidentServiceException.class) + public void testValidatePurposeNull() { + requestValidator.validatePurpose(null); + } + + @Test(expected = ResidentServiceException.class) + public void testValidatePurposeEmpty() { + requestValidator.validatePurpose(""); + } + + @Test(expected = ResidentServiceException.class) + public void testValidatePurposeWithMoreCharacter() { + ReflectionTestUtils.setField(requestValidator, "purposeCharsLimit", 1); + requestValidator.validatePurpose("HR"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidatePurposeWithAllowedRegex() { + ReflectionTestUtils.setField(requestValidator, "purposeCharsLimit", 10); + ReflectionTestUtils.setField(requestValidator, "purposeAllowedSpecialCharRegex", "^[A-Za-z .,-]+$"); + requestValidator.validatePurpose("H2R"); + } + + @Test + public void testValidatePurposeSuccess() { + ReflectionTestUtils.setField(requestValidator, "purposeCharsLimit", 10); + ReflectionTestUtils.setField(requestValidator, "purposeAllowedSpecialCharRegex", "^[A-Za-z .,-]+$"); + requestValidator.validatePurpose("HR"); + } + + @Test + public void testValidateReqOtp() { + IndividualIdOtpRequestDTO individualIdOtpRequestDTO = new IndividualIdOtpRequestDTO(); + individualIdOtpRequestDTO.setIndividualId("1234567890"); + individualIdOtpRequestDTO.setTransactionId("1234567890"); + requestValidator.validateReqOtp(individualIdOtpRequestDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateRequestTimeFailure() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("60"); + requestValidator.validateRequestTime(Date.from(Instant.now().minusSeconds(100))); + } + + @Test + public void testValidateRequestTime() { + Mockito.when(environment.getProperty(Mockito.anyString())).thenReturn("60"); + requestValidator.validateRequestTime(Date.from(Instant.now().minusSeconds(10))); + } + + @Test + public void testValidateNameWithValidName() throws ResidentServiceCheckedException { + String name = "Kamesh Shekhar Prasad"; + RequestValidator requestValidator1 = Mockito.spy(new RequestValidator()); + requestValidator1.validateName(name); + verify(requestValidator1).validateName(name); + } + + @Test(expected = ResidentServiceCheckedException.class) + public void testValidateNameWithBlankName() throws ResidentServiceCheckedException { + requestValidator.validateName(""); + } + + @Test + public void testValidateGrievanceRequestDtoSuccessWithAlternateEmailID() throws ResidentServiceCheckedException, ApisResourceAccessException { + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_ID)).thenReturn("id"); + Mockito.when(environment.getProperty(ResidentConstants.GRIEVANCE_REQUEST_VERSION)).thenReturn("version"); + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO grievanceRequestDTOMainRequestDTO = + new io.mosip.resident.dto.MainRequestDTO<>(); + GrievanceRequestDTO grievanceRequestDTO = new GrievanceRequestDTO(); + grievanceRequestDTO.setMessage("message"); + grievanceRequestDTO.setEventId("1212121212121211"); + grievanceRequestDTO.setAlternateEmailId("Ka@g.com"); + grievanceRequestDTO.setAlternatePhoneNo("8898787878"); + grievanceRequestDTOMainRequestDTO.setRequest(grievanceRequestDTO); + grievanceRequestDTOMainRequestDTO.setId("id"); + grievanceRequestDTOMainRequestDTO.setVersion("version"); + grievanceRequestDTOMainRequestDTO.setRequesttime(DateTime.now().toDate()); + requestValidator.validateGrievanceRequestDto(grievanceRequestDTOMainRequestDTO); + } + + @Test + public void testValidateReqCredentialRequestSuccess() { + RequestWrapper requestWrapper = new RequestWrapper<>(); + ResidentCredentialRequestDto residentCredentialRequestDto = new ResidentCredentialRequestDto(); + residentCredentialRequestDto.setIndividualId("1232323232"); + residentCredentialRequestDto.setCredentialType("Vercred"); + residentCredentialRequestDto.setIssuer("resident"); + residentCredentialRequestDto.setOtp("111111"); + residentCredentialRequestDto.setTransactionID("1232323232"); + requestWrapper.setRequest(residentCredentialRequestDto); + requestValidator.validateReqCredentialRequest(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateReqCredentialRequestFailure() { + RequestWrapper requestWrapper = new RequestWrapper<>(); + ResidentCredentialRequestDto residentCredentialRequestDto = new ResidentCredentialRequestDto(); + residentCredentialRequestDto.setIndividualId(""); + requestWrapper.setRequest(residentCredentialRequestDto); + requestValidator.validateReqCredentialRequest(requestWrapper); + } + + @Test + public void testValidateShareCredentialRequest() { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setId("42"); + ReflectionTestUtils.setField(requestValidator, "shareCredentialId", "io.mosip"); + SharableAttributesDTO sharableAttributesDTO = new SharableAttributesDTO(); + sharableAttributesDTO.setAttributeName("name"); + ShareCredentialRequestDto shareCredentialRequestDto = new ShareCredentialRequestDto(); + shareCredentialRequestDto.setSharableAttributes(List.of(sharableAttributesDTO)); + shareCredentialRequestDto.setConsent("Accepted"); + shareCredentialRequestDto.setPurpose("share"); + requestWrapper.setRequest(shareCredentialRequestDto); + requestWrapper.setId("mosip.resident.share.credential"); + requestWrapper.setRequesttime(String.valueOf(LocalDateTime.now())); + requestWrapper.setVersion("1.0"); + thrown.expect(ResidentServiceException.class); + requestValidator.validateShareCredentialRequest(requestWrapper); + verify(requestWrapper).getId(); + verify(requestWrapper).setId((String) any()); + verify(requestWrapper).setRequest((ShareCredentialRequestDto) any()); + verify(requestWrapper).setRequesttime((String) any()); + verify(requestWrapper).setVersion((String) any()); + } + + @Test + public void testValidateShareCredentialRequestWithPartnerID() { + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setId("42"); + ReflectionTestUtils.setField(requestValidator, "shareCredentialId", "io.mosip"); + when(environment.getProperty(Mockito.anyString())).thenReturn("env"); + when(proxyPartnerManagementService.getPartnerDetailFromPartnerIdAndPartnerType(Mockito.anyString(), Mockito.anyString())) + .thenReturn(new HashMap<>()); + SharableAttributesDTO sharableAttributesDTO = new SharableAttributesDTO(); + sharableAttributesDTO.setAttributeName("name"); + ShareCredentialRequestDto shareCredentialRequestDto = new ShareCredentialRequestDto(); + shareCredentialRequestDto.setSharableAttributes(List.of(sharableAttributesDTO)); + shareCredentialRequestDto.setConsent("Accepted"); + shareCredentialRequestDto.setPurpose("share"); + shareCredentialRequestDto.setPartnerId("partnerId"); + requestWrapper.setRequest(shareCredentialRequestDto); + requestWrapper.setId("mosip.resident.share.credential"); + requestWrapper.setRequesttime(String.valueOf(LocalDateTime.now())); + requestWrapper.setVersion("1.0"); + thrown.expect(ResidentServiceException.class); + requestValidator.validateShareCredentialRequest(requestWrapper); + verify(requestWrapper).getId(); + verify(requestWrapper).setId((String) any()); + verify(requestWrapper).setRequest((ShareCredentialRequestDto) any()); + verify(requestWrapper).setRequesttime((String) any()); + verify(requestWrapper).setVersion((String) any()); + } + @Test(expected = InvalidInputException.class) + public void testValidateDownloadPersonalizedCardInvalidAttributeList() throws Exception { + io.mosip.resident.dto.MainRequestDTO mainRequestDTO = new io.mosip.resident.dto.MainRequestDTO<>(); + mainRequestDTO.setId("property"); + mainRequestDTO.setVersion("1.0"); + mainRequestDTO.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + DownloadPersonalizedCardDto downloadPersonalizedCardDto = new DownloadPersonalizedCardDto(); + downloadPersonalizedCardDto.setHtml("html"); + downloadPersonalizedCardDto.setAttributes(List.of()); + mainRequestDTO.setRequest(downloadPersonalizedCardDto); + requestValidator.validateDownloadPersonalizedCard(mainRequestDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateProxySendOtpRequestInCorrectPhoneUserId() throws Exception { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + identityDTO.setEmail("kam@g.com"); + identityDTO.setPhone("8878787878"); + when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1234567788"); + when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV2.setUserId("8878787878"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV2); + requestValidator.validateProxySendOtpRequest(userIdOtpRequest, identityDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateProxySendOtpRequestInCorrectEmailUserId() throws Exception { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + identityDTO.setEmail("kam@g.com"); + identityDTO.setPhone("887878"); + when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1234567788"); + when(identityService.getIdentity(Mockito.anyString())).thenReturn(identityDTO); + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV2.setUserId("kam@g.com"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV2); + when(idRepoService.getRemainingUpdateCountByIndividualId(Mockito.anyList())).thenReturn(new ResponseWrapper<>()); + requestValidator.validateProxySendOtpRequest(userIdOtpRequest, identityDTO); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateProxySendOtpRequestFailed() throws Exception { + IdentityDTO identityDTO = new IdentityDTO(); + identityDTO.setFullName("kamesh"); + identityDTO.setEmail("kam@g.com"); + identityDTO.setPhone("887878"); + when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1234567788"); + when(identityService.getIdentity(Mockito.anyString())).thenThrow(new ResidentServiceCheckedException()); + ReflectionTestUtils.setField(requestValidator, "emailRegex", "^[a-zA-Z0-9_\\-\\.]+@[a-zA-Z0-9_\\-]+\\.[a-zA-Z]{2,4}$"); + ReflectionTestUtils.setField(requestValidator, "phoneRegex", "^([6-9]{1})([0-9]{9})$"); + io.mosip.resident.dto.MainRequestDTO userIdOtpRequest = + new io.mosip.resident.dto.MainRequestDTO<>(); + OtpRequestDTOV2 otpRequestDTOV2 = new OtpRequestDTOV2(); + otpRequestDTOV2.setTransactionId("1232323232"); + userIdOtpRequest.setId("property"); + userIdOtpRequest.setVersion("1.0"); + otpRequestDTOV2.setUserId("kam@g.com"); + userIdOtpRequest.setRequesttime(new Date(2012, 2, 2, 2, 2, 2)); + userIdOtpRequest.setRequest(otpRequestDTOV2); + requestValidator.validateProxySendOtpRequest(userIdOtpRequest, identityDTO); + } + + @Test(expected = InvalidInputException.class) + public void testValidateTransliterationIdLangFailed() throws Exception { + ReflectionTestUtils.setField(requestValidator, "transliterateId", "mosip.resident.transliteration.transliterate"); + MainRequestDTO requestDTO = new MainRequestDTO<>(); + TransliterationRequestDTO transliterationRequestDTO = new TransliterationRequestDTO(); + transliterationRequestDTO.setFromFieldLang("eng"); + transliterationRequestDTO.setToFieldLang("eng"); + transliterationRequestDTO.setFromFieldValue("demo"); + requestDTO.setRequest(transliterationRequestDTO); + requestDTO.setId("mosip.resident.transliteration.transliterate"); + requestValidator.validateId(requestDTO); + } + + @Test + public void testValidateOtpCharLimit() { + requestValidator.validateOtpCharLimit("111111"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateOtpCharLimitFailed() { + requestValidator.validateOtpCharLimit("11111111"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateSchemaType() { + requestValidator.validateSchemaType("ui"); + } + + @Test + public void testValidateSchemaTypeSuccess() { + requestValidator.validateSchemaType("update-demographics"); + } + + @Test + public void testValidateSearchText() { + requestValidator.validateSearchText(null); + } + + @Test + public void testValidateSearchTextNotNull() { + requestValidator.validateSearchText("11"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateSearchTextNotNullFailure() { + requestValidator.validateSearchText("154654545454124545451"); + } + + @Test(expected = ResidentServiceException.class) + public void testValidateChannelVerificationStatusInvalidVidLength() throws Exception { + String channel = "PHONE"; + requestValidator.validateChannelVerificationStatus(channel, "454645787845124578"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAidStatusRequestDtoFailure() throws Exception { + AidStatusRequestDTO aidStatusRequestDTO = new AidStatusRequestDTO(); + aidStatusRequestDTO.setIndividualId(null); + aidStatusRequestDTO.setTransactionId("1234567890"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.checkstatus"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(aidStatusRequestDTO); + requestValidator.validateAidStatusRequestDto(requestWrapper); + } + + @Test(expected = InvalidInputException.class) + public void testValidateUpdateRequestV2Failed() throws Exception { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567"); + requestDTO.setIdentityJson("abcdef"); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test + public void testValidateUpdateRequestV2Passed() throws Exception { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567890"); + requestDTO.setIdentityJson("abcdef"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("identity", "abc"); + requestDTO.setIdentity(jsonObject1); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test + public void testValidateUpdateRequestV2PassedWithLanguageCode() throws Exception { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567890"); + requestDTO.setIdentityJson("abcdef"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("identity", "abc"); + ArrayList> languageMap = new ArrayList<>(); + Map language = new HashMap<>(); + language.put("language", "eng"); + language.put("value", "eng"); + languageMap.add(language); + jsonObject1.put("value", languageMap); + requestDTO.setIdentity(jsonObject1); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test(expected = InvalidInputException.class) + public void testValidateUpdateRequestV2InvalidTransactionId() throws Exception { + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID(""); + requestDTO.setIdentityJson("abcdef"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("identity", "abc"); + ArrayList> languageMap = new ArrayList<>(); + Map language = new HashMap<>(); + language.put("language", "eng"); + language.put("value", "eng"); + languageMap.add(language); + jsonObject1.put("value", languageMap); + requestDTO.setIdentity(jsonObject1); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test + public void testValidateUpdateRequestV2FailedWithLanguageCode() throws Exception { + ReflectionTestUtils.setField(requestValidator, "attributeNamesWithoutDocumentsRequired", "email"); + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + Map identityMappingMap = new HashMap<>(); + Map identityValue = new HashMap<>(); + identityValue.put("value", "email"); + identityMappingMap.put("email", identityValue); + Mockito.when(residentConfigService.getIdentityMappingMap()).thenReturn(identityMappingMap); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567890"); + requestDTO.setIdentityJson("abcdef"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("identity", "abc"); + ArrayList> languageMap = new ArrayList<>(); + Map language = new HashMap<>(); + language.put("language", "eng"); + language.put("value", "eng"); + languageMap.add(language); + jsonObject1.put("value", languageMap); + requestDTO.setIdentity(jsonObject1); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test(expected = RuntimeException.class) + public void testValidateUpdateRequestV2FailedWithRunTimeException() throws Exception { + ReflectionTestUtils.setField(requestValidator, "attributeNamesWithoutDocumentsRequired", "email"); + Mockito.when(identityService.getResidentIndvidualIdFromSession()).thenReturn("1212121212"); + Map identityMappingMap = new HashMap<>(); + Map identityValue = new HashMap<>(); + identityValue.put("value", "email"); + identityMappingMap.put("email", identityValue); + Mockito.when(residentConfigService.getIdentityMappingMap()).thenThrow(new IOException()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("IDSchemaVersion", "0.2"); + ResponseWrapper idSchemaResponse = new ResponseWrapper(); + JSONObject object = new JSONObject(); + object.put("schemaJson", schema); + idSchemaResponse.setResponse(object); + Map map = new HashMap<>(); + when(objectMapper.convertValue(object, Map.class)).thenReturn(object); + + when(proxyMasterdataService.getLatestIdSchema(0.2, null, null)).thenReturn(idSchemaResponse); + Mockito.when(utilities.retrieveIdrepoJson(Mockito.anyString())).thenReturn(jsonObject); + + ResidentUpdateRequestDto requestDTO = new ResidentUpdateRequestDto(); + requestDTO.setIndividualIdType(IdType.UIN.name()); + requestDTO.setIndividualId("1234567"); + requestDTO.setOtp("1234567"); + requestDTO.setTransactionID("1234567"); + requestDTO.setIdentityJson("abcdef"); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("identity", "abc"); + ArrayList> languageMap = new ArrayList<>(); + Map language = new HashMap<>(); + language.put("language", "eng"); + language.put("value", "eng"); + languageMap.add(language); + jsonObject1.put("value", languageMap); + requestDTO.setIdentity(jsonObject1); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.updateuin"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(requestDTO); + requestValidator.validateUpdateRequest(requestWrapper, true, schemaJson); + } + + @Test + public void testEmailsCharValidator() { + requestValidator.emailCharsValidator("ka@g.com"); + } + + @Test(expected = ResidentServiceException.class) + public void testEmailsCharValidatorFailed() { + requestValidator.emailCharsValidator("45454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545"); + } + + @Test(expected = ResidentServiceException.class) + public void testPhoneCharsValidator() { + UUID uuid = UUID.randomUUID(); + requestValidator.phoneCharsValidator("45454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545"); + } + + @Test + public void testValidateRid() { + Mockito.when(ridValidator.validateId(Mockito.anyString())).thenReturn(true); + assertTrue(requestValidator.validateRid("11345678")); + } + + @Test + public void testValidateRidFailed() { + Mockito.when(ridValidator.validateId(Mockito.anyString())).thenThrow(new InvalidIDException(ResidentErrorCode.INVALID_RID.getErrorCode(), + ResidentErrorCode.INVALID_RID.getErrorMessage())); + assertFalse(requestValidator.validateRid("11345678")); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdEmptyVidStatusFailure() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + VidRevokeRequestDTO vidRevokeRequestDTO = new VidRevokeRequestDTO(); + vidRevokeRequestDTO.setVidStatus("REVOKED"); + vidRevokeRequestDTO.setTransactionID("1212121212"); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, false, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateVidRevokeV2RequestEmptyRequestIdEmptyOtpFailure() throws Exception { + ReflectionTestUtils.setField(requestValidator, "revokeVidIdNew", "1.0"); + ReflectionTestUtils.setField(requestValidator, "revokeVidVersion", "1.0"); + RequestWrapper requestDto = new RequestWrapper<>(); + requestDto.setId("1.0"); + requestDto.setVersion("1.0"); + VidRevokeRequestDTO vidRevokeRequestDTO = new VidRevokeRequestDTO(); + vidRevokeRequestDTO.setVidStatus("REVOKED"); + vidRevokeRequestDTO.setTransactionID("1212121212"); + vidRevokeRequestDTO.setIndividualId("123"); + requestDto.setRequest(vidRevokeRequestDTO); + requestDto.setRequesttime(LocalDateTime.now().toString()); + requestValidator.validateVidRevokeV2Request(requestDto, true, "3956038419"); + } + + @Test(expected = InvalidInputException.class) + public void testValidateAuthLockOrUnlockRequestV2Failed() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-IR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(10L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } + + @Test + public void testValidateAuthLockOrUnlockRequestV2FailedUnlockSeconds() throws Exception { + ReflectionTestUtils.setField(requestValidator, "authLockStatusUpdateV2Id", "mosip.resident.auth.lock.unlock"); + AuthLockOrUnLockRequestDtoV2 authLockOrUnLockRequestDtoV2 = new AuthLockOrUnLockRequestDtoV2(); + List authTypes = new ArrayList<>(); + AuthTypeStatusDtoV2 authTypeStatusDto = new AuthTypeStatusDtoV2(); + authTypeStatusDto.setAuthType("bio-FIR"); + authTypeStatusDto.setLocked(true); + authTypeStatusDto.setUnlockForSeconds(-10L); + authTypes.add(authTypeStatusDto); + authLockOrUnLockRequestDtoV2.setAuthTypes(authTypes); + RequestWrapper requestWrapper = new RequestWrapper<>(); + requestWrapper.setRequesttime(DateUtils.getUTCCurrentDateTimeString(pattern)); + requestWrapper.setId("mosip.resident.auth.lock.unlock"); + requestWrapper.setVersion("1.0"); + requestWrapper.setRequest(authLockOrUnLockRequestDtoV2); + try { + requestValidator.validateAuthLockOrUnlockRequestV2(requestWrapper); + } catch (BaseResidentUncheckedExceptionWithMetadata e) { + assertEquals(e.getErrorCode(),ResidentErrorCode.UNSUPPORTED_INPUT.getErrorCode()); + return; + } + fail(); + } +} \ No newline at end of file diff --git a/resident/resident-service/src/test/resources/ID.json b/resident/resident-service/src/test/resources/ID.json index eeedfbf7654..ffab4d2afbf 100644 --- a/resident/resident-service/src/test/resources/ID.json +++ b/resident/resident-service/src/test/resources/ID.json @@ -1,91 +1,91 @@ -{ - "status": "ACTIVATED", - "identity": { - "preferredLang": "eng", - "proofOfAddress": { - "value": "POA_Rental contract", - "type": "RNC", - "format": "jpg" - }, - "gender": [{ - "language": "eng", - "value": "Male" - }, { - "language": "ara", - "value": "الذكر" - }], - "city": [{ - "language": "eng", - "value": "Kenitra" - }, { - "language": "ara", - "value": "القنيطرة" - }], - "postalCode": "14025", - "fullName": [{ - "language": "eng", - "value": "Manoj" - }, { - "language": "ara", - "value": "Manoj" - }], - "dateOfBirth": "1996/01/01", - "referenceIdentityNumber": "2323232323232323", - "proofOfIdentity": { - "value": "POI_Passport", - "type": "DOC001", - "format": "jpg" - }, - "individualBiometrics": { - "format": "cbeff", - "version": 1.0, - "value": "applicant_bio_CBEFF" - }, - "IDSchemaVersion": 1.0, - "province": [{ - "language": "eng", - "value": "Kenitra" - }, { - "language": "ara", - "value": "القنيطرة" - }], - "phone": "8144203235", - "zone": [{ - "language": "eng", - "value": "Sidi Taibi" - }, { - "language": "ara", - "value": "سيدي الطيبي" - }], - "addressLine1": [{ - "language": "eng", - "value": "sdf" - }, { - "language": "ara", - "value": "sdf" - }], - "residenceStatus": [{ - "language": "eng", - "value": "Non-Foreigner" - }, { - "language": "ara", - "value": "غير أجنبي" - }], - "proofOfRelationship": { - "value": "POR_Passport", - "type": "DOC001", - "format": "jpg" - }, - "UIN": "3527812406", - "region": [{ - "language": "eng", - "value": "Rabat Sale Kenitra" - }, { - "language": "ara", - "value": "جهة الرباط سلا القنيطرة" - }], - "age": 23, - "email": "user@mail.com" - }, - "documents": null +{ + "status": "ACTIVATED", + "identity": { + "preferredLang": "eng", + "proofOfAddress": { + "value": "POA_Rental contract", + "type": "RNC", + "format": "jpg" + }, + "gender": [{ + "language": "eng", + "value": "Male" + }, { + "language": "ara", + "value": "الذكر" + }], + "city": [{ + "language": "eng", + "value": "Kenitra" + }, { + "language": "ara", + "value": "القنيطرة" + }], + "postalCode": "14025", + "fullName": [{ + "language": "eng", + "value": "Manoj" + }, { + "language": "ara", + "value": "Manoj" + }], + "dateOfBirth": "1996/01/01", + "referenceIdentityNumber": "2323232323232323", + "proofOfIdentity": { + "value": "POI_Passport", + "type": "DOC001", + "format": "jpg" + }, + "individualBiometrics": { + "format": "cbeff", + "version": 1.0, + "value": "applicant_bio_CBEFF" + }, + "IDSchemaVersion": 1.0, + "province": [{ + "language": "eng", + "value": "Kenitra" + }, { + "language": "ara", + "value": "القنيطرة" + }], + "phone": "8144203235", + "zone": [{ + "language": "eng", + "value": "Sidi Taibi" + }, { + "language": "ara", + "value": "سيدي الطيبي" + }], + "addressLine1": [{ + "language": "eng", + "value": "sdf" + }, { + "language": "ara", + "value": "sdf" + }], + "residenceStatus": [{ + "language": "eng", + "value": "Non-Foreigner" + }, { + "language": "ara", + "value": "غير أجنبي" + }], + "proofOfRelationship": { + "value": "POR_Passport", + "type": "DOC001", + "format": "jpg" + }, + "UIN": "3527812406", + "region": [{ + "language": "eng", + "value": "Rabat Sale Kenitra" + }, { + "language": "ara", + "value": "جهة الرباط سلا القنيطرة" + }], + "age": 23, + "email": "user@mail.com" + }, + "documents": null } \ No newline at end of file diff --git a/resident/resident-service/src/test/resources/IdentityMapping.json b/resident/resident-service/src/test/resources/IdentityMapping.json index 5ebbb10b5f8..59dc2648728 100644 --- a/resident/resident-service/src/test/resources/IdentityMapping.json +++ b/resident/resident-service/src/test/resources/IdentityMapping.json @@ -1,208 +1,208 @@ -{ - "identity":{ - "preferredLang": { - "value": "preferredLang", - "provider": "eng" - }, - "IDSchemaVersion":{ - "value":"IDSchemaVersion", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "name":{ - "value":"firstName,lastName,middleName", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ], - "isMandatory":true - }, - "gender":{ - "value":"gender", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ], - "isMandatory":true - }, - "dob":{ - "value":"dateOfBirth", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ], - "isMandatory":true - }, - "age":{ - "value":"age", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "parentOrGuardianRID":{ - "value":"parentOrGuardianRID", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "parentOrGuardianUIN":{ - "value":"parentOrGuardianUIN", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "parentOrGuardianName":{ - "value":"parentOrGuardianName", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "address":{ - "value":"addressLine1,addressLine2,addressLine3,region,province,postalCode", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "city":{ - "value":"city", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "blood_group_update":{ - "value":"blood_group", - "provider":[ - "source:REGISTRATION_CLIENT,process:UPDATE", - "source:RESIDENT,process:RES_UPDATE" - ] - }, - "blood_group_record":{ - "value":"blood_group", - "provider":[ - "source:IDREPO,process:current_record" - ] - }, - "phone":{ - "value":"phone", - "provider":[ - "source:RESIDENT,process:RES_CORRECTION", - "source:REGISTRATION_CLIENT,process:CORRECTION|NEW|UPDATE", - "source:RESIDENT,process:RES_UPDATE" - ] - }, - "phone_user_provided":{ - "value":"phone", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE", - "source:RESIDENT,process:RES_UPDATE", - "source:REGISTRATION_CLIENT,process:LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_REPRINT" - ] - }, - "phone_validation_source":{ - "value":"phone", - "provider":[ - "source:CNIE,process:CORRECTION2|CORRECTION1|VALIDATION" - ] - }, - "email":{ - "value":"email", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "localAdministrativeAuthority":{ - "value":"localAdministrativeAuthority", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "uin":{ - "value":"UIN", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "individualBiometrics":{ - "value":"individualBiometrics", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "parentOrGuardianBiometrics":{ - "value":"parentOrGuardianBiometrics", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "individualAuthBiometrics":{ - "value":"individualAuthBiometrics", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - } - }, - "metaInfo":{ - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "audits":{ - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "documents":{ - "poa":{ - "value":"proofOfAddress", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "poi":{ - "value":"proofOfIdentity", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "por":{ - "value":"proofOfRelationship", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "pob":{ - "value":"proofOfDateOfBirth", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - }, - "poe":{ - "value":"proofOfException", - "provider":[ - "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", - "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" - ] - } - } -} +{ + "identity":{ + "preferredLang": { + "value": "preferredLang", + "provider": "eng" + }, + "IDSchemaVersion":{ + "value":"IDSchemaVersion", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "name":{ + "value":"firstName,lastName,middleName", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ], + "isMandatory":true + }, + "gender":{ + "value":"gender", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ], + "isMandatory":true + }, + "dob":{ + "value":"dateOfBirth", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ], + "isMandatory":true + }, + "age":{ + "value":"age", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "parentOrGuardianRID":{ + "value":"parentOrGuardianRID", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "parentOrGuardianUIN":{ + "value":"parentOrGuardianUIN", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "parentOrGuardianName":{ + "value":"parentOrGuardianName", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "address":{ + "value":"addressLine1,addressLine2,addressLine3,region,province,postalCode", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "city":{ + "value":"city", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "blood_group_update":{ + "value":"blood_group", + "provider":[ + "source:REGISTRATION_CLIENT,process:UPDATE", + "source:RESIDENT,process:RES_UPDATE" + ] + }, + "blood_group_record":{ + "value":"blood_group", + "provider":[ + "source:IDREPO,process:current_record" + ] + }, + "phone":{ + "value":"phone", + "provider":[ + "source:RESIDENT,process:RES_CORRECTION", + "source:REGISTRATION_CLIENT,process:CORRECTION|NEW|UPDATE", + "source:RESIDENT,process:RES_UPDATE" + ] + }, + "phone_user_provided":{ + "value":"phone", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE", + "source:RESIDENT,process:RES_UPDATE", + "source:REGISTRATION_CLIENT,process:LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_REPRINT" + ] + }, + "phone_validation_source":{ + "value":"phone", + "provider":[ + "source:CNIE,process:CORRECTION2|CORRECTION1|VALIDATION" + ] + }, + "email":{ + "value":"email", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "localAdministrativeAuthority":{ + "value":"localAdministrativeAuthority", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "uin":{ + "value":"UIN", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "individualBiometrics":{ + "value":"individualBiometrics", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "parentOrGuardianBiometrics":{ + "value":"parentOrGuardianBiometrics", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "individualAuthBiometrics":{ + "value":"individualAuthBiometrics", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + } + }, + "metaInfo":{ + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "audits":{ + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "documents":{ + "poa":{ + "value":"proofOfAddress", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "poi":{ + "value":"proofOfIdentity", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "por":{ + "value":"proofOfRelationship", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "pob":{ + "value":"proofOfDateOfBirth", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + }, + "poe":{ + "value":"proofOfException", + "provider":[ + "source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST", + "source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|RES_REPRINT" + ] + } + } +} diff --git a/resident/resident-service/src/test/resources/amr-acr-mapping.json b/resident/resident-service/src/test/resources/amr-acr-mapping.json new file mode 100644 index 00000000000..e6802646629 --- /dev/null +++ b/resident/resident-service/src/test/resources/amr-acr-mapping.json @@ -0,0 +1,14 @@ +{ + "amr" : { + "PIN" : [{ "type": "PIN" }], + "OTP" : [{ "type": "OTP" }], + "Wallet" : [{ "type": "WLA" }], + "L1-bio-device" : [{ "type": "BIO", "count": 1 }] + }, + "acr_amr" : { + "mosip:idp:acr:static-code" : ["PIN"], + "mosip:idp:acr:generated-code" : ["OTP"], + "mosip:idp:acr:linked-wallet" : [ "Wallet" ], + "mosip:idp:acr:biometrics" : [ "L1-bio-device" ] + } +} diff --git a/resident/resident-service/src/test/resources/application.properties b/resident/resident-service/src/test/resources/application.properties index aa7f5fac990..96363f628de 100644 --- a/resident/resident-service/src/test/resources/application.properties +++ b/resident/resident-service/src/test/resources/application.properties @@ -1,232 +1,511 @@ -#--------------ID and Version -------------- -auth.internal.id=mosip.identity.auth.internal -auth.internal.version=1.0 -mosip.registration.processor.print.id=mosip.registration.print -mosip.registration.processor.application.version=1.0 -vid.create.id=mosip.vid.create -resident.vid.version=v1 -resident.vid.id=mosip.resident.vid -vid.revoke.id=vid.revoke.id -resident.revokevid.id=mosip.resident.vidstatus -auth.type.status.id=mosip.identity.authtype.status.update -mosip.mandatory-languages=eng -mosip.optional-languages=ara -mosip.notification.language-type=both -resident.notification.emails=user@mail.com -resident.notification.message=Notification has been sent to the provided contact detail(s) -config.server.file.storage.uri=https://dev.mosip.net/config/resident/mz/develop/ -registration.processor.identityjson=identity-mapping.json - -resident.update-uin.machine-name-prefix = resident_machine_ -resident.update-uin.machine-spec-id = 1001 -resident.update-uin.machine-zone-code = MOR - -resident.authlock.id=mosip.resident.authlock -resident.checkstatus.id=mosip.resident.checkstatus -resident.euin.id=mosip.resident.euin -resident.printuin.id=mosip.resident.printuin -resident.uin.id=mosip.resident.uin -resident.rid.id=mosip.resident.rid -resident.updateuin.id=mosip.resident.updateuin -resident.authunlock.id=mosip.resident.authunlock -resident.authhistory.id=mosip.resident.authhistory -mosip.resident.service.status.check.id=mosip.registration.status -mosip.resident.service.status.check.version=1.0 -resident.datetime.pattern=yyyy-MM-dd'T'HH:mm:ss.SSS'Z' -auth.types.allowed=otp,bio-FIR,bio-IIR,bio-FACE -resident.center.id=10008 -resident.machine.id=20007 -PARTNER_REFERENCE_Id=mpartner-default-print -DECRYPT_API_URL=https://qa.mosip.net/v1/keymanager/decrypt -APPLICATION_Id=RESIDENT -mosip.kernel.pdf_owner_password=123456 -#-----------------------------RID Properties--------------------------------------- -# length of the rid -mosip.kernel.rid.length=29 -# length of the timestamp -mosip.kernel.rid.timestamp-length=14 -# rid sequence max digits -mosip.kernel.rid.sequence-length=5 - -# Upper bound of number of digits in sequence allowed in id. For example if -# limit is 3, then 12 is allowed but 123 is not allowed in id (in both -# ascending and descending order) -mosip.kernel.tokenid.sequence-limit=3 - -#-----------------------------VID Properties-------------------------------------- -# length of the vid -mosip.kernel.vid.length=16 - -# Upper bound of number of digits in sequence allowed in id. For example if -# limit is 3, then 12 is allowed but 123 is not allowed in id (in both -# ascending and descending order) -# to disable sequence limit validation assign 0 or negative value -mosip.kernel.vid.length.sequence-limit=3 - -# Number of digits in repeating block allowed in id. For example if limit is 2, -# then 4xxx4 is allowed but 48xxx48 is not allowed in id (x is any digit) -# to disable repeating block validation assign 0 or negative value -mosip.kernel.vid.length.repeating-block-limit=2 - - -# Lower bound of number of digits allowed in between two repeating digits in -# id. For example if limit is 2, then 11 and 1x1 is not allowed in id (x is any digit) -# to disable repeating limit validation, assign 0 or negative value -mosip.kernel.vid.length.repeating-limit=2 - -# list of number that id should not be start with -# to disable null -mosip.kernel.vid.not-start-with=0,1 - -#restricted numbers for vid -mosip.kernel.vid.restricted-numbers=786,666 - -#-----------------------------UIN Properties-------------------------------------- -#length of the uin -mosip.kernel.uin.length=10 -#minimum threshold of unused uin -mosip.kernel.uin.min-unused-threshold=200000 -#number of uins to generate -mosip.kernel.uin.uins-to-generate=500000 -#restricted numbers for uin -mosip.kernel.uin.restricted-numbers=786,666 - -# Upper bound of number of digits in sequence allowed in id. For example if -# limit is 3, then 12 is allowed but 123 is not allowed in id (in both -# ascending and descending order) -# to disable sequence limit validation assign 0 or negative value -mosip.kernel.uin.length.sequence-limit=3 - -# Number of digits in repeating block allowed in id. For example if limit is 2, -# then 4xxx4 is allowed but 48xxx48 is not allowed in id (x is any digit) -#to disable validation assign zero or negative value -mosip.kernel.uin.length.repeating-block-limit=2 - -# Lower bound of number of digits allowed in between two repeating digits in -# id. For example if limit is 2, then 11 and 1x1 is not allowed in id (x is any digit) -# to disable repeating limit validation, assign 0 or negative value -mosip.kernel.uin.length.repeating-limit=2 - -#reverse group digit limit for uin filter -mosip.kernel.uin.length.reverse-digits-limit=5 - -#group digit limit for uin filter -mosip.kernel.uin.length.digits-limit=5 - -#should not start with -mosip.kernel.uin.not-start-with=0,1 - -#adjacent even digit limit for uin filter -mosip.kernel.uin.length.conjugative-even-digits-limit=3 -mosip.kernel.crypto.asymmetric-algorithm-name=RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING -#Crypto symmetric algorithm name -mosip.kernel.crypto.symmetric-algorithm-name=AES/GCM/PKCS5Padding -#Keygenerator asymmetric algorithm name -mosip.kernel.keygenerator.asymmetric-algorithm-name=RSA -#Keygenerator symmetric algorithm name -mosip.kernel.keygenerator.symmetric-algorithm-name=AES -#Asymmetric algorithm key length -mosip.kernel.keygenerator.asymmetric-key-length=2048 -#Symmetric algorithm key length -mosip.kernel.keygenerator.symmetric-key-length=256 -#Keygenerator symmetric algorithm name -# keygenerator asymmetric algorithm name -#Encrypted data and encrypted symmetric key separator -mosip.kernel.data-key-splitter=#KEY_SPLITTER# -#GCM tag length -mosip.kernel.crypto.gcm-tag-length=128 -#Hash algo name -mosip.kernel.crypto.hash-algorithm-name=PBKDF2WithHmacSHA512 -#Symmtric key length used in hash -mosip.kernel.crypto.hash-symmetric-key-length=256 -#No of iterations in hash -mosip.kernel.crypto.hash-iteration=100000 -#Sign algo name -mosip.kernel.crypto.sign-algorithm-name=SHA512withRSA - -mosip.kernel.keymanager-service-publickey-url=${mosip.base.url}/v1/keymanager/publickey/{applicationId} -mosip.kernel.keymanager-service-decrypt-url=${mosip.base.url}/v1/keymanager/decrypt -mosip.kernel.keymanager-service-auth-decrypt-url=${mosip.base.url}/v1/keymanager/auth/decrypt -mosip.kernel.keymanager-service-sign-url=${mosip.base.url}/v1/keymanager/sign -mosip.sign.applicationid=KERNEL -mosip.sign.refid=SIGN -mosip.kernel.cryptomanager.request_id=CRYPTOMANAGER.REQUEST -mosip.kernel.cryptomanager.request_version=v1.0 -mosip.kernel.signature.signature-request-id=SIGNATURE.REQUEST -mosip.kernel.signature.signature-version-id=v1.0 - -#----------------------config data--------------------- -#--------------URI-------------------------- -#Base url -mosip.base.url=https://qa.mosip.net - -auth.server.validate.url=https://qa.mosip.net/v1/authmanager/authorize/admin/validateToken -auth.server.admin.validate.url=https://qa.mosip.net/v1/authmanager/authorize/admin/validateToken -IDSchema.Version=0.1 -id.repo.update=mosip.id.update -#mosip.registration.processor.registration.sync.id=mosip.registration.sync -id.repo.vidType=Perpetual -provider.packetwriter.resident=source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketReaderImpl -mosip.kernel.registrationcenterid.length=5 -mosip.kernel.machineid.length=5 -packet.manager.account.name=PACKET_MANAGER_ACCOUNT -objectstore.crypto.name=OnlinePacketCryptoServiceImpl -mosip.commons.packetnames=id,evidence,optional -mosip.kernel.masterdata.audit-url=https://qa.mosip.net/v1/auditmanager/audits - -mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter - -spring.cloud.config.uri=localhost -spring.cloud.config.label=develop -spring.profiles.active=mz -spring.cloud.config.name=application,resident -spring.application.name=resident -management.endpoint.health.show-details=always -management.endpoints.web.exposure.include=info,health,refresh -resident.service=resident -server.port=8099 -server.servlet.path=/resident/v1 -health.config.enabled=false - -crypto.PrependThumbprint.enable=true - -mosip.registration.processor.grace.period=10800 -# writer -provider.packetwriter.mosip=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketWriterImpl -# can be OnlinePacketCryptoServiceImpl OR OfflinePacketCryptoServiceImpl - -default.provider.version=v1.0 - -mosip.kernel.mispid.length = 3 - -uin_database_url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 -uin_database_username=sa -uin_database_password=sa - -javax.persistence.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 -javax.persistence.jdbc.driver=org.h2.Driver -javax.persistence.jdbc.user=sa -javax.persistence.jdbc.password=sa -hibernate.ddl-auto=update -hibernate.temp.use_jdbc_metadata_defaults = false -hibernate.dialect = org.hibernate.dialect.H2Dialect - -#Swagger 3.0 -openapi.info.title=Resident Service API documentation -openapi.info.description=Resident Service API documentation -openapi.info.version=1.0 -openapi.info.license.name=Mosip -openapi.info.license.url=https://docs.mosip.io/platform/license - -------OpenApi properties-------- -mosipbox.public.url=https://dev2.mosip.net -openapi.residentServiceServer.servers[0].url=${mosipbox.public.url}/resident/v1 -openapi.residentServiceServer.servers[0].description=Resident Service - -mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip'} - -# URL to get new Auth Token from OIDC provider & to do online validation of auth token with OIDC provider. -auth.server.admin.issuer.uri=${mosipbox.public.url}/keycloak/auth/realms/ -mosip.iam.adapter.clientid=mosip-resident-client -mosip.iam.adapter.clientsecret=abc123 -mosip.iam.adapter.appid=resident +#--------------ID and Version -------------- +mosip.resident.vid-policy-url= +auth.allowed.urls= +mosip.iam.module.clientid= +mosip.iam.module.clientsecret= +mosip.iam.module.redirecturi= +mosip.iam.authorization_endpoint= +mosip.iam.module.admin_realm_id= +mosip.iam.token_endpoint= +auth.internal.id=mosip.identity.auth.internal +auth.internal.version=1.0 +mosip.registration.processor.print.id=mosip.registration.print +mosip.registration.processor.application.version=1.0 +vid.create.id=mosip.vid.create +resident.vid.version=v1 +resident.vid.version.new=1.0 +resident.revokevid.version.new=1.0 +resident.vid.id.generate=mosip.resident.vid.generate +mosip.resident.revokevid.id=mosip.resident.vid.revoke +resident.vid.id=mosip.resident.vid +vid.revoke.id=vid.revoke.id +resident.revokevid.id=mosip.resident.vidstatus +auth.type.status.id=mosip.identity.authtype.status.update +mosip.mandatory-languages=eng +mosip.optional-languages=ara +mosip.notification.language-type=both +resident.notification.emails=user@mail.com +resident.notification.message=Notification has been sent to the provided contact detail(s) +config.server.file.storage.uri=https://dev.mosip.net/config/resident/mz/develop/ +registration.processor.identityjson=identity-mapping.json +resident.ui.properties.id=resident.ui.properties +resident.ui.properties.version=1.0 +resident.channel.verification.status.id=mosip.resident.channel.verification.status +resident.channel.verification.status.version=1.0 +resident.event.ack.download.id=mosip.resident.event.ack.download +resident.event.ack.download.version=1.0 +resident.download.card.eventid.id =mosip.resident.download.card.eventid +resident.download.card.eventid.version=1.0 +mosip.resident.checkstatus.individualid.id=mosip.resident.check-stage-status +resident.version.new=1.0 +mosip.resident.api.id.otp.request=mosip.identity.otp.internal +mosip.resident.identity.auth.internal.id=mosip.identity.auth.internal + + +# Identity Mapping JSON file name +identity-mapping-file-name=identity-mapping.json +# IDA Mapping JSON file URI +identity-mapping-file-url=${config.server.file.storage.uri}${identity-mapping-file-name} +# Identity Mapping JSON file property source +identity-mapping-file-source=url:${identity-mapping-file-url} + + +resident.update-uin.machine-name-prefix = resident_machine_ +resident.update-uin.machine-spec-id = 1001 +resident.update-uin.machine-zone-code = MOR + +resident.authlock.id=mosip.resident.authlock +resident.checkstatus.id=mosip.resident.checkstatus +resident.checkstatus.version=v1 +resident.euin.id=mosip.resident.euin +resident.printuin.id=mosip.resident.printuin +resident.uin.id=mosip.resident.uin +resident.rid.id=mosip.resident.rid +resident.updateuin.id=mosip.resident.updateuin +resident.authunlock.id=mosip.resident.authunlock +resident.authhistory.id=mosip.resident.authhistory +mosip.resident.service.status.check.id=mosip.registration.status +mosip.resident.service.status.check.version=1.0 +resident.datetime.pattern=yyyy-MM-dd'T'HH:mm:ss.SSS'Z' +resident.filename.datetime.pattern=yyyy-MM-dd_HH-mm-ss +resident.ui.datetime.pattern=yyyy-MM-dd HH:mm:ss +auth.types.allowed=otp,bio-FIR,bio-IIR,bio-FACE +resident.center.id=10008 +resident.machine.id=20007 +PARTNER_REFERENCE_Id=mpartner-default-print +DECRYPT_API_URL=https://qa.mosip.net/v1/keymanager/decrypt +APPLICATION_Id=RESIDENT +mosip.kernel.pdf_owner_password=123456 +resident.attribute.names.without.documents.required=preferredLanguage,email,phone +#-----------------------------RID Properties--------------------------------------- +# length of the rid +mosip.kernel.rid.length=29 +# length of the timestamp +mosip.kernel.rid.timestamp-length=14 +# rid sequence max digits +mosip.kernel.rid.sequence-length=5 + +# Upper bound of number of digits in sequence allowed in id. For example if +# limit is 3, then 12 is allowed but 123 is not allowed in id (in both +# ascending and descending order) +mosip.kernel.tokenid.sequence-limit=3 + +#-----------------------------VID Properties-------------------------------------- +# length of the vid +mosip.kernel.vid.length=16 + +# Upper bound of number of digits in sequence allowed in id. For example if +# limit is 3, then 12 is allowed but 123 is not allowed in id (in both +# ascending and descending order) +# to disable sequence limit validation assign 0 or negative value +mosip.kernel.vid.length.sequence-limit=3 + +# Number of digits in repeating block allowed in id. For example if limit is 2, +# then 4xxx4 is allowed but 48xxx48 is not allowed in id (x is any digit) +# to disable repeating block validation assign 0 or negative value +mosip.kernel.vid.length.repeating-block-limit=2 + + +# Lower bound of number of digits allowed in between two repeating digits in +# id. For example if limit is 2, then 11 and 1x1 is not allowed in id (x is any digit) +# to disable repeating limit validation, assign 0 or negative value +mosip.kernel.vid.length.repeating-limit=2 + +# list of number that id should not be start with +# to disable null +mosip.kernel.vid.not-start-with=0,1 + +#restricted numbers for vid +mosip.kernel.vid.restricted-numbers=786,666 + +#Validation properties +resident.grievance-redressal.alt-email.chars.limit=128 +resident.grievance-redressal.alt-phone.chars.limit=64 +resident.grievance-redressal.comments.chars.limit=1024 +resident.share-credential.purpose.chars.limit=1024 +mosip.resident.eventid.searchtext.length=16 +mosip.kernel.uin.length=10 +mosip.kernel.vid.length=16 +mosip.kernel.rid.length=29 +mosip.resident.eid.length=16 +mosip.kernel.otp.default-length=6 +resident.message.allowed.special.char.regex=^[A-Za-z0-9 .,-]+$ +resident.purpose.allowed.special.char.regex=^[A-Za-z0-9 .,-]+$ +resident.id.allowed.special.char.regex=^[0-9]+$ + +#-----------------------------UIN Properties-------------------------------------- +#length of the uin +mosip.kernel.uin.length=10 +#minimum threshold of unused uin +mosip.kernel.uin.min-unused-threshold=200000 +#number of uins to generate +mosip.kernel.uin.uins-to-generate=500000 +#restricted numbers for uin +mosip.kernel.uin.restricted-numbers=786,666 + +# Upper bound of number of digits in sequence allowed in id. For example if +# limit is 3, then 12 is allowed but 123 is not allowed in id (in both +# ascending and descending order) +# to disable sequence limit validation assign 0 or negative value +mosip.kernel.uin.length.sequence-limit=3 + +# Number of digits in repeating block allowed in id. For example if limit is 2, +# then 4xxx4 is allowed but 48xxx48 is not allowed in id (x is any digit) +#to disable validation assign zero or negative value +mosip.kernel.uin.length.repeating-block-limit=2 + +# Lower bound of number of digits allowed in between two repeating digits in +# id. For example if limit is 2, then 11 and 1x1 is not allowed in id (x is any digit) +# to disable repeating limit validation, assign 0 or negative value +mosip.kernel.uin.length.repeating-limit=2 + +#reverse group digit limit for uin filter +mosip.kernel.uin.length.reverse-digits-limit=5 + +#group digit limit for uin filter +mosip.kernel.uin.length.digits-limit=5 + +#should not start with +mosip.kernel.uin.not-start-with=0,1 + +#adjacent even digit limit for uin filter +mosip.kernel.uin.length.conjugative-even-digits-limit=3 +mosip.kernel.crypto.asymmetric-algorithm-name=RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING +#Crypto symmetric algorithm name +mosip.kernel.crypto.symmetric-algorithm-name=AES/GCM/PKCS5Padding +#Keygenerator asymmetric algorithm name +mosip.kernel.keygenerator.asymmetric-algorithm-name=RSA +#Keygenerator symmetric algorithm name +mosip.kernel.keygenerator.symmetric-algorithm-name=AES +#Asymmetric algorithm key length +mosip.kernel.keygenerator.asymmetric-key-length=2048 +#Symmetric algorithm key length +mosip.kernel.keygenerator.symmetric-key-length=256 +#Keygenerator symmetric algorithm name +# keygenerator asymmetric algorithm name +#Encrypted data and encrypted symmetric key separator +mosip.kernel.data-key-splitter=#KEY_SPLITTER# +#GCM tag length +mosip.kernel.crypto.gcm-tag-length=128 +#Hash algo name +mosip.kernel.crypto.hash-algorithm-name=PBKDF2WithHmacSHA512 +#Symmtric key length used in hash +mosip.kernel.crypto.hash-symmetric-key-length=256 +#No of iterations in hash +mosip.kernel.crypto.hash-iteration=100000 +#Sign algo name +mosip.kernel.crypto.sign-algorithm-name=SHA512withRSA + +mosip.kernel.keymanager-service-publickey-url=${mosip.base.url}/v1/keymanager/publickey/{applicationId} +mosip.kernel.keymanager-service-decrypt-url=${mosip.base.url}/v1/keymanager/decrypt +mosip.kernel.keymanager-service-auth-decrypt-url=${mosip.base.url}/v1/keymanager/auth/decrypt +mosip.kernel.keymanager-service-sign-url=${mosip.base.url}/v1/keymanager/sign +mosip.sign.applicationid=KERNEL +mosip.sign.refid=SIGN +mosip.kernel.cryptomanager.request_id=CRYPTOMANAGER.REQUEST +mosip.kernel.cryptomanager.request_version=v1.0 +mosip.kernel.signature.signature-request-id=SIGNATURE.REQUEST +mosip.kernel.signature.signature-version-id=v1.0 + +#----------------------config data--------------------- +#--------------URI-------------------------- +#Base url +mosip.base.url=https://qa.mosip.net + +auth.server.validate.url=https://qa.mosip.net/v1/authmanager/authorize/admin/validateToken +auth.server.admin.validate.url=https://qa.mosip.net/v1/authmanager/authorize/admin/validateToken +IDSchema.Version=0.1 +id.repo.update=mosip.id.update +#mosip.registration.processor.registration.sync.id=mosip.registration.sync +id.repo.vidType=Perpetual +provider.packetwriter.resident=source:RESIDENT,process:ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketReaderImpl +mosip.kernel.registrationcenterid.length=5 +mosip.kernel.machineid.length=5 +packet.manager.account.name=PACKET_MANAGER_ACCOUNT +objectstore.crypto.name=OnlinePacketCryptoServiceImpl +mosip.commons.packetnames=id,evidence,optional +mosip.kernel.masterdata.audit-url=https://qa.mosip.net/v1/auditmanager/audits + +mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter + +spring.cloud.config.uri=localhost +spring.cloud.config.label=develop +spring.profiles.active=mz +spring.cloud.config.name=application,resident +spring.application.name=resident +management.endpoint.health.show-details=always +management.endpoints.web.exposure.include=info,health,refresh +resident.service=resident +server.port=8099 +server.servlet.path=/resident/v1 +health.config.enabled=false + +crypto.PrependThumbprint.enable=true + +mosip.registration.processor.grace.period=10800 +# writer +provider.packetwriter.mosip=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketWriterImpl +# can be OnlinePacketCryptoServiceImpl OR OfflinePacketCryptoServiceImpl + +default.provider.version=v1.0 + +mosip.kernel.mispid.length = 3 + +uin_database_url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 +uin_database_username=sa +uin_database_password=sa + +javax.persistence.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 +javax.persistence.jdbc.driver=org.h2.Driver +javax.persistence.jdbc.user=sa +javax.persistence.jdbc.password=sa +hibernate.ddl-auto=update +hibernate.temp.use_jdbc_metadata_defaults = false +hibernate.dialect = org.hibernate.dialect.H2Dialect + +#Swagger 3.0 +openapi.info.title=Resident Service API documentation +openapi.info.description=Resident Service API documentation +openapi.info.version=1.0 +openapi.info.license.name=Mosip +openapi.info.license.url=https://docs.mosip.io/platform/license + +------OpenApi properties-------- +mosipbox.public.url=https://dev2.mosip.net +openapi.residentServiceServer.servers[0].url=${mosipbox.public.url}/resident/v1 +openapi.residentServiceServer.servers[0].description=Resident Service + +mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip'} + +# URL to get new Auth Token from OIDC provider & to do online validation of auth token with OIDC provider. +auth.server.admin.issuer.uri=${mosipbox.public.url}/keycloak/auth/realms/ +mosip.iam.adapter.clientid=mosip-resident-client +mosip.iam.adapter.clientsecret=abc123 +mosip.iam.adapter.appid=resident + +auth.allowed.urls=https://localhost/ + +# IAM +mosip.iam.module.login_flow.name=authorization_code +mosip.iam.module.clientID=${mosip.iam.adapter.clientid} +mosip.iam.module.clientsecret=${mosip.iam.adapter.clientsecret} +mosip.iam.module.redirecturi=http://localhost/resident/v1/login-redirect/ +#mosip.iam.module.redirecturi=${tempuri}/v1/admin/login-redirect/ +#mosip.iam.module.login_flow.scope=cls +mosip.iam.module.login_flow.scope=email +mosip.iam.module.login_flow.response_type=code +mosip.iam.authorization_endpoint=http://localhost/keycloak/auth/realms/mosip/protocol/openid-connect/auth +mosip.iam.module.admin_realm_id=mosip +mosip.iam.token_endpoint=http://localhost/keycloak/auth/realms/mosip/protocol/openid-connect/token +mosip.iam.userinfo_endpoint=http://localhost/keycloak/auth/realms/mosip/protocol/openid-connect/userinfo + + +# Resident UI Schema JSON file name +resident-ui-schema-file-name-prefix=resident-ui +# IDA Mapping JSON file URI +resident-ui-schema-file-url=${resident-ui-schema-file-name-prefix} +# Resident UI Schema JSON file property source +resident-ui-schema-file-source-prefix=classpath:${resident-ui-schema-file-url} + + + +mosip.resident.identity.claim.individual-id=individual_id +mosip.resident.identity.claim.ida-token=ida_token + +mosip.role.resident.getinputattributevalues=INDIVIDUAL,REISTERED_INDIVIDUAL + + +#--------------------------------TokenId generator---------------------------------------------------# +mosip.kernel.tokenid.uin.salt=zHuDEAbmbxiUbUShgy6pwUhKh9DE0EZn9kQDKPPKbWscGajMwf +mosip.kernel.tokenid.partnercode.salt=yS8w5Wb6vhIKdf1msi4LYTJks7mqkbmITk2O63Iq8h0bkRlD0d +mosip.kernel.tokenid.length=36 +#----------------------------------------------------------------------------------------------------# + +ida.online-verification-partner-id=mpartner-default-auth + + +mosip.pms-partner-manager-service.url=https://dev.mosip.net +mosip.pms.pmp.partner.rest.uri=${mosip.pms-partner-manager-service.url}/v1/partnermanager/partners?partnerType=Online_Verification_Partner + + +websub.hub.url=${mosipbox.public.url}/hub +websub.publish.url=${mosipbox.public.url}/publish + +resident.websub.authtype-status.secret=abc123 +resident.websub.authtype-status.topic=AUTH_TYPE_STATUS_UPDATE_ACK +resident.websub.callback.authtype-status.relative.url=resident/v1/callback/authTypeCallback/${PARTNER_REFERENCE_Id} +resident.websub.callback.authtype-status.url=${mosipbox.public.url}${resident.websub.callback.authtype-status.relative.url} + +server.servlet.context-path=/resident/v1 +resident.websub.authTransaction-status.secret=gy6pwUhKh9DE0EZn9kQDKP +resident.websub.authTransaction-status.topic=AUTHENTICATION_TRANSACTION_STATUS +resident.websub.callback.authTransaction-status.relative.url=${server.servlet.context-path}/callback/authTransaction/${ida.online-verification-partner-id} +resident.websub.callback.authTransaction-status.url=${mosipbox.public.url}${resident.websub.callback.authTransaction-status.relative.url} + +# WebSub Topic and callback propertis for regproc complete workflow event +resident.websub.regproc.workflow.complete.secret=gy6pwUhKh9DE0EZn9kQDKP +mosip.regproc.workflow.complete.topic=REGISTRATION_PROCESSOR_WORKFLOW_COMPLETED_EVENT +resident.websub.callback.regproc.workflow.complete.relative.url=${server.servlet.context-path}/callback/regprocworkflow +resident.websub.callback.regproc.workflow.complete.url=${mosipbox.public.url}${resident.websub.callback.regproc.workflow.complete.relative.url} + + +resident.dateofbirth.pattern=yyyy/MM/dd + +resident.revokevid.version=v1 + +# Identity Data format MVEL file name +resident-data-format-mvel-file-name=credentialdata.mvel +resident-data-format-mvel-file-source=classpath:${resident-data-format-mvel-file-name} + +#Mask functions +resident.email.mask.function=maskEmail +resident.phone.mask.function=maskPhone + +resident.documents.category=individualBiometrics + +mosip.iam.certs_endpoint=https://localhost/certs + + +#Scopes +mosip.scope.resident.getinputattributevalues=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.patchrevokevid=${mosip.resident.identity.claim.individual-id},${mosip.resident.identity.claim.ida-token} +mosip.scope.resident.postgeneratevid=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getvids=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getAuthTransactions=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.postAuthTypeUnlock=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.postAuthTypeLock=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getAuthLockStatus=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.patchUpdateUin=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.postUploadDocuments=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getUploadedDocuments=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getCheckAidStatus=${mosip.resident.identity.claim.individual-id} + +mosip.scope.resident.postAuthTypeStatus=${mosip.resident.identity.claim.individual-id} +mosip.scope.resident.getServiceAuthHistoryRoles=${mosip.resident.identity.claim.individual-id} +mosip.resident.service.mock.pdf.url=https://uidai.gov.in/images/New_eAadhaar1.pdf + +mosip.scope.resident.postSendPhysicalCard=${mosip.resident.identity.claim.individual-id} +resident.service.unreadnotificationlist.id=mosip.resident.service.history.unread + +#order card payment +mosip.resident.order.card.payment.enabled=true + +resident.authLockStatusUpdateV2.id=mosip.resident.auth.lock.status.update +resident.authLockStatusUpdateV2.version=1.0 + +resident.service.history.id=mosip.service.history.get +resident.service.history.version=1.0 +resident.document.upload.id=mosip.resident.document.upload +resident.document.get.id=mosip.resident.document.get +resident.document.get.version=1.0 +resident.document.list.id=mosip.resident.document.list +resident.document.list.version=1.0 +resident.service.pin.status.id=mosip.resident.pin.status +resident.service.pin.status.version=v1 +resident.service.unpin.status.id=mosip.resident.unpin.status +resident.service.unpin.status.version=v1 +resident.document.delete.id=mosip.resident.document.delete +resident.document.delete.version=1.0 + +resident.service.event.id=mosip.resident.event.status +resident.service.event.version=1.0 +mosip.resident.transliteration.transliterate.id=mosip.resident.transliteration.transliterate +resident.data.mask.function=convertToMaskData + +mosip.notification.timezone=GMT+05:30 + +#templates for acknowledgement +resident.template.ack.share-cred-with-partner=acknowledgement-share-cred-with-partner +resident.template.ack.manage-my-vid=acknowledgement-manage-my-vid +resident.template.ack.order-a-physical-card=acknowledgement-order-a-physical-card +resident.template.ack.download-a-personalized-card=acknowledgement-download-a-personalized-card +resident.template.ack.update-demographic-data=acknowledgement-update-demographic-data +resident.template.ack.verify-email-id-or-phone-number=acknowledgement-verify-email-id-or-phone-number +resident.template.ack.secure-my-id=acknowledgement-secure-my-id + +resident.template.date.pattern=dd-MM-yyyy +resident.template.time.pattern=HH:mm:ss +resident.ui.track-service-request-url=https://resident.dev1.mosip.net/#/uinservices/trackservicerequest/ +mosip.resident.download-card.url=http://mosip/event/123455678 + +otpChannel.mobile=phone +otpChannel.email=email + +resident.contact.details.update.id=mosip.resident.contact.details.update.id +resident.contact.details.send.otp.id=mosip.resident.contact.details.send.otp.id +resident.identity.schematype=personalized-card + +resident.identity.info.id=mosip.resident.identity.info +resident.identity.info.version=1.0 +resident.share.credential.id=mosip.resident.share.credential +resident.share.credential.version=1.0 +mosip.resident.request.response.version=1.0 +mosip.resident.request.credential.credentialType=euin +mosip.resident.request.credential.isEncrypt=true +mosip.resident.request.credential.encryption.key=abc123 + +mosip.resident.create.vid.version=v1 +resident.vid.policy.id=mosip.resident.vid.policy +resident.vid.get.id=mosip.resident.vid.get +mosip.max.file.upload.size.in.bytes=2000000 +resident.service-history.download.max.count=100 + +resident.additional.identity.attribute.to.fetch=UIN,email,phone,dateOfBirth,fullName +auth.token.header=Authorization + +resident.batchjob.process.status.list=NEW,ISSUED,RECEIVED,PRINTING,FAILED +mosip.resident.keymanager.application-name=RESIDENT +mosip.resident.keymanager.reference-id=resident_document + +resident.document.validation.transaction-id.regex=^[0-9]{10}$ +resident.document.validation.document-id.regex=^[A-Za-z0-9-]{20,}$ +resident.validation.is-numeric.regex=^[0-9]+$ +resident.otp.validation.transaction-id.regex=^[0-9]{10}$ +resident.validation.event-id.regex=^[0-9]{16}$ + +resident.registration-centers.download.max.count=10 + +# amr-acr JSON file name +amr-acr.json.filename=amr-acr-mapping.json + +mosip.resident.authentication.mode.property=authenticationMode + +# WebSub Topic and callback propertis for auth type status event +mosip.api.internal.url=https://dev.mosip.net +resident.websub.credential-status-update.secret=dummypassword +resident.websub.credential-status.secret=${resident.websub.credential-status-update.secret} +resident.websub.credential-status.topic=AUTH_TYPE_STATUS_UPDATE_ACK +resident.websub.callback.credential-status.relative.url=${server.servlet.context-path}/callback/credentialStatusUpdate +resident.websub.callback.credential-status.url=${mosip.api.internal.url}${resident.websub.callback.credential-status.relative.url} + +idrepo-dummy-online-verification-partner-id=MOVP + +mosip.resident.download.card.naming.convention=Get_my_UIN +# Asyc Request Types +resident.async.request.types=VID_CARD_DOWNLOAD,ORDER_PHYSICAL_CARD,SHARE_CRED_WITH_PARTNER,UPDATE_MY_UIN + +#cache expiration time are in milliseconds. +resident.cache.expiry.time.millisec.templateCache=86400000 +resident.cache.expiry.time.millisec.partnerCache=86400000 +resident.cache.expiry.time.millisec.getValidDocumentByLangCode=86400000 +resident.cache.expiry.time.millisec.getLocationHierarchyLevelByLangCode=86400000 +resident.cache.expiry.time.millisec.getImmediateChildrenByLocCodeAndLangCode=86400000 +resident.cache.expiry.time.millisec.getLocationDetailsByLocCodeAndLangCode=86400000 +resident.cache.expiry.time.millisec.getCoordinateSpecificRegistrationCenters=86400000 +resident.cache.expiry.time.millisec.getApplicantValidDocument=86400000 +resident.cache.expiry.time.millisec.getRegistrationCentersByHierarchyLevel=86400000 +resident.cache.expiry.time.millisec.getRegistrationCenterByHierarchyLevelAndTextPaginated=86400000 +resident.cache.expiry.time.millisec.getRegistrationCenterWorkingDays=86400000 +resident.cache.expiry.time.millisec.getLatestIdSchema=86400000 +resident.cache.expiry.time.millisec.getGenderCodeByGenderTypeAndLangCode=86400000 +resident.cache.expiry.time.millisec.getDocumentTypesByDocumentCategoryAndLangCode=86400000 +resident.cache.expiry.time.millisec.getDynamicFieldBasedOnLangCodeAndFieldName=86400000 +resident.cache.expiry.time.millisec.getCenterDetails=86400000 +resident.cache.expiry.time.millisec.getImmediateChildrenByLocCode=86400000 +resident.cache.expiry.time.millisec.getLocationHierarchyLevels=86400000 +resident.cache.expiry.time.millisec.getAllDynamicFieldByName=86400000 + +mosip.resident.async-core-pool-size=100 +mosip.resident.async-max-pool-size=100 + +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/resident/resident-service/src/test/resources/bootstrap.properties b/resident/resident-service/src/test/resources/bootstrap.properties index 5d1abaa25b2..3fce6905a49 100644 --- a/resident/resident-service/src/test/resources/bootstrap.properties +++ b/resident/resident-service/src/test/resources/bootstrap.properties @@ -1,154 +1,155 @@ -spring.cloud.config.uri=localhost -spring.cloud.config.label=master -spring.cloud.config.name=master -spring.application.name=commons-packet-service -spring.profiles.active=test -management.endpoints.web.exposure.include=refresh -APPLICATION_Id=DATASHARE -PARTNER_REFERENCE_Id=mpartner-default-resident -DECRYPT_API_URL=https://dev.mosip.net/v1/keymanager/decrypt -KERNELENCRYPTIONSERVICE=https://dev.mosip.net/idauthentication/v1/internal/getCertificate -crypto.PrependThumbprint.enable=true -#management.security.enabled=false -#--------------ID and Version -------------- -auth.internal.id=mosip.identity.auth.internal -auth.internal.version=1.0 -mosip.registration.processor.print.id=mosip.registration.print -mosip.registration.processor.application.version=1.0 -vid.create.id=mosip.vid.create -resident.vid.version=v1 -resident.vid.id=mosip.resident.vid -vid.revoke.id=vid.revoke.id -resident.revokevid.id=mosip.resident.vidstatus -auth.type.status.id=mosip.identity.authtype.status.update -mosip.mandatory-languages=eng -mosip.optional-languages=ara -mosip.notificationtype=SMS|EMAIL -resident.notification.emails=user@mail.com -resident.notification.message=Notification has been sent to the provided contact detail(s) -config.server.file.storage.uri=http://localhost:8081 -resident.authlock.id=mosip.resident.authlock -resident.checkstatus.id=mosip.resident.checkstatus -resident.euin.id=mosip.resident.euin -resident.printuin.id=mosip.resident.printuin -resident.uin.id=mosip.resident.uin -resident.rid.id=mosip.resident.rid -resident.updateuin.id=mosip.resident.updateuin -resident.authunlock.id=mosip.resident.authunlock -resident.authhistory.id=mosip.resident.authhistory -mosip.resident.service.status.check.id=mosip.registration.status -mosip.resident.service.status.check.version=1.0 -resident.datetime.pattern=yyyy-MM-dd'T'HH:mm:ss.SSS'Z' -auth.types.allowed=otp,bio-FIR,bio-IIR,bio-FACE -resident.center.id=10008 -resident.machine.id=20007 - -mosip.kernel.rid.length=29 -mosip.kernel.rid.timestamp-length=14 -mosip.kernel.rid.sequence-length=5 -mosip.kernel.tokenid.sequence-limit=3 -mosip.kernel.vid.length=16 -mosip.kernel.vid.length.sequence-limit=3 -mosip.kernel.vid.length.repeating-block-limit=2 -mosip.kernel.vid.length.repeating-limit=2 -mosip.kernel.vid.not-start-with=0,1 -mosip.kernel.vid.restricted-numbers=786,666 -mosip.kernel.uin.length=10 -mosip.kernel.uin.min-unused-threshold=200000 -mosip.kernel.uin.uins-to-generate=500000 -mosip.kernel.uin.restricted-numbers=786,666 -mosip.kernel.uin.length.sequence-limit=3 -mosip.kernel.uin.length.repeating-block-limit=2 -mosip.kernel.uin.length.repeating-limit=2 -mosip.kernel.uin.length.reverse-digits-limit=5 -mosip.kernel.uin.length.digits-limit=5 -mosip.kernel.uin.not-start-with=0,1 -mosip.kernel.uin.length.conjugative-even-digits-limit=3 -mosip.kernel.crypto.asymmetric-algorithm-name=RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING -mosip.kernel.crypto.symmetric-algorithm-name=AES/GCM/PKCS5Padding -mosip.kernel.keygenerator.asymmetric-algorithm-name=RSA -mosip.kernel.keygenerator.symmetric-algorithm-name=AES -mosip.kernel.keygenerator.asymmetric-key-length=2048 -mosip.kernel.keygenerator.symmetric-key-length=256 -mosip.kernel.data-key-splitter=#KEY_SPLITTER# -mosip.kernel.crypto.gcm-tag-length=128 -mosip.kernel.crypto.hash-algorithm-name=PBKDF2WithHmacSHA512 -mosip.kernel.crypto.hash-symmetric-key-length=256 -mosip.kernel.crypto.hash-iteration=100000 -mosip.kernel.crypto.sign-algorithm-name=SHA512withRSA - -mosip.kernel.keymanager-service-publickey-url=${mosip.base.url}/v1/keymanager/publickey/{applicationId} -mosip.kernel.keymanager-service-decrypt-url=${mosip.base.url}/v1/keymanager/decrypt -mosip.kernel.keymanager-service-auth-decrypt-url=${mosip.base.url}/v1/keymanager/auth/decrypt -mosip.kernel.keymanager-service-sign-url=${mosip.base.url}/v1/keymanager/sign -mosip.sign.applicationid=KERNEL -mosip.sign.refid=SIGN -mosip.kernel.cryptomanager.request_id=CRYPTOMANAGER.REQUEST -mosip.kernel.cryptomanager.request_version=v1.0 -mosip.kernel.signature.signature-request-id=SIGNATURE.REQUEST -mosip.kernel.signature.signature-version-id=v1.0 - - - -#-------------REMOVE THIS ------------------------------------------------------------- -#-------------TOKEN GENERATION---------------- -#Token generation request id -token.request.id=io.mosip.resident -#Token generation app id -resident.appid=ida -#Token generation version -token.request.version=1.0 -# Kernel auth client ID for IDA -resident.clientId=ida_app_user -# Kernel auth secret key for IDA -resident.secretKey=5debb60adbfcf8feea4a6ed6160092ec -regprc.appid=registrationprocessor -regprc.clientId=regproc_app_user -regprc.secretKey=80565e06e382d5e8b924123feb6ef43b -mosip.id.validation.identity.dateOfBirth=^(1869|18[7-9][0-9]|19\\d\\d|20\\d\\d)/([0][1-9]|1[0-2])/([0][1-9]|[1-2]\\d|3[01])$ -mosip.id.validation.identity.phone=^([6-9]{1})([0-9]{9})$ -mosip.id.validation.identity.email=^[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-zA-Z]{2,})$ -mosip.id.validation.identity.postalCode=^[(?i)A-Z0-9]{5}$|^NA$ -mosip.id.validation.identity.age=^(150|1[0-4][0-9]|[1-9]?[0-9])$ -mosip.id.validation.identity.fullName.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.addressLine1.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.addressLine2.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.addressLine3.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.region.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.province.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.city.[*].value=^(?=.{0,50}$).* -mosip.id.validation.identity.referenceIdentityNumber=^([0-9]{10,30})$ -# NEW Properties -------------------- -IDSchema.Version=0.1 -resident.identityjson=identity-mapping.json -id.repo.update=mosip.id.update -mosip.registration.processor.grace.period=10800 -id.repo.vidType=Perpetual -token.request.appid=regproc -token.request.clientId=mosip-regproc-client -token.request.secretKey=abc123 - -# imp -objectstore.adapter.name=PosixAdapter -mosip.kernel.registrationcenterid.length=5 -mosip.kernel.machineid.length=5 -mosip.commons.packetnames=id,evidence,optional -# reader -provider.packetwriter.resident=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketReaderImpl -# writer -provider.packetwriter.mosip=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketWriterImpl -# can be OnlinePacketCryptoServiceImpl OR OfflinePacketCryptoServiceImpl -objectstore.crypto.name=OfflinePacketCryptoServiceImpl -default.provider.version=v1.0 -auth.server.validate.url=http://localhost -mosip.kernel.xsdstorage-uri=http://localhost/ -mosip.kernel.xsdfile=mosip.xsd -mosip.kernel.pdf_owner_password=1234 - -#Auth Services -CREDENTIAL_STATUS_URL=https://dev.mosip.net/v1/credentialrequest/get/ -CREDENTIAL_REQ_URL=https://dev.mosip.net/v1/credentialrequest/requestgenerator -CREDENTIAL_CANCELREQ_URL=https://dev.mosip.net/v1/credentialrequest/cancel/ -CREDENTIAL_TYPES_URL=https://dev.mosip.net/v1/credentialservice/types - -PARTNER_API_URL=https://dev.mosip.net/v1/partnermanager/partners +spring.cloud.config.uri=localhost +spring.cloud.config.label=master +spring.cloud.config.name=master +spring.application.name=commons-packet-service +spring.profiles.active=test +management.endpoints.web.exposure.include=refresh +APPLICATION_Id=DATASHARE +PARTNER_REFERENCE_Id=mpartner-default-resident +DECRYPT_API_URL=https://dev.mosip.net/v1/keymanager/decrypt +KERNELENCRYPTIONSERVICE=https://dev.mosip.net/idauthentication/v1/internal/getCertificate +crypto.PrependThumbprint.enable=true +#management.security.enabled=false +#--------------ID and Version -------------- +auth.internal.id=mosip.identity.auth.internal +auth.internal.version=1.0 +mosip.registration.processor.print.id=mosip.registration.print +mosip.registration.processor.application.version=1.0 +vid.create.id=mosip.vid.create +resident.vid.version=v1 +resident.vid.version.new=1.0 +resident.vid.id=mosip.resident.vid +vid.revoke.id=vid.revoke.id +resident.revokevid.id=mosip.resident.vidstatus +auth.type.status.id=mosip.identity.authtype.status.update +mosip.mandatory-languages=eng +mosip.optional-languages=ara +mosip.notificationtype=SMS|EMAIL +resident.notification.emails=user@mail.com +resident.notification.message=Notification has been sent to the provided contact detail(s) +config.server.file.storage.uri=http://localhost:8081 +resident.authlock.id=mosip.resident.authlock +resident.checkstatus.id=mosip.resident.checkstatus +resident.euin.id=mosip.resident.euin +resident.printuin.id=mosip.resident.printuin +resident.uin.id=mosip.resident.uin +resident.rid.id=mosip.resident.rid +resident.updateuin.id=mosip.resident.updateuin +resident.authunlock.id=mosip.resident.authunlock +resident.authhistory.id=mosip.resident.authhistory +mosip.resident.service.status.check.id=mosip.registration.status +mosip.resident.service.status.check.version=1.0 +resident.datetime.pattern=yyyy-MM-dd'T'HH:mm:ss.SSS'Z' +auth.types.allowed=otp,bio-FIR,bio-IIR,bio-FACE +resident.center.id=10008 +resident.machine.id=20007 + +mosip.kernel.rid.length=29 +mosip.kernel.rid.timestamp-length=14 +mosip.kernel.rid.sequence-length=5 +mosip.kernel.tokenid.sequence-limit=3 +mosip.kernel.vid.length=16 +mosip.kernel.vid.length.sequence-limit=3 +mosip.kernel.vid.length.repeating-block-limit=2 +mosip.kernel.vid.length.repeating-limit=2 +mosip.kernel.vid.not-start-with=0,1 +mosip.kernel.vid.restricted-numbers=786,666 +mosip.kernel.uin.length=10 +mosip.kernel.uin.min-unused-threshold=200000 +mosip.kernel.uin.uins-to-generate=500000 +mosip.kernel.uin.restricted-numbers=786,666 +mosip.kernel.uin.length.sequence-limit=3 +mosip.kernel.uin.length.repeating-block-limit=2 +mosip.kernel.uin.length.repeating-limit=2 +mosip.kernel.uin.length.reverse-digits-limit=5 +mosip.kernel.uin.length.digits-limit=5 +mosip.kernel.uin.not-start-with=0,1 +mosip.kernel.uin.length.conjugative-even-digits-limit=3 +mosip.kernel.crypto.asymmetric-algorithm-name=RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING +mosip.kernel.crypto.symmetric-algorithm-name=AES/GCM/PKCS5Padding +mosip.kernel.keygenerator.asymmetric-algorithm-name=RSA +mosip.kernel.keygenerator.symmetric-algorithm-name=AES +mosip.kernel.keygenerator.asymmetric-key-length=2048 +mosip.kernel.keygenerator.symmetric-key-length=256 +mosip.kernel.data-key-splitter=#KEY_SPLITTER# +mosip.kernel.crypto.gcm-tag-length=128 +mosip.kernel.crypto.hash-algorithm-name=PBKDF2WithHmacSHA512 +mosip.kernel.crypto.hash-symmetric-key-length=256 +mosip.kernel.crypto.hash-iteration=100000 +mosip.kernel.crypto.sign-algorithm-name=SHA512withRSA + +mosip.kernel.keymanager-service-publickey-url=${mosip.base.url}/v1/keymanager/publickey/{applicationId} +mosip.kernel.keymanager-service-decrypt-url=${mosip.base.url}/v1/keymanager/decrypt +mosip.kernel.keymanager-service-auth-decrypt-url=${mosip.base.url}/v1/keymanager/auth/decrypt +mosip.kernel.keymanager-service-sign-url=${mosip.base.url}/v1/keymanager/sign +mosip.sign.applicationid=KERNEL +mosip.sign.refid=SIGN +mosip.kernel.cryptomanager.request_id=CRYPTOMANAGER.REQUEST +mosip.kernel.cryptomanager.request_version=v1.0 +mosip.kernel.signature.signature-request-id=SIGNATURE.REQUEST +mosip.kernel.signature.signature-version-id=v1.0 + + + +#-------------REMOVE THIS ------------------------------------------------------------- +#-------------TOKEN GENERATION---------------- +#Token generation request id +token.request.id=io.mosip.resident +#Token generation app id +resident.appid=ida +#Token generation version +token.request.version=1.0 +# Kernel auth client ID for IDA +resident.clientId=ida_app_user +# Kernel auth secret key for IDA +resident.secretKey=5debb60adbfcf8feea4a6ed6160092ec +regprc.appid=registrationprocessor +regprc.clientId=regproc_app_user +regprc.secretKey=80565e06e382d5e8b924123feb6ef43b +mosip.id.validation.identity.dateOfBirth=^(1869|18[7-9][0-9]|19\\d\\d|20\\d\\d)/([0][1-9]|1[0-2])/([0][1-9]|[1-2]\\d|3[01])$ +mosip.id.validation.identity.phone=^([6-9]{1})([0-9]{9})$ +mosip.id.validation.identity.email=^[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-zA-Z]{2,})$ +mosip.id.validation.identity.postalCode=^[(?i)A-Z0-9]{5}$|^NA$ +mosip.id.validation.identity.age=^(150|1[0-4][0-9]|[1-9]?[0-9])$ +mosip.id.validation.identity.fullName.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.addressLine1.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.addressLine2.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.addressLine3.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.region.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.province.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.city.[*].value=^(?=.{0,50}$).* +mosip.id.validation.identity.referenceIdentityNumber=^([0-9]{10,30})$ +# NEW Properties -------------------- +IDSchema.Version=0.1 +resident.identityjson=identity-mapping.json +id.repo.update=mosip.id.update +mosip.registration.processor.grace.period=10800 +id.repo.vidType=Perpetual +token.request.appid=regproc +token.request.clientId=mosip-regproc-client +token.request.secretKey=abc123 + +# imp +objectstore.adapter.name=PosixAdapter +mosip.kernel.registrationcenterid.length=5 +mosip.kernel.machineid.length=5 +mosip.commons.packetnames=id,evidence,optional +# reader +provider.packetwriter.resident=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketReaderImpl +# writer +provider.packetwriter.mosip=source:REGISTRATION_CLIENT,process:NEW|UPDATE|LOST|CORRECTION|ACTIVATED|DEACTIVATED|RES_UPDATE|LOST|RES_REPRINT,classname:io.mosip.commons.packet.impl.PacketWriterImpl +# can be OnlinePacketCryptoServiceImpl OR OfflinePacketCryptoServiceImpl +objectstore.crypto.name=OfflinePacketCryptoServiceImpl +default.provider.version=v1.0 +auth.server.validate.url=http://localhost +mosip.kernel.xsdstorage-uri=http://localhost/ +mosip.kernel.xsdfile=mosip.xsd +mosip.kernel.pdf_owner_password=1234 + +#Auth Services +CREDENTIAL_STATUS_URL=https://dev.mosip.net/v1/credentialrequest/get/ +CREDENTIAL_REQ_URL=https://dev.mosip.net/v1/credentialrequest/requestgenerator +CREDENTIAL_CANCELREQ_URL=https://dev.mosip.net/v1/credentialrequest/cancel/ +CREDENTIAL_TYPES_URL=https://dev.mosip.net/v1/credentialservice/types + +PARTNER_API_URL=https://dev.mosip.net/v1/partnermanager/partners diff --git a/resident/resident-service/src/test/resources/credentialdata.mvel b/resident/resident-service/src/test/resources/credentialdata.mvel new file mode 100644 index 00000000000..aece9354d56 --- /dev/null +++ b/resident/resident-service/src/test/resources/credentialdata.mvel @@ -0,0 +1,10 @@ + +def maskPhone(inputPhoneNum) { + +return inputPhoneNum.replaceAll(".(?=.{4})", "*"); +}; + +def maskEmail(inputEmailAddr) { + +return inputEmailAddr.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*"); +}; diff --git a/resident/resident-service/src/test/resources/vid_policy.json b/resident/resident-service/src/test/resources/vid_policy.json new file mode 100644 index 00000000000..d257308a5c1 --- /dev/null +++ b/resident/resident-service/src/test/resources/vid_policy.json @@ -0,0 +1,24 @@ +{ + "vidPolicies": [ + { + "vidType": "Perpetual", + "vidPolicy": { + "validForInMinutes": null, + "transactionsAllowed": null, + "instancesAllowed": 1, + "autoRestoreAllowed": true, + "restoreOnAction": "REVOKE" + } + }, + { + "vidType": "Temporary", + "vidPolicy": { + "validForInMinutes": 30, + "transactionsAllowed": 1, + "instancesAllowed": 5, + "autoRestoreAllowed": false, + "restoreOnAction": "REGENERATE" + } + } + ] +} \ No newline at end of file